ZGlmZiAtLWdpdCBhL2NyeXB0by9DTWFrZUxpc3RzLnR4dCBiL2NyeXB0by9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmI3OGYxCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTU5IEBACitpbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4vaW5jbHVkZSkKKworaWYgKFVOSVgpCisJc2V0KFBFUkxBU01fU1RZTEUgZWxmKQorCXNldChBU01fRVhUIFMpCisJZW5hYmxlX2xhbmd1YWdlKEFTTSkKK2Vsc2UoKQorCWlmIChDTUFLRV9DTF82NCkKKwkJbWVzc2FnZSgiVXNpbmcgbWFzbSIpCisJCXNldChQRVJMQVNNX1NUWUxFIG1hc20pCisJZWxzZSgpCisJCW1lc3NhZ2UoIlVzaW5nIHdpbjMybiIpCisJCXNldChQRVJMQVNNX1NUWUxFIHdpbjMybikKKwllbmRpZigpCisJc2V0KEFTTV9FWFQgYXNtKQorCWVuYWJsZV9sYW5ndWFnZShBU01fTUFTTSkKK2VuZGlmKCkKKworZnVuY3Rpb24ocGVybGFzbSBkZXN0IHNyYykKKwlhZGRfY3VzdG9tX2NvbW1hbmQoCisJCU9VVFBVVCAke2Rlc3R9CisJCUNPTU1BTkQgcGVybCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vJHtzcmN9ICR7UEVSTEFTTV9TVFlMRX0gJHtBUkdOfSA+ICR7ZGVzdH0KKwkJREVQRU5EUworCQkke3NyY30KKwkJJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2NyeXB0by9wZXJsYXNtL3g4Nl82NC14bGF0ZS5wbAorCQkke1BST0pFQ1RfU09VUkNFX0RJUn0vY3J5cHRvL3Blcmxhc20veDg2Z2FzLnBsCisJCSR7UFJPSkVDVF9TT1VSQ0VfRElSfS9jcnlwdG8vcGVybGFzbS94ODZhc20ucGwKKwkJJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2NyeXB0by9wZXJsYXNtL3g4NmFzbS5wbAorCQlXT1JLSU5HX0RJUkVDVE9SWSAuCisJKQorZW5kZnVuY3Rpb24oKQorCitpZiAoJHtBUkNIfSBTVFJFUVVBTCAieDg2XzY0IikKKwlzZXQoCisJCUNSWVBUT19BUkNIX1NPVVJDRVMKKworCQljcHUteDg2XzY0LWFzbS4ke0FTTV9FWFR9CisJCWNwdS1pbnRlbC5jCisJKQorZW5kaWYoKQorCitpZiAoJHtBUkNIfSBTVFJFUVVBTCAieDg2IikKKwlzZXQoCisJCUNSWVBUT19BUkNIX1NPVVJDRVMKKworCQljcHUteDg2LWFzbS4ke0FTTV9FWFR9CisJCWNwdS1pbnRlbC5jCisJKQorZW5kaWYoKQorCitpZiAoJHtBUkNIfSBTVFJFUVVBTCAiYXJtIikKKwlzZXQoCisJCUNSWVBUT19BUkNIX1NPVVJDRVMKKworCQljcHUteDg2LWFzbS4ke0FTTV9FWFR9CisJCWNwdS1hcm0uYworCSkKK2VuZGlmKCkKKworIyBMZXZlbCAwLjEgLSBkZXBlbmRzIG9uIG5vdGhpbmcgb3V0c2lkZSB0aGlzIHNldC4KK2FkZF9zdWJkaXJlY3Rvcnkoc3RhY2spCithZGRfc3ViZGlyZWN0b3J5KGxoYXNoKQorYWRkX3N1YmRpcmVjdG9yeShlcnIpCithZGRfc3ViZGlyZWN0b3J5KGJ1ZikKK2FkZF9zdWJkaXJlY3RvcnkoY29tcCkKK2FkZF9zdWJkaXJlY3RvcnkoYmFzZTY0KQorYWRkX3N1YmRpcmVjdG9yeShieXRlc3RyaW5nKQorCisjIExldmVsIDAuMiAtIGRlcGVuZHMgb24gbm90aGluZyBidXQgaXRzZWxmCithZGRfc3ViZGlyZWN0b3J5KHNoYSkKK2FkZF9zdWJkaXJlY3RvcnkobWQ1KQorYWRkX3N1YmRpcmVjdG9yeShtb2RlcykKK2FkZF9zdWJkaXJlY3RvcnkoYWVzKQorYWRkX3N1YmRpcmVjdG9yeShkZXMpCithZGRfc3ViZGlyZWN0b3J5KHJjNCkKK2FkZF9zdWJkaXJlY3RvcnkoY29uZikKKworIyBMZXZlbCAxLCBkZXBlbmRzIG9ubHkgb24gMC4qCithZGRfc3ViZGlyZWN0b3J5KGRpZ2VzdCkKK2FkZF9zdWJkaXJlY3RvcnkoY2lwaGVyKQorYWRkX3N1YmRpcmVjdG9yeShyYW5kKQorYWRkX3N1YmRpcmVjdG9yeShiaW8pCithZGRfc3ViZGlyZWN0b3J5KGJuKQorYWRkX3N1YmRpcmVjdG9yeShvYmopCithZGRfc3ViZGlyZWN0b3J5KGFzbjEpCisKKyMgTGV2ZWwgMgorYWRkX3N1YmRpcmVjdG9yeShlbmdpbmUpCithZGRfc3ViZGlyZWN0b3J5KGRoKQorYWRkX3N1YmRpcmVjdG9yeShkc2EpCithZGRfc3ViZGlyZWN0b3J5KHJzYSkKK2FkZF9zdWJkaXJlY3RvcnkoZWMpCithZGRfc3ViZGlyZWN0b3J5KGVjZGgpCithZGRfc3ViZGlyZWN0b3J5KGVjZHNhKQorYWRkX3N1YmRpcmVjdG9yeShobWFjKQorCisjIExldmVsIDMKK2FkZF9zdWJkaXJlY3RvcnkoZXZwKQorYWRkX3N1YmRpcmVjdG9yeShwZW0pCithZGRfc3ViZGlyZWN0b3J5KHg1MDkpCithZGRfc3ViZGlyZWN0b3J5KHg1MDl2MykKKworIyBMZXZlbCA0CithZGRfc3ViZGlyZWN0b3J5KHBrY3M4KQorCithZGRfbGlicmFyeSgKKwljcnlwdG8KKwlTVEFUSUMKKworCWNyeXB0b19lcnJvci5jCisJbWVtLmMKKwltZW1fY2xlYXIuYworCXRocmVhZC5jCisJZXhfZGF0YS5jCisJZXhfZGF0YV9pbXBsLmMKKwl0aW1lX3N1cHBvcnQuYworCWRpcmVjdG9yeV9wb3NpeC5jCisJZGlyZWN0b3J5X3dpbi5jCisKKwkke0NSWVBUT19BUkNIX1NPVVJDRVN9CisKKwkkPFRBUkdFVF9PQkpFQ1RTOnN0YWNrPgorCSQ8VEFSR0VUX09CSkVDVFM6bGhhc2g+CisJJDxUQVJHRVRfT0JKRUNUUzplcnI+CisJJDxUQVJHRVRfT0JKRUNUUzpjb21wPgorCSQ8VEFSR0VUX09CSkVDVFM6YmFzZTY0PgorCSQ8VEFSR0VUX09CSkVDVFM6Ynl0ZXN0cmluZz4KKwkkPFRBUkdFVF9PQkpFQ1RTOnNoYT4KKwkkPFRBUkdFVF9PQkpFQ1RTOm1kNT4KKwkkPFRBUkdFVF9PQkpFQ1RTOmRpZ2VzdD4KKwkkPFRBUkdFVF9PQkpFQ1RTOmNpcGhlcj4KKwkkPFRBUkdFVF9PQkpFQ1RTOm1vZGVzPgorCSQ8VEFSR0VUX09CSkVDVFM6YWVzPgorCSQ8VEFSR0VUX09CSkVDVFM6ZGVzPgorCSQ8VEFSR0VUX09CSkVDVFM6cmM0PgorCSQ8VEFSR0VUX09CSkVDVFM6Y29uZj4KKwkkPFRBUkdFVF9PQkpFQ1RTOmJ1Zj4KKwkkPFRBUkdFVF9PQkpFQ1RTOmJuPgorCSQ8VEFSR0VUX09CSkVDVFM6YmlvPgorCSQ8VEFSR0VUX09CSkVDVFM6cmFuZD4KKwkkPFRBUkdFVF9PQkpFQ1RTOm9iaj4KKwkkPFRBUkdFVF9PQkpFQ1RTOmFzbjE+CisJJDxUQVJHRVRfT0JKRUNUUzplbmdpbmU+CisJJDxUQVJHRVRfT0JKRUNUUzpkaD4KKwkkPFRBUkdFVF9PQkpFQ1RTOmRzYT4KKwkkPFRBUkdFVF9PQkpFQ1RTOnJzYT4KKwkkPFRBUkdFVF9PQkpFQ1RTOmVjPgorCSQ8VEFSR0VUX09CSkVDVFM6ZWNkaD4KKwkkPFRBUkdFVF9PQkpFQ1RTOmVjZHNhPgorCSQ8VEFSR0VUX09CSkVDVFM6aG1hYz4KKwkkPFRBUkdFVF9PQkpFQ1RTOmV2cD4KKwkkPFRBUkdFVF9PQkpFQ1RTOnBlbT4KKwkkPFRBUkdFVF9PQkpFQ1RTOng1MDk+CisJJDxUQVJHRVRfT0JKRUNUUzp4NTA5djM+CisJJDxUQVJHRVRfT0JKRUNUUzpwa2NzOD4KKykKKworcGVybGFzbShjcHUteDg2XzY0LWFzbS4ke0FTTV9FWFR9IGNwdS14ODZfNjQtYXNtLnBsKQorcGVybGFzbShjcHUteDg2LWFzbS4ke0FTTV9FWFR9IGNwdS14ODYtYXNtLnBsKQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2Flcy9DTWFrZUxpc3RzLnR4dCBiL2NyeXB0by9hZXMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU0NTgwOQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9hZXMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw1MiBAQAoraW5jbHVkZV9kaXJlY3RvcmllcyguIC4uIC4uLy4uL2luY2x1ZGUpCisKK2lmICgke0FSQ0h9IFNUUkVRVUFMICJ4ODZfNjQiKQorCXNldCgKKwkJQUVTX0FSQ0hfU09VUkNFUworCisJCWFlcy14ODZfNjQuJHtBU01fRVhUfQorCQlhZXNuaS14ODZfNjQuJHtBU01fRVhUfQorCQlic2Flcy14ODZfNjQuJHtBU01fRVhUfQorCQl2cGFlcy14ODZfNjQuJHtBU01fRVhUfQorCSkKK2VuZGlmKCkKKworaWYgKCR7QVJDSH0gU1RSRVFVQUwgIng4NiIpCisJc2V0KAorCQlBRVNfQVJDSF9TT1VSQ0VTCisKKwkJYWVzLTU4Ni4ke0FTTV9FWFR9CisJCXZwYWVzLXg4Ni4ke0FTTV9FWFR9CisJCWFlc25pLXg4Ni4ke0FTTV9FWFR9CisJKQorZW5kaWYoKQorCitpZiAoJHtBUkNIfSBTVFJFUVVBTCAiYXJtIikKKwlzZXQoCisJCUFFU19BUkNIX1NPVVJDRVMKKworCQlhZXMtYXJtdjQuJHtBU01fRVhUfQorCQlic2Flcy1hcm12Ny4ke0FTTV9FWFR9CisJKQorZW5kaWYoKQorCithZGRfbGlicmFyeSgKKwlhZXMKKworCU9CSkVDVAorCisJYWVzLmMKKwltb2RlX3dyYXBwZXJzLmMKKworCSR7QUVTX0FSQ0hfU09VUkNFU30KKykKKworcGVybGFzbShhZXMteDg2XzY0LiR7QVNNX0VYVH0gYXNtL2Flcy14ODZfNjQucGwpCitwZXJsYXNtKGFlc25pLXg4Nl82NC4ke0FTTV9FWFR9IGFzbS9hZXNuaS14ODZfNjQucGwpCitwZXJsYXNtKGJzYWVzLXg4Nl82NC4ke0FTTV9FWFR9IGFzbS9ic2Flcy14ODZfNjQucGwpCitwZXJsYXNtKHZwYWVzLXg4Nl82NC4ke0FTTV9FWFR9IGFzbS92cGFlcy14ODZfNjQucGwpCitwZXJsYXNtKGFlcy01ODYuJHtBU01fRVhUfSBhc20vYWVzLTU4Ni5wbCkKK3Blcmxhc20odnBhZXMteDg2LiR7QVNNX0VYVH0gYXNtL3ZwYWVzLXg4Ni5wbCkKK3Blcmxhc20oYWVzbmkteDg2LiR7QVNNX0VYVH0gYXNtL2Flc25pLXg4Ni5wbCkKK3Blcmxhc20oYWVzLWFybXY0LiR7QVNNX0VYVH0gYXNtL2Flcy1hcm12NC5wbCkKK3Blcmxhc20oYnNhZXMtYXJtdjcuJHtBU01fRVhUfSBhc20vYnNhZXMtYXJtdjcucGwpCmRpZmYgLS1naXQgYS9jcnlwdG8vYWVzL2Flcy5jIGIvY3J5cHRvL2Flcy9hZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDg1Nzg3Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2Flcy9hZXMuYwpAQCAtMCwwICsxLDEwNzcgQEAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYWVzLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgImludGVybmFsLmgiCisKKworI2lmIGRlZmluZWQoT1BFTlNTTF9OT19BU00pIHx8IFwKKyAgICAoIWRlZmluZWQoT1BFTlNTTF9YODYpICYmICFkZWZpbmVkKE9QRU5TU0xfWDg2XzY0KSAmJiAhZGVmaW5lZChPUEVOU1NMX0FSTSkpCisKKy8qIFRlMFt4XSA9IFMgW3hdLlswMiwgMDEsIDAxLCAwM107CisgKiBUZTFbeF0gPSBTIFt4XS5bMDMsIDAyLCAwMSwgMDFdOworICogVGUyW3hdID0gUyBbeF0uWzAxLCAwMywgMDIsIDAxXTsKKyAqIFRlM1t4XSA9IFMgW3hdLlswMSwgMDEsIDAzLCAwMl07CisgKgorICogVGQwW3hdID0gU2lbeF0uWzBlLCAwOSwgMGQsIDBiXTsKKyAqIFRkMVt4XSA9IFNpW3hdLlswYiwgMGUsIDA5LCAwZF07CisgKiBUZDJbeF0gPSBTaVt4XS5bMGQsIDBiLCAwZSwgMDldOworICogVGQzW3hdID0gU2lbeF0uWzA5LCAwZCwgMGIsIDBlXTsKKyAqIFRkNFt4XSA9IFNpW3hdLlswMV07ICovCisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBUZTBbMjU2XSA9IHsKKyAgICAweGM2NjM2M2E1VSwgMHhmODdjN2M4NFUsIDB4ZWU3Nzc3OTlVLCAweGY2N2I3YjhkVSwgMHhmZmYyZjIwZFUsCisgICAgMHhkNjZiNmJiZFUsIDB4ZGU2ZjZmYjFVLCAweDkxYzVjNTU0VSwgMHg2MDMwMzA1MFUsIDB4MDIwMTAxMDNVLAorICAgIDB4Y2U2NzY3YTlVLCAweDU2MmIyYjdkVSwgMHhlN2ZlZmUxOVUsIDB4YjVkN2Q3NjJVLCAweDRkYWJhYmU2VSwKKyAgICAweGVjNzY3NjlhVSwgMHg4ZmNhY2E0NVUsIDB4MWY4MjgyOWRVLCAweDg5YzljOTQwVSwgMHhmYTdkN2Q4N1UsCisgICAgMHhlZmZhZmExNVUsIDB4YjI1OTU5ZWJVLCAweDhlNDc0N2M5VSwgMHhmYmYwZjAwYlUsIDB4NDFhZGFkZWNVLAorICAgIDB4YjNkNGQ0NjdVLCAweDVmYTJhMmZkVSwgMHg0NWFmYWZlYVUsIDB4MjM5YzljYmZVLCAweDUzYTRhNGY3VSwKKyAgICAweGU0NzI3Mjk2VSwgMHg5YmMwYzA1YlUsIDB4NzViN2I3YzJVLCAweGUxZmRmZDFjVSwgMHgzZDkzOTNhZVUsCisgICAgMHg0YzI2MjY2YVUsIDB4NmMzNjM2NWFVLCAweDdlM2YzZjQxVSwgMHhmNWY3ZjcwMlUsIDB4ODNjY2NjNGZVLAorICAgIDB4NjgzNDM0NWNVLCAweDUxYTVhNWY0VSwgMHhkMWU1ZTUzNFUsIDB4ZjlmMWYxMDhVLCAweGUyNzE3MTkzVSwKKyAgICAweGFiZDhkODczVSwgMHg2MjMxMzE1M1UsIDB4MmExNTE1M2ZVLCAweDA4MDQwNDBjVSwgMHg5NWM3Yzc1MlUsCisgICAgMHg0NjIzMjM2NVUsIDB4OWRjM2MzNWVVLCAweDMwMTgxODI4VSwgMHgzNzk2OTZhMVUsIDB4MGEwNTA1MGZVLAorICAgIDB4MmY5YTlhYjVVLCAweDBlMDcwNzA5VSwgMHgyNDEyMTIzNlUsIDB4MWI4MDgwOWJVLCAweGRmZTJlMjNkVSwKKyAgICAweGNkZWJlYjI2VSwgMHg0ZTI3Mjc2OVUsIDB4N2ZiMmIyY2RVLCAweGVhNzU3NTlmVSwgMHgxMjA5MDkxYlUsCisgICAgMHgxZDgzODM5ZVUsIDB4NTgyYzJjNzRVLCAweDM0MWExYTJlVSwgMHgzNjFiMWIyZFUsIDB4ZGM2ZTZlYjJVLAorICAgIDB4YjQ1YTVhZWVVLCAweDViYTBhMGZiVSwgMHhhNDUyNTJmNlUsIDB4NzYzYjNiNGRVLCAweGI3ZDZkNjYxVSwKKyAgICAweDdkYjNiM2NlVSwgMHg1MjI5Mjk3YlUsIDB4ZGRlM2UzM2VVLCAweDVlMmYyZjcxVSwgMHgxMzg0ODQ5N1UsCisgICAgMHhhNjUzNTNmNVUsIDB4YjlkMWQxNjhVLCAweDAwMDAwMDAwVSwgMHhjMWVkZWQyY1UsIDB4NDAyMDIwNjBVLAorICAgIDB4ZTNmY2ZjMWZVLCAweDc5YjFiMWM4VSwgMHhiNjViNWJlZFUsIDB4ZDQ2YTZhYmVVLCAweDhkY2JjYjQ2VSwKKyAgICAweDY3YmViZWQ5VSwgMHg3MjM5Mzk0YlUsIDB4OTQ0YTRhZGVVLCAweDk4NGM0Y2Q0VSwgMHhiMDU4NThlOFUsCisgICAgMHg4NWNmY2Y0YVUsIDB4YmJkMGQwNmJVLCAweGM1ZWZlZjJhVSwgMHg0ZmFhYWFlNVUsIDB4ZWRmYmZiMTZVLAorICAgIDB4ODY0MzQzYzVVLCAweDlhNGQ0ZGQ3VSwgMHg2NjMzMzM1NVUsIDB4MTE4NTg1OTRVLCAweDhhNDU0NWNmVSwKKyAgICAweGU5ZjlmOTEwVSwgMHgwNDAyMDIwNlUsIDB4ZmU3ZjdmODFVLCAweGEwNTA1MGYwVSwgMHg3ODNjM2M0NFUsCisgICAgMHgyNTlmOWZiYVUsIDB4NGJhOGE4ZTNVLCAweGEyNTE1MWYzVSwgMHg1ZGEzYTNmZVUsIDB4ODA0MDQwYzBVLAorICAgIDB4MDU4ZjhmOGFVLCAweDNmOTI5MmFkVSwgMHgyMTlkOWRiY1UsIDB4NzAzODM4NDhVLCAweGYxZjVmNTA0VSwKKyAgICAweDYzYmNiY2RmVSwgMHg3N2I2YjZjMVUsIDB4YWZkYWRhNzVVLCAweDQyMjEyMTYzVSwgMHgyMDEwMTAzMFUsCisgICAgMHhlNWZmZmYxYVUsIDB4ZmRmM2YzMGVVLCAweGJmZDJkMjZkVSwgMHg4MWNkY2Q0Y1UsIDB4MTgwYzBjMTRVLAorICAgIDB4MjYxMzEzMzVVLCAweGMzZWNlYzJmVSwgMHhiZTVmNWZlMVUsIDB4MzU5Nzk3YTJVLCAweDg4NDQ0NGNjVSwKKyAgICAweDJlMTcxNzM5VSwgMHg5M2M0YzQ1N1UsIDB4NTVhN2E3ZjJVLCAweGZjN2U3ZTgyVSwgMHg3YTNkM2Q0N1UsCisgICAgMHhjODY0NjRhY1UsIDB4YmE1ZDVkZTdVLCAweDMyMTkxOTJiVSwgMHhlNjczNzM5NVUsIDB4YzA2MDYwYTBVLAorICAgIDB4MTk4MTgxOThVLCAweDllNGY0ZmQxVSwgMHhhM2RjZGM3ZlUsIDB4NDQyMjIyNjZVLCAweDU0MmEyYTdlVSwKKyAgICAweDNiOTA5MGFiVSwgMHgwYjg4ODg4M1UsIDB4OGM0NjQ2Y2FVLCAweGM3ZWVlZTI5VSwgMHg2YmI4YjhkM1UsCisgICAgMHgyODE0MTQzY1UsIDB4YTdkZWRlNzlVLCAweGJjNWU1ZWUyVSwgMHgxNjBiMGIxZFUsIDB4YWRkYmRiNzZVLAorICAgIDB4ZGJlMGUwM2JVLCAweDY0MzIzMjU2VSwgMHg3NDNhM2E0ZVUsIDB4MTQwYTBhMWVVLCAweDkyNDk0OWRiVSwKKyAgICAweDBjMDYwNjBhVSwgMHg0ODI0MjQ2Y1UsIDB4Yjg1YzVjZTRVLCAweDlmYzJjMjVkVSwgMHhiZGQzZDM2ZVUsCisgICAgMHg0M2FjYWNlZlUsIDB4YzQ2MjYyYTZVLCAweDM5OTE5MWE4VSwgMHgzMTk1OTVhNFUsIDB4ZDNlNGU0MzdVLAorICAgIDB4ZjI3OTc5OGJVLCAweGQ1ZTdlNzMyVSwgMHg4YmM4Yzg0M1UsIDB4NmUzNzM3NTlVLCAweGRhNmQ2ZGI3VSwKKyAgICAweDAxOGQ4ZDhjVSwgMHhiMWQ1ZDU2NFUsIDB4OWM0ZTRlZDJVLCAweDQ5YTlhOWUwVSwgMHhkODZjNmNiNFUsCisgICAgMHhhYzU2NTZmYVUsIDB4ZjNmNGY0MDdVLCAweGNmZWFlYTI1VSwgMHhjYTY1NjVhZlUsIDB4ZjQ3YTdhOGVVLAorICAgIDB4NDdhZWFlZTlVLCAweDEwMDgwODE4VSwgMHg2ZmJhYmFkNVUsIDB4ZjA3ODc4ODhVLCAweDRhMjUyNTZmVSwKKyAgICAweDVjMmUyZTcyVSwgMHgzODFjMWMyNFUsIDB4NTdhNmE2ZjFVLCAweDczYjRiNGM3VSwgMHg5N2M2YzY1MVUsCisgICAgMHhjYmU4ZTgyM1UsIDB4YTFkZGRkN2NVLCAweGU4NzQ3NDljVSwgMHgzZTFmMWYyMVUsIDB4OTY0YjRiZGRVLAorICAgIDB4NjFiZGJkZGNVLCAweDBkOGI4Yjg2VSwgMHgwZjhhOGE4NVUsIDB4ZTA3MDcwOTBVLCAweDdjM2UzZTQyVSwKKyAgICAweDcxYjViNWM0VSwgMHhjYzY2NjZhYVUsIDB4OTA0ODQ4ZDhVLCAweDA2MDMwMzA1VSwgMHhmN2Y2ZjYwMVUsCisgICAgMHgxYzBlMGUxMlUsIDB4YzI2MTYxYTNVLCAweDZhMzUzNTVmVSwgMHhhZTU3NTdmOVUsIDB4NjliOWI5ZDBVLAorICAgIDB4MTc4Njg2OTFVLCAweDk5YzFjMTU4VSwgMHgzYTFkMWQyN1UsIDB4Mjc5ZTllYjlVLCAweGQ5ZTFlMTM4VSwKKyAgICAweGViZjhmODEzVSwgMHgyYjk4OThiM1UsIDB4MjIxMTExMzNVLCAweGQyNjk2OWJiVSwgMHhhOWQ5ZDk3MFUsCisgICAgMHgwNzhlOGU4OVUsIDB4MzM5NDk0YTdVLCAweDJkOWI5YmI2VSwgMHgzYzFlMWUyMlUsIDB4MTU4Nzg3OTJVLAorICAgIDB4YzllOWU5MjBVLCAweDg3Y2VjZTQ5VSwgMHhhYTU1NTVmZlUsIDB4NTAyODI4NzhVLCAweGE1ZGZkZjdhVSwKKyAgICAweDAzOGM4YzhmVSwgMHg1OWExYTFmOFUsIDB4MDk4OTg5ODBVLCAweDFhMGQwZDE3VSwgMHg2NWJmYmZkYVUsCisgICAgMHhkN2U2ZTYzMVUsIDB4ODQ0MjQyYzZVLCAweGQwNjg2OGI4VSwgMHg4MjQxNDFjM1UsIDB4Mjk5OTk5YjBVLAorICAgIDB4NWEyZDJkNzdVLCAweDFlMGYwZjExVSwgMHg3YmIwYjBjYlUsIDB4YTg1NDU0ZmNVLCAweDZkYmJiYmQ2VSwKKyAgICAweDJjMTYxNjNhVSwgfTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IFRlMVsyNTZdID0geworICAgIDB4YTVjNjYzNjNVLCAweDg0Zjg3YzdjVSwgMHg5OWVlNzc3N1UsIDB4OGRmNjdiN2JVLCAweDBkZmZmMmYyVSwKKyAgICAweGJkZDY2YjZiVSwgMHhiMWRlNmY2ZlUsIDB4NTQ5MWM1YzVVLCAweDUwNjAzMDMwVSwgMHgwMzAyMDEwMVUsCisgICAgMHhhOWNlNjc2N1UsIDB4N2Q1NjJiMmJVLCAweDE5ZTdmZWZlVSwgMHg2MmI1ZDdkN1UsIDB4ZTY0ZGFiYWJVLAorICAgIDB4OWFlYzc2NzZVLCAweDQ1OGZjYWNhVSwgMHg5ZDFmODI4MlUsIDB4NDA4OWM5YzlVLCAweDg3ZmE3ZDdkVSwKKyAgICAweDE1ZWZmYWZhVSwgMHhlYmIyNTk1OVUsIDB4Yzk4ZTQ3NDdVLCAweDBiZmJmMGYwVSwgMHhlYzQxYWRhZFUsCisgICAgMHg2N2IzZDRkNFUsIDB4ZmQ1ZmEyYTJVLCAweGVhNDVhZmFmVSwgMHhiZjIzOWM5Y1UsIDB4Zjc1M2E0YTRVLAorICAgIDB4OTZlNDcyNzJVLCAweDViOWJjMGMwVSwgMHhjMjc1YjdiN1UsIDB4MWNlMWZkZmRVLCAweGFlM2Q5MzkzVSwKKyAgICAweDZhNGMyNjI2VSwgMHg1YTZjMzYzNlUsIDB4NDE3ZTNmM2ZVLCAweDAyZjVmN2Y3VSwgMHg0ZjgzY2NjY1UsCisgICAgMHg1YzY4MzQzNFUsIDB4ZjQ1MWE1YTVVLCAweDM0ZDFlNWU1VSwgMHgwOGY5ZjFmMVUsIDB4OTNlMjcxNzFVLAorICAgIDB4NzNhYmQ4ZDhVLCAweDUzNjIzMTMxVSwgMHgzZjJhMTUxNVUsIDB4MGMwODA0MDRVLCAweDUyOTVjN2M3VSwKKyAgICAweDY1NDYyMzIzVSwgMHg1ZTlkYzNjM1UsIDB4MjgzMDE4MThVLCAweGExMzc5Njk2VSwgMHgwZjBhMDUwNVUsCisgICAgMHhiNTJmOWE5YVUsIDB4MDkwZTA3MDdVLCAweDM2MjQxMjEyVSwgMHg5YjFiODA4MFUsIDB4M2RkZmUyZTJVLAorICAgIDB4MjZjZGViZWJVLCAweDY5NGUyNzI3VSwgMHhjZDdmYjJiMlUsIDB4OWZlYTc1NzVVLCAweDFiMTIwOTA5VSwKKyAgICAweDllMWQ4MzgzVSwgMHg3NDU4MmMyY1UsIDB4MmUzNDFhMWFVLCAweDJkMzYxYjFiVSwgMHhiMmRjNmU2ZVUsCisgICAgMHhlZWI0NWE1YVUsIDB4ZmI1YmEwYTBVLCAweGY2YTQ1MjUyVSwgMHg0ZDc2M2IzYlUsIDB4NjFiN2Q2ZDZVLAorICAgIDB4Y2U3ZGIzYjNVLCAweDdiNTIyOTI5VSwgMHgzZWRkZTNlM1UsIDB4NzE1ZTJmMmZVLCAweDk3MTM4NDg0VSwKKyAgICAweGY1YTY1MzUzVSwgMHg2OGI5ZDFkMVUsIDB4MDAwMDAwMDBVLCAweDJjYzFlZGVkVSwgMHg2MDQwMjAyMFUsCisgICAgMHgxZmUzZmNmY1UsIDB4Yzg3OWIxYjFVLCAweGVkYjY1YjViVSwgMHhiZWQ0NmE2YVUsIDB4NDY4ZGNiY2JVLAorICAgIDB4ZDk2N2JlYmVVLCAweDRiNzIzOTM5VSwgMHhkZTk0NGE0YVUsIDB4ZDQ5ODRjNGNVLCAweGU4YjA1ODU4VSwKKyAgICAweDRhODVjZmNmVSwgMHg2YmJiZDBkMFUsIDB4MmFjNWVmZWZVLCAweGU1NGZhYWFhVSwgMHgxNmVkZmJmYlUsCisgICAgMHhjNTg2NDM0M1UsIDB4ZDc5YTRkNGRVLCAweDU1NjYzMzMzVSwgMHg5NDExODU4NVUsIDB4Y2Y4YTQ1NDVVLAorICAgIDB4MTBlOWY5ZjlVLCAweDA2MDQwMjAyVSwgMHg4MWZlN2Y3ZlUsIDB4ZjBhMDUwNTBVLCAweDQ0NzgzYzNjVSwKKyAgICAweGJhMjU5ZjlmVSwgMHhlMzRiYThhOFUsIDB4ZjNhMjUxNTFVLCAweGZlNWRhM2EzVSwgMHhjMDgwNDA0MFUsCisgICAgMHg4YTA1OGY4ZlUsIDB4YWQzZjkyOTJVLCAweGJjMjE5ZDlkVSwgMHg0ODcwMzgzOFUsIDB4MDRmMWY1ZjVVLAorICAgIDB4ZGY2M2JjYmNVLCAweGMxNzdiNmI2VSwgMHg3NWFmZGFkYVUsIDB4NjM0MjIxMjFVLCAweDMwMjAxMDEwVSwKKyAgICAweDFhZTVmZmZmVSwgMHgwZWZkZjNmM1UsIDB4NmRiZmQyZDJVLCAweDRjODFjZGNkVSwgMHgxNDE4MGMwY1UsCisgICAgMHgzNTI2MTMxM1UsIDB4MmZjM2VjZWNVLCAweGUxYmU1ZjVmVSwgMHhhMjM1OTc5N1UsIDB4Y2M4ODQ0NDRVLAorICAgIDB4MzkyZTE3MTdVLCAweDU3OTNjNGM0VSwgMHhmMjU1YTdhN1UsIDB4ODJmYzdlN2VVLCAweDQ3N2EzZDNkVSwKKyAgICAweGFjYzg2NDY0VSwgMHhlN2JhNWQ1ZFUsIDB4MmIzMjE5MTlVLCAweDk1ZTY3MzczVSwgMHhhMGMwNjA2MFUsCisgICAgMHg5ODE5ODE4MVUsIDB4ZDE5ZTRmNGZVLCAweDdmYTNkY2RjVSwgMHg2NjQ0MjIyMlUsIDB4N2U1NDJhMmFVLAorICAgIDB4YWIzYjkwOTBVLCAweDgzMGI4ODg4VSwgMHhjYThjNDY0NlUsIDB4MjljN2VlZWVVLCAweGQzNmJiOGI4VSwKKyAgICAweDNjMjgxNDE0VSwgMHg3OWE3ZGVkZVUsIDB4ZTJiYzVlNWVVLCAweDFkMTYwYjBiVSwgMHg3NmFkZGJkYlUsCisgICAgMHgzYmRiZTBlMFUsIDB4NTY2NDMyMzJVLCAweDRlNzQzYTNhVSwgMHgxZTE0MGEwYVUsIDB4ZGI5MjQ5NDlVLAorICAgIDB4MGEwYzA2MDZVLCAweDZjNDgyNDI0VSwgMHhlNGI4NWM1Y1UsIDB4NWQ5ZmMyYzJVLCAweDZlYmRkM2QzVSwKKyAgICAweGVmNDNhY2FjVSwgMHhhNmM0NjI2MlUsIDB4YTgzOTkxOTFVLCAweGE0MzE5NTk1VSwgMHgzN2QzZTRlNFUsCisgICAgMHg4YmYyNzk3OVUsIDB4MzJkNWU3ZTdVLCAweDQzOGJjOGM4VSwgMHg1OTZlMzczN1UsIDB4YjdkYTZkNmRVLAorICAgIDB4OGMwMThkOGRVLCAweDY0YjFkNWQ1VSwgMHhkMjljNGU0ZVUsIDB4ZTA0OWE5YTlVLCAweGI0ZDg2YzZjVSwKKyAgICAweGZhYWM1NjU2VSwgMHgwN2YzZjRmNFUsIDB4MjVjZmVhZWFVLCAweGFmY2E2NTY1VSwgMHg4ZWY0N2E3YVUsCisgICAgMHhlOTQ3YWVhZVUsIDB4MTgxMDA4MDhVLCAweGQ1NmZiYWJhVSwgMHg4OGYwNzg3OFUsIDB4NmY0YTI1MjVVLAorICAgIDB4NzI1YzJlMmVVLCAweDI0MzgxYzFjVSwgMHhmMTU3YTZhNlUsIDB4Yzc3M2I0YjRVLCAweDUxOTdjNmM2VSwKKyAgICAweDIzY2JlOGU4VSwgMHg3Y2ExZGRkZFUsIDB4OWNlODc0NzRVLCAweDIxM2UxZjFmVSwgMHhkZDk2NGI0YlUsCisgICAgMHhkYzYxYmRiZFUsIDB4ODYwZDhiOGJVLCAweDg1MGY4YThhVSwgMHg5MGUwNzA3MFUsIDB4NDI3YzNlM2VVLAorICAgIDB4YzQ3MWI1YjVVLCAweGFhY2M2NjY2VSwgMHhkODkwNDg0OFUsIDB4MDUwNjAzMDNVLCAweDAxZjdmNmY2VSwKKyAgICAweDEyMWMwZTBlVSwgMHhhM2MyNjE2MVUsIDB4NWY2YTM1MzVVLCAweGY5YWU1NzU3VSwgMHhkMDY5YjliOVUsCisgICAgMHg5MTE3ODY4NlUsIDB4NTg5OWMxYzFVLCAweDI3M2ExZDFkVSwgMHhiOTI3OWU5ZVUsIDB4MzhkOWUxZTFVLAorICAgIDB4MTNlYmY4ZjhVLCAweGIzMmI5ODk4VSwgMHgzMzIyMTExMVUsIDB4YmJkMjY5NjlVLCAweDcwYTlkOWQ5VSwKKyAgICAweDg5MDc4ZThlVSwgMHhhNzMzOTQ5NFUsIDB4YjYyZDliOWJVLCAweDIyM2MxZTFlVSwgMHg5MjE1ODc4N1UsCisgICAgMHgyMGM5ZTllOVUsIDB4NDk4N2NlY2VVLCAweGZmYWE1NTU1VSwgMHg3ODUwMjgyOFUsIDB4N2FhNWRmZGZVLAorICAgIDB4OGYwMzhjOGNVLCAweGY4NTlhMWExVSwgMHg4MDA5ODk4OVUsIDB4MTcxYTBkMGRVLCAweGRhNjViZmJmVSwKKyAgICAweDMxZDdlNmU2VSwgMHhjNjg0NDI0MlUsIDB4YjhkMDY4NjhVLCAweGMzODI0MTQxVSwgMHhiMDI5OTk5OVUsCisgICAgMHg3NzVhMmQyZFUsIDB4MTExZTBmMGZVLCAweGNiN2JiMGIwVSwgMHhmY2E4NTQ1NFUsIDB4ZDY2ZGJiYmJVLAorICAgIDB4M2EyYzE2MTZVLCB9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgVGUyWzI1Nl0gPSB7CisgICAgMHg2M2E1YzY2M1UsIDB4N2M4NGY4N2NVLCAweDc3OTllZTc3VSwgMHg3YjhkZjY3YlUsIDB4ZjIwZGZmZjJVLAorICAgIDB4NmJiZGQ2NmJVLCAweDZmYjFkZTZmVSwgMHhjNTU0OTFjNVUsIDB4MzA1MDYwMzBVLCAweDAxMDMwMjAxVSwKKyAgICAweDY3YTljZTY3VSwgMHgyYjdkNTYyYlUsIDB4ZmUxOWU3ZmVVLCAweGQ3NjJiNWQ3VSwgMHhhYmU2NGRhYlUsCisgICAgMHg3NjlhZWM3NlUsIDB4Y2E0NThmY2FVLCAweDgyOWQxZjgyVSwgMHhjOTQwODljOVUsIDB4N2Q4N2ZhN2RVLAorICAgIDB4ZmExNWVmZmFVLCAweDU5ZWJiMjU5VSwgMHg0N2M5OGU0N1UsIDB4ZjAwYmZiZjBVLCAweGFkZWM0MWFkVSwKKyAgICAweGQ0NjdiM2Q0VSwgMHhhMmZkNWZhMlUsIDB4YWZlYTQ1YWZVLCAweDljYmYyMzljVSwgMHhhNGY3NTNhNFUsCisgICAgMHg3Mjk2ZTQ3MlUsIDB4YzA1YjliYzBVLCAweGI3YzI3NWI3VSwgMHhmZDFjZTFmZFUsIDB4OTNhZTNkOTNVLAorICAgIDB4MjY2YTRjMjZVLCAweDM2NWE2YzM2VSwgMHgzZjQxN2UzZlUsIDB4ZjcwMmY1ZjdVLCAweGNjNGY4M2NjVSwKKyAgICAweDM0NWM2ODM0VSwgMHhhNWY0NTFhNVUsIDB4ZTUzNGQxZTVVLCAweGYxMDhmOWYxVSwgMHg3MTkzZTI3MVUsCisgICAgMHhkODczYWJkOFUsIDB4MzE1MzYyMzFVLCAweDE1M2YyYTE1VSwgMHgwNDBjMDgwNFUsIDB4Yzc1Mjk1YzdVLAorICAgIDB4MjM2NTQ2MjNVLCAweGMzNWU5ZGMzVSwgMHgxODI4MzAxOFUsIDB4OTZhMTM3OTZVLCAweDA1MGYwYTA1VSwKKyAgICAweDlhYjUyZjlhVSwgMHgwNzA5MGUwN1UsIDB4MTIzNjI0MTJVLCAweDgwOWIxYjgwVSwgMHhlMjNkZGZlMlUsCisgICAgMHhlYjI2Y2RlYlUsIDB4Mjc2OTRlMjdVLCAweGIyY2Q3ZmIyVSwgMHg3NTlmZWE3NVUsIDB4MDkxYjEyMDlVLAorICAgIDB4ODM5ZTFkODNVLCAweDJjNzQ1ODJjVSwgMHgxYTJlMzQxYVUsIDB4MWIyZDM2MWJVLCAweDZlYjJkYzZlVSwKKyAgICAweDVhZWViNDVhVSwgMHhhMGZiNWJhMFUsIDB4NTJmNmE0NTJVLCAweDNiNGQ3NjNiVSwgMHhkNjYxYjdkNlUsCisgICAgMHhiM2NlN2RiM1UsIDB4Mjk3YjUyMjlVLCAweGUzM2VkZGUzVSwgMHgyZjcxNWUyZlUsIDB4ODQ5NzEzODRVLAorICAgIDB4NTNmNWE2NTNVLCAweGQxNjhiOWQxVSwgMHgwMDAwMDAwMFUsIDB4ZWQyY2MxZWRVLCAweDIwNjA0MDIwVSwKKyAgICAweGZjMWZlM2ZjVSwgMHhiMWM4NzliMVUsIDB4NWJlZGI2NWJVLCAweDZhYmVkNDZhVSwgMHhjYjQ2OGRjYlUsCisgICAgMHhiZWQ5NjdiZVUsIDB4Mzk0YjcyMzlVLCAweDRhZGU5NDRhVSwgMHg0Y2Q0OTg0Y1UsIDB4NThlOGIwNThVLAorICAgIDB4Y2Y0YTg1Y2ZVLCAweGQwNmJiYmQwVSwgMHhlZjJhYzVlZlUsIDB4YWFlNTRmYWFVLCAweGZiMTZlZGZiVSwKKyAgICAweDQzYzU4NjQzVSwgMHg0ZGQ3OWE0ZFUsIDB4MzM1NTY2MzNVLCAweDg1OTQxMTg1VSwgMHg0NWNmOGE0NVUsCisgICAgMHhmOTEwZTlmOVUsIDB4MDIwNjA0MDJVLCAweDdmODFmZTdmVSwgMHg1MGYwYTA1MFUsIDB4M2M0NDc4M2NVLAorICAgIDB4OWZiYTI1OWZVLCAweGE4ZTM0YmE4VSwgMHg1MWYzYTI1MVUsIDB4YTNmZTVkYTNVLCAweDQwYzA4MDQwVSwKKyAgICAweDhmOGEwNThmVSwgMHg5MmFkM2Y5MlUsIDB4OWRiYzIxOWRVLCAweDM4NDg3MDM4VSwgMHhmNTA0ZjFmNVUsCisgICAgMHhiY2RmNjNiY1UsIDB4YjZjMTc3YjZVLCAweGRhNzVhZmRhVSwgMHgyMTYzNDIyMVUsIDB4MTAzMDIwMTBVLAorICAgIDB4ZmYxYWU1ZmZVLCAweGYzMGVmZGYzVSwgMHhkMjZkYmZkMlUsIDB4Y2Q0YzgxY2RVLCAweDBjMTQxODBjVSwKKyAgICAweDEzMzUyNjEzVSwgMHhlYzJmYzNlY1UsIDB4NWZlMWJlNWZVLCAweDk3YTIzNTk3VSwgMHg0NGNjODg0NFUsCisgICAgMHgxNzM5MmUxN1UsIDB4YzQ1NzkzYzRVLCAweGE3ZjI1NWE3VSwgMHg3ZTgyZmM3ZVUsIDB4M2Q0NzdhM2RVLAorICAgIDB4NjRhY2M4NjRVLCAweDVkZTdiYTVkVSwgMHgxOTJiMzIxOVUsIDB4NzM5NWU2NzNVLCAweDYwYTBjMDYwVSwKKyAgICAweDgxOTgxOTgxVSwgMHg0ZmQxOWU0ZlUsIDB4ZGM3ZmEzZGNVLCAweDIyNjY0NDIyVSwgMHgyYTdlNTQyYVUsCisgICAgMHg5MGFiM2I5MFUsIDB4ODg4MzBiODhVLCAweDQ2Y2E4YzQ2VSwgMHhlZTI5YzdlZVUsIDB4YjhkMzZiYjhVLAorICAgIDB4MTQzYzI4MTRVLCAweGRlNzlhN2RlVSwgMHg1ZWUyYmM1ZVUsIDB4MGIxZDE2MGJVLCAweGRiNzZhZGRiVSwKKyAgICAweGUwM2JkYmUwVSwgMHgzMjU2NjQzMlUsIDB4M2E0ZTc0M2FVLCAweDBhMWUxNDBhVSwgMHg0OWRiOTI0OVUsCisgICAgMHgwNjBhMGMwNlUsIDB4MjQ2YzQ4MjRVLCAweDVjZTRiODVjVSwgMHhjMjVkOWZjMlUsIDB4ZDM2ZWJkZDNVLAorICAgIDB4YWNlZjQzYWNVLCAweDYyYTZjNDYyVSwgMHg5MWE4Mzk5MVUsIDB4OTVhNDMxOTVVLCAweGU0MzdkM2U0VSwKKyAgICAweDc5OGJmMjc5VSwgMHhlNzMyZDVlN1UsIDB4Yzg0MzhiYzhVLCAweDM3NTk2ZTM3VSwgMHg2ZGI3ZGE2ZFUsCisgICAgMHg4ZDhjMDE4ZFUsIDB4ZDU2NGIxZDVVLCAweDRlZDI5YzRlVSwgMHhhOWUwNDlhOVUsIDB4NmNiNGQ4NmNVLAorICAgIDB4NTZmYWFjNTZVLCAweGY0MDdmM2Y0VSwgMHhlYTI1Y2ZlYVUsIDB4NjVhZmNhNjVVLCAweDdhOGVmNDdhVSwKKyAgICAweGFlZTk0N2FlVSwgMHgwODE4MTAwOFUsIDB4YmFkNTZmYmFVLCAweDc4ODhmMDc4VSwgMHgyNTZmNGEyNVUsCisgICAgMHgyZTcyNWMyZVUsIDB4MWMyNDM4MWNVLCAweGE2ZjE1N2E2VSwgMHhiNGM3NzNiNFUsIDB4YzY1MTk3YzZVLAorICAgIDB4ZTgyM2NiZThVLCAweGRkN2NhMWRkVSwgMHg3NDljZTg3NFUsIDB4MWYyMTNlMWZVLCAweDRiZGQ5NjRiVSwKKyAgICAweGJkZGM2MWJkVSwgMHg4Yjg2MGQ4YlUsIDB4OGE4NTBmOGFVLCAweDcwOTBlMDcwVSwgMHgzZTQyN2MzZVUsCisgICAgMHhiNWM0NzFiNVUsIDB4NjZhYWNjNjZVLCAweDQ4ZDg5MDQ4VSwgMHgwMzA1MDYwM1UsIDB4ZjYwMWY3ZjZVLAorICAgIDB4MGUxMjFjMGVVLCAweDYxYTNjMjYxVSwgMHgzNTVmNmEzNVUsIDB4NTdmOWFlNTdVLCAweGI5ZDA2OWI5VSwKKyAgICAweDg2OTExNzg2VSwgMHhjMTU4OTljMVUsIDB4MWQyNzNhMWRVLCAweDllYjkyNzllVSwgMHhlMTM4ZDllMVUsCisgICAgMHhmODEzZWJmOFUsIDB4OThiMzJiOThVLCAweDExMzMyMjExVSwgMHg2OWJiZDI2OVUsIDB4ZDk3MGE5ZDlVLAorICAgIDB4OGU4OTA3OGVVLCAweDk0YTczMzk0VSwgMHg5YmI2MmQ5YlUsIDB4MWUyMjNjMWVVLCAweDg3OTIxNTg3VSwKKyAgICAweGU5MjBjOWU5VSwgMHhjZTQ5ODdjZVUsIDB4NTVmZmFhNTVVLCAweDI4Nzg1MDI4VSwgMHhkZjdhYTVkZlUsCisgICAgMHg4YzhmMDM4Y1UsIDB4YTFmODU5YTFVLCAweDg5ODAwOTg5VSwgMHgwZDE3MWEwZFUsIDB4YmZkYTY1YmZVLAorICAgIDB4ZTYzMWQ3ZTZVLCAweDQyYzY4NDQyVSwgMHg2OGI4ZDA2OFUsIDB4NDFjMzgyNDFVLCAweDk5YjAyOTk5VSwKKyAgICAweDJkNzc1YTJkVSwgMHgwZjExMWUwZlUsIDB4YjBjYjdiYjBVLCAweDU0ZmNhODU0VSwgMHhiYmQ2NmRiYlUsCisgICAgMHgxNjNhMmMxNlUsIH07CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBUZTNbMjU2XSA9IHsKKyAgICAweDYzNjNhNWM2VSwgMHg3YzdjODRmOFUsIDB4Nzc3Nzk5ZWVVLCAweDdiN2I4ZGY2VSwgMHhmMmYyMGRmZlUsCisgICAgMHg2YjZiYmRkNlUsIDB4NmY2ZmIxZGVVLCAweGM1YzU1NDkxVSwgMHgzMDMwNTA2MFUsIDB4MDEwMTAzMDJVLAorICAgIDB4Njc2N2E5Y2VVLCAweDJiMmI3ZDU2VSwgMHhmZWZlMTllN1UsIDB4ZDdkNzYyYjVVLCAweGFiYWJlNjRkVSwKKyAgICAweDc2NzY5YWVjVSwgMHhjYWNhNDU4ZlUsIDB4ODI4MjlkMWZVLCAweGM5Yzk0MDg5VSwgMHg3ZDdkODdmYVUsCisgICAgMHhmYWZhMTVlZlUsIDB4NTk1OWViYjJVLCAweDQ3NDdjOThlVSwgMHhmMGYwMGJmYlUsIDB4YWRhZGVjNDFVLAorICAgIDB4ZDRkNDY3YjNVLCAweGEyYTJmZDVmVSwgMHhhZmFmZWE0NVUsIDB4OWM5Y2JmMjNVLCAweGE0YTRmNzUzVSwKKyAgICAweDcyNzI5NmU0VSwgMHhjMGMwNWI5YlUsIDB4YjdiN2MyNzVVLCAweGZkZmQxY2UxVSwgMHg5MzkzYWUzZFUsCisgICAgMHgyNjI2NmE0Y1UsIDB4MzYzNjVhNmNVLCAweDNmM2Y0MTdlVSwgMHhmN2Y3MDJmNVUsIDB4Y2NjYzRmODNVLAorICAgIDB4MzQzNDVjNjhVLCAweGE1YTVmNDUxVSwgMHhlNWU1MzRkMVUsIDB4ZjFmMTA4ZjlVLCAweDcxNzE5M2UyVSwKKyAgICAweGQ4ZDg3M2FiVSwgMHgzMTMxNTM2MlUsIDB4MTUxNTNmMmFVLCAweDA0MDQwYzA4VSwgMHhjN2M3NTI5NVUsCisgICAgMHgyMzIzNjU0NlUsIDB4YzNjMzVlOWRVLCAweDE4MTgyODMwVSwgMHg5Njk2YTEzN1UsIDB4MDUwNTBmMGFVLAorICAgIDB4OWE5YWI1MmZVLCAweDA3MDcwOTBlVSwgMHgxMjEyMzYyNFUsIDB4ODA4MDliMWJVLCAweGUyZTIzZGRmVSwKKyAgICAweGViZWIyNmNkVSwgMHgyNzI3Njk0ZVUsIDB4YjJiMmNkN2ZVLCAweDc1NzU5ZmVhVSwgMHgwOTA5MWIxMlUsCisgICAgMHg4MzgzOWUxZFUsIDB4MmMyYzc0NThVLCAweDFhMWEyZTM0VSwgMHgxYjFiMmQzNlUsIDB4NmU2ZWIyZGNVLAorICAgIDB4NWE1YWVlYjRVLCAweGEwYTBmYjViVSwgMHg1MjUyZjZhNFUsIDB4M2IzYjRkNzZVLCAweGQ2ZDY2MWI3VSwKKyAgICAweGIzYjNjZTdkVSwgMHgyOTI5N2I1MlUsIDB4ZTNlMzNlZGRVLCAweDJmMmY3MTVlVSwgMHg4NDg0OTcxM1UsCisgICAgMHg1MzUzZjVhNlUsIDB4ZDFkMTY4YjlVLCAweDAwMDAwMDAwVSwgMHhlZGVkMmNjMVUsIDB4MjAyMDYwNDBVLAorICAgIDB4ZmNmYzFmZTNVLCAweGIxYjFjODc5VSwgMHg1YjViZWRiNlUsIDB4NmE2YWJlZDRVLCAweGNiY2I0NjhkVSwKKyAgICAweGJlYmVkOTY3VSwgMHgzOTM5NGI3MlUsIDB4NGE0YWRlOTRVLCAweDRjNGNkNDk4VSwgMHg1ODU4ZThiMFUsCisgICAgMHhjZmNmNGE4NVUsIDB4ZDBkMDZiYmJVLCAweGVmZWYyYWM1VSwgMHhhYWFhZTU0ZlUsIDB4ZmJmYjE2ZWRVLAorICAgIDB4NDM0M2M1ODZVLCAweDRkNGRkNzlhVSwgMHgzMzMzNTU2NlUsIDB4ODU4NTk0MTFVLCAweDQ1NDVjZjhhVSwKKyAgICAweGY5ZjkxMGU5VSwgMHgwMjAyMDYwNFUsIDB4N2Y3ZjgxZmVVLCAweDUwNTBmMGEwVSwgMHgzYzNjNDQ3OFUsCisgICAgMHg5ZjlmYmEyNVUsIDB4YThhOGUzNGJVLCAweDUxNTFmM2EyVSwgMHhhM2EzZmU1ZFUsIDB4NDA0MGMwODBVLAorICAgIDB4OGY4ZjhhMDVVLCAweDkyOTJhZDNmVSwgMHg5ZDlkYmMyMVUsIDB4MzgzODQ4NzBVLCAweGY1ZjUwNGYxVSwKKyAgICAweGJjYmNkZjYzVSwgMHhiNmI2YzE3N1UsIDB4ZGFkYTc1YWZVLCAweDIxMjE2MzQyVSwgMHgxMDEwMzAyMFUsCisgICAgMHhmZmZmMWFlNVUsIDB4ZjNmMzBlZmRVLCAweGQyZDI2ZGJmVSwgMHhjZGNkNGM4MVUsIDB4MGMwYzE0MThVLAorICAgIDB4MTMxMzM1MjZVLCAweGVjZWMyZmMzVSwgMHg1ZjVmZTFiZVUsIDB4OTc5N2EyMzVVLCAweDQ0NDRjYzg4VSwKKyAgICAweDE3MTczOTJlVSwgMHhjNGM0NTc5M1UsIDB4YTdhN2YyNTVVLCAweDdlN2U4MmZjVSwgMHgzZDNkNDc3YVUsCisgICAgMHg2NDY0YWNjOFUsIDB4NWQ1ZGU3YmFVLCAweDE5MTkyYjMyVSwgMHg3MzczOTVlNlUsIDB4NjA2MGEwYzBVLAorICAgIDB4ODE4MTk4MTlVLCAweDRmNGZkMTllVSwgMHhkY2RjN2ZhM1UsIDB4MjIyMjY2NDRVLCAweDJhMmE3ZTU0VSwKKyAgICAweDkwOTBhYjNiVSwgMHg4ODg4ODMwYlUsIDB4NDY0NmNhOGNVLCAweGVlZWUyOWM3VSwgMHhiOGI4ZDM2YlUsCisgICAgMHgxNDE0M2MyOFUsIDB4ZGVkZTc5YTdVLCAweDVlNWVlMmJjVSwgMHgwYjBiMWQxNlUsIDB4ZGJkYjc2YWRVLAorICAgIDB4ZTBlMDNiZGJVLCAweDMyMzI1NjY0VSwgMHgzYTNhNGU3NFUsIDB4MGEwYTFlMTRVLCAweDQ5NDlkYjkyVSwKKyAgICAweDA2MDYwYTBjVSwgMHgyNDI0NmM0OFUsIDB4NWM1Y2U0YjhVLCAweGMyYzI1ZDlmVSwgMHhkM2QzNmViZFUsCisgICAgMHhhY2FjZWY0M1UsIDB4NjI2MmE2YzRVLCAweDkxOTFhODM5VSwgMHg5NTk1YTQzMVUsIDB4ZTRlNDM3ZDNVLAorICAgIDB4Nzk3OThiZjJVLCAweGU3ZTczMmQ1VSwgMHhjOGM4NDM4YlUsIDB4MzczNzU5NmVVLCAweDZkNmRiN2RhVSwKKyAgICAweDhkOGQ4YzAxVSwgMHhkNWQ1NjRiMVUsIDB4NGU0ZWQyOWNVLCAweGE5YTllMDQ5VSwgMHg2YzZjYjRkOFUsCisgICAgMHg1NjU2ZmFhY1UsIDB4ZjRmNDA3ZjNVLCAweGVhZWEyNWNmVSwgMHg2NTY1YWZjYVUsIDB4N2E3YThlZjRVLAorICAgIDB4YWVhZWU5NDdVLCAweDA4MDgxODEwVSwgMHhiYWJhZDU2ZlUsIDB4Nzg3ODg4ZjBVLCAweDI1MjU2ZjRhVSwKKyAgICAweDJlMmU3MjVjVSwgMHgxYzFjMjQzOFUsIDB4YTZhNmYxNTdVLCAweGI0YjRjNzczVSwgMHhjNmM2NTE5N1UsCisgICAgMHhlOGU4MjNjYlUsIDB4ZGRkZDdjYTFVLCAweDc0NzQ5Y2U4VSwgMHgxZjFmMjEzZVUsIDB4NGI0YmRkOTZVLAorICAgIDB4YmRiZGRjNjFVLCAweDhiOGI4NjBkVSwgMHg4YThhODUwZlUsIDB4NzA3MDkwZTBVLCAweDNlM2U0MjdjVSwKKyAgICAweGI1YjVjNDcxVSwgMHg2NjY2YWFjY1UsIDB4NDg0OGQ4OTBVLCAweDAzMDMwNTA2VSwgMHhmNmY2MDFmN1UsCisgICAgMHgwZTBlMTIxY1UsIDB4NjE2MWEzYzJVLCAweDM1MzU1ZjZhVSwgMHg1NzU3ZjlhZVUsIDB4YjliOWQwNjlVLAorICAgIDB4ODY4NjkxMTdVLCAweGMxYzE1ODk5VSwgMHgxZDFkMjczYVUsIDB4OWU5ZWI5MjdVLCAweGUxZTEzOGQ5VSwKKyAgICAweGY4ZjgxM2ViVSwgMHg5ODk4YjMyYlUsIDB4MTExMTMzMjJVLCAweDY5NjliYmQyVSwgMHhkOWQ5NzBhOVUsCisgICAgMHg4ZThlODkwN1UsIDB4OTQ5NGE3MzNVLCAweDliOWJiNjJkVSwgMHgxZTFlMjIzY1UsIDB4ODc4NzkyMTVVLAorICAgIDB4ZTllOTIwYzlVLCAweGNlY2U0OTg3VSwgMHg1NTU1ZmZhYVUsIDB4MjgyODc4NTBVLCAweGRmZGY3YWE1VSwKKyAgICAweDhjOGM4ZjAzVSwgMHhhMWExZjg1OVUsIDB4ODk4OTgwMDlVLCAweDBkMGQxNzFhVSwgMHhiZmJmZGE2NVUsCisgICAgMHhlNmU2MzFkN1UsIDB4NDI0MmM2ODRVLCAweDY4NjhiOGQwVSwgMHg0MTQxYzM4MlUsIDB4OTk5OWIwMjlVLAorICAgIDB4MmQyZDc3NWFVLCAweDBmMGYxMTFlVSwgMHhiMGIwY2I3YlUsIDB4NTQ1NGZjYThVLCAweGJiYmJkNjZkVSwKKyAgICAweDE2MTYzYTJjVSwgfTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IFRkMFsyNTZdID0geworICAgIDB4NTFmNGE3NTBVLCAweDdlNDE2NTUzVSwgMHgxYTE3YTRjM1UsIDB4M2EyNzVlOTZVLCAweDNiYWI2YmNiVSwKKyAgICAweDFmOWQ0NWYxVSwgMHhhY2ZhNThhYlUsIDB4NGJlMzAzOTNVLCAweDIwMzBmYTU1VSwgMHhhZDc2NmRmNlUsCisgICAgMHg4OGNjNzY5MVUsIDB4ZjUwMjRjMjVVLCAweDRmZTVkN2ZjVSwgMHhjNTJhY2JkN1UsIDB4MjYzNTQ0ODBVLAorICAgIDB4YjU2MmEzOGZVLCAweGRlYjE1YTQ5VSwgMHgyNWJhMWI2N1UsIDB4NDVlYTBlOThVLCAweDVkZmVjMGUxVSwKKyAgICAweGMzMmY3NTAyVSwgMHg4MTRjZjAxMlUsIDB4OGQ0Njk3YTNVLCAweDZiZDNmOWM2VSwgMHgwMzhmNWZlN1UsCisgICAgMHgxNTkyOWM5NVUsIDB4YmY2ZDdhZWJVLCAweDk1NTI1OWRhVSwgMHhkNGJlODMyZFUsIDB4NTg3NDIxZDNVLAorICAgIDB4NDllMDY5MjlVLCAweDhlYzljODQ0VSwgMHg3NWMyODk2YVUsIDB4ZjQ4ZTc5NzhVLCAweDk5NTgzZTZiVSwKKyAgICAweDI3Yjk3MWRkVSwgMHhiZWUxNGZiNlUsIDB4ZjA4OGFkMTdVLCAweGM5MjBhYzY2VSwgMHg3ZGNlM2FiNFUsCisgICAgMHg2M2RmNGExOFUsIDB4ZTUxYTMxODJVLCAweDk3NTEzMzYwVSwgMHg2MjUzN2Y0NVUsIDB4YjE2NDc3ZTBVLAorICAgIDB4YmI2YmFlODRVLCAweGZlODFhMDFjVSwgMHhmOTA4MmI5NFUsIDB4NzA0ODY4NThVLCAweDhmNDVmZDE5VSwKKyAgICAweDk0ZGU2Yzg3VSwgMHg1MjdiZjhiN1UsIDB4YWI3M2QzMjNVLCAweDcyNGIwMmUyVSwgMHhlMzFmOGY1N1UsCisgICAgMHg2NjU1YWIyYVUsIDB4YjJlYjI4MDdVLCAweDJmYjVjMjAzVSwgMHg4NmM1N2I5YVUsIDB4ZDMzNzA4YTVVLAorICAgIDB4MzAyODg3ZjJVLCAweDIzYmZhNWIyVSwgMHgwMjAzNmFiYVUsIDB4ZWQxNjgyNWNVLCAweDhhY2YxYzJiVSwKKyAgICAweGE3NzliNDkyVSwgMHhmMzA3ZjJmMFUsIDB4NGU2OWUyYTFVLCAweDY1ZGFmNGNkVSwgMHgwNjA1YmVkNVUsCisgICAgMHhkMTM0NjIxZlUsIDB4YzRhNmZlOGFVLCAweDM0MmU1MzlkVSwgMHhhMmYzNTVhMFUsIDB4MDU4YWUxMzJVLAorICAgIDB4YTRmNmViNzVVLCAweDBiODNlYzM5VSwgMHg0MDYwZWZhYVUsIDB4NWU3MTlmMDZVLCAweGJkNmUxMDUxVSwKKyAgICAweDNlMjE4YWY5VSwgMHg5NmRkMDYzZFUsIDB4ZGQzZTA1YWVVLCAweDRkZTZiZDQ2VSwgMHg5MTU0OGRiNVUsCisgICAgMHg3MWM0NWQwNVUsIDB4MDQwNmQ0NmZVLCAweDYwNTAxNWZmVSwgMHgxOTk4ZmIyNFUsIDB4ZDZiZGU5OTdVLAorICAgIDB4ODk0MDQzY2NVLCAweDY3ZDk5ZTc3VSwgMHhiMGU4NDJiZFUsIDB4MDc4OThiODhVLCAweGU3MTk1YjM4VSwKKyAgICAweDc5YzhlZWRiVSwgMHhhMTdjMGE0N1UsIDB4N2M0MjBmZTlVLCAweGY4ODQxZWM5VSwgMHgwMDAwMDAwMFUsCisgICAgMHgwOTgwODY4M1UsIDB4MzIyYmVkNDhVLCAweDFlMTE3MGFjVSwgMHg2YzVhNzI0ZVUsIDB4ZmQwZWZmZmJVLAorICAgIDB4MGY4NTM4NTZVLCAweDNkYWVkNTFlVSwgMHgzNjJkMzkyN1UsIDB4MGEwZmQ5NjRVLCAweDY4NWNhNjIxVSwKKyAgICAweDliNWI1NGQxVSwgMHgyNDM2MmUzYVUsIDB4MGMwYTY3YjFVLCAweDkzNTdlNzBmVSwgMHhiNGVlOTZkMlUsCisgICAgMHgxYjliOTE5ZVUsIDB4ODBjMGM1NGZVLCAweDYxZGMyMGEyVSwgMHg1YTc3NGI2OVUsIDB4MWMxMjFhMTZVLAorICAgIDB4ZTI5M2JhMGFVLCAweGMwYTAyYWU1VSwgMHgzYzIyZTA0M1UsIDB4MTIxYjE3MWRVLCAweDBlMDkwZDBiVSwKKyAgICAweGYyOGJjN2FkVSwgMHgyZGI2YThiOVUsIDB4MTQxZWE5YzhVLCAweDU3ZjExOTg1VSwgMHhhZjc1MDc0Y1UsCisgICAgMHhlZTk5ZGRiYlUsIDB4YTM3ZjYwZmRVLCAweGY3MDEyNjlmVSwgMHg1YzcyZjViY1UsIDB4NDQ2NjNiYzVVLAorICAgIDB4NWJmYjdlMzRVLCAweDhiNDMyOTc2VSwgMHhjYjIzYzZkY1UsIDB4YjZlZGZjNjhVLCAweGI4ZTRmMTYzVSwKKyAgICAweGQ3MzFkY2NhVSwgMHg0MjYzODUxMFUsIDB4MTM5NzIyNDBVLCAweDg0YzYxMTIwVSwgMHg4NTRhMjQ3ZFUsCisgICAgMHhkMmJiM2RmOFUsIDB4YWVmOTMyMTFVLCAweGM3MjlhMTZkVSwgMHgxZDllMmY0YlUsIDB4ZGNiMjMwZjNVLAorICAgIDB4MGQ4NjUyZWNVLCAweDc3YzFlM2QwVSwgMHgyYmIzMTY2Y1UsIDB4YTk3MGI5OTlVLCAweDExOTQ0OGZhVSwKKyAgICAweDQ3ZTk2NDIyVSwgMHhhOGZjOGNjNFUsIDB4YTBmMDNmMWFVLCAweDU2N2QyY2Q4VSwgMHgyMjMzOTBlZlUsCisgICAgMHg4NzQ5NGVjN1UsIDB4ZDkzOGQxYzFVLCAweDhjY2FhMmZlVSwgMHg5OGQ0MGIzNlUsIDB4YTZmNTgxY2ZVLAorICAgIDB4YTU3YWRlMjhVLCAweGRhYjc4ZTI2VSwgMHgzZmFkYmZhNFUsIDB4MmMzYTlkZTRVLCAweDUwNzg5MjBkVSwKKyAgICAweDZhNWZjYzliVSwgMHg1NDdlNDY2MlUsIDB4ZjY4ZDEzYzJVLCAweDkwZDhiOGU4VSwgMHgyZTM5Zjc1ZVUsCisgICAgMHg4MmMzYWZmNVUsIDB4OWY1ZDgwYmVVLCAweDY5ZDA5MzdjVSwgMHg2ZmQ1MmRhOVUsIDB4Y2YyNTEyYjNVLAorICAgIDB4YzhhYzk5M2JVLCAweDEwMTg3ZGE3VSwgMHhlODljNjM2ZVUsIDB4ZGIzYmJiN2JVLCAweGNkMjY3ODA5VSwKKyAgICAweDZlNTkxOGY0VSwgMHhlYzlhYjcwMVUsIDB4ODM0ZjlhYThVLCAweGU2OTU2ZTY1VSwgMHhhYWZmZTY3ZVUsCisgICAgMHgyMWJjY2YwOFUsIDB4ZWYxNWU4ZTZVLCAweGJhZTc5YmQ5VSwgMHg0YTZmMzZjZVUsIDB4ZWE5ZjA5ZDRVLAorICAgIDB4MjliMDdjZDZVLCAweDMxYTRiMmFmVSwgMHgyYTNmMjMzMVUsIDB4YzZhNTk0MzBVLCAweDM1YTI2NmMwVSwKKyAgICAweDc0NGViYzM3VSwgMHhmYzgyY2FhNlUsIDB4ZTA5MGQwYjBVLCAweDMzYTdkODE1VSwgMHhmMTA0OTg0YVUsCisgICAgMHg0MWVjZGFmN1UsIDB4N2ZjZDUwMGVVLCAweDE3OTFmNjJmVSwgMHg3NjRkZDY4ZFUsIDB4NDNlZmIwNGRVLAorICAgIDB4Y2NhYTRkNTRVLCAweGU0OTYwNGRmVSwgMHg5ZWQxYjVlM1UsIDB4NGM2YTg4MWJVLCAweGMxMmMxZmI4VSwKKyAgICAweDQ2NjU1MTdmVSwgMHg5ZDVlZWEwNFUsIDB4MDE4YzM1NWRVLCAweGZhODc3NDczVSwgMHhmYjBiNDEyZVUsCisgICAgMHhiMzY3MWQ1YVUsIDB4OTJkYmQyNTJVLCAweGU5MTA1NjMzVSwgMHg2ZGQ2NDcxM1UsIDB4OWFkNzYxOGNVLAorICAgIDB4MzdhMTBjN2FVLCAweDU5ZjgxNDhlVSwgMHhlYjEzM2M4OVUsIDB4Y2VhOTI3ZWVVLCAweGI3NjFjOTM1VSwKKyAgICAweGUxMWNlNWVkVSwgMHg3YTQ3YjEzY1UsIDB4OWNkMmRmNTlVLCAweDU1ZjI3MzNmVSwgMHgxODE0Y2U3OVUsCisgICAgMHg3M2M3MzdiZlUsIDB4NTNmN2NkZWFVLCAweDVmZmRhYTViVSwgMHhkZjNkNmYxNFUsIDB4Nzg0NGRiODZVLAorICAgIDB4Y2FhZmYzODFVLCAweGI5NjhjNDNlVSwgMHgzODI0MzQyY1UsIDB4YzJhMzQwNWZVLCAweDE2MWRjMzcyVSwKKyAgICAweGJjZTIyNTBjVSwgMHgyODNjNDk4YlUsIDB4ZmYwZDk1NDFVLCAweDM5YTgwMTcxVSwgMHgwODBjYjNkZVUsCisgICAgMHhkOGI0ZTQ5Y1UsIDB4NjQ1NmMxOTBVLCAweDdiY2I4NDYxVSwgMHhkNTMyYjY3MFUsIDB4NDg2YzVjNzRVLAorICAgIDB4ZDBiODU3NDJVLCB9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgVGQxWzI1Nl0gPSB7CisgICAgMHg1MDUxZjRhN1UsIDB4NTM3ZTQxNjVVLCAweGMzMWExN2E0VSwgMHg5NjNhMjc1ZVUsIDB4Y2IzYmFiNmJVLAorICAgIDB4ZjExZjlkNDVVLCAweGFiYWNmYTU4VSwgMHg5MzRiZTMwM1UsIDB4NTUyMDMwZmFVLCAweGY2YWQ3NjZkVSwKKyAgICAweDkxODhjYzc2VSwgMHgyNWY1MDI0Y1UsIDB4ZmM0ZmU1ZDdVLCAweGQ3YzUyYWNiVSwgMHg4MDI2MzU0NFUsCisgICAgMHg4ZmI1NjJhM1UsIDB4NDlkZWIxNWFVLCAweDY3MjViYTFiVSwgMHg5ODQ1ZWEwZVUsIDB4ZTE1ZGZlYzBVLAorICAgIDB4MDJjMzJmNzVVLCAweDEyODE0Y2YwVSwgMHhhMzhkNDY5N1UsIDB4YzY2YmQzZjlVLCAweGU3MDM4ZjVmVSwKKyAgICAweDk1MTU5MjljVSwgMHhlYmJmNmQ3YVUsIDB4ZGE5NTUyNTlVLCAweDJkZDRiZTgzVSwgMHhkMzU4NzQyMVUsCisgICAgMHgyOTQ5ZTA2OVUsIDB4NDQ4ZWM5YzhVLCAweDZhNzVjMjg5VSwgMHg3OGY0OGU3OVUsIDB4NmI5OTU4M2VVLAorICAgIDB4ZGQyN2I5NzFVLCAweGI2YmVlMTRmVSwgMHgxN2YwODhhZFUsIDB4NjZjOTIwYWNVLCAweGI0N2RjZTNhVSwKKyAgICAweDE4NjNkZjRhVSwgMHg4MmU1MWEzMVUsIDB4NjA5NzUxMzNVLCAweDQ1NjI1MzdmVSwgMHhlMGIxNjQ3N1UsCisgICAgMHg4NGJiNmJhZVUsIDB4MWNmZTgxYTBVLCAweDk0ZjkwODJiVSwgMHg1ODcwNDg2OFUsIDB4MTk4ZjQ1ZmRVLAorICAgIDB4ODc5NGRlNmNVLCAweGI3NTI3YmY4VSwgMHgyM2FiNzNkM1UsIDB4ZTI3MjRiMDJVLCAweDU3ZTMxZjhmVSwKKyAgICAweDJhNjY1NWFiVSwgMHgwN2IyZWIyOFUsIDB4MDMyZmI1YzJVLCAweDlhODZjNTdiVSwgMHhhNWQzMzcwOFUsCisgICAgMHhmMjMwMjg4N1UsIDB4YjIyM2JmYTVVLCAweGJhMDIwMzZhVSwgMHg1Y2VkMTY4MlUsIDB4MmI4YWNmMWNVLAorICAgIDB4OTJhNzc5YjRVLCAweGYwZjMwN2YyVSwgMHhhMTRlNjllMlUsIDB4Y2Q2NWRhZjRVLCAweGQ1MDYwNWJlVSwKKyAgICAweDFmZDEzNDYyVSwgMHg4YWM0YTZmZVUsIDB4OWQzNDJlNTNVLCAweGEwYTJmMzU1VSwgMHgzMjA1OGFlMVUsCisgICAgMHg3NWE0ZjZlYlUsIDB4MzkwYjgzZWNVLCAweGFhNDA2MGVmVSwgMHgwNjVlNzE5ZlUsIDB4NTFiZDZlMTBVLAorICAgIDB4ZjkzZTIxOGFVLCAweDNkOTZkZDA2VSwgMHhhZWRkM2UwNVUsIDB4NDY0ZGU2YmRVLCAweGI1OTE1NDhkVSwKKyAgICAweDA1NzFjNDVkVSwgMHg2ZjA0MDZkNFUsIDB4ZmY2MDUwMTVVLCAweDI0MTk5OGZiVSwgMHg5N2Q2YmRlOVUsCisgICAgMHhjYzg5NDA0M1UsIDB4Nzc2N2Q5OWVVLCAweGJkYjBlODQyVSwgMHg4ODA3ODk4YlUsIDB4MzhlNzE5NWJVLAorICAgIDB4ZGI3OWM4ZWVVLCAweDQ3YTE3YzBhVSwgMHhlOTdjNDIwZlUsIDB4YzlmODg0MWVVLCAweDAwMDAwMDAwVSwKKyAgICAweDgzMDk4MDg2VSwgMHg0ODMyMmJlZFUsIDB4YWMxZTExNzBVLCAweDRlNmM1YTcyVSwgMHhmYmZkMGVmZlUsCisgICAgMHg1NjBmODUzOFUsIDB4MWUzZGFlZDVVLCAweDI3MzYyZDM5VSwgMHg2NDBhMGZkOVUsIDB4MjE2ODVjYTZVLAorICAgIDB4ZDE5YjViNTRVLCAweDNhMjQzNjJlVSwgMHhiMTBjMGE2N1UsIDB4MGY5MzU3ZTdVLCAweGQyYjRlZTk2VSwKKyAgICAweDllMWI5YjkxVSwgMHg0ZjgwYzBjNVUsIDB4YTI2MWRjMjBVLCAweDY5NWE3NzRiVSwgMHgxNjFjMTIxYVUsCisgICAgMHgwYWUyOTNiYVUsIDB4ZTVjMGEwMmFVLCAweDQzM2MyMmUwVSwgMHgxZDEyMWIxN1UsIDB4MGIwZTA5MGRVLAorICAgIDB4YWRmMjhiYzdVLCAweGI5MmRiNmE4VSwgMHhjODE0MWVhOVUsIDB4ODU1N2YxMTlVLCAweDRjYWY3NTA3VSwKKyAgICAweGJiZWU5OWRkVSwgMHhmZGEzN2Y2MFUsIDB4OWZmNzAxMjZVLCAweGJjNWM3MmY1VSwgMHhjNTQ0NjYzYlUsCisgICAgMHgzNDViZmI3ZVUsIDB4NzY4YjQzMjlVLCAweGRjY2IyM2M2VSwgMHg2OGI2ZWRmY1UsIDB4NjNiOGU0ZjFVLAorICAgIDB4Y2FkNzMxZGNVLCAweDEwNDI2Mzg1VSwgMHg0MDEzOTcyMlUsIDB4MjA4NGM2MTFVLCAweDdkODU0YTI0VSwKKyAgICAweGY4ZDJiYjNkVSwgMHgxMWFlZjkzMlUsIDB4NmRjNzI5YTFVLCAweDRiMWQ5ZTJmVSwgMHhmM2RjYjIzMFUsCisgICAgMHhlYzBkODY1MlUsIDB4ZDA3N2MxZTNVLCAweDZjMmJiMzE2VSwgMHg5OWE5NzBiOVUsIDB4ZmExMTk0NDhVLAorICAgIDB4MjI0N2U5NjRVLCAweGM0YThmYzhjVSwgMHgxYWEwZjAzZlUsIDB4ZDg1NjdkMmNVLCAweGVmMjIzMzkwVSwKKyAgICAweGM3ODc0OTRlVSwgMHhjMWQ5MzhkMVUsIDB4ZmU4Y2NhYTJVLCAweDM2OThkNDBiVSwgMHhjZmE2ZjU4MVUsCisgICAgMHgyOGE1N2FkZVUsIDB4MjZkYWI3OGVVLCAweGE0M2ZhZGJmVSwgMHhlNDJjM2E5ZFUsIDB4MGQ1MDc4OTJVLAorICAgIDB4OWI2YTVmY2NVLCAweDYyNTQ3ZTQ2VSwgMHhjMmY2OGQxM1UsIDB4ZTg5MGQ4YjhVLCAweDVlMmUzOWY3VSwKKyAgICAweGY1ODJjM2FmVSwgMHhiZTlmNWQ4MFUsIDB4N2M2OWQwOTNVLCAweGE5NmZkNTJkVSwgMHhiM2NmMjUxMlUsCisgICAgMHgzYmM4YWM5OVUsIDB4YTcxMDE4N2RVLCAweDZlZTg5YzYzVSwgMHg3YmRiM2JiYlUsIDB4MDljZDI2NzhVLAorICAgIDB4ZjQ2ZTU5MThVLCAweDAxZWM5YWI3VSwgMHhhODgzNGY5YVUsIDB4NjVlNjk1NmVVLCAweDdlYWFmZmU2VSwKKyAgICAweDA4MjFiY2NmVSwgMHhlNmVmMTVlOFUsIDB4ZDliYWU3OWJVLCAweGNlNGE2ZjM2VSwgMHhkNGVhOWYwOVUsCisgICAgMHhkNjI5YjA3Y1UsIDB4YWYzMWE0YjJVLCAweDMxMmEzZjIzVSwgMHgzMGM2YTU5NFUsIDB4YzAzNWEyNjZVLAorICAgIDB4Mzc3NDRlYmNVLCAweGE2ZmM4MmNhVSwgMHhiMGUwOTBkMFUsIDB4MTUzM2E3ZDhVLCAweDRhZjEwNDk4VSwKKyAgICAweGY3NDFlY2RhVSwgMHgwZTdmY2Q1MFUsIDB4MmYxNzkxZjZVLCAweDhkNzY0ZGQ2VSwgMHg0ZDQzZWZiMFUsCisgICAgMHg1NGNjYWE0ZFUsIDB4ZGZlNDk2MDRVLCAweGUzOWVkMWI1VSwgMHgxYjRjNmE4OFUsIDB4YjhjMTJjMWZVLAorICAgIDB4N2Y0NjY1NTFVLCAweDA0OWQ1ZWVhVSwgMHg1ZDAxOGMzNVUsIDB4NzNmYTg3NzRVLCAweDJlZmIwYjQxVSwKKyAgICAweDVhYjM2NzFkVSwgMHg1MjkyZGJkMlUsIDB4MzNlOTEwNTZVLCAweDEzNmRkNjQ3VSwgMHg4YzlhZDc2MVUsCisgICAgMHg3YTM3YTEwY1UsIDB4OGU1OWY4MTRVLCAweDg5ZWIxMzNjVSwgMHhlZWNlYTkyN1UsIDB4MzViNzYxYzlVLAorICAgIDB4ZWRlMTFjZTVVLCAweDNjN2E0N2IxVSwgMHg1OTljZDJkZlUsIDB4M2Y1NWYyNzNVLCAweDc5MTgxNGNlVSwKKyAgICAweGJmNzNjNzM3VSwgMHhlYTUzZjdjZFUsIDB4NWI1ZmZkYWFVLCAweDE0ZGYzZDZmVSwgMHg4Njc4NDRkYlUsCisgICAgMHg4MWNhYWZmM1UsIDB4M2ViOTY4YzRVLCAweDJjMzgyNDM0VSwgMHg1ZmMyYTM0MFUsIDB4NzIxNjFkYzNVLAorICAgIDB4MGNiY2UyMjVVLCAweDhiMjgzYzQ5VSwgMHg0MWZmMGQ5NVUsIDB4NzEzOWE4MDFVLCAweGRlMDgwY2IzVSwKKyAgICAweDljZDhiNGU0VSwgMHg5MDY0NTZjMVUsIDB4NjE3YmNiODRVLCAweDcwZDUzMmI2VSwgMHg3NDQ4NmM1Y1UsCisgICAgMHg0MmQwYjg1N1UsIH07CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBUZDJbMjU2XSA9IHsKKyAgICAweGE3NTA1MWY0VSwgMHg2NTUzN2U0MVUsIDB4YTRjMzFhMTdVLCAweDVlOTYzYTI3VSwgMHg2YmNiM2JhYlUsCisgICAgMHg0NWYxMWY5ZFUsIDB4NThhYmFjZmFVLCAweDAzOTM0YmUzVSwgMHhmYTU1MjAzMFUsIDB4NmRmNmFkNzZVLAorICAgIDB4NzY5MTg4Y2NVLCAweDRjMjVmNTAyVSwgMHhkN2ZjNGZlNVUsIDB4Y2JkN2M1MmFVLCAweDQ0ODAyNjM1VSwKKyAgICAweGEzOGZiNTYyVSwgMHg1YTQ5ZGViMVUsIDB4MWI2NzI1YmFVLCAweDBlOTg0NWVhVSwgMHhjMGUxNWRmZVUsCisgICAgMHg3NTAyYzMyZlUsIDB4ZjAxMjgxNGNVLCAweDk3YTM4ZDQ2VSwgMHhmOWM2NmJkM1UsIDB4NWZlNzAzOGZVLAorICAgIDB4OWM5NTE1OTJVLCAweDdhZWJiZjZkVSwgMHg1OWRhOTU1MlUsIDB4ODMyZGQ0YmVVLCAweDIxZDM1ODc0VSwKKyAgICAweDY5Mjk0OWUwVSwgMHhjODQ0OGVjOVUsIDB4ODk2YTc1YzJVLCAweDc5NzhmNDhlVSwgMHgzZTZiOTk1OFUsCisgICAgMHg3MWRkMjdiOVUsIDB4NGZiNmJlZTFVLCAweGFkMTdmMDg4VSwgMHhhYzY2YzkyMFUsIDB4M2FiNDdkY2VVLAorICAgIDB4NGExODYzZGZVLCAweDMxODJlNTFhVSwgMHgzMzYwOTc1MVUsIDB4N2Y0NTYyNTNVLCAweDc3ZTBiMTY0VSwKKyAgICAweGFlODRiYjZiVSwgMHhhMDFjZmU4MVUsIDB4MmI5NGY5MDhVLCAweDY4NTg3MDQ4VSwgMHhmZDE5OGY0NVUsCisgICAgMHg2Yzg3OTRkZVUsIDB4ZjhiNzUyN2JVLCAweGQzMjNhYjczVSwgMHgwMmUyNzI0YlUsIDB4OGY1N2UzMWZVLAorICAgIDB4YWIyYTY2NTVVLCAweDI4MDdiMmViVSwgMHhjMjAzMmZiNVUsIDB4N2I5YTg2YzVVLCAweDA4YTVkMzM3VSwKKyAgICAweDg3ZjIzMDI4VSwgMHhhNWIyMjNiZlUsIDB4NmFiYTAyMDNVLCAweDgyNWNlZDE2VSwgMHgxYzJiOGFjZlUsCisgICAgMHhiNDkyYTc3OVUsIDB4ZjJmMGYzMDdVLCAweGUyYTE0ZTY5VSwgMHhmNGNkNjVkYVUsIDB4YmVkNTA2MDVVLAorICAgIDB4NjIxZmQxMzRVLCAweGZlOGFjNGE2VSwgMHg1MzlkMzQyZVUsIDB4NTVhMGEyZjNVLCAweGUxMzIwNThhVSwKKyAgICAweGViNzVhNGY2VSwgMHhlYzM5MGI4M1UsIDB4ZWZhYTQwNjBVLCAweDlmMDY1ZTcxVSwgMHgxMDUxYmQ2ZVUsCisgICAgMHg4YWY5M2UyMVUsIDB4MDYzZDk2ZGRVLCAweDA1YWVkZDNlVSwgMHhiZDQ2NGRlNlUsIDB4OGRiNTkxNTRVLAorICAgIDB4NWQwNTcxYzRVLCAweGQ0NmYwNDA2VSwgMHgxNWZmNjA1MFUsIDB4ZmIyNDE5OThVLCAweGU5OTdkNmJkVSwKKyAgICAweDQzY2M4OTQwVSwgMHg5ZTc3NjdkOVUsIDB4NDJiZGIwZThVLCAweDhiODgwNzg5VSwgMHg1YjM4ZTcxOVUsCisgICAgMHhlZWRiNzljOFUsIDB4MGE0N2ExN2NVLCAweDBmZTk3YzQyVSwgMHgxZWM5Zjg4NFUsIDB4MDAwMDAwMDBVLAorICAgIDB4ODY4MzA5ODBVLCAweGVkNDgzMjJiVSwgMHg3MGFjMWUxMVUsIDB4NzI0ZTZjNWFVLCAweGZmZmJmZDBlVSwKKyAgICAweDM4NTYwZjg1VSwgMHhkNTFlM2RhZVUsIDB4MzkyNzM2MmRVLCAweGQ5NjQwYTBmVSwgMHhhNjIxNjg1Y1UsCisgICAgMHg1NGQxOWI1YlUsIDB4MmUzYTI0MzZVLCAweDY3YjEwYzBhVSwgMHhlNzBmOTM1N1UsIDB4OTZkMmI0ZWVVLAorICAgIDB4OTE5ZTFiOWJVLCAweGM1NGY4MGMwVSwgMHgyMGEyNjFkY1UsIDB4NGI2OTVhNzdVLCAweDFhMTYxYzEyVSwKKyAgICAweGJhMGFlMjkzVSwgMHgyYWU1YzBhMFUsIDB4ZTA0MzNjMjJVLCAweDE3MWQxMjFiVSwgMHgwZDBiMGUwOVUsCisgICAgMHhjN2FkZjI4YlUsIDB4YThiOTJkYjZVLCAweGE5YzgxNDFlVSwgMHgxOTg1NTdmMVUsIDB4MDc0Y2FmNzVVLAorICAgIDB4ZGRiYmVlOTlVLCAweDYwZmRhMzdmVSwgMHgyNjlmZjcwMVUsIDB4ZjViYzVjNzJVLCAweDNiYzU0NDY2VSwKKyAgICAweDdlMzQ1YmZiVSwgMHgyOTc2OGI0M1UsIDB4YzZkY2NiMjNVLCAweGZjNjhiNmVkVSwgMHhmMTYzYjhlNFUsCisgICAgMHhkY2NhZDczMVUsIDB4ODUxMDQyNjNVLCAweDIyNDAxMzk3VSwgMHgxMTIwODRjNlUsIDB4MjQ3ZDg1NGFVLAorICAgIDB4M2RmOGQyYmJVLCAweDMyMTFhZWY5VSwgMHhhMTZkYzcyOVUsIDB4MmY0YjFkOWVVLCAweDMwZjNkY2IyVSwKKyAgICAweDUyZWMwZDg2VSwgMHhlM2QwNzdjMVUsIDB4MTY2YzJiYjNVLCAweGI5OTlhOTcwVSwgMHg0OGZhMTE5NFUsCisgICAgMHg2NDIyNDdlOVUsIDB4OGNjNGE4ZmNVLCAweDNmMWFhMGYwVSwgMHgyY2Q4NTY3ZFUsIDB4OTBlZjIyMzNVLAorICAgIDB4NGVjNzg3NDlVLCAweGQxYzFkOTM4VSwgMHhhMmZlOGNjYVUsIDB4MGIzNjk4ZDRVLCAweDgxY2ZhNmY1VSwKKyAgICAweGRlMjhhNTdhVSwgMHg4ZTI2ZGFiN1UsIDB4YmZhNDNmYWRVLCAweDlkZTQyYzNhVSwgMHg5MjBkNTA3OFUsCisgICAgMHhjYzliNmE1ZlUsIDB4NDY2MjU0N2VVLCAweDEzYzJmNjhkVSwgMHhiOGU4OTBkOFUsIDB4Zjc1ZTJlMzlVLAorICAgIDB4YWZmNTgyYzNVLCAweDgwYmU5ZjVkVSwgMHg5MzdjNjlkMFUsIDB4MmRhOTZmZDVVLCAweDEyYjNjZjI1VSwKKyAgICAweDk5M2JjOGFjVSwgMHg3ZGE3MTAxOFUsIDB4NjM2ZWU4OWNVLCAweGJiN2JkYjNiVSwgMHg3ODA5Y2QyNlUsCisgICAgMHgxOGY0NmU1OVUsIDB4YjcwMWVjOWFVLCAweDlhYTg4MzRmVSwgMHg2ZTY1ZTY5NVUsIDB4ZTY3ZWFhZmZVLAorICAgIDB4Y2YwODIxYmNVLCAweGU4ZTZlZjE1VSwgMHg5YmQ5YmFlN1UsIDB4MzZjZTRhNmZVLCAweDA5ZDRlYTlmVSwKKyAgICAweDdjZDYyOWIwVSwgMHhiMmFmMzFhNFUsIDB4MjMzMTJhM2ZVLCAweDk0MzBjNmE1VSwgMHg2NmMwMzVhMlUsCisgICAgMHhiYzM3NzQ0ZVUsIDB4Y2FhNmZjODJVLCAweGQwYjBlMDkwVSwgMHhkODE1MzNhN1UsIDB4OTg0YWYxMDRVLAorICAgIDB4ZGFmNzQxZWNVLCAweDUwMGU3ZmNkVSwgMHhmNjJmMTc5MVUsIDB4ZDY4ZDc2NGRVLCAweGIwNGQ0M2VmVSwKKyAgICAweDRkNTRjY2FhVSwgMHgwNGRmZTQ5NlUsIDB4YjVlMzllZDFVLCAweDg4MWI0YzZhVSwgMHgxZmI4YzEyY1UsCisgICAgMHg1MTdmNDY2NVUsIDB4ZWEwNDlkNWVVLCAweDM1NWQwMThjVSwgMHg3NDczZmE4N1UsIDB4NDEyZWZiMGJVLAorICAgIDB4MWQ1YWIzNjdVLCAweGQyNTI5MmRiVSwgMHg1NjMzZTkxMFUsIDB4NDcxMzZkZDZVLCAweDYxOGM5YWQ3VSwKKyAgICAweDBjN2EzN2ExVSwgMHgxNDhlNTlmOFUsIDB4M2M4OWViMTNVLCAweDI3ZWVjZWE5VSwgMHhjOTM1Yjc2MVUsCisgICAgMHhlNWVkZTExY1UsIDB4YjEzYzdhNDdVLCAweGRmNTk5Y2QyVSwgMHg3MzNmNTVmMlUsIDB4Y2U3OTE4MTRVLAorICAgIDB4MzdiZjczYzdVLCAweGNkZWE1M2Y3VSwgMHhhYTViNWZmZFUsIDB4NmYxNGRmM2RVLCAweGRiODY3ODQ0VSwKKyAgICAweGYzODFjYWFmVSwgMHhjNDNlYjk2OFUsIDB4MzQyYzM4MjRVLCAweDQwNWZjMmEzVSwgMHhjMzcyMTYxZFUsCisgICAgMHgyNTBjYmNlMlUsIDB4NDk4YjI4M2NVLCAweDk1NDFmZjBkVSwgMHgwMTcxMzlhOFUsIDB4YjNkZTA4MGNVLAorICAgIDB4ZTQ5Y2Q4YjRVLCAweGMxOTA2NDU2VSwgMHg4NDYxN2JjYlUsIDB4YjY3MGQ1MzJVLCAweDVjNzQ0ODZjVSwKKyAgICAweDU3NDJkMGI4VSwgfTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IFRkM1syNTZdID0geworICAgIDB4ZjRhNzUwNTFVLCAweDQxNjU1MzdlVSwgMHgxN2E0YzMxYVUsIDB4Mjc1ZTk2M2FVLCAweGFiNmJjYjNiVSwKKyAgICAweDlkNDVmMTFmVSwgMHhmYTU4YWJhY1UsIDB4ZTMwMzkzNGJVLCAweDMwZmE1NTIwVSwgMHg3NjZkZjZhZFUsCisgICAgMHhjYzc2OTE4OFUsIDB4MDI0YzI1ZjVVLCAweGU1ZDdmYzRmVSwgMHgyYWNiZDdjNVUsIDB4MzU0NDgwMjZVLAorICAgIDB4NjJhMzhmYjVVLCAweGIxNWE0OWRlVSwgMHhiYTFiNjcyNVUsIDB4ZWEwZTk4NDVVLCAweGZlYzBlMTVkVSwKKyAgICAweDJmNzUwMmMzVSwgMHg0Y2YwMTI4MVUsIDB4NDY5N2EzOGRVLCAweGQzZjljNjZiVSwgMHg4ZjVmZTcwM1UsCisgICAgMHg5MjljOTUxNVUsIDB4NmQ3YWViYmZVLCAweDUyNTlkYTk1VSwgMHhiZTgzMmRkNFUsIDB4NzQyMWQzNThVLAorICAgIDB4ZTA2OTI5NDlVLCAweGM5Yzg0NDhlVSwgMHhjMjg5NmE3NVUsIDB4OGU3OTc4ZjRVLCAweDU4M2U2Yjk5VSwKKyAgICAweGI5NzFkZDI3VSwgMHhlMTRmYjZiZVUsIDB4ODhhZDE3ZjBVLCAweDIwYWM2NmM5VSwgMHhjZTNhYjQ3ZFUsCisgICAgMHhkZjRhMTg2M1UsIDB4MWEzMTgyZTVVLCAweDUxMzM2MDk3VSwgMHg1MzdmNDU2MlUsIDB4NjQ3N2UwYjFVLAorICAgIDB4NmJhZTg0YmJVLCAweDgxYTAxY2ZlVSwgMHgwODJiOTRmOVUsIDB4NDg2ODU4NzBVLCAweDQ1ZmQxOThmVSwKKyAgICAweGRlNmM4Nzk0VSwgMHg3YmY4Yjc1MlUsIDB4NzNkMzIzYWJVLCAweDRiMDJlMjcyVSwgMHgxZjhmNTdlM1UsCisgICAgMHg1NWFiMmE2NlUsIDB4ZWIyODA3YjJVLCAweGI1YzIwMzJmVSwgMHhjNTdiOWE4NlUsIDB4MzcwOGE1ZDNVLAorICAgIDB4Mjg4N2YyMzBVLCAweGJmYTViMjIzVSwgMHgwMzZhYmEwMlUsIDB4MTY4MjVjZWRVLCAweGNmMWMyYjhhVSwKKyAgICAweDc5YjQ5MmE3VSwgMHgwN2YyZjBmM1UsIDB4NjllMmExNGVVLCAweGRhZjRjZDY1VSwgMHgwNWJlZDUwNlUsCisgICAgMHgzNDYyMWZkMVUsIDB4YTZmZThhYzRVLCAweDJlNTM5ZDM0VSwgMHhmMzU1YTBhMlUsIDB4OGFlMTMyMDVVLAorICAgIDB4ZjZlYjc1YTRVLCAweDgzZWMzOTBiVSwgMHg2MGVmYWE0MFUsIDB4NzE5ZjA2NWVVLCAweDZlMTA1MWJkVSwKKyAgICAweDIxOGFmOTNlVSwgMHhkZDA2M2Q5NlUsIDB4M2UwNWFlZGRVLCAweGU2YmQ0NjRkVSwgMHg1NDhkYjU5MVUsCisgICAgMHhjNDVkMDU3MVUsIDB4MDZkNDZmMDRVLCAweDUwMTVmZjYwVSwgMHg5OGZiMjQxOVUsIDB4YmRlOTk3ZDZVLAorICAgIDB4NDA0M2NjODlVLCAweGQ5OWU3NzY3VSwgMHhlODQyYmRiMFUsIDB4ODk4Yjg4MDdVLCAweDE5NWIzOGU3VSwKKyAgICAweGM4ZWVkYjc5VSwgMHg3YzBhNDdhMVUsIDB4NDIwZmU5N2NVLCAweDg0MWVjOWY4VSwgMHgwMDAwMDAwMFUsCisgICAgMHg4MDg2ODMwOVUsIDB4MmJlZDQ4MzJVLCAweDExNzBhYzFlVSwgMHg1YTcyNGU2Y1UsIDB4MGVmZmZiZmRVLAorICAgIDB4ODUzODU2MGZVLCAweGFlZDUxZTNkVSwgMHgyZDM5MjczNlUsIDB4MGZkOTY0MGFVLCAweDVjYTYyMTY4VSwKKyAgICAweDViNTRkMTliVSwgMHgzNjJlM2EyNFUsIDB4MGE2N2IxMGNVLCAweDU3ZTcwZjkzVSwgMHhlZTk2ZDJiNFUsCisgICAgMHg5YjkxOWUxYlUsIDB4YzBjNTRmODBVLCAweGRjMjBhMjYxVSwgMHg3NzRiNjk1YVUsIDB4MTIxYTE2MWNVLAorICAgIDB4OTNiYTBhZTJVLCAweGEwMmFlNWMwVSwgMHgyMmUwNDMzY1UsIDB4MWIxNzFkMTJVLCAweDA5MGQwYjBlVSwKKyAgICAweDhiYzdhZGYyVSwgMHhiNmE4YjkyZFUsIDB4MWVhOWM4MTRVLCAweGYxMTk4NTU3VSwgMHg3NTA3NGNhZlUsCisgICAgMHg5OWRkYmJlZVUsIDB4N2Y2MGZkYTNVLCAweDAxMjY5ZmY3VSwgMHg3MmY1YmM1Y1UsIDB4NjYzYmM1NDRVLAorICAgIDB4ZmI3ZTM0NWJVLCAweDQzMjk3NjhiVSwgMHgyM2M2ZGNjYlUsIDB4ZWRmYzY4YjZVLCAweGU0ZjE2M2I4VSwKKyAgICAweDMxZGNjYWQ3VSwgMHg2Mzg1MTA0MlUsIDB4OTcyMjQwMTNVLCAweGM2MTEyMDg0VSwgMHg0YTI0N2Q4NVUsCisgICAgMHhiYjNkZjhkMlUsIDB4ZjkzMjExYWVVLCAweDI5YTE2ZGM3VSwgMHg5ZTJmNGIxZFUsIDB4YjIzMGYzZGNVLAorICAgIDB4ODY1MmVjMGRVLCAweGMxZTNkMDc3VSwgMHhiMzE2NmMyYlUsIDB4NzBiOTk5YTlVLCAweDk0NDhmYTExVSwKKyAgICAweGU5NjQyMjQ3VSwgMHhmYzhjYzRhOFUsIDB4ZjAzZjFhYTBVLCAweDdkMmNkODU2VSwgMHgzMzkwZWYyMlUsCisgICAgMHg0OTRlYzc4N1UsIDB4MzhkMWMxZDlVLCAweGNhYTJmZThjVSwgMHhkNDBiMzY5OFUsIDB4ZjU4MWNmYTZVLAorICAgIDB4N2FkZTI4YTVVLCAweGI3OGUyNmRhVSwgMHhhZGJmYTQzZlUsIDB4M2E5ZGU0MmNVLCAweDc4OTIwZDUwVSwKKyAgICAweDVmY2M5YjZhVSwgMHg3ZTQ2NjI1NFUsIDB4OGQxM2MyZjZVLCAweGQ4YjhlODkwVSwgMHgzOWY3NWUyZVUsCisgICAgMHhjM2FmZjU4MlUsIDB4NWQ4MGJlOWZVLCAweGQwOTM3YzY5VSwgMHhkNTJkYTk2ZlUsIDB4MjUxMmIzY2ZVLAorICAgIDB4YWM5OTNiYzhVLCAweDE4N2RhNzEwVSwgMHg5YzYzNmVlOFUsIDB4M2JiYjdiZGJVLCAweDI2NzgwOWNkVSwKKyAgICAweDU5MThmNDZlVSwgMHg5YWI3MDFlY1UsIDB4NGY5YWE4ODNVLCAweDk1NmU2NWU2VSwgMHhmZmU2N2VhYVUsCisgICAgMHhiY2NmMDgyMVUsIDB4MTVlOGU2ZWZVLCAweGU3OWJkOWJhVSwgMHg2ZjM2Y2U0YVUsIDB4OWYwOWQ0ZWFVLAorICAgIDB4YjA3Y2Q2MjlVLCAweGE0YjJhZjMxVSwgMHgzZjIzMzEyYVUsIDB4YTU5NDMwYzZVLCAweGEyNjZjMDM1VSwKKyAgICAweDRlYmMzNzc0VSwgMHg4MmNhYTZmY1UsIDB4OTBkMGIwZTBVLCAweGE3ZDgxNTMzVSwgMHgwNDk4NGFmMVUsCisgICAgMHhlY2RhZjc0MVUsIDB4Y2Q1MDBlN2ZVLCAweDkxZjYyZjE3VSwgMHg0ZGQ2OGQ3NlUsIDB4ZWZiMDRkNDNVLAorICAgIDB4YWE0ZDU0Y2NVLCAweDk2MDRkZmU0VSwgMHhkMWI1ZTM5ZVUsIDB4NmE4ODFiNGNVLCAweDJjMWZiOGMxVSwKKyAgICAweDY1NTE3ZjQ2VSwgMHg1ZWVhMDQ5ZFUsIDB4OGMzNTVkMDFVLCAweDg3NzQ3M2ZhVSwgMHgwYjQxMmVmYlUsCisgICAgMHg2NzFkNWFiM1UsIDB4ZGJkMjUyOTJVLCAweDEwNTYzM2U5VSwgMHhkNjQ3MTM2ZFUsIDB4ZDc2MThjOWFVLAorICAgIDB4YTEwYzdhMzdVLCAweGY4MTQ4ZTU5VSwgMHgxMzNjODllYlUsIDB4YTkyN2VlY2VVLCAweDYxYzkzNWI3VSwKKyAgICAweDFjZTVlZGUxVSwgMHg0N2IxM2M3YVUsIDB4ZDJkZjU5OWNVLCAweGYyNzMzZjU1VSwgMHgxNGNlNzkxOFUsCisgICAgMHhjNzM3YmY3M1UsIDB4ZjdjZGVhNTNVLCAweGZkYWE1YjVmVSwgMHgzZDZmMTRkZlUsIDB4NDRkYjg2NzhVLAorICAgIDB4YWZmMzgxY2FVLCAweDY4YzQzZWI5VSwgMHgyNDM0MmMzOFUsIDB4YTM0MDVmYzJVLCAweDFkYzM3MjE2VSwKKyAgICAweGUyMjUwY2JjVSwgMHgzYzQ5OGIyOFUsIDB4MGQ5NTQxZmZVLCAweGE4MDE3MTM5VSwgMHgwY2IzZGUwOFUsCisgICAgMHhiNGU0OWNkOFUsIDB4NTZjMTkwNjRVLCAweGNiODQ2MTdiVSwgMHgzMmI2NzBkNVUsIDB4NmM1Yzc0NDhVLAorICAgIDB4Yjg1NzQyZDBVLCB9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBUZDRbMjU2XSA9IHsKKyAgICAweDUyVSwgMHgwOVUsIDB4NmFVLCAweGQ1VSwgMHgzMFUsIDB4MzZVLCAweGE1VSwgMHgzOFUsIDB4YmZVLCAweDQwVSwgMHhhM1UsCisgICAgMHg5ZVUsIDB4ODFVLCAweGYzVSwgMHhkN1UsIDB4ZmJVLCAweDdjVSwgMHhlM1UsIDB4MzlVLCAweDgyVSwgMHg5YlUsIDB4MmZVLAorICAgIDB4ZmZVLCAweDg3VSwgMHgzNFUsIDB4OGVVLCAweDQzVSwgMHg0NFUsIDB4YzRVLCAweGRlVSwgMHhlOVUsIDB4Y2JVLCAweDU0VSwKKyAgICAweDdiVSwgMHg5NFUsIDB4MzJVLCAweGE2VSwgMHhjMlUsIDB4MjNVLCAweDNkVSwgMHhlZVUsIDB4NGNVLCAweDk1VSwgMHgwYlUsCisgICAgMHg0MlUsIDB4ZmFVLCAweGMzVSwgMHg0ZVUsIDB4MDhVLCAweDJlVSwgMHhhMVUsIDB4NjZVLCAweDI4VSwgMHhkOVUsIDB4MjRVLAorICAgIDB4YjJVLCAweDc2VSwgMHg1YlUsIDB4YTJVLCAweDQ5VSwgMHg2ZFUsIDB4OGJVLCAweGQxVSwgMHgyNVUsIDB4NzJVLCAweGY4VSwKKyAgICAweGY2VSwgMHg2NFUsIDB4ODZVLCAweDY4VSwgMHg5OFUsIDB4MTZVLCAweGQ0VSwgMHhhNFUsIDB4NWNVLCAweGNjVSwgMHg1ZFUsCisgICAgMHg2NVUsIDB4YjZVLCAweDkyVSwgMHg2Y1UsIDB4NzBVLCAweDQ4VSwgMHg1MFUsIDB4ZmRVLCAweGVkVSwgMHhiOVUsIDB4ZGFVLAorICAgIDB4NWVVLCAweDE1VSwgMHg0NlUsIDB4NTdVLCAweGE3VSwgMHg4ZFUsIDB4OWRVLCAweDg0VSwgMHg5MFUsIDB4ZDhVLCAweGFiVSwKKyAgICAweDAwVSwgMHg4Y1UsIDB4YmNVLCAweGQzVSwgMHgwYVUsIDB4ZjdVLCAweGU0VSwgMHg1OFUsIDB4MDVVLCAweGI4VSwgMHhiM1UsCisgICAgMHg0NVUsIDB4MDZVLCAweGQwVSwgMHgyY1UsIDB4MWVVLCAweDhmVSwgMHhjYVUsIDB4M2ZVLCAweDBmVSwgMHgwMlUsIDB4YzFVLAorICAgIDB4YWZVLCAweGJkVSwgMHgwM1UsIDB4MDFVLCAweDEzVSwgMHg4YVUsIDB4NmJVLCAweDNhVSwgMHg5MVUsIDB4MTFVLCAweDQxVSwKKyAgICAweDRmVSwgMHg2N1UsIDB4ZGNVLCAweGVhVSwgMHg5N1UsIDB4ZjJVLCAweGNmVSwgMHhjZVUsIDB4ZjBVLCAweGI0VSwgMHhlNlUsCisgICAgMHg3M1UsIDB4OTZVLCAweGFjVSwgMHg3NFUsIDB4MjJVLCAweGU3VSwgMHhhZFUsIDB4MzVVLCAweDg1VSwgMHhlMlUsIDB4ZjlVLAorICAgIDB4MzdVLCAweGU4VSwgMHgxY1UsIDB4NzVVLCAweGRmVSwgMHg2ZVUsIDB4NDdVLCAweGYxVSwgMHgxYVUsIDB4NzFVLCAweDFkVSwKKyAgICAweDI5VSwgMHhjNVUsIDB4ODlVLCAweDZmVSwgMHhiN1UsIDB4NjJVLCAweDBlVSwgMHhhYVUsIDB4MThVLCAweGJlVSwgMHgxYlUsCisgICAgMHhmY1UsIDB4NTZVLCAweDNlVSwgMHg0YlUsIDB4YzZVLCAweGQyVSwgMHg3OVUsIDB4MjBVLCAweDlhVSwgMHhkYlUsIDB4YzBVLAorICAgIDB4ZmVVLCAweDc4VSwgMHhjZFUsIDB4NWFVLCAweGY0VSwgMHgxZlUsIDB4ZGRVLCAweGE4VSwgMHgzM1UsIDB4ODhVLCAweDA3VSwKKyAgICAweGM3VSwgMHgzMVUsIDB4YjFVLCAweDEyVSwgMHgxMFUsIDB4NTlVLCAweDI3VSwgMHg4MFUsIDB4ZWNVLCAweDVmVSwgMHg2MFUsCisgICAgMHg1MVUsIDB4N2ZVLCAweGE5VSwgMHgxOVUsIDB4YjVVLCAweDRhVSwgMHgwZFUsIDB4MmRVLCAweGU1VSwgMHg3YVUsIDB4OWZVLAorICAgIDB4OTNVLCAweGM5VSwgMHg5Y1UsIDB4ZWZVLCAweGEwVSwgMHhlMFUsIDB4M2JVLCAweDRkVSwgMHhhZVUsIDB4MmFVLCAweGY1VSwKKyAgICAweGIwVSwgMHhjOFUsIDB4ZWJVLCAweGJiVSwgMHgzY1UsIDB4ODNVLCAweDUzVSwgMHg5OVUsIDB4NjFVLCAweDE3VSwgMHgyYlUsCisgICAgMHgwNFUsIDB4N2VVLCAweGJhVSwgMHg3N1UsIDB4ZDZVLCAweDI2VSwgMHhlMVUsIDB4NjlVLCAweDE0VSwgMHg2M1UsIDB4NTVVLAorICAgIDB4MjFVLCAweDBjVSwgMHg3ZFUsIH07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IFRlNFsyNTZdID0geworICAgIDB4NjNVLCAweDdjVSwgMHg3N1UsIDB4N2JVLCAweGYyVSwgMHg2YlUsIDB4NmZVLCAweGM1VSwgMHgzMFUsIDB4MDFVLCAweDY3VSwKKyAgICAweDJiVSwgMHhmZVUsIDB4ZDdVLCAweGFiVSwgMHg3NlUsIDB4Y2FVLCAweDgyVSwgMHhjOVUsIDB4N2RVLCAweGZhVSwgMHg1OVUsCisgICAgMHg0N1UsIDB4ZjBVLCAweGFkVSwgMHhkNFUsIDB4YTJVLCAweGFmVSwgMHg5Y1UsIDB4YTRVLCAweDcyVSwgMHhjMFUsIDB4YjdVLAorICAgIDB4ZmRVLCAweDkzVSwgMHgyNlUsIDB4MzZVLCAweDNmVSwgMHhmN1UsIDB4Y2NVLCAweDM0VSwgMHhhNVUsIDB4ZTVVLCAweGYxVSwKKyAgICAweDcxVSwgMHhkOFUsIDB4MzFVLCAweDE1VSwgMHgwNFUsIDB4YzdVLCAweDIzVSwgMHhjM1UsIDB4MThVLCAweDk2VSwgMHgwNVUsCisgICAgMHg5YVUsIDB4MDdVLCAweDEyVSwgMHg4MFUsIDB4ZTJVLCAweGViVSwgMHgyN1UsIDB4YjJVLCAweDc1VSwgMHgwOVUsIDB4ODNVLAorICAgIDB4MmNVLCAweDFhVSwgMHgxYlUsIDB4NmVVLCAweDVhVSwgMHhhMFUsIDB4NTJVLCAweDNiVSwgMHhkNlUsIDB4YjNVLCAweDI5VSwKKyAgICAweGUzVSwgMHgyZlUsIDB4ODRVLCAweDUzVSwgMHhkMVUsIDB4MDBVLCAweGVkVSwgMHgyMFUsIDB4ZmNVLCAweGIxVSwgMHg1YlUsCisgICAgMHg2YVUsIDB4Y2JVLCAweGJlVSwgMHgzOVUsIDB4NGFVLCAweDRjVSwgMHg1OFUsIDB4Y2ZVLCAweGQwVSwgMHhlZlUsIDB4YWFVLAorICAgIDB4ZmJVLCAweDQzVSwgMHg0ZFUsIDB4MzNVLCAweDg1VSwgMHg0NVUsIDB4ZjlVLCAweDAyVSwgMHg3ZlUsIDB4NTBVLCAweDNjVSwKKyAgICAweDlmVSwgMHhhOFUsIDB4NTFVLCAweGEzVSwgMHg0MFUsIDB4OGZVLCAweDkyVSwgMHg5ZFUsIDB4MzhVLCAweGY1VSwgMHhiY1UsCisgICAgMHhiNlUsIDB4ZGFVLCAweDIxVSwgMHgxMFUsIDB4ZmZVLCAweGYzVSwgMHhkMlUsIDB4Y2RVLCAweDBjVSwgMHgxM1UsIDB4ZWNVLAorICAgIDB4NWZVLCAweDk3VSwgMHg0NFUsIDB4MTdVLCAweGM0VSwgMHhhN1UsIDB4N2VVLCAweDNkVSwgMHg2NFUsIDB4NWRVLCAweDE5VSwKKyAgICAweDczVSwgMHg2MFUsIDB4ODFVLCAweDRmVSwgMHhkY1UsIDB4MjJVLCAweDJhVSwgMHg5MFUsIDB4ODhVLCAweDQ2VSwgMHhlZVUsCisgICAgMHhiOFUsIDB4MTRVLCAweGRlVSwgMHg1ZVUsIDB4MGJVLCAweGRiVSwgMHhlMFUsIDB4MzJVLCAweDNhVSwgMHgwYVUsIDB4NDlVLAorICAgIDB4MDZVLCAweDI0VSwgMHg1Y1UsIDB4YzJVLCAweGQzVSwgMHhhY1UsIDB4NjJVLCAweDkxVSwgMHg5NVUsIDB4ZTRVLCAweDc5VSwKKyAgICAweGU3VSwgMHhjOFUsIDB4MzdVLCAweDZkVSwgMHg4ZFUsIDB4ZDVVLCAweDRlVSwgMHhhOVUsIDB4NmNVLCAweDU2VSwgMHhmNFUsCisgICAgMHhlYVUsIDB4NjVVLCAweDdhVSwgMHhhZVUsIDB4MDhVLCAweGJhVSwgMHg3OFUsIDB4MjVVLCAweDJlVSwgMHgxY1UsIDB4YTZVLAorICAgIDB4YjRVLCAweGM2VSwgMHhlOFUsIDB4ZGRVLCAweDc0VSwgMHgxZlUsIDB4NGJVLCAweGJkVSwgMHg4YlUsIDB4OGFVLCAweDcwVSwKKyAgICAweDNlVSwgMHhiNVUsIDB4NjZVLCAweDQ4VSwgMHgwM1UsIDB4ZjZVLCAweDBlVSwgMHg2MVUsIDB4MzVVLCAweDU3VSwgMHhiOVUsCisgICAgMHg4NlUsIDB4YzFVLCAweDFkVSwgMHg5ZVUsIDB4ZTFVLCAweGY4VSwgMHg5OFUsIDB4MTFVLCAweDY5VSwgMHhkOVUsIDB4OGVVLAorICAgIDB4OTRVLCAweDliVSwgMHgxZVUsIDB4ODdVLCAweGU5VSwgMHhjZVUsIDB4NTVVLCAweDI4VSwgMHhkZlUsIDB4OGNVLCAweGExVSwKKyAgICAweDg5VSwgMHgwZFUsIDB4YmZVLCAweGU2VSwgMHg0MlUsIDB4NjhVLCAweDQxVSwgMHg5OVUsIDB4MmRVLCAweDBmVSwgMHhiMFUsCisgICAgMHg1NFUsIDB4YmJVLCAweDE2VX07CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCByY29uW10gPSB7CisgICAgMHgwMTAwMDAwMCwgMHgwMjAwMDAwMCwgMHgwNDAwMDAwMCwgMHgwODAwMDAwMCwgMHgxMDAwMDAwMCwKKyAgICAweDIwMDAwMDAwLCAweDQwMDAwMDAwLCAweDgwMDAwMDAwLCAweDFCMDAwMDAwLCAweDM2MDAwMDAwLAorICAgIC8qIGZvciAxMjgtYml0IGJsb2NrcywgUmlqbmRhZWwgbmV2ZXIgdXNlcyBtb3JlIHRoYW4gMTAgcmNvbiB2YWx1ZXMgKi8KK307CisKK2ludCBBRVNfc2V0X2VuY3J5cHRfa2V5KGNvbnN0IHVpbnQ4X3QgKmtleSwgY29uc3QgdW5zaWduZWQgYml0cywgQUVTX0tFWSAqYWVza2V5KSB7CisgIHVpbnQzMl90ICpyazsKKyAgaW50IGkgPSAwOworICB1aW50MzJfdCB0ZW1wOworCisgIGlmICgha2V5IHx8ICFhZXNrZXkpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBzd2l0Y2ggKGJpdHMpIHsKKyAgICBjYXNlIDEyODoKKyAgICAgIGFlc2tleS0+cm91bmRzID0gMTA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE5MjoKKyAgICAgIGFlc2tleS0+cm91bmRzID0gMTI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI1NjoKKyAgICAgIGFlc2tleS0+cm91bmRzID0gMTQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIC0yOworICB9CisKKyAgcmsgPSBhZXNrZXktPnJkX2tleTsKKworICBya1swXSA9IEdFVFUzMihrZXkpOworICBya1sxXSA9IEdFVFUzMihrZXkgKyA0KTsKKyAgcmtbMl0gPSBHRVRVMzIoa2V5ICsgOCk7CisgIHJrWzNdID0gR0VUVTMyKGtleSArIDEyKTsKKyAgaWYgKGJpdHMgPT0gMTI4KSB7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgIHRlbXAgPSBya1szXTsKKyAgICAgIHJrWzRdID0gcmtbMF0gXiAoVGUyWyh0ZW1wID4+IDE2KSAmIDB4ZmZdICYgMHhmZjAwMDAwMCkgXgorICAgICAgICAgICAgICAoVGUzWyh0ZW1wID4+IDgpICYgMHhmZl0gJiAweDAwZmYwMDAwKSBeCisgICAgICAgICAgICAgIChUZTBbKHRlbXApICYgMHhmZl0gJiAweDAwMDBmZjAwKSBeCisgICAgICAgICAgICAgIChUZTFbKHRlbXAgPj4gMjQpXSAmIDB4MDAwMDAwZmYpIF4gcmNvbltpXTsKKyAgICAgIHJrWzVdID0gcmtbMV0gXiBya1s0XTsKKyAgICAgIHJrWzZdID0gcmtbMl0gXiBya1s1XTsKKyAgICAgIHJrWzddID0gcmtbM10gXiBya1s2XTsKKyAgICAgIGlmICgrK2kgPT0gMTApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICByayArPSA0OworICAgIH0KKyAgfQorICBya1s0XSA9IEdFVFUzMihrZXkgKyAxNik7CisgIHJrWzVdID0gR0VUVTMyKGtleSArIDIwKTsKKyAgaWYgKGJpdHMgPT0gMTkyKSB7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgIHRlbXAgPSBya1s1XTsKKyAgICAgIHJrWzZdID0gcmtbMF0gXiAoVGUyWyh0ZW1wID4+IDE2KSAmIDB4ZmZdICYgMHhmZjAwMDAwMCkgXgorICAgICAgICAgICAgICAoVGUzWyh0ZW1wID4+IDgpICYgMHhmZl0gJiAweDAwZmYwMDAwKSBeCisgICAgICAgICAgICAgIChUZTBbKHRlbXApICYgMHhmZl0gJiAweDAwMDBmZjAwKSBeCisgICAgICAgICAgICAgIChUZTFbKHRlbXAgPj4gMjQpXSAmIDB4MDAwMDAwZmYpIF4gcmNvbltpXTsKKyAgICAgIHJrWzddID0gcmtbMV0gXiBya1s2XTsKKyAgICAgIHJrWzhdID0gcmtbMl0gXiBya1s3XTsKKyAgICAgIHJrWzldID0gcmtbM10gXiBya1s4XTsKKyAgICAgIGlmICgrK2kgPT0gOCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIHJrWzEwXSA9IHJrWzRdIF4gcmtbOV07CisgICAgICBya1sxMV0gPSBya1s1XSBeIHJrWzEwXTsKKyAgICAgIHJrICs9IDY7CisgICAgfQorICB9CisgIHJrWzZdID0gR0VUVTMyKGtleSArIDI0KTsKKyAgcmtbN10gPSBHRVRVMzIoa2V5ICsgMjgpOworICBpZiAoYml0cyA9PSAyNTYpIHsKKyAgICB3aGlsZSAoMSkgeworICAgICAgdGVtcCA9IHJrWzddOworICAgICAgcmtbOF0gPSBya1swXSBeIChUZTJbKHRlbXAgPj4gMTYpICYgMHhmZl0gJiAweGZmMDAwMDAwKSBeCisgICAgICAgICAgICAgIChUZTNbKHRlbXAgPj4gOCkgJiAweGZmXSAmIDB4MDBmZjAwMDApIF4KKyAgICAgICAgICAgICAgKFRlMFsodGVtcCkgJiAweGZmXSAmIDB4MDAwMGZmMDApIF4KKyAgICAgICAgICAgICAgKFRlMVsodGVtcCA+PiAyNCldICYgMHgwMDAwMDBmZikgXiByY29uW2ldOworICAgICAgcmtbOV0gPSBya1sxXSBeIHJrWzhdOworICAgICAgcmtbMTBdID0gcmtbMl0gXiBya1s5XTsKKyAgICAgIHJrWzExXSA9IHJrWzNdIF4gcmtbMTBdOworICAgICAgaWYgKCsraSA9PSA3KSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgdGVtcCA9IHJrWzExXTsKKyAgICAgIHJrWzEyXSA9IHJrWzRdIF4gKFRlMlsodGVtcCA+PiAyNCldICYgMHhmZjAwMDAwMCkgXgorICAgICAgICAgICAgICAgKFRlM1sodGVtcCA+PiAxNikgJiAweGZmXSAmIDB4MDBmZjAwMDApIF4KKyAgICAgICAgICAgICAgIChUZTBbKHRlbXAgPj4gOCkgJiAweGZmXSAmIDB4MDAwMGZmMDApIF4KKyAgICAgICAgICAgICAgIChUZTFbKHRlbXApICYgMHhmZl0gJiAweDAwMDAwMGZmKTsKKyAgICAgIHJrWzEzXSA9IHJrWzVdIF4gcmtbMTJdOworICAgICAgcmtbMTRdID0gcmtbNl0gXiBya1sxM107CisgICAgICBya1sxNV0gPSBya1s3XSBeIHJrWzE0XTsKKworICAgICAgcmsgKz0gODsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludCBBRVNfc2V0X2RlY3J5cHRfa2V5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgY29uc3QgdW5zaWduZWQgYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIEFFU19LRVkgKmFlc2tleSkgeworICB1aW50MzJfdCAqcms7CisgIGludCBpLCBqLCBzdGF0dXM7CisgIHVpbnQzMl90IHRlbXA7CisKKyAgLyogZmlyc3QsIHN0YXJ0IHdpdGggYW4gZW5jcnlwdGlvbiBzY2hlZHVsZSAqLworICBzdGF0dXMgPSBBRVNfc2V0X2VuY3J5cHRfa2V5KGtleSwgYml0cywgYWVza2V5KTsKKyAgaWYgKHN0YXR1cyA8IDApIHsKKyAgICByZXR1cm4gc3RhdHVzOworICB9CisKKyAgcmsgPSBhZXNrZXktPnJkX2tleTsKKworICAvKiBpbnZlcnQgdGhlIG9yZGVyIG9mIHRoZSByb3VuZCBrZXlzOiAqLworICBmb3IgKGkgPSAwLCBqID0gNCAqIGFlc2tleS0+cm91bmRzOyBpIDwgajsgaSArPSA0LCBqIC09IDQpIHsKKyAgICB0ZW1wID0gcmtbaV07CisgICAgcmtbaV0gPSBya1tqXTsKKyAgICBya1tqXSA9IHRlbXA7CisgICAgdGVtcCA9IHJrW2kgKyAxXTsKKyAgICBya1tpICsgMV0gPSBya1tqICsgMV07CisgICAgcmtbaiArIDFdID0gdGVtcDsKKyAgICB0ZW1wID0gcmtbaSArIDJdOworICAgIHJrW2kgKyAyXSA9IHJrW2ogKyAyXTsKKyAgICBya1tqICsgMl0gPSB0ZW1wOworICAgIHRlbXAgPSBya1tpICsgM107CisgICAgcmtbaSArIDNdID0gcmtbaiArIDNdOworICAgIHJrW2ogKyAzXSA9IHRlbXA7CisgIH0KKyAgLyogYXBwbHkgdGhlIGludmVyc2UgTWl4Q29sdW1uIHRyYW5zZm9ybSB0byBhbGwgcm91bmQga2V5cyBidXQgdGhlIGZpcnN0IGFuZAorICAgKiB0aGUgbGFzdDogKi8KKyAgZm9yIChpID0gMTsgaSA8IGFlc2tleS0+cm91bmRzOyBpKyspIHsKKyAgICByayArPSA0OworICAgIHJrWzBdID0KKyAgICAgICAgVGQwW1RlMVsocmtbMF0gPj4gMjQpXSAmIDB4ZmZdIF4gVGQxW1RlMVsocmtbMF0gPj4gMTYpICYgMHhmZl0gJiAweGZmXSBeCisgICAgICAgIFRkMltUZTFbKHJrWzBdID4+IDgpICYgMHhmZl0gJiAweGZmXSBeIFRkM1tUZTFbKHJrWzBdKSAmIDB4ZmZdICYgMHhmZl07CisgICAgcmtbMV0gPQorICAgICAgICBUZDBbVGUxWyhya1sxXSA+PiAyNCldICYgMHhmZl0gXiBUZDFbVGUxWyhya1sxXSA+PiAxNikgJiAweGZmXSAmIDB4ZmZdIF4KKyAgICAgICAgVGQyW1RlMVsocmtbMV0gPj4gOCkgJiAweGZmXSAmIDB4ZmZdIF4gVGQzW1RlMVsocmtbMV0pICYgMHhmZl0gJiAweGZmXTsKKyAgICBya1syXSA9CisgICAgICAgIFRkMFtUZTFbKHJrWzJdID4+IDI0KV0gJiAweGZmXSBeIFRkMVtUZTFbKHJrWzJdID4+IDE2KSAmIDB4ZmZdICYgMHhmZl0gXgorICAgICAgICBUZDJbVGUxWyhya1syXSA+PiA4KSAmIDB4ZmZdICYgMHhmZl0gXiBUZDNbVGUxWyhya1syXSkgJiAweGZmXSAmIDB4ZmZdOworICAgIHJrWzNdID0KKyAgICAgICAgVGQwW1RlMVsocmtbM10gPj4gMjQpXSAmIDB4ZmZdIF4gVGQxW1RlMVsocmtbM10gPj4gMTYpICYgMHhmZl0gJiAweGZmXSBeCisgICAgICAgIFRkMltUZTFbKHJrWzNdID4+IDgpICYgMHhmZl0gJiAweGZmXSBeIFRkM1tUZTFbKHJrWzNdKSAmIDB4ZmZdICYgMHhmZl07CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgQUVTX2VuY3J5cHQoY29uc3QgdWludDhfdCAqaW4sIHVpbnQ4X3QgKm91dCwgY29uc3QgQUVTX0tFWSAqa2V5KSB7CisgIGNvbnN0IHVpbnQzMl90ICpyazsKKyAgdWludDMyX3QgczAsIHMxLCBzMiwgczMsIHQwLCB0MSwgdDIsIHQzOworI2lmbmRlZiBGVUxMX1VOUk9MTAorICBpbnQgcjsKKyNlbmRpZiAvKiA/RlVMTF9VTlJPTEwgKi8KKworICBhc3NlcnQoaW4gJiYgb3V0ICYmIGtleSk7CisgIHJrID0ga2V5LT5yZF9rZXk7CisKKyAgLyogbWFwIGJ5dGUgYXJyYXkgYmxvY2sgdG8gY2lwaGVyIHN0YXRlCisgICAqIGFuZCBhZGQgaW5pdGlhbCByb3VuZCBrZXk6ICovCisgIHMwID0gR0VUVTMyKGluKSBeIHJrWzBdOworICBzMSA9IEdFVFUzMihpbiArIDQpIF4gcmtbMV07CisgIHMyID0gR0VUVTMyKGluICsgOCkgXiBya1syXTsKKyAgczMgPSBHRVRVMzIoaW4gKyAxMikgXiBya1szXTsKKyNpZmRlZiBGVUxMX1VOUk9MTAorICAvKiByb3VuZCAxOiAqLworICB0MCA9IFRlMFtzMCA+PiAyNF0gXiBUZTFbKHMxID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMiA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICBUZTNbczMgJiAweGZmXSBeIHJrWzRdOworICB0MSA9IFRlMFtzMSA+PiAyNF0gXiBUZTFbKHMyID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMyA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICBUZTNbczAgJiAweGZmXSBeIHJrWzVdOworICB0MiA9IFRlMFtzMiA+PiAyNF0gXiBUZTFbKHMzID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMCA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICBUZTNbczEgJiAweGZmXSBeIHJrWzZdOworICB0MyA9IFRlMFtzMyA+PiAyNF0gXiBUZTFbKHMwID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMSA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICBUZTNbczIgJiAweGZmXSBeIHJrWzddOworICAvKiByb3VuZCAyOiAqLworICBzMCA9IFRlMFt0MCA+PiAyNF0gXiBUZTFbKHQxID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MiA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICBUZTNbdDMgJiAweGZmXSBeIHJrWzhdOworICBzMSA9IFRlMFt0MSA+PiAyNF0gXiBUZTFbKHQyID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MyA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICBUZTNbdDAgJiAweGZmXSBeIHJrWzldOworICBzMiA9IFRlMFt0MiA+PiAyNF0gXiBUZTFbKHQzID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MCA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICBUZTNbdDEgJiAweGZmXSBeIHJrWzEwXTsKKyAgczMgPSBUZTBbdDMgPj4gMjRdIF4gVGUxWyh0MCA+PiAxNikgJiAweGZmXSBeIFRlMlsodDEgPj4gOCkgJiAweGZmXSBeCisgICAgICAgVGUzW3QyICYgMHhmZl0gXiBya1sxMV07CisgIC8qIHJvdW5kIDM6ICovCisgIHQwID0gVGUwW3MwID4+IDI0XSBeIFRlMVsoczEgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMyID4+IDgpICYgMHhmZl0gXgorICAgICAgIFRlM1tzMyAmIDB4ZmZdIF4gcmtbMTJdOworICB0MSA9IFRlMFtzMSA+PiAyNF0gXiBUZTFbKHMyID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMyA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICBUZTNbczAgJiAweGZmXSBeIHJrWzEzXTsKKyAgdDIgPSBUZTBbczIgPj4gMjRdIF4gVGUxWyhzMyA+PiAxNikgJiAweGZmXSBeIFRlMlsoczAgPj4gOCkgJiAweGZmXSBeCisgICAgICAgVGUzW3MxICYgMHhmZl0gXiBya1sxNF07CisgIHQzID0gVGUwW3MzID4+IDI0XSBeIFRlMVsoczAgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMxID4+IDgpICYgMHhmZl0gXgorICAgICAgIFRlM1tzMiAmIDB4ZmZdIF4gcmtbMTVdOworICAvKiByb3VuZCA0OiAqLworICBzMCA9IFRlMFt0MCA+PiAyNF0gXiBUZTFbKHQxID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MiA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICBUZTNbdDMgJiAweGZmXSBeIHJrWzE2XTsKKyAgczEgPSBUZTBbdDEgPj4gMjRdIF4gVGUxWyh0MiA+PiAxNikgJiAweGZmXSBeIFRlMlsodDMgPj4gOCkgJiAweGZmXSBeCisgICAgICAgVGUzW3QwICYgMHhmZl0gXiBya1sxN107CisgIHMyID0gVGUwW3QyID4+IDI0XSBeIFRlMVsodDMgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQwID4+IDgpICYgMHhmZl0gXgorICAgICAgIFRlM1t0MSAmIDB4ZmZdIF4gcmtbMThdOworICBzMyA9IFRlMFt0MyA+PiAyNF0gXiBUZTFbKHQwID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MSA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICBUZTNbdDIgJiAweGZmXSBeIHJrWzE5XTsKKyAgLyogcm91bmQgNTogKi8KKyAgdDAgPSBUZTBbczAgPj4gMjRdIF4gVGUxWyhzMSA+PiAxNikgJiAweGZmXSBeIFRlMlsoczIgPj4gOCkgJiAweGZmXSBeCisgICAgICAgVGUzW3MzICYgMHhmZl0gXiBya1syMF07CisgIHQxID0gVGUwW3MxID4+IDI0XSBeIFRlMVsoczIgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMzID4+IDgpICYgMHhmZl0gXgorICAgICAgIFRlM1tzMCAmIDB4ZmZdIF4gcmtbMjFdOworICB0MiA9IFRlMFtzMiA+PiAyNF0gXiBUZTFbKHMzID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMCA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICBUZTNbczEgJiAweGZmXSBeIHJrWzIyXTsKKyAgdDMgPSBUZTBbczMgPj4gMjRdIF4gVGUxWyhzMCA+PiAxNikgJiAweGZmXSBeIFRlMlsoczEgPj4gOCkgJiAweGZmXSBeCisgICAgICAgVGUzW3MyICYgMHhmZl0gXiBya1syM107CisgIC8qIHJvdW5kIDY6ICovCisgIHMwID0gVGUwW3QwID4+IDI0XSBeIFRlMVsodDEgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQyID4+IDgpICYgMHhmZl0gXgorICAgICAgIFRlM1t0MyAmIDB4ZmZdIF4gcmtbMjRdOworICBzMSA9IFRlMFt0MSA+PiAyNF0gXiBUZTFbKHQyID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MyA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICBUZTNbdDAgJiAweGZmXSBeIHJrWzI1XTsKKyAgczIgPSBUZTBbdDIgPj4gMjRdIF4gVGUxWyh0MyA+PiAxNikgJiAweGZmXSBeIFRlMlsodDAgPj4gOCkgJiAweGZmXSBeCisgICAgICAgVGUzW3QxICYgMHhmZl0gXiBya1syNl07CisgIHMzID0gVGUwW3QzID4+IDI0XSBeIFRlMVsodDAgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQxID4+IDgpICYgMHhmZl0gXgorICAgICAgIFRlM1t0MiAmIDB4ZmZdIF4gcmtbMjddOworICAvKiByb3VuZCA3OiAqLworICB0MCA9IFRlMFtzMCA+PiAyNF0gXiBUZTFbKHMxID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMiA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICBUZTNbczMgJiAweGZmXSBeIHJrWzI4XTsKKyAgdDEgPSBUZTBbczEgPj4gMjRdIF4gVGUxWyhzMiA+PiAxNikgJiAweGZmXSBeIFRlMlsoczMgPj4gOCkgJiAweGZmXSBeCisgICAgICAgVGUzW3MwICYgMHhmZl0gXiBya1syOV07CisgIHQyID0gVGUwW3MyID4+IDI0XSBeIFRlMVsoczMgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMwID4+IDgpICYgMHhmZl0gXgorICAgICAgIFRlM1tzMSAmIDB4ZmZdIF4gcmtbMzBdOworICB0MyA9IFRlMFtzMyA+PiAyNF0gXiBUZTFbKHMwID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMSA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICBUZTNbczIgJiAweGZmXSBeIHJrWzMxXTsKKyAgLyogcm91bmQgODogKi8KKyAgczAgPSBUZTBbdDAgPj4gMjRdIF4gVGUxWyh0MSA+PiAxNikgJiAweGZmXSBeIFRlMlsodDIgPj4gOCkgJiAweGZmXSBeCisgICAgICAgVGUzW3QzICYgMHhmZl0gXiBya1szMl07CisgIHMxID0gVGUwW3QxID4+IDI0XSBeIFRlMVsodDIgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQzID4+IDgpICYgMHhmZl0gXgorICAgICAgIFRlM1t0MCAmIDB4ZmZdIF4gcmtbMzNdOworICBzMiA9IFRlMFt0MiA+PiAyNF0gXiBUZTFbKHQzID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MCA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICBUZTNbdDEgJiAweGZmXSBeIHJrWzM0XTsKKyAgczMgPSBUZTBbdDMgPj4gMjRdIF4gVGUxWyh0MCA+PiAxNikgJiAweGZmXSBeIFRlMlsodDEgPj4gOCkgJiAweGZmXSBeCisgICAgICAgVGUzW3QyICYgMHhmZl0gXiBya1szNV07CisgIC8qIHJvdW5kIDk6ICovCisgIHQwID0gVGUwW3MwID4+IDI0XSBeIFRlMVsoczEgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMyID4+IDgpICYgMHhmZl0gXgorICAgICAgIFRlM1tzMyAmIDB4ZmZdIF4gcmtbMzZdOworICB0MSA9IFRlMFtzMSA+PiAyNF0gXiBUZTFbKHMyID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMyA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICBUZTNbczAgJiAweGZmXSBeIHJrWzM3XTsKKyAgdDIgPSBUZTBbczIgPj4gMjRdIF4gVGUxWyhzMyA+PiAxNikgJiAweGZmXSBeIFRlMlsoczAgPj4gOCkgJiAweGZmXSBeCisgICAgICAgVGUzW3MxICYgMHhmZl0gXiBya1szOF07CisgIHQzID0gVGUwW3MzID4+IDI0XSBeIFRlMVsoczAgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMxID4+IDgpICYgMHhmZl0gXgorICAgICAgIFRlM1tzMiAmIDB4ZmZdIF4gcmtbMzldOworICBpZiAoa2V5LT5yb3VuZHMgPiAxMCkgeworICAgIC8qIHJvdW5kIDEwOiAqLworICAgIHMwID0gVGUwW3QwID4+IDI0XSBeIFRlMVsodDEgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQyID4+IDgpICYgMHhmZl0gXgorICAgICAgICAgVGUzW3QzICYgMHhmZl0gXiBya1s0MF07CisgICAgczEgPSBUZTBbdDEgPj4gMjRdIF4gVGUxWyh0MiA+PiAxNikgJiAweGZmXSBeIFRlMlsodDMgPj4gOCkgJiAweGZmXSBeCisgICAgICAgICBUZTNbdDAgJiAweGZmXSBeIHJrWzQxXTsKKyAgICBzMiA9IFRlMFt0MiA+PiAyNF0gXiBUZTFbKHQzID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MCA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICAgIFRlM1t0MSAmIDB4ZmZdIF4gcmtbNDJdOworICAgIHMzID0gVGUwW3QzID4+IDI0XSBeIFRlMVsodDAgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQxID4+IDgpICYgMHhmZl0gXgorICAgICAgICAgVGUzW3QyICYgMHhmZl0gXiBya1s0M107CisgICAgLyogcm91bmQgMTE6ICovCisgICAgdDAgPSBUZTBbczAgPj4gMjRdIF4gVGUxWyhzMSA+PiAxNikgJiAweGZmXSBeIFRlMlsoczIgPj4gOCkgJiAweGZmXSBeCisgICAgICAgICBUZTNbczMgJiAweGZmXSBeIHJrWzQ0XTsKKyAgICB0MSA9IFRlMFtzMSA+PiAyNF0gXiBUZTFbKHMyID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMyA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICAgIFRlM1tzMCAmIDB4ZmZdIF4gcmtbNDVdOworICAgIHQyID0gVGUwW3MyID4+IDI0XSBeIFRlMVsoczMgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMwID4+IDgpICYgMHhmZl0gXgorICAgICAgICAgVGUzW3MxICYgMHhmZl0gXiBya1s0Nl07CisgICAgdDMgPSBUZTBbczMgPj4gMjRdIF4gVGUxWyhzMCA+PiAxNikgJiAweGZmXSBeIFRlMlsoczEgPj4gOCkgJiAweGZmXSBeCisgICAgICAgICBUZTNbczIgJiAweGZmXSBeIHJrWzQ3XTsKKyAgICBpZiAoa2V5LT5yb3VuZHMgPiAxMikgeworICAgICAgLyogcm91bmQgMTI6ICovCisgICAgICBzMCA9IFRlMFt0MCA+PiAyNF0gXiBUZTFbKHQxID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MiA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICAgICAgVGUzW3QzICYgMHhmZl0gXiBya1s0OF07CisgICAgICBzMSA9IFRlMFt0MSA+PiAyNF0gXiBUZTFbKHQyID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MyA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICAgICAgVGUzW3QwICYgMHhmZl0gXiBya1s0OV07CisgICAgICBzMiA9IFRlMFt0MiA+PiAyNF0gXiBUZTFbKHQzID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MCA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICAgICAgVGUzW3QxICYgMHhmZl0gXiBya1s1MF07CisgICAgICBzMyA9IFRlMFt0MyA+PiAyNF0gXiBUZTFbKHQwID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MSA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICAgICAgVGUzW3QyICYgMHhmZl0gXiBya1s1MV07CisgICAgICAvKiByb3VuZCAxMzogKi8KKyAgICAgIHQwID0gVGUwW3MwID4+IDI0XSBeIFRlMVsoczEgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMyID4+IDgpICYgMHhmZl0gXgorICAgICAgICAgICBUZTNbczMgJiAweGZmXSBeIHJrWzUyXTsKKyAgICAgIHQxID0gVGUwW3MxID4+IDI0XSBeIFRlMVsoczIgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMzID4+IDgpICYgMHhmZl0gXgorICAgICAgICAgICBUZTNbczAgJiAweGZmXSBeIHJrWzUzXTsKKyAgICAgIHQyID0gVGUwW3MyID4+IDI0XSBeIFRlMVsoczMgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMwID4+IDgpICYgMHhmZl0gXgorICAgICAgICAgICBUZTNbczEgJiAweGZmXSBeIHJrWzU0XTsKKyAgICAgIHQzID0gVGUwW3MzID4+IDI0XSBeIFRlMVsoczAgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMxID4+IDgpICYgMHhmZl0gXgorICAgICAgICAgICBUZTNbczIgJiAweGZmXSBeIHJrWzU1XTsKKyAgICB9CisgIH0KKyAgcmsgKz0ga2V5LT5yb3VuZHMgPDwgMjsKKyNlbHNlICAvKiAhRlVMTF9VTlJPTEwgKi8KKyAgLyoKKyAgICogTnIgLSAxIGZ1bGwgcm91bmRzOgorICAgKi8KKyAgciA9IGtleS0+cm91bmRzID4+IDE7CisgIGZvciAoOzspIHsKKyAgICB0MCA9IFRlMFsoczAgPj4gMjQpXSBeIFRlMVsoczEgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMyID4+IDgpICYgMHhmZl0gXgorICAgICAgICAgVGUzWyhzMykgJiAweGZmXSBeIHJrWzRdOworICAgIHQxID0gVGUwWyhzMSA+PiAyNCldIF4gVGUxWyhzMiA+PiAxNikgJiAweGZmXSBeIFRlMlsoczMgPj4gOCkgJiAweGZmXSBeCisgICAgICAgICBUZTNbKHMwKSAmIDB4ZmZdIF4gcmtbNV07CisgICAgdDIgPSBUZTBbKHMyID4+IDI0KV0gXiBUZTFbKHMzID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMCA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICAgIFRlM1soczEpICYgMHhmZl0gXiBya1s2XTsKKyAgICB0MyA9IFRlMFsoczMgPj4gMjQpXSBeIFRlMVsoczAgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMxID4+IDgpICYgMHhmZl0gXgorICAgICAgICAgVGUzWyhzMikgJiAweGZmXSBeIHJrWzddOworCisgICAgcmsgKz0gODsKKyAgICBpZiAoLS1yID09IDApIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIHMwID0gVGUwWyh0MCA+PiAyNCldIF4gVGUxWyh0MSA+PiAxNikgJiAweGZmXSBeIFRlMlsodDIgPj4gOCkgJiAweGZmXSBeCisgICAgICAgICBUZTNbKHQzKSAmIDB4ZmZdIF4gcmtbMF07CisgICAgczEgPSBUZTBbKHQxID4+IDI0KV0gXiBUZTFbKHQyID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MyA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICAgIFRlM1sodDApICYgMHhmZl0gXiBya1sxXTsKKyAgICBzMiA9IFRlMFsodDIgPj4gMjQpXSBeIFRlMVsodDMgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQwID4+IDgpICYgMHhmZl0gXgorICAgICAgICAgVGUzWyh0MSkgJiAweGZmXSBeIHJrWzJdOworICAgIHMzID0gVGUwWyh0MyA+PiAyNCldIF4gVGUxWyh0MCA+PiAxNikgJiAweGZmXSBeIFRlMlsodDEgPj4gOCkgJiAweGZmXSBeCisgICAgICAgICBUZTNbKHQyKSAmIDB4ZmZdIF4gcmtbM107CisgIH0KKyNlbmRpZiAvKiA/RlVMTF9VTlJPTEwgKi8KKyAgLyogIGFwcGx5IGxhc3Qgcm91bmQgYW5kIG1hcCBjaXBoZXIgc3RhdGUgdG8gYnl0ZSBhcnJheSBibG9jazogKi8KKyAgczAgPSAoVGUyWyh0MCA+PiAyNCldICYgMHhmZjAwMDAwMCkgXiAoVGUzWyh0MSA+PiAxNikgJiAweGZmXSAmIDB4MDBmZjAwMDApIF4KKyAgICAgICAoVGUwWyh0MiA+PiA4KSAmIDB4ZmZdICYgMHgwMDAwZmYwMCkgXiAoVGUxWyh0MykgJiAweGZmXSAmIDB4MDAwMDAwZmYpIF4KKyAgICAgICBya1swXTsKKyAgUFVUVTMyKG91dCwgczApOworICBzMSA9IChUZTJbKHQxID4+IDI0KV0gJiAweGZmMDAwMDAwKSBeIChUZTNbKHQyID4+IDE2KSAmIDB4ZmZdICYgMHgwMGZmMDAwMCkgXgorICAgICAgIChUZTBbKHQzID4+IDgpICYgMHhmZl0gJiAweDAwMDBmZjAwKSBeIChUZTFbKHQwKSAmIDB4ZmZdICYgMHgwMDAwMDBmZikgXgorICAgICAgIHJrWzFdOworICBQVVRVMzIob3V0ICsgNCwgczEpOworICBzMiA9IChUZTJbKHQyID4+IDI0KV0gJiAweGZmMDAwMDAwKSBeIChUZTNbKHQzID4+IDE2KSAmIDB4ZmZdICYgMHgwMGZmMDAwMCkgXgorICAgICAgIChUZTBbKHQwID4+IDgpICYgMHhmZl0gJiAweDAwMDBmZjAwKSBeIChUZTFbKHQxKSAmIDB4ZmZdICYgMHgwMDAwMDBmZikgXgorICAgICAgIHJrWzJdOworICBQVVRVMzIob3V0ICsgOCwgczIpOworICBzMyA9IChUZTJbKHQzID4+IDI0KV0gJiAweGZmMDAwMDAwKSBeIChUZTNbKHQwID4+IDE2KSAmIDB4ZmZdICYgMHgwMGZmMDAwMCkgXgorICAgICAgIChUZTBbKHQxID4+IDgpICYgMHhmZl0gJiAweDAwMDBmZjAwKSBeIChUZTFbKHQyKSAmIDB4ZmZdICYgMHgwMDAwMDBmZikgXgorICAgICAgIHJrWzNdOworICBQVVRVMzIob3V0ICsgMTIsIHMzKTsKK30KKwordm9pZCBBRVNfZGVjcnlwdChjb25zdCB1aW50OF90ICppbiwgdWludDhfdCAqb3V0LCBjb25zdCBBRVNfS0VZICprZXkpIHsKKyAgY29uc3QgdWludDMyX3QgKnJrOworICB1aW50MzJfdCBzMCwgczEsIHMyLCBzMywgdDAsIHQxLCB0MiwgdDM7CisjaWZuZGVmIEZVTExfVU5ST0xMCisgIGludCByOworI2VuZGlmIC8qID9GVUxMX1VOUk9MTCAqLworCisgIGFzc2VydChpbiAmJiBvdXQgJiYga2V5KTsKKyAgcmsgPSBrZXktPnJkX2tleTsKKworICAvKiBtYXAgYnl0ZSBhcnJheSBibG9jayB0byBjaXBoZXIgc3RhdGUKKyAgICogYW5kIGFkZCBpbml0aWFsIHJvdW5kIGtleTogKi8KKyAgczAgPSBHRVRVMzIoaW4pIF4gcmtbMF07CisgIHMxID0gR0VUVTMyKGluICsgNCkgXiBya1sxXTsKKyAgczIgPSBHRVRVMzIoaW4gKyA4KSBeIHJrWzJdOworICBzMyA9IEdFVFUzMihpbiArIDEyKSBeIHJrWzNdOworI2lmZGVmIEZVTExfVU5ST0xMCisgIC8qIHJvdW5kIDE6ICovCisgIHQwID0gVGQwW3MwID4+IDI0XSBeIFRkMVsoczMgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMyID4+IDgpICYgMHhmZl0gXgorICAgICAgIFRkM1tzMSAmIDB4ZmZdIF4gcmtbNF07CisgIHQxID0gVGQwW3MxID4+IDI0XSBeIFRkMVsoczAgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMzID4+IDgpICYgMHhmZl0gXgorICAgICAgIFRkM1tzMiAmIDB4ZmZdIF4gcmtbNV07CisgIHQyID0gVGQwW3MyID4+IDI0XSBeIFRkMVsoczEgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMwID4+IDgpICYgMHhmZl0gXgorICAgICAgIFRkM1tzMyAmIDB4ZmZdIF4gcmtbNl07CisgIHQzID0gVGQwW3MzID4+IDI0XSBeIFRkMVsoczIgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMxID4+IDgpICYgMHhmZl0gXgorICAgICAgIFRkM1tzMCAmIDB4ZmZdIF4gcmtbN107CisgIC8qIHJvdW5kIDI6ICovCisgIHMwID0gVGQwW3QwID4+IDI0XSBeIFRkMVsodDMgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQyID4+IDgpICYgMHhmZl0gXgorICAgICAgIFRkM1t0MSAmIDB4ZmZdIF4gcmtbOF07CisgIHMxID0gVGQwW3QxID4+IDI0XSBeIFRkMVsodDAgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQzID4+IDgpICYgMHhmZl0gXgorICAgICAgIFRkM1t0MiAmIDB4ZmZdIF4gcmtbOV07CisgIHMyID0gVGQwW3QyID4+IDI0XSBeIFRkMVsodDEgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQwID4+IDgpICYgMHhmZl0gXgorICAgICAgIFRkM1t0MyAmIDB4ZmZdIF4gcmtbMTBdOworICBzMyA9IFRkMFt0MyA+PiAyNF0gXiBUZDFbKHQyID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyh0MSA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICBUZDNbdDAgJiAweGZmXSBeIHJrWzExXTsKKyAgLyogcm91bmQgMzogKi8KKyAgdDAgPSBUZDBbczAgPj4gMjRdIF4gVGQxWyhzMyA+PiAxNikgJiAweGZmXSBeIFRkMlsoczIgPj4gOCkgJiAweGZmXSBeCisgICAgICAgVGQzW3MxICYgMHhmZl0gXiBya1sxMl07CisgIHQxID0gVGQwW3MxID4+IDI0XSBeIFRkMVsoczAgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMzID4+IDgpICYgMHhmZl0gXgorICAgICAgIFRkM1tzMiAmIDB4ZmZdIF4gcmtbMTNdOworICB0MiA9IFRkMFtzMiA+PiAyNF0gXiBUZDFbKHMxID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMCA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICBUZDNbczMgJiAweGZmXSBeIHJrWzE0XTsKKyAgdDMgPSBUZDBbczMgPj4gMjRdIF4gVGQxWyhzMiA+PiAxNikgJiAweGZmXSBeIFRkMlsoczEgPj4gOCkgJiAweGZmXSBeCisgICAgICAgVGQzW3MwICYgMHhmZl0gXiBya1sxNV07CisgIC8qIHJvdW5kIDQ6ICovCisgIHMwID0gVGQwW3QwID4+IDI0XSBeIFRkMVsodDMgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQyID4+IDgpICYgMHhmZl0gXgorICAgICAgIFRkM1t0MSAmIDB4ZmZdIF4gcmtbMTZdOworICBzMSA9IFRkMFt0MSA+PiAyNF0gXiBUZDFbKHQwID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyh0MyA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICBUZDNbdDIgJiAweGZmXSBeIHJrWzE3XTsKKyAgczIgPSBUZDBbdDIgPj4gMjRdIF4gVGQxWyh0MSA+PiAxNikgJiAweGZmXSBeIFRkMlsodDAgPj4gOCkgJiAweGZmXSBeCisgICAgICAgVGQzW3QzICYgMHhmZl0gXiBya1sxOF07CisgIHMzID0gVGQwW3QzID4+IDI0XSBeIFRkMVsodDIgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQxID4+IDgpICYgMHhmZl0gXgorICAgICAgIFRkM1t0MCAmIDB4ZmZdIF4gcmtbMTldOworICAvKiByb3VuZCA1OiAqLworICB0MCA9IFRkMFtzMCA+PiAyNF0gXiBUZDFbKHMzID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMiA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICBUZDNbczEgJiAweGZmXSBeIHJrWzIwXTsKKyAgdDEgPSBUZDBbczEgPj4gMjRdIF4gVGQxWyhzMCA+PiAxNikgJiAweGZmXSBeIFRkMlsoczMgPj4gOCkgJiAweGZmXSBeCisgICAgICAgVGQzW3MyICYgMHhmZl0gXiBya1syMV07CisgIHQyID0gVGQwW3MyID4+IDI0XSBeIFRkMVsoczEgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMwID4+IDgpICYgMHhmZl0gXgorICAgICAgIFRkM1tzMyAmIDB4ZmZdIF4gcmtbMjJdOworICB0MyA9IFRkMFtzMyA+PiAyNF0gXiBUZDFbKHMyID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMSA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICBUZDNbczAgJiAweGZmXSBeIHJrWzIzXTsKKyAgLyogcm91bmQgNjogKi8KKyAgczAgPSBUZDBbdDAgPj4gMjRdIF4gVGQxWyh0MyA+PiAxNikgJiAweGZmXSBeIFRkMlsodDIgPj4gOCkgJiAweGZmXSBeCisgICAgICAgVGQzW3QxICYgMHhmZl0gXiBya1syNF07CisgIHMxID0gVGQwW3QxID4+IDI0XSBeIFRkMVsodDAgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQzID4+IDgpICYgMHhmZl0gXgorICAgICAgIFRkM1t0MiAmIDB4ZmZdIF4gcmtbMjVdOworICBzMiA9IFRkMFt0MiA+PiAyNF0gXiBUZDFbKHQxID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyh0MCA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICBUZDNbdDMgJiAweGZmXSBeIHJrWzI2XTsKKyAgczMgPSBUZDBbdDMgPj4gMjRdIF4gVGQxWyh0MiA+PiAxNikgJiAweGZmXSBeIFRkMlsodDEgPj4gOCkgJiAweGZmXSBeCisgICAgICAgVGQzW3QwICYgMHhmZl0gXiBya1syN107CisgIC8qIHJvdW5kIDc6ICovCisgIHQwID0gVGQwW3MwID4+IDI0XSBeIFRkMVsoczMgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMyID4+IDgpICYgMHhmZl0gXgorICAgICAgIFRkM1tzMSAmIDB4ZmZdIF4gcmtbMjhdOworICB0MSA9IFRkMFtzMSA+PiAyNF0gXiBUZDFbKHMwID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMyA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICBUZDNbczIgJiAweGZmXSBeIHJrWzI5XTsKKyAgdDIgPSBUZDBbczIgPj4gMjRdIF4gVGQxWyhzMSA+PiAxNikgJiAweGZmXSBeIFRkMlsoczAgPj4gOCkgJiAweGZmXSBeCisgICAgICAgVGQzW3MzICYgMHhmZl0gXiBya1szMF07CisgIHQzID0gVGQwW3MzID4+IDI0XSBeIFRkMVsoczIgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMxID4+IDgpICYgMHhmZl0gXgorICAgICAgIFRkM1tzMCAmIDB4ZmZdIF4gcmtbMzFdOworICAvKiByb3VuZCA4OiAqLworICBzMCA9IFRkMFt0MCA+PiAyNF0gXiBUZDFbKHQzID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyh0MiA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICBUZDNbdDEgJiAweGZmXSBeIHJrWzMyXTsKKyAgczEgPSBUZDBbdDEgPj4gMjRdIF4gVGQxWyh0MCA+PiAxNikgJiAweGZmXSBeIFRkMlsodDMgPj4gOCkgJiAweGZmXSBeCisgICAgICAgVGQzW3QyICYgMHhmZl0gXiBya1szM107CisgIHMyID0gVGQwW3QyID4+IDI0XSBeIFRkMVsodDEgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQwID4+IDgpICYgMHhmZl0gXgorICAgICAgIFRkM1t0MyAmIDB4ZmZdIF4gcmtbMzRdOworICBzMyA9IFRkMFt0MyA+PiAyNF0gXiBUZDFbKHQyID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyh0MSA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICBUZDNbdDAgJiAweGZmXSBeIHJrWzM1XTsKKyAgLyogcm91bmQgOTogKi8KKyAgdDAgPSBUZDBbczAgPj4gMjRdIF4gVGQxWyhzMyA+PiAxNikgJiAweGZmXSBeIFRkMlsoczIgPj4gOCkgJiAweGZmXSBeCisgICAgICAgVGQzW3MxICYgMHhmZl0gXiBya1szNl07CisgIHQxID0gVGQwW3MxID4+IDI0XSBeIFRkMVsoczAgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMzID4+IDgpICYgMHhmZl0gXgorICAgICAgIFRkM1tzMiAmIDB4ZmZdIF4gcmtbMzddOworICB0MiA9IFRkMFtzMiA+PiAyNF0gXiBUZDFbKHMxID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMCA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICBUZDNbczMgJiAweGZmXSBeIHJrWzM4XTsKKyAgdDMgPSBUZDBbczMgPj4gMjRdIF4gVGQxWyhzMiA+PiAxNikgJiAweGZmXSBeIFRkMlsoczEgPj4gOCkgJiAweGZmXSBeCisgICAgICAgVGQzW3MwICYgMHhmZl0gXiBya1szOV07CisgIGlmIChrZXktPnJvdW5kcyA+IDEwKSB7CisgICAgLyogcm91bmQgMTA6ICovCisgICAgczAgPSBUZDBbdDAgPj4gMjRdIF4gVGQxWyh0MyA+PiAxNikgJiAweGZmXSBeIFRkMlsodDIgPj4gOCkgJiAweGZmXSBeCisgICAgICAgICBUZDNbdDEgJiAweGZmXSBeIHJrWzQwXTsKKyAgICBzMSA9IFRkMFt0MSA+PiAyNF0gXiBUZDFbKHQwID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyh0MyA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICAgIFRkM1t0MiAmIDB4ZmZdIF4gcmtbNDFdOworICAgIHMyID0gVGQwW3QyID4+IDI0XSBeIFRkMVsodDEgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQwID4+IDgpICYgMHhmZl0gXgorICAgICAgICAgVGQzW3QzICYgMHhmZl0gXiBya1s0Ml07CisgICAgczMgPSBUZDBbdDMgPj4gMjRdIF4gVGQxWyh0MiA+PiAxNikgJiAweGZmXSBeIFRkMlsodDEgPj4gOCkgJiAweGZmXSBeCisgICAgICAgICBUZDNbdDAgJiAweGZmXSBeIHJrWzQzXTsKKyAgICAvKiByb3VuZCAxMTogKi8KKyAgICB0MCA9IFRkMFtzMCA+PiAyNF0gXiBUZDFbKHMzID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMiA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICAgIFRkM1tzMSAmIDB4ZmZdIF4gcmtbNDRdOworICAgIHQxID0gVGQwW3MxID4+IDI0XSBeIFRkMVsoczAgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMzID4+IDgpICYgMHhmZl0gXgorICAgICAgICAgVGQzW3MyICYgMHhmZl0gXiBya1s0NV07CisgICAgdDIgPSBUZDBbczIgPj4gMjRdIF4gVGQxWyhzMSA+PiAxNikgJiAweGZmXSBeIFRkMlsoczAgPj4gOCkgJiAweGZmXSBeCisgICAgICAgICBUZDNbczMgJiAweGZmXSBeIHJrWzQ2XTsKKyAgICB0MyA9IFRkMFtzMyA+PiAyNF0gXiBUZDFbKHMyID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMSA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICAgIFRkM1tzMCAmIDB4ZmZdIF4gcmtbNDddOworICAgIGlmIChrZXktPnJvdW5kcyA+IDEyKSB7CisgICAgICAvKiByb3VuZCAxMjogKi8KKyAgICAgIHMwID0gVGQwW3QwID4+IDI0XSBeIFRkMVsodDMgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQyID4+IDgpICYgMHhmZl0gXgorICAgICAgICAgICBUZDNbdDEgJiAweGZmXSBeIHJrWzQ4XTsKKyAgICAgIHMxID0gVGQwW3QxID4+IDI0XSBeIFRkMVsodDAgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQzID4+IDgpICYgMHhmZl0gXgorICAgICAgICAgICBUZDNbdDIgJiAweGZmXSBeIHJrWzQ5XTsKKyAgICAgIHMyID0gVGQwW3QyID4+IDI0XSBeIFRkMVsodDEgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQwID4+IDgpICYgMHhmZl0gXgorICAgICAgICAgICBUZDNbdDMgJiAweGZmXSBeIHJrWzUwXTsKKyAgICAgIHMzID0gVGQwW3QzID4+IDI0XSBeIFRkMVsodDIgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQxID4+IDgpICYgMHhmZl0gXgorICAgICAgICAgICBUZDNbdDAgJiAweGZmXSBeIHJrWzUxXTsKKyAgICAgIC8qIHJvdW5kIDEzOiAqLworICAgICAgdDAgPSBUZDBbczAgPj4gMjRdIF4gVGQxWyhzMyA+PiAxNikgJiAweGZmXSBeIFRkMlsoczIgPj4gOCkgJiAweGZmXSBeCisgICAgICAgICAgIFRkM1tzMSAmIDB4ZmZdIF4gcmtbNTJdOworICAgICAgdDEgPSBUZDBbczEgPj4gMjRdIF4gVGQxWyhzMCA+PiAxNikgJiAweGZmXSBeIFRkMlsoczMgPj4gOCkgJiAweGZmXSBeCisgICAgICAgICAgIFRkM1tzMiAmIDB4ZmZdIF4gcmtbNTNdOworICAgICAgdDIgPSBUZDBbczIgPj4gMjRdIF4gVGQxWyhzMSA+PiAxNikgJiAweGZmXSBeIFRkMlsoczAgPj4gOCkgJiAweGZmXSBeCisgICAgICAgICAgIFRkM1tzMyAmIDB4ZmZdIF4gcmtbNTRdOworICAgICAgdDMgPSBUZDBbczMgPj4gMjRdIF4gVGQxWyhzMiA+PiAxNikgJiAweGZmXSBeIFRkMlsoczEgPj4gOCkgJiAweGZmXSBeCisgICAgICAgICAgIFRkM1tzMCAmIDB4ZmZdIF4gcmtbNTVdOworICAgIH0KKyAgfQorICByayArPSBrZXktPnJvdW5kcyA8PCAyOworI2Vsc2UgIC8qICFGVUxMX1VOUk9MTCAqLworICAvKgorICAgKiBOciAtIDEgZnVsbCByb3VuZHM6CisgICAqLworICByID0ga2V5LT5yb3VuZHMgPj4gMTsKKyAgZm9yICg7OykgeworICAgIHQwID0gVGQwWyhzMCA+PiAyNCldIF4gVGQxWyhzMyA+PiAxNikgJiAweGZmXSBeIFRkMlsoczIgPj4gOCkgJiAweGZmXSBeCisgICAgICAgICBUZDNbKHMxKSAmIDB4ZmZdIF4gcmtbNF07CisgICAgdDEgPSBUZDBbKHMxID4+IDI0KV0gXiBUZDFbKHMwID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMyA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICAgIFRkM1soczIpICYgMHhmZl0gXiBya1s1XTsKKyAgICB0MiA9IFRkMFsoczIgPj4gMjQpXSBeIFRkMVsoczEgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMwID4+IDgpICYgMHhmZl0gXgorICAgICAgICAgVGQzWyhzMykgJiAweGZmXSBeIHJrWzZdOworICAgIHQzID0gVGQwWyhzMyA+PiAyNCldIF4gVGQxWyhzMiA+PiAxNikgJiAweGZmXSBeIFRkMlsoczEgPj4gOCkgJiAweGZmXSBeCisgICAgICAgICBUZDNbKHMwKSAmIDB4ZmZdIF4gcmtbN107CisKKyAgICByayArPSA4OworICAgIGlmICgtLXIgPT0gMCkgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgczAgPSBUZDBbKHQwID4+IDI0KV0gXiBUZDFbKHQzID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyh0MiA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICAgIFRkM1sodDEpICYgMHhmZl0gXiBya1swXTsKKyAgICBzMSA9IFRkMFsodDEgPj4gMjQpXSBeIFRkMVsodDAgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQzID4+IDgpICYgMHhmZl0gXgorICAgICAgICAgVGQzWyh0MikgJiAweGZmXSBeIHJrWzFdOworICAgIHMyID0gVGQwWyh0MiA+PiAyNCldIF4gVGQxWyh0MSA+PiAxNikgJiAweGZmXSBeIFRkMlsodDAgPj4gOCkgJiAweGZmXSBeCisgICAgICAgICBUZDNbKHQzKSAmIDB4ZmZdIF4gcmtbMl07CisgICAgczMgPSBUZDBbKHQzID4+IDI0KV0gXiBUZDFbKHQyID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyh0MSA+PiA4KSAmIDB4ZmZdIF4KKyAgICAgICAgIFRkM1sodDApICYgMHhmZl0gXiBya1szXTsKKyAgfQorI2VuZGlmIC8qID9GVUxMX1VOUk9MTCAqLworICAvKiBhcHBseSBsYXN0IHJvdW5kIGFuZAorICAgKiBtYXAgY2lwaGVyIHN0YXRlIHRvIGJ5dGUgYXJyYXkgYmxvY2s6ICovCisgIHMwID0gKFRkNFsodDAgPj4gMjQpXSA8PCAyNCkgXiAoVGQ0Wyh0MyA+PiAxNikgJiAweGZmXSA8PCAxNikgXgorICAgICAgIChUZDRbKHQyID4+IDgpICYgMHhmZl0gPDwgOCkgXiAoVGQ0Wyh0MSkgJiAweGZmXSkgXiBya1swXTsKKyAgUFVUVTMyKG91dCwgczApOworICBzMSA9IChUZDRbKHQxID4+IDI0KV0gPDwgMjQpIF4gKFRkNFsodDAgPj4gMTYpICYgMHhmZl0gPDwgMTYpIF4KKyAgICAgICAoVGQ0Wyh0MyA+PiA4KSAmIDB4ZmZdIDw8IDgpIF4gKFRkNFsodDIpICYgMHhmZl0pIF4gcmtbMV07CisgIFBVVFUzMihvdXQgKyA0LCBzMSk7CisgIHMyID0gKFRkNFsodDIgPj4gMjQpXSA8PCAyNCkgXiAoVGQ0Wyh0MSA+PiAxNikgJiAweGZmXSA8PCAxNikgXgorICAgICAgIChUZDRbKHQwID4+IDgpICYgMHhmZl0gPDwgOCkgXiAoVGQ0Wyh0MykgJiAweGZmXSkgXiBya1syXTsKKyAgUFVUVTMyKG91dCArIDgsIHMyKTsKKyAgczMgPSAoVGQ0Wyh0MyA+PiAyNCldIDw8IDI0KSBeIChUZDRbKHQyID4+IDE2KSAmIDB4ZmZdIDw8IDE2KSBeCisgICAgICAgKFRkNFsodDEgPj4gOCkgJiAweGZmXSA8PCA4KSBeIChUZDRbKHQwKSAmIDB4ZmZdKSBeIHJrWzNdOworICBQVVRVMzIob3V0ICsgMTIsIHMzKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9jcnlwdG8vYWVzL2Flcy5oIGIvY3J5cHRvL2Flcy9hZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTU2OTY0Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2Flcy9hZXMuaApAQCAtMCwwICsxLDEzOCBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisjaWZuZGVmIE9QRU5TU0xfSEVBREVSX0FFU19ICisjZGVmaW5lIE9QRU5TU0xfSEVBREVSX0FFU19ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jhc2UuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIFJhdyBBRVMgZnVuY3Rpb25zLiAqLworCisKKyNkZWZpbmUgQUVTX0VOQ1JZUFQgMQorI2RlZmluZSBBRVNfREVDUllQVCAwCisKKy8qIEFFU19NQVhOUiBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgQUVTIHJvdW5kcy4gKi8KKyNkZWZpbmUgQUVTX01BWE5SIDE0CisKKyNkZWZpbmUgQUVTX0JMT0NLX1NJWkUgMTYKKworLyogYWVzX2tleV9zdCBzaG91bGQgYmUgYW4gb3BhcXVlIHR5cGUsIGJ1dCBFVlAgcmVxdWlyZXMgdGhhdCB0aGUgc2l6ZSBiZQorICoga25vd24uICovCitzdHJ1Y3QgYWVzX2tleV9zdCB7CisgIHVpbnQzMl90IHJkX2tleVs0ICogKEFFU19NQVhOUiArIDEpXTsKKyAgdW5zaWduZWQgcm91bmRzOworfTsKK3R5cGVkZWYgc3RydWN0IGFlc19rZXlfc3QgQUVTX0tFWTsKKworLyogQUVTX3NldF9lbmNyeXB0X2tleSBjb25maWd1cmVzIHxhZXNrZXl8IHRvIGVuY3J5cHQgd2l0aCB0aGUgfGJpdHN8LWJpdCBrZXksCisgKiB8a2V5fC4KKyAqCisgKiBXQVJOSU5HOiB1bmxpa2Ugb3RoZXIgT3BlblNTTCBmdW5jdGlvbnMsIHRoaXMgcmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MgYW5kIGEKKyAqIG5lZ2F0aXZlIG51bWJlciBvbiBlcnJvci4gKi8KK2ludCBBRVNfc2V0X2VuY3J5cHRfa2V5KGNvbnN0IHVpbnQ4X3QgKmtleSwgdW5zaWduZWQgYml0cywgQUVTX0tFWSAqYWVza2V5KTsKKworLyogQUVTX3NldF9kZWNyeXB0X2tleSBjb25maWd1cmVzIHxhZXNrZXl8IHRvIGRlY3J5cHQgd2l0aCB0aGUgfGJpdHN8LWJpdCBrZXksCisgKiB8a2V5fC4KKyAqCisgKiBXQVJOSU5HOiB1bmxpa2Ugb3RoZXIgT3BlblNTTCBmdW5jdGlvbnMsIHRoaXMgcmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MgYW5kIGEKKyAqIG5lZ2F0aXZlIG51bWJlciBvbiBlcnJvci4gKi8KK2ludCBBRVNfc2V0X2RlY3J5cHRfa2V5KGNvbnN0IHVpbnQ4X3QgKmtleSwgdW5zaWduZWQgYml0cywgQUVTX0tFWSAqYWVza2V5KTsKKworLyogQUVTX2VuY3J5cHQgZW5jcnlwdHMgYSBzaW5nbGUgYmxvY2sgZnJvbSB8aW58IHRvIHxvdXR8IHdpdGggfGtleXwuIFRoZSB8aW58CisgKiBhbmQgfG91dHwgcG9pbnRlcnMgbWF5IG92ZXJsYXAuICovCit2b2lkIEFFU19lbmNyeXB0KGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50OF90ICpvdXQsIGNvbnN0IEFFU19LRVkgKmtleSk7CisKKy8qIEFFU19kZWNyeXB0IGRlY3J5cHRzIGEgc2luZ2xlIGJsb2NrIGZyb20gfGlufCB0byB8b3V0fCB3aXRoIHxrZXl8LiBUaGUgfGlufAorICogYW5kIHxvdXR8IHBvaW50ZXJzIG1heSBvdmVybGFwLiAqLwordm9pZCBBRVNfZGVjcnlwdChjb25zdCB1aW50OF90ICppbiwgdWludDhfdCAqb3V0LCBjb25zdCBBRVNfS0VZICprZXkpOworCisKKy8qIEJsb2NrIGNpcGhlciBtb2Rlcy4gKi8KKworLyogQUVTX2N0cjEyOF9lbmNyeXB0IGVuY3J5cHRzIChvciBkZWNyeXB0cywgaXQncyB0aGUgc2FtZSBpbiBDVFIgbW9kZSkgfGxlbnwKKyAqIGJ5dGVzIGZyb20gfGlufCB0byB8b3V0fC4gVGhlIHxudW18IHBhcmFtZXRlciBtdXN0IGJlIHNldCB0byB6ZXJvIG9uIHRoZQorICogZmlyc3QgY2FsbCBhbmQgfGl2ZWN8IHdpbGwgYmUgaW5jcmVtZW50ZWQuICovCit2b2lkIEFFU19jdHIxMjhfZW5jcnlwdChjb25zdCB1aW50OF90ICppbiwgdWludDhfdCAqb3V0LCBzaXplX3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUVTX0tFWSAqa2V5LCB1aW50OF90IGl2ZWNbQUVTX0JMT0NLX1NJWkVdLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBlY291bnRfYnVmW0FFU19CTE9DS19TSVpFXSwgdW5zaWduZWQgaW50ICpudW0pOworCisvKiBBRVNfZWNiX2VuY3J5cHQgZW5jcnlwdHMgKG9yIGRlY3J5cHRzLCBpZiB8ZW5jfCA9PSB8QUVTX0RFQ1JZUFR8KSBhIHNpbmdsZSwKKyAqIDE2IGJ5dGUgYmxvY2sgZnJvbSB8aW58IHRvIHxvdXR8LiAqLwordm9pZCBBRVNfZWNiX2VuY3J5cHQoY29uc3QgdWludDhfdCAqaW4sIHVpbnQ4X3QgKm91dCwgY29uc3QgQUVTX0tFWSAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGVuYyk7CisKKy8qIEFFU19jYmNfZW5jcnlwdCBlbmNyeXB0cyAob3IgZGVjcnlwdHMsIGlmIHxlbmN8ID09IHxBRVNfREVDUllQVHwpIHxsZW58CisgKiBieXRlcyBmcm9tIHxpbnwgdG8gfG91dHwuIFRoZSBsZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBibG9jayBzaXplLiAqLwordm9pZCBBRVNfY2JjX2VuY3J5cHQoY29uc3QgdWludDhfdCAqaW4sIHVpbnQ4X3QgKm91dCwgc2l6ZV90IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFFU19LRVkgKmtleSwgdWludDhfdCAqaXZlYywgY29uc3QgaW50IGVuYyk7CisKKy8qIEFFU19vZmIxMjhfZW5jcnlwdCBlbmNyeXB0cyAob3IgZGVjcnlwdHMsIGl0J3MgdGhlIHNhbWUgaW4gQ1RSIG1vZGUpIHxsZW58CisgKiBieXRlcyBmcm9tIHxpbnwgdG8gfG91dHwuIFRoZSB8bnVtfCBwYXJhbWV0ZXIgbXVzdCBiZSBzZXQgdG8gemVybyBvbiB0aGUKKyAqIGZpcnN0IGNhbGwuICovCit2b2lkIEFFU19vZmIxMjhfZW5jcnlwdChjb25zdCB1aW50OF90ICppbiwgdWludDhfdCAqb3V0LCBzaXplX3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUVTX0tFWSAqa2V5LCB1aW50OF90ICppdmVjLCBpbnQgKm51bSk7CisKKy8qIEFFU19jZmIxMjhfZW5jcnlwdCBlbmNyeXB0cyAob3IgZGVjcnlwdHMsIGlmIHxlbmN8ID09IHxBRVNfREVDUllQVHwpIHxsZW58CisgKiBieXRlcyBmcm9tIHxpbnwgdG8gfG91dHwuIFRoZSB8bnVtfCBwYXJhbWV0ZXIgbXVzdCBiZSBzZXQgdG8gemVybyBvbiB0aGUKKyAqIGZpcnN0IGNhbGwuICovCit2b2lkIEFFU19jZmIxMjhfZW5jcnlwdChjb25zdCB1aW50OF90ICppbiwgdWludDhfdCAqb3V0LCBzaXplX3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUVTX0tFWSAqa2V5LCB1aW50OF90ICppdmVjLCBpbnQgKm51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmMpOworCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfSAgLyogZXh0ZXJuIEMgKi8KKyNlbmRpZgorCisjZW5kaWYgIC8qIE9QRU5TU0xfSEVBREVSX0FFU19IICovCmRpZmYgLS1naXQgYS9jcnlwdG8vYWVzL2FzbS9hZXMtNTg2LnBsIGIvY3J5cHRvL2Flcy9hc20vYWVzLTU4Ni5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xYzFlMjNlCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2Flcy9hc20vYWVzLTU4Ni5wbApAQCAtMCwwICsxLDI5ODcgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKyMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgV3JpdHRlbiBieSBBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT4gZm9yIHRoZSBPcGVuU1NMCisjIHByb2plY3QuIFRoZSBtb2R1bGUgaXMsIGhvd2V2ZXIsIGR1YWwgbGljZW5zZWQgdW5kZXIgT3BlblNTTCBhbmQKKyMgQ1JZUFRPR0FNUyBsaWNlbnNlcyBkZXBlbmRpbmcgb24gd2hlcmUgeW91IG9idGFpbiBpdC4gRm9yIGZ1cnRoZXIKKyMgZGV0YWlscyBzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+YXBwcm8vY3J5cHRvZ2Ftcy8uCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFZlcnNpb24gNC4zLgorIworIyBZb3UgbWlnaHQgZmFpbCB0byBhcHByZWNpYXRlIHRoaXMgbW9kdWxlIHBlcmZvcm1hbmNlIGZyb20gdGhlIGZpcnN0CisjIHRyeS4gSWYgY29tcGFyZWQgdG8gInZhbmlsbGEiIGxpbnV4LWlhMzItaWNjIHRhcmdldCwgaS5lLiBjb25zaWRlcmVkCisjIHRvIGJlICp0aGUqIGJlc3QgSW50ZWwgQyBjb21waWxlciB3aXRob3V0IC1LUElDLCBwZXJmb3JtYW5jZSBhcHBlYXJzCisjIHRvIGJlIHZpcnR1YWxseSBpZGVudGljYWwuLi4gQnV0IHRyeSB0byByZS1jb25maWd1cmUgd2l0aCBzaGFyZWQKKyMgbGlicmFyeSBzdXBwb3J0Li4uIEFoYSEgSW50ZWwgY29tcGlsZXIgInN1ZGRlbmx5IiBsYWdzIGJlaGluZCBieSAzMCUKKyMgW29uIFA0LCBtb3JlIG9uIG90aGVyc106LSkgQW5kIGlmIGNvbXBhcmVkIHRvIHBvc2l0aW9uLWluZGVwZW5kZW50CisjIGNvZGUgZ2VuZXJhdGVkIGJ5IEdOVSBDLCB0aGlzIGNvZGUgcGVyZm9ybXMgKm1vcmUqIHRoYW4gKnR3aWNlKiBhcworIyBmYXN0ISBZZXMsIGFsbCB0aGlzIGJ1enogYWJvdXQgUElDIG1lYW5zIHRoYXQgdW5saWtlIG90aGVyIGhhbmQtCisjIGNvZGVkIGltcGxlbWVudGF0aW9ucywgdGhpcyBvbmUgd2FzIGV4cGxpY2l0bHkgZGVzaWduZWQgdG8gYmUgc2FmZQorIyB0byB1c2UgZXZlbiBpbiBzaGFyZWQgbGlicmFyeSBjb250ZXh0Li4uIFRoaXMgYWxzbyBtZWFucyB0aGF0IHRoaXMKKyMgY29kZSBpc24ndCBuZWNlc3NhcmlseSBhYnNvbHV0ZWx5IGZhc3Rlc3QgImV2ZXIsIiBiZWNhdXNlIGluIG9yZGVyCisjIHRvIGFjaGlldmUgcG9zaXRpb24gaW5kZXBlbmRlbmNlIGFuIGV4dHJhIHJlZ2lzdGVyIGhhcyB0byBiZQorIyBvZmYtbG9hZGVkIHRvIHN0YWNrLCB3aGljaCBhZmZlY3RzIHRoZSBiZW5jaG1hcmsgcmVzdWx0LgorIworIyBTcGVjaWFsIG5vdGUgYWJvdXQgaW5zdHJ1Y3Rpb24gY2hvaWNlLiBEbyB5b3UgcmVjYWxsIFJDNF9JTlQgY29kZQorIyBwZXJmb3JtaW5nIHBvb3JseSBvbiBQND8gSXQgbWlnaHQgYmUgdGhlIHRpbWUgdG8gZmlndXJlIG91dCB3aHkuCisjIFJDNF9JTlQgY29kZSBpbXBsaWVzIGVmZmVjdGl2ZSBhZGRyZXNzIGNhbGN1bGF0aW9ucyBpbiBiYXNlK29mZnNldCo0CisjIGZvcm0uIFRyb3VibGUgaXMgdGhhdCBpdCBzZWVtcyB0aGF0IG9mZnNldCBzY2FsaW5nIHR1cm5lZCB0byBiZQorIyBjcml0aWNhbCBwYXRoLi4uIEF0IGxlYXN0IGVsaW1pbmF0aW5nIHNjYWxpbmcgcmVzdWx0ZWQgaW4gMi44eCBSQzQKKyMgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgW2FzIHlvdSBtaWdodCByZWNhbGxdLiBBcyBBRVMgY29kZSBpcyBodW5ncnkKKyMgZm9yIHNjYWxpbmcgdG9vLCBJIFt0cnkgdG9dIGF2b2lkIHRoZSBsYXR0ZXIgYnkgZmF2b3Jpbmcgb2ZmLWJ5LTIKKyMgc2hpZnRzIGFuZCBtYXNraW5nIHRoZSByZXN1bHQgd2l0aCAweEZGPDwyIGluc3RlYWQgb2YgImJvcmluZyIgMHhGRi4KKyMKKyMgQXMgd2FzIHNob3duIGJ5IERlYW4gR2F1ZGV0IDxkZWFuQGFyY3RpYy5vcmc+LCB0aGUgYWJvdmUgbm90ZSB0dXJuZWQKKyMgdm9pZC4gUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgd2l0aCBvZmYtYnktMiBzaGlmdHMgd2FzIG9ic2VydmVkIG9uCisjIGludGVybWVkaWF0ZSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggd2FzIHNwaWxsaW5nIHlldCBhbm90aGVyIHJlZ2lzdGVyCisjIHRvIHN0YWNrLi4uIEZpbmFsIG9mZnNldCo0IGNvZGUgYmVsb3cgcnVucyBqdXN0IGEgdGFkIGZhc3RlciBvbiBQNCwKKyMgYnV0IGV4aGliaXRzIHVwIHRvIDEwJSBpbXByb3ZlbWVudCBvbiBvdGhlciBjb3Jlcy4KKyMKKyMgU2Vjb25kIHZlcnNpb24gaXMgIm1vbm9saXRoaWMiIHJlcGxhY2VtZW50IGZvciBhZXNfY29yZS5jLCB3aGljaCBpbgorIyBhZGRpdGlvbiB0byBBRVNfW2RlfGVuXWNyeXB0IGltcGxlbWVudHMgQUVTX3NldF9bZGV8ZW5dY3J5cHRpb25fa2V5LgorIyBUaGlzIG1hZGUgaXQgcG9zc2libGUgdG8gaW1wbGVtZW50IGxpdHRsZS1lbmRpYW4gdmFyaWFudCBvZiB0aGUKKyMgYWxnb3JpdGhtIHdpdGhvdXQgbW9kaWZ5aW5nIHRoZSBiYXNlIEMgY29kZS4gTW90aXZhdGluZyBmYWN0b3IgZm9yCisjIHRoZSB1bmRlcnRha2VuIGVmZm9ydCB3YXMgdGhhdCBpdCBhcHBlYXJlZCB0aGF0IGluIHRpZ2h0IElBLTMyCisjIHJlZ2lzdGVyIHdpbmRvdyBsaXR0bGUtZW5kaWFuIGZsYXZvciBjb3VsZCBhY2hpZXZlIHNsaWdodGx5IGhpZ2hlcgorIyBJbnN0cnVjdGlvbiBMZXZlbCBQYXJhbGxlbGlzbSwgYW5kIGl0IGluZGVlZCByZXN1bHRlZCBpbiB1cCB0byAxNSUKKyMgYmV0dGVyIHBlcmZvcm1hbmNlIG9uIG1vc3QgcmVjZW50ILUtYXJjaHMuLi4KKyMKKyMgVGhpcmQgdmVyc2lvbiBhZGRzIEFFU19jYmNfZW5jcnlwdCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggcmVzdWx0ZWQgaW4KKyMgdXAgdG8gNDAlIHBlcmZvcm1hbmNlIGltcm92ZW1lbnQgb2YgQ0JDIGJlbmNobWFyayByZXN1bHRzLiA0MCUgd2FzCisjIG9ic2VydmVkIG9uIFA0IGNvcmUsIHdoZXJlICJvdmVyYWxsIiBpbXJvdmVtZW50IGNvZWZmaWNpZW50LCBpLmUuIGlmCisjIGNvbXBhcmVkIHRvIFBJQyBnZW5lcmF0ZWQgYnkgR0NDIGFuZCBpbiBDQkMgbW9kZSwgd2FzIG9ic2VydmVkIHRvIGJlCisjIGFzIGxhcmdlIGFzIDR4Oi0pIENCQyBwZXJmb3JtYW5jZSBpcyB2aXJ0dWFsbHkgaWRlbnRpY2FsIHRvIEVDQiBub3cKKyMgYW5kIG9uIHNvbWUgcGxhdGZvcm1zIGV2ZW4gYmV0dGVyLCBlLmcuIDE3LjYgInNtYWxsIiBjeWNsZXMvYnl0ZSBvbgorIyBPcHRlcm9uLCBiZWNhdXNlIGNlcnRhaW4gZnVuY3Rpb24gcHJvbG9ndWVzIGFuZCBlcGlsb2d1ZXMgYXJlCisjIGVmZmVjdGl2ZWx5IHRha2VuIG91dCBvZiB0aGUgbG9vcC4uLgorIworIyBWZXJzaW9uIDMuMiBpbXBsZW1lbnRzIGNvbXByZXNzZWQgdGFibGVzIGFuZCBwcmVmZXRjaCBvZiB0aGVzZSB0YWJsZXMKKyMgaW4gQ0JDWyFdIG1vZGUuIEZvcm1lciBtZWFucyB0aGF0IDMvNCBvZiB0YWJsZSByZWZlcmVuY2VzIGFyZSBub3cKKyMgbWlzYWxpZ25lZCwgd2hpY2ggdW5mb3J0dW5hdGVseSBoYXMgbmVnYXRpdmUgaW1wYWN0IG9uIGVsZGVyIElBLTMyCisjIGltcGxlbWVudGF0aW9ucywgUGVudGl1bSBzdWZmZXJlZCAzMCUgcGVuYWx0eSwgUElJSSAtIDEwJS4KKyMKKyMgVmVyc2lvbiAzLjMgYXZvaWRzIEwxIGNhY2hlIGFsaWFzaW5nIGJldHdlZW4gc3RhY2sgZnJhbWUgYW5kCisjIFMtYm94ZXMsIGFuZCAzLjQgLSBMMSBjYWNoZSBhbGlhc2luZyBldmVuIGJldHdlZW4ga2V5IHNjaGVkdWxlLiBUaGUKKyMgbGF0dGVyIGlzIGFjaGlldmVkIGJ5IGNvcHlpbmcgdGhlIGtleSBzY2hlZHVsZSB0byBjb250cm9sbGVkIHBsYWNlIGluCisjIHN0YWNrLiBUaGlzIHVuZm9ydHVuYXRlbHkgaGFzIHJhdGhlciBzdHJvbmcgaW1wYWN0IG9uIHNtYWxsIGJsb2NrIENCQworIyBwZXJmb3JtYW5jZSwgfjJ4IGRldGVyaW9yYXRpb24gb24gMTYtYnl0ZSBibG9jayBpZiBjb21wYXJlZCB0byAzLjMuCisjCisjIFZlcnNpb24gMy41IGNoZWNrcyBpZiB0aGVyZSBpcyBMMSBjYWNoZSBhbGlhc2luZyBiZXR3ZWVuIHVzZXItc3VwcGxpZWQKKyMga2V5IHNjaGVkdWxlIGFuZCBTLWJveGVzIGFuZCBhYnN0YWlucyBmcm9tIGNvcHlpbmcgdGhlIGZvcm1lciBpZgorIyB0aGVyZSBpcyBuby4gVGhpcyBhbGxvd3MgZW5kLXVzZXIgdG8gY29uc2Npb3VzbHkgcmV0YWluIHNtYWxsIGJsb2NrCisjIHBlcmZvcm1hbmNlIGJ5IGFsaWduaW5nIGtleSBzY2hlZHVsZSBpbiBzcGVjaWZpYyBtYW5uZXIuCisjCisjIFZlcnNpb24gMy42IGNvbXByZXNzZXMgVGQ0IHRvIDI1NiBieXRlcyBhbmQgcHJlZmV0Y2hlcyBpdCBpbiBFQ0IuCisjCisjIEN1cnJlbnQgRUNCIHBlcmZvcm1hbmNlIG51bWJlcnMgZm9yIDEyOC1iaXQga2V5IGluIENQVSBjeWNsZXMgcGVyCisjIHByb2Nlc3NlZCBieXRlIFttZWFzdXJlIGNvbW1vbmx5IHVzZWQgYnkgQUVTIGJlbmNobWFya2Vyc10gYXJlOgorIworIwkJc21hbGwgZm9vdHByaW50CQlmdWxseSB1bnJvbGxlZAorIyBQNAkJMjQJCQkyMgorIyBBTUQgSzgJMjAJCQkxOQorIyBQSUlJCQkyNQkJCTIzCisjIFBlbnRpdW0JODEJCQk3OAorIworIyBWZXJzaW9uIDMuNyByZWltcGxlbWVudHMgb3V0ZXIgcm91bmRzIGFzICJjb21wYWN0LiIgTWVhbmluZyB0aGF0CisjIGZpcnN0IGFuZCBsYXN0IHJvdW5kcyByZWZlcmVuY2UgY29tcGFjdCAyNTYgYnl0ZXMgUy1ib3guIFRoaXMgbWVhbnMKKyMgdGhhdCBmaXJzdCByb3VuZCBjb25zdW1lcyBhIGxvdCBtb3JlIENQVSBjeWNsZXMgYW5kIHRoYXQgZW5jcnlwdAorIyBhbmQgZGVjcnlwdCBwZXJmb3JtYW5jZSBiZWNvbWVzIGFzeW1tZXRyaWMuIEVuY3J5cHQgcGVyZm9ybWFuY2UKKyMgZHJvcHMgYnkgMTAtMTIlLCB3aGlsZSBkZWNyeXB0IC0gYnkgMjAtMjUlOi0oIDI1NiBieXRlcyBTLWJveCBpcworIyBhZ2dyZXNzaXZlbHkgcHJlLWZldGNoZWQuCisjCisjIFZlcnNpb24gNC4wIGVmZmVjdGl2ZWx5IHJvbGxzIGJhY2sgdG8gMy42IGFuZCBpbnN0ZWFkIGltcGxlbWVudHMKKyMgYWRkaXRpb25hbCBzZXQgb2YgZnVuY3Rpb25zLCBfW3g4Nnxzc2VdX0FFU19bZW58ZGVdY3J5cHRfY29tcGFjdCwKKyMgd2hpY2ggdXNlIGV4Y2x1c2l2ZWx5IDI1NiBieXRlIFMtYm94LiBUaGVzZSBmdW5jdGlvbnMgYXJlIHRvIGJlCisjIGNhbGxlZCBpbiBtb2RlcyBub3QgY29uY2VhbGluZyBwbGFpbiB0ZXh0LCBzdWNoIGFzIEVDQiwgb3Igd2hlbgorIyB3ZSdyZSBhc2tlZCB0byBwcm9jZXNzIHNtYWxsZXIgYW1vdW50IG9mIGRhdGEgW29yIHVuY29uZGl0aW9uYWxseQorIyBvbiBoeXBlci10aHJlYWRpbmcgQ1BVXS4gQ3VycmVudGx5IGl0J3MgY2FsbGVkIHVuY29uZGl0aW9uYWxseSBmcm9tCisjIEFFU19bZW58ZGVdY3J5cHQsIHdoaWNoIGFmZmVjdHMgYWxsIG1vZGVzLCBidXQgQ0JDLiBDQkMgcm91dGluZQorIyBzdGlsbCBuZWVkcyB0byBiZSBtb2RpZmllZCB0byBzd2l0Y2ggYmV0d2VlbiBzbG93ZXIgYW5kIGZhc3RlcgorIyBtb2RlIHdoZW4gYXBwcm9wcmlhdGUuLi4gQnV0IGluIGVpdGhlciBjYXNlIGJlbmNobWFyayBsYW5kc2NhcGUKKyMgY2hhbmdlcyBkcmFtYXRpY2FsbHkgYW5kIGJlbG93IG51bWJlcnMgYXJlIENQVSBjeWNsZXMgcGVyIHByb2Nlc3NlZAorIyBieXRlIGZvciAxMjgtYml0IGtleS4KKyMKKyMJCUVDQiBlbmNyeXB0CUVDQiBkZWNyeXB0CUNCQyBsYXJnZSBjaHVuaworIyBQNAkJNTJbNTRdCQk4M1s5NV0JCTIzCisjIEFNRCBLOAk0Nls0MV0JCTY2WzcwXQkJMTgKKyMgUElJSQkJNDFbNTBdCQk2MFs3N10JCTI0CisjIENvcmUgMgkzMVszNl0JCTQ1WzY0XQkJMTguNQorIyBBdG9tCQk3NlsxMDBdCQk5NlsxMzhdCQk2MAorIyBQZW50aXVtCTExNQkJMTUwCQk3NworIworIyBWZXJzaW9uIDQuMSBzd2l0Y2hlcyB0byBjb21wYWN0IFMtYm94IGV2ZW4gaW4ga2V5IHNjaGVkdWxlIHNldHVwLgorIworIyBWZXJzaW9uIDQuMiBwcmVmZXRjaGVzIGNvbXBhY3QgUy1ib3ggaW4gZXZlcnkgU1NFIHJvdW5kIG9yIGluIG90aGVyCisjIHdvcmRzIGV2ZXJ5IGNhY2hlLWxpbmUgaXMgKmd1YXJhbnRlZWQqIHRvIGJlIGFjY2Vzc2VkIHdpdGhpbiB+NTAKKyMgY3ljbGVzIHdpbmRvdy4gV2h5IGp1c3QgU1NFPyBCZWNhdXNlIGl0J3MgbmVlZGVkIG9uIGh5cGVyLXRocmVhZGluZworIyBDUFUhIFdoaWNoIGlzIGFsc28gd2h5IGl0J3MgcHJlZmV0Y2hlZCB3aXRoIDY0IGJ5dGUgc3RyaWRlLiBCZXN0CisjIHBhcnQgaXMgdGhhdCBpdCBoYXMgbm8gbmVnYXRpdmUgZWZmZWN0IG9uIHBlcmZvcm1hbmNlOi0pICAKKyMKKyMgVmVyc2lvbiA0LjMgaW1wbGVtZW50cyBzd2l0Y2ggYmV0d2VlbiBjb21wYWN0IGFuZCBub24tY29tcGFjdCBibG9jaworIyBmdW5jdGlvbnMgaW4gQUVTX2NiY19lbmNyeXB0IGRlcGVuZGluZyBvbiBob3cgbXVjaCBkYXRhIHdhcyBhc2tlZAorIyB0byBiZSBwcm9jZXNzZWQgaW4gb25lIHN0cm9rZS4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVGltaW5nIGF0dGFja3MgYXJlIGNsYXNzaWZpZWQgaW4gdHdvIGNsYXNzZXM6IHN5bmNocm9ub3VzIHdoZW4KKyMgYXR0YWNrZXIgY29uc2Npb3VzbHkgaW5pdGlhdGVzIGNyeXB0b2dyYXBoaWMgb3BlcmF0aW9uIGFuZCBjb2xsZWN0cworIyB0aW1pbmcgZGF0YSBvZiB2YXJpb3VzIGNoYXJhY3RlciBhZnRlcndhcmRzLCBhbmQgYXN5bmNocm9ub3VzIHdoZW4KKyMgbWFsaWNpb3VzIGNvZGUgaXMgZXhlY3V0ZWQgb24gc2FtZSBDUFUgc2ltdWx0YW5lb3VzbHkgd2l0aCBBRVMsCisjIGluc3RydW1lbnRzIGl0c2VsZiBhbmQgcGVyZm9ybXMgc3RhdGlzdGljYWwgYW5hbHlzaXMgb2YgdGhpcyBkYXRhLgorIworIyBBcyBmYXIgYXMgc3luY2hyb25vdXMgYXR0YWNrcyBnbyB0aGUgcm9vdCB0byB0aGUgQUVTIHRpbWluZworIyB2dWxuZXJhYmlsaXR5IGlzIHR3b2ZvbGQuIEZpcnN0bHksIG9mIDI1NiBTLWJveCBlbGVtZW50cyBhdCBtb3N0IDE2MAorIyBhcmUgcmVmZXJyZWQgdG8gaW4gc2luZ2xlIDEyOC1iaXQgYmxvY2sgb3BlcmF0aW9uLiBXZWxsLCBpbiBDCisjIGltcGxlbWVudGF0aW9uIHdpdGggNCBkaXN0aW5jdCB0YWJsZXMgaXQncyBhY3R1YWxseSBhcyBsaXR0bGUgYXMgNDAKKyMgcmVmZXJlbmNlcyBwZXIgMjU2IGVsZW1lbnRzIHRhYmxlLCBidXQgYW55d2F5Li4uIFNlY29uZGx5LCBldmVuCisjIHRob3VnaCBTLWJveCBlbGVtZW50cyBhcmUgY2x1c3RlcmVkIGludG8gc21hbGxlciBhbW91bnQgb2YgY2FjaGUtCisjIGxpbmVzLCBzbWFsbGVyIHRoYW4gMTYwIGFuZCBldmVuIDQwLCBpdCB0dXJuZWQgb3V0IHRoYXQgZm9yIGNlcnRhaW4KKyMgcGxhaW4tdGV4dCBwYXR0ZXJuW3NdIG9yIHNpbXBseSBwdXQgY2hvc2VuIHBsYWluLXRleHQgYW5kIGdpdmVuIGtleQorIyBmZXcgY2FjaGUtbGluZXMgcmVtYWluIHVuYWNjZXNzZWQgZHVyaW5nIGJsb2NrIG9wZXJhdGlvbi4gTm93LCBpZgorIyBhdHRhY2tlciBjYW4gZmlndXJlIG91dCB0aGlzIGFjY2VzcyBwYXR0ZXJuLCBoZSBjYW4gZGVkdWN0IHRoZSBrZXkKKyMgW29yIGF0IGxlYXN0IHBhcnQgb2YgaXRdLiBUaGUgbmF0dXJhbCB3YXkgdG8gbWl0aWdhdGUgdGhpcyBraW5kIG9mCisjIGF0dGFja3MgaXMgdG8gbWluaW1pemUgdGhlIGFtb3VudCBvZiBjYWNoZS1saW5lcyBpbiBTLWJveCBhbmQvb3IKKyMgcHJlZmV0Y2ggdGhlbSB0byBlbnN1cmUgdGhhdCBldmVyeSBvbmUgaXMgYWNjZXNzZWQgZm9yIG1vcmUgdW5pZm9ybQorIyB0aW1pbmcuIEJ1dCBub3RlIHRoYXQgKmlmKiBwbGFpbi10ZXh0IHdhcyBjb25jZWFsZWQgaW4gc3VjaCB3YXkgdGhhdAorIyBpbnB1dCB0byBibG9jayBmdW5jdGlvbiBpcyBkaXN0cmlidXRlZCAqdW5pZm9ybWx5KiwgdGhlbiBhdHRhY2sKKyMgd291bGRuJ3QgYXBwbHkuIE5vdyBub3RlIHRoYXQgc29tZSBlbmNyeXB0aW9uIG1vZGVzLCBtb3N0IG5vdGFibHkKKyMgQ0JDLCBkbyBtYXNrIHRoZSBwbGFpbi10ZXh0IGluIHRoaXMgZXhhY3Qgd2F5IFtzZWN1cmUgY2lwaGVyIG91dHB1dAorIyBpcyBkaXN0cmlidXRlZCB1bmlmb3JtbHldLiBZZXMsIG9uZSBzdGlsbCBtaWdodCBmaW5kIGlucHV0IHRoYXQKKyMgd291bGQgcmV2ZWFsIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBnaXZlbiBrZXksIGJ1dCBpZiBhbW91bnQgb2YKKyMgY2FuZGlkYXRlIGlucHV0cyB0byBiZSB0cmllZCBpcyBsYXJnZXIgdGhhbiBhbW91bnQgb2YgcG9zc2libGUga2V5CisjIGNvbWJpbmF0aW9ucyB0aGVuIGF0dGFjayBiZWNvbWVzIGluZmVhc2libGUuIFRoaXMgaXMgd2h5IHJldmlzZWQKKyMgQUVTX2NiY19lbmNyeXB0ICJkYXJlcyIgdG8gc3dpdGNoIHRvIGxhcmdlciBTLWJveCB3aGVuIGxhcmdlciBjaHVuaworIyBvZiBkYXRhIGlzIHRvIGJlIHByb2Nlc3NlZCBpbiBvbmUgc3Ryb2tlLiBUaGUgY3VycmVudCBzaXplIGxpbWl0IG9mCisjIDUxMiBieXRlcyBpcyBjaG9zZW4gdG8gcHJvdmlkZSBzYW1lIFtkaW1pbmlzaGlnbHkgbG93XSBwcm9iYWJpbGl0eQorIyBmb3IgY2FjaGUtbGluZSB0byByZW1haW4gdW50b3VjaGVkIGluIGxhcmdlIGNodW5rIG9wZXJhdGlvbiB3aXRoCisjIGxhcmdlIFMtYm94IGFzIGZvciBzaW5nbGUgYmxvY2sgb3BlcmF0aW9uIHdpdGggY29tcGFjdCBTLWJveCBhbmQKKyMgc3VyZWx5IG5lZWRzIG1vcmUgY2FyZWZ1bCBjb25zaWRlcmF0aW9uLi4uCisjCisjIEFzIGZvciBhc3luY2hyb25vdXMgYXR0YWNrcy4gVGhlcmUgYXJlIHR3byBmbGF2b3VyczogYXR0YWNrZXIgY29kZQorIyBiZWluZyBpbnRlcmxlYXZlZCB3aXRoIEFFUyBvbiBoeXBlci10aHJlYWRpbmcgQ1BVIGF0ICppbnN0cnVjdGlvbioKKyMgbGV2ZWwsIGFuZCB0d28gcHJvY2Vzc2VzIHRpbWUgc2hhcmluZyBzaW5nbGUgY29yZS4gQXMgZm9yIGxhdHRlci4KKyMgVHdvIHZlY3RvcnMuIDEuIEdpdmVuIHRoYXQgYXR0YWNrZXIgcHJvY2VzcyBoYXMgaGlnaGVyIHByaW9yaXR5LAorIyB5aWVsZCBleGVjdXRpb24gdG8gcHJvY2VzcyBwZXJmb3JtaW5nIEFFUyBqdXN0IGJlZm9yZSB0aW1lciBmaXJlcworIyBvZmYgdGhlIHNjaGVkdWxlciwgaW1tZWRpYXRlbHkgcmVnYWluIGNvbnRyb2wgb2YgQ1BVIGFuZCBhbmFseXplIHRoZQorIyBjYWNoZSBzdGF0ZS4gRm9yIHRoaXMgYXR0YWNrIHRvIGJlIGVmZmljaWVudCBhdHRhY2tlciB3b3VsZCBoYXZlIHRvCisjIGVmZmVjdGl2ZWx5IHNsb3cgZG93biB0aGUgb3BlcmF0aW9uIGJ5IHNldmVyYWwgKm9yZGVycyogb2YgbWFnbml0dXRlLAorIyBieSByYXRpbyBvZiB0aW1lIHNsaWNlIHRvIGR1cmF0aW9uIG9mIGhhbmRmdWwgb2YgQUVTIHJvdW5kcywgd2hpY2gKKyMgdW5saWtlbHkgdG8gcmVtYWluIHVubm90aWNlZC4gTm90IHRvIG1lbnRpb24gdGhhdCB0aGlzIGFsc28gbWVhbnMKKyMgdGhhdCBoZSB3b3VsZCBzcGVuZCBjb3JyZXNwb25kaWdseSBtb3JlIHRpbWUgdG8gY29sbGVjdCBlbm91Z2gKKyMgc3RhdGlzdGljYWwgZGF0YSB0byBtb3VudCB0aGUgYXR0YWNrLiBJdCdzIHByb2JhYmx5IGFwcHJvcHJpYXRlIHRvCisjIHNheSB0aGF0IGlmIGFkZXZlcnNhcnkgcmVja29ucyB0aGF0IHRoaXMgYXR0YWNrIGlzIGJlbmVmaWNpYWwgYW5kCisjIHJpc2tzIHRvIGJlIG5vdGljZWQsIHlvdSBwcm9iYWJseSBoYXZlIGxhcmdlciBwcm9ibGVtcyBoYXZpbmcgaGltCisjIG1lcmUgb3Bwb3J0dW5pdHkuIEluIG90aGVyIHdvcmRzIHN1Z2dlc3RlZCBjb2RlIGRlc2lnbiBleHBlY3RzIHlvdQorIyB0byBwcmVjbHVkZS9taXRpZ2F0ZSB0aGlzIGF0dGFjayBieSBvdmVyYWxsIHN5c3RlbSBzZWN1cml0eSBkZXNpZ24uCisjIDIuIEF0dGFja2VyIG1hbmFnZXMgdG8gbWFrZSBoaXMgY29kZSBpbnRlcnJ1cHQgZHJpdmVuLiBJbiBvcmRlciBmb3IKKyMgdGhpcyBraW5kIG9mIGF0dGFjayB0byBiZSBmZWFzaWJsZSwgaW50ZXJydXB0IHJhdGUgaGFzIHRvIGJlIGhpZ2gKKyMgZW5vdWdoLCBhZ2FpbiBjb21wYXJhYmxlIHRvIGR1cmF0aW9uIG9mIGhhbmRmdWwgb2YgQUVTIHJvdW5kcy4gQnV0CisjIGlzIHRoZXJlIGludGVycnVwdCBzb3VyY2Ugb2Ygc3VjaCByYXRlPyBIYXJkbHksIG5vdCBldmVuIDFHYnBzIE5JQworIyBnZW5lcmF0ZXMgaW50ZXJydXB0cyBhdCBzdWNoIHJhZ2luZyByYXRlLi4uCisjCisjIEFuZCBub3cgYmFjayB0byB0aGUgZm9ybWVyLCBoeXBlci10aHJlYWRpbmcgQ1BVIG9yIG1vcmUgc3BlY2lmaWNhbGx5CisjIEludGVsIFA0LiBSZWNhbGwgdGhhdCBhc3luY2hyb25vdXMgYXR0YWNrIGltcGxpZXMgdGhhdCBtYWxpY2lvdXMKKyMgY29kZSBpbnN0cnVtZW50cyBpdHNlbGYuIEFuZCBuYXR1cmFsbHkgaW5zdHJ1bWVudGF0aW9uIGdyYW51bGFyaXR5CisjIGhhcyBiZSBub3RpY2VhYmx5IGxvd2VyIHRoYW4gZHVyYXRpb24gb2YgY29kZXBhdGggYWNjZXNzaW5nIFMtYm94LgorIyBHaXZlbiB0aGF0IGFsbCBjYWNoZS1saW5lcyBhcmUgYWNjZXNzZWQgZHVyaW5nIHRoYXQgdGltZSB0aGF0IGlzLgorIyBDdXJyZW50IGltcGxlbWVudGF0aW9uIGFjY2Vzc2VzICphbGwqIGNhY2hlLWxpbmVzIHdpdGhpbiB+NTAgY3ljbGVzCisjIHdpbmRvdywgd2hpY2ggaXMgYWN0dWFsbHkgKmxlc3MqIHRoYW4gUkRUU0MgbGF0ZW5jeSBvbiBJbnRlbCBQNCEKKworJDAgPX4gbS8oLipbXC9cXF0pW15cL1xcXSskLzsgJGRpcj0kMTsKK3B1c2goQElOQywiJHtkaXJ9IiwiJHtkaXJ9Li4vLi4vcGVybGFzbSIpOworcmVxdWlyZSAieDg2YXNtLnBsIjsKKworJmFzbV9pbml0KCRBUkdWWzBdLCJhZXMtNTg2LnBsIiwkeDg2b25seSA9ICRBUkdWWyQjQVJHVl0gZXEgIjM4NiIpOworJnN0YXRpY19sYWJlbCgiQUVTX1RlIik7Cismc3RhdGljX2xhYmVsKCJBRVNfVGQiKTsKKworJHMwPSJlYXgiOworJHMxPSJlYngiOworJHMyPSJlY3giOworJHMzPSJlZHgiOworJGtleT0iZWRpIjsKKyRhY2M9ImVzaSI7CiskdGJsPSJlYnAiOworCisjIHN0YWNrIGZyYW1lIGxheW91dCBpbiBfW3g4Nnxzc2VdX0FFU18qIHJvdXRpbmVzLCBmcmFtZSBpcyBhbGxvY2F0ZWQKKyMgYnkgY2FsbGVyCiskX19yYT0mRFdQKDAsImVzcCIpOwkjIHJldHVybiBhZGRyZXNzCiskX19zMD0mRFdQKDQsImVzcCIpOwkjIHMwIGJhY2tpbmcgc3RvcmUKKyRfX3MxPSZEV1AoOCwiZXNwIik7CSMgczEgYmFja2luZyBzdG9yZQorJF9fczI9JkRXUCgxMiwiZXNwIik7CSMgczIgYmFja2luZyBzdG9yZQorJF9fczM9JkRXUCgxNiwiZXNwIik7CSMgczMgYmFja2luZyBzdG9yZQorJF9fa2V5PSZEV1AoMjAsImVzcCIpOwkjIHBvaW50ZXIgdG8ga2V5IHNjaGVkdWxlCiskX19lbmQ9JkRXUCgyNCwiZXNwIik7CSMgcG9pbnRlciB0byBlbmQgb2Yga2V5IHNjaGVkdWxlCiskX190Ymw9JkRXUCgyOCwiZXNwIik7CSMgJWVicCBiYWNraW5nIHN0b3JlCisKKyMgc3RhY2sgZnJhbWUgbGF5b3V0IGluIEFFU19bZW58Y3J5cHRdIHJvdXRpbmVzLCB3aGljaCBkaWZmZXJzIGZyb20KKyMgYWJvdmUgYnkgNCBhbmQgb3ZlcmxhcHMgYnkgJWVicCBiYWNraW5nIHN0b3JlCiskX3RibD0mRFdQKDI0LCJlc3AiKTsKKyRfZXNwPSZEV1AoMjgsImVzcCIpOworCitzdWIgX2RhdGFfd29yZCgpIHsgbXkgJGk7IHdoaWxlKGRlZmluZWQoJGk9c2hpZnQpKSB7ICZkYXRhX3dvcmQoJGksJGkpOyB9IH0KKworJHNwZWVkX2xpbWl0PTUxMjsJIyBjaHVua3Mgc21hbGxlciB0aGFuICRzcGVlZF9saW1pdCBhcmUKKwkJCSMgcHJvY2Vzc2VkIHdpdGggY29tcGFjdCByb3V0aW5lIGluIENCQyBtb2RlCiskc21hbGxfZm9vdHByaW50PTE7CSMgJHNtYWxsX2Zvb3RwcmludD0xIGNvZGUgaXMgfjUlIHNsb3dlciBbb24KKwkJCSMgcmVjZW50ILUtYXJjaHNdLCBidXQgfjUgdGltZXMgc21hbGxlciEKKwkJCSMgSSBmYXZvciBjb21wYWN0IGNvZGUgdG8gbWluaW1pemUgY2FjaGUKKwkJCSMgY29udGVudGlvbiBhbmQgaW4gaG9wZSB0byAiY29sbGVjdCIgNSUgYmFjaworCQkJIyBpbiByZWFsLWxpZmUgYXBwbGljYXRpb25zLi4uCisKKyR2ZXJ0aWNhbF9zcGluPTA7CSMgc2hpZnQgInZlcnRpY2FseSIgZGVmYXVsdHMgdG8gMCwgYmVjYXVzZSBvZgorCQkJIyBpdHMgcHJvb2Ytb2YtY29uY2VwdCBzdGF0dXMuLi4KKyMgTm90ZSB0aGF0IHRoZXJlIGlzIG5vIGRlY3ZlcnQoKSwgYXMgd2VsbCBhcyBsYXN0IGVuY3J5cHRpb24gcm91bmQgaXMKKyMgcGVyZm9ybWVkIHdpdGggImhvcml6b250YWwiIHNoaWZ0cy4gVGhpcyBpcyBiZWNhdXNlIHRoaXMgInZlcnRpY2FsIgorIyBpbXBsZW1lbnRhdGlvbiBbb25lIHdoaWNoIGdyb3VwcyBzaGlmdHMgb24gYSBnaXZlbiAkc1tpXSB0byBmb3JtIGEKKyMgImNvbHVtbiwiIHVubGlrZSAiaG9yaXpvbnRhbCIgb25lLCB3aGljaCBncm91cHMgc2hpZnRzIG9uIGRpZmZlcmVudAorIyAkc1tpXSB0byBmb3JtIGEgInJvdyJdIGlzIHdvcmsgaW4gcHJvZ3Jlc3MuIEl0IHdhcyBvYnNlcnZlZCB0byBydW4KKyMgZmV3IHBlcmNlbnRzIGZhc3RlciBvbiBJbnRlbCBjb3JlcywgYnV0IG5vdCBBTUQuIE9uIEFNRCBLOCBjb3JlIGl0J3MKKyMgd2hvbGUgMTIlIHNsb3dlcjotKCBTbyB3ZSBmYWNlIGEgdHJhZGUtb2ZmLi4uIFNoYWxsIGl0IGJlIHJlc29sdmVkCisjIHNvbWUgZGF5PyBUaWxsIHRoZW4gdGhlIGNvZGUgaXMgY29uc2lkZXJlZCBleHBlcmltZW50YWwgYW5kIGJ5CisjIGRlZmF1bHQgcmVtYWlucyBkb3JtYW50Li4uCisKK3N1YiBlbmN2ZXJ0KCkKK3sgbXkgKCR0ZSxAcykgPSBAXzsKKyAgbXkgKCR2MCwkdjEpID0gKCRhY2MsJGtleSk7CisKKwkmbW92CSgkdjAsJHNbM10pOwkJCQkjIGNvcHkgczMKKwkmbW92CSgmRFdQKDQsImVzcCIpLCRzWzJdKTsJCQkjIHNhdmUgczIKKwkmbW92CSgkdjEsJHNbMF0pOwkJCQkjIGNvcHkgczAKKwkmbW92CSgmRFdQKDgsImVzcCIpLCRzWzFdKTsJCQkjIHNhdmUgczEKKworCSZtb3Z6CSgkc1syXSwmSEIoJHNbMF0pKTsKKwkmYW5kCSgkc1swXSwweEZGKTsKKwkmbW92CSgkc1swXSwmRFdQKDAsJHRlLCRzWzBdLDgpKTsJCSMgczA+PjAKKwkmc2hyCSgkdjEsMTYpOworCSZtb3YJKCRzWzNdLCZEV1AoMywkdGUsJHNbMl0sOCkpOwkJIyBzMD4+OAorCSZtb3Z6CSgkc1sxXSwmSEIoJHYxKSk7CisJJmFuZAkoJHYxLDB4RkYpOworCSZtb3YJKCRzWzJdLCZEV1AoMiwkdGUsJHYxLDgpKTsJCSMgczA+PjE2CisJICZtb3YJKCR2MSwkdjApOworCSZtb3YJKCRzWzFdLCZEV1AoMSwkdGUsJHNbMV0sOCkpOwkJIyBzMD4+MjQKKworCSZhbmQJKCR2MCwweEZGKTsKKwkmeG9yCSgkc1szXSwmRFdQKDAsJHRlLCR2MCw4KSk7CQkjIHMzPj4wCisJJm1vdnoJKCR2MCwmSEIoJHYxKSk7CisJJnNocgkoJHYxLDE2KTsKKwkmeG9yCSgkc1syXSwmRFdQKDMsJHRlLCR2MCw4KSk7CQkjIHMzPj44CisJJm1vdnoJKCR2MCwmSEIoJHYxKSk7CisJJmFuZAkoJHYxLDB4RkYpOworCSZ4b3IJKCRzWzFdLCZEV1AoMiwkdGUsJHYxLDgpKTsJCSMgczM+PjE2CisJICZtb3YJKCR2MSwmRFdQKDQsImVzcCIpKTsJCQkjIHJlc3RvcmUgczIKKwkmeG9yCSgkc1swXSwmRFdQKDEsJHRlLCR2MCw4KSk7CQkjIHMzPj4yNAorCisJJm1vdgkoJHYwLCR2MSk7CisJJmFuZAkoJHYxLDB4RkYpOworCSZ4b3IJKCRzWzJdLCZEV1AoMCwkdGUsJHYxLDgpKTsJCSMgczI+PjAKKwkmbW92egkoJHYxLCZIQigkdjApKTsKKwkmc2hyCSgkdjAsMTYpOworCSZ4b3IJKCRzWzFdLCZEV1AoMywkdGUsJHYxLDgpKTsJCSMgczI+PjgKKwkmbW92egkoJHYxLCZIQigkdjApKTsKKwkmYW5kCSgkdjAsMHhGRik7CisJJnhvcgkoJHNbMF0sJkRXUCgyLCR0ZSwkdjAsOCkpOwkJIyBzMj4+MTYKKwkgJm1vdgkoJHYwLCZEV1AoOCwiZXNwIikpOwkJCSMgcmVzdG9yZSBzMQorCSZ4b3IJKCRzWzNdLCZEV1AoMSwkdGUsJHYxLDgpKTsJCSMgczI+PjI0CisKKwkmbW92CSgkdjEsJHYwKTsKKwkmYW5kCSgkdjAsMHhGRik7CisJJnhvcgkoJHNbMV0sJkRXUCgwLCR0ZSwkdjAsOCkpOwkJIyBzMT4+MAorCSZtb3Z6CSgkdjAsJkhCKCR2MSkpOworCSZzaHIJKCR2MSwxNik7CisJJnhvcgkoJHNbMF0sJkRXUCgzLCR0ZSwkdjAsOCkpOwkJIyBzMT4+OAorCSZtb3Z6CSgkdjAsJkhCKCR2MSkpOworCSZhbmQJKCR2MSwweEZGKTsKKwkmeG9yCSgkc1szXSwmRFdQKDIsJHRlLCR2MSw4KSk7CQkjIHMxPj4xNgorCSAmbW92CSgka2V5LCRfX2tleSk7CQkJCSMgcmVpbmNhcm5hdGUgdjEgYXMga2V5CisJJnhvcgkoJHNbMl0sJkRXUCgxLCR0ZSwkdjAsOCkpOwkJIyBzMT4+MjQKK30KKworIyBBbm90aGVyIGV4cGVyaW1lbnRhbCByb3V0aW5lLCB3aGljaCBmZWF0dXJlcyAiaG9yaXpvbnRhbCBzcGluLCIgYnV0CisjIGVsaW1pbmF0ZXMgb25lIHJlZmVyZW5jZSB0byBzdGFjay4gU3RyYW5nZWx5IGVub3VnaCBydW5zIHNsb3dlci4uLgorc3ViIGVuY2hvcml6KCkKK3sgbXkgKCR2MCwkdjEpID0gKCRrZXksJGFjYyk7CisKKwkmbW92egkoJHYwLCZMQigkczApKTsJCQkjICAzLCAyLCAxLCAwKgorCSZyb3RyCSgkczIsOCk7CQkJIyAgOCwxMSwxMCwgOQorCSZtb3YJKCR2MSwmRFdQKDAsJHRlLCR2MCw4KSk7CSMgIDAKKwkmbW92egkoJHYwLCZIQigkczEpKTsJCQkjICA3LCA2LCA1KiwgNAorCSZyb3RyCSgkczMsMTYpOwkJCSMgMTMsMTIsMTUsMTQKKwkmeG9yCSgkdjEsJkRXUCgzLCR0ZSwkdjAsOCkpOwkjICA1CisJJm1vdnoJKCR2MCwmSEIoJHMyKSk7CQkJIyAgOCwxMSwxMCosIDkKKwkmcm90cgkoJHMwLDE2KTsJCQkjICAxLCAwLCAzLCAyCisJJnhvcgkoJHYxLCZEV1AoMiwkdGUsJHYwLDgpKTsJIyAxMAorCSZtb3Z6CSgkdjAsJkhCKCRzMykpOwkJCSMgMTMsMTIsMTUqLDE0CisJJnhvcgkoJHYxLCZEV1AoMSwkdGUsJHYwLDgpKTsJIyAxNSwgdFswXSBjb2xsZWN0ZWQKKwkmbW92CSgkX19zMCwkdjEpOwkJCSMgdFswXSBzYXZlZAorCisJJm1vdnoJKCR2MCwmTEIoJHMxKSk7CQkJIyAgNywgNiwgNSwgNCoKKwkmc2hyCSgkczEsMTYpOwkJCSMgIC0sIC0sIDcsIDYKKwkmbW92CSgkdjEsJkRXUCgwLCR0ZSwkdjAsOCkpOwkjICA0CisJJm1vdnoJKCR2MCwmTEIoJHMzKSk7CQkJIyAxMywxMiwxNSwxNCoKKwkmeG9yCSgkdjEsJkRXUCgyLCR0ZSwkdjAsOCkpOwkjIDE0CisJJm1vdnoJKCR2MCwmSEIoJHMwKSk7CQkJIyAgMSwgMCwgMyosIDIKKwkmYW5kCSgkczMsMHhmZmZmMDAwMCk7CQkjIDEzLDEyLCAtLCAtCisJJnhvcgkoJHYxLCZEV1AoMSwkdGUsJHYwLDgpKTsJIyAgMworCSZtb3Z6CSgkdjAsJkxCKCRzMikpOwkJCSMgIDgsMTEsMTAsIDkqCisJJm9yCSgkczMsJHMxKTsJCQkjIDEzLDEyLCA3LCA2CisJJnhvcgkoJHYxLCZEV1AoMywkdGUsJHYwLDgpKTsJIyAgOSwgdFsxXSBjb2xsZWN0ZWQKKwkmbW92CSgkczEsJHYxKTsJCQkjICBzWzFdPXRbMV0KKworCSZtb3Z6CSgkdjAsJkxCKCRzMCkpOwkJCSMgIDEsIDAsIDMsIDIqCisJJnNocgkoJHMyLDE2KTsJCQkjICAtLCAtLCA4LDExCisJJm1vdgkoJHYxLCZEV1AoMiwkdGUsJHYwLDgpKTsJIyAgMgorCSZtb3Z6CSgkdjAsJkhCKCRzMykpOwkJCSMgMTMsMTIsIDcqLCA2CisJJnhvcgkoJHYxLCZEV1AoMSwkdGUsJHYwLDgpKTsJIyAgNworCSZtb3Z6CSgkdjAsJkhCKCRzMikpOwkJCSMgIC0sIC0sIDgqLDExCisJJnhvcgkoJHYxLCZEV1AoMCwkdGUsJHYwLDgpKTsJIyAgOAorCSZtb3YJKCR2MCwkczMpOworCSZzaHIJKCR2MCwyNCk7CQkJIyAxMworCSZ4b3IJKCR2MSwmRFdQKDMsJHRlLCR2MCw4KSk7CSMgMTMsIHRbMl0gY29sbGVjdGVkCisKKwkmbW92egkoJHYwLCZMQigkczIpKTsJCQkjICAtLCAtLCA4LDExKgorCSZzaHIJKCRzMCwyNCk7CQkJIyAgMSoKKwkmbW92CSgkczIsJkRXUCgxLCR0ZSwkdjAsOCkpOwkjIDExCisJJnhvcgkoJHMyLCZEV1AoMywkdGUsJHMwLDgpKTsJIyAgMQorCSZtb3YJKCRzMCwkX19zMCk7CQkJIyBzWzBdPXRbMF0KKwkmbW92egkoJHYwLCZMQigkczMpKTsJCQkjIDEzLDEyLCA3LCA2KgorCSZzaHIJKCRzMywxNik7CQkJIyAgICwgICwxMywxMgorCSZ4b3IJKCRzMiwmRFdQKDIsJHRlLCR2MCw4KSk7CSMgIDYKKwkmbW92CSgka2V5LCRfX2tleSk7CQkJIyByZWluY2FybmF0ZSB2MCBhcyBrZXkKKwkmYW5kCSgkczMsMHhmZik7CQkJIyAgICwgICwxMywxMioKKwkmbW92CSgkczMsJkRXUCgwLCR0ZSwkczMsOCkpOwkjIDEyCisJJnhvcgkoJHMzLCRzMik7CQkJIyBzWzJdPXRbM10gY29sbGVjdGVkCisJJm1vdgkoJHMyLCR2MSk7CQkJIyBzWzJdPXRbMl0KK30KKworIyBNb3JlIGV4cGVyaW1lbnRhbCBjb2RlLi4uIFNTRSBvbmUuLi4gRXZlbiB0aG91Z2ggdGhpcyBvbmUgZWxpbWluYXRlcworIyAqYWxsKiByZWZlcmVuY2VzIHRvIHN0YWNrLCBpdCdzIG5vdCBmYXN0ZXIuLi4KK3N1YiBzc2VfZW5jYm9keSgpCit7CisJJm1vdnoJKCRhY2MsJkxCKCJlYXgiKSk7CQkjICAwCisJJm1vdgkoImVjeCIsJkRXUCgwLCR0YmwsJGFjYyw4KSk7CSMgIDAKKwkmcHNodWZ3CSgibW0yIiwibW0wIiwweDBkKTsJCSMgIDcsIDYsIDMsIDIKKwkmbW92egkoImVkeCIsJkhCKCJlYXgiKSk7CQkjICAxCisJJm1vdgkoImVkeCIsJkRXUCgzLCR0YmwsImVkeCIsOCkpOwkjICAxCisJJnNocgkoImVheCIsMTYpOwkJCSMgIDUsIDQKKworCSZtb3Z6CSgkYWNjLCZMQigiZWJ4IikpOwkJIyAxMAorCSZ4b3IJKCJlY3giLCZEV1AoMiwkdGJsLCRhY2MsOCkpOwkjIDEwCisJJnBzaHVmdwkoIm1tNiIsIm1tNCIsMHgwOCk7CQkjIDEzLDEyLCA5LCA4CisJJm1vdnoJKCRhY2MsJkhCKCJlYngiKSk7CQkjIDExCisJJnhvcgkoImVkeCIsJkRXUCgxLCR0YmwsJGFjYyw4KSk7CSMgMTEKKwkmc2hyCSgiZWJ4IiwxNik7CQkJIyAxNSwxNAorCisJJm1vdnoJKCRhY2MsJkhCKCJlYXgiKSk7CQkjICA1CisJJnhvcgkoImVjeCIsJkRXUCgzLCR0YmwsJGFjYyw4KSk7CSMgIDUKKwkmbW92cQkoIm1tMyIsUVdQKDE2LCRrZXkpKTsKKwkmbW92egkoJGFjYywmSEIoImVieCIpKTsJCSMgMTUKKwkmeG9yCSgiZWN4IiwmRFdQKDEsJHRibCwkYWNjLDgpKTsJIyAxNQorCSZtb3ZkCSgibW0wIiwiZWN4Iik7CQkJIyB0WzBdIGNvbGxlY3RlZAorCisJJm1vdnoJKCRhY2MsJkxCKCJlYXgiKSk7CQkjICA0CisJJm1vdgkoImVjeCIsJkRXUCgwLCR0YmwsJGFjYyw4KSk7CSMgIDQKKwkmbW92ZAkoImVheCIsIm1tMiIpOwkJCSMgIDcsIDYsIDMsIDIKKwkmbW92egkoJGFjYywmTEIoImVieCIpKTsJCSMgMTQKKwkmeG9yCSgiZWN4IiwmRFdQKDIsJHRibCwkYWNjLDgpKTsJIyAxNAorCSZtb3ZkCSgiZWJ4IiwibW02Iik7CQkJIyAxMywxMiwgOSwgOAorCisJJm1vdnoJKCRhY2MsJkhCKCJlYXgiKSk7CQkjICAzCisJJnhvcgkoImVjeCIsJkRXUCgxLCR0YmwsJGFjYyw4KSk7CSMgIDMKKwkmbW92egkoJGFjYywmSEIoImVieCIpKTsJCSMgIDkKKwkmeG9yCSgiZWN4IiwmRFdQKDMsJHRibCwkYWNjLDgpKTsJIyAgOQorCSZtb3ZkCSgibW0xIiwiZWN4Iik7CQkJIyB0WzFdIGNvbGxlY3RlZAorCisJJm1vdnoJKCRhY2MsJkxCKCJlYXgiKSk7CQkjICAyCisJJm1vdgkoImVjeCIsJkRXUCgyLCR0YmwsJGFjYyw4KSk7CSMgIDIKKwkmc2hyCSgiZWF4IiwxNik7CQkJIyAgNywgNgorCSZwdW5wY2tsZHEJKCJtbTAiLCJtbTEiKTsJCSMgdFswLDFdIGNvbGxlY3RlZAorCSZtb3Z6CSgkYWNjLCZMQigiZWJ4IikpOwkJIyAgOAorCSZ4b3IJKCJlY3giLCZEV1AoMCwkdGJsLCRhY2MsOCkpOwkjICA4CisJJnNocgkoImVieCIsMTYpOwkJCSMgMTMsMTIKKworCSZtb3Z6CSgkYWNjLCZIQigiZWF4IikpOwkJIyAgNworCSZ4b3IJKCJlY3giLCZEV1AoMSwkdGJsLCRhY2MsOCkpOwkjICA3CisJJnB4b3IJKCJtbTAiLCJtbTMiKTsKKwkmbW92egkoImVheCIsJkxCKCJlYXgiKSk7CQkjICA2CisJJnhvcgkoImVkeCIsJkRXUCgyLCR0YmwsImVheCIsOCkpOwkjICA2CisJJnBzaHVmdwkoIm1tMSIsIm1tMCIsMHgwOCk7CQkjICA1LCA0LCAxLCAwCisJJm1vdnoJKCRhY2MsJkhCKCJlYngiKSk7CQkjIDEzCisJJnhvcgkoImVjeCIsJkRXUCgzLCR0YmwsJGFjYyw4KSk7CSMgMTMKKwkmeG9yCSgiZWN4IiwmRFdQKDI0LCRrZXkpKTsJCSMgdFsyXQorCSZtb3ZkCSgibW00IiwiZWN4Iik7CQkJIyB0WzJdIGNvbGxlY3RlZAorCSZtb3Z6CSgiZWJ4IiwmTEIoImVieCIpKTsJCSMgMTIKKwkmeG9yCSgiZWR4IiwmRFdQKDAsJHRibCwiZWJ4Iiw4KSk7CSMgMTIKKwkmc2hyCSgiZWN4IiwxNik7CisJJm1vdmQJKCJlYXgiLCJtbTEiKTsJCQkjICA1LCA0LCAxLCAwCisJJm1vdgkoImVieCIsJkRXUCgyOCwka2V5KSk7CQkjIHRbM10KKwkmeG9yCSgiZWJ4IiwiZWR4Iik7CisJJm1vdmQJKCJtbTUiLCJlYngiKTsJCQkjIHRbM10gY29sbGVjdGVkCisJJmFuZAkoImVieCIsMHhmZmZmMDAwMCk7CisJJm9yCSgiZWJ4IiwiZWN4Iik7CisKKwkmcHVucGNrbGRxCSgibW00IiwibW01Iik7CQkjIHRbMiwzXSBjb2xsZWN0ZWQKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAiQ29tcGFjdCIgYmxvY2sgZnVuY3Rpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworc3ViIGVuY2NvbXBhY3QoKQoreyBteSAkRm4gPSBcJm1vdjsKKyAgd2hpbGUgKCQjXz41KSB7IHBvcChAXyk7ICRGbj1zdWJ7fTsgfQorICBteSAoJGksJHRlLEBzKT1AXzsKKyAgbXkgJHRtcCA9ICRrZXk7CisgIG15ICRvdXQgPSAkaT09Mz8kc1swXTokYWNjOworCisJIyAkRm4gaXMgdXNlZCBpbiBmaXJzdCBjb21wYWN0IHJvdW5kIGFuZCBpdHMgcHVycG9zZSBpcyB0bworCSMgdm9pZCByZXN0b3JhdGlvbiBvZiBzb21lIHZhbHVlcyBmcm9tIHN0YWNrLCBzbyB0aGF0IGFmdGVyCisJIyA0eGVuY2NvbXBhY3Qgd2l0aCBleHRyYSBhcmd1bWVudCAka2V5IHZhbHVlIGlzIGxlZnQgdGhlcmUuLi4KKwlpZiAoJGk9PTMpICB7CSYkRm4JKCRrZXksJF9fa2V5KTsJCQl9IyMlZWR4CisJZWxzZSAgICAgICAgewkmbW92CSgkb3V0LCRzWzBdKTsJCQl9CisJCQkmYW5kCSgkb3V0LDB4RkYpOworCWlmICgkaT09MSkgIHsJJnNocgkoJHNbMF0sMTYpOwkJCX0jJWVieFsxXQorCWlmICgkaT09MikgIHsJJnNocgkoJHNbMF0sMjQpOwkJCX0jJWVjeFsyXQorCQkJJm1vdnoJKCRvdXQsJkJQKC0xMjgsJHRlLCRvdXQsMSkpOworCisJaWYgKCRpPT0zKSAgewkkdG1wPSRzWzFdOwkJCQl9IyMlZWF4CisJCQkmbW92egkoJHRtcCwmSEIoJHNbMV0pKTsKKwkJCSZtb3Z6CSgkdG1wLCZCUCgtMTI4LCR0ZSwkdG1wLDEpKTsKKwkJCSZzaGwJKCR0bXAsOCk7CisJCQkmeG9yCSgkb3V0LCR0bXApOworCisJaWYgKCRpPT0zKSAgewkkdG1wPSRzWzJdOyAmbW92ICgkc1sxXSwkX19zMCk7CQl9IyMlZWJ4CisJZWxzZSAgICAgICAgewkmbW92CSgkdG1wLCRzWzJdKTsKKwkJCSZzaHIJKCR0bXAsMTYpOwkJCX0KKwlpZiAoJGk9PTIpICB7CSZhbmQJKCRzWzFdLDB4RkYpOwkJCX0jJWVkeFsyXQorCQkJJmFuZAkoJHRtcCwweEZGKTsKKwkJCSZtb3Z6CSgkdG1wLCZCUCgtMTI4LCR0ZSwkdG1wLDEpKTsKKwkJCSZzaGwJKCR0bXAsMTYpOworCQkJJnhvcgkoJG91dCwkdG1wKTsKKworCWlmICgkaT09MykgIHsJJHRtcD0kc1szXTsgJm1vdiAoJHNbMl0sJF9fczEpOwkJfSMjJWVjeAorCWVsc2lmKCRpPT0yKXsJJm1vdnoJKCR0bXAsJkhCKCRzWzNdKSk7CQl9IyVlYnhbMl0KKwllbHNlICAgICAgICB7CSZtb3YJKCR0bXAsJHNbM10pOworCQkJJnNocgkoJHRtcCwyNCk7CQkJfQorCQkJJm1vdnoJKCR0bXAsJkJQKC0xMjgsJHRlLCR0bXAsMSkpOworCQkJJnNobAkoJHRtcCwyNCk7CisJCQkmeG9yCSgkb3V0LCR0bXApOworCWlmICgkaTwyKSAgIHsJJm1vdgkoJkRXUCg0KzQqJGksImVzcCIpLCRvdXQpOwl9CisJaWYgKCRpPT0zKSAgewkmbW92CSgkc1szXSwkYWNjKTsJCQl9CisJJmNvbW1lbnQoKTsKK30KKworc3ViIGVuY3RyYW5zZm9ybSgpCit7IG15IEBzID0gKCRzMCwkczEsJHMyLCRzMyk7CisgIG15ICRpID0gc2hpZnQ7CisgIG15ICR0bXAgPSAkdGJsOworICBteSAkcjIgID0gJGtleSA7CisKKwkmYW5kCSgkdG1wLCRzWyRpXSk7CisJJmxlYQkoJHIyLCZEV1AoMCwkc1skaV0sJHNbJGldKSk7CisJJm1vdgkoJGFjYywkdG1wKTsKKwkmc2hyCSgkdG1wLDcpOworCSZhbmQJKCRyMiwweGZlZmVmZWZlKTsKKwkmc3ViCSgkYWNjLCR0bXApOworCSZtb3YJKCR0bXAsJHNbJGldKTsKKwkmYW5kCSgkYWNjLDB4MWIxYjFiMWIpOworCSZyb3RyCSgkdG1wLDE2KTsKKwkmeG9yCSgkYWNjLCRyMik7CSMgcjIKKwkmbW92CSgkcjIsJHNbJGldKTsKKworCSZ4b3IJKCRzWyRpXSwkYWNjKTsJIyByMCBeIHIyCisJJnJvdHIJKCRyMiwxNis4KTsKKwkmeG9yCSgkYWNjLCR0bXApOworCSZyb3RsCSgkc1skaV0sMjQpOworCSZ4b3IJKCRhY2MsJHIyKTsKKwkmbW92CSgkdG1wLDB4ODA4MDgwODApCWlmICgkaSE9MSk7CisJJnhvcgkoJHNbJGldLCRhY2MpOwkjIFJPVEFURShyMl5yMCwyNCkgXiByMgorfQorCismZnVuY3Rpb25fYmVnaW5fQigiX3g4Nl9BRVNfZW5jcnlwdF9jb21wYWN0Iik7CisJIyBub3RlIHRoYXQgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGFsbG9jYXRlIHN0YWNrIGZyYW1lIGZvciBtZSEKKwkmbW92CSgkX19rZXksJGtleSk7CQkJIyBzYXZlIGtleQorCisJJnhvcgkoJHMwLCZEV1AoMCwka2V5KSk7CQkjIHhvciB3aXRoIGtleQorCSZ4b3IJKCRzMSwmRFdQKDQsJGtleSkpOworCSZ4b3IJKCRzMiwmRFdQKDgsJGtleSkpOworCSZ4b3IJKCRzMywmRFdQKDEyLCRrZXkpKTsKKworCSZtb3YJKCRhY2MsJkRXUCgyNDAsJGtleSkpOwkJIyBsb2FkIGtleS0+cm91bmRzCisJJmxlYQkoJGFjYywmRFdQKC0yLCRhY2MsJGFjYykpOworCSZsZWEJKCRhY2MsJkRXUCgwLCRrZXksJGFjYyw4KSk7CisJJm1vdgkoJF9fZW5kLCRhY2MpOwkJCSMgZW5kIG9mIGtleSBzY2hlZHVsZQorCisJIyBwcmVmZXRjaCBUZTQKKwkmbW92CSgka2V5LCZEV1AoMC0xMjgsJHRibCkpOworCSZtb3YJKCRhY2MsJkRXUCgzMi0xMjgsJHRibCkpOworCSZtb3YJKCRrZXksJkRXUCg2NC0xMjgsJHRibCkpOworCSZtb3YJKCRhY2MsJkRXUCg5Ni0xMjgsJHRibCkpOworCSZtb3YJKCRrZXksJkRXUCgxMjgtMTI4LCR0YmwpKTsKKwkmbW92CSgkYWNjLCZEV1AoMTYwLTEyOCwkdGJsKSk7CisJJm1vdgkoJGtleSwmRFdQKDE5Mi0xMjgsJHRibCkpOworCSZtb3YJKCRhY2MsJkRXUCgyMjQtMTI4LCR0YmwpKTsKKworCSZzZXRfbGFiZWwoImxvb3AiLDE2KTsKKworCQkmZW5jY29tcGFjdCgwLCR0YmwsJHMwLCRzMSwkczIsJHMzLDEpOworCQkmZW5jY29tcGFjdCgxLCR0YmwsJHMxLCRzMiwkczMsJHMwLDEpOworCQkmZW5jY29tcGFjdCgyLCR0YmwsJHMyLCRzMywkczAsJHMxLDEpOworCQkmZW5jY29tcGFjdCgzLCR0YmwsJHMzLCRzMCwkczEsJHMyLDEpOworCQkmbW92CSgkdGJsLDB4ODA4MDgwODApOworCQkmZW5jdHJhbnNmb3JtKDIpOworCQkmZW5jdHJhbnNmb3JtKDMpOworCQkmZW5jdHJhbnNmb3JtKDApOworCQkmZW5jdHJhbnNmb3JtKDEpOworCQkmbW92IAkoJGtleSwkX19rZXkpOworCQkmbW92CSgkdGJsLCRfX3RibCk7CisJCSZhZGQJKCRrZXksMTYpOwkJIyBhZHZhbmNlIHJkX2tleQorCQkmeG9yCSgkczAsJkRXUCgwLCRrZXkpKTsKKwkJJnhvcgkoJHMxLCZEV1AoNCwka2V5KSk7CisJCSZ4b3IJKCRzMiwmRFdQKDgsJGtleSkpOworCQkmeG9yCSgkczMsJkRXUCgxMiwka2V5KSk7CisKKwkmY21wCSgka2V5LCRfX2VuZCk7CisJJm1vdgkoJF9fa2V5LCRrZXkpOworCSZqYgkoJmxhYmVsKCJsb29wIikpOworCisJJmVuY2NvbXBhY3QoMCwkdGJsLCRzMCwkczEsJHMyLCRzMyk7CisJJmVuY2NvbXBhY3QoMSwkdGJsLCRzMSwkczIsJHMzLCRzMCk7CisJJmVuY2NvbXBhY3QoMiwkdGJsLCRzMiwkczMsJHMwLCRzMSk7CisJJmVuY2NvbXBhY3QoMywkdGJsLCRzMywkczAsJHMxLCRzMik7CisKKwkmeG9yCSgkczAsJkRXUCgxNiwka2V5KSk7CisJJnhvcgkoJHMxLCZEV1AoMjAsJGtleSkpOworCSZ4b3IJKCRzMiwmRFdQKDI0LCRrZXkpKTsKKwkmeG9yCSgkczMsJkRXUCgyOCwka2V5KSk7CisKKwkmcmV0CSgpOworJmZ1bmN0aW9uX2VuZF9CKCJfeDg2X0FFU19lbmNyeXB0X2NvbXBhY3QiKTsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAiQ29tcGFjdCIgU1NFIGJsb2NrIGZ1bmN0aW9uLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBQZXJmb3JtYW5jZSBpcyBub3QgYWN0dWFsbHkgZXh0cmFvcmRpbmFyeSBpbiBjb21wYXJpc29uIHRvIHB1cmUKKyMgeDg2IGNvZGUuIEluIHBhcnRpY3VsYXIgZW5jcnlwdCBwZXJmb3JtYW5jZSBpcyB2aXJ0dWFsbHkgdGhlIHNhbWUuCisjIERlY3J5cHQgcGVyZm9ybWFuY2Ugb24gdGhlIG90aGVyIGhhbmQgaXMgMTUtMjAlIGJldHRlciBvbiBuZXdlcgorIyC1LWFyY2hzIFtidXQgd2UncmUgdGhhbmtmdWwgZm9yICphbnkqIGltcHJvdmVtZW50IGhlcmVdLCBhbmQgfjUwJQorIyBiZXR0ZXIgb24gUElJSTotKSBBbmQgYWRkaXRpb25hbGx5IG9uIHRoZSBwcm9zIHNpZGUgdGhpcyBjb2RlCisjIGVsaW1pbmF0ZXMgcmVkdW5kYW50IHJlZmVyZW5jZXMgdG8gc3RhY2sgYW5kIHRodXMgcmVsaWV2ZXMvCisjIG1pbmltaXplcyB0aGUgcHJlc3N1cmUgb24gdGhlIG1lbW9yeSBidXMuCisjCisjIE1NWCByZWdpc3RlciBsYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICBsc2IKKyMgKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKworIyB8ICAgICAgICAgIG1tNCAgICAgICAgICB8ICAgICAgICAgIG1tMCAgICAgICAgICB8CisjICstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSsKKyMgfCAgICAgczMgICAgfCAgICAgczIgICAgfCAgICAgczEgICAgfCAgICAgczAgICAgfCAgICAKKyMgKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKworIyB8MTV8MTR8MTN8MTJ8MTF8MTB8IDl8IDh8IDd8IDZ8IDV8IDR8IDN8IDJ8IDF8IDB8CisjICstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSsKKyMKKyMgSW5kZXhlcyB0cmFuc2xhdGUgYXMgc1tOLzRdPj4oOCooTiU0KSksIGUuZy4gNSBtZWFucyBzMT4+OC4KKyMgSW4gdGhpcyB0ZXJtcyBlbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uICJjb21wYWN0IiBwZXJtdXRhdGlvbgorIyBtYXRyaWNlcyBjYW4gYmUgZGVwaWN0ZWQgYXMgZm9sbG93aW5nOgorIworIyBlbmNyeXB0aW9uICAgICAgICAgICAgICBsc2IJIyBkZWNyeXB0aW9uICAgICAgICAgICAgICBsc2IKKyMgKy0tLS0rKy0tLS0rLS0tLSstLS0tKy0tLS0rCSMgKy0tLS0rKy0tLS0rLS0tLSstLS0tKy0tLS0rCisjIHwgdDAgfHwgMTUgfCAxMCB8ICA1IHwgIDAgfAkjIHwgdDAgfHwgIDcgfCAxMCB8IDEzIHwgIDAgfAorIyArLS0tLSsrLS0tLSstLS0tKy0tLS0rLS0tLSsJIyArLS0tLSsrLS0tLSstLS0tKy0tLS0rLS0tLSsKKyMgfCB0MSB8fCAgMyB8IDE0IHwgIDkgfCAgNCB8CSMgfCB0MSB8fCAxMSB8IDE0IHwgIDEgfCAgNCB8CisjICstLS0tKystLS0tKy0tLS0rLS0tLSstLS0tKwkjICstLS0tKystLS0tKy0tLS0rLS0tLSstLS0tKworIyB8IHQyIHx8ICA3IHwgIDIgfCAxMyB8ICA4IHwJIyB8IHQyIHx8IDE1IHwgIDIgfCAgNSB8ICA4IHwKKyMgKy0tLS0rKy0tLS0rLS0tLSstLS0tKy0tLS0rCSMgKy0tLS0rKy0tLS0rLS0tLSstLS0tKy0tLS0rCisjIHwgdDMgfHwgMTEgfCAgNiB8ICAxIHwgMTIgfAkjIHwgdDMgfHwgIDMgfCAgNiB8ICA5IHwgMTIgfAorIyArLS0tLSsrLS0tLSstLS0tKy0tLS0rLS0tLSsJIyArLS0tLSsrLS0tLSstLS0tKy0tLS0rLS0tLSsKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgV2h5IG5vdCB4bW0gcmVnaXN0ZXJzPyBTaG9ydCBhbnN3ZXIuIEl0IHdhcyBhY3R1YWxseSB0ZXN0ZWQgYW5kCisjIHdhcyBub3QgYW55IGZhc3RlciwgYnV0ICpjb250cmFyeSosIG1vc3Qgbm90YWJseSBvbiBJbnRlbCBDUFVzLgorIyBMb25nZXIgYW5zd2VyLiBNYWluIGFkdmFudGFnZSBvZiB1c2luZyBtbSByZWdpc3RlcnMgaXMgdGhhdCBtb3ZkCisjIGxhdGVuY3kgaXMgbG93ZXIsIGVzcGVjaWFsbHkgb24gSW50ZWwgUDQuIFdoaWxlIGFyaXRobWV0aWMKKyMgaW5zdHJ1Y3Rpb25zIGFyZSB0d2ljZSBhcyBtYW55LCB0aGV5IGNhbiBiZSBzY2hlZHVsZWQgZXZlcnkgY3ljbGUKKyMgYW5kIG5vdCBldmVyeSBzZWNvbmQgb25lIHdoZW4gdGhleSBhcmUgb3BlcmF0aW5nIG9uIHhtbSByZWdpc3RlciwKKyMgc28gdGhhdCAiYXJpdGhtZXRpYyB0aHJvdWdocHV0IiByZW1haW5zIHZpcnR1YWxseSB0aGUgc2FtZS4gQW5kCisjIGZpbmFsbHkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkIGV2ZW4gb24gZWxkZXIgU1NFLW9ubHkgQ1BVczotKQorCitzdWIgc3NlX2VuY2NvbXBhY3QoKQoreworCSZwc2h1ZncJKCJtbTEiLCJtbTAiLDB4MDgpOwkJIyAgNSwgNCwgMSwgMAorCSZwc2h1ZncJKCJtbTUiLCJtbTQiLDB4MGQpOwkJIyAxNSwxNCwxMSwxMAorCSZtb3ZkCSgiZWF4IiwibW0xIik7CQkJIyAgNSwgNCwgMSwgMAorCSZtb3ZkCSgiZWJ4IiwibW01Iik7CQkJIyAxNSwxNCwxMSwxMAorCSZtb3YJKCRfX2tleSwka2V5KTsKKworCSZtb3Z6CSgkYWNjLCZMQigiZWF4IikpOwkJIyAgMAorCSZtb3Z6CSgiZWR4IiwmSEIoImVheCIpKTsJCSMgIDEKKwkmcHNodWZ3CSgibW0yIiwibW0wIiwweDBkKTsJCSMgIDcsIDYsIDMsIDIKKwkmbW92egkoImVjeCIsJkJQKC0xMjgsJHRibCwkYWNjLDEpKTsJIyAgMAorCSZtb3Z6CSgka2V5LCZMQigiZWJ4IikpOwkJIyAxMAorCSZtb3Z6CSgiZWR4IiwmQlAoLTEyOCwkdGJsLCJlZHgiLDEpKTsJIyAgMQorCSZzaHIJKCJlYXgiLDE2KTsJCQkjICA1LCA0CisJJnNobAkoImVkeCIsOCk7CQkJIyAgMQorCisJJm1vdnoJKCRhY2MsJkJQKC0xMjgsJHRibCwka2V5LDEpKTsJIyAxMAorCSZtb3Z6CSgka2V5LCZIQigiZWJ4IikpOwkJIyAxMQorCSZzaGwJKCRhY2MsMTYpOwkJCSMgMTAKKwkmcHNodWZ3CSgibW02IiwibW00IiwweDA4KTsJCSMgMTMsMTIsIDksIDgKKwkmb3IJKCJlY3giLCRhY2MpOwkJCSMgMTAKKwkmbW92egkoJGFjYywmQlAoLTEyOCwkdGJsLCRrZXksMSkpOwkjIDExCisJJm1vdnoJKCRrZXksJkhCKCJlYXgiKSk7CQkjICA1CisJJnNobAkoJGFjYywyNCk7CQkJIyAxMQorCSZzaHIJKCJlYngiLDE2KTsJCQkjIDE1LDE0CisJJm9yCSgiZWR4IiwkYWNjKTsJCQkjIDExCisKKwkmbW92egkoJGFjYywmQlAoLTEyOCwkdGJsLCRrZXksMSkpOwkjICA1CisJJm1vdnoJKCRrZXksJkhCKCJlYngiKSk7CQkjIDE1CisJJnNobAkoJGFjYyw4KTsJCQkjICA1CisJJm9yCSgiZWN4IiwkYWNjKTsJCQkjICA1CisJJm1vdnoJKCRhY2MsJkJQKC0xMjgsJHRibCwka2V5LDEpKTsJIyAxNQorCSZtb3Z6CSgka2V5LCZMQigiZWF4IikpOwkJIyAgNAorCSZzaGwJKCRhY2MsMjQpOwkJCSMgMTUKKwkmb3IJKCJlY3giLCRhY2MpOwkJCSMgMTUKKworCSZtb3Z6CSgkYWNjLCZCUCgtMTI4LCR0YmwsJGtleSwxKSk7CSMgIDQKKwkmbW92egkoJGtleSwmTEIoImVieCIpKTsJCSMgMTQKKwkmbW92ZAkoImVheCIsIm1tMiIpOwkJCSMgIDcsIDYsIDMsIDIKKwkmbW92ZAkoIm1tMCIsImVjeCIpOwkJCSMgdFswXSBjb2xsZWN0ZWQKKwkmbW92egkoImVjeCIsJkJQKC0xMjgsJHRibCwka2V5LDEpKTsJIyAxNAorCSZtb3Z6CSgka2V5LCZIQigiZWF4IikpOwkJIyAgMworCSZzaGwJKCJlY3giLDE2KTsJCQkjIDE0CisJJm1vdmQJKCJlYngiLCJtbTYiKTsJCQkjIDEzLDEyLCA5LCA4CisJJm9yCSgiZWN4IiwkYWNjKTsJCQkjIDE0CisKKwkmbW92egkoJGFjYywmQlAoLTEyOCwkdGJsLCRrZXksMSkpOwkjICAzCisJJm1vdnoJKCRrZXksJkhCKCJlYngiKSk7CQkjICA5CisJJnNobAkoJGFjYywyNCk7CQkJIyAgMworCSZvcgkoImVjeCIsJGFjYyk7CQkJIyAgMworCSZtb3Z6CSgkYWNjLCZCUCgtMTI4LCR0YmwsJGtleSwxKSk7CSMgIDkKKwkmbW92egkoJGtleSwmTEIoImVieCIpKTsJCSMgIDgKKwkmc2hsCSgkYWNjLDgpOwkJCSMgIDkKKwkmc2hyCSgiZWJ4IiwxNik7CQkJIyAxMywxMgorCSZvcgkoImVjeCIsJGFjYyk7CQkJIyAgOQorCisJJm1vdnoJKCRhY2MsJkJQKC0xMjgsJHRibCwka2V5LDEpKTsJIyAgOAorCSZtb3Z6CSgka2V5LCZMQigiZWF4IikpOwkJIyAgMgorCSZzaHIJKCJlYXgiLDE2KTsJCQkjICA3LCA2CisJJm1vdmQJKCJtbTEiLCJlY3giKTsJCQkjIHRbMV0gY29sbGVjdGVkCisJJm1vdnoJKCJlY3giLCZCUCgtMTI4LCR0YmwsJGtleSwxKSk7CSMgIDIKKwkmbW92egkoJGtleSwmSEIoImVheCIpKTsJCSMgIDcKKwkmc2hsCSgiZWN4IiwxNik7CQkJIyAgMgorCSZhbmQJKCJlYXgiLDB4ZmYpOwkJCSMgIDYKKwkmb3IJKCJlY3giLCRhY2MpOwkJCSMgIDIKKworCSZwdW5wY2tsZHEJKCJtbTAiLCJtbTEiKTsJCSMgdFswLDFdIGNvbGxlY3RlZAorCisJJm1vdnoJKCRhY2MsJkJQKC0xMjgsJHRibCwka2V5LDEpKTsJIyAgNworCSZtb3Z6CSgka2V5LCZIQigiZWJ4IikpOwkJIyAxMworCSZzaGwJKCRhY2MsMjQpOwkJCSMgIDcKKwkmYW5kCSgiZWJ4IiwweGZmKTsJCQkjIDEyCisJJm1vdnoJKCJlYXgiLCZCUCgtMTI4LCR0YmwsImVheCIsMSkpOwkjICA2CisJJm9yCSgiZWN4IiwkYWNjKTsJCQkjICA3CisJJnNobAkoImVheCIsMTYpOwkJCSMgIDYKKwkmbW92egkoJGFjYywmQlAoLTEyOCwkdGJsLCRrZXksMSkpOwkjIDEzCisJJm9yCSgiZWR4IiwiZWF4Iik7CQkJIyAgNgorCSZzaGwJKCRhY2MsOCk7CQkJIyAxMworCSZtb3Z6CSgiZWJ4IiwmQlAoLTEyOCwkdGJsLCJlYngiLDEpKTsJIyAxMgorCSZvcgkoImVjeCIsJGFjYyk7CQkJIyAxMworCSZvcgkoImVkeCIsImVieCIpOwkJCSMgMTIKKwkmbW92CSgka2V5LCRfX2tleSk7CisJJm1vdmQJKCJtbTQiLCJlY3giKTsJCQkjIHRbMl0gY29sbGVjdGVkCisJJm1vdmQJKCJtbTUiLCJlZHgiKTsJCQkjIHRbM10gY29sbGVjdGVkCisKKwkmcHVucGNrbGRxCSgibW00IiwibW01Iik7CQkjIHRbMiwzXSBjb2xsZWN0ZWQKK30KKworCQkJCQlpZiAoISR4ODZvbmx5KSB7CismZnVuY3Rpb25fYmVnaW5fQigiX3NzZV9BRVNfZW5jcnlwdF9jb21wYWN0Iik7CisJJnB4b3IJKCJtbTAiLCZRV1AoMCwka2V5KSk7CSMgIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDAKKwkmcHhvcgkoIm1tNCIsJlFXUCg4LCRrZXkpKTsJIyAxNSwxNCwxMywxMiwxMSwxMCwgOSwgOAorCisJIyBub3RlIHRoYXQgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGFsbG9jYXRlIHN0YWNrIGZyYW1lIGZvciBtZSEKKwkmbW92CSgkYWNjLCZEV1AoMjQwLCRrZXkpKTsJCSMgbG9hZCBrZXktPnJvdW5kcworCSZsZWEJKCRhY2MsJkRXUCgtMiwkYWNjLCRhY2MpKTsKKwkmbGVhCSgkYWNjLCZEV1AoMCwka2V5LCRhY2MsOCkpOworCSZtb3YJKCRfX2VuZCwkYWNjKTsJCQkjIGVuZCBvZiBrZXkgc2NoZWR1bGUKKworCSZtb3YJKCRzMCwweDFiMWIxYjFiKTsJCSMgbWFnaWMgY29uc3RhbnQKKwkmbW92CSgmRFdQKDgsImVzcCIpLCRzMCk7CisJJm1vdgkoJkRXUCgxMiwiZXNwIiksJHMwKTsKKworCSMgcHJlZmV0Y2ggVGU0CisJJm1vdgkoJHMwLCZEV1AoMC0xMjgsJHRibCkpOworCSZtb3YJKCRzMSwmRFdQKDMyLTEyOCwkdGJsKSk7CisJJm1vdgkoJHMyLCZEV1AoNjQtMTI4LCR0YmwpKTsKKwkmbW92CSgkczMsJkRXUCg5Ni0xMjgsJHRibCkpOworCSZtb3YJKCRzMCwmRFdQKDEyOC0xMjgsJHRibCkpOworCSZtb3YJKCRzMSwmRFdQKDE2MC0xMjgsJHRibCkpOworCSZtb3YJKCRzMiwmRFdQKDE5Mi0xMjgsJHRibCkpOworCSZtb3YJKCRzMywmRFdQKDIyNC0xMjgsJHRibCkpOworCisJJnNldF9sYWJlbCgibG9vcCIsMTYpOworCQkmc3NlX2VuY2NvbXBhY3QoKTsKKwkJJmFkZAkoJGtleSwxNik7CisJCSZjbXAJKCRrZXksJF9fZW5kKTsKKwkJJmphCSgmbGFiZWwoIm91dCIpKTsKKworCQkmbW92cQkoIm1tMiIsJlFXUCg4LCJlc3AiKSk7CisJCSZweG9yCSgibW0zIiwibW0zIik7CQkmcHhvcgkoIm1tNyIsIm1tNyIpOworCQkmbW92cQkoIm1tMSIsIm1tMCIpOwkJJm1vdnEJKCJtbTUiLCJtbTQiKTsJIyByMAorCQkmcGNtcGd0YigibW0zIiwibW0wIik7CQkmcGNtcGd0YigibW03IiwibW00Iik7CisJCSZwYW5kCSgibW0zIiwibW0yIik7CQkmcGFuZAkoIm1tNyIsIm1tMiIpOworCQkmcHNodWZ3CSgibW0yIiwibW0wIiwweGIxKTsJJnBzaHVmdwkoIm1tNiIsIm1tNCIsMHhiMSk7IyBST1RBVEUocjAsMTYpCisJCSZwYWRkYgkoIm1tMCIsIm1tMCIpOwkJJnBhZGRiCSgibW00IiwibW00Iik7CisJCSZweG9yCSgibW0wIiwibW0zIik7CQkmcHhvcgkoIm1tNCIsIm1tNyIpOwkjID0gcjIKKwkJJnBzaHVmdwkoIm1tMyIsIm1tMiIsMHhiMSk7CSZwc2h1ZncJKCJtbTciLCJtbTYiLDB4YjEpOyMgcjAKKwkJJnB4b3IJKCJtbTEiLCJtbTAiKTsJCSZweG9yCSgibW01IiwibW00Iik7CSMgcjBecjIKKwkJJnB4b3IJKCJtbTAiLCJtbTIiKTsJCSZweG9yCSgibW00IiwibW02Iik7CSMgXj0gUk9UQVRFKHIwLDE2KQorCisJCSZtb3ZxCSgibW0yIiwibW0zIik7CQkmbW92cQkoIm1tNiIsIm1tNyIpOworCQkmcHNsbGQJKCJtbTMiLDgpOwkJJnBzbGxkCSgibW03Iiw4KTsKKwkJJnBzcmxkCSgibW0yIiwyNCk7CQkmcHNybGQJKCJtbTYiLDI0KTsKKwkJJnB4b3IJKCJtbTAiLCJtbTMiKTsJCSZweG9yCSgibW00IiwibW03Iik7CSMgXj0gcjA8PDgKKwkJJnB4b3IJKCJtbTAiLCJtbTIiKTsJCSZweG9yCSgibW00IiwibW02Iik7CSMgXj0gcjA+PjI0CisKKwkJJm1vdnEJKCJtbTMiLCJtbTEiKTsJCSZtb3ZxCSgibW03IiwibW01Iik7CisJCSZtb3ZxCSgibW0yIiwmUVdQKDAsJGtleSkpOwkmbW92cQkoIm1tNiIsJlFXUCg4LCRrZXkpKTsKKwkJJnBzcmxkCSgibW0xIiw4KTsJCSZwc3JsZAkoIm1tNSIsOCk7CisJCSZtb3YJKCRzMCwmRFdQKDAtMTI4LCR0YmwpKTsKKwkJJnBzbGxkCSgibW0zIiwyNCk7CQkmcHNsbGQJKCJtbTciLDI0KTsKKwkJJm1vdgkoJHMxLCZEV1AoNjQtMTI4LCR0YmwpKTsKKwkJJnB4b3IJKCJtbTAiLCJtbTEiKTsJCSZweG9yCSgibW00IiwibW01Iik7CSMgXj0gKHIyXnIwKTw8OAorCQkmbW92CSgkczIsJkRXUCgxMjgtMTI4LCR0YmwpKTsKKwkJJnB4b3IJKCJtbTAiLCJtbTMiKTsJCSZweG9yCSgibW00IiwibW03Iik7CSMgXj0gKHIyXnIwKT4+MjQKKwkJJm1vdgkoJHMzLCZEV1AoMTkyLTEyOCwkdGJsKSk7CisKKwkJJnB4b3IJKCJtbTAiLCJtbTIiKTsJCSZweG9yCSgibW00IiwibW02Iik7CisJJmptcAkoJmxhYmVsKCJsb29wIikpOworCisJJnNldF9sYWJlbCgib3V0IiwxNik7CisJJnB4b3IJKCJtbTAiLCZRV1AoMCwka2V5KSk7CisJJnB4b3IJKCJtbTQiLCZRV1AoOCwka2V5KSk7CisKKwkmcmV0CSgpOworJmZ1bmN0aW9uX2VuZF9CKCJfc3NlX0FFU19lbmNyeXB0X2NvbXBhY3QiKTsKKwkJCQkJfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFZhbmlsbGEgYmxvY2sgZnVuY3Rpb24uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK3N1YiBlbmNzdGVwKCkKK3sgbXkgKCRpLCR0ZSxAcykgPSBAXzsKKyAgbXkgJHRtcCA9ICRrZXk7CisgIG15ICRvdXQgPSAkaT09Mz8kc1swXTokYWNjOworCisJIyBsaW5lcyBtYXJrZWQgd2l0aCAjJWU/eFtpXSBkZW5vdGUgInJlb3JkZXJlZCIgaW5zdHJ1Y3Rpb25zLi4uCisJaWYgKCRpPT0zKSAgewkmbW92CSgka2V5LCRfX2tleSk7CQkJfSMjJWVkeAorCWVsc2UgICAgICAgIHsJJm1vdgkoJG91dCwkc1swXSk7CisJCQkmYW5kCSgkb3V0LDB4RkYpOwkJCX0KKwlpZiAoJGk9PTEpICB7CSZzaHIJKCRzWzBdLDE2KTsJCQl9IyVlYnhbMV0KKwlpZiAoJGk9PTIpICB7CSZzaHIJKCRzWzBdLDI0KTsJCQl9IyVlY3hbMl0KKwkJCSZtb3YJKCRvdXQsJkRXUCgwLCR0ZSwkb3V0LDgpKTsKKworCWlmICgkaT09MykgIHsJJHRtcD0kc1sxXTsJCQkJfSMjJWVheAorCQkJJm1vdnoJKCR0bXAsJkhCKCRzWzFdKSk7CisJCQkmeG9yCSgkb3V0LCZEV1AoMywkdGUsJHRtcCw4KSk7CisKKwlpZiAoJGk9PTMpICB7CSR0bXA9JHNbMl07ICZtb3YgKCRzWzFdLCRfX3MwKTsJCX0jIyVlYngKKwllbHNlICAgICAgICB7CSZtb3YJKCR0bXAsJHNbMl0pOworCQkJJnNocgkoJHRtcCwxNik7CQkJfQorCWlmICgkaT09MikgIHsJJmFuZAkoJHNbMV0sMHhGRik7CQkJfSMlZWR4WzJdCisJCQkmYW5kCSgkdG1wLDB4RkYpOworCQkJJnhvcgkoJG91dCwmRFdQKDIsJHRlLCR0bXAsOCkpOworCisJaWYgKCRpPT0zKSAgewkkdG1wPSRzWzNdOyAmbW92ICgkc1syXSwkX19zMSk7CQl9IyMlZWN4CisJZWxzaWYoJGk9PTIpewkmbW92egkoJHRtcCwmSEIoJHNbM10pKTsJCX0jJWVieFsyXQorCWVsc2UgICAgICAgIHsJJm1vdgkoJHRtcCwkc1szXSk7IAorCQkJJnNocgkoJHRtcCwyNCkJCQl9CisJCQkmeG9yCSgkb3V0LCZEV1AoMSwkdGUsJHRtcCw4KSk7CisJaWYgKCRpPDIpICAgewkmbW92CSgmRFdQKDQrNCokaSwiZXNwIiksJG91dCk7CX0KKwlpZiAoJGk9PTMpICB7CSZtb3YJKCRzWzNdLCRhY2MpOwkJCX0KKwkJCSZjb21tZW50KCk7Cit9CisKK3N1YiBlbmNsYXN0KCkKK3sgbXkgKCRpLCR0ZSxAcyk9QF87CisgIG15ICR0bXAgPSAka2V5OworICBteSAkb3V0ID0gJGk9PTM/JHNbMF06JGFjYzsKKworCWlmICgkaT09MykgIHsJJm1vdgkoJGtleSwkX19rZXkpOwkJCX0jIyVlZHgKKwllbHNlICAgICAgICB7CSZtb3YJKCRvdXQsJHNbMF0pOwkJCX0KKwkJCSZhbmQJKCRvdXQsMHhGRik7CisJaWYgKCRpPT0xKSAgewkmc2hyCSgkc1swXSwxNik7CQkJfSMlZWJ4WzFdCisJaWYgKCRpPT0yKSAgewkmc2hyCSgkc1swXSwyNCk7CQkJfSMlZWN4WzJdCisJCQkmbW92CSgkb3V0LCZEV1AoMiwkdGUsJG91dCw4KSk7CisJCQkmYW5kCSgkb3V0LDB4MDAwMDAwZmYpOworCisJaWYgKCRpPT0zKSAgewkkdG1wPSRzWzFdOwkJCQl9IyMlZWF4CisJCQkmbW92egkoJHRtcCwmSEIoJHNbMV0pKTsKKwkJCSZtb3YJKCR0bXAsJkRXUCgwLCR0ZSwkdG1wLDgpKTsKKwkJCSZhbmQJKCR0bXAsMHgwMDAwZmYwMCk7CisJCQkmeG9yCSgkb3V0LCR0bXApOworCisJaWYgKCRpPT0zKSAgewkkdG1wPSRzWzJdOyAmbW92ICgkc1sxXSwkX19zMCk7CQl9IyMlZWJ4CisJZWxzZSAgICAgICAgewkmbW92CSgkdG1wLCRzWzJdKTsKKwkJCSZzaHIJKCR0bXAsMTYpOwkJCX0KKwlpZiAoJGk9PTIpICB7CSZhbmQJKCRzWzFdLDB4RkYpOwkJCX0jJWVkeFsyXQorCQkJJmFuZAkoJHRtcCwweEZGKTsKKwkJCSZtb3YJKCR0bXAsJkRXUCgwLCR0ZSwkdG1wLDgpKTsKKwkJCSZhbmQJKCR0bXAsMHgwMGZmMDAwMCk7CisJCQkmeG9yCSgkb3V0LCR0bXApOworCisJaWYgKCRpPT0zKSAgewkkdG1wPSRzWzNdOyAmbW92ICgkc1syXSwkX19zMSk7CQl9IyMlZWN4CisJZWxzaWYoJGk9PTIpewkmbW92egkoJHRtcCwmSEIoJHNbM10pKTsJCX0jJWVieFsyXQorCWVsc2UgICAgICAgIHsJJm1vdgkoJHRtcCwkc1szXSk7CisJCQkmc2hyCSgkdG1wLDI0KTsJCQl9CisJCQkmbW92CSgkdG1wLCZEV1AoMiwkdGUsJHRtcCw4KSk7CisJCQkmYW5kCSgkdG1wLDB4ZmYwMDAwMDApOworCQkJJnhvcgkoJG91dCwkdG1wKTsKKwlpZiAoJGk8MikgICB7CSZtb3YJKCZEV1AoNCs0KiRpLCJlc3AiKSwkb3V0KTsJfQorCWlmICgkaT09MykgIHsJJm1vdgkoJHNbM10sJGFjYyk7CQkJfQorfQorCismZnVuY3Rpb25fYmVnaW5fQigiX3g4Nl9BRVNfZW5jcnlwdCIpOworCWlmICgkdmVydGljYWxfc3BpbikgeworCQkjIEkgbmVlZCBoaWdoIHBhcnRzIG9mIHZvbGF0aWxlIHJlZ2lzdGVycyB0byBiZSBhY2Nlc3NpYmxlLi4uCisJCSZleGNoCSgkczE9ImVkaSIsJGtleT0iZWJ4Iik7CisJCSZtb3YJKCRzMj0iZXNpIiwkYWNjPSJlY3giKTsKKwl9CisKKwkjIG5vdGUgdGhhdCBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gYWxsb2NhdGUgc3RhY2sgZnJhbWUgZm9yIG1lIQorCSZtb3YJKCRfX2tleSwka2V5KTsJCQkjIHNhdmUga2V5CisKKwkmeG9yCSgkczAsJkRXUCgwLCRrZXkpKTsJCSMgeG9yIHdpdGgga2V5CisJJnhvcgkoJHMxLCZEV1AoNCwka2V5KSk7CisJJnhvcgkoJHMyLCZEV1AoOCwka2V5KSk7CisJJnhvcgkoJHMzLCZEV1AoMTIsJGtleSkpOworCisJJm1vdgkoJGFjYywmRFdQKDI0MCwka2V5KSk7CQkjIGxvYWQga2V5LT5yb3VuZHMKKworCWlmICgkc21hbGxfZm9vdHByaW50KSB7CisJICAgICZsZWEJKCRhY2MsJkRXUCgtMiwkYWNjLCRhY2MpKTsKKwkgICAgJmxlYQkoJGFjYywmRFdQKDAsJGtleSwkYWNjLDgpKTsKKwkgICAgJm1vdgkoJF9fZW5kLCRhY2MpOwkJIyBlbmQgb2Yga2V5IHNjaGVkdWxlCisKKwkgICAgJnNldF9sYWJlbCgibG9vcCIsMTYpOworCQlpZiAoJHZlcnRpY2FsX3NwaW4pIHsKKwkJICAgICZlbmN2ZXJ0KCR0YmwsJHMwLCRzMSwkczIsJHMzKTsKKwkJfSBlbHNlIHsKKwkJICAgICZlbmNzdGVwKDAsJHRibCwkczAsJHMxLCRzMiwkczMpOworCQkgICAgJmVuY3N0ZXAoMSwkdGJsLCRzMSwkczIsJHMzLCRzMCk7CisJCSAgICAmZW5jc3RlcCgyLCR0YmwsJHMyLCRzMywkczAsJHMxKTsKKwkJICAgICZlbmNzdGVwKDMsJHRibCwkczMsJHMwLCRzMSwkczIpOworCQl9CisJCSZhZGQJKCRrZXksMTYpOwkJIyBhZHZhbmNlIHJkX2tleQorCQkmeG9yCSgkczAsJkRXUCgwLCRrZXkpKTsKKwkJJnhvcgkoJHMxLCZEV1AoNCwka2V5KSk7CisJCSZ4b3IJKCRzMiwmRFdQKDgsJGtleSkpOworCQkmeG9yCSgkczMsJkRXUCgxMiwka2V5KSk7CisJICAgICZjbXAJKCRrZXksJF9fZW5kKTsKKwkgICAgJm1vdgkoJF9fa2V5LCRrZXkpOworCSAgICAmamIJCSgmbGFiZWwoImxvb3AiKSk7CisJfQorCWVsc2UgeworCSAgICAmY21wCSgkYWNjLDEwKTsKKwkgICAgJmpsZQkoJmxhYmVsKCIxMHJvdW5kcyIpKTsKKwkgICAgJmNtcAkoJGFjYywxMik7CisJICAgICZqbGUJKCZsYWJlbCgiMTJyb3VuZHMiKSk7CisKKwkmc2V0X2xhYmVsKCIxNHJvdW5kcyIsNCk7CisJICAgIGZvciAoJGk9MTskaTwzOyRpKyspIHsKKwkJaWYgKCR2ZXJ0aWNhbF9zcGluKSB7CisJCSAgICAmZW5jdmVydCgkdGJsLCRzMCwkczEsJHMyLCRzMyk7CisJCX0gZWxzZSB7CisJCSAgICAmZW5jc3RlcCgwLCR0YmwsJHMwLCRzMSwkczIsJHMzKTsKKwkJICAgICZlbmNzdGVwKDEsJHRibCwkczEsJHMyLCRzMywkczApOworCQkgICAgJmVuY3N0ZXAoMiwkdGJsLCRzMiwkczMsJHMwLCRzMSk7CisJCSAgICAmZW5jc3RlcCgzLCR0YmwsJHMzLCRzMCwkczEsJHMyKTsKKwkJfQorCQkmeG9yCSgkczAsJkRXUCgxNiokaSswLCRrZXkpKTsKKwkJJnhvcgkoJHMxLCZEV1AoMTYqJGkrNCwka2V5KSk7CisJCSZ4b3IJKCRzMiwmRFdQKDE2KiRpKzgsJGtleSkpOworCQkmeG9yCSgkczMsJkRXUCgxNiokaSsxMiwka2V5KSk7CisJICAgIH0KKwkgICAgJmFkZAkoJGtleSwzMik7CisJICAgICZtb3YJKCRfX2tleSwka2V5KTsJCSMgYWR2YW5jZSByZF9rZXkKKwkmc2V0X2xhYmVsKCIxMnJvdW5kcyIsNCk7CisJICAgIGZvciAoJGk9MTskaTwzOyRpKyspIHsKKwkJaWYgKCR2ZXJ0aWNhbF9zcGluKSB7CisJCSAgICAmZW5jdmVydCgkdGJsLCRzMCwkczEsJHMyLCRzMyk7CisJCX0gZWxzZSB7CisJCSAgICAmZW5jc3RlcCgwLCR0YmwsJHMwLCRzMSwkczIsJHMzKTsKKwkJICAgICZlbmNzdGVwKDEsJHRibCwkczEsJHMyLCRzMywkczApOworCQkgICAgJmVuY3N0ZXAoMiwkdGJsLCRzMiwkczMsJHMwLCRzMSk7CisJCSAgICAmZW5jc3RlcCgzLCR0YmwsJHMzLCRzMCwkczEsJHMyKTsKKwkJfQorCQkmeG9yCSgkczAsJkRXUCgxNiokaSswLCRrZXkpKTsKKwkJJnhvcgkoJHMxLCZEV1AoMTYqJGkrNCwka2V5KSk7CisJCSZ4b3IJKCRzMiwmRFdQKDE2KiRpKzgsJGtleSkpOworCQkmeG9yCSgkczMsJkRXUCgxNiokaSsxMiwka2V5KSk7CisJICAgIH0KKwkgICAgJmFkZAkoJGtleSwzMik7CisJICAgICZtb3YJKCRfX2tleSwka2V5KTsJCSMgYWR2YW5jZSByZF9rZXkKKwkmc2V0X2xhYmVsKCIxMHJvdW5kcyIsNCk7CisJICAgIGZvciAoJGk9MTskaTwxMDskaSsrKSB7CisJCWlmICgkdmVydGljYWxfc3BpbikgeworCQkgICAgJmVuY3ZlcnQoJHRibCwkczAsJHMxLCRzMiwkczMpOworCQl9IGVsc2UgeworCQkgICAgJmVuY3N0ZXAoMCwkdGJsLCRzMCwkczEsJHMyLCRzMyk7CisJCSAgICAmZW5jc3RlcCgxLCR0YmwsJHMxLCRzMiwkczMsJHMwKTsKKwkJICAgICZlbmNzdGVwKDIsJHRibCwkczIsJHMzLCRzMCwkczEpOworCQkgICAgJmVuY3N0ZXAoMywkdGJsLCRzMywkczAsJHMxLCRzMik7CisJCX0KKwkJJnhvcgkoJHMwLCZEV1AoMTYqJGkrMCwka2V5KSk7CisJCSZ4b3IJKCRzMSwmRFdQKDE2KiRpKzQsJGtleSkpOworCQkmeG9yCSgkczIsJkRXUCgxNiokaSs4LCRrZXkpKTsKKwkJJnhvcgkoJHMzLCZEV1AoMTYqJGkrMTIsJGtleSkpOworCSAgICB9CisJfQorCisJaWYgKCR2ZXJ0aWNhbF9zcGluKSB7CisJICAgICMgInJlaW5jYXJuYXRlIiBzb21lIHJlZ2lzdGVycyBmb3IgImhvcml6b250YWwiIHNwaW4uLi4KKwkgICAgJm1vdgkoJHMxPSJlYngiLCRrZXk9ImVkaSIpOworCSAgICAmbW92CSgkczI9ImVjeCIsJGFjYz0iZXNpIik7CisJfQorCSZlbmNsYXN0KDAsJHRibCwkczAsJHMxLCRzMiwkczMpOworCSZlbmNsYXN0KDEsJHRibCwkczEsJHMyLCRzMywkczApOworCSZlbmNsYXN0KDIsJHRibCwkczIsJHMzLCRzMCwkczEpOworCSZlbmNsYXN0KDMsJHRibCwkczMsJHMwLCRzMSwkczIpOworCisJJmFkZAkoJGtleSwkc21hbGxfZm9vdHByaW50PzE2OjE2MCk7CisJJnhvcgkoJHMwLCZEV1AoMCwka2V5KSk7CisJJnhvcgkoJHMxLCZEV1AoNCwka2V5KSk7CisJJnhvcgkoJHMyLCZEV1AoOCwka2V5KSk7CisJJnhvcgkoJHMzLCZEV1AoMTIsJGtleSkpOworCisJJnJldAkoKTsKKworJnNldF9sYWJlbCgiQUVTX1RlIiw2NCk7CSMgWWVzISBJIGtlZXAgaXQgaW4gdGhlIGNvZGUgc2VnbWVudCEKKwkmX2RhdGFfd29yZCgweGE1NjM2M2M2LCAweDg0N2M3Y2Y4LCAweDk5Nzc3N2VlLCAweDhkN2I3YmY2KTsKKwkmX2RhdGFfd29yZCgweDBkZjJmMmZmLCAweGJkNmI2YmQ2LCAweGIxNmY2ZmRlLCAweDU0YzVjNTkxKTsKKwkmX2RhdGFfd29yZCgweDUwMzAzMDYwLCAweDAzMDEwMTAyLCAweGE5Njc2N2NlLCAweDdkMmIyYjU2KTsKKwkmX2RhdGFfd29yZCgweDE5ZmVmZWU3LCAweDYyZDdkN2I1LCAweGU2YWJhYjRkLCAweDlhNzY3NmVjKTsKKwkmX2RhdGFfd29yZCgweDQ1Y2FjYThmLCAweDlkODI4MjFmLCAweDQwYzljOTg5LCAweDg3N2Q3ZGZhKTsKKwkmX2RhdGFfd29yZCgweDE1ZmFmYWVmLCAweGViNTk1OWIyLCAweGM5NDc0NzhlLCAweDBiZjBmMGZiKTsKKwkmX2RhdGFfd29yZCgweGVjYWRhZDQxLCAweDY3ZDRkNGIzLCAweGZkYTJhMjVmLCAweGVhYWZhZjQ1KTsKKwkmX2RhdGFfd29yZCgweGJmOWM5YzIzLCAweGY3YTRhNDUzLCAweDk2NzI3MmU0LCAweDViYzBjMDliKTsKKwkmX2RhdGFfd29yZCgweGMyYjdiNzc1LCAweDFjZmRmZGUxLCAweGFlOTM5MzNkLCAweDZhMjYyNjRjKTsKKwkmX2RhdGFfd29yZCgweDVhMzYzNjZjLCAweDQxM2YzZjdlLCAweDAyZjdmN2Y1LCAweDRmY2NjYzgzKTsKKwkmX2RhdGFfd29yZCgweDVjMzQzNDY4LCAweGY0YTVhNTUxLCAweDM0ZTVlNWQxLCAweDA4ZjFmMWY5KTsKKwkmX2RhdGFfd29yZCgweDkzNzE3MWUyLCAweDczZDhkOGFiLCAweDUzMzEzMTYyLCAweDNmMTUxNTJhKTsKKwkmX2RhdGFfd29yZCgweDBjMDQwNDA4LCAweDUyYzdjNzk1LCAweDY1MjMyMzQ2LCAweDVlYzNjMzlkKTsKKwkmX2RhdGFfd29yZCgweDI4MTgxODMwLCAweGExOTY5NjM3LCAweDBmMDUwNTBhLCAweGI1OWE5YTJmKTsKKwkmX2RhdGFfd29yZCgweDA5MDcwNzBlLCAweDM2MTIxMjI0LCAweDliODA4MDFiLCAweDNkZTJlMmRmKTsKKwkmX2RhdGFfd29yZCgweDI2ZWJlYmNkLCAweDY5MjcyNzRlLCAweGNkYjJiMjdmLCAweDlmNzU3NWVhKTsKKwkmX2RhdGFfd29yZCgweDFiMDkwOTEyLCAweDllODM4MzFkLCAweDc0MmMyYzU4LCAweDJlMWExYTM0KTsKKwkmX2RhdGFfd29yZCgweDJkMWIxYjM2LCAweGIyNmU2ZWRjLCAweGVlNWE1YWI0LCAweGZiYTBhMDViKTsKKwkmX2RhdGFfd29yZCgweGY2NTI1MmE0LCAweDRkM2IzYjc2LCAweDYxZDZkNmI3LCAweGNlYjNiMzdkKTsKKwkmX2RhdGFfd29yZCgweDdiMjkyOTUyLCAweDNlZTNlM2RkLCAweDcxMmYyZjVlLCAweDk3ODQ4NDEzKTsKKwkmX2RhdGFfd29yZCgweGY1NTM1M2E2LCAweDY4ZDFkMWI5LCAweDAwMDAwMDAwLCAweDJjZWRlZGMxKTsKKwkmX2RhdGFfd29yZCgweDYwMjAyMDQwLCAweDFmZmNmY2UzLCAweGM4YjFiMTc5LCAweGVkNWI1YmI2KTsKKwkmX2RhdGFfd29yZCgweGJlNmE2YWQ0LCAweDQ2Y2JjYjhkLCAweGQ5YmViZTY3LCAweDRiMzkzOTcyKTsKKwkmX2RhdGFfd29yZCgweGRlNGE0YTk0LCAweGQ0NGM0Yzk4LCAweGU4NTg1OGIwLCAweDRhY2ZjZjg1KTsKKwkmX2RhdGFfd29yZCgweDZiZDBkMGJiLCAweDJhZWZlZmM1LCAweGU1YWFhYTRmLCAweDE2ZmJmYmVkKTsKKwkmX2RhdGFfd29yZCgweGM1NDM0Mzg2LCAweGQ3NGQ0ZDlhLCAweDU1MzMzMzY2LCAweDk0ODU4NTExKTsKKwkmX2RhdGFfd29yZCgweGNmNDU0NThhLCAweDEwZjlmOWU5LCAweDA2MDIwMjA0LCAweDgxN2Y3ZmZlKTsKKwkmX2RhdGFfd29yZCgweGYwNTA1MGEwLCAweDQ0M2MzYzc4LCAweGJhOWY5ZjI1LCAweGUzYThhODRiKTsKKwkmX2RhdGFfd29yZCgweGYzNTE1MWEyLCAweGZlYTNhMzVkLCAweGMwNDA0MDgwLCAweDhhOGY4ZjA1KTsKKwkmX2RhdGFfd29yZCgweGFkOTI5MjNmLCAweGJjOWQ5ZDIxLCAweDQ4MzgzODcwLCAweDA0ZjVmNWYxKTsKKwkmX2RhdGFfd29yZCgweGRmYmNiYzYzLCAweGMxYjZiNjc3LCAweDc1ZGFkYWFmLCAweDYzMjEyMTQyKTsKKwkmX2RhdGFfd29yZCgweDMwMTAxMDIwLCAweDFhZmZmZmU1LCAweDBlZjNmM2ZkLCAweDZkZDJkMmJmKTsKKwkmX2RhdGFfd29yZCgweDRjY2RjZDgxLCAweDE0MGMwYzE4LCAweDM1MTMxMzI2LCAweDJmZWNlY2MzKTsKKwkmX2RhdGFfd29yZCgweGUxNWY1ZmJlLCAweGEyOTc5NzM1LCAweGNjNDQ0NDg4LCAweDM5MTcxNzJlKTsKKwkmX2RhdGFfd29yZCgweDU3YzRjNDkzLCAweGYyYTdhNzU1LCAweDgyN2U3ZWZjLCAweDQ3M2QzZDdhKTsKKwkmX2RhdGFfd29yZCgweGFjNjQ2NGM4LCAweGU3NWQ1ZGJhLCAweDJiMTkxOTMyLCAweDk1NzM3M2U2KTsKKwkmX2RhdGFfd29yZCgweGEwNjA2MGMwLCAweDk4ODE4MTE5LCAweGQxNGY0ZjllLCAweDdmZGNkY2EzKTsKKwkmX2RhdGFfd29yZCgweDY2MjIyMjQ0LCAweDdlMmEyYTU0LCAweGFiOTA5MDNiLCAweDgzODg4ODBiKTsKKwkmX2RhdGFfd29yZCgweGNhNDY0NjhjLCAweDI5ZWVlZWM3LCAweGQzYjhiODZiLCAweDNjMTQxNDI4KTsKKwkmX2RhdGFfd29yZCgweDc5ZGVkZWE3LCAweGUyNWU1ZWJjLCAweDFkMGIwYjE2LCAweDc2ZGJkYmFkKTsKKwkmX2RhdGFfd29yZCgweDNiZTBlMGRiLCAweDU2MzIzMjY0LCAweDRlM2EzYTc0LCAweDFlMGEwYTE0KTsKKwkmX2RhdGFfd29yZCgweGRiNDk0OTkyLCAweDBhMDYwNjBjLCAweDZjMjQyNDQ4LCAweGU0NWM1Y2I4KTsKKwkmX2RhdGFfd29yZCgweDVkYzJjMjlmLCAweDZlZDNkM2JkLCAweGVmYWNhYzQzLCAweGE2NjI2MmM0KTsKKwkmX2RhdGFfd29yZCgweGE4OTE5MTM5LCAweGE0OTU5NTMxLCAweDM3ZTRlNGQzLCAweDhiNzk3OWYyKTsKKwkmX2RhdGFfd29yZCgweDMyZTdlN2Q1LCAweDQzYzhjODhiLCAweDU5MzczNzZlLCAweGI3NmQ2ZGRhKTsKKwkmX2RhdGFfd29yZCgweDhjOGQ4ZDAxLCAweDY0ZDVkNWIxLCAweGQyNGU0ZTljLCAweGUwYTlhOTQ5KTsKKwkmX2RhdGFfd29yZCgweGI0NmM2Y2Q4LCAweGZhNTY1NmFjLCAweDA3ZjRmNGYzLCAweDI1ZWFlYWNmKTsKKwkmX2RhdGFfd29yZCgweGFmNjU2NWNhLCAweDhlN2E3YWY0LCAweGU5YWVhZTQ3LCAweDE4MDgwODEwKTsKKwkmX2RhdGFfd29yZCgweGQ1YmFiYTZmLCAweDg4Nzg3OGYwLCAweDZmMjUyNTRhLCAweDcyMmUyZTVjKTsKKwkmX2RhdGFfd29yZCgweDI0MWMxYzM4LCAweGYxYTZhNjU3LCAweGM3YjRiNDczLCAweDUxYzZjNjk3KTsKKwkmX2RhdGFfd29yZCgweDIzZThlOGNiLCAweDdjZGRkZGExLCAweDljNzQ3NGU4LCAweDIxMWYxZjNlKTsKKwkmX2RhdGFfd29yZCgweGRkNGI0Yjk2LCAweGRjYmRiZDYxLCAweDg2OGI4YjBkLCAweDg1OGE4YTBmKTsKKwkmX2RhdGFfd29yZCgweDkwNzA3MGUwLCAweDQyM2UzZTdjLCAweGM0YjViNTcxLCAweGFhNjY2NmNjKTsKKwkmX2RhdGFfd29yZCgweGQ4NDg0ODkwLCAweDA1MDMwMzA2LCAweDAxZjZmNmY3LCAweDEyMGUwZTFjKTsKKwkmX2RhdGFfd29yZCgweGEzNjE2MWMyLCAweDVmMzUzNTZhLCAweGY5NTc1N2FlLCAweGQwYjliOTY5KTsKKwkmX2RhdGFfd29yZCgweDkxODY4NjE3LCAweDU4YzFjMTk5LCAweDI3MWQxZDNhLCAweGI5OWU5ZTI3KTsKKwkmX2RhdGFfd29yZCgweDM4ZTFlMWQ5LCAweDEzZjhmOGViLCAweGIzOTg5ODJiLCAweDMzMTExMTIyKTsKKwkmX2RhdGFfd29yZCgweGJiNjk2OWQyLCAweDcwZDlkOWE5LCAweDg5OGU4ZTA3LCAweGE3OTQ5NDMzKTsKKwkmX2RhdGFfd29yZCgweGI2OWI5YjJkLCAweDIyMWUxZTNjLCAweDkyODc4NzE1LCAweDIwZTllOWM5KTsKKwkmX2RhdGFfd29yZCgweDQ5Y2VjZTg3LCAweGZmNTU1NWFhLCAweDc4MjgyODUwLCAweDdhZGZkZmE1KTsKKwkmX2RhdGFfd29yZCgweDhmOGM4YzAzLCAweGY4YTFhMTU5LCAweDgwODk4OTA5LCAweDE3MGQwZDFhKTsKKwkmX2RhdGFfd29yZCgweGRhYmZiZjY1LCAweDMxZTZlNmQ3LCAweGM2NDI0Mjg0LCAweGI4Njg2OGQwKTsKKwkmX2RhdGFfd29yZCgweGMzNDE0MTgyLCAweGIwOTk5OTI5LCAweDc3MmQyZDVhLCAweDExMGYwZjFlKTsKKwkmX2RhdGFfd29yZCgweGNiYjBiMDdiLCAweGZjNTQ1NGE4LCAweGQ2YmJiYjZkLCAweDNhMTYxNjJjKTsKKworI1RlNAkjIGZvdXIgY29waWVzIG9mIFRlNCB0byBjaG9vc2UgZnJvbSB0byBhdm9pZCBMMSBhbGlhc2luZworCSZkYXRhX2J5dGUoMHg2MywgMHg3YywgMHg3NywgMHg3YiwgMHhmMiwgMHg2YiwgMHg2ZiwgMHhjNSk7CisJJmRhdGFfYnl0ZSgweDMwLCAweDAxLCAweDY3LCAweDJiLCAweGZlLCAweGQ3LCAweGFiLCAweDc2KTsKKwkmZGF0YV9ieXRlKDB4Y2EsIDB4ODIsIDB4YzksIDB4N2QsIDB4ZmEsIDB4NTksIDB4NDcsIDB4ZjApOworCSZkYXRhX2J5dGUoMHhhZCwgMHhkNCwgMHhhMiwgMHhhZiwgMHg5YywgMHhhNCwgMHg3MiwgMHhjMCk7CisJJmRhdGFfYnl0ZSgweGI3LCAweGZkLCAweDkzLCAweDI2LCAweDM2LCAweDNmLCAweGY3LCAweGNjKTsKKwkmZGF0YV9ieXRlKDB4MzQsIDB4YTUsIDB4ZTUsIDB4ZjEsIDB4NzEsIDB4ZDgsIDB4MzEsIDB4MTUpOworCSZkYXRhX2J5dGUoMHgwNCwgMHhjNywgMHgyMywgMHhjMywgMHgxOCwgMHg5NiwgMHgwNSwgMHg5YSk7CisJJmRhdGFfYnl0ZSgweDA3LCAweDEyLCAweDgwLCAweGUyLCAweGViLCAweDI3LCAweGIyLCAweDc1KTsKKwkmZGF0YV9ieXRlKDB4MDksIDB4ODMsIDB4MmMsIDB4MWEsIDB4MWIsIDB4NmUsIDB4NWEsIDB4YTApOworCSZkYXRhX2J5dGUoMHg1MiwgMHgzYiwgMHhkNiwgMHhiMywgMHgyOSwgMHhlMywgMHgyZiwgMHg4NCk7CisJJmRhdGFfYnl0ZSgweDUzLCAweGQxLCAweDAwLCAweGVkLCAweDIwLCAweGZjLCAweGIxLCAweDViKTsKKwkmZGF0YV9ieXRlKDB4NmEsIDB4Y2IsIDB4YmUsIDB4MzksIDB4NGEsIDB4NGMsIDB4NTgsIDB4Y2YpOworCSZkYXRhX2J5dGUoMHhkMCwgMHhlZiwgMHhhYSwgMHhmYiwgMHg0MywgMHg0ZCwgMHgzMywgMHg4NSk7CisJJmRhdGFfYnl0ZSgweDQ1LCAweGY5LCAweDAyLCAweDdmLCAweDUwLCAweDNjLCAweDlmLCAweGE4KTsKKwkmZGF0YV9ieXRlKDB4NTEsIDB4YTMsIDB4NDAsIDB4OGYsIDB4OTIsIDB4OWQsIDB4MzgsIDB4ZjUpOworCSZkYXRhX2J5dGUoMHhiYywgMHhiNiwgMHhkYSwgMHgyMSwgMHgxMCwgMHhmZiwgMHhmMywgMHhkMik7CisJJmRhdGFfYnl0ZSgweGNkLCAweDBjLCAweDEzLCAweGVjLCAweDVmLCAweDk3LCAweDQ0LCAweDE3KTsKKwkmZGF0YV9ieXRlKDB4YzQsIDB4YTcsIDB4N2UsIDB4M2QsIDB4NjQsIDB4NWQsIDB4MTksIDB4NzMpOworCSZkYXRhX2J5dGUoMHg2MCwgMHg4MSwgMHg0ZiwgMHhkYywgMHgyMiwgMHgyYSwgMHg5MCwgMHg4OCk7CisJJmRhdGFfYnl0ZSgweDQ2LCAweGVlLCAweGI4LCAweDE0LCAweGRlLCAweDVlLCAweDBiLCAweGRiKTsKKwkmZGF0YV9ieXRlKDB4ZTAsIDB4MzIsIDB4M2EsIDB4MGEsIDB4NDksIDB4MDYsIDB4MjQsIDB4NWMpOworCSZkYXRhX2J5dGUoMHhjMiwgMHhkMywgMHhhYywgMHg2MiwgMHg5MSwgMHg5NSwgMHhlNCwgMHg3OSk7CisJJmRhdGFfYnl0ZSgweGU3LCAweGM4LCAweDM3LCAweDZkLCAweDhkLCAweGQ1LCAweDRlLCAweGE5KTsKKwkmZGF0YV9ieXRlKDB4NmMsIDB4NTYsIDB4ZjQsIDB4ZWEsIDB4NjUsIDB4N2EsIDB4YWUsIDB4MDgpOworCSZkYXRhX2J5dGUoMHhiYSwgMHg3OCwgMHgyNSwgMHgyZSwgMHgxYywgMHhhNiwgMHhiNCwgMHhjNik7CisJJmRhdGFfYnl0ZSgweGU4LCAweGRkLCAweDc0LCAweDFmLCAweDRiLCAweGJkLCAweDhiLCAweDhhKTsKKwkmZGF0YV9ieXRlKDB4NzAsIDB4M2UsIDB4YjUsIDB4NjYsIDB4NDgsIDB4MDMsIDB4ZjYsIDB4MGUpOworCSZkYXRhX2J5dGUoMHg2MSwgMHgzNSwgMHg1NywgMHhiOSwgMHg4NiwgMHhjMSwgMHgxZCwgMHg5ZSk7CisJJmRhdGFfYnl0ZSgweGUxLCAweGY4LCAweDk4LCAweDExLCAweDY5LCAweGQ5LCAweDhlLCAweDk0KTsKKwkmZGF0YV9ieXRlKDB4OWIsIDB4MWUsIDB4ODcsIDB4ZTksIDB4Y2UsIDB4NTUsIDB4MjgsIDB4ZGYpOworCSZkYXRhX2J5dGUoMHg4YywgMHhhMSwgMHg4OSwgMHgwZCwgMHhiZiwgMHhlNiwgMHg0MiwgMHg2OCk7CisJJmRhdGFfYnl0ZSgweDQxLCAweDk5LCAweDJkLCAweDBmLCAweGIwLCAweDU0LCAweGJiLCAweDE2KTsKKworCSZkYXRhX2J5dGUoMHg2MywgMHg3YywgMHg3NywgMHg3YiwgMHhmMiwgMHg2YiwgMHg2ZiwgMHhjNSk7CisJJmRhdGFfYnl0ZSgweDMwLCAweDAxLCAweDY3LCAweDJiLCAweGZlLCAweGQ3LCAweGFiLCAweDc2KTsKKwkmZGF0YV9ieXRlKDB4Y2EsIDB4ODIsIDB4YzksIDB4N2QsIDB4ZmEsIDB4NTksIDB4NDcsIDB4ZjApOworCSZkYXRhX2J5dGUoMHhhZCwgMHhkNCwgMHhhMiwgMHhhZiwgMHg5YywgMHhhNCwgMHg3MiwgMHhjMCk7CisJJmRhdGFfYnl0ZSgweGI3LCAweGZkLCAweDkzLCAweDI2LCAweDM2LCAweDNmLCAweGY3LCAweGNjKTsKKwkmZGF0YV9ieXRlKDB4MzQsIDB4YTUsIDB4ZTUsIDB4ZjEsIDB4NzEsIDB4ZDgsIDB4MzEsIDB4MTUpOworCSZkYXRhX2J5dGUoMHgwNCwgMHhjNywgMHgyMywgMHhjMywgMHgxOCwgMHg5NiwgMHgwNSwgMHg5YSk7CisJJmRhdGFfYnl0ZSgweDA3LCAweDEyLCAweDgwLCAweGUyLCAweGViLCAweDI3LCAweGIyLCAweDc1KTsKKwkmZGF0YV9ieXRlKDB4MDksIDB4ODMsIDB4MmMsIDB4MWEsIDB4MWIsIDB4NmUsIDB4NWEsIDB4YTApOworCSZkYXRhX2J5dGUoMHg1MiwgMHgzYiwgMHhkNiwgMHhiMywgMHgyOSwgMHhlMywgMHgyZiwgMHg4NCk7CisJJmRhdGFfYnl0ZSgweDUzLCAweGQxLCAweDAwLCAweGVkLCAweDIwLCAweGZjLCAweGIxLCAweDViKTsKKwkmZGF0YV9ieXRlKDB4NmEsIDB4Y2IsIDB4YmUsIDB4MzksIDB4NGEsIDB4NGMsIDB4NTgsIDB4Y2YpOworCSZkYXRhX2J5dGUoMHhkMCwgMHhlZiwgMHhhYSwgMHhmYiwgMHg0MywgMHg0ZCwgMHgzMywgMHg4NSk7CisJJmRhdGFfYnl0ZSgweDQ1LCAweGY5LCAweDAyLCAweDdmLCAweDUwLCAweDNjLCAweDlmLCAweGE4KTsKKwkmZGF0YV9ieXRlKDB4NTEsIDB4YTMsIDB4NDAsIDB4OGYsIDB4OTIsIDB4OWQsIDB4MzgsIDB4ZjUpOworCSZkYXRhX2J5dGUoMHhiYywgMHhiNiwgMHhkYSwgMHgyMSwgMHgxMCwgMHhmZiwgMHhmMywgMHhkMik7CisJJmRhdGFfYnl0ZSgweGNkLCAweDBjLCAweDEzLCAweGVjLCAweDVmLCAweDk3LCAweDQ0LCAweDE3KTsKKwkmZGF0YV9ieXRlKDB4YzQsIDB4YTcsIDB4N2UsIDB4M2QsIDB4NjQsIDB4NWQsIDB4MTksIDB4NzMpOworCSZkYXRhX2J5dGUoMHg2MCwgMHg4MSwgMHg0ZiwgMHhkYywgMHgyMiwgMHgyYSwgMHg5MCwgMHg4OCk7CisJJmRhdGFfYnl0ZSgweDQ2LCAweGVlLCAweGI4LCAweDE0LCAweGRlLCAweDVlLCAweDBiLCAweGRiKTsKKwkmZGF0YV9ieXRlKDB4ZTAsIDB4MzIsIDB4M2EsIDB4MGEsIDB4NDksIDB4MDYsIDB4MjQsIDB4NWMpOworCSZkYXRhX2J5dGUoMHhjMiwgMHhkMywgMHhhYywgMHg2MiwgMHg5MSwgMHg5NSwgMHhlNCwgMHg3OSk7CisJJmRhdGFfYnl0ZSgweGU3LCAweGM4LCAweDM3LCAweDZkLCAweDhkLCAweGQ1LCAweDRlLCAweGE5KTsKKwkmZGF0YV9ieXRlKDB4NmMsIDB4NTYsIDB4ZjQsIDB4ZWEsIDB4NjUsIDB4N2EsIDB4YWUsIDB4MDgpOworCSZkYXRhX2J5dGUoMHhiYSwgMHg3OCwgMHgyNSwgMHgyZSwgMHgxYywgMHhhNiwgMHhiNCwgMHhjNik7CisJJmRhdGFfYnl0ZSgweGU4LCAweGRkLCAweDc0LCAweDFmLCAweDRiLCAweGJkLCAweDhiLCAweDhhKTsKKwkmZGF0YV9ieXRlKDB4NzAsIDB4M2UsIDB4YjUsIDB4NjYsIDB4NDgsIDB4MDMsIDB4ZjYsIDB4MGUpOworCSZkYXRhX2J5dGUoMHg2MSwgMHgzNSwgMHg1NywgMHhiOSwgMHg4NiwgMHhjMSwgMHgxZCwgMHg5ZSk7CisJJmRhdGFfYnl0ZSgweGUxLCAweGY4LCAweDk4LCAweDExLCAweDY5LCAweGQ5LCAweDhlLCAweDk0KTsKKwkmZGF0YV9ieXRlKDB4OWIsIDB4MWUsIDB4ODcsIDB4ZTksIDB4Y2UsIDB4NTUsIDB4MjgsIDB4ZGYpOworCSZkYXRhX2J5dGUoMHg4YywgMHhhMSwgMHg4OSwgMHgwZCwgMHhiZiwgMHhlNiwgMHg0MiwgMHg2OCk7CisJJmRhdGFfYnl0ZSgweDQxLCAweDk5LCAweDJkLCAweDBmLCAweGIwLCAweDU0LCAweGJiLCAweDE2KTsKKworCSZkYXRhX2J5dGUoMHg2MywgMHg3YywgMHg3NywgMHg3YiwgMHhmMiwgMHg2YiwgMHg2ZiwgMHhjNSk7CisJJmRhdGFfYnl0ZSgweDMwLCAweDAxLCAweDY3LCAweDJiLCAweGZlLCAweGQ3LCAweGFiLCAweDc2KTsKKwkmZGF0YV9ieXRlKDB4Y2EsIDB4ODIsIDB4YzksIDB4N2QsIDB4ZmEsIDB4NTksIDB4NDcsIDB4ZjApOworCSZkYXRhX2J5dGUoMHhhZCwgMHhkNCwgMHhhMiwgMHhhZiwgMHg5YywgMHhhNCwgMHg3MiwgMHhjMCk7CisJJmRhdGFfYnl0ZSgweGI3LCAweGZkLCAweDkzLCAweDI2LCAweDM2LCAweDNmLCAweGY3LCAweGNjKTsKKwkmZGF0YV9ieXRlKDB4MzQsIDB4YTUsIDB4ZTUsIDB4ZjEsIDB4NzEsIDB4ZDgsIDB4MzEsIDB4MTUpOworCSZkYXRhX2J5dGUoMHgwNCwgMHhjNywgMHgyMywgMHhjMywgMHgxOCwgMHg5NiwgMHgwNSwgMHg5YSk7CisJJmRhdGFfYnl0ZSgweDA3LCAweDEyLCAweDgwLCAweGUyLCAweGViLCAweDI3LCAweGIyLCAweDc1KTsKKwkmZGF0YV9ieXRlKDB4MDksIDB4ODMsIDB4MmMsIDB4MWEsIDB4MWIsIDB4NmUsIDB4NWEsIDB4YTApOworCSZkYXRhX2J5dGUoMHg1MiwgMHgzYiwgMHhkNiwgMHhiMywgMHgyOSwgMHhlMywgMHgyZiwgMHg4NCk7CisJJmRhdGFfYnl0ZSgweDUzLCAweGQxLCAweDAwLCAweGVkLCAweDIwLCAweGZjLCAweGIxLCAweDViKTsKKwkmZGF0YV9ieXRlKDB4NmEsIDB4Y2IsIDB4YmUsIDB4MzksIDB4NGEsIDB4NGMsIDB4NTgsIDB4Y2YpOworCSZkYXRhX2J5dGUoMHhkMCwgMHhlZiwgMHhhYSwgMHhmYiwgMHg0MywgMHg0ZCwgMHgzMywgMHg4NSk7CisJJmRhdGFfYnl0ZSgweDQ1LCAweGY5LCAweDAyLCAweDdmLCAweDUwLCAweDNjLCAweDlmLCAweGE4KTsKKwkmZGF0YV9ieXRlKDB4NTEsIDB4YTMsIDB4NDAsIDB4OGYsIDB4OTIsIDB4OWQsIDB4MzgsIDB4ZjUpOworCSZkYXRhX2J5dGUoMHhiYywgMHhiNiwgMHhkYSwgMHgyMSwgMHgxMCwgMHhmZiwgMHhmMywgMHhkMik7CisJJmRhdGFfYnl0ZSgweGNkLCAweDBjLCAweDEzLCAweGVjLCAweDVmLCAweDk3LCAweDQ0LCAweDE3KTsKKwkmZGF0YV9ieXRlKDB4YzQsIDB4YTcsIDB4N2UsIDB4M2QsIDB4NjQsIDB4NWQsIDB4MTksIDB4NzMpOworCSZkYXRhX2J5dGUoMHg2MCwgMHg4MSwgMHg0ZiwgMHhkYywgMHgyMiwgMHgyYSwgMHg5MCwgMHg4OCk7CisJJmRhdGFfYnl0ZSgweDQ2LCAweGVlLCAweGI4LCAweDE0LCAweGRlLCAweDVlLCAweDBiLCAweGRiKTsKKwkmZGF0YV9ieXRlKDB4ZTAsIDB4MzIsIDB4M2EsIDB4MGEsIDB4NDksIDB4MDYsIDB4MjQsIDB4NWMpOworCSZkYXRhX2J5dGUoMHhjMiwgMHhkMywgMHhhYywgMHg2MiwgMHg5MSwgMHg5NSwgMHhlNCwgMHg3OSk7CisJJmRhdGFfYnl0ZSgweGU3LCAweGM4LCAweDM3LCAweDZkLCAweDhkLCAweGQ1LCAweDRlLCAweGE5KTsKKwkmZGF0YV9ieXRlKDB4NmMsIDB4NTYsIDB4ZjQsIDB4ZWEsIDB4NjUsIDB4N2EsIDB4YWUsIDB4MDgpOworCSZkYXRhX2J5dGUoMHhiYSwgMHg3OCwgMHgyNSwgMHgyZSwgMHgxYywgMHhhNiwgMHhiNCwgMHhjNik7CisJJmRhdGFfYnl0ZSgweGU4LCAweGRkLCAweDc0LCAweDFmLCAweDRiLCAweGJkLCAweDhiLCAweDhhKTsKKwkmZGF0YV9ieXRlKDB4NzAsIDB4M2UsIDB4YjUsIDB4NjYsIDB4NDgsIDB4MDMsIDB4ZjYsIDB4MGUpOworCSZkYXRhX2J5dGUoMHg2MSwgMHgzNSwgMHg1NywgMHhiOSwgMHg4NiwgMHhjMSwgMHgxZCwgMHg5ZSk7CisJJmRhdGFfYnl0ZSgweGUxLCAweGY4LCAweDk4LCAweDExLCAweDY5LCAweGQ5LCAweDhlLCAweDk0KTsKKwkmZGF0YV9ieXRlKDB4OWIsIDB4MWUsIDB4ODcsIDB4ZTksIDB4Y2UsIDB4NTUsIDB4MjgsIDB4ZGYpOworCSZkYXRhX2J5dGUoMHg4YywgMHhhMSwgMHg4OSwgMHgwZCwgMHhiZiwgMHhlNiwgMHg0MiwgMHg2OCk7CisJJmRhdGFfYnl0ZSgweDQxLCAweDk5LCAweDJkLCAweDBmLCAweGIwLCAweDU0LCAweGJiLCAweDE2KTsKKworCSZkYXRhX2J5dGUoMHg2MywgMHg3YywgMHg3NywgMHg3YiwgMHhmMiwgMHg2YiwgMHg2ZiwgMHhjNSk7CisJJmRhdGFfYnl0ZSgweDMwLCAweDAxLCAweDY3LCAweDJiLCAweGZlLCAweGQ3LCAweGFiLCAweDc2KTsKKwkmZGF0YV9ieXRlKDB4Y2EsIDB4ODIsIDB4YzksIDB4N2QsIDB4ZmEsIDB4NTksIDB4NDcsIDB4ZjApOworCSZkYXRhX2J5dGUoMHhhZCwgMHhkNCwgMHhhMiwgMHhhZiwgMHg5YywgMHhhNCwgMHg3MiwgMHhjMCk7CisJJmRhdGFfYnl0ZSgweGI3LCAweGZkLCAweDkzLCAweDI2LCAweDM2LCAweDNmLCAweGY3LCAweGNjKTsKKwkmZGF0YV9ieXRlKDB4MzQsIDB4YTUsIDB4ZTUsIDB4ZjEsIDB4NzEsIDB4ZDgsIDB4MzEsIDB4MTUpOworCSZkYXRhX2J5dGUoMHgwNCwgMHhjNywgMHgyMywgMHhjMywgMHgxOCwgMHg5NiwgMHgwNSwgMHg5YSk7CisJJmRhdGFfYnl0ZSgweDA3LCAweDEyLCAweDgwLCAweGUyLCAweGViLCAweDI3LCAweGIyLCAweDc1KTsKKwkmZGF0YV9ieXRlKDB4MDksIDB4ODMsIDB4MmMsIDB4MWEsIDB4MWIsIDB4NmUsIDB4NWEsIDB4YTApOworCSZkYXRhX2J5dGUoMHg1MiwgMHgzYiwgMHhkNiwgMHhiMywgMHgyOSwgMHhlMywgMHgyZiwgMHg4NCk7CisJJmRhdGFfYnl0ZSgweDUzLCAweGQxLCAweDAwLCAweGVkLCAweDIwLCAweGZjLCAweGIxLCAweDViKTsKKwkmZGF0YV9ieXRlKDB4NmEsIDB4Y2IsIDB4YmUsIDB4MzksIDB4NGEsIDB4NGMsIDB4NTgsIDB4Y2YpOworCSZkYXRhX2J5dGUoMHhkMCwgMHhlZiwgMHhhYSwgMHhmYiwgMHg0MywgMHg0ZCwgMHgzMywgMHg4NSk7CisJJmRhdGFfYnl0ZSgweDQ1LCAweGY5LCAweDAyLCAweDdmLCAweDUwLCAweDNjLCAweDlmLCAweGE4KTsKKwkmZGF0YV9ieXRlKDB4NTEsIDB4YTMsIDB4NDAsIDB4OGYsIDB4OTIsIDB4OWQsIDB4MzgsIDB4ZjUpOworCSZkYXRhX2J5dGUoMHhiYywgMHhiNiwgMHhkYSwgMHgyMSwgMHgxMCwgMHhmZiwgMHhmMywgMHhkMik7CisJJmRhdGFfYnl0ZSgweGNkLCAweDBjLCAweDEzLCAweGVjLCAweDVmLCAweDk3LCAweDQ0LCAweDE3KTsKKwkmZGF0YV9ieXRlKDB4YzQsIDB4YTcsIDB4N2UsIDB4M2QsIDB4NjQsIDB4NWQsIDB4MTksIDB4NzMpOworCSZkYXRhX2J5dGUoMHg2MCwgMHg4MSwgMHg0ZiwgMHhkYywgMHgyMiwgMHgyYSwgMHg5MCwgMHg4OCk7CisJJmRhdGFfYnl0ZSgweDQ2LCAweGVlLCAweGI4LCAweDE0LCAweGRlLCAweDVlLCAweDBiLCAweGRiKTsKKwkmZGF0YV9ieXRlKDB4ZTAsIDB4MzIsIDB4M2EsIDB4MGEsIDB4NDksIDB4MDYsIDB4MjQsIDB4NWMpOworCSZkYXRhX2J5dGUoMHhjMiwgMHhkMywgMHhhYywgMHg2MiwgMHg5MSwgMHg5NSwgMHhlNCwgMHg3OSk7CisJJmRhdGFfYnl0ZSgweGU3LCAweGM4LCAweDM3LCAweDZkLCAweDhkLCAweGQ1LCAweDRlLCAweGE5KTsKKwkmZGF0YV9ieXRlKDB4NmMsIDB4NTYsIDB4ZjQsIDB4ZWEsIDB4NjUsIDB4N2EsIDB4YWUsIDB4MDgpOworCSZkYXRhX2J5dGUoMHhiYSwgMHg3OCwgMHgyNSwgMHgyZSwgMHgxYywgMHhhNiwgMHhiNCwgMHhjNik7CisJJmRhdGFfYnl0ZSgweGU4LCAweGRkLCAweDc0LCAweDFmLCAweDRiLCAweGJkLCAweDhiLCAweDhhKTsKKwkmZGF0YV9ieXRlKDB4NzAsIDB4M2UsIDB4YjUsIDB4NjYsIDB4NDgsIDB4MDMsIDB4ZjYsIDB4MGUpOworCSZkYXRhX2J5dGUoMHg2MSwgMHgzNSwgMHg1NywgMHhiOSwgMHg4NiwgMHhjMSwgMHgxZCwgMHg5ZSk7CisJJmRhdGFfYnl0ZSgweGUxLCAweGY4LCAweDk4LCAweDExLCAweDY5LCAweGQ5LCAweDhlLCAweDk0KTsKKwkmZGF0YV9ieXRlKDB4OWIsIDB4MWUsIDB4ODcsIDB4ZTksIDB4Y2UsIDB4NTUsIDB4MjgsIDB4ZGYpOworCSZkYXRhX2J5dGUoMHg4YywgMHhhMSwgMHg4OSwgMHgwZCwgMHhiZiwgMHhlNiwgMHg0MiwgMHg2OCk7CisJJmRhdGFfYnl0ZSgweDQxLCAweDk5LCAweDJkLCAweDBmLCAweGIwLCAweDU0LCAweGJiLCAweDE2KTsKKyNyY29uOgorCSZkYXRhX3dvcmQoMHgwMDAwMDAwMSwgMHgwMDAwMDAwMiwgMHgwMDAwMDAwNCwgMHgwMDAwMDAwOCk7CisJJmRhdGFfd29yZCgweDAwMDAwMDEwLCAweDAwMDAwMDIwLCAweDAwMDAwMDQwLCAweDAwMDAwMDgwKTsKKwkmZGF0YV93b3JkKDB4MDAwMDAwMWIsIDB4MDAwMDAwMzYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDApOworCSZkYXRhX3dvcmQoMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCk7CismZnVuY3Rpb25fZW5kX0IoIl94ODZfQUVTX2VuY3J5cHQiKTsKKworIyB2b2lkIEFFU19lbmNyeXB0IChjb25zdCB2b2lkICppbnAsdm9pZCAqb3V0LGNvbnN0IEFFU19LRVkgKmtleSk7CismZnVuY3Rpb25fYmVnaW4oIkFFU19lbmNyeXB0Iik7CisJJm1vdgkoJGFjYywmd3BhcmFtKDApKTsJCSMgbG9hZCBpbnAKKwkmbW92CSgka2V5LCZ3cGFyYW0oMikpOwkJIyBsb2FkIGtleQorCisJJm1vdgkoJHMwLCJlc3AiKTsKKwkmc3ViCSgiZXNwIiwzNik7CisJJmFuZAkoImVzcCIsLTY0KTsJCQkjIGFsaWduIHRvIGNhY2hlLWxpbmUKKworCSMgcGxhY2Ugc3RhY2sgZnJhbWUganVzdCAiYWJvdmUiIHRoZSBrZXkgc2NoZWR1bGUKKwkmbGVhCSgkczEsJkRXUCgtNjQtNjMsJGtleSkpOworCSZzdWIJKCRzMSwiZXNwIik7CisJJm5lZwkoJHMxKTsKKwkmYW5kCSgkczEsMHgzQzApOwkjIG1vZHVsbyAxMDI0LCBidXQgYWxpZ25lZCB0byBjYWNoZS1saW5lCisJJnN1YgkoImVzcCIsJHMxKTsKKwkmYWRkCSgiZXNwIiw0KTsJIyA0IGlzIHJlc2VydmVkIGZvciBjYWxsZXIncyByZXR1cm4gYWRkcmVzcworCSZtb3YJKCRfZXNwLCRzMCk7CQkJIyBzYXZlIHN0YWNrIHBvaW50ZXIKKworCSZjYWxsICAgKCZsYWJlbCgicGljX3BvaW50IikpOyAgICAgICAgICAjIG1ha2UgaXQgUElDIQorCSZzZXRfbGFiZWwoInBpY19wb2ludCIpOworCSZibGluZHBvcCgkdGJsKTsKKwkmcGljbWV1cCgkczAsIk9QRU5TU0xfaWEzMmNhcF9QIiwkdGJsLCZsYWJlbCgicGljX3BvaW50IikpIGlmICghJHg4Nm9ubHkpOworCSZsZWEgICAgKCR0YmwsJkRXUCgmbGFiZWwoIkFFU19UZSIpLiItIi4mbGFiZWwoInBpY19wb2ludCIpLCR0YmwpKTsKKworCSMgcGljayBUZTQgY29weSB3aGljaCBjYW4ndCAib3ZlcmxhcCIgd2l0aCBzdGFjayBmcmFtZSBvciBrZXkgc2NoZWR1bGUKKwkmbGVhCSgkczEsJkRXUCg3NjgtNCwiZXNwIikpOworCSZzdWIJKCRzMSwkdGJsKTsKKwkmYW5kCSgkczEsMHgzMDApOworCSZsZWEJKCR0YmwsJkRXUCgyMDQ4KzEyOCwkdGJsLCRzMSkpOworCisJCQkJCWlmICghJHg4Nm9ubHkpIHsKKwkmYnQJKCZEV1AoMCwkczApLDI1KTsJIyBjaGVjayBmb3IgU1NFIGJpdAorCSZqbmMJKCZsYWJlbCgieDg2IikpOworCisJJm1vdnEJKCJtbTAiLCZRV1AoMCwkYWNjKSk7CisJJm1vdnEJKCJtbTQiLCZRV1AoOCwkYWNjKSk7CisJJmNhbGwJKCJfc3NlX0FFU19lbmNyeXB0X2NvbXBhY3QiKTsKKwkmbW92CSgiZXNwIiwkX2VzcCk7CQkJIyByZXN0b3JlIHN0YWNrIHBvaW50ZXIKKwkmbW92CSgkYWNjLCZ3cGFyYW0oMSkpOwkJIyBsb2FkIG91dAorCSZtb3ZxCSgmUVdQKDAsJGFjYyksIm1tMCIpOwkJIyB3cml0ZSBvdXRwdXQgZGF0YQorCSZtb3ZxCSgmUVdQKDgsJGFjYyksIm1tNCIpOworCSZlbW1zCSgpOworCSZmdW5jdGlvbl9lbmRfQSgpOworCQkJCQl9CisJJnNldF9sYWJlbCgieDg2IiwxNik7CisJJm1vdgkoJF90YmwsJHRibCk7CisJJm1vdgkoJHMwLCZEV1AoMCwkYWNjKSk7CQkjIGxvYWQgaW5wdXQgZGF0YQorCSZtb3YJKCRzMSwmRFdQKDQsJGFjYykpOworCSZtb3YJKCRzMiwmRFdQKDgsJGFjYykpOworCSZtb3YJKCRzMywmRFdQKDEyLCRhY2MpKTsKKwkmY2FsbAkoIl94ODZfQUVTX2VuY3J5cHRfY29tcGFjdCIpOworCSZtb3YJKCJlc3AiLCRfZXNwKTsJCQkjIHJlc3RvcmUgc3RhY2sgcG9pbnRlcgorCSZtb3YJKCRhY2MsJndwYXJhbSgxKSk7CQkjIGxvYWQgb3V0CisJJm1vdgkoJkRXUCgwLCRhY2MpLCRzMCk7CQkjIHdyaXRlIG91dHB1dCBkYXRhCisJJm1vdgkoJkRXUCg0LCRhY2MpLCRzMSk7CisJJm1vdgkoJkRXUCg4LCRhY2MpLCRzMik7CisJJm1vdgkoJkRXUCgxMiwkYWNjKSwkczMpOworJmZ1bmN0aW9uX2VuZCgiQUVTX2VuY3J5cHQiKTsKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICJDb21wYWN0IiBibG9jayBmdW5jdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitzdWIgZGVjY29tcGFjdCgpCit7IG15ICRGbiA9IFwmbW92OworICB3aGlsZSAoJCNfPjUpIHsgcG9wKEBfKTsgJEZuPXN1Ynt9OyB9CisgIG15ICgkaSwkdGQsQHMpPUBfOworICBteSAkdG1wID0gJGtleTsKKyAgbXkgJG91dCA9ICRpPT0zPyRzWzBdOiRhY2M7CisKKwkjICRGbiBpcyB1c2VkIGluIGZpcnN0IGNvbXBhY3Qgcm91bmQgYW5kIGl0cyBwdXJwb3NlIGlzIHRvCisJIyB2b2lkIHJlc3RvcmF0aW9uIG9mIHNvbWUgdmFsdWVzIGZyb20gc3RhY2ssIHNvIHRoYXQgYWZ0ZXIKKwkjIDR4ZGVjY29tcGFjdCB3aXRoIGV4dHJhIGFyZ3VtZW50ICRrZXksICRzMCBhbmQgJHMxIHZhbHVlcworCSMgYXJlIGxlZnQgdGhlcmUuLi4KKwlpZigkaT09MykgICB7CSYkRm4JKCRrZXksJF9fa2V5KTsJCQl9CisJZWxzZSAgICAgICAgewkmbW92CSgkb3V0LCRzWzBdKTsJCQl9CisJCQkmYW5kCSgkb3V0LDB4RkYpOworCQkJJm1vdnoJKCRvdXQsJkJQKC0xMjgsJHRkLCRvdXQsMSkpOworCisJaWYgKCRpPT0zKSAgewkkdG1wPSRzWzFdOwkJCQl9CisJCQkmbW92egkoJHRtcCwmSEIoJHNbMV0pKTsKKwkJCSZtb3Z6CSgkdG1wLCZCUCgtMTI4LCR0ZCwkdG1wLDEpKTsKKwkJCSZzaGwJKCR0bXAsOCk7CisJCQkmeG9yCSgkb3V0LCR0bXApOworCisJaWYgKCRpPT0zKSAgewkkdG1wPSRzWzJdOyAmbW92ICgkc1sxXSwkYWNjKTsJCX0KKwllbHNlICAgICAgICB7CW1vdgkoJHRtcCwkc1syXSk7CQkJfQorCQkJJnNocgkoJHRtcCwxNik7CisJCQkmYW5kCSgkdG1wLDB4RkYpOworCQkJJm1vdnoJKCR0bXAsJkJQKC0xMjgsJHRkLCR0bXAsMSkpOworCQkJJnNobAkoJHRtcCwxNik7CisJCQkmeG9yCSgkb3V0LCR0bXApOworCisJaWYgKCRpPT0zKSAgewkkdG1wPSRzWzNdOyAmJEZuICgkc1syXSwkX19zMSk7CQl9CisJZWxzZSAgICAgICAgewkmbW92CSgkdG1wLCRzWzNdKTsJCQl9CisJCQkmc2hyCSgkdG1wLDI0KTsKKwkJCSZtb3Z6CSgkdG1wLCZCUCgtMTI4LCR0ZCwkdG1wLDEpKTsKKwkJCSZzaGwJKCR0bXAsMjQpOworCQkJJnhvcgkoJG91dCwkdG1wKTsKKwlpZiAoJGk8MikgICB7CSZtb3YJKCZEV1AoNCs0KiRpLCJlc3AiKSwkb3V0KTsJfQorCWlmICgkaT09MykgIHsJJiRGbgkoJHNbM10sJF9fczApOwkJCX0KK30KKworIyBtdXN0IGJlIGNhbGxlZCB3aXRoIDIsMywwLDEgYXMgYXJndW1lbnQgc2VxdWVuY2UhISEKK3N1YiBkZWN0cmFuc2Zvcm0oKQoreyBteSBAcyA9ICgkczAsJHMxLCRzMiwkczMpOworICBteSAkaSA9IHNoaWZ0OworICBteSAkdG1wID0gJGtleTsKKyAgbXkgJHRwMiA9IEBzWygkaSsyKSU0XTsgJHRwMiA9IEBzWzJdIGlmICgkaT09MSk7CisgIG15ICR0cDQgPSBAc1soJGkrMyklNF07ICR0cDQgPSBAc1szXSBpZiAoJGk9PTEpOworICBteSAkdHA4ID0gJHRibDsKKworCSZtb3YJKCR0bXAsMHg4MDgwODA4MCk7CisJJmFuZAkoJHRtcCwkc1skaV0pOworCSZtb3YJKCRhY2MsJHRtcCk7CisJJnNocgkoJHRtcCw3KTsKKwkmbGVhCSgkdHAyLCZEV1AoMCwkc1skaV0sJHNbJGldKSk7CisJJnN1YgkoJGFjYywkdG1wKTsKKwkmYW5kCSgkdHAyLDB4ZmVmZWZlZmUpOworCSZhbmQJKCRhY2MsMHgxYjFiMWIxYik7CisJJnhvcgkoJHRwMiwkYWNjKTsKKwkmbW92CSgkdG1wLDB4ODA4MDgwODApOworCisJJmFuZAkoJHRtcCwkdHAyKTsKKwkmbW92CSgkYWNjLCR0bXApOworCSZzaHIJKCR0bXAsNyk7CisJJmxlYQkoJHRwNCwmRFdQKDAsJHRwMiwkdHAyKSk7CisJJnN1YgkoJGFjYywkdG1wKTsKKwkmYW5kCSgkdHA0LDB4ZmVmZWZlZmUpOworCSZhbmQJKCRhY2MsMHgxYjFiMWIxYik7CisJICZ4b3IJKCR0cDIsJHNbJGldKTsJIyB0cDJedHAxCisJJnhvcgkoJHRwNCwkYWNjKTsKKwkmbW92CSgkdG1wLDB4ODA4MDgwODApOworCisJJmFuZAkoJHRtcCwkdHA0KTsKKwkmbW92CSgkYWNjLCR0bXApOworCSZzaHIJKCR0bXAsNyk7CisJJmxlYQkoJHRwOCwmRFdQKDAsJHRwNCwkdHA0KSk7CisJJnN1YgkoJGFjYywkdG1wKTsKKwkmYW5kCSgkdHA4LDB4ZmVmZWZlZmUpOworCSZhbmQJKCRhY2MsMHgxYjFiMWIxYik7CisJICZ4b3IJKCR0cDQsJHNbJGldKTsJIyB0cDRedHAxCisJICZyb3RsCSgkc1skaV0sOCk7CSMgPSBST1RBVEUodHAxLDgpCisJJnhvcgkoJHRwOCwkYWNjKTsKKworCSZ4b3IJKCRzWyRpXSwkdHAyKTsKKwkmeG9yCSgkdHAyLCR0cDgpOworCSZ4b3IJKCRzWyRpXSwkdHA0KTsKKwkmeG9yCSgkdHA0LCR0cDgpOworCSZyb3RsCSgkdHAyLDI0KTsKKwkmeG9yCSgkc1skaV0sJHRwOCk7CSMgXj0gdHA4Xih0cDRedHAxKV4odHAyXnRwMSkKKwkmcm90bAkoJHRwNCwxNik7CisJJnhvcgkoJHNbJGldLCR0cDIpOwkjIF49IFJPVEFURSh0cDhedHAyXnRwMSwyNCkKKwkmcm90bAkoJHRwOCw4KTsKKwkmeG9yCSgkc1skaV0sJHRwNCk7CSMgXj0gUk9UQVRFKHRwOF50cDRedHAxLDE2KQorCSAmbW92CSgkc1swXSwkX19zMCkJCQlpZigkaT09Mik7ICNwcmVmZXRjaCAkczAKKwkgJm1vdgkoJHNbMV0sJF9fczEpCQkJaWYoJGk9PTMpOyAjcHJlZmV0Y2ggJHMxCisJICZtb3YJKCRzWzJdLCRfX3MyKQkJCWlmKCRpPT0xKTsKKwkmeG9yCSgkc1skaV0sJHRwOCk7CSMgXj0gUk9UQVRFKHRwOCw4KQorCisJJm1vdgkoJHNbM10sJF9fczMpCQkJaWYoJGk9PTEpOworCSZtb3YJKCZEV1AoNCs0KiRpLCJlc3AiKSwkc1skaV0pCWlmKCRpPj0yKTsKK30KKworJmZ1bmN0aW9uX2JlZ2luX0IoIl94ODZfQUVTX2RlY3J5cHRfY29tcGFjdCIpOworCSMgbm90ZSB0aGF0IGNhbGxlciBpcyBleHBlY3RlZCB0byBhbGxvY2F0ZSBzdGFjayBmcmFtZSBmb3IgbWUhCisJJm1vdgkoJF9fa2V5LCRrZXkpOwkJCSMgc2F2ZSBrZXkKKworCSZ4b3IJKCRzMCwmRFdQKDAsJGtleSkpOwkJIyB4b3Igd2l0aCBrZXkKKwkmeG9yCSgkczEsJkRXUCg0LCRrZXkpKTsKKwkmeG9yCSgkczIsJkRXUCg4LCRrZXkpKTsKKwkmeG9yCSgkczMsJkRXUCgxMiwka2V5KSk7CisKKwkmbW92CSgkYWNjLCZEV1AoMjQwLCRrZXkpKTsJCSMgbG9hZCBrZXktPnJvdW5kcworCisJJmxlYQkoJGFjYywmRFdQKC0yLCRhY2MsJGFjYykpOworCSZsZWEJKCRhY2MsJkRXUCgwLCRrZXksJGFjYyw4KSk7CisJJm1vdgkoJF9fZW5kLCRhY2MpOwkJCSMgZW5kIG9mIGtleSBzY2hlZHVsZQorCisJIyBwcmVmZXRjaCBUZDQKKwkmbW92CSgka2V5LCZEV1AoMC0xMjgsJHRibCkpOworCSZtb3YJKCRhY2MsJkRXUCgzMi0xMjgsJHRibCkpOworCSZtb3YJKCRrZXksJkRXUCg2NC0xMjgsJHRibCkpOworCSZtb3YJKCRhY2MsJkRXUCg5Ni0xMjgsJHRibCkpOworCSZtb3YJKCRrZXksJkRXUCgxMjgtMTI4LCR0YmwpKTsKKwkmbW92CSgkYWNjLCZEV1AoMTYwLTEyOCwkdGJsKSk7CisJJm1vdgkoJGtleSwmRFdQKDE5Mi0xMjgsJHRibCkpOworCSZtb3YJKCRhY2MsJkRXUCgyMjQtMTI4LCR0YmwpKTsKKworCSZzZXRfbGFiZWwoImxvb3AiLDE2KTsKKworCQkmZGVjY29tcGFjdCgwLCR0YmwsJHMwLCRzMywkczIsJHMxLDEpOworCQkmZGVjY29tcGFjdCgxLCR0YmwsJHMxLCRzMCwkczMsJHMyLDEpOworCQkmZGVjY29tcGFjdCgyLCR0YmwsJHMyLCRzMSwkczAsJHMzLDEpOworCQkmZGVjY29tcGFjdCgzLCR0YmwsJHMzLCRzMiwkczEsJHMwLDEpOworCQkmZGVjdHJhbnNmb3JtKDIpOworCQkmZGVjdHJhbnNmb3JtKDMpOworCQkmZGVjdHJhbnNmb3JtKDApOworCQkmZGVjdHJhbnNmb3JtKDEpOworCQkmbW92IAkoJGtleSwkX19rZXkpOworCQkmbW92CSgkdGJsLCRfX3RibCk7CisJCSZhZGQJKCRrZXksMTYpOwkJIyBhZHZhbmNlIHJkX2tleQorCQkmeG9yCSgkczAsJkRXUCgwLCRrZXkpKTsKKwkJJnhvcgkoJHMxLCZEV1AoNCwka2V5KSk7CisJCSZ4b3IJKCRzMiwmRFdQKDgsJGtleSkpOworCQkmeG9yCSgkczMsJkRXUCgxMiwka2V5KSk7CisKKwkmY21wCSgka2V5LCRfX2VuZCk7CisJJm1vdgkoJF9fa2V5LCRrZXkpOworCSZqYgkoJmxhYmVsKCJsb29wIikpOworCisJJmRlY2NvbXBhY3QoMCwkdGJsLCRzMCwkczMsJHMyLCRzMSk7CisJJmRlY2NvbXBhY3QoMSwkdGJsLCRzMSwkczAsJHMzLCRzMik7CisJJmRlY2NvbXBhY3QoMiwkdGJsLCRzMiwkczEsJHMwLCRzMyk7CisJJmRlY2NvbXBhY3QoMywkdGJsLCRzMywkczIsJHMxLCRzMCk7CisKKwkmeG9yCSgkczAsJkRXUCgxNiwka2V5KSk7CisJJnhvcgkoJHMxLCZEV1AoMjAsJGtleSkpOworCSZ4b3IJKCRzMiwmRFdQKDI0LCRrZXkpKTsKKwkmeG9yCSgkczMsJkRXUCgyOCwka2V5KSk7CisKKwkmcmV0CSgpOworJmZ1bmN0aW9uX2VuZF9CKCJfeDg2X0FFU19kZWNyeXB0X2NvbXBhY3QiKTsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAiQ29tcGFjdCIgU1NFIGJsb2NrIGZ1bmN0aW9uLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitzdWIgc3NlX2RlY2NvbXBhY3QoKQoreworCSZwc2h1ZncJKCJtbTEiLCJtbTAiLDB4MGMpOwkJIyAgNywgNiwgMSwgMAorCSZwc2h1ZncJKCJtbTUiLCJtbTQiLDB4MDkpOwkJIyAxMywxMiwxMSwxMAorCSZtb3ZkCSgiZWF4IiwibW0xIik7CQkJIyAgNywgNiwgMSwgMAorCSZtb3ZkCSgiZWJ4IiwibW01Iik7CQkJIyAxMywxMiwxMSwxMAorCSZtb3YJKCRfX2tleSwka2V5KTsKKworCSZtb3Z6CSgkYWNjLCZMQigiZWF4IikpOwkJIyAgMAorCSZtb3Z6CSgiZWR4IiwmSEIoImVheCIpKTsJCSMgIDEKKwkmcHNodWZ3CSgibW0yIiwibW0wIiwweDA2KTsJCSMgIDMsIDIsIDUsIDQKKwkmbW92egkoImVjeCIsJkJQKC0xMjgsJHRibCwkYWNjLDEpKTsJIyAgMAorCSZtb3Z6CSgka2V5LCZMQigiZWJ4IikpOwkJIyAxMAorCSZtb3Z6CSgiZWR4IiwmQlAoLTEyOCwkdGJsLCJlZHgiLDEpKTsJIyAgMQorCSZzaHIJKCJlYXgiLDE2KTsJCQkjICA3LCA2CisJJnNobAkoImVkeCIsOCk7CQkJIyAgMQorCisJJm1vdnoJKCRhY2MsJkJQKC0xMjgsJHRibCwka2V5LDEpKTsJIyAxMAorCSZtb3Z6CSgka2V5LCZIQigiZWJ4IikpOwkJIyAxMQorCSZzaGwJKCRhY2MsMTYpOwkJCSMgMTAKKwkmcHNodWZ3CSgibW02IiwibW00IiwweDAzKTsJCSMgOSwgOCwxNSwxNAorCSZvcgkoImVjeCIsJGFjYyk7CQkJIyAxMAorCSZtb3Z6CSgkYWNjLCZCUCgtMTI4LCR0YmwsJGtleSwxKSk7CSMgMTEKKwkmbW92egkoJGtleSwmSEIoImVheCIpKTsJCSMgIDcKKwkmc2hsCSgkYWNjLDI0KTsJCQkjIDExCisJJnNocgkoImVieCIsMTYpOwkJCSMgMTMsMTIKKwkmb3IJKCJlZHgiLCRhY2MpOwkJCSMgMTEKKworCSZtb3Z6CSgkYWNjLCZCUCgtMTI4LCR0YmwsJGtleSwxKSk7CSMgIDcKKwkmbW92egkoJGtleSwmSEIoImVieCIpKTsJCSMgMTMKKwkmc2hsCSgkYWNjLDI0KTsJCQkjICA3CisJJm9yCSgiZWN4IiwkYWNjKTsJCQkjICA3CisJJm1vdnoJKCRhY2MsJkJQKC0xMjgsJHRibCwka2V5LDEpKTsJIyAxMworCSZtb3Z6CSgka2V5LCZMQigiZWF4IikpOwkJIyAgNgorCSZzaGwJKCRhY2MsOCk7CQkJIyAxMworCSZtb3ZkCSgiZWF4IiwibW0yIik7CQkJIyAgMywgMiwgNSwgNAorCSZvcgkoImVjeCIsJGFjYyk7CQkJIyAxMworCisJJm1vdnoJKCRhY2MsJkJQKC0xMjgsJHRibCwka2V5LDEpKTsJIyAgNgorCSZtb3Z6CSgka2V5LCZMQigiZWJ4IikpOwkJIyAxMgorCSZzaGwJKCRhY2MsMTYpOwkJCSMgIDYKKwkmbW92ZAkoImVieCIsIm1tNiIpOwkJCSMgIDksIDgsMTUsMTQKKwkmbW92ZAkoIm1tMCIsImVjeCIpOwkJCSMgdFswXSBjb2xsZWN0ZWQKKwkmbW92egkoImVjeCIsJkJQKC0xMjgsJHRibCwka2V5LDEpKTsJIyAxMgorCSZtb3Z6CSgka2V5LCZMQigiZWF4IikpOwkJIyAgNAorCSZvcgkoImVjeCIsJGFjYyk7CQkJIyAxMgorCisJJm1vdnoJKCRhY2MsJkJQKC0xMjgsJHRibCwka2V5LDEpKTsJIyAgNAorCSZtb3Z6CSgka2V5LCZMQigiZWJ4IikpOwkJIyAxNAorCSZvcgkoImVkeCIsJGFjYyk7CQkJIyAgNAorCSZtb3Z6CSgkYWNjLCZCUCgtMTI4LCR0YmwsJGtleSwxKSk7CSMgMTQKKwkmbW92egkoJGtleSwmSEIoImVheCIpKTsJCSMgIDUKKwkmc2hsCSgkYWNjLDE2KTsJCQkjIDE0CisJJnNocgkoImVheCIsMTYpOwkJCSMgIDMsIDIKKwkmb3IJKCJlZHgiLCRhY2MpOwkJCSMgMTQKKworCSZtb3Z6CSgkYWNjLCZCUCgtMTI4LCR0YmwsJGtleSwxKSk7CSMgIDUKKwkmbW92egkoJGtleSwmSEIoImVieCIpKTsJCSMgMTUKKwkmc2hyCSgiZWJ4IiwxNik7CQkJIyAgOSwgOAorCSZzaGwJKCRhY2MsOCk7CQkJIyAgNQorCSZtb3ZkCSgibW0xIiwiZWR4Iik7CQkJIyB0WzFdIGNvbGxlY3RlZAorCSZtb3Z6CSgiZWR4IiwmQlAoLTEyOCwkdGJsLCRrZXksMSkpOwkjIDE1CisJJm1vdnoJKCRrZXksJkhCKCJlYngiKSk7CQkjICA5CisJJnNobAkoImVkeCIsMjQpOwkJCSMgMTUKKwkmYW5kCSgiZWJ4IiwweGZmKTsJCQkjICA4CisJJm9yCSgiZWR4IiwkYWNjKTsJCQkjIDE1CisKKwkmcHVucGNrbGRxCSgibW0wIiwibW0xIik7CQkjIHRbMCwxXSBjb2xsZWN0ZWQKKworCSZtb3Z6CSgkYWNjLCZCUCgtMTI4LCR0YmwsJGtleSwxKSk7CSMgIDkKKwkmbW92egkoJGtleSwmTEIoImVheCIpKTsJCSMgIDIKKwkmc2hsCSgkYWNjLDgpOwkJCSMgIDkKKwkmbW92egkoImVheCIsJkhCKCJlYXgiKSk7CQkjICAzCisJJm1vdnoJKCJlYngiLCZCUCgtMTI4LCR0YmwsImVieCIsMSkpOwkjICA4CisJJm9yCSgiZWN4IiwkYWNjKTsJCQkjICA5CisJJm1vdnoJKCRhY2MsJkJQKC0xMjgsJHRibCwka2V5LDEpKTsJIyAgMgorCSZvcgkoImVkeCIsImVieCIpOwkJCSMgIDgKKwkmc2hsCSgkYWNjLDE2KTsJCQkjICAyCisJJm1vdnoJKCJlYXgiLCZCUCgtMTI4LCR0YmwsImVheCIsMSkpOwkjICAzCisJJm9yCSgiZWR4IiwkYWNjKTsJCQkjICAyCisJJnNobAkoImVheCIsMjQpOwkJCSMgIDMKKwkmb3IJKCJlY3giLCJlYXgiKTsJCQkjICAzCisJJm1vdgkoJGtleSwkX19rZXkpOworCSZtb3ZkCSgibW00IiwiZWR4Iik7CQkJIyB0WzJdIGNvbGxlY3RlZAorCSZtb3ZkCSgibW01IiwiZWN4Iik7CQkJIyB0WzNdIGNvbGxlY3RlZAorCisJJnB1bnBja2xkcQkoIm1tNCIsIm1tNSIpOwkJIyB0WzIsM10gY29sbGVjdGVkCit9CisKKwkJCQkJaWYgKCEkeDg2b25seSkgeworJmZ1bmN0aW9uX2JlZ2luX0IoIl9zc2VfQUVTX2RlY3J5cHRfY29tcGFjdCIpOworCSZweG9yCSgibW0wIiwmUVdQKDAsJGtleSkpOwkjICA3LCA2LCA1LCA0LCAzLCAyLCAxLCAwCisJJnB4b3IJKCJtbTQiLCZRV1AoOCwka2V5KSk7CSMgMTUsMTQsMTMsMTIsMTEsMTAsIDksIDgKKworCSMgbm90ZSB0aGF0IGNhbGxlciBpcyBleHBlY3RlZCB0byBhbGxvY2F0ZSBzdGFjayBmcmFtZSBmb3IgbWUhCisJJm1vdgkoJGFjYywmRFdQKDI0MCwka2V5KSk7CQkjIGxvYWQga2V5LT5yb3VuZHMKKwkmbGVhCSgkYWNjLCZEV1AoLTIsJGFjYywkYWNjKSk7CisJJmxlYQkoJGFjYywmRFdQKDAsJGtleSwkYWNjLDgpKTsKKwkmbW92CSgkX19lbmQsJGFjYyk7CQkJIyBlbmQgb2Yga2V5IHNjaGVkdWxlCisKKwkmbW92CSgkczAsMHgxYjFiMWIxYik7CQkjIG1hZ2ljIGNvbnN0YW50CisJJm1vdgkoJkRXUCg4LCJlc3AiKSwkczApOworCSZtb3YJKCZEV1AoMTIsImVzcCIpLCRzMCk7CisKKwkjIHByZWZldGNoIFRkNAorCSZtb3YJKCRzMCwmRFdQKDAtMTI4LCR0YmwpKTsKKwkmbW92CSgkczEsJkRXUCgzMi0xMjgsJHRibCkpOworCSZtb3YJKCRzMiwmRFdQKDY0LTEyOCwkdGJsKSk7CisJJm1vdgkoJHMzLCZEV1AoOTYtMTI4LCR0YmwpKTsKKwkmbW92CSgkczAsJkRXUCgxMjgtMTI4LCR0YmwpKTsKKwkmbW92CSgkczEsJkRXUCgxNjAtMTI4LCR0YmwpKTsKKwkmbW92CSgkczIsJkRXUCgxOTItMTI4LCR0YmwpKTsKKwkmbW92CSgkczMsJkRXUCgyMjQtMTI4LCR0YmwpKTsKKworCSZzZXRfbGFiZWwoImxvb3AiLDE2KTsKKwkJJnNzZV9kZWNjb21wYWN0KCk7CisJCSZhZGQJKCRrZXksMTYpOworCQkmY21wCSgka2V5LCRfX2VuZCk7CisJCSZqYQkoJmxhYmVsKCJvdXQiKSk7CisKKwkJIyBST1RBVEUoeF55LE4pID09IFJPVEFURSh4LE4pXlJPVEFURSh5LE4pCisJCSZtb3ZxCSgibW0zIiwibW0wIik7CQkmbW92cQkoIm1tNyIsIm1tNCIpOworCQkmbW92cQkoIm1tMiIsIm1tMCIsMSk7CSZtb3ZxCSgibW02IiwibW00IiwxKTsKKwkJJm1vdnEJKCJtbTEiLCJtbTAiKTsJCSZtb3ZxCSgibW01IiwibW00Iik7CisJCSZwc2h1ZncJKCJtbTAiLCJtbTAiLDB4YjEpOwkmcHNodWZ3CSgibW00IiwibW00IiwweGIxKTsjID0gUk9UQVRFKHRwMCwxNikKKwkJJnBzbGxkCSgibW0yIiw4KTsJCSZwc2xsZAkoIm1tNiIsOCk7CisJCSZwc3JsZAkoIm1tMyIsOCk7CQkmcHNybGQJKCJtbTciLDgpOworCQkmcHhvcgkoIm1tMCIsIm1tMiIpOwkJJnB4b3IJKCJtbTQiLCJtbTYiKTsJIyBePSB0cDA8PDgKKwkJJnB4b3IJKCJtbTAiLCJtbTMiKTsJCSZweG9yCSgibW00IiwibW03Iik7CSMgXj0gdHAwPj44CisJCSZwc2xsZAkoIm1tMiIsMTYpOwkJJnBzbGxkCSgibW02IiwxNik7CisJCSZwc3JsZAkoIm1tMyIsMTYpOwkJJnBzcmxkCSgibW03IiwxNik7CisJCSZweG9yCSgibW0wIiwibW0yIik7CQkmcHhvcgkoIm1tNCIsIm1tNiIpOwkjIF49IHRwMDw8MjQKKwkJJnB4b3IJKCJtbTAiLCJtbTMiKTsJCSZweG9yCSgibW00IiwibW03Iik7CSMgXj0gdHAwPj4yNAorCisJCSZtb3ZxCSgibW0zIiwmUVdQKDgsImVzcCIpKTsKKwkJJnB4b3IJKCJtbTIiLCJtbTIiKTsJCSZweG9yCSgibW02IiwibW02Iik7CisJCSZwY21wZ3RiKCJtbTIiLCJtbTEiKTsJCSZwY21wZ3RiKCJtbTYiLCJtbTUiKTsKKwkJJnBhbmQJKCJtbTIiLCJtbTMiKTsJCSZwYW5kCSgibW02IiwibW0zIik7CisJCSZwYWRkYgkoIm1tMSIsIm1tMSIpOwkJJnBhZGRiCSgibW01IiwibW01Iik7CisJCSZweG9yCSgibW0xIiwibW0yIik7CQkmcHhvcgkoIm1tNSIsIm1tNiIpOwkjIHRwMgorCQkmbW92cQkoIm1tMyIsIm1tMSIpOwkJJm1vdnEJKCJtbTciLCJtbTUiKTsKKwkJJm1vdnEJKCJtbTIiLCJtbTEiKTsJCSZtb3ZxCSgibW02IiwibW01Iik7CisJCSZweG9yCSgibW0wIiwibW0xIik7CQkmcHhvcgkoIm1tNCIsIm1tNSIpOwkjIF49IHRwMgorCQkmcHNsbGQJKCJtbTMiLDI0KTsJCSZwc2xsZAkoIm1tNyIsMjQpOworCQkmcHNybGQJKCJtbTIiLDgpOwkJJnBzcmxkCSgibW02Iiw4KTsKKwkJJnB4b3IJKCJtbTAiLCJtbTMiKTsJCSZweG9yCSgibW00IiwibW03Iik7CSMgXj0gdHAyPDwyNAorCQkmcHhvcgkoIm1tMCIsIm1tMiIpOwkJJnB4b3IJKCJtbTQiLCJtbTYiKTsJIyBePSB0cDI+PjgKKworCQkmbW92cQkoIm1tMiIsJlFXUCg4LCJlc3AiKSk7CisJCSZweG9yCSgibW0zIiwibW0zIik7CQkmcHhvcgkoIm1tNyIsIm1tNyIpOworCQkmcGNtcGd0YigibW0zIiwibW0xIik7CQkmcGNtcGd0YigibW03IiwibW01Iik7CisJCSZwYW5kCSgibW0zIiwibW0yIik7CQkmcGFuZAkoIm1tNyIsIm1tMiIpOworCQkmcGFkZGIJKCJtbTEiLCJtbTEiKTsJCSZwYWRkYgkoIm1tNSIsIm1tNSIpOworCQkmcHhvcgkoIm1tMSIsIm1tMyIpOwkJJnB4b3IJKCJtbTUiLCJtbTciKTsJIyB0cDQKKwkJJnBzaHVmdwkoIm1tMyIsIm1tMSIsMHhiMSk7CSZwc2h1ZncJKCJtbTciLCJtbTUiLDB4YjEpOworCQkmcHhvcgkoIm1tMCIsIm1tMSIpOwkJJnB4b3IJKCJtbTQiLCJtbTUiKTsJIyBePSB0cDQKKwkJJnB4b3IJKCJtbTAiLCJtbTMiKTsJCSZweG9yCSgibW00IiwibW03Iik7CSMgXj0gUk9UQVRFKHRwNCwxNikJCisKKwkJJnB4b3IJKCJtbTMiLCJtbTMiKTsJCSZweG9yCSgibW03IiwibW03Iik7CisJCSZwY21wZ3RiKCJtbTMiLCJtbTEiKTsJCSZwY21wZ3RiKCJtbTciLCJtbTUiKTsKKwkJJnBhbmQJKCJtbTMiLCJtbTIiKTsJCSZwYW5kCSgibW03IiwibW0yIik7CisJCSZwYWRkYgkoIm1tMSIsIm1tMSIpOwkJJnBhZGRiCSgibW01IiwibW01Iik7CisJCSZweG9yCSgibW0xIiwibW0zIik7CQkmcHhvcgkoIm1tNSIsIm1tNyIpOwkjIHRwOAorCQkmcHhvcgkoIm1tMCIsIm1tMSIpOwkJJnB4b3IJKCJtbTQiLCJtbTUiKTsJIyBePSB0cDgKKwkJJm1vdnEJKCJtbTMiLCJtbTEiKTsJCSZtb3ZxCSgibW03IiwibW01Iik7CisJCSZwc2h1ZncJKCJtbTIiLCJtbTEiLDB4YjEpOwkmcHNodWZ3CSgibW02IiwibW01IiwweGIxKTsKKwkJJnB4b3IJKCJtbTAiLCJtbTIiKTsJCSZweG9yCSgibW00IiwibW02Iik7CSMgXj0gUk9UQVRFKHRwOCwxNikKKwkJJnBzbGxkCSgibW0xIiw4KTsJCSZwc2xsZAkoIm1tNSIsOCk7CisJCSZwc3JsZAkoIm1tMyIsOCk7CQkmcHNybGQJKCJtbTciLDgpOworCQkmbW92cQkoIm1tMiIsJlFXUCgwLCRrZXkpKTsJJm1vdnEJKCJtbTYiLCZRV1AoOCwka2V5KSk7CisJCSZweG9yCSgibW0wIiwibW0xIik7CQkmcHhvcgkoIm1tNCIsIm1tNSIpOwkjIF49IHRwODw8OAorCQkmcHhvcgkoIm1tMCIsIm1tMyIpOwkJJnB4b3IJKCJtbTQiLCJtbTciKTsJIyBePSB0cDg+PjgKKwkJJm1vdgkoJHMwLCZEV1AoMC0xMjgsJHRibCkpOworCQkmcHNsbGQJKCJtbTEiLDE2KTsJCSZwc2xsZAkoIm1tNSIsMTYpOworCQkmbW92CSgkczEsJkRXUCg2NC0xMjgsJHRibCkpOworCQkmcHNybGQJKCJtbTMiLDE2KTsJCSZwc3JsZAkoIm1tNyIsMTYpOworCQkmbW92CSgkczIsJkRXUCgxMjgtMTI4LCR0YmwpKTsKKwkJJnB4b3IJKCJtbTAiLCJtbTEiKTsJCSZweG9yCSgibW00IiwibW01Iik7CSMgXj0gdHA4PDwyNAorCQkmbW92CSgkczMsJkRXUCgxOTItMTI4LCR0YmwpKTsKKwkJJnB4b3IJKCJtbTAiLCJtbTMiKTsJCSZweG9yCSgibW00IiwibW03Iik7CSMgXj0gdHA4Pj4yNAorCisJCSZweG9yCSgibW0wIiwibW0yIik7CQkmcHhvcgkoIm1tNCIsIm1tNiIpOworCSZqbXAJKCZsYWJlbCgibG9vcCIpKTsKKworCSZzZXRfbGFiZWwoIm91dCIsMTYpOworCSZweG9yCSgibW0wIiwmUVdQKDAsJGtleSkpOworCSZweG9yCSgibW00IiwmUVdQKDgsJGtleSkpOworCisJJnJldAkoKTsKKyZmdW5jdGlvbl9lbmRfQigiX3NzZV9BRVNfZGVjcnlwdF9jb21wYWN0Iik7CisJCQkJCX0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBWYW5pbGxhIGJsb2NrIGZ1bmN0aW9uLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitzdWIgZGVjc3RlcCgpCit7IG15ICgkaSwkdGQsQHMpID0gQF87CisgIG15ICR0bXAgPSAka2V5OworICBteSAkb3V0ID0gJGk9PTM/JHNbMF06JGFjYzsKKworCSMgbm8gaW5zdHJ1Y3Rpb25zIGFyZSByZW9yZGVyZWQsIGFzIHBlcmZvcm1hbmNlIGFwcGVhcnMKKwkjIG9wdGltYWwuLi4gb3IgcmF0aGVyIHRoYXQgYWxsIGF0dGVtcHRzIHRvIHJlb3JkZXIgZGlkbid0CisJIyByZXN1bHQgaW4gYmV0dGVyIHBlcmZvcm1hbmNlIFt3aGljaCBieSB0aGUgd2F5IGlzIG5vdCBhCisJIyBiaXQgbG93ZXIgdGhhbiBlY3J5cHRpb25dLgorCWlmKCRpPT0zKSAgIHsJJm1vdgkoJGtleSwkX19rZXkpOwkJCX0KKwllbHNlICAgICAgICB7CSZtb3YJKCRvdXQsJHNbMF0pOwkJCX0KKwkJCSZhbmQJKCRvdXQsMHhGRik7CisJCQkmbW92CSgkb3V0LCZEV1AoMCwkdGQsJG91dCw4KSk7CisKKwlpZiAoJGk9PTMpICB7CSR0bXA9JHNbMV07CQkJCX0KKwkJCSZtb3Z6CSgkdG1wLCZIQigkc1sxXSkpOworCQkJJnhvcgkoJG91dCwmRFdQKDMsJHRkLCR0bXAsOCkpOworCisJaWYgKCRpPT0zKSAgewkkdG1wPSRzWzJdOyAmbW92ICgkc1sxXSwkYWNjKTsJCX0KKwllbHNlICAgICAgICB7CSZtb3YJKCR0bXAsJHNbMl0pOwkJCX0KKwkJCSZzaHIJKCR0bXAsMTYpOworCQkJJmFuZAkoJHRtcCwweEZGKTsKKwkJCSZ4b3IJKCRvdXQsJkRXUCgyLCR0ZCwkdG1wLDgpKTsKKworCWlmICgkaT09MykgIHsJJHRtcD0kc1szXTsgJm1vdiAoJHNbMl0sJF9fczEpOwkJfQorCWVsc2UgICAgICAgIHsJJm1vdgkoJHRtcCwkc1szXSk7CQkJfQorCQkJJnNocgkoJHRtcCwyNCk7CisJCQkmeG9yCSgkb3V0LCZEV1AoMSwkdGQsJHRtcCw4KSk7CisJaWYgKCRpPDIpICAgewkmbW92CSgmRFdQKDQrNCokaSwiZXNwIiksJG91dCk7CX0KKwlpZiAoJGk9PTMpICB7CSZtb3YJKCRzWzNdLCRfX3MwKTsJCQl9CisJCQkmY29tbWVudCgpOworfQorCitzdWIgZGVjbGFzdCgpCit7IG15ICgkaSwkdGQsQHMpPUBfOworICBteSAkdG1wID0gJGtleTsKKyAgbXkgJG91dCA9ICRpPT0zPyRzWzBdOiRhY2M7CisKKwlpZigkaT09MCkgICB7CSZsZWEJKCR0ZCwmRFdQKDIwNDgrMTI4LCR0ZCkpOworCQkJJm1vdgkoJHRtcCwmRFdQKDAtMTI4LCR0ZCkpOworCQkJJm1vdgkoJGFjYywmRFdQKDMyLTEyOCwkdGQpKTsKKwkJCSZtb3YJKCR0bXAsJkRXUCg2NC0xMjgsJHRkKSk7CisJCQkmbW92CSgkYWNjLCZEV1AoOTYtMTI4LCR0ZCkpOworCQkJJm1vdgkoJHRtcCwmRFdQKDEyOC0xMjgsJHRkKSk7CisJCQkmbW92CSgkYWNjLCZEV1AoMTYwLTEyOCwkdGQpKTsKKwkJCSZtb3YJKCR0bXAsJkRXUCgxOTItMTI4LCR0ZCkpOworCQkJJm1vdgkoJGFjYywmRFdQKDIyNC0xMjgsJHRkKSk7CisJCQkmbGVhCSgkdGQsJkRXUCgtMTI4LCR0ZCkpOwkJfQorCWlmKCRpPT0zKSAgIHsJJm1vdgkoJGtleSwkX19rZXkpOwkJCX0KKwllbHNlICAgICAgICB7CSZtb3YJKCRvdXQsJHNbMF0pOwkJCX0KKwkJCSZhbmQJKCRvdXQsMHhGRik7CisJCQkmbW92egkoJG91dCwmQlAoMCwkdGQsJG91dCwxKSk7CisKKwlpZiAoJGk9PTMpICB7CSR0bXA9JHNbMV07CQkJCX0KKwkJCSZtb3Z6CSgkdG1wLCZIQigkc1sxXSkpOworCQkJJm1vdnoJKCR0bXAsJkJQKDAsJHRkLCR0bXAsMSkpOworCQkJJnNobAkoJHRtcCw4KTsKKwkJCSZ4b3IJKCRvdXQsJHRtcCk7CisKKwlpZiAoJGk9PTMpICB7CSR0bXA9JHNbMl07ICZtb3YgKCRzWzFdLCRhY2MpOwkJfQorCWVsc2UgICAgICAgIHsJbW92CSgkdG1wLCRzWzJdKTsJCQl9CisJCQkmc2hyCSgkdG1wLDE2KTsKKwkJCSZhbmQJKCR0bXAsMHhGRik7CisJCQkmbW92egkoJHRtcCwmQlAoMCwkdGQsJHRtcCwxKSk7CisJCQkmc2hsCSgkdG1wLDE2KTsKKwkJCSZ4b3IJKCRvdXQsJHRtcCk7CisKKwlpZiAoJGk9PTMpICB7CSR0bXA9JHNbM107ICZtb3YgKCRzWzJdLCRfX3MxKTsJCX0KKwllbHNlICAgICAgICB7CSZtb3YJKCR0bXAsJHNbM10pOwkJCX0KKwkJCSZzaHIJKCR0bXAsMjQpOworCQkJJm1vdnoJKCR0bXAsJkJQKDAsJHRkLCR0bXAsMSkpOworCQkJJnNobAkoJHRtcCwyNCk7CisJCQkmeG9yCSgkb3V0LCR0bXApOworCWlmICgkaTwyKSAgIHsJJm1vdgkoJkRXUCg0KzQqJGksImVzcCIpLCRvdXQpOwl9CisJaWYgKCRpPT0zKSAgewkmbW92CSgkc1szXSwkX19zMCk7CisJCQkmbGVhCSgkdGQsJkRXUCgtMjA0OCwkdGQpKTsJCX0KK30KKworJmZ1bmN0aW9uX2JlZ2luX0IoIl94ODZfQUVTX2RlY3J5cHQiKTsKKwkjIG5vdGUgdGhhdCBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gYWxsb2NhdGUgc3RhY2sgZnJhbWUgZm9yIG1lIQorCSZtb3YJKCRfX2tleSwka2V5KTsJCQkjIHNhdmUga2V5CisKKwkmeG9yCSgkczAsJkRXUCgwLCRrZXkpKTsJCSMgeG9yIHdpdGgga2V5CisJJnhvcgkoJHMxLCZEV1AoNCwka2V5KSk7CisJJnhvcgkoJHMyLCZEV1AoOCwka2V5KSk7CisJJnhvcgkoJHMzLCZEV1AoMTIsJGtleSkpOworCisJJm1vdgkoJGFjYywmRFdQKDI0MCwka2V5KSk7CQkjIGxvYWQga2V5LT5yb3VuZHMKKworCWlmICgkc21hbGxfZm9vdHByaW50KSB7CisJICAgICZsZWEJKCRhY2MsJkRXUCgtMiwkYWNjLCRhY2MpKTsKKwkgICAgJmxlYQkoJGFjYywmRFdQKDAsJGtleSwkYWNjLDgpKTsKKwkgICAgJm1vdgkoJF9fZW5kLCRhY2MpOwkJIyBlbmQgb2Yga2V5IHNjaGVkdWxlCisJICAgICZzZXRfbGFiZWwoImxvb3AiLDE2KTsKKwkJJmRlY3N0ZXAoMCwkdGJsLCRzMCwkczMsJHMyLCRzMSk7CisJCSZkZWNzdGVwKDEsJHRibCwkczEsJHMwLCRzMywkczIpOworCQkmZGVjc3RlcCgyLCR0YmwsJHMyLCRzMSwkczAsJHMzKTsKKwkJJmRlY3N0ZXAoMywkdGJsLCRzMywkczIsJHMxLCRzMCk7CisJCSZhZGQJKCRrZXksMTYpOwkJIyBhZHZhbmNlIHJkX2tleQorCQkmeG9yCSgkczAsJkRXUCgwLCRrZXkpKTsKKwkJJnhvcgkoJHMxLCZEV1AoNCwka2V5KSk7CisJCSZ4b3IJKCRzMiwmRFdQKDgsJGtleSkpOworCQkmeG9yCSgkczMsJkRXUCgxMiwka2V5KSk7CisJICAgICZjbXAJKCRrZXksJF9fZW5kKTsKKwkgICAgJm1vdgkoJF9fa2V5LCRrZXkpOworCSAgICAmamIJCSgmbGFiZWwoImxvb3AiKSk7CisJfQorCWVsc2UgeworCSAgICAmY21wCSgkYWNjLDEwKTsKKwkgICAgJmpsZQkoJmxhYmVsKCIxMHJvdW5kcyIpKTsKKwkgICAgJmNtcAkoJGFjYywxMik7CisJICAgICZqbGUJKCZsYWJlbCgiMTJyb3VuZHMiKSk7CisKKwkmc2V0X2xhYmVsKCIxNHJvdW5kcyIsNCk7CisJICAgIGZvciAoJGk9MTskaTwzOyRpKyspIHsKKwkJJmRlY3N0ZXAoMCwkdGJsLCRzMCwkczMsJHMyLCRzMSk7CisJCSZkZWNzdGVwKDEsJHRibCwkczEsJHMwLCRzMywkczIpOworCQkmZGVjc3RlcCgyLCR0YmwsJHMyLCRzMSwkczAsJHMzKTsKKwkJJmRlY3N0ZXAoMywkdGJsLCRzMywkczIsJHMxLCRzMCk7CisJCSZ4b3IJKCRzMCwmRFdQKDE2KiRpKzAsJGtleSkpOworCQkmeG9yCSgkczEsJkRXUCgxNiokaSs0LCRrZXkpKTsKKwkJJnhvcgkoJHMyLCZEV1AoMTYqJGkrOCwka2V5KSk7CisJCSZ4b3IJKCRzMywmRFdQKDE2KiRpKzEyLCRrZXkpKTsKKwkgICAgfQorCSAgICAmYWRkCSgka2V5LDMyKTsKKwkgICAgJm1vdgkoJF9fa2V5LCRrZXkpOwkJIyBhZHZhbmNlIHJkX2tleQorCSZzZXRfbGFiZWwoIjEycm91bmRzIiw0KTsKKwkgICAgZm9yICgkaT0xOyRpPDM7JGkrKykgeworCQkmZGVjc3RlcCgwLCR0YmwsJHMwLCRzMywkczIsJHMxKTsKKwkJJmRlY3N0ZXAoMSwkdGJsLCRzMSwkczAsJHMzLCRzMik7CisJCSZkZWNzdGVwKDIsJHRibCwkczIsJHMxLCRzMCwkczMpOworCQkmZGVjc3RlcCgzLCR0YmwsJHMzLCRzMiwkczEsJHMwKTsKKwkJJnhvcgkoJHMwLCZEV1AoMTYqJGkrMCwka2V5KSk7CisJCSZ4b3IJKCRzMSwmRFdQKDE2KiRpKzQsJGtleSkpOworCQkmeG9yCSgkczIsJkRXUCgxNiokaSs4LCRrZXkpKTsKKwkJJnhvcgkoJHMzLCZEV1AoMTYqJGkrMTIsJGtleSkpOworCSAgICB9CisJICAgICZhZGQJKCRrZXksMzIpOworCSAgICAmbW92CSgkX19rZXksJGtleSk7CQkjIGFkdmFuY2UgcmRfa2V5CisJJnNldF9sYWJlbCgiMTByb3VuZHMiLDQpOworCSAgICBmb3IgKCRpPTE7JGk8MTA7JGkrKykgeworCQkmZGVjc3RlcCgwLCR0YmwsJHMwLCRzMywkczIsJHMxKTsKKwkJJmRlY3N0ZXAoMSwkdGJsLCRzMSwkczAsJHMzLCRzMik7CisJCSZkZWNzdGVwKDIsJHRibCwkczIsJHMxLCRzMCwkczMpOworCQkmZGVjc3RlcCgzLCR0YmwsJHMzLCRzMiwkczEsJHMwKTsKKwkJJnhvcgkoJHMwLCZEV1AoMTYqJGkrMCwka2V5KSk7CisJCSZ4b3IJKCRzMSwmRFdQKDE2KiRpKzQsJGtleSkpOworCQkmeG9yCSgkczIsJkRXUCgxNiokaSs4LCRrZXkpKTsKKwkJJnhvcgkoJHMzLCZEV1AoMTYqJGkrMTIsJGtleSkpOworCSAgICB9CisJfQorCisJJmRlY2xhc3QoMCwkdGJsLCRzMCwkczMsJHMyLCRzMSk7CisJJmRlY2xhc3QoMSwkdGJsLCRzMSwkczAsJHMzLCRzMik7CisJJmRlY2xhc3QoMiwkdGJsLCRzMiwkczEsJHMwLCRzMyk7CisJJmRlY2xhc3QoMywkdGJsLCRzMywkczIsJHMxLCRzMCk7CisKKwkmYWRkCSgka2V5LCRzbWFsbF9mb290cHJpbnQ/MTY6MTYwKTsKKwkmeG9yCSgkczAsJkRXUCgwLCRrZXkpKTsKKwkmeG9yCSgkczEsJkRXUCg0LCRrZXkpKTsKKwkmeG9yCSgkczIsJkRXUCg4LCRrZXkpKTsKKwkmeG9yCSgkczMsJkRXUCgxMiwka2V5KSk7CisKKwkmcmV0CSgpOworCismc2V0X2xhYmVsKCJBRVNfVGQiLDY0KTsJIyBZZXMhIEkga2VlcCBpdCBpbiB0aGUgY29kZSBzZWdtZW50IQorCSZfZGF0YV93b3JkKDB4NTBhN2Y0NTEsIDB4NTM2NTQxN2UsIDB4YzNhNDE3MWEsIDB4OTY1ZTI3M2EpOworCSZfZGF0YV93b3JkKDB4Y2I2YmFiM2IsIDB4ZjE0NTlkMWYsIDB4YWI1OGZhYWMsIDB4OTMwM2UzNGIpOworCSZfZGF0YV93b3JkKDB4NTVmYTMwMjAsIDB4ZjY2ZDc2YWQsIDB4OTE3NmNjODgsIDB4MjU0YzAyZjUpOworCSZfZGF0YV93b3JkKDB4ZmNkN2U1NGYsIDB4ZDdjYjJhYzUsIDB4ODA0NDM1MjYsIDB4OGZhMzYyYjUpOworCSZfZGF0YV93b3JkKDB4NDk1YWIxZGUsIDB4NjcxYmJhMjUsIDB4OTgwZWVhNDUsIDB4ZTFjMGZlNWQpOworCSZfZGF0YV93b3JkKDB4MDI3NTJmYzMsIDB4MTJmMDRjODEsIDB4YTM5NzQ2OGQsIDB4YzZmOWQzNmIpOworCSZfZGF0YV93b3JkKDB4ZTc1ZjhmMDMsIDB4OTU5YzkyMTUsIDB4ZWI3YTZkYmYsIDB4ZGE1OTUyOTUpOworCSZfZGF0YV93b3JkKDB4MmQ4M2JlZDQsIDB4ZDMyMTc0NTgsIDB4Mjk2OWUwNDksIDB4NDRjOGM5OGUpOworCSZfZGF0YV93b3JkKDB4NmE4OWMyNzUsIDB4Nzg3OThlZjQsIDB4NmIzZTU4OTksIDB4ZGQ3MWI5MjcpOworCSZfZGF0YV93b3JkKDB4YjY0ZmUxYmUsIDB4MTdhZDg4ZjAsIDB4NjZhYzIwYzksIDB4YjQzYWNlN2QpOworCSZfZGF0YV93b3JkKDB4MTg0YWRmNjMsIDB4ODIzMTFhZTUsIDB4NjAzMzUxOTcsIDB4NDU3ZjUzNjIpOworCSZfZGF0YV93b3JkKDB4ZTA3NzY0YjEsIDB4ODRhZTZiYmIsIDB4MWNhMDgxZmUsIDB4OTQyYjA4ZjkpOworCSZfZGF0YV93b3JkKDB4NTg2ODQ4NzAsIDB4MTlmZDQ1OGYsIDB4ODc2Y2RlOTQsIDB4YjdmODdiNTIpOworCSZfZGF0YV93b3JkKDB4MjNkMzczYWIsIDB4ZTIwMjRiNzIsIDB4NTc4ZjFmZTMsIDB4MmFhYjU1NjYpOworCSZfZGF0YV93b3JkKDB4MDcyOGViYjIsIDB4MDNjMmI1MmYsIDB4OWE3YmM1ODYsIDB4YTUwODM3ZDMpOworCSZfZGF0YV93b3JkKDB4ZjI4NzI4MzAsIDB4YjJhNWJmMjMsIDB4YmE2YTAzMDIsIDB4NWM4MjE2ZWQpOworCSZfZGF0YV93b3JkKDB4MmIxY2NmOGEsIDB4OTJiNDc5YTcsIDB4ZjBmMjA3ZjMsIDB4YTFlMjY5NGUpOworCSZfZGF0YV93b3JkKDB4Y2RmNGRhNjUsIDB4ZDViZTA1MDYsIDB4MWY2MjM0ZDEsIDB4OGFmZWE2YzQpOworCSZfZGF0YV93b3JkKDB4OWQ1MzJlMzQsIDB4YTA1NWYzYTIsIDB4MzJlMThhMDUsIDB4NzVlYmY2YTQpOworCSZfZGF0YV93b3JkKDB4MzllYzgzMGIsIDB4YWFlZjYwNDAsIDB4MDY5ZjcxNWUsIDB4NTExMDZlYmQpOworCSZfZGF0YV93b3JkKDB4Zjk4YTIxM2UsIDB4M2QwNmRkOTYsIDB4YWUwNTNlZGQsIDB4NDZiZGU2NGQpOworCSZfZGF0YV93b3JkKDB4YjU4ZDU0OTEsIDB4MDU1ZGM0NzEsIDB4NmZkNDA2MDQsIDB4ZmYxNTUwNjApOworCSZfZGF0YV93b3JkKDB4MjRmYjk4MTksIDB4OTdlOWJkZDYsIDB4Y2M0MzQwODksIDB4Nzc5ZWQ5NjcpOworCSZfZGF0YV93b3JkKDB4YmQ0MmU4YjAsIDB4ODg4Yjg5MDcsIDB4Mzg1YjE5ZTcsIDB4ZGJlZWM4NzkpOworCSZfZGF0YV93b3JkKDB4NDcwYTdjYTEsIDB4ZTkwZjQyN2MsIDB4YzkxZTg0ZjgsIDB4MDAwMDAwMDApOworCSZfZGF0YV93b3JkKDB4ODM4NjgwMDksIDB4NDhlZDJiMzIsIDB4YWM3MDExMWUsIDB4NGU3MjVhNmMpOworCSZfZGF0YV93b3JkKDB4ZmJmZjBlZmQsIDB4NTYzODg1MGYsIDB4MWVkNWFlM2QsIDB4MjczOTJkMzYpOworCSZfZGF0YV93b3JkKDB4NjRkOTBmMGEsIDB4MjFhNjVjNjgsIDB4ZDE1NDViOWIsIDB4M2EyZTM2MjQpOworCSZfZGF0YV93b3JkKDB4YjE2NzBhMGMsIDB4MGZlNzU3OTMsIDB4ZDI5NmVlYjQsIDB4OWU5MTliMWIpOworCSZfZGF0YV93b3JkKDB4NGZjNWMwODAsIDB4YTIyMGRjNjEsIDB4Njk0Yjc3NWEsIDB4MTYxYTEyMWMpOworCSZfZGF0YV93b3JkKDB4MGFiYTkzZTIsIDB4ZTUyYWEwYzAsIDB4NDNlMDIyM2MsIDB4MWQxNzFiMTIpOworCSZfZGF0YV93b3JkKDB4MGIwZDA5MGUsIDB4YWRjNzhiZjIsIDB4YjlhOGI2MmQsIDB4YzhhOTFlMTQpOworCSZfZGF0YV93b3JkKDB4ODUxOWYxNTcsIDB4NGMwNzc1YWYsIDB4YmJkZDk5ZWUsIDB4ZmQ2MDdmYTMpOworCSZfZGF0YV93b3JkKDB4OWYyNjAxZjcsIDB4YmNmNTcyNWMsIDB4YzUzYjY2NDQsIDB4MzQ3ZWZiNWIpOworCSZfZGF0YV93b3JkKDB4NzYyOTQzOGIsIDB4ZGNjNjIzY2IsIDB4NjhmY2VkYjYsIDB4NjNmMWU0YjgpOworCSZfZGF0YV93b3JkKDB4Y2FkYzMxZDcsIDB4MTA4NTYzNDIsIDB4NDAyMjk3MTMsIDB4MjAxMWM2ODQpOworCSZfZGF0YV93b3JkKDB4N2QyNDRhODUsIDB4ZjgzZGJiZDIsIDB4MTEzMmY5YWUsIDB4NmRhMTI5YzcpOworCSZfZGF0YV93b3JkKDB4NGIyZjllMWQsIDB4ZjMzMGIyZGMsIDB4ZWM1Mjg2MGQsIDB4ZDBlM2MxNzcpOworCSZfZGF0YV93b3JkKDB4NmMxNmIzMmIsIDB4OTliOTcwYTksIDB4ZmE0ODk0MTEsIDB4MjI2NGU5NDcpOworCSZfZGF0YV93b3JkKDB4YzQ4Y2ZjYTgsIDB4MWEzZmYwYTAsIDB4ZDgyYzdkNTYsIDB4ZWY5MDMzMjIpOworCSZfZGF0YV93b3JkKDB4Yzc0ZTQ5ODcsIDB4YzFkMTM4ZDksIDB4ZmVhMmNhOGMsIDB4MzYwYmQ0OTgpOworCSZfZGF0YV93b3JkKDB4Y2Y4MWY1YTYsIDB4MjhkZTdhYTUsIDB4MjY4ZWI3ZGEsIDB4YTRiZmFkM2YpOworCSZfZGF0YV93b3JkKDB4ZTQ5ZDNhMmMsIDB4MGQ5Mjc4NTAsIDB4OWJjYzVmNmEsIDB4NjI0NjdlNTQpOworCSZfZGF0YV93b3JkKDB4YzIxMzhkZjYsIDB4ZThiOGQ4OTAsIDB4NWVmNzM5MmUsIDB4ZjVhZmMzODIpOworCSZfZGF0YV93b3JkKDB4YmU4MDVkOWYsIDB4N2M5M2QwNjksIDB4YTkyZGQ1NmYsIDB4YjMxMjI1Y2YpOworCSZfZGF0YV93b3JkKDB4M2I5OWFjYzgsIDB4YTc3ZDE4MTAsIDB4NmU2MzljZTgsIDB4N2JiYjNiZGIpOworCSZfZGF0YV93b3JkKDB4MDk3ODI2Y2QsIDB4ZjQxODU5NmUsIDB4MDFiNzlhZWMsIDB4YTg5YTRmODMpOworCSZfZGF0YV93b3JkKDB4NjU2ZTk1ZTYsIDB4N2VlNmZmYWEsIDB4MDhjZmJjMjEsIDB4ZTZlODE1ZWYpOworCSZfZGF0YV93b3JkKDB4ZDk5YmU3YmEsIDB4Y2UzNjZmNGEsIDB4ZDQwOTlmZWEsIDB4ZDY3Y2IwMjkpOworCSZfZGF0YV93b3JkKDB4YWZiMmE0MzEsIDB4MzEyMzNmMmEsIDB4MzA5NGE1YzYsIDB4YzA2NmEyMzUpOworCSZfZGF0YV93b3JkKDB4MzdiYzRlNzQsIDB4YTZjYTgyZmMsIDB4YjBkMDkwZTAsIDB4MTVkOGE3MzMpOworCSZfZGF0YV93b3JkKDB4NGE5ODA0ZjEsIDB4ZjdkYWVjNDEsIDB4MGU1MGNkN2YsIDB4MmZmNjkxMTcpOworCSZfZGF0YV93b3JkKDB4OGRkNjRkNzYsIDB4NGRiMGVmNDMsIDB4NTQ0ZGFhY2MsIDB4ZGYwNDk2ZTQpOworCSZfZGF0YV93b3JkKDB4ZTNiNWQxOWUsIDB4MWI4ODZhNGMsIDB4YjgxZjJjYzEsIDB4N2Y1MTY1NDYpOworCSZfZGF0YV93b3JkKDB4MDRlYTVlOWQsIDB4NWQzNThjMDEsIDB4NzM3NDg3ZmEsIDB4MmU0MTBiZmIpOworCSZfZGF0YV93b3JkKDB4NWExZDY3YjMsIDB4NTJkMmRiOTIsIDB4MzM1NjEwZTksIDB4MTM0N2Q2NmQpOworCSZfZGF0YV93b3JkKDB4OGM2MWQ3OWEsIDB4N2EwY2ExMzcsIDB4OGUxNGY4NTksIDB4ODkzYzEzZWIpOworCSZfZGF0YV93b3JkKDB4ZWUyN2E5Y2UsIDB4MzVjOTYxYjcsIDB4ZWRlNTFjZTEsIDB4M2NiMTQ3N2EpOworCSZfZGF0YV93b3JkKDB4NTlkZmQyOWMsIDB4M2Y3M2YyNTUsIDB4NzljZTE0MTgsIDB4YmYzN2M3NzMpOworCSZfZGF0YV93b3JkKDB4ZWFjZGY3NTMsIDB4NWJhYWZkNWYsIDB4MTQ2ZjNkZGYsIDB4ODZkYjQ0NzgpOworCSZfZGF0YV93b3JkKDB4ODFmM2FmY2EsIDB4M2VjNDY4YjksIDB4MmMzNDI0MzgsIDB4NWY0MGEzYzIpOworCSZfZGF0YV93b3JkKDB4NzJjMzFkMTYsIDB4MGMyNWUyYmMsIDB4OGI0OTNjMjgsIDB4NDE5NTBkZmYpOworCSZfZGF0YV93b3JkKDB4NzEwMWE4MzksIDB4ZGViMzBjMDgsIDB4OWNlNGI0ZDgsIDB4OTBjMTU2NjQpOworCSZfZGF0YV93b3JkKDB4NjE4NGNiN2IsIDB4NzBiNjMyZDUsIDB4NzQ1YzZjNDgsIDB4NDI1N2I4ZDApOworCisjVGQ0OgkjIGZvdXIgY29waWVzIG9mIFRkNCB0byBjaG9vc2UgZnJvbSB0byBhdm9pZCBMMSBhbGlhc2luZworCSZkYXRhX2J5dGUoMHg1MiwgMHgwOSwgMHg2YSwgMHhkNSwgMHgzMCwgMHgzNiwgMHhhNSwgMHgzOCk7CisJJmRhdGFfYnl0ZSgweGJmLCAweDQwLCAweGEzLCAweDllLCAweDgxLCAweGYzLCAweGQ3LCAweGZiKTsKKwkmZGF0YV9ieXRlKDB4N2MsIDB4ZTMsIDB4MzksIDB4ODIsIDB4OWIsIDB4MmYsIDB4ZmYsIDB4ODcpOworCSZkYXRhX2J5dGUoMHgzNCwgMHg4ZSwgMHg0MywgMHg0NCwgMHhjNCwgMHhkZSwgMHhlOSwgMHhjYik7CisJJmRhdGFfYnl0ZSgweDU0LCAweDdiLCAweDk0LCAweDMyLCAweGE2LCAweGMyLCAweDIzLCAweDNkKTsKKwkmZGF0YV9ieXRlKDB4ZWUsIDB4NGMsIDB4OTUsIDB4MGIsIDB4NDIsIDB4ZmEsIDB4YzMsIDB4NGUpOworCSZkYXRhX2J5dGUoMHgwOCwgMHgyZSwgMHhhMSwgMHg2NiwgMHgyOCwgMHhkOSwgMHgyNCwgMHhiMik7CisJJmRhdGFfYnl0ZSgweDc2LCAweDViLCAweGEyLCAweDQ5LCAweDZkLCAweDhiLCAweGQxLCAweDI1KTsKKwkmZGF0YV9ieXRlKDB4NzIsIDB4ZjgsIDB4ZjYsIDB4NjQsIDB4ODYsIDB4NjgsIDB4OTgsIDB4MTYpOworCSZkYXRhX2J5dGUoMHhkNCwgMHhhNCwgMHg1YywgMHhjYywgMHg1ZCwgMHg2NSwgMHhiNiwgMHg5Mik7CisJJmRhdGFfYnl0ZSgweDZjLCAweDcwLCAweDQ4LCAweDUwLCAweGZkLCAweGVkLCAweGI5LCAweGRhKTsKKwkmZGF0YV9ieXRlKDB4NWUsIDB4MTUsIDB4NDYsIDB4NTcsIDB4YTcsIDB4OGQsIDB4OWQsIDB4ODQpOworCSZkYXRhX2J5dGUoMHg5MCwgMHhkOCwgMHhhYiwgMHgwMCwgMHg4YywgMHhiYywgMHhkMywgMHgwYSk7CisJJmRhdGFfYnl0ZSgweGY3LCAweGU0LCAweDU4LCAweDA1LCAweGI4LCAweGIzLCAweDQ1LCAweDA2KTsKKwkmZGF0YV9ieXRlKDB4ZDAsIDB4MmMsIDB4MWUsIDB4OGYsIDB4Y2EsIDB4M2YsIDB4MGYsIDB4MDIpOworCSZkYXRhX2J5dGUoMHhjMSwgMHhhZiwgMHhiZCwgMHgwMywgMHgwMSwgMHgxMywgMHg4YSwgMHg2Yik7CisJJmRhdGFfYnl0ZSgweDNhLCAweDkxLCAweDExLCAweDQxLCAweDRmLCAweDY3LCAweGRjLCAweGVhKTsKKwkmZGF0YV9ieXRlKDB4OTcsIDB4ZjIsIDB4Y2YsIDB4Y2UsIDB4ZjAsIDB4YjQsIDB4ZTYsIDB4NzMpOworCSZkYXRhX2J5dGUoMHg5NiwgMHhhYywgMHg3NCwgMHgyMiwgMHhlNywgMHhhZCwgMHgzNSwgMHg4NSk7CisJJmRhdGFfYnl0ZSgweGUyLCAweGY5LCAweDM3LCAweGU4LCAweDFjLCAweDc1LCAweGRmLCAweDZlKTsKKwkmZGF0YV9ieXRlKDB4NDcsIDB4ZjEsIDB4MWEsIDB4NzEsIDB4MWQsIDB4MjksIDB4YzUsIDB4ODkpOworCSZkYXRhX2J5dGUoMHg2ZiwgMHhiNywgMHg2MiwgMHgwZSwgMHhhYSwgMHgxOCwgMHhiZSwgMHgxYik7CisJJmRhdGFfYnl0ZSgweGZjLCAweDU2LCAweDNlLCAweDRiLCAweGM2LCAweGQyLCAweDc5LCAweDIwKTsKKwkmZGF0YV9ieXRlKDB4OWEsIDB4ZGIsIDB4YzAsIDB4ZmUsIDB4NzgsIDB4Y2QsIDB4NWEsIDB4ZjQpOworCSZkYXRhX2J5dGUoMHgxZiwgMHhkZCwgMHhhOCwgMHgzMywgMHg4OCwgMHgwNywgMHhjNywgMHgzMSk7CisJJmRhdGFfYnl0ZSgweGIxLCAweDEyLCAweDEwLCAweDU5LCAweDI3LCAweDgwLCAweGVjLCAweDVmKTsKKwkmZGF0YV9ieXRlKDB4NjAsIDB4NTEsIDB4N2YsIDB4YTksIDB4MTksIDB4YjUsIDB4NGEsIDB4MGQpOworCSZkYXRhX2J5dGUoMHgyZCwgMHhlNSwgMHg3YSwgMHg5ZiwgMHg5MywgMHhjOSwgMHg5YywgMHhlZik7CisJJmRhdGFfYnl0ZSgweGEwLCAweGUwLCAweDNiLCAweDRkLCAweGFlLCAweDJhLCAweGY1LCAweGIwKTsKKwkmZGF0YV9ieXRlKDB4YzgsIDB4ZWIsIDB4YmIsIDB4M2MsIDB4ODMsIDB4NTMsIDB4OTksIDB4NjEpOworCSZkYXRhX2J5dGUoMHgxNywgMHgyYiwgMHgwNCwgMHg3ZSwgMHhiYSwgMHg3NywgMHhkNiwgMHgyNik7CisJJmRhdGFfYnl0ZSgweGUxLCAweDY5LCAweDE0LCAweDYzLCAweDU1LCAweDIxLCAweDBjLCAweDdkKTsKKworCSZkYXRhX2J5dGUoMHg1MiwgMHgwOSwgMHg2YSwgMHhkNSwgMHgzMCwgMHgzNiwgMHhhNSwgMHgzOCk7CisJJmRhdGFfYnl0ZSgweGJmLCAweDQwLCAweGEzLCAweDllLCAweDgxLCAweGYzLCAweGQ3LCAweGZiKTsKKwkmZGF0YV9ieXRlKDB4N2MsIDB4ZTMsIDB4MzksIDB4ODIsIDB4OWIsIDB4MmYsIDB4ZmYsIDB4ODcpOworCSZkYXRhX2J5dGUoMHgzNCwgMHg4ZSwgMHg0MywgMHg0NCwgMHhjNCwgMHhkZSwgMHhlOSwgMHhjYik7CisJJmRhdGFfYnl0ZSgweDU0LCAweDdiLCAweDk0LCAweDMyLCAweGE2LCAweGMyLCAweDIzLCAweDNkKTsKKwkmZGF0YV9ieXRlKDB4ZWUsIDB4NGMsIDB4OTUsIDB4MGIsIDB4NDIsIDB4ZmEsIDB4YzMsIDB4NGUpOworCSZkYXRhX2J5dGUoMHgwOCwgMHgyZSwgMHhhMSwgMHg2NiwgMHgyOCwgMHhkOSwgMHgyNCwgMHhiMik7CisJJmRhdGFfYnl0ZSgweDc2LCAweDViLCAweGEyLCAweDQ5LCAweDZkLCAweDhiLCAweGQxLCAweDI1KTsKKwkmZGF0YV9ieXRlKDB4NzIsIDB4ZjgsIDB4ZjYsIDB4NjQsIDB4ODYsIDB4NjgsIDB4OTgsIDB4MTYpOworCSZkYXRhX2J5dGUoMHhkNCwgMHhhNCwgMHg1YywgMHhjYywgMHg1ZCwgMHg2NSwgMHhiNiwgMHg5Mik7CisJJmRhdGFfYnl0ZSgweDZjLCAweDcwLCAweDQ4LCAweDUwLCAweGZkLCAweGVkLCAweGI5LCAweGRhKTsKKwkmZGF0YV9ieXRlKDB4NWUsIDB4MTUsIDB4NDYsIDB4NTcsIDB4YTcsIDB4OGQsIDB4OWQsIDB4ODQpOworCSZkYXRhX2J5dGUoMHg5MCwgMHhkOCwgMHhhYiwgMHgwMCwgMHg4YywgMHhiYywgMHhkMywgMHgwYSk7CisJJmRhdGFfYnl0ZSgweGY3LCAweGU0LCAweDU4LCAweDA1LCAweGI4LCAweGIzLCAweDQ1LCAweDA2KTsKKwkmZGF0YV9ieXRlKDB4ZDAsIDB4MmMsIDB4MWUsIDB4OGYsIDB4Y2EsIDB4M2YsIDB4MGYsIDB4MDIpOworCSZkYXRhX2J5dGUoMHhjMSwgMHhhZiwgMHhiZCwgMHgwMywgMHgwMSwgMHgxMywgMHg4YSwgMHg2Yik7CisJJmRhdGFfYnl0ZSgweDNhLCAweDkxLCAweDExLCAweDQxLCAweDRmLCAweDY3LCAweGRjLCAweGVhKTsKKwkmZGF0YV9ieXRlKDB4OTcsIDB4ZjIsIDB4Y2YsIDB4Y2UsIDB4ZjAsIDB4YjQsIDB4ZTYsIDB4NzMpOworCSZkYXRhX2J5dGUoMHg5NiwgMHhhYywgMHg3NCwgMHgyMiwgMHhlNywgMHhhZCwgMHgzNSwgMHg4NSk7CisJJmRhdGFfYnl0ZSgweGUyLCAweGY5LCAweDM3LCAweGU4LCAweDFjLCAweDc1LCAweGRmLCAweDZlKTsKKwkmZGF0YV9ieXRlKDB4NDcsIDB4ZjEsIDB4MWEsIDB4NzEsIDB4MWQsIDB4MjksIDB4YzUsIDB4ODkpOworCSZkYXRhX2J5dGUoMHg2ZiwgMHhiNywgMHg2MiwgMHgwZSwgMHhhYSwgMHgxOCwgMHhiZSwgMHgxYik7CisJJmRhdGFfYnl0ZSgweGZjLCAweDU2LCAweDNlLCAweDRiLCAweGM2LCAweGQyLCAweDc5LCAweDIwKTsKKwkmZGF0YV9ieXRlKDB4OWEsIDB4ZGIsIDB4YzAsIDB4ZmUsIDB4NzgsIDB4Y2QsIDB4NWEsIDB4ZjQpOworCSZkYXRhX2J5dGUoMHgxZiwgMHhkZCwgMHhhOCwgMHgzMywgMHg4OCwgMHgwNywgMHhjNywgMHgzMSk7CisJJmRhdGFfYnl0ZSgweGIxLCAweDEyLCAweDEwLCAweDU5LCAweDI3LCAweDgwLCAweGVjLCAweDVmKTsKKwkmZGF0YV9ieXRlKDB4NjAsIDB4NTEsIDB4N2YsIDB4YTksIDB4MTksIDB4YjUsIDB4NGEsIDB4MGQpOworCSZkYXRhX2J5dGUoMHgyZCwgMHhlNSwgMHg3YSwgMHg5ZiwgMHg5MywgMHhjOSwgMHg5YywgMHhlZik7CisJJmRhdGFfYnl0ZSgweGEwLCAweGUwLCAweDNiLCAweDRkLCAweGFlLCAweDJhLCAweGY1LCAweGIwKTsKKwkmZGF0YV9ieXRlKDB4YzgsIDB4ZWIsIDB4YmIsIDB4M2MsIDB4ODMsIDB4NTMsIDB4OTksIDB4NjEpOworCSZkYXRhX2J5dGUoMHgxNywgMHgyYiwgMHgwNCwgMHg3ZSwgMHhiYSwgMHg3NywgMHhkNiwgMHgyNik7CisJJmRhdGFfYnl0ZSgweGUxLCAweDY5LCAweDE0LCAweDYzLCAweDU1LCAweDIxLCAweDBjLCAweDdkKTsKKworCSZkYXRhX2J5dGUoMHg1MiwgMHgwOSwgMHg2YSwgMHhkNSwgMHgzMCwgMHgzNiwgMHhhNSwgMHgzOCk7CisJJmRhdGFfYnl0ZSgweGJmLCAweDQwLCAweGEzLCAweDllLCAweDgxLCAweGYzLCAweGQ3LCAweGZiKTsKKwkmZGF0YV9ieXRlKDB4N2MsIDB4ZTMsIDB4MzksIDB4ODIsIDB4OWIsIDB4MmYsIDB4ZmYsIDB4ODcpOworCSZkYXRhX2J5dGUoMHgzNCwgMHg4ZSwgMHg0MywgMHg0NCwgMHhjNCwgMHhkZSwgMHhlOSwgMHhjYik7CisJJmRhdGFfYnl0ZSgweDU0LCAweDdiLCAweDk0LCAweDMyLCAweGE2LCAweGMyLCAweDIzLCAweDNkKTsKKwkmZGF0YV9ieXRlKDB4ZWUsIDB4NGMsIDB4OTUsIDB4MGIsIDB4NDIsIDB4ZmEsIDB4YzMsIDB4NGUpOworCSZkYXRhX2J5dGUoMHgwOCwgMHgyZSwgMHhhMSwgMHg2NiwgMHgyOCwgMHhkOSwgMHgyNCwgMHhiMik7CisJJmRhdGFfYnl0ZSgweDc2LCAweDViLCAweGEyLCAweDQ5LCAweDZkLCAweDhiLCAweGQxLCAweDI1KTsKKwkmZGF0YV9ieXRlKDB4NzIsIDB4ZjgsIDB4ZjYsIDB4NjQsIDB4ODYsIDB4NjgsIDB4OTgsIDB4MTYpOworCSZkYXRhX2J5dGUoMHhkNCwgMHhhNCwgMHg1YywgMHhjYywgMHg1ZCwgMHg2NSwgMHhiNiwgMHg5Mik7CisJJmRhdGFfYnl0ZSgweDZjLCAweDcwLCAweDQ4LCAweDUwLCAweGZkLCAweGVkLCAweGI5LCAweGRhKTsKKwkmZGF0YV9ieXRlKDB4NWUsIDB4MTUsIDB4NDYsIDB4NTcsIDB4YTcsIDB4OGQsIDB4OWQsIDB4ODQpOworCSZkYXRhX2J5dGUoMHg5MCwgMHhkOCwgMHhhYiwgMHgwMCwgMHg4YywgMHhiYywgMHhkMywgMHgwYSk7CisJJmRhdGFfYnl0ZSgweGY3LCAweGU0LCAweDU4LCAweDA1LCAweGI4LCAweGIzLCAweDQ1LCAweDA2KTsKKwkmZGF0YV9ieXRlKDB4ZDAsIDB4MmMsIDB4MWUsIDB4OGYsIDB4Y2EsIDB4M2YsIDB4MGYsIDB4MDIpOworCSZkYXRhX2J5dGUoMHhjMSwgMHhhZiwgMHhiZCwgMHgwMywgMHgwMSwgMHgxMywgMHg4YSwgMHg2Yik7CisJJmRhdGFfYnl0ZSgweDNhLCAweDkxLCAweDExLCAweDQxLCAweDRmLCAweDY3LCAweGRjLCAweGVhKTsKKwkmZGF0YV9ieXRlKDB4OTcsIDB4ZjIsIDB4Y2YsIDB4Y2UsIDB4ZjAsIDB4YjQsIDB4ZTYsIDB4NzMpOworCSZkYXRhX2J5dGUoMHg5NiwgMHhhYywgMHg3NCwgMHgyMiwgMHhlNywgMHhhZCwgMHgzNSwgMHg4NSk7CisJJmRhdGFfYnl0ZSgweGUyLCAweGY5LCAweDM3LCAweGU4LCAweDFjLCAweDc1LCAweGRmLCAweDZlKTsKKwkmZGF0YV9ieXRlKDB4NDcsIDB4ZjEsIDB4MWEsIDB4NzEsIDB4MWQsIDB4MjksIDB4YzUsIDB4ODkpOworCSZkYXRhX2J5dGUoMHg2ZiwgMHhiNywgMHg2MiwgMHgwZSwgMHhhYSwgMHgxOCwgMHhiZSwgMHgxYik7CisJJmRhdGFfYnl0ZSgweGZjLCAweDU2LCAweDNlLCAweDRiLCAweGM2LCAweGQyLCAweDc5LCAweDIwKTsKKwkmZGF0YV9ieXRlKDB4OWEsIDB4ZGIsIDB4YzAsIDB4ZmUsIDB4NzgsIDB4Y2QsIDB4NWEsIDB4ZjQpOworCSZkYXRhX2J5dGUoMHgxZiwgMHhkZCwgMHhhOCwgMHgzMywgMHg4OCwgMHgwNywgMHhjNywgMHgzMSk7CisJJmRhdGFfYnl0ZSgweGIxLCAweDEyLCAweDEwLCAweDU5LCAweDI3LCAweDgwLCAweGVjLCAweDVmKTsKKwkmZGF0YV9ieXRlKDB4NjAsIDB4NTEsIDB4N2YsIDB4YTksIDB4MTksIDB4YjUsIDB4NGEsIDB4MGQpOworCSZkYXRhX2J5dGUoMHgyZCwgMHhlNSwgMHg3YSwgMHg5ZiwgMHg5MywgMHhjOSwgMHg5YywgMHhlZik7CisJJmRhdGFfYnl0ZSgweGEwLCAweGUwLCAweDNiLCAweDRkLCAweGFlLCAweDJhLCAweGY1LCAweGIwKTsKKwkmZGF0YV9ieXRlKDB4YzgsIDB4ZWIsIDB4YmIsIDB4M2MsIDB4ODMsIDB4NTMsIDB4OTksIDB4NjEpOworCSZkYXRhX2J5dGUoMHgxNywgMHgyYiwgMHgwNCwgMHg3ZSwgMHhiYSwgMHg3NywgMHhkNiwgMHgyNik7CisJJmRhdGFfYnl0ZSgweGUxLCAweDY5LCAweDE0LCAweDYzLCAweDU1LCAweDIxLCAweDBjLCAweDdkKTsKKworCSZkYXRhX2J5dGUoMHg1MiwgMHgwOSwgMHg2YSwgMHhkNSwgMHgzMCwgMHgzNiwgMHhhNSwgMHgzOCk7CisJJmRhdGFfYnl0ZSgweGJmLCAweDQwLCAweGEzLCAweDllLCAweDgxLCAweGYzLCAweGQ3LCAweGZiKTsKKwkmZGF0YV9ieXRlKDB4N2MsIDB4ZTMsIDB4MzksIDB4ODIsIDB4OWIsIDB4MmYsIDB4ZmYsIDB4ODcpOworCSZkYXRhX2J5dGUoMHgzNCwgMHg4ZSwgMHg0MywgMHg0NCwgMHhjNCwgMHhkZSwgMHhlOSwgMHhjYik7CisJJmRhdGFfYnl0ZSgweDU0LCAweDdiLCAweDk0LCAweDMyLCAweGE2LCAweGMyLCAweDIzLCAweDNkKTsKKwkmZGF0YV9ieXRlKDB4ZWUsIDB4NGMsIDB4OTUsIDB4MGIsIDB4NDIsIDB4ZmEsIDB4YzMsIDB4NGUpOworCSZkYXRhX2J5dGUoMHgwOCwgMHgyZSwgMHhhMSwgMHg2NiwgMHgyOCwgMHhkOSwgMHgyNCwgMHhiMik7CisJJmRhdGFfYnl0ZSgweDc2LCAweDViLCAweGEyLCAweDQ5LCAweDZkLCAweDhiLCAweGQxLCAweDI1KTsKKwkmZGF0YV9ieXRlKDB4NzIsIDB4ZjgsIDB4ZjYsIDB4NjQsIDB4ODYsIDB4NjgsIDB4OTgsIDB4MTYpOworCSZkYXRhX2J5dGUoMHhkNCwgMHhhNCwgMHg1YywgMHhjYywgMHg1ZCwgMHg2NSwgMHhiNiwgMHg5Mik7CisJJmRhdGFfYnl0ZSgweDZjLCAweDcwLCAweDQ4LCAweDUwLCAweGZkLCAweGVkLCAweGI5LCAweGRhKTsKKwkmZGF0YV9ieXRlKDB4NWUsIDB4MTUsIDB4NDYsIDB4NTcsIDB4YTcsIDB4OGQsIDB4OWQsIDB4ODQpOworCSZkYXRhX2J5dGUoMHg5MCwgMHhkOCwgMHhhYiwgMHgwMCwgMHg4YywgMHhiYywgMHhkMywgMHgwYSk7CisJJmRhdGFfYnl0ZSgweGY3LCAweGU0LCAweDU4LCAweDA1LCAweGI4LCAweGIzLCAweDQ1LCAweDA2KTsKKwkmZGF0YV9ieXRlKDB4ZDAsIDB4MmMsIDB4MWUsIDB4OGYsIDB4Y2EsIDB4M2YsIDB4MGYsIDB4MDIpOworCSZkYXRhX2J5dGUoMHhjMSwgMHhhZiwgMHhiZCwgMHgwMywgMHgwMSwgMHgxMywgMHg4YSwgMHg2Yik7CisJJmRhdGFfYnl0ZSgweDNhLCAweDkxLCAweDExLCAweDQxLCAweDRmLCAweDY3LCAweGRjLCAweGVhKTsKKwkmZGF0YV9ieXRlKDB4OTcsIDB4ZjIsIDB4Y2YsIDB4Y2UsIDB4ZjAsIDB4YjQsIDB4ZTYsIDB4NzMpOworCSZkYXRhX2J5dGUoMHg5NiwgMHhhYywgMHg3NCwgMHgyMiwgMHhlNywgMHhhZCwgMHgzNSwgMHg4NSk7CisJJmRhdGFfYnl0ZSgweGUyLCAweGY5LCAweDM3LCAweGU4LCAweDFjLCAweDc1LCAweGRmLCAweDZlKTsKKwkmZGF0YV9ieXRlKDB4NDcsIDB4ZjEsIDB4MWEsIDB4NzEsIDB4MWQsIDB4MjksIDB4YzUsIDB4ODkpOworCSZkYXRhX2J5dGUoMHg2ZiwgMHhiNywgMHg2MiwgMHgwZSwgMHhhYSwgMHgxOCwgMHhiZSwgMHgxYik7CisJJmRhdGFfYnl0ZSgweGZjLCAweDU2LCAweDNlLCAweDRiLCAweGM2LCAweGQyLCAweDc5LCAweDIwKTsKKwkmZGF0YV9ieXRlKDB4OWEsIDB4ZGIsIDB4YzAsIDB4ZmUsIDB4NzgsIDB4Y2QsIDB4NWEsIDB4ZjQpOworCSZkYXRhX2J5dGUoMHgxZiwgMHhkZCwgMHhhOCwgMHgzMywgMHg4OCwgMHgwNywgMHhjNywgMHgzMSk7CisJJmRhdGFfYnl0ZSgweGIxLCAweDEyLCAweDEwLCAweDU5LCAweDI3LCAweDgwLCAweGVjLCAweDVmKTsKKwkmZGF0YV9ieXRlKDB4NjAsIDB4NTEsIDB4N2YsIDB4YTksIDB4MTksIDB4YjUsIDB4NGEsIDB4MGQpOworCSZkYXRhX2J5dGUoMHgyZCwgMHhlNSwgMHg3YSwgMHg5ZiwgMHg5MywgMHhjOSwgMHg5YywgMHhlZik7CisJJmRhdGFfYnl0ZSgweGEwLCAweGUwLCAweDNiLCAweDRkLCAweGFlLCAweDJhLCAweGY1LCAweGIwKTsKKwkmZGF0YV9ieXRlKDB4YzgsIDB4ZWIsIDB4YmIsIDB4M2MsIDB4ODMsIDB4NTMsIDB4OTksIDB4NjEpOworCSZkYXRhX2J5dGUoMHgxNywgMHgyYiwgMHgwNCwgMHg3ZSwgMHhiYSwgMHg3NywgMHhkNiwgMHgyNik7CisJJmRhdGFfYnl0ZSgweGUxLCAweDY5LCAweDE0LCAweDYzLCAweDU1LCAweDIxLCAweDBjLCAweDdkKTsKKyZmdW5jdGlvbl9lbmRfQigiX3g4Nl9BRVNfZGVjcnlwdCIpOworCisjIHZvaWQgQUVTX2RlY3J5cHQgKGNvbnN0IHZvaWQgKmlucCx2b2lkICpvdXQsY29uc3QgQUVTX0tFWSAqa2V5KTsKKyZmdW5jdGlvbl9iZWdpbigiQUVTX2RlY3J5cHQiKTsKKwkmbW92CSgkYWNjLCZ3cGFyYW0oMCkpOwkJIyBsb2FkIGlucAorCSZtb3YJKCRrZXksJndwYXJhbSgyKSk7CQkjIGxvYWQga2V5CisKKwkmbW92CSgkczAsImVzcCIpOworCSZzdWIJKCJlc3AiLDM2KTsKKwkmYW5kCSgiZXNwIiwtNjQpOwkJCSMgYWxpZ24gdG8gY2FjaGUtbGluZQorCisJIyBwbGFjZSBzdGFjayBmcmFtZSBqdXN0ICJhYm92ZSIgdGhlIGtleSBzY2hlZHVsZQorCSZsZWEJKCRzMSwmRFdQKC02NC02Mywka2V5KSk7CisJJnN1YgkoJHMxLCJlc3AiKTsKKwkmbmVnCSgkczEpOworCSZhbmQJKCRzMSwweDNDMCk7CSMgbW9kdWxvIDEwMjQsIGJ1dCBhbGlnbmVkIHRvIGNhY2hlLWxpbmUKKwkmc3ViCSgiZXNwIiwkczEpOworCSZhZGQJKCJlc3AiLDQpOwkjIDQgaXMgcmVzZXJ2ZWQgZm9yIGNhbGxlcidzIHJldHVybiBhZGRyZXNzCisJJm1vdgkoJF9lc3AsJHMwKTsJIyBzYXZlIHN0YWNrIHBvaW50ZXIKKworCSZjYWxsICAgKCZsYWJlbCgicGljX3BvaW50IikpOyAgICAgICAgICAjIG1ha2UgaXQgUElDIQorCSZzZXRfbGFiZWwoInBpY19wb2ludCIpOworCSZibGluZHBvcCgkdGJsKTsKKwkmcGljbWV1cCgkczAsIk9QRU5TU0xfaWEzMmNhcF9QIiwkdGJsLCZsYWJlbCgicGljX3BvaW50IikpIGlmKCEkeDg2b25seSk7CisJJmxlYSAgICAoJHRibCwmRFdQKCZsYWJlbCgiQUVTX1RkIikuIi0iLiZsYWJlbCgicGljX3BvaW50IiksJHRibCkpOworCisJIyBwaWNrIFRkNCBjb3B5IHdoaWNoIGNhbid0ICJvdmVybGFwIiB3aXRoIHN0YWNrIGZyYW1lIG9yIGtleSBzY2hlZHVsZQorCSZsZWEJKCRzMSwmRFdQKDc2OC00LCJlc3AiKSk7CisJJnN1YgkoJHMxLCR0YmwpOworCSZhbmQJKCRzMSwweDMwMCk7CisJJmxlYQkoJHRibCwmRFdQKDIwNDgrMTI4LCR0YmwsJHMxKSk7CisKKwkJCQkJaWYgKCEkeDg2b25seSkgeworCSZidAkoJkRXUCgwLCRzMCksMjUpOwkjIGNoZWNrIGZvciBTU0UgYml0CisJJmpuYwkoJmxhYmVsKCJ4ODYiKSk7CisKKwkmbW92cQkoIm1tMCIsJlFXUCgwLCRhY2MpKTsKKwkmbW92cQkoIm1tNCIsJlFXUCg4LCRhY2MpKTsKKwkmY2FsbAkoIl9zc2VfQUVTX2RlY3J5cHRfY29tcGFjdCIpOworCSZtb3YJKCJlc3AiLCRfZXNwKTsJCQkjIHJlc3RvcmUgc3RhY2sgcG9pbnRlcgorCSZtb3YJKCRhY2MsJndwYXJhbSgxKSk7CQkjIGxvYWQgb3V0CisJJm1vdnEJKCZRV1AoMCwkYWNjKSwibW0wIik7CQkjIHdyaXRlIG91dHB1dCBkYXRhCisJJm1vdnEJKCZRV1AoOCwkYWNjKSwibW00Iik7CisJJmVtbXMJKCk7CisJJmZ1bmN0aW9uX2VuZF9BKCk7CisJCQkJCX0KKwkmc2V0X2xhYmVsKCJ4ODYiLDE2KTsKKwkmbW92CSgkX3RibCwkdGJsKTsKKwkmbW92CSgkczAsJkRXUCgwLCRhY2MpKTsJCSMgbG9hZCBpbnB1dCBkYXRhCisJJm1vdgkoJHMxLCZEV1AoNCwkYWNjKSk7CisJJm1vdgkoJHMyLCZEV1AoOCwkYWNjKSk7CisJJm1vdgkoJHMzLCZEV1AoMTIsJGFjYykpOworCSZjYWxsCSgiX3g4Nl9BRVNfZGVjcnlwdF9jb21wYWN0Iik7CisJJm1vdgkoImVzcCIsJF9lc3ApOwkJCSMgcmVzdG9yZSBzdGFjayBwb2ludGVyCisJJm1vdgkoJGFjYywmd3BhcmFtKDEpKTsJCSMgbG9hZCBvdXQKKwkmbW92CSgmRFdQKDAsJGFjYyksJHMwKTsJCSMgd3JpdGUgb3V0cHV0IGRhdGEKKwkmbW92CSgmRFdQKDQsJGFjYyksJHMxKTsKKwkmbW92CSgmRFdQKDgsJGFjYyksJHMyKTsKKwkmbW92CSgmRFdQKDEyLCRhY2MpLCRzMyk7CismZnVuY3Rpb25fZW5kKCJBRVNfZGVjcnlwdCIpOworCisjIHZvaWQgQUVTX2NiY19lbmNyeXB0IChjb25zdCB2b2lkIGNoYXIgKmlucCwgdW5zaWduZWQgY2hhciAqb3V0LAorIwkJCXNpemVfdCBsZW5ndGgsIGNvbnN0IEFFU19LRVkgKmtleSwKKyMJCQl1bnNpZ25lZCBjaGFyICppdnAsY29uc3QgaW50IGVuYyk7Cit7CisjIHN0YWNrIGZyYW1lIGxheW91dAorIyAgICAgICAgICAgICAtNCglZXNwKQkJIyByZXR1cm4gYWRkcmVzcwkgMCglZXNwKQorIyAgICAgICAgICAgICAgMCglZXNwKQkJIyBzMCBiYWNraW5nIHN0b3JlCSA0KCVlc3ApCQorIyAgICAgICAgICAgICAgNCglZXNwKQkJIyBzMSBiYWNraW5nIHN0b3JlCSA4KCVlc3ApCisjICAgICAgICAgICAgICA4KCVlc3ApCQkjIHMyIGJhY2tpbmcgc3RvcmUJMTIoJWVzcCkKKyMgICAgICAgICAgICAgMTIoJWVzcCkJCSMgczMgYmFja2luZyBzdG9yZQkxNiglZXNwKQorIyAgICAgICAgICAgICAxNiglZXNwKQkJIyBrZXkgYmFja3VwCQkyMCglZXNwKQorIyAgICAgICAgICAgICAyMCglZXNwKQkJIyBlbmQgb2Yga2V5IHNjaGVkdWxlCTI0KCVlc3ApCisjICAgICAgICAgICAgIDI0KCVlc3ApCQkjICVlYnAgYmFja3VwCQkyOCglZXNwKQorIyAgICAgICAgICAgICAyOCglZXNwKQkJIyAlZXNwIGJhY2t1cAorbXkgJF9pbnA9JkRXUCgzMiwiZXNwIik7CSMgY29weSBvZiB3cGFyYW0oMCkKK215ICRfb3V0PSZEV1AoMzYsImVzcCIpOwkjIGNvcHkgb2Ygd3BhcmFtKDEpCitteSAkX2xlbj0mRFdQKDQwLCJlc3AiKTsJIyBjb3B5IG9mIHdwYXJhbSgyKQorbXkgJF9rZXk9JkRXUCg0NCwiZXNwIik7CSMgY29weSBvZiB3cGFyYW0oMykKK215ICRfaXZwPSZEV1AoNDgsImVzcCIpOwkjIGNvcHkgb2Ygd3BhcmFtKDQpCitteSAkX3RtcD0mRFdQKDUyLCJlc3AiKTsJIyB2b2xhdGlsZSB2YXJpYWJsZQorIworbXkgJGl2ZWM9JkRXUCg2MCwiZXNwIik7CSMgaXZlY1sxNl0KK215ICRhZXNfa2V5PSZEV1AoNzYsImVzcCIpOwkjIGNvcHkgb2YgYWVzX2tleQorbXkgJG1hcms9JkRXUCg3NisyNDAsImVzcCIpOwkjIGNvcHkgb2YgYWVzX2tleS0+cm91bmRzCisKKyZmdW5jdGlvbl9iZWdpbigiQUVTX2NiY19lbmNyeXB0Iik7CisJJm1vdgkoJHMyIGVxICJlY3giPyAkczIgOiAiIiwmd3BhcmFtKDIpKTsJIyBsb2FkIGxlbgorCSZjbXAJKCRzMiwwKTsKKwkmamUJKCZsYWJlbCgiZHJvcF9vdXQiKSk7CisKKwkmY2FsbCAgICgmbGFiZWwoInBpY19wb2ludCIpKTsJCSMgbWFrZSBpdCBQSUMhCisJJnNldF9sYWJlbCgicGljX3BvaW50Iik7CisJJmJsaW5kcG9wKCR0YmwpOworCSZwaWNtZXVwKCRzMCwiT1BFTlNTTF9pYTMyY2FwX1AiLCR0YmwsJmxhYmVsKCJwaWNfcG9pbnQiKSkgaWYoISR4ODZvbmx5KTsKKworCSZjbXAJKCZ3cGFyYW0oNSksMCk7CisJJmxlYSAgICAoJHRibCwmRFdQKCZsYWJlbCgiQUVTX1RlIikuIi0iLiZsYWJlbCgicGljX3BvaW50IiksJHRibCkpOworCSZqbmUJKCZsYWJlbCgicGlja2VkX3RlIikpOworCSZsZWEJKCR0YmwsJkRXUCgmbGFiZWwoIkFFU19UZCIpLiItIi4mbGFiZWwoIkFFU19UZSIpLCR0YmwpKTsKKwkmc2V0X2xhYmVsKCJwaWNrZWRfdGUiKTsKKworCSMgb25lIGNhbiBhcmd1ZSBpZiB0aGlzIGlzIHJlcXVpcmVkCisJJnB1c2hmCSgpOworCSZjbGQJKCk7CisKKwkmY21wCSgkczIsJHNwZWVkX2xpbWl0KTsKKwkmamIJKCZsYWJlbCgic2xvd193YXkiKSk7CisJJnRlc3QJKCRzMiwxNSk7CisJJmpuegkoJmxhYmVsKCJzbG93X3dheSIpKTsKKwkJCQkJaWYgKCEkeDg2b25seSkgeworCSZidAkoJkRXUCgwLCRzMCksMjgpOwkjIGNoZWNrIGZvciBoeXBlci10aHJlYWRpbmcgYml0CisJJmpjCSgmbGFiZWwoInNsb3dfd2F5IikpOworCQkJCQl9CisJIyBwcmUtYWxsb2NhdGUgYWxpZ25lZCBzdGFjayBmcmFtZS4uLgorCSZsZWEJKCRhY2MsJkRXUCgtODAtMjQ0LCJlc3AiKSk7CisJJmFuZAkoJGFjYywtNjQpOworCisJIyAuLi4gYW5kIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGFsaWFzIHdpdGggJHRibCBtb2R1bG8gNDA5NgorCSZtb3YJKCRzMCwkdGJsKTsKKwkmbGVhCSgkczEsJkRXUCgyMDQ4KzI1NiwkdGJsKSk7CisJJm1vdgkoJHMzLCRhY2MpOworCSZhbmQJKCRzMCwweGZmZik7CQkjIHMgPSAlZWJwJjB4ZmZmCisJJmFuZAkoJHMxLDB4ZmZmKTsJCSMgZSA9ICglZWJwKzIwNDgrMjU2KSYweGZmZgorCSZhbmQJKCRzMywweGZmZik7CQkjIHAgPSAlZXNwJjB4ZmZmCisKKwkmY21wCSgkczMsJHMxKTsJCSMgaWYgKHA+PWUpICVlc3AgPS0gKHAtZSk7CisJJmpiCSgmbGFiZWwoInRibF9icmVha19vdXQiKSk7CisJJnN1YgkoJHMzLCRzMSk7CisJJnN1YgkoJGFjYywkczMpOworCSZqbXAJKCZsYWJlbCgidGJsX29rIikpOworCSZzZXRfbGFiZWwoInRibF9icmVha19vdXQiLDQpOwkjIGVsc2UgJWVzcCAtPSAocC1zKSYweGZmZiArIGZyYW1lc3o7CisJJnN1YgkoJHMzLCRzMCk7CisJJmFuZAkoJHMzLDB4ZmZmKTsKKwkmYWRkCSgkczMsMzg0KTsKKwkmc3ViCSgkYWNjLCRzMyk7CisJJnNldF9sYWJlbCgidGJsX29rIiw0KTsKKworCSZsZWEJKCRzMywmd3BhcmFtKDApKTsJIyBvYnRhaW4gcG9pbnRlciB0byBwYXJhbWV0ZXIgYmxvY2sKKwkmZXhjaAkoImVzcCIsJGFjYyk7CQkjIGFsbG9jYXRlIHN0YWNrIGZyYW1lCisJJmFkZAkoImVzcCIsNCk7CQkjIHJlc2VydmUgZm9yIHJldHVybiBhZGRyZXNzIQorCSZtb3YJKCRfdGJsLCR0YmwpOwkJIyBzYXZlICVlYnAKKwkmbW92CSgkX2VzcCwkYWNjKTsJCSMgc2F2ZSAlZXNwCisKKwkmbW92CSgkczAsJkRXUCgwLCRzMykpOwkjIGxvYWQgaW5wCisJJm1vdgkoJHMxLCZEV1AoNCwkczMpKTsJIyBsb2FkIG91dAorCSMmbW92CSgkczIsJkRXUCg4LCRzMykpOwkjIGxvYWQgbGVuCisJJm1vdgkoJGtleSwmRFdQKDEyLCRzMykpOwkjIGxvYWQga2V5CisJJm1vdgkoJGFjYywmRFdQKDE2LCRzMykpOwkjIGxvYWQgaXZwCisJJm1vdgkoJHMzLCZEV1AoMjAsJHMzKSk7CSMgbG9hZCBlbmMgZmxhZworCisJJm1vdgkoJF9pbnAsJHMwKTsJCSMgc2F2ZSBjb3B5IG9mIGlucAorCSZtb3YJKCRfb3V0LCRzMSk7CQkjIHNhdmUgY29weSBvZiBvdXQKKwkmbW92CSgkX2xlbiwkczIpOwkJIyBzYXZlIGNvcHkgb2YgbGVuCisJJm1vdgkoJF9rZXksJGtleSk7CQkjIHNhdmUgY29weSBvZiBrZXkKKwkmbW92CSgkX2l2cCwkYWNjKTsJCSMgc2F2ZSBjb3B5IG9mIGl2cAorCisJJm1vdgkoJG1hcmssMCk7CQkjIGNvcHkgb2YgYWVzX2tleS0+cm91bmRzID0gMDsKKwkjIGRvIHdlIGNvcHkga2V5IHNjaGVkdWxlIHRvIHN0YWNrPworCSZtb3YJKCRzMSBlcSAiZWJ4IiA/ICRzMSA6ICIiLCRrZXkpOworCSZtb3YJKCRzMiBlcSAiZWN4IiA/ICRzMiA6ICIiLDI0NC80KTsKKwkmc3ViCSgkczEsJHRibCk7CisJJm1vdgkoImVzaSIsJGtleSk7CisJJmFuZAkoJHMxLDB4ZmZmKTsKKwkmbGVhCSgiZWRpIiwkYWVzX2tleSk7CisJJmNtcAkoJHMxLDIwNDgrMjU2KTsKKwkmamIJKCZsYWJlbCgiZG9fY29weSIpKTsKKwkmY21wCSgkczEsNDA5Ni0yNDQpOworCSZqYgkoJmxhYmVsKCJza2lwX2NvcHkiKSk7CisJJnNldF9sYWJlbCgiZG9fY29weSIsNCk7CisJCSZtb3YJKCRfa2V5LCJlZGkiKTsKKwkJJmRhdGFfd29yZCgweEE1RjNGNjg5KTsJIyByZXAgbW92c2QKKwkmc2V0X2xhYmVsKCJza2lwX2NvcHkiKTsKKworCSZtb3YJKCRrZXksMTYpOworCSZzZXRfbGFiZWwoInByZWZldGNoX3RibCIsNCk7CisJCSZtb3YJKCRzMCwmRFdQKDAsJHRibCkpOworCQkmbW92CSgkczEsJkRXUCgzMiwkdGJsKSk7CisJCSZtb3YJKCRzMiwmRFdQKDY0LCR0YmwpKTsKKwkJJm1vdgkoJGFjYywmRFdQKDk2LCR0YmwpKTsKKwkJJmxlYQkoJHRibCwmRFdQKDEyOCwkdGJsKSk7CisJCSZzdWIJKCRrZXksMSk7CisJJmpuegkoJmxhYmVsKCJwcmVmZXRjaF90YmwiKSk7CisJJnN1YgkoJHRibCwyMDQ4KTsKKworCSZtb3YJKCRhY2MsJF9pbnApOworCSZtb3YJKCRrZXksJF9pdnApOworCisJJmNtcAkoJHMzLDApOworCSZqZQkoJmxhYmVsKCJmYXN0X2RlY3J5cHQiKSk7CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFTkNSWVBUIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIworCSZtb3YJKCRzMCwmRFdQKDAsJGtleSkpOwkJIyBsb2FkIGl2CisJJm1vdgkoJHMxLCZEV1AoNCwka2V5KSk7CisKKwkmc2V0X2xhYmVsKCJmYXN0X2VuY19sb29wIiwxNik7CisJCSZtb3YJKCRzMiwmRFdQKDgsJGtleSkpOworCQkmbW92CSgkczMsJkRXUCgxMiwka2V5KSk7CisKKwkJJnhvcgkoJHMwLCZEV1AoMCwkYWNjKSk7CSMgeG9yIGlucHV0IGRhdGEKKwkJJnhvcgkoJHMxLCZEV1AoNCwkYWNjKSk7CisJCSZ4b3IJKCRzMiwmRFdQKDgsJGFjYykpOworCQkmeG9yCSgkczMsJkRXUCgxMiwkYWNjKSk7CisKKwkJJm1vdgkoJGtleSwkX2tleSk7CQkjIGxvYWQga2V5CisJCSZjYWxsCSgiX3g4Nl9BRVNfZW5jcnlwdCIpOworCisJCSZtb3YJKCRhY2MsJF9pbnApOwkJIyBsb2FkIGlucAorCQkmbW92CSgka2V5LCRfb3V0KTsJCSMgbG9hZCBvdXQKKworCQkmbW92CSgmRFdQKDAsJGtleSksJHMwKTsJIyBzYXZlIG91dHB1dCBkYXRhCisJCSZtb3YJKCZEV1AoNCwka2V5KSwkczEpOworCQkmbW92CSgmRFdQKDgsJGtleSksJHMyKTsKKwkJJm1vdgkoJkRXUCgxMiwka2V5KSwkczMpOworCisJCSZsZWEJKCRhY2MsJkRXUCgxNiwkYWNjKSk7CSMgYWR2YW5jZSBpbnAKKwkJJm1vdgkoJHMyLCRfbGVuKTsJCSMgbG9hZCBsZW4KKwkJJm1vdgkoJF9pbnAsJGFjYyk7CQkjIHNhdmUgaW5wCisJCSZsZWEJKCRzMywmRFdQKDE2LCRrZXkpKTsJIyBhZHZhbmNlIG91dAorCQkmbW92CSgkX291dCwkczMpOwkJIyBzYXZlIG91dAorCQkmc3ViCSgkczIsMTYpOwkJIyBkZWNyZWFzZSBsZW4KKwkJJm1vdgkoJF9sZW4sJHMyKTsJCSMgc2F2ZSBsZW4KKwkmam56CSgmbGFiZWwoImZhc3RfZW5jX2xvb3AiKSk7CisJJm1vdgkoJGFjYywkX2l2cCk7CQkjIGxvYWQgaXZwCisJJm1vdgkoJHMyLCZEV1AoOCwka2V5KSk7CSMgcmVzdG9yZSBsYXN0IDIgZHdvcmRzCisJJm1vdgkoJHMzLCZEV1AoMTIsJGtleSkpOworCSZtb3YJKCZEV1AoMCwkYWNjKSwkczApOwkjIHNhdmUgaXZlYworCSZtb3YJKCZEV1AoNCwkYWNjKSwkczEpOworCSZtb3YJKCZEV1AoOCwkYWNjKSwkczIpOworCSZtb3YJKCZEV1AoMTIsJGFjYyksJHMzKTsKKworCSZjbXAJKCRtYXJrLDApOwkJIyB3YXMgdGhlIGtleSBzY2hlZHVsZSBjb3BpZWQ/CisJJm1vdgkoImVkaSIsJF9rZXkpOworCSZqZQkoJmxhYmVsKCJza2lwX2V6ZXJvIikpOworCSMgemVybyBjb3B5IG9mIGtleSBzY2hlZHVsZQorCSZtb3YJKCJlY3giLDI0MC80KTsKKwkmeG9yCSgiZWF4IiwiZWF4Iik7CisJJmFsaWduCSg0KTsKKwkmZGF0YV93b3JkKDB4QUJGM0Y2ODkpOwkJIyByZXAgc3Rvc2QKKwkmc2V0X2xhYmVsKCJza2lwX2V6ZXJvIik7CisJJm1vdgkoImVzcCIsJF9lc3ApOworCSZwb3BmCSgpOworICAgICZzZXRfbGFiZWwoImRyb3Bfb3V0Iik7CisJJmZ1bmN0aW9uX2VuZF9BKCk7CisJJnB1c2hmCSgpOwkJCSMga2x1ZGdlLCBuZXZlciBleGVjdXRlZAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gREVDUllQVCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKKyZzZXRfbGFiZWwoImZhc3RfZGVjcnlwdCIsMTYpOworCisJJmNtcAkoJGFjYywkX291dCk7CisJJmplCSgmbGFiZWwoImZhc3RfZGVjX2luX3BsYWNlIikpOwkjIGluLXBsYWNlIHByb2Nlc3NpbmcuLi4KKworCSZtb3YJKCRfdG1wLCRrZXkpOworCisJJmFsaWduCSg0KTsKKwkmc2V0X2xhYmVsKCJmYXN0X2RlY19sb29wIiwxNik7CisJCSZtb3YJKCRzMCwmRFdQKDAsJGFjYykpOwkjIHJlYWQgaW5wdXQKKwkJJm1vdgkoJHMxLCZEV1AoNCwkYWNjKSk7CisJCSZtb3YJKCRzMiwmRFdQKDgsJGFjYykpOworCQkmbW92CSgkczMsJkRXUCgxMiwkYWNjKSk7CisKKwkJJm1vdgkoJGtleSwkX2tleSk7CQkjIGxvYWQga2V5CisJCSZjYWxsCSgiX3g4Nl9BRVNfZGVjcnlwdCIpOworCisJCSZtb3YJKCRrZXksJF90bXApOwkJIyBsb2FkIGl2cAorCQkmbW92CSgkYWNjLCRfbGVuKTsJCSMgbG9hZCBsZW4KKwkJJnhvcgkoJHMwLCZEV1AoMCwka2V5KSk7CSMgeG9yIGl2CisJCSZ4b3IJKCRzMSwmRFdQKDQsJGtleSkpOworCQkmeG9yCSgkczIsJkRXUCg4LCRrZXkpKTsKKwkJJnhvcgkoJHMzLCZEV1AoMTIsJGtleSkpOworCisJCSZtb3YJKCRrZXksJF9vdXQpOwkJIyBsb2FkIG91dAorCQkmbW92CSgkYWNjLCRfaW5wKTsJCSMgbG9hZCBpbnAKKworCQkmbW92CSgmRFdQKDAsJGtleSksJHMwKTsJIyB3cml0ZSBvdXRwdXQKKwkJJm1vdgkoJkRXUCg0LCRrZXkpLCRzMSk7CisJCSZtb3YJKCZEV1AoOCwka2V5KSwkczIpOworCQkmbW92CSgmRFdQKDEyLCRrZXkpLCRzMyk7CisKKwkJJm1vdgkoJHMyLCRfbGVuKTsJCSMgbG9hZCBsZW4KKwkJJm1vdgkoJF90bXAsJGFjYyk7CQkjIHNhdmUgaXZwCisJCSZsZWEJKCRhY2MsJkRXUCgxNiwkYWNjKSk7CSMgYWR2YW5jZSBpbnAKKwkJJm1vdgkoJF9pbnAsJGFjYyk7CQkjIHNhdmUgaW5wCisJCSZsZWEJKCRrZXksJkRXUCgxNiwka2V5KSk7CSMgYWR2YW5jZSBvdXQKKwkJJm1vdgkoJF9vdXQsJGtleSk7CQkjIHNhdmUgb3V0CisJCSZzdWIJKCRzMiwxNik7CQkjIGRlY3JlYXNlIGxlbgorCQkmbW92CSgkX2xlbiwkczIpOwkJIyBzYXZlIGxlbgorCSZqbnoJKCZsYWJlbCgiZmFzdF9kZWNfbG9vcCIpKTsKKwkmbW92CSgka2V5LCRfdG1wKTsJCSMgbG9hZCB0ZW1wIGl2cAorCSZtb3YJKCRhY2MsJF9pdnApOwkJIyBsb2FkIHVzZXIgaXZwCisJJm1vdgkoJHMwLCZEV1AoMCwka2V5KSk7CSMgbG9hZCBpdgorCSZtb3YJKCRzMSwmRFdQKDQsJGtleSkpOworCSZtb3YJKCRzMiwmRFdQKDgsJGtleSkpOworCSZtb3YJKCRzMywmRFdQKDEyLCRrZXkpKTsKKwkmbW92CSgmRFdQKDAsJGFjYyksJHMwKTsJIyBjb3B5IGJhY2sgdG8gdXNlcgorCSZtb3YJKCZEV1AoNCwkYWNjKSwkczEpOworCSZtb3YJKCZEV1AoOCwkYWNjKSwkczIpOworCSZtb3YJKCZEV1AoMTIsJGFjYyksJHMzKTsKKwkmam1wCSgmbGFiZWwoImZhc3RfZGVjX291dCIpKTsKKworICAgICZzZXRfbGFiZWwoImZhc3RfZGVjX2luX3BsYWNlIiwxNik7CisJJnNldF9sYWJlbCgiZmFzdF9kZWNfaW5fcGxhY2VfbG9vcCIpOworCQkmbW92CSgkczAsJkRXUCgwLCRhY2MpKTsJIyByZWFkIGlucHV0CisJCSZtb3YJKCRzMSwmRFdQKDQsJGFjYykpOworCQkmbW92CSgkczIsJkRXUCg4LCRhY2MpKTsKKwkJJm1vdgkoJHMzLCZEV1AoMTIsJGFjYykpOworCisJCSZsZWEJKCRrZXksJGl2ZWMpOworCQkmbW92CSgmRFdQKDAsJGtleSksJHMwKTsJIyBjb3B5IHRvIHRlbXAKKwkJJm1vdgkoJkRXUCg0LCRrZXkpLCRzMSk7CisJCSZtb3YJKCZEV1AoOCwka2V5KSwkczIpOworCQkmbW92CSgmRFdQKDEyLCRrZXkpLCRzMyk7CisKKwkJJm1vdgkoJGtleSwkX2tleSk7CQkjIGxvYWQga2V5CisJCSZjYWxsCSgiX3g4Nl9BRVNfZGVjcnlwdCIpOworCisJCSZtb3YJKCRrZXksJF9pdnApOwkJIyBsb2FkIGl2cAorCQkmbW92CSgkYWNjLCRfb3V0KTsJCSMgbG9hZCBvdXQKKwkJJnhvcgkoJHMwLCZEV1AoMCwka2V5KSk7CSMgeG9yIGl2CisJCSZ4b3IJKCRzMSwmRFdQKDQsJGtleSkpOworCQkmeG9yCSgkczIsJkRXUCg4LCRrZXkpKTsKKwkJJnhvcgkoJHMzLCZEV1AoMTIsJGtleSkpOworCisJCSZtb3YJKCZEV1AoMCwkYWNjKSwkczApOwkjIHdyaXRlIG91dHB1dAorCQkmbW92CSgmRFdQKDQsJGFjYyksJHMxKTsKKwkJJm1vdgkoJkRXUCg4LCRhY2MpLCRzMik7CisJCSZtb3YJKCZEV1AoMTIsJGFjYyksJHMzKTsKKworCQkmbGVhCSgkYWNjLCZEV1AoMTYsJGFjYykpOwkjIGFkdmFuY2Ugb3V0CisJCSZtb3YJKCRfb3V0LCRhY2MpOwkJIyBzYXZlIG91dAorCisJCSZsZWEJKCRhY2MsJGl2ZWMpOworCQkmbW92CSgkczAsJkRXUCgwLCRhY2MpKTsJIyByZWFkIHRlbXAKKwkJJm1vdgkoJHMxLCZEV1AoNCwkYWNjKSk7CisJCSZtb3YJKCRzMiwmRFdQKDgsJGFjYykpOworCQkmbW92CSgkczMsJkRXUCgxMiwkYWNjKSk7CisKKwkJJm1vdgkoJkRXUCgwLCRrZXkpLCRzMCk7CSMgY29weSBpdgorCQkmbW92CSgmRFdQKDQsJGtleSksJHMxKTsKKwkJJm1vdgkoJkRXUCg4LCRrZXkpLCRzMik7CisJCSZtb3YJKCZEV1AoMTIsJGtleSksJHMzKTsKKworCQkmbW92CSgkYWNjLCRfaW5wKTsJCSMgbG9hZCBpbnAKKwkJJm1vdgkoJHMyLCRfbGVuKTsJCSMgbG9hZCBsZW4KKwkJJmxlYQkoJGFjYywmRFdQKDE2LCRhY2MpKTsJIyBhZHZhbmNlIGlucAorCQkmbW92CSgkX2lucCwkYWNjKTsJCSMgc2F2ZSBpbnAKKwkJJnN1YgkoJHMyLDE2KTsJCSMgZGVjcmVhc2UgbGVuCisJCSZtb3YJKCRfbGVuLCRzMik7CQkjIHNhdmUgbGVuCisJJmpuegkoJmxhYmVsKCJmYXN0X2RlY19pbl9wbGFjZV9sb29wIikpOworCisgICAgJnNldF9sYWJlbCgiZmFzdF9kZWNfb3V0Iiw0KTsKKwkmY21wCSgkbWFyaywwKTsJCSMgd2FzIHRoZSBrZXkgc2NoZWR1bGUgY29waWVkPworCSZtb3YJKCJlZGkiLCRfa2V5KTsKKwkmamUJKCZsYWJlbCgic2tpcF9kemVybyIpKTsKKwkjIHplcm8gY29weSBvZiBrZXkgc2NoZWR1bGUKKwkmbW92CSgiZWN4IiwyNDAvNCk7CisJJnhvcgkoImVheCIsImVheCIpOworCSZhbGlnbgkoNCk7CisJJmRhdGFfd29yZCgweEFCRjNGNjg5KTsJCSMgcmVwIHN0b3NkCisJJnNldF9sYWJlbCgic2tpcF9kemVybyIpOworCSZtb3YJKCJlc3AiLCRfZXNwKTsKKwkmcG9wZgkoKTsKKwkmZnVuY3Rpb25fZW5kX0EoKTsKKwkmcHVzaGYJKCk7CQkJIyBrbHVkZ2UsIG5ldmVyIGV4ZWN1dGVkCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU0xPVyBST1VUSU5FIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKKyZzZXRfbGFiZWwoInNsb3dfd2F5IiwxNik7CisKKwkmbW92CSgkczAsJkRXUCgwLCRzMCkpIGlmICghJHg4Nm9ubHkpOyMgbG9hZCBPUEVOU1NMX2lhMzJjYXAKKwkmbW92CSgka2V5LCZ3cGFyYW0oMykpOwkjIGxvYWQga2V5CisKKwkjIHByZS1hbGxvY2F0ZSBhbGlnbmVkIHN0YWNrIGZyYW1lLi4uCisJJmxlYQkoJGFjYywmRFdQKC04MCwiZXNwIikpOworCSZhbmQJKCRhY2MsLTY0KTsKKworCSMgLi4uIGFuZCBtYWtlIHN1cmUgaXQgZG9lc24ndCBhbGlhcyB3aXRoICRrZXkgbW9kdWxvIDEwMjQKKwkmbGVhCSgkczEsJkRXUCgtODAtNjMsJGtleSkpOworCSZzdWIJKCRzMSwkYWNjKTsKKwkmbmVnCSgkczEpOworCSZhbmQJKCRzMSwweDNDMCk7CSMgbW9kdWxvIDEwMjQsIGJ1dCBhbGlnbmVkIHRvIGNhY2hlLWxpbmUKKwkmc3ViCSgkYWNjLCRzMSk7CisKKwkjIHBpY2sgUy1ib3ggY29weSB3aGljaCBjYW4ndCBvdmVybGFwIHdpdGggc3RhY2sgZnJhbWUgb3IgJGtleQorCSZsZWEJKCRzMSwmRFdQKDc2OCwkYWNjKSk7CisJJnN1YgkoJHMxLCR0YmwpOworCSZhbmQJKCRzMSwweDMwMCk7CisJJmxlYQkoJHRibCwmRFdQKDIwNDgrMTI4LCR0YmwsJHMxKSk7CisKKwkmbGVhCSgkczMsJndwYXJhbSgwKSk7CSMgcG9pbnRlciB0byBwYXJhbWV0ZXIgYmxvY2sKKworCSZleGNoCSgiZXNwIiwkYWNjKTsKKwkmYWRkCSgiZXNwIiw0KTsJCSMgcmVzZXJ2ZSBmb3IgcmV0dXJuIGFkZHJlc3MhCisJJm1vdgkoJF90YmwsJHRibCk7CQkjIHNhdmUgJWVicAorCSZtb3YJKCRfZXNwLCRhY2MpOwkJIyBzYXZlICVlc3AKKwkmbW92CSgkX3RtcCwkczApOwkJIyBzYXZlIE9QRU5TU0xfaWEzMmNhcAorCisJJm1vdgkoJHMwLCZEV1AoMCwkczMpKTsJIyBsb2FkIGlucAorCSZtb3YJKCRzMSwmRFdQKDQsJHMzKSk7CSMgbG9hZCBvdXQKKwkjJm1vdgkoJHMyLCZEV1AoOCwkczMpKTsJIyBsb2FkIGxlbgorCSMmbW92CSgka2V5LCZEV1AoMTIsJHMzKSk7CSMgbG9hZCBrZXkKKwkmbW92CSgkYWNjLCZEV1AoMTYsJHMzKSk7CSMgbG9hZCBpdnAKKwkmbW92CSgkczMsJkRXUCgyMCwkczMpKTsJIyBsb2FkIGVuYyBmbGFnCisKKwkmbW92CSgkX2lucCwkczApOwkJIyBzYXZlIGNvcHkgb2YgaW5wCisJJm1vdgkoJF9vdXQsJHMxKTsJCSMgc2F2ZSBjb3B5IG9mIG91dAorCSZtb3YJKCRfbGVuLCRzMik7CQkjIHNhdmUgY29weSBvZiBsZW4KKwkmbW92CSgkX2tleSwka2V5KTsJCSMgc2F2ZSBjb3B5IG9mIGtleQorCSZtb3YJKCRfaXZwLCRhY2MpOwkJIyBzYXZlIGNvcHkgb2YgaXZwCisKKwkmbW92CSgka2V5LCRhY2MpOworCSZtb3YJKCRhY2MsJHMwKTsKKworCSZjbXAJKCRzMywwKTsKKwkmamUJKCZsYWJlbCgic2xvd19kZWNyeXB0IikpOworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNMT1cgRU5DUllQVCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCisJJmNtcAkoJHMyLDE2KTsKKwkmbW92CSgkczMsJHMxKTsKKwkmamIJKCZsYWJlbCgic2xvd19lbmNfdGFpbCIpKTsKKworCQkJCQlpZiAoISR4ODZvbmx5KSB7CisJJmJ0CSgkX3RtcCwyNSk7CQkjIGNoZWNrIGZvciBTU0UgYml0CisJJmpuYwkoJmxhYmVsKCJzbG93X2VuY194ODYiKSk7CisKKwkmbW92cQkoIm1tMCIsJlFXUCgwLCRrZXkpKTsJIyBsb2FkIGl2CisJJm1vdnEJKCJtbTQiLCZRV1AoOCwka2V5KSk7CisKKwkmc2V0X2xhYmVsKCJzbG93X2VuY19sb29wX3NzZSIsMTYpOworCQkmcHhvcgkoIm1tMCIsJlFXUCgwLCRhY2MpKTsJIyB4b3IgaW5wdXQgZGF0YQorCQkmcHhvcgkoIm1tNCIsJlFXUCg4LCRhY2MpKTsKKworCQkmbW92CSgka2V5LCRfa2V5KTsKKwkJJmNhbGwJKCJfc3NlX0FFU19lbmNyeXB0X2NvbXBhY3QiKTsKKworCQkmbW92CSgkYWNjLCRfaW5wKTsJCSMgbG9hZCBpbnAKKwkJJm1vdgkoJGtleSwkX291dCk7CQkjIGxvYWQgb3V0CisJCSZtb3YJKCRzMiwkX2xlbik7CQkjIGxvYWQgbGVuCisKKwkJJm1vdnEJKCZRV1AoMCwka2V5KSwibW0wIik7CSMgc2F2ZSBvdXRwdXQgZGF0YQorCQkmbW92cQkoJlFXUCg4LCRrZXkpLCJtbTQiKTsKKworCQkmbGVhCSgkYWNjLCZEV1AoMTYsJGFjYykpOwkjIGFkdmFuY2UgaW5wCisJCSZtb3YJKCRfaW5wLCRhY2MpOwkJIyBzYXZlIGlucAorCQkmbGVhCSgkczMsJkRXUCgxNiwka2V5KSk7CSMgYWR2YW5jZSBvdXQKKwkJJm1vdgkoJF9vdXQsJHMzKTsJCSMgc2F2ZSBvdXQKKwkJJnN1YgkoJHMyLDE2KTsJCSMgZGVjcmVhc2UgbGVuCisJCSZjbXAJKCRzMiwxNik7CisJCSZtb3YJKCRfbGVuLCRzMik7CQkjIHNhdmUgbGVuCisJJmphZQkoJmxhYmVsKCJzbG93X2VuY19sb29wX3NzZSIpKTsKKwkmdGVzdAkoJHMyLDE1KTsKKwkmam56CSgmbGFiZWwoInNsb3dfZW5jX3RhaWwiKSk7CisJJm1vdgkoJGFjYywkX2l2cCk7CQkjIGxvYWQgaXZwCisJJm1vdnEJKCZRV1AoMCwkYWNjKSwibW0wIik7CSMgc2F2ZSBpdmVjCisJJm1vdnEJKCZRV1AoOCwkYWNjKSwibW00Iik7CisJJmVtbXMJKCk7CisJJm1vdgkoImVzcCIsJF9lc3ApOworCSZwb3BmCSgpOworCSZmdW5jdGlvbl9lbmRfQSgpOworCSZwdXNoZgkoKTsJCQkjIGtsdWRnZSwgbmV2ZXIgZXhlY3V0ZWQKKwkJCQkJfQorICAgICZzZXRfbGFiZWwoInNsb3dfZW5jX3g4NiIsMTYpOworCSZtb3YJKCRzMCwmRFdQKDAsJGtleSkpOwkjIGxvYWQgaXYKKwkmbW92CSgkczEsJkRXUCg0LCRrZXkpKTsKKworCSZzZXRfbGFiZWwoInNsb3dfZW5jX2xvb3BfeDg2Iiw0KTsKKwkJJm1vdgkoJHMyLCZEV1AoOCwka2V5KSk7CisJCSZtb3YJKCRzMywmRFdQKDEyLCRrZXkpKTsKKworCQkmeG9yCSgkczAsJkRXUCgwLCRhY2MpKTsJIyB4b3IgaW5wdXQgZGF0YQorCQkmeG9yCSgkczEsJkRXUCg0LCRhY2MpKTsKKwkJJnhvcgkoJHMyLCZEV1AoOCwkYWNjKSk7CisJCSZ4b3IJKCRzMywmRFdQKDEyLCRhY2MpKTsKKworCQkmbW92CSgka2V5LCRfa2V5KTsJCSMgbG9hZCBrZXkKKwkJJmNhbGwJKCJfeDg2X0FFU19lbmNyeXB0X2NvbXBhY3QiKTsKKworCQkmbW92CSgkYWNjLCRfaW5wKTsJCSMgbG9hZCBpbnAKKwkJJm1vdgkoJGtleSwkX291dCk7CQkjIGxvYWQgb3V0CisKKwkJJm1vdgkoJkRXUCgwLCRrZXkpLCRzMCk7CSMgc2F2ZSBvdXRwdXQgZGF0YQorCQkmbW92CSgmRFdQKDQsJGtleSksJHMxKTsKKwkJJm1vdgkoJkRXUCg4LCRrZXkpLCRzMik7CisJCSZtb3YJKCZEV1AoMTIsJGtleSksJHMzKTsKKworCQkmbW92CSgkczIsJF9sZW4pOwkJIyBsb2FkIGxlbgorCQkmbGVhCSgkYWNjLCZEV1AoMTYsJGFjYykpOwkjIGFkdmFuY2UgaW5wCisJCSZtb3YJKCRfaW5wLCRhY2MpOwkJIyBzYXZlIGlucAorCQkmbGVhCSgkczMsJkRXUCgxNiwka2V5KSk7CSMgYWR2YW5jZSBvdXQKKwkJJm1vdgkoJF9vdXQsJHMzKTsJCSMgc2F2ZSBvdXQKKwkJJnN1YgkoJHMyLDE2KTsJCSMgZGVjcmVhc2UgbGVuCisJCSZjbXAJKCRzMiwxNik7CisJCSZtb3YJKCRfbGVuLCRzMik7CQkjIHNhdmUgbGVuCisJJmphZQkoJmxhYmVsKCJzbG93X2VuY19sb29wX3g4NiIpKTsKKwkmdGVzdAkoJHMyLDE1KTsKKwkmam56CSgmbGFiZWwoInNsb3dfZW5jX3RhaWwiKSk7CisJJm1vdgkoJGFjYywkX2l2cCk7CQkjIGxvYWQgaXZwCisJJm1vdgkoJHMyLCZEV1AoOCwka2V5KSk7CSMgcmVzdG9yZSBsYXN0IGR3b3JkcworCSZtb3YJKCRzMywmRFdQKDEyLCRrZXkpKTsKKwkmbW92CSgmRFdQKDAsJGFjYyksJHMwKTsJIyBzYXZlIGl2ZWMKKwkmbW92CSgmRFdQKDQsJGFjYyksJHMxKTsKKwkmbW92CSgmRFdQKDgsJGFjYyksJHMyKTsKKwkmbW92CSgmRFdQKDEyLCRhY2MpLCRzMyk7CisKKwkmbW92CSgiZXNwIiwkX2VzcCk7CisJJnBvcGYJKCk7CisJJmZ1bmN0aW9uX2VuZF9BKCk7CisJJnB1c2hmCSgpOwkJCSMga2x1ZGdlLCBuZXZlciBleGVjdXRlZAorCisgICAgJnNldF9sYWJlbCgic2xvd19lbmNfdGFpbCIsMTYpOworCSZlbW1zCSgpCWlmICghJHg4Nm9ubHkpOworCSZtb3YJKCRrZXkgZXEgImVkaSI/ICRrZXk6IiIsJHMzKTsJIyBsb2FkIG91dCB0byBlZGkKKwkmbW92CSgkczEsMTYpOworCSZzdWIJKCRzMSwkczIpOworCSZjbXAJKCRrZXksJGFjYyBlcSAiZXNpIj8gJGFjYzoiIik7CSMgY29tcGFyZSB3aXRoIGlucAorCSZqZQkoJmxhYmVsKCJlbmNfaW5fcGxhY2UiKSk7CisJJmFsaWduCSg0KTsKKwkmZGF0YV93b3JkKDB4QTRGM0Y2ODkpOwkjIHJlcCBtb3ZzYgkjIGNvcHkgaW5wdXQKKwkmam1wCSgmbGFiZWwoImVuY19za2lwX2luX3BsYWNlIikpOworICAgICZzZXRfbGFiZWwoImVuY19pbl9wbGFjZSIpOworCSZsZWEJKCRrZXksJkRXUCgwLCRrZXksJHMyKSk7CisgICAgJnNldF9sYWJlbCgiZW5jX3NraXBfaW5fcGxhY2UiKTsKKwkmbW92CSgkczIsJHMxKTsKKwkmeG9yCSgkczAsJHMwKTsKKwkmYWxpZ24JKDQpOworCSZkYXRhX3dvcmQoMHhBQUYzRjY4OSk7CSMgcmVwIHN0b3NiCSMgemVybyB0YWlsCisKKwkmbW92CSgka2V5LCRfaXZwKTsJCQkjIHJlc3RvcmUgaXZwCisJJm1vdgkoJGFjYywkczMpOwkJCSMgb3V0cHV0IGFzIGlucHV0CisJJm1vdgkoJHMwLCZEV1AoMCwka2V5KSk7CisJJm1vdgkoJHMxLCZEV1AoNCwka2V5KSk7CisJJm1vdgkoJF9sZW4sMTYpOwkJCSMgbGVuPTE2CisJJmptcAkoJmxhYmVsKCJzbG93X2VuY19sb29wX3g4NiIpKTsJIyBvbmUgbW9yZSBzcGluLi4uCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU0xPVyBERUNSWVBUIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKKyZzZXRfbGFiZWwoInNsb3dfZGVjcnlwdCIsMTYpOworCQkJCQlpZiAoISR4ODZvbmx5KSB7CisJJmJ0CSgkX3RtcCwyNSk7CQkjIGNoZWNrIGZvciBTU0UgYml0CisJJmpuYwkoJmxhYmVsKCJzbG93X2RlY19sb29wX3g4NiIpKTsKKworCSZzZXRfbGFiZWwoInNsb3dfZGVjX2xvb3Bfc3NlIiw0KTsKKwkJJm1vdnEJKCJtbTAiLCZRV1AoMCwkYWNjKSk7CSMgcmVhZCBpbnB1dAorCQkmbW92cQkoIm1tNCIsJlFXUCg4LCRhY2MpKTsKKworCQkmbW92CSgka2V5LCRfa2V5KTsKKwkJJmNhbGwJKCJfc3NlX0FFU19kZWNyeXB0X2NvbXBhY3QiKTsKKworCQkmbW92CSgkYWNjLCRfaW5wKTsJCSMgbG9hZCBpbnAKKwkJJmxlYQkoJHMwLCRpdmVjKTsKKwkJJm1vdgkoJHMxLCRfb3V0KTsJCSMgbG9hZCBvdXQKKwkJJm1vdgkoJHMyLCRfbGVuKTsJCSMgbG9hZCBsZW4KKwkJJm1vdgkoJGtleSwkX2l2cCk7CQkjIGxvYWQgaXZwCisKKwkJJm1vdnEJKCJtbTEiLCZRV1AoMCwkYWNjKSk7CSMgcmUtcmVhZCBpbnB1dAorCQkmbW92cQkoIm1tNSIsJlFXUCg4LCRhY2MpKTsKKworCQkmcHhvcgkoIm1tMCIsJlFXUCgwLCRrZXkpKTsJIyB4b3IgaXYKKwkJJnB4b3IJKCJtbTQiLCZRV1AoOCwka2V5KSk7CisKKwkJJm1vdnEJKCZRV1AoMCwka2V5KSwibW0xIik7CSMgY29weSBpbnB1dCB0byBpdgorCQkmbW92cQkoJlFXUCg4LCRrZXkpLCJtbTUiKTsKKworCQkmc3ViCSgkczIsMTYpOwkJIyBkZWNyZWFzZSBsZW4KKwkJJmpjCSgmbGFiZWwoInNsb3dfZGVjX3BhcnRpYWxfc3NlIikpOworCisJCSZtb3ZxCSgmUVdQKDAsJHMxKSwibW0wIik7CSMgd3JpdGUgb3V0cHV0CisJCSZtb3ZxCSgmUVdQKDgsJHMxKSwibW00Iik7CisKKwkJJmxlYQkoJHMxLCZEV1AoMTYsJHMxKSk7CSMgYWR2YW5jZSBvdXQKKwkJJm1vdgkoJF9vdXQsJHMxKTsJCSMgc2F2ZSBvdXQKKwkJJmxlYQkoJGFjYywmRFdQKDE2LCRhY2MpKTsJIyBhZHZhbmNlIGlucAorCQkmbW92CSgkX2lucCwkYWNjKTsJCSMgc2F2ZSBpbnAKKwkJJm1vdgkoJF9sZW4sJHMyKTsJCSMgc2F2ZSBsZW4KKwkmam56CSgmbGFiZWwoInNsb3dfZGVjX2xvb3Bfc3NlIikpOworCSZlbW1zCSgpOworCSZtb3YJKCJlc3AiLCRfZXNwKTsKKwkmcG9wZgkoKTsKKwkmZnVuY3Rpb25fZW5kX0EoKTsKKwkmcHVzaGYJKCk7CQkJIyBrbHVkZ2UsIG5ldmVyIGV4ZWN1dGVkCisKKyAgICAmc2V0X2xhYmVsKCJzbG93X2RlY19wYXJ0aWFsX3NzZSIsMTYpOworCSZtb3ZxCSgmUVdQKDAsJHMwKSwibW0wIik7CSMgc2F2ZSBvdXRwdXQgdG8gdGVtcAorCSZtb3ZxCSgmUVdQKDgsJHMwKSwibW00Iik7CisJJmVtbXMJKCk7CisKKwkmYWRkCSgkczIgZXEgImVjeCIgPyAiZWN4IjoiIiwxNik7CisJJm1vdgkoImVkaSIsJHMxKTsJCSMgb3V0CisJJm1vdgkoImVzaSIsJHMwKTsJCSMgdGVtcAorCSZhbGlnbgkoNCk7CisJJmRhdGFfd29yZCgweEE0RjNGNjg5KTsJCSMgcmVwIG1vdnNiICMgY29weSBwYXJ0aWFsIG91dHB1dAorCisJJm1vdgkoImVzcCIsJF9lc3ApOworCSZwb3BmCSgpOworCSZmdW5jdGlvbl9lbmRfQSgpOworCSZwdXNoZgkoKTsJCQkjIGtsdWRnZSwgbmV2ZXIgZXhlY3V0ZWQKKwkJCQkJfQorCSZzZXRfbGFiZWwoInNsb3dfZGVjX2xvb3BfeDg2IiwxNik7CisJCSZtb3YJKCRzMCwmRFdQKDAsJGFjYykpOwkjIHJlYWQgaW5wdXQKKwkJJm1vdgkoJHMxLCZEV1AoNCwkYWNjKSk7CisJCSZtb3YJKCRzMiwmRFdQKDgsJGFjYykpOworCQkmbW92CSgkczMsJkRXUCgxMiwkYWNjKSk7CisKKwkJJmxlYQkoJGtleSwkaXZlYyk7CisJCSZtb3YJKCZEV1AoMCwka2V5KSwkczApOwkjIGNvcHkgdG8gdGVtcAorCQkmbW92CSgmRFdQKDQsJGtleSksJHMxKTsKKwkJJm1vdgkoJkRXUCg4LCRrZXkpLCRzMik7CisJCSZtb3YJKCZEV1AoMTIsJGtleSksJHMzKTsKKworCQkmbW92CSgka2V5LCRfa2V5KTsJCSMgbG9hZCBrZXkKKwkJJmNhbGwJKCJfeDg2X0FFU19kZWNyeXB0X2NvbXBhY3QiKTsKKworCQkmbW92CSgka2V5LCRfaXZwKTsJCSMgbG9hZCBpdnAKKwkJJm1vdgkoJGFjYywkX2xlbik7CQkjIGxvYWQgbGVuCisJCSZ4b3IJKCRzMCwmRFdQKDAsJGtleSkpOwkjIHhvciBpdgorCQkmeG9yCSgkczEsJkRXUCg0LCRrZXkpKTsKKwkJJnhvcgkoJHMyLCZEV1AoOCwka2V5KSk7CisJCSZ4b3IJKCRzMywmRFdQKDEyLCRrZXkpKTsKKworCQkmc3ViCSgkYWNjLDE2KTsKKwkJJmpjCSgmbGFiZWwoInNsb3dfZGVjX3BhcnRpYWxfeDg2IikpOworCisJCSZtb3YJKCRfbGVuLCRhY2MpOwkJIyBzYXZlIGxlbgorCQkmbW92CSgkYWNjLCRfb3V0KTsJCSMgbG9hZCBvdXQKKworCQkmbW92CSgmRFdQKDAsJGFjYyksJHMwKTsJIyB3cml0ZSBvdXRwdXQKKwkJJm1vdgkoJkRXUCg0LCRhY2MpLCRzMSk7CisJCSZtb3YJKCZEV1AoOCwkYWNjKSwkczIpOworCQkmbW92CSgmRFdQKDEyLCRhY2MpLCRzMyk7CisKKwkJJmxlYQkoJGFjYywmRFdQKDE2LCRhY2MpKTsJIyBhZHZhbmNlIG91dAorCQkmbW92CSgkX291dCwkYWNjKTsJCSMgc2F2ZSBvdXQKKworCQkmbGVhCSgkYWNjLCRpdmVjKTsKKwkJJm1vdgkoJHMwLCZEV1AoMCwkYWNjKSk7CSMgcmVhZCB0ZW1wCisJCSZtb3YJKCRzMSwmRFdQKDQsJGFjYykpOworCQkmbW92CSgkczIsJkRXUCg4LCRhY2MpKTsKKwkJJm1vdgkoJHMzLCZEV1AoMTIsJGFjYykpOworCisJCSZtb3YJKCZEV1AoMCwka2V5KSwkczApOwkjIGNvcHkgaXQgdG8gaXYKKwkJJm1vdgkoJkRXUCg0LCRrZXkpLCRzMSk7CisJCSZtb3YJKCZEV1AoOCwka2V5KSwkczIpOworCQkmbW92CSgmRFdQKDEyLCRrZXkpLCRzMyk7CisKKwkJJm1vdgkoJGFjYywkX2lucCk7CQkjIGxvYWQgaW5wCisJCSZsZWEJKCRhY2MsJkRXUCgxNiwkYWNjKSk7CSMgYWR2YW5jZSBpbnAKKwkJJm1vdgkoJF9pbnAsJGFjYyk7CQkjIHNhdmUgaW5wCisJJmpuegkoJmxhYmVsKCJzbG93X2RlY19sb29wX3g4NiIpKTsKKwkmbW92CSgiZXNwIiwkX2VzcCk7CisJJnBvcGYJKCk7CisJJmZ1bmN0aW9uX2VuZF9BKCk7CisJJnB1c2hmCSgpOwkJCSMga2x1ZGdlLCBuZXZlciBleGVjdXRlZAorCisgICAgJnNldF9sYWJlbCgic2xvd19kZWNfcGFydGlhbF94ODYiLDE2KTsKKwkmbGVhCSgkYWNjLCRpdmVjKTsKKwkmbW92CSgmRFdQKDAsJGFjYyksJHMwKTsJIyBzYXZlIG91dHB1dCB0byB0ZW1wCisJJm1vdgkoJkRXUCg0LCRhY2MpLCRzMSk7CisJJm1vdgkoJkRXUCg4LCRhY2MpLCRzMik7CisJJm1vdgkoJkRXUCgxMiwkYWNjKSwkczMpOworCisJJm1vdgkoJGFjYywkX2lucCk7CisJJm1vdgkoJHMwLCZEV1AoMCwkYWNjKSk7CSMgcmUtcmVhZCBpbnB1dAorCSZtb3YJKCRzMSwmRFdQKDQsJGFjYykpOworCSZtb3YJKCRzMiwmRFdQKDgsJGFjYykpOworCSZtb3YJKCRzMywmRFdQKDEyLCRhY2MpKTsKKworCSZtb3YJKCZEV1AoMCwka2V5KSwkczApOwkjIGNvcHkgaXQgdG8gaXYKKwkmbW92CSgmRFdQKDQsJGtleSksJHMxKTsKKwkmbW92CSgmRFdQKDgsJGtleSksJHMyKTsKKwkmbW92CSgmRFdQKDEyLCRrZXkpLCRzMyk7CisKKwkmbW92CSgiZWN4IiwkX2xlbik7CisJJm1vdgkoImVkaSIsJF9vdXQpOworCSZsZWEJKCJlc2kiLCRpdmVjKTsKKwkmYWxpZ24JKDQpOworCSZkYXRhX3dvcmQoMHhBNEYzRjY4OSk7CQkjIHJlcCBtb3ZzYiAjIGNvcHkgcGFydGlhbCBvdXRwdXQKKworCSZtb3YJKCJlc3AiLCRfZXNwKTsKKwkmcG9wZgkoKTsKKyZmdW5jdGlvbl9lbmQoIkFFU19jYmNfZW5jcnlwdCIpOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIworCitzdWIgZW5ja2V5KCkKK3sKKwkmbW92egkoImVzaSIsJkxCKCJlZHgiKSk7CQkjIHJrW2ldPj4wCisJJm1vdnoJKCJlYngiLCZCUCgtMTI4LCR0YmwsImVzaSIsMSkpOworCSZtb3Z6CSgiZXNpIiwmSEIoImVkeCIpKTsJCSMgcmtbaV0+PjgKKwkmc2hsCSgiZWJ4IiwyNCk7CisJJnhvcgkoImVheCIsImVieCIpOworCisJJm1vdnoJKCJlYngiLCZCUCgtMTI4LCR0YmwsImVzaSIsMSkpOworCSZzaHIJKCJlZHgiLDE2KTsKKwkmbW92egkoImVzaSIsJkxCKCJlZHgiKSk7CQkjIHJrW2ldPj4xNgorCSZ4b3IJKCJlYXgiLCJlYngiKTsKKworCSZtb3Z6CSgiZWJ4IiwmQlAoLTEyOCwkdGJsLCJlc2kiLDEpKTsKKwkmbW92egkoImVzaSIsJkhCKCJlZHgiKSk7CQkjIHJrW2ldPj4yNAorCSZzaGwJKCJlYngiLDgpOworCSZ4b3IJKCJlYXgiLCJlYngiKTsKKworCSZtb3Z6CSgiZWJ4IiwmQlAoLTEyOCwkdGJsLCJlc2kiLDEpKTsKKwkmc2hsCSgiZWJ4IiwxNik7CisJJnhvcgkoImVheCIsImVieCIpOworCisJJnhvcgkoImVheCIsJkRXUCgxMDI0LTEyOCwkdGJsLCJlY3giLDQpKTsJIyByY29uCit9CisKKyZmdW5jdGlvbl9iZWdpbigiX3g4Nl9BRVNfc2V0X2VuY3J5cHRfa2V5Iik7CisJJm1vdgkoImVzaSIsJndwYXJhbSgxKSk7CQkjIHVzZXIgc3VwcGxpZWQga2V5CisJJm1vdgkoImVkaSIsJndwYXJhbSgzKSk7CQkjIHByaXZhdGUga2V5IHNjaGVkdWxlCisKKwkmdGVzdAkoImVzaSIsLTEpOworCSZqegkoJmxhYmVsKCJiYWRwb2ludGVyIikpOworCSZ0ZXN0CSgiZWRpIiwtMSk7CisJJmp6CSgmbGFiZWwoImJhZHBvaW50ZXIiKSk7CisKKwkmY2FsbAkoJmxhYmVsKCJwaWNfcG9pbnQiKSk7CisJJnNldF9sYWJlbCgicGljX3BvaW50Iik7CisJJmJsaW5kcG9wKCR0YmwpOworCSZsZWEJKCR0YmwsJkRXUCgmbGFiZWwoIkFFU19UZSIpLiItIi4mbGFiZWwoInBpY19wb2ludCIpLCR0YmwpKTsKKwkmbGVhCSgkdGJsLCZEV1AoMjA0OCsxMjgsJHRibCkpOworCisJIyBwcmVmZXRjaCBUZTQKKwkmbW92CSgiZWF4IiwmRFdQKDAtMTI4LCR0YmwpKTsKKwkmbW92CSgiZWJ4IiwmRFdQKDMyLTEyOCwkdGJsKSk7CisJJm1vdgkoImVjeCIsJkRXUCg2NC0xMjgsJHRibCkpOworCSZtb3YJKCJlZHgiLCZEV1AoOTYtMTI4LCR0YmwpKTsKKwkmbW92CSgiZWF4IiwmRFdQKDEyOC0xMjgsJHRibCkpOworCSZtb3YJKCJlYngiLCZEV1AoMTYwLTEyOCwkdGJsKSk7CisJJm1vdgkoImVjeCIsJkRXUCgxOTItMTI4LCR0YmwpKTsKKwkmbW92CSgiZWR4IiwmRFdQKDIyNC0xMjgsJHRibCkpOworCisJJm1vdgkoImVjeCIsJndwYXJhbSgyKSk7CQkjIG51bWJlciBvZiBiaXRzIGluIGtleQorCSZjbXAJKCJlY3giLDEyOCk7CisJJmplCSgmbGFiZWwoIjEwcm91bmRzIikpOworCSZjbXAJKCJlY3giLDE5Mik7CisJJmplCSgmbGFiZWwoIjEycm91bmRzIikpOworCSZjbXAJKCJlY3giLDI1Nik7CisJJmplCSgmbGFiZWwoIjE0cm91bmRzIikpOworCSZtb3YJKCJlYXgiLC0yKTsJCQkjIGludmFsaWQgbnVtYmVyIG9mIGJpdHMKKwkmam1wCSgmbGFiZWwoImV4aXQiKSk7CisKKyAgICAmc2V0X2xhYmVsKCIxMHJvdW5kcyIpOworCSZtb3YJKCJlYXgiLCZEV1AoMCwiZXNpIikpOwkJIyBjb3B5IGZpcnN0IDQgZHdvcmRzCisJJm1vdgkoImVieCIsJkRXUCg0LCJlc2kiKSk7CisJJm1vdgkoImVjeCIsJkRXUCg4LCJlc2kiKSk7CisJJm1vdgkoImVkeCIsJkRXUCgxMiwiZXNpIikpOworCSZtb3YJKCZEV1AoMCwiZWRpIiksImVheCIpOworCSZtb3YJKCZEV1AoNCwiZWRpIiksImVieCIpOworCSZtb3YJKCZEV1AoOCwiZWRpIiksImVjeCIpOworCSZtb3YJKCZEV1AoMTIsImVkaSIpLCJlZHgiKTsKKworCSZ4b3IJKCJlY3giLCJlY3giKTsKKwkmam1wCSgmbGFiZWwoIjEwc2hvcnRjdXQiKSk7CisKKwkmYWxpZ24JKDQpOworCSZzZXRfbGFiZWwoIjEwbG9vcCIpOworCQkmbW92CSgiZWF4IiwmRFdQKDAsImVkaSIpKTsJCSMgcmtbMF0KKwkJJm1vdgkoImVkeCIsJkRXUCgxMiwiZWRpIikpOwkJIyBya1szXQorCSZzZXRfbGFiZWwoIjEwc2hvcnRjdXQiKTsKKwkJJmVuY2tleQkoKTsKKworCQkmbW92CSgmRFdQKDE2LCJlZGkiKSwiZWF4Iik7CQkjIHJrWzRdCisJCSZ4b3IJKCJlYXgiLCZEV1AoNCwiZWRpIikpOworCQkmbW92CSgmRFdQKDIwLCJlZGkiKSwiZWF4Iik7CQkjIHJrWzVdCisJCSZ4b3IJKCJlYXgiLCZEV1AoOCwiZWRpIikpOworCQkmbW92CSgmRFdQKDI0LCJlZGkiKSwiZWF4Iik7CQkjIHJrWzZdCisJCSZ4b3IJKCJlYXgiLCZEV1AoMTIsImVkaSIpKTsKKwkJJm1vdgkoJkRXUCgyOCwiZWRpIiksImVheCIpOwkJIyBya1s3XQorCQkmaW5jCSgiZWN4Iik7CisJCSZhZGQJKCJlZGkiLDE2KTsKKwkJJmNtcAkoImVjeCIsMTApOworCSZqbAkoJmxhYmVsKCIxMGxvb3AiKSk7CisKKwkmbW92CSgmRFdQKDgwLCJlZGkiKSwxMCk7CQkjIHNldHVwIG51bWJlciBvZiByb3VuZHMKKwkmeG9yCSgiZWF4IiwiZWF4Iik7CisJJmptcAkoJmxhYmVsKCJleGl0IikpOworCQkKKyAgICAmc2V0X2xhYmVsKCIxMnJvdW5kcyIpOworCSZtb3YJKCJlYXgiLCZEV1AoMCwiZXNpIikpOwkJIyBjb3B5IGZpcnN0IDYgZHdvcmRzCisJJm1vdgkoImVieCIsJkRXUCg0LCJlc2kiKSk7CisJJm1vdgkoImVjeCIsJkRXUCg4LCJlc2kiKSk7CisJJm1vdgkoImVkeCIsJkRXUCgxMiwiZXNpIikpOworCSZtb3YJKCZEV1AoMCwiZWRpIiksImVheCIpOworCSZtb3YJKCZEV1AoNCwiZWRpIiksImVieCIpOworCSZtb3YJKCZEV1AoOCwiZWRpIiksImVjeCIpOworCSZtb3YJKCZEV1AoMTIsImVkaSIpLCJlZHgiKTsKKwkmbW92CSgiZWN4IiwmRFdQKDE2LCJlc2kiKSk7CisJJm1vdgkoImVkeCIsJkRXUCgyMCwiZXNpIikpOworCSZtb3YJKCZEV1AoMTYsImVkaSIpLCJlY3giKTsKKwkmbW92CSgmRFdQKDIwLCJlZGkiKSwiZWR4Iik7CisKKwkmeG9yCSgiZWN4IiwiZWN4Iik7CisJJmptcAkoJmxhYmVsKCIxMnNob3J0Y3V0IikpOworCisJJmFsaWduCSg0KTsKKwkmc2V0X2xhYmVsKCIxMmxvb3AiKTsKKwkJJm1vdgkoImVheCIsJkRXUCgwLCJlZGkiKSk7CQkjIHJrWzBdCisJCSZtb3YJKCJlZHgiLCZEV1AoMjAsImVkaSIpKTsJCSMgcmtbNV0KKwkmc2V0X2xhYmVsKCIxMnNob3J0Y3V0Iik7CisJCSZlbmNrZXkJKCk7CisKKwkJJm1vdgkoJkRXUCgyNCwiZWRpIiksImVheCIpOwkJIyBya1s2XQorCQkmeG9yCSgiZWF4IiwmRFdQKDQsImVkaSIpKTsKKwkJJm1vdgkoJkRXUCgyOCwiZWRpIiksImVheCIpOwkJIyBya1s3XQorCQkmeG9yCSgiZWF4IiwmRFdQKDgsImVkaSIpKTsKKwkJJm1vdgkoJkRXUCgzMiwiZWRpIiksImVheCIpOwkJIyBya1s4XQorCQkmeG9yCSgiZWF4IiwmRFdQKDEyLCJlZGkiKSk7CisJCSZtb3YJKCZEV1AoMzYsImVkaSIpLCJlYXgiKTsJCSMgcmtbOV0KKworCQkmY21wCSgiZWN4Iiw3KTsKKwkJJmplCSgmbGFiZWwoIjEyYnJlYWsiKSk7CisJCSZpbmMJKCJlY3giKTsKKworCQkmeG9yCSgiZWF4IiwmRFdQKDE2LCJlZGkiKSk7CisJCSZtb3YJKCZEV1AoNDAsImVkaSIpLCJlYXgiKTsJCSMgcmtbMTBdCisJCSZ4b3IJKCJlYXgiLCZEV1AoMjAsImVkaSIpKTsKKwkJJm1vdgkoJkRXUCg0NCwiZWRpIiksImVheCIpOwkJIyBya1sxMV0KKworCQkmYWRkCSgiZWRpIiwyNCk7CisJJmptcAkoJmxhYmVsKCIxMmxvb3AiKSk7CisKKwkmc2V0X2xhYmVsKCIxMmJyZWFrIik7CisJJm1vdgkoJkRXUCg3MiwiZWRpIiksMTIpOwkJIyBzZXR1cCBudW1iZXIgb2Ygcm91bmRzCisJJnhvcgkoImVheCIsImVheCIpOworCSZqbXAJKCZsYWJlbCgiZXhpdCIpKTsKKworICAgICZzZXRfbGFiZWwoIjE0cm91bmRzIik7CisJJm1vdgkoImVheCIsJkRXUCgwLCJlc2kiKSk7CQkjIGNvcHkgZmlyc3QgOCBkd29yZHMKKwkmbW92CSgiZWJ4IiwmRFdQKDQsImVzaSIpKTsKKwkmbW92CSgiZWN4IiwmRFdQKDgsImVzaSIpKTsKKwkmbW92CSgiZWR4IiwmRFdQKDEyLCJlc2kiKSk7CisJJm1vdgkoJkRXUCgwLCJlZGkiKSwiZWF4Iik7CisJJm1vdgkoJkRXUCg0LCJlZGkiKSwiZWJ4Iik7CisJJm1vdgkoJkRXUCg4LCJlZGkiKSwiZWN4Iik7CisJJm1vdgkoJkRXUCgxMiwiZWRpIiksImVkeCIpOworCSZtb3YJKCJlYXgiLCZEV1AoMTYsImVzaSIpKTsKKwkmbW92CSgiZWJ4IiwmRFdQKDIwLCJlc2kiKSk7CisJJm1vdgkoImVjeCIsJkRXUCgyNCwiZXNpIikpOworCSZtb3YJKCJlZHgiLCZEV1AoMjgsImVzaSIpKTsKKwkmbW92CSgmRFdQKDE2LCJlZGkiKSwiZWF4Iik7CisJJm1vdgkoJkRXUCgyMCwiZWRpIiksImVieCIpOworCSZtb3YJKCZEV1AoMjQsImVkaSIpLCJlY3giKTsKKwkmbW92CSgmRFdQKDI4LCJlZGkiKSwiZWR4Iik7CisKKwkmeG9yCSgiZWN4IiwiZWN4Iik7CisJJmptcAkoJmxhYmVsKCIxNHNob3J0Y3V0IikpOworCisJJmFsaWduCSg0KTsKKwkmc2V0X2xhYmVsKCIxNGxvb3AiKTsKKwkJJm1vdgkoImVkeCIsJkRXUCgyOCwiZWRpIikpOwkJIyBya1s3XQorCSZzZXRfbGFiZWwoIjE0c2hvcnRjdXQiKTsKKwkJJm1vdgkoImVheCIsJkRXUCgwLCJlZGkiKSk7CQkjIHJrWzBdCisKKwkJJmVuY2tleQkoKTsKKworCQkmbW92CSgmRFdQKDMyLCJlZGkiKSwiZWF4Iik7CQkjIHJrWzhdCisJCSZ4b3IJKCJlYXgiLCZEV1AoNCwiZWRpIikpOworCQkmbW92CSgmRFdQKDM2LCJlZGkiKSwiZWF4Iik7CQkjIHJrWzldCisJCSZ4b3IJKCJlYXgiLCZEV1AoOCwiZWRpIikpOworCQkmbW92CSgmRFdQKDQwLCJlZGkiKSwiZWF4Iik7CQkjIHJrWzEwXQorCQkmeG9yCSgiZWF4IiwmRFdQKDEyLCJlZGkiKSk7CisJCSZtb3YJKCZEV1AoNDQsImVkaSIpLCJlYXgiKTsJCSMgcmtbMTFdCisKKwkJJmNtcAkoImVjeCIsNik7CisJCSZqZQkoJmxhYmVsKCIxNGJyZWFrIikpOworCQkmaW5jCSgiZWN4Iik7CisKKwkJJm1vdgkoImVkeCIsImVheCIpOworCQkmbW92CSgiZWF4IiwmRFdQKDE2LCJlZGkiKSk7CQkjIHJrWzRdCisJCSZtb3Z6CSgiZXNpIiwmTEIoImVkeCIpKTsJCSMgcmtbMTFdPj4wCisJCSZtb3Z6CSgiZWJ4IiwmQlAoLTEyOCwkdGJsLCJlc2kiLDEpKTsKKwkJJm1vdnoJKCJlc2kiLCZIQigiZWR4IikpOwkJIyBya1sxMV0+PjgKKwkJJnhvcgkoImVheCIsImVieCIpOworCisJCSZtb3Z6CSgiZWJ4IiwmQlAoLTEyOCwkdGJsLCJlc2kiLDEpKTsKKwkJJnNocgkoImVkeCIsMTYpOworCQkmc2hsCSgiZWJ4Iiw4KTsKKwkJJm1vdnoJKCJlc2kiLCZMQigiZWR4IikpOwkJIyBya1sxMV0+PjE2CisJCSZ4b3IJKCJlYXgiLCJlYngiKTsKKworCQkmbW92egkoImVieCIsJkJQKC0xMjgsJHRibCwiZXNpIiwxKSk7CisJCSZtb3Z6CSgiZXNpIiwmSEIoImVkeCIpKTsJCSMgcmtbMTFdPj4yNAorCQkmc2hsCSgiZWJ4IiwxNik7CisJCSZ4b3IJKCJlYXgiLCJlYngiKTsKKworCQkmbW92egkoImVieCIsJkJQKC0xMjgsJHRibCwiZXNpIiwxKSk7CisJCSZzaGwJKCJlYngiLDI0KTsKKwkJJnhvcgkoImVheCIsImVieCIpOworCisJCSZtb3YJKCZEV1AoNDgsImVkaSIpLCJlYXgiKTsJCSMgcmtbMTJdCisJCSZ4b3IJKCJlYXgiLCZEV1AoMjAsImVkaSIpKTsKKwkJJm1vdgkoJkRXUCg1MiwiZWRpIiksImVheCIpOwkJIyBya1sxM10KKwkJJnhvcgkoImVheCIsJkRXUCgyNCwiZWRpIikpOworCQkmbW92CSgmRFdQKDU2LCJlZGkiKSwiZWF4Iik7CQkjIHJrWzE0XQorCQkmeG9yCSgiZWF4IiwmRFdQKDI4LCJlZGkiKSk7CisJCSZtb3YJKCZEV1AoNjAsImVkaSIpLCJlYXgiKTsJCSMgcmtbMTVdCisKKwkJJmFkZAkoImVkaSIsMzIpOworCSZqbXAJKCZsYWJlbCgiMTRsb29wIikpOworCisJJnNldF9sYWJlbCgiMTRicmVhayIpOworCSZtb3YJKCZEV1AoNDgsImVkaSIpLDE0KTsJCSMgc2V0dXAgbnVtYmVyIG9mIHJvdW5kcworCSZ4b3IJKCJlYXgiLCJlYXgiKTsKKwkmam1wCSgmbGFiZWwoImV4aXQiKSk7CisKKyAgICAmc2V0X2xhYmVsKCJiYWRwb2ludGVyIik7CisJJm1vdgkoImVheCIsLTEpOworICAgICZzZXRfbGFiZWwoImV4aXQiKTsKKyZmdW5jdGlvbl9lbmQoIl94ODZfQUVTX3NldF9lbmNyeXB0X2tleSIpOworCisjIGludCBBRVNfc2V0X2VuY3J5cHRfa2V5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnVzZXJLZXksIGNvbnN0IGludCBiaXRzLAorIyAgICAgICAgICAgICAgICAgICAgICAgIEFFU19LRVkgKmtleSkKKyZmdW5jdGlvbl9iZWdpbl9CKCJBRVNfc2V0X2VuY3J5cHRfa2V5Iik7CisJJmNhbGwJKCJfeDg2X0FFU19zZXRfZW5jcnlwdF9rZXkiKTsKKwkmcmV0CSgpOworJmZ1bmN0aW9uX2VuZF9CKCJBRVNfc2V0X2VuY3J5cHRfa2V5Iik7CisKK3N1YiBkZWNrZXkoKQoreyBteSAoJGksJGtleSwkdHAxLCR0cDIsJHRwNCwkdHA4KSA9IEBfOworICBteSAkdG1wID0gJHRibDsKKworCSZtb3YJKCR0bXAsMHg4MDgwODA4MCk7CisJJmFuZAkoJHRtcCwkdHAxKTsKKwkmbGVhCSgkdHAyLCZEV1AoMCwkdHAxLCR0cDEpKTsKKwkmbW92CSgkYWNjLCR0bXApOworCSZzaHIJKCR0bXAsNyk7CisJJnN1YgkoJGFjYywkdG1wKTsKKwkmYW5kCSgkdHAyLDB4ZmVmZWZlZmUpOworCSZhbmQJKCRhY2MsMHgxYjFiMWIxYik7CisJJnhvcgkoJHRwMiwkYWNjKTsKKwkmbW92CSgkdG1wLDB4ODA4MDgwODApOworCisJJmFuZAkoJHRtcCwkdHAyKTsKKwkmbGVhCSgkdHA0LCZEV1AoMCwkdHAyLCR0cDIpKTsKKwkmbW92CSgkYWNjLCR0bXApOworCSZzaHIJKCR0bXAsNyk7CisJJnN1YgkoJGFjYywkdG1wKTsKKwkmYW5kCSgkdHA0LDB4ZmVmZWZlZmUpOworCSZhbmQJKCRhY2MsMHgxYjFiMWIxYik7CisJICZ4b3IJKCR0cDIsJHRwMSk7CSMgdHAyXnRwMQorCSZ4b3IJKCR0cDQsJGFjYyk7CisJJm1vdgkoJHRtcCwweDgwODA4MDgwKTsKKworCSZhbmQJKCR0bXAsJHRwNCk7CisJJmxlYQkoJHRwOCwmRFdQKDAsJHRwNCwkdHA0KSk7CisJJm1vdgkoJGFjYywkdG1wKTsKKwkmc2hyCSgkdG1wLDcpOworCSAmeG9yCSgkdHA0LCR0cDEpOwkjIHRwNF50cDEKKwkmc3ViCSgkYWNjLCR0bXApOworCSZhbmQJKCR0cDgsMHhmZWZlZmVmZSk7CisJJmFuZAkoJGFjYywweDFiMWIxYjFiKTsKKwkgJnJvdGwJKCR0cDEsOCk7CSMgPSBST1RBVEUodHAxLDgpCisJJnhvcgkoJHRwOCwkYWNjKTsKKworCSZtb3YJKCR0bXAsJkRXUCg0KigkaSsxKSwka2V5KSk7CSMgbW9kdWxvLXNjaGVkdWxlZCBsb2FkCisKKwkmeG9yCSgkdHAxLCR0cDIpOworCSZ4b3IJKCR0cDIsJHRwOCk7CisJJnhvcgkoJHRwMSwkdHA0KTsKKwkmcm90bAkoJHRwMiwyNCk7CisJJnhvcgkoJHRwNCwkdHA4KTsKKwkmeG9yCSgkdHAxLCR0cDgpOwkjIF49IHRwOF4odHA0XnRwMSleKHRwMl50cDEpCisJJnJvdGwJKCR0cDQsMTYpOworCSZ4b3IJKCR0cDEsJHRwMik7CSMgXj0gUk9UQVRFKHRwOF50cDJedHAxLDI0KQorCSZyb3RsCSgkdHA4LDgpOworCSZ4b3IJKCR0cDEsJHRwNCk7CSMgXj0gUk9UQVRFKHRwOF50cDRedHAxLDE2KQorCSZtb3YJKCR0cDIsJHRtcCk7CisJJnhvcgkoJHRwMSwkdHA4KTsJIyBePSBST1RBVEUodHA4LDgpCisKKwkmbW92CSgmRFdQKDQqJGksJGtleSksJHRwMSk7Cit9CisKKyMgaW50IEFFU19zZXRfZGVjcnlwdF9rZXkoY29uc3QgdW5zaWduZWQgY2hhciAqdXNlcktleSwgY29uc3QgaW50IGJpdHMsCisjICAgICAgICAgICAgICAgICAgICAgICAgQUVTX0tFWSAqa2V5KQorJmZ1bmN0aW9uX2JlZ2luX0IoIkFFU19zZXRfZGVjcnlwdF9rZXkiKTsKKwkmY2FsbAkoIl94ODZfQUVTX3NldF9lbmNyeXB0X2tleSIpOworCSZjbXAJKCJlYXgiLDApOworCSZqZQkoJmxhYmVsKCJwcm9jZWVkIikpOworCSZyZXQJKCk7CisKKyAgICAmc2V0X2xhYmVsKCJwcm9jZWVkIik7CisJJnB1c2gJKCJlYnAiKTsKKwkmcHVzaAkoImVieCIpOworCSZwdXNoCSgiZXNpIik7CisJJnB1c2gJKCJlZGkiKTsKKworCSZtb3YJKCJlc2kiLCZ3cGFyYW0oMikpOworCSZtb3YJKCJlY3giLCZEV1AoMjQwLCJlc2kiKSk7CSMgcHVsbCBudW1iZXIgb2Ygcm91bmRzCisJJmxlYQkoImVjeCIsJkRXUCgwLCIiLCJlY3giLDQpKTsKKwkmbGVhCSgiZWRpIiwmRFdQKDAsImVzaSIsImVjeCIsNCkpOwkjIHBvaW50ZXIgdG8gbGFzdCBjaHVuaworCisJJnNldF9sYWJlbCgiaW52ZXJ0Iiw0KTsJCQkjIGludmVydCBvcmRlciBvZiBjaHVua3MKKwkJJm1vdgkoImVheCIsJkRXUCgwLCJlc2kiKSk7CisJCSZtb3YJKCJlYngiLCZEV1AoNCwiZXNpIikpOworCQkmbW92CSgiZWN4IiwmRFdQKDAsImVkaSIpKTsKKwkJJm1vdgkoImVkeCIsJkRXUCg0LCJlZGkiKSk7CisJCSZtb3YJKCZEV1AoMCwiZWRpIiksImVheCIpOworCQkmbW92CSgmRFdQKDQsImVkaSIpLCJlYngiKTsKKwkJJm1vdgkoJkRXUCgwLCJlc2kiKSwiZWN4Iik7CisJCSZtb3YJKCZEV1AoNCwiZXNpIiksImVkeCIpOworCQkmbW92CSgiZWF4IiwmRFdQKDgsImVzaSIpKTsKKwkJJm1vdgkoImVieCIsJkRXUCgxMiwiZXNpIikpOworCQkmbW92CSgiZWN4IiwmRFdQKDgsImVkaSIpKTsKKwkJJm1vdgkoImVkeCIsJkRXUCgxMiwiZWRpIikpOworCQkmbW92CSgmRFdQKDgsImVkaSIpLCJlYXgiKTsKKwkJJm1vdgkoJkRXUCgxMiwiZWRpIiksImVieCIpOworCQkmbW92CSgmRFdQKDgsImVzaSIpLCJlY3giKTsKKwkJJm1vdgkoJkRXUCgxMiwiZXNpIiksImVkeCIpOworCQkmYWRkCSgiZXNpIiwxNik7CisJCSZzdWIJKCJlZGkiLDE2KTsKKwkJJmNtcAkoImVzaSIsImVkaSIpOworCSZqbmUJKCZsYWJlbCgiaW52ZXJ0IikpOworCisJJm1vdgkoJGtleSwmd3BhcmFtKDIpKTsKKwkmbW92CSgkYWNjLCZEV1AoMjQwLCRrZXkpKTsJCSMgcHVsbCBudW1iZXIgb2Ygcm91bmRzCisJJmxlYQkoJGFjYywmRFdQKC0yLCRhY2MsJGFjYykpOworCSZsZWEJKCRhY2MsJkRXUCgwLCRrZXksJGFjYyw4KSk7CisJJm1vdgkoJndwYXJhbSgyKSwkYWNjKTsKKworCSZtb3YJKCRzMCwmRFdQKDE2LCRrZXkpKTsJCSMgbW9kdWxvLXNjaGVkdWxlZCBsb2FkCisJJnNldF9sYWJlbCgicGVybXV0ZSIsNCk7CQkjIHBlcm11dGUgdGhlIGtleSBzY2hlZHVsZQorCQkmYWRkCSgka2V5LDE2KTsKKwkJJmRlY2tleQkoMCwka2V5LCRzMCwkczEsJHMyLCRzMyk7CisJCSZkZWNrZXkJKDEsJGtleSwkczEsJHMyLCRzMywkczApOworCQkmZGVja2V5CSgyLCRrZXksJHMyLCRzMywkczAsJHMxKTsKKwkJJmRlY2tleQkoMywka2V5LCRzMywkczAsJHMxLCRzMik7CisJCSZjbXAJKCRrZXksJndwYXJhbSgyKSk7CisJJmpiCSgmbGFiZWwoInBlcm11dGUiKSk7CisKKwkmeG9yCSgiZWF4IiwiZWF4Iik7CQkJIyByZXR1cm4gc3VjY2VzcworJmZ1bmN0aW9uX2VuZCgiQUVTX3NldF9kZWNyeXB0X2tleSIpOworJmFzY2l6KCJBRVMgZm9yIHg4NiwgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQG9wZW5zc2wub3JnPiIpOworCismYXNtX2ZpbmlzaCgpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2Flcy9hc20vYWVzLWFybXY0LnBsIGIvY3J5cHRvL2Flcy9hc20vYWVzLWFybXY0LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YTNmNmEKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYWVzL2FzbS9hZXMtYXJtdjQucGwKQEAgLTAsMCArMSwxMjE5IEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgV3JpdHRlbiBieSBBbmR5IFBvbHlha292IDxhcHByb0BvcGVuc3NsLm9yZz4gZm9yIHRoZSBPcGVuU1NMCisjIHByb2plY3QuIFRoZSBtb2R1bGUgaXMsIGhvd2V2ZXIsIGR1YWwgbGljZW5zZWQgdW5kZXIgT3BlblNTTCBhbmQKKyMgQ1JZUFRPR0FNUyBsaWNlbnNlcyBkZXBlbmRpbmcgb24gd2hlcmUgeW91IG9idGFpbiBpdC4gRm9yIGZ1cnRoZXIKKyMgZGV0YWlscyBzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+YXBwcm8vY3J5cHRvZ2Ftcy8uCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgQUVTIGZvciBBUk12NAorCisjIEphbnVhcnkgMjAwNy4KKyMKKyMgQ29kZSB1c2VzIHNpbmdsZSAxSyBTLWJveCBhbmQgaXMgPjIgdGltZXMgZmFzdGVyIHRoYW4gY29kZSBnZW5lcmF0ZWQKKyMgYnkgZ2NjLTMuNC4xLiBUaGlzIGlzIHRoYW5rcyB0byB1bmlxdWUgZmVhdHVyZSBvZiBBUk12NCBJU0EsIHdoaWNoCisjIGFsbG93cyB0byBtZXJnZSBsb2dpY2FsIG9yIGFyaXRobWV0aWMgb3BlcmF0aW9uIHdpdGggc2hpZnQgb3Igcm90YXRlCisjIGluIG9uZSBpbnN0cnVjdGlvbiBhbmQgZW1pdCBjb21iaW5lZCByZXN1bHQgZXZlcnkgY3ljbGUuIFRoZSBtb2R1bGUKKyMgaXMgZW5kaWFuLW5ldXRyYWwuIFRoZSBwZXJmb3JtYW5jZSBpcyB+NDIgY3ljbGVzL2J5dGUgZm9yIDEyOC1iaXQKKyMga2V5IFtvbiBzaW5nbGUtaXNzdWUgWHNjYWxlIFBYQTI1MCBjb3JlXS4KKworIyBNYXkgMjAwNy4KKyMKKyMgQUVTX3NldF9bZW58ZGVdY3J5cHRfa2V5IGlzIGFkZGVkLgorCisjIEp1bHkgMjAxMC4KKyMKKyMgUmVzY2hlZHVsaW5nIGZvciBkdWFsLWlzc3VlIHBpcGVsaW5lIHJlc3VsdGVkIGluIDEyJSBpbXByb3ZlbWVudCBvbgorIyBDb3J0ZXggQTggY29yZSBhbmQgfjI1IGN5Y2xlcyBwZXIgYnl0ZSBwcm9jZXNzZWQgd2l0aCAxMjgtYml0IGtleS4KKworIyBGZWJydWFyeSAyMDExLgorIworIyBQcm9maWxlci1hc3Npc3RlZCBhbmQgcGxhdGZvcm0tc3BlY2lmaWMgb3B0aW1pemF0aW9uIHJlc3VsdGVkIGluIDE2JQorIyBpbXByb3ZlbWVudCBvbiBDb3J0ZXggQTggY29yZSBhbmQgfjIxLjUgY3ljbGVzIHBlciBieXRlLgorCit3aGlsZSAoKCRvdXRwdXQ9c2hpZnQpICYmICgkb3V0cHV0IX4vXlx3W1x3XC1dKlwuXHcrJC8pKSB7fQorb3BlbiBTVERPVVQsIj4kb3V0cHV0IjsKKworJHMwPSJyMCI7CiskczE9InIxIjsKKyRzMj0icjIiOworJHMzPSJyMyI7CiskdDE9InI0IjsKKyR0Mj0icjUiOworJHQzPSJyNiI7CiskaTE9InI3IjsKKyRpMj0icjgiOworJGkzPSJyOSI7CisKKyR0Ymw9InIxMCI7Ciska2V5PSJyMTEiOworJHJvdW5kcz0icjEyIjsKKworJGNvZGU9PDxfX187CisjaWYgZGVmaW5lZChfX2FybV9fKQorI2lmbmRlZiBfX0tFUk5FTF9fCisjIGluY2x1ZGUgImFybV9hcmNoLmgiCisjZWxzZQorIyBkZWZpbmUgX19BUk1fQVJDSF9fIF9fTElOVVhfQVJNX0FSQ0hfXworI2VuZGlmCisKKy50ZXh0CisjaWYgX19BUk1fQVJDSF9fPDcKKy5jb2RlCTMyCisjZWxzZQorLnN5bnRheAl1bmlmaWVkCisjIGlmZGVmIF9fdGh1bWIyX18KKy50aHVtYgorIyBlbHNlCisuY29kZQkzMgorIyBlbmRpZgorI2VuZGlmCisKKy50eXBlCUFFU19UZSwlb2JqZWN0CisuYWxpZ24JNQorQUVTX1RlOgorLndvcmQJMHhjNjYzNjNhNSwgMHhmODdjN2M4NCwgMHhlZTc3Nzc5OSwgMHhmNjdiN2I4ZAorLndvcmQJMHhmZmYyZjIwZCwgMHhkNjZiNmJiZCwgMHhkZTZmNmZiMSwgMHg5MWM1YzU1NAorLndvcmQJMHg2MDMwMzA1MCwgMHgwMjAxMDEwMywgMHhjZTY3NjdhOSwgMHg1NjJiMmI3ZAorLndvcmQJMHhlN2ZlZmUxOSwgMHhiNWQ3ZDc2MiwgMHg0ZGFiYWJlNiwgMHhlYzc2NzY5YQorLndvcmQJMHg4ZmNhY2E0NSwgMHgxZjgyODI5ZCwgMHg4OWM5Yzk0MCwgMHhmYTdkN2Q4NworLndvcmQJMHhlZmZhZmExNSwgMHhiMjU5NTllYiwgMHg4ZTQ3NDdjOSwgMHhmYmYwZjAwYgorLndvcmQJMHg0MWFkYWRlYywgMHhiM2Q0ZDQ2NywgMHg1ZmEyYTJmZCwgMHg0NWFmYWZlYQorLndvcmQJMHgyMzljOWNiZiwgMHg1M2E0YTRmNywgMHhlNDcyNzI5NiwgMHg5YmMwYzA1YgorLndvcmQJMHg3NWI3YjdjMiwgMHhlMWZkZmQxYywgMHgzZDkzOTNhZSwgMHg0YzI2MjY2YQorLndvcmQJMHg2YzM2MzY1YSwgMHg3ZTNmM2Y0MSwgMHhmNWY3ZjcwMiwgMHg4M2NjY2M0ZgorLndvcmQJMHg2ODM0MzQ1YywgMHg1MWE1YTVmNCwgMHhkMWU1ZTUzNCwgMHhmOWYxZjEwOAorLndvcmQJMHhlMjcxNzE5MywgMHhhYmQ4ZDg3MywgMHg2MjMxMzE1MywgMHgyYTE1MTUzZgorLndvcmQJMHgwODA0MDQwYywgMHg5NWM3Yzc1MiwgMHg0NjIzMjM2NSwgMHg5ZGMzYzM1ZQorLndvcmQJMHgzMDE4MTgyOCwgMHgzNzk2OTZhMSwgMHgwYTA1MDUwZiwgMHgyZjlhOWFiNQorLndvcmQJMHgwZTA3MDcwOSwgMHgyNDEyMTIzNiwgMHgxYjgwODA5YiwgMHhkZmUyZTIzZAorLndvcmQJMHhjZGViZWIyNiwgMHg0ZTI3Mjc2OSwgMHg3ZmIyYjJjZCwgMHhlYTc1NzU5ZgorLndvcmQJMHgxMjA5MDkxYiwgMHgxZDgzODM5ZSwgMHg1ODJjMmM3NCwgMHgzNDFhMWEyZQorLndvcmQJMHgzNjFiMWIyZCwgMHhkYzZlNmViMiwgMHhiNDVhNWFlZSwgMHg1YmEwYTBmYgorLndvcmQJMHhhNDUyNTJmNiwgMHg3NjNiM2I0ZCwgMHhiN2Q2ZDY2MSwgMHg3ZGIzYjNjZQorLndvcmQJMHg1MjI5Mjk3YiwgMHhkZGUzZTMzZSwgMHg1ZTJmMmY3MSwgMHgxMzg0ODQ5NworLndvcmQJMHhhNjUzNTNmNSwgMHhiOWQxZDE2OCwgMHgwMDAwMDAwMCwgMHhjMWVkZWQyYworLndvcmQJMHg0MDIwMjA2MCwgMHhlM2ZjZmMxZiwgMHg3OWIxYjFjOCwgMHhiNjViNWJlZAorLndvcmQJMHhkNDZhNmFiZSwgMHg4ZGNiY2I0NiwgMHg2N2JlYmVkOSwgMHg3MjM5Mzk0YgorLndvcmQJMHg5NDRhNGFkZSwgMHg5ODRjNGNkNCwgMHhiMDU4NThlOCwgMHg4NWNmY2Y0YQorLndvcmQJMHhiYmQwZDA2YiwgMHhjNWVmZWYyYSwgMHg0ZmFhYWFlNSwgMHhlZGZiZmIxNgorLndvcmQJMHg4NjQzNDNjNSwgMHg5YTRkNGRkNywgMHg2NjMzMzM1NSwgMHgxMTg1ODU5NAorLndvcmQJMHg4YTQ1NDVjZiwgMHhlOWY5ZjkxMCwgMHgwNDAyMDIwNiwgMHhmZTdmN2Y4MQorLndvcmQJMHhhMDUwNTBmMCwgMHg3ODNjM2M0NCwgMHgyNTlmOWZiYSwgMHg0YmE4YThlMworLndvcmQJMHhhMjUxNTFmMywgMHg1ZGEzYTNmZSwgMHg4MDQwNDBjMCwgMHgwNThmOGY4YQorLndvcmQJMHgzZjkyOTJhZCwgMHgyMTlkOWRiYywgMHg3MDM4Mzg0OCwgMHhmMWY1ZjUwNAorLndvcmQJMHg2M2JjYmNkZiwgMHg3N2I2YjZjMSwgMHhhZmRhZGE3NSwgMHg0MjIxMjE2MworLndvcmQJMHgyMDEwMTAzMCwgMHhlNWZmZmYxYSwgMHhmZGYzZjMwZSwgMHhiZmQyZDI2ZAorLndvcmQJMHg4MWNkY2Q0YywgMHgxODBjMGMxNCwgMHgyNjEzMTMzNSwgMHhjM2VjZWMyZgorLndvcmQJMHhiZTVmNWZlMSwgMHgzNTk3OTdhMiwgMHg4ODQ0NDRjYywgMHgyZTE3MTczOQorLndvcmQJMHg5M2M0YzQ1NywgMHg1NWE3YTdmMiwgMHhmYzdlN2U4MiwgMHg3YTNkM2Q0NworLndvcmQJMHhjODY0NjRhYywgMHhiYTVkNWRlNywgMHgzMjE5MTkyYiwgMHhlNjczNzM5NQorLndvcmQJMHhjMDYwNjBhMCwgMHgxOTgxODE5OCwgMHg5ZTRmNGZkMSwgMHhhM2RjZGM3ZgorLndvcmQJMHg0NDIyMjI2NiwgMHg1NDJhMmE3ZSwgMHgzYjkwOTBhYiwgMHgwYjg4ODg4MworLndvcmQJMHg4YzQ2NDZjYSwgMHhjN2VlZWUyOSwgMHg2YmI4YjhkMywgMHgyODE0MTQzYworLndvcmQJMHhhN2RlZGU3OSwgMHhiYzVlNWVlMiwgMHgxNjBiMGIxZCwgMHhhZGRiZGI3NgorLndvcmQJMHhkYmUwZTAzYiwgMHg2NDMyMzI1NiwgMHg3NDNhM2E0ZSwgMHgxNDBhMGExZQorLndvcmQJMHg5MjQ5NDlkYiwgMHgwYzA2MDYwYSwgMHg0ODI0MjQ2YywgMHhiODVjNWNlNAorLndvcmQJMHg5ZmMyYzI1ZCwgMHhiZGQzZDM2ZSwgMHg0M2FjYWNlZiwgMHhjNDYyNjJhNgorLndvcmQJMHgzOTkxOTFhOCwgMHgzMTk1OTVhNCwgMHhkM2U0ZTQzNywgMHhmMjc5Nzk4YgorLndvcmQJMHhkNWU3ZTczMiwgMHg4YmM4Yzg0MywgMHg2ZTM3Mzc1OSwgMHhkYTZkNmRiNworLndvcmQJMHgwMThkOGQ4YywgMHhiMWQ1ZDU2NCwgMHg5YzRlNGVkMiwgMHg0OWE5YTllMAorLndvcmQJMHhkODZjNmNiNCwgMHhhYzU2NTZmYSwgMHhmM2Y0ZjQwNywgMHhjZmVhZWEyNQorLndvcmQJMHhjYTY1NjVhZiwgMHhmNDdhN2E4ZSwgMHg0N2FlYWVlOSwgMHgxMDA4MDgxOAorLndvcmQJMHg2ZmJhYmFkNSwgMHhmMDc4Nzg4OCwgMHg0YTI1MjU2ZiwgMHg1YzJlMmU3MgorLndvcmQJMHgzODFjMWMyNCwgMHg1N2E2YTZmMSwgMHg3M2I0YjRjNywgMHg5N2M2YzY1MQorLndvcmQJMHhjYmU4ZTgyMywgMHhhMWRkZGQ3YywgMHhlODc0NzQ5YywgMHgzZTFmMWYyMQorLndvcmQJMHg5NjRiNGJkZCwgMHg2MWJkYmRkYywgMHgwZDhiOGI4NiwgMHgwZjhhOGE4NQorLndvcmQJMHhlMDcwNzA5MCwgMHg3YzNlM2U0MiwgMHg3MWI1YjVjNCwgMHhjYzY2NjZhYQorLndvcmQJMHg5MDQ4NDhkOCwgMHgwNjAzMDMwNSwgMHhmN2Y2ZjYwMSwgMHgxYzBlMGUxMgorLndvcmQJMHhjMjYxNjFhMywgMHg2YTM1MzU1ZiwgMHhhZTU3NTdmOSwgMHg2OWI5YjlkMAorLndvcmQJMHgxNzg2ODY5MSwgMHg5OWMxYzE1OCwgMHgzYTFkMWQyNywgMHgyNzllOWViOQorLndvcmQJMHhkOWUxZTEzOCwgMHhlYmY4ZjgxMywgMHgyYjk4OThiMywgMHgyMjExMTEzMworLndvcmQJMHhkMjY5NjliYiwgMHhhOWQ5ZDk3MCwgMHgwNzhlOGU4OSwgMHgzMzk0OTRhNworLndvcmQJMHgyZDliOWJiNiwgMHgzYzFlMWUyMiwgMHgxNTg3ODc5MiwgMHhjOWU5ZTkyMAorLndvcmQJMHg4N2NlY2U0OSwgMHhhYTU1NTVmZiwgMHg1MDI4Mjg3OCwgMHhhNWRmZGY3YQorLndvcmQJMHgwMzhjOGM4ZiwgMHg1OWExYTFmOCwgMHgwOTg5ODk4MCwgMHgxYTBkMGQxNworLndvcmQJMHg2NWJmYmZkYSwgMHhkN2U2ZTYzMSwgMHg4NDQyNDJjNiwgMHhkMDY4NjhiOAorLndvcmQJMHg4MjQxNDFjMywgMHgyOTk5OTliMCwgMHg1YTJkMmQ3NywgMHgxZTBmMGYxMQorLndvcmQJMHg3YmIwYjBjYiwgMHhhODU0NTRmYywgMHg2ZGJiYmJkNiwgMHgyYzE2MTYzYQorQCBUZTRbMjU2XQorLmJ5dGUJMHg2MywgMHg3YywgMHg3NywgMHg3YiwgMHhmMiwgMHg2YiwgMHg2ZiwgMHhjNQorLmJ5dGUJMHgzMCwgMHgwMSwgMHg2NywgMHgyYiwgMHhmZSwgMHhkNywgMHhhYiwgMHg3NgorLmJ5dGUJMHhjYSwgMHg4MiwgMHhjOSwgMHg3ZCwgMHhmYSwgMHg1OSwgMHg0NywgMHhmMAorLmJ5dGUJMHhhZCwgMHhkNCwgMHhhMiwgMHhhZiwgMHg5YywgMHhhNCwgMHg3MiwgMHhjMAorLmJ5dGUJMHhiNywgMHhmZCwgMHg5MywgMHgyNiwgMHgzNiwgMHgzZiwgMHhmNywgMHhjYworLmJ5dGUJMHgzNCwgMHhhNSwgMHhlNSwgMHhmMSwgMHg3MSwgMHhkOCwgMHgzMSwgMHgxNQorLmJ5dGUJMHgwNCwgMHhjNywgMHgyMywgMHhjMywgMHgxOCwgMHg5NiwgMHgwNSwgMHg5YQorLmJ5dGUJMHgwNywgMHgxMiwgMHg4MCwgMHhlMiwgMHhlYiwgMHgyNywgMHhiMiwgMHg3NQorLmJ5dGUJMHgwOSwgMHg4MywgMHgyYywgMHgxYSwgMHgxYiwgMHg2ZSwgMHg1YSwgMHhhMAorLmJ5dGUJMHg1MiwgMHgzYiwgMHhkNiwgMHhiMywgMHgyOSwgMHhlMywgMHgyZiwgMHg4NAorLmJ5dGUJMHg1MywgMHhkMSwgMHgwMCwgMHhlZCwgMHgyMCwgMHhmYywgMHhiMSwgMHg1YgorLmJ5dGUJMHg2YSwgMHhjYiwgMHhiZSwgMHgzOSwgMHg0YSwgMHg0YywgMHg1OCwgMHhjZgorLmJ5dGUJMHhkMCwgMHhlZiwgMHhhYSwgMHhmYiwgMHg0MywgMHg0ZCwgMHgzMywgMHg4NQorLmJ5dGUJMHg0NSwgMHhmOSwgMHgwMiwgMHg3ZiwgMHg1MCwgMHgzYywgMHg5ZiwgMHhhOAorLmJ5dGUJMHg1MSwgMHhhMywgMHg0MCwgMHg4ZiwgMHg5MiwgMHg5ZCwgMHgzOCwgMHhmNQorLmJ5dGUJMHhiYywgMHhiNiwgMHhkYSwgMHgyMSwgMHgxMCwgMHhmZiwgMHhmMywgMHhkMgorLmJ5dGUJMHhjZCwgMHgwYywgMHgxMywgMHhlYywgMHg1ZiwgMHg5NywgMHg0NCwgMHgxNworLmJ5dGUJMHhjNCwgMHhhNywgMHg3ZSwgMHgzZCwgMHg2NCwgMHg1ZCwgMHgxOSwgMHg3MworLmJ5dGUJMHg2MCwgMHg4MSwgMHg0ZiwgMHhkYywgMHgyMiwgMHgyYSwgMHg5MCwgMHg4OAorLmJ5dGUJMHg0NiwgMHhlZSwgMHhiOCwgMHgxNCwgMHhkZSwgMHg1ZSwgMHgwYiwgMHhkYgorLmJ5dGUJMHhlMCwgMHgzMiwgMHgzYSwgMHgwYSwgMHg0OSwgMHgwNiwgMHgyNCwgMHg1YworLmJ5dGUJMHhjMiwgMHhkMywgMHhhYywgMHg2MiwgMHg5MSwgMHg5NSwgMHhlNCwgMHg3OQorLmJ5dGUJMHhlNywgMHhjOCwgMHgzNywgMHg2ZCwgMHg4ZCwgMHhkNSwgMHg0ZSwgMHhhOQorLmJ5dGUJMHg2YywgMHg1NiwgMHhmNCwgMHhlYSwgMHg2NSwgMHg3YSwgMHhhZSwgMHgwOAorLmJ5dGUJMHhiYSwgMHg3OCwgMHgyNSwgMHgyZSwgMHgxYywgMHhhNiwgMHhiNCwgMHhjNgorLmJ5dGUJMHhlOCwgMHhkZCwgMHg3NCwgMHgxZiwgMHg0YiwgMHhiZCwgMHg4YiwgMHg4YQorLmJ5dGUJMHg3MCwgMHgzZSwgMHhiNSwgMHg2NiwgMHg0OCwgMHgwMywgMHhmNiwgMHgwZQorLmJ5dGUJMHg2MSwgMHgzNSwgMHg1NywgMHhiOSwgMHg4NiwgMHhjMSwgMHgxZCwgMHg5ZQorLmJ5dGUJMHhlMSwgMHhmOCwgMHg5OCwgMHgxMSwgMHg2OSwgMHhkOSwgMHg4ZSwgMHg5NAorLmJ5dGUJMHg5YiwgMHgxZSwgMHg4NywgMHhlOSwgMHhjZSwgMHg1NSwgMHgyOCwgMHhkZgorLmJ5dGUJMHg4YywgMHhhMSwgMHg4OSwgMHgwZCwgMHhiZiwgMHhlNiwgMHg0MiwgMHg2OAorLmJ5dGUJMHg0MSwgMHg5OSwgMHgyZCwgMHgwZiwgMHhiMCwgMHg1NCwgMHhiYiwgMHgxNgorQCByY29uW10KKy53b3JkCTB4MDEwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MDQwMDAwMDAsIDB4MDgwMDAwMDAKKy53b3JkCTB4MTAwMDAwMDAsIDB4MjAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4ODAwMDAwMDAKKy53b3JkCTB4MUIwMDAwMDAsIDB4MzYwMDAwMDAsIDAsIDAsIDAsIDAsIDAsIDAKKy5zaXplCUFFU19UZSwuLUFFU19UZQorCitAIHZvaWQgQUVTX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKK0AgCQkgY29uc3QgQUVTX0tFWSAqa2V5KSB7CisuZ2xvYmFsIEFFU19lbmNyeXB0CisudHlwZSAgIEFFU19lbmNyeXB0LCVmdW5jdGlvbgorLmFsaWduCTUKK0FFU19lbmNyeXB0OgorI2lmIF9fQVJNX0FSQ0hfXzw3CisJc3ViCXIzLHBjLCM4CQlAIEFFU19lbmNyeXB0CisjZWxzZQorCWFkcglyMyxBRVNfZW5jcnlwdAorI2VuZGlmCisJc3RtZGIgICBzcCEse3IxLHI0LXIxMixscn0KKwltb3YJJHJvdW5kcyxyMAkJQCBpbnAKKwltb3YJJGtleSxyMgorCXN1YgkkdGJsLHIzLCNBRVNfZW5jcnlwdC1BRVNfVGUJQCBUZQorI2lmIF9fQVJNX0FSQ0hfXzw3CisJbGRyYgkkczAsWyRyb3VuZHMsIzNdCUAgbG9hZCBpbnB1dCBkYXRhIGluIGVuZGlhbi1uZXV0cmFsCisJbGRyYgkkdDEsWyRyb3VuZHMsIzJdCUAgbWFubmVyLi4uCisJbGRyYgkkdDIsWyRyb3VuZHMsIzFdCisJbGRyYgkkdDMsWyRyb3VuZHMsIzBdCisJb3JyCSRzMCwkczAsJHQxLGxzbCM4CisJbGRyYgkkczEsWyRyb3VuZHMsIzddCisJb3JyCSRzMCwkczAsJHQyLGxzbCMxNgorCWxkcmIJJHQxLFskcm91bmRzLCM2XQorCW9ycgkkczAsJHMwLCR0Myxsc2wjMjQKKwlsZHJiCSR0MixbJHJvdW5kcywjNV0KKwlsZHJiCSR0MyxbJHJvdW5kcywjNF0KKwlvcnIJJHMxLCRzMSwkdDEsbHNsIzgKKwlsZHJiCSRzMixbJHJvdW5kcywjMTFdCisJb3JyCSRzMSwkczEsJHQyLGxzbCMxNgorCWxkcmIJJHQxLFskcm91bmRzLCMxMF0KKwlvcnIJJHMxLCRzMSwkdDMsbHNsIzI0CisJbGRyYgkkdDIsWyRyb3VuZHMsIzldCisJbGRyYgkkdDMsWyRyb3VuZHMsIzhdCisJb3JyCSRzMiwkczIsJHQxLGxzbCM4CisJbGRyYgkkczMsWyRyb3VuZHMsIzE1XQorCW9ycgkkczIsJHMyLCR0Mixsc2wjMTYKKwlsZHJiCSR0MSxbJHJvdW5kcywjMTRdCisJb3JyCSRzMiwkczIsJHQzLGxzbCMyNAorCWxkcmIJJHQyLFskcm91bmRzLCMxM10KKwlsZHJiCSR0MyxbJHJvdW5kcywjMTJdCisJb3JyCSRzMywkczMsJHQxLGxzbCM4CisJb3JyCSRzMywkczMsJHQyLGxzbCMxNgorCW9ycgkkczMsJHMzLCR0Myxsc2wjMjQKKyNlbHNlCisJbGRyCSRzMCxbJHJvdW5kcywjMF0KKwlsZHIJJHMxLFskcm91bmRzLCM0XQorCWxkcgkkczIsWyRyb3VuZHMsIzhdCisJbGRyCSRzMyxbJHJvdW5kcywjMTJdCisjaWZkZWYgX19BUk1FTF9fCisJcmV2CSRzMCwkczAKKwlyZXYJJHMxLCRzMQorCXJldgkkczIsJHMyCisJcmV2CSRzMywkczMKKyNlbmRpZgorI2VuZGlmCisJYmwJX2FybXY0X0FFU19lbmNyeXB0CisKKwlsZHIJJHJvdW5kcyxbc3BdLCM0CQlAIHBvcCBvdXQKKyNpZiBfX0FSTV9BUkNIX18+PTcKKyNpZmRlZiBfX0FSTUVMX18KKwlyZXYJJHMwLCRzMAorCXJldgkkczEsJHMxCisJcmV2CSRzMiwkczIKKwlyZXYJJHMzLCRzMworI2VuZGlmCisJc3RyCSRzMCxbJHJvdW5kcywjMF0KKwlzdHIJJHMxLFskcm91bmRzLCM0XQorCXN0cgkkczIsWyRyb3VuZHMsIzhdCisJc3RyCSRzMyxbJHJvdW5kcywjMTJdCisjZWxzZQorCW1vdgkkdDEsJHMwLGxzciMyNAkJQCB3cml0ZSBvdXRwdXQgaW4gZW5kaWFuLW5ldXRyYWwKKwltb3YJJHQyLCRzMCxsc3IjMTYJCUAgbWFubmVyLi4uCisJbW92CSR0MywkczAsbHNyIzgKKwlzdHJiCSR0MSxbJHJvdW5kcywjMF0KKwlzdHJiCSR0MixbJHJvdW5kcywjMV0KKwltb3YJJHQxLCRzMSxsc3IjMjQKKwlzdHJiCSR0MyxbJHJvdW5kcywjMl0KKwltb3YJJHQyLCRzMSxsc3IjMTYKKwlzdHJiCSRzMCxbJHJvdW5kcywjM10KKwltb3YJJHQzLCRzMSxsc3IjOAorCXN0cmIJJHQxLFskcm91bmRzLCM0XQorCXN0cmIJJHQyLFskcm91bmRzLCM1XQorCW1vdgkkdDEsJHMyLGxzciMyNAorCXN0cmIJJHQzLFskcm91bmRzLCM2XQorCW1vdgkkdDIsJHMyLGxzciMxNgorCXN0cmIJJHMxLFskcm91bmRzLCM3XQorCW1vdgkkdDMsJHMyLGxzciM4CisJc3RyYgkkdDEsWyRyb3VuZHMsIzhdCisJc3RyYgkkdDIsWyRyb3VuZHMsIzldCisJbW92CSR0MSwkczMsbHNyIzI0CisJc3RyYgkkdDMsWyRyb3VuZHMsIzEwXQorCW1vdgkkdDIsJHMzLGxzciMxNgorCXN0cmIJJHMyLFskcm91bmRzLCMxMV0KKwltb3YJJHQzLCRzMyxsc3IjOAorCXN0cmIJJHQxLFskcm91bmRzLCMxMl0KKwlzdHJiCSR0MixbJHJvdW5kcywjMTNdCisJc3RyYgkkdDMsWyRyb3VuZHMsIzE0XQorCXN0cmIJJHMzLFskcm91bmRzLCMxNV0KKyNlbmRpZgorI2lmIF9fQVJNX0FSQ0hfXz49NQorCWxkbWlhCXNwISx7cjQtcjEyLHBjfQorI2Vsc2UKKwlsZG1pYSAgIHNwISx7cjQtcjEyLGxyfQorCXRzdAlsciwjMQorCW1vdmVxCXBjLGxyCQkJQCBiZSBiaW5hcnkgY29tcGF0aWJsZSB3aXRoIFY0LCB5ZXQKKwlieAlscgkJCUAgaW50ZXJvcGVyYWJsZSB3aXRoIFRodW1iIElTQTotKQorI2VuZGlmCisuc2l6ZQlBRVNfZW5jcnlwdCwuLUFFU19lbmNyeXB0CisKKy50eXBlICAgX2FybXY0X0FFU19lbmNyeXB0LCVmdW5jdGlvbgorLmFsaWduCTIKK19hcm12NF9BRVNfZW5jcnlwdDoKKwlzdHIJbHIsW3NwLCMtNF0hCQlAIHB1c2ggbHIKKwlsZG1pYQkka2V5ISx7JHQxLSRpMX0KKwllb3IJJHMwLCRzMCwkdDEKKwlsZHIJJHJvdW5kcyxbJGtleSwjMjQwLTE2XQorCWVvcgkkczEsJHMxLCR0MgorCWVvcgkkczIsJHMyLCR0MworCWVvcgkkczMsJHMzLCRpMQorCXN1Ygkkcm91bmRzLCRyb3VuZHMsIzEKKwltb3YJbHIsIzI1NQorCisJYW5kCSRpMSxsciwkczAKKwlhbmQJJGkyLGxyLCRzMCxsc3IjOAorCWFuZAkkaTMsbHIsJHMwLGxzciMxNgorCW1vdgkkczAsJHMwLGxzciMyNAorLkxlbmNfbG9vcDoKKwlsZHIJJHQxLFskdGJsLCRpMSxsc2wjMl0JQCBUZTNbczA+PjBdCisJYW5kCSRpMSxsciwkczEsbHNyIzE2CUAgaTAKKwlsZHIJJHQyLFskdGJsLCRpMixsc2wjMl0JQCBUZTJbczA+PjhdCisJYW5kCSRpMixsciwkczEKKwlsZHIJJHQzLFskdGJsLCRpMyxsc2wjMl0JQCBUZTFbczA+PjE2XQorCWFuZAkkaTMsbHIsJHMxLGxzciM4CisJbGRyCSRzMCxbJHRibCwkczAsbHNsIzJdCUAgVGUwW3MwPj4yNF0KKwltb3YJJHMxLCRzMSxsc3IjMjQKKworCWxkcgkkaTEsWyR0YmwsJGkxLGxzbCMyXQlAIFRlMVtzMT4+MTZdCisJbGRyCSRpMixbJHRibCwkaTIsbHNsIzJdCUAgVGUzW3MxPj4wXQorCWxkcgkkaTMsWyR0YmwsJGkzLGxzbCMyXQlAIFRlMltzMT4+OF0KKwllb3IJJHMwLCRzMCwkaTEscm9yIzgKKwlsZHIJJHMxLFskdGJsLCRzMSxsc2wjMl0JQCBUZTBbczE+PjI0XQorCWFuZAkkaTEsbHIsJHMyLGxzciM4CUAgaTAKKwllb3IJJHQyLCR0MiwkaTIscm9yIzgKKwlhbmQJJGkyLGxyLCRzMixsc3IjMTYJQCBpMQorCWVvcgkkdDMsJHQzLCRpMyxyb3IjOAorCWFuZAkkaTMsbHIsJHMyCisJbGRyCSRpMSxbJHRibCwkaTEsbHNsIzJdCUAgVGUyW3MyPj44XQorCWVvcgkkczEsJHMxLCR0MSxyb3IjMjQKKwlsZHIJJGkyLFskdGJsLCRpMixsc2wjMl0JQCBUZTFbczI+PjE2XQorCW1vdgkkczIsJHMyLGxzciMyNAorCisJbGRyCSRpMyxbJHRibCwkaTMsbHNsIzJdCUAgVGUzW3MyPj4wXQorCWVvcgkkczAsJHMwLCRpMSxyb3IjMTYKKwlsZHIJJHMyLFskdGJsLCRzMixsc2wjMl0JQCBUZTBbczI+PjI0XQorCWFuZAkkaTEsbHIsJHMzCQlAIGkwCisJZW9yCSRzMSwkczEsJGkyLHJvciM4CisJYW5kCSRpMixsciwkczMsbHNyIzgJQCBpMQorCWVvcgkkdDMsJHQzLCRpMyxyb3IjMTYKKwlhbmQJJGkzLGxyLCRzMyxsc3IjMTYJQCBpMgorCWxkcgkkaTEsWyR0YmwsJGkxLGxzbCMyXQlAIFRlM1tzMz4+MF0KKwllb3IJJHMyLCRzMiwkdDIscm9yIzE2CisJbGRyCSRpMixbJHRibCwkaTIsbHNsIzJdCUAgVGUyW3MzPj44XQorCW1vdgkkczMsJHMzLGxzciMyNAorCisJbGRyCSRpMyxbJHRibCwkaTMsbHNsIzJdCUAgVGUxW3MzPj4xNl0KKwllb3IJJHMwLCRzMCwkaTEscm9yIzI0CisJbGRyCSRpMSxbJGtleV0sIzE2CisJZW9yCSRzMSwkczEsJGkyLHJvciMxNgorCWxkcgkkczMsWyR0YmwsJHMzLGxzbCMyXQlAIFRlMFtzMz4+MjRdCisJZW9yCSRzMiwkczIsJGkzLHJvciM4CisJbGRyCSR0MSxbJGtleSwjLTEyXQorCWVvcgkkczMsJHMzLCR0Myxyb3IjOAorCisJbGRyCSR0MixbJGtleSwjLThdCisJZW9yCSRzMCwkczAsJGkxCisJbGRyCSR0MyxbJGtleSwjLTRdCisJYW5kCSRpMSxsciwkczAKKwllb3IJJHMxLCRzMSwkdDEKKwlhbmQJJGkyLGxyLCRzMCxsc3IjOAorCWVvcgkkczIsJHMyLCR0MgorCWFuZAkkaTMsbHIsJHMwLGxzciMxNgorCWVvcgkkczMsJHMzLCR0MworCW1vdgkkczAsJHMwLGxzciMyNAorCisJc3Vicwkkcm91bmRzLCRyb3VuZHMsIzEKKwlibmUJLkxlbmNfbG9vcAorCisJYWRkCSR0YmwsJHRibCwjMgorCisJbGRyYgkkdDEsWyR0YmwsJGkxLGxzbCMyXQlAIFRlNFtzMD4+MF0KKwlhbmQJJGkxLGxyLCRzMSxsc3IjMTYJQCBpMAorCWxkcmIJJHQyLFskdGJsLCRpMixsc2wjMl0JQCBUZTRbczA+PjhdCisJYW5kCSRpMixsciwkczEKKwlsZHJiCSR0MyxbJHRibCwkaTMsbHNsIzJdCUAgVGU0W3MwPj4xNl0KKwlhbmQJJGkzLGxyLCRzMSxsc3IjOAorCWxkcmIJJHMwLFskdGJsLCRzMCxsc2wjMl0JQCBUZTRbczA+PjI0XQorCW1vdgkkczEsJHMxLGxzciMyNAorCisJbGRyYgkkaTEsWyR0YmwsJGkxLGxzbCMyXQlAIFRlNFtzMT4+MTZdCisJbGRyYgkkaTIsWyR0YmwsJGkyLGxzbCMyXQlAIFRlNFtzMT4+MF0KKwlsZHJiCSRpMyxbJHRibCwkaTMsbHNsIzJdCUAgVGU0W3MxPj44XQorCWVvcgkkczAsJGkxLCRzMCxsc2wjOAorCWxkcmIJJHMxLFskdGJsLCRzMSxsc2wjMl0JQCBUZTRbczE+PjI0XQorCWFuZAkkaTEsbHIsJHMyLGxzciM4CUAgaTAKKwllb3IJJHQyLCRpMiwkdDIsbHNsIzgKKwlhbmQJJGkyLGxyLCRzMixsc3IjMTYJQCBpMQorCWVvcgkkdDMsJGkzLCR0Myxsc2wjOAorCWFuZAkkaTMsbHIsJHMyCisJbGRyYgkkaTEsWyR0YmwsJGkxLGxzbCMyXQlAIFRlNFtzMj4+OF0KKwllb3IJJHMxLCR0MSwkczEsbHNsIzI0CisJbGRyYgkkaTIsWyR0YmwsJGkyLGxzbCMyXQlAIFRlNFtzMj4+MTZdCisJbW92CSRzMiwkczIsbHNyIzI0CisKKwlsZHJiCSRpMyxbJHRibCwkaTMsbHNsIzJdCUAgVGU0W3MyPj4wXQorCWVvcgkkczAsJGkxLCRzMCxsc2wjOAorCWxkcmIJJHMyLFskdGJsLCRzMixsc2wjMl0JQCBUZTRbczI+PjI0XQorCWFuZAkkaTEsbHIsJHMzCQlAIGkwCisJZW9yCSRzMSwkczEsJGkyLGxzbCMxNgorCWFuZAkkaTIsbHIsJHMzLGxzciM4CUAgaTEKKwllb3IJJHQzLCRpMywkdDMsbHNsIzgKKwlhbmQJJGkzLGxyLCRzMyxsc3IjMTYJQCBpMgorCWxkcmIJJGkxLFskdGJsLCRpMSxsc2wjMl0JQCBUZTRbczM+PjBdCisJZW9yCSRzMiwkdDIsJHMyLGxzbCMyNAorCWxkcmIJJGkyLFskdGJsLCRpMixsc2wjMl0JQCBUZTRbczM+PjhdCisJbW92CSRzMywkczMsbHNyIzI0CisKKwlsZHJiCSRpMyxbJHRibCwkaTMsbHNsIzJdCUAgVGU0W3MzPj4xNl0KKwllb3IJJHMwLCRpMSwkczAsbHNsIzgKKwlsZHIJJGkxLFska2V5LCMwXQorCWxkcmIJJHMzLFskdGJsLCRzMyxsc2wjMl0JQCBUZTRbczM+PjI0XQorCWVvcgkkczEsJHMxLCRpMixsc2wjOAorCWxkcgkkdDEsWyRrZXksIzRdCisJZW9yCSRzMiwkczIsJGkzLGxzbCMxNgorCWxkcgkkdDIsWyRrZXksIzhdCisJZW9yCSRzMywkdDMsJHMzLGxzbCMyNAorCWxkcgkkdDMsWyRrZXksIzEyXQorCisJZW9yCSRzMCwkczAsJGkxCisJZW9yCSRzMSwkczEsJHQxCisJZW9yCSRzMiwkczIsJHQyCisJZW9yCSRzMywkczMsJHQzCisKKwlzdWIJJHRibCwkdGJsLCMyCisJbGRyCXBjLFtzcF0sIzQJCUAgcG9wIGFuZCByZXR1cm4KKy5zaXplCV9hcm12NF9BRVNfZW5jcnlwdCwuLV9hcm12NF9BRVNfZW5jcnlwdAorCisuZ2xvYmFsIEFFU19zZXRfZW5jcnlwdF9rZXkKKy50eXBlICAgQUVTX3NldF9lbmNyeXB0X2tleSwlZnVuY3Rpb24KKy5hbGlnbgk1CitBRVNfc2V0X2VuY3J5cHRfa2V5OgorX2FybXY0X0FFU19zZXRfZW5jcnlwdF9rZXk6CisjaWYgX19BUk1fQVJDSF9fPDcKKwlzdWIJcjMscGMsIzgJCUAgQUVTX3NldF9lbmNyeXB0X2tleQorI2Vsc2UKKwlhZHIJcjMsQUVTX3NldF9lbmNyeXB0X2tleQorI2VuZGlmCisJdGVxCXIwLCMwCisjaWYgX19BUk1fQVJDSF9fPj03CisJaXR0CWVxCQkJQCBUaHVtYjIgdGhpbmcsIHNhbml0eSBjaGVjayBpbiBBUk0KKyNlbmRpZgorCW1vdmVxCXIwLCMtMQorCWJlcQkuTGFicnQKKwl0ZXEJcjIsIzAKKyNpZiBfX0FSTV9BUkNIX18+PTcKKwlpdHQJZXEJCQlAIFRodW1iMiB0aGluZywgc2FuaXR5IGNoZWNrIGluIEFSTQorI2VuZGlmCisJbW92ZXEJcjAsIy0xCisJYmVxCS5MYWJydAorCisJdGVxCXIxLCMxMjgKKwliZXEJLkxvaworCXRlcQlyMSwjMTkyCisJYmVxCS5Mb2sKKwl0ZXEJcjEsIzI1NgorI2lmIF9fQVJNX0FSQ0hfXz49NworCWl0dAluZQkJCUAgVGh1bWIyIHRoaW5nLCBzYW5pdHkgY2hlY2sgaW4gQVJNCisjZW5kaWYKKwltb3ZuZQlyMCwjLTEKKwlibmUJLkxhYnJ0CisKKy5Mb2s6CXN0bWRiICAgc3AhLHtyNC1yMTIsbHJ9CisJc3ViCSR0YmwscjMsI19hcm12NF9BRVNfc2V0X2VuY3J5cHRfa2V5LUFFU19UZS0xMDI0CUAgVGU0CisKKwltb3YJJHJvdW5kcyxyMAkJQCBpbnAKKwltb3YJbHIscjEJCQlAIGJpdHMKKwltb3YJJGtleSxyMgkJCUAga2V5CisKKyNpZiBfX0FSTV9BUkNIX188NworCWxkcmIJJHMwLFskcm91bmRzLCMzXQlAIGxvYWQgaW5wdXQgZGF0YSBpbiBlbmRpYW4tbmV1dHJhbAorCWxkcmIJJHQxLFskcm91bmRzLCMyXQlAIG1hbm5lci4uLgorCWxkcmIJJHQyLFskcm91bmRzLCMxXQorCWxkcmIJJHQzLFskcm91bmRzLCMwXQorCW9ycgkkczAsJHMwLCR0MSxsc2wjOAorCWxkcmIJJHMxLFskcm91bmRzLCM3XQorCW9ycgkkczAsJHMwLCR0Mixsc2wjMTYKKwlsZHJiCSR0MSxbJHJvdW5kcywjNl0KKwlvcnIJJHMwLCRzMCwkdDMsbHNsIzI0CisJbGRyYgkkdDIsWyRyb3VuZHMsIzVdCisJbGRyYgkkdDMsWyRyb3VuZHMsIzRdCisJb3JyCSRzMSwkczEsJHQxLGxzbCM4CisJbGRyYgkkczIsWyRyb3VuZHMsIzExXQorCW9ycgkkczEsJHMxLCR0Mixsc2wjMTYKKwlsZHJiCSR0MSxbJHJvdW5kcywjMTBdCisJb3JyCSRzMSwkczEsJHQzLGxzbCMyNAorCWxkcmIJJHQyLFskcm91bmRzLCM5XQorCWxkcmIJJHQzLFskcm91bmRzLCM4XQorCW9ycgkkczIsJHMyLCR0MSxsc2wjOAorCWxkcmIJJHMzLFskcm91bmRzLCMxNV0KKwlvcnIJJHMyLCRzMiwkdDIsbHNsIzE2CisJbGRyYgkkdDEsWyRyb3VuZHMsIzE0XQorCW9ycgkkczIsJHMyLCR0Myxsc2wjMjQKKwlsZHJiCSR0MixbJHJvdW5kcywjMTNdCisJbGRyYgkkdDMsWyRyb3VuZHMsIzEyXQorCW9ycgkkczMsJHMzLCR0MSxsc2wjOAorCXN0cgkkczAsWyRrZXldLCMxNgorCW9ycgkkczMsJHMzLCR0Mixsc2wjMTYKKwlzdHIJJHMxLFska2V5LCMtMTJdCisJb3JyCSRzMywkczMsJHQzLGxzbCMyNAorCXN0cgkkczIsWyRrZXksIy04XQorCXN0cgkkczMsWyRrZXksIy00XQorI2Vsc2UKKwlsZHIJJHMwLFskcm91bmRzLCMwXQorCWxkcgkkczEsWyRyb3VuZHMsIzRdCisJbGRyCSRzMixbJHJvdW5kcywjOF0KKwlsZHIJJHMzLFskcm91bmRzLCMxMl0KKyNpZmRlZiBfX0FSTUVMX18KKwlyZXYJJHMwLCRzMAorCXJldgkkczEsJHMxCisJcmV2CSRzMiwkczIKKwlyZXYJJHMzLCRzMworI2VuZGlmCisJc3RyCSRzMCxbJGtleV0sIzE2CisJc3RyCSRzMSxbJGtleSwjLTEyXQorCXN0cgkkczIsWyRrZXksIy04XQorCXN0cgkkczMsWyRrZXksIy00XQorI2VuZGlmCisKKwl0ZXEJbHIsIzEyOAorCWJuZQkuTG5vdDEyOAorCW1vdgkkcm91bmRzLCMxMAorCXN0cgkkcm91bmRzLFska2V5LCMyNDAtMTZdCisJYWRkCSR0MywkdGJsLCMyNTYJCQlAIHJjb24KKwltb3YJbHIsIzI1NQorCisuTDEyOF9sb29wOgorCWFuZAkkdDIsbHIsJHMzLGxzciMyNAorCWFuZAkkaTEsbHIsJHMzLGxzciMxNgorCWxkcmIJJHQyLFskdGJsLCR0Ml0KKwlhbmQJJGkyLGxyLCRzMyxsc3IjOAorCWxkcmIJJGkxLFskdGJsLCRpMV0KKwlhbmQJJGkzLGxyLCRzMworCWxkcmIJJGkyLFskdGJsLCRpMl0KKwlvcnIJJHQyLCR0MiwkaTEsbHNsIzI0CisJbGRyYgkkaTMsWyR0YmwsJGkzXQorCW9ycgkkdDIsJHQyLCRpMixsc2wjMTYKKwlsZHIJJHQxLFskdDNdLCM0CQkJQCByY29uW2krK10KKwlvcnIJJHQyLCR0MiwkaTMsbHNsIzgKKwllb3IJJHQyLCR0MiwkdDEKKwllb3IJJHMwLCRzMCwkdDIJCQlAIHJrWzRdPXJrWzBdXi4uLgorCWVvcgkkczEsJHMxLCRzMAkJCUAgcmtbNV09cmtbMV1ecmtbNF0KKwlzdHIJJHMwLFska2V5XSwjMTYKKwllb3IJJHMyLCRzMiwkczEJCQlAIHJrWzZdPXJrWzJdXnJrWzVdCisJc3RyCSRzMSxbJGtleSwjLTEyXQorCWVvcgkkczMsJHMzLCRzMgkJCUAgcmtbN109cmtbM11ecmtbNl0KKwlzdHIJJHMyLFska2V5LCMtOF0KKwlzdWJzCSRyb3VuZHMsJHJvdW5kcywjMQorCXN0cgkkczMsWyRrZXksIy00XQorCWJuZQkuTDEyOF9sb29wCisJc3ViCXIyLCRrZXksIzE3NgorCWIJLkxkb25lCisKKy5Mbm90MTI4OgorI2lmIF9fQVJNX0FSQ0hfXzw3CisJbGRyYgkkaTIsWyRyb3VuZHMsIzE5XQorCWxkcmIJJHQxLFskcm91bmRzLCMxOF0KKwlsZHJiCSR0MixbJHJvdW5kcywjMTddCisJbGRyYgkkdDMsWyRyb3VuZHMsIzE2XQorCW9ycgkkaTIsJGkyLCR0MSxsc2wjOAorCWxkcmIJJGkzLFskcm91bmRzLCMyM10KKwlvcnIJJGkyLCRpMiwkdDIsbHNsIzE2CisJbGRyYgkkdDEsWyRyb3VuZHMsIzIyXQorCW9ycgkkaTIsJGkyLCR0Myxsc2wjMjQKKwlsZHJiCSR0MixbJHJvdW5kcywjMjFdCisJbGRyYgkkdDMsWyRyb3VuZHMsIzIwXQorCW9ycgkkaTMsJGkzLCR0MSxsc2wjOAorCW9ycgkkaTMsJGkzLCR0Mixsc2wjMTYKKwlzdHIJJGkyLFska2V5XSwjOAorCW9ycgkkaTMsJGkzLCR0Myxsc2wjMjQKKwlzdHIJJGkzLFska2V5LCMtNF0KKyNlbHNlCisJbGRyCSRpMixbJHJvdW5kcywjMTZdCisJbGRyCSRpMyxbJHJvdW5kcywjMjBdCisjaWZkZWYgX19BUk1FTF9fCisJcmV2CSRpMiwkaTIKKwlyZXYJJGkzLCRpMworI2VuZGlmCisJc3RyCSRpMixbJGtleV0sIzgKKwlzdHIJJGkzLFska2V5LCMtNF0KKyNlbmRpZgorCisJdGVxCWxyLCMxOTIKKwlibmUJLkxub3QxOTIKKwltb3YJJHJvdW5kcywjMTIKKwlzdHIJJHJvdW5kcyxbJGtleSwjMjQwLTI0XQorCWFkZAkkdDMsJHRibCwjMjU2CQkJQCByY29uCisJbW92CWxyLCMyNTUKKwltb3YJJHJvdW5kcywjOAorCisuTDE5Ml9sb29wOgorCWFuZAkkdDIsbHIsJGkzLGxzciMyNAorCWFuZAkkaTEsbHIsJGkzLGxzciMxNgorCWxkcmIJJHQyLFskdGJsLCR0Ml0KKwlhbmQJJGkyLGxyLCRpMyxsc3IjOAorCWxkcmIJJGkxLFskdGJsLCRpMV0KKwlhbmQJJGkzLGxyLCRpMworCWxkcmIJJGkyLFskdGJsLCRpMl0KKwlvcnIJJHQyLCR0MiwkaTEsbHNsIzI0CisJbGRyYgkkaTMsWyR0YmwsJGkzXQorCW9ycgkkdDIsJHQyLCRpMixsc2wjMTYKKwlsZHIJJHQxLFskdDNdLCM0CQkJQCByY29uW2krK10KKwlvcnIJJHQyLCR0MiwkaTMsbHNsIzgKKwllb3IJJGkzLCR0MiwkdDEKKwllb3IJJHMwLCRzMCwkaTMJCQlAIHJrWzZdPXJrWzBdXi4uLgorCWVvcgkkczEsJHMxLCRzMAkJCUAgcmtbN109cmtbMV1ecmtbNl0KKwlzdHIJJHMwLFska2V5XSwjMjQKKwllb3IJJHMyLCRzMiwkczEJCQlAIHJrWzhdPXJrWzJdXnJrWzddCisJc3RyCSRzMSxbJGtleSwjLTIwXQorCWVvcgkkczMsJHMzLCRzMgkJCUAgcmtbOV09cmtbM11ecmtbOF0KKwlzdHIJJHMyLFska2V5LCMtMTZdCisJc3Vicwkkcm91bmRzLCRyb3VuZHMsIzEKKwlzdHIJJHMzLFska2V5LCMtMTJdCisjaWYgX19BUk1fQVJDSF9fPj03CisJaXR0CWVxCQkJCUAgVGh1bWIyIHRoaW5nLCBzYW5pdHkgY2hlY2sgaW4gQVJNCisjZW5kaWYKKwlzdWJlcQlyMiwka2V5LCMyMTYKKwliZXEJLkxkb25lCisKKwlsZHIJJGkxLFska2V5LCMtMzJdCisJbGRyCSRpMixbJGtleSwjLTI4XQorCWVvcgkkaTEsJGkxLCRzMwkJCUAgcmtbMTBdPXJrWzRdXnJrWzldCisJZW9yCSRpMywkaTIsJGkxCQkJQCBya1sxMV09cmtbNV1ecmtbMTBdCisJc3RyCSRpMSxbJGtleSwjLThdCisJc3RyCSRpMyxbJGtleSwjLTRdCisJYgkuTDE5Ml9sb29wCisKKy5Mbm90MTkyOgorI2lmIF9fQVJNX0FSQ0hfXzw3CisJbGRyYgkkaTIsWyRyb3VuZHMsIzI3XQorCWxkcmIJJHQxLFskcm91bmRzLCMyNl0KKwlsZHJiCSR0MixbJHJvdW5kcywjMjVdCisJbGRyYgkkdDMsWyRyb3VuZHMsIzI0XQorCW9ycgkkaTIsJGkyLCR0MSxsc2wjOAorCWxkcmIJJGkzLFskcm91bmRzLCMzMV0KKwlvcnIJJGkyLCRpMiwkdDIsbHNsIzE2CisJbGRyYgkkdDEsWyRyb3VuZHMsIzMwXQorCW9ycgkkaTIsJGkyLCR0Myxsc2wjMjQKKwlsZHJiCSR0MixbJHJvdW5kcywjMjldCisJbGRyYgkkdDMsWyRyb3VuZHMsIzI4XQorCW9ycgkkaTMsJGkzLCR0MSxsc2wjOAorCW9ycgkkaTMsJGkzLCR0Mixsc2wjMTYKKwlzdHIJJGkyLFska2V5XSwjOAorCW9ycgkkaTMsJGkzLCR0Myxsc2wjMjQKKwlzdHIJJGkzLFska2V5LCMtNF0KKyNlbHNlCisJbGRyCSRpMixbJHJvdW5kcywjMjRdCisJbGRyCSRpMyxbJHJvdW5kcywjMjhdCisjaWZkZWYgX19BUk1FTF9fCisJcmV2CSRpMiwkaTIKKwlyZXYJJGkzLCRpMworI2VuZGlmCisJc3RyCSRpMixbJGtleV0sIzgKKwlzdHIJJGkzLFska2V5LCMtNF0KKyNlbmRpZgorCisJbW92CSRyb3VuZHMsIzE0CisJc3RyCSRyb3VuZHMsWyRrZXksIzI0MC0zMl0KKwlhZGQJJHQzLCR0YmwsIzI1NgkJCUAgcmNvbgorCW1vdglsciwjMjU1CisJbW92CSRyb3VuZHMsIzcKKworLkwyNTZfbG9vcDoKKwlhbmQJJHQyLGxyLCRpMyxsc3IjMjQKKwlhbmQJJGkxLGxyLCRpMyxsc3IjMTYKKwlsZHJiCSR0MixbJHRibCwkdDJdCisJYW5kCSRpMixsciwkaTMsbHNyIzgKKwlsZHJiCSRpMSxbJHRibCwkaTFdCisJYW5kCSRpMyxsciwkaTMKKwlsZHJiCSRpMixbJHRibCwkaTJdCisJb3JyCSR0MiwkdDIsJGkxLGxzbCMyNAorCWxkcmIJJGkzLFskdGJsLCRpM10KKwlvcnIJJHQyLCR0MiwkaTIsbHNsIzE2CisJbGRyCSR0MSxbJHQzXSwjNAkJCUAgcmNvbltpKytdCisJb3JyCSR0MiwkdDIsJGkzLGxzbCM4CisJZW9yCSRpMywkdDIsJHQxCisJZW9yCSRzMCwkczAsJGkzCQkJQCBya1s4XT1ya1swXV4uLi4KKwllb3IJJHMxLCRzMSwkczAJCQlAIHJrWzldPXJrWzFdXnJrWzhdCisJc3RyCSRzMCxbJGtleV0sIzMyCisJZW9yCSRzMiwkczIsJHMxCQkJQCBya1sxMF09cmtbMl1ecmtbOV0KKwlzdHIJJHMxLFska2V5LCMtMjhdCisJZW9yCSRzMywkczMsJHMyCQkJQCBya1sxMV09cmtbM11ecmtbMTBdCisJc3RyCSRzMixbJGtleSwjLTI0XQorCXN1YnMJJHJvdW5kcywkcm91bmRzLCMxCisJc3RyCSRzMyxbJGtleSwjLTIwXQorI2lmIF9fQVJNX0FSQ0hfXz49NworCWl0dAllcQkJCQlAIFRodW1iMiB0aGluZywgc2FuaXR5IGNoZWNrIGluIEFSTQorI2VuZGlmCisJc3ViZXEJcjIsJGtleSwjMjU2CisJYmVxCS5MZG9uZQorCisJYW5kCSR0MixsciwkczMKKwlhbmQJJGkxLGxyLCRzMyxsc3IjOAorCWxkcmIJJHQyLFskdGJsLCR0Ml0KKwlhbmQJJGkyLGxyLCRzMyxsc3IjMTYKKwlsZHJiCSRpMSxbJHRibCwkaTFdCisJYW5kCSRpMyxsciwkczMsbHNyIzI0CisJbGRyYgkkaTIsWyR0YmwsJGkyXQorCW9ycgkkdDIsJHQyLCRpMSxsc2wjOAorCWxkcmIJJGkzLFskdGJsLCRpM10KKwlvcnIJJHQyLCR0MiwkaTIsbHNsIzE2CisJbGRyCSR0MSxbJGtleSwjLTQ4XQorCW9ycgkkdDIsJHQyLCRpMyxsc2wjMjQKKworCWxkcgkkaTEsWyRrZXksIy00NF0KKwlsZHIJJGkyLFska2V5LCMtNDBdCisJZW9yCSR0MSwkdDEsJHQyCQkJQCBya1sxMl09cmtbNF1eLi4uCisJbGRyCSRpMyxbJGtleSwjLTM2XQorCWVvcgkkaTEsJGkxLCR0MQkJCUAgcmtbMTNdPXJrWzVdXnJrWzEyXQorCXN0cgkkdDEsWyRrZXksIy0xNl0KKwllb3IJJGkyLCRpMiwkaTEJCQlAIHJrWzE0XT1ya1s2XV5ya1sxM10KKwlzdHIJJGkxLFska2V5LCMtMTJdCisJZW9yCSRpMywkaTMsJGkyCQkJQCBya1sxNV09cmtbN11ecmtbMTRdCisJc3RyCSRpMixbJGtleSwjLThdCisJc3RyCSRpMyxbJGtleSwjLTRdCisJYgkuTDI1Nl9sb29wCisKKy5hbGlnbgkyCisuTGRvbmU6CW1vdglyMCwjMAorCWxkbWlhICAgc3AhLHtyNC1yMTIsbHJ9CisuTGFicnQ6CisjaWYgZGVmaW5lZChfX3RodW1iMl9fKSAmJiBfX0FSTV9BUkNIX18+PTcKKwkuc2hvcnQJMHg0NzcwCQkJQCBieCBsciBpbiBUaHVtYjIgZW5jb2RpbmcKKyNlbHNlCisJdHN0CWxyLCMxCisJbW92ZXEJcGMsbHIJCQlAIGJlIGJpbmFyeSBjb21wYXRpYmxlIHdpdGggVjQsIHlldAorCWJ4CWxyCQkJQCBpbnRlcm9wZXJhYmxlIHdpdGggVGh1bWIgSVNBOi0pCisjZW5kaWYKKy5zaXplCUFFU19zZXRfZW5jcnlwdF9rZXksLi1BRVNfc2V0X2VuY3J5cHRfa2V5CisKKy5nbG9iYWwgQUVTX3NldF9kZWNyeXB0X2tleQorLnR5cGUgICBBRVNfc2V0X2RlY3J5cHRfa2V5LCVmdW5jdGlvbgorLmFsaWduCTUKK0FFU19zZXRfZGVjcnlwdF9rZXk6CisJc3RyCWxyLFtzcCwjLTRdISAgICAgICAgICAgIEAgcHVzaCBscgorCWJsCV9hcm12NF9BRVNfc2V0X2VuY3J5cHRfa2V5CisJdGVxCXIwLCMwCisJbGRyCWxyLFtzcF0sIzQgICAgICAgICAgICAgIEAgcG9wIGxyCisJYm5lCS5MYWJydAorCisJbW92CXIwLHIyCQkJQCBBRVNfc2V0X2VuY3J5cHRfa2V5IHByZXNlcnZlcyByMiwKKwltb3YJcjEscjIJCQlAIHdoaWNoIGlzIEFFU19LRVkgKmtleQorCWIJX2FybXY0X0FFU19zZXRfZW5jMmRlY19rZXkKKy5zaXplCUFFU19zZXRfZGVjcnlwdF9rZXksLi1BRVNfc2V0X2RlY3J5cHRfa2V5CisKK0Agdm9pZCBBRVNfc2V0X2VuYzJkZWNfa2V5KGNvbnN0IEFFU19LRVkgKmlucCxBRVNfS0VZICpvdXQpCisuZ2xvYmFsCUFFU19zZXRfZW5jMmRlY19rZXkKKy50eXBlCUFFU19zZXRfZW5jMmRlY19rZXksJWZ1bmN0aW9uCisuYWxpZ24JNQorQUVTX3NldF9lbmMyZGVjX2tleToKK19hcm12NF9BRVNfc2V0X2VuYzJkZWNfa2V5OgorCXN0bWRiICAgc3AhLHtyNC1yMTIsbHJ9CisKKwlsZHIJJHJvdW5kcyxbcjAsIzI0MF0KKwltb3YJJGkxLHIwCQkJQCBpbnB1dAorCWFkZAkkaTIscjAsJHJvdW5kcyxsc2wjNAorCW1vdgkka2V5LHIxCQkJQCBvdXB1dAorCWFkZAkkdGJsLHIxLCRyb3VuZHMsbHNsIzQKKwlzdHIJJHJvdW5kcyxbcjEsIzI0MF0KKworLkxpbnY6CWxkcgkkczAsWyRpMV0sIzE2CisJbGRyCSRzMSxbJGkxLCMtMTJdCisJbGRyCSRzMixbJGkxLCMtOF0KKwlsZHIJJHMzLFskaTEsIy00XQorCWxkcgkkdDEsWyRpMl0sIy0xNgorCWxkcgkkdDIsWyRpMiwjMTYrNF0KKwlsZHIJJHQzLFskaTIsIzE2KzhdCisJbGRyCSRpMyxbJGkyLCMxNisxMl0KKwlzdHIJJHMwLFskdGJsXSwjLTE2CisJc3RyCSRzMSxbJHRibCwjMTYrNF0KKwlzdHIJJHMyLFskdGJsLCMxNis4XQorCXN0cgkkczMsWyR0YmwsIzE2KzEyXQorCXN0cgkkdDEsWyRrZXldLCMxNgorCXN0cgkkdDIsWyRrZXksIy0xMl0KKwlzdHIJJHQzLFska2V5LCMtOF0KKwlzdHIJJGkzLFska2V5LCMtNF0KKwl0ZXEJJGkxLCRpMgorCWJuZQkuTGludgorCisJbGRyCSRzMCxbJGkxXQorCWxkcgkkczEsWyRpMSwjNF0KKwlsZHIJJHMyLFskaTEsIzhdCisJbGRyCSRzMyxbJGkxLCMxMl0KKwlzdHIJJHMwLFska2V5XQorCXN0cgkkczEsWyRrZXksIzRdCisJc3RyCSRzMixbJGtleSwjOF0KKwlzdHIJJHMzLFska2V5LCMxMl0KKwlzdWIJJGtleSwka2V5LCRyb3VuZHMsbHNsIzMKK19fXworJG1hc2s4MD0kaTE7CiskbWFzazFiPSRpMjsKKyRtYXNrN2Y9JGkzOworJGNvZGUuPTw8X19fOworCWxkcgkkczAsWyRrZXksIzE2XSEJCUAgcHJlZmV0Y2ggdHAxCisJbW92CSRtYXNrODAsIzB4ODAKKwltb3YJJG1hc2sxYiwjMHgxYgorCW9ycgkkbWFzazgwLCRtYXNrODAsIzB4ODAwMAorCW9ycgkkbWFzazFiLCRtYXNrMWIsIzB4MWIwMAorCW9ycgkkbWFzazgwLCRtYXNrODAsJG1hc2s4MCxsc2wjMTYKKwlvcnIJJG1hc2sxYiwkbWFzazFiLCRtYXNrMWIsbHNsIzE2CisJc3ViCSRyb3VuZHMsJHJvdW5kcywjMQorCW12bgkkbWFzazdmLCRtYXNrODAKKwltb3YJJHJvdW5kcywkcm91bmRzLGxzbCMyCUAgKHJvdW5kcy0xKSo0CisKKy5MbWl4OglhbmQJJHQxLCRzMCwkbWFzazgwCisJYW5kCSRzMSwkczAsJG1hc2s3ZgorCXN1YgkkdDEsJHQxLCR0MSxsc3IjNworCWFuZAkkdDEsJHQxLCRtYXNrMWIKKwllb3IJJHMxLCR0MSwkczEsbHNsIzEJQCB0cDIKKworCWFuZAkkdDEsJHMxLCRtYXNrODAKKwlhbmQJJHMyLCRzMSwkbWFzazdmCisJc3ViCSR0MSwkdDEsJHQxLGxzciM3CisJYW5kCSR0MSwkdDEsJG1hc2sxYgorCWVvcgkkczIsJHQxLCRzMixsc2wjMQlAIHRwNAorCisJYW5kCSR0MSwkczIsJG1hc2s4MAorCWFuZAkkczMsJHMyLCRtYXNrN2YKKwlzdWIJJHQxLCR0MSwkdDEsbHNyIzcKKwlhbmQJJHQxLCR0MSwkbWFzazFiCisJZW9yCSRzMywkdDEsJHMzLGxzbCMxCUAgdHA4CisKKwllb3IJJHQxLCRzMSwkczIKKwllb3IJJHQyLCRzMCwkczMJCUAgdHA5CisJZW9yCSR0MSwkdDEsJHMzCQlAIHRwZQorCWVvcgkkdDEsJHQxLCRzMSxyb3IjMjQKKwllb3IJJHQxLCR0MSwkdDIscm9yIzI0CUAgXj0gUk9UQVRFKHRwYj10cDledHAyLDgpCisJZW9yCSR0MSwkdDEsJHMyLHJvciMxNgorCWVvcgkkdDEsJHQxLCR0Mixyb3IjMTYJQCBePSBST1RBVEUodHBkPXRwOV50cDQsMTYpCisJZW9yCSR0MSwkdDEsJHQyLHJvciM4CUAgXj0gUk9UQVRFKHRwOSwyNCkKKworCWxkcgkkczAsWyRrZXksIzRdCQlAIHByZWZldGNoIHRwMQorCXN0cgkkdDEsWyRrZXldLCM0CisJc3Vicwkkcm91bmRzLCRyb3VuZHMsIzEKKwlibmUJLkxtaXgKKworCW1vdglyMCwjMAorI2lmIF9fQVJNX0FSQ0hfXz49NQorCWxkbWlhCXNwISx7cjQtcjEyLHBjfQorI2Vsc2UKKwlsZG1pYSAgIHNwISx7cjQtcjEyLGxyfQorCXRzdAlsciwjMQorCW1vdmVxCXBjLGxyCQkJQCBiZSBiaW5hcnkgY29tcGF0aWJsZSB3aXRoIFY0LCB5ZXQKKwlieAlscgkJCUAgaW50ZXJvcGVyYWJsZSB3aXRoIFRodW1iIElTQTotKQorI2VuZGlmCisuc2l6ZQlBRVNfc2V0X2VuYzJkZWNfa2V5LC4tQUVTX3NldF9lbmMyZGVjX2tleQorCisudHlwZQlBRVNfVGQsJW9iamVjdAorLmFsaWduCTUKK0FFU19UZDoKKy53b3JkCTB4NTFmNGE3NTAsIDB4N2U0MTY1NTMsIDB4MWExN2E0YzMsIDB4M2EyNzVlOTYKKy53b3JkCTB4M2JhYjZiY2IsIDB4MWY5ZDQ1ZjEsIDB4YWNmYTU4YWIsIDB4NGJlMzAzOTMKKy53b3JkCTB4MjAzMGZhNTUsIDB4YWQ3NjZkZjYsIDB4ODhjYzc2OTEsIDB4ZjUwMjRjMjUKKy53b3JkCTB4NGZlNWQ3ZmMsIDB4YzUyYWNiZDcsIDB4MjYzNTQ0ODAsIDB4YjU2MmEzOGYKKy53b3JkCTB4ZGViMTVhNDksIDB4MjViYTFiNjcsIDB4NDVlYTBlOTgsIDB4NWRmZWMwZTEKKy53b3JkCTB4YzMyZjc1MDIsIDB4ODE0Y2YwMTIsIDB4OGQ0Njk3YTMsIDB4NmJkM2Y5YzYKKy53b3JkCTB4MDM4ZjVmZTcsIDB4MTU5MjljOTUsIDB4YmY2ZDdhZWIsIDB4OTU1MjU5ZGEKKy53b3JkCTB4ZDRiZTgzMmQsIDB4NTg3NDIxZDMsIDB4NDllMDY5MjksIDB4OGVjOWM4NDQKKy53b3JkCTB4NzVjMjg5NmEsIDB4ZjQ4ZTc5NzgsIDB4OTk1ODNlNmIsIDB4MjdiOTcxZGQKKy53b3JkCTB4YmVlMTRmYjYsIDB4ZjA4OGFkMTcsIDB4YzkyMGFjNjYsIDB4N2RjZTNhYjQKKy53b3JkCTB4NjNkZjRhMTgsIDB4ZTUxYTMxODIsIDB4OTc1MTMzNjAsIDB4NjI1MzdmNDUKKy53b3JkCTB4YjE2NDc3ZTAsIDB4YmI2YmFlODQsIDB4ZmU4MWEwMWMsIDB4ZjkwODJiOTQKKy53b3JkCTB4NzA0ODY4NTgsIDB4OGY0NWZkMTksIDB4OTRkZTZjODcsIDB4NTI3YmY4YjcKKy53b3JkCTB4YWI3M2QzMjMsIDB4NzI0YjAyZTIsIDB4ZTMxZjhmNTcsIDB4NjY1NWFiMmEKKy53b3JkCTB4YjJlYjI4MDcsIDB4MmZiNWMyMDMsIDB4ODZjNTdiOWEsIDB4ZDMzNzA4YTUKKy53b3JkCTB4MzAyODg3ZjIsIDB4MjNiZmE1YjIsIDB4MDIwMzZhYmEsIDB4ZWQxNjgyNWMKKy53b3JkCTB4OGFjZjFjMmIsIDB4YTc3OWI0OTIsIDB4ZjMwN2YyZjAsIDB4NGU2OWUyYTEKKy53b3JkCTB4NjVkYWY0Y2QsIDB4MDYwNWJlZDUsIDB4ZDEzNDYyMWYsIDB4YzRhNmZlOGEKKy53b3JkCTB4MzQyZTUzOWQsIDB4YTJmMzU1YTAsIDB4MDU4YWUxMzIsIDB4YTRmNmViNzUKKy53b3JkCTB4MGI4M2VjMzksIDB4NDA2MGVmYWEsIDB4NWU3MTlmMDYsIDB4YmQ2ZTEwNTEKKy53b3JkCTB4M2UyMThhZjksIDB4OTZkZDA2M2QsIDB4ZGQzZTA1YWUsIDB4NGRlNmJkNDYKKy53b3JkCTB4OTE1NDhkYjUsIDB4NzFjNDVkMDUsIDB4MDQwNmQ0NmYsIDB4NjA1MDE1ZmYKKy53b3JkCTB4MTk5OGZiMjQsIDB4ZDZiZGU5OTcsIDB4ODk0MDQzY2MsIDB4NjdkOTllNzcKKy53b3JkCTB4YjBlODQyYmQsIDB4MDc4OThiODgsIDB4ZTcxOTViMzgsIDB4NzljOGVlZGIKKy53b3JkCTB4YTE3YzBhNDcsIDB4N2M0MjBmZTksIDB4Zjg4NDFlYzksIDB4MDAwMDAwMDAKKy53b3JkCTB4MDk4MDg2ODMsIDB4MzIyYmVkNDgsIDB4MWUxMTcwYWMsIDB4NmM1YTcyNGUKKy53b3JkCTB4ZmQwZWZmZmIsIDB4MGY4NTM4NTYsIDB4M2RhZWQ1MWUsIDB4MzYyZDM5MjcKKy53b3JkCTB4MGEwZmQ5NjQsIDB4Njg1Y2E2MjEsIDB4OWI1YjU0ZDEsIDB4MjQzNjJlM2EKKy53b3JkCTB4MGMwYTY3YjEsIDB4OTM1N2U3MGYsIDB4YjRlZTk2ZDIsIDB4MWI5YjkxOWUKKy53b3JkCTB4ODBjMGM1NGYsIDB4NjFkYzIwYTIsIDB4NWE3NzRiNjksIDB4MWMxMjFhMTYKKy53b3JkCTB4ZTI5M2JhMGEsIDB4YzBhMDJhZTUsIDB4M2MyMmUwNDMsIDB4MTIxYjE3MWQKKy53b3JkCTB4MGUwOTBkMGIsIDB4ZjI4YmM3YWQsIDB4MmRiNmE4YjksIDB4MTQxZWE5YzgKKy53b3JkCTB4NTdmMTE5ODUsIDB4YWY3NTA3NGMsIDB4ZWU5OWRkYmIsIDB4YTM3ZjYwZmQKKy53b3JkCTB4ZjcwMTI2OWYsIDB4NWM3MmY1YmMsIDB4NDQ2NjNiYzUsIDB4NWJmYjdlMzQKKy53b3JkCTB4OGI0MzI5NzYsIDB4Y2IyM2M2ZGMsIDB4YjZlZGZjNjgsIDB4YjhlNGYxNjMKKy53b3JkCTB4ZDczMWRjY2EsIDB4NDI2Mzg1MTAsIDB4MTM5NzIyNDAsIDB4ODRjNjExMjAKKy53b3JkCTB4ODU0YTI0N2QsIDB4ZDJiYjNkZjgsIDB4YWVmOTMyMTEsIDB4YzcyOWExNmQKKy53b3JkCTB4MWQ5ZTJmNGIsIDB4ZGNiMjMwZjMsIDB4MGQ4NjUyZWMsIDB4NzdjMWUzZDAKKy53b3JkCTB4MmJiMzE2NmMsIDB4YTk3MGI5OTksIDB4MTE5NDQ4ZmEsIDB4NDdlOTY0MjIKKy53b3JkCTB4YThmYzhjYzQsIDB4YTBmMDNmMWEsIDB4NTY3ZDJjZDgsIDB4MjIzMzkwZWYKKy53b3JkCTB4ODc0OTRlYzcsIDB4ZDkzOGQxYzEsIDB4OGNjYWEyZmUsIDB4OThkNDBiMzYKKy53b3JkCTB4YTZmNTgxY2YsIDB4YTU3YWRlMjgsIDB4ZGFiNzhlMjYsIDB4M2ZhZGJmYTQKKy53b3JkCTB4MmMzYTlkZTQsIDB4NTA3ODkyMGQsIDB4NmE1ZmNjOWIsIDB4NTQ3ZTQ2NjIKKy53b3JkCTB4ZjY4ZDEzYzIsIDB4OTBkOGI4ZTgsIDB4MmUzOWY3NWUsIDB4ODJjM2FmZjUKKy53b3JkCTB4OWY1ZDgwYmUsIDB4NjlkMDkzN2MsIDB4NmZkNTJkYTksIDB4Y2YyNTEyYjMKKy53b3JkCTB4YzhhYzk5M2IsIDB4MTAxODdkYTcsIDB4ZTg5YzYzNmUsIDB4ZGIzYmJiN2IKKy53b3JkCTB4Y2QyNjc4MDksIDB4NmU1OTE4ZjQsIDB4ZWM5YWI3MDEsIDB4ODM0ZjlhYTgKKy53b3JkCTB4ZTY5NTZlNjUsIDB4YWFmZmU2N2UsIDB4MjFiY2NmMDgsIDB4ZWYxNWU4ZTYKKy53b3JkCTB4YmFlNzliZDksIDB4NGE2ZjM2Y2UsIDB4ZWE5ZjA5ZDQsIDB4MjliMDdjZDYKKy53b3JkCTB4MzFhNGIyYWYsIDB4MmEzZjIzMzEsIDB4YzZhNTk0MzAsIDB4MzVhMjY2YzAKKy53b3JkCTB4NzQ0ZWJjMzcsIDB4ZmM4MmNhYTYsIDB4ZTA5MGQwYjAsIDB4MzNhN2Q4MTUKKy53b3JkCTB4ZjEwNDk4NGEsIDB4NDFlY2RhZjcsIDB4N2ZjZDUwMGUsIDB4MTc5MWY2MmYKKy53b3JkCTB4NzY0ZGQ2OGQsIDB4NDNlZmIwNGQsIDB4Y2NhYTRkNTQsIDB4ZTQ5NjA0ZGYKKy53b3JkCTB4OWVkMWI1ZTMsIDB4NGM2YTg4MWIsIDB4YzEyYzFmYjgsIDB4NDY2NTUxN2YKKy53b3JkCTB4OWQ1ZWVhMDQsIDB4MDE4YzM1NWQsIDB4ZmE4Nzc0NzMsIDB4ZmIwYjQxMmUKKy53b3JkCTB4YjM2NzFkNWEsIDB4OTJkYmQyNTIsIDB4ZTkxMDU2MzMsIDB4NmRkNjQ3MTMKKy53b3JkCTB4OWFkNzYxOGMsIDB4MzdhMTBjN2EsIDB4NTlmODE0OGUsIDB4ZWIxMzNjODkKKy53b3JkCTB4Y2VhOTI3ZWUsIDB4Yjc2MWM5MzUsIDB4ZTExY2U1ZWQsIDB4N2E0N2IxM2MKKy53b3JkCTB4OWNkMmRmNTksIDB4NTVmMjczM2YsIDB4MTgxNGNlNzksIDB4NzNjNzM3YmYKKy53b3JkCTB4NTNmN2NkZWEsIDB4NWZmZGFhNWIsIDB4ZGYzZDZmMTQsIDB4Nzg0NGRiODYKKy53b3JkCTB4Y2FhZmYzODEsIDB4Yjk2OGM0M2UsIDB4MzgyNDM0MmMsIDB4YzJhMzQwNWYKKy53b3JkCTB4MTYxZGMzNzIsIDB4YmNlMjI1MGMsIDB4MjgzYzQ5OGIsIDB4ZmYwZDk1NDEKKy53b3JkCTB4MzlhODAxNzEsIDB4MDgwY2IzZGUsIDB4ZDhiNGU0OWMsIDB4NjQ1NmMxOTAKKy53b3JkCTB4N2JjYjg0NjEsIDB4ZDUzMmI2NzAsIDB4NDg2YzVjNzQsIDB4ZDBiODU3NDIKK0AgVGQ0WzI1Nl0KKy5ieXRlCTB4NTIsIDB4MDksIDB4NmEsIDB4ZDUsIDB4MzAsIDB4MzYsIDB4YTUsIDB4MzgKKy5ieXRlCTB4YmYsIDB4NDAsIDB4YTMsIDB4OWUsIDB4ODEsIDB4ZjMsIDB4ZDcsIDB4ZmIKKy5ieXRlCTB4N2MsIDB4ZTMsIDB4MzksIDB4ODIsIDB4OWIsIDB4MmYsIDB4ZmYsIDB4ODcKKy5ieXRlCTB4MzQsIDB4OGUsIDB4NDMsIDB4NDQsIDB4YzQsIDB4ZGUsIDB4ZTksIDB4Y2IKKy5ieXRlCTB4NTQsIDB4N2IsIDB4OTQsIDB4MzIsIDB4YTYsIDB4YzIsIDB4MjMsIDB4M2QKKy5ieXRlCTB4ZWUsIDB4NGMsIDB4OTUsIDB4MGIsIDB4NDIsIDB4ZmEsIDB4YzMsIDB4NGUKKy5ieXRlCTB4MDgsIDB4MmUsIDB4YTEsIDB4NjYsIDB4MjgsIDB4ZDksIDB4MjQsIDB4YjIKKy5ieXRlCTB4NzYsIDB4NWIsIDB4YTIsIDB4NDksIDB4NmQsIDB4OGIsIDB4ZDEsIDB4MjUKKy5ieXRlCTB4NzIsIDB4ZjgsIDB4ZjYsIDB4NjQsIDB4ODYsIDB4NjgsIDB4OTgsIDB4MTYKKy5ieXRlCTB4ZDQsIDB4YTQsIDB4NWMsIDB4Y2MsIDB4NWQsIDB4NjUsIDB4YjYsIDB4OTIKKy5ieXRlCTB4NmMsIDB4NzAsIDB4NDgsIDB4NTAsIDB4ZmQsIDB4ZWQsIDB4YjksIDB4ZGEKKy5ieXRlCTB4NWUsIDB4MTUsIDB4NDYsIDB4NTcsIDB4YTcsIDB4OGQsIDB4OWQsIDB4ODQKKy5ieXRlCTB4OTAsIDB4ZDgsIDB4YWIsIDB4MDAsIDB4OGMsIDB4YmMsIDB4ZDMsIDB4MGEKKy5ieXRlCTB4ZjcsIDB4ZTQsIDB4NTgsIDB4MDUsIDB4YjgsIDB4YjMsIDB4NDUsIDB4MDYKKy5ieXRlCTB4ZDAsIDB4MmMsIDB4MWUsIDB4OGYsIDB4Y2EsIDB4M2YsIDB4MGYsIDB4MDIKKy5ieXRlCTB4YzEsIDB4YWYsIDB4YmQsIDB4MDMsIDB4MDEsIDB4MTMsIDB4OGEsIDB4NmIKKy5ieXRlCTB4M2EsIDB4OTEsIDB4MTEsIDB4NDEsIDB4NGYsIDB4NjcsIDB4ZGMsIDB4ZWEKKy5ieXRlCTB4OTcsIDB4ZjIsIDB4Y2YsIDB4Y2UsIDB4ZjAsIDB4YjQsIDB4ZTYsIDB4NzMKKy5ieXRlCTB4OTYsIDB4YWMsIDB4NzQsIDB4MjIsIDB4ZTcsIDB4YWQsIDB4MzUsIDB4ODUKKy5ieXRlCTB4ZTIsIDB4ZjksIDB4MzcsIDB4ZTgsIDB4MWMsIDB4NzUsIDB4ZGYsIDB4NmUKKy5ieXRlCTB4NDcsIDB4ZjEsIDB4MWEsIDB4NzEsIDB4MWQsIDB4MjksIDB4YzUsIDB4ODkKKy5ieXRlCTB4NmYsIDB4YjcsIDB4NjIsIDB4MGUsIDB4YWEsIDB4MTgsIDB4YmUsIDB4MWIKKy5ieXRlCTB4ZmMsIDB4NTYsIDB4M2UsIDB4NGIsIDB4YzYsIDB4ZDIsIDB4NzksIDB4MjAKKy5ieXRlCTB4OWEsIDB4ZGIsIDB4YzAsIDB4ZmUsIDB4NzgsIDB4Y2QsIDB4NWEsIDB4ZjQKKy5ieXRlCTB4MWYsIDB4ZGQsIDB4YTgsIDB4MzMsIDB4ODgsIDB4MDcsIDB4YzcsIDB4MzEKKy5ieXRlCTB4YjEsIDB4MTIsIDB4MTAsIDB4NTksIDB4MjcsIDB4ODAsIDB4ZWMsIDB4NWYKKy5ieXRlCTB4NjAsIDB4NTEsIDB4N2YsIDB4YTksIDB4MTksIDB4YjUsIDB4NGEsIDB4MGQKKy5ieXRlCTB4MmQsIDB4ZTUsIDB4N2EsIDB4OWYsIDB4OTMsIDB4YzksIDB4OWMsIDB4ZWYKKy5ieXRlCTB4YTAsIDB4ZTAsIDB4M2IsIDB4NGQsIDB4YWUsIDB4MmEsIDB4ZjUsIDB4YjAKKy5ieXRlCTB4YzgsIDB4ZWIsIDB4YmIsIDB4M2MsIDB4ODMsIDB4NTMsIDB4OTksIDB4NjEKKy5ieXRlCTB4MTcsIDB4MmIsIDB4MDQsIDB4N2UsIDB4YmEsIDB4NzcsIDB4ZDYsIDB4MjYKKy5ieXRlCTB4ZTEsIDB4NjksIDB4MTQsIDB4NjMsIDB4NTUsIDB4MjEsIDB4MGMsIDB4N2QKKy5zaXplCUFFU19UZCwuLUFFU19UZAorCitAIHZvaWQgQUVTX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKK0AgCQkgY29uc3QgQUVTX0tFWSAqa2V5KSB7CisuZ2xvYmFsIEFFU19kZWNyeXB0CisudHlwZSAgIEFFU19kZWNyeXB0LCVmdW5jdGlvbgorLmFsaWduCTUKK0FFU19kZWNyeXB0OgorI2lmIF9fQVJNX0FSQ0hfXzw3CisJc3ViCXIzLHBjLCM4CQlAIEFFU19kZWNyeXB0CisjZWxzZQorCWFkcglyMyxBRVNfZGVjcnlwdAorI2VuZGlmCisJc3RtZGIgICBzcCEse3IxLHI0LXIxMixscn0KKwltb3YJJHJvdW5kcyxyMAkJQCBpbnAKKwltb3YJJGtleSxyMgorCXN1YgkkdGJsLHIzLCNBRVNfZGVjcnlwdC1BRVNfVGQJCUAgVGQKKyNpZiBfX0FSTV9BUkNIX188NworCWxkcmIJJHMwLFskcm91bmRzLCMzXQlAIGxvYWQgaW5wdXQgZGF0YSBpbiBlbmRpYW4tbmV1dHJhbAorCWxkcmIJJHQxLFskcm91bmRzLCMyXQlAIG1hbm5lci4uLgorCWxkcmIJJHQyLFskcm91bmRzLCMxXQorCWxkcmIJJHQzLFskcm91bmRzLCMwXQorCW9ycgkkczAsJHMwLCR0MSxsc2wjOAorCWxkcmIJJHMxLFskcm91bmRzLCM3XQorCW9ycgkkczAsJHMwLCR0Mixsc2wjMTYKKwlsZHJiCSR0MSxbJHJvdW5kcywjNl0KKwlvcnIJJHMwLCRzMCwkdDMsbHNsIzI0CisJbGRyYgkkdDIsWyRyb3VuZHMsIzVdCisJbGRyYgkkdDMsWyRyb3VuZHMsIzRdCisJb3JyCSRzMSwkczEsJHQxLGxzbCM4CisJbGRyYgkkczIsWyRyb3VuZHMsIzExXQorCW9ycgkkczEsJHMxLCR0Mixsc2wjMTYKKwlsZHJiCSR0MSxbJHJvdW5kcywjMTBdCisJb3JyCSRzMSwkczEsJHQzLGxzbCMyNAorCWxkcmIJJHQyLFskcm91bmRzLCM5XQorCWxkcmIJJHQzLFskcm91bmRzLCM4XQorCW9ycgkkczIsJHMyLCR0MSxsc2wjOAorCWxkcmIJJHMzLFskcm91bmRzLCMxNV0KKwlvcnIJJHMyLCRzMiwkdDIsbHNsIzE2CisJbGRyYgkkdDEsWyRyb3VuZHMsIzE0XQorCW9ycgkkczIsJHMyLCR0Myxsc2wjMjQKKwlsZHJiCSR0MixbJHJvdW5kcywjMTNdCisJbGRyYgkkdDMsWyRyb3VuZHMsIzEyXQorCW9ycgkkczMsJHMzLCR0MSxsc2wjOAorCW9ycgkkczMsJHMzLCR0Mixsc2wjMTYKKwlvcnIJJHMzLCRzMywkdDMsbHNsIzI0CisjZWxzZQorCWxkcgkkczAsWyRyb3VuZHMsIzBdCisJbGRyCSRzMSxbJHJvdW5kcywjNF0KKwlsZHIJJHMyLFskcm91bmRzLCM4XQorCWxkcgkkczMsWyRyb3VuZHMsIzEyXQorI2lmZGVmIF9fQVJNRUxfXworCXJldgkkczAsJHMwCisJcmV2CSRzMSwkczEKKwlyZXYJJHMyLCRzMgorCXJldgkkczMsJHMzCisjZW5kaWYKKyNlbmRpZgorCWJsCV9hcm12NF9BRVNfZGVjcnlwdAorCisJbGRyCSRyb3VuZHMsW3NwXSwjNAkJQCBwb3Agb3V0CisjaWYgX19BUk1fQVJDSF9fPj03CisjaWZkZWYgX19BUk1FTF9fCisJcmV2CSRzMCwkczAKKwlyZXYJJHMxLCRzMQorCXJldgkkczIsJHMyCisJcmV2CSRzMywkczMKKyNlbmRpZgorCXN0cgkkczAsWyRyb3VuZHMsIzBdCisJc3RyCSRzMSxbJHJvdW5kcywjNF0KKwlzdHIJJHMyLFskcm91bmRzLCM4XQorCXN0cgkkczMsWyRyb3VuZHMsIzEyXQorI2Vsc2UKKwltb3YJJHQxLCRzMCxsc3IjMjQJCUAgd3JpdGUgb3V0cHV0IGluIGVuZGlhbi1uZXV0cmFsCisJbW92CSR0MiwkczAsbHNyIzE2CQlAIG1hbm5lci4uLgorCW1vdgkkdDMsJHMwLGxzciM4CisJc3RyYgkkdDEsWyRyb3VuZHMsIzBdCisJc3RyYgkkdDIsWyRyb3VuZHMsIzFdCisJbW92CSR0MSwkczEsbHNyIzI0CisJc3RyYgkkdDMsWyRyb3VuZHMsIzJdCisJbW92CSR0MiwkczEsbHNyIzE2CisJc3RyYgkkczAsWyRyb3VuZHMsIzNdCisJbW92CSR0MywkczEsbHNyIzgKKwlzdHJiCSR0MSxbJHJvdW5kcywjNF0KKwlzdHJiCSR0MixbJHJvdW5kcywjNV0KKwltb3YJJHQxLCRzMixsc3IjMjQKKwlzdHJiCSR0MyxbJHJvdW5kcywjNl0KKwltb3YJJHQyLCRzMixsc3IjMTYKKwlzdHJiCSRzMSxbJHJvdW5kcywjN10KKwltb3YJJHQzLCRzMixsc3IjOAorCXN0cmIJJHQxLFskcm91bmRzLCM4XQorCXN0cmIJJHQyLFskcm91bmRzLCM5XQorCW1vdgkkdDEsJHMzLGxzciMyNAorCXN0cmIJJHQzLFskcm91bmRzLCMxMF0KKwltb3YJJHQyLCRzMyxsc3IjMTYKKwlzdHJiCSRzMixbJHJvdW5kcywjMTFdCisJbW92CSR0MywkczMsbHNyIzgKKwlzdHJiCSR0MSxbJHJvdW5kcywjMTJdCisJc3RyYgkkdDIsWyRyb3VuZHMsIzEzXQorCXN0cmIJJHQzLFskcm91bmRzLCMxNF0KKwlzdHJiCSRzMyxbJHJvdW5kcywjMTVdCisjZW5kaWYKKyNpZiBfX0FSTV9BUkNIX18+PTUKKwlsZG1pYQlzcCEse3I0LXIxMixwY30KKyNlbHNlCisJbGRtaWEgICBzcCEse3I0LXIxMixscn0KKwl0c3QJbHIsIzEKKwltb3ZlcQlwYyxscgkJCUAgYmUgYmluYXJ5IGNvbXBhdGlibGUgd2l0aCBWNCwgeWV0CisJYngJbHIJCQlAIGludGVyb3BlcmFibGUgd2l0aCBUaHVtYiBJU0E6LSkKKyNlbmRpZgorLnNpemUJQUVTX2RlY3J5cHQsLi1BRVNfZGVjcnlwdAorCisudHlwZSAgIF9hcm12NF9BRVNfZGVjcnlwdCwlZnVuY3Rpb24KKy5hbGlnbgkyCitfYXJtdjRfQUVTX2RlY3J5cHQ6CisJc3RyCWxyLFtzcCwjLTRdIQkJQCBwdXNoIGxyCisJbGRtaWEJJGtleSEseyR0MS0kaTF9CisJZW9yCSRzMCwkczAsJHQxCisJbGRyCSRyb3VuZHMsWyRrZXksIzI0MC0xNl0KKwllb3IJJHMxLCRzMSwkdDIKKwllb3IJJHMyLCRzMiwkdDMKKwllb3IJJHMzLCRzMywkaTEKKwlzdWIJJHJvdW5kcywkcm91bmRzLCMxCisJbW92CWxyLCMyNTUKKworCWFuZAkkaTEsbHIsJHMwLGxzciMxNgorCWFuZAkkaTIsbHIsJHMwLGxzciM4CisJYW5kCSRpMyxsciwkczAKKwltb3YJJHMwLCRzMCxsc3IjMjQKKy5MZGVjX2xvb3A6CisJbGRyCSR0MSxbJHRibCwkaTEsbHNsIzJdCUAgVGQxW3MwPj4xNl0KKwlhbmQJJGkxLGxyLCRzMQkJQCBpMAorCWxkcgkkdDIsWyR0YmwsJGkyLGxzbCMyXQlAIFRkMltzMD4+OF0KKwlhbmQJJGkyLGxyLCRzMSxsc3IjMTYKKwlsZHIJJHQzLFskdGJsLCRpMyxsc2wjMl0JQCBUZDNbczA+PjBdCisJYW5kCSRpMyxsciwkczEsbHNyIzgKKwlsZHIJJHMwLFskdGJsLCRzMCxsc2wjMl0JQCBUZDBbczA+PjI0XQorCW1vdgkkczEsJHMxLGxzciMyNAorCisJbGRyCSRpMSxbJHRibCwkaTEsbHNsIzJdCUAgVGQzW3MxPj4wXQorCWxkcgkkaTIsWyR0YmwsJGkyLGxzbCMyXQlAIFRkMVtzMT4+MTZdCisJbGRyCSRpMyxbJHRibCwkaTMsbHNsIzJdCUAgVGQyW3MxPj44XQorCWVvcgkkczAsJHMwLCRpMSxyb3IjMjQKKwlsZHIJJHMxLFskdGJsLCRzMSxsc2wjMl0JQCBUZDBbczE+PjI0XQorCWFuZAkkaTEsbHIsJHMyLGxzciM4CUAgaTAKKwllb3IJJHQyLCRpMiwkdDIscm9yIzgKKwlhbmQJJGkyLGxyLCRzMgkJQCBpMQorCWVvcgkkdDMsJGkzLCR0Myxyb3IjOAorCWFuZAkkaTMsbHIsJHMyLGxzciMxNgorCWxkcgkkaTEsWyR0YmwsJGkxLGxzbCMyXQlAIFRkMltzMj4+OF0KKwllb3IJJHMxLCRzMSwkdDEscm9yIzgKKwlsZHIJJGkyLFskdGJsLCRpMixsc2wjMl0JQCBUZDNbczI+PjBdCisJbW92CSRzMiwkczIsbHNyIzI0CisKKwlsZHIJJGkzLFskdGJsLCRpMyxsc2wjMl0JQCBUZDFbczI+PjE2XQorCWVvcgkkczAsJHMwLCRpMSxyb3IjMTYKKwlsZHIJJHMyLFskdGJsLCRzMixsc2wjMl0JQCBUZDBbczI+PjI0XQorCWFuZAkkaTEsbHIsJHMzLGxzciMxNglAIGkwCisJZW9yCSRzMSwkczEsJGkyLHJvciMyNAorCWFuZAkkaTIsbHIsJHMzLGxzciM4CUAgaTEKKwllb3IJJHQzLCRpMywkdDMscm9yIzgKKwlhbmQJJGkzLGxyLCRzMwkJQCBpMgorCWxkcgkkaTEsWyR0YmwsJGkxLGxzbCMyXQlAIFRkMVtzMz4+MTZdCisJZW9yCSRzMiwkczIsJHQyLHJvciM4CisJbGRyCSRpMixbJHRibCwkaTIsbHNsIzJdCUAgVGQyW3MzPj44XQorCW1vdgkkczMsJHMzLGxzciMyNAorCisJbGRyCSRpMyxbJHRibCwkaTMsbHNsIzJdCUAgVGQzW3MzPj4wXQorCWVvcgkkczAsJHMwLCRpMSxyb3IjOAorCWxkcgkkaTEsWyRrZXldLCMxNgorCWVvcgkkczEsJHMxLCRpMixyb3IjMTYKKwlsZHIJJHMzLFskdGJsLCRzMyxsc2wjMl0JQCBUZDBbczM+PjI0XQorCWVvcgkkczIsJHMyLCRpMyxyb3IjMjQKKworCWxkcgkkdDEsWyRrZXksIy0xMl0KKwllb3IJJHMwLCRzMCwkaTEKKwlsZHIJJHQyLFska2V5LCMtOF0KKwllb3IJJHMzLCRzMywkdDMscm9yIzgKKwlsZHIJJHQzLFska2V5LCMtNF0KKwlhbmQJJGkxLGxyLCRzMCxsc3IjMTYKKwllb3IJJHMxLCRzMSwkdDEKKwlhbmQJJGkyLGxyLCRzMCxsc3IjOAorCWVvcgkkczIsJHMyLCR0MgorCWFuZAkkaTMsbHIsJHMwCisJZW9yCSRzMywkczMsJHQzCisJbW92CSRzMCwkczAsbHNyIzI0CisKKwlzdWJzCSRyb3VuZHMsJHJvdW5kcywjMQorCWJuZQkuTGRlY19sb29wCisKKwlhZGQJJHRibCwkdGJsLCMxMDI0CisKKwlsZHIJJHQyLFskdGJsLCMwXQkJQCBwcmVmZXRjaCBUZDQKKwlsZHIJJHQzLFskdGJsLCMzMl0KKwlsZHIJJHQxLFskdGJsLCM2NF0KKwlsZHIJJHQyLFskdGJsLCM5Nl0KKwlsZHIJJHQzLFskdGJsLCMxMjhdCisJbGRyCSR0MSxbJHRibCwjMTYwXQorCWxkcgkkdDIsWyR0YmwsIzE5Ml0KKwlsZHIJJHQzLFskdGJsLCMyMjRdCisKKwlsZHJiCSRzMCxbJHRibCwkczBdCQlAIFRkNFtzMD4+MjRdCisJbGRyYgkkdDEsWyR0YmwsJGkxXQkJQCBUZDRbczA+PjE2XQorCWFuZAkkaTEsbHIsJHMxCQlAIGkwCisJbGRyYgkkdDIsWyR0YmwsJGkyXQkJQCBUZDRbczA+PjhdCisJYW5kCSRpMixsciwkczEsbHNyIzE2CisJbGRyYgkkdDMsWyR0YmwsJGkzXQkJQCBUZDRbczA+PjBdCisJYW5kCSRpMyxsciwkczEsbHNyIzgKKworCWFkZAkkczEsJHRibCwkczEsbHNyIzI0CisJbGRyYgkkaTEsWyR0YmwsJGkxXQkJQCBUZDRbczE+PjBdCisJbGRyYgkkczEsWyRzMV0JCUAgVGQ0W3MxPj4yNF0KKwlsZHJiCSRpMixbJHRibCwkaTJdCQlAIFRkNFtzMT4+MTZdCisJZW9yCSRzMCwkaTEsJHMwLGxzbCMyNAorCWxkcmIJJGkzLFskdGJsLCRpM10JCUAgVGQ0W3MxPj44XQorCWVvcgkkczEsJHQxLCRzMSxsc2wjOAorCWFuZAkkaTEsbHIsJHMyLGxzciM4CUAgaTAKKwllb3IJJHQyLCR0MiwkaTIsbHNsIzgKKwlhbmQJJGkyLGxyLCRzMgkJQCBpMQorCWxkcmIJJGkxLFskdGJsLCRpMV0JCUAgVGQ0W3MyPj44XQorCWVvcgkkdDMsJHQzLCRpMyxsc2wjOAorCWxkcmIJJGkyLFskdGJsLCRpMl0JCUAgVGQ0W3MyPj4wXQorCWFuZAkkaTMsbHIsJHMyLGxzciMxNgorCisJYWRkCSRzMiwkdGJsLCRzMixsc3IjMjQKKwlsZHJiCSRzMixbJHMyXQkJQCBUZDRbczI+PjI0XQorCWVvcgkkczAsJHMwLCRpMSxsc2wjOAorCWxkcmIJJGkzLFskdGJsLCRpM10JCUAgVGQ0W3MyPj4xNl0KKwllb3IJJHMxLCRpMiwkczEsbHNsIzE2CisJYW5kCSRpMSxsciwkczMsbHNyIzE2CUAgaTAKKwllb3IJJHMyLCR0MiwkczIsbHNsIzE2CisJYW5kCSRpMixsciwkczMsbHNyIzgJQCBpMQorCWxkcmIJJGkxLFskdGJsLCRpMV0JCUAgVGQ0W3MzPj4xNl0KKwllb3IJJHQzLCR0MywkaTMsbHNsIzE2CisJbGRyYgkkaTIsWyR0YmwsJGkyXQkJQCBUZDRbczM+PjhdCisJYW5kCSRpMyxsciwkczMJCUAgaTIKKworCWFkZAkkczMsJHRibCwkczMsbHNyIzI0CisJbGRyYgkkaTMsWyR0YmwsJGkzXQkJQCBUZDRbczM+PjBdCisJbGRyYgkkczMsWyRzM10JCUAgVGQ0W3MzPj4yNF0KKwllb3IJJHMwLCRzMCwkaTEsbHNsIzE2CisJbGRyCSRpMSxbJGtleSwjMF0KKwllb3IJJHMxLCRzMSwkaTIsbHNsIzgKKwlsZHIJJHQxLFska2V5LCM0XQorCWVvcgkkczIsJGkzLCRzMixsc2wjOAorCWxkcgkkdDIsWyRrZXksIzhdCisJZW9yCSRzMywkdDMsJHMzLGxzbCMyNAorCWxkcgkkdDMsWyRrZXksIzEyXQorCisJZW9yCSRzMCwkczAsJGkxCisJZW9yCSRzMSwkczEsJHQxCisJZW9yCSRzMiwkczIsJHQyCisJZW9yCSRzMywkczMsJHQzCisKKwlzdWIJJHRibCwkdGJsLCMxMDI0CisJbGRyCXBjLFtzcF0sIzQJCUAgcG9wIGFuZCByZXR1cm4KKy5zaXplCV9hcm12NF9BRVNfZGVjcnlwdCwuLV9hcm12NF9BRVNfZGVjcnlwdAorLmFzY2l6CSJBRVMgZm9yIEFSTXY0LCBDUllQVE9HQU1TIGJ5IDxhcHByb1xAb3BlbnNzbC5vcmc+IgorLmFsaWduCTIKKworI2VuZGlmCitfX18KKworJGNvZGUgPX4gcy9cYmJ4XHMrbHJcYi8ud29yZFx0MHhlMTJmZmYxZS9nbTsJIyBtYWtlIGl0IHBvc3NpYmxlIHRvIGNvbXBpbGUgd2l0aCAtbWFyY2g9YXJtdjQKKworb3BlbiBTRUxGLCQwOword2hpbGUoPFNFTEY+KSB7CisJbmV4dCBpZiAoL14jIS8pOworCWxhc3QgaWYgKCFzL14jL0AvIGFuZCAhL14kLyk7CisJcHJpbnQ7Cit9CitjbG9zZSBTRUxGOworCitwcmludCAkY29kZTsKK2Nsb3NlIFNURE9VVDsJIyBlbmZvcmNlIGZsdXNoCmRpZmYgLS1naXQgYS9jcnlwdG8vYWVzL2FzbS9hZXMteDg2XzY0LnBsIGIvY3J5cHRvL2Flcy9hc20vYWVzLXg4Nl82NC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmExMjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2Flcy9hc20vYWVzLXg4Nl82NC5wbApAQCAtMCwwICsxLDI4MTEgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKyMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgV3JpdHRlbiBieSBBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT4gZm9yIHRoZSBPcGVuU1NMCisjIHByb2plY3QuIFRoZSBtb2R1bGUgaXMsIGhvd2V2ZXIsIGR1YWwgbGljZW5zZWQgdW5kZXIgT3BlblNTTCBhbmQKKyMgQ1JZUFRPR0FNUyBsaWNlbnNlcyBkZXBlbmRpbmcgb24gd2hlcmUgeW91IG9idGFpbiBpdC4gRm9yIGZ1cnRoZXIKKyMgZGV0YWlscyBzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+YXBwcm8vY3J5cHRvZ2Ftcy8uCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFZlcnNpb24gMi4xLgorIworIyBhZXMtKi1jYmMgYmVuY2htYXJrcyBhcmUgaW1wcm92ZWQgYnkgPjcwJSBbY29tcGFyZWQgdG8gZ2NjIDMuMy4yIG9uCisjIE9wdGVyb24gMjQwIENQVV0gcGx1cyBhbGwgdGhlIGJlbGxzLW4td2hpc3RsZXMgZnJvbSAzMi1iaXQgdmVyc2lvbgorIyBbeW91J2xsIG5vdGljZSBhIGxvdCBvZiByZXNlbWJsYW5jZV0sIHN1Y2ggYXMgY29tcHJlc3NlZCBTLWJveGVzCisjIGluIGxpdHRsZS1lbmRpYW4gYnl0ZSBvcmRlciwgcHJlZmV0Y2ggb2YgdGhlc2UgdGFibGVzIGluIENCQyBtb2RlLAorIyBhcyB3ZWxsIGFzIGF2b2lkaW5nIEwxIGNhY2hlIGFsaWFzaW5nIGJldHdlZW4gc3RhY2sgZnJhbWUgYW5kIGtleQorIyBzY2hlZHVsZSBhbmQgYWxyZWFkeSBtZW50aW9uZWQgdGFibGVzLCBjb21wcmVzc2VkIFRkNC4uLgorIworIyBQZXJmb3JtYW5jZSBpbiBudW1iZXIgb2YgY3ljbGVzIHBlciBwcm9jZXNzZWQgYnl0ZSBmb3IgMTI4LWJpdCBrZXk6CisjCisjCQlFQ0IgZW5jcnlwdAlFQ0IgZGVjcnlwdAlDQkMgbGFyZ2UgY2h1bmsKKyMgQU1ENjQJCTMzCQk0MwkJMTMuMAorIyBFTTY0VAkJMzgJCTU2CQkxOC42KCopCisjIENvcmUgMgkzMAkJNDIJCTE0LjUoKikKKyMgQXRvbQkJNjUJCTg2CQkzMi4xKCopCisjCisjICgqKSB3aXRoIGh5cGVyLXRocmVhZGluZyBvZmYKKworJGZsYXZvdXIgPSBzaGlmdDsKKyRvdXRwdXQgID0gc2hpZnQ7CitpZiAoJGZsYXZvdXIgPX4gL1wuLykgeyAkb3V0cHV0ID0gJGZsYXZvdXI7IHVuZGVmICRmbGF2b3VyOyB9CisKKyR3aW42ND0wOyAkd2luNjQ9MSBpZiAoJGZsYXZvdXIgPX4gL1tubV1hc218bWluZ3c2NC8gfHwgJG91dHB1dCA9fiAvXC5hc20kLyk7CisKKyQwID1+IG0vKC4qW1wvXFxdKVteXC9cXF0rJC87ICRkaXI9JDE7CisoICR4bGF0ZT0iJHtkaXJ9eDg2XzY0LXhsYXRlLnBsIiBhbmQgLWYgJHhsYXRlICkgb3IKKyggJHhsYXRlPSIke2Rpcn0uLi8uLi9wZXJsYXNtL3g4Nl82NC14bGF0ZS5wbCIgYW5kIC1mICR4bGF0ZSkgb3IKK2RpZSAiY2FuJ3QgbG9jYXRlIHg4Nl82NC14bGF0ZS5wbCI7CisKK29wZW4gT1VULCJ8IFwiJF5YXCIgJHhsYXRlICRmbGF2b3VyICRvdXRwdXQiOworKlNURE9VVD0qT1VUOworCiskdmVydGljYWxzcGluPTE7CSMgdW5saWtlIDMyLWJpdCB2ZXJzaW9uICR2ZXJ0aWNhbHNwaW4gcGVyZm9ybXMKKwkJCSMgfjE1JSBiZXR0ZXIgb24gYm90aCBBTUQgYW5kIEludGVsIGNvcmVzCiskc3BlZWRfbGltaXQ9NTEyOwkjIHNlZSBhZXMtNTg2LnBsIGZvciBkZXRhaWxzCisKKyRjb2RlPSIudGV4dFxuIjsKKworJHMwPSIlZWF4IjsKKyRzMT0iJWVieCI7CiskczI9IiVlY3giOworJHMzPSIlZWR4IjsKKyRhY2MwPSIlZXNpIjsJJG1hc2s4MD0iJXJzaSI7CiskYWNjMT0iJWVkaSI7CSRtYXNrZmU9IiVyZGkiOworJGFjYzI9IiVlYnAiOwkkbWFzazFiPSIlcmJwIjsKKyRpbnA9IiVyOCI7Ciskb3V0PSIlcjkiOworJHQwPSIlcjEwZCI7CiskdDE9IiVyMTFkIjsKKyR0Mj0iJXIxMmQiOworJHJuZHM9IiVyMTNkIjsKKyRzYm94PSIlcjE0IjsKKyRrZXk9IiVyMTUiOworCitzdWIgaGkoKSB7IG15ICRyPXNoaWZ0OwkkciA9fiBzLyVbZXJdKFthLWRdKXgvJVwxaC87CSRyOyB9CitzdWIgbG8oKSB7IG15ICRyPXNoaWZ0OwkkciA9fiBzLyVbZXJdKFthLWRdKXgvJVwxbC87CisJCQkkciA9fiBzLyVbZXJdKFtzZF1pKS8lXDFsLzsKKwkJCSRyID1+IHMvJShyWzAtOV0rKVtkXT8vJVwxYi87CSRyOyB9CitzdWIgTE8oKSB7IG15ICRyPXNoaWZ0OyAkciA9fiBzLyVyKFthLXpdKykvJWVcMS87CisJCQkkciA9fiBzLyVyKFswLTldKykvJXJcMWQvOwkkcjsgfQorc3ViIF9kYXRhX3dvcmQoKQoreyBteSAkaTsKKyAgICB3aGlsZShkZWZpbmVkKCRpPXNoaWZ0KSkgeyAkY29kZS49c3ByaW50ZiIubG9uZ1x0MHglMDh4LDB4JTA4eFxuIiwkaSwkaTsgfQorfQorc3ViIGRhdGFfd29yZCgpCit7IG15ICRpOworICBteSAkbGFzdD1wb3AoQF8pOworICAgICRjb2RlLj0iLmxvbmdcdCI7CisgICAgd2hpbGUoZGVmaW5lZCgkaT1zaGlmdCkpIHsgJGNvZGUuPXNwcmludGYiMHglMDh4LCIsJGk7IH0KKyAgICAkY29kZS49c3ByaW50ZiIweCUwOHhcbiIsJGxhc3Q7Cit9CisKK3N1YiBkYXRhX2J5dGUoKQoreyBteSAkaTsKKyAgbXkgJGxhc3Q9cG9wKEBfKTsKKyAgICAkY29kZS49Ii5ieXRlXHQiOworICAgIHdoaWxlKGRlZmluZWQoJGk9c2hpZnQpKSB7ICRjb2RlLj1zcHJpbnRmIjB4JTAyeCwiLCRpJjB4ZmY7IH0KKyAgICAkY29kZS49c3ByaW50ZiIweCUwMnhcbiIsJGxhc3QmMHhmZjsKK30KKworc3ViIGVuY3ZlcnQoKQoreyBteSAkdDM9IiVyOGQiOwkjIHphcHMgJGlucCEKKworJGNvZGUuPTw8X19fOworCSMgZmF2b3IgMy13YXkgaXNzdWUgT3B0ZXJvbiBwaXBlbGluZS4uLgorCW1vdnpiCWAmbG8oIiRzMCIpYCwkYWNjMAorCW1vdnpiCWAmbG8oIiRzMSIpYCwkYWNjMQorCW1vdnpiCWAmbG8oIiRzMiIpYCwkYWNjMgorCW1vdgkwKCRzYm94LCRhY2MwLDgpLCR0MAorCW1vdgkwKCRzYm94LCRhY2MxLDgpLCR0MQorCW1vdgkwKCRzYm94LCRhY2MyLDgpLCR0MgorCisJbW92emIJYCZoaSgiJHMxIilgLCRhY2MwCisJbW92emIJYCZoaSgiJHMyIilgLCRhY2MxCisJbW92emIJYCZsbygiJHMzIilgLCRhY2MyCisJeG9yCTMoJHNib3gsJGFjYzAsOCksJHQwCisJeG9yCTMoJHNib3gsJGFjYzEsOCksJHQxCisJbW92CTAoJHNib3gsJGFjYzIsOCksJHQzCisKKwltb3Z6YglgJmhpKCIkczMiKWAsJGFjYzAKKwlzaHIJXCQxNiwkczIKKwltb3Z6YglgJmhpKCIkczAiKWAsJGFjYzIKKwl4b3IJMygkc2JveCwkYWNjMCw4KSwkdDIKKwlzaHIJXCQxNiwkczMKKwl4b3IJMygkc2JveCwkYWNjMiw4KSwkdDMKKworCXNocglcJDE2LCRzMQorCWxlYQkxNigka2V5KSwka2V5CisJc2hyCVwkMTYsJHMwCisKKwltb3Z6YglgJmxvKCIkczIiKWAsJGFjYzAKKwltb3Z6YglgJmxvKCIkczMiKWAsJGFjYzEKKwltb3Z6YglgJmxvKCIkczAiKWAsJGFjYzIKKwl4b3IJMigkc2JveCwkYWNjMCw4KSwkdDAKKwl4b3IJMigkc2JveCwkYWNjMSw4KSwkdDEKKwl4b3IJMigkc2JveCwkYWNjMiw4KSwkdDIKKworCW1vdnpiCWAmaGkoIiRzMyIpYCwkYWNjMAorCW1vdnpiCWAmaGkoIiRzMCIpYCwkYWNjMQorCW1vdnpiCWAmbG8oIiRzMSIpYCwkYWNjMgorCXhvcgkxKCRzYm94LCRhY2MwLDgpLCR0MAorCXhvcgkxKCRzYm94LCRhY2MxLDgpLCR0MQorCXhvcgkyKCRzYm94LCRhY2MyLDgpLCR0MworCisJbW92CTEyKCRrZXkpLCRzMworCW1vdnpiCWAmaGkoIiRzMSIpYCwkYWNjMQorCW1vdnpiCWAmaGkoIiRzMiIpYCwkYWNjMgorCW1vdgkwKCRrZXkpLCRzMAorCXhvcgkxKCRzYm94LCRhY2MxLDgpLCR0MgorCXhvcgkxKCRzYm94LCRhY2MyLDgpLCR0MworCisJbW92CTQoJGtleSksJHMxCisJbW92CTgoJGtleSksJHMyCisJeG9yCSR0MCwkczAKKwl4b3IJJHQxLCRzMQorCXhvcgkkdDIsJHMyCisJeG9yCSR0MywkczMKK19fXworfQorCitzdWIgZW5jbGFzdHZlcnQoKQoreyBteSAkdDM9IiVyOGQiOwkjIHphcHMgJGlucCEKKworJGNvZGUuPTw8X19fOworCW1vdnpiCWAmbG8oIiRzMCIpYCwkYWNjMAorCW1vdnpiCWAmbG8oIiRzMSIpYCwkYWNjMQorCW1vdnpiCWAmbG8oIiRzMiIpYCwkYWNjMgorCW1vdnpiCTIoJHNib3gsJGFjYzAsOCksJHQwCisJbW92emIJMigkc2JveCwkYWNjMSw4KSwkdDEKKwltb3Z6YgkyKCRzYm94LCRhY2MyLDgpLCR0MgorCisJbW92emIJYCZsbygiJHMzIilgLCRhY2MwCisJbW92emIJYCZoaSgiJHMxIilgLCRhY2MxCisJbW92emIJYCZoaSgiJHMyIilgLCRhY2MyCisJbW92emIJMigkc2JveCwkYWNjMCw4KSwkdDMKKwltb3YJMCgkc2JveCwkYWNjMSw4KSwkYWNjMQkjJHQwCisJbW92CTAoJHNib3gsJGFjYzIsOCksJGFjYzIJIyR0MQorCisJYW5kCVwkMHgwMDAwZmYwMCwkYWNjMQorCWFuZAlcJDB4MDAwMGZmMDAsJGFjYzIKKworCXhvcgkkYWNjMSwkdDAKKwl4b3IJJGFjYzIsJHQxCisJc2hyCVwkMTYsJHMyCisKKwltb3Z6YglgJmhpKCIkczMiKWAsJGFjYzAKKwltb3Z6YglgJmhpKCIkczAiKWAsJGFjYzEKKwlzaHIJXCQxNiwkczMKKwltb3YJMCgkc2JveCwkYWNjMCw4KSwkYWNjMAkjJHQyCisJbW92CTAoJHNib3gsJGFjYzEsOCksJGFjYzEJIyR0MworCisJYW5kCVwkMHgwMDAwZmYwMCwkYWNjMAorCWFuZAlcJDB4MDAwMGZmMDAsJGFjYzEKKwlzaHIJXCQxNiwkczEKKwl4b3IJJGFjYzAsJHQyCisJeG9yCSRhY2MxLCR0MworCXNocglcJDE2LCRzMAorCisJbW92emIJYCZsbygiJHMyIilgLCRhY2MwCisJbW92emIJYCZsbygiJHMzIilgLCRhY2MxCisJbW92emIJYCZsbygiJHMwIilgLCRhY2MyCisJbW92CTAoJHNib3gsJGFjYzAsOCksJGFjYzAJIyR0MAorCW1vdgkwKCRzYm94LCRhY2MxLDgpLCRhY2MxCSMkdDEKKwltb3YJMCgkc2JveCwkYWNjMiw4KSwkYWNjMgkjJHQyCisKKwlhbmQJXCQweDAwZmYwMDAwLCRhY2MwCisJYW5kCVwkMHgwMGZmMDAwMCwkYWNjMQorCWFuZAlcJDB4MDBmZjAwMDAsJGFjYzIKKworCXhvcgkkYWNjMCwkdDAKKwl4b3IJJGFjYzEsJHQxCisJeG9yCSRhY2MyLCR0MgorCisJbW92emIJYCZsbygiJHMxIilgLCRhY2MwCisJbW92emIJYCZoaSgiJHMzIilgLCRhY2MxCisJbW92emIJYCZoaSgiJHMwIilgLCRhY2MyCisJbW92CTAoJHNib3gsJGFjYzAsOCksJGFjYzAJIyR0MworCW1vdgkyKCRzYm94LCRhY2MxLDgpLCRhY2MxCSMkdDAKKwltb3YJMigkc2JveCwkYWNjMiw4KSwkYWNjMgkjJHQxCisKKwlhbmQJXCQweDAwZmYwMDAwLCRhY2MwCisJYW5kCVwkMHhmZjAwMDAwMCwkYWNjMQorCWFuZAlcJDB4ZmYwMDAwMDAsJGFjYzIKKworCXhvcgkkYWNjMCwkdDMKKwl4b3IJJGFjYzEsJHQwCisJeG9yCSRhY2MyLCR0MQorCisJbW92emIJYCZoaSgiJHMxIilgLCRhY2MwCisJbW92emIJYCZoaSgiJHMyIilgLCRhY2MxCisJbW92CTE2KzEyKCRrZXkpLCRzMworCW1vdgkyKCRzYm94LCRhY2MwLDgpLCRhY2MwCSMkdDIKKwltb3YJMigkc2JveCwkYWNjMSw4KSwkYWNjMQkjJHQzCisJbW92CTE2KzAoJGtleSksJHMwCisKKwlhbmQJXCQweGZmMDAwMDAwLCRhY2MwCisJYW5kCVwkMHhmZjAwMDAwMCwkYWNjMQorCisJeG9yCSRhY2MwLCR0MgorCXhvcgkkYWNjMSwkdDMKKworCW1vdgkxNis0KCRrZXkpLCRzMQorCW1vdgkxNis4KCRrZXkpLCRzMgorCXhvcgkkdDAsJHMwCisJeG9yCSR0MSwkczEKKwl4b3IJJHQyLCRzMgorCXhvcgkkdDMsJHMzCitfX18KK30KKworc3ViIGVuY3N0ZXAoKQoreyBteSAoJGksQHMpID0gQF87CisgIG15ICR0bXAwPSRhY2MwOworICBteSAkdG1wMT0kYWNjMTsKKyAgbXkgJHRtcDI9JGFjYzI7CisgIG15ICRvdXQ9KCR0MCwkdDEsJHQyLCRzWzBdKVskaV07CisKKwlpZiAoJGk9PTMpIHsKKwkJJHRtcDA9JHNbMV07CisJCSR0bXAxPSRzWzJdOworCQkkdG1wMj0kc1szXTsKKwl9CisJJGNvZGUuPSIJbW92emIJIi4mbG8oJHNbMF0pLiIsJG91dFxuIjsKKwkkY29kZS49Igltb3YJJHNbMl0sJHRtcDFcbiIJCWlmICgkaSE9Myk7CisJJGNvZGUuPSIJbGVhCTE2KCRrZXkpLCRrZXlcbiIJaWYgKCRpPT0wKTsKKworCSRjb2RlLj0iCW1vdnpiCSIuJmhpKCRzWzFdKS4iLCR0bXAwXG4iOworCSRjb2RlLj0iCW1vdgkwKCRzYm94LCRvdXQsOCksJG91dFxuIjsKKworCSRjb2RlLj0iCXNocglcJDE2LCR0bXAxXG4iOworCSRjb2RlLj0iCW1vdgkkc1szXSwkdG1wMlxuIgkJaWYgKCRpIT0zKTsKKwkkY29kZS49Igl4b3IJMygkc2JveCwkdG1wMCw4KSwkb3V0XG4iOworCisJJGNvZGUuPSIJbW92emIJIi4mbG8oJHRtcDEpLiIsJHRtcDFcbiI7CisJJGNvZGUuPSIJc2hyCVwkMjQsJHRtcDJcbiI7CisJJGNvZGUuPSIJeG9yCTQqJGkoJGtleSksJG91dFxuIjsKKworCSRjb2RlLj0iCXhvcgkyKCRzYm94LCR0bXAxLDgpLCRvdXRcbiI7CisJJGNvZGUuPSIJeG9yCTEoJHNib3gsJHRtcDIsOCksJG91dFxuIjsKKworCSRjb2RlLj0iCW1vdgkkdDAsJHNbMV1cbiIJCWlmICgkaT09Myk7CisJJGNvZGUuPSIJbW92CSR0MSwkc1syXVxuIgkJaWYgKCRpPT0zKTsKKwkkY29kZS49Igltb3YJJHQyLCRzWzNdXG4iCQlpZiAoJGk9PTMpOworCSRjb2RlLj0iXG4iOworfQorCitzdWIgZW5jbGFzdCgpCit7IG15ICgkaSxAcyk9QF87CisgIG15ICR0bXAwPSRhY2MwOworICBteSAkdG1wMT0kYWNjMTsKKyAgbXkgJHRtcDI9JGFjYzI7CisgIG15ICRvdXQ9KCR0MCwkdDEsJHQyLCRzWzBdKVskaV07CisKKwlpZiAoJGk9PTMpIHsKKwkJJHRtcDA9JHNbMV07CisJCSR0bXAxPSRzWzJdOworCQkkdG1wMj0kc1szXTsKKwl9CisJJGNvZGUuPSIJbW92emIJIi4mbG8oJHNbMF0pLiIsJG91dFxuIjsKKwkkY29kZS49Igltb3YJJHNbMl0sJHRtcDFcbiIJCWlmICgkaSE9Myk7CisKKwkkY29kZS49Igltb3YJMigkc2JveCwkb3V0LDgpLCRvdXRcbiI7CisJJGNvZGUuPSIJc2hyCVwkMTYsJHRtcDFcbiI7CisJJGNvZGUuPSIJbW92CSRzWzNdLCR0bXAyXG4iCQlpZiAoJGkhPTMpOworCisJJGNvZGUuPSIJYW5kCVwkMHgwMDAwMDBmZiwkb3V0XG4iOworCSRjb2RlLj0iCW1vdnpiCSIuJmhpKCRzWzFdKS4iLCR0bXAwXG4iOworCSRjb2RlLj0iCW1vdnpiCSIuJmxvKCR0bXAxKS4iLCR0bXAxXG4iOworCSRjb2RlLj0iCXNocglcJDI0LCR0bXAyXG4iOworCisJJGNvZGUuPSIJbW92CTAoJHNib3gsJHRtcDAsOCksJHRtcDBcbiI7CisJJGNvZGUuPSIJbW92CTAoJHNib3gsJHRtcDEsOCksJHRtcDFcbiI7CisJJGNvZGUuPSIJbW92CTIoJHNib3gsJHRtcDIsOCksJHRtcDJcbiI7CisKKwkkY29kZS49IglhbmQJXCQweDAwMDBmZjAwLCR0bXAwXG4iOworCSRjb2RlLj0iCWFuZAlcJDB4MDBmZjAwMDAsJHRtcDFcbiI7CisJJGNvZGUuPSIJYW5kCVwkMHhmZjAwMDAwMCwkdG1wMlxuIjsKKworCSRjb2RlLj0iCXhvcgkkdG1wMCwkb3V0XG4iOworCSRjb2RlLj0iCW1vdgkkdDAsJHNbMV1cbiIJCWlmICgkaT09Myk7CisJJGNvZGUuPSIJeG9yCSR0bXAxLCRvdXRcbiI7CisJJGNvZGUuPSIJbW92CSR0MSwkc1syXVxuIgkJaWYgKCRpPT0zKTsKKwkkY29kZS49Igl4b3IJJHRtcDIsJG91dFxuIjsKKwkkY29kZS49Igltb3YJJHQyLCRzWzNdXG4iCQlpZiAoJGk9PTMpOworCSRjb2RlLj0iXG4iOworfQorCiskY29kZS49PDxfX187CisudHlwZQlfeDg2XzY0X0FFU19lbmNyeXB0LFxAYWJpLW9tbmlwb3RlbnQKKy5hbGlnbgkxNgorX3g4Nl82NF9BRVNfZW5jcnlwdDoKKwl4b3IJMCgka2V5KSwkczAJCQkjIHhvciB3aXRoIGtleQorCXhvcgk0KCRrZXkpLCRzMQorCXhvcgk4KCRrZXkpLCRzMgorCXhvcgkxMigka2V5KSwkczMKKworCW1vdgkyNDAoJGtleSksJHJuZHMJCQkjIGxvYWQga2V5LT5yb3VuZHMKKwlzdWIJXCQxLCRybmRzCisJam1wCS5MZW5jX2xvb3AKKy5hbGlnbgkxNgorLkxlbmNfbG9vcDoKK19fXworCWlmICgkdmVydGljYWxzcGluKSB7ICZlbmN2ZXJ0KCk7IH0KKwllbHNlIHsJJmVuY3N0ZXAoMCwkczAsJHMxLCRzMiwkczMpOworCQkmZW5jc3RlcCgxLCRzMSwkczIsJHMzLCRzMCk7CisJCSZlbmNzdGVwKDIsJHMyLCRzMywkczAsJHMxKTsKKwkJJmVuY3N0ZXAoMywkczMsJHMwLCRzMSwkczIpOworCX0KKyRjb2RlLj08PF9fXzsKKwlzdWIJXCQxLCRybmRzCisJam56CS5MZW5jX2xvb3AKK19fXworCWlmICgkdmVydGljYWxzcGluKSB7ICZlbmNsYXN0dmVydCgpOyB9CisJZWxzZSB7CSZlbmNsYXN0KDAsJHMwLCRzMSwkczIsJHMzKTsKKwkJJmVuY2xhc3QoMSwkczEsJHMyLCRzMywkczApOworCQkmZW5jbGFzdCgyLCRzMiwkczMsJHMwLCRzMSk7CisJCSZlbmNsYXN0KDMsJHMzLCRzMCwkczEsJHMyKTsKKwkJJGNvZGUuPTw8X19fOworCQl4b3IJMTYrMCgka2V5KSwkczAJCSMgeG9yIHdpdGgga2V5CisJCXhvcgkxNis0KCRrZXkpLCRzMQorCQl4b3IJMTYrOCgka2V5KSwkczIKKwkJeG9yCTE2KzEyKCRrZXkpLCRzMworX19fCisJfQorJGNvZGUuPTw8X19fOworCS5ieXRlCTB4ZjMsMHhjMwkJCSMgcmVwIHJldAorLnNpemUJX3g4Nl82NF9BRVNfZW5jcnlwdCwuLV94ODZfNjRfQUVTX2VuY3J5cHQKK19fXworCisjIGl0J3MgcG9zc2libGUgdG8gaW1wbGVtZW50IHRoaXMgYnkgc2hpZnRpbmcgdE4gYnkgOCwgZmlsbGluZyBsZWFzdAorIyBzaWduaWZpY2FudCBieXRlIHdpdGggYnl0ZSBsb2FkIGFuZCBmaW5hbGx5IGJzd2FwLWluZyBhdCB0aGUgZW5kLAorIyBidXQgc3VjaCBwYXJ0aWFsIHJlZ2lzdGVyIGxvYWQga2lsbHMgQ29yZSAyLi4uCitzdWIgZW5jY29tcGFjdHZlcnQoKQoreyBteSAoJHQzLCR0NCwkdDUpPSgiJXI4ZCIsIiVyOWQiLCIlcjEzZCIpOworCiskY29kZS49PDxfX187CisJbW92emIJYCZsbygiJHMwIilgLCR0MAorCW1vdnpiCWAmbG8oIiRzMSIpYCwkdDEKKwltb3Z6YglgJmxvKCIkczIiKWAsJHQyCisJbW92emIJYCZsbygiJHMzIilgLCR0MworCW1vdnpiCWAmaGkoIiRzMSIpYCwkYWNjMAorCW1vdnpiCWAmaGkoIiRzMiIpYCwkYWNjMQorCXNocglcJDE2LCRzMgorCW1vdnpiCWAmaGkoIiRzMyIpYCwkYWNjMgorCW1vdnpiCSgkc2JveCwkdDAsMSksJHQwCisJbW92emIJKCRzYm94LCR0MSwxKSwkdDEKKwltb3Z6YgkoJHNib3gsJHQyLDEpLCR0MgorCW1vdnpiCSgkc2JveCwkdDMsMSksJHQzCisKKwltb3Z6YgkoJHNib3gsJGFjYzAsMSksJHQ0CSMkdDAKKwltb3Z6YglgJmhpKCIkczAiKWAsJGFjYzAKKwltb3Z6YgkoJHNib3gsJGFjYzEsMSksJHQ1CSMkdDEKKwltb3Z6YglgJmxvKCIkczIiKWAsJGFjYzEKKwltb3Z6YgkoJHNib3gsJGFjYzIsMSksJGFjYzIJIyR0MgorCW1vdnpiCSgkc2JveCwkYWNjMCwxKSwkYWNjMAkjJHQzCisKKwlzaGwJXCQ4LCR0NAorCXNocglcJDE2LCRzMworCXNobAlcJDgsJHQ1CisJeG9yCSR0NCwkdDAKKwlzaHIJXCQxNiwkczAKKwltb3Z6YglgJmxvKCIkczMiKWAsJHQ0CisJc2hyCVwkMTYsJHMxCisJeG9yCSR0NSwkdDEKKwlzaGwJXCQ4LCRhY2MyCisJbW92emIJYCZsbygiJHMwIilgLCR0NQorCW1vdnpiCSgkc2JveCwkYWNjMSwxKSwkYWNjMQkjJHQwCisJeG9yCSRhY2MyLCR0MgorCisJc2hsCVwkOCwkYWNjMAorCW1vdnpiCWAmbG8oIiRzMSIpYCwkYWNjMgorCXNobAlcJDE2LCRhY2MxCisJeG9yCSRhY2MwLCR0MworCW1vdnpiCSgkc2JveCwkdDQsMSksJHQ0CSMkdDEKKwltb3Z6YglgJmhpKCIkczMiKWAsJGFjYzAKKwltb3Z6YgkoJHNib3gsJHQ1LDEpLCR0NQkjJHQyCisJeG9yCSRhY2MxLCR0MAorCisJc2hyCVwkOCwkczIKKwltb3Z6YglgJmhpKCIkczAiKWAsJGFjYzEKKwlzaGwJXCQxNiwkdDQKKwlzaHIJXCQ4LCRzMQorCXNobAlcJDE2LCR0NQorCXhvcgkkdDQsJHQxCisJbW92emIJKCRzYm94LCRhY2MyLDEpLCRhY2MyCSMkdDMKKwltb3Z6YgkoJHNib3gsJGFjYzAsMSksJGFjYzAJIyR0MAorCW1vdnpiCSgkc2JveCwkYWNjMSwxKSwkYWNjMQkjJHQxCisJbW92emIJKCRzYm94LCRzMiwxKSwkczMJIyR0MworCW1vdnpiCSgkc2JveCwkczEsMSksJHMyCSMkdDIKKworCXNobAlcJDE2LCRhY2MyCisJeG9yCSR0NSwkdDIKKwlzaGwJXCQyNCwkYWNjMAorCXhvcgkkYWNjMiwkdDMKKwlzaGwJXCQyNCwkYWNjMQorCXhvcgkkYWNjMCwkdDAKKwlzaGwJXCQyNCwkczMKKwl4b3IJJGFjYzEsJHQxCisJc2hsCVwkMjQsJHMyCisJbW92CSR0MCwkczAKKwltb3YJJHQxLCRzMQorCXhvcgkkdDIsJHMyCisJeG9yCSR0MywkczMKK19fXworfQorCitzdWIgZW5jdHJhbnNmb3JtX3JlZigpCit7IG15ICRzbiA9IHNoaWZ0OworICBteSAoJGFjYywkcjIsJHRtcCk9KCIlcjhkIiwiJXI5ZCIsIiVyMTNkIik7CisKKyRjb2RlLj08PF9fXzsKKwltb3YJJHNuLCRhY2MKKwlhbmQJXCQweDgwODA4MDgwLCRhY2MKKwltb3YJJGFjYywkdG1wCisJc2hyCVwkNywkdG1wCisJbGVhCSgkc24sJHNuKSwkcjIKKwlzdWIJJHRtcCwkYWNjCisJYW5kCVwkMHhmZWZlZmVmZSwkcjIKKwlhbmQJXCQweDFiMWIxYjFiLCRhY2MKKwltb3YJJHNuLCR0bXAKKwl4b3IJJGFjYywkcjIKKworCXhvcgkkcjIsJHNuCisJcm9sCVwkMjQsJHNuCisJeG9yCSRyMiwkc24KKwlyb3IJXCQxNiwkdG1wCisJeG9yCSR0bXAsJHNuCisJcm9yCVwkOCwkdG1wCisJeG9yCSR0bXAsJHNuCitfX18KK30KKworIyB1bmxpa2UgZGVjcnlwdCBjYXNlIGl0IGRvZXMgbm90IHBheSBvZmYgdG8gcGFyYWxsZWxpemUgZW5jdHJhbnNmb3JtCitzdWIgZW5jdHJhbnNmb3JtKCkKK3sgbXkgKCR0MywkcjIwLCRyMjEpPSgkYWNjMiwiJXI4ZCIsIiVyOWQiKTsKKworJGNvZGUuPTw8X19fOworCW1vdglcJDB4ODA4MDgwODAsJHQwCisJbW92CVwkMHg4MDgwODA4MCwkdDEKKwlhbmQJJHMwLCR0MAorCWFuZAkkczEsJHQxCisJbW92CSR0MCwkYWNjMAorCW1vdgkkdDEsJGFjYzEKKwlzaHIJXCQ3LCR0MAorCWxlYQkoJHMwLCRzMCksJHIyMAorCXNocglcJDcsJHQxCisJbGVhCSgkczEsJHMxKSwkcjIxCisJc3ViCSR0MCwkYWNjMAorCXN1YgkkdDEsJGFjYzEKKwlhbmQJXCQweGZlZmVmZWZlLCRyMjAKKwlhbmQJXCQweGZlZmVmZWZlLCRyMjEKKwlhbmQJXCQweDFiMWIxYjFiLCRhY2MwCisJYW5kCVwkMHgxYjFiMWIxYiwkYWNjMQorCW1vdgkkczAsJHQwCisJbW92CSRzMSwkdDEKKwl4b3IJJGFjYzAsJHIyMAorCXhvcgkkYWNjMSwkcjIxCisKKwl4b3IJJHIyMCwkczAKKwl4b3IJJHIyMSwkczEKKwkgbW92CVwkMHg4MDgwODA4MCwkdDIKKwlyb2wJXCQyNCwkczAKKwkgbW92CVwkMHg4MDgwODA4MCwkdDMKKwlyb2wJXCQyNCwkczEKKwkgYW5kCSRzMiwkdDIKKwkgYW5kCSRzMywkdDMKKwl4b3IJJHIyMCwkczAKKwl4b3IJJHIyMSwkczEKKwkgbW92CSR0MiwkYWNjMAorCXJvcglcJDE2LCR0MAorCSBtb3YJJHQzLCRhY2MxCisJcm9yCVwkMTYsJHQxCisJIGxlYQkoJHMyLCRzMiksJHIyMAorCSBzaHIJXCQ3LCR0MgorCXhvcgkkdDAsJHMwCisJIHNocglcJDcsJHQzCisJeG9yCSR0MSwkczEKKwlyb3IJXCQ4LCR0MAorCSBsZWEJKCRzMywkczMpLCRyMjEKKwlyb3IJXCQ4LCR0MQorCSBzdWIJJHQyLCRhY2MwCisJIHN1YgkkdDMsJGFjYzEKKwl4b3IJJHQwLCRzMAorCXhvcgkkdDEsJHMxCisKKwlhbmQJXCQweGZlZmVmZWZlLCRyMjAKKwlhbmQJXCQweGZlZmVmZWZlLCRyMjEKKwlhbmQJXCQweDFiMWIxYjFiLCRhY2MwCisJYW5kCVwkMHgxYjFiMWIxYiwkYWNjMQorCW1vdgkkczIsJHQyCisJbW92CSRzMywkdDMKKwl4b3IJJGFjYzAsJHIyMAorCXhvcgkkYWNjMSwkcjIxCisKKwlyb3IJXCQxNiwkdDIKKwl4b3IJJHIyMCwkczIKKwlyb3IJXCQxNiwkdDMKKwl4b3IJJHIyMSwkczMKKwlyb2wJXCQyNCwkczIKKwltb3YJMCgkc2JveCksJGFjYzAJCQkjIHByZWZldGNoIFRlNAorCXJvbAlcJDI0LCRzMworCXhvcgkkcjIwLCRzMgorCW1vdgk2NCgkc2JveCksJGFjYzEKKwl4b3IJJHIyMSwkczMKKwltb3YJMTI4KCRzYm94KSwkcjIwCisJeG9yCSR0MiwkczIKKwlyb3IJXCQ4LCR0MgorCXhvcgkkdDMsJHMzCisJcm9yCVwkOCwkdDMKKwl4b3IJJHQyLCRzMgorCW1vdgkxOTIoJHNib3gpLCRyMjEKKwl4b3IJJHQzLCRzMworX19fCit9CisKKyRjb2RlLj08PF9fXzsKKy50eXBlCV94ODZfNjRfQUVTX2VuY3J5cHRfY29tcGFjdCxcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMTYKK194ODZfNjRfQUVTX2VuY3J5cHRfY29tcGFjdDoKKwlsZWEJMTI4KCRzYm94KSwkaW5wCQkJIyBzaXplIG9wdGltaXphdGlvbgorCW1vdgkwLTEyOCgkaW5wKSwkYWNjMQkJIyBwcmVmZXRjaCBUZTQKKwltb3YJMzItMTI4KCRpbnApLCRhY2MyCisJbW92CTY0LTEyOCgkaW5wKSwkdDAKKwltb3YJOTYtMTI4KCRpbnApLCR0MQorCW1vdgkxMjgtMTI4KCRpbnApLCRhY2MxCisJbW92CTE2MC0xMjgoJGlucCksJGFjYzIKKwltb3YJMTkyLTEyOCgkaW5wKSwkdDAKKwltb3YJMjI0LTEyOCgkaW5wKSwkdDEKKwlqbXAJLkxlbmNfbG9vcF9jb21wYWN0CisuYWxpZ24JMTYKKy5MZW5jX2xvb3BfY29tcGFjdDoKKwkJeG9yCTAoJGtleSksJHMwCQkjIHhvciB3aXRoIGtleQorCQl4b3IJNCgka2V5KSwkczEKKwkJeG9yCTgoJGtleSksJHMyCisJCXhvcgkxMigka2V5KSwkczMKKwkJbGVhCTE2KCRrZXkpLCRrZXkKK19fXworCQkmZW5jY29tcGFjdHZlcnQoKTsKKyRjb2RlLj08PF9fXzsKKwkJY21wCTE2KCVyc3ApLCRrZXkKKwkJamUJLkxlbmNfY29tcGFjdF9kb25lCitfX18KKwkJJmVuY3RyYW5zZm9ybSgpOworJGNvZGUuPTw8X19fOworCWptcAkuTGVuY19sb29wX2NvbXBhY3QKKy5hbGlnbgkxNgorLkxlbmNfY29tcGFjdF9kb25lOgorCXhvcgkwKCRrZXkpLCRzMAorCXhvcgk0KCRrZXkpLCRzMQorCXhvcgk4KCRrZXkpLCRzMgorCXhvcgkxMigka2V5KSwkczMKKwkuYnl0ZQkweGYzLDB4YzMJCQkjIHJlcCByZXQKKy5zaXplCV94ODZfNjRfQUVTX2VuY3J5cHRfY29tcGFjdCwuLV94ODZfNjRfQUVTX2VuY3J5cHRfY29tcGFjdAorX19fCisKKyMgdm9pZCBBRVNfZW5jcnlwdCAoY29uc3Qgdm9pZCAqaW5wLHZvaWQgKm91dCxjb25zdCBBRVNfS0VZICprZXkpOworJGNvZGUuPTw8X19fOworLmdsb2JsCUFFU19lbmNyeXB0CisudHlwZQlBRVNfZW5jcnlwdCxcQGZ1bmN0aW9uLDMKKy5hbGlnbgkxNgorLmdsb2JsCWFzbV9BRVNfZW5jcnlwdAorLmhpZGRlbglhc21fQUVTX2VuY3J5cHQKK2FzbV9BRVNfZW5jcnlwdDoKK0FFU19lbmNyeXB0OgorCXB1c2gJJXJieAorCXB1c2gJJXJicAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCXB1c2gJJXIxNQorCisJIyBhbGxvY2F0ZSBmcmFtZSAiYWJvdmUiIGtleSBzY2hlZHVsZQorCW1vdgklcnNwLCVyMTAKKwlsZWEJLTYzKCVyZHgpLCVyY3gJIyAlcmR4IGlzIGtleSBhcmd1bWVudAorCWFuZAlcJC02NCwlcnNwCisJc3ViCSVyc3AsJXJjeAorCW5lZwklcmN4CisJYW5kCVwkMHgzYzAsJXJjeAorCXN1YgklcmN4LCVyc3AKKwlzdWIJXCQzMiwlcnNwCisKKwltb3YJJXJzaSwxNiglcnNwKQkjIHNhdmUgb3V0CisJbW92CSVyMTAsMjQoJXJzcCkJIyBzYXZlIHJlYWwgc3RhY2sgcG9pbnRlcgorLkxlbmNfcHJvbG9ndWU6CisKKwltb3YJJXJkeCwka2V5CisJbW92CTI0MCgka2V5KSwkcm5kcwkjIGxvYWQgcm91bmRzCisKKwltb3YJMCglcmRpKSwkczAJIyBsb2FkIGlucHV0IHZlY3RvcgorCW1vdgk0KCVyZGkpLCRzMQorCW1vdgk4KCVyZGkpLCRzMgorCW1vdgkxMiglcmRpKSwkczMKKworCXNobAlcJDQsJHJuZHMKKwlsZWEJKCRrZXksJHJuZHMpLCVyYnAKKwltb3YJJGtleSwoJXJzcCkJIyBrZXkgc2NoZWR1bGUKKwltb3YJJXJicCw4KCVyc3ApCSMgZW5kIG9mIGtleSBzY2hlZHVsZQorCisJIyBwaWNrIFRlNCBjb3B5IHdoaWNoIGNhbid0ICJvdmVybGFwIiB3aXRoIHN0YWNrIGZyYW1lIG9yIGtleSBzY2hlZHVsZQorCWxlYQkuTEFFU19UZSsyMDQ4KCVyaXApLCRzYm94CisJbGVhCTc2OCglcnNwKSwlcmJwCisJc3ViCSRzYm94LCVyYnAKKwlhbmQJXCQweDMwMCwlcmJwCisJbGVhCSgkc2JveCwlcmJwKSwkc2JveAorCisJY2FsbAlfeDg2XzY0X0FFU19lbmNyeXB0X2NvbXBhY3QKKworCW1vdgkxNiglcnNwKSwkb3V0CSMgcmVzdG9yZSBvdXQKKwltb3YJMjQoJXJzcCksJXJzaQkjIHJlc3RvcmUgc2F2ZWQgc3RhY2sgcG9pbnRlcgorCW1vdgkkczAsMCgkb3V0KQkjIHdyaXRlIG91dHB1dCB2ZWN0b3IKKwltb3YJJHMxLDQoJG91dCkKKwltb3YJJHMyLDgoJG91dCkKKwltb3YJJHMzLDEyKCRvdXQpCisKKwltb3YJKCVyc2kpLCVyMTUKKwltb3YJOCglcnNpKSwlcjE0CisJbW92CTE2KCVyc2kpLCVyMTMKKwltb3YJMjQoJXJzaSksJXIxMgorCW1vdgkzMiglcnNpKSwlcmJwCisJbW92CTQwKCVyc2kpLCVyYngKKwlsZWEJNDgoJXJzaSksJXJzcAorLkxlbmNfZXBpbG9ndWU6CisJcmV0Cisuc2l6ZQlBRVNfZW5jcnlwdCwuLUFFU19lbmNyeXB0CitfX18KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKKworc3ViIGRlY3ZlcnQoKQoreyBteSAkdDM9IiVyOGQiOwkjIHphcHMgJGlucCEKKworJGNvZGUuPTw8X19fOworCSMgZmF2b3IgMy13YXkgaXNzdWUgT3B0ZXJvbiBwaXBlbGluZS4uLgorCW1vdnpiCWAmbG8oIiRzMCIpYCwkYWNjMAorCW1vdnpiCWAmbG8oIiRzMSIpYCwkYWNjMQorCW1vdnpiCWAmbG8oIiRzMiIpYCwkYWNjMgorCW1vdgkwKCRzYm94LCRhY2MwLDgpLCR0MAorCW1vdgkwKCRzYm94LCRhY2MxLDgpLCR0MQorCW1vdgkwKCRzYm94LCRhY2MyLDgpLCR0MgorCisJbW92emIJYCZoaSgiJHMzIilgLCRhY2MwCisJbW92emIJYCZoaSgiJHMwIilgLCRhY2MxCisJbW92emIJYCZsbygiJHMzIilgLCRhY2MyCisJeG9yCTMoJHNib3gsJGFjYzAsOCksJHQwCisJeG9yCTMoJHNib3gsJGFjYzEsOCksJHQxCisJbW92CTAoJHNib3gsJGFjYzIsOCksJHQzCisKKwltb3Z6YglgJmhpKCIkczEiKWAsJGFjYzAKKwlzaHIJXCQxNiwkczAKKwltb3Z6YglgJmhpKCIkczIiKWAsJGFjYzIKKwl4b3IJMygkc2JveCwkYWNjMCw4KSwkdDIKKwlzaHIJXCQxNiwkczMKKwl4b3IJMygkc2JveCwkYWNjMiw4KSwkdDMKKworCXNocglcJDE2LCRzMQorCWxlYQkxNigka2V5KSwka2V5CisJc2hyCVwkMTYsJHMyCisKKwltb3Z6YglgJmxvKCIkczIiKWAsJGFjYzAKKwltb3Z6YglgJmxvKCIkczMiKWAsJGFjYzEKKwltb3Z6YglgJmxvKCIkczAiKWAsJGFjYzIKKwl4b3IJMigkc2JveCwkYWNjMCw4KSwkdDAKKwl4b3IJMigkc2JveCwkYWNjMSw4KSwkdDEKKwl4b3IJMigkc2JveCwkYWNjMiw4KSwkdDIKKworCW1vdnpiCWAmaGkoIiRzMSIpYCwkYWNjMAorCW1vdnpiCWAmaGkoIiRzMiIpYCwkYWNjMQorCW1vdnpiCWAmbG8oIiRzMSIpYCwkYWNjMgorCXhvcgkxKCRzYm94LCRhY2MwLDgpLCR0MAorCXhvcgkxKCRzYm94LCRhY2MxLDgpLCR0MQorCXhvcgkyKCRzYm94LCRhY2MyLDgpLCR0MworCisJbW92emIJYCZoaSgiJHMzIilgLCRhY2MwCisJbW92CTEyKCRrZXkpLCRzMworCW1vdnpiCWAmaGkoIiRzMCIpYCwkYWNjMgorCXhvcgkxKCRzYm94LCRhY2MwLDgpLCR0MgorCW1vdgkwKCRrZXkpLCRzMAorCXhvcgkxKCRzYm94LCRhY2MyLDgpLCR0MworCisJeG9yCSR0MCwkczAKKwltb3YJNCgka2V5KSwkczEKKwltb3YJOCgka2V5KSwkczIKKwl4b3IJJHQyLCRzMgorCXhvcgkkdDEsJHMxCisJeG9yCSR0MywkczMKK19fXworfQorCitzdWIgZGVjbGFzdHZlcnQoKQoreyBteSAkdDM9IiVyOGQiOwkjIHphcHMgJGlucCEKKworJGNvZGUuPTw8X19fOworCWxlYQkyMDQ4KCRzYm94KSwkc2JveAkjIHNpemUgb3B0aW1pemF0aW9uCisJbW92emIJYCZsbygiJHMwIilgLCRhY2MwCisJbW92emIJYCZsbygiJHMxIilgLCRhY2MxCisJbW92emIJYCZsbygiJHMyIilgLCRhY2MyCisJbW92emIJKCRzYm94LCRhY2MwLDEpLCR0MAorCW1vdnpiCSgkc2JveCwkYWNjMSwxKSwkdDEKKwltb3Z6YgkoJHNib3gsJGFjYzIsMSksJHQyCisKKwltb3Z6YglgJmxvKCIkczMiKWAsJGFjYzAKKwltb3Z6YglgJmhpKCIkczMiKWAsJGFjYzEKKwltb3Z6YglgJmhpKCIkczAiKWAsJGFjYzIKKwltb3Z6YgkoJHNib3gsJGFjYzAsMSksJHQzCisJbW92emIJKCRzYm94LCRhY2MxLDEpLCRhY2MxCSMkdDAKKwltb3Z6YgkoJHNib3gsJGFjYzIsMSksJGFjYzIJIyR0MQorCisJc2hsCVwkOCwkYWNjMQorCXNobAlcJDgsJGFjYzIKKworCXhvcgkkYWNjMSwkdDAKKwl4b3IJJGFjYzIsJHQxCisJc2hyCVwkMTYsJHMzCisKKwltb3Z6YglgJmhpKCIkczEiKWAsJGFjYzAKKwltb3Z6YglgJmhpKCIkczIiKWAsJGFjYzEKKwlzaHIJXCQxNiwkczAKKwltb3Z6YgkoJHNib3gsJGFjYzAsMSksJGFjYzAJIyR0MgorCW1vdnpiCSgkc2JveCwkYWNjMSwxKSwkYWNjMQkjJHQzCisKKwlzaGwJXCQ4LCRhY2MwCisJc2hsCVwkOCwkYWNjMQorCXNocglcJDE2LCRzMQorCXhvcgkkYWNjMCwkdDIKKwl4b3IJJGFjYzEsJHQzCisJc2hyCVwkMTYsJHMyCisKKwltb3Z6YglgJmxvKCIkczIiKWAsJGFjYzAKKwltb3Z6YglgJmxvKCIkczMiKWAsJGFjYzEKKwltb3Z6YglgJmxvKCIkczAiKWAsJGFjYzIKKwltb3Z6YgkoJHNib3gsJGFjYzAsMSksJGFjYzAJIyR0MAorCW1vdnpiCSgkc2JveCwkYWNjMSwxKSwkYWNjMQkjJHQxCisJbW92emIJKCRzYm94LCRhY2MyLDEpLCRhY2MyCSMkdDIKKworCXNobAlcJDE2LCRhY2MwCisJc2hsCVwkMTYsJGFjYzEKKwlzaGwJXCQxNiwkYWNjMgorCisJeG9yCSRhY2MwLCR0MAorCXhvcgkkYWNjMSwkdDEKKwl4b3IJJGFjYzIsJHQyCisKKwltb3Z6YglgJmxvKCIkczEiKWAsJGFjYzAKKwltb3Z6YglgJmhpKCIkczEiKWAsJGFjYzEKKwltb3Z6YglgJmhpKCIkczIiKWAsJGFjYzIKKwltb3Z6YgkoJHNib3gsJGFjYzAsMSksJGFjYzAJIyR0MworCW1vdnpiCSgkc2JveCwkYWNjMSwxKSwkYWNjMQkjJHQwCisJbW92emIJKCRzYm94LCRhY2MyLDEpLCRhY2MyCSMkdDEKKworCXNobAlcJDE2LCRhY2MwCisJc2hsCVwkMjQsJGFjYzEKKwlzaGwJXCQyNCwkYWNjMgorCisJeG9yCSRhY2MwLCR0MworCXhvcgkkYWNjMSwkdDAKKwl4b3IJJGFjYzIsJHQxCisKKwltb3Z6YglgJmhpKCIkczMiKWAsJGFjYzAKKwltb3Z6YglgJmhpKCIkczAiKWAsJGFjYzEKKwltb3YJMTYrMTIoJGtleSksJHMzCisJbW92emIJKCRzYm94LCRhY2MwLDEpLCRhY2MwCSMkdDIKKwltb3Z6YgkoJHNib3gsJGFjYzEsMSksJGFjYzEJIyR0MworCW1vdgkxNiswKCRrZXkpLCRzMAorCisJc2hsCVwkMjQsJGFjYzAKKwlzaGwJXCQyNCwkYWNjMQorCisJeG9yCSRhY2MwLCR0MgorCXhvcgkkYWNjMSwkdDMKKworCW1vdgkxNis0KCRrZXkpLCRzMQorCW1vdgkxNis4KCRrZXkpLCRzMgorCWxlYQktMjA0OCgkc2JveCksJHNib3gKKwl4b3IJJHQwLCRzMAorCXhvcgkkdDEsJHMxCisJeG9yCSR0MiwkczIKKwl4b3IJJHQzLCRzMworX19fCit9CisKK3N1YiBkZWNzdGVwKCkKK3sgbXkgKCRpLEBzKSA9IEBfOworICBteSAkdG1wMD0kYWNjMDsKKyAgbXkgJHRtcDE9JGFjYzE7CisgIG15ICR0bXAyPSRhY2MyOworICBteSAkb3V0PSgkdDAsJHQxLCR0Miwkc1swXSlbJGldOworCisJJGNvZGUuPSIJbW92CSRzWzBdLCRvdXRcbiIJCWlmICgkaSE9Myk7CisJCQkkdG1wMT0kc1syXQkJCWlmICgkaT09Myk7CisJJGNvZGUuPSIJbW92CSRzWzJdLCR0bXAxXG4iCQlpZiAoJGkhPTMpOworCSRjb2RlLj0iCWFuZAlcJDB4RkYsJG91dFxuIjsKKworCSRjb2RlLj0iCW1vdgkwKCRzYm94LCRvdXQsOCksJG91dFxuIjsKKwkkY29kZS49IglzaHIJXCQxNiwkdG1wMVxuIjsKKwkJCSR0bXAyPSRzWzNdCQkJaWYgKCRpPT0zKTsKKwkkY29kZS49Igltb3YJJHNbM10sJHRtcDJcbiIJCWlmICgkaSE9Myk7CisKKwkJCSR0bXAwPSRzWzFdCQkJaWYgKCRpPT0zKTsKKwkkY29kZS49Igltb3Z6YgkiLiZoaSgkc1sxXSkuIiwkdG1wMFxuIjsKKwkkY29kZS49IglhbmQJXCQweEZGLCR0bXAxXG4iOworCSRjb2RlLj0iCXNocglcJDI0LCR0bXAyXG4iOworCisJJGNvZGUuPSIJeG9yCTMoJHNib3gsJHRtcDAsOCksJG91dFxuIjsKKwkkY29kZS49Igl4b3IJMigkc2JveCwkdG1wMSw4KSwkb3V0XG4iOworCSRjb2RlLj0iCXhvcgkxKCRzYm94LCR0bXAyLDgpLCRvdXRcbiI7CisKKwkkY29kZS49Igltb3YJJHQyLCRzWzFdXG4iCQlpZiAoJGk9PTMpOworCSRjb2RlLj0iCW1vdgkkdDEsJHNbMl1cbiIJCWlmICgkaT09Myk7CisJJGNvZGUuPSIJbW92CSR0MCwkc1szXVxuIgkJaWYgKCRpPT0zKTsKKwkkY29kZS49IlxuIjsKK30KKworc3ViIGRlY2xhc3QoKQoreyBteSAoJGksQHMpPUBfOworICBteSAkdG1wMD0kYWNjMDsKKyAgbXkgJHRtcDE9JGFjYzE7CisgIG15ICR0bXAyPSRhY2MyOworICBteSAkb3V0PSgkdDAsJHQxLCR0Miwkc1swXSlbJGldOworCisJJGNvZGUuPSIJbW92CSRzWzBdLCRvdXRcbiIJCWlmICgkaSE9Myk7CisJCQkkdG1wMT0kc1syXQkJCWlmICgkaT09Myk7CisJJGNvZGUuPSIJbW92CSRzWzJdLCR0bXAxXG4iCQlpZiAoJGkhPTMpOworCSRjb2RlLj0iCWFuZAlcJDB4RkYsJG91dFxuIjsKKworCSRjb2RlLj0iCW1vdnpiCTIwNDgoJHNib3gsJG91dCwxKSwkb3V0XG4iOworCSRjb2RlLj0iCXNocglcJDE2LCR0bXAxXG4iOworCQkJJHRtcDI9JHNbM10JCQlpZiAoJGk9PTMpOworCSRjb2RlLj0iCW1vdgkkc1szXSwkdG1wMlxuIgkJaWYgKCRpIT0zKTsKKworCQkJJHRtcDA9JHNbMV0JCQlpZiAoJGk9PTMpOworCSRjb2RlLj0iCW1vdnpiCSIuJmhpKCRzWzFdKS4iLCR0bXAwXG4iOworCSRjb2RlLj0iCWFuZAlcJDB4RkYsJHRtcDFcbiI7CisJJGNvZGUuPSIJc2hyCVwkMjQsJHRtcDJcbiI7CisKKwkkY29kZS49Igltb3Z6YgkyMDQ4KCRzYm94LCR0bXAwLDEpLCR0bXAwXG4iOworCSRjb2RlLj0iCW1vdnpiCTIwNDgoJHNib3gsJHRtcDEsMSksJHRtcDFcbiI7CisJJGNvZGUuPSIJbW92emIJMjA0OCgkc2JveCwkdG1wMiwxKSwkdG1wMlxuIjsKKworCSRjb2RlLj0iCXNobAlcJDgsJHRtcDBcbiI7CisJJGNvZGUuPSIJc2hsCVwkMTYsJHRtcDFcbiI7CisJJGNvZGUuPSIJc2hsCVwkMjQsJHRtcDJcbiI7CisKKwkkY29kZS49Igl4b3IJJHRtcDAsJG91dFxuIjsKKwkkY29kZS49Igltb3YJJHQyLCRzWzFdXG4iCQlpZiAoJGk9PTMpOworCSRjb2RlLj0iCXhvcgkkdG1wMSwkb3V0XG4iOworCSRjb2RlLj0iCW1vdgkkdDEsJHNbMl1cbiIJCWlmICgkaT09Myk7CisJJGNvZGUuPSIJeG9yCSR0bXAyLCRvdXRcbiI7CisJJGNvZGUuPSIJbW92CSR0MCwkc1szXVxuIgkJaWYgKCRpPT0zKTsKKwkkY29kZS49IlxuIjsKK30KKworJGNvZGUuPTw8X19fOworLnR5cGUJX3g4Nl82NF9BRVNfZGVjcnlwdCxcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMTYKK194ODZfNjRfQUVTX2RlY3J5cHQ6CisJeG9yCTAoJGtleSksJHMwCQkJIyB4b3Igd2l0aCBrZXkKKwl4b3IJNCgka2V5KSwkczEKKwl4b3IJOCgka2V5KSwkczIKKwl4b3IJMTIoJGtleSksJHMzCisKKwltb3YJMjQwKCRrZXkpLCRybmRzCQkJIyBsb2FkIGtleS0+cm91bmRzCisJc3ViCVwkMSwkcm5kcworCWptcAkuTGRlY19sb29wCisuYWxpZ24JMTYKKy5MZGVjX2xvb3A6CitfX18KKwlpZiAoJHZlcnRpY2Fsc3BpbikgeyAmZGVjdmVydCgpOyB9CisJZWxzZSB7CSZkZWNzdGVwKDAsJHMwLCRzMywkczIsJHMxKTsKKwkJJmRlY3N0ZXAoMSwkczEsJHMwLCRzMywkczIpOworCQkmZGVjc3RlcCgyLCRzMiwkczEsJHMwLCRzMyk7CisJCSZkZWNzdGVwKDMsJHMzLCRzMiwkczEsJHMwKTsKKwkJJGNvZGUuPTw8X19fOworCQlsZWEJMTYoJGtleSksJGtleQorCQl4b3IJMCgka2V5KSwkczAJCQkjIHhvciB3aXRoIGtleQorCQl4b3IJNCgka2V5KSwkczEKKwkJeG9yCTgoJGtleSksJHMyCisJCXhvcgkxMigka2V5KSwkczMKK19fXworCX0KKyRjb2RlLj08PF9fXzsKKwlzdWIJXCQxLCRybmRzCisJam56CS5MZGVjX2xvb3AKK19fXworCWlmICgkdmVydGljYWxzcGluKSB7ICZkZWNsYXN0dmVydCgpOyB9CisJZWxzZSB7CSZkZWNsYXN0KDAsJHMwLCRzMywkczIsJHMxKTsKKwkJJmRlY2xhc3QoMSwkczEsJHMwLCRzMywkczIpOworCQkmZGVjbGFzdCgyLCRzMiwkczEsJHMwLCRzMyk7CisJCSZkZWNsYXN0KDMsJHMzLCRzMiwkczEsJHMwKTsKKwkJJGNvZGUuPTw8X19fOworCQl4b3IJMTYrMCgka2V5KSwkczAJCQkjIHhvciB3aXRoIGtleQorCQl4b3IJMTYrNCgka2V5KSwkczEKKwkJeG9yCTE2KzgoJGtleSksJHMyCisJCXhvcgkxNisxMigka2V5KSwkczMKK19fXworCX0KKyRjb2RlLj08PF9fXzsKKwkuYnl0ZQkweGYzLDB4YzMJCQkjIHJlcCByZXQKKy5zaXplCV94ODZfNjRfQUVTX2RlY3J5cHQsLi1feDg2XzY0X0FFU19kZWNyeXB0CitfX18KKworc3ViIGRlY2NvbXBhY3R2ZXJ0KCkKK3sgbXkgKCR0MywkdDQsJHQ1KT0oIiVyOGQiLCIlcjlkIiwiJXIxM2QiKTsKKworJGNvZGUuPTw8X19fOworCW1vdnpiCWAmbG8oIiRzMCIpYCwkdDAKKwltb3Z6YglgJmxvKCIkczEiKWAsJHQxCisJbW92emIJYCZsbygiJHMyIilgLCR0MgorCW1vdnpiCWAmbG8oIiRzMyIpYCwkdDMKKwltb3Z6YglgJmhpKCIkczMiKWAsJGFjYzAKKwltb3Z6YglgJmhpKCIkczAiKWAsJGFjYzEKKwlzaHIJXCQxNiwkczMKKwltb3Z6YglgJmhpKCIkczEiKWAsJGFjYzIKKwltb3Z6YgkoJHNib3gsJHQwLDEpLCR0MAorCW1vdnpiCSgkc2JveCwkdDEsMSksJHQxCisJbW92emIJKCRzYm94LCR0MiwxKSwkdDIKKwltb3Z6YgkoJHNib3gsJHQzLDEpLCR0MworCisJbW92emIJKCRzYm94LCRhY2MwLDEpLCR0NAkjJHQwCisJbW92emIJYCZoaSgiJHMyIilgLCRhY2MwCisJbW92emIJKCRzYm94LCRhY2MxLDEpLCR0NQkjJHQxCisJbW92emIJKCRzYm94LCRhY2MyLDEpLCRhY2MyCSMkdDIKKwltb3Z6YgkoJHNib3gsJGFjYzAsMSksJGFjYzAJIyR0MworCisJc2hyCVwkMTYsJHMyCisJc2hsCVwkOCwkdDUKKwlzaGwJXCQ4LCR0NAorCW1vdnpiCWAmbG8oIiRzMiIpYCwkYWNjMQorCXNocglcJDE2LCRzMAorCXhvcgkkdDQsJHQwCisJc2hyCVwkMTYsJHMxCisJbW92emIJYCZsbygiJHMzIilgLCR0NAorCisJc2hsCVwkOCwkYWNjMgorCXhvcgkkdDUsJHQxCisJc2hsCVwkOCwkYWNjMAorCW1vdnpiCWAmbG8oIiRzMCIpYCwkdDUKKwltb3Z6YgkoJHNib3gsJGFjYzEsMSksJGFjYzEJIyR0MAorCXhvcgkkYWNjMiwkdDIKKwltb3Z6YglgJmxvKCIkczEiKWAsJGFjYzIKKworCXNobAlcJDE2LCRhY2MxCisJeG9yCSRhY2MwLCR0MworCW1vdnpiCSgkc2JveCwkdDQsMSksJHQ0CSMkdDEKKwltb3Z6YglgJmhpKCIkczEiKWAsJGFjYzAKKwltb3Z6YgkoJHNib3gsJGFjYzIsMSksJGFjYzIJIyR0MworCXhvcgkkYWNjMSwkdDAKKwltb3Z6YgkoJHNib3gsJHQ1LDEpLCR0NQkjJHQyCisJbW92emIJYCZoaSgiJHMyIilgLCRhY2MxCisKKwlzaGwJXCQxNiwkYWNjMgorCXNobAlcJDE2LCR0NAorCXNobAlcJDE2LCR0NQorCXhvcgkkYWNjMiwkdDMKKwltb3Z6YglgJmhpKCIkczMiKWAsJGFjYzIKKwl4b3IJJHQ0LCR0MQorCXNocglcJDgsJHMwCisJeG9yCSR0NSwkdDIKKworCW1vdnpiCSgkc2JveCwkYWNjMCwxKSwkYWNjMAkjJHQwCisJbW92emIJKCRzYm94LCRhY2MxLDEpLCRzMQkjJHQxCisJbW92emIJKCRzYm94LCRhY2MyLDEpLCRzMgkjJHQyCisJbW92emIJKCRzYm94LCRzMCwxKSwkczMJIyR0MworCisJbW92CSR0MCwkczAKKwlzaGwJXCQyNCwkYWNjMAorCXNobAlcJDI0LCRzMQorCXNobAlcJDI0LCRzMgorCXhvcgkkYWNjMCwkczAKKwlzaGwJXCQyNCwkczMKKwl4b3IJJHQxLCRzMQorCXhvcgkkdDIsJHMyCisJeG9yCSR0MywkczMKK19fXworfQorCisjIHBhcmFsbGVsaXplZCB2ZXJzaW9uISBpbnB1dCBpcyBwYWlyIG9mIDY0LWJpdCB2YWx1ZXM6ICVyYXg9czEuczAKKyMgYW5kICVyY3g9czMuczIsIG91dHB1dCBpcyBmb3VyIDMyLWJpdCB2YWx1ZXMgaW4gJWVheD1zMCwgJWVieD1zMSwKKyMgJWVjeD1zMiBhbmQgJWVkeD1zMy4KK3N1YiBkZWN0cmFuc2Zvcm0oKQoreyBteSAoJHRwMTAsJHRwMjAsJHRwNDAsJHRwODAsJGFjYzApPSgiJXJheCIsIiVyOCIsICIlcjkiLCAiJXIxMCIsIiVyYngiKTsKKyAgbXkgKCR0cDE4LCR0cDI4LCR0cDQ4LCR0cDg4LCRhY2M4KT0oIiVyY3giLCIlcjExIiwiJXIxMiIsIiVyMTMiLCIlcmR4Iik7CisgIG15ICRwcmVmZXRjaCA9IHNoaWZ0OworCiskY29kZS49PDxfX187CisJbW92CSRtYXNrODAsJHRwNDAKKwltb3YJJG1hc2s4MCwkdHA0OAorCWFuZAkkdHAxMCwkdHA0MAorCWFuZAkkdHAxOCwkdHA0OAorCW1vdgkkdHA0MCwkYWNjMAorCW1vdgkkdHA0OCwkYWNjOAorCXNocglcJDcsJHRwNDAKKwlsZWEJKCR0cDEwLCR0cDEwKSwkdHAyMAorCXNocglcJDcsJHRwNDgKKwlsZWEJKCR0cDE4LCR0cDE4KSwkdHAyOAorCXN1YgkkdHA0MCwkYWNjMAorCXN1YgkkdHA0OCwkYWNjOAorCWFuZAkkbWFza2ZlLCR0cDIwCisJYW5kCSRtYXNrZmUsJHRwMjgKKwlhbmQJJG1hc2sxYiwkYWNjMAorCWFuZAkkbWFzazFiLCRhY2M4CisJeG9yCSRhY2MwLCR0cDIwCisJeG9yCSRhY2M4LCR0cDI4CisJbW92CSRtYXNrODAsJHRwODAKKwltb3YJJG1hc2s4MCwkdHA4OAorCisJYW5kCSR0cDIwLCR0cDgwCisJYW5kCSR0cDI4LCR0cDg4CisJbW92CSR0cDgwLCRhY2MwCisJbW92CSR0cDg4LCRhY2M4CisJc2hyCVwkNywkdHA4MAorCWxlYQkoJHRwMjAsJHRwMjApLCR0cDQwCisJc2hyCVwkNywkdHA4OAorCWxlYQkoJHRwMjgsJHRwMjgpLCR0cDQ4CisJc3ViCSR0cDgwLCRhY2MwCisJc3ViCSR0cDg4LCRhY2M4CisJYW5kCSRtYXNrZmUsJHRwNDAKKwlhbmQJJG1hc2tmZSwkdHA0OAorCWFuZAkkbWFzazFiLCRhY2MwCisJYW5kCSRtYXNrMWIsJGFjYzgKKwl4b3IJJGFjYzAsJHRwNDAKKwl4b3IJJGFjYzgsJHRwNDgKKwltb3YJJG1hc2s4MCwkdHA4MAorCW1vdgkkbWFzazgwLCR0cDg4CisKKwlhbmQJJHRwNDAsJHRwODAKKwlhbmQJJHRwNDgsJHRwODgKKwltb3YJJHRwODAsJGFjYzAKKwltb3YJJHRwODgsJGFjYzgKKwlzaHIJXCQ3LCR0cDgwCisJIHhvcgkkdHAxMCwkdHAyMAkJIyB0cDJePXRwMQorCXNocglcJDcsJHRwODgKKwkgeG9yCSR0cDE4LCR0cDI4CQkjIHRwMl49dHAxCisJc3ViCSR0cDgwLCRhY2MwCisJc3ViCSR0cDg4LCRhY2M4CisJbGVhCSgkdHA0MCwkdHA0MCksJHRwODAKKwlsZWEJKCR0cDQ4LCR0cDQ4KSwkdHA4OAorCSB4b3IJJHRwMTAsJHRwNDAJCSMgdHA0Xj10cDEKKwkgeG9yCSR0cDE4LCR0cDQ4CQkjIHRwNF49dHAxCisJYW5kCSRtYXNrZmUsJHRwODAKKwlhbmQJJG1hc2tmZSwkdHA4OAorCWFuZAkkbWFzazFiLCRhY2MwCisJYW5kCSRtYXNrMWIsJGFjYzgKKwl4b3IJJGFjYzAsJHRwODAKKwl4b3IJJGFjYzgsJHRwODgKKworCXhvcgkkdHA4MCwkdHAxMAkJIyB0cDFePXRwOAorCXhvcgkkdHA4OCwkdHAxOAkJIyB0cDFePXRwOAorCXhvcgkkdHA4MCwkdHAyMAkJIyB0cDJedHAxXj10cDgKKwl4b3IJJHRwODgsJHRwMjgJCSMgdHAyXnRwMV49dHA4CisJbW92CSR0cDEwLCRhY2MwCisJbW92CSR0cDE4LCRhY2M4CisJeG9yCSR0cDgwLCR0cDQwCQkjIHRwNF50cDFePXRwOAorCXNocglcJDMyLCRhY2MwCisJeG9yCSR0cDg4LCR0cDQ4CQkjIHRwNF50cDFePXRwOAorCXNocglcJDMyLCRhY2M4CisJeG9yCSR0cDIwLCR0cDgwCQkjIHRwOF49dHA4XnRwMl50cDE9dHAyXnRwMQorCXJvbAlcJDgsYCZMTygiJHRwMTAiKWAJIyBST1RBVEUodHAxXnRwOCw4KQorCXhvcgkkdHAyOCwkdHA4OAkJIyB0cDhePXRwOF50cDJedHAxPXRwMl50cDEKKwlyb2wJXCQ4LGAmTE8oIiR0cDE4IilgCSMgUk9UQVRFKHRwMV50cDgsOCkKKwl4b3IJJHRwNDAsJHRwODAJCSMgdHAyXnRwMV49dHA4XnRwNF50cDE9dHA4XnRwNF50cDIKKwlyb2wJXCQ4LGAmTE8oIiRhY2MwIilgCSMgUk9UQVRFKHRwMV50cDgsOCkKKwl4b3IJJHRwNDgsJHRwODgJCSMgdHAyXnRwMV49dHA4XnRwNF50cDE9dHA4XnRwNF50cDIKKworCXJvbAlcJDgsYCZMTygiJGFjYzgiKWAJIyBST1RBVEUodHAxXnRwOCw4KQorCXhvcglgJkxPKCIkdHA4MCIpYCxgJkxPKCIkdHAxMCIpYAorCXNocglcJDMyLCR0cDgwCisJeG9yCWAmTE8oIiR0cDg4IilgLGAmTE8oIiR0cDE4IilgCisJc2hyCVwkMzIsJHRwODgKKwl4b3IJYCZMTygiJHRwODAiKWAsYCZMTygiJGFjYzAiKWAKKwl4b3IJYCZMTygiJHRwODgiKWAsYCZMTygiJGFjYzgiKWAKKworCW1vdgkkdHAyMCwkdHA4MAorCXJvbAlcJDI0LGAmTE8oIiR0cDIwIilgCSMgUk9UQVRFKHRwMl50cDFedHA4LDI0KQorCW1vdgkkdHAyOCwkdHA4OAorCXJvbAlcJDI0LGAmTE8oIiR0cDI4IilgCSMgUk9UQVRFKHRwMl50cDFedHA4LDI0KQorCXNocglcJDMyLCR0cDgwCisJeG9yCWAmTE8oIiR0cDIwIilgLGAmTE8oIiR0cDEwIilgCisJc2hyCVwkMzIsJHRwODgKKwl4b3IJYCZMTygiJHRwMjgiKWAsYCZMTygiJHRwMTgiKWAKKwlyb2wJXCQyNCxgJkxPKCIkdHA4MCIpYAkjIFJPVEFURSh0cDJedHAxXnRwOCwyNCkKKwltb3YJJHRwNDAsJHRwMjAKKwlyb2wJXCQyNCxgJkxPKCIkdHA4OCIpYAkjIFJPVEFURSh0cDJedHAxXnRwOCwyNCkKKwltb3YJJHRwNDgsJHRwMjgKKwlzaHIJXCQzMiwkdHAyMAorCXhvcglgJkxPKCIkdHA4MCIpYCxgJkxPKCIkYWNjMCIpYAorCXNocglcJDMyLCR0cDI4CisJeG9yCWAmTE8oIiR0cDg4IilgLGAmTE8oIiRhY2M4IilgCisKKwlgIm1vdgkwKCRzYm94KSwkbWFzazgwIglpZiAoJHByZWZldGNoKWAKKwlyb2wJXCQxNixgJkxPKCIkdHA0MCIpYAkjIFJPVEFURSh0cDRedHAxXnRwOCwxNikKKwlgIm1vdgk2NCgkc2JveCksJG1hc2tmZSIJaWYgKCRwcmVmZXRjaClgCisJcm9sCVwkMTYsYCZMTygiJHRwNDgiKWAJIyBST1RBVEUodHA0XnRwMV50cDgsMTYpCisJYCJtb3YJMTI4KCRzYm94KSwkbWFzazFiIglpZiAoJHByZWZldGNoKWAKKwlyb2wJXCQxNixgJkxPKCIkdHAyMCIpYAkjIFJPVEFURSh0cDRedHAxXnRwOCwxNikKKwlgIm1vdgkxOTIoJHNib3gpLCR0cDgwIglpZiAoJHByZWZldGNoKWAKKwl4b3IJYCZMTygiJHRwNDAiKWAsYCZMTygiJHRwMTAiKWAKKwlyb2wJXCQxNixgJkxPKCIkdHAyOCIpYAkjIFJPVEFURSh0cDRedHAxXnRwOCwxNikKKwl4b3IJYCZMTygiJHRwNDgiKWAsYCZMTygiJHRwMTgiKWAKKwlgIm1vdgkyNTYoJHNib3gpLCR0cDg4IglpZiAoJHByZWZldGNoKWAKKwl4b3IJYCZMTygiJHRwMjAiKWAsYCZMTygiJGFjYzAiKWAKKwl4b3IJYCZMTygiJHRwMjgiKWAsYCZMTygiJGFjYzgiKWAKK19fXworfQorCiskY29kZS49PDxfX187CisudHlwZQlfeDg2XzY0X0FFU19kZWNyeXB0X2NvbXBhY3QsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2CitfeDg2XzY0X0FFU19kZWNyeXB0X2NvbXBhY3Q6CisJbGVhCTEyOCgkc2JveCksJGlucAkJCSMgc2l6ZSBvcHRpbWl6YXRpb24KKwltb3YJMC0xMjgoJGlucCksJGFjYzEJCSMgcHJlZmV0Y2ggVGQ0CisJbW92CTMyLTEyOCgkaW5wKSwkYWNjMgorCW1vdgk2NC0xMjgoJGlucCksJHQwCisJbW92CTk2LTEyOCgkaW5wKSwkdDEKKwltb3YJMTI4LTEyOCgkaW5wKSwkYWNjMQorCW1vdgkxNjAtMTI4KCRpbnApLCRhY2MyCisJbW92CTE5Mi0xMjgoJGlucCksJHQwCisJbW92CTIyNC0xMjgoJGlucCksJHQxCisJam1wCS5MZGVjX2xvb3BfY29tcGFjdAorCisuYWxpZ24JMTYKKy5MZGVjX2xvb3BfY29tcGFjdDoKKwkJeG9yCTAoJGtleSksJHMwCQkjIHhvciB3aXRoIGtleQorCQl4b3IJNCgka2V5KSwkczEKKwkJeG9yCTgoJGtleSksJHMyCisJCXhvcgkxMigka2V5KSwkczMKKwkJbGVhCTE2KCRrZXkpLCRrZXkKK19fXworCQkmZGVjY29tcGFjdHZlcnQoKTsKKyRjb2RlLj08PF9fXzsKKwkJY21wCTE2KCVyc3ApLCRrZXkKKwkJamUJLkxkZWNfY29tcGFjdF9kb25lCisKKwkJbW92CTI1NiswKCRzYm94KSwkbWFzazgwCisJCXNobAlcJDMyLCVyYngKKwkJc2hsCVwkMzIsJXJkeAorCQltb3YJMjU2KzgoJHNib3gpLCRtYXNrZmUKKwkJb3IJJXJieCwlcmF4CisJCW9yCSVyZHgsJXJjeAorCQltb3YJMjU2KzE2KCRzYm94KSwkbWFzazFiCitfX18KKwkJJmRlY3RyYW5zZm9ybSgxKTsKKyRjb2RlLj08PF9fXzsKKwlqbXAJLkxkZWNfbG9vcF9jb21wYWN0CisuYWxpZ24JMTYKKy5MZGVjX2NvbXBhY3RfZG9uZToKKwl4b3IJMCgka2V5KSwkczAKKwl4b3IJNCgka2V5KSwkczEKKwl4b3IJOCgka2V5KSwkczIKKwl4b3IJMTIoJGtleSksJHMzCisJLmJ5dGUJMHhmMywweGMzCQkJIyByZXAgcmV0Cisuc2l6ZQlfeDg2XzY0X0FFU19kZWNyeXB0X2NvbXBhY3QsLi1feDg2XzY0X0FFU19kZWNyeXB0X2NvbXBhY3QKK19fXworCisjIHZvaWQgQUVTX2RlY3J5cHQgKGNvbnN0IHZvaWQgKmlucCx2b2lkICpvdXQsY29uc3QgQUVTX0tFWSAqa2V5KTsKKyRjb2RlLj08PF9fXzsKKy5nbG9ibAlBRVNfZGVjcnlwdAorLnR5cGUJQUVTX2RlY3J5cHQsXEBmdW5jdGlvbiwzCisuYWxpZ24JMTYKKy5nbG9ibAlhc21fQUVTX2RlY3J5cHQKKy5oaWRkZW4JYXNtX0FFU19kZWNyeXB0Cithc21fQUVTX2RlY3J5cHQ6CitBRVNfZGVjcnlwdDoKKwlwdXNoCSVyYngKKwlwdXNoCSVyYnAKKwlwdXNoCSVyMTIKKwlwdXNoCSVyMTMKKwlwdXNoCSVyMTQKKwlwdXNoCSVyMTUKKworCSMgYWxsb2NhdGUgZnJhbWUgImFib3ZlIiBrZXkgc2NoZWR1bGUKKwltb3YJJXJzcCwlcjEwCisJbGVhCS02MyglcmR4KSwlcmN4CSMgJXJkeCBpcyBrZXkgYXJndW1lbnQKKwlhbmQJXCQtNjQsJXJzcAorCXN1YgklcnNwLCVyY3gKKwluZWcJJXJjeAorCWFuZAlcJDB4M2MwLCVyY3gKKwlzdWIJJXJjeCwlcnNwCisJc3ViCVwkMzIsJXJzcAorCisJbW92CSVyc2ksMTYoJXJzcCkJIyBzYXZlIG91dAorCW1vdgklcjEwLDI0KCVyc3ApCSMgc2F2ZSByZWFsIHN0YWNrIHBvaW50ZXIKKy5MZGVjX3Byb2xvZ3VlOgorCisJbW92CSVyZHgsJGtleQorCW1vdgkyNDAoJGtleSksJHJuZHMJIyBsb2FkIHJvdW5kcworCisJbW92CTAoJXJkaSksJHMwCSMgbG9hZCBpbnB1dCB2ZWN0b3IKKwltb3YJNCglcmRpKSwkczEKKwltb3YJOCglcmRpKSwkczIKKwltb3YJMTIoJXJkaSksJHMzCisKKwlzaGwJXCQ0LCRybmRzCisJbGVhCSgka2V5LCRybmRzKSwlcmJwCisJbW92CSRrZXksKCVyc3ApCSMga2V5IHNjaGVkdWxlCisJbW92CSVyYnAsOCglcnNwKQkjIGVuZCBvZiBrZXkgc2NoZWR1bGUKKworCSMgcGljayBUZDQgY29weSB3aGljaCBjYW4ndCAib3ZlcmxhcCIgd2l0aCBzdGFjayBmcmFtZSBvciBrZXkgc2NoZWR1bGUKKwlsZWEJLkxBRVNfVGQrMjA0OCglcmlwKSwkc2JveAorCWxlYQk3NjgoJXJzcCksJXJicAorCXN1Ygkkc2JveCwlcmJwCisJYW5kCVwkMHgzMDAsJXJicAorCWxlYQkoJHNib3gsJXJicCksJHNib3gKKwlzaHIJXCQzLCVyYnAJIyByZWNhbGwgIm1hZ2ljIiBjb25zdGFudHMhCisJYWRkCSVyYnAsJHNib3gKKworCWNhbGwJX3g4Nl82NF9BRVNfZGVjcnlwdF9jb21wYWN0CisKKwltb3YJMTYoJXJzcCksJG91dAkjIHJlc3RvcmUgb3V0CisJbW92CTI0KCVyc3ApLCVyc2kJIyByZXN0b3JlIHNhdmVkIHN0YWNrIHBvaW50ZXIKKwltb3YJJHMwLDAoJG91dCkJIyB3cml0ZSBvdXRwdXQgdmVjdG9yCisJbW92CSRzMSw0KCRvdXQpCisJbW92CSRzMiw4KCRvdXQpCisJbW92CSRzMywxMigkb3V0KQorCisJbW92CSglcnNpKSwlcjE1CisJbW92CTgoJXJzaSksJXIxNAorCW1vdgkxNiglcnNpKSwlcjEzCisJbW92CTI0KCVyc2kpLCVyMTIKKwltb3YJMzIoJXJzaSksJXJicAorCW1vdgk0MCglcnNpKSwlcmJ4CisJbGVhCTQ4KCVyc2kpLCVyc3AKKy5MZGVjX2VwaWxvZ3VlOgorCXJldAorLnNpemUJQUVTX2RlY3J5cHQsLi1BRVNfZGVjcnlwdAorX19fCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIworCitzdWIgZW5ja2V5KCkKK3sKKyRjb2RlLj08PF9fXzsKKwltb3Z6CSVkbCwlZXNpCQkjIHJrW2ldPj4wCisJbW92emIJLTEyOCglcmJwLCVyc2kpLCVlYngKKwltb3Z6CSVkaCwlZXNpCQkjIHJrW2ldPj44CisJc2hsCVwkMjQsJWVieAorCXhvcgklZWJ4LCVlYXgKKworCW1vdnpiCS0xMjgoJXJicCwlcnNpKSwlZWJ4CisJc2hyCVwkMTYsJWVkeAorCW1vdnoJJWRsLCVlc2kJCSMgcmtbaV0+PjE2CisJeG9yCSVlYngsJWVheAorCisJbW92emIJLTEyOCglcmJwLCVyc2kpLCVlYngKKwltb3Z6CSVkaCwlZXNpCQkjIHJrW2ldPj4yNAorCXNobAlcJDgsJWVieAorCXhvcgklZWJ4LCVlYXgKKworCW1vdnpiCS0xMjgoJXJicCwlcnNpKSwlZWJ4CisJc2hsCVwkMTYsJWVieAorCXhvcgklZWJ4LCVlYXgKKworCXhvcgkxMDI0LTEyOCglcmJwLCVyY3gsNCksJWVheAkJIyByY29uCitfX18KK30KKworIyBpbnQgQUVTX3NldF9lbmNyeXB0X2tleShjb25zdCB1bnNpZ25lZCBjaGFyICp1c2VyS2V5LCBjb25zdCBpbnQgYml0cywgQUVTX0tFWSAqa2V5KQorJGNvZGUuPTw8X19fOworLmdsb2JsCUFFU19zZXRfZW5jcnlwdF9rZXkKKy50eXBlCUFFU19zZXRfZW5jcnlwdF9rZXksXEBmdW5jdGlvbiwzCisuYWxpZ24JMTYKK0FFU19zZXRfZW5jcnlwdF9rZXk6CisJcHVzaAklcmJ4CisJcHVzaAklcmJwCisJcHVzaAklcjEyCQkJIyByZWR1bmRhbnQsIGJ1dCBhbGxvd3MgdG8gc2hhcmUgCisJcHVzaAklcjEzCQkJIyBleGNlcHRpb24gaGFuZGxlci4uLgorCXB1c2gJJXIxNAorCXB1c2gJJXIxNQorCXN1YglcJDgsJXJzcAorLkxlbmNfa2V5X3Byb2xvZ3VlOgorCisJY2FsbAlfeDg2XzY0X0FFU19zZXRfZW5jcnlwdF9rZXkKKworCW1vdgk0MCglcnNwKSwlcmJwCisJbW92CTQ4KCVyc3ApLCVyYngKKwlhZGQJXCQ1NiwlcnNwCisuTGVuY19rZXlfZXBpbG9ndWU6CisJcmV0Cisuc2l6ZQlBRVNfc2V0X2VuY3J5cHRfa2V5LC4tQUVTX3NldF9lbmNyeXB0X2tleQorCisudHlwZQlfeDg2XzY0X0FFU19zZXRfZW5jcnlwdF9rZXksXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2CitfeDg2XzY0X0FFU19zZXRfZW5jcnlwdF9rZXk6CisJbW92CSVlc2ksJWVjeAkJCSMgJWVjeD1iaXRzCisJbW92CSVyZGksJXJzaQkJCSMgJXJzaT11c2VyS2V5CisJbW92CSVyZHgsJXJkaQkJCSMgJXJkaT1rZXkKKworCXRlc3QJXCQtMSwlcnNpCisJanoJLkxiYWRwb2ludGVyCisJdGVzdAlcJC0xLCVyZGkKKwlqegkuTGJhZHBvaW50ZXIKKworCWxlYQkuTEFFU19UZSglcmlwKSwlcmJwCisJbGVhCTIwNDgrMTI4KCVyYnApLCVyYnAKKworCSMgcHJlZmV0Y2ggVGU0CisJbW92CTAtMTI4KCVyYnApLCVlYXgKKwltb3YJMzItMTI4KCVyYnApLCVlYngKKwltb3YJNjQtMTI4KCVyYnApLCVyOGQKKwltb3YJOTYtMTI4KCVyYnApLCVlZHgKKwltb3YJMTI4LTEyOCglcmJwKSwlZWF4CisJbW92CTE2MC0xMjgoJXJicCksJWVieAorCW1vdgkxOTItMTI4KCVyYnApLCVyOGQKKwltb3YJMjI0LTEyOCglcmJwKSwlZWR4CisKKwljbXAJXCQxMjgsJWVjeAorCWplCS5MMTByb3VuZHMKKwljbXAJXCQxOTIsJWVjeAorCWplCS5MMTJyb3VuZHMKKwljbXAJXCQyNTYsJWVjeAorCWplCS5MMTRyb3VuZHMKKwltb3YJXCQtMiwlcmF4CQkJIyBpbnZhbGlkIG51bWJlciBvZiBiaXRzCisJam1wCS5MZXhpdAorCisuTDEwcm91bmRzOgorCW1vdgkwKCVyc2kpLCVyYXgJCQkjIGNvcHkgZmlyc3QgNCBkd29yZHMKKwltb3YJOCglcnNpKSwlcmR4CisJbW92CSVyYXgsMCglcmRpKQorCW1vdgklcmR4LDgoJXJkaSkKKworCXNocglcJDMyLCVyZHgKKwl4b3IJJWVjeCwlZWN4CisJam1wCS5MMTBzaG9ydGN1dAorLmFsaWduCTQKKy5MMTBsb29wOgorCQltb3YJMCglcmRpKSwlZWF4CQkJIyBya1swXQorCQltb3YJMTIoJXJkaSksJWVkeAkJCSMgcmtbM10KKy5MMTBzaG9ydGN1dDoKK19fXworCQkmZW5ja2V5CSgpOworJGNvZGUuPTw8X19fOworCQltb3YJJWVheCwxNiglcmRpKQkJCSMgcmtbNF0KKwkJeG9yCTQoJXJkaSksJWVheAorCQltb3YJJWVheCwyMCglcmRpKQkJCSMgcmtbNV0KKwkJeG9yCTgoJXJkaSksJWVheAorCQltb3YJJWVheCwyNCglcmRpKQkJCSMgcmtbNl0KKwkJeG9yCTEyKCVyZGkpLCVlYXgKKwkJbW92CSVlYXgsMjgoJXJkaSkJCQkjIHJrWzddCisJCWFkZAlcJDEsJWVjeAorCQlsZWEJMTYoJXJkaSksJXJkaQorCQljbXAJXCQxMCwlZWN4CisJamwJLkwxMGxvb3AKKworCW1vdmwJXCQxMCw4MCglcmRpKQkJCSMgc2V0dXAgbnVtYmVyIG9mIHJvdW5kcworCXhvcgklcmF4LCVyYXgKKwlqbXAJLkxleGl0CisKKy5MMTJyb3VuZHM6CisJbW92CTAoJXJzaSksJXJheAkJCSMgY29weSBmaXJzdCA2IGR3b3JkcworCW1vdgk4KCVyc2kpLCVyYngKKwltb3YJMTYoJXJzaSksJXJkeAorCW1vdgklcmF4LDAoJXJkaSkKKwltb3YJJXJieCw4KCVyZGkpCisJbW92CSVyZHgsMTYoJXJkaSkKKworCXNocglcJDMyLCVyZHgKKwl4b3IJJWVjeCwlZWN4CisJam1wCS5MMTJzaG9ydGN1dAorLmFsaWduCTQKKy5MMTJsb29wOgorCQltb3YJMCglcmRpKSwlZWF4CQkJIyBya1swXQorCQltb3YJMjAoJXJkaSksJWVkeAkJCSMgcmtbNV0KKy5MMTJzaG9ydGN1dDoKK19fXworCQkmZW5ja2V5CSgpOworJGNvZGUuPTw8X19fOworCQltb3YJJWVheCwyNCglcmRpKQkJCSMgcmtbNl0KKwkJeG9yCTQoJXJkaSksJWVheAorCQltb3YJJWVheCwyOCglcmRpKQkJCSMgcmtbN10KKwkJeG9yCTgoJXJkaSksJWVheAorCQltb3YJJWVheCwzMiglcmRpKQkJCSMgcmtbOF0KKwkJeG9yCTEyKCVyZGkpLCVlYXgKKwkJbW92CSVlYXgsMzYoJXJkaSkJCQkjIHJrWzldCisKKwkJY21wCVwkNywlZWN4CisJCWplCS5MMTJicmVhaworCQlhZGQJXCQxLCVlY3gKKworCQl4b3IJMTYoJXJkaSksJWVheAorCQltb3YJJWVheCw0MCglcmRpKQkJCSMgcmtbMTBdCisJCXhvcgkyMCglcmRpKSwlZWF4CisJCW1vdgklZWF4LDQ0KCVyZGkpCQkJIyBya1sxMV0KKworCQlsZWEJMjQoJXJkaSksJXJkaQorCWptcAkuTDEybG9vcAorLkwxMmJyZWFrOgorCW1vdmwJXCQxMiw3MiglcmRpKQkJIyBzZXR1cCBudW1iZXIgb2Ygcm91bmRzCisJeG9yCSVyYXgsJXJheAorCWptcAkuTGV4aXQKKworLkwxNHJvdW5kczoJCQorCW1vdgkwKCVyc2kpLCVyYXgJCQkjIGNvcHkgZmlyc3QgOCBkd29yZHMKKwltb3YJOCglcnNpKSwlcmJ4CisJbW92CTE2KCVyc2kpLCVyY3gKKwltb3YJMjQoJXJzaSksJXJkeAorCW1vdgklcmF4LDAoJXJkaSkKKwltb3YJJXJieCw4KCVyZGkpCisJbW92CSVyY3gsMTYoJXJkaSkKKwltb3YJJXJkeCwyNCglcmRpKQorCisJc2hyCVwkMzIsJXJkeAorCXhvcgklZWN4LCVlY3gKKwlqbXAJLkwxNHNob3J0Y3V0CisuYWxpZ24JNAorLkwxNGxvb3A6CisJCW1vdgkwKCVyZGkpLCVlYXgJCQkjIHJrWzBdCisJCW1vdgkyOCglcmRpKSwlZWR4CQkJIyBya1s0XQorLkwxNHNob3J0Y3V0OgorX19fCisJCSZlbmNrZXkJKCk7CiskY29kZS49PDxfX187CisJCW1vdgklZWF4LDMyKCVyZGkpCQkJIyBya1s4XQorCQl4b3IJNCglcmRpKSwlZWF4CisJCW1vdgklZWF4LDM2KCVyZGkpCQkJIyBya1s5XQorCQl4b3IJOCglcmRpKSwlZWF4CisJCW1vdgklZWF4LDQwKCVyZGkpCQkJIyBya1sxMF0KKwkJeG9yCTEyKCVyZGkpLCVlYXgKKwkJbW92CSVlYXgsNDQoJXJkaSkJCQkjIHJrWzExXQorCisJCWNtcAlcJDYsJWVjeAorCQlqZQkuTDE0YnJlYWsKKwkJYWRkCVwkMSwlZWN4CisKKwkJbW92CSVlYXgsJWVkeAorCQltb3YJMTYoJXJkaSksJWVheAkJCSMgcmtbNF0KKwkJbW92egklZGwsJWVzaQkJCSMgcmtbMTFdPj4wCisJCW1vdnpiCS0xMjgoJXJicCwlcnNpKSwlZWJ4CisJCW1vdnoJJWRoLCVlc2kJCQkjIHJrWzExXT4+OAorCQl4b3IJJWVieCwlZWF4CisKKwkJbW92emIJLTEyOCglcmJwLCVyc2kpLCVlYngKKwkJc2hyCVwkMTYsJWVkeAorCQlzaGwJXCQ4LCVlYngKKwkJbW92egklZGwsJWVzaQkJCSMgcmtbMTFdPj4xNgorCQl4b3IJJWVieCwlZWF4CisKKwkJbW92emIJLTEyOCglcmJwLCVyc2kpLCVlYngKKwkJbW92egklZGgsJWVzaQkJCSMgcmtbMTFdPj4yNAorCQlzaGwJXCQxNiwlZWJ4CisJCXhvcgklZWJ4LCVlYXgKKworCQltb3Z6YgktMTI4KCVyYnAsJXJzaSksJWVieAorCQlzaGwJXCQyNCwlZWJ4CisJCXhvcgklZWJ4LCVlYXgKKworCQltb3YJJWVheCw0OCglcmRpKQkJCSMgcmtbMTJdCisJCXhvcgkyMCglcmRpKSwlZWF4CisJCW1vdgklZWF4LDUyKCVyZGkpCQkJIyBya1sxM10KKwkJeG9yCTI0KCVyZGkpLCVlYXgKKwkJbW92CSVlYXgsNTYoJXJkaSkJCQkjIHJrWzE0XQorCQl4b3IJMjgoJXJkaSksJWVheAorCQltb3YJJWVheCw2MCglcmRpKQkJCSMgcmtbMTVdCisKKwkJbGVhCTMyKCVyZGkpLCVyZGkKKwlqbXAJLkwxNGxvb3AKKy5MMTRicmVhazoKKwltb3ZsCVwkMTQsNDgoJXJkaSkJCSMgc2V0dXAgbnVtYmVyIG9mIHJvdW5kcworCXhvcgklcmF4LCVyYXgKKwlqbXAJLkxleGl0CisKKy5MYmFkcG9pbnRlcjoKKwltb3YJXCQtMSwlcmF4CisuTGV4aXQ6CisJLmJ5dGUJMHhmMywweGMzCQkJIyByZXAgcmV0Cisuc2l6ZQlfeDg2XzY0X0FFU19zZXRfZW5jcnlwdF9rZXksLi1feDg2XzY0X0FFU19zZXRfZW5jcnlwdF9rZXkKK19fXworCitzdWIgZGVja2V5X3JlZigpCit7IG15ICgkaSwkcHRyLCR0ZSwkdGQpID0gQF87CisgIG15ICgkdHAxLCR0cDIsJHRwNCwkdHA4LCRhY2MpPSgiJWVheCIsIiVlYngiLCIlZWRpIiwiJWVkeCIsIiVyOGQiKTsKKyRjb2RlLj08PF9fXzsKKwltb3YJJGkoJHB0ciksJHRwMQorCW1vdgkkdHAxLCRhY2MKKwlhbmQJXCQweDgwODA4MDgwLCRhY2MKKwltb3YJJGFjYywkdHA0CisJc2hyCVwkNywkdHA0CisJbGVhCTAoJHRwMSwkdHAxKSwkdHAyCisJc3ViCSR0cDQsJGFjYworCWFuZAlcJDB4ZmVmZWZlZmUsJHRwMgorCWFuZAlcJDB4MWIxYjFiMWIsJGFjYworCXhvcgkkdHAyLCRhY2MKKwltb3YJJGFjYywkdHAyCisKKwlhbmQJXCQweDgwODA4MDgwLCRhY2MKKwltb3YJJGFjYywkdHA4CisJc2hyCVwkNywkdHA4CisJbGVhCTAoJHRwMiwkdHAyKSwkdHA0CisJc3ViCSR0cDgsJGFjYworCWFuZAlcJDB4ZmVmZWZlZmUsJHRwNAorCWFuZAlcJDB4MWIxYjFiMWIsJGFjYworCSB4b3IJJHRwMSwkdHAyCQkjIHRwMl50cDEKKwl4b3IJJHRwNCwkYWNjCisJbW92CSRhY2MsJHRwNAorCisJYW5kCVwkMHg4MDgwODA4MCwkYWNjCisJbW92CSRhY2MsJHRwOAorCXNocglcJDcsJHRwOAorCXN1YgkkdHA4LCRhY2MKKwlsZWEJMCgkdHA0LCR0cDQpLCR0cDgKKwkgeG9yCSR0cDEsJHRwNAkJIyB0cDRedHAxCisJYW5kCVwkMHhmZWZlZmVmZSwkdHA4CisJYW5kCVwkMHgxYjFiMWIxYiwkYWNjCisJeG9yCSRhY2MsJHRwOAorCisJeG9yCSR0cDgsJHRwMQkJIyB0cDFedHA4CisJcm9sCVwkOCwkdHAxCQkjIFJPVEFURSh0cDFedHA4LDgpCisJeG9yCSR0cDgsJHRwMgkJIyB0cDJedHAxXnRwOAorCXhvcgkkdHA4LCR0cDQJCSMgdHA0XnRwMV50cDgKKwl4b3IJJHRwMiwkdHA4CisJeG9yCSR0cDQsJHRwOAkJIyB0cDheKHRwOF50cDRedHAxKV4odHA4XnRwMl50cDEpPXRwOF50cDRedHAyCisKKwl4b3IJJHRwOCwkdHAxCisJcm9sCVwkMjQsJHRwMgkJIyBST1RBVEUodHAyXnRwMV50cDgsMjQpCisJeG9yCSR0cDIsJHRwMQorCXJvbAlcJDE2LCR0cDQJCSMgUk9UQVRFKHRwNF50cDFedHA4LDE2KQorCXhvcgkkdHA0LCR0cDEKKworCW1vdgkkdHAxLCRpKCRwdHIpCitfX18KK30KKworIyBpbnQgQUVTX3NldF9kZWNyeXB0X2tleShjb25zdCB1bnNpZ25lZCBjaGFyICp1c2VyS2V5LCBjb25zdCBpbnQgYml0cywgQUVTX0tFWSAqa2V5KQorJGNvZGUuPTw8X19fOworLmdsb2JsCUFFU19zZXRfZGVjcnlwdF9rZXkKKy50eXBlCUFFU19zZXRfZGVjcnlwdF9rZXksXEBmdW5jdGlvbiwzCisuYWxpZ24JMTYKK0FFU19zZXRfZGVjcnlwdF9rZXk6CisJcHVzaAklcmJ4CisJcHVzaAklcmJwCisJcHVzaAklcjEyCisJcHVzaAklcjEzCisJcHVzaAklcjE0CisJcHVzaAklcjE1CisJcHVzaAklcmR4CQkJIyBzYXZlIGtleSBzY2hlZHVsZQorLkxkZWNfa2V5X3Byb2xvZ3VlOgorCisJY2FsbAlfeDg2XzY0X0FFU19zZXRfZW5jcnlwdF9rZXkKKwltb3YJKCVyc3ApLCVyOAkJIyByZXN0b3JlIGtleSBzY2hlZHVsZQorCWNtcAlcJDAsJWVheAorCWpuZQkuTGFib3J0CisKKwltb3YJMjQwKCVyOCksJXIxNGQJCSMgcHVsbCBudW1iZXIgb2Ygcm91bmRzCisJeG9yCSVyZGksJXJkaQorCWxlYQkoJXJkaSwlcjE0ZCw0KSwlcmN4CisJbW92CSVyOCwlcnNpCisJbGVhCSglcjgsJXJjeCw0KSwlcmRpCSMgcG9pbnRlciB0byBsYXN0IGNodW5rCisuYWxpZ24JNAorLkxpbnZlcnQ6CisJCW1vdgkwKCVyc2kpLCVyYXgKKwkJbW92CTgoJXJzaSksJXJieAorCQltb3YJMCglcmRpKSwlcmN4CisJCW1vdgk4KCVyZGkpLCVyZHgKKwkJbW92CSVyYXgsMCglcmRpKQorCQltb3YJJXJieCw4KCVyZGkpCisJCW1vdgklcmN4LDAoJXJzaSkKKwkJbW92CSVyZHgsOCglcnNpKQorCQlsZWEJMTYoJXJzaSksJXJzaQorCQlsZWEJLTE2KCVyZGkpLCVyZGkKKwkJY21wCSVyc2ksJXJkaQorCWpuZQkuTGludmVydAorCisJbGVhCS5MQUVTX1RlKzIwNDgrMTAyNCglcmlwKSwlcmF4CSMgcmNvbgorCisJbW92CTQwKCVyYXgpLCRtYXNrODAKKwltb3YJNDgoJXJheCksJG1hc2tmZQorCW1vdgk1NiglcmF4KSwkbWFzazFiCisKKwltb3YJJXI4LCRrZXkKKwlzdWIJXCQxLCVyMTRkCisuYWxpZ24JNAorLkxwZXJtdXRlOgorCQlsZWEJMTYoJGtleSksJGtleQorCQltb3YJMCgka2V5KSwlcmF4CisJCW1vdgk4KCRrZXkpLCVyY3gKK19fXworCQkmZGVjdHJhbnNmb3JtICgpOworJGNvZGUuPTw8X19fOworCQltb3YJJWVheCwwKCRrZXkpCisJCW1vdgklZWJ4LDQoJGtleSkKKwkJbW92CSVlY3gsOCgka2V5KQorCQltb3YJJWVkeCwxMigka2V5KQorCQlzdWIJXCQxLCVyMTRkCisJam56CS5McGVybXV0ZQorCisJeG9yCSVyYXgsJXJheAorLkxhYm9ydDoKKwltb3YJOCglcnNwKSwlcjE1CisJbW92CTE2KCVyc3ApLCVyMTQKKwltb3YJMjQoJXJzcCksJXIxMworCW1vdgkzMiglcnNwKSwlcjEyCisJbW92CTQwKCVyc3ApLCVyYnAKKwltb3YJNDgoJXJzcCksJXJieAorCWFkZAlcJDU2LCVyc3AKKy5MZGVjX2tleV9lcGlsb2d1ZToKKwlyZXQKKy5zaXplCUFFU19zZXRfZGVjcnlwdF9rZXksLi1BRVNfc2V0X2RlY3J5cHRfa2V5CitfX18KKworIyB2b2lkIEFFU19jYmNfZW5jcnlwdCAoY29uc3Qgdm9pZCBjaGFyICppbnAsIHVuc2lnbmVkIGNoYXIgKm91dCwKKyMJCQlzaXplX3QgbGVuZ3RoLCBjb25zdCBBRVNfS0VZICprZXksCisjCQkJdW5zaWduZWQgY2hhciAqaXZwLGNvbnN0IGludCBlbmMpOworeworIyBzdGFjayBmcmFtZSBsYXlvdXQKKyMgLTgoJXJzcCkJCXJldHVybiBhZGRyZXNzCitteSAka2V5cD0iMCglcnNwKSI7CQkjIG9uZSB0byBwYXNzIGFzICRrZXkKK215ICRrZXllbmQ9IjgoJXJzcCkiOwkJIyAmKGtleXAtPnJkX2tleVs0KmtleXAtPnJvdW5kc10pCitteSAkX3JzcD0iMTYoJXJzcCkiOwkJIyBzYXZlZCAlcnNwCitteSAkX2lucD0iMjQoJXJzcCkiOwkJIyBjb3B5IG9mIDFzdCBwYXJhbWV0ZXIsIGlucAorbXkgJF9vdXQ9IjMyKCVyc3ApIjsJCSMgY29weSBvZiAybmQgcGFyYW1ldGVyLCBvdXQKK215ICRfbGVuPSI0MCglcnNwKSI7CQkjIGNvcHkgb2YgM3JkIHBhcmFtZXRlciwgbGVuZ3RoCitteSAkX2tleT0iNDgoJXJzcCkiOwkJIyBjb3B5IG9mIDR0aCBwYXJhbWV0ZXIsIGtleQorbXkgJF9pdnA9IjU2KCVyc3ApIjsJCSMgY29weSBvZiA1dGggcGFyYW1ldGVyLCBpdnAKK215ICRpdmVjPSI2NCglcnNwKSI7CQkjIGl2ZWNbMTZdCitteSAkYWVzX2tleT0iODAoJXJzcCkiOwkJIyBjb3B5IG9mIGFlc19rZXkKK215ICRtYXJrPSI4MCsyNDAoJXJzcCkiOwkjIGNvcHkgb2YgYWVzX2tleS0+cm91bmRzCisKKyRjb2RlLj08PF9fXzsKKy5nbG9ibAlBRVNfY2JjX2VuY3J5cHQKKy50eXBlCUFFU19jYmNfZW5jcnlwdCxcQGZ1bmN0aW9uLDYKKy5hbGlnbgkxNgorLmV4dGVybglPUEVOU1NMX2lhMzJjYXBfUAorLmdsb2JsCWFzbV9BRVNfY2JjX2VuY3J5cHQKKy5oaWRkZW4JYXNtX0FFU19jYmNfZW5jcnlwdAorYXNtX0FFU19jYmNfZW5jcnlwdDoKK0FFU19jYmNfZW5jcnlwdDoKKwljbXAJXCQwLCVyZHgJIyBjaGVjayBsZW5ndGgKKwlqZQkuTGNiY19lcGlsb2d1ZQorCXB1c2hmcQorCXB1c2gJJXJieAorCXB1c2gJJXJicAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCXB1c2gJJXIxNQorLkxjYmNfcHJvbG9ndWU6CisKKwljbGQKKwltb3YJJXI5ZCwlcjlkCSMgY2xlYXIgdXBwZXIgaGFsZiBvZiBlbmMKKworCWxlYQkuTEFFU19UZSglcmlwKSwkc2JveAorCWNtcAlcJDAsJXI5CisJam5lCS5MY2JjX3BpY2tlZF90ZQorCWxlYQkuTEFFU19UZCglcmlwKSwkc2JveAorLkxjYmNfcGlja2VkX3RlOgorCisJbW92CU9QRU5TU0xfaWEzMmNhcF9QKCVyaXApLCVyMTBkCisJY21wCVwkJHNwZWVkX2xpbWl0LCVyZHgKKwlqYgkuTGNiY19zbG93X3Byb2xvZ3VlCisJdGVzdAlcJDE1LCVyZHgKKwlqbnoJLkxjYmNfc2xvd19wcm9sb2d1ZQorCWJ0CVwkMjgsJXIxMGQKKwlqYwkuTGNiY19zbG93X3Byb2xvZ3VlCisKKwkjIGFsbG9jYXRlIGFsaWduZWQgc3RhY2sgZnJhbWUuLi4KKwlsZWEJLTg4LTI0OCglcnNwKSwka2V5CisJYW5kCVwkLTY0LCRrZXkKKworCSMgLi4uIGFuZCBtYWtlIHN1cmUgaXQgZG9lc24ndCBhbGlhcyB3aXRoIEFFU19UW2VkXSBtb2R1bG8gNDA5NgorCW1vdgkkc2JveCwlcjEwCisJbGVhCTIzMDQoJHNib3gpLCVyMTEKKwltb3YJJGtleSwlcjEyCisJYW5kCVwkMHhGRkYsJXIxMAkjIHMgPSAkc2JveCYweGZmZgorCWFuZAlcJDB4RkZGLCVyMTEJIyBlID0gKCRzYm94KzIwNDgpJjB4ZmZmCisJYW5kCVwkMHhGRkYsJXIxMgkjIHAgPSAlcnNwJjB4ZmZmCisKKwljbXAJJXIxMSwlcjEyCSMgaWYgKHA9PmUpICVyc3AgPS0gKHAtZSk7CisJamIJLkxjYmNfdGVfYnJlYWtfb3V0CisJc3ViCSVyMTEsJXIxMgorCXN1YgklcjEyLCRrZXkKKwlqbXAJLkxjYmNfdGVfb2sKKy5MY2JjX3RlX2JyZWFrX291dDoJCSMgZWxzZSAlcnNwIC09IChwLXMpJjB4ZmZmICsgZnJhbWVzegorCXN1YgklcjEwLCVyMTIKKwlhbmQJXCQweEZGRiwlcjEyCisJYWRkCVwkMzIwLCVyMTIKKwlzdWIJJXIxMiwka2V5CisuYWxpZ24JNAorLkxjYmNfdGVfb2s6CisKKwl4Y2hnCSVyc3AsJGtleQorCSNhZGQJXCQ4LCVyc3AJIyByZXNlcnZlIGZvciByZXR1cm4gYWRkcmVzcyEKKwltb3YJJGtleSwkX3JzcAkjIHNhdmUgJXJzcAorLkxjYmNfZmFzdF9ib2R5OgorCW1vdgklcmRpLCRfaW5wCSMgc2F2ZSBjb3B5IG9mIGlucAorCW1vdgklcnNpLCRfb3V0CSMgc2F2ZSBjb3B5IG9mIG91dAorCW1vdgklcmR4LCRfbGVuCSMgc2F2ZSBjb3B5IG9mIGxlbgorCW1vdgklcmN4LCRfa2V5CSMgc2F2ZSBjb3B5IG9mIGtleQorCW1vdgklcjgsJF9pdnAJIyBzYXZlIGNvcHkgb2YgaXZwCisJbW92bAlcJDAsJG1hcmsJIyBjb3B5IG9mIGFlc19rZXktPnJvdW5kcyA9IDA7CisJbW92CSVyOCwlcmJwCSMgcmVhcnJhbmdlIGlucHV0IGFyZ3VtZW50cworCW1vdgklcjksJXJieAorCW1vdgklcnNpLCRvdXQKKwltb3YJJXJkaSwkaW5wCisJbW92CSVyY3gsJGtleQorCisJbW92CTI0MCgka2V5KSwlZWF4CQkjIGtleS0+cm91bmRzCisJIyBkbyB3ZSBjb3B5IGtleSBzY2hlZHVsZSB0byBzdGFjaz8KKwltb3YJJGtleSwlcjEwCisJc3ViCSRzYm94LCVyMTAKKwlhbmQJXCQweGZmZiwlcjEwCisJY21wCVwkMjMwNCwlcjEwCisJamIJLkxjYmNfZG9fZWNvcHkKKwljbXAJXCQ0MDk2LTI0OCwlcjEwCisJamIJLkxjYmNfc2tpcF9lY29weQorLmFsaWduCTQKKy5MY2JjX2RvX2Vjb3B5OgorCQltb3YJJGtleSwlcnNpCisJCWxlYQkkYWVzX2tleSwlcmRpCisJCWxlYQkkYWVzX2tleSwka2V5CisJCW1vdglcJDI0MC84LCVlY3gKKwkJLmxvbmcJMHg5MEE1NDhGMwkjIHJlcCBtb3ZzcQorCQltb3YJJWVheCwoJXJkaSkJIyBjb3B5IGFlc19rZXktPnJvdW5kcworLkxjYmNfc2tpcF9lY29weToKKwltb3YJJGtleSwka2V5cAkjIHNhdmUga2V5IHBvaW50ZXIKKworCW1vdglcJDE4LCVlY3gKKy5hbGlnbgk0CisuTGNiY19wcmVmZXRjaF90ZToKKwkJbW92CTAoJHNib3gpLCVyMTAKKwkJbW92CTMyKCRzYm94KSwlcjExCisJCW1vdgk2NCgkc2JveCksJXIxMgorCQltb3YJOTYoJHNib3gpLCVyMTMKKwkJbGVhCTEyOCgkc2JveCksJHNib3gKKwkJc3ViCVwkMSwlZWN4CisJam56CS5MY2JjX3ByZWZldGNoX3RlCisJbGVhCS0yMzA0KCRzYm94KSwkc2JveAorCisJY21wCVwkMCwlcmJ4CisJamUJLkxGQVNUX0RFQ1JZUFQKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVOQ1JZUFQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCisJbW92CTAoJXJicCksJHMwCQkjIGxvYWQgaXYKKwltb3YJNCglcmJwKSwkczEKKwltb3YJOCglcmJwKSwkczIKKwltb3YJMTIoJXJicCksJHMzCisKKy5hbGlnbgk0CisuTGNiY19mYXN0X2VuY19sb29wOgorCQl4b3IJMCgkaW5wKSwkczAKKwkJeG9yCTQoJGlucCksJHMxCisJCXhvcgk4KCRpbnApLCRzMgorCQl4b3IJMTIoJGlucCksJHMzCisJCW1vdgkka2V5cCwka2V5CSMgcmVzdG9yZSBrZXkKKwkJbW92CSRpbnAsJF9pbnAJIyBpZiAoJHZlcnRpY2Fsc3Bpbikgc2F2ZSBpbnAKKworCQljYWxsCV94ODZfNjRfQUVTX2VuY3J5cHQKKworCQltb3YJJF9pbnAsJGlucAkjIGlmICgkdmVydGljYWxzcGluKSByZXN0b3JlIGlucAorCQltb3YJJF9sZW4sJXIxMAorCQltb3YJJHMwLDAoJG91dCkKKwkJbW92CSRzMSw0KCRvdXQpCisJCW1vdgkkczIsOCgkb3V0KQorCQltb3YJJHMzLDEyKCRvdXQpCisKKwkJbGVhCTE2KCRpbnApLCRpbnAKKwkJbGVhCTE2KCRvdXQpLCRvdXQKKwkJc3ViCVwkMTYsJXIxMAorCQl0ZXN0CVwkLTE2LCVyMTAKKwkJbW92CSVyMTAsJF9sZW4KKwlqbnoJLkxjYmNfZmFzdF9lbmNfbG9vcAorCW1vdgkkX2l2cCwlcmJwCSMgcmVzdG9yZSBpdnAKKwltb3YJJHMwLDAoJXJicCkJIyBzYXZlIGl2ZWMKKwltb3YJJHMxLDQoJXJicCkKKwltb3YJJHMyLDgoJXJicCkKKwltb3YJJHMzLDEyKCVyYnApCisKKwlqbXAJLkxjYmNfZmFzdF9jbGVhbnVwCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBERUNSWVBUIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIworLmFsaWduCTE2CisuTEZBU1RfREVDUllQVDoKKwljbXAJJGlucCwkb3V0CisJamUJLkxjYmNfZmFzdF9kZWNfaW5fcGxhY2UKKworCW1vdgklcmJwLCRpdmVjCisuYWxpZ24JNAorLkxjYmNfZmFzdF9kZWNfbG9vcDoKKwkJbW92CTAoJGlucCksJHMwCSMgcmVhZCBpbnB1dAorCQltb3YJNCgkaW5wKSwkczEKKwkJbW92CTgoJGlucCksJHMyCisJCW1vdgkxMigkaW5wKSwkczMKKwkJbW92CSRrZXlwLCRrZXkJIyByZXN0b3JlIGtleQorCQltb3YJJGlucCwkX2lucAkjIGlmICgkdmVydGljYWxzcGluKSBzYXZlIGlucAorCisJCWNhbGwJX3g4Nl82NF9BRVNfZGVjcnlwdAorCisJCW1vdgkkaXZlYywlcmJwCSMgbG9hZCBpdnAKKwkJbW92CSRfaW5wLCRpbnAJIyBpZiAoJHZlcnRpY2Fsc3BpbikgcmVzdG9yZSBpbnAKKwkJbW92CSRfbGVuLCVyMTAJIyBsb2FkIGxlbgorCQl4b3IJMCglcmJwKSwkczAJIyB4b3IgaXYKKwkJeG9yCTQoJXJicCksJHMxCisJCXhvcgk4KCVyYnApLCRzMgorCQl4b3IJMTIoJXJicCksJHMzCisJCW1vdgkkaW5wLCVyYnAJIyBjdXJyZW50IGlucHV0LCBuZXh0IGl2CisKKwkJc3ViCVwkMTYsJXIxMAorCQltb3YJJXIxMCwkX2xlbgkjIHVwZGF0ZSBsZW4KKwkJbW92CSVyYnAsJGl2ZWMJIyB1cGRhdGUgaXZwCisKKwkJbW92CSRzMCwwKCRvdXQpCSMgd3JpdGUgb3V0cHV0CisJCW1vdgkkczEsNCgkb3V0KQorCQltb3YJJHMyLDgoJG91dCkKKwkJbW92CSRzMywxMigkb3V0KQorCisJCWxlYQkxNigkaW5wKSwkaW5wCisJCWxlYQkxNigkb3V0KSwkb3V0CisJam56CS5MY2JjX2Zhc3RfZGVjX2xvb3AKKwltb3YJJF9pdnAsJXIxMgkJIyBsb2FkIHVzZXIgaXZwCisJbW92CTAoJXJicCksJXIxMAkJIyBsb2FkIGl2CisJbW92CTgoJXJicCksJXIxMQorCW1vdgklcjEwLDAoJXIxMikJCSMgY29weSBiYWNrIHRvIHVzZXIKKwltb3YJJXIxMSw4KCVyMTIpCisJam1wCS5MY2JjX2Zhc3RfY2xlYW51cAorCisuYWxpZ24JMTYKKy5MY2JjX2Zhc3RfZGVjX2luX3BsYWNlOgorCW1vdgkwKCVyYnApLCVyMTAJCSMgY29weSBpdiB0byBzdGFjaworCW1vdgk4KCVyYnApLCVyMTEKKwltb3YJJXIxMCwwKyRpdmVjCisJbW92CSVyMTEsOCskaXZlYworLmFsaWduCTQKKy5MY2JjX2Zhc3RfZGVjX2luX3BsYWNlX2xvb3A6CisJCW1vdgkwKCRpbnApLCRzMAkjIGxvYWQgaW5wdXQKKwkJbW92CTQoJGlucCksJHMxCisJCW1vdgk4KCRpbnApLCRzMgorCQltb3YJMTIoJGlucCksJHMzCisJCW1vdgkka2V5cCwka2V5CSMgcmVzdG9yZSBrZXkKKwkJbW92CSRpbnAsJF9pbnAJIyBpZiAoJHZlcnRpY2Fsc3Bpbikgc2F2ZSBpbnAKKworCQljYWxsCV94ODZfNjRfQUVTX2RlY3J5cHQKKworCQltb3YJJF9pbnAsJGlucAkjIGlmICgkdmVydGljYWxzcGluKSByZXN0b3JlIGlucAorCQltb3YJJF9sZW4sJXIxMAorCQl4b3IJMCskaXZlYywkczAKKwkJeG9yCTQrJGl2ZWMsJHMxCisJCXhvcgk4KyRpdmVjLCRzMgorCQl4b3IJMTIrJGl2ZWMsJHMzCisKKwkJbW92CTAoJGlucCksJXIxMQkjIGxvYWQgaW5wdXQKKwkJbW92CTgoJGlucCksJXIxMgorCQlzdWIJXCQxNiwlcjEwCisJCWp6CS5MY2JjX2Zhc3RfZGVjX2luX3BsYWNlX2RvbmUKKworCQltb3YJJXIxMSwwKyRpdmVjCSMgY29weSBpbnB1dCB0byBpdgorCQltb3YJJXIxMiw4KyRpdmVjCisKKwkJbW92CSRzMCwwKCRvdXQpCSMgc2F2ZSBvdXRwdXQgW3phcHMgaW5wdXRdCisJCW1vdgkkczEsNCgkb3V0KQorCQltb3YJJHMyLDgoJG91dCkKKwkJbW92CSRzMywxMigkb3V0KQorCisJCWxlYQkxNigkaW5wKSwkaW5wCisJCWxlYQkxNigkb3V0KSwkb3V0CisJCW1vdgklcjEwLCRfbGVuCisJam1wCS5MY2JjX2Zhc3RfZGVjX2luX3BsYWNlX2xvb3AKKy5MY2JjX2Zhc3RfZGVjX2luX3BsYWNlX2RvbmU6CisJbW92CSRfaXZwLCVyZGkKKwltb3YJJXIxMSwwKCVyZGkpCSMgY29weSBpdiBiYWNrIHRvIHVzZXIKKwltb3YJJXIxMiw4KCVyZGkpCisKKwltb3YJJHMwLDAoJG91dCkJIyBzYXZlIG91dHB1dCBbemFwcyBpbnB1dF0KKwltb3YJJHMxLDQoJG91dCkKKwltb3YJJHMyLDgoJG91dCkKKwltb3YJJHMzLDEyKCRvdXQpCisKKy5hbGlnbgk0CisuTGNiY19mYXN0X2NsZWFudXA6CisJY21wbAlcJDAsJG1hcmsJIyB3YXMgdGhlIGtleSBzY2hlZHVsZSBjb3BpZWQ/CisJbGVhCSRhZXNfa2V5LCVyZGkKKwlqZQkuTGNiY19leGl0CisJCW1vdglcJDI0MC84LCVlY3gKKwkJeG9yCSVyYXgsJXJheAorCQkubG9uZwkweDkwQUI0OEYzCSMgcmVwIHN0b3NxCisKKwlqbXAJLkxjYmNfZXhpdAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNMT1cgUk9VVElORSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCisuYWxpZ24JMTYKKy5MY2JjX3Nsb3dfcHJvbG9ndWU6CisJIyBhbGxvY2F0ZSBhbGlnbmVkIHN0YWNrIGZyYW1lLi4uCisJbGVhCS04OCglcnNwKSwlcmJwCisJYW5kCVwkLTY0LCVyYnAKKwkjIC4uLiBqdXN0ICJhYm92ZSIga2V5IHNjaGVkdWxlCisJbGVhCS04OC02MyglcmN4KSwlcjEwCisJc3ViCSVyYnAsJXIxMAorCW5lZwklcjEwCisJYW5kCVwkMHgzYzAsJXIxMAorCXN1YgklcjEwLCVyYnAKKworCXhjaGcJJXJzcCwlcmJwCisJI2FkZAlcJDgsJXJzcAkjIHJlc2VydmUgZm9yIHJldHVybiBhZGRyZXNzIQorCW1vdgklcmJwLCRfcnNwCSMgc2F2ZSAlcnNwCisuTGNiY19zbG93X2JvZHk6CisJI21vdgklcmRpLCRfaW5wCSMgc2F2ZSBjb3B5IG9mIGlucAorCSNtb3YJJXJzaSwkX291dAkjIHNhdmUgY29weSBvZiBvdXQKKwkjbW92CSVyZHgsJF9sZW4JIyBzYXZlIGNvcHkgb2YgbGVuCisJI21vdgklcmN4LCRfa2V5CSMgc2F2ZSBjb3B5IG9mIGtleQorCW1vdgklcjgsJF9pdnAJIyBzYXZlIGNvcHkgb2YgaXZwCisJbW92CSVyOCwlcmJwCSMgcmVhcnJhbmdlIGlucHV0IGFyZ3VtZW50cworCW1vdgklcjksJXJieAorCW1vdgklcnNpLCRvdXQKKwltb3YJJXJkaSwkaW5wCisJbW92CSVyY3gsJGtleQorCW1vdgklcmR4LCVyMTAKKworCW1vdgkyNDAoJGtleSksJWVheAorCW1vdgkka2V5LCRrZXlwCSMgc2F2ZSBrZXkgcG9pbnRlcgorCXNobAlcJDQsJWVheAorCWxlYQkoJGtleSwlcmF4KSwlcmF4CisJbW92CSVyYXgsJGtleWVuZAorCisJIyBwaWNrIFRlNCBjb3B5IHdoaWNoIGNhbid0ICJvdmVybGFwIiB3aXRoIHN0YWNrIGZyYW1lIG9yIGtleSBzY2RlZHVsZQorCWxlYQkyMDQ4KCRzYm94KSwkc2JveAorCWxlYQk3NjgtOCglcnNwKSwlcmF4CisJc3ViCSRzYm94LCVyYXgKKwlhbmQJXCQweDMwMCwlcmF4CisJbGVhCSgkc2JveCwlcmF4KSwkc2JveAorCisJY21wCVwkMCwlcmJ4CisJamUJLkxTTE9XX0RFQ1JZUFQKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTTE9XIEVOQ1JZUFQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIworCXRlc3QJXCQtMTYsJXIxMAkJIyBjaGVjayB1cG9uIGxlbmd0aAorCW1vdgkwKCVyYnApLCRzMAkJIyBsb2FkIGl2CisJbW92CTQoJXJicCksJHMxCisJbW92CTgoJXJicCksJHMyCisJbW92CTEyKCVyYnApLCRzMworCWp6CS5MY2JjX3Nsb3dfZW5jX3RhaWwJIyBzaG9ydCBpbnB1dC4uLgorCisuYWxpZ24JNAorLkxjYmNfc2xvd19lbmNfbG9vcDoKKwkJeG9yCTAoJGlucCksJHMwCisJCXhvcgk0KCRpbnApLCRzMQorCQl4b3IJOCgkaW5wKSwkczIKKwkJeG9yCTEyKCRpbnApLCRzMworCQltb3YJJGtleXAsJGtleQkjIHJlc3RvcmUga2V5CisJCW1vdgkkaW5wLCRfaW5wCSMgc2F2ZSBpbnAKKwkJbW92CSRvdXQsJF9vdXQJIyBzYXZlIG91dAorCQltb3YJJXIxMCwkX2xlbgkjIHNhdmUgbGVuCisKKwkJY2FsbAlfeDg2XzY0X0FFU19lbmNyeXB0X2NvbXBhY3QKKworCQltb3YJJF9pbnAsJGlucAkjIHJlc3RvcmUgaW5wCisJCW1vdgkkX291dCwkb3V0CSMgcmVzdG9yZSBvdXQKKwkJbW92CSRfbGVuLCVyMTAJIyByZXN0b3JlIGxlbgorCQltb3YJJHMwLDAoJG91dCkKKwkJbW92CSRzMSw0KCRvdXQpCisJCW1vdgkkczIsOCgkb3V0KQorCQltb3YJJHMzLDEyKCRvdXQpCisKKwkJbGVhCTE2KCRpbnApLCRpbnAKKwkJbGVhCTE2KCRvdXQpLCRvdXQKKwkJc3ViCVwkMTYsJXIxMAorCQl0ZXN0CVwkLTE2LCVyMTAKKwlqbnoJLkxjYmNfc2xvd19lbmNfbG9vcAorCXRlc3QJXCQxNSwlcjEwCisJam56CS5MY2JjX3Nsb3dfZW5jX3RhaWwKKwltb3YJJF9pdnAsJXJicAkjIHJlc3RvcmUgaXZwCisJbW92CSRzMCwwKCVyYnApCSMgc2F2ZSBpdmVjCisJbW92CSRzMSw0KCVyYnApCisJbW92CSRzMiw4KCVyYnApCisJbW92CSRzMywxMiglcmJwKQorCisJam1wCS5MY2JjX2V4aXQKKworLmFsaWduCTQKKy5MY2JjX3Nsb3dfZW5jX3RhaWw6CisJbW92CSVyYXgsJXIxMQorCW1vdgklcmN4LCVyMTIKKwltb3YJJXIxMCwlcmN4CisJbW92CSRpbnAsJXJzaQorCW1vdgkkb3V0LCVyZGkKKwkubG9uZwkweDkwNjZBNEYzCQkjIHJlcCBtb3ZzYgorCW1vdglcJDE2LCVyY3gJCSMgemVybyB0YWlsCisJc3ViCSVyMTAsJXJjeAorCXhvcgklcmF4LCVyYXgKKwkubG9uZwkweDkwNjZBQUYzCQkjIHJlcCBzdG9zYgorCW1vdgkkb3V0LCRpbnAJCSMgdGhpcyBpcyBub3QgYSBtaXN0YWtlIQorCW1vdglcJDE2LCVyMTAJCSMgbGVuPTE2CisJbW92CSVyMTEsJXJheAorCW1vdgklcjEyLCVyY3gKKwlqbXAJLkxjYmNfc2xvd19lbmNfbG9vcAkjIG9uZSBtb3JlIHNwaW4uLi4KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU0xPVyBERUNSWVBUIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKKy5hbGlnbgkxNgorLkxTTE9XX0RFQ1JZUFQ6CisJc2hyCVwkMywlcmF4CisJYWRkCSVyYXgsJHNib3gJCSMgcmVjYWxsICJtYWdpYyIgY29uc3RhbnRzIQorCisJbW92CTAoJXJicCksJXIxMQkJIyBjb3B5IGl2IHRvIHN0YWNrCisJbW92CTgoJXJicCksJXIxMgorCW1vdgklcjExLDArJGl2ZWMKKwltb3YJJXIxMiw4KyRpdmVjCisKKy5hbGlnbgk0CisuTGNiY19zbG93X2RlY19sb29wOgorCQltb3YJMCgkaW5wKSwkczAJIyBsb2FkIGlucHV0CisJCW1vdgk0KCRpbnApLCRzMQorCQltb3YJOCgkaW5wKSwkczIKKwkJbW92CTEyKCRpbnApLCRzMworCQltb3YJJGtleXAsJGtleQkjIHJlc3RvcmUga2V5CisJCW1vdgkkaW5wLCRfaW5wCSMgc2F2ZSBpbnAKKwkJbW92CSRvdXQsJF9vdXQJIyBzYXZlIG91dAorCQltb3YJJXIxMCwkX2xlbgkjIHNhdmUgbGVuCisKKwkJY2FsbAlfeDg2XzY0X0FFU19kZWNyeXB0X2NvbXBhY3QKKworCQltb3YJJF9pbnAsJGlucAkjIHJlc3RvcmUgaW5wCisJCW1vdgkkX291dCwkb3V0CSMgcmVzdG9yZSBvdXQKKwkJbW92CSRfbGVuLCVyMTAKKwkJeG9yCTArJGl2ZWMsJHMwCisJCXhvcgk0KyRpdmVjLCRzMQorCQl4b3IJOCskaXZlYywkczIKKwkJeG9yCTEyKyRpdmVjLCRzMworCisJCW1vdgkwKCRpbnApLCVyMTEJIyBsb2FkIGlucHV0CisJCW1vdgk4KCRpbnApLCVyMTIKKwkJc3ViCVwkMTYsJXIxMAorCQlqYwkuTGNiY19zbG93X2RlY19wYXJ0aWFsCisJCWp6CS5MY2JjX3Nsb3dfZGVjX2RvbmUKKworCQltb3YJJXIxMSwwKyRpdmVjCSMgY29weSBpbnB1dCB0byBpdgorCQltb3YJJXIxMiw4KyRpdmVjCisKKwkJbW92CSRzMCwwKCRvdXQpCSMgc2F2ZSBvdXRwdXQgW2NhbiB6YXAgaW5wdXRdCisJCW1vdgkkczEsNCgkb3V0KQorCQltb3YJJHMyLDgoJG91dCkKKwkJbW92CSRzMywxMigkb3V0KQorCisJCWxlYQkxNigkaW5wKSwkaW5wCisJCWxlYQkxNigkb3V0KSwkb3V0CisJam1wCS5MY2JjX3Nsb3dfZGVjX2xvb3AKKy5MY2JjX3Nsb3dfZGVjX2RvbmU6CisJbW92CSRfaXZwLCVyZGkKKwltb3YJJXIxMSwwKCVyZGkpCQkjIGNvcHkgaXYgYmFjayB0byB1c2VyCisJbW92CSVyMTIsOCglcmRpKQorCisJbW92CSRzMCwwKCRvdXQpCQkjIHNhdmUgb3V0cHV0IFtjYW4gemFwIGlucHV0XQorCW1vdgkkczEsNCgkb3V0KQorCW1vdgkkczIsOCgkb3V0KQorCW1vdgkkczMsMTIoJG91dCkKKworCWptcAkuTGNiY19leGl0CisKKy5hbGlnbgk0CisuTGNiY19zbG93X2RlY19wYXJ0aWFsOgorCW1vdgkkX2l2cCwlcmRpCisJbW92CSVyMTEsMCglcmRpKQkJIyBjb3B5IGl2IGJhY2sgdG8gdXNlcgorCW1vdgklcjEyLDgoJXJkaSkKKworCW1vdgkkczAsMCskaXZlYwkJIyBzYXZlIG91dHB1dCB0byBzdGFjaworCW1vdgkkczEsNCskaXZlYworCW1vdgkkczIsOCskaXZlYworCW1vdgkkczMsMTIrJGl2ZWMKKworCW1vdgkkb3V0LCVyZGkKKwlsZWEJJGl2ZWMsJXJzaQorCWxlYQkxNiglcjEwKSwlcmN4CisJLmxvbmcJMHg5MDY2QTRGMwkjIHJlcCBtb3ZzYgorCWptcAkuTGNiY19leGl0CisKKy5hbGlnbgkxNgorLkxjYmNfZXhpdDoKKwltb3YJJF9yc3AsJXJzaQorCW1vdgkoJXJzaSksJXIxNQorCW1vdgk4KCVyc2kpLCVyMTQKKwltb3YJMTYoJXJzaSksJXIxMworCW1vdgkyNCglcnNpKSwlcjEyCisJbW92CTMyKCVyc2kpLCVyYnAKKwltb3YJNDAoJXJzaSksJXJieAorCWxlYQk0OCglcnNpKSwlcnNwCisuTGNiY19wb3BmcToKKwlwb3BmcQorLkxjYmNfZXBpbG9ndWU6CisJcmV0Cisuc2l6ZQlBRVNfY2JjX2VuY3J5cHQsLi1BRVNfY2JjX2VuY3J5cHQKK19fXworfQorCiskY29kZS49PDxfX187CisuYWxpZ24JNjQKKy5MQUVTX1RlOgorX19fCisJJl9kYXRhX3dvcmQoMHhhNTYzNjNjNiwgMHg4NDdjN2NmOCwgMHg5OTc3NzdlZSwgMHg4ZDdiN2JmNik7CisJJl9kYXRhX3dvcmQoMHgwZGYyZjJmZiwgMHhiZDZiNmJkNiwgMHhiMTZmNmZkZSwgMHg1NGM1YzU5MSk7CisJJl9kYXRhX3dvcmQoMHg1MDMwMzA2MCwgMHgwMzAxMDEwMiwgMHhhOTY3NjdjZSwgMHg3ZDJiMmI1Nik7CisJJl9kYXRhX3dvcmQoMHgxOWZlZmVlNywgMHg2MmQ3ZDdiNSwgMHhlNmFiYWI0ZCwgMHg5YTc2NzZlYyk7CisJJl9kYXRhX3dvcmQoMHg0NWNhY2E4ZiwgMHg5ZDgyODIxZiwgMHg0MGM5Yzk4OSwgMHg4NzdkN2RmYSk7CisJJl9kYXRhX3dvcmQoMHgxNWZhZmFlZiwgMHhlYjU5NTliMiwgMHhjOTQ3NDc4ZSwgMHgwYmYwZjBmYik7CisJJl9kYXRhX3dvcmQoMHhlY2FkYWQ0MSwgMHg2N2Q0ZDRiMywgMHhmZGEyYTI1ZiwgMHhlYWFmYWY0NSk7CisJJl9kYXRhX3dvcmQoMHhiZjljOWMyMywgMHhmN2E0YTQ1MywgMHg5NjcyNzJlNCwgMHg1YmMwYzA5Yik7CisJJl9kYXRhX3dvcmQoMHhjMmI3Yjc3NSwgMHgxY2ZkZmRlMSwgMHhhZTkzOTMzZCwgMHg2YTI2MjY0Yyk7CisJJl9kYXRhX3dvcmQoMHg1YTM2MzY2YywgMHg0MTNmM2Y3ZSwgMHgwMmY3ZjdmNSwgMHg0ZmNjY2M4Myk7CisJJl9kYXRhX3dvcmQoMHg1YzM0MzQ2OCwgMHhmNGE1YTU1MSwgMHgzNGU1ZTVkMSwgMHgwOGYxZjFmOSk7CisJJl9kYXRhX3dvcmQoMHg5MzcxNzFlMiwgMHg3M2Q4ZDhhYiwgMHg1MzMxMzE2MiwgMHgzZjE1MTUyYSk7CisJJl9kYXRhX3dvcmQoMHgwYzA0MDQwOCwgMHg1MmM3Yzc5NSwgMHg2NTIzMjM0NiwgMHg1ZWMzYzM5ZCk7CisJJl9kYXRhX3dvcmQoMHgyODE4MTgzMCwgMHhhMTk2OTYzNywgMHgwZjA1MDUwYSwgMHhiNTlhOWEyZik7CisJJl9kYXRhX3dvcmQoMHgwOTA3MDcwZSwgMHgzNjEyMTIyNCwgMHg5YjgwODAxYiwgMHgzZGUyZTJkZik7CisJJl9kYXRhX3dvcmQoMHgyNmViZWJjZCwgMHg2OTI3Mjc0ZSwgMHhjZGIyYjI3ZiwgMHg5Zjc1NzVlYSk7CisJJl9kYXRhX3dvcmQoMHgxYjA5MDkxMiwgMHg5ZTgzODMxZCwgMHg3NDJjMmM1OCwgMHgyZTFhMWEzNCk7CisJJl9kYXRhX3dvcmQoMHgyZDFiMWIzNiwgMHhiMjZlNmVkYywgMHhlZTVhNWFiNCwgMHhmYmEwYTA1Yik7CisJJl9kYXRhX3dvcmQoMHhmNjUyNTJhNCwgMHg0ZDNiM2I3NiwgMHg2MWQ2ZDZiNywgMHhjZWIzYjM3ZCk7CisJJl9kYXRhX3dvcmQoMHg3YjI5Mjk1MiwgMHgzZWUzZTNkZCwgMHg3MTJmMmY1ZSwgMHg5Nzg0ODQxMyk7CisJJl9kYXRhX3dvcmQoMHhmNTUzNTNhNiwgMHg2OGQxZDFiOSwgMHgwMDAwMDAwMCwgMHgyY2VkZWRjMSk7CisJJl9kYXRhX3dvcmQoMHg2MDIwMjA0MCwgMHgxZmZjZmNlMywgMHhjOGIxYjE3OSwgMHhlZDViNWJiNik7CisJJl9kYXRhX3dvcmQoMHhiZTZhNmFkNCwgMHg0NmNiY2I4ZCwgMHhkOWJlYmU2NywgMHg0YjM5Mzk3Mik7CisJJl9kYXRhX3dvcmQoMHhkZTRhNGE5NCwgMHhkNDRjNGM5OCwgMHhlODU4NThiMCwgMHg0YWNmY2Y4NSk7CisJJl9kYXRhX3dvcmQoMHg2YmQwZDBiYiwgMHgyYWVmZWZjNSwgMHhlNWFhYWE0ZiwgMHgxNmZiZmJlZCk7CisJJl9kYXRhX3dvcmQoMHhjNTQzNDM4NiwgMHhkNzRkNGQ5YSwgMHg1NTMzMzM2NiwgMHg5NDg1ODUxMSk7CisJJl9kYXRhX3dvcmQoMHhjZjQ1NDU4YSwgMHgxMGY5ZjllOSwgMHgwNjAyMDIwNCwgMHg4MTdmN2ZmZSk7CisJJl9kYXRhX3dvcmQoMHhmMDUwNTBhMCwgMHg0NDNjM2M3OCwgMHhiYTlmOWYyNSwgMHhlM2E4YTg0Yik7CisJJl9kYXRhX3dvcmQoMHhmMzUxNTFhMiwgMHhmZWEzYTM1ZCwgMHhjMDQwNDA4MCwgMHg4YThmOGYwNSk7CisJJl9kYXRhX3dvcmQoMHhhZDkyOTIzZiwgMHhiYzlkOWQyMSwgMHg0ODM4Mzg3MCwgMHgwNGY1ZjVmMSk7CisJJl9kYXRhX3dvcmQoMHhkZmJjYmM2MywgMHhjMWI2YjY3NywgMHg3NWRhZGFhZiwgMHg2MzIxMjE0Mik7CisJJl9kYXRhX3dvcmQoMHgzMDEwMTAyMCwgMHgxYWZmZmZlNSwgMHgwZWYzZjNmZCwgMHg2ZGQyZDJiZik7CisJJl9kYXRhX3dvcmQoMHg0Y2NkY2Q4MSwgMHgxNDBjMGMxOCwgMHgzNTEzMTMyNiwgMHgyZmVjZWNjMyk7CisJJl9kYXRhX3dvcmQoMHhlMTVmNWZiZSwgMHhhMjk3OTczNSwgMHhjYzQ0NDQ4OCwgMHgzOTE3MTcyZSk7CisJJl9kYXRhX3dvcmQoMHg1N2M0YzQ5MywgMHhmMmE3YTc1NSwgMHg4MjdlN2VmYywgMHg0NzNkM2Q3YSk7CisJJl9kYXRhX3dvcmQoMHhhYzY0NjRjOCwgMHhlNzVkNWRiYSwgMHgyYjE5MTkzMiwgMHg5NTczNzNlNik7CisJJl9kYXRhX3dvcmQoMHhhMDYwNjBjMCwgMHg5ODgxODExOSwgMHhkMTRmNGY5ZSwgMHg3ZmRjZGNhMyk7CisJJl9kYXRhX3dvcmQoMHg2NjIyMjI0NCwgMHg3ZTJhMmE1NCwgMHhhYjkwOTAzYiwgMHg4Mzg4ODgwYik7CisJJl9kYXRhX3dvcmQoMHhjYTQ2NDY4YywgMHgyOWVlZWVjNywgMHhkM2I4Yjg2YiwgMHgzYzE0MTQyOCk7CisJJl9kYXRhX3dvcmQoMHg3OWRlZGVhNywgMHhlMjVlNWViYywgMHgxZDBiMGIxNiwgMHg3NmRiZGJhZCk7CisJJl9kYXRhX3dvcmQoMHgzYmUwZTBkYiwgMHg1NjMyMzI2NCwgMHg0ZTNhM2E3NCwgMHgxZTBhMGExNCk7CisJJl9kYXRhX3dvcmQoMHhkYjQ5NDk5MiwgMHgwYTA2MDYwYywgMHg2YzI0MjQ0OCwgMHhlNDVjNWNiOCk7CisJJl9kYXRhX3dvcmQoMHg1ZGMyYzI5ZiwgMHg2ZWQzZDNiZCwgMHhlZmFjYWM0MywgMHhhNjYyNjJjNCk7CisJJl9kYXRhX3dvcmQoMHhhODkxOTEzOSwgMHhhNDk1OTUzMSwgMHgzN2U0ZTRkMywgMHg4Yjc5NzlmMik7CisJJl9kYXRhX3dvcmQoMHgzMmU3ZTdkNSwgMHg0M2M4Yzg4YiwgMHg1OTM3Mzc2ZSwgMHhiNzZkNmRkYSk7CisJJl9kYXRhX3dvcmQoMHg4YzhkOGQwMSwgMHg2NGQ1ZDViMSwgMHhkMjRlNGU5YywgMHhlMGE5YTk0OSk7CisJJl9kYXRhX3dvcmQoMHhiNDZjNmNkOCwgMHhmYTU2NTZhYywgMHgwN2Y0ZjRmMywgMHgyNWVhZWFjZik7CisJJl9kYXRhX3dvcmQoMHhhZjY1NjVjYSwgMHg4ZTdhN2FmNCwgMHhlOWFlYWU0NywgMHgxODA4MDgxMCk7CisJJl9kYXRhX3dvcmQoMHhkNWJhYmE2ZiwgMHg4ODc4NzhmMCwgMHg2ZjI1MjU0YSwgMHg3MjJlMmU1Yyk7CisJJl9kYXRhX3dvcmQoMHgyNDFjMWMzOCwgMHhmMWE2YTY1NywgMHhjN2I0YjQ3MywgMHg1MWM2YzY5Nyk7CisJJl9kYXRhX3dvcmQoMHgyM2U4ZThjYiwgMHg3Y2RkZGRhMSwgMHg5Yzc0NzRlOCwgMHgyMTFmMWYzZSk7CisJJl9kYXRhX3dvcmQoMHhkZDRiNGI5NiwgMHhkY2JkYmQ2MSwgMHg4NjhiOGIwZCwgMHg4NThhOGEwZik7CisJJl9kYXRhX3dvcmQoMHg5MDcwNzBlMCwgMHg0MjNlM2U3YywgMHhjNGI1YjU3MSwgMHhhYTY2NjZjYyk7CisJJl9kYXRhX3dvcmQoMHhkODQ4NDg5MCwgMHgwNTAzMDMwNiwgMHgwMWY2ZjZmNywgMHgxMjBlMGUxYyk7CisJJl9kYXRhX3dvcmQoMHhhMzYxNjFjMiwgMHg1ZjM1MzU2YSwgMHhmOTU3NTdhZSwgMHhkMGI5Yjk2OSk7CisJJl9kYXRhX3dvcmQoMHg5MTg2ODYxNywgMHg1OGMxYzE5OSwgMHgyNzFkMWQzYSwgMHhiOTllOWUyNyk7CisJJl9kYXRhX3dvcmQoMHgzOGUxZTFkOSwgMHgxM2Y4ZjhlYiwgMHhiMzk4OTgyYiwgMHgzMzExMTEyMik7CisJJl9kYXRhX3dvcmQoMHhiYjY5NjlkMiwgMHg3MGQ5ZDlhOSwgMHg4OThlOGUwNywgMHhhNzk0OTQzMyk7CisJJl9kYXRhX3dvcmQoMHhiNjliOWIyZCwgMHgyMjFlMWUzYywgMHg5Mjg3ODcxNSwgMHgyMGU5ZTljOSk7CisJJl9kYXRhX3dvcmQoMHg0OWNlY2U4NywgMHhmZjU1NTVhYSwgMHg3ODI4Mjg1MCwgMHg3YWRmZGZhNSk7CisJJl9kYXRhX3dvcmQoMHg4ZjhjOGMwMywgMHhmOGExYTE1OSwgMHg4MDg5ODkwOSwgMHgxNzBkMGQxYSk7CisJJl9kYXRhX3dvcmQoMHhkYWJmYmY2NSwgMHgzMWU2ZTZkNywgMHhjNjQyNDI4NCwgMHhiODY4NjhkMCk7CisJJl9kYXRhX3dvcmQoMHhjMzQxNDE4MiwgMHhiMDk5OTkyOSwgMHg3NzJkMmQ1YSwgMHgxMTBmMGYxZSk7CisJJl9kYXRhX3dvcmQoMHhjYmIwYjA3YiwgMHhmYzU0NTRhOCwgMHhkNmJiYmI2ZCwgMHgzYTE2MTYyYyk7CisKKyNUZTQJIyBmb3VyIGNvcGllcyBvZiBUZTQgdG8gY2hvb3NlIGZyb20gdG8gYXZvaWQgTDEgYWxpYXNpbmcKKwkmZGF0YV9ieXRlKDB4NjMsIDB4N2MsIDB4NzcsIDB4N2IsIDB4ZjIsIDB4NmIsIDB4NmYsIDB4YzUpOworCSZkYXRhX2J5dGUoMHgzMCwgMHgwMSwgMHg2NywgMHgyYiwgMHhmZSwgMHhkNywgMHhhYiwgMHg3Nik7CisJJmRhdGFfYnl0ZSgweGNhLCAweDgyLCAweGM5LCAweDdkLCAweGZhLCAweDU5LCAweDQ3LCAweGYwKTsKKwkmZGF0YV9ieXRlKDB4YWQsIDB4ZDQsIDB4YTIsIDB4YWYsIDB4OWMsIDB4YTQsIDB4NzIsIDB4YzApOworCSZkYXRhX2J5dGUoMHhiNywgMHhmZCwgMHg5MywgMHgyNiwgMHgzNiwgMHgzZiwgMHhmNywgMHhjYyk7CisJJmRhdGFfYnl0ZSgweDM0LCAweGE1LCAweGU1LCAweGYxLCAweDcxLCAweGQ4LCAweDMxLCAweDE1KTsKKwkmZGF0YV9ieXRlKDB4MDQsIDB4YzcsIDB4MjMsIDB4YzMsIDB4MTgsIDB4OTYsIDB4MDUsIDB4OWEpOworCSZkYXRhX2J5dGUoMHgwNywgMHgxMiwgMHg4MCwgMHhlMiwgMHhlYiwgMHgyNywgMHhiMiwgMHg3NSk7CisJJmRhdGFfYnl0ZSgweDA5LCAweDgzLCAweDJjLCAweDFhLCAweDFiLCAweDZlLCAweDVhLCAweGEwKTsKKwkmZGF0YV9ieXRlKDB4NTIsIDB4M2IsIDB4ZDYsIDB4YjMsIDB4MjksIDB4ZTMsIDB4MmYsIDB4ODQpOworCSZkYXRhX2J5dGUoMHg1MywgMHhkMSwgMHgwMCwgMHhlZCwgMHgyMCwgMHhmYywgMHhiMSwgMHg1Yik7CisJJmRhdGFfYnl0ZSgweDZhLCAweGNiLCAweGJlLCAweDM5LCAweDRhLCAweDRjLCAweDU4LCAweGNmKTsKKwkmZGF0YV9ieXRlKDB4ZDAsIDB4ZWYsIDB4YWEsIDB4ZmIsIDB4NDMsIDB4NGQsIDB4MzMsIDB4ODUpOworCSZkYXRhX2J5dGUoMHg0NSwgMHhmOSwgMHgwMiwgMHg3ZiwgMHg1MCwgMHgzYywgMHg5ZiwgMHhhOCk7CisJJmRhdGFfYnl0ZSgweDUxLCAweGEzLCAweDQwLCAweDhmLCAweDkyLCAweDlkLCAweDM4LCAweGY1KTsKKwkmZGF0YV9ieXRlKDB4YmMsIDB4YjYsIDB4ZGEsIDB4MjEsIDB4MTAsIDB4ZmYsIDB4ZjMsIDB4ZDIpOworCSZkYXRhX2J5dGUoMHhjZCwgMHgwYywgMHgxMywgMHhlYywgMHg1ZiwgMHg5NywgMHg0NCwgMHgxNyk7CisJJmRhdGFfYnl0ZSgweGM0LCAweGE3LCAweDdlLCAweDNkLCAweDY0LCAweDVkLCAweDE5LCAweDczKTsKKwkmZGF0YV9ieXRlKDB4NjAsIDB4ODEsIDB4NGYsIDB4ZGMsIDB4MjIsIDB4MmEsIDB4OTAsIDB4ODgpOworCSZkYXRhX2J5dGUoMHg0NiwgMHhlZSwgMHhiOCwgMHgxNCwgMHhkZSwgMHg1ZSwgMHgwYiwgMHhkYik7CisJJmRhdGFfYnl0ZSgweGUwLCAweDMyLCAweDNhLCAweDBhLCAweDQ5LCAweDA2LCAweDI0LCAweDVjKTsKKwkmZGF0YV9ieXRlKDB4YzIsIDB4ZDMsIDB4YWMsIDB4NjIsIDB4OTEsIDB4OTUsIDB4ZTQsIDB4NzkpOworCSZkYXRhX2J5dGUoMHhlNywgMHhjOCwgMHgzNywgMHg2ZCwgMHg4ZCwgMHhkNSwgMHg0ZSwgMHhhOSk7CisJJmRhdGFfYnl0ZSgweDZjLCAweDU2LCAweGY0LCAweGVhLCAweDY1LCAweDdhLCAweGFlLCAweDA4KTsKKwkmZGF0YV9ieXRlKDB4YmEsIDB4NzgsIDB4MjUsIDB4MmUsIDB4MWMsIDB4YTYsIDB4YjQsIDB4YzYpOworCSZkYXRhX2J5dGUoMHhlOCwgMHhkZCwgMHg3NCwgMHgxZiwgMHg0YiwgMHhiZCwgMHg4YiwgMHg4YSk7CisJJmRhdGFfYnl0ZSgweDcwLCAweDNlLCAweGI1LCAweDY2LCAweDQ4LCAweDAzLCAweGY2LCAweDBlKTsKKwkmZGF0YV9ieXRlKDB4NjEsIDB4MzUsIDB4NTcsIDB4YjksIDB4ODYsIDB4YzEsIDB4MWQsIDB4OWUpOworCSZkYXRhX2J5dGUoMHhlMSwgMHhmOCwgMHg5OCwgMHgxMSwgMHg2OSwgMHhkOSwgMHg4ZSwgMHg5NCk7CisJJmRhdGFfYnl0ZSgweDliLCAweDFlLCAweDg3LCAweGU5LCAweGNlLCAweDU1LCAweDI4LCAweGRmKTsKKwkmZGF0YV9ieXRlKDB4OGMsIDB4YTEsIDB4ODksIDB4MGQsIDB4YmYsIDB4ZTYsIDB4NDIsIDB4NjgpOworCSZkYXRhX2J5dGUoMHg0MSwgMHg5OSwgMHgyZCwgMHgwZiwgMHhiMCwgMHg1NCwgMHhiYiwgMHgxNik7CisKKwkmZGF0YV9ieXRlKDB4NjMsIDB4N2MsIDB4NzcsIDB4N2IsIDB4ZjIsIDB4NmIsIDB4NmYsIDB4YzUpOworCSZkYXRhX2J5dGUoMHgzMCwgMHgwMSwgMHg2NywgMHgyYiwgMHhmZSwgMHhkNywgMHhhYiwgMHg3Nik7CisJJmRhdGFfYnl0ZSgweGNhLCAweDgyLCAweGM5LCAweDdkLCAweGZhLCAweDU5LCAweDQ3LCAweGYwKTsKKwkmZGF0YV9ieXRlKDB4YWQsIDB4ZDQsIDB4YTIsIDB4YWYsIDB4OWMsIDB4YTQsIDB4NzIsIDB4YzApOworCSZkYXRhX2J5dGUoMHhiNywgMHhmZCwgMHg5MywgMHgyNiwgMHgzNiwgMHgzZiwgMHhmNywgMHhjYyk7CisJJmRhdGFfYnl0ZSgweDM0LCAweGE1LCAweGU1LCAweGYxLCAweDcxLCAweGQ4LCAweDMxLCAweDE1KTsKKwkmZGF0YV9ieXRlKDB4MDQsIDB4YzcsIDB4MjMsIDB4YzMsIDB4MTgsIDB4OTYsIDB4MDUsIDB4OWEpOworCSZkYXRhX2J5dGUoMHgwNywgMHgxMiwgMHg4MCwgMHhlMiwgMHhlYiwgMHgyNywgMHhiMiwgMHg3NSk7CisJJmRhdGFfYnl0ZSgweDA5LCAweDgzLCAweDJjLCAweDFhLCAweDFiLCAweDZlLCAweDVhLCAweGEwKTsKKwkmZGF0YV9ieXRlKDB4NTIsIDB4M2IsIDB4ZDYsIDB4YjMsIDB4MjksIDB4ZTMsIDB4MmYsIDB4ODQpOworCSZkYXRhX2J5dGUoMHg1MywgMHhkMSwgMHgwMCwgMHhlZCwgMHgyMCwgMHhmYywgMHhiMSwgMHg1Yik7CisJJmRhdGFfYnl0ZSgweDZhLCAweGNiLCAweGJlLCAweDM5LCAweDRhLCAweDRjLCAweDU4LCAweGNmKTsKKwkmZGF0YV9ieXRlKDB4ZDAsIDB4ZWYsIDB4YWEsIDB4ZmIsIDB4NDMsIDB4NGQsIDB4MzMsIDB4ODUpOworCSZkYXRhX2J5dGUoMHg0NSwgMHhmOSwgMHgwMiwgMHg3ZiwgMHg1MCwgMHgzYywgMHg5ZiwgMHhhOCk7CisJJmRhdGFfYnl0ZSgweDUxLCAweGEzLCAweDQwLCAweDhmLCAweDkyLCAweDlkLCAweDM4LCAweGY1KTsKKwkmZGF0YV9ieXRlKDB4YmMsIDB4YjYsIDB4ZGEsIDB4MjEsIDB4MTAsIDB4ZmYsIDB4ZjMsIDB4ZDIpOworCSZkYXRhX2J5dGUoMHhjZCwgMHgwYywgMHgxMywgMHhlYywgMHg1ZiwgMHg5NywgMHg0NCwgMHgxNyk7CisJJmRhdGFfYnl0ZSgweGM0LCAweGE3LCAweDdlLCAweDNkLCAweDY0LCAweDVkLCAweDE5LCAweDczKTsKKwkmZGF0YV9ieXRlKDB4NjAsIDB4ODEsIDB4NGYsIDB4ZGMsIDB4MjIsIDB4MmEsIDB4OTAsIDB4ODgpOworCSZkYXRhX2J5dGUoMHg0NiwgMHhlZSwgMHhiOCwgMHgxNCwgMHhkZSwgMHg1ZSwgMHgwYiwgMHhkYik7CisJJmRhdGFfYnl0ZSgweGUwLCAweDMyLCAweDNhLCAweDBhLCAweDQ5LCAweDA2LCAweDI0LCAweDVjKTsKKwkmZGF0YV9ieXRlKDB4YzIsIDB4ZDMsIDB4YWMsIDB4NjIsIDB4OTEsIDB4OTUsIDB4ZTQsIDB4NzkpOworCSZkYXRhX2J5dGUoMHhlNywgMHhjOCwgMHgzNywgMHg2ZCwgMHg4ZCwgMHhkNSwgMHg0ZSwgMHhhOSk7CisJJmRhdGFfYnl0ZSgweDZjLCAweDU2LCAweGY0LCAweGVhLCAweDY1LCAweDdhLCAweGFlLCAweDA4KTsKKwkmZGF0YV9ieXRlKDB4YmEsIDB4NzgsIDB4MjUsIDB4MmUsIDB4MWMsIDB4YTYsIDB4YjQsIDB4YzYpOworCSZkYXRhX2J5dGUoMHhlOCwgMHhkZCwgMHg3NCwgMHgxZiwgMHg0YiwgMHhiZCwgMHg4YiwgMHg4YSk7CisJJmRhdGFfYnl0ZSgweDcwLCAweDNlLCAweGI1LCAweDY2LCAweDQ4LCAweDAzLCAweGY2LCAweDBlKTsKKwkmZGF0YV9ieXRlKDB4NjEsIDB4MzUsIDB4NTcsIDB4YjksIDB4ODYsIDB4YzEsIDB4MWQsIDB4OWUpOworCSZkYXRhX2J5dGUoMHhlMSwgMHhmOCwgMHg5OCwgMHgxMSwgMHg2OSwgMHhkOSwgMHg4ZSwgMHg5NCk7CisJJmRhdGFfYnl0ZSgweDliLCAweDFlLCAweDg3LCAweGU5LCAweGNlLCAweDU1LCAweDI4LCAweGRmKTsKKwkmZGF0YV9ieXRlKDB4OGMsIDB4YTEsIDB4ODksIDB4MGQsIDB4YmYsIDB4ZTYsIDB4NDIsIDB4NjgpOworCSZkYXRhX2J5dGUoMHg0MSwgMHg5OSwgMHgyZCwgMHgwZiwgMHhiMCwgMHg1NCwgMHhiYiwgMHgxNik7CisKKwkmZGF0YV9ieXRlKDB4NjMsIDB4N2MsIDB4NzcsIDB4N2IsIDB4ZjIsIDB4NmIsIDB4NmYsIDB4YzUpOworCSZkYXRhX2J5dGUoMHgzMCwgMHgwMSwgMHg2NywgMHgyYiwgMHhmZSwgMHhkNywgMHhhYiwgMHg3Nik7CisJJmRhdGFfYnl0ZSgweGNhLCAweDgyLCAweGM5LCAweDdkLCAweGZhLCAweDU5LCAweDQ3LCAweGYwKTsKKwkmZGF0YV9ieXRlKDB4YWQsIDB4ZDQsIDB4YTIsIDB4YWYsIDB4OWMsIDB4YTQsIDB4NzIsIDB4YzApOworCSZkYXRhX2J5dGUoMHhiNywgMHhmZCwgMHg5MywgMHgyNiwgMHgzNiwgMHgzZiwgMHhmNywgMHhjYyk7CisJJmRhdGFfYnl0ZSgweDM0LCAweGE1LCAweGU1LCAweGYxLCAweDcxLCAweGQ4LCAweDMxLCAweDE1KTsKKwkmZGF0YV9ieXRlKDB4MDQsIDB4YzcsIDB4MjMsIDB4YzMsIDB4MTgsIDB4OTYsIDB4MDUsIDB4OWEpOworCSZkYXRhX2J5dGUoMHgwNywgMHgxMiwgMHg4MCwgMHhlMiwgMHhlYiwgMHgyNywgMHhiMiwgMHg3NSk7CisJJmRhdGFfYnl0ZSgweDA5LCAweDgzLCAweDJjLCAweDFhLCAweDFiLCAweDZlLCAweDVhLCAweGEwKTsKKwkmZGF0YV9ieXRlKDB4NTIsIDB4M2IsIDB4ZDYsIDB4YjMsIDB4MjksIDB4ZTMsIDB4MmYsIDB4ODQpOworCSZkYXRhX2J5dGUoMHg1MywgMHhkMSwgMHgwMCwgMHhlZCwgMHgyMCwgMHhmYywgMHhiMSwgMHg1Yik7CisJJmRhdGFfYnl0ZSgweDZhLCAweGNiLCAweGJlLCAweDM5LCAweDRhLCAweDRjLCAweDU4LCAweGNmKTsKKwkmZGF0YV9ieXRlKDB4ZDAsIDB4ZWYsIDB4YWEsIDB4ZmIsIDB4NDMsIDB4NGQsIDB4MzMsIDB4ODUpOworCSZkYXRhX2J5dGUoMHg0NSwgMHhmOSwgMHgwMiwgMHg3ZiwgMHg1MCwgMHgzYywgMHg5ZiwgMHhhOCk7CisJJmRhdGFfYnl0ZSgweDUxLCAweGEzLCAweDQwLCAweDhmLCAweDkyLCAweDlkLCAweDM4LCAweGY1KTsKKwkmZGF0YV9ieXRlKDB4YmMsIDB4YjYsIDB4ZGEsIDB4MjEsIDB4MTAsIDB4ZmYsIDB4ZjMsIDB4ZDIpOworCSZkYXRhX2J5dGUoMHhjZCwgMHgwYywgMHgxMywgMHhlYywgMHg1ZiwgMHg5NywgMHg0NCwgMHgxNyk7CisJJmRhdGFfYnl0ZSgweGM0LCAweGE3LCAweDdlLCAweDNkLCAweDY0LCAweDVkLCAweDE5LCAweDczKTsKKwkmZGF0YV9ieXRlKDB4NjAsIDB4ODEsIDB4NGYsIDB4ZGMsIDB4MjIsIDB4MmEsIDB4OTAsIDB4ODgpOworCSZkYXRhX2J5dGUoMHg0NiwgMHhlZSwgMHhiOCwgMHgxNCwgMHhkZSwgMHg1ZSwgMHgwYiwgMHhkYik7CisJJmRhdGFfYnl0ZSgweGUwLCAweDMyLCAweDNhLCAweDBhLCAweDQ5LCAweDA2LCAweDI0LCAweDVjKTsKKwkmZGF0YV9ieXRlKDB4YzIsIDB4ZDMsIDB4YWMsIDB4NjIsIDB4OTEsIDB4OTUsIDB4ZTQsIDB4NzkpOworCSZkYXRhX2J5dGUoMHhlNywgMHhjOCwgMHgzNywgMHg2ZCwgMHg4ZCwgMHhkNSwgMHg0ZSwgMHhhOSk7CisJJmRhdGFfYnl0ZSgweDZjLCAweDU2LCAweGY0LCAweGVhLCAweDY1LCAweDdhLCAweGFlLCAweDA4KTsKKwkmZGF0YV9ieXRlKDB4YmEsIDB4NzgsIDB4MjUsIDB4MmUsIDB4MWMsIDB4YTYsIDB4YjQsIDB4YzYpOworCSZkYXRhX2J5dGUoMHhlOCwgMHhkZCwgMHg3NCwgMHgxZiwgMHg0YiwgMHhiZCwgMHg4YiwgMHg4YSk7CisJJmRhdGFfYnl0ZSgweDcwLCAweDNlLCAweGI1LCAweDY2LCAweDQ4LCAweDAzLCAweGY2LCAweDBlKTsKKwkmZGF0YV9ieXRlKDB4NjEsIDB4MzUsIDB4NTcsIDB4YjksIDB4ODYsIDB4YzEsIDB4MWQsIDB4OWUpOworCSZkYXRhX2J5dGUoMHhlMSwgMHhmOCwgMHg5OCwgMHgxMSwgMHg2OSwgMHhkOSwgMHg4ZSwgMHg5NCk7CisJJmRhdGFfYnl0ZSgweDliLCAweDFlLCAweDg3LCAweGU5LCAweGNlLCAweDU1LCAweDI4LCAweGRmKTsKKwkmZGF0YV9ieXRlKDB4OGMsIDB4YTEsIDB4ODksIDB4MGQsIDB4YmYsIDB4ZTYsIDB4NDIsIDB4NjgpOworCSZkYXRhX2J5dGUoMHg0MSwgMHg5OSwgMHgyZCwgMHgwZiwgMHhiMCwgMHg1NCwgMHhiYiwgMHgxNik7CisKKwkmZGF0YV9ieXRlKDB4NjMsIDB4N2MsIDB4NzcsIDB4N2IsIDB4ZjIsIDB4NmIsIDB4NmYsIDB4YzUpOworCSZkYXRhX2J5dGUoMHgzMCwgMHgwMSwgMHg2NywgMHgyYiwgMHhmZSwgMHhkNywgMHhhYiwgMHg3Nik7CisJJmRhdGFfYnl0ZSgweGNhLCAweDgyLCAweGM5LCAweDdkLCAweGZhLCAweDU5LCAweDQ3LCAweGYwKTsKKwkmZGF0YV9ieXRlKDB4YWQsIDB4ZDQsIDB4YTIsIDB4YWYsIDB4OWMsIDB4YTQsIDB4NzIsIDB4YzApOworCSZkYXRhX2J5dGUoMHhiNywgMHhmZCwgMHg5MywgMHgyNiwgMHgzNiwgMHgzZiwgMHhmNywgMHhjYyk7CisJJmRhdGFfYnl0ZSgweDM0LCAweGE1LCAweGU1LCAweGYxLCAweDcxLCAweGQ4LCAweDMxLCAweDE1KTsKKwkmZGF0YV9ieXRlKDB4MDQsIDB4YzcsIDB4MjMsIDB4YzMsIDB4MTgsIDB4OTYsIDB4MDUsIDB4OWEpOworCSZkYXRhX2J5dGUoMHgwNywgMHgxMiwgMHg4MCwgMHhlMiwgMHhlYiwgMHgyNywgMHhiMiwgMHg3NSk7CisJJmRhdGFfYnl0ZSgweDA5LCAweDgzLCAweDJjLCAweDFhLCAweDFiLCAweDZlLCAweDVhLCAweGEwKTsKKwkmZGF0YV9ieXRlKDB4NTIsIDB4M2IsIDB4ZDYsIDB4YjMsIDB4MjksIDB4ZTMsIDB4MmYsIDB4ODQpOworCSZkYXRhX2J5dGUoMHg1MywgMHhkMSwgMHgwMCwgMHhlZCwgMHgyMCwgMHhmYywgMHhiMSwgMHg1Yik7CisJJmRhdGFfYnl0ZSgweDZhLCAweGNiLCAweGJlLCAweDM5LCAweDRhLCAweDRjLCAweDU4LCAweGNmKTsKKwkmZGF0YV9ieXRlKDB4ZDAsIDB4ZWYsIDB4YWEsIDB4ZmIsIDB4NDMsIDB4NGQsIDB4MzMsIDB4ODUpOworCSZkYXRhX2J5dGUoMHg0NSwgMHhmOSwgMHgwMiwgMHg3ZiwgMHg1MCwgMHgzYywgMHg5ZiwgMHhhOCk7CisJJmRhdGFfYnl0ZSgweDUxLCAweGEzLCAweDQwLCAweDhmLCAweDkyLCAweDlkLCAweDM4LCAweGY1KTsKKwkmZGF0YV9ieXRlKDB4YmMsIDB4YjYsIDB4ZGEsIDB4MjEsIDB4MTAsIDB4ZmYsIDB4ZjMsIDB4ZDIpOworCSZkYXRhX2J5dGUoMHhjZCwgMHgwYywgMHgxMywgMHhlYywgMHg1ZiwgMHg5NywgMHg0NCwgMHgxNyk7CisJJmRhdGFfYnl0ZSgweGM0LCAweGE3LCAweDdlLCAweDNkLCAweDY0LCAweDVkLCAweDE5LCAweDczKTsKKwkmZGF0YV9ieXRlKDB4NjAsIDB4ODEsIDB4NGYsIDB4ZGMsIDB4MjIsIDB4MmEsIDB4OTAsIDB4ODgpOworCSZkYXRhX2J5dGUoMHg0NiwgMHhlZSwgMHhiOCwgMHgxNCwgMHhkZSwgMHg1ZSwgMHgwYiwgMHhkYik7CisJJmRhdGFfYnl0ZSgweGUwLCAweDMyLCAweDNhLCAweDBhLCAweDQ5LCAweDA2LCAweDI0LCAweDVjKTsKKwkmZGF0YV9ieXRlKDB4YzIsIDB4ZDMsIDB4YWMsIDB4NjIsIDB4OTEsIDB4OTUsIDB4ZTQsIDB4NzkpOworCSZkYXRhX2J5dGUoMHhlNywgMHhjOCwgMHgzNywgMHg2ZCwgMHg4ZCwgMHhkNSwgMHg0ZSwgMHhhOSk7CisJJmRhdGFfYnl0ZSgweDZjLCAweDU2LCAweGY0LCAweGVhLCAweDY1LCAweDdhLCAweGFlLCAweDA4KTsKKwkmZGF0YV9ieXRlKDB4YmEsIDB4NzgsIDB4MjUsIDB4MmUsIDB4MWMsIDB4YTYsIDB4YjQsIDB4YzYpOworCSZkYXRhX2J5dGUoMHhlOCwgMHhkZCwgMHg3NCwgMHgxZiwgMHg0YiwgMHhiZCwgMHg4YiwgMHg4YSk7CisJJmRhdGFfYnl0ZSgweDcwLCAweDNlLCAweGI1LCAweDY2LCAweDQ4LCAweDAzLCAweGY2LCAweDBlKTsKKwkmZGF0YV9ieXRlKDB4NjEsIDB4MzUsIDB4NTcsIDB4YjksIDB4ODYsIDB4YzEsIDB4MWQsIDB4OWUpOworCSZkYXRhX2J5dGUoMHhlMSwgMHhmOCwgMHg5OCwgMHgxMSwgMHg2OSwgMHhkOSwgMHg4ZSwgMHg5NCk7CisJJmRhdGFfYnl0ZSgweDliLCAweDFlLCAweDg3LCAweGU5LCAweGNlLCAweDU1LCAweDI4LCAweGRmKTsKKwkmZGF0YV9ieXRlKDB4OGMsIDB4YTEsIDB4ODksIDB4MGQsIDB4YmYsIDB4ZTYsIDB4NDIsIDB4NjgpOworCSZkYXRhX2J5dGUoMHg0MSwgMHg5OSwgMHgyZCwgMHgwZiwgMHhiMCwgMHg1NCwgMHhiYiwgMHgxNik7CisjcmNvbjoKKyRjb2RlLj08PF9fXzsKKwkubG9uZwkweDAwMDAwMDAxLCAweDAwMDAwMDAyLCAweDAwMDAwMDA0LCAweDAwMDAwMDA4CisJLmxvbmcJMHgwMDAwMDAxMCwgMHgwMDAwMDAyMCwgMHgwMDAwMDA0MCwgMHgwMDAwMDA4MAorCS5sb25nCTB4MDAwMDAwMWIsIDB4MDAwMDAwMzYsIDB4ODA4MDgwODAsIDB4ODA4MDgwODAKKwkubG9uZwkweGZlZmVmZWZlLCAweGZlZmVmZWZlLCAweDFiMWIxYjFiLCAweDFiMWIxYjFiCitfX18KKyRjb2RlLj08PF9fXzsKKy5hbGlnbgk2NAorLkxBRVNfVGQ6CitfX18KKwkmX2RhdGFfd29yZCgweDUwYTdmNDUxLCAweDUzNjU0MTdlLCAweGMzYTQxNzFhLCAweDk2NWUyNzNhKTsKKwkmX2RhdGFfd29yZCgweGNiNmJhYjNiLCAweGYxNDU5ZDFmLCAweGFiNThmYWFjLCAweDkzMDNlMzRiKTsKKwkmX2RhdGFfd29yZCgweDU1ZmEzMDIwLCAweGY2NmQ3NmFkLCAweDkxNzZjYzg4LCAweDI1NGMwMmY1KTsKKwkmX2RhdGFfd29yZCgweGZjZDdlNTRmLCAweGQ3Y2IyYWM1LCAweDgwNDQzNTI2LCAweDhmYTM2MmI1KTsKKwkmX2RhdGFfd29yZCgweDQ5NWFiMWRlLCAweDY3MWJiYTI1LCAweDk4MGVlYTQ1LCAweGUxYzBmZTVkKTsKKwkmX2RhdGFfd29yZCgweDAyNzUyZmMzLCAweDEyZjA0YzgxLCAweGEzOTc0NjhkLCAweGM2ZjlkMzZiKTsKKwkmX2RhdGFfd29yZCgweGU3NWY4ZjAzLCAweDk1OWM5MjE1LCAweGViN2E2ZGJmLCAweGRhNTk1Mjk1KTsKKwkmX2RhdGFfd29yZCgweDJkODNiZWQ0LCAweGQzMjE3NDU4LCAweDI5NjllMDQ5LCAweDQ0YzhjOThlKTsKKwkmX2RhdGFfd29yZCgweDZhODljMjc1LCAweDc4Nzk4ZWY0LCAweDZiM2U1ODk5LCAweGRkNzFiOTI3KTsKKwkmX2RhdGFfd29yZCgweGI2NGZlMWJlLCAweDE3YWQ4OGYwLCAweDY2YWMyMGM5LCAweGI0M2FjZTdkKTsKKwkmX2RhdGFfd29yZCgweDE4NGFkZjYzLCAweDgyMzExYWU1LCAweDYwMzM1MTk3LCAweDQ1N2Y1MzYyKTsKKwkmX2RhdGFfd29yZCgweGUwNzc2NGIxLCAweDg0YWU2YmJiLCAweDFjYTA4MWZlLCAweDk0MmIwOGY5KTsKKwkmX2RhdGFfd29yZCgweDU4Njg0ODcwLCAweDE5ZmQ0NThmLCAweDg3NmNkZTk0LCAweGI3Zjg3YjUyKTsKKwkmX2RhdGFfd29yZCgweDIzZDM3M2FiLCAweGUyMDI0YjcyLCAweDU3OGYxZmUzLCAweDJhYWI1NTY2KTsKKwkmX2RhdGFfd29yZCgweDA3MjhlYmIyLCAweDAzYzJiNTJmLCAweDlhN2JjNTg2LCAweGE1MDgzN2QzKTsKKwkmX2RhdGFfd29yZCgweGYyODcyODMwLCAweGIyYTViZjIzLCAweGJhNmEwMzAyLCAweDVjODIxNmVkKTsKKwkmX2RhdGFfd29yZCgweDJiMWNjZjhhLCAweDkyYjQ3OWE3LCAweGYwZjIwN2YzLCAweGExZTI2OTRlKTsKKwkmX2RhdGFfd29yZCgweGNkZjRkYTY1LCAweGQ1YmUwNTA2LCAweDFmNjIzNGQxLCAweDhhZmVhNmM0KTsKKwkmX2RhdGFfd29yZCgweDlkNTMyZTM0LCAweGEwNTVmM2EyLCAweDMyZTE4YTA1LCAweDc1ZWJmNmE0KTsKKwkmX2RhdGFfd29yZCgweDM5ZWM4MzBiLCAweGFhZWY2MDQwLCAweDA2OWY3MTVlLCAweDUxMTA2ZWJkKTsKKwkmX2RhdGFfd29yZCgweGY5OGEyMTNlLCAweDNkMDZkZDk2LCAweGFlMDUzZWRkLCAweDQ2YmRlNjRkKTsKKwkmX2RhdGFfd29yZCgweGI1OGQ1NDkxLCAweDA1NWRjNDcxLCAweDZmZDQwNjA0LCAweGZmMTU1MDYwKTsKKwkmX2RhdGFfd29yZCgweDI0ZmI5ODE5LCAweDk3ZTliZGQ2LCAweGNjNDM0MDg5LCAweDc3OWVkOTY3KTsKKwkmX2RhdGFfd29yZCgweGJkNDJlOGIwLCAweDg4OGI4OTA3LCAweDM4NWIxOWU3LCAweGRiZWVjODc5KTsKKwkmX2RhdGFfd29yZCgweDQ3MGE3Y2ExLCAweGU5MGY0MjdjLCAweGM5MWU4NGY4LCAweDAwMDAwMDAwKTsKKwkmX2RhdGFfd29yZCgweDgzODY4MDA5LCAweDQ4ZWQyYjMyLCAweGFjNzAxMTFlLCAweDRlNzI1YTZjKTsKKwkmX2RhdGFfd29yZCgweGZiZmYwZWZkLCAweDU2Mzg4NTBmLCAweDFlZDVhZTNkLCAweDI3MzkyZDM2KTsKKwkmX2RhdGFfd29yZCgweDY0ZDkwZjBhLCAweDIxYTY1YzY4LCAweGQxNTQ1YjliLCAweDNhMmUzNjI0KTsKKwkmX2RhdGFfd29yZCgweGIxNjcwYTBjLCAweDBmZTc1NzkzLCAweGQyOTZlZWI0LCAweDllOTE5YjFiKTsKKwkmX2RhdGFfd29yZCgweDRmYzVjMDgwLCAweGEyMjBkYzYxLCAweDY5NGI3NzVhLCAweDE2MWExMjFjKTsKKwkmX2RhdGFfd29yZCgweDBhYmE5M2UyLCAweGU1MmFhMGMwLCAweDQzZTAyMjNjLCAweDFkMTcxYjEyKTsKKwkmX2RhdGFfd29yZCgweDBiMGQwOTBlLCAweGFkYzc4YmYyLCAweGI5YThiNjJkLCAweGM4YTkxZTE0KTsKKwkmX2RhdGFfd29yZCgweDg1MTlmMTU3LCAweDRjMDc3NWFmLCAweGJiZGQ5OWVlLCAweGZkNjA3ZmEzKTsKKwkmX2RhdGFfd29yZCgweDlmMjYwMWY3LCAweGJjZjU3MjVjLCAweGM1M2I2NjQ0LCAweDM0N2VmYjViKTsKKwkmX2RhdGFfd29yZCgweDc2Mjk0MzhiLCAweGRjYzYyM2NiLCAweDY4ZmNlZGI2LCAweDYzZjFlNGI4KTsKKwkmX2RhdGFfd29yZCgweGNhZGMzMWQ3LCAweDEwODU2MzQyLCAweDQwMjI5NzEzLCAweDIwMTFjNjg0KTsKKwkmX2RhdGFfd29yZCgweDdkMjQ0YTg1LCAweGY4M2RiYmQyLCAweDExMzJmOWFlLCAweDZkYTEyOWM3KTsKKwkmX2RhdGFfd29yZCgweDRiMmY5ZTFkLCAweGYzMzBiMmRjLCAweGVjNTI4NjBkLCAweGQwZTNjMTc3KTsKKwkmX2RhdGFfd29yZCgweDZjMTZiMzJiLCAweDk5Yjk3MGE5LCAweGZhNDg5NDExLCAweDIyNjRlOTQ3KTsKKwkmX2RhdGFfd29yZCgweGM0OGNmY2E4LCAweDFhM2ZmMGEwLCAweGQ4MmM3ZDU2LCAweGVmOTAzMzIyKTsKKwkmX2RhdGFfd29yZCgweGM3NGU0OTg3LCAweGMxZDEzOGQ5LCAweGZlYTJjYThjLCAweDM2MGJkNDk4KTsKKwkmX2RhdGFfd29yZCgweGNmODFmNWE2LCAweDI4ZGU3YWE1LCAweDI2OGViN2RhLCAweGE0YmZhZDNmKTsKKwkmX2RhdGFfd29yZCgweGU0OWQzYTJjLCAweDBkOTI3ODUwLCAweDliY2M1ZjZhLCAweDYyNDY3ZTU0KTsKKwkmX2RhdGFfd29yZCgweGMyMTM4ZGY2LCAweGU4YjhkODkwLCAweDVlZjczOTJlLCAweGY1YWZjMzgyKTsKKwkmX2RhdGFfd29yZCgweGJlODA1ZDlmLCAweDdjOTNkMDY5LCAweGE5MmRkNTZmLCAweGIzMTIyNWNmKTsKKwkmX2RhdGFfd29yZCgweDNiOTlhY2M4LCAweGE3N2QxODEwLCAweDZlNjM5Y2U4LCAweDdiYmIzYmRiKTsKKwkmX2RhdGFfd29yZCgweDA5NzgyNmNkLCAweGY0MTg1OTZlLCAweDAxYjc5YWVjLCAweGE4OWE0ZjgzKTsKKwkmX2RhdGFfd29yZCgweDY1NmU5NWU2LCAweDdlZTZmZmFhLCAweDA4Y2ZiYzIxLCAweGU2ZTgxNWVmKTsKKwkmX2RhdGFfd29yZCgweGQ5OWJlN2JhLCAweGNlMzY2ZjRhLCAweGQ0MDk5ZmVhLCAweGQ2N2NiMDI5KTsKKwkmX2RhdGFfd29yZCgweGFmYjJhNDMxLCAweDMxMjMzZjJhLCAweDMwOTRhNWM2LCAweGMwNjZhMjM1KTsKKwkmX2RhdGFfd29yZCgweDM3YmM0ZTc0LCAweGE2Y2E4MmZjLCAweGIwZDA5MGUwLCAweDE1ZDhhNzMzKTsKKwkmX2RhdGFfd29yZCgweDRhOTgwNGYxLCAweGY3ZGFlYzQxLCAweDBlNTBjZDdmLCAweDJmZjY5MTE3KTsKKwkmX2RhdGFfd29yZCgweDhkZDY0ZDc2LCAweDRkYjBlZjQzLCAweDU0NGRhYWNjLCAweGRmMDQ5NmU0KTsKKwkmX2RhdGFfd29yZCgweGUzYjVkMTllLCAweDFiODg2YTRjLCAweGI4MWYyY2MxLCAweDdmNTE2NTQ2KTsKKwkmX2RhdGFfd29yZCgweDA0ZWE1ZTlkLCAweDVkMzU4YzAxLCAweDczNzQ4N2ZhLCAweDJlNDEwYmZiKTsKKwkmX2RhdGFfd29yZCgweDVhMWQ2N2IzLCAweDUyZDJkYjkyLCAweDMzNTYxMGU5LCAweDEzNDdkNjZkKTsKKwkmX2RhdGFfd29yZCgweDhjNjFkNzlhLCAweDdhMGNhMTM3LCAweDhlMTRmODU5LCAweDg5M2MxM2ViKTsKKwkmX2RhdGFfd29yZCgweGVlMjdhOWNlLCAweDM1Yzk2MWI3LCAweGVkZTUxY2UxLCAweDNjYjE0NzdhKTsKKwkmX2RhdGFfd29yZCgweDU5ZGZkMjljLCAweDNmNzNmMjU1LCAweDc5Y2UxNDE4LCAweGJmMzdjNzczKTsKKwkmX2RhdGFfd29yZCgweGVhY2RmNzUzLCAweDViYWFmZDVmLCAweDE0NmYzZGRmLCAweDg2ZGI0NDc4KTsKKwkmX2RhdGFfd29yZCgweDgxZjNhZmNhLCAweDNlYzQ2OGI5LCAweDJjMzQyNDM4LCAweDVmNDBhM2MyKTsKKwkmX2RhdGFfd29yZCgweDcyYzMxZDE2LCAweDBjMjVlMmJjLCAweDhiNDkzYzI4LCAweDQxOTUwZGZmKTsKKwkmX2RhdGFfd29yZCgweDcxMDFhODM5LCAweGRlYjMwYzA4LCAweDljZTRiNGQ4LCAweDkwYzE1NjY0KTsKKwkmX2RhdGFfd29yZCgweDYxODRjYjdiLCAweDcwYjYzMmQ1LCAweDc0NWM2YzQ4LCAweDQyNTdiOGQwKTsKKworI1RkNDoJIyBmb3VyIGNvcGllcyBvZiBUZDQgdG8gY2hvb3NlIGZyb20gdG8gYXZvaWQgTDEgYWxpYXNpbmcKKwkmZGF0YV9ieXRlKDB4NTIsIDB4MDksIDB4NmEsIDB4ZDUsIDB4MzAsIDB4MzYsIDB4YTUsIDB4MzgpOworCSZkYXRhX2J5dGUoMHhiZiwgMHg0MCwgMHhhMywgMHg5ZSwgMHg4MSwgMHhmMywgMHhkNywgMHhmYik7CisJJmRhdGFfYnl0ZSgweDdjLCAweGUzLCAweDM5LCAweDgyLCAweDliLCAweDJmLCAweGZmLCAweDg3KTsKKwkmZGF0YV9ieXRlKDB4MzQsIDB4OGUsIDB4NDMsIDB4NDQsIDB4YzQsIDB4ZGUsIDB4ZTksIDB4Y2IpOworCSZkYXRhX2J5dGUoMHg1NCwgMHg3YiwgMHg5NCwgMHgzMiwgMHhhNiwgMHhjMiwgMHgyMywgMHgzZCk7CisJJmRhdGFfYnl0ZSgweGVlLCAweDRjLCAweDk1LCAweDBiLCAweDQyLCAweGZhLCAweGMzLCAweDRlKTsKKwkmZGF0YV9ieXRlKDB4MDgsIDB4MmUsIDB4YTEsIDB4NjYsIDB4MjgsIDB4ZDksIDB4MjQsIDB4YjIpOworCSZkYXRhX2J5dGUoMHg3NiwgMHg1YiwgMHhhMiwgMHg0OSwgMHg2ZCwgMHg4YiwgMHhkMSwgMHgyNSk7CisJJmRhdGFfYnl0ZSgweDcyLCAweGY4LCAweGY2LCAweDY0LCAweDg2LCAweDY4LCAweDk4LCAweDE2KTsKKwkmZGF0YV9ieXRlKDB4ZDQsIDB4YTQsIDB4NWMsIDB4Y2MsIDB4NWQsIDB4NjUsIDB4YjYsIDB4OTIpOworCSZkYXRhX2J5dGUoMHg2YywgMHg3MCwgMHg0OCwgMHg1MCwgMHhmZCwgMHhlZCwgMHhiOSwgMHhkYSk7CisJJmRhdGFfYnl0ZSgweDVlLCAweDE1LCAweDQ2LCAweDU3LCAweGE3LCAweDhkLCAweDlkLCAweDg0KTsKKwkmZGF0YV9ieXRlKDB4OTAsIDB4ZDgsIDB4YWIsIDB4MDAsIDB4OGMsIDB4YmMsIDB4ZDMsIDB4MGEpOworCSZkYXRhX2J5dGUoMHhmNywgMHhlNCwgMHg1OCwgMHgwNSwgMHhiOCwgMHhiMywgMHg0NSwgMHgwNik7CisJJmRhdGFfYnl0ZSgweGQwLCAweDJjLCAweDFlLCAweDhmLCAweGNhLCAweDNmLCAweDBmLCAweDAyKTsKKwkmZGF0YV9ieXRlKDB4YzEsIDB4YWYsIDB4YmQsIDB4MDMsIDB4MDEsIDB4MTMsIDB4OGEsIDB4NmIpOworCSZkYXRhX2J5dGUoMHgzYSwgMHg5MSwgMHgxMSwgMHg0MSwgMHg0ZiwgMHg2NywgMHhkYywgMHhlYSk7CisJJmRhdGFfYnl0ZSgweDk3LCAweGYyLCAweGNmLCAweGNlLCAweGYwLCAweGI0LCAweGU2LCAweDczKTsKKwkmZGF0YV9ieXRlKDB4OTYsIDB4YWMsIDB4NzQsIDB4MjIsIDB4ZTcsIDB4YWQsIDB4MzUsIDB4ODUpOworCSZkYXRhX2J5dGUoMHhlMiwgMHhmOSwgMHgzNywgMHhlOCwgMHgxYywgMHg3NSwgMHhkZiwgMHg2ZSk7CisJJmRhdGFfYnl0ZSgweDQ3LCAweGYxLCAweDFhLCAweDcxLCAweDFkLCAweDI5LCAweGM1LCAweDg5KTsKKwkmZGF0YV9ieXRlKDB4NmYsIDB4YjcsIDB4NjIsIDB4MGUsIDB4YWEsIDB4MTgsIDB4YmUsIDB4MWIpOworCSZkYXRhX2J5dGUoMHhmYywgMHg1NiwgMHgzZSwgMHg0YiwgMHhjNiwgMHhkMiwgMHg3OSwgMHgyMCk7CisJJmRhdGFfYnl0ZSgweDlhLCAweGRiLCAweGMwLCAweGZlLCAweDc4LCAweGNkLCAweDVhLCAweGY0KTsKKwkmZGF0YV9ieXRlKDB4MWYsIDB4ZGQsIDB4YTgsIDB4MzMsIDB4ODgsIDB4MDcsIDB4YzcsIDB4MzEpOworCSZkYXRhX2J5dGUoMHhiMSwgMHgxMiwgMHgxMCwgMHg1OSwgMHgyNywgMHg4MCwgMHhlYywgMHg1Zik7CisJJmRhdGFfYnl0ZSgweDYwLCAweDUxLCAweDdmLCAweGE5LCAweDE5LCAweGI1LCAweDRhLCAweDBkKTsKKwkmZGF0YV9ieXRlKDB4MmQsIDB4ZTUsIDB4N2EsIDB4OWYsIDB4OTMsIDB4YzksIDB4OWMsIDB4ZWYpOworCSZkYXRhX2J5dGUoMHhhMCwgMHhlMCwgMHgzYiwgMHg0ZCwgMHhhZSwgMHgyYSwgMHhmNSwgMHhiMCk7CisJJmRhdGFfYnl0ZSgweGM4LCAweGViLCAweGJiLCAweDNjLCAweDgzLCAweDUzLCAweDk5LCAweDYxKTsKKwkmZGF0YV9ieXRlKDB4MTcsIDB4MmIsIDB4MDQsIDB4N2UsIDB4YmEsIDB4NzcsIDB4ZDYsIDB4MjYpOworCSZkYXRhX2J5dGUoMHhlMSwgMHg2OSwgMHgxNCwgMHg2MywgMHg1NSwgMHgyMSwgMHgwYywgMHg3ZCk7CiskY29kZS49PDxfX187CisJLmxvbmcJMHg4MDgwODA4MCwgMHg4MDgwODA4MCwgMHhmZWZlZmVmZSwgMHhmZWZlZmVmZQorCS5sb25nCTB4MWIxYjFiMWIsIDB4MWIxYjFiMWIsIDAsIDAKK19fXworCSZkYXRhX2J5dGUoMHg1MiwgMHgwOSwgMHg2YSwgMHhkNSwgMHgzMCwgMHgzNiwgMHhhNSwgMHgzOCk7CisJJmRhdGFfYnl0ZSgweGJmLCAweDQwLCAweGEzLCAweDllLCAweDgxLCAweGYzLCAweGQ3LCAweGZiKTsKKwkmZGF0YV9ieXRlKDB4N2MsIDB4ZTMsIDB4MzksIDB4ODIsIDB4OWIsIDB4MmYsIDB4ZmYsIDB4ODcpOworCSZkYXRhX2J5dGUoMHgzNCwgMHg4ZSwgMHg0MywgMHg0NCwgMHhjNCwgMHhkZSwgMHhlOSwgMHhjYik7CisJJmRhdGFfYnl0ZSgweDU0LCAweDdiLCAweDk0LCAweDMyLCAweGE2LCAweGMyLCAweDIzLCAweDNkKTsKKwkmZGF0YV9ieXRlKDB4ZWUsIDB4NGMsIDB4OTUsIDB4MGIsIDB4NDIsIDB4ZmEsIDB4YzMsIDB4NGUpOworCSZkYXRhX2J5dGUoMHgwOCwgMHgyZSwgMHhhMSwgMHg2NiwgMHgyOCwgMHhkOSwgMHgyNCwgMHhiMik7CisJJmRhdGFfYnl0ZSgweDc2LCAweDViLCAweGEyLCAweDQ5LCAweDZkLCAweDhiLCAweGQxLCAweDI1KTsKKwkmZGF0YV9ieXRlKDB4NzIsIDB4ZjgsIDB4ZjYsIDB4NjQsIDB4ODYsIDB4NjgsIDB4OTgsIDB4MTYpOworCSZkYXRhX2J5dGUoMHhkNCwgMHhhNCwgMHg1YywgMHhjYywgMHg1ZCwgMHg2NSwgMHhiNiwgMHg5Mik7CisJJmRhdGFfYnl0ZSgweDZjLCAweDcwLCAweDQ4LCAweDUwLCAweGZkLCAweGVkLCAweGI5LCAweGRhKTsKKwkmZGF0YV9ieXRlKDB4NWUsIDB4MTUsIDB4NDYsIDB4NTcsIDB4YTcsIDB4OGQsIDB4OWQsIDB4ODQpOworCSZkYXRhX2J5dGUoMHg5MCwgMHhkOCwgMHhhYiwgMHgwMCwgMHg4YywgMHhiYywgMHhkMywgMHgwYSk7CisJJmRhdGFfYnl0ZSgweGY3LCAweGU0LCAweDU4LCAweDA1LCAweGI4LCAweGIzLCAweDQ1LCAweDA2KTsKKwkmZGF0YV9ieXRlKDB4ZDAsIDB4MmMsIDB4MWUsIDB4OGYsIDB4Y2EsIDB4M2YsIDB4MGYsIDB4MDIpOworCSZkYXRhX2J5dGUoMHhjMSwgMHhhZiwgMHhiZCwgMHgwMywgMHgwMSwgMHgxMywgMHg4YSwgMHg2Yik7CisJJmRhdGFfYnl0ZSgweDNhLCAweDkxLCAweDExLCAweDQxLCAweDRmLCAweDY3LCAweGRjLCAweGVhKTsKKwkmZGF0YV9ieXRlKDB4OTcsIDB4ZjIsIDB4Y2YsIDB4Y2UsIDB4ZjAsIDB4YjQsIDB4ZTYsIDB4NzMpOworCSZkYXRhX2J5dGUoMHg5NiwgMHhhYywgMHg3NCwgMHgyMiwgMHhlNywgMHhhZCwgMHgzNSwgMHg4NSk7CisJJmRhdGFfYnl0ZSgweGUyLCAweGY5LCAweDM3LCAweGU4LCAweDFjLCAweDc1LCAweGRmLCAweDZlKTsKKwkmZGF0YV9ieXRlKDB4NDcsIDB4ZjEsIDB4MWEsIDB4NzEsIDB4MWQsIDB4MjksIDB4YzUsIDB4ODkpOworCSZkYXRhX2J5dGUoMHg2ZiwgMHhiNywgMHg2MiwgMHgwZSwgMHhhYSwgMHgxOCwgMHhiZSwgMHgxYik7CisJJmRhdGFfYnl0ZSgweGZjLCAweDU2LCAweDNlLCAweDRiLCAweGM2LCAweGQyLCAweDc5LCAweDIwKTsKKwkmZGF0YV9ieXRlKDB4OWEsIDB4ZGIsIDB4YzAsIDB4ZmUsIDB4NzgsIDB4Y2QsIDB4NWEsIDB4ZjQpOworCSZkYXRhX2J5dGUoMHgxZiwgMHhkZCwgMHhhOCwgMHgzMywgMHg4OCwgMHgwNywgMHhjNywgMHgzMSk7CisJJmRhdGFfYnl0ZSgweGIxLCAweDEyLCAweDEwLCAweDU5LCAweDI3LCAweDgwLCAweGVjLCAweDVmKTsKKwkmZGF0YV9ieXRlKDB4NjAsIDB4NTEsIDB4N2YsIDB4YTksIDB4MTksIDB4YjUsIDB4NGEsIDB4MGQpOworCSZkYXRhX2J5dGUoMHgyZCwgMHhlNSwgMHg3YSwgMHg5ZiwgMHg5MywgMHhjOSwgMHg5YywgMHhlZik7CisJJmRhdGFfYnl0ZSgweGEwLCAweGUwLCAweDNiLCAweDRkLCAweGFlLCAweDJhLCAweGY1LCAweGIwKTsKKwkmZGF0YV9ieXRlKDB4YzgsIDB4ZWIsIDB4YmIsIDB4M2MsIDB4ODMsIDB4NTMsIDB4OTksIDB4NjEpOworCSZkYXRhX2J5dGUoMHgxNywgMHgyYiwgMHgwNCwgMHg3ZSwgMHhiYSwgMHg3NywgMHhkNiwgMHgyNik7CisJJmRhdGFfYnl0ZSgweGUxLCAweDY5LCAweDE0LCAweDYzLCAweDU1LCAweDIxLCAweDBjLCAweDdkKTsKKyRjb2RlLj08PF9fXzsKKwkubG9uZwkweDgwODA4MDgwLCAweDgwODA4MDgwLCAweGZlZmVmZWZlLCAweGZlZmVmZWZlCisJLmxvbmcJMHgxYjFiMWIxYiwgMHgxYjFiMWIxYiwgMCwgMAorX19fCisJJmRhdGFfYnl0ZSgweDUyLCAweDA5LCAweDZhLCAweGQ1LCAweDMwLCAweDM2LCAweGE1LCAweDM4KTsKKwkmZGF0YV9ieXRlKDB4YmYsIDB4NDAsIDB4YTMsIDB4OWUsIDB4ODEsIDB4ZjMsIDB4ZDcsIDB4ZmIpOworCSZkYXRhX2J5dGUoMHg3YywgMHhlMywgMHgzOSwgMHg4MiwgMHg5YiwgMHgyZiwgMHhmZiwgMHg4Nyk7CisJJmRhdGFfYnl0ZSgweDM0LCAweDhlLCAweDQzLCAweDQ0LCAweGM0LCAweGRlLCAweGU5LCAweGNiKTsKKwkmZGF0YV9ieXRlKDB4NTQsIDB4N2IsIDB4OTQsIDB4MzIsIDB4YTYsIDB4YzIsIDB4MjMsIDB4M2QpOworCSZkYXRhX2J5dGUoMHhlZSwgMHg0YywgMHg5NSwgMHgwYiwgMHg0MiwgMHhmYSwgMHhjMywgMHg0ZSk7CisJJmRhdGFfYnl0ZSgweDA4LCAweDJlLCAweGExLCAweDY2LCAweDI4LCAweGQ5LCAweDI0LCAweGIyKTsKKwkmZGF0YV9ieXRlKDB4NzYsIDB4NWIsIDB4YTIsIDB4NDksIDB4NmQsIDB4OGIsIDB4ZDEsIDB4MjUpOworCSZkYXRhX2J5dGUoMHg3MiwgMHhmOCwgMHhmNiwgMHg2NCwgMHg4NiwgMHg2OCwgMHg5OCwgMHgxNik7CisJJmRhdGFfYnl0ZSgweGQ0LCAweGE0LCAweDVjLCAweGNjLCAweDVkLCAweDY1LCAweGI2LCAweDkyKTsKKwkmZGF0YV9ieXRlKDB4NmMsIDB4NzAsIDB4NDgsIDB4NTAsIDB4ZmQsIDB4ZWQsIDB4YjksIDB4ZGEpOworCSZkYXRhX2J5dGUoMHg1ZSwgMHgxNSwgMHg0NiwgMHg1NywgMHhhNywgMHg4ZCwgMHg5ZCwgMHg4NCk7CisJJmRhdGFfYnl0ZSgweDkwLCAweGQ4LCAweGFiLCAweDAwLCAweDhjLCAweGJjLCAweGQzLCAweDBhKTsKKwkmZGF0YV9ieXRlKDB4ZjcsIDB4ZTQsIDB4NTgsIDB4MDUsIDB4YjgsIDB4YjMsIDB4NDUsIDB4MDYpOworCSZkYXRhX2J5dGUoMHhkMCwgMHgyYywgMHgxZSwgMHg4ZiwgMHhjYSwgMHgzZiwgMHgwZiwgMHgwMik7CisJJmRhdGFfYnl0ZSgweGMxLCAweGFmLCAweGJkLCAweDAzLCAweDAxLCAweDEzLCAweDhhLCAweDZiKTsKKwkmZGF0YV9ieXRlKDB4M2EsIDB4OTEsIDB4MTEsIDB4NDEsIDB4NGYsIDB4NjcsIDB4ZGMsIDB4ZWEpOworCSZkYXRhX2J5dGUoMHg5NywgMHhmMiwgMHhjZiwgMHhjZSwgMHhmMCwgMHhiNCwgMHhlNiwgMHg3Myk7CisJJmRhdGFfYnl0ZSgweDk2LCAweGFjLCAweDc0LCAweDIyLCAweGU3LCAweGFkLCAweDM1LCAweDg1KTsKKwkmZGF0YV9ieXRlKDB4ZTIsIDB4ZjksIDB4MzcsIDB4ZTgsIDB4MWMsIDB4NzUsIDB4ZGYsIDB4NmUpOworCSZkYXRhX2J5dGUoMHg0NywgMHhmMSwgMHgxYSwgMHg3MSwgMHgxZCwgMHgyOSwgMHhjNSwgMHg4OSk7CisJJmRhdGFfYnl0ZSgweDZmLCAweGI3LCAweDYyLCAweDBlLCAweGFhLCAweDE4LCAweGJlLCAweDFiKTsKKwkmZGF0YV9ieXRlKDB4ZmMsIDB4NTYsIDB4M2UsIDB4NGIsIDB4YzYsIDB4ZDIsIDB4NzksIDB4MjApOworCSZkYXRhX2J5dGUoMHg5YSwgMHhkYiwgMHhjMCwgMHhmZSwgMHg3OCwgMHhjZCwgMHg1YSwgMHhmNCk7CisJJmRhdGFfYnl0ZSgweDFmLCAweGRkLCAweGE4LCAweDMzLCAweDg4LCAweDA3LCAweGM3LCAweDMxKTsKKwkmZGF0YV9ieXRlKDB4YjEsIDB4MTIsIDB4MTAsIDB4NTksIDB4MjcsIDB4ODAsIDB4ZWMsIDB4NWYpOworCSZkYXRhX2J5dGUoMHg2MCwgMHg1MSwgMHg3ZiwgMHhhOSwgMHgxOSwgMHhiNSwgMHg0YSwgMHgwZCk7CisJJmRhdGFfYnl0ZSgweDJkLCAweGU1LCAweDdhLCAweDlmLCAweDkzLCAweGM5LCAweDljLCAweGVmKTsKKwkmZGF0YV9ieXRlKDB4YTAsIDB4ZTAsIDB4M2IsIDB4NGQsIDB4YWUsIDB4MmEsIDB4ZjUsIDB4YjApOworCSZkYXRhX2J5dGUoMHhjOCwgMHhlYiwgMHhiYiwgMHgzYywgMHg4MywgMHg1MywgMHg5OSwgMHg2MSk7CisJJmRhdGFfYnl0ZSgweDE3LCAweDJiLCAweDA0LCAweDdlLCAweGJhLCAweDc3LCAweGQ2LCAweDI2KTsKKwkmZGF0YV9ieXRlKDB4ZTEsIDB4NjksIDB4MTQsIDB4NjMsIDB4NTUsIDB4MjEsIDB4MGMsIDB4N2QpOworJGNvZGUuPTw8X19fOworCS5sb25nCTB4ODA4MDgwODAsIDB4ODA4MDgwODAsIDB4ZmVmZWZlZmUsIDB4ZmVmZWZlZmUKKwkubG9uZwkweDFiMWIxYjFiLCAweDFiMWIxYjFiLCAwLCAwCitfX18KKwkmZGF0YV9ieXRlKDB4NTIsIDB4MDksIDB4NmEsIDB4ZDUsIDB4MzAsIDB4MzYsIDB4YTUsIDB4MzgpOworCSZkYXRhX2J5dGUoMHhiZiwgMHg0MCwgMHhhMywgMHg5ZSwgMHg4MSwgMHhmMywgMHhkNywgMHhmYik7CisJJmRhdGFfYnl0ZSgweDdjLCAweGUzLCAweDM5LCAweDgyLCAweDliLCAweDJmLCAweGZmLCAweDg3KTsKKwkmZGF0YV9ieXRlKDB4MzQsIDB4OGUsIDB4NDMsIDB4NDQsIDB4YzQsIDB4ZGUsIDB4ZTksIDB4Y2IpOworCSZkYXRhX2J5dGUoMHg1NCwgMHg3YiwgMHg5NCwgMHgzMiwgMHhhNiwgMHhjMiwgMHgyMywgMHgzZCk7CisJJmRhdGFfYnl0ZSgweGVlLCAweDRjLCAweDk1LCAweDBiLCAweDQyLCAweGZhLCAweGMzLCAweDRlKTsKKwkmZGF0YV9ieXRlKDB4MDgsIDB4MmUsIDB4YTEsIDB4NjYsIDB4MjgsIDB4ZDksIDB4MjQsIDB4YjIpOworCSZkYXRhX2J5dGUoMHg3NiwgMHg1YiwgMHhhMiwgMHg0OSwgMHg2ZCwgMHg4YiwgMHhkMSwgMHgyNSk7CisJJmRhdGFfYnl0ZSgweDcyLCAweGY4LCAweGY2LCAweDY0LCAweDg2LCAweDY4LCAweDk4LCAweDE2KTsKKwkmZGF0YV9ieXRlKDB4ZDQsIDB4YTQsIDB4NWMsIDB4Y2MsIDB4NWQsIDB4NjUsIDB4YjYsIDB4OTIpOworCSZkYXRhX2J5dGUoMHg2YywgMHg3MCwgMHg0OCwgMHg1MCwgMHhmZCwgMHhlZCwgMHhiOSwgMHhkYSk7CisJJmRhdGFfYnl0ZSgweDVlLCAweDE1LCAweDQ2LCAweDU3LCAweGE3LCAweDhkLCAweDlkLCAweDg0KTsKKwkmZGF0YV9ieXRlKDB4OTAsIDB4ZDgsIDB4YWIsIDB4MDAsIDB4OGMsIDB4YmMsIDB4ZDMsIDB4MGEpOworCSZkYXRhX2J5dGUoMHhmNywgMHhlNCwgMHg1OCwgMHgwNSwgMHhiOCwgMHhiMywgMHg0NSwgMHgwNik7CisJJmRhdGFfYnl0ZSgweGQwLCAweDJjLCAweDFlLCAweDhmLCAweGNhLCAweDNmLCAweDBmLCAweDAyKTsKKwkmZGF0YV9ieXRlKDB4YzEsIDB4YWYsIDB4YmQsIDB4MDMsIDB4MDEsIDB4MTMsIDB4OGEsIDB4NmIpOworCSZkYXRhX2J5dGUoMHgzYSwgMHg5MSwgMHgxMSwgMHg0MSwgMHg0ZiwgMHg2NywgMHhkYywgMHhlYSk7CisJJmRhdGFfYnl0ZSgweDk3LCAweGYyLCAweGNmLCAweGNlLCAweGYwLCAweGI0LCAweGU2LCAweDczKTsKKwkmZGF0YV9ieXRlKDB4OTYsIDB4YWMsIDB4NzQsIDB4MjIsIDB4ZTcsIDB4YWQsIDB4MzUsIDB4ODUpOworCSZkYXRhX2J5dGUoMHhlMiwgMHhmOSwgMHgzNywgMHhlOCwgMHgxYywgMHg3NSwgMHhkZiwgMHg2ZSk7CisJJmRhdGFfYnl0ZSgweDQ3LCAweGYxLCAweDFhLCAweDcxLCAweDFkLCAweDI5LCAweGM1LCAweDg5KTsKKwkmZGF0YV9ieXRlKDB4NmYsIDB4YjcsIDB4NjIsIDB4MGUsIDB4YWEsIDB4MTgsIDB4YmUsIDB4MWIpOworCSZkYXRhX2J5dGUoMHhmYywgMHg1NiwgMHgzZSwgMHg0YiwgMHhjNiwgMHhkMiwgMHg3OSwgMHgyMCk7CisJJmRhdGFfYnl0ZSgweDlhLCAweGRiLCAweGMwLCAweGZlLCAweDc4LCAweGNkLCAweDVhLCAweGY0KTsKKwkmZGF0YV9ieXRlKDB4MWYsIDB4ZGQsIDB4YTgsIDB4MzMsIDB4ODgsIDB4MDcsIDB4YzcsIDB4MzEpOworCSZkYXRhX2J5dGUoMHhiMSwgMHgxMiwgMHgxMCwgMHg1OSwgMHgyNywgMHg4MCwgMHhlYywgMHg1Zik7CisJJmRhdGFfYnl0ZSgweDYwLCAweDUxLCAweDdmLCAweGE5LCAweDE5LCAweGI1LCAweDRhLCAweDBkKTsKKwkmZGF0YV9ieXRlKDB4MmQsIDB4ZTUsIDB4N2EsIDB4OWYsIDB4OTMsIDB4YzksIDB4OWMsIDB4ZWYpOworCSZkYXRhX2J5dGUoMHhhMCwgMHhlMCwgMHgzYiwgMHg0ZCwgMHhhZSwgMHgyYSwgMHhmNSwgMHhiMCk7CisJJmRhdGFfYnl0ZSgweGM4LCAweGViLCAweGJiLCAweDNjLCAweDgzLCAweDUzLCAweDk5LCAweDYxKTsKKwkmZGF0YV9ieXRlKDB4MTcsIDB4MmIsIDB4MDQsIDB4N2UsIDB4YmEsIDB4NzcsIDB4ZDYsIDB4MjYpOworCSZkYXRhX2J5dGUoMHhlMSwgMHg2OSwgMHgxNCwgMHg2MywgMHg1NSwgMHgyMSwgMHgwYywgMHg3ZCk7CiskY29kZS49PDxfX187CisJLmxvbmcJMHg4MDgwODA4MCwgMHg4MDgwODA4MCwgMHhmZWZlZmVmZSwgMHhmZWZlZmVmZQorCS5sb25nCTB4MWIxYjFiMWIsIDB4MWIxYjFiMWIsIDAsIDAKKy5hc2NpeiAgIkFFUyBmb3IgeDg2XzY0LCBDUllQVE9HQU1TIGJ5IDxhcHByb1xAb3BlbnNzbC5vcmc+IgorLmFsaWduCTY0CitfX18KKworIyBFWENFUFRJT05fRElTUE9TSVRJT04gaGFuZGxlciAoRVhDRVBUSU9OX1JFQ09SRCAqcmVjLFVMT05HNjQgZnJhbWUsCisjCQlDT05URVhUICpjb250ZXh0LERJU1BBVENIRVJfQ09OVEVYVCAqZGlzcCkKK2lmICgkd2luNjQpIHsKKyRyZWM9IiVyY3giOworJGZyYW1lPSIlcmR4IjsKKyRjb250ZXh0PSIlcjgiOworJGRpc3A9IiVyOSI7CisKKyRjb2RlLj08PF9fXzsKKy5leHRlcm4JX19pbXBfUnRsVmlydHVhbFVud2luZAorLnR5cGUJYmxvY2tfc2VfaGFuZGxlcixcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMTYKK2Jsb2NrX3NlX2hhbmRsZXI6CisJcHVzaAklcnNpCisJcHVzaAklcmRpCisJcHVzaAklcmJ4CisJcHVzaAklcmJwCisJcHVzaAklcjEyCisJcHVzaAklcjEzCisJcHVzaAklcjE0CisJcHVzaAklcjE1CisJcHVzaGZxCisJc3ViCVwkNjQsJXJzcAorCisJbW92CTEyMCgkY29udGV4dCksJXJheAkjIHB1bGwgY29udGV4dC0+UmF4CisJbW92CTI0OCgkY29udGV4dCksJXJieAkjIHB1bGwgY29udGV4dC0+UmlwCisKKwltb3YJOCgkZGlzcCksJXJzaQkJIyBkaXNwLT5JbWFnZUJhc2UKKwltb3YJNTYoJGRpc3ApLCVyMTEJCSMgZGlzcC0+SGFuZGxlckRhdGEKKworCW1vdgkwKCVyMTEpLCVyMTBkCQkjIEhhbmRsZXJEYXRhWzBdCisJbGVhCSglcnNpLCVyMTApLCVyMTAJIyBwcm9sb2d1ZSBsYWJlbAorCWNtcAklcjEwLCVyYngJCSMgY29udGV4dC0+UmlwPHByb2xvZ3VlIGxhYmVsCisJamIJLkxpbl9ibG9ja19wcm9sb2d1ZQorCisJbW92CTE1MigkY29udGV4dCksJXJheAkjIHB1bGwgY29udGV4dC0+UnNwCisKKwltb3YJNCglcjExKSwlcjEwZAkJIyBIYW5kbGVyRGF0YVsxXQorCWxlYQkoJXJzaSwlcjEwKSwlcjEwCSMgZXBpbG9ndWUgbGFiZWwKKwljbXAJJXIxMCwlcmJ4CQkjIGNvbnRleHQtPlJpcD49ZXBpbG9ndWUgbGFiZWwKKwlqYWUJLkxpbl9ibG9ja19wcm9sb2d1ZQorCisJbW92CTI0KCVyYXgpLCVyYXgJCSMgcHVsbCBzYXZlZCByZWFsIHN0YWNrIHBvaW50ZXIKKwlsZWEJNDgoJXJheCksJXJheAkJIyBhZGp1c3QuLi4KKworCW1vdgktOCglcmF4KSwlcmJ4CisJbW92CS0xNiglcmF4KSwlcmJwCisJbW92CS0yNCglcmF4KSwlcjEyCisJbW92CS0zMiglcmF4KSwlcjEzCisJbW92CS00MCglcmF4KSwlcjE0CisJbW92CS00OCglcmF4KSwlcjE1CisJbW92CSVyYngsMTQ0KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UmJ4CisJbW92CSVyYnAsMTYwKCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UmJwCisJbW92CSVyMTIsMjE2KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UjEyCisJbW92CSVyMTMsMjI0KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UjEzCisJbW92CSVyMTQsMjMyKCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UjE0CisJbW92CSVyMTUsMjQwKCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UjE1CisKKy5MaW5fYmxvY2tfcHJvbG9ndWU6CisJbW92CTgoJXJheCksJXJkaQorCW1vdgkxNiglcmF4KSwlcnNpCisJbW92CSVyYXgsMTUyKCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UnNwCisJbW92CSVyc2ksMTY4KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UnNpCisJbW92CSVyZGksMTc2KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UmRpCisKKwlqbXAJLkxjb21tb25fc2VoX2V4aXQKKy5zaXplCWJsb2NrX3NlX2hhbmRsZXIsLi1ibG9ja19zZV9oYW5kbGVyCisKKy50eXBlCWtleV9zZV9oYW5kbGVyLFxAYWJpLW9tbmlwb3RlbnQKKy5hbGlnbgkxNgora2V5X3NlX2hhbmRsZXI6CisJcHVzaAklcnNpCisJcHVzaAklcmRpCisJcHVzaAklcmJ4CisJcHVzaAklcmJwCisJcHVzaAklcjEyCisJcHVzaAklcjEzCisJcHVzaAklcjE0CisJcHVzaAklcjE1CisJcHVzaGZxCisJc3ViCVwkNjQsJXJzcAorCisJbW92CTEyMCgkY29udGV4dCksJXJheAkjIHB1bGwgY29udGV4dC0+UmF4CisJbW92CTI0OCgkY29udGV4dCksJXJieAkjIHB1bGwgY29udGV4dC0+UmlwCisKKwltb3YJOCgkZGlzcCksJXJzaQkJIyBkaXNwLT5JbWFnZUJhc2UKKwltb3YJNTYoJGRpc3ApLCVyMTEJCSMgZGlzcC0+SGFuZGxlckRhdGEKKworCW1vdgkwKCVyMTEpLCVyMTBkCQkjIEhhbmRsZXJEYXRhWzBdCisJbGVhCSglcnNpLCVyMTApLCVyMTAJIyBwcm9sb2d1ZSBsYWJlbAorCWNtcAklcjEwLCVyYngJCSMgY29udGV4dC0+UmlwPHByb2xvZ3VlIGxhYmVsCisJamIJLkxpbl9rZXlfcHJvbG9ndWUKKworCW1vdgkxNTIoJGNvbnRleHQpLCVyYXgJIyBwdWxsIGNvbnRleHQtPlJzcAorCisJbW92CTQoJXIxMSksJXIxMGQJCSMgSGFuZGxlckRhdGFbMV0KKwlsZWEJKCVyc2ksJXIxMCksJXIxMAkjIGVwaWxvZ3VlIGxhYmVsCisJY21wCSVyMTAsJXJieAkJIyBjb250ZXh0LT5SaXA+PWVwaWxvZ3VlIGxhYmVsCisJamFlCS5MaW5fa2V5X3Byb2xvZ3VlCisKKwlsZWEJNTYoJXJheCksJXJheAorCisJbW92CS04KCVyYXgpLCVyYngKKwltb3YJLTE2KCVyYXgpLCVyYnAKKwltb3YJLTI0KCVyYXgpLCVyMTIKKwltb3YJLTMyKCVyYXgpLCVyMTMKKwltb3YJLTQwKCVyYXgpLCVyMTQKKwltb3YJLTQ4KCVyYXgpLCVyMTUKKwltb3YJJXJieCwxNDQoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SYngKKwltb3YJJXJicCwxNjAoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SYnAKKwltb3YJJXIxMiwyMTYoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SMTIKKwltb3YJJXIxMywyMjQoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SMTMKKwltb3YJJXIxNCwyMzIoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SMTQKKwltb3YJJXIxNSwyNDAoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SMTUKKworLkxpbl9rZXlfcHJvbG9ndWU6CisJbW92CTgoJXJheCksJXJkaQorCW1vdgkxNiglcmF4KSwlcnNpCisJbW92CSVyYXgsMTUyKCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UnNwCisJbW92CSVyc2ksMTY4KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UnNpCisJbW92CSVyZGksMTc2KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UmRpCisKKwlqbXAJLkxjb21tb25fc2VoX2V4aXQKKy5zaXplCWtleV9zZV9oYW5kbGVyLC4ta2V5X3NlX2hhbmRsZXIKKworLnR5cGUJY2JjX3NlX2hhbmRsZXIsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2CitjYmNfc2VfaGFuZGxlcjoKKwlwdXNoCSVyc2kKKwlwdXNoCSVyZGkKKwlwdXNoCSVyYngKKwlwdXNoCSVyYnAKKwlwdXNoCSVyMTIKKwlwdXNoCSVyMTMKKwlwdXNoCSVyMTQKKwlwdXNoCSVyMTUKKwlwdXNoZnEKKwlzdWIJXCQ2NCwlcnNwCisKKwltb3YJMTIwKCRjb250ZXh0KSwlcmF4CSMgcHVsbCBjb250ZXh0LT5SYXgKKwltb3YJMjQ4KCRjb250ZXh0KSwlcmJ4CSMgcHVsbCBjb250ZXh0LT5SaXAKKworCWxlYQkuTGNiY19wcm9sb2d1ZSglcmlwKSwlcjEwCisJY21wCSVyMTAsJXJieAkJIyBjb250ZXh0LT5SaXA8LkxjYmNfcHJvbG9ndWUKKwlqYgkuTGluX2NiY19wcm9sb2d1ZQorCisJbGVhCS5MY2JjX2Zhc3RfYm9keSglcmlwKSwlcjEwCisJY21wCSVyMTAsJXJieAkJIyBjb250ZXh0LT5SaXA8LkxjYmNfZmFzdF9ib2R5CisJamIJLkxpbl9jYmNfZnJhbWVfc2V0dXAKKworCWxlYQkuTGNiY19zbG93X3Byb2xvZ3VlKCVyaXApLCVyMTAKKwljbXAJJXIxMCwlcmJ4CQkjIGNvbnRleHQtPlJpcDwuTGNiY19zbG93X3Byb2xvZ3VlCisJamIJLkxpbl9jYmNfYm9keQorCisJbGVhCS5MY2JjX3Nsb3dfYm9keSglcmlwKSwlcjEwCisJY21wCSVyMTAsJXJieAkJIyBjb250ZXh0LT5SaXA8LkxjYmNfc2xvd19ib2R5CisJamIJLkxpbl9jYmNfZnJhbWVfc2V0dXAKKworLkxpbl9jYmNfYm9keToKKwltb3YJMTUyKCRjb250ZXh0KSwlcmF4CSMgcHVsbCBjb250ZXh0LT5Sc3AKKworCWxlYQkuTGNiY19lcGlsb2d1ZSglcmlwKSwlcjEwCisJY21wCSVyMTAsJXJieAkJIyBjb250ZXh0LT5SaXA+PS5MY2JjX2VwaWxvZ3VlCisJamFlCS5MaW5fY2JjX3Byb2xvZ3VlCisKKwlsZWEJOCglcmF4KSwlcmF4CisKKwlsZWEJLkxjYmNfcG9wZnEoJXJpcCksJXIxMAorCWNtcAklcjEwLCVyYngJCSMgY29udGV4dC0+UmlwPj0uTGNiY19wb3BmcQorCWphZQkuTGluX2NiY19wcm9sb2d1ZQorCisJbW92CWAxNi04YCglcmF4KSwlcmF4CSMgYmlhc2VkICRfcnNwCisJbGVhCTU2KCVyYXgpLCVyYXgKKworLkxpbl9jYmNfZnJhbWVfc2V0dXA6CisJbW92CS0xNiglcmF4KSwlcmJ4CisJbW92CS0yNCglcmF4KSwlcmJwCisJbW92CS0zMiglcmF4KSwlcjEyCisJbW92CS00MCglcmF4KSwlcjEzCisJbW92CS00OCglcmF4KSwlcjE0CisJbW92CS01NiglcmF4KSwlcjE1CisJbW92CSVyYngsMTQ0KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UmJ4CisJbW92CSVyYnAsMTYwKCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UmJwCisJbW92CSVyMTIsMjE2KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UjEyCisJbW92CSVyMTMsMjI0KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UjEzCisJbW92CSVyMTQsMjMyKCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UjE0CisJbW92CSVyMTUsMjQwKCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UjE1CisKKy5MaW5fY2JjX3Byb2xvZ3VlOgorCW1vdgk4KCVyYXgpLCVyZGkKKwltb3YJMTYoJXJheCksJXJzaQorCW1vdgklcmF4LDE1MigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJzcAorCW1vdgklcnNpLDE2OCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJzaQorCW1vdgklcmRpLDE3NigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJkaQorCisuTGNvbW1vbl9zZWhfZXhpdDoKKworCW1vdgk0MCgkZGlzcCksJXJkaQkJIyBkaXNwLT5Db250ZXh0UmVjb3JkCisJbW92CSRjb250ZXh0LCVyc2kJCSMgY29udGV4dAorCW1vdglcJGAxMjMyLzhgLCVlY3gJCSMgc2l6ZW9mKENPTlRFWFQpCisJLmxvbmcJMHhhNTQ4ZjNmYwkJIyBjbGQ7IHJlcCBtb3ZzcQorCisJbW92CSRkaXNwLCVyc2kKKwl4b3IJJXJjeCwlcmN4CQkjIGFyZzEsIFVOV19GTEFHX05IQU5ETEVSCisJbW92CTgoJXJzaSksJXJkeAkJIyBhcmcyLCBkaXNwLT5JbWFnZUJhc2UKKwltb3YJMCglcnNpKSwlcjgJCSMgYXJnMywgZGlzcC0+Q29udHJvbFBjCisJbW92CTE2KCVyc2kpLCVyOQkJIyBhcmc0LCBkaXNwLT5GdW5jdGlvbkVudHJ5CisJbW92CTQwKCVyc2kpLCVyMTAJCSMgZGlzcC0+Q29udGV4dFJlY29yZAorCWxlYQk1NiglcnNpKSwlcjExCQkjICZkaXNwLT5IYW5kbGVyRGF0YQorCWxlYQkyNCglcnNpKSwlcjEyCQkjICZkaXNwLT5Fc3RhYmxpc2hlckZyYW1lCisJbW92CSVyMTAsMzIoJXJzcCkJCSMgYXJnNQorCW1vdgklcjExLDQwKCVyc3ApCQkjIGFyZzYKKwltb3YJJXIxMiw0OCglcnNwKQkJIyBhcmc3CisJbW92CSVyY3gsNTYoJXJzcCkJCSMgYXJnOCwgKE5VTEwpCisJY2FsbAkqX19pbXBfUnRsVmlydHVhbFVud2luZCglcmlwKQorCisJbW92CVwkMSwlZWF4CQkjIEV4Y2VwdGlvbkNvbnRpbnVlU2VhcmNoCisJYWRkCVwkNjQsJXJzcAorCXBvcGZxCisJcG9wCSVyMTUKKwlwb3AJJXIxNAorCXBvcAklcjEzCisJcG9wCSVyMTIKKwlwb3AJJXJicAorCXBvcAklcmJ4CisJcG9wCSVyZGkKKwlwb3AJJXJzaQorCXJldAorLnNpemUJY2JjX3NlX2hhbmRsZXIsLi1jYmNfc2VfaGFuZGxlcgorCisuc2VjdGlvbgkucGRhdGEKKy5hbGlnbgk0CisJLnJ2YQkuTFNFSF9iZWdpbl9BRVNfZW5jcnlwdAorCS5ydmEJLkxTRUhfZW5kX0FFU19lbmNyeXB0CisJLnJ2YQkuTFNFSF9pbmZvX0FFU19lbmNyeXB0CisKKwkucnZhCS5MU0VIX2JlZ2luX0FFU19kZWNyeXB0CisJLnJ2YQkuTFNFSF9lbmRfQUVTX2RlY3J5cHQKKwkucnZhCS5MU0VIX2luZm9fQUVTX2RlY3J5cHQKKworCS5ydmEJLkxTRUhfYmVnaW5fQUVTX3NldF9lbmNyeXB0X2tleQorCS5ydmEJLkxTRUhfZW5kX0FFU19zZXRfZW5jcnlwdF9rZXkKKwkucnZhCS5MU0VIX2luZm9fQUVTX3NldF9lbmNyeXB0X2tleQorCisJLnJ2YQkuTFNFSF9iZWdpbl9BRVNfc2V0X2RlY3J5cHRfa2V5CisJLnJ2YQkuTFNFSF9lbmRfQUVTX3NldF9kZWNyeXB0X2tleQorCS5ydmEJLkxTRUhfaW5mb19BRVNfc2V0X2RlY3J5cHRfa2V5CisKKwkucnZhCS5MU0VIX2JlZ2luX0FFU19jYmNfZW5jcnlwdAorCS5ydmEJLkxTRUhfZW5kX0FFU19jYmNfZW5jcnlwdAorCS5ydmEJLkxTRUhfaW5mb19BRVNfY2JjX2VuY3J5cHQKKworLnNlY3Rpb24JLnhkYXRhCisuYWxpZ24JOAorLkxTRUhfaW5mb19BRVNfZW5jcnlwdDoKKwkuYnl0ZQk5LDAsMCwwCisJLnJ2YQlibG9ja19zZV9oYW5kbGVyCisJLnJ2YQkuTGVuY19wcm9sb2d1ZSwuTGVuY19lcGlsb2d1ZQkjIEhhbmRsZXJEYXRhW10KKy5MU0VIX2luZm9fQUVTX2RlY3J5cHQ6CisJLmJ5dGUJOSwwLDAsMAorCS5ydmEJYmxvY2tfc2VfaGFuZGxlcgorCS5ydmEJLkxkZWNfcHJvbG9ndWUsLkxkZWNfZXBpbG9ndWUJIyBIYW5kbGVyRGF0YVtdCisuTFNFSF9pbmZvX0FFU19zZXRfZW5jcnlwdF9rZXk6CisJLmJ5dGUJOSwwLDAsMAorCS5ydmEJa2V5X3NlX2hhbmRsZXIKKwkucnZhCS5MZW5jX2tleV9wcm9sb2d1ZSwuTGVuY19rZXlfZXBpbG9ndWUJIyBIYW5kbGVyRGF0YVtdCisuTFNFSF9pbmZvX0FFU19zZXRfZGVjcnlwdF9rZXk6CisJLmJ5dGUJOSwwLDAsMAorCS5ydmEJa2V5X3NlX2hhbmRsZXIKKwkucnZhCS5MZGVjX2tleV9wcm9sb2d1ZSwuTGRlY19rZXlfZXBpbG9ndWUJIyBIYW5kbGVyRGF0YVtdCisuTFNFSF9pbmZvX0FFU19jYmNfZW5jcnlwdDoKKwkuYnl0ZQk5LDAsMCwwCisJLnJ2YQljYmNfc2VfaGFuZGxlcgorX19fCit9CisKKyRjb2RlID1+IHMvXGAoW15cYF0qKVxgL2V2YWwoJDEpL2dlbTsKKworcHJpbnQgJGNvZGU7CisKK2Nsb3NlIFNURE9VVDsKZGlmZiAtLWdpdCBhL2NyeXB0by9hZXMvYXNtL2Flc25pLXg4Ni5wbCBiL2NyeXB0by9hZXMvYXNtL2Flc25pLXg4Ni5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGMzNDViCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2Flcy9hc20vYWVzbmkteDg2LnBsCkBAIC0wLDAgKzEsMjE4OSBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFdyaXR0ZW4gYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+IGZvciB0aGUgT3BlblNTTAorIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCisjIENSWVBUT0dBTVMgbGljZW5zZXMgZGVwZW5kaW5nIG9uIHdoZXJlIHlvdSBvYnRhaW4gaXQuIEZvciBmdXJ0aGVyCisjIGRldGFpbHMgc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvfmFwcHJvL2NyeXB0b2dhbXMvLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIHN1cHBvcnQgZm9yIEludGVsIEFFUy1OSSBleHRlbnNpb24uIEluCisjIE9wZW5TU0wgY29udGV4dCBpdCdzIHVzZWQgd2l0aCBJbnRlbCBlbmdpbmUsIGJ1dCBjYW4gYWxzbyBiZSB1c2VkIGFzCisjIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIGNyeXB0by9hZXMvYXNtL2Flcy01ODYucGwgW3NlZSBiZWxvdyBmb3IKKyMgZGV0YWlsc10uCisjCisjIFBlcmZvcm1hbmNlLgorIworIyBUbyBzdGFydCB3aXRoIHNlZSBjb3JyZXNwb25kaW5nIHBhcmFncmFwaCBpbiBhZXNuaS14ODZfNjQucGwuLi4KKyMgSW5zdGVhZCBvZiBmaWxsaW5nIHRhYmxlIHNpbWlsYXIgdG8gb25lIGZvdW5kIHRoZXJlIEkndmUgY2hvc2VuIHRvCisjIHN1bW1hcml6ZSAqY29tcGFyaXNvbiogcmVzdWx0cyBmb3IgcmF3IEVDQiwgQ1RSIGFuZCBDQkMgYmVuY2htYXJrcy4KKyMgVGhlIHNpbXBsaWZpZWQgdGFibGUgYmVsb3cgcmVwcmVzZW50cyAzMi1iaXQgcGVyZm9ybWFuY2UgcmVsYXRpdmUKKyMgdG8gNjQtYml0IG9uZSBpbiBldmVyeSBnaXZlbiBwb2ludC4gUmF0aW9zIHZhcnkgZm9yIGRpZmZlcmVudAorIyBlbmNyeXB0aW9uIG1vZGVzLCB0aGVyZWZvcmUgaW50ZXJ2YWwgdmFsdWVzLgorIworIwkxNi1ieXRlICAgICA2NC1ieXRlICAgICAyNTYtYnl0ZSAgICAxLUtCICAgICAgICA4LUtCCisjCTUzLTY3JSAgICAgIDY3LTg0JSAgICAgIDkxLTk0JSAgICAgIDk1LTk4JSAgICAgIDk3LTk5LjUlCisjCisjIExvd2VyIHJhdGlvcyBmb3Igc21hbGxlciBibG9jayBzaXplcyBhcmUgcGVyZmVjdGx5IHVuZGVyc3RhbmRhYmxlLAorIyBiZWNhdXNlIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQgaXMgaGlnaGVyIGluIDMyLWJpdCBtb2RlLiBMYXJnZXN0CisjIDgtS0IgYmxvY2sgcGVyZm9ybWFuY2UgaXMgdmlydHVhbGx5IHNhbWU6IDMyLWJpdCBjb2RlIGlzIGxlc3MgdGhhbgorIyAxJSBzbG93ZXIgZm9yIEVDQiwgQ0JDIGFuZCBDQ00sIGFuZCB+MyUgc2xvd2VyIG90aGVyd2lzZS4KKworIyBKYW51YXJ5IDIwMTEKKyMKKyMgU2VlIGFlc25pLXg4Nl82NC5wbCBmb3IgZGV0YWlscy4gVW5saWtlIHg4Nl82NCB2ZXJzaW9uIHRoaXMgbW9kdWxlCisjIGludGVybGVhdmVzIGF0IG1vc3QgNiBhZXNbZW5jfGRlY10gaW5zdHJ1Y3Rpb25zLCBiZWNhdXNlIHRoZXJlIGFyZQorIyBub3QgZW5vdWdoIHJlZ2lzdGVycyBmb3IgOHggaW50ZXJsZWF2ZSBbd2hpY2ggc2hvdWxkIGJlIG9wdGltYWwgZm9yCisjIFNhbmR5IEJyaWRnZV0uIEFjdHVhbGx5LCBwZXJmb3JtYW5jZSByZXN1bHRzIGZvciA2eCBpbnRlcmxlYXZlCisjIGZhY3RvciBwcmVzZW50ZWQgaW4gYWVzbmkteDg2XzY0LnBsIChleGNlcHQgZm9yIENUUikgYXJlIGZvciB0aGlzCisjIG1vZHVsZS4KKworIyBBcHJpbCAyMDExCisjCisjIEFkZCBhZXNuaV94dHNfW2VufGRlXWNyeXB0LiBXZXN0bWVyZSBzcGVuZHMgMS41MCBjeWNsZXMgcHJvY2Vzc2luZworIyBvbmUgYnl0ZSBvdXQgb2YgOEtCIHdpdGggMTI4LWJpdCBrZXksIFNhbmR5IEJyaWRnZSAtIDEuMDkuCisKKyRQUkVGSVg9ImFlc25pIjsJIyBpZiAkUFJFRklYIGlzIHNldCB0byAiQUVTIiwgdGhlIHNjcmlwdAorCQkJIyBnZW5lcmF0ZXMgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IKKwkJCSMgY3J5cHRvL2Flcy9hc20vYWVzLTU4Ni5wbDotKQorJGlubGluZT0xOwkJIyBpbmxpbmUgX2Flc25pX1tlbnxkZV1jcnlwdAorCiskMCA9fiBtLyguKltcL1xcXSlbXlwvXFxdKyQvOyAkZGlyPSQxOworcHVzaChASU5DLCIke2Rpcn0iLCIke2Rpcn0uLi8uLi9wZXJsYXNtIik7CityZXF1aXJlICJ4ODZhc20ucGwiOworCismYXNtX2luaXQoJEFSR1ZbMF0sJDApOworCitpZiAoJFBSRUZJWCBlcSAiYWVzbmkiKQl7ICRtb3Zla2V5PSptb3Z1cHM7IH0KK2Vsc2UJCQl7ICRtb3Zla2V5PSptb3Z1cHM7IH0KKworJGxlbj0iZWF4IjsKKyRyb3VuZHM9ImVjeCI7Ciska2V5PSJlZHgiOworJGlucD0iZXNpIjsKKyRvdXQ9ImVkaSI7Ciskcm91bmRzXz0iZWJ4IjsJIyBiYWNrdXAgY29weSBmb3IgJHJvdW5kcworJGtleV89ImVicCI7CSMgYmFja3VwIGNvcHkgZm9yICRrZXkKKworJHJuZGtleTA9InhtbTAiOworJHJuZGtleTE9InhtbTEiOworJGlub3V0MD0ieG1tMiI7CiskaW5vdXQxPSJ4bW0zIjsKKyRpbm91dDI9InhtbTQiOworJGlub3V0Mz0ieG1tNSI7CSRpbjE9InhtbTUiOworJGlub3V0ND0ieG1tNiI7CSRpbjA9InhtbTYiOworJGlub3V0NT0ieG1tNyI7CSRpdmVjPSJ4bW03IjsKKworIyBBRVNOSSBleHRlbnN0aW9uCitzdWIgYWVza2V5Z2VuYXNzaXN0Cit7IG15KCRkc3QsJHNyYywkaW1tKT1AXzsKKyAgICBpZiAoIiRkc3Q6JHNyYyIgPX4gL3htbShbMC03XSk6eG1tKFswLTddKS8pCisgICAgewkmZGF0YV9ieXRlKDB4NjYsMHgwZiwweDNhLDB4ZGYsMHhjMHwoJDE8PDMpfCQyLCRpbW0pOwl9Cit9CitzdWIgYWVzY29tbW9uCit7IG15KCRvcGNvZGVsZXQsJGRzdCwkc3JjKT1AXzsKKyAgICBpZiAoIiRkc3Q6JHNyYyIgPX4gL3htbShbMC03XSk6eG1tKFswLTddKS8pCisgICAgewkmZGF0YV9ieXRlKDB4NjYsMHgwZiwweDM4LCRvcGNvZGVsZXQsMHhjMHwoJDE8PDMpfCQyKTt9Cit9CitzdWIgYWVzaW1jCXsgYWVzY29tbW9uKDB4ZGIsQF8pOyB9CitzdWIgYWVzZW5jCXsgYWVzY29tbW9uKDB4ZGMsQF8pOyB9CitzdWIgYWVzZW5jbGFzdAl7IGFlc2NvbW1vbigweGRkLEBfKTsgfQorc3ViIGFlc2RlYwl7IGFlc2NvbW1vbigweGRlLEBfKTsgfQorc3ViIGFlc2RlY2xhc3QJeyBhZXNjb21tb24oMHhkZixAXyk7IH0KKwwKKyMgSW5saW5lIHZlcnNpb24gb2YgaW50ZXJuYWwgYWVzbmlfW2VufGRlXWNyeXB0MQoreyBteSAkc247CitzdWIgYWVzbmlfaW5saW5lX2dlbmVyYXRlMQoreyBteSAoJHAsJGlub3V0LCRpdmVjKT1AXzsgJGlub3V0PSRpbm91dDAgaWYgKCFkZWZpbmVkKCRpbm91dCkpOworICAkc24rKzsKKworICAgICYkbW92ZWtleQkJKCRybmRrZXkwLCZRV1AoMCwka2V5KSk7CisgICAgJiRtb3Zla2V5CQkoJHJuZGtleTEsJlFXUCgxNiwka2V5KSk7CisgICAgJnhvcnBzCQkoJGl2ZWMsJHJuZGtleTApCWlmIChkZWZpbmVkKCRpdmVjKSk7CisgICAgJmxlYQkJKCRrZXksJkRXUCgzMiwka2V5KSk7CisgICAgJnhvcnBzCQkoJGlub3V0LCRpdmVjKQkJaWYgKGRlZmluZWQoJGl2ZWMpKTsKKyAgICAmeG9ycHMJCSgkaW5vdXQsJHJuZGtleTApCWlmICghZGVmaW5lZCgkaXZlYykpOworICAgICZzZXRfbGFiZWwoIiR7cH0xX2xvb3BfJHNuIik7CisJZXZhbCImYWVzJHtwfQkoJGlub3V0LCRybmRrZXkxKSI7CisJJmRlYwkJKCRyb3VuZHMpOworCSYkbW92ZWtleQkoJHJuZGtleTEsJlFXUCgwLCRrZXkpKTsKKwkmbGVhCQkoJGtleSwmRFdQKDE2LCRrZXkpKTsKKyAgICAmam56CQkoJmxhYmVsKCIke3B9MV9sb29wXyRzbiIpKTsKKyAgICBldmFsIiZhZXMke3B9bGFzdAkoJGlub3V0LCRybmRrZXkxKSI7Cit9fQorCitzdWIgYWVzbmlfZ2VuZXJhdGUxCSMgZnVsbHkgdW5yb2xsZWQgbG9vcAoreyBteSAoJHAsJGlub3V0KT1AXzsgJGlub3V0PSRpbm91dDAgaWYgKCFkZWZpbmVkKCRpbm91dCkpOworCisgICAgJmZ1bmN0aW9uX2JlZ2luX0IoIl9hZXNuaV8ke3B9cnlwdDEiKTsKKwkmbW92dXBzCQkoJHJuZGtleTAsJlFXUCgwLCRrZXkpKTsKKwkmJG1vdmVrZXkJKCRybmRrZXkxLCZRV1AoMHgxMCwka2V5KSk7CisJJnhvcnBzCQkoJGlub3V0LCRybmRrZXkwKTsKKwkmJG1vdmVrZXkJKCRybmRrZXkwLCZRV1AoMHgyMCwka2V5KSk7CisJJmxlYQkJKCRrZXksJkRXUCgweDMwLCRrZXkpKTsKKwkmY21wCQkoJHJvdW5kcywxMSk7CisJJmpiCQkoJmxhYmVsKCIke3B9MTI4IikpOworCSZsZWEJCSgka2V5LCZEV1AoMHgyMCwka2V5KSk7CisJJmplCQkoJmxhYmVsKCIke3B9MTkyIikpOworCSZsZWEJCSgka2V5LCZEV1AoMHgyMCwka2V5KSk7CisJZXZhbCImYWVzJHtwfQkoJGlub3V0LCRybmRrZXkxKSI7CisJJiRtb3Zla2V5CSgkcm5ka2V5MSwmUVdQKC0weDQwLCRrZXkpKTsKKwlldmFsIiZhZXMke3B9CSgkaW5vdXQsJHJuZGtleTApIjsKKwkmJG1vdmVrZXkJKCRybmRrZXkwLCZRV1AoLTB4MzAsJGtleSkpOworICAgICZzZXRfbGFiZWwoIiR7cH0xOTIiKTsKKwlldmFsIiZhZXMke3B9CSgkaW5vdXQsJHJuZGtleTEpIjsKKwkmJG1vdmVrZXkJKCRybmRrZXkxLCZRV1AoLTB4MjAsJGtleSkpOworCWV2YWwiJmFlcyR7cH0JKCRpbm91dCwkcm5ka2V5MCkiOworCSYkbW92ZWtleQkoJHJuZGtleTAsJlFXUCgtMHgxMCwka2V5KSk7CisgICAgJnNldF9sYWJlbCgiJHtwfTEyOCIpOworCWV2YWwiJmFlcyR7cH0JKCRpbm91dCwkcm5ka2V5MSkiOworCSYkbW92ZWtleQkoJHJuZGtleTEsJlFXUCgwLCRrZXkpKTsKKwlldmFsIiZhZXMke3B9CSgkaW5vdXQsJHJuZGtleTApIjsKKwkmJG1vdmVrZXkJKCRybmRrZXkwLCZRV1AoMHgxMCwka2V5KSk7CisJZXZhbCImYWVzJHtwfQkoJGlub3V0LCRybmRrZXkxKSI7CisJJiRtb3Zla2V5CSgkcm5ka2V5MSwmUVdQKDB4MjAsJGtleSkpOworCWV2YWwiJmFlcyR7cH0JKCRpbm91dCwkcm5ka2V5MCkiOworCSYkbW92ZWtleQkoJHJuZGtleTAsJlFXUCgweDMwLCRrZXkpKTsKKwlldmFsIiZhZXMke3B9CSgkaW5vdXQsJHJuZGtleTEpIjsKKwkmJG1vdmVrZXkJKCRybmRrZXkxLCZRV1AoMHg0MCwka2V5KSk7CisJZXZhbCImYWVzJHtwfQkoJGlub3V0LCRybmRrZXkwKSI7CisJJiRtb3Zla2V5CSgkcm5ka2V5MCwmUVdQKDB4NTAsJGtleSkpOworCWV2YWwiJmFlcyR7cH0JKCRpbm91dCwkcm5ka2V5MSkiOworCSYkbW92ZWtleQkoJHJuZGtleTEsJlFXUCgweDYwLCRrZXkpKTsKKwlldmFsIiZhZXMke3B9CSgkaW5vdXQsJHJuZGtleTApIjsKKwkmJG1vdmVrZXkJKCRybmRrZXkwLCZRV1AoMHg3MCwka2V5KSk7CisJZXZhbCImYWVzJHtwfQkoJGlub3V0LCRybmRrZXkxKSI7CisgICAgZXZhbCImYWVzJHtwfWxhc3QJKCRpbm91dCwkcm5ka2V5MCkiOworICAgICZyZXQoKTsKKyAgICAmZnVuY3Rpb25fZW5kX0IoIl9hZXNuaV8ke3B9cnlwdDEiKTsKK30KKwwKKyMgdm9pZCAkUFJFRklYX2VuY3J5cHQgKGNvbnN0IHZvaWQgKmlucCx2b2lkICpvdXQsY29uc3QgQUVTX0tFWSAqa2V5KTsKKyZhZXNuaV9nZW5lcmF0ZTEoImVuYyIpIGlmICghJGlubGluZSk7CismZnVuY3Rpb25fYmVnaW5fQigiJHtQUkVGSVh9X2VuY3J5cHQiKTsKKwkmbW92CSgiZWF4Iiwmd3BhcmFtKDApKTsKKwkmbW92CSgka2V5LCZ3cGFyYW0oMikpOworCSZtb3Z1cHMJKCRpbm91dDAsJlFXUCgwLCJlYXgiKSk7CisJJm1vdgkoJHJvdW5kcywmRFdQKDI0MCwka2V5KSk7CisJJm1vdgkoImVheCIsJndwYXJhbSgxKSk7CisJaWYgKCRpbmxpbmUpCisJeyAgICZhZXNuaV9pbmxpbmVfZ2VuZXJhdGUxKCJlbmMiKTsJfQorCWVsc2UKKwl7ICAgJmNhbGwJKCJfYWVzbmlfZW5jcnlwdDEiKTsJfQorCSZtb3Z1cHMJKCZRV1AoMCwiZWF4IiksJGlub3V0MCk7CisJJnJldAkoKTsKKyZmdW5jdGlvbl9lbmRfQigiJHtQUkVGSVh9X2VuY3J5cHQiKTsKKworIyB2b2lkICRQUkVGSVhfZGVjcnlwdCAoY29uc3Qgdm9pZCAqaW5wLHZvaWQgKm91dCxjb25zdCBBRVNfS0VZICprZXkpOworJmFlc25pX2dlbmVyYXRlMSgiZGVjIikgaWYoISRpbmxpbmUpOworJmZ1bmN0aW9uX2JlZ2luX0IoIiR7UFJFRklYfV9kZWNyeXB0Iik7CisJJm1vdgkoImVheCIsJndwYXJhbSgwKSk7CisJJm1vdgkoJGtleSwmd3BhcmFtKDIpKTsKKwkmbW92dXBzCSgkaW5vdXQwLCZRV1AoMCwiZWF4IikpOworCSZtb3YJKCRyb3VuZHMsJkRXUCgyNDAsJGtleSkpOworCSZtb3YJKCJlYXgiLCZ3cGFyYW0oMSkpOworCWlmICgkaW5saW5lKQorCXsgICAmYWVzbmlfaW5saW5lX2dlbmVyYXRlMSgiZGVjIik7CX0KKwllbHNlCisJeyAgICZjYWxsCSgiX2Flc25pX2RlY3J5cHQxIik7CX0KKwkmbW92dXBzCSgmUVdQKDAsImVheCIpLCRpbm91dDApOworCSZyZXQJKCk7CismZnVuY3Rpb25fZW5kX0IoIiR7UFJFRklYfV9kZWNyeXB0Iik7CisKKyMgX2Flc25pX1tlbnxkZV1jcnlwdE4gYXJlIHByaXZhdGUgaW50ZXJmYWNlcywgTiBkZW5vdGVzIGludGVybGVhdmUKKyMgZmFjdG9yLiBXaHkgM3ggc3Vicm91dGluZSB3ZXJlIG9yaWdpbmFsbHkgdXNlZCBpbiBsb29wcz8gRXZlbiB0aG91Z2gKKyMgYWVzW2VuY3xkZWNdIGxhdGVuY3kgd2FzIG9yaWdpbmFsbHkgNiwgaXQgY291bGQgYmUgc2NoZWR1bGVkIG9ubHkKKyMgZXZlcnkgKjJuZCogY3ljbGUuIFRodXMgM3ggaW50ZXJsZWF2ZSB3YXMgdGhlIG9uZSBwcm92aWRpbmcgb3B0aW1hbAorIyB1dGlsaXphdGlvbiwgaS5lLiB3aGVuIHN1YnJvdXRpbmUncyB0aHJvdWdocHV0IGlzIHZpcnR1YWxseSBzYW1lIGFzCisjIG9mIG5vbi1pbnRlcmxlYXZlZCBzdWJyb3V0aW5lIFtmb3IgbnVtYmVyIG9mIGlucHV0IGJsb2NrcyB1cCB0byAzXS4KKyMgVGhpcyBpcyB3aHkgaXQgbWFrZXMgbm8gc2Vuc2UgdG8gaW1wbGVtZW50IDJ4IHN1YnJvdXRpbmUuCisjIGFlc1tlbmN8ZGVjXSBsYXRlbmN5IGluIG5leHQgcHJvY2Vzc29yIGdlbmVyYXRpb24gaXMgOCwgYnV0IHRoZQorIyBpbnN0cnVjdGlvbnMgY2FuIGJlIHNjaGVkdWxlZCBldmVyeSBjeWNsZS4gT3B0aW1hbCBpbnRlcmxlYXZlIGZvcgorIyBuZXcgcHJvY2Vzc29yIGlzIHRoZXJlZm9yZSA4eCwgYnV0IGl0J3MgdW5mZWFzaWJsZSB0byBhY2NvbW1vZGF0ZSBpdAorIyBpbiBYTU0gcmVnaXN0ZXJzIGFkZHJlYXNzYWJsZSBpbiAzMi1iaXQgbW9kZSBhbmQgdGhlcmVmb3JlIDZ4IGlzCisjIHVzZWQgaW5zdGVhZC4uLgorCitzdWIgYWVzbmlfZ2VuZXJhdGUzCit7IG15ICRwPXNoaWZ0OworCisgICAgJmZ1bmN0aW9uX2JlZ2luX0IoIl9hZXNuaV8ke3B9cnlwdDMiKTsKKwkmJG1vdmVrZXkJKCRybmRrZXkwLCZRV1AoMCwka2V5KSk7CisJJnNocgkJKCRyb3VuZHMsMSk7CisJJiRtb3Zla2V5CSgkcm5ka2V5MSwmUVdQKDE2LCRrZXkpKTsKKwkmbGVhCQkoJGtleSwmRFdQKDMyLCRrZXkpKTsKKwkmeG9ycHMJCSgkaW5vdXQwLCRybmRrZXkwKTsKKwkmcHhvcgkJKCRpbm91dDEsJHJuZGtleTApOworCSZweG9yCQkoJGlub3V0Miwkcm5ka2V5MCk7CisJJiRtb3Zla2V5CSgkcm5ka2V5MCwmUVdQKDAsJGtleSkpOworCisgICAgJnNldF9sYWJlbCgiJHtwfTNfbG9vcCIpOworCWV2YWwiJmFlcyR7cH0JKCRpbm91dDAsJHJuZGtleTEpIjsKKwlldmFsIiZhZXMke3B9CSgkaW5vdXQxLCRybmRrZXkxKSI7CisJJmRlYwkJKCRyb3VuZHMpOworCWV2YWwiJmFlcyR7cH0JKCRpbm91dDIsJHJuZGtleTEpIjsKKwkmJG1vdmVrZXkJKCRybmRrZXkxLCZRV1AoMTYsJGtleSkpOworCWV2YWwiJmFlcyR7cH0JKCRpbm91dDAsJHJuZGtleTApIjsKKwlldmFsIiZhZXMke3B9CSgkaW5vdXQxLCRybmRrZXkwKSI7CisJJmxlYQkJKCRrZXksJkRXUCgzMiwka2V5KSk7CisJZXZhbCImYWVzJHtwfQkoJGlub3V0Miwkcm5ka2V5MCkiOworCSYkbW92ZWtleQkoJHJuZGtleTAsJlFXUCgwLCRrZXkpKTsKKwkmam56CQkoJmxhYmVsKCIke3B9M19sb29wIikpOworICAgIGV2YWwiJmFlcyR7cH0JKCRpbm91dDAsJHJuZGtleTEpIjsKKyAgICBldmFsIiZhZXMke3B9CSgkaW5vdXQxLCRybmRrZXkxKSI7CisgICAgZXZhbCImYWVzJHtwfQkoJGlub3V0Miwkcm5ka2V5MSkiOworICAgIGV2YWwiJmFlcyR7cH1sYXN0CSgkaW5vdXQwLCRybmRrZXkwKSI7CisgICAgZXZhbCImYWVzJHtwfWxhc3QJKCRpbm91dDEsJHJuZGtleTApIjsKKyAgICBldmFsIiZhZXMke3B9bGFzdAkoJGlub3V0Miwkcm5ka2V5MCkiOworICAgICZyZXQoKTsKKyAgICAmZnVuY3Rpb25fZW5kX0IoIl9hZXNuaV8ke3B9cnlwdDMiKTsKK30KKworIyA0eCBpbnRlcmxlYXZlIGlzIGltcGxlbWVudGVkIHRvIGltcHJvdmUgc21hbGwgYmxvY2sgcGVyZm9ybWFuY2UsCisjIG1vc3Qgbm90YWJseSBbYW5kIG5hdHVyYWxseV0gNCBibG9jayBieSB+MzAlLiBPbmUgY2FuIGFyZ3VlIHRoYXQgb25lCisjIHNob3VsZCBoYXZlIGltcGxlbWVudGVkIDV4IGFzIHdlbGwsIGJ1dCBpbXByb3ZlbWVudCAgd291bGQgYmUgPDIwJSwKKyMgc28gaXQncyBub3Qgd29ydGggaXQuLi4KK3N1YiBhZXNuaV9nZW5lcmF0ZTQKK3sgbXkgJHA9c2hpZnQ7CisKKyAgICAmZnVuY3Rpb25fYmVnaW5fQigiX2Flc25pXyR7cH1yeXB0NCIpOworCSYkbW92ZWtleQkoJHJuZGtleTAsJlFXUCgwLCRrZXkpKTsKKwkmJG1vdmVrZXkJKCRybmRrZXkxLCZRV1AoMTYsJGtleSkpOworCSZzaHIJCSgkcm91bmRzLDEpOworCSZsZWEJCSgka2V5LCZEV1AoMzIsJGtleSkpOworCSZ4b3JwcwkJKCRpbm91dDAsJHJuZGtleTApOworCSZweG9yCQkoJGlub3V0MSwkcm5ka2V5MCk7CisJJnB4b3IJCSgkaW5vdXQyLCRybmRrZXkwKTsKKwkmcHhvcgkJKCRpbm91dDMsJHJuZGtleTApOworCSYkbW92ZWtleQkoJHJuZGtleTAsJlFXUCgwLCRrZXkpKTsKKworICAgICZzZXRfbGFiZWwoIiR7cH00X2xvb3AiKTsKKwlldmFsIiZhZXMke3B9CSgkaW5vdXQwLCRybmRrZXkxKSI7CisJZXZhbCImYWVzJHtwfQkoJGlub3V0MSwkcm5ka2V5MSkiOworCSZkZWMJCSgkcm91bmRzKTsKKwlldmFsIiZhZXMke3B9CSgkaW5vdXQyLCRybmRrZXkxKSI7CisJZXZhbCImYWVzJHtwfQkoJGlub3V0Mywkcm5ka2V5MSkiOworCSYkbW92ZWtleQkoJHJuZGtleTEsJlFXUCgxNiwka2V5KSk7CisJZXZhbCImYWVzJHtwfQkoJGlub3V0MCwkcm5ka2V5MCkiOworCWV2YWwiJmFlcyR7cH0JKCRpbm91dDEsJHJuZGtleTApIjsKKwkmbGVhCQkoJGtleSwmRFdQKDMyLCRrZXkpKTsKKwlldmFsIiZhZXMke3B9CSgkaW5vdXQyLCRybmRrZXkwKSI7CisJZXZhbCImYWVzJHtwfQkoJGlub3V0Mywkcm5ka2V5MCkiOworCSYkbW92ZWtleQkoJHJuZGtleTAsJlFXUCgwLCRrZXkpKTsKKyAgICAmam56CQkoJmxhYmVsKCIke3B9NF9sb29wIikpOworCisgICAgZXZhbCImYWVzJHtwfQkoJGlub3V0MCwkcm5ka2V5MSkiOworICAgIGV2YWwiJmFlcyR7cH0JKCRpbm91dDEsJHJuZGtleTEpIjsKKyAgICBldmFsIiZhZXMke3B9CSgkaW5vdXQyLCRybmRrZXkxKSI7CisgICAgZXZhbCImYWVzJHtwfQkoJGlub3V0Mywkcm5ka2V5MSkiOworICAgIGV2YWwiJmFlcyR7cH1sYXN0CSgkaW5vdXQwLCRybmRrZXkwKSI7CisgICAgZXZhbCImYWVzJHtwfWxhc3QJKCRpbm91dDEsJHJuZGtleTApIjsKKyAgICBldmFsIiZhZXMke3B9bGFzdAkoJGlub3V0Miwkcm5ka2V5MCkiOworICAgIGV2YWwiJmFlcyR7cH1sYXN0CSgkaW5vdXQzLCRybmRrZXkwKSI7CisgICAgJnJldCgpOworICAgICZmdW5jdGlvbl9lbmRfQigiX2Flc25pXyR7cH1yeXB0NCIpOworfQorCitzdWIgYWVzbmlfZ2VuZXJhdGU2Cit7IG15ICRwPXNoaWZ0OworCisgICAgJmZ1bmN0aW9uX2JlZ2luX0IoIl9hZXNuaV8ke3B9cnlwdDYiKTsKKyAgICAmc3RhdGljX2xhYmVsKCJfYWVzbmlfJHtwfXJ5cHQ2X2VudGVyIik7CisJJiRtb3Zla2V5CSgkcm5ka2V5MCwmUVdQKDAsJGtleSkpOworCSZzaHIJCSgkcm91bmRzLDEpOworCSYkbW92ZWtleQkoJHJuZGtleTEsJlFXUCgxNiwka2V5KSk7CisJJmxlYQkJKCRrZXksJkRXUCgzMiwka2V5KSk7CisJJnhvcnBzCQkoJGlub3V0MCwkcm5ka2V5MCk7CisJJnB4b3IJCSgkaW5vdXQxLCRybmRrZXkwKTsJIyBweG9yIGRvZXMgYmV0dGVyIGhlcmUKKwlldmFsIiZhZXMke3B9CSgkaW5vdXQwLCRybmRrZXkxKSI7CisJJnB4b3IJCSgkaW5vdXQyLCRybmRrZXkwKTsKKwlldmFsIiZhZXMke3B9CSgkaW5vdXQxLCRybmRrZXkxKSI7CisJJnB4b3IJCSgkaW5vdXQzLCRybmRrZXkwKTsKKwkmZGVjCQkoJHJvdW5kcyk7CisJZXZhbCImYWVzJHtwfQkoJGlub3V0Miwkcm5ka2V5MSkiOworCSZweG9yCQkoJGlub3V0NCwkcm5ka2V5MCk7CisJZXZhbCImYWVzJHtwfQkoJGlub3V0Mywkcm5ka2V5MSkiOworCSZweG9yCQkoJGlub3V0NSwkcm5ka2V5MCk7CisJZXZhbCImYWVzJHtwfQkoJGlub3V0NCwkcm5ka2V5MSkiOworCSYkbW92ZWtleQkoJHJuZGtleTAsJlFXUCgwLCRrZXkpKTsKKwlldmFsIiZhZXMke3B9CSgkaW5vdXQ1LCRybmRrZXkxKSI7CisJJmptcAkJKCZsYWJlbCgiX2Flc25pXyR7cH1yeXB0Nl9lbnRlciIpKTsKKworICAgICZzZXRfbGFiZWwoIiR7cH02X2xvb3AiLDE2KTsKKwlldmFsIiZhZXMke3B9CSgkaW5vdXQwLCRybmRrZXkxKSI7CisJZXZhbCImYWVzJHtwfQkoJGlub3V0MSwkcm5ka2V5MSkiOworCSZkZWMJCSgkcm91bmRzKTsKKwlldmFsIiZhZXMke3B9CSgkaW5vdXQyLCRybmRrZXkxKSI7CisJZXZhbCImYWVzJHtwfQkoJGlub3V0Mywkcm5ka2V5MSkiOworCWV2YWwiJmFlcyR7cH0JKCRpbm91dDQsJHJuZGtleTEpIjsKKwlldmFsIiZhZXMke3B9CSgkaW5vdXQ1LCRybmRrZXkxKSI7CisgICAgJnNldF9sYWJlbCgiX2Flc25pXyR7cH1yeXB0Nl9lbnRlciIsMTYpOworCSYkbW92ZWtleQkoJHJuZGtleTEsJlFXUCgxNiwka2V5KSk7CisJZXZhbCImYWVzJHtwfQkoJGlub3V0MCwkcm5ka2V5MCkiOworCWV2YWwiJmFlcyR7cH0JKCRpbm91dDEsJHJuZGtleTApIjsKKwkmbGVhCQkoJGtleSwmRFdQKDMyLCRrZXkpKTsKKwlldmFsIiZhZXMke3B9CSgkaW5vdXQyLCRybmRrZXkwKSI7CisJZXZhbCImYWVzJHtwfQkoJGlub3V0Mywkcm5ka2V5MCkiOworCWV2YWwiJmFlcyR7cH0JKCRpbm91dDQsJHJuZGtleTApIjsKKwlldmFsIiZhZXMke3B9CSgkaW5vdXQ1LCRybmRrZXkwKSI7CisJJiRtb3Zla2V5CSgkcm5ka2V5MCwmUVdQKDAsJGtleSkpOworICAgICZqbnoJCSgmbGFiZWwoIiR7cH02X2xvb3AiKSk7CisKKyAgICBldmFsIiZhZXMke3B9CSgkaW5vdXQwLCRybmRrZXkxKSI7CisgICAgZXZhbCImYWVzJHtwfQkoJGlub3V0MSwkcm5ka2V5MSkiOworICAgIGV2YWwiJmFlcyR7cH0JKCRpbm91dDIsJHJuZGtleTEpIjsKKyAgICBldmFsIiZhZXMke3B9CSgkaW5vdXQzLCRybmRrZXkxKSI7CisgICAgZXZhbCImYWVzJHtwfQkoJGlub3V0NCwkcm5ka2V5MSkiOworICAgIGV2YWwiJmFlcyR7cH0JKCRpbm91dDUsJHJuZGtleTEpIjsKKyAgICBldmFsIiZhZXMke3B9bGFzdAkoJGlub3V0MCwkcm5ka2V5MCkiOworICAgIGV2YWwiJmFlcyR7cH1sYXN0CSgkaW5vdXQxLCRybmRrZXkwKSI7CisgICAgZXZhbCImYWVzJHtwfWxhc3QJKCRpbm91dDIsJHJuZGtleTApIjsKKyAgICBldmFsIiZhZXMke3B9bGFzdAkoJGlub3V0Mywkcm5ka2V5MCkiOworICAgIGV2YWwiJmFlcyR7cH1sYXN0CSgkaW5vdXQ0LCRybmRrZXkwKSI7CisgICAgZXZhbCImYWVzJHtwfWxhc3QJKCRpbm91dDUsJHJuZGtleTApIjsKKyAgICAmcmV0KCk7CisgICAgJmZ1bmN0aW9uX2VuZF9CKCJfYWVzbmlfJHtwfXJ5cHQ2Iik7Cit9CismYWVzbmlfZ2VuZXJhdGUzKCJlbmMiKSBpZiAoJFBSRUZJWCBlcSAiYWVzbmkiKTsKKyZhZXNuaV9nZW5lcmF0ZTMoImRlYyIpOworJmFlc25pX2dlbmVyYXRlNCgiZW5jIikgaWYgKCRQUkVGSVggZXEgImFlc25pIik7CismYWVzbmlfZ2VuZXJhdGU0KCJkZWMiKTsKKyZhZXNuaV9nZW5lcmF0ZTYoImVuYyIpIGlmICgkUFJFRklYIGVxICJhZXNuaSIpOworJmFlc25pX2dlbmVyYXRlNigiZGVjIik7CisMCitpZiAoJFBSRUZJWCBlcSAiYWVzbmkiKSB7CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHZvaWQgYWVzbmlfZWNiX2VuY3J5cHQgKGNvbnN0IHZvaWQgKmluLCB2b2lkICpvdXQsCisjICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgsIGNvbnN0IEFFU19LRVkgKmtleSwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuYyk7CismZnVuY3Rpb25fYmVnaW4oImFlc25pX2VjYl9lbmNyeXB0Iik7CisJJm1vdgkoJGlucCwmd3BhcmFtKDApKTsKKwkmbW92CSgkb3V0LCZ3cGFyYW0oMSkpOworCSZtb3YJKCRsZW4sJndwYXJhbSgyKSk7CisJJm1vdgkoJGtleSwmd3BhcmFtKDMpKTsKKwkmbW92CSgkcm91bmRzXywmd3BhcmFtKDQpKTsKKwkmYW5kCSgkbGVuLC0xNik7CisJJmp6CSgmbGFiZWwoImVjYl9yZXQiKSk7CisJJm1vdgkoJHJvdW5kcywmRFdQKDI0MCwka2V5KSk7CisJJnRlc3QJKCRyb3VuZHNfLCRyb3VuZHNfKTsKKwkmanoJKCZsYWJlbCgiZWNiX2RlY3J5cHQiKSk7CisKKwkmbW92CSgka2V5Xywka2V5KTsJCSMgYmFja3VwICRrZXkKKwkmbW92CSgkcm91bmRzXywkcm91bmRzKTsJIyBiYWNrdXAgJHJvdW5kcworCSZjbXAJKCRsZW4sMHg2MCk7CisJJmpiCSgmbGFiZWwoImVjYl9lbmNfdGFpbCIpKTsKKworCSZtb3ZkcXUJKCRpbm91dDAsJlFXUCgwLCRpbnApKTsKKwkmbW92ZHF1CSgkaW5vdXQxLCZRV1AoMHgxMCwkaW5wKSk7CisJJm1vdmRxdQkoJGlub3V0MiwmUVdQKDB4MjAsJGlucCkpOworCSZtb3ZkcXUJKCRpbm91dDMsJlFXUCgweDMwLCRpbnApKTsKKwkmbW92ZHF1CSgkaW5vdXQ0LCZRV1AoMHg0MCwkaW5wKSk7CisJJm1vdmRxdQkoJGlub3V0NSwmUVdQKDB4NTAsJGlucCkpOworCSZsZWEJKCRpbnAsJkRXUCgweDYwLCRpbnApKTsKKwkmc3ViCSgkbGVuLDB4NjApOworCSZqbXAJKCZsYWJlbCgiZWNiX2VuY19sb29wNl9lbnRlciIpKTsKKworJnNldF9sYWJlbCgiZWNiX2VuY19sb29wNiIsMTYpOworCSZtb3Z1cHMJKCZRV1AoMCwkb3V0KSwkaW5vdXQwKTsKKwkmbW92ZHF1CSgkaW5vdXQwLCZRV1AoMCwkaW5wKSk7CisJJm1vdnVwcwkoJlFXUCgweDEwLCRvdXQpLCRpbm91dDEpOworCSZtb3ZkcXUJKCRpbm91dDEsJlFXUCgweDEwLCRpbnApKTsKKwkmbW92dXBzCSgmUVdQKDB4MjAsJG91dCksJGlub3V0Mik7CisJJm1vdmRxdQkoJGlub3V0MiwmUVdQKDB4MjAsJGlucCkpOworCSZtb3Z1cHMJKCZRV1AoMHgzMCwkb3V0KSwkaW5vdXQzKTsKKwkmbW92ZHF1CSgkaW5vdXQzLCZRV1AoMHgzMCwkaW5wKSk7CisJJm1vdnVwcwkoJlFXUCgweDQwLCRvdXQpLCRpbm91dDQpOworCSZtb3ZkcXUJKCRpbm91dDQsJlFXUCgweDQwLCRpbnApKTsKKwkmbW92dXBzCSgmUVdQKDB4NTAsJG91dCksJGlub3V0NSk7CisJJmxlYQkoJG91dCwmRFdQKDB4NjAsJG91dCkpOworCSZtb3ZkcXUJKCRpbm91dDUsJlFXUCgweDUwLCRpbnApKTsKKwkmbGVhCSgkaW5wLCZEV1AoMHg2MCwkaW5wKSk7Cismc2V0X2xhYmVsKCJlY2JfZW5jX2xvb3A2X2VudGVyIik7CisKKwkmY2FsbAkoIl9hZXNuaV9lbmNyeXB0NiIpOworCisJJm1vdgkoJGtleSwka2V5Xyk7CQkjIHJlc3RvcmUgJGtleQorCSZtb3YJKCRyb3VuZHMsJHJvdW5kc18pOwkjIHJlc3RvcmUgJHJvdW5kcworCSZzdWIJKCRsZW4sMHg2MCk7CisJJmpuYwkoJmxhYmVsKCJlY2JfZW5jX2xvb3A2IikpOworCisJJm1vdnVwcwkoJlFXUCgwLCRvdXQpLCRpbm91dDApOworCSZtb3Z1cHMJKCZRV1AoMHgxMCwkb3V0KSwkaW5vdXQxKTsKKwkmbW92dXBzCSgmUVdQKDB4MjAsJG91dCksJGlub3V0Mik7CisJJm1vdnVwcwkoJlFXUCgweDMwLCRvdXQpLCRpbm91dDMpOworCSZtb3Z1cHMJKCZRV1AoMHg0MCwkb3V0KSwkaW5vdXQ0KTsKKwkmbW92dXBzCSgmUVdQKDB4NTAsJG91dCksJGlub3V0NSk7CisJJmxlYQkoJG91dCwmRFdQKDB4NjAsJG91dCkpOworCSZhZGQJKCRsZW4sMHg2MCk7CisJJmp6CSgmbGFiZWwoImVjYl9yZXQiKSk7CisKKyZzZXRfbGFiZWwoImVjYl9lbmNfdGFpbCIpOworCSZtb3Z1cHMJKCRpbm91dDAsJlFXUCgwLCRpbnApKTsKKwkmY21wCSgkbGVuLDB4MjApOworCSZqYgkoJmxhYmVsKCJlY2JfZW5jX29uZSIpKTsKKwkmbW92dXBzCSgkaW5vdXQxLCZRV1AoMHgxMCwkaW5wKSk7CisJJmplCSgmbGFiZWwoImVjYl9lbmNfdHdvIikpOworCSZtb3Z1cHMJKCRpbm91dDIsJlFXUCgweDIwLCRpbnApKTsKKwkmY21wCSgkbGVuLDB4NDApOworCSZqYgkoJmxhYmVsKCJlY2JfZW5jX3RocmVlIikpOworCSZtb3Z1cHMJKCRpbm91dDMsJlFXUCgweDMwLCRpbnApKTsKKwkmamUJKCZsYWJlbCgiZWNiX2VuY19mb3VyIikpOworCSZtb3Z1cHMJKCRpbm91dDQsJlFXUCgweDQwLCRpbnApKTsKKwkmeG9ycHMJKCRpbm91dDUsJGlub3V0NSk7CisJJmNhbGwJKCJfYWVzbmlfZW5jcnlwdDYiKTsKKwkmbW92dXBzCSgmUVdQKDAsJG91dCksJGlub3V0MCk7CisJJm1vdnVwcwkoJlFXUCgweDEwLCRvdXQpLCRpbm91dDEpOworCSZtb3Z1cHMJKCZRV1AoMHgyMCwkb3V0KSwkaW5vdXQyKTsKKwkmbW92dXBzCSgmUVdQKDB4MzAsJG91dCksJGlub3V0Myk7CisJJm1vdnVwcwkoJlFXUCgweDQwLCRvdXQpLCRpbm91dDQpOworCWptcAkoJmxhYmVsKCJlY2JfcmV0IikpOworCismc2V0X2xhYmVsKCJlY2JfZW5jX29uZSIsMTYpOworCWlmICgkaW5saW5lKQorCXsgICAmYWVzbmlfaW5saW5lX2dlbmVyYXRlMSgiZW5jIik7CX0KKwllbHNlCisJeyAgICZjYWxsCSgiX2Flc25pX2VuY3J5cHQxIik7CX0KKwkmbW92dXBzCSgmUVdQKDAsJG91dCksJGlub3V0MCk7CisJJmptcAkoJmxhYmVsKCJlY2JfcmV0IikpOworCismc2V0X2xhYmVsKCJlY2JfZW5jX3R3byIsMTYpOworCSZ4b3JwcwkoJGlub3V0MiwkaW5vdXQyKTsKKwkmY2FsbAkoIl9hZXNuaV9lbmNyeXB0MyIpOworCSZtb3Z1cHMJKCZRV1AoMCwkb3V0KSwkaW5vdXQwKTsKKwkmbW92dXBzCSgmUVdQKDB4MTAsJG91dCksJGlub3V0MSk7CisJJmptcAkoJmxhYmVsKCJlY2JfcmV0IikpOworCismc2V0X2xhYmVsKCJlY2JfZW5jX3RocmVlIiwxNik7CisJJmNhbGwJKCJfYWVzbmlfZW5jcnlwdDMiKTsKKwkmbW92dXBzCSgmUVdQKDAsJG91dCksJGlub3V0MCk7CisJJm1vdnVwcwkoJlFXUCgweDEwLCRvdXQpLCRpbm91dDEpOworCSZtb3Z1cHMJKCZRV1AoMHgyMCwkb3V0KSwkaW5vdXQyKTsKKwkmam1wCSgmbGFiZWwoImVjYl9yZXQiKSk7CisKKyZzZXRfbGFiZWwoImVjYl9lbmNfZm91ciIsMTYpOworCSZjYWxsCSgiX2Flc25pX2VuY3J5cHQ0Iik7CisJJm1vdnVwcwkoJlFXUCgwLCRvdXQpLCRpbm91dDApOworCSZtb3Z1cHMJKCZRV1AoMHgxMCwkb3V0KSwkaW5vdXQxKTsKKwkmbW92dXBzCSgmUVdQKDB4MjAsJG91dCksJGlub3V0Mik7CisJJm1vdnVwcwkoJlFXUCgweDMwLCRvdXQpLCRpbm91dDMpOworCSZqbXAJKCZsYWJlbCgiZWNiX3JldCIpKTsKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyZzZXRfbGFiZWwoImVjYl9kZWNyeXB0IiwxNik7CisJJm1vdgkoJGtleV8sJGtleSk7CQkjIGJhY2t1cCAka2V5CisJJm1vdgkoJHJvdW5kc18sJHJvdW5kcyk7CSMgYmFja3VwICRyb3VuZHMKKwkmY21wCSgkbGVuLDB4NjApOworCSZqYgkoJmxhYmVsKCJlY2JfZGVjX3RhaWwiKSk7CisKKwkmbW92ZHF1CSgkaW5vdXQwLCZRV1AoMCwkaW5wKSk7CisJJm1vdmRxdQkoJGlub3V0MSwmUVdQKDB4MTAsJGlucCkpOworCSZtb3ZkcXUJKCRpbm91dDIsJlFXUCgweDIwLCRpbnApKTsKKwkmbW92ZHF1CSgkaW5vdXQzLCZRV1AoMHgzMCwkaW5wKSk7CisJJm1vdmRxdQkoJGlub3V0NCwmUVdQKDB4NDAsJGlucCkpOworCSZtb3ZkcXUJKCRpbm91dDUsJlFXUCgweDUwLCRpbnApKTsKKwkmbGVhCSgkaW5wLCZEV1AoMHg2MCwkaW5wKSk7CisJJnN1YgkoJGxlbiwweDYwKTsKKwkmam1wCSgmbGFiZWwoImVjYl9kZWNfbG9vcDZfZW50ZXIiKSk7CisKKyZzZXRfbGFiZWwoImVjYl9kZWNfbG9vcDYiLDE2KTsKKwkmbW92dXBzCSgmUVdQKDAsJG91dCksJGlub3V0MCk7CisJJm1vdmRxdQkoJGlub3V0MCwmUVdQKDAsJGlucCkpOworCSZtb3Z1cHMJKCZRV1AoMHgxMCwkb3V0KSwkaW5vdXQxKTsKKwkmbW92ZHF1CSgkaW5vdXQxLCZRV1AoMHgxMCwkaW5wKSk7CisJJm1vdnVwcwkoJlFXUCgweDIwLCRvdXQpLCRpbm91dDIpOworCSZtb3ZkcXUJKCRpbm91dDIsJlFXUCgweDIwLCRpbnApKTsKKwkmbW92dXBzCSgmUVdQKDB4MzAsJG91dCksJGlub3V0Myk7CisJJm1vdmRxdQkoJGlub3V0MywmUVdQKDB4MzAsJGlucCkpOworCSZtb3Z1cHMJKCZRV1AoMHg0MCwkb3V0KSwkaW5vdXQ0KTsKKwkmbW92ZHF1CSgkaW5vdXQ0LCZRV1AoMHg0MCwkaW5wKSk7CisJJm1vdnVwcwkoJlFXUCgweDUwLCRvdXQpLCRpbm91dDUpOworCSZsZWEJKCRvdXQsJkRXUCgweDYwLCRvdXQpKTsKKwkmbW92ZHF1CSgkaW5vdXQ1LCZRV1AoMHg1MCwkaW5wKSk7CisJJmxlYQkoJGlucCwmRFdQKDB4NjAsJGlucCkpOworJnNldF9sYWJlbCgiZWNiX2RlY19sb29wNl9lbnRlciIpOworCisJJmNhbGwJKCJfYWVzbmlfZGVjcnlwdDYiKTsKKworCSZtb3YJKCRrZXksJGtleV8pOwkJIyByZXN0b3JlICRrZXkKKwkmbW92CSgkcm91bmRzLCRyb3VuZHNfKTsJIyByZXN0b3JlICRyb3VuZHMKKwkmc3ViCSgkbGVuLDB4NjApOworCSZqbmMJKCZsYWJlbCgiZWNiX2RlY19sb29wNiIpKTsKKworCSZtb3Z1cHMJKCZRV1AoMCwkb3V0KSwkaW5vdXQwKTsKKwkmbW92dXBzCSgmUVdQKDB4MTAsJG91dCksJGlub3V0MSk7CisJJm1vdnVwcwkoJlFXUCgweDIwLCRvdXQpLCRpbm91dDIpOworCSZtb3Z1cHMJKCZRV1AoMHgzMCwkb3V0KSwkaW5vdXQzKTsKKwkmbW92dXBzCSgmUVdQKDB4NDAsJG91dCksJGlub3V0NCk7CisJJm1vdnVwcwkoJlFXUCgweDUwLCRvdXQpLCRpbm91dDUpOworCSZsZWEJKCRvdXQsJkRXUCgweDYwLCRvdXQpKTsKKwkmYWRkCSgkbGVuLDB4NjApOworCSZqegkoJmxhYmVsKCJlY2JfcmV0IikpOworCismc2V0X2xhYmVsKCJlY2JfZGVjX3RhaWwiKTsKKwkmbW92dXBzCSgkaW5vdXQwLCZRV1AoMCwkaW5wKSk7CisJJmNtcAkoJGxlbiwweDIwKTsKKwkmamIJKCZsYWJlbCgiZWNiX2RlY19vbmUiKSk7CisJJm1vdnVwcwkoJGlub3V0MSwmUVdQKDB4MTAsJGlucCkpOworCSZqZQkoJmxhYmVsKCJlY2JfZGVjX3R3byIpKTsKKwkmbW92dXBzCSgkaW5vdXQyLCZRV1AoMHgyMCwkaW5wKSk7CisJJmNtcAkoJGxlbiwweDQwKTsKKwkmamIJKCZsYWJlbCgiZWNiX2RlY190aHJlZSIpKTsKKwkmbW92dXBzCSgkaW5vdXQzLCZRV1AoMHgzMCwkaW5wKSk7CisJJmplCSgmbGFiZWwoImVjYl9kZWNfZm91ciIpKTsKKwkmbW92dXBzCSgkaW5vdXQ0LCZRV1AoMHg0MCwkaW5wKSk7CisJJnhvcnBzCSgkaW5vdXQ1LCRpbm91dDUpOworCSZjYWxsCSgiX2Flc25pX2RlY3J5cHQ2Iik7CisJJm1vdnVwcwkoJlFXUCgwLCRvdXQpLCRpbm91dDApOworCSZtb3Z1cHMJKCZRV1AoMHgxMCwkb3V0KSwkaW5vdXQxKTsKKwkmbW92dXBzCSgmUVdQKDB4MjAsJG91dCksJGlub3V0Mik7CisJJm1vdnVwcwkoJlFXUCgweDMwLCRvdXQpLCRpbm91dDMpOworCSZtb3Z1cHMJKCZRV1AoMHg0MCwkb3V0KSwkaW5vdXQ0KTsKKwkmam1wCSgmbGFiZWwoImVjYl9yZXQiKSk7CisKKyZzZXRfbGFiZWwoImVjYl9kZWNfb25lIiwxNik7CisJaWYgKCRpbmxpbmUpCisJeyAgICZhZXNuaV9pbmxpbmVfZ2VuZXJhdGUxKCJkZWMiKTsJfQorCWVsc2UKKwl7ICAgJmNhbGwJKCJfYWVzbmlfZGVjcnlwdDEiKTsJfQorCSZtb3Z1cHMJKCZRV1AoMCwkb3V0KSwkaW5vdXQwKTsKKwkmam1wCSgmbGFiZWwoImVjYl9yZXQiKSk7CisKKyZzZXRfbGFiZWwoImVjYl9kZWNfdHdvIiwxNik7CisJJnhvcnBzCSgkaW5vdXQyLCRpbm91dDIpOworCSZjYWxsCSgiX2Flc25pX2RlY3J5cHQzIik7CisJJm1vdnVwcwkoJlFXUCgwLCRvdXQpLCRpbm91dDApOworCSZtb3Z1cHMJKCZRV1AoMHgxMCwkb3V0KSwkaW5vdXQxKTsKKwkmam1wCSgmbGFiZWwoImVjYl9yZXQiKSk7CisKKyZzZXRfbGFiZWwoImVjYl9kZWNfdGhyZWUiLDE2KTsKKwkmY2FsbAkoIl9hZXNuaV9kZWNyeXB0MyIpOworCSZtb3Z1cHMJKCZRV1AoMCwkb3V0KSwkaW5vdXQwKTsKKwkmbW92dXBzCSgmUVdQKDB4MTAsJG91dCksJGlub3V0MSk7CisJJm1vdnVwcwkoJlFXUCgweDIwLCRvdXQpLCRpbm91dDIpOworCSZqbXAJKCZsYWJlbCgiZWNiX3JldCIpKTsKKworJnNldF9sYWJlbCgiZWNiX2RlY19mb3VyIiwxNik7CisJJmNhbGwJKCJfYWVzbmlfZGVjcnlwdDQiKTsKKwkmbW92dXBzCSgmUVdQKDAsJG91dCksJGlub3V0MCk7CisJJm1vdnVwcwkoJlFXUCgweDEwLCRvdXQpLCRpbm91dDEpOworCSZtb3Z1cHMJKCZRV1AoMHgyMCwkb3V0KSwkaW5vdXQyKTsKKwkmbW92dXBzCSgmUVdQKDB4MzAsJG91dCksJGlub3V0Myk7CisKKyZzZXRfbGFiZWwoImVjYl9yZXQiKTsKKyZmdW5jdGlvbl9lbmQoImFlc25pX2VjYl9lbmNyeXB0Iik7CisMCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHZvaWQgYWVzbmlfY2NtNjRfW2VufGRlXWNyeXB0X2Jsb2NrcyAoY29uc3Qgdm9pZCAqaW4sIHZvaWQgKm91dCwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJsb2NrcywgY29uc3QgQUVTX0tFWSAqa2V5LAorIyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICppdmVjLGNoYXIgKmNtYWMpOworIworIyBIYW5kbGVzIG9ubHkgY29tcGxldGUgYmxvY2tzLCBvcGVyYXRlcyBvbiA2NC1iaXQgY291bnRlciBhbmQKKyMgZG9lcyBub3QgdXBkYXRlICppdmVjISBOb3IgZG9lcyBpdCBmaW5hbGl6ZSBDTUFDIHZhbHVlCisjIChzZWUgZW5naW5lL2VuZ19hZXNuaS5jIGZvciBkZXRhaWxzKQorIworeyBteSAkY21hYz0kaW5vdXQxOworJmZ1bmN0aW9uX2JlZ2luKCJhZXNuaV9jY202NF9lbmNyeXB0X2Jsb2NrcyIpOworCSZtb3YJKCRpbnAsJndwYXJhbSgwKSk7CisJJm1vdgkoJG91dCwmd3BhcmFtKDEpKTsKKwkmbW92CSgkbGVuLCZ3cGFyYW0oMikpOworCSZtb3YJKCRrZXksJndwYXJhbSgzKSk7CisJJm1vdgkoJHJvdW5kc18sJndwYXJhbSg0KSk7CisJJm1vdgkoJHJvdW5kcywmd3BhcmFtKDUpKTsKKwkmbW92CSgka2V5XywiZXNwIik7CisJJnN1YgkoImVzcCIsNjApOworCSZhbmQJKCJlc3AiLC0xNik7CQkJIyBhbGlnbiBzdGFjaworCSZtb3YJKCZEV1AoNDgsImVzcCIpLCRrZXlfKTsKKworCSZtb3ZkcXUJKCRpdmVjLCZRV1AoMCwkcm91bmRzXykpOwkjIGxvYWQgaXZlYworCSZtb3ZkcXUJKCRjbWFjLCZRV1AoMCwkcm91bmRzKSk7CSMgbG9hZCBjbWFjCisJJm1vdgkoJHJvdW5kcywmRFdQKDI0MCwka2V5KSk7CisKKwkjIGNvbXBvc2UgYnl0ZS1zd2FwIGNvbnRyb2wgbWFzayBmb3IgcHNodWZiIG9uIHN0YWNrCisJJm1vdgkoJkRXUCgwLCJlc3AiKSwweDBjMGQwZTBmKTsKKwkmbW92CSgmRFdQKDQsImVzcCIpLDB4MDgwOTBhMGIpOworCSZtb3YJKCZEV1AoOCwiZXNwIiksMHgwNDA1MDYwNyk7CisJJm1vdgkoJkRXUCgxMiwiZXNwIiksMHgwMDAxMDIwMyk7CisKKwkjIGNvbXBvc2UgY291bnRlciBpbmNyZW1lbnQgdmVjdG9yIG9uIHN0YWNrCisJJm1vdgkoJHJvdW5kc18sMSk7CisJJnhvcgkoJGtleV8sJGtleV8pOworCSZtb3YJKCZEV1AoMTYsImVzcCIpLCRyb3VuZHNfKTsKKwkmbW92CSgmRFdQKDIwLCJlc3AiKSwka2V5Xyk7CisJJm1vdgkoJkRXUCgyNCwiZXNwIiksJGtleV8pOworCSZtb3YJKCZEV1AoMjgsImVzcCIpLCRrZXlfKTsKKworCSZzaHIJKCRyb3VuZHMsMSk7CisJJmxlYQkoJGtleV8sJkRXUCgwLCRrZXkpKTsKKwkmbW92ZHFhCSgkaW5vdXQzLCZRV1AoMCwiZXNwIikpOworCSZtb3ZkcWEJKCRpbm91dDAsJGl2ZWMpOworCSZtb3YJKCRyb3VuZHNfLCRyb3VuZHMpOworCSZwc2h1ZmIJKCRpdmVjLCRpbm91dDMpOworCismc2V0X2xhYmVsKCJjY202NF9lbmNfb3V0ZXIiKTsKKwkmJG1vdmVrZXkJKCRybmRrZXkwLCZRV1AoMCwka2V5XykpOworCSZtb3YJCSgkcm91bmRzLCRyb3VuZHNfKTsKKwkmbW92dXBzCQkoJGluMCwmUVdQKDAsJGlucCkpOworCisJJnhvcnBzCQkoJGlub3V0MCwkcm5ka2V5MCk7CisJJiRtb3Zla2V5CSgkcm5ka2V5MSwmUVdQKDE2LCRrZXlfKSk7CisJJnhvcnBzCQkoJHJuZGtleTAsJGluMCk7CisJJmxlYQkJKCRrZXksJkRXUCgzMiwka2V5XykpOworCSZ4b3JwcwkJKCRjbWFjLCRybmRrZXkwKTsJCSMgY21hY149aW5wCisJJiRtb3Zla2V5CSgkcm5ka2V5MCwmUVdQKDAsJGtleSkpOworCismc2V0X2xhYmVsKCJjY202NF9lbmMyX2xvb3AiKTsKKwkmYWVzZW5jCQkoJGlub3V0MCwkcm5ka2V5MSk7CisJJmRlYwkJKCRyb3VuZHMpOworCSZhZXNlbmMJCSgkY21hYywkcm5ka2V5MSk7CisJJiRtb3Zla2V5CSgkcm5ka2V5MSwmUVdQKDE2LCRrZXkpKTsKKwkmYWVzZW5jCQkoJGlub3V0MCwkcm5ka2V5MCk7CisJJmxlYQkJKCRrZXksJkRXUCgzMiwka2V5KSk7CisJJmFlc2VuYwkJKCRjbWFjLCRybmRrZXkwKTsKKwkmJG1vdmVrZXkJKCRybmRrZXkwLCZRV1AoMCwka2V5KSk7CisJJmpuegkJKCZsYWJlbCgiY2NtNjRfZW5jMl9sb29wIikpOworCSZhZXNlbmMJCSgkaW5vdXQwLCRybmRrZXkxKTsKKwkmYWVzZW5jCQkoJGNtYWMsJHJuZGtleTEpOworCSZwYWRkcQkJKCRpdmVjLCZRV1AoMTYsImVzcCIpKTsKKwkmYWVzZW5jbGFzdAkoJGlub3V0MCwkcm5ka2V5MCk7CisJJmFlc2VuY2xhc3QJKCRjbWFjLCRybmRrZXkwKTsKKworCSZkZWMJKCRsZW4pOworCSZsZWEJKCRpbnAsJkRXUCgxNiwkaW5wKSk7CisJJnhvcnBzCSgkaW4wLCRpbm91dDApOwkJCSMgaW5wXj1FKGl2ZWMpCisJJm1vdmRxYQkoJGlub3V0MCwkaXZlYyk7CisJJm1vdnVwcwkoJlFXUCgwLCRvdXQpLCRpbjApOwkJIyBzYXZlIG91dHB1dAorCSZsZWEJKCRvdXQsJkRXUCgxNiwkb3V0KSk7CisJJnBzaHVmYgkoJGlub3V0MCwkaW5vdXQzKTsKKwkmam56CSgmbGFiZWwoImNjbTY0X2VuY19vdXRlciIpKTsKKworCSZtb3YJKCJlc3AiLCZEV1AoNDgsImVzcCIpKTsKKwkmbW92CSgkb3V0LCZ3cGFyYW0oNSkpOworCSZtb3Z1cHMJKCZRV1AoMCwkb3V0KSwkY21hYyk7CismZnVuY3Rpb25fZW5kKCJhZXNuaV9jY202NF9lbmNyeXB0X2Jsb2NrcyIpOworCismZnVuY3Rpb25fYmVnaW4oImFlc25pX2NjbTY0X2RlY3J5cHRfYmxvY2tzIik7CisJJm1vdgkoJGlucCwmd3BhcmFtKDApKTsKKwkmbW92CSgkb3V0LCZ3cGFyYW0oMSkpOworCSZtb3YJKCRsZW4sJndwYXJhbSgyKSk7CisJJm1vdgkoJGtleSwmd3BhcmFtKDMpKTsKKwkmbW92CSgkcm91bmRzXywmd3BhcmFtKDQpKTsKKwkmbW92CSgkcm91bmRzLCZ3cGFyYW0oNSkpOworCSZtb3YJKCRrZXlfLCJlc3AiKTsKKwkmc3ViCSgiZXNwIiw2MCk7CisJJmFuZAkoImVzcCIsLTE2KTsJCQkjIGFsaWduIHN0YWNrCisJJm1vdgkoJkRXUCg0OCwiZXNwIiksJGtleV8pOworCisJJm1vdmRxdQkoJGl2ZWMsJlFXUCgwLCRyb3VuZHNfKSk7CSMgbG9hZCBpdmVjCisJJm1vdmRxdQkoJGNtYWMsJlFXUCgwLCRyb3VuZHMpKTsJIyBsb2FkIGNtYWMKKwkmbW92CSgkcm91bmRzLCZEV1AoMjQwLCRrZXkpKTsKKworCSMgY29tcG9zZSBieXRlLXN3YXAgY29udHJvbCBtYXNrIGZvciBwc2h1ZmIgb24gc3RhY2sKKwkmbW92CSgmRFdQKDAsImVzcCIpLDB4MGMwZDBlMGYpOworCSZtb3YJKCZEV1AoNCwiZXNwIiksMHgwODA5MGEwYik7CisJJm1vdgkoJkRXUCg4LCJlc3AiKSwweDA0MDUwNjA3KTsKKwkmbW92CSgmRFdQKDEyLCJlc3AiKSwweDAwMDEwMjAzKTsKKworCSMgY29tcG9zZSBjb3VudGVyIGluY3JlbWVudCB2ZWN0b3Igb24gc3RhY2sKKwkmbW92CSgkcm91bmRzXywxKTsKKwkmeG9yCSgka2V5Xywka2V5Xyk7CisJJm1vdgkoJkRXUCgxNiwiZXNwIiksJHJvdW5kc18pOworCSZtb3YJKCZEV1AoMjAsImVzcCIpLCRrZXlfKTsKKwkmbW92CSgmRFdQKDI0LCJlc3AiKSwka2V5Xyk7CisJJm1vdgkoJkRXUCgyOCwiZXNwIiksJGtleV8pOworCisJJm1vdmRxYQkoJGlub3V0MywmUVdQKDAsImVzcCIpKTsJIyBic3dhcCBtYXNrCisJJm1vdmRxYQkoJGlub3V0MCwkaXZlYyk7CisKKwkmbW92CSgka2V5Xywka2V5KTsKKwkmbW92CSgkcm91bmRzXywkcm91bmRzKTsKKworCSZwc2h1ZmIJKCRpdmVjLCRpbm91dDMpOworCWlmICgkaW5saW5lKQorCXsgICAmYWVzbmlfaW5saW5lX2dlbmVyYXRlMSgiZW5jIik7CX0KKwllbHNlCisJeyAgICZjYWxsCSgiX2Flc25pX2VuY3J5cHQxIik7CX0KKwkmbW92dXBzCSgkaW4wLCZRV1AoMCwkaW5wKSk7CQkjIGxvYWQgaW5wCisJJnBhZGRxCSgkaXZlYywmUVdQKDE2LCJlc3AiKSk7CisJJmxlYQkoJGlucCwmUVdQKDE2LCRpbnApKTsKKwkmam1wCSgmbGFiZWwoImNjbTY0X2RlY19vdXRlciIpKTsKKworJnNldF9sYWJlbCgiY2NtNjRfZGVjX291dGVyIiwxNik7CisJJnhvcnBzCSgkaW4wLCRpbm91dDApOwkJCSMgaW5wIF49IEUoaXZlYykKKwkmbW92ZHFhCSgkaW5vdXQwLCRpdmVjKTsKKwkmbW92CSgkcm91bmRzLCRyb3VuZHNfKTsKKwkmbW92dXBzCSgmUVdQKDAsJG91dCksJGluMCk7CQkjIHNhdmUgb3V0cHV0CisJJmxlYQkoJG91dCwmRFdQKDE2LCRvdXQpKTsKKwkmcHNodWZiCSgkaW5vdXQwLCRpbm91dDMpOworCisJJnN1YgkoJGxlbiwxKTsKKwkmanoJKCZsYWJlbCgiY2NtNjRfZGVjX2JyZWFrIikpOworCisJJiRtb3Zla2V5CSgkcm5ka2V5MCwmUVdQKDAsJGtleV8pKTsKKwkmc2hyCQkoJHJvdW5kcywxKTsKKwkmJG1vdmVrZXkJKCRybmRrZXkxLCZRV1AoMTYsJGtleV8pKTsKKwkmeG9ycHMJCSgkaW4wLCRybmRrZXkwKTsKKwkmbGVhCQkoJGtleSwmRFdQKDMyLCRrZXlfKSk7CisJJnhvcnBzCQkoJGlub3V0MCwkcm5ka2V5MCk7CisJJnhvcnBzCQkoJGNtYWMsJGluMCk7CQkjIGNtYWNePW91dAorCSYkbW92ZWtleQkoJHJuZGtleTAsJlFXUCgwLCRrZXkpKTsKKworJnNldF9sYWJlbCgiY2NtNjRfZGVjMl9sb29wIik7CisJJmFlc2VuYwkJKCRpbm91dDAsJHJuZGtleTEpOworCSZkZWMJCSgkcm91bmRzKTsKKwkmYWVzZW5jCQkoJGNtYWMsJHJuZGtleTEpOworCSYkbW92ZWtleQkoJHJuZGtleTEsJlFXUCgxNiwka2V5KSk7CisJJmFlc2VuYwkJKCRpbm91dDAsJHJuZGtleTApOworCSZsZWEJCSgka2V5LCZEV1AoMzIsJGtleSkpOworCSZhZXNlbmMJCSgkY21hYywkcm5ka2V5MCk7CisJJiRtb3Zla2V5CSgkcm5ka2V5MCwmUVdQKDAsJGtleSkpOworCSZqbnoJCSgmbGFiZWwoImNjbTY0X2RlYzJfbG9vcCIpKTsKKwkmbW92dXBzCQkoJGluMCwmUVdQKDAsJGlucCkpOwkjIGxvYWQgaW5wCisJJnBhZGRxCQkoJGl2ZWMsJlFXUCgxNiwiZXNwIikpOworCSZhZXNlbmMJCSgkaW5vdXQwLCRybmRrZXkxKTsKKwkmYWVzZW5jCQkoJGNtYWMsJHJuZGtleTEpOworCSZsZWEJCSgkaW5wLCZRV1AoMTYsJGlucCkpOworCSZhZXNlbmNsYXN0CSgkaW5vdXQwLCRybmRrZXkwKTsKKwkmYWVzZW5jbGFzdAkoJGNtYWMsJHJuZGtleTApOworCSZqbXAJKCZsYWJlbCgiY2NtNjRfZGVjX291dGVyIikpOworCismc2V0X2xhYmVsKCJjY202NF9kZWNfYnJlYWsiLDE2KTsKKwkmbW92CSgka2V5LCRrZXlfKTsKKwlpZiAoJGlubGluZSkKKwl7ICAgJmFlc25pX2lubGluZV9nZW5lcmF0ZTEoImVuYyIsJGNtYWMsJGluMCk7CX0KKwllbHNlCisJeyAgICZjYWxsCSgiX2Flc25pX2VuY3J5cHQxIiwkY21hYyk7CX0KKworCSZtb3YJKCJlc3AiLCZEV1AoNDgsImVzcCIpKTsKKwkmbW92CSgkb3V0LCZ3cGFyYW0oNSkpOworCSZtb3Z1cHMJKCZRV1AoMCwkb3V0KSwkY21hYyk7CismZnVuY3Rpb25fZW5kKCJhZXNuaV9jY202NF9kZWNyeXB0X2Jsb2NrcyIpOworfQorDAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyB2b2lkIGFlc25pX2N0cjMyX2VuY3J5cHRfYmxvY2tzIChjb25zdCB2b2lkICppbiwgdm9pZCAqb3V0LAorIyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYmxvY2tzLCBjb25zdCBBRVNfS0VZICprZXksCisjICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKml2ZWMpOworIworIyBIYW5kbGVzIG9ubHkgY29tcGxldGUgYmxvY2tzLCBvcGVyYXRlcyBvbiAzMi1iaXQgY291bnRlciBhbmQKKyMgZG9lcyBub3QgdXBkYXRlICppdmVjISAoc2VlIGVuZ2luZS9lbmdfYWVzbmkuYyBmb3IgZGV0YWlscykKKyMKKyMgc3RhY2sgbGF5b3V0OgorIwkwCXBzaHVmYiBtYXNrCisjCTE2CXZlY3RvciBhZGRlbmQ6IDAsNiw2LDYKKyMgCTMyCWNvdW50ZXItbGVzcyBpdmVjCisjCTQ4CTFzdCB0cmlwbGV0IG9mIGNvdW50ZXIgdmVjdG9yCisjCTY0CTJuZCB0cmlwbGV0IG9mIGNvdW50ZXIgdmVjdG9yCisjCTgwCXNhdmVkICVlc3AKKworJmZ1bmN0aW9uX2JlZ2luKCJhZXNuaV9jdHIzMl9lbmNyeXB0X2Jsb2NrcyIpOworCSZtb3YJKCRpbnAsJndwYXJhbSgwKSk7CisJJm1vdgkoJG91dCwmd3BhcmFtKDEpKTsKKwkmbW92CSgkbGVuLCZ3cGFyYW0oMikpOworCSZtb3YJKCRrZXksJndwYXJhbSgzKSk7CisJJm1vdgkoJHJvdW5kc18sJndwYXJhbSg0KSk7CisJJm1vdgkoJGtleV8sImVzcCIpOworCSZzdWIJKCJlc3AiLDg4KTsKKwkmYW5kCSgiZXNwIiwtMTYpOwkJCSMgYWxpZ24gc3RhY2sKKwkmbW92CSgmRFdQKDgwLCJlc3AiKSwka2V5Xyk7CisKKwkmY21wCSgkbGVuLDEpOworCSZqZQkoJmxhYmVsKCJjdHIzMl9vbmVfc2hvcnRjdXQiKSk7CisKKwkmbW92ZHF1CSgkaW5vdXQ1LCZRV1AoMCwkcm91bmRzXykpOwkjIGxvYWQgaXZlYworCisJIyBjb21wb3NlIGJ5dGUtc3dhcCBjb250cm9sIG1hc2sgZm9yIHBzaHVmYiBvbiBzdGFjaworCSZtb3YJKCZEV1AoMCwiZXNwIiksMHgwYzBkMGUwZik7CisJJm1vdgkoJkRXUCg0LCJlc3AiKSwweDA4MDkwYTBiKTsKKwkmbW92CSgmRFdQKDgsImVzcCIpLDB4MDQwNTA2MDcpOworCSZtb3YJKCZEV1AoMTIsImVzcCIpLDB4MDAwMTAyMDMpOworCisJIyBjb21wb3NlIGNvdW50ZXIgaW5jcmVtZW50IHZlY3RvciBvbiBzdGFjaworCSZtb3YJKCRyb3VuZHMsNik7CisJJnhvcgkoJGtleV8sJGtleV8pOworCSZtb3YJKCZEV1AoMTYsImVzcCIpLCRyb3VuZHMpOworCSZtb3YJKCZEV1AoMjAsImVzcCIpLCRyb3VuZHMpOworCSZtb3YJKCZEV1AoMjQsImVzcCIpLCRyb3VuZHMpOworCSZtb3YJKCZEV1AoMjgsImVzcCIpLCRrZXlfKTsKKworCSZwZXh0cmQJKCRyb3VuZHNfLCRpbm91dDUsMyk7CQkjIHB1bGwgMzItYml0IGNvdW50ZXIKKwkmcGluc3JkCSgkaW5vdXQ1LCRrZXlfLDMpOwkJIyB3aXBlIDMyLWJpdCBjb3VudGVyCisKKwkmbW92CSgkcm91bmRzLCZEV1AoMjQwLCRrZXkpKTsJIyBrZXktPnJvdW5kcworCisJIyBjb21wb3NlIDIgdmVjdG9ycyBvZiAzeDMyLWJpdCBjb3VudGVycworCSZic3dhcAkoJHJvdW5kc18pOworCSZweG9yCSgkcm5ka2V5MSwkcm5ka2V5MSk7CisJJnB4b3IJKCRybmRrZXkwLCRybmRrZXkwKTsKKwkmbW92ZHFhCSgkaW5vdXQwLCZRV1AoMCwiZXNwIikpOwkjIGxvYWQgYnl0ZS1zd2FwIG1hc2sKKwkmcGluc3JkCSgkcm5ka2V5MSwkcm91bmRzXywwKTsKKwkmbGVhCSgka2V5XywmRFdQKDMsJHJvdW5kc18pKTsKKwkmcGluc3JkCSgkcm5ka2V5MCwka2V5XywwKTsKKwkmaW5jCSgkcm91bmRzXyk7CisJJnBpbnNyZAkoJHJuZGtleTEsJHJvdW5kc18sMSk7CisJJmluYwkoJGtleV8pOworCSZwaW5zcmQJKCRybmRrZXkwLCRrZXlfLDEpOworCSZpbmMJKCRyb3VuZHNfKTsKKwkmcGluc3JkCSgkcm5ka2V5MSwkcm91bmRzXywyKTsKKwkmaW5jCSgka2V5Xyk7CisJJnBpbnNyZAkoJHJuZGtleTAsJGtleV8sMik7CisJJm1vdmRxYQkoJlFXUCg0OCwiZXNwIiksJHJuZGtleTEpOwkjIHNhdmUgMXN0IHRyaXBsZXQKKwkmcHNodWZiCSgkcm5ka2V5MSwkaW5vdXQwKTsJCSMgYnl0ZSBzd2FwCisJJm1vdmRxYQkoJlFXUCg2NCwiZXNwIiksJHJuZGtleTApOwkjIHNhdmUgMm5kIHRyaXBsZXQKKwkmcHNodWZiCSgkcm5ka2V5MCwkaW5vdXQwKTsJCSMgYnl0ZSBzd2FwCisKKwkmcHNodWZkCSgkaW5vdXQwLCRybmRrZXkxLDM8PDYpOwkjIHBsYWNlIGNvdW50ZXIgdG8gdXBwZXIgZHdvcmQKKwkmcHNodWZkCSgkaW5vdXQxLCRybmRrZXkxLDI8PDYpOworCSZjbXAJKCRsZW4sNik7CisJJmpiCSgmbGFiZWwoImN0cjMyX3RhaWwiKSk7CisJJm1vdmRxYQkoJlFXUCgzMiwiZXNwIiksJGlub3V0NSk7CSMgc2F2ZSBjb3VudGVyLWxlc3MgaXZlYworCSZzaHIJKCRyb3VuZHMsMSk7CisJJm1vdgkoJGtleV8sJGtleSk7CQkJIyBiYWNrdXAgJGtleQorCSZtb3YJKCRyb3VuZHNfLCRyb3VuZHMpOwkJIyBiYWNrdXAgJHJvdW5kcworCSZzdWIJKCRsZW4sNik7CisJJmptcAkoJmxhYmVsKCJjdHIzMl9sb29wNiIpKTsKKworJnNldF9sYWJlbCgiY3RyMzJfbG9vcDYiLDE2KTsKKwkmcHNodWZkCSgkaW5vdXQyLCRybmRrZXkxLDE8PDYpOworCSZtb3ZkcWEJKCRybmRrZXkxLCZRV1AoMzIsImVzcCIpKTsJIyBwdWxsIGNvdW50ZXItbGVzcyBpdmVjCisJJnBzaHVmZAkoJGlub3V0Mywkcm5ka2V5MCwzPDw2KTsKKwkmcG9yCSgkaW5vdXQwLCRybmRrZXkxKTsJCSMgbWVyZ2UgY291bnRlci1sZXNzIGl2ZWMKKwkmcHNodWZkCSgkaW5vdXQ0LCRybmRrZXkwLDI8PDYpOworCSZwb3IJKCRpbm91dDEsJHJuZGtleTEpOworCSZwc2h1ZmQJKCRpbm91dDUsJHJuZGtleTAsMTw8Nik7CisJJnBvcgkoJGlub3V0Miwkcm5ka2V5MSk7CisJJnBvcgkoJGlub3V0Mywkcm5ka2V5MSk7CisJJnBvcgkoJGlub3V0NCwkcm5ka2V5MSk7CisJJnBvcgkoJGlub3V0NSwkcm5ka2V5MSk7CisKKwkjIGlubGluaW5nIF9hZXNuaV9lbmNyeXB0NidzIHByb2xvZ3VlIGdpdmVzIH40JSBpbXByb3ZlbWVudC4uLgorCSYkbW92ZWtleQkoJHJuZGtleTAsJlFXUCgwLCRrZXlfKSk7CisJJiRtb3Zla2V5CSgkcm5ka2V5MSwmUVdQKDE2LCRrZXlfKSk7CisJJmxlYQkJKCRrZXksJkRXUCgzMiwka2V5XykpOworCSZkZWMJCSgkcm91bmRzKTsKKwkmcHhvcgkJKCRpbm91dDAsJHJuZGtleTApOworCSZweG9yCQkoJGlub3V0MSwkcm5ka2V5MCk7CisJJmFlc2VuYwkJKCRpbm91dDAsJHJuZGtleTEpOworCSZweG9yCQkoJGlub3V0Miwkcm5ka2V5MCk7CisJJmFlc2VuYwkJKCRpbm91dDEsJHJuZGtleTEpOworCSZweG9yCQkoJGlub3V0Mywkcm5ka2V5MCk7CisJJmFlc2VuYwkJKCRpbm91dDIsJHJuZGtleTEpOworCSZweG9yCQkoJGlub3V0NCwkcm5ka2V5MCk7CisJJmFlc2VuYwkJKCRpbm91dDMsJHJuZGtleTEpOworCSZweG9yCQkoJGlub3V0NSwkcm5ka2V5MCk7CisJJmFlc2VuYwkJKCRpbm91dDQsJHJuZGtleTEpOworCSYkbW92ZWtleQkoJHJuZGtleTAsJlFXUCgwLCRrZXkpKTsKKwkmYWVzZW5jCQkoJGlub3V0NSwkcm5ka2V5MSk7CisKKwkmY2FsbAkJKCZsYWJlbCgiX2Flc25pX2VuY3J5cHQ2X2VudGVyIikpOworCisJJm1vdnVwcwkoJHJuZGtleTEsJlFXUCgwLCRpbnApKTsKKwkmbW92dXBzCSgkcm5ka2V5MCwmUVdQKDB4MTAsJGlucCkpOworCSZ4b3JwcwkoJGlub3V0MCwkcm5ka2V5MSk7CisJJm1vdnVwcwkoJHJuZGtleTEsJlFXUCgweDIwLCRpbnApKTsKKwkmeG9ycHMJKCRpbm91dDEsJHJuZGtleTApOworCSZtb3Z1cHMJKCZRV1AoMCwkb3V0KSwkaW5vdXQwKTsKKwkmbW92ZHFhCSgkcm5ka2V5MCwmUVdQKDE2LCJlc3AiKSk7CSMgbG9hZCBpbmNyZW1lbnQKKwkmeG9ycHMJKCRpbm91dDIsJHJuZGtleTEpOworCSZtb3ZkcWEJKCRybmRrZXkxLCZRV1AoNDgsImVzcCIpKTsJIyBsb2FkIDFzdCB0cmlwbGV0CisJJm1vdnVwcwkoJlFXUCgweDEwLCRvdXQpLCRpbm91dDEpOworCSZtb3Z1cHMJKCZRV1AoMHgyMCwkb3V0KSwkaW5vdXQyKTsKKworCSZwYWRkZAkoJHJuZGtleTEsJHJuZGtleTApOwkJIyAxc3QgdHJpcGxldCBpbmNyZW1lbnQKKwkmcGFkZGQJKCRybmRrZXkwLCZRV1AoNjQsImVzcCIpKTsJIyAybmQgdHJpcGxldCBpbmNyZW1lbnQKKwkmbW92ZHFhCSgkaW5vdXQwLCZRV1AoMCwiZXNwIikpOwkjIGxvYWQgYnl0ZSBzd2FwIG1hc2sKKworCSZtb3Z1cHMJKCRpbm91dDEsJlFXUCgweDMwLCRpbnApKTsKKwkmbW92dXBzCSgkaW5vdXQyLCZRV1AoMHg0MCwkaW5wKSk7CisJJnhvcnBzCSgkaW5vdXQzLCRpbm91dDEpOworCSZtb3Z1cHMJKCRpbm91dDEsJlFXUCgweDUwLCRpbnApKTsKKwkmbGVhCSgkaW5wLCZEV1AoMHg2MCwkaW5wKSk7CisJJm1vdmRxYQkoJlFXUCg0OCwiZXNwIiksJHJuZGtleTEpOwkjIHNhdmUgMXN0IHRyaXBsZXQKKwkmcHNodWZiCSgkcm5ka2V5MSwkaW5vdXQwKTsJCSMgYnl0ZSBzd2FwCisJJnhvcnBzCSgkaW5vdXQ0LCRpbm91dDIpOworCSZtb3Z1cHMJKCZRV1AoMHgzMCwkb3V0KSwkaW5vdXQzKTsKKwkmeG9ycHMJKCRpbm91dDUsJGlub3V0MSk7CisJJm1vdmRxYQkoJlFXUCg2NCwiZXNwIiksJHJuZGtleTApOwkjIHNhdmUgMm5kIHRyaXBsZXQKKwkmcHNodWZiCSgkcm5ka2V5MCwkaW5vdXQwKTsJCSMgYnl0ZSBzd2FwCisJJm1vdnVwcwkoJlFXUCgweDQwLCRvdXQpLCRpbm91dDQpOworCSZwc2h1ZmQJKCRpbm91dDAsJHJuZGtleTEsMzw8Nik7CisJJm1vdnVwcwkoJlFXUCgweDUwLCRvdXQpLCRpbm91dDUpOworCSZsZWEJKCRvdXQsJkRXUCgweDYwLCRvdXQpKTsKKworCSZtb3YJKCRyb3VuZHMsJHJvdW5kc18pOworCSZwc2h1ZmQJKCRpbm91dDEsJHJuZGtleTEsMjw8Nik7CisJJnN1YgkoJGxlbiw2KTsKKwkmam5jCSgmbGFiZWwoImN0cjMyX2xvb3A2IikpOworCisJJmFkZAkoJGxlbiw2KTsKKwkmanoJKCZsYWJlbCgiY3RyMzJfcmV0IikpOworCSZtb3YJKCRrZXksJGtleV8pOworCSZsZWEJKCRyb3VuZHMsJkRXUCgxLCIiLCRyb3VuZHMsMikpOwkjIHJlc3RvcmUgJHJvdW5kcworCSZtb3ZkcWEJKCRpbm91dDUsJlFXUCgzMiwiZXNwIikpOwkjIHB1bGwgY291bnQtbGVzcyBpdmVjCisKKyZzZXRfbGFiZWwoImN0cjMyX3RhaWwiKTsKKwkmcG9yCSgkaW5vdXQwLCRpbm91dDUpOworCSZjbXAJKCRsZW4sMik7CisJJmpiCSgmbGFiZWwoImN0cjMyX29uZSIpKTsKKworCSZwc2h1ZmQJKCRpbm91dDIsJHJuZGtleTEsMTw8Nik7CisJJnBvcgkoJGlub3V0MSwkaW5vdXQ1KTsKKwkmamUJKCZsYWJlbCgiY3RyMzJfdHdvIikpOworCisJJnBzaHVmZAkoJGlub3V0Mywkcm5ka2V5MCwzPDw2KTsKKwkmcG9yCSgkaW5vdXQyLCRpbm91dDUpOworCSZjbXAJKCRsZW4sNCk7CisJJmpiCSgmbGFiZWwoImN0cjMyX3RocmVlIikpOworCisJJnBzaHVmZAkoJGlub3V0NCwkcm5ka2V5MCwyPDw2KTsKKwkmcG9yCSgkaW5vdXQzLCRpbm91dDUpOworCSZqZQkoJmxhYmVsKCJjdHIzMl9mb3VyIikpOworCisJJnBvcgkoJGlub3V0NCwkaW5vdXQ1KTsKKwkmY2FsbAkoIl9hZXNuaV9lbmNyeXB0NiIpOworCSZtb3Z1cHMJKCRybmRrZXkxLCZRV1AoMCwkaW5wKSk7CisJJm1vdnVwcwkoJHJuZGtleTAsJlFXUCgweDEwLCRpbnApKTsKKwkmeG9ycHMJKCRpbm91dDAsJHJuZGtleTEpOworCSZtb3Z1cHMJKCRybmRrZXkxLCZRV1AoMHgyMCwkaW5wKSk7CisJJnhvcnBzCSgkaW5vdXQxLCRybmRrZXkwKTsKKwkmbW92dXBzCSgkcm5ka2V5MCwmUVdQKDB4MzAsJGlucCkpOworCSZ4b3JwcwkoJGlub3V0Miwkcm5ka2V5MSk7CisJJm1vdnVwcwkoJHJuZGtleTEsJlFXUCgweDQwLCRpbnApKTsKKwkmeG9ycHMJKCRpbm91dDMsJHJuZGtleTApOworCSZtb3Z1cHMJKCZRV1AoMCwkb3V0KSwkaW5vdXQwKTsKKwkmeG9ycHMJKCRpbm91dDQsJHJuZGtleTEpOworCSZtb3Z1cHMJKCZRV1AoMHgxMCwkb3V0KSwkaW5vdXQxKTsKKwkmbW92dXBzCSgmUVdQKDB4MjAsJG91dCksJGlub3V0Mik7CisJJm1vdnVwcwkoJlFXUCgweDMwLCRvdXQpLCRpbm91dDMpOworCSZtb3Z1cHMJKCZRV1AoMHg0MCwkb3V0KSwkaW5vdXQ0KTsKKwkmam1wCSgmbGFiZWwoImN0cjMyX3JldCIpKTsKKworJnNldF9sYWJlbCgiY3RyMzJfb25lX3Nob3J0Y3V0IiwxNik7CisJJm1vdnVwcwkoJGlub3V0MCwmUVdQKDAsJHJvdW5kc18pKTsJIyBsb2FkIGl2ZWMKKwkmbW92CSgkcm91bmRzLCZEV1AoMjQwLCRrZXkpKTsKKwkKKyZzZXRfbGFiZWwoImN0cjMyX29uZSIpOworCWlmICgkaW5saW5lKQorCXsgICAmYWVzbmlfaW5saW5lX2dlbmVyYXRlMSgiZW5jIik7CX0KKwllbHNlCisJeyAgICZjYWxsCSgiX2Flc25pX2VuY3J5cHQxIik7CX0KKwkmbW92dXBzCSgkaW4wLCZRV1AoMCwkaW5wKSk7CisJJnhvcnBzCSgkaW4wLCRpbm91dDApOworCSZtb3Z1cHMJKCZRV1AoMCwkb3V0KSwkaW4wKTsKKwkmam1wCSgmbGFiZWwoImN0cjMyX3JldCIpKTsKKworJnNldF9sYWJlbCgiY3RyMzJfdHdvIiwxNik7CisJJmNhbGwJKCJfYWVzbmlfZW5jcnlwdDMiKTsKKwkmbW92dXBzCSgkaW5vdXQzLCZRV1AoMCwkaW5wKSk7CisJJm1vdnVwcwkoJGlub3V0NCwmUVdQKDB4MTAsJGlucCkpOworCSZ4b3JwcwkoJGlub3V0MCwkaW5vdXQzKTsKKwkmeG9ycHMJKCRpbm91dDEsJGlub3V0NCk7CisJJm1vdnVwcwkoJlFXUCgwLCRvdXQpLCRpbm91dDApOworCSZtb3Z1cHMJKCZRV1AoMHgxMCwkb3V0KSwkaW5vdXQxKTsKKwkmam1wCSgmbGFiZWwoImN0cjMyX3JldCIpKTsKKworJnNldF9sYWJlbCgiY3RyMzJfdGhyZWUiLDE2KTsKKwkmY2FsbAkoIl9hZXNuaV9lbmNyeXB0MyIpOworCSZtb3Z1cHMJKCRpbm91dDMsJlFXUCgwLCRpbnApKTsKKwkmbW92dXBzCSgkaW5vdXQ0LCZRV1AoMHgxMCwkaW5wKSk7CisJJnhvcnBzCSgkaW5vdXQwLCRpbm91dDMpOworCSZtb3Z1cHMJKCRpbm91dDUsJlFXUCgweDIwLCRpbnApKTsKKwkmeG9ycHMJKCRpbm91dDEsJGlub3V0NCk7CisJJm1vdnVwcwkoJlFXUCgwLCRvdXQpLCRpbm91dDApOworCSZ4b3JwcwkoJGlub3V0MiwkaW5vdXQ1KTsKKwkmbW92dXBzCSgmUVdQKDB4MTAsJG91dCksJGlub3V0MSk7CisJJm1vdnVwcwkoJlFXUCgweDIwLCRvdXQpLCRpbm91dDIpOworCSZqbXAJKCZsYWJlbCgiY3RyMzJfcmV0IikpOworCismc2V0X2xhYmVsKCJjdHIzMl9mb3VyIiwxNik7CisJJmNhbGwJKCJfYWVzbmlfZW5jcnlwdDQiKTsKKwkmbW92dXBzCSgkaW5vdXQ0LCZRV1AoMCwkaW5wKSk7CisJJm1vdnVwcwkoJGlub3V0NSwmUVdQKDB4MTAsJGlucCkpOworCSZtb3Z1cHMJKCRybmRrZXkxLCZRV1AoMHgyMCwkaW5wKSk7CisJJnhvcnBzCSgkaW5vdXQwLCRpbm91dDQpOworCSZtb3Z1cHMJKCRybmRrZXkwLCZRV1AoMHgzMCwkaW5wKSk7CisJJnhvcnBzCSgkaW5vdXQxLCRpbm91dDUpOworCSZtb3Z1cHMJKCZRV1AoMCwkb3V0KSwkaW5vdXQwKTsKKwkmeG9ycHMJKCRpbm91dDIsJHJuZGtleTEpOworCSZtb3Z1cHMJKCZRV1AoMHgxMCwkb3V0KSwkaW5vdXQxKTsKKwkmeG9ycHMJKCRpbm91dDMsJHJuZGtleTApOworCSZtb3Z1cHMJKCZRV1AoMHgyMCwkb3V0KSwkaW5vdXQyKTsKKwkmbW92dXBzCSgmUVdQKDB4MzAsJG91dCksJGlub3V0Myk7CisKKyZzZXRfbGFiZWwoImN0cjMyX3JldCIpOworCSZtb3YJKCJlc3AiLCZEV1AoODAsImVzcCIpKTsKKyZmdW5jdGlvbl9lbmQoImFlc25pX2N0cjMyX2VuY3J5cHRfYmxvY2tzIik7CisMCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHZvaWQgYWVzbmlfeHRzX1tlbnxkZV1jcnlwdChjb25zdCBjaGFyICppbnAsY2hhciAqb3V0LHNpemVfdCBsZW4sCisjCWNvbnN0IEFFU19LRVkgKmtleTEsIGNvbnN0IEFFU19LRVkgKmtleTIKKyMJY29uc3QgdW5zaWduZWQgY2hhciBpdlsxNl0pOworIworeyBteSAoJHR3ZWFrLCR0d3RtcCwkdHdyZXMsJHR3bWFzayk9KCRybmRrZXkxLCRybmRrZXkwLCRpbm91dDAsJGlub3V0MSk7CisKKyZmdW5jdGlvbl9iZWdpbigiYWVzbmlfeHRzX2VuY3J5cHQiKTsKKwkmbW92CSgka2V5LCZ3cGFyYW0oNCkpOwkJIyBrZXkyCisJJm1vdgkoJGlucCwmd3BhcmFtKDUpKTsJCSMgY2xlYXItdGV4dCB0d2VhaworCisJJm1vdgkoJHJvdW5kcywmRFdQKDI0MCwka2V5KSk7CSMga2V5Mi0+cm91bmRzCisJJm1vdnVwcwkoJGlub3V0MCwmUVdQKDAsJGlucCkpOworCWlmICgkaW5saW5lKQorCXsgICAmYWVzbmlfaW5saW5lX2dlbmVyYXRlMSgiZW5jIik7CX0KKwllbHNlCisJeyAgICZjYWxsCSgiX2Flc25pX2VuY3J5cHQxIik7CX0KKworCSZtb3YJKCRpbnAsJndwYXJhbSgwKSk7CisJJm1vdgkoJG91dCwmd3BhcmFtKDEpKTsKKwkmbW92CSgkbGVuLCZ3cGFyYW0oMikpOworCSZtb3YJKCRrZXksJndwYXJhbSgzKSk7CQkjIGtleTEKKworCSZtb3YJKCRrZXlfLCJlc3AiKTsKKwkmc3ViCSgiZXNwIiwxNio3KzgpOworCSZtb3YJKCRyb3VuZHMsJkRXUCgyNDAsJGtleSkpOwkjIGtleTEtPnJvdW5kcworCSZhbmQJKCJlc3AiLC0xNik7CQkJIyBhbGlnbiBzdGFjaworCisJJm1vdgkoJkRXUCgxNio2KzAsImVzcCIpLDB4ODcpOwkjIGNvbXBvc2UgdGhlIG1hZ2ljIGNvbnN0YW50CisJJm1vdgkoJkRXUCgxNio2KzQsImVzcCIpLDApOworCSZtb3YJKCZEV1AoMTYqNis4LCJlc3AiKSwxKTsKKwkmbW92CSgmRFdQKDE2KjYrMTIsImVzcCIpLDApOworCSZtb3YJKCZEV1AoMTYqNyswLCJlc3AiKSwkbGVuKTsJIyBzYXZlIG9yaWdpbmFsICRsZW4KKwkmbW92CSgmRFdQKDE2KjcrNCwiZXNwIiksJGtleV8pOwkjIHNhdmUgb3JpZ2luYWwgJWVzcAorCisJJm1vdmRxYQkoJHR3ZWFrLCRpbm91dDApOworCSZweG9yCSgkdHd0bXAsJHR3dG1wKTsKKwkmbW92ZHFhCSgkdHdtYXNrLCZRV1AoNioxNiwiZXNwIikpOwkjIDB4MC4uLjAxMC4uLjg3CisJJnBjbXBndGQoJHR3dG1wLCR0d2Vhayk7CQkjIGJyb2FkY2FzdCB1cHBlciBiaXRzCisKKwkmYW5kCSgkbGVuLC0xNik7CisJJm1vdgkoJGtleV8sJGtleSk7CQkJIyBiYWNrdXAgJGtleQorCSZtb3YJKCRyb3VuZHNfLCRyb3VuZHMpOwkJIyBiYWNrdXAgJHJvdW5kcworCSZzdWIJKCRsZW4sMTYqNik7CisJJmpjCSgmbGFiZWwoInh0c19lbmNfc2hvcnQiKSk7CisKKwkmc2hyCSgkcm91bmRzLDEpOworCSZtb3YJKCRyb3VuZHNfLCRyb3VuZHMpOworCSZqbXAJKCZsYWJlbCgieHRzX2VuY19sb29wNiIpKTsKKworJnNldF9sYWJlbCgieHRzX2VuY19sb29wNiIsMTYpOworCWZvciAoJGk9MDskaTw0OyRpKyspIHsKKwkgICAgJnBzaHVmZAkoJHR3cmVzLCR0d3RtcCwweDEzKTsKKwkgICAgJnB4b3IJKCR0d3RtcCwkdHd0bXApOworCSAgICAmbW92ZHFhCSgmUVdQKDE2KiRpLCJlc3AiKSwkdHdlYWspOworCSAgICAmcGFkZHEJKCR0d2VhaywkdHdlYWspOwkjICZwc2xscSgkdHdlYWssMSk7CisJICAgICZwYW5kCSgkdHdyZXMsJHR3bWFzayk7CSMgaXNvbGF0ZSBjYXJyeSBhbmQgcmVzaWR1ZQorCSAgICAmcGNtcGd0ZAkoJHR3dG1wLCR0d2Vhayk7CSMgYnJvYWRjYXN0IHVwcGVyIGJpdHMKKwkgICAgJnB4b3IJKCR0d2VhaywkdHdyZXMpOworCX0KKwkmcHNodWZkCSgkaW5vdXQ1LCR0d3RtcCwweDEzKTsKKwkmbW92ZHFhCSgmUVdQKDE2KiRpKyssImVzcCIpLCR0d2Vhayk7CisJJnBhZGRxCSgkdHdlYWssJHR3ZWFrKTsJCSMgJnBzbGxxKCR0d2VhaywxKTsKKwkgJiRtb3Zla2V5CSgkcm5ka2V5MCwmUVdQKDAsJGtleV8pKTsKKwkmcGFuZAkoJGlub3V0NSwkdHdtYXNrKTsJCSMgaXNvbGF0ZSBjYXJyeSBhbmQgcmVzaWR1ZQorCSAmbW92dXBzCSgkaW5vdXQwLCZRV1AoMCwkaW5wKSk7CSMgbG9hZCBpbnB1dAorCSZweG9yCSgkaW5vdXQ1LCR0d2Vhayk7CisKKwkjIGlubGluZSBfYWVzbmlfZW5jcnlwdDYgcHJvbG9ndWUgYW5kIGZsaXAgeG9yIHdpdGggdHdlYWsgYW5kIGtleVswXQorCSZtb3ZkcXUJKCRpbm91dDEsJlFXUCgxNioxLCRpbnApKTsKKwkgJnhvcnBzCQkoJGlub3V0MCwkcm5ka2V5MCk7CSMgaW5wdXRePXJuZGtleVswXQorCSZtb3ZkcXUJKCRpbm91dDIsJlFXUCgxNioyLCRpbnApKTsKKwkgJnB4b3IJCSgkaW5vdXQxLCRybmRrZXkwKTsKKwkmbW92ZHF1CSgkaW5vdXQzLCZRV1AoMTYqMywkaW5wKSk7CisJICZweG9yCQkoJGlub3V0Miwkcm5ka2V5MCk7CisJJm1vdmRxdQkoJGlub3V0NCwmUVdQKDE2KjQsJGlucCkpOworCSAmcHhvcgkJKCRpbm91dDMsJHJuZGtleTApOworCSZtb3ZkcXUJKCRybmRrZXkxLCZRV1AoMTYqNSwkaW5wKSk7CisJICZweG9yCQkoJGlub3V0NCwkcm5ka2V5MCk7CisJJmxlYQkoJGlucCwmRFdQKDE2KjYsJGlucCkpOworCSZweG9yCSgkaW5vdXQwLCZRV1AoMTYqMCwiZXNwIikpOwkjIGlucHV0Xj10d2VhaworCSZtb3ZkcWEJKCZRV1AoMTYqJGksImVzcCIpLCRpbm91dDUpOwkjIHNhdmUgbGFzdCB0d2VhaworCSZweG9yCSgkaW5vdXQ1LCRybmRrZXkxKTsKKworCSAmJG1vdmVrZXkJKCRybmRrZXkxLCZRV1AoMTYsJGtleV8pKTsKKwkgJmxlYQkJKCRrZXksJkRXUCgzMiwka2V5XykpOworCSZweG9yCSgkaW5vdXQxLCZRV1AoMTYqMSwiZXNwIikpOworCSAmYWVzZW5jCSgkaW5vdXQwLCRybmRrZXkxKTsKKwkmcHhvcgkoJGlub3V0MiwmUVdQKDE2KjIsImVzcCIpKTsKKwkgJmFlc2VuYwkoJGlub3V0MSwkcm5ka2V5MSk7CisJJnB4b3IJKCRpbm91dDMsJlFXUCgxNiozLCJlc3AiKSk7CisJICZkZWMJCSgkcm91bmRzKTsKKwkgJmFlc2VuYwkoJGlub3V0Miwkcm5ka2V5MSk7CisJJnB4b3IJKCRpbm91dDQsJlFXUCgxNio0LCJlc3AiKSk7CisJICZhZXNlbmMJKCRpbm91dDMsJHJuZGtleTEpOworCSZweG9yCQkoJGlub3V0NSwkcm5ka2V5MCk7CisJICZhZXNlbmMJKCRpbm91dDQsJHJuZGtleTEpOworCSAmJG1vdmVrZXkJKCRybmRrZXkwLCZRV1AoMCwka2V5KSk7CisJICZhZXNlbmMJKCRpbm91dDUsJHJuZGtleTEpOworCSZjYWxsCQkoJmxhYmVsKCJfYWVzbmlfZW5jcnlwdDZfZW50ZXIiKSk7CisKKwkmbW92ZHFhCSgkdHdlYWssJlFXUCgxNio1LCJlc3AiKSk7CSMgbGFzdCB0d2VhaworICAgICAgICZweG9yCSgkdHd0bXAsJHR3dG1wKTsKKwkmeG9ycHMJKCRpbm91dDAsJlFXUCgxNiowLCJlc3AiKSk7CSMgb3V0cHV0Xj10d2VhaworICAgICAgICZwY21wZ3RkCSgkdHd0bXAsJHR3ZWFrKTsJCSMgYnJvYWRjYXN0IHVwcGVyIGJpdHMKKwkmeG9ycHMJKCRpbm91dDEsJlFXUCgxNioxLCJlc3AiKSk7CisJJm1vdnVwcwkoJlFXUCgxNiowLCRvdXQpLCRpbm91dDApOwkjIHdyaXRlIG91dHB1dAorCSZ4b3JwcwkoJGlub3V0MiwmUVdQKDE2KjIsImVzcCIpKTsKKwkmbW92dXBzCSgmUVdQKDE2KjEsJG91dCksJGlub3V0MSk7CisJJnhvcnBzCSgkaW5vdXQzLCZRV1AoMTYqMywiZXNwIikpOworCSZtb3Z1cHMJKCZRV1AoMTYqMiwkb3V0KSwkaW5vdXQyKTsKKwkmeG9ycHMJKCRpbm91dDQsJlFXUCgxNio0LCJlc3AiKSk7CisJJm1vdnVwcwkoJlFXUCgxNiozLCRvdXQpLCRpbm91dDMpOworCSZ4b3JwcwkoJGlub3V0NSwkdHdlYWspOworCSZtb3Z1cHMJKCZRV1AoMTYqNCwkb3V0KSwkaW5vdXQ0KTsKKyAgICAgICAmcHNodWZkCSgkdHdyZXMsJHR3dG1wLDB4MTMpOworCSZtb3Z1cHMJKCZRV1AoMTYqNSwkb3V0KSwkaW5vdXQ1KTsKKwkmbGVhCSgkb3V0LCZEV1AoMTYqNiwkb3V0KSk7CisgICAgICAgJm1vdmRxYQkoJHR3bWFzaywmUVdQKDE2KjYsImVzcCIpKTsJIyAweDAuLi4wMTAuLi44NworCisJJnB4b3IJKCR0d3RtcCwkdHd0bXApOworCSZwYWRkcQkoJHR3ZWFrLCR0d2Vhayk7CQkjICZwc2xscSgkdHdlYWssMSk7CisJJnBhbmQJKCR0d3JlcywkdHdtYXNrKTsJCSMgaXNvbGF0ZSBjYXJyeSBhbmQgcmVzaWR1ZQorCSZwY21wZ3RkKCR0d3RtcCwkdHdlYWspOwkJIyBicm9hZGNhc3QgdXBwZXIgYml0cworCSZtb3YJKCRyb3VuZHMsJHJvdW5kc18pOwkJIyByZXN0b3JlICRyb3VuZHMKKwkmcHhvcgkoJHR3ZWFrLCR0d3Jlcyk7CisKKwkmc3ViCSgkbGVuLDE2KjYpOworCSZqbmMJKCZsYWJlbCgieHRzX2VuY19sb29wNiIpKTsKKworCSZsZWEJKCRyb3VuZHMsJkRXUCgxLCIiLCRyb3VuZHMsMikpOwkjIHJlc3RvcmUgJHJvdW5kcworCSZtb3YJKCRrZXksJGtleV8pOwkJCSMgcmVzdG9yZSAka2V5CisJJm1vdgkoJHJvdW5kc18sJHJvdW5kcyk7CisKKyZzZXRfbGFiZWwoInh0c19lbmNfc2hvcnQiKTsKKwkmYWRkCSgkbGVuLDE2KjYpOworCSZqegkoJmxhYmVsKCJ4dHNfZW5jX2RvbmU2eCIpKTsKKworCSZtb3ZkcWEJKCRpbm91dDMsJHR3ZWFrKTsJCSMgcHV0IGFzaWRlIHByZXZpb3VzIHR3ZWFrCisJJmNtcAkoJGxlbiwweDIwKTsKKwkmamIJKCZsYWJlbCgieHRzX2VuY19vbmUiKSk7CisKKwkmcHNodWZkCSgkdHdyZXMsJHR3dG1wLDB4MTMpOworCSZweG9yCSgkdHd0bXAsJHR3dG1wKTsKKwkmcGFkZHEJKCR0d2VhaywkdHdlYWspOwkJIyAmcHNsbHEoJHR3ZWFrLDEpOworCSZwYW5kCSgkdHdyZXMsJHR3bWFzayk7CQkjIGlzb2xhdGUgY2FycnkgYW5kIHJlc2lkdWUKKwkmcGNtcGd0ZCgkdHd0bXAsJHR3ZWFrKTsJCSMgYnJvYWRjYXN0IHVwcGVyIGJpdHMKKwkmcHhvcgkoJHR3ZWFrLCR0d3Jlcyk7CisJJmplCSgmbGFiZWwoInh0c19lbmNfdHdvIikpOworCisJJnBzaHVmZAkoJHR3cmVzLCR0d3RtcCwweDEzKTsKKwkmcHhvcgkoJHR3dG1wLCR0d3RtcCk7CisJJm1vdmRxYQkoJGlub3V0NCwkdHdlYWspOwkJIyBwdXQgYXNpZGUgcHJldmlvdXMgdHdlYWsKKwkmcGFkZHEJKCR0d2VhaywkdHdlYWspOwkJIyAmcHNsbHEoJHR3ZWFrLDEpOworCSZwYW5kCSgkdHdyZXMsJHR3bWFzayk7CQkjIGlzb2xhdGUgY2FycnkgYW5kIHJlc2lkdWUKKwkmcGNtcGd0ZCgkdHd0bXAsJHR3ZWFrKTsJCSMgYnJvYWRjYXN0IHVwcGVyIGJpdHMKKwkmcHhvcgkoJHR3ZWFrLCR0d3Jlcyk7CisJJmNtcAkoJGxlbiwweDQwKTsKKwkmamIJKCZsYWJlbCgieHRzX2VuY190aHJlZSIpKTsKKworCSZwc2h1ZmQJKCR0d3JlcywkdHd0bXAsMHgxMyk7CisJJnB4b3IJKCR0d3RtcCwkdHd0bXApOworCSZtb3ZkcWEJKCRpbm91dDUsJHR3ZWFrKTsJCSMgcHV0IGFzaWRlIHByZXZpb3VzIHR3ZWFrCisJJnBhZGRxCSgkdHdlYWssJHR3ZWFrKTsJCSMgJnBzbGxxKCR0d2VhaywxKTsKKwkmcGFuZAkoJHR3cmVzLCR0d21hc2spOwkJIyBpc29sYXRlIGNhcnJ5IGFuZCByZXNpZHVlCisJJnBjbXBndGQoJHR3dG1wLCR0d2Vhayk7CQkjIGJyb2FkY2FzdCB1cHBlciBiaXRzCisJJnB4b3IJKCR0d2VhaywkdHdyZXMpOworCSZtb3ZkcWEJKCZRV1AoMTYqMCwiZXNwIiksJGlub3V0Myk7CisJJm1vdmRxYQkoJlFXUCgxNioxLCJlc3AiKSwkaW5vdXQ0KTsKKwkmamUJKCZsYWJlbCgieHRzX2VuY19mb3VyIikpOworCisJJm1vdmRxYQkoJlFXUCgxNioyLCJlc3AiKSwkaW5vdXQ1KTsKKwkmcHNodWZkCSgkaW5vdXQ1LCR0d3RtcCwweDEzKTsKKwkmbW92ZHFhCSgmUVdQKDE2KjMsImVzcCIpLCR0d2Vhayk7CisJJnBhZGRxCSgkdHdlYWssJHR3ZWFrKTsJCSMgJnBzbGxxKCRpbm91dDAsMSk7CisJJnBhbmQJKCRpbm91dDUsJHR3bWFzayk7CQkjIGlzb2xhdGUgY2FycnkgYW5kIHJlc2lkdWUKKwkmcHhvcgkoJGlub3V0NSwkdHdlYWspOworCisJJm1vdmRxdQkoJGlub3V0MCwmUVdQKDE2KjAsJGlucCkpOwkjIGxvYWQgaW5wdXQKKwkmbW92ZHF1CSgkaW5vdXQxLCZRV1AoMTYqMSwkaW5wKSk7CisJJm1vdmRxdQkoJGlub3V0MiwmUVdQKDE2KjIsJGlucCkpOworCSZweG9yCSgkaW5vdXQwLCZRV1AoMTYqMCwiZXNwIikpOwkjIGlucHV0Xj10d2VhaworCSZtb3ZkcXUJKCRpbm91dDMsJlFXUCgxNiozLCRpbnApKTsKKwkmcHhvcgkoJGlub3V0MSwmUVdQKDE2KjEsImVzcCIpKTsKKwkmbW92ZHF1CSgkaW5vdXQ0LCZRV1AoMTYqNCwkaW5wKSk7CisJJnB4b3IJKCRpbm91dDIsJlFXUCgxNioyLCJlc3AiKSk7CisJJmxlYQkoJGlucCwmRFdQKDE2KjUsJGlucCkpOworCSZweG9yCSgkaW5vdXQzLCZRV1AoMTYqMywiZXNwIikpOworCSZtb3ZkcWEJKCZRV1AoMTYqNCwiZXNwIiksJGlub3V0NSk7CSMgc2F2ZSBsYXN0IHR3ZWFrCisJJnB4b3IJKCRpbm91dDQsJGlub3V0NSk7CisKKwkmY2FsbAkoIl9hZXNuaV9lbmNyeXB0NiIpOworCisJJm1vdmFwcwkoJHR3ZWFrLCZRV1AoMTYqNCwiZXNwIikpOwkjIGxhc3QgdHdlYWsKKwkmeG9ycHMJKCRpbm91dDAsJlFXUCgxNiowLCJlc3AiKSk7CSMgb3V0cHV0Xj10d2VhaworCSZ4b3JwcwkoJGlub3V0MSwmUVdQKDE2KjEsImVzcCIpKTsKKwkmeG9ycHMJKCRpbm91dDIsJlFXUCgxNioyLCJlc3AiKSk7CisJJm1vdnVwcwkoJlFXUCgxNiowLCRvdXQpLCRpbm91dDApOwkjIHdyaXRlIG91dHB1dAorCSZ4b3JwcwkoJGlub3V0MywmUVdQKDE2KjMsImVzcCIpKTsKKwkmbW92dXBzCSgmUVdQKDE2KjEsJG91dCksJGlub3V0MSk7CisJJnhvcnBzCSgkaW5vdXQ0LCR0d2Vhayk7CisJJm1vdnVwcwkoJlFXUCgxNioyLCRvdXQpLCRpbm91dDIpOworCSZtb3Z1cHMJKCZRV1AoMTYqMywkb3V0KSwkaW5vdXQzKTsKKwkmbW92dXBzCSgmUVdQKDE2KjQsJG91dCksJGlub3V0NCk7CisJJmxlYQkoJG91dCwmRFdQKDE2KjUsJG91dCkpOworCSZqbXAJKCZsYWJlbCgieHRzX2VuY19kb25lIikpOworCismc2V0X2xhYmVsKCJ4dHNfZW5jX29uZSIsMTYpOworCSZtb3Z1cHMJKCRpbm91dDAsJlFXUCgxNiowLCRpbnApKTsJIyBsb2FkIGlucHV0CisJJmxlYQkoJGlucCwmRFdQKDE2KjEsJGlucCkpOworCSZ4b3JwcwkoJGlub3V0MCwkaW5vdXQzKTsJCSMgaW5wdXRePXR3ZWFrCisJaWYgKCRpbmxpbmUpCisJeyAgICZhZXNuaV9pbmxpbmVfZ2VuZXJhdGUxKCJlbmMiKTsJfQorCWVsc2UKKwl7ICAgJmNhbGwJKCJfYWVzbmlfZW5jcnlwdDEiKTsJfQorCSZ4b3JwcwkoJGlub3V0MCwkaW5vdXQzKTsJCSMgb3V0cHV0Xj10d2VhaworCSZtb3Z1cHMJKCZRV1AoMTYqMCwkb3V0KSwkaW5vdXQwKTsJIyB3cml0ZSBvdXRwdXQKKwkmbGVhCSgkb3V0LCZEV1AoMTYqMSwkb3V0KSk7CisKKwkmbW92ZHFhCSgkdHdlYWssJGlub3V0Myk7CQkjIGxhc3QgdHdlYWsKKwkmam1wCSgmbGFiZWwoInh0c19lbmNfZG9uZSIpKTsKKworJnNldF9sYWJlbCgieHRzX2VuY190d28iLDE2KTsKKwkmbW92YXBzCSgkaW5vdXQ0LCR0d2Vhayk7CQkjIHB1dCBhc2lkZSBsYXN0IHR3ZWFrCisKKwkmbW92dXBzCSgkaW5vdXQwLCZRV1AoMTYqMCwkaW5wKSk7CSMgbG9hZCBpbnB1dAorCSZtb3Z1cHMJKCRpbm91dDEsJlFXUCgxNioxLCRpbnApKTsKKwkmbGVhCSgkaW5wLCZEV1AoMTYqMiwkaW5wKSk7CisJJnhvcnBzCSgkaW5vdXQwLCRpbm91dDMpOwkJIyBpbnB1dF49dHdlYWsKKwkmeG9ycHMJKCRpbm91dDEsJGlub3V0NCk7CisJJnhvcnBzCSgkaW5vdXQyLCRpbm91dDIpOworCisJJmNhbGwJKCJfYWVzbmlfZW5jcnlwdDMiKTsKKworCSZ4b3JwcwkoJGlub3V0MCwkaW5vdXQzKTsJCSMgb3V0cHV0Xj10d2VhaworCSZ4b3JwcwkoJGlub3V0MSwkaW5vdXQ0KTsKKwkmbW92dXBzCSgmUVdQKDE2KjAsJG91dCksJGlub3V0MCk7CSMgd3JpdGUgb3V0cHV0CisJJm1vdnVwcwkoJlFXUCgxNioxLCRvdXQpLCRpbm91dDEpOworCSZsZWEJKCRvdXQsJkRXUCgxNioyLCRvdXQpKTsKKworCSZtb3ZkcWEJKCR0d2VhaywkaW5vdXQ0KTsJCSMgbGFzdCB0d2VhaworCSZqbXAJKCZsYWJlbCgieHRzX2VuY19kb25lIikpOworCismc2V0X2xhYmVsKCJ4dHNfZW5jX3RocmVlIiwxNik7CisJJm1vdmFwcwkoJGlub3V0NSwkdHdlYWspOwkJIyBwdXQgYXNpZGUgbGFzdCB0d2VhaworCSZtb3Z1cHMJKCRpbm91dDAsJlFXUCgxNiowLCRpbnApKTsJIyBsb2FkIGlucHV0CisJJm1vdnVwcwkoJGlub3V0MSwmUVdQKDE2KjEsJGlucCkpOworCSZtb3Z1cHMJKCRpbm91dDIsJlFXUCgxNioyLCRpbnApKTsKKwkmbGVhCSgkaW5wLCZEV1AoMTYqMywkaW5wKSk7CisJJnhvcnBzCSgkaW5vdXQwLCRpbm91dDMpOwkJIyBpbnB1dF49dHdlYWsKKwkmeG9ycHMJKCRpbm91dDEsJGlub3V0NCk7CisJJnhvcnBzCSgkaW5vdXQyLCRpbm91dDUpOworCisJJmNhbGwJKCJfYWVzbmlfZW5jcnlwdDMiKTsKKworCSZ4b3JwcwkoJGlub3V0MCwkaW5vdXQzKTsJCSMgb3V0cHV0Xj10d2VhaworCSZ4b3JwcwkoJGlub3V0MSwkaW5vdXQ0KTsKKwkmeG9ycHMJKCRpbm91dDIsJGlub3V0NSk7CisJJm1vdnVwcwkoJlFXUCgxNiowLCRvdXQpLCRpbm91dDApOwkjIHdyaXRlIG91dHB1dAorCSZtb3Z1cHMJKCZRV1AoMTYqMSwkb3V0KSwkaW5vdXQxKTsKKwkmbW92dXBzCSgmUVdQKDE2KjIsJG91dCksJGlub3V0Mik7CisJJmxlYQkoJG91dCwmRFdQKDE2KjMsJG91dCkpOworCisJJm1vdmRxYQkoJHR3ZWFrLCRpbm91dDUpOwkJIyBsYXN0IHR3ZWFrCisJJmptcAkoJmxhYmVsKCJ4dHNfZW5jX2RvbmUiKSk7CisKKyZzZXRfbGFiZWwoInh0c19lbmNfZm91ciIsMTYpOworCSZtb3ZhcHMJKCRpbm91dDQsJHR3ZWFrKTsJCSMgcHV0IGFzaWRlIGxhc3QgdHdlYWsKKworCSZtb3Z1cHMJKCRpbm91dDAsJlFXUCgxNiowLCRpbnApKTsJIyBsb2FkIGlucHV0CisJJm1vdnVwcwkoJGlub3V0MSwmUVdQKDE2KjEsJGlucCkpOworCSZtb3Z1cHMJKCRpbm91dDIsJlFXUCgxNioyLCRpbnApKTsKKwkmeG9ycHMJKCRpbm91dDAsJlFXUCgxNiowLCJlc3AiKSk7CSMgaW5wdXRePXR3ZWFrCisJJm1vdnVwcwkoJGlub3V0MywmUVdQKDE2KjMsJGlucCkpOworCSZsZWEJKCRpbnAsJkRXUCgxNio0LCRpbnApKTsKKwkmeG9ycHMJKCRpbm91dDEsJlFXUCgxNioxLCJlc3AiKSk7CisJJnhvcnBzCSgkaW5vdXQyLCRpbm91dDUpOworCSZ4b3JwcwkoJGlub3V0MywkaW5vdXQ0KTsKKworCSZjYWxsCSgiX2Flc25pX2VuY3J5cHQ0Iik7CisKKwkmeG9ycHMJKCRpbm91dDAsJlFXUCgxNiowLCJlc3AiKSk7CSMgb3V0cHV0Xj10d2VhaworCSZ4b3JwcwkoJGlub3V0MSwmUVdQKDE2KjEsImVzcCIpKTsKKwkmeG9ycHMJKCRpbm91dDIsJGlub3V0NSk7CisJJm1vdnVwcwkoJlFXUCgxNiowLCRvdXQpLCRpbm91dDApOwkjIHdyaXRlIG91dHB1dAorCSZ4b3JwcwkoJGlub3V0MywkaW5vdXQ0KTsKKwkmbW92dXBzCSgmUVdQKDE2KjEsJG91dCksJGlub3V0MSk7CisJJm1vdnVwcwkoJlFXUCgxNioyLCRvdXQpLCRpbm91dDIpOworCSZtb3Z1cHMJKCZRV1AoMTYqMywkb3V0KSwkaW5vdXQzKTsKKwkmbGVhCSgkb3V0LCZEV1AoMTYqNCwkb3V0KSk7CisKKwkmbW92ZHFhCSgkdHdlYWssJGlub3V0NCk7CQkjIGxhc3QgdHdlYWsKKwkmam1wCSgmbGFiZWwoInh0c19lbmNfZG9uZSIpKTsKKworJnNldF9sYWJlbCgieHRzX2VuY19kb25lNngiLDE2KTsJCSMgJHR3ZWFrIGlzIHByZS1jYWxjdWxhdGVkCisJJm1vdgkoJGxlbiwmRFdQKDE2KjcrMCwiZXNwIikpOwkjIHJlc3RvcmUgb3JpZ2luYWwgJGxlbgorCSZhbmQJKCRsZW4sMTUpOworCSZqegkoJmxhYmVsKCJ4dHNfZW5jX3JldCIpKTsKKwkmbW92ZHFhCSgkaW5vdXQzLCR0d2Vhayk7CisJJm1vdgkoJkRXUCgxNio3KzAsImVzcCIpLCRsZW4pOwkjIHNhdmUgJGxlbiUxNgorCSZqbXAJKCZsYWJlbCgieHRzX2VuY19zdGVhbCIpKTsKKworJnNldF9sYWJlbCgieHRzX2VuY19kb25lIiwxNik7CisJJm1vdgkoJGxlbiwmRFdQKDE2KjcrMCwiZXNwIikpOwkjIHJlc3RvcmUgb3JpZ2luYWwgJGxlbgorCSZweG9yCSgkdHd0bXAsJHR3dG1wKTsKKwkmYW5kCSgkbGVuLDE1KTsKKwkmanoJKCZsYWJlbCgieHRzX2VuY19yZXQiKSk7CisKKwkmcGNtcGd0ZCgkdHd0bXAsJHR3ZWFrKTsJCSMgYnJvYWRjYXN0IHVwcGVyIGJpdHMKKwkmbW92CSgmRFdQKDE2KjcrMCwiZXNwIiksJGxlbik7CSMgc2F2ZSAkbGVuJTE2CisJJnBzaHVmZAkoJGlub3V0MywkdHd0bXAsMHgxMyk7CisJJnBhZGRxCSgkdHdlYWssJHR3ZWFrKTsJCSMgJnBzbGxxKCR0d2VhaywxKTsKKwkmcGFuZAkoJGlub3V0MywmUVdQKDE2KjYsImVzcCIpKTsJIyBpc29sYXRlIGNhcnJ5IGFuZCByZXNpZHVlCisJJnB4b3IJKCRpbm91dDMsJHR3ZWFrKTsKKworJnNldF9sYWJlbCgieHRzX2VuY19zdGVhbCIpOworCSZtb3Z6CSgkcm91bmRzLCZCUCgwLCRpbnApKTsKKwkmbW92egkoJGtleSwmQlAoLTE2LCRvdXQpKTsKKwkmbGVhCSgkaW5wLCZEV1AoMSwkaW5wKSk7CisJJm1vdgkoJkJQKC0xNiwkb3V0KSwmTEIoJHJvdW5kcykpOworCSZtb3YJKCZCUCgwLCRvdXQpLCZMQigka2V5KSk7CisJJmxlYQkoJG91dCwmRFdQKDEsJG91dCkpOworCSZzdWIJKCRsZW4sMSk7CisJJmpuegkoJmxhYmVsKCJ4dHNfZW5jX3N0ZWFsIikpOworCisJJnN1YgkoJG91dCwmRFdQKDE2KjcrMCwiZXNwIikpOwkjIHJld2luZCAkb3V0CisJJm1vdgkoJGtleSwka2V5Xyk7CQkJIyByZXN0b3JlICRrZXkKKwkmbW92CSgkcm91bmRzLCRyb3VuZHNfKTsJCSMgcmVzdG9yZSAkcm91bmRzCisKKwkmbW92dXBzCSgkaW5vdXQwLCZRV1AoLTE2LCRvdXQpKTsJIyBsb2FkIGlucHV0CisJJnhvcnBzCSgkaW5vdXQwLCRpbm91dDMpOwkJIyBpbnB1dF49dHdlYWsKKwlpZiAoJGlubGluZSkKKwl7ICAgJmFlc25pX2lubGluZV9nZW5lcmF0ZTEoImVuYyIpOwl9CisJZWxzZQorCXsgICAmY2FsbAkoIl9hZXNuaV9lbmNyeXB0MSIpOwl9CisJJnhvcnBzCSgkaW5vdXQwLCRpbm91dDMpOwkJIyBvdXRwdXRePXR3ZWFrCisJJm1vdnVwcwkoJlFXUCgtMTYsJG91dCksJGlub3V0MCk7CSMgd3JpdGUgb3V0cHV0CisKKyZzZXRfbGFiZWwoInh0c19lbmNfcmV0Iik7CisJJm1vdgkoImVzcCIsJkRXUCgxNio3KzQsImVzcCIpKTsJIyByZXN0b3JlICVlc3AKKyZmdW5jdGlvbl9lbmQoImFlc25pX3h0c19lbmNyeXB0Iik7CisKKyZmdW5jdGlvbl9iZWdpbigiYWVzbmlfeHRzX2RlY3J5cHQiKTsKKwkmbW92CSgka2V5LCZ3cGFyYW0oNCkpOwkJIyBrZXkyCisJJm1vdgkoJGlucCwmd3BhcmFtKDUpKTsJCSMgY2xlYXItdGV4dCB0d2VhaworCisJJm1vdgkoJHJvdW5kcywmRFdQKDI0MCwka2V5KSk7CSMga2V5Mi0+cm91bmRzCisJJm1vdnVwcwkoJGlub3V0MCwmUVdQKDAsJGlucCkpOworCWlmICgkaW5saW5lKQorCXsgICAmYWVzbmlfaW5saW5lX2dlbmVyYXRlMSgiZW5jIik7CX0KKwllbHNlCisJeyAgICZjYWxsCSgiX2Flc25pX2VuY3J5cHQxIik7CX0KKworCSZtb3YJKCRpbnAsJndwYXJhbSgwKSk7CisJJm1vdgkoJG91dCwmd3BhcmFtKDEpKTsKKwkmbW92CSgkbGVuLCZ3cGFyYW0oMikpOworCSZtb3YJKCRrZXksJndwYXJhbSgzKSk7CQkjIGtleTEKKworCSZtb3YJKCRrZXlfLCJlc3AiKTsKKwkmc3ViCSgiZXNwIiwxNio3KzgpOworCSZhbmQJKCJlc3AiLC0xNik7CQkJIyBhbGlnbiBzdGFjaworCisJJnhvcgkoJHJvdW5kc18sJHJvdW5kc18pOwkJIyBpZihsZW4lMTYpIGxlbi09MTY7CisJJnRlc3QJKCRsZW4sMTUpOworCSZzZXRuegkoJkxCKCRyb3VuZHNfKSk7CisJJnNobAkoJHJvdW5kc18sNCk7CisJJnN1YgkoJGxlbiwkcm91bmRzXyk7CisKKwkmbW92CSgmRFdQKDE2KjYrMCwiZXNwIiksMHg4Nyk7CSMgY29tcG9zZSB0aGUgbWFnaWMgY29uc3RhbnQKKwkmbW92CSgmRFdQKDE2KjYrNCwiZXNwIiksMCk7CisJJm1vdgkoJkRXUCgxNio2KzgsImVzcCIpLDEpOworCSZtb3YJKCZEV1AoMTYqNisxMiwiZXNwIiksMCk7CisJJm1vdgkoJkRXUCgxNio3KzAsImVzcCIpLCRsZW4pOwkjIHNhdmUgb3JpZ2luYWwgJGxlbgorCSZtb3YJKCZEV1AoMTYqNys0LCJlc3AiKSwka2V5Xyk7CSMgc2F2ZSBvcmlnaW5hbCAlZXNwCisKKwkmbW92CSgkcm91bmRzLCZEV1AoMjQwLCRrZXkpKTsJIyBrZXkxLT5yb3VuZHMKKwkmbW92CSgka2V5Xywka2V5KTsJCQkjIGJhY2t1cCAka2V5CisJJm1vdgkoJHJvdW5kc18sJHJvdW5kcyk7CQkjIGJhY2t1cCAkcm91bmRzCisKKwkmbW92ZHFhCSgkdHdlYWssJGlub3V0MCk7CisJJnB4b3IJKCR0d3RtcCwkdHd0bXApOworCSZtb3ZkcWEJKCR0d21hc2ssJlFXUCg2KjE2LCJlc3AiKSk7CSMgMHgwLi4uMDEwLi4uODcKKwkmcGNtcGd0ZCgkdHd0bXAsJHR3ZWFrKTsJCSMgYnJvYWRjYXN0IHVwcGVyIGJpdHMKKworCSZhbmQJKCRsZW4sLTE2KTsKKwkmc3ViCSgkbGVuLDE2KjYpOworCSZqYwkoJmxhYmVsKCJ4dHNfZGVjX3Nob3J0IikpOworCisJJnNocgkoJHJvdW5kcywxKTsKKwkmbW92CSgkcm91bmRzXywkcm91bmRzKTsKKwkmam1wCSgmbGFiZWwoInh0c19kZWNfbG9vcDYiKSk7CisKKyZzZXRfbGFiZWwoInh0c19kZWNfbG9vcDYiLDE2KTsKKwlmb3IgKCRpPTA7JGk8NDskaSsrKSB7CisJICAgICZwc2h1ZmQJKCR0d3JlcywkdHd0bXAsMHgxMyk7CisJICAgICZweG9yCSgkdHd0bXAsJHR3dG1wKTsKKwkgICAgJm1vdmRxYQkoJlFXUCgxNiokaSwiZXNwIiksJHR3ZWFrKTsKKwkgICAgJnBhZGRxCSgkdHdlYWssJHR3ZWFrKTsJIyAmcHNsbHEoJHR3ZWFrLDEpOworCSAgICAmcGFuZAkoJHR3cmVzLCR0d21hc2spOwkjIGlzb2xhdGUgY2FycnkgYW5kIHJlc2lkdWUKKwkgICAgJnBjbXBndGQJKCR0d3RtcCwkdHdlYWspOwkjIGJyb2FkY2FzdCB1cHBlciBiaXRzCisJICAgICZweG9yCSgkdHdlYWssJHR3cmVzKTsKKwl9CisJJnBzaHVmZAkoJGlub3V0NSwkdHd0bXAsMHgxMyk7CisJJm1vdmRxYQkoJlFXUCgxNiokaSsrLCJlc3AiKSwkdHdlYWspOworCSZwYWRkcQkoJHR3ZWFrLCR0d2Vhayk7CQkjICZwc2xscSgkdHdlYWssMSk7CisJICYkbW92ZWtleQkoJHJuZGtleTAsJlFXUCgwLCRrZXlfKSk7CisJJnBhbmQJKCRpbm91dDUsJHR3bWFzayk7CQkjIGlzb2xhdGUgY2FycnkgYW5kIHJlc2lkdWUKKwkgJm1vdnVwcwkoJGlub3V0MCwmUVdQKDAsJGlucCkpOwkjIGxvYWQgaW5wdXQKKwkmcHhvcgkoJGlub3V0NSwkdHdlYWspOworCisJIyBpbmxpbmUgX2Flc25pX2VuY3J5cHQ2IHByb2xvZ3VlIGFuZCBmbGlwIHhvciB3aXRoIHR3ZWFrIGFuZCBrZXlbMF0KKwkmbW92ZHF1CSgkaW5vdXQxLCZRV1AoMTYqMSwkaW5wKSk7CisJICZ4b3JwcwkJKCRpbm91dDAsJHJuZGtleTApOwkjIGlucHV0Xj1ybmRrZXlbMF0KKwkmbW92ZHF1CSgkaW5vdXQyLCZRV1AoMTYqMiwkaW5wKSk7CisJICZweG9yCQkoJGlub3V0MSwkcm5ka2V5MCk7CisJJm1vdmRxdQkoJGlub3V0MywmUVdQKDE2KjMsJGlucCkpOworCSAmcHhvcgkJKCRpbm91dDIsJHJuZGtleTApOworCSZtb3ZkcXUJKCRpbm91dDQsJlFXUCgxNio0LCRpbnApKTsKKwkgJnB4b3IJCSgkaW5vdXQzLCRybmRrZXkwKTsKKwkmbW92ZHF1CSgkcm5ka2V5MSwmUVdQKDE2KjUsJGlucCkpOworCSAmcHhvcgkJKCRpbm91dDQsJHJuZGtleTApOworCSZsZWEJKCRpbnAsJkRXUCgxNio2LCRpbnApKTsKKwkmcHhvcgkoJGlub3V0MCwmUVdQKDE2KjAsImVzcCIpKTsJIyBpbnB1dF49dHdlYWsKKwkmbW92ZHFhCSgmUVdQKDE2KiRpLCJlc3AiKSwkaW5vdXQ1KTsJIyBzYXZlIGxhc3QgdHdlYWsKKwkmcHhvcgkoJGlub3V0NSwkcm5ka2V5MSk7CisKKwkgJiRtb3Zla2V5CSgkcm5ka2V5MSwmUVdQKDE2LCRrZXlfKSk7CisJICZsZWEJCSgka2V5LCZEV1AoMzIsJGtleV8pKTsKKwkmcHhvcgkoJGlub3V0MSwmUVdQKDE2KjEsImVzcCIpKTsKKwkgJmFlc2RlYwkoJGlub3V0MCwkcm5ka2V5MSk7CisJJnB4b3IJKCRpbm91dDIsJlFXUCgxNioyLCJlc3AiKSk7CisJICZhZXNkZWMJKCRpbm91dDEsJHJuZGtleTEpOworCSZweG9yCSgkaW5vdXQzLCZRV1AoMTYqMywiZXNwIikpOworCSAmZGVjCQkoJHJvdW5kcyk7CisJICZhZXNkZWMJKCRpbm91dDIsJHJuZGtleTEpOworCSZweG9yCSgkaW5vdXQ0LCZRV1AoMTYqNCwiZXNwIikpOworCSAmYWVzZGVjCSgkaW5vdXQzLCRybmRrZXkxKTsKKwkmcHhvcgkJKCRpbm91dDUsJHJuZGtleTApOworCSAmYWVzZGVjCSgkaW5vdXQ0LCRybmRrZXkxKTsKKwkgJiRtb3Zla2V5CSgkcm5ka2V5MCwmUVdQKDAsJGtleSkpOworCSAmYWVzZGVjCSgkaW5vdXQ1LCRybmRrZXkxKTsKKwkmY2FsbAkJKCZsYWJlbCgiX2Flc25pX2RlY3J5cHQ2X2VudGVyIikpOworCisJJm1vdmRxYQkoJHR3ZWFrLCZRV1AoMTYqNSwiZXNwIikpOwkjIGxhc3QgdHdlYWsKKyAgICAgICAmcHhvcgkoJHR3dG1wLCR0d3RtcCk7CisJJnhvcnBzCSgkaW5vdXQwLCZRV1AoMTYqMCwiZXNwIikpOwkjIG91dHB1dF49dHdlYWsKKyAgICAgICAmcGNtcGd0ZAkoJHR3dG1wLCR0d2Vhayk7CQkjIGJyb2FkY2FzdCB1cHBlciBiaXRzCisJJnhvcnBzCSgkaW5vdXQxLCZRV1AoMTYqMSwiZXNwIikpOworCSZtb3Z1cHMJKCZRV1AoMTYqMCwkb3V0KSwkaW5vdXQwKTsJIyB3cml0ZSBvdXRwdXQKKwkmeG9ycHMJKCRpbm91dDIsJlFXUCgxNioyLCJlc3AiKSk7CisJJm1vdnVwcwkoJlFXUCgxNioxLCRvdXQpLCRpbm91dDEpOworCSZ4b3JwcwkoJGlub3V0MywmUVdQKDE2KjMsImVzcCIpKTsKKwkmbW92dXBzCSgmUVdQKDE2KjIsJG91dCksJGlub3V0Mik7CisJJnhvcnBzCSgkaW5vdXQ0LCZRV1AoMTYqNCwiZXNwIikpOworCSZtb3Z1cHMJKCZRV1AoMTYqMywkb3V0KSwkaW5vdXQzKTsKKwkmeG9ycHMJKCRpbm91dDUsJHR3ZWFrKTsKKwkmbW92dXBzCSgmUVdQKDE2KjQsJG91dCksJGlub3V0NCk7CisgICAgICAgJnBzaHVmZAkoJHR3cmVzLCR0d3RtcCwweDEzKTsKKwkmbW92dXBzCSgmUVdQKDE2KjUsJG91dCksJGlub3V0NSk7CisJJmxlYQkoJG91dCwmRFdQKDE2KjYsJG91dCkpOworICAgICAgICZtb3ZkcWEJKCR0d21hc2ssJlFXUCgxNio2LCJlc3AiKSk7CSMgMHgwLi4uMDEwLi4uODcKKworCSZweG9yCSgkdHd0bXAsJHR3dG1wKTsKKwkmcGFkZHEJKCR0d2VhaywkdHdlYWspOwkJIyAmcHNsbHEoJHR3ZWFrLDEpOworCSZwYW5kCSgkdHdyZXMsJHR3bWFzayk7CQkjIGlzb2xhdGUgY2FycnkgYW5kIHJlc2lkdWUKKwkmcGNtcGd0ZCgkdHd0bXAsJHR3ZWFrKTsJCSMgYnJvYWRjYXN0IHVwcGVyIGJpdHMKKwkmbW92CSgkcm91bmRzLCRyb3VuZHNfKTsJCSMgcmVzdG9yZSAkcm91bmRzCisJJnB4b3IJKCR0d2VhaywkdHdyZXMpOworCisJJnN1YgkoJGxlbiwxNio2KTsKKwkmam5jCSgmbGFiZWwoInh0c19kZWNfbG9vcDYiKSk7CisKKwkmbGVhCSgkcm91bmRzLCZEV1AoMSwiIiwkcm91bmRzLDIpKTsJIyByZXN0b3JlICRyb3VuZHMKKwkmbW92CSgka2V5LCRrZXlfKTsJCQkjIHJlc3RvcmUgJGtleQorCSZtb3YJKCRyb3VuZHNfLCRyb3VuZHMpOworCismc2V0X2xhYmVsKCJ4dHNfZGVjX3Nob3J0Iik7CisJJmFkZAkoJGxlbiwxNio2KTsKKwkmanoJKCZsYWJlbCgieHRzX2RlY19kb25lNngiKSk7CisKKwkmbW92ZHFhCSgkaW5vdXQzLCR0d2Vhayk7CQkjIHB1dCBhc2lkZSBwcmV2aW91cyB0d2VhaworCSZjbXAJKCRsZW4sMHgyMCk7CisJJmpiCSgmbGFiZWwoInh0c19kZWNfb25lIikpOworCisJJnBzaHVmZAkoJHR3cmVzLCR0d3RtcCwweDEzKTsKKwkmcHhvcgkoJHR3dG1wLCR0d3RtcCk7CisJJnBhZGRxCSgkdHdlYWssJHR3ZWFrKTsJCSMgJnBzbGxxKCR0d2VhaywxKTsKKwkmcGFuZAkoJHR3cmVzLCR0d21hc2spOwkJIyBpc29sYXRlIGNhcnJ5IGFuZCByZXNpZHVlCisJJnBjbXBndGQoJHR3dG1wLCR0d2Vhayk7CQkjIGJyb2FkY2FzdCB1cHBlciBiaXRzCisJJnB4b3IJKCR0d2VhaywkdHdyZXMpOworCSZqZQkoJmxhYmVsKCJ4dHNfZGVjX3R3byIpKTsKKworCSZwc2h1ZmQJKCR0d3JlcywkdHd0bXAsMHgxMyk7CisJJnB4b3IJKCR0d3RtcCwkdHd0bXApOworCSZtb3ZkcWEJKCRpbm91dDQsJHR3ZWFrKTsJCSMgcHV0IGFzaWRlIHByZXZpb3VzIHR3ZWFrCisJJnBhZGRxCSgkdHdlYWssJHR3ZWFrKTsJCSMgJnBzbGxxKCR0d2VhaywxKTsKKwkmcGFuZAkoJHR3cmVzLCR0d21hc2spOwkJIyBpc29sYXRlIGNhcnJ5IGFuZCByZXNpZHVlCisJJnBjbXBndGQoJHR3dG1wLCR0d2Vhayk7CQkjIGJyb2FkY2FzdCB1cHBlciBiaXRzCisJJnB4b3IJKCR0d2VhaywkdHdyZXMpOworCSZjbXAJKCRsZW4sMHg0MCk7CisJJmpiCSgmbGFiZWwoInh0c19kZWNfdGhyZWUiKSk7CisKKwkmcHNodWZkCSgkdHdyZXMsJHR3dG1wLDB4MTMpOworCSZweG9yCSgkdHd0bXAsJHR3dG1wKTsKKwkmbW92ZHFhCSgkaW5vdXQ1LCR0d2Vhayk7CQkjIHB1dCBhc2lkZSBwcmV2aW91cyB0d2VhaworCSZwYWRkcQkoJHR3ZWFrLCR0d2Vhayk7CQkjICZwc2xscSgkdHdlYWssMSk7CisJJnBhbmQJKCR0d3JlcywkdHdtYXNrKTsJCSMgaXNvbGF0ZSBjYXJyeSBhbmQgcmVzaWR1ZQorCSZwY21wZ3RkKCR0d3RtcCwkdHdlYWspOwkJIyBicm9hZGNhc3QgdXBwZXIgYml0cworCSZweG9yCSgkdHdlYWssJHR3cmVzKTsKKwkmbW92ZHFhCSgmUVdQKDE2KjAsImVzcCIpLCRpbm91dDMpOworCSZtb3ZkcWEJKCZRV1AoMTYqMSwiZXNwIiksJGlub3V0NCk7CisJJmplCSgmbGFiZWwoInh0c19kZWNfZm91ciIpKTsKKworCSZtb3ZkcWEJKCZRV1AoMTYqMiwiZXNwIiksJGlub3V0NSk7CisJJnBzaHVmZAkoJGlub3V0NSwkdHd0bXAsMHgxMyk7CisJJm1vdmRxYQkoJlFXUCgxNiozLCJlc3AiKSwkdHdlYWspOworCSZwYWRkcQkoJHR3ZWFrLCR0d2Vhayk7CQkjICZwc2xscSgkaW5vdXQwLDEpOworCSZwYW5kCSgkaW5vdXQ1LCR0d21hc2spOwkJIyBpc29sYXRlIGNhcnJ5IGFuZCByZXNpZHVlCisJJnB4b3IJKCRpbm91dDUsJHR3ZWFrKTsKKworCSZtb3ZkcXUJKCRpbm91dDAsJlFXUCgxNiowLCRpbnApKTsJIyBsb2FkIGlucHV0CisJJm1vdmRxdQkoJGlub3V0MSwmUVdQKDE2KjEsJGlucCkpOworCSZtb3ZkcXUJKCRpbm91dDIsJlFXUCgxNioyLCRpbnApKTsKKwkmcHhvcgkoJGlub3V0MCwmUVdQKDE2KjAsImVzcCIpKTsJIyBpbnB1dF49dHdlYWsKKwkmbW92ZHF1CSgkaW5vdXQzLCZRV1AoMTYqMywkaW5wKSk7CisJJnB4b3IJKCRpbm91dDEsJlFXUCgxNioxLCJlc3AiKSk7CisJJm1vdmRxdQkoJGlub3V0NCwmUVdQKDE2KjQsJGlucCkpOworCSZweG9yCSgkaW5vdXQyLCZRV1AoMTYqMiwiZXNwIikpOworCSZsZWEJKCRpbnAsJkRXUCgxNio1LCRpbnApKTsKKwkmcHhvcgkoJGlub3V0MywmUVdQKDE2KjMsImVzcCIpKTsKKwkmbW92ZHFhCSgmUVdQKDE2KjQsImVzcCIpLCRpbm91dDUpOwkjIHNhdmUgbGFzdCB0d2VhaworCSZweG9yCSgkaW5vdXQ0LCRpbm91dDUpOworCisJJmNhbGwJKCJfYWVzbmlfZGVjcnlwdDYiKTsKKworCSZtb3ZhcHMJKCR0d2VhaywmUVdQKDE2KjQsImVzcCIpKTsJIyBsYXN0IHR3ZWFrCisJJnhvcnBzCSgkaW5vdXQwLCZRV1AoMTYqMCwiZXNwIikpOwkjIG91dHB1dF49dHdlYWsKKwkmeG9ycHMJKCRpbm91dDEsJlFXUCgxNioxLCJlc3AiKSk7CisJJnhvcnBzCSgkaW5vdXQyLCZRV1AoMTYqMiwiZXNwIikpOworCSZtb3Z1cHMJKCZRV1AoMTYqMCwkb3V0KSwkaW5vdXQwKTsJIyB3cml0ZSBvdXRwdXQKKwkmeG9ycHMJKCRpbm91dDMsJlFXUCgxNiozLCJlc3AiKSk7CisJJm1vdnVwcwkoJlFXUCgxNioxLCRvdXQpLCRpbm91dDEpOworCSZ4b3JwcwkoJGlub3V0NCwkdHdlYWspOworCSZtb3Z1cHMJKCZRV1AoMTYqMiwkb3V0KSwkaW5vdXQyKTsKKwkmbW92dXBzCSgmUVdQKDE2KjMsJG91dCksJGlub3V0Myk7CisJJm1vdnVwcwkoJlFXUCgxNio0LCRvdXQpLCRpbm91dDQpOworCSZsZWEJKCRvdXQsJkRXUCgxNio1LCRvdXQpKTsKKwkmam1wCSgmbGFiZWwoInh0c19kZWNfZG9uZSIpKTsKKworJnNldF9sYWJlbCgieHRzX2RlY19vbmUiLDE2KTsKKwkmbW92dXBzCSgkaW5vdXQwLCZRV1AoMTYqMCwkaW5wKSk7CSMgbG9hZCBpbnB1dAorCSZsZWEJKCRpbnAsJkRXUCgxNioxLCRpbnApKTsKKwkmeG9ycHMJKCRpbm91dDAsJGlub3V0Myk7CQkjIGlucHV0Xj10d2VhaworCWlmICgkaW5saW5lKQorCXsgICAmYWVzbmlfaW5saW5lX2dlbmVyYXRlMSgiZGVjIik7CX0KKwllbHNlCisJeyAgICZjYWxsCSgiX2Flc25pX2RlY3J5cHQxIik7CX0KKwkmeG9ycHMJKCRpbm91dDAsJGlub3V0Myk7CQkjIG91dHB1dF49dHdlYWsKKwkmbW92dXBzCSgmUVdQKDE2KjAsJG91dCksJGlub3V0MCk7CSMgd3JpdGUgb3V0cHV0CisJJmxlYQkoJG91dCwmRFdQKDE2KjEsJG91dCkpOworCisJJm1vdmRxYQkoJHR3ZWFrLCRpbm91dDMpOwkJIyBsYXN0IHR3ZWFrCisJJmptcAkoJmxhYmVsKCJ4dHNfZGVjX2RvbmUiKSk7CisKKyZzZXRfbGFiZWwoInh0c19kZWNfdHdvIiwxNik7CisJJm1vdmFwcwkoJGlub3V0NCwkdHdlYWspOwkJIyBwdXQgYXNpZGUgbGFzdCB0d2VhaworCisJJm1vdnVwcwkoJGlub3V0MCwmUVdQKDE2KjAsJGlucCkpOwkjIGxvYWQgaW5wdXQKKwkmbW92dXBzCSgkaW5vdXQxLCZRV1AoMTYqMSwkaW5wKSk7CisJJmxlYQkoJGlucCwmRFdQKDE2KjIsJGlucCkpOworCSZ4b3JwcwkoJGlub3V0MCwkaW5vdXQzKTsJCSMgaW5wdXRePXR3ZWFrCisJJnhvcnBzCSgkaW5vdXQxLCRpbm91dDQpOworCisJJmNhbGwJKCJfYWVzbmlfZGVjcnlwdDMiKTsKKworCSZ4b3JwcwkoJGlub3V0MCwkaW5vdXQzKTsJCSMgb3V0cHV0Xj10d2VhaworCSZ4b3JwcwkoJGlub3V0MSwkaW5vdXQ0KTsKKwkmbW92dXBzCSgmUVdQKDE2KjAsJG91dCksJGlub3V0MCk7CSMgd3JpdGUgb3V0cHV0CisJJm1vdnVwcwkoJlFXUCgxNioxLCRvdXQpLCRpbm91dDEpOworCSZsZWEJKCRvdXQsJkRXUCgxNioyLCRvdXQpKTsKKworCSZtb3ZkcWEJKCR0d2VhaywkaW5vdXQ0KTsJCSMgbGFzdCB0d2VhaworCSZqbXAJKCZsYWJlbCgieHRzX2RlY19kb25lIikpOworCismc2V0X2xhYmVsKCJ4dHNfZGVjX3RocmVlIiwxNik7CisJJm1vdmFwcwkoJGlub3V0NSwkdHdlYWspOwkJIyBwdXQgYXNpZGUgbGFzdCB0d2VhaworCSZtb3Z1cHMJKCRpbm91dDAsJlFXUCgxNiowLCRpbnApKTsJIyBsb2FkIGlucHV0CisJJm1vdnVwcwkoJGlub3V0MSwmUVdQKDE2KjEsJGlucCkpOworCSZtb3Z1cHMJKCRpbm91dDIsJlFXUCgxNioyLCRpbnApKTsKKwkmbGVhCSgkaW5wLCZEV1AoMTYqMywkaW5wKSk7CisJJnhvcnBzCSgkaW5vdXQwLCRpbm91dDMpOwkJIyBpbnB1dF49dHdlYWsKKwkmeG9ycHMJKCRpbm91dDEsJGlub3V0NCk7CisJJnhvcnBzCSgkaW5vdXQyLCRpbm91dDUpOworCisJJmNhbGwJKCJfYWVzbmlfZGVjcnlwdDMiKTsKKworCSZ4b3JwcwkoJGlub3V0MCwkaW5vdXQzKTsJCSMgb3V0cHV0Xj10d2VhaworCSZ4b3JwcwkoJGlub3V0MSwkaW5vdXQ0KTsKKwkmeG9ycHMJKCRpbm91dDIsJGlub3V0NSk7CisJJm1vdnVwcwkoJlFXUCgxNiowLCRvdXQpLCRpbm91dDApOwkjIHdyaXRlIG91dHB1dAorCSZtb3Z1cHMJKCZRV1AoMTYqMSwkb3V0KSwkaW5vdXQxKTsKKwkmbW92dXBzCSgmUVdQKDE2KjIsJG91dCksJGlub3V0Mik7CisJJmxlYQkoJG91dCwmRFdQKDE2KjMsJG91dCkpOworCisJJm1vdmRxYQkoJHR3ZWFrLCRpbm91dDUpOwkJIyBsYXN0IHR3ZWFrCisJJmptcAkoJmxhYmVsKCJ4dHNfZGVjX2RvbmUiKSk7CisKKyZzZXRfbGFiZWwoInh0c19kZWNfZm91ciIsMTYpOworCSZtb3ZhcHMJKCRpbm91dDQsJHR3ZWFrKTsJCSMgcHV0IGFzaWRlIGxhc3QgdHdlYWsKKworCSZtb3Z1cHMJKCRpbm91dDAsJlFXUCgxNiowLCRpbnApKTsJIyBsb2FkIGlucHV0CisJJm1vdnVwcwkoJGlub3V0MSwmUVdQKDE2KjEsJGlucCkpOworCSZtb3Z1cHMJKCRpbm91dDIsJlFXUCgxNioyLCRpbnApKTsKKwkmeG9ycHMJKCRpbm91dDAsJlFXUCgxNiowLCJlc3AiKSk7CSMgaW5wdXRePXR3ZWFrCisJJm1vdnVwcwkoJGlub3V0MywmUVdQKDE2KjMsJGlucCkpOworCSZsZWEJKCRpbnAsJkRXUCgxNio0LCRpbnApKTsKKwkmeG9ycHMJKCRpbm91dDEsJlFXUCgxNioxLCJlc3AiKSk7CisJJnhvcnBzCSgkaW5vdXQyLCRpbm91dDUpOworCSZ4b3JwcwkoJGlub3V0MywkaW5vdXQ0KTsKKworCSZjYWxsCSgiX2Flc25pX2RlY3J5cHQ0Iik7CisKKwkmeG9ycHMJKCRpbm91dDAsJlFXUCgxNiowLCJlc3AiKSk7CSMgb3V0cHV0Xj10d2VhaworCSZ4b3JwcwkoJGlub3V0MSwmUVdQKDE2KjEsImVzcCIpKTsKKwkmeG9ycHMJKCRpbm91dDIsJGlub3V0NSk7CisJJm1vdnVwcwkoJlFXUCgxNiowLCRvdXQpLCRpbm91dDApOwkjIHdyaXRlIG91dHB1dAorCSZ4b3JwcwkoJGlub3V0MywkaW5vdXQ0KTsKKwkmbW92dXBzCSgmUVdQKDE2KjEsJG91dCksJGlub3V0MSk7CisJJm1vdnVwcwkoJlFXUCgxNioyLCRvdXQpLCRpbm91dDIpOworCSZtb3Z1cHMJKCZRV1AoMTYqMywkb3V0KSwkaW5vdXQzKTsKKwkmbGVhCSgkb3V0LCZEV1AoMTYqNCwkb3V0KSk7CisKKwkmbW92ZHFhCSgkdHdlYWssJGlub3V0NCk7CQkjIGxhc3QgdHdlYWsKKwkmam1wCSgmbGFiZWwoInh0c19kZWNfZG9uZSIpKTsKKworJnNldF9sYWJlbCgieHRzX2RlY19kb25lNngiLDE2KTsJCSMgJHR3ZWFrIGlzIHByZS1jYWxjdWxhdGVkCisJJm1vdgkoJGxlbiwmRFdQKDE2KjcrMCwiZXNwIikpOwkjIHJlc3RvcmUgb3JpZ2luYWwgJGxlbgorCSZhbmQJKCRsZW4sMTUpOworCSZqegkoJmxhYmVsKCJ4dHNfZGVjX3JldCIpKTsKKwkmbW92CSgmRFdQKDE2KjcrMCwiZXNwIiksJGxlbik7CSMgc2F2ZSAkbGVuJTE2CisJJmptcAkoJmxhYmVsKCJ4dHNfZGVjX29ubHlfb25lX21vcmUiKSk7CisKKyZzZXRfbGFiZWwoInh0c19kZWNfZG9uZSIsMTYpOworCSZtb3YJKCRsZW4sJkRXUCgxNio3KzAsImVzcCIpKTsJIyByZXN0b3JlIG9yaWdpbmFsICRsZW4KKwkmcHhvcgkoJHR3dG1wLCR0d3RtcCk7CisJJmFuZAkoJGxlbiwxNSk7CisJJmp6CSgmbGFiZWwoInh0c19kZWNfcmV0IikpOworCisJJnBjbXBndGQoJHR3dG1wLCR0d2Vhayk7CQkjIGJyb2FkY2FzdCB1cHBlciBiaXRzCisJJm1vdgkoJkRXUCgxNio3KzAsImVzcCIpLCRsZW4pOwkjIHNhdmUgJGxlbiUxNgorCSZwc2h1ZmQJKCR0d3JlcywkdHd0bXAsMHgxMyk7CisJJnB4b3IJKCR0d3RtcCwkdHd0bXApOworCSZtb3ZkcWEJKCR0d21hc2ssJlFXUCgxNio2LCJlc3AiKSk7CisJJnBhZGRxCSgkdHdlYWssJHR3ZWFrKTsJCSMgJnBzbGxxKCR0d2VhaywxKTsKKwkmcGFuZAkoJHR3cmVzLCR0d21hc2spOwkJIyBpc29sYXRlIGNhcnJ5IGFuZCByZXNpZHVlCisJJnBjbXBndGQoJHR3dG1wLCR0d2Vhayk7CQkjIGJyb2FkY2FzdCB1cHBlciBiaXRzCisJJnB4b3IJKCR0d2VhaywkdHdyZXMpOworCismc2V0X2xhYmVsKCJ4dHNfZGVjX29ubHlfb25lX21vcmUiKTsKKwkmcHNodWZkCSgkaW5vdXQzLCR0d3RtcCwweDEzKTsKKwkmbW92ZHFhCSgkaW5vdXQ0LCR0d2Vhayk7CQkjIHB1dCBhc2lkZSBwcmV2aW91cyB0d2VhaworCSZwYWRkcQkoJHR3ZWFrLCR0d2Vhayk7CQkjICZwc2xscSgkdHdlYWssMSk7CisJJnBhbmQJKCRpbm91dDMsJHR3bWFzayk7CQkjIGlzb2xhdGUgY2FycnkgYW5kIHJlc2lkdWUKKwkmcHhvcgkoJGlub3V0MywkdHdlYWspOworCisJJm1vdgkoJGtleSwka2V5Xyk7CQkJIyByZXN0b3JlICRrZXkKKwkmbW92CSgkcm91bmRzLCRyb3VuZHNfKTsJCSMgcmVzdG9yZSAkcm91bmRzCisKKwkmbW92dXBzCSgkaW5vdXQwLCZRV1AoMCwkaW5wKSk7CQkjIGxvYWQgaW5wdXQKKwkmeG9ycHMJKCRpbm91dDAsJGlub3V0Myk7CQkjIGlucHV0Xj10d2VhaworCWlmICgkaW5saW5lKQorCXsgICAmYWVzbmlfaW5saW5lX2dlbmVyYXRlMSgiZGVjIik7CX0KKwllbHNlCisJeyAgICZjYWxsCSgiX2Flc25pX2RlY3J5cHQxIik7CX0KKwkmeG9ycHMJKCRpbm91dDAsJGlub3V0Myk7CQkjIG91dHB1dF49dHdlYWsKKwkmbW92dXBzCSgmUVdQKDAsJG91dCksJGlub3V0MCk7CQkjIHdyaXRlIG91dHB1dAorCismc2V0X2xhYmVsKCJ4dHNfZGVjX3N0ZWFsIik7CisJJm1vdnoJKCRyb3VuZHMsJkJQKDE2LCRpbnApKTsKKwkmbW92egkoJGtleSwmQlAoMCwkb3V0KSk7CisJJmxlYQkoJGlucCwmRFdQKDEsJGlucCkpOworCSZtb3YJKCZCUCgwLCRvdXQpLCZMQigkcm91bmRzKSk7CisJJm1vdgkoJkJQKDE2LCRvdXQpLCZMQigka2V5KSk7CisJJmxlYQkoJG91dCwmRFdQKDEsJG91dCkpOworCSZzdWIJKCRsZW4sMSk7CisJJmpuegkoJmxhYmVsKCJ4dHNfZGVjX3N0ZWFsIikpOworCisJJnN1YgkoJG91dCwmRFdQKDE2KjcrMCwiZXNwIikpOwkjIHJld2luZCAkb3V0CisJJm1vdgkoJGtleSwka2V5Xyk7CQkJIyByZXN0b3JlICRrZXkKKwkmbW92CSgkcm91bmRzLCRyb3VuZHNfKTsJCSMgcmVzdG9yZSAkcm91bmRzCisKKwkmbW92dXBzCSgkaW5vdXQwLCZRV1AoMCwkb3V0KSk7CQkjIGxvYWQgaW5wdXQKKwkmeG9ycHMJKCRpbm91dDAsJGlub3V0NCk7CQkjIGlucHV0Xj10d2VhaworCWlmICgkaW5saW5lKQorCXsgICAmYWVzbmlfaW5saW5lX2dlbmVyYXRlMSgiZGVjIik7CX0KKwllbHNlCisJeyAgICZjYWxsCSgiX2Flc25pX2RlY3J5cHQxIik7CX0KKwkmeG9ycHMJKCRpbm91dDAsJGlub3V0NCk7CQkjIG91dHB1dF49dHdlYWsKKwkmbW92dXBzCSgmUVdQKDAsJG91dCksJGlub3V0MCk7CQkjIHdyaXRlIG91dHB1dAorCismc2V0X2xhYmVsKCJ4dHNfZGVjX3JldCIpOworCSZtb3YJKCJlc3AiLCZEV1AoMTYqNys0LCJlc3AiKSk7CSMgcmVzdG9yZSAlZXNwCismZnVuY3Rpb25fZW5kKCJhZXNuaV94dHNfZGVjcnlwdCIpOworfQorfQorDAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyB2b2lkICRQUkVGSVhfY2JjX2VuY3J5cHQgKGNvbnN0IHZvaWQgKmlucCwgdm9pZCAqb3V0LAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgsIGNvbnN0IEFFU19LRVkgKmtleSwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICppdnAsY29uc3QgaW50IGVuYyk7CismZnVuY3Rpb25fYmVnaW4oIiR7UFJFRklYfV9jYmNfZW5jcnlwdCIpOworCSZtb3YJKCRpbnAsJndwYXJhbSgwKSk7CisJJm1vdgkoJHJvdW5kc18sImVzcCIpOworCSZtb3YJKCRvdXQsJndwYXJhbSgxKSk7CisJJnN1YgkoJHJvdW5kc18sMjQpOworCSZtb3YJKCRsZW4sJndwYXJhbSgyKSk7CisJJmFuZAkoJHJvdW5kc18sLTE2KTsKKwkmbW92CSgka2V5LCZ3cGFyYW0oMykpOworCSZtb3YJKCRrZXlfLCZ3cGFyYW0oNCkpOworCSZ0ZXN0CSgkbGVuLCRsZW4pOworCSZqegkoJmxhYmVsKCJjYmNfYWJvcnQiKSk7CisKKwkmY21wCSgmd3BhcmFtKDUpLDApOworCSZ4Y2hnCSgkcm91bmRzXywiZXNwIik7CQkjIGFsbG9jYQorCSZtb3Z1cHMJKCRpdmVjLCZRV1AoMCwka2V5XykpOwkJIyBsb2FkIElWCisJJm1vdgkoJHJvdW5kcywmRFdQKDI0MCwka2V5KSk7CisJJm1vdgkoJGtleV8sJGtleSk7CQkJIyBiYWNrdXAgJGtleQorCSZtb3YJKCZEV1AoMTYsImVzcCIpLCRyb3VuZHNfKTsJIyBzYXZlIG9yaWdpbmFsICVlc3AKKwkmbW92CSgkcm91bmRzXywkcm91bmRzKTsJCSMgYmFja3VwICRyb3VuZHMKKwkmamUJKCZsYWJlbCgiY2JjX2RlY3J5cHQiKSk7CisKKwkmbW92YXBzCSgkaW5vdXQwLCRpdmVjKTsKKwkmY21wCSgkbGVuLDE2KTsKKwkmamIJKCZsYWJlbCgiY2JjX2VuY190YWlsIikpOworCSZzdWIJKCRsZW4sMTYpOworCSZqbXAJKCZsYWJlbCgiY2JjX2VuY19sb29wIikpOworCismc2V0X2xhYmVsKCJjYmNfZW5jX2xvb3AiLDE2KTsKKwkmbW92dXBzCSgkaXZlYywmUVdQKDAsJGlucCkpOwkJIyBpbnB1dCBhY3R1YWxseQorCSZsZWEJKCRpbnAsJkRXUCgxNiwkaW5wKSk7CisJaWYgKCRpbmxpbmUpCisJeyAgICZhZXNuaV9pbmxpbmVfZ2VuZXJhdGUxKCJlbmMiLCRpbm91dDAsJGl2ZWMpOwl9CisJZWxzZQorCXsgICAmeG9ycHMoJGlub3V0MCwkaXZlYyk7ICZjYWxsKCJfYWVzbmlfZW5jcnlwdDEiKTsJfQorCSZtb3YJKCRyb3VuZHMsJHJvdW5kc18pOwkjIHJlc3RvcmUgJHJvdW5kcworCSZtb3YJKCRrZXksJGtleV8pOwkJIyByZXN0b3JlICRrZXkKKwkmbW92dXBzCSgmUVdQKDAsJG91dCksJGlub3V0MCk7CSMgc3RvcmUgb3V0cHV0CisJJmxlYQkoJG91dCwmRFdQKDE2LCRvdXQpKTsKKwkmc3ViCSgkbGVuLDE2KTsKKwkmam5jCSgmbGFiZWwoImNiY19lbmNfbG9vcCIpKTsKKwkmYWRkCSgkbGVuLDE2KTsKKwkmam56CSgmbGFiZWwoImNiY19lbmNfdGFpbCIpKTsKKwkmbW92YXBzCSgkaXZlYywkaW5vdXQwKTsKKwkmam1wCSgmbGFiZWwoImNiY19yZXQiKSk7CisKKyZzZXRfbGFiZWwoImNiY19lbmNfdGFpbCIpOworCSZtb3YJKCJlY3giLCRsZW4pOwkJIyB6YXBzICRyb3VuZHMKKwkmZGF0YV93b3JkKDB4QTRGM0Y2ODkpOwkJIyByZXAgbW92c2IKKwkmbW92CSgiZWN4IiwxNik7CQkjIHplcm8gdGFpbAorCSZzdWIJKCJlY3giLCRsZW4pOworCSZ4b3IJKCJlYXgiLCJlYXgiKTsJCSMgemFwcyAkbGVuCisJJmRhdGFfd29yZCgweEFBRjNGNjg5KTsJCSMgcmVwIHN0b3NiCisJJmxlYQkoJG91dCwmRFdQKC0xNiwkb3V0KSk7CSMgcmV3aW5kICRvdXQgYnkgMSBibG9jaworCSZtb3YJKCRyb3VuZHMsJHJvdW5kc18pOwkjIHJlc3RvcmUgJHJvdW5kcworCSZtb3YJKCRpbnAsJG91dCk7CQkjICRpbnAgYW5kICRvdXQgYXJlIHRoZSBzYW1lCisJJm1vdgkoJGtleSwka2V5Xyk7CQkjIHJlc3RvcmUgJGtleQorCSZqbXAJKCZsYWJlbCgiY2JjX2VuY19sb29wIikpOworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworJnNldF9sYWJlbCgiY2JjX2RlY3J5cHQiLDE2KTsKKwkmY21wCSgkbGVuLDB4NTApOworCSZqYmUJKCZsYWJlbCgiY2JjX2RlY190YWlsIikpOworCSZtb3ZhcHMJKCZRV1AoMCwiZXNwIiksJGl2ZWMpOwkJIyBzYXZlIElWCisJJnN1YgkoJGxlbiwweDUwKTsKKwkmam1wCSgmbGFiZWwoImNiY19kZWNfbG9vcDZfZW50ZXIiKSk7CisKKyZzZXRfbGFiZWwoImNiY19kZWNfbG9vcDYiLDE2KTsKKwkmbW92YXBzCSgmUVdQKDAsImVzcCIpLCRybmRrZXkwKTsJIyBzYXZlIElWCisJJm1vdnVwcwkoJlFXUCgwLCRvdXQpLCRpbm91dDUpOworCSZsZWEJKCRvdXQsJkRXUCgweDEwLCRvdXQpKTsKKyZzZXRfbGFiZWwoImNiY19kZWNfbG9vcDZfZW50ZXIiKTsKKwkmbW92ZHF1CSgkaW5vdXQwLCZRV1AoMCwkaW5wKSk7CisJJm1vdmRxdQkoJGlub3V0MSwmUVdQKDB4MTAsJGlucCkpOworCSZtb3ZkcXUJKCRpbm91dDIsJlFXUCgweDIwLCRpbnApKTsKKwkmbW92ZHF1CSgkaW5vdXQzLCZRV1AoMHgzMCwkaW5wKSk7CisJJm1vdmRxdQkoJGlub3V0NCwmUVdQKDB4NDAsJGlucCkpOworCSZtb3ZkcXUJKCRpbm91dDUsJlFXUCgweDUwLCRpbnApKTsKKworCSZjYWxsCSgiX2Flc25pX2RlY3J5cHQ2Iik7CisKKwkmbW92dXBzCSgkcm5ka2V5MSwmUVdQKDAsJGlucCkpOworCSZtb3Z1cHMJKCRybmRrZXkwLCZRV1AoMHgxMCwkaW5wKSk7CisJJnhvcnBzCSgkaW5vdXQwLCZRV1AoMCwiZXNwIikpOwkjIF49SVYKKwkmeG9ycHMJKCRpbm91dDEsJHJuZGtleTEpOworCSZtb3Z1cHMJKCRybmRrZXkxLCZRV1AoMHgyMCwkaW5wKSk7CisJJnhvcnBzCSgkaW5vdXQyLCRybmRrZXkwKTsKKwkmbW92dXBzCSgkcm5ka2V5MCwmUVdQKDB4MzAsJGlucCkpOworCSZ4b3JwcwkoJGlub3V0Mywkcm5ka2V5MSk7CisJJm1vdnVwcwkoJHJuZGtleTEsJlFXUCgweDQwLCRpbnApKTsKKwkmeG9ycHMJKCRpbm91dDQsJHJuZGtleTApOworCSZtb3Z1cHMJKCRybmRrZXkwLCZRV1AoMHg1MCwkaW5wKSk7CSMgSVYKKwkmeG9ycHMJKCRpbm91dDUsJHJuZGtleTEpOworCSZtb3Z1cHMJKCZRV1AoMCwkb3V0KSwkaW5vdXQwKTsKKwkmbW92dXBzCSgmUVdQKDB4MTAsJG91dCksJGlub3V0MSk7CisJJmxlYQkoJGlucCwmRFdQKDB4NjAsJGlucCkpOworCSZtb3Z1cHMJKCZRV1AoMHgyMCwkb3V0KSwkaW5vdXQyKTsKKwkmbW92CSgkcm91bmRzLCRyb3VuZHNfKQkJIyByZXN0b3JlICRyb3VuZHMKKwkmbW92dXBzCSgmUVdQKDB4MzAsJG91dCksJGlub3V0Myk7CisJJm1vdgkoJGtleSwka2V5Xyk7CQkJIyByZXN0b3JlICRrZXkKKwkmbW92dXBzCSgmUVdQKDB4NDAsJG91dCksJGlub3V0NCk7CisJJmxlYQkoJG91dCwmRFdQKDB4NTAsJG91dCkpOworCSZzdWIJKCRsZW4sMHg2MCk7CisJJmphCSgmbGFiZWwoImNiY19kZWNfbG9vcDYiKSk7CisKKwkmbW92YXBzCSgkaW5vdXQwLCRpbm91dDUpOworCSZtb3ZhcHMJKCRpdmVjLCRybmRrZXkwKTsKKwkmYWRkCSgkbGVuLDB4NTApOworCSZqbGUJKCZsYWJlbCgiY2JjX2RlY190YWlsX2NvbGxlY3RlZCIpKTsKKwkmbW92dXBzCSgmUVdQKDAsJG91dCksJGlub3V0MCk7CisJJmxlYQkoJG91dCwmRFdQKDB4MTAsJG91dCkpOworJnNldF9sYWJlbCgiY2JjX2RlY190YWlsIik7CisJJm1vdnVwcwkoJGlub3V0MCwmUVdQKDAsJGlucCkpOworCSZtb3ZhcHMJKCRpbjAsJGlub3V0MCk7CisJJmNtcAkoJGxlbiwweDEwKTsKKwkmamJlCSgmbGFiZWwoImNiY19kZWNfb25lIikpOworCisJJm1vdnVwcwkoJGlub3V0MSwmUVdQKDB4MTAsJGlucCkpOworCSZtb3ZhcHMJKCRpbjEsJGlub3V0MSk7CisJJmNtcAkoJGxlbiwweDIwKTsKKwkmamJlCSgmbGFiZWwoImNiY19kZWNfdHdvIikpOworCisJJm1vdnVwcwkoJGlub3V0MiwmUVdQKDB4MjAsJGlucCkpOworCSZjbXAJKCRsZW4sMHgzMCk7CisJJmpiZQkoJmxhYmVsKCJjYmNfZGVjX3RocmVlIikpOworCisJJm1vdnVwcwkoJGlub3V0MywmUVdQKDB4MzAsJGlucCkpOworCSZjbXAJKCRsZW4sMHg0MCk7CisJJmpiZQkoJmxhYmVsKCJjYmNfZGVjX2ZvdXIiKSk7CisKKwkmbW92dXBzCSgkaW5vdXQ0LCZRV1AoMHg0MCwkaW5wKSk7CisJJm1vdmFwcwkoJlFXUCgwLCJlc3AiKSwkaXZlYyk7CQkjIHNhdmUgSVYKKwkmbW92dXBzCSgkaW5vdXQwLCZRV1AoMCwkaW5wKSk7CisJJnhvcnBzCSgkaW5vdXQ1LCRpbm91dDUpOworCSZjYWxsCSgiX2Flc25pX2RlY3J5cHQ2Iik7CisJJm1vdnVwcwkoJHJuZGtleTEsJlFXUCgwLCRpbnApKTsKKwkmbW92dXBzCSgkcm5ka2V5MCwmUVdQKDB4MTAsJGlucCkpOworCSZ4b3JwcwkoJGlub3V0MCwmUVdQKDAsImVzcCIpKTsJIyBePSBJVgorCSZ4b3JwcwkoJGlub3V0MSwkcm5ka2V5MSk7CisJJm1vdnVwcwkoJHJuZGtleTEsJlFXUCgweDIwLCRpbnApKTsKKwkmeG9ycHMJKCRpbm91dDIsJHJuZGtleTApOworCSZtb3Z1cHMJKCRybmRrZXkwLCZRV1AoMHgzMCwkaW5wKSk7CisJJnhvcnBzCSgkaW5vdXQzLCRybmRrZXkxKTsKKwkmbW92dXBzCSgkaXZlYywmUVdQKDB4NDAsJGlucCkpOwkjIElWCisJJnhvcnBzCSgkaW5vdXQ0LCRybmRrZXkwKTsKKwkmbW92dXBzCSgmUVdQKDAsJG91dCksJGlub3V0MCk7CisJJm1vdnVwcwkoJlFXUCgweDEwLCRvdXQpLCRpbm91dDEpOworCSZtb3Z1cHMJKCZRV1AoMHgyMCwkb3V0KSwkaW5vdXQyKTsKKwkmbW92dXBzCSgmUVdQKDB4MzAsJG91dCksJGlub3V0Myk7CisJJmxlYQkoJG91dCwmRFdQKDB4NDAsJG91dCkpOworCSZtb3ZhcHMJKCRpbm91dDAsJGlub3V0NCk7CisJJnN1YgkoJGxlbiwweDUwKTsKKwkmam1wCSgmbGFiZWwoImNiY19kZWNfdGFpbF9jb2xsZWN0ZWQiKSk7CisKKyZzZXRfbGFiZWwoImNiY19kZWNfb25lIiwxNik7CisJaWYgKCRpbmxpbmUpCisJeyAgICZhZXNuaV9pbmxpbmVfZ2VuZXJhdGUxKCJkZWMiKTsJfQorCWVsc2UKKwl7ICAgJmNhbGwJKCJfYWVzbmlfZGVjcnlwdDEiKTsJfQorCSZ4b3JwcwkoJGlub3V0MCwkaXZlYyk7CisJJm1vdmFwcwkoJGl2ZWMsJGluMCk7CisJJnN1YgkoJGxlbiwweDEwKTsKKwkmam1wCSgmbGFiZWwoImNiY19kZWNfdGFpbF9jb2xsZWN0ZWQiKSk7CisKKyZzZXRfbGFiZWwoImNiY19kZWNfdHdvIiwxNik7CisJJnhvcnBzCSgkaW5vdXQyLCRpbm91dDIpOworCSZjYWxsCSgiX2Flc25pX2RlY3J5cHQzIik7CisJJnhvcnBzCSgkaW5vdXQwLCRpdmVjKTsKKwkmeG9ycHMJKCRpbm91dDEsJGluMCk7CisJJm1vdnVwcwkoJlFXUCgwLCRvdXQpLCRpbm91dDApOworCSZtb3ZhcHMJKCRpbm91dDAsJGlub3V0MSk7CisJJmxlYQkoJG91dCwmRFdQKDB4MTAsJG91dCkpOworCSZtb3ZhcHMJKCRpdmVjLCRpbjEpOworCSZzdWIJKCRsZW4sMHgyMCk7CisJJmptcAkoJmxhYmVsKCJjYmNfZGVjX3RhaWxfY29sbGVjdGVkIikpOworCismc2V0X2xhYmVsKCJjYmNfZGVjX3RocmVlIiwxNik7CisJJmNhbGwJKCJfYWVzbmlfZGVjcnlwdDMiKTsKKwkmeG9ycHMJKCRpbm91dDAsJGl2ZWMpOworCSZ4b3JwcwkoJGlub3V0MSwkaW4wKTsKKwkmeG9ycHMJKCRpbm91dDIsJGluMSk7CisJJm1vdnVwcwkoJlFXUCgwLCRvdXQpLCRpbm91dDApOworCSZtb3ZhcHMJKCRpbm91dDAsJGlub3V0Mik7CisJJm1vdnVwcwkoJlFXUCgweDEwLCRvdXQpLCRpbm91dDEpOworCSZsZWEJKCRvdXQsJkRXUCgweDIwLCRvdXQpKTsKKwkmbW92dXBzCSgkaXZlYywmUVdQKDB4MjAsJGlucCkpOworCSZzdWIJKCRsZW4sMHgzMCk7CisJJmptcAkoJmxhYmVsKCJjYmNfZGVjX3RhaWxfY29sbGVjdGVkIikpOworCismc2V0X2xhYmVsKCJjYmNfZGVjX2ZvdXIiLDE2KTsKKwkmY2FsbAkoIl9hZXNuaV9kZWNyeXB0NCIpOworCSZtb3Z1cHMJKCRybmRrZXkxLCZRV1AoMHgxMCwkaW5wKSk7CisJJm1vdnVwcwkoJHJuZGtleTAsJlFXUCgweDIwLCRpbnApKTsKKwkmeG9ycHMJKCRpbm91dDAsJGl2ZWMpOworCSZtb3Z1cHMJKCRpdmVjLCZRV1AoMHgzMCwkaW5wKSk7CisJJnhvcnBzCSgkaW5vdXQxLCRpbjApOworCSZtb3Z1cHMJKCZRV1AoMCwkb3V0KSwkaW5vdXQwKTsKKwkmeG9ycHMJKCRpbm91dDIsJHJuZGtleTEpOworCSZtb3Z1cHMJKCZRV1AoMHgxMCwkb3V0KSwkaW5vdXQxKTsKKwkmeG9ycHMJKCRpbm91dDMsJHJuZGtleTApOworCSZtb3Z1cHMJKCZRV1AoMHgyMCwkb3V0KSwkaW5vdXQyKTsKKwkmbGVhCSgkb3V0LCZEV1AoMHgzMCwkb3V0KSk7CisJJm1vdmFwcwkoJGlub3V0MCwkaW5vdXQzKTsKKwkmc3ViCSgkbGVuLDB4NDApOworCismc2V0X2xhYmVsKCJjYmNfZGVjX3RhaWxfY29sbGVjdGVkIik7CisJJmFuZAkoJGxlbiwxNSk7CisJJmpuegkoJmxhYmVsKCJjYmNfZGVjX3RhaWxfcGFydGlhbCIpKTsKKwkmbW92dXBzCSgmUVdQKDAsJG91dCksJGlub3V0MCk7CisJJmptcAkoJmxhYmVsKCJjYmNfcmV0IikpOworCismc2V0X2xhYmVsKCJjYmNfZGVjX3RhaWxfcGFydGlhbCIsMTYpOworCSZtb3ZhcHMJKCZRV1AoMCwiZXNwIiksJGlub3V0MCk7CisJJm1vdgkoImVjeCIsMTYpOworCSZtb3YJKCRpbnAsImVzcCIpOworCSZzdWIJKCJlY3giLCRsZW4pOworCSZkYXRhX3dvcmQoMHhBNEYzRjY4OSk7CQkjIHJlcCBtb3ZzYgorCismc2V0X2xhYmVsKCJjYmNfcmV0Iik7CisJJm1vdgkoImVzcCIsJkRXUCgxNiwiZXNwIikpOwkjIHB1bGwgb3JpZ2luYWwgJWVzcAorCSZtb3YJKCRrZXlfLCZ3cGFyYW0oNCkpOworCSZtb3Z1cHMJKCZRV1AoMCwka2V5XyksJGl2ZWMpOwkjIG91dHB1dCBJVgorJnNldF9sYWJlbCgiY2JjX2Fib3J0Iik7CismZnVuY3Rpb25fZW5kKCIke1BSRUZJWH1fY2JjX2VuY3J5cHQiKTsKKwwKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTWVjaGFuaWNhbCBwb3J0IGZyb20gYWVzbmkteDg2XzY0LnBsLgorIworIyBfYWVzbmlfc2V0X2VuY3J5cHRfa2V5IGlzIHByaXZhdGUgaW50ZXJmYWNlLAorIyBpbnB1dDoKKyMJImVheCIJY29uc3QgdW5zaWduZWQgY2hhciAqdXNlcktleQorIwkkcm91bmRzCWludCBiaXRzCisjCSRrZXkJQUVTX0tFWSAqa2V5CisjIG91dHB1dDoKKyMJImVheCIJcmV0dXJuIGNvZGUKKyMJJHJvdW5kCXJvdW5kcworCismZnVuY3Rpb25fYmVnaW5fQigiX2Flc25pX3NldF9lbmNyeXB0X2tleSIpOworCSZ0ZXN0CSgiZWF4IiwiZWF4Iik7CisJJmp6CSgmbGFiZWwoImJhZF9wb2ludGVyIikpOworCSZ0ZXN0CSgka2V5LCRrZXkpOworCSZqegkoJmxhYmVsKCJiYWRfcG9pbnRlciIpKTsKKworCSZtb3Z1cHMJKCJ4bW0wIiwmUVdQKDAsImVheCIpKTsJIyBwdWxsIGZpcnN0IDEyOCBiaXRzIG9mICp1c2VyS2V5CisJJnhvcnBzCSgieG1tNCIsInhtbTQiKTsJIyBsb3cgZHdvcmQgb2YgeG1tNCBpcyBhc3N1bWVkIDAKKwkmbGVhCSgka2V5LCZEV1AoMTYsJGtleSkpOworCSZjbXAJKCRyb3VuZHMsMjU2KTsKKwkmamUJKCZsYWJlbCgiMTRyb3VuZHMiKSk7CisJJmNtcAkoJHJvdW5kcywxOTIpOworCSZqZQkoJmxhYmVsKCIxMnJvdW5kcyIpKTsKKwkmY21wCSgkcm91bmRzLDEyOCk7CisJJmpuZQkoJmxhYmVsKCJiYWRfa2V5Yml0cyIpKTsKKworJnNldF9sYWJlbCgiMTByb3VuZHMiLDE2KTsKKwkmbW92CQkoJHJvdW5kcyw5KTsKKwkmJG1vdmVrZXkJKCZRV1AoLTE2LCRrZXkpLCJ4bW0wIik7CSMgcm91bmQgMAorCSZhZXNrZXlnZW5hc3Npc3QoInhtbTEiLCJ4bW0wIiwweDAxKTsJCSMgcm91bmQgMQorCSZjYWxsCQkoJmxhYmVsKCJrZXlfMTI4X2NvbGQiKSk7CisJJmFlc2tleWdlbmFzc2lzdCgieG1tMSIsInhtbTAiLDB4Mik7CQkjIHJvdW5kIDIKKwkmY2FsbAkJKCZsYWJlbCgia2V5XzEyOCIpKTsKKwkmYWVza2V5Z2VuYXNzaXN0KCJ4bW0xIiwieG1tMCIsMHgwNCk7CQkjIHJvdW5kIDMKKwkmY2FsbAkJKCZsYWJlbCgia2V5XzEyOCIpKTsKKwkmYWVza2V5Z2VuYXNzaXN0KCJ4bW0xIiwieG1tMCIsMHgwOCk7CQkjIHJvdW5kIDQKKwkmY2FsbAkJKCZsYWJlbCgia2V5XzEyOCIpKTsKKwkmYWVza2V5Z2VuYXNzaXN0KCJ4bW0xIiwieG1tMCIsMHgxMCk7CQkjIHJvdW5kIDUKKwkmY2FsbAkJKCZsYWJlbCgia2V5XzEyOCIpKTsKKwkmYWVza2V5Z2VuYXNzaXN0KCJ4bW0xIiwieG1tMCIsMHgyMCk7CQkjIHJvdW5kIDYKKwkmY2FsbAkJKCZsYWJlbCgia2V5XzEyOCIpKTsKKwkmYWVza2V5Z2VuYXNzaXN0KCJ4bW0xIiwieG1tMCIsMHg0MCk7CQkjIHJvdW5kIDcKKwkmY2FsbAkJKCZsYWJlbCgia2V5XzEyOCIpKTsKKwkmYWVza2V5Z2VuYXNzaXN0KCJ4bW0xIiwieG1tMCIsMHg4MCk7CQkjIHJvdW5kIDgKKwkmY2FsbAkJKCZsYWJlbCgia2V5XzEyOCIpKTsKKwkmYWVza2V5Z2VuYXNzaXN0KCJ4bW0xIiwieG1tMCIsMHgxYik7CQkjIHJvdW5kIDkKKwkmY2FsbAkJKCZsYWJlbCgia2V5XzEyOCIpKTsKKwkmYWVza2V5Z2VuYXNzaXN0KCJ4bW0xIiwieG1tMCIsMHgzNik7CQkjIHJvdW5kIDEwCisJJmNhbGwJCSgmbGFiZWwoImtleV8xMjgiKSk7CisJJiRtb3Zla2V5CSgmUVdQKDAsJGtleSksInhtbTAiKTsKKwkmbW92CQkoJkRXUCg4MCwka2V5KSwkcm91bmRzKTsKKwkmeG9yCQkoImVheCIsImVheCIpOworCSZyZXQoKTsKKworJnNldF9sYWJlbCgia2V5XzEyOCIsMTYpOworCSYkbW92ZWtleQkoJlFXUCgwLCRrZXkpLCJ4bW0wIik7CisJJmxlYQkJKCRrZXksJkRXUCgxNiwka2V5KSk7Cismc2V0X2xhYmVsKCJrZXlfMTI4X2NvbGQiKTsKKwkmc2h1ZnBzCQkoInhtbTQiLCJ4bW0wIiwwYjAwMDEwMDAwKTsKKwkmeG9ycHMJCSgieG1tMCIsInhtbTQiKTsKKwkmc2h1ZnBzCQkoInhtbTQiLCJ4bW0wIiwwYjEwMDAxMTAwKTsKKwkmeG9ycHMJCSgieG1tMCIsInhtbTQiKTsKKwkmc2h1ZnBzCQkoInhtbTEiLCJ4bW0xIiwwYjExMTExMTExKTsJIyBjcml0aWNhbCBwYXRoCisJJnhvcnBzCQkoInhtbTAiLCJ4bW0xIik7CisJJnJldCgpOworCismc2V0X2xhYmVsKCIxMnJvdW5kcyIsMTYpOworCSZtb3ZxCQkoInhtbTIiLCZRV1AoMTYsImVheCIpKTsJIyByZW1haW5pbmcgMS8zIG9mICp1c2VyS2V5CisJJm1vdgkJKCRyb3VuZHMsMTEpOworCSYkbW92ZWtleQkoJlFXUCgtMTYsJGtleSksInhtbTAiKQkJIyByb3VuZCAwCisJJmFlc2tleWdlbmFzc2lzdCgieG1tMSIsInhtbTIiLDB4MDEpOwkJIyByb3VuZCAxLDIKKwkmY2FsbAkJKCZsYWJlbCgia2V5XzE5MmFfY29sZCIpKTsKKwkmYWVza2V5Z2VuYXNzaXN0KCJ4bW0xIiwieG1tMiIsMHgwMik7CQkjIHJvdW5kIDIsMworCSZjYWxsCQkoJmxhYmVsKCJrZXlfMTkyYiIpKTsKKwkmYWVza2V5Z2VuYXNzaXN0KCJ4bW0xIiwieG1tMiIsMHgwNCk7CQkjIHJvdW5kIDQsNQorCSZjYWxsCQkoJmxhYmVsKCJrZXlfMTkyYSIpKTsKKwkmYWVza2V5Z2VuYXNzaXN0KCJ4bW0xIiwieG1tMiIsMHgwOCk7CQkjIHJvdW5kIDUsNgorCSZjYWxsCQkoJmxhYmVsKCJrZXlfMTkyYiIpKTsKKwkmYWVza2V5Z2VuYXNzaXN0KCJ4bW0xIiwieG1tMiIsMHgxMCk7CQkjIHJvdW5kIDcsOAorCSZjYWxsCQkoJmxhYmVsKCJrZXlfMTkyYSIpKTsKKwkmYWVza2V5Z2VuYXNzaXN0KCJ4bW0xIiwieG1tMiIsMHgyMCk7CQkjIHJvdW5kIDgsOQorCSZjYWxsCQkoJmxhYmVsKCJrZXlfMTkyYiIpKTsKKwkmYWVza2V5Z2VuYXNzaXN0KCJ4bW0xIiwieG1tMiIsMHg0MCk7CQkjIHJvdW5kIDEwLDExCisJJmNhbGwJCSgmbGFiZWwoImtleV8xOTJhIikpOworCSZhZXNrZXlnZW5hc3Npc3QoInhtbTEiLCJ4bW0yIiwweDgwKTsJCSMgcm91bmQgMTEsMTIKKwkmY2FsbAkJKCZsYWJlbCgia2V5XzE5MmIiKSk7CisJJiRtb3Zla2V5CSgmUVdQKDAsJGtleSksInhtbTAiKTsKKwkmbW92CQkoJkRXUCg0OCwka2V5KSwkcm91bmRzKTsKKwkmeG9yCQkoImVheCIsImVheCIpOworCSZyZXQoKTsKKworJnNldF9sYWJlbCgia2V5XzE5MmEiLDE2KTsKKwkmJG1vdmVrZXkJKCZRV1AoMCwka2V5KSwieG1tMCIpOworCSZsZWEJCSgka2V5LCZEV1AoMTYsJGtleSkpOworJnNldF9sYWJlbCgia2V5XzE5MmFfY29sZCIsMTYpOworCSZtb3ZhcHMJCSgieG1tNSIsInhtbTIiKTsKKyZzZXRfbGFiZWwoImtleV8xOTJiX3dhcm0iKTsKKwkmc2h1ZnBzCQkoInhtbTQiLCJ4bW0wIiwwYjAwMDEwMDAwKTsKKwkmbW92ZHFhCQkoInhtbTMiLCJ4bW0yIik7CisJJnhvcnBzCQkoInhtbTAiLCJ4bW00Iik7CisJJnNodWZwcwkJKCJ4bW00IiwieG1tMCIsMGIxMDAwMTEwMCk7CisJJnBzbGxkcQkJKCJ4bW0zIiw0KTsKKwkmeG9ycHMJCSgieG1tMCIsInhtbTQiKTsKKwkmcHNodWZkCQkoInhtbTEiLCJ4bW0xIiwwYjAxMDEwMTAxKTsJIyBjcml0aWNhbCBwYXRoCisJJnB4b3IJCSgieG1tMiIsInhtbTMiKTsKKwkmcHhvcgkJKCJ4bW0wIiwieG1tMSIpOworCSZwc2h1ZmQJCSgieG1tMyIsInhtbTAiLDBiMTExMTExMTEpOworCSZweG9yCQkoInhtbTIiLCJ4bW0zIik7CisJJnJldCgpOworCismc2V0X2xhYmVsKCJrZXlfMTkyYiIsMTYpOworCSZtb3ZhcHMJCSgieG1tMyIsInhtbTAiKTsKKwkmc2h1ZnBzCQkoInhtbTUiLCJ4bW0wIiwwYjAxMDAwMTAwKTsKKwkmJG1vdmVrZXkJKCZRV1AoMCwka2V5KSwieG1tNSIpOworCSZzaHVmcHMJCSgieG1tMyIsInhtbTIiLDBiMDEwMDExMTApOworCSYkbW92ZWtleQkoJlFXUCgxNiwka2V5KSwieG1tMyIpOworCSZsZWEJCSgka2V5LCZEV1AoMzIsJGtleSkpOworCSZqbXAJCSgmbGFiZWwoImtleV8xOTJiX3dhcm0iKSk7CisKKyZzZXRfbGFiZWwoIjE0cm91bmRzIiwxNik7CisJJm1vdnVwcwkJKCJ4bW0yIiwmUVdQKDE2LCJlYXgiKSk7CSMgcmVtYWluaW5nIGhhbGYgb2YgKnVzZXJLZXkKKwkmbW92CQkoJHJvdW5kcywxMyk7CisJJmxlYQkJKCRrZXksJkRXUCgxNiwka2V5KSk7CisJJiRtb3Zla2V5CSgmUVdQKC0zMiwka2V5KSwieG1tMCIpOwkjIHJvdW5kIDAKKwkmJG1vdmVrZXkJKCZRV1AoLTE2LCRrZXkpLCJ4bW0yIik7CSMgcm91bmQgMQorCSZhZXNrZXlnZW5hc3Npc3QoInhtbTEiLCJ4bW0yIiwweDAxKTsJCSMgcm91bmQgMgorCSZjYWxsCQkoJmxhYmVsKCJrZXlfMjU2YV9jb2xkIikpOworCSZhZXNrZXlnZW5hc3Npc3QoInhtbTEiLCJ4bW0wIiwweDAxKTsJCSMgcm91bmQgMworCSZjYWxsCQkoJmxhYmVsKCJrZXlfMjU2YiIpKTsKKwkmYWVza2V5Z2VuYXNzaXN0KCJ4bW0xIiwieG1tMiIsMHgwMik7CQkjIHJvdW5kIDQKKwkmY2FsbAkJKCZsYWJlbCgia2V5XzI1NmEiKSk7CisJJmFlc2tleWdlbmFzc2lzdCgieG1tMSIsInhtbTAiLDB4MDIpOwkJIyByb3VuZCA1CisJJmNhbGwJCSgmbGFiZWwoImtleV8yNTZiIikpOworCSZhZXNrZXlnZW5hc3Npc3QoInhtbTEiLCJ4bW0yIiwweDA0KTsJCSMgcm91bmQgNgorCSZjYWxsCQkoJmxhYmVsKCJrZXlfMjU2YSIpKTsKKwkmYWVza2V5Z2VuYXNzaXN0KCJ4bW0xIiwieG1tMCIsMHgwNCk7CQkjIHJvdW5kIDcKKwkmY2FsbAkJKCZsYWJlbCgia2V5XzI1NmIiKSk7CisJJmFlc2tleWdlbmFzc2lzdCgieG1tMSIsInhtbTIiLDB4MDgpOwkJIyByb3VuZCA4CisJJmNhbGwJCSgmbGFiZWwoImtleV8yNTZhIikpOworCSZhZXNrZXlnZW5hc3Npc3QoInhtbTEiLCJ4bW0wIiwweDA4KTsJCSMgcm91bmQgOQorCSZjYWxsCQkoJmxhYmVsKCJrZXlfMjU2YiIpKTsKKwkmYWVza2V5Z2VuYXNzaXN0KCJ4bW0xIiwieG1tMiIsMHgxMCk7CQkjIHJvdW5kIDEwCisJJmNhbGwJCSgmbGFiZWwoImtleV8yNTZhIikpOworCSZhZXNrZXlnZW5hc3Npc3QoInhtbTEiLCJ4bW0wIiwweDEwKTsJCSMgcm91bmQgMTEKKwkmY2FsbAkJKCZsYWJlbCgia2V5XzI1NmIiKSk7CisJJmFlc2tleWdlbmFzc2lzdCgieG1tMSIsInhtbTIiLDB4MjApOwkJIyByb3VuZCAxMgorCSZjYWxsCQkoJmxhYmVsKCJrZXlfMjU2YSIpKTsKKwkmYWVza2V5Z2VuYXNzaXN0KCJ4bW0xIiwieG1tMCIsMHgyMCk7CQkjIHJvdW5kIDEzCisJJmNhbGwJCSgmbGFiZWwoImtleV8yNTZiIikpOworCSZhZXNrZXlnZW5hc3Npc3QoInhtbTEiLCJ4bW0yIiwweDQwKTsJCSMgcm91bmQgMTQKKwkmY2FsbAkJKCZsYWJlbCgia2V5XzI1NmEiKSk7CisJJiRtb3Zla2V5CSgmUVdQKDAsJGtleSksInhtbTAiKTsKKwkmbW92CQkoJkRXUCgxNiwka2V5KSwkcm91bmRzKTsKKwkmeG9yCQkoImVheCIsImVheCIpOworCSZyZXQoKTsKKworJnNldF9sYWJlbCgia2V5XzI1NmEiLDE2KTsKKwkmJG1vdmVrZXkJKCZRV1AoMCwka2V5KSwieG1tMiIpOworCSZsZWEJCSgka2V5LCZEV1AoMTYsJGtleSkpOworJnNldF9sYWJlbCgia2V5XzI1NmFfY29sZCIpOworCSZzaHVmcHMJCSgieG1tNCIsInhtbTAiLDBiMDAwMTAwMDApOworCSZ4b3JwcwkJKCJ4bW0wIiwieG1tNCIpOworCSZzaHVmcHMJCSgieG1tNCIsInhtbTAiLDBiMTAwMDExMDApOworCSZ4b3JwcwkJKCJ4bW0wIiwieG1tNCIpOworCSZzaHVmcHMJCSgieG1tMSIsInhtbTEiLDBiMTExMTExMTEpOwkjIGNyaXRpY2FsIHBhdGgKKwkmeG9ycHMJCSgieG1tMCIsInhtbTEiKTsKKwkmcmV0KCk7CisKKyZzZXRfbGFiZWwoImtleV8yNTZiIiwxNik7CisJJiRtb3Zla2V5CSgmUVdQKDAsJGtleSksInhtbTAiKTsKKwkmbGVhCQkoJGtleSwmRFdQKDE2LCRrZXkpKTsKKworCSZzaHVmcHMJCSgieG1tNCIsInhtbTIiLDBiMDAwMTAwMDApOworCSZ4b3JwcwkJKCJ4bW0yIiwieG1tNCIpOworCSZzaHVmcHMJCSgieG1tNCIsInhtbTIiLDBiMTAwMDExMDApOworCSZ4b3JwcwkJKCJ4bW0yIiwieG1tNCIpOworCSZzaHVmcHMJCSgieG1tMSIsInhtbTEiLDBiMTAxMDEwMTApOwkjIGNyaXRpY2FsIHBhdGgKKwkmeG9ycHMJCSgieG1tMiIsInhtbTEiKTsKKwkmcmV0KCk7CisKKyZzZXRfbGFiZWwoImJhZF9wb2ludGVyIiw0KTsKKwkmbW92CSgiZWF4IiwtMSk7CisJJnJldAkoKTsKKyZzZXRfbGFiZWwoImJhZF9rZXliaXRzIiw0KTsKKwkmbW92CSgiZWF4IiwtMik7CisJJnJldAkoKTsKKyZmdW5jdGlvbl9lbmRfQigiX2Flc25pX3NldF9lbmNyeXB0X2tleSIpOworCisjIGludCAkUFJFRklYX3NldF9lbmNyeXB0X2tleSAoY29uc3QgdW5zaWduZWQgY2hhciAqdXNlcktleSwgaW50IGJpdHMsCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTX0tFWSAqa2V5KQorJmZ1bmN0aW9uX2JlZ2luX0IoIiR7UFJFRklYfV9zZXRfZW5jcnlwdF9rZXkiKTsKKwkmbW92CSgiZWF4Iiwmd3BhcmFtKDApKTsKKwkmbW92CSgkcm91bmRzLCZ3cGFyYW0oMSkpOworCSZtb3YJKCRrZXksJndwYXJhbSgyKSk7CisJJmNhbGwJKCJfYWVzbmlfc2V0X2VuY3J5cHRfa2V5Iik7CisJJnJldAkoKTsKKyZmdW5jdGlvbl9lbmRfQigiJHtQUkVGSVh9X3NldF9lbmNyeXB0X2tleSIpOworCisjIGludCAkUFJFRklYX3NldF9kZWNyeXB0X2tleSAoY29uc3QgdW5zaWduZWQgY2hhciAqdXNlcktleSwgaW50IGJpdHMsCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTX0tFWSAqa2V5KQorJmZ1bmN0aW9uX2JlZ2luX0IoIiR7UFJFRklYfV9zZXRfZGVjcnlwdF9rZXkiKTsKKwkmbW92CSgiZWF4Iiwmd3BhcmFtKDApKTsKKwkmbW92CSgkcm91bmRzLCZ3cGFyYW0oMSkpOworCSZtb3YJKCRrZXksJndwYXJhbSgyKSk7CisJJmNhbGwJKCJfYWVzbmlfc2V0X2VuY3J5cHRfa2V5Iik7CisJJm1vdgkoJGtleSwmd3BhcmFtKDIpKTsKKwkmc2hsCSgkcm91bmRzLDQpCSMgcm91bmRzLTEgYWZ0ZXIgX2Flc25pX3NldF9lbmNyeXB0X2tleQorCSZ0ZXN0CSgiZWF4IiwiZWF4Iik7CisJJmpuegkoJmxhYmVsKCJkZWNfa2V5X3JldCIpKTsKKwkmbGVhCSgiZWF4IiwmRFdQKDE2LCRrZXksJHJvdW5kcykpOwkjIGVuZCBvZiBrZXkgc2NoZWR1bGUKKworCSYkbW92ZWtleQkoInhtbTAiLCZRV1AoMCwka2V5KSk7CSMganVzdCBzd2FwCisJJiRtb3Zla2V5CSgieG1tMSIsJlFXUCgwLCJlYXgiKSk7CisJJiRtb3Zla2V5CSgmUVdQKDAsImVheCIpLCJ4bW0wIik7CisJJiRtb3Zla2V5CSgmUVdQKDAsJGtleSksInhtbTEiKTsKKwkmbGVhCQkoJGtleSwmRFdQKDE2LCRrZXkpKTsKKwkmbGVhCQkoImVheCIsJkRXUCgtMTYsImVheCIpKTsKKworJnNldF9sYWJlbCgiZGVjX2tleV9pbnZlcnNlIik7CisJJiRtb3Zla2V5CSgieG1tMCIsJlFXUCgwLCRrZXkpKTsJIyBzd2FwIGFuZCBpbnZlcnNlCisJJiRtb3Zla2V5CSgieG1tMSIsJlFXUCgwLCJlYXgiKSk7CisJJmFlc2ltYwkJKCJ4bW0wIiwieG1tMCIpOworCSZhZXNpbWMJCSgieG1tMSIsInhtbTEiKTsKKwkmbGVhCQkoJGtleSwmRFdQKDE2LCRrZXkpKTsKKwkmbGVhCQkoImVheCIsJkRXUCgtMTYsImVheCIpKTsKKwkmJG1vdmVrZXkJKCZRV1AoMTYsImVheCIpLCJ4bW0wIik7CisJJiRtb3Zla2V5CSgmUVdQKC0xNiwka2V5KSwieG1tMSIpOworCSZjbXAJCSgiZWF4Iiwka2V5KTsKKwkmamEJCSgmbGFiZWwoImRlY19rZXlfaW52ZXJzZSIpKTsKKworCSYkbW92ZWtleQkoInhtbTAiLCZRV1AoMCwka2V5KSk7CSMgaW52ZXJzZSBtaWRkbGUKKwkmYWVzaW1jCQkoInhtbTAiLCJ4bW0wIik7CisJJiRtb3Zla2V5CSgmUVdQKDAsJGtleSksInhtbTAiKTsKKworCSZ4b3IJCSgiZWF4IiwiZWF4Iik7CQkjIHJldHVybiBzdWNjZXNzCismc2V0X2xhYmVsKCJkZWNfa2V5X3JldCIpOworCSZyZXQJKCk7CismZnVuY3Rpb25fZW5kX0IoIiR7UFJFRklYfV9zZXRfZGVjcnlwdF9rZXkiKTsKKyZhc2NpeigiQUVTIGZvciBJbnRlbCBBRVMtTkksIENSWVBUT0dBTVMgYnkgPGFwcHJvXEBvcGVuc3NsLm9yZz4iKTsKKworJmFzbV9maW5pc2goKTsKZGlmZiAtLWdpdCBhL2NyeXB0by9hZXMvYXNtL2Flc25pLXg4Nl82NC5wbCBiL2NyeXB0by9hZXMvYXNtL2Flc25pLXg4Nl82NC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGJiMTk0Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2Flcy9hc20vYWVzbmkteDg2XzY0LnBsCkBAIC0wLDAgKzEsMzA2OSBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorIworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiBmb3IgdGhlIE9wZW5TU0wKKyMgcHJvamVjdC4gVGhlIG1vZHVsZSBpcywgaG93ZXZlciwgZHVhbCBsaWNlbnNlZCB1bmRlciBPcGVuU1NMIGFuZAorIyBDUllQVE9HQU1TIGxpY2Vuc2VzIGRlcGVuZGluZyBvbiB3aGVyZSB5b3Ugb2J0YWluIGl0LiBGb3IgZnVydGhlcgorIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBzdXBwb3J0IGZvciBJbnRlbCBBRVMtTkkgZXh0ZW5zaW9uLiBJbgorIyBPcGVuU1NMIGNvbnRleHQgaXQncyB1c2VkIHdpdGggSW50ZWwgZW5naW5lLCBidXQgY2FuIGFsc28gYmUgdXNlZCBhcworIyBkcm9wLWluIHJlcGxhY2VtZW50IGZvciBjcnlwdG8vYWVzL2FzbS9hZXMteDg2XzY0LnBsIFtzZWUgYmVsb3cgZm9yCisjIGRldGFpbHNdLgorIworIyBQZXJmb3JtYW5jZS4KKyMKKyMgR2l2ZW4gYWVzKGVuY3xkZWMpIGluc3RydWN0aW9ucycgbGF0ZW5jeSBhc3ltcHRvdGljIHBlcmZvcm1hbmNlIGZvcgorIyBub24tcGFyYWxsZWxpemFibGUgbW9kZXMgc3VjaCBhcyBDQkMgZW5jcnlwdCBpcyAzLjc1IGN5Y2xlcyBwZXIgYnl0ZQorIyBwcm9jZXNzZWQgd2l0aCAxMjgtYml0IGtleS4gQW5kIGdpdmVuIHRoZWlyIHRocm91Z2hwdXQgYXN5bXB0b3RpYworIyBwZXJmb3JtYW5jZSBmb3IgcGFyYWxsZWxpemFibGUgbW9kZXMgaXMgMS4yNSBjeWNsZXMgcGVyIGJ5dGUuIEJlaW5nCisjIGFzeW1wdG90aWMgbGltaXQgaXQncyBub3Qgc29tZXRoaW5nIHlvdSBjb21tb25seSBhY2hpZXZlIGluIHJlYWxpdHksCisjIGJ1dCBob3cgY2xvc2UgZG9lcyBvbmUgZ2V0PyBCZWxvdyBhcmUgcmVzdWx0cyBjb2xsZWN0ZWQgZm9yCisjIGRpZmZlcmVudCBtb2RlcyBhbmQgYmxvY2sgc2l6ZWQuIFBhaXJzIG9mIG51bWJlcnMgYXJlIGZvciBlbi0vCisjIGRlY3J5cHRpb24uCisjCisjCTE2LWJ5dGUgICAgIDY0LWJ5dGUgICAgIDI1Ni1ieXRlICAgIDEtS0IgICAgICAgIDgtS0IKKyMgRUNCCTQuMjUvNC4yNSAgIDEuMzgvMS4zOCAgIDEuMjgvMS4yOCAgIDEuMjYvMS4yNgkxLjI2LzEuMjYKKyMgQ1RSCTUuNDIvNS40MiAgIDEuOTIvMS45MiAgIDEuNDQvMS40NCAgIDEuMjgvMS4yOCAgIDEuMjYvMS4yNgorIyBDQkMJNC4zOC80LjQzICAgNC4xNS8xLjQzICAgNC4wNy8xLjMyICAgNC4wNy8xLjI5ICAgNC4wNi8xLjI4CisjIENDTQk1LjY2LzkuNDIgICA0LjQyLzUuNDEgICA0LjE2LzQuNDAgICA0LjA5LzQuMTUgICA0LjA2LzQuMDcgICAKKyMgT0ZCCTUuNDIvNS40MiAgIDQuNjQvNC42NCAgIDQuNDQvNC40NCAgIDQuMzkvNC4zOSAgIDQuMzgvNC4zOAorIyBDRkIJNS43My81Ljg1ICAgNS41Ni81LjYyICAgNS40OC81LjU2ICAgNS40Ny81LjU1ICAgNS40Ny81LjU1CisjCisjIEVDQiwgQ1RSLCBDQkMgYW5kIENDTSByZXN1bHRzIGFyZSBmcmVlIGZyb20gRVZQIG92ZXJoZWFkLiBUaGlzIG1lYW5zCisjIHRoYXQgb3RoZXJ3aXNlIHVzZWQgJ29wZW5zc2wgc3BlZWQgLWV2cCBhZXMtMTI4LT8/PyAtZW5naW5lIGFlc25pCisjIFstZGVjcnlwdF0nIHdpbGwgZXhoaWJpdCAxMC0xNSUgd29yc2UgcmVzdWx0cyBmb3Igc21hbGxlciBibG9ja3MuCisjIFRoZSByZXN1bHRzIHdlcmUgY29sbGVjdGVkIHdpdGggc3BlY2lhbGx5IGNyYWZ0ZWQgc3BlZWQuYyBiZW5jaG1hcmsKKyMgaW4gb3JkZXIgdG8gY29tcGFyZSB0aGVtIHdpdGggcmVzdWx0cyByZXBvcnRlZCBpbiAiSW50ZWwgQWR2YW5jZWQKKyMgRW5jcnlwdGlvbiBTdGFuZGFyZCAoQUVTKSBOZXcgSW5zdHJ1Y3Rpb24gU2V0IiBXaGl0ZSBQYXBlciBSZXZpc2lvbgorIyAzLjAgZGF0ZWQgTWF5IDIwMTAuIEFsbCBhYm92ZSByZXN1bHRzIGFyZSBjb25zaXN0ZW50bHkgYmV0dGVyLiBUaGlzCisjIG1vZHVsZSBhbHNvIHByb3ZpZGVzIGJldHRlciBwZXJmb3JtYW5jZSBmb3IgYmxvY2sgc2l6ZXMgc21hbGxlciB0aGFuCisjIDEyOCBieXRlcyBpbiBwb2ludHMgKm5vdCogcmVwcmVzZW50ZWQgaW4gdGhlIGFib3ZlIHRhYmxlLgorIworIyBMb29raW5nIGF0IHRoZSByZXN1bHRzIGZvciA4LUtCIGJ1ZmZlci4KKyMKKyMgQ0ZCIGFuZCBPRkIgcmVzdWx0cyBhcmUgZmFyIGZyb20gdGhlIGxpbWl0LCBiZWNhdXNlIGltcGxlbWVudGF0aW9uCisjIHVzZXMgImdlbmVyaWMiIENSWVBUT19bY3xvXWZiMTI4X2VuY3J5cHQgaW50ZXJmYWNlcyByZWx5aW5nIG9uCisjIHNpbmdsZS1ibG9jayBhZXNuaV9lbmNyeXB0LCB3aGljaCBpcyBub3QgdGhlIG1vc3Qgb3B0aW1hbCB3YXkgdG8gZ28uCisjIENCQyBlbmNyeXB0IHJlc3VsdCBpcyB1bmV4cGVjdGVkbHkgaGlnaCBhbmQgdGhlcmUgaXMgbm8gZG9jdW1lbnRlZAorIyBleHBsYW5hdGlvbiBmb3IgaXQuIFNlZW1pbmdseSB0aGVyZSBpcyBhIHNtYWxsIHBlbmFsdHkgZm9yIGZlZWRpbmcKKyMgdGhlIHJlc3VsdCBiYWNrIHRvIEFFUyB1bml0IHRoZSB3YXkgaXQncyBkb25lIGluIENCQyBtb2RlLiBUaGVyZSBpcworIyBub3RoaW5nIG9uZSBjYW4gZG8gYW5kIHRoZSByZXN1bHQgYXBwZWFycyBvcHRpbWFsLiBDQ00gcmVzdWx0IGlzCisjIGlkZW50aWNhbCB0byBDQkMsIGJlY2F1c2UgQ0JDLU1BQyBpcyBlc3NlbnRpYWxseSBDQkMgZW5jcnlwdCB3aXRob3V0CisjIHNhdmluZyBvdXRwdXQuIENDTSBDVFIgInN0YXlzIGludmlzaWJsZSwiIGJlY2F1c2UgaXQncyBuZWF0bHkKKyMgaW50ZXJsZWF2ZWQgd2loIENCQy1NQUMuIFRoaXMgcHJvdmlkZXMgfjMwJSBpbXByb3ZlbWVudCBvdmVyCisjICJzdHJhZ2h0Zm9yd2FyZCIgQ0NNIGltcGxlbWVudGF0aW9uIHdpdGggQ1RSIGFuZCBDQkMtTUFDIHBlcmZvcm1lZAorIyBkaXNqb2ludGx5LiBQYXJhbGxlbGl6YWJsZSBtb2RlcyBwcmFjdGljYWxseSBhY2hpZXZlIHRoZSB0aGVvcmV0aWNhbAorIyBsaW1pdC4KKyMKKyMgTG9va2luZyBhdCBob3cgcmVzdWx0cyB2YXJ5IHdpdGggYnVmZmVyIHNpemUuCisjCisjIEN1cnZlcyBhcmUgcHJhY3RpY2FsbHkgc2F0dXJhdGVkIGF0IDEtS0IgYnVmZmVyIHNpemUuIEluIG1vc3QgY2FzZXMKKyMgIjI1Ni1ieXRlIiBwZXJmb3JtYW5jZSBpcyA+OTUlLCBhbmQgIjY0LWJ5dGUiIGlzIH45MCUgb2YgIjgtS0IiIG9uZS4KKyMgQ1RSIGN1cnZlIGRvZXNuJ3QgZm9sbG93IHRoaXMgcGF0dGVybiBhbmQgaXMgInNsb3dlc3QiIGNoYW5naW5nIG9uZQorIyB3aXRoICIyNTYtYnl0ZSIgcmVzdWx0IGJlaW5nIDg3JSBvZiAiOC1LQi4iIFRoaXMgaXMgYmVjYXVzZSBvdmVyaGVhZAorIyBpbiBDVFIgbW9kZSBpcyBtb3N0IGNvbXB1dGF0aW9uYWxseSBpbnRlbnNpdmUuIFNtYWxsLWJsb2NrIENDTQorIyBkZWNyeXB0IGlzIHNsb3dlciB0aGFuIGVuY3J5cHQsIGJlY2F1c2UgZmlyc3QgQ1RSIGFuZCBsYXN0IENCQy1NQUMKKyMgaXRlcmF0aW9ucyBjYW4ndCBiZSBpbnRlcmxlYXZlZC4KKyMKKyMgUmVzdWx0cyBmb3IgMTkyLSBhbmQgMjU2LWJpdCBrZXlzLgorIworIyBFVlAtZnJlZSByZXN1bHRzIHdlcmUgb2JzZXJ2ZWQgdG8gc2NhbGUgcGVyZmVjdGx5IHdpdGggbnVtYmVyIG9mCisjIHJvdW5kcyBmb3IgbGFyZ2VyIGJsb2NrIHNpemVzLCBpLmUuIDE5Mi1iaXQgcmVzdWx0IGJlaW5nIDEwLzEyIHRpbWVzCisjIGxvd2VyIGFuZCAyNTYtYml0IG9uZSAtIDEwLzE0LiBXZWxsLCBpbiBDQkMgZW5jcnlwdCBjYXNlIGRpZmZlcmVuY2VzCisjIGFyZSBhIHRhZCBzbWFsbGVyLCBiZWNhdXNlIHRoZSBhYm92ZSBtZW50aW9uZWQgcGVuYWx0eSBiaWFzZXMgYWxsCisjIHJlc3VsdHMgYnkgc2FtZSBjb25zdGFudCB2YWx1ZS4gSW4gc2ltaWxhciB3YXkgZnVuY3Rpb24gY2FsbAorIyBvdmVyaGVhZCBhZmZlY3RzIHNtYWxsLWJsb2NrIHBlcmZvcm1hbmNlLCBhcyB3ZWxsIGFzIE9GQiBhbmQgQ0ZCCisjIHJlc3VsdHMuIERpZmZlcmVuY2VzIGFyZSBub3QgbGFyZ2UsIG1vc3QgY29tbW9uIGNvZWZmaWNpZW50cyBhcmUKKyMgMTAvMTEuNyBhbmQgMTAvMTMuNCAoYXMgb3Bwb3NpdGUgdG8gMTAvMTIuMCBhbmQgMTAvMTQuMCksIGJ1dCBvbmUKKyMgb2JzZXJ2ZSBldmVuIDEwLzExLjIgYW5kIDEwLzEyLjQgKENUUiwgT0ZCLCBDRkIpLi4uCisKKyMgSmFudWFyeSAyMDExCisjCisjIFdoaWxlIFdlc3RtZXJlIHByb2Nlc3NvciBmZWF0dXJlcyA2IGN5Y2xlcyBsYXRlbmN5IGZvciBhZXNbZW5jfGRlY10KKyMgaW5zdHJ1Y3Rpb25zLCB3aGljaCBjYW4gYmUgc2NoZWR1bGVkIGV2ZXJ5IHNlY29uZCBjeWNsZSwgU2FuZHkKKyMgQnJpZGdlIHNwZW5kcyA4IGN5Y2xlcyBwZXIgaW5zdHJ1Y3Rpb24sIGJ1dCBpdCBjYW4gc2NoZWR1bGUgdGhlbQorIyBldmVyeSBjeWNsZS4gVGhpcyBtZWFucyB0aGF0IGNvZGUgdGFyZ2V0aW5nIFdlc3RtZXJlIHdvdWxkIHBlcmZvcm0KKyMgc3Vib3B0aW1hbGx5IG9uIFNhbmR5IEJyaWRnZS4gVGhlcmVmb3JlIHRoaXMgdXBkYXRlLgorIworIyBJbiBhZGRpdGlvbiwgbm9uLXBhcmFsbGVsaXphYmxlIENCQyBlbmNyeXB0IChhcyB3ZWxsIGFzIENDTSkgaXMKKyMgb3B0aW1pemVkLiBSZWxhdGl2ZSBpbXByb3ZlbWVudCBtaWdodCBhcHBlYXIgbW9kZXN0LCA4JSBvbiBXZXN0bWVyZSwKKyMgYnV0IGluIGFic29sdXRlIHRlcm1zIGl0J3MgMy43NyBjeWNsZXMgcGVyIGJ5dGUgZW5jcnlwdGVkIHdpdGgKKyMgMTI4LWJpdCBrZXkgb24gV2VzdG1lcmUsIGFuZCA1LjA3IC0gb24gU2FuZHkgQnJpZGdlLiBUaGVzZSBudW1iZXJzCisjIHNob3VsZCBiZSBjb21wYXJlZCB0byBhc3ltcHRvdGljIGxpbWl0cyBvZiAzLjc1IGZvciBXZXN0bWVyZSBhbmQKKyMgNS4wMCBmb3IgU2FuZHkgQnJpZGdlLiBBY3R1YWxseSwgdGhlIGZhY3QgdGhhdCB0aGV5IGdldCB0aGlzIGNsb3NlCisjIHRvIGFzeW1wdG90aWMgbGltaXRzIGlzIHF1aXRlIGFtYXppbmcuIEluZGVlZCwgdGhlIGxpbWl0IGlzCisjIGNhbGN1bGF0ZWQgYXMgbGF0ZW5jeSB0aW1lcyBudW1iZXIgb2Ygcm91bmRzLCAxMCBmb3IgMTI4LWJpdCBrZXksCisjIGFuZCBkaXZpZGVkIGJ5IDE2LCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIGJsb2NrLCBvciBpbiBvdGhlciB3b3JkcworIyBpdCBhY2NvdW50cyAqc29sZWx5KiBmb3IgYWVzZW5jIGluc3RydWN0aW9ucy4gQnV0IHRoZXJlIGFyZSBleHRyYQorIyBpbnN0cnVjdGlvbnMsIGFuZCBudW1iZXJzIHNvIGNsb3NlIHRvIHRoZSBhc3ltcHRvdGljIGxpbWl0cyBtZWFuCisjIHRoYXQgaXQncyBhcyBpZiBpdCB0YWtlcyBhcyBsaXR0bGUgYXMgKm9uZSogYWRkaXRpb25hbCBjeWNsZSB0bworIyBleGVjdXRlIGFsbCBvZiB0aGVtLiBIb3cgaXMgaXQgcG9zc2libGU/IEl0IGlzIHBvc3NpYmxlIHRoYW5rcyB0bworIyBvdXQtb2Ytb3JkZXIgZXhlY3V0aW9uIGxvZ2ljLCB3aGljaCBtYW5hZ2VzIHRvIG92ZXJsYXAgcG9zdC0KKyMgcHJvY2Vzc2luZyBvZiBwcmV2aW91cyBibG9jaywgdGhpbmdzIGxpa2Ugc2F2aW5nIHRoZSBvdXRwdXQsIHdpdGgKKyMgYWN0dWFsIGVuY3J5cHRpb24gb2YgY3VycmVudCBibG9jaywgYXMgd2VsbCBhcyBwcmUtcHJvY2Vzc2luZyBvZgorIyBjdXJyZW50IGJsb2NrLCB0aGluZ3MgbGlrZSBmZXRjaGluZyBpbnB1dCBhbmQgeG9yLWluZyBpdCB3aXRoCisjIDAtcm91bmQgZWxlbWVudCBvZiB0aGUga2V5IHNjaGVkdWxlLCB3aXRoIGFjdHVhbCBlbmNyeXB0aW9uIG9mCisjIHByZXZpb3VzIGJsb2NrLiBLZWVwIHRoaXMgaW4gbWluZC4uLgorIworIyBGb3IgcGFyYWxsZWxpemFibGUgbW9kZXMsIHN1Y2ggYXMgRUNCLCBDQkMgZGVjcnlwdCwgQ1RSLCBoaWdoZXIKKyMgcGVyZm9ybWFuY2UgaXMgYWNoaWV2ZWQgYnkgaW50ZXJsZWF2aW5nIGluc3RydWN0aW9ucyB3b3JraW5nIG9uCisjIGluZGVwZW5kZW50IGJsb2Nrcy4gSW4gd2hpY2ggY2FzZSBhc3ltcHRvdGljIGxpbWl0IGZvciBzdWNoIG1vZGVzCisjIGNhbiBiZSBvYnRhaW5lZCBieSBkaXZpZGluZyBhYm92ZSBtZW50aW9uZWQgbnVtYmVycyBieSBBRVMKKyMgaW5zdHJ1Y3Rpb25zJyBpbnRlcmxlYXZlIGZhY3Rvci4gV2VzdG1lcmUgY2FuIGV4ZWN1dGUgYXQgbW9zdCAzIAorIyBpbnN0cnVjdGlvbnMgYXQgYSB0aW1lLCBtZWFuaW5nIHRoYXQgb3B0aW1hbCBpbnRlcmxlYXZlIGZhY3RvciBpcyAzLAorIyBhbmQgdGhhdCdzIHdoZXJlIHRoZSAibWFnaWMiIG51bWJlciBvZiAxLjI1IGNvbWUgZnJvbS4gIk9wdGltYWwKKyMgaW50ZXJsZWF2ZSBmYWN0b3IiIG1lYW5zIHRoYXQgaW5jcmVhc2Ugb2YgaW50ZXJsZWF2ZSBmYWN0b3IgZG9lcworIyBub3QgaW1wcm92ZSBwZXJmb3JtYW5jZS4gVGhlIGZvcm11bGEgaGFzIHByb3ZlbiB0byByZWZsZWN0IHJlYWxpdHkKKyMgcHJldHR5IHdlbGwgb24gV2VzdG1lcmUuLi4gU2FuZHkgQnJpZGdlIG9uIHRoZSBvdGhlciBoYW5kIGNhbgorIyBleGVjdXRlIHVwIHRvIDggQUVTIGluc3RydWN0aW9ucyBhdCBhIHRpbWUsIHNvIGhvdyBkb2VzIHZhcnlpbmcKKyMgaW50ZXJsZWF2ZSBmYWN0b3IgYWZmZWN0IHRoZSBwZXJmb3JtYW5jZT8gSGVyZSBpcyB0YWJsZSBmb3IgRUNCCisjIChudW1iZXJzIGFyZSBjeWNsZXMgcGVyIGJ5dGUgcHJvY2Vzc2VkIHdpdGggMTI4LWJpdCBrZXkpOgorIworIyBpbnN0cnVjdGlvbiBpbnRlcmxlYXZlIGZhY3RvcgkJM3gJNngJOHgKKyMgdGhlb3JldGljYWwgYXN5bXB0b3RpYyBsaW1pdAkJMS42NwkwLjgzCTAuNjI1CisjIG1lYXN1cmVkIHBlcmZvcm1hbmNlIGZvciA4S0IgYmxvY2sJMS4wNQkwLjg2CTAuODQKKyMKKyMgImFzIGlmIiBpbnRlcmxlYXZlIGZhY3RvcgkJNC43eAk1Ljh4CTYuMHgKKyMKKyMgRnVydGhlciBkYXRhIGZvciBvdGhlciBwYXJhbGxlbGl6YWJsZSBtb2RlczoKKyMKKyMgQ0JDIGRlY3J5cHQJCQkJMS4xNgkwLjkzCTAuOTMKKyMgQ1RSCQkJCQkxLjE0CTAuOTEJbi9hCisjCisjIFdlbGwsIGdpdmVuIDN4IGNvbHVtbiBpdCdzIHByb2JhYmx5IGluYXBwcm9wcmlhdGUgdG8gY2FsbCB0aGUgbGltaXQKKyMgYXN5bXB0b3RpYywgaWYgaXQgY2FuIGJlIHN1cnBhc3NlZCwgaXNuJ3QgaXQ/IFdoYXQgaGFwcGVucyB0aGVyZT8KKyMgUmV3aW5kIHRvIENCQyBwYXJhZ3JhcGggZm9yIHRoZSBhbnN3ZXIuIFllcywgb3V0LW9mLW9yZGVyIGV4ZWN1dGlvbgorIyBtYWdpYyBpcyByZXNwb25zaWJsZSBmb3IgdGhpcy4gUHJvY2Vzc29yIG92ZXJsYXBzIG5vdCBvbmx5IHRoZQorIyBhZGRpdGlvbmFsIGluc3RydWN0aW9ucyB3aXRoIEFFUyBvbmVzLCBidXQgZXZlbiBBRVMgaW5zdHVjdGlvbnMKKyMgcHJvY2Vzc2luZyBhZGphY2VudCB0cmlwbGV0cyBvZiBpbmRlcGVuZGVudCBibG9ja3MuIEluIHRoZSA2eCBjYXNlCisjIGFkZGl0aW9uYWwgaW5zdHJ1Y3Rpb25zICBzdGlsbCBjbGFpbSBkaXNwcm9wb3J0aW9uYWxseSBzbWFsbCBhbW91bnQKKyMgb2YgYWRkaXRpb25hbCBjeWNsZXMsIGJ1dCBpbiA4eCBjYXNlIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgbXVzdCBiZQorIyBhIHRhZCB0b28gaGlnaCBmb3Igb3V0LW9mLW9yZGVyIGxvZ2ljIHRvIGNvcGUgd2l0aCwgYW5kIEFFUyB1bml0CisjIHJlbWFpbnMgdW5kZXJ1dGlsaXplZC4uLiBBcyB5b3UgY2FuIHNlZSA4eCBpbnRlcmxlYXZlIGlzIGhhcmRseQorIyBqdXN0aWZpYWJsZSwgc28gdGhlcmUgbm8gbmVlZCB0byBmZWVsIGJhZCB0aGF0IDMyLWJpdCBhZXNuaS14ODYucGwKKyMgdXRpbGl6aWVzIDZ4IGludGVybGVhdmUgYmVjYXVzZSBvZiBsaW1pdGVkIHJlZ2lzdGVyIGJhbmsgY2FwYWNpdHkuCisjCisjIEhpZ2hlciBpbnRlcmxlYXZlIGZhY3RvcnMgZG8gaGF2ZSBuZWdhdGl2ZSBpbXBhY3Qgb24gV2VzdG1lcmUKKyMgcGVyZm9ybWFuY2UuIFdoaWxlIGZvciBFQ0IgbW9kZSBpdCdzIG5lZ2xpZ2libGUgfjEuNSUsIG90aGVyCisjIHBhcmFsbGVsaXphYmxlcyBwZXJmb3JtIH41JSB3b3JzZSwgd2hpY2ggaXMgb3V0d2VpZ2hlZCBieSB+MjUlCisjIGltcHJvdmVtZW50IG9uIFNhbmR5IEJyaWRnZS4gVG8gYmFsYW5jZSByZWdyZXNzaW9uIG9uIFdlc3RtZXJlCisjIENUUiBtb2RlIHdhcyBpbXBsZW1lbnRlZCB3aXRoIDZ4IGFlc2VuYyBpbnRlcmxlYXZlIGZhY3Rvci4KKworIyBBcHJpbCAyMDExCisjCisjIEFkZCBhZXNuaV94dHNfW2VufGRlXWNyeXB0LiBXZXN0bWVyZSBzcGVuZHMgMS4zMyBjeWNsZXMgcHJvY2Vzc2luZworIyBvbmUgYnl0ZSBvdXQgb2YgOEtCIHdpdGggMTI4LWJpdCBrZXksIFNhbmR5IEJyaWRnZSAtIDAuOTcuIEp1c3QgbGlrZQorIyBpbiBDVFIgbW9kZSBBRVMgaW5zdHJ1Y3Rpb24gaW50ZXJsZWF2ZSBmYWN0b3Igd2FzIGNob3NlbiB0byBiZSA2eC4KKworJFBSRUZJWD0iYWVzbmkiOwkjIGlmICRQUkVGSVggaXMgc2V0IHRvICJBRVMiLCB0aGUgc2NyaXB0CisJCQkjIGdlbmVyYXRlcyBkcm9wLWluIHJlcGxhY2VtZW50IGZvcgorCQkJIyBjcnlwdG8vYWVzL2FzbS9hZXMteDg2XzY0LnBsOi0pCisKKyRmbGF2b3VyID0gc2hpZnQ7Ciskb3V0cHV0ICA9IHNoaWZ0OworaWYgKCRmbGF2b3VyID1+IC9cLi8pIHsgJG91dHB1dCA9ICRmbGF2b3VyOyB1bmRlZiAkZmxhdm91cjsgfQorCiskd2luNjQ9MDsgJHdpbjY0PTEgaWYgKCRmbGF2b3VyID1+IC9bbm1dYXNtfG1pbmd3NjQvIHx8ICRvdXRwdXQgPX4gL1wuYXNtJC8pOworCiskMCA9fiBtLyguKltcL1xcXSlbXlwvXFxdKyQvOyAkZGlyPSQxOworKCAkeGxhdGU9IiR7ZGlyfXg4Nl82NC14bGF0ZS5wbCIgYW5kIC1mICR4bGF0ZSApIG9yCisoICR4bGF0ZT0iJHtkaXJ9Li4vLi4vcGVybGFzbS94ODZfNjQteGxhdGUucGwiIGFuZCAtZiAkeGxhdGUpIG9yCitkaWUgImNhbid0IGxvY2F0ZSB4ODZfNjQteGxhdGUucGwiOworCitvcGVuIE9VVCwifCBcIiReWFwiICR4bGF0ZSAkZmxhdm91ciAkb3V0cHV0IjsKKypTVERPVVQ9Kk9VVDsKKworJG1vdmtleSA9ICRQUkVGSVggZXEgImFlc25pIiA/ICJtb3Z1cHMiIDogIm1vdnVwcyI7CitAXzRhcmdzPSR3aW42ND8JKCIlcmN4IiwiJXJkeCIsIiVyOCIsICIlcjkiKSA6CSMgV2luNjQgb3JkZXIKKwkJKCIlcmRpIiwiJXJzaSIsIiVyZHgiLCIlcmN4Iik7CSMgVW5peCBvcmRlcgorCiskY29kZT0iLnRleHRcbiI7CisKKyRyb3VuZHM9IiVlYXgiOwkjIGlucHV0IHRvIGFuZCBjaGFuZ2VkIGJ5IGFlc25pX1tlbnxkZV1jcnlwdE4gISEhCisjIHRoaXMgaXMgbmF0dXJhbCBVbml4IGFyZ3VtZW50IG9yZGVyIGZvciBwdWJsaWMgJFBSRUZJWF9bZWNifGNiY11fZW5jcnlwdCAuLi4KKyRpbnA9IiVyZGkiOworJG91dD0iJXJzaSI7CiskbGVuPSIlcmR4IjsKKyRrZXk9IiVyY3giOwkjIGlucHV0IHRvIGFuZCBjaGFuZ2VkIGJ5IGFlc25pX1tlbnxkZV1jcnlwdE4gISEhCiskaXZwPSIlcjgiOwkjIGNiYywgY3RyLCAuLi4KKworJHJuZHNfPSIlcjEwZCI7CSMgYmFja3VwIGNvcHkgZm9yICRyb3VuZHMKKyRrZXlfPSIlcjExIjsJIyBiYWNrdXAgY29weSBmb3IgJGtleQorCisjICV4bW0gcmVnaXN0ZXIgbGF5b3V0Ciskcm5ka2V5MD0iJXhtbTAiOwkkcm5ka2V5MT0iJXhtbTEiOworJGlub3V0MD0iJXhtbTIiOwkkaW5vdXQxPSIleG1tMyI7CiskaW5vdXQyPSIleG1tNCI7CSRpbm91dDM9IiV4bW01IjsKKyRpbm91dDQ9IiV4bW02IjsJJGlub3V0NT0iJXhtbTciOworJGlub3V0Nj0iJXhtbTgiOwkkaW5vdXQ3PSIleG1tOSI7CisKKyRpbjI9IiV4bW02IjsJCSRpbjE9IiV4bW03IjsJIyB1c2VkIGluIENCQyBkZWNyeXB0LCBDVFIsIC4uLgorJGluMD0iJXhtbTgiOwkJJGl2PSIleG1tOSI7CisMCisjIElubGluZSB2ZXJzaW9uIG9mIGludGVybmFsIGFlc25pX1tlbnxkZV1jcnlwdDEuCisjCisjIFdoeSBmb2xkZWQgbG9vcD8gQmVjYXVzZSBhZXNbZW5jfGRlY10gaXMgc2xvdyBlbm91Z2ggdG8gYWNjb21tb2RhdGUKKyMgY3ljbGVzIHdoaWNoIHRha2UgY2FyZSBvZiBsb29wIHZhcmlhYmxlcy4uLgoreyBteSAkc247CitzdWIgYWVzbmlfZ2VuZXJhdGUxIHsKK215ICgkcCwka2V5LCRyb3VuZHMsJGlub3V0LCRpdmVjKT1AXzsJJGlub3V0PSRpbm91dDAgaWYgKCFkZWZpbmVkKCRpbm91dCkpOworKyskc247CiskY29kZS49PDxfX187CisJJG1vdmtleQkoJGtleSksJHJuZGtleTAKKwkkbW92a2V5CTE2KCRrZXkpLCRybmRrZXkxCitfX18KKyRjb2RlLj08PF9fXyBpZiAoZGVmaW5lZCgkaXZlYykpOworCXhvcnBzCSRybmRrZXkwLCRpdmVjCisJbGVhCTMyKCRrZXkpLCRrZXkKKwl4b3JwcwkkaXZlYywkaW5vdXQKK19fXworJGNvZGUuPTw8X19fIGlmICghZGVmaW5lZCgkaXZlYykpOworCWxlYQkzMigka2V5KSwka2V5CisJeG9ycHMJJHJuZGtleTAsJGlub3V0CitfX18KKyRjb2RlLj08PF9fXzsKKy5Mb29wXyR7cH0xXyRzbjoKKwlhZXMke3B9CSRybmRrZXkxLCRpbm91dAorCWRlYwkkcm91bmRzCisJJG1vdmtleQkoJGtleSksJHJuZGtleTEKKwlsZWEJMTYoJGtleSksJGtleQorCWpuegkuTG9vcF8ke3B9MV8kc24JIyBsb29wIGJvZHkgaXMgMTYgYnl0ZXMKKwlhZXMke3B9bGFzdAkkcm5ka2V5MSwkaW5vdXQKK19fXworfX0KKyMgdm9pZCAkUFJFRklYX1tlbnxkZV1jcnlwdCAoY29uc3Qgdm9pZCAqaW5wLHZvaWQgKm91dCxjb25zdCBBRVNfS0VZICprZXkpOworIworeyBteSAoJGlucCwkb3V0LCRrZXkpID0gQF80YXJnczsKKworJGNvZGUuPTw8X19fOworLmdsb2JsCSR7UFJFRklYfV9lbmNyeXB0CisudHlwZQkke1BSRUZJWH1fZW5jcnlwdCxcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMTYKKyR7UFJFRklYfV9lbmNyeXB0OgorCW1vdnVwcwkoJGlucCksJGlub3V0MAkJIyBsb2FkIGlucHV0CisJbW92CTI0MCgka2V5KSwkcm91bmRzCSMga2V5LT5yb3VuZHMKK19fXworCSZhZXNuaV9nZW5lcmF0ZTEoImVuYyIsJGtleSwkcm91bmRzKTsKKyRjb2RlLj08PF9fXzsKKwltb3Z1cHMJJGlub3V0MCwoJG91dCkJCSMgb3V0cHV0CisJcmV0Cisuc2l6ZQkke1BSRUZJWH1fZW5jcnlwdCwuLSR7UFJFRklYfV9lbmNyeXB0CisKKy5nbG9ibAkke1BSRUZJWH1fZGVjcnlwdAorLnR5cGUJJHtQUkVGSVh9X2RlY3J5cHQsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2Ciske1BSRUZJWH1fZGVjcnlwdDoKKwltb3Z1cHMJKCRpbnApLCRpbm91dDAJCSMgbG9hZCBpbnB1dAorCW1vdgkyNDAoJGtleSksJHJvdW5kcwkjIGtleS0+cm91bmRzCitfX18KKwkmYWVzbmlfZ2VuZXJhdGUxKCJkZWMiLCRrZXksJHJvdW5kcyk7CiskY29kZS49PDxfX187CisJbW92dXBzCSRpbm91dDAsKCRvdXQpCQkjIG91dHB1dAorCXJldAorLnNpemUJJHtQUkVGSVh9X2RlY3J5cHQsIC4tJHtQUkVGSVh9X2RlY3J5cHQKK19fXworfQorDAorIyBfYWVzbmlfW2VufGRlXWNyeXB0TiBhcmUgcHJpdmF0ZSBpbnRlcmZhY2VzLCBOIGRlbm90ZXMgaW50ZXJsZWF2ZQorIyBmYWN0b3IuIFdoeSAzeCBzdWJyb3V0aW5lIHdlcmUgb3JpZ2luYWxseSB1c2VkIGluIGxvb3BzPyBFdmVuIHRob3VnaAorIyBhZXNbZW5jfGRlY10gbGF0ZW5jeSB3YXMgb3JpZ2luYWxseSA2LCBpdCBjb3VsZCBiZSBzY2hlZHVsZWQgb25seQorIyBldmVyeSAqMm5kKiBjeWNsZS4gVGh1cyAzeCBpbnRlcmxlYXZlIHdhcyB0aGUgb25lIHByb3ZpZGluZyBvcHRpbWFsCisjIHV0aWxpemF0aW9uLCBpLmUuIHdoZW4gc3Vicm91dGluZSdzIHRocm91Z2hwdXQgaXMgdmlydHVhbGx5IHNhbWUgYXMKKyMgb2Ygbm9uLWludGVybGVhdmVkIHN1YnJvdXRpbmUgW2ZvciBudW1iZXIgb2YgaW5wdXQgYmxvY2tzIHVwIHRvIDNdLgorIyBUaGlzIGlzIHdoeSBpdCBtYWtlcyBubyBzZW5zZSB0byBpbXBsZW1lbnQgMnggc3Vicm91dGluZS4KKyMgYWVzW2VuY3xkZWNdIGxhdGVuY3kgaW4gbmV4dCBwcm9jZXNzb3IgZ2VuZXJhdGlvbiBpcyA4LCBidXQgdGhlCisjIGluc3RydWN0aW9ucyBjYW4gYmUgc2NoZWR1bGVkIGV2ZXJ5IGN5Y2xlLiBPcHRpbWFsIGludGVybGVhdmUgZm9yCisjIG5ldyBwcm9jZXNzb3IgaXMgdGhlcmVmb3JlIDh4Li4uCitzdWIgYWVzbmlfZ2VuZXJhdGUzIHsKK215ICRkaXI9c2hpZnQ7CisjIEFzIGFscmVhZHkgbWVudGlvbmVkIGl0IHRha2VzIGluICRrZXkgYW5kICRyb3VuZHMsIHdoaWNoIGFyZSAqbm90KgorIyBwcmVzZXJ2ZWQuICRpbm91dFswLTJdIGlzIGNpcGhlci9jbGVhciB0ZXh0Li4uCiskY29kZS49PDxfX187CisudHlwZQlfYWVzbmlfJHtkaXJ9cnlwdDMsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2CitfYWVzbmlfJHtkaXJ9cnlwdDM6CisJJG1vdmtleQkoJGtleSksJHJuZGtleTAKKwlzaHIJXCQxLCRyb3VuZHMKKwkkbW92a2V5CTE2KCRrZXkpLCRybmRrZXkxCisJbGVhCTMyKCRrZXkpLCRrZXkKKwl4b3Jwcwkkcm5ka2V5MCwkaW5vdXQwCisJeG9ycHMJJHJuZGtleTAsJGlub3V0MQorCXhvcnBzCSRybmRrZXkwLCRpbm91dDIKKwkkbW92a2V5CQkoJGtleSksJHJuZGtleTAKKworLkwke2Rpcn1fbG9vcDM6CisJYWVzJHtkaXJ9CSRybmRrZXkxLCRpbm91dDAKKwlhZXMke2Rpcn0JJHJuZGtleTEsJGlub3V0MQorCWRlYwkJJHJvdW5kcworCWFlcyR7ZGlyfQkkcm5ka2V5MSwkaW5vdXQyCisJJG1vdmtleQkJMTYoJGtleSksJHJuZGtleTEKKwlhZXMke2Rpcn0JJHJuZGtleTAsJGlub3V0MAorCWFlcyR7ZGlyfQkkcm5ka2V5MCwkaW5vdXQxCisJbGVhCQkzMigka2V5KSwka2V5CisJYWVzJHtkaXJ9CSRybmRrZXkwLCRpbm91dDIKKwkkbW92a2V5CQkoJGtleSksJHJuZGtleTAKKwlqbnoJCS5MJHtkaXJ9X2xvb3AzCisKKwlhZXMke2Rpcn0JJHJuZGtleTEsJGlub3V0MAorCWFlcyR7ZGlyfQkkcm5ka2V5MSwkaW5vdXQxCisJYWVzJHtkaXJ9CSRybmRrZXkxLCRpbm91dDIKKwlhZXMke2Rpcn1sYXN0CSRybmRrZXkwLCRpbm91dDAKKwlhZXMke2Rpcn1sYXN0CSRybmRrZXkwLCRpbm91dDEKKwlhZXMke2Rpcn1sYXN0CSRybmRrZXkwLCRpbm91dDIKKwlyZXQKKy5zaXplCV9hZXNuaV8ke2Rpcn1yeXB0MywuLV9hZXNuaV8ke2Rpcn1yeXB0MworX19fCit9CisjIDR4IGludGVybGVhdmUgaXMgaW1wbGVtZW50ZWQgdG8gaW1wcm92ZSBzbWFsbCBibG9jayBwZXJmb3JtYW5jZSwKKyMgbW9zdCBub3RhYmx5IFthbmQgbmF0dXJhbGx5XSA0IGJsb2NrIGJ5IH4zMCUuIE9uZSBjYW4gYXJndWUgdGhhdCBvbmUKKyMgc2hvdWxkIGhhdmUgaW1wbGVtZW50ZWQgNXggYXMgd2VsbCwgYnV0IGltcHJvdmVtZW50IHdvdWxkIGJlIDwyMCUsCisjIHNvIGl0J3Mgbm90IHdvcnRoIGl0Li4uCitzdWIgYWVzbmlfZ2VuZXJhdGU0IHsKK215ICRkaXI9c2hpZnQ7CisjIEFzIGFscmVhZHkgbWVudGlvbmVkIGl0IHRha2VzIGluICRrZXkgYW5kICRyb3VuZHMsIHdoaWNoIGFyZSAqbm90KgorIyBwcmVzZXJ2ZWQuICRpbm91dFswLTNdIGlzIGNpcGhlci9jbGVhciB0ZXh0Li4uCiskY29kZS49PDxfX187CisudHlwZQlfYWVzbmlfJHtkaXJ9cnlwdDQsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2CitfYWVzbmlfJHtkaXJ9cnlwdDQ6CisJJG1vdmtleQkoJGtleSksJHJuZGtleTAKKwlzaHIJXCQxLCRyb3VuZHMKKwkkbW92a2V5CTE2KCRrZXkpLCRybmRrZXkxCisJbGVhCTMyKCRrZXkpLCRrZXkKKwl4b3Jwcwkkcm5ka2V5MCwkaW5vdXQwCisJeG9ycHMJJHJuZGtleTAsJGlub3V0MQorCXhvcnBzCSRybmRrZXkwLCRpbm91dDIKKwl4b3Jwcwkkcm5ka2V5MCwkaW5vdXQzCisJJG1vdmtleQkoJGtleSksJHJuZGtleTAKKworLkwke2Rpcn1fbG9vcDQ6CisJYWVzJHtkaXJ9CSRybmRrZXkxLCRpbm91dDAKKwlhZXMke2Rpcn0JJHJuZGtleTEsJGlub3V0MQorCWRlYwkJJHJvdW5kcworCWFlcyR7ZGlyfQkkcm5ka2V5MSwkaW5vdXQyCisJYWVzJHtkaXJ9CSRybmRrZXkxLCRpbm91dDMKKwkkbW92a2V5CQkxNigka2V5KSwkcm5ka2V5MQorCWFlcyR7ZGlyfQkkcm5ka2V5MCwkaW5vdXQwCisJYWVzJHtkaXJ9CSRybmRrZXkwLCRpbm91dDEKKwlsZWEJCTMyKCRrZXkpLCRrZXkKKwlhZXMke2Rpcn0JJHJuZGtleTAsJGlub3V0MgorCWFlcyR7ZGlyfQkkcm5ka2V5MCwkaW5vdXQzCisJJG1vdmtleQkJKCRrZXkpLCRybmRrZXkwCisJam56CQkuTCR7ZGlyfV9sb29wNAorCisJYWVzJHtkaXJ9CSRybmRrZXkxLCRpbm91dDAKKwlhZXMke2Rpcn0JJHJuZGtleTEsJGlub3V0MQorCWFlcyR7ZGlyfQkkcm5ka2V5MSwkaW5vdXQyCisJYWVzJHtkaXJ9CSRybmRrZXkxLCRpbm91dDMKKwlhZXMke2Rpcn1sYXN0CSRybmRrZXkwLCRpbm91dDAKKwlhZXMke2Rpcn1sYXN0CSRybmRrZXkwLCRpbm91dDEKKwlhZXMke2Rpcn1sYXN0CSRybmRrZXkwLCRpbm91dDIKKwlhZXMke2Rpcn1sYXN0CSRybmRrZXkwLCRpbm91dDMKKwlyZXQKKy5zaXplCV9hZXNuaV8ke2Rpcn1yeXB0NCwuLV9hZXNuaV8ke2Rpcn1yeXB0NAorX19fCit9CitzdWIgYWVzbmlfZ2VuZXJhdGU2IHsKK215ICRkaXI9c2hpZnQ7CisjIEFzIGFscmVhZHkgbWVudGlvbmVkIGl0IHRha2VzIGluICRrZXkgYW5kICRyb3VuZHMsIHdoaWNoIGFyZSAqbm90KgorIyBwcmVzZXJ2ZWQuICRpbm91dFswLTVdIGlzIGNpcGhlci9jbGVhciB0ZXh0Li4uCiskY29kZS49PDxfX187CisudHlwZQlfYWVzbmlfJHtkaXJ9cnlwdDYsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2CitfYWVzbmlfJHtkaXJ9cnlwdDY6CisJJG1vdmtleQkJKCRrZXkpLCRybmRrZXkwCisJc2hyCQlcJDEsJHJvdW5kcworCSRtb3ZrZXkJCTE2KCRrZXkpLCRybmRrZXkxCisJbGVhCQkzMigka2V5KSwka2V5CisJeG9ycHMJCSRybmRrZXkwLCRpbm91dDAKKwlweG9yCQkkcm5ka2V5MCwkaW5vdXQxCisJYWVzJHtkaXJ9CSRybmRrZXkxLCRpbm91dDAKKwlweG9yCQkkcm5ka2V5MCwkaW5vdXQyCisJYWVzJHtkaXJ9CSRybmRrZXkxLCRpbm91dDEKKwlweG9yCQkkcm5ka2V5MCwkaW5vdXQzCisJYWVzJHtkaXJ9CSRybmRrZXkxLCRpbm91dDIKKwlweG9yCQkkcm5ka2V5MCwkaW5vdXQ0CisJYWVzJHtkaXJ9CSRybmRrZXkxLCRpbm91dDMKKwlweG9yCQkkcm5ka2V5MCwkaW5vdXQ1CisJZGVjCQkkcm91bmRzCisJYWVzJHtkaXJ9CSRybmRrZXkxLCRpbm91dDQKKwkkbW92a2V5CQkoJGtleSksJHJuZGtleTAKKwlhZXMke2Rpcn0JJHJuZGtleTEsJGlub3V0NQorCWptcAkJLkwke2Rpcn1fbG9vcDZfZW50ZXIKKy5hbGlnbgkxNgorLkwke2Rpcn1fbG9vcDY6CisJYWVzJHtkaXJ9CSRybmRrZXkxLCRpbm91dDAKKwlhZXMke2Rpcn0JJHJuZGtleTEsJGlub3V0MQorCWRlYwkJJHJvdW5kcworCWFlcyR7ZGlyfQkkcm5ka2V5MSwkaW5vdXQyCisJYWVzJHtkaXJ9CSRybmRrZXkxLCRpbm91dDMKKwlhZXMke2Rpcn0JJHJuZGtleTEsJGlub3V0NAorCWFlcyR7ZGlyfQkkcm5ka2V5MSwkaW5vdXQ1CisuTCR7ZGlyfV9sb29wNl9lbnRlcjoJCQkJIyBoYXBwZW5zIHRvIGJlIDE2LWJ5dGUgYWxpZ25lZAorCSRtb3ZrZXkJCTE2KCRrZXkpLCRybmRrZXkxCisJYWVzJHtkaXJ9CSRybmRrZXkwLCRpbm91dDAKKwlhZXMke2Rpcn0JJHJuZGtleTAsJGlub3V0MQorCWxlYQkJMzIoJGtleSksJGtleQorCWFlcyR7ZGlyfQkkcm5ka2V5MCwkaW5vdXQyCisJYWVzJHtkaXJ9CSRybmRrZXkwLCRpbm91dDMKKwlhZXMke2Rpcn0JJHJuZGtleTAsJGlub3V0NAorCWFlcyR7ZGlyfQkkcm5ka2V5MCwkaW5vdXQ1CisJJG1vdmtleQkJKCRrZXkpLCRybmRrZXkwCisJam56CQkuTCR7ZGlyfV9sb29wNgorCisJYWVzJHtkaXJ9CSRybmRrZXkxLCRpbm91dDAKKwlhZXMke2Rpcn0JJHJuZGtleTEsJGlub3V0MQorCWFlcyR7ZGlyfQkkcm5ka2V5MSwkaW5vdXQyCisJYWVzJHtkaXJ9CSRybmRrZXkxLCRpbm91dDMKKwlhZXMke2Rpcn0JJHJuZGtleTEsJGlub3V0NAorCWFlcyR7ZGlyfQkkcm5ka2V5MSwkaW5vdXQ1CisJYWVzJHtkaXJ9bGFzdAkkcm5ka2V5MCwkaW5vdXQwCisJYWVzJHtkaXJ9bGFzdAkkcm5ka2V5MCwkaW5vdXQxCisJYWVzJHtkaXJ9bGFzdAkkcm5ka2V5MCwkaW5vdXQyCisJYWVzJHtkaXJ9bGFzdAkkcm5ka2V5MCwkaW5vdXQzCisJYWVzJHtkaXJ9bGFzdAkkcm5ka2V5MCwkaW5vdXQ0CisJYWVzJHtkaXJ9bGFzdAkkcm5ka2V5MCwkaW5vdXQ1CisJcmV0Cisuc2l6ZQlfYWVzbmlfJHtkaXJ9cnlwdDYsLi1fYWVzbmlfJHtkaXJ9cnlwdDYKK19fXworfQorc3ViIGFlc25pX2dlbmVyYXRlOCB7CitteSAkZGlyPXNoaWZ0OworIyBBcyBhbHJlYWR5IG1lbnRpb25lZCBpdCB0YWtlcyBpbiAka2V5IGFuZCAkcm91bmRzLCB3aGljaCBhcmUgKm5vdCoKKyMgcHJlc2VydmVkLiAkaW5vdXRbMC03XSBpcyBjaXBoZXIvY2xlYXIgdGV4dC4uLgorJGNvZGUuPTw8X19fOworLnR5cGUJX2Flc25pXyR7ZGlyfXJ5cHQ4LFxAYWJpLW9tbmlwb3RlbnQKKy5hbGlnbgkxNgorX2Flc25pXyR7ZGlyfXJ5cHQ4OgorCSRtb3ZrZXkJCSgka2V5KSwkcm5ka2V5MAorCXNocgkJXCQxLCRyb3VuZHMKKwkkbW92a2V5CQkxNigka2V5KSwkcm5ka2V5MQorCWxlYQkJMzIoJGtleSksJGtleQorCXhvcnBzCQkkcm5ka2V5MCwkaW5vdXQwCisJeG9ycHMJCSRybmRrZXkwLCRpbm91dDEKKwlhZXMke2Rpcn0JJHJuZGtleTEsJGlub3V0MAorCXB4b3IJCSRybmRrZXkwLCRpbm91dDIKKwlhZXMke2Rpcn0JJHJuZGtleTEsJGlub3V0MQorCXB4b3IJCSRybmRrZXkwLCRpbm91dDMKKwlhZXMke2Rpcn0JJHJuZGtleTEsJGlub3V0MgorCXB4b3IJCSRybmRrZXkwLCRpbm91dDQKKwlhZXMke2Rpcn0JJHJuZGtleTEsJGlub3V0MworCXB4b3IJCSRybmRrZXkwLCRpbm91dDUKKwlkZWMJCSRyb3VuZHMKKwlhZXMke2Rpcn0JJHJuZGtleTEsJGlub3V0NAorCXB4b3IJCSRybmRrZXkwLCRpbm91dDYKKwlhZXMke2Rpcn0JJHJuZGtleTEsJGlub3V0NQorCXB4b3IJCSRybmRrZXkwLCRpbm91dDcKKwkkbW92a2V5CQkoJGtleSksJHJuZGtleTAKKwlhZXMke2Rpcn0JJHJuZGtleTEsJGlub3V0NgorCWFlcyR7ZGlyfQkkcm5ka2V5MSwkaW5vdXQ3CisJJG1vdmtleQkJMTYoJGtleSksJHJuZGtleTEKKwlqbXAJCS5MJHtkaXJ9X2xvb3A4X2VudGVyCisuYWxpZ24JMTYKKy5MJHtkaXJ9X2xvb3A4OgorCWFlcyR7ZGlyfQkkcm5ka2V5MSwkaW5vdXQwCisJYWVzJHtkaXJ9CSRybmRrZXkxLCRpbm91dDEKKwlkZWMJCSRyb3VuZHMKKwlhZXMke2Rpcn0JJHJuZGtleTEsJGlub3V0MgorCWFlcyR7ZGlyfQkkcm5ka2V5MSwkaW5vdXQzCisJYWVzJHtkaXJ9CSRybmRrZXkxLCRpbm91dDQKKwlhZXMke2Rpcn0JJHJuZGtleTEsJGlub3V0NQorCWFlcyR7ZGlyfQkkcm5ka2V5MSwkaW5vdXQ2CisJYWVzJHtkaXJ9CSRybmRrZXkxLCRpbm91dDcKKwkkbW92a2V5CQkxNigka2V5KSwkcm5ka2V5MQorLkwke2Rpcn1fbG9vcDhfZW50ZXI6CQkJCSMgaGFwcGVucyB0byBiZSAxNi1ieXRlIGFsaWduZWQKKwlhZXMke2Rpcn0JJHJuZGtleTAsJGlub3V0MAorCWFlcyR7ZGlyfQkkcm5ka2V5MCwkaW5vdXQxCisJbGVhCQkzMigka2V5KSwka2V5CisJYWVzJHtkaXJ9CSRybmRrZXkwLCRpbm91dDIKKwlhZXMke2Rpcn0JJHJuZGtleTAsJGlub3V0MworCWFlcyR7ZGlyfQkkcm5ka2V5MCwkaW5vdXQ0CisJYWVzJHtkaXJ9CSRybmRrZXkwLCRpbm91dDUKKwlhZXMke2Rpcn0JJHJuZGtleTAsJGlub3V0NgorCWFlcyR7ZGlyfQkkcm5ka2V5MCwkaW5vdXQ3CisJJG1vdmtleQkJKCRrZXkpLCRybmRrZXkwCisJam56CQkuTCR7ZGlyfV9sb29wOAorCisJYWVzJHtkaXJ9CSRybmRrZXkxLCRpbm91dDAKKwlhZXMke2Rpcn0JJHJuZGtleTEsJGlub3V0MQorCWFlcyR7ZGlyfQkkcm5ka2V5MSwkaW5vdXQyCisJYWVzJHtkaXJ9CSRybmRrZXkxLCRpbm91dDMKKwlhZXMke2Rpcn0JJHJuZGtleTEsJGlub3V0NAorCWFlcyR7ZGlyfQkkcm5ka2V5MSwkaW5vdXQ1CisJYWVzJHtkaXJ9CSRybmRrZXkxLCRpbm91dDYKKwlhZXMke2Rpcn0JJHJuZGtleTEsJGlub3V0NworCWFlcyR7ZGlyfWxhc3QJJHJuZGtleTAsJGlub3V0MAorCWFlcyR7ZGlyfWxhc3QJJHJuZGtleTAsJGlub3V0MQorCWFlcyR7ZGlyfWxhc3QJJHJuZGtleTAsJGlub3V0MgorCWFlcyR7ZGlyfWxhc3QJJHJuZGtleTAsJGlub3V0MworCWFlcyR7ZGlyfWxhc3QJJHJuZGtleTAsJGlub3V0NAorCWFlcyR7ZGlyfWxhc3QJJHJuZGtleTAsJGlub3V0NQorCWFlcyR7ZGlyfWxhc3QJJHJuZGtleTAsJGlub3V0NgorCWFlcyR7ZGlyfWxhc3QJJHJuZGtleTAsJGlub3V0NworCXJldAorLnNpemUJX2Flc25pXyR7ZGlyfXJ5cHQ4LC4tX2Flc25pXyR7ZGlyfXJ5cHQ4CitfX18KK30KKyZhZXNuaV9nZW5lcmF0ZTMoImVuYyIpIGlmICgkUFJFRklYIGVxICJhZXNuaSIpOworJmFlc25pX2dlbmVyYXRlMygiZGVjIik7CismYWVzbmlfZ2VuZXJhdGU0KCJlbmMiKSBpZiAoJFBSRUZJWCBlcSAiYWVzbmkiKTsKKyZhZXNuaV9nZW5lcmF0ZTQoImRlYyIpOworJmFlc25pX2dlbmVyYXRlNigiZW5jIikgaWYgKCRQUkVGSVggZXEgImFlc25pIik7CismYWVzbmlfZ2VuZXJhdGU2KCJkZWMiKTsKKyZhZXNuaV9nZW5lcmF0ZTgoImVuYyIpIGlmICgkUFJFRklYIGVxICJhZXNuaSIpOworJmFlc25pX2dlbmVyYXRlOCgiZGVjIik7CisMCitpZiAoJFBSRUZJWCBlcSAiYWVzbmkiKSB7CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgdm9pZCBhZXNuaV9lY2JfZW5jcnlwdCAoY29uc3Qgdm9pZCAqaW4sIHZvaWQgKm91dCwKKyMJCQkgIHNpemVfdCBsZW5ndGgsIGNvbnN0IEFFU19LRVkgKmtleSwKKyMJCQkgIGludCBlbmMpOworJGNvZGUuPTw8X19fOworLmdsb2JsCWFlc25pX2VjYl9lbmNyeXB0CisudHlwZQlhZXNuaV9lY2JfZW5jcnlwdCxcQGZ1bmN0aW9uLDUKKy5hbGlnbgkxNgorYWVzbmlfZWNiX2VuY3J5cHQ6CisJYW5kCVwkLTE2LCRsZW4KKwlqegkuTGVjYl9yZXQKKworCW1vdgkyNDAoJGtleSksJHJvdW5kcwkjIGtleS0+cm91bmRzCisJJG1vdmtleQkoJGtleSksJHJuZGtleTAKKwltb3YJJGtleSwka2V5XwkJIyBiYWNrdXAgJGtleQorCW1vdgkkcm91bmRzLCRybmRzXwkJIyBiYWNrdXAgJHJvdW5kcworCXRlc3QJJXI4ZCwlcjhkCQkjIDV0aCBhcmd1bWVudAorCWp6CS5MZWNiX2RlY3J5cHQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRUNCIEVOQ1JZUFQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIworCWNtcAlcJDB4ODAsJGxlbgorCWpiCS5MZWNiX2VuY190YWlsCisKKwltb3ZkcXUJKCRpbnApLCRpbm91dDAKKwltb3ZkcXUJMHgxMCgkaW5wKSwkaW5vdXQxCisJbW92ZHF1CTB4MjAoJGlucCksJGlub3V0MgorCW1vdmRxdQkweDMwKCRpbnApLCRpbm91dDMKKwltb3ZkcXUJMHg0MCgkaW5wKSwkaW5vdXQ0CisJbW92ZHF1CTB4NTAoJGlucCksJGlub3V0NQorCW1vdmRxdQkweDYwKCRpbnApLCRpbm91dDYKKwltb3ZkcXUJMHg3MCgkaW5wKSwkaW5vdXQ3CisJbGVhCTB4ODAoJGlucCksJGlucAorCXN1YglcJDB4ODAsJGxlbgorCWptcAkuTGVjYl9lbmNfbG9vcDhfZW50ZXIKKy5hbGlnbiAxNgorLkxlY2JfZW5jX2xvb3A4OgorCW1vdnVwcwkkaW5vdXQwLCgkb3V0KQorCW1vdgkka2V5Xywka2V5CQkjIHJlc3RvcmUgJGtleQorCW1vdmRxdQkoJGlucCksJGlub3V0MAorCW1vdgkkcm5kc18sJHJvdW5kcwkJIyByZXN0b3JlICRyb3VuZHMKKwltb3Z1cHMJJGlub3V0MSwweDEwKCRvdXQpCisJbW92ZHF1CTB4MTAoJGlucCksJGlub3V0MQorCW1vdnVwcwkkaW5vdXQyLDB4MjAoJG91dCkKKwltb3ZkcXUJMHgyMCgkaW5wKSwkaW5vdXQyCisJbW92dXBzCSRpbm91dDMsMHgzMCgkb3V0KQorCW1vdmRxdQkweDMwKCRpbnApLCRpbm91dDMKKwltb3Z1cHMJJGlub3V0NCwweDQwKCRvdXQpCisJbW92ZHF1CTB4NDAoJGlucCksJGlub3V0NAorCW1vdnVwcwkkaW5vdXQ1LDB4NTAoJG91dCkKKwltb3ZkcXUJMHg1MCgkaW5wKSwkaW5vdXQ1CisJbW92dXBzCSRpbm91dDYsMHg2MCgkb3V0KQorCW1vdmRxdQkweDYwKCRpbnApLCRpbm91dDYKKwltb3Z1cHMJJGlub3V0NywweDcwKCRvdXQpCisJbGVhCTB4ODAoJG91dCksJG91dAorCW1vdmRxdQkweDcwKCRpbnApLCRpbm91dDcKKwlsZWEJMHg4MCgkaW5wKSwkaW5wCisuTGVjYl9lbmNfbG9vcDhfZW50ZXI6CisKKwljYWxsCV9hZXNuaV9lbmNyeXB0OAorCisJc3ViCVwkMHg4MCwkbGVuCisJam5jCS5MZWNiX2VuY19sb29wOAorCisJbW92dXBzCSRpbm91dDAsKCRvdXQpCisJbW92CSRrZXlfLCRrZXkJCSMgcmVzdG9yZSAka2V5CisJbW92dXBzCSRpbm91dDEsMHgxMCgkb3V0KQorCW1vdgkkcm5kc18sJHJvdW5kcwkJIyByZXN0b3JlICRyb3VuZHMKKwltb3Z1cHMJJGlub3V0MiwweDIwKCRvdXQpCisJbW92dXBzCSRpbm91dDMsMHgzMCgkb3V0KQorCW1vdnVwcwkkaW5vdXQ0LDB4NDAoJG91dCkKKwltb3Z1cHMJJGlub3V0NSwweDUwKCRvdXQpCisJbW92dXBzCSRpbm91dDYsMHg2MCgkb3V0KQorCW1vdnVwcwkkaW5vdXQ3LDB4NzAoJG91dCkKKwlsZWEJMHg4MCgkb3V0KSwkb3V0CisJYWRkCVwkMHg4MCwkbGVuCisJanoJLkxlY2JfcmV0CisKKy5MZWNiX2VuY190YWlsOgorCW1vdnVwcwkoJGlucCksJGlub3V0MAorCWNtcAlcJDB4MjAsJGxlbgorCWpiCS5MZWNiX2VuY19vbmUKKwltb3Z1cHMJMHgxMCgkaW5wKSwkaW5vdXQxCisJamUJLkxlY2JfZW5jX3R3bworCW1vdnVwcwkweDIwKCRpbnApLCRpbm91dDIKKwljbXAJXCQweDQwLCRsZW4KKwlqYgkuTGVjYl9lbmNfdGhyZWUKKwltb3Z1cHMJMHgzMCgkaW5wKSwkaW5vdXQzCisJamUJLkxlY2JfZW5jX2ZvdXIKKwltb3Z1cHMJMHg0MCgkaW5wKSwkaW5vdXQ0CisJY21wCVwkMHg2MCwkbGVuCisJamIJLkxlY2JfZW5jX2ZpdmUKKwltb3Z1cHMJMHg1MCgkaW5wKSwkaW5vdXQ1CisJamUJLkxlY2JfZW5jX3NpeAorCW1vdmRxdQkweDYwKCRpbnApLCRpbm91dDYKKwljYWxsCV9hZXNuaV9lbmNyeXB0OAorCW1vdnVwcwkkaW5vdXQwLCgkb3V0KQorCW1vdnVwcwkkaW5vdXQxLDB4MTAoJG91dCkKKwltb3Z1cHMJJGlub3V0MiwweDIwKCRvdXQpCisJbW92dXBzCSRpbm91dDMsMHgzMCgkb3V0KQorCW1vdnVwcwkkaW5vdXQ0LDB4NDAoJG91dCkKKwltb3Z1cHMJJGlub3V0NSwweDUwKCRvdXQpCisJbW92dXBzCSRpbm91dDYsMHg2MCgkb3V0KQorCWptcAkuTGVjYl9yZXQKKy5hbGlnbgkxNgorLkxlY2JfZW5jX29uZToKK19fXworCSZhZXNuaV9nZW5lcmF0ZTEoImVuYyIsJGtleSwkcm91bmRzKTsKKyRjb2RlLj08PF9fXzsKKwltb3Z1cHMJJGlub3V0MCwoJG91dCkKKwlqbXAJLkxlY2JfcmV0CisuYWxpZ24JMTYKKy5MZWNiX2VuY190d286CisJeG9ycHMJJGlub3V0MiwkaW5vdXQyCisJY2FsbAlfYWVzbmlfZW5jcnlwdDMKKwltb3Z1cHMJJGlub3V0MCwoJG91dCkKKwltb3Z1cHMJJGlub3V0MSwweDEwKCRvdXQpCisJam1wCS5MZWNiX3JldAorLmFsaWduCTE2CisuTGVjYl9lbmNfdGhyZWU6CisJY2FsbAlfYWVzbmlfZW5jcnlwdDMKKwltb3Z1cHMJJGlub3V0MCwoJG91dCkKKwltb3Z1cHMJJGlub3V0MSwweDEwKCRvdXQpCisJbW92dXBzCSRpbm91dDIsMHgyMCgkb3V0KQorCWptcAkuTGVjYl9yZXQKKy5hbGlnbgkxNgorLkxlY2JfZW5jX2ZvdXI6CisJY2FsbAlfYWVzbmlfZW5jcnlwdDQKKwltb3Z1cHMJJGlub3V0MCwoJG91dCkKKwltb3Z1cHMJJGlub3V0MSwweDEwKCRvdXQpCisJbW92dXBzCSRpbm91dDIsMHgyMCgkb3V0KQorCW1vdnVwcwkkaW5vdXQzLDB4MzAoJG91dCkKKwlqbXAJLkxlY2JfcmV0CisuYWxpZ24JMTYKKy5MZWNiX2VuY19maXZlOgorCXhvcnBzCSRpbm91dDUsJGlub3V0NQorCWNhbGwJX2Flc25pX2VuY3J5cHQ2CisJbW92dXBzCSRpbm91dDAsKCRvdXQpCisJbW92dXBzCSRpbm91dDEsMHgxMCgkb3V0KQorCW1vdnVwcwkkaW5vdXQyLDB4MjAoJG91dCkKKwltb3Z1cHMJJGlub3V0MywweDMwKCRvdXQpCisJbW92dXBzCSRpbm91dDQsMHg0MCgkb3V0KQorCWptcAkuTGVjYl9yZXQKKy5hbGlnbgkxNgorLkxlY2JfZW5jX3NpeDoKKwljYWxsCV9hZXNuaV9lbmNyeXB0NgorCW1vdnVwcwkkaW5vdXQwLCgkb3V0KQorCW1vdnVwcwkkaW5vdXQxLDB4MTAoJG91dCkKKwltb3Z1cHMJJGlub3V0MiwweDIwKCRvdXQpCisJbW92dXBzCSRpbm91dDMsMHgzMCgkb3V0KQorCW1vdnVwcwkkaW5vdXQ0LDB4NDAoJG91dCkKKwltb3Z1cHMJJGlub3V0NSwweDUwKCRvdXQpCisJam1wCS5MZWNiX3JldAorDCMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRUNCIERFQ1JZUFQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIworLmFsaWduCTE2CisuTGVjYl9kZWNyeXB0OgorCWNtcAlcJDB4ODAsJGxlbgorCWpiCS5MZWNiX2RlY190YWlsCisKKwltb3ZkcXUJKCRpbnApLCRpbm91dDAKKwltb3ZkcXUJMHgxMCgkaW5wKSwkaW5vdXQxCisJbW92ZHF1CTB4MjAoJGlucCksJGlub3V0MgorCW1vdmRxdQkweDMwKCRpbnApLCRpbm91dDMKKwltb3ZkcXUJMHg0MCgkaW5wKSwkaW5vdXQ0CisJbW92ZHF1CTB4NTAoJGlucCksJGlub3V0NQorCW1vdmRxdQkweDYwKCRpbnApLCRpbm91dDYKKwltb3ZkcXUJMHg3MCgkaW5wKSwkaW5vdXQ3CisJbGVhCTB4ODAoJGlucCksJGlucAorCXN1YglcJDB4ODAsJGxlbgorCWptcAkuTGVjYl9kZWNfbG9vcDhfZW50ZXIKKy5hbGlnbiAxNgorLkxlY2JfZGVjX2xvb3A4OgorCW1vdnVwcwkkaW5vdXQwLCgkb3V0KQorCW1vdgkka2V5Xywka2V5CQkjIHJlc3RvcmUgJGtleQorCW1vdmRxdQkoJGlucCksJGlub3V0MAorCW1vdgkkcm5kc18sJHJvdW5kcwkJIyByZXN0b3JlICRyb3VuZHMKKwltb3Z1cHMJJGlub3V0MSwweDEwKCRvdXQpCisJbW92ZHF1CTB4MTAoJGlucCksJGlub3V0MQorCW1vdnVwcwkkaW5vdXQyLDB4MjAoJG91dCkKKwltb3ZkcXUJMHgyMCgkaW5wKSwkaW5vdXQyCisJbW92dXBzCSRpbm91dDMsMHgzMCgkb3V0KQorCW1vdmRxdQkweDMwKCRpbnApLCRpbm91dDMKKwltb3Z1cHMJJGlub3V0NCwweDQwKCRvdXQpCisJbW92ZHF1CTB4NDAoJGlucCksJGlub3V0NAorCW1vdnVwcwkkaW5vdXQ1LDB4NTAoJG91dCkKKwltb3ZkcXUJMHg1MCgkaW5wKSwkaW5vdXQ1CisJbW92dXBzCSRpbm91dDYsMHg2MCgkb3V0KQorCW1vdmRxdQkweDYwKCRpbnApLCRpbm91dDYKKwltb3Z1cHMJJGlub3V0NywweDcwKCRvdXQpCisJbGVhCTB4ODAoJG91dCksJG91dAorCW1vdmRxdQkweDcwKCRpbnApLCRpbm91dDcKKwlsZWEJMHg4MCgkaW5wKSwkaW5wCisuTGVjYl9kZWNfbG9vcDhfZW50ZXI6CisKKwljYWxsCV9hZXNuaV9kZWNyeXB0OAorCisJJG1vdmtleQkoJGtleV8pLCRybmRrZXkwCisJc3ViCVwkMHg4MCwkbGVuCisJam5jCS5MZWNiX2RlY19sb29wOAorCisJbW92dXBzCSRpbm91dDAsKCRvdXQpCisJbW92CSRrZXlfLCRrZXkJCSMgcmVzdG9yZSAka2V5CisJbW92dXBzCSRpbm91dDEsMHgxMCgkb3V0KQorCW1vdgkkcm5kc18sJHJvdW5kcwkJIyByZXN0b3JlICRyb3VuZHMKKwltb3Z1cHMJJGlub3V0MiwweDIwKCRvdXQpCisJbW92dXBzCSRpbm91dDMsMHgzMCgkb3V0KQorCW1vdnVwcwkkaW5vdXQ0LDB4NDAoJG91dCkKKwltb3Z1cHMJJGlub3V0NSwweDUwKCRvdXQpCisJbW92dXBzCSRpbm91dDYsMHg2MCgkb3V0KQorCW1vdnVwcwkkaW5vdXQ3LDB4NzAoJG91dCkKKwlsZWEJMHg4MCgkb3V0KSwkb3V0CisJYWRkCVwkMHg4MCwkbGVuCisJanoJLkxlY2JfcmV0CisKKy5MZWNiX2RlY190YWlsOgorCW1vdnVwcwkoJGlucCksJGlub3V0MAorCWNtcAlcJDB4MjAsJGxlbgorCWpiCS5MZWNiX2RlY19vbmUKKwltb3Z1cHMJMHgxMCgkaW5wKSwkaW5vdXQxCisJamUJLkxlY2JfZGVjX3R3bworCW1vdnVwcwkweDIwKCRpbnApLCRpbm91dDIKKwljbXAJXCQweDQwLCRsZW4KKwlqYgkuTGVjYl9kZWNfdGhyZWUKKwltb3Z1cHMJMHgzMCgkaW5wKSwkaW5vdXQzCisJamUJLkxlY2JfZGVjX2ZvdXIKKwltb3Z1cHMJMHg0MCgkaW5wKSwkaW5vdXQ0CisJY21wCVwkMHg2MCwkbGVuCisJamIJLkxlY2JfZGVjX2ZpdmUKKwltb3Z1cHMJMHg1MCgkaW5wKSwkaW5vdXQ1CisJamUJLkxlY2JfZGVjX3NpeAorCW1vdnVwcwkweDYwKCRpbnApLCRpbm91dDYKKwkkbW92a2V5CSgka2V5KSwkcm5ka2V5MAorCWNhbGwJX2Flc25pX2RlY3J5cHQ4CisJbW92dXBzCSRpbm91dDAsKCRvdXQpCisJbW92dXBzCSRpbm91dDEsMHgxMCgkb3V0KQorCW1vdnVwcwkkaW5vdXQyLDB4MjAoJG91dCkKKwltb3Z1cHMJJGlub3V0MywweDMwKCRvdXQpCisJbW92dXBzCSRpbm91dDQsMHg0MCgkb3V0KQorCW1vdnVwcwkkaW5vdXQ1LDB4NTAoJG91dCkKKwltb3Z1cHMJJGlub3V0NiwweDYwKCRvdXQpCisJam1wCS5MZWNiX3JldAorLmFsaWduCTE2CisuTGVjYl9kZWNfb25lOgorX19fCisJJmFlc25pX2dlbmVyYXRlMSgiZGVjIiwka2V5LCRyb3VuZHMpOworJGNvZGUuPTw8X19fOworCW1vdnVwcwkkaW5vdXQwLCgkb3V0KQorCWptcAkuTGVjYl9yZXQKKy5hbGlnbgkxNgorLkxlY2JfZGVjX3R3bzoKKwl4b3JwcwkkaW5vdXQyLCRpbm91dDIKKwljYWxsCV9hZXNuaV9kZWNyeXB0MworCW1vdnVwcwkkaW5vdXQwLCgkb3V0KQorCW1vdnVwcwkkaW5vdXQxLDB4MTAoJG91dCkKKwlqbXAJLkxlY2JfcmV0CisuYWxpZ24JMTYKKy5MZWNiX2RlY190aHJlZToKKwljYWxsCV9hZXNuaV9kZWNyeXB0MworCW1vdnVwcwkkaW5vdXQwLCgkb3V0KQorCW1vdnVwcwkkaW5vdXQxLDB4MTAoJG91dCkKKwltb3Z1cHMJJGlub3V0MiwweDIwKCRvdXQpCisJam1wCS5MZWNiX3JldAorLmFsaWduCTE2CisuTGVjYl9kZWNfZm91cjoKKwljYWxsCV9hZXNuaV9kZWNyeXB0NAorCW1vdnVwcwkkaW5vdXQwLCgkb3V0KQorCW1vdnVwcwkkaW5vdXQxLDB4MTAoJG91dCkKKwltb3Z1cHMJJGlub3V0MiwweDIwKCRvdXQpCisJbW92dXBzCSRpbm91dDMsMHgzMCgkb3V0KQorCWptcAkuTGVjYl9yZXQKKy5hbGlnbgkxNgorLkxlY2JfZGVjX2ZpdmU6CisJeG9ycHMJJGlub3V0NSwkaW5vdXQ1CisJY2FsbAlfYWVzbmlfZGVjcnlwdDYKKwltb3Z1cHMJJGlub3V0MCwoJG91dCkKKwltb3Z1cHMJJGlub3V0MSwweDEwKCRvdXQpCisJbW92dXBzCSRpbm91dDIsMHgyMCgkb3V0KQorCW1vdnVwcwkkaW5vdXQzLDB4MzAoJG91dCkKKwltb3Z1cHMJJGlub3V0NCwweDQwKCRvdXQpCisJam1wCS5MZWNiX3JldAorLmFsaWduCTE2CisuTGVjYl9kZWNfc2l4OgorCWNhbGwJX2Flc25pX2RlY3J5cHQ2CisJbW92dXBzCSRpbm91dDAsKCRvdXQpCisJbW92dXBzCSRpbm91dDEsMHgxMCgkb3V0KQorCW1vdnVwcwkkaW5vdXQyLDB4MjAoJG91dCkKKwltb3Z1cHMJJGlub3V0MywweDMwKCRvdXQpCisJbW92dXBzCSRpbm91dDQsMHg0MCgkb3V0KQorCW1vdnVwcwkkaW5vdXQ1LDB4NTAoJG91dCkKKworLkxlY2JfcmV0OgorCXJldAorLnNpemUJYWVzbmlfZWNiX2VuY3J5cHQsLi1hZXNuaV9lY2JfZW5jcnlwdAorX19fCisMCit7CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHZvaWQgYWVzbmlfY2NtNjRfW2VufGRlXWNyeXB0X2Jsb2NrcyAoY29uc3Qgdm9pZCAqaW4sIHZvaWQgKm91dCwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJsb2NrcywgY29uc3QgQUVTX0tFWSAqa2V5LAorIyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICppdmVjLGNoYXIgKmNtYWMpOworIworIyBIYW5kbGVzIG9ubHkgY29tcGxldGUgYmxvY2tzLCBvcGVyYXRlcyBvbiA2NC1iaXQgY291bnRlciBhbmQKKyMgZG9lcyBub3QgdXBkYXRlICppdmVjISBOb3IgZG9lcyBpdCBmaW5hbGl6ZSBDTUFDIHZhbHVlCisjIChzZWUgZW5naW5lL2VuZ19hZXNuaS5jIGZvciBkZXRhaWxzKQorIworeworbXkgJGNtYWM9IiVyOSI7CSMgNnRoIGFyZ3VtZW50CisKK215ICRpbmNyZW1lbnQ9IiV4bW02IjsKK215ICRic3dhcF9tYXNrPSIleG1tNyI7CisKKyRjb2RlLj08PF9fXzsKKy5nbG9ibAlhZXNuaV9jY202NF9lbmNyeXB0X2Jsb2NrcworLnR5cGUJYWVzbmlfY2NtNjRfZW5jcnlwdF9ibG9ja3MsXEBmdW5jdGlvbiw2CisuYWxpZ24JMTYKK2Flc25pX2NjbTY0X2VuY3J5cHRfYmxvY2tzOgorX19fCiskY29kZS49PDxfX18gaWYgKCR3aW42NCk7CisJbGVhCS0weDU4KCVyc3ApLCVyc3AKKwltb3ZhcHMJJXhtbTYsKCVyc3ApCisJbW92YXBzCSV4bW03LDB4MTAoJXJzcCkKKwltb3ZhcHMJJXhtbTgsMHgyMCglcnNwKQorCW1vdmFwcwkleG1tOSwweDMwKCVyc3ApCisuTGNjbTY0X2VuY19ib2R5OgorX19fCiskY29kZS49PDxfX187CisJbW92CTI0MCgka2V5KSwkcm91bmRzCQkjIGtleS0+cm91bmRzCisJbW92ZHF1CSgkaXZwKSwkaXYKKwltb3ZkcWEJLkxpbmNyZW1lbnQ2NCglcmlwKSwkaW5jcmVtZW50CisJbW92ZHFhCS5MYnN3YXBfbWFzayglcmlwKSwkYnN3YXBfbWFzaworCisJc2hyCVwkMSwkcm91bmRzCisJbGVhCTAoJGtleSksJGtleV8KKwltb3ZkcXUJKCRjbWFjKSwkaW5vdXQxCisJbW92ZHFhCSRpdiwkaW5vdXQwCisJbW92CSRyb3VuZHMsJHJuZHNfCisJcHNodWZiCSRic3dhcF9tYXNrLCRpdgorCWptcAkuTGNjbTY0X2VuY19vdXRlcgorLmFsaWduCTE2CisuTGNjbTY0X2VuY19vdXRlcjoKKwkkbW92a2V5CSgka2V5XyksJHJuZGtleTAKKwltb3YJJHJuZHNfLCRyb3VuZHMKKwltb3Z1cHMJKCRpbnApLCRpbjAJCQkjIGxvYWQgaW5wCisKKwl4b3Jwcwkkcm5ka2V5MCwkaW5vdXQwCQkjIGNvdW50ZXIKKwkkbW92a2V5CTE2KCRrZXlfKSwkcm5ka2V5MQorCXhvcnBzCSRpbjAsJHJuZGtleTAKKwlsZWEJMzIoJGtleV8pLCRrZXkKKwl4b3Jwcwkkcm5ka2V5MCwkaW5vdXQxCQkjIGNtYWNePWlucAorCSRtb3ZrZXkJKCRrZXkpLCRybmRrZXkwCisKKy5MY2NtNjRfZW5jMl9sb29wOgorCWFlc2VuYwkkcm5ka2V5MSwkaW5vdXQwCisJZGVjCSRyb3VuZHMKKwlhZXNlbmMJJHJuZGtleTEsJGlub3V0MQorCSRtb3ZrZXkJMTYoJGtleSksJHJuZGtleTEKKwlhZXNlbmMJJHJuZGtleTAsJGlub3V0MAorCWxlYQkzMigka2V5KSwka2V5CisJYWVzZW5jCSRybmRrZXkwLCRpbm91dDEKKwkkbW92a2V5CTAoJGtleSksJHJuZGtleTAKKwlqbnoJLkxjY202NF9lbmMyX2xvb3AKKwlhZXNlbmMJJHJuZGtleTEsJGlub3V0MAorCWFlc2VuYwkkcm5ka2V5MSwkaW5vdXQxCisJcGFkZHEJJGluY3JlbWVudCwkaXYKKwlhZXNlbmNsYXN0CSRybmRrZXkwLCRpbm91dDAKKwlhZXNlbmNsYXN0CSRybmRrZXkwLCRpbm91dDEKKworCWRlYwkkbGVuCisJbGVhCTE2KCRpbnApLCRpbnAKKwl4b3JwcwkkaW5vdXQwLCRpbjAJCQkjIGlucCBePSBFKGl2KQorCW1vdmRxYQkkaXYsJGlub3V0MAorCW1vdnVwcwkkaW4wLCgkb3V0KQkJCSMgc2F2ZSBvdXRwdXQKKwlsZWEJMTYoJG91dCksJG91dAorCXBzaHVmYgkkYnN3YXBfbWFzaywkaW5vdXQwCisJam56CS5MY2NtNjRfZW5jX291dGVyCisKKwltb3Z1cHMJJGlub3V0MSwoJGNtYWMpCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJHdpbjY0KTsKKwltb3ZhcHMJKCVyc3ApLCV4bW02CisJbW92YXBzCTB4MTAoJXJzcCksJXhtbTcKKwltb3ZhcHMJMHgyMCglcnNwKSwleG1tOAorCW1vdmFwcwkweDMwKCVyc3ApLCV4bW05CisJbGVhCTB4NTgoJXJzcCksJXJzcAorLkxjY202NF9lbmNfcmV0OgorX19fCiskY29kZS49PDxfX187CisJcmV0Cisuc2l6ZQlhZXNuaV9jY202NF9lbmNyeXB0X2Jsb2NrcywuLWFlc25pX2NjbTY0X2VuY3J5cHRfYmxvY2tzCitfX18KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyRjb2RlLj08PF9fXzsKKy5nbG9ibAlhZXNuaV9jY202NF9kZWNyeXB0X2Jsb2NrcworLnR5cGUJYWVzbmlfY2NtNjRfZGVjcnlwdF9ibG9ja3MsXEBmdW5jdGlvbiw2CisuYWxpZ24JMTYKK2Flc25pX2NjbTY0X2RlY3J5cHRfYmxvY2tzOgorX19fCiskY29kZS49PDxfX18gaWYgKCR3aW42NCk7CisJbGVhCS0weDU4KCVyc3ApLCVyc3AKKwltb3ZhcHMJJXhtbTYsKCVyc3ApCisJbW92YXBzCSV4bW03LDB4MTAoJXJzcCkKKwltb3ZhcHMJJXhtbTgsMHgyMCglcnNwKQorCW1vdmFwcwkleG1tOSwweDMwKCVyc3ApCisuTGNjbTY0X2RlY19ib2R5OgorX19fCiskY29kZS49PDxfX187CisJbW92CTI0MCgka2V5KSwkcm91bmRzCQkjIGtleS0+cm91bmRzCisJbW92dXBzCSgkaXZwKSwkaXYKKwltb3ZkcXUJKCRjbWFjKSwkaW5vdXQxCisJbW92ZHFhCS5MaW5jcmVtZW50NjQoJXJpcCksJGluY3JlbWVudAorCW1vdmRxYQkuTGJzd2FwX21hc2soJXJpcCksJGJzd2FwX21hc2sKKworCW1vdmFwcwkkaXYsJGlub3V0MAorCW1vdgkkcm91bmRzLCRybmRzXworCW1vdgkka2V5LCRrZXlfCisJcHNodWZiCSRic3dhcF9tYXNrLCRpdgorX19fCisJJmFlc25pX2dlbmVyYXRlMSgiZW5jIiwka2V5LCRyb3VuZHMpOworJGNvZGUuPTw8X19fOworCW1vdnVwcwkoJGlucCksJGluMAkJCSMgbG9hZCBpbnAKKwlwYWRkcQkkaW5jcmVtZW50LCRpdgorCWxlYQkxNigkaW5wKSwkaW5wCisJam1wCS5MY2NtNjRfZGVjX291dGVyCisuYWxpZ24JMTYKKy5MY2NtNjRfZGVjX291dGVyOgorCXhvcnBzCSRpbm91dDAsJGluMAkJCSMgaW5wIF49IEUoaXYpCisJbW92ZHFhCSRpdiwkaW5vdXQwCisJbW92CSRybmRzXywkcm91bmRzCisJbW92dXBzCSRpbjAsKCRvdXQpCQkJIyBzYXZlIG91dHB1dAorCWxlYQkxNigkb3V0KSwkb3V0CisJcHNodWZiCSRic3dhcF9tYXNrLCRpbm91dDAKKworCXN1YglcJDEsJGxlbgorCWp6CS5MY2NtNjRfZGVjX2JyZWFrCisKKwkkbW92a2V5CSgka2V5XyksJHJuZGtleTAKKwlzaHIJXCQxLCRyb3VuZHMKKwkkbW92a2V5CTE2KCRrZXlfKSwkcm5ka2V5MQorCXhvcnBzCSRybmRrZXkwLCRpbjAKKwlsZWEJMzIoJGtleV8pLCRrZXkKKwl4b3Jwcwkkcm5ka2V5MCwkaW5vdXQwCisJeG9ycHMJJGluMCwkaW5vdXQxCQkJIyBjbWFjXj1vdXQKKwkkbW92a2V5CSgka2V5KSwkcm5ka2V5MAorCisuTGNjbTY0X2RlYzJfbG9vcDoKKwlhZXNlbmMJJHJuZGtleTEsJGlub3V0MAorCWRlYwkkcm91bmRzCisJYWVzZW5jCSRybmRrZXkxLCRpbm91dDEKKwkkbW92a2V5CTE2KCRrZXkpLCRybmRrZXkxCisJYWVzZW5jCSRybmRrZXkwLCRpbm91dDAKKwlsZWEJMzIoJGtleSksJGtleQorCWFlc2VuYwkkcm5ka2V5MCwkaW5vdXQxCisJJG1vdmtleQkwKCRrZXkpLCRybmRrZXkwCisJam56CS5MY2NtNjRfZGVjMl9sb29wCisJbW92dXBzCSgkaW5wKSwkaW4wCQkJIyBsb2FkIGlucAorCXBhZGRxCSRpbmNyZW1lbnQsJGl2CisJYWVzZW5jCSRybmRrZXkxLCRpbm91dDAKKwlhZXNlbmMJJHJuZGtleTEsJGlub3V0MQorCWxlYQkxNigkaW5wKSwkaW5wCisJYWVzZW5jbGFzdAkkcm5ka2V5MCwkaW5vdXQwCisJYWVzZW5jbGFzdAkkcm5ka2V5MCwkaW5vdXQxCisJam1wCS5MY2NtNjRfZGVjX291dGVyCisKKy5hbGlnbgkxNgorLkxjY202NF9kZWNfYnJlYWs6CisJI3hvcnBzCSRpbjAsJGlub3V0MQkJCSMgY21hY149b3V0CitfX18KKwkmYWVzbmlfZ2VuZXJhdGUxKCJlbmMiLCRrZXlfLCRyb3VuZHMsJGlub3V0MSwkaW4wKTsKKyRjb2RlLj08PF9fXzsKKwltb3Z1cHMJJGlub3V0MSwoJGNtYWMpCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJHdpbjY0KTsKKwltb3ZhcHMJKCVyc3ApLCV4bW02CisJbW92YXBzCTB4MTAoJXJzcCksJXhtbTcKKwltb3ZhcHMJMHgyMCglcnNwKSwleG1tOAorCW1vdmFwcwkweDMwKCVyc3ApLCV4bW05CisJbGVhCTB4NTgoJXJzcCksJXJzcAorLkxjY202NF9kZWNfcmV0OgorX19fCiskY29kZS49PDxfX187CisJcmV0Cisuc2l6ZQlhZXNuaV9jY202NF9kZWNyeXB0X2Jsb2NrcywuLWFlc25pX2NjbTY0X2RlY3J5cHRfYmxvY2tzCitfX18KK30MCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHZvaWQgYWVzbmlfY3RyMzJfZW5jcnlwdF9ibG9ja3MgKGNvbnN0IHZvaWQgKmluLCB2b2lkICpvdXQsCisjICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBibG9ja3MsIGNvbnN0IEFFU19LRVkgKmtleSwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaXZlYyk7CisjCisjIEhhbmRsZXMgb25seSBjb21wbGV0ZSBibG9ja3MsIG9wZXJhdGVzIG9uIDMyLWJpdCBjb3VudGVyIGFuZAorIyBkb2VzIG5vdCB1cGRhdGUgKml2ZWMhIChzZWUgZW5naW5lL2VuZ19hZXNuaS5jIGZvciBkZXRhaWxzKQorIworeworbXkgJHJlc2VydmVkID0gJHdpbjY0PzA6LTB4Mjg7CitteSAoJGluMCwkaW4xLCRpbjIsJGluMyk9bWFwKCIleG1tJF8iLCg4Li4xMSkpOworbXkgKCRpdjAsJGl2MSwkaXZlYyk9KCIleG1tMTIiLCIleG1tMTMiLCIleG1tMTQiKTsKK215ICRic3dhcF9tYXNrPSIleG1tMTUiOworCiskY29kZS49PDxfX187CisuZ2xvYmwJYWVzbmlfY3RyMzJfZW5jcnlwdF9ibG9ja3MKKy50eXBlCWFlc25pX2N0cjMyX2VuY3J5cHRfYmxvY2tzLFxAZnVuY3Rpb24sNQorLmFsaWduCTE2CithZXNuaV9jdHIzMl9lbmNyeXB0X2Jsb2NrczoKK19fXworJGNvZGUuPTw8X19fIGlmICgkd2luNjQpOworCWxlYQktMHhjOCglcnNwKSwlcnNwCisJbW92YXBzCSV4bW02LDB4MjAoJXJzcCkKKwltb3ZhcHMJJXhtbTcsMHgzMCglcnNwKQorCW1vdmFwcwkleG1tOCwweDQwKCVyc3ApCisJbW92YXBzCSV4bW05LDB4NTAoJXJzcCkKKwltb3ZhcHMJJXhtbTEwLDB4NjAoJXJzcCkKKwltb3ZhcHMJJXhtbTExLDB4NzAoJXJzcCkKKwltb3ZhcHMJJXhtbTEyLDB4ODAoJXJzcCkKKwltb3ZhcHMJJXhtbTEzLDB4OTAoJXJzcCkKKwltb3ZhcHMJJXhtbTE0LDB4YTAoJXJzcCkKKwltb3ZhcHMJJXhtbTE1LDB4YjAoJXJzcCkKKy5MY3RyMzJfYm9keToKK19fXworJGNvZGUuPTw8X19fOworCWNtcAlcJDEsJGxlbgorCWplCS5MY3RyMzJfb25lX3Nob3J0Y3V0CisKKwltb3ZkcXUJKCRpdnApLCRpdmVjCisJbW92ZHFhCS5MYnN3YXBfbWFzayglcmlwKSwkYnN3YXBfbWFzaworCXhvcgkkcm91bmRzLCRyb3VuZHMKKwlwZXh0cmQJXCQzLCRpdmVjLCRybmRzXwkJIyBwdWxsIDMyLWJpdCBjb3VudGVyCisJcGluc3JkCVwkMywkcm91bmRzLCRpdmVjCQkjIHdpcGUgMzItYml0IGNvdW50ZXIKKworCW1vdgkyNDAoJGtleSksJHJvdW5kcwkJIyBrZXktPnJvdW5kcworCWJzd2FwCSRybmRzXworCXB4b3IJJGl2MCwkaXYwCQkJIyB2ZWN0b3Igb2YgMyAzMi1iaXQgY291bnRlcnMKKwlweG9yCSRpdjEsJGl2MQkJCSMgdmVjdG9yIG9mIDMgMzItYml0IGNvdW50ZXJzCisJcGluc3JkCVwkMCwkcm5kc18sJGl2MAorCWxlYQkzKCRybmRzXyksJGtleV8KKwlwaW5zcmQJXCQwLCRrZXlfLCRpdjEKKwlpbmMJJHJuZHNfCisJcGluc3JkCVwkMSwkcm5kc18sJGl2MAorCWluYwkka2V5XworCXBpbnNyZAlcJDEsJGtleV8sJGl2MQorCWluYwkkcm5kc18KKwlwaW5zcmQJXCQyLCRybmRzXywkaXYwCisJaW5jCSRrZXlfCisJcGluc3JkCVwkMiwka2V5XywkaXYxCisJbW92ZHFhCSRpdjAsJHJlc2VydmVkKCVyc3ApCisJcHNodWZiCSRic3dhcF9tYXNrLCRpdjAKKwltb3ZkcWEJJGl2MSxgJHJlc2VydmVkKzB4MTBgKCVyc3ApCisJcHNodWZiCSRic3dhcF9tYXNrLCRpdjEKKworCXBzaHVmZAlcJGAzPDw2YCwkaXYwLCRpbm91dDAJCSMgcGxhY2UgY291bnRlciB0byB1cHBlciBkd29yZAorCXBzaHVmZAlcJGAyPDw2YCwkaXYwLCRpbm91dDEKKwlwc2h1ZmQJXCRgMTw8NmAsJGl2MCwkaW5vdXQyCisJY21wCVwkNiwkbGVuCisJamIJLkxjdHIzMl90YWlsCisJc2hyCVwkMSwkcm91bmRzCisJbW92CSRrZXksJGtleV8JCQkjIGJhY2t1cCAka2V5CisJbW92CSRyb3VuZHMsJHJuZHNfCQkJIyBiYWNrdXAgJHJvdW5kcworCXN1YglcJDYsJGxlbgorCWptcAkuTGN0cjMyX2xvb3A2CisKKy5hbGlnbgkxNgorLkxjdHIzMl9sb29wNjoKKwlwc2h1ZmQJXCRgMzw8NmAsJGl2MSwkaW5vdXQzCisJcG9yCSRpdmVjLCRpbm91dDAJCQkjIG1lcmdlIGNvdW50ZXItbGVzcyBpdmVjCisJICRtb3ZrZXkJKCRrZXlfKSwkcm5ka2V5MAorCXBzaHVmZAlcJGAyPDw2YCwkaXYxLCRpbm91dDQKKwlwb3IJJGl2ZWMsJGlub3V0MQorCSAkbW92a2V5CTE2KCRrZXlfKSwkcm5ka2V5MQorCXBzaHVmZAlcJGAxPDw2YCwkaXYxLCRpbm91dDUKKwlwb3IJJGl2ZWMsJGlub3V0MgorCXBvcgkkaXZlYywkaW5vdXQzCisJIHhvcnBzCQkkcm5ka2V5MCwkaW5vdXQwCisJcG9yCSRpdmVjLCRpbm91dDQKKwlwb3IJJGl2ZWMsJGlub3V0NQorCisJIyBpbmxpbmUgX2Flc25pX2VuY3J5cHQ2IGFuZCBpbnRlcmxlYXZlIGxhc3Qgcm91bmRzCisJIyB3aXRoIG93biBjb2RlLi4uCisKKwlweG9yCQkkcm5ka2V5MCwkaW5vdXQxCisJYWVzZW5jCQkkcm5ka2V5MSwkaW5vdXQwCisJbGVhCQkzMigka2V5XyksJGtleQorCXB4b3IJCSRybmRrZXkwLCRpbm91dDIKKwlhZXNlbmMJCSRybmRrZXkxLCRpbm91dDEKKwkgbW92ZHFhCQkuTGluY3JlbWVudDMyKCVyaXApLCRpdjEKKwlweG9yCQkkcm5ka2V5MCwkaW5vdXQzCisJYWVzZW5jCQkkcm5ka2V5MSwkaW5vdXQyCisJIG1vdmRxYQkJJHJlc2VydmVkKCVyc3ApLCRpdjAKKwlweG9yCQkkcm5ka2V5MCwkaW5vdXQ0CisJYWVzZW5jCQkkcm5ka2V5MSwkaW5vdXQzCisJcHhvcgkJJHJuZGtleTAsJGlub3V0NQorCSRtb3ZrZXkJCSgka2V5KSwkcm5ka2V5MAorCWRlYwkJJHJvdW5kcworCWFlc2VuYwkJJHJuZGtleTEsJGlub3V0NAorCWFlc2VuYwkJJHJuZGtleTEsJGlub3V0NQorCWptcAkJLkxjdHIzMl9lbmNfbG9vcDZfZW50ZXIKKy5hbGlnbgkxNgorLkxjdHIzMl9lbmNfbG9vcDY6CisJYWVzZW5jCQkkcm5ka2V5MSwkaW5vdXQwCisJYWVzZW5jCQkkcm5ka2V5MSwkaW5vdXQxCisJZGVjCQkkcm91bmRzCisJYWVzZW5jCQkkcm5ka2V5MSwkaW5vdXQyCisJYWVzZW5jCQkkcm5ka2V5MSwkaW5vdXQzCisJYWVzZW5jCQkkcm5ka2V5MSwkaW5vdXQ0CisJYWVzZW5jCQkkcm5ka2V5MSwkaW5vdXQ1CisuTGN0cjMyX2VuY19sb29wNl9lbnRlcjoKKwkkbW92a2V5CQkxNigka2V5KSwkcm5ka2V5MQorCWFlc2VuYwkJJHJuZGtleTAsJGlub3V0MAorCWFlc2VuYwkJJHJuZGtleTAsJGlub3V0MQorCWxlYQkJMzIoJGtleSksJGtleQorCWFlc2VuYwkJJHJuZGtleTAsJGlub3V0MgorCWFlc2VuYwkJJHJuZGtleTAsJGlub3V0MworCWFlc2VuYwkJJHJuZGtleTAsJGlub3V0NAorCWFlc2VuYwkJJHJuZGtleTAsJGlub3V0NQorCSRtb3ZrZXkJCSgka2V5KSwkcm5ka2V5MAorCWpuegkJLkxjdHIzMl9lbmNfbG9vcDYKKworCWFlc2VuYwkJJHJuZGtleTEsJGlub3V0MAorCSBwYWRkZAkJJGl2MSwkaXYwCQkjIGluY3JlbWVudCBjb3VudGVyIHZlY3RvcgorCWFlc2VuYwkJJHJuZGtleTEsJGlub3V0MQorCSBwYWRkZAkJYCRyZXNlcnZlZCsweDEwYCglcnNwKSwkaXYxCisJYWVzZW5jCQkkcm5ka2V5MSwkaW5vdXQyCisJIG1vdmRxYQkJJGl2MCwkcmVzZXJ2ZWQoJXJzcCkJIyBzYXZlIGNvdW50ZXIgdmVjdG9yCisJYWVzZW5jCQkkcm5ka2V5MSwkaW5vdXQzCisJIG1vdmRxYQkJJGl2MSxgJHJlc2VydmVkKzB4MTBgKCVyc3ApCisJYWVzZW5jCQkkcm5ka2V5MSwkaW5vdXQ0CisJIHBzaHVmYgkJJGJzd2FwX21hc2ssJGl2MAkjIGJ5dGUgc3dhcAorCWFlc2VuYwkJJHJuZGtleTEsJGlub3V0NQorCSBwc2h1ZmIJCSRic3dhcF9tYXNrLCRpdjEKKworCWFlc2VuY2xhc3QJJHJuZGtleTAsJGlub3V0MAorCSBtb3Z1cHMJCSgkaW5wKSwkaW4wCQkjIGxvYWQgaW5wdXQKKwlhZXNlbmNsYXN0CSRybmRrZXkwLCRpbm91dDEKKwkgbW92dXBzCQkweDEwKCRpbnApLCRpbjEKKwlhZXNlbmNsYXN0CSRybmRrZXkwLCRpbm91dDIKKwkgbW92dXBzCQkweDIwKCRpbnApLCRpbjIKKwlhZXNlbmNsYXN0CSRybmRrZXkwLCRpbm91dDMKKwkgbW92dXBzCQkweDMwKCRpbnApLCRpbjMKKwlhZXNlbmNsYXN0CSRybmRrZXkwLCRpbm91dDQKKwkgbW92dXBzCQkweDQwKCRpbnApLCRybmRrZXkxCisJYWVzZW5jbGFzdAkkcm5ka2V5MCwkaW5vdXQ1CisJIG1vdnVwcwkJMHg1MCgkaW5wKSwkcm5ka2V5MAorCSBsZWEJMHg2MCgkaW5wKSwkaW5wCisKKwl4b3JwcwkkaW5vdXQwLCRpbjAJCQkjIHhvcgorCSBwc2h1ZmQJXCRgMzw8NmAsJGl2MCwkaW5vdXQwCisJeG9ycHMJJGlub3V0MSwkaW4xCisJIHBzaHVmZAlcJGAyPDw2YCwkaXYwLCRpbm91dDEKKwltb3Z1cHMJJGluMCwoJG91dCkJCQkjIHN0b3JlIG91dHB1dAorCXhvcnBzCSRpbm91dDIsJGluMgorCSBwc2h1ZmQJXCRgMTw8NmAsJGl2MCwkaW5vdXQyCisJbW92dXBzCSRpbjEsMHgxMCgkb3V0KQorCXhvcnBzCSRpbm91dDMsJGluMworCW1vdnVwcwkkaW4yLDB4MjAoJG91dCkKKwl4b3JwcwkkaW5vdXQ0LCRybmRrZXkxCisJbW92dXBzCSRpbjMsMHgzMCgkb3V0KQorCXhvcnBzCSRpbm91dDUsJHJuZGtleTAKKwltb3Z1cHMJJHJuZGtleTEsMHg0MCgkb3V0KQorCW1vdnVwcwkkcm5ka2V5MCwweDUwKCRvdXQpCisJbGVhCTB4NjAoJG91dCksJG91dAorCW1vdgkkcm5kc18sJHJvdW5kcworCXN1YglcJDYsJGxlbgorCWpuYwkuTGN0cjMyX2xvb3A2CisKKwlhZGQJXCQ2LCRsZW4KKwlqegkuTGN0cjMyX2RvbmUKKwltb3YJJGtleV8sJGtleQkJCSMgcmVzdG9yZSAka2V5CisJbGVhCTEoJHJvdW5kcywkcm91bmRzKSwkcm91bmRzCSMgcmVzdG9yZSBvcmlnaW5hbCB2YWx1ZQorCisuTGN0cjMyX3RhaWw6CisJcG9yCSRpdmVjLCRpbm91dDAKKwltb3Z1cHMJKCRpbnApLCRpbjAKKwljbXAJXCQyLCRsZW4KKwlqYgkuTGN0cjMyX29uZQorCisJcG9yCSRpdmVjLCRpbm91dDEKKwltb3Z1cHMJMHgxMCgkaW5wKSwkaW4xCisJamUJLkxjdHIzMl90d28KKworCXBzaHVmZAlcJGAzPDw2YCwkaXYxLCRpbm91dDMKKwlwb3IJJGl2ZWMsJGlub3V0MgorCW1vdnVwcwkweDIwKCRpbnApLCRpbjIKKwljbXAJXCQ0LCRsZW4KKwlqYgkuTGN0cjMyX3RocmVlCisKKwlwc2h1ZmQJXCRgMjw8NmAsJGl2MSwkaW5vdXQ0CisJcG9yCSRpdmVjLCRpbm91dDMKKwltb3Z1cHMJMHgzMCgkaW5wKSwkaW4zCisJamUJLkxjdHIzMl9mb3VyCisKKwlwb3IJJGl2ZWMsJGlub3V0NAorCXhvcnBzCSRpbm91dDUsJGlub3V0NQorCisJY2FsbAlfYWVzbmlfZW5jcnlwdDYKKworCW1vdnVwcwkweDQwKCRpbnApLCRybmRrZXkxCisJeG9ycHMJJGlub3V0MCwkaW4wCisJeG9ycHMJJGlub3V0MSwkaW4xCisJbW92dXBzCSRpbjAsKCRvdXQpCisJeG9ycHMJJGlub3V0MiwkaW4yCisJbW92dXBzCSRpbjEsMHgxMCgkb3V0KQorCXhvcnBzCSRpbm91dDMsJGluMworCW1vdnVwcwkkaW4yLDB4MjAoJG91dCkKKwl4b3JwcwkkaW5vdXQ0LCRybmRrZXkxCisJbW92dXBzCSRpbjMsMHgzMCgkb3V0KQorCW1vdnVwcwkkcm5ka2V5MSwweDQwKCRvdXQpCisJam1wCS5MY3RyMzJfZG9uZQorCisuYWxpZ24JMTYKKy5MY3RyMzJfb25lX3Nob3J0Y3V0OgorCW1vdnVwcwkoJGl2cCksJGlub3V0MAorCW1vdnVwcwkoJGlucCksJGluMAorCW1vdgkyNDAoJGtleSksJHJvdW5kcwkJIyBrZXktPnJvdW5kcworLkxjdHIzMl9vbmU6CitfX18KKwkmYWVzbmlfZ2VuZXJhdGUxKCJlbmMiLCRrZXksJHJvdW5kcyk7CiskY29kZS49PDxfX187CisJeG9ycHMJJGlub3V0MCwkaW4wCisJbW92dXBzCSRpbjAsKCRvdXQpCisJam1wCS5MY3RyMzJfZG9uZQorCisuYWxpZ24JMTYKKy5MY3RyMzJfdHdvOgorCXhvcnBzCSRpbm91dDIsJGlub3V0MgorCWNhbGwJX2Flc25pX2VuY3J5cHQzCisJeG9ycHMJJGlub3V0MCwkaW4wCisJeG9ycHMJJGlub3V0MSwkaW4xCisJbW92dXBzCSRpbjAsKCRvdXQpCisJbW92dXBzCSRpbjEsMHgxMCgkb3V0KQorCWptcAkuTGN0cjMyX2RvbmUKKworLmFsaWduCTE2CisuTGN0cjMyX3RocmVlOgorCWNhbGwJX2Flc25pX2VuY3J5cHQzCisJeG9ycHMJJGlub3V0MCwkaW4wCisJeG9ycHMJJGlub3V0MSwkaW4xCisJbW92dXBzCSRpbjAsKCRvdXQpCisJeG9ycHMJJGlub3V0MiwkaW4yCisJbW92dXBzCSRpbjEsMHgxMCgkb3V0KQorCW1vdnVwcwkkaW4yLDB4MjAoJG91dCkKKwlqbXAJLkxjdHIzMl9kb25lCisKKy5hbGlnbgkxNgorLkxjdHIzMl9mb3VyOgorCWNhbGwJX2Flc25pX2VuY3J5cHQ0CisJeG9ycHMJJGlub3V0MCwkaW4wCisJeG9ycHMJJGlub3V0MSwkaW4xCisJbW92dXBzCSRpbjAsKCRvdXQpCisJeG9ycHMJJGlub3V0MiwkaW4yCisJbW92dXBzCSRpbjEsMHgxMCgkb3V0KQorCXhvcnBzCSRpbm91dDMsJGluMworCW1vdnVwcwkkaW4yLDB4MjAoJG91dCkKKwltb3Z1cHMJJGluMywweDMwKCRvdXQpCisKKy5MY3RyMzJfZG9uZToKK19fXworJGNvZGUuPTw8X19fIGlmICgkd2luNjQpOworCW1vdmFwcwkweDIwKCVyc3ApLCV4bW02CisJbW92YXBzCTB4MzAoJXJzcCksJXhtbTcKKwltb3ZhcHMJMHg0MCglcnNwKSwleG1tOAorCW1vdmFwcwkweDUwKCVyc3ApLCV4bW05CisJbW92YXBzCTB4NjAoJXJzcCksJXhtbTEwCisJbW92YXBzCTB4NzAoJXJzcCksJXhtbTExCisJbW92YXBzCTB4ODAoJXJzcCksJXhtbTEyCisJbW92YXBzCTB4OTAoJXJzcCksJXhtbTEzCisJbW92YXBzCTB4YTAoJXJzcCksJXhtbTE0CisJbW92YXBzCTB4YjAoJXJzcCksJXhtbTE1CisJbGVhCTB4YzgoJXJzcCksJXJzcAorLkxjdHIzMl9yZXQ6CitfX18KKyRjb2RlLj08PF9fXzsKKwlyZXQKKy5zaXplCWFlc25pX2N0cjMyX2VuY3J5cHRfYmxvY2tzLC4tYWVzbmlfY3RyMzJfZW5jcnlwdF9ibG9ja3MKK19fXworfQorDAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyB2b2lkIGFlc25pX3h0c19bZW58ZGVdY3J5cHQoY29uc3QgY2hhciAqaW5wLGNoYXIgKm91dCxzaXplX3QgbGVuLAorIwljb25zdCBBRVNfS0VZICprZXkxLCBjb25zdCBBRVNfS0VZICprZXkyCisjCWNvbnN0IHVuc2lnbmVkIGNoYXIgaXZbMTZdKTsKKyMKK3sKK215IEB0d2Vhaz1tYXAoIiV4bW0kXyIsKDEwLi4xNSkpOworbXkgKCR0d21hc2ssJHR3cmVzLCR0d3RtcCk9KCIleG1tOCIsIiV4bW05IixAdHdlYWtbNF0pOworbXkgKCRrZXkyLCRpdnAsJGxlbl8pPSgiJXI4IiwiJXI5IiwiJXI5Iik7CitteSAkZnJhbWVfc2l6ZSA9IDB4NjggKyAoJHdpbjY0PzE2MDowKTsKKworJGNvZGUuPTw8X19fOworLmdsb2JsCWFlc25pX3h0c19lbmNyeXB0CisudHlwZQlhZXNuaV94dHNfZW5jcnlwdCxcQGZ1bmN0aW9uLDYKKy5hbGlnbgkxNgorYWVzbmlfeHRzX2VuY3J5cHQ6CisJbGVhCS0kZnJhbWVfc2l6ZSglcnNwKSwlcnNwCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJHdpbjY0KTsKKwltb3ZhcHMJJXhtbTYsMHg2MCglcnNwKQorCW1vdmFwcwkleG1tNywweDcwKCVyc3ApCisJbW92YXBzCSV4bW04LDB4ODAoJXJzcCkKKwltb3ZhcHMJJXhtbTksMHg5MCglcnNwKQorCW1vdmFwcwkleG1tMTAsMHhhMCglcnNwKQorCW1vdmFwcwkleG1tMTEsMHhiMCglcnNwKQorCW1vdmFwcwkleG1tMTIsMHhjMCglcnNwKQorCW1vdmFwcwkleG1tMTMsMHhkMCglcnNwKQorCW1vdmFwcwkleG1tMTQsMHhlMCglcnNwKQorCW1vdmFwcwkleG1tMTUsMHhmMCglcnNwKQorLkx4dHNfZW5jX2JvZHk6CitfX18KKyRjb2RlLj08PF9fXzsKKwltb3Z1cHMJKCRpdnApLEB0d2Vha1s1XQkJIyBsb2FkIGNsZWFyLXRleHQgdHdlYWsKKwltb3YJMjQwKCVyOCksJHJvdW5kcwkJIyBrZXkyLT5yb3VuZHMKKwltb3YJMjQwKCRrZXkpLCRybmRzXwkJIyBrZXkxLT5yb3VuZHMKK19fXworCSMgZ2VuZXJhdGUgdGhlIHR3ZWFrCisJJmFlc25pX2dlbmVyYXRlMSgiZW5jIiwka2V5Miwkcm91bmRzLEB0d2Vha1s1XSk7CiskY29kZS49PDxfX187CisJbW92CSRrZXksJGtleV8JCQkjIGJhY2t1cCAka2V5CisJbW92CSRybmRzXywkcm91bmRzCQkJIyBiYWNrdXAgJHJvdW5kcworCW1vdgkkbGVuLCRsZW5fCQkJIyBiYWNrdXAgJGxlbgorCWFuZAlcJC0xNiwkbGVuCisKKwltb3ZkcWEJLkx4dHNfbWFnaWMoJXJpcCksJHR3bWFzaworCXB4b3IJJHR3dG1wLCR0d3RtcAorCXBjbXBndGQJQHR3ZWFrWzVdLCR0d3RtcAkJIyBicm9hZGNhc3QgdXBwZXIgYml0cworX19fCisgICAgZm9yICgkaT0wOyRpPDQ7JGkrKykgeworICAgICRjb2RlLj08PF9fXzsKKwlwc2h1ZmQJXCQweDEzLCR0d3RtcCwkdHdyZXMKKwlweG9yCSR0d3RtcCwkdHd0bXAKKwltb3ZkcWEJQHR3ZWFrWzVdLEB0d2Vha1skaV0KKwlwYWRkcQlAdHdlYWtbNV0sQHR3ZWFrWzVdCQkjIHBzbGxxCTEsJHR3ZWFrCisJcGFuZAkkdHdtYXNrLCR0d3JlcwkJCSMgaXNvbGF0ZSBjYXJyeSBhbmQgcmVzaWR1ZQorCXBjbXBndGQJQHR3ZWFrWzVdLCR0d3RtcAkJIyBicm9hZGNhdCB1cHBlciBiaXRzCisJcHhvcgkkdHdyZXMsQHR3ZWFrWzVdCitfX18KKyAgICB9CiskY29kZS49PDxfX187CisJc3ViCVwkMTYqNiwkbGVuCisJamMJLkx4dHNfZW5jX3Nob3J0CisKKwlzaHIJXCQxLCRyb3VuZHMKKwlzdWIJXCQxLCRyb3VuZHMKKwltb3YJJHJvdW5kcywkcm5kc18KKwlqbXAJLkx4dHNfZW5jX2dyYW5kbG9vcAorCisuYWxpZ24JMTYKKy5MeHRzX2VuY19ncmFuZGxvb3A6CisJcHNodWZkCVwkMHgxMywkdHd0bXAsJHR3cmVzCisJbW92ZHFhCUB0d2Vha1s1XSxAdHdlYWtbNF0KKwlwYWRkcQlAdHdlYWtbNV0sQHR3ZWFrWzVdCQkjIHBzbGxxIDEsJHR3ZWFrCisJbW92ZHF1CWAxNiowYCgkaW5wKSwkaW5vdXQwCQkjIGxvYWQgaW5wdXQKKwlwYW5kCSR0d21hc2ssJHR3cmVzCQkJIyBpc29sYXRlIGNhcnJ5IGFuZCByZXNpZHVlCisJbW92ZHF1CWAxNioxYCgkaW5wKSwkaW5vdXQxCisJcHhvcgkkdHdyZXMsQHR3ZWFrWzVdCisKKwltb3ZkcXUJYDE2KjJgKCRpbnApLCRpbm91dDIKKwlweG9yCUB0d2Vha1swXSwkaW5vdXQwCQkjIGlucHV0Xj10d2VhaworCW1vdmRxdQlgMTYqM2AoJGlucCksJGlub3V0MworCXB4b3IJQHR3ZWFrWzFdLCRpbm91dDEKKwltb3ZkcXUJYDE2KjRgKCRpbnApLCRpbm91dDQKKwlweG9yCUB0d2Vha1syXSwkaW5vdXQyCisJbW92ZHF1CWAxNio1YCgkaW5wKSwkaW5vdXQ1CisJbGVhCWAxNio2YCgkaW5wKSwkaW5wCisJcHhvcglAdHdlYWtbM10sJGlub3V0MworCSRtb3ZrZXkJCSgka2V5XyksJHJuZGtleTAKKwlweG9yCUB0d2Vha1s0XSwkaW5vdXQ0CisJcHhvcglAdHdlYWtbNV0sJGlub3V0NQorCisJIyBpbmxpbmUgX2Flc25pX2VuY3J5cHQ2IGFuZCBpbnRlcmxlYXZlIGZpcnN0IGFuZCBsYXN0IHJvdW5kcworCSMgd2l0aCBvd24gY29kZS4uLgorCSRtb3ZrZXkJCTE2KCRrZXlfKSwkcm5ka2V5MQorCXB4b3IJCSRybmRrZXkwLCRpbm91dDAKKwlweG9yCQkkcm5ka2V5MCwkaW5vdXQxCisJIG1vdmRxYQlAdHdlYWtbMF0sYDE2KjBgKCVyc3ApCQkjIHB1dCBhc2lkZSB0d2Vha3MKKwlhZXNlbmMJCSRybmRrZXkxLCRpbm91dDAKKwlsZWEJCTMyKCRrZXlfKSwka2V5CisJcHhvcgkJJHJuZGtleTAsJGlub3V0MgorCSBtb3ZkcWEJQHR3ZWFrWzFdLGAxNioxYCglcnNwKQorCWFlc2VuYwkJJHJuZGtleTEsJGlub3V0MQorCXB4b3IJCSRybmRrZXkwLCRpbm91dDMKKwkgbW92ZHFhCUB0d2Vha1syXSxgMTYqMmAoJXJzcCkKKwlhZXNlbmMJCSRybmRrZXkxLCRpbm91dDIKKwlweG9yCQkkcm5ka2V5MCwkaW5vdXQ0CisJIG1vdmRxYQlAdHdlYWtbM10sYDE2KjNgKCVyc3ApCisJYWVzZW5jCQkkcm5ka2V5MSwkaW5vdXQzCisJcHhvcgkJJHJuZGtleTAsJGlub3V0NQorCSRtb3ZrZXkJCSgka2V5KSwkcm5ka2V5MAorCWRlYwkJJHJvdW5kcworCSBtb3ZkcWEJQHR3ZWFrWzRdLGAxNio0YCglcnNwKQorCWFlc2VuYwkJJHJuZGtleTEsJGlub3V0NAorCSBtb3ZkcWEJQHR3ZWFrWzVdLGAxNio1YCglcnNwKQorCWFlc2VuYwkJJHJuZGtleTEsJGlub3V0NQorCXB4b3IJJHR3dG1wLCR0d3RtcAorCXBjbXBndGQJQHR3ZWFrWzVdLCR0d3RtcAorCWptcAkJLkx4dHNfZW5jX2xvb3A2X2VudGVyCisKKy5hbGlnbgkxNgorLkx4dHNfZW5jX2xvb3A2OgorCWFlc2VuYwkJJHJuZGtleTEsJGlub3V0MAorCWFlc2VuYwkJJHJuZGtleTEsJGlub3V0MQorCWRlYwkJJHJvdW5kcworCWFlc2VuYwkJJHJuZGtleTEsJGlub3V0MgorCWFlc2VuYwkJJHJuZGtleTEsJGlub3V0MworCWFlc2VuYwkJJHJuZGtleTEsJGlub3V0NAorCWFlc2VuYwkJJHJuZGtleTEsJGlub3V0NQorLkx4dHNfZW5jX2xvb3A2X2VudGVyOgorCSRtb3ZrZXkJCTE2KCRrZXkpLCRybmRrZXkxCisJYWVzZW5jCQkkcm5ka2V5MCwkaW5vdXQwCisJYWVzZW5jCQkkcm5ka2V5MCwkaW5vdXQxCisJbGVhCQkzMigka2V5KSwka2V5CisJYWVzZW5jCQkkcm5ka2V5MCwkaW5vdXQyCisJYWVzZW5jCQkkcm5ka2V5MCwkaW5vdXQzCisJYWVzZW5jCQkkcm5ka2V5MCwkaW5vdXQ0CisJYWVzZW5jCQkkcm5ka2V5MCwkaW5vdXQ1CisJJG1vdmtleQkJKCRrZXkpLCRybmRrZXkwCisJam56CQkuTHh0c19lbmNfbG9vcDYKKworCXBzaHVmZAlcJDB4MTMsJHR3dG1wLCR0d3JlcworCXB4b3IJJHR3dG1wLCR0d3RtcAorCXBhZGRxCUB0d2Vha1s1XSxAdHdlYWtbNV0JCSMgcHNsbHEJMSwkdHdlYWsKKwkgYWVzZW5jCQkkcm5ka2V5MSwkaW5vdXQwCisJcGFuZAkkdHdtYXNrLCR0d3JlcwkJCSMgaXNvbGF0ZSBjYXJyeSBhbmQgcmVzaWR1ZQorCSBhZXNlbmMJCSRybmRrZXkxLCRpbm91dDEKKwlwY21wZ3RkCUB0d2Vha1s1XSwkdHd0bXAJCSMgYnJvYWRjYXN0IHVwcGVyIGJpdHMKKwkgYWVzZW5jCQkkcm5ka2V5MSwkaW5vdXQyCisJcHhvcgkkdHdyZXMsQHR3ZWFrWzVdCisJIGFlc2VuYwkJJHJuZGtleTEsJGlub3V0MworCSBhZXNlbmMJCSRybmRrZXkxLCRpbm91dDQKKwkgYWVzZW5jCQkkcm5ka2V5MSwkaW5vdXQ1CisJICRtb3ZrZXkJMTYoJGtleSksJHJuZGtleTEKKworCXBzaHVmZAlcJDB4MTMsJHR3dG1wLCR0d3JlcworCXB4b3IJJHR3dG1wLCR0d3RtcAorCW1vdmRxYQlAdHdlYWtbNV0sQHR3ZWFrWzBdCisJcGFkZHEJQHR3ZWFrWzVdLEB0d2Vha1s1XQkJIyBwc2xscQkxLCR0d2VhaworCSBhZXNlbmMJCSRybmRrZXkwLCRpbm91dDAKKwlwYW5kCSR0d21hc2ssJHR3cmVzCQkJIyBpc29sYXRlIGNhcnJ5IGFuZCByZXNpZHVlCisJIGFlc2VuYwkJJHJuZGtleTAsJGlub3V0MQorCXBjbXBndGQJQHR3ZWFrWzVdLCR0d3RtcAkJIyBicm9hZGNhdCB1cHBlciBiaXRzCisJIGFlc2VuYwkJJHJuZGtleTAsJGlub3V0MgorCXB4b3IJJHR3cmVzLEB0d2Vha1s1XQorCSBhZXNlbmMJCSRybmRrZXkwLCRpbm91dDMKKwkgYWVzZW5jCQkkcm5ka2V5MCwkaW5vdXQ0CisJIGFlc2VuYwkJJHJuZGtleTAsJGlub3V0NQorCSAkbW92a2V5CTMyKCRrZXkpLCRybmRrZXkwCisKKwlwc2h1ZmQJXCQweDEzLCR0d3RtcCwkdHdyZXMKKwlweG9yCSR0d3RtcCwkdHd0bXAKKwltb3ZkcWEJQHR3ZWFrWzVdLEB0d2Vha1sxXQorCXBhZGRxCUB0d2Vha1s1XSxAdHdlYWtbNV0JCSMgcHNsbHEJMSwkdHdlYWsKKwkgYWVzZW5jCQkkcm5ka2V5MSwkaW5vdXQwCisJcGFuZAkkdHdtYXNrLCR0d3JlcwkJCSMgaXNvbGF0ZSBjYXJyeSBhbmQgcmVzaWR1ZQorCSBhZXNlbmMJCSRybmRrZXkxLCRpbm91dDEKKwlwY21wZ3RkCUB0d2Vha1s1XSwkdHd0bXAJCSMgYnJvYWRjYXQgdXBwZXIgYml0cworCSBhZXNlbmMJCSRybmRrZXkxLCRpbm91dDIKKwlweG9yCSR0d3JlcyxAdHdlYWtbNV0KKwkgYWVzZW5jCQkkcm5ka2V5MSwkaW5vdXQzCisJIGFlc2VuYwkJJHJuZGtleTEsJGlub3V0NAorCSBhZXNlbmMJCSRybmRrZXkxLCRpbm91dDUKKworCXBzaHVmZAlcJDB4MTMsJHR3dG1wLCR0d3JlcworCXB4b3IJJHR3dG1wLCR0d3RtcAorCW1vdmRxYQlAdHdlYWtbNV0sQHR3ZWFrWzJdCisJcGFkZHEJQHR3ZWFrWzVdLEB0d2Vha1s1XQkJIyBwc2xscQkxLCR0d2VhaworCSBhZXNlbmNsYXN0CSRybmRrZXkwLCRpbm91dDAKKwlwYW5kCSR0d21hc2ssJHR3cmVzCQkJIyBpc29sYXRlIGNhcnJ5IGFuZCByZXNpZHVlCisJIGFlc2VuY2xhc3QJJHJuZGtleTAsJGlub3V0MQorCXBjbXBndGQJQHR3ZWFrWzVdLCR0d3RtcAkJIyBicm9hZGNhdCB1cHBlciBiaXRzCisJIGFlc2VuY2xhc3QJJHJuZGtleTAsJGlub3V0MgorCXB4b3IJJHR3cmVzLEB0d2Vha1s1XQorCSBhZXNlbmNsYXN0CSRybmRrZXkwLCRpbm91dDMKKwkgYWVzZW5jbGFzdAkkcm5ka2V5MCwkaW5vdXQ0CisJIGFlc2VuY2xhc3QJJHJuZGtleTAsJGlub3V0NQorCisJcHNodWZkCVwkMHgxMywkdHd0bXAsJHR3cmVzCisJcHhvcgkkdHd0bXAsJHR3dG1wCisJbW92ZHFhCUB0d2Vha1s1XSxAdHdlYWtbM10KKwlwYWRkcQlAdHdlYWtbNV0sQHR3ZWFrWzVdCQkjIHBzbGxxCTEsJHR3ZWFrCisJIHhvcnBzCWAxNiowYCglcnNwKSwkaW5vdXQwCQkjIG91dHB1dF49dHdlYWsKKwlwYW5kCSR0d21hc2ssJHR3cmVzCQkJIyBpc29sYXRlIGNhcnJ5IGFuZCByZXNpZHVlCisJIHhvcnBzCWAxNioxYCglcnNwKSwkaW5vdXQxCisJcGNtcGd0ZAlAdHdlYWtbNV0sJHR3dG1wCQkjIGJyb2FkY2F0IHVwcGVyIGJpdHMKKwlweG9yCSR0d3JlcyxAdHdlYWtbNV0KKworCXhvcnBzCWAxNioyYCglcnNwKSwkaW5vdXQyCisJbW92dXBzCSRpbm91dDAsYDE2KjBgKCRvdXQpCQkjIHdyaXRlIG91dHB1dAorCXhvcnBzCWAxNiozYCglcnNwKSwkaW5vdXQzCisJbW92dXBzCSRpbm91dDEsYDE2KjFgKCRvdXQpCisJeG9ycHMJYDE2KjRgKCVyc3ApLCRpbm91dDQKKwltb3Z1cHMJJGlub3V0MixgMTYqMmAoJG91dCkKKwl4b3JwcwlgMTYqNWAoJXJzcCksJGlub3V0NQorCW1vdnVwcwkkaW5vdXQzLGAxNiozYCgkb3V0KQorCW1vdgkkcm5kc18sJHJvdW5kcwkJCSMgcmVzdG9yZSAkcm91bmRzCisJbW92dXBzCSRpbm91dDQsYDE2KjRgKCRvdXQpCisJbW92dXBzCSRpbm91dDUsYDE2KjVgKCRvdXQpCisJbGVhCWAxNio2YCgkb3V0KSwkb3V0CisJc3ViCVwkMTYqNiwkbGVuCisJam5jCS5MeHRzX2VuY19ncmFuZGxvb3AKKworCWxlYQkzKCRyb3VuZHMsJHJvdW5kcyksJHJvdW5kcwkjIHJlc3RvcmUgb3JpZ2luYWwgdmFsdWUKKwltb3YJJGtleV8sJGtleQkJCSMgcmVzdG9yZSAka2V5CisJbW92CSRyb3VuZHMsJHJuZHNfCQkJIyBiYWNrdXAgJHJvdW5kcworCisuTHh0c19lbmNfc2hvcnQ6CisJYWRkCVwkMTYqNiwkbGVuCisJanoJLkx4dHNfZW5jX2RvbmUKKworCWNtcAlcJDB4MjAsJGxlbgorCWpiCS5MeHRzX2VuY19vbmUKKwlqZQkuTHh0c19lbmNfdHdvCisKKwljbXAJXCQweDQwLCRsZW4KKwlqYgkuTHh0c19lbmNfdGhyZWUKKwlqZQkuTHh0c19lbmNfZm91cgorCisJcHNodWZkCVwkMHgxMywkdHd0bXAsJHR3cmVzCisJbW92ZHFhCUB0d2Vha1s1XSxAdHdlYWtbNF0KKwlwYWRkcQlAdHdlYWtbNV0sQHR3ZWFrWzVdCQkjIHBzbGxxIDEsJHR3ZWFrCisJIG1vdmRxdQkoJGlucCksJGlub3V0MAorCXBhbmQJJHR3bWFzaywkdHdyZXMJCQkjIGlzb2xhdGUgY2FycnkgYW5kIHJlc2lkdWUKKwkgbW92ZHF1CTE2KjEoJGlucCksJGlub3V0MQorCXB4b3IJJHR3cmVzLEB0d2Vha1s1XQorCisJbW92ZHF1CTE2KjIoJGlucCksJGlub3V0MgorCXB4b3IJQHR3ZWFrWzBdLCRpbm91dDAKKwltb3ZkcXUJMTYqMygkaW5wKSwkaW5vdXQzCisJcHhvcglAdHdlYWtbMV0sJGlub3V0MQorCW1vdmRxdQkxNio0KCRpbnApLCRpbm91dDQKKwlsZWEJMTYqNSgkaW5wKSwkaW5wCisJcHhvcglAdHdlYWtbMl0sJGlub3V0MgorCXB4b3IJQHR3ZWFrWzNdLCRpbm91dDMKKwlweG9yCUB0d2Vha1s0XSwkaW5vdXQ0CisKKwljYWxsCV9hZXNuaV9lbmNyeXB0NgorCisJeG9ycHMJQHR3ZWFrWzBdLCRpbm91dDAKKwltb3ZkcWEJQHR3ZWFrWzVdLEB0d2Vha1swXQorCXhvcnBzCUB0d2Vha1sxXSwkaW5vdXQxCisJeG9ycHMJQHR3ZWFrWzJdLCRpbm91dDIKKwltb3ZkcXUJJGlub3V0MCwoJG91dCkKKwl4b3JwcwlAdHdlYWtbM10sJGlub3V0MworCW1vdmRxdQkkaW5vdXQxLDE2KjEoJG91dCkKKwl4b3JwcwlAdHdlYWtbNF0sJGlub3V0NAorCW1vdmRxdQkkaW5vdXQyLDE2KjIoJG91dCkKKwltb3ZkcXUJJGlub3V0MywxNiozKCRvdXQpCisJbW92ZHF1CSRpbm91dDQsMTYqNCgkb3V0KQorCWxlYQkxNio1KCRvdXQpLCRvdXQKKwlqbXAJLkx4dHNfZW5jX2RvbmUKKworLmFsaWduCTE2CisuTHh0c19lbmNfb25lOgorCW1vdnVwcwkoJGlucCksJGlub3V0MAorCWxlYQkxNioxKCRpbnApLCRpbnAKKwl4b3JwcwlAdHdlYWtbMF0sJGlub3V0MAorX19fCisJJmFlc25pX2dlbmVyYXRlMSgiZW5jIiwka2V5LCRyb3VuZHMpOworJGNvZGUuPTw8X19fOworCXhvcnBzCUB0d2Vha1swXSwkaW5vdXQwCisJbW92ZHFhCUB0d2Vha1sxXSxAdHdlYWtbMF0KKwltb3Z1cHMJJGlub3V0MCwoJG91dCkKKwlsZWEJMTYqMSgkb3V0KSwkb3V0CisJam1wCS5MeHRzX2VuY19kb25lCisKKy5hbGlnbgkxNgorLkx4dHNfZW5jX3R3bzoKKwltb3Z1cHMJKCRpbnApLCRpbm91dDAKKwltb3Z1cHMJMTYoJGlucCksJGlub3V0MQorCWxlYQkzMigkaW5wKSwkaW5wCisJeG9ycHMJQHR3ZWFrWzBdLCRpbm91dDAKKwl4b3JwcwlAdHdlYWtbMV0sJGlub3V0MQorCisJY2FsbAlfYWVzbmlfZW5jcnlwdDMKKworCXhvcnBzCUB0d2Vha1swXSwkaW5vdXQwCisJbW92ZHFhCUB0d2Vha1syXSxAdHdlYWtbMF0KKwl4b3JwcwlAdHdlYWtbMV0sJGlub3V0MQorCW1vdnVwcwkkaW5vdXQwLCgkb3V0KQorCW1vdnVwcwkkaW5vdXQxLDE2KjEoJG91dCkKKwlsZWEJMTYqMigkb3V0KSwkb3V0CisJam1wCS5MeHRzX2VuY19kb25lCisKKy5hbGlnbgkxNgorLkx4dHNfZW5jX3RocmVlOgorCW1vdnVwcwkoJGlucCksJGlub3V0MAorCW1vdnVwcwkxNioxKCRpbnApLCRpbm91dDEKKwltb3Z1cHMJMTYqMigkaW5wKSwkaW5vdXQyCisJbGVhCTE2KjMoJGlucCksJGlucAorCXhvcnBzCUB0d2Vha1swXSwkaW5vdXQwCisJeG9ycHMJQHR3ZWFrWzFdLCRpbm91dDEKKwl4b3JwcwlAdHdlYWtbMl0sJGlub3V0MgorCisJY2FsbAlfYWVzbmlfZW5jcnlwdDMKKworCXhvcnBzCUB0d2Vha1swXSwkaW5vdXQwCisJbW92ZHFhCUB0d2Vha1szXSxAdHdlYWtbMF0KKwl4b3JwcwlAdHdlYWtbMV0sJGlub3V0MQorCXhvcnBzCUB0d2Vha1syXSwkaW5vdXQyCisJbW92dXBzCSRpbm91dDAsKCRvdXQpCisJbW92dXBzCSRpbm91dDEsMTYqMSgkb3V0KQorCW1vdnVwcwkkaW5vdXQyLDE2KjIoJG91dCkKKwlsZWEJMTYqMygkb3V0KSwkb3V0CisJam1wCS5MeHRzX2VuY19kb25lCisKKy5hbGlnbgkxNgorLkx4dHNfZW5jX2ZvdXI6CisJbW92dXBzCSgkaW5wKSwkaW5vdXQwCisJbW92dXBzCTE2KjEoJGlucCksJGlub3V0MQorCW1vdnVwcwkxNioyKCRpbnApLCRpbm91dDIKKwl4b3JwcwlAdHdlYWtbMF0sJGlub3V0MAorCW1vdnVwcwkxNiozKCRpbnApLCRpbm91dDMKKwlsZWEJMTYqNCgkaW5wKSwkaW5wCisJeG9ycHMJQHR3ZWFrWzFdLCRpbm91dDEKKwl4b3JwcwlAdHdlYWtbMl0sJGlub3V0MgorCXhvcnBzCUB0d2Vha1szXSwkaW5vdXQzCisKKwljYWxsCV9hZXNuaV9lbmNyeXB0NAorCisJeG9ycHMJQHR3ZWFrWzBdLCRpbm91dDAKKwltb3ZkcWEJQHR3ZWFrWzVdLEB0d2Vha1swXQorCXhvcnBzCUB0d2Vha1sxXSwkaW5vdXQxCisJeG9ycHMJQHR3ZWFrWzJdLCRpbm91dDIKKwltb3Z1cHMJJGlub3V0MCwoJG91dCkKKwl4b3JwcwlAdHdlYWtbM10sJGlub3V0MworCW1vdnVwcwkkaW5vdXQxLDE2KjEoJG91dCkKKwltb3Z1cHMJJGlub3V0MiwxNioyKCRvdXQpCisJbW92dXBzCSRpbm91dDMsMTYqMygkb3V0KQorCWxlYQkxNio0KCRvdXQpLCRvdXQKKwlqbXAJLkx4dHNfZW5jX2RvbmUKKworLmFsaWduCTE2CisuTHh0c19lbmNfZG9uZToKKwlhbmQJXCQxNSwkbGVuXworCWp6CS5MeHRzX2VuY19yZXQKKwltb3YJJGxlbl8sJGxlbgorCisuTHh0c19lbmNfc3RlYWw6CisJbW92emIJKCRpbnApLCVlYXgJCQkjIGJvcnJvdyAkcm91bmRzIC4uLgorCW1vdnpiCS0xNigkb3V0KSwlZWN4CQkJIyAuLi4gYW5kICRrZXkKKwlsZWEJMSgkaW5wKSwkaW5wCisJbW92CSVhbCwtMTYoJG91dCkKKwltb3YJJWNsLDAoJG91dCkKKwlsZWEJMSgkb3V0KSwkb3V0CisJc3ViCVwkMSwkbGVuCisJam56CS5MeHRzX2VuY19zdGVhbAorCisJc3ViCSRsZW5fLCRvdXQJCQkjIHJld2luZCAkb3V0CisJbW92CSRrZXlfLCRrZXkJCQkjIHJlc3RvcmUgJGtleQorCW1vdgkkcm5kc18sJHJvdW5kcwkJCSMgcmVzdG9yZSAkcm91bmRzCisKKwltb3Z1cHMJLTE2KCRvdXQpLCRpbm91dDAKKwl4b3JwcwlAdHdlYWtbMF0sJGlub3V0MAorX19fCisJJmFlc25pX2dlbmVyYXRlMSgiZW5jIiwka2V5LCRyb3VuZHMpOworJGNvZGUuPTw8X19fOworCXhvcnBzCUB0d2Vha1swXSwkaW5vdXQwCisJbW92dXBzCSRpbm91dDAsLTE2KCRvdXQpCisKKy5MeHRzX2VuY19yZXQ6CitfX18KKyRjb2RlLj08PF9fXyBpZiAoJHdpbjY0KTsKKwltb3ZhcHMJMHg2MCglcnNwKSwleG1tNgorCW1vdmFwcwkweDcwKCVyc3ApLCV4bW03CisJbW92YXBzCTB4ODAoJXJzcCksJXhtbTgKKwltb3ZhcHMJMHg5MCglcnNwKSwleG1tOQorCW1vdmFwcwkweGEwKCVyc3ApLCV4bW0xMAorCW1vdmFwcwkweGIwKCVyc3ApLCV4bW0xMQorCW1vdmFwcwkweGMwKCVyc3ApLCV4bW0xMgorCW1vdmFwcwkweGQwKCVyc3ApLCV4bW0xMworCW1vdmFwcwkweGUwKCVyc3ApLCV4bW0xNAorCW1vdmFwcwkweGYwKCVyc3ApLCV4bW0xNQorX19fCiskY29kZS49PDxfX187CisJbGVhCSRmcmFtZV9zaXplKCVyc3ApLCVyc3AKKy5MeHRzX2VuY19lcGlsb2d1ZToKKwlyZXQKKy5zaXplCWFlc25pX3h0c19lbmNyeXB0LC4tYWVzbmlfeHRzX2VuY3J5cHQKK19fXworCiskY29kZS49PDxfX187CisuZ2xvYmwJYWVzbmlfeHRzX2RlY3J5cHQKKy50eXBlCWFlc25pX3h0c19kZWNyeXB0LFxAZnVuY3Rpb24sNgorLmFsaWduCTE2CithZXNuaV94dHNfZGVjcnlwdDoKKwlsZWEJLSRmcmFtZV9zaXplKCVyc3ApLCVyc3AKK19fXworJGNvZGUuPTw8X19fIGlmICgkd2luNjQpOworCW1vdmFwcwkleG1tNiwweDYwKCVyc3ApCisJbW92YXBzCSV4bW03LDB4NzAoJXJzcCkKKwltb3ZhcHMJJXhtbTgsMHg4MCglcnNwKQorCW1vdmFwcwkleG1tOSwweDkwKCVyc3ApCisJbW92YXBzCSV4bW0xMCwweGEwKCVyc3ApCisJbW92YXBzCSV4bW0xMSwweGIwKCVyc3ApCisJbW92YXBzCSV4bW0xMiwweGMwKCVyc3ApCisJbW92YXBzCSV4bW0xMywweGQwKCVyc3ApCisJbW92YXBzCSV4bW0xNCwweGUwKCVyc3ApCisJbW92YXBzCSV4bW0xNSwweGYwKCVyc3ApCisuTHh0c19kZWNfYm9keToKK19fXworJGNvZGUuPTw8X19fOworCW1vdnVwcwkoJGl2cCksQHR3ZWFrWzVdCQkjIGxvYWQgY2xlYXItdGV4dCB0d2VhaworCW1vdgkyNDAoJGtleTIpLCRyb3VuZHMJCSMga2V5Mi0+cm91bmRzCisJbW92CTI0MCgka2V5KSwkcm5kc18JCSMga2V5MS0+cm91bmRzCitfX18KKwkjIGdlbmVyYXRlIHRoZSB0d2VhaworCSZhZXNuaV9nZW5lcmF0ZTEoImVuYyIsJGtleTIsJHJvdW5kcyxAdHdlYWtbNV0pOworJGNvZGUuPTw8X19fOworCXhvcgklZWF4LCVlYXgJCQkjIGlmICgkbGVuJTE2KSBsZW4tPTE2OworCXRlc3QJXCQxNSwkbGVuCisJc2V0bnoJJWFsCisJc2hsCVwkNCwlcmF4CisJc3ViCSVyYXgsJGxlbgorCisJbW92CSRrZXksJGtleV8JCQkjIGJhY2t1cCAka2V5CisJbW92CSRybmRzXywkcm91bmRzCQkJIyBiYWNrdXAgJHJvdW5kcworCW1vdgkkbGVuLCRsZW5fCQkJIyBiYWNrdXAgJGxlbgorCWFuZAlcJC0xNiwkbGVuCisKKwltb3ZkcWEJLkx4dHNfbWFnaWMoJXJpcCksJHR3bWFzaworCXB4b3IJJHR3dG1wLCR0d3RtcAorCXBjbXBndGQJQHR3ZWFrWzVdLCR0d3RtcAkJIyBicm9hZGNhc3QgdXBwZXIgYml0cworX19fCisgICAgZm9yICgkaT0wOyRpPDQ7JGkrKykgeworICAgICRjb2RlLj08PF9fXzsKKwlwc2h1ZmQJXCQweDEzLCR0d3RtcCwkdHdyZXMKKwlweG9yCSR0d3RtcCwkdHd0bXAKKwltb3ZkcWEJQHR3ZWFrWzVdLEB0d2Vha1skaV0KKwlwYWRkcQlAdHdlYWtbNV0sQHR3ZWFrWzVdCQkjIHBzbGxxCTEsJHR3ZWFrCisJcGFuZAkkdHdtYXNrLCR0d3JlcwkJCSMgaXNvbGF0ZSBjYXJyeSBhbmQgcmVzaWR1ZQorCXBjbXBndGQJQHR3ZWFrWzVdLCR0d3RtcAkJIyBicm9hZGNhdCB1cHBlciBiaXRzCisJcHhvcgkkdHdyZXMsQHR3ZWFrWzVdCitfX18KKyAgICB9CiskY29kZS49PDxfX187CisJc3ViCVwkMTYqNiwkbGVuCisJamMJLkx4dHNfZGVjX3Nob3J0CisKKwlzaHIJXCQxLCRyb3VuZHMKKwlzdWIJXCQxLCRyb3VuZHMKKwltb3YJJHJvdW5kcywkcm5kc18KKwlqbXAJLkx4dHNfZGVjX2dyYW5kbG9vcAorCisuYWxpZ24JMTYKKy5MeHRzX2RlY19ncmFuZGxvb3A6CisJcHNodWZkCVwkMHgxMywkdHd0bXAsJHR3cmVzCisJbW92ZHFhCUB0d2Vha1s1XSxAdHdlYWtbNF0KKwlwYWRkcQlAdHdlYWtbNV0sQHR3ZWFrWzVdCQkjIHBzbGxxIDEsJHR3ZWFrCisJbW92ZHF1CWAxNiowYCgkaW5wKSwkaW5vdXQwCQkjIGxvYWQgaW5wdXQKKwlwYW5kCSR0d21hc2ssJHR3cmVzCQkJIyBpc29sYXRlIGNhcnJ5IGFuZCByZXNpZHVlCisJbW92ZHF1CWAxNioxYCgkaW5wKSwkaW5vdXQxCisJcHhvcgkkdHdyZXMsQHR3ZWFrWzVdCisKKwltb3ZkcXUJYDE2KjJgKCRpbnApLCRpbm91dDIKKwlweG9yCUB0d2Vha1swXSwkaW5vdXQwCQkjIGlucHV0Xj10d2VhaworCW1vdmRxdQlgMTYqM2AoJGlucCksJGlub3V0MworCXB4b3IJQHR3ZWFrWzFdLCRpbm91dDEKKwltb3ZkcXUJYDE2KjRgKCRpbnApLCRpbm91dDQKKwlweG9yCUB0d2Vha1syXSwkaW5vdXQyCisJbW92ZHF1CWAxNio1YCgkaW5wKSwkaW5vdXQ1CisJbGVhCWAxNio2YCgkaW5wKSwkaW5wCisJcHhvcglAdHdlYWtbM10sJGlub3V0MworCSRtb3ZrZXkJCSgka2V5XyksJHJuZGtleTAKKwlweG9yCUB0d2Vha1s0XSwkaW5vdXQ0CisJcHhvcglAdHdlYWtbNV0sJGlub3V0NQorCisJIyBpbmxpbmUgX2Flc25pX2RlY3J5cHQ2IGFuZCBpbnRlcmxlYXZlIGZpcnN0IGFuZCBsYXN0IHJvdW5kcworCSMgd2l0aCBvd24gY29kZS4uLgorCSRtb3ZrZXkJCTE2KCRrZXlfKSwkcm5ka2V5MQorCXB4b3IJCSRybmRrZXkwLCRpbm91dDAKKwlweG9yCQkkcm5ka2V5MCwkaW5vdXQxCisJIG1vdmRxYQlAdHdlYWtbMF0sYDE2KjBgKCVyc3ApCQkjIHB1dCBhc2lkZSB0d2Vha3MKKwlhZXNkZWMJCSRybmRrZXkxLCRpbm91dDAKKwlsZWEJCTMyKCRrZXlfKSwka2V5CisJcHhvcgkJJHJuZGtleTAsJGlub3V0MgorCSBtb3ZkcWEJQHR3ZWFrWzFdLGAxNioxYCglcnNwKQorCWFlc2RlYwkJJHJuZGtleTEsJGlub3V0MQorCXB4b3IJCSRybmRrZXkwLCRpbm91dDMKKwkgbW92ZHFhCUB0d2Vha1syXSxgMTYqMmAoJXJzcCkKKwlhZXNkZWMJCSRybmRrZXkxLCRpbm91dDIKKwlweG9yCQkkcm5ka2V5MCwkaW5vdXQ0CisJIG1vdmRxYQlAdHdlYWtbM10sYDE2KjNgKCVyc3ApCisJYWVzZGVjCQkkcm5ka2V5MSwkaW5vdXQzCisJcHhvcgkJJHJuZGtleTAsJGlub3V0NQorCSRtb3ZrZXkJCSgka2V5KSwkcm5ka2V5MAorCWRlYwkJJHJvdW5kcworCSBtb3ZkcWEJQHR3ZWFrWzRdLGAxNio0YCglcnNwKQorCWFlc2RlYwkJJHJuZGtleTEsJGlub3V0NAorCSBtb3ZkcWEJQHR3ZWFrWzVdLGAxNio1YCglcnNwKQorCWFlc2RlYwkJJHJuZGtleTEsJGlub3V0NQorCXB4b3IJJHR3dG1wLCR0d3RtcAorCXBjbXBndGQJQHR3ZWFrWzVdLCR0d3RtcAorCWptcAkJLkx4dHNfZGVjX2xvb3A2X2VudGVyCisKKy5hbGlnbgkxNgorLkx4dHNfZGVjX2xvb3A2OgorCWFlc2RlYwkJJHJuZGtleTEsJGlub3V0MAorCWFlc2RlYwkJJHJuZGtleTEsJGlub3V0MQorCWRlYwkJJHJvdW5kcworCWFlc2RlYwkJJHJuZGtleTEsJGlub3V0MgorCWFlc2RlYwkJJHJuZGtleTEsJGlub3V0MworCWFlc2RlYwkJJHJuZGtleTEsJGlub3V0NAorCWFlc2RlYwkJJHJuZGtleTEsJGlub3V0NQorLkx4dHNfZGVjX2xvb3A2X2VudGVyOgorCSRtb3ZrZXkJCTE2KCRrZXkpLCRybmRrZXkxCisJYWVzZGVjCQkkcm5ka2V5MCwkaW5vdXQwCisJYWVzZGVjCQkkcm5ka2V5MCwkaW5vdXQxCisJbGVhCQkzMigka2V5KSwka2V5CisJYWVzZGVjCQkkcm5ka2V5MCwkaW5vdXQyCisJYWVzZGVjCQkkcm5ka2V5MCwkaW5vdXQzCisJYWVzZGVjCQkkcm5ka2V5MCwkaW5vdXQ0CisJYWVzZGVjCQkkcm5ka2V5MCwkaW5vdXQ1CisJJG1vdmtleQkJKCRrZXkpLCRybmRrZXkwCisJam56CQkuTHh0c19kZWNfbG9vcDYKKworCXBzaHVmZAlcJDB4MTMsJHR3dG1wLCR0d3JlcworCXB4b3IJJHR3dG1wLCR0d3RtcAorCXBhZGRxCUB0d2Vha1s1XSxAdHdlYWtbNV0JCSMgcHNsbHEJMSwkdHdlYWsKKwkgYWVzZGVjCQkkcm5ka2V5MSwkaW5vdXQwCisJcGFuZAkkdHdtYXNrLCR0d3JlcwkJCSMgaXNvbGF0ZSBjYXJyeSBhbmQgcmVzaWR1ZQorCSBhZXNkZWMJCSRybmRrZXkxLCRpbm91dDEKKwlwY21wZ3RkCUB0d2Vha1s1XSwkdHd0bXAJCSMgYnJvYWRjYXN0IHVwcGVyIGJpdHMKKwkgYWVzZGVjCQkkcm5ka2V5MSwkaW5vdXQyCisJcHhvcgkkdHdyZXMsQHR3ZWFrWzVdCisJIGFlc2RlYwkJJHJuZGtleTEsJGlub3V0MworCSBhZXNkZWMJCSRybmRrZXkxLCRpbm91dDQKKwkgYWVzZGVjCQkkcm5ka2V5MSwkaW5vdXQ1CisJICRtb3ZrZXkJMTYoJGtleSksJHJuZGtleTEKKworCXBzaHVmZAlcJDB4MTMsJHR3dG1wLCR0d3JlcworCXB4b3IJJHR3dG1wLCR0d3RtcAorCW1vdmRxYQlAdHdlYWtbNV0sQHR3ZWFrWzBdCisJcGFkZHEJQHR3ZWFrWzVdLEB0d2Vha1s1XQkJIyBwc2xscQkxLCR0d2VhaworCSBhZXNkZWMJCSRybmRrZXkwLCRpbm91dDAKKwlwYW5kCSR0d21hc2ssJHR3cmVzCQkJIyBpc29sYXRlIGNhcnJ5IGFuZCByZXNpZHVlCisJIGFlc2RlYwkJJHJuZGtleTAsJGlub3V0MQorCXBjbXBndGQJQHR3ZWFrWzVdLCR0d3RtcAkJIyBicm9hZGNhdCB1cHBlciBiaXRzCisJIGFlc2RlYwkJJHJuZGtleTAsJGlub3V0MgorCXB4b3IJJHR3cmVzLEB0d2Vha1s1XQorCSBhZXNkZWMJCSRybmRrZXkwLCRpbm91dDMKKwkgYWVzZGVjCQkkcm5ka2V5MCwkaW5vdXQ0CisJIGFlc2RlYwkJJHJuZGtleTAsJGlub3V0NQorCSAkbW92a2V5CTMyKCRrZXkpLCRybmRrZXkwCisKKwlwc2h1ZmQJXCQweDEzLCR0d3RtcCwkdHdyZXMKKwlweG9yCSR0d3RtcCwkdHd0bXAKKwltb3ZkcWEJQHR3ZWFrWzVdLEB0d2Vha1sxXQorCXBhZGRxCUB0d2Vha1s1XSxAdHdlYWtbNV0JCSMgcHNsbHEJMSwkdHdlYWsKKwkgYWVzZGVjCQkkcm5ka2V5MSwkaW5vdXQwCisJcGFuZAkkdHdtYXNrLCR0d3JlcwkJCSMgaXNvbGF0ZSBjYXJyeSBhbmQgcmVzaWR1ZQorCSBhZXNkZWMJCSRybmRrZXkxLCRpbm91dDEKKwlwY21wZ3RkCUB0d2Vha1s1XSwkdHd0bXAJCSMgYnJvYWRjYXQgdXBwZXIgYml0cworCSBhZXNkZWMJCSRybmRrZXkxLCRpbm91dDIKKwlweG9yCSR0d3JlcyxAdHdlYWtbNV0KKwkgYWVzZGVjCQkkcm5ka2V5MSwkaW5vdXQzCisJIGFlc2RlYwkJJHJuZGtleTEsJGlub3V0NAorCSBhZXNkZWMJCSRybmRrZXkxLCRpbm91dDUKKworCXBzaHVmZAlcJDB4MTMsJHR3dG1wLCR0d3JlcworCXB4b3IJJHR3dG1wLCR0d3RtcAorCW1vdmRxYQlAdHdlYWtbNV0sQHR3ZWFrWzJdCisJcGFkZHEJQHR3ZWFrWzVdLEB0d2Vha1s1XQkJIyBwc2xscQkxLCR0d2VhaworCSBhZXNkZWNsYXN0CSRybmRrZXkwLCRpbm91dDAKKwlwYW5kCSR0d21hc2ssJHR3cmVzCQkJIyBpc29sYXRlIGNhcnJ5IGFuZCByZXNpZHVlCisJIGFlc2RlY2xhc3QJJHJuZGtleTAsJGlub3V0MQorCXBjbXBndGQJQHR3ZWFrWzVdLCR0d3RtcAkJIyBicm9hZGNhdCB1cHBlciBiaXRzCisJIGFlc2RlY2xhc3QJJHJuZGtleTAsJGlub3V0MgorCXB4b3IJJHR3cmVzLEB0d2Vha1s1XQorCSBhZXNkZWNsYXN0CSRybmRrZXkwLCRpbm91dDMKKwkgYWVzZGVjbGFzdAkkcm5ka2V5MCwkaW5vdXQ0CisJIGFlc2RlY2xhc3QJJHJuZGtleTAsJGlub3V0NQorCisJcHNodWZkCVwkMHgxMywkdHd0bXAsJHR3cmVzCisJcHhvcgkkdHd0bXAsJHR3dG1wCisJbW92ZHFhCUB0d2Vha1s1XSxAdHdlYWtbM10KKwlwYWRkcQlAdHdlYWtbNV0sQHR3ZWFrWzVdCQkjIHBzbGxxCTEsJHR3ZWFrCisJIHhvcnBzCWAxNiowYCglcnNwKSwkaW5vdXQwCQkjIG91dHB1dF49dHdlYWsKKwlwYW5kCSR0d21hc2ssJHR3cmVzCQkJIyBpc29sYXRlIGNhcnJ5IGFuZCByZXNpZHVlCisJIHhvcnBzCWAxNioxYCglcnNwKSwkaW5vdXQxCisJcGNtcGd0ZAlAdHdlYWtbNV0sJHR3dG1wCQkjIGJyb2FkY2F0IHVwcGVyIGJpdHMKKwlweG9yCSR0d3JlcyxAdHdlYWtbNV0KKworCXhvcnBzCWAxNioyYCglcnNwKSwkaW5vdXQyCisJbW92dXBzCSRpbm91dDAsYDE2KjBgKCRvdXQpCQkjIHdyaXRlIG91dHB1dAorCXhvcnBzCWAxNiozYCglcnNwKSwkaW5vdXQzCisJbW92dXBzCSRpbm91dDEsYDE2KjFgKCRvdXQpCisJeG9ycHMJYDE2KjRgKCVyc3ApLCRpbm91dDQKKwltb3Z1cHMJJGlub3V0MixgMTYqMmAoJG91dCkKKwl4b3JwcwlgMTYqNWAoJXJzcCksJGlub3V0NQorCW1vdnVwcwkkaW5vdXQzLGAxNiozYCgkb3V0KQorCW1vdgkkcm5kc18sJHJvdW5kcwkJCSMgcmVzdG9yZSAkcm91bmRzCisJbW92dXBzCSRpbm91dDQsYDE2KjRgKCRvdXQpCisJbW92dXBzCSRpbm91dDUsYDE2KjVgKCRvdXQpCisJbGVhCWAxNio2YCgkb3V0KSwkb3V0CisJc3ViCVwkMTYqNiwkbGVuCisJam5jCS5MeHRzX2RlY19ncmFuZGxvb3AKKworCWxlYQkzKCRyb3VuZHMsJHJvdW5kcyksJHJvdW5kcwkjIHJlc3RvcmUgb3JpZ2luYWwgdmFsdWUKKwltb3YJJGtleV8sJGtleQkJCSMgcmVzdG9yZSAka2V5CisJbW92CSRyb3VuZHMsJHJuZHNfCQkJIyBiYWNrdXAgJHJvdW5kcworCisuTHh0c19kZWNfc2hvcnQ6CisJYWRkCVwkMTYqNiwkbGVuCisJanoJLkx4dHNfZGVjX2RvbmUKKworCWNtcAlcJDB4MjAsJGxlbgorCWpiCS5MeHRzX2RlY19vbmUKKwlqZQkuTHh0c19kZWNfdHdvCisKKwljbXAJXCQweDQwLCRsZW4KKwlqYgkuTHh0c19kZWNfdGhyZWUKKwlqZQkuTHh0c19kZWNfZm91cgorCisJcHNodWZkCVwkMHgxMywkdHd0bXAsJHR3cmVzCisJbW92ZHFhCUB0d2Vha1s1XSxAdHdlYWtbNF0KKwlwYWRkcQlAdHdlYWtbNV0sQHR3ZWFrWzVdCQkjIHBzbGxxIDEsJHR3ZWFrCisJIG1vdmRxdQkoJGlucCksJGlub3V0MAorCXBhbmQJJHR3bWFzaywkdHdyZXMJCQkjIGlzb2xhdGUgY2FycnkgYW5kIHJlc2lkdWUKKwkgbW92ZHF1CTE2KjEoJGlucCksJGlub3V0MQorCXB4b3IJJHR3cmVzLEB0d2Vha1s1XQorCisJbW92ZHF1CTE2KjIoJGlucCksJGlub3V0MgorCXB4b3IJQHR3ZWFrWzBdLCRpbm91dDAKKwltb3ZkcXUJMTYqMygkaW5wKSwkaW5vdXQzCisJcHhvcglAdHdlYWtbMV0sJGlub3V0MQorCW1vdmRxdQkxNio0KCRpbnApLCRpbm91dDQKKwlsZWEJMTYqNSgkaW5wKSwkaW5wCisJcHhvcglAdHdlYWtbMl0sJGlub3V0MgorCXB4b3IJQHR3ZWFrWzNdLCRpbm91dDMKKwlweG9yCUB0d2Vha1s0XSwkaW5vdXQ0CisKKwljYWxsCV9hZXNuaV9kZWNyeXB0NgorCisJeG9ycHMJQHR3ZWFrWzBdLCRpbm91dDAKKwl4b3JwcwlAdHdlYWtbMV0sJGlub3V0MQorCXhvcnBzCUB0d2Vha1syXSwkaW5vdXQyCisJbW92ZHF1CSRpbm91dDAsKCRvdXQpCisJeG9ycHMJQHR3ZWFrWzNdLCRpbm91dDMKKwltb3ZkcXUJJGlub3V0MSwxNioxKCRvdXQpCisJeG9ycHMJQHR3ZWFrWzRdLCRpbm91dDQKKwltb3ZkcXUJJGlub3V0MiwxNioyKCRvdXQpCisJIHB4b3IJCSR0d3RtcCwkdHd0bXAKKwltb3ZkcXUJJGlub3V0MywxNiozKCRvdXQpCisJIHBjbXBndGQJQHR3ZWFrWzVdLCR0d3RtcAorCW1vdmRxdQkkaW5vdXQ0LDE2KjQoJG91dCkKKwlsZWEJMTYqNSgkb3V0KSwkb3V0CisJIHBzaHVmZAkJXCQweDEzLCR0d3RtcCxAdHdlYWtbMV0JIyAkdHdyZXMKKwlhbmQJXCQxNSwkbGVuXworCWp6CS5MeHRzX2RlY19yZXQKKworCW1vdmRxYQlAdHdlYWtbNV0sQHR3ZWFrWzBdCisJcGFkZHEJQHR3ZWFrWzVdLEB0d2Vha1s1XQkJIyBwc2xscSAxLCR0d2VhaworCXBhbmQJJHR3bWFzayxAdHdlYWtbMV0JCSMgaXNvbGF0ZSBjYXJyeSBhbmQgcmVzaWR1ZQorCXB4b3IJQHR3ZWFrWzVdLEB0d2Vha1sxXQorCWptcAkuTHh0c19kZWNfZG9uZTIKKworLmFsaWduCTE2CisuTHh0c19kZWNfb25lOgorCW1vdnVwcwkoJGlucCksJGlub3V0MAorCWxlYQkxNioxKCRpbnApLCRpbnAKKwl4b3JwcwlAdHdlYWtbMF0sJGlub3V0MAorX19fCisJJmFlc25pX2dlbmVyYXRlMSgiZGVjIiwka2V5LCRyb3VuZHMpOworJGNvZGUuPTw8X19fOworCXhvcnBzCUB0d2Vha1swXSwkaW5vdXQwCisJbW92ZHFhCUB0d2Vha1sxXSxAdHdlYWtbMF0KKwltb3Z1cHMJJGlub3V0MCwoJG91dCkKKwltb3ZkcWEJQHR3ZWFrWzJdLEB0d2Vha1sxXQorCWxlYQkxNioxKCRvdXQpLCRvdXQKKwlqbXAJLkx4dHNfZGVjX2RvbmUKKworLmFsaWduCTE2CisuTHh0c19kZWNfdHdvOgorCW1vdnVwcwkoJGlucCksJGlub3V0MAorCW1vdnVwcwkxNigkaW5wKSwkaW5vdXQxCisJbGVhCTMyKCRpbnApLCRpbnAKKwl4b3JwcwlAdHdlYWtbMF0sJGlub3V0MAorCXhvcnBzCUB0d2Vha1sxXSwkaW5vdXQxCisKKwljYWxsCV9hZXNuaV9kZWNyeXB0MworCisJeG9ycHMJQHR3ZWFrWzBdLCRpbm91dDAKKwltb3ZkcWEJQHR3ZWFrWzJdLEB0d2Vha1swXQorCXhvcnBzCUB0d2Vha1sxXSwkaW5vdXQxCisJbW92ZHFhCUB0d2Vha1szXSxAdHdlYWtbMV0KKwltb3Z1cHMJJGlub3V0MCwoJG91dCkKKwltb3Z1cHMJJGlub3V0MSwxNioxKCRvdXQpCisJbGVhCTE2KjIoJG91dCksJG91dAorCWptcAkuTHh0c19kZWNfZG9uZQorCisuYWxpZ24JMTYKKy5MeHRzX2RlY190aHJlZToKKwltb3Z1cHMJKCRpbnApLCRpbm91dDAKKwltb3Z1cHMJMTYqMSgkaW5wKSwkaW5vdXQxCisJbW92dXBzCTE2KjIoJGlucCksJGlub3V0MgorCWxlYQkxNiozKCRpbnApLCRpbnAKKwl4b3JwcwlAdHdlYWtbMF0sJGlub3V0MAorCXhvcnBzCUB0d2Vha1sxXSwkaW5vdXQxCisJeG9ycHMJQHR3ZWFrWzJdLCRpbm91dDIKKworCWNhbGwJX2Flc25pX2RlY3J5cHQzCisKKwl4b3JwcwlAdHdlYWtbMF0sJGlub3V0MAorCW1vdmRxYQlAdHdlYWtbM10sQHR3ZWFrWzBdCisJeG9ycHMJQHR3ZWFrWzFdLCRpbm91dDEKKwltb3ZkcWEJQHR3ZWFrWzVdLEB0d2Vha1sxXQorCXhvcnBzCUB0d2Vha1syXSwkaW5vdXQyCisJbW92dXBzCSRpbm91dDAsKCRvdXQpCisJbW92dXBzCSRpbm91dDEsMTYqMSgkb3V0KQorCW1vdnVwcwkkaW5vdXQyLDE2KjIoJG91dCkKKwlsZWEJMTYqMygkb3V0KSwkb3V0CisJam1wCS5MeHRzX2RlY19kb25lCisKKy5hbGlnbgkxNgorLkx4dHNfZGVjX2ZvdXI6CisJcHNodWZkCVwkMHgxMywkdHd0bXAsJHR3cmVzCisJbW92ZHFhCUB0d2Vha1s1XSxAdHdlYWtbNF0KKwlwYWRkcQlAdHdlYWtbNV0sQHR3ZWFrWzVdCQkjIHBzbGxxIDEsJHR3ZWFrCisJIG1vdnVwcwkoJGlucCksJGlub3V0MAorCXBhbmQJJHR3bWFzaywkdHdyZXMJCQkjIGlzb2xhdGUgY2FycnkgYW5kIHJlc2lkdWUKKwkgbW92dXBzCTE2KjEoJGlucCksJGlub3V0MQorCXB4b3IJJHR3cmVzLEB0d2Vha1s1XQorCisJbW92dXBzCTE2KjIoJGlucCksJGlub3V0MgorCXhvcnBzCUB0d2Vha1swXSwkaW5vdXQwCisJbW92dXBzCTE2KjMoJGlucCksJGlub3V0MworCWxlYQkxNio0KCRpbnApLCRpbnAKKwl4b3JwcwlAdHdlYWtbMV0sJGlub3V0MQorCXhvcnBzCUB0d2Vha1syXSwkaW5vdXQyCisJeG9ycHMJQHR3ZWFrWzNdLCRpbm91dDMKKworCWNhbGwJX2Flc25pX2RlY3J5cHQ0CisKKwl4b3JwcwlAdHdlYWtbMF0sJGlub3V0MAorCW1vdmRxYQlAdHdlYWtbNF0sQHR3ZWFrWzBdCisJeG9ycHMJQHR3ZWFrWzFdLCRpbm91dDEKKwltb3ZkcWEJQHR3ZWFrWzVdLEB0d2Vha1sxXQorCXhvcnBzCUB0d2Vha1syXSwkaW5vdXQyCisJbW92dXBzCSRpbm91dDAsKCRvdXQpCisJeG9ycHMJQHR3ZWFrWzNdLCRpbm91dDMKKwltb3Z1cHMJJGlub3V0MSwxNioxKCRvdXQpCisJbW92dXBzCSRpbm91dDIsMTYqMigkb3V0KQorCW1vdnVwcwkkaW5vdXQzLDE2KjMoJG91dCkKKwlsZWEJMTYqNCgkb3V0KSwkb3V0CisJam1wCS5MeHRzX2RlY19kb25lCisKKy5hbGlnbgkxNgorLkx4dHNfZGVjX2RvbmU6CisJYW5kCVwkMTUsJGxlbl8KKwlqegkuTHh0c19kZWNfcmV0CisuTHh0c19kZWNfZG9uZTI6CisJbW92CSRsZW5fLCRsZW4KKwltb3YJJGtleV8sJGtleQkJCSMgcmVzdG9yZSAka2V5CisJbW92CSRybmRzXywkcm91bmRzCQkJIyByZXN0b3JlICRyb3VuZHMKKworCW1vdnVwcwkoJGlucCksJGlub3V0MAorCXhvcnBzCUB0d2Vha1sxXSwkaW5vdXQwCitfX18KKwkmYWVzbmlfZ2VuZXJhdGUxKCJkZWMiLCRrZXksJHJvdW5kcyk7CiskY29kZS49PDxfX187CisJeG9ycHMJQHR3ZWFrWzFdLCRpbm91dDAKKwltb3Z1cHMJJGlub3V0MCwoJG91dCkKKworLkx4dHNfZGVjX3N0ZWFsOgorCW1vdnpiCTE2KCRpbnApLCVlYXgJCQkjIGJvcnJvdyAkcm91bmRzIC4uLgorCW1vdnpiCSgkb3V0KSwlZWN4CQkJIyAuLi4gYW5kICRrZXkKKwlsZWEJMSgkaW5wKSwkaW5wCisJbW92CSVhbCwoJG91dCkKKwltb3YJJWNsLDE2KCRvdXQpCisJbGVhCTEoJG91dCksJG91dAorCXN1YglcJDEsJGxlbgorCWpuegkuTHh0c19kZWNfc3RlYWwKKworCXN1YgkkbGVuXywkb3V0CQkJIyByZXdpbmQgJG91dAorCW1vdgkka2V5Xywka2V5CQkJIyByZXN0b3JlICRrZXkKKwltb3YJJHJuZHNfLCRyb3VuZHMJCQkjIHJlc3RvcmUgJHJvdW5kcworCisJbW92dXBzCSgkb3V0KSwkaW5vdXQwCisJeG9ycHMJQHR3ZWFrWzBdLCRpbm91dDAKK19fXworCSZhZXNuaV9nZW5lcmF0ZTEoImRlYyIsJGtleSwkcm91bmRzKTsKKyRjb2RlLj08PF9fXzsKKwl4b3JwcwlAdHdlYWtbMF0sJGlub3V0MAorCW1vdnVwcwkkaW5vdXQwLCgkb3V0KQorCisuTHh0c19kZWNfcmV0OgorX19fCiskY29kZS49PDxfX18gaWYgKCR3aW42NCk7CisJbW92YXBzCTB4NjAoJXJzcCksJXhtbTYKKwltb3ZhcHMJMHg3MCglcnNwKSwleG1tNworCW1vdmFwcwkweDgwKCVyc3ApLCV4bW04CisJbW92YXBzCTB4OTAoJXJzcCksJXhtbTkKKwltb3ZhcHMJMHhhMCglcnNwKSwleG1tMTAKKwltb3ZhcHMJMHhiMCglcnNwKSwleG1tMTEKKwltb3ZhcHMJMHhjMCglcnNwKSwleG1tMTIKKwltb3ZhcHMJMHhkMCglcnNwKSwleG1tMTMKKwltb3ZhcHMJMHhlMCglcnNwKSwleG1tMTQKKwltb3ZhcHMJMHhmMCglcnNwKSwleG1tMTUKK19fXworJGNvZGUuPTw8X19fOworCWxlYQkkZnJhbWVfc2l6ZSglcnNwKSwlcnNwCisuTHh0c19kZWNfZXBpbG9ndWU6CisJcmV0Cisuc2l6ZQlhZXNuaV94dHNfZGVjcnlwdCwuLWFlc25pX3h0c19kZWNyeXB0CitfX18KK30gfX0KKwwKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyB2b2lkICRQUkVGSVhfY2JjX2VuY3J5cHQgKGNvbnN0IHZvaWQgKmlucCwgdm9pZCAqb3V0LAorIwkJCSAgICBzaXplX3QgbGVuZ3RoLCBjb25zdCBBRVNfS0VZICprZXksCisjCQkJICAgIHVuc2lnbmVkIGNoYXIgKml2cCxjb25zdCBpbnQgZW5jKTsKK3sKK215ICRyZXNlcnZlZCA9ICR3aW42ND8weDQwOi0weDE4OwkjIHVzZWQgaW4gZGVjcnlwdAorJGNvZGUuPTw8X19fOworLmdsb2JsCSR7UFJFRklYfV9jYmNfZW5jcnlwdAorLnR5cGUJJHtQUkVGSVh9X2NiY19lbmNyeXB0LFxAZnVuY3Rpb24sNgorLmFsaWduCTE2Ciske1BSRUZJWH1fY2JjX2VuY3J5cHQ6CisJdGVzdAkkbGVuLCRsZW4JCSMgY2hlY2sgbGVuZ3RoCisJanoJLkxjYmNfcmV0CisKKwltb3YJMjQwKCRrZXkpLCRybmRzXwkjIGtleS0+cm91bmRzCisJbW92CSRrZXksJGtleV8JCSMgYmFja3VwICRrZXkKKwl0ZXN0CSVyOWQsJXI5ZAkJIyA2dGggYXJndW1lbnQKKwlqegkuTGNiY19kZWNyeXB0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENCQyBFTkNSWVBUIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKKwltb3Z1cHMJKCRpdnApLCRpbm91dDAJCSMgbG9hZCBpdiBhcyBpbml0aWFsIHN0YXRlCisJbW92CSRybmRzXywkcm91bmRzCisJY21wCVwkMTYsJGxlbgorCWpiCS5MY2JjX2VuY190YWlsCisJc3ViCVwkMTYsJGxlbgorCWptcAkuTGNiY19lbmNfbG9vcAorLmFsaWduCTE2CisuTGNiY19lbmNfbG9vcDoKKwltb3Z1cHMJKCRpbnApLCRpbm91dDEJCSMgbG9hZCBpbnB1dAorCWxlYQkxNigkaW5wKSwkaW5wCisJI3hvcnBzCSRpbm91dDEsJGlub3V0MAorX19fCisJJmFlc25pX2dlbmVyYXRlMSgiZW5jIiwka2V5LCRyb3VuZHMsJGlub3V0MCwkaW5vdXQxKTsKKyRjb2RlLj08PF9fXzsKKwltb3YJJHJuZHNfLCRyb3VuZHMJCSMgcmVzdG9yZSAkcm91bmRzCisJbW92CSRrZXlfLCRrZXkJCSMgcmVzdG9yZSAka2V5CisJbW92dXBzCSRpbm91dDAsMCgkb3V0KQkJIyBzdG9yZSBvdXRwdXQKKwlsZWEJMTYoJG91dCksJG91dAorCXN1YglcJDE2LCRsZW4KKwlqbmMJLkxjYmNfZW5jX2xvb3AKKwlhZGQJXCQxNiwkbGVuCisJam56CS5MY2JjX2VuY190YWlsCisJbW92dXBzCSRpbm91dDAsKCRpdnApCisJam1wCS5MY2JjX3JldAorCisuTGNiY19lbmNfdGFpbDoKKwltb3YJJGxlbiwlcmN4CSMgemFwcyAka2V5CisJeGNoZwkkaW5wLCRvdXQJIyAkaW5wIGlzICVyc2kgYW5kICRvdXQgaXMgJXJkaSBub3cKKwkubG9uZwkweDkwNjZBNEYzCSMgcmVwIG1vdnNiCisJbW92CVwkMTYsJWVjeAkjIHplcm8gdGFpbAorCXN1YgkkbGVuLCVyY3gKKwl4b3IJJWVheCwlZWF4CisJLmxvbmcJMHg5MDY2QUFGMwkjIHJlcCBzdG9zYgorCWxlYQktMTYoJXJkaSksJXJkaQkjIHJld2luZCAkb3V0IGJ5IDEgYmxvY2sKKwltb3YJJHJuZHNfLCRyb3VuZHMJIyByZXN0b3JlICRyb3VuZHMKKwltb3YJJXJkaSwlcnNpCSMgJGlucCBhbmQgJG91dCBhcmUgdGhlIHNhbWUKKwltb3YJJGtleV8sJGtleQkjIHJlc3RvcmUgJGtleQorCXhvcgkkbGVuLCRsZW4JIyBsZW49MTYKKwlqbXAJLkxjYmNfZW5jX2xvb3AJIyBvbmUgbW9yZSBzcGluCisMIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDQkMgREVDUllQVCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCisuYWxpZ24JMTYKKy5MY2JjX2RlY3J5cHQ6CitfX18KKyRjb2RlLj08PF9fXyBpZiAoJHdpbjY0KTsKKwlsZWEJLTB4NTgoJXJzcCksJXJzcAorCW1vdmFwcwkleG1tNiwoJXJzcCkKKwltb3ZhcHMJJXhtbTcsMHgxMCglcnNwKQorCW1vdmFwcwkleG1tOCwweDIwKCVyc3ApCisJbW92YXBzCSV4bW05LDB4MzAoJXJzcCkKKy5MY2JjX2RlY3J5cHRfYm9keToKK19fXworJGNvZGUuPTw8X19fOworCW1vdnVwcwkoJGl2cCksJGl2CisJbW92CSRybmRzXywkcm91bmRzCisJY21wCVwkMHg3MCwkbGVuCisJamJlCS5MY2JjX2RlY190YWlsCisJc2hyCVwkMSwkcm5kc18KKwlzdWIJXCQweDcwLCRsZW4KKwltb3YJJHJuZHNfLCRyb3VuZHMKKwltb3ZhcHMJJGl2LCRyZXNlcnZlZCglcnNwKQorCWptcAkuTGNiY19kZWNfbG9vcDhfZW50ZXIKKy5hbGlnbgkxNgorLkxjYmNfZGVjX2xvb3A4OgorCW1vdmFwcwkkcm5ka2V5MCwkcmVzZXJ2ZWQoJXJzcCkJIyBzYXZlIElWCisJbW92dXBzCSRpbm91dDcsKCRvdXQpCisJbGVhCTB4MTAoJG91dCksJG91dAorLkxjYmNfZGVjX2xvb3A4X2VudGVyOgorCSRtb3ZrZXkJCSgka2V5KSwkcm5ka2V5MAorCW1vdnVwcwkoJGlucCksJGlub3V0MAkJCSMgbG9hZCBpbnB1dAorCW1vdnVwcwkweDEwKCRpbnApLCRpbm91dDEKKwkkbW92a2V5CQkxNigka2V5KSwkcm5ka2V5MQorCisJbGVhCQkzMigka2V5KSwka2V5CisJbW92ZHF1CTB4MjAoJGlucCksJGlub3V0MgorCXhvcnBzCQkkcm5ka2V5MCwkaW5vdXQwCisJbW92ZHF1CTB4MzAoJGlucCksJGlub3V0MworCXhvcnBzCQkkcm5ka2V5MCwkaW5vdXQxCisJbW92ZHF1CTB4NDAoJGlucCksJGlub3V0NAorCWFlc2RlYwkJJHJuZGtleTEsJGlub3V0MAorCXB4b3IJCSRybmRrZXkwLCRpbm91dDIKKwltb3ZkcXUJMHg1MCgkaW5wKSwkaW5vdXQ1CisJYWVzZGVjCQkkcm5ka2V5MSwkaW5vdXQxCisJcHhvcgkJJHJuZGtleTAsJGlub3V0MworCW1vdmRxdQkweDYwKCRpbnApLCRpbm91dDYKKwlhZXNkZWMJCSRybmRrZXkxLCRpbm91dDIKKwlweG9yCQkkcm5ka2V5MCwkaW5vdXQ0CisJbW92ZHF1CTB4NzAoJGlucCksJGlub3V0NworCWFlc2RlYwkJJHJuZGtleTEsJGlub3V0MworCXB4b3IJCSRybmRrZXkwLCRpbm91dDUKKwlkZWMJCSRyb3VuZHMKKwlhZXNkZWMJCSRybmRrZXkxLCRpbm91dDQKKwlweG9yCQkkcm5ka2V5MCwkaW5vdXQ2CisJYWVzZGVjCQkkcm5ka2V5MSwkaW5vdXQ1CisJcHhvcgkJJHJuZGtleTAsJGlub3V0NworCSRtb3ZrZXkJCSgka2V5KSwkcm5ka2V5MAorCWFlc2RlYwkJJHJuZGtleTEsJGlub3V0NgorCWFlc2RlYwkJJHJuZGtleTEsJGlub3V0NworCSRtb3ZrZXkJCTE2KCRrZXkpLCRybmRrZXkxCisKKwljYWxsCQkuTGRlY19sb29wOF9lbnRlcgorCisJbW92dXBzCSgkaW5wKSwkcm5ka2V5MQkJIyByZS1sb2FkIGlucHV0CisJbW92dXBzCTB4MTAoJGlucCksJHJuZGtleTAKKwl4b3JwcwkkcmVzZXJ2ZWQoJXJzcCksJGlub3V0MAkjIF49IElWCisJeG9ycHMJJHJuZGtleTEsJGlub3V0MQorCW1vdnVwcwkweDIwKCRpbnApLCRybmRrZXkxCisJeG9ycHMJJHJuZGtleTAsJGlub3V0MgorCW1vdnVwcwkweDMwKCRpbnApLCRybmRrZXkwCisJeG9ycHMJJHJuZGtleTEsJGlub3V0MworCW1vdnVwcwkweDQwKCRpbnApLCRybmRrZXkxCisJeG9ycHMJJHJuZGtleTAsJGlub3V0NAorCW1vdnVwcwkweDUwKCRpbnApLCRybmRrZXkwCisJeG9ycHMJJHJuZGtleTEsJGlub3V0NQorCW1vdnVwcwkweDYwKCRpbnApLCRybmRrZXkxCisJeG9ycHMJJHJuZGtleTAsJGlub3V0NgorCW1vdnVwcwkweDcwKCRpbnApLCRybmRrZXkwCSMgSVYKKwl4b3Jwcwkkcm5ka2V5MSwkaW5vdXQ3CisJbW92dXBzCSRpbm91dDAsKCRvdXQpCisJbW92dXBzCSRpbm91dDEsMHgxMCgkb3V0KQorCW1vdnVwcwkkaW5vdXQyLDB4MjAoJG91dCkKKwltb3Z1cHMJJGlub3V0MywweDMwKCRvdXQpCisJbW92CSRybmRzXywkcm91bmRzCQkjIHJlc3RvcmUgJHJvdW5kcworCW1vdnVwcwkkaW5vdXQ0LDB4NDAoJG91dCkKKwltb3YJJGtleV8sJGtleQkJIyByZXN0b3JlICRrZXkKKwltb3Z1cHMJJGlub3V0NSwweDUwKCRvdXQpCisJbGVhCTB4ODAoJGlucCksJGlucAorCW1vdnVwcwkkaW5vdXQ2LDB4NjAoJG91dCkKKwlsZWEJMHg3MCgkb3V0KSwkb3V0CisJc3ViCVwkMHg4MCwkbGVuCisJamEJLkxjYmNfZGVjX2xvb3A4CisKKwltb3ZhcHMJJGlub3V0NywkaW5vdXQwCisJbW92YXBzCSRybmRrZXkwLCRpdgorCWFkZAlcJDB4NzAsJGxlbgorCWpsZQkuTGNiY19kZWNfdGFpbF9jb2xsZWN0ZWQKKwltb3Z1cHMJJGlub3V0MCwoJG91dCkKKwlsZWEJMSgkcm5kc18sJHJuZHNfKSwkcm91bmRzCisJbGVhCTB4MTAoJG91dCksJG91dAorLkxjYmNfZGVjX3RhaWw6CisJbW92dXBzCSgkaW5wKSwkaW5vdXQwCisJbW92YXBzCSRpbm91dDAsJGluMAorCWNtcAlcJDB4MTAsJGxlbgorCWpiZQkuTGNiY19kZWNfb25lCisKKwltb3Z1cHMJMHgxMCgkaW5wKSwkaW5vdXQxCisJbW92YXBzCSRpbm91dDEsJGluMQorCWNtcAlcJDB4MjAsJGxlbgorCWpiZQkuTGNiY19kZWNfdHdvCisKKwltb3Z1cHMJMHgyMCgkaW5wKSwkaW5vdXQyCisJbW92YXBzCSRpbm91dDIsJGluMgorCWNtcAlcJDB4MzAsJGxlbgorCWpiZQkuTGNiY19kZWNfdGhyZWUKKworCW1vdnVwcwkweDMwKCRpbnApLCRpbm91dDMKKwljbXAJXCQweDQwLCRsZW4KKwlqYmUJLkxjYmNfZGVjX2ZvdXIKKworCW1vdnVwcwkweDQwKCRpbnApLCRpbm91dDQKKwljbXAJXCQweDUwLCRsZW4KKwlqYmUJLkxjYmNfZGVjX2ZpdmUKKworCW1vdnVwcwkweDUwKCRpbnApLCRpbm91dDUKKwljbXAJXCQweDYwLCRsZW4KKwlqYmUJLkxjYmNfZGVjX3NpeAorCisJbW92dXBzCTB4NjAoJGlucCksJGlub3V0NgorCW1vdmFwcwkkaXYsJHJlc2VydmVkKCVyc3ApCSMgc2F2ZSBJVgorCWNhbGwJX2Flc25pX2RlY3J5cHQ4CisJbW92dXBzCSgkaW5wKSwkcm5ka2V5MQorCW1vdnVwcwkweDEwKCRpbnApLCRybmRrZXkwCisJeG9ycHMJJHJlc2VydmVkKCVyc3ApLCRpbm91dDAJIyBePSBJVgorCXhvcnBzCSRybmRrZXkxLCRpbm91dDEKKwltb3Z1cHMJMHgyMCgkaW5wKSwkcm5ka2V5MQorCXhvcnBzCSRybmRrZXkwLCRpbm91dDIKKwltb3Z1cHMJMHgzMCgkaW5wKSwkcm5ka2V5MAorCXhvcnBzCSRybmRrZXkxLCRpbm91dDMKKwltb3Z1cHMJMHg0MCgkaW5wKSwkcm5ka2V5MQorCXhvcnBzCSRybmRrZXkwLCRpbm91dDQKKwltb3Z1cHMJMHg1MCgkaW5wKSwkcm5ka2V5MAorCXhvcnBzCSRybmRrZXkxLCRpbm91dDUKKwltb3Z1cHMJMHg2MCgkaW5wKSwkaXYJCSMgSVYKKwl4b3Jwcwkkcm5ka2V5MCwkaW5vdXQ2CisJbW92dXBzCSRpbm91dDAsKCRvdXQpCisJbW92dXBzCSRpbm91dDEsMHgxMCgkb3V0KQorCW1vdnVwcwkkaW5vdXQyLDB4MjAoJG91dCkKKwltb3Z1cHMJJGlub3V0MywweDMwKCRvdXQpCisJbW92dXBzCSRpbm91dDQsMHg0MCgkb3V0KQorCW1vdnVwcwkkaW5vdXQ1LDB4NTAoJG91dCkKKwlsZWEJMHg2MCgkb3V0KSwkb3V0CisJbW92YXBzCSRpbm91dDYsJGlub3V0MAorCXN1YglcJDB4NzAsJGxlbgorCWptcAkuTGNiY19kZWNfdGFpbF9jb2xsZWN0ZWQKKy5hbGlnbgkxNgorLkxjYmNfZGVjX29uZToKK19fXworCSZhZXNuaV9nZW5lcmF0ZTEoImRlYyIsJGtleSwkcm91bmRzKTsKKyRjb2RlLj08PF9fXzsKKwl4b3JwcwkkaXYsJGlub3V0MAorCW1vdmFwcwkkaW4wLCRpdgorCXN1YglcJDB4MTAsJGxlbgorCWptcAkuTGNiY19kZWNfdGFpbF9jb2xsZWN0ZWQKKy5hbGlnbgkxNgorLkxjYmNfZGVjX3R3bzoKKwl4b3JwcwkkaW5vdXQyLCRpbm91dDIKKwljYWxsCV9hZXNuaV9kZWNyeXB0MworCXhvcnBzCSRpdiwkaW5vdXQwCisJeG9ycHMJJGluMCwkaW5vdXQxCisJbW92dXBzCSRpbm91dDAsKCRvdXQpCisJbW92YXBzCSRpbjEsJGl2CisJbW92YXBzCSRpbm91dDEsJGlub3V0MAorCWxlYQkweDEwKCRvdXQpLCRvdXQKKwlzdWIJXCQweDIwLCRsZW4KKwlqbXAJLkxjYmNfZGVjX3RhaWxfY29sbGVjdGVkCisuYWxpZ24JMTYKKy5MY2JjX2RlY190aHJlZToKKwljYWxsCV9hZXNuaV9kZWNyeXB0MworCXhvcnBzCSRpdiwkaW5vdXQwCisJeG9ycHMJJGluMCwkaW5vdXQxCisJbW92dXBzCSRpbm91dDAsKCRvdXQpCisJeG9ycHMJJGluMSwkaW5vdXQyCisJbW92dXBzCSRpbm91dDEsMHgxMCgkb3V0KQorCW1vdmFwcwkkaW4yLCRpdgorCW1vdmFwcwkkaW5vdXQyLCRpbm91dDAKKwlsZWEJMHgyMCgkb3V0KSwkb3V0CisJc3ViCVwkMHgzMCwkbGVuCisJam1wCS5MY2JjX2RlY190YWlsX2NvbGxlY3RlZAorLmFsaWduCTE2CisuTGNiY19kZWNfZm91cjoKKwljYWxsCV9hZXNuaV9kZWNyeXB0NAorCXhvcnBzCSRpdiwkaW5vdXQwCisJbW92dXBzCTB4MzAoJGlucCksJGl2CisJeG9ycHMJJGluMCwkaW5vdXQxCisJbW92dXBzCSRpbm91dDAsKCRvdXQpCisJeG9ycHMJJGluMSwkaW5vdXQyCisJbW92dXBzCSRpbm91dDEsMHgxMCgkb3V0KQorCXhvcnBzCSRpbjIsJGlub3V0MworCW1vdnVwcwkkaW5vdXQyLDB4MjAoJG91dCkKKwltb3ZhcHMJJGlub3V0MywkaW5vdXQwCisJbGVhCTB4MzAoJG91dCksJG91dAorCXN1YglcJDB4NDAsJGxlbgorCWptcAkuTGNiY19kZWNfdGFpbF9jb2xsZWN0ZWQKKy5hbGlnbgkxNgorLkxjYmNfZGVjX2ZpdmU6CisJeG9ycHMJJGlub3V0NSwkaW5vdXQ1CisJY2FsbAlfYWVzbmlfZGVjcnlwdDYKKwltb3Z1cHMJMHgxMCgkaW5wKSwkcm5ka2V5MQorCW1vdnVwcwkweDIwKCRpbnApLCRybmRrZXkwCisJeG9ycHMJJGl2LCRpbm91dDAKKwl4b3JwcwkkaW4wLCRpbm91dDEKKwl4b3Jwcwkkcm5ka2V5MSwkaW5vdXQyCisJbW92dXBzCTB4MzAoJGlucCksJHJuZGtleTEKKwl4b3Jwcwkkcm5ka2V5MCwkaW5vdXQzCisJbW92dXBzCTB4NDAoJGlucCksJGl2CisJeG9ycHMJJHJuZGtleTEsJGlub3V0NAorCW1vdnVwcwkkaW5vdXQwLCgkb3V0KQorCW1vdnVwcwkkaW5vdXQxLDB4MTAoJG91dCkKKwltb3Z1cHMJJGlub3V0MiwweDIwKCRvdXQpCisJbW92dXBzCSRpbm91dDMsMHgzMCgkb3V0KQorCWxlYQkweDQwKCRvdXQpLCRvdXQKKwltb3ZhcHMJJGlub3V0NCwkaW5vdXQwCisJc3ViCVwkMHg1MCwkbGVuCisJam1wCS5MY2JjX2RlY190YWlsX2NvbGxlY3RlZAorLmFsaWduCTE2CisuTGNiY19kZWNfc2l4OgorCWNhbGwJX2Flc25pX2RlY3J5cHQ2CisJbW92dXBzCTB4MTAoJGlucCksJHJuZGtleTEKKwltb3Z1cHMJMHgyMCgkaW5wKSwkcm5ka2V5MAorCXhvcnBzCSRpdiwkaW5vdXQwCisJeG9ycHMJJGluMCwkaW5vdXQxCisJeG9ycHMJJHJuZGtleTEsJGlub3V0MgorCW1vdnVwcwkweDMwKCRpbnApLCRybmRrZXkxCisJeG9ycHMJJHJuZGtleTAsJGlub3V0MworCW1vdnVwcwkweDQwKCRpbnApLCRybmRrZXkwCisJeG9ycHMJJHJuZGtleTEsJGlub3V0NAorCW1vdnVwcwkweDUwKCRpbnApLCRpdgorCXhvcnBzCSRybmRrZXkwLCRpbm91dDUKKwltb3Z1cHMJJGlub3V0MCwoJG91dCkKKwltb3Z1cHMJJGlub3V0MSwweDEwKCRvdXQpCisJbW92dXBzCSRpbm91dDIsMHgyMCgkb3V0KQorCW1vdnVwcwkkaW5vdXQzLDB4MzAoJG91dCkKKwltb3Z1cHMJJGlub3V0NCwweDQwKCRvdXQpCisJbGVhCTB4NTAoJG91dCksJG91dAorCW1vdmFwcwkkaW5vdXQ1LCRpbm91dDAKKwlzdWIJXCQweDYwLCRsZW4KKwlqbXAJLkxjYmNfZGVjX3RhaWxfY29sbGVjdGVkCisuYWxpZ24JMTYKKy5MY2JjX2RlY190YWlsX2NvbGxlY3RlZDoKKwlhbmQJXCQxNSwkbGVuCisJbW92dXBzCSRpdiwoJGl2cCkKKwlqbnoJLkxjYmNfZGVjX3RhaWxfcGFydGlhbAorCW1vdnVwcwkkaW5vdXQwLCgkb3V0KQorCWptcAkuTGNiY19kZWNfcmV0CisuYWxpZ24JMTYKKy5MY2JjX2RlY190YWlsX3BhcnRpYWw6CisJbW92YXBzCSRpbm91dDAsJHJlc2VydmVkKCVyc3ApCisJbW92CVwkMTYsJXJjeAorCW1vdgkkb3V0LCVyZGkKKwlzdWIJJGxlbiwlcmN4CisJbGVhCSRyZXNlcnZlZCglcnNwKSwlcnNpCisJLmxvbmcJMHg5MDY2QTRGMwkjIHJlcCBtb3ZzYgorCisuTGNiY19kZWNfcmV0OgorX19fCiskY29kZS49PDxfX18gaWYgKCR3aW42NCk7CisJbW92YXBzCSglcnNwKSwleG1tNgorCW1vdmFwcwkweDEwKCVyc3ApLCV4bW03CisJbW92YXBzCTB4MjAoJXJzcCksJXhtbTgKKwltb3ZhcHMJMHgzMCglcnNwKSwleG1tOQorCWxlYQkweDU4KCVyc3ApLCVyc3AKK19fXworJGNvZGUuPTw8X19fOworLkxjYmNfcmV0OgorCXJldAorLnNpemUJJHtQUkVGSVh9X2NiY19lbmNyeXB0LC4tJHtQUkVGSVh9X2NiY19lbmNyeXB0CitfX18KK30gDAorIyBpbnQgJFBSRUZJWF9zZXRfW2VufGRlXWNyeXB0X2tleSAoY29uc3QgdW5zaWduZWQgY2hhciAqdXNlcktleSwKKyMJCQkJaW50IGJpdHMsIEFFU19LRVkgKmtleSkKK3sgbXkgKCRpbnAsJGJpdHMsJGtleSkgPSBAXzRhcmdzOworICAkYml0cyA9fiBzLyVyLyVlLzsKKworJGNvZGUuPTw8X19fOworLmdsb2JsCSR7UFJFRklYfV9zZXRfZGVjcnlwdF9rZXkKKy50eXBlCSR7UFJFRklYfV9zZXRfZGVjcnlwdF9rZXksXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2Ciske1BSRUZJWH1fc2V0X2RlY3J5cHRfa2V5OgorCS5ieXRlCTB4NDgsMHg4MywweEVDLDB4MDgJIyBzdWIgcnNwLDgKKwljYWxsCV9fYWVzbmlfc2V0X2VuY3J5cHRfa2V5CisJc2hsCVwkNCwkYml0cwkJIyByb3VuZHMtMSBhZnRlciBfYWVzbmlfc2V0X2VuY3J5cHRfa2V5CisJdGVzdAklZWF4LCVlYXgKKwlqbnoJLkxkZWNfa2V5X3JldAorCWxlYQkxNigka2V5LCRiaXRzKSwkaW5wCSMgcG9pbnRzIGF0IHRoZSBlbmQgb2Yga2V5IHNjaGVkdWxlCisKKwkkbW92a2V5CSgka2V5KSwleG1tMAkJIyBqdXN0IHN3YXAKKwkkbW92a2V5CSgkaW5wKSwleG1tMQorCSRtb3ZrZXkJJXhtbTAsKCRpbnApCisJJG1vdmtleQkleG1tMSwoJGtleSkKKwlsZWEJMTYoJGtleSksJGtleQorCWxlYQktMTYoJGlucCksJGlucAorCisuTGRlY19rZXlfaW52ZXJzZToKKwkkbW92a2V5CSgka2V5KSwleG1tMAkJIyBzd2FwIGFuZCBpbnZlcnNlCisJJG1vdmtleQkoJGlucCksJXhtbTEKKwlhZXNpbWMJJXhtbTAsJXhtbTAKKwlhZXNpbWMJJXhtbTEsJXhtbTEKKwlsZWEJMTYoJGtleSksJGtleQorCWxlYQktMTYoJGlucCksJGlucAorCSRtb3ZrZXkJJXhtbTAsMTYoJGlucCkKKwkkbW92a2V5CSV4bW0xLC0xNigka2V5KQorCWNtcAkka2V5LCRpbnAKKwlqYQkuTGRlY19rZXlfaW52ZXJzZQorCisJJG1vdmtleQkoJGtleSksJXhtbTAJCSMgaW52ZXJzZSBtaWRkbGUKKwlhZXNpbWMJJXhtbTAsJXhtbTAKKwkkbW92a2V5CSV4bW0wLCgkaW5wKQorLkxkZWNfa2V5X3JldDoKKwlhZGQJXCQ4LCVyc3AKKwlyZXQKKy5MU0VIX2VuZF9zZXRfZGVjcnlwdF9rZXk6Cisuc2l6ZQkke1BSRUZJWH1fc2V0X2RlY3J5cHRfa2V5LC4tJHtQUkVGSVh9X3NldF9kZWNyeXB0X2tleQorX19fCisMCisjIFRoaXMgaXMgYmFzZWQgb24gc3VibWlzc2lvbiBieQorIworIwlIdWFuZyBZaW5nIDx5aW5nLmh1YW5nQGludGVsLmNvbT4KKyMJVmlub2RoIEdvcGFsIDx2aW5vZGguZ29wYWxAaW50ZWwuY29tPgorIwlLYWhyYW1hbiBBa2RlbWlyCisjCisjIEFncmVzc2l2ZWx5IG9wdGltaXplZCBpbiByZXNwZWN0IHRvIGFlc2tleWdlbmFzc2lzdCdzIGNyaXRpY2FsIHBhdGgKKyMgYW5kIGlzIGNvbnRhaW5lZCBpbiAleG1tMC01IHRvIG1lZXQgV2luNjQgQUJJIHJlcXVpcmVtZW50LgorIworJGNvZGUuPTw8X19fOworLmdsb2JsCSR7UFJFRklYfV9zZXRfZW5jcnlwdF9rZXkKKy50eXBlCSR7UFJFRklYfV9zZXRfZW5jcnlwdF9rZXksXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2Ciske1BSRUZJWH1fc2V0X2VuY3J5cHRfa2V5OgorX19hZXNuaV9zZXRfZW5jcnlwdF9rZXk6CisJLmJ5dGUJMHg0OCwweDgzLDB4RUMsMHgwOAkjIHN1YiByc3AsOAorCW1vdglcJC0xLCVyYXgKKwl0ZXN0CSRpbnAsJGlucAorCWp6CS5MZW5jX2tleV9yZXQKKwl0ZXN0CSRrZXksJGtleQorCWp6CS5MZW5jX2tleV9yZXQKKworCW1vdnVwcwkoJGlucCksJXhtbTAJCSMgcHVsbCBmaXJzdCAxMjggYml0cyBvZiAqdXNlcktleQorCXhvcnBzCSV4bW00LCV4bW00CQkjIGxvdyBkd29yZCBvZiB4bW00IGlzIGFzc3VtZWQgMAorCWxlYQkxNigka2V5KSwlcmF4CisJY21wCVwkMjU2LCRiaXRzCisJamUJLkwxNHJvdW5kcworCWNtcAlcJDE5MiwkYml0cworCWplCS5MMTJyb3VuZHMKKwljbXAJXCQxMjgsJGJpdHMKKwlqbmUJLkxiYWRfa2V5Yml0cworCisuTDEwcm91bmRzOgorCW1vdglcJDksJGJpdHMJCQkjIDEwIHJvdW5kcyBmb3IgMTI4LWJpdCBrZXkKKwkkbW92a2V5CSV4bW0wLCgka2V5KQkJCSMgcm91bmQgMAorCWFlc2tleWdlbmFzc2lzdAlcJDB4MSwleG1tMCwleG1tMQkjIHJvdW5kIDEKKwljYWxsCQkuTGtleV9leHBhbnNpb25fMTI4X2NvbGQKKwlhZXNrZXlnZW5hc3Npc3QJXCQweDIsJXhtbTAsJXhtbTEJIyByb3VuZCAyCisJY2FsbAkJLkxrZXlfZXhwYW5zaW9uXzEyOAorCWFlc2tleWdlbmFzc2lzdAlcJDB4NCwleG1tMCwleG1tMQkjIHJvdW5kIDMKKwljYWxsCQkuTGtleV9leHBhbnNpb25fMTI4CisJYWVza2V5Z2VuYXNzaXN0CVwkMHg4LCV4bW0wLCV4bW0xCSMgcm91bmQgNAorCWNhbGwJCS5Ma2V5X2V4cGFuc2lvbl8xMjgKKwlhZXNrZXlnZW5hc3Npc3QJXCQweDEwLCV4bW0wLCV4bW0xCSMgcm91bmQgNQorCWNhbGwJCS5Ma2V5X2V4cGFuc2lvbl8xMjgKKwlhZXNrZXlnZW5hc3Npc3QJXCQweDIwLCV4bW0wLCV4bW0xCSMgcm91bmQgNgorCWNhbGwJCS5Ma2V5X2V4cGFuc2lvbl8xMjgKKwlhZXNrZXlnZW5hc3Npc3QJXCQweDQwLCV4bW0wLCV4bW0xCSMgcm91bmQgNworCWNhbGwJCS5Ma2V5X2V4cGFuc2lvbl8xMjgKKwlhZXNrZXlnZW5hc3Npc3QJXCQweDgwLCV4bW0wLCV4bW0xCSMgcm91bmQgOAorCWNhbGwJCS5Ma2V5X2V4cGFuc2lvbl8xMjgKKwlhZXNrZXlnZW5hc3Npc3QJXCQweDFiLCV4bW0wLCV4bW0xCSMgcm91bmQgOQorCWNhbGwJCS5Ma2V5X2V4cGFuc2lvbl8xMjgKKwlhZXNrZXlnZW5hc3Npc3QJXCQweDM2LCV4bW0wLCV4bW0xCSMgcm91bmQgMTAKKwljYWxsCQkuTGtleV9leHBhbnNpb25fMTI4CisJJG1vdmtleQkleG1tMCwoJXJheCkKKwltb3YJJGJpdHMsODAoJXJheCkJIyAyNDAoJXJkeCkKKwl4b3IJJWVheCwlZWF4CisJam1wCS5MZW5jX2tleV9yZXQKKworLmFsaWduCTE2CisuTDEycm91bmRzOgorCW1vdnEJMTYoJGlucCksJXhtbTIJCQkjIHJlbWFpbmluZyAxLzMgb2YgKnVzZXJLZXkKKwltb3YJXCQxMSwkYml0cwkJCSMgMTIgcm91bmRzIGZvciAxOTIKKwkkbW92a2V5CSV4bW0wLCgka2V5KQkJCSMgcm91bmQgMAorCWFlc2tleWdlbmFzc2lzdAlcJDB4MSwleG1tMiwleG1tMQkjIHJvdW5kIDEsMgorCWNhbGwJCS5Ma2V5X2V4cGFuc2lvbl8xOTJhX2NvbGQKKwlhZXNrZXlnZW5hc3Npc3QJXCQweDIsJXhtbTIsJXhtbTEJIyByb3VuZCAyLDMKKwljYWxsCQkuTGtleV9leHBhbnNpb25fMTkyYgorCWFlc2tleWdlbmFzc2lzdAlcJDB4NCwleG1tMiwleG1tMQkjIHJvdW5kIDQsNQorCWNhbGwJCS5Ma2V5X2V4cGFuc2lvbl8xOTJhCisJYWVza2V5Z2VuYXNzaXN0CVwkMHg4LCV4bW0yLCV4bW0xCSMgcm91bmQgNSw2CisJY2FsbAkJLkxrZXlfZXhwYW5zaW9uXzE5MmIKKwlhZXNrZXlnZW5hc3Npc3QJXCQweDEwLCV4bW0yLCV4bW0xCSMgcm91bmQgNyw4CisJY2FsbAkJLkxrZXlfZXhwYW5zaW9uXzE5MmEKKwlhZXNrZXlnZW5hc3Npc3QJXCQweDIwLCV4bW0yLCV4bW0xCSMgcm91bmQgOCw5CisJY2FsbAkJLkxrZXlfZXhwYW5zaW9uXzE5MmIKKwlhZXNrZXlnZW5hc3Npc3QJXCQweDQwLCV4bW0yLCV4bW0xCSMgcm91bmQgMTAsMTEKKwljYWxsCQkuTGtleV9leHBhbnNpb25fMTkyYQorCWFlc2tleWdlbmFzc2lzdAlcJDB4ODAsJXhtbTIsJXhtbTEJIyByb3VuZCAxMSwxMgorCWNhbGwJCS5Ma2V5X2V4cGFuc2lvbl8xOTJiCisJJG1vdmtleQkleG1tMCwoJXJheCkKKwltb3YJJGJpdHMsNDgoJXJheCkJIyAyNDAoJXJkeCkKKwl4b3IJJXJheCwgJXJheAorCWptcAkuTGVuY19rZXlfcmV0CisKKy5hbGlnbgkxNgorLkwxNHJvdW5kczoKKwltb3Z1cHMJMTYoJGlucCksJXhtbTIJCQkjIHJlbWFuaW5nIGhhbGYgb2YgKnVzZXJLZXkKKwltb3YJXCQxMywkYml0cwkJCSMgMTQgcm91bmRzIGZvciAyNTYKKwlsZWEJMTYoJXJheCksJXJheAorCSRtb3ZrZXkJJXhtbTAsKCRrZXkpCQkJIyByb3VuZCAwCisJJG1vdmtleQkleG1tMiwxNigka2V5KQkJCSMgcm91bmQgMQorCWFlc2tleWdlbmFzc2lzdAlcJDB4MSwleG1tMiwleG1tMQkjIHJvdW5kIDIKKwljYWxsCQkuTGtleV9leHBhbnNpb25fMjU2YV9jb2xkCisJYWVza2V5Z2VuYXNzaXN0CVwkMHgxLCV4bW0wLCV4bW0xCSMgcm91bmQgMworCWNhbGwJCS5Ma2V5X2V4cGFuc2lvbl8yNTZiCisJYWVza2V5Z2VuYXNzaXN0CVwkMHgyLCV4bW0yLCV4bW0xCSMgcm91bmQgNAorCWNhbGwJCS5Ma2V5X2V4cGFuc2lvbl8yNTZhCisJYWVza2V5Z2VuYXNzaXN0CVwkMHgyLCV4bW0wLCV4bW0xCSMgcm91bmQgNQorCWNhbGwJCS5Ma2V5X2V4cGFuc2lvbl8yNTZiCisJYWVza2V5Z2VuYXNzaXN0CVwkMHg0LCV4bW0yLCV4bW0xCSMgcm91bmQgNgorCWNhbGwJCS5Ma2V5X2V4cGFuc2lvbl8yNTZhCisJYWVza2V5Z2VuYXNzaXN0CVwkMHg0LCV4bW0wLCV4bW0xCSMgcm91bmQgNworCWNhbGwJCS5Ma2V5X2V4cGFuc2lvbl8yNTZiCisJYWVza2V5Z2VuYXNzaXN0CVwkMHg4LCV4bW0yLCV4bW0xCSMgcm91bmQgOAorCWNhbGwJCS5Ma2V5X2V4cGFuc2lvbl8yNTZhCisJYWVza2V5Z2VuYXNzaXN0CVwkMHg4LCV4bW0wLCV4bW0xCSMgcm91bmQgOQorCWNhbGwJCS5Ma2V5X2V4cGFuc2lvbl8yNTZiCisJYWVza2V5Z2VuYXNzaXN0CVwkMHgxMCwleG1tMiwleG1tMQkjIHJvdW5kIDEwCisJY2FsbAkJLkxrZXlfZXhwYW5zaW9uXzI1NmEKKwlhZXNrZXlnZW5hc3Npc3QJXCQweDEwLCV4bW0wLCV4bW0xCSMgcm91bmQgMTEKKwljYWxsCQkuTGtleV9leHBhbnNpb25fMjU2YgorCWFlc2tleWdlbmFzc2lzdAlcJDB4MjAsJXhtbTIsJXhtbTEJIyByb3VuZCAxMgorCWNhbGwJCS5Ma2V5X2V4cGFuc2lvbl8yNTZhCisJYWVza2V5Z2VuYXNzaXN0CVwkMHgyMCwleG1tMCwleG1tMQkjIHJvdW5kIDEzCisJY2FsbAkJLkxrZXlfZXhwYW5zaW9uXzI1NmIKKwlhZXNrZXlnZW5hc3Npc3QJXCQweDQwLCV4bW0yLCV4bW0xCSMgcm91bmQgMTQKKwljYWxsCQkuTGtleV9leHBhbnNpb25fMjU2YQorCSRtb3ZrZXkJJXhtbTAsKCVyYXgpCisJbW92CSRiaXRzLDE2KCVyYXgpCSMgMjQwKCVyZHgpCisJeG9yCSVyYXgsJXJheAorCWptcAkuTGVuY19rZXlfcmV0CisKKy5hbGlnbgkxNgorLkxiYWRfa2V5Yml0czoKKwltb3YJXCQtMiwlcmF4CisuTGVuY19rZXlfcmV0OgorCWFkZAlcJDgsJXJzcAorCXJldAorLkxTRUhfZW5kX3NldF9lbmNyeXB0X2tleToKKwwKKy5hbGlnbgkxNgorLkxrZXlfZXhwYW5zaW9uXzEyODoKKwkkbW92a2V5CSV4bW0wLCglcmF4KQorCWxlYQkxNiglcmF4KSwlcmF4CisuTGtleV9leHBhbnNpb25fMTI4X2NvbGQ6CisJc2h1ZnBzCVwkMGIwMDAxMDAwMCwleG1tMCwleG1tNAorCXhvcnBzCSV4bW00LCAleG1tMAorCXNodWZwcwlcJDBiMTAwMDExMDAsJXhtbTAsJXhtbTQKKwl4b3JwcwkleG1tNCwgJXhtbTAKKwlzaHVmcHMJXCQwYjExMTExMTExLCV4bW0xLCV4bW0xCSMgY3JpdGljYWwgcGF0aAorCXhvcnBzCSV4bW0xLCV4bW0wCisJcmV0CisKKy5hbGlnbiAxNgorLkxrZXlfZXhwYW5zaW9uXzE5MmE6CisJJG1vdmtleQkleG1tMCwoJXJheCkKKwlsZWEJMTYoJXJheCksJXJheAorLkxrZXlfZXhwYW5zaW9uXzE5MmFfY29sZDoKKwltb3ZhcHMJJXhtbTIsICV4bW01CisuTGtleV9leHBhbnNpb25fMTkyYl93YXJtOgorCXNodWZwcwlcJDBiMDAwMTAwMDAsJXhtbTAsJXhtbTQKKwltb3ZkcWEJJXhtbTIsJXhtbTMKKwl4b3JwcwkleG1tNCwleG1tMAorCXNodWZwcwlcJDBiMTAwMDExMDAsJXhtbTAsJXhtbTQKKwlwc2xsZHEJXCQ0LCV4bW0zCisJeG9ycHMJJXhtbTQsJXhtbTAKKwlwc2h1ZmQJXCQwYjAxMDEwMTAxLCV4bW0xLCV4bW0xCSMgY3JpdGljYWwgcGF0aAorCXB4b3IJJXhtbTMsJXhtbTIKKwlweG9yCSV4bW0xLCV4bW0wCisJcHNodWZkCVwkMGIxMTExMTExMSwleG1tMCwleG1tMworCXB4b3IJJXhtbTMsJXhtbTIKKwlyZXQKKworLmFsaWduIDE2CisuTGtleV9leHBhbnNpb25fMTkyYjoKKwltb3ZhcHMJJXhtbTAsJXhtbTMKKwlzaHVmcHMJXCQwYjAxMDAwMTAwLCV4bW0wLCV4bW01CisJJG1vdmtleQkleG1tNSwoJXJheCkKKwlzaHVmcHMJXCQwYjAxMDAxMTEwLCV4bW0yLCV4bW0zCisJJG1vdmtleQkleG1tMywxNiglcmF4KQorCWxlYQkzMiglcmF4KSwlcmF4CisJam1wCS5Ma2V5X2V4cGFuc2lvbl8xOTJiX3dhcm0KKworLmFsaWduCTE2CisuTGtleV9leHBhbnNpb25fMjU2YToKKwkkbW92a2V5CSV4bW0yLCglcmF4KQorCWxlYQkxNiglcmF4KSwlcmF4CisuTGtleV9leHBhbnNpb25fMjU2YV9jb2xkOgorCXNodWZwcwlcJDBiMDAwMTAwMDAsJXhtbTAsJXhtbTQKKwl4b3JwcwkleG1tNCwleG1tMAorCXNodWZwcwlcJDBiMTAwMDExMDAsJXhtbTAsJXhtbTQKKwl4b3JwcwkleG1tNCwleG1tMAorCXNodWZwcwlcJDBiMTExMTExMTEsJXhtbTEsJXhtbTEJIyBjcml0aWNhbCBwYXRoCisJeG9ycHMJJXhtbTEsJXhtbTAKKwlyZXQKKworLmFsaWduIDE2CisuTGtleV9leHBhbnNpb25fMjU2YjoKKwkkbW92a2V5CSV4bW0wLCglcmF4KQorCWxlYQkxNiglcmF4KSwlcmF4CisKKwlzaHVmcHMJXCQwYjAwMDEwMDAwLCV4bW0yLCV4bW00CisJeG9ycHMJJXhtbTQsJXhtbTIKKwlzaHVmcHMJXCQwYjEwMDAxMTAwLCV4bW0yLCV4bW00CisJeG9ycHMJJXhtbTQsJXhtbTIKKwlzaHVmcHMJXCQwYjEwMTAxMDEwLCV4bW0xLCV4bW0xCSMgY3JpdGljYWwgcGF0aAorCXhvcnBzCSV4bW0xLCV4bW0yCisJcmV0Cisuc2l6ZQkke1BSRUZJWH1fc2V0X2VuY3J5cHRfa2V5LC4tJHtQUkVGSVh9X3NldF9lbmNyeXB0X2tleQorLnNpemUJX19hZXNuaV9zZXRfZW5jcnlwdF9rZXksLi1fX2Flc25pX3NldF9lbmNyeXB0X2tleQorX19fCit9CisMCiskY29kZS49PDxfX187CisuYWxpZ24JNjQKKy5MYnN3YXBfbWFzazoKKwkuYnl0ZQkxNSwxNCwxMywxMiwxMSwxMCw5LDgsNyw2LDUsNCwzLDIsMSwwCisuTGluY3JlbWVudDMyOgorCS5sb25nCTYsNiw2LDAKKy5MaW5jcmVtZW50NjQ6CisJLmxvbmcJMSwwLDAsMAorLkx4dHNfbWFnaWM6CisJLmxvbmcJMHg4NywwLDEsMAorCisuYXNjaXogICJBRVMgZm9yIEludGVsIEFFUy1OSSwgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQG9wZW5zc2wub3JnPiIKKy5hbGlnbgk2NAorX19fCisKKyMgRVhDRVBUSU9OX0RJU1BPU0lUSU9OIGhhbmRsZXIgKEVYQ0VQVElPTl9SRUNPUkQgKnJlYyxVTE9ORzY0IGZyYW1lLAorIwkJQ09OVEVYVCAqY29udGV4dCxESVNQQVRDSEVSX0NPTlRFWFQgKmRpc3ApCitpZiAoJHdpbjY0KSB7CiskcmVjPSIlcmN4IjsKKyRmcmFtZT0iJXJkeCI7CiskY29udGV4dD0iJXI4IjsKKyRkaXNwPSIlcjkiOworCiskY29kZS49PDxfX187CisuZXh0ZXJuCV9faW1wX1J0bFZpcnR1YWxVbndpbmQKK19fXworJGNvZGUuPTw8X19fIGlmICgkUFJFRklYIGVxICJhZXNuaSIpOworLnR5cGUJZWNiX3NlX2hhbmRsZXIsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2CitlY2Jfc2VfaGFuZGxlcjoKKwlwdXNoCSVyc2kKKwlwdXNoCSVyZGkKKwlwdXNoCSVyYngKKwlwdXNoCSVyYnAKKwlwdXNoCSVyMTIKKwlwdXNoCSVyMTMKKwlwdXNoCSVyMTQKKwlwdXNoCSVyMTUKKwlwdXNoZnEKKwlzdWIJXCQ2NCwlcnNwCisKKwltb3YJMTUyKCRjb250ZXh0KSwlcmF4CSMgcHVsbCBjb250ZXh0LT5Sc3AKKworCWptcAkuTGNvbW1vbl9zZWhfdGFpbAorLnNpemUJZWNiX3NlX2hhbmRsZXIsLi1lY2Jfc2VfaGFuZGxlcgorCisudHlwZQljY202NF9zZV9oYW5kbGVyLFxAYWJpLW9tbmlwb3RlbnQKKy5hbGlnbgkxNgorY2NtNjRfc2VfaGFuZGxlcjoKKwlwdXNoCSVyc2kKKwlwdXNoCSVyZGkKKwlwdXNoCSVyYngKKwlwdXNoCSVyYnAKKwlwdXNoCSVyMTIKKwlwdXNoCSVyMTMKKwlwdXNoCSVyMTQKKwlwdXNoCSVyMTUKKwlwdXNoZnEKKwlzdWIJXCQ2NCwlcnNwCisKKwltb3YJMTIwKCRjb250ZXh0KSwlcmF4CSMgcHVsbCBjb250ZXh0LT5SYXgKKwltb3YJMjQ4KCRjb250ZXh0KSwlcmJ4CSMgcHVsbCBjb250ZXh0LT5SaXAKKworCW1vdgk4KCRkaXNwKSwlcnNpCQkjIGRpc3AtPkltYWdlQmFzZQorCW1vdgk1NigkZGlzcCksJXIxMQkJIyBkaXNwLT5IYW5kbGVyRGF0YQorCisJbW92CTAoJXIxMSksJXIxMGQJCSMgSGFuZGxlckRhdGFbMF0KKwlsZWEJKCVyc2ksJXIxMCksJXIxMAkjIHByb2xvZ3VlIGxhYmVsCisJY21wCSVyMTAsJXJieAkJIyBjb250ZXh0LT5SaXA8cHJvbG9ndWUgbGFiZWwKKwlqYgkuTGNvbW1vbl9zZWhfdGFpbAorCisJbW92CTE1MigkY29udGV4dCksJXJheAkjIHB1bGwgY29udGV4dC0+UnNwCisKKwltb3YJNCglcjExKSwlcjEwZAkJIyBIYW5kbGVyRGF0YVsxXQorCWxlYQkoJXJzaSwlcjEwKSwlcjEwCSMgZXBpbG9ndWUgbGFiZWwKKwljbXAJJXIxMCwlcmJ4CQkjIGNvbnRleHQtPlJpcD49ZXBpbG9ndWUgbGFiZWwKKwlqYWUJLkxjb21tb25fc2VoX3RhaWwKKworCWxlYQkwKCVyYXgpLCVyc2kJCSMgJXhtbSBzYXZlIGFyZWEKKwlsZWEJNTEyKCRjb250ZXh0KSwlcmRpCSMgJmNvbnRleHQuWG1tNgorCW1vdglcJDgsJWVjeAkJIyA0KnNpemVvZigleG1tMCkvc2l6ZW9mKCVyYXgpCisJLmxvbmcJMHhhNTQ4ZjNmYwkJIyBjbGQ7IHJlcCBtb3ZzcQorCWxlYQkweDU4KCVyYXgpLCVyYXgJCSMgYWRqdXN0IHN0YWNrIHBvaW50ZXIKKworCWptcAkuTGNvbW1vbl9zZWhfdGFpbAorLnNpemUJY2NtNjRfc2VfaGFuZGxlciwuLWNjbTY0X3NlX2hhbmRsZXIKKworLnR5cGUJY3RyMzJfc2VfaGFuZGxlcixcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMTYKK2N0cjMyX3NlX2hhbmRsZXI6CisJcHVzaAklcnNpCisJcHVzaAklcmRpCisJcHVzaAklcmJ4CisJcHVzaAklcmJwCisJcHVzaAklcjEyCisJcHVzaAklcjEzCisJcHVzaAklcjE0CisJcHVzaAklcjE1CisJcHVzaGZxCisJc3ViCVwkNjQsJXJzcAorCisJbW92CTEyMCgkY29udGV4dCksJXJheAkjIHB1bGwgY29udGV4dC0+UmF4CisJbW92CTI0OCgkY29udGV4dCksJXJieAkjIHB1bGwgY29udGV4dC0+UmlwCisKKwlsZWEJLkxjdHIzMl9ib2R5KCVyaXApLCVyMTAKKwljbXAJJXIxMCwlcmJ4CQkjIGNvbnRleHQtPlJpcDwicHJvbG9ndWUiIGxhYmVsCisJamIJLkxjb21tb25fc2VoX3RhaWwKKworCW1vdgkxNTIoJGNvbnRleHQpLCVyYXgJIyBwdWxsIGNvbnRleHQtPlJzcAorCisJbGVhCS5MY3RyMzJfcmV0KCVyaXApLCVyMTAKKwljbXAJJXIxMCwlcmJ4CisJamFlCS5MY29tbW9uX3NlaF90YWlsCisKKwlsZWEJMHgyMCglcmF4KSwlcnNpCQkjICV4bW0gc2F2ZSBhcmVhCisJbGVhCTUxMigkY29udGV4dCksJXJkaQkjICZjb250ZXh0LlhtbTYKKwltb3YJXCQyMCwlZWN4CQkjIDEwKnNpemVvZigleG1tMCkvc2l6ZW9mKCVyYXgpCisJLmxvbmcJMHhhNTQ4ZjNmYwkJIyBjbGQ7IHJlcCBtb3ZzcQorCWxlYQkweGM4KCVyYXgpLCVyYXgJCSMgYWRqdXN0IHN0YWNrIHBvaW50ZXIKKworCWptcAkuTGNvbW1vbl9zZWhfdGFpbAorLnNpemUJY3RyMzJfc2VfaGFuZGxlciwuLWN0cjMyX3NlX2hhbmRsZXIKKworLnR5cGUJeHRzX3NlX2hhbmRsZXIsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2Cit4dHNfc2VfaGFuZGxlcjoKKwlwdXNoCSVyc2kKKwlwdXNoCSVyZGkKKwlwdXNoCSVyYngKKwlwdXNoCSVyYnAKKwlwdXNoCSVyMTIKKwlwdXNoCSVyMTMKKwlwdXNoCSVyMTQKKwlwdXNoCSVyMTUKKwlwdXNoZnEKKwlzdWIJXCQ2NCwlcnNwCisKKwltb3YJMTIwKCRjb250ZXh0KSwlcmF4CSMgcHVsbCBjb250ZXh0LT5SYXgKKwltb3YJMjQ4KCRjb250ZXh0KSwlcmJ4CSMgcHVsbCBjb250ZXh0LT5SaXAKKworCW1vdgk4KCRkaXNwKSwlcnNpCQkjIGRpc3AtPkltYWdlQmFzZQorCW1vdgk1NigkZGlzcCksJXIxMQkJIyBkaXNwLT5IYW5kbGVyRGF0YQorCisJbW92CTAoJXIxMSksJXIxMGQJCSMgSGFuZGxlckRhdGFbMF0KKwlsZWEJKCVyc2ksJXIxMCksJXIxMAkjIHByb2xvZ3VlIGxhYmxlCisJY21wCSVyMTAsJXJieAkJIyBjb250ZXh0LT5SaXA8cHJvbG9ndWUgbGFiZWwKKwlqYgkuTGNvbW1vbl9zZWhfdGFpbAorCisJbW92CTE1MigkY29udGV4dCksJXJheAkjIHB1bGwgY29udGV4dC0+UnNwCisKKwltb3YJNCglcjExKSwlcjEwZAkJIyBIYW5kbGVyRGF0YVsxXQorCWxlYQkoJXJzaSwlcjEwKSwlcjEwCSMgZXBpbG9ndWUgbGFiZWwKKwljbXAJJXIxMCwlcmJ4CQkjIGNvbnRleHQtPlJpcD49ZXBpbG9ndWUgbGFiZWwKKwlqYWUJLkxjb21tb25fc2VoX3RhaWwKKworCWxlYQkweDYwKCVyYXgpLCVyc2kJCSMgJXhtbSBzYXZlIGFyZWEKKwlsZWEJNTEyKCRjb250ZXh0KSwlcmRpCSMgJiBjb250ZXh0LlhtbTYKKwltb3YJXCQyMCwlZWN4CQkjIDEwKnNpemVvZigleG1tMCkvc2l6ZW9mKCVyYXgpCisJLmxvbmcJMHhhNTQ4ZjNmYwkJIyBjbGQ7IHJlcCBtb3ZzcQorCWxlYQkweDY4KzE2MCglcmF4KSwlcmF4CSMgYWRqdXN0IHN0YWNrIHBvaW50ZXIKKworCWptcAkuTGNvbW1vbl9zZWhfdGFpbAorLnNpemUJeHRzX3NlX2hhbmRsZXIsLi14dHNfc2VfaGFuZGxlcgorX19fCiskY29kZS49PDxfX187CisudHlwZQljYmNfc2VfaGFuZGxlcixcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMTYKK2NiY19zZV9oYW5kbGVyOgorCXB1c2gJJXJzaQorCXB1c2gJJXJkaQorCXB1c2gJJXJieAorCXB1c2gJJXJicAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCXB1c2gJJXIxNQorCXB1c2hmcQorCXN1YglcJDY0LCVyc3AKKworCW1vdgkxNTIoJGNvbnRleHQpLCVyYXgJIyBwdWxsIGNvbnRleHQtPlJzcAorCW1vdgkyNDgoJGNvbnRleHQpLCVyYngJIyBwdWxsIGNvbnRleHQtPlJpcAorCisJbGVhCS5MY2JjX2RlY3J5cHQoJXJpcCksJXIxMAorCWNtcAklcjEwLCVyYngJCSMgY29udGV4dC0+UmlwPCJwcm9sb2d1ZSIgbGFiZWwKKwlqYgkuTGNvbW1vbl9zZWhfdGFpbAorCisJbGVhCS5MY2JjX2RlY3J5cHRfYm9keSglcmlwKSwlcjEwCisJY21wCSVyMTAsJXJieAkJIyBjb250ZXh0LT5SaXA8Y2JjX2RlY3J5cHRfYm9keQorCWpiCS5McmVzdG9yZV9jYmNfcmF4CisKKwlsZWEJLkxjYmNfcmV0KCVyaXApLCVyMTAKKwljbXAJJXIxMCwlcmJ4CQkjIGNvbnRleHQtPlJpcD49ImVwaWxvZ3VlIiBsYWJlbAorCWphZQkuTGNvbW1vbl9zZWhfdGFpbAorCisJbGVhCTAoJXJheCksJXJzaQkJIyB0b3Agb2Ygc3RhY2sKKwlsZWEJNTEyKCRjb250ZXh0KSwlcmRpCSMgJmNvbnRleHQuWG1tNgorCW1vdglcJDgsJWVjeAkJIyA0KnNpemVvZigleG1tMCkvc2l6ZW9mKCVyYXgpCisJLmxvbmcJMHhhNTQ4ZjNmYwkJIyBjbGQ7IHJlcCBtb3ZzcQorCWxlYQkweDU4KCVyYXgpLCVyYXgJCSMgYWRqdXN0IHN0YWNrIHBvaW50ZXIKKwlqbXAJLkxjb21tb25fc2VoX3RhaWwKKworLkxyZXN0b3JlX2NiY19yYXg6CisJbW92CTEyMCgkY29udGV4dCksJXJheAorCisuTGNvbW1vbl9zZWhfdGFpbDoKKwltb3YJOCglcmF4KSwlcmRpCisJbW92CTE2KCVyYXgpLCVyc2kKKwltb3YJJXJheCwxNTIoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5Sc3AKKwltb3YJJXJzaSwxNjgoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5Sc2kKKwltb3YJJXJkaSwxNzYoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SZGkKKworCW1vdgk0MCgkZGlzcCksJXJkaQkJIyBkaXNwLT5Db250ZXh0UmVjb3JkCisJbW92CSRjb250ZXh0LCVyc2kJCSMgY29udGV4dAorCW1vdglcJDE1NCwlZWN4CQkjIHNpemVvZihDT05URVhUKQorCS5sb25nCTB4YTU0OGYzZmMJCSMgY2xkOyByZXAgbW92c3EKKworCW1vdgkkZGlzcCwlcnNpCisJeG9yCSVyY3gsJXJjeAkJIyBhcmcxLCBVTldfRkxBR19OSEFORExFUgorCW1vdgk4KCVyc2kpLCVyZHgJCSMgYXJnMiwgZGlzcC0+SW1hZ2VCYXNlCisJbW92CTAoJXJzaSksJXI4CQkjIGFyZzMsIGRpc3AtPkNvbnRyb2xQYworCW1vdgkxNiglcnNpKSwlcjkJCSMgYXJnNCwgZGlzcC0+RnVuY3Rpb25FbnRyeQorCW1vdgk0MCglcnNpKSwlcjEwCQkjIGRpc3AtPkNvbnRleHRSZWNvcmQKKwlsZWEJNTYoJXJzaSksJXIxMQkJIyAmZGlzcC0+SGFuZGxlckRhdGEKKwlsZWEJMjQoJXJzaSksJXIxMgkJIyAmZGlzcC0+RXN0YWJsaXNoZXJGcmFtZQorCW1vdgklcjEwLDMyKCVyc3ApCQkjIGFyZzUKKwltb3YJJXIxMSw0MCglcnNwKQkJIyBhcmc2CisJbW92CSVyMTIsNDgoJXJzcCkJCSMgYXJnNworCW1vdgklcmN4LDU2KCVyc3ApCQkjIGFyZzgsIChOVUxMKQorCWNhbGwJKl9faW1wX1J0bFZpcnR1YWxVbndpbmQoJXJpcCkKKworCW1vdglcJDEsJWVheAkJIyBFeGNlcHRpb25Db250aW51ZVNlYXJjaAorCWFkZAlcJDY0LCVyc3AKKwlwb3BmcQorCXBvcAklcjE1CisJcG9wCSVyMTQKKwlwb3AJJXIxMworCXBvcAklcjEyCisJcG9wCSVyYnAKKwlwb3AJJXJieAorCXBvcAklcmRpCisJcG9wCSVyc2kKKwlyZXQKKy5zaXplCWNiY19zZV9oYW5kbGVyLC4tY2JjX3NlX2hhbmRsZXIKKworLnNlY3Rpb24JLnBkYXRhCisuYWxpZ24JNAorX19fCiskY29kZS49PDxfX18gaWYgKCRQUkVGSVggZXEgImFlc25pIik7CisJLnJ2YQkuTFNFSF9iZWdpbl9hZXNuaV9lY2JfZW5jcnlwdAorCS5ydmEJLkxTRUhfZW5kX2Flc25pX2VjYl9lbmNyeXB0CisJLnJ2YQkuTFNFSF9pbmZvX2VjYgorCisJLnJ2YQkuTFNFSF9iZWdpbl9hZXNuaV9jY202NF9lbmNyeXB0X2Jsb2NrcworCS5ydmEJLkxTRUhfZW5kX2Flc25pX2NjbTY0X2VuY3J5cHRfYmxvY2tzCisJLnJ2YQkuTFNFSF9pbmZvX2NjbTY0X2VuYworCisJLnJ2YQkuTFNFSF9iZWdpbl9hZXNuaV9jY202NF9kZWNyeXB0X2Jsb2NrcworCS5ydmEJLkxTRUhfZW5kX2Flc25pX2NjbTY0X2RlY3J5cHRfYmxvY2tzCisJLnJ2YQkuTFNFSF9pbmZvX2NjbTY0X2RlYworCisJLnJ2YQkuTFNFSF9iZWdpbl9hZXNuaV9jdHIzMl9lbmNyeXB0X2Jsb2NrcworCS5ydmEJLkxTRUhfZW5kX2Flc25pX2N0cjMyX2VuY3J5cHRfYmxvY2tzCisJLnJ2YQkuTFNFSF9pbmZvX2N0cjMyCisKKwkucnZhCS5MU0VIX2JlZ2luX2Flc25pX3h0c19lbmNyeXB0CisJLnJ2YQkuTFNFSF9lbmRfYWVzbmlfeHRzX2VuY3J5cHQKKwkucnZhCS5MU0VIX2luZm9feHRzX2VuYworCisJLnJ2YQkuTFNFSF9iZWdpbl9hZXNuaV94dHNfZGVjcnlwdAorCS5ydmEJLkxTRUhfZW5kX2Flc25pX3h0c19kZWNyeXB0CisJLnJ2YQkuTFNFSF9pbmZvX3h0c19kZWMKK19fXworJGNvZGUuPTw8X19fOworCS5ydmEJLkxTRUhfYmVnaW5fJHtQUkVGSVh9X2NiY19lbmNyeXB0CisJLnJ2YQkuTFNFSF9lbmRfJHtQUkVGSVh9X2NiY19lbmNyeXB0CisJLnJ2YQkuTFNFSF9pbmZvX2NiYworCisJLnJ2YQkke1BSRUZJWH1fc2V0X2RlY3J5cHRfa2V5CisJLnJ2YQkuTFNFSF9lbmRfc2V0X2RlY3J5cHRfa2V5CisJLnJ2YQkuTFNFSF9pbmZvX2tleQorCisJLnJ2YQkke1BSRUZJWH1fc2V0X2VuY3J5cHRfa2V5CisJLnJ2YQkuTFNFSF9lbmRfc2V0X2VuY3J5cHRfa2V5CisJLnJ2YQkuTFNFSF9pbmZvX2tleQorLnNlY3Rpb24JLnhkYXRhCisuYWxpZ24JOAorX19fCiskY29kZS49PDxfX18gaWYgKCRQUkVGSVggZXEgImFlc25pIik7CisuTFNFSF9pbmZvX2VjYjoKKwkuYnl0ZQk5LDAsMCwwCisJLnJ2YQllY2Jfc2VfaGFuZGxlcgorLkxTRUhfaW5mb19jY202NF9lbmM6CisJLmJ5dGUJOSwwLDAsMAorCS5ydmEJY2NtNjRfc2VfaGFuZGxlcgorCS5ydmEJLkxjY202NF9lbmNfYm9keSwuTGNjbTY0X2VuY19yZXQJIyBIYW5kbGVyRGF0YVtdCisuTFNFSF9pbmZvX2NjbTY0X2RlYzoKKwkuYnl0ZQk5LDAsMCwwCisJLnJ2YQljY202NF9zZV9oYW5kbGVyCisJLnJ2YQkuTGNjbTY0X2RlY19ib2R5LC5MY2NtNjRfZGVjX3JldAkjIEhhbmRsZXJEYXRhW10KKy5MU0VIX2luZm9fY3RyMzI6CisJLmJ5dGUJOSwwLDAsMAorCS5ydmEJY3RyMzJfc2VfaGFuZGxlcgorLkxTRUhfaW5mb194dHNfZW5jOgorCS5ieXRlCTksMCwwLDAKKwkucnZhCXh0c19zZV9oYW5kbGVyCisJLnJ2YQkuTHh0c19lbmNfYm9keSwuTHh0c19lbmNfZXBpbG9ndWUJIyBIYW5kbGVyRGF0YVtdCisuTFNFSF9pbmZvX3h0c19kZWM6CisJLmJ5dGUJOSwwLDAsMAorCS5ydmEJeHRzX3NlX2hhbmRsZXIKKwkucnZhCS5MeHRzX2RlY19ib2R5LC5MeHRzX2RlY19lcGlsb2d1ZQkjIEhhbmRsZXJEYXRhW10KK19fXworJGNvZGUuPTw8X19fOworLkxTRUhfaW5mb19jYmM6CisJLmJ5dGUJOSwwLDAsMAorCS5ydmEJY2JjX3NlX2hhbmRsZXIKKy5MU0VIX2luZm9fa2V5OgorCS5ieXRlCTB4MDEsMHgwNCwweDAxLDB4MDAKKwkuYnl0ZQkweDA0LDB4MDIsMHgwMCwweDAwCSMgc3ViIHJzcCw4CitfX18KK30KKworc3ViIHJleCB7CisgIGxvY2FsICpvcGNvZGU9c2hpZnQ7CisgIG15ICgkZHN0LCRzcmMpPUBfOworICBteSAkcmV4PTA7CisKKyAgICAkcmV4fD0weDA0CQkJaWYoJGRzdD49OCk7CisgICAgJHJleHw9MHgwMQkJCWlmKCRzcmM+PTgpOworICAgIHB1c2ggQG9wY29kZSwkcmV4fDB4NDAJaWYoJHJleCk7Cit9CisKK3N1YiBhZXNuaSB7CisgIG15ICRsaW5lPXNoaWZ0OworICBteSBAb3Bjb2RlPSgweDY2KTsKKworICAgIGlmICgkbGluZT1+LyhhZXNrZXlnZW5hc3Npc3QpXHMrXCQoW3gwLTlhLWZdKyksXHMqJXhtbShbMC05XSspLFxzKiV4bW0oWzAtOV0rKS8pIHsKKwlyZXgoXEBvcGNvZGUsJDQsJDMpOworCXB1c2ggQG9wY29kZSwweDBmLDB4M2EsMHhkZjsKKwlwdXNoIEBvcGNvZGUsMHhjMHwoJDMmNyl8KCgkNCY3KTw8Myk7CSMgTW9kUi9NCisJbXkgJGM9JDI7CisJcHVzaCBAb3Bjb2RlLCRjPX4vXjAvP29jdCgkYyk6JGM7CisJcmV0dXJuICIuYnl0ZVx0Ii5qb2luKCcsJyxAb3Bjb2RlKTsKKyAgICB9CisgICAgZWxzaWYgKCRsaW5lPX4vKGFlc1thLXpdKylccysleG1tKFswLTldKyksXHMqJXhtbShbMC05XSspLykgeworCW15ICVvcGNvZGVsZXQgPSAoCisJCSJhZXNpbWMiID0+IDB4ZGIsCisJCSJhZXNlbmMiID0+IDB4ZGMsCSJhZXNlbmNsYXN0IiA9PiAweGRkLAorCQkiYWVzZGVjIiA9PiAweGRlLAkiYWVzZGVjbGFzdCIgPT4gMHhkZgorCSk7CisJcmV0dXJuIHVuZGVmIGlmICghZGVmaW5lZCgkb3Bjb2RlbGV0eyQxfSkpOworCXJleChcQG9wY29kZSwkMywkMik7CisJcHVzaCBAb3Bjb2RlLDB4MGYsMHgzOCwkb3Bjb2RlbGV0eyQxfTsKKwlwdXNoIEBvcGNvZGUsMHhjMHwoJDImNyl8KCgkMyY3KTw8Myk7CSMgTW9kUi9NCisJcmV0dXJuICIuYnl0ZVx0Ii5qb2luKCcsJyxAb3Bjb2RlKTsKKyAgICB9CisgICAgcmV0dXJuICRsaW5lOworfQorCiskY29kZSA9fiBzL1xgKFteXGBdKilcYC9ldmFsKCQxKS9nZW07CiskY29kZSA9fiBzL1xiKGFlcy4qJXhtbVswLTldKykuKiQvYWVzbmkoJDEpL2dlbTsKKworcHJpbnQgJGNvZGU7CisKK2Nsb3NlIFNURE9VVDsKZGlmZiAtLWdpdCBhL2NyeXB0by9hZXMvYXNtL2JzYWVzLWFybXY3LnBsIGIvY3J5cHRvL2Flcy9hc20vYnNhZXMtYXJtdjcucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RhODU0MgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9hZXMvYXNtL2JzYWVzLWFybXY3LnBsCkBAIC0wLDAgKzEsMjQ2OSBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFdyaXR0ZW4gYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9Ab3BlbnNzbC5vcmc+IGZvciB0aGUgT3BlblNTTAorIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCisjIENSWVBUT0dBTVMgbGljZW5zZXMgZGVwZW5kaW5nIG9uIHdoZXJlIHlvdSBvYnRhaW4gaXQuIEZvciBmdXJ0aGVyCisjIGRldGFpbHMgc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvfmFwcHJvL2NyeXB0b2dhbXMvLgorIworIyBTcGVjaWZpYyBtb2RlcyBhbmQgYWRhcHRhdGlvbiBmb3IgTGludXgga2VybmVsIGJ5IEFyZCBCaWVzaGV1dmVsCisjIDxhcmQuYmllc2hldXZlbEBsaW5hcm8ub3JnPi4gUGVybWlzc2lvbiB0byB1c2UgdW5kZXIgR1BMIHRlcm1zIGlzCisjIGdyYW50ZWQuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgQml0LXNsaWNlZCBBRVMgZm9yIEFSTSBORU9OCisjCisjIEZlYnJ1YXJ5IDIwMTIuCisjCisjIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgZGlyZWN0IGFkYXB0YXRpb24gb2YgYnNhZXMteDg2XzY0IG1vZHVsZSBmb3IKKyMgQVJNIE5FT04uIEV4Y2VwdCB0aGF0IHRoaXMgbW9kdWxlIGlzIGVuZGlhbi1uZXV0cmFsIFtpbiBzZW5zZSB0aGF0CisjIGl0IGNhbiBiZSBjb21waWxlZCBmb3IgZWl0aGVyIGVuZGlhbm5lc3NdIGJ5IGNvdXJ0ZXN5IG9mIHZsZDEuOCdzCisjIG5ldXRyYWxpdHkuIEluaXRpYWwgdmVyc2lvbiBkb2Vzbid0IGltcGxlbWVudCBpbnRlcmZhY2UgdG8gT3BlblNTTCwKKyMgb25seSBsb3ctbGV2ZWwgcHJpbWl0aXZlcyBhbmQgdW5zdXBwb3J0ZWQgZW50cnkgcG9pbnRzLCBqdXN0IGVub3VnaAorIyB0byBjb2xsZWN0IHBlcmZvcm1hbmNlIHJlc3VsdHMsIHdoaWNoIGZvciBDb3J0ZXgtQTggY29yZSBhcmU6CisjCisjIGVuY3J5cHQJMTkuNSBjeWNsZXMgcGVyIGJ5dGUgcHJvY2Vzc2VkIHdpdGggMTI4LWJpdCBrZXkKKyMgZGVjcnlwdAkyMi4xIGN5Y2xlcyBwZXIgYnl0ZSBwcm9jZXNzZWQgd2l0aCAxMjgtYml0IGtleQorIyBrZXkgY29udi4JNDQwICBjeWNsZXMgcGVyIDEyOC1iaXQga2V5LzAuMTggb2YgOHggYmxvY2sKKyMKKyMgU25hcGRyYWdvbiBTNCBlbmNyeXB0cyBieXRlIGluIDE3LjYgY3ljbGVzIGFuZCBkZWNyeXB0cyBpbiAxOS43LAorIyB3aGljaCBpcyBbbXVjaF0gd29yc2UgdGhhbiBhbnRpY2lwYXRlZCAoZm9yIGZ1cnRoZXIgZGV0YWlscyBzZWUKKyMgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+YXBwcm8vU25hcGRyYWdvbi1TNC5odG1sKS4KKyMKKyMgQ29ydGV4LUExNSBtYW5hZ2VzIGluIDE0LjIvMTYuMSBjeWNsZXMgW3doZW4gaW50ZWdlci1vbmx5IGNvZGUKKyMgbWFuYWdlcyBpbiAyMC4wIGN5Y2xlc10uCisjCisjIFdoZW4gY29tcGFyaW5nIHRvIHg4Nl82NCByZXN1bHRzIGtlZXAgaW4gbWluZCB0aGF0IE5FT04gdW5pdCBpcworIyBbbW9zdGx5XSBzaW5nbGUtaXNzdWUgYW5kIHRodXMgY2FuJ3QgW2Z1bGx5XSBiZW5lZml0IGZyb20KKyMgaW5zdHJ1Y3Rpb24tbGV2ZWwgcGFyYWxsZWxpc20uIEFuZCB3aGVuIGNvbXBhcmluZyB0byBhZXMtYXJtdjQKKyMgcmVzdWx0cyBrZWVwIGluIG1pbmQga2V5IHNjaGVkdWxlIGNvbnZlcnNpb24gb3ZlcmhlYWQgKHNlZQorIyBic2Flcy14ODZfNjQucGwgZm9yIGZ1cnRoZXIgZGV0YWlscykuLi4KKyMKKyMJCQkJCQk8YXBwcm9Ab3BlbnNzbC5vcmc+CisKKyMgQXByaWwtQXVndXN0IDIwMTMKKyMKKyMgQWRkIENCQywgQ1RSIGFuZCBYVFMgc3Vicm91dGluZXMsIGFkYXB0IGZvciBrZXJuZWwgdXNlLgorIworIwkJCQkJPGFyZC5iaWVzaGV1dmVsQGxpbmFyby5vcmc+CisKK3doaWxlICgoJG91dHB1dD1zaGlmdCkgJiYgKCRvdXRwdXQhfi9eXHdbXHdcLV0qXC5cdyskLykpIHt9CitvcGVuIFNURE9VVCwiPiRvdXRwdXQiOworCitteSAoJGlucCwkb3V0LCRsZW4sJGtleSk9KCJyMCIsInIxIiwicjIiLCJyMyIpOworbXkgQFhNTT1tYXAoInEkXyIsKDAuLjE1KSk7CisKK3sKK215ICgka2V5LCRyb3VuZHMsJGNvbnN0KT0oInI0IiwicjUiLCJyNiIpOworCitzdWIgRGxvKCkgICB7IHNoaWZ0PX5tfHEoWzFdP1swLTldKXw/ImQiLigkMSoyKToiIjsgICAgIH0KK3N1YiBEaGkoKSAgIHsgc2hpZnQ9fm18cShbMV0/WzAtOV0pfD8iZCIuKCQxKjIrMSk6IiI7ICAgfQorCitzdWIgU2JveCB7CisjIGlucHV0IGluICBsc2IgPiBbYjAsIGIxLCBiMiwgYjMsIGI0LCBiNSwgYjYsIGI3XSA8IG1zYgorIyBvdXRwdXQgaW4gbHNiID4gW2IwLCBiMSwgYjQsIGI2LCBiMywgYjcsIGIyLCBiNV0gPCBtc2IKK215IEBiPUBfWzAuLjddOworbXkgQHQ9QF9bOC4uMTFdOworbXkgQHM9QF9bMTIuLjE1XTsKKwkmSW5CYXNpc0NoYW5nZQkoQGIpOworCSZJbnZfR0YyNTYJKEBiWzYsNSwwLDMsNywxLDQsMl0sQHQsQHMpOworCSZPdXRCYXNpc0NoYW5nZQkoQGJbNywxLDQsMiw2LDUsMCwzXSk7Cit9CisKK3N1YiBJbkJhc2lzQ2hhbmdlIHsKKyMgaW5wdXQgaW4gIGxzYiA+IFtiMCwgYjEsIGIyLCBiMywgYjQsIGI1LCBiNiwgYjddIDwgbXNiCisjIG91dHB1dCBpbiBsc2IgPiBbYjYsIGI1LCBiMCwgYjMsIGI3LCBiMSwgYjQsIGIyXSA8IG1zYiAKK215IEBiPUBfWzAuLjddOworJGNvZGUuPTw8X19fOworCXZlb3IJQGJbMl0sIEBiWzJdLCBAYlsxXQorCXZlb3IJQGJbNV0sIEBiWzVdLCBAYls2XQorCXZlb3IJQGJbM10sIEBiWzNdLCBAYlswXQorCXZlb3IJQGJbNl0sIEBiWzZdLCBAYlsyXQorCXZlb3IJQGJbNV0sIEBiWzVdLCBAYlswXQorCisJdmVvcglAYls2XSwgQGJbNl0sIEBiWzNdCisJdmVvcglAYlszXSwgQGJbM10sIEBiWzddCisJdmVvcglAYls3XSwgQGJbN10sIEBiWzVdCisJdmVvcglAYlszXSwgQGJbM10sIEBiWzRdCisJdmVvcglAYls0XSwgQGJbNF0sIEBiWzVdCisKKwl2ZW9yCUBiWzJdLCBAYlsyXSwgQGJbN10KKwl2ZW9yCUBiWzNdLCBAYlszXSwgQGJbMV0KKwl2ZW9yCUBiWzFdLCBAYlsxXSwgQGJbNV0KK19fXworfQorCitzdWIgT3V0QmFzaXNDaGFuZ2UgeworIyBpbnB1dCBpbiAgbHNiID4gW2IwLCBiMSwgYjIsIGIzLCBiNCwgYjUsIGI2LCBiN10gPCBtc2IKKyMgb3V0cHV0IGluIGxzYiA+IFtiNiwgYjEsIGIyLCBiNCwgYjcsIGIwLCBiMywgYjVdIDwgbXNiCitteSBAYj1AX1swLi43XTsKKyRjb2RlLj08PF9fXzsKKwl2ZW9yCUBiWzBdLCBAYlswXSwgQGJbNl0KKwl2ZW9yCUBiWzFdLCBAYlsxXSwgQGJbNF0KKwl2ZW9yCUBiWzRdLCBAYls0XSwgQGJbNl0KKwl2ZW9yCUBiWzJdLCBAYlsyXSwgQGJbMF0KKwl2ZW9yCUBiWzZdLCBAYls2XSwgQGJbMV0KKworCXZlb3IJQGJbMV0sIEBiWzFdLCBAYls1XQorCXZlb3IJQGJbNV0sIEBiWzVdLCBAYlszXQorCXZlb3IJQGJbM10sIEBiWzNdLCBAYls3XQorCXZlb3IJQGJbN10sIEBiWzddLCBAYls1XQorCXZlb3IJQGJbMl0sIEBiWzJdLCBAYls1XQorCisJdmVvcglAYls0XSwgQGJbNF0sIEBiWzddCitfX18KK30KKworc3ViIEludlNib3ggeworIyBpbnB1dCBpbiBsc2IgCT4gW2IwLCBiMSwgYjIsIGIzLCBiNCwgYjUsIGI2LCBiN10gPCBtc2IKKyMgb3V0cHV0IGluIGxzYgk+IFtiMCwgYjEsIGI2LCBiNCwgYjIsIGI3LCBiMywgYjVdIDwgbXNiCitteSBAYj1AX1swLi43XTsKK215IEB0PUBfWzguLjExXTsKK215IEBzPUBfWzEyLi4xNV07CisJJkludkluQmFzaXNDaGFuZ2UJKEBiKTsKKwkmSW52X0dGMjU2CQkoQGJbNSwxLDIsNiwzLDcsMCw0XSxAdCxAcyk7CisJJkludk91dEJhc2lzQ2hhbmdlCShAYlszLDcsMCw0LDUsMSwyLDZdKTsKK30KKworc3ViIEludkluQmFzaXNDaGFuZ2UgewkJIyBPdXRCYXNpc0NoYW5nZSBpbiByZXZlcnNlICh3aXRoIHR3aXN0KQorbXkgQGI9QF9bNSwxLDIsNiwzLDcsMCw0XTsKKyRjb2RlLj08PF9fXworCSB2ZW9yCUBiWzFdLCBAYlsxXSwgQGJbN10KKwl2ZW9yCUBiWzRdLCBAYls0XSwgQGJbN10KKworCXZlb3IJQGJbN10sIEBiWzddLCBAYls1XQorCSB2ZW9yCUBiWzFdLCBAYlsxXSwgQGJbM10KKwl2ZW9yCUBiWzJdLCBAYlsyXSwgQGJbNV0KKwl2ZW9yCUBiWzNdLCBAYlszXSwgQGJbN10KKworCXZlb3IJQGJbNl0sIEBiWzZdLCBAYlsxXQorCXZlb3IJQGJbMl0sIEBiWzJdLCBAYlswXQorCSB2ZW9yCUBiWzVdLCBAYls1XSwgQGJbM10KKwl2ZW9yCUBiWzRdLCBAYls0XSwgQGJbNl0KKwl2ZW9yCUBiWzBdLCBAYlswXSwgQGJbNl0KKwl2ZW9yCUBiWzFdLCBAYlsxXSwgQGJbNF0KK19fXworfQorCitzdWIgSW52T3V0QmFzaXNDaGFuZ2UgewkJIyBJbkJhc2lzQ2hhbmdlIGluIHJldmVyc2UKK215IEBiPUBfWzIsNSw3LDMsNiwxLDAsNF07CiskY29kZS49PDxfX187CisJdmVvcglAYlsxXSwgQGJbMV0sIEBiWzVdCisJdmVvcglAYlsyXSwgQGJbMl0sIEBiWzddCisKKwl2ZW9yCUBiWzNdLCBAYlszXSwgQGJbMV0KKwl2ZW9yCUBiWzRdLCBAYls0XSwgQGJbNV0KKwl2ZW9yCUBiWzddLCBAYls3XSwgQGJbNV0KKwl2ZW9yCUBiWzNdLCBAYlszXSwgQGJbNF0KKwkgdmVvciAJQGJbNV0sIEBiWzVdLCBAYlswXQorCXZlb3IJQGJbM10sIEBiWzNdLCBAYls3XQorCSB2ZW9yCUBiWzZdLCBAYls2XSwgQGJbMl0KKwkgdmVvcglAYlsyXSwgQGJbMl0sIEBiWzFdCisJdmVvcglAYls2XSwgQGJbNl0sIEBiWzNdCisKKwl2ZW9yCUBiWzNdLCBAYlszXSwgQGJbMF0KKwl2ZW9yCUBiWzVdLCBAYls1XSwgQGJbNl0KK19fXworfQorCitzdWIgTXVsX0dGNCB7CisjOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyM7KiBNdWxfR0Y0OiBJbnB1dCB4MC14MSx5MC15MSBPdXRwdXQgeDAteDEgVGVtcCB0MCAoOCkgKgorIzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitteSAoJHgwLCR4MSwkeTAsJHkxLCR0MCwkdDEpPUBfOworJGNvZGUuPTw8X19fOworCXZlb3IgCSR0MCwgJHkwLCAkeTEKKwl2YW5kCSR0MCwgJHQwLCAkeDAKKwl2ZW9yCSR4MCwgJHgwLCAkeDEKKwl2YW5kCSR0MSwgJHgxLCAkeTAKKwl2YW5kCSR4MCwgJHgwLCAkeTEKKwl2ZW9yCSR4MSwgJHQxLCAkdDAKKwl2ZW9yCSR4MCwgJHgwLCAkdDEKK19fXworfQorCitzdWIgTXVsX0dGNF9OIHsJCQkJIyBub3QgdXNlZCwgc2VlIG5leHQgc3Vicm91dGluZQorIyBtdWx0aXBseSBhbmQgc2NhbGUgYnkgTgorbXkgKCR4MCwkeDEsJHkwLCR5MSwkdDApPUBfOworJGNvZGUuPTw8X19fOworCXZlb3IJJHQwLCAkeTAsICR5MQorCXZhbmQJJHQwLCAkdDAsICR4MAorCXZlb3IJJHgwLCAkeDAsICR4MQorCXZhbmQJJHgxLCAkeDEsICR5MAorCXZhbmQJJHgwLCAkeDAsICR5MQorCXZlb3IJJHgxLCAkeDEsICR4MAorCXZlb3IJJHgwLCAkeDAsICR0MAorX19fCit9CisKK3N1YiBNdWxfR0Y0X05fR0Y0IHsKKyMgaW50ZXJsZWF2ZWQgTXVsX0dGNF9OIGFuZCBNdWxfR0Y0CitteSAoJHgwLCR4MSwkeTAsJHkxLCR0MCwKKyAgICAkeDIsJHgzLCR5MiwkeTMsJHQxKT1AXzsKKyRjb2RlLj08PF9fXzsKKwl2ZW9yCSR0MCwgJHkwLCAkeTEKKwkgdmVvciAJJHQxLCAkeTIsICR5MworCXZhbmQJJHQwLCAkdDAsICR4MAorCSB2YW5kCSR0MSwgJHQxLCAkeDIKKwl2ZW9yCSR4MCwgJHgwLCAkeDEKKwkgdmVvcgkkeDIsICR4MiwgJHgzCisJdmFuZAkkeDEsICR4MSwgJHkwCisJIHZhbmQJJHgzLCAkeDMsICR5MgorCXZhbmQJJHgwLCAkeDAsICR5MQorCSB2YW5kCSR4MiwgJHgyLCAkeTMKKwl2ZW9yCSR4MSwgJHgxLCAkeDAKKwkgdmVvcgkkeDIsICR4MiwgJHgzCisJdmVvcgkkeDAsICR4MCwgJHQwCisJIHZlb3IJJHgzLCAkeDMsICR0MQorX19fCit9CitzdWIgTXVsX0dGMTZfMiB7CitteSBAeD1AX1swLi43XTsKK215IEB5PUBfWzguLjExXTsKK215IEB0PUBfWzEyLi4xNV07CiskY29kZS49PDxfX187CisJdmVvcglAdFswXSwgQHhbMF0sIEB4WzJdCisJdmVvcglAdFsxXSwgQHhbMV0sIEB4WzNdCitfX18KKwkmTXVsX0dGNCAgCShAeFswXSwgQHhbMV0sIEB5WzBdLCBAeVsxXSwgQHRbMi4uM10pOworJGNvZGUuPTw8X19fOworCXZlb3IJQHlbMF0sIEB5WzBdLCBAeVsyXQorCXZlb3IJQHlbMV0sIEB5WzFdLCBAeVszXQorX19fCisJTXVsX0dGNF9OX0dGNAkoQHRbMF0sIEB0WzFdLCBAeVswXSwgQHlbMV0sIEB0WzNdLAorCQkJIEB4WzJdLCBAeFszXSwgQHlbMl0sIEB5WzNdLCBAdFsyXSk7CiskY29kZS49PDxfX187CisJdmVvcglAeFswXSwgQHhbMF0sIEB0WzBdCisJdmVvcglAeFsyXSwgQHhbMl0sIEB0WzBdCisJdmVvcglAeFsxXSwgQHhbMV0sIEB0WzFdCisJdmVvcglAeFszXSwgQHhbM10sIEB0WzFdCisKKwl2ZW9yCUB0WzBdLCBAeFs0XSwgQHhbNl0KKwl2ZW9yCUB0WzFdLCBAeFs1XSwgQHhbN10KK19fXworCSZNdWxfR0Y0X05fR0Y0CShAdFswXSwgQHRbMV0sIEB5WzBdLCBAeVsxXSwgQHRbM10sCisJCQkgQHhbNl0sIEB4WzddLCBAeVsyXSwgQHlbM10sIEB0WzJdKTsKKyRjb2RlLj08PF9fXzsKKwl2ZW9yCUB5WzBdLCBAeVswXSwgQHlbMl0KKwl2ZW9yCUB5WzFdLCBAeVsxXSwgQHlbM10KK19fXworCSZNdWxfR0Y0ICAJKEB4WzRdLCBAeFs1XSwgQHlbMF0sIEB5WzFdLCBAdFsyLi4zXSk7CiskY29kZS49PDxfX187CisJdmVvcglAeFs0XSwgQHhbNF0sIEB0WzBdCisJdmVvcglAeFs2XSwgQHhbNl0sIEB0WzBdCisJdmVvcglAeFs1XSwgQHhbNV0sIEB0WzFdCisJdmVvcglAeFs3XSwgQHhbN10sIEB0WzFdCitfX18KK30KK3N1YiBJbnZfR0YyNTYgeworIzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIzsqIEludl9HRjI1NjogSW5wdXQgeDAteDcgT3V0cHV0IHgwLXg3IFRlbXAgdDAtdDMsczAtczMgKDE0NCkgICAgICAgKgorIzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorbXkgQHg9QF9bMC4uN107CitteSBAdD1AX1s4Li4xMV07CitteSBAcz1AX1sxMi4uMTVdOworIyBkaXJlY3Qgb3B0aW1pemF0aW9ucyBmcm9tIGhhcmR3YXJlCiskY29kZS49PDxfX187CisJdmVvcglAdFszXSwgQHhbNF0sIEB4WzZdCisJdmVvcglAdFsyXSwgQHhbNV0sIEB4WzddCisJdmVvcglAdFsxXSwgQHhbMV0sIEB4WzNdCisJdmVvcglAc1sxXSwgQHhbN10sIEB4WzZdCisJIHZtb3YJQHRbMF0sIEB0WzJdCisJdmVvcglAc1swXSwgQHhbMF0sIEB4WzJdCisKKwl2b3JyCUB0WzJdLCBAdFsyXSwgQHRbMV0KKwl2ZW9yCUBzWzNdLCBAdFszXSwgQHRbMF0KKwl2YW5kCUBzWzJdLCBAdFszXSwgQHNbMF0KKwl2b3JyCUB0WzNdLCBAdFszXSwgQHNbMF0KKwl2ZW9yCUBzWzBdLCBAc1swXSwgQHRbMV0KKwl2YW5kCUB0WzBdLCBAdFswXSwgQHRbMV0KKwl2ZW9yCUB0WzFdLCBAeFszXSwgQHhbMl0KKwl2YW5kCUBzWzNdLCBAc1szXSwgQHNbMF0KKwl2YW5kCUBzWzFdLCBAc1sxXSwgQHRbMV0KKwl2ZW9yCUB0WzFdLCBAeFs0XSwgQHhbNV0KKwl2ZW9yCUBzWzBdLCBAeFsxXSwgQHhbMF0KKwl2ZW9yCUB0WzNdLCBAdFszXSwgQHNbMV0KKwl2ZW9yCUB0WzJdLCBAdFsyXSwgQHNbMV0KKwl2YW5kCUBzWzFdLCBAdFsxXSwgQHNbMF0KKwl2b3JyCUB0WzFdLCBAdFsxXSwgQHNbMF0KKwl2ZW9yCUB0WzNdLCBAdFszXSwgQHNbM10KKwl2ZW9yCUB0WzBdLCBAdFswXSwgQHNbMV0KKwl2ZW9yCUB0WzJdLCBAdFsyXSwgQHNbMl0KKwl2ZW9yCUB0WzFdLCBAdFsxXSwgQHNbM10KKwl2ZW9yCUB0WzBdLCBAdFswXSwgQHNbMl0KKwl2YW5kCUBzWzBdLCBAeFs3XSwgQHhbM10KKwl2ZW9yCUB0WzFdLCBAdFsxXSwgQHNbMl0KKwl2YW5kCUBzWzFdLCBAeFs2XSwgQHhbMl0KKwl2YW5kCUBzWzJdLCBAeFs1XSwgQHhbMV0KKwl2b3JyCUBzWzNdLCBAeFs0XSwgQHhbMF0KKwl2ZW9yCUB0WzNdLCBAdFszXSwgQHNbMF0KKwl2ZW9yCUB0WzFdLCBAdFsxXSwgQHNbMl0KKwl2ZW9yCUB0WzBdLCBAdFswXSwgQHNbM10KKwl2ZW9yCUB0WzJdLCBAdFsyXSwgQHNbMV0KKworCUAgSW52X0dGMTYgXHQwLCBcdDEsIFx0MiwgXHQzLCBcczAsIFxzMSwgXHMyLCBcczMKKworCUAgbmV3IHNtYWxsZXIgaW52ZXJzaW9uCisKKwl2YW5kCUBzWzJdLCBAdFszXSwgQHRbMV0KKwl2bW92CUBzWzBdLCBAdFswXQorCisJdmVvcglAc1sxXSwgQHRbMl0sIEBzWzJdCisJdmVvcglAc1szXSwgQHRbMF0sIEBzWzJdCisJdmVvcglAc1syXSwgQHRbMF0sIEBzWzJdCUAgQHNbMl09QHNbM10KKworCXZic2wJQHNbMV0sIEB0WzFdLCBAdFswXQorCXZic2wJQHNbM10sIEB0WzNdLCBAdFsyXQorCXZlb3IJQHRbM10sIEB0WzNdLCBAdFsyXQorCisJdmJzbAlAc1swXSwgQHNbMV0sIEBzWzJdCisJdmJzbAlAdFswXSwgQHNbMl0sIEBzWzFdCisKKwl2YW5kCUBzWzJdLCBAc1swXSwgQHNbM10KKwl2ZW9yCUB0WzFdLCBAdFsxXSwgQHRbMF0KKworCXZlb3IJQHNbMl0sIEBzWzJdLCBAdFszXQorX19fCisjIG91dHB1dCBpbiBzMywgczIsIHMxLCB0MQorCisjIE11bF9HRjE2XzIgXHgwLCBceDEsIFx4MiwgXHgzLCBceDQsIFx4NSwgXHg2LCBceDcsIFx0MiwgXHQzLCBcdDAsIFx0MSwgXHMwLCBcczEsIFxzMiwgXHMzCisKKyMgTXVsX0dGMTZfMiBceDAsIFx4MSwgXHgyLCBceDMsIFx4NCwgXHg1LCBceDYsIFx4NywgXHMzLCBcczIsIFxzMSwgXHQxLCBcczAsIFx0MCwgXHQyLCBcdDMKKwkmTXVsX0dGMTZfMihAeCxAc1szLDIsMV0sQHRbMV0sQHNbMF0sQHRbMCwyLDNdKTsKKworIyMjIG91dHB1dCBtc2IgPiBbeDMseDIseDEseDAseDcseDYseDUseDRdIDwgbHNiCit9CisKKyMgQUVTIGxpbmVhciBjb21wb25lbnRzCisKK3N1YiBTaGlmdFJvd3MgeworbXkgQHg9QF9bMC4uN107CitteSBAdD1AX1s4Li4xMV07CitteSAkbWFzaz1wb3A7CiskY29kZS49PDxfX187CisJdmxkbWlhCSRrZXkhLCB7QHRbMF0tQHRbM119CisJdmVvcglAdFswXSwgQHRbMF0sIEB4WzBdCisJdmVvcglAdFsxXSwgQHRbMV0sIEB4WzFdCisJdnRibC44CWAmRGxvKEB4WzBdKWAsIHtAdFswXX0sIGAmRGxvKCRtYXNrKWAKKwl2dGJsLjgJYCZEaGkoQHhbMF0pYCwge0B0WzBdfSwgYCZEaGkoJG1hc2spYAorCXZsZG1pYQkka2V5ISwge0B0WzBdfQorCXZlb3IJQHRbMl0sIEB0WzJdLCBAeFsyXQorCXZ0YmwuOAlgJkRsbyhAeFsxXSlgLCB7QHRbMV19LCBgJkRsbygkbWFzaylgCisJdnRibC44CWAmRGhpKEB4WzFdKWAsIHtAdFsxXX0sIGAmRGhpKCRtYXNrKWAKKwl2bGRtaWEJJGtleSEsIHtAdFsxXX0KKwl2ZW9yCUB0WzNdLCBAdFszXSwgQHhbM10KKwl2dGJsLjgJYCZEbG8oQHhbMl0pYCwge0B0WzJdfSwgYCZEbG8oJG1hc2spYAorCXZ0YmwuOAlgJkRoaShAeFsyXSlgLCB7QHRbMl19LCBgJkRoaSgkbWFzaylgCisJdmxkbWlhCSRrZXkhLCB7QHRbMl19CisJdnRibC44CWAmRGxvKEB4WzNdKWAsIHtAdFszXX0sIGAmRGxvKCRtYXNrKWAKKwl2dGJsLjgJYCZEaGkoQHhbM10pYCwge0B0WzNdfSwgYCZEaGkoJG1hc2spYAorCXZsZG1pYQkka2V5ISwge0B0WzNdfQorCXZlb3IJQHRbMF0sIEB0WzBdLCBAeFs0XQorCXZlb3IJQHRbMV0sIEB0WzFdLCBAeFs1XQorCXZ0YmwuOAlgJkRsbyhAeFs0XSlgLCB7QHRbMF19LCBgJkRsbygkbWFzaylgCisJdnRibC44CWAmRGhpKEB4WzRdKWAsIHtAdFswXX0sIGAmRGhpKCRtYXNrKWAKKwl2ZW9yCUB0WzJdLCBAdFsyXSwgQHhbNl0KKwl2dGJsLjgJYCZEbG8oQHhbNV0pYCwge0B0WzFdfSwgYCZEbG8oJG1hc2spYAorCXZ0YmwuOAlgJkRoaShAeFs1XSlgLCB7QHRbMV19LCBgJkRoaSgkbWFzaylgCisJdmVvcglAdFszXSwgQHRbM10sIEB4WzddCisJdnRibC44CWAmRGxvKEB4WzZdKWAsIHtAdFsyXX0sIGAmRGxvKCRtYXNrKWAKKwl2dGJsLjgJYCZEaGkoQHhbNl0pYCwge0B0WzJdfSwgYCZEaGkoJG1hc2spYAorCXZ0YmwuOAlgJkRsbyhAeFs3XSlgLCB7QHRbM119LCBgJkRsbygkbWFzaylgCisJdnRibC44CWAmRGhpKEB4WzddKWAsIHtAdFszXX0sIGAmRGhpKCRtYXNrKWAKK19fXworfQorCitzdWIgTWl4Q29sdW1ucyB7CisjIG1vZGlmaWVkIHRvIGVtaXQgb3V0cHV0IGluIG9yZGVyIHN1aXRhYmxlIGZvciBmZWVkaW5nIGJhY2sgdG8gYWVzZW5jW2xhc3RdCitteSBAeD1AX1swLi43XTsKK215IEB0PUBfWzguLjE1XTsKK215ICRpbnY9QF9bMTZdOwkjIG9wdGlvbmFsCiskY29kZS49PDxfX187CisJdmV4dC44CUB0WzBdLCBAeFswXSwgQHhbMF0sICMxMglAIHgwIDw8PCAzMgorCXZleHQuOAlAdFsxXSwgQHhbMV0sIEB4WzFdLCAjMTIKKwkgdmVvcglAeFswXSwgQHhbMF0sIEB0WzBdCQlAIHgwIF4gKHgwIDw8PCAzMikKKwl2ZXh0LjgJQHRbMl0sIEB4WzJdLCBAeFsyXSwgIzEyCisJIHZlb3IJQHhbMV0sIEB4WzFdLCBAdFsxXQorCXZleHQuOAlAdFszXSwgQHhbM10sIEB4WzNdLCAjMTIKKwkgdmVvcglAeFsyXSwgQHhbMl0sIEB0WzJdCisJdmV4dC44CUB0WzRdLCBAeFs0XSwgQHhbNF0sICMxMgorCSB2ZW9yCUB4WzNdLCBAeFszXSwgQHRbM10KKwl2ZXh0LjgJQHRbNV0sIEB4WzVdLCBAeFs1XSwgIzEyCisJIHZlb3IJQHhbNF0sIEB4WzRdLCBAdFs0XQorCXZleHQuOAlAdFs2XSwgQHhbNl0sIEB4WzZdLCAjMTIKKwkgdmVvcglAeFs1XSwgQHhbNV0sIEB0WzVdCisJdmV4dC44CUB0WzddLCBAeFs3XSwgQHhbN10sICMxMgorCSB2ZW9yCUB4WzZdLCBAeFs2XSwgQHRbNl0KKworCXZlb3IJQHRbMV0sIEB0WzFdLCBAeFswXQorCSB2ZW9yCUB4WzddLCBAeFs3XSwgQHRbN10KKwkgdmV4dC44CUB4WzBdLCBAeFswXSwgQHhbMF0sICM4CQlAICh4MCBeICh4MCA8PDwgMzIpKSA8PDwgNjQpCisJdmVvcglAdFsyXSwgQHRbMl0sIEB4WzFdCisJdmVvcglAdFswXSwgQHRbMF0sIEB4WzddCisJdmVvcglAdFsxXSwgQHRbMV0sIEB4WzddCisJIHZleHQuOAlAeFsxXSwgQHhbMV0sIEB4WzFdLCAjOAorCXZlb3IJQHRbNV0sIEB0WzVdLCBAeFs0XQorCSB2ZW9yCUB4WzBdLCBAeFswXSwgQHRbMF0KKwl2ZW9yCUB0WzZdLCBAdFs2XSwgQHhbNV0KKwkgdmVvcglAeFsxXSwgQHhbMV0sIEB0WzFdCisJIHZleHQuOAlAdFswXSwgQHhbNF0sIEB4WzRdLCAjOAorCXZlb3IJQHRbNF0sIEB0WzRdLCBAeFszXQorCSB2ZXh0LjgJQHRbMV0sIEB4WzVdLCBAeFs1XSwgIzgKKwl2ZW9yCUB0WzddLCBAdFs3XSwgQHhbNl0KKwkgdmV4dC44CUB4WzRdLCBAeFszXSwgQHhbM10sICM4CisJdmVvcglAdFszXSwgQHRbM10sIEB4WzJdCisJIHZleHQuOAlAeFs1XSwgQHhbN10sIEB4WzddLCAjOAorCXZlb3IJQHRbNF0sIEB0WzRdLCBAeFs3XQorCSB2ZXh0LjgJQHhbM10sIEB4WzZdLCBAeFs2XSwgIzgKKwl2ZW9yCUB0WzNdLCBAdFszXSwgQHhbN10KKwkgdmV4dC44CUB4WzZdLCBAeFsyXSwgQHhbMl0sICM4CisJdmVvcglAeFs3XSwgQHRbMV0sIEB0WzVdCitfX18KKyRjb2RlLj08PF9fXyBpZiAoISRpbnYpOworCXZlb3IJQHhbMl0sIEB0WzBdLCBAdFs0XQorCXZlb3IJQHhbNF0sIEB4WzRdLCBAdFszXQorCXZlb3IJQHhbNV0sIEB4WzVdLCBAdFs3XQorCXZlb3IJQHhbM10sIEB4WzNdLCBAdFs2XQorCSBAIHZtb3YJQHhbMl0sIEB0WzBdCisJdmVvcglAeFs2XSwgQHhbNl0sIEB0WzJdCisJIEAgdm1vdglAeFs3XSwgQHRbMV0KK19fXworJGNvZGUuPTw8X19fIGlmICgkaW52KTsKKwl2ZW9yCUB0WzNdLCBAdFszXSwgQHhbNF0KKwl2ZW9yCUB4WzVdLCBAeFs1XSwgQHRbN10KKwl2ZW9yCUB4WzJdLCBAeFszXSwgQHRbNl0KKwl2ZW9yCUB4WzNdLCBAdFswXSwgQHRbNF0KKwl2ZW9yCUB4WzRdLCBAeFs2XSwgQHRbMl0KKwl2bW92CUB4WzZdLCBAdFszXQorCSBAIHZtb3YJQHhbN10sIEB0WzFdCitfX18KK30KKworc3ViIEludk1peENvbHVtbnNfb3JpZyB7CitteSBAeD1AX1swLi43XTsKK215IEB0PUBfWzguLjE1XTsKKworJGNvZGUuPTw8X19fOworCUAgbXVsdGlwbGljYXRpb24gYnkgMHgwZQorCXZleHQuOAlAdFs3XSwgQHhbN10sIEB4WzddLCAjMTIKKwl2bW92CUB0WzJdLCBAeFsyXQorCXZlb3IJQHhbMl0sIEB4WzJdLCBAeFs1XQkJQCAyIDUKKwl2ZW9yCUB4WzddLCBAeFs3XSwgQHhbNV0JCUAgNyA1CisJdmV4dC44CUB0WzBdLCBAeFswXSwgQHhbMF0sICMxMgorCXZtb3YJQHRbNV0sIEB4WzVdCisJdmVvcglAeFs1XSwgQHhbNV0sIEB4WzBdCQlAIDUgMAkJWzFdCisJdmVvcglAeFswXSwgQHhbMF0sIEB4WzFdCQlAIDAgMQorCXZleHQuOAlAdFsxXSwgQHhbMV0sIEB4WzFdLCAjMTIKKwl2ZW9yCUB4WzFdLCBAeFsxXSwgQHhbMl0JCUAgMSAyNQorCXZlb3IJQHhbMF0sIEB4WzBdLCBAeFs2XQkJQCAwMSA2CQlbMl0KKwl2ZXh0LjgJQHRbM10sIEB4WzNdLCBAeFszXSwgIzEyCisJdmVvcglAeFsxXSwgQHhbMV0sIEB4WzNdCQlAIDEyNSAzCQlbNF0KKwl2ZW9yCUB4WzJdLCBAeFsyXSwgQHhbMF0JCUAgMjUgMDE2CVszXQorCXZlb3IJQHhbM10sIEB4WzNdLCBAeFs3XQkJQCAzIDc1CisJdmVvcglAeFs3XSwgQHhbN10sIEB4WzZdCQlAIDc1IDYJCVswXQorCXZleHQuOAlAdFs2XSwgQHhbNl0sIEB4WzZdLCAjMTIKKwl2bW92CUB0WzRdLCBAeFs0XQorCXZlb3IJQHhbNl0sIEB4WzZdLCBAeFs0XQkJQCA2IDQKKwl2ZW9yCUB4WzRdLCBAeFs0XSwgQHhbM10JCUAgNCAzNzUJCVs2XQorCXZlb3IJQHhbM10sIEB4WzNdLCBAeFs3XQkJQCAzNzUgNzU2PTM2CisJdmVvcglAeFs2XSwgQHhbNl0sIEB0WzVdCQlAIDY0IDUJCVs3XQorCXZlb3IJQHhbM10sIEB4WzNdLCBAdFsyXQkJQCAzNiAyCisJdmV4dC44CUB0WzVdLCBAdFs1XSwgQHRbNV0sICMxMgorCXZlb3IJQHhbM10sIEB4WzNdLCBAdFs0XQkJQCAzNjIgNAkJWzVdCitfX18KKwkJCQkJbXkgQHkgPSBAeFs3LDUsMCwyLDEsMyw0LDZdOworJGNvZGUuPTw8X19fOworCUAgbXVsdGlwbGljYXRpb24gYnkgMHgwYgorCXZlb3IJQHlbMV0sIEB5WzFdLCBAeVswXQorCXZlb3IJQHlbMF0sIEB5WzBdLCBAdFswXQorCXZleHQuOAlAdFsyXSwgQHRbMl0sIEB0WzJdLCAjMTIKKwl2ZW9yCUB5WzFdLCBAeVsxXSwgQHRbMV0KKwl2ZW9yCUB5WzBdLCBAeVswXSwgQHRbNV0KKwl2ZXh0LjgJQHRbNF0sIEB0WzRdLCBAdFs0XSwgIzEyCisJdmVvcglAeVsxXSwgQHlbMV0sIEB0WzZdCisJdmVvcglAeVswXSwgQHlbMF0sIEB0WzddCisJdmVvcglAdFs3XSwgQHRbN10sIEB0WzZdCQlAIGNsb2JiZXIgdFs3XQorCisJdmVvcglAeVszXSwgQHlbM10sIEB0WzBdCisJIHZlb3IJQHlbMV0sIEB5WzFdLCBAeVswXQorCXZleHQuOAlAdFswXSwgQHRbMF0sIEB0WzBdLCAjMTIKKwl2ZW9yCUB5WzJdLCBAeVsyXSwgQHRbMV0KKwl2ZW9yCUB5WzRdLCBAeVs0XSwgQHRbMV0KKwl2ZXh0LjgJQHRbMV0sIEB0WzFdLCBAdFsxXSwgIzEyCisJdmVvcglAeVsyXSwgQHlbMl0sIEB0WzJdCisJdmVvcglAeVszXSwgQHlbM10sIEB0WzJdCisJdmVvcglAeVs1XSwgQHlbNV0sIEB0WzJdCisJdmVvcglAeVsyXSwgQHlbMl0sIEB0WzddCisJdmV4dC44CUB0WzJdLCBAdFsyXSwgQHRbMl0sICMxMgorCXZlb3IJQHlbM10sIEB5WzNdLCBAdFszXQorCXZlb3IJQHlbNl0sIEB5WzZdLCBAdFszXQorCXZlb3IJQHlbNF0sIEB5WzRdLCBAdFszXQorCXZlb3IJQHlbN10sIEB5WzddLCBAdFs0XQorCXZleHQuOAlAdFszXSwgQHRbM10sIEB0WzNdLCAjMTIKKwl2ZW9yCUB5WzVdLCBAeVs1XSwgQHRbNF0KKwl2ZW9yCUB5WzddLCBAeVs3XSwgQHRbN10KKwl2ZW9yCUB0WzddLCBAdFs3XSwgQHRbNV0JCUAgY2xvYmJlciB0WzddIGV2ZW4gbW9yZQorCXZlb3IJQHlbM10sIEB5WzNdLCBAdFs1XQorCXZlb3IJQHlbNF0sIEB5WzRdLCBAdFs0XQorCisJdmVvcglAeVs1XSwgQHlbNV0sIEB0WzddCisJdmV4dC44CUB0WzRdLCBAdFs0XSwgQHRbNF0sICMxMgorCXZlb3IJQHlbNl0sIEB5WzZdLCBAdFs3XQorCXZlb3IJQHlbNF0sIEB5WzRdLCBAdFs3XQorCisJdmVvcglAdFs3XSwgQHRbN10sIEB0WzVdCisJdmV4dC44CUB0WzVdLCBAdFs1XSwgQHRbNV0sICMxMgorCisJQCBtdWx0aXBsaWNhdGlvbiBieSAweDBkCisJdmVvcglAeVs0XSwgQHlbNF0sIEB5WzddCisJIHZlb3IJQHRbN10sIEB0WzddLCBAdFs2XQkJQCByZXN0b3JlIHRbN10KKwl2ZW9yCUB5WzddLCBAeVs3XSwgQHRbNF0KKwl2ZXh0LjgJQHRbNl0sIEB0WzZdLCBAdFs2XSwgIzEyCisJdmVvcglAeVsyXSwgQHlbMl0sIEB0WzBdCisJdmVvcglAeVs3XSwgQHlbN10sIEB0WzVdCisJdmV4dC44CUB0WzddLCBAdFs3XSwgQHRbN10sICMxMgorCXZlb3IJQHlbMl0sIEB5WzJdLCBAdFsyXQorCisJdmVvcglAeVszXSwgQHlbM10sIEB5WzFdCisJdmVvcglAeVsxXSwgQHlbMV0sIEB0WzFdCisJdmVvcglAeVswXSwgQHlbMF0sIEB0WzBdCisJdmVvcglAeVszXSwgQHlbM10sIEB0WzBdCisJdmVvcglAeVsxXSwgQHlbMV0sIEB0WzVdCisJdmVvcglAeVswXSwgQHlbMF0sIEB0WzVdCisJdmV4dC44CUB0WzBdLCBAdFswXSwgQHRbMF0sICMxMgorCXZlb3IJQHlbMV0sIEB5WzFdLCBAdFs3XQorCXZlb3IJQHlbMF0sIEB5WzBdLCBAdFs2XQorCXZlb3IJQHlbM10sIEB5WzNdLCBAeVsxXQorCXZlb3IJQHlbNF0sIEB5WzRdLCBAdFsxXQorCXZleHQuOAlAdFsxXSwgQHRbMV0sIEB0WzFdLCAjMTIKKworCXZlb3IJQHlbN10sIEB5WzddLCBAdFs3XQorCXZlb3IJQHlbNF0sIEB5WzRdLCBAdFsyXQorCXZlb3IJQHlbNV0sIEB5WzVdLCBAdFsyXQorCXZlb3IJQHlbMl0sIEB5WzJdLCBAdFs2XQorCXZlb3IJQHRbNl0sIEB0WzZdLCBAdFszXQkJQCBjbG9iYmVyIHRbNl0KKwl2ZXh0LjgJQHRbMl0sIEB0WzJdLCBAdFsyXSwgIzEyCisJdmVvcglAeVs0XSwgQHlbNF0sIEB5WzddCisJdmVvcglAeVszXSwgQHlbM10sIEB0WzZdCisKKwl2ZW9yCUB5WzZdLCBAeVs2XSwgQHRbNl0KKwl2ZW9yCUB5WzVdLCBAeVs1XSwgQHRbNV0KKwl2ZXh0LjgJQHRbNV0sIEB0WzVdLCBAdFs1XSwgIzEyCisJdmVvcglAeVs2XSwgQHlbNl0sIEB0WzRdCisJdmV4dC44CUB0WzRdLCBAdFs0XSwgQHRbNF0sICMxMgorCXZlb3IJQHlbNV0sIEB5WzVdLCBAdFs2XQorCXZlb3IJQHlbNl0sIEB5WzZdLCBAdFs3XQorCXZleHQuOAlAdFs3XSwgQHRbN10sIEB0WzddLCAjMTIKKwl2ZW9yCUB0WzZdLCBAdFs2XSwgQHRbM10JCUAgcmVzdG9yZSB0WzZdCisJdmV4dC44CUB0WzNdLCBAdFszXSwgQHRbM10sICMxMgorCisJQCBtdWx0aXBsaWNhdGlvbiBieSAweDA5CisJdmVvcglAeVs0XSwgQHlbNF0sIEB5WzFdCisJdmVvcglAdFsxXSwgQHRbMV0sIEB5WzFdCQlAIHRbMV09eVsxXQorCXZlb3IJQHRbMF0sIEB0WzBdLCBAdFs1XQkJQCBjbG9iYmVyIHRbMF0KKwl2ZXh0LjgJQHRbNl0sIEB0WzZdLCBAdFs2XSwgIzEyCisJdmVvcglAdFsxXSwgQHRbMV0sIEB0WzVdCisJdmVvcglAeVszXSwgQHlbM10sIEB0WzBdCisJdmVvcglAdFswXSwgQHRbMF0sIEB5WzBdCQlAIHRbMF09eVswXQorCXZlb3IJQHRbMV0sIEB0WzFdLCBAdFs2XQorCXZlb3IJQHRbNl0sIEB0WzZdLCBAdFs3XQkJQCBjbG9iYmVyIHRbNl0KKwl2ZW9yCUB5WzRdLCBAeVs0XSwgQHRbMV0KKwl2ZW9yCUB5WzddLCBAeVs3XSwgQHRbNF0KKwl2ZW9yCUB5WzZdLCBAeVs2XSwgQHRbM10KKwl2ZW9yCUB5WzVdLCBAeVs1XSwgQHRbMl0KKwl2ZW9yCUB0WzRdLCBAdFs0XSwgQHlbNF0JCUAgdFs0XT15WzRdCisJdmVvcglAdFszXSwgQHRbM10sIEB5WzNdCQlAIHRbM109eVszXQorCXZlb3IJQHRbNV0sIEB0WzVdLCBAeVs1XQkJQCB0WzVdPXlbNV0KKwl2ZW9yCUB0WzJdLCBAdFsyXSwgQHlbMl0JCUAgdFsyXT15WzJdCisJdmVvcglAdFszXSwgQHRbM10sIEB0WzddCisJdmVvcglAWE1NWzVdLCBAdFs1XSwgQHRbNl0KKwl2ZW9yCUBYTU1bNl0sIEB0WzZdLCBAeVs2XQkJQCB0WzZdPXlbNl0KKwl2ZW9yCUBYTU1bMl0sIEB0WzJdLCBAdFs2XQorCXZlb3IJQFhNTVs3XSwgQHRbN10sIEB5WzddCQlAIHRbN109eVs3XQorCisJdm1vdglAWE1NWzBdLCBAdFswXQorCXZtb3YJQFhNTVsxXSwgQHRbMV0KKwlAIHZtb3YJQFhNTVsyXSwgQHRbMl0KKwl2bW92CUBYTU1bM10sIEB0WzNdCisJdm1vdglAWE1NWzRdLCBAdFs0XQorCUAgdm1vdglAWE1NWzVdLCBAdFs1XQorCUAgdm1vdglAWE1NWzZdLCBAdFs2XQorCUAgdm1vdglAWE1NWzddLCBAdFs3XQorX19fCit9CisKK3N1YiBJbnZNaXhDb2x1bW5zIHsKK215IEB4PUBfWzAuLjddOworbXkgQHQ9QF9bOC4uMTVdOworCisjIFRoYW5rcyB0byBKdXNzaSBLaXZpbGlubmEgZm9yIHByb3ZpZGluZyBwb2ludGVyIHRvCisjCisjIHwgMGUgMGIgMGQgMDkgfCAgIHwgMDIgMDMgMDEgMDEgfCAgIHwgMDUgMDAgMDQgMDAgfAorIyB8IDA5IDBlIDBiIDBkIHwgPSB8IDAxIDAyIDAzIDAxIHwgeCB8IDAwIDA1IDAwIDA0IHwKKyMgfCAwZCAwOSAwZSAwYiB8ICAgfCAwMSAwMSAwMiAwMyB8ICAgfCAwNCAwMCAwNSAwMCB8CisjIHwgMGIgMGQgMDkgMGUgfCAgIHwgMDMgMDEgMDEgMDIgfCAgIHwgMDAgMDQgMDAgMDUgfAorCiskY29kZS49PDxfX187CisJQCBtdWx0aXBsaWNhdGlvbiBieSAweDA1LTB4MDAtMHgwNC0weDAwCisJdmV4dC44CUB0WzBdLCBAeFswXSwgQHhbMF0sICM4CisJdmV4dC44CUB0WzZdLCBAeFs2XSwgQHhbNl0sICM4CisJdmV4dC44CUB0WzddLCBAeFs3XSwgQHhbN10sICM4CisJdmVvcglAdFswXSwgQHRbMF0sIEB4WzBdCisJdmV4dC44CUB0WzFdLCBAeFsxXSwgQHhbMV0sICM4CisJdmVvcglAdFs2XSwgQHRbNl0sIEB4WzZdCisJdmV4dC44CUB0WzJdLCBAeFsyXSwgQHhbMl0sICM4CisJdmVvcglAdFs3XSwgQHRbN10sIEB4WzddCisJdmV4dC44CUB0WzNdLCBAeFszXSwgQHhbM10sICM4CisJdmVvcglAdFsxXSwgQHRbMV0sIEB4WzFdCisJdmV4dC44CUB0WzRdLCBAeFs0XSwgQHhbNF0sICM4CisJdmVvcglAdFsyXSwgQHRbMl0sIEB4WzJdCisJdmV4dC44CUB0WzVdLCBAeFs1XSwgQHhbNV0sICM4CisJdmVvcglAdFszXSwgQHRbM10sIEB4WzNdCisJdmVvcglAdFs0XSwgQHRbNF0sIEB4WzRdCisJdmVvcglAdFs1XSwgQHRbNV0sIEB4WzVdCisKKwkgdmVvcglAeFswXSwgQHhbMF0sIEB0WzZdCisJIHZlb3IJQHhbMV0sIEB4WzFdLCBAdFs2XQorCSB2ZW9yCUB4WzJdLCBAeFsyXSwgQHRbMF0KKwkgdmVvcglAeFs0XSwgQHhbNF0sIEB0WzJdCisJIHZlb3IJQHhbM10sIEB4WzNdLCBAdFsxXQorCSB2ZW9yCUB4WzFdLCBAeFsxXSwgQHRbN10KKwkgdmVvcglAeFsyXSwgQHhbMl0sIEB0WzddCisJIHZlb3IJQHhbNF0sIEB4WzRdLCBAdFs2XQorCSB2ZW9yCUB4WzVdLCBAeFs1XSwgQHRbM10KKwkgdmVvcglAeFszXSwgQHhbM10sIEB0WzZdCisJIHZlb3IJQHhbNl0sIEB4WzZdLCBAdFs0XQorCSB2ZW9yCUB4WzRdLCBAeFs0XSwgQHRbN10KKwkgdmVvcglAeFs1XSwgQHhbNV0sIEB0WzddCisJIHZlb3IJQHhbN10sIEB4WzddLCBAdFs1XQorX19fCisJJk1peENvbHVtbnMJKEB4LEB0LDEpOwkjIGZsaXBwZWQgMjwtPjMgYW5kIDQ8LT42Cit9CisKK3N1YiBzd2FwbW92ZSB7CitteSAoJGEsJGIsJG4sJG1hc2ssJHQpPUBfOworJGNvZGUuPTw8X19fOworCXZzaHIudTY0CSR0LCAkYiwgIyRuCisJdmVvcgkJJHQsICR0LCAkYQorCXZhbmQJCSR0LCAkdCwgJG1hc2sKKwl2ZW9yCQkkYSwgJGEsICR0CisJdnNobC51NjQJJHQsICR0LCAjJG4KKwl2ZW9yCQkkYiwgJGIsICR0CitfX18KK30KK3N1YiBzd2FwbW92ZTJ4IHsKK215ICgkYTAsJGIwLCRhMSwkYjEsJG4sJG1hc2ssJHQwLCR0MSk9QF87CiskY29kZS49PDxfX187CisJdnNoci51NjQJJHQwLCAkYjAsICMkbgorCSB2c2hyLnU2NAkkdDEsICRiMSwgIyRuCisJdmVvcgkJJHQwLCAkdDAsICRhMAorCSB2ZW9yCQkkdDEsICR0MSwgJGExCisJdmFuZAkJJHQwLCAkdDAsICRtYXNrCisJIHZhbmQJCSR0MSwgJHQxLCAkbWFzaworCXZlb3IJCSRhMCwgJGEwLCAkdDAKKwl2c2hsLnU2NAkkdDAsICR0MCwgIyRuCisJIHZlb3IJCSRhMSwgJGExLCAkdDEKKwkgdnNobC51NjQJJHQxLCAkdDEsICMkbgorCXZlb3IJCSRiMCwgJGIwLCAkdDAKKwkgdmVvcgkJJGIxLCAkYjEsICR0MQorX19fCit9CisKK3N1YiBiaXRzbGljZSB7CitteSBAeD1yZXZlcnNlKEBfWzAuLjddKTsKK215ICgkdDAsJHQxLCR0MiwkdDMpPUBfWzguLjExXTsKKyRjb2RlLj08PF9fXzsKKwl2bW92Lmk4CSR0MCwjMHg1NQkJCUAgY29tcG9zZSAuTEJTMAorCXZtb3YuaTgJJHQxLCMweDMzCQkJQCBjb21wb3NlIC5MQlMxCitfX18KKwkmc3dhcG1vdmUyeChAeFswLDEsMiwzXSwxLCR0MCwkdDIsJHQzKTsKKwkmc3dhcG1vdmUyeChAeFs0LDUsNiw3XSwxLCR0MCwkdDIsJHQzKTsKKyRjb2RlLj08PF9fXzsKKwl2bW92Lmk4CSR0MCwjMHgwZgkJCUAgY29tcG9zZSAuTEJTMgorX19fCisJJnN3YXBtb3ZlMngoQHhbMCwyLDEsM10sMiwkdDEsJHQyLCR0Myk7CisJJnN3YXBtb3ZlMngoQHhbNCw2LDUsN10sMiwkdDEsJHQyLCR0Myk7CisKKwkmc3dhcG1vdmUyeChAeFswLDQsMSw1XSw0LCR0MCwkdDIsJHQzKTsKKwkmc3dhcG1vdmUyeChAeFsyLDYsMyw3XSw0LCR0MCwkdDIsJHQzKTsKK30KKworJGNvZGUuPTw8X19fOworI2lmIGRlZmluZWQoX19hcm1fXykKKyNpZm5kZWYgX19LRVJORUxfXworIyBpbmNsdWRlICJhcm1fYXJjaC5oIgorCisjIGRlZmluZSBWRlBfQUJJX1BVU0gJdnN0bWRiCXNwISx7ZDgtZDE1fQorIyBkZWZpbmUgVkZQX0FCSV9QT1AJdmxkbWlhCXNwISx7ZDgtZDE1fQorIyBkZWZpbmUgVkZQX0FCSV9GUkFNRQkweDQwCisjZWxzZQorIyBkZWZpbmUgVkZQX0FCSV9QVVNICisjIGRlZmluZSBWRlBfQUJJX1BPUAorIyBkZWZpbmUgVkZQX0FCSV9GUkFNRQkwCisjIGRlZmluZSBCU0FFU19BU01fRVhURU5ERURfS0VZCisjIGRlZmluZSBYVFNfQ0hBSU5fVFdFQUsKKyMgZGVmaW5lIF9fQVJNX0FSQ0hfXyBfX0xJTlVYX0FSTV9BUkNIX18KKyNlbmRpZgorCisjaWZkZWYgX190aHVtYl9fCisjIGRlZmluZSBhZHJsIGFkcgorI2VuZGlmCisKKyNpZiBfX0FSTV9BUkNIX18+PTcKKy50ZXh0Cisuc3ludGF4CXVuaWZpZWQgCUAgQVJNdjctY2FwYWJsZSBhc3NlbWJsZXIgaXMgZXhwZWN0ZWQgdG8gaGFuZGxlIHRoaXMKKyNpZmRlZiBfX3RodW1iMl9fCisudGh1bWIKKyNlbHNlCisuY29kZSAgIDMyCisjZW5kaWYKKworLmZwdQluZW9uCisKKy50eXBlCV9ic2Flc19kZWNyeXB0OCwlZnVuY3Rpb24KKy5hbGlnbgk0CitfYnNhZXNfZGVjcnlwdDg6CisJYWRyCSRjb25zdCxfYnNhZXNfZGVjcnlwdDgKKwl2bGRtaWEJJGtleSEsIHtAWE1NWzldfQkJQCByb3VuZCAwIGtleQorCWFkZAkkY29uc3QsJGNvbnN0LCMuTE0wSVNSLV9ic2Flc19kZWNyeXB0OAorCisJdmxkbWlhCSRjb25zdCEsIHtAWE1NWzhdfQkJQCAuTE0wSVNSCisJdmVvcglAWE1NWzEwXSwgQFhNTVswXSwgQFhNTVs5XQlAIHhvciB3aXRoIHJvdW5kMCBrZXkKKwl2ZW9yCUBYTU1bMTFdLCBAWE1NWzFdLCBAWE1NWzldCisJIHZ0YmwuOAlgJkRsbyhAWE1NWzBdKWAsIHtAWE1NWzEwXX0sIGAmRGxvKEBYTU1bOF0pYAorCSB2dGJsLjgJYCZEaGkoQFhNTVswXSlgLCB7QFhNTVsxMF19LCBgJkRoaShAWE1NWzhdKWAKKwl2ZW9yCUBYTU1bMTJdLCBAWE1NWzJdLCBAWE1NWzldCisJIHZ0YmwuOAlgJkRsbyhAWE1NWzFdKWAsIHtAWE1NWzExXX0sIGAmRGxvKEBYTU1bOF0pYAorCSB2dGJsLjgJYCZEaGkoQFhNTVsxXSlgLCB7QFhNTVsxMV19LCBgJkRoaShAWE1NWzhdKWAKKwl2ZW9yCUBYTU1bMTNdLCBAWE1NWzNdLCBAWE1NWzldCisJIHZ0YmwuOAlgJkRsbyhAWE1NWzJdKWAsIHtAWE1NWzEyXX0sIGAmRGxvKEBYTU1bOF0pYAorCSB2dGJsLjgJYCZEaGkoQFhNTVsyXSlgLCB7QFhNTVsxMl19LCBgJkRoaShAWE1NWzhdKWAKKwl2ZW9yCUBYTU1bMTRdLCBAWE1NWzRdLCBAWE1NWzldCisJIHZ0YmwuOAlgJkRsbyhAWE1NWzNdKWAsIHtAWE1NWzEzXX0sIGAmRGxvKEBYTU1bOF0pYAorCSB2dGJsLjgJYCZEaGkoQFhNTVszXSlgLCB7QFhNTVsxM119LCBgJkRoaShAWE1NWzhdKWAKKwl2ZW9yCUBYTU1bMTVdLCBAWE1NWzVdLCBAWE1NWzldCisJIHZ0YmwuOAlgJkRsbyhAWE1NWzRdKWAsIHtAWE1NWzE0XX0sIGAmRGxvKEBYTU1bOF0pYAorCSB2dGJsLjgJYCZEaGkoQFhNTVs0XSlgLCB7QFhNTVsxNF19LCBgJkRoaShAWE1NWzhdKWAKKwl2ZW9yCUBYTU1bMTBdLCBAWE1NWzZdLCBAWE1NWzldCisJIHZ0YmwuOAlgJkRsbyhAWE1NWzVdKWAsIHtAWE1NWzE1XX0sIGAmRGxvKEBYTU1bOF0pYAorCSB2dGJsLjgJYCZEaGkoQFhNTVs1XSlgLCB7QFhNTVsxNV19LCBgJkRoaShAWE1NWzhdKWAKKwl2ZW9yCUBYTU1bMTFdLCBAWE1NWzddLCBAWE1NWzldCisJIHZ0YmwuOAlgJkRsbyhAWE1NWzZdKWAsIHtAWE1NWzEwXX0sIGAmRGxvKEBYTU1bOF0pYAorCSB2dGJsLjgJYCZEaGkoQFhNTVs2XSlgLCB7QFhNTVsxMF19LCBgJkRoaShAWE1NWzhdKWAKKwkgdnRibC44CWAmRGxvKEBYTU1bN10pYCwge0BYTU1bMTFdfSwgYCZEbG8oQFhNTVs4XSlgCisJIHZ0YmwuOAlgJkRoaShAWE1NWzddKWAsIHtAWE1NWzExXX0sIGAmRGhpKEBYTU1bOF0pYAorX19fCisJJmJpdHNsaWNlCShAWE1NWzAuLjcsIDguLjExXSk7CiskY29kZS49PDxfX187CisJc3ViCSRyb3VuZHMsJHJvdW5kcywjMQorCWIJLkxkZWNfc2JveAorLmFsaWduCTQKKy5MZGVjX2xvb3A6CitfX18KKwkmU2hpZnRSb3dzCShAWE1NWzAuLjcsIDguLjEyXSk7CiskY29kZS49Ii5MZGVjX3Nib3g6XG4iOworCSZJbnZTYm94CShAWE1NWzAuLjcsIDguLjE1XSk7CiskY29kZS49PDxfX187CisJc3Vicwkkcm91bmRzLCRyb3VuZHMsIzEKKwliY2MJLkxkZWNfZG9uZQorX19fCisJJkludk1peENvbHVtbnMJKEBYTU1bMCwxLDYsNCwyLDcsMyw1LCA4Li4xNV0pOworJGNvZGUuPTw8X19fOworCXZsZG1pYQkkY29uc3QsIHtAWE1NWzEyXX0JCUAgLkxJU1IKKwlpdGUJZXEJCQkJQCBUaHVtYjIgdGhpbmcsIHNhbml0eSBjaGVjayBpbiBBUk0KKwlhZGRlcQkkY29uc3QsJGNvbnN0LCMweDEwCisJYm5lCS5MZGVjX2xvb3AKKwl2bGRtaWEJJGNvbnN0LCB7QFhNTVsxMl19CQlAIC5MSVNSTTAKKwliCS5MZGVjX2xvb3AKKy5hbGlnbgk0CisuTGRlY19kb25lOgorX19fCisJJmJpdHNsaWNlCShAWE1NWzAsMSw2LDQsMiw3LDMsNSwgOC4uMTFdKTsKKyRjb2RlLj08PF9fXzsKKwl2bGRtaWEJJGtleSwge0BYTU1bOF19CQkJQCBsYXN0IHJvdW5kIGtleQorCXZlb3IJQFhNTVs2XSwgQFhNTVs2XSwgQFhNTVs4XQorCXZlb3IJQFhNTVs0XSwgQFhNTVs0XSwgQFhNTVs4XQorCXZlb3IJQFhNTVsyXSwgQFhNTVsyXSwgQFhNTVs4XQorCXZlb3IJQFhNTVs3XSwgQFhNTVs3XSwgQFhNTVs4XQorCXZlb3IJQFhNTVszXSwgQFhNTVszXSwgQFhNTVs4XQorCXZlb3IJQFhNTVs1XSwgQFhNTVs1XSwgQFhNTVs4XQorCXZlb3IJQFhNTVswXSwgQFhNTVswXSwgQFhNTVs4XQorCXZlb3IJQFhNTVsxXSwgQFhNTVsxXSwgQFhNTVs4XQorCWJ4CWxyCisuc2l6ZQlfYnNhZXNfZGVjcnlwdDgsLi1fYnNhZXNfZGVjcnlwdDgKKworLnR5cGUJX2JzYWVzX2NvbnN0LCVvYmplY3QKKy5hbGlnbgk2CitfYnNhZXNfY29uc3Q6CisuTE0wSVNSOglAIEludlNoaWZ0Um93cyBjb25zdGFudHMKKwkucXVhZAkweDBhMGUwMjA2MDcwYjBmMDMsIDB4MDAwNDA4MGMwZDAxMDUwOQorLkxJU1I6CisJLnF1YWQJMHgwNTA0MDcwNjAyMDEwMDAzLCAweDBmMGUwZDBjMDgwYjBhMDkKKy5MSVNSTTA6CisJLnF1YWQJMHgwMTA0MGIwZTAyMDUwODBmLCAweDAzMDYwOTBjMDAwNzBhMGQKKy5MTTBTUjoJCUAgU2hpZnRSb3dzIGNvbnN0YW50cworCS5xdWFkCTB4MGEwZTAyMDYwZjAzMDcwYiwgMHgwMDA0MDgwYzA1MDkwZDAxCisuTFNSOgorCS5xdWFkCTB4MDUwNDA3MDYwMDAzMDIwMSwgMHgwZjBlMGQwYzBhMDkwODBiCisuTFNSTTA6CisJLnF1YWQJMHgwMzA0MDkwZTAwMDUwYTBmLCAweDAxMDYwYjBjMDIwNzA4MGQKKy5MTTA6CisJLnF1YWQJMHgwMjA2MGEwZTAzMDcwYjBmLCAweDAwMDQwODBjMDEwNTA5MGQKKy5MUkVWTTBTUjoKKwkucXVhZAkweDA5MGQwMTA1MGMwMDA0MDgsIDB4MDMwNzBiMGYwNjBhMGUwMgorLmFzY2l6CSJCaXQtc2xpY2VkIEFFUyBmb3IgTkVPTiwgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQG9wZW5zc2wub3JnPiIKKy5hbGlnbgk2Cisuc2l6ZQlfYnNhZXNfY29uc3QsLi1fYnNhZXNfY29uc3QKKworLnR5cGUJX2JzYWVzX2VuY3J5cHQ4LCVmdW5jdGlvbgorLmFsaWduCTQKK19ic2Flc19lbmNyeXB0ODoKKwlhZHIJJGNvbnN0LF9ic2Flc19lbmNyeXB0OAorCXZsZG1pYQkka2V5ISwge0BYTU1bOV19CQlAIHJvdW5kIDAga2V5CisJc3ViCSRjb25zdCwkY29uc3QsI19ic2Flc19lbmNyeXB0OC0uTE0wU1IKKworCXZsZG1pYQkkY29uc3QhLCB7QFhNTVs4XX0JCUAgLkxNMFNSCitfYnNhZXNfZW5jcnlwdDhfYWx0OgorCXZlb3IJQFhNTVsxMF0sIEBYTU1bMF0sIEBYTU1bOV0JQCB4b3Igd2l0aCByb3VuZDAga2V5CisJdmVvcglAWE1NWzExXSwgQFhNTVsxXSwgQFhNTVs5XQorCSB2dGJsLjgJYCZEbG8oQFhNTVswXSlgLCB7QFhNTVsxMF19LCBgJkRsbyhAWE1NWzhdKWAKKwkgdnRibC44CWAmRGhpKEBYTU1bMF0pYCwge0BYTU1bMTBdfSwgYCZEaGkoQFhNTVs4XSlgCisJdmVvcglAWE1NWzEyXSwgQFhNTVsyXSwgQFhNTVs5XQorCSB2dGJsLjgJYCZEbG8oQFhNTVsxXSlgLCB7QFhNTVsxMV19LCBgJkRsbyhAWE1NWzhdKWAKKwkgdnRibC44CWAmRGhpKEBYTU1bMV0pYCwge0BYTU1bMTFdfSwgYCZEaGkoQFhNTVs4XSlgCisJdmVvcglAWE1NWzEzXSwgQFhNTVszXSwgQFhNTVs5XQorCSB2dGJsLjgJYCZEbG8oQFhNTVsyXSlgLCB7QFhNTVsxMl19LCBgJkRsbyhAWE1NWzhdKWAKKwkgdnRibC44CWAmRGhpKEBYTU1bMl0pYCwge0BYTU1bMTJdfSwgYCZEaGkoQFhNTVs4XSlgCisJdmVvcglAWE1NWzE0XSwgQFhNTVs0XSwgQFhNTVs5XQorCSB2dGJsLjgJYCZEbG8oQFhNTVszXSlgLCB7QFhNTVsxM119LCBgJkRsbyhAWE1NWzhdKWAKKwkgdnRibC44CWAmRGhpKEBYTU1bM10pYCwge0BYTU1bMTNdfSwgYCZEaGkoQFhNTVs4XSlgCisJdmVvcglAWE1NWzE1XSwgQFhNTVs1XSwgQFhNTVs5XQorCSB2dGJsLjgJYCZEbG8oQFhNTVs0XSlgLCB7QFhNTVsxNF19LCBgJkRsbyhAWE1NWzhdKWAKKwkgdnRibC44CWAmRGhpKEBYTU1bNF0pYCwge0BYTU1bMTRdfSwgYCZEaGkoQFhNTVs4XSlgCisJdmVvcglAWE1NWzEwXSwgQFhNTVs2XSwgQFhNTVs5XQorCSB2dGJsLjgJYCZEbG8oQFhNTVs1XSlgLCB7QFhNTVsxNV19LCBgJkRsbyhAWE1NWzhdKWAKKwkgdnRibC44CWAmRGhpKEBYTU1bNV0pYCwge0BYTU1bMTVdfSwgYCZEaGkoQFhNTVs4XSlgCisJdmVvcglAWE1NWzExXSwgQFhNTVs3XSwgQFhNTVs5XQorCSB2dGJsLjgJYCZEbG8oQFhNTVs2XSlgLCB7QFhNTVsxMF19LCBgJkRsbyhAWE1NWzhdKWAKKwkgdnRibC44CWAmRGhpKEBYTU1bNl0pYCwge0BYTU1bMTBdfSwgYCZEaGkoQFhNTVs4XSlgCisJIHZ0YmwuOAlgJkRsbyhAWE1NWzddKWAsIHtAWE1NWzExXX0sIGAmRGxvKEBYTU1bOF0pYAorCSB2dGJsLjgJYCZEaGkoQFhNTVs3XSlgLCB7QFhNTVsxMV19LCBgJkRoaShAWE1NWzhdKWAKK19ic2Flc19lbmNyeXB0OF9iaXRzbGljZToKK19fXworCSZiaXRzbGljZQkoQFhNTVswLi43LCA4Li4xMV0pOworJGNvZGUuPTw8X19fOworCXN1Ygkkcm91bmRzLCRyb3VuZHMsIzEKKwliCS5MZW5jX3Nib3gKKy5hbGlnbgk0CisuTGVuY19sb29wOgorX19fCisJJlNoaWZ0Um93cwkoQFhNTVswLi43LCA4Li4xMl0pOworJGNvZGUuPSIuTGVuY19zYm94OlxuIjsKKwkmU2JveAkJKEBYTU1bMC4uNywgOC4uMTVdKTsKKyRjb2RlLj08PF9fXzsKKwlzdWJzCSRyb3VuZHMsJHJvdW5kcywjMQorCWJjYwkuTGVuY19kb25lCitfX18KKwkmTWl4Q29sdW1ucwkoQFhNTVswLDEsNCw2LDMsNywyLDUsIDguLjE1XSk7CiskY29kZS49PDxfX187CisJdmxkbWlhCSRjb25zdCwge0BYTU1bMTJdfQkJQCAuTFNSCisJaXRlCWVxCQkJCUAgVGh1bWIyIHRoaW5nLCBzYW1pdHkgY2hlY2sgaW4gQVJNCisJYWRkZXEJJGNvbnN0LCRjb25zdCwjMHgxMAorCWJuZQkuTGVuY19sb29wCisJdmxkbWlhCSRjb25zdCwge0BYTU1bMTJdfQkJQCAuTFNSTTAKKwliCS5MZW5jX2xvb3AKKy5hbGlnbgk0CisuTGVuY19kb25lOgorX19fCisJIyBvdXRwdXQgaW4gbHNiID4gW3QwLCB0MSwgdDQsIHQ2LCB0MywgdDcsIHQyLCB0NV0gPCBtc2IKKwkmYml0c2xpY2UJKEBYTU1bMCwxLDQsNiwzLDcsMiw1LCA4Li4xMV0pOworJGNvZGUuPTw8X19fOworCXZsZG1pYQkka2V5LCB7QFhNTVs4XX0JCQlAIGxhc3Qgcm91bmQga2V5CisJdmVvcglAWE1NWzRdLCBAWE1NWzRdLCBAWE1NWzhdCisJdmVvcglAWE1NWzZdLCBAWE1NWzZdLCBAWE1NWzhdCisJdmVvcglAWE1NWzNdLCBAWE1NWzNdLCBAWE1NWzhdCisJdmVvcglAWE1NWzddLCBAWE1NWzddLCBAWE1NWzhdCisJdmVvcglAWE1NWzJdLCBAWE1NWzJdLCBAWE1NWzhdCisJdmVvcglAWE1NWzVdLCBAWE1NWzVdLCBAWE1NWzhdCisJdmVvcglAWE1NWzBdLCBAWE1NWzBdLCBAWE1NWzhdCisJdmVvcglAWE1NWzFdLCBAWE1NWzFdLCBAWE1NWzhdCisJYngJbHIKKy5zaXplCV9ic2Flc19lbmNyeXB0OCwuLV9ic2Flc19lbmNyeXB0OAorX19fCit9Cit7CitteSAoJG91dCwkaW5wLCRyb3VuZHMsJGNvbnN0KT0oInIxMiIsInI0IiwicjUiLCJyNiIpOworCitzdWIgYml0c2xpY2Vfa2V5IHsKK215IEB4PXJldmVyc2UoQF9bMC4uN10pOworbXkgKCRiczAsJGJzMSwkYnMyLCR0MiwkdDMpPUBfWzguLjEyXTsKKworCSZzd2FwbW92ZQkoQHhbMCwxXSwxLCRiczAsJHQyLCR0Myk7CiskY29kZS49PDxfX187CisJQCAmc3dhcG1vdmUoQHhbMiwzXSwxLCR0MCwkdDIsJHQzKTsKKwl2bW92CUB4WzJdLCBAeFswXQorCXZtb3YJQHhbM10sIEB4WzFdCitfX18KKwkjJnN3YXBtb3ZlMngoQHhbNCw1LDYsN10sMSwkdDAsJHQyLCR0Myk7CisKKwkmc3dhcG1vdmUyeAkoQHhbMCwyLDEsM10sMiwkYnMxLCR0MiwkdDMpOworJGNvZGUuPTw8X19fOworCUAgJnN3YXBtb3ZlMngoQHhbNCw2LDUsN10sMiwkdDEsJHQyLCR0Myk7CisJdm1vdglAeFs0XSwgQHhbMF0KKwl2bW92CUB4WzZdLCBAeFsyXQorCXZtb3YJQHhbNV0sIEB4WzFdCisJdm1vdglAeFs3XSwgQHhbM10KK19fXworCSZzd2FwbW92ZTJ4CShAeFswLDQsMSw1XSw0LCRiczIsJHQyLCR0Myk7CisJJnN3YXBtb3ZlMngJKEB4WzIsNiwzLDddLDQsJGJzMiwkdDIsJHQzKTsKK30KKworJGNvZGUuPTw8X19fOworLnR5cGUJX2JzYWVzX2tleV9jb252ZXJ0LCVmdW5jdGlvbgorLmFsaWduCTQKK19ic2Flc19rZXlfY29udmVydDoKKwlhZHIJJGNvbnN0LF9ic2Flc19rZXlfY29udmVydAorCXZsZDEuOAl7QFhNTVs3XX0sICBbJGlucF0hCQlAIGxvYWQgcm91bmQgMCBrZXkKKwlzdWIJJGNvbnN0LCRjb25zdCwjX2JzYWVzX2tleV9jb252ZXJ0LS5MTTAKKwl2bGQxLjgJe0BYTU1bMTVdfSwgWyRpbnBdIQkJQCBsb2FkIHJvdW5kIDEga2V5CisKKwl2bW92Lmk4CUBYTU1bOF0sICAjMHgwMQkJCUAgYml0IG1hc2tzCisJdm1vdi5pOAlAWE1NWzldLCAgIzB4MDIKKwl2bW92Lmk4CUBYTU1bMTBdLCAjMHgwNAorCXZtb3YuaTgJQFhNTVsxMV0sICMweDA4CisJdm1vdi5pOAlAWE1NWzEyXSwgIzB4MTAKKwl2bW92Lmk4CUBYTU1bMTNdLCAjMHgyMAorCXZsZG1pYQkkY29uc3QsIHtAWE1NWzE0XX0JCUAgLkxNMAorCisjaWZkZWYgX19BUk1FTF9fCisJdnJldjMyLjgJQFhNTVs3XSwgIEBYTU1bN10KKwl2cmV2MzIuOAlAWE1NWzE1XSwgQFhNTVsxNV0KKyNlbmRpZgorCXN1Ygkkcm91bmRzLCRyb3VuZHMsIzEKKwl2c3RtaWEJJG91dCEsIHtAWE1NWzddfQkJQCBzYXZlIHJvdW5kIDAga2V5CisJYgkuTGtleV9sb29wCisKKy5hbGlnbgk0CisuTGtleV9sb29wOgorCXZ0YmwuOAlgJkRsbyhAWE1NWzddKWAse0BYTU1bMTVdfSxgJkRsbyhAWE1NWzE0XSlgCisJdnRibC44CWAmRGhpKEBYTU1bN10pYCx7QFhNTVsxNV19LGAmRGhpKEBYTU1bMTRdKWAKKwl2bW92Lmk4CUBYTU1bNl0sICAjMHg0MAorCXZtb3YuaTgJQFhNTVsxNV0sICMweDgwCisKKwl2dHN0LjgJQFhNTVswXSwgQFhNTVs3XSwgQFhNTVs4XQorCXZ0c3QuOAlAWE1NWzFdLCBAWE1NWzddLCBAWE1NWzldCisJdnRzdC44CUBYTU1bMl0sIEBYTU1bN10sIEBYTU1bMTBdCisJdnRzdC44CUBYTU1bM10sIEBYTU1bN10sIEBYTU1bMTFdCisJdnRzdC44CUBYTU1bNF0sIEBYTU1bN10sIEBYTU1bMTJdCisJdnRzdC44CUBYTU1bNV0sIEBYTU1bN10sIEBYTU1bMTNdCisJdnRzdC44CUBYTU1bNl0sIEBYTU1bN10sIEBYTU1bNl0KKwl2dHN0LjgJQFhNTVs3XSwgQFhNTVs3XSwgQFhNTVsxNV0KKwl2bGQxLjgJe0BYTU1bMTVdfSwgWyRpbnBdIQkJQCBsb2FkIG5leHQgcm91bmQga2V5CisJdm12bglAWE1NWzBdLCBAWE1NWzBdCQlAICJwbm90IgorCXZtdm4JQFhNTVsxXSwgQFhNTVsxXQorCXZtdm4JQFhNTVs1XSwgQFhNTVs1XQorCXZtdm4JQFhNTVs2XSwgQFhNTVs2XQorI2lmZGVmIF9fQVJNRUxfXworCXZyZXYzMi44CUBYTU1bMTVdLCBAWE1NWzE1XQorI2VuZGlmCisJc3Vicwkkcm91bmRzLCRyb3VuZHMsIzEKKwl2c3RtaWEJJG91dCEse0BYTU1bMF0tQFhNTVs3XX0JCUAgd3JpdGUgYml0LXNsaWNlZCByb3VuZCBrZXkKKwlibmUJLkxrZXlfbG9vcAorCisJdm1vdi5pOAlAWE1NWzddLCMweDYzCQkJQCBjb21wb3NlIC5MNjMKKwlAIGRvbid0IHNhdmUgbGFzdCByb3VuZCBrZXkKKwlieAlscgorLnNpemUJX2JzYWVzX2tleV9jb252ZXJ0LC4tX2JzYWVzX2tleV9jb252ZXJ0CitfX18KK30KKworaWYgKDApIHsJCSMgZm9sbG93aW5nIGZvdXIgZnVuY3Rpb25zIGFyZSB1bnN1cHBvcnRlZCBpbnRlcmZhY2UKKwkJCSMgdXNlZCBmb3IgYmVuY2htYXJraW5nLi4uCiskY29kZS49PDxfX187CisuZ2xvYmwJYnNhZXNfZW5jX2tleV9jb252ZXJ0CisudHlwZQlic2Flc19lbmNfa2V5X2NvbnZlcnQsJWZ1bmN0aW9uCisuYWxpZ24JNAorYnNhZXNfZW5jX2tleV9jb252ZXJ0OgorCXN0bWRiCXNwISx7cjQtcjYsbHJ9CisJdnN0bWRiCXNwISx7ZDgtZDE1fQkJQCBBQkkgc3BlY2lmaWNhdGlvbiBzYXlzIHNvCisKKwlsZHIJcjUsWyRpbnAsIzI0MF0JCQlAIHBhc3Mgcm91bmRzCisJbW92CXI0LCRpbnAJCQkJQCBwYXNzIGtleQorCW1vdglyMTIsJG91dAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKwlibAlfYnNhZXNfa2V5X2NvbnZlcnQKKwl2ZW9yCUBYTU1bN10sQFhNTVs3XSxAWE1NWzE1XQlAIGZpeCB1cCBsYXN0IHJvdW5kIGtleQorCXZzdG1pYQlyMTIsIHtAWE1NWzddfQkJCUAgc2F2ZSBsYXN0IHJvdW5kIGtleQorCisJdmxkbWlhCXNwISx7ZDgtZDE1fQorCWxkbWlhCXNwISx7cjQtcjYscGN9Cisuc2l6ZQlic2Flc19lbmNfa2V5X2NvbnZlcnQsLi1ic2Flc19lbmNfa2V5X2NvbnZlcnQKKworLmdsb2JsCWJzYWVzX2VuY3J5cHRfMTI4CisudHlwZQlic2Flc19lbmNyeXB0XzEyOCwlZnVuY3Rpb24KKy5hbGlnbgk0Citic2Flc19lbmNyeXB0XzEyODoKKwlzdG1kYglzcCEse3I0LXI2LGxyfQorCXZzdG1kYglzcCEse2Q4LWQxNX0JCUAgQUJJIHNwZWNpZmljYXRpb24gc2F5cyBzbworLkxlbmMxMjhfbG9vcDoKKwl2bGQxLjgJe0BYTU1bMF0tQFhNTVsxXX0sIFskaW5wXSEJQCBsb2FkIGlucHV0CisJdmxkMS44CXtAWE1NWzJdLUBYTU1bM119LCBbJGlucF0hCisJbW92CXI0LCRrZXkJCQkJQCBwYXNzIHRoZSBrZXkKKwl2bGQxLjgJe0BYTU1bNF0tQFhNTVs1XX0sIFskaW5wXSEKKwltb3YJcjUsIzEwCQkJCUAgcGFzcyByb3VuZHMKKwl2bGQxLjgJe0BYTU1bNl0tQFhNTVs3XX0sIFskaW5wXSEKKworCWJsCV9ic2Flc19lbmNyeXB0OAorCisJdnN0MS44CXtAWE1NWzBdLUBYTU1bMV19LCBbJG91dF0hCUAgd3JpdGUgb3V0cHV0CisJdnN0MS44CXtAWE1NWzRdfSwgWyRvdXRdIQorCXZzdDEuOAl7QFhNTVs2XX0sIFskb3V0XSEKKwl2c3QxLjgJe0BYTU1bM119LCBbJG91dF0hCisJdnN0MS44CXtAWE1NWzddfSwgWyRvdXRdIQorCXZzdDEuOAl7QFhNTVsyXX0sIFskb3V0XSEKKwlzdWJzCSRsZW4sJGxlbiwjMHg4MAorCXZzdDEuOAl7QFhNTVs1XX0sIFskb3V0XSEKKwliaGkJLkxlbmMxMjhfbG9vcAorCisJdmxkbWlhCXNwISx7ZDgtZDE1fQorCWxkbWlhCXNwISx7cjQtcjYscGN9Cisuc2l6ZQlic2Flc19lbmNyeXB0XzEyOCwuLWJzYWVzX2VuY3J5cHRfMTI4CisKKy5nbG9ibAlic2Flc19kZWNfa2V5X2NvbnZlcnQKKy50eXBlCWJzYWVzX2RlY19rZXlfY29udmVydCwlZnVuY3Rpb24KKy5hbGlnbgk0Citic2Flc19kZWNfa2V5X2NvbnZlcnQ6CisJc3RtZGIJc3AhLHtyNC1yNixscn0KKwl2c3RtZGIJc3AhLHtkOC1kMTV9CQlAIEFCSSBzcGVjaWZpY2F0aW9uIHNheXMgc28KKworCWxkcglyNSxbJGlucCwjMjQwXQkJCUAgcGFzcyByb3VuZHMKKwltb3YJcjQsJGlucAkJCQlAIHBhc3Mga2V5CisJbW92CXIxMiwkb3V0CQkJQCBwYXNzIGtleSBzY2hlZHVsZQorCWJsCV9ic2Flc19rZXlfY29udmVydAorCXZsZG1pYQkkb3V0LCB7QFhNTVs2XX0KKwl2c3RtaWEJcjEyLCAge0BYTU1bMTVdfQkJQCBzYXZlIGxhc3Qgcm91bmQga2V5CisJdmVvcglAWE1NWzddLCBAWE1NWzddLCBAWE1NWzZdCUAgZml4IHVwIHJvdW5kIDAga2V5CisJdnN0bWlhCSRvdXQsIHtAWE1NWzddfQorCisJdmxkbWlhCXNwISx7ZDgtZDE1fQorCWxkbWlhCXNwISx7cjQtcjYscGN9Cisuc2l6ZQlic2Flc19kZWNfa2V5X2NvbnZlcnQsLi1ic2Flc19kZWNfa2V5X2NvbnZlcnQKKworLmdsb2JsCWJzYWVzX2RlY3J5cHRfMTI4CisudHlwZQlic2Flc19kZWNyeXB0XzEyOCwlZnVuY3Rpb24KKy5hbGlnbgk0Citic2Flc19kZWNyeXB0XzEyODoKKwlzdG1kYglzcCEse3I0LXI2LGxyfQorCXZzdG1kYglzcCEse2Q4LWQxNX0JCUAgQUJJIHNwZWNpZmljYXRpb24gc2F5cyBzbworLkxkZWMxMjhfbG9vcDoKKwl2bGQxLjgJe0BYTU1bMF0tQFhNTVsxXX0sIFskaW5wXSEJQCBsb2FkIGlucHV0CisJdmxkMS44CXtAWE1NWzJdLUBYTU1bM119LCBbJGlucF0hCisJbW92CXI0LCRrZXkJCQkJQCBwYXNzIHRoZSBrZXkKKwl2bGQxLjgJe0BYTU1bNF0tQFhNTVs1XX0sIFskaW5wXSEKKwltb3YJcjUsIzEwCQkJCUAgcGFzcyByb3VuZHMKKwl2bGQxLjgJe0BYTU1bNl0tQFhNTVs3XX0sIFskaW5wXSEKKworCWJsCV9ic2Flc19kZWNyeXB0OAorCisJdnN0MS44CXtAWE1NWzBdLUBYTU1bMV19LCBbJG91dF0hCUAgd3JpdGUgb3V0cHV0CisJdnN0MS44CXtAWE1NWzZdfSwgWyRvdXRdIQorCXZzdDEuOAl7QFhNTVs0XX0sIFskb3V0XSEKKwl2c3QxLjgJe0BYTU1bMl19LCBbJG91dF0hCisJdnN0MS44CXtAWE1NWzddfSwgWyRvdXRdIQorCXZzdDEuOAl7QFhNTVszXX0sIFskb3V0XSEKKwlzdWJzCSRsZW4sJGxlbiwjMHg4MAorCXZzdDEuOAl7QFhNTVs1XX0sIFskb3V0XSEKKwliaGkJLkxkZWMxMjhfbG9vcAorCisJdmxkbWlhCXNwISx7ZDgtZDE1fQorCWxkbWlhCXNwISx7cjQtcjYscGN9Cisuc2l6ZQlic2Flc19kZWNyeXB0XzEyOCwuLWJzYWVzX2RlY3J5cHRfMTI4CitfX18KK30KK3sKK215ICgkaW5wLCRvdXQsJGxlbiwka2V5LCAkaXZwLCRmcCwkcm91bmRzKT1tYXAoInIkXyIsKDAuLjMsOC4uMTApKTsKK215ICgka2V5c2NoZWQpPSgic3AiKTsKKworJGNvZGUuPTw8X19fOworLmV4dGVybiBBRVNfY2JjX2VuY3J5cHQKKy5leHRlcm4gQUVTX2RlY3J5cHQKKworLmdsb2JhbAlic2Flc19jYmNfZW5jcnlwdAorLnR5cGUJYnNhZXNfY2JjX2VuY3J5cHQsJWZ1bmN0aW9uCisuYWxpZ24JNQorYnNhZXNfY2JjX2VuY3J5cHQ6CisjaWZuZGVmCV9fS0VSTkVMX18KKwljbXAJJGxlbiwgIzEyOAorI2lmbmRlZglfX3RodW1iX18KKwlibG8JQUVTX2NiY19lbmNyeXB0CisjZWxzZQorCWJocwkxZgorCWIJQUVTX2NiY19lbmNyeXB0CisxOgorI2VuZGlmCisjZW5kaWYKKworCUAgaXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBtYWtlIHN1cmUgd2UgYXJlIGNhbGxlZCB3aXRoIGVuYyA9PSAwCisKKwltb3YJaXAsIHNwCisJc3RtZGIJc3AhLCB7cjQtcjEwLCBscn0KKwlWRlBfQUJJX1BVU0gKKwlsZHIJJGl2cCwgW2lwXQkJCUAgSVYgaXMgMXN0IGFyZyBvbiB0aGUgc3RhY2sKKwltb3YJJGxlbiwgJGxlbiwgbHNyIzQJCUAgbGVuIGluIDE2IGJ5dGUgYmxvY2tzCisJc3ViCXNwLCAjMHgxMAkJCUAgc2NyYXRjaCBzcGFjZSB0byBjYXJyeSBvdmVyIHRoZSBJVgorCW1vdgkkZnAsIHNwCQkJCUAgc2F2ZSBzcAorCisJbGRyCSRyb3VuZHMsIFska2V5LCAjMjQwXQkJQCBnZXQgIyBvZiByb3VuZHMKKyNpZm5kZWYJQlNBRVNfQVNNX0VYVEVOREVEX0tFWQorCUAgYWxsb2NhdGUgdGhlIGtleSBzY2hlZHVsZSBvbiB0aGUgc3RhY2sKKwlzdWIJcjEyLCBzcCwgJHJvdW5kcywgbHNsIzcJCUAgMTI4IGJ5dGVzIHBlciBpbm5lciByb3VuZCBrZXkKKwlhZGQJcjEyLCAjYDEyOC0zMmAJCQlAIHNpZnplIG9mIGJpdC1zbGljZXMga2V5IHNjaGVkdWxlCisKKwlAIHBvcHVsYXRlIHRoZSBrZXkgc2NoZWR1bGUKKwltb3YJcjQsICRrZXkJCQlAIHBhc3Mga2V5CisJbW92CXI1LCAkcm91bmRzCQkJQCBwYXNzICMgb2Ygcm91bmRzCisJbW92CXNwLCByMTIJCQkJQCBzcCBpcyAka2V5c2NoZWQKKwlibAlfYnNhZXNfa2V5X2NvbnZlcnQKKwl2bGRtaWEJJGtleXNjaGVkLCB7QFhNTVs2XX0KKwl2c3RtaWEJcjEyLCAge0BYTU1bMTVdfQkJQCBzYXZlIGxhc3Qgcm91bmQga2V5CisJdmVvcglAWE1NWzddLCBAWE1NWzddLCBAWE1NWzZdCUAgZml4IHVwIHJvdW5kIDAga2V5CisJdnN0bWlhCSRrZXlzY2hlZCwge0BYTU1bN119CisjZWxzZQorCWxkcglyMTIsIFska2V5LCAjMjQ0XQorCWVvcnMJcjEyLCAjMQorCWJlcQkwZgorCisJQCBwb3B1bGF0ZSB0aGUga2V5IHNjaGVkdWxlCisJc3RyCXIxMiwgWyRrZXksICMyNDRdCisJbW92CXI0LCAka2V5CQkJQCBwYXNzIGtleQorCW1vdglyNSwgJHJvdW5kcwkJCUAgcGFzcyAjIG9mIHJvdW5kcworCWFkZAlyMTIsICRrZXksICMyNDgJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisJYmwJX2JzYWVzX2tleV9jb252ZXJ0CisJYWRkCXI0LCAka2V5LCAjMjQ4CisJdmxkbWlhCXI0LCB7QFhNTVs2XX0KKwl2c3RtaWEJcjEyLCB7QFhNTVsxNV19CQkJQCBzYXZlIGxhc3Qgcm91bmQga2V5CisJdmVvcglAWE1NWzddLCBAWE1NWzddLCBAWE1NWzZdCUAgZml4IHVwIHJvdW5kIDAga2V5CisJdnN0bWlhCXI0LCB7QFhNTVs3XX0KKworLmFsaWduCTIKKzA6CisjZW5kaWYKKworCXZsZDEuOAl7QFhNTVsxNV19LCBbJGl2cF0JCUAgbG9hZCBJVgorCWIJLkxjYmNfZGVjX2xvb3AKKworLmFsaWduCTQKKy5MY2JjX2RlY19sb29wOgorCXN1YnMJJGxlbiwgJGxlbiwgIzB4OAorCWJtaQkuTGNiY19kZWNfbG9vcF9maW5pc2gKKworCXZsZDEuOAl7QFhNTVswXS1AWE1NWzFdfSwgWyRpbnBdIQlAIGxvYWQgaW5wdXQKKwl2bGQxLjgJe0BYTU1bMl0tQFhNTVszXX0sIFskaW5wXSEKKyNpZm5kZWYJQlNBRVNfQVNNX0VYVEVOREVEX0tFWQorCW1vdglyNCwgJGtleXNjaGVkCQkJQCBwYXNzIHRoZSBrZXkKKyNlbHNlCisJYWRkCXI0LCAka2V5LCAjMjQ4CisjZW5kaWYKKwl2bGQxLjgJe0BYTU1bNF0tQFhNTVs1XX0sIFskaW5wXSEKKwltb3YJcjUsICRyb3VuZHMKKwl2bGQxLjgJe0BYTU1bNl0tQFhNTVs3XX0sIFskaW5wXQorCXN1YgkkaW5wLCAkaW5wLCAjMHg2MAorCXZzdG1pYQkkZnAsIHtAWE1NWzE1XX0JCQlAIHB1dCBhc2lkZSBJVgorCisJYmwJX2JzYWVzX2RlY3J5cHQ4CisKKwl2bGRtaWEJJGZwLCB7QFhNTVsxNF19CQkJQCByZWxvYWQgSVYKKwl2bGQxLjgJe0BYTU1bOF0tQFhNTVs5XX0sIFskaW5wXSEJQCByZWxvYWQgaW5wdXQKKwl2ZW9yCUBYTU1bMF0sIEBYTU1bMF0sIEBYTU1bMTRdCUAgXj0gSVYKKwl2bGQxLjgJe0BYTU1bMTBdLUBYTU1bMTFdfSwgWyRpbnBdIQorCXZlb3IJQFhNTVsxXSwgQFhNTVsxXSwgQFhNTVs4XQorCXZlb3IJQFhNTVs2XSwgQFhNTVs2XSwgQFhNTVs5XQorCXZsZDEuOAl7QFhNTVsxMl0tQFhNTVsxM119LCBbJGlucF0hCisJdmVvcglAWE1NWzRdLCBAWE1NWzRdLCBAWE1NWzEwXQorCXZlb3IJQFhNTVsyXSwgQFhNTVsyXSwgQFhNTVsxMV0KKwl2bGQxLjgJe0BYTU1bMTRdLUBYTU1bMTVdfSwgWyRpbnBdIQorCXZlb3IJQFhNTVs3XSwgQFhNTVs3XSwgQFhNTVsxMl0KKwl2c3QxLjgJe0BYTU1bMF0tQFhNTVsxXX0sIFskb3V0XSEJQCB3cml0ZSBvdXRwdXQKKwl2ZW9yCUBYTU1bM10sIEBYTU1bM10sIEBYTU1bMTNdCisJdnN0MS44CXtAWE1NWzZdfSwgWyRvdXRdIQorCXZlb3IJQFhNTVs1XSwgQFhNTVs1XSwgQFhNTVsxNF0KKwl2c3QxLjgJe0BYTU1bNF19LCBbJG91dF0hCisJdnN0MS44CXtAWE1NWzJdfSwgWyRvdXRdIQorCXZzdDEuOAl7QFhNTVs3XX0sIFskb3V0XSEKKwl2c3QxLjgJe0BYTU1bM119LCBbJG91dF0hCisJdnN0MS44CXtAWE1NWzVdfSwgWyRvdXRdIQorCisJYgkuTGNiY19kZWNfbG9vcAorCisuTGNiY19kZWNfbG9vcF9maW5pc2g6CisJYWRkcwkkbGVuLCAkbGVuLCAjOAorCWJlcQkuTGNiY19kZWNfZG9uZQorCisJdmxkMS44CXtAWE1NWzBdfSwgWyRpbnBdIQkJQCBsb2FkIGlucHV0CisJY21wCSRsZW4sICMyCisJYmxvCS5MY2JjX2RlY19vbmUKKwl2bGQxLjgJe0BYTU1bMV19LCBbJGlucF0hCisjaWZuZGVmCUJTQUVTX0FTTV9FWFRFTkRFRF9LRVkKKwltb3YJcjQsICRrZXlzY2hlZAkJCUAgcGFzcyB0aGUga2V5CisjZWxzZQorCWFkZAlyNCwgJGtleSwgIzI0OAorI2VuZGlmCisJbW92CXI1LCAkcm91bmRzCisJdnN0bWlhCSRmcCwge0BYTU1bMTVdfQkJCUAgcHV0IGFzaWRlIElWCisJYmVxCS5MY2JjX2RlY190d28KKwl2bGQxLjgJe0BYTU1bMl19LCBbJGlucF0hCisJY21wCSRsZW4sICM0CisJYmxvCS5MY2JjX2RlY190aHJlZQorCXZsZDEuOAl7QFhNTVszXX0sIFskaW5wXSEKKwliZXEJLkxjYmNfZGVjX2ZvdXIKKwl2bGQxLjgJe0BYTU1bNF19LCBbJGlucF0hCisJY21wCSRsZW4sICM2CisJYmxvCS5MY2JjX2RlY19maXZlCisJdmxkMS44CXtAWE1NWzVdfSwgWyRpbnBdIQorCWJlcQkuTGNiY19kZWNfc2l4CisJdmxkMS44CXtAWE1NWzZdfSwgWyRpbnBdIQorCXN1YgkkaW5wLCAkaW5wLCAjMHg3MAorCisJYmwJX2JzYWVzX2RlY3J5cHQ4CisKKwl2bGRtaWEJJGZwLCB7QFhNTVsxNF19CQkJQCByZWxvYWQgSVYKKwl2bGQxLjgJe0BYTU1bOF0tQFhNTVs5XX0sIFskaW5wXSEJQCByZWxvYWQgaW5wdXQKKwl2ZW9yCUBYTU1bMF0sIEBYTU1bMF0sIEBYTU1bMTRdCUAgXj0gSVYKKwl2bGQxLjgJe0BYTU1bMTBdLUBYTU1bMTFdfSwgWyRpbnBdIQorCXZlb3IJQFhNTVsxXSwgQFhNTVsxXSwgQFhNTVs4XQorCXZlb3IJQFhNTVs2XSwgQFhNTVs2XSwgQFhNTVs5XQorCXZsZDEuOAl7QFhNTVsxMl0tQFhNTVsxM119LCBbJGlucF0hCisJdmVvcglAWE1NWzRdLCBAWE1NWzRdLCBAWE1NWzEwXQorCXZlb3IJQFhNTVsyXSwgQFhNTVsyXSwgQFhNTVsxMV0KKwl2bGQxLjgJe0BYTU1bMTVdfSwgWyRpbnBdIQorCXZlb3IJQFhNTVs3XSwgQFhNTVs3XSwgQFhNTVsxMl0KKwl2c3QxLjgJe0BYTU1bMF0tQFhNTVsxXX0sIFskb3V0XSEJQCB3cml0ZSBvdXRwdXQKKwl2ZW9yCUBYTU1bM10sIEBYTU1bM10sIEBYTU1bMTNdCisJdnN0MS44CXtAWE1NWzZdfSwgWyRvdXRdIQorCXZzdDEuOAl7QFhNTVs0XX0sIFskb3V0XSEKKwl2c3QxLjgJe0BYTU1bMl19LCBbJG91dF0hCisJdnN0MS44CXtAWE1NWzddfSwgWyRvdXRdIQorCXZzdDEuOAl7QFhNTVszXX0sIFskb3V0XSEKKwliCS5MY2JjX2RlY19kb25lCisuYWxpZ24JNAorLkxjYmNfZGVjX3NpeDoKKwlzdWIJJGlucCwgJGlucCwgIzB4NjAKKwlibAlfYnNhZXNfZGVjcnlwdDgKKwl2bGRtaWEJJGZwLHtAWE1NWzE0XX0JCQlAIHJlbG9hZCBJVgorCXZsZDEuOAl7QFhNTVs4XS1AWE1NWzldfSwgWyRpbnBdIQlAIHJlbG9hZCBpbnB1dAorCXZlb3IJQFhNTVswXSwgQFhNTVswXSwgQFhNTVsxNF0JQCBePSBJVgorCXZsZDEuOAl7QFhNTVsxMF0tQFhNTVsxMV19LCBbJGlucF0hCisJdmVvcglAWE1NWzFdLCBAWE1NWzFdLCBAWE1NWzhdCisJdmVvcglAWE1NWzZdLCBAWE1NWzZdLCBAWE1NWzldCisJdmxkMS44CXtAWE1NWzEyXX0sIFskaW5wXSEKKwl2ZW9yCUBYTU1bNF0sIEBYTU1bNF0sIEBYTU1bMTBdCisJdmVvcglAWE1NWzJdLCBAWE1NWzJdLCBAWE1NWzExXQorCXZsZDEuOAl7QFhNTVsxNV19LCBbJGlucF0hCisJdmVvcglAWE1NWzddLCBAWE1NWzddLCBAWE1NWzEyXQorCXZzdDEuOAl7QFhNTVswXS1AWE1NWzFdfSwgWyRvdXRdIQlAIHdyaXRlIG91dHB1dAorCXZzdDEuOAl7QFhNTVs2XX0sIFskb3V0XSEKKwl2c3QxLjgJe0BYTU1bNF19LCBbJG91dF0hCisJdnN0MS44CXtAWE1NWzJdfSwgWyRvdXRdIQorCXZzdDEuOAl7QFhNTVs3XX0sIFskb3V0XSEKKwliCS5MY2JjX2RlY19kb25lCisuYWxpZ24JNAorLkxjYmNfZGVjX2ZpdmU6CisJc3ViCSRpbnAsICRpbnAsICMweDUwCisJYmwJX2JzYWVzX2RlY3J5cHQ4CisJdmxkbWlhCSRmcCwge0BYTU1bMTRdfQkJCUAgcmVsb2FkIElWCisJdmxkMS44CXtAWE1NWzhdLUBYTU1bOV19LCBbJGlucF0hCUAgcmVsb2FkIGlucHV0CisJdmVvcglAWE1NWzBdLCBAWE1NWzBdLCBAWE1NWzE0XQlAIF49IElWCisJdmxkMS44CXtAWE1NWzEwXS1AWE1NWzExXX0sIFskaW5wXSEKKwl2ZW9yCUBYTU1bMV0sIEBYTU1bMV0sIEBYTU1bOF0KKwl2ZW9yCUBYTU1bNl0sIEBYTU1bNl0sIEBYTU1bOV0KKwl2bGQxLjgJe0BYTU1bMTVdfSwgWyRpbnBdIQorCXZlb3IJQFhNTVs0XSwgQFhNTVs0XSwgQFhNTVsxMF0KKwl2c3QxLjgJe0BYTU1bMF0tQFhNTVsxXX0sIFskb3V0XSEJQCB3cml0ZSBvdXRwdXQKKwl2ZW9yCUBYTU1bMl0sIEBYTU1bMl0sIEBYTU1bMTFdCisJdnN0MS44CXtAWE1NWzZdfSwgWyRvdXRdIQorCXZzdDEuOAl7QFhNTVs0XX0sIFskb3V0XSEKKwl2c3QxLjgJe0BYTU1bMl19LCBbJG91dF0hCisJYgkuTGNiY19kZWNfZG9uZQorLmFsaWduCTQKKy5MY2JjX2RlY19mb3VyOgorCXN1YgkkaW5wLCAkaW5wLCAjMHg0MAorCWJsCV9ic2Flc19kZWNyeXB0OAorCXZsZG1pYQkkZnAsIHtAWE1NWzE0XX0JCQlAIHJlbG9hZCBJVgorCXZsZDEuOAl7QFhNTVs4XS1AWE1NWzldfSwgWyRpbnBdIQlAIHJlbG9hZCBpbnB1dAorCXZlb3IJQFhNTVswXSwgQFhNTVswXSwgQFhNTVsxNF0JQCBePSBJVgorCXZsZDEuOAl7QFhNTVsxMF19LCBbJGlucF0hCisJdmVvcglAWE1NWzFdLCBAWE1NWzFdLCBAWE1NWzhdCisJdmVvcglAWE1NWzZdLCBAWE1NWzZdLCBAWE1NWzldCisJdmxkMS44CXtAWE1NWzE1XX0sIFskaW5wXSEKKwl2ZW9yCUBYTU1bNF0sIEBYTU1bNF0sIEBYTU1bMTBdCisJdnN0MS44CXtAWE1NWzBdLUBYTU1bMV19LCBbJG91dF0hCUAgd3JpdGUgb3V0cHV0CisJdnN0MS44CXtAWE1NWzZdfSwgWyRvdXRdIQorCXZzdDEuOAl7QFhNTVs0XX0sIFskb3V0XSEKKwliCS5MY2JjX2RlY19kb25lCisuYWxpZ24JNAorLkxjYmNfZGVjX3RocmVlOgorCXN1YgkkaW5wLCAkaW5wLCAjMHgzMAorCWJsCV9ic2Flc19kZWNyeXB0OAorCXZsZG1pYQkkZnAsIHtAWE1NWzE0XX0JCQlAIHJlbG9hZCBJVgorCXZsZDEuOAl7QFhNTVs4XS1AWE1NWzldfSwgWyRpbnBdIQlAIHJlbG9hZCBpbnB1dAorCXZlb3IJQFhNTVswXSwgQFhNTVswXSwgQFhNTVsxNF0JQCBePSBJVgorCXZsZDEuOAl7QFhNTVsxNV19LCBbJGlucF0hCisJdmVvcglAWE1NWzFdLCBAWE1NWzFdLCBAWE1NWzhdCisJdmVvcglAWE1NWzZdLCBAWE1NWzZdLCBAWE1NWzldCisJdnN0MS44CXtAWE1NWzBdLUBYTU1bMV19LCBbJG91dF0hCUAgd3JpdGUgb3V0cHV0CisJdnN0MS44CXtAWE1NWzZdfSwgWyRvdXRdIQorCWIJLkxjYmNfZGVjX2RvbmUKKy5hbGlnbgk0CisuTGNiY19kZWNfdHdvOgorCXN1YgkkaW5wLCAkaW5wLCAjMHgyMAorCWJsCV9ic2Flc19kZWNyeXB0OAorCXZsZG1pYQkkZnAsIHtAWE1NWzE0XX0JCQlAIHJlbG9hZCBJVgorCXZsZDEuOAl7QFhNTVs4XX0sIFskaW5wXSEJCUAgcmVsb2FkIGlucHV0CisJdmVvcglAWE1NWzBdLCBAWE1NWzBdLCBAWE1NWzE0XQlAIF49IElWCisJdmxkMS44CXtAWE1NWzE1XX0sIFskaW5wXSEJCUAgcmVsb2FkIGlucHV0CisJdmVvcglAWE1NWzFdLCBAWE1NWzFdLCBAWE1NWzhdCisJdnN0MS44CXtAWE1NWzBdLUBYTU1bMV19LCBbJG91dF0hCUAgd3JpdGUgb3V0cHV0CisJYgkuTGNiY19kZWNfZG9uZQorLmFsaWduCTQKKy5MY2JjX2RlY19vbmU6CisJc3ViCSRpbnAsICRpbnAsICMweDEwCisJbW92CSRyb3VuZHMsICRvdXQJCQlAIHNhdmUgb3JpZ2luYWwgb3V0IHBvaW50ZXIKKwltb3YJJG91dCwgJGZwCQkJQCB1c2UgdGhlIGl2IHNjcmF0Y2ggc3BhY2UgYXMgb3V0IGJ1ZmZlcgorCW1vdglyMiwgJGtleQorCXZtb3YJQFhNTVs0XSxAWE1NWzE1XQkJQCBqdXN0IGluIGNhc2UgZW5zdXJlIHRoYXQgSVYKKwl2bW92CUBYTU1bNV0sQFhNTVswXQkJCUAgYW5kIGlucHV0IGFyZSBwcmVzZXJ2ZWQKKwlibAlBRVNfZGVjcnlwdAorCXZsZDEuOAl7QFhNTVswXX0sIFskZnAsOjY0XQkJQCBsb2FkIHJlc3VsdAorCXZlb3IJQFhNTVswXSwgQFhNTVswXSwgQFhNTVs0XQlAIF49IElWCisJdm1vdglAWE1NWzE1XSwgQFhNTVs1XQkJQCBAWE1NWzVdIGhvbGRzIGlucHV0CisJdnN0MS44CXtAWE1NWzBdfSwgWyRyb3VuZHNdCQlAIHdyaXRlIG91dHB1dAorCisuTGNiY19kZWNfZG9uZToKKyNpZm5kZWYJQlNBRVNfQVNNX0VYVEVOREVEX0tFWQorCXZtb3YuaTMyCXEwLCAjMAorCXZtb3YuaTMyCXExLCAjMAorLkxjYmNfZGVjX2J6ZXJvOgkJCQlAIHdpcGUga2V5IHNjaGVkdWxlIFtpZiBhbnldCisJdnN0bWlhCQkka2V5c2NoZWQhLCB7cTAtcTF9CisJY21wCQkka2V5c2NoZWQsICRmcAorCWJuZQkJLkxjYmNfZGVjX2J6ZXJvCisjZW5kaWYKKworCW1vdglzcCwgJGZwCisJYWRkCXNwLCAjMHgxMAkJCUAgYWRkIHNwLCRmcCwjMHgxMCBpcyBubyBnb29kIGZvciB0aHVtYgorCXZzdDEuOAl7QFhNTVsxNV19LCBbJGl2cF0JCUAgcmV0dXJuIElWCisJVkZQX0FCSV9QT1AKKwlsZG1pYQlzcCEsIHtyNC1yMTAsIHBjfQorLnNpemUJYnNhZXNfY2JjX2VuY3J5cHQsLi1ic2Flc19jYmNfZW5jcnlwdAorX19fCit9Cit7CitteSAoJGlucCwkb3V0LCRsZW4sJGtleSwgJGN0ciwkZnAsJHJvdW5kcyk9KG1hcCgiciRfIiwoMC4uMyw4Li4xMCkpKTsKK215ICRjb25zdCA9ICJyNiI7CSMgc2hhcmVkIHdpdGggX2JzYWVzX2VuY3J5cHQ4X2FsdAorbXkgJGtleXNjaGVkID0gInNwIjsKKworJGNvZGUuPTw8X19fOworLmV4dGVybglBRVNfZW5jcnlwdAorLmdsb2JhbAlic2Flc19jdHIzMl9lbmNyeXB0X2Jsb2NrcworLnR5cGUJYnNhZXNfY3RyMzJfZW5jcnlwdF9ibG9ja3MsJWZ1bmN0aW9uCisuYWxpZ24JNQorYnNhZXNfY3RyMzJfZW5jcnlwdF9ibG9ja3M6CisJY21wCSRsZW4sICM4CQkJQCB1c2UgcGxhaW4gQUVTIGZvcgorCWJsbwkuTGN0cl9lbmNfc2hvcnQJCQlAIHNtYWxsIHNpemVzCisKKwltb3YJaXAsIHNwCisJc3RtZGIJc3AhLCB7cjQtcjEwLCBscn0KKwlWRlBfQUJJX1BVU0gKKwlsZHIJJGN0ciwgW2lwXQkJCUAgY3RyIGlzIDFzdCBhcmcgb24gdGhlIHN0YWNrCisJc3ViCXNwLCBzcCwgIzB4MTAJCQlAIHNjcmF0Y2ggc3BhY2UgdG8gY2Fycnkgb3ZlciB0aGUgY3RyCisJbW92CSRmcCwgc3AJCQkJQCBzYXZlIHNwCisKKwlsZHIJJHJvdW5kcywgWyRrZXksICMyNDBdCQlAIGdldCAjIG9mIHJvdW5kcworI2lmbmRlZglCU0FFU19BU01fRVhURU5ERURfS0VZCisJQCBhbGxvY2F0ZSB0aGUga2V5IHNjaGVkdWxlIG9uIHRoZSBzdGFjaworCXN1YglyMTIsIHNwLCAkcm91bmRzLCBsc2wjNwkJQCAxMjggYnl0ZXMgcGVyIGlubmVyIHJvdW5kIGtleQorCWFkZAlyMTIsICNgMTI4LTMyYAkJCUAgc2l6ZSBvZiBiaXQtc2xpY2VkIGtleSBzY2hlZHVsZQorCisJQCBwb3B1bGF0ZSB0aGUga2V5IHNjaGVkdWxlCisJbW92CXI0LCAka2V5CQkJQCBwYXNzIGtleQorCW1vdglyNSwgJHJvdW5kcwkJCUAgcGFzcyAjIG9mIHJvdW5kcworCW1vdglzcCwgcjEyCQkJCUAgc3AgaXMgJGtleXNjaGVkCisJYmwJX2JzYWVzX2tleV9jb252ZXJ0CisJdmVvcglAWE1NWzddLEBYTU1bN10sQFhNTVsxNV0JQCBmaXggdXAgbGFzdCByb3VuZCBrZXkKKwl2c3RtaWEJcjEyLCB7QFhNTVs3XX0JCQlAIHNhdmUgbGFzdCByb3VuZCBrZXkKKworCXZsZDEuOAl7QFhNTVswXX0sIFskY3RyXQkJQCBsb2FkIGNvdW50ZXIKKwlhZGQJJGN0ciwgJGNvbnN0LCAjLkxSRVZNMFNSLS5MTTAJQCBib3Jyb3cgJGN0cgorCXZsZG1pYQkka2V5c2NoZWQsIHtAWE1NWzRdfQkJQCBsb2FkIHJvdW5kMCBrZXkKKyNlbHNlCisJbGRyCXIxMiwgWyRrZXksICMyNDRdCisJZW9ycwlyMTIsICMxCisJYmVxCTBmCisKKwlAIHBvcHVsYXRlIHRoZSBrZXkgc2NoZWR1bGUKKwlzdHIJcjEyLCBbJGtleSwgIzI0NF0KKwltb3YJcjQsICRrZXkJCQlAIHBhc3Mga2V5CisJbW92CXI1LCAkcm91bmRzCQkJQCBwYXNzICMgb2Ygcm91bmRzCisJYWRkCXIxMiwgJGtleSwgIzI0OAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKwlibAlfYnNhZXNfa2V5X2NvbnZlcnQKKwl2ZW9yCUBYTU1bN10sQFhNTVs3XSxAWE1NWzE1XQlAIGZpeCB1cCBsYXN0IHJvdW5kIGtleQorCXZzdG1pYQlyMTIsIHtAWE1NWzddfQkJCUAgc2F2ZSBsYXN0IHJvdW5kIGtleQorCisuYWxpZ24JMgorMDoJYWRkCXIxMiwgJGtleSwgIzI0OAorCXZsZDEuOAl7QFhNTVswXX0sIFskY3RyXQkJQCBsb2FkIGNvdW50ZXIKKwlhZHJsCSRjdHIsIC5MUkVWTTBTUgkJCUAgYm9ycm93ICRjdHIKKwl2bGRtaWEJcjEyLCB7QFhNTVs0XX0JCQlAIGxvYWQgcm91bmQwIGtleQorCXN1YglzcCwgIzB4MTAJCQlAIHBsYWNlIGZvciBhZGp1c3RlZCByb3VuZDAga2V5CisjZW5kaWYKKworCXZtb3YuaTMyCUBYTU1bOF0sIzEJCUAgY29tcG9zZSAxPDw5NgorCXZlb3IJCUBYTU1bOV0sQFhNTVs5XSxAWE1NWzldCisJdnJldjMyLjgJQFhNTVswXSxAWE1NWzBdCisJdmV4dC44CQlAWE1NWzhdLEBYTU1bOV0sQFhNTVs4XSwjNAorCXZyZXYzMi44CUBYTU1bNF0sQFhNTVs0XQorCXZhZGQudTMyCUBYTU1bOV0sQFhNTVs4XSxAWE1NWzhdCUAgY29tcG9zZSAyPDw5NgorCXZzdG1pYQkka2V5c2NoZWQsIHtAWE1NWzRdfQkJQCBzYXZlIGFkanVzdGVkIHJvdW5kMCBrZXkKKwliCS5MY3RyX2VuY19sb29wCisKKy5hbGlnbgk0CisuTGN0cl9lbmNfbG9vcDoKKwl2YWRkLnUzMglAWE1NWzEwXSwgQFhNTVs4XSwgQFhNTVs5XQlAIGNvbXBvc2UgMzw8OTYKKwl2YWRkLnUzMglAWE1NWzFdLCBAWE1NWzBdLCBAWE1NWzhdCUAgKzEKKwl2YWRkLnUzMglAWE1NWzJdLCBAWE1NWzBdLCBAWE1NWzldCUAgKzIKKwl2YWRkLnUzMglAWE1NWzNdLCBAWE1NWzBdLCBAWE1NWzEwXQlAICszCisJdmFkZC51MzIJQFhNTVs0XSwgQFhNTVsxXSwgQFhNTVsxMF0KKwl2YWRkLnUzMglAWE1NWzVdLCBAWE1NWzJdLCBAWE1NWzEwXQorCXZhZGQudTMyCUBYTU1bNl0sIEBYTU1bM10sIEBYTU1bMTBdCisJdmFkZC51MzIJQFhNTVs3XSwgQFhNTVs0XSwgQFhNTVsxMF0KKwl2YWRkLnUzMglAWE1NWzEwXSwgQFhNTVs1XSwgQFhNTVsxMF0JQCBuZXh0IGNvdW50ZXIKKworCUAgQm9ycm93IHByb2xvZ3VlIGZyb20gX2JzYWVzX2VuY3J5cHQ4IHRvIHVzZSB0aGUgb3Bwb3J0dW5pdHkKKwlAIHRvIGZsaXAgYnl0ZSBvcmRlciBpbiAzMi1iaXQgY291bnRlcgorCisJdmxkbWlhCQkka2V5c2NoZWQsIHtAWE1NWzldfQkJQCBsb2FkIHJvdW5kMCBrZXkKKyNpZm5kZWYJQlNBRVNfQVNNX0VYVEVOREVEX0tFWQorCWFkZAkJcjQsICRrZXlzY2hlZCwgIzB4MTAJCUAgcGFzcyBuZXh0IHJvdW5kIGtleQorI2Vsc2UKKwlhZGQJCXI0LCAka2V5LCAjYDI0OCsxNmAKKyNlbmRpZgorCXZsZG1pYQkJJGN0ciwge0BYTU1bOF19CQkJQCAuTFJFVk0wU1IKKwltb3YJCXI1LCAkcm91bmRzCQkJQCBwYXNzIHJvdW5kcworCXZzdG1pYQkJJGZwLCB7QFhNTVsxMF19CQkJQCBzYXZlIG5leHQgY291bnRlcgorCXN1YgkJJGNvbnN0LCAkY3RyLCAjLkxSRVZNMFNSLS5MU1IJQCBwYXNzIGNvbnN0YW50cworCisJYmwJCV9ic2Flc19lbmNyeXB0OF9hbHQKKworCXN1YnMJCSRsZW4sICRsZW4sICM4CisJYmxvCQkuTGN0cl9lbmNfbG9vcF9kb25lCisKKwl2bGQxLjgJCXtAWE1NWzhdLUBYTU1bOV19LCBbJGlucF0hCUAgbG9hZCBpbnB1dAorCXZsZDEuOAkJe0BYTU1bMTBdLUBYTU1bMTFdfSwgWyRpbnBdIQorCXZlb3IJCUBYTU1bMF0sIEBYTU1bOF0KKwl2ZW9yCQlAWE1NWzFdLCBAWE1NWzldCisJdmxkMS44CQl7QFhNTVsxMl0tQFhNTVsxM119LCBbJGlucF0hCisJdmVvcgkJQFhNTVs0XSwgQFhNTVsxMF0KKwl2ZW9yCQlAWE1NWzZdLCBAWE1NWzExXQorCXZsZDEuOAkJe0BYTU1bMTRdLUBYTU1bMTVdfSwgWyRpbnBdIQorCXZlb3IJCUBYTU1bM10sIEBYTU1bMTJdCisJdnN0MS44CQl7QFhNTVswXS1AWE1NWzFdfSwgWyRvdXRdIQlAIHdyaXRlIG91dHB1dAorCXZlb3IJCUBYTU1bN10sIEBYTU1bMTNdCisJdmVvcgkJQFhNTVsyXSwgQFhNTVsxNF0KKwl2c3QxLjgJCXtAWE1NWzRdfSwgWyRvdXRdIQorCXZlb3IJCUBYTU1bNV0sIEBYTU1bMTVdCisJdnN0MS44CQl7QFhNTVs2XX0sIFskb3V0XSEKKwl2bW92LmkzMglAWE1NWzhdLCAjMQkJCUAgY29tcG9zZSAxPDw5NgorCXZzdDEuOAkJe0BYTU1bM119LCBbJG91dF0hCisJdmVvcgkJQFhNTVs5XSwgQFhNTVs5XSwgQFhNTVs5XQorCXZzdDEuOAkJe0BYTU1bN119LCBbJG91dF0hCisJdmV4dC44CQlAWE1NWzhdLCBAWE1NWzldLCBAWE1NWzhdLCAjNAorCXZzdDEuOAkJe0BYTU1bMl19LCBbJG91dF0hCisJdmFkZC51MzIJQFhNTVs5XSxAWE1NWzhdLEBYTU1bOF0JCUAgY29tcG9zZSAyPDw5NgorCXZzdDEuOAkJe0BYTU1bNV19LCBbJG91dF0hCisJdmxkbWlhCQkkZnAsIHtAWE1NWzBdfQkJCUAgbG9hZCBjb3VudGVyCisKKwlibmUJCS5MY3RyX2VuY19sb29wCisJYgkJLkxjdHJfZW5jX2RvbmUKKworLmFsaWduCTQKKy5MY3RyX2VuY19sb29wX2RvbmU6CisJYWRkCQkkbGVuLCAkbGVuLCAjOAorCXZsZDEuOAkJe0BYTU1bOF19LCBbJGlucF0hCUAgbG9hZCBpbnB1dAorCXZlb3IJCUBYTU1bMF0sIEBYTU1bOF0KKwl2c3QxLjgJCXtAWE1NWzBdfSwgWyRvdXRdIQlAIHdyaXRlIG91dHB1dAorCWNtcAkJJGxlbiwgIzIKKwlibG8JCS5MY3RyX2VuY19kb25lCisJdmxkMS44CQl7QFhNTVs5XX0sIFskaW5wXSEKKwl2ZW9yCQlAWE1NWzFdLCBAWE1NWzldCisJdnN0MS44CQl7QFhNTVsxXX0sIFskb3V0XSEKKwliZXEJCS5MY3RyX2VuY19kb25lCisJdmxkMS44CQl7QFhNTVsxMF19LCBbJGlucF0hCisJdmVvcgkJQFhNTVs0XSwgQFhNTVsxMF0KKwl2c3QxLjgJCXtAWE1NWzRdfSwgWyRvdXRdIQorCWNtcAkJJGxlbiwgIzQKKwlibG8JCS5MY3RyX2VuY19kb25lCisJdmxkMS44CQl7QFhNTVsxMV19LCBbJGlucF0hCisJdmVvcgkJQFhNTVs2XSwgQFhNTVsxMV0KKwl2c3QxLjgJCXtAWE1NWzZdfSwgWyRvdXRdIQorCWJlcQkJLkxjdHJfZW5jX2RvbmUKKwl2bGQxLjgJCXtAWE1NWzEyXX0sIFskaW5wXSEKKwl2ZW9yCQlAWE1NWzNdLCBAWE1NWzEyXQorCXZzdDEuOAkJe0BYTU1bM119LCBbJG91dF0hCisJY21wCQkkbGVuLCAjNgorCWJsbwkJLkxjdHJfZW5jX2RvbmUKKwl2bGQxLjgJCXtAWE1NWzEzXX0sIFskaW5wXSEKKwl2ZW9yCQlAWE1NWzddLCBAWE1NWzEzXQorCXZzdDEuOAkJe0BYTU1bN119LCBbJG91dF0hCisJYmVxCQkuTGN0cl9lbmNfZG9uZQorCXZsZDEuOAkJe0BYTU1bMTRdfSwgWyRpbnBdCisJdmVvcgkJQFhNTVsyXSwgQFhNTVsxNF0KKwl2c3QxLjgJCXtAWE1NWzJdfSwgWyRvdXRdIQorCisuTGN0cl9lbmNfZG9uZToKKwl2bW92LmkzMglxMCwgIzAKKwl2bW92LmkzMglxMSwgIzAKKyNpZm5kZWYJQlNBRVNfQVNNX0VYVEVOREVEX0tFWQorLkxjdHJfZW5jX2J6ZXJvOgkJCUAgd2lwZSBrZXkgc2NoZWR1bGUgW2lmIGFueV0KKwl2c3RtaWEJCSRrZXlzY2hlZCEsIHtxMC1xMX0KKwljbXAJCSRrZXlzY2hlZCwgJGZwCisJYm5lCQkuTGN0cl9lbmNfYnplcm8KKyNlbHNlCisJdnN0bWlhCQkka2V5c2NoZWQsIHtxMC1xMX0KKyNlbmRpZgorCisJbW92CXNwLCAkZnAKKwlhZGQJc3AsICMweDEwCQlAIGFkZCBzcCwkZnAsIzB4MTAgaXMgbm8gZ29vZCBmb3IgdGh1bWIKKwlWRlBfQUJJX1BPUAorCWxkbWlhCXNwISwge3I0LXIxMCwgcGN9CUAgcmV0dXJuCisKKy5hbGlnbgk0CisuTGN0cl9lbmNfc2hvcnQ6CisJbGRyCWlwLCBbc3BdCQlAIGN0ciBwb2ludGVyIGlzIHBhc3NlZCBvbiBzdGFjaworCXN0bWRiCXNwISwge3I0LXI4LCBscn0KKworCW1vdglyNCwgJGlucAkJQCBjb3B5IGFyZ3VtZW50cworCW1vdglyNSwgJG91dAorCW1vdglyNiwgJGxlbgorCW1vdglyNywgJGtleQorCWxkcglyOCwgW2lwLCAjMTJdCQlAIGxvYWQgY291bnRlciBMU1cKKwl2bGQxLjgJe0BYTU1bMV19LCBbaXBdCQlAIGxvYWQgd2hvbGUgY291bnRlciB2YWx1ZQorI2lmZGVmIF9fQVJNRUxfXworCXJldglyOCwgcjgKKyNlbmRpZgorCXN1YglzcCwgc3AsICMweDEwCisJdnN0MS44CXtAWE1NWzFdfSwgW3NwLDo2NF0JQCBjb3B5IGNvdW50ZXIgdmFsdWUKKwlzdWIJc3AsIHNwLCAjMHgxMAorCisuTGN0cl9lbmNfc2hvcnRfbG9vcDoKKwlhZGQJcjAsIHNwLCAjMHgxMAkJQCBpbnB1dCBjb3VudGVyIHZhbHVlCisJbW92CXIxLCBzcAkJCUAgb3V0cHV0IG9uIHRoZSBzdGFjaworCW1vdglyMiwgcjcJCQlAIGtleQorCisJYmwJQUVTX2VuY3J5cHQKKworCXZsZDEuOAl7QFhNTVswXX0sIFtyNF0hCUAgbG9hZCBpbnB1dAorCXZsZDEuOAl7QFhNTVsxXX0sIFtzcCw6NjRdCUAgbG9hZCBlbmNyeXB0ZWQgY291bnRlcgorCWFkZAlyOCwgcjgsICMxCisjaWZkZWYgX19BUk1FTF9fCisJcmV2CXIwLCByOAorCXN0cglyMCwgW3NwLCAjMHgxY10JCUAgbmV4dCBjb3VudGVyIHZhbHVlCisjZWxzZQorCXN0cglyOCwgW3NwLCAjMHgxY10JCUAgbmV4dCBjb3VudGVyIHZhbHVlCisjZW5kaWYKKwl2ZW9yCUBYTU1bMF0sQFhNTVswXSxAWE1NWzFdCisJdnN0MS44CXtAWE1NWzBdfSwgW3I1XSEJQCBzdG9yZSBvdXRwdXQKKwlzdWJzCXI2LCByNiwgIzEKKwlibmUJLkxjdHJfZW5jX3Nob3J0X2xvb3AKKworCXZtb3YuaTMyCXEwLCAjMAorCXZtb3YuaTMyCXExLCAjMAorCXZzdG1pYQkJc3AhLCB7cTAtcTF9CisKKwlsZG1pYQlzcCEsIHtyNC1yOCwgcGN9Cisuc2l6ZQlic2Flc19jdHIzMl9lbmNyeXB0X2Jsb2NrcywuLWJzYWVzX2N0cjMyX2VuY3J5cHRfYmxvY2tzCitfX18KK30KK3sKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgdm9pZCBic2Flc194dHNfW2VufGRlXWNyeXB0KGNvbnN0IGNoYXIgKmlucCxjaGFyICpvdXQsc2l6ZV90IGxlbiwKKyMJY29uc3QgQUVTX0tFWSAqa2V5MSwgY29uc3QgQUVTX0tFWSAqa2V5MiwKKyMJY29uc3QgdW5zaWduZWQgY2hhciBpdlsxNl0pOworIworbXkgKCRpbnAsJG91dCwkbGVuLCRrZXksJHJvdW5kcywkbWFnaWMsJGZwKT0obWFwKCJyJF8iLCg3Li4xMCwxLi4zKSkpOworbXkgJGNvbnN0PSJyNiI7CQkjIHJldHVybmVkIGJ5IF9ic2Flc19rZXlfY29udmVydAorbXkgJHR3bWFzaz1AWE1NWzVdOworbXkgQFQ9QFhNTVs2Li43XTsKKworJGNvZGUuPTw8X19fOworLmdsb2JsCWJzYWVzX3h0c19lbmNyeXB0CisudHlwZQlic2Flc194dHNfZW5jcnlwdCwlZnVuY3Rpb24KKy5hbGlnbgk0Citic2Flc194dHNfZW5jcnlwdDoKKwltb3YJaXAsIHNwCisJc3RtZGIJc3AhLCB7cjQtcjEwLCBscn0JCUAgMHgyMAorCVZGUF9BQklfUFVTSAorCW1vdglyNiwgc3AJCQkJQCBmdXR1cmUgJGZwCisKKwltb3YJJGlucCwgcjAKKwltb3YJJG91dCwgcjEKKwltb3YJJGxlbiwgcjIKKwltb3YJJGtleSwgcjMKKworCXN1YglyMCwgc3AsICMweDEwCQkJQCAweDEwCisJYmljCXIwLCAjMHhmCQkJQCBhbGlnbiBhdCAxNiBieXRlcworCW1vdglzcCwgcjAKKworI2lmZGVmCVhUU19DSEFJTl9UV0VBSworCWxkcglyMCwgW2lwXQkJCUAgcG9pbnRlciB0byBpbnB1dCB0d2VhaworI2Vsc2UKKwlAIGdlbmVyYXRlIGluaXRpYWwgdHdlYWsKKwlsZHIJcjAsIFtpcCwgIzRdCQkJQCBpdltdCisJbW92CXIxLCBzcAorCWxkcglyMiwgW2lwLCAjMF0JCQlAIGtleTIKKwlibAlBRVNfZW5jcnlwdAorCW1vdglyMCxzcAkJCQlAIHBvaW50ZXIgdG8gaW5pdGlhbCB0d2VhaworI2VuZGlmCisKKwlsZHIJJHJvdW5kcywgWyRrZXksICMyNDBdCQlAIGdldCAjIG9mIHJvdW5kcworCW1vdgkkZnAsIHI2CisjaWZuZGVmCUJTQUVTX0FTTV9FWFRFTkRFRF9LRVkKKwlAIGFsbG9jYXRlIHRoZSBrZXkgc2NoZWR1bGUgb24gdGhlIHN0YWNrCisJc3ViCXIxMiwgc3AsICRyb3VuZHMsIGxzbCM3CQlAIDEyOCBieXRlcyBwZXIgaW5uZXIgcm91bmQga2V5CisJQCBhZGQJcjEyLCAjYDEyOC0zMmAJCQlAIHNpemUgb2YgYml0LXNsaWNlZCBrZXkgc2NoZWR1bGUKKwlzdWIJcjEyLCAjYDMyKzE2YAkJCUAgcGxhY2UgZm9yIHR3ZWFrWzldCisKKwlAIHBvcHVsYXRlIHRoZSBrZXkgc2NoZWR1bGUKKwltb3YJcjQsICRrZXkJCQlAIHBhc3Mga2V5CisJbW92CXI1LCAkcm91bmRzCQkJQCBwYXNzICMgb2Ygcm91bmRzCisJbW92CXNwLCByMTIKKwlhZGQJcjEyLCAjMHg5MAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKwlibAlfYnNhZXNfa2V5X2NvbnZlcnQKKwl2ZW9yCUBYTU1bN10sIEBYTU1bN10sIEBYTU1bMTVdCUAgZml4IHVwIGxhc3Qgcm91bmQga2V5CisJdnN0bWlhCXIxMiwge0BYTU1bN119CQkJQCBzYXZlIGxhc3Qgcm91bmQga2V5CisjZWxzZQorCWxkcglyMTIsIFska2V5LCAjMjQ0XQorCWVvcnMJcjEyLCAjMQorCWJlcQkwZgorCisJc3RyCXIxMiwgWyRrZXksICMyNDRdCisJbW92CXI0LCAka2V5CQkJQCBwYXNzIGtleQorCW1vdglyNSwgJHJvdW5kcwkJCUAgcGFzcyAjIG9mIHJvdW5kcworCWFkZAlyMTIsICRrZXksICMyNDgJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisJYmwJX2JzYWVzX2tleV9jb252ZXJ0CisJdmVvcglAWE1NWzddLCBAWE1NWzddLCBAWE1NWzE1XQlAIGZpeCB1cCBsYXN0IHJvdW5kIGtleQorCXZzdG1pYQlyMTIsIHtAWE1NWzddfQorCisuYWxpZ24JMgorMDoJc3ViCXNwLCAjMHg5MAkJCUAgcGxhY2UgZm9yIHR3ZWFrWzldCisjZW5kaWYKKworCXZsZDEuOAl7QFhNTVs4XX0sIFtyMF0JCQlAIGluaXRpYWwgdHdlYWsKKwlhZHIJJG1hZ2ljLCAuTHh0c19tYWdpYworCisJc3VicwkkbGVuLCAjMHg4MAorCWJsbwkuTHh0c19lbmNfc2hvcnQKKwliCS5MeHRzX2VuY19sb29wCisKKy5hbGlnbgk0CisuTHh0c19lbmNfbG9vcDoKKwl2bGRtaWEJCSRtYWdpYywgeyR0d21hc2t9CUAgbG9hZCBYVFMgbWFnaWMKKwl2c2hyLnM2NAlAVFswXSwgQFhNTVs4XSwgIzYzCisJbW92CQlyMCwgc3AKKwl2YW5kCQlAVFswXSwgQFRbMF0sICR0d21hc2sKK19fXworZm9yKCRpPTk7JGk8MTY7JGkrKykgeworJGNvZGUuPTw8X19fOworCXZhZGQudTY0CUBYTU1bJGldLCBAWE1NWyRpLTFdLCBAWE1NWyRpLTFdCisJdnN0MS42NAkJe0BYTU1bJGktMV19LCBbcjAsOjEyOF0hCisJdnN3cAkJYCZEaGkoIkBUWzBdIilgLGAmRGxvKCJAVFswXSIpYAorCXZzaHIuczY0CUBUWzFdLCBAWE1NWyRpXSwgIzYzCisJdmVvcgkJQFhNTVskaV0sIEBYTU1bJGldLCBAVFswXQorCXZhbmQJCUBUWzFdLCBAVFsxXSwgJHR3bWFzaworX19fCisJQFQ9cmV2ZXJzZShAVCk7CisKKyRjb2RlLj08PF9fXyBpZiAoJGk+PTEwKTsKKwl2bGQxLjgJCXtAWE1NWyRpLTEwXX0sIFskaW5wXSEKK19fXworJGNvZGUuPTw8X19fIGlmICgkaT49MTEpOworCXZlb3IJCUBYTU1bJGktMTFdLCBAWE1NWyRpLTExXSwgQFhNTVskaS0zXQorX19fCit9CiskY29kZS49PDxfX187CisJdmFkZC51NjQJQFhNTVs4XSwgQFhNTVsxNV0sIEBYTU1bMTVdCisJdnN0MS42NAkJe0BYTU1bMTVdfSwgW3IwLDoxMjhdIQorCXZzd3AJCWAmRGhpKCJAVFswXSIpYCxgJkRsbygiQFRbMF0iKWAKKwl2ZW9yCQlAWE1NWzhdLCBAWE1NWzhdLCBAVFswXQorCXZzdDEuNjQJCXtAWE1NWzhdfSwgW3IwLDoxMjhdCQlAIG5leHQgcm91bmQgdHdlYWsKKworCXZsZDEuOAkJe0BYTU1bNl0tQFhNTVs3XX0sIFskaW5wXSEKKwl2ZW9yCQlAWE1NWzVdLCBAWE1NWzVdLCBAWE1NWzEzXQorI2lmbmRlZglCU0FFU19BU01fRVhURU5ERURfS0VZCisJYWRkCQlyNCwgc3AsICMweDkwCQkJQCBwYXNzIGtleSBzY2hlZHVsZQorI2Vsc2UKKwlhZGQJCXI0LCAka2V5LCAjMjQ4CQkJQCBwYXNzIGtleSBzY2hlZHVsZQorI2VuZGlmCisJdmVvcgkJQFhNTVs2XSwgQFhNTVs2XSwgQFhNTVsxNF0KKwltb3YJCXI1LCAkcm91bmRzCQkJQCBwYXNzIHJvdW5kcworCXZlb3IJCUBYTU1bN10sIEBYTU1bN10sIEBYTU1bMTVdCisJbW92CQlyMCwgc3AKKworCWJsCQlfYnNhZXNfZW5jcnlwdDgKKworCXZsZDEuNjQJCXtAWE1NWyA4XS1AWE1NWyA5XX0sIFtyMCw6MTI4XSEKKwl2bGQxLjY0CQl7QFhNTVsxMF0tQFhNTVsxMV19LCBbcjAsOjEyOF0hCisJdmVvcgkJQFhNTVswXSwgQFhNTVswXSwgQFhNTVsgOF0KKwl2bGQxLjY0CQl7QFhNTVsxMl0tQFhNTVsxM119LCBbcjAsOjEyOF0hCisJdmVvcgkJQFhNTVsxXSwgQFhNTVsxXSwgQFhNTVsgOV0KKwl2ZW9yCQlAWE1NWzhdLCBAWE1NWzRdLCBAWE1NWzEwXQorCXZzdDEuOAkJe0BYTU1bMF0tQFhNTVsxXX0sIFskb3V0XSEKKwl2ZW9yCQlAWE1NWzldLCBAWE1NWzZdLCBAWE1NWzExXQorCXZsZDEuNjQJCXtAWE1NWzE0XS1AWE1NWzE1XX0sIFtyMCw6MTI4XSEKKwl2ZW9yCQlAWE1NWzEwXSwgQFhNTVszXSwgQFhNTVsxMl0KKwl2c3QxLjgJCXtAWE1NWzhdLUBYTU1bOV19LCBbJG91dF0hCisJdmVvcgkJQFhNTVsxMV0sIEBYTU1bN10sIEBYTU1bMTNdCisJdmVvcgkJQFhNTVsxMl0sIEBYTU1bMl0sIEBYTU1bMTRdCisJdnN0MS44CQl7QFhNTVsxMF0tQFhNTVsxMV19LCBbJG91dF0hCisJdmVvcgkJQFhNTVsxM10sIEBYTU1bNV0sIEBYTU1bMTVdCisJdnN0MS44CQl7QFhNTVsxMl0tQFhNTVsxM119LCBbJG91dF0hCisKKwl2bGQxLjY0CQl7QFhNTVs4XX0sIFtyMCw6MTI4XQkJQCBuZXh0IHJvdW5kIHR3ZWFrCisKKwlzdWJzCQkkbGVuLCAjMHg4MAorCWJwbAkJLkx4dHNfZW5jX2xvb3AKKworLkx4dHNfZW5jX3Nob3J0OgorCWFkZHMJCSRsZW4sICMweDcwCisJYm1pCQkuTHh0c19lbmNfZG9uZQorCisJdmxkbWlhCQkkbWFnaWMsIHskdHdtYXNrfQlAIGxvYWQgWFRTIG1hZ2ljCisJdnNoci5zNjQJQFRbMF0sIEBYTU1bOF0sICM2MworCW1vdgkJcjAsIHNwCisJdmFuZAkJQFRbMF0sIEBUWzBdLCAkdHdtYXNrCitfX18KK2ZvcigkaT05OyRpPDE2OyRpKyspIHsKKyRjb2RlLj08PF9fXzsKKwl2YWRkLnU2NAlAWE1NWyRpXSwgQFhNTVskaS0xXSwgQFhNTVskaS0xXQorCXZzdDEuNjQJCXtAWE1NWyRpLTFdfSwgW3IwLDoxMjhdIQorCXZzd3AJCWAmRGhpKCJAVFswXSIpYCxgJkRsbygiQFRbMF0iKWAKKwl2c2hyLnM2NAlAVFsxXSwgQFhNTVskaV0sICM2MworCXZlb3IJCUBYTU1bJGldLCBAWE1NWyRpXSwgQFRbMF0KKwl2YW5kCQlAVFsxXSwgQFRbMV0sICR0d21hc2sKK19fXworCUBUPXJldmVyc2UoQFQpOworCiskY29kZS49PDxfX18gaWYgKCRpPj0xMCk7CisJdmxkMS44CQl7QFhNTVskaS0xMF19LCBbJGlucF0hCisJc3VicwkJJGxlbiwgIzB4MTAKKwlibWkJCS5MeHRzX2VuY19gJGktOWAKK19fXworJGNvZGUuPTw8X19fIGlmICgkaT49MTEpOworCXZlb3IJCUBYTU1bJGktMTFdLCBAWE1NWyRpLTExXSwgQFhNTVskaS0zXQorX19fCit9CiskY29kZS49PDxfX187CisJc3ViCQkkbGVuLCAjMHgxMAorCXZzdDEuNjQJCXtAWE1NWzE1XX0sIFtyMCw6MTI4XQkJQCBuZXh0IHJvdW5kIHR3ZWFrCisKKwl2bGQxLjgJCXtAWE1NWzZdfSwgWyRpbnBdIQorCXZlb3IJCUBYTU1bNV0sIEBYTU1bNV0sIEBYTU1bMTNdCisjaWZuZGVmCUJTQUVTX0FTTV9FWFRFTkRFRF9LRVkKKwlhZGQJCXI0LCBzcCwgIzB4OTAJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisjZWxzZQorCWFkZAkJcjQsICRrZXksICMyNDgJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisjZW5kaWYKKwl2ZW9yCQlAWE1NWzZdLCBAWE1NWzZdLCBAWE1NWzE0XQorCW1vdgkJcjUsICRyb3VuZHMJCQlAIHBhc3Mgcm91bmRzCisJbW92CQlyMCwgc3AKKworCWJsCQlfYnNhZXNfZW5jcnlwdDgKKworCXZsZDEuNjQJCXtAWE1NWyA4XS1AWE1NWyA5XX0sIFtyMCw6MTI4XSEKKwl2bGQxLjY0CQl7QFhNTVsxMF0tQFhNTVsxMV19LCBbcjAsOjEyOF0hCisJdmVvcgkJQFhNTVswXSwgQFhNTVswXSwgQFhNTVsgOF0KKwl2bGQxLjY0CQl7QFhNTVsxMl0tQFhNTVsxM119LCBbcjAsOjEyOF0hCisJdmVvcgkJQFhNTVsxXSwgQFhNTVsxXSwgQFhNTVsgOV0KKwl2ZW9yCQlAWE1NWzhdLCBAWE1NWzRdLCBAWE1NWzEwXQorCXZzdDEuOAkJe0BYTU1bMF0tQFhNTVsxXX0sIFskb3V0XSEKKwl2ZW9yCQlAWE1NWzldLCBAWE1NWzZdLCBAWE1NWzExXQorCXZsZDEuNjQJCXtAWE1NWzE0XX0sIFtyMCw6MTI4XSEKKwl2ZW9yCQlAWE1NWzEwXSwgQFhNTVszXSwgQFhNTVsxMl0KKwl2c3QxLjgJCXtAWE1NWzhdLUBYTU1bOV19LCBbJG91dF0hCisJdmVvcgkJQFhNTVsxMV0sIEBYTU1bN10sIEBYTU1bMTNdCisJdmVvcgkJQFhNTVsxMl0sIEBYTU1bMl0sIEBYTU1bMTRdCisJdnN0MS44CQl7QFhNTVsxMF0tQFhNTVsxMV19LCBbJG91dF0hCisJdnN0MS44CQl7QFhNTVsxMl19LCBbJG91dF0hCisKKwl2bGQxLjY0CQl7QFhNTVs4XX0sIFtyMCw6MTI4XQkJQCBuZXh0IHJvdW5kIHR3ZWFrCisJYgkJLkx4dHNfZW5jX2RvbmUKKy5hbGlnbgk0CisuTHh0c19lbmNfNjoKKwl2c3QxLjY0CQl7QFhNTVsxNF19LCBbcjAsOjEyOF0JCUAgbmV4dCByb3VuZCB0d2VhaworCisJdmVvcgkJQFhNTVs0XSwgQFhNTVs0XSwgQFhNTVsxMl0KKyNpZm5kZWYJQlNBRVNfQVNNX0VYVEVOREVEX0tFWQorCWFkZAkJcjQsIHNwLCAjMHg5MAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKyNlbHNlCisJYWRkCQlyNCwgJGtleSwgIzI0OAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKyNlbmRpZgorCXZlb3IJCUBYTU1bNV0sIEBYTU1bNV0sIEBYTU1bMTNdCisJbW92CQlyNSwgJHJvdW5kcwkJCUAgcGFzcyByb3VuZHMKKwltb3YJCXIwLCBzcAorCisJYmwJCV9ic2Flc19lbmNyeXB0OAorCisJdmxkMS42NAkJe0BYTU1bIDhdLUBYTU1bIDldfSwgW3IwLDoxMjhdIQorCXZsZDEuNjQJCXtAWE1NWzEwXS1AWE1NWzExXX0sIFtyMCw6MTI4XSEKKwl2ZW9yCQlAWE1NWzBdLCBAWE1NWzBdLCBAWE1NWyA4XQorCXZsZDEuNjQJCXtAWE1NWzEyXS1AWE1NWzEzXX0sIFtyMCw6MTI4XSEKKwl2ZW9yCQlAWE1NWzFdLCBAWE1NWzFdLCBAWE1NWyA5XQorCXZlb3IJCUBYTU1bOF0sIEBYTU1bNF0sIEBYTU1bMTBdCisJdnN0MS44CQl7QFhNTVswXS1AWE1NWzFdfSwgWyRvdXRdIQorCXZlb3IJCUBYTU1bOV0sIEBYTU1bNl0sIEBYTU1bMTFdCisJdmVvcgkJQFhNTVsxMF0sIEBYTU1bM10sIEBYTU1bMTJdCisJdnN0MS44CQl7QFhNTVs4XS1AWE1NWzldfSwgWyRvdXRdIQorCXZlb3IJCUBYTU1bMTFdLCBAWE1NWzddLCBAWE1NWzEzXQorCXZzdDEuOAkJe0BYTU1bMTBdLUBYTU1bMTFdfSwgWyRvdXRdIQorCisJdmxkMS42NAkJe0BYTU1bOF19LCBbcjAsOjEyOF0JCUAgbmV4dCByb3VuZCB0d2VhaworCWIJCS5MeHRzX2VuY19kb25lCisKK0AgcHV0IHRoaXMgaW4gcmFuZ2UgZm9yIGJvdGggQVJNIGFuZCBUaHVtYiBtb2RlIGFkciBpbnN0cnVjdGlvbnMKKy5hbGlnbgk1CisuTHh0c19tYWdpYzoKKwkucXVhZAkxLCAweDg3CisKKy5hbGlnbgk1CisuTHh0c19lbmNfNToKKwl2c3QxLjY0CQl7QFhNTVsxM119LCBbcjAsOjEyOF0JCUAgbmV4dCByb3VuZCB0d2VhaworCisJdmVvcgkJQFhNTVszXSwgQFhNTVszXSwgQFhNTVsxMV0KKyNpZm5kZWYJQlNBRVNfQVNNX0VYVEVOREVEX0tFWQorCWFkZAkJcjQsIHNwLCAjMHg5MAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKyNlbHNlCisJYWRkCQlyNCwgJGtleSwgIzI0OAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKyNlbmRpZgorCXZlb3IJCUBYTU1bNF0sIEBYTU1bNF0sIEBYTU1bMTJdCisJbW92CQlyNSwgJHJvdW5kcwkJCUAgcGFzcyByb3VuZHMKKwltb3YJCXIwLCBzcAorCisJYmwJCV9ic2Flc19lbmNyeXB0OAorCisJdmxkMS42NAkJe0BYTU1bIDhdLUBYTU1bIDldfSwgW3IwLDoxMjhdIQorCXZsZDEuNjQJCXtAWE1NWzEwXS1AWE1NWzExXX0sIFtyMCw6MTI4XSEKKwl2ZW9yCQlAWE1NWzBdLCBAWE1NWzBdLCBAWE1NWyA4XQorCXZsZDEuNjQJCXtAWE1NWzEyXX0sIFtyMCw6MTI4XSEKKwl2ZW9yCQlAWE1NWzFdLCBAWE1NWzFdLCBAWE1NWyA5XQorCXZlb3IJCUBYTU1bOF0sIEBYTU1bNF0sIEBYTU1bMTBdCisJdnN0MS44CQl7QFhNTVswXS1AWE1NWzFdfSwgWyRvdXRdIQorCXZlb3IJCUBYTU1bOV0sIEBYTU1bNl0sIEBYTU1bMTFdCisJdmVvcgkJQFhNTVsxMF0sIEBYTU1bM10sIEBYTU1bMTJdCisJdnN0MS44CQl7QFhNTVs4XS1AWE1NWzldfSwgWyRvdXRdIQorCXZzdDEuOAkJe0BYTU1bMTBdfSwgWyRvdXRdIQorCisJdmxkMS42NAkJe0BYTU1bOF19LCBbcjAsOjEyOF0JCUAgbmV4dCByb3VuZCB0d2VhaworCWIJCS5MeHRzX2VuY19kb25lCisuYWxpZ24JNAorLkx4dHNfZW5jXzQ6CisJdnN0MS42NAkJe0BYTU1bMTJdfSwgW3IwLDoxMjhdCQlAIG5leHQgcm91bmQgdHdlYWsKKworCXZlb3IJCUBYTU1bMl0sIEBYTU1bMl0sIEBYTU1bMTBdCisjaWZuZGVmCUJTQUVTX0FTTV9FWFRFTkRFRF9LRVkKKwlhZGQJCXI0LCBzcCwgIzB4OTAJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisjZWxzZQorCWFkZAkJcjQsICRrZXksICMyNDgJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisjZW5kaWYKKwl2ZW9yCQlAWE1NWzNdLCBAWE1NWzNdLCBAWE1NWzExXQorCW1vdgkJcjUsICRyb3VuZHMJCQlAIHBhc3Mgcm91bmRzCisJbW92CQlyMCwgc3AKKworCWJsCQlfYnNhZXNfZW5jcnlwdDgKKworCXZsZDEuNjQJCXtAWE1NWyA4XS1AWE1NWyA5XX0sIFtyMCw6MTI4XSEKKwl2bGQxLjY0CQl7QFhNTVsxMF0tQFhNTVsxMV19LCBbcjAsOjEyOF0hCisJdmVvcgkJQFhNTVswXSwgQFhNTVswXSwgQFhNTVsgOF0KKwl2ZW9yCQlAWE1NWzFdLCBAWE1NWzFdLCBAWE1NWyA5XQorCXZlb3IJCUBYTU1bOF0sIEBYTU1bNF0sIEBYTU1bMTBdCisJdnN0MS44CQl7QFhNTVswXS1AWE1NWzFdfSwgWyRvdXRdIQorCXZlb3IJCUBYTU1bOV0sIEBYTU1bNl0sIEBYTU1bMTFdCisJdnN0MS44CQl7QFhNTVs4XS1AWE1NWzldfSwgWyRvdXRdIQorCisJdmxkMS42NAkJe0BYTU1bOF19LCBbcjAsOjEyOF0JCUAgbmV4dCByb3VuZCB0d2VhaworCWIJCS5MeHRzX2VuY19kb25lCisuYWxpZ24JNAorLkx4dHNfZW5jXzM6CisJdnN0MS42NAkJe0BYTU1bMTFdfSwgW3IwLDoxMjhdCQlAIG5leHQgcm91bmQgdHdlYWsKKworCXZlb3IJCUBYTU1bMV0sIEBYTU1bMV0sIEBYTU1bOV0KKyNpZm5kZWYJQlNBRVNfQVNNX0VYVEVOREVEX0tFWQorCWFkZAkJcjQsIHNwLCAjMHg5MAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKyNlbHNlCisJYWRkCQlyNCwgJGtleSwgIzI0OAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKyNlbmRpZgorCXZlb3IJCUBYTU1bMl0sIEBYTU1bMl0sIEBYTU1bMTBdCisJbW92CQlyNSwgJHJvdW5kcwkJCUAgcGFzcyByb3VuZHMKKwltb3YJCXIwLCBzcAorCisJYmwJCV9ic2Flc19lbmNyeXB0OAorCisJdmxkMS42NAkJe0BYTU1bOF0tQFhNTVs5XX0sIFtyMCw6MTI4XSEKKwl2bGQxLjY0CQl7QFhNTVsxMF19LCBbcjAsOjEyOF0hCisJdmVvcgkJQFhNTVswXSwgQFhNTVswXSwgQFhNTVsgOF0KKwl2ZW9yCQlAWE1NWzFdLCBAWE1NWzFdLCBAWE1NWyA5XQorCXZlb3IJCUBYTU1bOF0sIEBYTU1bNF0sIEBYTU1bMTBdCisJdnN0MS44CQl7QFhNTVswXS1AWE1NWzFdfSwgWyRvdXRdIQorCXZzdDEuOAkJe0BYTU1bOF19LCBbJG91dF0hCisKKwl2bGQxLjY0CQl7QFhNTVs4XX0sIFtyMCw6MTI4XQkJQCBuZXh0IHJvdW5kIHR3ZWFrCisJYgkJLkx4dHNfZW5jX2RvbmUKKy5hbGlnbgk0CisuTHh0c19lbmNfMjoKKwl2c3QxLjY0CQl7QFhNTVsxMF19LCBbcjAsOjEyOF0JCUAgbmV4dCByb3VuZCB0d2VhaworCisJdmVvcgkJQFhNTVswXSwgQFhNTVswXSwgQFhNTVs4XQorI2lmbmRlZglCU0FFU19BU01fRVhURU5ERURfS0VZCisJYWRkCQlyNCwgc3AsICMweDkwCQkJQCBwYXNzIGtleSBzY2hlZHVsZQorI2Vsc2UKKwlhZGQJCXI0LCAka2V5LCAjMjQ4CQkJQCBwYXNzIGtleSBzY2hlZHVsZQorI2VuZGlmCisJdmVvcgkJQFhNTVsxXSwgQFhNTVsxXSwgQFhNTVs5XQorCW1vdgkJcjUsICRyb3VuZHMJCQlAIHBhc3Mgcm91bmRzCisJbW92CQlyMCwgc3AKKworCWJsCQlfYnNhZXNfZW5jcnlwdDgKKworCXZsZDEuNjQJCXtAWE1NWzhdLUBYTU1bOV19LCBbcjAsOjEyOF0hCisJdmVvcgkJQFhNTVswXSwgQFhNTVswXSwgQFhNTVsgOF0KKwl2ZW9yCQlAWE1NWzFdLCBAWE1NWzFdLCBAWE1NWyA5XQorCXZzdDEuOAkJe0BYTU1bMF0tQFhNTVsxXX0sIFskb3V0XSEKKworCXZsZDEuNjQJCXtAWE1NWzhdfSwgW3IwLDoxMjhdCQlAIG5leHQgcm91bmQgdHdlYWsKKwliCQkuTHh0c19lbmNfZG9uZQorLmFsaWduCTQKKy5MeHRzX2VuY18xOgorCW1vdgkJcjAsIHNwCisJdmVvcgkJQFhNTVswXSwgQFhNTVs4XQorCW1vdgkJcjEsIHNwCisJdnN0MS44CQl7QFhNTVswXX0sIFtzcCw6MTI4XQorCW1vdgkJcjIsICRrZXkKKwltb3YJCXI0LCAkZnAJCQkJQCBwcmVzZXJ2ZSBmcAorCisJYmwJCUFFU19lbmNyeXB0CisKKwl2bGQxLjgJCXtAWE1NWzBdfSwgW3NwLDoxMjhdCisJdmVvcgkJQFhNTVswXSwgQFhNTVswXSwgQFhNTVs4XQorCXZzdDEuOAkJe0BYTU1bMF19LCBbJG91dF0hCisJbW92CQkkZnAsIHI0CisKKwl2bW92CQlAWE1NWzhdLCBAWE1NWzldCQlAIG5leHQgcm91bmQgdHdlYWsKKworLkx4dHNfZW5jX2RvbmU6CisjaWZuZGVmCVhUU19DSEFJTl9UV0VBSworCWFkZHMJCSRsZW4sICMweDEwCisJYmVxCQkuTHh0c19lbmNfcmV0CisJc3ViCQlyNiwgJG91dCwgIzB4MTAKKworLkx4dHNfZW5jX3N0ZWFsOgorCWxkcmIJCXIwLCBbJGlucF0sICMxCisJbGRyYgkJcjEsIFskb3V0LCAjLTB4MTBdCisJc3RyYgkJcjAsIFskb3V0LCAjLTB4MTBdCisJc3RyYgkJcjEsIFskb3V0XSwgIzEKKworCXN1YnMJCSRsZW4sICMxCisJYmhpCQkuTHh0c19lbmNfc3RlYWwKKworCXZsZDEuOAkJe0BYTU1bMF19LCBbcjZdCisJbW92CQlyMCwgc3AKKwl2ZW9yCQlAWE1NWzBdLCBAWE1NWzBdLCBAWE1NWzhdCisJbW92CQlyMSwgc3AKKwl2c3QxLjgJCXtAWE1NWzBdfSwgW3NwLDoxMjhdCisJbW92CQlyMiwgJGtleQorCW1vdgkJcjQsICRmcAkJCUAgcHJlc2VydmUgZnAKKworCWJsCQlBRVNfZW5jcnlwdAorCisJdmxkMS44CQl7QFhNTVswXX0sIFtzcCw6MTI4XQorCXZlb3IJCUBYTU1bMF0sIEBYTU1bMF0sIEBYTU1bOF0KKwl2c3QxLjgJCXtAWE1NWzBdfSwgW3I2XQorCW1vdgkJJGZwLCByNAorI2VuZGlmCisKKy5MeHRzX2VuY19yZXQ6CisJYmljCQlyMCwgJGZwLCAjMHhmCisJdm1vdi5pMzIJcTAsICMwCisJdm1vdi5pMzIJcTEsICMwCisjaWZkZWYJWFRTX0NIQUlOX1RXRUFLCisJbGRyCQlyMSwgWyRmcCwgIzB4MjArVkZQX0FCSV9GUkFNRV0JQCBjaGFpbiB0d2VhaworI2VuZGlmCisuTHh0c19lbmNfYnplcm86CQkJCUAgd2lwZSBrZXkgc2NoZWR1bGUgW2lmIGFueV0KKwl2c3RtaWEJCXNwISwge3EwLXExfQorCWNtcAkJc3AsIHIwCisJYm5lCQkuTHh0c19lbmNfYnplcm8KKworCW1vdgkJc3AsICRmcAorI2lmZGVmCVhUU19DSEFJTl9UV0VBSworCXZzdDEuOAkJe0BYTU1bOF19LCBbcjFdCisjZW5kaWYKKwlWRlBfQUJJX1BPUAorCWxkbWlhCQlzcCEsIHtyNC1yMTAsIHBjfQlAIHJldHVybgorCisuc2l6ZQlic2Flc194dHNfZW5jcnlwdCwuLWJzYWVzX3h0c19lbmNyeXB0CisKKy5nbG9ibAlic2Flc194dHNfZGVjcnlwdAorLnR5cGUJYnNhZXNfeHRzX2RlY3J5cHQsJWZ1bmN0aW9uCisuYWxpZ24JNAorYnNhZXNfeHRzX2RlY3J5cHQ6CisJbW92CWlwLCBzcAorCXN0bWRiCXNwISwge3I0LXIxMCwgbHJ9CQlAIDB4MjAKKwlWRlBfQUJJX1BVU0gKKwltb3YJcjYsIHNwCQkJCUAgZnV0dXJlICRmcAorCisJbW92CSRpbnAsIHIwCisJbW92CSRvdXQsIHIxCisJbW92CSRsZW4sIHIyCisJbW92CSRrZXksIHIzCisKKwlzdWIJcjAsIHNwLCAjMHgxMAkJCUAgMHgxMAorCWJpYwlyMCwgIzB4ZgkJCUAgYWxpZ24gYXQgMTYgYnl0ZXMKKwltb3YJc3AsIHIwCisKKyNpZmRlZglYVFNfQ0hBSU5fVFdFQUsKKwlsZHIJcjAsIFtpcF0JCQlAIHBvaW50ZXIgdG8gaW5wdXQgdHdlYWsKKyNlbHNlCisJQCBnZW5lcmF0ZSBpbml0aWFsIHR3ZWFrCisJbGRyCXIwLCBbaXAsICM0XQkJCUAgaXZbXQorCW1vdglyMSwgc3AKKwlsZHIJcjIsIFtpcCwgIzBdCQkJQCBrZXkyCisJYmwJQUVTX2VuY3J5cHQKKwltb3YJcjAsIHNwCQkJCUAgcG9pbnRlciB0byBpbml0aWFsIHR3ZWFrCisjZW5kaWYKKworCWxkcgkkcm91bmRzLCBbJGtleSwgIzI0MF0JCUAgZ2V0ICMgb2Ygcm91bmRzCisJbW92CSRmcCwgcjYKKyNpZm5kZWYJQlNBRVNfQVNNX0VYVEVOREVEX0tFWQorCUAgYWxsb2NhdGUgdGhlIGtleSBzY2hlZHVsZSBvbiB0aGUgc3RhY2sKKwlzdWIJcjEyLCBzcCwgJHJvdW5kcywgbHNsIzcJCUAgMTI4IGJ5dGVzIHBlciBpbm5lciByb3VuZCBrZXkKKwlAIGFkZAlyMTIsICNgMTI4LTMyYAkJCUAgc2l6ZSBvZiBiaXQtc2xpY2VkIGtleSBzY2hlZHVsZQorCXN1YglyMTIsICNgMzIrMTZgCQkJQCBwbGFjZSBmb3IgdHdlYWtbOV0KKworCUAgcG9wdWxhdGUgdGhlIGtleSBzY2hlZHVsZQorCW1vdglyNCwgJGtleQkJCUAgcGFzcyBrZXkKKwltb3YJcjUsICRyb3VuZHMJCQlAIHBhc3MgIyBvZiByb3VuZHMKKwltb3YJc3AsIHIxMgorCWFkZAlyMTIsICMweDkwCQkJQCBwYXNzIGtleSBzY2hlZHVsZQorCWJsCV9ic2Flc19rZXlfY29udmVydAorCWFkZAlyNCwgc3AsICMweDkwCisJdmxkbWlhCXI0LCB7QFhNTVs2XX0KKwl2c3RtaWEJcjEyLCAge0BYTU1bMTVdfQkJQCBzYXZlIGxhc3Qgcm91bmQga2V5CisJdmVvcglAWE1NWzddLCBAWE1NWzddLCBAWE1NWzZdCUAgZml4IHVwIHJvdW5kIDAga2V5CisJdnN0bWlhCXI0LCB7QFhNTVs3XX0KKyNlbHNlCisJbGRyCXIxMiwgWyRrZXksICMyNDRdCisJZW9ycwlyMTIsICMxCisJYmVxCTBmCisKKwlzdHIJcjEyLCBbJGtleSwgIzI0NF0KKwltb3YJcjQsICRrZXkJCQlAIHBhc3Mga2V5CisJbW92CXI1LCAkcm91bmRzCQkJQCBwYXNzICMgb2Ygcm91bmRzCisJYWRkCXIxMiwgJGtleSwgIzI0OAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKwlibAlfYnNhZXNfa2V5X2NvbnZlcnQKKwlhZGQJcjQsICRrZXksICMyNDgKKwl2bGRtaWEJcjQsIHtAWE1NWzZdfQorCXZzdG1pYQlyMTIsICB7QFhNTVsxNV19CQlAIHNhdmUgbGFzdCByb3VuZCBrZXkKKwl2ZW9yCUBYTU1bN10sIEBYTU1bN10sIEBYTU1bNl0JQCBmaXggdXAgcm91bmQgMCBrZXkKKwl2c3RtaWEJcjQsIHtAWE1NWzddfQorCisuYWxpZ24JMgorMDoJc3ViCXNwLCAjMHg5MAkJCUAgcGxhY2UgZm9yIHR3ZWFrWzldCisjZW5kaWYKKwl2bGQxLjgJe0BYTU1bOF19LCBbcjBdCQkJQCBpbml0aWFsIHR3ZWFrCisJYWRyCSRtYWdpYywgLkx4dHNfbWFnaWMKKworCXRzdAkkbGVuLCAjMHhmCQkJQCBpZiBub3QgbXVsdGlwbGUgb2YgMTYKKwlpdAluZQkJCQlAIFRodW1iMiB0aGluZywgc2FuaXR5IGNoZWNrIGluIEFSTQorCXN1Ym5lCSRsZW4sICMweDEwCQkJQCBzdWJ0cmFjdCBhbm90aGVyIDE2IGJ5dGVzCisJc3VicwkkbGVuLCAjMHg4MAorCisJYmxvCS5MeHRzX2RlY19zaG9ydAorCWIJLkx4dHNfZGVjX2xvb3AKKworLmFsaWduCTQKKy5MeHRzX2RlY19sb29wOgorCXZsZG1pYQkJJG1hZ2ljLCB7JHR3bWFza30JQCBsb2FkIFhUUyBtYWdpYworCXZzaHIuczY0CUBUWzBdLCBAWE1NWzhdLCAjNjMKKwltb3YJCXIwLCBzcAorCXZhbmQJCUBUWzBdLCBAVFswXSwgJHR3bWFzaworX19fCitmb3IoJGk9OTskaTwxNjskaSsrKSB7CiskY29kZS49PDxfX187CisJdmFkZC51NjQJQFhNTVskaV0sIEBYTU1bJGktMV0sIEBYTU1bJGktMV0KKwl2c3QxLjY0CQl7QFhNTVskaS0xXX0sIFtyMCw6MTI4XSEKKwl2c3dwCQlgJkRoaSgiQFRbMF0iKWAsYCZEbG8oIkBUWzBdIilgCisJdnNoci5zNjQJQFRbMV0sIEBYTU1bJGldLCAjNjMKKwl2ZW9yCQlAWE1NWyRpXSwgQFhNTVskaV0sIEBUWzBdCisJdmFuZAkJQFRbMV0sIEBUWzFdLCAkdHdtYXNrCitfX18KKwlAVD1yZXZlcnNlKEBUKTsKKworJGNvZGUuPTw8X19fIGlmICgkaT49MTApOworCXZsZDEuOAkJe0BYTU1bJGktMTBdfSwgWyRpbnBdIQorX19fCiskY29kZS49PDxfX18gaWYgKCRpPj0xMSk7CisJdmVvcgkJQFhNTVskaS0xMV0sIEBYTU1bJGktMTFdLCBAWE1NWyRpLTNdCitfX18KK30KKyRjb2RlLj08PF9fXzsKKwl2YWRkLnU2NAlAWE1NWzhdLCBAWE1NWzE1XSwgQFhNTVsxNV0KKwl2c3QxLjY0CQl7QFhNTVsxNV19LCBbcjAsOjEyOF0hCisJdnN3cAkJYCZEaGkoIkBUWzBdIilgLGAmRGxvKCJAVFswXSIpYAorCXZlb3IJCUBYTU1bOF0sIEBYTU1bOF0sIEBUWzBdCisJdnN0MS42NAkJe0BYTU1bOF19LCBbcjAsOjEyOF0JCUAgbmV4dCByb3VuZCB0d2VhaworCisJdmxkMS44CQl7QFhNTVs2XS1AWE1NWzddfSwgWyRpbnBdIQorCXZlb3IJCUBYTU1bNV0sIEBYTU1bNV0sIEBYTU1bMTNdCisjaWZuZGVmCUJTQUVTX0FTTV9FWFRFTkRFRF9LRVkKKwlhZGQJCXI0LCBzcCwgIzB4OTAJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisjZWxzZQorCWFkZAkJcjQsICRrZXksICMyNDgJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisjZW5kaWYKKwl2ZW9yCQlAWE1NWzZdLCBAWE1NWzZdLCBAWE1NWzE0XQorCW1vdgkJcjUsICRyb3VuZHMJCQlAIHBhc3Mgcm91bmRzCisJdmVvcgkJQFhNTVs3XSwgQFhNTVs3XSwgQFhNTVsxNV0KKwltb3YJCXIwLCBzcAorCisJYmwJCV9ic2Flc19kZWNyeXB0OAorCisJdmxkMS42NAkJe0BYTU1bIDhdLUBYTU1bIDldfSwgW3IwLDoxMjhdIQorCXZsZDEuNjQJCXtAWE1NWzEwXS1AWE1NWzExXX0sIFtyMCw6MTI4XSEKKwl2ZW9yCQlAWE1NWzBdLCBAWE1NWzBdLCBAWE1NWyA4XQorCXZsZDEuNjQJCXtAWE1NWzEyXS1AWE1NWzEzXX0sIFtyMCw6MTI4XSEKKwl2ZW9yCQlAWE1NWzFdLCBAWE1NWzFdLCBAWE1NWyA5XQorCXZlb3IJCUBYTU1bOF0sIEBYTU1bNl0sIEBYTU1bMTBdCisJdnN0MS44CQl7QFhNTVswXS1AWE1NWzFdfSwgWyRvdXRdIQorCXZlb3IJCUBYTU1bOV0sIEBYTU1bNF0sIEBYTU1bMTFdCisJdmxkMS42NAkJe0BYTU1bMTRdLUBYTU1bMTVdfSwgW3IwLDoxMjhdIQorCXZlb3IJCUBYTU1bMTBdLCBAWE1NWzJdLCBAWE1NWzEyXQorCXZzdDEuOAkJe0BYTU1bOF0tQFhNTVs5XX0sIFskb3V0XSEKKwl2ZW9yCQlAWE1NWzExXSwgQFhNTVs3XSwgQFhNTVsxM10KKwl2ZW9yCQlAWE1NWzEyXSwgQFhNTVszXSwgQFhNTVsxNF0KKwl2c3QxLjgJCXtAWE1NWzEwXS1AWE1NWzExXX0sIFskb3V0XSEKKwl2ZW9yCQlAWE1NWzEzXSwgQFhNTVs1XSwgQFhNTVsxNV0KKwl2c3QxLjgJCXtAWE1NWzEyXS1AWE1NWzEzXX0sIFskb3V0XSEKKworCXZsZDEuNjQJCXtAWE1NWzhdfSwgW3IwLDoxMjhdCQlAIG5leHQgcm91bmQgdHdlYWsKKworCXN1YnMJCSRsZW4sICMweDgwCisJYnBsCQkuTHh0c19kZWNfbG9vcAorCisuTHh0c19kZWNfc2hvcnQ6CisJYWRkcwkJJGxlbiwgIzB4NzAKKwlibWkJCS5MeHRzX2RlY19kb25lCisKKwl2bGRtaWEJCSRtYWdpYywgeyR0d21hc2t9CUAgbG9hZCBYVFMgbWFnaWMKKwl2c2hyLnM2NAlAVFswXSwgQFhNTVs4XSwgIzYzCisJbW92CQlyMCwgc3AKKwl2YW5kCQlAVFswXSwgQFRbMF0sICR0d21hc2sKK19fXworZm9yKCRpPTk7JGk8MTY7JGkrKykgeworJGNvZGUuPTw8X19fOworCXZhZGQudTY0CUBYTU1bJGldLCBAWE1NWyRpLTFdLCBAWE1NWyRpLTFdCisJdnN0MS42NAkJe0BYTU1bJGktMV19LCBbcjAsOjEyOF0hCisJdnN3cAkJYCZEaGkoIkBUWzBdIilgLGAmRGxvKCJAVFswXSIpYAorCXZzaHIuczY0CUBUWzFdLCBAWE1NWyRpXSwgIzYzCisJdmVvcgkJQFhNTVskaV0sIEBYTU1bJGldLCBAVFswXQorCXZhbmQJCUBUWzFdLCBAVFsxXSwgJHR3bWFzaworX19fCisJQFQ9cmV2ZXJzZShAVCk7CisKKyRjb2RlLj08PF9fXyBpZiAoJGk+PTEwKTsKKwl2bGQxLjgJCXtAWE1NWyRpLTEwXX0sIFskaW5wXSEKKwlzdWJzCQkkbGVuLCAjMHgxMAorCWJtaQkJLkx4dHNfZGVjX2AkaS05YAorX19fCiskY29kZS49PDxfX18gaWYgKCRpPj0xMSk7CisJdmVvcgkJQFhNTVskaS0xMV0sIEBYTU1bJGktMTFdLCBAWE1NWyRpLTNdCitfX18KK30KKyRjb2RlLj08PF9fXzsKKwlzdWIJCSRsZW4sICMweDEwCisJdnN0MS42NAkJe0BYTU1bMTVdfSwgW3IwLDoxMjhdCQlAIG5leHQgcm91bmQgdHdlYWsKKworCXZsZDEuOAkJe0BYTU1bNl19LCBbJGlucF0hCisJdmVvcgkJQFhNTVs1XSwgQFhNTVs1XSwgQFhNTVsxM10KKyNpZm5kZWYJQlNBRVNfQVNNX0VYVEVOREVEX0tFWQorCWFkZAkJcjQsIHNwLCAjMHg5MAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKyNlbHNlCisJYWRkCQlyNCwgJGtleSwgIzI0OAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKyNlbmRpZgorCXZlb3IJCUBYTU1bNl0sIEBYTU1bNl0sIEBYTU1bMTRdCisJbW92CQlyNSwgJHJvdW5kcwkJCUAgcGFzcyByb3VuZHMKKwltb3YJCXIwLCBzcAorCisJYmwJCV9ic2Flc19kZWNyeXB0OAorCisJdmxkMS42NAkJe0BYTU1bIDhdLUBYTU1bIDldfSwgW3IwLDoxMjhdIQorCXZsZDEuNjQJCXtAWE1NWzEwXS1AWE1NWzExXX0sIFtyMCw6MTI4XSEKKwl2ZW9yCQlAWE1NWzBdLCBAWE1NWzBdLCBAWE1NWyA4XQorCXZsZDEuNjQJCXtAWE1NWzEyXS1AWE1NWzEzXX0sIFtyMCw6MTI4XSEKKwl2ZW9yCQlAWE1NWzFdLCBAWE1NWzFdLCBAWE1NWyA5XQorCXZlb3IJCUBYTU1bOF0sIEBYTU1bNl0sIEBYTU1bMTBdCisJdnN0MS44CQl7QFhNTVswXS1AWE1NWzFdfSwgWyRvdXRdIQorCXZlb3IJCUBYTU1bOV0sIEBYTU1bNF0sIEBYTU1bMTFdCisJdmxkMS42NAkJe0BYTU1bMTRdfSwgW3IwLDoxMjhdIQorCXZlb3IJCUBYTU1bMTBdLCBAWE1NWzJdLCBAWE1NWzEyXQorCXZzdDEuOAkJe0BYTU1bOF0tQFhNTVs5XX0sIFskb3V0XSEKKwl2ZW9yCQlAWE1NWzExXSwgQFhNTVs3XSwgQFhNTVsxM10KKwl2ZW9yCQlAWE1NWzEyXSwgQFhNTVszXSwgQFhNTVsxNF0KKwl2c3QxLjgJCXtAWE1NWzEwXS1AWE1NWzExXX0sIFskb3V0XSEKKwl2c3QxLjgJCXtAWE1NWzEyXX0sIFskb3V0XSEKKworCXZsZDEuNjQJCXtAWE1NWzhdfSwgW3IwLDoxMjhdCQlAIG5leHQgcm91bmQgdHdlYWsKKwliCQkuTHh0c19kZWNfZG9uZQorLmFsaWduCTQKKy5MeHRzX2RlY182OgorCXZzdDEuNjQJCXtAWE1NWzE0XX0sIFtyMCw6MTI4XQkJQCBuZXh0IHJvdW5kIHR3ZWFrCisKKwl2ZW9yCQlAWE1NWzRdLCBAWE1NWzRdLCBAWE1NWzEyXQorI2lmbmRlZglCU0FFU19BU01fRVhURU5ERURfS0VZCisJYWRkCQlyNCwgc3AsICMweDkwCQkJQCBwYXNzIGtleSBzY2hlZHVsZQorI2Vsc2UKKwlhZGQJCXI0LCAka2V5LCAjMjQ4CQkJQCBwYXNzIGtleSBzY2hlZHVsZQorI2VuZGlmCisJdmVvcgkJQFhNTVs1XSwgQFhNTVs1XSwgQFhNTVsxM10KKwltb3YJCXI1LCAkcm91bmRzCQkJQCBwYXNzIHJvdW5kcworCW1vdgkJcjAsIHNwCisKKwlibAkJX2JzYWVzX2RlY3J5cHQ4CisKKwl2bGQxLjY0CQl7QFhNTVsgOF0tQFhNTVsgOV19LCBbcjAsOjEyOF0hCisJdmxkMS42NAkJe0BYTU1bMTBdLUBYTU1bMTFdfSwgW3IwLDoxMjhdIQorCXZlb3IJCUBYTU1bMF0sIEBYTU1bMF0sIEBYTU1bIDhdCisJdmxkMS42NAkJe0BYTU1bMTJdLUBYTU1bMTNdfSwgW3IwLDoxMjhdIQorCXZlb3IJCUBYTU1bMV0sIEBYTU1bMV0sIEBYTU1bIDldCisJdmVvcgkJQFhNTVs4XSwgQFhNTVs2XSwgQFhNTVsxMF0KKwl2c3QxLjgJCXtAWE1NWzBdLUBYTU1bMV19LCBbJG91dF0hCisJdmVvcgkJQFhNTVs5XSwgQFhNTVs0XSwgQFhNTVsxMV0KKwl2ZW9yCQlAWE1NWzEwXSwgQFhNTVsyXSwgQFhNTVsxMl0KKwl2c3QxLjgJCXtAWE1NWzhdLUBYTU1bOV19LCBbJG91dF0hCisJdmVvcgkJQFhNTVsxMV0sIEBYTU1bN10sIEBYTU1bMTNdCisJdnN0MS44CQl7QFhNTVsxMF0tQFhNTVsxMV19LCBbJG91dF0hCisKKwl2bGQxLjY0CQl7QFhNTVs4XX0sIFtyMCw6MTI4XQkJQCBuZXh0IHJvdW5kIHR3ZWFrCisJYgkJLkx4dHNfZGVjX2RvbmUKKy5hbGlnbgk0CisuTHh0c19kZWNfNToKKwl2c3QxLjY0CQl7QFhNTVsxM119LCBbcjAsOjEyOF0JCUAgbmV4dCByb3VuZCB0d2VhaworCisJdmVvcgkJQFhNTVszXSwgQFhNTVszXSwgQFhNTVsxMV0KKyNpZm5kZWYJQlNBRVNfQVNNX0VYVEVOREVEX0tFWQorCWFkZAkJcjQsIHNwLCAjMHg5MAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKyNlbHNlCisJYWRkCQlyNCwgJGtleSwgIzI0OAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKyNlbmRpZgorCXZlb3IJCUBYTU1bNF0sIEBYTU1bNF0sIEBYTU1bMTJdCisJbW92CQlyNSwgJHJvdW5kcwkJCUAgcGFzcyByb3VuZHMKKwltb3YJCXIwLCBzcAorCisJYmwJCV9ic2Flc19kZWNyeXB0OAorCisJdmxkMS42NAkJe0BYTU1bIDhdLUBYTU1bIDldfSwgW3IwLDoxMjhdIQorCXZsZDEuNjQJCXtAWE1NWzEwXS1AWE1NWzExXX0sIFtyMCw6MTI4XSEKKwl2ZW9yCQlAWE1NWzBdLCBAWE1NWzBdLCBAWE1NWyA4XQorCXZsZDEuNjQJCXtAWE1NWzEyXX0sIFtyMCw6MTI4XSEKKwl2ZW9yCQlAWE1NWzFdLCBAWE1NWzFdLCBAWE1NWyA5XQorCXZlb3IJCUBYTU1bOF0sIEBYTU1bNl0sIEBYTU1bMTBdCisJdnN0MS44CQl7QFhNTVswXS1AWE1NWzFdfSwgWyRvdXRdIQorCXZlb3IJCUBYTU1bOV0sIEBYTU1bNF0sIEBYTU1bMTFdCisJdmVvcgkJQFhNTVsxMF0sIEBYTU1bMl0sIEBYTU1bMTJdCisJdnN0MS44CQl7QFhNTVs4XS1AWE1NWzldfSwgWyRvdXRdIQorCXZzdDEuOAkJe0BYTU1bMTBdfSwgWyRvdXRdIQorCisJdmxkMS42NAkJe0BYTU1bOF19LCBbcjAsOjEyOF0JCUAgbmV4dCByb3VuZCB0d2VhaworCWIJCS5MeHRzX2RlY19kb25lCisuYWxpZ24JNAorLkx4dHNfZGVjXzQ6CisJdnN0MS42NAkJe0BYTU1bMTJdfSwgW3IwLDoxMjhdCQlAIG5leHQgcm91bmQgdHdlYWsKKworCXZlb3IJCUBYTU1bMl0sIEBYTU1bMl0sIEBYTU1bMTBdCisjaWZuZGVmCUJTQUVTX0FTTV9FWFRFTkRFRF9LRVkKKwlhZGQJCXI0LCBzcCwgIzB4OTAJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisjZWxzZQorCWFkZAkJcjQsICRrZXksICMyNDgJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisjZW5kaWYKKwl2ZW9yCQlAWE1NWzNdLCBAWE1NWzNdLCBAWE1NWzExXQorCW1vdgkJcjUsICRyb3VuZHMJCQlAIHBhc3Mgcm91bmRzCisJbW92CQlyMCwgc3AKKworCWJsCQlfYnNhZXNfZGVjcnlwdDgKKworCXZsZDEuNjQJCXtAWE1NWyA4XS1AWE1NWyA5XX0sIFtyMCw6MTI4XSEKKwl2bGQxLjY0CQl7QFhNTVsxMF0tQFhNTVsxMV19LCBbcjAsOjEyOF0hCisJdmVvcgkJQFhNTVswXSwgQFhNTVswXSwgQFhNTVsgOF0KKwl2ZW9yCQlAWE1NWzFdLCBAWE1NWzFdLCBAWE1NWyA5XQorCXZlb3IJCUBYTU1bOF0sIEBYTU1bNl0sIEBYTU1bMTBdCisJdnN0MS44CQl7QFhNTVswXS1AWE1NWzFdfSwgWyRvdXRdIQorCXZlb3IJCUBYTU1bOV0sIEBYTU1bNF0sIEBYTU1bMTFdCisJdnN0MS44CQl7QFhNTVs4XS1AWE1NWzldfSwgWyRvdXRdIQorCisJdmxkMS42NAkJe0BYTU1bOF19LCBbcjAsOjEyOF0JCUAgbmV4dCByb3VuZCB0d2VhaworCWIJCS5MeHRzX2RlY19kb25lCisuYWxpZ24JNAorLkx4dHNfZGVjXzM6CisJdnN0MS42NAkJe0BYTU1bMTFdfSwgW3IwLDoxMjhdCQlAIG5leHQgcm91bmQgdHdlYWsKKworCXZlb3IJCUBYTU1bMV0sIEBYTU1bMV0sIEBYTU1bOV0KKyNpZm5kZWYJQlNBRVNfQVNNX0VYVEVOREVEX0tFWQorCWFkZAkJcjQsIHNwLCAjMHg5MAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKyNlbHNlCisJYWRkCQlyNCwgJGtleSwgIzI0OAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKyNlbmRpZgorCXZlb3IJCUBYTU1bMl0sIEBYTU1bMl0sIEBYTU1bMTBdCisJbW92CQlyNSwgJHJvdW5kcwkJCUAgcGFzcyByb3VuZHMKKwltb3YJCXIwLCBzcAorCisJYmwJCV9ic2Flc19kZWNyeXB0OAorCisJdmxkMS42NAkJe0BYTU1bOF0tQFhNTVs5XX0sIFtyMCw6MTI4XSEKKwl2bGQxLjY0CQl7QFhNTVsxMF19LCBbcjAsOjEyOF0hCisJdmVvcgkJQFhNTVswXSwgQFhNTVswXSwgQFhNTVsgOF0KKwl2ZW9yCQlAWE1NWzFdLCBAWE1NWzFdLCBAWE1NWyA5XQorCXZlb3IJCUBYTU1bOF0sIEBYTU1bNl0sIEBYTU1bMTBdCisJdnN0MS44CQl7QFhNTVswXS1AWE1NWzFdfSwgWyRvdXRdIQorCXZzdDEuOAkJe0BYTU1bOF19LCBbJG91dF0hCisKKwl2bGQxLjY0CQl7QFhNTVs4XX0sIFtyMCw6MTI4XQkJQCBuZXh0IHJvdW5kIHR3ZWFrCisJYgkJLkx4dHNfZGVjX2RvbmUKKy5hbGlnbgk0CisuTHh0c19kZWNfMjoKKwl2c3QxLjY0CQl7QFhNTVsxMF19LCBbcjAsOjEyOF0JCUAgbmV4dCByb3VuZCB0d2VhaworCisJdmVvcgkJQFhNTVswXSwgQFhNTVswXSwgQFhNTVs4XQorI2lmbmRlZglCU0FFU19BU01fRVhURU5ERURfS0VZCisJYWRkCQlyNCwgc3AsICMweDkwCQkJQCBwYXNzIGtleSBzY2hlZHVsZQorI2Vsc2UKKwlhZGQJCXI0LCAka2V5LCAjMjQ4CQkJQCBwYXNzIGtleSBzY2hlZHVsZQorI2VuZGlmCisJdmVvcgkJQFhNTVsxXSwgQFhNTVsxXSwgQFhNTVs5XQorCW1vdgkJcjUsICRyb3VuZHMJCQlAIHBhc3Mgcm91bmRzCisJbW92CQlyMCwgc3AKKworCWJsCQlfYnNhZXNfZGVjcnlwdDgKKworCXZsZDEuNjQJCXtAWE1NWzhdLUBYTU1bOV19LCBbcjAsOjEyOF0hCisJdmVvcgkJQFhNTVswXSwgQFhNTVswXSwgQFhNTVsgOF0KKwl2ZW9yCQlAWE1NWzFdLCBAWE1NWzFdLCBAWE1NWyA5XQorCXZzdDEuOAkJe0BYTU1bMF0tQFhNTVsxXX0sIFskb3V0XSEKKworCXZsZDEuNjQJCXtAWE1NWzhdfSwgW3IwLDoxMjhdCQlAIG5leHQgcm91bmQgdHdlYWsKKwliCQkuTHh0c19kZWNfZG9uZQorLmFsaWduCTQKKy5MeHRzX2RlY18xOgorCW1vdgkJcjAsIHNwCisJdmVvcgkJQFhNTVswXSwgQFhNTVs4XQorCW1vdgkJcjEsIHNwCisJdnN0MS44CQl7QFhNTVswXX0sIFtzcCw6MTI4XQorCW1vdgkJcjIsICRrZXkKKwltb3YJCXI0LCAkZnAJCQkJQCBwcmVzZXJ2ZSBmcAorCW1vdgkJcjUsICRtYWdpYwkJCUAgcHJlc2VydmUgbWFnaWMKKworCWJsCQlBRVNfZGVjcnlwdAorCisJdmxkMS44CQl7QFhNTVswXX0sIFtzcCw6MTI4XQorCXZlb3IJCUBYTU1bMF0sIEBYTU1bMF0sIEBYTU1bOF0KKwl2c3QxLjgJCXtAWE1NWzBdfSwgWyRvdXRdIQorCW1vdgkJJGZwLCByNAorCW1vdgkJJG1hZ2ljLCByNQorCisJdm1vdgkJQFhNTVs4XSwgQFhNTVs5XQkJQCBuZXh0IHJvdW5kIHR3ZWFrCisKKy5MeHRzX2RlY19kb25lOgorI2lmbmRlZglYVFNfQ0hBSU5fVFdFQUsKKwlhZGRzCQkkbGVuLCAjMHgxMAorCWJlcQkJLkx4dHNfZGVjX3JldAorCisJQCBjYWxjdWxhdGUgb25lIHJvdW5kIG9mIGV4dHJhIHR3ZWFrIGZvciB0aGUgc3RvbGVuIGNpcGhlcnRleHQKKwl2bGRtaWEJCSRtYWdpYywgeyR0d21hc2t9CisJdnNoci5zNjQJQFhNTVs2XSwgQFhNTVs4XSwgIzYzCisJdmFuZAkJQFhNTVs2XSwgQFhNTVs2XSwgJHR3bWFzaworCXZhZGQudTY0CUBYTU1bOV0sIEBYTU1bOF0sIEBYTU1bOF0KKwl2c3dwCQlgJkRoaSgiQFhNTVs2XSIpYCxgJkRsbygiQFhNTVs2XSIpYAorCXZlb3IJCUBYTU1bOV0sIEBYTU1bOV0sIEBYTU1bNl0KKworCUAgcGVyZm9ybSB0aGUgZmluYWwgZGVjcnlwdGlvbiB3aXRoIHRoZSBsYXN0IHR3ZWFrIHZhbHVlCisJdmxkMS44CQl7QFhNTVswXX0sIFskaW5wXSEKKwltb3YJCXIwLCBzcAorCXZlb3IJCUBYTU1bMF0sIEBYTU1bMF0sIEBYTU1bOV0KKwltb3YJCXIxLCBzcAorCXZzdDEuOAkJe0BYTU1bMF19LCBbc3AsOjEyOF0KKwltb3YJCXIyLCAka2V5CisJbW92CQlyNCwgJGZwCQkJQCBwcmVzZXJ2ZSBmcAorCisJYmwJCUFFU19kZWNyeXB0CisKKwl2bGQxLjgJCXtAWE1NWzBdfSwgW3NwLDoxMjhdCisJdmVvcgkJQFhNTVswXSwgQFhNTVswXSwgQFhNTVs5XQorCXZzdDEuOAkJe0BYTU1bMF19LCBbJG91dF0KKworCW1vdgkJcjYsICRvdXQKKy5MeHRzX2RlY19zdGVhbDoKKwlsZHJiCQlyMSwgWyRvdXRdCisJbGRyYgkJcjAsIFskaW5wXSwgIzEKKwlzdHJiCQlyMSwgWyRvdXQsICMweDEwXQorCXN0cmIJCXIwLCBbJG91dF0sICMxCisKKwlzdWJzCQkkbGVuLCAjMQorCWJoaQkJLkx4dHNfZGVjX3N0ZWFsCisKKwl2bGQxLjgJCXtAWE1NWzBdfSwgW3I2XQorCW1vdgkJcjAsIHNwCisJdmVvcgkJQFhNTVswXSwgQFhNTVs4XQorCW1vdgkJcjEsIHNwCisJdnN0MS44CQl7QFhNTVswXX0sIFtzcCw6MTI4XQorCW1vdgkJcjIsICRrZXkKKworCWJsCQlBRVNfZGVjcnlwdAorCisJdmxkMS44CQl7QFhNTVswXX0sIFtzcCw6MTI4XQorCXZlb3IJCUBYTU1bMF0sIEBYTU1bMF0sIEBYTU1bOF0KKwl2c3QxLjgJCXtAWE1NWzBdfSwgW3I2XQorCW1vdgkJJGZwLCByNAorI2VuZGlmCisKKy5MeHRzX2RlY19yZXQ6CisJYmljCQlyMCwgJGZwLCAjMHhmCisJdm1vdi5pMzIJcTAsICMwCisJdm1vdi5pMzIJcTEsICMwCisjaWZkZWYJWFRTX0NIQUlOX1RXRUFLCisJbGRyCQlyMSwgWyRmcCwgIzB4MjArVkZQX0FCSV9GUkFNRV0JQCBjaGFpbiB0d2VhaworI2VuZGlmCisuTHh0c19kZWNfYnplcm86CQkJCUAgd2lwZSBrZXkgc2NoZWR1bGUgW2lmIGFueV0KKwl2c3RtaWEJCXNwISwge3EwLXExfQorCWNtcAkJc3AsIHIwCisJYm5lCQkuTHh0c19kZWNfYnplcm8KKworCW1vdgkJc3AsICRmcAorI2lmZGVmCVhUU19DSEFJTl9UV0VBSworCXZzdDEuOAkJe0BYTU1bOF19LCBbcjFdCisjZW5kaWYKKwlWRlBfQUJJX1BPUAorCWxkbWlhCQlzcCEsIHtyNC1yMTAsIHBjfQlAIHJldHVybgorCisuc2l6ZQlic2Flc194dHNfZGVjcnlwdCwuLWJzYWVzX3h0c19kZWNyeXB0CitfX18KK30KKyRjb2RlLj08PF9fXzsKKyNlbmRpZgorI2VuZGlmCitfX18KKworJGNvZGUgPX4gcy9cYChbXlxgXSopXGAvZXZhbCgkMSkvZ2VtOworCitvcGVuIFNFTEYsJDA7Cit3aGlsZSg8U0VMRj4pIHsKKwluZXh0IGlmICgvXiMhLyk7CisgICAgICAgIGxhc3QgaWYgKCFzL14jL0AvIGFuZCAhL14kLyk7CisgICAgICAgIHByaW50OworfQorY2xvc2UgU0VMRjsKKworcHJpbnQgJGNvZGU7CisKK2Nsb3NlIFNURE9VVDsKZGlmZiAtLWdpdCBhL2NyeXB0by9hZXMvYXNtL2JzYWVzLXg4Nl82NC5wbCBiL2NyeXB0by9hZXMvYXNtL2JzYWVzLXg4Nl82NC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWI5MGYwCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2Flcy9hc20vYnNhZXMteDg2XzY0LnBsCkBAIC0wLDAgKzEsMzEwOCBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMgQUVTLTEyOCBbb3JpZ2luYWxseSBpbiBDVFIgbW9kZV0JCQkJIyMjCisjIyMgYml0c2xpY2VkIGltcGxlbWVudGF0aW9uIGZvciBJbnRlbCBDb3JlIDIgcHJvY2Vzc29ycwkjIyMKKyMjIyByZXF1aXJlcyBzdXBwb3J0IG9mIFNTRSBleHRlbnNpb25zIHVwIHRvIFNTU0UzCQkjIyMKKyMjIyBBdXRob3I6IEVtaWxpYSBLw6RzcGVyIGFuZCBQZXRlciBTY2h3YWJlCQkJIyMjCisjIyMgRGF0ZTogMjAwOS0wMy0xOQkJCQkJCSMjIworIyMjIFB1YmxpYyBkb21haW4JCQkJCQkjIyMKKyMjIwkJCQkJCQkJIyMjCisjIyMgU2VlIGh0dHA6Ly9ob21lcy5lc2F0Lmt1bGV1dmVuLmJlL35la2FzcGVyLyNzb2Z0d2FyZSBmb3IJIyMjCisjIyMgZnVydGhlciBpbmZvcm1hdGlvbi4JCQkJCSMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBTZXB0ZW1iZXIgMjAxMS4KKyMKKyMgU3RhcnRlZCBhcyB0cmFuc2xpdGVyYXRpb24gdG8gInBlcmxhc20iIHRoZSBvcmlnaW5hbCBjb2RlIGhhcworIyB1bmRlcmdvbmUgZm9sbG93aW5nIGNoYW5nZXM6CisjCisjIC0gY29kZSB3YXMgbWFkZSBwb3NpdGlvbi1pbmRlcGVuZGVudDsKKyMgLSByb3VuZHMgd2VyZSBmb2xkZWQgaW50byBhIGxvb3AgcmVzdWx0aW5nIGluID41eCBzaXplIHJlZHVjdGlvbgorIyAgIGZyb20gMTIuNUtCIHRvIDIuMktCOworIyAtIGFib3ZlIHdhcyBwb3NzaWJpbGUgdGhhbmtzIHRvIG1peGNvbHVtbnMoKSBtb2RpZmljYXRpb24gdGhhdAorIyAgIGFsbG93ZWQgdG8gZmVlZCBpdHMgb3V0cHV0IGJhY2sgdG8gYWVzZW5jW2xhc3RdLCB0aGlzIHdhcworIyAgIGFjaGlldmVkIGF0IGNvc3Qgb2YgdHdvIGFkZGl0aW9uYWwgaW50ZXItcmVnaXN0ZXJzIG1vdmVzOworIyAtIHNvbWUgaW5zdHJ1Y3Rpb24gcmVvcmRlcmluZyBhbmQgaW50ZXJsZWF2aW5nOworIyAtIHRoaXMgbW9kdWxlIGRvZXNuJ3QgaW1wbGVtZW50IGtleSBzZXR1cCBzdWJyb3V0aW5lLCBpbnN0ZWFkIGl0CisjICAgcmVsaWVzIG9uIGNvbnZlcnNpb24gb2YgImNvbnZlbnRpb25hbCIga2V5IHNjaGVkdWxlIGFzIHJldHVybmVkCisjICAgYnkgQUVTX3NldF9lbmNyeXB0X2tleSAoc2VlIGRpc2N1c3Npb24gYmVsb3cpOworIyAtIGZpcnN0IGFuZCBsYXN0IHJvdW5kIGtleXMgYXJlIHRyZWF0ZWQgZGlmZmVyZW50bHksIHdoaWNoIGFsbG93ZWQKKyMgICB0byBza2lwIG9uZSBzaGlmdHJvd3MoKSwgcmVkdWNlIGJpdC1zbGljZWQga2V5IHNjaGVkdWxlIGFuZAorIyAgIHNwZWVkLXVwIGNvbnZlcnNpb24gYnkgMjIlOworIyAtIHN1cHBvcnQgZm9yIDE5Mi0gYW5kIDI1Ni1iaXQga2V5cyB3YXMgYWRkZWQ7CisjCisjIFJlc3VsdGluZyBwZXJmb3JtYW5jZSBpbiBDUFUgY3ljbGVzIHNwZW50IHRvIGVuY3J5cHQgb25lIGJ5dGUgb3V0CisjIG9mIDQwOTYtYnl0ZSBidWZmZXIgd2l0aCAxMjgtYml0IGtleSBpczoKKyMKKyMJCUVtaWxpYSdzCXRoaXMoKikJCWRpZmZlcmVuY2UKKyMKKyMgQ29yZSAyICAgIAk5LjMwCQk4LjY5CQkrNyUKKyMgTmVoYWxlbSgqKikgCTcuNjMJCTYuOTgJCSs5JQorIyBBdG9tCSAgICAJMTcuMQkJMTcuNAkJLTIlKCoqKikKKyMKKyMgKCopCUNvbXBhcmlzb24gaXMgbm90IGNvbXBsZXRlbHkgZmFpciwgYmVjYXVzZSAidGhpcyIgaXMgRUNCLAorIwlpLmUuIG5vIGV4dHJhIHByb2Nlc3Npbmcgc3VjaCBhcyBjb3VudGVyIHZhbHVlcyBjYWxjdWxhdGlvbgorIwlhbmQgeG9yLWluZyBpbnB1dCBhcyBpbiBFbWlsaWEncyBDVFIgaW1wbGVtZW50YXRpb24gaXMKKyMJcGVyZm9ybWVkLiBIb3dldmVyLCB0aGUgQ1RSIGNhbGN1bGF0aW9ucyBzdGFuZCBmb3Igbm90IG1vcmUKKyMJdGhhbiAxJSBvZiB0b3RhbCB0aW1lLCBzbyBjb21wYXJpc29uIGlzICpyYXRoZXIqIGZhaXIuCisjCisjICgqKikJUmVzdWx0cyB3ZXJlIGNvbGxlY3RlZCBvbiBXZXN0bWVyZSwgd2hpY2ggaXMgY29uc2lkZXJlZCB0bworIwliZSBlcXVpdmFsZW50IHRvIE5laGFsZW0gZm9yIHRoaXMgY29kZS4KKyMKKyMgKCoqKikJU2xvd2Rvd24gb24gQXRvbSBpcyByYXRoZXIgc3RyYW5nZSBwZXIgc2UsIGJlY2F1c2Ugb3JpZ2luYWwKKyMJaW1wbGVtZW50YXRpb24gaGFzIGEgbnVtYmVyIG9mIDkrLWJ5dGVzIGluc3RydWN0aW9ucywgd2hpY2gKKyMJYXJlIGJhZCBmb3IgQXRvbSBmcm9udC1lbmQsIGFuZCB3aGljaCBJIGVsaW1pbmF0ZWQgY29tcGxldGVseS4KKyMJSW4gYXR0ZW1wdCB0byBhZGRyZXNzIGRldGVyaW9yYXRpb24gc2JveCgpIHdhcyB0ZXN0ZWQgaW4gRlAKKyMJU0lNRCAiZG9tYWluIiAobW92YXBzIGluc3RlYWQgb2YgbW92ZHFhLCB4b3JwcyBpbnN0ZWFkIG9mCisjCXB4b3IsIGV0Yy4pLiBXaGlsZSBpdCByZXN1bHRlZCBpbiBub21pbmFsIDQlIGltcHJvdmVtZW50IG9uCisjCUF0b20sIGl0IGh1cnRlZCBXZXN0bWVyZSBieSBtb3JlIHRoYW4gMnggZmFjdG9yLgorIworIyBBcyBmb3Iga2V5IHNjaGVkdWxlIGNvbnZlcnNpb24gc3Vicm91dGluZS4gSW50ZXJmYWNlIHRvIE9wZW5TU0wKKyMgcmVsaWVzIG9uIHBlci1pbnZvY2F0aW9uIG9uLXRoZS1mbHkgY29udmVyc2lvbi4gVGhpcyBuYXR1cmFsbHkKKyMgaGFzIGltcGFjdCBvbiBwZXJmb3JtYW5jZSwgZXNwZWNpYWxseSBmb3Igc2hvcnQgaW5wdXRzLiBDb252ZXJzaW9uCisjIHRpbWUgaW4gQ1BVIGN5Y2xlcyBhbmQgaXRzIHJhdGlvIHRvIENQVSBjeWNsZXMgc3BlbnQgaW4gOHggYmxvY2sKKyMgZnVuY3Rpb24gaXM6CisjCisjIAkJY29udmVyc2lvbgljb252ZXJzaW9uLzh4IGJsb2NrCisjIENvcmUgMgkyNDAJCTAuMjIKKyMgTmVoYWxlbQkxODAJCTAuMjAKKyMgQXRvbQkJNDMwCQkwLjE5CisjCisjIFRoZSByYXRpbyB2YWx1ZXMgbWVhbiB0aGF0IDEyOC1ieXRlIGJsb2NrcyB3aWxsIGJlIHByb2Nlc3NlZAorIyAxNi0xOCUgc2xvd2VyLCAyNTYtYnl0ZSBibG9ja3MgLSA5LTEwJSwgMzg0LWJ5dGUgYmxvY2tzIC0gNi03JSwKKyMgZXRjLiBUaGVuIGtlZXAgaW4gbWluZCB0aGF0IGlucHV0IHNpemVzIG5vdCBkaXZpc2libGUgYnkgMTI4IGFyZQorIyAqZWZmZWN0aXZlbHkqIHNsb3dlciwgZXNwZWNpYWxseSBzaG9ydGVzdCBvbmVzLCBlLmcuIGNvbnNlY3V0aXZlCisjIDE0NC1ieXRlIGJsb2NrcyBhcmUgcHJvY2Vzc2VkIDQ0JSBzbG93ZXIgdGhhbiBvbmUgd291bGQgZXhwZWN0LAorIyAyNzIgLSAyOSUsIDQwMCAtIDIyJSwgZXRjLiBZZXQsIGRlc3BpdGUgYWxsIHRoZXNlICJzaG9ydGNvbWluZ3MiCisjIGl0J3Mgc3RpbGwgZmFzdGVyIHRoYW4gWyJoeXBlci10aHJlYWRpbmctc2FmZSIgY29kZSBwYXRoIGluXQorIyBhZXMteDg2XzY0LnBsIG9uIGFsbCBsZW5ndGhzIGFib3ZlIDY0IGJ5dGVzLi4uCisjCisjIE9jdG9iZXIgMjAxMS4KKyMKKyMgQWRkIGRlY3J5cHRpb24gcHJvY2VkdXJlLiBQZXJmb3JtYW5jZSBpbiBDUFUgY3ljbGVzIHNwZW50IHRvIGRlY3J5cHQKKyMgb25lIGJ5dGUgb3V0IG9mIDQwOTYtYnl0ZSBidWZmZXIgd2l0aCAxMjgtYml0IGtleSBpczoKKyMKKyMgQ29yZSAyCTkuODMKKyMgTmVoYWxlbQk3Ljc0CisjIEF0b20JCTE5LjAKKyMKKyMgTm92ZW1iZXIgMjAxMS4KKyMKKyMgQWRkIGJzYWVzX3h0c19bZW58ZGVdY3J5cHQuIExlc3MtdGhhbi04MC1ieXRlcy1ibG9jayBwZXJmb3JtYW5jZSBpcworIyBzdWJvcHRpbWFsLCBidXQgWFRTIGlzIG1lYW50IHRvIGJlIHVzZWQgd2l0aCBsYXJnZXIgYmxvY2tzLi4uCisjCisjCQkJCQkJPGFwcHJvQG9wZW5zc2wub3JnPgorCiskZmxhdm91ciA9IHNoaWZ0OworJG91dHB1dCAgPSBzaGlmdDsKK2lmICgkZmxhdm91ciA9fiAvXC4vKSB7ICRvdXRwdXQgPSAkZmxhdm91cjsgdW5kZWYgJGZsYXZvdXI7IH0KKworJHdpbjY0PTA7ICR3aW42ND0xIGlmICgkZmxhdm91ciA9fiAvW25tXWFzbXxtaW5ndzY0LyB8fCAkb3V0cHV0ID1+IC9cLmFzbSQvKTsKKworJDAgPX4gbS8oLipbXC9cXF0pW15cL1xcXSskLzsgJGRpcj0kMTsKKyggJHhsYXRlPSIke2Rpcn14ODZfNjQteGxhdGUucGwiIGFuZCAtZiAkeGxhdGUgKSBvcgorKCAkeGxhdGU9IiR7ZGlyfS4uLy4uL3Blcmxhc20veDg2XzY0LXhsYXRlLnBsIiBhbmQgLWYgJHhsYXRlKSBvcgorZGllICJjYW4ndCBsb2NhdGUgeDg2XzY0LXhsYXRlLnBsIjsKKworb3BlbiBPVVQsInwgXCIkXlhcIiAkeGxhdGUgJGZsYXZvdXIgJG91dHB1dCI7CisqU1RET1VUPSpPVVQ7CisKK215ICgkaW5wLCRvdXQsJGxlbiwka2V5LCRpdnApPSgiJXJkaSIsIiVyc2kiLCIlcmR4IiwiJXJjeCIpOworbXkgQFhNTT1tYXAoIiV4bW0kXyIsKDE1LDAuLjE0KSk7CSMgYmVzdCBvbiBBdG9tLCArMTAlIG92ZXIgKDAuLjE1KQorbXkgJGVjYj0wOwkjIHN1cHByZXNzIHVucmVmZXJlbmNlZCBFQ0Igc3Vicm91dGluZXMsIHNwYXJlIHNvbWUgc3BhY2UuLi4KKworeworbXkgKCRrZXksJHJvdW5kcywkY29uc3QpPSgiJXJheCIsIiVyMTBkIiwiJXIxMSIpOworCitzdWIgU2JveCB7CisjIGlucHV0IGluICBsc2IgPiBbYjAsIGIxLCBiMiwgYjMsIGI0LCBiNSwgYjYsIGI3XSA8IG1zYgorIyBvdXRwdXQgaW4gbHNiID4gW2IwLCBiMSwgYjQsIGI2LCBiMywgYjcsIGIyLCBiNV0gPCBtc2IKK215IEBiPUBfWzAuLjddOworbXkgQHQ9QF9bOC4uMTFdOworbXkgQHM9QF9bMTIuLjE1XTsKKwkmSW5CYXNpc0NoYW5nZQkoQGIpOworCSZJbnZfR0YyNTYJKEBiWzYsNSwwLDMsNywxLDQsMl0sQHQsQHMpOworCSZPdXRCYXNpc0NoYW5nZQkoQGJbNywxLDQsMiw2LDUsMCwzXSk7Cit9CisKK3N1YiBJbkJhc2lzQ2hhbmdlIHsKKyMgaW5wdXQgaW4gIGxzYiA+IFtiMCwgYjEsIGIyLCBiMywgYjQsIGI1LCBiNiwgYjddIDwgbXNiCisjIG91dHB1dCBpbiBsc2IgPiBbYjYsIGI1LCBiMCwgYjMsIGI3LCBiMSwgYjQsIGIyXSA8IG1zYiAKK215IEBiPUBfWzAuLjddOworJGNvZGUuPTw8X19fOworCXB4b3IJQGJbNl0sIEBiWzVdCisJcHhvcglAYlsxXSwgQGJbMl0KKwlweG9yCUBiWzBdLCBAYlszXQorCXB4b3IJQGJbMl0sIEBiWzZdCisJcHhvciAJQGJbMF0sIEBiWzVdCisKKwlweG9yCUBiWzNdLCBAYls2XQorCXB4b3IJQGJbN10sIEBiWzNdCisJcHhvcglAYls1XSwgQGJbN10KKwlweG9yCUBiWzRdLCBAYlszXQorCXB4b3IJQGJbNV0sIEBiWzRdCisJcHhvcglAYlsxXSwgQGJbM10KKworCXB4b3IJQGJbN10sIEBiWzJdCisJcHhvcglAYls1XSwgQGJbMV0KK19fXworfQorCitzdWIgT3V0QmFzaXNDaGFuZ2UgeworIyBpbnB1dCBpbiAgbHNiID4gW2IwLCBiMSwgYjIsIGIzLCBiNCwgYjUsIGI2LCBiN10gPCBtc2IKKyMgb3V0cHV0IGluIGxzYiA+IFtiNiwgYjEsIGIyLCBiNCwgYjcsIGIwLCBiMywgYjVdIDwgbXNiCitteSBAYj1AX1swLi43XTsKKyRjb2RlLj08PF9fXzsKKwlweG9yCUBiWzZdLCBAYlswXQorCXB4b3IJQGJbNF0sIEBiWzFdCisJcHhvcglAYlswXSwgQGJbMl0KKwlweG9yCUBiWzZdLCBAYls0XQorCXB4b3IJQGJbMV0sIEBiWzZdCisKKwlweG9yCUBiWzVdLCBAYlsxXQorCXB4b3IJQGJbM10sIEBiWzVdCisJcHhvcglAYls3XSwgQGJbM10KKwlweG9yCUBiWzVdLCBAYls3XQorCXB4b3IJQGJbNV0sIEBiWzJdCisKKwlweG9yCUBiWzddLCBAYls0XQorX19fCit9CisKK3N1YiBJbnZTYm94IHsKKyMgaW5wdXQgaW4gbHNiIAk+IFtiMCwgYjEsIGIyLCBiMywgYjQsIGI1LCBiNiwgYjddIDwgbXNiCisjIG91dHB1dCBpbiBsc2IJPiBbYjAsIGIxLCBiNiwgYjQsIGIyLCBiNywgYjMsIGI1XSA8IG1zYgorbXkgQGI9QF9bMC4uN107CitteSBAdD1AX1s4Li4xMV07CitteSBAcz1AX1sxMi4uMTVdOworCSZJbnZJbkJhc2lzQ2hhbmdlCShAYik7CisJJkludl9HRjI1NgkJKEBiWzUsMSwyLDYsMyw3LDAsNF0sQHQsQHMpOworCSZJbnZPdXRCYXNpc0NoYW5nZQkoQGJbMyw3LDAsNCw1LDEsMiw2XSk7Cit9CisKK3N1YiBJbnZJbkJhc2lzQ2hhbmdlIHsJCSMgT3V0QmFzaXNDaGFuZ2UgaW4gcmV2ZXJzZQorbXkgQGI9QF9bNSwxLDIsNiwzLDcsMCw0XTsKKyRjb2RlLj08PF9fXworCXB4b3IJQGJbN10sIEBiWzRdCisKKwlweG9yCUBiWzVdLCBAYls3XQorCXB4b3IJQGJbNV0sIEBiWzJdCisJcHhvcglAYls3XSwgQGJbM10KKwlweG9yCUBiWzNdLCBAYls1XQorCXB4b3IJQGJbNV0sIEBiWzFdCisKKwlweG9yCUBiWzFdLCBAYls2XQorCXB4b3IJQGJbMF0sIEBiWzJdCisJcHhvcglAYls2XSwgQGJbNF0KKwlweG9yCUBiWzZdLCBAYlswXQorCXB4b3IJQGJbNF0sIEBiWzFdCitfX18KK30KKworc3ViIEludk91dEJhc2lzQ2hhbmdlIHsJCSMgSW5CYXNpc0NoYW5nZSBpbiByZXZlcnNlCitteSBAYj1AX1syLDUsNywzLDYsMSwwLDRdOworJGNvZGUuPTw8X19fOworCXB4b3IJQGJbNV0sIEBiWzFdCisJcHhvcglAYls3XSwgQGJbMl0KKworCXB4b3IJQGJbMV0sIEBiWzNdCisJcHhvcglAYls1XSwgQGJbNF0KKwlweG9yCUBiWzVdLCBAYls3XQorCXB4b3IJQGJbNF0sIEBiWzNdCisJIHB4b3IgCUBiWzBdLCBAYls1XQorCXB4b3IJQGJbN10sIEBiWzNdCisJIHB4b3IJQGJbMl0sIEBiWzZdCisJIHB4b3IJQGJbMV0sIEBiWzJdCisJcHhvcglAYlszXSwgQGJbNl0KKworCXB4b3IJQGJbMF0sIEBiWzNdCisJcHhvcglAYls2XSwgQGJbNV0KK19fXworfQorCitzdWIgTXVsX0dGNCB7CisjOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyM7KiBNdWxfR0Y0OiBJbnB1dCB4MC14MSx5MC15MSBPdXRwdXQgeDAteDEgVGVtcCB0MCAoOCkgKgorIzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitteSAoJHgwLCR4MSwkeTAsJHkxLCR0MCk9QF87CiskY29kZS49PDxfX187CisJbW92ZHFhCSR5MCwgJHQwCisJcHhvciAJJHkxLCAkdDAKKwlwYW5kCSR4MCwgJHQwCisJcHhvcgkkeDEsICR4MAorCXBhbmQJJHkwLCAkeDEKKwlwYW5kCSR5MSwgJHgwCisJcHhvcgkkeDEsICR4MAorCXB4b3IJJHQwLCAkeDEKK19fXworfQorCitzdWIgTXVsX0dGNF9OIHsJCQkJIyBub3QgdXNlZCwgc2VlIG5leHQgc3Vicm91dGluZQorIyBtdWx0aXBseSBhbmQgc2NhbGUgYnkgTgorbXkgKCR4MCwkeDEsJHkwLCR5MSwkdDApPUBfOworJGNvZGUuPTw8X19fOworCW1vdmRxYQkkeTAsICR0MAorCXB4b3IJJHkxLCAkdDAKKwlwYW5kCSR4MCwgJHQwCisJcHhvcgkkeDEsICR4MAorCXBhbmQJJHkwLCAkeDEKKwlwYW5kCSR5MSwgJHgwCisJcHhvcgkkeDAsICR4MQorCXB4b3IJJHQwLCAkeDAKK19fXworfQorCitzdWIgTXVsX0dGNF9OX0dGNCB7CisjIGludGVybGVhdmVkIE11bF9HRjRfTiBhbmQgTXVsX0dGNAorbXkgKCR4MCwkeDEsJHkwLCR5MSwkdDAsCisgICAgJHgyLCR4MywkeTIsJHkzLCR0MSk9QF87CiskY29kZS49PDxfX187CisJbW92ZHFhCSR5MCwgJHQwCisJIG1vdmRxYQkkeTIsICR0MQorCXB4b3IJJHkxLCAkdDAKKwkgcHhvciAJJHkzLCAkdDEKKwlwYW5kCSR4MCwgJHQwCisJIHBhbmQJJHgyLCAkdDEKKwlweG9yCSR4MSwgJHgwCisJIHB4b3IJJHgzLCAkeDIKKwlwYW5kCSR5MCwgJHgxCisJIHBhbmQJJHkyLCAkeDMKKwlwYW5kCSR5MSwgJHgwCisJIHBhbmQJJHkzLCAkeDIKKwlweG9yCSR4MCwgJHgxCisJIHB4b3IJJHgzLCAkeDIKKwlweG9yCSR0MCwgJHgwCisJIHB4b3IJJHQxLCAkeDMKK19fXworfQorc3ViIE11bF9HRjE2XzIgeworbXkgQHg9QF9bMC4uN107CitteSBAeT1AX1s4Li4xMV07CitteSBAdD1AX1sxMi4uMTVdOworJGNvZGUuPTw8X19fOworCW1vdmRxYQlAeFswXSwgQHRbMF0KKwltb3ZkcWEJQHhbMV0sIEB0WzFdCitfX18KKwkmTXVsX0dGNCAgCShAeFswXSwgQHhbMV0sIEB5WzBdLCBAeVsxXSwgQHRbMl0pOworJGNvZGUuPTw8X19fOworCXB4b3IJQHhbMl0sIEB0WzBdCisJcHhvcglAeFszXSwgQHRbMV0KKwlweG9yCUB5WzJdLCBAeVswXQorCXB4b3IJQHlbM10sIEB5WzFdCitfX18KKwlNdWxfR0Y0X05fR0Y0CShAdFswXSwgQHRbMV0sIEB5WzBdLCBAeVsxXSwgQHRbM10sCisJCQkgQHhbMl0sIEB4WzNdLCBAeVsyXSwgQHlbM10sIEB0WzJdKTsKKyRjb2RlLj08PF9fXzsKKwlweG9yCUB0WzBdLCBAeFswXQorCXB4b3IJQHRbMF0sIEB4WzJdCisJcHhvcglAdFsxXSwgQHhbMV0KKwlweG9yCUB0WzFdLCBAeFszXQorCisJbW92ZHFhCUB4WzRdLCBAdFswXQorCW1vdmRxYQlAeFs1XSwgQHRbMV0KKwlweG9yCUB4WzZdLCBAdFswXQorCXB4b3IJQHhbN10sIEB0WzFdCitfX18KKwkmTXVsX0dGNF9OX0dGNAkoQHRbMF0sIEB0WzFdLCBAeVswXSwgQHlbMV0sIEB0WzNdLAorCQkJIEB4WzZdLCBAeFs3XSwgQHlbMl0sIEB5WzNdLCBAdFsyXSk7CiskY29kZS49PDxfX187CisJcHhvcglAeVsyXSwgQHlbMF0KKwlweG9yCUB5WzNdLCBAeVsxXQorX19fCisJJk11bF9HRjQgIAkoQHhbNF0sIEB4WzVdLCBAeVswXSwgQHlbMV0sIEB0WzNdKTsKKyRjb2RlLj08PF9fXzsKKwlweG9yCUB0WzBdLCBAeFs0XQorCXB4b3IJQHRbMF0sIEB4WzZdCisJcHhvcglAdFsxXSwgQHhbNV0KKwlweG9yCUB0WzFdLCBAeFs3XQorX19fCit9CitzdWIgSW52X0dGMjU2IHsKKyM7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyM7KiBJbnZfR0YyNTY6IElucHV0IHgwLXg3IE91dHB1dCB4MC14NyBUZW1wIHQwLXQzLHMwLXMzICgxNDQpICAgICAgICoKKyM7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK215IEB4PUBfWzAuLjddOworbXkgQHQ9QF9bOC4uMTFdOworbXkgQHM9QF9bMTIuLjE1XTsKKyMgZGlyZWN0IG9wdGltaXphdGlvbnMgZnJvbSBoYXJkd2FyZQorJGNvZGUuPTw8X19fOworCW1vdmRxYQlAeFs0XSwgQHRbM10KKwltb3ZkcWEJQHhbNV0sIEB0WzJdCisJbW92ZHFhCUB4WzFdLCBAdFsxXQorCW1vdmRxYQlAeFs3XSwgQHNbMV0KKwltb3ZkcWEJQHhbMF0sIEBzWzBdCisKKwlweG9yCUB4WzZdLCBAdFszXQorCXB4b3IJQHhbN10sIEB0WzJdCisJcHhvcglAeFszXSwgQHRbMV0KKwkgbW92ZHFhCUB0WzNdLCBAc1syXQorCXB4b3IJQHhbNl0sIEBzWzFdCisJIG1vdmRxYQlAdFsyXSwgQHRbMF0KKwlweG9yCUB4WzJdLCBAc1swXQorCSBtb3ZkcWEJQHRbM10sIEBzWzNdCisKKwlwb3IJQHRbMV0sIEB0WzJdCisJcG9yCUBzWzBdLCBAdFszXQorCXB4b3IJQHRbMF0sIEBzWzNdCisJcGFuZAlAc1swXSwgQHNbMl0KKwlweG9yCUB0WzFdLCBAc1swXQorCXBhbmQJQHRbMV0sIEB0WzBdCisJcGFuZAlAc1swXSwgQHNbM10KKwltb3ZkcWEJQHhbM10sIEBzWzBdCisJcHhvcglAeFsyXSwgQHNbMF0KKwlwYW5kCUBzWzBdLCBAc1sxXQorCXB4b3IJQHNbMV0sIEB0WzNdCisJcHhvcglAc1sxXSwgQHRbMl0KKwltb3ZkcWEJQHhbNF0sIEBzWzFdCisJbW92ZHFhCUB4WzFdLCBAc1swXQorCXB4b3IJQHhbNV0sIEBzWzFdCisJcHhvcglAeFswXSwgQHNbMF0KKwltb3ZkcWEJQHNbMV0sIEB0WzFdCisJcGFuZAlAc1swXSwgQHNbMV0KKwlwb3IJQHNbMF0sIEB0WzFdCisJcHhvcglAc1sxXSwgQHRbMF0KKwlweG9yCUBzWzNdLCBAdFszXQorCXB4b3IJQHNbMl0sIEB0WzJdCisJcHhvcglAc1szXSwgQHRbMV0KKwltb3ZkcWEJQHhbN10sIEBzWzBdCisJcHhvcglAc1syXSwgQHRbMF0KKwltb3ZkcWEJQHhbNl0sIEBzWzFdCisJcHhvcglAc1syXSwgQHRbMV0KKwltb3ZkcWEJQHhbNV0sIEBzWzJdCisJcGFuZAlAeFszXSwgQHNbMF0KKwltb3ZkcWEJQHhbNF0sIEBzWzNdCisJcGFuZAlAeFsyXSwgQHNbMV0KKwlwYW5kCUB4WzFdLCBAc1syXQorCXBvcglAeFswXSwgQHNbM10KKwlweG9yCUBzWzBdLCBAdFszXQorCXB4b3IJQHNbMV0sIEB0WzJdCisJcHhvcglAc1syXSwgQHRbMV0KKwlweG9yCUBzWzNdLCBAdFswXSAKKworCSNJbnZfR0YxNiBcdDAsIFx0MSwgXHQyLCBcdDMsIFxzMCwgXHMxLCBcczIsIFxzMworCisJIyBuZXcgc21hbGxlciBpbnZlcnNpb24KKworCW1vdmRxYQlAdFszXSwgQHNbMF0KKwlwYW5kCUB0WzFdLCBAdFszXQorCXB4b3IJQHRbMl0sIEBzWzBdCisKKwltb3ZkcWEJQHRbMF0sIEBzWzJdCisJbW92ZHFhCUBzWzBdLCBAc1szXQorCXB4b3IJQHRbM10sIEBzWzJdCisJcGFuZAlAc1syXSwgQHNbM10KKworCW1vdmRxYQlAdFsxXSwgQHNbMV0KKwlweG9yCUB0WzJdLCBAc1szXQorCXB4b3IJQHRbMF0sIEBzWzFdCisKKwlweG9yCUB0WzJdLCBAdFszXQorCisJcGFuZAlAdFszXSwgQHNbMV0KKworCW1vdmRxYQlAc1syXSwgQHRbMl0KKwlweG9yCUB0WzBdLCBAc1sxXQorCisJcHhvcglAc1sxXSwgQHRbMl0KKwlweG9yCUBzWzFdLCBAdFsxXQorCisJcGFuZAlAdFswXSwgQHRbMl0KKworCXB4b3IJQHRbMl0sIEBzWzJdCisJcHhvcglAdFsyXSwgQHRbMV0KKworCXBhbmQJQHNbM10sIEBzWzJdCisKKwlweG9yCUBzWzBdLCBAc1syXQorX19fCisjIG91dHB1dCBpbiBzMywgczIsIHMxLCB0MQorCisjIE11bF9HRjE2XzIgXHgwLCBceDEsIFx4MiwgXHgzLCBceDQsIFx4NSwgXHg2LCBceDcsIFx0MiwgXHQzLCBcdDAsIFx0MSwgXHMwLCBcczEsIFxzMiwgXHMzCisKKyMgTXVsX0dGMTZfMiBceDAsIFx4MSwgXHgyLCBceDMsIFx4NCwgXHg1LCBceDYsIFx4NywgXHMzLCBcczIsIFxzMSwgXHQxLCBcczAsIFx0MCwgXHQyLCBcdDMKKwkmTXVsX0dGMTZfMihAeCxAc1szLDIsMV0sQHRbMV0sQHNbMF0sQHRbMCwyLDNdKTsKKworIyMjIG91dHB1dCBtc2IgPiBbeDMseDIseDEseDAseDcseDYseDUseDRdIDwgbHNiCit9CisKKyMgQUVTIGxpbmVhciBjb21wb25lbnRzCisKK3N1YiBTaGlmdFJvd3MgeworbXkgQHg9QF9bMC4uN107CitteSAkbWFzaz1wb3A7CiskY29kZS49PDxfX187CisJcHhvcgkweDAwKCRrZXkpLEB4WzBdCisJcHhvcgkweDEwKCRrZXkpLEB4WzFdCisJcHNodWZiCSRtYXNrLEB4WzBdCisJcHhvcgkweDIwKCRrZXkpLEB4WzJdCisJcHNodWZiCSRtYXNrLEB4WzFdCisJcHhvcgkweDMwKCRrZXkpLEB4WzNdCisJcHNodWZiCSRtYXNrLEB4WzJdCisJcHhvcgkweDQwKCRrZXkpLEB4WzRdCisJcHNodWZiCSRtYXNrLEB4WzNdCisJcHhvcgkweDUwKCRrZXkpLEB4WzVdCisJcHNodWZiCSRtYXNrLEB4WzRdCisJcHhvcgkweDYwKCRrZXkpLEB4WzZdCisJcHNodWZiCSRtYXNrLEB4WzVdCisJcHhvcgkweDcwKCRrZXkpLEB4WzddCisJcHNodWZiCSRtYXNrLEB4WzZdCisJbGVhCTB4ODAoJGtleSksJGtleQorCXBzaHVmYgkkbWFzayxAeFs3XQorX19fCit9CisKK3N1YiBNaXhDb2x1bW5zIHsKKyMgbW9kaWZpZWQgdG8gZW1pdCBvdXRwdXQgaW4gb3JkZXIgc3VpdGFibGUgZm9yIGZlZWRpbmcgYmFjayB0byBhZXNlbmNbbGFzdF0KK215IEB4PUBfWzAuLjddOworbXkgQHQ9QF9bOC4uMTVdOworbXkgJGludj1AX1sxNl07CSMgb3B0aW9uYWwKKyRjb2RlLj08PF9fXzsKKwlwc2h1ZmQJXCQweDkzLCBAeFswXSwgQHRbMF0JIyB4MCA8PDwgMzIKKwlwc2h1ZmQJXCQweDkzLCBAeFsxXSwgQHRbMV0KKwkgcHhvcglAdFswXSwgQHhbMF0JCSMgeDAgXiAoeDAgPDw8IDMyKQorCXBzaHVmZAlcJDB4OTMsIEB4WzJdLCBAdFsyXQorCSBweG9yCUB0WzFdLCBAeFsxXQorCXBzaHVmZAlcJDB4OTMsIEB4WzNdLCBAdFszXQorCSBweG9yCUB0WzJdLCBAeFsyXQorCXBzaHVmZAlcJDB4OTMsIEB4WzRdLCBAdFs0XQorCSBweG9yCUB0WzNdLCBAeFszXQorCXBzaHVmZAlcJDB4OTMsIEB4WzVdLCBAdFs1XQorCSBweG9yCUB0WzRdLCBAeFs0XQorCXBzaHVmZAlcJDB4OTMsIEB4WzZdLCBAdFs2XQorCSBweG9yCUB0WzVdLCBAeFs1XQorCXBzaHVmZAlcJDB4OTMsIEB4WzddLCBAdFs3XQorCSBweG9yCUB0WzZdLCBAeFs2XQorCSBweG9yCUB0WzddLCBAeFs3XQorCisJcHhvcglAeFswXSwgQHRbMV0KKwlweG9yCUB4WzddLCBAdFswXQorCXB4b3IJQHhbN10sIEB0WzFdCisJIHBzaHVmZAlcJDB4NEUsIEB4WzBdLCBAeFswXSAJIyAoeDAgXiAoeDAgPDw8IDMyKSkgPDw8IDY0KQorCXB4b3IJQHhbMV0sIEB0WzJdCisJIHBzaHVmZAlcJDB4NEUsIEB4WzFdLCBAeFsxXQorCXB4b3IJQHhbNF0sIEB0WzVdCisJIHB4b3IJQHRbMF0sIEB4WzBdCisJcHhvcglAeFs1XSwgQHRbNl0KKwkgcHhvcglAdFsxXSwgQHhbMV0KKwlweG9yCUB4WzNdLCBAdFs0XQorCSBwc2h1ZmQJXCQweDRFLCBAeFs0XSwgQHRbMF0KKwlweG9yCUB4WzZdLCBAdFs3XQorCSBwc2h1ZmQJXCQweDRFLCBAeFs1XSwgQHRbMV0KKwlweG9yCUB4WzJdLCBAdFszXQorCSBwc2h1ZmQJXCQweDRFLCBAeFszXSwgQHhbNF0KKwlweG9yCUB4WzddLCBAdFszXQorCSBwc2h1ZmQJXCQweDRFLCBAeFs3XSwgQHhbNV0KKwlweG9yCUB4WzddLCBAdFs0XQorCSBwc2h1ZmQJXCQweDRFLCBAeFs2XSwgQHhbM10KKwlweG9yCUB0WzRdLCBAdFswXQorCSBwc2h1ZmQJXCQweDRFLCBAeFsyXSwgQHhbNl0KKwlweG9yCUB0WzVdLCBAdFsxXQorX19fCiskY29kZS49PDxfX18gaWYgKCEkaW52KTsKKwlweG9yCUB0WzNdLCBAeFs0XQorCXB4b3IJQHRbN10sIEB4WzVdCisJcHhvcglAdFs2XSwgQHhbM10KKwkgbW92ZHFhCUB0WzBdLCBAeFsyXQorCXB4b3IJQHRbMl0sIEB4WzZdCisJIG1vdmRxYQlAdFsxXSwgQHhbN10KK19fXworJGNvZGUuPTw8X19fIGlmICgkaW52KTsKKwlweG9yCUB4WzRdLCBAdFszXQorCXB4b3IJQHRbN10sIEB4WzVdCisJcHhvcglAeFszXSwgQHRbNl0KKwkgbW92ZHFhCUB0WzBdLCBAeFszXQorCXB4b3IJQHRbMl0sIEB4WzZdCisJIG1vdmRxYQlAdFs2XSwgQHhbMl0KKwkgbW92ZHFhCUB0WzFdLCBAeFs3XQorCSBtb3ZkcWEJQHhbNl0sIEB4WzRdCisJIG1vdmRxYQlAdFszXSwgQHhbNl0KK19fXworfQorCitzdWIgSW52TWl4Q29sdW1uc19vcmlnIHsKK215IEB4PUBfWzAuLjddOworbXkgQHQ9QF9bOC4uMTVdOworCiskY29kZS49PDxfX187CisJIyBtdWx0aXBsaWNhdGlvbiBieSAweDBlCisJcHNodWZkCVwkMHg5MywgQHhbN10sIEB0WzddCisJbW92ZHFhCUB4WzJdLCBAdFsyXQorCXB4b3IJQHhbNV0sIEB4WzddCQkjIDcgNQorCXB4b3IJQHhbNV0sIEB4WzJdCQkjIDIgNQorCXBzaHVmZAlcJDB4OTMsIEB4WzBdLCBAdFswXQorCW1vdmRxYQlAeFs1XSwgQHRbNV0KKwlweG9yCUB4WzBdLCBAeFs1XQkJIyA1IDAJCVsxXQorCXB4b3IJQHhbMV0sIEB4WzBdCQkjIDAgMQorCXBzaHVmZAlcJDB4OTMsIEB4WzFdLCBAdFsxXQorCXB4b3IJQHhbMl0sIEB4WzFdCQkjIDEgMjUKKwlweG9yCUB4WzZdLCBAeFswXQkJIyAwMSA2CQlbMl0KKwlweG9yCUB4WzNdLCBAeFsxXQkJIyAxMjUgMwkJWzRdCisJcHNodWZkCVwkMHg5MywgQHhbM10sIEB0WzNdCisJcHhvcglAeFswXSwgQHhbMl0JCSMgMjUgMDE2CVszXQorCXB4b3IJQHhbN10sIEB4WzNdCQkjIDMgNzUKKwlweG9yCUB4WzZdLCBAeFs3XQkJIyA3NSA2CQlbMF0KKwlwc2h1ZmQJXCQweDkzLCBAeFs2XSwgQHRbNl0KKwltb3ZkcWEJQHhbNF0sIEB0WzRdCisJcHhvcglAeFs0XSwgQHhbNl0JCSMgNiA0CisJcHhvcglAeFszXSwgQHhbNF0JCSMgNCAzNzUJCVs2XQorCXB4b3IJQHhbN10sIEB4WzNdCQkjIDM3NSA3NTY9MzYKKwlweG9yCUB0WzVdLCBAeFs2XQkJIyA2NCA1CQlbN10KKwlweG9yCUB0WzJdLCBAeFszXQkJIyAzNiAyCisJcHhvcglAdFs0XSwgQHhbM10JCSMgMzYyIDQJCVs1XQorCXBzaHVmZAlcJDB4OTMsIEB0WzVdLCBAdFs1XQorX19fCisJCQkJCW15IEB5ID0gQHhbNyw1LDAsMiwxLDMsNCw2XTsKKyRjb2RlLj08PF9fXzsKKwkjIG11bHRpcGxpY2F0aW9uIGJ5IDB4MGIKKwlweG9yCUB5WzBdLCBAeVsxXQorCXB4b3IJQHRbMF0sIEB5WzBdCisJcHhvcglAdFsxXSwgQHlbMV0KKwlwc2h1ZmQJXCQweDkzLCBAdFsyXSwgQHRbMl0KKwlweG9yCUB0WzVdLCBAeVswXQorCXB4b3IJQHRbNl0sIEB5WzFdCisJcHhvcglAdFs3XSwgQHlbMF0KKwlwc2h1ZmQJXCQweDkzLCBAdFs0XSwgQHRbNF0KKwlweG9yCUB0WzZdLCBAdFs3XQkJIyBjbG9iYmVyIHRbN10KKwlweG9yCUB5WzBdLCBAeVsxXQorCisJcHhvcglAdFswXSwgQHlbM10KKwlwc2h1ZmQJXCQweDkzLCBAdFswXSwgQHRbMF0KKwlweG9yCUB0WzFdLCBAeVsyXQorCXB4b3IJQHRbMV0sIEB5WzRdCisJcHhvcglAdFsyXSwgQHlbMl0KKwlwc2h1ZmQJXCQweDkzLCBAdFsxXSwgQHRbMV0KKwlweG9yCUB0WzJdLCBAeVszXQorCXB4b3IJQHRbMl0sIEB5WzVdCisJcHhvcglAdFs3XSwgQHlbMl0KKwlwc2h1ZmQJXCQweDkzLCBAdFsyXSwgQHRbMl0KKwlweG9yCUB0WzNdLCBAeVszXQorCXB4b3IJQHRbM10sIEB5WzZdCisJcHhvcglAdFszXSwgQHlbNF0KKwlwc2h1ZmQJXCQweDkzLCBAdFszXSwgQHRbM10KKwlweG9yCUB0WzRdLCBAeVs3XQorCXB4b3IJQHRbNF0sIEB5WzVdCisJcHhvcglAdFs3XSwgQHlbN10KKwlweG9yCUB0WzVdLCBAeVszXQorCXB4b3IJQHRbNF0sIEB5WzRdCisJcHhvcglAdFs1XSwgQHRbN10JCSMgY2xvYmJlciB0WzddIGV2ZW4gbW9yZQorCisJcHhvcglAdFs3XSwgQHlbNV0KKwlwc2h1ZmQJXCQweDkzLCBAdFs0XSwgQHRbNF0KKwlweG9yCUB0WzddLCBAeVs2XQorCXB4b3IJQHRbN10sIEB5WzRdCisKKwlweG9yCUB0WzVdLCBAdFs3XQorCXBzaHVmZAlcJDB4OTMsIEB0WzVdLCBAdFs1XQorCXB4b3IJQHRbNl0sIEB0WzddCQkjIHJlc3RvcmUgdFs3XQorCisJIyBtdWx0aXBsaWNhdGlvbiBieSAweDBkCisJcHhvcglAeVs3XSwgQHlbNF0KKwlweG9yCUB0WzRdLCBAeVs3XQorCXBzaHVmZAlcJDB4OTMsIEB0WzZdLCBAdFs2XQorCXB4b3IJQHRbMF0sIEB5WzJdCisJcHhvcglAdFs1XSwgQHlbN10KKwlweG9yCUB0WzJdLCBAeVsyXQorCXBzaHVmZAlcJDB4OTMsIEB0WzddLCBAdFs3XQorCisJcHhvcglAeVsxXSwgQHlbM10KKwlweG9yCUB0WzFdLCBAeVsxXQorCXB4b3IJQHRbMF0sIEB5WzBdCisJcHhvcglAdFswXSwgQHlbM10KKwlweG9yCUB0WzVdLCBAeVsxXQorCXB4b3IJQHRbNV0sIEB5WzBdCisJcHhvcglAdFs3XSwgQHlbMV0KKwlwc2h1ZmQJXCQweDkzLCBAdFswXSwgQHRbMF0KKwlweG9yCUB0WzZdLCBAeVswXQorCXB4b3IJQHlbMV0sIEB5WzNdCisJcHhvcglAdFsxXSwgQHlbNF0KKwlwc2h1ZmQJXCQweDkzLCBAdFsxXSwgQHRbMV0KKworCXB4b3IJQHRbN10sIEB5WzddCisJcHhvcglAdFsyXSwgQHlbNF0KKwlweG9yCUB0WzJdLCBAeVs1XQorCXBzaHVmZAlcJDB4OTMsIEB0WzJdLCBAdFsyXQorCXB4b3IJQHRbNl0sIEB5WzJdCisJcHhvcglAdFszXSwgQHRbNl0JCSMgY2xvYmJlciB0WzZdCisJcHhvcglAeVs3XSwgQHlbNF0KKwlweG9yCUB0WzZdLCBAeVszXQorCisJcHhvcglAdFs2XSwgQHlbNl0KKwlweG9yCUB0WzVdLCBAeVs1XQorCXB4b3IJQHRbNF0sIEB5WzZdCisJcHNodWZkCVwkMHg5MywgQHRbNF0sIEB0WzRdCisJcHhvcglAdFs2XSwgQHlbNV0KKwlweG9yCUB0WzddLCBAeVs2XQorCXB4b3IJQHRbM10sIEB0WzZdCQkjIHJlc3RvcmUgdFs2XQorCisJcHNodWZkCVwkMHg5MywgQHRbNV0sIEB0WzVdCisJcHNodWZkCVwkMHg5MywgQHRbNl0sIEB0WzZdCisJcHNodWZkCVwkMHg5MywgQHRbN10sIEB0WzddCisJcHNodWZkCVwkMHg5MywgQHRbM10sIEB0WzNdCisKKwkjIG11bHRpcGxpY2F0aW9uIGJ5IDB4MDkKKwlweG9yCUB5WzFdLCBAeVs0XQorCXB4b3IJQHlbMV0sIEB0WzFdCQkjIHRbMV09eVsxXQorCXB4b3IJQHRbNV0sIEB0WzBdCQkjIGNsb2JiZXIgdFswXQorCXB4b3IJQHRbNV0sIEB0WzFdCisJcHhvcglAdFswXSwgQHlbM10KKwlweG9yCUB5WzBdLCBAdFswXQkJIyB0WzBdPXlbMF0KKwlweG9yCUB0WzZdLCBAdFsxXQorCXB4b3IJQHRbN10sIEB0WzZdCQkjIGNsb2JiZXIgdFs2XQorCXB4b3IJQHRbMV0sIEB5WzRdCisJcHhvcglAdFs0XSwgQHlbN10KKwlweG9yCUB5WzRdLCBAdFs0XQkJIyB0WzRdPXlbNF0KKwlweG9yCUB0WzNdLCBAeVs2XQorCXB4b3IJQHlbM10sIEB0WzNdCQkjIHRbM109eVszXQorCXB4b3IJQHRbMl0sIEB5WzVdCisJcHhvcglAeVsyXSwgQHRbMl0JCSMgdFsyXT15WzJdCisJcHhvcglAdFs3XSwgQHRbM10KKwlweG9yCUB5WzVdLCBAdFs1XQkJIyB0WzVdPXlbNV0KKwlweG9yCUB0WzZdLCBAdFsyXQorCXB4b3IJQHRbNl0sIEB0WzVdCisJcHhvcglAeVs2XSwgQHRbNl0JCSMgdFs2XT15WzZdCisJcHhvcglAeVs3XSwgQHRbN10JCSMgdFs3XT15WzddCisKKwltb3ZkcWEJQHRbMF0sQFhNTVswXQorCW1vdmRxYQlAdFsxXSxAWE1NWzFdCisJbW92ZHFhCUB0WzJdLEBYTU1bMl0KKwltb3ZkcWEJQHRbM10sQFhNTVszXQorCW1vdmRxYQlAdFs0XSxAWE1NWzRdCisJbW92ZHFhCUB0WzVdLEBYTU1bNV0KKwltb3ZkcWEJQHRbNl0sQFhNTVs2XQorCW1vdmRxYQlAdFs3XSxAWE1NWzddCitfX18KK30KKworc3ViIEludk1peENvbHVtbnMgeworbXkgQHg9QF9bMC4uN107CitteSBAdD1AX1s4Li4xNV07CisKKyMgVGhhbmtzIHRvIEp1c3NpIEtpdmlsaW5uYSBmb3IgcHJvdmlkaW5nIHBvaW50ZXIgdG8KKyMKKyMgfCAwZSAwYiAwZCAwOSB8ICAgfCAwMiAwMyAwMSAwMSB8ICAgfCAwNSAwMCAwNCAwMCB8CisjIHwgMDkgMGUgMGIgMGQgfCA9IHwgMDEgMDIgMDMgMDEgfCB4IHwgMDAgMDUgMDAgMDQgfAorIyB8IDBkIDA5IDBlIDBiIHwgICB8IDAxIDAxIDAyIDAzIHwgICB8IDA0IDAwIDA1IDAwIHwKKyMgfCAwYiAwZCAwOSAwZSB8ICAgfCAwMyAwMSAwMSAwMiB8ICAgfCAwMCAwNCAwMCAwNSB8CisKKyRjb2RlLj08PF9fXzsKKwkjIG11bHRpcGxpY2F0aW9uIGJ5IDB4MDUtMHgwMC0weDA0LTB4MDAKKwlwc2h1ZmQJXCQweDRFLCBAeFswXSwgQHRbMF0KKwlwc2h1ZmQJXCQweDRFLCBAeFs2XSwgQHRbNl0KKwlweG9yCUB4WzBdLCBAdFswXQorCXBzaHVmZAlcJDB4NEUsIEB4WzddLCBAdFs3XQorCXB4b3IJQHhbNl0sIEB0WzZdCisJcHNodWZkCVwkMHg0RSwgQHhbMV0sIEB0WzFdCisJcHhvcglAeFs3XSwgQHRbN10KKwlwc2h1ZmQJXCQweDRFLCBAeFsyXSwgQHRbMl0KKwlweG9yCUB4WzFdLCBAdFsxXQorCXBzaHVmZAlcJDB4NEUsIEB4WzNdLCBAdFszXQorCXB4b3IJQHhbMl0sIEB0WzJdCisJIHB4b3IJQHRbNl0sIEB4WzBdCisJIHB4b3IJQHRbNl0sIEB4WzFdCisJcHNodWZkCVwkMHg0RSwgQHhbNF0sIEB0WzRdCisJcHhvcglAeFszXSwgQHRbM10KKwkgcHhvcglAdFswXSwgQHhbMl0KKwkgcHhvcglAdFsxXSwgQHhbM10KKwlwc2h1ZmQJXCQweDRFLCBAeFs1XSwgQHRbNV0KKwlweG9yCUB4WzRdLCBAdFs0XQorCSBweG9yCUB0WzddLCBAeFsxXQorCSBweG9yCUB0WzJdLCBAeFs0XQorCXB4b3IJQHhbNV0sIEB0WzVdCisKKwkgcHhvcglAdFs3XSwgQHhbMl0KKwkgcHhvcglAdFs2XSwgQHhbM10KKwkgcHhvcglAdFs2XSwgQHhbNF0KKwkgcHhvcglAdFszXSwgQHhbNV0KKwkgcHhvcglAdFs0XSwgQHhbNl0KKwkgcHhvcglAdFs3XSwgQHhbNF0KKwkgcHhvcglAdFs3XSwgQHhbNV0KKwkgcHhvcglAdFs1XSwgQHhbN10KK19fXworCSZNaXhDb2x1bW5zCShAeCxAdCwxKTsJIyBmbGlwcGVkIDI8LT4zIGFuZCA0PC0+NgorfQorCitzdWIgYWVzZW5jIHsJCQkJIyBub3QgdXNlZAorbXkgQGI9QF9bMC4uN107CitteSBAdD1AX1s4Li4xNV07CiskY29kZS49PDxfX187CisJbW92ZHFhCTB4MzAoJGNvbnN0KSxAdFswXQkjIC5MU1IKK19fXworCSZTaGlmdFJvd3MJKEBiLEB0WzBdKTsKKwkmU2JveAkJKEBiLEB0KTsKKwkmTWl4Q29sdW1ucwkoQGJbMCwxLDQsNiwzLDcsMiw1XSxAdCk7Cit9CisKK3N1YiBhZXNlbmNsYXN0IHsJCQkjIG5vdCB1c2VkCitteSBAYj1AX1swLi43XTsKK215IEB0PUBfWzguLjE1XTsKKyRjb2RlLj08PF9fXzsKKwltb3ZkcWEJMHg0MCgkY29uc3QpLEB0WzBdCSMgLkxTUk0wCitfX18KKwkmU2hpZnRSb3dzCShAYixAdFswXSk7CisJJlNib3gJCShAYixAdCk7CiskY29kZS49PDxfX18KKwlweG9yCTB4MDAoJGtleSksQGJbMF0KKwlweG9yCTB4MTAoJGtleSksQGJbMV0KKwlweG9yCTB4MjAoJGtleSksQGJbNF0KKwlweG9yCTB4MzAoJGtleSksQGJbNl0KKwlweG9yCTB4NDAoJGtleSksQGJbM10KKwlweG9yCTB4NTAoJGtleSksQGJbN10KKwlweG9yCTB4NjAoJGtleSksQGJbMl0KKwlweG9yCTB4NzAoJGtleSksQGJbNV0KK19fXworfQorCitzdWIgc3dhcG1vdmUgeworbXkgKCRhLCRiLCRuLCRtYXNrLCR0KT1AXzsKKyRjb2RlLj08PF9fXzsKKwltb3ZkcWEJJGIsJHQKKwlwc3JscQlcJCRuLCRiCisJcHhvciAgCSRhLCRiCisJcGFuZAkkbWFzaywkYgorCXB4b3IJJGIsJGEKKwlwc2xscQlcJCRuLCRiCisJcHhvcgkkdCwkYgorX19fCit9CitzdWIgc3dhcG1vdmUyeCB7CitteSAoJGEwLCRiMCwkYTEsJGIxLCRuLCRtYXNrLCR0MCwkdDEpPUBfOworJGNvZGUuPTw8X19fOworCW1vdmRxYQkkYjAsJHQwCisJcHNybHEJXCQkbiwkYjAKKwkgbW92ZHFhCSRiMSwkdDEKKwkgcHNybHEJXCQkbiwkYjEKKwlweG9yICAJJGEwLCRiMAorCSBweG9yICAJJGExLCRiMQorCXBhbmQJJG1hc2ssJGIwCisJIHBhbmQJJG1hc2ssJGIxCisJcHhvcgkkYjAsJGEwCisJcHNsbHEJXCQkbiwkYjAKKwkgcHhvcgkkYjEsJGExCisJIHBzbGxxCVwkJG4sJGIxCisJcHhvcgkkdDAsJGIwCisJIHB4b3IJJHQxLCRiMQorX19fCit9CisKK3N1YiBiaXRzbGljZSB7CitteSBAeD1yZXZlcnNlKEBfWzAuLjddKTsKK215ICgkdDAsJHQxLCR0MiwkdDMpPUBfWzguLjExXTsKKyRjb2RlLj08PF9fXzsKKwltb3ZkcWEJMHgwMCgkY29uc3QpLCR0MAkjIC5MQlMwCisJbW92ZHFhCTB4MTAoJGNvbnN0KSwkdDEJIyAuTEJTMQorX19fCisJJnN3YXBtb3ZlMngoQHhbMCwxLDIsM10sMSwkdDAsJHQyLCR0Myk7CisJJnN3YXBtb3ZlMngoQHhbNCw1LDYsN10sMSwkdDAsJHQyLCR0Myk7CiskY29kZS49PDxfX187CisJbW92ZHFhCTB4MjAoJGNvbnN0KSwkdDAJIyAuTEJTMgorX19fCisJJnN3YXBtb3ZlMngoQHhbMCwyLDEsM10sMiwkdDEsJHQyLCR0Myk7CisJJnN3YXBtb3ZlMngoQHhbNCw2LDUsN10sMiwkdDEsJHQyLCR0Myk7CisKKwkmc3dhcG1vdmUyeChAeFswLDQsMSw1XSw0LCR0MCwkdDIsJHQzKTsKKwkmc3dhcG1vdmUyeChAeFsyLDYsMyw3XSw0LCR0MCwkdDIsJHQzKTsKK30KKworJGNvZGUuPTw8X19fOworLnRleHQKKworLmV4dGVybglhc21fQUVTX2VuY3J5cHQKKy5leHRlcm4JYXNtX0FFU19kZWNyeXB0CisKKy50eXBlCV9ic2Flc19lbmNyeXB0OCxcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JNjQKK19ic2Flc19lbmNyeXB0ODoKKwlsZWEJLkxCUzAoJXJpcCksICRjb25zdAkjIGNvbnN0YW50cyB0YWJsZQorCisJbW92ZHFhCSgka2V5KSwgQFhNTVs5XQkJIyByb3VuZCAwIGtleQorCWxlYQkweDEwKCRrZXkpLCAka2V5CisJbW92ZHFhCTB4NTAoJGNvbnN0KSwgQFhNTVs4XQkjIC5MTTBTUgorCXB4b3IJQFhNTVs5XSwgQFhNTVswXQkjIHhvciB3aXRoIHJvdW5kMCBrZXkKKwlweG9yCUBYTU1bOV0sIEBYTU1bMV0KKwkgcHNodWZiCUBYTU1bOF0sIEBYTU1bMF0KKwlweG9yCUBYTU1bOV0sIEBYTU1bMl0KKwkgcHNodWZiCUBYTU1bOF0sIEBYTU1bMV0KKwlweG9yCUBYTU1bOV0sIEBYTU1bM10KKwkgcHNodWZiCUBYTU1bOF0sIEBYTU1bMl0KKwlweG9yCUBYTU1bOV0sIEBYTU1bNF0KKwkgcHNodWZiCUBYTU1bOF0sIEBYTU1bM10KKwlweG9yCUBYTU1bOV0sIEBYTU1bNV0KKwkgcHNodWZiCUBYTU1bOF0sIEBYTU1bNF0KKwlweG9yCUBYTU1bOV0sIEBYTU1bNl0KKwkgcHNodWZiCUBYTU1bOF0sIEBYTU1bNV0KKwlweG9yCUBYTU1bOV0sIEBYTU1bN10KKwkgcHNodWZiCUBYTU1bOF0sIEBYTU1bNl0KKwkgcHNodWZiCUBYTU1bOF0sIEBYTU1bN10KK19ic2Flc19lbmNyeXB0OF9iaXRzbGljZToKK19fXworCSZiaXRzbGljZQkoQFhNTVswLi43LCA4Li4xMV0pOworJGNvZGUuPTw8X19fOworCWRlYwkkcm91bmRzCisJam1wCS5MZW5jX3Nib3gKKy5hbGlnbgkxNgorLkxlbmNfbG9vcDoKK19fXworCSZTaGlmdFJvd3MJKEBYTU1bMC4uNywgOF0pOworJGNvZGUuPSIuTGVuY19zYm94OlxuIjsKKwkmU2JveAkJKEBYTU1bMC4uNywgOC4uMTVdKTsKKyRjb2RlLj08PF9fXzsKKwlkZWMJJHJvdW5kcworCWpsCS5MZW5jX2RvbmUKK19fXworCSZNaXhDb2x1bW5zCShAWE1NWzAsMSw0LDYsMyw3LDIsNSwgOC4uMTVdKTsKKyRjb2RlLj08PF9fXzsKKwltb3ZkcWEJMHgzMCgkY29uc3QpLCBAWE1NWzhdCSMgLkxTUgorCWpuegkuTGVuY19sb29wCisJbW92ZHFhCTB4NDAoJGNvbnN0KSwgQFhNTVs4XQkjIC5MU1JNMAorCWptcAkuTGVuY19sb29wCisuYWxpZ24JMTYKKy5MZW5jX2RvbmU6CitfX18KKwkjIG91dHB1dCBpbiBsc2IgPiBbdDAsIHQxLCB0NCwgdDYsIHQzLCB0NywgdDIsIHQ1XSA8IG1zYgorCSZiaXRzbGljZQkoQFhNTVswLDEsNCw2LDMsNywyLDUsIDguLjExXSk7CiskY29kZS49PDxfX187CisJbW92ZHFhCSgka2V5KSwgQFhNTVs4XQkJIyBsYXN0IHJvdW5kIGtleQorCXB4b3IJQFhNTVs4XSwgQFhNTVs0XQorCXB4b3IJQFhNTVs4XSwgQFhNTVs2XQorCXB4b3IJQFhNTVs4XSwgQFhNTVszXQorCXB4b3IJQFhNTVs4XSwgQFhNTVs3XQorCXB4b3IJQFhNTVs4XSwgQFhNTVsyXQorCXB4b3IJQFhNTVs4XSwgQFhNTVs1XQorCXB4b3IJQFhNTVs4XSwgQFhNTVswXQorCXB4b3IJQFhNTVs4XSwgQFhNTVsxXQorCXJldAorLnNpemUJX2JzYWVzX2VuY3J5cHQ4LC4tX2JzYWVzX2VuY3J5cHQ4CisKKy50eXBlCV9ic2Flc19kZWNyeXB0OCxcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JNjQKK19ic2Flc19kZWNyeXB0ODoKKwlsZWEJLkxCUzAoJXJpcCksICRjb25zdAkjIGNvbnN0YW50cyB0YWJsZQorCisJbW92ZHFhCSgka2V5KSwgQFhNTVs5XQkJIyByb3VuZCAwIGtleQorCWxlYQkweDEwKCRrZXkpLCAka2V5CisJbW92ZHFhCS0weDMwKCRjb25zdCksIEBYTU1bOF0JIyAuTE0wSVNSCisJcHhvcglAWE1NWzldLCBAWE1NWzBdCSMgeG9yIHdpdGggcm91bmQwIGtleQorCXB4b3IJQFhNTVs5XSwgQFhNTVsxXQorCSBwc2h1ZmIJQFhNTVs4XSwgQFhNTVswXQorCXB4b3IJQFhNTVs5XSwgQFhNTVsyXQorCSBwc2h1ZmIJQFhNTVs4XSwgQFhNTVsxXQorCXB4b3IJQFhNTVs5XSwgQFhNTVszXQorCSBwc2h1ZmIJQFhNTVs4XSwgQFhNTVsyXQorCXB4b3IJQFhNTVs5XSwgQFhNTVs0XQorCSBwc2h1ZmIJQFhNTVs4XSwgQFhNTVszXQorCXB4b3IJQFhNTVs5XSwgQFhNTVs1XQorCSBwc2h1ZmIJQFhNTVs4XSwgQFhNTVs0XQorCXB4b3IJQFhNTVs5XSwgQFhNTVs2XQorCSBwc2h1ZmIJQFhNTVs4XSwgQFhNTVs1XQorCXB4b3IJQFhNTVs5XSwgQFhNTVs3XQorCSBwc2h1ZmIJQFhNTVs4XSwgQFhNTVs2XQorCSBwc2h1ZmIJQFhNTVs4XSwgQFhNTVs3XQorX19fCisJJmJpdHNsaWNlCShAWE1NWzAuLjcsIDguLjExXSk7CiskY29kZS49PDxfX187CisJZGVjCSRyb3VuZHMKKwlqbXAJLkxkZWNfc2JveAorLmFsaWduCTE2CisuTGRlY19sb29wOgorX19fCisJJlNoaWZ0Um93cwkoQFhNTVswLi43LCA4XSk7CiskY29kZS49Ii5MZGVjX3Nib3g6XG4iOworCSZJbnZTYm94CShAWE1NWzAuLjcsIDguLjE1XSk7CiskY29kZS49PDxfX187CisJZGVjCSRyb3VuZHMKKwlqbAkuTGRlY19kb25lCitfX18KKwkmSW52TWl4Q29sdW1ucwkoQFhNTVswLDEsNiw0LDIsNywzLDUsIDguLjE1XSk7CiskY29kZS49PDxfX187CisJbW92ZHFhCS0weDEwKCRjb25zdCksIEBYTU1bOF0JIyAuTElTUgorCWpuegkuTGRlY19sb29wCisJbW92ZHFhCS0weDIwKCRjb25zdCksIEBYTU1bOF0JIyAuTElTUk0wCisJam1wCS5MZGVjX2xvb3AKKy5hbGlnbgkxNgorLkxkZWNfZG9uZToKK19fXworCSZiaXRzbGljZQkoQFhNTVswLDEsNiw0LDIsNywzLDUsIDguLjExXSk7CiskY29kZS49PDxfX187CisJbW92ZHFhCSgka2V5KSwgQFhNTVs4XQkJIyBsYXN0IHJvdW5kIGtleQorCXB4b3IJQFhNTVs4XSwgQFhNTVs2XQorCXB4b3IJQFhNTVs4XSwgQFhNTVs0XQorCXB4b3IJQFhNTVs4XSwgQFhNTVsyXQorCXB4b3IJQFhNTVs4XSwgQFhNTVs3XQorCXB4b3IJQFhNTVs4XSwgQFhNTVszXQorCXB4b3IJQFhNTVs4XSwgQFhNTVs1XQorCXB4b3IJQFhNTVs4XSwgQFhNTVswXQorCXB4b3IJQFhNTVs4XSwgQFhNTVsxXQorCXJldAorLnNpemUJX2JzYWVzX2RlY3J5cHQ4LC4tX2JzYWVzX2RlY3J5cHQ4CitfX18KK30KK3sKK215ICgkb3V0LCRpbnAsJHJvdW5kcywkY29uc3QpPSgiJXJheCIsIiVyY3giLCIlcjEwZCIsIiVyMTEiKTsKKworc3ViIGJpdHNsaWNlX2tleSB7CitteSBAeD1yZXZlcnNlKEBfWzAuLjddKTsKK215ICgkYnMwLCRiczEsJGJzMiwkdDIsJHQzKT1AX1s4Li4xMl07CisKKwkmc3dhcG1vdmUJKEB4WzAsMV0sMSwkYnMwLCR0MiwkdDMpOworJGNvZGUuPTw8X19fOworCSMmc3dhcG1vdmUoQHhbMiwzXSwxLCR0MCwkdDIsJHQzKTsKKwltb3ZkcWEJQHhbMF0sIEB4WzJdCisJbW92ZHFhCUB4WzFdLCBAeFszXQorX19fCisJIyZzd2FwbW92ZTJ4KEB4WzQsNSw2LDddLDEsJHQwLCR0MiwkdDMpOworCisJJnN3YXBtb3ZlMngJKEB4WzAsMiwxLDNdLDIsJGJzMSwkdDIsJHQzKTsKKyRjb2RlLj08PF9fXzsKKwkjJnN3YXBtb3ZlMngoQHhbNCw2LDUsN10sMiwkdDEsJHQyLCR0Myk7CisJbW92ZHFhCUB4WzBdLCBAeFs0XQorCW1vdmRxYQlAeFsyXSwgQHhbNl0KKwltb3ZkcWEJQHhbMV0sIEB4WzVdCisJbW92ZHFhCUB4WzNdLCBAeFs3XQorX19fCisJJnN3YXBtb3ZlMngJKEB4WzAsNCwxLDVdLDQsJGJzMiwkdDIsJHQzKTsKKwkmc3dhcG1vdmUyeAkoQHhbMiw2LDMsN10sNCwkYnMyLCR0MiwkdDMpOworfQorCiskY29kZS49PDxfX187CisudHlwZQlfYnNhZXNfa2V5X2NvbnZlcnQsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2CitfYnNhZXNfa2V5X2NvbnZlcnQ6CisJbGVhCS5MbWFza3MoJXJpcCksICRjb25zdAorCW1vdmRxdQkoJGlucCksICV4bW03CQkjIGxvYWQgcm91bmQgMCBrZXkKKwlsZWEJMHgxMCgkaW5wKSwgJGlucAorCW1vdmRxYQkweDAwKCRjb25zdCksICV4bW0wCSMgMHgwMS4uLgorCW1vdmRxYQkweDEwKCRjb25zdCksICV4bW0xCSMgMHgwMi4uLgorCW1vdmRxYQkweDIwKCRjb25zdCksICV4bW0yCSMgMHgwNC4uLgorCW1vdmRxYQkweDMwKCRjb25zdCksICV4bW0zCSMgMHgwOC4uLgorCW1vdmRxYQkweDQwKCRjb25zdCksICV4bW00CSMgLkxNMAorCXBjbXBlcWQJJXhtbTUsICV4bW01CQkjIC5MTk9UCisKKwltb3ZkcXUJKCRpbnApLCAleG1tNgkJIyBsb2FkIHJvdW5kIDEga2V5CisJbW92ZHFhCSV4bW03LCAoJG91dCkJCSMgc2F2ZSByb3VuZCAwIGtleQorCWxlYQkweDEwKCRvdXQpLCAkb3V0CisJZGVjCSRyb3VuZHMKKwlqbXAJLkxrZXlfbG9vcAorLmFsaWduCTE2CisuTGtleV9sb29wOgorCXBzaHVmYgkleG1tNCwgJXhtbTYJCSMgLkxNMAorCisJbW92ZHFhCSV4bW0wLAkleG1tOAorCW1vdmRxYQkleG1tMSwJJXhtbTkKKworCXBhbmQJJXhtbTYsCSV4bW04CisJcGFuZAkleG1tNiwJJXhtbTkKKwltb3ZkcWEJJXhtbTIsCSV4bW0xMAorCXBjbXBlcWIJJXhtbTAsCSV4bW04CisJcHNsbHEJXCQ0LAkleG1tMAkJIyAweDEwLi4uCisJbW92ZHFhCSV4bW0zLAkleG1tMTEKKwlwY21wZXFiCSV4bW0xLAkleG1tOQorCXBzbGxxCVwkNCwJJXhtbTEJCSMgMHgyMC4uLgorCisJcGFuZAkleG1tNiwJJXhtbTEwCisJcGFuZAkleG1tNiwJJXhtbTExCisJbW92ZHFhCSV4bW0wLAkleG1tMTIKKwlwY21wZXFiCSV4bW0yLAkleG1tMTAKKwlwc2xscQlcJDQsCSV4bW0yCQkjIDB4NDAuLi4KKwltb3ZkcWEJJXhtbTEsCSV4bW0xMworCXBjbXBlcWIJJXhtbTMsCSV4bW0xMQorCXBzbGxxCVwkNCwJJXhtbTMJCSMgMHg4MC4uLgorCisJbW92ZHFhCSV4bW0yLAkleG1tMTQKKwltb3ZkcWEJJXhtbTMsCSV4bW0xNQorCSBweG9yCSV4bW01LAkleG1tOAkJIyAicG5vdCIKKwkgcHhvcgkleG1tNSwJJXhtbTkKKworCXBhbmQJJXhtbTYsCSV4bW0xMgorCXBhbmQJJXhtbTYsCSV4bW0xMworCSBtb3ZkcWEJJXhtbTgsIDB4MDAoJG91dCkJIyB3cml0ZSBiaXQtc2xpY2VkIHJvdW5kIGtleQorCXBjbXBlcWIJJXhtbTAsCSV4bW0xMgorCXBzcmxxCVwkNCwJJXhtbTAJCSMgMHgwMS4uLgorCSBtb3ZkcWEJJXhtbTksIDB4MTAoJG91dCkKKwlwY21wZXFiCSV4bW0xLAkleG1tMTMKKwlwc3JscQlcJDQsCSV4bW0xCQkjIDB4MDIuLi4KKwkgbGVhCTB4MTAoJGlucCksICRpbnAKKworCXBhbmQJJXhtbTYsCSV4bW0xNAorCXBhbmQJJXhtbTYsCSV4bW0xNQorCSBtb3ZkcWEJJXhtbTEwLCAweDIwKCRvdXQpCisJcGNtcGVxYgkleG1tMiwJJXhtbTE0CisJcHNybHEJXCQ0LAkleG1tMgkJIyAweDA0Li4uCisJIG1vdmRxYQkleG1tMTEsIDB4MzAoJG91dCkKKwlwY21wZXFiCSV4bW0zLAkleG1tMTUKKwlwc3JscQlcJDQsCSV4bW0zCQkjIDB4MDguLi4KKwkgbW92ZHF1CSgkaW5wKSwgJXhtbTYJCSMgbG9hZCBuZXh0IHJvdW5kIGtleQorCisJcHhvcgkleG1tNSwgJXhtbTEzCQkjICJwbm90IgorCXB4b3IJJXhtbTUsICV4bW0xNAorCW1vdmRxYQkleG1tMTIsIDB4NDAoJG91dCkKKwltb3ZkcWEJJXhtbTEzLCAweDUwKCRvdXQpCisJbW92ZHFhCSV4bW0xNCwgMHg2MCgkb3V0KQorCW1vdmRxYQkleG1tMTUsIDB4NzAoJG91dCkKKwlsZWEJMHg4MCgkb3V0KSwkb3V0CisJZGVjCSRyb3VuZHMKKwlqbnoJLkxrZXlfbG9vcAorCisJbW92ZHFhCTB4NTAoJGNvbnN0KSwgJXhtbTcJIyAuTDYzCisJI21vdmRxYQkleG1tNiwgKCRvdXQpCQkjIGRvbid0IHNhdmUgbGFzdCByb3VuZCBrZXkKKwlyZXQKKy5zaXplCV9ic2Flc19rZXlfY29udmVydCwuLV9ic2Flc19rZXlfY29udmVydAorX19fCit9CisKK2lmICgwICYmICEkd2luNjQpIHsJIyBmb2xsb3dpbmcgZm91ciBmdW5jdGlvbnMgYXJlIHVuc3VwcG9ydGVkIGludGVyZmFjZQorCQkJIyB1c2VkIGZvciBiZW5jaG1hcmtpbmcuLi4KKyRjb2RlLj08PF9fXzsKKy5nbG9ibAlic2Flc19lbmNfa2V5X2NvbnZlcnQKKy50eXBlCWJzYWVzX2VuY19rZXlfY29udmVydCxcQGZ1bmN0aW9uLDIKKy5hbGlnbgkxNgorYnNhZXNfZW5jX2tleV9jb252ZXJ0OgorCW1vdgkyNDAoJGlucCksJXIxMGQJCSMgcGFzcyByb3VuZHMKKwltb3YJJGlucCwlcmN4CQkjIHBhc3Mga2V5CisJbW92CSRvdXQsJXJheAkJIyBwYXNzIGtleSBzY2hlZHVsZQorCWNhbGwJX2JzYWVzX2tleV9jb252ZXJ0CisJcHhvcgkleG1tNiwleG1tNwkJIyBmaXggdXAgbGFzdCByb3VuZCBrZXkKKwltb3ZkcWEJJXhtbTcsKCVyYXgpCQkjIHNhdmUgbGFzdCByb3VuZCBrZXkKKwlyZXQKKy5zaXplCWJzYWVzX2VuY19rZXlfY29udmVydCwuLWJzYWVzX2VuY19rZXlfY29udmVydAorCisuZ2xvYmwJYnNhZXNfZW5jcnlwdF8xMjgKKy50eXBlCWJzYWVzX2VuY3J5cHRfMTI4LFxAZnVuY3Rpb24sNAorLmFsaWduCTE2Citic2Flc19lbmNyeXB0XzEyODoKKy5MZW5jMTI4X2xvb3A6CisJbW92ZHF1CTB4MDAoJGlucCksIEBYTU1bMF0JIyBsb2FkIGlucHV0CisJbW92ZHF1CTB4MTAoJGlucCksIEBYTU1bMV0KKwltb3ZkcXUJMHgyMCgkaW5wKSwgQFhNTVsyXQorCW1vdmRxdQkweDMwKCRpbnApLCBAWE1NWzNdCisJbW92ZHF1CTB4NDAoJGlucCksIEBYTU1bNF0KKwltb3ZkcXUJMHg1MCgkaW5wKSwgQFhNTVs1XQorCW1vdmRxdQkweDYwKCRpbnApLCBAWE1NWzZdCisJbW92ZHF1CTB4NzAoJGlucCksIEBYTU1bN10KKwltb3YJJGtleSwgJXJheAkJIyBwYXNzIHRoZSAka2V5CisJbGVhCTB4ODAoJGlucCksICRpbnAKKwltb3YJXCQxMCwlcjEwZAorCisJY2FsbAlfYnNhZXNfZW5jcnlwdDgKKworCW1vdmRxdQlAWE1NWzBdLCAweDAwKCRvdXQpCSMgd3JpdGUgb3V0cHV0CisJbW92ZHF1CUBYTU1bMV0sIDB4MTAoJG91dCkKKwltb3ZkcXUJQFhNTVs0XSwgMHgyMCgkb3V0KQorCW1vdmRxdQlAWE1NWzZdLCAweDMwKCRvdXQpCisJbW92ZHF1CUBYTU1bM10sIDB4NDAoJG91dCkKKwltb3ZkcXUJQFhNTVs3XSwgMHg1MCgkb3V0KQorCW1vdmRxdQlAWE1NWzJdLCAweDYwKCRvdXQpCisJbW92ZHF1CUBYTU1bNV0sIDB4NzAoJG91dCkKKwlsZWEJMHg4MCgkb3V0KSwgJG91dAorCXN1YglcJDB4ODAsJGxlbgorCWphCS5MZW5jMTI4X2xvb3AKKwlyZXQKKy5zaXplCWJzYWVzX2VuY3J5cHRfMTI4LC4tYnNhZXNfZW5jcnlwdF8xMjgKKworLmdsb2JsCWJzYWVzX2RlY19rZXlfY29udmVydAorLnR5cGUJYnNhZXNfZGVjX2tleV9jb252ZXJ0LFxAZnVuY3Rpb24sMgorLmFsaWduCTE2Citic2Flc19kZWNfa2V5X2NvbnZlcnQ6CisJbW92CTI0MCgkaW5wKSwlcjEwZAkJIyBwYXNzIHJvdW5kcworCW1vdgkkaW5wLCVyY3gJCSMgcGFzcyBrZXkKKwltb3YJJG91dCwlcmF4CQkjIHBhc3Mga2V5IHNjaGVkdWxlCisJY2FsbAlfYnNhZXNfa2V5X2NvbnZlcnQKKwlweG9yCSgkb3V0KSwleG1tNwkJIyBmaXggdXAgcm91bmQgMCBrZXkKKwltb3ZkcWEJJXhtbTYsKCVyYXgpCQkjIHNhdmUgbGFzdCByb3VuZCBrZXkKKwltb3ZkcWEJJXhtbTcsKCRvdXQpCisJcmV0Cisuc2l6ZQlic2Flc19kZWNfa2V5X2NvbnZlcnQsLi1ic2Flc19kZWNfa2V5X2NvbnZlcnQKKworLmdsb2JsCWJzYWVzX2RlY3J5cHRfMTI4CisudHlwZQlic2Flc19kZWNyeXB0XzEyOCxcQGZ1bmN0aW9uLDQKKy5hbGlnbgkxNgorYnNhZXNfZGVjcnlwdF8xMjg6CisuTGRlYzEyOF9sb29wOgorCW1vdmRxdQkweDAwKCRpbnApLCBAWE1NWzBdCSMgbG9hZCBpbnB1dAorCW1vdmRxdQkweDEwKCRpbnApLCBAWE1NWzFdCisJbW92ZHF1CTB4MjAoJGlucCksIEBYTU1bMl0KKwltb3ZkcXUJMHgzMCgkaW5wKSwgQFhNTVszXQorCW1vdmRxdQkweDQwKCRpbnApLCBAWE1NWzRdCisJbW92ZHF1CTB4NTAoJGlucCksIEBYTU1bNV0KKwltb3ZkcXUJMHg2MCgkaW5wKSwgQFhNTVs2XQorCW1vdmRxdQkweDcwKCRpbnApLCBAWE1NWzddCisJbW92CSRrZXksICVyYXgJCSMgcGFzcyB0aGUgJGtleQorCWxlYQkweDgwKCRpbnApLCAkaW5wCisJbW92CVwkMTAsJXIxMGQKKworCWNhbGwJX2JzYWVzX2RlY3J5cHQ4CisKKwltb3ZkcXUJQFhNTVswXSwgMHgwMCgkb3V0KQkjIHdyaXRlIG91dHB1dAorCW1vdmRxdQlAWE1NWzFdLCAweDEwKCRvdXQpCisJbW92ZHF1CUBYTU1bNl0sIDB4MjAoJG91dCkKKwltb3ZkcXUJQFhNTVs0XSwgMHgzMCgkb3V0KQorCW1vdmRxdQlAWE1NWzJdLCAweDQwKCRvdXQpCisJbW92ZHF1CUBYTU1bN10sIDB4NTAoJG91dCkKKwltb3ZkcXUJQFhNTVszXSwgMHg2MCgkb3V0KQorCW1vdmRxdQlAWE1NWzVdLCAweDcwKCRvdXQpCisJbGVhCTB4ODAoJG91dCksICRvdXQKKwlzdWIJXCQweDgwLCRsZW4KKwlqYQkuTGRlYzEyOF9sb29wCisJcmV0Cisuc2l6ZQlic2Flc19kZWNyeXB0XzEyOCwuLWJzYWVzX2RlY3J5cHRfMTI4CitfX18KK30KK3sKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgT3BlblNTTCBpbnRlcmZhY2UKKyMKK215ICgkYXJnMSwkYXJnMiwkYXJnMywkYXJnNCwkYXJnNSwkYXJnNik9JHdpbjY0CT8gKCIlcmN4IiwiJXJkeCIsIiVyOCIsIiVyOSIsIiVyMTAiLCIlcjExZCIpCisJCQkJCQk6ICgiJXJkaSIsIiVyc2kiLCIlcmR4IiwiJXJjeCIsIiVyOCIsIiVyOWQiKTsKK215ICgkaW5wLCRvdXQsJGxlbiwka2V5KT0oIiVyMTIiLCIlcjEzIiwiJXIxNCIsIiVyMTUiKTsKKworaWYgKCRlY2IpIHsKKyRjb2RlLj08PF9fXzsKKy5nbG9ibAlic2Flc19lY2JfZW5jcnlwdF9ibG9ja3MKKy50eXBlCWJzYWVzX2VjYl9lbmNyeXB0X2Jsb2NrcyxcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMTYKK2JzYWVzX2VjYl9lbmNyeXB0X2Jsb2NrczoKKwltb3YJJXJzcCwgJXJheAorLkxlY2JfZW5jX3Byb2xvZ3VlOgorCXB1c2gJJXJicAorCXB1c2gJJXJieAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCXB1c2gJJXIxNQorCWxlYQktMHg0OCglcnNwKSwlcnNwCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJHdpbjY0KTsKKwlsZWEJLTB4YTAoJXJzcCksICVyc3AKKwltb3ZhcHMJJXhtbTYsIDB4NDAoJXJzcCkKKwltb3ZhcHMJJXhtbTcsIDB4NTAoJXJzcCkKKwltb3ZhcHMJJXhtbTgsIDB4NjAoJXJzcCkKKwltb3ZhcHMJJXhtbTksIDB4NzAoJXJzcCkKKwltb3ZhcHMJJXhtbTEwLCAweDgwKCVyc3ApCisJbW92YXBzCSV4bW0xMSwgMHg5MCglcnNwKQorCW1vdmFwcwkleG1tMTIsIDB4YTAoJXJzcCkKKwltb3ZhcHMJJXhtbTEzLCAweGIwKCVyc3ApCisJbW92YXBzCSV4bW0xNCwgMHhjMCglcnNwKQorCW1vdmFwcwkleG1tMTUsIDB4ZDAoJXJzcCkKKy5MZWNiX2VuY19ib2R5OgorX19fCiskY29kZS49PDxfX187CisJbW92CSVyc3AsJXJicAkJIyBiYWNrdXAgJXJzcAorCW1vdgkyNDAoJGFyZzQpLCVlYXgJCSMgcm91bmRzCisJbW92CSRhcmcxLCRpbnAJCSMgYmFja3VwIGFyZ3VtZW50cworCW1vdgkkYXJnMiwkb3V0CisJbW92CSRhcmczLCRsZW4KKwltb3YJJGFyZzQsJGtleQorCWNtcAlcJDgsJGFyZzMKKwlqYgkuTGVjYl9lbmNfc2hvcnQKKworCW1vdgklZWF4LCVlYngJCSMgYmFja3VwIHJvdW5kcworCXNobAlcJDcsJXJheAkJIyAxMjggYnl0ZXMgcGVyIGlubmVyIHJvdW5kIGtleQorCXN1YglcJGAxMjgtMzJgLCVyYXgJCSMgc2l6ZSBvZiBiaXQtc2xpY2VkIGtleSBzY2hlZHVsZQorCXN1YgklcmF4LCVyc3AKKwltb3YJJXJzcCwlcmF4CQkjIHBhc3Mga2V5IHNjaGVkdWxlCisJbW92CSRrZXksJXJjeAkJIyBwYXNzIGtleQorCW1vdgklZWJ4LCVyMTBkCQkjIHBhc3Mgcm91bmRzCisJY2FsbAlfYnNhZXNfa2V5X2NvbnZlcnQKKwlweG9yCSV4bW02LCV4bW03CQkjIGZpeCB1cCBsYXN0IHJvdW5kIGtleQorCW1vdmRxYQkleG1tNywoJXJheCkJCSMgc2F2ZSBsYXN0IHJvdW5kIGtleQorCisJc3ViCVwkOCwkbGVuCisuTGVjYl9lbmNfbG9vcDoKKwltb3ZkcXUJMHgwMCgkaW5wKSwgQFhNTVswXQkjIGxvYWQgaW5wdXQKKwltb3ZkcXUJMHgxMCgkaW5wKSwgQFhNTVsxXQorCW1vdmRxdQkweDIwKCRpbnApLCBAWE1NWzJdCisJbW92ZHF1CTB4MzAoJGlucCksIEBYTU1bM10KKwltb3ZkcXUJMHg0MCgkaW5wKSwgQFhNTVs0XQorCW1vdmRxdQkweDUwKCRpbnApLCBAWE1NWzVdCisJbW92CSVyc3AsICVyYXgJCSMgcGFzcyBrZXkgc2NoZWR1bGUKKwltb3ZkcXUJMHg2MCgkaW5wKSwgQFhNTVs2XQorCW1vdgklZWJ4LCVyMTBkCQkjIHBhc3Mgcm91bmRzCisJbW92ZHF1CTB4NzAoJGlucCksIEBYTU1bN10KKwlsZWEJMHg4MCgkaW5wKSwgJGlucAorCisJY2FsbAlfYnNhZXNfZW5jcnlwdDgKKworCW1vdmRxdQlAWE1NWzBdLCAweDAwKCRvdXQpCSMgd3JpdGUgb3V0cHV0CisJbW92ZHF1CUBYTU1bMV0sIDB4MTAoJG91dCkKKwltb3ZkcXUJQFhNTVs0XSwgMHgyMCgkb3V0KQorCW1vdmRxdQlAWE1NWzZdLCAweDMwKCRvdXQpCisJbW92ZHF1CUBYTU1bM10sIDB4NDAoJG91dCkKKwltb3ZkcXUJQFhNTVs3XSwgMHg1MCgkb3V0KQorCW1vdmRxdQlAWE1NWzJdLCAweDYwKCRvdXQpCisJbW92ZHF1CUBYTU1bNV0sIDB4NzAoJG91dCkKKwlsZWEJMHg4MCgkb3V0KSwgJG91dAorCXN1YglcJDgsJGxlbgorCWpuYwkuTGVjYl9lbmNfbG9vcAorCisJYWRkCVwkOCwkbGVuCisJanoJLkxlY2JfZW5jX2RvbmUKKworCW1vdmRxdQkweDAwKCRpbnApLCBAWE1NWzBdCSMgbG9hZCBpbnB1dAorCW1vdgklcnNwLCAlcmF4CQkjIHBhc3Mga2V5IHNjaGVkdWxlCisJbW92CSVlYngsJXIxMGQJCSMgcGFzcyByb3VuZHMKKwljbXAJXCQyLCRsZW4KKwlqYgkuTGVjYl9lbmNfb25lCisJbW92ZHF1CTB4MTAoJGlucCksIEBYTU1bMV0KKwlqZQkuTGVjYl9lbmNfdHdvCisJbW92ZHF1CTB4MjAoJGlucCksIEBYTU1bMl0KKwljbXAJXCQ0LCRsZW4KKwlqYgkuTGVjYl9lbmNfdGhyZWUKKwltb3ZkcXUJMHgzMCgkaW5wKSwgQFhNTVszXQorCWplCS5MZWNiX2VuY19mb3VyCisJbW92ZHF1CTB4NDAoJGlucCksIEBYTU1bNF0KKwljbXAJXCQ2LCRsZW4KKwlqYgkuTGVjYl9lbmNfZml2ZQorCW1vdmRxdQkweDUwKCRpbnApLCBAWE1NWzVdCisJamUJLkxlY2JfZW5jX3NpeAorCW1vdmRxdQkweDYwKCRpbnApLCBAWE1NWzZdCisJY2FsbAlfYnNhZXNfZW5jcnlwdDgKKwltb3ZkcXUJQFhNTVswXSwgMHgwMCgkb3V0KQkjIHdyaXRlIG91dHB1dAorCW1vdmRxdQlAWE1NWzFdLCAweDEwKCRvdXQpCisJbW92ZHF1CUBYTU1bNF0sIDB4MjAoJG91dCkKKwltb3ZkcXUJQFhNTVs2XSwgMHgzMCgkb3V0KQorCW1vdmRxdQlAWE1NWzNdLCAweDQwKCRvdXQpCisJbW92ZHF1CUBYTU1bN10sIDB4NTAoJG91dCkKKwltb3ZkcXUJQFhNTVsyXSwgMHg2MCgkb3V0KQorCWptcAkuTGVjYl9lbmNfZG9uZQorLmFsaWduCTE2CisuTGVjYl9lbmNfc2l4OgorCWNhbGwJX2JzYWVzX2VuY3J5cHQ4CisJbW92ZHF1CUBYTU1bMF0sIDB4MDAoJG91dCkJIyB3cml0ZSBvdXRwdXQKKwltb3ZkcXUJQFhNTVsxXSwgMHgxMCgkb3V0KQorCW1vdmRxdQlAWE1NWzRdLCAweDIwKCRvdXQpCisJbW92ZHF1CUBYTU1bNl0sIDB4MzAoJG91dCkKKwltb3ZkcXUJQFhNTVszXSwgMHg0MCgkb3V0KQorCW1vdmRxdQlAWE1NWzddLCAweDUwKCRvdXQpCisJam1wCS5MZWNiX2VuY19kb25lCisuYWxpZ24JMTYKKy5MZWNiX2VuY19maXZlOgorCWNhbGwJX2JzYWVzX2VuY3J5cHQ4CisJbW92ZHF1CUBYTU1bMF0sIDB4MDAoJG91dCkJIyB3cml0ZSBvdXRwdXQKKwltb3ZkcXUJQFhNTVsxXSwgMHgxMCgkb3V0KQorCW1vdmRxdQlAWE1NWzRdLCAweDIwKCRvdXQpCisJbW92ZHF1CUBYTU1bNl0sIDB4MzAoJG91dCkKKwltb3ZkcXUJQFhNTVszXSwgMHg0MCgkb3V0KQorCWptcAkuTGVjYl9lbmNfZG9uZQorLmFsaWduCTE2CisuTGVjYl9lbmNfZm91cjoKKwljYWxsCV9ic2Flc19lbmNyeXB0OAorCW1vdmRxdQlAWE1NWzBdLCAweDAwKCRvdXQpCSMgd3JpdGUgb3V0cHV0CisJbW92ZHF1CUBYTU1bMV0sIDB4MTAoJG91dCkKKwltb3ZkcXUJQFhNTVs0XSwgMHgyMCgkb3V0KQorCW1vdmRxdQlAWE1NWzZdLCAweDMwKCRvdXQpCisJam1wCS5MZWNiX2VuY19kb25lCisuYWxpZ24JMTYKKy5MZWNiX2VuY190aHJlZToKKwljYWxsCV9ic2Flc19lbmNyeXB0OAorCW1vdmRxdQlAWE1NWzBdLCAweDAwKCRvdXQpCSMgd3JpdGUgb3V0cHV0CisJbW92ZHF1CUBYTU1bMV0sIDB4MTAoJG91dCkKKwltb3ZkcXUJQFhNTVs0XSwgMHgyMCgkb3V0KQorCWptcAkuTGVjYl9lbmNfZG9uZQorLmFsaWduCTE2CisuTGVjYl9lbmNfdHdvOgorCWNhbGwJX2JzYWVzX2VuY3J5cHQ4CisJbW92ZHF1CUBYTU1bMF0sIDB4MDAoJG91dCkJIyB3cml0ZSBvdXRwdXQKKwltb3ZkcXUJQFhNTVsxXSwgMHgxMCgkb3V0KQorCWptcAkuTGVjYl9lbmNfZG9uZQorLmFsaWduCTE2CisuTGVjYl9lbmNfb25lOgorCWNhbGwJX2JzYWVzX2VuY3J5cHQ4CisJbW92ZHF1CUBYTU1bMF0sIDB4MDAoJG91dCkJIyB3cml0ZSBvdXRwdXQKKwlqbXAJLkxlY2JfZW5jX2RvbmUKKy5hbGlnbgkxNgorLkxlY2JfZW5jX3Nob3J0OgorCWxlYQkoJGlucCksICRhcmcxCisJbGVhCSgkb3V0KSwgJGFyZzIKKwlsZWEJKCRrZXkpLCAkYXJnMworCWNhbGwJYXNtX0FFU19lbmNyeXB0CisJbGVhCTE2KCRpbnApLCAkaW5wCisJbGVhCTE2KCRvdXQpLCAkb3V0CisJZGVjCSRsZW4KKwlqbnoJLkxlY2JfZW5jX3Nob3J0CisKKy5MZWNiX2VuY19kb25lOgorCWxlYQkoJXJzcCksJXJheAorCXB4b3IJJXhtbTAsICV4bW0wCisuTGVjYl9lbmNfYnplcm86CQkJIyB3aXBlIGtleSBzY2hlZHVsZSBbaWYgYW55XQorCW1vdmRxYQkleG1tMCwgMHgwMCglcmF4KQorCW1vdmRxYQkleG1tMCwgMHgxMCglcmF4KQorCWxlYQkweDIwKCVyYXgpLCAlcmF4CisJY21wCSVyYXgsICVyYnAKKwlqYgkuTGVjYl9lbmNfYnplcm8KKworCWxlYQkoJXJicCksJXJzcAkJIyByZXN0b3JlICVyc3AKK19fXworJGNvZGUuPTw8X19fIGlmICgkd2luNjQpOworCW1vdmFwcwkweDQwKCVyYnApLCAleG1tNgorCW1vdmFwcwkweDUwKCVyYnApLCAleG1tNworCW1vdmFwcwkweDYwKCVyYnApLCAleG1tOAorCW1vdmFwcwkweDcwKCVyYnApLCAleG1tOQorCW1vdmFwcwkweDgwKCVyYnApLCAleG1tMTAKKwltb3ZhcHMJMHg5MCglcmJwKSwgJXhtbTExCisJbW92YXBzCTB4YTAoJXJicCksICV4bW0xMgorCW1vdmFwcwkweGIwKCVyYnApLCAleG1tMTMKKwltb3ZhcHMJMHhjMCglcmJwKSwgJXhtbTE0CisJbW92YXBzCTB4ZDAoJXJicCksICV4bW0xNQorCWxlYQkweGEwKCVyYnApLCAlcnNwCitfX18KKyRjb2RlLj08PF9fXzsKKwltb3YJMHg0OCglcnNwKSwgJXIxNQorCW1vdgkweDUwKCVyc3ApLCAlcjE0CisJbW92CTB4NTgoJXJzcCksICVyMTMKKwltb3YJMHg2MCglcnNwKSwgJXIxMgorCW1vdgkweDY4KCVyc3ApLCAlcmJ4CisJbW92CTB4NzAoJXJzcCksICVyYXgKKwlsZWEJMHg3OCglcnNwKSwgJXJzcAorCW1vdgklcmF4LCAlcmJwCisuTGVjYl9lbmNfZXBpbG9ndWU6CisJcmV0Cisuc2l6ZQlic2Flc19lY2JfZW5jcnlwdF9ibG9ja3MsLi1ic2Flc19lY2JfZW5jcnlwdF9ibG9ja3MKKworLmdsb2JsCWJzYWVzX2VjYl9kZWNyeXB0X2Jsb2NrcworLnR5cGUJYnNhZXNfZWNiX2RlY3J5cHRfYmxvY2tzLFxAYWJpLW9tbmlwb3RlbnQKKy5hbGlnbgkxNgorYnNhZXNfZWNiX2RlY3J5cHRfYmxvY2tzOgorCW1vdgklcnNwLCAlcmF4CisuTGVjYl9kZWNfcHJvbG9ndWU6CisJcHVzaAklcmJwCisJcHVzaAklcmJ4CisJcHVzaAklcjEyCisJcHVzaAklcjEzCisJcHVzaAklcjE0CisJcHVzaAklcjE1CisJbGVhCS0weDQ4KCVyc3ApLCVyc3AKK19fXworJGNvZGUuPTw8X19fIGlmICgkd2luNjQpOworCWxlYQktMHhhMCglcnNwKSwgJXJzcAorCW1vdmFwcwkleG1tNiwgMHg0MCglcnNwKQorCW1vdmFwcwkleG1tNywgMHg1MCglcnNwKQorCW1vdmFwcwkleG1tOCwgMHg2MCglcnNwKQorCW1vdmFwcwkleG1tOSwgMHg3MCglcnNwKQorCW1vdmFwcwkleG1tMTAsIDB4ODAoJXJzcCkKKwltb3ZhcHMJJXhtbTExLCAweDkwKCVyc3ApCisJbW92YXBzCSV4bW0xMiwgMHhhMCglcnNwKQorCW1vdmFwcwkleG1tMTMsIDB4YjAoJXJzcCkKKwltb3ZhcHMJJXhtbTE0LCAweGMwKCVyc3ApCisJbW92YXBzCSV4bW0xNSwgMHhkMCglcnNwKQorLkxlY2JfZGVjX2JvZHk6CitfX18KKyRjb2RlLj08PF9fXzsKKwltb3YJJXJzcCwlcmJwCQkjIGJhY2t1cCAlcnNwCisJbW92CTI0MCgkYXJnNCksJWVheAkJIyByb3VuZHMKKwltb3YJJGFyZzEsJGlucAkJIyBiYWNrdXAgYXJndW1lbnRzCisJbW92CSRhcmcyLCRvdXQKKwltb3YJJGFyZzMsJGxlbgorCW1vdgkkYXJnNCwka2V5CisJY21wCVwkOCwkYXJnMworCWpiCS5MZWNiX2RlY19zaG9ydAorCisJbW92CSVlYXgsJWVieAkJIyBiYWNrdXAgcm91bmRzCisJc2hsCVwkNywlcmF4CQkjIDEyOCBieXRlcyBwZXIgaW5uZXIgcm91bmQga2V5CisJc3ViCVwkYDEyOC0zMmAsJXJheAkJIyBzaXplIG9mIGJpdC1zbGljZWQga2V5IHNjaGVkdWxlCisJc3ViCSVyYXgsJXJzcAorCW1vdgklcnNwLCVyYXgJCSMgcGFzcyBrZXkgc2NoZWR1bGUKKwltb3YJJGtleSwlcmN4CQkjIHBhc3Mga2V5CisJbW92CSVlYngsJXIxMGQJCSMgcGFzcyByb3VuZHMKKwljYWxsCV9ic2Flc19rZXlfY29udmVydAorCXB4b3IJKCVyc3ApLCV4bW03CQkjIGZpeCB1cCAwIHJvdW5kIGtleQorCW1vdmRxYQkleG1tNiwoJXJheCkJCSMgc2F2ZSBsYXN0IHJvdW5kIGtleQorCW1vdmRxYQkleG1tNywoJXJzcCkKKworCXN1YglcJDgsJGxlbgorLkxlY2JfZGVjX2xvb3A6CisJbW92ZHF1CTB4MDAoJGlucCksIEBYTU1bMF0JIyBsb2FkIGlucHV0CisJbW92ZHF1CTB4MTAoJGlucCksIEBYTU1bMV0KKwltb3ZkcXUJMHgyMCgkaW5wKSwgQFhNTVsyXQorCW1vdmRxdQkweDMwKCRpbnApLCBAWE1NWzNdCisJbW92ZHF1CTB4NDAoJGlucCksIEBYTU1bNF0KKwltb3ZkcXUJMHg1MCgkaW5wKSwgQFhNTVs1XQorCW1vdgklcnNwLCAlcmF4CQkjIHBhc3Mga2V5IHNjaGVkdWxlCisJbW92ZHF1CTB4NjAoJGlucCksIEBYTU1bNl0KKwltb3YJJWVieCwlcjEwZAkJIyBwYXNzIHJvdW5kcworCW1vdmRxdQkweDcwKCRpbnApLCBAWE1NWzddCisJbGVhCTB4ODAoJGlucCksICRpbnAKKworCWNhbGwJX2JzYWVzX2RlY3J5cHQ4CisKKwltb3ZkcXUJQFhNTVswXSwgMHgwMCgkb3V0KQkjIHdyaXRlIG91dHB1dAorCW1vdmRxdQlAWE1NWzFdLCAweDEwKCRvdXQpCisJbW92ZHF1CUBYTU1bNl0sIDB4MjAoJG91dCkKKwltb3ZkcXUJQFhNTVs0XSwgMHgzMCgkb3V0KQorCW1vdmRxdQlAWE1NWzJdLCAweDQwKCRvdXQpCisJbW92ZHF1CUBYTU1bN10sIDB4NTAoJG91dCkKKwltb3ZkcXUJQFhNTVszXSwgMHg2MCgkb3V0KQorCW1vdmRxdQlAWE1NWzVdLCAweDcwKCRvdXQpCisJbGVhCTB4ODAoJG91dCksICRvdXQKKwlzdWIJXCQ4LCRsZW4KKwlqbmMJLkxlY2JfZGVjX2xvb3AKKworCWFkZAlcJDgsJGxlbgorCWp6CS5MZWNiX2RlY19kb25lCisKKwltb3ZkcXUJMHgwMCgkaW5wKSwgQFhNTVswXQkjIGxvYWQgaW5wdXQKKwltb3YJJXJzcCwgJXJheAkJIyBwYXNzIGtleSBzY2hlZHVsZQorCW1vdgklZWJ4LCVyMTBkCQkjIHBhc3Mgcm91bmRzCisJY21wCVwkMiwkbGVuCisJamIJLkxlY2JfZGVjX29uZQorCW1vdmRxdQkweDEwKCRpbnApLCBAWE1NWzFdCisJamUJLkxlY2JfZGVjX3R3bworCW1vdmRxdQkweDIwKCRpbnApLCBAWE1NWzJdCisJY21wCVwkNCwkbGVuCisJamIJLkxlY2JfZGVjX3RocmVlCisJbW92ZHF1CTB4MzAoJGlucCksIEBYTU1bM10KKwlqZQkuTGVjYl9kZWNfZm91cgorCW1vdmRxdQkweDQwKCRpbnApLCBAWE1NWzRdCisJY21wCVwkNiwkbGVuCisJamIJLkxlY2JfZGVjX2ZpdmUKKwltb3ZkcXUJMHg1MCgkaW5wKSwgQFhNTVs1XQorCWplCS5MZWNiX2RlY19zaXgKKwltb3ZkcXUJMHg2MCgkaW5wKSwgQFhNTVs2XQorCWNhbGwJX2JzYWVzX2RlY3J5cHQ4CisJbW92ZHF1CUBYTU1bMF0sIDB4MDAoJG91dCkJIyB3cml0ZSBvdXRwdXQKKwltb3ZkcXUJQFhNTVsxXSwgMHgxMCgkb3V0KQorCW1vdmRxdQlAWE1NWzZdLCAweDIwKCRvdXQpCisJbW92ZHF1CUBYTU1bNF0sIDB4MzAoJG91dCkKKwltb3ZkcXUJQFhNTVsyXSwgMHg0MCgkb3V0KQorCW1vdmRxdQlAWE1NWzddLCAweDUwKCRvdXQpCisJbW92ZHF1CUBYTU1bM10sIDB4NjAoJG91dCkKKwlqbXAJLkxlY2JfZGVjX2RvbmUKKy5hbGlnbgkxNgorLkxlY2JfZGVjX3NpeDoKKwljYWxsCV9ic2Flc19kZWNyeXB0OAorCW1vdmRxdQlAWE1NWzBdLCAweDAwKCRvdXQpCSMgd3JpdGUgb3V0cHV0CisJbW92ZHF1CUBYTU1bMV0sIDB4MTAoJG91dCkKKwltb3ZkcXUJQFhNTVs2XSwgMHgyMCgkb3V0KQorCW1vdmRxdQlAWE1NWzRdLCAweDMwKCRvdXQpCisJbW92ZHF1CUBYTU1bMl0sIDB4NDAoJG91dCkKKwltb3ZkcXUJQFhNTVs3XSwgMHg1MCgkb3V0KQorCWptcAkuTGVjYl9kZWNfZG9uZQorLmFsaWduCTE2CisuTGVjYl9kZWNfZml2ZToKKwljYWxsCV9ic2Flc19kZWNyeXB0OAorCW1vdmRxdQlAWE1NWzBdLCAweDAwKCRvdXQpCSMgd3JpdGUgb3V0cHV0CisJbW92ZHF1CUBYTU1bMV0sIDB4MTAoJG91dCkKKwltb3ZkcXUJQFhNTVs2XSwgMHgyMCgkb3V0KQorCW1vdmRxdQlAWE1NWzRdLCAweDMwKCRvdXQpCisJbW92ZHF1CUBYTU1bMl0sIDB4NDAoJG91dCkKKwlqbXAJLkxlY2JfZGVjX2RvbmUKKy5hbGlnbgkxNgorLkxlY2JfZGVjX2ZvdXI6CisJY2FsbAlfYnNhZXNfZGVjcnlwdDgKKwltb3ZkcXUJQFhNTVswXSwgMHgwMCgkb3V0KQkjIHdyaXRlIG91dHB1dAorCW1vdmRxdQlAWE1NWzFdLCAweDEwKCRvdXQpCisJbW92ZHF1CUBYTU1bNl0sIDB4MjAoJG91dCkKKwltb3ZkcXUJQFhNTVs0XSwgMHgzMCgkb3V0KQorCWptcAkuTGVjYl9kZWNfZG9uZQorLmFsaWduCTE2CisuTGVjYl9kZWNfdGhyZWU6CisJY2FsbAlfYnNhZXNfZGVjcnlwdDgKKwltb3ZkcXUJQFhNTVswXSwgMHgwMCgkb3V0KQkjIHdyaXRlIG91dHB1dAorCW1vdmRxdQlAWE1NWzFdLCAweDEwKCRvdXQpCisJbW92ZHF1CUBYTU1bNl0sIDB4MjAoJG91dCkKKwlqbXAJLkxlY2JfZGVjX2RvbmUKKy5hbGlnbgkxNgorLkxlY2JfZGVjX3R3bzoKKwljYWxsCV9ic2Flc19kZWNyeXB0OAorCW1vdmRxdQlAWE1NWzBdLCAweDAwKCRvdXQpCSMgd3JpdGUgb3V0cHV0CisJbW92ZHF1CUBYTU1bMV0sIDB4MTAoJG91dCkKKwlqbXAJLkxlY2JfZGVjX2RvbmUKKy5hbGlnbgkxNgorLkxlY2JfZGVjX29uZToKKwljYWxsCV9ic2Flc19kZWNyeXB0OAorCW1vdmRxdQlAWE1NWzBdLCAweDAwKCRvdXQpCSMgd3JpdGUgb3V0cHV0CisJam1wCS5MZWNiX2RlY19kb25lCisuYWxpZ24JMTYKKy5MZWNiX2RlY19zaG9ydDoKKwlsZWEJKCRpbnApLCAkYXJnMQorCWxlYQkoJG91dCksICRhcmcyCisJbGVhCSgka2V5KSwgJGFyZzMKKwljYWxsCWFzbV9BRVNfZGVjcnlwdAorCWxlYQkxNigkaW5wKSwgJGlucAorCWxlYQkxNigkb3V0KSwgJG91dAorCWRlYwkkbGVuCisJam56CS5MZWNiX2RlY19zaG9ydAorCisuTGVjYl9kZWNfZG9uZToKKwlsZWEJKCVyc3ApLCVyYXgKKwlweG9yCSV4bW0wLCAleG1tMAorLkxlY2JfZGVjX2J6ZXJvOgkJCSMgd2lwZSBrZXkgc2NoZWR1bGUgW2lmIGFueV0KKwltb3ZkcWEJJXhtbTAsIDB4MDAoJXJheCkKKwltb3ZkcWEJJXhtbTAsIDB4MTAoJXJheCkKKwlsZWEJMHgyMCglcmF4KSwgJXJheAorCWNtcAklcmF4LCAlcmJwCisJamIJLkxlY2JfZGVjX2J6ZXJvCisKKwlsZWEJKCVyYnApLCVyc3AJCSMgcmVzdG9yZSAlcnNwCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJHdpbjY0KTsKKwltb3ZhcHMJMHg0MCglcmJwKSwgJXhtbTYKKwltb3ZhcHMJMHg1MCglcmJwKSwgJXhtbTcKKwltb3ZhcHMJMHg2MCglcmJwKSwgJXhtbTgKKwltb3ZhcHMJMHg3MCglcmJwKSwgJXhtbTkKKwltb3ZhcHMJMHg4MCglcmJwKSwgJXhtbTEwCisJbW92YXBzCTB4OTAoJXJicCksICV4bW0xMQorCW1vdmFwcwkweGEwKCVyYnApLCAleG1tMTIKKwltb3ZhcHMJMHhiMCglcmJwKSwgJXhtbTEzCisJbW92YXBzCTB4YzAoJXJicCksICV4bW0xNAorCW1vdmFwcwkweGQwKCVyYnApLCAleG1tMTUKKwlsZWEJMHhhMCglcmJwKSwgJXJzcAorX19fCiskY29kZS49PDxfX187CisJbW92CTB4NDgoJXJzcCksICVyMTUKKwltb3YJMHg1MCglcnNwKSwgJXIxNAorCW1vdgkweDU4KCVyc3ApLCAlcjEzCisJbW92CTB4NjAoJXJzcCksICVyMTIKKwltb3YJMHg2OCglcnNwKSwgJXJieAorCW1vdgkweDcwKCVyc3ApLCAlcmF4CisJbGVhCTB4NzgoJXJzcCksICVyc3AKKwltb3YJJXJheCwgJXJicAorLkxlY2JfZGVjX2VwaWxvZ3VlOgorCXJldAorLnNpemUJYnNhZXNfZWNiX2RlY3J5cHRfYmxvY2tzLC4tYnNhZXNfZWNiX2RlY3J5cHRfYmxvY2tzCitfX18KK30KKyRjb2RlLj08PF9fXzsKKy5leHRlcm4JYXNtX0FFU19jYmNfZW5jcnlwdAorLmdsb2JsCWJzYWVzX2NiY19lbmNyeXB0CisudHlwZQlic2Flc19jYmNfZW5jcnlwdCxcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMTYKK2JzYWVzX2NiY19lbmNyeXB0OgorX19fCiskY29kZS49PDxfX18gaWYgKCR3aW42NCk7CisJbW92CTQ4KCVyc3ApLCRhcmc2CQkjIHB1bGwgZGlyZWN0aW9uIGZsYWcKK19fXworJGNvZGUuPTw8X19fOworCWNtcAlcJDAsJGFyZzYKKwlqbmUJYXNtX0FFU19jYmNfZW5jcnlwdAorCWNtcAlcJDEyOCwkYXJnMworCWpiCWFzbV9BRVNfY2JjX2VuY3J5cHQKKworCW1vdgklcnNwLCAlcmF4CisuTGNiY19kZWNfcHJvbG9ndWU6CisJcHVzaAklcmJwCisJcHVzaAklcmJ4CisJcHVzaAklcjEyCisJcHVzaAklcjEzCisJcHVzaAklcjE0CisJcHVzaAklcjE1CisJbGVhCS0weDQ4KCVyc3ApLCAlcnNwCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJHdpbjY0KTsKKwltb3YJMHhhMCglcnNwKSwkYXJnNQkjIHB1bGwgaXZwCisJbGVhCS0weGEwKCVyc3ApLCAlcnNwCisJbW92YXBzCSV4bW02LCAweDQwKCVyc3ApCisJbW92YXBzCSV4bW03LCAweDUwKCVyc3ApCisJbW92YXBzCSV4bW04LCAweDYwKCVyc3ApCisJbW92YXBzCSV4bW05LCAweDcwKCVyc3ApCisJbW92YXBzCSV4bW0xMCwgMHg4MCglcnNwKQorCW1vdmFwcwkleG1tMTEsIDB4OTAoJXJzcCkKKwltb3ZhcHMJJXhtbTEyLCAweGEwKCVyc3ApCisJbW92YXBzCSV4bW0xMywgMHhiMCglcnNwKQorCW1vdmFwcwkleG1tMTQsIDB4YzAoJXJzcCkKKwltb3ZhcHMJJXhtbTE1LCAweGQwKCVyc3ApCisuTGNiY19kZWNfYm9keToKK19fXworJGNvZGUuPTw8X19fOworCW1vdgklcnNwLCAlcmJwCQkjIGJhY2t1cCAlcnNwCisJbW92CTI0MCgkYXJnNCksICVlYXgJIyByb3VuZHMKKwltb3YJJGFyZzEsICRpbnAJCSMgYmFja3VwIGFyZ3VtZW50cworCW1vdgkkYXJnMiwgJG91dAorCW1vdgkkYXJnMywgJGxlbgorCW1vdgkkYXJnNCwgJGtleQorCW1vdgkkYXJnNSwgJXJieAorCXNocglcJDQsICRsZW4JCSMgYnl0ZXMgdG8gYmxvY2tzCisKKwltb3YJJWVheCwgJWVkeAkJIyByb3VuZHMKKwlzaGwJXCQ3LCAlcmF4CQkjIDEyOCBieXRlcyBwZXIgaW5uZXIgcm91bmQga2V5CisJc3ViCVwkYDEyOC0zMmAsICVyYXgJIyBzaXplIG9mIGJpdC1zbGljZWQga2V5IHNjaGVkdWxlCisJc3ViCSVyYXgsICVyc3AKKworCW1vdgklcnNwLCAlcmF4CQkjIHBhc3Mga2V5IHNjaGVkdWxlCisJbW92CSRrZXksICVyY3gJCSMgcGFzcyBrZXkKKwltb3YJJWVkeCwgJXIxMGQJCSMgcGFzcyByb3VuZHMKKwljYWxsCV9ic2Flc19rZXlfY29udmVydAorCXB4b3IJKCVyc3ApLCV4bW03CQkjIGZpeCB1cCAwIHJvdW5kIGtleQorCW1vdmRxYQkleG1tNiwoJXJheCkJCSMgc2F2ZSBsYXN0IHJvdW5kIGtleQorCW1vdmRxYQkleG1tNywoJXJzcCkKKworCW1vdmRxdQkoJXJieCksIEBYTU1bMTVdCSMgbG9hZCBJVgorCXN1YglcJDgsJGxlbgorLkxjYmNfZGVjX2xvb3A6CisJbW92ZHF1CTB4MDAoJGlucCksIEBYTU1bMF0JIyBsb2FkIGlucHV0CisJbW92ZHF1CTB4MTAoJGlucCksIEBYTU1bMV0KKwltb3ZkcXUJMHgyMCgkaW5wKSwgQFhNTVsyXQorCW1vdmRxdQkweDMwKCRpbnApLCBAWE1NWzNdCisJbW92ZHF1CTB4NDAoJGlucCksIEBYTU1bNF0KKwltb3ZkcXUJMHg1MCgkaW5wKSwgQFhNTVs1XQorCW1vdgklcnNwLCAlcmF4CQkjIHBhc3Mga2V5IHNjaGVkdWxlCisJbW92ZHF1CTB4NjAoJGlucCksIEBYTU1bNl0KKwltb3YJJWVkeCwlcjEwZAkJIyBwYXNzIHJvdW5kcworCW1vdmRxdQkweDcwKCRpbnApLCBAWE1NWzddCisJbW92ZHFhCUBYTU1bMTVdLCAweDIwKCVyYnApCSMgcHV0IGFzaWRlIElWCisKKwljYWxsCV9ic2Flc19kZWNyeXB0OAorCisJcHhvcgkweDIwKCVyYnApLCBAWE1NWzBdCSMgXj0gSVYKKwltb3ZkcXUJMHgwMCgkaW5wKSwgQFhNTVs4XQkjIHJlLWxvYWQgaW5wdXQKKwltb3ZkcXUJMHgxMCgkaW5wKSwgQFhNTVs5XQorCXB4b3IJQFhNTVs4XSwgQFhNTVsxXQorCW1vdmRxdQkweDIwKCRpbnApLCBAWE1NWzEwXQorCXB4b3IJQFhNTVs5XSwgQFhNTVs2XQorCW1vdmRxdQkweDMwKCRpbnApLCBAWE1NWzExXQorCXB4b3IJQFhNTVsxMF0sIEBYTU1bNF0KKwltb3ZkcXUJMHg0MCgkaW5wKSwgQFhNTVsxMl0KKwlweG9yCUBYTU1bMTFdLCBAWE1NWzJdCisJbW92ZHF1CTB4NTAoJGlucCksIEBYTU1bMTNdCisJcHhvcglAWE1NWzEyXSwgQFhNTVs3XQorCW1vdmRxdQkweDYwKCRpbnApLCBAWE1NWzE0XQorCXB4b3IJQFhNTVsxM10sIEBYTU1bM10KKwltb3ZkcXUJMHg3MCgkaW5wKSwgQFhNTVsxNV0JIyBJVgorCXB4b3IJQFhNTVsxNF0sIEBYTU1bNV0KKwltb3ZkcXUJQFhNTVswXSwgMHgwMCgkb3V0KQkjIHdyaXRlIG91dHB1dAorCWxlYQkweDgwKCRpbnApLCAkaW5wCisJbW92ZHF1CUBYTU1bMV0sIDB4MTAoJG91dCkKKwltb3ZkcXUJQFhNTVs2XSwgMHgyMCgkb3V0KQorCW1vdmRxdQlAWE1NWzRdLCAweDMwKCRvdXQpCisJbW92ZHF1CUBYTU1bMl0sIDB4NDAoJG91dCkKKwltb3ZkcXUJQFhNTVs3XSwgMHg1MCgkb3V0KQorCW1vdmRxdQlAWE1NWzNdLCAweDYwKCRvdXQpCisJbW92ZHF1CUBYTU1bNV0sIDB4NzAoJG91dCkKKwlsZWEJMHg4MCgkb3V0KSwgJG91dAorCXN1YglcJDgsJGxlbgorCWpuYwkuTGNiY19kZWNfbG9vcAorCisJYWRkCVwkOCwkbGVuCisJanoJLkxjYmNfZGVjX2RvbmUKKworCW1vdmRxdQkweDAwKCRpbnApLCBAWE1NWzBdCSMgbG9hZCBpbnB1dAorCW1vdgklcnNwLCAlcmF4CQkjIHBhc3Mga2V5IHNjaGVkdWxlCisJbW92CSVlZHgsICVyMTBkCQkjIHBhc3Mgcm91bmRzCisJY21wCVwkMiwkbGVuCisJamIJLkxjYmNfZGVjX29uZQorCW1vdmRxdQkweDEwKCRpbnApLCBAWE1NWzFdCisJamUJLkxjYmNfZGVjX3R3bworCW1vdmRxdQkweDIwKCRpbnApLCBAWE1NWzJdCisJY21wCVwkNCwkbGVuCisJamIJLkxjYmNfZGVjX3RocmVlCisJbW92ZHF1CTB4MzAoJGlucCksIEBYTU1bM10KKwlqZQkuTGNiY19kZWNfZm91cgorCW1vdmRxdQkweDQwKCRpbnApLCBAWE1NWzRdCisJY21wCVwkNiwkbGVuCisJamIJLkxjYmNfZGVjX2ZpdmUKKwltb3ZkcXUJMHg1MCgkaW5wKSwgQFhNTVs1XQorCWplCS5MY2JjX2RlY19zaXgKKwltb3ZkcXUJMHg2MCgkaW5wKSwgQFhNTVs2XQorCW1vdmRxYQlAWE1NWzE1XSwgMHgyMCglcmJwKQkjIHB1dCBhc2lkZSBJVgorCWNhbGwJX2JzYWVzX2RlY3J5cHQ4CisJcHhvcgkweDIwKCVyYnApLCBAWE1NWzBdCSMgXj0gSVYKKwltb3ZkcXUJMHgwMCgkaW5wKSwgQFhNTVs4XQkjIHJlLWxvYWQgaW5wdXQKKwltb3ZkcXUJMHgxMCgkaW5wKSwgQFhNTVs5XQorCXB4b3IJQFhNTVs4XSwgQFhNTVsxXQorCW1vdmRxdQkweDIwKCRpbnApLCBAWE1NWzEwXQorCXB4b3IJQFhNTVs5XSwgQFhNTVs2XQorCW1vdmRxdQkweDMwKCRpbnApLCBAWE1NWzExXQorCXB4b3IJQFhNTVsxMF0sIEBYTU1bNF0KKwltb3ZkcXUJMHg0MCgkaW5wKSwgQFhNTVsxMl0KKwlweG9yCUBYTU1bMTFdLCBAWE1NWzJdCisJbW92ZHF1CTB4NTAoJGlucCksIEBYTU1bMTNdCisJcHhvcglAWE1NWzEyXSwgQFhNTVs3XQorCW1vdmRxdQkweDYwKCRpbnApLCBAWE1NWzE1XQkjIElWCisJcHhvcglAWE1NWzEzXSwgQFhNTVszXQorCW1vdmRxdQlAWE1NWzBdLCAweDAwKCRvdXQpCSMgd3JpdGUgb3V0cHV0CisJbW92ZHF1CUBYTU1bMV0sIDB4MTAoJG91dCkKKwltb3ZkcXUJQFhNTVs2XSwgMHgyMCgkb3V0KQorCW1vdmRxdQlAWE1NWzRdLCAweDMwKCRvdXQpCisJbW92ZHF1CUBYTU1bMl0sIDB4NDAoJG91dCkKKwltb3ZkcXUJQFhNTVs3XSwgMHg1MCgkb3V0KQorCW1vdmRxdQlAWE1NWzNdLCAweDYwKCRvdXQpCisJam1wCS5MY2JjX2RlY19kb25lCisuYWxpZ24JMTYKKy5MY2JjX2RlY19zaXg6CisJbW92ZHFhCUBYTU1bMTVdLCAweDIwKCVyYnApCSMgcHV0IGFzaWRlIElWCisJY2FsbAlfYnNhZXNfZGVjcnlwdDgKKwlweG9yCTB4MjAoJXJicCksIEBYTU1bMF0JIyBePSBJVgorCW1vdmRxdQkweDAwKCRpbnApLCBAWE1NWzhdCSMgcmUtbG9hZCBpbnB1dAorCW1vdmRxdQkweDEwKCRpbnApLCBAWE1NWzldCisJcHhvcglAWE1NWzhdLCBAWE1NWzFdCisJbW92ZHF1CTB4MjAoJGlucCksIEBYTU1bMTBdCisJcHhvcglAWE1NWzldLCBAWE1NWzZdCisJbW92ZHF1CTB4MzAoJGlucCksIEBYTU1bMTFdCisJcHhvcglAWE1NWzEwXSwgQFhNTVs0XQorCW1vdmRxdQkweDQwKCRpbnApLCBAWE1NWzEyXQorCXB4b3IJQFhNTVsxMV0sIEBYTU1bMl0KKwltb3ZkcXUJMHg1MCgkaW5wKSwgQFhNTVsxNV0JIyBJVgorCXB4b3IJQFhNTVsxMl0sIEBYTU1bN10KKwltb3ZkcXUJQFhNTVswXSwgMHgwMCgkb3V0KQkjIHdyaXRlIG91dHB1dAorCW1vdmRxdQlAWE1NWzFdLCAweDEwKCRvdXQpCisJbW92ZHF1CUBYTU1bNl0sIDB4MjAoJG91dCkKKwltb3ZkcXUJQFhNTVs0XSwgMHgzMCgkb3V0KQorCW1vdmRxdQlAWE1NWzJdLCAweDQwKCRvdXQpCisJbW92ZHF1CUBYTU1bN10sIDB4NTAoJG91dCkKKwlqbXAJLkxjYmNfZGVjX2RvbmUKKy5hbGlnbgkxNgorLkxjYmNfZGVjX2ZpdmU6CisJbW92ZHFhCUBYTU1bMTVdLCAweDIwKCVyYnApCSMgcHV0IGFzaWRlIElWCisJY2FsbAlfYnNhZXNfZGVjcnlwdDgKKwlweG9yCTB4MjAoJXJicCksIEBYTU1bMF0JIyBePSBJVgorCW1vdmRxdQkweDAwKCRpbnApLCBAWE1NWzhdCSMgcmUtbG9hZCBpbnB1dAorCW1vdmRxdQkweDEwKCRpbnApLCBAWE1NWzldCisJcHhvcglAWE1NWzhdLCBAWE1NWzFdCisJbW92ZHF1CTB4MjAoJGlucCksIEBYTU1bMTBdCisJcHhvcglAWE1NWzldLCBAWE1NWzZdCisJbW92ZHF1CTB4MzAoJGlucCksIEBYTU1bMTFdCisJcHhvcglAWE1NWzEwXSwgQFhNTVs0XQorCW1vdmRxdQkweDQwKCRpbnApLCBAWE1NWzE1XQkjIElWCisJcHhvcglAWE1NWzExXSwgQFhNTVsyXQorCW1vdmRxdQlAWE1NWzBdLCAweDAwKCRvdXQpCSMgd3JpdGUgb3V0cHV0CisJbW92ZHF1CUBYTU1bMV0sIDB4MTAoJG91dCkKKwltb3ZkcXUJQFhNTVs2XSwgMHgyMCgkb3V0KQorCW1vdmRxdQlAWE1NWzRdLCAweDMwKCRvdXQpCisJbW92ZHF1CUBYTU1bMl0sIDB4NDAoJG91dCkKKwlqbXAJLkxjYmNfZGVjX2RvbmUKKy5hbGlnbgkxNgorLkxjYmNfZGVjX2ZvdXI6CisJbW92ZHFhCUBYTU1bMTVdLCAweDIwKCVyYnApCSMgcHV0IGFzaWRlIElWCisJY2FsbAlfYnNhZXNfZGVjcnlwdDgKKwlweG9yCTB4MjAoJXJicCksIEBYTU1bMF0JIyBePSBJVgorCW1vdmRxdQkweDAwKCRpbnApLCBAWE1NWzhdCSMgcmUtbG9hZCBpbnB1dAorCW1vdmRxdQkweDEwKCRpbnApLCBAWE1NWzldCisJcHhvcglAWE1NWzhdLCBAWE1NWzFdCisJbW92ZHF1CTB4MjAoJGlucCksIEBYTU1bMTBdCisJcHhvcglAWE1NWzldLCBAWE1NWzZdCisJbW92ZHF1CTB4MzAoJGlucCksIEBYTU1bMTVdCSMgSVYKKwlweG9yCUBYTU1bMTBdLCBAWE1NWzRdCisJbW92ZHF1CUBYTU1bMF0sIDB4MDAoJG91dCkJIyB3cml0ZSBvdXRwdXQKKwltb3ZkcXUJQFhNTVsxXSwgMHgxMCgkb3V0KQorCW1vdmRxdQlAWE1NWzZdLCAweDIwKCRvdXQpCisJbW92ZHF1CUBYTU1bNF0sIDB4MzAoJG91dCkKKwlqbXAJLkxjYmNfZGVjX2RvbmUKKy5hbGlnbgkxNgorLkxjYmNfZGVjX3RocmVlOgorCW1vdmRxYQlAWE1NWzE1XSwgMHgyMCglcmJwKQkjIHB1dCBhc2lkZSBJVgorCWNhbGwJX2JzYWVzX2RlY3J5cHQ4CisJcHhvcgkweDIwKCVyYnApLCBAWE1NWzBdCSMgXj0gSVYKKwltb3ZkcXUJMHgwMCgkaW5wKSwgQFhNTVs4XQkjIHJlLWxvYWQgaW5wdXQKKwltb3ZkcXUJMHgxMCgkaW5wKSwgQFhNTVs5XQorCXB4b3IJQFhNTVs4XSwgQFhNTVsxXQorCW1vdmRxdQkweDIwKCRpbnApLCBAWE1NWzE1XQkjIElWCisJcHhvcglAWE1NWzldLCBAWE1NWzZdCisJbW92ZHF1CUBYTU1bMF0sIDB4MDAoJG91dCkJIyB3cml0ZSBvdXRwdXQKKwltb3ZkcXUJQFhNTVsxXSwgMHgxMCgkb3V0KQorCW1vdmRxdQlAWE1NWzZdLCAweDIwKCRvdXQpCisJam1wCS5MY2JjX2RlY19kb25lCisuYWxpZ24JMTYKKy5MY2JjX2RlY190d286CisJbW92ZHFhCUBYTU1bMTVdLCAweDIwKCVyYnApCSMgcHV0IGFzaWRlIElWCisJY2FsbAlfYnNhZXNfZGVjcnlwdDgKKwlweG9yCTB4MjAoJXJicCksIEBYTU1bMF0JIyBePSBJVgorCW1vdmRxdQkweDAwKCRpbnApLCBAWE1NWzhdCSMgcmUtbG9hZCBpbnB1dAorCW1vdmRxdQkweDEwKCRpbnApLCBAWE1NWzE1XQkjIElWCisJcHhvcglAWE1NWzhdLCBAWE1NWzFdCisJbW92ZHF1CUBYTU1bMF0sIDB4MDAoJG91dCkJIyB3cml0ZSBvdXRwdXQKKwltb3ZkcXUJQFhNTVsxXSwgMHgxMCgkb3V0KQorCWptcAkuTGNiY19kZWNfZG9uZQorLmFsaWduCTE2CisuTGNiY19kZWNfb25lOgorCWxlYQkoJGlucCksICRhcmcxCisJbGVhCTB4MjAoJXJicCksICRhcmcyCSMgYnVmZmVyIG91dHB1dAorCWxlYQkoJGtleSksICRhcmczCisJY2FsbAlhc21fQUVTX2RlY3J5cHQJCSMgZG9lc24ndCB0b3VjaCAleG1tCisJcHhvcgkweDIwKCVyYnApLCBAWE1NWzE1XQkjIF49IElWCisJbW92ZHF1CUBYTU1bMTVdLCAoJG91dCkJIyB3cml0ZSBvdXRwdXQKKwltb3ZkcWEJQFhNTVswXSwgQFhNTVsxNV0JIyBJVgorCisuTGNiY19kZWNfZG9uZToKKwltb3ZkcXUJQFhNTVsxNV0sICglcmJ4KQkjIHJldHVybiBJVgorCWxlYQkoJXJzcCksICVyYXgKKwlweG9yCSV4bW0wLCAleG1tMAorLkxjYmNfZGVjX2J6ZXJvOgkJCSMgd2lwZSBrZXkgc2NoZWR1bGUgW2lmIGFueV0KKwltb3ZkcWEJJXhtbTAsIDB4MDAoJXJheCkKKwltb3ZkcWEJJXhtbTAsIDB4MTAoJXJheCkKKwlsZWEJMHgyMCglcmF4KSwgJXJheAorCWNtcAklcmF4LCAlcmJwCisJamEJLkxjYmNfZGVjX2J6ZXJvCisKKwlsZWEJKCVyYnApLCVyc3AJCSMgcmVzdG9yZSAlcnNwCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJHdpbjY0KTsKKwltb3ZhcHMJMHg0MCglcmJwKSwgJXhtbTYKKwltb3ZhcHMJMHg1MCglcmJwKSwgJXhtbTcKKwltb3ZhcHMJMHg2MCglcmJwKSwgJXhtbTgKKwltb3ZhcHMJMHg3MCglcmJwKSwgJXhtbTkKKwltb3ZhcHMJMHg4MCglcmJwKSwgJXhtbTEwCisJbW92YXBzCTB4OTAoJXJicCksICV4bW0xMQorCW1vdmFwcwkweGEwKCVyYnApLCAleG1tMTIKKwltb3ZhcHMJMHhiMCglcmJwKSwgJXhtbTEzCisJbW92YXBzCTB4YzAoJXJicCksICV4bW0xNAorCW1vdmFwcwkweGQwKCVyYnApLCAleG1tMTUKKwlsZWEJMHhhMCglcmJwKSwgJXJzcAorX19fCiskY29kZS49PDxfX187CisJbW92CTB4NDgoJXJzcCksICVyMTUKKwltb3YJMHg1MCglcnNwKSwgJXIxNAorCW1vdgkweDU4KCVyc3ApLCAlcjEzCisJbW92CTB4NjAoJXJzcCksICVyMTIKKwltb3YJMHg2OCglcnNwKSwgJXJieAorCW1vdgkweDcwKCVyc3ApLCAlcmF4CisJbGVhCTB4NzgoJXJzcCksICVyc3AKKwltb3YJJXJheCwgJXJicAorLkxjYmNfZGVjX2VwaWxvZ3VlOgorCXJldAorLnNpemUJYnNhZXNfY2JjX2VuY3J5cHQsLi1ic2Flc19jYmNfZW5jcnlwdAorCisuZ2xvYmwJYnNhZXNfY3RyMzJfZW5jcnlwdF9ibG9ja3MKKy50eXBlCWJzYWVzX2N0cjMyX2VuY3J5cHRfYmxvY2tzLFxAYWJpLW9tbmlwb3RlbnQKKy5hbGlnbgkxNgorYnNhZXNfY3RyMzJfZW5jcnlwdF9ibG9ja3M6CisJbW92CSVyc3AsICVyYXgKKy5MY3RyX2VuY19wcm9sb2d1ZToKKwlwdXNoCSVyYnAKKwlwdXNoCSVyYngKKwlwdXNoCSVyMTIKKwlwdXNoCSVyMTMKKwlwdXNoCSVyMTQKKwlwdXNoCSVyMTUKKwlsZWEJLTB4NDgoJXJzcCksICVyc3AKK19fXworJGNvZGUuPTw8X19fIGlmICgkd2luNjQpOworCW1vdgkweGEwKCVyc3ApLCRhcmc1CSMgcHVsbCBpdnAKKwlsZWEJLTB4YTAoJXJzcCksICVyc3AKKwltb3ZhcHMJJXhtbTYsIDB4NDAoJXJzcCkKKwltb3ZhcHMJJXhtbTcsIDB4NTAoJXJzcCkKKwltb3ZhcHMJJXhtbTgsIDB4NjAoJXJzcCkKKwltb3ZhcHMJJXhtbTksIDB4NzAoJXJzcCkKKwltb3ZhcHMJJXhtbTEwLCAweDgwKCVyc3ApCisJbW92YXBzCSV4bW0xMSwgMHg5MCglcnNwKQorCW1vdmFwcwkleG1tMTIsIDB4YTAoJXJzcCkKKwltb3ZhcHMJJXhtbTEzLCAweGIwKCVyc3ApCisJbW92YXBzCSV4bW0xNCwgMHhjMCglcnNwKQorCW1vdmFwcwkleG1tMTUsIDB4ZDAoJXJzcCkKKy5MY3RyX2VuY19ib2R5OgorX19fCiskY29kZS49PDxfX187CisJbW92CSVyc3AsICVyYnAJCSMgYmFja3VwICVyc3AKKwltb3ZkcXUJKCRhcmc1KSwgJXhtbTAJCSMgbG9hZCBjb3VudGVyCisJbW92CTI0MCgkYXJnNCksICVlYXgJIyByb3VuZHMKKwltb3YJJGFyZzEsICRpbnAJCSMgYmFja3VwIGFyZ3VtZW50cworCW1vdgkkYXJnMiwgJG91dAorCW1vdgkkYXJnMywgJGxlbgorCW1vdgkkYXJnNCwgJGtleQorCW1vdmRxYQkleG1tMCwgMHgyMCglcmJwKQkjIGNvcHkgY291bnRlcgorCWNtcAlcJDgsICRhcmczCisJamIJLkxjdHJfZW5jX3Nob3J0CisKKwltb3YJJWVheCwgJWVieAkJIyByb3VuZHMKKwlzaGwJXCQ3LCAlcmF4CQkjIDEyOCBieXRlcyBwZXIgaW5uZXIgcm91bmQga2V5CisJc3ViCVwkYDEyOC0zMmAsICVyYXgJIyBzaXplIG9mIGJpdC1zbGljZWQga2V5IHNjaGVkdWxlCisJc3ViCSVyYXgsICVyc3AKKworCW1vdgklcnNwLCAlcmF4CQkjIHBhc3Mga2V5IHNjaGVkdWxlCisJbW92CSRrZXksICVyY3gJCSMgcGFzcyBrZXkKKwltb3YJJWVieCwgJXIxMGQJCSMgcGFzcyByb3VuZHMKKwljYWxsCV9ic2Flc19rZXlfY29udmVydAorCXB4b3IJJXhtbTYsJXhtbTcJCSMgZml4IHVwIGxhc3Qgcm91bmQga2V5CisJbW92ZHFhCSV4bW03LCglcmF4KQkJIyBzYXZlIGxhc3Qgcm91bmQga2V5CisKKwltb3ZkcWEJKCVyc3ApLCBAWE1NWzldCQkjIGxvYWQgcm91bmQwIGtleQorCWxlYQkuTEFERDEoJXJpcCksICVyMTEKKwltb3ZkcWEJMHgyMCglcmJwKSwgQFhNTVswXQkjIGNvdW50ZXIgY29weQorCW1vdmRxYQktMHgyMCglcjExKSwgQFhNTVs4XQkjIC5MU1dQVVAKKwlwc2h1ZmIJQFhNTVs4XSwgQFhNTVs5XQkjIGJ5dGUgc3dhcCB1cHBlciBwYXJ0CisJcHNodWZiCUBYTU1bOF0sIEBYTU1bMF0KKwltb3ZkcWEJQFhNTVs5XSwgKCVyc3ApCQkjIHNhdmUgYWRqdXN0ZWQgcm91bmQwIGtleQorCWptcAkuTGN0cl9lbmNfbG9vcAorLmFsaWduCTE2CisuTGN0cl9lbmNfbG9vcDoKKwltb3ZkcWEJQFhNTVswXSwgMHgyMCglcmJwKQkjIHNhdmUgY291bnRlcgorCW1vdmRxYQlAWE1NWzBdLCBAWE1NWzFdCSMgcHJlcGFyZSA4IGNvdW50ZXIgdmFsdWVzCisJbW92ZHFhCUBYTU1bMF0sIEBYTU1bMl0KKwlwYWRkZAkweDAwKCVyMTEpLCBAWE1NWzFdCSMgLkxBREQxCisJbW92ZHFhCUBYTU1bMF0sIEBYTU1bM10KKwlwYWRkZAkweDEwKCVyMTEpLCBAWE1NWzJdCSMgLkxBREQyCisJbW92ZHFhCUBYTU1bMF0sIEBYTU1bNF0KKwlwYWRkZAkweDIwKCVyMTEpLCBAWE1NWzNdCSMgLkxBREQzCisJbW92ZHFhCUBYTU1bMF0sIEBYTU1bNV0KKwlwYWRkZAkweDMwKCVyMTEpLCBAWE1NWzRdCSMgLkxBREQ0CisJbW92ZHFhCUBYTU1bMF0sIEBYTU1bNl0KKwlwYWRkZAkweDQwKCVyMTEpLCBAWE1NWzVdCSMgLkxBREQ1CisJbW92ZHFhCUBYTU1bMF0sIEBYTU1bN10KKwlwYWRkZAkweDUwKCVyMTEpLCBAWE1NWzZdCSMgLkxBREQ2CisJcGFkZGQJMHg2MCglcjExKSwgQFhNTVs3XQkjIC5MQURENworCisJIyBCb3Jyb3cgcHJvbG9ndWUgZnJvbSBfYnNhZXNfZW5jcnlwdDggdG8gdXNlIHRoZSBvcHBvcnR1bml0eQorCSMgdG8gZmxpcCBieXRlIG9yZGVyIGluIDMyLWJpdCBjb3VudGVyCisJbW92ZHFhCSglcnNwKSwgQFhNTVs5XQkJIyByb3VuZCAwIGtleQorCWxlYQkweDEwKCVyc3ApLCAlcmF4CSMgcGFzcyBrZXkgc2NoZWR1bGUKKwltb3ZkcWEJLTB4MTAoJXIxMSksIEBYTU1bOF0JIyAuTFNXUFVQTTBTUgorCXB4b3IJQFhNTVs5XSwgQFhNTVswXQkjIHhvciB3aXRoIHJvdW5kMCBrZXkKKwlweG9yCUBYTU1bOV0sIEBYTU1bMV0KKwkgcHNodWZiCUBYTU1bOF0sIEBYTU1bMF0KKwlweG9yCUBYTU1bOV0sIEBYTU1bMl0KKwkgcHNodWZiCUBYTU1bOF0sIEBYTU1bMV0KKwlweG9yCUBYTU1bOV0sIEBYTU1bM10KKwkgcHNodWZiCUBYTU1bOF0sIEBYTU1bMl0KKwlweG9yCUBYTU1bOV0sIEBYTU1bNF0KKwkgcHNodWZiCUBYTU1bOF0sIEBYTU1bM10KKwlweG9yCUBYTU1bOV0sIEBYTU1bNV0KKwkgcHNodWZiCUBYTU1bOF0sIEBYTU1bNF0KKwlweG9yCUBYTU1bOV0sIEBYTU1bNl0KKwkgcHNodWZiCUBYTU1bOF0sIEBYTU1bNV0KKwlweG9yCUBYTU1bOV0sIEBYTU1bN10KKwkgcHNodWZiCUBYTU1bOF0sIEBYTU1bNl0KKwlsZWEJLkxCUzAoJXJpcCksICVyMTEJIyBjb25zdGFudHMgdGFibGUKKwkgcHNodWZiCUBYTU1bOF0sIEBYTU1bN10KKwltb3YJJWVieCwlcjEwZAkJIyBwYXNzIHJvdW5kcworCisJY2FsbAlfYnNhZXNfZW5jcnlwdDhfYml0c2xpY2UKKworCXN1YglcJDgsJGxlbgorCWpjCS5MY3RyX2VuY19sb29wX2RvbmUKKworCW1vdmRxdQkweDAwKCRpbnApLCBAWE1NWzhdCSMgbG9hZCBpbnB1dAorCW1vdmRxdQkweDEwKCRpbnApLCBAWE1NWzldCisJbW92ZHF1CTB4MjAoJGlucCksIEBYTU1bMTBdCisJbW92ZHF1CTB4MzAoJGlucCksIEBYTU1bMTFdCisJbW92ZHF1CTB4NDAoJGlucCksIEBYTU1bMTJdCisJbW92ZHF1CTB4NTAoJGlucCksIEBYTU1bMTNdCisJbW92ZHF1CTB4NjAoJGlucCksIEBYTU1bMTRdCisJbW92ZHF1CTB4NzAoJGlucCksIEBYTU1bMTVdCisJbGVhCTB4ODAoJGlucCksJGlucAorCXB4b3IJQFhNTVswXSwgQFhNTVs4XQorCW1vdmRxYQkweDIwKCVyYnApLCBAWE1NWzBdCSMgbG9hZCBjb3VudGVyCisJcHhvcglAWE1NWzldLCBAWE1NWzFdCisJbW92ZHF1CUBYTU1bOF0sIDB4MDAoJG91dCkJIyB3cml0ZSBvdXRwdXQKKwlweG9yCUBYTU1bMTBdLCBAWE1NWzRdCisJbW92ZHF1CUBYTU1bMV0sIDB4MTAoJG91dCkKKwlweG9yCUBYTU1bMTFdLCBAWE1NWzZdCisJbW92ZHF1CUBYTU1bNF0sIDB4MjAoJG91dCkKKwlweG9yCUBYTU1bMTJdLCBAWE1NWzNdCisJbW92ZHF1CUBYTU1bNl0sIDB4MzAoJG91dCkKKwlweG9yCUBYTU1bMTNdLCBAWE1NWzddCisJbW92ZHF1CUBYTU1bM10sIDB4NDAoJG91dCkKKwlweG9yCUBYTU1bMTRdLCBAWE1NWzJdCisJbW92ZHF1CUBYTU1bN10sIDB4NTAoJG91dCkKKwlweG9yCUBYTU1bMTVdLCBAWE1NWzVdCisJbW92ZHF1CUBYTU1bMl0sIDB4NjAoJG91dCkKKwlsZWEJLkxBREQxKCVyaXApLCAlcjExCisJbW92ZHF1CUBYTU1bNV0sIDB4NzAoJG91dCkKKwlsZWEJMHg4MCgkb3V0KSwgJG91dAorCXBhZGRkCTB4NzAoJXIxMSksIEBYTU1bMF0JIyAuTEFERDgKKwlqbnoJLkxjdHJfZW5jX2xvb3AKKworCWptcAkuTGN0cl9lbmNfZG9uZQorLmFsaWduCTE2CisuTGN0cl9lbmNfbG9vcF9kb25lOgorCWFkZAlcJDgsICRsZW4KKwltb3ZkcXUJMHgwMCgkaW5wKSwgQFhNTVs4XQkjIGxvYWQgaW5wdXQKKwlweG9yCUBYTU1bOF0sIEBYTU1bMF0KKwltb3ZkcXUJQFhNTVswXSwgMHgwMCgkb3V0KQkjIHdyaXRlIG91dHB1dAorCWNtcAlcJDIsJGxlbgorCWpiCS5MY3RyX2VuY19kb25lCisJbW92ZHF1CTB4MTAoJGlucCksIEBYTU1bOV0KKwlweG9yCUBYTU1bOV0sIEBYTU1bMV0KKwltb3ZkcXUJQFhNTVsxXSwgMHgxMCgkb3V0KQorCWplCS5MY3RyX2VuY19kb25lCisJbW92ZHF1CTB4MjAoJGlucCksIEBYTU1bMTBdCisJcHhvcglAWE1NWzEwXSwgQFhNTVs0XQorCW1vdmRxdQlAWE1NWzRdLCAweDIwKCRvdXQpCisJY21wCVwkNCwkbGVuCisJamIJLkxjdHJfZW5jX2RvbmUKKwltb3ZkcXUJMHgzMCgkaW5wKSwgQFhNTVsxMV0KKwlweG9yCUBYTU1bMTFdLCBAWE1NWzZdCisJbW92ZHF1CUBYTU1bNl0sIDB4MzAoJG91dCkKKwlqZQkuTGN0cl9lbmNfZG9uZQorCW1vdmRxdQkweDQwKCRpbnApLCBAWE1NWzEyXQorCXB4b3IJQFhNTVsxMl0sIEBYTU1bM10KKwltb3ZkcXUJQFhNTVszXSwgMHg0MCgkb3V0KQorCWNtcAlcJDYsJGxlbgorCWpiCS5MY3RyX2VuY19kb25lCisJbW92ZHF1CTB4NTAoJGlucCksIEBYTU1bMTNdCisJcHhvcglAWE1NWzEzXSwgQFhNTVs3XQorCW1vdmRxdQlAWE1NWzddLCAweDUwKCRvdXQpCisJamUJLkxjdHJfZW5jX2RvbmUKKwltb3ZkcXUJMHg2MCgkaW5wKSwgQFhNTVsxNF0KKwlweG9yCUBYTU1bMTRdLCBAWE1NWzJdCisJbW92ZHF1CUBYTU1bMl0sIDB4NjAoJG91dCkKKwlqbXAJLkxjdHJfZW5jX2RvbmUKKworLmFsaWduCTE2CisuTGN0cl9lbmNfc2hvcnQ6CisJbGVhCTB4MjAoJXJicCksICRhcmcxCisJbGVhCTB4MzAoJXJicCksICRhcmcyCisJbGVhCSgka2V5KSwgJGFyZzMKKwljYWxsCWFzbV9BRVNfZW5jcnlwdAorCW1vdmRxdQkoJGlucCksIEBYTU1bMV0KKwlsZWEJMTYoJGlucCksICRpbnAKKwltb3YJMHgyYyglcmJwKSwgJWVheAkjIGxvYWQgMzItYml0IGNvdW50ZXIKKwlic3dhcAklZWF4CisJcHhvcgkweDMwKCVyYnApLCBAWE1NWzFdCisJaW5jCSVlYXgJCQkjIGluY3JlbWVudAorCW1vdmRxdQlAWE1NWzFdLCAoJG91dCkKKwlic3dhcAklZWF4CisJbGVhCTE2KCRvdXQpLCAkb3V0CisJbW92CSVlYXgsIDB4MmMoJXJzcCkJIyBzYXZlIDMyLWJpdCBjb3VudGVyCisJZGVjCSRsZW4KKwlqbnoJLkxjdHJfZW5jX3Nob3J0CisKKy5MY3RyX2VuY19kb25lOgorCWxlYQkoJXJzcCksICVyYXgKKwlweG9yCSV4bW0wLCAleG1tMAorLkxjdHJfZW5jX2J6ZXJvOgkJCSMgd2lwZSBrZXkgc2NoZWR1bGUgW2lmIGFueV0KKwltb3ZkcWEJJXhtbTAsIDB4MDAoJXJheCkKKwltb3ZkcWEJJXhtbTAsIDB4MTAoJXJheCkKKwlsZWEJMHgyMCglcmF4KSwgJXJheAorCWNtcAklcmF4LCAlcmJwCisJamEJLkxjdHJfZW5jX2J6ZXJvCisKKwlsZWEJKCVyYnApLCVyc3AJCSMgcmVzdG9yZSAlcnNwCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJHdpbjY0KTsKKwltb3ZhcHMJMHg0MCglcmJwKSwgJXhtbTYKKwltb3ZhcHMJMHg1MCglcmJwKSwgJXhtbTcKKwltb3ZhcHMJMHg2MCglcmJwKSwgJXhtbTgKKwltb3ZhcHMJMHg3MCglcmJwKSwgJXhtbTkKKwltb3ZhcHMJMHg4MCglcmJwKSwgJXhtbTEwCisJbW92YXBzCTB4OTAoJXJicCksICV4bW0xMQorCW1vdmFwcwkweGEwKCVyYnApLCAleG1tMTIKKwltb3ZhcHMJMHhiMCglcmJwKSwgJXhtbTEzCisJbW92YXBzCTB4YzAoJXJicCksICV4bW0xNAorCW1vdmFwcwkweGQwKCVyYnApLCAleG1tMTUKKwlsZWEJMHhhMCglcmJwKSwgJXJzcAorX19fCiskY29kZS49PDxfX187CisJbW92CTB4NDgoJXJzcCksICVyMTUKKwltb3YJMHg1MCglcnNwKSwgJXIxNAorCW1vdgkweDU4KCVyc3ApLCAlcjEzCisJbW92CTB4NjAoJXJzcCksICVyMTIKKwltb3YJMHg2OCglcnNwKSwgJXJieAorCW1vdgkweDcwKCVyc3ApLCAlcmF4CisJbGVhCTB4NzgoJXJzcCksICVyc3AKKwltb3YJJXJheCwgJXJicAorLkxjdHJfZW5jX2VwaWxvZ3VlOgorCXJldAorLnNpemUJYnNhZXNfY3RyMzJfZW5jcnlwdF9ibG9ja3MsLi1ic2Flc19jdHIzMl9lbmNyeXB0X2Jsb2NrcworX19fCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHZvaWQgYnNhZXNfeHRzX1tlbnxkZV1jcnlwdChjb25zdCBjaGFyICppbnAsY2hhciAqb3V0LHNpemVfdCBsZW4sCisjCWNvbnN0IEFFU19LRVkgKmtleTEsIGNvbnN0IEFFU19LRVkgKmtleTIsCisjCWNvbnN0IHVuc2lnbmVkIGNoYXIgaXZbMTZdKTsKKyMKK215ICgkdHdtYXNrLCR0d3JlcywkdHd0bXApPUBYTU1bMTMuLjE1XTsKKyRhcmc2PX5zL2QkLy87CisKKyRjb2RlLj08PF9fXzsKKy5nbG9ibAlic2Flc194dHNfZW5jcnlwdAorLnR5cGUJYnNhZXNfeHRzX2VuY3J5cHQsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2Citic2Flc194dHNfZW5jcnlwdDoKKwltb3YJJXJzcCwgJXJheAorLkx4dHNfZW5jX3Byb2xvZ3VlOgorCXB1c2gJJXJicAorCXB1c2gJJXJieAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCXB1c2gJJXIxNQorCWxlYQktMHg0OCglcnNwKSwgJXJzcAorX19fCiskY29kZS49PDxfX18gaWYgKCR3aW42NCk7CisJbW92CTB4YTAoJXJzcCksJGFyZzUJIyBwdWxsIGtleTIKKwltb3YJMHhhOCglcnNwKSwkYXJnNgkjIHB1bGwgaXZwCisJbGVhCS0weGEwKCVyc3ApLCAlcnNwCisJbW92YXBzCSV4bW02LCAweDQwKCVyc3ApCisJbW92YXBzCSV4bW03LCAweDUwKCVyc3ApCisJbW92YXBzCSV4bW04LCAweDYwKCVyc3ApCisJbW92YXBzCSV4bW05LCAweDcwKCVyc3ApCisJbW92YXBzCSV4bW0xMCwgMHg4MCglcnNwKQorCW1vdmFwcwkleG1tMTEsIDB4OTAoJXJzcCkKKwltb3ZhcHMJJXhtbTEyLCAweGEwKCVyc3ApCisJbW92YXBzCSV4bW0xMywgMHhiMCglcnNwKQorCW1vdmFwcwkleG1tMTQsIDB4YzAoJXJzcCkKKwltb3ZhcHMJJXhtbTE1LCAweGQwKCVyc3ApCisuTHh0c19lbmNfYm9keToKK19fXworJGNvZGUuPTw8X19fOworCW1vdgklcnNwLCAlcmJwCQkjIGJhY2t1cCAlcnNwCisJbW92CSRhcmcxLCAkaW5wCQkjIGJhY2t1cCBhcmd1bWVudHMKKwltb3YJJGFyZzIsICRvdXQKKwltb3YJJGFyZzMsICRsZW4KKwltb3YJJGFyZzQsICRrZXkKKworCWxlYQkoJGFyZzYpLCAkYXJnMQorCWxlYQkweDIwKCVyYnApLCAkYXJnMgorCWxlYQkoJGFyZzUpLCAkYXJnMworCWNhbGwJYXNtX0FFU19lbmNyeXB0CQkjIGdlbmVyYXRlIGluaXRpYWwgdHdlYWsKKworCW1vdgkyNDAoJGtleSksICVlYXgJCSMgcm91bmRzCisJbW92CSRsZW4sICVyYngJCSMgYmFja3VwICRsZW4KKworCW1vdgklZWF4LCAlZWR4CQkjIHJvdW5kcworCXNobAlcJDcsICVyYXgJCSMgMTI4IGJ5dGVzIHBlciBpbm5lciByb3VuZCBrZXkKKwlzdWIJXCRgMTI4LTMyYCwgJXJheAkjIHNpemUgb2YgYml0LXNsaWNlZCBrZXkgc2NoZWR1bGUKKwlzdWIJJXJheCwgJXJzcAorCisJbW92CSVyc3AsICVyYXgJCSMgcGFzcyBrZXkgc2NoZWR1bGUKKwltb3YJJGtleSwgJXJjeAkJIyBwYXNzIGtleQorCW1vdgklZWR4LCAlcjEwZAkJIyBwYXNzIHJvdW5kcworCWNhbGwJX2JzYWVzX2tleV9jb252ZXJ0CisJcHhvcgkleG1tNiwgJXhtbTcJCSMgZml4IHVwIGxhc3Qgcm91bmQga2V5CisJbW92ZHFhCSV4bW03LCAoJXJheCkJCSMgc2F2ZSBsYXN0IHJvdW5kIGtleQorCisJYW5kCVwkLTE2LCAkbGVuCisJc3ViCVwkMHg4MCwgJXJzcAkJIyBwbGFjZSBmb3IgdHdlYWtbOF0KKwltb3ZkcWEJMHgyMCglcmJwKSwgQFhNTVs3XQkjIGluaXRpYWwgdHdlYWsKKworCXB4b3IJJHR3dG1wLCAkdHd0bXAKKwltb3ZkcWEJLkx4dHNfbWFnaWMoJXJpcCksICR0d21hc2sKKwlwY21wZ3RkCUBYTU1bN10sICR0d3RtcAkJIyBicm9hZGNhc3QgdXBwZXIgYml0cworCisJc3ViCVwkMHg4MCwgJGxlbgorCWpjCS5MeHRzX2VuY19zaG9ydAorCWptcAkuTHh0c19lbmNfbG9vcAorCisuYWxpZ24JMTYKKy5MeHRzX2VuY19sb29wOgorX19fCisgICAgZm9yICgkaT0wOyRpPDc7JGkrKykgeworICAgICRjb2RlLj08PF9fXzsKKwlwc2h1ZmQJXCQweDEzLCAkdHd0bXAsICR0d3JlcworCXB4b3IJJHR3dG1wLCAkdHd0bXAKKwltb3ZkcWEJQFhNTVs3XSwgQFhNTVskaV0KKwltb3ZkcWEJQFhNTVs3XSwgYDB4MTAqJGlgKCVyc3ApIyBzYXZlIHR3ZWFrWyRpXQorCXBhZGRxCUBYTU1bN10sIEBYTU1bN10JIyBwc2xscQkxLCR0d2VhaworCXBhbmQJJHR3bWFzaywgJHR3cmVzCQkjIGlzb2xhdGUgY2FycnkgYW5kIHJlc2lkdWUKKwlwY21wZ3RkCUBYTU1bN10sICR0d3RtcAkJIyBicm9hZGNhc3QgdXBwZXIgYml0cworCXB4b3IJJHR3cmVzLCBAWE1NWzddCitfX18KKyAgICAkY29kZS49PDxfX18gaWYgKCRpPj0xKTsKKwltb3ZkcXUJYDB4MTAqKCRpLTEpYCgkaW5wKSwgQFhNTVs4KyRpLTFdCitfX18KKyAgICAkY29kZS49PDxfX18gaWYgKCRpPj0yKTsKKwlweG9yCUBYTU1bOCskaS0yXSwgQFhNTVskaS0yXSMgaW5wdXRbXSBeIHR3ZWFrW10KK19fXworICAgIH0KKyRjb2RlLj08PF9fXzsKKwltb3ZkcXUJMHg2MCgkaW5wKSwgQFhNTVs4KzZdCisJcHhvcglAWE1NWzgrNV0sIEBYTU1bNV0KKwltb3ZkcXUJMHg3MCgkaW5wKSwgQFhNTVs4KzddCisJbGVhCTB4ODAoJGlucCksICRpbnAKKwltb3ZkcWEJQFhNTVs3XSwgMHg3MCglcnNwKQorCXB4b3IJQFhNTVs4KzZdLCBAWE1NWzZdCisJbGVhCTB4ODAoJXJzcCksICVyYXgJIyBwYXNzIGtleSBzY2hlZHVsZQorCXB4b3IJQFhNTVs4KzddLCBAWE1NWzddCisJbW92CSVlZHgsICVyMTBkCQkjIHBhc3Mgcm91bmRzCisKKwljYWxsCV9ic2Flc19lbmNyeXB0OAorCisJcHhvcgkweDAwKCVyc3ApLCBAWE1NWzBdCSMgXj0gdHdlYWtbXQorCXB4b3IJMHgxMCglcnNwKSwgQFhNTVsxXQorCW1vdmRxdQlAWE1NWzBdLCAweDAwKCRvdXQpCSMgd3JpdGUgb3V0cHV0CisJcHhvcgkweDIwKCVyc3ApLCBAWE1NWzRdCisJbW92ZHF1CUBYTU1bMV0sIDB4MTAoJG91dCkKKwlweG9yCTB4MzAoJXJzcCksIEBYTU1bNl0KKwltb3ZkcXUJQFhNTVs0XSwgMHgyMCgkb3V0KQorCXB4b3IJMHg0MCglcnNwKSwgQFhNTVszXQorCW1vdmRxdQlAWE1NWzZdLCAweDMwKCRvdXQpCisJcHhvcgkweDUwKCVyc3ApLCBAWE1NWzddCisJbW92ZHF1CUBYTU1bM10sIDB4NDAoJG91dCkKKwlweG9yCTB4NjAoJXJzcCksIEBYTU1bMl0KKwltb3ZkcXUJQFhNTVs3XSwgMHg1MCgkb3V0KQorCXB4b3IJMHg3MCglcnNwKSwgQFhNTVs1XQorCW1vdmRxdQlAWE1NWzJdLCAweDYwKCRvdXQpCisJbW92ZHF1CUBYTU1bNV0sIDB4NzAoJG91dCkKKwlsZWEJMHg4MCgkb3V0KSwgJG91dAorCisJbW92ZHFhCTB4NzAoJXJzcCksIEBYTU1bN10JIyBwcmVwYXJlIG5leHQgaXRlcmF0aW9uIHR3ZWFrCisJcHhvcgkkdHd0bXAsICR0d3RtcAorCW1vdmRxYQkuTHh0c19tYWdpYyglcmlwKSwgJHR3bWFzaworCXBjbXBndGQJQFhNTVs3XSwgJHR3dG1wCisJcHNodWZkCVwkMHgxMywgJHR3dG1wLCAkdHdyZXMKKwlweG9yCSR0d3RtcCwgJHR3dG1wCisJcGFkZHEJQFhNTVs3XSwgQFhNTVs3XQkjIHBzbGxxCTEsJHR3ZWFrCisJcGFuZAkkdHdtYXNrLCAkdHdyZXMJCSMgaXNvbGF0ZSBjYXJyeSBhbmQgcmVzaWR1ZQorCXBjbXBndGQJQFhNTVs3XSwgJHR3dG1wCQkjIGJyb2FkY2FzdCB1cHBlciBiaXRzCisJcHhvcgkkdHdyZXMsIEBYTU1bN10KKworCXN1YglcJDB4ODAsJGxlbgorCWpuYwkuTHh0c19lbmNfbG9vcAorCisuTHh0c19lbmNfc2hvcnQ6CisJYWRkCVwkMHg4MCwgJGxlbgorCWp6CS5MeHRzX2VuY19kb25lCitfX18KKyAgICBmb3IgKCRpPTA7JGk8NzskaSsrKSB7CisgICAgJGNvZGUuPTw8X19fOworCXBzaHVmZAlcJDB4MTMsICR0d3RtcCwgJHR3cmVzCisJcHhvcgkkdHd0bXAsICR0d3RtcAorCW1vdmRxYQlAWE1NWzddLCBAWE1NWyRpXQorCW1vdmRxYQlAWE1NWzddLCBgMHgxMCokaWAoJXJzcCkjIHNhdmUgdHdlYWtbJGldCisJcGFkZHEJQFhNTVs3XSwgQFhNTVs3XQkjIHBzbGxxCTEsJHR3ZWFrCisJcGFuZAkkdHdtYXNrLCAkdHdyZXMJCSMgaXNvbGF0ZSBjYXJyeSBhbmQgcmVzaWR1ZQorCXBjbXBndGQJQFhNTVs3XSwgJHR3dG1wCQkjIGJyb2FkY2FzdCB1cHBlciBiaXRzCisJcHhvcgkkdHdyZXMsIEBYTU1bN10KK19fXworICAgICRjb2RlLj08PF9fXyBpZiAoJGk+PTEpOworCW1vdmRxdQlgMHgxMCooJGktMSlgKCRpbnApLCBAWE1NWzgrJGktMV0KKwljbXAJXCRgMHgxMCokaWAsJGxlbgorCWplCS5MeHRzX2VuY18kaQorX19fCisgICAgJGNvZGUuPTw8X19fIGlmICgkaT49Mik7CisJcHhvcglAWE1NWzgrJGktMl0sIEBYTU1bJGktMl0jIGlucHV0W10gXiB0d2Vha1tdCitfX18KKyAgICB9CiskY29kZS49PDxfX187CisJbW92ZHF1CTB4NjAoJGlucCksIEBYTU1bOCs2XQorCXB4b3IJQFhNTVs4KzVdLCBAWE1NWzVdCisJbW92ZHFhCUBYTU1bN10sIDB4NzAoJXJzcCkKKwlsZWEJMHg3MCgkaW5wKSwgJGlucAorCXB4b3IJQFhNTVs4KzZdLCBAWE1NWzZdCisJbGVhCTB4ODAoJXJzcCksICVyYXgJIyBwYXNzIGtleSBzY2hlZHVsZQorCW1vdgklZWR4LCAlcjEwZAkJIyBwYXNzIHJvdW5kcworCisJY2FsbAlfYnNhZXNfZW5jcnlwdDgKKworCXB4b3IJMHgwMCglcnNwKSwgQFhNTVswXQkjIF49IHR3ZWFrW10KKwlweG9yCTB4MTAoJXJzcCksIEBYTU1bMV0KKwltb3ZkcXUJQFhNTVswXSwgMHgwMCgkb3V0KQkjIHdyaXRlIG91dHB1dAorCXB4b3IJMHgyMCglcnNwKSwgQFhNTVs0XQorCW1vdmRxdQlAWE1NWzFdLCAweDEwKCRvdXQpCisJcHhvcgkweDMwKCVyc3ApLCBAWE1NWzZdCisJbW92ZHF1CUBYTU1bNF0sIDB4MjAoJG91dCkKKwlweG9yCTB4NDAoJXJzcCksIEBYTU1bM10KKwltb3ZkcXUJQFhNTVs2XSwgMHgzMCgkb3V0KQorCXB4b3IJMHg1MCglcnNwKSwgQFhNTVs3XQorCW1vdmRxdQlAWE1NWzNdLCAweDQwKCRvdXQpCisJcHhvcgkweDYwKCVyc3ApLCBAWE1NWzJdCisJbW92ZHF1CUBYTU1bN10sIDB4NTAoJG91dCkKKwltb3ZkcXUJQFhNTVsyXSwgMHg2MCgkb3V0KQorCWxlYQkweDcwKCRvdXQpLCAkb3V0CisKKwltb3ZkcWEJMHg3MCglcnNwKSwgQFhNTVs3XQkjIG5leHQgaXRlcmF0aW9uIHR3ZWFrCisJam1wCS5MeHRzX2VuY19kb25lCisuYWxpZ24JMTYKKy5MeHRzX2VuY182OgorCXB4b3IJQFhNTVs4KzRdLCBAWE1NWzRdCisJbGVhCTB4NjAoJGlucCksICRpbnAKKwlweG9yCUBYTU1bOCs1XSwgQFhNTVs1XQorCWxlYQkweDgwKCVyc3ApLCAlcmF4CSMgcGFzcyBrZXkgc2NoZWR1bGUKKwltb3YJJWVkeCwgJXIxMGQJCSMgcGFzcyByb3VuZHMKKworCWNhbGwJX2JzYWVzX2VuY3J5cHQ4CisKKwlweG9yCTB4MDAoJXJzcCksIEBYTU1bMF0JIyBePSB0d2Vha1tdCisJcHhvcgkweDEwKCVyc3ApLCBAWE1NWzFdCisJbW92ZHF1CUBYTU1bMF0sIDB4MDAoJG91dCkJIyB3cml0ZSBvdXRwdXQKKwlweG9yCTB4MjAoJXJzcCksIEBYTU1bNF0KKwltb3ZkcXUJQFhNTVsxXSwgMHgxMCgkb3V0KQorCXB4b3IJMHgzMCglcnNwKSwgQFhNTVs2XQorCW1vdmRxdQlAWE1NWzRdLCAweDIwKCRvdXQpCisJcHhvcgkweDQwKCVyc3ApLCBAWE1NWzNdCisJbW92ZHF1CUBYTU1bNl0sIDB4MzAoJG91dCkKKwlweG9yCTB4NTAoJXJzcCksIEBYTU1bN10KKwltb3ZkcXUJQFhNTVszXSwgMHg0MCgkb3V0KQorCW1vdmRxdQlAWE1NWzddLCAweDUwKCRvdXQpCisJbGVhCTB4NjAoJG91dCksICRvdXQKKworCW1vdmRxYQkweDYwKCVyc3ApLCBAWE1NWzddCSMgbmV4dCBpdGVyYXRpb24gdHdlYWsKKwlqbXAJLkx4dHNfZW5jX2RvbmUKKy5hbGlnbgkxNgorLkx4dHNfZW5jXzU6CisJcHhvcglAWE1NWzgrM10sIEBYTU1bM10KKwlsZWEJMHg1MCgkaW5wKSwgJGlucAorCXB4b3IJQFhNTVs4KzRdLCBAWE1NWzRdCisJbGVhCTB4ODAoJXJzcCksICVyYXgJIyBwYXNzIGtleSBzY2hlZHVsZQorCW1vdgklZWR4LCAlcjEwZAkJIyBwYXNzIHJvdW5kcworCisJY2FsbAlfYnNhZXNfZW5jcnlwdDgKKworCXB4b3IJMHgwMCglcnNwKSwgQFhNTVswXQkjIF49IHR3ZWFrW10KKwlweG9yCTB4MTAoJXJzcCksIEBYTU1bMV0KKwltb3ZkcXUJQFhNTVswXSwgMHgwMCgkb3V0KQkjIHdyaXRlIG91dHB1dAorCXB4b3IJMHgyMCglcnNwKSwgQFhNTVs0XQorCW1vdmRxdQlAWE1NWzFdLCAweDEwKCRvdXQpCisJcHhvcgkweDMwKCVyc3ApLCBAWE1NWzZdCisJbW92ZHF1CUBYTU1bNF0sIDB4MjAoJG91dCkKKwlweG9yCTB4NDAoJXJzcCksIEBYTU1bM10KKwltb3ZkcXUJQFhNTVs2XSwgMHgzMCgkb3V0KQorCW1vdmRxdQlAWE1NWzNdLCAweDQwKCRvdXQpCisJbGVhCTB4NTAoJG91dCksICRvdXQKKworCW1vdmRxYQkweDUwKCVyc3ApLCBAWE1NWzddCSMgbmV4dCBpdGVyYXRpb24gdHdlYWsKKwlqbXAJLkx4dHNfZW5jX2RvbmUKKy5hbGlnbgkxNgorLkx4dHNfZW5jXzQ6CisJcHhvcglAWE1NWzgrMl0sIEBYTU1bMl0KKwlsZWEJMHg0MCgkaW5wKSwgJGlucAorCXB4b3IJQFhNTVs4KzNdLCBAWE1NWzNdCisJbGVhCTB4ODAoJXJzcCksICVyYXgJIyBwYXNzIGtleSBzY2hlZHVsZQorCW1vdgklZWR4LCAlcjEwZAkJIyBwYXNzIHJvdW5kcworCisJY2FsbAlfYnNhZXNfZW5jcnlwdDgKKworCXB4b3IJMHgwMCglcnNwKSwgQFhNTVswXQkjIF49IHR3ZWFrW10KKwlweG9yCTB4MTAoJXJzcCksIEBYTU1bMV0KKwltb3ZkcXUJQFhNTVswXSwgMHgwMCgkb3V0KQkjIHdyaXRlIG91dHB1dAorCXB4b3IJMHgyMCglcnNwKSwgQFhNTVs0XQorCW1vdmRxdQlAWE1NWzFdLCAweDEwKCRvdXQpCisJcHhvcgkweDMwKCVyc3ApLCBAWE1NWzZdCisJbW92ZHF1CUBYTU1bNF0sIDB4MjAoJG91dCkKKwltb3ZkcXUJQFhNTVs2XSwgMHgzMCgkb3V0KQorCWxlYQkweDQwKCRvdXQpLCAkb3V0CisKKwltb3ZkcWEJMHg0MCglcnNwKSwgQFhNTVs3XQkjIG5leHQgaXRlcmF0aW9uIHR3ZWFrCisJam1wCS5MeHRzX2VuY19kb25lCisuYWxpZ24JMTYKKy5MeHRzX2VuY18zOgorCXB4b3IJQFhNTVs4KzFdLCBAWE1NWzFdCisJbGVhCTB4MzAoJGlucCksICRpbnAKKwlweG9yCUBYTU1bOCsyXSwgQFhNTVsyXQorCWxlYQkweDgwKCVyc3ApLCAlcmF4CSMgcGFzcyBrZXkgc2NoZWR1bGUKKwltb3YJJWVkeCwgJXIxMGQJCSMgcGFzcyByb3VuZHMKKworCWNhbGwJX2JzYWVzX2VuY3J5cHQ4CisKKwlweG9yCTB4MDAoJXJzcCksIEBYTU1bMF0JIyBePSB0d2Vha1tdCisJcHhvcgkweDEwKCVyc3ApLCBAWE1NWzFdCisJbW92ZHF1CUBYTU1bMF0sIDB4MDAoJG91dCkJIyB3cml0ZSBvdXRwdXQKKwlweG9yCTB4MjAoJXJzcCksIEBYTU1bNF0KKwltb3ZkcXUJQFhNTVsxXSwgMHgxMCgkb3V0KQorCW1vdmRxdQlAWE1NWzRdLCAweDIwKCRvdXQpCisJbGVhCTB4MzAoJG91dCksICRvdXQKKworCW1vdmRxYQkweDMwKCVyc3ApLCBAWE1NWzddCSMgbmV4dCBpdGVyYXRpb24gdHdlYWsKKwlqbXAJLkx4dHNfZW5jX2RvbmUKKy5hbGlnbgkxNgorLkx4dHNfZW5jXzI6CisJcHhvcglAWE1NWzgrMF0sIEBYTU1bMF0KKwlsZWEJMHgyMCgkaW5wKSwgJGlucAorCXB4b3IJQFhNTVs4KzFdLCBAWE1NWzFdCisJbGVhCTB4ODAoJXJzcCksICVyYXgJIyBwYXNzIGtleSBzY2hlZHVsZQorCW1vdgklZWR4LCAlcjEwZAkJIyBwYXNzIHJvdW5kcworCisJY2FsbAlfYnNhZXNfZW5jcnlwdDgKKworCXB4b3IJMHgwMCglcnNwKSwgQFhNTVswXQkjIF49IHR3ZWFrW10KKwlweG9yCTB4MTAoJXJzcCksIEBYTU1bMV0KKwltb3ZkcXUJQFhNTVswXSwgMHgwMCgkb3V0KQkjIHdyaXRlIG91dHB1dAorCW1vdmRxdQlAWE1NWzFdLCAweDEwKCRvdXQpCisJbGVhCTB4MjAoJG91dCksICRvdXQKKworCW1vdmRxYQkweDIwKCVyc3ApLCBAWE1NWzddCSMgbmV4dCBpdGVyYXRpb24gdHdlYWsKKwlqbXAJLkx4dHNfZW5jX2RvbmUKKy5hbGlnbgkxNgorLkx4dHNfZW5jXzE6CisJcHhvcglAWE1NWzBdLCBAWE1NWzhdCisJbGVhCTB4MTAoJGlucCksICRpbnAKKwltb3ZkcWEJQFhNTVs4XSwgMHgyMCglcmJwKQorCWxlYQkweDIwKCVyYnApLCAkYXJnMQorCWxlYQkweDIwKCVyYnApLCAkYXJnMgorCWxlYQkoJGtleSksICRhcmczCisJY2FsbAlhc21fQUVTX2VuY3J5cHQJCSMgZG9lc24ndCB0b3VjaCAleG1tCisJcHhvcgkweDIwKCVyYnApLCBAWE1NWzBdCSMgXj0gdHdlYWtbXQorCSNweG9yCUBYTU1bOF0sIEBYTU1bMF0KKwkjbGVhCTB4ODAoJXJzcCksICVyYXgJIyBwYXNzIGtleSBzY2hlZHVsZQorCSNtb3YJJWVkeCwgJXIxMGQJCSMgcGFzcyByb3VuZHMKKwkjY2FsbAlfYnNhZXNfZW5jcnlwdDgKKwkjcHhvcgkweDAwKCVyc3ApLCBAWE1NWzBdCSMgXj0gdHdlYWtbXQorCW1vdmRxdQlAWE1NWzBdLCAweDAwKCRvdXQpCSMgd3JpdGUgb3V0cHV0CisJbGVhCTB4MTAoJG91dCksICRvdXQKKworCW1vdmRxYQkweDEwKCVyc3ApLCBAWE1NWzddCSMgbmV4dCBpdGVyYXRpb24gdHdlYWsKKworLkx4dHNfZW5jX2RvbmU6CisJYW5kCVwkMTUsICVlYngKKwlqegkuTHh0c19lbmNfcmV0CisJbW92CSRvdXQsICVyZHgKKworLkx4dHNfZW5jX3N0ZWFsOgorCW1vdnpiCSgkaW5wKSwgJWVheAorCW1vdnpiCS0xNiglcmR4KSwgJWVjeAorCWxlYQkxKCRpbnApLCAkaW5wCisJbW92CSVhbCwgLTE2KCVyZHgpCisJbW92CSVjbCwgMCglcmR4KQorCWxlYQkxKCVyZHgpLCAlcmR4CisJc3ViCVwkMSwlZWJ4CisJam56CS5MeHRzX2VuY19zdGVhbAorCisJbW92ZHF1CS0xNigkb3V0KSwgQFhNTVswXQorCWxlYQkweDIwKCVyYnApLCAkYXJnMQorCXB4b3IJQFhNTVs3XSwgQFhNTVswXQorCWxlYQkweDIwKCVyYnApLCAkYXJnMgorCW1vdmRxYQlAWE1NWzBdLCAweDIwKCVyYnApCisJbGVhCSgka2V5KSwgJGFyZzMKKwljYWxsCWFzbV9BRVNfZW5jcnlwdAkJIyBkb2Vzbid0IHRvdWNoICV4bW0KKwlweG9yCTB4MjAoJXJicCksIEBYTU1bN10KKwltb3ZkcXUJQFhNTVs3XSwgLTE2KCRvdXQpCisKKy5MeHRzX2VuY19yZXQ6CisJbGVhCSglcnNwKSwgJXJheAorCXB4b3IJJXhtbTAsICV4bW0wCisuTHh0c19lbmNfYnplcm86CQkJIyB3aXBlIGtleSBzY2hlZHVsZSBbaWYgYW55XQorCW1vdmRxYQkleG1tMCwgMHgwMCglcmF4KQorCW1vdmRxYQkleG1tMCwgMHgxMCglcmF4KQorCWxlYQkweDIwKCVyYXgpLCAlcmF4CisJY21wCSVyYXgsICVyYnAKKwlqYQkuTHh0c19lbmNfYnplcm8KKworCWxlYQkoJXJicCksJXJzcAkJIyByZXN0b3JlICVyc3AKK19fXworJGNvZGUuPTw8X19fIGlmICgkd2luNjQpOworCW1vdmFwcwkweDQwKCVyYnApLCAleG1tNgorCW1vdmFwcwkweDUwKCVyYnApLCAleG1tNworCW1vdmFwcwkweDYwKCVyYnApLCAleG1tOAorCW1vdmFwcwkweDcwKCVyYnApLCAleG1tOQorCW1vdmFwcwkweDgwKCVyYnApLCAleG1tMTAKKwltb3ZhcHMJMHg5MCglcmJwKSwgJXhtbTExCisJbW92YXBzCTB4YTAoJXJicCksICV4bW0xMgorCW1vdmFwcwkweGIwKCVyYnApLCAleG1tMTMKKwltb3ZhcHMJMHhjMCglcmJwKSwgJXhtbTE0CisJbW92YXBzCTB4ZDAoJXJicCksICV4bW0xNQorCWxlYQkweGEwKCVyYnApLCAlcnNwCitfX18KKyRjb2RlLj08PF9fXzsKKwltb3YJMHg0OCglcnNwKSwgJXIxNQorCW1vdgkweDUwKCVyc3ApLCAlcjE0CisJbW92CTB4NTgoJXJzcCksICVyMTMKKwltb3YJMHg2MCglcnNwKSwgJXIxMgorCW1vdgkweDY4KCVyc3ApLCAlcmJ4CisJbW92CTB4NzAoJXJzcCksICVyYXgKKwlsZWEJMHg3OCglcnNwKSwgJXJzcAorCW1vdgklcmF4LCAlcmJwCisuTHh0c19lbmNfZXBpbG9ndWU6CisJcmV0Cisuc2l6ZQlic2Flc194dHNfZW5jcnlwdCwuLWJzYWVzX3h0c19lbmNyeXB0CisKKy5nbG9ibAlic2Flc194dHNfZGVjcnlwdAorLnR5cGUJYnNhZXNfeHRzX2RlY3J5cHQsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2Citic2Flc194dHNfZGVjcnlwdDoKKwltb3YJJXJzcCwgJXJheAorLkx4dHNfZGVjX3Byb2xvZ3VlOgorCXB1c2gJJXJicAorCXB1c2gJJXJieAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCXB1c2gJJXIxNQorCWxlYQktMHg0OCglcnNwKSwgJXJzcAorX19fCiskY29kZS49PDxfX18gaWYgKCR3aW42NCk7CisJbW92CTB4YTAoJXJzcCksJGFyZzUJIyBwdWxsIGtleTIKKwltb3YJMHhhOCglcnNwKSwkYXJnNgkjIHB1bGwgaXZwCisJbGVhCS0weGEwKCVyc3ApLCAlcnNwCisJbW92YXBzCSV4bW02LCAweDQwKCVyc3ApCisJbW92YXBzCSV4bW03LCAweDUwKCVyc3ApCisJbW92YXBzCSV4bW04LCAweDYwKCVyc3ApCisJbW92YXBzCSV4bW05LCAweDcwKCVyc3ApCisJbW92YXBzCSV4bW0xMCwgMHg4MCglcnNwKQorCW1vdmFwcwkleG1tMTEsIDB4OTAoJXJzcCkKKwltb3ZhcHMJJXhtbTEyLCAweGEwKCVyc3ApCisJbW92YXBzCSV4bW0xMywgMHhiMCglcnNwKQorCW1vdmFwcwkleG1tMTQsIDB4YzAoJXJzcCkKKwltb3ZhcHMJJXhtbTE1LCAweGQwKCVyc3ApCisuTHh0c19kZWNfYm9keToKK19fXworJGNvZGUuPTw8X19fOworCW1vdgklcnNwLCAlcmJwCQkjIGJhY2t1cCAlcnNwCisJbW92CSRhcmcxLCAkaW5wCQkjIGJhY2t1cCBhcmd1bWVudHMKKwltb3YJJGFyZzIsICRvdXQKKwltb3YJJGFyZzMsICRsZW4KKwltb3YJJGFyZzQsICRrZXkKKworCWxlYQkoJGFyZzYpLCAkYXJnMQorCWxlYQkweDIwKCVyYnApLCAkYXJnMgorCWxlYQkoJGFyZzUpLCAkYXJnMworCWNhbGwJYXNtX0FFU19lbmNyeXB0CQkjIGdlbmVyYXRlIGluaXRpYWwgdHdlYWsKKworCW1vdgkyNDAoJGtleSksICVlYXgJCSMgcm91bmRzCisJbW92CSRsZW4sICVyYngJCSMgYmFja3VwICRsZW4KKworCW1vdgklZWF4LCAlZWR4CQkjIHJvdW5kcworCXNobAlcJDcsICVyYXgJCSMgMTI4IGJ5dGVzIHBlciBpbm5lciByb3VuZCBrZXkKKwlzdWIJXCRgMTI4LTMyYCwgJXJheAkjIHNpemUgb2YgYml0LXNsaWNlZCBrZXkgc2NoZWR1bGUKKwlzdWIJJXJheCwgJXJzcAorCisJbW92CSVyc3AsICVyYXgJCSMgcGFzcyBrZXkgc2NoZWR1bGUKKwltb3YJJGtleSwgJXJjeAkJIyBwYXNzIGtleQorCW1vdgklZWR4LCAlcjEwZAkJIyBwYXNzIHJvdW5kcworCWNhbGwJX2JzYWVzX2tleV9jb252ZXJ0CisJcHhvcgkoJXJzcCksICV4bW03CQkjIGZpeCB1cCByb3VuZCAwIGtleQorCW1vdmRxYQkleG1tNiwgKCVyYXgpCQkjIHNhdmUgbGFzdCByb3VuZCBrZXkKKwltb3ZkcWEJJXhtbTcsICglcnNwKQorCisJeG9yCSVlYXgsICVlYXgJCSMgaWYgKCRsZW4lMTYpIGxlbi09MTY7CisJYW5kCVwkLTE2LCAkbGVuCisJdGVzdAlcJDE1LCAlZWJ4CisJc2V0bnoJJWFsCisJc2hsCVwkNCwgJXJheAorCXN1YgklcmF4LCAkbGVuCisKKwlzdWIJXCQweDgwLCAlcnNwCQkjIHBsYWNlIGZvciB0d2Vha1s4XQorCW1vdmRxYQkweDIwKCVyYnApLCBAWE1NWzddCSMgaW5pdGlhbCB0d2VhaworCisJcHhvcgkkdHd0bXAsICR0d3RtcAorCW1vdmRxYQkuTHh0c19tYWdpYyglcmlwKSwgJHR3bWFzaworCXBjbXBndGQJQFhNTVs3XSwgJHR3dG1wCQkjIGJyb2FkY2FzdCB1cHBlciBiaXRzCisKKwlzdWIJXCQweDgwLCAkbGVuCisJamMJLkx4dHNfZGVjX3Nob3J0CisJam1wCS5MeHRzX2RlY19sb29wCisKKy5hbGlnbgkxNgorLkx4dHNfZGVjX2xvb3A6CitfX18KKyAgICBmb3IgKCRpPTA7JGk8NzskaSsrKSB7CisgICAgJGNvZGUuPTw8X19fOworCXBzaHVmZAlcJDB4MTMsICR0d3RtcCwgJHR3cmVzCisJcHhvcgkkdHd0bXAsICR0d3RtcAorCW1vdmRxYQlAWE1NWzddLCBAWE1NWyRpXQorCW1vdmRxYQlAWE1NWzddLCBgMHgxMCokaWAoJXJzcCkjIHNhdmUgdHdlYWtbJGldCisJcGFkZHEJQFhNTVs3XSwgQFhNTVs3XQkjIHBzbGxxCTEsJHR3ZWFrCisJcGFuZAkkdHdtYXNrLCAkdHdyZXMJCSMgaXNvbGF0ZSBjYXJyeSBhbmQgcmVzaWR1ZQorCXBjbXBndGQJQFhNTVs3XSwgJHR3dG1wCQkjIGJyb2FkY2FzdCB1cHBlciBiaXRzCisJcHhvcgkkdHdyZXMsIEBYTU1bN10KK19fXworICAgICRjb2RlLj08PF9fXyBpZiAoJGk+PTEpOworCW1vdmRxdQlgMHgxMCooJGktMSlgKCRpbnApLCBAWE1NWzgrJGktMV0KK19fXworICAgICRjb2RlLj08PF9fXyBpZiAoJGk+PTIpOworCXB4b3IJQFhNTVs4KyRpLTJdLCBAWE1NWyRpLTJdIyBpbnB1dFtdIF4gdHdlYWtbXQorX19fCisgICAgfQorJGNvZGUuPTw8X19fOworCW1vdmRxdQkweDYwKCRpbnApLCBAWE1NWzgrNl0KKwlweG9yCUBYTU1bOCs1XSwgQFhNTVs1XQorCW1vdmRxdQkweDcwKCRpbnApLCBAWE1NWzgrN10KKwlsZWEJMHg4MCgkaW5wKSwgJGlucAorCW1vdmRxYQlAWE1NWzddLCAweDcwKCVyc3ApCisJcHhvcglAWE1NWzgrNl0sIEBYTU1bNl0KKwlsZWEJMHg4MCglcnNwKSwgJXJheAkjIHBhc3Mga2V5IHNjaGVkdWxlCisJcHhvcglAWE1NWzgrN10sIEBYTU1bN10KKwltb3YJJWVkeCwgJXIxMGQJCSMgcGFzcyByb3VuZHMKKworCWNhbGwJX2JzYWVzX2RlY3J5cHQ4CisKKwlweG9yCTB4MDAoJXJzcCksIEBYTU1bMF0JIyBePSB0d2Vha1tdCisJcHhvcgkweDEwKCVyc3ApLCBAWE1NWzFdCisJbW92ZHF1CUBYTU1bMF0sIDB4MDAoJG91dCkJIyB3cml0ZSBvdXRwdXQKKwlweG9yCTB4MjAoJXJzcCksIEBYTU1bNl0KKwltb3ZkcXUJQFhNTVsxXSwgMHgxMCgkb3V0KQorCXB4b3IJMHgzMCglcnNwKSwgQFhNTVs0XQorCW1vdmRxdQlAWE1NWzZdLCAweDIwKCRvdXQpCisJcHhvcgkweDQwKCVyc3ApLCBAWE1NWzJdCisJbW92ZHF1CUBYTU1bNF0sIDB4MzAoJG91dCkKKwlweG9yCTB4NTAoJXJzcCksIEBYTU1bN10KKwltb3ZkcXUJQFhNTVsyXSwgMHg0MCgkb3V0KQorCXB4b3IJMHg2MCglcnNwKSwgQFhNTVszXQorCW1vdmRxdQlAWE1NWzddLCAweDUwKCRvdXQpCisJcHhvcgkweDcwKCVyc3ApLCBAWE1NWzVdCisJbW92ZHF1CUBYTU1bM10sIDB4NjAoJG91dCkKKwltb3ZkcXUJQFhNTVs1XSwgMHg3MCgkb3V0KQorCWxlYQkweDgwKCRvdXQpLCAkb3V0CisKKwltb3ZkcWEJMHg3MCglcnNwKSwgQFhNTVs3XQkjIHByZXBhcmUgbmV4dCBpdGVyYXRpb24gdHdlYWsKKwlweG9yCSR0d3RtcCwgJHR3dG1wCisJbW92ZHFhCS5MeHRzX21hZ2ljKCVyaXApLCAkdHdtYXNrCisJcGNtcGd0ZAlAWE1NWzddLCAkdHd0bXAKKwlwc2h1ZmQJXCQweDEzLCAkdHd0bXAsICR0d3JlcworCXB4b3IJJHR3dG1wLCAkdHd0bXAKKwlwYWRkcQlAWE1NWzddLCBAWE1NWzddCSMgcHNsbHEJMSwkdHdlYWsKKwlwYW5kCSR0d21hc2ssICR0d3JlcwkJIyBpc29sYXRlIGNhcnJ5IGFuZCByZXNpZHVlCisJcGNtcGd0ZAlAWE1NWzddLCAkdHd0bXAJCSMgYnJvYWRjYXN0IHVwcGVyIGJpdHMKKwlweG9yCSR0d3JlcywgQFhNTVs3XQorCisJc3ViCVwkMHg4MCwkbGVuCisJam5jCS5MeHRzX2RlY19sb29wCisKKy5MeHRzX2RlY19zaG9ydDoKKwlhZGQJXCQweDgwLCAkbGVuCisJanoJLkx4dHNfZGVjX2RvbmUKK19fXworICAgIGZvciAoJGk9MDskaTw3OyRpKyspIHsKKyAgICAkY29kZS49PDxfX187CisJcHNodWZkCVwkMHgxMywgJHR3dG1wLCAkdHdyZXMKKwlweG9yCSR0d3RtcCwgJHR3dG1wCisJbW92ZHFhCUBYTU1bN10sIEBYTU1bJGldCisJbW92ZHFhCUBYTU1bN10sIGAweDEwKiRpYCglcnNwKSMgc2F2ZSB0d2Vha1skaV0KKwlwYWRkcQlAWE1NWzddLCBAWE1NWzddCSMgcHNsbHEJMSwkdHdlYWsKKwlwYW5kCSR0d21hc2ssICR0d3JlcwkJIyBpc29sYXRlIGNhcnJ5IGFuZCByZXNpZHVlCisJcGNtcGd0ZAlAWE1NWzddLCAkdHd0bXAJCSMgYnJvYWRjYXN0IHVwcGVyIGJpdHMKKwlweG9yCSR0d3JlcywgQFhNTVs3XQorX19fCisgICAgJGNvZGUuPTw8X19fIGlmICgkaT49MSk7CisJbW92ZHF1CWAweDEwKigkaS0xKWAoJGlucCksIEBYTU1bOCskaS0xXQorCWNtcAlcJGAweDEwKiRpYCwkbGVuCisJamUJLkx4dHNfZGVjXyRpCitfX18KKyAgICAkY29kZS49PDxfX18gaWYgKCRpPj0yKTsKKwlweG9yCUBYTU1bOCskaS0yXSwgQFhNTVskaS0yXSMgaW5wdXRbXSBeIHR3ZWFrW10KK19fXworICAgIH0KKyRjb2RlLj08PF9fXzsKKwltb3ZkcXUJMHg2MCgkaW5wKSwgQFhNTVs4KzZdCisJcHhvcglAWE1NWzgrNV0sIEBYTU1bNV0KKwltb3ZkcWEJQFhNTVs3XSwgMHg3MCglcnNwKQorCWxlYQkweDcwKCRpbnApLCAkaW5wCisJcHhvcglAWE1NWzgrNl0sIEBYTU1bNl0KKwlsZWEJMHg4MCglcnNwKSwgJXJheAkjIHBhc3Mga2V5IHNjaGVkdWxlCisJbW92CSVlZHgsICVyMTBkCQkjIHBhc3Mgcm91bmRzCisKKwljYWxsCV9ic2Flc19kZWNyeXB0OAorCisJcHhvcgkweDAwKCVyc3ApLCBAWE1NWzBdCSMgXj0gdHdlYWtbXQorCXB4b3IJMHgxMCglcnNwKSwgQFhNTVsxXQorCW1vdmRxdQlAWE1NWzBdLCAweDAwKCRvdXQpCSMgd3JpdGUgb3V0cHV0CisJcHhvcgkweDIwKCVyc3ApLCBAWE1NWzZdCisJbW92ZHF1CUBYTU1bMV0sIDB4MTAoJG91dCkKKwlweG9yCTB4MzAoJXJzcCksIEBYTU1bNF0KKwltb3ZkcXUJQFhNTVs2XSwgMHgyMCgkb3V0KQorCXB4b3IJMHg0MCglcnNwKSwgQFhNTVsyXQorCW1vdmRxdQlAWE1NWzRdLCAweDMwKCRvdXQpCisJcHhvcgkweDUwKCVyc3ApLCBAWE1NWzddCisJbW92ZHF1CUBYTU1bMl0sIDB4NDAoJG91dCkKKwlweG9yCTB4NjAoJXJzcCksIEBYTU1bM10KKwltb3ZkcXUJQFhNTVs3XSwgMHg1MCgkb3V0KQorCW1vdmRxdQlAWE1NWzNdLCAweDYwKCRvdXQpCisJbGVhCTB4NzAoJG91dCksICRvdXQKKworCW1vdmRxYQkweDcwKCVyc3ApLCBAWE1NWzddCSMgbmV4dCBpdGVyYXRpb24gdHdlYWsKKwlqbXAJLkx4dHNfZGVjX2RvbmUKKy5hbGlnbgkxNgorLkx4dHNfZGVjXzY6CisJcHhvcglAWE1NWzgrNF0sIEBYTU1bNF0KKwlsZWEJMHg2MCgkaW5wKSwgJGlucAorCXB4b3IJQFhNTVs4KzVdLCBAWE1NWzVdCisJbGVhCTB4ODAoJXJzcCksICVyYXgJIyBwYXNzIGtleSBzY2hlZHVsZQorCW1vdgklZWR4LCAlcjEwZAkJIyBwYXNzIHJvdW5kcworCisJY2FsbAlfYnNhZXNfZGVjcnlwdDgKKworCXB4b3IJMHgwMCglcnNwKSwgQFhNTVswXQkjIF49IHR3ZWFrW10KKwlweG9yCTB4MTAoJXJzcCksIEBYTU1bMV0KKwltb3ZkcXUJQFhNTVswXSwgMHgwMCgkb3V0KQkjIHdyaXRlIG91dHB1dAorCXB4b3IJMHgyMCglcnNwKSwgQFhNTVs2XQorCW1vdmRxdQlAWE1NWzFdLCAweDEwKCRvdXQpCisJcHhvcgkweDMwKCVyc3ApLCBAWE1NWzRdCisJbW92ZHF1CUBYTU1bNl0sIDB4MjAoJG91dCkKKwlweG9yCTB4NDAoJXJzcCksIEBYTU1bMl0KKwltb3ZkcXUJQFhNTVs0XSwgMHgzMCgkb3V0KQorCXB4b3IJMHg1MCglcnNwKSwgQFhNTVs3XQorCW1vdmRxdQlAWE1NWzJdLCAweDQwKCRvdXQpCisJbW92ZHF1CUBYTU1bN10sIDB4NTAoJG91dCkKKwlsZWEJMHg2MCgkb3V0KSwgJG91dAorCisJbW92ZHFhCTB4NjAoJXJzcCksIEBYTU1bN10JIyBuZXh0IGl0ZXJhdGlvbiB0d2VhaworCWptcAkuTHh0c19kZWNfZG9uZQorLmFsaWduCTE2CisuTHh0c19kZWNfNToKKwlweG9yCUBYTU1bOCszXSwgQFhNTVszXQorCWxlYQkweDUwKCRpbnApLCAkaW5wCisJcHhvcglAWE1NWzgrNF0sIEBYTU1bNF0KKwlsZWEJMHg4MCglcnNwKSwgJXJheAkjIHBhc3Mga2V5IHNjaGVkdWxlCisJbW92CSVlZHgsICVyMTBkCQkjIHBhc3Mgcm91bmRzCisKKwljYWxsCV9ic2Flc19kZWNyeXB0OAorCisJcHhvcgkweDAwKCVyc3ApLCBAWE1NWzBdCSMgXj0gdHdlYWtbXQorCXB4b3IJMHgxMCglcnNwKSwgQFhNTVsxXQorCW1vdmRxdQlAWE1NWzBdLCAweDAwKCRvdXQpCSMgd3JpdGUgb3V0cHV0CisJcHhvcgkweDIwKCVyc3ApLCBAWE1NWzZdCisJbW92ZHF1CUBYTU1bMV0sIDB4MTAoJG91dCkKKwlweG9yCTB4MzAoJXJzcCksIEBYTU1bNF0KKwltb3ZkcXUJQFhNTVs2XSwgMHgyMCgkb3V0KQorCXB4b3IJMHg0MCglcnNwKSwgQFhNTVsyXQorCW1vdmRxdQlAWE1NWzRdLCAweDMwKCRvdXQpCisJbW92ZHF1CUBYTU1bMl0sIDB4NDAoJG91dCkKKwlsZWEJMHg1MCgkb3V0KSwgJG91dAorCisJbW92ZHFhCTB4NTAoJXJzcCksIEBYTU1bN10JIyBuZXh0IGl0ZXJhdGlvbiB0d2VhaworCWptcAkuTHh0c19kZWNfZG9uZQorLmFsaWduCTE2CisuTHh0c19kZWNfNDoKKwlweG9yCUBYTU1bOCsyXSwgQFhNTVsyXQorCWxlYQkweDQwKCRpbnApLCAkaW5wCisJcHhvcglAWE1NWzgrM10sIEBYTU1bM10KKwlsZWEJMHg4MCglcnNwKSwgJXJheAkjIHBhc3Mga2V5IHNjaGVkdWxlCisJbW92CSVlZHgsICVyMTBkCQkjIHBhc3Mgcm91bmRzCisKKwljYWxsCV9ic2Flc19kZWNyeXB0OAorCisJcHhvcgkweDAwKCVyc3ApLCBAWE1NWzBdCSMgXj0gdHdlYWtbXQorCXB4b3IJMHgxMCglcnNwKSwgQFhNTVsxXQorCW1vdmRxdQlAWE1NWzBdLCAweDAwKCRvdXQpCSMgd3JpdGUgb3V0cHV0CisJcHhvcgkweDIwKCVyc3ApLCBAWE1NWzZdCisJbW92ZHF1CUBYTU1bMV0sIDB4MTAoJG91dCkKKwlweG9yCTB4MzAoJXJzcCksIEBYTU1bNF0KKwltb3ZkcXUJQFhNTVs2XSwgMHgyMCgkb3V0KQorCW1vdmRxdQlAWE1NWzRdLCAweDMwKCRvdXQpCisJbGVhCTB4NDAoJG91dCksICRvdXQKKworCW1vdmRxYQkweDQwKCVyc3ApLCBAWE1NWzddCSMgbmV4dCBpdGVyYXRpb24gdHdlYWsKKwlqbXAJLkx4dHNfZGVjX2RvbmUKKy5hbGlnbgkxNgorLkx4dHNfZGVjXzM6CisJcHhvcglAWE1NWzgrMV0sIEBYTU1bMV0KKwlsZWEJMHgzMCgkaW5wKSwgJGlucAorCXB4b3IJQFhNTVs4KzJdLCBAWE1NWzJdCisJbGVhCTB4ODAoJXJzcCksICVyYXgJIyBwYXNzIGtleSBzY2hlZHVsZQorCW1vdgklZWR4LCAlcjEwZAkJIyBwYXNzIHJvdW5kcworCisJY2FsbAlfYnNhZXNfZGVjcnlwdDgKKworCXB4b3IJMHgwMCglcnNwKSwgQFhNTVswXQkjIF49IHR3ZWFrW10KKwlweG9yCTB4MTAoJXJzcCksIEBYTU1bMV0KKwltb3ZkcXUJQFhNTVswXSwgMHgwMCgkb3V0KQkjIHdyaXRlIG91dHB1dAorCXB4b3IJMHgyMCglcnNwKSwgQFhNTVs2XQorCW1vdmRxdQlAWE1NWzFdLCAweDEwKCRvdXQpCisJbW92ZHF1CUBYTU1bNl0sIDB4MjAoJG91dCkKKwlsZWEJMHgzMCgkb3V0KSwgJG91dAorCisJbW92ZHFhCTB4MzAoJXJzcCksIEBYTU1bN10JIyBuZXh0IGl0ZXJhdGlvbiB0d2VhaworCWptcAkuTHh0c19kZWNfZG9uZQorLmFsaWduCTE2CisuTHh0c19kZWNfMjoKKwlweG9yCUBYTU1bOCswXSwgQFhNTVswXQorCWxlYQkweDIwKCRpbnApLCAkaW5wCisJcHhvcglAWE1NWzgrMV0sIEBYTU1bMV0KKwlsZWEJMHg4MCglcnNwKSwgJXJheAkjIHBhc3Mga2V5IHNjaGVkdWxlCisJbW92CSVlZHgsICVyMTBkCQkjIHBhc3Mgcm91bmRzCisKKwljYWxsCV9ic2Flc19kZWNyeXB0OAorCisJcHhvcgkweDAwKCVyc3ApLCBAWE1NWzBdCSMgXj0gdHdlYWtbXQorCXB4b3IJMHgxMCglcnNwKSwgQFhNTVsxXQorCW1vdmRxdQlAWE1NWzBdLCAweDAwKCRvdXQpCSMgd3JpdGUgb3V0cHV0CisJbW92ZHF1CUBYTU1bMV0sIDB4MTAoJG91dCkKKwlsZWEJMHgyMCgkb3V0KSwgJG91dAorCisJbW92ZHFhCTB4MjAoJXJzcCksIEBYTU1bN10JIyBuZXh0IGl0ZXJhdGlvbiB0d2VhaworCWptcAkuTHh0c19kZWNfZG9uZQorLmFsaWduCTE2CisuTHh0c19kZWNfMToKKwlweG9yCUBYTU1bMF0sIEBYTU1bOF0KKwlsZWEJMHgxMCgkaW5wKSwgJGlucAorCW1vdmRxYQlAWE1NWzhdLCAweDIwKCVyYnApCisJbGVhCTB4MjAoJXJicCksICRhcmcxCisJbGVhCTB4MjAoJXJicCksICRhcmcyCisJbGVhCSgka2V5KSwgJGFyZzMKKwljYWxsCWFzbV9BRVNfZGVjcnlwdAkJIyBkb2Vzbid0IHRvdWNoICV4bW0KKwlweG9yCTB4MjAoJXJicCksIEBYTU1bMF0JIyBePSB0d2Vha1tdCisJI3B4b3IJQFhNTVs4XSwgQFhNTVswXQorCSNsZWEJMHg4MCglcnNwKSwgJXJheAkjIHBhc3Mga2V5IHNjaGVkdWxlCisJI21vdgklZWR4LCAlcjEwZAkJIyBwYXNzIHJvdW5kcworCSNjYWxsCV9ic2Flc19kZWNyeXB0OAorCSNweG9yCTB4MDAoJXJzcCksIEBYTU1bMF0JIyBePSB0d2Vha1tdCisJbW92ZHF1CUBYTU1bMF0sIDB4MDAoJG91dCkJIyB3cml0ZSBvdXRwdXQKKwlsZWEJMHgxMCgkb3V0KSwgJG91dAorCisJbW92ZHFhCTB4MTAoJXJzcCksIEBYTU1bN10JIyBuZXh0IGl0ZXJhdGlvbiB0d2VhaworCisuTHh0c19kZWNfZG9uZToKKwlhbmQJXCQxNSwgJWVieAorCWp6CS5MeHRzX2RlY19yZXQKKworCXB4b3IJJHR3dG1wLCAkdHd0bXAKKwltb3ZkcWEJLkx4dHNfbWFnaWMoJXJpcCksICR0d21hc2sKKwlwY21wZ3RkCUBYTU1bN10sICR0d3RtcAorCXBzaHVmZAlcJDB4MTMsICR0d3RtcCwgJHR3cmVzCisJbW92ZHFhCUBYTU1bN10sIEBYTU1bNl0KKwlwYWRkcQlAWE1NWzddLCBAWE1NWzddCSMgcHNsbHEgMSwkdHdlYWsKKwlwYW5kCSR0d21hc2ssICR0d3JlcwkJIyBpc29sYXRlIGNhcnJ5IGFuZCByZXNpZHVlCisJbW92ZHF1CSgkaW5wKSwgQFhNTVswXQorCXB4b3IJJHR3cmVzLCBAWE1NWzddCisKKwlsZWEJMHgyMCglcmJwKSwgJGFyZzEKKwlweG9yCUBYTU1bN10sIEBYTU1bMF0KKwlsZWEJMHgyMCglcmJwKSwgJGFyZzIKKwltb3ZkcWEJQFhNTVswXSwgMHgyMCglcmJwKQorCWxlYQkoJGtleSksICRhcmczCisJY2FsbAlhc21fQUVTX2RlY3J5cHQJCSMgZG9lc24ndCB0b3VjaCAleG1tCisJcHhvcgkweDIwKCVyYnApLCBAWE1NWzddCisJbW92CSRvdXQsICVyZHgKKwltb3ZkcXUJQFhNTVs3XSwgKCRvdXQpCisKKy5MeHRzX2RlY19zdGVhbDoKKwltb3Z6YgkxNigkaW5wKSwgJWVheAorCW1vdnpiCSglcmR4KSwgJWVjeAorCWxlYQkxKCRpbnApLCAkaW5wCisJbW92CSVhbCwgKCVyZHgpCisJbW92CSVjbCwgMTYoJXJkeCkKKwlsZWEJMSglcmR4KSwgJXJkeAorCXN1YglcJDEsJWVieAorCWpuegkuTHh0c19kZWNfc3RlYWwKKworCW1vdmRxdQkoJG91dCksIEBYTU1bMF0KKwlsZWEJMHgyMCglcmJwKSwgJGFyZzEKKwlweG9yCUBYTU1bNl0sIEBYTU1bMF0KKwlsZWEJMHgyMCglcmJwKSwgJGFyZzIKKwltb3ZkcWEJQFhNTVswXSwgMHgyMCglcmJwKQorCWxlYQkoJGtleSksICRhcmczCisJY2FsbAlhc21fQUVTX2RlY3J5cHQJCSMgZG9lc24ndCB0b3VjaCAleG1tCisJcHhvcgkweDIwKCVyYnApLCBAWE1NWzZdCisJbW92ZHF1CUBYTU1bNl0sICgkb3V0KQorCisuTHh0c19kZWNfcmV0OgorCWxlYQkoJXJzcCksICVyYXgKKwlweG9yCSV4bW0wLCAleG1tMAorLkx4dHNfZGVjX2J6ZXJvOgkJCSMgd2lwZSBrZXkgc2NoZWR1bGUgW2lmIGFueV0KKwltb3ZkcWEJJXhtbTAsIDB4MDAoJXJheCkKKwltb3ZkcWEJJXhtbTAsIDB4MTAoJXJheCkKKwlsZWEJMHgyMCglcmF4KSwgJXJheAorCWNtcAklcmF4LCAlcmJwCisJamEJLkx4dHNfZGVjX2J6ZXJvCisKKwlsZWEJKCVyYnApLCVyc3AJCSMgcmVzdG9yZSAlcnNwCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJHdpbjY0KTsKKwltb3ZhcHMJMHg0MCglcmJwKSwgJXhtbTYKKwltb3ZhcHMJMHg1MCglcmJwKSwgJXhtbTcKKwltb3ZhcHMJMHg2MCglcmJwKSwgJXhtbTgKKwltb3ZhcHMJMHg3MCglcmJwKSwgJXhtbTkKKwltb3ZhcHMJMHg4MCglcmJwKSwgJXhtbTEwCisJbW92YXBzCTB4OTAoJXJicCksICV4bW0xMQorCW1vdmFwcwkweGEwKCVyYnApLCAleG1tMTIKKwltb3ZhcHMJMHhiMCglcmJwKSwgJXhtbTEzCisJbW92YXBzCTB4YzAoJXJicCksICV4bW0xNAorCW1vdmFwcwkweGQwKCVyYnApLCAleG1tMTUKKwlsZWEJMHhhMCglcmJwKSwgJXJzcAorX19fCiskY29kZS49PDxfX187CisJbW92CTB4NDgoJXJzcCksICVyMTUKKwltb3YJMHg1MCglcnNwKSwgJXIxNAorCW1vdgkweDU4KCVyc3ApLCAlcjEzCisJbW92CTB4NjAoJXJzcCksICVyMTIKKwltb3YJMHg2OCglcnNwKSwgJXJieAorCW1vdgkweDcwKCVyc3ApLCAlcmF4CisJbGVhCTB4NzgoJXJzcCksICVyc3AKKwltb3YJJXJheCwgJXJicAorLkx4dHNfZGVjX2VwaWxvZ3VlOgorCXJldAorLnNpemUJYnNhZXNfeHRzX2RlY3J5cHQsLi1ic2Flc194dHNfZGVjcnlwdAorX19fCit9CiskY29kZS49PDxfX187CisudHlwZQlfYnNhZXNfY29uc3QsXEBvYmplY3QKKy5hbGlnbgk2NAorX2JzYWVzX2NvbnN0OgorLkxNMElTUjoJIyBJbnZTaGlmdFJvd3MgY29uc3RhbnRzCisJLnF1YWQJMHgwYTBlMDIwNjA3MGIwZjAzLCAweDAwMDQwODBjMGQwMTA1MDkKKy5MSVNSTTA6CisJLnF1YWQJMHgwMTA0MGIwZTAyMDUwODBmLCAweDAzMDYwOTBjMDAwNzBhMGQKKy5MSVNSOgorCS5xdWFkCTB4MDUwNDA3MDYwMjAxMDAwMywgMHgwZjBlMGQwYzA4MGIwYTA5CisuTEJTMDoJCSMgYml0LXNsaWNlIGNvbnN0YW50cworCS5xdWFkCTB4NTU1NTU1NTU1NTU1NTU1NSwgMHg1NTU1NTU1NTU1NTU1NTU1CisuTEJTMToKKwkucXVhZAkweDMzMzMzMzMzMzMzMzMzMzMsIDB4MzMzMzMzMzMzMzMzMzMzMworLkxCUzI6CisJLnF1YWQJMHgwZjBmMGYwZjBmMGYwZjBmLCAweDBmMGYwZjBmMGYwZjBmMGYKKy5MU1I6CQkjIHNoaWZ0cm93cyBjb25zdGFudHMKKwkucXVhZAkweDA1MDQwNzA2MDAwMzAyMDEsIDB4MGYwZTBkMGMwYTA5MDgwYgorLkxTUk0wOgorCS5xdWFkCTB4MDMwNDA5MGUwMDA1MGEwZiwgMHgwMTA2MGIwYzAyMDcwODBkCisuTE0wU1I6CisJLnF1YWQJMHgwYTBlMDIwNjBmMDMwNzBiLCAweDAwMDQwODBjMDUwOTBkMDEKKy5MU1dQVVA6CSMgYnl0ZS1zd2FwIHVwcGVyIGR3b3JkCisJLnF1YWQJMHgwNzA2MDUwNDAzMDIwMTAwLCAweDBjMGQwZTBmMGIwYTA5MDgKKy5MU1dQVVBNMFNSOgorCS5xdWFkCTB4MGEwZDAyMDYwYzAzMDcwYiwgMHgwMDA0MDgwZjA1MDkwZTAxCisuTEFERDE6CQkjIGNvdW50ZXIgaW5jcmVtZW50IGNvbnN0YW50cworCS5xdWFkCTB4MDAwMDAwMDAwMDAwMDAwMCwgMHgwMDAwMDAwMTAwMDAwMDAwCisuTEFERDI6CisJLnF1YWQJMHgwMDAwMDAwMDAwMDAwMDAwLCAweDAwMDAwMDAyMDAwMDAwMDAKKy5MQUREMzoKKwkucXVhZAkweDAwMDAwMDAwMDAwMDAwMDAsIDB4MDAwMDAwMDMwMDAwMDAwMAorLkxBREQ0OgorCS5xdWFkCTB4MDAwMDAwMDAwMDAwMDAwMCwgMHgwMDAwMDAwNDAwMDAwMDAwCisuTEFERDU6CisJLnF1YWQJMHgwMDAwMDAwMDAwMDAwMDAwLCAweDAwMDAwMDA1MDAwMDAwMDAKKy5MQURENjoKKwkucXVhZAkweDAwMDAwMDAwMDAwMDAwMDAsIDB4MDAwMDAwMDYwMDAwMDAwMAorLkxBREQ3OgorCS5xdWFkCTB4MDAwMDAwMDAwMDAwMDAwMCwgMHgwMDAwMDAwNzAwMDAwMDAwCisuTEFERDg6CisJLnF1YWQJMHgwMDAwMDAwMDAwMDAwMDAwLCAweDAwMDAwMDA4MDAwMDAwMDAKKy5MeHRzX21hZ2ljOgorCS5sb25nCTB4ODcsMCwxLDAKKy5MbWFza3M6CisJLnF1YWQJMHgwMTAxMDEwMTAxMDEwMTAxLCAweDAxMDEwMTAxMDEwMTAxMDEKKwkucXVhZAkweDAyMDIwMjAyMDIwMjAyMDIsIDB4MDIwMjAyMDIwMjAyMDIwMgorCS5xdWFkCTB4MDQwNDA0MDQwNDA0MDQwNCwgMHgwNDA0MDQwNDA0MDQwNDA0CisJLnF1YWQJMHgwODA4MDgwODA4MDgwODA4LCAweDA4MDgwODA4MDgwODA4MDgKKy5MTTA6CisJLnF1YWQJMHgwMjA2MGEwZTAzMDcwYjBmLCAweDAwMDQwODBjMDEwNTA5MGQKKy5MNjM6CisJLnF1YWQJMHg2MzYzNjM2MzYzNjM2MzYzLCAweDYzNjM2MzYzNjM2MzYzNjMKKy5hc2NpegkiQml0LXNsaWNlZCBBRVMgZm9yIHg4Nl82NC9TU1NFMywgRW1pbGlhIEvDpHNwZXIsIFBldGVyIFNjaHdhYmUsIEFuZHkgUG9seWFrb3YiCisuYWxpZ24JNjQKKy5zaXplCV9ic2Flc19jb25zdCwuLV9ic2Flc19jb25zdAorX19fCisKKyMgRVhDRVBUSU9OX0RJU1BPU0lUSU9OIGhhbmRsZXIgKEVYQ0VQVElPTl9SRUNPUkQgKnJlYyxVTE9ORzY0IGZyYW1lLAorIwkJQ09OVEVYVCAqY29udGV4dCxESVNQQVRDSEVSX0NPTlRFWFQgKmRpc3ApCitpZiAoJHdpbjY0KSB7CiskcmVjPSIlcmN4IjsKKyRmcmFtZT0iJXJkeCI7CiskY29udGV4dD0iJXI4IjsKKyRkaXNwPSIlcjkiOworCiskY29kZS49PDxfX187CisuZXh0ZXJuCV9faW1wX1J0bFZpcnR1YWxVbndpbmQKKy50eXBlCXNlX2hhbmRsZXIsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2CitzZV9oYW5kbGVyOgorCXB1c2gJJXJzaQorCXB1c2gJJXJkaQorCXB1c2gJJXJieAorCXB1c2gJJXJicAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCXB1c2gJJXIxNQorCXB1c2hmcQorCXN1YglcJDY0LCVyc3AKKworCW1vdgkxMjAoJGNvbnRleHQpLCVyYXgJIyBwdWxsIGNvbnRleHQtPlJheAorCW1vdgkyNDgoJGNvbnRleHQpLCVyYngJIyBwdWxsIGNvbnRleHQtPlJpcAorCisJbW92CTgoJGRpc3ApLCVyc2kJCSMgZGlzcC0+SW1hZ2VCYXNlCisJbW92CTU2KCRkaXNwKSwlcjExCQkjIGRpc3AtPkhhbmRsZXJEYXRhCisKKwltb3YJMCglcjExKSwlcjEwZAkJIyBIYW5kbGVyRGF0YVswXQorCWxlYQkoJXJzaSwlcjEwKSwlcjEwCSMgcHJvbG9ndWUgbGFiZWwKKwljbXAJJXIxMCwlcmJ4CQkjIGNvbnRleHQtPlJpcDxwcm9sb2d1ZSBsYWJlbAorCWpiCS5MaW5fcHJvbG9ndWUKKworCW1vdgkxNTIoJGNvbnRleHQpLCVyYXgJIyBwdWxsIGNvbnRleHQtPlJzcAorCisJbW92CTQoJXIxMSksJXIxMGQJCSMgSGFuZGxlckRhdGFbMV0KKwlsZWEJKCVyc2ksJXIxMCksJXIxMAkjIGVwaWxvZ3VlIGxhYmVsCisJY21wCSVyMTAsJXJieAkJIyBjb250ZXh0LT5SaXA+PWVwaWxvZ3VlIGxhYmVsCisJamFlCS5MaW5fcHJvbG9ndWUKKworCW1vdgkxNjAoJGNvbnRleHQpLCVyYXgJIyBwdWxsIGNvbnRleHQtPlJicAorCisJbGVhCTB4NDAoJXJheCksJXJzaQkJIyAleG1tIHNhdmUgYXJlYQorCWxlYQk1MTIoJGNvbnRleHQpLCVyZGkJIyAmY29udGV4dC5YbW02CisJbW92CVwkMjAsJWVjeAkJIyAxMCpzaXplb2YoJXhtbTApL3NpemVvZiglcmF4KQorCS5sb25nCTB4YTU0OGYzZmMJCSMgY2xkOyByZXAgbW92c3EKKwlsZWEJMHhhMCglcmF4KSwlcmF4CQkjIGFkanVzdCBzdGFjayBwb2ludGVyCisKKwltb3YJMHg3MCglcmF4KSwlcmJwCisJbW92CTB4NjgoJXJheCksJXJieAorCW1vdgkweDYwKCVyYXgpLCVyMTIKKwltb3YJMHg1OCglcmF4KSwlcjEzCisJbW92CTB4NTAoJXJheCksJXIxNAorCW1vdgkweDQ4KCVyYXgpLCVyMTUKKwlsZWEJMHg3OCglcmF4KSwlcmF4CQkjIGFkanVzdCBzdGFjayBwb2ludGVyCisJbW92CSVyYngsMTQ0KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UmJ4CisJbW92CSVyYnAsMTYwKCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UmJwCisJbW92CSVyMTIsMjE2KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UjEyCisJbW92CSVyMTMsMjI0KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UjEzCisJbW92CSVyMTQsMjMyKCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UjE0CisJbW92CSVyMTUsMjQwKCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UjE1CisKKy5MaW5fcHJvbG9ndWU6CisJbW92CSVyYXgsMTUyKCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UnNwCisKKwltb3YJNDAoJGRpc3ApLCVyZGkJCSMgZGlzcC0+Q29udGV4dFJlY29yZAorCW1vdgkkY29udGV4dCwlcnNpCQkjIGNvbnRleHQKKwltb3YJXCRgMTIzMi84YCwlZWN4CQkjIHNpemVvZihDT05URVhUKQorCS5sb25nCTB4YTU0OGYzZmMJCSMgY2xkOyByZXAgbW92c3EKKworCW1vdgkkZGlzcCwlcnNpCisJeG9yCSVyY3gsJXJjeAkJIyBhcmcxLCBVTldfRkxBR19OSEFORExFUgorCW1vdgk4KCVyc2kpLCVyZHgJCSMgYXJnMiwgZGlzcC0+SW1hZ2VCYXNlCisJbW92CTAoJXJzaSksJXI4CQkjIGFyZzMsIGRpc3AtPkNvbnRyb2xQYworCW1vdgkxNiglcnNpKSwlcjkJCSMgYXJnNCwgZGlzcC0+RnVuY3Rpb25FbnRyeQorCW1vdgk0MCglcnNpKSwlcjEwCQkjIGRpc3AtPkNvbnRleHRSZWNvcmQKKwlsZWEJNTYoJXJzaSksJXIxMQkJIyAmZGlzcC0+SGFuZGxlckRhdGEKKwlsZWEJMjQoJXJzaSksJXIxMgkJIyAmZGlzcC0+RXN0YWJsaXNoZXJGcmFtZQorCW1vdgklcjEwLDMyKCVyc3ApCQkjIGFyZzUKKwltb3YJJXIxMSw0MCglcnNwKQkJIyBhcmc2CisJbW92CSVyMTIsNDgoJXJzcCkJCSMgYXJnNworCW1vdgklcmN4LDU2KCVyc3ApCQkjIGFyZzgsIChOVUxMKQorCWNhbGwJKl9faW1wX1J0bFZpcnR1YWxVbndpbmQoJXJpcCkKKworCW1vdglcJDEsJWVheAkJIyBFeGNlcHRpb25Db250aW51ZVNlYXJjaAorCWFkZAlcJDY0LCVyc3AKKwlwb3BmcQorCXBvcAklcjE1CisJcG9wCSVyMTQKKwlwb3AJJXIxMworCXBvcAklcjEyCisJcG9wCSVyYnAKKwlwb3AJJXJieAorCXBvcAklcmRpCisJcG9wCSVyc2kKKwlyZXQKKy5zaXplCXNlX2hhbmRsZXIsLi1zZV9oYW5kbGVyCisKKy5zZWN0aW9uCS5wZGF0YQorLmFsaWduCTQKK19fXworJGNvZGUuPTw8X19fIGlmICgkZWNiKTsKKwkucnZhCS5MZWNiX2VuY19wcm9sb2d1ZQorCS5ydmEJLkxlY2JfZW5jX2VwaWxvZ3VlCisJLnJ2YQkuTGVjYl9lbmNfaW5mbworCisJLnJ2YQkuTGVjYl9kZWNfcHJvbG9ndWUKKwkucnZhCS5MZWNiX2RlY19lcGlsb2d1ZQorCS5ydmEJLkxlY2JfZGVjX2luZm8KK19fXworJGNvZGUuPTw8X19fOworCS5ydmEJLkxjYmNfZGVjX3Byb2xvZ3VlCisJLnJ2YQkuTGNiY19kZWNfZXBpbG9ndWUKKwkucnZhCS5MY2JjX2RlY19pbmZvCisKKwkucnZhCS5MY3RyX2VuY19wcm9sb2d1ZQorCS5ydmEJLkxjdHJfZW5jX2VwaWxvZ3VlCisJLnJ2YQkuTGN0cl9lbmNfaW5mbworCisJLnJ2YQkuTHh0c19lbmNfcHJvbG9ndWUKKwkucnZhCS5MeHRzX2VuY19lcGlsb2d1ZQorCS5ydmEJLkx4dHNfZW5jX2luZm8KKworCS5ydmEJLkx4dHNfZGVjX3Byb2xvZ3VlCisJLnJ2YQkuTHh0c19kZWNfZXBpbG9ndWUKKwkucnZhCS5MeHRzX2RlY19pbmZvCisKKy5zZWN0aW9uCS54ZGF0YQorLmFsaWduCTgKK19fXworJGNvZGUuPTw8X19fIGlmICgkZWNiKTsKKy5MZWNiX2VuY19pbmZvOgorCS5ieXRlCTksMCwwLDAKKwkucnZhCXNlX2hhbmRsZXIKKwkucnZhCS5MZWNiX2VuY19ib2R5LC5MZWNiX2VuY19lcGlsb2d1ZQkjIEhhbmRsZXJEYXRhW10KKy5MZWNiX2RlY19pbmZvOgorCS5ieXRlCTksMCwwLDAKKwkucnZhCXNlX2hhbmRsZXIKKwkucnZhCS5MZWNiX2RlY19ib2R5LC5MZWNiX2RlY19lcGlsb2d1ZQkjIEhhbmRsZXJEYXRhW10KK19fXworJGNvZGUuPTw8X19fOworLkxjYmNfZGVjX2luZm86CisJLmJ5dGUJOSwwLDAsMAorCS5ydmEJc2VfaGFuZGxlcgorCS5ydmEJLkxjYmNfZGVjX2JvZHksLkxjYmNfZGVjX2VwaWxvZ3VlCSMgSGFuZGxlckRhdGFbXQorLkxjdHJfZW5jX2luZm86CisJLmJ5dGUJOSwwLDAsMAorCS5ydmEJc2VfaGFuZGxlcgorCS5ydmEJLkxjdHJfZW5jX2JvZHksLkxjdHJfZW5jX2VwaWxvZ3VlCSMgSGFuZGxlckRhdGFbXQorLkx4dHNfZW5jX2luZm86CisJLmJ5dGUJOSwwLDAsMAorCS5ydmEJc2VfaGFuZGxlcgorCS5ydmEJLkx4dHNfZW5jX2JvZHksLkx4dHNfZW5jX2VwaWxvZ3VlCSMgSGFuZGxlckRhdGFbXQorLkx4dHNfZGVjX2luZm86CisJLmJ5dGUJOSwwLDAsMAorCS5ydmEJc2VfaGFuZGxlcgorCS5ydmEJLkx4dHNfZGVjX2JvZHksLkx4dHNfZGVjX2VwaWxvZ3VlCSMgSGFuZGxlckRhdGFbXQorX19fCit9CisKKyRjb2RlID1+IHMvXGAoW15cYF0qKVxgL2V2YWwoJDEpL2dlbTsKKworcHJpbnQgJGNvZGU7CisKK2Nsb3NlIFNURE9VVDsKZGlmZiAtLWdpdCBhL2NyeXB0by9hZXMvYXNtL3ZwYWVzLXg4Ni5wbCBiL2NyeXB0by9hZXMvYXNtL3ZwYWVzLXg4Ni5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWNmNDJjCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2Flcy9hc20vdnBhZXMteDg2LnBsCkBAIC0wLDAgKzEsOTAyIEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIENvbnN0YW50LXRpbWUgU1NTRTMgQUVTIGNvcmUgaW1wbGVtZW50YXRpb24uCisjIyB2ZXJzaW9uIDAuMQorIyMKKyMjIEJ5IE1pa2UgSGFtYnVyZyAoU3RhbmZvcmQgVW5pdmVyc2l0eSksIDIwMDkKKyMjIFB1YmxpYyBkb21haW4uCisjIworIyMgRm9yIGRldGFpbHMgc2VlIGh0dHA6Ly9zaGlmdGxlZnQub3JnL3BhcGVycy92ZWN0b3JfYWVzLyBhbmQKKyMjIGh0dHA6Ly9jcnlwdG8uc3RhbmZvcmQuZWR1L3ZwYWVzLy4KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBTZXB0ZW1iZXIgMjAxMS4KKyMKKyMgUG9ydCB2cGFlcy14ODZfNjQucGwgYXMgMzItYml0ICJhbG1vc3QiIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yCisjIGFlcy01ODYucGwuICJBbG1vc3QiIHJlZmVycyB0byB0aGUgZmFjdCB0aGF0IEFFU19jYmNfZW5jcnlwdAorIyBkb2Vzbid0IGhhbmRsZSBwYXJ0aWFsIHZlY3RvcnMgKGRvZXNuJ3QgaGF2ZSB0byBpZiBjYWxsZWQgZnJvbQorIyBFVlAgb25seSkuICJEcm9wLWluIiBpbXBsaWVzIHRoYXQgdGhpcyBtb2R1bGUgZG9lc24ndCBzaGFyZSBrZXkKKyMgc2NoZWR1bGUgc3RydWN0dXJlIHdpdGggdGhlIG9yaWdpbmFsIG5vciBkb2VzIGl0IG1ha2UgYXNzdW1wdGlvbgorIyBhYm91dCBpdHMgYWxpZ25tZW50Li4uCisjCisjIFBlcmZvcm1hbmNlIHN1bW1hcnkuIGFlcy01ODYucGwgY29sdW1uIGxpc3RzIGxhcmdlLWJsb2NrIENCQworIyBlbmNyeXB0L2RlY3J5cHQvd2l0aC1oeXBlci10aHJlYWRpbmctb2ZmKCopIHJlc3VsdHMgaW4gY3ljbGVzIHBlcgorIyBieXRlIHByb2Nlc3NlZCB3aXRoIDEyOC1iaXQga2V5LCBhbmQgdnBhZXMteDg2LnBsIGNvbHVtbiAtIFthbHNvCisjIGxhcmdlLWJsb2NrIENCQ10gZW5jcnlwdC9kZWNyeXB0LgorIworIwkJYWVzLTU4Ni5wbAkJdnBhZXMteDg2LnBsCisjCisjIENvcmUgMigqKikJMjguMS80MS40LzE4LjMJCTIxLjkvMjUuMigqKiopCisjIE5laGFsZW0JMjcuOS80MC40LzE4LjEJCTEwLjIvMTEuOQorIyBBdG9tCQk3MC43LzkyLjEvNjAuMQkJNjEuMS83NS40KCoqKikKKyMKKyMgKCopCSJIeXBlci10aHJlYWRpbmciIGluIHRoZSBjb250ZXh0IHJlZmVycyByYXRoZXIgdG8gY2FjaGUgc2hhcmVkCisjCWFtb25nIG11bHRpcGxlIGNvcmVzLCB0aGFuIHRvIHNwZWNpZmljYWxseSBJbnRlbCBIVFQuIEFzIHZhc3QKKyMJbWFqb3JpdHkgb2YgY29udGVtcG9yYXJ5IGNvcmVzIHNoYXJlIGNhY2hlLCBzbG93ZXIgY29kZSBwYXRoCisjCWlzIGNvbW1vbiBwbGFjZS4gSW4gb3RoZXIgd29yZHMgIndpdGgtaHlwZXItdGhyZWFkaW5nLW9mZiIKKyMJcmVzdWx0cyBhcmUgcHJlc2VudGVkIG1vc3RseSBmb3IgcmVmZXJlbmNlIHB1cnBvc2VzLgorIworIyAoKiopCSJDb3JlIDIiIHJlZmVycyB0byBpbml0aWFsIDY1bm0gZGVzaWduLCBhLmsuYS4gQ29ucm9lLgorIworIyAoKioqKQlMZXNzIGltcHJlc3NpdmUgaW1wcm92ZW1lbnQgb24gQ29yZSAyIGFuZCBBdG9tIGlzIGR1ZSB0byBzbG93CisjCXBzaHVmYiwJeWV0IGl0J3MgcmVzcGVjdGFibGUgKzI4JS82NCUgIGltcHJvdmVtZW50IG9uIENvcmUgMgorIwlhbmQgKzE1JSBvbiBBdG9tIChhcyBpbXBsaWVkLCBvdmVyICJoeXBlci10aHJlYWRpbmctc2FmZSIKKyMJY29kZSBwYXRoKS4KKyMKKyMJCQkJCQk8YXBwcm9Ab3BlbnNzbC5vcmc+CisKKyQwID1+IG0vKC4qW1wvXFxdKVteXC9cXF0rJC87ICRkaXI9JDE7CitwdXNoKEBJTkMsIiR7ZGlyfSIsIiR7ZGlyfS4uLy4uL3Blcmxhc20iKTsKK3JlcXVpcmUgIng4NmFzbS5wbCI7CisKKyZhc21faW5pdCgkQVJHVlswXSwidnBhZXMteDg2LnBsIiwkeDg2b25seSA9ICRBUkdWWyQjQVJHVl0gZXEgIjM4NiIpOworCiskUFJFRklYPSJ2cGFlcyI7CisKK215ICAoJHJvdW5kLCAkYmFzZSwgJG1hZ2ljLCAka2V5LCAkY29uc3QsICRpbnAsICRvdXQpPQorICAgICgiZWF4IiwgICJlYngiLCAiZWN4IiwgICJlZHgiLCJlYnAiLCAgImVzaSIsImVkaSIpOworCismc3RhdGljX2xhYmVsKCJfdnBhZXNfY29uc3RzIik7Cismc3RhdGljX2xhYmVsKCJfdnBhZXNfc2NoZWR1bGVfbG93X3JvdW5kIik7CisKKyZzZXRfbGFiZWwoIl92cGFlc19jb25zdHMiLDY0KTsKKyRrX2ludj0tMHgzMDsJCSMgaW52LCBpbnZhCisJJmRhdGFfd29yZCgweDBEMDgwMTgwLDB4MEUwNTA2MEYsMHgwQTBCMEMwMiwweDA0MDcwMzA5KTsKKwkmZGF0YV93b3JkKDB4MEYwQjA3ODAsMHgwMTA0MEEwNiwweDAyMDUwODA5LDB4MDMwRDBFMEMpOworCiska19zMEY9LTB4MTA7CQkjIHMwRgorCSZkYXRhX3dvcmQoMHgwRjBGMEYwRiwweDBGMEYwRjBGLDB4MEYwRjBGMEYsMHgwRjBGMEYwRik7CisKKyRrX2lwdD0weDAwOwkJIyBpbnB1dCB0cmFuc2Zvcm0gKGxvLCBoaSkKKwkmZGF0YV93b3JkKDB4NUEyQTcwMDAsMHhDMkIyRTg5OCwweDUyMjI3ODA4LDB4Q0FCQUUwOTApOworCSZkYXRhX3dvcmQoMHgzMTdDNEQwMCwweDRDMDEzMDdELDB4QjBGRENDODEsMHhDRDgwQjFGQyk7CisKKyRrX3NiMT0weDIwOwkJIyBzYjF1LCBzYjF0CisJJmRhdGFfd29yZCgweENCNTAzRTAwLDB4QjE5QkUxOEYsMHgxNDJBRjU0NCwweEE1REY3QTZFKTsKKwkmZGF0YV93b3JkKDB4RkFFMjIzMDAsMHgzNjE4RDQxNSwweDBEMkVEOUVGLDB4M0JGN0NDQzEpOworJGtfc2IyPTB4NDA7CQkjIHNiMnUsIHNiMnQKKwkmZGF0YV93b3JkKDB4MEI3MTI0MDAsMHhFMjdBOTNDNiwweEJDOTgyRkNELDB4NUVCN0U5NTUpOworCSZkYXRhX3dvcmQoMHgwQUUxMjkwMCwweDY5RUI4ODQwLDB4QUI4MjIzNEEsMHhDMkExNjNDOCk7Ciska19zYm89MHg2MDsJCSMgc2JvdSwgc2JvdAorCSZkYXRhX3dvcmQoMHg2RkJEQzcwMCwweEQwRDI2RDE3LDB4QzUwMkE4NzgsMHgxNUFBQkY3QSk7CisJJmRhdGFfd29yZCgweDVGQkI2QTAwLDB4Q0ZFNDc0QTUsMHg0MTJCMzVGQSwweDhFMUU5MEQxKTsKKworJGtfbWNfZm9yd2FyZD0weDgwOwkjIG1jX2ZvcndhcmQKKwkmZGF0YV93b3JkKDB4MDAwMzAyMDEsMHgwNDA3MDYwNSwweDA4MEIwQTA5LDB4MEMwRjBFMEQpOworCSZkYXRhX3dvcmQoMHgwNDA3MDYwNSwweDA4MEIwQTA5LDB4MEMwRjBFMEQsMHgwMDAzMDIwMSk7CisJJmRhdGFfd29yZCgweDA4MEIwQTA5LDB4MEMwRjBFMEQsMHgwMDAzMDIwMSwweDA0MDcwNjA1KTsKKwkmZGF0YV93b3JkKDB4MEMwRjBFMEQsMHgwMDAzMDIwMSwweDA0MDcwNjA1LDB4MDgwQjBBMDkpOworCiska19tY19iYWNrd2FyZD0weGMwOwkjIG1jX2JhY2t3YXJkCisJJmRhdGFfd29yZCgweDAyMDEwMDAzLDB4MDYwNTA0MDcsMHgwQTA5MDgwQiwweDBFMEQwQzBGKTsKKwkmZGF0YV93b3JkKDB4MEUwRDBDMEYsMHgwMjAxMDAwMywweDA2MDUwNDA3LDB4MEEwOTA4MEIpOworCSZkYXRhX3dvcmQoMHgwQTA5MDgwQiwweDBFMEQwQzBGLDB4MDIwMTAwMDMsMHgwNjA1MDQwNyk7CisJJmRhdGFfd29yZCgweDA2MDUwNDA3LDB4MEEwOTA4MEIsMHgwRTBEMEMwRiwweDAyMDEwMDAzKTsKKworJGtfc3I9MHgxMDA7CQkjIHNyCisJJmRhdGFfd29yZCgweDAzMDIwMTAwLDB4MDcwNjA1MDQsMHgwQjBBMDkwOCwweDBGMEUwRDBDKTsKKwkmZGF0YV93b3JkKDB4MEYwQTA1MDAsMHgwMzBFMDkwNCwweDA3MDIwRDA4LDB4MEIwNjAxMEMpOworCSZkYXRhX3dvcmQoMHgwQjAyMDkwMCwweDBGMDYwRDA0LDB4MDMwQTAxMDgsMHgwNzBFMDUwQyk7CisJJmRhdGFfd29yZCgweDA3MEEwRDAwLDB4MEIwRTAxMDQsMHgwRjAyMDUwOCwweDAzMDYwOTBDKTsKKworJGtfcmNvbj0weDE0MDsJCSMgcmNvbgorCSZkYXRhX3dvcmQoMHhBRjlERUVCNiwweDFGODM5MUI5LDB4NEQ3QzdEODEsMHg3MDJBOTgwOCk7CisKKyRrX3M2Mz0weDE1MDsJCSMgczYzOiBhbGwgZXF1YWwgdG8gMHg2MyB0cmFuc2Zvcm1lZAorCSZkYXRhX3dvcmQoMHg1QjVCNUI1QiwweDVCNUI1QjVCLDB4NUI1QjVCNUIsMHg1QjVCNUI1Qik7CisKKyRrX29wdD0weDE2MDsJCSMgb3V0cHV0IHRyYW5zZm9ybQorCSZkYXRhX3dvcmQoMHhENkI2NjAwMCwweEZGOUY0OTI5LDB4REVCRTY4MDgsMHhGNzk3NDEyMSk7CisJJmRhdGFfd29yZCgweDUwQkNFQzAwLDB4MDFFREJENTEsMHhCMDVDMENFMCwweEUxMEQ1REIxKTsKKworJGtfZGVza2V3PTB4MTgwOwkjIGRlc2tldyB0YWJsZXM6IGludmVydHMgdGhlIHNib3gncyAic2tldyIKKwkmZGF0YV93b3JkKDB4NDdBNEUzMDAsMHgwN0U0QTM0MCwweDVEQkVGOTFBLDB4MURGRUI5NUEpOworCSZkYXRhX3dvcmQoMHg4M0VBNjkwMCwweDVGMzZCNURDLDB4RjQ5RDFFNzcsMHgyODQxQzJBQik7CisjIworIyMgIERlY3J5cHRpb24gc3R1ZmYKKyMjICBLZXkgc2NoZWR1bGUgY29uc3RhbnRzCisjIworJGtfZGtzZD0weDFhMDsJCSMgZGVjcnlwdGlvbiBrZXkgc2NoZWR1bGU6IGludnNrZXcgeCpECisJJmRhdGFfd29yZCgweEEzRTQ0NzAwLDB4RkVCOTFBNUQsMHg1QTFEQkVGOSwweDA3NDBFM0E0KTsKKwkmZGF0YV93b3JkKDB4QjUzNjgzMDAsMHg0MUMyNzdGNCwweEFCMjg5RDFFLDB4NUZEQzY5RUEpOworJGtfZGtzYj0weDFjMDsJCSMgZGVjcnlwdGlvbiBrZXkgc2NoZWR1bGU6IGludnNrZXcgeCpCCisJJmRhdGFfd29yZCgweDg1NTBENTAwLDB4OUE0RkNBMUYsMHgxQ0M5NEM5OSwweDAzRDY1Mzg2KTsKKwkmZGF0YV93b3JkKDB4QjZGQzRBMDAsMHgxMTVCRURBNywweDdFMzQ4MkM4LDB4RDk5MzI1NkYpOworJGtfZGtzZT0weDFlMDsJCSMgZGVjcnlwdGlvbiBrZXkgc2NoZWR1bGU6IGludnNrZXcgeCpFICsgMHg2MworCSZkYXRhX3dvcmQoMHgxRkM5RDYwMCwweEQ1MDMxQ0NBLDB4OTk0RjUwODYsMHg1Mzg1OUE0Qyk7CisJJmRhdGFfd29yZCgweDRGREM3QkU4LDB4QTIzMTk2MDUsMHgyMEIzMTQ4NywweENENUVGOTZBKTsKKyRrX2Rrczk9MHgyMDA7CQkjIGRlY3J5cHRpb24ga2V5IHNjaGVkdWxlOiBpbnZza2V3IHgqOQorCSZkYXRhX3dvcmQoMHg3RUQ5QTcwMCwweEI2MTE2RkM4LDB4ODIyNTVCRkMsMHg0QUVEOTMzNCk7CisJJmRhdGFfd29yZCgweDI3MTQzMzAwLDB4NDU3NjUxNjIsMHhFOURBRkRDRSwweDhCQjg5RkFDKTsKKworIyMKKyMjICBEZWNyeXB0aW9uIHN0dWZmCisjIyAgUm91bmQgZnVuY3Rpb24gY29uc3RhbnRzCisjIworJGtfZGlwdD0weDIyMDsJCSMgZGVjcnlwdGlvbiBpbnB1dCB0cmFuc2Zvcm0KKwkmZGF0YV93b3JkKDB4MEI1NDVGMDAsMHgwRjUwNUIwNCwweDExNEU0NTFBLDB4MTU0QTQxMUUpOworCSZkYXRhX3dvcmQoMHg2MDA1NjUwMCwweDg2RTM4M0U2LDB4RjQ5MUYxOTQsMHgxMjc3MTc3Mik7CisKKyRrX2RzYjk9MHgyNDA7CQkjIGRlY3J5cHRpb24gc2JveCBvdXRwdXQgKjkqdSwgKjkqdAorCSZkYXRhX3dvcmQoMHg5QTg2RDYwMCwweDg1MUMwMzUzLDB4NEY5OTRDQzksMHhDQUQ1MUY1MCk7CisJJmRhdGFfd29yZCgweEVDRDc0OTAwLDB4QzAzQjE3ODksMHhCMkZCQTU2NSwweDcyNUUyQzlFKTsKKyRrX2RzYmQ9MHgyNjA7CQkjIGRlY3J5cHRpb24gc2JveCBvdXRwdXQgKkQqdSwgKkQqdAorCSZkYXRhX3dvcmQoMHhFNkIxQTIwMCwweDdENTdDQ0RGLDB4ODgyQTQ0MzksMHhGNTZFOUIxMyk7CisJJmRhdGFfd29yZCgweDI0QzZDQjAwLDB4M0NFMkZBRjcsMHgxNURFRUZEMywweDI5MzExODBEKTsKKyRrX2RzYmI9MHgyODA7CQkjIGRlY3J5cHRpb24gc2JveCBvdXRwdXQgKkIqdSwgKkIqdAorCSZkYXRhX3dvcmQoMHg5NkI0NDIwMCwweEQwMjI2NDkyLDB4QjBGMkQ0MDQsMHg2MDI2NDZGNik7CisJJmRhdGFfd29yZCgweENENTk2NzAwLDB4QzE5NDk4QTYsMHgzMjU1QUE2QiwweEYzRkYwQzNFKTsKKyRrX2RzYmU9MHgyYTA7CQkjIGRlY3J5cHRpb24gc2JveCBvdXRwdXQgKkUqdSwgKkUqdAorCSZkYXRhX3dvcmQoMHgyNkQ0RDAwMCwweDQ2RjI5Mjk2LDB4NjRCNEY2QjAsMHgyMjQyNjAwNCk7CisJJmRhdGFfd29yZCgweEZGQUFDMTAwLDB4MEM1NUE2Q0QsMHg5ODU5M0UzMiwweDk0NjdGMzZCKTsKKyRrX2RzYm89MHgyYzA7CQkjIGRlY3J5cHRpb24gc2JveCBmaW5hbCBvdXRwdXQKKwkmZGF0YV93b3JkKDB4N0VGOTQwMDAsMHgxMzg3RUE1MywweEQ0OTQzRTJELDB4QzdBQTZEQjkpOworCSZkYXRhX3dvcmQoMHg5MzQ0MUQwMCwweDEyRDc1NjBGLDB4RDhDNThFOUMsMHhDQTRCODE1OSk7CismYXNjaXoJKCJWZWN0b3IgUGVybXV0YXRpb24gQUVTIGZvciB4ODYvU1NTRTMsIE1pa2UgSGFtYnVyZyAoU3RhbmZvcmQgVW5pdmVyc2l0eSkiKTsKKyZhbGlnbgkoNjQpOworCismZnVuY3Rpb25fYmVnaW5fQigiX3ZwYWVzX3ByZWhlYXQiKTsKKwkmYWRkCSgkY29uc3QsJkRXUCgwLCJlc3AiKSk7CisJJm1vdmRxYQkoInhtbTciLCZRV1AoJGtfaW52LCRjb25zdCkpOworCSZtb3ZkcWEJKCJ4bW02IiwmUVdQKCRrX3MwRiwkY29uc3QpKTsKKwkmcmV0CSgpOworJmZ1bmN0aW9uX2VuZF9CKCJfdnBhZXNfcHJlaGVhdCIpOworCisjIworIyMgIF9hZXNfZW5jcnlwdF9jb3JlCisjIworIyMgIEFFUy1lbmNyeXB0ICV4bW0wLgorIyMKKyMjICBJbnB1dHM6CisjIyAgICAgJXhtbTAgPSBpbnB1dAorIyMgICAgICV4bW02LSV4bW03IGFzIGluIF92cGFlc19wcmVoZWF0CisjIyAgICAoJWVkeCkgPSBzY2hlZHVsZWQga2V5cworIyMKKyMjICBPdXRwdXQgaW4gJXhtbTAKKyMjICBDbG9iYmVycyAgJXhtbTEtJXhtbTUsICVlYXgsICVlYngsICVlY3gsICVlZHgKKyMjCisjIworJmZ1bmN0aW9uX2JlZ2luX0IoIl92cGFlc19lbmNyeXB0X2NvcmUiKTsKKwkmbW92CSgkbWFnaWMsMTYpOworCSZtb3YJKCRyb3VuZCwmRFdQKDI0MCwka2V5KSk7CisJJm1vdmRxYQkoInhtbTEiLCJ4bW02IikKKwkmbW92ZHFhCSgieG1tMiIsJlFXUCgka19pcHQsJGNvbnN0KSk7CisJJnBhbmRuCSgieG1tMSIsInhtbTAiKTsKKwkmcGFuZAkoInhtbTAiLCJ4bW02Iik7CisJJm1vdmRxdQkoInhtbTUiLCZRV1AoMCwka2V5KSk7CisJJnBzaHVmYgkoInhtbTIiLCJ4bW0wIik7CisJJm1vdmRxYQkoInhtbTAiLCZRV1AoJGtfaXB0KzE2LCRjb25zdCkpOworCSZweG9yCSgieG1tMiIsInhtbTUiKTsKKwkmcHNybGQJKCJ4bW0xIiw0KTsKKwkmYWRkCSgka2V5LDE2KTsKKwkmcHNodWZiCSgieG1tMCIsInhtbTEiKTsKKwkmbGVhCSgkYmFzZSwmRFdQKCRrX21jX2JhY2t3YXJkLCRjb25zdCkpOworCSZweG9yCSgieG1tMCIsInhtbTIiKTsKKwkmam1wCSgmbGFiZWwoImVuY19lbnRyeSIpKTsKKworCismc2V0X2xhYmVsKCJlbmNfbG9vcCIsMTYpOworCSMgbWlkZGxlIG9mIG1pZGRsZSByb3VuZAorCSZtb3ZkcWEJKCJ4bW00IiwmUVdQKCRrX3NiMSwkY29uc3QpKTsJIyA0IDogc2IxdQorCSZtb3ZkcWEJKCJ4bW0wIiwmUVdQKCRrX3NiMSsxNiwkY29uc3QpKTsjIDAgOiBzYjF0CisJJnBzaHVmYgkoInhtbTQiLCJ4bW0yIik7CQkjIDQgPSBzYjF1CisJJnBzaHVmYgkoInhtbTAiLCJ4bW0zIik7CQkjIDAgPSBzYjF0CisJJnB4b3IJKCJ4bW00IiwieG1tNSIpOwkJIyA0ID0gc2IxdSArIGsKKwkmbW92ZHFhCSgieG1tNSIsJlFXUCgka19zYjIsJGNvbnN0KSk7CSMgNCA6IHNiMnUKKwkmcHhvcgkoInhtbTAiLCJ4bW00Iik7CQkjIDAgPSBBCisJJm1vdmRxYQkoInhtbTEiLCZRV1AoLTB4NDAsJGJhc2UsJG1hZ2ljKSk7IyAuTGtfbWNfZm9yd2FyZFtdCisJJnBzaHVmYgkoInhtbTUiLCJ4bW0yIik7CQkjIDQgPSBzYjJ1CisJJm1vdmRxYQkoInhtbTIiLCZRV1AoJGtfc2IyKzE2LCRjb25zdCkpOyMgMiA6IHNiMnQKKwkmbW92ZHFhCSgieG1tNCIsJlFXUCgwLCRiYXNlLCRtYWdpYykpOwkjIC5Ma19tY19iYWNrd2FyZFtdCisJJnBzaHVmYgkoInhtbTIiLCJ4bW0zIik7CQkjIDIgPSBzYjJ0CisJJm1vdmRxYQkoInhtbTMiLCJ4bW0wIik7CQkjIDMgPSBBCisJJnB4b3IJKCJ4bW0yIiwieG1tNSIpOwkJIyAyID0gMkEKKwkmcHNodWZiCSgieG1tMCIsInhtbTEiKTsJCSMgMCA9IEIKKwkmYWRkCSgka2V5LDE2KTsJCQkjIG5leHQga2V5CisJJnB4b3IJKCJ4bW0wIiwieG1tMiIpOwkJIyAwID0gMkErQgorCSZwc2h1ZmIJKCJ4bW0zIiwieG1tNCIpOwkJIyAzID0gRAorCSZhZGQJKCRtYWdpYywxNik7CQkJIyBuZXh0IG1jCisJJnB4b3IJKCJ4bW0zIiwieG1tMCIpOwkJIyAzID0gMkErQitECisJJnBzaHVmYgkoInhtbTAiLCJ4bW0xIik7CQkjIDAgPSAyQitDCisJJmFuZAkoJG1hZ2ljLDB4MzApOwkJCSMgLi4uIG1vZCA0CisJJnN1YgkoJHJvdW5kLDEpOwkJCSMgbnItLQorCSZweG9yCSgieG1tMCIsInhtbTMiKTsJCSMgMCA9IDJBKzNCK0MrRAorCismc2V0X2xhYmVsKCJlbmNfZW50cnkiKTsKKwkjIHRvcCBvZiByb3VuZAorCSZtb3ZkcWEJKCJ4bW0xIiwieG1tNiIpOwkJIyAxIDogaQorCSZtb3ZkcWEJKCJ4bW01IiwmUVdQKCRrX2ludisxNiwkY29uc3QpKTsjIDIgOiBhL2sKKwkmcGFuZG4JKCJ4bW0xIiwieG1tMCIpOwkJIyAxID0gaTw8NAorCSZwc3JsZAkoInhtbTEiLDQpOwkJCSMgMSA9IGkKKwkmcGFuZAkoInhtbTAiLCJ4bW02Iik7CQkjIDAgPSBrCisJJnBzaHVmYgkoInhtbTUiLCJ4bW0wIik7CQkjIDIgPSBhL2sKKwkmbW92ZHFhCSgieG1tMyIsInhtbTciKTsJCSMgMyA6IDEvaQorCSZweG9yCSgieG1tMCIsInhtbTEiKTsJCSMgMCA9IGoKKwkmcHNodWZiCSgieG1tMyIsInhtbTEiKTsJCSMgMyA9IDEvaQorCSZtb3ZkcWEJKCJ4bW00IiwieG1tNyIpOwkJIyA0IDogMS9qCisJJnB4b3IJKCJ4bW0zIiwieG1tNSIpOwkJIyAzID0gaWFrID0gMS9pICsgYS9rCisJJnBzaHVmYgkoInhtbTQiLCJ4bW0wIik7CQkjIDQgPSAxL2oKKwkmbW92ZHFhCSgieG1tMiIsInhtbTciKTsJCSMgMiA6IDEvaWFrCisJJnB4b3IJKCJ4bW00IiwieG1tNSIpOwkJIyA0ID0gamFrID0gMS9qICsgYS9rCisJJnBzaHVmYgkoInhtbTIiLCJ4bW0zIik7CQkjIDIgPSAxL2lhaworCSZtb3ZkcWEJKCJ4bW0zIiwieG1tNyIpOwkJIyAzIDogMS9qYWsKKwkmcHhvcgkoInhtbTIiLCJ4bW0wIik7CQkjIDIgPSBpbworCSZwc2h1ZmIJKCJ4bW0zIiwieG1tNCIpOwkJIyAzID0gMS9qYWsKKwkmbW92ZHF1CSgieG1tNSIsJlFXUCgwLCRrZXkpKTsKKwkmcHhvcgkoInhtbTMiLCJ4bW0xIik7CQkjIDMgPSBqbworCSZqbnoJKCZsYWJlbCgiZW5jX2xvb3AiKSk7CisKKwkjIG1pZGRsZSBvZiBsYXN0IHJvdW5kCisJJm1vdmRxYQkoInhtbTQiLCZRV1AoJGtfc2JvLCRjb25zdCkpOwkjIDMgOiBzYm91ICAgICAgLkxrX3NibworCSZtb3ZkcWEJKCJ4bW0wIiwmUVdQKCRrX3NibysxNiwkY29uc3QpKTsjIDMgOiBzYm90ICAgICAgLkxrX3NibysxNgorCSZwc2h1ZmIJKCJ4bW00IiwieG1tMiIpOwkJIyA0ID0gc2JvdQorCSZweG9yCSgieG1tNCIsInhtbTUiKTsJCSMgNCA9IHNiMXUgKyBrCisJJnBzaHVmYgkoInhtbTAiLCJ4bW0zIik7CQkjIDAgPSBzYjF0CisJJm1vdmRxYQkoInhtbTEiLCZRV1AoMHg0MCwkYmFzZSwkbWFnaWMpKTsjIC5Ma19zcltdCisJJnB4b3IJKCJ4bW0wIiwieG1tNCIpOwkJIyAwID0gQQorCSZwc2h1ZmIJKCJ4bW0wIiwieG1tMSIpOworCSZyZXQJKCk7CismZnVuY3Rpb25fZW5kX0IoIl92cGFlc19lbmNyeXB0X2NvcmUiKTsKKworIyMKKyMjICBEZWNyeXB0aW9uIGNvcmUKKyMjCisjIyAgU2FtZSBBUEkgYXMgZW5jcnlwdGlvbiBjb3JlLgorIyMKKyZmdW5jdGlvbl9iZWdpbl9CKCJfdnBhZXNfZGVjcnlwdF9jb3JlIik7CisJJmxlYQkoJGJhc2UsJkRXUCgka19kc2JkLCRjb25zdCkpOworCSZtb3YJKCRyb3VuZCwmRFdQKDI0MCwka2V5KSk7CisJJm1vdmRxYQkoInhtbTEiLCJ4bW02Iik7CisJJm1vdmRxYQkoInhtbTIiLCZRV1AoJGtfZGlwdC0ka19kc2JkLCRiYXNlKSk7CisJJnBhbmRuCSgieG1tMSIsInhtbTAiKTsKKwkmbW92CSgkbWFnaWMsJHJvdW5kKTsKKwkmcHNybGQJKCJ4bW0xIiw0KQorCSZtb3ZkcXUJKCJ4bW01IiwmUVdQKDAsJGtleSkpOworCSZzaGwJKCRtYWdpYyw0KTsKKwkmcGFuZAkoInhtbTAiLCJ4bW02Iik7CisJJnBzaHVmYgkoInhtbTIiLCJ4bW0wIik7CisJJm1vdmRxYQkoInhtbTAiLCZRV1AoJGtfZGlwdC0ka19kc2JkKzE2LCRiYXNlKSk7CisJJnhvcgkoJG1hZ2ljLDB4MzApOworCSZwc2h1ZmIJKCJ4bW0wIiwieG1tMSIpOworCSZhbmQJKCRtYWdpYywweDMwKTsKKwkmcHhvcgkoInhtbTIiLCJ4bW01Iik7CisJJm1vdmRxYQkoInhtbTUiLCZRV1AoJGtfbWNfZm9yd2FyZCs0OCwkY29uc3QpKTsKKwkmcHhvcgkoInhtbTAiLCJ4bW0yIik7CisJJmFkZAkoJGtleSwxNik7CisJJmxlYQkoJG1hZ2ljLCZEV1AoJGtfc3ItJGtfZHNiZCwkYmFzZSwkbWFnaWMpKTsKKwkmam1wCSgmbGFiZWwoImRlY19lbnRyeSIpKTsKKworJnNldF9sYWJlbCgiZGVjX2xvb3AiLDE2KTsKKyMjCisjIyAgSW52ZXJzZSBtaXggY29sdW1ucworIyMKKwkmbW92ZHFhCSgieG1tNCIsJlFXUCgtMHgyMCwkYmFzZSkpOwkjIDQgOiBzYjl1CisJJm1vdmRxYQkoInhtbTEiLCZRV1AoLTB4MTAsJGJhc2UpKTsJIyAwIDogc2I5dAorCSZwc2h1ZmIJKCJ4bW00IiwieG1tMiIpOwkJIyA0ID0gc2I5dQorCSZwc2h1ZmIJKCJ4bW0xIiwieG1tMyIpOwkJIyAwID0gc2I5dAorCSZweG9yCSgieG1tMCIsInhtbTQiKTsKKwkmbW92ZHFhCSgieG1tNCIsJlFXUCgwLCRiYXNlKSk7CQkjIDQgOiBzYmR1CisJJnB4b3IJKCJ4bW0wIiwieG1tMSIpOwkJIyAwID0gY2gKKwkmbW92ZHFhCSgieG1tMSIsJlFXUCgweDEwLCRiYXNlKSk7CSMgMCA6IHNiZHQKKworCSZwc2h1ZmIJKCJ4bW00IiwieG1tMiIpOwkJIyA0ID0gc2JkdQorCSZwc2h1ZmIJKCJ4bW0wIiwieG1tNSIpOwkJIyBNQyBjaAorCSZwc2h1ZmIJKCJ4bW0xIiwieG1tMyIpOwkJIyAwID0gc2JkdAorCSZweG9yCSgieG1tMCIsInhtbTQiKTsJCSMgNCA9IGNoCisJJm1vdmRxYQkoInhtbTQiLCZRV1AoMHgyMCwkYmFzZSkpOwkjIDQgOiBzYmJ1CisJJnB4b3IJKCJ4bW0wIiwieG1tMSIpOwkJIyAwID0gY2gKKwkmbW92ZHFhCSgieG1tMSIsJlFXUCgweDMwLCRiYXNlKSk7CSMgMCA6IHNiYnQKKworCSZwc2h1ZmIJKCJ4bW00IiwieG1tMiIpOwkJIyA0ID0gc2JidQorCSZwc2h1ZmIJKCJ4bW0wIiwieG1tNSIpOwkJIyBNQyBjaAorCSZwc2h1ZmIJKCJ4bW0xIiwieG1tMyIpOwkJIyAwID0gc2JidAorCSZweG9yCSgieG1tMCIsInhtbTQiKTsJCSMgNCA9IGNoCisJJm1vdmRxYQkoInhtbTQiLCZRV1AoMHg0MCwkYmFzZSkpOwkjIDQgOiBzYmV1CisJJnB4b3IJKCJ4bW0wIiwieG1tMSIpOwkJIyAwID0gY2gKKwkmbW92ZHFhCSgieG1tMSIsJlFXUCgweDUwLCRiYXNlKSk7CSMgMCA6IHNiZXQKKworCSZwc2h1ZmIJKCJ4bW00IiwieG1tMiIpOwkJIyA0ID0gc2JldQorCSZwc2h1ZmIJKCJ4bW0wIiwieG1tNSIpOwkJIyBNQyBjaAorCSZwc2h1ZmIJKCJ4bW0xIiwieG1tMyIpOwkJIyAwID0gc2JldAorCSZweG9yCSgieG1tMCIsInhtbTQiKTsJCSMgNCA9IGNoCisJJmFkZAkoJGtleSwxNik7CQkJIyBuZXh0IHJvdW5kIGtleQorCSZwYWxpZ25yKCJ4bW01IiwieG1tNSIsMTIpOworCSZweG9yCSgieG1tMCIsInhtbTEiKTsJCSMgMCA9IGNoCisJJnN1YgkoJHJvdW5kLDEpOwkJCSMgbnItLQorCismc2V0X2xhYmVsKCJkZWNfZW50cnkiKTsKKwkjIHRvcCBvZiByb3VuZAorCSZtb3ZkcWEJKCJ4bW0xIiwieG1tNiIpOwkJIyAxIDogaQorCSZtb3ZkcWEJKCJ4bW0yIiwmUVdQKCRrX2ludisxNiwkY29uc3QpKTsjIDIgOiBhL2sKKwkmcGFuZG4JKCJ4bW0xIiwieG1tMCIpOwkJIyAxID0gaTw8NAorCSZwYW5kCSgieG1tMCIsInhtbTYiKTsJCSMgMCA9IGsKKwkmcHNybGQJKCJ4bW0xIiw0KTsJCQkjIDEgPSBpCisJJnBzaHVmYgkoInhtbTIiLCJ4bW0wIik7CQkjIDIgPSBhL2sKKwkmbW92ZHFhCSgieG1tMyIsInhtbTciKTsJCSMgMyA6IDEvaQorCSZweG9yCSgieG1tMCIsInhtbTEiKTsJCSMgMCA9IGoKKwkmcHNodWZiCSgieG1tMyIsInhtbTEiKTsJCSMgMyA9IDEvaQorCSZtb3ZkcWEJKCJ4bW00IiwieG1tNyIpOwkJIyA0IDogMS9qCisJJnB4b3IJKCJ4bW0zIiwieG1tMiIpOwkJIyAzID0gaWFrID0gMS9pICsgYS9rCisJJnBzaHVmYgkoInhtbTQiLCJ4bW0wIik7CQkjIDQgPSAxL2oKKwkmcHhvcgkoInhtbTQiLCJ4bW0yIik7CQkjIDQgPSBqYWsgPSAxL2ogKyBhL2sKKwkmbW92ZHFhCSgieG1tMiIsInhtbTciKTsJCSMgMiA6IDEvaWFrCisJJnBzaHVmYgkoInhtbTIiLCJ4bW0zIik7CQkjIDIgPSAxL2lhaworCSZtb3ZkcWEJKCJ4bW0zIiwieG1tNyIpOwkJIyAzIDogMS9qYWsKKwkmcHhvcgkoInhtbTIiLCJ4bW0wIik7CQkjIDIgPSBpbworCSZwc2h1ZmIJKCJ4bW0zIiwieG1tNCIpOwkJIyAzID0gMS9qYWsKKwkmbW92ZHF1CSgieG1tMCIsJlFXUCgwLCRrZXkpKTsKKwkmcHhvcgkoInhtbTMiLCJ4bW0xIik7CQkjIDMgPSBqbworCSZqbnoJKCZsYWJlbCgiZGVjX2xvb3AiKSk7CisKKwkjIG1pZGRsZSBvZiBsYXN0IHJvdW5kCisJJm1vdmRxYQkoInhtbTQiLCZRV1AoMHg2MCwkYmFzZSkpOwkjIDMgOiBzYm91CisJJnBzaHVmYgkoInhtbTQiLCJ4bW0yIik7CQkjIDQgPSBzYm91CisJJnB4b3IJKCJ4bW00IiwieG1tMCIpOwkJIyA0ID0gc2IxdSArIGsKKwkmbW92ZHFhCSgieG1tMCIsJlFXUCgweDcwLCRiYXNlKSk7CSMgMCA6IHNib3QKKwkmbW92ZHFhCSgieG1tMiIsJlFXUCgwLCRtYWdpYykpOworCSZwc2h1ZmIJKCJ4bW0wIiwieG1tMyIpOwkJIyAwID0gc2IxdAorCSZweG9yCSgieG1tMCIsInhtbTQiKTsJCSMgMCA9IEEKKwkmcHNodWZiCSgieG1tMCIsInhtbTIiKTsKKwkmcmV0CSgpOworJmZ1bmN0aW9uX2VuZF9CKCJfdnBhZXNfZGVjcnlwdF9jb3JlIik7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIworIyMgICAgICAgICAgICAgICAgICBBRVMga2V5IHNjaGVkdWxlICAgICAgICAgICAgICAgICAgIyMKKyMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworJmZ1bmN0aW9uX2JlZ2luX0IoIl92cGFlc19zY2hlZHVsZV9jb3JlIik7CisJJmFkZAkoJGNvbnN0LCZEV1AoMCwiZXNwIikpOworCSZtb3ZkcXUJKCJ4bW0wIiwmUVdQKDAsJGlucCkpOwkJIyBsb2FkIGtleSAodW5hbGlnbmVkKQorCSZtb3ZkcWEJKCJ4bW0yIiwmUVdQKCRrX3Jjb24sJGNvbnN0KSk7CSMgbG9hZCByY29uCisKKwkjIGlucHV0IHRyYW5zZm9ybQorCSZtb3ZkcWEJKCJ4bW0zIiwieG1tMCIpOworCSZsZWEJKCRiYXNlLCZEV1AoJGtfaXB0LCRjb25zdCkpOworCSZtb3ZkcWEJKCZRV1AoNCwiZXNwIiksInhtbTIiKTsJCSMgeG1tOAorCSZjYWxsCSgiX3ZwYWVzX3NjaGVkdWxlX3RyYW5zZm9ybSIpOworCSZtb3ZkcWEJKCJ4bW03IiwieG1tMCIpOworCisJJnRlc3QJKCRvdXQsJG91dCk7CisJJmpuegkoJmxhYmVsKCJzY2hlZHVsZV9hbV9kZWNyeXB0aW5nIikpOworCisJIyBlbmNyeXB0aW5nLCBvdXRwdXQgemVyb3RoIHJvdW5kIGtleSBhZnRlciB0cmFuc2Zvcm0KKwkmbW92ZHF1CSgmUVdQKDAsJGtleSksInhtbTAiKTsKKwkmam1wCSgmbGFiZWwoInNjaGVkdWxlX2dvIikpOworCismc2V0X2xhYmVsKCJzY2hlZHVsZV9hbV9kZWNyeXB0aW5nIik7CisJIyBkZWNyeXB0aW5nLCBvdXRwdXQgemVyb3RoIHJvdW5kIGtleSBhZnRlciBzaGlmdHJvd3MKKwkmbW92ZHFhCSgieG1tMSIsJlFXUCgka19zciwkY29uc3QsJG1hZ2ljKSk7CisJJnBzaHVmYgkoInhtbTMiLCJ4bW0xIik7CisJJm1vdmRxdQkoJlFXUCgwLCRrZXkpLCJ4bW0zIik7CisJJnhvcgkoJG1hZ2ljLDB4MzApOworCismc2V0X2xhYmVsKCJzY2hlZHVsZV9nbyIpOworCSZjbXAJKCRyb3VuZCwxOTIpOworCSZqYQkoJmxhYmVsKCJzY2hlZHVsZV8yNTYiKSk7CisJJmplCSgmbGFiZWwoInNjaGVkdWxlXzE5MiIpKTsKKwkjIDEyODogZmFsbCB0aG91Z2gKKworIyMKKyMjICAuc2NoZWR1bGVfMTI4CisjIworIyMgIDEyOC1iaXQgc3BlY2lmaWMgcGFydCBvZiBrZXkgc2NoZWR1bGUuCisjIworIyMgIFRoaXMgc2NoZWR1bGUgaXMgcmVhbGx5IHNpbXBsZSwgYmVjYXVzZSBhbGwgaXRzIHBhcnRzCisjIyAgYXJlIGFjY29tcGxpc2hlZCBieSB0aGUgc3Vicm91dGluZXMuCisjIworJnNldF9sYWJlbCgic2NoZWR1bGVfMTI4Iik7CisJJm1vdgkoJHJvdW5kLDEwKTsKKworJnNldF9sYWJlbCgibG9vcF9zY2hlZHVsZV8xMjgiKTsKKwkmY2FsbAkoIl92cGFlc19zY2hlZHVsZV9yb3VuZCIpOworCSZkZWMJKCRyb3VuZCk7CisJJmp6CSgmbGFiZWwoInNjaGVkdWxlX21hbmdsZV9sYXN0IikpOworCSZjYWxsCSgiX3ZwYWVzX3NjaGVkdWxlX21hbmdsZSIpOwkjIHdyaXRlIG91dHB1dAorCSZqbXAJKCZsYWJlbCgibG9vcF9zY2hlZHVsZV8xMjgiKSk7CisKKyMjCisjIyAgLmFlc19zY2hlZHVsZV8xOTIKKyMjCisjIyAgMTkyLWJpdCBzcGVjaWZpYyBwYXJ0IG9mIGtleSBzY2hlZHVsZS4KKyMjCisjIyAgVGhlIG1haW4gYm9keSBvZiB0aGlzIHNjaGVkdWxlIGlzIHRoZSBzYW1lIGFzIHRoZSAxMjgtYml0CisjIyAgc2NoZWR1bGUsIGJ1dCB3aXRoIG1vcmUgc21lYXJpbmcuICBUaGUgbG9uZywgaGlnaCBzaWRlIGlzCisjIyAgc3RvcmVkIGluICV4bW03IGFzIGJlZm9yZSwgYW5kIHRoZSBzaG9ydCwgbG93IHNpZGUgaXMgaW4KKyMjICB0aGUgaGlnaCBiaXRzIG9mICV4bW02LgorIyMKKyMjICBUaGlzIHNjaGVkdWxlIGlzIHNvbWV3aGF0IG5hc3RpZXIsIGhvd2V2ZXIsIGJlY2F1c2UgZWFjaAorIyMgIHJvdW5kIHByb2R1Y2VzIDE5MiBiaXRzIG9mIGtleSBtYXRlcmlhbCwgb3IgMS41IHJvdW5kIGtleXMuCisjIyAgVGhlcmVmb3JlLCBvbiBlYWNoIGN5Y2xlIHdlIGRvIDIgcm91bmRzIGFuZCBwcm9kdWNlIDMgcm91bmQKKyMjICBrZXlzLgorIyMKKyZzZXRfbGFiZWwoInNjaGVkdWxlXzE5MiIsMTYpOworCSZtb3ZkcXUJKCJ4bW0wIiwmUVdQKDgsJGlucCkpOwkJIyBsb2FkIGtleSBwYXJ0IDIgKHZlcnkgdW5hbGlnbmVkKQorCSZjYWxsCSgiX3ZwYWVzX3NjaGVkdWxlX3RyYW5zZm9ybSIpOwkjIGlucHV0IHRyYW5zZm9ybQkKKwkmbW92ZHFhCSgieG1tNiIsInhtbTAiKTsJCSMgc2F2ZSBzaG9ydCBwYXJ0CisJJnB4b3IJKCJ4bW00IiwieG1tNCIpOwkJIyBjbGVhciA0CisJJm1vdmhscHMoInhtbTYiLCJ4bW00Iik7CQkjIGNsb2JiZXIgbG93IHNpZGUgd2l0aCB6ZXJvcworCSZtb3YJKCRyb3VuZCw0KTsKKworJnNldF9sYWJlbCgibG9vcF9zY2hlZHVsZV8xOTIiKTsKKwkmY2FsbAkoIl92cGFlc19zY2hlZHVsZV9yb3VuZCIpOworCSZwYWxpZ25yKCJ4bW0wIiwieG1tNiIsOCk7CisJJmNhbGwJKCJfdnBhZXNfc2NoZWR1bGVfbWFuZ2xlIik7CSMgc2F2ZSBrZXkgbgorCSZjYWxsCSgiX3ZwYWVzX3NjaGVkdWxlXzE5Ml9zbWVhciIpOworCSZjYWxsCSgiX3ZwYWVzX3NjaGVkdWxlX21hbmdsZSIpOwkjIHNhdmUga2V5IG4rMQorCSZjYWxsCSgiX3ZwYWVzX3NjaGVkdWxlX3JvdW5kIik7CisJJmRlYwkoJHJvdW5kKTsKKwkmanoJKCZsYWJlbCgic2NoZWR1bGVfbWFuZ2xlX2xhc3QiKSk7CisJJmNhbGwJKCJfdnBhZXNfc2NoZWR1bGVfbWFuZ2xlIik7CSMgc2F2ZSBrZXkgbisyCisJJmNhbGwJKCJfdnBhZXNfc2NoZWR1bGVfMTkyX3NtZWFyIik7CisJJmptcAkoJmxhYmVsKCJsb29wX3NjaGVkdWxlXzE5MiIpKTsKKworIyMKKyMjICAuYWVzX3NjaGVkdWxlXzI1NgorIyMKKyMjICAyNTYtYml0IHNwZWNpZmljIHBhcnQgb2Yga2V5IHNjaGVkdWxlLgorIyMKKyMjICBUaGUgc3RydWN0dXJlIGhlcmUgaXMgdmVyeSBzaW1pbGFyIHRvIHRoZSAxMjgtYml0CisjIyAgc2NoZWR1bGUsIGJ1dCB3aXRoIGFuIGFkZGl0aW9uYWwgImxvdyBzaWRlIiBpbgorIyMgICV4bW02LiAgVGhlIGxvdyBzaWRlJ3Mgcm91bmRzIGFyZSB0aGUgc2FtZSBhcyB0aGUKKyMjICBoaWdoIHNpZGUncywgZXhjZXB0IG5vIHJjb24gYW5kIG5vIHJvdGF0aW9uLgorIyMKKyZzZXRfbGFiZWwoInNjaGVkdWxlXzI1NiIsMTYpOworCSZtb3ZkcXUJKCJ4bW0wIiwmUVdQKDE2LCRpbnApKTsJCSMgbG9hZCBrZXkgcGFydCAyICh1bmFsaWduZWQpCisJJmNhbGwJKCJfdnBhZXNfc2NoZWR1bGVfdHJhbnNmb3JtIik7CSMgaW5wdXQgdHJhbnNmb3JtCQorCSZtb3YJKCRyb3VuZCw3KTsKKworJnNldF9sYWJlbCgibG9vcF9zY2hlZHVsZV8yNTYiKTsKKwkmY2FsbAkoIl92cGFlc19zY2hlZHVsZV9tYW5nbGUiKTsJIyBvdXRwdXQgbG93IHJlc3VsdAorCSZtb3ZkcWEJKCJ4bW02IiwieG1tMCIpOwkJIyBzYXZlIGN1cl9sbyBpbiB4bW02CisKKwkjIGhpZ2ggcm91bmQKKwkmY2FsbAkoIl92cGFlc19zY2hlZHVsZV9yb3VuZCIpOworCSZkZWMJKCRyb3VuZCk7CisJJmp6CSgmbGFiZWwoInNjaGVkdWxlX21hbmdsZV9sYXN0IikpOworCSZjYWxsCSgiX3ZwYWVzX3NjaGVkdWxlX21hbmdsZSIpOwkKKworCSMgbG93IHJvdW5kLiBzd2FwIHhtbTcgYW5kIHhtbTYKKwkmcHNodWZkCSgieG1tMCIsInhtbTAiLDB4RkYpOworCSZtb3ZkcWEJKCZRV1AoMjAsImVzcCIpLCJ4bW03Iik7CisJJm1vdmRxYQkoInhtbTciLCJ4bW02Iik7CisJJmNhbGwJKCJfdnBhZXNfc2NoZWR1bGVfbG93X3JvdW5kIik7CisJJm1vdmRxYQkoInhtbTciLCZRV1AoMjAsImVzcCIpKTsKKworCSZqbXAJKCZsYWJlbCgibG9vcF9zY2hlZHVsZV8yNTYiKSk7CisKKyMjCisjIyAgLmFlc19zY2hlZHVsZV9tYW5nbGVfbGFzdAorIyMKKyMjICBNYW5nbGVyIGZvciBsYXN0IHJvdW5kIG9mIGtleSBzY2hlZHVsZQorIyMgIE1hbmdsZXMgJXhtbTAKKyMjICAgIHdoZW4gZW5jcnlwdGluZywgb3V0cHV0cyBvdXQoJXhtbTApIF4gNjMKKyMjICAgIHdoZW4gZGVjcnlwdGluZywgb3V0cHV0cyB1bnNrZXcoJXhtbTApCisjIworIyMgIEFsd2F5cyBjYWxsZWQgcmlnaHQgYmVmb3JlIHJldHVybi4uLiBqdW1wcyB0byBjbGVhbnVwIGFuZCBleGl0cworIyMKKyZzZXRfbGFiZWwoInNjaGVkdWxlX21hbmdsZV9sYXN0IiwxNik7CisJIyBzY2hlZHVsZSBsYXN0IHJvdW5kIGtleSBmcm9tIHhtbTAKKwkmbGVhCSgkYmFzZSwmRFdQKCRrX2Rlc2tldywkY29uc3QpKTsKKwkmdGVzdAkoJG91dCwkb3V0KTsKKwkmam56CSgmbGFiZWwoInNjaGVkdWxlX21hbmdsZV9sYXN0X2RlYyIpKTsKKworCSMgZW5jcnlwdGluZworCSZtb3ZkcWEJKCJ4bW0xIiwmUVdQKCRrX3NyLCRjb25zdCwkbWFnaWMpKTsKKwkmcHNodWZiCSgieG1tMCIsInhtbTEiKTsJCSMgb3V0cHV0IHBlcm11dGUKKwkmbGVhCSgkYmFzZSwmRFdQKCRrX29wdCwkY29uc3QpKTsJIyBwcmVwYXJlIHRvIG91dHB1dCB0cmFuc2Zvcm0KKwkmYWRkCSgka2V5LDMyKTsKKworJnNldF9sYWJlbCgic2NoZWR1bGVfbWFuZ2xlX2xhc3RfZGVjIik7CisJJmFkZAkoJGtleSwtMTYpOworCSZweG9yCSgieG1tMCIsJlFXUCgka19zNjMsJGNvbnN0KSk7CisJJmNhbGwJKCJfdnBhZXNfc2NoZWR1bGVfdHJhbnNmb3JtIik7CSMgb3V0cHV0IHRyYW5zZm9ybQorCSZtb3ZkcXUJKCZRV1AoMCwka2V5KSwieG1tMCIpOwkJIyBzYXZlIGxhc3Qga2V5CisKKwkjIGNsZWFudXAKKwkmcHhvcgkoInhtbTAiLCJ4bW0wIik7CisJJnB4b3IJKCJ4bW0xIiwieG1tMSIpOworCSZweG9yCSgieG1tMiIsInhtbTIiKTsKKwkmcHhvcgkoInhtbTMiLCJ4bW0zIik7CisJJnB4b3IJKCJ4bW00IiwieG1tNCIpOworCSZweG9yCSgieG1tNSIsInhtbTUiKTsKKwkmcHhvcgkoInhtbTYiLCJ4bW02Iik7CisJJnB4b3IJKCJ4bW03IiwieG1tNyIpOworCSZyZXQJKCk7CismZnVuY3Rpb25fZW5kX0IoIl92cGFlc19zY2hlZHVsZV9jb3JlIik7CisKKyMjCisjIyAgLmFlc19zY2hlZHVsZV8xOTJfc21lYXIKKyMjCisjIyAgU21lYXIgdGhlIHNob3J0LCBsb3cgc2lkZSBpbiB0aGUgMTkyLWJpdCBrZXkgc2NoZWR1bGUuCisjIworIyMgIElucHV0czoKKyMjICAgICV4bW03OiBoaWdoIHNpZGUsIGIgIGEgIHggIHkKKyMjICAgICV4bW02OiAgbG93IHNpZGUsIGQgIGMgIDAgIDAKKyMjICAgICV4bW0xMzogMAorIyMKKyMjICBPdXRwdXRzOgorIyMgICAgJXhtbTY6IGIrYytkICBiK2MgIDAgIDAKKyMjICAgICV4bW0wOiBiK2MrZCAgYitjICBiICBhCisjIworJmZ1bmN0aW9uX2JlZ2luX0IoIl92cGFlc19zY2hlZHVsZV8xOTJfc21lYXIiKTsKKwkmcHNodWZkCSgieG1tMSIsInhtbTYiLDB4ODApOwkJIyBkIGMgMCAwIC0+IGMgMCAwIDAKKwkmcHNodWZkCSgieG1tMCIsInhtbTciLDB4RkUpOwkJIyBiIGEgXyBfIC0+IGIgYiBiIGEKKwkmcHhvcgkoInhtbTYiLCJ4bW0xIik7CQkjIC0+IGMrZCBjIDAgMAorCSZweG9yCSgieG1tMSIsInhtbTEiKTsKKwkmcHhvcgkoInhtbTYiLCJ4bW0wIik7CQkjIC0+IGIrYytkIGIrYyBiIGEKKwkmbW92ZHFhCSgieG1tMCIsInhtbTYiKTsKKwkmbW92aGxwcygieG1tNiIsInhtbTEiKTsJCSMgY2xvYmJlciBsb3cgc2lkZSB3aXRoIHplcm9zCisJJnJldAkoKTsKKyZmdW5jdGlvbl9lbmRfQigiX3ZwYWVzX3NjaGVkdWxlXzE5Ml9zbWVhciIpOworCisjIworIyMgIC5hZXNfc2NoZWR1bGVfcm91bmQKKyMjCisjIyAgUnVucyBvbmUgbWFpbiByb3VuZCBvZiB0aGUga2V5IHNjaGVkdWxlIG9uICV4bW0wLCAleG1tNworIyMKKyMjICBTcGVjaWZpY2FsbHksIHJ1bnMgc3ViYnl0ZXMgb24gdGhlIGhpZ2ggZHdvcmQgb2YgJXhtbTAKKyMjICB0aGVuIHJvdGF0ZXMgaXQgYnkgb25lIGJ5dGUgYW5kIHhvcnMgaW50byB0aGUgbG93IGR3b3JkIG9mCisjIyAgJXhtbTcuCisjIworIyMgIEFkZHMgcmNvbiBmcm9tIGxvdyBieXRlIG9mICV4bW04LCB0aGVuIHJvdGF0ZXMgJXhtbTggZm9yCisjIyAgbmV4dCByY29uLgorIyMKKyMjICBTbWVhcnMgdGhlIGR3b3JkcyBvZiAleG1tNyBieSB4b3JpbmcgdGhlIGxvdyBpbnRvIHRoZQorIyMgIHNlY29uZCBsb3csIHJlc3VsdCBpbnRvIHRoaXJkLCByZXN1bHQgaW50byBoaWdoZXN0LgorIyMKKyMjICBSZXR1cm5zIHJlc3VsdHMgaW4gJXhtbTcgPSAleG1tMC4KKyMjICBDbG9iYmVycyAleG1tMS0leG1tNS4KKyMjCismZnVuY3Rpb25fYmVnaW5fQigiX3ZwYWVzX3NjaGVkdWxlX3JvdW5kIik7CisJIyBleHRyYWN0IHJjb24gZnJvbSB4bW04CisJJm1vdmRxYQkoInhtbTIiLCZRV1AoOCwiZXNwIikpOwkJIyB4bW04CisJJnB4b3IJKCJ4bW0xIiwieG1tMSIpOworCSZwYWxpZ25yKCJ4bW0xIiwieG1tMiIsMTUpOworCSZwYWxpZ25yKCJ4bW0yIiwieG1tMiIsMTUpOworCSZweG9yCSgieG1tNyIsInhtbTEiKTsKKworCSMgcm90YXRlCisJJnBzaHVmZAkoInhtbTAiLCJ4bW0wIiwweEZGKTsKKwkmcGFsaWducigieG1tMCIsInhtbTAiLDEpOworCisJIyBmYWxsIHRocm91Z2guLi4KKwkmbW92ZHFhCSgmUVdQKDgsImVzcCIpLCJ4bW0yIik7CQkjIHhtbTgKKworCSMgbG93IHJvdW5kOiBzYW1lIGFzIGhpZ2ggcm91bmQsIGJ1dCBubyByb3RhdGlvbiBhbmQgbm8gcmNvbi4KKyZzZXRfbGFiZWwoIl92cGFlc19zY2hlZHVsZV9sb3dfcm91bmQiKTsKKwkjIHNtZWFyIHhtbTcKKwkmbW92ZHFhCSgieG1tMSIsInhtbTciKTsKKwkmcHNsbGRxCSgieG1tNyIsNCk7CisJJnB4b3IJKCJ4bW03IiwieG1tMSIpOworCSZtb3ZkcWEJKCJ4bW0xIiwieG1tNyIpOworCSZwc2xsZHEJKCJ4bW03Iiw4KTsKKwkmcHhvcgkoInhtbTciLCJ4bW0xIik7CisJJnB4b3IJKCJ4bW03IiwmUVdQKCRrX3M2MywkY29uc3QpKTsKKworCSMgc3ViYnl0ZQorCSZtb3ZkcWEJKCJ4bW00IiwmUVdQKCRrX3MwRiwkY29uc3QpKTsKKwkmbW92ZHFhCSgieG1tNSIsJlFXUCgka19pbnYsJGNvbnN0KSk7CSMgNCA6IDEvagorCSZtb3ZkcWEJKCJ4bW0xIiwieG1tNCIpOwkKKwkmcGFuZG4JKCJ4bW0xIiwieG1tMCIpOworCSZwc3JsZAkoInhtbTEiLDQpOwkJCSMgMSA9IGkKKwkmcGFuZAkoInhtbTAiLCJ4bW00Iik7CQkjIDAgPSBrCisJJm1vdmRxYQkoInhtbTIiLCZRV1AoJGtfaW52KzE2LCRjb25zdCkpOyMgMiA6IGEvaworCSZwc2h1ZmIJKCJ4bW0yIiwieG1tMCIpOwkJIyAyID0gYS9rCisJJnB4b3IJKCJ4bW0wIiwieG1tMSIpOwkJIyAwID0gagorCSZtb3ZkcWEJKCJ4bW0zIiwieG1tNSIpOwkJIyAzIDogMS9pCisJJnBzaHVmYgkoInhtbTMiLCJ4bW0xIik7CQkjIDMgPSAxL2kKKwkmcHhvcgkoInhtbTMiLCJ4bW0yIik7CQkjIDMgPSBpYWsgPSAxL2kgKyBhL2sKKwkmbW92ZHFhCSgieG1tNCIsInhtbTUiKTsJCSMgNCA6IDEvagorCSZwc2h1ZmIJKCJ4bW00IiwieG1tMCIpOwkJIyA0ID0gMS9qCisJJnB4b3IJKCJ4bW00IiwieG1tMiIpOwkJIyA0ID0gamFrID0gMS9qICsgYS9rCisJJm1vdmRxYQkoInhtbTIiLCJ4bW01Iik7CQkjIDIgOiAxL2lhaworCSZwc2h1ZmIJKCJ4bW0yIiwieG1tMyIpOwkJIyAyID0gMS9pYWsKKwkmcHhvcgkoInhtbTIiLCJ4bW0wIik7CQkjIDIgPSBpbworCSZtb3ZkcWEJKCJ4bW0zIiwieG1tNSIpOwkJIyAzIDogMS9qYWsKKwkmcHNodWZiCSgieG1tMyIsInhtbTQiKTsJCSMgMyA9IDEvamFrCisJJnB4b3IJKCJ4bW0zIiwieG1tMSIpOwkJIyAzID0gam8KKwkmbW92ZHFhCSgieG1tNCIsJlFXUCgka19zYjEsJGNvbnN0KSk7CSMgNCA6IHNib3UKKwkmcHNodWZiCSgieG1tNCIsInhtbTIiKTsJCSMgNCA9IHNib3UKKwkmbW92ZHFhCSgieG1tMCIsJlFXUCgka19zYjErMTYsJGNvbnN0KSk7IyAwIDogc2JvdAorCSZwc2h1ZmIJKCJ4bW0wIiwieG1tMyIpOwkJIyAwID0gc2IxdAorCSZweG9yCSgieG1tMCIsInhtbTQiKTsJCSMgMCA9IHNib3ggb3V0cHV0CisKKwkjIGFkZCBpbiBzbWVhcmVkIHN0dWZmCisJJnB4b3IJKCJ4bW0wIiwieG1tNyIpOworCSZtb3ZkcWEJKCJ4bW03IiwieG1tMCIpOworCSZyZXQJKCk7CismZnVuY3Rpb25fZW5kX0IoIl92cGFlc19zY2hlZHVsZV9yb3VuZCIpOworCisjIworIyMgIC5hZXNfc2NoZWR1bGVfdHJhbnNmb3JtCisjIworIyMgIExpbmVhci10cmFuc2Zvcm0gJXhtbTAgYWNjb3JkaW5nIHRvIHRhYmxlcyBhdCAoJWVieCkKKyMjCisjIyAgT3V0cHV0IGluICV4bW0wCisjIyAgQ2xvYmJlcnMgJXhtbTEsICV4bW0yCisjIworJmZ1bmN0aW9uX2JlZ2luX0IoIl92cGFlc19zY2hlZHVsZV90cmFuc2Zvcm0iKTsKKwkmbW92ZHFhCSgieG1tMiIsJlFXUCgka19zMEYsJGNvbnN0KSk7CisJJm1vdmRxYQkoInhtbTEiLCJ4bW0yIik7CisJJnBhbmRuCSgieG1tMSIsInhtbTAiKTsKKwkmcHNybGQJKCJ4bW0xIiw0KTsKKwkmcGFuZAkoInhtbTAiLCJ4bW0yIik7CisJJm1vdmRxYQkoInhtbTIiLCZRV1AoMCwkYmFzZSkpOworCSZwc2h1ZmIJKCJ4bW0yIiwieG1tMCIpOworCSZtb3ZkcWEJKCJ4bW0wIiwmUVdQKDE2LCRiYXNlKSk7CisJJnBzaHVmYgkoInhtbTAiLCJ4bW0xIik7CisJJnB4b3IJKCJ4bW0wIiwieG1tMiIpOworCSZyZXQJKCk7CismZnVuY3Rpb25fZW5kX0IoIl92cGFlc19zY2hlZHVsZV90cmFuc2Zvcm0iKTsKKworIyMKKyMjICAuYWVzX3NjaGVkdWxlX21hbmdsZQorIyMKKyMjICBNYW5nbGUgeG1tMCBmcm9tIChiYXNpcy10cmFuc2Zvcm1lZCkgc3RhbmRhcmQgdmVyc2lvbgorIyMgIHRvIG91ciB2ZXJzaW9uLgorIyMKKyMjICBPbiBlbmNyeXB0LAorIyMgICAgeG9yIHdpdGggMHg2MworIyMgICAgbXVsdGlwbHkgYnkgY2lyY3VsYW50IDAsMSwxLDEKKyMjICAgIGFwcGx5IHNoaWZ0cm93cyB0cmFuc2Zvcm0KKyMjCisjIyAgT24gZGVjcnlwdCwKKyMjICAgIHhvciB3aXRoIDB4NjMKKyMjICAgIG11bHRpcGx5IGJ5ICJpbnZlcnNlIG1peGNvbHVtbnMiIGNpcmN1bGFudCBFLEIsRCw5CisjIyAgICBkZXNrZXcKKyMjICAgIGFwcGx5IHNoaWZ0cm93cyB0cmFuc2Zvcm0KKyMjCisjIworIyMgIFdyaXRlcyBvdXQgdG8gKCVlZHgpLCBhbmQgaW5jcmVtZW50cyBvciBkZWNyZW1lbnRzIGl0CisjIyAgS2VlcHMgdHJhY2sgb2Ygcm91bmQgbnVtYmVyIG1vZCA0IGluICVlY3gKKyMjICBQcmVzZXJ2ZXMgeG1tMAorIyMgIENsb2JiZXJzIHhtbTEteG1tNQorIyMKKyZmdW5jdGlvbl9iZWdpbl9CKCJfdnBhZXNfc2NoZWR1bGVfbWFuZ2xlIik7CisJJm1vdmRxYQkoInhtbTQiLCJ4bW0wIik7CSMgc2F2ZSB4bW0wIGZvciBsYXRlcgorCSZtb3ZkcWEJKCJ4bW01IiwmUVdQKCRrX21jX2ZvcndhcmQsJGNvbnN0KSk7CisJJnRlc3QJKCRvdXQsJG91dCk7CisJJmpuegkoJmxhYmVsKCJzY2hlZHVsZV9tYW5nbGVfZGVjIikpOworCisJIyBlbmNyeXB0aW5nCisJJmFkZAkoJGtleSwxNik7CisJJnB4b3IJKCJ4bW00IiwmUVdQKCRrX3M2MywkY29uc3QpKTsKKwkmcHNodWZiCSgieG1tNCIsInhtbTUiKTsKKwkmbW92ZHFhCSgieG1tMyIsInhtbTQiKTsKKwkmcHNodWZiCSgieG1tNCIsInhtbTUiKTsKKwkmcHhvcgkoInhtbTMiLCJ4bW00Iik7CisJJnBzaHVmYgkoInhtbTQiLCJ4bW01Iik7CisJJnB4b3IJKCJ4bW0zIiwieG1tNCIpOworCisJJmptcAkoJmxhYmVsKCJzY2hlZHVsZV9tYW5nbGVfYm90aCIpKTsKKworJnNldF9sYWJlbCgic2NoZWR1bGVfbWFuZ2xlX2RlYyIsMTYpOworCSMgaW52ZXJzZSBtaXggY29sdW1ucworCSZtb3ZkcWEJKCJ4bW0yIiwmUVdQKCRrX3MwRiwkY29uc3QpKTsKKwkmbGVhCSgkaW5wLCZEV1AoJGtfZGtzZCwkY29uc3QpKTsKKwkmbW92ZHFhCSgieG1tMSIsInhtbTIiKTsKKwkmcGFuZG4JKCJ4bW0xIiwieG1tNCIpOworCSZwc3JsZAkoInhtbTEiLDQpOwkJCSMgMSA9IGhpCisJJnBhbmQJKCJ4bW00IiwieG1tMiIpOwkJIyA0ID0gbG8KKworCSZtb3ZkcWEJKCJ4bW0yIiwmUVdQKDAsJGlucCkpOworCSZwc2h1ZmIJKCJ4bW0yIiwieG1tNCIpOworCSZtb3ZkcWEJKCJ4bW0zIiwmUVdQKDB4MTAsJGlucCkpOworCSZwc2h1ZmIJKCJ4bW0zIiwieG1tMSIpOworCSZweG9yCSgieG1tMyIsInhtbTIiKTsKKwkmcHNodWZiCSgieG1tMyIsInhtbTUiKTsKKworCSZtb3ZkcWEJKCJ4bW0yIiwmUVdQKDB4MjAsJGlucCkpOworCSZwc2h1ZmIJKCJ4bW0yIiwieG1tNCIpOworCSZweG9yCSgieG1tMiIsInhtbTMiKTsKKwkmbW92ZHFhCSgieG1tMyIsJlFXUCgweDMwLCRpbnApKTsKKwkmcHNodWZiCSgieG1tMyIsInhtbTEiKTsKKwkmcHhvcgkoInhtbTMiLCJ4bW0yIik7CisJJnBzaHVmYgkoInhtbTMiLCJ4bW01Iik7CisKKwkmbW92ZHFhCSgieG1tMiIsJlFXUCgweDQwLCRpbnApKTsKKwkmcHNodWZiCSgieG1tMiIsInhtbTQiKTsKKwkmcHhvcgkoInhtbTIiLCJ4bW0zIik7CisJJm1vdmRxYQkoInhtbTMiLCZRV1AoMHg1MCwkaW5wKSk7CisJJnBzaHVmYgkoInhtbTMiLCJ4bW0xIik7CisJJnB4b3IJKCJ4bW0zIiwieG1tMiIpOworCSZwc2h1ZmIJKCJ4bW0zIiwieG1tNSIpOworCisJJm1vdmRxYQkoInhtbTIiLCZRV1AoMHg2MCwkaW5wKSk7CisJJnBzaHVmYgkoInhtbTIiLCJ4bW00Iik7CisJJnB4b3IJKCJ4bW0yIiwieG1tMyIpOworCSZtb3ZkcWEJKCJ4bW0zIiwmUVdQKDB4NzAsJGlucCkpOworCSZwc2h1ZmIJKCJ4bW0zIiwieG1tMSIpOworCSZweG9yCSgieG1tMyIsInhtbTIiKTsKKworCSZhZGQJKCRrZXksLTE2KTsKKworJnNldF9sYWJlbCgic2NoZWR1bGVfbWFuZ2xlX2JvdGgiKTsKKwkmbW92ZHFhCSgieG1tMSIsJlFXUCgka19zciwkY29uc3QsJG1hZ2ljKSk7CisJJnBzaHVmYgkoInhtbTMiLCJ4bW0xIik7CisJJmFkZAkoJG1hZ2ljLC0xNik7CisJJmFuZAkoJG1hZ2ljLDB4MzApOworCSZtb3ZkcXUJKCZRV1AoMCwka2V5KSwieG1tMyIpOworCSZyZXQJKCk7CismZnVuY3Rpb25fZW5kX0IoIl92cGFlc19zY2hlZHVsZV9tYW5nbGUiKTsKKworIworIyBJbnRlcmZhY2UgdG8gT3BlblNTTAorIworJmZ1bmN0aW9uX2JlZ2luKCIke1BSRUZJWH1fc2V0X2VuY3J5cHRfa2V5Iik7CisJJm1vdgkoJGlucCwmd3BhcmFtKDApKTsJCSMgaW5wCisJJmxlYQkoJGJhc2UsJkRXUCgtNTYsImVzcCIpKTsKKwkmbW92CSgkcm91bmQsJndwYXJhbSgxKSk7CQkjIGJpdHMKKwkmYW5kCSgkYmFzZSwtMTYpOworCSZtb3YJKCRrZXksJndwYXJhbSgyKSk7CQkjIGtleQorCSZ4Y2hnCSgkYmFzZSwiZXNwIik7CQkJIyBhbGxvY2EKKwkmbW92CSgmRFdQKDQ4LCJlc3AiKSwkYmFzZSk7CisKKwkmbW92CSgkYmFzZSwkcm91bmQpOworCSZzaHIJKCRiYXNlLDUpOworCSZhZGQJKCRiYXNlLDUpOworCSZtb3YJKCZEV1AoMjQwLCRrZXkpLCRiYXNlKTsJCSMgQUVTX0tFWS0+cm91bmRzID0gbmJpdHMvMzIrNTsKKwkmbW92CSgkbWFnaWMsMHgzMCk7CisJJm1vdgkoJG91dCwwKTsKKworCSZsZWEJKCRjb25zdCwmRFdQKCZsYWJlbCgiX3ZwYWVzX2NvbnN0cyIpLiIrMHgzMC0iLiZsYWJlbCgicGljX3BvaW50IikpKTsKKwkmY2FsbAkoIl92cGFlc19zY2hlZHVsZV9jb3JlIik7Cismc2V0X2xhYmVsKCJwaWNfcG9pbnQiKTsKKworCSZtb3YJKCJlc3AiLCZEV1AoNDgsImVzcCIpKTsKKwkmeG9yCSgiZWF4IiwiZWF4Iik7CismZnVuY3Rpb25fZW5kKCIke1BSRUZJWH1fc2V0X2VuY3J5cHRfa2V5Iik7CisKKyZmdW5jdGlvbl9iZWdpbigiJHtQUkVGSVh9X3NldF9kZWNyeXB0X2tleSIpOworCSZtb3YJKCRpbnAsJndwYXJhbSgwKSk7CQkjIGlucAorCSZsZWEJKCRiYXNlLCZEV1AoLTU2LCJlc3AiKSk7CisJJm1vdgkoJHJvdW5kLCZ3cGFyYW0oMSkpOwkJIyBiaXRzCisJJmFuZAkoJGJhc2UsLTE2KTsKKwkmbW92CSgka2V5LCZ3cGFyYW0oMikpOwkJIyBrZXkKKwkmeGNoZwkoJGJhc2UsImVzcCIpOwkJCSMgYWxsb2NhCisJJm1vdgkoJkRXUCg0OCwiZXNwIiksJGJhc2UpOworCisJJm1vdgkoJGJhc2UsJHJvdW5kKTsKKwkmc2hyCSgkYmFzZSw1KTsKKwkmYWRkCSgkYmFzZSw1KTsKKwkmbW92CSgmRFdQKDI0MCwka2V5KSwkYmFzZSk7CSMgQUVTX0tFWS0+cm91bmRzID0gbmJpdHMvMzIrNTsKKwkmc2hsCSgkYmFzZSw0KTsKKwkmbGVhCSgka2V5LCZEV1AoMTYsJGtleSwkYmFzZSkpOworCisJJm1vdgkoJG91dCwxKTsKKwkmbW92CSgkbWFnaWMsJHJvdW5kKTsKKwkmc2hyCSgkbWFnaWMsMSk7CisJJmFuZAkoJG1hZ2ljLDMyKTsKKwkmeG9yCSgkbWFnaWMsMzIpOwkJCSMgbmJpc3Q9PTE5Mj8wOjMyOworCisJJmxlYQkoJGNvbnN0LCZEV1AoJmxhYmVsKCJfdnBhZXNfY29uc3RzIikuIisweDMwLSIuJmxhYmVsKCJwaWNfcG9pbnQiKSkpOworCSZjYWxsCSgiX3ZwYWVzX3NjaGVkdWxlX2NvcmUiKTsKKyZzZXRfbGFiZWwoInBpY19wb2ludCIpOworCisJJm1vdgkoImVzcCIsJkRXUCg0OCwiZXNwIikpOworCSZ4b3IJKCJlYXgiLCJlYXgiKTsKKyZmdW5jdGlvbl9lbmQoIiR7UFJFRklYfV9zZXRfZGVjcnlwdF9rZXkiKTsKKworJmZ1bmN0aW9uX2JlZ2luKCIke1BSRUZJWH1fZW5jcnlwdCIpOworCSZsZWEJKCRjb25zdCwmRFdQKCZsYWJlbCgiX3ZwYWVzX2NvbnN0cyIpLiIrMHgzMC0iLiZsYWJlbCgicGljX3BvaW50IikpKTsKKwkmY2FsbAkoIl92cGFlc19wcmVoZWF0Iik7Cismc2V0X2xhYmVsKCJwaWNfcG9pbnQiKTsKKwkmbW92CSgkaW5wLCZ3cGFyYW0oMCkpOwkJIyBpbnAKKwkmbGVhCSgkYmFzZSwmRFdQKC01NiwiZXNwIikpOworCSZtb3YJKCRvdXQsJndwYXJhbSgxKSk7CQkjIG91dAorCSZhbmQJKCRiYXNlLC0xNik7CisJJm1vdgkoJGtleSwmd3BhcmFtKDIpKTsJCSMga2V5CisJJnhjaGcJKCRiYXNlLCJlc3AiKTsJCQkjIGFsbG9jYQorCSZtb3YJKCZEV1AoNDgsImVzcCIpLCRiYXNlKTsKKworCSZtb3ZkcXUJKCJ4bW0wIiwmUVdQKDAsJGlucCkpOworCSZjYWxsCSgiX3ZwYWVzX2VuY3J5cHRfY29yZSIpOworCSZtb3ZkcXUJKCZRV1AoMCwkb3V0KSwieG1tMCIpOworCisJJm1vdgkoImVzcCIsJkRXUCg0OCwiZXNwIikpOworJmZ1bmN0aW9uX2VuZCgiJHtQUkVGSVh9X2VuY3J5cHQiKTsKKworJmZ1bmN0aW9uX2JlZ2luKCIke1BSRUZJWH1fZGVjcnlwdCIpOworCSZsZWEJKCRjb25zdCwmRFdQKCZsYWJlbCgiX3ZwYWVzX2NvbnN0cyIpLiIrMHgzMC0iLiZsYWJlbCgicGljX3BvaW50IikpKTsKKwkmY2FsbAkoIl92cGFlc19wcmVoZWF0Iik7Cismc2V0X2xhYmVsKCJwaWNfcG9pbnQiKTsKKwkmbW92CSgkaW5wLCZ3cGFyYW0oMCkpOwkJIyBpbnAKKwkmbGVhCSgkYmFzZSwmRFdQKC01NiwiZXNwIikpOworCSZtb3YJKCRvdXQsJndwYXJhbSgxKSk7CQkjIG91dAorCSZhbmQJKCRiYXNlLC0xNik7CisJJm1vdgkoJGtleSwmd3BhcmFtKDIpKTsJCSMga2V5CisJJnhjaGcJKCRiYXNlLCJlc3AiKTsJCQkjIGFsbG9jYQorCSZtb3YJKCZEV1AoNDgsImVzcCIpLCRiYXNlKTsKKworCSZtb3ZkcXUJKCJ4bW0wIiwmUVdQKDAsJGlucCkpOworCSZjYWxsCSgiX3ZwYWVzX2RlY3J5cHRfY29yZSIpOworCSZtb3ZkcXUJKCZRV1AoMCwkb3V0KSwieG1tMCIpOworCisJJm1vdgkoImVzcCIsJkRXUCg0OCwiZXNwIikpOworJmZ1bmN0aW9uX2VuZCgiJHtQUkVGSVh9X2RlY3J5cHQiKTsKKworJmZ1bmN0aW9uX2JlZ2luKCIke1BSRUZJWH1fY2JjX2VuY3J5cHQiKTsKKwkmbW92CSgkaW5wLCZ3cGFyYW0oMCkpOwkJIyBpbnAKKwkmbW92CSgkb3V0LCZ3cGFyYW0oMSkpOwkJIyBvdXQKKwkmbW92CSgkcm91bmQsJndwYXJhbSgyKSk7CQkjIGxlbgorCSZtb3YJKCRrZXksJndwYXJhbSgzKSk7CQkjIGtleQorCSZzdWIJKCRyb3VuZCwxNik7CisJJmpjCSgmbGFiZWwoImNiY19hYm9ydCIpKTsKKwkmbGVhCSgkYmFzZSwmRFdQKC01NiwiZXNwIikpOworCSZtb3YJKCRjb25zdCwmd3BhcmFtKDQpKTsJCSMgaXZwCisJJmFuZAkoJGJhc2UsLTE2KTsKKwkmbW92CSgkbWFnaWMsJndwYXJhbSg1KSk7CQkjIGVuYworCSZ4Y2hnCSgkYmFzZSwiZXNwIik7CQkJIyBhbGxvY2EKKwkmbW92ZHF1CSgieG1tMSIsJlFXUCgwLCRjb25zdCkpOwkjIGxvYWQgSVYKKwkmc3ViCSgkb3V0LCRpbnApOworCSZtb3YJKCZEV1AoNDgsImVzcCIpLCRiYXNlKTsKKworCSZtb3YJKCZEV1AoMCwiZXNwIiksJG91dCk7CQkjIHNhdmUgb3V0CisJJm1vdgkoJkRXUCg0LCJlc3AiKSwka2V5KQkJIyBzYXZlIGtleQorCSZtb3YJKCZEV1AoOCwiZXNwIiksJGNvbnN0KTsJCSMgc2F2ZSBpdnAKKwkmbW92CSgkb3V0LCRyb3VuZCk7CQkJIyAkb3V0IHdvcmtzIGFzICRsZW4KKworCSZsZWEJKCRjb25zdCwmRFdQKCZsYWJlbCgiX3ZwYWVzX2NvbnN0cyIpLiIrMHgzMC0iLiZsYWJlbCgicGljX3BvaW50IikpKTsKKwkmY2FsbAkoIl92cGFlc19wcmVoZWF0Iik7Cismc2V0X2xhYmVsKCJwaWNfcG9pbnQiKTsKKwkmY21wCSgkbWFnaWMsMCk7CisJJmplCSgmbGFiZWwoImNiY19kZWNfbG9vcCIpKTsKKwkmam1wCSgmbGFiZWwoImNiY19lbmNfbG9vcCIpKTsKKworJnNldF9sYWJlbCgiY2JjX2VuY19sb29wIiwxNik7CisJJm1vdmRxdQkoInhtbTAiLCZRV1AoMCwkaW5wKSk7CQkjIGxvYWQgaW5wdXQKKwkmcHhvcgkoInhtbTAiLCJ4bW0xIik7CQkjIGlucF49aXYKKwkmY2FsbAkoIl92cGFlc19lbmNyeXB0X2NvcmUiKTsKKwkmbW92CSgkYmFzZSwmRFdQKDAsImVzcCIpKTsJCSMgcmVzdG9yZSBvdXQKKwkmbW92CSgka2V5LCZEV1AoNCwiZXNwIikpOwkJIyByZXN0b3JlIGtleQorCSZtb3ZkcWEJKCJ4bW0xIiwieG1tMCIpOworCSZtb3ZkcXUJKCZRV1AoMCwkYmFzZSwkaW5wKSwieG1tMCIpOwkjIHdyaXRlIG91dHB1dAorCSZsZWEJKCRpbnAsJkRXUCgxNiwkaW5wKSk7CisJJnN1YgkoJG91dCwxNik7CisJJmpuYwkoJmxhYmVsKCJjYmNfZW5jX2xvb3AiKSk7CisJJmptcAkoJmxhYmVsKCJjYmNfZG9uZSIpKTsKKworJnNldF9sYWJlbCgiY2JjX2RlY19sb29wIiwxNik7CisJJm1vdmRxdQkoInhtbTAiLCZRV1AoMCwkaW5wKSk7CQkjIGxvYWQgaW5wdXQKKwkmbW92ZHFhCSgmUVdQKDE2LCJlc3AiKSwieG1tMSIpOwkjIHNhdmUgSVYKKwkmbW92ZHFhCSgmUVdQKDMyLCJlc3AiKSwieG1tMCIpOwkjIHNhdmUgZnV0dXJlIElWCisJJmNhbGwJKCJfdnBhZXNfZGVjcnlwdF9jb3JlIik7CisJJm1vdgkoJGJhc2UsJkRXUCgwLCJlc3AiKSk7CQkjIHJlc3RvcmUgb3V0CisJJm1vdgkoJGtleSwmRFdQKDQsImVzcCIpKTsJCSMgcmVzdG9yZSBrZXkKKwkmcHhvcgkoInhtbTAiLCZRV1AoMTYsImVzcCIpKTsJIyBvdXRePWl2CisJJm1vdmRxYQkoInhtbTEiLCZRV1AoMzIsImVzcCIpKTsJIyBsb2FkIG5leHQgSVYKKwkmbW92ZHF1CSgmUVdQKDAsJGJhc2UsJGlucCksInhtbTAiKTsJIyB3cml0ZSBvdXRwdXQKKwkmbGVhCSgkaW5wLCZEV1AoMTYsJGlucCkpOworCSZzdWIJKCRvdXQsMTYpOworCSZqbmMJKCZsYWJlbCgiY2JjX2RlY19sb29wIikpOworCismc2V0X2xhYmVsKCJjYmNfZG9uZSIpOworCSZtb3YJKCRiYXNlLCZEV1AoOCwiZXNwIikpOwkJIyByZXN0b3JlIGl2cAorCSZtb3YJKCJlc3AiLCZEV1AoNDgsImVzcCIpKTsKKwkmbW92ZHF1CSgmUVdQKDAsJGJhc2UpLCJ4bW0xIik7CQkjIHdyaXRlIElWCismc2V0X2xhYmVsKCJjYmNfYWJvcnQiKTsKKyZmdW5jdGlvbl9lbmQoIiR7UFJFRklYfV9jYmNfZW5jcnlwdCIpOworCismYXNtX2ZpbmlzaCgpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2Flcy9hc20vdnBhZXMteDg2XzY0LnBsIGIvY3J5cHRvL2Flcy9hc20vdnBhZXMteDg2XzY0LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMjM5NGIKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYWVzL2FzbS92cGFlcy14ODZfNjQucGwKQEAgLTAsMCArMSwxMjA2IEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIENvbnN0YW50LXRpbWUgU1NTRTMgQUVTIGNvcmUgaW1wbGVtZW50YXRpb24uCisjIyB2ZXJzaW9uIDAuMQorIyMKKyMjIEJ5IE1pa2UgSGFtYnVyZyAoU3RhbmZvcmQgVW5pdmVyc2l0eSksIDIwMDkKKyMjIFB1YmxpYyBkb21haW4uCisjIworIyMgRm9yIGRldGFpbHMgc2VlIGh0dHA6Ly9zaGlmdGxlZnQub3JnL3BhcGVycy92ZWN0b3JfYWVzLyBhbmQKKyMjIGh0dHA6Ly9jcnlwdG8uc3RhbmZvcmQuZWR1L3ZwYWVzLy4KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBTZXB0ZW1iZXIgMjAxMS4KKyMKKyMgSW50ZXJmYWNlIHRvIE9wZW5TU0wgYXMgImFsbW9zdCIgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IKKyMgYWVzLXg4Nl82NC5wbC4gIkFsbW9zdCIgcmVmZXJzIHRvIHRoZSBmYWN0IHRoYXQgQUVTX2NiY19lbmNyeXB0CisjIGRvZXNuJ3QgaGFuZGxlIHBhcnRpYWwgdmVjdG9ycyAoZG9lc24ndCBoYXZlIHRvIGlmIGNhbGxlZCBmcm9tCisjIEVWUCBvbmx5KS4gIkRyb3AtaW4iIGltcGxpZXMgdGhhdCB0aGlzIG1vZHVsZSBkb2Vzbid0IHNoYXJlIGtleQorIyBzY2hlZHVsZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgb3JpZ2luYWwgbm9yIGRvZXMgaXQgbWFrZSBhc3N1bXB0aW9uCisjIGFib3V0IGl0cyBhbGlnbm1lbnQuLi4KKyMKKyMgUGVyZm9ybWFuY2Ugc3VtbWFyeS4gYWVzLXg4Nl82NC5wbCBjb2x1bW4gbGlzdHMgbGFyZ2UtYmxvY2sgQ0JDCisjIGVuY3J5cHQvZGVjcnlwdC93aXRoLWh5cGVyLXRocmVhZGluZy1vZmYoKikgcmVzdWx0cyBpbiBjeWNsZXMgcGVyCisjIGJ5dGUgcHJvY2Vzc2VkIHdpdGggMTI4LWJpdCBrZXksIGFuZCB2cGFlcy14ODZfNjQucGwgY29sdW1uIC0KKyMgW2Fsc28gbGFyZ2UtYmxvY2sgQ0JDXSBlbmNyeXB0L2RlY3J5cHQuCisjCisjCQlhZXMteDg2XzY0LnBsCQl2cGFlcy14ODZfNjQucGwKKyMKKyMgQ29yZSAyKCoqKQkyOS42LzQxLjEvMTQuMwkJMjEuOS8yNS4yKCoqKikKKyMgTmVoYWxlbQkyOS42LzQwLjMvMTQuNgkJMTAuMC8xMS44CisjIEF0b20JCTU3LjMvNzQuMi8zMi4xCQk2MC45Lzc3LjIoKioqKQorIworIyAoKikJIkh5cGVyLXRocmVhZGluZyIgaW4gdGhlIGNvbnRleHQgcmVmZXJzIHJhdGhlciB0byBjYWNoZSBzaGFyZWQKKyMJYW1vbmcgbXVsdGlwbGUgY29yZXMsIHRoYW4gdG8gc3BlY2lmaWNhbGx5IEludGVsIEhUVC4gQXMgdmFzdAorIwltYWpvcml0eSBvZiBjb250ZW1wb3JhcnkgY29yZXMgc2hhcmUgY2FjaGUsIHNsb3dlciBjb2RlIHBhdGgKKyMJaXMgY29tbW9uIHBsYWNlLiBJbiBvdGhlciB3b3JkcyAid2l0aC1oeXBlci10aHJlYWRpbmctb2ZmIgorIwlyZXN1bHRzIGFyZSBwcmVzZW50ZWQgbW9zdGx5IGZvciByZWZlcmVuY2UgcHVycG9zZXMuCisjCisjICgqKikJIkNvcmUgMiIgcmVmZXJzIHRvIGluaXRpYWwgNjVubSBkZXNpZ24sIGEuay5hLiBDb25yb2UuCisjCisjICgqKiopCUxlc3MgaW1wcmVzc2l2ZSBpbXByb3ZlbWVudCBvbiBDb3JlIDIgYW5kIEF0b20gaXMgZHVlIHRvIHNsb3cKKyMJcHNodWZiLAl5ZXQgaXQncyByZXNwZWN0YWJsZSArMzYlLzYyJSBpbXByb3ZlbWVudCBvbiBDb3JlIDIKKyMJKGFzIGltcGxpZWQsIG92ZXIgImh5cGVyLXRocmVhZGluZy1zYWZlIiBjb2RlIHBhdGgpLgorIworIwkJCQkJCTxhcHByb0BvcGVuc3NsLm9yZz4KKworJGZsYXZvdXIgPSBzaGlmdDsKKyRvdXRwdXQgID0gc2hpZnQ7CitpZiAoJGZsYXZvdXIgPX4gL1wuLykgeyAkb3V0cHV0ID0gJGZsYXZvdXI7IHVuZGVmICRmbGF2b3VyOyB9CisKKyR3aW42ND0wOyAkd2luNjQ9MSBpZiAoJGZsYXZvdXIgPX4gL1tubV1hc218bWluZ3c2NC8gfHwgJG91dHB1dCA9fiAvXC5hc20kLyk7CisKKyQwID1+IG0vKC4qW1wvXFxdKVteXC9cXF0rJC87ICRkaXI9JDE7CisoICR4bGF0ZT0iJHtkaXJ9eDg2XzY0LXhsYXRlLnBsIiBhbmQgLWYgJHhsYXRlICkgb3IKKyggJHhsYXRlPSIke2Rpcn0uLi8uLi9wZXJsYXNtL3g4Nl82NC14bGF0ZS5wbCIgYW5kIC1mICR4bGF0ZSkgb3IKK2RpZSAiY2FuJ3QgbG9jYXRlIHg4Nl82NC14bGF0ZS5wbCI7CisKK29wZW4gT1VULCJ8IFwiJF5YXCIgJHhsYXRlICRmbGF2b3VyICRvdXRwdXQiOworKlNURE9VVD0qT1VUOworCiskUFJFRklYPSJ2cGFlcyI7CisKKyRjb2RlLj08PF9fXzsKKy50ZXh0CisKKyMjCisjIyAgX2Flc19lbmNyeXB0X2NvcmUKKyMjCisjIyAgQUVTLWVuY3J5cHQgJXhtbTAuCisjIworIyMgIElucHV0czoKKyMjICAgICAleG1tMCA9IGlucHV0CisjIyAgICAgJXhtbTktJXhtbTE1IGFzIGluIF92cGFlc19wcmVoZWF0CisjIyAgICAoJXJkeCkgPSBzY2hlZHVsZWQga2V5cworIyMKKyMjICBPdXRwdXQgaW4gJXhtbTAKKyMjICBDbG9iYmVycyAgJXhtbTEtJXhtbTUsICVyOSwgJXIxMCwgJXIxMSwgJXJheAorIyMgIFByZXNlcnZlcyAleG1tNiAtICV4bW04IHNvIHlvdSBnZXQgc29tZSBsb2NhbCB2ZWN0b3JzCisjIworIyMKKy50eXBlCV92cGFlc19lbmNyeXB0X2NvcmUsXEBhYmktb21uaXBvdGVudAorLmFsaWduIDE2CitfdnBhZXNfZW5jcnlwdF9jb3JlOgorCW1vdgklcmR4LAklcjkKKwltb3YJXCQxNiwJJXIxMQorCW1vdgkyNDAoJXJkeCksJWVheAorCW1vdmRxYQkleG1tOSwJJXhtbTEKKwltb3ZkcWEJLkxrX2lwdCglcmlwKSwgJXhtbTIJIyBpcHRsbworCXBhbmRuCSV4bW0wLAkleG1tMQorCW1vdmRxdQkoJXI5KSwJJXhtbTUJCSMgcm91bmQwIGtleQorCXBzcmxkCVwkNCwJJXhtbTEKKwlwYW5kCSV4bW05LAkleG1tMAorCXBzaHVmYgkleG1tMCwJJXhtbTIKKwltb3ZkcWEJLkxrX2lwdCsxNiglcmlwKSwgJXhtbTAJIyBpcHRoaQorCXBzaHVmYgkleG1tMSwJJXhtbTAKKwlweG9yCSV4bW01LAkleG1tMgorCWFkZAlcJDE2LAklcjkKKwlweG9yCSV4bW0yLAkleG1tMAorCWxlYQkuTGtfbWNfYmFja3dhcmQoJXJpcCksJXIxMAorCWptcAkuTGVuY19lbnRyeQorCisuYWxpZ24gMTYKKy5MZW5jX2xvb3A6CisJIyBtaWRkbGUgb2YgbWlkZGxlIHJvdW5kCisJbW92ZHFhICAleG1tMTMsCSV4bW00CSMgNCA6IHNiMXUKKwltb3ZkcWEgICV4bW0xMiwJJXhtbTAJIyAwIDogc2IxdAorCXBzaHVmYiAgJXhtbTIsCSV4bW00CSMgNCA9IHNiMXUKKwlwc2h1ZmIgICV4bW0zLAkleG1tMAkjIDAgPSBzYjF0CisJcHhvcgkleG1tNSwJJXhtbTQJIyA0ID0gc2IxdSArIGsKKwltb3ZkcWEgICV4bW0xNSwJJXhtbTUJIyA0IDogc2IydQorCXB4b3IJJXhtbTQsCSV4bW0wCSMgMCA9IEEKKwltb3ZkcWEJLTB4NDAoJXIxMSwlcjEwKSwgJXhtbTEJCSMgLkxrX21jX2ZvcndhcmRbXQorCXBzaHVmYgkleG1tMiwJJXhtbTUJIyA0ID0gc2IydQorCW1vdmRxYQkoJXIxMSwlcjEwKSwgJXhtbTQJCSMgLkxrX21jX2JhY2t3YXJkW10KKwltb3ZkcWEJJXhtbTE0LCAleG1tMgkjIDIgOiBzYjJ0CisJcHNodWZiCSV4bW0zLCAgJXhtbTIJIyAyID0gc2IydAorCW1vdmRxYQkleG1tMCwgICV4bW0zCSMgMyA9IEEKKwlweG9yCSV4bW01LAkleG1tMgkjIDIgPSAyQQorCXBzaHVmYiAgJXhtbTEsICAleG1tMAkjIDAgPSBCCisJYWRkCVwkMTYsCSVyOQkjIG5leHQga2V5CisJcHhvcgkleG1tMiwgICV4bW0wCSMgMCA9IDJBK0IKKwlwc2h1ZmIJJXhtbTQsCSV4bW0zCSMgMyA9IEQKKwlhZGQJXCQxNiwJJXIxMQkjIG5leHQgbWMKKwlweG9yCSV4bW0wLAkleG1tMwkjIDMgPSAyQStCK0QKKwlwc2h1ZmIgICV4bW0xLAkleG1tMAkjIDAgPSAyQitDCisJYW5kCVwkMHgzMCwJJXIxMQkjIC4uLiBtb2QgNAorCXN1YglcJDEsJXJheAkjIG5yLS0KKwlweG9yCSV4bW0zLAkleG1tMAkjIDAgPSAyQSszQitDK0QKKworLkxlbmNfZW50cnk6CisJIyB0b3Agb2Ygcm91bmQKKwltb3ZkcWEgICV4bW05LCAJJXhtbTEJIyAxIDogaQorCW1vdmRxYQkleG1tMTEsICV4bW01CSMgMiA6IGEvaworCXBhbmRuCSV4bW0wLCAJJXhtbTEJIyAxID0gaTw8NAorCXBzcmxkCVwkNCwgICAJJXhtbTEgICAjIDEgPSBpCisJcGFuZAkleG1tOSwgCSV4bW0wICAgIyAwID0gaworCXBzaHVmYiAgJXhtbTAsICAleG1tNQkjIDIgPSBhL2sKKwltb3ZkcWEJJXhtbTEwLAkleG1tMyAgCSMgMyA6IDEvaQorCXB4b3IJJXhtbTEsCSV4bW0wCSMgMCA9IGoKKwlwc2h1ZmIgICV4bW0xLCAJJXhtbTMgIAkjIDMgPSAxL2kKKwltb3ZkcWEJJXhtbTEwLAkleG1tNCAgCSMgNCA6IDEvagorCXB4b3IJJXhtbTUsIAkleG1tMyAgCSMgMyA9IGlhayA9IDEvaSArIGEvaworCXBzaHVmYgkleG1tMCwgCSV4bW00ICAJIyA0ID0gMS9qCisJbW92ZHFhCSV4bW0xMCwJJXhtbTIgIAkjIDIgOiAxL2lhaworCXB4b3IJJXhtbTUsIAkleG1tNCAgCSMgNCA9IGphayA9IDEvaiArIGEvaworCXBzaHVmYiAgJXhtbTMsCSV4bW0yICAJIyAyID0gMS9pYWsKKwltb3ZkcWEJJXhtbTEwLCAleG1tMyAgICMgMyA6IDEvamFrCisJcHhvcgkleG1tMCwgCSV4bW0yICAJIyAyID0gaW8KKwlwc2h1ZmIgICV4bW00LCAgJXhtbTMgICAjIDMgPSAxL2phaworCW1vdmRxdQkoJXI5KSwJJXhtbTUKKwlweG9yCSV4bW0xLCAgJXhtbTMgICAjIDMgPSBqbworCWpuegkuTGVuY19sb29wCisKKwkjIG1pZGRsZSBvZiBsYXN0IHJvdW5kCisJbW92ZHFhCS0weDYwKCVyMTApLCAleG1tNAkjIDMgOiBzYm91CS5Ma19zYm8KKwltb3ZkcWEJLTB4NTAoJXIxMCksICV4bW0wCSMgMCA6IHNib3QJLkxrX3NibysxNgorCXBzaHVmYiAgJXhtbTIsICAleG1tNAkjIDQgPSBzYm91CisJcHhvcgkleG1tNSwgICV4bW00CSMgNCA9IHNiMXUgKyBrCisJcHNodWZiICAleG1tMywJJXhtbTAJIyAwID0gc2IxdAorCW1vdmRxYQkweDQwKCVyMTEsJXIxMCksICV4bW0xCQkjIC5Ma19zcltdCisJcHhvcgkleG1tNCwJJXhtbTAJIyAwID0gQQorCXBzaHVmYgkleG1tMSwJJXhtbTAKKwlyZXQKKy5zaXplCV92cGFlc19lbmNyeXB0X2NvcmUsLi1fdnBhZXNfZW5jcnlwdF9jb3JlCisJCisjIworIyMgIERlY3J5cHRpb24gY29yZQorIyMKKyMjICBTYW1lIEFQSSBhcyBlbmNyeXB0aW9uIGNvcmUuCisjIworLnR5cGUJX3ZwYWVzX2RlY3J5cHRfY29yZSxcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMTYKK192cGFlc19kZWNyeXB0X2NvcmU6CisJbW92CSVyZHgsCSVyOQkJIyBsb2FkIGtleQorCW1vdgkyNDAoJXJkeCksJWVheAorCW1vdmRxYQkleG1tOSwJJXhtbTEKKwltb3ZkcWEJLkxrX2RpcHQoJXJpcCksICV4bW0yCSMgaXB0bG8KKwlwYW5kbgkleG1tMCwJJXhtbTEKKwltb3YJJXJheCwJJXIxMQorCXBzcmxkCVwkNCwJJXhtbTEKKwltb3ZkcXUJKCVyOSksCSV4bW01CQkjIHJvdW5kMCBrZXkKKwlzaGwJXCQ0LAklcjExCisJcGFuZAkleG1tOSwJJXhtbTAKKwlwc2h1ZmIJJXhtbTAsCSV4bW0yCisJbW92ZHFhCS5Ma19kaXB0KzE2KCVyaXApLCAleG1tMCAjIGlwdGhpCisJeG9yCVwkMHgzMCwJJXIxMQorCWxlYQkuTGtfZHNiZCglcmlwKSwlcjEwCisJcHNodWZiCSV4bW0xLAkleG1tMAorCWFuZAlcJDB4MzAsCSVyMTEKKwlweG9yCSV4bW01LAkleG1tMgorCW1vdmRxYQkuTGtfbWNfZm9yd2FyZCs0OCglcmlwKSwgJXhtbTUKKwlweG9yCSV4bW0yLAkleG1tMAorCWFkZAlcJDE2LAklcjkKKwlhZGQJJXIxMCwJJXIxMQorCWptcAkuTGRlY19lbnRyeQorCisuYWxpZ24gMTYKKy5MZGVjX2xvb3A6CisjIworIyMgIEludmVyc2UgbWl4IGNvbHVtbnMKKyMjCisJbW92ZHFhICAtMHgyMCglcjEwKSwleG1tNAkjIDQgOiBzYjl1CisJbW92ZHFhICAtMHgxMCglcjEwKSwleG1tMQkjIDAgOiBzYjl0CisJcHNodWZiCSV4bW0yLAkleG1tNAkJIyA0ID0gc2I5dQorCXBzaHVmYgkleG1tMywJJXhtbTEJCSMgMCA9IHNiOXQKKwlweG9yCSV4bW00LAkleG1tMAorCW1vdmRxYSAgMHgwMCglcjEwKSwleG1tNAkjIDQgOiBzYmR1CisJcHhvcgkleG1tMSwJJXhtbTAJCSMgMCA9IGNoCisJbW92ZHFhICAweDEwKCVyMTApLCV4bW0xCSMgMCA6IHNiZHQKKworCXBzaHVmYgkleG1tMiwJJXhtbTQJCSMgNCA9IHNiZHUKKwlwc2h1ZmIJJXhtbTUsCSV4bW0wCQkjIE1DIGNoCisJcHNodWZiCSV4bW0zLAkleG1tMQkJIyAwID0gc2JkdAorCXB4b3IJJXhtbTQsCSV4bW0wCQkjIDQgPSBjaAorCW1vdmRxYSAgMHgyMCglcjEwKSwleG1tNAkjIDQgOiBzYmJ1CisJcHhvcgkleG1tMSwJJXhtbTAJCSMgMCA9IGNoCisJbW92ZHFhICAweDMwKCVyMTApLCV4bW0xCSMgMCA6IHNiYnQKKworCXBzaHVmYgkleG1tMiwJJXhtbTQJCSMgNCA9IHNiYnUKKwlwc2h1ZmIJJXhtbTUsCSV4bW0wCQkjIE1DIGNoCisJcHNodWZiCSV4bW0zLAkleG1tMQkJIyAwID0gc2JidAorCXB4b3IJJXhtbTQsCSV4bW0wCQkjIDQgPSBjaAorCW1vdmRxYSAgMHg0MCglcjEwKSwleG1tNAkjIDQgOiBzYmV1CisJcHhvcgkleG1tMSwJJXhtbTAJCSMgMCA9IGNoCisJbW92ZHFhICAweDUwKCVyMTApLCV4bW0xCSMgMCA6IHNiZXQKKworCXBzaHVmYgkleG1tMiwJJXhtbTQJCSMgNCA9IHNiZXUKKwlwc2h1ZmIJJXhtbTUsCSV4bW0wCQkjIE1DIGNoCisJcHNodWZiCSV4bW0zLAkleG1tMQkJIyAwID0gc2JldAorCXB4b3IJJXhtbTQsCSV4bW0wCQkjIDQgPSBjaAorCWFkZAlcJDE2LCAlcjkJCSMgbmV4dCByb3VuZCBrZXkKKwlwYWxpZ25yCVwkMTIsCSV4bW01LAkleG1tNQorCXB4b3IJJXhtbTEsCSV4bW0wCQkjIDAgPSBjaAorCXN1YglcJDEsJXJheAkJIyBuci0tCisKKy5MZGVjX2VudHJ5OgorCSMgdG9wIG9mIHJvdW5kCisJbW92ZHFhICAleG1tOSwgCSV4bW0xCSMgMSA6IGkKKwlwYW5kbgkleG1tMCwgCSV4bW0xCSMgMSA9IGk8PDQKKwltb3ZkcWEJJXhtbTExLCAleG1tMgkjIDIgOiBhL2sKKwlwc3JsZAlcJDQsICAgICV4bW0xCSMgMSA9IGkKKwlwYW5kCSV4bW05LCAJJXhtbTAJIyAwID0gaworCXBzaHVmYiAgJXhtbTAsICAleG1tMgkjIDIgPSBhL2sKKwltb3ZkcWEJJXhtbTEwLAkleG1tMwkjIDMgOiAxL2kKKwlweG9yCSV4bW0xLAkleG1tMAkjIDAgPSBqCisJcHNodWZiICAleG1tMSwgCSV4bW0zCSMgMyA9IDEvaQorCW1vdmRxYQkleG1tMTAsCSV4bW00CSMgNCA6IDEvagorCXB4b3IJJXhtbTIsIAkleG1tMwkjIDMgPSBpYWsgPSAxL2kgKyBhL2sKKwlwc2h1ZmIJJXhtbTAsIAkleG1tNAkjIDQgPSAxL2oKKwlweG9yCSV4bW0yLCAJJXhtbTQJIyA0ID0gamFrID0gMS9qICsgYS9rCisJbW92ZHFhCSV4bW0xMCwJJXhtbTIJIyAyIDogMS9pYWsKKwlwc2h1ZmIgICV4bW0zLAkleG1tMgkjIDIgPSAxL2lhaworCW1vdmRxYQkleG1tMTAsICV4bW0zCSMgMyA6IDEvamFrCisJcHhvcgkleG1tMCwgCSV4bW0yCSMgMiA9IGlvCisJcHNodWZiICAleG1tNCwgICV4bW0zCSMgMyA9IDEvamFrCisJbW92ZHF1CSglcjkpLAkleG1tMAorCXB4b3IJJXhtbTEsICAleG1tMwkjIDMgPSBqbworCWpuegkuTGRlY19sb29wCisKKwkjIG1pZGRsZSBvZiBsYXN0IHJvdW5kCisJbW92ZHFhCTB4NjAoJXIxMCksICV4bW00CSMgMyA6IHNib3UKKwlwc2h1ZmIgICV4bW0yLCAgJXhtbTQJIyA0ID0gc2JvdQorCXB4b3IJJXhtbTAsICAleG1tNAkjIDQgPSBzYjF1ICsgaworCW1vdmRxYQkweDcwKCVyMTApLCAleG1tMAkjIDAgOiBzYm90CisJbW92ZHFhCS0weDE2MCglcjExKSwgJXhtbTIJIyAuTGtfc3ItLkxrX2RzYmQ9LTB4MTYwCisJcHNodWZiICAleG1tMywJJXhtbTAJIyAwID0gc2IxdAorCXB4b3IJJXhtbTQsCSV4bW0wCSMgMCA9IEEKKwlwc2h1ZmIJJXhtbTIsCSV4bW0wCisJcmV0Cisuc2l6ZQlfdnBhZXNfZGVjcnlwdF9jb3JlLC4tX3ZwYWVzX2RlY3J5cHRfY29yZQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMKKyMjICAgICAgICAgICAgICAgICAgQUVTIGtleSBzY2hlZHVsZSAgICAgICAgICAgICAgICAgICMjCisjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy50eXBlCV92cGFlc19zY2hlZHVsZV9jb3JlLFxAYWJpLW9tbmlwb3RlbnQKKy5hbGlnbgkxNgorX3ZwYWVzX3NjaGVkdWxlX2NvcmU6CisJIyByZGkgPSBrZXkKKwkjIHJzaSA9IHNpemUgaW4gYml0cworCSMgcmR4ID0gYnVmZmVyCisJIyByY3ggPSBkaXJlY3Rpb24uICAwPWVuY3J5cHQsIDE9ZGVjcnlwdAorCisJY2FsbAlfdnBhZXNfcHJlaGVhdAkJIyBsb2FkIHRoZSB0YWJsZXMKKwltb3ZkcWEJLkxrX3Jjb24oJXJpcCksICV4bW04CSMgbG9hZCByY29uCisJbW92ZHF1CSglcmRpKSwJJXhtbTAJCSMgbG9hZCBrZXkgKHVuYWxpZ25lZCkKKworCSMgaW5wdXQgdHJhbnNmb3JtCisJbW92ZHFhCSV4bW0wLAkleG1tMworCWxlYQkuTGtfaXB0KCVyaXApLCAlcjExCisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfdHJhbnNmb3JtCisJbW92ZHFhCSV4bW0wLAkleG1tNworCisJbGVhCS5Ma19zciglcmlwKSwlcjEwCisJdGVzdAklcmN4LAklcmN4CisJam56CS5Mc2NoZWR1bGVfYW1fZGVjcnlwdGluZworCisJIyBlbmNyeXB0aW5nLCBvdXRwdXQgemVyb3RoIHJvdW5kIGtleSBhZnRlciB0cmFuc2Zvcm0KKwltb3ZkcXUJJXhtbTAsCSglcmR4KQorCWptcAkuTHNjaGVkdWxlX2dvCisKKy5Mc2NoZWR1bGVfYW1fZGVjcnlwdGluZzoKKwkjIGRlY3J5cHRpbmcsIG91dHB1dCB6ZXJvdGggcm91bmQga2V5IGFmdGVyIHNoaWZ0cm93cworCW1vdmRxYQkoJXI4LCVyMTApLCV4bW0xCisJcHNodWZiICAleG1tMSwJJXhtbTMKKwltb3ZkcXUJJXhtbTMsCSglcmR4KQorCXhvcglcJDB4MzAsICVyOAorCisuTHNjaGVkdWxlX2dvOgorCWNtcAlcJDE5MiwJJWVzaQorCWphCS5Mc2NoZWR1bGVfMjU2CisJamUJLkxzY2hlZHVsZV8xOTIKKwkjIDEyODogZmFsbCB0aG91Z2gKKworIyMKKyMjICAuc2NoZWR1bGVfMTI4CisjIworIyMgIDEyOC1iaXQgc3BlY2lmaWMgcGFydCBvZiBrZXkgc2NoZWR1bGUuCisjIworIyMgIFRoaXMgc2NoZWR1bGUgaXMgcmVhbGx5IHNpbXBsZSwgYmVjYXVzZSBhbGwgaXRzIHBhcnRzCisjIyAgYXJlIGFjY29tcGxpc2hlZCBieSB0aGUgc3Vicm91dGluZXMuCisjIworLkxzY2hlZHVsZV8xMjg6CisJbW92CVwkMTAsICVlc2kKKwkKKy5Mb29wX3NjaGVkdWxlXzEyODoKKwljYWxsIAlfdnBhZXNfc2NoZWR1bGVfcm91bmQKKwlkZWMJJXJzaQorCWp6IAkuTHNjaGVkdWxlX21hbmdsZV9sYXN0CisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfbWFuZ2xlCSMgd3JpdGUgb3V0cHV0CisJam1wIAkuTG9vcF9zY2hlZHVsZV8xMjgKKworIyMKKyMjICAuYWVzX3NjaGVkdWxlXzE5MgorIyMKKyMjICAxOTItYml0IHNwZWNpZmljIHBhcnQgb2Yga2V5IHNjaGVkdWxlLgorIyMKKyMjICBUaGUgbWFpbiBib2R5IG9mIHRoaXMgc2NoZWR1bGUgaXMgdGhlIHNhbWUgYXMgdGhlIDEyOC1iaXQKKyMjICBzY2hlZHVsZSwgYnV0IHdpdGggbW9yZSBzbWVhcmluZy4gIFRoZSBsb25nLCBoaWdoIHNpZGUgaXMKKyMjICBzdG9yZWQgaW4gJXhtbTcgYXMgYmVmb3JlLCBhbmQgdGhlIHNob3J0LCBsb3cgc2lkZSBpcyBpbgorIyMgIHRoZSBoaWdoIGJpdHMgb2YgJXhtbTYuCisjIworIyMgIFRoaXMgc2NoZWR1bGUgaXMgc29tZXdoYXQgbmFzdGllciwgaG93ZXZlciwgYmVjYXVzZSBlYWNoCisjIyAgcm91bmQgcHJvZHVjZXMgMTkyIGJpdHMgb2Yga2V5IG1hdGVyaWFsLCBvciAxLjUgcm91bmQga2V5cy4KKyMjICBUaGVyZWZvcmUsIG9uIGVhY2ggY3ljbGUgd2UgZG8gMiByb3VuZHMgYW5kIHByb2R1Y2UgMyByb3VuZAorIyMgIGtleXMuCisjIworLmFsaWduCTE2CisuTHNjaGVkdWxlXzE5MjoKKwltb3ZkcXUJOCglcmRpKSwleG1tMAkJIyBsb2FkIGtleSBwYXJ0IDIgKHZlcnkgdW5hbGlnbmVkKQorCWNhbGwJX3ZwYWVzX3NjaGVkdWxlX3RyYW5zZm9ybQkjIGlucHV0IHRyYW5zZm9ybQorCW1vdmRxYQkleG1tMCwJJXhtbTYJCSMgc2F2ZSBzaG9ydCBwYXJ0CisJcHhvcgkleG1tNCwJJXhtbTQJCSMgY2xlYXIgNAorCW1vdmhscHMJJXhtbTQsCSV4bW02CQkjIGNsb2JiZXIgbG93IHNpZGUgd2l0aCB6ZXJvcworCW1vdglcJDQsCSVlc2kKKworLkxvb3Bfc2NoZWR1bGVfMTkyOgorCWNhbGwJX3ZwYWVzX3NjaGVkdWxlX3JvdW5kCisJcGFsaWducglcJDgsJXhtbTYsJXhtbTAJCisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfbWFuZ2xlCSMgc2F2ZSBrZXkgbgorCWNhbGwJX3ZwYWVzX3NjaGVkdWxlXzE5Ml9zbWVhcgorCWNhbGwJX3ZwYWVzX3NjaGVkdWxlX21hbmdsZQkjIHNhdmUga2V5IG4rMQorCWNhbGwJX3ZwYWVzX3NjaGVkdWxlX3JvdW5kCisJZGVjCSVyc2kKKwlqeiAJLkxzY2hlZHVsZV9tYW5nbGVfbGFzdAorCWNhbGwJX3ZwYWVzX3NjaGVkdWxlX21hbmdsZQkjIHNhdmUga2V5IG4rMgorCWNhbGwJX3ZwYWVzX3NjaGVkdWxlXzE5Ml9zbWVhcgorCWptcAkuTG9vcF9zY2hlZHVsZV8xOTIKKworIyMKKyMjICAuYWVzX3NjaGVkdWxlXzI1NgorIyMKKyMjICAyNTYtYml0IHNwZWNpZmljIHBhcnQgb2Yga2V5IHNjaGVkdWxlLgorIyMKKyMjICBUaGUgc3RydWN0dXJlIGhlcmUgaXMgdmVyeSBzaW1pbGFyIHRvIHRoZSAxMjgtYml0CisjIyAgc2NoZWR1bGUsIGJ1dCB3aXRoIGFuIGFkZGl0aW9uYWwgImxvdyBzaWRlIiBpbgorIyMgICV4bW02LiAgVGhlIGxvdyBzaWRlJ3Mgcm91bmRzIGFyZSB0aGUgc2FtZSBhcyB0aGUKKyMjICBoaWdoIHNpZGUncywgZXhjZXB0IG5vIHJjb24gYW5kIG5vIHJvdGF0aW9uLgorIyMKKy5hbGlnbgkxNgorLkxzY2hlZHVsZV8yNTY6CisJbW92ZHF1CTE2KCVyZGkpLCV4bW0wCQkjIGxvYWQga2V5IHBhcnQgMiAodW5hbGlnbmVkKQorCWNhbGwJX3ZwYWVzX3NjaGVkdWxlX3RyYW5zZm9ybQkjIGlucHV0IHRyYW5zZm9ybQorCW1vdglcJDcsICVlc2kKKwkKKy5Mb29wX3NjaGVkdWxlXzI1NjoKKwljYWxsCV92cGFlc19zY2hlZHVsZV9tYW5nbGUJIyBvdXRwdXQgbG93IHJlc3VsdAorCW1vdmRxYQkleG1tMCwJJXhtbTYJCSMgc2F2ZSBjdXJfbG8gaW4geG1tNgorCisJIyBoaWdoIHJvdW5kCisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfcm91bmQKKwlkZWMJJXJzaQorCWp6IAkuTHNjaGVkdWxlX21hbmdsZV9sYXN0CisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfbWFuZ2xlCQorCisJIyBsb3cgcm91bmQuIHN3YXAgeG1tNyBhbmQgeG1tNgorCXBzaHVmZAlcJDB4RkYsCSV4bW0wLAkleG1tMAorCW1vdmRxYQkleG1tNywJJXhtbTUKKwltb3ZkcWEJJXhtbTYsCSV4bW03CisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfbG93X3JvdW5kCisJbW92ZHFhCSV4bW01LAkleG1tNworCQorCWptcAkuTG9vcF9zY2hlZHVsZV8yNTYKKworCQorIyMKKyMjICAuYWVzX3NjaGVkdWxlX21hbmdsZV9sYXN0CisjIworIyMgIE1hbmdsZXIgZm9yIGxhc3Qgcm91bmQgb2Yga2V5IHNjaGVkdWxlCisjIyAgTWFuZ2xlcyAleG1tMAorIyMgICAgd2hlbiBlbmNyeXB0aW5nLCBvdXRwdXRzIG91dCgleG1tMCkgXiA2MworIyMgICAgd2hlbiBkZWNyeXB0aW5nLCBvdXRwdXRzIHVuc2tldygleG1tMCkKKyMjCisjIyAgQWx3YXlzIGNhbGxlZCByaWdodCBiZWZvcmUgcmV0dXJuLi4uIGp1bXBzIHRvIGNsZWFudXAgYW5kIGV4aXRzCisjIworLmFsaWduCTE2CisuTHNjaGVkdWxlX21hbmdsZV9sYXN0OgorCSMgc2NoZWR1bGUgbGFzdCByb3VuZCBrZXkgZnJvbSB4bW0wCisJbGVhCS5Ma19kZXNrZXcoJXJpcCksJXIxMQkjIHByZXBhcmUgdG8gZGVza2V3CisJdGVzdAklcmN4LCAJJXJjeAorCWpuegkuTHNjaGVkdWxlX21hbmdsZV9sYXN0X2RlYworCisJIyBlbmNyeXB0aW5nCisJbW92ZHFhCSglcjgsJXIxMCksJXhtbTEKKwlwc2h1ZmIJJXhtbTEsCSV4bW0wCQkjIG91dHB1dCBwZXJtdXRlCisJbGVhCS5Ma19vcHQoJXJpcCksCSVyMTEJIyBwcmVwYXJlIHRvIG91dHB1dCB0cmFuc2Zvcm0KKwlhZGQJXCQzMiwJJXJkeAorCisuTHNjaGVkdWxlX21hbmdsZV9sYXN0X2RlYzoKKwlhZGQJXCQtMTYsCSVyZHgKKwlweG9yCS5Ma19zNjMoJXJpcCksCSV4bW0wCisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfdHJhbnNmb3JtICMgb3V0cHV0IHRyYW5zZm9ybQorCW1vdmRxdQkleG1tMCwJKCVyZHgpCQkjIHNhdmUgbGFzdCBrZXkKKworCSMgY2xlYW51cAorCXB4b3IJJXhtbTAsICAleG1tMAorCXB4b3IJJXhtbTEsICAleG1tMQorCXB4b3IJJXhtbTIsICAleG1tMgorCXB4b3IJJXhtbTMsICAleG1tMworCXB4b3IJJXhtbTQsICAleG1tNAorCXB4b3IJJXhtbTUsICAleG1tNQorCXB4b3IJJXhtbTYsICAleG1tNgorCXB4b3IJJXhtbTcsICAleG1tNworCXJldAorLnNpemUJX3ZwYWVzX3NjaGVkdWxlX2NvcmUsLi1fdnBhZXNfc2NoZWR1bGVfY29yZQorCisjIworIyMgIC5hZXNfc2NoZWR1bGVfMTkyX3NtZWFyCisjIworIyMgIFNtZWFyIHRoZSBzaG9ydCwgbG93IHNpZGUgaW4gdGhlIDE5Mi1iaXQga2V5IHNjaGVkdWxlLgorIyMKKyMjICBJbnB1dHM6CisjIyAgICAleG1tNzogaGlnaCBzaWRlLCBiICBhICB4ICB5CisjIyAgICAleG1tNjogIGxvdyBzaWRlLCBkICBjICAwICAwCisjIyAgICAleG1tMTM6IDAKKyMjCisjIyAgT3V0cHV0czoKKyMjICAgICV4bW02OiBiK2MrZCAgYitjICAwICAwCisjIyAgICAleG1tMDogYitjK2QgIGIrYyAgYiAgYQorIyMKKy50eXBlCV92cGFlc19zY2hlZHVsZV8xOTJfc21lYXIsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2CitfdnBhZXNfc2NoZWR1bGVfMTkyX3NtZWFyOgorCXBzaHVmZAlcJDB4ODAsCSV4bW02LAkleG1tMQkjIGQgYyAwIDAgLT4gYyAwIDAgMAorCXBzaHVmZAlcJDB4RkUsCSV4bW03LAkleG1tMAkjIGIgYSBfIF8gLT4gYiBiIGIgYQorCXB4b3IJJXhtbTEsCSV4bW02CQkjIC0+IGMrZCBjIDAgMAorCXB4b3IJJXhtbTEsCSV4bW0xCisJcHhvcgkleG1tMCwJJXhtbTYJCSMgLT4gYitjK2QgYitjIGIgYQorCW1vdmRxYQkleG1tNiwJJXhtbTAKKwltb3ZobHBzCSV4bW0xLAkleG1tNgkJIyBjbG9iYmVyIGxvdyBzaWRlIHdpdGggemVyb3MKKwlyZXQKKy5zaXplCV92cGFlc19zY2hlZHVsZV8xOTJfc21lYXIsLi1fdnBhZXNfc2NoZWR1bGVfMTkyX3NtZWFyCisKKyMjCisjIyAgLmFlc19zY2hlZHVsZV9yb3VuZAorIyMKKyMjICBSdW5zIG9uZSBtYWluIHJvdW5kIG9mIHRoZSBrZXkgc2NoZWR1bGUgb24gJXhtbTAsICV4bW03CisjIworIyMgIFNwZWNpZmljYWxseSwgcnVucyBzdWJieXRlcyBvbiB0aGUgaGlnaCBkd29yZCBvZiAleG1tMAorIyMgIHRoZW4gcm90YXRlcyBpdCBieSBvbmUgYnl0ZSBhbmQgeG9ycyBpbnRvIHRoZSBsb3cgZHdvcmQgb2YKKyMjICAleG1tNy4KKyMjCisjIyAgQWRkcyByY29uIGZyb20gbG93IGJ5dGUgb2YgJXhtbTgsIHRoZW4gcm90YXRlcyAleG1tOCBmb3IKKyMjICBuZXh0IHJjb24uCisjIworIyMgIFNtZWFycyB0aGUgZHdvcmRzIG9mICV4bW03IGJ5IHhvcmluZyB0aGUgbG93IGludG8gdGhlCisjIyAgc2Vjb25kIGxvdywgcmVzdWx0IGludG8gdGhpcmQsIHJlc3VsdCBpbnRvIGhpZ2hlc3QuCisjIworIyMgIFJldHVybnMgcmVzdWx0cyBpbiAleG1tNyA9ICV4bW0wLgorIyMgIENsb2JiZXJzICV4bW0xLSV4bW00LCAlcjExLgorIyMKKy50eXBlCV92cGFlc19zY2hlZHVsZV9yb3VuZCxcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMTYKK192cGFlc19zY2hlZHVsZV9yb3VuZDoKKwkjIGV4dHJhY3QgcmNvbiBmcm9tIHhtbTgKKwlweG9yCSV4bW0xLAkleG1tMQorCXBhbGlnbnIJXCQxNSwJJXhtbTgsCSV4bW0xCisJcGFsaWducglcJDE1LAkleG1tOCwJJXhtbTgKKwlweG9yCSV4bW0xLAkleG1tNworCisJIyByb3RhdGUKKwlwc2h1ZmQJXCQweEZGLAkleG1tMCwJJXhtbTAKKwlwYWxpZ25yCVwkMSwJJXhtbTAsCSV4bW0wCisJCisJIyBmYWxsIHRocm91Z2guLi4KKwkKKwkjIGxvdyByb3VuZDogc2FtZSBhcyBoaWdoIHJvdW5kLCBidXQgbm8gcm90YXRpb24gYW5kIG5vIHJjb24uCitfdnBhZXNfc2NoZWR1bGVfbG93X3JvdW5kOgorCSMgc21lYXIgeG1tNworCW1vdmRxYQkleG1tNywJJXhtbTEKKwlwc2xsZHEJXCQ0LAkleG1tNworCXB4b3IJJXhtbTEsCSV4bW03CisJbW92ZHFhCSV4bW03LAkleG1tMQorCXBzbGxkcQlcJDgsCSV4bW03CisJcHhvcgkleG1tMSwJJXhtbTcKKwlweG9yCS5Ma19zNjMoJXJpcCksICV4bW03CisKKwkjIHN1YmJ5dGVzCisJbW92ZHFhICAleG1tOSwgCSV4bW0xCisJcGFuZG4JJXhtbTAsIAkleG1tMQorCXBzcmxkCVwkNCwgICAgJXhtbTEJCSMgMSA9IGkKKwlwYW5kCSV4bW05LCAJJXhtbTAJCSMgMCA9IGsKKwltb3ZkcWEJJXhtbTExLCAleG1tMgkJIyAyIDogYS9rCisJcHNodWZiICAleG1tMCwgICV4bW0yCQkjIDIgPSBhL2sKKwlweG9yCSV4bW0xLAkleG1tMAkJIyAwID0gagorCW1vdmRxYQkleG1tMTAsCSV4bW0zCQkjIDMgOiAxL2kKKwlwc2h1ZmIgICV4bW0xLCAJJXhtbTMJCSMgMyA9IDEvaQorCXB4b3IJJXhtbTIsIAkleG1tMwkJIyAzID0gaWFrID0gMS9pICsgYS9rCisJbW92ZHFhCSV4bW0xMCwJJXhtbTQJCSMgNCA6IDEvagorCXBzaHVmYgkleG1tMCwgCSV4bW00CQkjIDQgPSAxL2oKKwlweG9yCSV4bW0yLCAJJXhtbTQJCSMgNCA9IGphayA9IDEvaiArIGEvaworCW1vdmRxYQkleG1tMTAsCSV4bW0yCQkjIDIgOiAxL2lhaworCXBzaHVmYiAgJXhtbTMsCSV4bW0yCQkjIDIgPSAxL2lhaworCXB4b3IJJXhtbTAsIAkleG1tMgkJIyAyID0gaW8KKwltb3ZkcWEJJXhtbTEwLCAleG1tMwkJIyAzIDogMS9qYWsKKwlwc2h1ZmIgICV4bW00LCAgJXhtbTMJCSMgMyA9IDEvamFrCisJcHhvcgkleG1tMSwgICV4bW0zCQkjIDMgPSBqbworCW1vdmRxYQkleG1tMTMsICV4bW00CQkjIDQgOiBzYm91CisJcHNodWZiICAleG1tMiwgICV4bW00CQkjIDQgPSBzYm91CisJbW92ZHFhCSV4bW0xMiwgJXhtbTAJCSMgMCA6IHNib3QKKwlwc2h1ZmIgICV4bW0zLAkleG1tMAkJIyAwID0gc2IxdAorCXB4b3IJJXhtbTQsIAkleG1tMAkJIyAwID0gc2JveCBvdXRwdXQKKworCSMgYWRkIGluIHNtZWFyZWQgc3R1ZmYKKwlweG9yCSV4bW03LAkleG1tMAkKKwltb3ZkcWEJJXhtbTAsCSV4bW03CisJcmV0Cisuc2l6ZQlfdnBhZXNfc2NoZWR1bGVfcm91bmQsLi1fdnBhZXNfc2NoZWR1bGVfcm91bmQKKworIyMKKyMjICAuYWVzX3NjaGVkdWxlX3RyYW5zZm9ybQorIyMKKyMjICBMaW5lYXItdHJhbnNmb3JtICV4bW0wIGFjY29yZGluZyB0byB0YWJsZXMgYXQgKCVyMTEpCisjIworIyMgIFJlcXVpcmVzIHRoYXQgJXhtbTkgPSAweDBGMEYuLi4gYXMgaW4gcHJlaGVhdAorIyMgIE91dHB1dCBpbiAleG1tMAorIyMgIENsb2JiZXJzICV4bW0xLCAleG1tMgorIyMKKy50eXBlCV92cGFlc19zY2hlZHVsZV90cmFuc2Zvcm0sXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2CitfdnBhZXNfc2NoZWR1bGVfdHJhbnNmb3JtOgorCW1vdmRxYQkleG1tOSwJJXhtbTEKKwlwYW5kbgkleG1tMCwJJXhtbTEKKwlwc3JsZAlcJDQsCSV4bW0xCisJcGFuZAkleG1tOSwJJXhtbTAKKwltb3ZkcWEJKCVyMTEpLCAleG1tMiAJIyBsbworCXBzaHVmYgkleG1tMCwJJXhtbTIKKwltb3ZkcWEJMTYoJXIxMSksICV4bW0wICMgaGkKKwlwc2h1ZmIJJXhtbTEsCSV4bW0wCisJcHhvcgkleG1tMiwJJXhtbTAKKwlyZXQKKy5zaXplCV92cGFlc19zY2hlZHVsZV90cmFuc2Zvcm0sLi1fdnBhZXNfc2NoZWR1bGVfdHJhbnNmb3JtCisKKyMjCisjIyAgLmFlc19zY2hlZHVsZV9tYW5nbGUKKyMjCisjIyAgTWFuZ2xlIHhtbTAgZnJvbSAoYmFzaXMtdHJhbnNmb3JtZWQpIHN0YW5kYXJkIHZlcnNpb24KKyMjICB0byBvdXIgdmVyc2lvbi4KKyMjCisjIyAgT24gZW5jcnlwdCwKKyMjICAgIHhvciB3aXRoIDB4NjMKKyMjICAgIG11bHRpcGx5IGJ5IGNpcmN1bGFudCAwLDEsMSwxCisjIyAgICBhcHBseSBzaGlmdHJvd3MgdHJhbnNmb3JtCisjIworIyMgIE9uIGRlY3J5cHQsCisjIyAgICB4b3Igd2l0aCAweDYzCisjIyAgICBtdWx0aXBseSBieSAiaW52ZXJzZSBtaXhjb2x1bW5zIiBjaXJjdWxhbnQgRSxCLEQsOQorIyMgICAgZGVza2V3CisjIyAgICBhcHBseSBzaGlmdHJvd3MgdHJhbnNmb3JtCisjIworIyMKKyMjICBXcml0ZXMgb3V0IHRvICglcmR4KSwgYW5kIGluY3JlbWVudHMgb3IgZGVjcmVtZW50cyBpdAorIyMgIEtlZXBzIHRyYWNrIG9mIHJvdW5kIG51bWJlciBtb2QgNCBpbiAlcjgKKyMjICBQcmVzZXJ2ZXMgeG1tMAorIyMgIENsb2JiZXJzIHhtbTEteG1tNQorIyMKKy50eXBlCV92cGFlc19zY2hlZHVsZV9tYW5nbGUsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2CitfdnBhZXNfc2NoZWR1bGVfbWFuZ2xlOgorCW1vdmRxYQkleG1tMCwJJXhtbTQJIyBzYXZlIHhtbTAgZm9yIGxhdGVyCisJbW92ZHFhCS5Ma19tY19mb3J3YXJkKCVyaXApLCV4bW01CisJdGVzdAklcmN4LCAJJXJjeAorCWpuegkuTHNjaGVkdWxlX21hbmdsZV9kZWMKKworCSMgZW5jcnlwdGluZworCWFkZAlcJDE2LAklcmR4CisJcHhvcgkuTGtfczYzKCVyaXApLCV4bW00CisJcHNodWZiCSV4bW01LAkleG1tNAorCW1vdmRxYQkleG1tNCwJJXhtbTMKKwlwc2h1ZmIJJXhtbTUsCSV4bW00CisJcHhvcgkleG1tNCwJJXhtbTMKKwlwc2h1ZmIJJXhtbTUsCSV4bW00CisJcHhvcgkleG1tNCwJJXhtbTMKKworCWptcAkuTHNjaGVkdWxlX21hbmdsZV9ib3RoCisuYWxpZ24JMTYKKy5Mc2NoZWR1bGVfbWFuZ2xlX2RlYzoKKwkjIGludmVyc2UgbWl4IGNvbHVtbnMKKwlsZWEJLkxrX2Rrc2QoJXJpcCksJXIxMQorCW1vdmRxYQkleG1tOSwJJXhtbTEKKwlwYW5kbgkleG1tNCwJJXhtbTEKKwlwc3JsZAlcJDQsCSV4bW0xCSMgMSA9IGhpCisJcGFuZAkleG1tOSwJJXhtbTQJIyA0ID0gbG8KKworCW1vdmRxYQkweDAwKCVyMTEpLCAleG1tMgorCXBzaHVmYgkleG1tNCwJJXhtbTIKKwltb3ZkcWEJMHgxMCglcjExKSwgJXhtbTMKKwlwc2h1ZmIJJXhtbTEsCSV4bW0zCisJcHhvcgkleG1tMiwJJXhtbTMKKwlwc2h1ZmIJJXhtbTUsCSV4bW0zCisKKwltb3ZkcWEJMHgyMCglcjExKSwgJXhtbTIKKwlwc2h1ZmIJJXhtbTQsCSV4bW0yCisJcHhvcgkleG1tMywJJXhtbTIKKwltb3ZkcWEJMHgzMCglcjExKSwgJXhtbTMKKwlwc2h1ZmIJJXhtbTEsCSV4bW0zCisJcHhvcgkleG1tMiwJJXhtbTMKKwlwc2h1ZmIJJXhtbTUsCSV4bW0zCisKKwltb3ZkcWEJMHg0MCglcjExKSwgJXhtbTIKKwlwc2h1ZmIJJXhtbTQsCSV4bW0yCisJcHhvcgkleG1tMywJJXhtbTIKKwltb3ZkcWEJMHg1MCglcjExKSwgJXhtbTMKKwlwc2h1ZmIJJXhtbTEsCSV4bW0zCisJcHhvcgkleG1tMiwJJXhtbTMKKwlwc2h1ZmIJJXhtbTUsCSV4bW0zCisKKwltb3ZkcWEJMHg2MCglcjExKSwgJXhtbTIKKwlwc2h1ZmIJJXhtbTQsCSV4bW0yCisJcHhvcgkleG1tMywJJXhtbTIKKwltb3ZkcWEJMHg3MCglcjExKSwgJXhtbTMKKwlwc2h1ZmIJJXhtbTEsCSV4bW0zCisJcHhvcgkleG1tMiwJJXhtbTMKKworCWFkZAlcJC0xNiwJJXJkeAorCisuTHNjaGVkdWxlX21hbmdsZV9ib3RoOgorCW1vdmRxYQkoJXI4LCVyMTApLCV4bW0xCisJcHNodWZiCSV4bW0xLCV4bW0zCisJYWRkCVwkLTE2LAklcjgKKwlhbmQJXCQweDMwLAklcjgKKwltb3ZkcXUJJXhtbTMsCSglcmR4KQorCXJldAorLnNpemUJX3ZwYWVzX3NjaGVkdWxlX21hbmdsZSwuLV92cGFlc19zY2hlZHVsZV9tYW5nbGUKKworIworIyBJbnRlcmZhY2UgdG8gT3BlblNTTAorIworLmdsb2JsCSR7UFJFRklYfV9zZXRfZW5jcnlwdF9rZXkKKy50eXBlCSR7UFJFRklYfV9zZXRfZW5jcnlwdF9rZXksXEBmdW5jdGlvbiwzCisuYWxpZ24JMTYKKyR7UFJFRklYfV9zZXRfZW5jcnlwdF9rZXk6CitfX18KKyRjb2RlLj08PF9fXyBpZiAoJHdpbjY0KTsKKwlsZWEJLTB4YjgoJXJzcCksJXJzcAorCW1vdmFwcwkleG1tNiwweDEwKCVyc3ApCisJbW92YXBzCSV4bW03LDB4MjAoJXJzcCkKKwltb3ZhcHMJJXhtbTgsMHgzMCglcnNwKQorCW1vdmFwcwkleG1tOSwweDQwKCVyc3ApCisJbW92YXBzCSV4bW0xMCwweDUwKCVyc3ApCisJbW92YXBzCSV4bW0xMSwweDYwKCVyc3ApCisJbW92YXBzCSV4bW0xMiwweDcwKCVyc3ApCisJbW92YXBzCSV4bW0xMywweDgwKCVyc3ApCisJbW92YXBzCSV4bW0xNCwweDkwKCVyc3ApCisJbW92YXBzCSV4bW0xNSwweGEwKCVyc3ApCisuTGVuY19rZXlfYm9keToKK19fXworJGNvZGUuPTw8X19fOworCW1vdgklZXNpLCVlYXgKKwlzaHIJXCQ1LCVlYXgKKwlhZGQJXCQ1LCVlYXgKKwltb3YJJWVheCwyNDAoJXJkeCkJIyBBRVNfS0VZLT5yb3VuZHMgPSBuYml0cy8zMis1OworCisJbW92CVwkMCwlZWN4CisJbW92CVwkMHgzMCwlcjhkCisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfY29yZQorX19fCiskY29kZS49PDxfX18gaWYgKCR3aW42NCk7CisJbW92YXBzCTB4MTAoJXJzcCksJXhtbTYKKwltb3ZhcHMJMHgyMCglcnNwKSwleG1tNworCW1vdmFwcwkweDMwKCVyc3ApLCV4bW04CisJbW92YXBzCTB4NDAoJXJzcCksJXhtbTkKKwltb3ZhcHMJMHg1MCglcnNwKSwleG1tMTAKKwltb3ZhcHMJMHg2MCglcnNwKSwleG1tMTEKKwltb3ZhcHMJMHg3MCglcnNwKSwleG1tMTIKKwltb3ZhcHMJMHg4MCglcnNwKSwleG1tMTMKKwltb3ZhcHMJMHg5MCglcnNwKSwleG1tMTQKKwltb3ZhcHMJMHhhMCglcnNwKSwleG1tMTUKKwlsZWEJMHhiOCglcnNwKSwlcnNwCisuTGVuY19rZXlfZXBpbG9ndWU6CitfX18KKyRjb2RlLj08PF9fXzsKKwl4b3IJJWVheCwlZWF4CisJcmV0Cisuc2l6ZQkke1BSRUZJWH1fc2V0X2VuY3J5cHRfa2V5LC4tJHtQUkVGSVh9X3NldF9lbmNyeXB0X2tleQorCisuZ2xvYmwJJHtQUkVGSVh9X3NldF9kZWNyeXB0X2tleQorLnR5cGUJJHtQUkVGSVh9X3NldF9kZWNyeXB0X2tleSxcQGZ1bmN0aW9uLDMKKy5hbGlnbgkxNgorJHtQUkVGSVh9X3NldF9kZWNyeXB0X2tleToKK19fXworJGNvZGUuPTw8X19fIGlmICgkd2luNjQpOworCWxlYQktMHhiOCglcnNwKSwlcnNwCisJbW92YXBzCSV4bW02LDB4MTAoJXJzcCkKKwltb3ZhcHMJJXhtbTcsMHgyMCglcnNwKQorCW1vdmFwcwkleG1tOCwweDMwKCVyc3ApCisJbW92YXBzCSV4bW05LDB4NDAoJXJzcCkKKwltb3ZhcHMJJXhtbTEwLDB4NTAoJXJzcCkKKwltb3ZhcHMJJXhtbTExLDB4NjAoJXJzcCkKKwltb3ZhcHMJJXhtbTEyLDB4NzAoJXJzcCkKKwltb3ZhcHMJJXhtbTEzLDB4ODAoJXJzcCkKKwltb3ZhcHMJJXhtbTE0LDB4OTAoJXJzcCkKKwltb3ZhcHMJJXhtbTE1LDB4YTAoJXJzcCkKKy5MZGVjX2tleV9ib2R5OgorX19fCiskY29kZS49PDxfX187CisJbW92CSVlc2ksJWVheAorCXNocglcJDUsJWVheAorCWFkZAlcJDUsJWVheAorCW1vdgklZWF4LDI0MCglcmR4KQkjIEFFU19LRVktPnJvdW5kcyA9IG5iaXRzLzMyKzU7CisJc2hsCVwkNCwlZWF4CisJbGVhCTE2KCVyZHgsJXJheCksJXJkeAorCisJbW92CVwkMSwlZWN4CisJbW92CSVlc2ksJXI4ZAorCXNocglcJDEsJXI4ZAorCWFuZAlcJDMyLCVyOGQKKwl4b3IJXCQzMiwlcjhkCSMgbmJpdHM9PTE5Mj8wOjMyCisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfY29yZQorX19fCiskY29kZS49PDxfX18gaWYgKCR3aW42NCk7CisJbW92YXBzCTB4MTAoJXJzcCksJXhtbTYKKwltb3ZhcHMJMHgyMCglcnNwKSwleG1tNworCW1vdmFwcwkweDMwKCVyc3ApLCV4bW04CisJbW92YXBzCTB4NDAoJXJzcCksJXhtbTkKKwltb3ZhcHMJMHg1MCglcnNwKSwleG1tMTAKKwltb3ZhcHMJMHg2MCglcnNwKSwleG1tMTEKKwltb3ZhcHMJMHg3MCglcnNwKSwleG1tMTIKKwltb3ZhcHMJMHg4MCglcnNwKSwleG1tMTMKKwltb3ZhcHMJMHg5MCglcnNwKSwleG1tMTQKKwltb3ZhcHMJMHhhMCglcnNwKSwleG1tMTUKKwlsZWEJMHhiOCglcnNwKSwlcnNwCisuTGRlY19rZXlfZXBpbG9ndWU6CitfX18KKyRjb2RlLj08PF9fXzsKKwl4b3IJJWVheCwlZWF4CisJcmV0Cisuc2l6ZQkke1BSRUZJWH1fc2V0X2RlY3J5cHRfa2V5LC4tJHtQUkVGSVh9X3NldF9kZWNyeXB0X2tleQorCisuZ2xvYmwJJHtQUkVGSVh9X2VuY3J5cHQKKy50eXBlCSR7UFJFRklYfV9lbmNyeXB0LFxAZnVuY3Rpb24sMworLmFsaWduCTE2Ciske1BSRUZJWH1fZW5jcnlwdDoKK19fXworJGNvZGUuPTw8X19fIGlmICgkd2luNjQpOworCWxlYQktMHhiOCglcnNwKSwlcnNwCisJbW92YXBzCSV4bW02LDB4MTAoJXJzcCkKKwltb3ZhcHMJJXhtbTcsMHgyMCglcnNwKQorCW1vdmFwcwkleG1tOCwweDMwKCVyc3ApCisJbW92YXBzCSV4bW05LDB4NDAoJXJzcCkKKwltb3ZhcHMJJXhtbTEwLDB4NTAoJXJzcCkKKwltb3ZhcHMJJXhtbTExLDB4NjAoJXJzcCkKKwltb3ZhcHMJJXhtbTEyLDB4NzAoJXJzcCkKKwltb3ZhcHMJJXhtbTEzLDB4ODAoJXJzcCkKKwltb3ZhcHMJJXhtbTE0LDB4OTAoJXJzcCkKKwltb3ZhcHMJJXhtbTE1LDB4YTAoJXJzcCkKKy5MZW5jX2JvZHk6CitfX18KKyRjb2RlLj08PF9fXzsKKwltb3ZkcXUJKCVyZGkpLCV4bW0wCisJY2FsbAlfdnBhZXNfcHJlaGVhdAorCWNhbGwJX3ZwYWVzX2VuY3J5cHRfY29yZQorCW1vdmRxdQkleG1tMCwoJXJzaSkKK19fXworJGNvZGUuPTw8X19fIGlmICgkd2luNjQpOworCW1vdmFwcwkweDEwKCVyc3ApLCV4bW02CisJbW92YXBzCTB4MjAoJXJzcCksJXhtbTcKKwltb3ZhcHMJMHgzMCglcnNwKSwleG1tOAorCW1vdmFwcwkweDQwKCVyc3ApLCV4bW05CisJbW92YXBzCTB4NTAoJXJzcCksJXhtbTEwCisJbW92YXBzCTB4NjAoJXJzcCksJXhtbTExCisJbW92YXBzCTB4NzAoJXJzcCksJXhtbTEyCisJbW92YXBzCTB4ODAoJXJzcCksJXhtbTEzCisJbW92YXBzCTB4OTAoJXJzcCksJXhtbTE0CisJbW92YXBzCTB4YTAoJXJzcCksJXhtbTE1CisJbGVhCTB4YjgoJXJzcCksJXJzcAorLkxlbmNfZXBpbG9ndWU6CitfX18KKyRjb2RlLj08PF9fXzsKKwlyZXQKKy5zaXplCSR7UFJFRklYfV9lbmNyeXB0LC4tJHtQUkVGSVh9X2VuY3J5cHQKKworLmdsb2JsCSR7UFJFRklYfV9kZWNyeXB0CisudHlwZQkke1BSRUZJWH1fZGVjcnlwdCxcQGZ1bmN0aW9uLDMKKy5hbGlnbgkxNgorJHtQUkVGSVh9X2RlY3J5cHQ6CitfX18KKyRjb2RlLj08PF9fXyBpZiAoJHdpbjY0KTsKKwlsZWEJLTB4YjgoJXJzcCksJXJzcAorCW1vdmFwcwkleG1tNiwweDEwKCVyc3ApCisJbW92YXBzCSV4bW03LDB4MjAoJXJzcCkKKwltb3ZhcHMJJXhtbTgsMHgzMCglcnNwKQorCW1vdmFwcwkleG1tOSwweDQwKCVyc3ApCisJbW92YXBzCSV4bW0xMCwweDUwKCVyc3ApCisJbW92YXBzCSV4bW0xMSwweDYwKCVyc3ApCisJbW92YXBzCSV4bW0xMiwweDcwKCVyc3ApCisJbW92YXBzCSV4bW0xMywweDgwKCVyc3ApCisJbW92YXBzCSV4bW0xNCwweDkwKCVyc3ApCisJbW92YXBzCSV4bW0xNSwweGEwKCVyc3ApCisuTGRlY19ib2R5OgorX19fCiskY29kZS49PDxfX187CisJbW92ZHF1CSglcmRpKSwleG1tMAorCWNhbGwJX3ZwYWVzX3ByZWhlYXQKKwljYWxsCV92cGFlc19kZWNyeXB0X2NvcmUKKwltb3ZkcXUJJXhtbTAsKCVyc2kpCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJHdpbjY0KTsKKwltb3ZhcHMJMHgxMCglcnNwKSwleG1tNgorCW1vdmFwcwkweDIwKCVyc3ApLCV4bW03CisJbW92YXBzCTB4MzAoJXJzcCksJXhtbTgKKwltb3ZhcHMJMHg0MCglcnNwKSwleG1tOQorCW1vdmFwcwkweDUwKCVyc3ApLCV4bW0xMAorCW1vdmFwcwkweDYwKCVyc3ApLCV4bW0xMQorCW1vdmFwcwkweDcwKCVyc3ApLCV4bW0xMgorCW1vdmFwcwkweDgwKCVyc3ApLCV4bW0xMworCW1vdmFwcwkweDkwKCVyc3ApLCV4bW0xNAorCW1vdmFwcwkweGEwKCVyc3ApLCV4bW0xNQorCWxlYQkweGI4KCVyc3ApLCVyc3AKKy5MZGVjX2VwaWxvZ3VlOgorX19fCiskY29kZS49PDxfX187CisJcmV0Cisuc2l6ZQkke1BSRUZJWH1fZGVjcnlwdCwuLSR7UFJFRklYfV9kZWNyeXB0CitfX18KK3sKK215ICgkaW5wLCRvdXQsJGxlbiwka2V5LCRpdnAsJGVuYyk9KCIlcmRpIiwiJXJzaSIsIiVyZHgiLCIlcmN4IiwiJXI4IiwiJXI5Iik7CisjIHZvaWQgQUVTX2NiY19lbmNyeXB0IChjb25zdCB2b2lkIGNoYXIgKmlucCwgdW5zaWduZWQgY2hhciAqb3V0LAorIyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCwgY29uc3QgQUVTX0tFWSAqa2V5LAorIyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqaXZwLGNvbnN0IGludCBlbmMpOworJGNvZGUuPTw8X19fOworLmdsb2JsCSR7UFJFRklYfV9jYmNfZW5jcnlwdAorLnR5cGUJJHtQUkVGSVh9X2NiY19lbmNyeXB0LFxAZnVuY3Rpb24sNgorLmFsaWduCTE2Ciske1BSRUZJWH1fY2JjX2VuY3J5cHQ6CisJeGNoZwkka2V5LCRsZW4KK19fXworKCRsZW4sJGtleSk9KCRrZXksJGxlbik7CiskY29kZS49PDxfX187CisJc3ViCVwkMTYsJGxlbgorCWpjCS5MY2JjX2Fib3J0CitfX18KKyRjb2RlLj08PF9fXyBpZiAoJHdpbjY0KTsKKwlsZWEJLTB4YjgoJXJzcCksJXJzcAorCW1vdmFwcwkleG1tNiwweDEwKCVyc3ApCisJbW92YXBzCSV4bW03LDB4MjAoJXJzcCkKKwltb3ZhcHMJJXhtbTgsMHgzMCglcnNwKQorCW1vdmFwcwkleG1tOSwweDQwKCVyc3ApCisJbW92YXBzCSV4bW0xMCwweDUwKCVyc3ApCisJbW92YXBzCSV4bW0xMSwweDYwKCVyc3ApCisJbW92YXBzCSV4bW0xMiwweDcwKCVyc3ApCisJbW92YXBzCSV4bW0xMywweDgwKCVyc3ApCisJbW92YXBzCSV4bW0xNCwweDkwKCVyc3ApCisJbW92YXBzCSV4bW0xNSwweGEwKCVyc3ApCisuTGNiY19ib2R5OgorX19fCiskY29kZS49PDxfX187CisJbW92ZHF1CSgkaXZwKSwleG1tNgkJIyBsb2FkIElWCisJc3ViCSRpbnAsJG91dAorCWNhbGwJX3ZwYWVzX3ByZWhlYXQKKwljbXAJXCQwLCR7ZW5jfWQKKwlqZQkuTGNiY19kZWNfbG9vcAorCWptcAkuTGNiY19lbmNfbG9vcAorLmFsaWduCTE2CisuTGNiY19lbmNfbG9vcDoKKwltb3ZkcXUJKCRpbnApLCV4bW0wCisJcHhvcgkleG1tNiwleG1tMAorCWNhbGwJX3ZwYWVzX2VuY3J5cHRfY29yZQorCW1vdmRxYQkleG1tMCwleG1tNgorCW1vdmRxdQkleG1tMCwoJG91dCwkaW5wKQorCWxlYQkxNigkaW5wKSwkaW5wCisJc3ViCVwkMTYsJGxlbgorCWpuYwkuTGNiY19lbmNfbG9vcAorCWptcAkuTGNiY19kb25lCisuYWxpZ24JMTYKKy5MY2JjX2RlY19sb29wOgorCW1vdmRxdQkoJGlucCksJXhtbTAKKwltb3ZkcWEJJXhtbTAsJXhtbTcKKwljYWxsCV92cGFlc19kZWNyeXB0X2NvcmUKKwlweG9yCSV4bW02LCV4bW0wCisJbW92ZHFhCSV4bW03LCV4bW02CisJbW92ZHF1CSV4bW0wLCgkb3V0LCRpbnApCisJbGVhCTE2KCRpbnApLCRpbnAKKwlzdWIJXCQxNiwkbGVuCisJam5jCS5MY2JjX2RlY19sb29wCisuTGNiY19kb25lOgorCW1vdmRxdQkleG1tNiwoJGl2cCkJCSMgc2F2ZSBJVgorX19fCiskY29kZS49PDxfX18gaWYgKCR3aW42NCk7CisJbW92YXBzCTB4MTAoJXJzcCksJXhtbTYKKwltb3ZhcHMJMHgyMCglcnNwKSwleG1tNworCW1vdmFwcwkweDMwKCVyc3ApLCV4bW04CisJbW92YXBzCTB4NDAoJXJzcCksJXhtbTkKKwltb3ZhcHMJMHg1MCglcnNwKSwleG1tMTAKKwltb3ZhcHMJMHg2MCglcnNwKSwleG1tMTEKKwltb3ZhcHMJMHg3MCglcnNwKSwleG1tMTIKKwltb3ZhcHMJMHg4MCglcnNwKSwleG1tMTMKKwltb3ZhcHMJMHg5MCglcnNwKSwleG1tMTQKKwltb3ZhcHMJMHhhMCglcnNwKSwleG1tMTUKKwlsZWEJMHhiOCglcnNwKSwlcnNwCisuTGNiY19lcGlsb2d1ZToKK19fXworJGNvZGUuPTw8X19fOworLkxjYmNfYWJvcnQ6CisJcmV0Cisuc2l6ZQkke1BSRUZJWH1fY2JjX2VuY3J5cHQsLi0ke1BSRUZJWH1fY2JjX2VuY3J5cHQKK19fXworfQorJGNvZGUuPTw8X19fOworIyMKKyMjICBfYWVzX3ByZWhlYXQKKyMjCisjIyAgRmlsbHMgcmVnaXN0ZXIgJXIxMCAtPiAuYWVzX2NvbnN0cyAoc28geW91IGNhbiAtZlBJQykKKyMjICBhbmQgJXhtbTktJXhtbTE1IGFzIHNwZWNpZmllZCBiZWxvdy4KKyMjCisudHlwZQlfdnBhZXNfcHJlaGVhdCxcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMTYKK192cGFlc19wcmVoZWF0OgorCWxlYQkuTGtfczBGKCVyaXApLCAlcjEwCisJbW92ZHFhCS0weDIwKCVyMTApLCAleG1tMTAJIyAuTGtfaW52CisJbW92ZHFhCS0weDEwKCVyMTApLCAleG1tMTEJIyAuTGtfaW52KzE2CisJbW92ZHFhCTB4MDAoJXIxMCksICV4bW05CSMgLkxrX3MwRgorCW1vdmRxYQkweDMwKCVyMTApLCAleG1tMTMJIyAuTGtfc2IxCisJbW92ZHFhCTB4NDAoJXIxMCksICV4bW0xMgkjIC5Ma19zYjErMTYKKwltb3ZkcWEJMHg1MCglcjEwKSwgJXhtbTE1CSMgLkxrX3NiMgorCW1vdmRxYQkweDYwKCVyMTApLCAleG1tMTQJIyAuTGtfc2IyKzE2CisJcmV0Cisuc2l6ZQlfdnBhZXNfcHJlaGVhdCwuLV92cGFlc19wcmVoZWF0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMKKyMjICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzICAgICAgICAgICAgICAgICAgICAgICMjCisjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy50eXBlCV92cGFlc19jb25zdHMsXEBvYmplY3QKKy5hbGlnbgk2NAorX3ZwYWVzX2NvbnN0czoKKy5Ma19pbnY6CSMgaW52LCBpbnZhCisJLnF1YWQJMHgwRTA1MDYwRjBEMDgwMTgwLCAweDA0MDcwMzA5MEEwQjBDMDIKKwkucXVhZAkweDAxMDQwQTA2MEYwQjA3ODAsIDB4MDMwRDBFMEMwMjA1MDgwOQorCisuTGtfczBGOgkjIHMwRgorCS5xdWFkCTB4MEYwRjBGMEYwRjBGMEYwRiwgMHgwRjBGMEYwRjBGMEYwRjBGCisKKy5Ma19pcHQ6CSMgaW5wdXQgdHJhbnNmb3JtIChsbywgaGkpCisJLnF1YWQJMHhDMkIyRTg5ODVBMkE3MDAwLCAweENBQkFFMDkwNTIyMjc4MDgKKwkucXVhZAkweDRDMDEzMDdEMzE3QzREMDAsIDB4Q0Q4MEIxRkNCMEZEQ0M4MQorCisuTGtfc2IxOgkjIHNiMXUsIHNiMXQKKwkucXVhZAkweEIxOUJFMThGQ0I1MDNFMDAsIDB4QTVERjdBNkUxNDJBRjU0NAorCS5xdWFkCTB4MzYxOEQ0MTVGQUUyMjMwMCwgMHgzQkY3Q0NDMTBEMkVEOUVGCisuTGtfc2IyOgkjIHNiMnUsIHNiMnQKKwkucXVhZAkweEUyN0E5M0M2MEI3MTI0MDAsIDB4NUVCN0U5NTVCQzk4MkZDRAorCS5xdWFkCTB4NjlFQjg4NDAwQUUxMjkwMCwgMHhDMkExNjNDOEFCODIyMzRBCisuTGtfc2JvOgkjIHNib3UsIHNib3QKKwkucXVhZAkweEQwRDI2RDE3NkZCREM3MDAsIDB4MTVBQUJGN0FDNTAyQTg3OAorCS5xdWFkCTB4Q0ZFNDc0QTU1RkJCNkEwMCwgMHg4RTFFOTBEMTQxMkIzNUZBCisKKy5Ma19tY19mb3J3YXJkOgkjIG1jX2ZvcndhcmQKKwkucXVhZAkweDA0MDcwNjA1MDAwMzAyMDEsIDB4MEMwRjBFMEQwODBCMEEwOQorCS5xdWFkCTB4MDgwQjBBMDkwNDA3MDYwNSwgMHgwMDAzMDIwMTBDMEYwRTBECisJLnF1YWQJMHgwQzBGMEUwRDA4MEIwQTA5LCAweDA0MDcwNjA1MDAwMzAyMDEKKwkucXVhZAkweDAwMDMwMjAxMEMwRjBFMEQsIDB4MDgwQjBBMDkwNDA3MDYwNQorCisuTGtfbWNfYmFja3dhcmQ6IyBtY19iYWNrd2FyZAorCS5xdWFkCTB4MDYwNTA0MDcwMjAxMDAwMywgMHgwRTBEMEMwRjBBMDkwODBCCisJLnF1YWQJMHgwMjAxMDAwMzBFMEQwQzBGLCAweDBBMDkwODBCMDYwNTA0MDcKKwkucXVhZAkweDBFMEQwQzBGMEEwOTA4MEIsIDB4MDYwNTA0MDcwMjAxMDAwMworCS5xdWFkCTB4MEEwOTA4MEIwNjA1MDQwNywgMHgwMjAxMDAwMzBFMEQwQzBGCisKKy5Ma19zcjoJCSMgc3IKKwkucXVhZAkweDA3MDYwNTA0MDMwMjAxMDAsIDB4MEYwRTBEMEMwQjBBMDkwOAorCS5xdWFkCTB4MDMwRTA5MDQwRjBBMDUwMCwgMHgwQjA2MDEwQzA3MDIwRDA4CisJLnF1YWQJMHgwRjA2MEQwNDBCMDIwOTAwLCAweDA3MEUwNTBDMDMwQTAxMDgKKwkucXVhZAkweDBCMEUwMTA0MDcwQTBEMDAsIDB4MDMwNjA5MEMwRjAyMDUwOAorCisuTGtfcmNvbjoJIyByY29uCisJLnF1YWQJMHgxRjgzOTFCOUFGOURFRUI2LCAweDcwMkE5ODA4NEQ3QzdEODEKKworLkxrX3M2MzoJIyBzNjM6IGFsbCBlcXVhbCB0byAweDYzIHRyYW5zZm9ybWVkCisJLnF1YWQJMHg1QjVCNUI1QjVCNUI1QjVCLCAweDVCNUI1QjVCNUI1QjVCNUIKKworLkxrX29wdDoJIyBvdXRwdXQgdHJhbnNmb3JtCisJLnF1YWQJMHhGRjlGNDkyOUQ2QjY2MDAwLCAweEY3OTc0MTIxREVCRTY4MDgKKwkucXVhZAkweDAxRURCRDUxNTBCQ0VDMDAsIDB4RTEwRDVEQjFCMDVDMENFMAorCisuTGtfZGVza2V3OgkjIGRlc2tldyB0YWJsZXM6IGludmVydHMgdGhlIHNib3gncyAic2tldyIKKwkucXVhZAkweDA3RTRBMzQwNDdBNEUzMDAsIDB4MURGRUI5NUE1REJFRjkxQQorCS5xdWFkCTB4NUYzNkI1REM4M0VBNjkwMCwgMHgyODQxQzJBQkY0OUQxRTc3CisKKyMjCisjIyAgRGVjcnlwdGlvbiBzdHVmZgorIyMgIEtleSBzY2hlZHVsZSBjb25zdGFudHMKKyMjCisuTGtfZGtzZDoJIyBkZWNyeXB0aW9uIGtleSBzY2hlZHVsZTogaW52c2tldyB4KkQKKwkucXVhZAkweEZFQjkxQTVEQTNFNDQ3MDAsIDB4MDc0MEUzQTQ1QTFEQkVGOQorCS5xdWFkCTB4NDFDMjc3RjRCNTM2ODMwMCwgMHg1RkRDNjlFQUFCMjg5RDFFCisuTGtfZGtzYjoJIyBkZWNyeXB0aW9uIGtleSBzY2hlZHVsZTogaW52c2tldyB4KkIKKwkucXVhZAkweDlBNEZDQTFGODU1MEQ1MDAsIDB4MDNENjUzODYxQ0M5NEM5OQorCS5xdWFkCTB4MTE1QkVEQTdCNkZDNEEwMCwgMHhEOTkzMjU2RjdFMzQ4MkM4CisuTGtfZGtzZToJIyBkZWNyeXB0aW9uIGtleSBzY2hlZHVsZTogaW52c2tldyB4KkUgKyAweDYzCisJLnF1YWQJMHhENTAzMUNDQTFGQzlENjAwLCAweDUzODU5QTRDOTk0RjUwODYKKwkucXVhZAkweEEyMzE5NjA1NEZEQzdCRTgsIDB4Q0Q1RUY5NkEyMEIzMTQ4NworLkxrX2Rrczk6CSMgZGVjcnlwdGlvbiBrZXkgc2NoZWR1bGU6IGludnNrZXcgeCo5CisJLnF1YWQJMHhCNjExNkZDODdFRDlBNzAwLCAweDRBRUQ5MzM0ODIyNTVCRkMKKwkucXVhZAkweDQ1NzY1MTYyMjcxNDMzMDAsIDB4OEJCODlGQUNFOURBRkRDRQorCisjIworIyMgIERlY3J5cHRpb24gc3R1ZmYKKyMjICBSb3VuZCBmdW5jdGlvbiBjb25zdGFudHMKKyMjCisuTGtfZGlwdDoJIyBkZWNyeXB0aW9uIGlucHV0IHRyYW5zZm9ybQorCS5xdWFkCTB4MEY1MDVCMDQwQjU0NUYwMCwgMHgxNTRBNDExRTExNEU0NTFBCisJLnF1YWQJMHg4NkUzODNFNjYwMDU2NTAwLCAweDEyNzcxNzcyRjQ5MUYxOTQKKworLkxrX2RzYjk6CSMgZGVjcnlwdGlvbiBzYm94IG91dHB1dCAqOSp1LCAqOSp0CisJLnF1YWQJMHg4NTFDMDM1MzlBODZENjAwLCAweENBRDUxRjUwNEY5OTRDQzkKKwkucXVhZAkweEMwM0IxNzg5RUNENzQ5MDAsIDB4NzI1RTJDOUVCMkZCQTU2NQorLkxrX2RzYmQ6CSMgZGVjcnlwdGlvbiBzYm94IG91dHB1dCAqRCp1LCAqRCp0CisJLnF1YWQJMHg3RDU3Q0NERkU2QjFBMjAwLCAweEY1NkU5QjEzODgyQTQ0MzkKKwkucXVhZAkweDNDRTJGQUY3MjRDNkNCMDAsIDB4MjkzMTE4MEQxNURFRUZEMworLkxrX2RzYmI6CSMgZGVjcnlwdGlvbiBzYm94IG91dHB1dCAqQip1LCAqQip0CisJLnF1YWQJMHhEMDIyNjQ5Mjk2QjQ0MjAwLCAweDYwMjY0NkY2QjBGMkQ0MDQKKwkucXVhZAkweEMxOTQ5OEE2Q0Q1OTY3MDAsIDB4RjNGRjBDM0UzMjU1QUE2QgorLkxrX2RzYmU6CSMgZGVjcnlwdGlvbiBzYm94IG91dHB1dCAqRSp1LCAqRSp0CisJLnF1YWQJMHg0NkYyOTI5NjI2RDREMDAwLCAweDIyNDI2MDA0NjRCNEY2QjAKKwkucXVhZAkweDBDNTVBNkNERkZBQUMxMDAsIDB4OTQ2N0YzNkI5ODU5M0UzMgorLkxrX2RzYm86CSMgZGVjcnlwdGlvbiBzYm94IGZpbmFsIG91dHB1dAorCS5xdWFkCTB4MTM4N0VBNTM3RUY5NDAwMCwgMHhDN0FBNkRCOUQ0OTQzRTJECisJLnF1YWQJMHgxMkQ3NTYwRjkzNDQxRDAwLCAweENBNEI4MTU5RDhDNThFOUMKKy5hc2NpegkiVmVjdG9yIFBlcm11dGFpb24gQUVTIGZvciB4ODZfNjQvU1NTRTMsIE1pa2UgSGFtYnVyZyAoU3RhbmZvcmQgVW5pdmVyc2l0eSkiCisuYWxpZ24JNjQKKy5zaXplCV92cGFlc19jb25zdHMsLi1fdnBhZXNfY29uc3RzCitfX18KKworaWYgKCR3aW42NCkgeworIyBFWENFUFRJT05fRElTUE9TSVRJT04gaGFuZGxlciAoRVhDRVBUSU9OX1JFQ09SRCAqcmVjLFVMT05HNjQgZnJhbWUsCisjCQlDT05URVhUICpjb250ZXh0LERJU1BBVENIRVJfQ09OVEVYVCAqZGlzcCkKKyRyZWM9IiVyY3giOworJGZyYW1lPSIlcmR4IjsKKyRjb250ZXh0PSIlcjgiOworJGRpc3A9IiVyOSI7CisKKyRjb2RlLj08PF9fXzsKKy5leHRlcm4JX19pbXBfUnRsVmlydHVhbFVud2luZAorLnR5cGUJc2VfaGFuZGxlcixcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMTYKK3NlX2hhbmRsZXI6CisJcHVzaAklcnNpCisJcHVzaAklcmRpCisJcHVzaAklcmJ4CisJcHVzaAklcmJwCisJcHVzaAklcjEyCisJcHVzaAklcjEzCisJcHVzaAklcjE0CisJcHVzaAklcjE1CisJcHVzaGZxCisJc3ViCVwkNjQsJXJzcAorCisJbW92CTEyMCgkY29udGV4dCksJXJheAkjIHB1bGwgY29udGV4dC0+UmF4CisJbW92CTI0OCgkY29udGV4dCksJXJieAkjIHB1bGwgY29udGV4dC0+UmlwCisKKwltb3YJOCgkZGlzcCksJXJzaQkJIyBkaXNwLT5JbWFnZUJhc2UKKwltb3YJNTYoJGRpc3ApLCVyMTEJCSMgZGlzcC0+SGFuZGxlckRhdGEKKworCW1vdgkwKCVyMTEpLCVyMTBkCQkjIEhhbmRsZXJEYXRhWzBdCisJbGVhCSglcnNpLCVyMTApLCVyMTAJIyBwcm9sb2d1ZSBsYWJlbAorCWNtcAklcjEwLCVyYngJCSMgY29udGV4dC0+UmlwPHByb2xvZ3VlIGxhYmVsCisJamIJLkxpbl9wcm9sb2d1ZQorCisJbW92CTE1MigkY29udGV4dCksJXJheAkjIHB1bGwgY29udGV4dC0+UnNwCisKKwltb3YJNCglcjExKSwlcjEwZAkJIyBIYW5kbGVyRGF0YVsxXQorCWxlYQkoJXJzaSwlcjEwKSwlcjEwCSMgZXBpbG9ndWUgbGFiZWwKKwljbXAJJXIxMCwlcmJ4CQkjIGNvbnRleHQtPlJpcD49ZXBpbG9ndWUgbGFiZWwKKwlqYWUJLkxpbl9wcm9sb2d1ZQorCisJbGVhCTE2KCVyYXgpLCVyc2kJCSMgJXhtbSBzYXZlIGFyZWEKKwlsZWEJNTEyKCRjb250ZXh0KSwlcmRpCSMgJmNvbnRleHQuWG1tNgorCW1vdglcJDIwLCVlY3gJCSMgMTAqc2l6ZW9mKCV4bW0wKS9zaXplb2YoJXJheCkKKwkubG9uZwkweGE1NDhmM2ZjCQkjIGNsZDsgcmVwIG1vdnNxCisJbGVhCTB4YjgoJXJheCksJXJheAkJIyBhZGp1c3Qgc3RhY2sgcG9pbnRlcgorCisuTGluX3Byb2xvZ3VlOgorCW1vdgk4KCVyYXgpLCVyZGkKKwltb3YJMTYoJXJheCksJXJzaQorCW1vdgklcmF4LDE1MigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJzcAorCW1vdgklcnNpLDE2OCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJzaQorCW1vdgklcmRpLDE3NigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJkaQorCisJbW92CTQwKCRkaXNwKSwlcmRpCQkjIGRpc3AtPkNvbnRleHRSZWNvcmQKKwltb3YJJGNvbnRleHQsJXJzaQkJIyBjb250ZXh0CisJbW92CVwkYDEyMzIvOGAsJWVjeAkJIyBzaXplb2YoQ09OVEVYVCkKKwkubG9uZwkweGE1NDhmM2ZjCQkjIGNsZDsgcmVwIG1vdnNxCisKKwltb3YJJGRpc3AsJXJzaQorCXhvcgklcmN4LCVyY3gJCSMgYXJnMSwgVU5XX0ZMQUdfTkhBTkRMRVIKKwltb3YJOCglcnNpKSwlcmR4CQkjIGFyZzIsIGRpc3AtPkltYWdlQmFzZQorCW1vdgkwKCVyc2kpLCVyOAkJIyBhcmczLCBkaXNwLT5Db250cm9sUGMKKwltb3YJMTYoJXJzaSksJXI5CQkjIGFyZzQsIGRpc3AtPkZ1bmN0aW9uRW50cnkKKwltb3YJNDAoJXJzaSksJXIxMAkJIyBkaXNwLT5Db250ZXh0UmVjb3JkCisJbGVhCTU2KCVyc2kpLCVyMTEJCSMgJmRpc3AtPkhhbmRsZXJEYXRhCisJbGVhCTI0KCVyc2kpLCVyMTIJCSMgJmRpc3AtPkVzdGFibGlzaGVyRnJhbWUKKwltb3YJJXIxMCwzMiglcnNwKQkJIyBhcmc1CisJbW92CSVyMTEsNDAoJXJzcCkJCSMgYXJnNgorCW1vdgklcjEyLDQ4KCVyc3ApCQkjIGFyZzcKKwltb3YJJXJjeCw1NiglcnNwKQkJIyBhcmc4LCAoTlVMTCkKKwljYWxsCSpfX2ltcF9SdGxWaXJ0dWFsVW53aW5kKCVyaXApCisKKwltb3YJXCQxLCVlYXgJCSMgRXhjZXB0aW9uQ29udGludWVTZWFyY2gKKwlhZGQJXCQ2NCwlcnNwCisJcG9wZnEKKwlwb3AJJXIxNQorCXBvcAklcjE0CisJcG9wCSVyMTMKKwlwb3AJJXIxMgorCXBvcAklcmJwCisJcG9wCSVyYngKKwlwb3AJJXJkaQorCXBvcAklcnNpCisJcmV0Cisuc2l6ZQlzZV9oYW5kbGVyLC4tc2VfaGFuZGxlcgorCisuc2VjdGlvbgkucGRhdGEKKy5hbGlnbgk0CisJLnJ2YQkuTFNFSF9iZWdpbl8ke1BSRUZJWH1fc2V0X2VuY3J5cHRfa2V5CisJLnJ2YQkuTFNFSF9lbmRfJHtQUkVGSVh9X3NldF9lbmNyeXB0X2tleQorCS5ydmEJLkxTRUhfaW5mb18ke1BSRUZJWH1fc2V0X2VuY3J5cHRfa2V5CisKKwkucnZhCS5MU0VIX2JlZ2luXyR7UFJFRklYfV9zZXRfZGVjcnlwdF9rZXkKKwkucnZhCS5MU0VIX2VuZF8ke1BSRUZJWH1fc2V0X2RlY3J5cHRfa2V5CisJLnJ2YQkuTFNFSF9pbmZvXyR7UFJFRklYfV9zZXRfZGVjcnlwdF9rZXkKKworCS5ydmEJLkxTRUhfYmVnaW5fJHtQUkVGSVh9X2VuY3J5cHQKKwkucnZhCS5MU0VIX2VuZF8ke1BSRUZJWH1fZW5jcnlwdAorCS5ydmEJLkxTRUhfaW5mb18ke1BSRUZJWH1fZW5jcnlwdAorCisJLnJ2YQkuTFNFSF9iZWdpbl8ke1BSRUZJWH1fZGVjcnlwdAorCS5ydmEJLkxTRUhfZW5kXyR7UFJFRklYfV9kZWNyeXB0CisJLnJ2YQkuTFNFSF9pbmZvXyR7UFJFRklYfV9kZWNyeXB0CisKKwkucnZhCS5MU0VIX2JlZ2luXyR7UFJFRklYfV9jYmNfZW5jcnlwdAorCS5ydmEJLkxTRUhfZW5kXyR7UFJFRklYfV9jYmNfZW5jcnlwdAorCS5ydmEJLkxTRUhfaW5mb18ke1BSRUZJWH1fY2JjX2VuY3J5cHQKKworLnNlY3Rpb24JLnhkYXRhCisuYWxpZ24JOAorLkxTRUhfaW5mb18ke1BSRUZJWH1fc2V0X2VuY3J5cHRfa2V5OgorCS5ieXRlCTksMCwwLDAKKwkucnZhCXNlX2hhbmRsZXIKKwkucnZhCS5MZW5jX2tleV9ib2R5LC5MZW5jX2tleV9lcGlsb2d1ZQkjIEhhbmRsZXJEYXRhW10KKy5MU0VIX2luZm9fJHtQUkVGSVh9X3NldF9kZWNyeXB0X2tleToKKwkuYnl0ZQk5LDAsMCwwCisJLnJ2YQlzZV9oYW5kbGVyCisJLnJ2YQkuTGRlY19rZXlfYm9keSwuTGRlY19rZXlfZXBpbG9ndWUJIyBIYW5kbGVyRGF0YVtdCisuTFNFSF9pbmZvXyR7UFJFRklYfV9lbmNyeXB0OgorCS5ieXRlCTksMCwwLDAKKwkucnZhCXNlX2hhbmRsZXIKKwkucnZhCS5MZW5jX2JvZHksLkxlbmNfZXBpbG9ndWUJCSMgSGFuZGxlckRhdGFbXQorLkxTRUhfaW5mb18ke1BSRUZJWH1fZGVjcnlwdDoKKwkuYnl0ZQk5LDAsMCwwCisJLnJ2YQlzZV9oYW5kbGVyCisJLnJ2YQkuTGRlY19ib2R5LC5MZGVjX2VwaWxvZ3VlCQkjIEhhbmRsZXJEYXRhW10KKy5MU0VIX2luZm9fJHtQUkVGSVh9X2NiY19lbmNyeXB0OgorCS5ieXRlCTksMCwwLDAKKwkucnZhCXNlX2hhbmRsZXIKKwkucnZhCS5MY2JjX2JvZHksLkxjYmNfZXBpbG9ndWUJCSMgSGFuZGxlckRhdGFbXQorX19fCit9CisKKyRjb2RlID1+IHMvXGAoW15cYF0qKVxgL2V2YWwoJDEpL2dlbTsKKworcHJpbnQgJGNvZGU7CisKK2Nsb3NlIFNURE9VVDsKZGlmZiAtLWdpdCBhL2NyeXB0by9hZXMvaW50ZXJuYWwuaCBiL2NyeXB0by9hZXMvaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGM1YzYzCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2Flcy9pbnRlcm5hbC5oCkBAIC0wLDAgKzEsODcgQEAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworI2lmbmRlZiBPUEVOU1NMX0hFQURFUl9BRVNfSU5URVJOQUxfSAorI2RlZmluZSBPUEVOU1NMX0hFQURFUl9BRVNfSU5URVJOQUxfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9iYXNlLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgXAorICAgIChkZWZpbmVkKF9NX0lYODYpIHx8IGRlZmluZWQoX01fQU1ENjQpIHx8IGRlZmluZWQoX01fWDY0KSkKKyNkZWZpbmUgU1dBUCh4KSAoX2xyb3RsKHgsIDgpICYgMHgwMGZmMDBmZiB8IF9scm90cih4LCA4KSAmIDB4ZmYwMGZmMDApCisjZGVmaW5lIEdFVFUzMihwKSBTV0FQKCooKHVpbnQzMl90ICopKHApKSkKKyNkZWZpbmUgUFVUVTMyKGN0LCBzdCkgXAorICB7ICooKHVpbnQzMl90ICopKGN0KSkgPSBTV0FQKChzdCkpOyB9CisjZWxzZQorI2RlZmluZSBHRVRVMzIocHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKHVpbnQzMl90KShwdClbMF0gPDwgMjQpIF4gKCh1aW50MzJfdCkocHQpWzFdIDw8IDE2KSBeIFwKKyAgICgodWludDMyX3QpKHB0KVsyXSA8PCA4KSBeICgodWludDMyX3QpKHB0KVszXSkpCisjZGVmaW5lIFBVVFUzMihjdCwgc3QpICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChjdClbMF0gPSAodWludDhfdCkoKHN0KSA+PiAyNCk7IFwKKyAgICAoY3QpWzFdID0gKHVpbnQ4X3QpKChzdCkgPj4gMTYpOyBcCisgICAgKGN0KVsyXSA9ICh1aW50OF90KSgoc3QpID4+IDgpOyAgXAorICAgIChjdClbM10gPSAodWludDhfdCkoc3QpOyAgICAgICAgIFwKKyAgfQorI2VuZGlmCisKKyNkZWZpbmUgTUFYS0MgKDI1NiAvIDMyKQorI2RlZmluZSBNQVhLQiAoMjU2IC8gOCkKKyNkZWZpbmUgTUFYTlIgMTQKKworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30gLyogZXh0ZXJuIEMgKi8KKyNlbmRpZgorCisjZW5kaWYgLyogT1BFTlNTTF9IRUFERVJfQUVTX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2NyeXB0by9hZXMvbW9kZV93cmFwcGVycy5jIGIvY3J5cHRvL2Flcy9tb2RlX3dyYXBwZXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVlMjMyNgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9hZXMvbW9kZV93cmFwcGVycy5jCkBAIC0wLDAgKzEsOTkgQEAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYWVzLmg+CisKKyNpbmNsdWRlICJhc3NlcnQuaCIKKworI2luY2x1ZGUgPG9wZW5zc2wvbW9kZXMuaD4KKworCit2b2lkIEFFU19jdHIxMjhfZW5jcnlwdChjb25zdCB1aW50OF90ICppbiwgdWludDhfdCAqb3V0LCBzaXplX3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUVTX0tFWSAqa2V5LCB1aW50OF90IGl2ZWNbQUVTX0JMT0NLX1NJWkVdLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBlY291bnRfYnVmW0FFU19CTE9DS19TSVpFXSwgdW5zaWduZWQgaW50ICpudW0pIHsKKyAgQ1JZUFRPX2N0cjEyOF9lbmNyeXB0KGluLCBvdXQsIGxlbiwga2V5LCBpdmVjLCBlY291bnRfYnVmLCBudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAoYmxvY2sxMjhfZilBRVNfZW5jcnlwdCk7Cit9CisKK3ZvaWQgQUVTX2VjYl9lbmNyeXB0KGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50OF90ICpvdXQsIGNvbnN0IEFFU19LRVkgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBlbmMpIHsKKyAgYXNzZXJ0KGluICYmIG91dCAmJiBrZXkpOworICBhc3NlcnQoKEFFU19FTkNSWVBUID09IGVuYykgfHwgKEFFU19ERUNSWVBUID09IGVuYykpOworCisgIGlmIChBRVNfRU5DUllQVCA9PSBlbmMpIHsKKyAgICBBRVNfZW5jcnlwdChpbiwgb3V0LCBrZXkpOworICB9IGVsc2UgeworICAgIEFFU19kZWNyeXB0KGluLCBvdXQsIGtleSk7CisgIH0KK30KKworI2lmIGRlZmluZWQoT1BFTlNTTF9OT19BU00pIHx8IFwKKyAgICAoIWRlZmluZWQoT1BFTlNTTF9YODZfNjQpICYmICFkZWZpbmVkKE9QRU5TU0xfWDg2KSkKK3ZvaWQgQUVTX2NiY19lbmNyeXB0KGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50OF90ICpvdXQsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBBRVNfS0VZICprZXksIHVpbnQ4X3QgKml2ZWMsIGNvbnN0IGludCBlbmMpIHsKKworICBpZiAoZW5jKSB7CisgICAgQ1JZUFRPX2NiYzEyOF9lbmNyeXB0KGluLCBvdXQsIGxlbiwga2V5LCBpdmVjLCAoYmxvY2sxMjhfZilBRVNfZW5jcnlwdCk7CisgIH0gZWxzZSB7CisgICAgQ1JZUFRPX2NiYzEyOF9kZWNyeXB0KGluLCBvdXQsIGxlbiwga2V5LCBpdmVjLCAoYmxvY2sxMjhfZilBRVNfZGVjcnlwdCk7CisgIH0KK30KKyNlbmRpZgorCit2b2lkIEFFU19vZmIxMjhfZW5jcnlwdChjb25zdCB1aW50OF90ICppbiwgdWludDhfdCAqb3V0LCBzaXplX3QgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUVTX0tFWSAqa2V5LCB1aW50OF90ICppdmVjLCBpbnQgKm51bSkgeworICBDUllQVE9fb2ZiMTI4X2VuY3J5cHQoaW4sIG91dCwgbGVuZ3RoLCBrZXksIGl2ZWMsIG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChibG9jazEyOF9mKUFFU19lbmNyeXB0KTsKK30KKwordm9pZCBBRVNfY2ZiMTI4X2VuY3J5cHQoY29uc3QgdWludDhfdCAqaW4sIHVpbnQ4X3QgKm91dCwgc2l6ZV90IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFFU19LRVkgKmtleSwgdWludDhfdCAqaXZlYywgaW50ICpudW0sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW5jKSB7CisgIENSWVBUT19jZmIxMjhfZW5jcnlwdChpbiwgb3V0LCBsZW5ndGgsIGtleSwgaXZlYywgbnVtLCBlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAoYmxvY2sxMjhfZilBRVNfZW5jcnlwdCk7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vYXJtX2FyY2guaCBiL2NyeXB0by9hcm1fYXJjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MjhlZWUKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYXJtX2FyY2guaApAQCAtMCwwICsxLDEwMCBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDExIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4gKi8KKworI2lmbmRlZiBPUEVOU1NMX0hFQURFUl9BUk1fQVJDSF9ICisjZGVmaW5lIE9QRU5TU0xfSEVBREVSX0FSTV9BUkNIX0gKKworI2lmICFkZWZpbmVkKF9fQVJNX0FSQ0hfXykKKyMgaWYgZGVmaW5lZChfX0NDX0FSTSkKKyMgIGRlZmluZSBfX0FSTV9BUkNIX18gX19UQVJHRVRfQVJDSF9BUk0KKyMgIGlmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorIyAgIGRlZmluZSBfX0FSTUVCX18KKyMgIGVsc2UKKyMgICBkZWZpbmUgX19BUk1FTF9fCisjICBlbmRpZgorIyBlbGlmIGRlZmluZWQoX19HTlVDX18pCisgIC8qIFdoeSBkb2Vzbid0IGdjYyBkZWZpbmUgX19BUk1fQVJDSF9fPyBJbnN0ZWFkIGl0IGRlZmluZXMKKyAgICogYnVuY2ggb2YgYmVsb3cgbWFjcm9zLiBTZWUgYWxsX2FyY2hpdGVjdGlyZXNbXSB0YWJsZSBpbgorICAgKiBnY2MvY29uZmlnL2FybS9hcm0uYy4gT24gYSBzaWRlIG5vdGUgaXQgZGVmaW5lcworICAgKiBfX0FSTUVMX18vX19BUk1FQl9fIGZvciBsaXR0bGUtL2JpZy1lbmRpYW4uICovCisjICBpZglkZWZpbmVkKF9fQVJNX0FSQ0hfN19fKQl8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfN0FfXykJfHwgXAorCWRlZmluZWQoX19BUk1fQVJDSF83Ul9fKXx8IGRlZmluZWQoX19BUk1fQVJDSF83TV9fKQl8fCBcCisJZGVmaW5lZChfX0FSTV9BUkNIXzdFTV9fKQorIyAgIGRlZmluZSBfX0FSTV9BUkNIX18gNworIyAgZWxpZglkZWZpbmVkKF9fQVJNX0FSQ0hfNl9fKQl8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNkpfXykJfHwgXAorCWRlZmluZWQoX19BUk1fQVJDSF82S19fKXx8IGRlZmluZWQoX19BUk1fQVJDSF82TV9fKQl8fCBcCisJZGVmaW5lZChfX0FSTV9BUkNIXzZaX18pfHwgZGVmaW5lZChfX0FSTV9BUkNIXzZaS19fKQl8fCBcCisJZGVmaW5lZChfX0FSTV9BUkNIXzZUMl9fKQorIyAgIGRlZmluZSBfX0FSTV9BUkNIX18gNgorIyAgZWxpZglkZWZpbmVkKF9fQVJNX0FSQ0hfNV9fKQl8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRfXykJfHwgXAorCWRlZmluZWQoX19BUk1fQVJDSF81RV9fKXx8IGRlZmluZWQoX19BUk1fQVJDSF81VEVfXykJfHwgXAorCWRlZmluZWQoX19BUk1fQVJDSF81VEVKX18pCisjICAgZGVmaW5lIF9fQVJNX0FSQ0hfXyA1CisjICBlbGlmCWRlZmluZWQoX19BUk1fQVJDSF80X18pCXx8IGRlZmluZWQoX19BUk1fQVJDSF80VF9fKQorIyAgIGRlZmluZSBfX0FSTV9BUkNIX18gNAorIyAgZWxzZQorIyAgIGVycm9yICJ1bnN1cHBvcnRlZCBBUk0gYXJjaGl0ZWN0dXJlIgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgIV9fQVNTRU1CTEVSX18KKy8qIE9QRU5TU0xfYXJtY2FwX1AgY29udGFpbnMgZmxhZ3MgZGVzY3JpYmluZyB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBDUFUgYW5kCisgKiBpcyBlYXN5IGZvciBhc3NlbWJseSBjb2RlIHRvIGFjZXNzcy4gRm9yIEMgY29kZSwgc2VlIHRoZSBmdW5jdGlvbnMgaW4KKyAqIHxjcHUuaHwuICovCitleHRlcm4gdW5zaWduZWQgaW50IE9QRU5TU0xfYXJtY2FwX1A7CisKKyNkZWZpbmUgQVJNVjdfTkVPTiAgICAgICgxPDwwKQorI2VuZGlmCisKKworI2VuZGlmICAvKiBPUEVOU1NMX0hFQURFUl9USFJFQURfSCAqLwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FzbjEvQ01ha2VMaXN0cy50eHQgYi9jcnlwdG8vYXNuMS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODRlY2QyCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2FzbjEvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw0NiBAQAoraW5jbHVkZV9kaXJlY3RvcmllcyguIC4uIC4uLy4uL2luY2x1ZGUpCisKK2FkZF9saWJyYXJ5KAorCWFzbjEKKworCU9CSkVDVAorCisJYV9iaXRzdHIuYworCWFfYm9vbC5jCisJYV9ieXRlcy5jCisJYV9kMmlfZnAuYworCWFfZHVwLmMKKwlhX2VudW0uYworCWFfZ2VudG0uYworCWFfaTJkX2ZwLmMKKwlhX2ludC5jCisJYV9tYnN0ci5jCisJYV9vYmplY3QuYworCWFfb2N0ZXQuYworCWFfcHJpbnQuYworCWFfc3RybmlkLmMKKwlhX3RpbWUuYworCWFfdHlwZS5jCisJYV91dGN0bS5jCisJYV91dGY4LmMKKwlhc24xX2Vycm9yLmMKKwlhc24xX2xpYi5jCisJYXNuMV9wYXIuYworCWFzbl9wYWNrLmMKKwliaW9fYXNuMS5jCisJYmlvX25kZWYuYworCWZfZW51bS5jCisJZl9pbnQuYworCWZfc3RyaW5nLmMKKwl0X2JpdHN0LmMKKwl0X3BrZXkuYworCXRhc25fZGVjLmMKKwl0YXNuX2VuYy5jCisJdGFzbl9mcmUuYworCXRhc25fbmV3LmMKKwl0YXNuX3Bybi5jCisJdGFzbl90eXAuYworCXRhc25fdXRsLmMKKwl4X2JpZ251bS5jCisJeF9sb25nLmMKKykKZGlmZiAtLWdpdCBhL2NyeXB0by9hc24xL2FfYml0c3RyLmMgYi9jcnlwdG8vYXNuMS9hX2JpdHN0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MTdiZGEKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYXNuMS9hX2JpdHN0ci5jCkBAIC0wLDAgKzEsMjQ3IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorCitpbnQgQVNOMV9CSVRfU1RSSU5HX3NldChBU04xX0JJVF9TVFJJTkcgKngsIHVuc2lnbmVkIGNoYXIgKmQsIGludCBsZW4pCit7IHJldHVybiBNX0FTTjFfQklUX1NUUklOR19zZXQoeCwgZCwgbGVuKTsgfQorCitpbnQgaTJjX0FTTjFfQklUX1NUUklORyhBU04xX0JJVF9TVFJJTkcgKmEsIHVuc2lnbmVkIGNoYXIgKipwcCkKKwl7CisJaW50IHJldCxqLGJpdHMsbGVuOworCXVuc2lnbmVkIGNoYXIgKnAsKmQ7CisKKwlpZiAoYSA9PSBOVUxMKSByZXR1cm4oMCk7CisKKwlsZW49YS0+bGVuZ3RoOworCisJaWYgKGxlbiA+IDApCisJCXsKKwkJaWYgKGEtPmZsYWdzICYgQVNOMV9TVFJJTkdfRkxBR19CSVRTX0xFRlQpCisJCQl7CisJCQliaXRzPShpbnQpYS0+ZmxhZ3MmMHgwNzsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJZm9yICggOyBsZW4gPiAwOyBsZW4tLSkKKwkJCQl7CisJCQkJaWYgKGEtPmRhdGFbbGVuLTFdKSBicmVhazsKKwkJCQl9CisJCQlqPWEtPmRhdGFbbGVuLTFdOworCQkJaWYgICAgICAoaiAmIDB4MDEpIGJpdHM9MDsKKwkJCWVsc2UgaWYgKGogJiAweDAyKSBiaXRzPTE7CisJCQllbHNlIGlmIChqICYgMHgwNCkgYml0cz0yOworCQkJZWxzZSBpZiAoaiAmIDB4MDgpIGJpdHM9MzsKKwkJCWVsc2UgaWYgKGogJiAweDEwKSBiaXRzPTQ7CisJCQllbHNlIGlmIChqICYgMHgyMCkgYml0cz01OworCQkJZWxzZSBpZiAoaiAmIDB4NDApIGJpdHM9NjsKKwkJCWVsc2UgaWYgKGogJiAweDgwKSBiaXRzPTc7CisJCQllbHNlIGJpdHM9MDsgLyogc2hvdWxkIG5vdCBoYXBwZW4gKi8KKwkJCX0KKwkJfQorCWVsc2UKKwkJYml0cz0wOworCisJcmV0PTErbGVuOworCWlmIChwcCA9PSBOVUxMKSByZXR1cm4ocmV0KTsKKworCXA9ICpwcDsKKworCSoocCsrKT0odW5zaWduZWQgY2hhciliaXRzOworCWQ9YS0+ZGF0YTsKKwltZW1jcHkocCxkLGxlbik7CisJcCs9bGVuOworCWlmIChsZW4gPiAwKSBwWy0xXSY9KDB4ZmY8PGJpdHMpOworCSpwcD1wOworCXJldHVybihyZXQpOworCX0KKworQVNOMV9CSVRfU1RSSU5HICpjMmlfQVNOMV9CSVRfU1RSSU5HKEFTTjFfQklUX1NUUklORyAqKmEsCisJY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLCBsb25nIGxlbikKKwl7CisJQVNOMV9CSVRfU1RSSU5HICpyZXQ9TlVMTDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwOworCXVuc2lnbmVkIGNoYXIgKnM7CisJaW50IGk7CisKKwlpZiAobGVuIDwgMSkKKwkJeworCQlpPUFTTjFfUl9TVFJJTkdfVE9PX1NIT1JUOworCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKChhID09IE5VTEwpIHx8ICgoKmEpID09IE5VTEwpKQorCQl7CisJCWlmICgocmV0PU1fQVNOMV9CSVRfU1RSSU5HX25ldygpKSA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CisJCX0KKwllbHNlCisJCXJldD0oKmEpOworCisJcD0gKnBwOworCWk9ICoocCsrKTsKKwkvKiBXZSBkbyB0aGlzIHRvIHByZXNlcnZlIHRoZSBzZXR0aW5ncy4gIElmIHdlIG1vZGlmeQorCSAqIHRoZSBzZXR0aW5ncywgdmlhIHRoZSBfc2V0X2JpdCBmdW5jdGlvbiwgd2Ugd2lsbCByZWNhbGN1bGF0ZQorCSAqIG9uIG91dHB1dCAqLworCXJldC0+ZmxhZ3MmPSB+KEFTTjFfU1RSSU5HX0ZMQUdfQklUU19MRUZUfDB4MDcpOyAvKiBjbGVhciAqLworCXJldC0+ZmxhZ3N8PShBU04xX1NUUklOR19GTEFHX0JJVFNfTEVGVHwoaSYweDA3KSk7IC8qIHNldCAqLworCisJaWYgKGxlbi0tID4gMSkgLyogdXNpbmcgb25lIGJlY2F1c2Ugb2YgdGhlIGJpdHMgbGVmdCBieXRlICovCisJCXsKKwkJcz0odW5zaWduZWQgY2hhciAqKU9QRU5TU0xfbWFsbG9jKChpbnQpbGVuKTsKKwkJaWYgKHMgPT0gTlVMTCkKKwkJCXsKKwkJCWk9RVJSX1JfTUFMTE9DX0ZBSUxVUkU7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJbWVtY3B5KHMscCwoaW50KWxlbik7CisJCXNbbGVuLTFdJj0oMHhmZjw8aSk7CisJCXArPWxlbjsKKwkJfQorCWVsc2UKKwkJcz1OVUxMOworCisJcmV0LT5sZW5ndGg9KGludClsZW47CisJaWYgKHJldC0+ZGF0YSAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUocmV0LT5kYXRhKTsKKwlyZXQtPmRhdGE9czsKKwlyZXQtPnR5cGU9Vl9BU04xX0JJVF9TVFJJTkc7CisJaWYgKGEgIT0gTlVMTCkgKCphKT1yZXQ7CisJKnBwPXA7CisJcmV0dXJuKHJldCk7CitlcnI6CisJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYzJpX0FTTjFfQklUX1NUUklORywgaSk7CisJaWYgKChyZXQgIT0gTlVMTCkgJiYgKChhID09IE5VTEwpIHx8ICgqYSAhPSByZXQpKSkKKwkJTV9BU04xX0JJVF9TVFJJTkdfZnJlZShyZXQpOworCXJldHVybihOVUxMKTsKKwl9CisKKy8qIFRoZXNlIG5leHQgMiBmdW5jdGlvbnMgZnJvbSBHb2V0eiBCYWJpbi1FYmVsbCA8YmFiaW5lYmVsbEB0cnVzdGNlbnRlci5kZT4KKyAqLworaW50IEFTTjFfQklUX1NUUklOR19zZXRfYml0KEFTTjFfQklUX1NUUklORyAqYSwgaW50IG4sIGludCB2YWx1ZSkKKwl7CisJaW50IHcsdixpdjsKKwl1bnNpZ25lZCBjaGFyICpjOworCisJdz1uLzg7CisJdj0xPDwoNy0obiYweDA3KSk7CisJaXY9IH52OworCWlmICghdmFsdWUpIHY9MDsKKworCWlmIChhID09IE5VTEwpCisJCXJldHVybiAwOworCisJYS0+ZmxhZ3MmPSB+KEFTTjFfU1RSSU5HX0ZMQUdfQklUU19MRUZUfDB4MDcpOyAvKiBjbGVhciwgc2V0IG9uIHdyaXRlICovCisKKwlpZiAoKGEtPmxlbmd0aCA8ICh3KzEpKSB8fCAoYS0+ZGF0YSA9PSBOVUxMKSkKKwkJeworCQlpZiAoIXZhbHVlKSByZXR1cm4oMSk7IC8qIERvbid0IG5lZWQgdG8gc2V0ICovCisJCWlmIChhLT5kYXRhID09IE5VTEwpCisJCQljPSh1bnNpZ25lZCBjaGFyICopT1BFTlNTTF9tYWxsb2ModysxKTsKKwkJZWxzZQorCQkJYz0odW5zaWduZWQgY2hhciAqKU9QRU5TU0xfcmVhbGxvY19jbGVhbihhLT5kYXRhLAorCQkJCQkJCQkgYS0+bGVuZ3RoLAorCQkJCQkJCQkgdysxKTsKKwkJaWYgKGMgPT0gTlVMTCkKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfQklUX1NUUklOR19zZXRfYml0LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlyZXR1cm4gMDsKKwkJCX0KKyAgCQlpZiAodysxLWEtPmxlbmd0aCA+IDApIG1lbXNldChjK2EtPmxlbmd0aCwgMCwgdysxLWEtPmxlbmd0aCk7CisJCWEtPmRhdGE9YzsKKwkJYS0+bGVuZ3RoPXcrMTsKKwl9CisJYS0+ZGF0YVt3XT0oKGEtPmRhdGFbd10pJml2KXx2OworCXdoaWxlICgoYS0+bGVuZ3RoID4gMCkgJiYgKGEtPmRhdGFbYS0+bGVuZ3RoLTFdID09IDApKQorCQlhLT5sZW5ndGgtLTsKKwlyZXR1cm4oMSk7CisJfQorCitpbnQgQVNOMV9CSVRfU1RSSU5HX2dldF9iaXQoQVNOMV9CSVRfU1RSSU5HICphLCBpbnQgbikKKwl7CisJaW50IHcsdjsKKworCXc9bi84OworCXY9MTw8KDctKG4mMHgwNykpOworCWlmICgoYSA9PSBOVUxMKSB8fCAoYS0+bGVuZ3RoIDwgKHcrMSkpIHx8IChhLT5kYXRhID09IE5VTEwpKQorCQlyZXR1cm4oMCk7CisJcmV0dXJuKChhLT5kYXRhW3ddJnYpICE9IDApOworCX0KKworLyoKKyAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gYml0IHN0cmluZyBjb250YWlucyBvbmx5IGJpdHMgc3BlY2lmaWVkIGJ5IAorICogdGhlIGZsYWdzIHZlY3Rvci4gUmV0dXJucyAwIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBiaXQgc2V0IGluICdhJworICogd2hpY2ggaXMgbm90IHNwZWNpZmllZCBpbiAnZmxhZ3MnLCAxIG90aGVyd2lzZS4KKyAqICdsZW4nIGlzIHRoZSBsZW5ndGggb2YgJ2ZsYWdzJy4KKyAqLworaW50IEFTTjFfQklUX1NUUklOR19jaGVjayhBU04xX0JJVF9TVFJJTkcgKmEsCisJCQkgIHVuc2lnbmVkIGNoYXIgKmZsYWdzLCBpbnQgZmxhZ3NfbGVuKQorCXsKKwlpbnQgaSwgb2s7CisJLyogQ2hlY2sgaWYgdGhlcmUgaXMgb25lIGJpdCBzZXQgYXQgYWxsLiAqLworCWlmICghYSB8fCAhYS0+ZGF0YSkgcmV0dXJuIDE7CisKKwkvKiBDaGVjayBlYWNoIGJ5dGUgb2YgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBiaXQgc3RyaW5nLiAqLworCW9rID0gMTsKKwlmb3IgKGkgPSAwOyBpIDwgYS0+bGVuZ3RoICYmIG9rOyArK2kpCisJCXsKKwkJdW5zaWduZWQgY2hhciBtYXNrID0gaSA8IGZsYWdzX2xlbiA/IH5mbGFnc1tpXSA6IDB4ZmY7CisJCS8qIFdlIGFyZSBkb25lIGlmIHRoZXJlIGlzIGFuIHVubmVlZGVkIGJpdCBzZXQuICovCisJCW9rID0gKGEtPmRhdGFbaV0gJiBtYXNrKSA9PSAwOworCQl9CisJcmV0dXJuIG9rOworCX0KZGlmZiAtLWdpdCBhL2NyeXB0by9hc24xL2FfYm9vbC5jIGIvY3J5cHRvL2FzbjEvYV9ib29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMwZWU0OAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9hc24xL2FfYm9vbC5jCkBAIC0wLDAgKzEsMTEyIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorCisKK2ludCBpMmRfQVNOMV9CT09MRUFOKGludCBhLCB1bnNpZ25lZCBjaGFyICoqcHApCisJeworCWludCByOworCXVuc2lnbmVkIGNoYXIgKnA7CisKKwlyPUFTTjFfb2JqZWN0X3NpemUoMCwxLFZfQVNOMV9CT09MRUFOKTsKKwlpZiAocHAgPT0gTlVMTCkgcmV0dXJuKHIpOworCXA9ICpwcDsKKworCUFTTjFfcHV0X29iamVjdCgmcCwwLDEsVl9BU04xX0JPT0xFQU4sVl9BU04xX1VOSVZFUlNBTCk7CisJKihwKyspPSAodW5zaWduZWQgY2hhcilhOworCSpwcD1wOworCXJldHVybihyKTsKKwl9CisKK2ludCBkMmlfQVNOMV9CT09MRUFOKGludCAqYSwgY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLCBsb25nIGxlbmd0aCkKKwl7CisJaW50IHJldD0gLTE7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKwlsb25nIGxlbjsKKwlpbnQgaW5mLHRhZyx4Y2xhc3M7CisJaW50IGk9MDsKKworCXA9ICpwcDsKKwlpbmY9QVNOMV9nZXRfb2JqZWN0KCZwLCZsZW4sJnRhZywmeGNsYXNzLGxlbmd0aCk7CisJaWYgKGluZiAmIDB4ODApCisJCXsKKwkJaT1BU04xX1JfQkFEX09CSkVDVF9IRUFERVI7CisJCWdvdG8gZXJyOworCQl9CisKKwlpZiAodGFnICE9IFZfQVNOMV9CT09MRUFOKQorCQl7CisJCWk9QVNOMV9SX0VYUEVDVElOR19BX0JPT0xFQU47CisJCWdvdG8gZXJyOworCQl9CisKKwlpZiAobGVuICE9IDEpCisJCXsKKwkJaT1BU04xX1JfQk9PTEVBTl9JU19XUk9OR19MRU5HVEg7CisJCWdvdG8gZXJyOworCQl9CisJcmV0PSAoaW50KSoocCsrKTsKKwlpZiAoYSAhPSBOVUxMKSAoKmEpPXJldDsKKwkqcHA9cDsKKwlyZXR1cm4ocmV0KTsKK2VycjoKKwlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBkMmlfQVNOMV9CT09MRUFOLCBpKTsKKwlyZXR1cm4ocmV0KTsKKwl9CmRpZmYgLS1naXQgYS9jcnlwdG8vYXNuMS9hX2J5dGVzLmMgYi9jcnlwdG8vYXNuMS9hX2J5dGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlkZDgxNgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9hc24xL2FfYnl0ZXMuYwpAQCAtMCwwICsxLDMxNSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9idWYuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisKKworc3RhdGljIGludCBhc24xX2NvbGxhdGVfcHJpbWl0aXZlKEFTTjFfU1RSSU5HICphLCBBU04xX2NvbnN0X0NUWCAqYyk7CisvKiB0eXBlIGlzIGEgJ2JpdG1hcCcgb2YgYWNjZXB0YWJsZSBzdHJpbmcgdHlwZXMuCisgKi8KK0FTTjFfU1RSSU5HICpkMmlfQVNOMV90eXBlX2J5dGVzKEFTTjFfU1RSSU5HICoqYSwgY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLAorCSAgICAgbG9uZyBsZW5ndGgsIGludCB0eXBlKQorCXsKKwlBU04xX1NUUklORyAqcmV0PU5VTEw7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKwl1bnNpZ25lZCBjaGFyICpzOworCWxvbmcgbGVuOworCWludCBpbmYsdGFnLHhjbGFzczsKKwlpbnQgaT0wOworCisJcD0gKnBwOworCWluZj1BU04xX2dldF9vYmplY3QoJnAsJmxlbiwmdGFnLCZ4Y2xhc3MsbGVuZ3RoKTsKKwlpZiAoaW5mICYgMHg4MCkgZ290byBlcnI7CisKKwlpZiAodGFnID49IDMyKQorCQl7CisJCWk9QVNOMV9SX1RBR19WQUxVRV9UT09fSElHSDsKKwkJZ290byBlcnI7CisJCX0KKwlpZiAoIShBU04xX3RhZzJiaXQodGFnKSAmIHR5cGUpKQorCQl7CisJCWk9QVNOMV9SX1dST05HX1RZUEU7CisJCWdvdG8gZXJyOworCQl9CisKKwkvKiBJZiBhIGJpdC1zdHJpbmcsIGV4aXQgZWFybHkgKi8KKwlpZiAodGFnID09IFZfQVNOMV9CSVRfU1RSSU5HKQorCQlyZXR1cm4oZDJpX0FTTjFfQklUX1NUUklORyhhLHBwLGxlbmd0aCkpOworCisJaWYgKChhID09IE5VTEwpIHx8ICgoKmEpID09IE5VTEwpKQorCQl7CisJCWlmICgocmV0PUFTTjFfU1RSSU5HX25ldygpKSA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CisJCX0KKwllbHNlCisJCXJldD0oKmEpOworCisJaWYgKGxlbiAhPSAwKQorCQl7CisJCXM9KHVuc2lnbmVkIGNoYXIgKilPUEVOU1NMX21hbGxvYygoaW50KWxlbisxKTsKKwkJaWYgKHMgPT0gTlVMTCkKKwkJCXsKKwkJCWk9RVJSX1JfTUFMTE9DX0ZBSUxVUkU7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJbWVtY3B5KHMscCwoaW50KWxlbik7CisJCXNbbGVuXT0nXDAnOworCQlwKz1sZW47CisJCX0KKwllbHNlCisJCXM9TlVMTDsKKworCWlmIChyZXQtPmRhdGEgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKHJldC0+ZGF0YSk7CisJcmV0LT5sZW5ndGg9KGludClsZW47CisJcmV0LT5kYXRhPXM7CisJcmV0LT50eXBlPXRhZzsKKwlpZiAoYSAhPSBOVUxMKSAoKmEpPXJldDsKKwkqcHA9cDsKKwlyZXR1cm4ocmV0KTsKK2VycjoKKwlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBkMmlfQVNOMV90eXBlX2J5dGVzLCBpKTsKKwlpZiAoKHJldCAhPSBOVUxMKSAmJiAoKGEgPT0gTlVMTCkgfHwgKCphICE9IHJldCkpKQorCQlBU04xX1NUUklOR19mcmVlKHJldCk7CisJcmV0dXJuKE5VTEwpOworCX0KKworaW50IGkyZF9BU04xX2J5dGVzKEFTTjFfU1RSSU5HICphLCB1bnNpZ25lZCBjaGFyICoqcHAsIGludCB0YWcsIGludCB4Y2xhc3MpCisJeworCWludCByZXQscixjb25zdHJ1Y3RlZDsKKwl1bnNpZ25lZCBjaGFyICpwOworCisJaWYgKGEgPT0gTlVMTCkgIHJldHVybigwKTsKKworCWlmICh0YWcgPT0gVl9BU04xX0JJVF9TVFJJTkcpCisJCXJldHVybihpMmRfQVNOMV9CSVRfU1RSSU5HKGEscHApKTsKKwkJCisJcmV0PWEtPmxlbmd0aDsKKwlyPUFTTjFfb2JqZWN0X3NpemUoMCxyZXQsdGFnKTsKKwlpZiAocHAgPT0gTlVMTCkgcmV0dXJuKHIpOworCXA9ICpwcDsKKworCWlmICgodGFnID09IFZfQVNOMV9TRVFVRU5DRSkgfHwgKHRhZyA9PSBWX0FTTjFfU0VUKSkKKwkJY29uc3RydWN0ZWQ9MTsKKwllbHNlCisJCWNvbnN0cnVjdGVkPTA7CisJQVNOMV9wdXRfb2JqZWN0KCZwLGNvbnN0cnVjdGVkLHJldCx0YWcseGNsYXNzKTsKKwltZW1jcHkocCxhLT5kYXRhLGEtPmxlbmd0aCk7CisJcCs9YS0+bGVuZ3RoOworCSpwcD0gcDsKKwlyZXR1cm4ocik7CisJfQorCitBU04xX1NUUklORyAqZDJpX0FTTjFfYnl0ZXMoQVNOMV9TVFJJTkcgKiphLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsCisJICAgICBsb25nIGxlbmd0aCwgaW50IFB0YWcsIGludCBQY2xhc3MpCisJeworCUFTTjFfU1RSSU5HICpyZXQ9TlVMTDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwOworCXVuc2lnbmVkIGNoYXIgKnM7CisJbG9uZyBsZW47CisJaW50IGluZix0YWcseGNsYXNzOworCWludCBpPTA7CisKKwlpZiAoKGEgPT0gTlVMTCkgfHwgKCgqYSkgPT0gTlVMTCkpCisJCXsKKwkJaWYgKChyZXQ9QVNOMV9TVFJJTkdfbmV3KCkpID09IE5VTEwpIHJldHVybihOVUxMKTsKKwkJfQorCWVsc2UKKwkJcmV0PSgqYSk7CisKKwlwPSAqcHA7CisJaW5mPUFTTjFfZ2V0X29iamVjdCgmcCwmbGVuLCZ0YWcsJnhjbGFzcyxsZW5ndGgpOworCWlmIChpbmYgJiAweDgwKQorCQl7CisJCWk9QVNOMV9SX0JBRF9PQkpFQ1RfSEVBREVSOworCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKHRhZyAhPSBQdGFnKQorCQl7CisJCWk9QVNOMV9SX1dST05HX1RBRzsKKwkJZ290byBlcnI7CisJCX0KKworCWlmIChpbmYgJiBWX0FTTjFfQ09OU1RSVUNURUQpCisJCXsKKwkJQVNOMV9jb25zdF9DVFggYzsKKworCQljLnBwPXBwOworCQljLnA9cDsKKwkJYy5pbmY9aW5mOworCQljLnNsZW49bGVuOworCQljLnRhZz1QdGFnOworCQljLnhjbGFzcz1QY2xhc3M7CisJCWMubWF4PShsZW5ndGggPT0gMCk/MDoocCtsZW5ndGgpOworCQlpZiAoIWFzbjFfY29sbGF0ZV9wcmltaXRpdmUocmV0LCZjKSkgCisJCQlnb3RvIGVycjsgCisJCWVsc2UKKwkJCXsKKwkJCXA9Yy5wOworCQkJfQorCQl9CisJZWxzZQorCQl7CisJCWlmIChsZW4gIT0gMCkKKwkJCXsKKwkJCWlmICgocmV0LT5sZW5ndGggPCBsZW4pIHx8IChyZXQtPmRhdGEgPT0gTlVMTCkpCisJCQkJeworCQkJCWlmIChyZXQtPmRhdGEgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKHJldC0+ZGF0YSk7CisJCQkJcz0odW5zaWduZWQgY2hhciAqKU9QRU5TU0xfbWFsbG9jKChpbnQpbGVuICsgMSk7CisJCQkJaWYgKHMgPT0gTlVMTCkKKwkJCQkJeworCQkJCQlpPUVSUl9SX01BTExPQ19GQUlMVVJFOworCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCX0KKwkJCWVsc2UKKwkJCQlzPXJldC0+ZGF0YTsKKwkJCW1lbWNweShzLHAsKGludClsZW4pOworCQkJc1tsZW5dID0gJ1wwJzsKKwkJCXArPWxlbjsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJcz1OVUxMOworCQkJaWYgKHJldC0+ZGF0YSAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUocmV0LT5kYXRhKTsKKwkJCX0KKworCQlyZXQtPmxlbmd0aD0oaW50KWxlbjsKKwkJcmV0LT5kYXRhPXM7CisJCXJldC0+dHlwZT1QdGFnOworCQl9CisKKwlpZiAoYSAhPSBOVUxMKSAoKmEpPXJldDsKKwkqcHA9cDsKKwlyZXR1cm4ocmV0KTsKK2VycjoKKwlpZiAoKHJldCAhPSBOVUxMKSAmJiAoKGEgPT0gTlVMTCkgfHwgKCphICE9IHJldCkpKQorCQlBU04xX1NUUklOR19mcmVlKHJldCk7CisJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgZDJpX0FTTjFfYnl0ZXMsIGkpOworCXJldHVybihOVUxMKTsKKwl9CisKKworLyogV2UgYXJlIGFib3V0IHRvIHBhcnNlIDAuLm4gZDJpX0FTTjFfYnl0ZXMgb2JqZWN0cywgd2UgYXJlIHRvIGNvbGxhcHNlCisgKiB0aGVtIGludG8gdGhlIG9uZSBzdHJ1Y3R1cmUgdGhhdCBpcyB0aGVuIHJldHVybmVkICovCisvKiBUaGVyZSBoYXZlIGJlZW4gYSBmZXcgYnVnIGZpeGVzIGZvciB0aGlzIGZ1bmN0aW9uIGZyb20KKyAqIFBhdWwgS2VvZ2ggPHBhdWwua2VvZ2hAc3NlLmllPiwgbWFueSB0aGFua3MgdG8gaGltICovCitzdGF0aWMgaW50IGFzbjFfY29sbGF0ZV9wcmltaXRpdmUoQVNOMV9TVFJJTkcgKmEsIEFTTjFfY29uc3RfQ1RYICpjKQorCXsKKwlBU04xX1NUUklORyAqb3M9TlVMTDsKKwlCVUZfTUVNIGI7CisJaW50IG51bTsKKworCWIubGVuZ3RoPTA7CisJYi5tYXg9MDsKKwliLmRhdGE9TlVMTDsKKworCWlmIChhID09IE5VTEwpCisJCXsKKwkJYy0+ZXJyb3I9RVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSOworCQlnb3RvIGVycjsKKwkJfQorCisJbnVtPTA7CisJZm9yICg7OykKKwkJeworCQlpZiAoYy0+aW5mICYgMSkKKwkJCXsKKwkJCWMtPmVvcz1BU04xX2NvbnN0X2NoZWNrX2luZmluaXRlX2VuZCgmYy0+cCwKKwkJCQkobG9uZykoYy0+bWF4LWMtPnApKTsKKwkJCWlmIChjLT5lb3MpIGJyZWFrOworCQkJfQorCQllbHNlCisJCQl7CisJCQlpZiAoYy0+c2xlbiA8PSAwKSBicmVhazsKKwkJCX0KKworCQljLT5xPWMtPnA7CisJCWlmIChkMmlfQVNOMV9ieXRlcygmb3MsJmMtPnAsYy0+bWF4LWMtPnAsYy0+dGFnLGMtPnhjbGFzcykKKwkJCT09IE5VTEwpCisJCQl7CisJCQljLT5lcnJvcj1FUlJfUl9BU04xX0xJQjsKKwkJCWdvdG8gZXJyOworCQkJfQorCisJCWlmICghQlVGX01FTV9ncm93X2NsZWFuKCZiLG51bStvcy0+bGVuZ3RoKSkKKwkJCXsKKwkJCWMtPmVycm9yPUVSUl9SX0JVRl9MSUI7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJbWVtY3B5KCYoYi5kYXRhW251bV0pLG9zLT5kYXRhLG9zLT5sZW5ndGgpOworCQlpZiAoIShjLT5pbmYgJiAxKSkKKwkJCWMtPnNsZW4tPShjLT5wLWMtPnEpOworCQludW0rPW9zLT5sZW5ndGg7CisJCX0KKworCWlmICghYXNuMV9jb25zdF9GaW5pc2goYykpIGdvdG8gZXJyOworCisJYS0+bGVuZ3RoPW51bTsKKwlpZiAoYS0+ZGF0YSAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUoYS0+ZGF0YSk7CisJYS0+ZGF0YT0odW5zaWduZWQgY2hhciAqKWIuZGF0YTsKKwlpZiAob3MgIT0gTlVMTCkgQVNOMV9TVFJJTkdfZnJlZShvcyk7CisJcmV0dXJuKDEpOworZXJyOgorCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfY29sbGF0ZV9wcmltaXRpdmUsIGMtPmVycm9yKTsKKwlpZiAob3MgIT0gTlVMTCkgQVNOMV9TVFJJTkdfZnJlZShvcyk7CisJaWYgKGIuZGF0YSAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUoYi5kYXRhKTsKKwlyZXR1cm4oMCk7CisJfQorCmRpZmYgLS1naXQgYS9jcnlwdG8vYXNuMS9hX2QyaV9mcC5jIGIvY3J5cHRvL2FzbjEvYV9kMmlfZnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjg1MzJiCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2FzbjEvYV9kMmlfZnAuYwpAQCAtMCwwICsxLDI4NiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2J1Zi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKworCitzdGF0aWMgaW50IGFzbjFfZDJpX3JlYWRfYmlvKEJJTyAqaW4sIEJVRl9NRU0gKipwYik7CisKKyNpZm5kZWYgTk9fT0xEX0FTTjEKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKKwordm9pZCAqQVNOMV9kMmlfZnAodm9pZCAqKCp4bmV3KSh2b2lkKSwgZDJpX29mX3ZvaWQgKmQyaSwgRklMRSAqaW4sIHZvaWQgKip4KQorICAgICAgICB7CisgICAgICAgIEJJTyAqYjsKKyAgICAgICAgdm9pZCAqcmV0OworCisgICAgICAgIGlmICgoYj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpID09IE5VTEwpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9kMmlfZnAsIEVSUl9SX0JVRl9MSUIpOworICAgICAgICAgICAgICAgIHJldHVybihOVUxMKTsKKwkJfQorICAgICAgICBCSU9fc2V0X2ZwKGIsaW4sQklPX05PQ0xPU0UpOworICAgICAgICByZXQ9QVNOMV9kMmlfYmlvKHhuZXcsZDJpLGIseCk7CisgICAgICAgIEJJT19mcmVlKGIpOworICAgICAgICByZXR1cm4ocmV0KTsKKyAgICAgICAgfQorI2VuZGlmCisKK3ZvaWQgKkFTTjFfZDJpX2Jpbyh2b2lkICooKnhuZXcpKHZvaWQpLCBkMmlfb2Zfdm9pZCAqZDJpLCBCSU8gKmluLCB2b2lkICoqeCkKKwl7CisJQlVGX01FTSAqYiA9IE5VTEw7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKwl2b2lkICpyZXQ9TlVMTDsKKwlpbnQgbGVuOworCisJbGVuID0gYXNuMV9kMmlfcmVhZF9iaW8oaW4sICZiKTsKKwlpZihsZW4gPCAwKSBnb3RvIGVycjsKKworCXA9KHVuc2lnbmVkIGNoYXIgKiliLT5kYXRhOworCXJldD1kMmkoeCwmcCxsZW4pOworZXJyOgorCWlmIChiICE9IE5VTEwpIEJVRl9NRU1fZnJlZShiKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKKyNlbmRpZgorCit2b2lkICpBU04xX2l0ZW1fZDJpX2Jpbyhjb25zdCBBU04xX0lURU0gKml0LCBCSU8gKmluLCB2b2lkICp4KQorCXsKKwlCVUZfTUVNICpiID0gTlVMTDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwOworCXZvaWQgKnJldD1OVUxMOworCWludCBsZW47CisKKwlsZW4gPSBhc24xX2QyaV9yZWFkX2JpbyhpbiwgJmIpOworCWlmKGxlbiA8IDApIGdvdG8gZXJyOworCisJcD0oY29uc3QgdW5zaWduZWQgY2hhciAqKWItPmRhdGE7CisJcmV0PUFTTjFfaXRlbV9kMmkoeCwmcCxsZW4sIGl0KTsKK2VycjoKKwlpZiAoYiAhPSBOVUxMKSBCVUZfTUVNX2ZyZWUoYik7CisJcmV0dXJuKHJldCk7CisJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCit2b2lkICpBU04xX2l0ZW1fZDJpX2ZwKGNvbnN0IEFTTjFfSVRFTSAqaXQsIEZJTEUgKmluLCB2b2lkICp4KQorICAgICAgICB7CisgICAgICAgIEJJTyAqYjsKKyAgICAgICAgY2hhciAqcmV0OworCisgICAgICAgIGlmICgoYj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpID09IE5VTEwpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9pdGVtX2QyaV9mcCwgRVJSX1JfQlVGX0xJQik7CisgICAgICAgICAgICAgICAgcmV0dXJuKE5VTEwpOworCQl9CisgICAgICAgIEJJT19zZXRfZnAoYixpbixCSU9fTk9DTE9TRSk7CisgICAgICAgIHJldD1BU04xX2l0ZW1fZDJpX2JpbyhpdCxiLHgpOworICAgICAgICBCSU9fZnJlZShiKTsKKyAgICAgICAgcmV0dXJuKHJldCk7CisgICAgICAgIH0KKyNlbmRpZgorCisjZGVmaW5lIEhFQURFUl9TSVpFICAgOAorc3RhdGljIGludCBhc24xX2QyaV9yZWFkX2JpbyhCSU8gKmluLCBCVUZfTUVNICoqcGIpCisJeworCUJVRl9NRU0gKmI7CisJdW5zaWduZWQgY2hhciAqcDsKKwlpbnQgaTsKKwlBU04xX2NvbnN0X0NUWCBjOworCXNpemVfdCB3YW50PUhFQURFUl9TSVpFOworCWludCBlb3M9MDsKKwlzaXplX3Qgb2ZmPTA7CisJc2l6ZV90IGxlbj0wOworCisJYj1CVUZfTUVNX25ldygpOworCWlmIChiID09IE5VTEwpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9kMmlfcmVhZF9iaW8sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIC0xOworCQl9CisKKwlFUlJfY2xlYXJfZXJyb3IoKTsKKwlmb3IgKDs7KQorCQl7CisJCWlmICh3YW50ID49IChsZW4tb2ZmKSkKKwkJCXsKKwkJCXdhbnQtPShsZW4tb2ZmKTsKKworCQkJaWYgKGxlbiArIHdhbnQgPCBsZW4gfHwgIUJVRl9NRU1fZ3Jvd19jbGVhbihiLGxlbit3YW50KSkKKwkJCQl7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9kMmlfcmVhZF9iaW8sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQlpPUJJT19yZWFkKGluLCYoYi0+ZGF0YVtsZW5dKSx3YW50KTsKKwkJCWlmICgoaSA8IDApICYmICgobGVuLW9mZikgPT0gMCkpCisJCQkJeworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfZDJpX3JlYWRfYmlvLCBBU04xX1JfTk9UX0VOT1VHSF9EQVRBKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQlpZiAoaSA+IDApCisJCQkJeworCQkJCWlmIChsZW4raSA8IGxlbikKKwkJCQkJeworCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2QyaV9yZWFkX2JpbywgQVNOMV9SX1RPT19MT05HKTsKKwkJCQkJZ290byBlcnI7CisJCQkJCX0KKwkJCQlsZW4rPWk7CisJCQkJfQorCQkJfQorCQkvKiBlbHNlIGRhdGEgYWxyZWFkeSBsb2FkZWQgKi8KKworCQlwPSh1bnNpZ25lZCBjaGFyICopJihiLT5kYXRhW29mZl0pOworCQljLnA9cDsKKwkJYy5pbmY9QVNOMV9nZXRfb2JqZWN0KCYoYy5wKSwmKGMuc2xlbiksJihjLnRhZyksJihjLnhjbGFzcyksCisJCQlsZW4tb2ZmKTsKKwkJaWYgKGMuaW5mICYgMHg4MCkKKwkJCXsKKwkJCXVuc2lnbmVkIGxvbmcgZTsKKworCQkJZT1FUlJfR0VUX1JFQVNPTihFUlJfcGVla19lcnJvcigpKTsKKwkJCWlmIChlICE9IEFTTjFfUl9UT09fTE9ORykKKwkJCQlnb3RvIGVycjsKKwkJCWVsc2UKKwkJCQlFUlJfY2xlYXJfZXJyb3IoKTsgLyogY2xlYXIgZXJyb3IgKi8KKwkJCX0KKwkJaT1jLnAtcDsvKiBoZWFkZXIgbGVuZ3RoICovCisJCW9mZis9aTsJLyogZW5kIG9mIGRhdGEgKi8KKworCQlpZiAoYy5pbmYgJiAxKQorCQkJeworCQkJLyogbm8gZGF0YSBib2R5IHNvIGdvIHJvdW5kIGFnYWluICovCisJCQllb3MrKzsKKwkJCWlmIChlb3MgPCAwKQorCQkJCXsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2QyaV9yZWFkX2JpbywgQVNOMV9SX0hFQURFUl9UT09fTE9ORyk7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJd2FudD1IRUFERVJfU0laRTsKKwkJCX0KKwkJZWxzZSBpZiAoZW9zICYmIChjLnNsZW4gPT0gMCkgJiYgKGMudGFnID09IFZfQVNOMV9FT0MpKQorCQkJeworCQkJLyogZW9zIHZhbHVlLCBzbyBnbyBiYWNrIGFuZCByZWFkIGFub3RoZXIgaGVhZGVyICovCisJCQllb3MtLTsKKwkJCWlmIChlb3MgPD0gMCkKKwkJCQlicmVhazsKKwkJCWVsc2UKKwkJCQl3YW50PUhFQURFUl9TSVpFOworCQkJfQorCQllbHNlIAorCQkJeworCQkJLyogc3VjayBpbiBjLnNsZW4gYnl0ZXMgb2YgZGF0YSAqLworCQkJd2FudD1jLnNsZW47CisJCQlpZiAod2FudCA+IChsZW4tb2ZmKSkKKwkJCQl7CisJCQkJd2FudC09KGxlbi1vZmYpOworCQkJCWlmICh3YW50ID4gSU5UX01BWCAvKiBCSU9fcmVhZCB0YWtlcyBhbiBpbnQgbGVuZ3RoICovIHx8CisJCQkJCWxlbit3YW50IDwgbGVuKQorCQkJCQkJeworCQkJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9kMmlfcmVhZF9iaW8sIEFTTjFfUl9UT09fTE9ORyk7CisJCQkJCQlnb3RvIGVycjsKKwkJCQkJCX0KKwkJCQlpZiAoIUJVRl9NRU1fZ3Jvd19jbGVhbihiLGxlbit3YW50KSkKKwkJCQkJeworCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2QyaV9yZWFkX2JpbywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCXdoaWxlICh3YW50ID4gMCkKKwkJCQkJeworCQkJCQlpPUJJT19yZWFkKGluLCYoYi0+ZGF0YVtsZW5dKSx3YW50KTsKKwkJCQkJaWYgKGkgPD0gMCkKKwkJCQkJCXsKKwkJCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfZDJpX3JlYWRfYmlvLCBBU04xX1JfTk9UX0VOT1VHSF9EQVRBKTsKKwkJCQkJCWdvdG8gZXJyOworCQkJCQkJfQorCQkJCQkvKiBUaGlzIGNhbid0IG92ZXJmbG93IGJlY2F1c2UKKwkJCQkJICogfGxlbit3YW50fCBkaWRuJ3Qgb3ZlcmZsb3cuICovCisJCQkJCWxlbis9aTsKKwkJCQkJd2FudC09aTsKKwkJCQkJfQorCQkJCX0KKwkJCWlmIChvZmYgKyBjLnNsZW4gPCBvZmYpCisJCQkJeworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfZDJpX3JlYWRfYmlvLCBBU04xX1JfVE9PX0xPTkcpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCW9mZis9Yy5zbGVuOworCQkJaWYgKGVvcyA8PSAwKQorCQkJCXsKKwkJCQlicmVhazsKKwkJCQl9CisJCQllbHNlCisJCQkJd2FudD1IRUFERVJfU0laRTsKKwkJCX0KKwkJfQorCisJaWYgKG9mZiA+IElOVF9NQVgpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9kMmlfcmVhZF9iaW8sIEFTTjFfUl9UT09fTE9ORyk7CisJCWdvdG8gZXJyOworCQl9CisKKwkqcGIgPSBiOworCXJldHVybiBvZmY7CitlcnI6CisJaWYgKGIgIT0gTlVMTCkgQlVGX01FTV9mcmVlKGIpOworCXJldHVybiAtMTsKKwl9CmRpZmYgLS1naXQgYS9jcnlwdG8vYXNuMS9hX2R1cC5jIGIvY3J5cHRvL2FzbjEvYV9kdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWMxYzVmCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2FzbjEvYV9kdXAuYwpAQCAtMCwwICsxLDEwMyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorCisKK3ZvaWQgKkFTTjFfZHVwKGkyZF9vZl92b2lkICppMmQsIGQyaV9vZl92b2lkICpkMmksIHZvaWQgKngpCisJeworCXVuc2lnbmVkIGNoYXIgKmIsKnA7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDI7CisJaW50IGk7CisJY2hhciAqcmV0OworCisJaWYgKHggPT0gTlVMTCkgcmV0dXJuKE5VTEwpOworCisJaT1pMmQoeCxOVUxMKTsKKwliPU9QRU5TU0xfbWFsbG9jKGkrMTApOworCWlmIChiID09IE5VTEwpCisJCXsgT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9kdXAsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsgcmV0dXJuKE5VTEwpOyB9CisJcD0gYjsKKwlpPWkyZCh4LCZwKTsKKwlwMj0gYjsKKwlyZXQ9ZDJpKE5VTEwsJnAyLGkpOworCU9QRU5TU0xfZnJlZShiKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKKy8qIEFTTjFfSVRFTSB2ZXJzaW9uIG9mIGR1cDogdGhpcyBmb2xsb3dzIHRoZSBtb2RlbCBhYm92ZSBleGNlcHQgd2UgZG9uJ3QgbmVlZAorICogdG8gYWxsb2NhdGUgdGhlIGJ1ZmZlci4gQXQgc29tZSBwb2ludCB0aGlzIGNvdWxkIGJlIHJld3JpdHRlbiB0byBkaXJlY3RseSBkdXAKKyAqIHRoZSB1bmRlcmx5aW5nIHN0cnVjdHVyZSBpbnN0ZWFkIG9mIGRvaW5nIGFuZCBlbmNvZGUgYW5kIGRlY29kZS4gKi8KK3ZvaWQgKkFTTjFfaXRlbV9kdXAoY29uc3QgQVNOMV9JVEVNICppdCwgdm9pZCAqeCkKKwl7CisJdW5zaWduZWQgY2hhciAqYiA9IE5VTEw7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKwlsb25nIGk7CisJdm9pZCAqcmV0OworCisJaWYgKHggPT0gTlVMTCkgcmV0dXJuKE5VTEwpOworCisJaT1BU04xX2l0ZW1faTJkKHgsJmIsaXQpOworCWlmIChiID09IE5VTEwpCisJCXsgT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9pdGVtX2R1cCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOyByZXR1cm4oTlVMTCk7IH0KKwlwPSBiOworCXJldD1BU04xX2l0ZW1fZDJpKE5VTEwsJnAsaSwgaXQpOworCU9QRU5TU0xfZnJlZShiKTsKKwlyZXR1cm4ocmV0KTsKKwl9CmRpZmYgLS1naXQgYS9jcnlwdG8vYXNuMS9hX2VudW0uYyBiL2NyeXB0by9hc24xL2FfZW51bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZDIzN2EKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYXNuMS9hX2VudW0uYwpAQCAtMCwwICsxLDE4MSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorCisKKy8qIAorICogQ29kZSBmb3IgRU5VTUVSQVRFRCB0eXBlOiBpZGVudGljYWwgdG8gSU5URUdFUiBhcGFydCBmcm9tIGEgZGlmZmVyZW50IHRhZy4KKyAqIGZvciBjb21tZW50cyBvbiBlbmNvZGluZyBzZWUgYV9pbnQuYworICovCisKK2ludCBBU04xX0VOVU1FUkFURURfc2V0KEFTTjFfRU5VTUVSQVRFRCAqYSwgbG9uZyB2KQorCXsKKwlpbnQgaixrOworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGNoYXIgYnVmW3NpemVvZihsb25nKSsxXTsKKwlsb25nIGQ7CisKKwlhLT50eXBlPVZfQVNOMV9FTlVNRVJBVEVEOworCWlmIChhLT5sZW5ndGggPCAoaW50KShzaXplb2YobG9uZykrMSkpCisJCXsKKwkJaWYgKGEtPmRhdGEgIT0gTlVMTCkKKwkJCU9QRU5TU0xfZnJlZShhLT5kYXRhKTsKKwkJaWYgKChhLT5kYXRhPSh1bnNpZ25lZCBjaGFyICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKGxvbmcpKzEpKSAhPSBOVUxMKQorCQkJbWVtc2V0KChjaGFyICopYS0+ZGF0YSwwLHNpemVvZihsb25nKSsxKTsKKwkJfQorCWlmIChhLT5kYXRhID09IE5VTEwpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9FTlVNRVJBVEVEX3NldCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4oMCk7CisJCX0KKwlkPXY7CisJaWYgKGQgPCAwKQorCQl7CisJCWQ9IC1kOworCQlhLT50eXBlPVZfQVNOMV9ORUdfRU5VTUVSQVRFRDsKKwkJfQorCisJZm9yIChpPTA7IGk8c2l6ZW9mKGxvbmcpOyBpKyspCisJCXsKKwkJaWYgKGQgPT0gMCkgYnJlYWs7CisJCWJ1ZltpXT0oaW50KWQmMHhmZjsKKwkJZD4+PTg7CisJCX0KKwlqPTA7CisJZm9yIChrPWktMTsgayA+PTA7IGstLSkKKwkJYS0+ZGF0YVtqKytdPWJ1ZltrXTsKKwlhLT5sZW5ndGg9ajsKKwlyZXR1cm4oMSk7CisJfQorCitsb25nIEFTTjFfRU5VTUVSQVRFRF9nZXQoQVNOMV9FTlVNRVJBVEVEICphKQorCXsKKwlpbnQgbmVnPTAsaTsKKwlsb25nIHI9MDsKKworCWlmIChhID09IE5VTEwpIHJldHVybigwTCk7CisJaT1hLT50eXBlOworCWlmIChpID09IFZfQVNOMV9ORUdfRU5VTUVSQVRFRCkKKwkJbmVnPTE7CisJZWxzZSBpZiAoaSAhPSBWX0FTTjFfRU5VTUVSQVRFRCkKKwkJcmV0dXJuIC0xOworCQorCWlmIChhLT5sZW5ndGggPiAoaW50KXNpemVvZihsb25nKSkKKwkJeworCQkvKiBobW0uLi4gYSBiaXQgdWdseSAqLworCQlyZXR1cm4oMHhmZmZmZmZmZkwpOworCQl9CisJaWYgKGEtPmRhdGEgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGk9MDsgaTxhLT5sZW5ndGg7IGkrKykKKwkJeworCQlyPDw9ODsKKwkJcnw9KHVuc2lnbmVkIGNoYXIpYS0+ZGF0YVtpXTsKKwkJfQorCWlmIChuZWcpIHI9IC1yOworCXJldHVybihyKTsKKwl9CisKK0FTTjFfRU5VTUVSQVRFRCAqQk5fdG9fQVNOMV9FTlVNRVJBVEVEKEJJR05VTSAqYm4sIEFTTjFfRU5VTUVSQVRFRCAqYWkpCisJeworCUFTTjFfRU5VTUVSQVRFRCAqcmV0OworCWludCBsZW4sajsKKworCWlmIChhaSA9PSBOVUxMKQorCQlyZXQ9TV9BU04xX0VOVU1FUkFURURfbmV3KCk7CisJZWxzZQorCQlyZXQ9YWk7CisJaWYgKHJldCA9PSBOVUxMKQorCQl7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEJOX3RvX0FTTjFfRU5VTUVSQVRFRCwgQVNOMV9SX05FU1RFRF9BU04xX0VSUk9SKTsKKwkJZ290byBlcnI7CisJCX0KKwlpZihCTl9pc19uZWdhdGl2ZShibikpIHJldC0+dHlwZSA9IFZfQVNOMV9ORUdfRU5VTUVSQVRFRDsKKwllbHNlIHJldC0+dHlwZT1WX0FTTjFfRU5VTUVSQVRFRDsKKwlqPUJOX251bV9iaXRzKGJuKTsKKwlsZW49KChqID09IDApPzA6KChqLzgpKzEpKTsKKwlpZiAocmV0LT5sZW5ndGggPCBsZW4rNCkKKwkJeworCQl1bnNpZ25lZCBjaGFyICpuZXdfZGF0YT1PUEVOU1NMX3JlYWxsb2MocmV0LT5kYXRhLCBsZW4rNCk7CisJCWlmICghbmV3X2RhdGEpCisJCQl7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBCTl90b19BU04xX0VOVU1FUkFURUQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlyZXQtPmRhdGE9bmV3X2RhdGE7CisJCX0KKworCXJldC0+bGVuZ3RoPUJOX2JuMmJpbihibixyZXQtPmRhdGEpOworCXJldHVybihyZXQpOworZXJyOgorCWlmIChyZXQgIT0gYWkpIE1fQVNOMV9FTlVNRVJBVEVEX2ZyZWUocmV0KTsKKwlyZXR1cm4oTlVMTCk7CisJfQorCitCSUdOVU0gKkFTTjFfRU5VTUVSQVRFRF90b19CTihBU04xX0VOVU1FUkFURUQgKmFpLCBCSUdOVU0gKmJuKQorCXsKKwlCSUdOVU0gKnJldDsKKworCWlmICgocmV0PUJOX2JpbjJibihhaS0+ZGF0YSxhaS0+bGVuZ3RoLGJuKSkgPT0gTlVMTCkKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9FTlVNRVJBVEVEX3RvX0JOLCBBU04xX1JfQk5fTElCKTsKKwllbHNlIGlmKGFpLT50eXBlID09IFZfQVNOMV9ORUdfRU5VTUVSQVRFRCkgQk5fc2V0X25lZ2F0aXZlKHJldCwxKTsKKwlyZXR1cm4ocmV0KTsKKwl9CmRpZmYgLS1naXQgYS9jcnlwdG8vYXNuMS9hX2dlbnRtLmMgYi9jcnlwdG8vYXNuMS9hX2dlbnRtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI4ZDc4ZQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9hc24xL2FfZ2VudG0uYwpAQCAtMCwwICsxLDI1NSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvdGltZV9zdXBwb3J0Lmg+CisKKworaW50IGFzbjFfZ2VuZXJhbGl6ZWR0aW1lX3RvX3RtKHN0cnVjdCB0bSAqdG0sIGNvbnN0IEFTTjFfR0VORVJBTElaRURUSU1FICpkKQorCXsKKwlzdGF0aWMgY29uc3QgaW50IG1pbls5XT17IDAsIDAsIDEsIDEsIDAsIDAsIDAsIDAsIDB9OworCXN0YXRpYyBjb25zdCBpbnQgbWF4WzldPXs5OSwgOTksMTIsMzEsMjMsNTksNTksMTIsNTl9OworCWNoYXIgKmE7CisJaW50IG4saSxsLG87CisKKwlpZiAoZC0+dHlwZSAhPSBWX0FTTjFfR0VORVJBTElaRURUSU1FKSByZXR1cm4oMCk7CisJbD1kLT5sZW5ndGg7CisJYT0oY2hhciAqKWQtPmRhdGE7CisJbz0wOworCS8qIEdFTkVSQUxJWkVEVElNRSBpcyBzaW1pbGFyIHRvIFVUQ1RJTUUgZXhjZXB0IHRoZSB5ZWFyIGlzCisgICAgICAgICAqIHJlcHJlc2VudGVkIGFzIFlZWVkuIFRoaXMgc3R1ZmYgdHJlYXRzIGV2ZXJ5dGhpbmcgYXMgYSB0d28gZGlnaXQKKyAgICAgICAgICogZmllbGQgc28gbWFrZSBmaXJzdCB0d28gZmllbGRzIDAwIHRvIDk5CisgICAgICAgICAqLworCWlmIChsIDwgMTMpIGdvdG8gZXJyOworCWZvciAoaT0wOyBpPDc7IGkrKykKKwkJeworCQlpZiAoKGkgPT0gNikgJiYgKChhW29dID09ICdaJykgfHwKKwkJCShhW29dID09ICcrJykgfHwgKGFbb10gPT0gJy0nKSkpCisJCQl7CisJCQlpKys7CisJCQlpZiAodG0pCisJCQkJdG0tPnRtX3NlYyA9IDA7CisJCQlicmVhazsKKwkJCX0KKwkJaWYgKChhW29dIDwgJzAnKSB8fCAoYVtvXSA+ICc5JykpIGdvdG8gZXJyOworCQluPSBhW29dLScwJzsKKwkJaWYgKCsrbyA+IGwpIGdvdG8gZXJyOworCisJCWlmICgoYVtvXSA8ICcwJykgfHwgKGFbb10gPiAnOScpKSBnb3RvIGVycjsKKwkJbj0obioxMCkrIGFbb10tJzAnOworCQlpZiAoKytvID4gbCkgZ290byBlcnI7CisKKwkJaWYgKChuIDwgbWluW2ldKSB8fCAobiA+IG1heFtpXSkpIGdvdG8gZXJyOworCQlpZiAodG0pCisJCQl7CisJCQlzd2l0Y2goaSkKKwkJCQl7CisJCQljYXNlIDA6CisJCQkJdG0tPnRtX3llYXIgPSBuICogMTAwIC0gMTkwMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQl0bS0+dG1feWVhciArPSBuOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCXRtLT50bV9tb24gPSBuIC0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQl0bS0+dG1fbWRheSA9IG47CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CisJCQkJdG0tPnRtX2hvdXIgPSBuOworCQkJCWJyZWFrOworCQkJY2FzZSA1OgorCQkJCXRtLT50bV9taW4gPSBuOworCQkJCWJyZWFrOworCQkJY2FzZSA2OgorCQkJCXRtLT50bV9zZWMgPSBuOworCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCS8qIE9wdGlvbmFsIGZyYWN0aW9uYWwgc2Vjb25kczogZGVjaW1hbCBwb2ludCBmb2xsb3dlZCBieSBvbmUKKwkgKiBvciBtb3JlIGRpZ2l0cy4KKwkgKi8KKwlpZiAoYVtvXSA9PSAnLicpCisJCXsKKwkJaWYgKCsrbyA+IGwpIGdvdG8gZXJyOworCQlpID0gbzsKKwkJd2hpbGUgKChhW29dID49ICcwJykgJiYgKGFbb10gPD0gJzknKSAmJiAobyA8PSBsKSkKKwkJCW8rKzsKKwkJLyogTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBkaWdpdCBhZnRlciBkZWNpbWFsIHBvaW50ICovCisJCWlmIChpID09IG8pIGdvdG8gZXJyOworCQl9CisKKwlpZiAoYVtvXSA9PSAnWicpCisJCW8rKzsKKwllbHNlIGlmICgoYVtvXSA9PSAnKycpIHx8IChhW29dID09ICctJykpCisJCXsKKwkJaW50IG9mZnNpZ24gPSBhW29dID09ICctJyA/IC0xIDogMSwgb2Zmc2V0ID0gMDsKKwkJbysrOworCQlpZiAobys0ID4gbCkgZ290byBlcnI7CisJCWZvciAoaT03OyBpPDk7IGkrKykKKwkJCXsKKwkJCWlmICgoYVtvXSA8ICcwJykgfHwgKGFbb10gPiAnOScpKSBnb3RvIGVycjsKKwkJCW49IGFbb10tJzAnOworCQkJbysrOworCQkJaWYgKChhW29dIDwgJzAnKSB8fCAoYVtvXSA+ICc5JykpIGdvdG8gZXJyOworCQkJbj0obioxMCkrIGFbb10tJzAnOworCQkJaWYgKChuIDwgbWluW2ldKSB8fCAobiA+IG1heFtpXSkpIGdvdG8gZXJyOworCQkJaWYgKHRtKQorCQkJCXsKKwkJCQlpZiAoaSA9PSA3KQorCQkJCQlvZmZzZXQgPSBuICogMzYwMDsKKwkJCQllbHNlIGlmIChpID09IDgpCisJCQkJCW9mZnNldCArPSBuICogNjA7CisJCQkJfQorCQkJbysrOworCQkJfQorCQlpZiAob2Zmc2V0ICYmICFPUEVOU1NMX2dtdGltZV9hZGoodG0sIDAsIG9mZnNldCAqIG9mZnNpZ24pKQorCQkJcmV0dXJuIDA7CisJCX0KKwllbHNlIGlmIChhW29dKQorCQl7CisJCS8qIE1pc3NpbmcgdGltZSB6b25lIGluZm9ybWF0aW9uLiAqLworCQlnb3RvIGVycjsKKwkJfQorCXJldHVybihvID09IGwpOworZXJyOgorCXJldHVybigwKTsKKwl9CisKK2ludCBBU04xX0dFTkVSQUxJWkVEVElNRV9jaGVjayhjb25zdCBBU04xX0dFTkVSQUxJWkVEVElNRSAqZCkKKwl7CisJcmV0dXJuIGFzbjFfZ2VuZXJhbGl6ZWR0aW1lX3RvX3RtKE5VTEwsIGQpOworCX0KKworaW50IEFTTjFfR0VORVJBTElaRURUSU1FX3NldF9zdHJpbmcoQVNOMV9HRU5FUkFMSVpFRFRJTUUgKnMsIGNvbnN0IGNoYXIgKnN0cikKKwl7CisJQVNOMV9HRU5FUkFMSVpFRFRJTUUgdDsKKworCXQudHlwZT1WX0FTTjFfR0VORVJBTElaRURUSU1FOworCXQubGVuZ3RoPXN0cmxlbihzdHIpOworCXQuZGF0YT0odW5zaWduZWQgY2hhciAqKXN0cjsKKwlpZiAoQVNOMV9HRU5FUkFMSVpFRFRJTUVfY2hlY2soJnQpKQorCQl7CisJCWlmIChzICE9IE5VTEwpCisJCQl7CisJCQlpZiAoIUFTTjFfU1RSSU5HX3NldCgoQVNOMV9TVFJJTkcgKilzLAorCQkJCSh1bnNpZ25lZCBjaGFyICopc3RyLHQubGVuZ3RoKSkKKwkJCQlyZXR1cm4gMDsKKwkJCXMtPnR5cGU9Vl9BU04xX0dFTkVSQUxJWkVEVElNRTsKKwkJCX0KKwkJcmV0dXJuKDEpOworCQl9CisJZWxzZQorCQlyZXR1cm4oMCk7CisJfQorCitBU04xX0dFTkVSQUxJWkVEVElNRSAqQVNOMV9HRU5FUkFMSVpFRFRJTUVfc2V0KEFTTjFfR0VORVJBTElaRURUSU1FICpzLAorCSAgICAgdGltZV90IHQpCisJeworCQlyZXR1cm4gQVNOMV9HRU5FUkFMSVpFRFRJTUVfYWRqKHMsIHQsIDAsIDApOworCX0KKworQVNOMV9HRU5FUkFMSVpFRFRJTUUgKkFTTjFfR0VORVJBTElaRURUSU1FX2FkaihBU04xX0dFTkVSQUxJWkVEVElNRSAqcywKKwkgICAgIHRpbWVfdCB0LCBpbnQgb2Zmc2V0X2RheSwgbG9uZyBvZmZzZXRfc2VjKQorCXsKKwljaGFyICpwOworCXN0cnVjdCB0bSAqdHM7CisJc3RydWN0IHRtIGRhdGE7CisJc2l6ZV90IGxlbiA9IDIwOyAKKworCWlmIChzID09IE5VTEwpCisJCXM9TV9BU04xX0dFTkVSQUxJWkVEVElNRV9uZXcoKTsKKwlpZiAocyA9PSBOVUxMKQorCQlyZXR1cm4oTlVMTCk7CisKKwl0cz1PUEVOU1NMX2dtdGltZSgmdCwgJmRhdGEpOworCWlmICh0cyA9PSBOVUxMKQorCQlyZXR1cm4oTlVMTCk7CisKKwlpZiAob2Zmc2V0X2RheSB8fCBvZmZzZXRfc2VjKQorCQl7IAorCQlpZiAoIU9QRU5TU0xfZ210aW1lX2Fkaih0cywgb2Zmc2V0X2RheSwgb2Zmc2V0X3NlYykpCisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJcD0oY2hhciAqKXMtPmRhdGE7CisJaWYgKChwID09IE5VTEwpIHx8ICgoc2l6ZV90KXMtPmxlbmd0aCA8IGxlbikpCisJCXsKKwkJcD1PUEVOU1NMX21hbGxvYyhsZW4pOworCQlpZiAocCA9PSBOVUxMKQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9HRU5FUkFMSVpFRFRJTUVfYWRqLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlyZXR1cm4oTlVMTCk7CisJCQl9CisJCWlmIChzLT5kYXRhICE9IE5VTEwpCisJCQlPUEVOU1NMX2ZyZWUocy0+ZGF0YSk7CisJCXMtPmRhdGE9KHVuc2lnbmVkIGNoYXIgKilwOworCQl9CisKKwlCSU9fc25wcmludGYocCxsZW4sIiUwNGQlMDJkJTAyZCUwMmQlMDJkJTAyZFoiLHRzLT50bV95ZWFyICsgMTkwMCwKKwkJICAgICB0cy0+dG1fbW9uKzEsdHMtPnRtX21kYXksdHMtPnRtX2hvdXIsdHMtPnRtX21pbix0cy0+dG1fc2VjKTsKKwlzLT5sZW5ndGg9c3RybGVuKHApOworCXMtPnR5cGU9Vl9BU04xX0dFTkVSQUxJWkVEVElNRTsKKyNpZmRlZiBDSEFSU0VUX0VCQ0RJQ19ub3QKKwllYmNkaWMyYXNjaWkocy0+ZGF0YSwgcy0+ZGF0YSwgcy0+bGVuZ3RoKTsKKyNlbmRpZgorCXJldHVybihzKTsKKwl9CmRpZmYgLS1naXQgYS9jcnlwdG8vYXNuMS9hX2kyZF9mcC5jIGIvY3J5cHRvL2FzbjEvYV9pMmRfZnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWU0MGQzCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2FzbjEvYV9pMmRfZnAuYwpAQCAtMCwwICsxLDE1NCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorCisKK2ludCBBU04xX2kyZF9mcChpMmRfb2Zfdm9pZCAqaTJkLCBGSUxFICpvdXQsIHZvaWQgKngpCisgICAgICAgIHsKKyAgICAgICAgQklPICpiOworICAgICAgICBpbnQgcmV0OworCisgICAgICAgIGlmICgoYj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpID09IE5VTEwpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9pMmRfZnAsIEVSUl9SX0JVRl9MSUIpOworICAgICAgICAgICAgICAgIHJldHVybigwKTsKKwkJfQorICAgICAgICBCSU9fc2V0X2ZwKGIsb3V0LEJJT19OT0NMT1NFKTsKKyAgICAgICAgcmV0PUFTTjFfaTJkX2JpbyhpMmQsYix4KTsKKyAgICAgICAgQklPX2ZyZWUoYik7CisgICAgICAgIHJldHVybihyZXQpOworICAgICAgICB9CisKK2ludCBBU04xX2kyZF9iaW8oaTJkX29mX3ZvaWQgKmkyZCwgQklPICpvdXQsIHVuc2lnbmVkIGNoYXIgKngpCisJeworCWNoYXIgKmI7CisJdW5zaWduZWQgY2hhciAqcDsKKwlpbnQgaSxqPTAsbixyZXQ9MTsKKworCW49aTJkKHgsTlVMTCk7CisJYj0oY2hhciAqKU9QRU5TU0xfbWFsbG9jKG4pOworCWlmIChiID09IE5VTEwpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9pMmRfYmlvLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybigwKTsKKwkJfQorCisJcD0odW5zaWduZWQgY2hhciAqKWI7CisJaTJkKHgsJnApOworCQorCWZvciAoOzspCisJCXsKKwkJaT1CSU9fd3JpdGUob3V0LCYoYltqXSksbik7CisJCWlmIChpID09IG4pIGJyZWFrOworCQlpZiAoaSA8PSAwKQorCQkJeworCQkJcmV0PTA7CisJCQlicmVhazsKKwkJCX0KKwkJais9aTsKKwkJbi09aTsKKwkJfQorCU9QRU5TU0xfZnJlZShiKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK2ludCBBU04xX2l0ZW1faTJkX2ZwKGNvbnN0IEFTTjFfSVRFTSAqaXQsIEZJTEUgKm91dCwgdm9pZCAqeCkKKyAgICAgICAgeworICAgICAgICBCSU8gKmI7CisgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgaWYgKChiPUJJT19uZXcoQklPX3NfZmlsZSgpKSkgPT0gTlVMTCkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2l0ZW1faTJkX2ZwLCBFUlJfUl9CVUZfTElCKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisJCX0KKyAgICAgICAgQklPX3NldF9mcChiLG91dCxCSU9fTk9DTE9TRSk7CisgICAgICAgIHJldD1BU04xX2l0ZW1faTJkX2JpbyhpdCxiLHgpOworICAgICAgICBCSU9fZnJlZShiKTsKKyAgICAgICAgcmV0dXJuKHJldCk7CisgICAgICAgIH0KKworaW50IEFTTjFfaXRlbV9pMmRfYmlvKGNvbnN0IEFTTjFfSVRFTSAqaXQsIEJJTyAqb3V0LCB2b2lkICp4KQorCXsKKwl1bnNpZ25lZCBjaGFyICpiID0gTlVMTDsKKwlpbnQgaSxqPTAsbixyZXQ9MTsKKworCW4gPSBBU04xX2l0ZW1faTJkKHgsICZiLCBpdCk7CisJaWYgKGIgPT0gTlVMTCkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2l0ZW1faTJkX2JpbywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4oMCk7CisJCX0KKworCWZvciAoOzspCisJCXsKKwkJaT1CSU9fd3JpdGUob3V0LCYoYltqXSksbik7CisJCWlmIChpID09IG4pIGJyZWFrOworCQlpZiAoaSA8PSAwKQorCQkJeworCQkJcmV0PTA7CisJCQlicmVhazsKKwkJCX0KKwkJais9aTsKKwkJbi09aTsKKwkJfQorCU9QRU5TU0xfZnJlZShiKTsKKwlyZXR1cm4ocmV0KTsKKwl9CmRpZmYgLS1naXQgYS9jcnlwdG8vYXNuMS9hX2ludC5jIGIvY3J5cHRvL2FzbjEvYV9pbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDdlMjI1Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2FzbjEvYV9pbnQuYwpAQCAtMCwwICsxLDQ1NCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorCisKK0FTTjFfSU5URUdFUiAqQVNOMV9JTlRFR0VSX2R1cChjb25zdCBBU04xX0lOVEVHRVIgKngpCit7IHJldHVybiBNX0FTTjFfSU5URUdFUl9kdXAoeCk7fQorCitpbnQgQVNOMV9JTlRFR0VSX2NtcChjb25zdCBBU04xX0lOVEVHRVIgKngsIGNvbnN0IEFTTjFfSU5URUdFUiAqeSkKKwl7IAorCWludCBuZWcsIHJldDsKKwkvKiBDb21wYXJlIHNpZ25zICovCisJbmVnID0geC0+dHlwZSAmIFZfQVNOMV9ORUc7CisJaWYgKG5lZyAhPSAoeS0+dHlwZSAmIFZfQVNOMV9ORUcpKQorCQl7CisJCWlmIChuZWcpCisJCQlyZXR1cm4gLTE7CisJCWVsc2UKKwkJCXJldHVybiAxOworCQl9CisKKwlyZXQgPSBBU04xX1NUUklOR19jbXAoeCwgeSk7CisKKwlpZiAobmVnKQorCQlyZXR1cm4gLXJldDsKKwllbHNlCisJCXJldHVybiByZXQ7CisJfQorCQorCisvKiAKKyAqIFRoaXMgY29udmVydHMgYW4gQVNOMSBJTlRFR0VSIGludG8gaXRzIGNvbnRlbnQgZW5jb2RpbmcuCisgKiBUaGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gaXMgYW4gQVNOMV9TVFJJTkcgd2hvc2UgZGF0YSBpcyBhIGJpZyBlbmRpYW4KKyAqIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZSwgaWdub3JpbmcgdGhlIHNpZ24uIFRoZSBzaWduIGlzIGRldGVybWluZWQgYnkKKyAqIHRoZSB0eXBlOiBWX0FTTjFfSU5URUdFUiBmb3IgcG9zaXRpdmUgYW5kIFZfQVNOMV9ORUdfSU5URUdFUiBmb3IgbmVnYXRpdmUuIAorICoKKyAqIFBvc2l0aXZlIGludGVnZXJzIGFyZSBubyBwcm9ibGVtOiB0aGV5IGFyZSBhbG1vc3QgdGhlIHNhbWUgYXMgdGhlIERFUgorICogZW5jb2RpbmcsIGV4Y2VwdCBpZiB0aGUgZmlyc3QgYnl0ZSBpcyA+PSAweDgwIHdlIG5lZWQgdG8gYWRkIGEgemVybyBwYWQuCisgKgorICogTmVnYXRpdmUgaW50ZWdlcnMgYXJlIGEgYml0IHRyaWNraWVyLi4uCisgKiBUaGUgREVSIHJlcHJlc2VudGF0aW9uIG9mIG5lZ2F0aXZlIGludGVnZXJzIGlzIGluIDJzIGNvbXBsZW1lbnQgZm9ybS4KKyAqIFRoZSBpbnRlcm5hbCBmb3JtIGlzIGNvbnZlcnRlZCBieSBjb21wbGVtZW50aW5nIGVhY2ggb2N0ZXQgYW5kIGZpbmFsbHkgCisgKiBhZGRpbmcgb25lIHRvIHRoZSByZXN1bHQuIFRoaXMgY2FuIGJlIGRvbmUgbGVzcyBtZXNzaWx5IHdpdGggYSBsaXR0bGUgdHJpY2suCisgKiBJZiB0aGUgaW50ZXJuYWwgZm9ybSBoYXMgdHJhaWxpbmcgemVyb2VzIHRoZW4gdGhleSB3aWxsIGJlY29tZSBGRiBieSB0aGUKKyAqIGNvbXBsZW1lbnQgYW5kIDAgYnkgdGhlIGFkZCBvbmUgKGR1ZSB0byBjYXJyeSkgc28ganVzdCBjb3B5IGFzIG1hbnkgdHJhaWxpbmcgCisgKiB6ZXJvcyB0byB0aGUgZGVzdGluYXRpb24gYXMgdGhlcmUgYXJlIGluIHRoZSBzb3VyY2UuIFRoZSBjYXJyeSB3aWxsIGFkZCBvbmUKKyAqIHRvIHRoZSBsYXN0IG5vbmUgemVybyBvY3RldDogc28gY29tcGxlbWVudCB0aGlzIG9jdGV0IGFuZCBhZGQgb25lIGFuZCBmaW5hbGx5CisgKiBjb21wbGVtZW50IGFueSBsZWZ0IG92ZXIgdW50aWwgeW91IGdldCB0byB0aGUgc3RhcnQgb2YgdGhlIHN0cmluZy4KKyAqCisgKiBQYWRkaW5nIGlzIGEgbGl0dGxlIHRyaWNraWVyIHRvby4gSWYgdGhlIGZpcnN0IGJ5dGVzIGlzID4gMHg4MCB0aGVuIHdlIHBhZAorICogd2l0aCAweGZmLiBIb3dldmVyIGlmIHRoZSBmaXJzdCBieXRlIGlzIDB4ODAgYW5kIG9uZSBvZiB0aGUgZm9sbG93aW5nIGJ5dGVzCisgKiBpcyBub24temVybyB3ZSBwYWQgd2l0aCAweGZmLiBUaGUgcmVhc29uIGZvciB0aGlzIGRpc3RpbmN0aW9uIGlzIHRoYXQgMHg4MAorICogZm9sbG93ZWQgYnkgb3B0aW9uYWwgemVyb3MgaXNuJ3QgcGFkZGVkLgorICovCisKK2ludCBpMmNfQVNOMV9JTlRFR0VSKEFTTjFfSU5URUdFUiAqYSwgdW5zaWduZWQgY2hhciAqKnBwKQorCXsKKwlpbnQgcGFkPTAscmV0LGksbmVnOworCXVuc2lnbmVkIGNoYXIgKnAsKm4scGI9MDsKKworCWlmIChhID09IE5VTEwpIHJldHVybigwKTsKKwluZWc9YS0+dHlwZSAmIFZfQVNOMV9ORUc7CisJaWYgKGEtPmxlbmd0aCA9PSAwKQorCQlyZXQ9MTsKKwllbHNlCisJCXsKKwkJcmV0PWEtPmxlbmd0aDsKKwkJaT1hLT5kYXRhWzBdOworCQlpZiAoIW5lZyAmJiAoaSA+IDEyNykpIHsKKwkJCXBhZD0xOworCQkJcGI9MDsKKwkJfSBlbHNlIGlmKG5lZykgeworCQkJaWYoaT4xMjgpIHsKKwkJCQlwYWQ9MTsKKwkJCQlwYj0weEZGOworCQkJfSBlbHNlIGlmKGkgPT0gMTI4KSB7CisJCQkvKgorCQkJICogU3BlY2lhbCBjYXNlOiBpZiBhbnkgb3RoZXIgYnl0ZXMgbm9uIHplcm8gd2UgcGFkOgorCQkJICogb3RoZXJ3aXNlIHdlIGRvbid0LgorCQkJICovCisJCQkJZm9yKGkgPSAxOyBpIDwgYS0+bGVuZ3RoOyBpKyspIGlmKGEtPmRhdGFbaV0pIHsKKwkJCQkJCXBhZD0xOworCQkJCQkJcGI9MHhGRjsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXQrPXBhZDsKKwkJfQorCWlmIChwcCA9PSBOVUxMKSByZXR1cm4ocmV0KTsKKwlwPSAqcHA7CisKKwlpZiAocGFkKSAqKHArKyk9cGI7CisJaWYgKGEtPmxlbmd0aCA9PSAwKSAqKHArKyk9MDsKKwllbHNlIGlmICghbmVnKSBtZW1jcHkocCxhLT5kYXRhLCh1bnNpZ25lZCBpbnQpYS0+bGVuZ3RoKTsKKwllbHNlIHsKKwkJLyogQmVnaW4gYXQgdGhlIGVuZCBvZiB0aGUgZW5jb2RpbmcgKi8KKwkJbj1hLT5kYXRhICsgYS0+bGVuZ3RoIC0gMTsKKwkJcCArPSBhLT5sZW5ndGggLSAxOworCQlpID0gYS0+bGVuZ3RoOworCQkvKiBDb3B5IHplcm9zIHRvIGRlc3RpbmF0aW9uIGFzIGxvbmcgYXMgc291cmNlIGlzIHplcm8gKi8KKwkJd2hpbGUoISpuKSB7CisJCQkqKHAtLSkgPSAwOworCQkJbi0tOworCQkJaS0tOworCQl9CisJCS8qIENvbXBsZW1lbnQgYW5kIGluY3JlbWVudCBuZXh0IG9jdGV0ICovCisJCSoocC0tKSA9ICgoKihuLS0pKSBeIDB4ZmYpICsgMTsKKwkJaS0tOworCQkvKiBDb21wbGVtZW50IGFueSBvY3RldHMgbGVmdCAqLworCQlmb3IoO2kgPiAwOyBpLS0pICoocC0tKSA9ICoobi0tKSBeIDB4ZmY7CisJfQorCisJKnBwKz1yZXQ7CisJcmV0dXJuKHJldCk7CisJfQorCisvKiBDb252ZXJ0IGp1c3QgQVNOMSBJTlRFR0VSIGNvbnRlbnQgb2N0ZXRzIHRvIEFTTjFfSU5URUdFUiBzdHJ1Y3R1cmUgKi8KKworQVNOMV9JTlRFR0VSICpjMmlfQVNOMV9JTlRFR0VSKEFTTjFfSU5URUdFUiAqKmEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwKKwkgICAgIGxvbmcgbGVuKQorCXsKKwlBU04xX0lOVEVHRVIgKnJldD1OVUxMOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsICpwZW5kOworCXVuc2lnbmVkIGNoYXIgKnRvLCpzOworCWludCBpOworCisJaWYgKChhID09IE5VTEwpIHx8ICgoKmEpID09IE5VTEwpKQorCQl7CisJCWlmICgocmV0PU1fQVNOMV9JTlRFR0VSX25ldygpKSA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CisJCXJldC0+dHlwZT1WX0FTTjFfSU5URUdFUjsKKwkJfQorCWVsc2UKKwkJcmV0PSgqYSk7CisKKwlwPSAqcHA7CisJcGVuZCA9IHAgKyBsZW47CisKKwkvKiBXZSBtdXN0IE9QRU5TU0xfbWFsbG9jIHN0dWZmLCBldmVuIGZvciAwIGJ5dGVzIG90aGVyd2lzZSBpdAorCSAqIHNpZ25pZmllcyBhIG1pc3NpbmcgTlVMTCBwYXJhbWV0ZXIuICovCisJcz0odW5zaWduZWQgY2hhciAqKU9QRU5TU0xfbWFsbG9jKChpbnQpbGVuKzEpOworCWlmIChzID09IE5VTEwpCisJCXsKKwkJaT1FUlJfUl9NQUxMT0NfRkFJTFVSRTsKKwkJZ290byBlcnI7CisJCX0KKwl0bz1zOworCWlmKCFsZW4pIHsKKwkJLyogU3RyaWN0bHkgc3BlYWtpbmcgdGhpcyBpcyBhbiBpbGxlZ2FsIElOVEVHRVIgYnV0IHdlCisJCSAqIHRvbGVyYXRlIGl0LgorCQkgKi8KKwkJcmV0LT50eXBlPVZfQVNOMV9JTlRFR0VSOworCX0gZWxzZSBpZiAoKnAgJiAweDgwKSAvKiBhIG5lZ2F0aXZlIG51bWJlciAqLworCQl7CisJCXJldC0+dHlwZT1WX0FTTjFfTkVHX0lOVEVHRVI7CisJCWlmICgoKnAgPT0gMHhmZikgJiYgKGxlbiAhPSAxKSkgeworCQkJcCsrOworCQkJbGVuLS07CisJCX0KKwkJaSA9IGxlbjsKKwkJcCArPSBpIC0gMTsKKwkJdG8gKz0gaSAtIDE7CisJCXdoaWxlKCghKnApICYmIGkpIHsKKwkJCSoodG8tLSkgPSAwOworCQkJaS0tOworCQkJcC0tOworCQl9CisJCS8qIFNwZWNpYWwgY2FzZTogaWYgYWxsIHplcm9zIHRoZW4gdGhlIG51bWJlciB3aWxsIGJlIG9mCisJCSAqIHRoZSBmb3JtIEZGIGZvbGxvd2VkIGJ5IG4gemVybyBieXRlczogdGhpcyBjb3JyZXNwb25kcyB0bworCQkgKiAxIGZvbGxvd2VkIGJ5IG4gemVybyBieXRlcy4gV2UndmUgYWxyZWFkeSB3cml0dGVuIG4gemVyb3MKKwkJICogc28gd2UganVzdCBhcHBlbmQgYW4gZXh0cmEgb25lIGFuZCBzZXQgdGhlIGZpcnN0IGJ5dGUgdG8KKwkJICogYSAxLiBUaGlzIGlzIHRyZWF0ZWQgc2VwYXJhdGVseSBiZWNhdXNlIGl0IGlzIHRoZSBvbmx5IGNhc2UKKwkJICogd2hlcmUgdGhlIG51bWJlciBvZiBieXRlcyBpcyBsYXJnZXIgdGhhbiBsZW4uCisJCSAqLworCQlpZighaSkgeworCQkJKnMgPSAxOworCQkJc1tsZW5dID0gMDsKKwkJCWxlbisrOworCQl9IGVsc2UgeworCQkJKih0by0tKSA9ICgqKHAtLSkgXiAweGZmKSArIDE7CisJCQlpLS07CisJCQlmb3IoO2kgPiAwOyBpLS0pICoodG8tLSkgPSAqKHAtLSkgXiAweGZmOworCQl9CisJfSBlbHNlIHsKKwkJcmV0LT50eXBlPVZfQVNOMV9JTlRFR0VSOworCQlpZiAoKCpwID09IDApICYmIChsZW4gIT0gMSkpCisJCQl7CisJCQlwKys7CisJCQlsZW4tLTsKKwkJCX0KKwkJbWVtY3B5KHMscCwoaW50KWxlbik7CisJfQorCisJaWYgKHJldC0+ZGF0YSAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUocmV0LT5kYXRhKTsKKwlyZXQtPmRhdGE9czsKKwlyZXQtPmxlbmd0aD0oaW50KWxlbjsKKwlpZiAoYSAhPSBOVUxMKSAoKmEpPXJldDsKKwkqcHA9cGVuZDsKKwlyZXR1cm4ocmV0KTsKK2VycjoKKwlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBjMmlfQVNOMV9JTlRFR0VSLCBpKTsKKwlpZiAoKHJldCAhPSBOVUxMKSAmJiAoKGEgPT0gTlVMTCkgfHwgKCphICE9IHJldCkpKQorCQlNX0FTTjFfSU5URUdFUl9mcmVlKHJldCk7CisJcmV0dXJuKE5VTEwpOworCX0KKworCisvKiBUaGlzIGlzIGEgdmVyc2lvbiBvZiBkMmlfQVNOMV9JTlRFR0VSIHRoYXQgaWdub3JlcyB0aGUgc2lnbiBiaXQgb2YKKyAqIEFTTjEgaW50ZWdlcnM6IHNvbWUgYnJva2VuIHNvZnR3YXJlIGNhbiBlbmNvZGUgYSBwb3NpdGl2ZSBJTlRFR0VSCisgKiB3aXRoIGl0cyBNU0Igc2V0IGFzIG5lZ2F0aXZlIChpdCBkb2Vzbid0IGFkZCBhIHBhZGRpbmcgemVybykuCisgKi8KKworQVNOMV9JTlRFR0VSICpkMmlfQVNOMV9VSU5URUdFUihBU04xX0lOVEVHRVIgKiphLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsCisJICAgICBsb25nIGxlbmd0aCkKKwl7CisJQVNOMV9JTlRFR0VSICpyZXQ9TlVMTDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwOworCXVuc2lnbmVkIGNoYXIgKnM7CisJbG9uZyBsZW47CisJaW50IGluZix0YWcseGNsYXNzOworCWludCBpOworCisJaWYgKChhID09IE5VTEwpIHx8ICgoKmEpID09IE5VTEwpKQorCQl7CisJCWlmICgocmV0PU1fQVNOMV9JTlRFR0VSX25ldygpKSA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CisJCXJldC0+dHlwZT1WX0FTTjFfSU5URUdFUjsKKwkJfQorCWVsc2UKKwkJcmV0PSgqYSk7CisKKwlwPSAqcHA7CisJaW5mPUFTTjFfZ2V0X29iamVjdCgmcCwmbGVuLCZ0YWcsJnhjbGFzcyxsZW5ndGgpOworCWlmIChpbmYgJiAweDgwKQorCQl7CisJCWk9QVNOMV9SX0JBRF9PQkpFQ1RfSEVBREVSOworCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKHRhZyAhPSBWX0FTTjFfSU5URUdFUikKKwkJeworCQlpPUFTTjFfUl9FWFBFQ1RJTkdfQU5fSU5URUdFUjsKKwkJZ290byBlcnI7CisJCX0KKworCS8qIFdlIG11c3QgT1BFTlNTTF9tYWxsb2Mgc3R1ZmYsIGV2ZW4gZm9yIDAgYnl0ZXMgb3RoZXJ3aXNlIGl0CisJICogc2lnbmlmaWVzIGEgbWlzc2luZyBOVUxMIHBhcmFtZXRlci4gKi8KKwlzPSh1bnNpZ25lZCBjaGFyICopT1BFTlNTTF9tYWxsb2MoKGludClsZW4rMSk7CisJaWYgKHMgPT0gTlVMTCkKKwkJeworCQlpPUVSUl9SX01BTExPQ19GQUlMVVJFOworCQlnb3RvIGVycjsKKwkJfQorCXJldC0+dHlwZT1WX0FTTjFfSU5URUdFUjsKKwlpZihsZW4pIHsKKwkJaWYgKCgqcCA9PSAwKSAmJiAobGVuICE9IDEpKQorCQkJeworCQkJcCsrOworCQkJbGVuLS07CisJCQl9CisJCW1lbWNweShzLHAsKGludClsZW4pOworCQlwKz1sZW47CisJfQorCisJaWYgKHJldC0+ZGF0YSAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUocmV0LT5kYXRhKTsKKwlyZXQtPmRhdGE9czsKKwlyZXQtPmxlbmd0aD0oaW50KWxlbjsKKwlpZiAoYSAhPSBOVUxMKSAoKmEpPXJldDsKKwkqcHA9cDsKKwlyZXR1cm4ocmV0KTsKK2VycjoKKwlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBkMmlfQVNOMV9VSU5URUdFUiwgaSk7CisJaWYgKChyZXQgIT0gTlVMTCkgJiYgKChhID09IE5VTEwpIHx8ICgqYSAhPSByZXQpKSkKKwkJTV9BU04xX0lOVEVHRVJfZnJlZShyZXQpOworCXJldHVybihOVUxMKTsKKwl9CisKK2ludCBBU04xX0lOVEVHRVJfc2V0KEFTTjFfSU5URUdFUiAqYSwgbG9uZyB2KQorCXsKKwlpbnQgaixrOworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGNoYXIgYnVmW3NpemVvZihsb25nKSsxXTsKKwlsb25nIGQ7CisKKwlhLT50eXBlPVZfQVNOMV9JTlRFR0VSOworCWlmIChhLT5sZW5ndGggPCAoaW50KShzaXplb2YobG9uZykrMSkpCisJCXsKKwkJaWYgKGEtPmRhdGEgIT0gTlVMTCkKKwkJCU9QRU5TU0xfZnJlZShhLT5kYXRhKTsKKwkJaWYgKChhLT5kYXRhPSh1bnNpZ25lZCBjaGFyICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKGxvbmcpKzEpKSAhPSBOVUxMKQorCQkJbWVtc2V0KChjaGFyICopYS0+ZGF0YSwwLHNpemVvZihsb25nKSsxKTsKKwkJfQorCWlmIChhLT5kYXRhID09IE5VTEwpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9JTlRFR0VSX3NldCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4oMCk7CisJCX0KKwlkPXY7CisJaWYgKGQgPCAwKQorCQl7CisJCWQ9IC1kOworCQlhLT50eXBlPVZfQVNOMV9ORUdfSU5URUdFUjsKKwkJfQorCisJZm9yIChpPTA7IGk8c2l6ZW9mKGxvbmcpOyBpKyspCisJCXsKKwkJaWYgKGQgPT0gMCkgYnJlYWs7CisJCWJ1ZltpXT0oaW50KWQmMHhmZjsKKwkJZD4+PTg7CisJCX0KKwlqPTA7CisJZm9yIChrPWktMTsgayA+PTA7IGstLSkKKwkJYS0+ZGF0YVtqKytdPWJ1ZltrXTsKKwlhLT5sZW5ndGg9ajsKKwlyZXR1cm4oMSk7CisJfQorCitsb25nIEFTTjFfSU5URUdFUl9nZXQoY29uc3QgQVNOMV9JTlRFR0VSICphKQorCXsKKwlpbnQgbmVnPTAsaTsKKwlsb25nIHI9MDsKKworCWlmIChhID09IE5VTEwpIHJldHVybigwTCk7CisJaT1hLT50eXBlOworCWlmIChpID09IFZfQVNOMV9ORUdfSU5URUdFUikKKwkJbmVnPTE7CisJZWxzZSBpZiAoaSAhPSBWX0FTTjFfSU5URUdFUikKKwkJcmV0dXJuIC0xOworCQorCWlmIChhLT5sZW5ndGggPiAoaW50KXNpemVvZihsb25nKSkKKwkJeworCQkvKiBobW0uLi4gYSBiaXQgdWdseSwgcmV0dXJuIGFsbCBvbmVzICovCisJCXJldHVybiAtMTsKKwkJfQorCWlmIChhLT5kYXRhID09IE5VTEwpCisJCXJldHVybiAwOworCisJZm9yIChpPTA7IGk8YS0+bGVuZ3RoOyBpKyspCisJCXsKKwkJcjw8PTg7CisJCXJ8PSh1bnNpZ25lZCBjaGFyKWEtPmRhdGFbaV07CisJCX0KKwlpZiAobmVnKSByPSAtcjsKKwlyZXR1cm4ocik7CisJfQorCitBU04xX0lOVEVHRVIgKkJOX3RvX0FTTjFfSU5URUdFUihjb25zdCBCSUdOVU0gKmJuLCBBU04xX0lOVEVHRVIgKmFpKQorCXsKKwlBU04xX0lOVEVHRVIgKnJldDsKKwlpbnQgbGVuLGo7CisKKwlpZiAoYWkgPT0gTlVMTCkKKwkJcmV0PU1fQVNOMV9JTlRFR0VSX25ldygpOworCWVsc2UKKwkJcmV0PWFpOworCWlmIChyZXQgPT0gTlVMTCkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBCTl90b19BU04xX0lOVEVHRVIsIEFTTjFfUl9ORVNURURfQVNOMV9FUlJPUik7CisJCWdvdG8gZXJyOworCQl9CisJaWYgKEJOX2lzX25lZ2F0aXZlKGJuKSkKKwkJcmV0LT50eXBlID0gVl9BU04xX05FR19JTlRFR0VSOworCWVsc2UgcmV0LT50eXBlPVZfQVNOMV9JTlRFR0VSOworCWo9Qk5fbnVtX2JpdHMoYm4pOworCWxlbj0oKGogPT0gMCk/MDooKGovOCkrMSkpOworCWlmIChyZXQtPmxlbmd0aCA8IGxlbis0KQorCQl7CisJCXVuc2lnbmVkIGNoYXIgKm5ld19kYXRhPU9QRU5TU0xfcmVhbGxvYyhyZXQtPmRhdGEsIGxlbis0KTsKKwkJaWYgKCFuZXdfZGF0YSkKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEJOX3RvX0FTTjFfSU5URUdFUiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJZ290byBlcnI7CisJCQl9CisJCXJldC0+ZGF0YT1uZXdfZGF0YTsKKwkJfQorCXJldC0+bGVuZ3RoPUJOX2JuMmJpbihibixyZXQtPmRhdGEpOworCS8qIENvcnJlY3QgemVybyBjYXNlICovCisJaWYoIXJldC0+bGVuZ3RoKQorCQl7CisJCXJldC0+ZGF0YVswXSA9IDA7CisJCXJldC0+bGVuZ3RoID0gMTsKKwkJfQorCXJldHVybihyZXQpOworZXJyOgorCWlmIChyZXQgIT0gYWkpIE1fQVNOMV9JTlRFR0VSX2ZyZWUocmV0KTsKKwlyZXR1cm4oTlVMTCk7CisJfQorCitCSUdOVU0gKkFTTjFfSU5URUdFUl90b19CTihjb25zdCBBU04xX0lOVEVHRVIgKmFpLCBCSUdOVU0gKmJuKQorCXsKKwlCSUdOVU0gKnJldDsKKworCWlmICgocmV0PUJOX2JpbjJibihhaS0+ZGF0YSxhaS0+bGVuZ3RoLGJuKSkgPT0gTlVMTCkKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9JTlRFR0VSX3RvX0JOLCBBU04xX1JfQk5fTElCKTsKKwllbHNlIGlmKGFpLT50eXBlID09IFZfQVNOMV9ORUdfSU5URUdFUikKKwkJQk5fc2V0X25lZ2F0aXZlKHJldCwgMSk7CisJcmV0dXJuKHJldCk7CisJfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FzbjEvYV9tYnN0ci5jIGIvY3J5cHRvL2FzbjEvYV9tYnN0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NDNmNTIKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYXNuMS9hX21ic3RyLmMKQEAgLTAsMCArMSwzOTUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKworCitzdGF0aWMgaW50IHRyYXZlcnNlX3N0cmluZyhjb25zdCB1bnNpZ25lZCBjaGFyICpwLCBpbnQgbGVuLCBpbnQgaW5mb3JtLAorCQkgaW50ICgqcmZ1bmMpKHVuc2lnbmVkIGxvbmcgdmFsdWUsIHZvaWQgKmluKSwgdm9pZCAqYXJnKTsKK3N0YXRpYyBpbnQgaW5fdXRmOCh1bnNpZ25lZCBsb25nIHZhbHVlLCB2b2lkICphcmcpOworc3RhdGljIGludCBvdXRfdXRmOCh1bnNpZ25lZCBsb25nIHZhbHVlLCB2b2lkICphcmcpOworc3RhdGljIGludCB0eXBlX3N0cih1bnNpZ25lZCBsb25nIHZhbHVlLCB2b2lkICphcmcpOworc3RhdGljIGludCBjcHlfYXNjKHVuc2lnbmVkIGxvbmcgdmFsdWUsIHZvaWQgKmFyZyk7CitzdGF0aWMgaW50IGNweV9ibXAodW5zaWduZWQgbG9uZyB2YWx1ZSwgdm9pZCAqYXJnKTsKK3N0YXRpYyBpbnQgY3B5X3VuaXYodW5zaWduZWQgbG9uZyB2YWx1ZSwgdm9pZCAqYXJnKTsKK3N0YXRpYyBpbnQgY3B5X3V0ZjgodW5zaWduZWQgbG9uZyB2YWx1ZSwgdm9pZCAqYXJnKTsKK3N0YXRpYyBpbnQgaXNfcHJpbnRhYmxlKHVuc2lnbmVkIGxvbmcgdmFsdWUpOworCisvKiBUaGVzZSBmdW5jdGlvbnMgdGFrZSBhIHN0cmluZyBpbiBVVEY4LCBBU0NJSSBvciBtdWx0aWJ5dGUgZm9ybSBhbmQKKyAqIGEgbWFzayBvZiBwZXJtaXNzaWJsZSBBU04xIHN0cmluZyB0eXBlcy4gSXQgdGhlbiB3b3JrcyBvdXQgdGhlIG1pbmltYWwKKyAqIHR5cGUgKHVzaW5nIHRoZSBvcmRlciBQcmludGFibGUgPCBJQTUgPCBUNjEgPCBCTVAgPCBVbml2ZXJzYWwgPCBVVEY4KQorICogYW5kIGNyZWF0ZXMgYSBzdHJpbmcgb2YgdGhlIGNvcnJlY3QgdHlwZSB3aXRoIHRoZSBzdXBwbGllZCBkYXRhLgorICogWWVzIHRoaXMgaXMgaG9ycmlibGU6IGl0IGhhcyB0byBiZSA6LSgKKyAqIFRoZSAnbmNvcHknIGZvcm0gY2hlY2tzIG1pbmltdW0gYW5kIG1heGltdW0gc2l6ZSBsaW1pdHMgdG9vLgorICovCisKK2ludCBBU04xX21ic3RyaW5nX2NvcHkoQVNOMV9TVFJJTkcgKipvdXQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCBpbnQgbGVuLAorCQkJCQlpbnQgaW5mb3JtLCB1bnNpZ25lZCBsb25nIG1hc2spCit7CisJcmV0dXJuIEFTTjFfbWJzdHJpbmdfbmNvcHkob3V0LCBpbiwgbGVuLCBpbmZvcm0sIG1hc2ssIDAsIDApOworfQorCitpbnQgQVNOMV9tYnN0cmluZ19uY29weShBU04xX1NUUklORyAqKm91dCwgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIGludCBsZW4sCisJCQkJCWludCBpbmZvcm0sIHVuc2lnbmVkIGxvbmcgbWFzaywgCisJCQkJCWxvbmcgbWluc2l6ZSwgbG9uZyBtYXhzaXplKQoreworCWludCBzdHJfdHlwZTsKKwlpbnQgcmV0OworCWNoYXIgZnJlZV9vdXQ7CisJaW50IG91dGZvcm0sIG91dGxlbiA9IDA7CisJQVNOMV9TVFJJTkcgKmRlc3Q7CisJdW5zaWduZWQgY2hhciAqcDsKKwlpbnQgbmNoYXI7CisJY2hhciBzdHJidWZbMzJdOworCWludCAoKmNweWZ1bmMpKHVuc2lnbmVkIGxvbmcsdm9pZCAqKSA9IE5VTEw7CisJaWYobGVuID09IC0xKSBsZW4gPSBzdHJsZW4oKGNvbnN0IGNoYXIgKilpbik7CisJaWYoIW1hc2spIG1hc2sgPSBESVJTVFJJTkdfVFlQRTsKKworCS8qIEZpcnN0IGRvIGEgc3RyaW5nIGNoZWNrIGFuZCB3b3JrIG91dCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgKi8KKwlzd2l0Y2goaW5mb3JtKSB7CisKKwkJY2FzZSBNQlNUUklOR19CTVA6CisJCWlmKGxlbiAmIDEpIHsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfbWJzdHJpbmdfbmNvcHksICBBU04xX1JfSU5WQUxJRF9CTVBTVFJJTkdfTEVOR1RIKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQluY2hhciA9IGxlbiA+PiAxOworCQlicmVhazsKKworCQljYXNlIE1CU1RSSU5HX1VOSVY6CisJCWlmKGxlbiAmIDMpIHsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfbWJzdHJpbmdfbmNvcHksICBBU04xX1JfSU5WQUxJRF9VTklWRVJTQUxTVFJJTkdfTEVOR1RIKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQluY2hhciA9IGxlbiA+PiAyOworCQlicmVhazsKKworCQljYXNlIE1CU1RSSU5HX1VURjg6CisJCW5jaGFyID0gMDsKKwkJLyogVGhpcyBjb3VudHMgdGhlIGNoYXJhY3RlcnMgYW5kIGRvZXMgdXRmOCBzeW50YXggY2hlY2tpbmcgKi8KKwkJcmV0ID0gdHJhdmVyc2Vfc3RyaW5nKGluLCBsZW4sIE1CU1RSSU5HX1VURjgsIGluX3V0ZjgsICZuY2hhcik7CisJCWlmKHJldCA8IDApIHsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfbWJzdHJpbmdfbmNvcHksICBBU04xX1JfSU5WQUxJRF9VVEY4U1RSSU5HKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlicmVhazsKKworCQljYXNlIE1CU1RSSU5HX0FTQzoKKwkJbmNoYXIgPSBsZW47CisJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfbWJzdHJpbmdfbmNvcHksICBBU04xX1JfVU5LTk9XTl9GT1JNQVQpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYoKG1pbnNpemUgPiAwKSAmJiAobmNoYXIgPCBtaW5zaXplKSkgeworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX21ic3RyaW5nX25jb3B5LCAgQVNOMV9SX1NUUklOR19UT09fU0hPUlQpOworCQlCSU9fc25wcmludGYoc3RyYnVmLCBzaXplb2Ygc3RyYnVmLCAiJWxkIiwgbWluc2l6ZSk7CisJCUVSUl9hZGRfZXJyb3JfZGF0YSgyLCAibWluc2l6ZT0iLCBzdHJidWYpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYoKG1heHNpemUgPiAwKSAmJiAobmNoYXIgPiBtYXhzaXplKSkgeworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX21ic3RyaW5nX25jb3B5LCAgQVNOMV9SX1NUUklOR19UT09fTE9ORyk7CisJCUJJT19zbnByaW50ZihzdHJidWYsIHNpemVvZiBzdHJidWYsICIlbGQiLCBtYXhzaXplKTsKKwkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJtYXhzaXplPSIsIHN0cmJ1Zik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBOb3cgd29yayBvdXQgbWluaW1hbCB0eXBlIChpZiBhbnkpICovCisJaWYodHJhdmVyc2Vfc3RyaW5nKGluLCBsZW4sIGluZm9ybSwgdHlwZV9zdHIsICZtYXNrKSA8IDApIHsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9tYnN0cmluZ19uY29weSwgIEFTTjFfUl9JTExFR0FMX0NIQVJBQ1RFUlMpOworCQlyZXR1cm4gLTE7CisJfQorCisKKwkvKiBOb3cgd29yayBvdXQgb3V0cHV0IGZvcm1hdCBhbmQgc3RyaW5nIHR5cGUgKi8KKwlvdXRmb3JtID0gTUJTVFJJTkdfQVNDOworCWlmKG1hc2sgJiBCX0FTTjFfUFJJTlRBQkxFU1RSSU5HKSBzdHJfdHlwZSA9IFZfQVNOMV9QUklOVEFCTEVTVFJJTkc7CisJZWxzZSBpZihtYXNrICYgQl9BU04xX0lBNVNUUklORykgc3RyX3R5cGUgPSBWX0FTTjFfSUE1U1RSSU5HOworCWVsc2UgaWYobWFzayAmIEJfQVNOMV9UNjFTVFJJTkcpIHN0cl90eXBlID0gVl9BU04xX1Q2MVNUUklORzsKKwllbHNlIGlmKG1hc2sgJiBCX0FTTjFfQk1QU1RSSU5HKSB7CisJCXN0cl90eXBlID0gVl9BU04xX0JNUFNUUklORzsKKwkJb3V0Zm9ybSA9IE1CU1RSSU5HX0JNUDsKKwl9IGVsc2UgaWYobWFzayAmIEJfQVNOMV9VTklWRVJTQUxTVFJJTkcpIHsKKwkJc3RyX3R5cGUgPSBWX0FTTjFfVU5JVkVSU0FMU1RSSU5HOworCQlvdXRmb3JtID0gTUJTVFJJTkdfVU5JVjsKKwl9IGVsc2UgeworCQlzdHJfdHlwZSA9IFZfQVNOMV9VVEY4U1RSSU5HOworCQlvdXRmb3JtID0gTUJTVFJJTkdfVVRGODsKKwl9CisJaWYoIW91dCkgcmV0dXJuIHN0cl90eXBlOworCWlmKCpvdXQpIHsKKwkJZnJlZV9vdXQgPSAwOworCQlkZXN0ID0gKm91dDsKKwkJaWYoZGVzdC0+ZGF0YSkgeworCQkJZGVzdC0+bGVuZ3RoID0gMDsKKwkJCU9QRU5TU0xfZnJlZShkZXN0LT5kYXRhKTsKKwkJCWRlc3QtPmRhdGEgPSBOVUxMOworCQl9CisJCWRlc3QtPnR5cGUgPSBzdHJfdHlwZTsKKwl9IGVsc2UgeworCQlmcmVlX291dCA9IDE7CisJCWRlc3QgPSBBU04xX1NUUklOR190eXBlX25ldyhzdHJfdHlwZSk7CisJCWlmKCFkZXN0KSB7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX21ic3RyaW5nX25jb3B5LCAgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJcmV0dXJuIC0xOworCQl9CisJCSpvdXQgPSBkZXN0OworCX0KKwkvKiBJZiBib3RoIHRoZSBzYW1lIHR5cGUganVzdCBjb3B5IGFjcm9zcyAqLworCWlmKGluZm9ybSA9PSBvdXRmb3JtKSB7CisJCWlmKCFBU04xX1NUUklOR19zZXQoZGVzdCwgaW4sIGxlbikpIHsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfbWJzdHJpbmdfbmNvcHksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlyZXR1cm4gc3RyX3R5cGU7CisJfSAKKworCS8qIFdvcmsgb3V0IGhvdyBtdWNoIHNwYWNlIHRoZSBkZXN0aW5hdGlvbiB3aWxsIG5lZWQgKi8KKwlzd2l0Y2gob3V0Zm9ybSkgeworCQljYXNlIE1CU1RSSU5HX0FTQzoKKwkJb3V0bGVuID0gbmNoYXI7CisJCWNweWZ1bmMgPSBjcHlfYXNjOworCQlicmVhazsKKworCQljYXNlIE1CU1RSSU5HX0JNUDoKKwkJb3V0bGVuID0gbmNoYXIgPDwgMTsKKwkJY3B5ZnVuYyA9IGNweV9ibXA7CisJCWJyZWFrOworCisJCWNhc2UgTUJTVFJJTkdfVU5JVjoKKwkJb3V0bGVuID0gbmNoYXIgPDwgMjsKKwkJY3B5ZnVuYyA9IGNweV91bml2OworCQlicmVhazsKKworCQljYXNlIE1CU1RSSU5HX1VURjg6CisJCW91dGxlbiA9IDA7CisJCXRyYXZlcnNlX3N0cmluZyhpbiwgbGVuLCBpbmZvcm0sIG91dF91dGY4LCAmb3V0bGVuKTsKKwkJY3B5ZnVuYyA9IGNweV91dGY4OworCQlicmVhazsKKwl9CisJaWYoIShwID0gT1BFTlNTTF9tYWxsb2Mob3V0bGVuICsgMSkpKSB7CisJCWlmKGZyZWVfb3V0KSBBU04xX1NUUklOR19mcmVlKGRlc3QpOworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX21ic3RyaW5nX25jb3B5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiAtMTsKKwl9CisJZGVzdC0+bGVuZ3RoID0gb3V0bGVuOworCWRlc3QtPmRhdGEgPSBwOworCXBbb3V0bGVuXSA9IDA7CisJdHJhdmVyc2Vfc3RyaW5nKGluLCBsZW4sIGluZm9ybSwgY3B5ZnVuYywgJnApOworCXJldHVybiBzdHJfdHlwZTsJCit9CisKKy8qIFRoaXMgZnVuY3Rpb24gdHJhdmVyc2VzIGEgc3RyaW5nIGFuZCBwYXNzZXMgdGhlIHZhbHVlIG9mIGVhY2ggY2hhcmFjdGVyCisgKiB0byBhbiBvcHRpb25hbCBmdW5jdGlvbiBhbG9uZyB3aXRoIGEgdm9pZCAqIGFyZ3VtZW50LgorICovCisKK3N0YXRpYyBpbnQgdHJhdmVyc2Vfc3RyaW5nKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsIGludCBsZW4sIGludCBpbmZvcm0sCisJCSBpbnQgKCpyZnVuYykodW5zaWduZWQgbG9uZyB2YWx1ZSwgdm9pZCAqaW4pLCB2b2lkICphcmcpCit7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwlpbnQgcmV0OworCXdoaWxlKGxlbikgeworCQlpZihpbmZvcm0gPT0gTUJTVFJJTkdfQVNDKSB7CisJCQl2YWx1ZSA9ICpwKys7CisJCQlsZW4tLTsKKwkJfSBlbHNlIGlmKGluZm9ybSA9PSBNQlNUUklOR19CTVApIHsKKwkJCXZhbHVlID0gKnArKyA8PCA4OworCQkJdmFsdWUgfD0gKnArKzsKKwkJCWxlbiAtPSAyOworCQl9IGVsc2UgaWYoaW5mb3JtID09IE1CU1RSSU5HX1VOSVYpIHsKKwkJCXZhbHVlID0gKCh1bnNpZ25lZCBsb25nKSpwKyspIDw8IDI0OworCQkJdmFsdWUgfD0gKCh1bnNpZ25lZCBsb25nKSpwKyspIDw8IDE2OworCQkJdmFsdWUgfD0gKnArKyA8PCA4OworCQkJdmFsdWUgfD0gKnArKzsKKwkJCWxlbiAtPSA0OworCQl9IGVsc2UgeworCQkJcmV0ID0gVVRGOF9nZXRjKHAsIGxlbiwgJnZhbHVlKTsKKwkJCWlmKHJldCA8IDApIHJldHVybiAtMTsKKwkJCWxlbiAtPSByZXQ7CisJCQlwICs9IHJldDsKKwkJfQorCQlpZihyZnVuYykgeworCQkJcmV0ID0gcmZ1bmModmFsdWUsIGFyZyk7CisJCQlpZihyZXQgPD0gMCkgcmV0dXJuIHJldDsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworLyogVmFyaW91cyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgdHJhdmVyc2Vfc3RyaW5nICovCisKKy8qIEp1c3QgY291bnQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgKi8KKworc3RhdGljIGludCBpbl91dGY4KHVuc2lnbmVkIGxvbmcgdmFsdWUsIHZvaWQgKmFyZykKK3sKKwlpbnQgKm5jaGFyOworCW5jaGFyID0gYXJnOworCSgqbmNoYXIpKys7CisJcmV0dXJuIDE7Cit9CisKKy8qIERldGVybWluZSBzaXplIG9mIG91dHB1dCBhcyBhIFVURjggU3RyaW5nICovCisKK3N0YXRpYyBpbnQgb3V0X3V0ZjgodW5zaWduZWQgbG9uZyB2YWx1ZSwgdm9pZCAqYXJnKQoreworCWludCAqb3V0bGVuOworCW91dGxlbiA9IGFyZzsKKwkqb3V0bGVuICs9IFVURjhfcHV0YyhOVUxMLCAtMSwgdmFsdWUpOworCXJldHVybiAxOworfQorCisvKiBEZXRlcm1pbmUgdGhlICJ0eXBlIiBvZiBhIHN0cmluZzogY2hlY2sgZWFjaCBjaGFyYWN0ZXIgYWdhaW5zdCBhCisgKiBzdXBwbGllZCAibWFzayIuCisgKi8KKworc3RhdGljIGludCB0eXBlX3N0cih1bnNpZ25lZCBsb25nIHZhbHVlLCB2b2lkICphcmcpCit7CisJdW5zaWduZWQgbG9uZyB0eXBlczsKKwl0eXBlcyA9ICooKHVuc2lnbmVkIGxvbmcgKilhcmcpOworCWlmKCh0eXBlcyAmIEJfQVNOMV9QUklOVEFCTEVTVFJJTkcpICYmICFpc19wcmludGFibGUodmFsdWUpKQorCQkJCQl0eXBlcyAmPSB+Ql9BU04xX1BSSU5UQUJMRVNUUklORzsKKwlpZigodHlwZXMgJiBCX0FTTjFfSUE1U1RSSU5HKSAmJiAodmFsdWUgPiAxMjcpKQorCQkJCQl0eXBlcyAmPSB+Ql9BU04xX0lBNVNUUklORzsKKwlpZigodHlwZXMgJiBCX0FTTjFfVDYxU1RSSU5HKSAmJiAodmFsdWUgPiAweGZmKSkKKwkJCQkJdHlwZXMgJj0gfkJfQVNOMV9UNjFTVFJJTkc7CisJaWYoKHR5cGVzICYgQl9BU04xX0JNUFNUUklORykgJiYgKHZhbHVlID4gMHhmZmZmKSkKKwkJCQkJdHlwZXMgJj0gfkJfQVNOMV9CTVBTVFJJTkc7CisJaWYoIXR5cGVzKSByZXR1cm4gLTE7CisJKigodW5zaWduZWQgbG9uZyAqKWFyZykgPSB0eXBlczsKKwlyZXR1cm4gMTsKK30KKworLyogQ29weSBvbmUgYnl0ZSBwZXIgY2hhcmFjdGVyIEFTQ0lJIGxpa2Ugc3RyaW5ncyAqLworCitzdGF0aWMgaW50IGNweV9hc2ModW5zaWduZWQgbG9uZyB2YWx1ZSwgdm9pZCAqYXJnKQoreworCXVuc2lnbmVkIGNoYXIgKipwLCAqcTsKKwlwID0gYXJnOworCXEgPSAqcDsKKwkqcSA9ICh1bnNpZ25lZCBjaGFyKSB2YWx1ZTsKKwkoKnApKys7CisJcmV0dXJuIDE7Cit9CisKKy8qIENvcHkgdHdvIGJ5dGUgcGVyIGNoYXJhY3RlciBCTVBTdHJpbmdzICovCisKK3N0YXRpYyBpbnQgY3B5X2JtcCh1bnNpZ25lZCBsb25nIHZhbHVlLCB2b2lkICphcmcpCit7CisJdW5zaWduZWQgY2hhciAqKnAsICpxOworCXAgPSBhcmc7CisJcSA9ICpwOworCSpxKysgPSAodW5zaWduZWQgY2hhcikgKCh2YWx1ZSA+PiA4KSAmIDB4ZmYpOworCSpxID0gKHVuc2lnbmVkIGNoYXIpICh2YWx1ZSAmIDB4ZmYpOworCSpwICs9IDI7CisJcmV0dXJuIDE7Cit9CisKKy8qIENvcHkgZm91ciBieXRlIHBlciBjaGFyYWN0ZXIgVW5pdmVyc2FsU3RyaW5ncyAqLworCitzdGF0aWMgaW50IGNweV91bml2KHVuc2lnbmVkIGxvbmcgdmFsdWUsIHZvaWQgKmFyZykKK3sKKwl1bnNpZ25lZCBjaGFyICoqcCwgKnE7CisJcCA9IGFyZzsKKwlxID0gKnA7CisJKnErKyA9ICh1bnNpZ25lZCBjaGFyKSAoKHZhbHVlID4+IDI0KSAmIDB4ZmYpOworCSpxKysgPSAodW5zaWduZWQgY2hhcikgKCh2YWx1ZSA+PiAxNikgJiAweGZmKTsKKwkqcSsrID0gKHVuc2lnbmVkIGNoYXIpICgodmFsdWUgPj4gOCkgJiAweGZmKTsKKwkqcSA9ICh1bnNpZ25lZCBjaGFyKSAodmFsdWUgJiAweGZmKTsKKwkqcCArPSA0OworCXJldHVybiAxOworfQorCisvKiBDb3B5IHRvIGEgVVRGOFN0cmluZyAqLworCitzdGF0aWMgaW50IGNweV91dGY4KHVuc2lnbmVkIGxvbmcgdmFsdWUsIHZvaWQgKmFyZykKK3sKKwl1bnNpZ25lZCBjaGFyICoqcDsKKwlpbnQgcmV0OworCXAgPSBhcmc7CisJLyogV2UgYWxyZWFkeSBrbm93IHRoZXJlIGlzIGVub3VnaCByb29tIHNvIHBhc3MgMHhmZiBhcyB0aGUgbGVuZ3RoICovCisJcmV0ID0gVVRGOF9wdXRjKCpwLCAweGZmLCB2YWx1ZSk7CisJKnAgKz0gcmV0OworCXJldHVybiAxOworfQorCisvKiBSZXR1cm4gMSBpZiB0aGUgY2hhcmFjdGVyIGlzIHBlcm1pdHRlZCBpbiBhIFByaW50YWJsZVN0cmluZyAqLworc3RhdGljIGludCBpc19wcmludGFibGUodW5zaWduZWQgbG9uZyB2YWx1ZSkKK3sKKwlpbnQgY2g7CisJaWYodmFsdWUgPiAweDdmKSByZXR1cm4gMDsKKwljaCA9IChpbnQpIHZhbHVlOworCS8qIE5vdGU6IHdlIGNhbid0IHVzZSAnaXNhbG51bScgYmVjYXVzZSBjZXJ0YWluIGFjY2VudGVkIAorCSAqIGNoYXJhY3RlcnMgbWF5IGNvdW50IGFzIGFscGhhbnVtZXJpYyBpbiBzb21lIGVudmlyb25tZW50cy4KKwkgKi8KKyNpZm5kZWYgQ0hBUlNFVF9FQkNESUMKKwlpZigoY2ggPj0gJ2EnKSAmJiAoY2ggPD0gJ3onKSkgcmV0dXJuIDE7CisJaWYoKGNoID49ICdBJykgJiYgKGNoIDw9ICdaJykpIHJldHVybiAxOworCWlmKChjaCA+PSAnMCcpICYmIChjaCA8PSAnOScpKSByZXR1cm4gMTsKKwlpZiAoKGNoID09ICcgJykgfHwgc3RyY2hyKCInKCkrLC0uLzo9PyIsIGNoKSkgcmV0dXJuIDE7CisjZWxzZSAvKkNIQVJTRVRfRUJDRElDKi8KKwlpZigoY2ggPj0gb3NfdG9hc2NpaVsnYSddKSAmJiAoY2ggPD0gb3NfdG9hc2NpaVsneiddKSkgcmV0dXJuIDE7CisJaWYoKGNoID49IG9zX3RvYXNjaWlbJ0EnXSkgJiYgKGNoIDw9IG9zX3RvYXNjaWlbJ1onXSkpIHJldHVybiAxOworCWlmKChjaCA+PSBvc190b2FzY2lpWycwJ10pICYmIChjaCA8PSBvc190b2FzY2lpWyc5J10pKSByZXR1cm4gMTsKKwlpZiAoKGNoID09IG9zX3RvYXNjaWlbJyAnXSkgfHwgc3RyY2hyKCInKCkrLC0uLzo9PyIsIG9zX3RvZWJjZGljW2NoXSkpIHJldHVybiAxOworI2VuZGlmIC8qQ0hBUlNFVF9FQkNESUMqLworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FzbjEvYV9vYmplY3QuYyBiL2NyeXB0by9hc24xL2Ffb2JqZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJhOWUyZAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9hc24xL2Ffb2JqZWN0LmMKQEAgLTAsMCArMSwzOTkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqLmg+CisKKworaW50IGkyZF9BU04xX09CSkVDVChBU04xX09CSkVDVCAqYSwgdW5zaWduZWQgY2hhciAqKnBwKQorCXsKKwl1bnNpZ25lZCBjaGFyICpwOworCWludCBvYmpzaXplOworCisJaWYgKChhID09IE5VTEwpIHx8IChhLT5kYXRhID09IE5VTEwpKSByZXR1cm4oMCk7CisKKwlvYmpzaXplID0gQVNOMV9vYmplY3Rfc2l6ZSgwLGEtPmxlbmd0aCxWX0FTTjFfT0JKRUNUKTsKKwlpZiAocHAgPT0gTlVMTCkgcmV0dXJuIG9ianNpemU7CisKKwlwPSAqcHA7CisJQVNOMV9wdXRfb2JqZWN0KCZwLDAsYS0+bGVuZ3RoLFZfQVNOMV9PQkpFQ1QsVl9BU04xX1VOSVZFUlNBTCk7CisJbWVtY3B5KHAsYS0+ZGF0YSxhLT5sZW5ndGgpOworCXArPWEtPmxlbmd0aDsKKworCSpwcD1wOworCXJldHVybihvYmpzaXplKTsKKwl9CisKK2ludCBhMmRfQVNOMV9PQkpFQ1QodW5zaWduZWQgY2hhciAqb3V0LCBpbnQgb2xlbiwgY29uc3QgY2hhciAqYnVmLCBpbnQgbnVtKQorCXsKKwlpbnQgaSxmaXJzdCxsZW49MCxjLCB1c2VfYm47CisJY2hhciBmdG1wWzI0XSwgKnRtcCA9IGZ0bXA7CisJaW50IHRtcHNpemUgPSBzaXplb2YgZnRtcDsKKwljb25zdCBjaGFyICpwOworCXVuc2lnbmVkIGxvbmcgbDsKKwlCSUdOVU0gKmJsID0gTlVMTDsKKworCWlmIChudW0gPT0gMCkKKwkJcmV0dXJuKDApOworCWVsc2UgaWYgKG51bSA9PSAtMSkKKwkJbnVtPXN0cmxlbihidWYpOworCisJcD1idWY7CisJYz0gKihwKyspOworCW51bS0tOworCWlmICgoYyA+PSAnMCcpICYmIChjIDw9ICcyJykpCisJCXsKKwkJZmlyc3Q9IGMtJzAnOworCQl9CisJZWxzZQorCQl7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGEyZF9BU04xX09CSkVDVCwgQVNOMV9SX0ZJUlNUX05VTV9UT09fTEFSR0UpOworCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKG51bSA8PSAwKQorCQl7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGEyZF9BU04xX09CSkVDVCwgQVNOMV9SX01JU1NJTkdfU0VDT05EX05VTUJFUik7CisJCWdvdG8gZXJyOworCQl9CisJYz0gKihwKyspOworCW51bS0tOworCWZvciAoOzspCisJCXsKKwkJaWYgKG51bSA8PSAwKSBicmVhazsKKwkJaWYgKChjICE9ICcuJykgJiYgKGMgIT0gJyAnKSkKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGEyZF9BU04xX09CSkVDVCwgQVNOMV9SX0lOVkFMSURfU0VQQVJBVE9SKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlsPTA7CisJCXVzZV9ibiA9IDA7CisJCWZvciAoOzspCisJCQl7CisJCQlpZiAobnVtIDw9IDApIGJyZWFrOworCQkJbnVtLS07CisJCQljPSAqKHArKyk7CisJCQlpZiAoKGMgPT0gJyAnKSB8fCAoYyA9PSAnLicpKQorCQkJCWJyZWFrOworCQkJaWYgKChjIDwgJzAnKSB8fCAoYyA+ICc5JykpCisJCQkJeworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGEyZF9BU04xX09CSkVDVCwgQVNOMV9SX0lOVkFMSURfRElHSVQpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCWlmICghdXNlX2JuICYmIGwgPj0gKChVTE9OR19NQVggLSA4MCkgLyAxMEwpKQorCQkJCXsKKwkJCQl1c2VfYm4gPSAxOworCQkJCWlmICghYmwpCisJCQkJCWJsID0gQk5fbmV3KCk7CisJCQkJaWYgKCFibCB8fCAhQk5fc2V0X3dvcmQoYmwsIGwpKQorCQkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQlpZiAodXNlX2JuKQorCQkJCXsKKwkJCQlpZiAoIUJOX211bF93b3JkKGJsLCAxMEwpCisJCQkJCXx8ICFCTl9hZGRfd29yZChibCwgYy0nMCcpKQorCQkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQllbHNlCisJCQkJbD1sKjEwTCsobG9uZykoYy0nMCcpOworCQkJfQorCQlpZiAobGVuID09IDApCisJCQl7CisJCQlpZiAoKGZpcnN0IDwgMikgJiYgKGwgPj0gNDApKQorCQkJCXsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhMmRfQVNOMV9PQkpFQ1QsIEFTTjFfUl9TRUNPTkRfTlVNQkVSX1RPT19MQVJHRSk7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJaWYgKHVzZV9ibikKKwkJCQl7CisJCQkJaWYgKCFCTl9hZGRfd29yZChibCwgZmlyc3QgKiA0MCkpCisJCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCWVsc2UKKwkJCQlsKz0obG9uZylmaXJzdCo0MDsKKwkJCX0KKwkJaT0wOworCQlpZiAodXNlX2JuKQorCQkJeworCQkJaW50IGJsc2l6ZTsKKwkJCWJsc2l6ZSA9IEJOX251bV9iaXRzKGJsKTsKKwkJCWJsc2l6ZSA9IChibHNpemUgKyA2KS83OworCQkJaWYgKGJsc2l6ZSA+IHRtcHNpemUpCisJCQkJeworCQkJCWlmICh0bXAgIT0gZnRtcCkKKwkJCQkJT1BFTlNTTF9mcmVlKHRtcCk7CisJCQkJdG1wc2l6ZSA9IGJsc2l6ZSArIDMyOworCQkJCXRtcCA9IE9QRU5TU0xfbWFsbG9jKHRtcHNpemUpOworCQkJCWlmICghdG1wKQorCQkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQl3aGlsZShibHNpemUtLSkKKwkJCQl0bXBbaSsrXSA9ICh1bnNpZ25lZCBjaGFyKUJOX2Rpdl93b3JkKGJsLCAweDgwTCk7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCQkJCisJCQlmb3IgKDs7KQorCQkJCXsKKwkJCQl0bXBbaSsrXT0odW5zaWduZWQgY2hhcilsJjB4N2Y7CisJCQkJbD4+PTdMOworCQkJCWlmIChsID09IDBMKSBicmVhazsKKwkJCQl9CisKKwkJCX0KKwkJaWYgKG91dCAhPSBOVUxMKQorCQkJeworCQkJaWYgKGxlbitpID4gb2xlbikKKwkJCQl7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYTJkX0FTTjFfT0JKRUNULCBBU04xX1JfQlVGRkVSX1RPT19TTUFMTCk7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJd2hpbGUgKC0taSA+IDApCisJCQkJb3V0W2xlbisrXT10bXBbaV18MHg4MDsKKwkJCW91dFtsZW4rK109dG1wWzBdOworCQkJfQorCQllbHNlCisJCQlsZW4rPWk7CisJCX0KKwlpZiAodG1wICE9IGZ0bXApCisJCU9QRU5TU0xfZnJlZSh0bXApOworCWlmIChibCkKKwkJQk5fZnJlZShibCk7CisJcmV0dXJuKGxlbik7CitlcnI6CisJaWYgKHRtcCAhPSBmdG1wKQorCQlPUEVOU1NMX2ZyZWUodG1wKTsKKwlpZiAoYmwpCisJCUJOX2ZyZWUoYmwpOworCXJldHVybigwKTsKKwl9CisKK2ludCBpMnRfQVNOMV9PQkpFQ1QoY2hhciAqYnVmLCBpbnQgYnVmX2xlbiwgQVNOMV9PQkpFQ1QgKmEpCit7CisJcmV0dXJuIE9CSl9vYmoydHh0KGJ1ZiwgYnVmX2xlbiwgYSwgMCk7Cit9CisKK2ludCBpMmFfQVNOMV9PQkpFQ1QoQklPICpicCwgQVNOMV9PQkpFQ1QgKmEpCisJeworCWNoYXIgYnVmWzgwXSwgKnAgPSBidWY7CisJaW50IGk7CisKKwlpZiAoKGEgPT0gTlVMTCkgfHwgKGEtPmRhdGEgPT0gTlVMTCkpCisJCXJldHVybihCSU9fd3JpdGUoYnAsIk5VTEwiLDQpKTsKKwlpPWkydF9BU04xX09CSkVDVChidWYsc2l6ZW9mIGJ1ZixhKTsKKwlpZiAoaSA+IChpbnQpKHNpemVvZihidWYpIC0gMSkpCisJCXsKKwkJcCA9IE9QRU5TU0xfbWFsbG9jKGkgKyAxKTsKKwkJaWYgKCFwKQorCQkJcmV0dXJuIC0xOworCQlpMnRfQVNOMV9PQkpFQ1QocCxpICsgMSxhKTsKKwkJfQorCWlmIChpIDw9IDApCisJCXJldHVybiBCSU9fd3JpdGUoYnAsICI8SU5WQUxJRD4iLCA5KTsKKwlCSU9fd3JpdGUoYnAscCxpKTsKKwlpZiAocCAhPSBidWYpCisJCU9QRU5TU0xfZnJlZShwKTsKKwlyZXR1cm4oaSk7CisJfQorCitBU04xX09CSkVDVCAqZDJpX0FTTjFfT0JKRUNUKEFTTjFfT0JKRUNUICoqYSwgY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLAorCSAgICAgbG9uZyBsZW5ndGgpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKwlsb25nIGxlbjsKKwlpbnQgdGFnLHhjbGFzczsKKwlpbnQgaW5mLGk7CisJQVNOMV9PQkpFQ1QgKnJldCA9IE5VTEw7CisJcD0gKnBwOworCWluZj1BU04xX2dldF9vYmplY3QoJnAsJmxlbiwmdGFnLCZ4Y2xhc3MsbGVuZ3RoKTsKKwlpZiAoaW5mICYgMHg4MCkKKwkJeworCQlpPUFTTjFfUl9CQURfT0JKRUNUX0hFQURFUjsKKwkJZ290byBlcnI7CisJCX0KKworCWlmICh0YWcgIT0gVl9BU04xX09CSkVDVCkKKwkJeworCQlpPUFTTjFfUl9FWFBFQ1RJTkdfQU5fT0JKRUNUOworCQlnb3RvIGVycjsKKwkJfQorCXJldCA9IGMyaV9BU04xX09CSkVDVChhLCAmcCwgbGVuKTsKKwlpZihyZXQpICpwcCA9IHA7CisJcmV0dXJuIHJldDsKK2VycjoKKwlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBkMmlfQVNOMV9PQkpFQ1QsIGkpOworCXJldHVybihOVUxMKTsKK30KK0FTTjFfT0JKRUNUICpjMmlfQVNOMV9PQkpFQ1QoQVNOMV9PQkpFQ1QgKiphLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsCisJICAgICBsb25nIGxlbikKKwl7CisJQVNOMV9PQkpFQ1QgKnJldD1OVUxMOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwlpbnQgaTsKKwkvKiBTYW5pdHkgY2hlY2sgT0lEIGVuY29kaW5nOiBjYW4ndCBoYXZlIGxlYWRpbmcgMHg4MCBpbgorCSAqIHN1YmlkZW50aWZpZXJzLCBzZWU6IFguNjkwIDguMTkuMgorCSAqLworCWZvciAoaSA9IDAsIHAgPSAqcHA7IGkgPCBsZW47IGkrKywgcCsrKQorCQl7CisJCWlmICgqcCA9PSAweDgwICYmICghaSB8fCAhKHBbLTFdICYgMHg4MCkpKQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYzJpX0FTTjFfT0JKRUNULCBBU04xX1JfSU5WQUxJRF9PQkpFQ1RfRU5DT0RJTkcpOworCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKworCS8qIG9ubHkgdGhlIEFTTjFfT0JKRUNUcyBmcm9tIHRoZSAndGFibGUnIHdpbGwgaGF2ZSB2YWx1ZXMKKwkgKiBmb3IgLT5zbiBvciAtPmxuICovCisJaWYgKChhID09IE5VTEwpIHx8ICgoKmEpID09IE5VTEwpIHx8CisJCSEoKCphKS0+ZmxhZ3MgJiBBU04xX09CSkVDVF9GTEFHX0RZTkFNSUMpKQorCQl7CisJCWlmICgocmV0PUFTTjFfT0JKRUNUX25ldygpKSA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CisJCX0KKwllbHNlCXJldD0oKmEpOworCisJcD0gKnBwOworCS8qIGRldGFjaCBkYXRhIGZyb20gb2JqZWN0ICovCisJZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopcmV0LT5kYXRhOworCXJldC0+ZGF0YSA9IE5VTEw7CisJLyogb25jZSBkZXRhY2hlZCB3ZSBjYW4gY2hhbmdlIGl0ICovCisJaWYgKChkYXRhID09IE5VTEwpIHx8IChyZXQtPmxlbmd0aCA8IGxlbikpCisJCXsKKwkJcmV0LT5sZW5ndGg9MDsKKwkJaWYgKGRhdGEgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKGRhdGEpOworCQlkYXRhPSh1bnNpZ25lZCBjaGFyICopT1BFTlNTTF9tYWxsb2MobGVuID8gKGludClsZW4gOiAxKTsKKwkJaWYgKGRhdGEgPT0gTlVMTCkKKwkJCXsgaT1FUlJfUl9NQUxMT0NfRkFJTFVSRTsgZ290byBlcnI7IH0KKwkJcmV0LT5mbGFnc3w9QVNOMV9PQkpFQ1RfRkxBR19EWU5BTUlDX0RBVEE7CisJCX0KKwltZW1jcHkoZGF0YSxwLChpbnQpbGVuKTsKKwkvKiByZWF0dGFjaCBkYXRhIHRvIG9iamVjdCwgYWZ0ZXIgd2hpY2ggaXQgcmVtYWlucyBjb25zdCAqLworCXJldC0+ZGF0YSAgPWRhdGE7CisJcmV0LT5sZW5ndGg9KGludClsZW47CisJcmV0LT5zbj1OVUxMOworCXJldC0+bG49TlVMTDsKKwkvKiByZXQtPmZsYWdzPUFTTjFfT0JKRUNUX0ZMQUdfRFlOQU1JQzsgd2Uga25vdyBpdCBpcyBkeW5hbWljICovCisJcCs9bGVuOworCisJaWYgKGEgIT0gTlVMTCkgKCphKT1yZXQ7CisJKnBwPXA7CisJcmV0dXJuKHJldCk7CitlcnI6CisJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYzJpX0FTTjFfT0JKRUNULCBpKTsKKwlpZiAoKHJldCAhPSBOVUxMKSAmJiAoKGEgPT0gTlVMTCkgfHwgKCphICE9IHJldCkpKQorCQlBU04xX09CSkVDVF9mcmVlKHJldCk7CisJcmV0dXJuKE5VTEwpOworCX0KKworQVNOMV9PQkpFQ1QgKkFTTjFfT0JKRUNUX25ldyh2b2lkKQorCXsKKwlBU04xX09CSkVDVCAqcmV0OworCisJcmV0PShBU04xX09CSkVDVCAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihBU04xX09CSkVDVCkpOworCWlmIChyZXQgPT0gTlVMTCkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX09CSkVDVF9uZXcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisJcmV0LT5sZW5ndGg9MDsKKwlyZXQtPmRhdGE9TlVMTDsKKwlyZXQtPm5pZD0wOworCXJldC0+c249TlVMTDsKKwlyZXQtPmxuPU5VTEw7CisJcmV0LT5mbGFncz1BU04xX09CSkVDVF9GTEFHX0RZTkFNSUM7CisJcmV0dXJuKHJldCk7CisJfQorCit2b2lkIEFTTjFfT0JKRUNUX2ZyZWUoQVNOMV9PQkpFQ1QgKmEpCisJeworCWlmIChhID09IE5VTEwpIHJldHVybjsKKwlpZiAoYS0+ZmxhZ3MgJiBBU04xX09CSkVDVF9GTEFHX0RZTkFNSUNfU1RSSU5HUykKKwkJeworI2lmbmRlZiBDT05TVF9TVFJJQ1QgLyogZGlzYWJsZSBwdXJlbHkgZm9yIGNvbXBpbGUtdGltZSBzdHJpY3QgY29uc3QgY2hlY2tpbmcuIERvaW5nIHRoaXMgb24gYSAicmVhbCIgY29tcGlsZSB3aWxsIGNhdXNlIG1lbW9yeSBsZWFrcyAqLworCQlpZiAoYS0+c24gIT0gTlVMTCkgT1BFTlNTTF9mcmVlKCh2b2lkICopYS0+c24pOworCQlpZiAoYS0+bG4gIT0gTlVMTCkgT1BFTlNTTF9mcmVlKCh2b2lkICopYS0+bG4pOworI2VuZGlmCisJCWEtPnNuPWEtPmxuPU5VTEw7CisJCX0KKwlpZiAoYS0+ZmxhZ3MgJiBBU04xX09CSkVDVF9GTEFHX0RZTkFNSUNfREFUQSkKKwkJeworCQlpZiAoYS0+ZGF0YSAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUoKHZvaWQgKilhLT5kYXRhKTsKKwkJYS0+ZGF0YT1OVUxMOworCQlhLT5sZW5ndGg9MDsKKwkJfQorCWlmIChhLT5mbGFncyAmIEFTTjFfT0JKRUNUX0ZMQUdfRFlOQU1JQykKKwkJT1BFTlNTTF9mcmVlKGEpOworCX0KKworQVNOMV9PQkpFQ1QgKkFTTjFfT0JKRUNUX2NyZWF0ZShpbnQgbmlkLCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuLAorCSAgICAgY29uc3QgY2hhciAqc24sIGNvbnN0IGNoYXIgKmxuKQorCXsKKwlBU04xX09CSkVDVCBvOworCisJby5zbj1zbjsKKwlvLmxuPWxuOworCW8uZGF0YT1kYXRhOworCW8ubmlkPW5pZDsKKwlvLmxlbmd0aD1sZW47CisJby5mbGFncz1BU04xX09CSkVDVF9GTEFHX0RZTkFNSUN8QVNOMV9PQkpFQ1RfRkxBR19EWU5BTUlDX1NUUklOR1N8CisJCUFTTjFfT0JKRUNUX0ZMQUdfRFlOQU1JQ19EQVRBOworCXJldHVybihPQkpfZHVwKCZvKSk7CisJfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FzbjEvYV9vY3RldC5jIGIvY3J5cHRvL2FzbjEvYV9vY3RldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4M2M5ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYXNuMS9hX29jdGV0LmMKQEAgLTAsMCArMSw3MCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorCisKK0FTTjFfT0NURVRfU1RSSU5HICpBU04xX09DVEVUX1NUUklOR19kdXAoY29uc3QgQVNOMV9PQ1RFVF9TVFJJTkcgKngpCit7IHJldHVybiBNX0FTTjFfT0NURVRfU1RSSU5HX2R1cCh4KTsgfQorCitpbnQgQVNOMV9PQ1RFVF9TVFJJTkdfY21wKGNvbnN0IEFTTjFfT0NURVRfU1RSSU5HICphLCBjb25zdCBBU04xX09DVEVUX1NUUklORyAqYikKK3sgcmV0dXJuIE1fQVNOMV9PQ1RFVF9TVFJJTkdfY21wKGEsIGIpOyB9CisKK2ludCBBU04xX09DVEVUX1NUUklOR19zZXQoQVNOMV9PQ1RFVF9TVFJJTkcgKngsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmQsIGludCBsZW4pCit7IHJldHVybiBNX0FTTjFfT0NURVRfU1RSSU5HX3NldCh4LCBkLCBsZW4pOyB9CmRpZmYgLS1naXQgYS9jcnlwdG8vYXNuMS9hX3ByaW50LmMgYi9jcnlwdG8vYXNuMS9hX3ByaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJjZGU2OAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9hc24xL2FfcHJpbnQuYwpAQCAtMCwwICsxLDEyNyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorCisKK2ludCBBU04xX1BSSU5UQUJMRV90eXBlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMsIGludCBsZW4pCisJeworCWludCBjOworCWludCBpYTU9MDsKKwlpbnQgdDYxPTA7CisKKwlpZiAobGVuIDw9IDApIGxlbj0gLTE7CisJaWYgKHMgPT0gTlVMTCkgcmV0dXJuKFZfQVNOMV9QUklOVEFCTEVTVFJJTkcpOworCisJd2hpbGUgKCgqcykgJiYgKGxlbi0tICE9IDApKQorCQl7CisJCWM9ICoocysrKTsKKyNpZm5kZWYgQ0hBUlNFVF9FQkNESUMKKwkJaWYgKCEoCSgoYyA+PSAnYScpICYmIChjIDw9ICd6JykpIHx8CisJCQkoKGMgPj0gJ0EnKSAmJiAoYyA8PSAnWicpKSB8fAorCQkJKGMgPT0gJyAnKSB8fAorCQkJKChjID49ICcwJykgJiYgKGMgPD0gJzknKSkgfHwKKwkJCShjID09ICcgJykgfHwgKGMgPT0gJ1wnJykgfHwKKwkJCShjID09ICcoJykgfHwgKGMgPT0gJyknKSB8fAorCQkJKGMgPT0gJysnKSB8fCAoYyA9PSAnLCcpIHx8CisJCQkoYyA9PSAnLScpIHx8IChjID09ICcuJykgfHwKKwkJCShjID09ICcvJykgfHwgKGMgPT0gJzonKSB8fAorCQkJKGMgPT0gJz0nKSB8fCAoYyA9PSAnPycpKSkKKwkJCWlhNT0xOworCQlpZiAoYyYweDgwKQorCQkJdDYxPTE7CisjZWxzZQorCQlpZiAoIWlzYWxudW0oYykgJiYgKGMgIT0gJyAnKSAmJgorCQkgICAgc3RyY2hyKCInKCkrLC0uLzo9PyIsIGMpID09IE5VTEwpCisJCQlpYTU9MTsKKwkJaWYgKG9zX3RvYXNjaWlbY10gJiAweDgwKQorCQkJdDYxPTE7CisjZW5kaWYKKwkJfQorCWlmICh0NjEpIHJldHVybihWX0FTTjFfVDYxU1RSSU5HKTsKKwlpZiAoaWE1KSByZXR1cm4oVl9BU04xX0lBNVNUUklORyk7CisJcmV0dXJuKFZfQVNOMV9QUklOVEFCTEVTVFJJTkcpOworCX0KKworaW50IEFTTjFfVU5JVkVSU0FMU1RSSU5HX3RvX3N0cmluZyhBU04xX1VOSVZFUlNBTFNUUklORyAqcykKKwl7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciAqcDsKKworCWlmIChzLT50eXBlICE9IFZfQVNOMV9VTklWRVJTQUxTVFJJTkcpIHJldHVybigwKTsKKwlpZiAoKHMtPmxlbmd0aCU0KSAhPSAwKSByZXR1cm4oMCk7CisJcD1zLT5kYXRhOworCWZvciAoaT0wOyBpPHMtPmxlbmd0aDsgaSs9NCkKKwkJeworCQlpZiAoKHBbMF0gIT0gJ1wwJykgfHwgKHBbMV0gIT0gJ1wwJykgfHwgKHBbMl0gIT0gJ1wwJykpCisJCQlicmVhazsKKwkJZWxzZQorCQkJcCs9NDsKKwkJfQorCWlmIChpIDwgcy0+bGVuZ3RoKSByZXR1cm4oMCk7CisJcD1zLT5kYXRhOworCWZvciAoaT0zOyBpPHMtPmxlbmd0aDsgaSs9NCkKKwkJeworCQkqKHArKyk9cy0+ZGF0YVtpXTsKKwkJfQorCSoocCk9J1wwJzsKKwlzLT5sZW5ndGgvPTQ7CisJcy0+dHlwZT1BU04xX1BSSU5UQUJMRV90eXBlKHMtPmRhdGEscy0+bGVuZ3RoKTsKKwlyZXR1cm4oMSk7CisJfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FzbjEvYV9zdHJuaWQuYyBiL2NyeXB0by9hc24xL2Ffc3RybmlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM2YzZkOQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9hc24xL2Ffc3RybmlkLmMKQEAgLTAsMCArMSwyODMgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPiAgLyogRm9yIGJzZWFyY2ggKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgorCisKK3N0YXRpYyBTVEFDS19PRihBU04xX1NUUklOR19UQUJMRSkgKnN0YWJsZSA9IE5VTEw7CitzdGF0aWMgdm9pZCBzdF9mcmVlKEFTTjFfU1RSSU5HX1RBQkxFICp0YmwpOworCisvKiBUaGlzIGlzIHRoZSBnbG9iYWwgbWFzayBmb3IgdGhlIG1ic3RyaW5nIGZ1bmN0aW9uczogdGhpcyBpcyB1c2UgdG8KKyAqIG1hc2sgb3V0IGNlcnRhaW4gdHlwZXMgKHN1Y2ggYXMgQk1QU3RyaW5nIGFuZCBVVEY4U3RyaW5nKSBiZWNhdXNlCisgKiBjZXJ0YWluIHNvZnR3YXJlIChlLmcuIE5ldHNjYXBlKSBoYXMgcHJvYmxlbXMgd2l0aCB0aGVtLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdsb2JhbF9tYXNrID0gMHhGRkZGRkZGRkw7CisKK3ZvaWQgQVNOMV9TVFJJTkdfc2V0X2RlZmF1bHRfbWFzayh1bnNpZ25lZCBsb25nIG1hc2spCit7CisJZ2xvYmFsX21hc2sgPSBtYXNrOworfQorCit1bnNpZ25lZCBsb25nIEFTTjFfU1RSSU5HX2dldF9kZWZhdWx0X21hc2sodm9pZCkKK3sKKwlyZXR1cm4gZ2xvYmFsX21hc2s7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgZGVmYXVsdCB0byB2YXJpb3VzICJmbGF2b3VycyIgb2YgY29uZmlndXJhdGlvbi4KKyAqIGJhc2VkIG9uIGFuIEFTQ0lJIHN0cmluZy4gQ3VycmVudGx5IHRoaXMgaXM6CisgKiBNQVNLOlhYWFggOiBhIG51bWVyaWNhbCBtYXNrIHZhbHVlLgorICogbm9ibXAgOiBEb24ndCB1c2UgQk1QU3RyaW5ncyAoanVzdCBQcmludGFibGUsIFQ2MSkuCisgKiBwa2l4IDogUEtJWCByZWNvbW1lbmRhdGlvbiBpbiBSRkMyNDU5LgorICogdXRmOG9ubHkgOiBvbmx5IHVzZSBVVEY4U3RyaW5ncyAoUkZDMjQ1OSByZWNvbW1lbmRhdGlvbiBmb3IgMjAwNCkuCisgKiBkZWZhdWx0OiAgIHRoZSBkZWZhdWx0IHZhbHVlLCBQcmludGFibGUsIFQ2MSwgQk1QLgorICovCisKK2ludCBBU04xX1NUUklOR19zZXRfZGVmYXVsdF9tYXNrX2FzYyhjb25zdCBjaGFyICpwKQoreworCXVuc2lnbmVkIGxvbmcgbWFzazsKKwljaGFyICplbmQ7CisJaWYoIXN0cm5jbXAocCwgIk1BU0s6IiwgNSkpIHsKKwkJaWYoIXBbNV0pIHJldHVybiAwOworCQltYXNrID0gc3RydG91bChwICsgNSwgJmVuZCwgMCk7CisJCWlmKCplbmQpIHJldHVybiAwOworCX0gZWxzZSBpZighc3RyY21wKHAsICJub21ic3RyIikpCisJCQkgbWFzayA9IH4oKHVuc2lnbmVkIGxvbmcpKEJfQVNOMV9CTVBTVFJJTkd8Ql9BU04xX1VURjhTVFJJTkcpKTsKKwllbHNlIGlmKCFzdHJjbXAocCwgInBraXgiKSkKKwkJCW1hc2sgPSB+KCh1bnNpZ25lZCBsb25nKUJfQVNOMV9UNjFTVFJJTkcpOworCWVsc2UgaWYoIXN0cmNtcChwLCAidXRmOG9ubHkiKSkgbWFzayA9IEJfQVNOMV9VVEY4U1RSSU5HOworCWVsc2UgaWYoIXN0cmNtcChwLCAiZGVmYXVsdCIpKQorCSAgICBtYXNrID0gMHhGRkZGRkZGRkw7CisJZWxzZSByZXR1cm4gMDsKKwlBU04xX1NUUklOR19zZXRfZGVmYXVsdF9tYXNrKG1hc2spOworCXJldHVybiAxOworfQorCisvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGdlbmVyYXRlcyBhbiBBU04xX1NUUklORyBiYXNlZCBvbiBsaW1pdHMgaW4gYSB0YWJsZS4KKyAqIEZyZXF1ZW50bHkgdGhlIHR5cGVzIGFuZCBsZW5ndGggb2YgYW4gQVNOMV9TVFJJTkcgYXJlIHJlc3RyaWN0ZWQgYnkgYSAKKyAqIGNvcnJlc3BvbmRpbmcgT0lELiBGb3IgZXhhbXBsZSBjZXJ0aWZpY2F0ZXMgYW5kIGNlcnRpZmljYXRlIHJlcXVlc3RzLgorICovCisKK0FTTjFfU1RSSU5HICpBU04xX1NUUklOR19zZXRfYnlfTklEKEFTTjFfU1RSSU5HICoqb3V0LCBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwKKwkJCQkJaW50IGlubGVuLCBpbnQgaW5mb3JtLCBpbnQgbmlkKQoreworCUFTTjFfU1RSSU5HX1RBQkxFICp0Ymw7CisJQVNOMV9TVFJJTkcgKnN0ciA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBtYXNrOworCWludCByZXQ7CisJaWYoIW91dCkgb3V0ID0gJnN0cjsKKwl0YmwgPSBBU04xX1NUUklOR19UQUJMRV9nZXQobmlkKTsKKwlpZih0YmwpIHsKKwkJbWFzayA9IHRibC0+bWFzazsKKwkJaWYoISh0YmwtPmZsYWdzICYgU1RBQkxFX05PX01BU0spKSBtYXNrICY9IGdsb2JhbF9tYXNrOworCQlyZXQgPSBBU04xX21ic3RyaW5nX25jb3B5KG91dCwgaW4sIGlubGVuLCBpbmZvcm0sIG1hc2ssCisJCQkJCXRibC0+bWluc2l6ZSwgdGJsLT5tYXhzaXplKTsKKwl9IGVsc2UgcmV0ID0gQVNOMV9tYnN0cmluZ19jb3B5KG91dCwgaW4sIGlubGVuLCBpbmZvcm0sIERJUlNUUklOR19UWVBFICYgZ2xvYmFsX21hc2spOworCWlmKHJldCA8PSAwKSByZXR1cm4gTlVMTDsKKwlyZXR1cm4gKm91dDsKK30KKworLyogTm93IHRoZSB0YWJsZXMgYW5kIGhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBzdHJpbmcgdGFibGU6CisgKi8KKworLyogc2l6ZSBsaW1pdHM6IHRoaXMgc3R1ZmYgaXMgdGFrZW4gc3RyYWlnaHQgZnJvbSBSRkMzMjgwICovCisKKyNkZWZpbmUgdWJfbmFtZQkJCQkzMjc2OAorI2RlZmluZSB1Yl9jb21tb25fbmFtZQkJCTY0CisjZGVmaW5lIHViX2xvY2FsaXR5X25hbWUJCTEyOAorI2RlZmluZSB1Yl9zdGF0ZV9uYW1lCQkJMTI4CisjZGVmaW5lIHViX29yZ2FuaXphdGlvbl9uYW1lCQk2NAorI2RlZmluZSB1Yl9vcmdhbml6YXRpb25fdW5pdF9uYW1lCTY0CisjZGVmaW5lIHViX3RpdGxlCQkJNjQKKyNkZWZpbmUgdWJfZW1haWxfYWRkcmVzcwkJMTI4CisjZGVmaW5lIHViX3NlcmlhbF9udW1iZXIJCTY0CisKKworLyogVGhpcyB0YWJsZSBtdXN0IGJlIGtlcHQgaW4gTklEIG9yZGVyICovCisKK3N0YXRpYyBjb25zdCBBU04xX1NUUklOR19UQUJMRSB0Ymxfc3RhbmRhcmRbXSA9IHsKK3tOSURfY29tbW9uTmFtZSwJCTEsIHViX2NvbW1vbl9uYW1lLCBESVJTVFJJTkdfVFlQRSwgMH0sCit7TklEX2NvdW50cnlOYW1lLAkJMiwgMiwgQl9BU04xX1BSSU5UQUJMRVNUUklORywgU1RBQkxFX05PX01BU0t9LAore05JRF9sb2NhbGl0eU5hbWUsCQkxLCB1Yl9sb2NhbGl0eV9uYW1lLCBESVJTVFJJTkdfVFlQRSwgMH0sCit7TklEX3N0YXRlT3JQcm92aW5jZU5hbWUsCTEsIHViX3N0YXRlX25hbWUsIERJUlNUUklOR19UWVBFLCAwfSwKK3tOSURfb3JnYW5pemF0aW9uTmFtZSwJCTEsIHViX29yZ2FuaXphdGlvbl9uYW1lLCBESVJTVFJJTkdfVFlQRSwgMH0sCit7TklEX29yZ2FuaXphdGlvbmFsVW5pdE5hbWUsCTEsIHViX29yZ2FuaXphdGlvbl91bml0X25hbWUsIERJUlNUUklOR19UWVBFLCAwfSwKK3tOSURfcGtjczlfZW1haWxBZGRyZXNzLAkxLCB1Yl9lbWFpbF9hZGRyZXNzLCBCX0FTTjFfSUE1U1RSSU5HLCBTVEFCTEVfTk9fTUFTS30sCit7TklEX3BrY3M5X3Vuc3RydWN0dXJlZE5hbWUsCTEsIC0xLCBQS0NTOVNUUklOR19UWVBFLCAwfSwKK3tOSURfcGtjczlfY2hhbGxlbmdlUGFzc3dvcmQsCTEsIC0xLCBQS0NTOVNUUklOR19UWVBFLCAwfSwKK3tOSURfcGtjczlfdW5zdHJ1Y3R1cmVkQWRkcmVzcywJMSwgLTEsIERJUlNUUklOR19UWVBFLCAwfSwKK3tOSURfZ2l2ZW5OYW1lLAkJCTEsIHViX25hbWUsIERJUlNUUklOR19UWVBFLCAwfSwKK3tOSURfc3VybmFtZSwJCQkxLCB1Yl9uYW1lLCBESVJTVFJJTkdfVFlQRSwgMH0sCit7TklEX2luaXRpYWxzLAkJCTEsIHViX25hbWUsIERJUlNUUklOR19UWVBFLCAwfSwKK3tOSURfc2VyaWFsTnVtYmVyLAkJMSwgdWJfc2VyaWFsX251bWJlciwgQl9BU04xX1BSSU5UQUJMRVNUUklORywgU1RBQkxFX05PX01BU0t9LAore05JRF9mcmllbmRseU5hbWUsCQktMSwgLTEsIEJfQVNOMV9CTVBTVFJJTkcsIFNUQUJMRV9OT19NQVNLfSwKK3tOSURfbmFtZSwJCQkxLCB1Yl9uYW1lLCBESVJTVFJJTkdfVFlQRSwgMH0sCit7TklEX2RuUXVhbGlmaWVyLAkJLTEsIC0xLCBCX0FTTjFfUFJJTlRBQkxFU1RSSU5HLCBTVEFCTEVfTk9fTUFTS30sCit7TklEX2RvbWFpbkNvbXBvbmVudCwJCTEsIC0xLCBCX0FTTjFfSUE1U1RSSU5HLCBTVEFCTEVfTk9fTUFTS30sCit7TklEX21zX2NzcF9uYW1lLAkJLTEsIC0xLCBCX0FTTjFfQk1QU1RSSU5HLCBTVEFCTEVfTk9fTUFTS30KK307CisKK3N0YXRpYyBpbnQgc2tfdGFibGVfY21wKGNvbnN0IEFTTjFfU1RSSU5HX1RBQkxFICoqYSwKKwkJCWNvbnN0IEFTTjFfU1RSSU5HX1RBQkxFICoqYikKK3sKKwlyZXR1cm4gKCphKS0+bmlkIC0gKCpiKS0+bmlkOworfQorCitzdGF0aWMgaW50IHRhYmxlX2NtcChjb25zdCB2b2lkICppbl9hLCBjb25zdCB2b2lkICppbl9iKQoreworCWNvbnN0IEFTTjFfU1RSSU5HX1RBQkxFICphID0gaW5fYTsKKwljb25zdCBBU04xX1NUUklOR19UQUJMRSAqYiA9IGluX2I7CisJcmV0dXJuIGEtPm5pZCAtIGItPm5pZDsKK30KKworQVNOMV9TVFJJTkdfVEFCTEUgKkFTTjFfU1RSSU5HX1RBQkxFX2dldChpbnQgbmlkKQoreworCWludCBmb3VuZDsKKwlzaXplX3QgaWR4OworCUFTTjFfU1RSSU5HX1RBQkxFICp0dG1wOworCUFTTjFfU1RSSU5HX1RBQkxFIGZuZDsKKwlmbmQubmlkID0gbmlkOworCisJdHRtcCA9IGJzZWFyY2goJmZuZCwgdGJsX3N0YW5kYXJkLCBzaXplb2YodGJsX3N0YW5kYXJkKS9zaXplb2YoQVNOMV9TVFJJTkdfVEFCTEUpLCBzaXplb2YoQVNOMV9TVFJJTkdfVEFCTEUpLCB0YWJsZV9jbXApOworCWlmKHR0bXApIHJldHVybiB0dG1wOworCWlmKCFzdGFibGUpIHJldHVybiBOVUxMOworCWZvdW5kID0gc2tfQVNOMV9TVFJJTkdfVEFCTEVfZmluZChzdGFibGUsICZpZHgsICZmbmQpOworCWlmICghZm91bmQpIHJldHVybiBOVUxMOworCXJldHVybiBza19BU04xX1NUUklOR19UQUJMRV92YWx1ZShzdGFibGUsIGlkeCk7Cit9CisJCitpbnQgQVNOMV9TVFJJTkdfVEFCTEVfYWRkKGludCBuaWQsCisJCSBsb25nIG1pbnNpemUsIGxvbmcgbWF4c2l6ZSwgdW5zaWduZWQgbG9uZyBtYXNrLAorCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJQVNOMV9TVFJJTkdfVEFCTEUgKnRtcDsKKwljaGFyIG5ld19uaWQgPSAwOworCWZsYWdzICY9IH5TVEFCTEVfRkxBR1NfTUFMTE9DOworCWlmKCFzdGFibGUpIHN0YWJsZSA9IHNrX0FTTjFfU1RSSU5HX1RBQkxFX25ldyhza190YWJsZV9jbXApOworCWlmKCFzdGFibGUpIHsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9TVFJJTkdfVEFCTEVfYWRkLCAgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYoISh0bXAgPSBBU04xX1NUUklOR19UQUJMRV9nZXQobmlkKSkpIHsKKwkJdG1wID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEFTTjFfU1RSSU5HX1RBQkxFKSk7CisJCWlmKCF0bXApIHsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfU1RSSU5HX1RBQkxFX2FkZCwgIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldHVybiAwOworCQl9CisJCXRtcC0+ZmxhZ3MgPSBmbGFncyB8IFNUQUJMRV9GTEFHU19NQUxMT0M7CisJCXRtcC0+bmlkID0gbmlkOworCQluZXdfbmlkID0gMTsKKwl9IGVsc2UgdG1wLT5mbGFncyA9ICh0bXAtPmZsYWdzICYgU1RBQkxFX0ZMQUdTX01BTExPQykgfCBmbGFnczsKKwlpZihtaW5zaXplICE9IC0xKSB0bXAtPm1pbnNpemUgPSBtaW5zaXplOworCWlmKG1heHNpemUgIT0gLTEpIHRtcC0+bWF4c2l6ZSA9IG1heHNpemU7CisJdG1wLT5tYXNrID0gbWFzazsKKwlpZihuZXdfbmlkKSBza19BU04xX1NUUklOR19UQUJMRV9wdXNoKHN0YWJsZSwgdG1wKTsKKwlyZXR1cm4gMTsKK30KKwordm9pZCBBU04xX1NUUklOR19UQUJMRV9jbGVhbnVwKHZvaWQpCit7CisJU1RBQ0tfT0YoQVNOMV9TVFJJTkdfVEFCTEUpICp0bXA7CisJdG1wID0gc3RhYmxlOworCWlmKCF0bXApIHJldHVybjsKKwlzdGFibGUgPSBOVUxMOworCXNrX0FTTjFfU1RSSU5HX1RBQkxFX3BvcF9mcmVlKHRtcCwgc3RfZnJlZSk7Cit9CisKK3N0YXRpYyB2b2lkIHN0X2ZyZWUoQVNOMV9TVFJJTkdfVEFCTEUgKnRibCkKK3sKKwlpZih0YmwtPmZsYWdzICYgU1RBQkxFX0ZMQUdTX01BTExPQykgT1BFTlNTTF9mcmVlKHRibCk7Cit9CisKKworI2lmZGVmIFNUUklOR19UQUJMRV9URVNUCisKK21haW4oKQoreworCUFTTjFfU1RSSU5HX1RBQkxFICp0bXA7CisJaW50IGksIGxhc3RfbmlkID0gLTE7CisKKwlmb3IgKHRtcCA9IHRibF9zdGFuZGFyZCwgaSA9IDA7CisJCWkgPCBzaXplb2YodGJsX3N0YW5kYXJkKS9zaXplb2YoQVNOMV9TVFJJTkdfVEFCTEUpOyBpKyssIHRtcCsrKQorCQl7CisJCQlpZiAodG1wLT5uaWQgPCBsYXN0X25pZCkKKwkJCQl7CisJCQkJbGFzdF9uaWQgPSAwOworCQkJCWJyZWFrOworCQkJCX0KKwkJCWxhc3RfbmlkID0gdG1wLT5uaWQ7CisJCX0KKworCWlmIChsYXN0X25pZCAhPSAwKQorCQl7CisJCXByaW50ZigiVGFibGUgb3JkZXIgT0tcbiIpOworCQlleGl0KDApOworCQl9CisKKwlmb3IgKHRtcCA9IHRibF9zdGFuZGFyZCwgaSA9IDA7CisJCWkgPCBzaXplb2YodGJsX3N0YW5kYXJkKS9zaXplb2YoQVNOMV9TVFJJTkdfVEFCTEUpOyBpKyssIHRtcCsrKQorCQkJcHJpbnRmKCJJbmRleCAlZCwgTklEICVkLCBOYW1lPSVzXG4iLCBpLCB0bXAtPm5pZCwKKwkJCQkJCQlPQkpfbmlkMmxuKHRtcC0+bmlkKSk7CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9jcnlwdG8vYXNuMS9hX3RpbWUuYyBiL2NyeXB0by9hc24xL2FfdGltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiODBiYTQKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYXNuMS9hX3RpbWUuYwpAQCAtMCwwICsxLDIzMyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYnVmLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvdGltZV9zdXBwb3J0Lmg+CisKKyNpbmNsdWRlICJhc24xX2xvY2wuaCIKKworCisvKiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBU04xIFRpbWUgc3RydWN0dXJlIHdoaWNoIGlzOgorICogICAgVGltZSA6Oj0gQ0hPSUNFIHsKKyAqICAgICAgdXRjVGltZSAgICAgICAgVVRDVGltZSwKKyAqICAgICAgZ2VuZXJhbFRpbWUgICAgR2VuZXJhbGl6ZWRUaW1lIH0KKyAqIHdyaXR0ZW4gYnkgU3RldmUgSGVuc29uLgorICovCisKK0lNUExFTUVOVF9BU04xX01TVFJJTkcoQVNOMV9USU1FLCBCX0FTTjFfVElNRSkKKworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKEFTTjFfVElNRSkKKworI2lmIDAKK2ludCBpMmRfQVNOMV9USU1FKEFTTjFfVElNRSAqYSwgdW5zaWduZWQgY2hhciAqKnBwKQorCXsKKyNpZmRlZiBDSEFSU0VUX0VCQ0RJQworCS8qIEtMVURHRSEgV2UgY29udmVydCB0byBhc2NpaSBiZWZvcmUgd3JpdGluZyBERVIgKi8KKwljaGFyIHRtcFsyNF07CisJQVNOMV9TVFJJTkcgdG1wc3RyOworCisJaWYoYS0+dHlwZSA9PSBWX0FTTjFfVVRDVElNRSB8fCBhLT50eXBlID09IFZfQVNOMV9HRU5FUkFMSVpFRFRJTUUpIHsKKwkgICAgaW50IGxlbjsKKworCSAgICB0bXBzdHIgPSAqKEFTTjFfU1RSSU5HICopYTsKKwkgICAgbGVuID0gdG1wc3RyLmxlbmd0aDsKKwkgICAgZWJjZGljMmFzY2lpKHRtcCwgdG1wc3RyLmRhdGEsIChsZW4gPj0gc2l6ZW9mIHRtcCkgPyBzaXplb2YgdG1wIDogbGVuKTsKKwkgICAgdG1wc3RyLmRhdGEgPSB0bXA7CisJICAgIGEgPSAoQVNOMV9HRU5FUkFMSVpFRFRJTUUgKikgJnRtcHN0cjsKKwl9CisjZW5kaWYKKwlpZihhLT50eXBlID09IFZfQVNOMV9VVENUSU1FIHx8IGEtPnR5cGUgPT0gVl9BU04xX0dFTkVSQUxJWkVEVElNRSkKKwkJCQlyZXR1cm4oaTJkX0FTTjFfYnl0ZXMoKEFTTjFfU1RSSU5HICopYSxwcCwKKwkJCQkgICAgIGEtPnR5cGUgLFZfQVNOMV9VTklWRVJTQUwpKTsKKwlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBYWFgsIEFTTjFfUl9FWFBFQ1RJTkdfQV9USU1FKTsKKwlyZXR1cm4gLTE7CisJfQorI2VuZGlmCisKKworQVNOMV9USU1FICpBU04xX1RJTUVfc2V0KEFTTjFfVElNRSAqcywgdGltZV90IHQpCisJeworCXJldHVybiBBU04xX1RJTUVfYWRqKHMsIHQsIDAsIDApOworCX0KKworQVNOMV9USU1FICpBU04xX1RJTUVfYWRqKEFTTjFfVElNRSAqcywgdGltZV90IHQsCisJCQkJaW50IG9mZnNldF9kYXksIGxvbmcgb2Zmc2V0X3NlYykKKwl7CisJc3RydWN0IHRtICp0czsKKwlzdHJ1Y3QgdG0gZGF0YTsKKworCXRzPU9QRU5TU0xfZ210aW1lKCZ0LCZkYXRhKTsKKwlpZiAodHMgPT0gTlVMTCkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1RJTUVfYWRqLCAgQVNOMV9SX0VSUk9SX0dFVFRJTkdfVElNRSk7CisJCXJldHVybiBOVUxMOworCQl9CisJaWYgKG9mZnNldF9kYXkgfHwgb2Zmc2V0X3NlYykKKwkJeyAKKwkJaWYgKCFPUEVOU1NMX2dtdGltZV9hZGoodHMsIG9mZnNldF9kYXksIG9mZnNldF9zZWMpKQorCQkJcmV0dXJuIE5VTEw7CisJCX0KKwlpZigodHMtPnRtX3llYXIgPj0gNTApICYmICh0cy0+dG1feWVhciA8IDE1MCkpCisJCQlyZXR1cm4gQVNOMV9VVENUSU1FX2FkaihzLCB0LCBvZmZzZXRfZGF5LCBvZmZzZXRfc2VjKTsKKwlyZXR1cm4gQVNOMV9HRU5FUkFMSVpFRFRJTUVfYWRqKHMsIHQsIG9mZnNldF9kYXksIG9mZnNldF9zZWMpOworCX0KKworaW50IEFTTjFfVElNRV9jaGVjayhBU04xX1RJTUUgKnQpCisJeworCWlmICh0LT50eXBlID09IFZfQVNOMV9HRU5FUkFMSVpFRFRJTUUpCisJCXJldHVybiBBU04xX0dFTkVSQUxJWkVEVElNRV9jaGVjayh0KTsKKwllbHNlIGlmICh0LT50eXBlID09IFZfQVNOMV9VVENUSU1FKQorCQlyZXR1cm4gQVNOMV9VVENUSU1FX2NoZWNrKHQpOworCXJldHVybiAwOworCX0KKworLyogQ29udmVydCBhbiBBU04xX1RJTUUgc3RydWN0dXJlIHRvIEdlbmVyYWxpemVkVGltZSAqLworQVNOMV9HRU5FUkFMSVpFRFRJTUUgKkFTTjFfVElNRV90b19nZW5lcmFsaXplZHRpbWUoQVNOMV9USU1FICp0LCBBU04xX0dFTkVSQUxJWkVEVElNRSAqKm91dCkKKwl7CisJQVNOMV9HRU5FUkFMSVpFRFRJTUUgKnJldDsKKwljaGFyICpzdHI7CisJaW50IG5ld2xlbjsKKworCWlmICghQVNOMV9USU1FX2NoZWNrKHQpKSByZXR1cm4gTlVMTDsKKworCWlmICghb3V0IHx8ICEqb3V0KQorCQl7CisJCWlmICghKHJldCA9IEFTTjFfR0VORVJBTElaRURUSU1FX25ldyAoKSkpCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKG91dCkgKm91dCA9IHJldDsKKwkJfQorCWVsc2UgcmV0ID0gKm91dDsKKworCS8qIElmIGFscmVhZHkgR2VuZXJhbGl6ZWRUaW1lIGp1c3QgY29weSBhY3Jvc3MgKi8KKwlpZiAodC0+dHlwZSA9PSBWX0FTTjFfR0VORVJBTElaRURUSU1FKQorCQl7CisJCWlmKCFBU04xX1NUUklOR19zZXQocmV0LCB0LT5kYXRhLCB0LT5sZW5ndGgpKQorCQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiByZXQ7CisJCX0KKworCS8qIGdyb3cgdGhlIHN0cmluZyAqLworCWlmICghQVNOMV9TVFJJTkdfc2V0KHJldCwgTlVMTCwgdC0+bGVuZ3RoICsgMikpCisJCXJldHVybiBOVUxMOworCS8qIEFTTjFfU1RSSU5HX3NldCgpIGFsbG9jYXRlZCAnbGVuICsgMScgYnl0ZXMuICovCisJbmV3bGVuID0gdC0+bGVuZ3RoICsgMiArIDE7CisJc3RyID0gKGNoYXIgKilyZXQtPmRhdGE7CisJLyogV29yayBvdXQgdGhlIGNlbnR1cnkgYW5kIHByZXBlbmQgKi8KKwlpZiAodC0+ZGF0YVswXSA+PSAnNScpIEJVRl9zdHJsY3B5KHN0ciwgIjE5IiwgbmV3bGVuKTsKKwllbHNlIEJVRl9zdHJsY3B5KHN0ciwgIjIwIiwgbmV3bGVuKTsKKworCUJVRl9zdHJsY2F0KHN0ciwgKGNoYXIgKil0LT5kYXRhLCBuZXdsZW4pOworCisJcmV0dXJuIHJldDsKKwl9CisKK2ludCBBU04xX1RJTUVfc2V0X3N0cmluZyhBU04xX1RJTUUgKnMsIGNvbnN0IGNoYXIgKnN0cikKKwl7CisJQVNOMV9USU1FIHQ7CisKKwl0Lmxlbmd0aCA9IHN0cmxlbihzdHIpOworCXQuZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopc3RyOworCXQuZmxhZ3MgPSAwOworCQorCXQudHlwZSA9IFZfQVNOMV9VVENUSU1FOworCisJaWYgKCFBU04xX1RJTUVfY2hlY2soJnQpKQorCQl7CisJCXQudHlwZSA9IFZfQVNOMV9HRU5FUkFMSVpFRFRJTUU7CisJCWlmICghQVNOMV9USU1FX2NoZWNrKCZ0KSkKKwkJCXJldHVybiAwOworCQl9CisJCisJaWYgKHMgJiYgIUFTTjFfU1RSSU5HX2NvcHkoKEFTTjFfU1RSSU5HICopcywgKEFTTjFfU1RSSU5HICopJnQpKQorCQkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgYXNuMV90aW1lX3RvX3RtKHN0cnVjdCB0bSAqdG0sIGNvbnN0IEFTTjFfVElNRSAqdCkKKwl7CisJaWYgKHQgPT0gTlVMTCkKKwkJeworCQl0aW1lX3Qgbm93X3Q7CisJCXRpbWUoJm5vd190KTsKKwkJaWYgKE9QRU5TU0xfZ210aW1lKCZub3dfdCwgdG0pKQorCQkJcmV0dXJuIDE7CisJCXJldHVybiAwOworCQl9CisJCQorCWlmICh0LT50eXBlID09IFZfQVNOMV9VVENUSU1FKQorCQlyZXR1cm4gYXNuMV91dGN0aW1lX3RvX3RtKHRtLCB0KTsKKwllbHNlIGlmICh0LT50eXBlID09IFZfQVNOMV9HRU5FUkFMSVpFRFRJTUUpCisJCXJldHVybiBhc24xX2dlbmVyYWxpemVkdGltZV90b190bSh0bSwgdCk7CisKKwlyZXR1cm4gMDsKKwl9CisKK2ludCBBU04xX1RJTUVfZGlmZihpbnQgKnBkYXksIGludCAqcHNlYywKKwkJCWNvbnN0IEFTTjFfVElNRSAqZnJvbSwgY29uc3QgQVNOMV9USU1FICp0bykKKwl7CisJc3RydWN0IHRtIHRtX2Zyb20sIHRtX3RvOworCWlmICghYXNuMV90aW1lX3RvX3RtKCZ0bV9mcm9tLCBmcm9tKSkKKwkJcmV0dXJuIDA7CisJaWYgKCFhc24xX3RpbWVfdG9fdG0oJnRtX3RvLCB0bykpCisJCXJldHVybiAwOworCXJldHVybiBPUEVOU1NMX2dtdGltZV9kaWZmKHBkYXksIHBzZWMsICZ0bV9mcm9tLCAmdG1fdG8pOworCX0JCmRpZmYgLS1naXQgYS9jcnlwdG8vYXNuMS9hX3R5cGUuYyBiL2NyeXB0by9hc24xL2FfdHlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYmZmZGUKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYXNuMS9hX3R5cGUuYwpAQCAtMCwwICsxLDE1NyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgorCisKK2ludCBBU04xX1RZUEVfZ2V0KEFTTjFfVFlQRSAqYSkKKwl7CisJaWYgKChhLT52YWx1ZS5wdHIgIT0gTlVMTCkgfHwgKGEtPnR5cGUgPT0gVl9BU04xX05VTEwpKQorCQlyZXR1cm4oYS0+dHlwZSk7CisJZWxzZQorCQlyZXR1cm4oMCk7CisJfQorCit2b2lkIEFTTjFfVFlQRV9zZXQoQVNOMV9UWVBFICphLCBpbnQgdHlwZSwgdm9pZCAqdmFsdWUpCisJeworCWlmIChhLT52YWx1ZS5wdHIgIT0gTlVMTCkKKwkJeworCQlBU04xX1RZUEUgKip0bXBfYSA9ICZhOworCQlBU04xX3ByaW1pdGl2ZV9mcmVlKChBU04xX1ZBTFVFICoqKXRtcF9hLCBOVUxMKTsKKwkJfQorCWEtPnR5cGU9dHlwZTsKKwlpZiAodHlwZSA9PSBWX0FTTjFfQk9PTEVBTikKKwkJYS0+dmFsdWUuYm9vbGVhbiA9IHZhbHVlID8gMHhmZiA6IDA7CisJZWxzZQorCQlhLT52YWx1ZS5wdHI9dmFsdWU7CisJfQorCitpbnQgQVNOMV9UWVBFX3NldDEoQVNOMV9UWVBFICphLCBpbnQgdHlwZSwgY29uc3Qgdm9pZCAqdmFsdWUpCisJeworCWlmICghdmFsdWUgfHwgKHR5cGUgPT0gVl9BU04xX0JPT0xFQU4pKQorCQl7CisJCXZvaWQgKnAgPSAodm9pZCAqKXZhbHVlOworCQlBU04xX1RZUEVfc2V0KGEsIHR5cGUsIHApOworCQl9CisJZWxzZSBpZiAodHlwZSA9PSBWX0FTTjFfT0JKRUNUKQorCQl7CisJCUFTTjFfT0JKRUNUICpvZHVwOworCQlvZHVwID0gT0JKX2R1cCh2YWx1ZSk7CisJCWlmICghb2R1cCkKKwkJCXJldHVybiAwOworCQlBU04xX1RZUEVfc2V0KGEsIHR5cGUsIG9kdXApOworCQl9CisJZWxzZQorCQl7CisJCUFTTjFfU1RSSU5HICpzZHVwOworCQlzZHVwID0gQVNOMV9TVFJJTkdfZHVwKHZhbHVlKTsKKwkJaWYgKCFzZHVwKQorCQkJcmV0dXJuIDA7CisJCUFTTjFfVFlQRV9zZXQoYSwgdHlwZSwgc2R1cCk7CisJCX0KKwlyZXR1cm4gMTsKKwl9CisKKy8qIFJldHVybnMgMCBpZiB0aGV5IGFyZSBlcXVhbCwgIT0gMCBvdGhlcndpc2UuICovCitpbnQgQVNOMV9UWVBFX2NtcChBU04xX1RZUEUgKmEsIEFTTjFfVFlQRSAqYikKKwl7CisJaW50IHJlc3VsdCA9IC0xOworCisJaWYgKCFhIHx8ICFiIHx8IGEtPnR5cGUgIT0gYi0+dHlwZSkgcmV0dXJuIC0xOworCisJc3dpdGNoIChhLT50eXBlKQorCQl7CisJY2FzZSBWX0FTTjFfT0JKRUNUOgorCQlyZXN1bHQgPSBPQkpfY21wKGEtPnZhbHVlLm9iamVjdCwgYi0+dmFsdWUub2JqZWN0KTsKKwkJYnJlYWs7CisJY2FzZSBWX0FTTjFfTlVMTDoKKwkJcmVzdWx0ID0gMDsJLyogVGhleSBkbyBub3QgaGF2ZSBjb250ZW50LiAqLworCQlicmVhazsKKwljYXNlIFZfQVNOMV9JTlRFR0VSOgorCWNhc2UgVl9BU04xX05FR19JTlRFR0VSOgorCWNhc2UgVl9BU04xX0VOVU1FUkFURUQ6CisJY2FzZSBWX0FTTjFfTkVHX0VOVU1FUkFURUQ6CisJY2FzZSBWX0FTTjFfQklUX1NUUklORzoKKwljYXNlIFZfQVNOMV9PQ1RFVF9TVFJJTkc6CisJY2FzZSBWX0FTTjFfU0VRVUVOQ0U6CisJY2FzZSBWX0FTTjFfU0VUOgorCWNhc2UgVl9BU04xX05VTUVSSUNTVFJJTkc6CisJY2FzZSBWX0FTTjFfUFJJTlRBQkxFU1RSSU5HOgorCWNhc2UgVl9BU04xX1Q2MVNUUklORzoKKwljYXNlIFZfQVNOMV9WSURFT1RFWFNUUklORzoKKwljYXNlIFZfQVNOMV9JQTVTVFJJTkc6CisJY2FzZSBWX0FTTjFfVVRDVElNRToKKwljYXNlIFZfQVNOMV9HRU5FUkFMSVpFRFRJTUU6CisJY2FzZSBWX0FTTjFfR1JBUEhJQ1NUUklORzoKKwljYXNlIFZfQVNOMV9WSVNJQkxFU1RSSU5HOgorCWNhc2UgVl9BU04xX0dFTkVSQUxTVFJJTkc6CisJY2FzZSBWX0FTTjFfVU5JVkVSU0FMU1RSSU5HOgorCWNhc2UgVl9BU04xX0JNUFNUUklORzoKKwljYXNlIFZfQVNOMV9VVEY4U1RSSU5HOgorCWNhc2UgVl9BU04xX09USEVSOgorCWRlZmF1bHQ6CisJCXJlc3VsdCA9IEFTTjFfU1RSSU5HX2NtcCgoQVNOMV9TVFJJTkcgKikgYS0+dmFsdWUucHRyLAorCQkJCQkgKEFTTjFfU1RSSU5HICopIGItPnZhbHVlLnB0cik7CisJCWJyZWFrOworCQl9CisKKwlyZXR1cm4gcmVzdWx0OworCX0KZGlmZiAtLWdpdCBhL2NyeXB0by9hc24xL2FfdXRjdG0uYyBiL2NyeXB0by9hc24xL2FfdXRjdG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmEwOWJlCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2FzbjEvYV91dGN0bS5jCkBAIC0wLDAgKzEsMzQ4IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC90aW1lX3N1cHBvcnQuaD4KKworCisjaWYgMAoraW50IGkyZF9BU04xX1VUQ1RJTUUoQVNOMV9VVENUSU1FICphLCB1bnNpZ25lZCBjaGFyICoqcHApCisJeworI2lmbmRlZiBDSEFSU0VUX0VCQ0RJQworCXJldHVybihpMmRfQVNOMV9ieXRlcygoQVNOMV9TVFJJTkcgKilhLHBwLAorCQlWX0FTTjFfVVRDVElNRSxWX0FTTjFfVU5JVkVSU0FMKSk7CisjZWxzZQorCS8qIEtMVURHRSEgV2UgY29udmVydCB0byBhc2NpaSBiZWZvcmUgd3JpdGluZyBERVIgKi8KKwlpbnQgbGVuOworCWNoYXIgdG1wWzI0XTsKKwlBU04xX1NUUklORyB4ID0gKihBU04xX1NUUklORyAqKWE7CisKKwlsZW4gPSB4Lmxlbmd0aDsKKwllYmNkaWMyYXNjaWkodG1wLCB4LmRhdGEsIChsZW4gPj0gc2l6ZW9mIHRtcCkgPyBzaXplb2YgdG1wIDogbGVuKTsKKwl4LmRhdGEgPSB0bXA7CisJcmV0dXJuIGkyZF9BU04xX2J5dGVzKCZ4LCBwcCwgVl9BU04xX1VUQ1RJTUUsVl9BU04xX1VOSVZFUlNBTCk7CisjZW5kaWYKKwl9CisKKworQVNOMV9VVENUSU1FICpkMmlfQVNOMV9VVENUSU1FKEFTTjFfVVRDVElNRSAqKmEsIHVuc2lnbmVkIGNoYXIgKipwcCwKKwkgICAgIGxvbmcgbGVuZ3RoKQorCXsKKwlBU04xX1VUQ1RJTUUgKnJldD1OVUxMOworCisJcmV0PShBU04xX1VUQ1RJTUUgKilkMmlfQVNOMV9ieXRlcygoQVNOMV9TVFJJTkcgKiopYSxwcCxsZW5ndGgsCisJCVZfQVNOMV9VVENUSU1FLFZfQVNOMV9VTklWRVJTQUwpOworCWlmIChyZXQgPT0gTlVMTCkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBYWFgsIEVSUl9SX05FU1RFRF9BU04xX0VSUk9SKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisjaWZkZWYgQ0hBUlNFVF9FQkNESUMKKwlhc2NpaTJlYmNkaWMocmV0LT5kYXRhLCByZXQtPmRhdGEsIHJldC0+bGVuZ3RoKTsKKyNlbmRpZgorCWlmICghQVNOMV9VVENUSU1FX2NoZWNrKHJldCkpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgWFhYLCBBU04xX1JfSU5WQUxJRF9USU1FX0ZPUk1BVCk7CisJCWdvdG8gZXJyOworCQl9CisKKwlyZXR1cm4ocmV0KTsKK2VycjoKKwlpZiAoKHJldCAhPSBOVUxMKSAmJiAoKGEgPT0gTlVMTCkgfHwgKCphICE9IHJldCkpKQorCQlNX0FTTjFfVVRDVElNRV9mcmVlKHJldCk7CisJcmV0dXJuKE5VTEwpOworCX0KKworI2VuZGlmCisKK2ludCBhc24xX3V0Y3RpbWVfdG9fdG0oc3RydWN0IHRtICp0bSwgY29uc3QgQVNOMV9VVENUSU1FICpkKQorCXsKKwlzdGF0aWMgY29uc3QgaW50IG1pbls4XT17IDAsIDEsIDEsIDAsIDAsIDAsIDAsIDB9OworCXN0YXRpYyBjb25zdCBpbnQgbWF4WzhdPXs5OSwxMiwzMSwyMyw1OSw1OSwxMiw1OX07CisJY2hhciAqYTsKKwlpbnQgbixpLGwsbzsKKworCWlmIChkLT50eXBlICE9IFZfQVNOMV9VVENUSU1FKSByZXR1cm4oMCk7CisJbD1kLT5sZW5ndGg7CisJYT0oY2hhciAqKWQtPmRhdGE7CisJbz0wOworCisJaWYgKGwgPCAxMSkgZ290byBlcnI7CisJZm9yIChpPTA7IGk8NjsgaSsrKQorCQl7CisJCWlmICgoaSA9PSA1KSAmJiAoKGFbb10gPT0gJ1onKSB8fAorCQkJKGFbb10gPT0gJysnKSB8fCAoYVtvXSA9PSAnLScpKSkKKwkJCXsKKwkJCWkrKzsKKwkJCWlmICh0bSkKKwkJCQl0bS0+dG1fc2VjID0gMDsKKwkJCWJyZWFrOworCQkJfQorCQlpZiAoKGFbb10gPCAnMCcpIHx8IChhW29dID4gJzknKSkgZ290byBlcnI7CisJCW49IGFbb10tJzAnOworCQlpZiAoKytvID4gbCkgZ290byBlcnI7CisKKwkJaWYgKChhW29dIDwgJzAnKSB8fCAoYVtvXSA+ICc5JykpIGdvdG8gZXJyOworCQluPShuKjEwKSsgYVtvXS0nMCc7CisJCWlmICgrK28gPiBsKSBnb3RvIGVycjsKKworCQlpZiAoKG4gPCBtaW5baV0pIHx8IChuID4gbWF4W2ldKSkgZ290byBlcnI7CisJCWlmICh0bSkKKwkJCXsKKwkJCXN3aXRjaChpKQorCQkJCXsKKwkJCWNhc2UgMDoKKwkJCQl0bS0+dG1feWVhciA9IG4gPCA1MCA/IG4gKyAxMDAgOiBuOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCXRtLT50bV9tb24gPSBuIC0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQl0bS0+dG1fbWRheSA9IG47CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CisJCQkJdG0tPnRtX2hvdXIgPSBuOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCXRtLT50bV9taW4gPSBuOworCQkJCWJyZWFrOworCQkJY2FzZSA1OgorCQkJCXRtLT50bV9zZWMgPSBuOworCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCWlmIChhW29dID09ICdaJykKKwkJbysrOworCWVsc2UgaWYgKChhW29dID09ICcrJykgfHwgKGFbb10gPT0gJy0nKSkKKwkJeworCQlpbnQgb2Zmc2lnbiA9IGFbb10gPT0gJy0nID8gLTEgOiAxLCBvZmZzZXQgPSAwOworCQlvKys7CisJCWlmIChvKzQgPiBsKSBnb3RvIGVycjsKKwkJZm9yIChpPTY7IGk8ODsgaSsrKQorCQkJeworCQkJaWYgKChhW29dIDwgJzAnKSB8fCAoYVtvXSA+ICc5JykpIGdvdG8gZXJyOworCQkJbj0gYVtvXS0nMCc7CisJCQlvKys7CisJCQlpZiAoKGFbb10gPCAnMCcpIHx8IChhW29dID4gJzknKSkgZ290byBlcnI7CisJCQluPShuKjEwKSsgYVtvXS0nMCc7CisJCQlpZiAoKG4gPCBtaW5baV0pIHx8IChuID4gbWF4W2ldKSkgZ290byBlcnI7CisJCQlpZiAodG0pCisJCQkJeworCQkJCWlmIChpID09IDYpCisJCQkJCW9mZnNldCA9IG4gKiAzNjAwOworCQkJCWVsc2UgaWYgKGkgPT0gNykKKwkJCQkJb2Zmc2V0ICs9IG4gKiA2MDsKKwkJCQl9CisJCQlvKys7CisJCQl9CisJCWlmIChvZmZzZXQgJiYgIU9QRU5TU0xfZ210aW1lX2Fkaih0bSwgMCwgb2Zmc2V0ICogb2Zmc2lnbikpCisJCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiBvID09IGw7CitlcnI6CisJcmV0dXJuIDA7CisJfQorCitpbnQgQVNOMV9VVENUSU1FX2NoZWNrKGNvbnN0IEFTTjFfVVRDVElNRSAqZCkKKwl7CisJcmV0dXJuIGFzbjFfdXRjdGltZV90b190bShOVUxMLCBkKTsKKwl9CisKK2ludCBBU04xX1VUQ1RJTUVfc2V0X3N0cmluZyhBU04xX1VUQ1RJTUUgKnMsIGNvbnN0IGNoYXIgKnN0cikKKwl7CisJQVNOMV9VVENUSU1FIHQ7CisKKwl0LnR5cGU9Vl9BU04xX1VUQ1RJTUU7CisJdC5sZW5ndGg9c3RybGVuKHN0cik7CisJdC5kYXRhPSh1bnNpZ25lZCBjaGFyICopc3RyOworCWlmIChBU04xX1VUQ1RJTUVfY2hlY2soJnQpKQorCQl7CisJCWlmIChzICE9IE5VTEwpCisJCQl7CisJCQlpZiAoIUFTTjFfU1RSSU5HX3NldCgoQVNOMV9TVFJJTkcgKilzLAorCQkJCSh1bnNpZ25lZCBjaGFyICopc3RyLHQubGVuZ3RoKSkKKwkJCQlyZXR1cm4gMDsKKwkJCXMtPnR5cGUgPSBWX0FTTjFfVVRDVElNRTsKKwkJCX0KKwkJcmV0dXJuKDEpOworCQl9CisJZWxzZQorCQlyZXR1cm4oMCk7CisJfQorCitBU04xX1VUQ1RJTUUgKkFTTjFfVVRDVElNRV9zZXQoQVNOMV9VVENUSU1FICpzLCB0aW1lX3QgdCkKKwl7CisJcmV0dXJuIEFTTjFfVVRDVElNRV9hZGoocywgdCwgMCwgMCk7CisJfQorCitBU04xX1VUQ1RJTUUgKkFTTjFfVVRDVElNRV9hZGooQVNOMV9VVENUSU1FICpzLCB0aW1lX3QgdCwKKwkJCQlpbnQgb2Zmc2V0X2RheSwgbG9uZyBvZmZzZXRfc2VjKQorCXsKKwljaGFyICpwOworCXN0cnVjdCB0bSAqdHM7CisJc3RydWN0IHRtIGRhdGE7CisJc2l6ZV90IGxlbiA9IDIwOworCisJaWYgKHMgPT0gTlVMTCkKKwkJcz1NX0FTTjFfVVRDVElNRV9uZXcoKTsKKwlpZiAocyA9PSBOVUxMKQorCQlyZXR1cm4oTlVMTCk7CisKKwl0cz1PUEVOU1NMX2dtdGltZSgmdCwgJmRhdGEpOworCWlmICh0cyA9PSBOVUxMKQorCQlyZXR1cm4oTlVMTCk7CisKKwlpZiAob2Zmc2V0X2RheSB8fCBvZmZzZXRfc2VjKQorCQl7IAorCQlpZiAoIU9QRU5TU0xfZ210aW1lX2Fkaih0cywgb2Zmc2V0X2RheSwgb2Zmc2V0X3NlYykpCisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJaWYoKHRzLT50bV95ZWFyIDwgNTApIHx8ICh0cy0+dG1feWVhciA+PSAxNTApKQorCQlyZXR1cm4gTlVMTDsKKworCXA9KGNoYXIgKilzLT5kYXRhOworCWlmICgocCA9PSBOVUxMKSB8fCAoKHNpemVfdClzLT5sZW5ndGggPCBsZW4pKQorCQl7CisJCXA9T1BFTlNTTF9tYWxsb2MobGVuKTsKKwkJaWYgKHAgPT0gTlVMTCkKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfVVRDVElNRV9hZGosIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldHVybihOVUxMKTsKKwkJCX0KKwkJaWYgKHMtPmRhdGEgIT0gTlVMTCkKKwkJCU9QRU5TU0xfZnJlZShzLT5kYXRhKTsKKwkJcy0+ZGF0YT0odW5zaWduZWQgY2hhciAqKXA7CisJCX0KKworCUJJT19zbnByaW50ZihwLGxlbiwiJTAyZCUwMmQlMDJkJTAyZCUwMmQlMDJkWiIsdHMtPnRtX3llYXIlMTAwLAorCQkgICAgIHRzLT50bV9tb24rMSx0cy0+dG1fbWRheSx0cy0+dG1faG91cix0cy0+dG1fbWluLHRzLT50bV9zZWMpOworCXMtPmxlbmd0aD1zdHJsZW4ocCk7CisJcy0+dHlwZT1WX0FTTjFfVVRDVElNRTsKKyNpZmRlZiBDSEFSU0VUX0VCQ0RJQ19ub3QKKwllYmNkaWMyYXNjaWkocy0+ZGF0YSwgcy0+ZGF0YSwgcy0+bGVuZ3RoKTsKKyNlbmRpZgorCXJldHVybihzKTsKKwl9CisKKworaW50IEFTTjFfVVRDVElNRV9jbXBfdGltZV90KGNvbnN0IEFTTjFfVVRDVElNRSAqcywgdGltZV90IHQpCisJeworCXN0cnVjdCB0bSBzdG0sIHR0bTsKKwlpbnQgZGF5LCBzZWM7CisKKwlpZiAoIWFzbjFfdXRjdGltZV90b190bSgmc3RtLCBzKSkKKwkJcmV0dXJuIC0yOworCisJaWYgKCFPUEVOU1NMX2dtdGltZSgmdCwgJnR0bSkpCisJCXJldHVybiAtMjsKKworCWlmICghT1BFTlNTTF9nbXRpbWVfZGlmZigmZGF5LCAmc2VjLCAmc3RtLCAmdHRtKSkKKwkJcmV0dXJuIC0yOworCisJaWYgKGRheSA+IDApCisJCXJldHVybiAxOworCWlmIChkYXkgPCAwKQorCQlyZXR1cm4gLTE7CisJaWYgKHNlYyA+IDApCisJCXJldHVybiAxOworCWlmIChzZWMgPCAwKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7CisJfQorCisKKyNpZiAwCit0aW1lX3QgQVNOMV9VVENUSU1FX2dldChjb25zdCBBU04xX1VUQ1RJTUUgKnMpCisJeworCXN0cnVjdCB0bSB0bTsKKwlpbnQgb2Zmc2V0OworCisJbWVtc2V0KCZ0bSwnXDAnLHNpemVvZiB0bSk7CisKKyNkZWZpbmUgZzIocCkgKCgocClbMF0tJzAnKSoxMCsocClbMV0tJzAnKQorCXRtLnRtX3llYXI9ZzIocy0+ZGF0YSk7CisJaWYodG0udG1feWVhciA8IDUwKQorCQl0bS50bV95ZWFyKz0xMDA7CisJdG0udG1fbW9uPWcyKHMtPmRhdGErMiktMTsKKwl0bS50bV9tZGF5PWcyKHMtPmRhdGErNCk7CisJdG0udG1faG91cj1nMihzLT5kYXRhKzYpOworCXRtLnRtX21pbj1nMihzLT5kYXRhKzgpOworCXRtLnRtX3NlYz1nMihzLT5kYXRhKzEwKTsKKwlpZihzLT5kYXRhWzEyXSA9PSAnWicpCisJCW9mZnNldD0wOworCWVsc2UKKwkJeworCQlvZmZzZXQ9ZzIocy0+ZGF0YSsxMykqNjArZzIocy0+ZGF0YSsxNSk7CisJCWlmKHMtPmRhdGFbMTJdID09ICctJykKKwkJCW9mZnNldD0gLW9mZnNldDsKKwkJfQorI3VuZGVmIGcyCisKKwlyZXR1cm4gbWt0aW1lKCZ0bSktb2Zmc2V0KjYwOyAvKiBGSVhNRTogbWt0aW1lIGFzc3VtZXMgdGhlIGN1cnJlbnQgdGltZXpvbmUKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbnN0ZWFkIG9mIFVUQywgYW5kIHVubGVzcyB3ZSByZXdyaXRlIE9wZW5TU0wKKwkJCQkgICAgICAgKiBpbiBMaXNwIHdlIGNhbm5vdCBsb2NhbGx5IGNoYW5nZSB0aGUgdGltZXpvbmUKKwkJCQkgICAgICAgKiB3aXRob3V0IHBvc3NpYmx5IGludGVyZmVyaW5nIHdpdGggb3RoZXIgcGFydHMKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiB0aGUgcHJvZ3JhbS4gdGltZWdtLCB3aGljaCB1c2VzIFVUQywgaXMKKwkJCQkgICAgICAgKiBub24tc3RhbmRhcmQuCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQWxzbyB0aW1lX3QgaXMgaW5hcHByb3ByaWF0ZSBmb3IgZ2VuZXJhbAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFVUQyB0aW1lcyBiZWNhdXNlIGl0IG1heSBhIDMyIGJpdCB0eXBlLiAqLworCX0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FzbjEvYV91dGY4LmMgYi9jcnlwdG8vYXNuMS9hX3V0ZjguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDZlOThkCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2FzbjEvYV91dGY4LmMKQEAgLTAsMCArMSwyMTAgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKworCisvKiBVVEY4IHV0aWxpdGllcyAqLworCisvKiBUaGlzIHBhcnNlcyBhIFVURjggc3RyaW5nIG9uZSBjaGFyYWN0ZXIgYXQgYSB0aW1lLiBJdCBpcyBwYXNzZWQgYSBwb2ludGVyCisgKiB0byB0aGUgc3RyaW5nIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuIEl0IHNldHMgJ3ZhbHVlJyB0byB0aGUgdmFsdWUgb2YKKyAqIHRoZSBjdXJyZW50IGNoYXJhY3Rlci4gSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCBvciBhCisgKiBuZWdhdGl2ZSBlcnJvciBjb2RlOgorICogLTEgPSBzdHJpbmcgdG9vIHNob3J0CisgKiAtMiA9IGlsbGVnYWwgY2hhcmFjdGVyCisgKiAtMyA9IHN1YnNlcXVlbnQgY2hhcmFjdGVycyBub3Qgb2YgdGhlIGZvcm0gMTB4eHh4eHgKKyAqIC00ID0gY2hhcmFjdGVyIGVuY29kZWQgaW5jb3JyZWN0bHkgKG5vdCBtaW5pbWFsIGxlbmd0aCkuCisgKi8KKworaW50IFVURjhfZ2V0Yyhjb25zdCB1bnNpZ25lZCBjaGFyICpzdHIsIGludCBsZW4sIHVuc2lnbmVkIGxvbmcgKnZhbCkKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJaW50IHJldDsKKwlpZihsZW4gPD0gMCkgcmV0dXJuIDA7CisJcCA9IHN0cjsKKworCS8qIENoZWNrIHN5bnRheCBhbmQgd29yayBvdXQgdGhlIGVuY29kZWQgdmFsdWUgKGlmIGNvcnJlY3QpICovCisJaWYoKCpwICYgMHg4MCkgPT0gMCkgeworCQl2YWx1ZSA9ICpwKysgJiAweDdmOworCQlyZXQgPSAxOworCX0gZWxzZSBpZigoKnAgJiAweGUwKSA9PSAweGMwKSB7CisJCWlmKGxlbiA8IDIpIHJldHVybiAtMTsKKwkJaWYoKHBbMV0gJiAweGMwKSAhPSAweDgwKSByZXR1cm4gLTM7CisJCXZhbHVlID0gKCpwKysgJiAweDFmKSA8PCA2OworCQl2YWx1ZSB8PSAqcCsrICYgMHgzZjsKKwkJaWYodmFsdWUgPCAweDgwKSByZXR1cm4gLTQ7CisJCXJldCA9IDI7CisJfSBlbHNlIGlmKCgqcCAmIDB4ZjApID09IDB4ZTApIHsKKwkJaWYobGVuIDwgMykgcmV0dXJuIC0xOworCQlpZiggKChwWzFdICYgMHhjMCkgIT0gMHg4MCkKKwkJICAgfHwgKChwWzJdICYgMHhjMCkgIT0gMHg4MCkgKSByZXR1cm4gLTM7CisJCXZhbHVlID0gKCpwKysgJiAweGYpIDw8IDEyOworCQl2YWx1ZSB8PSAoKnArKyAmIDB4M2YpIDw8IDY7CisJCXZhbHVlIHw9ICpwKysgJiAweDNmOworCQlpZih2YWx1ZSA8IDB4ODAwKSByZXR1cm4gLTQ7CisJCXJldCA9IDM7CisJfSBlbHNlIGlmKCgqcCAmIDB4ZjgpID09IDB4ZjApIHsKKwkJaWYobGVuIDwgNCkgcmV0dXJuIC0xOworCQlpZiggKChwWzFdICYgMHhjMCkgIT0gMHg4MCkKKwkJICAgfHwgKChwWzJdICYgMHhjMCkgIT0gMHg4MCkgCisJCSAgIHx8ICgocFszXSAmIDB4YzApICE9IDB4ODApICkgcmV0dXJuIC0zOworCQl2YWx1ZSA9ICgodW5zaWduZWQgbG9uZykoKnArKyAmIDB4NykpIDw8IDE4OworCQl2YWx1ZSB8PSAoKnArKyAmIDB4M2YpIDw8IDEyOworCQl2YWx1ZSB8PSAoKnArKyAmIDB4M2YpIDw8IDY7CisJCXZhbHVlIHw9ICpwKysgJiAweDNmOworCQlpZih2YWx1ZSA8IDB4MTAwMDApIHJldHVybiAtNDsKKwkJcmV0ID0gNDsKKwl9IGVsc2UgaWYoKCpwICYgMHhmYykgPT0gMHhmOCkgeworCQlpZihsZW4gPCA1KSByZXR1cm4gLTE7CisJCWlmKCAoKHBbMV0gJiAweGMwKSAhPSAweDgwKQorCQkgICB8fCAoKHBbMl0gJiAweGMwKSAhPSAweDgwKSAKKwkJICAgfHwgKChwWzNdICYgMHhjMCkgIT0gMHg4MCkgCisJCSAgIHx8ICgocFs0XSAmIDB4YzApICE9IDB4ODApICkgcmV0dXJuIC0zOworCQl2YWx1ZSA9ICgodW5zaWduZWQgbG9uZykoKnArKyAmIDB4MykpIDw8IDI0OworCQl2YWx1ZSB8PSAoKHVuc2lnbmVkIGxvbmcpKCpwKysgJiAweDNmKSkgPDwgMTg7CisJCXZhbHVlIHw9ICgodW5zaWduZWQgbG9uZykoKnArKyAmIDB4M2YpKSA8PCAxMjsKKwkJdmFsdWUgfD0gKCpwKysgJiAweDNmKSA8PCA2OworCQl2YWx1ZSB8PSAqcCsrICYgMHgzZjsKKwkJaWYodmFsdWUgPCAweDIwMDAwMCkgcmV0dXJuIC00OworCQlyZXQgPSA1OworCX0gZWxzZSBpZigoKnAgJiAweGZlKSA9PSAweGZjKSB7CisJCWlmKGxlbiA8IDYpIHJldHVybiAtMTsKKwkJaWYoICgocFsxXSAmIDB4YzApICE9IDB4ODApCisJCSAgIHx8ICgocFsyXSAmIDB4YzApICE9IDB4ODApIAorCQkgICB8fCAoKHBbM10gJiAweGMwKSAhPSAweDgwKSAKKwkJICAgfHwgKChwWzRdICYgMHhjMCkgIT0gMHg4MCkgCisJCSAgIHx8ICgocFs1XSAmIDB4YzApICE9IDB4ODApICkgcmV0dXJuIC0zOworCQl2YWx1ZSA9ICgodW5zaWduZWQgbG9uZykoKnArKyAmIDB4MSkpIDw8IDMwOworCQl2YWx1ZSB8PSAoKHVuc2lnbmVkIGxvbmcpKCpwKysgJiAweDNmKSkgPDwgMjQ7CisJCXZhbHVlIHw9ICgodW5zaWduZWQgbG9uZykoKnArKyAmIDB4M2YpKSA8PCAxODsKKwkJdmFsdWUgfD0gKCh1bnNpZ25lZCBsb25nKSgqcCsrICYgMHgzZikpIDw8IDEyOworCQl2YWx1ZSB8PSAoKnArKyAmIDB4M2YpIDw8IDY7CisJCXZhbHVlIHw9ICpwKysgJiAweDNmOworCQlpZih2YWx1ZSA8IDB4NDAwMDAwMCkgcmV0dXJuIC00OworCQlyZXQgPSA2OworCX0gZWxzZSByZXR1cm4gLTI7CisJKnZhbCA9IHZhbHVlOworCXJldHVybiByZXQ7Cit9CisKKy8qIFRoaXMgdGFrZXMgYSBjaGFyYWN0ZXIgJ3ZhbHVlJyBhbmQgd3JpdGVzIHRoZSBVVEY4IGVuY29kZWQgdmFsdWUgaW4KKyAqICdzdHInIHdoZXJlICdzdHInIGlzIGEgYnVmZmVyIGNvbnRhaW5pbmcgJ2xlbicgY2hhcmFjdGVycy4gUmV0dXJucworICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4gb3IgLTEgaWYgJ2xlbicgaXMgdG9vIHNtYWxsLiAnc3RyJyBjYW4KKyAqIGJlIHNldCB0byBOVUxMIGluIHdoaWNoIGNhc2UgaXQganVzdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycy4KKyAqIEl0IHdpbGwgbmVlZCBhdCBtb3N0IDYgY2hhcmFjdGVycy4KKyAqLworCitpbnQgVVRGOF9wdXRjKHVuc2lnbmVkIGNoYXIgKnN0ciwgaW50IGxlbiwgdW5zaWduZWQgbG9uZyB2YWx1ZSkKK3sKKwlpZighc3RyKSBsZW4gPSA2OwkvKiBNYXhpbXVtIHdlIHdpbGwgbmVlZCAqLworCWVsc2UgaWYobGVuIDw9IDApIHJldHVybiAtMTsKKwlpZih2YWx1ZSA8IDB4ODApIHsKKwkJaWYoc3RyKSAqc3RyID0gKHVuc2lnbmVkIGNoYXIpdmFsdWU7CisJCXJldHVybiAxOworCX0KKwlpZih2YWx1ZSA8IDB4ODAwKSB7CisJCWlmKGxlbiA8IDIpIHJldHVybiAtMTsKKwkJaWYoc3RyKSB7CisJCQkqc3RyKysgPSAodW5zaWduZWQgY2hhcikoKCh2YWx1ZSA+PiA2KSAmIDB4MWYpIHwgMHhjMCk7CisJCQkqc3RyID0gKHVuc2lnbmVkIGNoYXIpKCh2YWx1ZSAmIDB4M2YpIHwgMHg4MCk7CisJCX0KKwkJcmV0dXJuIDI7CisJfQorCWlmKHZhbHVlIDwgMHgxMDAwMCkgeworCQlpZihsZW4gPCAzKSByZXR1cm4gLTE7CisJCWlmKHN0cikgeworCQkJKnN0cisrID0gKHVuc2lnbmVkIGNoYXIpKCgodmFsdWUgPj4gMTIpICYgMHhmKSB8IDB4ZTApOworCQkJKnN0cisrID0gKHVuc2lnbmVkIGNoYXIpKCgodmFsdWUgPj4gNikgJiAweDNmKSB8IDB4ODApOworCQkJKnN0ciA9ICh1bnNpZ25lZCBjaGFyKSgodmFsdWUgJiAweDNmKSB8IDB4ODApOworCQl9CisJCXJldHVybiAzOworCX0KKwlpZih2YWx1ZSA8IDB4MjAwMDAwKSB7CisJCWlmKGxlbiA8IDQpIHJldHVybiAtMTsKKwkJaWYoc3RyKSB7CisJCQkqc3RyKysgPSAodW5zaWduZWQgY2hhcikoKCh2YWx1ZSA+PiAxOCkgJiAweDcpIHwgMHhmMCk7CisJCQkqc3RyKysgPSAodW5zaWduZWQgY2hhcikoKCh2YWx1ZSA+PiAxMikgJiAweDNmKSB8IDB4ODApOworCQkJKnN0cisrID0gKHVuc2lnbmVkIGNoYXIpKCgodmFsdWUgPj4gNikgJiAweDNmKSB8IDB4ODApOworCQkJKnN0ciA9ICh1bnNpZ25lZCBjaGFyKSgodmFsdWUgJiAweDNmKSB8IDB4ODApOworCQl9CisJCXJldHVybiA0OworCX0KKwlpZih2YWx1ZSA8IDB4NDAwMDAwMCkgeworCQlpZihsZW4gPCA1KSByZXR1cm4gLTE7CisJCWlmKHN0cikgeworCQkJKnN0cisrID0gKHVuc2lnbmVkIGNoYXIpKCgodmFsdWUgPj4gMjQpICYgMHgzKSB8IDB4ZjgpOworCQkJKnN0cisrID0gKHVuc2lnbmVkIGNoYXIpKCgodmFsdWUgPj4gMTgpICYgMHgzZikgfCAweDgwKTsKKwkJCSpzdHIrKyA9ICh1bnNpZ25lZCBjaGFyKSgoKHZhbHVlID4+IDEyKSAmIDB4M2YpIHwgMHg4MCk7CisJCQkqc3RyKysgPSAodW5zaWduZWQgY2hhcikoKCh2YWx1ZSA+PiA2KSAmIDB4M2YpIHwgMHg4MCk7CisJCQkqc3RyID0gKHVuc2lnbmVkIGNoYXIpKCh2YWx1ZSAmIDB4M2YpIHwgMHg4MCk7CisJCX0KKwkJcmV0dXJuIDU7CisJfQorCWlmKGxlbiA8IDYpIHJldHVybiAtMTsKKwlpZihzdHIpIHsKKwkJKnN0cisrID0gKHVuc2lnbmVkIGNoYXIpKCgodmFsdWUgPj4gMzApICYgMHgxKSB8IDB4ZmMpOworCQkqc3RyKysgPSAodW5zaWduZWQgY2hhcikoKCh2YWx1ZSA+PiAyNCkgJiAweDNmKSB8IDB4ODApOworCQkqc3RyKysgPSAodW5zaWduZWQgY2hhcikoKCh2YWx1ZSA+PiAxOCkgJiAweDNmKSB8IDB4ODApOworCQkqc3RyKysgPSAodW5zaWduZWQgY2hhcikoKCh2YWx1ZSA+PiAxMikgJiAweDNmKSB8IDB4ODApOworCQkqc3RyKysgPSAodW5zaWduZWQgY2hhcikoKCh2YWx1ZSA+PiA2KSAmIDB4M2YpIHwgMHg4MCk7CisJCSpzdHIgPSAodW5zaWduZWQgY2hhcikoKHZhbHVlICYgMHgzZikgfCAweDgwKTsKKwl9CisJcmV0dXJuIDY7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vYXNuMS9hc24xLmggYi9jcnlwdG8vYXNuMS9hc24xLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk2MzViYgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9hc24xL2FzbjEuaApAQCAtMCwwICsxLDEzMzMgQEAKKy8qIGNyeXB0by9hc24xL2FzbjEuaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaWZuZGVmIEhFQURFUl9BU04xX0gKKyNkZWZpbmUgSEVBREVSX0FTTjFfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9iYXNlLmg+CisKKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpZm5kZWYgT1BFTlNTTF9OT19CSU8KKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2VuZGlmCisjaW5jbHVkZSA8b3BlbnNzbC9zdGFjay5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIFZfQVNOMV9VTklWRVJTQUwJCTB4MDAKKyNkZWZpbmUJVl9BU04xX0FQUExJQ0FUSU9OCQkweDQwCisjZGVmaW5lIFZfQVNOMV9DT05URVhUX1NQRUNJRklDCQkweDgwCisjZGVmaW5lIFZfQVNOMV9QUklWQVRFCQkJMHhjMAorCisjZGVmaW5lIFZfQVNOMV9DT05TVFJVQ1RFRAkJMHgyMAorI2RlZmluZSBWX0FTTjFfUFJJTUlUSVZFX1RBRwkJMHgxZgorI2RlZmluZSBWX0FTTjFfUFJJTUFUSVZFX1RBRwkJMHgxZgorCisjZGVmaW5lIFZfQVNOMV9BUFBfQ0hPT1NFCQktMgkvKiBsZXQgdGhlIHJlY2lwaWVudCBjaG9vc2UgKi8KKyNkZWZpbmUgVl9BU04xX09USEVSCQkJLTMJLyogdXNlZCBpbiBBU04xX1RZUEUgKi8KKyNkZWZpbmUgVl9BU04xX0FOWQkJCS00CS8qIHVzZWQgaW4gQVNOMSB0ZW1wbGF0ZSBjb2RlICovCisKKyNkZWZpbmUgVl9BU04xX05FRwkJCTB4MTAwCS8qIG5lZ2F0aXZlIGZsYWcgKi8KKworI2RlZmluZSBWX0FTTjFfVU5ERUYJCQktMQorI2RlZmluZSBWX0FTTjFfRU9DCQkJMAorI2RlZmluZSBWX0FTTjFfQk9PTEVBTgkJCTEJLyoqLworI2RlZmluZSBWX0FTTjFfSU5URUdFUgkJCTIKKyNkZWZpbmUgVl9BU04xX05FR19JTlRFR0VSCQkoMiB8IFZfQVNOMV9ORUcpCisjZGVmaW5lIFZfQVNOMV9CSVRfU1RSSU5HCQkzCisjZGVmaW5lIFZfQVNOMV9PQ1RFVF9TVFJJTkcJCTQKKyNkZWZpbmUgVl9BU04xX05VTEwJCQk1CisjZGVmaW5lIFZfQVNOMV9PQkpFQ1QJCQk2CisjZGVmaW5lIFZfQVNOMV9PQkpFQ1RfREVTQ1JJUFRPUgk3CisjZGVmaW5lIFZfQVNOMV9FWFRFUk5BTAkJCTgKKyNkZWZpbmUgVl9BU04xX1JFQUwJCQk5CisjZGVmaW5lIFZfQVNOMV9FTlVNRVJBVEVECQkxMAorI2RlZmluZSBWX0FTTjFfTkVHX0VOVU1FUkFURUQJCSgxMCB8IFZfQVNOMV9ORUcpCisjZGVmaW5lIFZfQVNOMV9VVEY4U1RSSU5HCQkxMgorI2RlZmluZSBWX0FTTjFfU0VRVUVOQ0UJCQkxNgorI2RlZmluZSBWX0FTTjFfU0VUCQkJMTcKKyNkZWZpbmUgVl9BU04xX05VTUVSSUNTVFJJTkcJCTE4CS8qKi8KKyNkZWZpbmUgVl9BU04xX1BSSU5UQUJMRVNUUklORwkJMTkKKyNkZWZpbmUgVl9BU04xX1Q2MVNUUklORwkJMjAKKyNkZWZpbmUgVl9BU04xX1RFTEVURVhTVFJJTkcJCTIwCS8qIGFsaWFzICovCisjZGVmaW5lIFZfQVNOMV9WSURFT1RFWFNUUklORwkJMjEJLyoqLworI2RlZmluZSBWX0FTTjFfSUE1U1RSSU5HCQkyMgorI2RlZmluZSBWX0FTTjFfVVRDVElNRQkJCTIzCisjZGVmaW5lIFZfQVNOMV9HRU5FUkFMSVpFRFRJTUUJCTI0CS8qKi8KKyNkZWZpbmUgVl9BU04xX0dSQVBISUNTVFJJTkcJCTI1CS8qKi8KKyNkZWZpbmUgVl9BU04xX0lTTzY0U1RSSU5HCQkyNgkvKiovCisjZGVmaW5lIFZfQVNOMV9WSVNJQkxFU1RSSU5HCQkyNgkvKiBhbGlhcyAqLworI2RlZmluZSBWX0FTTjFfR0VORVJBTFNUUklORwkJMjcJLyoqLworI2RlZmluZSBWX0FTTjFfVU5JVkVSU0FMU1RSSU5HCQkyOAkvKiovCisjZGVmaW5lIFZfQVNOMV9CTVBTVFJJTkcJCTMwCisKKy8qIEZvciB1c2Ugd2l0aCBkMmlfQVNOMV90eXBlX2J5dGVzKCkgKi8KKyNkZWZpbmUgQl9BU04xX05VTUVSSUNTVFJJTkcJMHgwMDAxCisjZGVmaW5lIEJfQVNOMV9QUklOVEFCTEVTVFJJTkcJMHgwMDAyCisjZGVmaW5lIEJfQVNOMV9UNjFTVFJJTkcJMHgwMDA0CisjZGVmaW5lIEJfQVNOMV9URUxFVEVYU1RSSU5HCTB4MDAwNAorI2RlZmluZSBCX0FTTjFfVklERU9URVhTVFJJTkcJMHgwMDA4CisjZGVmaW5lIEJfQVNOMV9JQTVTVFJJTkcJMHgwMDEwCisjZGVmaW5lIEJfQVNOMV9HUkFQSElDU1RSSU5HCTB4MDAyMAorI2RlZmluZSBCX0FTTjFfSVNPNjRTVFJJTkcJMHgwMDQwCisjZGVmaW5lIEJfQVNOMV9WSVNJQkxFU1RSSU5HCTB4MDA0MAorI2RlZmluZSBCX0FTTjFfR0VORVJBTFNUUklORwkweDAwODAKKyNkZWZpbmUgQl9BU04xX1VOSVZFUlNBTFNUUklORwkweDAxMDAKKyNkZWZpbmUgQl9BU04xX09DVEVUX1NUUklORwkweDAyMDAKKyNkZWZpbmUgQl9BU04xX0JJVF9TVFJJTkcJMHgwNDAwCisjZGVmaW5lIEJfQVNOMV9CTVBTVFJJTkcJMHgwODAwCisjZGVmaW5lIEJfQVNOMV9VTktOT1dOCQkweDEwMDAKKyNkZWZpbmUgQl9BU04xX1VURjhTVFJJTkcJMHgyMDAwCisjZGVmaW5lIEJfQVNOMV9VVENUSU1FCQkweDQwMDAKKyNkZWZpbmUgQl9BU04xX0dFTkVSQUxJWkVEVElNRQkweDgwMDAKKyNkZWZpbmUgQl9BU04xX1NFUVVFTkNFCQkweDEwMDAwCisKKy8qIEZvciB1c2Ugd2l0aCBBU04xX21ic3RyaW5nX2NvcHkoKSAqLworI2RlZmluZSBNQlNUUklOR19GTEFHCQkweDEwMDAKKyNkZWZpbmUgTUJTVFJJTkdfVVRGOAkJKE1CU1RSSU5HX0ZMQUcpCisjZGVmaW5lIE1CU1RSSU5HX0FTQwkJKE1CU1RSSU5HX0ZMQUd8MSkKKyNkZWZpbmUgTUJTVFJJTkdfQk1QCQkoTUJTVFJJTkdfRkxBR3wyKQorI2RlZmluZSBNQlNUUklOR19VTklWCQkoTUJTVFJJTkdfRkxBR3w0KQorCisjZGVmaW5lIFNNSU1FX09MRE1JTUUJCTB4NDAwCisjZGVmaW5lIFNNSU1FX0NSTEZFT0wJCTB4ODAwCisjZGVmaW5lIFNNSU1FX1NUUkVBTQkJMHgxMDAwCisKKyNkZWZpbmUgREVDTEFSRV9BU04xX1NFVF9PRih0eXBlKSAvKiBmaWxsZWQgaW4gYnkgbWtzdGFjay5wbCAqLworI2RlZmluZSBJTVBMRU1FTlRfQVNOMV9TRVRfT0YodHlwZSkgLyogbm90aGluZywgbm8gbG9uZ2VyIG5lZWRlZCAqLworCisvKiBXZSBNVVNUIG1ha2Ugc3VyZSB0aGF0LCBleGNlcHQgZm9yIGNvbnN0bmVzcywgYXNuMV9jdHhfc3QgYW5kCisgICBhc24xX2NvbnN0X2N0eCBhcmUgZXhhY3RseSB0aGUgc2FtZS4gIEZvcnR1bmF0ZWx5LCBhcyBzb29uIGFzCisgICB0aGUgb2xkIEFTTjEgcGFyc2luZyBtYWNyb3MgYXJlIGdvbmUsIHdlIGNhbiB0aHJvdyB0aGlzIGF3YXkKKyAgIGFzIHdlbGwuLi4gKi8KK3R5cGVkZWYgc3RydWN0IGFzbjFfY3R4X3N0CisJeworCXVuc2lnbmVkIGNoYXIgKnA7Lyogd29yayBjaGFyIHBvaW50ZXIgKi8KKwlpbnQgZW9zOwkvKiBlbmQgb2Ygc2VxdWVuY2UgcmVhZCBmb3IgaW5kZWZpbml0ZSBlbmNvZGluZyAqLworCWludCBlcnJvcjsJLyogZXJyb3IgY29kZSB0byB1c2Ugd2hlbiByZXR1cm5pbmcgYW4gZXJyb3IgKi8KKwlpbnQgaW5mOwkvKiBjb25zdHJ1Y3RlZCBpZiAweDIwLCBpbmRlZmluaXRlIGlzIDB4MjEgKi8KKwlpbnQgdGFnOwkvKiB0YWcgZnJvbSBsYXN0ICdnZXQgb2JqZWN0JyAqLworCWludCB4Y2xhc3M7CS8qIGNsYXNzIGZyb20gbGFzdCAnZ2V0IG9iamVjdCcgKi8KKwlsb25nIHNsZW47CS8qIGxlbmd0aCBvZiBsYXN0ICdnZXQgb2JqZWN0JyAqLworCXVuc2lnbmVkIGNoYXIgKm1heDsgLyogbGFyZ2VzdCB2YWx1ZSBvZiBwIGFsbG93ZWQgKi8KKwl1bnNpZ25lZCBjaGFyICpxOy8qIHRlbXBvcmFyeSB2YXJpYWJsZSAqLworCXVuc2lnbmVkIGNoYXIgKipwcDsvKiB2YXJpYWJsZSAqLworCWludCBsaW5lOwkvKiB1c2VkIGluIGVycm9yIHByb2Nlc3NpbmcgKi8KKwl9IEFTTjFfQ1RYOworCit0eXBlZGVmIHN0cnVjdCBhc24xX2NvbnN0X2N0eF9zdAorCXsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwOy8qIHdvcmsgY2hhciBwb2ludGVyICovCisJaW50IGVvczsJLyogZW5kIG9mIHNlcXVlbmNlIHJlYWQgZm9yIGluZGVmaW5pdGUgZW5jb2RpbmcgKi8KKwlpbnQgZXJyb3I7CS8qIGVycm9yIGNvZGUgdG8gdXNlIHdoZW4gcmV0dXJuaW5nIGFuIGVycm9yICovCisJaW50IGluZjsJLyogY29uc3RydWN0ZWQgaWYgMHgyMCwgaW5kZWZpbml0ZSBpcyAweDIxICovCisJaW50IHRhZzsJLyogdGFnIGZyb20gbGFzdCAnZ2V0IG9iamVjdCcgKi8KKwlpbnQgeGNsYXNzOwkvKiBjbGFzcyBmcm9tIGxhc3QgJ2dldCBvYmplY3QnICovCisJbG9uZyBzbGVuOwkvKiBsZW5ndGggb2YgbGFzdCAnZ2V0IG9iamVjdCcgKi8KKwljb25zdCB1bnNpZ25lZCBjaGFyICptYXg7IC8qIGxhcmdlc3QgdmFsdWUgb2YgcCBhbGxvd2VkICovCisJY29uc3QgdW5zaWduZWQgY2hhciAqcTsvKiB0ZW1wb3JhcnkgdmFyaWFibGUgKi8KKwljb25zdCB1bnNpZ25lZCBjaGFyICoqcHA7LyogdmFyaWFibGUgKi8KKwlpbnQgbGluZTsJLyogdXNlZCBpbiBlcnJvciBwcm9jZXNzaW5nICovCisJfSBBU04xX2NvbnN0X0NUWDsKKworLyogVGhlc2UgYXJlIHVzZWQgaW50ZXJuYWxseSBpbiB0aGUgQVNOMV9PQkpFQ1QgdG8ga2VlcCB0cmFjayBvZgorICogd2hldGhlciB0aGUgbmFtZXMgYW5kIGRhdGEgbmVlZCB0byBiZSBmcmVlKCllZCAqLworI2RlZmluZSBBU04xX09CSkVDVF9GTEFHX0RZTkFNSUMJIDB4MDEJLyogaW50ZXJuYWwgdXNlICovCisjZGVmaW5lIEFTTjFfT0JKRUNUX0ZMQUdfQ1JJVElDQUwJIDB4MDIJLyogY3JpdGljYWwgeDUwOXYzIG9iamVjdCBpZCAqLworI2RlZmluZSBBU04xX09CSkVDVF9GTEFHX0RZTkFNSUNfU1RSSU5HUyAweDA0CS8qIGludGVybmFsIHVzZSAqLworI2RlZmluZSBBU04xX09CSkVDVF9GTEFHX0RZTkFNSUNfREFUQSAJIDB4MDgJLyogaW50ZXJuYWwgdXNlICovCitzdHJ1Y3QgYXNuMV9vYmplY3Rfc3QKKwl7CisJY29uc3QgY2hhciAqc24sKmxuOworCWludCBuaWQ7CisJaW50IGxlbmd0aDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwkvKiBkYXRhIHJlbWFpbnMgY29uc3QgYWZ0ZXIgaW5pdCAqLworCWludCBmbGFnczsJLyogU2hvdWxkIHdlIGZyZWUgdGhpcyBvbmUgKi8KKwl9OworCisjZGVmaW5lIEFTTjFfU1RSSU5HX0ZMQUdfQklUU19MRUZUIDB4MDggLyogU2V0IGlmIDB4MDcgaGFzIGJpdHMgbGVmdCB2YWx1ZSAqLworLyogVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgQVNOMV9TVFJJTkcgaXMgbm90IGEgcmVhbCB2YWx1ZSBidXQganVzdCBhIHBsYWNlCisgKiBob2xkZXIgZm9yIHRoZSBsb2NhdGlvbiB3aGVyZSBpbmRlZmluaXRlIGxlbmd0aCBjb25zdHJ1Y3RlZCBkYXRhIHNob3VsZAorICogYmUgaW5zZXJ0ZWQgaW4gdGhlIG1lbW9yeSBidWZmZXIgCisgKi8KKyNkZWZpbmUgQVNOMV9TVFJJTkdfRkxBR19OREVGIDB4MDEwIAorCisvKiBUaGlzIGZsYWcgaXMgdXNlZCBieSB0aGUgQ01TIGNvZGUgdG8gaW5kaWNhdGUgdGhhdCBhIHN0cmluZyBpcyBub3QKKyAqIGNvbXBsZXRlIGFuZCBpcyBhIHBsYWNlIGhvbGRlciBmb3IgY29udGVudCB3aGVuIGl0IGhhZCBhbGwgYmVlbiAKKyAqIGFjY2Vzc2VkLiBUaGUgZmxhZyB3aWxsIGJlIHJlc2V0IHdoZW4gY29udGVudCBoYXMgYmVlbiB3cml0dGVuIHRvIGl0LgorICovCisKKyNkZWZpbmUgQVNOMV9TVFJJTkdfRkxBR19DT05UIDB4MDIwIAorLyogVGhpcyBmbGFnIGlzIHVzZWQgYnkgQVNOMSBjb2RlIHRvIGluZGljYXRlIGFuIEFTTjFfU1RSSU5HIGlzIGFuIE1TVFJJTkcKKyAqIHR5cGUuCisgKi8KKyNkZWZpbmUgQVNOMV9TVFJJTkdfRkxBR19NU1RSSU5HIDB4MDQwIAorLyogVGhpcyBpcyB0aGUgYmFzZSB0eXBlIHRoYXQgaG9sZHMganVzdCBhYm91dCBldmVyeXRoaW5nIDotKSAqLworc3RydWN0IGFzbjFfc3RyaW5nX3N0CisJeworCWludCBsZW5ndGg7CisJaW50IHR5cGU7CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwkvKiBUaGUgdmFsdWUgb2YgdGhlIGZvbGxvd2luZyBmaWVsZCBkZXBlbmRzIG9uIHRoZSB0eXBlIGJlaW5nCisJICogaGVsZC4gIEl0IGlzIG1vc3RseSBiZWluZyB1c2VkIGZvciBCSVRfU1RSSU5HIHNvIGlmIHRoZQorCSAqIGlucHV0IGRhdGEgaGFzIGEgbm9uLXplcm8gJ3VudXNlZCBiaXRzJyB2YWx1ZSwgaXQgd2lsbCBiZQorCSAqIGhhbmRsZWQgY29ycmVjdGx5ICovCisJbG9uZyBmbGFnczsKKwl9OworCisvKiBBU04xX0VOQ09ESU5HIHN0cnVjdHVyZTogdGhpcyBpcyB1c2VkIHRvIHNhdmUgdGhlIHJlY2VpdmVkCisgKiBlbmNvZGluZyBvZiBhbiBBU04xIHR5cGUuIFRoaXMgaXMgdXNlZnVsIHRvIGdldCByb3VuZAorICogcHJvYmxlbXMgd2l0aCBpbnZhbGlkIGVuY29kaW5ncyB3aGljaCBjYW4gYnJlYWsgc2lnbmF0dXJlcy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBBU04xX0VOQ09ESU5HX3N0CisJeworCXVuc2lnbmVkIGNoYXIgKmVuYzsJLyogREVSIGVuY29kaW5nICovCisJbG9uZyBsZW47CQkvKiBMZW5ndGggb2YgZW5jb2RpbmcgKi8KKwlpbnQgbW9kaWZpZWQ7CQkgLyogc2V0IHRvIDEgaWYgJ2VuYycgaXMgaW52YWxpZCAqLworCX0gQVNOMV9FTkNPRElORzsKKworLyogVXNlZCB3aXRoIEFTTjEgTE9ORyB0eXBlOiBpZiBhIGxvbmcgaXMgc2V0IHRvIHRoaXMgaXQgaXMgb21pdHRlZCAqLworI2RlZmluZSBBU04xX0xPTkdfVU5ERUYJMHg3ZmZmZmZmZkwKKworI2RlZmluZSBTVEFCTEVfRkxBR1NfTUFMTE9DCTB4MDEKKyNkZWZpbmUgU1RBQkxFX05PX01BU0sJCTB4MDIKKyNkZWZpbmUgRElSU1RSSU5HX1RZUEUJXAorIChCX0FTTjFfUFJJTlRBQkxFU1RSSU5HfEJfQVNOMV9UNjFTVFJJTkd8Ql9BU04xX0JNUFNUUklOR3xCX0FTTjFfVVRGOFNUUklORykKKyNkZWZpbmUgUEtDUzlTVFJJTkdfVFlQRSAoRElSU1RSSU5HX1RZUEV8Ql9BU04xX0lBNVNUUklORykKKwordHlwZWRlZiBzdHJ1Y3QgYXNuMV9zdHJpbmdfdGFibGVfc3QgeworCWludCBuaWQ7CisJbG9uZyBtaW5zaXplOworCWxvbmcgbWF4c2l6ZTsKKwl1bnNpZ25lZCBsb25nIG1hc2s7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKK30gQVNOMV9TVFJJTkdfVEFCTEU7CisKKy8qIHNpemUgbGltaXRzOiB0aGlzIHN0dWZmIGlzIHRha2VuIHN0cmFpZ2h0IGZyb20gUkZDMjQ1OSAqLworCisjZGVmaW5lIHViX25hbWUJCQkJMzI3NjgKKyNkZWZpbmUgdWJfY29tbW9uX25hbWUJCQk2NAorI2RlZmluZSB1Yl9sb2NhbGl0eV9uYW1lCQkxMjgKKyNkZWZpbmUgdWJfc3RhdGVfbmFtZQkJCTEyOAorI2RlZmluZSB1Yl9vcmdhbml6YXRpb25fbmFtZQkJNjQKKyNkZWZpbmUgdWJfb3JnYW5pemF0aW9uX3VuaXRfbmFtZQk2NAorI2RlZmluZSB1Yl90aXRsZQkJCTY0CisjZGVmaW5lIHViX2VtYWlsX2FkZHJlc3MJCTEyOAorCisvKiBEZWNsYXJhdGlvbnMgZm9yIHRlbXBsYXRlIHN0cnVjdHVyZXM6IGZvciBmdWxsIGRlZmluaXRpb25zCisgKiBzZWUgYXNuMXQuaAorICovCit0eXBlZGVmIHN0cnVjdCBBU04xX1RFTVBMQVRFX3N0IEFTTjFfVEVNUExBVEU7Cit0eXBlZGVmIHN0cnVjdCBBU04xX1RMQ19zdCBBU04xX1RMQzsKKy8qIFRoaXMgaXMganVzdCBhbiBvcGFxdWUgcG9pbnRlciAqLwordHlwZWRlZiBzdHJ1Y3QgQVNOMV9WQUxVRV9zdCBBU04xX1ZBTFVFOworCisvKiBEZWNsYXJlIEFTTjEgZnVuY3Rpb25zOiB0aGUgaW1wbGVtZW50IG1hY3JvIGluIGluIGFzbjF0LmggKi8KKworI2RlZmluZSBERUNMQVJFX0FTTjFfRlVOQ1RJT05TKHR5cGUpIERFQ0xBUkVfQVNOMV9GVU5DVElPTlNfbmFtZSh0eXBlLCB0eXBlKQorCisjZGVmaW5lIERFQ0xBUkVfQVNOMV9BTExPQ19GVU5DVElPTlModHlwZSkgXAorCURFQ0xBUkVfQVNOMV9BTExPQ19GVU5DVElPTlNfbmFtZSh0eXBlLCB0eXBlKQorCisjZGVmaW5lIERFQ0xBUkVfQVNOMV9GVU5DVElPTlNfbmFtZSh0eXBlLCBuYW1lKSBcCisJREVDTEFSRV9BU04xX0FMTE9DX0ZVTkNUSU9OU19uYW1lKHR5cGUsIG5hbWUpIFwKKwlERUNMQVJFX0FTTjFfRU5DT0RFX0ZVTkNUSU9OUyh0eXBlLCBuYW1lLCBuYW1lKQorCisjZGVmaW5lIERFQ0xBUkVfQVNOMV9GVU5DVElPTlNfZm5hbWUodHlwZSwgaXRuYW1lLCBuYW1lKSBcCisJREVDTEFSRV9BU04xX0FMTE9DX0ZVTkNUSU9OU19uYW1lKHR5cGUsIG5hbWUpIFwKKwlERUNMQVJFX0FTTjFfRU5DT0RFX0ZVTkNUSU9OUyh0eXBlLCBpdG5hbWUsIG5hbWUpCisKKyNkZWZpbmUJREVDTEFSRV9BU04xX0VOQ09ERV9GVU5DVElPTlModHlwZSwgaXRuYW1lLCBuYW1lKSBcCisJdHlwZSAqZDJpXyMjbmFtZSh0eXBlICoqYSwgY29uc3QgdW5zaWduZWQgY2hhciAqKmluLCBsb25nIGxlbik7IFwKKwlpbnQgaTJkXyMjbmFtZSh0eXBlICphLCB1bnNpZ25lZCBjaGFyICoqb3V0KTsgXAorCURFQ0xBUkVfQVNOMV9JVEVNKGl0bmFtZSkKKworI2RlZmluZQlERUNMQVJFX0FTTjFfRU5DT0RFX0ZVTkNUSU9OU19jb25zdCh0eXBlLCBuYW1lKSBcCisJdHlwZSAqZDJpXyMjbmFtZSh0eXBlICoqYSwgY29uc3QgdW5zaWduZWQgY2hhciAqKmluLCBsb25nIGxlbik7IFwKKwlpbnQgaTJkXyMjbmFtZShjb25zdCB0eXBlICphLCB1bnNpZ25lZCBjaGFyICoqb3V0KTsgXAorCURFQ0xBUkVfQVNOMV9JVEVNKG5hbWUpCisKKyNkZWZpbmUJREVDTEFSRV9BU04xX05ERUZfRlVOQ1RJT04obmFtZSkgXAorCWludCBpMmRfIyNuYW1lIyNfTkRFRihuYW1lICphLCB1bnNpZ25lZCBjaGFyICoqb3V0KTsKKworI2RlZmluZSBERUNMQVJFX0FTTjFfRlVOQ1RJT05TX2NvbnN0KG5hbWUpIFwKKwlERUNMQVJFX0FTTjFfQUxMT0NfRlVOQ1RJT05TKG5hbWUpIFwKKwlERUNMQVJFX0FTTjFfRU5DT0RFX0ZVTkNUSU9OU19jb25zdChuYW1lLCBuYW1lKQorCisjZGVmaW5lIERFQ0xBUkVfQVNOMV9BTExPQ19GVU5DVElPTlNfbmFtZSh0eXBlLCBuYW1lKSBcCisJdHlwZSAqbmFtZSMjX25ldyh2b2lkKTsgXAorCXZvaWQgbmFtZSMjX2ZyZWUodHlwZSAqYSk7CisKKyNkZWZpbmUgREVDTEFSRV9BU04xX1BSSU5UX0ZVTkNUSU9OKHN0bmFtZSkgXAorCURFQ0xBUkVfQVNOMV9QUklOVF9GVU5DVElPTl9mbmFtZShzdG5hbWUsIHN0bmFtZSkKKworI2RlZmluZSBERUNMQVJFX0FTTjFfUFJJTlRfRlVOQ1RJT05fZm5hbWUoc3RuYW1lLCBmbmFtZSkgXAorCWludCBmbmFtZSMjX3ByaW50X2N0eChCSU8gKm91dCwgc3RuYW1lICp4LCBpbnQgaW5kZW50LCBcCisJCQkJCSBjb25zdCBBU04xX1BDVFggKnBjdHgpOworCisjZGVmaW5lIEQySV9PRih0eXBlKSB0eXBlICooKikodHlwZSAqKixjb25zdCB1bnNpZ25lZCBjaGFyICoqLGxvbmcpCisjZGVmaW5lIEkyRF9PRih0eXBlKSBpbnQgKCopKHR5cGUgKix1bnNpZ25lZCBjaGFyICoqKQorI2RlZmluZSBJMkRfT0ZfY29uc3QodHlwZSkgaW50ICgqKShjb25zdCB0eXBlICosdW5zaWduZWQgY2hhciAqKikKKworI2RlZmluZSBDSEVDS0VEX0QySV9PRih0eXBlLCBkMmkpIFwKKyAgICAoKGQyaV9vZl92b2lkKikgKDEgPyBkMmkgOiAoKEQySV9PRih0eXBlKSkwKSkpCisjZGVmaW5lIENIRUNLRURfSTJEX09GKHR5cGUsIGkyZCkgXAorICAgICgoaTJkX29mX3ZvaWQqKSAoMSA/IGkyZCA6ICgoSTJEX09GKHR5cGUpKTApKSkKKyNkZWZpbmUgQ0hFQ0tFRF9ORVdfT0YodHlwZSwgeG5ldykgXAorICAgICgodm9pZCAqKCopKHZvaWQpKSAoMSA/IHhuZXcgOiAoKHR5cGUgKigqKSh2b2lkKSkwKSkpCisjZGVmaW5lIENIRUNLRURfUFBUUl9PRih0eXBlLCBwKSBcCisgICAgKCh2b2lkKiopICgxID8gcCA6ICh0eXBlKiopMCkpCisKKyNkZWZpbmUgVFlQRURFRl9EMklfT0YodHlwZSkgdHlwZWRlZiB0eXBlICpkMmlfb2ZfIyN0eXBlKHR5cGUgKiosY29uc3QgdW5zaWduZWQgY2hhciAqKixsb25nKQorI2RlZmluZSBUWVBFREVGX0kyRF9PRih0eXBlKSB0eXBlZGVmIGludCBpMmRfb2ZfIyN0eXBlKGNvbnN0IHR5cGUgKix1bnNpZ25lZCBjaGFyICoqKQorI2RlZmluZSBUWVBFREVGX0QySTJEX09GKHR5cGUpIFRZUEVERUZfRDJJX09GKHR5cGUpOyBUWVBFREVGX0kyRF9PRih0eXBlKQorCitUWVBFREVGX0QySTJEX09GKHZvaWQpOworCisvKiBUaGUgZm9sbG93aW5nIG1hY3JvcyBhbmQgdHlwZWRlZnMgYWxsb3cgYW4gQVNOMV9JVEVNCisgKiB0byBiZSBlbWJlZGRlZCBpbiBhIHN0cnVjdHVyZSBhbmQgcmVmZXJlbmNlZC4gU2luY2UKKyAqIHRoZSBBU04xX0lURU0gcG9pbnRlcnMgbmVlZCB0byBiZSBnbG9iYWxseSBhY2Nlc3NpYmxlCisgKiAocG9zc2libHkgZnJvbSBzaGFyZWQgbGlicmFyaWVzKSB0aGV5IG1heSBleGlzdCBpbgorICogZGlmZmVyZW50IGZvcm1zLiBPbiBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IGl0IHRoZQorICogQVNOMV9JVEVNIHN0cnVjdHVyZSBpdHNlbGYgd2lsbCBiZSBnbG9iYWxseSBleHBvcnRlZC4KKyAqIE90aGVyIHBsYXRmb3JtcyB3aWxsIGV4cG9ydCBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucworICogYW4gQVNOMV9JVEVNIHBvaW50ZXIuCisgKgorICogVG8gaGFuZGxlIGJvdGggY2FzZXMgdHJhbnNwYXJlbnRseSB0aGUgbWFjcm9zIGJlbG93CisgKiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIGhhcmQgY29kaW5nIGFuIEFTTjFfSVRFTQorICogcG9pbnRlciBpbiBhIHN0cnVjdHVyZS4KKyAqCisgKiBUaGUgc3RydWN0dXJlIHdpbGwgbG9vayBsaWtlIHRoaXM6CisgKgorICogdHlwZWRlZiBzdHJ1Y3QgU09NRVRISU5HX3N0IHsKKyAqICAgICAgLi4uCisgKiAgICAgIEFTTjFfSVRFTV9FWFAgKmlwdHI7CisgKiAgICAgIC4uLgorICogfSBTT01FVEhJTkc7IAorICoKKyAqIEl0IHdvdWxkIGJlIGluaXRpYWxpc2VkIGFzIGUuZy46CisgKgorICogU09NRVRISU5HIHNvbWV2YXIgPSB7Li4uLEFTTjFfSVRFTV9yZWYoWDUwOSksLi4ufTsKKyAqCisgKiBhbmQgdGhlIGFjdHVhbCBwb2ludGVyIGV4dHJhY3RlZCB3aXRoOgorICoKKyAqIGNvbnN0IEFTTjFfSVRFTSAqaXQgPSBBU04xX0lURU1fcHRyKHNvbWV2YXIuaXB0cik7CisgKgorICogRmluYWxseSBhbiBBU04xX0lURU0gcG9pbnRlciBjYW4gYmUgZXh0cmFjdGVkIGZyb20gYW4KKyAqIGFwcHJvcHJpYXRlIHJlZmVyZW5jZSB3aXRoOiBBU04xX0lURU1fcnB0cihYNTA5KS4gVGhpcworICogd291bGQgYmUgdXNlZCB3aGVuIGEgZnVuY3Rpb24gdGFrZXMgYW4gQVNOMV9JVEVNICogYXJndW1lbnQuCisgKgorICovCisKKyNpZm5kZWYgT1BFTlNTTF9FWFBPUlRfVkFSX0FTX0ZVTkNUSU9OCisKKy8qIEFTTjFfSVRFTSBwb2ludGVyIGV4cG9ydGVkIHR5cGUgKi8KK3R5cGVkZWYgY29uc3QgQVNOMV9JVEVNIEFTTjFfSVRFTV9FWFA7CisKKy8qIE1hY3JvIHRvIG9idGFpbiBBU04xX0lURU0gcG9pbnRlciBmcm9tIGV4cG9ydGVkIHR5cGUgKi8KKyNkZWZpbmUgQVNOMV9JVEVNX3B0cihpcHRyKSAoaXB0cikKKworLyogTWFjcm8gdG8gaW5jbHVkZSBBU04xX0lURU0gcG9pbnRlciBmcm9tIGJhc2UgdHlwZSAqLworI2RlZmluZSBBU04xX0lURU1fcmVmKGlwdHIpICgmKGlwdHIjI19pdCkpCisKKyNkZWZpbmUgQVNOMV9JVEVNX3JwdHIocmVmKSAoJihyZWYjI19pdCkpCisKKyNkZWZpbmUgREVDTEFSRV9BU04xX0lURU0obmFtZSkgXAorCWV4dGVybiBjb25zdCBBU04xX0lURU0gbmFtZSMjX2l0OworCisjZWxzZQorCisvKiBQbGF0Zm9ybXMgdGhhdCBjYW4ndCBlYXNpbHkgaGFuZGxlIHNoYXJlZCBnbG9iYWwgdmFyaWFibGVzIGFyZSBkZWNsYXJlZAorICogYXMgZnVuY3Rpb25zIHJldHVybmluZyBBU04xX0lURU0gcG9pbnRlcnMuCisgKi8KKworLyogQVNOMV9JVEVNIHBvaW50ZXIgZXhwb3J0ZWQgdHlwZSAqLwordHlwZWRlZiBjb25zdCBBU04xX0lURU0gKiBBU04xX0lURU1fRVhQKHZvaWQpOworCisvKiBNYWNybyB0byBvYnRhaW4gQVNOMV9JVEVNIHBvaW50ZXIgZnJvbSBleHBvcnRlZCB0eXBlICovCisjZGVmaW5lIEFTTjFfSVRFTV9wdHIoaXB0cikgKGlwdHIoKSkKKworLyogTWFjcm8gdG8gaW5jbHVkZSBBU04xX0lURU0gcG9pbnRlciBmcm9tIGJhc2UgdHlwZSAqLworI2RlZmluZSBBU04xX0lURU1fcmVmKGlwdHIpIChpcHRyIyNfaXQpCisKKyNkZWZpbmUgQVNOMV9JVEVNX3JwdHIocmVmKSAocmVmIyNfaXQoKSkKKworI2RlZmluZSBERUNMQVJFX0FTTjFfSVRFTShuYW1lKSBcCisJY29uc3QgQVNOMV9JVEVNICogbmFtZSMjX2l0KHZvaWQpOworCisjZW5kaWYKKworLyogUGFyYW1ldGVycyB1c2VkIGJ5IEFTTjFfU1RSSU5HX3ByaW50X2V4KCkgKi8KKworLyogVGhlc2UgZGV0ZXJtaW5lIHdoaWNoIGNoYXJhY3RlcnMgdG8gZXNjYXBlOgorICogUkZDMjI1MyBzcGVjaWFsIGNoYXJhY3RlcnMsIGNvbnRyb2wgY2hhcmFjdGVycyBhbmQKKyAqIE1TQiBzZXQgY2hhcmFjdGVycworICovCisKKyNkZWZpbmUgQVNOMV9TVFJGTEdTX0VTQ18yMjUzCQkxCisjZGVmaW5lIEFTTjFfU1RSRkxHU19FU0NfQ1RSTAkJMgorI2RlZmluZSBBU04xX1NUUkZMR1NfRVNDX01TQgkJNAorCisKKy8qIFRoaXMgZmxhZyBkZXRlcm1pbmVzIGhvdyB3ZSBkbyBlc2NhcGluZzogbm9ybWFsbHkKKyAqIFJDMjI1MyBiYWNrc2xhc2ggb25seSwgc2V0IHRoaXMgdG8gdXNlIGJhY2tzbGFzaCBhbmQKKyAqIHF1b3RlLgorICovCisKKyNkZWZpbmUgQVNOMV9TVFJGTEdTX0VTQ19RVU9URQkJOAorCisKKy8qIFRoZXNlIHRocmVlIGZsYWdzIGFyZSBpbnRlcm5hbCB1c2Ugb25seS4gKi8KKworLyogQ2hhcmFjdGVyIGlzIGEgdmFsaWQgUHJpbnRhYmxlU3RyaW5nIGNoYXJhY3RlciAqLworI2RlZmluZSBDSEFSVFlQRV9QUklOVEFCTEVTVFJJTkcJMHgxMAorLyogQ2hhcmFjdGVyIG5lZWRzIGVzY2FwaW5nIGlmIGl0IGlzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUgQ0hBUlRZUEVfRklSU1RfRVNDXzIyNTMJCTB4MjAKKy8qIENoYXJhY3RlciBuZWVkcyBlc2NhcGluZyBpZiBpdCBpcyB0aGUgbGFzdCBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUgQ0hBUlRZUEVfTEFTVF9FU0NfMjI1MwkJMHg0MAorCisvKiBOQiB0aGUgaW50ZXJuYWwgZmxhZ3MgYXJlIHNhZmVseSByZXVzZWQgYmVsb3cgYnkgZmxhZ3MKKyAqIGhhbmRsZWQgYXQgdGhlIHRvcCBsZXZlbC4KKyAqLworCisvKiBJZiB0aGlzIGlzIHNldCB3ZSBjb252ZXJ0IGFsbCBjaGFyYWN0ZXIgc3RyaW5ncworICogdG8gVVRGOCBmaXJzdCAKKyAqLworCisjZGVmaW5lIEFTTjFfU1RSRkxHU19VVEY4X0NPTlZFUlQJMHgxMAorCisvKiBJZiB0aGlzIGlzIHNldCB3ZSBkb24ndCBhdHRlbXB0IHRvIGludGVycHJldCBjb250ZW50OgorICoganVzdCBhc3N1bWUgYWxsIHN0cmluZ3MgYXJlIDEgYnl0ZSBwZXIgY2hhcmFjdGVyLiBUaGlzCisgKiB3aWxsIHByb2R1Y2Ugc29tZSBwcmV0dHkgb2RkIGxvb2tpbmcgb3V0cHV0IQorICovCisKKyNkZWZpbmUgQVNOMV9TVFJGTEdTX0lHTk9SRV9UWVBFCTB4MjAKKworLyogSWYgdGhpcyBpcyBzZXQgd2UgaW5jbHVkZSB0aGUgc3RyaW5nIHR5cGUgaW4gdGhlIG91dHB1dCAqLworI2RlZmluZSBBU04xX1NUUkZMR1NfU0hPV19UWVBFCQkweDQwCisKKy8qIFRoaXMgZGV0ZXJtaW5lcyB3aGljaCBzdHJpbmdzIHRvIGRpc3BsYXkgYW5kIHdoaWNoIHRvCisgKiAnZHVtcCcgKGhleCBkdW1wIG9mIGNvbnRlbnQgb2N0ZXRzIG9yIERFUiBlbmNvZGluZykuIFdlIGNhbgorICogb25seSBkdW1wIG5vbiBjaGFyYWN0ZXIgc3RyaW5ncyBvciBldmVyeXRoaW5nLiBJZiB3ZQorICogZG9uJ3QgZHVtcCAndW5rbm93bicgdGhleSBhcmUgaW50ZXJwcmV0ZWQgYXMgY2hhcmFjdGVyCisgKiBzdHJpbmdzIHdpdGggMSBvY3RldCBwZXIgY2hhcmFjdGVyIGFuZCBhcmUgc3ViamVjdCB0bworICogdGhlIHVzdWFsIGVzY2FwaW5nIG9wdGlvbnMuCisgKi8KKworI2RlZmluZSBBU04xX1NUUkZMR1NfRFVNUF9BTEwJCTB4ODAKKyNkZWZpbmUgQVNOMV9TVFJGTEdTX0RVTVBfVU5LTk9XTgkweDEwMAorCisvKiBUaGVzZSBkZXRlcm1pbmUgd2hhdCAnZHVtcGluZycgZG9lcywgd2UgY2FuIGR1bXAgdGhlCisgKiBjb250ZW50IG9jdGV0cyBvciB0aGUgREVSIGVuY29kaW5nOiBib3RoIHVzZSB0aGUKKyAqIFJGQzIyNTMgI1hYWFhYIG5vdGF0aW9uLgorICovCisKKyNkZWZpbmUgQVNOMV9TVFJGTEdTX0RVTVBfREVSCQkweDIwMAorCisvKiBBbGwgdGhlIHN0cmluZyBmbGFncyBjb25zaXN0ZW50IHdpdGggUkZDMjI1MywKKyAqIGVzY2FwaW5nIGNvbnRyb2wgY2hhcmFjdGVycyBpc24ndCBlc3NlbnRpYWwgaW4KKyAqIFJGQzIyNTMgYnV0IGl0IGlzIGFkdmlzYWJsZSBhbnl3YXkuCisgKi8KKworI2RlZmluZSBBU04xX1NUUkZMR1NfUkZDMjI1MwkoQVNOMV9TVFJGTEdTX0VTQ18yMjUzIHwgXAorCQkJCUFTTjFfU1RSRkxHU19FU0NfQ1RSTCB8IFwKKwkJCQlBU04xX1NUUkZMR1NfRVNDX01TQiB8IFwKKwkJCQlBU04xX1NUUkZMR1NfVVRGOF9DT05WRVJUIHwgXAorCQkJCUFTTjFfU1RSRkxHU19EVU1QX1VOS05PV04gfCBcCisJCQkJQVNOMV9TVFJGTEdTX0RVTVBfREVSKQorCitERUNMQVJFX0FTTjFfU0VUX09GKEFTTjFfSU5URUdFUikKKwordHlwZWRlZiBzdHJ1Y3QgYXNuMV90eXBlX3N0CisJeworCWludCB0eXBlOworCXVuaW9uCXsKKwkJY2hhciAqcHRyOworCQlBU04xX0JPT0xFQU4JCWJvb2xlYW47CisJCUFTTjFfU1RSSU5HICoJCWFzbjFfc3RyaW5nOworCQlBU04xX09CSkVDVCAqCQlvYmplY3Q7CisJCUFTTjFfSU5URUdFUiAqCQlpbnRlZ2VyOworCQlBU04xX0VOVU1FUkFURUQgKgllbnVtZXJhdGVkOworCQlBU04xX0JJVF9TVFJJTkcgKgliaXRfc3RyaW5nOworCQlBU04xX09DVEVUX1NUUklORyAqCW9jdGV0X3N0cmluZzsKKwkJQVNOMV9QUklOVEFCTEVTVFJJTkcgKglwcmludGFibGVzdHJpbmc7CisJCUFTTjFfVDYxU1RSSU5HICoJdDYxc3RyaW5nOworCQlBU04xX0lBNVNUUklORyAqCWlhNXN0cmluZzsKKwkJQVNOMV9HRU5FUkFMU1RSSU5HICoJZ2VuZXJhbHN0cmluZzsKKwkJQVNOMV9CTVBTVFJJTkcgKglibXBzdHJpbmc7CisJCUFTTjFfVU5JVkVSU0FMU1RSSU5HICoJdW5pdmVyc2Fsc3RyaW5nOworCQlBU04xX1VUQ1RJTUUgKgkJdXRjdGltZTsKKwkJQVNOMV9HRU5FUkFMSVpFRFRJTUUgKglnZW5lcmFsaXplZHRpbWU7CisJCUFTTjFfVklTSUJMRVNUUklORyAqCXZpc2libGVzdHJpbmc7CisJCUFTTjFfVVRGOFNUUklORyAqCXV0ZjhzdHJpbmc7CisJCS8qIHNldCBhbmQgc2VxdWVuY2UgYXJlIGxlZnQgY29tcGxldGUgYW5kIHN0aWxsCisJCSAqIGNvbnRhaW4gdGhlIHNldCBvciBzZXF1ZW5jZSBieXRlcyAqLworCQlBU04xX1NUUklORyAqCQlzZXQ7CisJCUFTTjFfU1RSSU5HICoJCXNlcXVlbmNlOworCQlBU04xX1ZBTFVFICoJCWFzbjFfdmFsdWU7CisJCX0gdmFsdWU7CisJfSBBU04xX1RZUEU7CisKK0RFQ0xBUkVfQVNOMV9TRVRfT0YoQVNOMV9UWVBFKQorCit0eXBlZGVmIFNUQUNLX09GKEFTTjFfVFlQRSkgQVNOMV9TRVFVRU5DRV9BTlk7CisKK0RFQ0xBUkVfQVNOMV9FTkNPREVfRlVOQ1RJT05TX2NvbnN0KEFTTjFfU0VRVUVOQ0VfQU5ZLCBBU04xX1NFUVVFTkNFX0FOWSkKK0RFQ0xBUkVfQVNOMV9FTkNPREVfRlVOQ1RJT05TX2NvbnN0KEFTTjFfU0VRVUVOQ0VfQU5ZLCBBU04xX1NFVF9BTlkpCisKK3N0cnVjdCBYNTA5X2FsZ29yX3N0CisgICAgICAgeworICAgICAgIEFTTjFfT0JKRUNUICphbGdvcml0aG07CisgICAgICAgQVNOMV9UWVBFICpwYXJhbWV0ZXI7CisgICAgICAgfSAvKiBYNTA5X0FMR09SICovOworREVGSU5FX1NUQUNLX09GKFg1MDlfQUxHT1IpOworCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFg1MDlfQUxHT1IpOworCit0eXBlZGVmIHN0cnVjdCBORVRTQ0FQRV9YNTA5X3N0CisJeworCUFTTjFfT0NURVRfU1RSSU5HICpoZWFkZXI7CisJWDUwOSAqY2VydDsKKwl9IE5FVFNDQVBFX1g1MDk7CisKKy8qIFRoaXMgaXMgdXNlZCB0byBjb250YWluIGEgbGlzdCBvZiBiaXQgbmFtZXMgKi8KK3R5cGVkZWYgc3RydWN0IEJJVF9TVFJJTkdfQklUTkFNRV9zdCB7CisJaW50IGJpdG51bTsKKwljb25zdCBjaGFyICpsbmFtZTsKKwljb25zdCBjaGFyICpzbmFtZTsKK30gQklUX1NUUklOR19CSVROQU1FOworCisKKyNkZWZpbmUgTV9BU04xX1NUUklOR19sZW5ndGgoeCkJKCh4KS0+bGVuZ3RoKQorI2RlZmluZSBNX0FTTjFfU1RSSU5HX2xlbmd0aF9zZXQoeCwgbikJKCh4KS0+bGVuZ3RoID0gKG4pKQorI2RlZmluZSBNX0FTTjFfU1RSSU5HX3R5cGUoeCkJKCh4KS0+dHlwZSkKKyNkZWZpbmUgTV9BU04xX1NUUklOR19kYXRhKHgpCSgoeCktPmRhdGEpCisKKy8qIE1hY3JvcyBmb3Igc3RyaW5nIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgTV9BU04xX0JJVF9TVFJJTkdfbmV3KCkJKEFTTjFfQklUX1NUUklORyAqKVwKKwkJQVNOMV9TVFJJTkdfdHlwZV9uZXcoVl9BU04xX0JJVF9TVFJJTkcpCisjZGVmaW5lIE1fQVNOMV9CSVRfU1RSSU5HX2ZyZWUoYSkJQVNOMV9TVFJJTkdfZnJlZSgoQVNOMV9TVFJJTkcgKilhKQorI2RlZmluZSBNX0FTTjFfQklUX1NUUklOR19kdXAoYSkgKEFTTjFfQklUX1NUUklORyAqKVwKKwkJQVNOMV9TVFJJTkdfZHVwKChjb25zdCBBU04xX1NUUklORyAqKWEpCisjZGVmaW5lIE1fQVNOMV9CSVRfU1RSSU5HX2NtcChhLGIpIEFTTjFfU1RSSU5HX2NtcChcCisJCShjb25zdCBBU04xX1NUUklORyAqKWEsKGNvbnN0IEFTTjFfU1RSSU5HICopYikKKyNkZWZpbmUgTV9BU04xX0JJVF9TVFJJTkdfc2V0KGEsYixjKSBBU04xX1NUUklOR19zZXQoKEFTTjFfU1RSSU5HICopYSxiLGMpCisKKyNkZWZpbmUgTV9BU04xX0lOVEVHRVJfbmV3KCkJKEFTTjFfSU5URUdFUiAqKVwKKwkJQVNOMV9TVFJJTkdfdHlwZV9uZXcoVl9BU04xX0lOVEVHRVIpCisjZGVmaW5lIE1fQVNOMV9JTlRFR0VSX2ZyZWUoYSkJCUFTTjFfU1RSSU5HX2ZyZWUoKEFTTjFfU1RSSU5HICopYSkKKyNkZWZpbmUgTV9BU04xX0lOVEVHRVJfZHVwKGEpIChBU04xX0lOVEVHRVIgKilcCisJCUFTTjFfU1RSSU5HX2R1cCgoY29uc3QgQVNOMV9TVFJJTkcgKilhKQorI2RlZmluZSBNX0FTTjFfSU5URUdFUl9jbXAoYSxiKQlBU04xX1NUUklOR19jbXAoXAorCQkoY29uc3QgQVNOMV9TVFJJTkcgKilhLChjb25zdCBBU04xX1NUUklORyAqKWIpCisKKyNkZWZpbmUgTV9BU04xX0VOVU1FUkFURURfbmV3KCkJKEFTTjFfRU5VTUVSQVRFRCAqKVwKKwkJQVNOMV9TVFJJTkdfdHlwZV9uZXcoVl9BU04xX0VOVU1FUkFURUQpCisjZGVmaW5lIE1fQVNOMV9FTlVNRVJBVEVEX2ZyZWUoYSkJQVNOMV9TVFJJTkdfZnJlZSgoQVNOMV9TVFJJTkcgKilhKQorI2RlZmluZSBNX0FTTjFfRU5VTUVSQVRFRF9kdXAoYSkgKEFTTjFfRU5VTUVSQVRFRCAqKVwKKwkJQVNOMV9TVFJJTkdfZHVwKChjb25zdCBBU04xX1NUUklORyAqKWEpCisjZGVmaW5lIE1fQVNOMV9FTlVNRVJBVEVEX2NtcChhLGIpCUFTTjFfU1RSSU5HX2NtcChcCisJCShjb25zdCBBU04xX1NUUklORyAqKWEsKGNvbnN0IEFTTjFfU1RSSU5HICopYikKKworI2RlZmluZSBNX0FTTjFfT0NURVRfU1RSSU5HX25ldygpCShBU04xX09DVEVUX1NUUklORyAqKVwKKwkJQVNOMV9TVFJJTkdfdHlwZV9uZXcoVl9BU04xX09DVEVUX1NUUklORykKKyNkZWZpbmUgTV9BU04xX09DVEVUX1NUUklOR19mcmVlKGEpCUFTTjFfU1RSSU5HX2ZyZWUoKEFTTjFfU1RSSU5HICopYSkKKyNkZWZpbmUgTV9BU04xX09DVEVUX1NUUklOR19kdXAoYSkgKEFTTjFfT0NURVRfU1RSSU5HICopXAorCQlBU04xX1NUUklOR19kdXAoKGNvbnN0IEFTTjFfU1RSSU5HICopYSkKKyNkZWZpbmUgTV9BU04xX09DVEVUX1NUUklOR19jbXAoYSxiKSBBU04xX1NUUklOR19jbXAoXAorCQkoY29uc3QgQVNOMV9TVFJJTkcgKilhLChjb25zdCBBU04xX1NUUklORyAqKWIpCisjZGVmaW5lIE1fQVNOMV9PQ1RFVF9TVFJJTkdfc2V0KGEsYixjKQlBU04xX1NUUklOR19zZXQoKEFTTjFfU1RSSU5HICopYSxiLGMpCisjZGVmaW5lIE1fQVNOMV9PQ1RFVF9TVFJJTkdfcHJpbnQoYSxiKQlBU04xX1NUUklOR19wcmludChhLChBU04xX1NUUklORyAqKWIpCisjZGVmaW5lIE1faTJkX0FTTjFfT0NURVRfU1RSSU5HKGEscHApIFwKKwkJaTJkX0FTTjFfYnl0ZXMoKEFTTjFfU1RSSU5HICopYSxwcCxWX0FTTjFfT0NURVRfU1RSSU5HLFwKKwkJVl9BU04xX1VOSVZFUlNBTCkKKworI2RlZmluZSBCX0FTTjFfVElNRSBcCisJCQlCX0FTTjFfVVRDVElNRSB8IFwKKwkJCUJfQVNOMV9HRU5FUkFMSVpFRFRJTUUKKworI2RlZmluZSBCX0FTTjFfUFJJTlRBQkxFIFwKKwkJCUJfQVNOMV9OVU1FUklDU1RSSU5HfCBcCisJCQlCX0FTTjFfUFJJTlRBQkxFU1RSSU5HfCBcCisJCQlCX0FTTjFfVDYxU1RSSU5HfCBcCisJCQlCX0FTTjFfSUE1U1RSSU5HfCBcCisJCQlCX0FTTjFfQklUX1NUUklOR3wgXAorCQkJQl9BU04xX1VOSVZFUlNBTFNUUklOR3xcCisJCQlCX0FTTjFfQk1QU1RSSU5HfFwKKwkJCUJfQVNOMV9VVEY4U1RSSU5HfFwKKwkJCUJfQVNOMV9TRVFVRU5DRXxcCisJCQlCX0FTTjFfVU5LTk9XTgorCisjZGVmaW5lIEJfQVNOMV9ESVJFQ1RPUllTVFJJTkcgXAorCQkJQl9BU04xX1BSSU5UQUJMRVNUUklOR3wgXAorCQkJQl9BU04xX1RFTEVURVhTVFJJTkd8XAorCQkJQl9BU04xX0JNUFNUUklOR3xcCisJCQlCX0FTTjFfVU5JVkVSU0FMU1RSSU5HfFwKKwkJCUJfQVNOMV9VVEY4U1RSSU5HCisKKyNkZWZpbmUgQl9BU04xX0RJU1BMQVlURVhUIFwKKwkJCUJfQVNOMV9JQTVTVFJJTkd8IFwKKwkJCUJfQVNOMV9WSVNJQkxFU1RSSU5HfCBcCisJCQlCX0FTTjFfQk1QU1RSSU5HfFwKKwkJCUJfQVNOMV9VVEY4U1RSSU5HCisKKyNkZWZpbmUgTV9BU04xX1BSSU5UQUJMRV9uZXcoKQlBU04xX1NUUklOR190eXBlX25ldyhWX0FTTjFfVDYxU1RSSU5HKQorI2RlZmluZSBNX0FTTjFfUFJJTlRBQkxFX2ZyZWUoYSkJQVNOMV9TVFJJTkdfZnJlZSgoQVNOMV9TVFJJTkcgKilhKQorI2RlZmluZSBNX2kyZF9BU04xX1BSSU5UQUJMRShhLHBwKSBpMmRfQVNOMV9ieXRlcygoQVNOMV9TVFJJTkcgKilhLFwKKwkJcHAsYS0+dHlwZSxWX0FTTjFfVU5JVkVSU0FMKQorI2RlZmluZSBNX2QyaV9BU04xX1BSSU5UQUJMRShhLHBwLGwpIFwKKwkJZDJpX0FTTjFfdHlwZV9ieXRlcygoQVNOMV9TVFJJTkcgKiopYSxwcCxsLCBcCisJCQlCX0FTTjFfUFJJTlRBQkxFKQorCisjZGVmaW5lIE1fRElSRUNUT1JZU1RSSU5HX25ldygpIEFTTjFfU1RSSU5HX3R5cGVfbmV3KFZfQVNOMV9QUklOVEFCTEVTVFJJTkcpCisjZGVmaW5lIE1fRElSRUNUT1JZU1RSSU5HX2ZyZWUoYSkJQVNOMV9TVFJJTkdfZnJlZSgoQVNOMV9TVFJJTkcgKilhKQorI2RlZmluZSBNX2kyZF9ESVJFQ1RPUllTVFJJTkcoYSxwcCkgaTJkX0FTTjFfYnl0ZXMoKEFTTjFfU1RSSU5HICopYSxcCisJCQkJCQlwcCxhLT50eXBlLFZfQVNOMV9VTklWRVJTQUwpCisjZGVmaW5lIE1fZDJpX0RJUkVDVE9SWVNUUklORyhhLHBwLGwpIFwKKwkJZDJpX0FTTjFfdHlwZV9ieXRlcygoQVNOMV9TVFJJTkcgKiopYSxwcCxsLCBcCisJCQlCX0FTTjFfRElSRUNUT1JZU1RSSU5HKQorCisjZGVmaW5lIE1fRElTUExBWVRFWFRfbmV3KCkgQVNOMV9TVFJJTkdfdHlwZV9uZXcoVl9BU04xX1ZJU0lCTEVTVFJJTkcpCisjZGVmaW5lIE1fRElTUExBWVRFWFRfZnJlZShhKSBBU04xX1NUUklOR19mcmVlKChBU04xX1NUUklORyAqKWEpCisjZGVmaW5lIE1faTJkX0RJU1BMQVlURVhUKGEscHApIGkyZF9BU04xX2J5dGVzKChBU04xX1NUUklORyAqKWEsXAorCQkJCQkJcHAsYS0+dHlwZSxWX0FTTjFfVU5JVkVSU0FMKQorI2RlZmluZSBNX2QyaV9ESVNQTEFZVEVYVChhLHBwLGwpIFwKKwkJZDJpX0FTTjFfdHlwZV9ieXRlcygoQVNOMV9TVFJJTkcgKiopYSxwcCxsLCBcCisJCQlCX0FTTjFfRElTUExBWVRFWFQpCisKKyNkZWZpbmUgTV9BU04xX1BSSU5UQUJMRVNUUklOR19uZXcoKSAoQVNOMV9QUklOVEFCTEVTVFJJTkcgKilcCisJCUFTTjFfU1RSSU5HX3R5cGVfbmV3KFZfQVNOMV9QUklOVEFCTEVTVFJJTkcpCisjZGVmaW5lIE1fQVNOMV9QUklOVEFCTEVTVFJJTkdfZnJlZShhKQlBU04xX1NUUklOR19mcmVlKChBU04xX1NUUklORyAqKWEpCisjZGVmaW5lIE1faTJkX0FTTjFfUFJJTlRBQkxFU1RSSU5HKGEscHApIFwKKwkJaTJkX0FTTjFfYnl0ZXMoKEFTTjFfU1RSSU5HICopYSxwcCxWX0FTTjFfUFJJTlRBQkxFU1RSSU5HLFwKKwkJVl9BU04xX1VOSVZFUlNBTCkKKyNkZWZpbmUgTV9kMmlfQVNOMV9QUklOVEFCTEVTVFJJTkcoYSxwcCxsKSBcCisJCShBU04xX1BSSU5UQUJMRVNUUklORyAqKWQyaV9BU04xX3R5cGVfYnl0ZXNcCisJCSgoQVNOMV9TVFJJTkcgKiopYSxwcCxsLEJfQVNOMV9QUklOVEFCTEVTVFJJTkcpCisKKyNkZWZpbmUgTV9BU04xX1Q2MVNUUklOR19uZXcoKQkoQVNOMV9UNjFTVFJJTkcgKilcCisJCUFTTjFfU1RSSU5HX3R5cGVfbmV3KFZfQVNOMV9UNjFTVFJJTkcpCisjZGVmaW5lIE1fQVNOMV9UNjFTVFJJTkdfZnJlZShhKQlBU04xX1NUUklOR19mcmVlKChBU04xX1NUUklORyAqKWEpCisjZGVmaW5lIE1faTJkX0FTTjFfVDYxU1RSSU5HKGEscHApIFwKKwkJaTJkX0FTTjFfYnl0ZXMoKEFTTjFfU1RSSU5HICopYSxwcCxWX0FTTjFfVDYxU1RSSU5HLFwKKwkJVl9BU04xX1VOSVZFUlNBTCkKKyNkZWZpbmUgTV9kMmlfQVNOMV9UNjFTVFJJTkcoYSxwcCxsKSBcCisJCShBU04xX1Q2MVNUUklORyAqKWQyaV9BU04xX3R5cGVfYnl0ZXNcCisJCSgoQVNOMV9TVFJJTkcgKiopYSxwcCxsLEJfQVNOMV9UNjFTVFJJTkcpCisKKyNkZWZpbmUgTV9BU04xX0lBNVNUUklOR19uZXcoKQkoQVNOMV9JQTVTVFJJTkcgKilcCisJCUFTTjFfU1RSSU5HX3R5cGVfbmV3KFZfQVNOMV9JQTVTVFJJTkcpCisjZGVmaW5lIE1fQVNOMV9JQTVTVFJJTkdfZnJlZShhKQlBU04xX1NUUklOR19mcmVlKChBU04xX1NUUklORyAqKWEpCisjZGVmaW5lIE1fQVNOMV9JQTVTVFJJTkdfZHVwKGEpCVwKKwkJKEFTTjFfSUE1U1RSSU5HICopQVNOMV9TVFJJTkdfZHVwKChjb25zdCBBU04xX1NUUklORyAqKWEpCisjZGVmaW5lIE1faTJkX0FTTjFfSUE1U1RSSU5HKGEscHApIFwKKwkJaTJkX0FTTjFfYnl0ZXMoKEFTTjFfU1RSSU5HICopYSxwcCxWX0FTTjFfSUE1U1RSSU5HLFwKKwkJCVZfQVNOMV9VTklWRVJTQUwpCisjZGVmaW5lIE1fZDJpX0FTTjFfSUE1U1RSSU5HKGEscHAsbCkgXAorCQkoQVNOMV9JQTVTVFJJTkcgKilkMmlfQVNOMV90eXBlX2J5dGVzKChBU04xX1NUUklORyAqKilhLHBwLGwsXAorCQkJQl9BU04xX0lBNVNUUklORykKKworI2RlZmluZSBNX0FTTjFfVVRDVElNRV9uZXcoKQkoQVNOMV9VVENUSU1FICopXAorCQlBU04xX1NUUklOR190eXBlX25ldyhWX0FTTjFfVVRDVElNRSkKKyNkZWZpbmUgTV9BU04xX1VUQ1RJTUVfZnJlZShhKQlBU04xX1NUUklOR19mcmVlKChBU04xX1NUUklORyAqKWEpCisjZGVmaW5lIE1fQVNOMV9VVENUSU1FX2R1cChhKSAoQVNOMV9VVENUSU1FICopXAorCQlBU04xX1NUUklOR19kdXAoKGNvbnN0IEFTTjFfU1RSSU5HICopYSkKKworI2RlZmluZSBNX0FTTjFfR0VORVJBTElaRURUSU1FX25ldygpCShBU04xX0dFTkVSQUxJWkVEVElNRSAqKVwKKwkJQVNOMV9TVFJJTkdfdHlwZV9uZXcoVl9BU04xX0dFTkVSQUxJWkVEVElNRSkKKyNkZWZpbmUgTV9BU04xX0dFTkVSQUxJWkVEVElNRV9mcmVlKGEpCUFTTjFfU1RSSU5HX2ZyZWUoKEFTTjFfU1RSSU5HICopYSkKKyNkZWZpbmUgTV9BU04xX0dFTkVSQUxJWkVEVElNRV9kdXAoYSkgKEFTTjFfR0VORVJBTElaRURUSU1FICopQVNOMV9TVFJJTkdfZHVwKFwKKwkoY29uc3QgQVNOMV9TVFJJTkcgKilhKQorCisjZGVmaW5lIE1fQVNOMV9USU1FX25ldygpCShBU04xX1RJTUUgKilcCisJCUFTTjFfU1RSSU5HX3R5cGVfbmV3KFZfQVNOMV9VVENUSU1FKQorI2RlZmluZSBNX0FTTjFfVElNRV9mcmVlKGEpCUFTTjFfU1RSSU5HX2ZyZWUoKEFTTjFfU1RSSU5HICopYSkKKyNkZWZpbmUgTV9BU04xX1RJTUVfZHVwKGEpIChBU04xX1RJTUUgKilcCisJQVNOMV9TVFJJTkdfZHVwKChjb25zdCBBU04xX1NUUklORyAqKWEpCisKKyNkZWZpbmUgTV9BU04xX0dFTkVSQUxTVFJJTkdfbmV3KCkJKEFTTjFfR0VORVJBTFNUUklORyAqKVwKKwkJQVNOMV9TVFJJTkdfdHlwZV9uZXcoVl9BU04xX0dFTkVSQUxTVFJJTkcpCisjZGVmaW5lIE1fQVNOMV9HRU5FUkFMU1RSSU5HX2ZyZWUoYSkJQVNOMV9TVFJJTkdfZnJlZSgoQVNOMV9TVFJJTkcgKilhKQorI2RlZmluZSBNX2kyZF9BU04xX0dFTkVSQUxTVFJJTkcoYSxwcCkgXAorCQlpMmRfQVNOMV9ieXRlcygoQVNOMV9TVFJJTkcgKilhLHBwLFZfQVNOMV9HRU5FUkFMU1RSSU5HLFwKKwkJCVZfQVNOMV9VTklWRVJTQUwpCisjZGVmaW5lIE1fZDJpX0FTTjFfR0VORVJBTFNUUklORyhhLHBwLGwpIFwKKwkJKEFTTjFfR0VORVJBTFNUUklORyAqKWQyaV9BU04xX3R5cGVfYnl0ZXNcCisJCSgoQVNOMV9TVFJJTkcgKiopYSxwcCxsLEJfQVNOMV9HRU5FUkFMU1RSSU5HKQorCisjZGVmaW5lIE1fQVNOMV9VTklWRVJTQUxTVFJJTkdfbmV3KCkJKEFTTjFfVU5JVkVSU0FMU1RSSU5HICopXAorCQlBU04xX1NUUklOR190eXBlX25ldyhWX0FTTjFfVU5JVkVSU0FMU1RSSU5HKQorI2RlZmluZSBNX0FTTjFfVU5JVkVSU0FMU1RSSU5HX2ZyZWUoYSkJQVNOMV9TVFJJTkdfZnJlZSgoQVNOMV9TVFJJTkcgKilhKQorI2RlZmluZSBNX2kyZF9BU04xX1VOSVZFUlNBTFNUUklORyhhLHBwKSBcCisJCWkyZF9BU04xX2J5dGVzKChBU04xX1NUUklORyAqKWEscHAsVl9BU04xX1VOSVZFUlNBTFNUUklORyxcCisJCQlWX0FTTjFfVU5JVkVSU0FMKQorI2RlZmluZSBNX2QyaV9BU04xX1VOSVZFUlNBTFNUUklORyhhLHBwLGwpIFwKKwkJKEFTTjFfVU5JVkVSU0FMU1RSSU5HICopZDJpX0FTTjFfdHlwZV9ieXRlc1wKKwkJKChBU04xX1NUUklORyAqKilhLHBwLGwsQl9BU04xX1VOSVZFUlNBTFNUUklORykKKworI2RlZmluZSBNX0FTTjFfQk1QU1RSSU5HX25ldygpCShBU04xX0JNUFNUUklORyAqKVwKKwkJQVNOMV9TVFJJTkdfdHlwZV9uZXcoVl9BU04xX0JNUFNUUklORykKKyNkZWZpbmUgTV9BU04xX0JNUFNUUklOR19mcmVlKGEpCUFTTjFfU1RSSU5HX2ZyZWUoKEFTTjFfU1RSSU5HICopYSkKKyNkZWZpbmUgTV9pMmRfQVNOMV9CTVBTVFJJTkcoYSxwcCkgXAorCQlpMmRfQVNOMV9ieXRlcygoQVNOMV9TVFJJTkcgKilhLHBwLFZfQVNOMV9CTVBTVFJJTkcsXAorCQkJVl9BU04xX1VOSVZFUlNBTCkKKyNkZWZpbmUgTV9kMmlfQVNOMV9CTVBTVFJJTkcoYSxwcCxsKSBcCisJCShBU04xX0JNUFNUUklORyAqKWQyaV9BU04xX3R5cGVfYnl0ZXNcCisJCSgoQVNOMV9TVFJJTkcgKiopYSxwcCxsLEJfQVNOMV9CTVBTVFJJTkcpCisKKyNkZWZpbmUgTV9BU04xX1ZJU0lCTEVTVFJJTkdfbmV3KCkJKEFTTjFfVklTSUJMRVNUUklORyAqKVwKKwkJQVNOMV9TVFJJTkdfdHlwZV9uZXcoVl9BU04xX1ZJU0lCTEVTVFJJTkcpCisjZGVmaW5lIE1fQVNOMV9WSVNJQkxFU1RSSU5HX2ZyZWUoYSkJQVNOMV9TVFJJTkdfZnJlZSgoQVNOMV9TVFJJTkcgKilhKQorI2RlZmluZSBNX2kyZF9BU04xX1ZJU0lCTEVTVFJJTkcoYSxwcCkgXAorCQlpMmRfQVNOMV9ieXRlcygoQVNOMV9TVFJJTkcgKilhLHBwLFZfQVNOMV9WSVNJQkxFU1RSSU5HLFwKKwkJCVZfQVNOMV9VTklWRVJTQUwpCisjZGVmaW5lIE1fZDJpX0FTTjFfVklTSUJMRVNUUklORyhhLHBwLGwpIFwKKwkJKEFTTjFfVklTSUJMRVNUUklORyAqKWQyaV9BU04xX3R5cGVfYnl0ZXNcCisJCSgoQVNOMV9TVFJJTkcgKiopYSxwcCxsLEJfQVNOMV9WSVNJQkxFU1RSSU5HKQorCisjZGVmaW5lIE1fQVNOMV9VVEY4U1RSSU5HX25ldygpCShBU04xX1VURjhTVFJJTkcgKilcCisJCUFTTjFfU1RSSU5HX3R5cGVfbmV3KFZfQVNOMV9VVEY4U1RSSU5HKQorI2RlZmluZSBNX0FTTjFfVVRGOFNUUklOR19mcmVlKGEpCUFTTjFfU1RSSU5HX2ZyZWUoKEFTTjFfU1RSSU5HICopYSkKKyNkZWZpbmUgTV9pMmRfQVNOMV9VVEY4U1RSSU5HKGEscHApIFwKKwkJaTJkX0FTTjFfYnl0ZXMoKEFTTjFfU1RSSU5HICopYSxwcCxWX0FTTjFfVVRGOFNUUklORyxcCisJCQlWX0FTTjFfVU5JVkVSU0FMKQorI2RlZmluZSBNX2QyaV9BU04xX1VURjhTVFJJTkcoYSxwcCxsKSBcCisJCShBU04xX1VURjhTVFJJTkcgKilkMmlfQVNOMV90eXBlX2J5dGVzXAorCQkoKEFTTjFfU1RSSU5HICoqKWEscHAsbCxCX0FTTjFfVVRGOFNUUklORykKKworICAvKiBmb3IgdGhlIGlzX3NldCBwYXJhbWV0ZXIgdG8gaTJkX0FTTjFfU0VUICovCisjZGVmaW5lIElTX1NFUVVFTkNFCTAKKyNkZWZpbmUgSVNfU0VUCQkxCisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlNfZm5hbWUoQVNOMV9UWVBFLCBBU04xX0FOWSwgQVNOMV9UWVBFKQorCitpbnQgQVNOMV9UWVBFX2dldChBU04xX1RZUEUgKmEpOwordm9pZCBBU04xX1RZUEVfc2V0KEFTTjFfVFlQRSAqYSwgaW50IHR5cGUsIHZvaWQgKnZhbHVlKTsKK2ludCBBU04xX1RZUEVfc2V0MShBU04xX1RZUEUgKmEsIGludCB0eXBlLCBjb25zdCB2b2lkICp2YWx1ZSk7CitpbnQgICAgICAgICAgICBBU04xX1RZUEVfY21wKEFTTjFfVFlQRSAqYSwgQVNOMV9UWVBFICpiKTsKKworQVNOMV9PQkpFQ1QgKglBU04xX09CSkVDVF9uZXcodm9pZCApOwordm9pZAkJQVNOMV9PQkpFQ1RfZnJlZShBU04xX09CSkVDVCAqYSk7CitpbnQJCWkyZF9BU04xX09CSkVDVChBU04xX09CSkVDVCAqYSx1bnNpZ25lZCBjaGFyICoqcHApOworQVNOMV9PQkpFQ1QgKgljMmlfQVNOMV9PQkpFQ1QoQVNOMV9PQkpFQ1QgKiphLGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwKKwkJCWxvbmcgbGVuZ3RoKTsKK0FTTjFfT0JKRUNUICoJZDJpX0FTTjFfT0JKRUNUKEFTTjFfT0JKRUNUICoqYSxjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsCisJCQlsb25nIGxlbmd0aCk7CisKK0RFQ0xBUkVfQVNOMV9JVEVNKEFTTjFfT0JKRUNUKQorCitERUNMQVJFX0FTTjFfU0VUX09GKEFTTjFfT0JKRUNUKQorCitBU04xX1NUUklORyAqCUFTTjFfU1RSSU5HX25ldyh2b2lkKTsKK3ZvaWQJCUFTTjFfU1RSSU5HX2ZyZWUoQVNOMV9TVFJJTkcgKmEpOworaW50CQlBU04xX1NUUklOR19jb3B5KEFTTjFfU1RSSU5HICpkc3QsIGNvbnN0IEFTTjFfU1RSSU5HICpzdHIpOworQVNOMV9TVFJJTkcgKglBU04xX1NUUklOR19kdXAoY29uc3QgQVNOMV9TVFJJTkcgKmEpOworQVNOMV9TVFJJTkcgKglBU04xX1NUUklOR190eXBlX25ldyhpbnQgdHlwZSApOworaW50IAkJQVNOMV9TVFJJTkdfY21wKGNvbnN0IEFTTjFfU1RSSU5HICphLCBjb25zdCBBU04xX1NUUklORyAqYik7CisgIC8qIFNpbmNlIHRoaXMgaXMgdXNlZCB0byBzdG9yZSBhbGwgc29ydHMgb2YgdGhpbmdzLCB2aWEgbWFjcm9zLCBmb3Igbm93LCBtYWtlCisgICAgIGl0cyBkYXRhIHZvaWQgKiAqLworaW50IAkJQVNOMV9TVFJJTkdfc2V0KEFTTjFfU1RSSU5HICpzdHIsIGNvbnN0IHZvaWQgKmRhdGEsIGludCBsZW4pOwordm9pZAkJQVNOMV9TVFJJTkdfc2V0MChBU04xX1NUUklORyAqc3RyLCB2b2lkICpkYXRhLCBpbnQgbGVuKTsKK2ludCBBU04xX1NUUklOR19sZW5ndGgoY29uc3QgQVNOMV9TVFJJTkcgKngpOwordm9pZCBBU04xX1NUUklOR19sZW5ndGhfc2V0KEFTTjFfU1RSSU5HICp4LCBpbnQgbik7CitpbnQgQVNOMV9TVFJJTkdfdHlwZShBU04xX1NUUklORyAqeCk7Cit1bnNpZ25lZCBjaGFyICogQVNOMV9TVFJJTkdfZGF0YShBU04xX1NUUklORyAqeCk7CisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoQVNOMV9CSVRfU1RSSU5HKQoraW50CQlpMmNfQVNOMV9CSVRfU1RSSU5HKEFTTjFfQklUX1NUUklORyAqYSx1bnNpZ25lZCBjaGFyICoqcHApOworQVNOMV9CSVRfU1RSSU5HICpjMmlfQVNOMV9CSVRfU1RSSU5HKEFTTjFfQklUX1NUUklORyAqKmEsY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLAorCQkJbG9uZyBsZW5ndGgpOworaW50CQlBU04xX0JJVF9TVFJJTkdfc2V0KEFTTjFfQklUX1NUUklORyAqYSwgdW5zaWduZWQgY2hhciAqZCwKKwkJCWludCBsZW5ndGggKTsKK2ludAkJQVNOMV9CSVRfU1RSSU5HX3NldF9iaXQoQVNOMV9CSVRfU1RSSU5HICphLCBpbnQgbiwgaW50IHZhbHVlKTsKK2ludAkJQVNOMV9CSVRfU1RSSU5HX2dldF9iaXQoQVNOMV9CSVRfU1RSSU5HICphLCBpbnQgbik7CitpbnQgICAgICAgICAgICBBU04xX0JJVF9TVFJJTkdfY2hlY2soQVNOMV9CSVRfU1RSSU5HICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmZsYWdzLCBpbnQgZmxhZ3NfbGVuKTsKKworI2lmbmRlZiBPUEVOU1NMX05PX0JJTworaW50IEFTTjFfQklUX1NUUklOR19uYW1lX3ByaW50KEJJTyAqb3V0LCBBU04xX0JJVF9TVFJJTkcgKmJzLAorCQkJCUJJVF9TVFJJTkdfQklUTkFNRSAqdGJsLCBpbnQgaW5kZW50KTsKKyNlbmRpZgoraW50IEFTTjFfQklUX1NUUklOR19udW1fYXNjKGNoYXIgKm5hbWUsIEJJVF9TVFJJTkdfQklUTkFNRSAqdGJsKTsKK2ludCBBU04xX0JJVF9TVFJJTkdfc2V0X2FzYyhBU04xX0JJVF9TVFJJTkcgKmJzLCBjaGFyICpuYW1lLCBpbnQgdmFsdWUsCisJCQkJQklUX1NUUklOR19CSVROQU1FICp0YmwpOworCitpbnQJCWkyZF9BU04xX0JPT0xFQU4oaW50IGEsdW5zaWduZWQgY2hhciAqKnBwKTsKK2ludCAJCWQyaV9BU04xX0JPT0xFQU4oaW50ICphLGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCxsb25nIGxlbmd0aCk7CisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoQVNOMV9JTlRFR0VSKQoraW50CQlpMmNfQVNOMV9JTlRFR0VSKEFTTjFfSU5URUdFUiAqYSx1bnNpZ25lZCBjaGFyICoqcHApOworQVNOMV9JTlRFR0VSICpjMmlfQVNOMV9JTlRFR0VSKEFTTjFfSU5URUdFUiAqKmEsY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLAorCQkJbG9uZyBsZW5ndGgpOworQVNOMV9JTlRFR0VSICpkMmlfQVNOMV9VSU5URUdFUihBU04xX0lOVEVHRVIgKiphLGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwKKwkJCWxvbmcgbGVuZ3RoKTsKK0FTTjFfSU5URUdFUiAqCUFTTjFfSU5URUdFUl9kdXAoY29uc3QgQVNOMV9JTlRFR0VSICp4KTsKK2ludCBBU04xX0lOVEVHRVJfY21wKGNvbnN0IEFTTjFfSU5URUdFUiAqeCwgY29uc3QgQVNOMV9JTlRFR0VSICp5KTsKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhBU04xX0VOVU1FUkFURUQpCisKK2ludCBBU04xX1VUQ1RJTUVfY2hlY2soY29uc3QgQVNOMV9VVENUSU1FICphKTsKK0FTTjFfVVRDVElNRSAqQVNOMV9VVENUSU1FX3NldChBU04xX1VUQ1RJTUUgKnMsdGltZV90IHQpOworQVNOMV9VVENUSU1FICpBU04xX1VUQ1RJTUVfYWRqKEFTTjFfVVRDVElNRSAqcywgdGltZV90IHQsCisJCQkJaW50IG9mZnNldF9kYXksIGxvbmcgb2Zmc2V0X3NlYyk7CitpbnQgQVNOMV9VVENUSU1FX3NldF9zdHJpbmcoQVNOMV9VVENUSU1FICpzLCBjb25zdCBjaGFyICpzdHIpOworaW50IEFTTjFfVVRDVElNRV9jbXBfdGltZV90KGNvbnN0IEFTTjFfVVRDVElNRSAqcywgdGltZV90IHQpOworI2lmIDAKK3RpbWVfdCBBU04xX1VUQ1RJTUVfZ2V0KGNvbnN0IEFTTjFfVVRDVElNRSAqcyk7CisjZW5kaWYKKworaW50IEFTTjFfR0VORVJBTElaRURUSU1FX2NoZWNrKGNvbnN0IEFTTjFfR0VORVJBTElaRURUSU1FICphKTsKK0FTTjFfR0VORVJBTElaRURUSU1FICpBU04xX0dFTkVSQUxJWkVEVElNRV9zZXQoQVNOMV9HRU5FUkFMSVpFRFRJTUUgKnMsdGltZV90IHQpOworQVNOMV9HRU5FUkFMSVpFRFRJTUUgKkFTTjFfR0VORVJBTElaRURUSU1FX2FkaihBU04xX0dFTkVSQUxJWkVEVElNRSAqcywKKwkgICAgIHRpbWVfdCB0LCBpbnQgb2Zmc2V0X2RheSwgbG9uZyBvZmZzZXRfc2VjKTsKK2ludCBBU04xX0dFTkVSQUxJWkVEVElNRV9zZXRfc3RyaW5nKEFTTjFfR0VORVJBTElaRURUSU1FICpzLCBjb25zdCBjaGFyICpzdHIpOworaW50IEFTTjFfVElNRV9kaWZmKGludCAqcGRheSwgaW50ICpwc2VjLAorCQkJY29uc3QgQVNOMV9USU1FICpmcm9tLCBjb25zdCBBU04xX1RJTUUgKnRvKTsKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhBU04xX09DVEVUX1NUUklORykKK0FTTjFfT0NURVRfU1RSSU5HICoJQVNOMV9PQ1RFVF9TVFJJTkdfZHVwKGNvbnN0IEFTTjFfT0NURVRfU1RSSU5HICphKTsKK2ludCAJQVNOMV9PQ1RFVF9TVFJJTkdfY21wKGNvbnN0IEFTTjFfT0NURVRfU1RSSU5HICphLCBjb25zdCBBU04xX09DVEVUX1NUUklORyAqYik7CitpbnQgCUFTTjFfT0NURVRfU1RSSU5HX3NldChBU04xX09DVEVUX1NUUklORyAqc3RyLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuKTsKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhBU04xX1ZJU0lCTEVTVFJJTkcpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEFTTjFfVU5JVkVSU0FMU1RSSU5HKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhBU04xX1VURjhTVFJJTkcpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEFTTjFfTlVMTCkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoQVNOMV9CTVBTVFJJTkcpCisKK2ludCBVVEY4X2dldGMoY29uc3QgdW5zaWduZWQgY2hhciAqc3RyLCBpbnQgbGVuLCB1bnNpZ25lZCBsb25nICp2YWwpOworaW50IFVURjhfcHV0Yyh1bnNpZ25lZCBjaGFyICpzdHIsIGludCBsZW4sIHVuc2lnbmVkIGxvbmcgdmFsdWUpOworCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TX25hbWUoQVNOMV9TVFJJTkcsIEFTTjFfUFJJTlRBQkxFKQorCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TX25hbWUoQVNOMV9TVFJJTkcsIERJUkVDVE9SWVNUUklORykKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlNfbmFtZShBU04xX1NUUklORywgRElTUExBWVRFWFQpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEFTTjFfUFJJTlRBQkxFU1RSSU5HKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhBU04xX1Q2MVNUUklORykKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoQVNOMV9JQTVTVFJJTkcpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEFTTjFfR0VORVJBTFNUUklORykKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoQVNOMV9VVENUSU1FKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhBU04xX0dFTkVSQUxJWkVEVElNRSkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoQVNOMV9USU1FKQorCitERUNMQVJFX0FTTjFfSVRFTShBU04xX09DVEVUX1NUUklOR19OREVGKQorCitBU04xX1RJTUUgKkFTTjFfVElNRV9zZXQoQVNOMV9USU1FICpzLHRpbWVfdCB0KTsKK0FTTjFfVElNRSAqQVNOMV9USU1FX2FkaihBU04xX1RJTUUgKnMsdGltZV90IHQsCisJCQkJaW50IG9mZnNldF9kYXksIGxvbmcgb2Zmc2V0X3NlYyk7CitpbnQgQVNOMV9USU1FX2NoZWNrKEFTTjFfVElNRSAqdCk7CitBU04xX0dFTkVSQUxJWkVEVElNRSAqQVNOMV9USU1FX3RvX2dlbmVyYWxpemVkdGltZShBU04xX1RJTUUgKnQsIEFTTjFfR0VORVJBTElaRURUSU1FICoqb3V0KTsKK2ludCBBU04xX1RJTUVfc2V0X3N0cmluZyhBU04xX1RJTUUgKnMsIGNvbnN0IGNoYXIgKnN0cik7CisKK2ludCBpMmRfQVNOMV9TRVQoU1RBQ0tfT0YoT1BFTlNTTF9CTE9DSykgKmEsIHVuc2lnbmVkIGNoYXIgKipwcCwKKwkJIGkyZF9vZl92b2lkICppMmQsIGludCBleF90YWcsIGludCBleF9jbGFzcywKKwkJIGludCBpc19zZXQpOworU1RBQ0tfT0YoT1BFTlNTTF9CTE9DSykgKmQyaV9BU04xX1NFVChTVEFDS19PRihPUEVOU1NMX0JMT0NLKSAqKmEsCisJCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsCisJCQkgICAgICBsb25nIGxlbmd0aCwgZDJpX29mX3ZvaWQgKmQyaSwKKwkJCSAgICAgIHZvaWQgKCpmcmVlX2Z1bmMpKE9QRU5TU0xfQkxPQ0spLCBpbnQgZXhfdGFnLAorCQkJICAgICAgaW50IGV4X2NsYXNzKTsKKworI2lmbmRlZiBPUEVOU1NMX05PX0JJTworaW50IGkyYV9BU04xX0lOVEVHRVIoQklPICpicCwgQVNOMV9JTlRFR0VSICphKTsKK2ludCBhMmlfQVNOMV9JTlRFR0VSKEJJTyAqYnAsQVNOMV9JTlRFR0VSICpicyxjaGFyICpidWYsaW50IHNpemUpOworaW50IGkyYV9BU04xX0VOVU1FUkFURUQoQklPICpicCwgQVNOMV9FTlVNRVJBVEVEICphKTsKK2ludCBhMmlfQVNOMV9FTlVNRVJBVEVEKEJJTyAqYnAsQVNOMV9FTlVNRVJBVEVEICpicyxjaGFyICpidWYsaW50IHNpemUpOworaW50IGkyYV9BU04xX09CSkVDVChCSU8gKmJwLEFTTjFfT0JKRUNUICphKTsKK2ludCBhMmlfQVNOMV9TVFJJTkcoQklPICpicCxBU04xX1NUUklORyAqYnMsY2hhciAqYnVmLGludCBzaXplKTsKK2ludCBpMmFfQVNOMV9TVFJJTkcoQklPICpicCwgQVNOMV9TVFJJTkcgKmEsIGludCB0eXBlKTsKKyNlbmRpZgoraW50IGkydF9BU04xX09CSkVDVChjaGFyICpidWYsaW50IGJ1Zl9sZW4sQVNOMV9PQkpFQ1QgKmEpOworCitpbnQgYTJkX0FTTjFfT0JKRUNUKHVuc2lnbmVkIGNoYXIgKm91dCxpbnQgb2xlbiwgY29uc3QgY2hhciAqYnVmLCBpbnQgbnVtKTsKK0FTTjFfT0JKRUNUICpBU04xX09CSkVDVF9jcmVhdGUoaW50IG5pZCwgdW5zaWduZWQgY2hhciAqZGF0YSxpbnQgbGVuLAorCWNvbnN0IGNoYXIgKnNuLCBjb25zdCBjaGFyICpsbik7CisKK2ludCBBU04xX0lOVEVHRVJfc2V0KEFTTjFfSU5URUdFUiAqYSwgbG9uZyB2KTsKK2xvbmcgQVNOMV9JTlRFR0VSX2dldChjb25zdCBBU04xX0lOVEVHRVIgKmEpOworQVNOMV9JTlRFR0VSICpCTl90b19BU04xX0lOVEVHRVIoY29uc3QgQklHTlVNICpibiwgQVNOMV9JTlRFR0VSICphaSk7CitCSUdOVU0gKkFTTjFfSU5URUdFUl90b19CTihjb25zdCBBU04xX0lOVEVHRVIgKmFpLEJJR05VTSAqYm4pOworCitpbnQgQVNOMV9FTlVNRVJBVEVEX3NldChBU04xX0VOVU1FUkFURUQgKmEsIGxvbmcgdik7Citsb25nIEFTTjFfRU5VTUVSQVRFRF9nZXQoQVNOMV9FTlVNRVJBVEVEICphKTsKK0FTTjFfRU5VTUVSQVRFRCAqQk5fdG9fQVNOMV9FTlVNRVJBVEVEKEJJR05VTSAqYm4sIEFTTjFfRU5VTUVSQVRFRCAqYWkpOworQklHTlVNICpBU04xX0VOVU1FUkFURURfdG9fQk4oQVNOMV9FTlVNRVJBVEVEICphaSxCSUdOVU0gKmJuKTsKKworLyogR2VuZXJhbCAqLworLyogZ2l2ZW4gYSBzdHJpbmcsIHJldHVybiB0aGUgY29ycmVjdCB0eXBlLCBtYXggaXMgdGhlIG1heGltdW0gbGVuZ3RoICovCitpbnQgQVNOMV9QUklOVEFCTEVfdHlwZShjb25zdCB1bnNpZ25lZCBjaGFyICpzLCBpbnQgbWF4KTsKKworaW50IGkyZF9BU04xX2J5dGVzKEFTTjFfU1RSSU5HICphLCB1bnNpZ25lZCBjaGFyICoqcHAsIGludCB0YWcsIGludCB4Y2xhc3MpOworQVNOMV9TVFJJTkcgKmQyaV9BU04xX2J5dGVzKEFTTjFfU1RSSU5HICoqYSwgY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLAorCWxvbmcgbGVuZ3RoLCBpbnQgUHRhZywgaW50IFBjbGFzcyk7Cit1bnNpZ25lZCBsb25nIEFTTjFfdGFnMmJpdChpbnQgdGFnKTsKKy8qIHR5cGUgaXMgb25lIG9yIG1vcmUgb2YgdGhlIEJfQVNOMV8gdmFsdWVzLiAqLworQVNOMV9TVFJJTkcgKmQyaV9BU04xX3R5cGVfYnl0ZXMoQVNOMV9TVFJJTkcgKiphLGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwKKwkJbG9uZyBsZW5ndGgsaW50IHR5cGUpOworCisvKiBQQVJTSU5HICovCitpbnQgYXNuMV9GaW5pc2goQVNOMV9DVFggKmMpOworaW50IGFzbjFfY29uc3RfRmluaXNoKEFTTjFfY29uc3RfQ1RYICpjKTsKKworLyogU1BFQ0lBTFMgKi8KK2ludCBBU04xX2dldF9vYmplY3QoY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLCBsb25nICpwbGVuZ3RoLCBpbnQgKnB0YWcsCisJaW50ICpwY2xhc3MsIGxvbmcgb21heCk7CitpbnQgQVNOMV9jaGVja19pbmZpbml0ZV9lbmQodW5zaWduZWQgY2hhciAqKnAsbG9uZyBsZW4pOworaW50IEFTTjFfY29uc3RfY2hlY2tfaW5maW5pdGVfZW5kKGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwLGxvbmcgbGVuKTsKK3ZvaWQgQVNOMV9wdXRfb2JqZWN0KHVuc2lnbmVkIGNoYXIgKipwcCwgaW50IGNvbnN0cnVjdGVkLCBpbnQgbGVuZ3RoLAorCWludCB0YWcsIGludCB4Y2xhc3MpOworaW50IEFTTjFfcHV0X2VvYyh1bnNpZ25lZCBjaGFyICoqcHApOworaW50IEFTTjFfb2JqZWN0X3NpemUoaW50IGNvbnN0cnVjdGVkLCBpbnQgbGVuZ3RoLCBpbnQgdGFnKTsKKworLyogVXNlZCB0byBpbXBsZW1lbnQgb3RoZXIgZnVuY3Rpb25zICovCit2b2lkICpBU04xX2R1cChpMmRfb2Zfdm9pZCAqaTJkLCBkMmlfb2Zfdm9pZCAqZDJpLCB2b2lkICp4KTsKKworI2RlZmluZSBBU04xX2R1cF9vZih0eXBlLGkyZCxkMmkseCkgXAorICAgICgodHlwZSopQVNOMV9kdXAoQ0hFQ0tFRF9JMkRfT0YodHlwZSwgaTJkKSwgXAorCQkgICAgIENIRUNLRURfRDJJX09GKHR5cGUsIGQyaSksIFwKKwkJICAgICBDSEVDS0VEX1BUUl9PRih0eXBlLCB4KSkpCisKKyNkZWZpbmUgQVNOMV9kdXBfb2ZfY29uc3QodHlwZSxpMmQsZDJpLHgpIFwKKyAgICAoKHR5cGUqKUFTTjFfZHVwKENIRUNLRURfSTJEX09GKGNvbnN0IHR5cGUsIGkyZCksIFwKKwkJICAgICBDSEVDS0VEX0QySV9PRih0eXBlLCBkMmkpLCBcCisJCSAgICAgQ0hFQ0tFRF9QVFJfT0YoY29uc3QgdHlwZSwgeCkpKQorCit2b2lkICpBU04xX2l0ZW1fZHVwKGNvbnN0IEFTTjFfSVRFTSAqaXQsIHZvaWQgKngpOworCisvKiBBU04xIGFsbG9jL2ZyZWUgbWFjcm9zIGZvciB3aGVuIGEgdHlwZSBpcyBvbmx5IHVzZWQgaW50ZXJuYWxseSAqLworCisjZGVmaW5lIE1fQVNOMV9uZXdfb2YodHlwZSkgKHR5cGUgKilBU04xX2l0ZW1fbmV3KEFTTjFfSVRFTV9ycHRyKHR5cGUpKQorI2RlZmluZSBNX0FTTjFfZnJlZV9vZih4LCB0eXBlKSBcCisJCUFTTjFfaXRlbV9mcmVlKENIRUNLRURfUFRSX09GKHR5cGUsIHgpLCBBU04xX0lURU1fcnB0cih0eXBlKSkKKworI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQordm9pZCAqQVNOMV9kMmlfZnAodm9pZCAqKCp4bmV3KSh2b2lkKSwgZDJpX29mX3ZvaWQgKmQyaSwgRklMRSAqaW4sIHZvaWQgKip4KTsKKworI2RlZmluZSBBU04xX2QyaV9mcF9vZih0eXBlLHhuZXcsZDJpLGluLHgpIFwKKyAgICAoKHR5cGUqKUFTTjFfZDJpX2ZwKENIRUNLRURfTkVXX09GKHR5cGUsIHhuZXcpLCBcCisJCQlDSEVDS0VEX0QySV9PRih0eXBlLCBkMmkpLCBcCisJCQlpbiwgXAorCQkJQ0hFQ0tFRF9QUFRSX09GKHR5cGUsIHgpKSkKKwordm9pZCAqQVNOMV9pdGVtX2QyaV9mcChjb25zdCBBU04xX0lURU0gKml0LCBGSUxFICppbiwgdm9pZCAqeCk7CitpbnQgQVNOMV9pMmRfZnAoaTJkX29mX3ZvaWQgKmkyZCxGSUxFICpvdXQsdm9pZCAqeCk7CisKKyNkZWZpbmUgQVNOMV9pMmRfZnBfb2YodHlwZSxpMmQsb3V0LHgpIFwKKyAgICAoQVNOMV9pMmRfZnAoQ0hFQ0tFRF9JMkRfT0YodHlwZSwgaTJkKSwgXAorCQkgb3V0LCBcCisJCSBDSEVDS0VEX1BUUl9PRih0eXBlLCB4KSkpCisKKyNkZWZpbmUgQVNOMV9pMmRfZnBfb2ZfY29uc3QodHlwZSxpMmQsb3V0LHgpIFwKKyAgICAoQVNOMV9pMmRfZnAoQ0hFQ0tFRF9JMkRfT0YoY29uc3QgdHlwZSwgaTJkKSwgXAorCQkgb3V0LCBcCisJCSBDSEVDS0VEX1BUUl9PRihjb25zdCB0eXBlLCB4KSkpCisKK2ludCBBU04xX2l0ZW1faTJkX2ZwKGNvbnN0IEFTTjFfSVRFTSAqaXQsIEZJTEUgKm91dCwgdm9pZCAqeCk7CitpbnQgQVNOMV9TVFJJTkdfcHJpbnRfZXhfZnAoRklMRSAqZnAsIEFTTjFfU1RSSU5HICpzdHIsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworI2VuZGlmCisKK2ludCBBU04xX1NUUklOR190b19VVEY4KHVuc2lnbmVkIGNoYXIgKipvdXQsIEFTTjFfU1RSSU5HICppbik7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19CSU8KK3ZvaWQgKkFTTjFfZDJpX2Jpbyh2b2lkICooKnhuZXcpKHZvaWQpLCBkMmlfb2Zfdm9pZCAqZDJpLCBCSU8gKmluLCB2b2lkICoqeCk7CisKKyNkZWZpbmUgQVNOMV9kMmlfYmlvX29mKHR5cGUseG5ldyxkMmksaW4seCkgXAorICAgICgodHlwZSopQVNOMV9kMmlfYmlvKCBDSEVDS0VEX05FV19PRih0eXBlLCB4bmV3KSwgXAorCQkJICBDSEVDS0VEX0QySV9PRih0eXBlLCBkMmkpLCBcCisJCQkgIGluLCBcCisJCQkgIENIRUNLRURfUFBUUl9PRih0eXBlLCB4KSkpCisKK3ZvaWQgKkFTTjFfaXRlbV9kMmlfYmlvKGNvbnN0IEFTTjFfSVRFTSAqaXQsIEJJTyAqaW4sIHZvaWQgKngpOworaW50IEFTTjFfaTJkX2JpbyhpMmRfb2Zfdm9pZCAqaTJkLEJJTyAqb3V0LCB1bnNpZ25lZCBjaGFyICp4KTsKKworI2RlZmluZSBBU04xX2kyZF9iaW9fb2YodHlwZSxpMmQsb3V0LHgpIFwKKyAgICAoQVNOMV9pMmRfYmlvKENIRUNLRURfSTJEX09GKHR5cGUsIGkyZCksIFwKKwkJICBvdXQsIFwKKwkJICBDSEVDS0VEX1BUUl9PRih0eXBlLCB4KSkpCisKKyNkZWZpbmUgQVNOMV9pMmRfYmlvX29mX2NvbnN0KHR5cGUsaTJkLG91dCx4KSBcCisgICAgKEFTTjFfaTJkX2JpbyhDSEVDS0VEX0kyRF9PRihjb25zdCB0eXBlLCBpMmQpLCBcCisJCSAgb3V0LCBcCisJCSAgQ0hFQ0tFRF9QVFJfT0YoY29uc3QgdHlwZSwgeCkpKQorCitpbnQgQVNOMV9pdGVtX2kyZF9iaW8oY29uc3QgQVNOMV9JVEVNICppdCwgQklPICpvdXQsIHZvaWQgKngpOworaW50IEFTTjFfVVRDVElNRV9wcmludChCSU8gKmZwLCBjb25zdCBBU04xX1VUQ1RJTUUgKmEpOworaW50IEFTTjFfR0VORVJBTElaRURUSU1FX3ByaW50KEJJTyAqZnAsIGNvbnN0IEFTTjFfR0VORVJBTElaRURUSU1FICphKTsKK2ludCBBU04xX1RJTUVfcHJpbnQoQklPICpmcCwgY29uc3QgQVNOMV9USU1FICphKTsKK2ludCBBU04xX1NUUklOR19wcmludChCSU8gKmJwLCBjb25zdCBBU04xX1NUUklORyAqdik7CitpbnQgQVNOMV9TVFJJTkdfcHJpbnRfZXgoQklPICpvdXQsIEFTTjFfU1RSSU5HICpzdHIsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworaW50IEFTTjFfYm5fcHJpbnQoQklPICpicCwgY29uc3QgY2hhciAqbnVtYmVyLCBjb25zdCBCSUdOVU0gKm51bSwKKwkJCQl1bnNpZ25lZCBjaGFyICpidWYsIGludCBvZmYpOworaW50IEFTTjFfcGFyc2UoQklPICpicCxjb25zdCB1bnNpZ25lZCBjaGFyICpwcCxsb25nIGxlbixpbnQgaW5kZW50KTsKK2ludCBBU04xX3BhcnNlX2R1bXAoQklPICpicCxjb25zdCB1bnNpZ25lZCBjaGFyICpwcCxsb25nIGxlbixpbnQgaW5kZW50LGludCBkdW1wKTsKKyNlbmRpZgorY29uc3QgY2hhciAqQVNOMV90YWcyc3RyKGludCB0YWcpOworCisvKiBVc2VkIHRvIGxvYWQgYW5kIHdyaXRlIG5ldHNjYXBlIGZvcm1hdCBjZXJ0ICovCisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoTkVUU0NBUEVfWDUwOSkKKworaW50IEFTTjFfVU5JVkVSU0FMU1RSSU5HX3RvX3N0cmluZyhBU04xX1VOSVZFUlNBTFNUUklORyAqcyk7CisKK1NUQUNLX09GKE9QRU5TU0xfQkxPQ0spICpBU04xX3NlcV91bnBhY2soY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuLAorCQkJCSBkMmlfb2Zfdm9pZCAqZDJpLCB2b2lkICgqZnJlZV9mdW5jKShPUEVOU1NMX0JMT0NLKSk7Cit1bnNpZ25lZCBjaGFyICpBU04xX3NlcV9wYWNrKFNUQUNLX09GKE9QRU5TU0xfQkxPQ0spICpzYWZlcywgaTJkX29mX3ZvaWQgKmkyZCwKKwkJCSAgICAgdW5zaWduZWQgY2hhciAqKmJ1ZiwgaW50ICpsZW4gKTsKK3ZvaWQgKkFTTjFfdW5wYWNrX3N0cmluZyhBU04xX1NUUklORyAqb2N0LCBkMmlfb2Zfdm9pZCAqZDJpKTsKK3ZvaWQgKkFTTjFfaXRlbV91bnBhY2soQVNOMV9TVFJJTkcgKm9jdCwgY29uc3QgQVNOMV9JVEVNICppdCk7CitBU04xX1NUUklORyAqQVNOMV9wYWNrX3N0cmluZyh2b2lkICpvYmosIGkyZF9vZl92b2lkICppMmQsCisJCQkgICAgICBBU04xX09DVEVUX1NUUklORyAqKm9jdCk7CisKKyNkZWZpbmUgQVNOMV9wYWNrX3N0cmluZ19vZih0eXBlLG9iaixpMmQsb2N0KSBcCisgICAgKEFTTjFfcGFja19zdHJpbmcoQ0hFQ0tFRF9QVFJfT0YodHlwZSwgb2JqKSwgXAorCQkgICAgICBDSEVDS0VEX0kyRF9PRih0eXBlLCBpMmQpLCBcCisJCSAgICAgIG9jdCkpCisKK0FTTjFfU1RSSU5HICpBU04xX2l0ZW1fcGFjayh2b2lkICpvYmosIGNvbnN0IEFTTjFfSVRFTSAqaXQsIEFTTjFfT0NURVRfU1RSSU5HICoqb2N0KTsKKwordm9pZCBBU04xX1NUUklOR19zZXRfZGVmYXVsdF9tYXNrKHVuc2lnbmVkIGxvbmcgbWFzayk7CitpbnQgQVNOMV9TVFJJTkdfc2V0X2RlZmF1bHRfbWFza19hc2MoY29uc3QgY2hhciAqcCk7Cit1bnNpZ25lZCBsb25nIEFTTjFfU1RSSU5HX2dldF9kZWZhdWx0X21hc2sodm9pZCk7CitpbnQgQVNOMV9tYnN0cmluZ19jb3B5KEFTTjFfU1RSSU5HICoqb3V0LCBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgaW50IGxlbiwKKwkJCQkJaW50IGluZm9ybSwgdW5zaWduZWQgbG9uZyBtYXNrKTsKK2ludCBBU04xX21ic3RyaW5nX25jb3B5KEFTTjFfU1RSSU5HICoqb3V0LCBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgaW50IGxlbiwKKwkJCQkJaW50IGluZm9ybSwgdW5zaWduZWQgbG9uZyBtYXNrLCAKKwkJCQkJbG9uZyBtaW5zaXplLCBsb25nIG1heHNpemUpOworCitBU04xX1NUUklORyAqQVNOMV9TVFJJTkdfc2V0X2J5X05JRChBU04xX1NUUklORyAqKm91dCwgCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCBpbnQgaW5sZW4sIGludCBpbmZvcm0sIGludCBuaWQpOworQVNOMV9TVFJJTkdfVEFCTEUgKkFTTjFfU1RSSU5HX1RBQkxFX2dldChpbnQgbmlkKTsKK2ludCBBU04xX1NUUklOR19UQUJMRV9hZGQoaW50LCBsb25nLCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKK3ZvaWQgQVNOMV9TVFJJTkdfVEFCTEVfY2xlYW51cCh2b2lkKTsKKworLyogQVNOMSB0ZW1wbGF0ZSBmdW5jdGlvbnMgKi8KKworLyogT2xkIEFQSSBjb21wYXRpYmxlIGZ1bmN0aW9ucyAqLworQVNOMV9WQUxVRSAqQVNOMV9pdGVtX25ldyhjb25zdCBBU04xX0lURU0gKml0KTsKK3ZvaWQgQVNOMV9pdGVtX2ZyZWUoQVNOMV9WQUxVRSAqdmFsLCBjb25zdCBBU04xX0lURU0gKml0KTsKK0FTTjFfVkFMVUUgKiBBU04xX2l0ZW1fZDJpKEFTTjFfVkFMVUUgKip2YWwsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbiwgbG9uZyBsZW4sIGNvbnN0IEFTTjFfSVRFTSAqaXQpOworaW50IEFTTjFfaXRlbV9pMmQoQVNOMV9WQUxVRSAqdmFsLCB1bnNpZ25lZCBjaGFyICoqb3V0LCBjb25zdCBBU04xX0lURU0gKml0KTsKK2ludCBBU04xX2l0ZW1fbmRlZl9pMmQoQVNOMV9WQUxVRSAqdmFsLCB1bnNpZ25lZCBjaGFyICoqb3V0LCBjb25zdCBBU04xX0lURU0gKml0KTsKKwordm9pZCBBU04xX2FkZF9vaWRfbW9kdWxlKHZvaWQpOworCitBU04xX1RZUEUgKkFTTjFfZ2VuZXJhdGVfbmNvbmYoY2hhciAqc3RyLCBDT05GICpuY29uZik7CitBU04xX1RZUEUgKkFTTjFfZ2VuZXJhdGVfdjMoY2hhciAqc3RyLCBYNTA5VjNfQ1RYICpjbmYpOworCisvKiBBU04xIFByaW50IGZsYWdzICovCisKKy8qIEluZGljYXRlIG1pc3NpbmcgT1BUSU9OQUwgZmllbGRzICovCisjZGVmaW5lIEFTTjFfUENUWF9GTEFHU19TSE9XX0FCU0VOVAkJMHgwMDEJCisvKiBNYXJrIHN0YXJ0IGFuZCBlbmQgb2YgU0VRVUVOQ0UgKi8KKyNkZWZpbmUgQVNOMV9QQ1RYX0ZMQUdTX1NIT1dfU0VRVUVOQ0UJCTB4MDAyCisvKiBNYXJrIHN0YXJ0IGFuZCBlbmQgb2YgU0VRVUVOQ0UvU0VUIE9GICovCisjZGVmaW5lIEFTTjFfUENUWF9GTEFHU19TSE9XX1NTT0YJCTB4MDA0CisvKiBTaG93IHRoZSBBU04xIHR5cGUgb2YgcHJpbWl0aXZlcyAqLworI2RlZmluZSBBU04xX1BDVFhfRkxBR1NfU0hPV19UWVBFCQkweDAwOAorLyogRG9uJ3Qgc2hvdyBBU04xIHR5cGUgb2YgQU5ZICovCisjZGVmaW5lIEFTTjFfUENUWF9GTEFHU19OT19BTllfVFlQRQkJMHgwMTAKKy8qIERvbid0IHNob3cgQVNOMSB0eXBlIG9mIE1TVFJJTkdzICovCisjZGVmaW5lIEFTTjFfUENUWF9GTEFHU19OT19NU1RSSU5HX1RZUEUJCTB4MDIwCisvKiBEb24ndCBzaG93IGZpZWxkIG5hbWVzIGluIFNFUVVFTkNFICovCisjZGVmaW5lIEFTTjFfUENUWF9GTEFHU19OT19GSUVMRF9OQU1FCQkweDA0MAorLyogU2hvdyBzdHJ1Y3R1cmUgbmFtZXMgb2YgZWFjaCBTRVFVRU5DRSBmaWVsZCAqLworI2RlZmluZSBBU04xX1BDVFhfRkxBR1NfU0hPV19GSUVMRF9TVFJVQ1RfTkFNRQkweDA4MAorLyogRG9uJ3Qgc2hvdyBzdHJ1Y3R1cmUgbmFtZSBldmVuIGF0IHRvcCBsZXZlbCAqLworI2RlZmluZSBBU04xX1BDVFhfRkxBR1NfTk9fU1RSVUNUX05BTUUJCTB4MTAwCisKK2ludCBBU04xX2l0ZW1fcHJpbnQoQklPICpvdXQsIEFTTjFfVkFMVUUgKmlmbGQsIGludCBpbmRlbnQsCisJCQkJY29uc3QgQVNOMV9JVEVNICppdCwgY29uc3QgQVNOMV9QQ1RYICpwY3R4KTsKK0FTTjFfUENUWCAqQVNOMV9QQ1RYX25ldyh2b2lkKTsKK3ZvaWQgQVNOMV9QQ1RYX2ZyZWUoQVNOMV9QQ1RYICpwKTsKK3Vuc2lnbmVkIGxvbmcgQVNOMV9QQ1RYX2dldF9mbGFncyhBU04xX1BDVFggKnApOwordm9pZCBBU04xX1BDVFhfc2V0X2ZsYWdzKEFTTjFfUENUWCAqcCwgdW5zaWduZWQgbG9uZyBmbGFncyk7Cit1bnNpZ25lZCBsb25nIEFTTjFfUENUWF9nZXRfbm1fZmxhZ3MoQVNOMV9QQ1RYICpwKTsKK3ZvaWQgQVNOMV9QQ1RYX3NldF9ubV9mbGFncyhBU04xX1BDVFggKnAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwordW5zaWduZWQgbG9uZyBBU04xX1BDVFhfZ2V0X2NlcnRfZmxhZ3MoQVNOMV9QQ1RYICpwKTsKK3ZvaWQgQVNOMV9QQ1RYX3NldF9jZXJ0X2ZsYWdzKEFTTjFfUENUWCAqcCwgdW5zaWduZWQgbG9uZyBmbGFncyk7Cit1bnNpZ25lZCBsb25nIEFTTjFfUENUWF9nZXRfb2lkX2ZsYWdzKEFTTjFfUENUWCAqcCk7Cit2b2lkIEFTTjFfUENUWF9zZXRfb2lkX2ZsYWdzKEFTTjFfUENUWCAqcCwgdW5zaWduZWQgbG9uZyBmbGFncyk7Cit1bnNpZ25lZCBsb25nIEFTTjFfUENUWF9nZXRfc3RyX2ZsYWdzKEFTTjFfUENUWCAqcCk7Cit2b2lkIEFTTjFfUENUWF9zZXRfc3RyX2ZsYWdzKEFTTjFfUENUWCAqcCwgdW5zaWduZWQgbG9uZyBmbGFncyk7CisKK0JJT19NRVRIT0QgKkJJT19mX2FzbjEodm9pZCk7CisKK0JJTyAqQklPX25ld19OREVGKEJJTyAqb3V0LCBBU04xX1ZBTFVFICp2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQpOworCitpbnQgaTJkX0FTTjFfYmlvX3N0cmVhbShCSU8gKm91dCwgQVNOMV9WQUxVRSAqdmFsLCBCSU8gKmluLCBpbnQgZmxhZ3MsCisJCQkJY29uc3QgQVNOMV9JVEVNICppdCk7CitpbnQgUEVNX3dyaXRlX2Jpb19BU04xX3N0cmVhbShCSU8gKm91dCwgQVNOMV9WQUxVRSAqdmFsLCBCSU8gKmluLCBpbnQgZmxhZ3MsCisJCQkJY29uc3QgY2hhciAqaGRyLAorCQkJCWNvbnN0IEFTTjFfSVRFTSAqaXQpOworQVNOMV9WQUxVRSAqU01JTUVfcmVhZF9BU04xKEJJTyAqYmlvLCBCSU8gKipiY29udCwgY29uc3QgQVNOMV9JVEVNICppdCk7CitpbnQgU01JTUVfY3JsZl9jb3B5KEJJTyAqaW4sIEJJTyAqb3V0LCBpbnQgZmxhZ3MpOworaW50IFNNSU1FX3RleHQoQklPICppbiwgQklPICpvdXQpOworCisvKiBCRUdJTiBFUlJPUiBDT0RFUyAqLworLyogVGhlIGZvbGxvd2luZyBsaW5lcyBhcmUgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHNjcmlwdCBta2Vyci5wbC4gQW55IGNoYW5nZXMKKyAqIG1hZGUgYWZ0ZXIgdGhpcyBwb2ludCBtYXkgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgc2NyaXB0IGlzIG5leHQgcnVuLgorICovCit2b2lkIEVSUl9sb2FkX0FTTjFfc3RyaW5ncyh2b2lkKTsKKwordHlwZWRlZiBpbnQgYXNuMV9wc19mdW5jKEJJTyAqYiwgdW5zaWduZWQgY2hhciAqKnBidWYsIGludCAqcGxlbiwgdm9pZCAqcGFyZyk7CitpbnQgQklPX2FzbjFfc2V0X3ByZWZpeChCSU8gKmIsIGFzbjFfcHNfZnVuYyAqcHJlZml4LAorCQkJCQlhc24xX3BzX2Z1bmMgKnByZWZpeF9mcmVlKTsKK2ludCBCSU9fYXNuMV9nZXRfcHJlZml4KEJJTyAqYiwgYXNuMV9wc19mdW5jICoqcHByZWZpeCwKKwkJCQkJYXNuMV9wc19mdW5jICoqcHByZWZpeF9mcmVlKTsKK2ludCBCSU9fYXNuMV9zZXRfc3VmZml4KEJJTyAqYiwgYXNuMV9wc19mdW5jICpzdWZmaXgsCisJCQkJCWFzbjFfcHNfZnVuYyAqc3VmZml4X2ZyZWUpOworaW50IEJJT19hc24xX2dldF9zdWZmaXgoQklPICpiLCBhc24xX3BzX2Z1bmMgKipwc3VmZml4LAorCQkJCQlhc24xX3BzX2Z1bmMgKipwc3VmZml4X2ZyZWUpOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2RlZmluZSBBU04xX0ZfYXNuMV90ZW1wbGF0ZV9leF9kMmkgMTAwCisjZGVmaW5lIEFTTjFfRl9BU04xX2R1cCAxMDEKKyNkZWZpbmUgQVNOMV9GX2EyaV9BU04xX1NUUklORyAxMDIKKyNkZWZpbmUgQVNOMV9GX0FTTjFfZDJpX2ZwIDEwMworI2RlZmluZSBBU04xX0ZfZDJpX0FTTjFfT0JKRUNUIDEwNAorI2RlZmluZSBBU04xX0ZfYXNuMV9pdGVtX2V4X2NvbWJpbmVfbmV3IDEwNQorI2RlZmluZSBBU04xX0ZfQVNOMV90ZW1wbGF0ZV9uZXcgMTA2CisjZGVmaW5lIEFTTjFfRl9hc24xX2RvX2FkYiAxMDcKKyNkZWZpbmUgQVNOMV9GX2FzbjFfZDJpX3JlYWRfYmlvIDEwOAorI2RlZmluZSBBU04xX0ZfYXNuMV9leF9jMmkgMTA5CisjZGVmaW5lIEFTTjFfRl9jMmlfQVNOMV9JTlRFR0VSIDExMAorI2RlZmluZSBBU04xX0ZfQVNOMV9QQ1RYX25ldyAxMTEKKyNkZWZpbmUgQVNOMV9GX0FTTjFfaXRlbV91bnBhY2sgMTEyCisjZGVmaW5lIEFTTjFfRl9kMmlfQVNOMV90eXBlX2J5dGVzIDExMworI2RlZmluZSBBU04xX0ZfYTJpX0FTTjFfSU5URUdFUiAxMTQKKyNkZWZpbmUgQVNOMV9GX2FzbjFfY29sbGVjdCAxMTUKKyNkZWZpbmUgQVNOMV9GX0FTTjFfaXRlbV9kdXAgMTE2CisjZGVmaW5lIEFTTjFfRl9BU04xX0VOVU1FUkFURURfc2V0IDExNworI2RlZmluZSBBU04xX0ZfYzJpX0FTTjFfT0JKRUNUIDExOAorI2RlZmluZSBBU04xX0ZfQVNOMV91bnBhY2tfc3RyaW5nIDExOQorI2RlZmluZSBBU04xX0ZfZDJpX0FTTjFfVUlOVEVHRVIgMTIwCisjZGVmaW5lIEFTTjFfRl9sb25nX2MyaSAxMjEKKyNkZWZpbmUgQVNOMV9GX0FTTjFfc2VxX3BhY2sgMTIyCisjZGVmaW5lIEFTTjFfRl9hMmRfQVNOMV9PQkpFQ1QgMTIzCisjZGVmaW5lIEFTTjFfRl9BU04xX1NUUklOR190eXBlX25ldyAxMjQKKyNkZWZpbmUgQVNOMV9GX0FTTjFfSU5URUdFUl9zZXQgMTI1CisjZGVmaW5lIEFTTjFfRl9CTl90b19BU04xX0lOVEVHRVIgMTI2CisjZGVmaW5lIEFTTjFfRl9CSU9fbmV3X05ERUYgMTI3CisjZGVmaW5lIEFTTjFfRl9BU04xX0VOVU1FUkFURURfdG9fQk4gMTI4CisjZGVmaW5lIEFTTjFfRl9BU04xX2l0ZW1fZXhfZDJpIDEyOQorI2RlZmluZSBBU04xX0ZfQVNOMV9JTlRFR0VSX3RvX0JOIDEzMAorI2RlZmluZSBBU04xX0ZfaTJkX0FTTjFfVElNRSAxMzEKKyNkZWZpbmUgQVNOMV9GX0FTTjFfVElNRV9hZGogMTMyCisjZGVmaW5lIEFTTjFfRl9BU04xX0JJVF9TVFJJTkdfc2V0X2JpdCAxMzMKKyNkZWZpbmUgQVNOMV9GX0FTTjFfc2VxX3VucGFjayAxMzQKKyNkZWZpbmUgQVNOMV9GX0FTTjFfaXRlbV9wYWNrIDEzNQorI2RlZmluZSBBU04xX0ZfQVNOMV9TVFJJTkdfc2V0IDEzNgorI2RlZmluZSBBU04xX0ZfQVNOMV9VVENUSU1FX2FkaiAxMzcKKyNkZWZpbmUgQVNOMV9GX0FTTjFfbWJzdHJpbmdfbmNvcHkgMTM4CisjZGVmaW5lIEFTTjFfRl9kMmlfQVNOMV9CT09MRUFOIDEzOQorI2RlZmluZSBBU04xX0ZfQVNOMV9PQkpFQ1RfbmV3IDE0MAorI2RlZmluZSBBU04xX0ZfYXNuMV90ZW1wbGF0ZV9ub2V4cF9kMmkgMTQxCisjZGVmaW5lIEFTTjFfRl9jMmlfQVNOMV9CSVRfU1RSSU5HIDE0MgorI2RlZmluZSBBU04xX0ZfQk5fdG9fQVNOMV9FTlVNRVJBVEVEIDE0MworI2RlZmluZSBBU04xX0ZfYXNuMV9kMmlfZXhfcHJpbWl0aXZlIDE0NAorI2RlZmluZSBBU04xX0ZfQVNOMV9pMmRfYmlvIDE0NQorI2RlZmluZSBBU04xX0ZfQVNOMV9pdGVtX2kyZF9iaW8gMTQ2CisjZGVmaW5lIEFTTjFfRl9kMmlfQVNOMV9VVENUSU1FIDE0NworI2RlZmluZSBBU04xX0ZfQVNOMV9TVFJJTkdfVEFCTEVfYWRkIDE0OAorI2RlZmluZSBBU04xX0ZfYXNuMV9maW5kX2VuZCAxNDkKKyNkZWZpbmUgQVNOMV9GX0FTTjFfaXRlbV9kMmlfZnAgMTUwCisjZGVmaW5lIEFTTjFfRl9jb2xsZWN0X2RhdGEgMTUxCisjZGVmaW5lIEFTTjFfRl9hc24xX2NoZWNrX3RsZW4gMTUyCisjZGVmaW5lIEFTTjFfRl9BU04xX2kyZF9mcCAxNTMKKyNkZWZpbmUgQVNOMV9GX0FTTjFfaXRlbV9pMmRfZnAgMTU0CisjZGVmaW5lIEFTTjFfRl9BU04xX0dFTkVSQUxJWkVEVElNRV9hZGogMTU1CisjZGVmaW5lIEFTTjFfRl9hc24xX2NvbGxhdGVfcHJpbWl0aXZlIDE1NgorI2RlZmluZSBBU04xX0ZfQVNOMV9wYWNrX3N0cmluZyAxNTcKKyNkZWZpbmUgQVNOMV9GX0FTTjFfZ2V0X29iamVjdCAxNTgKKyNkZWZpbmUgQVNOMV9GX2QyaV9BU04xX2J5dGVzIDE1OQorI2RlZmluZSBBU04xX0ZfYTJpX0FTTjFfRU5VTUVSQVRFRCAxNjAKKyNkZWZpbmUgQVNOMV9SX0FTTjFfU0lHX1BBUlNFX0VSUk9SIDEwMAorI2RlZmluZSBBU04xX1JfQURESU5HX09CSkVDVCAxMDEKKyNkZWZpbmUgQVNOMV9SX01JTUVfTk9fQ09OVEVOVF9UWVBFIDEwMgorI2RlZmluZSBBU04xX1JfVU5LTk9XTl9PQkpFQ1RfVFlQRSAxMDMKKyNkZWZpbmUgQVNOMV9SX0lMTEVHQUxfRk9STUFUIDEwNAorI2RlZmluZSBBU04xX1JfSEVBREVSX1RPT19MT05HIDEwNQorI2RlZmluZSBBU04xX1JfSU5WQUxJRF9VVEY4U1RSSU5HIDEwNgorI2RlZmluZSBBU04xX1JfRVhQTElDSVRfTEVOR1RIX01JU01BVENIIDEwNworI2RlZmluZSBBU04xX1JfSUxMRUdBTF9UQUdHRURfQU5ZIDEwOAorI2RlZmluZSBBU04xX1JfREFUQV9JU19XUk9ORyAxMDkKKyNkZWZpbmUgQVNOMV9SX05PVF9BU0NJSV9GT1JNQVQgMTEwCisjZGVmaW5lIEFTTjFfUl9OT1RfRU5PVUdIX0RBVEEgMTExCisjZGVmaW5lIEFTTjFfUl9NU1RSSU5HX05PVF9VTklWRVJTQUwgMTEyCisjZGVmaW5lIEFTTjFfUl9VTktPV05fRk9STUFUIDExMworI2RlZmluZSBBU04xX1JfVU5LTk9XTl9TSUdOQVRVUkVfQUxHT1JJVEhNIDExNAorI2RlZmluZSBBU04xX1JfQkFEX1BBU1NXT1JEX1JFQUQgMTE1CisjZGVmaW5lIEFTTjFfUl9CQURfT0JKRUNUX0hFQURFUiAxMTYKKyNkZWZpbmUgQVNOMV9SX0lMTEVHQUxfQ0hBUkFDVEVSUyAxMTcKKyNkZWZpbmUgQVNOMV9SX0NPTlRFWFRfTk9UX0lOSVRJQUxJU0VEIDExOAorI2RlZmluZSBBU04xX1JfU0VRVUVOQ0VfT1JfU0VUX05FRURTX0NPTkZJRyAxMTkKKyNkZWZpbmUgQVNOMV9SX0JOX0xJQiAxMjAKKyNkZWZpbmUgQVNOMV9SX05PX01BVENISU5HX0NIT0lDRV9UWVBFIDEyMQorI2RlZmluZSBBU04xX1JfU0VRVUVOQ0VfTk9UX0NPTlNUUlVDVEVEIDEyMgorI2RlZmluZSBBU04xX1JfQVNOMV9QQVJTRV9FUlJPUiAxMjMKKyNkZWZpbmUgQVNOMV9SX05PX01VTFRJUEFSVF9CT1VOREFSWSAxMjQKKyNkZWZpbmUgQVNOMV9SX0lOVkFMSURfU0VQQVJBVE9SIDEyNQorI2RlZmluZSBBU04xX1JfTUFMTE9DX0ZBSUxVUkUgMTI2CisjZGVmaW5lIEFTTjFfUl9JTExFR0FMX05VTEwgMTI3CisjZGVmaW5lIEFTTjFfUl9JTlZBTElEX01JTUVfVFlQRSAxMjgKKyNkZWZpbmUgQVNOMV9SX0lOVkFMSURfTlVNQkVSIDEyOQorI2RlZmluZSBBU04xX1JfU1RSSU5HX1RPT19MT05HIDEzMAorI2RlZmluZSBBU04xX1JfQkFEX0dFVF9BU04xX09CSkVDVF9DQUxMIDEzMQorI2RlZmluZSBBU04xX1JfVU5BQkxFX1RPX0RFQ09ERV9SU0FfS0VZIDEzMgorI2RlZmluZSBBU04xX1JfRVhQRUNUSU5HX0FfVElNRSAxMzMKKyNkZWZpbmUgQVNOMV9SX1RBR19WQUxVRV9UT09fSElHSCAxMzQKKyNkZWZpbmUgQVNOMV9SX05FU1RFRF9BU04xX1NUUklORyAxMzUKKyNkZWZpbmUgQVNOMV9SX0lMTEVHQUxfQklUU1RSSU5HX0ZPUk1BVCAxMzYKKyNkZWZpbmUgQVNOMV9SX01JU1NJTkdfU0VDT05EX05VTUJFUiAxMzcKKyNkZWZpbmUgQVNOMV9SX1RJTUVfTk9UX0FTQ0lJX0ZPUk1BVCAxMzgKKyNkZWZpbmUgQVNOMV9SX1RIRV9BU04xX09CSkVDVF9JREVOVElGSUVSX0lTX05PVF9LTk9XTl9GT1JfVEhJU19NRCAxMzkKKyNkZWZpbmUgQVNOMV9SX1dST05HX1RZUEUgMTQwCisjZGVmaW5lIEFTTjFfUl9FWFBFQ1RJTkdfQU5fSU5URUdFUiAxNDEKKyNkZWZpbmUgQVNOMV9SX0RFUFRIX0VYQ0VFREVEIDE0MgorI2RlZmluZSBBU04xX1JfSUxMRUdBTF9PQkpFQ1QgMTQzCisjZGVmaW5lIEFTTjFfUl9VTktOT1dOX1RBRyAxNDQKKyNkZWZpbmUgQVNOMV9SX0lMTEVHQUxfSU1QTElDSVRfVEFHIDE0NQorI2RlZmluZSBBU04xX1JfQVVYX0VSUk9SIDE0NgorI2RlZmluZSBBU04xX1JfU0VRVUVOQ0VfTEVOR1RIX01JU01BVENIIDE0NworI2RlZmluZSBBU04xX1JfRklFTERfTUlTU0lORyAxNDgKKyNkZWZpbmUgQVNOMV9SX1RZUEVfTk9UX0NPTlNUUlVDVEVEIDE0OQorI2RlZmluZSBBU04xX1JfVU5JVkVSU0FMU1RSSU5HX0lTX1dST05HX0xFTkdUSCAxNTAKKyNkZWZpbmUgQVNOMV9SX0ZJUlNUX05VTV9UT09fTEFSR0UgMTUxCisjZGVmaW5lIEFTTjFfUl9JTlZBTElEX0RJR0lUIDE1MgorI2RlZmluZSBBU04xX1JfTVNUUklOR19XUk9OR19UQUcgMTUzCisjZGVmaW5lIEFTTjFfUl9PQkpFQ1RfTk9UX0FTQ0lJX0ZPUk1BVCAxNTQKKyNkZWZpbmUgQVNOMV9SX1VOU1VQUE9SVEVEX1RZUEUgMTU1CisjZGVmaW5lIEFTTjFfUl9FUlJPUl9MT0FESU5HX1NFQ1RJT04gMTU2CisjZGVmaW5lIEFTTjFfUl9PRERfTlVNQkVSX09GX0NIQVJTIDE1NworI2RlZmluZSBBU04xX1JfQVNOMV9MRU5HVEhfTUlTTUFUQ0ggMTU4CisjZGVmaW5lIEFTTjFfUl9NSVNTSU5HX0VPQyAxNTkKKyNkZWZpbmUgQVNOMV9SX0lMTEVHQUxfSU5URUdFUiAxNjAKKyNkZWZpbmUgQVNOMV9SX0lMTEVHQUxfSEVYIDE2MQorI2RlZmluZSBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IgMTYyCisjZGVmaW5lIEFTTjFfUl9UT09fTE9ORyAxNjMKKyNkZWZpbmUgQVNOMV9SX0xFTkdUSF9FUlJPUiAxNjQKKyNkZWZpbmUgQVNOMV9SX0RFQ09ESU5HX0VSUk9SIDE2NQorI2RlZmluZSBBU04xX1JfTUlNRV9TSUdfUEFSU0VfRVJST1IgMTY2CisjZGVmaW5lIEFTTjFfUl9JTExFR0FMX05VTExfVkFMVUUgMTY3CisjZGVmaW5lIEFTTjFfUl9FWFBFQ1RJTkdfQV9CT09MRUFOIDE2OAorI2RlZmluZSBBU04xX1JfU1RSRUFNSU5HX05PVF9TVVBQT1JURUQgMTY5CisjZGVmaW5lIEFTTjFfUl9JTlZBTElEX0JNUFNUUklOR19MRU5HVEggMTcwCisjZGVmaW5lIEFTTjFfUl9JTlRFR0VSX05PVF9BU0NJSV9GT1JNQVQgMTcxCisjZGVmaW5lIEFTTjFfUl9JTlZBTElEX01PRElGSUVSIDE3MgorI2RlZmluZSBBU04xX1JfVU5FWFBFQ1RFRF9FT0MgMTczCisjZGVmaW5lIEFTTjFfUl9JTExFR0FMX05FU1RFRF9UQUdHSU5HIDE3NAorI2RlZmluZSBBU04xX1JfSVZfVE9PX0xBUkdFIDE3NQorI2RlZmluZSBBU04xX1JfSU5URUdFUl9UT09fTEFSR0VfRk9SX0xPTkcgMTc2CisjZGVmaW5lIEFTTjFfUl9VTlNVUFBPUlRFRF9QVUJMSUNfS0VZX1RZUEUgMTc3CisjZGVmaW5lIEFTTjFfUl9CVUZGRVJfVE9PX1NNQUxMIDE3OAorI2RlZmluZSBBU04xX1JfSU5WQUxJRF9VTklWRVJTQUxTVFJJTkdfTEVOR1RIIDE3OQorI2RlZmluZSBBU04xX1JfV1JPTkdfUFVCTElDX0tFWV9UWVBFIDE4MAorI2RlZmluZSBBU04xX1JfVU5TVVBQT1JURURfRU5DUllQVElPTl9BTEdPUklUSE0gMTgxCisjZGVmaW5lIEFTTjFfUl9NSU1FX1BBUlNFX0VSUk9SIDE4MgorI2RlZmluZSBBU04xX1JfSU5WQUxJRF9PQkpFQ1RfRU5DT0RJTkcgMTgzCisjZGVmaW5lIEFTTjFfUl9QUklWQVRFX0tFWV9IRUFERVJfTUlTU0lORyAxODQKKyNkZWZpbmUgQVNOMV9SX1VOU1VQUE9SVEVEX0NJUEhFUiAxODUKKyNkZWZpbmUgQVNOMV9SX05PX01VTFRJUEFSVF9CT0RZX0ZBSUxVUkUgMTg2CisjZGVmaW5lIEFTTjFfUl9OT19DT05URU5UX1RZUEUgMTg3CisjZGVmaW5lIEFTTjFfUl9TRUNPTkRfTlVNQkVSX1RPT19MQVJHRSAxODgKKyNkZWZpbmUgQVNOMV9SX0lOVkFMSURfVElNRV9GT1JNQVQgMTg5CisjZGVmaW5lIEFTTjFfUl9OT19ERUZBVUxUX0RJR0VTVCAxOTAKKyNkZWZpbmUgQVNOMV9SX0VSUk9SX1NFVFRJTkdfQ0lQSEVSX1BBUkFNUyAxOTEKKyNkZWZpbmUgQVNOMV9SX0VYUEVDVElOR19BTl9PQkpFQ1QgMTkyCisjZGVmaW5lIEFTTjFfUl9VTktOT1dOX1BVQkxJQ19LRVlfVFlQRSAxOTMKKyNkZWZpbmUgQVNOMV9SX0VSUk9SX0dFVFRJTkdfVElNRSAxOTQKKyNkZWZpbmUgQVNOMV9SX01JU1NJTkdfVkFMVUUgMTk1CisjZGVmaW5lIEFTTjFfUl9MSVNUX0VSUk9SIDE5NgorI2RlZmluZSBBU04xX1JfREVDT0RFX0VSUk9SIDE5NworI2RlZmluZSBBU04xX1JfTk9OX0hFWF9DSEFSQUNURVJTIDE5OAorI2RlZmluZSBBU04xX1JfVU5TVVBQT1JURURfQU5ZX0RFRklORURfQllfVFlQRSAxOTkKKyNkZWZpbmUgQVNOMV9SX1VOS05PV05fRk9STUFUIDIwMAorI2RlZmluZSBBU04xX1JfRVhQRUNUSU5HX0FOX0FTTjFfU0VRVUVOQ0UgMjAxCisjZGVmaW5lIEFTTjFfUl9VTktOT1dOX01FU1NBR0VfRElHRVNUX0FMR09SSVRITSAyMDIKKyNkZWZpbmUgQVNOMV9SX1NUUklOR19UT09fU0hPUlQgMjAzCisjZGVmaW5lIEFTTjFfUl9JTExFR0FMX09QVElPTkFMX0FOWSAyMDQKKyNkZWZpbmUgQVNOMV9SX0JNUFNUUklOR19JU19XUk9OR19MRU5HVEggMjA1CisjZGVmaW5lIEFTTjFfUl9OT19TSUdfQ09OVEVOVF9UWVBFIDIwNgorI2RlZmluZSBBU04xX1JfRU5DT0RFX0VSUk9SIDIwNworI2RlZmluZSBBU04xX1JfU0hPUlRfTElORSAyMDgKKyNkZWZpbmUgQVNOMV9SX0lMTEVHQUxfVElNRV9WQUxVRSAyMDkKKyNkZWZpbmUgQVNOMV9SX1VOQUJMRV9UT19ERUNPREVfUlNBX1BSSVZBVEVfS0VZIDIxMAorI2RlZmluZSBBU04xX1JfQ0lQSEVSX0hBU19OT19PQkpFQ1RfSURFTlRJRklFUiAyMTEKKyNkZWZpbmUgQVNOMV9SX0JBRF9DTEFTUyAyMTIKKyNkZWZpbmUgQVNOMV9SX0JBRF9UQUcgMjEzCisjZGVmaW5lIEFTTjFfUl9JTExFR0FMX09QVElPTlNfT05fSVRFTV9URU1QTEFURSAyMTQKKyNkZWZpbmUgQVNOMV9SX0VYUExJQ0lUX1RBR19OT1RfQ09OU1RSVUNURUQgMjE1CisjZGVmaW5lIEFTTjFfUl9JTExFR0FMX0JPT0xFQU4gMjE2CisjZGVmaW5lIEFTTjFfUl9TSUdfSU5WQUxJRF9NSU1FX1RZUEUgMjE3CisjZGVmaW5lIEFTTjFfUl9OVUxMX0lTX1dST05HX0xFTkdUSCAyMTgKKyNkZWZpbmUgQVNOMV9SX01JU1NJTkdfQVNOMV9FT1MgMjE5CisjZGVmaW5lIEFTTjFfUl9FUlJPUl9QQVJTSU5HX1NFVF9FTEVNRU5UIDIyMAorI2RlZmluZSBBU04xX1JfV1JPTkdfVEFHIDIyMQorI2RlZmluZSBBU04xX1JfQk9PTEVBTl9JU19XUk9OR19MRU5HVEggMjIyCisjZGVmaW5lIEFTTjFfUl9ESUdFU1RfQU5EX0tFWV9UWVBFX05PVF9TVVBQT1JURUQgMjIzCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FzbjEvYXNuMV9lcnJvci5jIGIvY3J5cHRvL2FzbjEvYXNuMV9lcnJvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNTRmZmUKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYXNuMS9hc24xX2Vycm9yLmMKQEAgLTAsMCArMSwyMDYgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNCwgR29vZ2xlIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisKKyNpbmNsdWRlICJhc24xLmgiCisKK2NvbnN0IEVSUl9TVFJJTkdfREFUQSBBU04xX2Vycm9yX3N0cmluZ19kYXRhW10gPSB7CisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIEFTTjFfRl9BU04xX0JJVF9TVFJJTkdfc2V0X2JpdCwgMCksICJBU04xX0JJVF9TVFJJTkdfc2V0X2JpdCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCBBU04xX0ZfQVNOMV9FTlVNRVJBVEVEX3NldCwgMCksICJBU04xX0VOVU1FUkFURURfc2V0In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIEFTTjFfRl9BU04xX0VOVU1FUkFURURfdG9fQk4sIDApLCAiQVNOMV9FTlVNRVJBVEVEX3RvX0JOIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIEFTTjFfRl9BU04xX0dFTkVSQUxJWkVEVElNRV9hZGosIDApLCAiQVNOMV9HRU5FUkFMSVpFRFRJTUVfYWRqIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIEFTTjFfRl9BU04xX0lOVEVHRVJfc2V0LCAwKSwgIkFTTjFfSU5URUdFUl9zZXQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgQVNOMV9GX0FTTjFfSU5URUdFUl90b19CTiwgMCksICJBU04xX0lOVEVHRVJfdG9fQk4ifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgQVNOMV9GX0FTTjFfT0JKRUNUX25ldywgMCksICJBU04xX09CSkVDVF9uZXcifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgQVNOMV9GX0FTTjFfUENUWF9uZXcsIDApLCAiQVNOMV9QQ1RYX25ldyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCBBU04xX0ZfQVNOMV9TVFJJTkdfVEFCTEVfYWRkLCAwKSwgIkFTTjFfU1RSSU5HX1RBQkxFX2FkZCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCBBU04xX0ZfQVNOMV9TVFJJTkdfc2V0LCAwKSwgIkFTTjFfU1RSSU5HX3NldCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCBBU04xX0ZfQVNOMV9TVFJJTkdfdHlwZV9uZXcsIDApLCAiQVNOMV9TVFJJTkdfdHlwZV9uZXcifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgQVNOMV9GX0FTTjFfVElNRV9hZGosIDApLCAiQVNOMV9USU1FX2FkaiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCBBU04xX0ZfQVNOMV9VVENUSU1FX2FkaiwgMCksICJBU04xX1VUQ1RJTUVfYWRqIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIEFTTjFfRl9BU04xX2QyaV9mcCwgMCksICJBU04xX2QyaV9mcCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCBBU04xX0ZfQVNOMV9kdXAsIDApLCAiQVNOMV9kdXAifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgQVNOMV9GX0FTTjFfZ2V0X29iamVjdCwgMCksICJBU04xX2dldF9vYmplY3QifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgQVNOMV9GX0FTTjFfaTJkX2JpbywgMCksICJBU04xX2kyZF9iaW8ifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgQVNOMV9GX0FTTjFfaTJkX2ZwLCAwKSwgIkFTTjFfaTJkX2ZwIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIEFTTjFfRl9BU04xX2l0ZW1fZDJpX2ZwLCAwKSwgIkFTTjFfaXRlbV9kMmlfZnAifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgQVNOMV9GX0FTTjFfaXRlbV9kdXAsIDApLCAiQVNOMV9pdGVtX2R1cCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCBBU04xX0ZfQVNOMV9pdGVtX2V4X2QyaSwgMCksICJBU04xX2l0ZW1fZXhfZDJpIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIEFTTjFfRl9BU04xX2l0ZW1faTJkX2JpbywgMCksICJBU04xX2l0ZW1faTJkX2JpbyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCBBU04xX0ZfQVNOMV9pdGVtX2kyZF9mcCwgMCksICJBU04xX2l0ZW1faTJkX2ZwIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIEFTTjFfRl9BU04xX2l0ZW1fcGFjaywgMCksICJBU04xX2l0ZW1fcGFjayJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCBBU04xX0ZfQVNOMV9pdGVtX3VucGFjaywgMCksICJBU04xX2l0ZW1fdW5wYWNrIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIEFTTjFfRl9BU04xX21ic3RyaW5nX25jb3B5LCAwKSwgIkFTTjFfbWJzdHJpbmdfbmNvcHkifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgQVNOMV9GX0FTTjFfcGFja19zdHJpbmcsIDApLCAiQVNOMV9wYWNrX3N0cmluZyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCBBU04xX0ZfQVNOMV9zZXFfcGFjaywgMCksICJBU04xX3NlcV9wYWNrIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIEFTTjFfRl9BU04xX3NlcV91bnBhY2ssIDApLCAiQVNOMV9zZXFfdW5wYWNrIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIEFTTjFfRl9BU04xX3RlbXBsYXRlX25ldywgMCksICJBU04xX3RlbXBsYXRlX25ldyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCBBU04xX0ZfQVNOMV91bnBhY2tfc3RyaW5nLCAwKSwgIkFTTjFfdW5wYWNrX3N0cmluZyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCBBU04xX0ZfQklPX25ld19OREVGLCAwKSwgIkJJT19uZXdfTkRFRiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCBBU04xX0ZfQk5fdG9fQVNOMV9FTlVNRVJBVEVELCAwKSwgIkJOX3RvX0FTTjFfRU5VTUVSQVRFRCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCBBU04xX0ZfQk5fdG9fQVNOMV9JTlRFR0VSLCAwKSwgIkJOX3RvX0FTTjFfSU5URUdFUiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCBBU04xX0ZfYTJkX0FTTjFfT0JKRUNULCAwKSwgImEyZF9BU04xX09CSkVDVCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCBBU04xX0ZfYTJpX0FTTjFfRU5VTUVSQVRFRCwgMCksICJhMmlfQVNOMV9FTlVNRVJBVEVEIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIEFTTjFfRl9hMmlfQVNOMV9JTlRFR0VSLCAwKSwgImEyaV9BU04xX0lOVEVHRVIifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgQVNOMV9GX2EyaV9BU04xX1NUUklORywgMCksICJhMmlfQVNOMV9TVFJJTkcifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgQVNOMV9GX2FzbjFfY2hlY2tfdGxlbiwgMCksICJhc24xX2NoZWNrX3RsZW4ifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgQVNOMV9GX2FzbjFfY29sbGF0ZV9wcmltaXRpdmUsIDApLCAiYXNuMV9jb2xsYXRlX3ByaW1pdGl2ZSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCBBU04xX0ZfYXNuMV9jb2xsZWN0LCAwKSwgImFzbjFfY29sbGVjdCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCBBU04xX0ZfYXNuMV9kMmlfZXhfcHJpbWl0aXZlLCAwKSwgImFzbjFfZDJpX2V4X3ByaW1pdGl2ZSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCBBU04xX0ZfYXNuMV9kMmlfcmVhZF9iaW8sIDApLCAiYXNuMV9kMmlfcmVhZF9iaW8ifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgQVNOMV9GX2FzbjFfZG9fYWRiLCAwKSwgImFzbjFfZG9fYWRiIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIEFTTjFfRl9hc24xX2V4X2MyaSwgMCksICJhc24xX2V4X2MyaSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCBBU04xX0ZfYXNuMV9maW5kX2VuZCwgMCksICJhc24xX2ZpbmRfZW5kIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIEFTTjFfRl9hc24xX2l0ZW1fZXhfY29tYmluZV9uZXcsIDApLCAiYXNuMV9pdGVtX2V4X2NvbWJpbmVfbmV3In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIEFTTjFfRl9hc24xX3RlbXBsYXRlX2V4X2QyaSwgMCksICJhc24xX3RlbXBsYXRlX2V4X2QyaSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCBBU04xX0ZfYXNuMV90ZW1wbGF0ZV9ub2V4cF9kMmksIDApLCAiYXNuMV90ZW1wbGF0ZV9ub2V4cF9kMmkifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgQVNOMV9GX2MyaV9BU04xX0JJVF9TVFJJTkcsIDApLCAiYzJpX0FTTjFfQklUX1NUUklORyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCBBU04xX0ZfYzJpX0FTTjFfSU5URUdFUiwgMCksICJjMmlfQVNOMV9JTlRFR0VSIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIEFTTjFfRl9jMmlfQVNOMV9PQkpFQ1QsIDApLCAiYzJpX0FTTjFfT0JKRUNUIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIEFTTjFfRl9jb2xsZWN0X2RhdGEsIDApLCAiY29sbGVjdF9kYXRhIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIEFTTjFfRl9kMmlfQVNOMV9CT09MRUFOLCAwKSwgImQyaV9BU04xX0JPT0xFQU4ifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgQVNOMV9GX2QyaV9BU04xX09CSkVDVCwgMCksICJkMmlfQVNOMV9PQkpFQ1QifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgQVNOMV9GX2QyaV9BU04xX1VJTlRFR0VSLCAwKSwgImQyaV9BU04xX1VJTlRFR0VSIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIEFTTjFfRl9kMmlfQVNOMV9VVENUSU1FLCAwKSwgImQyaV9BU04xX1VUQ1RJTUUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgQVNOMV9GX2QyaV9BU04xX2J5dGVzLCAwKSwgImQyaV9BU04xX2J5dGVzIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIEFTTjFfRl9kMmlfQVNOMV90eXBlX2J5dGVzLCAwKSwgImQyaV9BU04xX3R5cGVfYnl0ZXMifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgQVNOMV9GX2kyZF9BU04xX1RJTUUsIDApLCAiaTJkX0FTTjFfVElNRSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCBBU04xX0ZfbG9uZ19jMmksIDApLCAibG9uZ19jMmkifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX0FERElOR19PQkpFQ1QpLCAiQURESU5HX09CSkVDVCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfQVNOMV9MRU5HVEhfTUlTTUFUQ0gpLCAiQVNOMV9MRU5HVEhfTUlTTUFUQ0gifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX0FTTjFfUEFSU0VfRVJST1IpLCAiQVNOMV9QQVJTRV9FUlJPUiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfQVNOMV9TSUdfUEFSU0VfRVJST1IpLCAiQVNOMV9TSUdfUEFSU0VfRVJST1IifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX0FVWF9FUlJPUiksICJBVVhfRVJST1IifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX0JBRF9DTEFTUyksICJCQURfQ0xBU1MifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX0JBRF9HRVRfQVNOMV9PQkpFQ1RfQ0FMTCksICJCQURfR0VUX0FTTjFfT0JKRUNUX0NBTEwifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX0JBRF9PQkpFQ1RfSEVBREVSKSwgIkJBRF9PQkpFQ1RfSEVBREVSIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9CQURfUEFTU1dPUkRfUkVBRCksICJCQURfUEFTU1dPUkRfUkVBRCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfQkFEX1RBRyksICJCQURfVEFHIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9CTVBTVFJJTkdfSVNfV1JPTkdfTEVOR1RIKSwgIkJNUFNUUklOR19JU19XUk9OR19MRU5HVEgifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX0JOX0xJQiksICJCTl9MSUIifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX0JPT0xFQU5fSVNfV1JPTkdfTEVOR1RIKSwgIkJPT0xFQU5fSVNfV1JPTkdfTEVOR1RIIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9CVUZGRVJfVE9PX1NNQUxMKSwgIkJVRkZFUl9UT09fU01BTEwifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX0NJUEhFUl9IQVNfTk9fT0JKRUNUX0lERU5USUZJRVIpLCAiQ0lQSEVSX0hBU19OT19PQkpFQ1RfSURFTlRJRklFUiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfQ09OVEVYVF9OT1RfSU5JVElBTElTRUQpLCAiQ09OVEVYVF9OT1RfSU5JVElBTElTRUQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX0RBVEFfSVNfV1JPTkcpLCAiREFUQV9JU19XUk9ORyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfREVDT0RFX0VSUk9SKSwgIkRFQ09ERV9FUlJPUiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfREVDT0RJTkdfRVJST1IpLCAiREVDT0RJTkdfRVJST1IifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX0RFUFRIX0VYQ0VFREVEKSwgIkRFUFRIX0VYQ0VFREVEIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9ESUdFU1RfQU5EX0tFWV9UWVBFX05PVF9TVVBQT1JURUQpLCAiRElHRVNUX0FORF9LRVlfVFlQRV9OT1RfU1VQUE9SVEVEIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9FTkNPREVfRVJST1IpLCAiRU5DT0RFX0VSUk9SIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9FUlJPUl9HRVRUSU5HX1RJTUUpLCAiRVJST1JfR0VUVElOR19USU1FIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9FUlJPUl9MT0FESU5HX1NFQ1RJT04pLCAiRVJST1JfTE9BRElOR19TRUNUSU9OIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9FUlJPUl9QQVJTSU5HX1NFVF9FTEVNRU5UKSwgIkVSUk9SX1BBUlNJTkdfU0VUX0VMRU1FTlQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX0VSUk9SX1NFVFRJTkdfQ0lQSEVSX1BBUkFNUyksICJFUlJPUl9TRVRUSU5HX0NJUEhFUl9QQVJBTVMifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX0VYUEVDVElOR19BTl9BU04xX1NFUVVFTkNFKSwgIkVYUEVDVElOR19BTl9BU04xX1NFUVVFTkNFIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9FWFBFQ1RJTkdfQU5fSU5URUdFUiksICJFWFBFQ1RJTkdfQU5fSU5URUdFUiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfRVhQRUNUSU5HX0FOX09CSkVDVCksICJFWFBFQ1RJTkdfQU5fT0JKRUNUIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9FWFBFQ1RJTkdfQV9CT09MRUFOKSwgIkVYUEVDVElOR19BX0JPT0xFQU4ifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX0VYUEVDVElOR19BX1RJTUUpLCAiRVhQRUNUSU5HX0FfVElNRSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfRVhQTElDSVRfTEVOR1RIX01JU01BVENIKSwgIkVYUExJQ0lUX0xFTkdUSF9NSVNNQVRDSCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfRVhQTElDSVRfVEFHX05PVF9DT05TVFJVQ1RFRCksICJFWFBMSUNJVF9UQUdfTk9UX0NPTlNUUlVDVEVEIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9GSUVMRF9NSVNTSU5HKSwgIkZJRUxEX01JU1NJTkcifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX0ZJUlNUX05VTV9UT09fTEFSR0UpLCAiRklSU1RfTlVNX1RPT19MQVJHRSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfSEVBREVSX1RPT19MT05HKSwgIkhFQURFUl9UT09fTE9ORyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfSUxMRUdBTF9CSVRTVFJJTkdfRk9STUFUKSwgIklMTEVHQUxfQklUU1RSSU5HX0ZPUk1BVCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfSUxMRUdBTF9CT09MRUFOKSwgIklMTEVHQUxfQk9PTEVBTiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfSUxMRUdBTF9DSEFSQUNURVJTKSwgIklMTEVHQUxfQ0hBUkFDVEVSUyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfSUxMRUdBTF9GT1JNQVQpLCAiSUxMRUdBTF9GT1JNQVQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX0lMTEVHQUxfSEVYKSwgIklMTEVHQUxfSEVYIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9JTExFR0FMX0lNUExJQ0lUX1RBRyksICJJTExFR0FMX0lNUExJQ0lUX1RBRyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfSUxMRUdBTF9JTlRFR0VSKSwgIklMTEVHQUxfSU5URUdFUiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfSUxMRUdBTF9ORVNURURfVEFHR0lORyksICJJTExFR0FMX05FU1RFRF9UQUdHSU5HIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9JTExFR0FMX05VTEwpLCAiSUxMRUdBTF9OVUxMIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9JTExFR0FMX05VTExfVkFMVUUpLCAiSUxMRUdBTF9OVUxMX1ZBTFVFIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9JTExFR0FMX09CSkVDVCksICJJTExFR0FMX09CSkVDVCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfSUxMRUdBTF9PUFRJT05BTF9BTlkpLCAiSUxMRUdBTF9PUFRJT05BTF9BTlkifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX0lMTEVHQUxfT1BUSU9OU19PTl9JVEVNX1RFTVBMQVRFKSwgIklMTEVHQUxfT1BUSU9OU19PTl9JVEVNX1RFTVBMQVRFIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9JTExFR0FMX1RBR0dFRF9BTlkpLCAiSUxMRUdBTF9UQUdHRURfQU5ZIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9JTExFR0FMX1RJTUVfVkFMVUUpLCAiSUxMRUdBTF9USU1FX1ZBTFVFIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9JTlRFR0VSX05PVF9BU0NJSV9GT1JNQVQpLCAiSU5URUdFUl9OT1RfQVNDSUlfRk9STUFUIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9JTlRFR0VSX1RPT19MQVJHRV9GT1JfTE9ORyksICJJTlRFR0VSX1RPT19MQVJHRV9GT1JfTE9ORyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfSU5WQUxJRF9CTVBTVFJJTkdfTEVOR1RIKSwgIklOVkFMSURfQk1QU1RSSU5HX0xFTkdUSCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfSU5WQUxJRF9ESUdJVCksICJJTlZBTElEX0RJR0lUIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9JTlZBTElEX01JTUVfVFlQRSksICJJTlZBTElEX01JTUVfVFlQRSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfSU5WQUxJRF9NT0RJRklFUiksICJJTlZBTElEX01PRElGSUVSIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9JTlZBTElEX05VTUJFUiksICJJTlZBTElEX05VTUJFUiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfSU5WQUxJRF9PQkpFQ1RfRU5DT0RJTkcpLCAiSU5WQUxJRF9PQkpFQ1RfRU5DT0RJTkcifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX0lOVkFMSURfU0VQQVJBVE9SKSwgIklOVkFMSURfU0VQQVJBVE9SIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9JTlZBTElEX1RJTUVfRk9STUFUKSwgIklOVkFMSURfVElNRV9GT1JNQVQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX0lOVkFMSURfVU5JVkVSU0FMU1RSSU5HX0xFTkdUSCksICJJTlZBTElEX1VOSVZFUlNBTFNUUklOR19MRU5HVEgifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX0lOVkFMSURfVVRGOFNUUklORyksICJJTlZBTElEX1VURjhTVFJJTkcifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX0lWX1RPT19MQVJHRSksICJJVl9UT09fTEFSR0UifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX0xFTkdUSF9FUlJPUiksICJMRU5HVEhfRVJST1IifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX0xJU1RfRVJST1IpLCAiTElTVF9FUlJPUiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfTUFMTE9DX0ZBSUxVUkUpLCAiTUFMTE9DX0ZBSUxVUkUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX01JTUVfTk9fQ09OVEVOVF9UWVBFKSwgIk1JTUVfTk9fQ09OVEVOVF9UWVBFIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9NSU1FX1BBUlNFX0VSUk9SKSwgIk1JTUVfUEFSU0VfRVJST1IifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX01JTUVfU0lHX1BBUlNFX0VSUk9SKSwgIk1JTUVfU0lHX1BBUlNFX0VSUk9SIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9NSVNTSU5HX0FTTjFfRU9TKSwgIk1JU1NJTkdfQVNOMV9FT1MifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX01JU1NJTkdfRU9DKSwgIk1JU1NJTkdfRU9DIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9NSVNTSU5HX1NFQ09ORF9OVU1CRVIpLCAiTUlTU0lOR19TRUNPTkRfTlVNQkVSIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9NSVNTSU5HX1ZBTFVFKSwgIk1JU1NJTkdfVkFMVUUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX01TVFJJTkdfTk9UX1VOSVZFUlNBTCksICJNU1RSSU5HX05PVF9VTklWRVJTQUwifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX01TVFJJTkdfV1JPTkdfVEFHKSwgIk1TVFJJTkdfV1JPTkdfVEFHIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9ORVNURURfQVNOMV9FUlJPUiksICJORVNURURfQVNOMV9FUlJPUiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfTkVTVEVEX0FTTjFfU1RSSU5HKSwgIk5FU1RFRF9BU04xX1NUUklORyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfTk9OX0hFWF9DSEFSQUNURVJTKSwgIk5PTl9IRVhfQ0hBUkFDVEVSUyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfTk9UX0FTQ0lJX0ZPUk1BVCksICJOT1RfQVNDSUlfRk9STUFUIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9OT1RfRU5PVUdIX0RBVEEpLCAiTk9UX0VOT1VHSF9EQVRBIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9OT19DT05URU5UX1RZUEUpLCAiTk9fQ09OVEVOVF9UWVBFIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9OT19ERUZBVUxUX0RJR0VTVCksICJOT19ERUZBVUxUX0RJR0VTVCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfTk9fTUFUQ0hJTkdfQ0hPSUNFX1RZUEUpLCAiTk9fTUFUQ0hJTkdfQ0hPSUNFX1RZUEUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX05PX01VTFRJUEFSVF9CT0RZX0ZBSUxVUkUpLCAiTk9fTVVMVElQQVJUX0JPRFlfRkFJTFVSRSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfTk9fTVVMVElQQVJUX0JPVU5EQVJZKSwgIk5PX01VTFRJUEFSVF9CT1VOREFSWSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfTk9fU0lHX0NPTlRFTlRfVFlQRSksICJOT19TSUdfQ09OVEVOVF9UWVBFIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9OVUxMX0lTX1dST05HX0xFTkdUSCksICJOVUxMX0lTX1dST05HX0xFTkdUSCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfT0JKRUNUX05PVF9BU0NJSV9GT1JNQVQpLCAiT0JKRUNUX05PVF9BU0NJSV9GT1JNQVQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX09ERF9OVU1CRVJfT0ZfQ0hBUlMpLCAiT0REX05VTUJFUl9PRl9DSEFSUyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfUFJJVkFURV9LRVlfSEVBREVSX01JU1NJTkcpLCAiUFJJVkFURV9LRVlfSEVBREVSX01JU1NJTkcifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX1NFQ09ORF9OVU1CRVJfVE9PX0xBUkdFKSwgIlNFQ09ORF9OVU1CRVJfVE9PX0xBUkdFIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9TRVFVRU5DRV9MRU5HVEhfTUlTTUFUQ0gpLCAiU0VRVUVOQ0VfTEVOR1RIX01JU01BVENIIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9TRVFVRU5DRV9OT1RfQ09OU1RSVUNURUQpLCAiU0VRVUVOQ0VfTk9UX0NPTlNUUlVDVEVEIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9TRVFVRU5DRV9PUl9TRVRfTkVFRFNfQ09ORklHKSwgIlNFUVVFTkNFX09SX1NFVF9ORUVEU19DT05GSUcifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX1NIT1JUX0xJTkUpLCAiU0hPUlRfTElORSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfU0lHX0lOVkFMSURfTUlNRV9UWVBFKSwgIlNJR19JTlZBTElEX01JTUVfVFlQRSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfU1RSRUFNSU5HX05PVF9TVVBQT1JURUQpLCAiU1RSRUFNSU5HX05PVF9TVVBQT1JURUQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX1NUUklOR19UT09fTE9ORyksICJTVFJJTkdfVE9PX0xPTkcifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX1NUUklOR19UT09fU0hPUlQpLCAiU1RSSU5HX1RPT19TSE9SVCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfVEFHX1ZBTFVFX1RPT19ISUdIKSwgIlRBR19WQUxVRV9UT09fSElHSCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfVEhFX0FTTjFfT0JKRUNUX0lERU5USUZJRVJfSVNfTk9UX0tOT1dOX0ZPUl9USElTX01EKSwgIlRIRV9BU04xX09CSkVDVF9JREVOVElGSUVSX0lTX05PVF9LTk9XTl9GT1JfVEhJU19NRCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfVElNRV9OT1RfQVNDSUlfRk9STUFUKSwgIlRJTUVfTk9UX0FTQ0lJX0ZPUk1BVCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfVE9PX0xPTkcpLCAiVE9PX0xPTkcifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX1RZUEVfTk9UX0NPTlNUUlVDVEVEKSwgIlRZUEVfTk9UX0NPTlNUUlVDVEVEIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9VTkFCTEVfVE9fREVDT0RFX1JTQV9LRVkpLCAiVU5BQkxFX1RPX0RFQ09ERV9SU0FfS0VZIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9VTkFCTEVfVE9fREVDT0RFX1JTQV9QUklWQVRFX0tFWSksICJVTkFCTEVfVE9fREVDT0RFX1JTQV9QUklWQVRFX0tFWSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfVU5FWFBFQ1RFRF9FT0MpLCAiVU5FWFBFQ1RFRF9FT0MifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX1VOSVZFUlNBTFNUUklOR19JU19XUk9OR19MRU5HVEgpLCAiVU5JVkVSU0FMU1RSSU5HX0lTX1dST05HX0xFTkdUSCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfVU5LTk9XTl9GT1JNQVQpLCAiVU5LTk9XTl9GT1JNQVQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX1VOS05PV05fTUVTU0FHRV9ESUdFU1RfQUxHT1JJVEhNKSwgIlVOS05PV05fTUVTU0FHRV9ESUdFU1RfQUxHT1JJVEhNIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9VTktOT1dOX09CSkVDVF9UWVBFKSwgIlVOS05PV05fT0JKRUNUX1RZUEUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX1VOS05PV05fUFVCTElDX0tFWV9UWVBFKSwgIlVOS05PV05fUFVCTElDX0tFWV9UWVBFIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9VTktOT1dOX1NJR05BVFVSRV9BTEdPUklUSE0pLCAiVU5LTk9XTl9TSUdOQVRVUkVfQUxHT1JJVEhNIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9VTktOT1dOX1RBRyksICJVTktOT1dOX1RBRyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9BU04xLCAwLCBBU04xX1JfVU5LT1dOX0ZPUk1BVCksICJVTktPV05fRk9STUFUIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9VTlNVUFBPUlRFRF9BTllfREVGSU5FRF9CWV9UWVBFKSwgIlVOU1VQUE9SVEVEX0FOWV9ERUZJTkVEX0JZX1RZUEUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX1VOU1VQUE9SVEVEX0NJUEhFUiksICJVTlNVUFBPUlRFRF9DSVBIRVIifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX1VOU1VQUE9SVEVEX0VOQ1JZUFRJT05fQUxHT1JJVEhNKSwgIlVOU1VQUE9SVEVEX0VOQ1JZUFRJT05fQUxHT1JJVEhNIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9VTlNVUFBPUlRFRF9QVUJMSUNfS0VZX1RZUEUpLCAiVU5TVVBQT1JURURfUFVCTElDX0tFWV9UWVBFIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0FTTjEsIDAsIEFTTjFfUl9VTlNVUFBPUlRFRF9UWVBFKSwgIlVOU1VQUE9SVEVEX1RZUEUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX1dST05HX1BVQkxJQ19LRVlfVFlQRSksICJXUk9OR19QVUJMSUNfS0VZX1RZUEUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX1dST05HX1RBRyksICJXUk9OR19UQUcifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQVNOMSwgMCwgQVNOMV9SX1dST05HX1RZUEUpLCAiV1JPTkdfVFlQRSJ9LAorICB7MCwgTlVMTH0sCit9OwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FzbjEvYXNuMV9saWIuYyBiL2NyeXB0by9hc24xL2FzbjFfbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E3MjA5ZQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9hc24xL2FzbjFfbGliLmMKQEAgLTAsMCArMSw0ODMgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorCitPUEVOU1NMX0RFQ0xBUkVfRVJST1JfUkVBU09OKEFTTjEsIE1BTExPQ19GQUlMVVJFKTsKKworCitzdGF0aWMgaW50IGFzbjFfZ2V0X2xlbmd0aChjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsaW50ICppbmYsbG9uZyAqcmwsaW50IG1heCk7CitzdGF0aWMgdm9pZCBhc24xX3B1dF9sZW5ndGgodW5zaWduZWQgY2hhciAqKnBwLCBpbnQgbGVuZ3RoKTsKKworc3RhdGljIGludCBfYXNuMV9jaGVja19pbmZpbml0ZV9lbmQoY29uc3QgdW5zaWduZWQgY2hhciAqKnAsIGxvbmcgbGVuKQorCXsKKwkvKiBJZiB0aGVyZSBpcyAwIG9yIDEgYnl0ZSBsZWZ0LCB0aGUgbGVuZ3RoIGNoZWNrIHNob3VsZCBwaWNrCisJICogdGhpbmdzIHVwICovCisJaWYgKGxlbiA8PSAwKQorCQlyZXR1cm4oMSk7CisJZWxzZSBpZiAoKGxlbiA+PSAyKSAmJiAoKCpwKVswXSA9PSAwKSAmJiAoKCpwKVsxXSA9PSAwKSkKKwkJeworCQkoKnApKz0yOworCQlyZXR1cm4oMSk7CisJCX0KKwlyZXR1cm4oMCk7CisJfQorCitpbnQgQVNOMV9jaGVja19pbmZpbml0ZV9lbmQodW5zaWduZWQgY2hhciAqKnAsIGxvbmcgbGVuKQorCXsKKwlyZXR1cm4gX2FzbjFfY2hlY2tfaW5maW5pdGVfZW5kKChjb25zdCB1bnNpZ25lZCBjaGFyICoqKXAsIGxlbik7CisJfQorCitpbnQgQVNOMV9jb25zdF9jaGVja19pbmZpbml0ZV9lbmQoY29uc3QgdW5zaWduZWQgY2hhciAqKnAsIGxvbmcgbGVuKQorCXsKKwlyZXR1cm4gX2FzbjFfY2hlY2tfaW5maW5pdGVfZW5kKHAsIGxlbik7CisJfQorCisKK2ludCBBU04xX2dldF9vYmplY3QoY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLCBsb25nICpwbGVuZ3RoLCBpbnQgKnB0YWcsCisJaW50ICpwY2xhc3MsIGxvbmcgb21heCkKKwl7CisJaW50IGkscmV0OworCWxvbmcgbDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwPSAqcHA7CisJaW50IHRhZyx4Y2xhc3MsaW5mOworCWxvbmcgbWF4PW9tYXg7CisKKwlpZiAoIW1heCkgZ290byBlcnI7CisJcmV0PSgqcCZWX0FTTjFfQ09OU1RSVUNURUQpOworCXhjbGFzcz0oKnAmVl9BU04xX1BSSVZBVEUpOworCWk9ICpwJlZfQVNOMV9QUklNSVRJVkVfVEFHOworCWlmIChpID09IFZfQVNOMV9QUklNSVRJVkVfVEFHKQorCQl7CQkvKiBoaWdoLXRhZyAqLworCQlwKys7CisJCWlmICgtLW1heCA9PSAwKSBnb3RvIGVycjsKKwkJbD0wOworCQl3aGlsZSAoKnAmMHg4MCkKKwkJCXsKKwkJCWw8PD03TDsKKwkJCWx8PSAqKHArKykmMHg3ZjsKKwkJCWlmICgtLW1heCA9PSAwKSBnb3RvIGVycjsKKwkJCWlmIChsID4gKElOVF9NQVggPj4gN0wpKSBnb3RvIGVycjsKKwkJCX0KKwkJbDw8PTdMOworCQlsfD0gKihwKyspJjB4N2Y7CisJCXRhZz0oaW50KWw7CisJCWlmICgtLW1heCA9PSAwKSBnb3RvIGVycjsKKwkJfQorCWVsc2UKKwkJeyAKKwkJdGFnPWk7CisJCXArKzsKKwkJaWYgKC0tbWF4ID09IDApIGdvdG8gZXJyOworCQl9CisJKnB0YWc9dGFnOworCSpwY2xhc3M9eGNsYXNzOworCWlmICghYXNuMV9nZXRfbGVuZ3RoKCZwLCZpbmYscGxlbmd0aCwoaW50KW1heCkpIGdvdG8gZXJyOworCisjaWYgMAorCWZwcmludGYoc3RkZXJyLCJwPSVkICsgKnBsZW5ndGg9JWxkID4gb21heD0lbGQgKyAqcHA9JWQgICglZCA+ICVkKVxuIiwgCisJCShpbnQpcCwqcGxlbmd0aCxvbWF4LChpbnQpKnBwLChpbnQpKHArICpwbGVuZ3RoKSwKKwkJKGludCkob21heCsgKnBwKSk7CisKKyNlbmRpZgorCWlmICgqcGxlbmd0aCA+IChvbWF4IC0gKHAgLSAqcHApKSkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2dldF9vYmplY3QsIEFTTjFfUl9UT09fTE9ORyk7CisJCS8qIFNldCB0aGlzIHNvIHRoYXQgZXZlbiBpZiB0aGluZ3MgYXJlIG5vdCBsb25nIGVub3VnaAorCQkgKiB0aGUgdmFsdWVzIGFyZSBzZXQgY29ycmVjdGx5ICovCisJCXJldHw9MHg4MDsKKwkJfQorCSpwcD1wOworCXJldHVybihyZXR8aW5mKTsKK2VycjoKKwlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2dldF9vYmplY3QsIEFTTjFfUl9IRUFERVJfVE9PX0xPTkcpOworCXJldHVybigweDgwKTsKKwl9CisKK3N0YXRpYyBpbnQgYXNuMV9nZXRfbGVuZ3RoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwgaW50ICppbmYsIGxvbmcgKnJsLCBpbnQgbWF4KQorCXsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwPSAqcHA7CisJdW5zaWduZWQgbG9uZyByZXQ9MDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmIChtYXgtLSA8IDEpIHJldHVybigwKTsKKwlpZiAoKnAgPT0gMHg4MCkKKwkJeworCQkqaW5mPTE7CisJCXJldD0wOworCQlwKys7CisJCX0KKwllbHNlCisJCXsKKwkJKmluZj0wOworCQlpPSAqcCYweDdmOworCQlpZiAoKihwKyspICYgMHg4MCkKKwkJCXsKKwkJCWlmIChpID4gc2l6ZW9mKGxvbmcpKQorCQkJCXJldHVybiAwOworCQkJaWYgKG1heC0tID09IDApIHJldHVybigwKTsKKwkJCXdoaWxlIChpLS0gPiAwKQorCQkJCXsKKwkJCQlyZXQ8PD04TDsKKwkJCQlyZXR8PSAqKHArKyk7CisJCQkJaWYgKG1heC0tID09IDApIHJldHVybigwKTsKKwkJCQl9CisJCQl9CisJCWVsc2UKKwkJCXJldD1pOworCQl9CisJaWYgKHJldCA+IExPTkdfTUFYKQorCQlyZXR1cm4gMDsKKwkqcHA9cDsKKwkqcmw9KGxvbmcpcmV0OworCXJldHVybigxKTsKKwl9CisKKy8qIGNsYXNzIDAgaXMgY29uc3RydWN0ZWQKKyAqIGNvbnN0cnVjdGVkID09IDIgZm9yIGluZGVmaW5pdGUgbGVuZ3RoIGNvbnN0cnVjdGVkICovCit2b2lkIEFTTjFfcHV0X29iamVjdCh1bnNpZ25lZCBjaGFyICoqcHAsIGludCBjb25zdHJ1Y3RlZCwgaW50IGxlbmd0aCwgaW50IHRhZywKKwkgICAgIGludCB4Y2xhc3MpCisJeworCXVuc2lnbmVkIGNoYXIgKnA9ICpwcDsKKwlpbnQgaSwgdHRhZzsKKworCWk9KGNvbnN0cnVjdGVkKT9WX0FTTjFfQ09OU1RSVUNURUQ6MDsKKwlpfD0oeGNsYXNzJlZfQVNOMV9QUklWQVRFKTsKKwlpZiAodGFnIDwgMzEpCisJCSoocCsrKT1pfCh0YWcmVl9BU04xX1BSSU1JVElWRV9UQUcpOworCWVsc2UKKwkJeworCQkqKHArKyk9aXxWX0FTTjFfUFJJTUlUSVZFX1RBRzsKKwkJZm9yKGkgPSAwLCB0dGFnID0gdGFnOyB0dGFnID4gMDsgaSsrKSB0dGFnID4+PTc7CisJCXR0YWcgPSBpOworCQl3aGlsZShpLS0gPiAwKQorCQkJeworCQkJcFtpXSA9IHRhZyAmIDB4N2Y7CisJCQlpZihpICE9ICh0dGFnIC0gMSkpIHBbaV0gfD0gMHg4MDsKKwkJCXRhZyA+Pj0gNzsKKwkJCX0KKwkJcCArPSB0dGFnOworCQl9CisJaWYgKGNvbnN0cnVjdGVkID09IDIpCisJCSoocCsrKT0weDgwOworCWVsc2UKKwkJYXNuMV9wdXRfbGVuZ3RoKCZwLGxlbmd0aCk7CisJKnBwPXA7CisJfQorCitpbnQgQVNOMV9wdXRfZW9jKHVuc2lnbmVkIGNoYXIgKipwcCkKKwl7CisJdW5zaWduZWQgY2hhciAqcCA9ICpwcDsKKwkqcCsrID0gMDsKKwkqcCsrID0gMDsKKwkqcHAgPSBwOworCXJldHVybiAyOworCX0KKworc3RhdGljIHZvaWQgYXNuMV9wdXRfbGVuZ3RoKHVuc2lnbmVkIGNoYXIgKipwcCwgaW50IGxlbmd0aCkKKwl7CisJdW5zaWduZWQgY2hhciAqcD0gKnBwOworCWludCBpLGw7CisJaWYgKGxlbmd0aCA8PSAxMjcpCisJCSoocCsrKT0odW5zaWduZWQgY2hhcilsZW5ndGg7CisJZWxzZQorCQl7CisJCWw9bGVuZ3RoOworCQlmb3IgKGk9MDsgbCA+IDA7IGkrKykKKwkJCWw+Pj04OworCQkqKHArKyk9aXwweDgwOworCQlsPWk7CisJCXdoaWxlIChpLS0gPiAwKQorCQkJeworCQkJcFtpXT1sZW5ndGgmMHhmZjsKKwkJCWxlbmd0aD4+PTg7CisJCQl9CisJCXArPWw7CisJCX0KKwkqcHA9cDsKKwl9CisKK2ludCBBU04xX29iamVjdF9zaXplKGludCBjb25zdHJ1Y3RlZCwgaW50IGxlbmd0aCwgaW50IHRhZykKKwl7CisJaW50IHJldDsKKworCXJldD1sZW5ndGg7CisJcmV0Kys7CisJaWYgKHRhZyA+PSAzMSkKKwkJeworCQl3aGlsZSAodGFnID4gMCkKKwkJCXsKKwkJCXRhZz4+PTc7CisJCQlyZXQrKzsKKwkJCX0KKwkJfQorCWlmIChjb25zdHJ1Y3RlZCA9PSAyKQorCQlyZXR1cm4gcmV0ICsgMzsKKwlyZXQrKzsKKwlpZiAobGVuZ3RoID4gMTI3KQorCQl7CisJCXdoaWxlIChsZW5ndGggPiAwKQorCQkJeworCQkJbGVuZ3RoPj49ODsKKwkJCXJldCsrOworCQkJfQorCQl9CisJcmV0dXJuKHJldCk7CisJfQorCitzdGF0aWMgaW50IF9hc24xX0ZpbmlzaChBU04xX2NvbnN0X0NUWCAqYykKKwl7CisJaWYgKChjLT5pbmYgPT0gKDF8Vl9BU04xX0NPTlNUUlVDVEVEKSkgJiYgKCFjLT5lb3MpKQorCQl7CisJCWlmICghQVNOMV9jb25zdF9jaGVja19pbmZpbml0ZV9lbmQoJmMtPnAsYy0+c2xlbikpCisJCQl7CisJCQljLT5lcnJvcj1BU04xX1JfTUlTU0lOR19BU04xX0VPUzsKKwkJCXJldHVybigwKTsKKwkJCX0KKwkJfQorCWlmICgJKChjLT5zbGVuICE9IDApICYmICEoYy0+aW5mICYgMSkpIHx8CisJCSgoYy0+c2xlbiA8IDApICYmIChjLT5pbmYgJiAxKSkpCisJCXsKKwkJYy0+ZXJyb3I9QVNOMV9SX0FTTjFfTEVOR1RIX01JU01BVENIOworCQlyZXR1cm4oMCk7CisJCX0KKwlyZXR1cm4oMSk7CisJfQorCitpbnQgYXNuMV9GaW5pc2goQVNOMV9DVFggKmMpCisJeworCXJldHVybiBfYXNuMV9GaW5pc2goKEFTTjFfY29uc3RfQ1RYICopYyk7CisJfQorCitpbnQgYXNuMV9jb25zdF9GaW5pc2goQVNOMV9jb25zdF9DVFggKmMpCisJeworCXJldHVybiBfYXNuMV9GaW5pc2goYyk7CisJfQorCitpbnQgYXNuMV9HZXRTZXF1ZW5jZShBU04xX2NvbnN0X0NUWCAqYywgbG9uZyAqbGVuZ3RoKQorCXsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpxOworCisJcT1jLT5wOworCWMtPmluZj1BU04xX2dldF9vYmplY3QoJihjLT5wKSwmKGMtPnNsZW4pLCYoYy0+dGFnKSwmKGMtPnhjbGFzcyksCisJCSpsZW5ndGgpOworCWlmIChjLT5pbmYgJiAweDgwKQorCQl7CisJCWMtPmVycm9yPUFTTjFfUl9CQURfR0VUX0FTTjFfT0JKRUNUX0NBTEw7CisJCXJldHVybigwKTsKKwkJfQorCWlmIChjLT50YWcgIT0gVl9BU04xX1NFUVVFTkNFKQorCQl7CisJCWMtPmVycm9yPUFTTjFfUl9FWFBFQ1RJTkdfQU5fQVNOMV9TRVFVRU5DRTsKKwkJcmV0dXJuKDApOworCQl9CisJKCpsZW5ndGgpLT0oYy0+cC1xKTsKKwlpZiAoYy0+bWF4ICYmICgqbGVuZ3RoIDwgMCkpCisJCXsKKwkJYy0+ZXJyb3I9QVNOMV9SX0FTTjFfTEVOR1RIX01JU01BVENIOworCQlyZXR1cm4oMCk7CisJCX0KKwlpZiAoYy0+aW5mID09ICgxfFZfQVNOMV9DT05TVFJVQ1RFRCkpCisJCWMtPnNsZW49ICpsZW5ndGgrICooYy0+cHApLWMtPnA7CisJYy0+ZW9zPTA7CisJcmV0dXJuKDEpOworCX0KKworaW50IEFTTjFfU1RSSU5HX2NvcHkoQVNOMV9TVFJJTkcgKmRzdCwgY29uc3QgQVNOMV9TVFJJTkcgKnN0cikKKwl7CisJaWYgKHN0ciA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlkc3QtPnR5cGUgPSBzdHItPnR5cGU7CisJaWYgKCFBU04xX1NUUklOR19zZXQoZHN0LHN0ci0+ZGF0YSxzdHItPmxlbmd0aCkpCisJCXJldHVybiAwOworCWRzdC0+ZmxhZ3MgPSBzdHItPmZsYWdzOworCXJldHVybiAxOworCX0KKworQVNOMV9TVFJJTkcgKkFTTjFfU1RSSU5HX2R1cChjb25zdCBBU04xX1NUUklORyAqc3RyKQorCXsKKwlBU04xX1NUUklORyAqcmV0OworCWlmICghc3RyKQorCQkgcmV0dXJuIE5VTEw7CisJcmV0PUFTTjFfU1RSSU5HX25ldygpOworCWlmICghcmV0KQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoIUFTTjFfU1RSSU5HX2NvcHkocmV0LHN0cikpCisJCXsKKwkJQVNOMV9TVFJJTkdfZnJlZShyZXQpOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCXJldHVybiByZXQ7CisJfQorCitpbnQgQVNOMV9TVFJJTkdfc2V0KEFTTjFfU1RSSU5HICpzdHIsIGNvbnN0IHZvaWQgKl9kYXRhLCBpbnQgbGVuKQorCXsKKwl1bnNpZ25lZCBjaGFyICpjOworCWNvbnN0IGNoYXIgKmRhdGE9X2RhdGE7CisKKwlpZiAobGVuIDwgMCkKKwkJeworCQlpZiAoZGF0YSA9PSBOVUxMKQorCQkJcmV0dXJuKDApOworCQllbHNlCisJCQlsZW49c3RybGVuKGRhdGEpOworCQl9CisJaWYgKChzdHItPmxlbmd0aCA8IGxlbikgfHwgKHN0ci0+ZGF0YSA9PSBOVUxMKSkKKwkJeworCQljPXN0ci0+ZGF0YTsKKwkJaWYgKGMgPT0gTlVMTCkKKwkJCXN0ci0+ZGF0YT1PUEVOU1NMX21hbGxvYyhsZW4rMSk7CisJCWVsc2UKKwkJCXN0ci0+ZGF0YT1PUEVOU1NMX3JlYWxsb2MoYyxsZW4rMSk7CisKKwkJaWYgKHN0ci0+ZGF0YSA9PSBOVUxMKQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9TVFJJTkdfc2V0LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlzdHItPmRhdGE9YzsKKwkJCXJldHVybigwKTsKKwkJCX0KKwkJfQorCXN0ci0+bGVuZ3RoPWxlbjsKKwlpZiAoZGF0YSAhPSBOVUxMKQorCQl7CisJCW1lbWNweShzdHItPmRhdGEsZGF0YSxsZW4pOworCQkvKiBhbiBhbGxvd2FuY2UgZm9yIHN0cmluZ3MgOi0pICovCisJCXN0ci0+ZGF0YVtsZW5dPSdcMCc7CisJCX0KKwlyZXR1cm4oMSk7CisJfQorCit2b2lkIEFTTjFfU1RSSU5HX3NldDAoQVNOMV9TVFJJTkcgKnN0ciwgdm9pZCAqZGF0YSwgaW50IGxlbikKKwl7CisJaWYgKHN0ci0+ZGF0YSkKKwkJT1BFTlNTTF9mcmVlKHN0ci0+ZGF0YSk7CisJc3RyLT5kYXRhID0gZGF0YTsKKwlzdHItPmxlbmd0aCA9IGxlbjsKKwl9CisKK0FTTjFfU1RSSU5HICpBU04xX1NUUklOR19uZXcodm9pZCkKKwl7CisJcmV0dXJuKEFTTjFfU1RSSU5HX3R5cGVfbmV3KFZfQVNOMV9PQ1RFVF9TVFJJTkcpKTsKKwl9CisKKworQVNOMV9TVFJJTkcgKkFTTjFfU1RSSU5HX3R5cGVfbmV3KGludCB0eXBlKQorCXsKKwlBU04xX1NUUklORyAqcmV0OworCisJcmV0PShBU04xX1NUUklORyAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihBU04xX1NUUklORykpOworCWlmIChyZXQgPT0gTlVMTCkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1NUUklOR190eXBlX25ldywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4oTlVMTCk7CisJCX0KKwlyZXQtPmxlbmd0aD0wOworCXJldC0+dHlwZT10eXBlOworCXJldC0+ZGF0YT1OVUxMOworCXJldC0+ZmxhZ3M9MDsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK3ZvaWQgQVNOMV9TVFJJTkdfZnJlZShBU04xX1NUUklORyAqYSkKKwl7CisJaWYgKGEgPT0gTlVMTCkgcmV0dXJuOworCWlmIChhLT5kYXRhICYmICEoYS0+ZmxhZ3MgJiBBU04xX1NUUklOR19GTEFHX05ERUYpKQorCQlPUEVOU1NMX2ZyZWUoYS0+ZGF0YSk7CisJT1BFTlNTTF9mcmVlKGEpOworCX0KKworaW50IEFTTjFfU1RSSU5HX2NtcChjb25zdCBBU04xX1NUUklORyAqYSwgY29uc3QgQVNOMV9TVFJJTkcgKmIpCisJeworCWludCBpOworCisJaT0oYS0+bGVuZ3RoLWItPmxlbmd0aCk7CisJaWYgKGkgPT0gMCkKKwkJeworCQlpPW1lbWNtcChhLT5kYXRhLGItPmRhdGEsYS0+bGVuZ3RoKTsKKwkJaWYgKGkgPT0gMCkKKwkJCXJldHVybihhLT50eXBlLWItPnR5cGUpOworCQllbHNlCisJCQlyZXR1cm4oaSk7CisJCX0KKwllbHNlCisJCXJldHVybihpKTsKKwl9CisKK3ZvaWQgYXNuMV9hZGRfZXJyb3IoY29uc3QgdW5zaWduZWQgY2hhciAqYWRkcmVzcywgaW50IG9mZnNldCkKKwl7CisJY2hhciBidWYxW0RFQ0lNQUxfU0laRShhZGRyZXNzKSsxXSxidWYyW0RFQ0lNQUxfU0laRShvZmZzZXQpKzFdOworCisJQklPX3NucHJpbnRmKGJ1ZjEsc2l6ZW9mIGJ1ZjEsIiVsdSIsKHVuc2lnbmVkIGxvbmcpYWRkcmVzcyk7CisJQklPX3NucHJpbnRmKGJ1ZjIsc2l6ZW9mIGJ1ZjIsIiVkIixvZmZzZXQpOworCUVSUl9hZGRfZXJyb3JfZGF0YSg0LCJhZGRyZXNzPSIsYnVmMSwiIG9mZnNldD0iLGJ1ZjIpOworCX0KKworaW50IEFTTjFfU1RSSU5HX2xlbmd0aChjb25zdCBBU04xX1NUUklORyAqeCkKK3sgcmV0dXJuIE1fQVNOMV9TVFJJTkdfbGVuZ3RoKHgpOyB9CisKK3ZvaWQgQVNOMV9TVFJJTkdfbGVuZ3RoX3NldChBU04xX1NUUklORyAqeCwgaW50IGxlbikKK3sgTV9BU04xX1NUUklOR19sZW5ndGhfc2V0KHgsIGxlbik7IHJldHVybjsgfQorCitpbnQgQVNOMV9TVFJJTkdfdHlwZShBU04xX1NUUklORyAqeCkKK3sgcmV0dXJuIE1fQVNOMV9TVFJJTkdfdHlwZSh4KTsgfQorCit1bnNpZ25lZCBjaGFyICogQVNOMV9TVFJJTkdfZGF0YShBU04xX1NUUklORyAqeCkKK3sgcmV0dXJuIE1fQVNOMV9TVFJJTkdfZGF0YSh4KTsgfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FzbjEvYXNuMV9sb2NsLmggYi9jcnlwdG8vYXNuMS9hc24xX2xvY2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDQ0MzkwCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2FzbjEvYXNuMV9sb2NsLmgKQEAgLTAsMCArMSw5NSBAQAorLyogYXNuMXQuaCAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDYuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworLyogSW50ZXJuYWwgQVNOMSBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnM6IG5vdCBmb3IgYXBwbGljYXRpb24gdXNlICovCisKK2ludCBhc24xX3V0Y3RpbWVfdG9fdG0oc3RydWN0IHRtICp0bSwgY29uc3QgQVNOMV9VVENUSU1FICpkKTsKK2ludCBhc24xX2dlbmVyYWxpemVkdGltZV90b190bShzdHJ1Y3QgdG0gKnRtLCBjb25zdCBBU04xX0dFTkVSQUxJWkVEVElNRSAqZCk7CisKKy8qIEFTTjEgcHJpbnQgY29udGV4dCBzdHJ1Y3R1cmUgKi8KKworc3RydWN0IGFzbjFfcGN0eF9zdAorCXsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgbm1fZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBjZXJ0X2ZsYWdzOworCXVuc2lnbmVkIGxvbmcgb2lkX2ZsYWdzOworCXVuc2lnbmVkIGxvbmcgc3RyX2ZsYWdzOworCX0gLyogQVNOMV9QQ1RYICovOworCisvKiBBU04xIHB1YmxpYyBrZXkgbWV0aG9kIHN0cnVjdHVyZSAqLworCisKKy8qIE1ldGhvZCB0byBoYW5kbGUgQ1JMIGFjY2Vzcy4KKyAqIEluIGdlbmVyYWwgYSBDUkwgY291bGQgYmUgdmVyeSBsYXJnZSAoc2V2ZXJhbCBNYikgYW5kIGNhbiBjb25zdW1lIGxhcmdlCisgKiBhbW91bnRzIG9mIHJlc291cmNlcyBpZiBzdG9yZWQgaW4gbWVtb3J5IGJ5IG11bHRpcGxlIHByb2Nlc3Nlcy4KKyAqIFRoaXMgbWV0aG9kIGFsbG93cyBnZW5lcmFsIENSTCBvcGVyYXRpb25zIHRvIGJlIHJlZGlyZWN0ZWQgdG8gbW9yZQorICogZWZmaWNpZW50IGNhbGxiYWNrczogZm9yIGV4YW1wbGUgYSBDUkwgZW50cnkgZGF0YWJhc2UuCisgKi8KKworI2RlZmluZSBYNTA5X0NSTF9NRVRIT0RfRFlOQU1JQwkJMQorCitzdHJ1Y3QgeDUwOV9jcmxfbWV0aG9kX3N0CisJeworCWludCBmbGFnczsKKwlpbnQgKCpjcmxfaW5pdCkoWDUwOV9DUkwgKmNybCk7CisJaW50ICgqY3JsX2ZyZWUpKFg1MDlfQ1JMICpjcmwpOworCWludCAoKmNybF9sb29rdXApKFg1MDlfQ1JMICpjcmwsIFg1MDlfUkVWT0tFRCAqKnJldCwKKwkJCQlBU04xX0lOVEVHRVIgKnNlciwgWDUwOV9OQU1FICppc3N1ZXIpOworCWludCAoKmNybF92ZXJpZnkpKFg1MDlfQ1JMICpjcmwsIEVWUF9QS0VZICpwayk7CisJfTsKZGlmZiAtLWdpdCBhL2NyeXB0by9hc24xL2FzbjFfbWFjLmggYi9jcnlwdG8vYXNuMS9hc24xX21hYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2OWJlYTQKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYXNuMS9hc24xX21hYy5oCkBAIC0wLDAgKzEsNTc4IEBACisvKiBjcnlwdG8vYXNuMS9hc24xX21hYy5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpZm5kZWYgSEVBREVSX0FTTjFfTUFDX0gKKyNkZWZpbmUgSEVBREVSX0FTTjFfTUFDX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWZuZGVmIEFTTjFfTUFDX0VSUl9MSUIKKyNkZWZpbmUgQVNOMV9NQUNfRVJSX0xJQglFUlJfTElCX0FTTjEKKyNlbmRpZgorCisjZGVmaW5lIEFTTjFfTUFDX0hfZXJyKGYscixsaW5lKSBcCisJRVJSX3B1dF9lcnJvcihBU04xX01BQ19FUlJfTElCLChmKSwociksX19GSUxFX18sKGxpbmUpKQorCisjZGVmaW5lIE1fQVNOMV9EMklfdmFycyhhLHR5cGUsZnVuYykgXAorCUFTTjFfY29uc3RfQ1RYIGM7IFwKKwl0eXBlIHJldD1OVUxMOyBcCisJXAorCWMucHA9KGNvbnN0IHVuc2lnbmVkIGNoYXIgKiopcHA7IFwKKwljLnE9ICooY29uc3QgdW5zaWduZWQgY2hhciAqKilwcDsgXAorCWMuZXJyb3I9QVNOMV9SX05FU1RFRF9BU04xX0VSUk9SOyBcCisJaWYgKChhID09IE5VTEwpIHx8ICgoKmEpID09IE5VTEwpKSBcCisJCXsgaWYgKChyZXQ9KHR5cGUpZnVuYygpKSA9PSBOVUxMKSBcCisJCQl7IGMubGluZT1fX0xJTkVfXzsgZ290byBlcnI7IH0gfSBcCisJZWxzZQlyZXQ9KCphKTsKKworI2RlZmluZSBNX0FTTjFfRDJJX0luaXQoKSBcCisJYy5wPSAqKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiopcHA7IFwKKwljLm1heD0obGVuZ3RoID09IDApPzA6KGMucCtsZW5ndGgpOworCisjZGVmaW5lIE1fQVNOMV9EMklfRmluaXNoXzIoYSkgXAorCWlmICghYXNuMV9jb25zdF9GaW5pc2goJmMpKSBcCisJCXsgYy5saW5lPV9fTElORV9fOyBnb3RvIGVycjsgfSBcCisJKihjb25zdCB1bnNpZ25lZCBjaGFyICoqKXBwPWMucDsgXAorCWlmIChhICE9IE5VTEwpICgqYSk9cmV0OyBcCisJcmV0dXJuKHJldCk7CisKKyNkZWZpbmUgTV9BU04xX0QySV9GaW5pc2goYSxmdW5jLGUpIFwKKwlNX0FTTjFfRDJJX0ZpbmlzaF8yKGEpOyBcCitlcnI6XAorCUFTTjFfTUFDX0hfZXJyKChlKSxjLmVycm9yLGMubGluZSk7IFwKKwlhc24xX2FkZF9lcnJvcigqKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiopcHAsKGludCkoYy5xLSAqcHApKTsgXAorCWlmICgocmV0ICE9IE5VTEwpICYmICgoYSA9PSBOVUxMKSB8fCAoKmEgIT0gcmV0KSkpIGZ1bmMocmV0KTsgXAorCXJldHVybihOVUxMKQorCisjZGVmaW5lIE1fQVNOMV9EMklfc3RhcnRfc2VxdWVuY2UoKSBcCisJaWYgKCFhc24xX0dldFNlcXVlbmNlKCZjLCZsZW5ndGgpKSBcCisJCXsgYy5saW5lPV9fTElORV9fOyBnb3RvIGVycjsgfQorLyogQmVnaW4gcmVhZGluZyBBU04xIHdpdGhvdXQgYSBzdXJyb3VuZGluZyBzZXF1ZW5jZSAqLworI2RlZmluZSBNX0FTTjFfRDJJX2JlZ2luKCkgXAorCWMuc2xlbiA9IGxlbmd0aDsKKworLyogRW5kIHJlYWRpbmcgQVNOMSB3aXRoIG5vIGNoZWNrIG9uIGxlbmd0aCAqLworI2RlZmluZSBNX0FTTjFfRDJJX0ZpbmlzaF9ub2xlbihhLCBmdW5jLCBlKSBcCisJKnBwPWMucDsgXAorCWlmIChhICE9IE5VTEwpICgqYSk9cmV0OyBcCisJcmV0dXJuKHJldCk7IFwKK2VycjpcCisJQVNOMV9NQUNfSF9lcnIoKGUpLGMuZXJyb3IsYy5saW5lKTsgXAorCWFzbjFfYWRkX2Vycm9yKCpwcCwoaW50KShjLnEtICpwcCkpOyBcCisJaWYgKChyZXQgIT0gTlVMTCkgJiYgKChhID09IE5VTEwpIHx8ICgqYSAhPSByZXQpKSkgZnVuYyhyZXQpOyBcCisJcmV0dXJuKE5VTEwpCisKKyNkZWZpbmUgTV9BU04xX0QySV9lbmRfc2VxdWVuY2UoKSBcCisJKCgoYy5pbmYmMSkgPT0gMCk/KGMuc2xlbiA8PSAwKTogXAorCQkoYy5lb3M9QVNOMV9jb25zdF9jaGVja19pbmZpbml0ZV9lbmQoJmMucCxjLnNsZW4pKSkKKworLyogRG9uJ3QgdXNlIHRoaXMgd2l0aCBkMmlfQVNOMV9CT09MRUFOKCkgKi8KKyNkZWZpbmUgTV9BU04xX0QySV9nZXQoYiwgZnVuYykgXAorCWMucT1jLnA7IFwKKwlpZiAoZnVuYygmKGIpLCZjLnAsYy5zbGVuKSA9PSBOVUxMKSBcCisJCXtjLmxpbmU9X19MSU5FX187IGdvdG8gZXJyOyB9IFwKKwljLnNsZW4tPShjLnAtYy5xKTsKKworLyogRG9uJ3QgdXNlIHRoaXMgd2l0aCBkMmlfQVNOMV9CT09MRUFOKCkgKi8KKyNkZWZpbmUgTV9BU04xX0QySV9nZXRfeCh0eXBlLGIsZnVuYykgXAorCWMucT1jLnA7IFwKKwlpZiAoKChEMklfT0YodHlwZSkpZnVuYykoJihiKSwmYy5wLGMuc2xlbikgPT0gTlVMTCkgXAorCQl7Yy5saW5lPV9fTElORV9fOyBnb3RvIGVycjsgfSBcCisJYy5zbGVuLT0oYy5wLWMucSk7CisKKy8qIHVzZSB0aGlzIGluc3RlYWQgKCkgKi8KKyNkZWZpbmUgTV9BU04xX0QySV9nZXRfaW50KGIsZnVuYykgXAorCWMucT1jLnA7IFwKKwlpZiAoZnVuYygmKGIpLCZjLnAsYy5zbGVuKSA8IDApIFwKKwkJe2MubGluZT1fX0xJTkVfXzsgZ290byBlcnI7IH0gXAorCWMuc2xlbi09KGMucC1jLnEpOworCisjZGVmaW5lIE1fQVNOMV9EMklfZ2V0X29wdChiLGZ1bmMsdHlwZSkgXAorCWlmICgoYy5zbGVuICE9IDApICYmICgoTV9BU04xX25leHQgJiAoflZfQVNOMV9DT05TVFJVQ1RFRCkpIFwKKwkJPT0gKFZfQVNOMV9VTklWRVJTQUx8KHR5cGUpKSkpIFwKKwkJeyBcCisJCU1fQVNOMV9EMklfZ2V0KGIsZnVuYyk7IFwKKwkJfQorCisjZGVmaW5lIE1fQVNOMV9EMklfZ2V0X2ludF9vcHQoYixmdW5jLHR5cGUpIFwKKwlpZiAoKGMuc2xlbiAhPSAwKSAmJiAoKE1fQVNOMV9uZXh0ICYgKH5WX0FTTjFfQ09OU1RSVUNURUQpKSBcCisJCT09IChWX0FTTjFfVU5JVkVSU0FMfCh0eXBlKSkpKSBcCisJCXsgXAorCQlNX0FTTjFfRDJJX2dldF9pbnQoYixmdW5jKTsgXAorCQl9CisKKyNkZWZpbmUgTV9BU04xX0QySV9nZXRfaW1wKGIsZnVuYywgdHlwZSkgXAorCU1fQVNOMV9uZXh0PShfdG1wJiBWX0FTTjFfQ09OU1RSVUNURUQpfHR5cGU7IFwKKwljLnE9Yy5wOyBcCisJaWYgKGZ1bmMoJihiKSwmYy5wLGMuc2xlbikgPT0gTlVMTCkgXAorCQl7Yy5saW5lPV9fTElORV9fOyBNX0FTTjFfbmV4dF9wcmV2ID0gX3RtcDsgZ290byBlcnI7IH0gXAorCWMuc2xlbi09KGMucC1jLnEpO1wKKwlNX0FTTjFfbmV4dF9wcmV2PV90bXA7CisKKyNkZWZpbmUgTV9BU04xX0QySV9nZXRfSU1QX29wdChiLGZ1bmMsdGFnLHR5cGUpIFwKKwlpZiAoKGMuc2xlbiAhPSAwKSAmJiAoKE1fQVNOMV9uZXh0ICYgKH5WX0FTTjFfQ09OU1RSVUNURUQpKSA9PSBcCisJCShWX0FTTjFfQ09OVEVYVF9TUEVDSUZJQ3wodGFnKSkpKSBcCisJCXsgXAorCQl1bnNpZ25lZCBjaGFyIF90bXAgPSBNX0FTTjFfbmV4dDsgXAorCQlNX0FTTjFfRDJJX2dldF9pbXAoYixmdW5jLCB0eXBlKTtcCisJCX0KKworI2RlZmluZSBNX0FTTjFfRDJJX2dldF9zZXQocixmdW5jLGZyZWVfZnVuYykgXAorCQlNX0FTTjFfRDJJX2dldF9pbXBfc2V0KHIsZnVuYyxmcmVlX2Z1bmMsIFwKKwkJCVZfQVNOMV9TRVQsVl9BU04xX1VOSVZFUlNBTCk7CisKKyNkZWZpbmUgTV9BU04xX0QySV9nZXRfc2V0X3R5cGUodHlwZSxyLGZ1bmMsZnJlZV9mdW5jKSBcCisJCU1fQVNOMV9EMklfZ2V0X2ltcF9zZXRfdHlwZSh0eXBlLHIsZnVuYyxmcmVlX2Z1bmMsIFwKKwkJCVZfQVNOMV9TRVQsVl9BU04xX1VOSVZFUlNBTCk7CisKKyNkZWZpbmUgTV9BU04xX0QySV9nZXRfc2V0X29wdChyLGZ1bmMsZnJlZV9mdW5jKSBcCisJaWYgKChjLnNsZW4gIT0gMCkgJiYgKE1fQVNOMV9uZXh0ID09IChWX0FTTjFfVU5JVkVSU0FMfCBcCisJCVZfQVNOMV9DT05TVFJVQ1RFRHxWX0FTTjFfU0VUKSkpXAorCQl7IE1fQVNOMV9EMklfZ2V0X3NldChyLGZ1bmMsZnJlZV9mdW5jKTsgfQorCisjZGVmaW5lIE1fQVNOMV9EMklfZ2V0X3NldF9vcHRfdHlwZSh0eXBlLHIsZnVuYyxmcmVlX2Z1bmMpIFwKKwlpZiAoKGMuc2xlbiAhPSAwKSAmJiAoTV9BU04xX25leHQgPT0gKFZfQVNOMV9VTklWRVJTQUx8IFwKKwkJVl9BU04xX0NPTlNUUlVDVEVEfFZfQVNOMV9TRVQpKSlcCisJCXsgTV9BU04xX0QySV9nZXRfc2V0X3R5cGUodHlwZSxyLGZ1bmMsZnJlZV9mdW5jKTsgfQorCisjZGVmaW5lIE1fQVNOMV9JMkRfbGVuX1NFVF9vcHQoYSxmKSBcCisJaWYgKChhICE9IE5VTEwpICYmIChza19udW0oYSkgIT0gMCkpIFwKKwkJTV9BU04xX0kyRF9sZW5fU0VUKGEsZik7CisKKyNkZWZpbmUgTV9BU04xX0kyRF9wdXRfU0VUX29wdChhLGYpIFwKKwlpZiAoKGEgIT0gTlVMTCkgJiYgKHNrX251bShhKSAhPSAwKSkgXAorCQlNX0FTTjFfSTJEX3B1dF9TRVQoYSxmKTsKKworI2RlZmluZSBNX0FTTjFfSTJEX3B1dF9TRVFVRU5DRV9vcHQoYSxmKSBcCisJaWYgKChhICE9IE5VTEwpICYmIChza19udW0oYSkgIT0gMCkpIFwKKwkJTV9BU04xX0kyRF9wdXRfU0VRVUVOQ0UoYSxmKTsKKworI2RlZmluZSBNX0FTTjFfSTJEX3B1dF9TRVFVRU5DRV9vcHRfdHlwZSh0eXBlLGEsZikgXAorCWlmICgoYSAhPSBOVUxMKSAmJiAoc2tfIyN0eXBlIyNfbnVtKGEpICE9IDApKSBcCisJCU1fQVNOMV9JMkRfcHV0X1NFUVVFTkNFX3R5cGUodHlwZSxhLGYpOworCisjZGVmaW5lIE1fQVNOMV9EMklfZ2V0X0lNUF9zZXRfb3B0KGIsZnVuYyxmcmVlX2Z1bmMsdGFnKSBcCisJaWYgKChjLnNsZW4gIT0gMCkgJiYgXAorCQkoTV9BU04xX25leHQgPT0gXAorCQkoVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUN8Vl9BU04xX0NPTlNUUlVDVEVEfCh0YWcpKSkpXAorCQl7IFwKKwkJTV9BU04xX0QySV9nZXRfaW1wX3NldChiLGZ1bmMsZnJlZV9mdW5jLFwKKwkJCXRhZyxWX0FTTjFfQ09OVEVYVF9TUEVDSUZJQyk7IFwKKwkJfQorCisjZGVmaW5lIE1fQVNOMV9EMklfZ2V0X0lNUF9zZXRfb3B0X3R5cGUodHlwZSxiLGZ1bmMsZnJlZV9mdW5jLHRhZykgXAorCWlmICgoYy5zbGVuICE9IDApICYmIFwKKwkJKE1fQVNOMV9uZXh0ID09IFwKKwkJKFZfQVNOMV9DT05URVhUX1NQRUNJRklDfFZfQVNOMV9DT05TVFJVQ1RFRHwodGFnKSkpKVwKKwkJeyBcCisJCU1fQVNOMV9EMklfZ2V0X2ltcF9zZXRfdHlwZSh0eXBlLGIsZnVuYyxmcmVlX2Z1bmMsXAorCQkJdGFnLFZfQVNOMV9DT05URVhUX1NQRUNJRklDKTsgXAorCQl9CisKKyNkZWZpbmUgTV9BU04xX0QySV9nZXRfc2VxKHIsZnVuYyxmcmVlX2Z1bmMpIFwKKwkJTV9BU04xX0QySV9nZXRfaW1wX3NldChyLGZ1bmMsZnJlZV9mdW5jLFwKKwkJCVZfQVNOMV9TRVFVRU5DRSxWX0FTTjFfVU5JVkVSU0FMKTsKKworI2RlZmluZSBNX0FTTjFfRDJJX2dldF9zZXFfdHlwZSh0eXBlLHIsZnVuYyxmcmVlX2Z1bmMpIFwKKwkJTV9BU04xX0QySV9nZXRfaW1wX3NldF90eXBlKHR5cGUscixmdW5jLGZyZWVfZnVuYyxcCisJCQkJCSAgICBWX0FTTjFfU0VRVUVOQ0UsVl9BU04xX1VOSVZFUlNBTCkKKworI2RlZmluZSBNX0FTTjFfRDJJX2dldF9zZXFfb3B0KHIsZnVuYyxmcmVlX2Z1bmMpIFwKKwlpZiAoKGMuc2xlbiAhPSAwKSAmJiAoTV9BU04xX25leHQgPT0gKFZfQVNOMV9VTklWRVJTQUx8IFwKKwkJVl9BU04xX0NPTlNUUlVDVEVEfFZfQVNOMV9TRVFVRU5DRSkpKVwKKwkJeyBNX0FTTjFfRDJJX2dldF9zZXEocixmdW5jLGZyZWVfZnVuYyk7IH0KKworI2RlZmluZSBNX0FTTjFfRDJJX2dldF9zZXFfb3B0X3R5cGUodHlwZSxyLGZ1bmMsZnJlZV9mdW5jKSBcCisJaWYgKChjLnNsZW4gIT0gMCkgJiYgKE1fQVNOMV9uZXh0ID09IChWX0FTTjFfVU5JVkVSU0FMfCBcCisJCVZfQVNOMV9DT05TVFJVQ1RFRHxWX0FTTjFfU0VRVUVOQ0UpKSlcCisJCXsgTV9BU04xX0QySV9nZXRfc2VxX3R5cGUodHlwZSxyLGZ1bmMsZnJlZV9mdW5jKTsgfQorCisjZGVmaW5lIE1fQVNOMV9EMklfZ2V0X0lNUF9zZXQocixmdW5jLGZyZWVfZnVuYyx4KSBcCisJCU1fQVNOMV9EMklfZ2V0X2ltcF9zZXQocixmdW5jLGZyZWVfZnVuYyxcCisJCQl4LFZfQVNOMV9DT05URVhUX1NQRUNJRklDKTsKKworI2RlZmluZSBNX0FTTjFfRDJJX2dldF9JTVBfc2V0X3R5cGUodHlwZSxyLGZ1bmMsZnJlZV9mdW5jLHgpIFwKKwkJTV9BU04xX0QySV9nZXRfaW1wX3NldF90eXBlKHR5cGUscixmdW5jLGZyZWVfZnVuYyxcCisJCQl4LFZfQVNOMV9DT05URVhUX1NQRUNJRklDKTsKKworI2RlZmluZSBNX0FTTjFfRDJJX2dldF9pbXBfc2V0KHIsZnVuYyxmcmVlX2Z1bmMsYSxiKSBcCisJYy5xPWMucDsgXAorCWlmIChkMmlfQVNOMV9TRVQoJihyKSwmYy5wLGMuc2xlbiwoY2hhciAqKCopKCkpZnVuYyxcCisJCSh2b2lkICgqKSgpKWZyZWVfZnVuYyxhLGIpID09IE5VTEwpIFwKKwkJeyBjLmxpbmU9X19MSU5FX187IGdvdG8gZXJyOyB9IFwKKwljLnNsZW4tPShjLnAtYy5xKTsKKworI2RlZmluZSBNX0FTTjFfRDJJX2dldF9pbXBfc2V0X3R5cGUodHlwZSxyLGZ1bmMsZnJlZV9mdW5jLGEsYikgXAorCWMucT1jLnA7IFwKKwlpZiAoZDJpX0FTTjFfU0VUX09GXyMjdHlwZSgmKHIpLCZjLnAsYy5zbGVuLGZ1bmMsXAorCQkJCSAgIGZyZWVfZnVuYyxhLGIpID09IE5VTEwpIFwKKwkJeyBjLmxpbmU9X19MSU5FX187IGdvdG8gZXJyOyB9IFwKKwljLnNsZW4tPShjLnAtYy5xKTsKKworI2RlZmluZSBNX0FTTjFfRDJJX2dldF9zZXRfc3RyaW5ncyhyLGZ1bmMsYSxiKSBcCisJYy5xPWMucDsgXAorCWlmIChkMmlfQVNOMV9TVFJJTkdfU0VUKCYociksJmMucCxjLnNsZW4sYSxiKSA9PSBOVUxMKSBcCisJCXsgYy5saW5lPV9fTElORV9fOyBnb3RvIGVycjsgfSBcCisJYy5zbGVuLT0oYy5wLWMucSk7CisKKyNkZWZpbmUgTV9BU04xX0QySV9nZXRfRVhQX29wdChyLGZ1bmMsdGFnKSBcCisJaWYgKChjLnNsZW4gIT0gMEwpICYmIChNX0FTTjFfbmV4dCA9PSBcCisJCShWX0FTTjFfQ09OU1RSVUNURUR8Vl9BU04xX0NPTlRFWFRfU1BFQ0lGSUN8dGFnKSkpIFwKKwkJeyBcCisJCWludCBUaW5mLFR0YWcsVGNsYXNzOyBcCisJCWxvbmcgVGxlbjsgXAorCQlcCisJCWMucT1jLnA7IFwKKwkJVGluZj1BU04xX2dldF9vYmplY3QoJmMucCwmVGxlbiwmVHRhZywmVGNsYXNzLGMuc2xlbik7IFwKKwkJaWYgKFRpbmYgJiAweDgwKSBcCisJCQl7IGMuZXJyb3I9QVNOMV9SX0JBRF9PQkpFQ1RfSEVBREVSOyBcCisJCQljLmxpbmU9X19MSU5FX187IGdvdG8gZXJyOyB9IFwKKwkJaWYgKFRpbmYgPT0gKFZfQVNOMV9DT05TVFJVQ1RFRCsxKSkgXAorCQkJCQlUbGVuID0gYy5zbGVuIC0gKGMucCAtIGMucSkgLSAyOyBcCisJCWlmIChmdW5jKCYociksJmMucCxUbGVuKSA9PSBOVUxMKSBcCisJCQl7IGMubGluZT1fX0xJTkVfXzsgZ290byBlcnI7IH0gXAorCQlpZiAoVGluZiA9PSAoVl9BU04xX0NPTlNUUlVDVEVEKzEpKSB7IFwKKwkJCVRsZW4gPSBjLnNsZW4gLSAoYy5wIC0gYy5xKTsgXAorCQkJaWYoIUFTTjFfY29uc3RfY2hlY2tfaW5maW5pdGVfZW5kKCZjLnAsIFRsZW4pKSBcCisJCQkJeyBjLmVycm9yPUFTTjFfUl9NSVNTSU5HX0FTTjFfRU9TOyBcCisJCQkJYy5saW5lPV9fTElORV9fOyBnb3RvIGVycjsgfSBcCisJCX1cCisJCWMuc2xlbi09KGMucC1jLnEpOyBcCisJCX0KKworI2RlZmluZSBNX0FTTjFfRDJJX2dldF9FWFBfc2V0X29wdChyLGZ1bmMsZnJlZV9mdW5jLHRhZyxiKSBcCisJaWYgKChjLnNsZW4gIT0gMCkgJiYgKE1fQVNOMV9uZXh0ID09IFwKKwkJKFZfQVNOMV9DT05TVFJVQ1RFRHxWX0FTTjFfQ09OVEVYVF9TUEVDSUZJQ3x0YWcpKSkgXAorCQl7IFwKKwkJaW50IFRpbmYsVHRhZyxUY2xhc3M7IFwKKwkJbG9uZyBUbGVuOyBcCisJCVwKKwkJYy5xPWMucDsgXAorCQlUaW5mPUFTTjFfZ2V0X29iamVjdCgmYy5wLCZUbGVuLCZUdGFnLCZUY2xhc3MsYy5zbGVuKTsgXAorCQlpZiAoVGluZiAmIDB4ODApIFwKKwkJCXsgYy5lcnJvcj1BU04xX1JfQkFEX09CSkVDVF9IRUFERVI7IFwKKwkJCWMubGluZT1fX0xJTkVfXzsgZ290byBlcnI7IH0gXAorCQlpZiAoVGluZiA9PSAoVl9BU04xX0NPTlNUUlVDVEVEKzEpKSBcCisJCQkJCVRsZW4gPSBjLnNsZW4gLSAoYy5wIC0gYy5xKSAtIDI7IFwKKwkJaWYgKGQyaV9BU04xX1NFVCgmKHIpLCZjLnAsVGxlbiwoY2hhciAqKCopKCkpZnVuYywgXAorCQkJKHZvaWQgKCopKCkpZnJlZV9mdW5jLCBcCisJCQliLFZfQVNOMV9VTklWRVJTQUwpID09IE5VTEwpIFwKKwkJCXsgYy5saW5lPV9fTElORV9fOyBnb3RvIGVycjsgfSBcCisJCWlmIChUaW5mID09IChWX0FTTjFfQ09OU1RSVUNURUQrMSkpIHsgXAorCQkJVGxlbiA9IGMuc2xlbiAtIChjLnAgLSBjLnEpOyBcCisJCQlpZighQVNOMV9jaGVja19pbmZpbml0ZV9lbmQoJmMucCwgVGxlbikpIFwKKwkJCQl7IGMuZXJyb3I9QVNOMV9SX01JU1NJTkdfQVNOMV9FT1M7IFwKKwkJCQljLmxpbmU9X19MSU5FX187IGdvdG8gZXJyOyB9IFwKKwkJfVwKKwkJYy5zbGVuLT0oYy5wLWMucSk7IFwKKwkJfQorCisjZGVmaW5lIE1fQVNOMV9EMklfZ2V0X0VYUF9zZXRfb3B0X3R5cGUodHlwZSxyLGZ1bmMsZnJlZV9mdW5jLHRhZyxiKSBcCisJaWYgKChjLnNsZW4gIT0gMCkgJiYgKE1fQVNOMV9uZXh0ID09IFwKKwkJKFZfQVNOMV9DT05TVFJVQ1RFRHxWX0FTTjFfQ09OVEVYVF9TUEVDSUZJQ3x0YWcpKSkgXAorCQl7IFwKKwkJaW50IFRpbmYsVHRhZyxUY2xhc3M7IFwKKwkJbG9uZyBUbGVuOyBcCisJCVwKKwkJYy5xPWMucDsgXAorCQlUaW5mPUFTTjFfZ2V0X29iamVjdCgmYy5wLCZUbGVuLCZUdGFnLCZUY2xhc3MsYy5zbGVuKTsgXAorCQlpZiAoVGluZiAmIDB4ODApIFwKKwkJCXsgYy5lcnJvcj1BU04xX1JfQkFEX09CSkVDVF9IRUFERVI7IFwKKwkJCWMubGluZT1fX0xJTkVfXzsgZ290byBlcnI7IH0gXAorCQlpZiAoVGluZiA9PSAoVl9BU04xX0NPTlNUUlVDVEVEKzEpKSBcCisJCQkJCVRsZW4gPSBjLnNsZW4gLSAoYy5wIC0gYy5xKSAtIDI7IFwKKwkJaWYgKGQyaV9BU04xX1NFVF9PRl8jI3R5cGUoJihyKSwmYy5wLFRsZW4sZnVuYywgXAorCQkJZnJlZV9mdW5jLGIsVl9BU04xX1VOSVZFUlNBTCkgPT0gTlVMTCkgXAorCQkJeyBjLmxpbmU9X19MSU5FX187IGdvdG8gZXJyOyB9IFwKKwkJaWYgKFRpbmYgPT0gKFZfQVNOMV9DT05TVFJVQ1RFRCsxKSkgeyBcCisJCQlUbGVuID0gYy5zbGVuIC0gKGMucCAtIGMucSk7IFwKKwkJCWlmKCFBU04xX2NoZWNrX2luZmluaXRlX2VuZCgmYy5wLCBUbGVuKSkgXAorCQkJCXsgYy5lcnJvcj1BU04xX1JfTUlTU0lOR19BU04xX0VPUzsgXAorCQkJCWMubGluZT1fX0xJTkVfXzsgZ290byBlcnI7IH0gXAorCQl9XAorCQljLnNsZW4tPShjLnAtYy5xKTsgXAorCQl9CisKKy8qIE5ldyBtYWNyb3MgKi8KKyNkZWZpbmUgTV9BU04xX05ld19NYWxsb2MocmV0LHR5cGUpIFwKKwlpZiAoKHJldD0odHlwZSAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZih0eXBlKSkpID09IE5VTEwpIFwKKwkJeyBjLmxpbmU9X19MSU5FX187IGdvdG8gZXJyMjsgfQorCisjZGVmaW5lIE1fQVNOMV9OZXcoYXJnLGZ1bmMpIFwKKwlpZiAoKChhcmcpPWZ1bmMoKSkgPT0gTlVMTCkgcmV0dXJuKE5VTEwpCisKKyNkZWZpbmUgTV9BU04xX05ld19FcnJvcihhKSBcCisvKgllcnI6CUFTTjFfTUFDX0hfZXJyKChhKSxBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IsYy5saW5lKTsgXAorCQlyZXR1cm4oTlVMTCk7Ki8gXAorCWVycjI6CUFTTjFfTUFDX0hfZXJyKChhKSxBU04xX1JfTUFMTE9DX0ZBSUxVUkUsYy5saW5lKTsgXAorCQlyZXR1cm4oTlVMTCkKKworCisvKiBCSUcgVUdMWSBXQVJOSU5HISAgVGhpcyBpcyBzbyBkYW1uIHVnbHkgSSB3YW5uYSBwdWtlLiAgVW5mb3J0dW5hdGVseSwKKyAgIHNvbWUgbWFjcm9zIHRoYXQgdXNlIEFTTjFfY29uc3RfQ1RYIHN0aWxsIGluc2lzdCBvbiB3cml0aW5nIGluIHRoZSBpbnB1dAorICAgc3RyZWFtLiAgQVJHSCEgIEFSR0ghICBBUkdIISAgTGV0J3MgZ2V0IHJpZCBvZiB0aGlzIG1hY3JvIHBhY2thZ2UuCisgICBQbGVhc2U/CQkJCQkJLS0gUmljaGFyZCBMZXZpdHRlICovCisjZGVmaW5lIE1fQVNOMV9uZXh0CQkoKigodW5zaWduZWQgY2hhciAqKShjLnApKSkKKyNkZWZpbmUgTV9BU04xX25leHRfcHJldgkoKigodW5zaWduZWQgY2hhciAqKShjLnEpKSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTV9BU04xX0kyRF92YXJzKGEpCWludCByPTAscmV0PTA7IFwKKwkJCQl1bnNpZ25lZCBjaGFyICpwOyBcCisJCQkJaWYgKGEgPT0gTlVMTCkgcmV0dXJuKDApCisKKy8qIExlbmd0aCBNYWNyb3MgKi8KKyNkZWZpbmUgTV9BU04xX0kyRF9sZW4oYSxmKQlyZXQrPWYoYSxOVUxMKQorI2RlZmluZSBNX0FTTjFfSTJEX2xlbl9JTVBfb3B0KGEsZikJaWYgKGEgIT0gTlVMTCkgTV9BU04xX0kyRF9sZW4oYSxmKQorCisjZGVmaW5lIE1fQVNOMV9JMkRfbGVuX1NFVChhLGYpIFwKKwkJcmV0Kz1pMmRfQVNOMV9TRVQoYSxOVUxMLGYsVl9BU04xX1NFVCxWX0FTTjFfVU5JVkVSU0FMLElTX1NFVCk7CisKKyNkZWZpbmUgTV9BU04xX0kyRF9sZW5fU0VUX3R5cGUodHlwZSxhLGYpIFwKKwkJcmV0Kz1pMmRfQVNOMV9TRVRfT0ZfIyN0eXBlKGEsTlVMTCxmLFZfQVNOMV9TRVQsIFwKKwkJCQkJICAgIFZfQVNOMV9VTklWRVJTQUwsSVNfU0VUKTsKKworI2RlZmluZSBNX0FTTjFfSTJEX2xlbl9TRVFVRU5DRShhLGYpIFwKKwkJcmV0Kz1pMmRfQVNOMV9TRVQoYSxOVUxMLGYsVl9BU04xX1NFUVVFTkNFLFZfQVNOMV9VTklWRVJTQUwsIFwKKwkJCQkgIElTX1NFUVVFTkNFKTsKKworI2RlZmluZSBNX0FTTjFfSTJEX2xlbl9TRVFVRU5DRV90eXBlKHR5cGUsYSxmKSBcCisJCXJldCs9aTJkX0FTTjFfU0VUX09GXyMjdHlwZShhLE5VTEwsZixWX0FTTjFfU0VRVUVOQ0UsIFwKKwkJCQkJICAgIFZfQVNOMV9VTklWRVJTQUwsSVNfU0VRVUVOQ0UpCisKKyNkZWZpbmUgTV9BU04xX0kyRF9sZW5fU0VRVUVOQ0Vfb3B0KGEsZikgXAorCQlpZiAoKGEgIT0gTlVMTCkgJiYgKHNrX251bShhKSAhPSAwKSkgXAorCQkJTV9BU04xX0kyRF9sZW5fU0VRVUVOQ0UoYSxmKTsKKworI2RlZmluZSBNX0FTTjFfSTJEX2xlbl9TRVFVRU5DRV9vcHRfdHlwZSh0eXBlLGEsZikgXAorCQlpZiAoKGEgIT0gTlVMTCkgJiYgKHNrXyMjdHlwZSMjX251bShhKSAhPSAwKSkgXAorCQkJTV9BU04xX0kyRF9sZW5fU0VRVUVOQ0VfdHlwZSh0eXBlLGEsZik7CisKKyNkZWZpbmUgTV9BU04xX0kyRF9sZW5fSU1QX1NFVChhLGYseCkgXAorCQlyZXQrPWkyZF9BU04xX1NFVChhLE5VTEwsZix4LFZfQVNOMV9DT05URVhUX1NQRUNJRklDLElTX1NFVCk7CisKKyNkZWZpbmUgTV9BU04xX0kyRF9sZW5fSU1QX1NFVF90eXBlKHR5cGUsYSxmLHgpIFwKKwkJcmV0Kz1pMmRfQVNOMV9TRVRfT0ZfIyN0eXBlKGEsTlVMTCxmLHgsIFwKKwkJCQkJICAgIFZfQVNOMV9DT05URVhUX1NQRUNJRklDLElTX1NFVCk7CisKKyNkZWZpbmUgTV9BU04xX0kyRF9sZW5fSU1QX1NFVF9vcHQoYSxmLHgpIFwKKwkJaWYgKChhICE9IE5VTEwpICYmIChza19udW0oYSkgIT0gMCkpIFwKKwkJCXJldCs9aTJkX0FTTjFfU0VUKGEsTlVMTCxmLHgsVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUMsIFwKKwkJCQkJICBJU19TRVQpOworCisjZGVmaW5lIE1fQVNOMV9JMkRfbGVuX0lNUF9TRVRfb3B0X3R5cGUodHlwZSxhLGYseCkgXAorCQlpZiAoKGEgIT0gTlVMTCkgJiYgKHNrXyMjdHlwZSMjX251bShhKSAhPSAwKSkgXAorCQkJcmV0Kz1pMmRfQVNOMV9TRVRfT0ZfIyN0eXBlKGEsTlVMTCxmLHgsIFwKKwkJCQkJICAgICAgIFZfQVNOMV9DT05URVhUX1NQRUNJRklDLElTX1NFVCk7CisKKyNkZWZpbmUgTV9BU04xX0kyRF9sZW5fSU1QX1NFUVVFTkNFKGEsZix4KSBcCisJCXJldCs9aTJkX0FTTjFfU0VUKGEsTlVMTCxmLHgsVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUMsIFwKKwkJCQkgIElTX1NFUVVFTkNFKTsKKworI2RlZmluZSBNX0FTTjFfSTJEX2xlbl9JTVBfU0VRVUVOQ0Vfb3B0KGEsZix4KSBcCisJCWlmICgoYSAhPSBOVUxMKSAmJiAoc2tfbnVtKGEpICE9IDApKSBcCisJCQlyZXQrPWkyZF9BU04xX1NFVChhLE5VTEwsZix4LFZfQVNOMV9DT05URVhUX1NQRUNJRklDLCBcCisJCQkJCSAgSVNfU0VRVUVOQ0UpOworCisjZGVmaW5lIE1fQVNOMV9JMkRfbGVuX0lNUF9TRVFVRU5DRV9vcHRfdHlwZSh0eXBlLGEsZix4KSBcCisJCWlmICgoYSAhPSBOVUxMKSAmJiAoc2tfIyN0eXBlIyNfbnVtKGEpICE9IDApKSBcCisJCQlyZXQrPWkyZF9BU04xX1NFVF9PRl8jI3R5cGUoYSxOVUxMLGYseCwgXAorCQkJCQkJICAgIFZfQVNOMV9DT05URVhUX1NQRUNJRklDLCBcCisJCQkJCQkgICAgSVNfU0VRVUVOQ0UpOworCisjZGVmaW5lIE1fQVNOMV9JMkRfbGVuX0VYUF9vcHQoYSxmLG10YWcsdikgXAorCQlpZiAoYSAhPSBOVUxMKVwKKwkJCXsgXAorCQkJdj1mKGEsTlVMTCk7IFwKKwkJCXJldCs9QVNOMV9vYmplY3Rfc2l6ZSgxLHYsbXRhZyk7IFwKKwkJCX0KKworI2RlZmluZSBNX0FTTjFfSTJEX2xlbl9FWFBfU0VUX29wdChhLGYsbXRhZyx0YWcsdikgXAorCQlpZiAoKGEgIT0gTlVMTCkgJiYgKHNrX251bShhKSAhPSAwKSlcCisJCQl7IFwKKwkJCXY9aTJkX0FTTjFfU0VUKGEsTlVMTCxmLHRhZyxWX0FTTjFfVU5JVkVSU0FMLElTX1NFVCk7IFwKKwkJCXJldCs9QVNOMV9vYmplY3Rfc2l6ZSgxLHYsbXRhZyk7IFwKKwkJCX0KKworI2RlZmluZSBNX0FTTjFfSTJEX2xlbl9FWFBfU0VRVUVOQ0Vfb3B0KGEsZixtdGFnLHRhZyx2KSBcCisJCWlmICgoYSAhPSBOVUxMKSAmJiAoc2tfbnVtKGEpICE9IDApKVwKKwkJCXsgXAorCQkJdj1pMmRfQVNOMV9TRVQoYSxOVUxMLGYsdGFnLFZfQVNOMV9VTklWRVJTQUwsIFwKKwkJCQkgICAgICAgSVNfU0VRVUVOQ0UpOyBcCisJCQlyZXQrPUFTTjFfb2JqZWN0X3NpemUoMSx2LG10YWcpOyBcCisJCQl9CisKKyNkZWZpbmUgTV9BU04xX0kyRF9sZW5fRVhQX1NFUVVFTkNFX29wdF90eXBlKHR5cGUsYSxmLG10YWcsdGFnLHYpIFwKKwkJaWYgKChhICE9IE5VTEwpICYmIChza18jI3R5cGUjI19udW0oYSkgIT0gMCkpXAorCQkJeyBcCisJCQl2PWkyZF9BU04xX1NFVF9PRl8jI3R5cGUoYSxOVUxMLGYsdGFnLCBcCisJCQkJCQkgVl9BU04xX1VOSVZFUlNBTCwgXAorCQkJCQkJIElTX1NFUVVFTkNFKTsgXAorCQkJcmV0Kz1BU04xX29iamVjdF9zaXplKDEsdixtdGFnKTsgXAorCQkJfQorCisvKiBQdXQgTWFjcm9zICovCisjZGVmaW5lIE1fQVNOMV9JMkRfcHV0KGEsZikJZihhLCZwKQorCisjZGVmaW5lIE1fQVNOMV9JMkRfcHV0X0lNUF9vcHQoYSxmLHQpCVwKKwkJaWYgKGEgIT0gTlVMTCkgXAorCQkJeyBcCisJCQl1bnNpZ25lZCBjaGFyICpxPXA7IFwKKwkJCWYoYSwmcCk7IFwKKwkJCSpxPShWX0FTTjFfQ09OVEVYVF9TUEVDSUZJQ3x0fCgqcSZWX0FTTjFfQ09OU1RSVUNURUQpKTtcCisJCQl9CisKKyNkZWZpbmUgTV9BU04xX0kyRF9wdXRfU0VUKGEsZikgaTJkX0FTTjFfU0VUKGEsJnAsZixWX0FTTjFfU0VULFwKKwkJCVZfQVNOMV9VTklWRVJTQUwsSVNfU0VUKQorI2RlZmluZSBNX0FTTjFfSTJEX3B1dF9TRVRfdHlwZSh0eXBlLGEsZikgXAorICAgICBpMmRfQVNOMV9TRVRfT0ZfIyN0eXBlKGEsJnAsZixWX0FTTjFfU0VULFZfQVNOMV9VTklWRVJTQUwsSVNfU0VUKQorI2RlZmluZSBNX0FTTjFfSTJEX3B1dF9JTVBfU0VUKGEsZix4KSBpMmRfQVNOMV9TRVQoYSwmcCxmLHgsXAorCQkJVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUMsSVNfU0VUKQorI2RlZmluZSBNX0FTTjFfSTJEX3B1dF9JTVBfU0VUX3R5cGUodHlwZSxhLGYseCkgXAorICAgICBpMmRfQVNOMV9TRVRfT0ZfIyN0eXBlKGEsJnAsZix4LFZfQVNOMV9DT05URVhUX1NQRUNJRklDLElTX1NFVCkKKyNkZWZpbmUgTV9BU04xX0kyRF9wdXRfSU1QX1NFUVVFTkNFKGEsZix4KSBpMmRfQVNOMV9TRVQoYSwmcCxmLHgsXAorCQkJVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUMsSVNfU0VRVUVOQ0UpCisKKyNkZWZpbmUgTV9BU04xX0kyRF9wdXRfU0VRVUVOQ0UoYSxmKSBpMmRfQVNOMV9TRVQoYSwmcCxmLFZfQVNOMV9TRVFVRU5DRSxcCisJCQkJCSAgICAgVl9BU04xX1VOSVZFUlNBTCxJU19TRVFVRU5DRSkKKworI2RlZmluZSBNX0FTTjFfSTJEX3B1dF9TRVFVRU5DRV90eXBlKHR5cGUsYSxmKSBcCisgICAgIGkyZF9BU04xX1NFVF9PRl8jI3R5cGUoYSwmcCxmLFZfQVNOMV9TRVFVRU5DRSxWX0FTTjFfVU5JVkVSU0FMLCBcCisJCQkgICAgSVNfU0VRVUVOQ0UpCisKKyNkZWZpbmUgTV9BU04xX0kyRF9wdXRfU0VRVUVOQ0Vfb3B0KGEsZikgXAorCQlpZiAoKGEgIT0gTlVMTCkgJiYgKHNrX251bShhKSAhPSAwKSkgXAorCQkJTV9BU04xX0kyRF9wdXRfU0VRVUVOQ0UoYSxmKTsKKworI2RlZmluZSBNX0FTTjFfSTJEX3B1dF9JTVBfU0VUX29wdChhLGYseCkgXAorCQlpZiAoKGEgIT0gTlVMTCkgJiYgKHNrX251bShhKSAhPSAwKSkgXAorCQkJeyBpMmRfQVNOMV9TRVQoYSwmcCxmLHgsVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUMsIFwKKwkJCQkgICAgICAgSVNfU0VUKTsgfQorCisjZGVmaW5lIE1fQVNOMV9JMkRfcHV0X0lNUF9TRVRfb3B0X3R5cGUodHlwZSxhLGYseCkgXAorCQlpZiAoKGEgIT0gTlVMTCkgJiYgKHNrXyMjdHlwZSMjX251bShhKSAhPSAwKSkgXAorCQkJeyBpMmRfQVNOMV9TRVRfT0ZfIyN0eXBlKGEsJnAsZix4LCBcCisJCQkJCQkgVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUMsIFwKKwkJCQkJCSBJU19TRVQpOyB9CisKKyNkZWZpbmUgTV9BU04xX0kyRF9wdXRfSU1QX1NFUVVFTkNFX29wdChhLGYseCkgXAorCQlpZiAoKGEgIT0gTlVMTCkgJiYgKHNrX251bShhKSAhPSAwKSkgXAorCQkJeyBpMmRfQVNOMV9TRVQoYSwmcCxmLHgsVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUMsIFwKKwkJCQkgICAgICAgSVNfU0VRVUVOQ0UpOyB9CisKKyNkZWZpbmUgTV9BU04xX0kyRF9wdXRfSU1QX1NFUVVFTkNFX29wdF90eXBlKHR5cGUsYSxmLHgpIFwKKwkJaWYgKChhICE9IE5VTEwpICYmIChza18jI3R5cGUjI19udW0oYSkgIT0gMCkpIFwKKwkJCXsgaTJkX0FTTjFfU0VUX09GXyMjdHlwZShhLCZwLGYseCwgXAorCQkJCQkJIFZfQVNOMV9DT05URVhUX1NQRUNJRklDLCBcCisJCQkJCQkgSVNfU0VRVUVOQ0UpOyB9CisKKyNkZWZpbmUgTV9BU04xX0kyRF9wdXRfRVhQX29wdChhLGYsdGFnLHYpIFwKKwkJaWYgKGEgIT0gTlVMTCkgXAorCQkJeyBcCisJCQlBU04xX3B1dF9vYmplY3QoJnAsMSx2LHRhZyxWX0FTTjFfQ09OVEVYVF9TUEVDSUZJQyk7IFwKKwkJCWYoYSwmcCk7IFwKKwkJCX0KKworI2RlZmluZSBNX0FTTjFfSTJEX3B1dF9FWFBfU0VUX29wdChhLGYsbXRhZyx0YWcsdikgXAorCQlpZiAoKGEgIT0gTlVMTCkgJiYgKHNrX251bShhKSAhPSAwKSkgXAorCQkJeyBcCisJCQlBU04xX3B1dF9vYmplY3QoJnAsMSx2LG10YWcsVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUMpOyBcCisJCQlpMmRfQVNOMV9TRVQoYSwmcCxmLHRhZyxWX0FTTjFfVU5JVkVSU0FMLElTX1NFVCk7IFwKKwkJCX0KKworI2RlZmluZSBNX0FTTjFfSTJEX3B1dF9FWFBfU0VRVUVOQ0Vfb3B0KGEsZixtdGFnLHRhZyx2KSBcCisJCWlmICgoYSAhPSBOVUxMKSAmJiAoc2tfbnVtKGEpICE9IDApKSBcCisJCQl7IFwKKwkJCUFTTjFfcHV0X29iamVjdCgmcCwxLHYsbXRhZyxWX0FTTjFfQ09OVEVYVF9TUEVDSUZJQyk7IFwKKwkJCWkyZF9BU04xX1NFVChhLCZwLGYsdGFnLFZfQVNOMV9VTklWRVJTQUwsSVNfU0VRVUVOQ0UpOyBcCisJCQl9CisKKyNkZWZpbmUgTV9BU04xX0kyRF9wdXRfRVhQX1NFUVVFTkNFX29wdF90eXBlKHR5cGUsYSxmLG10YWcsdGFnLHYpIFwKKwkJaWYgKChhICE9IE5VTEwpICYmIChza18jI3R5cGUjI19udW0oYSkgIT0gMCkpIFwKKwkJCXsgXAorCQkJQVNOMV9wdXRfb2JqZWN0KCZwLDEsdixtdGFnLFZfQVNOMV9DT05URVhUX1NQRUNJRklDKTsgXAorCQkJaTJkX0FTTjFfU0VUX09GXyMjdHlwZShhLCZwLGYsdGFnLFZfQVNOMV9VTklWRVJTQUwsIFwKKwkJCQkJICAgICAgIElTX1NFUVVFTkNFKTsgXAorCQkJfQorCisjZGVmaW5lIE1fQVNOMV9JMkRfc2VxX3RvdGFsKCkgXAorCQlyPUFTTjFfb2JqZWN0X3NpemUoMSxyZXQsVl9BU04xX1NFUVVFTkNFKTsgXAorCQlpZiAocHAgPT0gTlVMTCkgcmV0dXJuKHIpOyBcCisJCXA9ICpwcDsgXAorCQlBU04xX3B1dF9vYmplY3QoJnAsMSxyZXQsVl9BU04xX1NFUVVFTkNFLFZfQVNOMV9VTklWRVJTQUwpCisKKyNkZWZpbmUgTV9BU04xX0kyRF9JTkZfc2VxX3N0YXJ0KHRhZyxjdHgpIFwKKwkJKihwKyspPShWX0FTTjFfQ09OU1RSVUNURUR8KHRhZyl8KGN0eCkpOyBcCisJCSoocCsrKT0weDgwCisKKyNkZWZpbmUgTV9BU04xX0kyRF9JTkZfc2VxX2VuZCgpICoocCsrKT0weDAwOyAqKHArKyk9MHgwMAorCisjZGVmaW5lIE1fQVNOMV9JMkRfZmluaXNoKCkJKnBwPXA7IFwKKwkJCQlyZXR1cm4ocik7CisKK2ludCBhc24xX0dldFNlcXVlbmNlKEFTTjFfY29uc3RfQ1RYICpjLCBsb25nICpsZW5ndGgpOwordm9pZCBhc24xX2FkZF9lcnJvcihjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyZXNzLGludCBvZmZzZXQpOworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FzbjEvYXNuMV9wYXIuYyBiL2NyeXB0by9hc24xL2FzbjFfcGFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNiMTFmZQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9hc24xL2FzbjFfcGFyLmMKQEAgLTAsMCArMSw0MzUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorCisKK3N0YXRpYyBpbnQgYXNuMV9wcmludF9pbmZvKEJJTyAqYnAsIGludCB0YWcsIGludCB4Y2xhc3MsaW50IGNvbnN0cnVjdGVkLAorCWludCBpbmRlbnQpOworc3RhdGljIGludCBhc24xX3BhcnNlMihCSU8gKmJwLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsIGxvbmcgbGVuZ3RoLAorCWludCBvZmZzZXQsIGludCBkZXB0aCwgaW50IGluZGVudCwgaW50IGR1bXApOworc3RhdGljIGludCBhc24xX3ByaW50X2luZm8oQklPICpicCwgaW50IHRhZywgaW50IHhjbGFzcywgaW50IGNvbnN0cnVjdGVkLAorCSAgICAgaW50IGluZGVudCkKKwl7CisJc3RhdGljIGNvbnN0IGNoYXIgZm10W109IiUtMThzIjsKKwljaGFyIHN0clsxMjhdOworCWNvbnN0IGNoYXIgKnA7CisKKwlpZiAoY29uc3RydWN0ZWQgJiBWX0FTTjFfQ09OU1RSVUNURUQpCisJCXA9ImNvbnM6ICI7CisJZWxzZQorCQlwPSJwcmltOiAiOworCWlmIChCSU9fd3JpdGUoYnAscCw2KSA8IDYpIGdvdG8gZXJyOworCUJJT19pbmRlbnQoYnAsaW5kZW50LDEyOCk7CisKKwlwPXN0cjsKKwlpZiAoKHhjbGFzcyAmIFZfQVNOMV9QUklWQVRFKSA9PSBWX0FTTjFfUFJJVkFURSkKKwkJQklPX3NucHJpbnRmKHN0cixzaXplb2Ygc3RyLCJwcml2IFsgJWQgXSAiLHRhZyk7CisJZWxzZSBpZiAoKHhjbGFzcyAmIFZfQVNOMV9DT05URVhUX1NQRUNJRklDKSA9PSBWX0FTTjFfQ09OVEVYVF9TUEVDSUZJQykKKwkJQklPX3NucHJpbnRmKHN0cixzaXplb2Ygc3RyLCJjb250IFsgJWQgXSIsdGFnKTsKKwllbHNlIGlmICgoeGNsYXNzICYgVl9BU04xX0FQUExJQ0FUSU9OKSA9PSBWX0FTTjFfQVBQTElDQVRJT04pCisJCUJJT19zbnByaW50ZihzdHIsc2l6ZW9mIHN0ciwiYXBwbCBbICVkIF0iLHRhZyk7CisJZWxzZSBpZiAodGFnID4gMzApCisJCUJJT19zbnByaW50ZihzdHIsc2l6ZW9mIHN0ciwiPEFTTjEgJWQ+Iix0YWcpOworCWVsc2UKKwkJcCA9IEFTTjFfdGFnMnN0cih0YWcpOworCisJaWYgKEJJT19wcmludGYoYnAsZm10LHApIDw9IDApCisJCWdvdG8gZXJyOworCXJldHVybigxKTsKK2VycjoKKwlyZXR1cm4oMCk7CisJfQorCitpbnQgQVNOMV9wYXJzZShCSU8gKmJwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwcCwgbG9uZyBsZW4sIGludCBpbmRlbnQpCisJeworCXJldHVybihhc24xX3BhcnNlMihicCwmcHAsbGVuLDAsMCxpbmRlbnQsMCkpOworCX0KKworaW50IEFTTjFfcGFyc2VfZHVtcChCSU8gKmJwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwcCwgbG9uZyBsZW4sIGludCBpbmRlbnQsIGludCBkdW1wKQorCXsKKwlyZXR1cm4oYXNuMV9wYXJzZTIoYnAsJnBwLGxlbiwwLDAsaW5kZW50LGR1bXApKTsKKwl9CisKK3N0YXRpYyBpbnQgYXNuMV9wYXJzZTIoQklPICpicCwgY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLCBsb25nIGxlbmd0aCwgaW50IG9mZnNldCwKKwkgICAgIGludCBkZXB0aCwgaW50IGluZGVudCwgaW50IGR1bXApCisJeworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsKmVwLCp0b3QsKm9wLCpvcHA7CisJbG9uZyBsZW47CisJaW50IHRhZyx4Y2xhc3MscmV0PTA7CisJaW50IG5sLGhsLGoscjsKKwlBU04xX09CSkVDVCAqbz1OVUxMOworCUFTTjFfT0NURVRfU1RSSU5HICpvcz1OVUxMOworCS8qIEFTTjFfQk1QU1RSSU5HICpibXA9TlVMTDsqLworCWludCBkdW1wX2luZGVudDsKKworI2lmIDAKKwlkdW1wX2luZGVudCA9IGluZGVudDsKKyNlbHNlCisJZHVtcF9pbmRlbnQgPSA2OwkvKiBCZWNhdXNlIHdlIGtub3cgQklPX2R1bXBfaW5kZW50KCkgKi8KKyNlbmRpZgorCXA9ICpwcDsKKwl0b3Q9cCtsZW5ndGg7CisJb3A9cC0xOworCXdoaWxlICgocCA8IHRvdCkgJiYgKG9wIDwgcCkpCisJCXsKKwkJb3A9cDsKKwkJaj1BU04xX2dldF9vYmplY3QoJnAsJmxlbiwmdGFnLCZ4Y2xhc3MsbGVuZ3RoKTsKKyNpZmRlZiBMSU5UCisJCWo9ajsKKyNlbmRpZgorCQlpZiAoaiAmIDB4ODApCisJCQl7CisJCQlpZiAoQklPX3dyaXRlKGJwLCJFcnJvciBpbiBlbmNvZGluZ1xuIiwxOCkgPD0gMCkKKwkJCQlnb3RvIGVuZDsKKwkJCXJldD0wOworCQkJZ290byBlbmQ7CisJCQl9CisJCWhsPShwLW9wKTsKKwkJbGVuZ3RoLT1obDsKKwkJLyogaWYgaiA9PSAweDIxIGl0IGlzIGEgY29uc3RydWN0ZWQgaW5kZWZpbml0ZSBsZW5ndGggb2JqZWN0ICovCisJCWlmIChCSU9fcHJpbnRmKGJwLCIlNWxkOiIsKGxvbmcpb2Zmc2V0Kyhsb25nKShvcC0gKnBwKSkKKwkJCTw9IDApIGdvdG8gZW5kOworCisJCWlmIChqICE9IChWX0FTTjFfQ09OU1RSVUNURUQgfCAxKSkKKwkJCXsKKwkJCWlmIChCSU9fcHJpbnRmKGJwLCJkPSUtMmQgaGw9JWxkIGw9JTRsZCAiLAorCQkJCWRlcHRoLChsb25nKWhsLGxlbikgPD0gMCkKKwkJCQlnb3RvIGVuZDsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJaWYgKEJJT19wcmludGYoYnAsImQ9JS0yZCBobD0lbGQgbD1pbmYgICIsCisJCQkJZGVwdGgsKGxvbmcpaGwpIDw9IDApCisJCQkJZ290byBlbmQ7CisJCQl9CisJCWlmICghYXNuMV9wcmludF9pbmZvKGJwLHRhZyx4Y2xhc3MsaiwoaW5kZW50KT9kZXB0aDowKSkKKwkJCWdvdG8gZW5kOworCQlpZiAoaiAmIFZfQVNOMV9DT05TVFJVQ1RFRCkKKwkJCXsKKwkJCWVwPXArbGVuOworCQkJaWYgKEJJT193cml0ZShicCwiXG4iLDEpIDw9IDApIGdvdG8gZW5kOworCQkJaWYgKGxlbiA+IGxlbmd0aCkKKwkJCQl7CisJCQkJQklPX3ByaW50ZihicCwKKwkJCQkJImxlbmd0aCBpcyBncmVhdGVyIHRoYW4gJWxkXG4iLGxlbmd0aCk7CisJCQkJcmV0PTA7CisJCQkJZ290byBlbmQ7CisJCQkJfQorCQkJaWYgKChqID09IDB4MjEpICYmIChsZW4gPT0gMCkpCisJCQkJeworCQkJCWZvciAoOzspCisJCQkJCXsKKwkJCQkJcj1hc24xX3BhcnNlMihicCwmcCwobG9uZykodG90LXApLAorCQkJCQkJb2Zmc2V0KyhwIC0gKnBwKSxkZXB0aCsxLAorCQkJCQkJaW5kZW50LGR1bXApOworCQkJCQlpZiAociA9PSAwKSB7IHJldD0wOyBnb3RvIGVuZDsgfQorCQkJCQlpZiAoKHIgPT0gMikgfHwgKHAgPj0gdG90KSkgYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQllbHNlCisJCQkJd2hpbGUgKHAgPCBlcCkKKwkJCQkJeworCQkJCQlyPWFzbjFfcGFyc2UyKGJwLCZwLChsb25nKWxlbiwKKwkJCQkJCW9mZnNldCsocCAtICpwcCksZGVwdGgrMSwKKwkJCQkJCWluZGVudCxkdW1wKTsKKwkJCQkJaWYgKHIgPT0gMCkgeyByZXQ9MDsgZ290byBlbmQ7IH0KKwkJCQkJfQorCQkJfQorCQllbHNlIGlmICh4Y2xhc3MgIT0gMCkKKwkJCXsKKwkJCXArPWxlbjsKKwkJCWlmIChCSU9fd3JpdGUoYnAsIlxuIiwxKSA8PSAwKSBnb3RvIGVuZDsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJbmw9MDsKKwkJCWlmICgJKHRhZyA9PSBWX0FTTjFfUFJJTlRBQkxFU1RSSU5HKSB8fAorCQkJCSh0YWcgPT0gVl9BU04xX1Q2MVNUUklORykgfHwKKwkJCQkodGFnID09IFZfQVNOMV9JQTVTVFJJTkcpIHx8CisJCQkJKHRhZyA9PSBWX0FTTjFfVklTSUJMRVNUUklORykgfHwKKwkJCQkodGFnID09IFZfQVNOMV9OVU1FUklDU1RSSU5HKSB8fAorCQkJCSh0YWcgPT0gVl9BU04xX1VURjhTVFJJTkcpIHx8CisJCQkJKHRhZyA9PSBWX0FTTjFfVVRDVElNRSkgfHwKKwkJCQkodGFnID09IFZfQVNOMV9HRU5FUkFMSVpFRFRJTUUpKQorCQkJCXsKKwkJCQlpZiAoQklPX3dyaXRlKGJwLCI6IiwxKSA8PSAwKSBnb3RvIGVuZDsKKwkJCQlpZiAoKGxlbiA+IDApICYmCisJCQkJCUJJT193cml0ZShicCwoY29uc3QgY2hhciAqKXAsKGludClsZW4pCisJCQkJCSE9IChpbnQpbGVuKQorCQkJCQlnb3RvIGVuZDsKKwkJCQl9CisJCQllbHNlIGlmICh0YWcgPT0gVl9BU04xX09CSkVDVCkKKwkJCQl7CisJCQkJb3BwPW9wOworCQkJCWlmIChkMmlfQVNOMV9PQkpFQ1QoJm8sJm9wcCxsZW4raGwpICE9IE5VTEwpCisJCQkJCXsKKwkJCQkJaWYgKEJJT193cml0ZShicCwiOiIsMSkgPD0gMCkgZ290byBlbmQ7CisJCQkJCWkyYV9BU04xX09CSkVDVChicCxvKTsKKwkJCQkJfQorCQkJCWVsc2UKKwkJCQkJeworCQkJCQlpZiAoQklPX3dyaXRlKGJwLCI6QkFEIE9CSkVDVCIsMTEpIDw9IDApCisJCQkJCQlnb3RvIGVuZDsKKwkJCQkJfQorCQkJCX0KKwkJCWVsc2UgaWYgKHRhZyA9PSBWX0FTTjFfQk9PTEVBTikKKwkJCQl7CisJCQkJaW50IGlpOworCisJCQkJb3BwPW9wOworCQkJCWlpPWQyaV9BU04xX0JPT0xFQU4oTlVMTCwmb3BwLGxlbitobCk7CisJCQkJaWYgKGlpIDwgMCkKKwkJCQkJeworCQkJCQlpZiAoQklPX3dyaXRlKGJwLCJCYWQgYm9vbGVhblxuIiwxMikgPD0gMCkKKwkJCQkJCWdvdG8gZW5kOworCQkJCQl9CisJCQkJQklPX3ByaW50ZihicCwiOiVkIixpaSk7CisJCQkJfQorCQkJZWxzZSBpZiAodGFnID09IFZfQVNOMV9CTVBTVFJJTkcpCisJCQkJeworCQkJCS8qIGRvIHRoZSBCTVAgdGhhbmcgKi8KKwkJCQl9CisJCQllbHNlIGlmICh0YWcgPT0gVl9BU04xX09DVEVUX1NUUklORykKKwkJCQl7CisJCQkJaW50IGkscHJpbnRhYmxlPTE7CisKKwkJCQlvcHA9b3A7CisJCQkJb3M9ZDJpX0FTTjFfT0NURVRfU1RSSU5HKE5VTEwsJm9wcCxsZW4raGwpOworCQkJCWlmIChvcyAhPSBOVUxMICYmIG9zLT5sZW5ndGggPiAwKQorCQkJCQl7CisJCQkJCW9wcCA9IG9zLT5kYXRhOworCQkJCQkvKiB0ZXN0aW5nIHdoZXRoZXIgdGhlIG9jdGV0IHN0cmluZyBpcworCQkJCQkgKiBwcmludGFibGUgKi8KKwkJCQkJZm9yIChpPTA7IGk8b3MtPmxlbmd0aDsgaSsrKQorCQkJCQkJeworCQkJCQkJaWYgKCgJKG9wcFtpXSA8ICcgJykgJiYKKwkJCQkJCQkob3BwW2ldICE9ICdcbicpICYmCisJCQkJCQkJKG9wcFtpXSAhPSAnXHInKSAmJgorCQkJCQkJCShvcHBbaV0gIT0gJ1x0JykpIHx8CisJCQkJCQkJKG9wcFtpXSA+ICd+JykpCisJCQkJCQkJeworCQkJCQkJCXByaW50YWJsZT0wOworCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJaWYgKHByaW50YWJsZSkKKwkJCQkJLyogcHJpbnRhYmxlIHN0cmluZyAqLworCQkJCQkJeworCQkJCQkJaWYgKEJJT193cml0ZShicCwiOiIsMSkgPD0gMCkKKwkJCQkJCQlnb3RvIGVuZDsKKwkJCQkJCWlmIChCSU9fd3JpdGUoYnAsKGNvbnN0IGNoYXIgKilvcHAsCisJCQkJCQkJb3MtPmxlbmd0aCkgPD0gMCkKKwkJCQkJCQlnb3RvIGVuZDsKKwkJCQkJCX0KKwkJCQkJZWxzZSBpZiAoIWR1bXApCisJCQkJCS8qIG5vdCBwcmludGFibGUgPT4gcHJpbnQgb2N0ZXQgc3RyaW5nCisJCQkJCSAqIGFzIGhleCBkdW1wICovCisJCQkJCQl7CisJCQkJCQlpZiAoQklPX3dyaXRlKGJwLCJbSEVYIERVTVBdOiIsMTEpIDw9IDApCisJCQkJCQkJZ290byBlbmQ7CisJCQkJCQlmb3IgKGk9MDsgaTxvcy0+bGVuZ3RoOyBpKyspCisJCQkJCQkJeworCQkJCQkJCWlmIChCSU9fcHJpbnRmKGJwLCIlMDJYIgorCQkJCQkJCQksIG9wcFtpXSkgPD0gMCkKKwkJCQkJCQkJZ290byBlbmQ7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQllbHNlCisJCQkJCS8qIHByaW50IHRoZSBub3JtYWwgZHVtcCAqLworCQkJCQkJeworCQkJCQkJaWYgKCFubCkgCisJCQkJCQkJeworCQkJCQkJCWlmIChCSU9fd3JpdGUoYnAsIlxuIiwxKSA8PSAwKQorCQkJCQkJCQlnb3RvIGVuZDsKKwkJCQkJCQl9CisJCQkJCQlpZiAoIUJJT19oZXhkdW1wKGJwLCBvcHAsCisJCQkJCQkJKChkdW1wID09IC0xIHx8IGR1bXAgPiAKKwkJCQkJCQlvcy0+bGVuZ3RoKT9vcy0+bGVuZ3RoOmR1bXApLAorCQkJCQkJCWR1bXBfaW5kZW50KSkKKwkJCQkJCQlnb3RvIGVuZDsKKwkJCQkJCW5sPTE7CisJCQkJCQl9CisJCQkJCX0KKwkJCQlpZiAob3MgIT0gTlVMTCkKKwkJCQkJeworCQkJCQlNX0FTTjFfT0NURVRfU1RSSU5HX2ZyZWUob3MpOworCQkJCQlvcz1OVUxMOworCQkJCQl9CisJCQkJfQorCQkJZWxzZSBpZiAodGFnID09IFZfQVNOMV9JTlRFR0VSKQorCQkJCXsKKwkJCQlBU04xX0lOVEVHRVIgKmJzOworCQkJCWludCBpOworCisJCQkJb3BwPW9wOworCQkJCWJzPWQyaV9BU04xX0lOVEVHRVIoTlVMTCwmb3BwLGxlbitobCk7CisJCQkJaWYgKGJzICE9IE5VTEwpCisJCQkJCXsKKwkJCQkJaWYgKEJJT193cml0ZShicCwiOiIsMSkgPD0gMCkgZ290byBlbmQ7CisJCQkJCWlmIChicy0+dHlwZSA9PSBWX0FTTjFfTkVHX0lOVEVHRVIpCisJCQkJCQlpZiAoQklPX3dyaXRlKGJwLCItIiwxKSA8PSAwKQorCQkJCQkJCWdvdG8gZW5kOworCQkJCQlmb3IgKGk9MDsgaTxicy0+bGVuZ3RoOyBpKyspCisJCQkJCQl7CisJCQkJCQlpZiAoQklPX3ByaW50ZihicCwiJTAyWCIsCisJCQkJCQkJYnMtPmRhdGFbaV0pIDw9IDApCisJCQkJCQkJZ290byBlbmQ7CisJCQkJCQl9CisJCQkJCWlmIChicy0+bGVuZ3RoID09IDApCisJCQkJCQl7CisJCQkJCQlpZiAoQklPX3dyaXRlKGJwLCIwMCIsMikgPD0gMCkKKwkJCQkJCQlnb3RvIGVuZDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCWVsc2UKKwkJCQkJeworCQkJCQlpZiAoQklPX3dyaXRlKGJwLCJCQUQgSU5URUdFUiIsMTEpIDw9IDApCisJCQkJCQlnb3RvIGVuZDsKKwkJCQkJfQorCQkJCU1fQVNOMV9JTlRFR0VSX2ZyZWUoYnMpOworCQkJCX0KKwkJCWVsc2UgaWYgKHRhZyA9PSBWX0FTTjFfRU5VTUVSQVRFRCkKKwkJCQl7CisJCQkJQVNOMV9FTlVNRVJBVEVEICpiczsKKwkJCQlpbnQgaTsKKworCQkJCW9wcD1vcDsKKwkJCQlicz1kMmlfQVNOMV9FTlVNRVJBVEVEKE5VTEwsJm9wcCxsZW4raGwpOworCQkJCWlmIChicyAhPSBOVUxMKQorCQkJCQl7CisJCQkJCWlmIChCSU9fd3JpdGUoYnAsIjoiLDEpIDw9IDApIGdvdG8gZW5kOworCQkJCQlpZiAoYnMtPnR5cGUgPT0gVl9BU04xX05FR19FTlVNRVJBVEVEKQorCQkJCQkJaWYgKEJJT193cml0ZShicCwiLSIsMSkgPD0gMCkKKwkJCQkJCQlnb3RvIGVuZDsKKwkJCQkJZm9yIChpPTA7IGk8YnMtPmxlbmd0aDsgaSsrKQorCQkJCQkJeworCQkJCQkJaWYgKEJJT19wcmludGYoYnAsIiUwMlgiLAorCQkJCQkJCWJzLT5kYXRhW2ldKSA8PSAwKQorCQkJCQkJCWdvdG8gZW5kOworCQkJCQkJfQorCQkJCQlpZiAoYnMtPmxlbmd0aCA9PSAwKQorCQkJCQkJeworCQkJCQkJaWYgKEJJT193cml0ZShicCwiMDAiLDIpIDw9IDApCisJCQkJCQkJZ290byBlbmQ7CisJCQkJCQl9CisJCQkJCX0KKwkJCQllbHNlCisJCQkJCXsKKwkJCQkJaWYgKEJJT193cml0ZShicCwiQkFEIEVOVU1FUkFURUQiLDExKSA8PSAwKQorCQkJCQkJZ290byBlbmQ7CisJCQkJCX0KKwkJCQlNX0FTTjFfRU5VTUVSQVRFRF9mcmVlKGJzKTsKKwkJCQl9CisJCQllbHNlIGlmIChsZW4gPiAwICYmIGR1bXApCisJCQkJeworCQkJCWlmICghbmwpIAorCQkJCQl7CisJCQkJCWlmIChCSU9fd3JpdGUoYnAsIlxuIiwxKSA8PSAwKQorCQkJCQkJZ290byBlbmQ7CisJCQkJCX0KKwkJCQlpZiAoIUJJT19oZXhkdW1wKGJwLHAsCisJCQkJCSgoZHVtcCA9PSAtMSB8fCBkdW1wID4gbGVuKT9sZW46ZHVtcCksCisJCQkJCWR1bXBfaW5kZW50KSkKKwkJCQkJZ290byBlbmQ7CisJCQkJbmw9MTsKKwkJCQl9CisKKwkJCWlmICghbmwpIAorCQkJCXsKKwkJCQlpZiAoQklPX3dyaXRlKGJwLCJcbiIsMSkgPD0gMCkgZ290byBlbmQ7CisJCQkJfQorCQkJcCs9bGVuOworCQkJaWYgKCh0YWcgPT0gVl9BU04xX0VPQykgJiYgKHhjbGFzcyA9PSAwKSkKKwkJCQl7CisJCQkJcmV0PTI7IC8qIEVuZCBvZiBzZXF1ZW5jZSAqLworCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCX0KKwkJbGVuZ3RoLT1sZW47CisJCX0KKwlyZXQ9MTsKK2VuZDoKKwlpZiAobyAhPSBOVUxMKSBBU04xX09CSkVDVF9mcmVlKG8pOworCWlmIChvcyAhPSBOVUxMKSBNX0FTTjFfT0NURVRfU1RSSU5HX2ZyZWUob3MpOworCSpwcD1wOworCXJldHVybihyZXQpOworCX0KKworY29uc3QgY2hhciAqQVNOMV90YWcyc3RyKGludCB0YWcpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0YWcyc3RyW10gPSB7CisJICJFT0MiLCAiQk9PTEVBTiIsICJJTlRFR0VSIiwgIkJJVCBTVFJJTkciLCAiT0NURVQgU1RSSU5HIiwgLyogMC00ICovCisJICJOVUxMIiwgIk9CSkVDVCIsICJPQkpFQ1QgREVTQ1JJUFRPUiIsICJFWFRFUk5BTCIsICJSRUFMIiwgLyogNS05ICovCisJICJFTlVNRVJBVEVEIiwgIjxBU04xIDExPiIsICJVVEY4U1RSSU5HIiwgIjxBU04xIDEzPiIsIAkgICAgLyogMTAtMTMgKi8KKwkiPEFTTjEgMTQ+IiwgIjxBU04xIDE1PiIsICJTRVFVRU5DRSIsICJTRVQiLCAJCSAgICAvKiAxNS0xNyAqLworCSJOVU1FUklDU1RSSU5HIiwgIlBSSU5UQUJMRVNUUklORyIsICJUNjFTVFJJTkciLAkgICAgLyogMTgtMjAgKi8KKwkiVklERU9URVhTVFJJTkciLCAiSUE1U1RSSU5HIiwgIlVUQ1RJTUUiLCJHRU5FUkFMSVpFRFRJTUUiLCAvKiAyMS0yNCAqLworCSJHUkFQSElDU1RSSU5HIiwgIlZJU0lCTEVTVFJJTkciLCAiR0VORVJBTFNUUklORyIsCSAgICAvKiAyNS0yNyAqLworCSJVTklWRVJTQUxTVFJJTkciLCAiPEFTTjEgMjk+IiwgIkJNUFNUUklORyIJCSAgICAvKiAyOC0zMCAqLworCX07CisKKwlpZigodGFnID09IFZfQVNOMV9ORUdfSU5URUdFUikgfHwgKHRhZyA9PSBWX0FTTjFfTkVHX0VOVU1FUkFURUQpKQorCQkJCQkJCXRhZyAmPSB+MHgxMDA7CisKKwlpZih0YWcgPCAwIHx8IHRhZyA+IDMwKSByZXR1cm4gIih1bmtub3duKSI7CisJcmV0dXJuIHRhZzJzdHJbdGFnXTsKK30KKwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FzbjEvYXNuMXQuaCBiL2NyeXB0by9hc24xL2FzbjF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE1OWFhYQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9hc24xL2FzbjF0LmgKQEAgLTAsMCArMSw5NTkgQEAKKy8qIGFzbjF0LmggKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDAwLgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKyNpZm5kZWYgSEVBREVSX0FTTjFUX0gKKyNkZWZpbmUgSEVBREVSX0FTTjFUX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorCisjaWZkZWYgT1BFTlNTTF9CVUlMRF9TSExJQkNSWVBUTworIyB1bmRlZiBPUEVOU1NMX0VYVEVSTgorIyBkZWZpbmUgT1BFTlNTTF9FWFRFUk4gT1BFTlNTTF9FWFBPUlQKKyNlbmRpZgorCisvKiBBU04xIHRlbXBsYXRlIGRlZmluZXMsIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucyAqLworCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKyNpZm5kZWYgT1BFTlNTTF9FWFBPUlRfVkFSX0FTX0ZVTkNUSU9OCisKKy8qIE1hY3JvIHRvIG9idGFpbiBBU04xX0FEQiBwb2ludGVyIGZyb20gYSB0eXBlIChvbmx5IHVzZWQgaW50ZXJuYWxseSkgKi8KKyNkZWZpbmUgQVNOMV9BREJfcHRyKGlwdHIpICgoY29uc3QgQVNOMV9BREIgKikoaXB0cikpCisKKworLyogTWFjcm9zIGZvciBzdGFydCBhbmQgZW5kIG9mIEFTTjFfSVRFTSBkZWZpbml0aW9uICovCisKKyNkZWZpbmUgQVNOMV9JVEVNX3N0YXJ0KGl0bmFtZSkgXAorCWNvbnN0IEFTTjFfSVRFTSBpdG5hbWUjI19pdCA9IHsKKworI2RlZmluZSBBU04xX0lURU1fZW5kKGl0bmFtZSkgXAorCQl9OworCisjZWxzZQorCisvKiBNYWNybyB0byBvYnRhaW4gQVNOMV9BREIgcG9pbnRlciBmcm9tIGEgdHlwZSAob25seSB1c2VkIGludGVybmFsbHkpICovCisjZGVmaW5lIEFTTjFfQURCX3B0cihpcHRyKSAoKGNvbnN0IEFTTjFfQURCICopKGlwdHIoKSkpCisKKworLyogTWFjcm9zIGZvciBzdGFydCBhbmQgZW5kIG9mIEFTTjFfSVRFTSBkZWZpbml0aW9uICovCisKKyNkZWZpbmUgQVNOMV9JVEVNX3N0YXJ0KGl0bmFtZSkgXAorCWNvbnN0IEFTTjFfSVRFTSAqIGl0bmFtZSMjX2l0KHZvaWQpIFwKKwl7IFwKKwkJc3RhdGljIGNvbnN0IEFTTjFfSVRFTSBsb2NhbF9pdCA9IHsgCisKKyNkZWZpbmUgQVNOMV9JVEVNX2VuZChpdG5hbWUpIFwKKwkJfTsgXAorCXJldHVybiAmbG9jYWxfaXQ7IFwKKwl9CisKKyNlbmRpZgorCisKKy8qIE1hY3JvcyB0byBhaWQgQVNOMSB0ZW1wbGF0ZSB3cml0aW5nICovCisKKyNkZWZpbmUgQVNOMV9JVEVNX1RFTVBMQVRFKHRuYW1lKSBcCisJc3RhdGljIGNvbnN0IEFTTjFfVEVNUExBVEUgdG5hbWUjI19pdGVtX3R0IAorCisjZGVmaW5lIEFTTjFfSVRFTV9URU1QTEFURV9FTkQodG5hbWUpIFwKKwk7XAorCUFTTjFfSVRFTV9zdGFydCh0bmFtZSkgXAorCQlBU04xX0lUWVBFX1BSSU1JVElWRSxcCisJCS0xLFwKKwkJJnRuYW1lIyNfaXRlbV90dCxcCisJCTAsXAorCQlOVUxMLFwKKwkJMCxcCisJCSN0bmFtZSBcCisJQVNOMV9JVEVNX2VuZCh0bmFtZSkKKworCisvKiBUaGlzIGlzIGEgQVNOMSB0eXBlIHdoaWNoIGp1c3QgZW1iZWRzIGEgdGVtcGxhdGUgKi8KKyAKKy8qIFRoaXMgcGFpciBoZWxwcyBkZWNsYXJlIGEgU0VRVUVOQ0UuIFdlIGNhbiBkbzoKKyAqCisgKiAJQVNOMV9TRVFVRU5DRShzdG5hbWUpID0geworICogCQkuLi4gU0VRVUVOQ0UgY29tcG9uZW50cyAuLi4KKyAqIAl9IEFTTjFfU0VRVUVOQ0VfRU5EKHN0bmFtZSkKKyAqCisgKiAJVGhpcyB3aWxsIHByb2R1Y2UgYW4gQVNOMV9JVEVNIGNhbGxlZCBzdG5hbWVfaXQKKyAqCWZvciBhIHN0cnVjdHVyZSBjYWxsZWQgc3RuYW1lLgorICoKKyAqIAlJZiB5b3Ugd2FudCB0aGUgc2FtZSBzdHJ1Y3R1cmUgYnV0IGEgZGlmZmVyZW50CisgKgluYW1lIHRoZW4gdXNlOgorICoKKyAqIAlBU04xX1NFUVVFTkNFKGl0bmFtZSkgPSB7CisgKiAJCS4uLiBTRVFVRU5DRSBjb21wb25lbnRzIC4uLgorICogCX0gQVNOMV9TRVFVRU5DRV9FTkRfbmFtZShzdG5hbWUsIGl0bmFtZSkKKyAqCisgKglUaGlzIHdpbGwgY3JlYXRlIGFuIGl0ZW0gY2FsbGVkIGl0bmFtZV9pdCB1c2luZworICoJYSBzdHJ1Y3R1cmUgY2FsbGVkIHN0bmFtZS4KKyAqLworCisjZGVmaW5lIEFTTjFfU0VRVUVOQ0UodG5hbWUpIFwKKwlzdGF0aWMgY29uc3QgQVNOMV9URU1QTEFURSB0bmFtZSMjX3NlcV90dFtdIAorCisjZGVmaW5lIEFTTjFfU0VRVUVOQ0VfRU5EKHN0bmFtZSkgQVNOMV9TRVFVRU5DRV9FTkRfbmFtZShzdG5hbWUsIHN0bmFtZSkKKworI2RlZmluZSBBU04xX1NFUVVFTkNFX0VORF9uYW1lKHN0bmFtZSwgdG5hbWUpIFwKKwk7XAorCUFTTjFfSVRFTV9zdGFydCh0bmFtZSkgXAorCQlBU04xX0lUWVBFX1NFUVVFTkNFLFwKKwkJVl9BU04xX1NFUVVFTkNFLFwKKwkJdG5hbWUjI19zZXFfdHQsXAorCQlzaXplb2YodG5hbWUjI19zZXFfdHQpIC8gc2l6ZW9mKEFTTjFfVEVNUExBVEUpLFwKKwkJTlVMTCxcCisJCXNpemVvZihzdG5hbWUpLFwKKwkJI3N0bmFtZSBcCisJQVNOMV9JVEVNX2VuZCh0bmFtZSkKKworI2RlZmluZSBBU04xX05ERUZfU0VRVUVOQ0UodG5hbWUpIFwKKwlBU04xX1NFUVVFTkNFKHRuYW1lKQorCisjZGVmaW5lIEFTTjFfTkRFRl9TRVFVRU5DRV9jYih0bmFtZSwgY2IpIFwKKwlBU04xX1NFUVVFTkNFX2NiKHRuYW1lLCBjYikKKworI2RlZmluZSBBU04xX1NFUVVFTkNFX2NiKHRuYW1lLCBjYikgXAorCXN0YXRpYyBjb25zdCBBU04xX0FVWCB0bmFtZSMjX2F1eCA9IHtOVUxMLCAwLCAwLCAwLCBjYiwgMH07IFwKKwlBU04xX1NFUVVFTkNFKHRuYW1lKQorCisjZGVmaW5lIEFTTjFfQlJPS0VOX1NFUVVFTkNFKHRuYW1lKSBcCisJc3RhdGljIGNvbnN0IEFTTjFfQVVYIHRuYW1lIyNfYXV4ID0ge05VTEwsIEFTTjFfQUZMR19CUk9LRU4sIDAsIDAsIDAsIDB9OyBcCisJQVNOMV9TRVFVRU5DRSh0bmFtZSkKKworI2RlZmluZSBBU04xX1NFUVVFTkNFX3JlZih0bmFtZSwgY2IsIGxjaykgXAorCXN0YXRpYyBjb25zdCBBU04xX0FVWCB0bmFtZSMjX2F1eCA9IHtOVUxMLCBBU04xX0FGTEdfUkVGQ09VTlQsIG9mZnNldG9mKHRuYW1lLCByZWZlcmVuY2VzKSwgbGNrLCBjYiwgMH07IFwKKwlBU04xX1NFUVVFTkNFKHRuYW1lKQorCisjZGVmaW5lIEFTTjFfU0VRVUVOQ0VfZW5jKHRuYW1lLCBlbmMsIGNiKSBcCisJc3RhdGljIGNvbnN0IEFTTjFfQVVYIHRuYW1lIyNfYXV4ID0ge05VTEwsIEFTTjFfQUZMR19FTkNPRElORywgMCwgMCwgY2IsIG9mZnNldG9mKHRuYW1lLCBlbmMpfTsgXAorCUFTTjFfU0VRVUVOQ0UodG5hbWUpCisKKyNkZWZpbmUgQVNOMV9OREVGX1NFUVVFTkNFX0VORCh0bmFtZSkgXAorCTtcCisJQVNOMV9JVEVNX3N0YXJ0KHRuYW1lKSBcCisJCUFTTjFfSVRZUEVfTkRFRl9TRVFVRU5DRSxcCisJCVZfQVNOMV9TRVFVRU5DRSxcCisJCXRuYW1lIyNfc2VxX3R0LFwKKwkJc2l6ZW9mKHRuYW1lIyNfc2VxX3R0KSAvIHNpemVvZihBU04xX1RFTVBMQVRFKSxcCisJCU5VTEwsXAorCQlzaXplb2YodG5hbWUpLFwKKwkJI3RuYW1lIFwKKwlBU04xX0lURU1fZW5kKHRuYW1lKQorCisjZGVmaW5lIEFTTjFfQlJPS0VOX1NFUVVFTkNFX0VORChzdG5hbWUpIEFTTjFfU0VRVUVOQ0VfRU5EX3JlZihzdG5hbWUsIHN0bmFtZSkKKworI2RlZmluZSBBU04xX1NFUVVFTkNFX0VORF9lbmMoc3RuYW1lLCB0bmFtZSkgQVNOMV9TRVFVRU5DRV9FTkRfcmVmKHN0bmFtZSwgdG5hbWUpCisKKyNkZWZpbmUgQVNOMV9TRVFVRU5DRV9FTkRfY2Ioc3RuYW1lLCB0bmFtZSkgQVNOMV9TRVFVRU5DRV9FTkRfcmVmKHN0bmFtZSwgdG5hbWUpCisKKyNkZWZpbmUgQVNOMV9TRVFVRU5DRV9FTkRfcmVmKHN0bmFtZSwgdG5hbWUpIFwKKwk7XAorCUFTTjFfSVRFTV9zdGFydCh0bmFtZSkgXAorCQlBU04xX0lUWVBFX1NFUVVFTkNFLFwKKwkJVl9BU04xX1NFUVVFTkNFLFwKKwkJdG5hbWUjI19zZXFfdHQsXAorCQlzaXplb2YodG5hbWUjI19zZXFfdHQpIC8gc2l6ZW9mKEFTTjFfVEVNUExBVEUpLFwKKwkJJnRuYW1lIyNfYXV4LFwKKwkJc2l6ZW9mKHN0bmFtZSksXAorCQkjc3RuYW1lIFwKKwlBU04xX0lURU1fZW5kKHRuYW1lKQorCisjZGVmaW5lIEFTTjFfTkRFRl9TRVFVRU5DRV9FTkRfY2Ioc3RuYW1lLCB0bmFtZSkgXAorCTtcCisJQVNOMV9JVEVNX3N0YXJ0KHRuYW1lKSBcCisJCUFTTjFfSVRZUEVfTkRFRl9TRVFVRU5DRSxcCisJCVZfQVNOMV9TRVFVRU5DRSxcCisJCXRuYW1lIyNfc2VxX3R0LFwKKwkJc2l6ZW9mKHRuYW1lIyNfc2VxX3R0KSAvIHNpemVvZihBU04xX1RFTVBMQVRFKSxcCisJCSZ0bmFtZSMjX2F1eCxcCisJCXNpemVvZihzdG5hbWUpLFwKKwkJI3N0bmFtZSBcCisJQVNOMV9JVEVNX2VuZCh0bmFtZSkKKworCisvKiBUaGlzIHBhaXIgaGVscHMgZGVjbGFyZSBhIENIT0lDRSB0eXBlLiBXZSBjYW4gZG86CisgKgorICogCUFTTjFfQ0hPSUNFKGNobmFtZSkgPSB7CisgKiAJCS4uLiBDSE9JQ0Ugb3B0aW9ucyAuLi4KKyAqIAlBU04xX0NIT0lDRV9FTkQoY2huYW1lKQorICoKKyAqIAlUaGlzIHdpbGwgcHJvZHVjZSBhbiBBU04xX0lURU0gY2FsbGVkIGNobmFtZV9pdAorICoJZm9yIGEgc3RydWN0dXJlIGNhbGxlZCBjaG5hbWUuIFRoZSBzdHJ1Y3R1cmUKKyAqCWRlZmluaXRpb24gbXVzdCBsb29rIGxpa2UgdGhpczoKKyAqCXR5cGVkZWYgc3RydWN0IHsKKyAqCQlpbnQgdHlwZTsKKyAqCQl1bmlvbiB7CisgKgkJCUFTTjFfU09NRVRISU5HICpvcHQxOworICoJCQlBU04xX1NPTUVPVEhFUiAqb3B0MjsKKyAqCQl9IHZhbHVlOworICoJfSBjaG5hbWU7CisgKgkKKyAqCXRoZSBuYW1lIG9mIHRoZSBzZWxlY3RvciBtdXN0IGJlICd0eXBlJy4KKyAqIAl0byB1c2UgYW4gYWx0ZXJuYXRpdmUgc2VsZWN0b3IgbmFtZSB1c2UgdGhlCisgKiAgICAgIEFTTjFfQ0hPSUNFX0VORF9zZWxlY3RvcigpIHZlcnNpb24uCisgKi8KKworI2RlZmluZSBBU04xX0NIT0lDRSh0bmFtZSkgXAorCXN0YXRpYyBjb25zdCBBU04xX1RFTVBMQVRFIHRuYW1lIyNfY2hfdHRbXSAKKworI2RlZmluZSBBU04xX0NIT0lDRV9jYih0bmFtZSwgY2IpIFwKKwlzdGF0aWMgY29uc3QgQVNOMV9BVVggdG5hbWUjI19hdXggPSB7TlVMTCwgMCwgMCwgMCwgY2IsIDB9OyBcCisJQVNOMV9DSE9JQ0UodG5hbWUpCisKKyNkZWZpbmUgQVNOMV9DSE9JQ0VfRU5EKHN0bmFtZSkgQVNOMV9DSE9JQ0VfRU5EX25hbWUoc3RuYW1lLCBzdG5hbWUpCisKKyNkZWZpbmUgQVNOMV9DSE9JQ0VfRU5EX25hbWUoc3RuYW1lLCB0bmFtZSkgQVNOMV9DSE9JQ0VfRU5EX3NlbGVjdG9yKHN0bmFtZSwgdG5hbWUsIHR5cGUpCisKKyNkZWZpbmUgQVNOMV9DSE9JQ0VfRU5EX3NlbGVjdG9yKHN0bmFtZSwgdG5hbWUsIHNlbG5hbWUpIFwKKwk7XAorCUFTTjFfSVRFTV9zdGFydCh0bmFtZSkgXAorCQlBU04xX0lUWVBFX0NIT0lDRSxcCisJCW9mZnNldG9mKHN0bmFtZSxzZWxuYW1lKSAsXAorCQl0bmFtZSMjX2NoX3R0LFwKKwkJc2l6ZW9mKHRuYW1lIyNfY2hfdHQpIC8gc2l6ZW9mKEFTTjFfVEVNUExBVEUpLFwKKwkJTlVMTCxcCisJCXNpemVvZihzdG5hbWUpLFwKKwkJI3N0bmFtZSBcCisJQVNOMV9JVEVNX2VuZCh0bmFtZSkKKworI2RlZmluZSBBU04xX0NIT0lDRV9FTkRfY2Ioc3RuYW1lLCB0bmFtZSwgc2VsbmFtZSkgXAorCTtcCisJQVNOMV9JVEVNX3N0YXJ0KHRuYW1lKSBcCisJCUFTTjFfSVRZUEVfQ0hPSUNFLFwKKwkJb2Zmc2V0b2Yoc3RuYW1lLHNlbG5hbWUpICxcCisJCXRuYW1lIyNfY2hfdHQsXAorCQlzaXplb2YodG5hbWUjI19jaF90dCkgLyBzaXplb2YoQVNOMV9URU1QTEFURSksXAorCQkmdG5hbWUjI19hdXgsXAorCQlzaXplb2Yoc3RuYW1lKSxcCisJCSNzdG5hbWUgXAorCUFTTjFfSVRFTV9lbmQodG5hbWUpCisKKy8qIFRoaXMgaGVscHMgd2l0aCB0aGUgdGVtcGxhdGUgd3JhcHBlciBmb3JtIG9mIEFTTjFfSVRFTSAqLworCisjZGVmaW5lIEFTTjFfRVhfVEVNUExBVEVfVFlQRShmbGFncywgdGFnLCBuYW1lLCB0eXBlKSB7IFwKKwkoZmxhZ3MpLCAodGFnKSwgMCxcCisJI25hbWUsIEFTTjFfSVRFTV9yZWYodHlwZSkgfQorCisvKiBUaGVzZSBoZWxwIHdpdGggU0VRVUVOQ0Ugb3IgQ0hPSUNFIGNvbXBvbmVudHMgKi8KKworLyogdXNlZCB0byBkZWNsYXJlIG90aGVyIHR5cGVzICovCisKKyNkZWZpbmUgQVNOMV9FWF9UWVBFKGZsYWdzLCB0YWcsIHN0bmFtZSwgZmllbGQsIHR5cGUpIHsgXAorCShmbGFncyksICh0YWcpLCBvZmZzZXRvZihzdG5hbWUsIGZpZWxkKSxcCisJI2ZpZWxkLCBBU04xX0lURU1fcmVmKHR5cGUpIH0KKworLyogdXNlZCB3aGVuIHRoZSBzdHJ1Y3R1cmUgaXMgY29tYmluZWQgd2l0aCB0aGUgcGFyZW50ICovCisKKyNkZWZpbmUgQVNOMV9FWF9DT01CSU5FKGZsYWdzLCB0YWcsIHR5cGUpIHsgXAorCShmbGFncyl8QVNOMV9URkxHX0NPTUJJTkUsICh0YWcpLCAwLCBOVUxMLCBBU04xX0lURU1fcmVmKHR5cGUpIH0KKworLyogaW1wbGljaXQgYW5kIGV4cGxpY2l0IGhlbHBlciBtYWNyb3MgKi8KKworI2RlZmluZSBBU04xX0lNUF9FWChzdG5hbWUsIGZpZWxkLCB0eXBlLCB0YWcsIGV4KSBcCisJCUFTTjFfRVhfVFlQRShBU04xX1RGTEdfSU1QTElDSVQgfCBleCwgdGFnLCBzdG5hbWUsIGZpZWxkLCB0eXBlKQorCisjZGVmaW5lIEFTTjFfRVhQX0VYKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZywgZXgpIFwKKwkJQVNOMV9FWF9UWVBFKEFTTjFfVEZMR19FWFBMSUNJVCB8IGV4LCB0YWcsIHN0bmFtZSwgZmllbGQsIHR5cGUpCisKKy8qIEFueSBkZWZpbmVkIGJ5IG1hY3JvczogdGhlIGZpZWxkIHVzZWQgaXMgaW4gdGhlIHRhYmxlIGl0c2VsZiAqLworCisjaWZuZGVmIE9QRU5TU0xfRVhQT1JUX1ZBUl9BU19GVU5DVElPTgorI2RlZmluZSBBU04xX0FEQl9PQkpFQ1QodGJsbmFtZSkgeyBBU04xX1RGTEdfQURCX09JRCwgLTEsIDAsICN0YmxuYW1lLCAoY29uc3QgQVNOMV9JVEVNICopJih0YmxuYW1lIyNfYWRiKSB9CisjZGVmaW5lIEFTTjFfQURCX0lOVEVHRVIodGJsbmFtZSkgeyBBU04xX1RGTEdfQURCX0lOVCwgLTEsIDAsICN0YmxuYW1lLCAoY29uc3QgQVNOMV9JVEVNICopJih0YmxuYW1lIyNfYWRiKSB9CisjZWxzZQorI2RlZmluZSBBU04xX0FEQl9PQkpFQ1QodGJsbmFtZSkgeyBBU04xX1RGTEdfQURCX09JRCwgLTEsIDAsICN0YmxuYW1lLCB0YmxuYW1lIyNfYWRiIH0KKyNkZWZpbmUgQVNOMV9BREJfSU5URUdFUih0YmxuYW1lKSB7IEFTTjFfVEZMR19BREJfSU5ULCAtMSwgMCwgI3RibG5hbWUsIHRibG5hbWUjI19hZGIgfQorI2VuZGlmCisvKiBQbGFpbiBzaW1wbGUgdHlwZSAqLworI2RlZmluZSBBU04xX1NJTVBMRShzdG5hbWUsIGZpZWxkLCB0eXBlKSBBU04xX0VYX1RZUEUoMCwwLCBzdG5hbWUsIGZpZWxkLCB0eXBlKQorCisvKiBPUFRJT05BTCBzaW1wbGUgdHlwZSAqLworI2RlZmluZSBBU04xX09QVChzdG5hbWUsIGZpZWxkLCB0eXBlKSBBU04xX0VYX1RZUEUoQVNOMV9URkxHX09QVElPTkFMLCAwLCBzdG5hbWUsIGZpZWxkLCB0eXBlKQorCisvKiBJTVBMSUNJVCB0YWdnZWQgc2ltcGxlIHR5cGUgKi8KKyNkZWZpbmUgQVNOMV9JTVAoc3RuYW1lLCBmaWVsZCwgdHlwZSwgdGFnKSBBU04xX0lNUF9FWChzdG5hbWUsIGZpZWxkLCB0eXBlLCB0YWcsIDApCisKKy8qIElNUExJQ0lUIHRhZ2dlZCBPUFRJT05BTCBzaW1wbGUgdHlwZSAqLworI2RlZmluZSBBU04xX0lNUF9PUFQoc3RuYW1lLCBmaWVsZCwgdHlwZSwgdGFnKSBBU04xX0lNUF9FWChzdG5hbWUsIGZpZWxkLCB0eXBlLCB0YWcsIEFTTjFfVEZMR19PUFRJT05BTCkKKworLyogU2FtZSBhcyBhYm92ZSBidXQgRVhQTElDSVQgKi8KKworI2RlZmluZSBBU04xX0VYUChzdG5hbWUsIGZpZWxkLCB0eXBlLCB0YWcpIEFTTjFfRVhQX0VYKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZywgMCkKKyNkZWZpbmUgQVNOMV9FWFBfT1BUKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZykgQVNOMV9FWFBfRVgoc3RuYW1lLCBmaWVsZCwgdHlwZSwgdGFnLCBBU04xX1RGTEdfT1BUSU9OQUwpCisKKy8qIFNFUVVFTkNFIE9GIHR5cGUgKi8KKyNkZWZpbmUgQVNOMV9TRVFVRU5DRV9PRihzdG5hbWUsIGZpZWxkLCB0eXBlKSBcCisJCUFTTjFfRVhfVFlQRShBU04xX1RGTEdfU0VRVUVOQ0VfT0YsIDAsIHN0bmFtZSwgZmllbGQsIHR5cGUpCisKKy8qIE9QVElPTkFMIFNFUVVFTkNFIE9GICovCisjZGVmaW5lIEFTTjFfU0VRVUVOQ0VfT0ZfT1BUKHN0bmFtZSwgZmllbGQsIHR5cGUpIFwKKwkJQVNOMV9FWF9UWVBFKEFTTjFfVEZMR19TRVFVRU5DRV9PRnxBU04xX1RGTEdfT1BUSU9OQUwsIDAsIHN0bmFtZSwgZmllbGQsIHR5cGUpCisKKy8qIFNhbWUgYXMgYWJvdmUgYnV0IGZvciBTRVQgT0YgKi8KKworI2RlZmluZSBBU04xX1NFVF9PRihzdG5hbWUsIGZpZWxkLCB0eXBlKSBcCisJCUFTTjFfRVhfVFlQRShBU04xX1RGTEdfU0VUX09GLCAwLCBzdG5hbWUsIGZpZWxkLCB0eXBlKQorCisjZGVmaW5lIEFTTjFfU0VUX09GX09QVChzdG5hbWUsIGZpZWxkLCB0eXBlKSBcCisJCUFTTjFfRVhfVFlQRShBU04xX1RGTEdfU0VUX09GfEFTTjFfVEZMR19PUFRJT05BTCwgMCwgc3RuYW1lLCBmaWVsZCwgdHlwZSkKKworLyogRmluYWxseSBjb21wb3VuZCB0eXBlcyBvZiBTRVFVRU5DRSwgU0VULCBJTVBMSUNJVCwgRVhQTElDSVQgYW5kIE9QVElPTkFMICovCisKKyNkZWZpbmUgQVNOMV9JTVBfU0VUX09GKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZykgXAorCQkJQVNOMV9JTVBfRVgoc3RuYW1lLCBmaWVsZCwgdHlwZSwgdGFnLCBBU04xX1RGTEdfU0VUX09GKQorCisjZGVmaW5lIEFTTjFfRVhQX1NFVF9PRihzdG5hbWUsIGZpZWxkLCB0eXBlLCB0YWcpIFwKKwkJCUFTTjFfRVhQX0VYKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZywgQVNOMV9URkxHX1NFVF9PRikKKworI2RlZmluZSBBU04xX0lNUF9TRVRfT0ZfT1BUKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZykgXAorCQkJQVNOMV9JTVBfRVgoc3RuYW1lLCBmaWVsZCwgdHlwZSwgdGFnLCBBU04xX1RGTEdfU0VUX09GfEFTTjFfVEZMR19PUFRJT05BTCkKKworI2RlZmluZSBBU04xX0VYUF9TRVRfT0ZfT1BUKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZykgXAorCQkJQVNOMV9FWFBfRVgoc3RuYW1lLCBmaWVsZCwgdHlwZSwgdGFnLCBBU04xX1RGTEdfU0VUX09GfEFTTjFfVEZMR19PUFRJT05BTCkKKworI2RlZmluZSBBU04xX0lNUF9TRVFVRU5DRV9PRihzdG5hbWUsIGZpZWxkLCB0eXBlLCB0YWcpIFwKKwkJCUFTTjFfSU1QX0VYKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZywgQVNOMV9URkxHX1NFUVVFTkNFX09GKQorCisjZGVmaW5lIEFTTjFfSU1QX1NFUVVFTkNFX09GX09QVChzdG5hbWUsIGZpZWxkLCB0eXBlLCB0YWcpIFwKKwkJCUFTTjFfSU1QX0VYKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZywgQVNOMV9URkxHX1NFUVVFTkNFX09GfEFTTjFfVEZMR19PUFRJT05BTCkKKworI2RlZmluZSBBU04xX0VYUF9TRVFVRU5DRV9PRihzdG5hbWUsIGZpZWxkLCB0eXBlLCB0YWcpIFwKKwkJCUFTTjFfRVhQX0VYKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZywgQVNOMV9URkxHX1NFUVVFTkNFX09GKQorCisjZGVmaW5lIEFTTjFfRVhQX1NFUVVFTkNFX09GX09QVChzdG5hbWUsIGZpZWxkLCB0eXBlLCB0YWcpIFwKKwkJCUFTTjFfRVhQX0VYKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZywgQVNOMV9URkxHX1NFUVVFTkNFX09GfEFTTjFfVEZMR19PUFRJT05BTCkKKworLyogRVhQTElDSVQgdXNpbmcgaW5kZWZpbml0ZSBsZW5ndGggY29uc3RydWN0ZWQgZm9ybSAqLworI2RlZmluZSBBU04xX05ERUZfRVhQKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZykgXAorCQkJQVNOMV9FWFBfRVgoc3RuYW1lLCBmaWVsZCwgdHlwZSwgdGFnLCBBU04xX1RGTEdfTkRFRikKKworLyogRVhQTElDSVQgT1BUSU9OQUwgdXNpbmcgaW5kZWZpbml0ZSBsZW5ndGggY29uc3RydWN0ZWQgZm9ybSAqLworI2RlZmluZSBBU04xX05ERUZfRVhQX09QVChzdG5hbWUsIGZpZWxkLCB0eXBlLCB0YWcpIFwKKwkJCUFTTjFfRVhQX0VYKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZywgQVNOMV9URkxHX09QVElPTkFMfEFTTjFfVEZMR19OREVGKQorCisvKiBNYWNyb3MgZm9yIHRoZSBBU04xX0FEQiBzdHJ1Y3R1cmUgKi8KKworI2RlZmluZSBBU04xX0FEQihuYW1lKSBcCisJc3RhdGljIGNvbnN0IEFTTjFfQURCX1RBQkxFIG5hbWUjI19hZGJ0YmxbXSAKKworI2lmbmRlZiBPUEVOU1NMX0VYUE9SVF9WQVJfQVNfRlVOQ1RJT04KKworI2RlZmluZSBBU04xX0FEQl9FTkQobmFtZSwgZmxhZ3MsIGZpZWxkLCBhcHBfdGFibGUsIGRlZiwgbm9uZSkgXAorCTtcCisJc3RhdGljIGNvbnN0IEFTTjFfQURCIG5hbWUjI19hZGIgPSB7XAorCQlmbGFncyxcCisJCW9mZnNldG9mKG5hbWUsIGZpZWxkKSxcCisJCWFwcF90YWJsZSxcCisJCW5hbWUjI19hZGJ0YmwsXAorCQlzaXplb2YobmFtZSMjX2FkYnRibCkgLyBzaXplb2YoQVNOMV9BREJfVEFCTEUpLFwKKwkJZGVmLFwKKwkJbm9uZVwKKwl9CisKKyNlbHNlCisKKyNkZWZpbmUgQVNOMV9BREJfRU5EKG5hbWUsIGZsYWdzLCBmaWVsZCwgYXBwX3RhYmxlLCBkZWYsIG5vbmUpIFwKKwk7XAorCXN0YXRpYyBjb25zdCBBU04xX0lURU0gKm5hbWUjI19hZGIodm9pZCkgXAorCXsgXAorCXN0YXRpYyBjb25zdCBBU04xX0FEQiBpbnRlcm5hbF9hZGIgPSBcCisJCXtcCisJCWZsYWdzLFwKKwkJb2Zmc2V0b2YobmFtZSwgZmllbGQpLFwKKwkJYXBwX3RhYmxlLFwKKwkJbmFtZSMjX2FkYnRibCxcCisJCXNpemVvZihuYW1lIyNfYWRidGJsKSAvIHNpemVvZihBU04xX0FEQl9UQUJMRSksXAorCQlkZWYsXAorCQlub25lXAorCQl9OyBcCisJCXJldHVybiAoY29uc3QgQVNOMV9JVEVNICopICZpbnRlcm5hbF9hZGI7IFwKKwl9IFwKKwl2b2lkIGR1bW15X2Z1bmN0aW9uKHZvaWQpCisKKyNlbmRpZgorCisjZGVmaW5lIEFEQl9FTlRSWSh2YWwsIHRlbXBsYXRlKSB7dmFsLCB0ZW1wbGF0ZX0KKworI2RlZmluZSBBU04xX0FEQl9URU1QTEFURShuYW1lKSBcCisJc3RhdGljIGNvbnN0IEFTTjFfVEVNUExBVEUgbmFtZSMjX3R0IAorCisvKiBUaGlzIGlzIHRoZSBBU04xIHRlbXBsYXRlIHN0cnVjdHVyZSB0aGF0IGRlZmluZXMKKyAqIGEgd3JhcHBlciByb3VuZCB0aGUgYWN0dWFsIHR5cGUuIEl0IGRldGVybWluZXMgdGhlCisgKiBhY3R1YWwgcG9zaXRpb24gb2YgdGhlIGZpZWxkIGluIHRoZSB2YWx1ZSBzdHJ1Y3R1cmUsCisgKiB2YXJpb3VzIGZsYWdzIHN1Y2ggYXMgT1BUSU9OQUwgYW5kIHRoZSBmaWVsZCBuYW1lLgorICovCisKK3N0cnVjdCBBU04xX1RFTVBMQVRFX3N0IHsKK3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CQkvKiBWYXJpb3VzIGZsYWdzICovCitsb25nIHRhZzsJCQkvKiB0YWcsIG5vdCB1c2VkIGlmIG5vIHRhZ2dpbmcgKi8KK3Vuc2lnbmVkIGxvbmcgb2Zmc2V0OwkJLyogT2Zmc2V0IG9mIHRoaXMgZmllbGQgaW4gc3RydWN0dXJlICovCisjaWZuZGVmIE5PX0FTTjFfRklFTERfTkFNRVMKK2NvbnN0IGNoYXIgKmZpZWxkX25hbWU7CQkvKiBGaWVsZCBuYW1lICovCisjZW5kaWYKK0FTTjFfSVRFTV9FWFAgKml0ZW07CQkvKiBSZWxldmFudCBBU04xX0lURU0gb3IgQVNOMV9BREIgKi8KK307CisKKy8qIE1hY3JvIHRvIGV4dHJhY3QgQVNOMV9JVEVNIGFuZCBBU04xX0FEQiBwb2ludGVyIGZyb20gQVNOMV9URU1QTEFURSAqLworCisjZGVmaW5lIEFTTjFfVEVNUExBVEVfaXRlbSh0KSAodC0+aXRlbV9wdHIpCisjZGVmaW5lIEFTTjFfVEVNUExBVEVfYWRiKHQpICh0LT5pdGVtX3B0cikKKwordHlwZWRlZiBzdHJ1Y3QgQVNOMV9BREJfVEFCTEVfc3QgQVNOMV9BREJfVEFCTEU7Cit0eXBlZGVmIHN0cnVjdCBBU04xX0FEQl9zdCBBU04xX0FEQjsKKworc3RydWN0IEFTTjFfQURCX3N0IHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwkvKiBWYXJpb3VzIGZsYWdzICovCisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CS8qIE9mZnNldCBvZiBzZWxlY3RvciBmaWVsZCAqLworCVNUQUNLX09GKEFTTjFfQURCX1RBQkxFKSAqKmFwcF9pdGVtczsgLyogQXBwbGljYXRpb24gZGVmaW5lZCBpdGVtcyAqLworCWNvbnN0IEFTTjFfQURCX1RBQkxFICp0Ymw7CS8qIFRhYmxlIG9mIHBvc3NpYmxlIHR5cGVzICovCisJbG9uZyB0Ymxjb3VudDsJCS8qIE51bWJlciBvZiBlbnRyaWVzIGluIHRibCAqLworCWNvbnN0IEFTTjFfVEVNUExBVEUgKmRlZmF1bHRfdHQ7ICAvKiBUeXBlIHRvIHVzZSBpZiBubyBtYXRjaCAqLworCWNvbnN0IEFTTjFfVEVNUExBVEUgKm51bGxfdHQ7ICAvKiBUeXBlIHRvIHVzZSBpZiBzZWxlY3RvciBpcyBOVUxMICovCit9OworCitzdHJ1Y3QgQVNOMV9BREJfVEFCTEVfc3QgeworCWxvbmcgdmFsdWU7CQkvKiBOSUQgZm9yIGFuIG9iamVjdCBvciB2YWx1ZSBmb3IgYW4gaW50ICovCisJY29uc3QgQVNOMV9URU1QTEFURSB0dDsJCS8qIGl0ZW0gZm9yIHRoaXMgdmFsdWUgKi8KK307CisKKy8qIHRlbXBsYXRlIGZsYWdzICovCisKKy8qIEZpZWxkIGlzIG9wdGlvbmFsICovCisjZGVmaW5lIEFTTjFfVEZMR19PUFRJT05BTAkoMHgxKQorCisvKiBGaWVsZCBpcyBhIFNFVCBPRiAqLworI2RlZmluZSBBU04xX1RGTEdfU0VUX09GCSgweDEgPDwgMSkKKworLyogRmllbGQgaXMgYSBTRVFVRU5DRSBPRiAqLworI2RlZmluZSBBU04xX1RGTEdfU0VRVUVOQ0VfT0YJKDB4MiA8PCAxKQorCisvKiBTcGVjaWFsIGNhc2U6IHRoaXMgcmVmZXJzIHRvIGEgU0VUIE9GIHRoYXQKKyAqIHdpbGwgYmUgc29ydGVkIGludG8gREVSIG9yZGVyIHdoZW4gZW5jb2RlZCAqYW5kKgorICogdGhlIGNvcnJlc3BvbmRpbmcgU1RBQ0sgd2lsbCBiZSBtb2RpZmllZCB0byBtYXRjaAorICogdGhlIG5ldyBvcmRlci4KKyAqLworI2RlZmluZSBBU04xX1RGTEdfU0VUX09SREVSCSgweDMgPDwgMSkKKworLyogTWFzayBmb3IgU0VUIE9GIG9yIFNFUVVFTkNFIE9GICovCisjZGVmaW5lIEFTTjFfVEZMR19TS19NQVNLCSgweDMgPDwgMSkKKworLyogVGhlc2UgZmxhZ3MgbWVhbiB0aGUgdGFnIHNob3VsZCBiZSB0YWtlbiBmcm9tIHRoZQorICogdGFnIGZpZWxkLiBJZiBFWFBMSUNJVCB0aGVuIHRoZSB1bmRlcmx5aW5nIHR5cGUKKyAqIGlzIHVzZWQgZm9yIHRoZSBpbm5lciB0YWcuCisgKi8KKworLyogSU1QTElDSVQgdGFnZ2luZyAqLworI2RlZmluZSBBU04xX1RGTEdfSU1QVEFHCSgweDEgPDwgMykKKworCisvKiBFWFBMSUNJVCB0YWdnaW5nLCBpbm5lciB0YWcgZnJvbSB1bmRlcmx5aW5nIHR5cGUgKi8KKyNkZWZpbmUgQVNOMV9URkxHX0VYUFRBRwkoMHgyIDw8IDMpCisKKyNkZWZpbmUgQVNOMV9URkxHX1RBR19NQVNLCSgweDMgPDwgMykKKworLyogY29udGV4dCBzcGVjaWZpYyBJTVBMSUNJVCAqLworI2RlZmluZSBBU04xX1RGTEdfSU1QTElDSVQJQVNOMV9URkxHX0lNUFRBR3xBU04xX1RGTEdfQ09OVEVYVAorCisvKiBjb250ZXh0IHNwZWNpZmljIEVYUExJQ0lUICovCisjZGVmaW5lIEFTTjFfVEZMR19FWFBMSUNJVAlBU04xX1RGTEdfRVhQVEFHfEFTTjFfVEZMR19DT05URVhUCisKKy8qIElmIHRhZ2dpbmcgaXMgaW4gZm9yY2UgdGhlc2UgZGV0ZXJtaW5lIHRoZQorICogdHlwZSBvZiB0YWcgdG8gdXNlLiBPdGhlcndpc2UgdGhlIHRhZyBpcworICogZGV0ZXJtaW5lZCBieSB0aGUgdW5kZXJseWluZyB0eXBlLiBUaGVzZSAKKyAqIHZhbHVlcyByZWZsZWN0IHRoZSBhY3R1YWwgb2N0ZXQgZm9ybWF0LgorICovCisKKy8qIFVuaXZlcnNhbCB0YWcgKi8gCisjZGVmaW5lIEFTTjFfVEZMR19VTklWRVJTQUwJKDB4MDw8NikKKy8qIEFwcGxpY2F0aW9uIHRhZyAqLyAKKyNkZWZpbmUgQVNOMV9URkxHX0FQUExJQ0FUSU9OCSgweDE8PDYpCisvKiBDb250ZXh0IHNwZWNpZmljIHRhZyAqLyAKKyNkZWZpbmUgQVNOMV9URkxHX0NPTlRFWFQJKDB4Mjw8NikKKy8qIFByaXZhdGUgdGFnICovIAorI2RlZmluZSBBU04xX1RGTEdfUFJJVkFURQkoMHgzPDw2KQorCisjZGVmaW5lIEFTTjFfVEZMR19UQUdfQ0xBU1MJKDB4Mzw8NikKKworLyogVGhlc2UgYXJlIGZvciBBTlkgREVGSU5FRCBCWSB0eXBlLiBJbiB0aGlzIGNhc2UKKyAqIHRoZSAnaXRlbScgZmllbGQgcG9pbnRzIHRvIGFuIEFTTjFfQURCIHN0cnVjdHVyZQorICogd2hpY2ggY29udGFpbnMgYSB0YWJsZSBvZiB2YWx1ZXMgdG8gZGVjb2RlIHRoZQorICogcmVsZXZhbnQgdHlwZQorICovCisKKyNkZWZpbmUgQVNOMV9URkxHX0FEQl9NQVNLCSgweDM8PDgpCisKKyNkZWZpbmUgQVNOMV9URkxHX0FEQl9PSUQJKDB4MTw8OCkKKworI2RlZmluZSBBU04xX1RGTEdfQURCX0lOVAkoMHgxPDw5KQorCisvKiBUaGlzIGZsYWcgbWVhbnMgYSBwYXJlbnQgc3RydWN0dXJlIGlzIHBhc3NlZAorICogaW5zdGVhZCBvZiB0aGUgZmllbGQ6IHRoaXMgaXMgdXNlZnVsIGlzIGEKKyAqIFNFUVVFTkNFIGlzIGJlaW5nIGNvbWJpbmVkIHdpdGggYSBDSE9JQ0UgZm9yCisgKiBleGFtcGxlLiBTaW5jZSB0aGlzIG1lYW5zIHRoZSBzdHJ1Y3R1cmUgYW5kCisgKiBpdGVtIG5hbWUgd2lsbCBkaWZmZXIgd2UgbmVlZCB0byB1c2UgdGhlCisgKiBBU04xX0NIT0lDRV9FTkRfbmFtZSgpIG1hY3JvIGZvciBleGFtcGxlLgorICovCisKKyNkZWZpbmUgQVNOMV9URkxHX0NPTUJJTkUJKDB4MTw8MTApCisKKy8qIFRoaXMgZmxhZyB3aGVuIHByZXNlbnQgaW4gYSBTRVFVRU5DRSBPRiwgU0VUIE9GCisgKiBvciBFWFBMSUNJVCBjYXVzZXMgaW5kZWZpbml0ZSBsZW5ndGggY29uc3RydWN0ZWQKKyAqIGVuY29kaW5nIHRvIGJlIHVzZWQgaWYgcmVxdWlyZWQuCisgKi8KKworI2RlZmluZSBBU04xX1RGTEdfTkRFRgkJKDB4MTw8MTEpCisKKy8qIFRoaXMgaXMgdGhlIGFjdHVhbCBBU04xIGl0ZW0gaXRzZWxmICovCisKK3N0cnVjdCBBU04xX0lURU1fc3QgeworY2hhciBpdHlwZTsJCQkvKiBUaGUgaXRlbSB0eXBlLCBwcmltaXRpdmUsIFNFUVVFTkNFLCBDSE9JQ0Ugb3IgZXh0ZXJuICovCitsb25nIHV0eXBlOwkJCS8qIHVuZGVybHlpbmcgdHlwZSAqLworY29uc3QgQVNOMV9URU1QTEFURSAqdGVtcGxhdGVzOwkvKiBJZiBTRVFVRU5DRSBvciBDSE9JQ0UgdGhpcyBjb250YWlucyB0aGUgY29udGVudHMgKi8KK2xvbmcgdGNvdW50OwkJCS8qIE51bWJlciBvZiB0ZW1wbGF0ZXMgaWYgU0VRVUVOQ0Ugb3IgQ0hPSUNFICovCitjb25zdCB2b2lkICpmdW5jczsJCS8qIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZSB0aGlzIHR5cGUgKi8KK2xvbmcgc2l6ZTsJCQkvKiBTdHJ1Y3R1cmUgc2l6ZSAodXN1YWxseSkqLworI2lmbmRlZiBOT19BU04xX0ZJRUxEX05BTUVTCitjb25zdCBjaGFyICpzbmFtZTsJCS8qIFN0cnVjdHVyZSBuYW1lICovCisjZW5kaWYKK307CisKKy8qIFRoZXNlIGFyZSB2YWx1ZXMgZm9yIHRoZSBpdHlwZSBmaWVsZCBhbmQKKyAqIGRldGVybWluZSBob3cgdGhlIHR5cGUgaXMgaW50ZXJwcmV0ZWQuCisgKgorICogRm9yIFBSSU1JVElWRSB0eXBlcyB0aGUgdW5kZXJseWluZyB0eXBlCisgKiBkZXRlcm1pbmVzIHRoZSBiZWhhdmlvdXIgaWYgaXRlbXMgaXMgTlVMTC4KKyAqCisgKiBPdGhlcndpc2UgdGVtcGxhdGVzIG11c3QgY29udGFpbiBhIHNpbmdsZSAKKyAqIHRlbXBsYXRlIGFuZCB0aGUgdHlwZSBpcyB0cmVhdGVkIGluIHRoZQorICogc2FtZSB3YXkgYXMgdGhlIHR5cGUgc3BlY2lmaWVkIGluIHRoZSB0ZW1wbGF0ZS4KKyAqCisgKiBGb3IgU0VRVUVOQ0UgdHlwZXMgdGhlIHRlbXBsYXRlcyBmaWVsZCBwb2ludHMKKyAqIHRvIHRoZSBtZW1iZXJzLCB0aGUgc2l6ZSBmaWVsZCBpcyB0aGUKKyAqIHN0cnVjdHVyZSBzaXplLgorICoKKyAqIEZvciBDSE9JQ0UgdHlwZXMgdGhlIHRlbXBsYXRlcyBmaWVsZCBwb2ludHMKKyAqIHRvIGVhY2ggcG9zc2libGUgbWVtYmVyICh0eXBpY2FsbHkgYSB1bmlvbikKKyAqIGFuZCB0aGUgJ3NpemUnIGZpZWxkIGlzIHRoZSBvZmZzZXQgb2YgdGhlCisgKiBzZWxlY3Rvci4KKyAqCisgKiBUaGUgJ2Z1bmNzJyBmaWVsZCBpcyB1c2VkIGZvciBhcHBsaWNhdGlvbgorICogc3BlY2lmaWMgZnVuY3Rpb25zLiAKKyAqCisgKiBGb3IgQ09NUEFUIHR5cGVzIHRoZSBmdW5jcyBmaWVsZCBnaXZlcyBhCisgKiBzZXQgb2YgZnVuY3Rpb25zIHRoYXQgaGFuZGxlIHRoaXMgdHlwZSwgdGhpcworICogc3VwcG9ydHMgdGhlIG9sZCBkMmksIGkyZCBjb252ZW50aW9uLgorICoKKyAqIFRoZSBFWFRFUk4gdHlwZSB1c2VzIGEgbmV3IHN0eWxlIGQyaS9pMmQuCisgKiBUaGUgbmV3IHN0eWxlIHNob3VsZCBiZSB1c2VkIHdoZXJlIHBvc3NpYmxlCisgKiBiZWNhdXNlIGl0IGF2b2lkcyB0aGluZ3MgbGlrZSB0aGUgZDJpIElNUExJQ0lUCisgKiBoYWNrLgorICoKKyAqIE1TVFJJTkcgaXMgYSBtdWx0aXBsZSBzdHJpbmcgdHlwZSwgaXQgaXMgdXNlZAorICogZm9yIGEgQ0hPSUNFIG9mIGNoYXJhY3RlciBzdHJpbmdzIHdoZXJlIHRoZQorICogYWN0dWFsIHN0cmluZ3MgYWxsIG9jY3VweSBhbiBBU04xX1NUUklORworICogc3RydWN0dXJlLiBJbiB0aGlzIGNhc2UgdGhlICd1dHlwZScgZmllbGQKKyAqIGhhcyBhIHNwZWNpYWwgbWVhbmluZywgaXQgaXMgdXNlZCBhcyBhIG1hc2sKKyAqIG9mIGFjY2VwdGFibGUgdHlwZXMgdXNpbmcgdGhlIEJfQVNOMSBjb25zdGFudHMuCisgKgorICogTkRFRl9TRVFVRU5DRSBpcyB0aGUgc2FtZSBhcyBTRVFVRU5DRSBleGNlcHQKKyAqIHRoYXQgaXQgd2lsbCB1c2UgaW5kZWZpbml0ZSBsZW5ndGggY29uc3RydWN0ZWQKKyAqIGVuY29kaW5nIGlmIHJlcXVlc3RlZC4KKyAqCisgKi8KKworI2RlZmluZSBBU04xX0lUWVBFX1BSSU1JVElWRQkJMHgwCisKKyNkZWZpbmUgQVNOMV9JVFlQRV9TRVFVRU5DRQkJMHgxCisKKyNkZWZpbmUgQVNOMV9JVFlQRV9DSE9JQ0UJCTB4MgorCisjZGVmaW5lIEFTTjFfSVRZUEVfQ09NUEFUCQkweDMKKworI2RlZmluZSBBU04xX0lUWVBFX0VYVEVSTgkJMHg0CisKKyNkZWZpbmUgQVNOMV9JVFlQRV9NU1RSSU5HCQkweDUKKworI2RlZmluZSBBU04xX0lUWVBFX05ERUZfU0VRVUVOQ0UJMHg2CisKKy8qIENhY2hlIGZvciBBU04xIHRhZyBhbmQgbGVuZ3RoLCBzbyB3ZQorICogZG9uJ3Qga2VlcCByZS1yZWFkaW5nIGl0IGZvciB0aGluZ3MKKyAqIGxpa2UgQ0hPSUNFCisgKi8KKworc3RydWN0IEFTTjFfVExDX3N0eworCWNoYXIgdmFsaWQ7CS8qIFZhbHVlcyBiZWxvdyBhcmUgdmFsaWQgKi8KKwlpbnQgcmV0OwkvKiByZXR1cm4gdmFsdWUgKi8KKwlsb25nIHBsZW47CS8qIGxlbmd0aCAqLworCWludCBwdGFnOwkvKiBjbGFzcyB2YWx1ZSAqLworCWludCBwY2xhc3M7CS8qIGNsYXNzIHZhbHVlICovCisJaW50IGhkcmxlbjsJLyogaGVhZGVyIGxlbmd0aCAqLworfTsKKworLyogVHlwZWRlZnMgZm9yIEFTTjEgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKwordHlwZWRlZiBBU04xX1ZBTFVFICogQVNOMV9uZXdfZnVuYyh2b2lkKTsKK3R5cGVkZWYgdm9pZCBBU04xX2ZyZWVfZnVuYyhBU04xX1ZBTFVFICphKTsKK3R5cGVkZWYgQVNOMV9WQUxVRSAqIEFTTjFfZDJpX2Z1bmMoQVNOMV9WQUxVRSAqKmEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiogaW4sIGxvbmcgbGVuZ3RoKTsKK3R5cGVkZWYgaW50IEFTTjFfaTJkX2Z1bmMoQVNOMV9WQUxVRSAqIGEsIHVuc2lnbmVkIGNoYXIgKippbik7CisKK3R5cGVkZWYgaW50IEFTTjFfZXhfZDJpKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIGxvbmcgbGVuLCBjb25zdCBBU04xX0lURU0gKml0LAorCQkJCQlpbnQgdGFnLCBpbnQgYWNsYXNzLCBjaGFyIG9wdCwgQVNOMV9UTEMgKmN0eCk7CisKK3R5cGVkZWYgaW50IEFTTjFfZXhfaTJkKEFTTjFfVkFMVUUgKipwdmFsLCB1bnNpZ25lZCBjaGFyICoqb3V0LCBjb25zdCBBU04xX0lURU0gKml0LCBpbnQgdGFnLCBpbnQgYWNsYXNzKTsKK3R5cGVkZWYgaW50IEFTTjFfZXhfbmV3X2Z1bmMoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQpOwordHlwZWRlZiB2b2lkIEFTTjFfZXhfZnJlZV9mdW5jKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0KTsKKwordHlwZWRlZiBpbnQgQVNOMV9leF9wcmludF9mdW5jKEJJTyAqb3V0LCBBU04xX1ZBTFVFICoqcHZhbCwgCisJCQkJCQlpbnQgaW5kZW50LCBjb25zdCBjaGFyICpmbmFtZSwgCisJCQkJCQljb25zdCBBU04xX1BDVFggKnBjdHgpOworCit0eXBlZGVmIGludCBBU04xX3ByaW1pdGl2ZV9pMmMoQVNOMV9WQUxVRSAqKnB2YWwsIHVuc2lnbmVkIGNoYXIgKmNvbnQsIGludCAqcHV0eXBlLCBjb25zdCBBU04xX0lURU0gKml0KTsKK3R5cGVkZWYgaW50IEFTTjFfcHJpbWl0aXZlX2MyaShBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgdW5zaWduZWQgY2hhciAqY29udCwgaW50IGxlbiwgaW50IHV0eXBlLCBjaGFyICpmcmVlX2NvbnQsIGNvbnN0IEFTTjFfSVRFTSAqaXQpOwordHlwZWRlZiBpbnQgQVNOMV9wcmltaXRpdmVfcHJpbnQoQklPICpvdXQsIEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0LCBpbnQgaW5kZW50LCBjb25zdCBBU04xX1BDVFggKnBjdHgpOworCit0eXBlZGVmIHN0cnVjdCBBU04xX0NPTVBBVF9GVU5DU19zdCB7CisJQVNOMV9uZXdfZnVuYyAqYXNuMV9uZXc7CisJQVNOMV9mcmVlX2Z1bmMgKmFzbjFfZnJlZTsKKwlBU04xX2QyaV9mdW5jICphc24xX2QyaTsKKwlBU04xX2kyZF9mdW5jICphc24xX2kyZDsKK30gQVNOMV9DT01QQVRfRlVOQ1M7CisKK3R5cGVkZWYgc3RydWN0IEFTTjFfRVhURVJOX0ZVTkNTX3N0IHsKKwl2b2lkICphcHBfZGF0YTsKKwlBU04xX2V4X25ld19mdW5jICphc24xX2V4X25ldzsKKwlBU04xX2V4X2ZyZWVfZnVuYyAqYXNuMV9leF9mcmVlOworCUFTTjFfZXhfZnJlZV9mdW5jICphc24xX2V4X2NsZWFyOworCUFTTjFfZXhfZDJpICphc24xX2V4X2QyaTsKKwlBU04xX2V4X2kyZCAqYXNuMV9leF9pMmQ7CisJQVNOMV9leF9wcmludF9mdW5jICphc24xX2V4X3ByaW50OworfSBBU04xX0VYVEVSTl9GVU5DUzsKKwordHlwZWRlZiBzdHJ1Y3QgQVNOMV9QUklNSVRJVkVfRlVOQ1Nfc3QgeworCXZvaWQgKmFwcF9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJQVNOMV9leF9uZXdfZnVuYyAqcHJpbV9uZXc7CisJQVNOMV9leF9mcmVlX2Z1bmMgKnByaW1fZnJlZTsKKwlBU04xX2V4X2ZyZWVfZnVuYyAqcHJpbV9jbGVhcjsKKwlBU04xX3ByaW1pdGl2ZV9jMmkgKnByaW1fYzJpOworCUFTTjFfcHJpbWl0aXZlX2kyYyAqcHJpbV9pMmM7CisJQVNOMV9wcmltaXRpdmVfcHJpbnQgKnByaW1fcHJpbnQ7Cit9IEFTTjFfUFJJTUlUSVZFX0ZVTkNTOworCisvKiBUaGlzIGlzIHRoZSBBU04xX0FVWCBzdHJ1Y3R1cmU6IGl0IGhhbmRsZXMgdmFyaW91cworICogbWlzY2VsbGFuZW91cyByZXF1aXJlbWVudHMuIEZvciBleGFtcGxlIHRoZSB1c2Ugb2YKKyAqIHJlZmVyZW5jZSBjb3VudHMgYW5kIGFuIGluZm9ybWF0aW9uYWwgY2FsbGJhY2suCisgKgorICogVGhlICJpbmZvcm1hdGlvbmFsIGNhbGxiYWNrIiBpcyBjYWxsZWQgYXQgdmFyaW91cworICogcG9pbnRzIGR1cmluZyB0aGUgQVNOMSBlbmNvZGluZyBhbmQgZGVjb2RpbmcuIEl0IGNhbgorICogYmUgdXNlZCB0byBwcm92aWRlIG1pbm9yIGN1c3RvbWlzYXRpb24gb2YgdGhlIHN0cnVjdHVyZXMKKyAqIHVzZWQuIFRoaXMgaXMgbW9zdCB1c2VmdWwgd2hlcmUgdGhlIHN1cHBsaWVkIHJvdXRpbmVzCisgKiAqYWxtb3N0KiBkbyB0aGUgcmlnaHQgdGhpbmcgYnV0IG5lZWQgc29tZSBleHRyYSBoZWxwCisgKiBhdCBhIGZldyBwb2ludHMuIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIHplcm8gdGhlbgorICogaXQgaXMgYXNzdW1lZCBhIGZhdGFsIGVycm9yIGhhcyBvY2N1cnJlZCBhbmQgdGhlIAorICogbWFpbiBvcGVyYXRpb24gc2hvdWxkIGJlIGFiYW5kb25lZC4KKyAqCisgKiBJZiBtYWpvciBjaGFuZ2VzIGluIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBhcmUgcmVxdWlyZWQKKyAqIHRoZW4gYW4gZXh0ZXJuYWwgdHlwZSBpcyBtb3JlIGFwcHJvcHJpYXRlLgorICovCisKK3R5cGVkZWYgaW50IEFTTjFfYXV4X2NiKGludCBvcGVyYXRpb24sIEFTTjFfVkFMVUUgKippbiwgY29uc3QgQVNOMV9JVEVNICppdCwKKwkJCQl2b2lkICpleGFyZyk7CisKK3R5cGVkZWYgc3RydWN0IEFTTjFfQVVYX3N0IHsKKwl2b2lkICphcHBfZGF0YTsKKwlpbnQgZmxhZ3M7CisJaW50IHJlZl9vZmZzZXQ7CQkvKiBPZmZzZXQgb2YgcmVmZXJlbmNlIHZhbHVlICovCisJaW50IHJlZl9sb2NrOwkJLyogTG9jayB0eXBlIHRvIHVzZSAqLworCUFTTjFfYXV4X2NiICphc24xX2NiOworCWludCBlbmNfb2Zmc2V0OwkJLyogT2Zmc2V0IG9mIEFTTjFfRU5DT0RJTkcgc3RydWN0dXJlICovCit9IEFTTjFfQVVYOworCisvKiBGb3IgcHJpbnQgcmVsYXRlZCBjYWxsYmFja3MgZXhhcmcgcG9pbnRzIHRvIHRoaXMgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBBU04xX1BSSU5UX0FSR19zdCB7CisJQklPICpvdXQ7CisJaW50IGluZGVudDsKKwljb25zdCBBU04xX1BDVFggKnBjdHg7Cit9IEFTTjFfUFJJTlRfQVJHOworCisvKiBGb3Igc3RyZWFtaW5nIHJlbGF0ZWQgY2FsbGJhY2tzIGV4YXJnIHBvaW50cyB0byB0aGlzIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgQVNOMV9TVFJFQU1fQVJHX3N0IHsKKwkvKiBCSU8gdG8gc3RyZWFtIHRocm91Z2ggKi8KKwlCSU8gKm91dDsKKwkvKiBCSU8gd2l0aCBmaWx0ZXJzIGFwcGVuZGVkICovCisJQklPICpuZGVmX2JpbzsKKwkvKiBTdHJlYW1pbmcgSS9PIGJvdW5kYXJ5ICovCisJdW5zaWduZWQgY2hhciAqKmJvdW5kYXJ5OworfSBBU04xX1NUUkVBTV9BUkc7CisKKy8qIEZsYWdzIGluIEFTTjFfQVVYICovCisKKy8qIFVzZSBhIHJlZmVyZW5jZSBjb3VudCAqLworI2RlZmluZSBBU04xX0FGTEdfUkVGQ09VTlQJMQorLyogU2F2ZSB0aGUgZW5jb2Rpbmcgb2Ygc3RydWN0dXJlICh1c2VmdWwgZm9yIHNpZ25hdHVyZXMpICovCisjZGVmaW5lIEFTTjFfQUZMR19FTkNPRElORwkyCisvKiBUaGUgU2VxdWVuY2UgbGVuZ3RoIGlzIGludmFsaWQgKi8KKyNkZWZpbmUgQVNOMV9BRkxHX0JST0tFTgk0CisKKy8qIG9wZXJhdGlvbiB2YWx1ZXMgZm9yIGFzbjFfY2IgKi8KKworI2RlZmluZSBBU04xX09QX05FV19QUkUJCTAKKyNkZWZpbmUgQVNOMV9PUF9ORVdfUE9TVAkxCisjZGVmaW5lIEFTTjFfT1BfRlJFRV9QUkUJMgorI2RlZmluZSBBU04xX09QX0ZSRUVfUE9TVAkzCisjZGVmaW5lIEFTTjFfT1BfRDJJX1BSRQkJNAorI2RlZmluZSBBU04xX09QX0QySV9QT1NUCTUKKyNkZWZpbmUgQVNOMV9PUF9JMkRfUFJFCQk2CisjZGVmaW5lIEFTTjFfT1BfSTJEX1BPU1QJNworI2RlZmluZSBBU04xX09QX1BSSU5UX1BSRQk4CisjZGVmaW5lIEFTTjFfT1BfUFJJTlRfUE9TVAk5CisjZGVmaW5lIEFTTjFfT1BfU1RSRUFNX1BSRQkxMAorI2RlZmluZSBBU04xX09QX1NUUkVBTV9QT1NUCTExCisjZGVmaW5lIEFTTjFfT1BfREVUQUNIRURfUFJFCTEyCisjZGVmaW5lIEFTTjFfT1BfREVUQUNIRURfUE9TVAkxMworCisvKiBNYWNybyB0byBpbXBsZW1lbnQgYSBwcmltaXRpdmUgdHlwZSAqLworI2RlZmluZSBJTVBMRU1FTlRfQVNOMV9UWVBFKHN0bmFtZSkgSU1QTEVNRU5UX0FTTjFfVFlQRV9leChzdG5hbWUsIHN0bmFtZSwgMCkKKyNkZWZpbmUgSU1QTEVNRU5UX0FTTjFfVFlQRV9leChpdG5hbWUsIHZuYW1lLCBleCkgXAorCQkJCUFTTjFfSVRFTV9zdGFydChpdG5hbWUpIFwKKwkJCQkJQVNOMV9JVFlQRV9QUklNSVRJVkUsIFZfIyN2bmFtZSwgTlVMTCwgMCwgTlVMTCwgZXgsICNpdG5hbWUgXAorCQkJCUFTTjFfSVRFTV9lbmQoaXRuYW1lKQorCisvKiBNYWNybyB0byBpbXBsZW1lbnQgYSBtdWx0aSBzdHJpbmcgdHlwZSAqLworI2RlZmluZSBJTVBMRU1FTlRfQVNOMV9NU1RSSU5HKGl0bmFtZSwgbWFzaykgXAorCQkJCUFTTjFfSVRFTV9zdGFydChpdG5hbWUpIFwKKwkJCQkJQVNOMV9JVFlQRV9NU1RSSU5HLCBtYXNrLCBOVUxMLCAwLCBOVUxMLCBzaXplb2YoQVNOMV9TVFJJTkcpLCAjaXRuYW1lIFwKKwkJCQlBU04xX0lURU1fZW5kKGl0bmFtZSkKKworLyogTWFjcm8gdG8gaW1wbGVtZW50IGFuIEFTTjFfSVRFTSBpbiB0ZXJtcyBvZiBvbGQgc3R5bGUgZnVuY3MgKi8KKworI2RlZmluZSBJTVBMRU1FTlRfQ09NUEFUX0FTTjEoc25hbWUpIElNUExFTUVOVF9DT01QQVRfQVNOMV90eXBlKHNuYW1lLCBWX0FTTjFfU0VRVUVOQ0UpCisKKyNkZWZpbmUgSU1QTEVNRU5UX0NPTVBBVF9BU04xX3R5cGUoc25hbWUsIHRhZykgXAorCXN0YXRpYyBjb25zdCBBU04xX0NPTVBBVF9GVU5DUyBzbmFtZSMjX2ZmID0geyBcCisJCShBU04xX25ld19mdW5jICopc25hbWUjI19uZXcsIFwKKwkJKEFTTjFfZnJlZV9mdW5jICopc25hbWUjI19mcmVlLCBcCisJCShBU04xX2QyaV9mdW5jICopZDJpXyMjc25hbWUsIFwKKwkJKEFTTjFfaTJkX2Z1bmMgKilpMmRfIyNzbmFtZSwgXAorCX07IFwKKwlBU04xX0lURU1fc3RhcnQoc25hbWUpIFwKKwkJQVNOMV9JVFlQRV9DT01QQVQsIFwKKwkJdGFnLCBcCisJCU5VTEwsIFwKKwkJMCwgXAorCQkmc25hbWUjI19mZiwgXAorCQkwLCBcCisJCSNzbmFtZSBcCisJQVNOMV9JVEVNX2VuZChzbmFtZSkKKworI2RlZmluZSBJTVBMRU1FTlRfRVhURVJOX0FTTjEoc25hbWUsIHRhZywgZnB0cnMpIFwKKwlBU04xX0lURU1fc3RhcnQoc25hbWUpIFwKKwkJQVNOMV9JVFlQRV9FWFRFUk4sIFwKKwkJdGFnLCBcCisJCU5VTEwsIFwKKwkJMCwgXAorCQkmZnB0cnMsIFwKKwkJMCwgXAorCQkjc25hbWUgXAorCUFTTjFfSVRFTV9lbmQoc25hbWUpCisKKy8qIE1hY3JvIHRvIGltcGxlbWVudCBzdGFuZGFyZCBmdW5jdGlvbnMgaW4gdGVybXMgb2YgQVNOMV9JVEVNIHN0cnVjdHVyZXMgKi8KKworI2RlZmluZSBJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoc3RuYW1lKSBJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlNfZm5hbWUoc3RuYW1lLCBzdG5hbWUsIHN0bmFtZSkKKworI2RlZmluZSBJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlNfbmFtZShzdG5hbWUsIGl0bmFtZSkgSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TX2ZuYW1lKHN0bmFtZSwgaXRuYW1lLCBpdG5hbWUpCisKKyNkZWZpbmUgSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TX0VOQ09ERV9uYW1lKHN0bmFtZSwgaXRuYW1lKSBcCisJCQlJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlNfRU5DT0RFX2ZuYW1lKHN0bmFtZSwgaXRuYW1lLCBpdG5hbWUpCisKKyNkZWZpbmUgSU1QTEVNRU5UX1NUQVRJQ19BU04xX0FMTE9DX0ZVTkNUSU9OUyhzdG5hbWUpIFwKKwkJSU1QTEVNRU5UX0FTTjFfQUxMT0NfRlVOQ1RJT05TX3BmbmFtZShzdGF0aWMsIHN0bmFtZSwgc3RuYW1lLCBzdG5hbWUpCisKKyNkZWZpbmUgSU1QTEVNRU5UX0FTTjFfQUxMT0NfRlVOQ1RJT05TKHN0bmFtZSkgXAorCQlJTVBMRU1FTlRfQVNOMV9BTExPQ19GVU5DVElPTlNfZm5hbWUoc3RuYW1lLCBzdG5hbWUsIHN0bmFtZSkKKworI2RlZmluZSBJTVBMRU1FTlRfQVNOMV9BTExPQ19GVU5DVElPTlNfcGZuYW1lKHByZSwgc3RuYW1lLCBpdG5hbWUsIGZuYW1lKSBcCisJcHJlIHN0bmFtZSAqZm5hbWUjI19uZXcodm9pZCkgXAorCXsgXAorCQlyZXR1cm4gKHN0bmFtZSAqKUFTTjFfaXRlbV9uZXcoQVNOMV9JVEVNX3JwdHIoaXRuYW1lKSk7IFwKKwl9IFwKKwlwcmUgdm9pZCBmbmFtZSMjX2ZyZWUoc3RuYW1lICphKSBcCisJeyBcCisJCUFTTjFfaXRlbV9mcmVlKChBU04xX1ZBTFVFICopYSwgQVNOMV9JVEVNX3JwdHIoaXRuYW1lKSk7IFwKKwl9CisKKyNkZWZpbmUgSU1QTEVNRU5UX0FTTjFfQUxMT0NfRlVOQ1RJT05TX2ZuYW1lKHN0bmFtZSwgaXRuYW1lLCBmbmFtZSkgXAorCXN0bmFtZSAqZm5hbWUjI19uZXcodm9pZCkgXAorCXsgXAorCQlyZXR1cm4gKHN0bmFtZSAqKUFTTjFfaXRlbV9uZXcoQVNOMV9JVEVNX3JwdHIoaXRuYW1lKSk7IFwKKwl9IFwKKwl2b2lkIGZuYW1lIyNfZnJlZShzdG5hbWUgKmEpIFwKKwl7IFwKKwkJQVNOMV9pdGVtX2ZyZWUoKEFTTjFfVkFMVUUgKilhLCBBU04xX0lURU1fcnB0cihpdG5hbWUpKTsgXAorCX0KKworI2RlZmluZSBJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlNfZm5hbWUoc3RuYW1lLCBpdG5hbWUsIGZuYW1lKSBcCisJSU1QTEVNRU5UX0FTTjFfRU5DT0RFX0ZVTkNUSU9OU19mbmFtZShzdG5hbWUsIGl0bmFtZSwgZm5hbWUpIFwKKwlJTVBMRU1FTlRfQVNOMV9BTExPQ19GVU5DVElPTlNfZm5hbWUoc3RuYW1lLCBpdG5hbWUsIGZuYW1lKQorCisjZGVmaW5lIElNUExFTUVOVF9BU04xX0VOQ09ERV9GVU5DVElPTlNfZm5hbWUoc3RuYW1lLCBpdG5hbWUsIGZuYW1lKSBcCisJc3RuYW1lICpkMmlfIyNmbmFtZShzdG5hbWUgKiphLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIGxvbmcgbGVuKSBcCisJeyBcCisJCXJldHVybiAoc3RuYW1lICopQVNOMV9pdGVtX2QyaSgoQVNOMV9WQUxVRSAqKilhLCBpbiwgbGVuLCBBU04xX0lURU1fcnB0cihpdG5hbWUpKTtcCisJfSBcCisJaW50IGkyZF8jI2ZuYW1lKHN0bmFtZSAqYSwgdW5zaWduZWQgY2hhciAqKm91dCkgXAorCXsgXAorCQlyZXR1cm4gQVNOMV9pdGVtX2kyZCgoQVNOMV9WQUxVRSAqKWEsIG91dCwgQVNOMV9JVEVNX3JwdHIoaXRuYW1lKSk7XAorCX0gCisKKyNkZWZpbmUgSU1QTEVNRU5UX0FTTjFfTkRFRl9GVU5DVElPTihzdG5hbWUpIFwKKwlpbnQgaTJkXyMjc3RuYW1lIyNfTkRFRihzdG5hbWUgKmEsIHVuc2lnbmVkIGNoYXIgKipvdXQpIFwKKwl7IFwKKwkJcmV0dXJuIEFTTjFfaXRlbV9uZGVmX2kyZCgoQVNOMV9WQUxVRSAqKWEsIG91dCwgQVNOMV9JVEVNX3JwdHIoc3RuYW1lKSk7XAorCX0gCisKKy8qIFRoaXMgaW5jbHVkZXMgZXZpbCBjYXN0cyB0byByZW1vdmUgY29uc3Q6IHRoZXkgd2lsbCBnbyBhd2F5IHdoZW4gZnVsbAorICogQVNOMSBjb25zdGlmaWNhdGlvbiBpcyBkb25lLgorICovCisjZGVmaW5lIElNUExFTUVOVF9BU04xX0VOQ09ERV9GVU5DVElPTlNfY29uc3RfZm5hbWUoc3RuYW1lLCBpdG5hbWUsIGZuYW1lKSBcCisJc3RuYW1lICpkMmlfIyNmbmFtZShzdG5hbWUgKiphLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIGxvbmcgbGVuKSBcCisJeyBcCisJCXJldHVybiAoc3RuYW1lICopQVNOMV9pdGVtX2QyaSgoQVNOMV9WQUxVRSAqKilhLCBpbiwgbGVuLCBBU04xX0lURU1fcnB0cihpdG5hbWUpKTtcCisJfSBcCisJaW50IGkyZF8jI2ZuYW1lKGNvbnN0IHN0bmFtZSAqYSwgdW5zaWduZWQgY2hhciAqKm91dCkgXAorCXsgXAorCQlyZXR1cm4gQVNOMV9pdGVtX2kyZCgoQVNOMV9WQUxVRSAqKWEsIG91dCwgQVNOMV9JVEVNX3JwdHIoaXRuYW1lKSk7XAorCX0gCisKKyNkZWZpbmUgSU1QTEVNRU5UX0FTTjFfRFVQX0ZVTkNUSU9OKHN0bmFtZSkgXAorCXN0bmFtZSAqIHN0bmFtZSMjX2R1cChzdG5hbWUgKngpIFwKKyAgICAgICAgeyBcCisgICAgICAgIHJldHVybiBBU04xX2l0ZW1fZHVwKEFTTjFfSVRFTV9ycHRyKHN0bmFtZSksIHgpOyBcCisgICAgICAgIH0KKworI2RlZmluZSBJTVBMRU1FTlRfQVNOMV9QUklOVF9GVU5DVElPTihzdG5hbWUpIFwKKwlJTVBMRU1FTlRfQVNOMV9QUklOVF9GVU5DVElPTl9mbmFtZShzdG5hbWUsIHN0bmFtZSwgc3RuYW1lKQorCisjZGVmaW5lIElNUExFTUVOVF9BU04xX1BSSU5UX0ZVTkNUSU9OX2ZuYW1lKHN0bmFtZSwgaXRuYW1lLCBmbmFtZSkgXAorCWludCBmbmFtZSMjX3ByaW50X2N0eChCSU8gKm91dCwgc3RuYW1lICp4LCBpbnQgaW5kZW50LCBcCisJCQkJCQljb25zdCBBU04xX1BDVFggKnBjdHgpIFwKKwl7IFwKKwkJcmV0dXJuIEFTTjFfaXRlbV9wcmludChvdXQsIChBU04xX1ZBTFVFICopeCwgaW5kZW50LCBcCisJCQlBU04xX0lURU1fcnB0cihpdG5hbWUpLCBwY3R4KTsgXAorCX0gCisKKyNkZWZpbmUgSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TX2NvbnN0KG5hbWUpIFwKKwkJSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TX2NvbnN0X2ZuYW1lKG5hbWUsIG5hbWUsIG5hbWUpCisKKyNkZWZpbmUgSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TX2NvbnN0X2ZuYW1lKHN0bmFtZSwgaXRuYW1lLCBmbmFtZSkgXAorCUlNUExFTUVOVF9BU04xX0VOQ09ERV9GVU5DVElPTlNfY29uc3RfZm5hbWUoc3RuYW1lLCBpdG5hbWUsIGZuYW1lKSBcCisJSU1QTEVNRU5UX0FTTjFfQUxMT0NfRlVOQ1RJT05TX2ZuYW1lKHN0bmFtZSwgaXRuYW1lLCBmbmFtZSkKKworLyogZXh0ZXJuYWwgZGVmaW5pdGlvbnMgZm9yIHByaW1pdGl2ZSB0eXBlcyAqLworCitERUNMQVJFX0FTTjFfSVRFTShBU04xX0JPT0xFQU4pCitERUNMQVJFX0FTTjFfSVRFTShBU04xX1RCT09MRUFOKQorREVDTEFSRV9BU04xX0lURU0oQVNOMV9GQk9PTEVBTikKK0RFQ0xBUkVfQVNOMV9JVEVNKEFTTjFfU0VRVUVOQ0UpCitERUNMQVJFX0FTTjFfSVRFTShDQklHTlVNKQorREVDTEFSRV9BU04xX0lURU0oQklHTlVNKQorREVDTEFSRV9BU04xX0lURU0oTE9ORykKK0RFQ0xBUkVfQVNOMV9JVEVNKFpMT05HKQorCitERUNMQVJFX1NUQUNLX09GKEFTTjFfVkFMVUUpCisKKy8qIEZ1bmN0aW9ucyB1c2VkIGludGVybmFsbHkgYnkgdGhlIEFTTjEgY29kZSAqLworCitpbnQgQVNOMV9pdGVtX2V4X25ldyhBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9JVEVNICppdCk7Cit2b2lkIEFTTjFfaXRlbV9leF9mcmVlKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0KTsKK2ludCBBU04xX3RlbXBsYXRlX25ldyhBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9URU1QTEFURSAqdHQpOworaW50IEFTTjFfcHJpbWl0aXZlX25ldyhBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9JVEVNICppdCk7CisKK3ZvaWQgQVNOMV90ZW1wbGF0ZV9mcmVlKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX1RFTVBMQVRFICp0dCk7CitpbnQgQVNOMV90ZW1wbGF0ZV9kMmkoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbiwgbG9uZyBsZW4sIGNvbnN0IEFTTjFfVEVNUExBVEUgKnR0KTsKK2ludCBBU04xX2l0ZW1fZXhfZDJpKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIGxvbmcgbGVuLCBjb25zdCBBU04xX0lURU0gKml0LAorCQkJCWludCB0YWcsIGludCBhY2xhc3MsIGNoYXIgb3B0LCBBU04xX1RMQyAqY3R4KTsKKworaW50IEFTTjFfaXRlbV9leF9pMmQoQVNOMV9WQUxVRSAqKnB2YWwsIHVuc2lnbmVkIGNoYXIgKipvdXQsIGNvbnN0IEFTTjFfSVRFTSAqaXQsIGludCB0YWcsIGludCBhY2xhc3MpOworaW50IEFTTjFfdGVtcGxhdGVfaTJkKEFTTjFfVkFMVUUgKipwdmFsLCB1bnNpZ25lZCBjaGFyICoqb3V0LCBjb25zdCBBU04xX1RFTVBMQVRFICp0dCk7Cit2b2lkIEFTTjFfcHJpbWl0aXZlX2ZyZWUoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQpOworCitpbnQgYXNuMV9leF9pMmMoQVNOMV9WQUxVRSAqKnB2YWwsIHVuc2lnbmVkIGNoYXIgKmNvbnQsIGludCAqcHV0eXBlLCBjb25zdCBBU04xX0lURU0gKml0KTsKK2ludCBhc24xX2V4X2MyaShBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgdW5zaWduZWQgY2hhciAqY29udCwgaW50IGxlbiwgaW50IHV0eXBlLCBjaGFyICpmcmVlX2NvbnQsIGNvbnN0IEFTTjFfSVRFTSAqaXQpOworCitpbnQgYXNuMV9nZXRfY2hvaWNlX3NlbGVjdG9yKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0KTsKK2ludCBhc24xX3NldF9jaG9pY2Vfc2VsZWN0b3IoQVNOMV9WQUxVRSAqKnB2YWwsIGludCB2YWx1ZSwgY29uc3QgQVNOMV9JVEVNICppdCk7CisKK0FTTjFfVkFMVUUgKiogYXNuMV9nZXRfZmllbGRfcHRyKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX1RFTVBMQVRFICp0dCk7CisKK2NvbnN0IEFTTjFfVEVNUExBVEUgKmFzbjFfZG9fYWRiKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX1RFTVBMQVRFICp0dCwgaW50IG51bGxlcnIpOworCitpbnQgYXNuMV9kb19sb2NrKEFTTjFfVkFMVUUgKipwdmFsLCBpbnQgb3AsIGNvbnN0IEFTTjFfSVRFTSAqaXQpOworCit2b2lkIGFzbjFfZW5jX2luaXQoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQpOwordm9pZCBhc24xX2VuY19mcmVlKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0KTsKK2ludCBhc24xX2VuY19yZXN0b3JlKGludCAqbGVuLCB1bnNpZ25lZCBjaGFyICoqb3V0LCBBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9JVEVNICppdCk7CitpbnQgYXNuMV9lbmNfc2F2ZShBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIGludCBpbmxlbiwgY29uc3QgQVNOMV9JVEVNICppdCk7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9jcnlwdG8vYXNuMS9hc25fcGFjay5jIGIvY3J5cHRvL2FzbjEvYXNuX3BhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODQ1OTA2Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2FzbjEvYXNuX3BhY2suYwpAQCAtMCwwICsxLDE5MyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorCisKKyNpZiAwCisjaWZuZGVmIE5PX0FTTjFfT0xECisKKy8qIEFTTjEgcGFja2luZyBhbmQgdW5wYWNraW5nIGZ1bmN0aW9ucyAqLworCisvKiBUdXJuIGFuIEFTTjEgZW5jb2RlZCBTRVFVRU5DRSBPRiBpbnRvIGEgU1RBQ0sgb2Ygc3RydWN0dXJlcyAqLworCitTVEFDS19PRihPUEVOU1NMX0JMT0NLKSAqQVNOMV9zZXFfdW5wYWNrKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbiwKKwkJCSBkMmlfb2Zfdm9pZCAqZDJpLCB2b2lkICgqZnJlZV9mdW5jKShPUEVOU1NMX0JMT0NLKSkKK3sKKyAgICBTVEFDS19PRihPUEVOU1NMX0JMT0NLKSAqc2s7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcGJ1ZjsKKyAgICBwYnVmID0gIGJ1ZjsKKyAgICBpZiAoIShzayA9IGQyaV9BU04xX1NFVChOVUxMLCAmcGJ1ZiwgbGVuLCBkMmksIGZyZWVfZnVuYywKKwkJCQkJVl9BU04xX1NFUVVFTkNFLCBWX0FTTjFfVU5JVkVSU0FMKSkpCisJCSBPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBYWFgsIEFTTjFfUl9ERUNPREVfRVJST1IpOworICAgIHJldHVybiBzazsKK30KKworLyogVHVybiBhIFNUQUNLIHN0cnVjdHVyZXMgaW50byBhbiBBU04xIGVuY29kZWQgU0VRVUVOQ0UgT0Ygc3RydWN0dXJlIGluIGEKKyAqIE9QRU5TU0xfbWFsbG9jJ2VkIGJ1ZmZlcgorICovCisKK3Vuc2lnbmVkIGNoYXIgKkFTTjFfc2VxX3BhY2soU1RBQ0tfT0YoT1BFTlNTTF9CTE9DSykgKnNhZmVzLCBpMmRfb2Zfdm9pZCAqaTJkLAorCQkJICAgICB1bnNpZ25lZCBjaGFyICoqYnVmLCBpbnQgKmxlbikKK3sKKwlpbnQgc2FmZWxlbjsKKwl1bnNpZ25lZCBjaGFyICpzYWZlLCAqcDsKKwlpZiAoIShzYWZlbGVuID0gaTJkX0FTTjFfU0VUKHNhZmVzLCBOVUxMLCBpMmQsIFZfQVNOMV9TRVFVRU5DRSwKKwkJCQkJICAgICAgVl9BU04xX1VOSVZFUlNBTCwgSVNfU0VRVUVOQ0UpKSkgeworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBYWFgsIEFTTjFfUl9FTkNPREVfRVJST1IpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKCEoc2FmZSA9IE9QRU5TU0xfbWFsbG9jIChzYWZlbGVuKSkpIHsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgWFhYLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiBOVUxMOworCX0KKwlwID0gc2FmZTsKKwlpMmRfQVNOMV9TRVQoc2FmZXMsICZwLCBpMmQsIFZfQVNOMV9TRVFVRU5DRSwgVl9BU04xX1VOSVZFUlNBTCwKKwkJCQkJCQkJIElTX1NFUVVFTkNFKTsKKwlpZiAobGVuKSAqbGVuID0gc2FmZWxlbjsKKwlpZiAoYnVmKSAqYnVmID0gc2FmZTsKKwlyZXR1cm4gc2FmZTsKK30KKworLyogRXh0cmFjdCBhbiBBU04xIG9iamVjdCBmcm9tIGFuIEFTTjFfU1RSSU5HICovCisKK3ZvaWQgKkFTTjFfdW5wYWNrX3N0cmluZyhBU04xX1NUUklORyAqb2N0LCBkMmlfb2Zfdm9pZCAqZDJpKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CisJY2hhciAqcmV0OworCisJcCA9IG9jdC0+ZGF0YTsKKwlpZighKHJldCA9IGQyaShOVUxMLCAmcCwgb2N0LT5sZW5ndGgpKSkKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgWFhYLCBBU04xX1JfREVDT0RFX0VSUk9SKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBQYWNrIGFuIEFTTjEgb2JqZWN0IGludG8gYW4gQVNOMV9TVFJJTkcgKi8KKworQVNOMV9TVFJJTkcgKkFTTjFfcGFja19zdHJpbmcodm9pZCAqb2JqLCBpMmRfb2Zfdm9pZCAqaTJkLCBBU04xX1NUUklORyAqKm9jdCkKK3sKKwl1bnNpZ25lZCBjaGFyICpwOworCUFTTjFfU1RSSU5HICpvY3RtcDsKKworCWlmICghb2N0IHx8ICEqb2N0KSB7CisJCWlmICghKG9jdG1wID0gQVNOMV9TVFJJTkdfbmV3ICgpKSkgeworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgWFhYLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAob2N0KSAqb2N0ID0gb2N0bXA7CisJfSBlbHNlIG9jdG1wID0gKm9jdDsKKwkJCisJaWYgKCEob2N0bXAtPmxlbmd0aCA9IGkyZChvYmosIE5VTEwpKSkgeworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBYWFgsIEFTTjFfUl9FTkNPREVfRVJST1IpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKCEocCA9IE9QRU5TU0xfbWFsbG9jIChvY3RtcC0+bGVuZ3RoKSkpIHsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgWFhYLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiBOVUxMOworCX0KKwlvY3RtcC0+ZGF0YSA9IHA7CisJaTJkIChvYmosICZwKTsKKwlyZXR1cm4gb2N0bXA7Cit9CisKKyNlbmRpZgorI2VuZGlmCisKKy8qIEFTTjFfSVRFTSB2ZXJzaW9ucyBvZiB0aGUgYWJvdmUgKi8KKworQVNOMV9TVFJJTkcgKkFTTjFfaXRlbV9wYWNrKHZvaWQgKm9iaiwgY29uc3QgQVNOMV9JVEVNICppdCwgQVNOMV9TVFJJTkcgKipvY3QpCit7CisJQVNOMV9TVFJJTkcgKm9jdG1wOworCisJaWYgKCFvY3QgfHwgISpvY3QpIHsKKwkJaWYgKCEob2N0bXAgPSBBU04xX1NUUklOR19uZXcgKCkpKSB7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2l0ZW1fcGFjaywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKG9jdCkgKm9jdCA9IG9jdG1wOworCX0gZWxzZSBvY3RtcCA9ICpvY3Q7CisKKwlpZihvY3RtcC0+ZGF0YSkgeworCQlPUEVOU1NMX2ZyZWUob2N0bXAtPmRhdGEpOworCQlvY3RtcC0+ZGF0YSA9IE5VTEw7CisJfQorCQkKKwlpZiAoIShvY3RtcC0+bGVuZ3RoID0gQVNOMV9pdGVtX2kyZChvYmosICZvY3RtcC0+ZGF0YSwgaXQpKSkgeworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2l0ZW1fcGFjaywgQVNOMV9SX0VOQ09ERV9FUlJPUik7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoIW9jdG1wLT5kYXRhKSB7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfaXRlbV9wYWNrLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gb2N0bXA7Cit9CisKKy8qIEV4dHJhY3QgYW4gQVNOMSBvYmplY3QgZnJvbSBhbiBBU04xX1NUUklORyAqLworCit2b2lkICpBU04xX2l0ZW1fdW5wYWNrKEFTTjFfU1RSSU5HICpvY3QsIGNvbnN0IEFTTjFfSVRFTSAqaXQpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKwl2b2lkICpyZXQ7CisKKwlwID0gb2N0LT5kYXRhOworCWlmKCEocmV0ID0gQVNOMV9pdGVtX2QyaShOVUxMLCAmcCwgb2N0LT5sZW5ndGgsIGl0KSkpCisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfaXRlbV91bnBhY2ssIEFTTjFfUl9ERUNPREVfRVJST1IpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vYXNuMS9iaW9fYXNuMS5jIGIvY3J5cHRvL2FzbjEvYmlvX2FzbjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjU4ODM5Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2FzbjEvYmlvX2FzbjEuYwpAQCAtMCwwICsxLDQ5MiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisKKworLyogTXVzdCBiZSBsYXJnZSBlbm91Z2ggZm9yIGJpZ2dlc3QgdGFnK2xlbmd0aCAqLworI2RlZmluZSBERUZBVUxUX0FTTjFfQlVGX1NJWkUgMjAKKwordHlwZWRlZiBlbnVtIAorCXsKKwlBU04xX1NUQVRFX1NUQVJULAorCUFTTjFfU1RBVEVfUFJFX0NPUFksCisJQVNOMV9TVEFURV9IRUFERVIsCisJQVNOMV9TVEFURV9IRUFERVJfQ09QWSwKKwlBU04xX1NUQVRFX0RBVEFfQ09QWSwKKwlBU04xX1NUQVRFX1BPU1RfQ09QWSwKKwlBU04xX1NUQVRFX0RPTkUKKwl9IGFzbjFfYmlvX3N0YXRlX3Q7CisKK3R5cGVkZWYgc3RydWN0IEJJT19BU04xX0VYX0ZVTkNTX3N0CisJeworCWFzbjFfcHNfZnVuYwkqZXhfZnVuYzsKKwlhc24xX3BzX2Z1bmMJKmV4X2ZyZWVfZnVuYzsKKwl9IEJJT19BU04xX0VYX0ZVTkNTOworCit0eXBlZGVmIHN0cnVjdCBCSU9fQVNOMV9CVUZfQ1RYX3QKKwl7CisJLyogSW50ZXJuYWwgc3RhdGUgKi8KKwlhc24xX2Jpb19zdGF0ZV90IHN0YXRlOworCS8qIEludGVybmFsIGJ1ZmZlciAqLworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwkvKiBTaXplIG9mIGJ1ZmZlciAqLworCWludCBidWZzaXplOworCS8qIEN1cnJlbnQgcG9zaXRpb24gaW4gYnVmZmVyICovCisJaW50IGJ1ZnBvczsKKwkvKiBDdXJyZW50IGJ1ZmZlciBsZW5ndGggKi8KKwlpbnQgYnVmbGVuOworCS8qIEFtb3VudCBvZiBkYXRhIHRvIGNvcHkgKi8KKwlpbnQgY29weWxlbjsKKwkvKiBDbGFzcyBhbmQgdGFnIHRvIHVzZSAqLworCWludCBhc24xX2NsYXNzLCBhc24xX3RhZzsKKwlhc24xX3BzX2Z1bmMgKnByZWZpeCwgKnByZWZpeF9mcmVlLCAqc3VmZml4LCAqc3VmZml4X2ZyZWU7CisJLyogRXh0cmEgYnVmZmVyIGZvciBwcmVmaXggYW5kIHN1ZmZpeCBkYXRhICovCisJdW5zaWduZWQgY2hhciAqZXhfYnVmOworCWludCBleF9sZW47CisJaW50IGV4X3BvczsKKwl2b2lkICpleF9hcmc7CisJfSBCSU9fQVNOMV9CVUZfQ1RYOworCisKK3N0YXRpYyBpbnQgYXNuMV9iaW9fd3JpdGUoQklPICpoLCBjb25zdCBjaGFyICpidWYsaW50IG51bSk7CitzdGF0aWMgaW50IGFzbjFfYmlvX3JlYWQoQklPICpoLCBjaGFyICpidWYsIGludCBzaXplKTsKK3N0YXRpYyBpbnQgYXNuMV9iaW9fcHV0cyhCSU8gKmgsIGNvbnN0IGNoYXIgKnN0cik7CitzdGF0aWMgaW50IGFzbjFfYmlvX2dldHMoQklPICpoLCBjaGFyICpzdHIsIGludCBzaXplKTsKK3N0YXRpYyBsb25nIGFzbjFfYmlvX2N0cmwoQklPICpoLCBpbnQgY21kLCBsb25nIGFyZzEsIHZvaWQgKmFyZzIpOworc3RhdGljIGludCBhc24xX2Jpb19uZXcoQklPICpoKTsKK3N0YXRpYyBpbnQgYXNuMV9iaW9fZnJlZShCSU8gKmRhdGEpOworc3RhdGljIGxvbmcgYXNuMV9iaW9fY2FsbGJhY2tfY3RybChCSU8gKmgsIGludCBjbWQsIGJpb19pbmZvX2NiIGZwKTsKKworc3RhdGljIGludCBhc24xX2Jpb19pbml0KEJJT19BU04xX0JVRl9DVFggKmN0eCwgaW50IHNpemUpOworc3RhdGljIGludCBhc24xX2Jpb19mbHVzaF9leChCSU8gKmIsIEJJT19BU04xX0JVRl9DVFggKmN0eCwKKwkJCQlhc24xX3BzX2Z1bmMgKmNsZWFudXAsIGFzbjFfYmlvX3N0YXRlX3QgbmV4dCk7CitzdGF0aWMgaW50IGFzbjFfYmlvX3NldHVwX2V4KEJJTyAqYiwgQklPX0FTTjFfQlVGX0NUWCAqY3R4LAorCQkJCWFzbjFfcHNfZnVuYyAqc2V0dXAsIAorCQkJCWFzbjFfYmlvX3N0YXRlX3QgZXhfc3RhdGUsCisJCQkJYXNuMV9iaW9fc3RhdGVfdCBvdGhlcl9zdGF0ZSk7CisKK3N0YXRpYyBCSU9fTUVUSE9EIG1ldGhvZHNfYXNuMT0KKwl7CisJQklPX1RZUEVfQVNOMSwKKwkiYXNuMSIsCisJYXNuMV9iaW9fd3JpdGUsCisJYXNuMV9iaW9fcmVhZCwKKwlhc24xX2Jpb19wdXRzLAorCWFzbjFfYmlvX2dldHMsCisJYXNuMV9iaW9fY3RybCwKKwlhc24xX2Jpb19uZXcsCisJYXNuMV9iaW9fZnJlZSwKKwlhc24xX2Jpb19jYWxsYmFja19jdHJsLAorCX07CisKK0JJT19NRVRIT0QgKkJJT19mX2FzbjEodm9pZCkKKwl7CisJcmV0dXJuKCZtZXRob2RzX2FzbjEpOworCX0KKworCitzdGF0aWMgaW50IGFzbjFfYmlvX25ldyhCSU8gKmIpCisJeworCUJJT19BU04xX0JVRl9DVFggKmN0eDsKKwljdHggPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoQklPX0FTTjFfQlVGX0NUWCkpOworCWlmICghY3R4KQorCQlyZXR1cm4gMDsKKwlpZiAoIWFzbjFfYmlvX2luaXQoY3R4LCBERUZBVUxUX0FTTjFfQlVGX1NJWkUpKQorCQlyZXR1cm4gMDsKKwliLT5pbml0ID0gMTsKKwliLT5wdHIgPSAoY2hhciAqKWN0eDsKKwliLT5mbGFncyA9IDA7CisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IGFzbjFfYmlvX2luaXQoQklPX0FTTjFfQlVGX0NUWCAqY3R4LCBpbnQgc2l6ZSkKKwl7CisJY3R4LT5idWYgPSBPUEVOU1NMX21hbGxvYyhzaXplKTsKKwlpZiAoIWN0eC0+YnVmKQorCQlyZXR1cm4gMDsKKwljdHgtPmJ1ZnNpemUgPSBzaXplOworCWN0eC0+YnVmcG9zID0gMDsKKwljdHgtPmJ1ZmxlbiA9IDA7CisJY3R4LT5jb3B5bGVuID0gMDsKKwljdHgtPmFzbjFfY2xhc3MgPSBWX0FTTjFfVU5JVkVSU0FMOworCWN0eC0+YXNuMV90YWcgPSBWX0FTTjFfT0NURVRfU1RSSU5HOworCWN0eC0+ZXhfYnVmID0gMDsKKwljdHgtPmV4X3BvcyA9IDA7CisJY3R4LT5leF9sZW4gPSAwOworCWN0eC0+c3RhdGUgPSBBU04xX1NUQVRFX1NUQVJUOworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBhc24xX2Jpb19mcmVlKEJJTyAqYikKKwl7CisJQklPX0FTTjFfQlVGX0NUWCAqY3R4OworCWN0eCA9IChCSU9fQVNOMV9CVUZfQ1RYICopIGItPnB0cjsKKwlpZiAoY3R4ID09IE5VTEwpCisJCXJldHVybiAwOworCWlmIChjdHgtPmJ1ZikKKwkJT1BFTlNTTF9mcmVlKGN0eC0+YnVmKTsKKwlPUEVOU1NMX2ZyZWUoY3R4KTsKKwliLT5pbml0ID0gMDsKKwliLT5wdHIgPSBOVUxMOworCWItPmZsYWdzID0gMDsKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgYXNuMV9iaW9fd3JpdGUoQklPICpiLCBjb25zdCBjaGFyICppbiAsIGludCBpbmwpCisJeworCUJJT19BU04xX0JVRl9DVFggKmN0eDsKKwlpbnQgd3JtYXgsIHdybGVuLCByZXQ7CisJdW5zaWduZWQgY2hhciAqcDsKKwlpZiAoIWluIHx8IChpbmwgPCAwKSB8fCAoYi0+bmV4dF9iaW8gPT0gTlVMTCkpCisJCXJldHVybiAwOworCWN0eCA9IChCSU9fQVNOMV9CVUZfQ1RYICopIGItPnB0cjsKKwlpZiAoY3R4ID09IE5VTEwpCisJCXJldHVybiAwOworCisJd3JsZW4gPSAwOworCXJldCA9IC0xOworCisJZm9yKDs7KQorCQl7CisJCXN3aXRjaCAoY3R4LT5zdGF0ZSkKKwkJCXsKKworCQkJLyogU2V0dXAgcHJlZml4IGRhdGEsIGNhbGwgaXQgKi8KKwkJCWNhc2UgQVNOMV9TVEFURV9TVEFSVDoKKwkJCWlmICghYXNuMV9iaW9fc2V0dXBfZXgoYiwgY3R4LCBjdHgtPnByZWZpeCwKKwkJCQlBU04xX1NUQVRFX1BSRV9DT1BZLCBBU04xX1NUQVRFX0hFQURFUikpCisJCQkJcmV0dXJuIDA7CisJCQlicmVhazsKKworCQkJLyogQ29weSBhbnkgcHJlIGRhdGEgZmlyc3QgKi8KKwkJCWNhc2UgQVNOMV9TVEFURV9QUkVfQ09QWToKKworCQkJcmV0ID0gYXNuMV9iaW9fZmx1c2hfZXgoYiwgY3R4LCBjdHgtPnByZWZpeF9mcmVlLAorCQkJCQkJCUFTTjFfU1RBVEVfSEVBREVSKTsKKworCQkJaWYgKHJldCA8PSAwKQorCQkJCWdvdG8gZG9uZTsKKworCQkJYnJlYWs7CisKKwkJCWNhc2UgQVNOMV9TVEFURV9IRUFERVI6CisJCQljdHgtPmJ1ZmxlbiA9CisJCQkJQVNOMV9vYmplY3Rfc2l6ZSgwLCBpbmwsIGN0eC0+YXNuMV90YWcpIC0gaW5sOworCQkJYXNzZXJ0KGN0eC0+YnVmbGVuIDw9IGN0eC0+YnVmc2l6ZSk7CisJCQlwID0gY3R4LT5idWY7CisJCQlBU04xX3B1dF9vYmplY3QoJnAsIDAsIGlubCwKKwkJCQkJY3R4LT5hc24xX3RhZywgY3R4LT5hc24xX2NsYXNzKTsKKwkJCWN0eC0+Y29weWxlbiA9IGlubDsKKwkJCWN0eC0+c3RhdGUgPSBBU04xX1NUQVRFX0hFQURFUl9DT1BZOworCisJCQlicmVhazsKKworCQkJY2FzZSBBU04xX1NUQVRFX0hFQURFUl9DT1BZOgkKKwkJCXJldCA9IEJJT193cml0ZShiLT5uZXh0X2JpbywKKwkJCQkJY3R4LT5idWYgKyBjdHgtPmJ1ZnBvcywgY3R4LT5idWZsZW4pOworCQkJaWYgKHJldCA8PSAwKQorCQkJCWdvdG8gZG9uZTsKKworCQkJY3R4LT5idWZsZW4gLT0gcmV0OworCQkJaWYgKGN0eC0+YnVmbGVuKQorCQkJCWN0eC0+YnVmcG9zICs9IHJldDsKKwkJCWVsc2UKKwkJCQl7CisJCQkJY3R4LT5idWZwb3MgPSAwOworCQkJCWN0eC0+c3RhdGUgPSBBU04xX1NUQVRFX0RBVEFfQ09QWTsKKwkJCQl9CisKKwkJCWJyZWFrOworCisJCQljYXNlIEFTTjFfU1RBVEVfREFUQV9DT1BZOgorCisJCQlpZiAoaW5sID4gY3R4LT5jb3B5bGVuKQorCQkJCXdybWF4ID0gY3R4LT5jb3B5bGVuOworCQkJZWxzZQorCQkJCXdybWF4ID0gaW5sOworCQkJcmV0ID0gQklPX3dyaXRlKGItPm5leHRfYmlvLCBpbiwgd3JtYXgpOworCQkJaWYgKHJldCA8PSAwKQorCQkJCWJyZWFrOworCQkJd3JsZW4gKz0gcmV0OworCQkJY3R4LT5jb3B5bGVuIC09IHJldDsKKwkJCWluICs9IHJldDsKKwkJCWlubCAtPSByZXQ7CisKKwkJCWlmIChjdHgtPmNvcHlsZW4gPT0gMCkKKwkJCQljdHgtPnN0YXRlID0gQVNOMV9TVEFURV9IRUFERVI7CisKKwkJCWlmIChpbmwgPT0gMCkKKwkJCQlnb3RvIGRvbmU7CisKKwkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJQklPX2NsZWFyX3JldHJ5X2ZsYWdzKGIpOworCQkJcmV0dXJuIDA7CisKKwkJCX0KKworCQl9CisKKwlkb25lOgorCUJJT19jbGVhcl9yZXRyeV9mbGFncyhiKTsKKwlCSU9fY29weV9uZXh0X3JldHJ5KGIpOworCisJcmV0dXJuICh3cmxlbiA+IDApID8gd3JsZW4gOiByZXQ7CisKKwl9CisKK3N0YXRpYyBpbnQgYXNuMV9iaW9fZmx1c2hfZXgoQklPICpiLCBCSU9fQVNOMV9CVUZfQ1RYICpjdHgsCisJCQkJYXNuMV9wc19mdW5jICpjbGVhbnVwLCBhc24xX2Jpb19zdGF0ZV90IG5leHQpCisJeworCWludCByZXQ7CisJaWYgKGN0eC0+ZXhfbGVuIDw9IDApCisJCXJldHVybiAxOworCWZvcig7OykKKwkJeworCQlyZXQgPSBCSU9fd3JpdGUoYi0+bmV4dF9iaW8sIGN0eC0+ZXhfYnVmICsgY3R4LT5leF9wb3MsCisJCQkJCQkJCWN0eC0+ZXhfbGVuKTsKKwkJaWYgKHJldCA8PSAwKQorCQkJYnJlYWs7CisJCWN0eC0+ZXhfbGVuIC09IHJldDsKKwkJaWYgKGN0eC0+ZXhfbGVuID4gMCkKKwkJCWN0eC0+ZXhfcG9zICs9IHJldDsKKwkJZWxzZQorCQkJeworCQkJaWYoY2xlYW51cCkKKwkJCQljbGVhbnVwKGIsICZjdHgtPmV4X2J1ZiwgJmN0eC0+ZXhfbGVuLAorCQkJCQkJCQkmY3R4LT5leF9hcmcpOworCQkJY3R4LT5zdGF0ZSA9IG5leHQ7CisJCQljdHgtPmV4X3BvcyA9IDA7CisJCQlicmVhazsKKwkJCX0KKwkJfQorCXJldHVybiByZXQ7CisJfQorCitzdGF0aWMgaW50IGFzbjFfYmlvX3NldHVwX2V4KEJJTyAqYiwgQklPX0FTTjFfQlVGX0NUWCAqY3R4LAorCQkJCWFzbjFfcHNfZnVuYyAqc2V0dXAsIAorCQkJCWFzbjFfYmlvX3N0YXRlX3QgZXhfc3RhdGUsCisJCQkJYXNuMV9iaW9fc3RhdGVfdCBvdGhlcl9zdGF0ZSkKKwl7CisJaWYgKHNldHVwICYmICFzZXR1cChiLCAmY3R4LT5leF9idWYsICZjdHgtPmV4X2xlbiwgJmN0eC0+ZXhfYXJnKSkKKwkJeworCQlCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYik7CisJCXJldHVybiAwOworCQl9CisJaWYgKGN0eC0+ZXhfbGVuID4gMCkKKwkJY3R4LT5zdGF0ZSA9IGV4X3N0YXRlOworCWVsc2UKKwkJY3R4LT5zdGF0ZSA9IG90aGVyX3N0YXRlOworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBhc24xX2Jpb19yZWFkKEJJTyAqYiwgY2hhciAqaW4gLCBpbnQgaW5sKQorCXsKKwlpZiAoIWItPm5leHRfYmlvKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gQklPX3JlYWQoYi0+bmV4dF9iaW8sIGluICwgaW5sKTsKKwl9CisKK3N0YXRpYyBpbnQgYXNuMV9iaW9fcHV0cyhCSU8gKmIsIGNvbnN0IGNoYXIgKnN0cikKKwl7CisJcmV0dXJuIGFzbjFfYmlvX3dyaXRlKGIsIHN0ciwgc3RybGVuKHN0cikpOworCX0KKworc3RhdGljIGludCBhc24xX2Jpb19nZXRzKEJJTyAqYiwgY2hhciAqc3RyLCBpbnQgc2l6ZSkKKwl7CisJaWYgKCFiLT5uZXh0X2JpbykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIEJJT19nZXRzKGItPm5leHRfYmlvLCBzdHIgLCBzaXplKTsKKwl9CisKK3N0YXRpYyBsb25nIGFzbjFfYmlvX2NhbGxiYWNrX2N0cmwoQklPICpiLCBpbnQgY21kLCBiaW9faW5mb19jYiBmcCkKKwl7CisJaWYgKGItPm5leHRfYmlvID09IE5VTEwpIHJldHVybigwKTsKKwlyZXR1cm4gQklPX2NhbGxiYWNrX2N0cmwoYi0+bmV4dF9iaW8sY21kLGZwKTsKKwl9CisKK3N0YXRpYyBsb25nIGFzbjFfYmlvX2N0cmwoQklPICpiLCBpbnQgY21kLCBsb25nIGFyZzEsIHZvaWQgKmFyZzIpCisJeworCUJJT19BU04xX0JVRl9DVFggKmN0eDsKKwlCSU9fQVNOMV9FWF9GVU5DUyAqZXhfZnVuYzsKKwlsb25nIHJldCA9IDE7CisJY3R4ID0gKEJJT19BU04xX0JVRl9DVFggKikgYi0+cHRyOworCWlmIChjdHggPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJc3dpdGNoKGNtZCkKKwkJeworCisJCWNhc2UgQklPX0NfU0VUX1BSRUZJWDoKKwkJZXhfZnVuYyA9IGFyZzI7CisJCWN0eC0+cHJlZml4ICA9IGV4X2Z1bmMtPmV4X2Z1bmM7CisJCWN0eC0+cHJlZml4X2ZyZWUgID0gZXhfZnVuYy0+ZXhfZnJlZV9mdW5jOworCQlicmVhazsKKworCQljYXNlIEJJT19DX0dFVF9QUkVGSVg6CisJCWV4X2Z1bmMgPSBhcmcyOworCQlleF9mdW5jLT5leF9mdW5jID0gY3R4LT5wcmVmaXg7CisJCWV4X2Z1bmMtPmV4X2ZyZWVfZnVuYyA9IGN0eC0+cHJlZml4X2ZyZWU7CisJCWJyZWFrOworCisJCWNhc2UgQklPX0NfU0VUX1NVRkZJWDoKKwkJZXhfZnVuYyA9IGFyZzI7CisJCWN0eC0+c3VmZml4ICA9IGV4X2Z1bmMtPmV4X2Z1bmM7CisJCWN0eC0+c3VmZml4X2ZyZWUgID0gZXhfZnVuYy0+ZXhfZnJlZV9mdW5jOworCQlicmVhazsKKworCQljYXNlIEJJT19DX0dFVF9TVUZGSVg6CisJCWV4X2Z1bmMgPSBhcmcyOworCQlleF9mdW5jLT5leF9mdW5jID0gY3R4LT5zdWZmaXg7CisJCWV4X2Z1bmMtPmV4X2ZyZWVfZnVuYyA9IGN0eC0+c3VmZml4X2ZyZWU7CisJCWJyZWFrOworCisJCWNhc2UgQklPX0NfU0VUX0VYX0FSRzoKKwkJY3R4LT5leF9hcmcgPSBhcmcyOworCQlicmVhazsKKworCQljYXNlIEJJT19DX0dFVF9FWF9BUkc6CisJCSoodm9pZCAqKilhcmcyID0gY3R4LT5leF9hcmc7CisJCWJyZWFrOworCisJCWNhc2UgQklPX0NUUkxfRkxVU0g6CisJCWlmICghYi0+bmV4dF9iaW8pCisJCQlyZXR1cm4gMDsKKworCQkvKiBDYWxsIHBvc3QgZnVuY3Rpb24gaWYgcG9zc2libGUgKi8KKwkJaWYgKGN0eC0+c3RhdGUgPT0gQVNOMV9TVEFURV9IRUFERVIpCisJCQl7CisJCQlpZiAoIWFzbjFfYmlvX3NldHVwX2V4KGIsIGN0eCwgY3R4LT5zdWZmaXgsCisJCQkJQVNOMV9TVEFURV9QT1NUX0NPUFksIEFTTjFfU1RBVEVfRE9ORSkpCisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJaWYgKGN0eC0+c3RhdGUgPT0gQVNOMV9TVEFURV9QT1NUX0NPUFkpCisJCQl7CisJCQlyZXQgPSBhc24xX2Jpb19mbHVzaF9leChiLCBjdHgsIGN0eC0+c3VmZml4X2ZyZWUsCisJCQkJCQkJQVNOMV9TVEFURV9ET05FKTsKKwkJCWlmIChyZXQgPD0gMCkKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCisJCWlmIChjdHgtPnN0YXRlID09IEFTTjFfU1RBVEVfRE9ORSkKKwkJCXJldHVybiBCSU9fY3RybChiLT5uZXh0X2JpbywgY21kLCBhcmcxLCBhcmcyKTsKKwkJZWxzZQorCQkJeworCQkJQklPX2NsZWFyX3JldHJ5X2ZsYWdzKGIpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCWJyZWFrOworCisKKwkJZGVmYXVsdDoKKwkJaWYgKCFiLT5uZXh0X2JpbykKKwkJCXJldHVybiAwOworCQlyZXR1cm4gQklPX2N0cmwoYi0+bmV4dF9iaW8sIGNtZCwgYXJnMSwgYXJnMik7CisKKwkJfQorCisJcmV0dXJuIHJldDsKKwl9CisKK3N0YXRpYyBpbnQgYXNuMV9iaW9fc2V0X2V4KEJJTyAqYiwgaW50IGNtZCwKKwkJYXNuMV9wc19mdW5jICpleF9mdW5jLCBhc24xX3BzX2Z1bmMgKmV4X2ZyZWVfZnVuYykKKwl7CisJQklPX0FTTjFfRVhfRlVOQ1MgZXh0bXA7CisJZXh0bXAuZXhfZnVuYyA9IGV4X2Z1bmM7CisJZXh0bXAuZXhfZnJlZV9mdW5jID0gZXhfZnJlZV9mdW5jOworCXJldHVybiBCSU9fY3RybChiLCBjbWQsIDAsICZleHRtcCk7CisJfQorCitzdGF0aWMgaW50IGFzbjFfYmlvX2dldF9leChCSU8gKmIsIGludCBjbWQsCisJCWFzbjFfcHNfZnVuYyAqKmV4X2Z1bmMsIGFzbjFfcHNfZnVuYyAqKmV4X2ZyZWVfZnVuYykKKwl7CisJQklPX0FTTjFfRVhfRlVOQ1MgZXh0bXA7CisJaW50IHJldDsKKwlyZXQgPSBCSU9fY3RybChiLCBjbWQsIDAsICZleHRtcCk7CisJaWYgKHJldCA+IDApCisJCXsKKwkJKmV4X2Z1bmMgPSBleHRtcC5leF9mdW5jOworCQkqZXhfZnJlZV9mdW5jID0gZXh0bXAuZXhfZnJlZV9mdW5jOworCQl9CisJcmV0dXJuIHJldDsKKwl9CisKK2ludCBCSU9fYXNuMV9zZXRfcHJlZml4KEJJTyAqYiwgYXNuMV9wc19mdW5jICpwcmVmaXgsIGFzbjFfcHNfZnVuYyAqcHJlZml4X2ZyZWUpCisJeworCXJldHVybiBhc24xX2Jpb19zZXRfZXgoYiwgQklPX0NfU0VUX1BSRUZJWCwgcHJlZml4LCBwcmVmaXhfZnJlZSk7CisJfQorCitpbnQgQklPX2FzbjFfZ2V0X3ByZWZpeChCSU8gKmIsIGFzbjFfcHNfZnVuYyAqKnBwcmVmaXgsIGFzbjFfcHNfZnVuYyAqKnBwcmVmaXhfZnJlZSkKKwl7CisJcmV0dXJuIGFzbjFfYmlvX2dldF9leChiLCBCSU9fQ19HRVRfUFJFRklYLCBwcHJlZml4LCBwcHJlZml4X2ZyZWUpOworCX0KKworaW50IEJJT19hc24xX3NldF9zdWZmaXgoQklPICpiLCBhc24xX3BzX2Z1bmMgKnN1ZmZpeCwgYXNuMV9wc19mdW5jICpzdWZmaXhfZnJlZSkKKwl7CisJcmV0dXJuIGFzbjFfYmlvX3NldF9leChiLCBCSU9fQ19TRVRfU1VGRklYLCBzdWZmaXgsIHN1ZmZpeF9mcmVlKTsKKwl9CisKK2ludCBCSU9fYXNuMV9nZXRfc3VmZml4KEJJTyAqYiwgYXNuMV9wc19mdW5jICoqcHN1ZmZpeCwgYXNuMV9wc19mdW5jICoqcHN1ZmZpeF9mcmVlKQorCXsKKwlyZXR1cm4gYXNuMV9iaW9fZ2V0X2V4KGIsIEJJT19DX0dFVF9TVUZGSVgsIHBzdWZmaXgsIHBzdWZmaXhfZnJlZSk7CisJfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FzbjEvYmlvX25kZWYuYyBiL2NyeXB0by9hc24xL2Jpb19uZGVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgxNDgxNAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9hc24xL2Jpb19uZGVmLmMKQEAgLTAsMCArMSwyNDggQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorCisKKy8qIEV4cGVyaW1lbnRhbCBOREVGIEFTTjEgQklPIHN1cHBvcnQgcm91dGluZXMgKi8KKworLyogVGhlIHVzYWdlIGlzIHF1aXRlIHNpbXBsZSwgaW5pdGlhbGl6ZSBhbiBBU04xIHN0cnVjdHVyZSwKKyAqIGdldCBhIEJJTyBmcm9tIGl0IHRoZW4gYW55IGRhdGEgd3JpdHRlbiB0aHJvdWdoIHRoZSBCSU8KKyAqIHdpbGwgZW5kIHVwIHRyYW5zbGF0ZWQgdG8gYXBwcm9wdGlhdGUgZm9ybWF0IG9uIHRoZSBmbHkuCisgKiBUaGUgZGF0YSBpcyBzdHJlYW1lZCBvdXQgYW5kIGRvZXMgKm5vdCogbmVlZCB0byBiZQorICogYWxsIGhlbGQgaW4gbWVtb3J5IGF0IG9uY2UuCisgKgorICogV2hlbiB0aGUgQklPIGlzIGZsdXNoZWQgdGhlIG91dHB1dCBpcyBmaW5hbGl6ZWQgYW5kIGFueQorICogc2lnbmF0dXJlcyBldGMgd3JpdHRlbiBvdXQuCisgKgorICogVGhlIEJJTyBpcyBhICdwcm9wZXInIEJJTyBhbmQgY2FuIGhhbmRsZSBub24gYmxvY2tpbmcgSS9PCisgKiBjb3JyZWN0bHkuCisgKgorICogVGhlIHVzYWdlIGlzIHNpbXBsZS4gVGhlIGltcGxlbWVudGF0aW9uIGlzICpub3QqLi4uCisgKi8KKworLyogQklPIHN1cHBvcnQgZGF0YSBzdG9yZWQgaW4gdGhlIEFTTjEgQklPIGV4X2FyZyAqLworCit0eXBlZGVmIHN0cnVjdCBuZGVmX2F1eF9zdAorCXsKKwkvKiBBU04xIHN0cnVjdHVyZSB0aGlzIEJJTyByZWZlcnMgdG8gKi8KKwlBU04xX1ZBTFVFICp2YWw7CisJY29uc3QgQVNOMV9JVEVNICppdDsKKwkvKiBUb3Agb2YgdGhlIEJJTyBjaGFpbiAqLworCUJJTyAqbmRlZl9iaW87CisJLyogT3V0cHV0IEJJTyAqLworCUJJTyAqb3V0OworCS8qIEJvdW5kYXJ5IHdoZXJlIGNvbnRlbnQgaXMgaW5zZXJ0ZWQgKi8KKwl1bnNpZ25lZCBjaGFyICoqYm91bmRhcnk7CisJLyogREVSIGJ1ZmZlciBzdGFydCAqLworCXVuc2lnbmVkIGNoYXIgKmRlcmJ1ZjsKKwl9IE5ERUZfU1VQUE9SVDsKKworc3RhdGljIGludCBuZGVmX3ByZWZpeChCSU8gKmIsIHVuc2lnbmVkIGNoYXIgKipwYnVmLCBpbnQgKnBsZW4sIHZvaWQgKnBhcmcpOworc3RhdGljIGludCBuZGVmX3ByZWZpeF9mcmVlKEJJTyAqYiwgdW5zaWduZWQgY2hhciAqKnBidWYsIGludCAqcGxlbiwgdm9pZCAqcGFyZyk7CitzdGF0aWMgaW50IG5kZWZfc3VmZml4KEJJTyAqYiwgdW5zaWduZWQgY2hhciAqKnBidWYsIGludCAqcGxlbiwgdm9pZCAqcGFyZyk7CitzdGF0aWMgaW50IG5kZWZfc3VmZml4X2ZyZWUoQklPICpiLCB1bnNpZ25lZCBjaGFyICoqcGJ1ZiwgaW50ICpwbGVuLCB2b2lkICpwYXJnKTsKKworQklPICpCSU9fbmV3X05ERUYoQklPICpvdXQsIEFTTjFfVkFMVUUgKnZhbCwgY29uc3QgQVNOMV9JVEVNICppdCkKKwl7CisJTkRFRl9TVVBQT1JUICpuZGVmX2F1eCA9IE5VTEw7CisJQklPICphc25fYmlvID0gTlVMTDsKKwljb25zdCBBU04xX0FVWCAqYXV4ID0gaXQtPmZ1bmNzOworCUFTTjFfU1RSRUFNX0FSRyBzYXJnOworCisJaWYgKCFhdXggfHwgIWF1eC0+YXNuMV9jYikKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBCSU9fbmV3X05ERUYsIEFTTjFfUl9TVFJFQU1JTkdfTk9UX1NVUFBPUlRFRCk7CisJCXJldHVybiBOVUxMOworCQl9CisJbmRlZl9hdXggPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoTkRFRl9TVVBQT1JUKSk7CisJYXNuX2JpbyA9IEJJT19uZXcoQklPX2ZfYXNuMSgpKTsKKworCS8qIEFTTjEgYmlvIG5lZWRzIHRvIGJlIG5leHQgdG8gb3V0cHV0IEJJTyAqLworCisJb3V0ID0gQklPX3B1c2goYXNuX2Jpbywgb3V0KTsKKworCWlmICghbmRlZl9hdXggfHwgIWFzbl9iaW8gfHwgIW91dCkKKwkJZ290byBlcnI7CisKKwlCSU9fYXNuMV9zZXRfcHJlZml4KGFzbl9iaW8sIG5kZWZfcHJlZml4LCBuZGVmX3ByZWZpeF9mcmVlKTsKKwlCSU9fYXNuMV9zZXRfc3VmZml4KGFzbl9iaW8sIG5kZWZfc3VmZml4LCBuZGVmX3N1ZmZpeF9mcmVlKTsKKworCS8qIE5vdyBsZXQgY2FsbGJhY2sgcHJlcGVuZCBhbnkgZGlnZXN0LCBjaXBoZXIgZXRjIEJJT3MKKwkgKiBBU04xIHN0cnVjdHVyZSBuZWVkcy4KKwkgKi8KKworCXNhcmcub3V0ID0gb3V0OworCXNhcmcubmRlZl9iaW8gPSBOVUxMOworCXNhcmcuYm91bmRhcnkgPSBOVUxMOworCisJaWYgKGF1eC0+YXNuMV9jYihBU04xX09QX1NUUkVBTV9QUkUsICZ2YWwsIGl0LCAmc2FyZykgPD0gMCkKKwkJZ290byBlcnI7CisKKwluZGVmX2F1eC0+dmFsID0gdmFsOworCW5kZWZfYXV4LT5pdCA9IGl0OworCW5kZWZfYXV4LT5uZGVmX2JpbyA9IHNhcmcubmRlZl9iaW87CisJbmRlZl9hdXgtPmJvdW5kYXJ5ID0gc2FyZy5ib3VuZGFyeTsKKwluZGVmX2F1eC0+b3V0ID0gb3V0OworCisJQklPX2N0cmwoYXNuX2JpbywgQklPX0NfU0VUX0VYX0FSRywgMCwgbmRlZl9hdXgpOworCisJcmV0dXJuIHNhcmcubmRlZl9iaW87CisKKwllcnI6CisJaWYgKGFzbl9iaW8pCisJCUJJT19mcmVlKGFzbl9iaW8pOworCWlmIChuZGVmX2F1eCkKKwkJT1BFTlNTTF9mcmVlKG5kZWZfYXV4KTsKKwlyZXR1cm4gTlVMTDsKKwl9CisKK3N0YXRpYyBpbnQgbmRlZl9wcmVmaXgoQklPICpiLCB1bnNpZ25lZCBjaGFyICoqcGJ1ZiwgaW50ICpwbGVuLCB2b2lkICpwYXJnKQorCXsKKwlOREVGX1NVUFBPUlQgKm5kZWZfYXV4OworCXVuc2lnbmVkIGNoYXIgKnA7CisJaW50IGRlcmxlbjsKKworCWlmICghcGFyZykKKwkJcmV0dXJuIDA7CisKKwluZGVmX2F1eCA9ICooTkRFRl9TVVBQT1JUICoqKXBhcmc7CisKKwlkZXJsZW4gPSBBU04xX2l0ZW1fbmRlZl9pMmQobmRlZl9hdXgtPnZhbCwgTlVMTCwgbmRlZl9hdXgtPml0KTsKKwlwID0gT1BFTlNTTF9tYWxsb2MoZGVybGVuKTsKKwluZGVmX2F1eC0+ZGVyYnVmID0gcDsKKwkqcGJ1ZiA9IHA7CisJZGVybGVuID0gQVNOMV9pdGVtX25kZWZfaTJkKG5kZWZfYXV4LT52YWwsICZwLCBuZGVmX2F1eC0+aXQpOworCisJaWYgKCEqbmRlZl9hdXgtPmJvdW5kYXJ5KQorCQlyZXR1cm4gMDsKKworCSpwbGVuID0gKm5kZWZfYXV4LT5ib3VuZGFyeSAtICpwYnVmOworCisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IG5kZWZfcHJlZml4X2ZyZWUoQklPICpiLCB1bnNpZ25lZCBjaGFyICoqcGJ1ZiwgaW50ICpwbGVuLCB2b2lkICpwYXJnKQorCXsKKwlOREVGX1NVUFBPUlQgKm5kZWZfYXV4OworCisJaWYgKCFwYXJnKQorCQlyZXR1cm4gMDsKKworCW5kZWZfYXV4ID0gKihOREVGX1NVUFBPUlQgKiopcGFyZzsKKworCWlmIChuZGVmX2F1eC0+ZGVyYnVmKQorCQlPUEVOU1NMX2ZyZWUobmRlZl9hdXgtPmRlcmJ1Zik7CisKKwluZGVmX2F1eC0+ZGVyYnVmID0gTlVMTDsKKwkqcGJ1ZiA9IE5VTEw7CisJKnBsZW4gPSAwOworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBuZGVmX3N1ZmZpeF9mcmVlKEJJTyAqYiwgdW5zaWduZWQgY2hhciAqKnBidWYsIGludCAqcGxlbiwgdm9pZCAqcGFyZykKKwl7CisJTkRFRl9TVVBQT1JUICoqcG5kZWZfYXV4ID0gKE5ERUZfU1VQUE9SVCAqKilwYXJnOworCWlmICghbmRlZl9wcmVmaXhfZnJlZShiLCBwYnVmLCBwbGVuLCBwYXJnKSkKKwkJcmV0dXJuIDA7CisJT1BFTlNTTF9mcmVlKCpwbmRlZl9hdXgpOworCSpwbmRlZl9hdXggPSBOVUxMOworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBuZGVmX3N1ZmZpeChCSU8gKmIsIHVuc2lnbmVkIGNoYXIgKipwYnVmLCBpbnQgKnBsZW4sIHZvaWQgKnBhcmcpCisJeworCU5ERUZfU1VQUE9SVCAqbmRlZl9hdXg7CisJdW5zaWduZWQgY2hhciAqcDsKKwlpbnQgZGVybGVuOworCWNvbnN0IEFTTjFfQVVYICphdXg7CisJQVNOMV9TVFJFQU1fQVJHIHNhcmc7CisKKwlpZiAoIXBhcmcpCisJCXJldHVybiAwOworCisJbmRlZl9hdXggPSAqKE5ERUZfU1VQUE9SVCAqKilwYXJnOworCisJYXV4ID0gbmRlZl9hdXgtPml0LT5mdW5jczsKKworCS8qIEZpbmFsaXplIHN0cnVjdHVyZXMgKi8KKwlzYXJnLm5kZWZfYmlvID0gbmRlZl9hdXgtPm5kZWZfYmlvOworCXNhcmcub3V0ID0gbmRlZl9hdXgtPm91dDsKKwlzYXJnLmJvdW5kYXJ5ID0gbmRlZl9hdXgtPmJvdW5kYXJ5OworCWlmIChhdXgtPmFzbjFfY2IoQVNOMV9PUF9TVFJFQU1fUE9TVCwKKwkJCQkmbmRlZl9hdXgtPnZhbCwgbmRlZl9hdXgtPml0LCAmc2FyZykgPD0gMCkKKwkJcmV0dXJuIDA7CisKKwlkZXJsZW4gPSBBU04xX2l0ZW1fbmRlZl9pMmQobmRlZl9hdXgtPnZhbCwgTlVMTCwgbmRlZl9hdXgtPml0KTsKKwlwID0gT1BFTlNTTF9tYWxsb2MoZGVybGVuKTsKKwluZGVmX2F1eC0+ZGVyYnVmID0gcDsKKwkqcGJ1ZiA9IHA7CisJZGVybGVuID0gQVNOMV9pdGVtX25kZWZfaTJkKG5kZWZfYXV4LT52YWwsICZwLCBuZGVmX2F1eC0+aXQpOworCisJaWYgKCEqbmRlZl9hdXgtPmJvdW5kYXJ5KQorCQlyZXR1cm4gMDsKKwkqcGJ1ZiA9ICpuZGVmX2F1eC0+Ym91bmRhcnk7CisJKnBsZW4gPSBkZXJsZW4gLSAoKm5kZWZfYXV4LT5ib3VuZGFyeSAtIG5kZWZfYXV4LT5kZXJidWYpOworCisJcmV0dXJuIDE7CisJfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FzbjEvY2hhcm1hcC5wbCBiL2NyeXB0by9hc24xL2NoYXJtYXAucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg3NWM1OQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9hc24xL2NoYXJtYXAucGwKQEAgLTAsMCArMSw4MCBAQAorIyEvdXNyL2xvY2FsL2Jpbi9wZXJsIC13CisKK3VzZSBzdHJpY3Q7CisKK215ICgkaSwgQGFycik7CisKKyMgU2V0IHVwIGFuIGFycmF5IHdpdGggdGhlIHR5cGUgb2YgQVNDSUkgY2hhcmFjdGVycworIyBFYWNoIHNldCBiaXQgcmVwcmVzZW50cyBhIGNoYXJhY3RlciBwcm9wZXJ0eS4KKworIyBSRkMyMjUzIGNoYXJhY3RlciBwcm9wZXJ0aWVzCitteSAkUkZDMjI1M19FU0MgPSAxOwkjIENoYXJhY3RlciBlc2NhcGVkIHdpdGggXAorbXkgJEVTQ19DVFJMCT0gMjsJIyBFc2NhcGVkIGNvbnRyb2wgY2hhcmFjdGVyCisjIFRoZXNlIGFyZSB1c2VkIHdpdGggUkZDMTc3OSBxdW90aW5nIHVzaW5nICIKK215ICROT0VTQ19RVU9URQk9IDg7CSMgTm90IGVzY2FwZWQgaWYgcXVvdGVkCitteSAkUFNUUklOR19DSEFSID0gMHgxMDsJIyBWYWxpZCBQcmludGFibGVTdHJpbmcgY2hhcmFjdGVyCitteSAkUkZDMjI1M19GSVJTVF9FU0MgPSAweDIwOyAjIEVzY2FwZWQgd2l0aCBcIGlmIGZpcnN0IGNoYXJhY3RlcgorbXkgJFJGQzIyNTNfTEFTVF9FU0MgPSAweDQwOyAgIyBFc2NhcGVkIHdpdGggXCBpZiBsYXN0IGNoYXJhY3RlcgorCitmb3IoJGkgPSAwOyAkaSA8IDEyODsgJGkrKykgeworCSMgU2V0IHRoZSBSRkMyMjUzIGVzY2FwZSBjaGFyYWN0ZXJzIChjb250cm9sKQorCSRhcnJbJGldID0gMDsKKwlpZigoJGkgPCAzMikgfHwgKCRpID4gMTI2KSkgeworCQkkYXJyWyRpXSB8PSAkRVNDX0NUUkw7CisJfQorCisJIyBTb21lIFByaW50YWJsZVN0cmluZyBjaGFyYWN0ZXJzCisJaWYoCQkgICAoICggJGkgPj0gb3JkKCJhIikpICYmICggJGkgPD0gb3JkKCJ6IikpICkKKwkJCXx8ICggICggJGkgPj0gb3JkKCJBIikpICYmICggJGkgPD0gb3JkKCJaIikpICkKKwkJCXx8ICggICggJGkgPj0gb3JkKCIwIikpICYmICggJGkgPD0gb3JkKCI5IikpICkgICkgeworCQkkYXJyWyRpXSB8PSAkUFNUUklOR19DSEFSOworCX0KK30KKworIyBOb3cgc2V0dXAgdGhlIHJlc3QKKworIyBSZW1haW5pbmcgUkZDMjI1MyBlc2NhcGVkIGNoYXJhY3RlcnMKKworJGFycltvcmQoIiAiKV0gfD0gJE5PRVNDX1FVT1RFIHwgJFJGQzIyNTNfRklSU1RfRVNDIHwgJFJGQzIyNTNfTEFTVF9FU0M7CiskYXJyW29yZCgiIyIpXSB8PSAkTk9FU0NfUVVPVEUgfCAkUkZDMjI1M19GSVJTVF9FU0M7CisKKyRhcnJbb3JkKCIsIildIHw9ICROT0VTQ19RVU9URSB8ICRSRkMyMjUzX0VTQzsKKyRhcnJbb3JkKCIrIildIHw9ICROT0VTQ19RVU9URSB8ICRSRkMyMjUzX0VTQzsKKyRhcnJbb3JkKCJcIiIpXSB8PSAkUkZDMjI1M19FU0M7CiskYXJyW29yZCgiXFwiKV0gfD0gJFJGQzIyNTNfRVNDOworJGFycltvcmQoIjwiKV0gfD0gJE5PRVNDX1FVT1RFIHwgJFJGQzIyNTNfRVNDOworJGFycltvcmQoIj4iKV0gfD0gJE5PRVNDX1FVT1RFIHwgJFJGQzIyNTNfRVNDOworJGFycltvcmQoIjsiKV0gfD0gJE5PRVNDX1FVT1RFIHwgJFJGQzIyNTNfRVNDOworCisjIFJlbWFpbmluZyBQcmludGFibGVTdHJpbmcgY2hhcmFjdGVycworCiskYXJyW29yZCgiICIpXSB8PSAkUFNUUklOR19DSEFSOworJGFycltvcmQoIiciKV0gfD0gJFBTVFJJTkdfQ0hBUjsKKyRhcnJbb3JkKCIoIildIHw9ICRQU1RSSU5HX0NIQVI7CiskYXJyW29yZCgiKSIpXSB8PSAkUFNUUklOR19DSEFSOworJGFycltvcmQoIisiKV0gfD0gJFBTVFJJTkdfQ0hBUjsKKyRhcnJbb3JkKCIsIildIHw9ICRQU1RSSU5HX0NIQVI7CiskYXJyW29yZCgiLSIpXSB8PSAkUFNUUklOR19DSEFSOworJGFycltvcmQoIi4iKV0gfD0gJFBTVFJJTkdfQ0hBUjsKKyRhcnJbb3JkKCIvIildIHw9ICRQU1RSSU5HX0NIQVI7CiskYXJyW29yZCgiOiIpXSB8PSAkUFNUUklOR19DSEFSOworJGFycltvcmQoIj0iKV0gfD0gJFBTVFJJTkdfQ0hBUjsKKyRhcnJbb3JkKCI/IildIHw9ICRQU1RSSU5HX0NIQVI7CisKKyMgTm93IGdlbmVyYXRlIHRoZSBDIGNvZGUKKworcHJpbnQgPDxFT0Y7CisvKiBBdXRvIGdlbmVyYXRlZCB3aXRoIGNoYXJ0eXBlLnBsIHNjcmlwdC4KKyAqIE1hc2sgb2YgdmFyaW91cyBjaGFyYWN0ZXIgcHJvcGVydGllcworICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJfdHlwZVtdID0geworRU9GCisKK2ZvcigkaSA9IDA7ICRpIDwgMTI4OyAkaSsrKSB7CisJcHJpbnQoIlxuIikgaWYoJGkgJiYgKCgkaSAlIDE2KSA9PSAwKSk7CisJcHJpbnRmKCIlMmQiLCAkYXJyWyRpXSk7CisJcHJpbnQoIiwiKSBpZiAoJGkgIT0gMTI3KTsKK30KK3ByaW50KCJcbn07XG5cbiIpOworCmRpZmYgLS1naXQgYS9jcnlwdG8vYXNuMS9mX2VudW0uYyBiL2NyeXB0by9hc24xL2ZfZW51bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MjU4MjQKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYXNuMS9mX2VudW0uYwpAQCAtMCwwICsxLDIwNSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorCisvKiBCYXNlZCBvbiBhX2ludC5jOiBlcXVpdmFsZW50IEVOVU1FUkFURUQgZnVuY3Rpb25zICovCisKK2ludCBpMmFfQVNOMV9FTlVNRVJBVEVEKEJJTyAqYnAsIEFTTjFfRU5VTUVSQVRFRCAqYSkKKwl7CisJaW50IGksbj0wOworCXN0YXRpYyBjb25zdCBjaGFyICpoPSIwMTIzNDU2Nzg5QUJDREVGIjsKKwljaGFyIGJ1ZlsyXTsKKworCWlmIChhID09IE5VTEwpIHJldHVybigwKTsKKworCWlmIChhLT5sZW5ndGggPT0gMCkKKwkJeworCQlpZiAoQklPX3dyaXRlKGJwLCIwMCIsMikgIT0gMikgZ290byBlcnI7CisJCW49MjsKKwkJfQorCWVsc2UKKwkJeworCQlmb3IgKGk9MDsgaTxhLT5sZW5ndGg7IGkrKykKKwkJCXsKKwkJCWlmICgoaSAhPSAwKSAmJiAoaSUzNSA9PSAwKSkKKwkJCQl7CisJCQkJaWYgKEJJT193cml0ZShicCwiXFxcbiIsMikgIT0gMikgZ290byBlcnI7CisJCQkJbis9MjsKKwkJCQl9CisJCQlidWZbMF09aFsoKHVuc2lnbmVkIGNoYXIpYS0+ZGF0YVtpXT4+NCkmMHgwZl07CisJCQlidWZbMV09aFsoKHVuc2lnbmVkIGNoYXIpYS0+ZGF0YVtpXSAgICkmMHgwZl07CisJCQlpZiAoQklPX3dyaXRlKGJwLGJ1ZiwyKSAhPSAyKSBnb3RvIGVycjsKKwkJCW4rPTI7CisJCQl9CisJCX0KKwlyZXR1cm4obik7CitlcnI6CisJcmV0dXJuKC0xKTsKKwl9CisKK2ludCBhMmlfQVNOMV9FTlVNRVJBVEVEKEJJTyAqYnAsIEFTTjFfRU5VTUVSQVRFRCAqYnMsIGNoYXIgKmJ1ZiwgaW50IHNpemUpCisJeworCWludCByZXQ9MDsKKwlpbnQgaSxqLGssbSxuLGFnYWluLGJ1ZnNpemU7CisJdW5zaWduZWQgY2hhciAqcz1OVUxMLCpzcDsKKwl1bnNpZ25lZCBjaGFyICpidWZwOworCWludCBudW09MCxzbGVuPTAsZmlyc3Q9MTsKKworCWJzLT50eXBlPVZfQVNOMV9FTlVNRVJBVEVEOworCisJYnVmc2l6ZT1CSU9fZ2V0cyhicCxidWYsc2l6ZSk7CisJZm9yICg7OykKKwkJeworCQlpZiAoYnVmc2l6ZSA8IDEpIGdvdG8gZXJyX3NsOworCQlpPWJ1ZnNpemU7CisJCWlmIChidWZbaS0xXSA9PSAnXG4nKSBidWZbLS1pXT0nXDAnOworCQlpZiAoaSA9PSAwKSBnb3RvIGVycl9zbDsKKwkJaWYgKGJ1ZltpLTFdID09ICdccicpIGJ1ZlstLWldPSdcMCc7CisJCWlmIChpID09IDApIGdvdG8gZXJyX3NsOworCQlhZ2Fpbj0oYnVmW2ktMV0gPT0gJ1xcJyk7CisKKwkJZm9yIChqPTA7IGo8aTsgaisrKQorCQkJeworCQkJaWYgKCEoCSgoYnVmW2pdID49ICcwJykgJiYgKGJ1ZltqXSA8PSAnOScpKSB8fAorCQkJCSgoYnVmW2pdID49ICdhJykgJiYgKGJ1ZltqXSA8PSAnZicpKSB8fAorCQkJCSgoYnVmW2pdID49ICdBJykgJiYgKGJ1ZltqXSA8PSAnRicpKSkpCisJCQkJeworCQkJCWk9ajsKKwkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCWJ1ZltpXT0nXDAnOworCQkvKiBXZSBoYXZlIG5vdyBjbGVhcmVkIGFsbCB0aGUgY3JhcCBvZmYgdGhlIGVuZCBvZiB0aGUKKwkJICogbGluZSAqLworCQlpZiAoaSA8IDIpIGdvdG8gZXJyX3NsOworCisJCWJ1ZnA9KHVuc2lnbmVkIGNoYXIgKilidWY7CisJCWlmIChmaXJzdCkKKwkJCXsKKwkJCWZpcnN0PTA7CisJCQlpZiAoKGJ1ZnBbMF0gPT0gJzAnKSAmJiAoYnVmWzFdID09ICcwJykpCisJCQkJeworCQkJCWJ1ZnArPTI7CisJCQkJaS09MjsKKwkJCQl9CisJCQl9CisJCWs9MDsKKwkJaS09YWdhaW47CisJCWlmIChpJTIgIT0gMCkKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGEyaV9BU04xX0VOVU1FUkFURUQsIEFTTjFfUl9PRERfTlVNQkVSX09GX0NIQVJTKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlpLz0yOworCQlpZiAobnVtK2kgPiBzbGVuKQorCQkJeworCQkJaWYgKHMgPT0gTlVMTCkKKwkJCQlzcD0odW5zaWduZWQgY2hhciAqKU9QRU5TU0xfbWFsbG9jKAorCQkJCQkodW5zaWduZWQgaW50KW51bStpKjIpOworCQkJZWxzZQorCQkJCXNwPSh1bnNpZ25lZCBjaGFyICopT1BFTlNTTF9yZWFsbG9jKHMsCisJCQkJCSh1bnNpZ25lZCBpbnQpbnVtK2kqMik7CisJCQlpZiAoc3AgPT0gTlVMTCkKKwkJCQl7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYTJpX0FTTjFfRU5VTUVSQVRFRCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCWlmIChzICE9IE5VTEwpIE9QRU5TU0xfZnJlZShzKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQlzPXNwOworCQkJc2xlbj1udW0raSoyOworCQkJfQorCQlmb3IgKGo9MDsgajxpOyBqKyssays9MikKKwkJCXsKKwkJCWZvciAobj0wOyBuPDI7IG4rKykKKwkJCQl7CisJCQkJbT1idWZwW2srbl07CisJCQkJaWYgKChtID49ICcwJykgJiYgKG0gPD0gJzknKSkKKwkJCQkJbS09JzAnOworCQkJCWVsc2UgaWYgKChtID49ICdhJykgJiYgKG0gPD0gJ2YnKSkKKwkJCQkJbT1tLSdhJysxMDsKKwkJCQllbHNlIGlmICgobSA+PSAnQScpICYmIChtIDw9ICdGJykpCisJCQkJCW09bS0nQScrMTA7CisJCQkJZWxzZQorCQkJCQl7CisJCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGEyaV9BU04xX0VOVU1FUkFURUQsIEFTTjFfUl9OT05fSEVYX0NIQVJBQ1RFUlMpOworCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCXNbbnVtK2pdPDw9NDsKKwkJCQlzW251bStqXXw9bTsKKwkJCQl9CisJCQl9CisJCW51bSs9aTsKKwkJaWYgKGFnYWluKQorCQkJYnVmc2l6ZT1CSU9fZ2V0cyhicCxidWYsc2l6ZSk7CisJCWVsc2UKKwkJCWJyZWFrOworCQl9CisJYnMtPmxlbmd0aD1udW07CisJYnMtPmRhdGE9czsKKwlyZXQ9MTsKK2VycjoKKwlpZiAoMCkKKwkJeworZXJyX3NsOgorCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhMmlfQVNOMV9FTlVNRVJBVEVELCBBU04xX1JfU0hPUlRfTElORSk7CisJCX0KKwlyZXR1cm4ocmV0KTsKKwl9CisKZGlmZiAtLWdpdCBhL2NyeXB0by9hc24xL2ZfaW50LmMgYi9jcnlwdG8vYXNuMS9mX2ludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZGRjZjgKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYXNuMS9mX2ludC5jCkBAIC0wLDAgKzEsMjE4IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisKKworaW50IGkyYV9BU04xX0lOVEVHRVIoQklPICpicCwgQVNOMV9JTlRFR0VSICphKQorCXsKKwlpbnQgaSxuPTA7CisJc3RhdGljIGNvbnN0IGNoYXIgKmg9IjAxMjM0NTY3ODlBQkNERUYiOworCWNoYXIgYnVmWzJdOworCisJaWYgKGEgPT0gTlVMTCkgcmV0dXJuKDApOworCisJaWYgKGEtPnR5cGUgJiBWX0FTTjFfTkVHKQorCQl7CisJCWlmIChCSU9fd3JpdGUoYnAsICItIiwgMSkgIT0gMSkgZ290byBlcnI7CisJCW4gPSAxOworCQl9CisKKwlpZiAoYS0+bGVuZ3RoID09IDApCisJCXsKKwkJaWYgKEJJT193cml0ZShicCwiMDAiLDIpICE9IDIpIGdvdG8gZXJyOworCQluICs9IDI7CisJCX0KKwllbHNlCisJCXsKKwkJZm9yIChpPTA7IGk8YS0+bGVuZ3RoOyBpKyspCisJCQl7CisJCQlpZiAoKGkgIT0gMCkgJiYgKGklMzUgPT0gMCkpCisJCQkJeworCQkJCWlmIChCSU9fd3JpdGUoYnAsIlxcXG4iLDIpICE9IDIpIGdvdG8gZXJyOworCQkJCW4rPTI7CisJCQkJfQorCQkJYnVmWzBdPWhbKCh1bnNpZ25lZCBjaGFyKWEtPmRhdGFbaV0+PjQpJjB4MGZdOworCQkJYnVmWzFdPWhbKCh1bnNpZ25lZCBjaGFyKWEtPmRhdGFbaV0gICApJjB4MGZdOworCQkJaWYgKEJJT193cml0ZShicCxidWYsMikgIT0gMikgZ290byBlcnI7CisJCQluKz0yOworCQkJfQorCQl9CisJcmV0dXJuKG4pOworZXJyOgorCXJldHVybigtMSk7CisJfQorCitpbnQgYTJpX0FTTjFfSU5URUdFUihCSU8gKmJwLCBBU04xX0lOVEVHRVIgKmJzLCBjaGFyICpidWYsIGludCBzaXplKQorCXsKKwlpbnQgcmV0PTA7CisJaW50IGksaixrLG0sbixhZ2FpbixidWZzaXplOworCXVuc2lnbmVkIGNoYXIgKnM9TlVMTCwqc3A7CisJdW5zaWduZWQgY2hhciAqYnVmcDsKKwlpbnQgbnVtPTAsc2xlbj0wLGZpcnN0PTE7CisKKwlicy0+dHlwZT1WX0FTTjFfSU5URUdFUjsKKworCWJ1ZnNpemU9QklPX2dldHMoYnAsYnVmLHNpemUpOworCWZvciAoOzspCisJCXsKKwkJaWYgKGJ1ZnNpemUgPCAxKSBnb3RvIGVycl9zbDsKKwkJaT1idWZzaXplOworCQlpZiAoYnVmW2ktMV0gPT0gJ1xuJykgYnVmWy0taV09J1wwJzsKKwkJaWYgKGkgPT0gMCkgZ290byBlcnJfc2w7CisJCWlmIChidWZbaS0xXSA9PSAnXHInKSBidWZbLS1pXT0nXDAnOworCQlpZiAoaSA9PSAwKSBnb3RvIGVycl9zbDsKKwkJYWdhaW49KGJ1ZltpLTFdID09ICdcXCcpOworCisJCWZvciAoaj0wOyBqPGk7IGorKykKKwkJCXsKKyNpZm5kZWYgQ0hBUlNFVF9FQkNESUMKKwkJCWlmICghKAkoKGJ1ZltqXSA+PSAnMCcpICYmIChidWZbal0gPD0gJzknKSkgfHwKKwkJCQkoKGJ1ZltqXSA+PSAnYScpICYmIChidWZbal0gPD0gJ2YnKSkgfHwKKwkJCQkoKGJ1ZltqXSA+PSAnQScpICYmIChidWZbal0gPD0gJ0YnKSkpKQorI2Vsc2UKKwkJCS8qIFRoaXMgI2lmZGVmIGlzIG5vdCBzdHJpY3RseSBuZWNlc3NhcnksIHNpbmNlCisJCQkgKiB0aGUgY2hhcmFjdGVycyBBLi4uRiBhLi4uZiAwLi4uOSBhcmUgY29udGlndW91cworCQkJICogKHllcywgZXZlbiBpbiBFQkNESUMgLSBidXQgbm90IHRoZSB3aG9sZSBhbHBoYWJldCkuCisJCQkgKiBOZXZlcnRoZWxlc3MsIGlzeGRpZ2l0KCkgaXMgZmFzdGVyLgorCQkJICovCisJCQlpZiAoIWlzeGRpZ2l0KGJ1ZltqXSkpCisjZW5kaWYKKwkJCQl7CisJCQkJaT1qOworCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJYnVmW2ldPSdcMCc7CisJCS8qIFdlIGhhdmUgbm93IGNsZWFyZWQgYWxsIHRoZSBjcmFwIG9mZiB0aGUgZW5kIG9mIHRoZQorCQkgKiBsaW5lICovCisJCWlmIChpIDwgMikgZ290byBlcnJfc2w7CisKKwkJYnVmcD0odW5zaWduZWQgY2hhciAqKWJ1ZjsKKwkJaWYgKGZpcnN0KQorCQkJeworCQkJZmlyc3Q9MDsKKwkJCWlmICgoYnVmcFswXSA9PSAnMCcpICYmIChidWZbMV0gPT0gJzAnKSkKKwkJCQl7CisJCQkJYnVmcCs9MjsKKwkJCQlpLT0yOworCQkJCX0KKwkJCX0KKwkJaz0wOworCQlpLT1hZ2FpbjsKKwkJaWYgKGklMiAhPSAwKQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYTJpX0FTTjFfSU5URUdFUiwgQVNOMV9SX09ERF9OVU1CRVJfT0ZfQ0hBUlMpOworCQkJZ290byBlcnI7CisJCQl9CisJCWkvPTI7CisJCWlmIChudW0raSA+IHNsZW4pCisJCQl7CisJCQlpZiAocyA9PSBOVUxMKQorCQkJCXNwPSh1bnNpZ25lZCBjaGFyICopT1BFTlNTTF9tYWxsb2MoCisJCQkJCSh1bnNpZ25lZCBpbnQpbnVtK2kqMik7CisJCQllbHNlCisJCQkJc3A9T1BFTlNTTF9yZWFsbG9jX2NsZWFuKHMsc2xlbixudW0raSoyKTsKKwkJCWlmIChzcCA9PSBOVUxMKQorCQkJCXsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhMmlfQVNOMV9JTlRFR0VSLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQkJaWYgKHMgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKHMpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCXM9c3A7CisJCQlzbGVuPW51bStpKjI7CisJCQl9CisJCWZvciAoaj0wOyBqPGk7IGorKyxrKz0yKQorCQkJeworCQkJZm9yIChuPTA7IG48MjsgbisrKQorCQkJCXsKKwkJCQltPWJ1ZnBbaytuXTsKKwkJCQlpZiAoKG0gPj0gJzAnKSAmJiAobSA8PSAnOScpKQorCQkJCQltLT0nMCc7CisJCQkJZWxzZSBpZiAoKG0gPj0gJ2EnKSAmJiAobSA8PSAnZicpKQorCQkJCQltPW0tJ2EnKzEwOworCQkJCWVsc2UgaWYgKChtID49ICdBJykgJiYgKG0gPD0gJ0YnKSkKKwkJCQkJbT1tLSdBJysxMDsKKwkJCQllbHNlCisJCQkJCXsKKwkJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYTJpX0FTTjFfSU5URUdFUiwgQVNOMV9SX05PTl9IRVhfQ0hBUkFDVEVSUyk7CisJCQkJCWdvdG8gZXJyOworCQkJCQl9CisJCQkJc1tudW0ral08PD00OworCQkJCXNbbnVtK2pdfD1tOworCQkJCX0KKwkJCX0KKwkJbnVtKz1pOworCQlpZiAoYWdhaW4pCisJCQlidWZzaXplPUJJT19nZXRzKGJwLGJ1ZixzaXplKTsKKwkJZWxzZQorCQkJYnJlYWs7CisJCX0KKwlicy0+bGVuZ3RoPW51bTsKKwlicy0+ZGF0YT1zOworCXJldD0xOworZXJyOgorCWlmICgwKQorCQl7CitlcnJfc2w6CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGEyaV9BU04xX0lOVEVHRVIsIEFTTjFfUl9TSE9SVF9MSU5FKTsKKwkJfQorCXJldHVybihyZXQpOworCX0KKwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FzbjEvZl9zdHJpbmcuYyBiL2NyeXB0by9hc24xL2Zfc3RyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVlNTlmZgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9hc24xL2Zfc3RyaW5nLmMKQEAgLTAsMCArMSwyMTIgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKworCisKK2ludCBpMmFfQVNOMV9TVFJJTkcoQklPICpicCwgQVNOMV9TVFJJTkcgKmEsIGludCB0eXBlKQorCXsKKwlpbnQgaSxuPTA7CisJc3RhdGljIGNvbnN0IGNoYXIgKmg9IjAxMjM0NTY3ODlBQkNERUYiOworCWNoYXIgYnVmWzJdOworCisJaWYgKGEgPT0gTlVMTCkgcmV0dXJuKDApOworCisJaWYgKGEtPmxlbmd0aCA9PSAwKQorCQl7CisJCWlmIChCSU9fd3JpdGUoYnAsIjAiLDEpICE9IDEpIGdvdG8gZXJyOworCQluPTE7CisJCX0KKwllbHNlCisJCXsKKwkJZm9yIChpPTA7IGk8YS0+bGVuZ3RoOyBpKyspCisJCQl7CisJCQlpZiAoKGkgIT0gMCkgJiYgKGklMzUgPT0gMCkpCisJCQkJeworCQkJCWlmIChCSU9fd3JpdGUoYnAsIlxcXG4iLDIpICE9IDIpIGdvdG8gZXJyOworCQkJCW4rPTI7CisJCQkJfQorCQkJYnVmWzBdPWhbKCh1bnNpZ25lZCBjaGFyKWEtPmRhdGFbaV0+PjQpJjB4MGZdOworCQkJYnVmWzFdPWhbKCh1bnNpZ25lZCBjaGFyKWEtPmRhdGFbaV0gICApJjB4MGZdOworCQkJaWYgKEJJT193cml0ZShicCxidWYsMikgIT0gMikgZ290byBlcnI7CisJCQluKz0yOworCQkJfQorCQl9CisJcmV0dXJuKG4pOworZXJyOgorCXJldHVybigtMSk7CisJfQorCitpbnQgYTJpX0FTTjFfU1RSSU5HKEJJTyAqYnAsIEFTTjFfU1RSSU5HICpicywgY2hhciAqYnVmLCBpbnQgc2l6ZSkKKwl7CisJaW50IHJldD0wOworCWludCBpLGosayxtLG4sYWdhaW4sYnVmc2l6ZTsKKwl1bnNpZ25lZCBjaGFyICpzPU5VTEwsKnNwOworCXVuc2lnbmVkIGNoYXIgKmJ1ZnA7CisJaW50IG51bT0wLHNsZW49MCxmaXJzdD0xOworCisJYnVmc2l6ZT1CSU9fZ2V0cyhicCxidWYsc2l6ZSk7CisJZm9yICg7OykKKwkJeworCQlpZiAoYnVmc2l6ZSA8IDEpCisJCQl7CisJCQlpZiAoZmlyc3QpCisJCQkJYnJlYWs7CisJCQllbHNlCisJCQkJZ290byBlcnJfc2w7CisJCQl9CisJCWZpcnN0PTA7CisKKwkJaT1idWZzaXplOworCQlpZiAoYnVmW2ktMV0gPT0gJ1xuJykgYnVmWy0taV09J1wwJzsKKwkJaWYgKGkgPT0gMCkgZ290byBlcnJfc2w7CisJCWlmIChidWZbaS0xXSA9PSAnXHInKSBidWZbLS1pXT0nXDAnOworCQlpZiAoaSA9PSAwKSBnb3RvIGVycl9zbDsKKwkJYWdhaW49KGJ1ZltpLTFdID09ICdcXCcpOworCisJCWZvciAoaj1pLTE7IGo+MDsgai0tKQorCQkJeworI2lmbmRlZiBDSEFSU0VUX0VCQ0RJQworCQkJaWYgKCEoCSgoYnVmW2pdID49ICcwJykgJiYgKGJ1ZltqXSA8PSAnOScpKSB8fAorCQkJCSgoYnVmW2pdID49ICdhJykgJiYgKGJ1ZltqXSA8PSAnZicpKSB8fAorCQkJCSgoYnVmW2pdID49ICdBJykgJiYgKGJ1ZltqXSA8PSAnRicpKSkpCisjZWxzZQorCQkJLyogVGhpcyAjaWZkZWYgaXMgbm90IHN0cmljdGx5IG5lY2Vzc2FyeSwgc2luY2UKKwkJCSAqIHRoZSBjaGFyYWN0ZXJzIEEuLi5GIGEuLi5mIDAuLi45IGFyZSBjb250aWd1b3VzCisJCQkgKiAoeWVzLCBldmVuIGluIEVCQ0RJQyAtIGJ1dCBub3QgdGhlIHdob2xlIGFscGhhYmV0KS4KKwkJCSAqIE5ldmVydGhlbGVzcywgaXN4ZGlnaXQoKSBpcyBmYXN0ZXIuCisJCQkgKi8KKwkJCWlmICghaXN4ZGlnaXQoYnVmW2pdKSkKKyNlbmRpZgorCQkJCXsKKwkJCQlpPWo7CisJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQlidWZbaV09J1wwJzsKKwkJLyogV2UgaGF2ZSBub3cgY2xlYXJlZCBhbGwgdGhlIGNyYXAgb2ZmIHRoZSBlbmQgb2YgdGhlCisJCSAqIGxpbmUgKi8KKwkJaWYgKGkgPCAyKSBnb3RvIGVycl9zbDsKKworCQlidWZwPSh1bnNpZ25lZCBjaGFyICopYnVmOworCisJCWs9MDsKKwkJaS09YWdhaW47CisJCWlmIChpJTIgIT0gMCkKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGEyaV9BU04xX1NUUklORywgQVNOMV9SX09ERF9OVU1CRVJfT0ZfQ0hBUlMpOworCQkJZ290byBlcnI7CisJCQl9CisJCWkvPTI7CisJCWlmIChudW0raSA+IHNsZW4pCisJCQl7CisJCQlpZiAocyA9PSBOVUxMKQorCQkJCXNwPSh1bnNpZ25lZCBjaGFyICopT1BFTlNTTF9tYWxsb2MoCisJCQkJCSh1bnNpZ25lZCBpbnQpbnVtK2kqMik7CisJCQllbHNlCisJCQkJc3A9KHVuc2lnbmVkIGNoYXIgKilPUEVOU1NMX3JlYWxsb2MocywKKwkJCQkJKHVuc2lnbmVkIGludCludW0raSoyKTsKKwkJCWlmIChzcCA9PSBOVUxMKQorCQkJCXsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhMmlfQVNOMV9TVFJJTkcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQlpZiAocyAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUocyk7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJcz1zcDsKKwkJCXNsZW49bnVtK2kqMjsKKwkJCX0KKwkJZm9yIChqPTA7IGo8aTsgaisrLGsrPTIpCisJCQl7CisJCQlmb3IgKG49MDsgbjwyOyBuKyspCisJCQkJeworCQkJCW09YnVmcFtrK25dOworCQkJCWlmICgobSA+PSAnMCcpICYmIChtIDw9ICc5JykpCisJCQkJCW0tPScwJzsKKwkJCQllbHNlIGlmICgobSA+PSAnYScpICYmIChtIDw9ICdmJykpCisJCQkJCW09bS0nYScrMTA7CisJCQkJZWxzZSBpZiAoKG0gPj0gJ0EnKSAmJiAobSA8PSAnRicpKQorCQkJCQltPW0tJ0EnKzEwOworCQkJCWVsc2UKKwkJCQkJeworCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhMmlfQVNOMV9TVFJJTkcsIEFTTjFfUl9OT05fSEVYX0NIQVJBQ1RFUlMpOworCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCXNbbnVtK2pdPDw9NDsKKwkJCQlzW251bStqXXw9bTsKKwkJCQl9CisJCQl9CisJCW51bSs9aTsKKwkJaWYgKGFnYWluKQorCQkJYnVmc2l6ZT1CSU9fZ2V0cyhicCxidWYsc2l6ZSk7CisJCWVsc2UKKwkJCWJyZWFrOworCQl9CisJYnMtPmxlbmd0aD1udW07CisJYnMtPmRhdGE9czsKKwlyZXQ9MTsKK2VycjoKKwlpZiAoMCkKKwkJeworZXJyX3NsOgorCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhMmlfQVNOMV9TVFJJTkcsIEFTTjFfUl9TSE9SVF9MSU5FKTsKKwkJfQorCXJldHVybihyZXQpOworCX0KKwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FzbjEvdF9iaXRzdC5jIGIvY3J5cHRvL2FzbjEvdF9iaXRzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMmM1MGIKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYXNuMS90X2JpdHN0LmMKQEAgLTAsMCArMSwxMDAgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisKKworaW50IEFTTjFfQklUX1NUUklOR19uYW1lX3ByaW50KEJJTyAqb3V0LCBBU04xX0JJVF9TVFJJTkcgKmJzLAorCQkJCUJJVF9TVFJJTkdfQklUTkFNRSAqdGJsLCBpbnQgaW5kZW50KQoreworCUJJVF9TVFJJTkdfQklUTkFNRSAqYm5hbTsKKwljaGFyIGZpcnN0ID0gMTsKKwlCSU9fcHJpbnRmKG91dCwgIiUqcyIsIGluZGVudCwgIiIpOworCWZvcihibmFtID0gdGJsOyBibmFtLT5sbmFtZTsgYm5hbSsrKSB7CisJCWlmKEFTTjFfQklUX1NUUklOR19nZXRfYml0KGJzLCBibmFtLT5iaXRudW0pKSB7CisJCQlpZighZmlyc3QpIEJJT19wdXRzKG91dCwgIiwgIik7CisJCQlCSU9fcHV0cyhvdXQsIGJuYW0tPmxuYW1lKTsKKwkJCWZpcnN0ID0gMDsKKwkJfQorCX0KKwlCSU9fcHV0cyhvdXQsICJcbiIpOworCXJldHVybiAxOworfQorCitpbnQgQVNOMV9CSVRfU1RSSU5HX3NldF9hc2MoQVNOMV9CSVRfU1RSSU5HICpicywgY2hhciAqbmFtZSwgaW50IHZhbHVlLAorCQkJCUJJVF9TVFJJTkdfQklUTkFNRSAqdGJsKQoreworCWludCBiaXRudW07CisJYml0bnVtID0gQVNOMV9CSVRfU1RSSU5HX251bV9hc2MobmFtZSwgdGJsKTsKKwlpZihiaXRudW0gPCAwKSByZXR1cm4gMDsKKwlpZihicykgeworCQlpZighQVNOMV9CSVRfU1RSSU5HX3NldF9iaXQoYnMsIGJpdG51bSwgdmFsdWUpKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitpbnQgQVNOMV9CSVRfU1RSSU5HX251bV9hc2MoY2hhciAqbmFtZSwgQklUX1NUUklOR19CSVROQU1FICp0YmwpCit7CisJQklUX1NUUklOR19CSVROQU1FICpibmFtOworCWZvcihibmFtID0gdGJsOyBibmFtLT5sbmFtZTsgYm5hbSsrKSB7CisJCWlmKCFzdHJjbXAoYm5hbS0+c25hbWUsIG5hbWUpIHx8CisJCQkhc3RyY21wKGJuYW0tPmxuYW1lLCBuYW1lKSApIHJldHVybiBibmFtLT5iaXRudW07CisJfQorCXJldHVybiAtMTsKK30KZGlmZiAtLWdpdCBhL2NyeXB0by9hc24xL3RfcGtleS5jIGIvY3J5cHRvL2FzbjEvdF9wa2V5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFjOWIzZAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9hc24xL3RfcGtleS5jCkBAIC0wLDAgKzEsMTEyIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisKKworaW50IEFTTjFfYm5fcHJpbnQoQklPICpicCwgY29uc3QgY2hhciAqbnVtYmVyLCBjb25zdCBCSUdOVU0gKm51bSwKKwkJCXVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IG9mZikKKwl7CisJaW50IG4saTsKKwljb25zdCBjaGFyICpuZWc7CisKKwlpZiAobnVtID09IE5VTEwpIHJldHVybigxKTsKKwluZWcgPSAoQk5faXNfbmVnYXRpdmUobnVtKSk/Ii0iOiIiOworCWlmKCFCSU9faW5kZW50KGJwLG9mZiwxMjgpKQorCQlyZXR1cm4gMDsKKwlpZiAoQk5faXNfemVybyhudW0pKQorCQl7CisJCWlmIChCSU9fcHJpbnRmKGJwLCAiJXMgMFxuIiwgbnVtYmVyKSA8PSAwKQorCQkJcmV0dXJuIDA7CisJCXJldHVybiAxOworCQl9CisKKwlpZiAoQk5fbnVtX2J5dGVzKG51bSkgPD0gc2l6ZW9mKGxvbmcpKQorCQl7CisJCWlmIChCSU9fcHJpbnRmKGJwLCIlcyAlcyVsdSAoJXMweCVseClcbiIsbnVtYmVyLG5lZywKKwkJCSh1bnNpZ25lZCBsb25nKW51bS0+ZFswXSxuZWcsKHVuc2lnbmVkIGxvbmcpbnVtLT5kWzBdKQorCQkJPD0gMCkgcmV0dXJuKDApOworCQl9CisJZWxzZQorCQl7CisJCWJ1ZlswXT0wOworCQlpZiAoQklPX3ByaW50ZihicCwiJXMlcyIsbnVtYmVyLAorCQkJKG5lZ1swXSA9PSAnLScpPyIgKE5lZ2F0aXZlKSI6IiIpIDw9IDApCisJCQlyZXR1cm4oMCk7CisJCW49Qk5fYm4yYmluKG51bSwmYnVmWzFdKTsKKwkKKwkJaWYgKGJ1ZlsxXSAmIDB4ODApCisJCQluKys7CisJCWVsc2UJYnVmKys7CisKKwkJZm9yIChpPTA7IGk8bjsgaSsrKQorCQkJeworCQkJaWYgKChpJTE1KSA9PSAwKQorCQkJCXsKKwkJCQlpZihCSU9fcHV0cyhicCwiXG4iKSA8PSAwCisJCQkJICAgfHwgIUJJT19pbmRlbnQoYnAsb2ZmKzQsMTI4KSkKKwkJCQkgICAgcmV0dXJuIDA7CisJCQkJfQorCQkJaWYgKEJJT19wcmludGYoYnAsIiUwMnglcyIsYnVmW2ldLCgoaSsxKSA9PSBuKT8iIjoiOiIpCisJCQkJPD0gMCkgcmV0dXJuKDApOworCQkJfQorCQlpZiAoQklPX3dyaXRlKGJwLCJcbiIsMSkgPD0gMCkgcmV0dXJuKDApOworCQl9CisJcmV0dXJuKDEpOworCX0KZGlmZiAtLWdpdCBhL2NyeXB0by9hc24xL3Rhc25fZGVjLmMgYi9jcnlwdG8vYXNuMS90YXNuX2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYzhiN2QKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYXNuMS90YXNuX2RlYy5jCkBAIC0wLDAgKzEsMTMwMyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYnVmLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorCisKK3N0YXRpYyBpbnQgYXNuMV9jaGVja19lb2MoY29uc3QgdW5zaWduZWQgY2hhciAqKmluLCBsb25nIGxlbik7CitzdGF0aWMgaW50IGFzbjFfZmluZF9lbmQoY29uc3QgdW5zaWduZWQgY2hhciAqKmluLCBsb25nIGxlbiwgY2hhciBpbmYpOworCitzdGF0aWMgaW50IGFzbjFfY29sbGVjdChCVUZfTUVNICpidWYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbiwgbG9uZyBsZW4sCisJCQljaGFyIGluZiwgaW50IHRhZywgaW50IGFjbGFzcywgaW50IGRlcHRoKTsKKworc3RhdGljIGludCBjb2xsZWN0X2RhdGEoQlVGX01FTSAqYnVmLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqcCwgbG9uZyBwbGVuKTsKKworc3RhdGljIGludCBhc24xX2NoZWNrX3RsZW4obG9uZyAqb2xlbiwgaW50ICpvdGFnLCB1bnNpZ25lZCBjaGFyICpvY2xhc3MsCisJCQkJY2hhciAqaW5mLCBjaGFyICpjc3QsCisJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqKmluLCBsb25nIGxlbiwKKwkJCQlpbnQgZXhwdGFnLCBpbnQgZXhwY2xhc3MsIGNoYXIgb3B0LAorCQkJCUFTTjFfVExDICpjdHgpOworCitzdGF0aWMgaW50IGFzbjFfdGVtcGxhdGVfZXhfZDJpKEFTTjFfVkFMVUUgKipwdmFsLAorCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKippbiwgbG9uZyBsZW4sCisJCQkJY29uc3QgQVNOMV9URU1QTEFURSAqdHQsIGNoYXIgb3B0LAorCQkJCUFTTjFfVExDICpjdHgpOworc3RhdGljIGludCBhc24xX3RlbXBsYXRlX25vZXhwX2QyaShBU04xX1ZBTFVFICoqdmFsLAorCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKippbiwgbG9uZyBsZW4sCisJCQkJY29uc3QgQVNOMV9URU1QTEFURSAqdHQsIGNoYXIgb3B0LAorCQkJCUFTTjFfVExDICpjdHgpOworc3RhdGljIGludCBhc24xX2QyaV9leF9wcmltaXRpdmUoQVNOMV9WQUxVRSAqKnB2YWwsCisJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqKmluLCBsb25nIGxlbiwKKwkJCQljb25zdCBBU04xX0lURU0gKml0LAorCQkJCWludCB0YWcsIGludCBhY2xhc3MsIGNoYXIgb3B0LCBBU04xX1RMQyAqY3R4KTsKKworLyogVGFibGUgdG8gY29udmVydCB0YWdzIHRvIGJpdCB2YWx1ZXMsIHVzZWQgZm9yIE1TVFJJTkcgdHlwZSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgdGFnMmJpdFszMl0gPSB7CiswLAkwLAkwLAlCX0FTTjFfQklUX1NUUklORywJLyogdGFncyAgMCAtICAzICovCitCX0FTTjFfT0NURVRfU1RSSU5HLAkwLAkwLAkJQl9BU04xX1VOS05PV04sLyogdGFncyAgNC0gNyAqLworQl9BU04xX1VOS05PV04sCUJfQVNOMV9VTktOT1dOLAlCX0FTTjFfVU5LTk9XTiwJQl9BU04xX1VOS05PV04sLyogdGFncyAgOC0xMSAqLworQl9BU04xX1VURjhTVFJJTkcsQl9BU04xX1VOS05PV04sQl9BU04xX1VOS05PV04sQl9BU04xX1VOS05PV04sLyogdGFncyAxMi0xNSAqLworQl9BU04xX1NFUVVFTkNFLDAsQl9BU04xX05VTUVSSUNTVFJJTkcsQl9BU04xX1BSSU5UQUJMRVNUUklORywgLyogdGFncyAxNi0xOSAqLworQl9BU04xX1Q2MVNUUklORyxCX0FTTjFfVklERU9URVhTVFJJTkcsQl9BU04xX0lBNVNUUklORywgICAgICAgLyogdGFncyAyMC0yMiAqLworQl9BU04xX1VUQ1RJTUUsIEJfQVNOMV9HRU5FUkFMSVpFRFRJTUUsCQkJICAgICAgIC8qIHRhZ3MgMjMtMjQgKi8JCitCX0FTTjFfR1JBUEhJQ1NUUklORyxCX0FTTjFfSVNPNjRTVFJJTkcsQl9BU04xX0dFTkVSQUxTVFJJTkcsICAvKiB0YWdzIDI1LTI3ICovCitCX0FTTjFfVU5JVkVSU0FMU1RSSU5HLEJfQVNOMV9VTktOT1dOLEJfQVNOMV9CTVBTVFJJTkcsQl9BU04xX1VOS05PV04sIC8qIHRhZ3MgMjgtMzEgKi8KKwl9OworCit1bnNpZ25lZCBsb25nIEFTTjFfdGFnMmJpdChpbnQgdGFnKQorCXsKKwlpZiAoKHRhZyA8IDApIHx8ICh0YWcgPiAzMCkpIHJldHVybiAwOworCXJldHVybiB0YWcyYml0W3RhZ107CisJfQorCisvKiBNYWNybyB0byBpbml0aWFsaXplIGFuZCBpbnZhbGlkYXRlIHRoZSBjYWNoZSAqLworCisjZGVmaW5lIGFzbjFfdGxjX2NsZWFyKGMpCWlmIChjKSAoYyktPnZhbGlkID0gMAorLyogVmVyc2lvbiB0byBhdm9pZCBjb21waWxlciB3YXJuaW5nIGFib3V0ICdjJyBhbHdheXMgbm9uLU5VTEwgKi8KKyNkZWZpbmUgYXNuMV90bGNfY2xlYXJfbmMoYykJKGMpLT52YWxpZCA9IDAKKworLyogRGVjb2RlIGFuIEFTTjEgaXRlbSwgdGhpcyBjdXJyZW50bHkgYmVoYXZlcyBqdXN0IAorICogbGlrZSBhIHN0YW5kYXJkICdkMmknIGZ1bmN0aW9uLiAnaW4nIHBvaW50cyB0byAKKyAqIGEgYnVmZmVyIHRvIHJlYWQgdGhlIGRhdGEgZnJvbSwgaW4gZnV0dXJlIHdlIHdpbGwKKyAqIGhhdmUgbW9yZSBhZHZhbmNlZCB2ZXJzaW9ucyB0aGF0IGNhbiBpbnB1dCBkYXRhCisgKiBhIHBpZWNlIGF0IGEgdGltZSBhbmQgdGhpcyB3aWxsIHNpbXBseSBiZSBhIHNwZWNpYWwKKyAqIGNhc2UuCisgKi8KKworQVNOMV9WQUxVRSAqQVNOMV9pdGVtX2QyaShBU04xX1ZBTFVFICoqcHZhbCwKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqKmluLCBsb25nIGxlbiwgY29uc3QgQVNOMV9JVEVNICppdCkKKwl7CisJQVNOMV9UTEMgYzsKKwlBU04xX1ZBTFVFICpwdG1wdmFsID0gTlVMTDsKKwlpZiAoIXB2YWwpCisJCXB2YWwgPSAmcHRtcHZhbDsKKwlhc24xX3RsY19jbGVhcl9uYygmYyk7CisJaWYgKEFTTjFfaXRlbV9leF9kMmkocHZhbCwgaW4sIGxlbiwgaXQsIC0xLCAwLCAwLCAmYykgPiAwKSAKKwkJcmV0dXJuICpwdmFsOworCXJldHVybiBOVUxMOworCX0KKworaW50IEFTTjFfdGVtcGxhdGVfZDJpKEFTTjFfVkFMVUUgKipwdmFsLAorCQljb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIGxvbmcgbGVuLCBjb25zdCBBU04xX1RFTVBMQVRFICp0dCkKKwl7CisJQVNOMV9UTEMgYzsKKwlhc24xX3RsY19jbGVhcl9uYygmYyk7CisJcmV0dXJuIGFzbjFfdGVtcGxhdGVfZXhfZDJpKHB2YWwsIGluLCBsZW4sIHR0LCAwLCAmYyk7CisJfQorCisKKy8qIERlY29kZSBhbiBpdGVtLCB0YWtpbmcgY2FyZSBvZiBJTVBMSUNJVCB0YWdnaW5nLCBpZiBhbnkuCisgKiBJZiAnb3B0JyBzZXQgYW5kIHRhZyBtaXNtYXRjaCByZXR1cm4gLTEgdG8gaGFuZGxlIE9QVElPTkFMCisgKi8KKworaW50IEFTTjFfaXRlbV9leF9kMmkoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbiwgbG9uZyBsZW4sCisJCQljb25zdCBBU04xX0lURU0gKml0LAorCQkJaW50IHRhZywgaW50IGFjbGFzcywgY2hhciBvcHQsIEFTTjFfVExDICpjdHgpCisJeworCWNvbnN0IEFTTjFfVEVNUExBVEUgKnR0LCAqZXJydHQgPSBOVUxMOworCWNvbnN0IEFTTjFfQ09NUEFUX0ZVTkNTICpjZjsKKwljb25zdCBBU04xX0VYVEVSTl9GVU5DUyAqZWY7CisJY29uc3QgQVNOMV9BVVggKmF1eCA9IGl0LT5mdW5jczsKKwlBU04xX2F1eF9jYiAqYXNuMV9jYjsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwID0gTlVMTCwgKnE7CisJdW5zaWduZWQgY2hhciAqd3A9TlVMTDsJLyogQklHIEZBVCBXQVJOSU5HISAgQlJFQUtTIENPTlNUIFdIRVJFIFVTRUQgKi8KKwl1bnNpZ25lZCBjaGFyIGltcGhhY2sgPSAwLCBvY2xhc3M7CisJY2hhciBzZXFfZW9jLCBzZXFfbm9sZW4sIGNzdCwgaXNvcHQ7CisJbG9uZyB0bXBsZW47CisJaW50IGk7CisJaW50IG90YWc7CisJaW50IHJldCA9IDA7CisJQVNOMV9WQUxVRSAqKnBjaHB0ciwgKnB0bXB2YWw7CisJaWYgKCFwdmFsKQorCQlyZXR1cm4gMDsKKwlpZiAoYXV4ICYmIGF1eC0+YXNuMV9jYikKKwkJYXNuMV9jYiA9IGF1eC0+YXNuMV9jYjsKKwllbHNlIGFzbjFfY2IgPSAwOworCisJc3dpdGNoKGl0LT5pdHlwZSkKKwkJeworCQljYXNlIEFTTjFfSVRZUEVfUFJJTUlUSVZFOgorCQlpZiAoaXQtPnRlbXBsYXRlcykKKwkJCXsKKwkJCS8qIHRhZ2dpbmcgb3IgT1BUSU9OQUwgaXMgY3VycmVudGx5IGlsbGVnYWwgb24gYW4gaXRlbQorCQkJICogdGVtcGxhdGUgYmVjYXVzZSB0aGUgZmxhZ3MgY2FuJ3QgZ2V0IHBhc3NlZCBkb3duLgorCQkJICogSW4gcHJhY3RpY2UgdGhpcyBpc24ndCBhIHByb2JsZW06IHdlIGluY2x1ZGUgdGhlCisJCQkgKiByZWxldmFudCBmbGFncyBmcm9tIHRoZSBpdGVtIHRlbXBsYXRlIGluIHRoZQorCQkJICogdGVtcGxhdGUgaXRzZWxmLgorCQkJICovCisJCQlpZiAoKHRhZyAhPSAtMSkgfHwgb3B0KQorCQkJCXsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2l0ZW1fZXhfZDJpLCAgQVNOMV9SX0lMTEVHQUxfT1BUSU9OU19PTl9JVEVNX1RFTVBMQVRFKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQlyZXR1cm4gYXNuMV90ZW1wbGF0ZV9leF9kMmkocHZhbCwgaW4sIGxlbiwKKwkJCQkJaXQtPnRlbXBsYXRlcywgb3B0LCBjdHgpOworCQl9CisJCXJldHVybiBhc24xX2QyaV9leF9wcmltaXRpdmUocHZhbCwgaW4sIGxlbiwgaXQsCisJCQkJCQl0YWcsIGFjbGFzcywgb3B0LCBjdHgpOworCQlicmVhazsKKworCQljYXNlIEFTTjFfSVRZUEVfTVNUUklORzoKKwkJcCA9ICppbjsKKwkJLyogSnVzdCByZWFkIGluIHRhZyBhbmQgY2xhc3MgKi8KKwkJcmV0ID0gYXNuMV9jaGVja190bGVuKE5VTEwsICZvdGFnLCAmb2NsYXNzLCBOVUxMLCBOVUxMLAorCQkJCQkJJnAsIGxlbiwgLTEsIDAsIDEsIGN0eCk7CisJCWlmICghcmV0KQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9pdGVtX2V4X2QyaSwgIEFTTjFfUl9ORVNURURfQVNOMV9FUlJPUik7CisJCQlnb3RvIGVycjsKKwkJCX0KKworCQkvKiBNdXN0IGJlIFVOSVZFUlNBTCBjbGFzcyAqLworCQlpZiAob2NsYXNzICE9IFZfQVNOMV9VTklWRVJTQUwpCisJCQl7CisJCQkvKiBJZiBPUFRJT05BTCwgYXNzdW1lIHRoaXMgaXMgT0sgKi8KKwkJCWlmIChvcHQpIHJldHVybiAtMTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfaXRlbV9leF9kMmksICBBU04xX1JfTVNUUklOR19OT1RfVU5JVkVSU0FMKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQkvKiBDaGVjayB0YWcgbWF0Y2hlcyBiaXQgbWFwICovCisJCWlmICghKEFTTjFfdGFnMmJpdChvdGFnKSAmIGl0LT51dHlwZSkpCisJCQl7CisJCQkvKiBJZiBPUFRJT05BTCwgYXNzdW1lIHRoaXMgaXMgT0sgKi8KKwkJCWlmIChvcHQpCisJCQkJcmV0dXJuIC0xOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9pdGVtX2V4X2QyaSwgIEFTTjFfUl9NU1RSSU5HX1dST05HX1RBRyk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJcmV0dXJuIGFzbjFfZDJpX2V4X3ByaW1pdGl2ZShwdmFsLCBpbiwgbGVuLAorCQkJCQkJaXQsIG90YWcsIDAsIDAsIGN0eCk7CisKKwkJY2FzZSBBU04xX0lUWVBFX0VYVEVSTjoKKwkJLyogVXNlIG5ldyBzdHlsZSBkMmkgKi8KKwkJZWYgPSBpdC0+ZnVuY3M7CisJCXJldHVybiBlZi0+YXNuMV9leF9kMmkocHZhbCwgaW4sIGxlbiwKKwkJCQkJCWl0LCB0YWcsIGFjbGFzcywgb3B0LCBjdHgpOworCisJCWNhc2UgQVNOMV9JVFlQRV9DT01QQVQ6CisJCS8qIHdlIG11c3QgcmVzb3J0IHRvIG9sZCBzdHlsZSBldmlsIGhhY2tlcnkgKi8KKwkJY2YgPSBpdC0+ZnVuY3M7CisKKwkJLyogSWYgT1BUSU9OQUwgc2VlIGlmIGl0IGlzIHRoZXJlICovCisJCWlmIChvcHQpCisJCQl7CisJCQlpbnQgZXhwdGFnOworCQkJcCA9ICppbjsKKwkJCWlmICh0YWcgPT0gLTEpCisJCQkJZXhwdGFnID0gaXQtPnV0eXBlOworCQkJZWxzZSBleHB0YWcgPSB0YWc7CisJCQkvKiBEb24ndCBjYXJlIGFib3V0IGFueXRoaW5nIG90aGVyIHRoYW4gcHJlc2VuY2UKKwkJCSAqIG9mIGV4cGVjdGVkIHRhZyAqLworCisJCQlyZXQgPSBhc24xX2NoZWNrX3RsZW4oTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJCQkJJnAsIGxlbiwgZXhwdGFnLCBhY2xhc3MsIDEsIGN0eCk7CisJCQlpZiAoIXJldCkKKwkJCQl7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9pdGVtX2V4X2QyaSwgIEFTTjFfUl9ORVNURURfQVNOMV9FUlJPUik7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJaWYgKHJldCA9PSAtMSkKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisKKwkJLyogVGhpcyBpcyB0aGUgb2xkIHN0eWxlIGV2aWwgaGFjayBJTVBMSUNJVCBoYW5kbGluZzoKKwkJICogc2luY2UgdGhlIHVuZGVybHlpbmcgY29kZSBpcyBleHBlY3RpbmcgYSB0YWcgYW5kCisJCSAqIGNsYXNzIG90aGVyIHRoYW4gdGhlIG9uZSBwcmVzZW50IHdlIGNoYW5nZSB0aGUKKwkJICogYnVmZmVyIHRlbXBvcmFyaWx5IHRoZW4gY2hhbmdlIGl0IGJhY2sgYWZ0ZXJ3YXJkcy4KKwkJICogVGhpcyBkb2Vzbid0IGFuZCBuZXZlciBkaWQgd29yayBmb3IgdGFncyA+IDMwLgorCQkgKgorCQkgKiBZZXMgdGhpcyBpcyAqaG9ycmlibGUqIGJ1dCBpdCBpcyBvbmx5IG5lZWRlZCBmb3IKKwkJICogb2xkIHN0eWxlIGQyaSB3aGljaCB3aWxsIGhvcGVmdWxseSBub3QgYmUgYXJvdW5kCisJCSAqIGZvciBtdWNoIGxvbmdlci4KKwkJICogRklYTUU6IHNob3VsZCBjb3B5IHRoZSBidWZmZXIgdGhlbiBtb2RpZnkgaXQgc28KKwkJICogdGhlIGlucHV0IGJ1ZmZlciBjYW4gYmUgY29uc3Q6IHdlIHNob3VsZCAqYWx3YXlzKgorCQkgKiBjb3B5IGJlY2F1c2UgdGhlIG9sZCBzdHlsZSBkMmkgbWlnaHQgbW9kaWZ5IHRoZQorCQkgKiBidWZmZXIuCisJCSAqLworCisJCWlmICh0YWcgIT0gLTEpCisJCQl7CisJCQl3cCA9ICoodW5zaWduZWQgY2hhciAqKilpbjsKKwkJCWltcGhhY2sgPSAqd3A7CisJCQlpZiAocCA9PSBOVUxMKQorCQkJCXsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2l0ZW1fZXhfZDJpLCAgQVNOMV9SX05FU1RFRF9BU04xX0VSUk9SKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQkqd3AgPSAodW5zaWduZWQgY2hhcikoKCpwICYgVl9BU04xX0NPTlNUUlVDVEVEKQorCQkJCQkJCQl8IGl0LT51dHlwZSk7CisJCQl9CisKKwkJcHRtcHZhbCA9IGNmLT5hc24xX2QyaShwdmFsLCBpbiwgbGVuKTsKKworCQlpZiAodGFnICE9IC0xKQorCQkJKndwID0gaW1waGFjazsKKworCQlpZiAocHRtcHZhbCkKKwkJCXJldHVybiAxOworCisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfaXRlbV9leF9kMmksICBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOworCQlnb3RvIGVycjsKKworCisJCWNhc2UgQVNOMV9JVFlQRV9DSE9JQ0U6CisJCWlmIChhc24xX2NiICYmICFhc24xX2NiKEFTTjFfT1BfRDJJX1BSRSwgcHZhbCwgaXQsIE5VTEwpKQorCQkJCWdvdG8gYXV4ZXJyOworCisJCS8qIEFsbG9jYXRlIHN0cnVjdHVyZSAqLworCQlpZiAoISpwdmFsICYmICFBU04xX2l0ZW1fZXhfbmV3KHB2YWwsIGl0KSkKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfaXRlbV9leF9kMmksICBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOworCQkJZ290byBlcnI7CisJCQl9CisJCS8qIENIT0lDRSB0eXBlLCB0cnkgZWFjaCBwb3NzaWJpbGl0eSBpbiB0dXJuICovCisJCXAgPSAqaW47CisJCWZvciAoaSA9IDAsIHR0PWl0LT50ZW1wbGF0ZXM7IGkgPCBpdC0+dGNvdW50OyBpKyssIHR0KyspCisJCQl7CisJCQlwY2hwdHIgPSBhc24xX2dldF9maWVsZF9wdHIocHZhbCwgdHQpOworCQkJLyogV2UgbWFyayBmaWVsZCBhcyBPUFRJT05BTCBzbyBpdHMgYWJzZW5jZQorCQkJICogY2FuIGJlIHJlY29nbmlzZWQuCisJCQkgKi8KKwkJCXJldCA9IGFzbjFfdGVtcGxhdGVfZXhfZDJpKHBjaHB0ciwgJnAsIGxlbiwgdHQsIDEsIGN0eCk7CisJCQkvKiBJZiBmaWVsZCBub3QgcHJlc2VudCwgdHJ5IHRoZSBuZXh0IG9uZSAqLworCQkJaWYgKHJldCA9PSAtMSkKKwkJCQljb250aW51ZTsKKwkJCS8qIElmIHBvc2l0aXZlIHJldHVybiwgcmVhZCBPSywgYnJlYWsgbG9vcCAqLworCQkJaWYgKHJldCA+IDApCisJCQkJYnJlYWs7CisJCQkvKiBPdGhlcndpc2UgbXVzdCBiZSBhbiBBU04xIHBhcnNpbmcgZXJyb3IgKi8KKwkJCWVycnR0ID0gdHQ7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2l0ZW1fZXhfZDJpLCAgQVNOMV9SX05FU1RFRF9BU04xX0VSUk9SKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCisJCS8qIERpZCB3ZSBmYWxsIG9mZiB0aGUgZW5kIHdpdGhvdXQgcmVhZGluZyBhbnl0aGluZz8gKi8KKwkJaWYgKGkgPT0gaXQtPnRjb3VudCkKKwkJCXsKKwkJCS8qIElmIE9QVElPTkFMLCB0aGlzIGlzIE9LICovCisJCQlpZiAob3B0KQorCQkJCXsKKwkJCQkvKiBGcmVlIGFuZCB6ZXJvIGl0ICovCisJCQkJQVNOMV9pdGVtX2V4X2ZyZWUocHZhbCwgaXQpOworCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2l0ZW1fZXhfZDJpLCAgQVNOMV9SX05PX01BVENISU5HX0NIT0lDRV9UWVBFKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCisJCWFzbjFfc2V0X2Nob2ljZV9zZWxlY3RvcihwdmFsLCBpLCBpdCk7CisJCSppbiA9IHA7CisJCWlmIChhc24xX2NiICYmICFhc24xX2NiKEFTTjFfT1BfRDJJX1BPU1QsIHB2YWwsIGl0LCBOVUxMKSkKKwkJCQlnb3RvIGF1eGVycjsKKwkJcmV0dXJuIDE7CisKKwkJY2FzZSBBU04xX0lUWVBFX05ERUZfU0VRVUVOQ0U6CisJCWNhc2UgQVNOMV9JVFlQRV9TRVFVRU5DRToKKwkJcCA9ICppbjsKKwkJdG1wbGVuID0gbGVuOworCisJCS8qIElmIG5vIElNUExJQ0lUIHRhZ2dpbmcgc2V0IHRvIFNFUVVFTkNFLCBVTklWRVJTQUwgKi8KKwkJaWYgKHRhZyA9PSAtMSkKKwkJCXsKKwkJCXRhZyA9IFZfQVNOMV9TRVFVRU5DRTsKKwkJCWFjbGFzcyA9IFZfQVNOMV9VTklWRVJTQUw7CisJCQl9CisJCS8qIEdldCBTRVFVRU5DRSBsZW5ndGggYW5kIHVwZGF0ZSBsZW4sIHAgKi8KKwkJcmV0ID0gYXNuMV9jaGVja190bGVuKCZsZW4sIE5VTEwsIE5VTEwsICZzZXFfZW9jLCAmY3N0LAorCQkJCQkmcCwgbGVuLCB0YWcsIGFjbGFzcywgb3B0LCBjdHgpOworCQlpZiAoIXJldCkKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfaXRlbV9leF9kMmksICBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOworCQkJZ290byBlcnI7CisJCQl9CisJCWVsc2UgaWYgKHJldCA9PSAtMSkKKwkJCXJldHVybiAtMTsKKwkJaWYgKGF1eCAmJiAoYXV4LT5mbGFncyAmIEFTTjFfQUZMR19CUk9LRU4pKQorCQkJeworCQkJbGVuID0gdG1wbGVuIC0gKHAgLSAqaW4pOworCQkJc2VxX25vbGVuID0gMTsKKwkJCX0KKwkJLyogSWYgaW5kZWZpbml0ZSB3ZSBkb24ndCBkbyBhIGxlbmd0aCBjaGVjayAqLworCQllbHNlIHNlcV9ub2xlbiA9IHNlcV9lb2M7CisJCWlmICghY3N0KQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9pdGVtX2V4X2QyaSwgIEFTTjFfUl9TRVFVRU5DRV9OT1RfQ09OU1RSVUNURUQpOworCQkJZ290byBlcnI7CisJCQl9CisKKwkJaWYgKCEqcHZhbCAmJiAhQVNOMV9pdGVtX2V4X25ldyhwdmFsLCBpdCkpCisJCQl7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2l0ZW1fZXhfZDJpLCAgQVNOMV9SX05FU1RFRF9BU04xX0VSUk9SKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCisJCWlmIChhc24xX2NiICYmICFhc24xX2NiKEFTTjFfT1BfRDJJX1BSRSwgcHZhbCwgaXQsIE5VTEwpKQorCQkJCWdvdG8gYXV4ZXJyOworCisJCS8qIEdldCBlYWNoIGZpZWxkIGVudHJ5ICovCisJCWZvciAoaSA9IDAsIHR0ID0gaXQtPnRlbXBsYXRlczsgaSA8IGl0LT50Y291bnQ7IGkrKywgdHQrKykKKwkJCXsKKwkJCWNvbnN0IEFTTjFfVEVNUExBVEUgKnNlcXR0OworCQkJQVNOMV9WQUxVRSAqKnBzZXF2YWw7CisJCQlzZXF0dCA9IGFzbjFfZG9fYWRiKHB2YWwsIHR0LCAxKTsKKwkJCWlmICghc2VxdHQpCisJCQkJZ290byBlcnI7CisJCQlwc2VxdmFsID0gYXNuMV9nZXRfZmllbGRfcHRyKHB2YWwsIHNlcXR0KTsKKwkJCS8qIEhhdmUgd2UgcmFuIG91dCBvZiBkYXRhPyAqLworCQkJaWYgKCFsZW4pCisJCQkJYnJlYWs7CisJCQlxID0gcDsKKwkJCWlmIChhc24xX2NoZWNrX2VvYygmcCwgbGVuKSkKKwkJCQl7CisJCQkJaWYgKCFzZXFfZW9jKQorCQkJCQl7CisJCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfaXRlbV9leF9kMmksICBBU04xX1JfVU5FWFBFQ1RFRF9FT0MpOworCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCWxlbiAtPSBwIC0gcTsKKwkJCQlzZXFfZW9jID0gMDsKKwkJCQlxID0gcDsKKwkJCQlicmVhazsKKwkJCQl9CisJCQkvKiBUaGlzIGRldGVybWluZXMgdGhlIE9QVElPTkFMIGZsYWcgdmFsdWUuIFRoZSBmaWVsZAorCQkJICogY2Fubm90IGJlIG9taXR0ZWQgaWYgaXQgaXMgdGhlIGxhc3Qgb2YgYSBTRVFVRU5DRQorCQkJICogYW5kIHRoZXJlIGlzIHN0aWxsIGRhdGEgdG8gYmUgcmVhZC4gVGhpcyBpc24ndAorCQkJICogc3RyaWN0bHkgbmVjZXNzYXJ5IGJ1dCBpdCBpbmNyZWFzZXMgZWZmaWNpZW5jeSBpbgorCQkJICogc29tZSBjYXNlcy4KKwkJCSAqLworCQkJaWYgKGkgPT0gKGl0LT50Y291bnQgLSAxKSkKKwkJCQlpc29wdCA9IDA7CisJCQllbHNlIGlzb3B0ID0gKGNoYXIpKHNlcXR0LT5mbGFncyAmIEFTTjFfVEZMR19PUFRJT05BTCk7CisJCQkvKiBhdHRlbXB0IHRvIHJlYWQgaW4gZmllbGQsIGFsbG93aW5nIGVhY2ggdG8gYmUKKwkJCSAqIE9QVElPTkFMICovCisKKwkJCXJldCA9IGFzbjFfdGVtcGxhdGVfZXhfZDJpKHBzZXF2YWwsICZwLCBsZW4sCisJCQkJCQkJc2VxdHQsIGlzb3B0LCBjdHgpOworCQkJaWYgKCFyZXQpCisJCQkJeworCQkJCWVycnR0ID0gc2VxdHQ7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJZWxzZSBpZiAocmV0ID09IC0xKQorCQkJCXsKKwkJCQkvKiBPUFRJT05BTCBjb21wb25lbnQgYWJzZW50LgorCQkJCSAqIEZyZWUgYW5kIHplcm8gdGhlIGZpZWxkLgorCQkJCSAqLworCQkJCUFTTjFfdGVtcGxhdGVfZnJlZShwc2VxdmFsLCBzZXF0dCk7CisJCQkJY29udGludWU7CisJCQkJfQorCQkJLyogVXBkYXRlIGxlbmd0aCAqLworCQkJbGVuIC09IHAgLSBxOworCQkJfQorCisJCS8qIENoZWNrIGZvciBFT0MgaWYgZXhwZWN0aW5nIG9uZSAqLworCQlpZiAoc2VxX2VvYyAmJiAhYXNuMV9jaGVja19lb2MoJnAsIGxlbikpCisJCQl7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2l0ZW1fZXhfZDJpLCAgQVNOMV9SX01JU1NJTkdfRU9DKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQkvKiBDaGVjayBhbGwgZGF0YSByZWFkICovCisJCWlmICghc2VxX25vbGVuICYmIGxlbikKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfaXRlbV9leF9kMmksICBBU04xX1JfU0VRVUVOQ0VfTEVOR1RIX01JU01BVENIKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCisJCS8qIElmIHdlIGdldCBoZXJlIHdlJ3ZlIGdvdCBubyBtb3JlIGRhdGEgaW4gdGhlIFNFUVVFTkNFLAorCQkgKiBob3dldmVyIHdlIG1heSBub3QgaGF2ZSByZWFkIGFsbCBmaWVsZHMgc28gY2hlY2sgYWxsCisJCSAqIHJlbWFpbmluZyBhcmUgT1BUSU9OQUwgYW5kIGNsZWFyIGFueSB0aGF0IGFyZS4KKwkJICovCisJCWZvciAoOyBpIDwgaXQtPnRjb3VudDsgdHQrKywgaSsrKQorCQkJeworCQkJY29uc3QgQVNOMV9URU1QTEFURSAqc2VxdHQ7CisJCQlzZXF0dCA9IGFzbjFfZG9fYWRiKHB2YWwsIHR0LCAxKTsKKwkJCWlmICghc2VxdHQpCisJCQkJZ290byBlcnI7CisJCQlpZiAoc2VxdHQtPmZsYWdzICYgQVNOMV9URkxHX09QVElPTkFMKQorCQkJCXsKKwkJCQlBU04xX1ZBTFVFICoqcHNlcXZhbDsKKwkJCQlwc2VxdmFsID0gYXNuMV9nZXRfZmllbGRfcHRyKHB2YWwsIHNlcXR0KTsKKwkJCQlBU04xX3RlbXBsYXRlX2ZyZWUocHNlcXZhbCwgc2VxdHQpOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJZXJydHQgPSBzZXF0dDsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2l0ZW1fZXhfZDJpLCAgQVNOMV9SX0ZJRUxEX01JU1NJTkcpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCX0KKwkJLyogU2F2ZSBlbmNvZGluZyAqLworCQlpZiAoIWFzbjFfZW5jX3NhdmUocHZhbCwgKmluLCBwIC0gKmluLCBpdCkpCisJCQlnb3RvIGF1eGVycjsKKwkJKmluID0gcDsKKwkJaWYgKGFzbjFfY2IgJiYgIWFzbjFfY2IoQVNOMV9PUF9EMklfUE9TVCwgcHZhbCwgaXQsIE5VTEwpKQorCQkJCWdvdG8gYXV4ZXJyOworCQlyZXR1cm4gMTsKKworCQlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwkJfQorCWF1eGVycjoKKwlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2l0ZW1fZXhfZDJpLCAgQVNOMV9SX0FVWF9FUlJPUik7CisJZXJyOgorCUFTTjFfaXRlbV9leF9mcmVlKHB2YWwsIGl0KTsKKwlpZiAoZXJydHQpCisJCUVSUl9hZGRfZXJyb3JfZGF0YSg0LCAiRmllbGQ9IiwgZXJydHQtPmZpZWxkX25hbWUsCisJCQkJCSIsIFR5cGU9IiwgaXQtPnNuYW1lKTsKKwllbHNlCisJCUVSUl9hZGRfZXJyb3JfZGF0YSgyLCAiVHlwZT0iLCBpdC0+c25hbWUpOworCXJldHVybiAwOworCX0KKworLyogVGVtcGxhdGVzIGFyZSBoYW5kbGVkIHdpdGggdHdvIHNlcGFyYXRlIGZ1bmN0aW9ucy4KKyAqIE9uZSBoYW5kbGVzIGFueSBFWFBMSUNJVCB0YWcgYW5kIHRoZSBvdGhlciBoYW5kbGVzIHRoZSByZXN0LgorICovCisKK3N0YXRpYyBpbnQgYXNuMV90ZW1wbGF0ZV9leF9kMmkoQVNOMV9WQUxVRSAqKnZhbCwKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIGxvbmcgaW5sZW4sCisJCQkJY29uc3QgQVNOMV9URU1QTEFURSAqdHQsIGNoYXIgb3B0LAorCQkJCQkJCUFTTjFfVExDICpjdHgpCisJeworCWludCBmbGFncywgYWNsYXNzOworCWludCByZXQ7CisJbG9uZyBsZW47CisJY29uc3QgdW5zaWduZWQgY2hhciAqcCwgKnE7CisJY2hhciBleHBfZW9jOworCWlmICghdmFsKQorCQlyZXR1cm4gMDsKKwlmbGFncyA9IHR0LT5mbGFnczsKKwlhY2xhc3MgPSBmbGFncyAmIEFTTjFfVEZMR19UQUdfQ0xBU1M7CisKKwlwID0gKmluOworCisJLyogQ2hlY2sgaWYgRVhQTElDSVQgdGFnIGV4cGVjdGVkICovCisJaWYgKGZsYWdzICYgQVNOMV9URkxHX0VYUFRBRykKKwkJeworCQljaGFyIGNzdDsKKwkJLyogTmVlZCB0byB3b3JrIG91dCBhbW91bnQgb2YgZGF0YSBhdmFpbGFibGUgdG8gdGhlIGlubmVyCisJCSAqIGNvbnRlbnQgYW5kIHdoZXJlIGl0IHN0YXJ0czogc28gcmVhZCBpbiBFWFBMSUNJVCBoZWFkZXIgdG8KKwkJICogZ2V0IHRoZSBpbmZvLgorCQkgKi8KKwkJcmV0ID0gYXNuMV9jaGVja190bGVuKCZsZW4sIE5VTEwsIE5VTEwsICZleHBfZW9jLCAmY3N0LAorCQkJCQkmcCwgaW5sZW4sIHR0LT50YWcsIGFjbGFzcywgb3B0LCBjdHgpOworCQlxID0gcDsKKwkJaWYgKCFyZXQpCisJCQl7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX3RlbXBsYXRlX2V4X2QyaSwgIEFTTjFfUl9ORVNURURfQVNOMV9FUlJPUik7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJZWxzZSBpZiAocmV0ID09IC0xKQorCQkJcmV0dXJuIC0xOworCQlpZiAoIWNzdCkKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfdGVtcGxhdGVfZXhfZDJpLCAgQVNOMV9SX0VYUExJQ0lUX1RBR19OT1RfQ09OU1RSVUNURUQpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCS8qIFdlJ3ZlIGZvdW5kIHRoZSBmaWVsZCBzbyBpdCBjYW4ndCBiZSBPUFRJT05BTCBub3cgKi8KKwkJcmV0ID0gYXNuMV90ZW1wbGF0ZV9ub2V4cF9kMmkodmFsLCAmcCwgbGVuLCB0dCwgMCwgY3R4KTsKKwkJaWYgKCFyZXQpCisJCQl7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX3RlbXBsYXRlX2V4X2QyaSwgIEFTTjFfUl9ORVNURURfQVNOMV9FUlJPUik7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJLyogV2UgcmVhZCB0aGUgZmllbGQgaW4gT0sgc28gdXBkYXRlIGxlbmd0aCAqLworCQlsZW4gLT0gcCAtIHE7CisJCWlmIChleHBfZW9jKQorCQkJeworCQkJLyogSWYgTkRFRiB3ZSBtdXN0IGhhdmUgYW4gRU9DIGhlcmUgKi8KKwkJCWlmICghYXNuMV9jaGVja19lb2MoJnAsIGxlbikpCisJCQkJeworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfdGVtcGxhdGVfZXhfZDJpLCAgQVNOMV9SX01JU1NJTkdfRU9DKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCS8qIE90aGVyd2lzZSB3ZSBtdXN0IGhpdCB0aGUgRVhQTElDSVQgdGFnIGVuZCBvciBpdHMKKwkJCSAqIGFuIGVycm9yICovCisJCQlpZiAobGVuKQorCQkJCXsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX3RlbXBsYXRlX2V4X2QyaSwgIEFTTjFfUl9FWFBMSUNJVF9MRU5HVEhfTUlTTUFUQ0gpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlIAorCQkJcmV0dXJuIGFzbjFfdGVtcGxhdGVfbm9leHBfZDJpKHZhbCwgaW4sIGlubGVuLAorCQkJCQkJCQl0dCwgb3B0LCBjdHgpOworCisJKmluID0gcDsKKwlyZXR1cm4gMTsKKworCWVycjoKKwlBU04xX3RlbXBsYXRlX2ZyZWUodmFsLCB0dCk7CisJcmV0dXJuIDA7CisJfQorCitzdGF0aWMgaW50IGFzbjFfdGVtcGxhdGVfbm9leHBfZDJpKEFTTjFfVkFMVUUgKip2YWwsCisJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqKmluLCBsb25nIGxlbiwKKwkJCQljb25zdCBBU04xX1RFTVBMQVRFICp0dCwgY2hhciBvcHQsCisJCQkJQVNOMV9UTEMgKmN0eCkKKwl7CisJaW50IGZsYWdzLCBhY2xhc3M7CisJaW50IHJldDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwLCAqcTsKKwlpZiAoIXZhbCkKKwkJcmV0dXJuIDA7CisJZmxhZ3MgPSB0dC0+ZmxhZ3M7CisJYWNsYXNzID0gZmxhZ3MgJiBBU04xX1RGTEdfVEFHX0NMQVNTOworCisJcCA9ICppbjsKKwlxID0gcDsKKworCWlmIChmbGFncyAmIEFTTjFfVEZMR19TS19NQVNLKQorCQl7CisJCS8qIFNFVCBPRiwgU0VRVUVOQ0UgT0YgKi8KKwkJaW50IHNrdGFnLCBza2FjbGFzczsKKwkJY2hhciBza19lb2M7CisJCS8qIEZpcnN0IHdvcmsgb3V0IGV4cGVjdGVkIGlubmVyIHRhZyB2YWx1ZSAqLworCQlpZiAoZmxhZ3MgJiBBU04xX1RGTEdfSU1QVEFHKQorCQkJeworCQkJc2t0YWcgPSB0dC0+dGFnOworCQkJc2thY2xhc3MgPSBhY2xhc3M7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCXNrYWNsYXNzID0gVl9BU04xX1VOSVZFUlNBTDsKKwkJCWlmIChmbGFncyAmIEFTTjFfVEZMR19TRVRfT0YpCisJCQkJc2t0YWcgPSBWX0FTTjFfU0VUOworCQkJZWxzZQorCQkJCXNrdGFnID0gVl9BU04xX1NFUVVFTkNFOworCQkJfQorCQkvKiBHZXQgdGhlIHRhZyAqLworCQlyZXQgPSBhc24xX2NoZWNrX3RsZW4oJmxlbiwgTlVMTCwgTlVMTCwgJnNrX2VvYywgTlVMTCwKKwkJCQkJJnAsIGxlbiwgc2t0YWcsIHNrYWNsYXNzLCBvcHQsIGN0eCk7CisJCWlmICghcmV0KQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV90ZW1wbGF0ZV9ub2V4cF9kMmksICBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCWVsc2UgaWYgKHJldCA9PSAtMSkKKwkJCXJldHVybiAtMTsKKwkJaWYgKCEqdmFsKQorCQkJKnZhbCA9IChBU04xX1ZBTFVFICopc2tfbmV3X251bGwoKTsKKwkJZWxzZQorCQkJeworCQkJLyogV2UndmUgZ290IGEgdmFsaWQgU1RBQ0s6IGZyZWUgdXAgYW55IGl0ZW1zIHByZXNlbnQgKi8KKwkJCVNUQUNLX09GKEFTTjFfVkFMVUUpICpza3RtcAorCQkJICAgID0gKFNUQUNLX09GKEFTTjFfVkFMVUUpICopKnZhbDsKKwkJCUFTTjFfVkFMVUUgKnZ0bXA7CisJCQl3aGlsZShza19BU04xX1ZBTFVFX251bShza3RtcCkgPiAwKQorCQkJCXsKKwkJCQl2dG1wID0gc2tfQVNOMV9WQUxVRV9wb3Aoc2t0bXApOworCQkJCUFTTjFfaXRlbV9leF9mcmVlKCZ2dG1wLAorCQkJCQkJQVNOMV9JVEVNX3B0cih0dC0+aXRlbSkpOworCQkJCX0KKwkJCX0KKwkJCQkKKwkJaWYgKCEqdmFsKQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV90ZW1wbGF0ZV9ub2V4cF9kMmksICBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlnb3RvIGVycjsKKwkJCX0KKworCQkvKiBSZWFkIGFzIG1hbnkgaXRlbXMgYXMgd2UgY2FuICovCisJCXdoaWxlKGxlbiA+IDApCisJCQl7CisJCQlBU04xX1ZBTFVFICpza2ZpZWxkOworCQkJcSA9IHA7CisJCQkvKiBTZWUgaWYgRU9DIGZvdW5kICovCisJCQlpZiAoYXNuMV9jaGVja19lb2MoJnAsIGxlbikpCisJCQkJeworCQkJCWlmICghc2tfZW9jKQorCQkJCQl7CisJCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfdGVtcGxhdGVfbm9leHBfZDJpLCAgQVNOMV9SX1VORVhQRUNURURfRU9DKTsKKwkJCQkJZ290byBlcnI7CisJCQkJCX0KKwkJCQlsZW4gLT0gcCAtIHE7CisJCQkJc2tfZW9jID0gMDsKKwkJCQlicmVhazsKKwkJCQl9CisJCQlza2ZpZWxkID0gTlVMTDsKKwkJCWlmICghQVNOMV9pdGVtX2V4X2QyaSgmc2tmaWVsZCwgJnAsIGxlbiwKKwkJCQkJCUFTTjFfSVRFTV9wdHIodHQtPml0ZW0pLAorCQkJCQkJLTEsIDAsIDAsIGN0eCkpCisJCQkJeworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfdGVtcGxhdGVfbm9leHBfZDJpLCAgQVNOMV9SX05FU1RFRF9BU04xX0VSUk9SKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQlsZW4gLT0gcCAtIHE7CisJCQlpZiAoIXNrX0FTTjFfVkFMVUVfcHVzaCgoU1RBQ0tfT0YoQVNOMV9WQUxVRSkgKikqdmFsLAorCQkJCQkJc2tmaWVsZCkpCisJCQkJeworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfdGVtcGxhdGVfbm9leHBfZDJpLCAgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCX0KKwkJaWYgKHNrX2VvYykKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfdGVtcGxhdGVfbm9leHBfZDJpLCAgQVNOMV9SX01JU1NJTkdfRU9DKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQl9CisJZWxzZSBpZiAoZmxhZ3MgJiBBU04xX1RGTEdfSU1QVEFHKQorCQl7CisJCS8qIElNUExJQ0lUIHRhZ2dpbmcgKi8KKwkJcmV0ID0gQVNOMV9pdGVtX2V4X2QyaSh2YWwsICZwLCBsZW4sCisJCQlBU04xX0lURU1fcHRyKHR0LT5pdGVtKSwgdHQtPnRhZywgYWNsYXNzLCBvcHQsIGN0eCk7CisJCWlmICghcmV0KQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV90ZW1wbGF0ZV9ub2V4cF9kMmksICBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOworCQkJZ290byBlcnI7CisJCQl9CisJCWVsc2UgaWYgKHJldCA9PSAtMSkKKwkJCXJldHVybiAtMTsKKwkJfQorCWVsc2UKKwkJeworCQkvKiBOb3RoaW5nIHNwZWNpYWwgKi8KKwkJcmV0ID0gQVNOMV9pdGVtX2V4X2QyaSh2YWwsICZwLCBsZW4sIEFTTjFfSVRFTV9wdHIodHQtPml0ZW0pLAorCQkJCQkJCS0xLCAwLCBvcHQsIGN0eCk7CisJCWlmICghcmV0KQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV90ZW1wbGF0ZV9ub2V4cF9kMmksICBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOworCQkJZ290byBlcnI7CisJCQl9CisJCWVsc2UgaWYgKHJldCA9PSAtMSkKKwkJCXJldHVybiAtMTsKKwkJfQorCisJKmluID0gcDsKKwlyZXR1cm4gMTsKKworCWVycjoKKwlBU04xX3RlbXBsYXRlX2ZyZWUodmFsLCB0dCk7CisJcmV0dXJuIDA7CisJfQorCitzdGF0aWMgaW50IGFzbjFfZDJpX2V4X3ByaW1pdGl2ZShBU04xX1ZBTFVFICoqcHZhbCwKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIGxvbmcgaW5sZW4sIAorCQkJCWNvbnN0IEFTTjFfSVRFTSAqaXQsCisJCQkJaW50IHRhZywgaW50IGFjbGFzcywgY2hhciBvcHQsIEFTTjFfVExDICpjdHgpCisJeworCWludCByZXQgPSAwLCB1dHlwZTsKKwlsb25nIHBsZW47CisJY2hhciBjc3QsIGluZiwgZnJlZV9jb250ID0gMDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwOworCUJVRl9NRU0gYnVmOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvbnQgPSBOVUxMOworCWxvbmcgbGVuOyAKKwlpZiAoIXB2YWwpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9kMmlfZXhfcHJpbWl0aXZlLCAgQVNOMV9SX0lMTEVHQUxfTlVMTCk7CisJCXJldHVybiAwOyAvKiBTaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCX0KKworCWlmIChpdC0+aXR5cGUgPT0gQVNOMV9JVFlQRV9NU1RSSU5HKQorCQl7CisJCXV0eXBlID0gdGFnOworCQl0YWcgPSAtMTsKKwkJfQorCWVsc2UKKwkJdXR5cGUgPSBpdC0+dXR5cGU7CisKKwlpZiAodXR5cGUgPT0gVl9BU04xX0FOWSkKKwkJeworCQkvKiBJZiB0eXBlIGlzIEFOWSBuZWVkIHRvIGZpZ3VyZSBvdXQgdHlwZSBmcm9tIHRhZyAqLworCQl1bnNpZ25lZCBjaGFyIG9jbGFzczsKKwkJaWYgKHRhZyA+PSAwKQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9kMmlfZXhfcHJpbWl0aXZlLCAgQVNOMV9SX0lMTEVHQUxfVEFHR0VEX0FOWSk7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJaWYgKG9wdCkKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfZDJpX2V4X3ByaW1pdGl2ZSwgIEFTTjFfUl9JTExFR0FMX09QVElPTkFMX0FOWSk7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJcCA9ICppbjsKKwkJcmV0ID0gYXNuMV9jaGVja190bGVuKE5VTEwsICZ1dHlwZSwgJm9jbGFzcywgTlVMTCwgTlVMTCwKKwkJCQkJJnAsIGlubGVuLCAtMSwgMCwgMCwgY3R4KTsKKwkJaWYgKCFyZXQpCisJCQl7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2QyaV9leF9wcmltaXRpdmUsICBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCWlmIChvY2xhc3MgIT0gVl9BU04xX1VOSVZFUlNBTCkKKwkJCXV0eXBlID0gVl9BU04xX09USEVSOworCQl9CisJaWYgKHRhZyA9PSAtMSkKKwkJeworCQl0YWcgPSB1dHlwZTsKKwkJYWNsYXNzID0gVl9BU04xX1VOSVZFUlNBTDsKKwkJfQorCXAgPSAqaW47CisJLyogQ2hlY2sgaGVhZGVyICovCisJcmV0ID0gYXNuMV9jaGVja190bGVuKCZwbGVuLCBOVUxMLCBOVUxMLCAmaW5mLCAmY3N0LAorCQkJCSZwLCBpbmxlbiwgdGFnLCBhY2xhc3MsIG9wdCwgY3R4KTsKKwlpZiAoIXJldCkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2QyaV9leF9wcmltaXRpdmUsICBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOworCQlyZXR1cm4gMDsKKwkJfQorCWVsc2UgaWYgKHJldCA9PSAtMSkKKwkJcmV0dXJuIC0xOworICAgICAgICByZXQgPSAwOworCS8qIFNFUVVFTkNFLCBTRVQgYW5kICJPVEhFUiIgYXJlIGxlZnQgaW4gZW5jb2RlZCBmb3JtICovCisJaWYgKCh1dHlwZSA9PSBWX0FTTjFfU0VRVUVOQ0UpCisJCXx8ICh1dHlwZSA9PSBWX0FTTjFfU0VUKSB8fCAodXR5cGUgPT0gVl9BU04xX09USEVSKSkKKwkJeworCQkvKiBDbGVhciBjb250ZXh0IGNhY2hlIGZvciB0eXBlIE9USEVSIGJlY2F1c2UgdGhlIGF1dG8gY2xlYXIKKwkJICogd2hlbiB3ZSBoYXZlIGEgZXhhY3QgbWF0Y2ggd29udCB3b3JrCisJCSAqLworCQlpZiAodXR5cGUgPT0gVl9BU04xX09USEVSKQorCQkJeworCQkJYXNuMV90bGNfY2xlYXIoY3R4KTsKKwkJCX0KKwkJLyogU0VRVUVOQ0UgYW5kIFNFVCBtdXN0IGJlIGNvbnN0cnVjdGVkICovCisJCWVsc2UgaWYgKCFjc3QpCisJCQl7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2QyaV9leF9wcmltaXRpdmUsICBBU04xX1JfVFlQRV9OT1RfQ09OU1RSVUNURUQpOworCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJY29udCA9ICppbjsKKwkJLyogSWYgaW5kZWZpbml0ZSBsZW5ndGggY29uc3RydWN0ZWQgZmluZCB0aGUgcmVhbCBlbmQgKi8KKwkJaWYgKGluZikKKwkJCXsKKwkJCWlmICghYXNuMV9maW5kX2VuZCgmcCwgcGxlbiwgaW5mKSkKKwkJCQkgZ290byBlcnI7CisJCQlsZW4gPSBwIC0gY29udDsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJbGVuID0gcCAtIGNvbnQgKyBwbGVuOworCQkJcCArPSBwbGVuOworCQkJYnVmLmRhdGEgPSBOVUxMOworCQkJfQorCQl9CisJZWxzZSBpZiAoY3N0KQorCQl7CisJCWJ1Zi5sZW5ndGggPSAwOworCQlidWYubWF4ID0gMDsKKwkJYnVmLmRhdGEgPSBOVUxMOworCQkvKiBTaG91bGQgcmVhbGx5IGNoZWNrIHRoZSBpbnRlcm5hbCB0YWdzIGFyZSBjb3JyZWN0IGJ1dAorCQkgKiBzb21lIHRoaW5ncyBtYXkgZ2V0IHRoaXMgd3JvbmcuIFRoZSByZWxldmFudCBzcGVjcworCQkgKiBzYXkgdGhhdCBjb25zdHJ1Y3RlZCBzdHJpbmcgdHlwZXMgc2hvdWxkIGJlIE9DVEVUIFNUUklOR3MKKwkJICogaW50ZXJuYWxseSBpcnJlc3BlY3RpdmUgb2YgdGhlIHR5cGUuIFNvIGluc3RlYWQganVzdCBjaGVjaworCQkgKiBmb3IgVU5JVkVSU0FMIGNsYXNzIGFuZCBpZ25vcmUgdGhlIHRhZy4KKwkJICovCisJCWlmICghYXNuMV9jb2xsZWN0KCZidWYsICZwLCBwbGVuLCBpbmYsIC0xLCBWX0FTTjFfVU5JVkVSU0FMLCAwKSkKKwkJCXsKKwkJCWZyZWVfY29udCA9IDE7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJbGVuID0gYnVmLmxlbmd0aDsKKwkJLyogQXBwZW5kIGEgZmluYWwgbnVsbCB0byBzdHJpbmcgKi8KKwkJaWYgKCFCVUZfTUVNX2dyb3dfY2xlYW4oJmJ1ZiwgbGVuICsgMSkpCisJCQl7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2QyaV9leF9wcmltaXRpdmUsICBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJYnVmLmRhdGFbbGVuXSA9IDA7CisJCWNvbnQgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKWJ1Zi5kYXRhOworCQlmcmVlX2NvbnQgPSAxOworCQl9CisJZWxzZQorCQl7CisJCWNvbnQgPSBwOworCQlsZW4gPSBwbGVuOworCQlwICs9IHBsZW47CisJCX0KKworCS8qIFdlIG5vdyBoYXZlIGNvbnRlbnQgbGVuZ3RoIGFuZCB0eXBlOiB0cmFuc2xhdGUgaW50byBhIHN0cnVjdHVyZSAqLworCWlmICghYXNuMV9leF9jMmkocHZhbCwgY29udCwgbGVuLCB1dHlwZSwgJmZyZWVfY29udCwgaXQpKQorCQlnb3RvIGVycjsKKworCSppbiA9IHA7CisJcmV0ID0gMTsKKwllcnI6CisJaWYgKGZyZWVfY29udCAmJiBidWYuZGF0YSkgT1BFTlNTTF9mcmVlKGJ1Zi5kYXRhKTsKKwlyZXR1cm4gcmV0OworCX0KKworLyogVHJhbnNsYXRlIEFTTjEgY29udGVudCBvY3RldHMgaW50byBhIHN0cnVjdHVyZSAqLworCitpbnQgYXNuMV9leF9jMmkoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvbnQsIGludCBsZW4sCisJCQlpbnQgdXR5cGUsIGNoYXIgKmZyZWVfY29udCwgY29uc3QgQVNOMV9JVEVNICppdCkKKwl7CisJQVNOMV9WQUxVRSAqKm9wdmFsID0gTlVMTDsKKwlBU04xX1NUUklORyAqc3RtcDsKKwlBU04xX1RZUEUgKnR5cCA9IE5VTEw7CisJaW50IHJldCA9IDA7CisJY29uc3QgQVNOMV9QUklNSVRJVkVfRlVOQ1MgKnBmOworCUFTTjFfSU5URUdFUiAqKnRpbnQ7CisJcGYgPSBpdC0+ZnVuY3M7CisKKwlpZiAocGYgJiYgcGYtPnByaW1fYzJpKQorCQlyZXR1cm4gcGYtPnByaW1fYzJpKHB2YWwsIGNvbnQsIGxlbiwgdXR5cGUsIGZyZWVfY29udCwgaXQpOworCS8qIElmIEFOWSB0eXBlIGNsZWFyIHR5cGUgYW5kIHNldCBwb2ludGVyIHRvIGludGVybmFsIHZhbHVlICovCisJaWYgKGl0LT51dHlwZSA9PSBWX0FTTjFfQU5ZKQorCQl7CisJCWlmICghKnB2YWwpCisJCQl7CisJCQl0eXAgPSBBU04xX1RZUEVfbmV3KCk7CisJCQlpZiAodHlwID09IE5VTEwpCisJCQkJZ290byBlcnI7CisJCQkqcHZhbCA9IChBU04xX1ZBTFVFICopdHlwOworCQkJfQorCQllbHNlCisJCQl0eXAgPSAoQVNOMV9UWVBFICopKnB2YWw7CisKKwkJaWYgKHV0eXBlICE9IHR5cC0+dHlwZSkKKwkJCUFTTjFfVFlQRV9zZXQodHlwLCB1dHlwZSwgTlVMTCk7CisJCW9wdmFsID0gcHZhbDsKKwkJcHZhbCA9ICZ0eXAtPnZhbHVlLmFzbjFfdmFsdWU7CisJCX0KKwlzd2l0Y2godXR5cGUpCisJCXsKKwkJY2FzZSBWX0FTTjFfT0JKRUNUOgorCQlpZiAoIWMyaV9BU04xX09CSkVDVCgoQVNOMV9PQkpFQ1QgKiopcHZhbCwgJmNvbnQsIGxlbikpCisJCQlnb3RvIGVycjsKKwkJYnJlYWs7CisKKwkJY2FzZSBWX0FTTjFfTlVMTDoKKwkJaWYgKGxlbikKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfZXhfYzJpLCAgQVNOMV9SX05VTExfSVNfV1JPTkdfTEVOR1RIKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQkqcHZhbCA9IChBU04xX1ZBTFVFICopMTsKKwkJYnJlYWs7CisKKwkJY2FzZSBWX0FTTjFfQk9PTEVBTjoKKwkJaWYgKGxlbiAhPSAxKQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9leF9jMmksICBBU04xX1JfQk9PTEVBTl9JU19XUk9OR19MRU5HVEgpOworCQkJZ290byBlcnI7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCUFTTjFfQk9PTEVBTiAqdGJvb2w7CisJCQl0Ym9vbCA9IChBU04xX0JPT0xFQU4gKilwdmFsOworCQkJKnRib29sID0gKmNvbnQ7CisJCQl9CisJCWJyZWFrOworCisJCWNhc2UgVl9BU04xX0JJVF9TVFJJTkc6CisJCWlmICghYzJpX0FTTjFfQklUX1NUUklORygoQVNOMV9CSVRfU1RSSU5HICoqKXB2YWwsICZjb250LCBsZW4pKQorCQkJZ290byBlcnI7CisJCWJyZWFrOworCisJCWNhc2UgVl9BU04xX0lOVEVHRVI6CisJCWNhc2UgVl9BU04xX05FR19JTlRFR0VSOgorCQljYXNlIFZfQVNOMV9FTlVNRVJBVEVEOgorCQljYXNlIFZfQVNOMV9ORUdfRU5VTUVSQVRFRDoKKwkJdGludCA9IChBU04xX0lOVEVHRVIgKiopcHZhbDsKKwkJaWYgKCFjMmlfQVNOMV9JTlRFR0VSKHRpbnQsICZjb250LCBsZW4pKQorCQkJZ290byBlcnI7CisJCS8qIEZpeHVwIHR5cGUgdG8gbWF0Y2ggdGhlIGV4cGVjdGVkIGZvcm0gKi8KKwkJKCp0aW50KS0+dHlwZSA9IHV0eXBlIHwgKCgqdGludCktPnR5cGUgJiBWX0FTTjFfTkVHKTsKKwkJYnJlYWs7CisKKwkJY2FzZSBWX0FTTjFfT0NURVRfU1RSSU5HOgorCQljYXNlIFZfQVNOMV9OVU1FUklDU1RSSU5HOgorCQljYXNlIFZfQVNOMV9QUklOVEFCTEVTVFJJTkc6CisJCWNhc2UgVl9BU04xX1Q2MVNUUklORzoKKwkJY2FzZSBWX0FTTjFfVklERU9URVhTVFJJTkc6CisJCWNhc2UgVl9BU04xX0lBNVNUUklORzoKKwkJY2FzZSBWX0FTTjFfVVRDVElNRToKKwkJY2FzZSBWX0FTTjFfR0VORVJBTElaRURUSU1FOgorCQljYXNlIFZfQVNOMV9HUkFQSElDU1RSSU5HOgorCQljYXNlIFZfQVNOMV9WSVNJQkxFU1RSSU5HOgorCQljYXNlIFZfQVNOMV9HRU5FUkFMU1RSSU5HOgorCQljYXNlIFZfQVNOMV9VTklWRVJTQUxTVFJJTkc6CisJCWNhc2UgVl9BU04xX0JNUFNUUklORzoKKwkJY2FzZSBWX0FTTjFfVVRGOFNUUklORzoKKwkJY2FzZSBWX0FTTjFfT1RIRVI6CisJCWNhc2UgVl9BU04xX1NFVDoKKwkJY2FzZSBWX0FTTjFfU0VRVUVOQ0U6CisJCWRlZmF1bHQ6CisJCWlmICh1dHlwZSA9PSBWX0FTTjFfQk1QU1RSSU5HICYmIChsZW4gJiAxKSkKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfZXhfYzJpLCAgQVNOMV9SX0JNUFNUUklOR19JU19XUk9OR19MRU5HVEgpOworCQkJZ290byBlcnI7CisJCQl9CisJCWlmICh1dHlwZSA9PSBWX0FTTjFfVU5JVkVSU0FMU1RSSU5HICYmIChsZW4gJiAzKSkKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfZXhfYzJpLCAgQVNOMV9SX1VOSVZFUlNBTFNUUklOR19JU19XUk9OR19MRU5HVEgpOworCQkJZ290byBlcnI7CisJCQl9CisJCS8qIEFsbCBiYXNlZCBvbiBBU04xX1NUUklORyBhbmQgaGFuZGxlZCB0aGUgc2FtZSAqLworCQlpZiAoISpwdmFsKQorCQkJeworCQkJc3RtcCA9IEFTTjFfU1RSSU5HX3R5cGVfbmV3KHV0eXBlKTsKKwkJCWlmICghc3RtcCkKKwkJCQl7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9leF9jMmksICBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJKnB2YWwgPSAoQVNOMV9WQUxVRSAqKXN0bXA7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCXN0bXAgPSAoQVNOMV9TVFJJTkcgKikqcHZhbDsKKwkJCXN0bXAtPnR5cGUgPSB1dHlwZTsKKwkJCX0KKwkJLyogSWYgd2UndmUgYWxyZWFkeSBhbGxvY2F0ZWQgYSBidWZmZXIgdXNlIGl0ICovCisJCWlmICgqZnJlZV9jb250KQorCQkJeworCQkJaWYgKHN0bXAtPmRhdGEpCisJCQkJT1BFTlNTTF9mcmVlKHN0bXAtPmRhdGEpOworCQkJc3RtcC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopY29udDsgLyogVUdMWSBDQVNUISBSTCAqLworCQkJc3RtcC0+bGVuZ3RoID0gbGVuOworCQkJKmZyZWVfY29udCA9IDA7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCWlmICghQVNOMV9TVFJJTkdfc2V0KHN0bXAsIGNvbnQsIGxlbikpCisJCQkJeworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfZXhfYzJpLCAgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCUFTTjFfU1RSSU5HX2ZyZWUoc3RtcCk7CQorCQkJCSpwdmFsID0gTlVMTDsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQl9CisJCWJyZWFrOworCQl9CisJLyogSWYgQVNOMV9BTlkgYW5kIE5VTEwgdHlwZSBmaXggdXAgdmFsdWUgKi8KKwlpZiAodHlwICYmICh1dHlwZSA9PSBWX0FTTjFfTlVMTCkpCisJCSB0eXAtPnZhbHVlLnB0ciA9IE5VTEw7CisKKwlyZXQgPSAxOworCWVycjoKKwlpZiAoIXJldCkKKwkJeworCQlBU04xX1RZUEVfZnJlZSh0eXApOworCQlpZiAob3B2YWwpCisJCQkqb3B2YWwgPSBOVUxMOworCQl9CisJcmV0dXJuIHJldDsKKwl9CisKKworLyogVGhpcyBmdW5jdGlvbiBmaW5kcyB0aGUgZW5kIG9mIGFuIEFTTjEgc3RydWN0dXJlIHdoZW4gcGFzc2VkIGl0cyBtYXhpbXVtCisgKiBsZW5ndGgsIHdoZXRoZXIgaXQgaXMgaW5kZWZpbml0ZSBsZW5ndGggYW5kIGEgcG9pbnRlciB0byB0aGUgY29udGVudC4KKyAqIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBjYWxsaW5nIGFzbjFfY29sbGVjdCBiZWNhdXNlIGl0IGRvZXMgbm90CisgKiByZWN1cnNlIG9uIGVhY2ggaW5kZWZpbml0ZSBsZW5ndGggaGVhZGVyLgorICovCisKK3N0YXRpYyBpbnQgYXNuMV9maW5kX2VuZChjb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIGxvbmcgbGVuLCBjaGFyIGluZikKKwl7CisJaW50IGV4cGVjdGVkX2VvYzsKKwlsb25nIHBsZW47CisJY29uc3QgdW5zaWduZWQgY2hhciAqcCA9ICppbiwgKnE7CisJLyogSWYgbm90IGluZGVmaW5pdGUgbGVuZ3RoIGNvbnN0cnVjdGVkIGp1c3QgYWRkIGxlbmd0aCAqLworCWlmIChpbmYgPT0gMCkKKwkJeworCQkqaW4gKz0gbGVuOworCQlyZXR1cm4gMTsKKwkJfQorCWV4cGVjdGVkX2VvYyA9IDE7CisJLyogSW5kZWZpbml0ZSBsZW5ndGggY29uc3RydWN0ZWQgZm9ybS4gRmluZCB0aGUgZW5kIHdoZW4gZW5vdWdoIEVPQ3MKKwkgKiBhcmUgZm91bmQuIElmIG1vcmUgaW5kZWZpbml0ZSBsZW5ndGggY29uc3RydWN0ZWQgaGVhZGVycworCSAqIGFyZSBlbmNvdW50ZXJlZCBpbmNyZW1lbnQgdGhlIGV4cGVjdGVkIGVvYyBjb3VudCBvdGhlcndpc2UganVzdAorCSAqIHNraXAgdG8gdGhlIGVuZCBvZiB0aGUgZGF0YS4KKwkgKi8KKwl3aGlsZSAobGVuID4gMCkKKwkJeworCQlpZihhc24xX2NoZWNrX2VvYygmcCwgbGVuKSkKKwkJCXsKKwkJCWV4cGVjdGVkX2VvYy0tOworCQkJaWYgKGV4cGVjdGVkX2VvYyA9PSAwKQorCQkJCWJyZWFrOworCQkJbGVuIC09IDI7CisJCQljb250aW51ZTsKKwkJCX0KKwkJcSA9IHA7CisJCS8qIEp1c3QgcmVhZCBpbiBhIGhlYWRlcjogb25seSBjYXJlIGFib3V0IHRoZSBsZW5ndGggKi8KKwkJaWYoIWFzbjFfY2hlY2tfdGxlbigmcGxlbiwgTlVMTCwgTlVMTCwgJmluZiwgTlVMTCwgJnAsIGxlbiwKKwkJCQktMSwgMCwgMCwgTlVMTCkpCisJCQl7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2ZpbmRfZW5kLCAgQVNOMV9SX05FU1RFRF9BU04xX0VSUk9SKTsKKwkJCXJldHVybiAwOworCQkJfQorCQlpZiAoaW5mKQorCQkJZXhwZWN0ZWRfZW9jKys7CisJCWVsc2UKKwkJCXAgKz0gcGxlbjsKKwkJbGVuIC09IHAgLSBxOworCQl9CisJaWYgKGV4cGVjdGVkX2VvYykKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2ZpbmRfZW5kLCAgQVNOMV9SX01JU1NJTkdfRU9DKTsKKwkJcmV0dXJuIDA7CisJCX0KKwkqaW4gPSBwOworCXJldHVybiAxOworCX0KKy8qIFRoaXMgZnVuY3Rpb24gY29sbGVjdHMgdGhlIGFzbjEgZGF0YSBmcm9tIGEgY29uc3RydWN0cmVkIHN0cmluZworICogdHlwZSBpbnRvIGEgYnVmZmVyLiBUaGUgdmFsdWVzIG9mICdpbicgYW5kICdsZW4nIHNob3VsZCByZWZlcgorICogdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBjb25zdHJ1Y3RlZCB0eXBlIGFuZCAnaW5mJyBzaG91bGQgYmUgc2V0CisgKiBpZiBpdCBpcyBpbmRlZmluaXRlIGxlbmd0aC4KKyAqLworCisjaWZuZGVmIEFTTjFfTUFYX1NUUklOR19ORVNUCisvKiBUaGlzIGRldGVybWluZXMgaG93IG1hbnkgbGV2ZWxzIG9mIHJlY3Vyc2lvbiBhcmUgcGVybWl0dGVkIGluIEFTTjEKKyAqIHN0cmluZyB0eXBlcy4gSWYgaXQgaXMgbm90IGxpbWl0ZWQgc3RhY2sgb3ZlcmZsb3dzIGNhbiBvY2N1ci4gSWYgc2V0CisgKiB0byB6ZXJvIG5vIHJlY3Vyc2lvbiBpcyBhbGxvd2VkIGF0IGFsbC4gQWx0aG91Z2ggemVybyBzaG91bGQgYmUgYWRlcXVhdGUKKyAqIGV4YW1wbGVzIGV4aXN0IHRoYXQgcmVxdWlyZSBhIHZhbHVlIG9mIDEuIFNvIDUgc2hvdWxkIGJlIG1vcmUgdGhhbiBlbm91Z2guCisgKi8KKyNkZWZpbmUgQVNOMV9NQVhfU1RSSU5HX05FU1QgNQorI2VuZGlmCisKKworc3RhdGljIGludCBhc24xX2NvbGxlY3QoQlVGX01FTSAqYnVmLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIGxvbmcgbGVuLAorCQkJY2hhciBpbmYsIGludCB0YWcsIGludCBhY2xhc3MsIGludCBkZXB0aCkKKwl7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcCwgKnE7CisJbG9uZyBwbGVuOworCWNoYXIgY3N0LCBpbmluZjsKKwlwID0gKmluOworCWluZiAmPSAxOworCS8qIElmIG5vIGJ1ZmZlciBhbmQgbm90IGluZGVmaW5pdGUgbGVuZ3RoIGNvbnN0cnVjdGVkIGp1c3QgcGFzcyBvdmVyCisJICogdGhlIGVuY29kZWQgZGF0YSAqLworCWlmICghYnVmICYmICFpbmYpCisJCXsKKwkJKmluICs9IGxlbjsKKwkJcmV0dXJuIDE7CisJCX0KKwl3aGlsZShsZW4gPiAwKQorCQl7CisJCXEgPSBwOworCQkvKiBDaGVjayBmb3IgRU9DICovCisJCWlmIChhc24xX2NoZWNrX2VvYygmcCwgbGVuKSkKKwkJCXsKKwkJCS8qIEVPQyBpcyBpbGxlZ2FsIG91dHNpZGUgaW5kZWZpbml0ZSBsZW5ndGgKKwkJCSAqIGNvbnN0cnVjdGVkIGZvcm0gKi8KKwkJCWlmICghaW5mKQorCQkJCXsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2NvbGxlY3QsICBBU04xX1JfVU5FWFBFQ1RFRF9FT0MpOworCQkJCXJldHVybiAwOworCQkJCX0KKwkJCWluZiA9IDA7CisJCQlicmVhazsKKwkJCX0KKworCQlpZiAoIWFzbjFfY2hlY2tfdGxlbigmcGxlbiwgTlVMTCwgTlVMTCwgJmluaW5mLCAmY3N0LCAmcCwKKwkJCQkJbGVuLCB0YWcsIGFjbGFzcywgMCwgTlVMTCkpCisJCQl7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2NvbGxlY3QsICBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOworCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJLyogSWYgaW5kZWZpbml0ZSBsZW5ndGggY29uc3RydWN0ZWQgdXBkYXRlIG1heCBsZW5ndGggKi8KKwkJaWYgKGNzdCkKKwkJCXsKKwkJCWlmIChkZXB0aCA+PSBBU04xX01BWF9TVFJJTkdfTkVTVCkKKwkJCQl7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9jb2xsZWN0LCAgQVNOMV9SX05FU1RFRF9BU04xX1NUUklORyk7CisJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJaWYgKCFhc24xX2NvbGxlY3QoYnVmLCAmcCwgcGxlbiwgaW5pbmYsIHRhZywgYWNsYXNzLAorCQkJCQkJZGVwdGggKyAxKSkKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJZWxzZSBpZiAocGxlbiAmJiAhY29sbGVjdF9kYXRhKGJ1ZiwgJnAsIHBsZW4pKQorCQkJcmV0dXJuIDA7CisJCWxlbiAtPSBwIC0gcTsKKwkJfQorCWlmIChpbmYpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9jb2xsZWN0LCAgQVNOMV9SX01JU1NJTkdfRU9DKTsKKwkJcmV0dXJuIDA7CisJCX0KKwkqaW4gPSBwOworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBjb2xsZWN0X2RhdGEoQlVGX01FTSAqYnVmLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqcCwgbG9uZyBwbGVuKQorCXsKKwlpbnQgbGVuOworCWlmIChidWYpCisJCXsKKwkJbGVuID0gYnVmLT5sZW5ndGg7CisJCWlmICghQlVGX01FTV9ncm93X2NsZWFuKGJ1ZiwgbGVuICsgcGxlbikpCisJCQl7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2NvbGxlY3QsICBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJbWVtY3B5KGJ1Zi0+ZGF0YSArIGxlbiwgKnAsIHBsZW4pOworCQl9CisJKnAgKz0gcGxlbjsKKwlyZXR1cm4gMTsKKwl9CisKKy8qIENoZWNrIGZvciBBU04xIEVPQyBhbmQgc3dhbGxvdyBpdCBpZiBmb3VuZCAqLworCitzdGF0aWMgaW50IGFzbjFfY2hlY2tfZW9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbiwgbG9uZyBsZW4pCisJeworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CisJaWYgKGxlbiA8IDIpIHJldHVybiAwOworCXAgPSAqaW47CisJaWYgKCFwWzBdICYmICFwWzFdKQorCQl7CisJCSppbiArPSAyOworCQlyZXR1cm4gMTsKKwkJfQorCXJldHVybiAwOworCX0KKworLyogQ2hlY2sgYW4gQVNOMSB0YWcgYW5kIGxlbmd0aDogYSBiaXQgbGlrZSBBU04xX2dldF9vYmplY3QKKyAqIGJ1dCBpdCBzZXRzIHRoZSBsZW5ndGggZm9yIGluZGVmaW5pdGUgbGVuZ3RoIGNvbnN0cnVjdGVkCisgKiBmb3JtLCB3ZSBkb24ndCBrbm93IHRoZSBleGFjdCBsZW5ndGggYnV0IHdlIGNhbiBzZXQgYW4KKyAqIHVwcGVyIGJvdW5kIHRvIHRoZSBhbW91bnQgb2YgZGF0YSBhdmFpbGFibGUgbWludXMgdGhlCisgKiBoZWFkZXIgbGVuZ3RoIGp1c3QgcmVhZC4KKyAqLworCitzdGF0aWMgaW50IGFzbjFfY2hlY2tfdGxlbihsb25nICpvbGVuLCBpbnQgKm90YWcsIHVuc2lnbmVkIGNoYXIgKm9jbGFzcywKKwkJCQljaGFyICppbmYsIGNoYXIgKmNzdCwKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIGxvbmcgbGVuLAorCQkJCWludCBleHB0YWcsIGludCBleHBjbGFzcywgY2hhciBvcHQsCisJCQkJQVNOMV9UTEMgKmN0eCkKKwl7CisJaW50IGk7CisJaW50IHB0YWcsIHBjbGFzczsKKwlsb25nIHBsZW47CisJY29uc3QgdW5zaWduZWQgY2hhciAqcCwgKnE7CisJcCA9ICppbjsKKwlxID0gcDsKKworCWlmIChjdHggJiYgY3R4LT52YWxpZCkKKwkJeworCQlpID0gY3R4LT5yZXQ7CisJCXBsZW4gPSBjdHgtPnBsZW47CisJCXBjbGFzcyA9IGN0eC0+cGNsYXNzOworCQlwdGFnID0gY3R4LT5wdGFnOworCQlwICs9IGN0eC0+aGRybGVuOworCQl9CisJZWxzZQorCQl7CisJCWkgPSBBU04xX2dldF9vYmplY3QoJnAsICZwbGVuLCAmcHRhZywgJnBjbGFzcywgbGVuKTsKKwkJaWYgKGN0eCkKKwkJCXsKKwkJCWN0eC0+cmV0ID0gaTsKKwkJCWN0eC0+cGxlbiA9IHBsZW47CisJCQljdHgtPnBjbGFzcyA9IHBjbGFzczsKKwkJCWN0eC0+cHRhZyA9IHB0YWc7CisJCQljdHgtPmhkcmxlbiA9IHAgLSBxOworCQkJY3R4LT52YWxpZCA9IDE7CisJCQkvKiBJZiBkZWZpbml0ZSBsZW5ndGgsIGFuZCBubyBlcnJvciwgbGVuZ3RoICsKKwkJCSAqIGhlYWRlciBjYW4ndCBleGNlZWQgdG90YWwgYW1vdW50IG9mIGRhdGEgYXZhaWxhYmxlLiAKKwkJCSAqLworCQkJaWYgKCEoaSAmIDB4ODEpICYmICgocGxlbiArIGN0eC0+aGRybGVuKSA+IGxlbikpCisJCQkJeworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfY2hlY2tfdGxlbiwgIEFTTjFfUl9UT09fTE9ORyk7CisJCQkJYXNuMV90bGNfY2xlYXIoY3R4KTsKKwkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9CisJCX0KKworCWlmIChpICYgMHg4MCkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2NoZWNrX3RsZW4sICBBU04xX1JfQkFEX09CSkVDVF9IRUFERVIpOworCQlhc24xX3RsY19jbGVhcihjdHgpOworCQlyZXR1cm4gMDsKKwkJfQorCWlmIChleHB0YWcgPj0gMCkKKwkJeworCQlpZiAoKGV4cHRhZyAhPSBwdGFnKSB8fCAoZXhwY2xhc3MgIT0gcGNsYXNzKSkKKwkJCXsKKwkJCS8qIElmIHR5cGUgaXMgT1BUSU9OQUwsIG5vdCBhbiBlcnJvcjoKKwkJCSAqIGluZGljYXRlIG1pc3NpbmcgdHlwZS4KKwkJCSAqLworCQkJaWYgKG9wdCkgcmV0dXJuIC0xOworCQkJYXNuMV90bGNfY2xlYXIoY3R4KTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfY2hlY2tfdGxlbiwgIEFTTjFfUl9XUk9OR19UQUcpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCS8qIFdlIGhhdmUgYSB0YWcgYW5kIGNsYXNzIG1hdGNoOgorCQkgKiBhc3N1bWUgd2UgYXJlIGdvaW5nIHRvIGRvIHNvbWV0aGluZyB3aXRoIGl0ICovCisJCWFzbjFfdGxjX2NsZWFyKGN0eCk7CisJCX0KKworCWlmIChpICYgMSkKKwkJcGxlbiA9IGxlbiAtIChwIC0gcSk7CisKKwlpZiAoaW5mKQorCQkqaW5mID0gaSAmIDE7CisKKwlpZiAoY3N0KQorCQkqY3N0ID0gaSAmIFZfQVNOMV9DT05TVFJVQ1RFRDsKKworCWlmIChvbGVuKQorCQkqb2xlbiA9IHBsZW47CisKKwlpZiAob2NsYXNzKQorCQkqb2NsYXNzID0gcGNsYXNzOworCisJaWYgKG90YWcpCisJCSpvdGFnID0gcHRhZzsKKworCSppbiA9IHA7CisJcmV0dXJuIDE7CisJfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FzbjEvdGFzbl9lbmMuYyBiL2NyeXB0by9hc24xL3Rhc25fZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxMmUwMQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9hc24xL3Rhc25fZW5jLmMKQEAgLTAsMCArMSw2ODggQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorCisKK3N0YXRpYyBpbnQgYXNuMV9pMmRfZXhfcHJpbWl0aXZlKEFTTjFfVkFMVUUgKipwdmFsLCB1bnNpZ25lZCBjaGFyICoqb3V0LAorCQkJCQljb25zdCBBU04xX0lURU0gKml0LAorCQkJCQlpbnQgdGFnLCBpbnQgYWNsYXNzKTsKK3N0YXRpYyBpbnQgYXNuMV9zZXRfc2VxX291dChTVEFDS19PRihBU04xX1ZBTFVFKSAqc2ssIHVuc2lnbmVkIGNoYXIgKipvdXQsCisJCQkJCWludCBza2NvbnRsZW4sIGNvbnN0IEFTTjFfSVRFTSAqaXRlbSwKKwkJCQkJaW50IGRvX3NvcnQsIGludCBpY2xhc3MpOworc3RhdGljIGludCBhc24xX3RlbXBsYXRlX2V4X2kyZChBU04xX1ZBTFVFICoqcHZhbCwgdW5zaWduZWQgY2hhciAqKm91dCwKKwkJCQkJY29uc3QgQVNOMV9URU1QTEFURSAqdHQsCisJCQkJCWludCB0YWcsIGludCBhY2xhc3MpOworc3RhdGljIGludCBhc24xX2l0ZW1fZmxhZ3NfaTJkKEFTTjFfVkFMVUUgKnZhbCwgdW5zaWduZWQgY2hhciAqKm91dCwKKwkJCQkJY29uc3QgQVNOMV9JVEVNICppdCwgaW50IGZsYWdzKTsKKworLyogVG9wIGxldmVsIGkyZCBlcXVpdmFsZW50czogdGhlICduZGVmJyB2YXJpYW50IGluc3RydWN0cyB0aGUgZW5jb2RlcgorICogdG8gdXNlIGluZGVmaW5pdGUgbGVuZ3RoIGNvbnN0cnVjdGVkIGVuY29kaW5nLCB3aGVyZSBhcHByb3ByaWF0ZQorICovCisKK2ludCBBU04xX2l0ZW1fbmRlZl9pMmQoQVNOMV9WQUxVRSAqdmFsLCB1bnNpZ25lZCBjaGFyICoqb3V0LAorCQkJCQkJY29uc3QgQVNOMV9JVEVNICppdCkKKwl7CisJcmV0dXJuIGFzbjFfaXRlbV9mbGFnc19pMmQodmFsLCBvdXQsIGl0LCBBU04xX1RGTEdfTkRFRik7CisJfQorCitpbnQgQVNOMV9pdGVtX2kyZChBU04xX1ZBTFVFICp2YWwsIHVuc2lnbmVkIGNoYXIgKipvdXQsIGNvbnN0IEFTTjFfSVRFTSAqaXQpCisJeworCXJldHVybiBhc24xX2l0ZW1fZmxhZ3NfaTJkKHZhbCwgb3V0LCBpdCwgMCk7CisJfQorCisvKiBFbmNvZGUgYW4gQVNOMSBpdGVtLCB0aGlzIGlzIHVzZSBieSB0aGUKKyAqIHN0YW5kYXJkICdpMmQnIGZ1bmN0aW9uLiAnb3V0JyBwb2ludHMgdG8gCisgKiBhIGJ1ZmZlciB0byBvdXRwdXQgdGhlIGRhdGEgdG8uCisgKgorICogVGhlIG5ldyBpMmQgaGFzIG9uZSBhZGRpdGlvbmFsIGZlYXR1cmUuIElmIHRoZSBvdXRwdXQKKyAqIGJ1ZmZlciBpcyBOVUxMIChpLmUuICpvdXQgPT0gTlVMTCkgdGhlbiBhIGJ1ZmZlciBpcworICogYWxsb2NhdGVkIGFuZCBwb3B1bGF0ZWQgd2l0aCB0aGUgZW5jb2RpbmcuCisgKi8KKworc3RhdGljIGludCBhc24xX2l0ZW1fZmxhZ3NfaTJkKEFTTjFfVkFMVUUgKnZhbCwgdW5zaWduZWQgY2hhciAqKm91dCwKKwkJCQkJY29uc3QgQVNOMV9JVEVNICppdCwgaW50IGZsYWdzKQorCXsKKwlpZiAob3V0ICYmICEqb3V0KQorCQl7CisJCXVuc2lnbmVkIGNoYXIgKnAsICpidWY7CisJCWludCBsZW47CisJCWxlbiA9IEFTTjFfaXRlbV9leF9pMmQoJnZhbCwgTlVMTCwgaXQsIC0xLCBmbGFncyk7CisJCWlmIChsZW4gPD0gMCkKKwkJCXJldHVybiBsZW47CisJCWJ1ZiA9IE9QRU5TU0xfbWFsbG9jKGxlbik7CisJCWlmICghYnVmKQorCQkJcmV0dXJuIC0xOworCQlwID0gYnVmOworCQlBU04xX2l0ZW1fZXhfaTJkKCZ2YWwsICZwLCBpdCwgLTEsIGZsYWdzKTsKKwkJKm91dCA9IGJ1ZjsKKwkJcmV0dXJuIGxlbjsKKwkJfQorCisJcmV0dXJuIEFTTjFfaXRlbV9leF9pMmQoJnZhbCwgb3V0LCBpdCwgLTEsIGZsYWdzKTsKKwl9CisKKy8qIEVuY29kZSBhbiBpdGVtLCB0YWtpbmcgY2FyZSBvZiBJTVBMSUNJVCB0YWdnaW5nIChpZiBhbnkpLgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyB0aGUgbm9ybWFsIGl0ZW0gaGFuZGxpbmc6IGl0IGNhbiBiZQorICogdXNlZCBpbiBleHRlcm5hbCB0eXBlcy4KKyAqLworCitpbnQgQVNOMV9pdGVtX2V4X2kyZChBU04xX1ZBTFVFICoqcHZhbCwgdW5zaWduZWQgY2hhciAqKm91dCwKKwkJCWNvbnN0IEFTTjFfSVRFTSAqaXQsIGludCB0YWcsIGludCBhY2xhc3MpCisJeworCWNvbnN0IEFTTjFfVEVNUExBVEUgKnR0ID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyICpwID0gTlVMTDsKKwlpbnQgaSwgc2VxY29udGxlbiwgc2VxbGVuLCBuZGVmID0gMTsKKwljb25zdCBBU04xX0NPTVBBVF9GVU5DUyAqY2Y7CisJY29uc3QgQVNOMV9FWFRFUk5fRlVOQ1MgKmVmOworCWNvbnN0IEFTTjFfQVVYICphdXggPSBpdC0+ZnVuY3M7CisJQVNOMV9hdXhfY2IgKmFzbjFfY2IgPSAwOworCisJaWYgKChpdC0+aXR5cGUgIT0gQVNOMV9JVFlQRV9QUklNSVRJVkUpICYmICEqcHZhbCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoYXV4ICYmIGF1eC0+YXNuMV9jYikKKwkJIGFzbjFfY2IgPSBhdXgtPmFzbjFfY2I7CisKKwlzd2l0Y2goaXQtPml0eXBlKQorCQl7CisKKwkJY2FzZSBBU04xX0lUWVBFX1BSSU1JVElWRToKKwkJaWYgKGl0LT50ZW1wbGF0ZXMpCisJCQlyZXR1cm4gYXNuMV90ZW1wbGF0ZV9leF9pMmQocHZhbCwgb3V0LCBpdC0+dGVtcGxhdGVzLAorCQkJCQkJCQl0YWcsIGFjbGFzcyk7CisJCXJldHVybiBhc24xX2kyZF9leF9wcmltaXRpdmUocHZhbCwgb3V0LCBpdCwgdGFnLCBhY2xhc3MpOworCQlicmVhazsKKworCQljYXNlIEFTTjFfSVRZUEVfTVNUUklORzoKKwkJcmV0dXJuIGFzbjFfaTJkX2V4X3ByaW1pdGl2ZShwdmFsLCBvdXQsIGl0LCAtMSwgYWNsYXNzKTsKKworCQljYXNlIEFTTjFfSVRZUEVfQ0hPSUNFOgorCQlpZiAoYXNuMV9jYiAmJiAhYXNuMV9jYihBU04xX09QX0kyRF9QUkUsIHB2YWwsIGl0LCBOVUxMKSkKKwkJCQlyZXR1cm4gMDsKKwkJaSA9IGFzbjFfZ2V0X2Nob2ljZV9zZWxlY3RvcihwdmFsLCBpdCk7CisJCWlmICgoaSA+PSAwKSAmJiAoaSA8IGl0LT50Y291bnQpKQorCQkJeworCQkJQVNOMV9WQUxVRSAqKnBjaHZhbDsKKwkJCWNvbnN0IEFTTjFfVEVNUExBVEUgKmNodHQ7CisJCQljaHR0ID0gaXQtPnRlbXBsYXRlcyArIGk7CisJCQlwY2h2YWwgPSBhc24xX2dldF9maWVsZF9wdHIocHZhbCwgY2h0dCk7CisJCQlyZXR1cm4gYXNuMV90ZW1wbGF0ZV9leF9pMmQocGNodmFsLCBvdXQsIGNodHQsCisJCQkJCQkJCS0xLCBhY2xhc3MpOworCQkJfQorCQkvKiBGaXhtZTogZXJyb3IgY29uZGl0aW9uIGlmIHNlbGVjdG9yIG91dCBvZiByYW5nZSAqLworCQlpZiAoYXNuMV9jYiAmJiAhYXNuMV9jYihBU04xX09QX0kyRF9QT1NULCBwdmFsLCBpdCwgTlVMTCkpCisJCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCisJCWNhc2UgQVNOMV9JVFlQRV9FWFRFUk46CisJCS8qIElmIG5ldyBzdHlsZSBpMmQgaXQgZG9lcyBhbGwgdGhlIHdvcmsgKi8KKwkJZWYgPSBpdC0+ZnVuY3M7CisJCXJldHVybiBlZi0+YXNuMV9leF9pMmQocHZhbCwgb3V0LCBpdCwgdGFnLCBhY2xhc3MpOworCisJCWNhc2UgQVNOMV9JVFlQRV9DT01QQVQ6CisJCS8qIG9sZCBzdHlsZSBoYWNrZXJ5Li4uICovCisJCWNmID0gaXQtPmZ1bmNzOworCQlpZiAob3V0KQorCQkJcCA9ICpvdXQ7CisJCWkgPSBjZi0+YXNuMV9pMmQoKnB2YWwsIG91dCk7CisJCS8qIEZpeHVwIGZvciBJTVBMSUNJVCB0YWc6IG5vdGUgdGhpcyBtZXNzZXMgdXAgZm9yIHRhZ3MgPiAzMCwKKwkJICogYnV0IHNvIGRpZCB0aGUgb2xkIGNvZGUuIFRhZ3MgPiAzMCBhcmUgdmVyeSByYXJlIGFueXdheS4KKwkJICovCisJCWlmIChvdXQgJiYgKHRhZyAhPSAtMSkpCisJCQkqcCA9IGFjbGFzcyB8IHRhZyB8ICgqcCAmIFZfQVNOMV9DT05TVFJVQ1RFRCk7CisJCXJldHVybiBpOworCQkKKwkJY2FzZSBBU04xX0lUWVBFX05ERUZfU0VRVUVOQ0U6CisJCS8qIFVzZSBpbmRlZmluaXRlIGxlbmd0aCBjb25zdHJ1Y3RlZCBpZiByZXF1ZXN0ZWQgKi8KKwkJaWYgKGFjbGFzcyAmIEFTTjFfVEZMR19OREVGKSBuZGVmID0gMjsKKwkJLyogZmFsbCB0aHJvdWdoICovCisKKwkJY2FzZSBBU04xX0lUWVBFX1NFUVVFTkNFOgorCQlpID0gYXNuMV9lbmNfcmVzdG9yZSgmc2VxY29udGxlbiwgb3V0LCBwdmFsLCBpdCk7CisJCS8qIEFuIGVycm9yIG9jY3VycmVkICovCisJCWlmIChpIDwgMCkKKwkJCXJldHVybiAwOworCQkvKiBXZSBoYXZlIGEgdmFsaWQgY2FjaGVkIGVuY29kaW5nLi4uICovCisJCWlmIChpID4gMCkKKwkJCXJldHVybiBzZXFjb250bGVuOworCQkvKiBPdGhlcndpc2UgY2Fycnkgb24gKi8KKwkJc2VxY29udGxlbiA9IDA7CisJCS8qIElmIG5vIElNUExJQ0lUIHRhZ2dpbmcgc2V0IHRvIFNFUVVFTkNFLCBVTklWRVJTQUwgKi8KKwkJaWYgKHRhZyA9PSAtMSkKKwkJCXsKKwkJCXRhZyA9IFZfQVNOMV9TRVFVRU5DRTsKKwkJCS8qIFJldGFpbiBhbnkgb3RoZXIgZmxhZ3MgaW4gYWNsYXNzICovCisJCQlhY2xhc3MgPSAoYWNsYXNzICYgfkFTTjFfVEZMR19UQUdfQ0xBU1MpCisJCQkJCXwgVl9BU04xX1VOSVZFUlNBTDsKKwkJCX0KKwkJaWYgKGFzbjFfY2IgJiYgIWFzbjFfY2IoQVNOMV9PUF9JMkRfUFJFLCBwdmFsLCBpdCwgTlVMTCkpCisJCQkJcmV0dXJuIDA7CisJCS8qIEZpcnN0IHdvcmsgb3V0IHNlcXVlbmNlIGNvbnRlbnQgbGVuZ3RoICovCisJCWZvciAoaSA9IDAsIHR0ID0gaXQtPnRlbXBsYXRlczsgaSA8IGl0LT50Y291bnQ7IHR0KyssIGkrKykKKwkJCXsKKwkJCWNvbnN0IEFTTjFfVEVNUExBVEUgKnNlcXR0OworCQkJQVNOMV9WQUxVRSAqKnBzZXF2YWw7CisJCQlzZXF0dCA9IGFzbjFfZG9fYWRiKHB2YWwsIHR0LCAxKTsKKwkJCWlmICghc2VxdHQpCisJCQkJcmV0dXJuIDA7CisJCQlwc2VxdmFsID0gYXNuMV9nZXRfZmllbGRfcHRyKHB2YWwsIHNlcXR0KTsKKwkJCS8qIEZJWE1FOiBjaGVjayBmb3IgZXJyb3JzIGluIGVuaGFuY2VkIHZlcnNpb24gKi8KKwkJCXNlcWNvbnRsZW4gKz0gYXNuMV90ZW1wbGF0ZV9leF9pMmQocHNlcXZhbCwgTlVMTCwgc2VxdHQsCisJCQkJCQkJCS0xLCBhY2xhc3MpOworCQkJfQorCisJCXNlcWxlbiA9IEFTTjFfb2JqZWN0X3NpemUobmRlZiwgc2VxY29udGxlbiwgdGFnKTsKKwkJaWYgKCFvdXQpCisJCQlyZXR1cm4gc2VxbGVuOworCQkvKiBPdXRwdXQgU0VRVUVOQ0UgaGVhZGVyICovCisJCUFTTjFfcHV0X29iamVjdChvdXQsIG5kZWYsIHNlcWNvbnRsZW4sIHRhZywgYWNsYXNzKTsKKwkJZm9yIChpID0gMCwgdHQgPSBpdC0+dGVtcGxhdGVzOyBpIDwgaXQtPnRjb3VudDsgdHQrKywgaSsrKQorCQkJeworCQkJY29uc3QgQVNOMV9URU1QTEFURSAqc2VxdHQ7CisJCQlBU04xX1ZBTFVFICoqcHNlcXZhbDsKKwkJCXNlcXR0ID0gYXNuMV9kb19hZGIocHZhbCwgdHQsIDEpOworCQkJaWYgKCFzZXF0dCkKKwkJCQlyZXR1cm4gMDsKKwkJCXBzZXF2YWwgPSBhc24xX2dldF9maWVsZF9wdHIocHZhbCwgc2VxdHQpOworCQkJLyogRklYTUU6IGNoZWNrIGZvciBlcnJvcnMgaW4gZW5oYW5jZWQgdmVyc2lvbiAqLworCQkJYXNuMV90ZW1wbGF0ZV9leF9pMmQocHNlcXZhbCwgb3V0LCBzZXF0dCwgLTEsIGFjbGFzcyk7CisJCQl9CisJCWlmIChuZGVmID09IDIpCisJCQlBU04xX3B1dF9lb2Mob3V0KTsKKwkJaWYgKGFzbjFfY2IgJiYgIWFzbjFfY2IoQVNOMV9PUF9JMkRfUE9TVCwgcHZhbCwgaXQsIE5VTEwpKQorCQkJCXJldHVybiAwOworCQlyZXR1cm4gc2VxbGVuOworCisJCWRlZmF1bHQ6CisJCXJldHVybiAwOworCisJCX0KKwlyZXR1cm4gMDsKKwl9CisKK2ludCBBU04xX3RlbXBsYXRlX2kyZChBU04xX1ZBTFVFICoqcHZhbCwgdW5zaWduZWQgY2hhciAqKm91dCwKKwkJCQkJCQljb25zdCBBU04xX1RFTVBMQVRFICp0dCkKKwl7CisJcmV0dXJuIGFzbjFfdGVtcGxhdGVfZXhfaTJkKHB2YWwsIG91dCwgdHQsIC0xLCAwKTsKKwl9CisKK3N0YXRpYyBpbnQgYXNuMV90ZW1wbGF0ZV9leF9pMmQoQVNOMV9WQUxVRSAqKnB2YWwsIHVuc2lnbmVkIGNoYXIgKipvdXQsCisJCQkJY29uc3QgQVNOMV9URU1QTEFURSAqdHQsIGludCB0YWcsIGludCBpY2xhc3MpCisJeworCWludCBpLCByZXQsIGZsYWdzLCB0dGFnLCB0Y2xhc3MsIG5kZWY7CisJc2l6ZV90IGo7CisJZmxhZ3MgPSB0dC0+ZmxhZ3M7CisJLyogV29yayBvdXQgdGFnIGFuZCBjbGFzcyB0byB1c2U6IHRhZ2dpbmcgbWF5IGNvbWUKKwkgKiBlaXRoZXIgZnJvbSB0aGUgdGVtcGxhdGUgb3IgdGhlIGFyZ3VtZW50cywgbm90IGJvdGgKKwkgKiBiZWNhdXNlIHRoaXMgd291bGQgY3JlYXRlIGFtYmlndWl0eS4gQWRkaXRpb25hbGx5CisJICogdGhlIGljbGFzcyBhcmd1bWVudCBtYXkgY29udGFpbiBzb21lIGFkZGl0aW9uYWwgZmxhZ3MKKwkgKiB3aGljaCBzaG91bGQgYmUgbm90ZWQgYW5kIHBhc3NlZCBkb3duIHRvIG90aGVyIGxldmVscy4KKwkgKi8KKwlpZiAoZmxhZ3MgJiBBU04xX1RGTEdfVEFHX01BU0spCisJCXsKKwkJLyogRXJyb3IgaWYgYXJndW1lbnQgYW5kIHRlbXBsYXRlIHRhZ2dpbmcgKi8KKwkJaWYgKHRhZyAhPSAtMSkKKwkJCS8qIEZJWE1FOiBlcnJvciBjb2RlIGhlcmUgKi8KKwkJCXJldHVybiAtMTsKKwkJLyogR2V0IHRhZ2dpbmcgZnJvbSB0ZW1wbGF0ZSAqLworCQl0dGFnID0gdHQtPnRhZzsKKwkJdGNsYXNzID0gZmxhZ3MgJiBBU04xX1RGTEdfVEFHX0NMQVNTOworCQl9CisJZWxzZSBpZiAodGFnICE9IC0xKQorCQl7CisJCS8qIE5vIHRlbXBsYXRlIHRhZ2dpbmcsIGdldCBmcm9tIGFyZ3VtZW50cyAqLworCQl0dGFnID0gdGFnOworCQl0Y2xhc3MgPSBpY2xhc3MgJiBBU04xX1RGTEdfVEFHX0NMQVNTOworCQl9CisJZWxzZQorCQl7CisJCXR0YWcgPSAtMTsKKwkJdGNsYXNzID0gMDsKKwkJfQorCS8qIAorCSAqIFJlbW92ZSBhbnkgY2xhc3MgbWFzayBmcm9tIGlmbGFnLgorCSAqLworCWljbGFzcyAmPSB+QVNOMV9URkxHX1RBR19DTEFTUzsKKworCS8qIEF0IHRoaXMgcG9pbnQgJ3R0YWcnIGNvbnRhaW5zIHRoZSBvdXRlciB0YWcgdG8gdXNlLAorCSAqICd0Y2xhc3MnIGlzIHRoZSBjbGFzcyBhbmQgaWNsYXNzIGlzIGFueSBmbGFncyBwYXNzZWQKKwkgKiB0byB0aGlzIGZ1bmN0aW9uLgorCSAqLworCisJLyogaWYgdGVtcGxhdGUgYW5kIGFyZ3VtZW50cyByZXF1aXJlIG5kZWYsIHVzZSBpdCAqLworCWlmICgoZmxhZ3MgJiBBU04xX1RGTEdfTkRFRikgJiYgKGljbGFzcyAmIEFTTjFfVEZMR19OREVGKSkKKwkJbmRlZiA9IDI7CisJZWxzZSBuZGVmID0gMTsKKworCWlmIChmbGFncyAmIEFTTjFfVEZMR19TS19NQVNLKQorCQl7CisJCS8qIFNFVCBPRiwgU0VRVUVOQ0UgT0YgKi8KKwkJU1RBQ0tfT0YoQVNOMV9WQUxVRSkgKnNrID0gKFNUQUNLX09GKEFTTjFfVkFMVUUpICopKnB2YWw7CisJCWludCBpc3NldCwgc2t0YWcsIHNrYWNsYXNzOworCQlpbnQgc2tjb250bGVuLCBza2xlbjsKKwkJQVNOMV9WQUxVRSAqc2tpdGVtOworCisJCWlmICghKnB2YWwpCisJCQlyZXR1cm4gMDsKKworCQlpZiAoZmxhZ3MgJiBBU04xX1RGTEdfU0VUX09GKQorCQkJeworCQkJaXNzZXQgPSAxOworCQkJLyogMiBtZWFucyB3ZSByZW9yZGVyICovCisJCQlpZiAoZmxhZ3MgJiBBU04xX1RGTEdfU0VRVUVOQ0VfT0YpCisJCQkJaXNzZXQgPSAyOworCQkJfQorCQllbHNlIGlzc2V0ID0gMDsKKworCQkvKiBXb3JrIG91dCBpbm5lciB0YWcgdmFsdWU6IGlmIEVYUExJQ0lUCisJCSAqIG9yIG5vIHRhZ2dpbmcgdXNlIHVuZGVybHlpbmcgdHlwZS4KKwkJICovCisJCWlmICgodHRhZyAhPSAtMSkgJiYgIShmbGFncyAmIEFTTjFfVEZMR19FWFBUQUcpKQorCQkJeworCQkJc2t0YWcgPSB0dGFnOworCQkJc2thY2xhc3MgPSB0Y2xhc3M7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCXNrYWNsYXNzID0gVl9BU04xX1VOSVZFUlNBTDsKKwkJCWlmIChpc3NldCkKKwkJCQlza3RhZyA9IFZfQVNOMV9TRVQ7CisJCQllbHNlIHNrdGFnID0gVl9BU04xX1NFUVVFTkNFOworCQkJfQorCisJCS8qIERldGVybWluZSB0b3RhbCBsZW5ndGggb2YgaXRlbXMgKi8KKwkJc2tjb250bGVuID0gMDsKKwkJZm9yIChqID0gMDsgaiA8IHNrX0FTTjFfVkFMVUVfbnVtKHNrKTsgaisrKQorCQkJeworCQkJc2tpdGVtID0gc2tfQVNOMV9WQUxVRV92YWx1ZShzaywgaik7CisJCQlza2NvbnRsZW4gKz0gQVNOMV9pdGVtX2V4X2kyZCgmc2tpdGVtLCBOVUxMLAorCQkJCQkJQVNOMV9JVEVNX3B0cih0dC0+aXRlbSksCisJCQkJCQkJLTEsIGljbGFzcyk7CisJCQl9CisJCXNrbGVuID0gQVNOMV9vYmplY3Rfc2l6ZShuZGVmLCBza2NvbnRsZW4sIHNrdGFnKTsKKwkJLyogSWYgRVhQTElDSVQgbmVlZCBsZW5ndGggb2Ygc3Vycm91bmRpbmcgdGFnICovCisJCWlmIChmbGFncyAmIEFTTjFfVEZMR19FWFBUQUcpCisJCQlyZXQgPSBBU04xX29iamVjdF9zaXplKG5kZWYsIHNrbGVuLCB0dGFnKTsKKwkJZWxzZSByZXQgPSBza2xlbjsKKworCQlpZiAoIW91dCkKKwkJCXJldHVybiByZXQ7CisKKwkJLyogTm93IGVuY29kZSB0aGlzIGxvdC4uLiAqLworCQkvKiBFWFBMSUNJVCB0YWcgKi8KKwkJaWYgKGZsYWdzICYgQVNOMV9URkxHX0VYUFRBRykKKwkJCUFTTjFfcHV0X29iamVjdChvdXQsIG5kZWYsIHNrbGVuLCB0dGFnLCB0Y2xhc3MpOworCQkvKiBTRVQgb3IgU0VRVUVOQ0UgYW5kIElNUExJQ0lUIHRhZyAqLworCQlBU04xX3B1dF9vYmplY3Qob3V0LCBuZGVmLCBza2NvbnRsZW4sIHNrdGFnLCBza2FjbGFzcyk7CisJCS8qIEFuZCB0aGUgc3R1ZmYgaXRzZWxmICovCisJCWFzbjFfc2V0X3NlcV9vdXQoc2ssIG91dCwgc2tjb250bGVuLCBBU04xX0lURU1fcHRyKHR0LT5pdGVtKSwKKwkJCQkJCQkJaXNzZXQsIGljbGFzcyk7CisJCWlmIChuZGVmID09IDIpCisJCQl7CisJCQlBU04xX3B1dF9lb2Mob3V0KTsKKwkJCWlmIChmbGFncyAmIEFTTjFfVEZMR19FWFBUQUcpCisJCQkJQVNOMV9wdXRfZW9jKG91dCk7CisJCQl9CisKKwkJcmV0dXJuIHJldDsKKwkJfQorCisJaWYgKGZsYWdzICYgQVNOMV9URkxHX0VYUFRBRykKKwkJeworCQkvKiBFWFBMSUNJVCB0YWdnaW5nICovCisJCS8qIEZpbmQgbGVuZ3RoIG9mIHRhZ2dlZCBpdGVtICovCisJCWkgPSBBU04xX2l0ZW1fZXhfaTJkKHB2YWwsIE5VTEwsIEFTTjFfSVRFTV9wdHIodHQtPml0ZW0pLAorCQkJCQkJCQktMSwgaWNsYXNzKTsKKwkJaWYgKCFpKQorCQkJcmV0dXJuIDA7CisJCS8qIEZpbmQgbGVuZ3RoIG9mIEVYUExJQ0lUIHRhZyAqLworCQlyZXQgPSBBU04xX29iamVjdF9zaXplKG5kZWYsIGksIHR0YWcpOworCQlpZiAob3V0KQorCQkJeworCQkJLyogT3V0cHV0IHRhZyBhbmQgaXRlbSAqLworCQkJQVNOMV9wdXRfb2JqZWN0KG91dCwgbmRlZiwgaSwgdHRhZywgdGNsYXNzKTsKKwkJCUFTTjFfaXRlbV9leF9pMmQocHZhbCwgb3V0LCBBU04xX0lURU1fcHRyKHR0LT5pdGVtKSwKKwkJCQkJCQkJLTEsIGljbGFzcyk7CisJCQlpZiAobmRlZiA9PSAyKQorCQkJCUFTTjFfcHV0X2VvYyhvdXQpOworCQkJfQorCQlyZXR1cm4gcmV0OworCQl9CisKKwkvKiBFaXRoZXIgbm9ybWFsIG9yIElNUExJQ0lUIHRhZ2dpbmc6IGNvbWJpbmUgY2xhc3MgYW5kIGZsYWdzICovCisJcmV0dXJuIEFTTjFfaXRlbV9leF9pMmQocHZhbCwgb3V0LCBBU04xX0lURU1fcHRyKHR0LT5pdGVtKSwKKwkJCQkJCXR0YWcsIHRjbGFzcyB8IGljbGFzcyk7CisKK30KKworLyogVGVtcG9yYXJ5IHN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgREVSIGVuY29kaW5nIG9mIGl0ZW1zIGZvciBTRVQgT0YgKi8KKwordHlwZWRlZglzdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJaW50IGxlbmd0aDsKKwlBU04xX1ZBTFVFICpmaWVsZDsKK30gREVSX0VOQzsKKworc3RhdGljIGludCBkZXJfY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCisJeworCWNvbnN0IERFUl9FTkMgKmQxID0gYSwgKmQyID0gYjsKKwlpbnQgY21wbGVuLCBpOworCWNtcGxlbiA9IChkMS0+bGVuZ3RoIDwgZDItPmxlbmd0aCkgPyBkMS0+bGVuZ3RoIDogZDItPmxlbmd0aDsKKwlpID0gbWVtY21wKGQxLT5kYXRhLCBkMi0+ZGF0YSwgY21wbGVuKTsKKwlpZiAoaSkKKwkJcmV0dXJuIGk7CisJcmV0dXJuIGQxLT5sZW5ndGggLSBkMi0+bGVuZ3RoOworCX0KKworLyogT3V0cHV0IHRoZSBjb250ZW50IG9jdGV0cyBvZiBTRVQgT0Ygb3IgU0VRVUVOQ0UgT0YgKi8KKworc3RhdGljIGludCBhc24xX3NldF9zZXFfb3V0KFNUQUNLX09GKEFTTjFfVkFMVUUpICpzaywgdW5zaWduZWQgY2hhciAqKm91dCwKKwkJCQkJaW50IHNrY29udGxlbiwgY29uc3QgQVNOMV9JVEVNICppdGVtLAorCQkJCQlpbnQgZG9fc29ydCwgaW50IGljbGFzcykKKwl7CisJc2l6ZV90IGk7CisJQVNOMV9WQUxVRSAqc2tpdGVtOworCXVuc2lnbmVkIGNoYXIgKnRtcGRhdCA9IE5VTEwsICpwID0gTlVMTDsKKwlERVJfRU5DICpkZXJsc3QgPSBOVUxMLCAqdGRlcjsKKwlpZiAoZG9fc29ydCkKKwkJIHsKKwkJLyogRG9uJ3QgbmVlZCB0byBzb3J0IGxlc3MgdGhhbiAyIGl0ZW1zICovCisJCWlmIChza19BU04xX1ZBTFVFX251bShzaykgPCAyKQorCQkJZG9fc29ydCA9IDA7CisJCWVsc2UKKwkJCXsKKwkJCWRlcmxzdCA9IE9QRU5TU0xfbWFsbG9jKHNrX0FTTjFfVkFMVUVfbnVtKHNrKQorCQkJCQkJKiBzaXplb2YoKmRlcmxzdCkpOworCQkJdG1wZGF0ID0gT1BFTlNTTF9tYWxsb2Moc2tjb250bGVuKTsKKwkJCWlmICghZGVybHN0IHx8ICF0bXBkYXQpCisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkvKiBJZiBub3Qgc29ydGluZyBqdXN0IG91dHB1dCBlYWNoIGl0ZW0gKi8KKwlpZiAoIWRvX3NvcnQpCisJCXsKKwkJZm9yIChpID0gMDsgaSA8IHNrX0FTTjFfVkFMVUVfbnVtKHNrKTsgaSsrKQorCQkJeworCQkJc2tpdGVtID0gc2tfQVNOMV9WQUxVRV92YWx1ZShzaywgaSk7CisJCQlBU04xX2l0ZW1fZXhfaTJkKCZza2l0ZW0sIG91dCwgaXRlbSwgLTEsIGljbGFzcyk7CisJCQl9CisJCXJldHVybiAxOworCQl9CisJcCA9IHRtcGRhdDsKKworCS8qIERvaW5nIHNvcnQ6IGJ1aWxkIHVwIGEgbGlzdCBvZiBlYWNoIG1lbWJlcidzIERFUiBlbmNvZGluZyAqLworCWZvciAoaSA9IDAsIHRkZXIgPSBkZXJsc3Q7IGkgPCBza19BU04xX1ZBTFVFX251bShzayk7IGkrKywgdGRlcisrKQorCQl7CisJCXNraXRlbSA9IHNrX0FTTjFfVkFMVUVfdmFsdWUoc2ssIGkpOworCQl0ZGVyLT5kYXRhID0gcDsKKwkJdGRlci0+bGVuZ3RoID0gQVNOMV9pdGVtX2V4X2kyZCgmc2tpdGVtLCAmcCwgaXRlbSwgLTEsIGljbGFzcyk7CisJCXRkZXItPmZpZWxkID0gc2tpdGVtOworCQl9CisKKwkvKiBOb3cgc29ydCB0aGVtICovCisJcXNvcnQoZGVybHN0LCBza19BU04xX1ZBTFVFX251bShzayksIHNpemVvZigqZGVybHN0KSwgZGVyX2NtcCk7CisJLyogT3V0cHV0IHNvcnRlZCBERVIgZW5jb2RpbmcgKi8JCisJcCA9ICpvdXQ7CisJZm9yIChpID0gMCwgdGRlciA9IGRlcmxzdDsgaSA8IHNrX0FTTjFfVkFMVUVfbnVtKHNrKTsgaSsrLCB0ZGVyKyspCisJCXsKKwkJbWVtY3B5KHAsIHRkZXItPmRhdGEsIHRkZXItPmxlbmd0aCk7CisJCXAgKz0gdGRlci0+bGVuZ3RoOworCQl9CisJKm91dCA9IHA7CisJLyogSWYgZG9fc29ydCBpcyAyIHRoZW4gcmVvcmRlciB0aGUgU1RBQ0sgKi8KKwlpZiAoZG9fc29ydCA9PSAyKQorCQl7CisJCWZvciAoaSA9IDAsIHRkZXIgPSBkZXJsc3Q7IGkgPCBza19BU04xX1ZBTFVFX251bShzayk7CisJCQkJCQkJaSsrLCB0ZGVyKyspCisJCQkodm9pZClza19BU04xX1ZBTFVFX3NldChzaywgaSwgdGRlci0+ZmllbGQpOworCQl9CisJT1BFTlNTTF9mcmVlKGRlcmxzdCk7CisJT1BFTlNTTF9mcmVlKHRtcGRhdCk7CisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IGFzbjFfaTJkX2V4X3ByaW1pdGl2ZShBU04xX1ZBTFVFICoqcHZhbCwgdW5zaWduZWQgY2hhciAqKm91dCwKKwkJCQljb25zdCBBU04xX0lURU0gKml0LCBpbnQgdGFnLCBpbnQgYWNsYXNzKQorCXsKKwlpbnQgbGVuOworCWludCB1dHlwZTsKKwlpbnQgdXNldGFnOworCWludCBuZGVmID0gMDsKKworCXV0eXBlID0gaXQtPnV0eXBlOworCisJLyogR2V0IGxlbmd0aCBvZiBjb250ZW50IG9jdGV0cyBhbmQgbWF5YmUgZmluZAorCSAqIG91dCB0aGUgdW5kZXJseWluZyB0eXBlLgorCSAqLworCisJbGVuID0gYXNuMV9leF9pMmMocHZhbCwgTlVMTCwgJnV0eXBlLCBpdCk7CisKKwkvKiBJZiBTRVFVRU5DRSwgU0VUIG9yIE9USEVSIHRoZW4gaGVhZGVyIGlzCisJICogaW5jbHVkZWQgaW4gcHNldWRvIGNvbnRlbnQgb2N0ZXRzIHNvIGRvbid0CisJICogaW5jbHVkZSB0YWcrbGVuZ3RoLiBXZSBuZWVkIHRvIGNoZWNrIGhlcmUKKwkgKiBiZWNhdXNlIHRoZSBjYWxsIHRvIGFzbjFfZXhfaTJjKCkgY291bGQgY2hhbmdlCisJICogdXR5cGUuCisJICovCisJaWYgKCh1dHlwZSA9PSBWX0FTTjFfU0VRVUVOQ0UpIHx8ICh1dHlwZSA9PSBWX0FTTjFfU0VUKSB8fAorCSAgICh1dHlwZSA9PSBWX0FTTjFfT1RIRVIpKQorCQl1c2V0YWcgPSAwOworCWVsc2UgdXNldGFnID0gMTsKKworCS8qIC0xIG1lYW5zIG9taXQgdHlwZSAqLworCisJaWYgKGxlbiA9PSAtMSkKKwkJcmV0dXJuIDA7CisKKwkvKiAtMiByZXR1cm4gaXMgc3BlY2lhbCBtZWFuaW5nIHVzZSBuZGVmICovCisJaWYgKGxlbiA9PSAtMikKKwkJeworCQluZGVmID0gMjsKKwkJbGVuID0gMDsKKwkJfQorCisJLyogSWYgbm90IGltcGxpY2l0bHkgdGFnZ2VkIGdldCB0YWcgZnJvbSB1bmRlcmx5aW5nIHR5cGUgKi8KKwlpZiAodGFnID09IC0xKSB0YWcgPSB1dHlwZTsKKworCS8qIE91dHB1dCB0YWcrbGVuZ3RoIGZvbGxvd2VkIGJ5IGNvbnRlbnQgb2N0ZXRzICovCisJaWYgKG91dCkKKwkJeworCQlpZiAodXNldGFnKQorCQkJQVNOMV9wdXRfb2JqZWN0KG91dCwgbmRlZiwgbGVuLCB0YWcsIGFjbGFzcyk7CisJCWFzbjFfZXhfaTJjKHB2YWwsICpvdXQsICZ1dHlwZSwgaXQpOworCQlpZiAobmRlZikKKwkJCUFTTjFfcHV0X2VvYyhvdXQpOworCQllbHNlCisJCQkqb3V0ICs9IGxlbjsKKwkJfQorCisJaWYgKHVzZXRhZykKKwkJcmV0dXJuIEFTTjFfb2JqZWN0X3NpemUobmRlZiwgbGVuLCB0YWcpOworCXJldHVybiBsZW47CisJfQorCisvKiBQcm9kdWNlIGNvbnRlbnQgb2N0ZXRzIGZyb20gYSBzdHJ1Y3R1cmUgKi8KKworaW50IGFzbjFfZXhfaTJjKEFTTjFfVkFMVUUgKipwdmFsLCB1bnNpZ25lZCBjaGFyICpjb3V0LCBpbnQgKnB1dHlwZSwKKwkJCQljb25zdCBBU04xX0lURU0gKml0KQorCXsKKwlBU04xX0JPT0xFQU4gKnRib29sID0gTlVMTDsKKwlBU04xX1NUUklORyAqc3RydG1wOworCUFTTjFfT0JKRUNUICpvdG1wOworCWludCB1dHlwZTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpjb250OworCXVuc2lnbmVkIGNoYXIgYzsKKwlpbnQgbGVuOworCWNvbnN0IEFTTjFfUFJJTUlUSVZFX0ZVTkNTICpwZjsKKwlwZiA9IGl0LT5mdW5jczsKKwlpZiAocGYgJiYgcGYtPnByaW1faTJjKQorCQlyZXR1cm4gcGYtPnByaW1faTJjKHB2YWwsIGNvdXQsIHB1dHlwZSwgaXQpOworCisJLyogU2hvdWxkIHR5cGUgYmUgb21pdHRlZD8gKi8KKwlpZiAoKGl0LT5pdHlwZSAhPSBBU04xX0lUWVBFX1BSSU1JVElWRSkKKwkJfHwgKGl0LT51dHlwZSAhPSBWX0FTTjFfQk9PTEVBTikpCisJCXsKKwkJaWYgKCEqcHZhbCkgcmV0dXJuIC0xOworCQl9CisKKwlpZiAoaXQtPml0eXBlID09IEFTTjFfSVRZUEVfTVNUUklORykKKwkJeworCQkvKiBJZiBNU1RSSU5HIHR5cGUgc2V0IHRoZSB1bmRlcmx5aW5nIHR5cGUgKi8KKwkJc3RydG1wID0gKEFTTjFfU1RSSU5HICopKnB2YWw7CisJCXV0eXBlID0gc3RydG1wLT50eXBlOworCQkqcHV0eXBlID0gdXR5cGU7CisJCX0KKwllbHNlIGlmIChpdC0+dXR5cGUgPT0gVl9BU04xX0FOWSkKKwkJeworCQkvKiBJZiBBTlkgc2V0IHR5cGUgYW5kIHBvaW50ZXIgdG8gdmFsdWUgKi8KKwkJQVNOMV9UWVBFICp0eXA7CisJCXR5cCA9IChBU04xX1RZUEUgKikqcHZhbDsKKwkJdXR5cGUgPSB0eXAtPnR5cGU7CisJCSpwdXR5cGUgPSB1dHlwZTsKKwkJcHZhbCA9ICZ0eXAtPnZhbHVlLmFzbjFfdmFsdWU7CisJCX0KKwllbHNlIHV0eXBlID0gKnB1dHlwZTsKKworCXN3aXRjaCh1dHlwZSkKKwkJeworCQljYXNlIFZfQVNOMV9PQkpFQ1Q6CisJCW90bXAgPSAoQVNOMV9PQkpFQ1QgKikqcHZhbDsKKwkJY29udCA9IG90bXAtPmRhdGE7CisJCWxlbiA9IG90bXAtPmxlbmd0aDsKKwkJYnJlYWs7CisKKwkJY2FzZSBWX0FTTjFfTlVMTDoKKwkJY29udCA9IE5VTEw7CisJCWxlbiA9IDA7CisJCWJyZWFrOworCisJCWNhc2UgVl9BU04xX0JPT0xFQU46CisJCXRib29sID0gKEFTTjFfQk9PTEVBTiAqKXB2YWw7CisJCWlmICgqdGJvb2wgPT0gLTEpCisJCQlyZXR1cm4gLTE7CisJCWlmIChpdC0+dXR5cGUgIT0gVl9BU04xX0FOWSkKKwkJCXsKKwkJCS8qIERlZmF1bHQgaGFuZGxpbmcgaWYgdmFsdWUgPT0gc2l6ZSBmaWVsZCB0aGVuIG9taXQgKi8KKwkJCWlmICgqdGJvb2wgJiYgKGl0LT5zaXplID4gMCkpCisJCQkJcmV0dXJuIC0xOworCQkJaWYgKCEqdGJvb2wgJiYgIWl0LT5zaXplKQorCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJYyA9ICh1bnNpZ25lZCBjaGFyKSp0Ym9vbDsKKwkJY29udCA9ICZjOworCQlsZW4gPSAxOworCQlicmVhazsKKworCQljYXNlIFZfQVNOMV9CSVRfU1RSSU5HOgorCQlyZXR1cm4gaTJjX0FTTjFfQklUX1NUUklORygoQVNOMV9CSVRfU1RSSU5HICopKnB2YWwsCisJCQkJCQkJY291dCA/ICZjb3V0IDogTlVMTCk7CisJCWJyZWFrOworCisJCWNhc2UgVl9BU04xX0lOVEVHRVI6CisJCWNhc2UgVl9BU04xX05FR19JTlRFR0VSOgorCQljYXNlIFZfQVNOMV9FTlVNRVJBVEVEOgorCQljYXNlIFZfQVNOMV9ORUdfRU5VTUVSQVRFRDoKKwkJLyogVGhlc2UgYXJlIGFsbCBoYXZlIHRoZSBzYW1lIGNvbnRlbnQgZm9ybWF0CisJCSAqIGFzIEFTTjFfSU5URUdFUgorCQkgKi8KKwkJcmV0dXJuIGkyY19BU04xX0lOVEVHRVIoKEFTTjFfSU5URUdFUiAqKSpwdmFsLAorCQkJCQkJCWNvdXQgPyAmY291dCA6IE5VTEwpOworCQlicmVhazsKKworCQljYXNlIFZfQVNOMV9PQ1RFVF9TVFJJTkc6CisJCWNhc2UgVl9BU04xX05VTUVSSUNTVFJJTkc6CisJCWNhc2UgVl9BU04xX1BSSU5UQUJMRVNUUklORzoKKwkJY2FzZSBWX0FTTjFfVDYxU1RSSU5HOgorCQljYXNlIFZfQVNOMV9WSURFT1RFWFNUUklORzoKKwkJY2FzZSBWX0FTTjFfSUE1U1RSSU5HOgorCQljYXNlIFZfQVNOMV9VVENUSU1FOgorCQljYXNlIFZfQVNOMV9HRU5FUkFMSVpFRFRJTUU6CisJCWNhc2UgVl9BU04xX0dSQVBISUNTVFJJTkc6CisJCWNhc2UgVl9BU04xX1ZJU0lCTEVTVFJJTkc6CisJCWNhc2UgVl9BU04xX0dFTkVSQUxTVFJJTkc6CisJCWNhc2UgVl9BU04xX1VOSVZFUlNBTFNUUklORzoKKwkJY2FzZSBWX0FTTjFfQk1QU1RSSU5HOgorCQljYXNlIFZfQVNOMV9VVEY4U1RSSU5HOgorCQljYXNlIFZfQVNOMV9TRVFVRU5DRToKKwkJY2FzZSBWX0FTTjFfU0VUOgorCQlkZWZhdWx0OgorCQkvKiBBbGwgYmFzZWQgb24gQVNOMV9TVFJJTkcgYW5kIGhhbmRsZWQgdGhlIHNhbWUgKi8KKwkJc3RydG1wID0gKEFTTjFfU1RSSU5HICopKnB2YWw7CisJCS8qIFNwZWNpYWwgaGFuZGxpbmcgZm9yIE5ERUYgKi8KKwkJaWYgKChpdC0+c2l6ZSA9PSBBU04xX1RGTEdfTkRFRikKKwkJCSYmIChzdHJ0bXAtPmZsYWdzICYgQVNOMV9TVFJJTkdfRkxBR19OREVGKSkKKwkJCXsKKwkJCWlmIChjb3V0KQorCQkJCXsKKwkJCQlzdHJ0bXAtPmRhdGEgPSBjb3V0OworCQkJCXN0cnRtcC0+bGVuZ3RoID0gMDsKKwkJCQl9CisJCQkvKiBTcGVjaWFsIHJldHVybiBjb2RlICovCisJCQlyZXR1cm4gLTI7CisJCQl9CisJCWNvbnQgPSBzdHJ0bXAtPmRhdGE7CisJCWxlbiA9IHN0cnRtcC0+bGVuZ3RoOworCisJCWJyZWFrOworCisJCX0KKwlpZiAoY291dCAmJiBsZW4pCisJCW1lbWNweShjb3V0LCBjb250LCBsZW4pOworCXJldHVybiBsZW47CisJfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FzbjEvdGFzbl9mcmUuYyBiL2NyeXB0by9hc24xL3Rhc25fZnJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM0NGVkNwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9hc24xL3Rhc25fZnJlLmMKQEAgLTAsMCArMSwyNjQgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorCisKK3N0YXRpYyB2b2lkIGFzbjFfaXRlbV9jb21iaW5lX2ZyZWUoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQsIGludCBjb21iaW5lKTsKKworLyogRnJlZSB1cCBhbiBBU04xIHN0cnVjdHVyZSAqLworCit2b2lkIEFTTjFfaXRlbV9mcmVlKEFTTjFfVkFMVUUgKnZhbCwgY29uc3QgQVNOMV9JVEVNICppdCkKKwl7CisJYXNuMV9pdGVtX2NvbWJpbmVfZnJlZSgmdmFsLCBpdCwgMCk7CisJfQorCit2b2lkIEFTTjFfaXRlbV9leF9mcmVlKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0KQorCXsKKwlhc24xX2l0ZW1fY29tYmluZV9mcmVlKHB2YWwsIGl0LCAwKTsKKwl9CisKK3N0YXRpYyB2b2lkIGFzbjFfaXRlbV9jb21iaW5lX2ZyZWUoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQsIGludCBjb21iaW5lKQorCXsKKwljb25zdCBBU04xX1RFTVBMQVRFICp0dCA9IE5VTEwsICpzZXF0dDsKKwljb25zdCBBU04xX0VYVEVSTl9GVU5DUyAqZWY7CisJY29uc3QgQVNOMV9DT01QQVRfRlVOQ1MgKmNmOworCWNvbnN0IEFTTjFfQVVYICphdXggPSBpdC0+ZnVuY3M7CisJQVNOMV9hdXhfY2IgKmFzbjFfY2I7CisJaW50IGk7CisJaWYgKCFwdmFsKQorCQlyZXR1cm47CisJaWYgKChpdC0+aXR5cGUgIT0gQVNOMV9JVFlQRV9QUklNSVRJVkUpICYmICEqcHZhbCkKKwkJcmV0dXJuOworCWlmIChhdXggJiYgYXV4LT5hc24xX2NiKQorCQlhc24xX2NiID0gYXV4LT5hc24xX2NiOworCWVsc2UKKwkJYXNuMV9jYiA9IDA7CisKKwlzd2l0Y2goaXQtPml0eXBlKQorCQl7CisKKwkJY2FzZSBBU04xX0lUWVBFX1BSSU1JVElWRToKKwkJaWYgKGl0LT50ZW1wbGF0ZXMpCisJCQlBU04xX3RlbXBsYXRlX2ZyZWUocHZhbCwgaXQtPnRlbXBsYXRlcyk7CisJCWVsc2UKKwkJCUFTTjFfcHJpbWl0aXZlX2ZyZWUocHZhbCwgaXQpOworCQlicmVhazsKKworCQljYXNlIEFTTjFfSVRZUEVfTVNUUklORzoKKwkJQVNOMV9wcmltaXRpdmVfZnJlZShwdmFsLCBpdCk7CisJCWJyZWFrOworCisJCWNhc2UgQVNOMV9JVFlQRV9DSE9JQ0U6CisJCWlmIChhc24xX2NiKQorCQkJeworCQkJaSA9IGFzbjFfY2IoQVNOMV9PUF9GUkVFX1BSRSwgcHZhbCwgaXQsIE5VTEwpOworCQkJaWYgKGkgPT0gMikKKwkJCQlyZXR1cm47CisJCQl9CisJCWkgPSBhc24xX2dldF9jaG9pY2Vfc2VsZWN0b3IocHZhbCwgaXQpOworCQlpZiAoKGkgPj0gMCkgJiYgKGkgPCBpdC0+dGNvdW50KSkKKwkJCXsKKwkJCUFTTjFfVkFMVUUgKipwY2h2YWw7CisJCQl0dCA9IGl0LT50ZW1wbGF0ZXMgKyBpOworCQkJcGNodmFsID0gYXNuMV9nZXRfZmllbGRfcHRyKHB2YWwsIHR0KTsKKwkJCUFTTjFfdGVtcGxhdGVfZnJlZShwY2h2YWwsIHR0KTsKKwkJCX0KKwkJaWYgKGFzbjFfY2IpCisJCQlhc24xX2NiKEFTTjFfT1BfRlJFRV9QT1NULCBwdmFsLCBpdCwgTlVMTCk7CisJCWlmICghY29tYmluZSkKKwkJCXsKKwkJCU9QRU5TU0xfZnJlZSgqcHZhbCk7CisJCQkqcHZhbCA9IE5VTEw7CisJCQl9CisJCWJyZWFrOworCisJCWNhc2UgQVNOMV9JVFlQRV9DT01QQVQ6CisJCWNmID0gaXQtPmZ1bmNzOworCQlpZiAoY2YgJiYgY2YtPmFzbjFfZnJlZSkKKwkJCWNmLT5hc24xX2ZyZWUoKnB2YWwpOworCQlicmVhazsKKworCQljYXNlIEFTTjFfSVRZUEVfRVhURVJOOgorCQllZiA9IGl0LT5mdW5jczsKKwkJaWYgKGVmICYmIGVmLT5hc24xX2V4X2ZyZWUpCisJCQllZi0+YXNuMV9leF9mcmVlKHB2YWwsIGl0KTsKKwkJYnJlYWs7CisKKwkJY2FzZSBBU04xX0lUWVBFX05ERUZfU0VRVUVOQ0U6CisJCWNhc2UgQVNOMV9JVFlQRV9TRVFVRU5DRToKKwkJaWYgKGFzbjFfZG9fbG9jayhwdmFsLCAtMSwgaXQpID4gMCkKKwkJCXJldHVybjsKKwkJaWYgKGFzbjFfY2IpCisJCQl7CisJCQlpID0gYXNuMV9jYihBU04xX09QX0ZSRUVfUFJFLCBwdmFsLCBpdCwgTlVMTCk7CisJCQlpZiAoaSA9PSAyKQorCQkJCXJldHVybjsKKwkJCX0JCQorCQlhc24xX2VuY19mcmVlKHB2YWwsIGl0KTsKKwkJLyogSWYgd2UgZnJlZSB1cCBhcyBub3JtYWwgd2Ugd2lsbCBpbnZhbGlkYXRlIGFueQorCQkgKiBBTlkgREVGSU5FRCBCWSBmaWVsZCBhbmQgd2Ugd29udCBiZSBhYmxlIHRvIAorCQkgKiBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgdGhlIGZpZWxkIGl0IGRlZmluZXMuIFNvCisJCSAqIGZyZWUgdXAgaW4gcmV2ZXJzZSBvcmRlci4KKwkJICovCisJCXR0ID0gaXQtPnRlbXBsYXRlcyArIGl0LT50Y291bnQgLSAxOworCQlmb3IgKGkgPSAwOyBpIDwgaXQtPnRjb3VudDsgdHQtLSwgaSsrKQorCQkJeworCQkJQVNOMV9WQUxVRSAqKnBzZXF2YWw7CisJCQlzZXF0dCA9IGFzbjFfZG9fYWRiKHB2YWwsIHR0LCAwKTsKKwkJCWlmICghc2VxdHQpCisJCQkJY29udGludWU7CisJCQlwc2VxdmFsID0gYXNuMV9nZXRfZmllbGRfcHRyKHB2YWwsIHNlcXR0KTsKKwkJCUFTTjFfdGVtcGxhdGVfZnJlZShwc2VxdmFsLCBzZXF0dCk7CisJCQl9CisJCWlmIChhc24xX2NiKQorCQkJYXNuMV9jYihBU04xX09QX0ZSRUVfUE9TVCwgcHZhbCwgaXQsIE5VTEwpOworCQlpZiAoIWNvbWJpbmUpCisJCQl7CisJCQlPUEVOU1NMX2ZyZWUoKnB2YWwpOworCQkJKnB2YWwgPSBOVUxMOworCQkJfQorCQlicmVhazsKKwkJfQorCX0KKwordm9pZCBBU04xX3RlbXBsYXRlX2ZyZWUoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfVEVNUExBVEUgKnR0KQorCXsKKwlzaXplX3QgaTsKKwlpZiAodHQtPmZsYWdzICYgQVNOMV9URkxHX1NLX01BU0spCisJCXsKKwkJU1RBQ0tfT0YoQVNOMV9WQUxVRSkgKnNrID0gKFNUQUNLX09GKEFTTjFfVkFMVUUpICopKnB2YWw7CisJCWZvciAoaSA9IDA7IGkgPCBza19BU04xX1ZBTFVFX251bShzayk7IGkrKykKKwkJCXsKKwkJCUFTTjFfVkFMVUUgKnZ0bXA7CisJCQl2dG1wID0gc2tfQVNOMV9WQUxVRV92YWx1ZShzaywgaSk7CisJCQlhc24xX2l0ZW1fY29tYmluZV9mcmVlKCZ2dG1wLCBBU04xX0lURU1fcHRyKHR0LT5pdGVtKSwKKwkJCQkJCQkJCTApOworCQkJfQorCQlza19BU04xX1ZBTFVFX2ZyZWUoc2spOworCQkqcHZhbCA9IE5VTEw7CisJCX0KKwllbHNlCisJCWFzbjFfaXRlbV9jb21iaW5lX2ZyZWUocHZhbCwgQVNOMV9JVEVNX3B0cih0dC0+aXRlbSksCisJCQkJCQl0dC0+ZmxhZ3MgJiBBU04xX1RGTEdfQ09NQklORSk7CisJfQorCit2b2lkIEFTTjFfcHJpbWl0aXZlX2ZyZWUoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQpCisJeworCWludCB1dHlwZTsKKwlpZiAoaXQpCisJCXsKKwkJY29uc3QgQVNOMV9QUklNSVRJVkVfRlVOQ1MgKnBmOworCQlwZiA9IGl0LT5mdW5jczsKKwkJaWYgKHBmICYmIHBmLT5wcmltX2ZyZWUpCisJCQl7CisJCQlwZi0+cHJpbV9mcmVlKHB2YWwsIGl0KTsKKwkJCXJldHVybjsKKwkJCX0KKwkJfQorCS8qIFNwZWNpYWwgY2FzZTogaWYgJ2l0JyBpcyBOVUxMIGZyZWUgY29udGVudHMgb2YgQVNOMV9UWVBFICovCisJaWYgKCFpdCkKKwkJeworCQlBU04xX1RZUEUgKnR5cCA9IChBU04xX1RZUEUgKikqcHZhbDsKKwkJdXR5cGUgPSB0eXAtPnR5cGU7CisJCXB2YWwgPSAmdHlwLT52YWx1ZS5hc24xX3ZhbHVlOworCQlpZiAoISpwdmFsKQorCQkJcmV0dXJuOworCQl9CisJZWxzZSBpZiAoaXQtPml0eXBlID09IEFTTjFfSVRZUEVfTVNUUklORykKKwkJeworCQl1dHlwZSA9IC0xOworCQlpZiAoISpwdmFsKQorCQkJcmV0dXJuOworCQl9CisJZWxzZQorCQl7CisJCXV0eXBlID0gaXQtPnV0eXBlOworCQlpZiAoKHV0eXBlICE9IFZfQVNOMV9CT09MRUFOKSAmJiAhKnB2YWwpCisJCQlyZXR1cm47CisJCX0KKworCXN3aXRjaCh1dHlwZSkKKwkJeworCQljYXNlIFZfQVNOMV9PQkpFQ1Q6CisJCUFTTjFfT0JKRUNUX2ZyZWUoKEFTTjFfT0JKRUNUICopKnB2YWwpOworCQlicmVhazsKKworCQljYXNlIFZfQVNOMV9CT09MRUFOOgorCQlpZiAoaXQpCisJCQkqKEFTTjFfQk9PTEVBTiAqKXB2YWwgPSBpdC0+c2l6ZTsKKwkJZWxzZQorCQkJKihBU04xX0JPT0xFQU4gKilwdmFsID0gLTE7CisJCXJldHVybjsKKworCQljYXNlIFZfQVNOMV9OVUxMOgorCQlicmVhazsKKworCQljYXNlIFZfQVNOMV9BTlk6CisJCUFTTjFfcHJpbWl0aXZlX2ZyZWUocHZhbCwgTlVMTCk7CisJCU9QRU5TU0xfZnJlZSgqcHZhbCk7CisJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCUFTTjFfU1RSSU5HX2ZyZWUoKEFTTjFfU1RSSU5HICopKnB2YWwpOworCQkqcHZhbCA9IE5VTEw7CisJCWJyZWFrOworCQl9CisJKnB2YWwgPSBOVUxMOworCX0KZGlmZiAtLWdpdCBhL2NyeXB0by9hc24xL3Rhc25fbmV3LmMgYi9jcnlwdG8vYXNuMS90YXNuX25ldy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMmIyN2QKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYXNuMS90YXNuX25ldy5jCkBAIC0wLDAgKzEsMzk0IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqLmg+CisKKworc3RhdGljIGludCBhc24xX2l0ZW1fZXhfY29tYmluZV9uZXcoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQsCisJCQkJCQkJCWludCBjb21iaW5lKTsKK3N0YXRpYyB2b2lkIGFzbjFfaXRlbV9jbGVhcihBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9JVEVNICppdCk7CitzdGF0aWMgdm9pZCBhc24xX3RlbXBsYXRlX2NsZWFyKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX1RFTVBMQVRFICp0dCk7CitzdGF0aWMgdm9pZCBhc24xX3ByaW1pdGl2ZV9jbGVhcihBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9JVEVNICppdCk7CisKK0FTTjFfVkFMVUUgKkFTTjFfaXRlbV9uZXcoY29uc3QgQVNOMV9JVEVNICppdCkKKwl7CisJQVNOMV9WQUxVRSAqcmV0ID0gTlVMTDsKKwlpZiAoQVNOMV9pdGVtX2V4X25ldygmcmV0LCBpdCkgPiAwKQorCQlyZXR1cm4gcmV0OworCXJldHVybiBOVUxMOworCX0KKworLyogQWxsb2NhdGUgYW4gQVNOMSBzdHJ1Y3R1cmUgKi8KKworaW50IEFTTjFfaXRlbV9leF9uZXcoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQpCisJeworCXJldHVybiBhc24xX2l0ZW1fZXhfY29tYmluZV9uZXcocHZhbCwgaXQsIDApOworCX0KKworc3RhdGljIGludCBhc24xX2l0ZW1fZXhfY29tYmluZV9uZXcoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQsCisJCQkJCQkJCWludCBjb21iaW5lKQorCXsKKwljb25zdCBBU04xX1RFTVBMQVRFICp0dCA9IE5VTEw7CisJY29uc3QgQVNOMV9DT01QQVRfRlVOQ1MgKmNmOworCWNvbnN0IEFTTjFfRVhURVJOX0ZVTkNTICplZjsKKwljb25zdCBBU04xX0FVWCAqYXV4ID0gaXQtPmZ1bmNzOworCUFTTjFfYXV4X2NiICphc24xX2NiOworCUFTTjFfVkFMVUUgKipwc2VxdmFsOworCWludCBpOworCWlmIChhdXggJiYgYXV4LT5hc24xX2NiKQorCQlhc24xX2NiID0gYXV4LT5hc24xX2NiOworCWVsc2UKKwkJYXNuMV9jYiA9IDA7CisKKwlpZiAoIWNvbWJpbmUpICpwdmFsID0gTlVMTDsKKworI2lmZGVmIENSWVBUT19NREVCVUcKKwlpZiAoaXQtPnNuYW1lKQorCQlDUllQVE9fcHVzaF9pbmZvKGl0LT5zbmFtZSk7CisjZW5kaWYKKworCXN3aXRjaChpdC0+aXR5cGUpCisJCXsKKworCQljYXNlIEFTTjFfSVRZUEVfRVhURVJOOgorCQllZiA9IGl0LT5mdW5jczsKKwkJaWYgKGVmICYmIGVmLT5hc24xX2V4X25ldykKKwkJCXsKKwkJCWlmICghZWYtPmFzbjFfZXhfbmV3KHB2YWwsIGl0KSkKKwkJCQlnb3RvIG1lbWVycjsKKwkJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBBU04xX0lUWVBFX0NPTVBBVDoKKwkJY2YgPSBpdC0+ZnVuY3M7CisJCWlmIChjZiAmJiBjZi0+YXNuMV9uZXcpIHsKKwkJCSpwdmFsID0gY2YtPmFzbjFfbmV3KCk7CisJCQlpZiAoISpwdmFsKQorCQkJCWdvdG8gbWVtZXJyOworCQl9CisJCWJyZWFrOworCisJCWNhc2UgQVNOMV9JVFlQRV9QUklNSVRJVkU6CisJCWlmIChpdC0+dGVtcGxhdGVzKQorCQkJeworCQkJaWYgKCFBU04xX3RlbXBsYXRlX25ldyhwdmFsLCBpdC0+dGVtcGxhdGVzKSkKKwkJCQlnb3RvIG1lbWVycjsKKwkJCX0KKwkJZWxzZSBpZiAoIUFTTjFfcHJpbWl0aXZlX25ldyhwdmFsLCBpdCkpCisJCQkJZ290byBtZW1lcnI7CisJCWJyZWFrOworCisJCWNhc2UgQVNOMV9JVFlQRV9NU1RSSU5HOgorCQlpZiAoIUFTTjFfcHJpbWl0aXZlX25ldyhwdmFsLCBpdCkpCisJCQkJZ290byBtZW1lcnI7CisJCWJyZWFrOworCisJCWNhc2UgQVNOMV9JVFlQRV9DSE9JQ0U6CisJCWlmIChhc24xX2NiKQorCQkJeworCQkJaSA9IGFzbjFfY2IoQVNOMV9PUF9ORVdfUFJFLCBwdmFsLCBpdCwgTlVMTCk7CisJCQlpZiAoIWkpCisJCQkJZ290byBhdXhlcnI7CisJCQlpZiAoaT09MikKKwkJCQl7CisjaWZkZWYgQ1JZUFRPX01ERUJVRworCQkJCWlmIChpdC0+c25hbWUpCisJCQkJCUNSWVBUT19wb3BfaW5mbygpOworI2VuZGlmCisJCQkJcmV0dXJuIDE7CisJCQkJfQorCQkJfQorCQlpZiAoIWNvbWJpbmUpCisJCQl7CisJCQkqcHZhbCA9IE9QRU5TU0xfbWFsbG9jKGl0LT5zaXplKTsKKwkJCWlmICghKnB2YWwpCisJCQkJZ290byBtZW1lcnI7CisJCQltZW1zZXQoKnB2YWwsIDAsIGl0LT5zaXplKTsKKwkJCX0KKwkJYXNuMV9zZXRfY2hvaWNlX3NlbGVjdG9yKHB2YWwsIC0xLCBpdCk7CisJCWlmIChhc24xX2NiICYmICFhc24xX2NiKEFTTjFfT1BfTkVXX1BPU1QsIHB2YWwsIGl0LCBOVUxMKSkKKwkJCQlnb3RvIGF1eGVycjsKKwkJYnJlYWs7CisKKwkJY2FzZSBBU04xX0lUWVBFX05ERUZfU0VRVUVOQ0U6CisJCWNhc2UgQVNOMV9JVFlQRV9TRVFVRU5DRToKKwkJaWYgKGFzbjFfY2IpCisJCQl7CisJCQlpID0gYXNuMV9jYihBU04xX09QX05FV19QUkUsIHB2YWwsIGl0LCBOVUxMKTsKKwkJCWlmICghaSkKKwkJCQlnb3RvIGF1eGVycjsKKwkJCWlmIChpPT0yKQorCQkJCXsKKyNpZmRlZiBDUllQVE9fTURFQlVHCisJCQkJaWYgKGl0LT5zbmFtZSkKKwkJCQkJQ1JZUFRPX3BvcF9pbmZvKCk7CisjZW5kaWYKKwkJCQlyZXR1cm4gMTsKKwkJCQl9CisJCQl9CisJCWlmICghY29tYmluZSkKKwkJCXsKKwkJCSpwdmFsID0gT1BFTlNTTF9tYWxsb2MoaXQtPnNpemUpOworCQkJaWYgKCEqcHZhbCkKKwkJCQlnb3RvIG1lbWVycjsKKwkJCW1lbXNldCgqcHZhbCwgMCwgaXQtPnNpemUpOworCQkJYXNuMV9kb19sb2NrKHB2YWwsIDAsIGl0KTsKKwkJCWFzbjFfZW5jX2luaXQocHZhbCwgaXQpOworCQkJfQorCQlmb3IgKGkgPSAwLCB0dCA9IGl0LT50ZW1wbGF0ZXM7IGkgPCBpdC0+dGNvdW50OyB0dCsrLCBpKyspCisJCQl7CisJCQlwc2VxdmFsID0gYXNuMV9nZXRfZmllbGRfcHRyKHB2YWwsIHR0KTsKKwkJCWlmICghQVNOMV90ZW1wbGF0ZV9uZXcocHNlcXZhbCwgdHQpKQorCQkJCWdvdG8gbWVtZXJyOworCQkJfQorCQlpZiAoYXNuMV9jYiAmJiAhYXNuMV9jYihBU04xX09QX05FV19QT1NULCBwdmFsLCBpdCwgTlVMTCkpCisJCQkJZ290byBhdXhlcnI7CisJCWJyZWFrOworCX0KKyNpZmRlZiBDUllQVE9fTURFQlVHCisJaWYgKGl0LT5zbmFtZSkgQ1JZUFRPX3BvcF9pbmZvKCk7CisjZW5kaWYKKwlyZXR1cm4gMTsKKworCW1lbWVycjoKKwlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2l0ZW1fZXhfY29tYmluZV9uZXcsICBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisjaWZkZWYgQ1JZUFRPX01ERUJVRworCWlmIChpdC0+c25hbWUpIENSWVBUT19wb3BfaW5mbygpOworI2VuZGlmCisJcmV0dXJuIDA7CisKKwlhdXhlcnI6CisJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9pdGVtX2V4X2NvbWJpbmVfbmV3LCAgQVNOMV9SX0FVWF9FUlJPUik7CisJQVNOMV9pdGVtX2V4X2ZyZWUocHZhbCwgaXQpOworI2lmZGVmIENSWVBUT19NREVCVUcKKwlpZiAoaXQtPnNuYW1lKSBDUllQVE9fcG9wX2luZm8oKTsKKyNlbmRpZgorCXJldHVybiAwOworCisJfQorCitzdGF0aWMgdm9pZCBhc24xX2l0ZW1fY2xlYXIoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQpCisJeworCWNvbnN0IEFTTjFfRVhURVJOX0ZVTkNTICplZjsKKworCXN3aXRjaChpdC0+aXR5cGUpCisJCXsKKworCQljYXNlIEFTTjFfSVRZUEVfRVhURVJOOgorCQllZiA9IGl0LT5mdW5jczsKKwkJaWYgKGVmICYmIGVmLT5hc24xX2V4X2NsZWFyKSAKKwkJCWVmLT5hc24xX2V4X2NsZWFyKHB2YWwsIGl0KTsKKwkJZWxzZSAqcHZhbCA9IE5VTEw7CisJCWJyZWFrOworCisKKwkJY2FzZSBBU04xX0lUWVBFX1BSSU1JVElWRToKKwkJaWYgKGl0LT50ZW1wbGF0ZXMpIAorCQkJYXNuMV90ZW1wbGF0ZV9jbGVhcihwdmFsLCBpdC0+dGVtcGxhdGVzKTsKKwkJZWxzZQorCQkJYXNuMV9wcmltaXRpdmVfY2xlYXIocHZhbCwgaXQpOworCQlicmVhazsKKworCQljYXNlIEFTTjFfSVRZUEVfTVNUUklORzoKKwkJYXNuMV9wcmltaXRpdmVfY2xlYXIocHZhbCwgaXQpOworCQlicmVhazsKKworCQljYXNlIEFTTjFfSVRZUEVfQ09NUEFUOgorCQljYXNlIEFTTjFfSVRZUEVfQ0hPSUNFOgorCQljYXNlIEFTTjFfSVRZUEVfU0VRVUVOQ0U6CisJCWNhc2UgQVNOMV9JVFlQRV9OREVGX1NFUVVFTkNFOgorCQkqcHZhbCA9IE5VTEw7CisJCWJyZWFrOworCQl9CisJfQorCisKK2ludCBBU04xX3RlbXBsYXRlX25ldyhBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9URU1QTEFURSAqdHQpCisJeworCWNvbnN0IEFTTjFfSVRFTSAqaXQgPSBBU04xX0lURU1fcHRyKHR0LT5pdGVtKTsKKwlpbnQgcmV0OworCWlmICh0dC0+ZmxhZ3MgJiBBU04xX1RGTEdfT1BUSU9OQUwpCisJCXsKKwkJYXNuMV90ZW1wbGF0ZV9jbGVhcihwdmFsLCB0dCk7CisJCXJldHVybiAxOworCQl9CisJLyogSWYgQU5ZIERFRklORUQgQlkgbm90aGluZyB0byBkbyAqLworCisJaWYgKHR0LT5mbGFncyAmIEFTTjFfVEZMR19BREJfTUFTSykKKwkJeworCQkqcHZhbCA9IE5VTEw7CisJCXJldHVybiAxOworCQl9CisjaWZkZWYgQ1JZUFRPX01ERUJVRworCWlmICh0dC0+ZmllbGRfbmFtZSkKKwkJQ1JZUFRPX3B1c2hfaW5mbyh0dC0+ZmllbGRfbmFtZSk7CisjZW5kaWYKKwkvKiBJZiBTRVQgT0Ygb3IgU0VRVUVOQ0UgT0YsIGl0cyBhIFNUQUNLICovCisJaWYgKHR0LT5mbGFncyAmIEFTTjFfVEZMR19TS19NQVNLKQorCQl7CisJCVNUQUNLX09GKEFTTjFfVkFMVUUpICpza3ZhbDsKKwkJc2t2YWwgPSBza19BU04xX1ZBTFVFX25ld19udWxsKCk7CisJCWlmICghc2t2YWwpCisJCQl7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX3RlbXBsYXRlX25ldywgIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldCA9IDA7CisJCQlnb3RvIGRvbmU7CisJCQl9CisJCSpwdmFsID0gKEFTTjFfVkFMVUUgKilza3ZhbDsKKwkJcmV0ID0gMTsKKwkJZ290byBkb25lOworCQl9CisJLyogT3RoZXJ3aXNlIHBhc3MgaXQgYmFjayB0byB0aGUgaXRlbSByb3V0aW5lICovCisJcmV0ID0gYXNuMV9pdGVtX2V4X2NvbWJpbmVfbmV3KHB2YWwsIGl0LCB0dC0+ZmxhZ3MgJiBBU04xX1RGTEdfQ09NQklORSk7CisJZG9uZToKKyNpZmRlZiBDUllQVE9fTURFQlVHCisJaWYgKGl0LT5zbmFtZSkKKwkJQ1JZUFRPX3BvcF9pbmZvKCk7CisjZW5kaWYKKwlyZXR1cm4gcmV0OworCX0KKworc3RhdGljIHZvaWQgYXNuMV90ZW1wbGF0ZV9jbGVhcihBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9URU1QTEFURSAqdHQpCisJeworCS8qIElmIEFEQiBvciBTVEFDSyBqdXN0IE5VTEwgdGhlIGZpZWxkICovCisJaWYgKHR0LT5mbGFncyAmIChBU04xX1RGTEdfQURCX01BU0t8QVNOMV9URkxHX1NLX01BU0spKSAKKwkJKnB2YWwgPSBOVUxMOworCWVsc2UKKwkJYXNuMV9pdGVtX2NsZWFyKHB2YWwsIEFTTjFfSVRFTV9wdHIodHQtPml0ZW0pKTsKKwl9CisKKworLyogTkI6IGNvdWxkIHByb2JhYmx5IGNvbWJpbmUgbW9zdCBvZiB0aGUgcmVhbCBYWFhfbmV3KCkgYmVoYXZpb3VyIGFuZCBqdW5rCisgKiBhbGwgdGhlIG9sZCBmdW5jdGlvbnMuCisgKi8KKworaW50IEFTTjFfcHJpbWl0aXZlX25ldyhBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9JVEVNICppdCkKKwl7CisJQVNOMV9UWVBFICp0eXA7CisJQVNOMV9TVFJJTkcgKnN0cjsKKwlpbnQgdXR5cGU7CisKKwlpZiAoaXQgJiYgaXQtPmZ1bmNzKQorCQl7CisJCWNvbnN0IEFTTjFfUFJJTUlUSVZFX0ZVTkNTICpwZiA9IGl0LT5mdW5jczsKKwkJaWYgKHBmLT5wcmltX25ldykKKwkJCXJldHVybiBwZi0+cHJpbV9uZXcocHZhbCwgaXQpOworCQl9CisKKwlpZiAoIWl0IHx8IChpdC0+aXR5cGUgPT0gQVNOMV9JVFlQRV9NU1RSSU5HKSkKKwkJdXR5cGUgPSAtMTsKKwllbHNlCisJCXV0eXBlID0gaXQtPnV0eXBlOworCXN3aXRjaCh1dHlwZSkKKwkJeworCQljYXNlIFZfQVNOMV9PQkpFQ1Q6CisJCSpwdmFsID0gKEFTTjFfVkFMVUUgKilPQkpfbmlkMm9iaihOSURfdW5kZWYpOworCQlyZXR1cm4gMTsKKworCQljYXNlIFZfQVNOMV9CT09MRUFOOgorCQkqKEFTTjFfQk9PTEVBTiAqKXB2YWwgPSBpdC0+c2l6ZTsKKwkJcmV0dXJuIDE7CisKKwkJY2FzZSBWX0FTTjFfTlVMTDoKKwkJKnB2YWwgPSAoQVNOMV9WQUxVRSAqKTE7CisJCXJldHVybiAxOworCisJCWNhc2UgVl9BU04xX0FOWToKKwkJdHlwID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEFTTjFfVFlQRSkpOworCQlpZiAoIXR5cCkKKwkJCXJldHVybiAwOworCQl0eXAtPnZhbHVlLnB0ciA9IE5VTEw7CisJCXR5cC0+dHlwZSA9IC0xOworCQkqcHZhbCA9IChBU04xX1ZBTFVFICopdHlwOworCQlicmVhazsKKworCQlkZWZhdWx0OgorCQlzdHIgPSBBU04xX1NUUklOR190eXBlX25ldyh1dHlwZSk7CisJCWlmIChpdC0+aXR5cGUgPT0gQVNOMV9JVFlQRV9NU1RSSU5HICYmIHN0cikKKwkJCXN0ci0+ZmxhZ3MgfD0gQVNOMV9TVFJJTkdfRkxBR19NU1RSSU5HOworCQkqcHZhbCA9IChBU04xX1ZBTFVFICopc3RyOworCQlicmVhazsKKwkJfQorCWlmICgqcHZhbCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7CisJfQorCitzdGF0aWMgdm9pZCBhc24xX3ByaW1pdGl2ZV9jbGVhcihBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9JVEVNICppdCkKKwl7CisJaW50IHV0eXBlOworCWlmIChpdCAmJiBpdC0+ZnVuY3MpCisJCXsKKwkJY29uc3QgQVNOMV9QUklNSVRJVkVfRlVOQ1MgKnBmID0gaXQtPmZ1bmNzOworCQlpZiAocGYtPnByaW1fY2xlYXIpCisJCQlwZi0+cHJpbV9jbGVhcihwdmFsLCBpdCk7CisJCWVsc2UgCisJCQkqcHZhbCA9IE5VTEw7CisJCXJldHVybjsKKwkJfQorCWlmICghaXQgfHwgKGl0LT5pdHlwZSA9PSBBU04xX0lUWVBFX01TVFJJTkcpKQorCQl1dHlwZSA9IC0xOworCWVsc2UKKwkJdXR5cGUgPSBpdC0+dXR5cGU7CisJaWYgKHV0eXBlID09IFZfQVNOMV9CT09MRUFOKQorCQkqKEFTTjFfQk9PTEVBTiAqKXB2YWwgPSBpdC0+c2l6ZTsKKwllbHNlICpwdmFsID0gTlVMTDsKKwl9CmRpZmYgLS1naXQgYS9jcnlwdG8vYXNuMS90YXNuX3Bybi5jIGIvY3J5cHRvL2FzbjEvdGFzbl9wcm4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjEwY2ZlCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2FzbjEvdGFzbl9wcm4uYwpAQCAtMCwwICsxLDYzOSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorCisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorCisjaW5jbHVkZSAiYXNuMV9sb2NsLmgiCisKKworCisvKiBQcmludCByb3V0aW5lcy4KKyAqLworCisvKiBBU04xX1BDVFggcm91dGluZXMgKi8KKworQVNOMV9QQ1RYIGRlZmF1bHRfcGN0eCA9IAorCXsKKwlBU04xX1BDVFhfRkxBR1NfU0hPV19BQlNFTlQsCS8qIGZsYWdzICovCisJMCwJLyogbm1fZmxhZ3MgKi8KKwkwLAkvKiBjZXJ0X2ZsYWdzICovCisJMCwJLyogb2lkX2ZsYWdzICovCisJMAkvKiBzdHJfZmxhZ3MgKi8KKwl9OworCQorCitBU04xX1BDVFggKkFTTjFfUENUWF9uZXcodm9pZCkKKwl7CisJQVNOMV9QQ1RYICpyZXQ7CisJcmV0ID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEFTTjFfUENUWCkpOworCWlmIChyZXQgPT0gTlVMTCkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1BDVFhfbmV3LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiBOVUxMOworCQl9CisJcmV0LT5mbGFncyA9IDA7CisJcmV0LT5ubV9mbGFncyA9IDA7CisJcmV0LT5jZXJ0X2ZsYWdzID0gMDsKKwlyZXQtPm9pZF9mbGFncyA9IDA7CisJcmV0LT5zdHJfZmxhZ3MgPSAwOworCXJldHVybiByZXQ7CisJfQorCit2b2lkIEFTTjFfUENUWF9mcmVlKEFTTjFfUENUWCAqcCkKKwl7CisJT1BFTlNTTF9mcmVlKHApOworCX0KKwordW5zaWduZWQgbG9uZyBBU04xX1BDVFhfZ2V0X2ZsYWdzKEFTTjFfUENUWCAqcCkKKwl7CisJcmV0dXJuIHAtPmZsYWdzOworCX0KKwordm9pZCBBU04xX1BDVFhfc2V0X2ZsYWdzKEFTTjFfUENUWCAqcCwgdW5zaWduZWQgbG9uZyBmbGFncykKKwl7CisJcC0+ZmxhZ3MgPSBmbGFnczsKKwl9CisKK3Vuc2lnbmVkIGxvbmcgQVNOMV9QQ1RYX2dldF9ubV9mbGFncyhBU04xX1BDVFggKnApCisJeworCXJldHVybiBwLT5ubV9mbGFnczsKKwl9CisKK3ZvaWQgQVNOMV9QQ1RYX3NldF9ubV9mbGFncyhBU04xX1BDVFggKnAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJeworCXAtPm5tX2ZsYWdzID0gZmxhZ3M7CisJfQorCit1bnNpZ25lZCBsb25nIEFTTjFfUENUWF9nZXRfY2VydF9mbGFncyhBU04xX1BDVFggKnApCisJeworCXJldHVybiBwLT5jZXJ0X2ZsYWdzOworCX0KKwordm9pZCBBU04xX1BDVFhfc2V0X2NlcnRfZmxhZ3MoQVNOMV9QQ1RYICpwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorCXsKKwlwLT5jZXJ0X2ZsYWdzID0gZmxhZ3M7CisJfQorCit1bnNpZ25lZCBsb25nIEFTTjFfUENUWF9nZXRfb2lkX2ZsYWdzKEFTTjFfUENUWCAqcCkKKwl7CisJcmV0dXJuIHAtPm9pZF9mbGFnczsKKwl9CisKK3ZvaWQgQVNOMV9QQ1RYX3NldF9vaWRfZmxhZ3MoQVNOMV9QQ1RYICpwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorCXsKKwlwLT5vaWRfZmxhZ3MgPSBmbGFnczsKKwl9CisKK3Vuc2lnbmVkIGxvbmcgQVNOMV9QQ1RYX2dldF9zdHJfZmxhZ3MoQVNOMV9QQ1RYICpwKQorCXsKKwlyZXR1cm4gcC0+c3RyX2ZsYWdzOworCX0KKwordm9pZCBBU04xX1BDVFhfc2V0X3N0cl9mbGFncyhBU04xX1BDVFggKnAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJeworCXAtPnN0cl9mbGFncyA9IGZsYWdzOworCX0KKworLyogTWFpbiBwcmludCByb3V0aW5lcyAqLworCitzdGF0aWMgaW50IGFzbjFfaXRlbV9wcmludF9jdHgoQklPICpvdXQsIEFTTjFfVkFMVUUgKipmbGQsIGludCBpbmRlbnQsCisJCQkJY29uc3QgQVNOMV9JVEVNICppdCwKKwkJCQljb25zdCBjaGFyICpmbmFtZSwgY29uc3QgY2hhciAqc25hbWUsCisJCQkJaW50IG5vaGRyLCBjb25zdCBBU04xX1BDVFggKnBjdHgpOworCitpbnQgYXNuMV90ZW1wbGF0ZV9wcmludF9jdHgoQklPICpvdXQsIEFTTjFfVkFMVUUgKipmbGQsIGludCBpbmRlbnQsCisJCQkJY29uc3QgQVNOMV9URU1QTEFURSAqdHQsIGNvbnN0IEFTTjFfUENUWCAqcGN0eCk7CisKK3N0YXRpYyBpbnQgYXNuMV9wcmltaXRpdmVfcHJpbnQoQklPICpvdXQsIEFTTjFfVkFMVUUgKipmbGQsCisJCQkJY29uc3QgQVNOMV9JVEVNICppdCwgaW50IGluZGVudCwKKwkJCQljb25zdCBjaGFyICpmbmFtZSwgY29uc3QgY2hhciAqc25hbWUsCisJCQkJY29uc3QgQVNOMV9QQ1RYICpwY3R4KTsKKworc3RhdGljIGludCBhc24xX3ByaW50X2ZzbmFtZShCSU8gKm91dCwgaW50IGluZGVudCwKKwkJCWNvbnN0IGNoYXIgKmZuYW1lLCBjb25zdCBjaGFyICpzbmFtZSwKKwkJCWNvbnN0IEFTTjFfUENUWCAqcGN0eCk7CisKK2ludCBBU04xX2l0ZW1fcHJpbnQoQklPICpvdXQsIEFTTjFfVkFMVUUgKmlmbGQsIGludCBpbmRlbnQsCisJCQkJY29uc3QgQVNOMV9JVEVNICppdCwgY29uc3QgQVNOMV9QQ1RYICpwY3R4KQorCXsKKwljb25zdCBjaGFyICpzbmFtZTsKKwlpZiAocGN0eCA9PSBOVUxMKQorCQlwY3R4ID0gJmRlZmF1bHRfcGN0eDsKKwlpZiAocGN0eC0+ZmxhZ3MgJiBBU04xX1BDVFhfRkxBR1NfTk9fU1RSVUNUX05BTUUpCisJCXNuYW1lID0gTlVMTDsKKwllbHNlCisJCXNuYW1lID0gaXQtPnNuYW1lOworCXJldHVybiBhc24xX2l0ZW1fcHJpbnRfY3R4KG91dCwgJmlmbGQsIGluZGVudCwgaXQsCisJCQkJCQkJTlVMTCwgc25hbWUsIDAsIHBjdHgpOworCX0KKworc3RhdGljIGludCBhc24xX2l0ZW1fcHJpbnRfY3R4KEJJTyAqb3V0LCBBU04xX1ZBTFVFICoqZmxkLCBpbnQgaW5kZW50LAorCQkJCWNvbnN0IEFTTjFfSVRFTSAqaXQsCisJCQkJY29uc3QgY2hhciAqZm5hbWUsIGNvbnN0IGNoYXIgKnNuYW1lLAorCQkJCWludCBub2hkciwgY29uc3QgQVNOMV9QQ1RYICpwY3R4KQorCXsKKwljb25zdCBBU04xX1RFTVBMQVRFICp0dDsKKwljb25zdCBBU04xX0VYVEVSTl9GVU5DUyAqZWY7CisJQVNOMV9WQUxVRSAqKnRtcGZsZDsKKwljb25zdCBBU04xX0FVWCAqYXV4ID0gaXQtPmZ1bmNzOworCUFTTjFfYXV4X2NiICphc24xX2NiOworCUFTTjFfUFJJTlRfQVJHIHBhcmc7CisJaW50IGk7CisJaWYgKGF1eCAmJiBhdXgtPmFzbjFfY2IpCisJCXsKKwkJcGFyZy5vdXQgPSBvdXQ7CisJCXBhcmcuaW5kZW50ID0gaW5kZW50OworCQlwYXJnLnBjdHggPSBwY3R4OworCQlhc24xX2NiID0gYXV4LT5hc24xX2NiOworCQl9CisJZWxzZSBhc24xX2NiID0gMDsKKworCWlmKCpmbGQgPT0gTlVMTCkKKwkJeworCQlpZiAocGN0eC0+ZmxhZ3MgJiBBU04xX1BDVFhfRkxBR1NfU0hPV19BQlNFTlQpCisJCQl7CisJCQlpZiAoIW5vaGRyICYmICFhc24xX3ByaW50X2ZzbmFtZShvdXQsIGluZGVudCwKKwkJCQkJCQlmbmFtZSwgc25hbWUsIHBjdHgpKQorCQkJCXJldHVybiAwOworCQkJaWYgKEJJT19wdXRzKG91dCwgIjxBQlNFTlQ+XG4iKSA8PSAwKQorCQkJCXJldHVybiAwOworCQkJfQorCQlyZXR1cm4gMTsKKwkJfQorCisJc3dpdGNoKGl0LT5pdHlwZSkKKwkJeworCQljYXNlIEFTTjFfSVRZUEVfUFJJTUlUSVZFOgorCQlpZihpdC0+dGVtcGxhdGVzKQorCQkJeworCQkJaWYgKCFhc24xX3RlbXBsYXRlX3ByaW50X2N0eChvdXQsIGZsZCwgaW5kZW50LAorCQkJCQkJCWl0LT50ZW1wbGF0ZXMsIHBjdHgpKQorCQkJCXJldHVybiAwOworCQkJfQorCQkvKiBmYWxsIHRocnUgKi8KKwkJY2FzZSBBU04xX0lUWVBFX01TVFJJTkc6CisJCWlmICghYXNuMV9wcmltaXRpdmVfcHJpbnQob3V0LCBmbGQsIGl0LAorCQkJCWluZGVudCwgZm5hbWUsIHNuYW1lLHBjdHgpKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCisJCWNhc2UgQVNOMV9JVFlQRV9FWFRFUk46CisJCWlmICghbm9oZHIgJiYgIWFzbjFfcHJpbnRfZnNuYW1lKG91dCwgaW5kZW50LCBmbmFtZSwgc25hbWUsIHBjdHgpKQorCQkJcmV0dXJuIDA7CisJCS8qIFVzZSBuZXcgc3R5bGUgcHJpbnQgcm91dGluZSBpZiBwb3NzaWJsZSAqLworCQllZiA9IGl0LT5mdW5jczsKKwkJaWYgKGVmICYmIGVmLT5hc24xX2V4X3ByaW50KQorCQkJeworCQkJaSA9IGVmLT5hc24xX2V4X3ByaW50KG91dCwgZmxkLCBpbmRlbnQsICIiLCBwY3R4KTsKKwkJCWlmICghaSkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmICgoaSA9PSAyKSAmJiAoQklPX3B1dHMob3V0LCAiXG4iKSA8PSAwKSkKKwkJCQlyZXR1cm4gMDsKKwkJCXJldHVybiAxOworCQkJfQorCQllbHNlIGlmIChzbmFtZSAmJiAKKwkJCUJJT19wcmludGYob3V0LCAiOkVYVEVSTkFMIFRZUEUgJXNcbiIsIHNuYW1lKSA8PSAwKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCisJCWNhc2UgQVNOMV9JVFlQRV9DSE9JQ0U6CisjaWYgMAorCQlpZiAoIW5vaGRyICYmICFhc24xX3ByaW50X2ZzbmFtZShvdXQsIGluZGVudCwgZm5hbWUsIHNuYW1lLCBwY3R4KSkKKwkJCXJldHVybiAwOworI2VuZGlmCisJCS8qIENIT0lDRSB0eXBlLCBnZXQgc2VsZWN0b3IgKi8KKwkJaSA9IGFzbjFfZ2V0X2Nob2ljZV9zZWxlY3RvcihmbGQsIGl0KTsKKwkJLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLi4uICovCisJCWlmKChpIDwgMCkgfHwgKGkgPj0gaXQtPnRjb3VudCkpCisJCQl7CisJCQlpZiAoQklPX3ByaW50ZihvdXQsCisJCQkJIkVSUk9SOiBzZWxlY3RvciBbJWRdIGludmFsaWRcbiIsIGkpIDw9IDApCisJCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gMTsKKwkJCX0KKwkJdHQgPSBpdC0+dGVtcGxhdGVzICsgaTsKKwkJdG1wZmxkID0gYXNuMV9nZXRfZmllbGRfcHRyKGZsZCwgdHQpOworCQlpZiAoIWFzbjFfdGVtcGxhdGVfcHJpbnRfY3R4KG91dCwgdG1wZmxkLCBpbmRlbnQsIHR0LCBwY3R4KSkKKwkJCXJldHVybiAwOworCQlicmVhazsKKworCQljYXNlIEFTTjFfSVRZUEVfU0VRVUVOQ0U6CisJCWNhc2UgQVNOMV9JVFlQRV9OREVGX1NFUVVFTkNFOgorCQlpZiAoIW5vaGRyICYmICFhc24xX3ByaW50X2ZzbmFtZShvdXQsIGluZGVudCwgZm5hbWUsIHNuYW1lLCBwY3R4KSkKKwkJCXJldHVybiAwOworCQlpZiAoZm5hbWUgfHwgc25hbWUpCisJCQl7CisJCQlpZiAocGN0eC0+ZmxhZ3MgJiBBU04xX1BDVFhfRkxBR1NfU0hPV19TRVFVRU5DRSkKKwkJCQl7CisJCQkJaWYgKEJJT19wdXRzKG91dCwgIiB7XG4iKSA8PSAwKQorCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQllbHNlCisJCQkJeworCQkJCWlmIChCSU9fcHV0cyhvdXQsICJcbiIpIDw9IDApCisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKworCQlpZiAoYXNuMV9jYikKKwkJCXsKKwkJCWkgPSBhc24xX2NiKEFTTjFfT1BfUFJJTlRfUFJFLCBmbGQsIGl0LCAmcGFyZyk7CisJCQlpZiAoaSA9PSAwKQorCQkJCXJldHVybiAwOworCQkJaWYgKGkgPT0gMikKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKworCQkvKiBQcmludCBlYWNoIGZpZWxkIGVudHJ5ICovCisJCWZvcihpID0gMCwgdHQgPSBpdC0+dGVtcGxhdGVzOyBpIDwgaXQtPnRjb3VudDsgaSsrLCB0dCsrKQorCQkJeworCQkJY29uc3QgQVNOMV9URU1QTEFURSAqc2VxdHQ7CisJCQlzZXF0dCA9IGFzbjFfZG9fYWRiKGZsZCwgdHQsIDEpOworCQkJdG1wZmxkID0gYXNuMV9nZXRfZmllbGRfcHRyKGZsZCwgc2VxdHQpOworCQkJaWYgKCFhc24xX3RlbXBsYXRlX3ByaW50X2N0eChvdXQsIHRtcGZsZCwKKwkJCQkJCWluZGVudCArIDIsIHNlcXR0LCBwY3R4KSkKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJaWYgKHBjdHgtPmZsYWdzICYgQVNOMV9QQ1RYX0ZMQUdTX1NIT1dfU0VRVUVOQ0UpCisJCQl7CisJCQlpZiAoQklPX3ByaW50ZihvdXQsICIlKnN9XG4iLCBpbmRlbnQsICIiKSA8IDApCisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJaWYgKGFzbjFfY2IpCisJCQl7CisJCQlpID0gYXNuMV9jYihBU04xX09QX1BSSU5UX1BPU1QsIGZsZCwgaXQsICZwYXJnKTsKKwkJCWlmIChpID09IDApCisJCQkJcmV0dXJuIDA7CisJCQl9CisJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCUJJT19wcmludGYob3V0LCAiVW5wcm9jZXNzZWQgdHlwZSAlZFxuIiwgaXQtPml0eXBlKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCXJldHVybiAxOworCX0KKworaW50IGFzbjFfdGVtcGxhdGVfcHJpbnRfY3R4KEJJTyAqb3V0LCBBU04xX1ZBTFVFICoqZmxkLCBpbnQgaW5kZW50LAorCQkJCWNvbnN0IEFTTjFfVEVNUExBVEUgKnR0LCBjb25zdCBBU04xX1BDVFggKnBjdHgpCisJeworCWludCBmbGFnczsKKwlzaXplX3QgaTsKKwljb25zdCBjaGFyICpzbmFtZSwgKmZuYW1lOworCWZsYWdzID0gdHQtPmZsYWdzOworCWlmKHBjdHgtPmZsYWdzICYgQVNOMV9QQ1RYX0ZMQUdTX1NIT1dfRklFTERfU1RSVUNUX05BTUUpCisJCXNuYW1lID0gQVNOMV9JVEVNX3B0cih0dC0+aXRlbSktPnNuYW1lOworCWVsc2UKKwkJc25hbWUgPSBOVUxMOworCWlmKHBjdHgtPmZsYWdzICYgQVNOMV9QQ1RYX0ZMQUdTX05PX0ZJRUxEX05BTUUpCisJCWZuYW1lID0gTlVMTDsKKwllbHNlCisJCWZuYW1lID0gdHQtPmZpZWxkX25hbWU7CisJaWYoZmxhZ3MgJiBBU04xX1RGTEdfU0tfTUFTSykKKwkJeworCQljaGFyICp0bmFtZTsKKwkJQVNOMV9WQUxVRSAqc2tpdGVtOworCQlTVEFDS19PRihBU04xX1ZBTFVFKSAqc3RhY2s7CisKKwkJLyogU0VUIE9GLCBTRVFVRU5DRSBPRiAqLworCQlpZiAoZm5hbWUpCisJCQl7CisJCQlpZihwY3R4LT5mbGFncyAmIEFTTjFfUENUWF9GTEFHU19TSE9XX1NTT0YpCisJCQkJeworCQkJCWlmKGZsYWdzICYgQVNOMV9URkxHX1NFVF9PRikKKwkJCQkJdG5hbWUgPSAiU0VUIjsKKwkJCQllbHNlCisJCQkJCXRuYW1lID0gIlNFUVVFTkNFIjsKKwkJCQlpZiAoQklPX3ByaW50ZihvdXQsICIlKnMlcyBPRiAlcyB7XG4iLAorCQkJCQlpbmRlbnQsICIiLCB0bmFtZSwgdHQtPmZpZWxkX25hbWUpIDw9IDApCisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCWVsc2UgaWYgKEJJT19wcmludGYob3V0LCAiJSpzJXM6XG4iLCBpbmRlbnQsICIiLAorCQkJCQlmbmFtZSkgPD0gMCkKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJc3RhY2sgPSAoU1RBQ0tfT0YoQVNOMV9WQUxVRSkgKikqZmxkOworCQlmb3IoaSA9IDA7IGkgPCBza19BU04xX1ZBTFVFX251bShzdGFjayk7IGkrKykKKwkJCXsKKwkJCWlmICgoaSA+IDApICYmIChCSU9fcHV0cyhvdXQsICJcbiIpIDw9IDApKQorCQkJCXJldHVybiAwOworCisJCQlza2l0ZW0gPSBza19BU04xX1ZBTFVFX3ZhbHVlKHN0YWNrLCBpKTsKKwkJCWlmICghYXNuMV9pdGVtX3ByaW50X2N0eChvdXQsICZza2l0ZW0sIGluZGVudCArIDIsCisJCQkJQVNOMV9JVEVNX3B0cih0dC0+aXRlbSksIE5VTEwsIE5VTEwsIDEsIHBjdHgpKQorCQkJCXJldHVybiAwOworCQkJfQorCQlpZiAoIWkgJiYgQklPX3ByaW50ZihvdXQsICIlKnM8RU1QVFk+XG4iLCBpbmRlbnQgKyAyLCAiIikgPD0gMCkKKwkJCQlyZXR1cm4gMDsKKwkJaWYocGN0eC0+ZmxhZ3MgJiBBU04xX1BDVFhfRkxBR1NfU0hPV19TRVFVRU5DRSkKKwkJCXsKKwkJCWlmIChCSU9fcHJpbnRmKG91dCwgIiUqc31cbiIsIGluZGVudCwgIiIpIDw9IDApCisJCQkJcmV0dXJuIDA7CisJCQl9CisJCXJldHVybiAxOworCQl9CisJcmV0dXJuIGFzbjFfaXRlbV9wcmludF9jdHgob3V0LCBmbGQsIGluZGVudCwgQVNOMV9JVEVNX3B0cih0dC0+aXRlbSksCisJCQkJCQkJZm5hbWUsIHNuYW1lLCAwLCBwY3R4KTsKKwl9CisKK3N0YXRpYyBpbnQgYXNuMV9wcmludF9mc25hbWUoQklPICpvdXQsIGludCBpbmRlbnQsCisJCQljb25zdCBjaGFyICpmbmFtZSwgY29uc3QgY2hhciAqc25hbWUsCisJCQljb25zdCBBU04xX1BDVFggKnBjdHgpCisJeworCXN0YXRpYyBjaGFyIHNwYWNlc1tdID0gIiAgICAgICAgICAgICAgICAgICAgIjsKKwljb25zdCBpbnQgbnNwYWNlcyA9IHNpemVvZihzcGFjZXMpIC0gMTsKKworI2lmIDAKKwlpZiAoIXNuYW1lICYmICFmbmFtZSkKKwkJcmV0dXJuIDE7CisjZW5kaWYKKworCXdoaWxlIChpbmRlbnQgPiBuc3BhY2VzKQorCQl7CisJCWlmIChCSU9fd3JpdGUob3V0LCBzcGFjZXMsIG5zcGFjZXMpICE9IG5zcGFjZXMpCisJCQlyZXR1cm4gMDsKKwkJaW5kZW50IC09IG5zcGFjZXM7CisJCX0KKwlpZiAoQklPX3dyaXRlKG91dCwgc3BhY2VzLCBpbmRlbnQpICE9IGluZGVudCkKKwkJcmV0dXJuIDA7CisJaWYgKHBjdHgtPmZsYWdzICYgQVNOMV9QQ1RYX0ZMQUdTX05PX1NUUlVDVF9OQU1FKQorCQlzbmFtZSA9IE5VTEw7CisJaWYgKHBjdHgtPmZsYWdzICYgQVNOMV9QQ1RYX0ZMQUdTX05PX0ZJRUxEX05BTUUpCisJCWZuYW1lID0gTlVMTDsKKwlpZiAoIXNuYW1lICYmICFmbmFtZSkKKwkJcmV0dXJuIDE7CisJaWYgKGZuYW1lKQorCQl7CisJCWlmIChCSU9fcHV0cyhvdXQsIGZuYW1lKSA8PSAwKQorCQkJcmV0dXJuIDA7CisJCX0KKwlpZiAoc25hbWUpCisJCXsKKwkJaWYgKGZuYW1lKQorCQkJeworCQkJaWYgKEJJT19wcmludGYob3V0LCAiICglcykiLCBzbmFtZSkgPD0gMCkKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJaWYgKEJJT19wdXRzKG91dCwgc25hbWUpIDw9IDApCisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwlpZiAoQklPX3dyaXRlKG91dCwgIjogIiwgMikgIT0gMikKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IGFzbjFfcHJpbnRfYm9vbGVhbl9jdHgoQklPICpvdXQsIGludCBib29sdmFsLAorCQkJCQkJCWNvbnN0IEFTTjFfUENUWCAqcGN0eCkKKwl7CisJY29uc3QgY2hhciAqc3RyOworCXN3aXRjaCAoYm9vbHZhbCkKKwkJeworCQljYXNlIC0xOgorCQlzdHIgPSAiQk9PTCBBQlNFTlQiOworCQlicmVhazsKKworCQljYXNlIDA6CisJCXN0ciA9ICJGQUxTRSI7CisJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCXN0ciA9ICJUUlVFIjsKKwkJYnJlYWs7CisKKwkJfQorCisJaWYgKEJJT19wdXRzKG91dCwgc3RyKSA8PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKKworCX0KKworc3RhdGljIGludCBhc24xX3ByaW50X2ludGVnZXJfY3R4KEJJTyAqb3V0LCBBU04xX0lOVEVHRVIgKnN0ciwKKwkJCQkJCWNvbnN0IEFTTjFfUENUWCAqcGN0eCkKKwl7CisJQklHTlVNICpibiA9IE5VTEw7CisJY2hhciAqcyA9IE5VTEw7CisJaW50IHJldCA9IDE7CisKKwlibiA9IEFTTjFfSU5URUdFUl90b19CTihzdHIsIE5VTEwpOworCWlmIChibiA9PSBOVUxMKSB7CisJCXJldHVybiAwOworCX0KKwlzID0gQk5fYm4yZGVjKGJuKTsKKwlCTl9mcmVlKGJuKTsKKwlpZiAocyA9PSBOVUxMKSB7CisJCXJldHVybiAwOworCX0KKworCWlmIChCSU9fcHV0cyhvdXQsIHMpIDw9IDApIHsKKwkJcmV0ID0gMDsKKwl9CisJT1BFTlNTTF9mcmVlKHMpOworCXJldHVybiByZXQ7CisJfQorCitzdGF0aWMgaW50IGFzbjFfcHJpbnRfb2lkX2N0eChCSU8gKm91dCwgY29uc3QgQVNOMV9PQkpFQ1QgKm9pZCwKKwkJCQkJCWNvbnN0IEFTTjFfUENUWCAqcGN0eCkKKwl7CisJY2hhciBvYmpidWZbODBdOworCWNvbnN0IGNoYXIgKmxuOworCWxuID0gT0JKX25pZDJsbihPQkpfb2JqMm5pZChvaWQpKTsKKwlpZighbG4pCisJCWxuID0gIiI7CisJT0JKX29iajJ0eHQob2JqYnVmLCBzaXplb2Ygb2JqYnVmLCBvaWQsIDEpOworCWlmIChCSU9fcHJpbnRmKG91dCwgIiVzICglcykiLCBsbiwgb2JqYnVmKSA8PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgYXNuMV9wcmludF9vYnN0cmluZ19jdHgoQklPICpvdXQsIEFTTjFfU1RSSU5HICpzdHIsIGludCBpbmRlbnQsCisJCQkJCQljb25zdCBBU04xX1BDVFggKnBjdHgpCisJeworCWlmIChzdHItPnR5cGUgPT0gVl9BU04xX0JJVF9TVFJJTkcpCisJCXsKKwkJaWYgKEJJT19wcmludGYob3V0LCAiICglbGQgdW51c2VkIGJpdHMpXG4iLAorCQkJCQlzdHItPmZsYWdzICYgMHg3KSA8PSAwKQorCQkJCXJldHVybiAwOworCQl9CisJZWxzZSBpZiAoQklPX3B1dHMob3V0LCAiXG4iKSA8PSAwKQorCQlyZXR1cm4gMDsKKwlpZiAoc3RyLT5sZW5ndGggPiAwICYmICFCSU9faGV4ZHVtcChvdXQsIHN0ci0+ZGF0YSwgc3RyLT5sZW5ndGgsIGluZGVudCArIDIpKSB7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgYXNuMV9wcmltaXRpdmVfcHJpbnQoQklPICpvdXQsIEFTTjFfVkFMVUUgKipmbGQsCisJCQkJY29uc3QgQVNOMV9JVEVNICppdCwgaW50IGluZGVudCwKKwkJCQljb25zdCBjaGFyICpmbmFtZSwgY29uc3QgY2hhciAqc25hbWUsCisJCQkJY29uc3QgQVNOMV9QQ1RYICpwY3R4KQorCXsKKwlsb25nIHV0eXBlOworCUFTTjFfU1RSSU5HICpzdHI7CisJaW50IHJldCA9IDEsIG5lZWRsZiA9IDE7CisJY29uc3QgY2hhciAqcG5hbWU7CisJY29uc3QgQVNOMV9QUklNSVRJVkVfRlVOQ1MgKnBmOworCXBmID0gaXQtPmZ1bmNzOworCWlmICghYXNuMV9wcmludF9mc25hbWUob3V0LCBpbmRlbnQsIGZuYW1lLCBzbmFtZSwgcGN0eCkpCisJCQlyZXR1cm4gMDsKKwlpZiAocGYgJiYgcGYtPnByaW1fcHJpbnQpCisJCXJldHVybiBwZi0+cHJpbV9wcmludChvdXQsIGZsZCwgaXQsIGluZGVudCwgcGN0eCk7CisJc3RyID0gKEFTTjFfU1RSSU5HICopKmZsZDsKKwlpZiAoaXQtPml0eXBlID09IEFTTjFfSVRZUEVfTVNUUklORykKKwkJdXR5cGUgPSBzdHItPnR5cGUgJiB+Vl9BU04xX05FRzsKKwllbHNlCisJCXV0eXBlID0gaXQtPnV0eXBlOworCWlmICh1dHlwZSA9PSBWX0FTTjFfQU5ZKQorCQl7CisJCUFTTjFfVFlQRSAqYXR5cGUgPSAoQVNOMV9UWVBFICopKmZsZDsKKwkJdXR5cGUgPSBhdHlwZS0+dHlwZTsKKwkJZmxkID0gJmF0eXBlLT52YWx1ZS5hc24xX3ZhbHVlOworCQlzdHIgPSAoQVNOMV9TVFJJTkcgKikqZmxkOworCQlpZiAocGN0eC0+ZmxhZ3MgJiBBU04xX1BDVFhfRkxBR1NfTk9fQU5ZX1RZUEUpCisJCQlwbmFtZSA9IE5VTEw7CisJCWVsc2UgCisJCQlwbmFtZSA9IEFTTjFfdGFnMnN0cih1dHlwZSk7CisJCX0KKwllbHNlCisJCXsKKwkJaWYgKHBjdHgtPmZsYWdzICYgQVNOMV9QQ1RYX0ZMQUdTX1NIT1dfVFlQRSkKKwkJCXBuYW1lID0gQVNOMV90YWcyc3RyKHV0eXBlKTsKKwkJZWxzZSAKKwkJCXBuYW1lID0gTlVMTDsKKwkJfQorCisJaWYgKHV0eXBlID09IFZfQVNOMV9OVUxMKQorCQl7CisJCWlmIChCSU9fcHV0cyhvdXQsICJOVUxMXG4iKSA8PSAwKQorCQkJcmV0dXJuIDA7CisJCXJldHVybiAxOworCQl9CisKKwlpZiAocG5hbWUpCisJCXsKKwkJaWYgKEJJT19wdXRzKG91dCwgcG5hbWUpIDw9IDApCisJCQlyZXR1cm4gMDsKKwkJaWYgKEJJT19wdXRzKG91dCwgIjoiKSA8PSAwKQorCQkJcmV0dXJuIDA7CisJCX0KKworCXN3aXRjaCAodXR5cGUpCisJCXsKKwkJY2FzZSBWX0FTTjFfQk9PTEVBTjoKKwkJCXsKKwkJCWludCBib29sdmFsID0gKihpbnQgKilmbGQ7CisJCQlpZiAoYm9vbHZhbCA9PSAtMSkKKwkJCQlib29sdmFsID0gaXQtPnNpemU7CisJCQlyZXQgPSBhc24xX3ByaW50X2Jvb2xlYW5fY3R4KG91dCwgYm9vbHZhbCwgcGN0eCk7CisJCQl9CisJCWJyZWFrOworCisJCWNhc2UgVl9BU04xX0lOVEVHRVI6CisJCWNhc2UgVl9BU04xX0VOVU1FUkFURUQ6CisJCXJldCA9IGFzbjFfcHJpbnRfaW50ZWdlcl9jdHgob3V0LCBzdHIsIHBjdHgpOworCQlicmVhazsKKworCQljYXNlIFZfQVNOMV9VVENUSU1FOgorCQlyZXQgPSBBU04xX1VUQ1RJTUVfcHJpbnQob3V0LCBzdHIpOworCQlicmVhazsKKworCQljYXNlIFZfQVNOMV9HRU5FUkFMSVpFRFRJTUU6CisJCXJldCA9IEFTTjFfR0VORVJBTElaRURUSU1FX3ByaW50KG91dCwgc3RyKTsKKwkJYnJlYWs7CisKKwkJY2FzZSBWX0FTTjFfT0JKRUNUOgorCQlyZXQgPSBhc24xX3ByaW50X29pZF9jdHgob3V0LCAoY29uc3QgQVNOMV9PQkpFQ1QgKikqZmxkLCBwY3R4KTsKKwkJYnJlYWs7CisKKwkJY2FzZSBWX0FTTjFfT0NURVRfU1RSSU5HOgorCQljYXNlIFZfQVNOMV9CSVRfU1RSSU5HOgorCQlyZXQgPSBhc24xX3ByaW50X29ic3RyaW5nX2N0eChvdXQsIHN0ciwgaW5kZW50LCBwY3R4KTsKKwkJbmVlZGxmID0gMDsKKwkJYnJlYWs7CisKKwkJY2FzZSBWX0FTTjFfU0VRVUVOQ0U6CisJCWNhc2UgVl9BU04xX1NFVDoKKwkJY2FzZSBWX0FTTjFfT1RIRVI6CisJCWlmIChCSU9fcHV0cyhvdXQsICJcbiIpIDw9IDApCisJCQlyZXR1cm4gMDsKKwkJaWYgKEFTTjFfcGFyc2VfZHVtcChvdXQsIHN0ci0+ZGF0YSwgc3RyLT5sZW5ndGgsCisJCQkJCQlpbmRlbnQsIDApIDw9IDApCisJCQlyZXQgPSAwOworCQluZWVkbGYgPSAwOworCQlicmVhazsKKworCQlkZWZhdWx0OgorCQlyZXQgPSBBU04xX1NUUklOR19wcmludF9leChvdXQsIHN0ciwgcGN0eC0+c3RyX2ZsYWdzKTsKKworCQl9CisJaWYgKCFyZXQpCisJCXJldHVybiAwOworCWlmIChuZWVkbGYgJiYgQklPX3B1dHMob3V0LCAiXG4iKSA8PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKKwl9CmRpZmYgLS1naXQgYS9jcnlwdG8vYXNuMS90YXNuX3R5cC5jIGIvY3J5cHRvL2FzbjEvdGFzbl90eXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmJiYmM4Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2FzbjEvdGFzbl90eXAuYwpAQCAtMCwwICsxLDE1MiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorCisKKy8qIERlY2xhcmF0aW9ucyBmb3Igc3RyaW5nIHR5cGVzICovCisKK0lNUExFTUVOVF9BU04xX1RZUEUoQVNOMV9JTlRFR0VSKTsKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhBU04xX0lOVEVHRVIpOworCitJTVBMRU1FTlRfQVNOMV9UWVBFKEFTTjFfRU5VTUVSQVRFRCk7CitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoQVNOMV9FTlVNRVJBVEVEKTsKKworSU1QTEVNRU5UX0FTTjFfVFlQRShBU04xX0JJVF9TVFJJTkcpOworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKEFTTjFfQklUX1NUUklORyk7CisKK0lNUExFTUVOVF9BU04xX1RZUEUoQVNOMV9PQ1RFVF9TVFJJTkcpOworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKEFTTjFfT0NURVRfU1RSSU5HKTsKKworSU1QTEVNRU5UX0FTTjFfVFlQRShBU04xX05VTEwpOworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKEFTTjFfTlVMTCk7CisKK0lNUExFTUVOVF9BU04xX1RZUEUoQVNOMV9PQkpFQ1QpOworCitJTVBMRU1FTlRfQVNOMV9UWVBFKEFTTjFfVVRGOFNUUklORyk7CitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoQVNOMV9VVEY4U1RSSU5HKTsKKworSU1QTEVNRU5UX0FTTjFfVFlQRShBU04xX1BSSU5UQUJMRVNUUklORyk7CitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoQVNOMV9QUklOVEFCTEVTVFJJTkcpOworCitJTVBMRU1FTlRfQVNOMV9UWVBFKEFTTjFfVDYxU1RSSU5HKTsKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhBU04xX1Q2MVNUUklORyk7CisKK0lNUExFTUVOVF9BU04xX1RZUEUoQVNOMV9JQTVTVFJJTkcpOworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKEFTTjFfSUE1U1RSSU5HKTsKKworSU1QTEVNRU5UX0FTTjFfVFlQRShBU04xX0dFTkVSQUxTVFJJTkcpOworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKEFTTjFfR0VORVJBTFNUUklORyk7CisKK0lNUExFTUVOVF9BU04xX1RZUEUoQVNOMV9VVENUSU1FKTsKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhBU04xX1VUQ1RJTUUpOworCitJTVBMRU1FTlRfQVNOMV9UWVBFKEFTTjFfR0VORVJBTElaRURUSU1FKTsKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhBU04xX0dFTkVSQUxJWkVEVElNRSk7CisKK0lNUExFTUVOVF9BU04xX1RZUEUoQVNOMV9WSVNJQkxFU1RSSU5HKTsKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhBU04xX1ZJU0lCTEVTVFJJTkcpOworCitJTVBMRU1FTlRfQVNOMV9UWVBFKEFTTjFfVU5JVkVSU0FMU1RSSU5HKTsKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhBU04xX1VOSVZFUlNBTFNUUklORyk7CisKK0lNUExFTUVOVF9BU04xX1RZUEUoQVNOMV9CTVBTVFJJTkcpOworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKEFTTjFfQk1QU1RSSU5HKTsKKworSU1QTEVNRU5UX0FTTjFfVFlQRShBU04xX0FOWSk7CisKKy8qIEp1c3Qgc3dhbGxvdyBhbiBBU04xX1NFUVVFTkNFIGluIGFuIEFTTjFfU1RSSU5HICovOworSU1QTEVNRU5UX0FTTjFfVFlQRShBU04xX1NFUVVFTkNFKTsKKworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TX2ZuYW1lKEFTTjFfVFlQRSwgQVNOMV9BTlksIEFTTjFfVFlQRSk7CisKKy8qIE11bHRpc3RyaW5nIHR5cGVzICovOworCitJTVBMRU1FTlRfQVNOMV9NU1RSSU5HKEFTTjFfUFJJTlRBQkxFLCBCX0FTTjFfUFJJTlRBQkxFKTsKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OU19uYW1lKEFTTjFfU1RSSU5HLCBBU04xX1BSSU5UQUJMRSk7CisKK0lNUExFTUVOVF9BU04xX01TVFJJTkcoRElTUExBWVRFWFQsIEJfQVNOMV9ESVNQTEFZVEVYVCk7CitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlNfbmFtZShBU04xX1NUUklORywgRElTUExBWVRFWFQpOworCitJTVBMRU1FTlRfQVNOMV9NU1RSSU5HKERJUkVDVE9SWVNUUklORywgQl9BU04xX0RJUkVDVE9SWVNUUklORyk7CitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlNfbmFtZShBU04xX1NUUklORywgRElSRUNUT1JZU1RSSU5HKTsKKworLyogVGhyZWUgc2VwYXJhdGUgQk9PTEVBTiB0eXBlOiBub3JtYWwsIERFRkFVTFQgVFJVRSBhbmQgREVGQVVMVCBGQUxTRSAqLzsKK0lNUExFTUVOVF9BU04xX1RZUEVfZXgoQVNOMV9CT09MRUFOLCBBU04xX0JPT0xFQU4sIC0xKTsKK0lNUExFTUVOVF9BU04xX1RZUEVfZXgoQVNOMV9UQk9PTEVBTiwgQVNOMV9CT09MRUFOLCAxKTsKK0lNUExFTUVOVF9BU04xX1RZUEVfZXgoQVNOMV9GQk9PTEVBTiwgQVNOMV9CT09MRUFOLCAwKTsKKworLyogU3BlY2lhbCwgT0NURVQgU1RSSU5HIHdpdGggaW5kZWZpbml0ZSBsZW5ndGggY29uc3RydWN0ZWQgc3VwcG9ydCAqLzsKKworSU1QTEVNRU5UX0FTTjFfVFlQRV9leChBU04xX09DVEVUX1NUUklOR19OREVGLCBBU04xX09DVEVUX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgQVNOMV9URkxHX05ERUYpOworCitBU04xX0lURU1fVEVNUExBVEUoQVNOMV9TRVFVRU5DRV9BTlkpID0gQVNOMV9FWF9URU1QTEFURV9UWVBFKAorICAgIEFTTjFfVEZMR19TRVFVRU5DRV9PRiwgMCwgQVNOMV9TRVFVRU5DRV9BTlksIEFTTjFfQU5ZKTsKK0FTTjFfSVRFTV9URU1QTEFURV9FTkQoQVNOMV9TRVFVRU5DRV9BTlkpOworCitBU04xX0lURU1fVEVNUExBVEUoQVNOMV9TRVRfQU5ZKSA9IEFTTjFfRVhfVEVNUExBVEVfVFlQRShBU04xX1RGTEdfU0VUX09GLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOMV9TRVRfQU5ZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOMV9BTlkpOworQVNOMV9JVEVNX1RFTVBMQVRFX0VORChBU04xX1NFVF9BTlkpOworCitJTVBMRU1FTlRfQVNOMV9FTkNPREVfRlVOQ1RJT05TX2NvbnN0X2ZuYW1lKEFTTjFfU0VRVUVOQ0VfQU5ZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU04xX1NFUVVFTkNFX0FOWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOMV9TRVFVRU5DRV9BTlkpOworSU1QTEVNRU5UX0FTTjFfRU5DT0RFX0ZVTkNUSU9OU19jb25zdF9mbmFtZShBU04xX1NFUVVFTkNFX0FOWSwgQVNOMV9TRVRfQU5ZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU04xX1NFVF9BTlkpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FzbjEvdGFzbl91dGwuYyBiL2NyeXB0by9hc24xL3Rhc25fdXRsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUwOTc1YQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9hc24xL3Rhc25fdXRsLmMKQEAgLTAsMCArMSwyNTggQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKworCisvKiBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgbWFuaXB1bGF0aW5nIGZpZWxkcyBhbmQgb2Zmc2V0cyAqLworCisvKiBBZGQgJ29mZnNldCcgdG8gJ2FkZHInICovCisjZGVmaW5lIG9mZnNldDJwdHIoYWRkciwgb2Zmc2V0KSAodm9pZCAqKSgoKGNoYXIgKikgYWRkcikgKyBvZmZzZXQpCisKKy8qIEdpdmVuIGFuIEFTTjFfSVRFTSBDSE9JQ0UgdHlwZSByZXR1cm4gdGhlIHNlbGVjdG9yIHZhbHVlICovCitpbnQgYXNuMV9nZXRfY2hvaWNlX3NlbGVjdG9yKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0KSB7CisgIGludCAqc2VsID0gb2Zmc2V0MnB0cigqcHZhbCwgaXQtPnV0eXBlKTsKKyAgcmV0dXJuICpzZWw7Cit9CisKKy8qIEdpdmVuIGFuIEFTTjFfSVRFTSBDSE9JQ0UgdHlwZSBzZXQgdGhlIHNlbGVjdG9yIHZhbHVlLCByZXR1cm4gb2xkIHZhbHVlLiAqLworaW50IGFzbjFfc2V0X2Nob2ljZV9zZWxlY3RvcihBU04xX1ZBTFVFICoqcHZhbCwgaW50IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBU04xX0lURU0gKml0KSB7CisgIGludCAqc2VsLCByZXQ7CisgIHNlbCA9IG9mZnNldDJwdHIoKnB2YWwsIGl0LT51dHlwZSk7CisgIHJldCA9ICpzZWw7CisgICpzZWwgPSB2YWx1ZTsKKyAgcmV0dXJuIHJldDsKK30KKworLyogRG8gcmVmZXJlbmNlIGNvdW50aW5nLiBUaGUgdmFsdWUgJ29wJyBkZWNpZGVzIHdoYXQgdG8gZG8uIGlmIGl0IGlzICsxIHRoZW4KKyAqIHRoZSBjb3VudCBpcyBpbmNyZW1lbnRlZC4gSWYgb3AgaXMgMCBjb3VudCBpcyBzZXQgdG8gMS4gSWYgb3AgaXMgLTEgY291bnQgaXMKKyAqIGRlY3JlbWVudGVkIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBjdXJyZW50IHJlZnJlbmNlIGNvdW50IG9yIDAgaWYgbm8KKyAqIHJlZmVyZW5jZSBjb3VudCBleGlzdHMuICovCitpbnQgYXNuMV9kb19sb2NrKEFTTjFfVkFMVUUgKipwdmFsLCBpbnQgb3AsIGNvbnN0IEFTTjFfSVRFTSAqaXQpIHsKKyAgY29uc3QgQVNOMV9BVVggKmF1eDsKKyAgaW50ICpsY2ssIHJldDsKKyAgaWYgKGl0LT5pdHlwZSAhPSBBU04xX0lUWVBFX1NFUVVFTkNFICYmCisgICAgICBpdC0+aXR5cGUgIT0gQVNOMV9JVFlQRV9OREVGX1NFUVVFTkNFKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgYXV4ID0gaXQtPmZ1bmNzOworICBpZiAoIWF1eCB8fCAhKGF1eC0+ZmxhZ3MgJiBBU04xX0FGTEdfUkVGQ09VTlQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgbGNrID0gb2Zmc2V0MnB0cigqcHZhbCwgYXV4LT5yZWZfb2Zmc2V0KTsKKyAgaWYgKG9wID09IDApIHsKKyAgICAqbGNrID0gMTsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXQgPSBDUllQVE9fYWRkKGxjaywgb3AsIGF1eC0+cmVmX2xvY2spOworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgQVNOMV9FTkNPRElORyAqYXNuMV9nZXRfZW5jX3B0cihBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9JVEVNICppdCkgeworICBjb25zdCBBU04xX0FVWCAqYXV4OworICBpZiAoIXB2YWwgfHwgISpwdmFsKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgYXV4ID0gaXQtPmZ1bmNzOworICBpZiAoIWF1eCB8fCAhKGF1eC0+ZmxhZ3MgJiBBU04xX0FGTEdfRU5DT0RJTkcpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIG9mZnNldDJwdHIoKnB2YWwsIGF1eC0+ZW5jX29mZnNldCk7Cit9CisKK3ZvaWQgYXNuMV9lbmNfaW5pdChBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9JVEVNICppdCkgeworICBBU04xX0VOQ09ESU5HICplbmM7CisgIGVuYyA9IGFzbjFfZ2V0X2VuY19wdHIocHZhbCwgaXQpOworICBpZiAoZW5jKSB7CisgICAgZW5jLT5lbmMgPSBOVUxMOworICAgIGVuYy0+bGVuID0gMDsKKyAgICBlbmMtPm1vZGlmaWVkID0gMTsKKyAgfQorfQorCit2b2lkIGFzbjFfZW5jX2ZyZWUoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQpIHsKKyAgQVNOMV9FTkNPRElORyAqZW5jOworICBlbmMgPSBhc24xX2dldF9lbmNfcHRyKHB2YWwsIGl0KTsKKyAgaWYgKGVuYykgeworICAgIGlmIChlbmMtPmVuYykgeworICAgICAgT1BFTlNTTF9mcmVlKGVuYy0+ZW5jKTsKKyAgICB9CisgICAgZW5jLT5lbmMgPSBOVUxMOworICAgIGVuYy0+bGVuID0gMDsKKyAgICBlbmMtPm1vZGlmaWVkID0gMTsKKyAgfQorfQorCitpbnQgYXNuMV9lbmNfc2F2ZShBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIGludCBpbmxlbiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEFTTjFfSVRFTSAqaXQpIHsKKyAgQVNOMV9FTkNPRElORyAqZW5jOworICBlbmMgPSBhc24xX2dldF9lbmNfcHRyKHB2YWwsIGl0KTsKKyAgaWYgKCFlbmMpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGlmIChlbmMtPmVuYykgeworICAgIE9QRU5TU0xfZnJlZShlbmMtPmVuYyk7CisgIH0KKyAgZW5jLT5lbmMgPSBPUEVOU1NMX21hbGxvYyhpbmxlbik7CisgIGlmICghZW5jLT5lbmMpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBtZW1jcHkoZW5jLT5lbmMsIGluLCBpbmxlbik7CisgIGVuYy0+bGVuID0gaW5sZW47CisgIGVuYy0+bW9kaWZpZWQgPSAwOworCisgIHJldHVybiAxOworfQorCitpbnQgYXNuMV9lbmNfcmVzdG9yZShpbnQgKmxlbiwgdW5zaWduZWQgY2hhciAqKm91dCwgQVNOMV9WQUxVRSAqKnB2YWwsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBBU04xX0lURU0gKml0KSB7CisgIEFTTjFfRU5DT0RJTkcgKmVuYzsKKyAgZW5jID0gYXNuMV9nZXRfZW5jX3B0cihwdmFsLCBpdCk7CisgIGlmICghZW5jIHx8IGVuYy0+bW9kaWZpZWQpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAob3V0KSB7CisgICAgbWVtY3B5KCpvdXQsIGVuYy0+ZW5jLCBlbmMtPmxlbik7CisgICAgKm91dCArPSBlbmMtPmxlbjsKKyAgfQorICBpZiAobGVuKSB7CisgICAgKmxlbiA9IGVuYy0+bGVuOworICB9CisgIHJldHVybiAxOworfQorCisvKiBHaXZlbiBhbiBBU04xX1RFTVBMQVRFIGdldCBhIHBvaW50ZXIgdG8gYSBmaWVsZCAqLworQVNOMV9WQUxVRSAqKmFzbjFfZ2V0X2ZpZWxkX3B0cihBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9URU1QTEFURSAqdHQpIHsKKyAgQVNOMV9WQUxVRSAqKnB2YWx0bXA7CisgIGlmICh0dC0+ZmxhZ3MgJiBBU04xX1RGTEdfQ09NQklORSkgeworICAgIHJldHVybiBwdmFsOworICB9CisgIHB2YWx0bXAgPSBvZmZzZXQycHRyKCpwdmFsLCB0dC0+b2Zmc2V0KTsKKyAgLyogTk9URSBmb3IgQk9PTEVBTiB0eXBlcyB0aGUgZmllbGQgaXMganVzdCBhIHBsYWluIGludCBzbyB3ZSBjYW4ndCByZXR1cm4KKyAgICogaW50ICoqLCBzbyBzZXR0bGUgZm9yIChpbnQgKikuICovCisgIHJldHVybiBwdmFsdG1wOworfQorCisvKiBIYW5kbGUgQU5ZIERFRklORUQgQlkgdGVtcGxhdGUsIGZpbmQgdGhlIHNlbGVjdG9yLCBsb29rIHVwIHRoZSByZWxldmFudAorICogQVNOMV9URU1QTEFURSBpbiB0aGUgdGFibGUgYW5kIHJldHVybiBpdC4gKi8KK2NvbnN0IEFTTjFfVEVNUExBVEUgKmFzbjFfZG9fYWRiKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX1RFTVBMQVRFICp0dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudWxsZXJyKSB7CisgIGNvbnN0IEFTTjFfQURCICphZGI7CisgIGNvbnN0IEFTTjFfQURCX1RBQkxFICphdGJsOworICBsb25nIHNlbGVjdG9yOworICBBU04xX1ZBTFVFICoqc2ZsZDsKKyAgaW50IGk7CisgIGlmICghKHR0LT5mbGFncyAmIEFTTjFfVEZMR19BREJfTUFTSykpIHsKKyAgICByZXR1cm4gdHQ7CisgIH0KKworICAvKiBFbHNlIEFOWSBERUZJTkVEIEJZIC4uLiBnZXQgdGhlIHRhYmxlICovCisgIGFkYiA9IEFTTjFfQURCX3B0cih0dC0+aXRlbSk7CisKKyAgLyogR2V0IHRoZSBzZWxlY3RvciBmaWVsZCAqLworICBzZmxkID0gb2Zmc2V0MnB0cigqcHZhbCwgYWRiLT5vZmZzZXQpOworCisgIC8qIENoZWNrIGlmIE5VTEwgKi8KKyAgaWYgKCFzZmxkKSB7CisgICAgaWYgKCFhZGItPm51bGxfdHQpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICByZXR1cm4gYWRiLT5udWxsX3R0OworICB9CisKKyAgLyogQ29udmVydCB0eXBlIHRvIGEgbG9uZzoKKyAgICogTkI6IGRvbid0IGNoZWNrIGZvciBOSURfdW5kZWYgaGVyZSBiZWNhdXNlIGl0CisgICAqIG1pZ2h0IGJlIGEgbGVnaXRpbWF0ZSB2YWx1ZSBpbiB0aGUgdGFibGUgKi8KKyAgaWYgKHR0LT5mbGFncyAmIEFTTjFfVEZMR19BREJfT0lEKSB7CisgICAgc2VsZWN0b3IgPSBPQkpfb2JqMm5pZCgoQVNOMV9PQkpFQ1QgKikqc2ZsZCk7CisgIH0gZWxzZSB7CisgICAgc2VsZWN0b3IgPSBBU04xX0lOVEVHRVJfZ2V0KChBU04xX0lOVEVHRVIgKikqc2ZsZCk7CisgIH0KKworICAvKiBUcnkgdG8gZmluZCBtYXRjaGluZyBlbnRyeSBpbiB0YWJsZSBNYXliZSBzaG91bGQgY2hlY2sgYXBwbGljYXRpb24gdHlwZXMKKyAgICogZmlyc3QgdG8gYWxsb3cgYXBwbGljYXRpb24gb3ZlcnJpZGU/IE1pZ2h0IGFsc28gYmUgdXNlZnVsIHRvIGhhdmUgYSBmbGFnCisgICAqIHdoaWNoIGluZGljYXRlcyB0YWJsZSBpcyBzb3J0ZWQgYW5kIHdlIGNhbiBkbyBhIGJpbmFyeSBzZWFyY2guIEZvciBub3cKKyAgICogc3RpY2sgdG8gYSBsaW5lYXIgc2VhcmNoLiAqLworCisgIGZvciAoYXRibCA9IGFkYi0+dGJsLCBpID0gMDsgaSA8IGFkYi0+dGJsY291bnQ7IGkrKywgYXRibCsrKSB7CisgICAgaWYgKGF0YmwtPnZhbHVlID09IHNlbGVjdG9yKSB7CisgICAgICByZXR1cm4gJmF0YmwtPnR0OworICAgIH0KKyAgfQorCisgIC8qIEZJWE1FOiBuZWVkIHRvIHNlYXJjaCBhcHBsaWNhdGlvbiB0YWJsZSB0b28gKi8KKworICAvKiBObyBtYXRjaCwgcmV0dXJuIGRlZmF1bHQgdHlwZSAqLworICBpZiAoIWFkYi0+ZGVmYXVsdF90dCkgeworICAgIGdvdG8gZXJyOworICB9CisgIHJldHVybiBhZGItPmRlZmF1bHRfdHQ7CisKK2VycjoKKyAgLyogRklYTUU6IHNob3VsZCBsb2cgdGhlIHZhbHVlIG9yIE9JRCBvZiB1bnN1cHBvcnRlZCB0eXBlICovCisgIGlmIChudWxsZXJyKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9kb19hZGIsCisgICAgICAgICAgICAgICAgICAgICAgQVNOMV9SX1VOU1VQUE9SVEVEX0FOWV9ERUZJTkVEX0JZX1RZUEUpOworICB9CisgIHJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FzbjEveF9iaWdudW0uYyBiL2NyeXB0by9hc24xL3hfYmlnbnVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZmYTA5MwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9hc24xL3hfYmlnbnVtLmMKQEAgLTAsMCArMSwxMzYgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisKKworLyogQ3VzdG9tIHByaW1pdGl2ZSB0eXBlIGZvciBCSUdOVU0gaGFuZGxpbmcuIFRoaXMgcmVhZHMgaW4gYW4gQVNOMV9JTlRFR0VSIGFzIGEKKyAqIEJJR05VTSBkaXJlY3RseS4gQ3VycmVudGx5IGl0IGlnbm9yZXMgdGhlIHNpZ24gd2hpY2ggaXNuJ3QgYSBwcm9ibGVtIHNpbmNlIGFsbAorICogQklHTlVNcyB1c2VkIGFyZSBub24gbmVnYXRpdmUgYW5kIGFueXRoaW5nIHRoYXQgbG9va3MgbmVnYXRpdmUgaXMgbm9ybWFsbHkgZHVlCisgKiB0byBhbiBlbmNvZGluZyBlcnJvci4KKyAqLworCisjZGVmaW5lIEJOX1NFTlNJVElWRQkxCisKK3N0YXRpYyBpbnQgYm5fbmV3KEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0KTsKK3N0YXRpYyB2b2lkIGJuX2ZyZWUoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQpOworCitzdGF0aWMgaW50IGJuX2kyYyhBU04xX1ZBTFVFICoqcHZhbCwgdW5zaWduZWQgY2hhciAqY29udCwgaW50ICpwdXR5cGUsIGNvbnN0IEFTTjFfSVRFTSAqaXQpOworc3RhdGljIGludCBibl9jMmkoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvbnQsIGludCBsZW4sIGludCB1dHlwZSwgY2hhciAqZnJlZV9jb250LCBjb25zdCBBU04xX0lURU0gKml0KTsKKworc3RhdGljIEFTTjFfUFJJTUlUSVZFX0ZVTkNTIGJpZ251bV9wZiA9IHsKKwlOVUxMLCAwLAorCWJuX25ldywKKwlibl9mcmVlLAorCTAsCisJYm5fYzJpLAorCWJuX2kyYworfTsKKworQVNOMV9JVEVNX3N0YXJ0KEJJR05VTSkKKwlBU04xX0lUWVBFX1BSSU1JVElWRSwgVl9BU04xX0lOVEVHRVIsIE5VTEwsIDAsICZiaWdudW1fcGYsIDAsICJCSUdOVU0iCitBU04xX0lURU1fZW5kKEJJR05VTSkKKworQVNOMV9JVEVNX3N0YXJ0KENCSUdOVU0pCisJQVNOMV9JVFlQRV9QUklNSVRJVkUsIFZfQVNOMV9JTlRFR0VSLCBOVUxMLCAwLCAmYmlnbnVtX3BmLCBCTl9TRU5TSVRJVkUsICJCSUdOVU0iCitBU04xX0lURU1fZW5kKENCSUdOVU0pCisKK3N0YXRpYyBpbnQgYm5fbmV3KEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0KQoreworCSpwdmFsID0gKEFTTjFfVkFMVUUgKilCTl9uZXcoKTsKKwlpZigqcHZhbCkgcmV0dXJuIDE7CisJZWxzZSByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYm5fZnJlZShBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9JVEVNICppdCkKK3sKKwlpZighKnB2YWwpIHJldHVybjsKKwlpZihpdC0+c2l6ZSAmIEJOX1NFTlNJVElWRSkgQk5fY2xlYXJfZnJlZSgoQklHTlVNICopKnB2YWwpOworCWVsc2UgQk5fZnJlZSgoQklHTlVNICopKnB2YWwpOworCSpwdmFsID0gTlVMTDsKK30KKworc3RhdGljIGludCBibl9pMmMoQVNOMV9WQUxVRSAqKnB2YWwsIHVuc2lnbmVkIGNoYXIgKmNvbnQsIGludCAqcHV0eXBlLCBjb25zdCBBU04xX0lURU0gKml0KQoreworCUJJR05VTSAqYm47CisJaW50IHBhZDsKKwlpZighKnB2YWwpIHJldHVybiAtMTsKKwlibiA9IChCSUdOVU0gKikqcHZhbDsKKwkvKiBJZiBNU0Igc2V0IGluIGFuIG9jdGV0IHdlIG5lZWQgYSBwYWRkaW5nIGJ5dGUgKi8KKwlpZihCTl9udW1fYml0cyhibikgJiAweDcpIHBhZCA9IDA7CisJZWxzZSBwYWQgPSAxOworCWlmKGNvbnQpIHsKKwkJaWYocGFkKSAqY29udCsrID0gMDsKKwkJQk5fYm4yYmluKGJuLCBjb250KTsKKwl9CisJcmV0dXJuIHBhZCArIEJOX251bV9ieXRlcyhibik7Cit9CisKK3N0YXRpYyBpbnQgYm5fYzJpKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCB1bnNpZ25lZCBjaGFyICpjb250LCBpbnQgbGVuLAorCQkgIGludCB1dHlwZSwgY2hhciAqZnJlZV9jb250LCBjb25zdCBBU04xX0lURU0gKml0KQoreworCUJJR05VTSAqYm47CisJaWYoISpwdmFsKSBibl9uZXcocHZhbCwgaXQpOworCWJuICA9IChCSUdOVU0gKikqcHZhbDsKKwlpZighQk5fYmluMmJuKGNvbnQsIGxlbiwgYm4pKSB7CisJCWJuX2ZyZWUocHZhbCwgaXQpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vYXNuMS94X2xvbmcuYyBiL2NyeXB0by9hc24xL3hfbG9uZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMGRhZDEKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYXNuMS94X2xvbmcuYwpAQCAtMCwwICsxLDE4MCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisKKworLyogQ3VzdG9tIHByaW1pdGl2ZSB0eXBlIGZvciBsb25nIGhhbmRsaW5nLiBUaGlzIGNvbnZlcnRzIGJldHdlZW4gYW4gQVNOMV9JTlRFR0VSCisgKiBhbmQgYSBsb25nIGRpcmVjdGx5LgorICovCisKKworc3RhdGljIGludCBsb25nX25ldyhBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9JVEVNICppdCk7CitzdGF0aWMgdm9pZCBsb25nX2ZyZWUoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQpOworCitzdGF0aWMgaW50IGxvbmdfaTJjKEFTTjFfVkFMVUUgKipwdmFsLCB1bnNpZ25lZCBjaGFyICpjb250LCBpbnQgKnB1dHlwZSwgY29uc3QgQVNOMV9JVEVNICppdCk7CitzdGF0aWMgaW50IGxvbmdfYzJpKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCB1bnNpZ25lZCBjaGFyICpjb250LCBpbnQgbGVuLCBpbnQgdXR5cGUsIGNoYXIgKmZyZWVfY29udCwgY29uc3QgQVNOMV9JVEVNICppdCk7CitzdGF0aWMgaW50IGxvbmdfcHJpbnQoQklPICpvdXQsIEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0LCBpbnQgaW5kZW50LCBjb25zdCBBU04xX1BDVFggKnBjdHgpOworCitzdGF0aWMgQVNOMV9QUklNSVRJVkVfRlVOQ1MgbG9uZ19wZiA9IHsKKwlOVUxMLCAwLAorCWxvbmdfbmV3LAorCWxvbmdfZnJlZSwKKwlsb25nX2ZyZWUsCS8qIENsZWFyIHNob3VsZCBzZXQgdG8gaW5pdGlhbCB2YWx1ZSAqLworCWxvbmdfYzJpLAorCWxvbmdfaTJjLAorCWxvbmdfcHJpbnQKK307CisKK0FTTjFfSVRFTV9zdGFydChMT05HKQorCUFTTjFfSVRZUEVfUFJJTUlUSVZFLCBWX0FTTjFfSU5URUdFUiwgTlVMTCwgMCwgJmxvbmdfcGYsIEFTTjFfTE9OR19VTkRFRiwgIkxPTkciCitBU04xX0lURU1fZW5kKExPTkcpCisKK0FTTjFfSVRFTV9zdGFydChaTE9ORykKKwlBU04xX0lUWVBFX1BSSU1JVElWRSwgVl9BU04xX0lOVEVHRVIsIE5VTEwsIDAsICZsb25nX3BmLCAwLCAiWkxPTkciCitBU04xX0lURU1fZW5kKFpMT05HKQorCitzdGF0aWMgaW50IGxvbmdfbmV3KEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0KQoreworCSoobG9uZyAqKXB2YWwgPSBpdC0+c2l6ZTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgbG9uZ19mcmVlKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0KQoreworCSoobG9uZyAqKXB2YWwgPSBpdC0+c2l6ZTsKK30KKworc3RhdGljIGludCBsb25nX2kyYyhBU04xX1ZBTFVFICoqcHZhbCwgdW5zaWduZWQgY2hhciAqY29udCwgaW50ICpwdXR5cGUsIGNvbnN0IEFTTjFfSVRFTSAqaXQpCit7CisJbG9uZyBsdG1wOworCXVuc2lnbmVkIGxvbmcgdXRtcDsKKwlpbnQgY2xlbiwgcGFkLCBpOworCS8qIHRoaXMgZXhpc3RzIHRvIGJ5cGFzcyBicm9rZW4gZ2NjIG9wdGltaXphdGlvbiAqLworCWNoYXIgKmNwID0gKGNoYXIgKilwdmFsOworCisJLyogdXNlIG1lbWNweSwgYmVjYXVzZSB3ZSBtYXkgbm90IGJlIGxvbmcgYWxpZ25lZCAqLworCW1lbWNweSgmbHRtcCwgY3AsIHNpemVvZihsb25nKSk7CisKKwlpZihsdG1wID09IGl0LT5zaXplKSByZXR1cm4gLTE7CisJLyogQ29udmVydCB0aGUgbG9uZyB0byBwb3NpdGl2ZTogd2Ugc3VidHJhY3Qgb25lIGlmIG5lZ2F0aXZlIHNvCisJICogd2UgY2FuIGNsZWFubHkgaGFuZGxlIHRoZSBwYWRkaW5nIGlmIG9ubHkgdGhlIE1TQiBvZiB0aGUgbGVhZGluZworCSAqIG9jdGV0IGlzIHNldC4gCisJICovCisJaWYobHRtcCA8IDApIHV0bXAgPSAtbHRtcCAtIDE7CisJZWxzZSB1dG1wID0gbHRtcDsKKwljbGVuID0gQk5fbnVtX2JpdHNfd29yZCh1dG1wKTsKKwkvKiBJZiBNU0Igb2YgbGVhZGluZyBvY3RldCBzZXQgd2UgbmVlZCB0byBwYWQgKi8KKwlpZighKGNsZW4gJiAweDcpKSBwYWQgPSAxOworCWVsc2UgcGFkID0gMDsKKworCS8qIENvbnZlcnQgbnVtYmVyIG9mIGJpdHMgdG8gbnVtYmVyIG9mIG9jdGV0cyAqLworCWNsZW4gPSAoY2xlbiArIDcpID4+IDM7CisKKwlpZihjb250KSB7CisJCWlmKHBhZCkgKmNvbnQrKyA9IChsdG1wIDwgMCkgPyAweGZmIDogMDsKKwkJZm9yKGkgPSBjbGVuIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJCWNvbnRbaV0gPSAodW5zaWduZWQgY2hhcikodXRtcCAmIDB4ZmYpOworCQkJaWYobHRtcCA8IDApIGNvbnRbaV0gXj0gMHhmZjsKKwkJCXV0bXAgPj49IDg7CisJCX0KKwl9CisJcmV0dXJuIGNsZW4gKyBwYWQ7Cit9CisKK3N0YXRpYyBpbnQgbG9uZ19jMmkoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvbnQsIGludCBsZW4sCisJCSAgICBpbnQgdXR5cGUsIGNoYXIgKmZyZWVfY29udCwgY29uc3QgQVNOMV9JVEVNICppdCkKK3sKKwlpbnQgbmVnLCBpOworCWxvbmcgbHRtcDsKKwl1bnNpZ25lZCBsb25nIHV0bXAgPSAwOworCWNoYXIgKmNwID0gKGNoYXIgKilwdmFsOworCWlmKGxlbiA+IChpbnQpc2l6ZW9mKGxvbmcpKSB7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGxvbmdfYzJpLCAgQVNOMV9SX0lOVEVHRVJfVE9PX0xBUkdFX0ZPUl9MT05HKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIElzIGl0IG5lZ2F0aXZlPyAqLworCWlmKGxlbiAmJiAoY29udFswXSAmIDB4ODApKSBuZWcgPSAxOworCWVsc2UgbmVnID0gMDsKKwl1dG1wID0gMDsKKwlmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQl1dG1wIDw8PSA4OworCQlpZihuZWcpIHV0bXAgfD0gY29udFtpXSBeIDB4ZmY7CisJCWVsc2UgdXRtcCB8PSBjb250W2ldOworCX0KKwlsdG1wID0gKGxvbmcpdXRtcDsKKwlpZihuZWcpIHsKKwkJbHRtcCsrOworCQlsdG1wID0gLWx0bXA7CisJfQorCWlmKGx0bXAgPT0gaXQtPnNpemUpIHsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgbG9uZ19jMmksICBBU04xX1JfSU5URUdFUl9UT09fTEFSR0VfRk9SX0xPTkcpOworCQlyZXR1cm4gMDsKKwl9CisJbWVtY3B5KGNwLCAmbHRtcCwgc2l6ZW9mKGxvbmcpKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBsb25nX3ByaW50KEJJTyAqb3V0LCBBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9JVEVNICppdCwKKwkJCWludCBpbmRlbnQsIGNvbnN0IEFTTjFfUENUWCAqcGN0eCkKKwl7CisJcmV0dXJuIEJJT19wcmludGYob3V0LCAiJWxkXG4iLCAqKGxvbmcgKilwdmFsKTsKKwl9CmRpZmYgLS1naXQgYS9jcnlwdG8vYmFzZS5oIGIvY3J5cHRvL2Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGI0MDI4Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2Jhc2UuaApAQCAtMCwwICsxLDE2NyBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAxIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuICovCisKKyNpZm5kZWYgT1BFTlNTTF9IRUFERVJfQkFTRV9ICisjZGVmaW5lIE9QRU5TU0xfSEVBREVSX0JBU0VfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKworI2lmIGRlZmluZWQoX194ODZfNjQpIHx8IGRlZmluZWQoX01fQU1ENjQpIHx8IGRlZmluZWQoX01fWDY0KQorI2RlZmluZSBPUEVOU1NMXzY0X0JJVAorI2RlZmluZSBPUEVOU1NMX1g4Nl82NAorI2VsaWYgZGVmaW5lZChfX3g4NikgfHwgZGVmaW5lZChfX2kzODYpIHx8IGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX01fSVg4NikKKyNkZWZpbmUgT1BFTlNTTF8zMl9CSVQKKyNkZWZpbmUgT1BFTlNTTF9YODYKKyNlbGlmIGRlZmluZWQoX19hYXJjaDY0X18pCisjZGVmaW5lIE9QRU5TU0xfNjRfQklUCisjZGVmaW5lIE9QRU5TU0xfQUFSQ0g2NAorI2VsaWYgZGVmaW5lZChfX2FybSkgfHwgZGVmaW5lZChfX2FybV9fKSB8fCBkZWZpbmVkKF9NX0FSTSkKKyNkZWZpbmUgT1BFTlNTTF8zMl9CSVQKKyNkZWZpbmUgT1BFTlNTTF9BUk0KKyNlbHNlCisjZXJyb3IgIlVua25vd24gdGFyZ2V0IENQVSIKKyNlbmRpZgorCisjZGVmaW5lIE9QRU5TU0xfSVNfQk9SSU5HU1NMCisjZGVmaW5lIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgMHgxMDAwMjAwMAorCisKKy8qIFRoaXMgZmlsZSBzaG91bGQgYmUgdGhlIGZpcnN0IGluY2x1ZGVkIGJ5IGFsbCBCb3JpbmdTU0wgaGVhZGVycy4gKi8KKwordHlwZWRlZiBpbnQgQVNOMV9CT09MRUFOOwordHlwZWRlZiBpbnQgQVNOMV9OVUxMOwordHlwZWRlZiBzdHJ1Y3QgQVNOMV9JVEVNX3N0IEFTTjFfSVRFTTsKK3R5cGVkZWYgc3RydWN0IGFzbjFfb2JqZWN0X3N0IEFTTjFfT0JKRUNUOwordHlwZWRlZiBzdHJ1Y3QgYXNuMV9wY3R4X3N0IEFTTjFfUENUWDsKK3R5cGVkZWYgc3RydWN0IGFzbjFfc3RyaW5nX3N0IEFTTjFfQklUX1NUUklORzsKK3R5cGVkZWYgc3RydWN0IGFzbjFfc3RyaW5nX3N0IEFTTjFfQk1QU1RSSU5HOwordHlwZWRlZiBzdHJ1Y3QgYXNuMV9zdHJpbmdfc3QgQVNOMV9FTlVNRVJBVEVEOwordHlwZWRlZiBzdHJ1Y3QgYXNuMV9zdHJpbmdfc3QgQVNOMV9HRU5FUkFMSVpFRFRJTUU7Cit0eXBlZGVmIHN0cnVjdCBhc24xX3N0cmluZ19zdCBBU04xX0dFTkVSQUxTVFJJTkc7Cit0eXBlZGVmIHN0cnVjdCBhc24xX3N0cmluZ19zdCBBU04xX0lBNVNUUklORzsKK3R5cGVkZWYgc3RydWN0IGFzbjFfc3RyaW5nX3N0IEFTTjFfSU5URUdFUjsKK3R5cGVkZWYgc3RydWN0IGFzbjFfc3RyaW5nX3N0IEFTTjFfT0NURVRfU1RSSU5HOwordHlwZWRlZiBzdHJ1Y3QgYXNuMV9zdHJpbmdfc3QgQVNOMV9QUklOVEFCTEVTVFJJTkc7Cit0eXBlZGVmIHN0cnVjdCBhc24xX3N0cmluZ19zdCBBU04xX1NUUklORzsKK3R5cGVkZWYgc3RydWN0IGFzbjFfc3RyaW5nX3N0IEFTTjFfVDYxU1RSSU5HOwordHlwZWRlZiBzdHJ1Y3QgYXNuMV9zdHJpbmdfc3QgQVNOMV9USU1FOwordHlwZWRlZiBzdHJ1Y3QgYXNuMV9zdHJpbmdfc3QgQVNOMV9VTklWRVJTQUxTVFJJTkc7Cit0eXBlZGVmIHN0cnVjdCBhc24xX3N0cmluZ19zdCBBU04xX1VUQ1RJTUU7Cit0eXBlZGVmIHN0cnVjdCBhc24xX3N0cmluZ19zdCBBU04xX1VURjhTVFJJTkc7Cit0eXBlZGVmIHN0cnVjdCBhc24xX3N0cmluZ19zdCBBU04xX1ZJU0lCTEVTVFJJTkc7CisKK3R5cGVkZWYgc3RydWN0IEFVVEhPUklUWV9LRVlJRF9zdCBBVVRIT1JJVFlfS0VZSUQ7Cit0eXBlZGVmIHN0cnVjdCBESVNUX1BPSU5UX3N0IERJU1RfUE9JTlQ7Cit0eXBlZGVmIHN0cnVjdCBJU1NVSU5HX0RJU1RfUE9JTlRfc3QgSVNTVUlOR19ESVNUX1BPSU5UOwordHlwZWRlZiBzdHJ1Y3QgTkFNRV9DT05TVFJBSU5UU19zdCBOQU1FX0NPTlNUUkFJTlRTOwordHlwZWRlZiBzdHJ1Y3QgWDUwOV9QT0xJQ1lfQ0FDSEVfc3QgWDUwOV9QT0xJQ1lfQ0FDSEU7Cit0eXBlZGVmIHN0cnVjdCBYNTA5X1BPTElDWV9MRVZFTF9zdCBYNTA5X1BPTElDWV9MRVZFTDsKK3R5cGVkZWYgc3RydWN0IFg1MDlfUE9MSUNZX05PREVfc3QgWDUwOV9QT0xJQ1lfTk9ERTsKK3R5cGVkZWYgc3RydWN0IFg1MDlfUE9MSUNZX1RSRUVfc3QgWDUwOV9QT0xJQ1lfVFJFRTsKK3R5cGVkZWYgc3RydWN0IFg1MDlfYWxnb3Jfc3QgWDUwOV9BTEdPUjsKK3R5cGVkZWYgc3RydWN0IFg1MDlfY3JsX3N0IFg1MDlfQ1JMOwordHlwZWRlZiBzdHJ1Y3QgWDUwOV9uYW1lX3N0IFg1MDlfTkFNRTsKK3R5cGVkZWYgc3RydWN0IFg1MDlfcHVia2V5X3N0IFg1MDlfUFVCS0VZOwordHlwZWRlZiBzdHJ1Y3QgYmlnbnVtX2N0eCBCTl9DVFg7Cit0eXBlZGVmIHN0cnVjdCBiaWdudW1fc3QgQklHTlVNOwordHlwZWRlZiBzdHJ1Y3QgYmlvX21ldGhvZF9zdCBCSU9fTUVUSE9EOwordHlwZWRlZiBzdHJ1Y3QgYmlvX3N0IEJJTzsKK3R5cGVkZWYgc3RydWN0IGJuX2dlbmNiX3N0IEJOX0dFTkNCOwordHlwZWRlZiBzdHJ1Y3QgYm5fbW9udF9jdHhfc3QgQk5fTU9OVF9DVFg7Cit0eXBlZGVmIHN0cnVjdCBidWZfbWVtX3N0IEJVRl9NRU07Cit0eXBlZGVmIHN0cnVjdCBjYmJfc3QgQ0JCOwordHlwZWRlZiBzdHJ1Y3QgY2JzX3N0IENCUzsKK3R5cGVkZWYgc3RydWN0IGNvbXBfY3R4X3N0IENPTVBfQ1RYOwordHlwZWRlZiBzdHJ1Y3QgY29tcF9tZXRob2Rfc3QgQ09NUF9NRVRIT0Q7Cit0eXBlZGVmIHN0cnVjdCBjb25mX3N0IENPTkY7Cit0eXBlZGVmIHN0cnVjdCBkaF9tZXRob2QgREhfTUVUSE9EOwordHlwZWRlZiBzdHJ1Y3QgZGhfc3QgREg7Cit0eXBlZGVmIHN0cnVjdCBkc2FfbWV0aG9kIERTQV9NRVRIT0Q7Cit0eXBlZGVmIHN0cnVjdCBkc2Ffc3QgRFNBOwordHlwZWRlZiBzdHJ1Y3QgZWNfa2V5X3N0IEVDX0tFWTsKK3R5cGVkZWYgc3RydWN0IGVjZHNhX21ldGhvZF9zdCBFQ0RTQV9NRVRIT0Q7Cit0eXBlZGVmIHN0cnVjdCBlY2RzYV9zaWdfc3QgRUNEU0FfU0lHOwordHlwZWRlZiBzdHJ1Y3QgZW5naW5lX3N0IEVOR0lORTsKK3R5cGVkZWYgc3RydWN0IGVudl9tZF9jdHhfc3QgRVZQX01EX0NUWDsKK3R5cGVkZWYgc3RydWN0IGVudl9tZF9zdCBFVlBfTUQ7Cit0eXBlZGVmIHN0cnVjdCBldnBfY2lwaGVyX2N0eF9zdCBFVlBfQ0lQSEVSX0NUWDsKK3R5cGVkZWYgc3RydWN0IGV2cF9jaXBoZXJfc3QgRVZQX0NJUEhFUjsKK3R5cGVkZWYgc3RydWN0IGV2cF9wa2V5X2FzbjFfbWV0aG9kX3N0IEVWUF9QS0VZX0FTTjFfTUVUSE9EOwordHlwZWRlZiBzdHJ1Y3QgZXZwX3BrZXlfY3R4X3N0IEVWUF9QS0VZX0NUWDsKK3R5cGVkZWYgc3RydWN0IGV2cF9wa2V5X21ldGhvZF9zdCBFVlBfUEtFWV9NRVRIT0Q7Cit0eXBlZGVmIHN0cnVjdCBldnBfcGtleV9zdCBFVlBfUEtFWTsKK3R5cGVkZWYgc3RydWN0IGhtYWNfY3R4X3N0IEhNQUNfQ1RYOwordHlwZWRlZiBzdHJ1Y3QgbWQ1X3N0YXRlX3N0IE1ENV9DVFg7Cit0eXBlZGVmIHN0cnVjdCBwa2NzOF9wcml2X2tleV9pbmZvX3N0IFBLQ1M4X1BSSVZfS0VZX0lORk87Cit0eXBlZGVmIHN0cnVjdCByYW5kX21ldGhfc3QgUkFORF9NRVRIT0Q7Cit0eXBlZGVmIHN0cnVjdCByc2FfbWV0aF9zdCBSU0FfTUVUSE9EOwordHlwZWRlZiBzdHJ1Y3QgcnNhX3N0IFJTQTsKK3R5cGVkZWYgc3RydWN0IHNoYTI1Nl9zdGF0ZV9zdCBTSEEyNTZfQ1RYOwordHlwZWRlZiBzdHJ1Y3Qgc2hhNTEyX3N0YXRlX3N0IFNIQTUxMl9DVFg7Cit0eXBlZGVmIHN0cnVjdCBzaGFfc3RhdGVfc3QgU0hBX0NUWDsKK3R5cGVkZWYgc3RydWN0IHNzbF9jdHhfc3QgU1NMX0NUWDsKK3R5cGVkZWYgc3RydWN0IHNzbF9zdCBTU0w7Cit0eXBlZGVmIHN0cnVjdCBzdF9FUlJfRk5TIEVSUl9GTlM7Cit0eXBlZGVmIHN0cnVjdCB2M19leHRfY3R4IFg1MDlWM19DVFg7Cit0eXBlZGVmIHN0cnVjdCB4NTA5X2NybF9tZXRob2Rfc3QgWDUwOV9DUkxfTUVUSE9EOwordHlwZWRlZiBzdHJ1Y3QgeDUwOV9yZXZva2VkX3N0IFg1MDlfUkVWT0tFRDsKK3R5cGVkZWYgc3RydWN0IHg1MDlfc3QgWDUwOTsKK3R5cGVkZWYgc3RydWN0IHg1MDlfc3RvcmVfY3R4X3N0IFg1MDlfU1RPUkVfQ1RYOwordHlwZWRlZiBzdHJ1Y3QgeDUwOV9zdG9yZV9zdCBYNTA5X1NUT1JFOwordHlwZWRlZiB2b2lkICpPUEVOU1NMX0JMT0NLOworCisKKyNlbmRpZiAgLyogT1BFTlNTTF9IRUFERVJfQkFTRV9IICovCmRpZmYgLS1naXQgYS9jcnlwdG8vYmFzZTY0L0NNYWtlTGlzdHMudHh0IGIvY3J5cHRvL2Jhc2U2NC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjAxYWJkCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2Jhc2U2NC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDkgQEAKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQorCithZGRfbGlicmFyeSgKKwliYXNlNjQKKworCU9CSkVDVAorCisJYmFzZTY0LmMKKykKZGlmZiAtLWdpdCBhL2NyeXB0by9iYXNlNjQvYmFzZTY0LmMgYi9jcnlwdG8vYmFzZTY0L2Jhc2U2NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiOWFhMzYKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYmFzZTY0L2Jhc2U2NC5jCkBAIC0wLDAgKzEsMzkxIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9iYXNlNjQuaD4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRhdGFfYmluMmFzY2lpWzY1XSA9CisgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOworCisjZGVmaW5lIGNvbnZfYmluMmFzY2lpKGEpIChkYXRhX2JpbjJhc2NpaVsoYSkgJiAweDNmXSkKKyNkZWZpbmUgY29udl9hc2NpaTJiaW4oYSkgKGRhdGFfYXNjaWkyYmluWyhhKSAmIDB4N2ZdKQorCisvKiA2NCBjaGFyIGxpbmVzCisgKiBwYWQgaW5wdXQgd2l0aCAwCisgKiBsZWZ0IG92ZXIgY2hhcnMgYXJlIHNldCB0byA9CisgKiAxIGJ5dGUgID0+IHh4PT0KKyAqIDIgYnl0ZXMgPT4geHh4PQorICogMyBieXRlcyA9PiB4eHh4CisgKi8KKyNkZWZpbmUgQklOX1BFUl9MSU5FICAgICg2NC80KjMpCisjZGVmaW5lIENIVU5LU19QRVJfTElORSAoNjQvNCkKKyNkZWZpbmUgQ0hBUl9QRVJfTElORSAgICg2NCsxKQorCisvKiAweEYwIGlzIGEgRU9MTgorICogMHhGMSBpcyBpZ25vcmUgYnV0IG5leHQgbmVlZHMgdG8gYmUgMHhGMCAoZm9yIFxyXG4gcHJvY2Vzc2luZykuCisgKiAweEYyIGlzIEVPRgorICogMHhFMCBpcyBpZ25vcmUgYXQgc3RhcnQgb2YgbGluZS4KKyAqIDB4RkYgaXMgZXJyb3IgKi8KKworI2RlZmluZSBCNjRfRU9MTiAweEYwCisjZGVmaW5lIEI2NF9DUiAweEYxCisjZGVmaW5lIEI2NF9FT0YgMHhGMgorI2RlZmluZSBCNjRfV1MgMHhFMAorI2RlZmluZSBCNjRfRVJST1IgMHhGRgorI2RlZmluZSBCNjRfTk9UX0JBU0U2NChhKSAoKChhKSB8IDB4MTMpID09IDB4RjMpCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRhdGFfYXNjaWkyYmluWzEyOF0gPSB7CisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFMCwgMHhGMCwgMHhGRiwKKyAgICAweEZGLCAweEYxLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RTAsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzRSwgMHhGRiwgMHhGMiwgMHhGRiwgMHgzRiwKKyAgICAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LCAweDNBLCAweDNCLCAweDNDLCAweDNELCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsCisgICAgMHgwNywgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwgMHgxMCwgMHgxMSwgMHgxMiwKKyAgICAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAweDE4LCAweDE5LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4MUEsIDB4MUIsIDB4MUMsIDB4MUQsIDB4MUUsIDB4MUYsIDB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsCisgICAgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyQSwgMHgyQiwgMHgyQywgMHgyRCwgMHgyRSwgMHgyRiwgMHgzMCwKKyAgICAweDMxLCAweDMyLCAweDMzLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorfTsKKwordm9pZCBFVlBfRW5jb2RlSW5pdChFVlBfRU5DT0RFX0NUWCAqY3R4KSB7CisgIGN0eC0+bGVuZ3RoID0gNDg7CisgIGN0eC0+bnVtID0gMDsKKyAgY3R4LT5saW5lX251bSA9IDA7Cit9CisKK3ZvaWQgRVZQX0VuY29kZVVwZGF0ZShFVlBfRU5DT0RFX0NUWCAqY3R4LCB1aW50OF90ICpvdXQsIGludCAqb3V0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluX2xlbikgeworICB1bnNpZ25lZCBpLCBqOworICB1bnNpZ25lZCB0b3RhbCA9IDA7CisKKyAgKm91dF9sZW4gPSAwOworICBpZiAoaW5fbGVuID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKworICBhc3NlcnQoY3R4LT5sZW5ndGggPD0gc2l6ZW9mKGN0eC0+ZW5jX2RhdGEpKTsKKworICBpZiAoKGN0eC0+bnVtICsgaW5fbGVuKSA8IGN0eC0+bGVuZ3RoKSB7CisgICAgbWVtY3B5KCZjdHgtPmVuY19kYXRhW2N0eC0+bnVtXSwgaW4sIGluX2xlbik7CisgICAgY3R4LT5udW0gKz0gaW5fbGVuOworICAgIHJldHVybjsKKyAgfQorICBpZiAoY3R4LT5udW0gIT0gMCkgeworICAgIGkgPSBjdHgtPmxlbmd0aCAtIGN0eC0+bnVtOworICAgIG1lbWNweSgmY3R4LT5lbmNfZGF0YVtjdHgtPm51bV0sIGluLCBpKTsKKyAgICBpbiArPSBpOworICAgIGluX2xlbiAtPSBpOworICAgIGogPSBFVlBfRW5jb2RlQmxvY2sob3V0LCBjdHgtPmVuY19kYXRhLCBjdHgtPmxlbmd0aCk7CisgICAgY3R4LT5udW0gPSAwOworICAgIG91dCArPSBqOworICAgICoob3V0KyspID0gJ1xuJzsKKyAgICAqb3V0ID0gJ1wwJzsKKyAgICB0b3RhbCA9IGogKyAxOworICB9CisgIHdoaWxlIChpbl9sZW4gPj0gY3R4LT5sZW5ndGgpIHsKKyAgICBqID0gRVZQX0VuY29kZUJsb2NrKG91dCwgaW4sIGN0eC0+bGVuZ3RoKTsKKyAgICBpbiArPSBjdHgtPmxlbmd0aDsKKyAgICBpbl9sZW4gLT0gY3R4LT5sZW5ndGg7CisgICAgb3V0ICs9IGo7CisgICAgKihvdXQrKykgPSAnXG4nOworICAgICpvdXQgPSAnXDAnOworICAgIHRvdGFsICs9IGogKyAxOworICB9CisgIGlmIChpbl9sZW4gIT0gMCkgeworICAgIG1lbWNweSgmY3R4LT5lbmNfZGF0YVswXSwgaW4sIGluX2xlbik7CisgIH0KKyAgY3R4LT5udW0gPSBpbl9sZW47CisgICpvdXRfbGVuID0gdG90YWw7Cit9CisKK3ZvaWQgRVZQX0VuY29kZUZpbmFsKEVWUF9FTkNPREVfQ1RYICpjdHgsIHVpbnQ4X3QgKm91dCwgaW50ICpvdXRfbGVuKSB7CisgIHVuc2lnbmVkIHJldCA9IDA7CisKKyAgaWYgKGN0eC0+bnVtICE9IDApIHsKKyAgICByZXQgPSBFVlBfRW5jb2RlQmxvY2sob3V0LCBjdHgtPmVuY19kYXRhLCBjdHgtPm51bSk7CisgICAgb3V0W3JldCsrXSA9ICdcbic7CisgICAgb3V0W3JldF0gPSAnXDAnOworICAgIGN0eC0+bnVtID0gMDsKKyAgfQorICAqb3V0X2xlbiA9IHJldDsKK30KKworc2l6ZV90IEVWUF9FbmNvZGVCbG9jayh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgc2l6ZV90IHNyY19sZW4pIHsKKyAgdW5zaWduZWQgbG9uZyBsOworICBzaXplX3QgaSwgcmV0ID0gMDsKKworICBmb3IgKGkgPSBzcmNfbGVuOyBpID4gMDsgaSAtPSAzKSB7CisgICAgaWYgKGkgPj0gMykgeworICAgICAgbCA9ICgoKHVuc2lnbmVkIGxvbmcpc3JjWzBdKSA8PCAxNkwpIHwgKCgodW5zaWduZWQgbG9uZylzcmNbMV0pIDw8IDhMKSB8IHNyY1syXTsKKyAgICAgICooZHN0KyspID0gY29udl9iaW4yYXNjaWkobCA+PiAxOEwpOworICAgICAgKihkc3QrKykgPSBjb252X2JpbjJhc2NpaShsID4+IDEyTCk7CisgICAgICAqKGRzdCsrKSA9IGNvbnZfYmluMmFzY2lpKGwgPj4gNkwpOworICAgICAgKihkc3QrKykgPSBjb252X2JpbjJhc2NpaShsKTsKKyAgICB9IGVsc2UgeworICAgICAgbCA9ICgodW5zaWduZWQgbG9uZylzcmNbMF0pIDw8IDE2TDsKKyAgICAgIGlmIChpID09IDIpIHsKKyAgICAgICAgbCB8PSAoKHVuc2lnbmVkIGxvbmcpc3JjWzFdIDw8IDhMKTsKKyAgICAgIH0KKworICAgICAgKihkc3QrKykgPSBjb252X2JpbjJhc2NpaShsID4+IDE4TCk7CisgICAgICAqKGRzdCsrKSA9IGNvbnZfYmluMmFzY2lpKGwgPj4gMTJMKTsKKyAgICAgICooZHN0KyspID0gKGkgPT0gMSkgPyAnPScgOiBjb252X2JpbjJhc2NpaShsID4+IDZMKTsKKyAgICAgICooZHN0KyspID0gJz0nOworICAgIH0KKyAgICByZXQgKz0gNDsKKyAgICBzcmMgKz0gMzsKKyAgfQorCisgICpkc3QgPSAnXDAnOworICByZXR1cm4gcmV0OworfQorCit2b2lkIEVWUF9EZWNvZGVJbml0KEVWUF9FTkNPREVfQ1RYICpjdHgpIHsKKyAgY3R4LT5sZW5ndGggPSAzMDsKKyAgY3R4LT5udW0gPSAwOworICBjdHgtPmxpbmVfbnVtID0gMDsKKyAgY3R4LT5leHBlY3RfbmwgPSAwOworfQorCitpbnQgRVZQX0RlY29kZVVwZGF0ZShFVlBfRU5DT0RFX0NUWCAqY3R4LCB1aW50OF90ICpvdXQsIGludCAqb3V0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5fbGVuKSB7CisgIGludCBzZW9mID0gLTEsIGVvZiA9IDAsIHJ2ID0gLTEsIHYsIHRtcCwgZXhwX25sOworICB1aW50OF90ICpkOworICB1bnNpZ25lZCBpLCBuLCBsbiwgcmV0ID0gMDsKKworICBuID0gY3R4LT5udW07CisgIGQgPSBjdHgtPmVuY19kYXRhOworICBsbiA9IGN0eC0+bGluZV9udW07CisgIGV4cF9ubCA9IGN0eC0+ZXhwZWN0X25sOworCisgIC8qIGxhc3QgbGluZSBvZiBpbnB1dC4gKi8KKyAgaWYgKGluX2xlbiA9PSAwIHx8IChuID09IDAgJiYgY29udl9hc2NpaTJiaW4oaW5bMF0pID09IEI2NF9FT0YpKSB7CisgICAgcnYgPSAwOworICAgIGdvdG8gZW5kOworICB9CisKKyAgLyogV2UgcGFyc2UgdGhlIGlucHV0IGRhdGEgKi8KKyAgZm9yIChpID0gMDsgaSA8IGluX2xlbjsgaSsrKSB7CisgICAgLyogSWYgdGhlIGN1cnJlbnQgbGluZSBpcyA+IDgwIGNoYXJhY3RlcnMsIHNjcmVhbSBhbG90ICovCisgICAgaWYgKGxuID49IDgwKSB7CisgICAgICBydiA9IC0xOworICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgLyogR2V0IGNoYXIgYW5kIHB1dCBpdCBpbnRvIHRoZSBidWZmZXIgKi8KKyAgICB0bXAgPSAqKGluKyspOworICAgIHYgPSBjb252X2FzY2lpMmJpbih0bXApOworICAgIC8qIG9ubHkgc2F2ZSB0aGUgZ29vZCBkYXRhIDotKSAqLworICAgIGlmICghQjY0X05PVF9CQVNFNjQodikpIHsKKyAgICAgIGFzc2VydChuIDwgc2l6ZW9mKGN0eC0+ZW5jX2RhdGEpKTsKKyAgICAgIGRbbisrXSA9IHRtcDsKKyAgICAgIGxuKys7CisgICAgfSBlbHNlIGlmICh2ID09IEI2NF9FUlJPUikgeworICAgICAgcnYgPSAtMTsKKyAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIC8qIGhhdmUgd2Ugc2VlbiBhICc9JyB3aGljaCBpcyAnZGVmaW5pdGx5JyB0aGUgbGFzdAorICAgICAqIGlucHV0IGxpbmUuICBzZW9mIHdpbGwgcG9pbnQgdG8gdGhlIGNoYXJhY3RlciB0aGF0CisgICAgICogaG9sZHMgaXQuIGFuZCBlb2Ygd2lsbCBob2xkIGhvdyBtYW55IGNoYXJhY3RlcnMgdG8KKyAgICAgKiBjaG9wIG9mZi4gKi8KKyAgICBpZiAodG1wID09ICc9JykgeworICAgICAgaWYgKHNlb2YgPT0gLTEpIHsKKyAgICAgICAgc2VvZiA9IG47CisgICAgICB9CisgICAgICBlb2YrKzsKKyAgICB9CisKKyAgICBpZiAodiA9PSBCNjRfQ1IpIHsKKyAgICAgIGxuID0gMDsKKyAgICAgIGlmIChleHBfbmwpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgfQorCisgICAgLyogZW9sbiAqLworICAgIGlmICh2ID09IEI2NF9FT0xOKSB7CisgICAgICBsbiA9IDA7CisgICAgICBpZiAoZXhwX25sKSB7CisgICAgICAgIGV4cF9ubCA9IDA7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0KKyAgICBleHBfbmwgPSAwOworCisgICAgLyogSWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgaW5wdXQgYW5kIGl0IGxvb2tzIGxpa2UgYQorICAgICAqIGxpbmUsIHByb2Nlc3MgaXQuICovCisgICAgaWYgKChpICsgMSkgPT0gaW5fbGVuICYmICgoKG4gJiAzKSA9PSAwKSB8fCBlb2YpKSB7CisgICAgICB2ID0gQjY0X0VPRjsKKyAgICAgIC8qIEluIGNhc2UgdGhpbmdzIHdlcmUgZ2l2ZW4gdXMgaW4gcmVhbGx5IHNtYWxsCisgICAgICAgICByZWNvcmRzIChzbyB0d28gJz0nIHdlcmUgZ2l2ZW4gaW4gc2VwYXJhdGUKKyAgICAgICAgIHVwZGF0ZXMpLCBlb2YgbWF5IGNvbnRhaW4gdGhlIGluY29ycmVjdCBudW1iZXIKKyAgICAgICAgIG9mIGVuZGluZyBieXRlcyB0byBza2lwLCBzbyBsZXQncyByZWRvIHRoZSBjb3VudCAqLworICAgICAgZW9mID0gMDsKKyAgICAgIGlmIChkW24gLSAxXSA9PSAnPScpIHsKKyAgICAgICAgZW9mKys7CisgICAgICB9CisgICAgICBpZiAoZFtuIC0gMl0gPT0gJz0nKSB7CisgICAgICAgIGVvZisrOworICAgICAgfQorICAgICAgLyogVGhlcmUgd2lsbCBuZXZlciBiZSBtb3JlIHRoYW4gdHdvICc9JyAqLworICAgIH0KKworICAgIGlmICgodiA9PSBCNjRfRU9GICYmIChuICYgMykgPT0gMCkgfHwgbiA+PSA2NCkgeworICAgICAgLyogVGhpcyBpcyBuZWVkZWQgdG8gd29yayBjb3JyZWN0bHkgb24gNjQgYnl0ZSBpbnB1dAorICAgICAgICogbGluZXMuICBXZSBwcm9jZXNzIHRoZSBsaW5lIGFuZCB0aGVuIG5lZWQgdG8KKyAgICAgICAqIGFjY2VwdCB0aGUgJ1xuJyAqLworICAgICAgaWYgKHYgIT0gQjY0X0VPRiAmJiBuID49IDY0KSB7CisgICAgICAgIGV4cF9ubCA9IDE7CisgICAgICB9CisgICAgICBpZiAobiA+IDApIHsKKyAgICAgICAgdiA9IEVWUF9EZWNvZGVCbG9jayhvdXQsIGQsIG4pOworICAgICAgICBuID0gMDsKKyAgICAgICAgaWYgKHYgPCAwKSB7CisgICAgICAgICAgcnYgPSAwOworICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIHJldCArPSAodiAtIGVvZik7CisgICAgICB9IGVsc2UgeworICAgICAgICBlb2YgPSAxOworICAgICAgICB2ID0gMDsKKyAgICAgIH0KKworICAgICAgLyogVGhpcyBpcyB0aGUgY2FzZSB3aGVyZSB3ZSBoYXZlIGhhZCBhIHNob3J0CisgICAgICAgKiBidXQgdmFsaWQgaW5wdXQgbGluZSAqLworICAgICAgaWYgKHYgPCAoaW50KWN0eC0+bGVuZ3RoICYmIGVvZikgeworICAgICAgICBydiA9IDA7CisgICAgICAgIGdvdG8gZW5kOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY3R4LT5sZW5ndGggPSB2OworICAgICAgfQorCisgICAgICBpZiAoc2VvZiA+PSAwKSB7CisgICAgICAgIHJ2ID0gMDsKKyAgICAgICAgZ290byBlbmQ7CisgICAgICB9CisgICAgICBvdXQgKz0gdjsKKyAgICB9CisgIH0KKyAgcnYgPSAxOworCitlbmQ6CisgICpvdXRfbGVuID0gcmV0OworICBjdHgtPm51bSA9IG47CisgIGN0eC0+bGluZV9udW0gPSBsbjsKKyAgY3R4LT5leHBlY3RfbmwgPSBleHBfbmw7CisgIHJldHVybiBydjsKK30KKworaW50IEVWUF9EZWNvZGVGaW5hbChFVlBfRU5DT0RFX0NUWCAqY3R4LCB1aW50OF90ICpvdXQsIGludCAqb3V0bCkgeworICBpbnQgaTsKKworICAqb3V0bCA9IDA7CisgIGlmIChjdHgtPm51bSAhPSAwKSB7CisgICAgaSA9IEVWUF9EZWNvZGVCbG9jayhvdXQsIGN0eC0+ZW5jX2RhdGEsIGN0eC0+bnVtKTsKKyAgICBpZiAoaSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgY3R4LT5udW0gPSAwOworICAgICpvdXRsID0gaTsKKyAgICByZXR1cm4gMTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gMTsKKyAgfQorfQorCitzaXplX3QgRVZQX0RlY29kZUJsb2NrKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBzaXplX3Qgc3JjX2xlbikgeworICBpbnQgYSwgYiwgYywgZDsKKyAgdW5zaWduZWQgbG9uZyBsOworICBzaXplX3QgaSwgcmV0ID0gMDsKKworICAvKiB0cmltIHdoaXRlIHNwYWNlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLiAqLworICB3aGlsZSAoY29udl9hc2NpaTJiaW4oKnNyYykgPT0gQjY0X1dTICYmIHNyY19sZW4gPiAwKSB7CisgICAgc3JjKys7CisgICAgc3JjX2xlbi0tOworICB9CisKKyAgLyogc3RyaXAgb2ZmIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUKKyAgICogYXNjaWkyYmluIHZhbHVlcyBCNjRfV1MsIEI2NF9FT0xOLCBCNjRfRU9MTiBhbmQgQjY0X0VPRiAqLworICB3aGlsZSAoc3JjX2xlbiA+IDMgJiYgQjY0X05PVF9CQVNFNjQoY29udl9hc2NpaTJiaW4oc3JjW3NyY19sZW4gLSAxXSkpKSB7CisgICAgc3JjX2xlbi0tOworICB9CisKKyAgaWYgKHNyY19sZW4gJSA0ICE9IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgc3JjX2xlbjsgaSArPSA0KSB7CisgICAgYSA9IGNvbnZfYXNjaWkyYmluKCooc3JjKyspKTsKKyAgICBiID0gY29udl9hc2NpaTJiaW4oKihzcmMrKykpOworICAgIGMgPSBjb252X2FzY2lpMmJpbigqKHNyYysrKSk7CisgICAgZCA9IGNvbnZfYXNjaWkyYmluKCooc3JjKyspKTsKKyAgICBpZiAoKGEgJiAweDgwKSB8fCAoYiAmIDB4ODApIHx8IChjICYgMHg4MCkgfHwgKGQgJiAweDgwKSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBsID0gKCgoKHVuc2lnbmVkIGxvbmcpYSkgPDwgMThMKSB8ICgoKHVuc2lnbmVkIGxvbmcpYikgPDwgMTJMKSB8CisgICAgICAgICAoKCh1bnNpZ25lZCBsb25nKWMpIDw8IDZMKSB8ICgoKHVuc2lnbmVkIGxvbmcpZCkpKTsKKyAgICAqKGRzdCsrKSA9ICh1aW50OF90KShsID4+IDE2TCkgJiAweGZmOworICAgICooZHN0KyspID0gKHVpbnQ4X3QpKGwgPj4gOEwpICYgMHhmZjsKKyAgICAqKGRzdCsrKSA9ICh1aW50OF90KShsKSAmIDB4ZmY7CisgICAgcmV0ICs9IDM7CisgIH0KKworICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2Jhc2U2NC9iYXNlNjQuaCBiL2NyeXB0by9iYXNlNjQvYmFzZTY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZhZmFlZgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9iYXNlNjQvYmFzZTY0LmgKQEAgLTAsMCArMSwxNDEgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpZm5kZWYgT1BFTlNTTF9IRUFERVJfQkFTRTY0X0gKKyNkZWZpbmUgT1BFTlNTTF9IRUFERVJfQkFTRTY0X0gKKworI2luY2x1ZGUgPG9wZW5zc2wvYmFzZS5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogYmFzZTY0IGZ1bmN0aW9ucy4KKyAqCisgKiBGb3IgaGlzdG9yaWNhbCByZWFzb25zLCB0aGVzZSBmdW5jdGlvbnMgaGF2ZSB0aGUgRVZQXyBwcmVmaXggYnV0IGp1c3QgZG8KKyAqIGJhc2U2NCBlbmNvZGluZyBhbmQgZGVjb2RpbmcuICovCisKKwordHlwZWRlZiBzdHJ1Y3QgZXZwX2VuY29kZV9jdHhfc3QgRVZQX0VOQ09ERV9DVFg7CisKKworLyogRW5jb2RpbmcgKi8KKworLyogRVZQX0VuY29kZUluaXQgaW5pdGlhbGlzZXMgfCpjdHh8LCB3aGljaCBpcyB0eXBpY2FsbHkgc3RhY2sgYWxsb2NhdGVkLCBmb3IKKyAqIGFuIGVuY29kaW5nIG9wZXJhdGlvbi4gKi8KK3ZvaWQgRVZQX0VuY29kZUluaXQoRVZQX0VOQ09ERV9DVFggKmN0eCk7CisKKy8qIEVWUF9FbmNvZGVVcGRhdGUgZW5jb2RlcyB8aW5fbGVufCBieXRlcyBmcm9tIHxpbnwgYW5kIHdyaXRlcyBhbiBlbmNvZGVkCisgKiB2ZXJzaW9uIG9mIHRoZW0gdG8gfG91dHwgYW5kIHNldHMgfCpvdXRfbGVufCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uCisgKiBTb21lIHN0YXRlIG1heSBiZSBjb250YWluZWQgaW4gfGN0eHwgc28gfEVWUF9FbmNvZGVGaW5hbHwgbXVzdCBiZSB1c2VkIHRvCisgKiBmbHVzaCBpdCBiZWZvcmUgdXNpbmcgdGhlIGVuY29kZWQgZGF0YS4gKi8KK3ZvaWQgRVZQX0VuY29kZVVwZGF0ZShFVlBfRU5DT0RFX0NUWCAqY3R4LCB1aW50OF90ICpvdXQsIGludCAqb3V0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluX2xlbik7CisKKy8qIEVWUF9FbmNvZGVGaW5hbCBmbHVzaGVzIGFueSByZW1haW5pbmcgb3V0cHV0IGJ5dGVzIGZyb20gfGN0eHwgdG8gfG91dHwgYW5kCisgKiBzZXRzIHwqb3V0X2xlbnwgdG8gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLiAqLwordm9pZCBFVlBfRW5jb2RlRmluYWwoRVZQX0VOQ09ERV9DVFggKmN0eCwgdWludDhfdCAqb3V0LCBpbnQgKm91dF9sZW4pOworCisvKiBFVlBfRW5jb2RlQmxvY2sgZW5jb2RlcyB8c3JjX2xlbnwgYnl0ZXMgZnJvbSB8c3JjfCBhbmQgd3JpdGVzIHRoZSByZXN1bHQgdG8KKyAqIHxkc3R8LiBJdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4gKi8KK3NpemVfdCBFVlBfRW5jb2RlQmxvY2sodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHNpemVfdCBzcmNfbGVuKTsKKworCisvKiBEZWNvZGluZyAqLworCisvKiBFVlBfRGVjb2RlSW5pdCBpbml0aWFsaXNlcyB8KmN0eHwsIHdoaWNoIGlzIHR5cGljYWxseSBzdGFjayBhbGxvY2F0ZWQsIGZvcgorICogYSBkZWNvZGluZyBvcGVyYXRpb24uICovCit2b2lkIEVWUF9EZWNvZGVJbml0KEVWUF9FTkNPREVfQ1RYICpjdHgpOworCisvKiBFVlBfRGVjb2RlVXBkYXRlIGRlY29kZXMgfGluX2xlbnwgYnl0ZXMgZnJvbSB8aW58IGFuZCB3cml0ZXMgdGhlIGRlY29kZWQKKyAqIGRhdGEgdG8gfG91dHwgYW5kIHNldHMgfCpvdXRfbGVufCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uIFNvbWUgc3RhdGUKKyAqIG1heSBiZSBjb250YWluZWQgaW4gfGN0eHwgc28gfEVWUF9EZWNvZGVGaW5hbHwgbXVzdCBiZSB1c2VkIHRvIGZsdXNoIGl0CisgKiBiZWZvcmUgdXNpbmcgdGhlIGVuY29kZWQgZGF0YS4KKyAqCisgKiBJdCByZXR1cm5zIC0xIG9uIGVycm9yLCBvbmUgaWYgYSBmdWxsIGxpbmUgb2YgaW5wdXQgd2FzIHByb2Nlc3NlZCBhbmQgemVybworICogaWYgdGhlIGxpbmUgd2FzIHNob3J0IChpLmUuIGl0IHdhcyB0aGUgbGFzdCBsaW5lKS4gKi8KK2ludCBFVlBfRGVjb2RlVXBkYXRlKEVWUF9FTkNPREVfQ1RYICpjdHgsIHVpbnQ4X3QgKm91dCwgaW50ICpvdXRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpbl9sZW4pOworCisvKiBFVlBfRGVjb2RlRmluYWwgZmx1c2hlcyBhbnkgcmVtYWluaW5nIG91dHB1dCBieXRlcyBmcm9tIHxjdHh8IHRvIHxvdXR8IGFuZAorICogc2V0cyB8Km91dF9sZW58IHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcworICogYW5kIG1pbnVzIG9uZSBvbiBlcnJvci4gKi8KK2ludCBFVlBfRGVjb2RlRmluYWwoRVZQX0VOQ09ERV9DVFggKmN0eCwgdWludDhfdCAqb3V0LCBpbnQgKm91dF9sZW4pOworCisvKiBFVlBfRGVjb2RlQmxvY2sgZW5jb2RlcyB8c3JjX2xlbnwgYnl0ZXMgZnJvbSB8c3JjfCBhbmQgd3JpdGVzIHRoZSByZXN1bHQgdG8KKyAqIHxkc3R8LiBJdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4gKi8KK3NpemVfdCBFVlBfRGVjb2RlQmxvY2sodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHNpemVfdCBzcmNfbGVuKTsKKworCitzdHJ1Y3QgZXZwX2VuY29kZV9jdHhfc3QgeworICB1bnNpZ25lZCBudW07ICAgIC8qIG51bWJlciBzYXZlZCBpbiBhIHBhcnRpYWwgZW5jb2RlL2RlY29kZSAqLworICB1bnNpZ25lZCBsZW5ndGg7IC8qIFRoZSBsZW5ndGggaXMgZWl0aGVyIHRoZSBvdXRwdXQgbGluZSBsZW5ndGgKKyAgICAgICAgICAgICAgICogKGluIGlucHV0IGJ5dGVzKSBvciB0aGUgc2hvcnRlc3QgaW5wdXQgbGluZQorICAgICAgICAgICAgICAgKiBsZW5ndGggdGhhdCBpcyBvay4gIE9uY2UgZGVjb2RpbmcgYmVnaW5zLAorICAgICAgICAgICAgICAgKiB0aGUgbGVuZ3RoIGlzIGFkanVzdGVkIHVwIGVhY2ggdGltZSBhIGxvbmdlcgorICAgICAgICAgICAgICAgKiBsaW5lIGlzIGRlY29kZWQgKi8KKyAgdWludDhfdCBlbmNfZGF0YVs4MF07IC8qIGRhdGEgdG8gZW5jb2RlICovCisgIHVuc2lnbmVkIGxpbmVfbnVtOyAgICAvKiBudW1iZXIgcmVhZCBvbiBjdXJyZW50IGxpbmUgKi8KKyAgaW50IGV4cGVjdF9ubDsKK307CisKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9ICAvKiBleHRlcm4gQyAqLworI2VuZGlmCisKKyNlbmRpZiAgLyogT1BFTlNTTF9IRUFERVJfQkFTRTY0X0ggKi8KZGlmZiAtLWdpdCBhL2NyeXB0by9iaW8vQ01ha2VMaXN0cy50eHQgYi9jcnlwdG8vYmlvL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MDkyZjAKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYmlvL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjggQEAKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQorCithZGRfbGlicmFyeSgKKwliaW8KKworCU9CSkVDVAorCisJYmlvLmMKKwliaW9fZXJyb3IuYworCWJpb19tZW0uYworCWJ1ZmZlci5jCisJY29ubmVjdC5jCisJZmQuYworCWZpbGUuYworCWhleGR1bXAuYworCXBhaXIuYworCXByaW50Zi5jCisJc29ja2V0LmMKKwlzb2NrZXRfaGVscGVyLmMKKykKKworYWRkX2V4ZWN1dGFibGUoCisJYmlvX3Rlc3QKKworCWJpb190ZXN0LmMKKykKKwordGFyZ2V0X2xpbmtfbGlicmFyaWVzKGJpb190ZXN0IGNyeXB0bykKZGlmZiAtLWdpdCBhL2NyeXB0by9iaW8vYmlvLmMgYi9jcnlwdG8vYmlvL2Jpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZjdmNDAKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYmlvL2Jpby5jCkBAIC0wLDAgKzEsNDUyIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC90aHJlYWQuaD4KKworCisvKiBCSU9fc2V0IGluaXRpYWxpc2VzIGEgQklPIHN0cnVjdHVyZSB0byBoYXZlIHRoZSBnaXZlbiB0eXBlIGFuZCBzZXRzIHRoZQorICogcmVmZXJlbmNlIGNvdW50IHRvIG9uZS4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBvciB6ZXJvIG9uIGVycm9yLiAqLworc3RhdGljIGludCBiaW9fc2V0KEJJTyAqYmlvLCBjb25zdCBCSU9fTUVUSE9EICptZXRob2QpIHsKKyAgLyogVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIHdpdGggYSBzdGFjayBhbGxvY2F0ZWQgfEJJT3wgc28gd2UgaGF2ZSB0bworICAgKiBhc3N1bWUgdGhhdCB0aGUgY29udGVudHMgb2YgfEJJT3wgYXJlIGFyYml0YXJ5LiBUaGlzIGFsc28gbWVhbnMgdGhhdCBpdCdsbAorICAgKiBsZWFrIG1lbW9yeSBpZiB5b3UgY2FsbCB8QklPX3NldHwgdHdpY2Ugb24gdGhlIHNhbWUgQklPLiAqLworICBtZW1zZXQoYmlvLCAwLCBzaXplb2YoQklPKSk7CisKKyAgYmlvLT5tZXRob2QgPSBtZXRob2Q7CisgIGJpby0+c2h1dGRvd24gPSAxOworICBiaW8tPnJlZmVyZW5jZXMgPSAxOworCisgIGlmICghQ1JZUFRPX25ld19leF9kYXRhKENSWVBUT19FWF9JTkRFWF9CSU8sIGJpbywgJmJpby0+ZXhfZGF0YSkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChtZXRob2QtPmNyZWF0ZSAhPSBOVUxMKSB7CisgICAgaWYgKCFtZXRob2QtPmNyZWF0ZShiaW8pKSB7CisgICAgICBDUllQVE9fZnJlZV9leF9kYXRhKENSWVBUT19FWF9JTkRFWF9CSU8sIGJpbywgJmJpby0+ZXhfZGF0YSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICByZXR1cm4gMTsKK30KKworQklPICpCSU9fbmV3KGNvbnN0IEJJT19NRVRIT0QgKm1ldGhvZCkgeworICBCSU8gKnJldCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihCSU8pKTsKKyAgaWYgKHJldCA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fbmV3LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBpZiAoIWJpb19zZXQocmV0LCBtZXRob2QpKSB7CisgICAgT1BFTlNTTF9mcmVlKHJldCk7CisgICAgcmV0ID0gTlVMTDsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK2ludCBCSU9fZnJlZShCSU8gKmJpbykgeworICBCSU8gKm5leHRfYmlvOworCisgIGZvciAoOyBiaW8gIT0gTlVMTDsgYmlvID0gbmV4dF9iaW8pIHsKKyAgICBpbnQgcmVmcyA9IENSWVBUT19hZGQoJmJpby0+cmVmZXJlbmNlcywgLTEsIENSWVBUT19MT0NLX0JJTyk7CisgICAgaWYgKHJlZnMgPiAwKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoYmlvLT5jYWxsYmFjayAhPSBOVUxMKSB7CisgICAgICBpbnQgaSA9IChpbnQpYmlvLT5jYWxsYmFjayhiaW8sIEJJT19DQl9GUkVFLCBOVUxMLCAwLCAwLCAxKTsKKyAgICAgIGlmIChpIDw9IDApIHsKKyAgICAgICAgcmV0dXJuIGk7CisgICAgICB9CisgICAgfQorCisgICAgbmV4dF9iaW8gPSBCSU9fcG9wKGJpbyk7CisKKyAgICBDUllQVE9fZnJlZV9leF9kYXRhKENSWVBUT19FWF9JTkRFWF9CSU8sIGJpbywgJmJpby0+ZXhfZGF0YSk7CisKKyAgICBpZiAoYmlvLT5tZXRob2QgIT0gTlVMTCAmJiBiaW8tPm1ldGhvZC0+ZGVzdHJveSAhPSBOVUxMKSB7CisgICAgICBiaW8tPm1ldGhvZC0+ZGVzdHJveShiaW8pOworICAgIH0KKworICAgIE9QRU5TU0xfZnJlZShiaW8pOworICB9CisgIHJldHVybiAxOworfQorCit2b2lkIEJJT192ZnJlZShCSU8gKmJpbykgeworICBCSU9fZnJlZShiaW8pOworfQorCit2b2lkIEJJT19mcmVlX2FsbChCSU8gKmJpbykgeworICBCSU9fZnJlZShiaW8pOworfQorCitzdGF0aWMgaW50IGJpb19pbyhCSU8gKmJpbywgdm9pZCAqYnVmLCBpbnQgbGVuLCBzaXplX3QgbWV0aG9kX29mZnNldCwKKyAgICAgICAgICAgICAgICAgIGludCBjYWxsYmFja19mbGFncywgdW5zaWduZWQgbG9uZyAqbnVtKSB7CisgIGludCBpOworICB0eXBlZGVmIGludCAoKmlvX2Z1bmNfdCkoQklPICosIGNoYXIgKiwgaW50KTsKKyAgaW9fZnVuY190IGlvX2Z1bmMgPSBOVUxMOworCisgIGlmIChiaW8gIT0gTlVMTCAmJiBiaW8tPm1ldGhvZCAhPSBOVUxMKSB7CisgICAgaW9fZnVuYyA9CisgICAgICAgICooKGNvbnN0IGlvX2Z1bmNfdCAqKSgoKGNvbnN0IHVpbnQ4X3QgKiliaW8tPm1ldGhvZCkgKyBtZXRob2Rfb2Zmc2V0KSk7CisgIH0KKworICBpZiAoaW9fZnVuYyA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBiaW9faW8sIEJJT19SX1VOU1VQUE9SVEVEX01FVEhPRCk7CisgICAgcmV0dXJuIC0yOworICB9CisKKyAgaWYgKGJpby0+Y2FsbGJhY2sgIT0gTlVMTCkgeworICAgIGkgPSAoaW50KSBiaW8tPmNhbGxiYWNrKGJpbywgY2FsbGJhY2tfZmxhZ3MsIGJ1ZiwgbGVuLCAwTCwgMUwpOworICAgIGlmIChpIDw9IDApIHsKKyAgICAgIHJldHVybiBpOworICAgIH0KKyAgfQorCisgIGlmICghYmlvLT5pbml0KSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBiaW9faW8sIEJJT19SX1VOSU5JVElBTElaRUQpOworICAgIHJldHVybiAtMjsKKyAgfQorCisgIGkgPSAwOworICBpZiAoYnVmICE9IE5VTEwgJiYgbGVuID4gMCkgeworICAgIGkgPSBpb19mdW5jKGJpbywgYnVmLCBsZW4pOworICB9CisKKyAgaWYgKGkgPiAwKSB7CisgICAgKm51bSArPSBpOworICB9CisKKyAgaWYgKGJpby0+Y2FsbGJhY2sgIT0gTlVMTCkgeworICAgIGkgPSAoaW50KShiaW8tPmNhbGxiYWNrKGJpbywgY2FsbGJhY2tfZmxhZ3MgfCBCSU9fQ0JfUkVUVVJOLCBidWYsIGxlbiwgMEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpaSkpOworICB9CisKKyAgcmV0dXJuIGk7Cit9CisKK2ludCBCSU9fcmVhZChCSU8gKmJpbywgdm9pZCAqYnVmLCBpbnQgbGVuKSB7CisgIHJldHVybiBiaW9faW8oYmlvLCBidWYsIGxlbiwgb2Zmc2V0b2YoQklPX01FVEhPRCwgYnJlYWQpLCBCSU9fQ0JfUkVBRCwKKyAgICAgICAgICAgICAgICAmYmlvLT5udW1fcmVhZCk7Cit9CisKK2ludCBCSU9fZ2V0cyhCSU8gKmJpbywgY2hhciAqYnVmLCBpbnQgbGVuKSB7CisgIHJldHVybiBiaW9faW8oYmlvLCBidWYsIGxlbiwgb2Zmc2V0b2YoQklPX01FVEhPRCwgYmdldHMpLCBCSU9fQ0JfR0VUUywKKyAgICAgICAgICAgICAgICAmYmlvLT5udW1fcmVhZCk7Cit9CisKK2ludCBCSU9fd3JpdGUoQklPICpiaW8sIGNvbnN0IHZvaWQgKmluLCBpbnQgaW5sKSB7CisgIHJldHVybiBiaW9faW8oYmlvLCAoY2hhciAqKWluLCBpbmwsIG9mZnNldG9mKEJJT19NRVRIT0QsIGJ3cml0ZSksCisgICAgICAgICAgICAgICAgQklPX0NCX1dSSVRFLCAmYmlvLT5udW1fd3JpdGUpOworfQorCitpbnQgQklPX3B1dHMoQklPICpiaW8sIGNvbnN0IGNoYXIgKmluKSB7CisgIHJldHVybiBCSU9fd3JpdGUoYmlvLCBpbiwgc3RybGVuKGluKSk7Cit9CisKK2ludCBCSU9fZmx1c2goQklPICpiaW8pIHsKKyAgcmV0dXJuIEJJT19jdHJsKGJpbywgQklPX0NUUkxfRkxVU0gsIDAsIE5VTEwpOworfQorCitsb25nIEJJT19jdHJsKEJJTyAqYmlvLCBpbnQgY21kLCBsb25nIGxhcmcsIHZvaWQgKnBhcmcpIHsKKyAgbG9uZyByZXQ7CisKKyAgaWYgKGJpbyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoYmlvLT5tZXRob2QgPT0gTlVMTCB8fCBiaW8tPm1ldGhvZC0+Y3RybCA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fY3RybCwgQklPX1JfVU5TVVBQT1JURURfTUVUSE9EKTsKKyAgICByZXR1cm4gLTI7CisgIH0KKworICBpZiAoYmlvLT5jYWxsYmFjayAhPSBOVUxMKSB7CisgICAgcmV0ID0gYmlvLT5jYWxsYmFjayhiaW8sIEJJT19DQl9DVFJMLCBwYXJnLCBjbWQsIGxhcmcsIDEpOworICAgIGlmIChyZXQgPD0gMCkgeworICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgIH0KKworICByZXQgPSBiaW8tPm1ldGhvZC0+Y3RybChiaW8sIGNtZCwgbGFyZywgcGFyZyk7CisKKyAgaWYgKGJpby0+Y2FsbGJhY2sgIT0gTlVMTCkgeworICAgIHJldCA9IGJpby0+Y2FsbGJhY2soYmlvLCBCSU9fQ0JfQ1RSTCB8IEJJT19DQl9SRVRVUk4sIHBhcmcsIGNtZCwgbGFyZywgcmV0KTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK2NoYXIgKkJJT19wdHJfY3RybChCSU8gKmIsIGludCBjbWQsIGxvbmcgbGFyZykgeworICBjaGFyICpwID0gTlVMTDsKKworICBpZiAoQklPX2N0cmwoYiwgY21kLCBsYXJnLCAodm9pZCAqKSZwKSA8PSAwKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICByZXR1cm4gcDsKK30KKworbG9uZyBCSU9faW50X2N0cmwoQklPICpiLCBpbnQgY21kLCBsb25nIGxhcmcsIGludCBpYXJnKSB7CisgIGludCBpID0gaWFyZzsKKworICByZXR1cm4gQklPX2N0cmwoYiwgY21kLCBsYXJnLCAodm9pZCAqKSZpKTsKK30KKworaW50IEJJT19yZXNldChCSU8gKmJpbykgeworICByZXR1cm4gQklPX2N0cmwoYmlvLCBCSU9fQ1RSTF9SRVNFVCwgMCwgTlVMTCk7Cit9CisKK3ZvaWQgQklPX3NldF9mbGFncyhCSU8gKmJpbywgaW50IGZsYWdzKSB7CisgIGJpby0+ZmxhZ3MgfD0gZmxhZ3M7Cit9CisKK2ludCBCSU9fdGVzdF9mbGFncyhjb25zdCBCSU8gKmJpbywgaW50IGZsYWdzKSB7CisgIHJldHVybiBiaW8tPmZsYWdzICYgZmxhZ3M7Cit9CisKK2ludCBCSU9fc2hvdWxkX3JlYWQoY29uc3QgQklPICpiaW8pIHsKKyAgcmV0dXJuIEJJT190ZXN0X2ZsYWdzKGJpbywgQklPX0ZMQUdTX1JFQUQpOworfQorCitpbnQgQklPX3Nob3VsZF93cml0ZShjb25zdCBCSU8gKmJpbykgeworICByZXR1cm4gQklPX3Rlc3RfZmxhZ3MoYmlvLCBCSU9fRkxBR1NfV1JJVEUpOworfQorCitpbnQgQklPX3Nob3VsZF9yZXRyeShjb25zdCBCSU8gKmJpbykgeworICByZXR1cm4gQklPX3Rlc3RfZmxhZ3MoYmlvLCBCSU9fRkxBR1NfU0hPVUxEX1JFVFJZKTsKK30KKworaW50IEJJT19zaG91bGRfaW9fc3BlY2lhbChjb25zdCBCSU8gKmJpbykgeworICByZXR1cm4gQklPX3Rlc3RfZmxhZ3MoYmlvLCBCSU9fRkxBR1NfSU9fU1BFQ0lBTCk7Cit9CisKK2ludCBCSU9fZ2V0X3JldHJ5X3JlYXNvbihjb25zdCBCSU8gKmJpbykgeyByZXR1cm4gYmlvLT5yZXRyeV9yZWFzb247IH0KKwordm9pZCBCSU9fY2xlYXJfZmxhZ3MoQklPICpiaW8sIGludCBmbGFncykgeworICBiaW8tPmZsYWdzICY9IH5mbGFnczsKK30KKwordm9pZCBCSU9fc2V0X3JldHJ5X3JlYWQoQklPICpiaW8pIHsKKyAgYmlvLT5mbGFncyB8PSBCSU9fRkxBR1NfUkVBRCB8IEJJT19GTEFHU19TSE9VTERfUkVUUlk7Cit9CisKK3ZvaWQgQklPX3NldF9yZXRyeV93cml0ZShCSU8gKmJpbykgeworICBiaW8tPmZsYWdzIHw9IEJJT19GTEFHU19XUklURSB8IEJJT19GTEFHU19TSE9VTERfUkVUUlk7Cit9CisKK3N0YXRpYyBjb25zdCBpbnQga1JldHJ5RmxhZ3MgPSBCSU9fRkxBR1NfUldTIHwgQklPX0ZMQUdTX1NIT1VMRF9SRVRSWTsKKworaW50IEJJT19nZXRfcmV0cnlfZmxhZ3MoQklPICpiaW8pIHsKKyAgcmV0dXJuIGJpby0+ZmxhZ3MgJiBrUmV0cnlGbGFnczsKK30KKwordm9pZCBCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoQklPICpiaW8pIHsKKyAgYmlvLT5mbGFncyAmPSB+a1JldHJ5RmxhZ3M7CisgIGJpby0+cmV0cnlfcmVhc29uID0gMDsKK30KKworaW50IEJJT19tZXRob2RfdHlwZShjb25zdCBCSU8gKmJpbykgeyByZXR1cm4gYmlvLT5tZXRob2QtPnR5cGU7IH0KKwordm9pZCBCSU9fY29weV9uZXh0X3JldHJ5KEJJTyAqYmlvKSB7CisgIEJJT19jbGVhcl9yZXRyeV9mbGFncyhiaW8pOworICBCSU9fc2V0X2ZsYWdzKGJpbywgQklPX2dldF9yZXRyeV9mbGFncyhiaW8tPm5leHRfYmlvKSk7CisgIGJpby0+cmV0cnlfcmVhc29uID0gYmlvLT5uZXh0X2Jpby0+cmV0cnlfcmVhc29uOworfQorCitsb25nIEJJT19jYWxsYmFja19jdHJsKEJJTyAqYmlvLCBpbnQgY21kLCBiaW9faW5mb19jYiBmcCkgeworICBsb25nIHJldDsKKyAgYmlvX2luZm9fY2IgY2I7CisKKyAgaWYgKGJpbyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoYmlvLT5tZXRob2QgPT0gTlVMTCB8fCBiaW8tPm1ldGhvZC0+Y2FsbGJhY2tfY3RybCA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fY2FsbGJhY2tfY3RybCwgQklPX1JfVU5TVVBQT1JURURfTUVUSE9EKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGNiID0gYmlvLT5jYWxsYmFjazsKKworICBpZiAoY2IgIT0gTlVMTCkgeworICAgIHJldCA9IGNiKGJpbywgQklPX0NCX0NUUkwsICh2b2lkICopJmZwLCBjbWQsIDAsIDFMKTsKKyAgICBpZiAocmV0IDw9IDApIHsKKyAgICAgIHJldHVybiByZXQ7CisgICAgfQorICB9CisKKyAgcmV0ID0gYmlvLT5tZXRob2QtPmNhbGxiYWNrX2N0cmwoYmlvLCBjbWQsIGZwKTsKKworICBpZiAoY2IgIT0gTlVMTCkgeworICAgIHJldCA9IGNiKGJpbywgQklPX0NCX0NUUkwgfCBCSU9fQ0JfUkVUVVJOLCAodm9pZCAqKSZmcCwgY21kLCAwLCByZXQpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc2l6ZV90IEJJT19wZW5kaW5nKGNvbnN0IEJJTyAqYmlvKSB7CisgIHJldHVybiBCSU9fY3RybCgoQklPICopIGJpbywgQklPX0NUUkxfUEVORElORywgMCwgTlVMTCk7Cit9CisKK3NpemVfdCBCSU9fd3BlbmRpbmcoY29uc3QgQklPICpiaW8pIHsKKyAgcmV0dXJuIEJJT19jdHJsKChCSU8gKikgYmlvLCBCSU9fQ1RSTF9XUEVORElORywgMCwgTlVMTCk7Cit9CisKK2ludCBCSU9fc2V0X2Nsb3NlKEJJTyAqYmlvLCBpbnQgY2xvc2VfZmxhZykgeworICByZXR1cm4gQklPX2N0cmwoYmlvLCBCSU9fQ1RSTF9TRVRfQ0xPU0UsIGNsb3NlX2ZsYWcsIE5VTEwpOworfQorCitCSU8gKkJJT19wdXNoKEJJTyAqYmlvLCBCSU8gKmFwcGVuZGVkX2JpbykgeworICBCSU8gKmxhc3RfYmlvOworCisgIGlmIChiaW8gPT0gTlVMTCkgeworICAgIHJldHVybiBiaW87CisgIH0KKworICBsYXN0X2JpbyA9IGJpbzsKKyAgd2hpbGUgKGxhc3RfYmlvLT5uZXh0X2JpbyAhPSBOVUxMKSB7CisgICAgbGFzdF9iaW8gPSBsYXN0X2Jpby0+bmV4dF9iaW87CisgIH0KKworICBsYXN0X2Jpby0+bmV4dF9iaW8gPSBhcHBlbmRlZF9iaW87CisgIC8qIFRPRE8oZm9yayk6IHRoaXMgc2VlbXMgdmVyeSBzdXNwZWN0LiBJZiB3ZSBnb3QgcmlkIG9mIEJJTyBTU0wsIHdlIGNvdWxkCisgICAqIGdldCByaWQgb2YgdGhpcy4gKi8KKyAgQklPX2N0cmwoYmlvLCBCSU9fQ1RSTF9QVVNILCAwLCBiaW8pOworCisgIHJldHVybiBiaW87Cit9CisKK0JJTyAqQklPX3BvcChCSU8gKmJpbykgeworICBCSU8gKnJldDsKKworICBpZiAoYmlvID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXQgPSBiaW8tPm5leHRfYmlvOworICBCSU9fY3RybChiaW8sIEJJT19DVFJMX1BPUCwgMCwgYmlvKTsKKyAgYmlvLT5uZXh0X2JpbyA9IE5VTEw7CisgIHJldHVybiByZXQ7Cit9CisKK0JJTyAqQklPX25leHQoQklPICpiaW8pIHsKKyAgaWYgKCFiaW8pIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gYmlvLT5uZXh0X2JpbzsKK30KKworQklPICpCSU9fZmluZF90eXBlKEJJTyAqYmlvLCBpbnQgdHlwZSkgeworICBpbnQgbWV0aG9kX3R5cGUsIG1hc2s7CisKKyAgaWYgKCFiaW8pIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBtYXNrID0gdHlwZSAmIDB4ZmY7CisKKyAgZG8geworICAgIGlmIChiaW8tPm1ldGhvZCAhPSBOVUxMKSB7CisgICAgICBtZXRob2RfdHlwZSA9IGJpby0+bWV0aG9kLT50eXBlOworCisgICAgICBpZiAoIW1hc2spIHsKKyAgICAgICAgaWYgKG1ldGhvZF90eXBlICYgdHlwZSkgeworICAgICAgICAgIHJldHVybiBiaW87CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAobWV0aG9kX3R5cGUgPT0gdHlwZSkgeworICAgICAgICByZXR1cm4gYmlvOworICAgICAgfQorICAgIH0KKyAgICBiaW8gPSBiaW8tPm5leHRfYmlvOworICB9IHdoaWxlIChiaW8gIT0gTlVMTCk7CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK2ludCBCSU9faW5kZW50KEJJTyAqYmlvLCB1bnNpZ25lZCBpbmRlbnQsIHVuc2lnbmVkIG1heF9pbmRlbnQpIHsKKyAgaWYgKGluZGVudCA+IG1heF9pbmRlbnQpIHsKKyAgICBpbmRlbnQgPSBtYXhfaW5kZW50OworICB9CisKKyAgd2hpbGUgKGluZGVudC0tKSB7CisgICAgaWYgKEJJT19wdXRzKGJpbywgIiAiKSAhPSAxKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgQklPX3ByaW50X2Vycm9yc19mcChGSUxFICpvdXQpIHsKKyAgQklPICpiaW8gPSBCSU9fbmV3X2ZwKG91dCwgQklPX05PQ0xPU0UpOworICBCSU9fcHJpbnRfZXJyb3JzKGJpbyk7CisgIEJJT19mcmVlKGJpbyk7Cit9CisKK3N0YXRpYyBpbnQgcHJpbnRfYmlvKGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IGxlbiwgdm9pZCAqYmlvKSB7CisgIHJldHVybiBCSU9fd3JpdGUoKEJJTyAqKWJpbywgc3RyLCBsZW4pOworfQorCit2b2lkIEJJT19wcmludF9lcnJvcnMoQklPICpiaW8pIHsKKyAgRVJSX3ByaW50X2Vycm9yc19jYihwcmludF9iaW8sIGJpbyk7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vYmlvL2Jpby5oIGIvY3J5cHRvL2Jpby9iaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjA1NGMzCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2Jpby9iaW8uaApAQCAtMCwwICsxLDc5MCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2lmbmRlZiBPUEVOU1NMX0hFQURFUl9CSU9fSAorI2RlZmluZSBPUEVOU1NMX0hFQURFUl9CSU9fSAorCisjaW5jbHVkZSA8b3BlbnNzbC9iYXNlLmg+CisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPiAgLyogRm9yIEZJTEUgKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvZXhfZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3RhY2suaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIEJJTyBhYnN0cmFjdHMgb3ZlciBhIGZpbGUtZGVzY3JpcHRvciBsaWtlIGludGVyZmFjZS4gKi8KKworCisvKiBBbGxvY2F0aW9uIGFuZCBmcmVlaW5nLiAqLworCitERUZJTkVfU1RBQ0tfT0YoQklPKTsKKworLyogQklPX25ldyBjcmVhdGVzIGEgbmV3IEJJTyB3aXRoIHRoZSBnaXZlbiB0eXBlIGFuZCBhIHJlZmVyZW5jZSBjb3VudCBvZiBvbmUuCisgKiBJdCByZXR1cm5zIHRoZSBmcmVzaCB8QklPfCwgb3IgTlVMTCBvbiBlcnJvci4gKi8KK0JJTyAqQklPX25ldyhjb25zdCBCSU9fTUVUSE9EICp0eXBlKTsKKworLyogQklPX2ZyZWUgZGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHxiaW98LiBJZiB0aGUgcmVmZXJlbmNlIGNvdW50CisgKiBkcm9wcyB0byB6ZXJvLCBpdCAob3B0aW9uYWxseSkgY2FsbHMgdGhlIEJJTydzIGNhbGxiYWNrIHdpdGggfEJJT19DQl9GUkVFfCwKKyAqIGZyZWVzIHRoZSBleF9kYXRhIGFuZCB0aGVuLCBpZiB0aGUgQklPIGhhcyBhIGRlc3Ryb3kgY2FsbGJhY2sgZm9yIHRoZQorICogbWV0aG9kLCBjYWxscyBpdC4gRmluYWxseSBpdCBmcmVlcyB8YmlvfCBpdHNlbGYuIEl0IHRoZW4gcmVwZWF0cyB0aGF0IGZvcgorICogdGhlIG5leHQgQklPIGluIHRoZSBjaGFpbiwgaWYgYW55LgorICoKKyAqIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3Mgb3IgemVybyBvdGhlcndpc2UuICovCitpbnQgQklPX2ZyZWUoQklPICpiaW8pOworCisvKiBCSU9fdmZyZWUgcGVyZm9ybXMgdGhlIHNhbWUgYWN0aW9ucyBhcyB8QklPX2ZyZWV8LCBidXQgaGFzIGEgdm9pZCByZXR1cm4KKyAqIHZhbHVlLiBUaGlzIGlzIHByb3ZpZGVkIGZvciBBUEktY29tcGF0LgorICoKKyAqIFRPRE8oZm9yayk6IHJlbW92ZS4gKi8KK3ZvaWQgQklPX3ZmcmVlKEJJTyAqYmlvKTsKKworCisvKiBCYXNpYyBJL08uICovCisKKy8qIEJJT19yZWFkIGF0dGVtcHRzIHRvIHJlYWQgfGxlbnwgYnl0ZXMgaW50byB8ZGF0YXwuIEl0IHJldHVybnMgdGhlIG51bWJlciBvZgorICogYnl0ZXMgcmVhZCwgemVybyBvbiBFT0YsIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGVycm9yLiAqLworaW50IEJJT19yZWFkKEJJTyAqYmlvLCB2b2lkICpkYXRhLCBpbnQgbGVuKTsKKworLyogQklPX2dldHMgInJlYWRzIGEgbGluZSIgZnJvbSB8YmlvfCBhbmQgcHV0cyBhdCBtb3N0IHxzaXplfCBieXRlcyBpbnRvIHxidWZ8LgorICogSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZXJyb3IuIFRoZQorICogcGhyYXNlICJyZWFkcyBhIGxpbmUiIGlzIGluIHF1b3RlcyBpbiB0aGUgcHJldmlvdXMgc2VudGVuY2UgYmVjYXVzZSB0aGUKKyAqIGV4YWN0IG9wZXJhdGlvbiBkZXBlbmRzIG9uIHRoZSBCSU8ncyBtZXRob2QuIEZvciBleGFtcGxlLCBhIGRpZ2VzdCBCSU8gd2lsbAorICogcmV0dXJuIHRoZSBkaWdlc3QgaW4gcmVzcG9uc2UgdG8gYSB8QklPX2dldHN8IGNhbGwuCisgKgorICogVE9ETyhmb3JrKTogYXVkaXQgdGhlIHNldCBvZiBCSU9zIHRoYXQgd2UgZW5kIHVwIG5lZWRpbmcuIElmIGFsbCBhY3R1YWxseQorICogcmV0dXJuIGEgbGluZSBmb3IgdGhpcyBjYWxsLCByZW1vdmUgdGhlIHdhcm5pbmcgYWJvdmUuICovCitpbnQgQklPX2dldHMoQklPICpiaW8sIGNoYXIgKmJ1ZiwgaW50IHNpemUpOworCisvKiBCSU9fd3JpdGUgd3JpdGVzIHxsZW58IGJ5dGVzIGZyb20gfGRhdGF8IHRvIEJJTy4gSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mCisgKiBieXRlcyB3cml0dGVuIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGVycm9yLiAqLworaW50IEJJT193cml0ZShCSU8gKmJpbywgY29uc3Qgdm9pZCAqZGF0YSwgaW50IGxlbik7CisKKy8qIEJJT19wdXRzIHdyaXRlcyBhIE5VTCB0ZXJtaW5hdGVkIHN0cmluZyBmcm9tIHxidWZ8IHRvIHxiaW98LiBJdCByZXR1cm5zIHRoZQorICogbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZXJyb3IuICovCitpbnQgQklPX3B1dHMoQklPICpiaW8sIGNvbnN0IGNoYXIgKmJ1Zik7CisKKy8qIEJJT19mbHVzaCBmbHVzaGVzIGFueSBidWZmZXJlZCBvdXRwdXQuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8KKyAqIG90aGVyd2lzZS4gKi8KK2ludCBCSU9fZmx1c2goQklPICpiaW8pOworCisKKy8qIExvdy1sZXZlbCBjb250cm9sIGZ1bmN0aW9ucy4KKyAqCisgKiBUaGVzZSBhcmUgZ2VuZXJpYyBmdW5jdGlvbnMgZm9yIHNlbmRpbmcgY29udHJvbCByZXF1ZXN0cyB0byBhIEJJTy4gSW4KKyAqIGdlbmVyYWwgb25lIHNob3VsZCB1c2UgdGhlIHdyYXBwZXIgZnVuY3Rpb25zIGxpa2UgfEJJT19nZXRfY2xvc2V8LiAqLworCisvKiBCSU9fY3RybCBzZW5kcyB0aGUgY29udHJvbCByZXF1ZXN0IHxjbWR8IHRvIHxiaW98LiBUaGUgfGNtZHwgYXJndW1lbnQgc2hvdWxkCisgKiBiZSBvbmUgb2YgdGhlIHxCSU9fQ18qfCB2YWx1ZXMuICovCitsb25nIEJJT19jdHJsKEJJTyAqYmlvLCBpbnQgY21kLCBsb25nIGxhcmcsIHZvaWQgKnBhcmcpOworCisvKiBCSU9fcHRyX2N0cmwgYWN0cyBsaWtlIHxCSU9fY3RybHwgYnV0IHBhc3NlcyB0aGUgYWRkcmVzcyBvZiBhIHx2b2lkKnwKKyAqIHBvaW50ZXIgYXMgfHBhcmd8IGFuZCByZXR1cm5zIHRoZSB2YWx1ZSB0aGF0IGlzIHdyaXR0ZW4gdG8gaXQsIG9yIE5VTEwgaWYKKyAqIHRoZSBjb250cm9sIHJlcXVlc3QgcmV0dXJucyA8PSAwLiAqLworY2hhciAqQklPX3B0cl9jdHJsKEJJTyAqYnAsIGludCBjbWQsIGxvbmcgbGFyZyk7CisKKy8qIEJJT19pbnRfY3RybCBhY3RzIGxpa2UgfEJJT19jdHJsfCBidXQgcGFzc2VzIHRoZSBhZGRyZXNzIG9mIGEgY29weSBvZiB8aWFyZ3wKKyAqIGFzIHxwYXJnfC4gKi8KK2xvbmcgQklPX2ludF9jdHJsKEJJTyAqYnAsIGludCBjbWQsIGxvbmcgbGFyZywgaW50IGlhcmcpOworCisvKiBCSU9fcmVzZXQgcmVzZXRzIHxiaW98IHRvIGl0cyBpbml0aWFsIHN0YXRlLCB0aGUgcHJlY2lzZSBtZWFuaW5nIG9mIHdoaWNoCisgKiBkZXBlbmRzIG9uIHRoZSBjb25jcmV0ZSB0eXBlIG9mIHxiaW98LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvCisgKiBvdGhlcndpc2UuICovCitpbnQgQklPX3Jlc2V0KEJJTyAqYmlvKTsKKworLyogQklPX3NldF9mbGFncyBPUnMgfGZsYWdzfCB3aXRoIHxiaW8tPmZsYWdzfC4gKi8KK3ZvaWQgQklPX3NldF9mbGFncyhCSU8gKmJpbywgaW50IGZsYWdzKTsKKworLyogQklPX3Rlc3RfZmxhZ3MgcmV0dXJucyB8YmlvLT5mbGFnc3wgQU5EIHxmbGFnc3wuICovCitpbnQgQklPX3Rlc3RfZmxhZ3MoY29uc3QgQklPICpiaW8sIGludCBmbGFncyk7CisKKy8qIEJJT19zaG91bGRfcmVhZCByZXR1cm5zIG5vbi16ZXJvIGlmIHxiaW98IGVuY291bnRlcmVkIGEgdGVtcG9yYXJ5IGVycm9yCisgKiB3aGlsZSByZWFkaW5nIChpLmUuIEVBR0FJTiksIGluZGljYXRpbmcgdGhhdCB0aGUgY2FsbGVyIHNob3VsZCByZXRyeSB0aGUKKyAqIHJlYWQuICovCitpbnQgQklPX3Nob3VsZF9yZWFkKGNvbnN0IEJJTyAqYmlvKTsKKworLyogQklPX3Nob3VsZF93cml0ZSByZXR1cm5zIG5vbi16ZXJvIGlmIHxiaW98IGVuY291bnRlcmVkIGEgdGVtcG9yYXJ5IGVycm9yCisgKiB3aGlsZSB3cml0aW5nIChpLmUuIEVBR0FJTiksIGluZGljYXRpbmcgdGhhdCB0aGUgY2FsbGVyIHNob3VsZCByZXRyeSB0aGUKKyAqIHdyaXRlLiAqLworaW50IEJJT19zaG91bGRfd3JpdGUoY29uc3QgQklPICpiaW8pOworCisvKiBCSU9fc2hvdWxkX3JldHJ5IHJldHVybnMgbm9uLXplcm8gaWYgdGhlIHJlYXNvbiB0aGF0IGNhdXNlZCBhIGZhaWxlZCBJL08KKyAqIG9wZXJhdGlvbiBpcyB0ZW1wb3JhcnkgYW5kIHRodXMgdGhlIG9wZXJhdGlvbiBzaG91bGQgYmUgcmV0cmllZC4gT3RoZXJ3aXNlLAorICogaXQgd2FzIGEgcGVybWFuZW50IGVycm9yIGFuZCBpdCByZXR1cm5zIHplcm8uICovCitpbnQgQklPX3Nob3VsZF9yZXRyeShjb25zdCBCSU8gKmJpbyk7CisKKy8qIEJJT19zaG91bGRfaW9fc3BlY2lhbCByZXR1cm5zIG5vbi16ZXJvIGlmIHxiaW98IGVuY291bnRlcmVkIGEgdGVtcG9yYXJ5CisgKiBlcnJvciB3aGlsZSBwZXJmb3JtaW5nIGEgc3BlY2lhbCBJL08gb3BlcmF0aW9uLCBpbmRpY2F0aW5nIHRoYXQgdGhlIGNhbGxlcgorICogc2hvdWxkIHJldHJ5LiBUaGUgb3BlcmF0aW9uIHRoYXQgY2F1c2VkIHRoZSBlcnJvciBpcyByZXR1cm5lZCBieQorICogfEJJT19nZXRfcmV0cnlfcmVhc29ufC4gKi8KK2ludCBCSU9fc2hvdWxkX2lvX3NwZWNpYWwoY29uc3QgQklPICpiaW8pOworCisvKiBCSU9fUlJfU1NMX1g1MDlfTE9PS1VQIGluZGljYXRlcyB0aGF0IGFuIFNTTCBCSU8gYmxvY2tlZCBiZWNhdXNlIHRoZSBTU0wKKyAqIGxpYnJhcnkgcmV0dXJuZWQgd2l0aCBTU0xfRVJST1JfV0FOVF9YNTA5X0xPT0tVUC4KKyAqCisgKiBUT0RPKGZvcmspOiByZW1vdmUuICovCisjZGVmaW5lIEJJT19SUl9TU0xfWDUwOV9MT09LVVAgMHgwMQorCisvKiBCSU9fUlJfQ09OTkVDVCBpbmRpY2F0ZXMgdGhhdCBhIGNvbm5lY3Qgd291bGQgaGF2ZSBibG9ja2VkICovCisjZGVmaW5lIEJJT19SUl9DT05ORUNUIDB4MDIKKworLyogQklPX1JSX0FDQ0VQVCBpbmRpY2F0ZXMgdGhhdCBhbiBhY2NlcHQgd291bGQgaGF2ZSBibG9ja2VkICovCisjZGVmaW5lIEJJT19SUl9BQ0NFUFQgMHgwMworCisvKiBCSU9fZ2V0X3JldHJ5X3JlYXNvbiByZXR1cm5zIHRoZSBzcGVjaWFsIEkvTyBvcGVyYXRpb24gdGhhdCBuZWVkcyB0byBiZQorICogcmV0cmllZC4gVGhlIHJldHVybiB2YWx1ZSBpcyBvbmUgb2YgdGhlIHxCSU9fUlJfKnwgdmFsdWVzLiAqLworaW50IEJJT19nZXRfcmV0cnlfcmVhc29uKGNvbnN0IEJJTyAqYmlvKTsKKworLyogQklPX2NsZWFyX2ZsYWdzIEFORHMgfGJpby0+ZmxhZ3N8IHdpdGggdGhlIGJpdHdpc2UtY29tcGxlbWVudCBvZiB8ZmxhZ3N8LiAqLwordm9pZCBCSU9fY2xlYXJfZmxhZ3MoQklPICpiaW8sIGludCBmbGFncyk7CisKKy8qIEJJT19zZXRfcmV0cnlfcmVhZCBzZXRzIHRoZSB8QklPX0ZMQUdTX1JFQUR8IGFuZCB8QklPX0ZMQUdTX1NIT1VMRF9SRVRSWXwKKyAqIGZsYWdzIG9uIHxiaW98LiAqLwordm9pZCBCSU9fc2V0X3JldHJ5X3JlYWQoQklPICpiaW8pOworCisvKiBCSU9fc2V0X3JldHJ5X3JlYWQgc2V0cyB0aGUgfEJJT19GTEFHU19XUklURXwgYW5kIHxCSU9fRkxBR1NfU0hPVUxEX1JFVFJZfAorICogZmxhZ3Mgb24gfGJpb3wuICovCit2b2lkIEJJT19zZXRfcmV0cnlfd3JpdGUoQklPICpiaW8pOworCisvKiBCSU9fZ2V0X3JldHJ5X2ZsYWdzIGdldHMgdGhlIHxCSU9fRkxBR1NfUkVBRHwsIHxCSU9fRkxBR1NfV1JJVEV8LAorICogfEJJT19GTEFHU19JT19TUEVDSUFMfCBhbmQgfEJJT19GTEFHU19TSE9VTERfUkVUUll8IGZsYWdzIGZyb20gfGJpb3wuICovCitpbnQgQklPX2dldF9yZXRyeV9mbGFncyhCSU8gKmJpbyk7CisKKy8qIEJJT19jbGVhcl9yZXRyeV9mbGFncyBjbGVhcnMgdGhlIHxCSU9fRkxBR1NfUkVBRHwsIHxCSU9fRkxBR1NfV1JJVEV8LAorICogfEJJT19GTEFHU19JT19TUEVDSUFMfCBhbmQgfEJJT19GTEFHU19TSE9VTERfUkVUUll8IGZsYWdzIGZyb20gfGJpb3wuICovCit2b2lkIEJJT19jbGVhcl9yZXRyeV9mbGFncyhCSU8gKmJpbyk7CisKKy8qIEJJT19tZXRob2RfdHlwZSByZXR1cm5zIHRoZSB0eXBlIG9mIHxiaW98LCB3aGljaCBpcyBvbmUgb2YgdGhlIHxCSU9fVFlQRV8qfAorICogdmFsdWVzLiAqLworaW50IEJJT19tZXRob2RfdHlwZShjb25zdCBCSU8gKmJpbyk7CisKKy8qIGJpb19pbmZvX2NiIGlzIHRoZSB0eXBlIG9mIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBjYW4gYmUgY2FsbGVkIGZvciBtb3N0CisgKiBCSU8gb3BlcmF0aW9ucy4gVGhlIHxldmVudHwgYXJndW1lbnQgaXMgb25lIG9mIHxCSU9fQ0JfKnwgYW5kIGNhbiBiZSBPUmVkCisgKiB3aXRoIHxCSU9fQ0JfUkVUVVJOfCBpZiB0aGUgY2FsbGJhY2sgaXMgYmVpbmcgbWFkZSBhZnRlciB0aGUgb3BlcmF0aW9uIGluCisgKiBxdWVzdGlvbi4gSW4gdGhhdCBjYXNlLCB8cmV0dXJuX3ZhbHVlfCB3aWxsIGNvbnRhaW4gdGhlIHJldHVybiB2YWx1ZSBmcm9tCisgKiB0aGUgb3BlcmF0aW9uLiAqLwordHlwZWRlZiBsb25nICgqYmlvX2luZm9fY2IpKEJJTyAqYmlvLCBpbnQgZXZlbnQsIGNvbnN0IGNoYXIgKnBhcmcsIGludCBjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBsYXJnLCBsb25nIHJldHVybl92YWx1ZSk7CisKKy8qIEJJT19jYWxsYmFja19jdHJsIGFsbG93cyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgbWFuaXB1bGF0ZWQuIFRoZSB8Y21kfAorICogYXJnIHdpbGwgZ2VuZXJhbGx5IGJlIHxCSU9fQ1RSTF9TRVRfQ0FMTEJBQ0t8IGJ1dCBhcmJpdGFyeSBjb21tYW5kIHZhbHVlcworICogY2FuIGJlIGludGVycHJldGVkIGJ5IHRoZSB8QklPfC4gKi8KK2xvbmcgQklPX2NhbGxiYWNrX2N0cmwoQklPICpiaW8sIGludCBjbWQsIGJpb19pbmZvX2NiIGZwKTsKKworLyogQklPX3BlbmRpbmcgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBlbmRpbmcgdG8gYmUgcmVhZC4gKi8KK3NpemVfdCBCSU9fcGVuZGluZyhjb25zdCBCSU8gKmJpbyk7CisKKy8qIEJJT193cGVuZGluZyByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcGVuZGluZyB0byBiZSB3cml0dGVuLiAqLworc2l6ZV90IEJJT193cGVuZGluZyhjb25zdCBCSU8gKmJpbyk7CisKKy8qIEJJT19zZXRfY2xvc2Ugc2V0cyB0aGUgY2xvc2UgZmxhZyBmb3IgfGJpb3wuIFRoZSBtZWFuaW5nIG9mIHdoaWNoIGRlcGVuZHMgb24KKyAqIHRoZSB0eXBlIG9mIHxiaW98IGJ1dCwgZm9yIGV4YW1wbGUsIGEgbWVtb3J5IEJJTyBpbnRlcnByZXRzIHRoZSBjbG9zZSBmbGFnCisgKiBhcyBtZWFuaW5nIHRoYXQgaXQgb3ducyBpdHMgYnVmZmVyLiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvCisgKiBvdGhlcndpc2UuICovCitpbnQgQklPX3NldF9jbG9zZShCSU8gKmJpbywgaW50IGNsb3NlX2ZsYWcpOworCisKKy8qIE1hbmFnaW5nIGNoYWlucyBvZiBCSU9zLgorICoKKyAqIEJJT3MgY2FuIGJlIHB1dCBpbnRvIGNoYWlucyB3aGVyZSB0aGUgb3V0cHV0IG9mIG9uZSBpcyB1c2VkIGFzIHRoZSBpbnB1dCBvZgorICogdGhlIG5leHQgZXRjLiBUaGUgbW9zdCBjb21tb24gY2FzZSBpcyBhIGJ1ZmZlcmluZyBCSU8sIHdoaWNoIGFjY2VwdHMgYW5kCisgKiBidWZmZXJzIHdyaXRlcyB1bnRpbCBmbHVzaGVkIGludG8gdGhlIG5leHQgQklPIGluIHRoZSBjaGFpbi4gKi8KKworLyogQklPX3B1c2ggYWRkcyB8YXBwZW5kZWRfYmlvfCB0byB0aGUgZW5kIG9mIHRoZSBjaGFpbiB3aXRoIHxiaW98IGF0IHRoZSBoZWFkLgorICogSXQgcmV0dXJucyB8YmlvfC4gTm90ZSB0aGF0IHxhcHBlbmRlZF9iaW98IG1heSBiZSB0aGUgaGVhZCBvZiBhIGNoYWluIGl0c2VsZgorICogYW5kIHRodXMgdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBqb2luIHR3byBjaGFpbnMuCisgKgorICogQklPX3B1c2ggdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBjYWxsZXIncyByZWZlcmVuY2UgdG8gfGFwcGVuZGVkX2Jpb3wuICovCitCSU8gKkJJT19wdXNoKEJJTyAqYmlvLCBCSU8gKmFwcGVuZGVkX2Jpbyk7CisKKy8qIEJJT19wb3AgcmVtb3ZlcyB8YmlvfCBmcm9tIHRoZSBoZWFkIG9mIGEgY2hhaW4gYW5kIHJldHVybnMgdGhlIG5leHQgQklPIGluCisgKiB0aGUgY2hhaW4sIG9yIE5VTEwgaWYgdGhlcmUgaXMgbm8gbmV4dCBCSU8uCisgKgorICogVGhlIGNhbGxlciB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIGNoYWluJ3MgcmVmZXJlbmNlIHRvIHxiaW98LiAqLworQklPICpCSU9fcG9wKEJJTyAqYmlvKTsKKworLyogQklPX25leHQgcmV0dXJucyB0aGUgbmV4dCBCSU8gaW4gdGhlIGNoYWluIGFmdGVyIHxiaW98LCBvciBOVUxMIGlmIHRoZXJlIGlzCisgKiBubyBzdWNoIEJJTy4gKi8KK0JJTyAqQklPX25leHQoQklPICpiaW8pOworCisvKiBCSU9fZnJlZV9hbGwgY2FsbHMgfEJJT19mcmVlfC4KKyAqCisgKiBUT0RPKGZvcmspOiB1cGRhdGUgY2FsbGVycyBhbmQgcmVtb3ZlLiAqLwordm9pZCBCSU9fZnJlZV9hbGwoQklPICpiaW8pOworCisvKiBCSU9fZmluZF90eXBlIHdhbGtzIGEgY2hhaW4gb2YgQklPcyBhbmQgcmV0dXJucyB0aGUgZmlyc3QgdGhhdCBtYXRjaGVzCisgKiB8dHlwZXwsIHdoaWNoIGlzIG9uZSBvZiB0aGUgfEJJT19UWVBFXyp8IHZhbHVlcy4gKi8KK0JJTyAqQklPX2ZpbmRfdHlwZShCSU8gKmJpbywgaW50IHR5cGUpOworCisvKiBCSU9fY29weV9uZXh0X3JldHJ5IHNldHMgdGhlIHJldHJ5IGZsYWdzIGFuZCB8cmV0cnlfcmVhc29ufCBvZiB8YmlvfCBmcm9tCisgKiB0aGUgbmV4dCBCSU8gaW4gdGhlIGNoYWluLiAqLwordm9pZCBCSU9fY29weV9uZXh0X3JldHJ5KEJJTyAqYmlvKTsKKworCisvKiBQcmludGYgZnVuY3Rpb25zLgorICoKKyAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgdmVyc2lvbnMgb2YgcHJpbnRmIGZ1bmN0aW9ucyB0aGF0IG91dHB1dCB0byBhIEJJTyByYXRoZXIKKyAqIHRoYW4gYSBGSUxFLiAqLworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIF9fYmlvX2hfX2F0dHJfXyBfX2F0dHJpYnV0ZV9fCisjZWxzZQorI2RlZmluZSBfX2Jpb19oX19hdHRyX18oeCkKKyNlbmRpZgoraW50IEJJT19wcmludGYoQklPICpiaW8sIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorICAgIF9fYmlvX2hfX2F0dHJfXygoX19mb3JtYXRfXyhfX3ByaW50Zl9fLCAyLCAzKSkpOworCitpbnQgQklPX3ZwcmludGYoQklPICpiaW8sIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQorICAgIF9fYmlvX2hfX2F0dHJfXygoX19mb3JtYXRfXyhfX3ByaW50Zl9fLCAyLCAwKSkpOworI3VuZGVmIF9fYmlvX2hfX2F0dHJfXworCisKKy8qIFV0aWxpdHkgZnVuY3Rpb25zLiAqLworCisvKiBCSU9faW5kZW50IHByaW50cyBtaW4ofGluZGVudHwsIHxtYXhfaW5kZW50fCkgc3BhY2VzLiBJdCByZXR1cm5zIG9uZSBvbgorICogc3VjY2VzcyBhbmQgemVybyBvdGhlcndpc2UuICovCitpbnQgQklPX2luZGVudChCSU8gKmJpbywgdW5zaWduZWQgaW5kZW50LCB1bnNpZ25lZCBtYXhfaW5kZW50KTsKKworLyogQklPX2hleGR1bXAgd3JpdGVzIGEgaGV4IGR1bXAgb2YgfGRhdGF8IHRvIHxiaW98LiBFYWNoIGxpbmUgd2lsbCBiZSBpbmRlbnRlZAorICogYnkgfGluZGVudHwgc3BhY2VzLiAqLworaW50IEJJT19oZXhkdW1wKEJJTyAqYmlvLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgbGVuLCB1bnNpZ25lZCBpbmRlbnQpOworCisvKiBCSU9fcHJpbnRfZXJyb3JzX2ZwIHByaW50cyB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgZXJyb3Igc3RhY2sgdG8gfG91dHwKKyAqIHVzaW5nIGh1bWFuIHJlYWRhYmxlIHN0cmluZ3Mgd2hlcmUgcG9zc2libGUuICovCit2b2lkIEJJT19wcmludF9lcnJvcnNfZnAoRklMRSAqb3V0KTsKKworLyogQklPX3ByaW50X2Vycm9ycyBwcmludHMgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIGVycm9yIHN0YWNrIHRvIHxiaW98CisgKiB1c2luZyBodW1hbiByZWFkYWJsZSBzdHJpbmdzIHdoZXJlIHBvc3NpYmxlLiAqLwordm9pZCBCSU9fcHJpbnRfZXJyb3JzKEJJTyAqYmlvKTsKKworCisvKiBNZW1vcnkgQklPcy4KKyAqCisgKiBNZW1vcnkgQklPcyBjYW4gYmUgdXNlZCBhcyBhIHJlYWQtb25seSBzb3VyY2UgKHdpdGggfEJJT19uZXdfbWVtX2J1ZnwpIG9yIGEKKyAqIHdyaXRhYmxlIHNpbmsgKHdpdGggfEJJT19uZXd8LCB8QklPX3NfbWVtfCBhbmQgfEJJT19nZXRfbWVtX2J1ZnwpLiBEYXRhCisgKiB3cml0dGVuIHRvIGEgd3JpdGFibGUsIG1lbW9yeSBCSU8gY2FuIGJlIHJlY2FsbGVkIGJ5IHJlYWRpbmcgZnJvbSBpdC4KKyAqCisgKiBDYWxsaW5nIHxCSU9fcmVzZXR8IG9uIGEgcmVhZC1vbmx5IEJJTyByZXNldHMgaXQgdG8gdGhlIG9yaWdpbmFsIGNvbnRlbnRzLgorICogT24gYSB3cml0YWJsZSBCSU8sIGl0IGNsZWFycyBhbnkgZGF0YS4KKyAqCisgKiBJZiB0aGUgY2xvc2UgZmxhZyBpcyBzZXQgdG8gfEJJT19OT0NMT1NFfCAobm90IHRoZSBkZWZhdWx0KSB0aGVuIHRoZQorICogdW5kZXJseWluZyB8QlVGX01FTXwgd2lsbCBub3QgYmUgZnJlZWQgd2hlbiB0aGUgfEJJT3wgaXMgZnJlZWQuCisgKgorICogTWVtb3J5IEJJT3Mgc3VwcG9ydCB8QklPX2dldHN8IGFuZCB8QklPX3B1dHN8LgorICoKKyAqIHxCSU9fZW9mfCBpcyB0cnVlIGlmIG5vIGRhdGEgaXMgaW4gdGhlIEJJTy4KKyAqCisgKiB8QklPX2N0cmxfcGVuZGluZ3wgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGN1cnJlbnRseSBzdG9yZWQuICovCisKKy8qIEJJT19zX21lbSByZXR1cm5zIGEgfEJJT19NRVRIT0R8IHRoYXQgdXNlcyBhIGluLW1lbW9yeSBidWZmZXIuICovCitjb25zdCBCSU9fTUVUSE9EICpCSU9fc19tZW0odm9pZCk7CisKKy8qIEJJT19uZXdfbWVtX2J1ZiBjcmVhdGVzIEJJTyB0aGF0IHJlYWRzIGFuZCB3cml0ZXMgZnJvbSB8bGVufCBieXRlcyBhdCB8YnVmfC4KKyAqIEl0IGRvZXMgbm90IHRha2Ugb3duZXJzaGlwIG9mIHxidWZ8LiBJdCByZXR1cm5zIHRoZSBCSU8gb3IgTlVMTCBvbiBlcnJvci4KKyAqCisgKiBJZiB8bGVufCBpcyBuZWdhdGl2ZSwgdGhlbiB8YnVmfCBpcyB0cmVhdGVkIGFzIGEgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nLCBidXQKKyAqIGRvbid0IGRlcGVuZCBvbiB0aGlzIGluIG5ldyBjb2RlLiAqLworQklPICpCSU9fbmV3X21lbV9idWYodm9pZCAqYnVmLCBpbnQgbGVuKTsKKworLyogQklPX2dldF9tZW1fZGF0YSBzZXRzIHwqY29udGVudHN8IHRvIHBvaW50IHRvIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHxiaW98CisgKiBhbmQgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhLiAqLworbG9uZyBCSU9fZ2V0X21lbV9kYXRhKEJJTyAqYmlvLCBjaGFyICoqY29udGVudHMpOworCisvKiBCSU9fZ2V0X21lbV9wdHIgc2V0cyB8Km91dHwgdG8gYSBCVUZfTUVNIGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgY29udGVudHMgb2YKKyAqIHxiaW98LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIG9yIHplcm8gb24gZXJyb3IuICovCitpbnQgQklPX2dldF9tZW1fcHRyKEJJTyAqYmlvLCBCVUZfTUVNICoqb3V0KTsKKworLyogQklPX3NldF9tZW1fYnVmIHNldHMgfGJ8IGFzIHRoZSBjb250ZW50cyBvZiB8YmlvfC4gSWYgfHRha2Vfb3duZXJzaGlwfCBpcworICogbm9uLXplcm8sIHRoZW4gfGJ8IHdpbGwgYmUgZnJlZWQgd2hlbiB8YmlvfCBpcyBjbG9zZWQuIFJldHVybnMgb25lIG9uCisgKiBzdWNjZXNzIG9yIHplcm8gb3RoZXJ3aXNlLiAqLworaW50IEJJT19zZXRfbWVtX2J1ZihCSU8gKmJpbywgQlVGX01FTSAqYiwgaW50IHRha2Vfb3duZXJzaGlwKTsKKworLyogQklPX3NldF9tZW1fZW9mX3JldHVybiBzZXRzIHRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgZnJvbSByZWFkaW5nCisgKiB8YmlvfCB3aGVuIGVtcHR5LiBJZiB8ZW9mX3ZhbHVlfCBpcyB6ZXJvIHRoZW4gYW4gZW1wdHkgbWVtb3J5IEJJTyB3aWxsCisgKiByZXR1cm4gRU9GICh0aGF0IGlzIGl0IHdpbGwgcmV0dXJuIHplcm8gYW5kIHxCSU9fc2hvdWxkX3JldHJ5fCB3aWxsIGJlCisgKiBmYWxzZSkuIElmIHxlb2ZfdmFsdWV8IGlzIG5vbiB6ZXJvIHRoZW4gaXQgd2lsbCByZXR1cm4gfGVvZl92YWx1ZXwgd2hlbiBpdAorICogaXMgZW1wdHkgYW5kIGl0IHdpbGwgc2V0IHRoZSByZWFkIHJldHJ5IGZsYWcgKHRoYXQgaXMgfEJJT19yZWFkX3JldHJ5fCBpcworICogdHJ1ZSkuIFRvIGF2b2lkIGFtYmlndWl0eSB3aXRoIGEgbm9ybWFsIHBvc2l0aXZlIHJldHVybiB2YWx1ZSwgfGVvZl92YWx1ZXwKKyAqIHNob3VsZCBiZSBzZXQgdG8gYSBuZWdhdGl2ZSB2YWx1ZSwgdHlwaWNhbGx5IC0xLgorICoKKyAqIEZvciBhIHJlYWQtb25seSBCSU8sIHRoZSBkZWZhdWx0IGlzIHplcm8gKEVPRikuIEZvciBhIHdyaXRhYmxlIEJJTywgdGhlCisgKiBkZWZhdWx0IGlzIC0xIHNvIHRoYXQgYWRkaXRpb25hbCBkYXRhIGNhbiBiZSB3cml0dGVuIG9uY2UgZXhoYXVzdGVkLiAqLworaW50IEJJT19zZXRfbWVtX2VvZl9yZXR1cm4oQklPICpiaW8sIGludCBlb2ZfdmFsdWUpOworCisKKy8qIEZpbGUgZGVzY3JpcHRvciBCSU9zLgorICoKKyAqIEZpbGUgZGVzY3JpcHRvciBCSU9zIGFyZSB3cmFwcGVycyBhcm91bmQgdGhlIHN5c3RlbSdzIHxyZWFkfCBhbmQgfHdyaXRlfAorICogZnVuY3Rpb25zLiBJZiB0aGUgY2xvc2UgZmxhZyBpcyBzZXQgdGhlbiB0aGVuIHxjbG9zZXwgaXMgY2FsbGVkIG9uIHRoZQorICogdW5kZXJseWluZyBmaWxlIGRlc2NyaXB0b3Igd2hlbiB0aGUgQklPIGlzIGZyZWVkLgorICoKKyAqIHxCSU9fcmVzZXR8IGF0dGVtcHRzIHRvIHNlZWsgdGhlIGZpbGUgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgZmlsZSB1c2luZworICogfGxzZWVrfC4KKyAqCisgKiB8QklPX3NlZWt8IHNldHMgdGhlIGZpbGUgcG9pbnRlciB0byBwb3NpdGlvbiB8b2ZmfCBmcm9tIHN0YXJ0IG9mIGZpbGUgdXNpbmcKKyAqIHxsc2Vla3wuCisgKgorICogfEJJT190ZWxsfCByZXR1cm5zIHRoZSBjdXJyZW50IGZpbGUgcG9zaXRpb24uICovCisKKy8qIEJJT19zX2ZkIHJldHVybnMgYSB8QklPX01FVEhPRHwgZm9yIGZpbGUgZGVzY3JpcHRvciBmZHMuICovCitjb25zdCBCSU9fTUVUSE9EICpCSU9fc19mZCh2b2lkKTsKKworLyogQklPX25ld19mZCBjcmVhdGVzIGEgbmV3IGZpbGUgZGVzY3JpcHRvciBCSU8gd3JhcHBpbmcgfGZkfC4gSWYgfGNsb3NlX2ZsYWd8CisgKiBpcyBub24temVybywgdGhlbiB8ZmR8IHdpbGwgYmUgY2xvc2VkIHdoZW4gdGhlIEJJTyBpcy4gKi8KK0JJTyAqQklPX25ld19mZChpbnQgZmQsIGludCBjbG9zZV9mbGFnKTsKKworLyogQklPX3NldF9mZCBzZXRzIHRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgfGJpb3wgdG8gfGZkfC4gSWYgfGNsb3NlX2ZsYWd8IGlzCisgKiBub24temVybyB0aGVuIHxmZHwgd2lsbCBiZSBjbG9zZWQgd2hlbiB8YmlvfCBpcy4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcworICogb3IgemVybyBvbiBlcnJvci4gKi8KK2ludCBCSU9fc2V0X2ZkKEJJTyAqYmlvLCBpbnQgZmQsIGludCBjbG9zZV9mbGFnKTsKKworLyogQklPX2dldF9mZCBzZXRzIHwqb3V0X2ZkfCB0byB0aGUgZmlsZSBkZXNjcmlwdG9yIGN1cnJlbnRseSBpbiB1c2UgYnkgfGJpb3wuCisgKiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG9uIGVycm9yLiAqLworaW50IEJJT19nZXRfZmQoQklPICpiaW8sIGludCAqb3V0X2ZkKTsKKworCisvKiBGaWxlIEJJT3MuCisgKgorICogRmlsZSBCSU9zIGFyZSB3cmFwcGVycyBhcm91bmQgYSBDIHxGSUxFfCBvYmplY3QuCisgKgorICogfEJJT19mbHVzaHwgb24gYSBmaWxlIEJJTyBjYWxscyB8ZmZsdXNofCBvbiB0aGUgd3JhcHBlZCBzdHJlYW0uCisgKgorICogfEJJT19yZXNldHwgYXR0ZW1wdHMgdG8gc2VlayB0aGUgZmlsZSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiBmaWxlIHVzaW5nCisgKiB8ZnNlZWt8LgorICoKKyAqIHxCSU9fc2Vla3wgc2V0cyB0aGUgZmlsZSBwb2ludGVyIHRvIHRoZSBnaXZlbiBwb3NpdGlvbiBmcm9tIHRoZSBzdGFydCBvZgorICogZmlsZSB1c2luZyB8ZnNlZWt8LgorICoKKyAqIHxCSU9fZW9mfCBjYWxscyB8ZmVvZnwuCisgKgorICogU2V0dGluZyB0aGUgY2xvc2UgZmxhZyBjYXVzZXMgfGZjbG9zZXwgdG8gYmUgY2FsbGVkIG9uIHRoZSBzdHJlYW0gd2hlbiB0aGUKKyAqIEJJTyBpcyBmcmVlZC4gKi8KKworLyogQklPX3NfZmlsZSByZXR1cm5zIGEgQklPX01FVEhPRCB0aGF0IHdyYXBzIGEgfEZJTEV8LiAqLworY29uc3QgQklPX01FVEhPRCAqQklPX3NfZmlsZSh2b2lkKTsKKworLyogQklPX25ld19maWxlIGNyZWF0ZXMgYSBmaWxlIEJJTyBieSBvcGVuaW5nIHxmaWxlbmFtZXwgd2l0aCB0aGUgZ2l2ZW4gbW9kZS4KKyAqIFNlZSB0aGUgfGZvcGVufCBtYW51YWwgcGFnZSBmb3IgZGV0YWlscyBvZiB0aGUgbW9kZSBhcmd1bWVudC4gKi8KK0JJTyAqQklPX25ld19maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICptb2RlKTsKKworLyogQklPX25ld19mcCBjcmVhdGVzIGEgbmV3IGZpbGUgQklPIHRoYXQgd3JhcHMgdGhlIGdpdmVuIHxGSUxFfC4gSWYKKyAqIHxjbG9zZV9mbGFnfCBpcyB8QklPX0NMT1NFfCwgdGhlbiB8ZmNsb3NlfCB3aWxsIGJlIGNhbGxlZCBvbiB8c3RyZWFtfCB3aGVuCisgKiB0aGUgQklPIGlzIGNsb3NlZC4gKi8KK0JJTyAqQklPX25ld19mcChGSUxFICpzdHJlYW0sIGludCBjbG9zZV9mbGFnKTsKKworLyogQklPX2dldF9mcCBzZXRzIHwqb3V0X2ZpbGV8IHRvIHRoZSBjdXJyZW50IHxGSUxFfCBmb3IgfGJpb3wuIEl0IHJldHVybnMgb25lCisgKiBvbiBzdWNjZXNzIGFuZCB6ZXJvIG90aGVyd2lzZS4gKi8KK2ludCBCSU9fZ2V0X2ZwKEJJTyAqYmlvLCBGSUxFICoqb3V0X2ZpbGUpOworCisvKiBCSU9fc2V0X2ZwIHNldHMgdGhlIHxGSUxFfCBmb3IgfGJpb3wuIElmIHxjbG9zZV9mbGFnfCBpcyB8QklPX0NMT1NFfCB0aGVuCisgKiB8ZmNsb3NlfCB3aWxsIGJlIGNhbGxlZCBvbiB8ZmlsZXwgd2hlbiB8YmlvfCBpcyBjbG9zZWQuIEl0IHJldHVybnMgb25lIG9uCisgKiBzdWNlc3MgYW5kIHplcm8gb3RoZXJ3aXNlLiAqLworaW50IEJJT19zZXRfZnAoQklPICpiaW8sIEZJTEUgKmZpbGUsIGludCBjbG9zZV9mbGFnKTsKKworLyogQklPX3JlYWRfZmlsZW5hbWUgb3BlbnMgfGZpbGVuYW1lfCBmb3IgcmVhZGluZyBhbmQgc2V0cyB0aGUgcmVzdWx0IGFzIHRoZQorICogfEZJTEV8IGZvciB8YmlvfC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvdGhlcndpc2UuIFRoZSB8RklMRXwKKyAqIHdpbGwgYmUgY2xvc2VkIHdoZW4gfGJpb3wgaXMgZnJlZWQuICovCitpbnQgQklPX3JlYWRfZmlsZW5hbWUoQklPICpiaW8sIGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKworLyogQklPX3dyaXRlX2ZpbGVuYW1lIG9wZW5zIHxmaWxlbmFtZXwgZm9yIHdyaXRpbmcgYW5kIHNldHMgdGhlIHJlc3VsdCBhcyB0aGUKKyAqIHxGSUxFfCBmb3IgfGJpb3wuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb3RoZXJ3aXNlLiBUaGUgfEZJTEV8CisgKiB3aWxsIGJlIGNsb3NlZCB3aGVuIHxiaW98IGlzIGZyZWVkLiAqLworaW50IEJJT193cml0ZV9maWxlbmFtZShCSU8gKmJpbywgY29uc3QgY2hhciAqZmlsZW5hbWUpOworCisvKiBCSU9fYXBwZW5kX2ZpbGVuYW1lIG9wZW5zIHxmaWxlbmFtZXwgZm9yIGFwcGVuZGluZyBhbmQgc2V0cyB0aGUgcmVzdWx0IGFzCisgKiB0aGUgfEZJTEV8IGZvciB8YmlvfC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvdGhlcndpc2UuIFRoZQorICogfEZJTEV8IHdpbGwgYmUgY2xvc2VkIHdoZW4gfGJpb3wgaXMgZnJlZWQuICovCitpbnQgQklPX2FwcGVuZF9maWxlbmFtZShCSU8gKmJpbywgY29uc3QgY2hhciAqZmlsZW5hbWUpOworCisvKiBCSU9fcndfZmlsZW5hbWUgb3BlbnMgfGZpbGVuYW1lfCBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyBhbmQgc2V0cyB0aGUgcmVzdWx0CisgKiBhcyB0aGUgfEZJTEV8IGZvciB8YmlvfC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvdGhlcndpc2UuIFRoZQorICogfEZJTEV8IHdpbGwgYmUgY2xvc2VkIHdoZW4gfGJpb3wgaXMgZnJlZWQuICovCitpbnQgQklPX3J3X2ZpbGVuYW1lKEJJTyAqYmlvLCBjb25zdCBjaGFyICpmaWxlbmFtZSk7CisKKworLyogQnVmZmVyIEJJT3MuCisgKgorICogQnVmZmVyIEJJT3MgYXJlIGEgZmlsdGVyLXR5cGUgQklPLCBpLmUuIHRoZXkgYXJlIGRlc2lnbmVkIHRvIGJlIHVzZWQgaW4gYQorICogY2hhaW4gb2YgQklPcy4gVGhleSBwcm92aWRlIGJ1ZmZlcmluZyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9uCisgKiB0aGUgdW5kZXJseWluZyBCSU9zLiAqLworCitjb25zdCBCSU9fTUVUSE9EICpCSU9fZl9idWZmZXIodm9pZCk7CisKKy8qIEJJT19zZXRfcmVhZF9idWZmZXJfc2l6ZSBzZXRzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIHJlYWQgYnVmZmVyIGFuZAorICogY2xlYXJzIGl0LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG9uIGZhaWx1cmUuICovCitpbnQgQklPX3NldF9yZWFkX2J1ZmZlcl9zaXplKEJJTyAqYmlvLCBpbnQgYnVmZmVyX3NpemUpOworCisvKiBCSU9fc2V0X3dyaXRlX2J1ZmZlcl9zaXplIHNldHMgdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgd3JpdGUgYnVmZmVyIGFuZAorICogY2xlYXJzIGl0LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG9uIGZhaWx1cmUuICovCitpbnQgQklPX3NldF93cml0ZV9idWZmZXJfc2l6ZShCSU8gKmJpbywgaW50IGJ1ZmZlcl9zaXplKTsKKworCisvKiBTb2NrZXQgQklPcy4gKi8KKworY29uc3QgQklPX01FVEhPRCAqQklPX3Nfc29ja2V0KHZvaWQpOworCisvKiBCSU9fbmV3X3NvY2tldCBhbGxvY2F0ZXMgYW5kIGluaXRpYWxpc2VzIGEgZnJlc2ggQklPIHdoaWNoIHdpbGwgcmVhZCBhbmQKKyAqIHdyaXRlIHRvIHRoZSBzb2NrZXQgfGZkfC4gSWYgfGNsb3NlX2ZsYWd8IGlzIHxCSU9fQ0xPU0V8IHRoZW4gY2xvc2luZyB0aGUKKyAqIEJJTyB3aWxsIGNsb3NlIHxmZHwuIEl0IHJldHVybnMgdGhlIGZyZXNoIHxCSU98IG9yIE5VTEwgb24gZXJyb3IuICovCitCSU8gKkJJT19uZXdfc29ja2V0KGludCBmZCwgaW50IGNsb3NlX2ZsYWcpOworCisKKy8qIENvbm5lY3QgQklPcy4KKyAqCisgKiBBIGNvbm5lY3Rpb24gQklPIGNyZWF0ZXMgYSBuZXR3b3JrIGNvbm5lY3Rpb24gYW5kIHRyYW5zZmVycyBkYXRhIG92ZXIgdGhlCisgKiByZXN1bHRpbmcgc29ja2V0LiAqLworCitjb25zdCBCSU9fTUVUSE9EICpCSU9fc19jb25uZWN0KHZvaWQpOworCisvKiBCSU9fbmV3X2Nvbm5lY3QgcmV0dXJucyBhIEJJTyB0aGF0IGNvbm5lY3RzIHRvIHRoZSBnaXZlbiBob3N0bmFtZSBhbmQgcG9ydC4KKyAqIFRoZSB8aG9zdF9hbmRfb3B0aW9uYWxfcG9ydHwgYXJndW1lbnQgc2hvdWxkIGJlIG9mIHRoZSBmb3JtCisgKiAid3d3LmV4YW1wbGUuY29tIiBvciAid3d3LmV4YW1wbGUuY29tOjQ0MyIuIElmIHRoZSBwb3J0IGlzIG9taXR0ZWQsIGl0IG11c3QKKyAqIGJlIHByb3ZpZGVkIHdpdGggfEJJT19zZXRfY29ubl9wb3J0fC4KKyAqCisgKiBJdCByZXR1cm5zIHRoZSBuZXcgQklPIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZXJyb3IuICovCitCSU8gKkJJT19uZXdfY29ubmVjdChjb25zdCBjaGFyICpob3N0X2FuZF9vcHRpb25hbF9wb3J0KTsKKworLyogQklPX3NldF9jb25uX2hvc3RuYW1lIHNldHMgfGhvc3RfYW5kX29wdGlvbmFsX3BvcnR8IGFzIHRoZSBob3N0bmFtZSBhbmQKKyAqIG9wdGlvbmFsIHBvcnQgdGhhdCB8YmlvfCB3aWxsIGNvbm5lY3QgdG8uIElmIHRoZSBwb3J0IGlzIG9taXR0ZWQsIGl0IG11c3QgYmUKKyAqIHByb3ZpZGVkIHdpdGggfEJJT19zZXRfY29ubl9wb3J0fC4KKyAqCisgKiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG90aGVyd2lzZS4gKi8KK2ludCBCSU9fc2V0X2Nvbm5faG9zdG5hbWUoQklPICpiaW8sIGNvbnN0IGNoYXIgKmhvc3RfYW5kX29wdGlvbmFsX3BvcnQpOworCisvKiBCSU9fc2V0X2Nvbm5fcG9ydCBzZXRzIHxwb3J0X3N0cnwgYXMgdGhlIHBvcnQgb3Igc2VydmljZSBuYW1lIHRoYXQgfGJpb3wKKyAqIHdpbGwgY29ubmVjdCB0by4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvdGhlcndpc2UuICovCitpbnQgQklPX3NldF9jb25uX3BvcnQoQklPICpiaW8sIGNvbnN0IGNoYXIgKnBvcnRfc3RyKTsKKworLyogQklPX3NldF9uYmlvIHNldHMgd2hldGhlciB8YmlvfCB3aWxsIHVzZSBub24tYmxvY2tpbmcgSS9PIG9wZXJhdGlvbnMuIEl0CisgKiByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG90aGVyd2lzZS4gKi8KK2ludCBCSU9fc2V0X25iaW8oQklPICpiaW8sIGludCBvbik7CisKKworLyogRGF0YWdyYW0gQklPcy4KKyAqCisgKiBUT0RPKGZvcmspOiBub3QgaW1wbGVtZW50ZWQuICovCisKKyNkZWZpbmUgQklPX0NUUkxfREdSQU1fUVVFUllfTVRVIDQwIC8qIGFzIGtlcm5lbCBmb3IgY3VycmVudCBNVFUgKi8KKworI2RlZmluZSBCSU9fQ1RSTF9ER1JBTV9TRVRfTVRVIDQyIC8qIHNldCBjYWNoZWQgdmFsdWUgZm9yICBNVFUuIHdhbnQgdG8gdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBpZiBhc2tpbmcgdGhlIGtlcm5lbCBmYWlscyAqLworCisjZGVmaW5lIEJJT19DVFJMX0RHUkFNX01UVV9FWENFRURFRCA0MyAvKiBjaGVjayB3aGV0aGVyIHRoZSBNVFUgd2FzIGV4Y2VlZCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHByZXZpb3VzIHdyaXRlIG9wZXJhdGlvbi4gKi8KKworI2RlZmluZSBCSU9fQ1RSTF9ER1JBTV9TRVRfTkVYVF9USU1FT1VUIFwKKyAgNDUgLyogTmV4dCBEVExTIGhhbmRzaGFrZSB0aW1lb3V0IHRvIGFkanVzdCBzb2NrZXQgdGltZW91dHMgKi8KKworI2RlZmluZSBCSU9fQ1RSTF9ER1JBTV9HRVRfUEVFUiAgICAgICAgICAgNDYKKworI2RlZmluZSBCSU9fQ1RSTF9ER1JBTV9HRVRfRkFMTEJBQ0tfTVRVICAgNDcKKworCisvKiBCSU8gUGFpcnMuCisgKgorICogQklPIHBhaXJzIHByb3ZpZGUgYSAibG9vcGJhY2siIGxpa2Ugc3lzdGVtOiBhIHBhaXIgb2YgQklPcyB3aGVyZSBkYXRhCisgKiB3cml0dGVuIHRvIG9uZSBjYW4gYmUgcmVhZCBmcm9tIHRoZSBvdGhlciBhbmQgdmljZSB2ZXJzYS4gKi8KKworLyogQklPX25ld19iaW9fcGFpciBzZXRzIHwqb3V0MXwgYW5kIHwqb3V0MnwgdG8gdHdvIGZyZXNobHkgY3JlYXRlZCBCSU9zIHdoZXJlCisgKiBkYXRhIHdyaXR0ZW4gdG8gb25lIGNhbiBiZSByZWFkIGZyb20gdGhlIG90aGVyIGFuZCB2aWNlIHZlcnNhLiBUaGUKKyAqIHx3cml0ZWJ1ZjF8IGFyZ3VtZW50IGdpdmVzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgdXNlZCBpbiB8Km91dDF8IGFuZAorICogfHdyaXRlYnVmMnwgZm9yIHwqb3V0MnwuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24gZXJyb3IuICovCitpbnQgQklPX25ld19iaW9fcGFpcihCSU8gKipvdXQxLCBzaXplX3Qgd3JpdGVidWYxLCBCSU8gKipvdXQyLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHdyaXRlYnVmMik7CisKKy8qIEJJT19zX2JpbyByZXR1cm5zIHRoZSBtZXRob2QgZm9yIGEgQklPIHBhaXIuICovCitjb25zdCBCSU9fTUVUSE9EICpCSU9fc19iaW8odm9pZCk7CisKKy8qIEJJT19jdHJsX2dldF9yZWFkX3JlcXVlc3QgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgdGhlIG90aGVyIHNpZGUgb2YKKyAqIHxiaW98IHRyaWVkICh1bnN1Y2Nlc3NmdWxseSkgdG8gcmVhZC4gKi8KK3NpemVfdCBCSU9fY3RybF9nZXRfcmVhZF9yZXF1ZXN0KEJJTyAqYmlvKTsKKworLyogQklPX2N0cmxfZ2V0X3dyaXRlX2d1YXJhbnRlZSByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB8YmlvfCAod2hpY2gKKyAqIG11c3QgaGF2ZSBiZWVuIHJldHVybmVkIGJ5IHxCSU9fbmV3X2Jpb19wYWlyfCkgd2lsbCBhY2NlcHQgb24gdGhlIG5leHQKKyAqIHxCSU9fd3JpdGV8IGNhbGwuICovCitzaXplX3QgQklPX2N0cmxfZ2V0X3dyaXRlX2d1YXJhbnRlZShCSU8gKmJpbyk7CisKKy8qIEJJT19zaHV0ZG93bl93ciBtYXJrcyB8YmlvfCBhcyBjbG9zZWQsIGZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2YgdGhlIG90aGVyCisgKiBzaWRlIG9mIHRoZSBwYWlyLiBGdXR1cmUgfEJJT193cml0ZXwgY2FsbHMgb24gfGJpb3wgd2lsbCBmYWlsLiBJdCByZXR1cm5zCisgKiBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvdGhlcndpc2UuICovCitpbnQgQklPX3NodXRkb3duX3dyKEJJTyAqYmlvKTsKKworCisvKiBCSU9fTk9DTE9TRSBhbmQgfEJJT19DTE9TRXwgY2FuIGJlIHVzZWQgYXMgc3ltYm9saWMgYXJndW1lbnRzIHdoZW4gYSAiY2xvc2UKKyAqIGZsYWciIGlzIHBhc3NlZCB0byBhIEJJTyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgQklPX05PQ0xPU0UgMAorI2RlZmluZSBCSU9fQ0xPU0UgMQorCisvKiBUaGVzZSBhcmUgcGFzc2VkIHRvIHRoZSBCSU8gY2FsbGJhY2sgKi8KKyNkZWZpbmUgQklPX0NCX0ZSRUUgMHgwMQorI2RlZmluZSBCSU9fQ0JfUkVBRCAweDAyCisjZGVmaW5lIEJJT19DQl9XUklURSAweDAzCisjZGVmaW5lIEJJT19DQl9QVVRTIDB4MDQKKyNkZWZpbmUgQklPX0NCX0dFVFMgMHgwNQorI2RlZmluZSBCSU9fQ0JfQ1RSTCAweDA2CisKKy8qIFRoZSBjYWxsYmFjayBpcyBjYWxsZWQgYmVmb3JlIGFuZCBhZnRlciB0aGUgdW5kZXJsaW5nIG9wZXJhdGlvbiwKKyAqIFRoZSBCSU9fQ0JfUkVUVVJOIGZsYWcgaW5kaWNhdGVzIGlmIGl0IGlzIGFmdGVyIHRoZSBjYWxsICovCisjZGVmaW5lIEJJT19DQl9SRVRVUk4gMHg4MAorCisvKiBUaGVzZSBhcmUgdmFsdWVzIG9mIHRoZSB8Y21kfCBhcmd1bWVudCB0byB8QklPX2N0cmx8LiAqLworI2RlZmluZSBCSU9fQ1RSTF9SRVNFVAkJMSAgLyogb3B0IC0gcmV3aW5kL3plcm8gZXRjICovCisjZGVmaW5lIEJJT19DVFJMX0VPRgkJMiAgLyogb3B0IC0gYXJlIHdlIGF0IHRoZSBlb2YgKi8KKyNkZWZpbmUgQklPX0NUUkxfSU5GTwkJMyAgLyogb3B0IC0gZXh0cmEgdGl0LWJpdHMgKi8KKyNkZWZpbmUgQklPX0NUUkxfU0VUCQk0ICAvKiBtYW4gLSBzZXQgdGhlICdJTycgdHlwZSAqLworI2RlZmluZSBCSU9fQ1RSTF9HRVQJCTUgIC8qIG1hbiAtIGdldCB0aGUgJ0lPJyB0eXBlICovCisjZGVmaW5lIEJJT19DVFJMX1BVU0gJCTYgIC8qIG9wdCAtIGludGVybmFsLCB1c2VkIHRvIHNpZ25pZnkgY2hhbmdlICovCisjZGVmaW5lIEJJT19DVFJMX1BPUAkJNyAgLyogb3B0IC0gaW50ZXJuYWwsIHVzZWQgdG8gc2lnbmlmeSBjaGFuZ2UgKi8KKyNkZWZpbmUgQklPX0NUUkxfR0VUX0NMT1NFCTggIC8qIG1hbiAtIHNldCB0aGUgJ2Nsb3NlJyBvbiBmcmVlICovCisjZGVmaW5lIEJJT19DVFJMX1NFVF9DTE9TRQk5ICAvKiBtYW4gLSBzZXQgdGhlICdjbG9zZScgb24gZnJlZSAqLworI2RlZmluZSBCSU9fQ1RSTF9QRU5ESU5HCTEwICAvKiBvcHQgLSBpcyB0aGVpciBtb3JlIGRhdGEgYnVmZmVyZWQgKi8KKyNkZWZpbmUgQklPX0NUUkxfRkxVU0gJCTExICAvKiBvcHQgLSAnZmx1c2gnIGJ1ZmZlcmVkIG91dHB1dCAqLworI2RlZmluZSBCSU9fQ1RSTF9XUEVORElORwkxMyAgLyogb3B0IC0gbnVtYmVyIG9mIGJ5dGVzIHN0aWxsIHRvIHdyaXRlICovCisvKiBjYWxsYmFjayBpcyBpbnQgY2IoQklPICpiaW8sc3RhdGUscmV0KTsgKi8KKyNkZWZpbmUgQklPX0NUUkxfU0VUX0NBTExCQUNLCTE0ICAvKiBvcHQgLSBzZXQgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKyNkZWZpbmUgQklPX0NUUkxfR0VUX0NBTExCQUNLCTE1ICAvKiBvcHQgLSBzZXQgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKyNkZWZpbmUgQklPX0NUUkxfU0VUX0ZJTEVOQU1FCTMwCS8qIEJJT19zX2ZpbGUgc3BlY2lhbCAqLworCisKKy8qIFByaXZhdGUgZnVuY3Rpb25zICovCisKKyNkZWZpbmUgQklPX0ZMQUdTX1JFQUQgMHgwMQorI2RlZmluZSBCSU9fRkxBR1NfV1JJVEUgMHgwMgorI2RlZmluZSBCSU9fRkxBR1NfSU9fU1BFQ0lBTCAweDA0CisjZGVmaW5lIEJJT19GTEFHU19SV1MgKEJJT19GTEFHU19SRUFEIHwgQklPX0ZMQUdTX1dSSVRFIHwgQklPX0ZMQUdTX0lPX1NQRUNJQUwpCisjZGVmaW5lIEJJT19GTEFHU19TSE9VTERfUkVUUlkgMHgwOAorI2RlZmluZSBCSU9fRkxBR1NfQkFTRTY0X05PX05MIDB4MTAwCisvKiBUaGlzIGlzIHVzZWQgd2l0aCBtZW1vcnkgQklPczogaXQgbWVhbnMgd2Ugc2hvdWxkbid0IGZyZWUgdXAgb3IgY2hhbmdlIHRoZQorICogZGF0YSBpbiBhbnkgd2F5LiAqLworI2RlZmluZSBCSU9fRkxBR1NfTUVNX1JET05MWSAweDIwMAorCisvKiBUaGVzZSBhcmUgdGhlICd0eXBlcycgb2YgQklPcyAqLworI2RlZmluZSBCSU9fVFlQRV9OT05FIDAKKyNkZWZpbmUgQklPX1RZUEVfTUVNICgxIHwgMHgwNDAwKQorI2RlZmluZSBCSU9fVFlQRV9GSUxFICgyIHwgMHgwNDAwKQorI2RlZmluZSBCSU9fVFlQRV9GRCAoNCB8IDB4MDQwMCB8IDB4MDEwMCkKKyNkZWZpbmUgQklPX1RZUEVfU09DS0VUICg1IHwgMHgwNDAwIHwgMHgwMTAwKQorI2RlZmluZSBCSU9fVFlQRV9OVUxMICg2IHwgMHgwNDAwKQorI2RlZmluZSBCSU9fVFlQRV9TU0wgKDcgfCAweDAyMDApCisjZGVmaW5lIEJJT19UWVBFX01EICg4IHwgMHgwMjAwKSAgICAgICAgICAgICAgICAvKiBwYXNzaXZlIGZpbHRlciAqLworI2RlZmluZSBCSU9fVFlQRV9CVUZGRVIgKDkgfCAweDAyMDApICAgICAgICAgICAgLyogZmlsdGVyICovCisjZGVmaW5lIEJJT19UWVBFX0NJUEhFUiAoMTAgfCAweDAyMDApICAgICAgICAgICAvKiBmaWx0ZXIgKi8KKyNkZWZpbmUgQklPX1RZUEVfQkFTRTY0ICgxMSB8IDB4MDIwMCkgICAgICAgICAgIC8qIGZpbHRlciAqLworI2RlZmluZSBCSU9fVFlQRV9DT05ORUNUICgxMiB8IDB4MDQwMCB8IDB4MDEwMCkgLyogc29ja2V0IC0gY29ubmVjdCAqLworI2RlZmluZSBCSU9fVFlQRV9BQ0NFUFQgKDEzIHwgMHgwNDAwIHwgMHgwMTAwKSAgLyogc29ja2V0IGZvciBhY2NlcHQgKi8KKyNkZWZpbmUgQklPX1RZUEVfUFJPWFlfQ0xJRU5UICgxNCB8IDB4MDIwMCkgICAgIC8qIGNsaWVudCBwcm94eSBCSU8gKi8KKyNkZWZpbmUgQklPX1RZUEVfUFJPWFlfU0VSVkVSICgxNSB8IDB4MDIwMCkgICAgIC8qIHNlcnZlciBwcm94eSBCSU8gKi8KKyNkZWZpbmUgQklPX1RZUEVfTkJJT19URVNUICgxNiB8IDB4MDIwMCkgICAgICAgIC8qIHNlcnZlciBwcm94eSBCSU8gKi8KKyNkZWZpbmUgQklPX1RZUEVfTlVMTF9GSUxURVIgKDE3IHwgMHgwMjAwKQorI2RlZmluZSBCSU9fVFlQRV9CRVIgKDE4IHwgMHgwMjAwKSAgICAgICAgLyogQkVSIC0+IGJpbiBmaWx0ZXIgKi8KKyNkZWZpbmUgQklPX1RZUEVfQklPICgxOSB8IDB4MDQwMCkgICAgICAgIC8qIChoYWxmIGEpIEJJTyBwYWlyICovCisjZGVmaW5lIEJJT19UWVBFX0xJTkVCVUZGRVIgKDIwIHwgMHgwMjAwKSAvKiBmaWx0ZXIgKi8KKyNkZWZpbmUgQklPX1RZUEVfREdSQU0gKDIxIHwgMHgwNDAwIHwgMHgwMTAwKQorI2RlZmluZSBCSU9fVFlQRV9BU04xICgyMiB8IDB4MDIwMCkgLyogZmlsdGVyICovCisjZGVmaW5lIEJJT19UWVBFX0NPTVAgKDIzIHwgMHgwMjAwKSAvKiBmaWx0ZXIgKi8KKworI2RlZmluZSBCSU9fVFlQRV9ERVNDUklQVE9SIDB4MDEwMCAvKiBzb2NrZXQsIGZkLCBjb25uZWN0IG9yIGFjY2VwdCAqLworI2RlZmluZSBCSU9fVFlQRV9GSUxURVIgMHgwMjAwCisjZGVmaW5lIEJJT19UWVBFX1NPVVJDRV9TSU5LIDB4MDQwMAorCitzdHJ1Y3QgYmlvX21ldGhvZF9zdCB7CisgIGludCB0eXBlOworICBjb25zdCBjaGFyICpuYW1lOworICBpbnQgKCpid3JpdGUpKEJJTyAqLCBjb25zdCBjaGFyICosIGludCk7CisgIGludCAoKmJyZWFkKShCSU8gKiwgY2hhciAqLCBpbnQpOworICAvKiBUT0RPKGZvcmspOiByZW1vdmUgYnB1dHMuICovCisgIGludCAoKmJwdXRzKShCSU8gKiwgY29uc3QgY2hhciAqKTsKKyAgaW50ICgqYmdldHMpKEJJTyAqLCBjaGFyICosIGludCk7CisgIGxvbmcgKCpjdHJsKShCSU8gKiwgaW50LCBsb25nLCB2b2lkICopOworICBpbnQgKCpjcmVhdGUpKEJJTyAqKTsKKyAgaW50ICgqZGVzdHJveSkoQklPICopOworICBsb25nICgqY2FsbGJhY2tfY3RybCkoQklPICosIGludCwgYmlvX2luZm9fY2IpOworfTsKKworc3RydWN0IGJpb19zdCB7CisgIGNvbnN0IEJJT19NRVRIT0QgKm1ldGhvZDsKKyAgLyogYmlvLCBtb2RlLCBhcmdwLCBhcmdpLCBhcmdsLCByZXQgKi8KKyAgbG9uZyAoKmNhbGxiYWNrKShzdHJ1Y3QgYmlvX3N0ICosIGludCwgY29uc3QgY2hhciAqLCBpbnQsIGxvbmcsIGxvbmcpOworICBjaGFyICpjYl9hcmc7IC8qIGZpcnN0IGFyZ3VtZW50IGZvciB0aGUgY2FsbGJhY2sgKi8KKworICAvKiBpbml0IGlzIG5vbi16ZXJvIGlmIHRoaXMgfEJJT3wgaGFzIGJlZW4gaW5pdGlhbGlzZWQuICovCisgIGludCBpbml0OworICAvKiBzaHV0ZG93biBpcyBvZnRlbiB1c2VkIGJ5IHNwZWNpZmljIHxCSU9fTUVUSE9EfHMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKKyAgICogdGhleSBvd24gc29tZSB1bmRlcmx5aW5nIHJlc291cmNlLiBUaGlzIGZsYWcgY2FuIG9mdGVuIGJ5IGNvbnRyb2xsZWQgYnkKKyAgICogfEJJT19zZXRfY2xvc2V8LiBGb3IgZXhhbXBsZSwgd2hldGhlciBhbiBmZCBCSU8gY2xvc2VzIHRoZSB1bmRlcmx5aW5nIGZkCisgICAqIHdoZW4gaXQsIGl0c2VsZiwgaXMgY2xvc2VkLiAqLworICBpbnQgc2h1dGRvd247CisgIGludCBmbGFnczsKKyAgaW50IHJldHJ5X3JlYXNvbjsKKyAgLyogbnVtIGlzIGEgQklPLXNwZWNpZmljIHZhbHVlLiBGb3IgZXhhbXBsZSwgaW4gZmQgQklPcyBpdCdzIHVzZWQgdG8gc3RvcmUgYQorICAgKiBmaWxlIGRlc2NyaXB0b3IuICovCisgIGludCBudW07CisgIC8qIFRPRE8oZm9yayk6IHJlZmVyZW5jZSBjb3VudGluZyBpcyBvbmx5IHVzZWQgYnkgdGhlIFNTTCBCSU8gY29kZS4gSWYgd2UgY2FuCisgICAqIGR1bXAgdGhhdCB0aGVuIHdlIGNhbiByZW1vdmUgdGhpcy4gV2UgY291bGQgYWxzbyBkcm9wCisgICAqIEJJT19DVFJMX1BVU0gvQklPX0NUUkxfUE9QLiAqLworICBpbnQgcmVmZXJlbmNlczsKKyAgdm9pZCAqcHRyOworICAvKiBuZXh0X2JpbyBwb2ludHMgdG8gdGhlIG5leHQgfEJJT3wgaW4gYSBjaGFpbi4gVGhpcyB8QklPfCBvd25zIGEgcmVmZXJlbmNlCisgICAqIHRvIHxuZXh0X2Jpb3wuICovCisgIHN0cnVjdCBiaW9fc3QgKm5leHRfYmlvOyAvKiB1c2VkIGJ5IGZpbHRlciBCSU9zICovCisgIC8qIFRPRE8oZm9yayk6IGVpdGhlciBicmluZyBiYWNrIEJJT19udW1iZXJfcmVhZCBhbmQgd3JpdGUgb3IgcmVtb3ZlIHRoZXNlLiAqLworICB1bnNpZ25lZCBsb25nIG51bV9yZWFkOworICB1bnNpZ25lZCBsb25nIG51bV93cml0ZTsKKworICBDUllQVE9fRVhfREFUQSBleF9kYXRhOworfTsKKworI2RlZmluZSBCSU9fQ19TRVRfQ09OTkVDVAkJCTEwMAorI2RlZmluZSBCSU9fQ19ET19TVEFURV9NQUNISU5FCQkJMTAxCisjZGVmaW5lIEJJT19DX1NFVF9OQklPCQkJCTEwMgorI2RlZmluZSBCSU9fQ19TRVRfUFJPWFlfUEFSQU0JCQkxMDMKKyNkZWZpbmUgQklPX0NfU0VUX0ZECQkJCTEwNAorI2RlZmluZSBCSU9fQ19HRVRfRkQJCQkJMTA1CisjZGVmaW5lIEJJT19DX1NFVF9GSUxFX1BUUgkJCTEwNgorI2RlZmluZSBCSU9fQ19HRVRfRklMRV9QVFIJCQkxMDcKKyNkZWZpbmUgQklPX0NfU0VUX0ZJTEVOQU1FCQkJMTA4CisjZGVmaW5lIEJJT19DX1NFVF9TU0wJCQkJMTA5CisjZGVmaW5lIEJJT19DX0dFVF9TU0wJCQkJMTEwCisjZGVmaW5lIEJJT19DX1NFVF9NRAkJCQkxMTEKKyNkZWZpbmUgQklPX0NfR0VUX01ECQkJCTExMgorI2RlZmluZSBCSU9fQ19HRVRfQ0lQSEVSX1NUQVRVUwkJCTExMworI2RlZmluZSBCSU9fQ19TRVRfQlVGX01FTQkJCTExNAorI2RlZmluZSBCSU9fQ19HRVRfQlVGX01FTV9QVFIJCQkxMTUKKyNkZWZpbmUgQklPX0NfR0VUX0JVRkZfTlVNX0xJTkVTCQkxMTYKKyNkZWZpbmUgQklPX0NfU0VUX0JVRkZfU0laRQkJCTExNworI2RlZmluZSBCSU9fQ19TRVRfQUNDRVBUCQkJMTE4CisjZGVmaW5lIEJJT19DX1NTTF9NT0RFCQkJCTExOQorI2RlZmluZSBCSU9fQ19HRVRfTURfQ1RYCQkJMTIwCisjZGVmaW5lIEJJT19DX0dFVF9QUk9YWV9QQVJBTQkJCTEyMQorI2RlZmluZSBCSU9fQ19TRVRfQlVGRl9SRUFEX0RBVEEJCTEyMiAvKiBkYXRhIHRvIHJlYWQgZmlyc3QgKi8KKyNkZWZpbmUgQklPX0NfR0VUX0NPTk5FQ1QJCQkxMjMKKyNkZWZpbmUgQklPX0NfR0VUX0FDQ0VQVAkJCTEyNAorI2RlZmluZSBCSU9fQ19TRVRfU1NMX1JFTkVHT1RJQVRFX0JZVEVTCQkxMjUKKyNkZWZpbmUgQklPX0NfR0VUX1NTTF9OVU1fUkVORUdPVElBVEVTCQkxMjYKKyNkZWZpbmUgQklPX0NfU0VUX1NTTF9SRU5FR09USUFURV9USU1FT1VUCTEyNworI2RlZmluZSBCSU9fQ19GSUxFX1NFRUsJCQkJMTI4CisjZGVmaW5lIEJJT19DX0dFVF9DSVBIRVJfQ1RYCQkJMTI5CisjZGVmaW5lIEJJT19DX1NFVF9CVUZfTUVNX0VPRl9SRVRVUk4JCTEzMC8qcmV0dXJuIGVuZCBvZiBpbnB1dCB2YWx1ZSovCisjZGVmaW5lIEJJT19DX1NFVF9CSU5EX01PREUJCQkxMzEKKyNkZWZpbmUgQklPX0NfR0VUX0JJTkRfTU9ERQkJCTEzMgorI2RlZmluZSBCSU9fQ19GSUxFX1RFTEwJCQkJMTMzCisjZGVmaW5lIEJJT19DX0dFVF9TT0NLUwkJCQkxMzQKKyNkZWZpbmUgQklPX0NfU0VUX1NPQ0tTCQkJCTEzNQorCisjZGVmaW5lIEJJT19DX1NFVF9XUklURV9CVUZfU0laRQkJMTM2LyogZm9yIEJJT19zX2JpbyAqLworI2RlZmluZSBCSU9fQ19HRVRfV1JJVEVfQlVGX1NJWkUJCTEzNworI2RlZmluZSBCSU9fQ19HRVRfV1JJVEVfR1VBUkFOVEVFCQkxNDAKKyNkZWZpbmUgQklPX0NfR0VUX1JFQURfUkVRVUVTVAkJCTE0MQorI2RlZmluZSBCSU9fQ19TSFVURE9XTl9XUgkJCTE0MgorI2RlZmluZSBCSU9fQ19OUkVBRDAJCQkJMTQzCisjZGVmaW5lIEJJT19DX05SRUFECQkJCTE0NAorI2RlZmluZSBCSU9fQ19OV1JJVEUwCQkJCTE0NQorI2RlZmluZSBCSU9fQ19OV1JJVEUJCQkJMTQ2CisjZGVmaW5lIEJJT19DX1JFU0VUX1JFQURfUkVRVUVTVAkJMTQ3CisjZGVmaW5lIEJJT19DX1NFVF9NRF9DVFgJCQkxNDgKKworI2RlZmluZSBCSU9fQ19TRVRfUFJFRklYCQkJMTQ5CisjZGVmaW5lIEJJT19DX0dFVF9QUkVGSVgJCQkxNTAKKyNkZWZpbmUgQklPX0NfU0VUX1NVRkZJWAkJCTE1MQorI2RlZmluZSBCSU9fQ19HRVRfU1VGRklYCQkJMTUyCisKKyNkZWZpbmUgQklPX0NfU0VUX0VYX0FSRwkJCTE1MworI2RlZmluZSBCSU9fQ19HRVRfRVhfQVJHCQkJMTU0CisKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9ICAvKiBleHRlcm4gQyAqLworI2VuZGlmCisKKyNkZWZpbmUgQklPX0ZfYmlvX21ha2VfcGFpciAxMDAKKyNkZWZpbmUgQklPX0ZfYmlvX2N0cmwgMTAxCisjZGVmaW5lIEJJT19GX2J1ZmZlcl9jdHJsIDEwMgorI2RlZmluZSBCSU9fRl9CSU9fbmV3X2ZpbGUgMTAzCisjZGVmaW5lIEJJT19GX2ZpbGVfcmVhZCAxMDQKKyNkZWZpbmUgQklPX0ZfQklPX25ldyAxMDUKKyNkZWZpbmUgQklPX0ZfYmlvX2lvIDEwNgorI2RlZmluZSBCSU9fRl9CSU9fbmV3X21lbV9idWYgMTA3CisjZGVmaW5lIEJJT19GX21lbV93cml0ZSAxMDgKKyNkZWZpbmUgQklPX0ZfY29ubl9zdGF0ZSAxMDkKKyNkZWZpbmUgQklPX0ZfY29ubl9jdHJsIDExMAorI2RlZmluZSBCSU9fRl9maWxlX2N0cmwgMTExCisjZGVmaW5lIEJJT19GX0JJT19jYWxsYmFja19jdHJsIDExMgorI2RlZmluZSBCSU9fRl9iaW9faXBfYW5kX3BvcnRfdG9fc29ja2V0X2FuZF9hZGRyIDExMworI2RlZmluZSBCSU9fRl9iaW9fd3JpdGUgMTE0CisjZGVmaW5lIEJJT19GX0JJT19jdHJsIDExNQorI2RlZmluZSBCSU9fUl9VTlNVUFBPUlRFRF9NRVRIT0QgMTAwCisjZGVmaW5lIEJJT19SX05PX1BPUlRfU1BFQ0lGSUVEIDEwMQorI2RlZmluZSBCSU9fUl9OT19IT1NUTkFNRV9TUEVDSUZJRUQgMTAyCisjZGVmaW5lIEJJT19SX0lOX1VTRSAxMDMKKyNkZWZpbmUgQklPX1JfVU5JTklUSUFMSVpFRCAxMDQKKyNkZWZpbmUgQklPX1JfQ09OTkVDVF9FUlJPUiAxMDUKKyNkZWZpbmUgQklPX1JfS0VFUEFMSVZFIDEwNgorI2RlZmluZSBCSU9fUl9CUk9LRU5fUElQRSAxMDcKKyNkZWZpbmUgQklPX1JfTkJJT19DT05ORUNUX0VSUk9SIDEwOAorI2RlZmluZSBCSU9fUl9CQURfRk9QRU5fTU9ERSAxMDkKKyNkZWZpbmUgQklPX1JfQVNOMV9PQkpFQ1RfVE9PX0xPTkcgMTEwCisjZGVmaW5lIEJJT19SX0lOVkFMSURfQVJHVU1FTlQgMTExCisjZGVmaW5lIEJJT19SX1dSSVRFX1RPX1JFQURfT05MWV9CSU8gMTEyCisjZGVmaW5lIEJJT19SX0VSUk9SX1NFVFRJTkdfTkJJTyAxMTMKKyNkZWZpbmUgQklPX1JfU1lTX0xJQiAxMTQKKyNkZWZpbmUgQklPX1JfTk9fU1VDSF9GSUxFIDExNQorI2RlZmluZSBCSU9fUl9OVUxMX1BBUkFNRVRFUiAxMTYKKyNkZWZpbmUgQklPX1JfVU5BQkxFX1RPX0NSRUFURV9TT0NLRVQgMTE3CisKKyNlbmRpZiAgLyogT1BFTlNTTF9IRUFERVJfQklPX0ggKi8KZGlmZiAtLWdpdCBhL2NyeXB0by9iaW8vYmlvX2Vycm9yLmMgYi9jcnlwdG8vYmlvL2Jpb19lcnJvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0Y2U4ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYmlvL2Jpb19lcnJvci5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNCwgR29vZ2xlIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisKKyNpbmNsdWRlICJiaW8uaCIKKworY29uc3QgRVJSX1NUUklOR19EQVRBIEJJT19lcnJvcl9zdHJpbmdfZGF0YVtdID0geworICB7RVJSX1BBQ0soRVJSX0xJQl9CSU8sIEJJT19GX0JJT19jYWxsYmFja19jdHJsLCAwKSwgIkJJT19jYWxsYmFja19jdHJsIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0JJTywgQklPX0ZfQklPX2N0cmwsIDApLCAiQklPX2N0cmwifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQklPLCBCSU9fRl9CSU9fbmV3LCAwKSwgIkJJT19uZXcifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQklPLCBCSU9fRl9CSU9fbmV3X2ZpbGUsIDApLCAiQklPX25ld19maWxlIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0JJTywgQklPX0ZfQklPX25ld19tZW1fYnVmLCAwKSwgIkJJT19uZXdfbWVtX2J1ZiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9CSU8sIEJJT19GX2Jpb19jdHJsLCAwKSwgImJpb19jdHJsIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0JJTywgQklPX0ZfYmlvX2lvLCAwKSwgImJpb19pbyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9CSU8sIEJJT19GX2Jpb19pcF9hbmRfcG9ydF90b19zb2NrZXRfYW5kX2FkZHIsIDApLCAiYmlvX2lwX2FuZF9wb3J0X3RvX3NvY2tldF9hbmRfYWRkciJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9CSU8sIEJJT19GX2Jpb19tYWtlX3BhaXIsIDApLCAiYmlvX21ha2VfcGFpciJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9CSU8sIEJJT19GX2Jpb193cml0ZSwgMCksICJiaW9fd3JpdGUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQklPLCBCSU9fRl9idWZmZXJfY3RybCwgMCksICJidWZmZXJfY3RybCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9CSU8sIEJJT19GX2Nvbm5fY3RybCwgMCksICJjb25uX2N0cmwifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQklPLCBCSU9fRl9jb25uX3N0YXRlLCAwKSwgImNvbm5fc3RhdGUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQklPLCBCSU9fRl9maWxlX2N0cmwsIDApLCAiZmlsZV9jdHJsIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0JJTywgQklPX0ZfZmlsZV9yZWFkLCAwKSwgImZpbGVfcmVhZCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9CSU8sIEJJT19GX21lbV93cml0ZSwgMCksICJtZW1fd3JpdGUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQklPLCAwLCBCSU9fUl9BU04xX09CSkVDVF9UT09fTE9ORyksICJBU04xX09CSkVDVF9UT09fTE9ORyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9CSU8sIDAsIEJJT19SX0JBRF9GT1BFTl9NT0RFKSwgIkJBRF9GT1BFTl9NT0RFIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0JJTywgMCwgQklPX1JfQlJPS0VOX1BJUEUpLCAiQlJPS0VOX1BJUEUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQklPLCAwLCBCSU9fUl9DT05ORUNUX0VSUk9SKSwgIkNPTk5FQ1RfRVJST1IifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQklPLCAwLCBCSU9fUl9FUlJPUl9TRVRUSU5HX05CSU8pLCAiRVJST1JfU0VUVElOR19OQklPIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0JJTywgMCwgQklPX1JfSU5WQUxJRF9BUkdVTUVOVCksICJJTlZBTElEX0FSR1VNRU5UIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0JJTywgMCwgQklPX1JfSU5fVVNFKSwgIklOX1VTRSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9CSU8sIDAsIEJJT19SX0tFRVBBTElWRSksICJLRUVQQUxJVkUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQklPLCAwLCBCSU9fUl9OQklPX0NPTk5FQ1RfRVJST1IpLCAiTkJJT19DT05ORUNUX0VSUk9SIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0JJTywgMCwgQklPX1JfTk9fSE9TVE5BTUVfU1BFQ0lGSUVEKSwgIk5PX0hPU1ROQU1FX1NQRUNJRklFRCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9CSU8sIDAsIEJJT19SX05PX1BPUlRfU1BFQ0lGSUVEKSwgIk5PX1BPUlRfU1BFQ0lGSUVEIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0JJTywgMCwgQklPX1JfTk9fU1VDSF9GSUxFKSwgIk5PX1NVQ0hfRklMRSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9CSU8sIDAsIEJJT19SX05VTExfUEFSQU1FVEVSKSwgIk5VTExfUEFSQU1FVEVSIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0JJTywgMCwgQklPX1JfU1lTX0xJQiksICJTWVNfTElCIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0JJTywgMCwgQklPX1JfVU5BQkxFX1RPX0NSRUFURV9TT0NLRVQpLCAiVU5BQkxFX1RPX0NSRUFURV9TT0NLRVQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQklPLCAwLCBCSU9fUl9VTklOSVRJQUxJWkVEKSwgIlVOSU5JVElBTElaRUQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQklPLCAwLCBCSU9fUl9VTlNVUFBPUlRFRF9NRVRIT0QpLCAiVU5TVVBQT1JURURfTUVUSE9EIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0JJTywgMCwgQklPX1JfV1JJVEVfVE9fUkVBRF9PTkxZX0JJTyksICJXUklURV9UT19SRUFEX09OTFlfQklPIn0sCisgIHswLCBOVUxMfSwKK307CmRpZmYgLS1naXQgYS9jcnlwdG8vYmlvL2Jpb19tZW0uYyBiL2NyeXB0by9iaW8vYmlvX21lbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMDQ3Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYmlvL2Jpb19tZW0uYwpAQCAtMCwwICsxLDMxNCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYnVmLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorCisKK0JJTyAqQklPX25ld19tZW1fYnVmKHZvaWQgKmJ1ZiwgaW50IGxlbikgeworICBCSU8gKnJldDsKKyAgQlVGX01FTSAqYjsKKyAgY29uc3Qgc2l6ZV90IHNpemUgPSBsZW4gPCAwID8gc3RybGVuKChjaGFyICopYnVmKSA6IChzaXplX3QpbGVuOworCisgIGlmICghYnVmICYmIGxlbiAhPSAwKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fbmV3X21lbV9idWYsIEJJT19SX05VTExfUEFSQU1FVEVSKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJldCA9IEJJT19uZXcoQklPX3NfbWVtKCkpOworICBpZiAocmV0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGIgPSAoQlVGX01FTSAqKXJldC0+cHRyOworICBiLT5kYXRhID0gYnVmOworICBiLT5sZW5ndGggPSBzaXplOworICBiLT5tYXggPSBzaXplOworCisgIHJldC0+ZmxhZ3MgfD0gQklPX0ZMQUdTX01FTV9SRE9OTFk7CisKKyAgLyogfG51bXwgaXMgdXNlZCB0byBzdG9yZSB0aGUgdmFsdWUgdGhhdCB0aGlzIEJJTyB3aWxsIHJldHVybiB3aGVuIGl0IHJ1bnMKKyAgICogb3V0IG9mIGRhdGEuIElmIGl0J3MgbmVnYXRpdmUgdGhlbiB0aGUgcmV0cnkgZmxhZ3Mgd2lsbCBhbHNvIGJlIHNldC4gU2luY2UKKyAgICogdGhpcyBpcyBzdGF0aWMgZGF0YSwgcmV0cnlpbmcgd29udCBoZWxwICovCisgIHJldC0+bnVtID0gMDsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1lbV9uZXcoQklPICpiaW8pIHsKKyAgQlVGX01FTSAqYjsKKworICBiID0gQlVGX01FTV9uZXcoKTsKKyAgaWYgKGIgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgLyogfHNodXRkb3dufCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBjbG9zZSBmbGFnOiB3aGV0aGVyIHRoZSBCSU8gaGFzIG93bmVyc2hpcAorICAgKiBvZiB0aGUgQlVGX01FTS4gKi8KKyAgYmlvLT5zaHV0ZG93biA9IDE7CisgIGJpby0+aW5pdCA9IDE7CisgIGJpby0+bnVtID0gLTE7CisgIGJpby0+cHRyID0gKGNoYXIgKiliOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1lbV9mcmVlKEJJTyAqYmlvKSB7CisgIEJVRl9NRU0gKmI7CisKKyAgaWYgKGJpbyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoIWJpby0+c2h1dGRvd24gfHwgIWJpby0+aW5pdCB8fCBiaW8tPnB0ciA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBiID0gKEJVRl9NRU0gKiliaW8tPnB0cjsKKyAgaWYgKGJpby0+ZmxhZ3MgJiBCSU9fRkxBR1NfTUVNX1JET05MWSkgeworICAgIGItPmRhdGEgPSBOVUxMOworICB9CisgIEJVRl9NRU1fZnJlZShiKTsKKyAgYmlvLT5wdHIgPSBOVUxMOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtZW1fcmVhZChCSU8gKmJpbywgY2hhciAqb3V0LCBpbnQgb3V0bCkgeworICBpbnQgcmV0ID0gLTE7CisgIEJVRl9NRU0gKmI7CisKKyAgYiA9IChCVUZfTUVNICopYmlvLT5wdHI7CisgIEJJT19jbGVhcl9yZXRyeV9mbGFncyhiaW8pOworICByZXQgPSBvdXRsOworICBpZiAocmV0ID4gKGludCliLT5sZW5ndGgpIHsKKyAgICByZXQgPSBiLT5sZW5ndGg7CisgIH0KKworICBpZiAocmV0ID4gMCkgeworICAgIG1lbWNweShvdXQsIGItPmRhdGEsIHJldCk7CisgICAgYi0+bGVuZ3RoIC09IHJldDsKKyAgICBpZiAoYmlvLT5mbGFncyAmIEJJT19GTEFHU19NRU1fUkRPTkxZKSB7CisgICAgICBiLT5kYXRhICs9IHJldDsKKyAgICB9IGVsc2UgeworICAgICAgbWVtbW92ZShiLT5kYXRhLCAmYi0+ZGF0YVtyZXRdLCBiLT5sZW5ndGgpOworICAgIH0KKyAgfSBlbHNlIGlmIChiLT5sZW5ndGggPT0gMCkgeworICAgIHJldCA9IGJpby0+bnVtOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgQklPX3NldF9yZXRyeV9yZWFkKGJpbyk7CisgICAgfQorICB9CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWVtX3dyaXRlKEJJTyAqYmlvLCBjb25zdCBjaGFyICppbiwgaW50IGlubCkgeworICBpbnQgcmV0ID0gLTE7CisgIGludCBibGVuOworICBCVUZfTUVNICpiOworCisgIGIgPSAoQlVGX01FTSAqKWJpby0+cHRyOworCisgIGlmIChiaW8tPmZsYWdzICYgQklPX0ZMQUdTX01FTV9SRE9OTFkpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIG1lbV93cml0ZSwgQklPX1JfV1JJVEVfVE9fUkVBRF9PTkxZX0JJTyk7CisgICAgZ290byBlcnI7CisgIH0KKworICBCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYmlvKTsKKyAgYmxlbiA9IGItPmxlbmd0aDsKKyAgaWYgKElOVF9NQVggLSBibGVuIDwgaW5sKSB7CisgICAgZ290byBlcnI7CisgIH0KKyAgaWYgKEJVRl9NRU1fZ3Jvd19jbGVhbihiLCBibGVuICsgaW5sKSAhPSAoYmxlbiArIGlubCkpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorICBtZW1jcHkoJmItPmRhdGFbYmxlbl0sIGluLCBpbmwpOworICByZXQgPSBpbmw7CisKK2VycjoKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtZW1fcHV0cyhCSU8gKmJwLCBjb25zdCBjaGFyICpzdHIpIHsKKyAgcmV0dXJuIG1lbV93cml0ZShicCwgc3RyLCBzdHJsZW4oc3RyKSk7Cit9CisKK3N0YXRpYyBpbnQgbWVtX2dldHMoQklPICpiaW8sIGNoYXIgKmJ1ZiwgaW50IHNpemUpIHsKKyAgaW50IGksIGo7CisgIGNoYXIgKnA7CisgIEJVRl9NRU0gKmIgPSAoQlVGX01FTSAqKWJpby0+cHRyOworCisgIEJJT19jbGVhcl9yZXRyeV9mbGFncyhiaW8pOworICBqID0gYi0+bGVuZ3RoOworICBpZiAoc2l6ZSAtIDEgPCBqKSB7CisgICAgaiA9IHNpemUgLSAxOworICB9CisgIGlmIChqIDw9IDApIHsKKyAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICpidWYgPSAwOworICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHAgPSBiLT5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSB7CisgICAgaWYgKHBbaV0gPT0gJ1xuJykgeworICAgICAgaSsrOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLyogaSBpcyBub3cgdGhlIG1heCBudW0gb2YgYnl0ZXMgdG8gY29weSwgZWl0aGVyIGogb3IgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUKKyAgICogZmlyc3QgbmV3bGluZSAqLworCisgIGkgPSBtZW1fcmVhZChiaW8sIGJ1ZiwgaSk7CisgIGlmIChpID4gMCkgeworICAgIGJ1ZltpXSA9ICdcMCc7CisgIH0KKyAgcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBsb25nIG1lbV9jdHJsKEJJTyAqYmlvLCBpbnQgY21kLCBsb25nIG51bSwgdm9pZCAqcHRyKSB7CisgIGxvbmcgcmV0ID0gMTsKKyAgY2hhciAqKnBwdHI7CisKKyAgQlVGX01FTSAqYiA9IChCVUZfTUVNICopYmlvLT5wdHI7CisKKyAgc3dpdGNoIChjbWQpIHsKKyAgICBjYXNlIEJJT19DVFJMX1JFU0VUOgorICAgICAgaWYgKGItPmRhdGEgIT0gTlVMTCkgeworICAgICAgICAvKiBGb3IgcmVhZCBvbmx5IGNhc2UgcmVzZXQgdG8gdGhlIHN0YXJ0IGFnYWluICovCisgICAgICAgIGlmIChiaW8tPmZsYWdzICYgQklPX0ZMQUdTX01FTV9SRE9OTFkpIHsKKyAgICAgICAgICBiLT5kYXRhIC09IGItPm1heCAtIGItPmxlbmd0aDsKKyAgICAgICAgICBiLT5sZW5ndGggPSBiLT5tYXg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbWVtc2V0KGItPmRhdGEsIDAsIGItPm1heCk7CisgICAgICAgICAgYi0+bGVuZ3RoID0gMDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBCSU9fQ1RSTF9FT0Y6CisgICAgICByZXQgPSAobG9uZykoYi0+bGVuZ3RoID09IDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCSU9fQ19TRVRfQlVGX01FTV9FT0ZfUkVUVVJOOgorICAgICAgYmlvLT5udW0gPSAoaW50KW51bTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQklPX0NUUkxfSU5GTzoKKyAgICAgIHJldCA9IChsb25nKWItPmxlbmd0aDsKKyAgICAgIGlmIChwdHIgIT0gTlVMTCkgeworICAgICAgICBwcHRyID0gKGNoYXIgKiopcHRyOworICAgICAgICAqcHB0ciA9IChjaGFyICopJihiLT5kYXRhWzBdKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQklPX0NfU0VUX0JVRl9NRU06CisgICAgICBtZW1fZnJlZShiaW8pOworICAgICAgYmlvLT5zaHV0ZG93biA9IChpbnQpbnVtOworICAgICAgYmlvLT5wdHIgPSBwdHI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJJT19DX0dFVF9CVUZfTUVNX1BUUjoKKyAgICAgIGlmIChwdHIgIT0gTlVMTCkgeworICAgICAgICBwcHRyID0gKGNoYXIgKiopcHRyOworICAgICAgICAqcHB0ciA9IChjaGFyICopYjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQklPX0NUUkxfR0VUX0NMT1NFOgorICAgICAgcmV0ID0gKGxvbmcpYmlvLT5zaHV0ZG93bjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQklPX0NUUkxfU0VUX0NMT1NFOgorICAgICAgYmlvLT5zaHV0ZG93biA9IChpbnQpbnVtOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEJJT19DVFJMX1dQRU5ESU5HOgorICAgICAgcmV0ID0gMEw7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJJT19DVFJMX1BFTkRJTkc6CisgICAgICByZXQgPSAobG9uZyliLT5sZW5ndGg7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJJT19DVFJMX0ZMVVNIOgorICAgICAgcmV0ID0gMTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSAwOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IEJJT19NRVRIT0QgbWVtX21ldGhvZCA9IHsKKyAgICBCSU9fVFlQRV9NRU0sICJtZW1vcnkgYnVmZmVyIiwgbWVtX3dyaXRlLCBtZW1fcmVhZCwgbWVtX3B1dHMsCisgICAgbWVtX2dldHMsICAgICBtZW1fY3RybCwgICAgICAgIG1lbV9uZXcsICAgbWVtX2ZyZWUsIE5VTEwsIH07CisKK2NvbnN0IEJJT19NRVRIT0QgKkJJT19zX21lbSh2b2lkKSB7IHJldHVybiAmbWVtX21ldGhvZDsgfQorCitsb25nIEJJT19nZXRfbWVtX2RhdGEoQklPICpiaW8sIGNoYXIgKipjb250ZW50cykgeworICByZXR1cm4gQklPX2N0cmwoYmlvLCBCSU9fQ1RSTF9JTkZPLCAwLCAoY2hhciAqKSBjb250ZW50cyk7Cit9CisKK2ludCBCSU9fZ2V0X21lbV9wdHIoQklPICpiaW8sIEJVRl9NRU0gKipvdXQpIHsKKyAgcmV0dXJuIEJJT19jdHJsKGJpbywgQklPX0NfR0VUX0JVRl9NRU1fUFRSLCAwLCAoY2hhciAqKSBvdXQpOworfQorCitpbnQgQklPX3NldF9tZW1fYnVmKEJJTyAqYmlvLCBCVUZfTUVNICpiLCBpbnQgdGFrZV9vd25lcnNoaXApIHsKKyAgcmV0dXJuIEJJT19jdHJsKGJpbywgQklPX0NfU0VUX0JVRl9NRU0sIHRha2Vfb3duZXJzaGlwLCAoY2hhciAqKSBiKTsKK30KKworaW50IEJJT19zZXRfbWVtX2VvZl9yZXR1cm4oQklPICpiaW8sIGludCBlb2ZfdmFsdWUpIHsKKyAgcmV0dXJuIEJJT19jdHJsKGJpbywgQklPX0NfU0VUX0JVRl9NRU1fRU9GX1JFVFVSTiwgZW9mX3ZhbHVlLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2NyeXB0by9iaW8vYmlvX3Rlc3QuYyBiL2NyeXB0by9iaW8vYmlvX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzg2NzRmCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2Jpby9iaW9fdGVzdC5jCkBAIC0wLDAgKzEsOTMgQEAKKy8qIFRPRE8oZm9yayk6IGxpY2Vuc2UgKi8KKworI2RlZmluZSBfQlNEX1NPVVJDRQorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorCisKK3N0YXRpYyBpbnQgdGVzdF9zb2NrZXRfY29ubmVjdCgpIHsKKyAgaW50IGxpc3RlbmluZ19zb2NrID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKyAgaW50IHNvY2s7CisgIHN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisgIHNvY2tsZW5fdCBzb2NrYWRkcl9sZW4gPSBzaXplb2Yoc2luKTsKKyAgc3RhdGljIGNvbnN0IGNoYXIga1Rlc3RNZXNzYWdlW10gPSAidGVzdCI7CisgIGNoYXIgaG9zdG5hbWVbODBdLCBidWZbNV07CisgIEJJTyAqYmlvOworCisgIG1lbXNldCgmc2luLCAwLCBzaXplb2Yoc2luKSk7CisgIHNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgaWYgKCFpbmV0X2F0b24oIjEyNy4wLjAuMSIsICZzaW4uc2luX2FkZHIpKSB7CisgICAgcGVycm9yKCJpbmV0X2F0b24iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChiaW5kKGxpc3RlbmluZ19zb2NrLCAoc3RydWN0IHNvY2thZGRyICopJnNpbiwgc2l6ZW9mKHNpbikpICE9IDApIHsKKyAgICBwZXJyb3IoImJpbmQiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChsaXN0ZW4obGlzdGVuaW5nX3NvY2ssIDEpKSB7CisgICAgcGVycm9yKCJsaXN0ZW4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChnZXRzb2NrbmFtZShsaXN0ZW5pbmdfc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZzaW4sICZzb2NrYWRkcl9sZW4pIHx8CisgICAgICBzb2NrYWRkcl9sZW4gIT0gc2l6ZW9mKHNpbikpIHsKKyAgICBwZXJyb3IoImdldHNvY2tuYW1lIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBzbnByaW50Zihob3N0bmFtZSwgc2l6ZW9mKGhvc3RuYW1lKSwgIiVzOiVkIiwgIjEyNy4wLjAuMSIsCisgICAgICAgICAgIG50b2hzKHNpbi5zaW5fcG9ydCkpOworICBiaW8gPSBCSU9fbmV3X2Nvbm5lY3QoaG9zdG5hbWUpOworICBpZiAoIWJpbykgeworICAgIGZwcmludGYoc3RkZXJyLCAiQklPX25ld19jb25uZWN0IGZhaWxlZC5cbiIpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKEJJT193cml0ZShiaW8sIGtUZXN0TWVzc2FnZSwgc2l6ZW9mKGtUZXN0TWVzc2FnZSkpICE9CisgICAgICBzaXplb2Yoa1Rlc3RNZXNzYWdlKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiQklPX3dyaXRlIGZhaWxlZC5cbiIpOworICAgIEJJT19wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHNvY2sgPSBhY2NlcHQobGlzdGVuaW5nX3NvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNpbiwgJnNvY2thZGRyX2xlbik7CisgIGlmIChzb2NrIDwgMCkgeworICAgIHBlcnJvcigiYWNjZXB0Iik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAocmVhZChzb2NrLCBidWYsIHNpemVvZihidWYpKSAhPSBzaXplb2Yoa1Rlc3RNZXNzYWdlKSkgeworICAgIHBlcnJvcigicmVhZCIpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKG1lbWNtcChidWYsIGtUZXN0TWVzc2FnZSwgc2l6ZW9mKGtUZXN0TWVzc2FnZSkpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBjbG9zZShzb2NrKTsKKyAgY2xvc2UobGlzdGVuaW5nX3NvY2spOworICBCSU9fZnJlZShiaW8pOworCisgIHJldHVybiAxOworfQorCitpbnQgbWFpbigpIHsKKyAgRVJSX2xvYWRfY3J5cHRvX3N0cmluZ3MoKTsKKworICBpZiAoIXRlc3Rfc29ja2V0X2Nvbm5lY3QoKSkgeworICAgIHJldHVybiAxOworICB9CisKKyAgcHJpbnRmKCJQQVNTXG4iKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vYmlvL2J1ZmZlci5jIGIvY3J5cHRvL2Jpby9idWZmZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDRhZmQyCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2Jpby9idWZmZXIuYwpAQCAtMCwwICsxLDQ5NyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2J1Zi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKworCisjZGVmaW5lIERFRkFVTFRfQlVGRkVSX1NJWkUgNDA5NgorCit0eXBlZGVmIHN0cnVjdCBiaW9fZl9idWZmZXJfY3R4X3N0cnVjdCB7CisgIC8qIEJ1ZmZlcnMgYXJlIHNldHVwIGxpa2UgdGhpczoKKyAgICoKKyAgICogPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc2l6ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4KKyAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICogfCBjb25zdW1lZCB8IHJlbWFpbmluZyAgICAgICAgICB8IGZyZWUgc3BhY2UgICAgICAgIHwKKyAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICogPC0tIG9mZiAtLT48LS0tLS0tLSBsZW4gLS0tLS0tLT4KKyAgICovCisKKyAgaW50IGlidWZfc2l6ZTsgIC8qIGhvdyBiaWcgaXMgdGhlIGlucHV0IGJ1ZmZlciAqLworICBpbnQgb2J1Zl9zaXplOyAgLyogaG93IGJpZyBpcyB0aGUgb3V0cHV0IGJ1ZmZlciAqLworCisgIGNoYXIgKmlidWY7ICAgLyogdGhlIGNoYXIgYXJyYXkgKi8KKyAgaW50IGlidWZfbGVuOyAvKiBob3cgbWFueSBieXRlcyBhcmUgaW4gaXQgKi8KKyAgaW50IGlidWZfb2ZmOyAvKiB3cml0ZS9yZWFkIG9mZnNldCAqLworCisgIGNoYXIgKm9idWY7ICAgLyogdGhlIGNoYXIgYXJyYXkgKi8KKyAgaW50IG9idWZfbGVuOyAvKiBob3cgbWFueSBieXRlcyBhcmUgaW4gaXQgKi8KKyAgaW50IG9idWZfb2ZmOyAvKiB3cml0ZS9yZWFkIG9mZnNldCAqLworfSBCSU9fRl9CVUZGRVJfQ1RYOworCitzdGF0aWMgaW50IGJ1ZmZlcl9uZXcoQklPICpiaW8pIHsKKyAgQklPX0ZfQlVGRkVSX0NUWCAqY3R4OworCisgIGN0eCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihCSU9fRl9CVUZGRVJfQ1RYKSk7CisgIGlmIChjdHggPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIG1lbXNldChjdHgsIDAsIHNpemVvZihCSU9fRl9CVUZGRVJfQ1RYKSk7CisKKyAgY3R4LT5pYnVmID0gT1BFTlNTTF9tYWxsb2MoREVGQVVMVF9CVUZGRVJfU0laRSk7CisgIGlmIChjdHgtPmlidWYgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyMTsKKyAgfQorICBjdHgtPm9idWYgPSAoY2hhciAqKU9QRU5TU0xfbWFsbG9jKERFRkFVTFRfQlVGRkVSX1NJWkUpOworICBpZiAoY3R4LT5vYnVmID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjI7CisgIH0KKyAgY3R4LT5pYnVmX3NpemUgPSBERUZBVUxUX0JVRkZFUl9TSVpFOworICBjdHgtPm9idWZfc2l6ZSA9IERFRkFVTFRfQlVGRkVSX1NJWkU7CisKKyAgYmlvLT5pbml0ID0gMTsKKyAgYmlvLT5wdHIgPSAoY2hhciAqKWN0eDsKKyAgcmV0dXJuIDE7CisKK2VycjI6CisgIE9QRU5TU0xfZnJlZShjdHgtPmlidWYpOworCitlcnIxOgorICBPUEVOU1NMX2ZyZWUoY3R4KTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnVmZmVyX2ZyZWUoQklPICpiaW8pIHsKKyAgQklPX0ZfQlVGRkVSX0NUWCAqY3R4OworCisgIGlmIChiaW8gPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgY3R4ID0gKEJJT19GX0JVRkZFUl9DVFggKiliaW8tPnB0cjsKKyAgaWYgKGN0eC0+aWJ1ZiAhPSBOVUxMKSB7CisgICAgT1BFTlNTTF9mcmVlKGN0eC0+aWJ1Zik7CisgIH0KKyAgaWYgKGN0eC0+b2J1ZiAhPSBOVUxMKSB7CisgICAgT1BFTlNTTF9mcmVlKGN0eC0+b2J1Zik7CisgIH0KKyAgT1BFTlNTTF9mcmVlKGJpby0+cHRyKTsKKworICBiaW8tPnB0ciA9IE5VTEw7CisgIGJpby0+aW5pdCA9IDA7CisgIGJpby0+ZmxhZ3MgPSAwOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGJ1ZmZlcl9yZWFkKEJJTyAqYmlvLCBjaGFyICpvdXQsIGludCBvdXRsKSB7CisgIGludCBpLCBudW0gPSAwOworICBCSU9fRl9CVUZGRVJfQ1RYICpjdHg7CisKKyAgY3R4ID0gKEJJT19GX0JVRkZFUl9DVFggKiliaW8tPnB0cjsKKworICBpZiAoY3R4ID09IE5VTEwgfHwgYmlvLT5uZXh0X2JpbyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBudW0gPSAwOworICBCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYmlvKTsKKworICBmb3IgKDs7KSB7CisgICAgaSA9IGN0eC0+aWJ1Zl9sZW47CisgICAgLyogSWYgdGhlcmUgaXMgc3R1ZmYgbGVmdCBvdmVyLCBncmFiIGl0ICovCisgICAgaWYgKGkgIT0gMCkgeworICAgICAgaWYgKGkgPiBvdXRsKSB7CisgICAgICAgIGkgPSBvdXRsOworICAgICAgfQorICAgICAgbWVtY3B5KG91dCwgJmN0eC0+aWJ1ZltjdHgtPmlidWZfb2ZmXSwgaSk7CisgICAgICBjdHgtPmlidWZfb2ZmICs9IGk7CisgICAgICBjdHgtPmlidWZfbGVuIC09IGk7CisgICAgICBudW0gKz0gaTsKKyAgICAgIGlmIChvdXRsID09IGkpIHsKKyAgICAgICAgcmV0dXJuIG51bTsKKyAgICAgIH0KKyAgICAgIG91dGwgLT0gaTsKKyAgICAgIG91dCArPSBpOworICAgIH0KKworICAgIC8qIFdlIG1heSBoYXZlIGRvbmUgYSBwYXJ0aWFsIHJlYWQuIFRyeSB0byBkbyBtb3JlLiBXZSBoYXZlIG5vdGhpbmcgaW4gdGhlCisgICAgICogYnVmZmVyLiBJZiB3ZSBnZXQgYW4gZXJyb3IgYW5kIGhhdmUgcmVhZCBzb21lIGRhdGEsIGp1c3QgcmV0dXJuIGl0IGFuZAorICAgICAqIGxldCB0aGVtIHJldHJ5IHRvIGdldCB0aGUgZXJyb3IgYWdhaW4uIENvcHkgZGlyZWN0IHRvIHBhcmVudCBhZGRyZXNzCisgICAgICogc3BhY2UgKi8KKyAgICBpZiAob3V0bCA+IGN0eC0+aWJ1Zl9zaXplKSB7CisgICAgICBmb3IgKDs7KSB7CisgICAgICAgIGkgPSBCSU9fcmVhZChiaW8tPm5leHRfYmlvLCBvdXQsIG91dGwpOworICAgICAgICBpZiAoaSA8PSAwKSB7CisgICAgICAgICAgQklPX2NvcHlfbmV4dF9yZXRyeShiaW8pOworICAgICAgICAgIGlmIChpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIChudW0gPiAwKSA/IG51bSA6IGk7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBudW07CisgICAgICAgIH0KKyAgICAgICAgbnVtICs9IGk7CisgICAgICAgIGlmIChvdXRsID09IGkpIHsKKyAgICAgICAgICByZXR1cm4gbnVtOworICAgICAgICB9CisgICAgICAgIG91dCArPSBpOworICAgICAgICBvdXRsIC09IGk7CisgICAgICB9CisgICAgfQorICAgIC8qIGVsc2UgKi8KKworICAgIC8qIHdlIGFyZSBnb2luZyB0byBiZSBkb2luZyBzb21lIGJ1ZmZlcmluZyAqLworICAgIGkgPSBCSU9fcmVhZChiaW8tPm5leHRfYmlvLCBjdHgtPmlidWYsIGN0eC0+aWJ1Zl9zaXplKTsKKyAgICBpZiAoaSA8PSAwKSB7CisgICAgICBCSU9fY29weV9uZXh0X3JldHJ5KGJpbyk7CisgICAgICBpZiAoaSA8IDApIHsKKyAgICAgICAgcmV0dXJuIChudW0gPiAwKSA/IG51bSA6IGk7CisgICAgICB9CisgICAgICByZXR1cm4gbnVtOworICAgIH0KKyAgICBjdHgtPmlidWZfb2ZmID0gMDsKKyAgICBjdHgtPmlidWZfbGVuID0gaTsKKyAgfQorfQorCitzdGF0aWMgaW50IGJ1ZmZlcl93cml0ZShCSU8gKmIsIGNvbnN0IGNoYXIgKmluLCBpbnQgaW5sKSB7CisgIGludCBpLCBudW0gPSAwOworICBCSU9fRl9CVUZGRVJfQ1RYICpjdHg7CisKKyAgY3R4ID0gKEJJT19GX0JVRkZFUl9DVFggKiliLT5wdHI7CisgIGlmIChjdHggPT0gTlVMTCB8fCBiLT5uZXh0X2JpbyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYik7CisKKyAgZm9yICg7OykgeworICAgIGkgPSBjdHgtPm9idWZfc2l6ZSAtIChjdHgtPm9idWZfb2ZmICsgY3R4LT5vYnVmX2xlbik7CisgICAgLyogYWRkIHRvIGJ1ZmZlciBhbmQgcmV0dXJuICovCisgICAgaWYgKGkgPj0gaW5sKSB7CisgICAgICBtZW1jcHkoJmN0eC0+b2J1ZltjdHgtPm9idWZfb2ZmICsgY3R4LT5vYnVmX2xlbl0sIGluLCBpbmwpOworICAgICAgY3R4LT5vYnVmX2xlbiArPSBpbmw7CisgICAgICByZXR1cm4gbnVtICsgaW5sOworICAgIH0KKyAgICAvKiBlbHNlICovCisgICAgLyogc3R1ZmYgYWxyZWFkeSBpbiBidWZmZXIsIHNvIGFkZCB0byBpdCBmaXJzdCwgdGhlbiBmbHVzaCAqLworICAgIGlmIChjdHgtPm9idWZfbGVuICE9IDApIHsKKyAgICAgIGlmIChpID4gMCkgeworICAgICAgICBtZW1jcHkoJmN0eC0+b2J1ZltjdHgtPm9idWZfb2ZmICsgY3R4LT5vYnVmX2xlbl0sIGluLCBpKTsKKyAgICAgICAgaW4gKz0gaTsKKyAgICAgICAgaW5sIC09IGk7CisgICAgICAgIG51bSArPSBpOworICAgICAgICBjdHgtPm9idWZfbGVuICs9IGk7CisgICAgICB9CisKKyAgICAgIC8qIHdlIG5vdyBoYXZlIGEgZnVsbCBidWZmZXIgbmVlZGluZyBmbHVzaGluZyAqLworICAgICAgZm9yICg7OykgeworICAgICAgICBpID0gQklPX3dyaXRlKGItPm5leHRfYmlvLCAmY3R4LT5vYnVmW2N0eC0+b2J1Zl9vZmZdLCBjdHgtPm9idWZfbGVuKTsKKyAgICAgICAgaWYgKGkgPD0gMCkgeworICAgICAgICAgIEJJT19jb3B5X25leHRfcmV0cnkoYik7CisKKyAgICAgICAgICBpZiAoaSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAobnVtID4gMCkgPyBudW0gOiBpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gbnVtOworICAgICAgICB9CisgICAgICAgIGN0eC0+b2J1Zl9vZmYgKz0gaTsKKyAgICAgICAgY3R4LT5vYnVmX2xlbiAtPSBpOworICAgICAgICBpZiAoY3R4LT5vYnVmX2xlbiA9PSAwKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiB3ZSBvbmx5IGdldCBoZXJlIGlmIHRoZSBidWZmZXIgaGFzIGJlZW4gZmx1c2hlZCBhbmQgd2UKKyAgICAgKiBzdGlsbCBoYXZlIHN0dWZmIHRvIHdyaXRlICovCisgICAgY3R4LT5vYnVmX29mZiA9IDA7CisKKyAgICAvKiB3ZSBub3cgaGF2ZSBpbmwgYnl0ZXMgdG8gd3JpdGUgKi8KKyAgICB3aGlsZSAoaW5sID49IGN0eC0+b2J1Zl9zaXplKSB7CisgICAgICBpID0gQklPX3dyaXRlKGItPm5leHRfYmlvLCBpbiwgaW5sKTsKKyAgICAgIGlmIChpIDw9IDApIHsKKyAgICAgICAgQklPX2NvcHlfbmV4dF9yZXRyeShiKTsKKyAgICAgICAgaWYgKGkgPCAwKSB7CisgICAgICAgICAgcmV0dXJuIChudW0gPiAwKSA/IG51bSA6IGk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bTsKKyAgICAgIH0KKyAgICAgIG51bSArPSBpOworICAgICAgaW4gKz0gaTsKKyAgICAgIGlubCAtPSBpOworICAgICAgaWYgKGlubCA9PSAwKSB7CisgICAgICAgIHJldHVybiBudW07CisgICAgICB9CisgICAgfQorCisgICAgLyogY29weSB0aGUgcmVzdCBpbnRvIHRoZSBidWZmZXIgc2luY2Ugd2UgaGF2ZSBvbmx5IGEgc21hbGwKKyAgICAgKiBhbW91bnQgbGVmdCAqLworICB9Cit9CisKK3N0YXRpYyBsb25nIGJ1ZmZlcl9jdHJsKEJJTyAqYiwgaW50IGNtZCwgbG9uZyBudW0sIHZvaWQgKnB0cikgeworICBCSU9fRl9CVUZGRVJfQ1RYICpjdHg7CisgIGxvbmcgcmV0ID0gMTsKKyAgY2hhciAqcDEsICpwMjsKKyAgaW50IHIsICppcDsKKyAgaW50IGlicywgb2JzOworCisgIGN0eCA9IChCSU9fRl9CVUZGRVJfQ1RYICopYi0+cHRyOworCisgIHN3aXRjaCAoY21kKSB7CisgICAgY2FzZSBCSU9fQ1RSTF9SRVNFVDoKKyAgICAgIGN0eC0+aWJ1Zl9vZmYgPSAwOworICAgICAgY3R4LT5pYnVmX2xlbiA9IDA7CisgICAgICBjdHgtPm9idWZfb2ZmID0gMDsKKyAgICAgIGN0eC0+b2J1Zl9sZW4gPSAwOworICAgICAgaWYgKGItPm5leHRfYmlvID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICByZXQgPSBCSU9fY3RybChiLT5uZXh0X2JpbywgY21kLCBudW0sIHB0cik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQklPX0NUUkxfSU5GTzoKKyAgICAgIHJldCA9IGN0eC0+b2J1Zl9sZW47CisgICAgICBicmVhazsKKworICAgIGNhc2UgQklPX0NUUkxfV1BFTkRJTkc6CisgICAgICByZXQgPSAobG9uZyljdHgtPm9idWZfbGVuOworICAgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgIGlmIChiLT5uZXh0X2JpbyA9PSBOVUxMKQorICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXQgPSBCSU9fY3RybChiLT5uZXh0X2JpbywgY21kLCBudW0sIHB0cik7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgQklPX0NUUkxfUEVORElORzoKKyAgICAgIHJldCA9IChsb25nKWN0eC0+aWJ1Zl9sZW47CisgICAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgaWYgKGItPm5leHRfYmlvID09IE5VTEwpIHsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBCSU9fY3RybChiLT5uZXh0X2JpbywgY21kLCBudW0sIHB0cik7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgQklPX0NfU0VUX0JVRkZfU0laRToKKyAgICAgIGlwID0gKGludCAqKXB0cjsKKyAgICAgIGlmICgqaXAgPT0gMCkgeworICAgICAgICBpYnMgPSAoaW50KW51bTsKKyAgICAgICAgb2JzID0gY3R4LT5vYnVmX3NpemU7CisgICAgICB9IGVsc2UgLyogaWYgKCppcCA9PSAxKSAqLyB7CisgICAgICAgIGlicyA9IGN0eC0+aWJ1Zl9zaXplOworICAgICAgICBvYnMgPSAoaW50KW51bTsKKyAgICAgIH0KKyAgICAgIHAxID0gY3R4LT5pYnVmOworICAgICAgcDIgPSBjdHgtPm9idWY7CisgICAgICBpZiAoaWJzID4gREVGQVVMVF9CVUZGRVJfU0laRSAmJiBpYnMgIT0gY3R4LT5pYnVmX3NpemUpIHsKKyAgICAgICAgcDEgPSAoY2hhciAqKU9QRU5TU0xfbWFsbG9jKGlicyk7CisgICAgICAgIGlmIChwMSA9PSBOVUxMKSB7CisgICAgICAgICAgZ290byBtYWxsb2NfZXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChvYnMgPiBERUZBVUxUX0JVRkZFUl9TSVpFICYmIG9icyAhPSBjdHgtPm9idWZfc2l6ZSkgeworICAgICAgICBwMiA9IChjaGFyICopT1BFTlNTTF9tYWxsb2Mob2JzKTsKKyAgICAgICAgaWYgKHAyID09IE5VTEwpIHsKKyAgICAgICAgICBpZiAocDEgIT0gY3R4LT5pYnVmKSB7CisgICAgICAgICAgICBPUEVOU1NMX2ZyZWUocDEpOworICAgICAgICAgIH0KKyAgICAgICAgICBnb3RvIG1hbGxvY19lcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoY3R4LT5pYnVmICE9IHAxKSB7CisgICAgICAgIE9QRU5TU0xfZnJlZShjdHgtPmlidWYpOworICAgICAgICBjdHgtPmlidWYgPSBwMTsKKyAgICAgICAgY3R4LT5pYnVmX3NpemUgPSBpYnM7CisgICAgICB9CisgICAgICBjdHgtPmlidWZfb2ZmID0gMDsKKyAgICAgIGN0eC0+aWJ1Zl9sZW4gPSAwOworCisgICAgICBpZiAoY3R4LT5vYnVmICE9IHAyKSB7CisgICAgICAgIE9QRU5TU0xfZnJlZShjdHgtPm9idWYpOworICAgICAgICBjdHgtPm9idWYgPSBwMjsKKyAgICAgICAgY3R4LT5vYnVmX3NpemUgPSBvYnM7CisgICAgICB9CisgICAgICBjdHgtPm9idWZfb2ZmID0gMDsKKyAgICAgIGN0eC0+b2J1Zl9sZW4gPSAwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEJJT19DVFJMX0ZMVVNIOgorICAgICAgaWYgKGItPm5leHRfYmlvID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIHdoaWxlIChjdHgtPm9idWZfbGVuID4gMCkgeworICAgICAgICBCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYik7CisgICAgICAgIHIgPSBCSU9fd3JpdGUoYi0+bmV4dF9iaW8sICYoY3R4LT5vYnVmW2N0eC0+b2J1Zl9vZmZdKSwKKyAgICAgICAgICAgICAgICAgICAgICBjdHgtPm9idWZfbGVuKTsKKyAgICAgICAgQklPX2NvcHlfbmV4dF9yZXRyeShiKTsKKyAgICAgICAgaWYgKHIgPD0gMCkgeworICAgICAgICAgIHJldHVybiByOworICAgICAgICB9CisgICAgICAgIGN0eC0+b2J1Zl9vZmYgKz0gcjsKKyAgICAgICAgY3R4LT5vYnVmX2xlbiAtPSByOworICAgICAgfQorCisgICAgICBjdHgtPm9idWZfbGVuID0gMDsKKyAgICAgIGN0eC0+b2J1Zl9vZmYgPSAwOworICAgICAgcmV0ID0gQklPX2N0cmwoYi0+bmV4dF9iaW8sIGNtZCwgbnVtLCBwdHIpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKGItPm5leHRfYmlvID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYik7CisgICAgICByZXQgPSBCSU9fY3RybChiLT5uZXh0X2JpbywgY21kLCBudW0sIHB0cik7CisgICAgICBCSU9fY29weV9uZXh0X3JldHJ5KGIpOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKKworbWFsbG9jX2Vycm9yOgorICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIGJ1ZmZlcl9jdHJsLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgbG9uZyBidWZmZXJfY2FsbGJhY2tfY3RybChCSU8gKmIsIGludCBjbWQsIGJpb19pbmZvX2NiIGZwKSB7CisgIGxvbmcgcmV0ID0gMTsKKworICBpZiAoYi0+bmV4dF9iaW8gPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgc3dpdGNoIChjbWQpIHsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gQklPX2NhbGxiYWNrX2N0cmwoYi0+bmV4dF9iaW8sIGNtZCwgZnApOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBidWZmZXJfZ2V0cyhCSU8gKmIsIGNoYXIgKmJ1ZiwgaW50IHNpemUpIHsKKyAgQklPX0ZfQlVGRkVSX0NUWCAqY3R4OworICBpbnQgbnVtID0gMCwgaSwgZmxhZzsKKyAgY2hhciAqcDsKKworICBjdHggPSAoQklPX0ZfQlVGRkVSX0NUWCAqKWItPnB0cjsKKyAgaWYgKGJ1ZiA9PSBOVUxMIHx8IHNpemUgPD0gMCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgc2l6ZS0tOyAvKiByZXNlcnZlIHNwYWNlIGZvciBhICdcMCcgKi8KKyAgQklPX2NsZWFyX3JldHJ5X2ZsYWdzKGIpOworCisgIGZvciAoOzspIHsKKyAgICBpZiAoY3R4LT5pYnVmX2xlbiA+IDApIHsKKyAgICAgIHAgPSAmY3R4LT5pYnVmW2N0eC0+aWJ1Zl9vZmZdOworICAgICAgZmxhZyA9IDA7CisgICAgICBmb3IgKGkgPSAwOyAoaSA8IGN0eC0+aWJ1Zl9sZW4pICYmIChpIDwgc2l6ZSk7IGkrKykgeworICAgICAgICAqKGJ1ZisrKSA9IHBbaV07CisgICAgICAgIGlmIChwW2ldID09ICdcbicpIHsKKyAgICAgICAgICBmbGFnID0gMTsKKyAgICAgICAgICBpKys7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIG51bSArPSBpOworICAgICAgc2l6ZSAtPSBpOworICAgICAgY3R4LT5pYnVmX2xlbiAtPSBpOworICAgICAgY3R4LT5pYnVmX29mZiArPSBpOworICAgICAgaWYgKGZsYWcgfHwgc2l6ZSA9PSAwKSB7CisgICAgICAgICpidWYgPSAnXDAnOworICAgICAgICByZXR1cm4gbnVtOworICAgICAgfQorICAgIH0gZWxzZSAvKiByZWFkIGFub3RoZXIgY2h1bmsgKi8KKyAgICB7CisgICAgICBpID0gQklPX3JlYWQoYi0+bmV4dF9iaW8sIGN0eC0+aWJ1ZiwgY3R4LT5pYnVmX3NpemUpOworICAgICAgaWYgKGkgPD0gMCkgeworICAgICAgICBCSU9fY29weV9uZXh0X3JldHJ5KGIpOworICAgICAgICAqYnVmID0gJ1wwJzsKKyAgICAgICAgaWYgKGkgPCAwKSB7CisgICAgICAgICAgcmV0dXJuIChudW0gPiAwKSA/IG51bSA6IGk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bTsKKyAgICAgIH0KKyAgICAgIGN0eC0+aWJ1Zl9sZW4gPSBpOworICAgICAgY3R4LT5pYnVmX29mZiA9IDA7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBpbnQgYnVmZmVyX3B1dHMoQklPICpiLCBjb25zdCBjaGFyICpzdHIpIHsKKyAgcmV0dXJuIGJ1ZmZlcl93cml0ZShiLCBzdHIsIHN0cmxlbihzdHIpKTsKK30KKworc3RhdGljIEJJT19NRVRIT0QgbWV0aG9kc19idWZmZXIgPSB7CisgICAgQklPX1RZUEVfQlVGRkVSLCAiYnVmZmVyIiwgICAgICAgICAgICAgYnVmZmVyX3dyaXRlLCBidWZmZXJfcmVhZCwKKyAgICBidWZmZXJfcHV0cywgICAgIGJ1ZmZlcl9nZXRzLCAgICAgICAgICBidWZmZXJfY3RybCwgIGJ1ZmZlcl9uZXcsCisgICAgYnVmZmVyX2ZyZWUsICAgICBidWZmZXJfY2FsbGJhY2tfY3RybCwKK307CisKK2NvbnN0IEJJT19NRVRIT0QgKkJJT19mX2J1ZmZlcih2b2lkKSB7IHJldHVybiAmbWV0aG9kc19idWZmZXI7IH0KKworaW50IEJJT19zZXRfcmVhZF9idWZmZXJfc2l6ZShCSU8gKmJpbywgaW50IGJ1ZmZlcl9zaXplKSB7CisgIHJldHVybiBCSU9faW50X2N0cmwoYmlvLCBCSU9fQ19TRVRfQlVGRl9TSVpFLCBidWZmZXJfc2l6ZSwgMCk7Cit9CisKK2ludCBCSU9fc2V0X3dyaXRlX2J1ZmZlcl9zaXplKEJJTyAqYmlvLCBpbnQgYnVmZmVyX3NpemUpIHsKKyAgcmV0dXJuIEJJT19pbnRfY3RybChiaW8sIEJJT19DX1NFVF9CVUZGX1NJWkUsIGJ1ZmZlcl9zaXplLCAxKTsKK30KZGlmZiAtLWdpdCBhL2NyeXB0by9iaW8vY29ubmVjdC5jIGIvY3J5cHRvL2Jpby9jb25uZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc5OGExYwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9iaW8vY29ubmVjdC5jCkBAIC0wLDAgKzEsNTI3IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmICFkZWZpbmVkKE9QRU5TU0xfV0lORE9XUykKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxvcGVuc3NsL2J1Zi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKworI2luY2x1ZGUgImludGVybmFsLmgiCisKKworZW51bSB7CisgIEJJT19DT05OX1NfQkVGT1JFLAorICBCSU9fQ09OTl9TX0JMT0NLRURfQ09OTkVDVCwKKyAgQklPX0NPTk5fU19PSywKK307CisKK3R5cGVkZWYgc3RydWN0IGJpb19jb25uZWN0X3N0IHsKKyAgaW50IHN0YXRlOworCisgIGNoYXIgKnBhcmFtX2hvc3RuYW1lOworICBjaGFyICpwYXJhbV9wb3J0OworICBpbnQgbmJpbzsKKworICB1aW50OF90IGlwWzRdOworICB1bnNpZ25lZCBzaG9ydCBwb3J0OworCisgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHRoZW07CisKKyAgLyogdGhlIGZpbGUgZGVzY3JpcHRvciBpcyBrZXB0IGluIGJpby0+bnVtIGluIG9yZGVyIHRvIG1hdGNoIHRoZSBzb2NrZXQKKyAgICogQklPLiAqLworCisgIC8qIGluZm9fY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgaW5pdGlhbGx5IG1hZGUKKyAgICogY2FsbGJhY2soQklPLHN0YXRlLHJldCk7ICBUaGUgY2FsbGJhY2sgc2hvdWxkIHJldHVybiAncmV0Jywgc3RhdGUgaXMgZm9yCisgICAqIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgU1NMIGluZm9fY2FsbGJhY2suICovCisgIGludCAoKmluZm9fY2FsbGJhY2spKGNvbnN0IEJJTyAqYmlvLCBpbnQgc3RhdGUsIGludCByZXQpOworfSBCSU9fQ09OTkVDVDsKKworLyogbWF5YmVfY29weV9pcHY0X2FkZHJlc3Mgc2V0cyB8KmlwdjR8IHRvIHRoZSBJUHY0IGFkZHJlc3MgZnJvbSB8c3N8IChpbgorICogYmlnLWVuZGlhbiBvcmRlciksIGlmIHxzc3wgY29udGFpbnMgYW4gSVB2NCBzb2NrZXQgYWRkcmVzcy4gKi8KK3N0YXRpYyB2b2lkIG1heWJlX2NvcHlfaXB2NF9hZGRyZXNzKHVpbnQ4X3QgKmlwdjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqc3MpIHsKKyAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpzaW47CisKKyAgaWYgKHNzLT5zc19mYW1pbHkgIT0gQUZfSU5FVCkgeworICAgIHJldHVybjsKKyAgfQorCisgIHNpbiA9IChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4qKSBzczsKKyAgbWVtY3B5KGlwdjQsICZzaW4tPnNpbl9hZGRyLCA0KTsKK30KKworc3RhdGljIGludCBjb25uX3N0YXRlKEJJTyAqYmlvLCBCSU9fQ09OTkVDVCAqYykgeworICBpbnQgcmV0ID0gLTEsIGk7CisgIGNoYXIgKnAsICpxOworICBpbnQgKCpjYikoY29uc3QgQklPICosIGludCwgaW50KSA9IE5VTEw7CisKKyAgaWYgKGMtPmluZm9fY2FsbGJhY2sgIT0gTlVMTCkgeworICAgIGNiID0gYy0+aW5mb19jYWxsYmFjazsKKyAgfQorCisgIGZvciAoOzspIHsKKyAgICBzd2l0Y2ggKGMtPnN0YXRlKSB7CisgICAgICBjYXNlIEJJT19DT05OX1NfQkVGT1JFOgorICAgICAgICBwID0gYy0+cGFyYW1faG9zdG5hbWU7CisgICAgICAgIGlmIChwID09IE5VTEwpIHsKKyAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIGNvbm5fc3RhdGUsIEJJT19SX05PX0hPU1ROQU1FX1NQRUNJRklFRCk7CisgICAgICAgICAgZ290byBleGl0X2xvb3A7CisgICAgICAgIH0KKyAgICAgICAgZm9yICg7ICpwICE9IDA7IHArKykgeworICAgICAgICAgIGlmICgqcCA9PSAnOicgfHwgKnAgPT0gJy8nKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpID0gKnA7CisgICAgICAgIGlmIChpID09ICc6JyB8fCBpID09ICcvJykgeworICAgICAgICAgICoocCsrKSA9IDA7CisgICAgICAgICAgaWYgKGkgPT0gJzonKSB7CisgICAgICAgICAgICBmb3IgKHEgPSBwOyAqcTsgcSsrKSB7CisgICAgICAgICAgICAgIGlmICgqcSA9PSAnLycpIHsKKyAgICAgICAgICAgICAgICAqcSA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjLT5wYXJhbV9wb3J0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgT1BFTlNTTF9mcmVlKGMtPnBhcmFtX3BvcnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYy0+cGFyYW1fcG9ydCA9IEJVRl9zdHJkdXAocCk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGMtPnBhcmFtX3BvcnQgPT0gTlVMTCkgeworICAgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgY29ubl9zdGF0ZSwgQklPX1JfTk9fUE9SVF9TUEVDSUZJRUQpOworICAgICAgICAgIEVSUl9hZGRfZXJyb3JfZGF0YSgyLCAiaG9zdD0iLCBjLT5wYXJhbV9ob3N0bmFtZSk7CisgICAgICAgICAgZ290byBleGl0X2xvb3A7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWJpb19pcF9hbmRfcG9ydF90b19zb2NrZXRfYW5kX2FkZHIoCisgICAgICAgICAgICAgICAgJmJpby0+bnVtLCAmYy0+dGhlbSwgYy0+cGFyYW1faG9zdG5hbWUsIGMtPnBhcmFtX3BvcnQpKSB7CisgICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBjb25uX3N0YXRlLCBCSU9fUl9VTkFCTEVfVE9fQ1JFQVRFX1NPQ0tFVCk7CisgICAgICAgICAgRVJSX2FkZF9lcnJvcl9kYXRhKDQsICJob3N0PSIsIGMtPnBhcmFtX2hvc3RuYW1lLCAiOiIsIGMtPnBhcmFtX3BvcnQpOworICAgICAgICAgIGdvdG8gZXhpdF9sb29wOworICAgICAgICB9CisKKyAgICAgICAgbWVtc2V0KGMtPmlwLCAwLCA0KTsKKyAgICAgICAgbWF5YmVfY29weV9pcHY0X2FkZHJlc3MoYy0+aXAsICZjLT50aGVtKTsKKworICAgICAgICBpZiAoYy0+bmJpbykgeworICAgICAgICAgIGlmICghYmlvX3NvY2tldF9uYmlvKGJpby0+bnVtLCAxKSkgeworICAgICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBjb25uX3N0YXRlLCBCSU9fUl9FUlJPUl9TRVRUSU5HX05CSU8pOworICAgICAgICAgICAgRVJSX2FkZF9lcnJvcl9kYXRhKDQsICJob3N0PSIsIGMtPnBhcmFtX2hvc3RuYW1lLCAiOiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+cGFyYW1fcG9ydCk7CisgICAgICAgICAgICBnb3RvIGV4aXRfbG9vcDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpID0gMTsKKyAgICAgICAgcmV0ID0gc2V0c29ja29wdChiaW8tPm51bSwgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCAoY2hhciAqKSZpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpKSk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgT1BFTlNTTF9QVVRfU1lTVEVNX0VSUk9SKHNldHNvY2tvcHQpOworICAgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgY29ubl9zdGF0ZSwgQklPX1JfS0VFUEFMSVZFKTsKKyAgICAgICAgICBFUlJfYWRkX2Vycm9yX2RhdGEoNCwgImhvc3Q9IiwgYy0+cGFyYW1faG9zdG5hbWUsICI6IiwgYy0+cGFyYW1fcG9ydCk7CisgICAgICAgICAgZ290byBleGl0X2xvb3A7CisgICAgICAgIH0KKworICAgICAgICBCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYmlvKTsKKyAgICAgICAgcmV0ID0gY29ubmVjdChiaW8tPm51bSwgKHN0cnVjdCBzb2NrYWRkciopICZjLT50aGVtLCBzaXplb2YoYy0+dGhlbSkpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgIGlmIChiaW9fZmRfc2hvdWxkX3JldHJ5KHJldCkpIHsKKyAgICAgICAgICAgIEJJT19zZXRfZmxhZ3MoYmlvLCAoQklPX0ZMQUdTX0lPX1NQRUNJQUwgfCBCSU9fRkxBR1NfU0hPVUxEX1JFVFJZKSk7CisgICAgICAgICAgICBjLT5zdGF0ZSA9IEJJT19DT05OX1NfQkxPQ0tFRF9DT05ORUNUOworICAgICAgICAgICAgYmlvLT5yZXRyeV9yZWFzb24gPSBCSU9fUlJfQ09OTkVDVDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgT1BFTlNTTF9QVVRfU1lTVEVNX0VSUk9SKGNvbm5lY3QpOworICAgICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBjb25uX3N0YXRlLCBCSU9fUl9DT05ORUNUX0VSUk9SKTsKKyAgICAgICAgICAgIEVSUl9hZGRfZXJyb3JfZGF0YSg0LCAiaG9zdD0iLCBjLT5wYXJhbV9ob3N0bmFtZSwgIjoiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnBhcmFtX3BvcnQpOworICAgICAgICAgIH0KKyAgICAgICAgICBnb3RvIGV4aXRfbG9vcDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjLT5zdGF0ZSA9IEJJT19DT05OX1NfT0s7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQklPX0NPTk5fU19CTE9DS0VEX0NPTk5FQ1Q6CisgICAgICAgIGkgPSBiaW9fc29ja19lcnJvcihiaW8tPm51bSk7CisgICAgICAgIGlmIChpKSB7CisgICAgICAgICAgaWYgKGJpb19mZF9zaG91bGRfcmV0cnkocmV0KSkgeworICAgICAgICAgICAgQklPX3NldF9mbGFncyhiaW8sIChCSU9fRkxBR1NfSU9fU1BFQ0lBTCB8IEJJT19GTEFHU19TSE9VTERfUkVUUlkpKTsKKyAgICAgICAgICAgIGMtPnN0YXRlID0gQklPX0NPTk5fU19CTE9DS0VEX0NPTk5FQ1Q7CisgICAgICAgICAgICBiaW8tPnJldHJ5X3JlYXNvbiA9IEJJT19SUl9DT05ORUNUOworICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEJJT19jbGVhcl9yZXRyeV9mbGFncyhiaW8pOworICAgICAgICAgICAgT1BFTlNTTF9QVVRfU1lTVEVNX0VSUk9SKGNvbm5lY3QpOworICAgICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBjb25uX3N0YXRlLCBCSU9fUl9OQklPX0NPTk5FQ1RfRVJST1IpOworICAgICAgICAgICAgRVJSX2FkZF9lcnJvcl9kYXRhKDQsICJob3N0PSIsIGMtPnBhcmFtX2hvc3RuYW1lLCAiOiIsIGMtPnBhcmFtX3BvcnQpOworICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgZ290byBleGl0X2xvb3A7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYy0+c3RhdGUgPSBCSU9fQ09OTl9TX09LOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEJJT19DT05OX1NfT0s6CisgICAgICAgIHJldCA9IDE7CisgICAgICAgIGdvdG8gZXhpdF9sb29wOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYXNzZXJ0KDApOworICAgICAgICBnb3RvIGV4aXRfbG9vcDsKKyAgICB9CisKKyAgICBpZiAoY2IgIT0gTlVMTCkgeworICAgICAgcmV0ID0gY2IoKEJJTyAqKWJpbywgYy0+c3RhdGUsIHJldCk7CisgICAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgZ290byBlbmQ7CisgICAgICB9CisgICAgfQorICB9CisKK2V4aXRfbG9vcDoKKyAgaWYgKGNiICE9IE5VTEwpIHsKKyAgICByZXQgPSBjYigoQklPICopYmlvLCBjLT5zdGF0ZSwgcmV0KTsKKyAgfQorCitlbmQ6CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBCSU9fQ09OTkVDVCAqQklPX0NPTk5FQ1RfbmV3KHZvaWQpIHsKKyAgQklPX0NPTk5FQ1QgKnJldCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihCSU9fQ09OTkVDVCkpOworCisgIGlmIChyZXQgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIG1lbXNldChyZXQsIDAsIHNpemVvZihCSU9fQ09OTkVDVCkpOworCisgIHJldC0+c3RhdGUgPSBCSU9fQ09OTl9TX0JFRk9SRTsKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgQklPX0NPTk5FQ1RfZnJlZShCSU9fQ09OTkVDVCAqYykgeworICBpZiAoYyA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGMtPnBhcmFtX2hvc3RuYW1lICE9IE5VTEwpIHsKKyAgICBPUEVOU1NMX2ZyZWUoYy0+cGFyYW1faG9zdG5hbWUpOworICB9CisgIGlmIChjLT5wYXJhbV9wb3J0ICE9IE5VTEwpIHsKKyAgICBPUEVOU1NMX2ZyZWUoYy0+cGFyYW1fcG9ydCk7CisgIH0KKyAgT1BFTlNTTF9mcmVlKGMpOworfQorCitzdGF0aWMgaW50IGNvbm5fbmV3KEJJTyAqYmlvKSB7CisgIGJpby0+aW5pdCA9IDA7CisgIGJpby0+bnVtID0gLTE7CisgIGJpby0+ZmxhZ3MgPSAwOworICBiaW8tPnB0ciA9IChjaGFyICopQklPX0NPTk5FQ1RfbmV3KCk7CisgIHJldHVybiBiaW8tPnB0ciAhPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBjb25uX2Nsb3NlX3NvY2tldChCSU8gKmJpbykgeworICBCSU9fQ09OTkVDVCAqYyA9IChCSU9fQ09OTkVDVCAqKSBiaW8tPnB0cjsKKworICBpZiAoYmlvLT5udW0gPT0gLTEpIHsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBPbmx5IGRvIGEgc2h1dGRvd24gaWYgdGhpbmdzIHdlcmUgZXN0YWJsaXNoZWQgKi8KKyAgaWYgKGMtPnN0YXRlID09IEJJT19DT05OX1NfT0spIHsKKyAgICBzaHV0ZG93bihiaW8tPm51bSwgMik7CisgIH0KKyAgY2xvc2UoYmlvLT5udW0pOworICBiaW8tPm51bSA9IC0xOworfQorCitzdGF0aWMgaW50IGNvbm5fZnJlZShCSU8gKmJpbykgeworICBpZiAoYmlvID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChiaW8tPnNodXRkb3duKSB7CisgICAgY29ubl9jbG9zZV9zb2NrZXQoYmlvKTsKKyAgfQorCisgIEJJT19DT05ORUNUX2ZyZWUoKEJJT19DT05ORUNUKikgYmlvLT5wdHIpOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNvbm5fcmVhZChCSU8gKmJpbywgY2hhciAqb3V0LCBpbnQgb3V0X2xlbikgeworICBpbnQgcmV0ID0gMDsKKyAgQklPX0NPTk5FQ1QgKmRhdGE7CisKKyAgZGF0YSA9IChCSU9fQ09OTkVDVCAqKWJpby0+cHRyOworICBpZiAoZGF0YS0+c3RhdGUgIT0gQklPX0NPTk5fU19PSykgeworICAgIHJldCA9IGNvbm5fc3RhdGUoYmlvLCBkYXRhKTsKKyAgICBpZiAocmV0IDw9IDApIHsKKyAgICAgIHJldHVybiByZXQ7CisgICAgfQorICB9CisKKyAgYmlvX2NsZWFyX3NvY2tldF9lcnJvcigpOworICByZXQgPSByZWN2KGJpby0+bnVtLCBvdXQsIG91dF9sZW4sIDApOworICBCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYmlvKTsKKyAgaWYgKHJldCA8PSAwKSB7CisgICAgaWYgKGJpb19mZF9zaG91bGRfcmV0cnkocmV0KSkgeworICAgICAgQklPX3NldF9yZXRyeV9yZWFkKGJpbyk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjb25uX3dyaXRlKEJJTyAqYmlvLCBjb25zdCBjaGFyICppbiwgaW50IGluX2xlbikgeworICBpbnQgcmV0OworICBCSU9fQ09OTkVDVCAqZGF0YTsKKworICBkYXRhID0gKEJJT19DT05ORUNUICopYmlvLT5wdHI7CisgIGlmIChkYXRhLT5zdGF0ZSAhPSBCSU9fQ09OTl9TX09LKSB7CisgICAgcmV0ID0gY29ubl9zdGF0ZShiaW8sIGRhdGEpOworICAgIGlmIChyZXQgPD0gMCkgeworICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgIH0KKworICBiaW9fY2xlYXJfc29ja2V0X2Vycm9yKCk7CisgIHJldCA9IHNlbmQoYmlvLT5udW0sIGluLCBpbl9sZW4sIDApOworICBCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYmlvKTsKKyAgaWYgKHJldCA8PSAwKSB7CisgICAgaWYgKGJpb19mZF9zaG91bGRfcmV0cnkocmV0KSkgeworICAgICAgQklPX3NldF9yZXRyeV93cml0ZShiaW8pOworICAgIH0KKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBsb25nIGNvbm5fY3RybChCSU8gKmJpbywgaW50IGNtZCwgbG9uZyBudW0sIHZvaWQgKnB0cikgeworICBpbnQgKmlwOworICBjb25zdCBjaGFyICoqcHB0cjsKKyAgbG9uZyByZXQgPSAxOworICBCSU9fQ09OTkVDVCAqZGF0YTsKKworICBkYXRhID0gKEJJT19DT05ORUNUICopYmlvLT5wdHI7CisKKyAgc3dpdGNoIChjbWQpIHsKKyAgICBjYXNlIEJJT19DVFJMX1JFU0VUOgorICAgICAgcmV0ID0gMDsKKyAgICAgIGRhdGEtPnN0YXRlID0gQklPX0NPTk5fU19CRUZPUkU7CisgICAgICBjb25uX2Nsb3NlX3NvY2tldChiaW8pOworICAgICAgYmlvLT5mbGFncyA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJJT19DX0RPX1NUQVRFX01BQ0hJTkU6CisgICAgICAvKiB1c2UgdGhpcyBvbmUgdG8gc3RhcnQgdGhlIGNvbm5lY3Rpb24gKi8KKyAgICAgIGlmIChkYXRhLT5zdGF0ZSAhPSBCSU9fQ09OTl9TX09LKQorICAgICAgICByZXQgPSAobG9uZyljb25uX3N0YXRlKGJpbywgZGF0YSk7CisgICAgICBlbHNlCisgICAgICAgIHJldCA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJJT19DX0dFVF9DT05ORUNUOgorICAgICAgLyogVE9ETyhmb3JrKTogY2FuIHRoaXMgYmUgcmVtb3ZlZD8gKE9yIG1heWJlIHRoaXMgd2hvbGUgZmlsZSkuICovCisgICAgICBpZiAocHRyICE9IE5VTEwpIHsKKyAgICAgICAgcHB0ciA9IChjb25zdCBjaGFyICoqKXB0cjsKKyAgICAgICAgaWYgKG51bSA9PSAwKSB7CisgICAgICAgICAgKnBwdHIgPSBkYXRhLT5wYXJhbV9ob3N0bmFtZTsKKyAgICAgICAgfSBlbHNlIGlmIChudW0gPT0gMSkgeworICAgICAgICAgICpwcHRyID0gZGF0YS0+cGFyYW1fcG9ydDsKKyAgICAgICAgfSBlbHNlIGlmIChudW0gPT0gMikgeworICAgICAgICAgICpwcHRyID0gKGNoYXIgKikgJmRhdGEtPmlwWzBdOworICAgICAgICB9IGVsc2UgaWYgKG51bSA9PSAzKSB7CisgICAgICAgICAgKigoaW50ICopcHRyKSA9IGRhdGEtPnBvcnQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFiaW8tPmluaXQpIHsKKyAgICAgICAgICAqcHB0ciA9ICJub3QgaW5pdGlhbGl6ZWQiOworICAgICAgICB9CisgICAgICAgIHJldCA9IDE7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEJJT19DX1NFVF9DT05ORUNUOgorICAgICAgaWYgKHB0ciAhPSBOVUxMKSB7CisgICAgICAgIGJpby0+aW5pdCA9IDE7CisgICAgICAgIGlmIChudW0gPT0gMCkgeworICAgICAgICAgIGlmIChkYXRhLT5wYXJhbV9ob3N0bmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBPUEVOU1NMX2ZyZWUoZGF0YS0+cGFyYW1faG9zdG5hbWUpOworICAgICAgICAgIH0KKyAgICAgICAgICBkYXRhLT5wYXJhbV9ob3N0bmFtZSA9IEJVRl9zdHJkdXAocHRyKTsKKyAgICAgICAgfSBlbHNlIGlmIChudW0gPT0gMSkgeworICAgICAgICAgIGlmIChkYXRhLT5wYXJhbV9wb3J0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIE9QRU5TU0xfZnJlZShkYXRhLT5wYXJhbV9wb3J0KTsKKyAgICAgICAgICB9CisgICAgICAgICAgZGF0YS0+cGFyYW1fcG9ydCA9IEJVRl9zdHJkdXAocHRyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXQgPSAwOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEJJT19DX1NFVF9OQklPOgorICAgICAgZGF0YS0+bmJpbyA9IChpbnQpbnVtOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCSU9fQ19HRVRfRkQ6CisgICAgICBpZiAoYmlvLT5pbml0KSB7CisgICAgICAgIGlwID0gKGludCAqKXB0cjsKKyAgICAgICAgaWYgKGlwICE9IE5VTEwpIHsKKyAgICAgICAgICAqaXAgPSBiaW8tPm51bTsKKyAgICAgICAgfQorICAgICAgICByZXQgPSAxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQklPX0NUUkxfR0VUX0NMT1NFOgorICAgICAgcmV0ID0gYmlvLT5zaHV0ZG93bjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQklPX0NUUkxfU0VUX0NMT1NFOgorICAgICAgYmlvLT5zaHV0ZG93biA9IChpbnQpbnVtOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCSU9fQ1RSTF9QRU5ESU5HOgorICAgIGNhc2UgQklPX0NUUkxfV1BFTkRJTkc6CisgICAgICByZXQgPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCSU9fQ1RSTF9GTFVTSDoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQklPX0NUUkxfU0VUX0NBTExCQUNLOiB7CisjaWYgMCAvKiBGSVhNRTogU2hvdWxkIHRoaXMgYmUgdXNlZD8gIC0tIFJpY2hhcmQgTGV2aXR0ZSAqLworCQlPUEVOU1NMX1BVVF9FUlJPUihCSU8sIFhYWCwgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKwkJcmV0ID0gLTE7CisjZWxzZQorICAgICAgcmV0ID0gMDsKKyNlbmRpZgorICAgIH0gYnJlYWs7CisgICAgY2FzZSBCSU9fQ1RSTF9HRVRfQ0FMTEJBQ0s6IHsKKyAgICAgIGludCAoKipmcHRyKShjb25zdCBCSU8gKmJpbywgaW50IHN0YXRlLCBpbnQgeHJldCk7CisgICAgICBmcHRyID0gKGludCAoKiopKGNvbnN0IEJJTyAqYmlvLCBpbnQgc3RhdGUsIGludCB4cmV0KSlwdHI7CisgICAgICAqZnB0ciA9IGRhdGEtPmluZm9fY2FsbGJhY2s7CisgICAgfSBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gMDsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiAocmV0KTsKK30KKworc3RhdGljIGxvbmcgY29ubl9jYWxsYmFja19jdHJsKEJJTyAqYmlvLCBpbnQgY21kLCBiaW9faW5mb19jYiBmcCkgeworICBsb25nIHJldCA9IDE7CisgIEJJT19DT05ORUNUICpkYXRhOworCisgIGRhdGEgPSAoQklPX0NPTk5FQ1QgKiliaW8tPnB0cjsKKworICBzd2l0Y2ggKGNtZCkgeworICAgIGNhc2UgQklPX0NUUkxfU0VUX0NBTExCQUNLOiB7CisgICAgICBkYXRhLT5pbmZvX2NhbGxiYWNrID0gKGludCAoKikoY29uc3Qgc3RydWN0IGJpb19zdCAqLCBpbnQsIGludCkpZnA7CisgICAgfSBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gMDsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY29ubl9wdXRzKEJJTyAqYnAsIGNvbnN0IGNoYXIgKnN0cikgeworICByZXR1cm4gY29ubl93cml0ZShicCwgc3RyLCBzdHJsZW4oc3RyKSk7Cit9CisKK0JJTyAqQklPX25ld19jb25uZWN0KGNvbnN0IGNoYXIgKmhvc3RuYW1lKSB7CisgIEJJTyAqcmV0OworCisgIHJldCA9IEJJT19uZXcoQklPX3NfY29ubmVjdCgpKTsKKyAgaWYgKHJldCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKCFCSU9fc2V0X2Nvbm5faG9zdG5hbWUocmV0LCBob3N0bmFtZSkpIHsKKyAgICBCSU9fZnJlZShyZXQpOworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBCSU9fTUVUSE9EIG1ldGhvZHNfY29ubmVjdHAgPSB7CisgICAgQklPX1RZUEVfQ09OTkVDVCwgInNvY2tldCBjb25uZWN0IiwgICAgICAgICBjb25uX3dyaXRlLCBjb25uX3JlYWQsCisgICAgY29ubl9wdXRzLCAgICAgICAgTlVMTCAvKiBjb25uZWN0X2dldHMsICovLCBjb25uX2N0cmwsICBjb25uX25ldywKKyAgICBjb25uX2ZyZWUsICAgICAgICBjb25uX2NhbGxiYWNrX2N0cmwsCit9OworCitjb25zdCBCSU9fTUVUSE9EICpCSU9fc19jb25uZWN0KHZvaWQpIHsgcmV0dXJuICZtZXRob2RzX2Nvbm5lY3RwOyB9CisKK2ludCBCSU9fc2V0X2Nvbm5faG9zdG5hbWUoQklPICpiaW8sIGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgcmV0dXJuIEJJT19jdHJsKGJpbywgQklPX0NfU0VUX0NPTk5FQ1QsIDAsICh2b2lkKikgbmFtZSk7Cit9CisKK2ludCBCSU9fc2V0X2Nvbm5fcG9ydChCSU8gKmJpbywgY29uc3QgY2hhciAqcG9ydF9zdHIpIHsKKyAgcmV0dXJuIEJJT19jdHJsKGJpbywgQklPX0NfU0VUX0NPTk5FQ1QsIDEsICh2b2lkKikgcG9ydF9zdHIpOworfQorCitpbnQgQklPX3NldF9uYmlvKEJJTyAqYmlvLCBpbnQgb24pIHsKKyAgcmV0dXJuIEJJT19jdHJsKGJpbywgQklPX0NfU0VUX05CSU8sIG9uLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2NyeXB0by9iaW8vZmQuYyBiL2NyeXB0by9iaW8vZmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDAwNTZkCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2Jpby9mZC5jCkBAIC0wLDAgKzEsMjY0IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpZiAhZGVmaW5lZChPUEVOU1NMX1dJTkRPV1MpCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPG9wZW5zc2wvYnVmLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorCisKK3N0YXRpYyBpbnQgYmlvX2ZkX25vbl9mYXRhbF9lcnJvcihpbnQgZXJyKSB7CisgIGlmICgKKyNpZmRlZiBFV09VTERCTE9DSworICAgIGVyciA9PSBFV09VTERCTE9DSyB8fAorI2VuZGlmCisjaWZkZWYgV1NBRVdPVUxEQkxPQ0sKKyAgICBlcnIgPT0gV1NBRVdPVUxEQkxPQ0sgfHwKKyNlbmRpZgorI2lmZGVmIEVOT1RDT05OCisgICAgZXJyID09IEVOT1RDT05OIHx8CisjZW5kaWYKKyNpZmRlZiBFSU5UUgorICAgIGVyciA9PSBFSU5UUiB8fAorI2VuZGlmCisjaWZkZWYgRUFHQUlOCisgICAgZXJyID09IEVBR0FJTiB8fAorI2VuZGlmCisjaWZkZWYgRVBST1RPCisgICAgZXJyID09IEVQUk9UTyB8fAorI2VuZGlmCisjaWZkZWYgRUlOUFJPR1JFU1MKKyAgICBlcnIgPT0gRUlOUFJPR1JFU1MgfHwKKyNlbmRpZgorI2lmZGVmIEVBTFJFQURZCisgICAgZXJyID09IEVBTFJFQURZIHx8CisjZW5kaWYKKyAgICAwKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKyNpZiBkZWZpbmVkKFdJTjMyKQorc3RhdGljIGludCBiaW9fZmRfc2hvdWxkX3JldHJ5KGludCBpKSB7CisgIGlmIChpID09IC0xKSB7CisgICAgcmV0dXJuIGJpb19mZF9ub25fZmF0YWxfZXJyb3IoKGludClHZXRMYXN0RXJyb3IoKSk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisjZWxzZQoraW50IGJpb19mZF9zaG91bGRfcmV0cnkoaW50IGkpIHsKKyAgaWYgKGkgPT0gLTEpIHsKKyAgICByZXR1cm4gYmlvX2ZkX25vbl9mYXRhbF9lcnJvcihlcnJubyk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworQklPICpCSU9fbmV3X2ZkKGludCBmZCwgaW50IGNsb3NlX2ZsYWcpIHsKKyAgQklPICpyZXQgPSBCSU9fbmV3KEJJT19zX2ZkKCkpOworICBpZiAocmV0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBCSU9fc2V0X2ZkKHJldCwgZmQsIGNsb3NlX2ZsYWcpOworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZkX25ldyhCSU8gKmJpbykgeworICAvKiBudW0gaXMgdXNlZCB0byBzdG9yZSB0aGUgZmlsZSBkZXNjcmlwdG9yLiAqLworICBiaW8tPm51bSA9IC0xOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBmZF9mcmVlKEJJTyAqYmlvKSB7CisgIGlmIChiaW8gPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKGJpby0+c2h1dGRvd24pIHsKKyAgICBpZiAoYmlvLT5pbml0KSB7CisgICAgICBjbG9zZShiaW8tPm51bSk7CisgICAgfQorICAgIGJpby0+aW5pdCA9IDA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZmRfcmVhZChCSU8gKmIsIGNoYXIgKm91dCwgaW50IG91dGwpIHsKKyAgaW50IHJldCA9IDA7CisKKyAgcmV0ID0gcmVhZChiLT5udW0sIG91dCwgb3V0bCk7CisgIEJJT19jbGVhcl9yZXRyeV9mbGFncyhiKTsKKyAgaWYgKHJldCA8PSAwKSB7CisgICAgaWYgKGJpb19mZF9zaG91bGRfcmV0cnkocmV0KSkgeworICAgICAgQklPX3NldF9yZXRyeV9yZWFkKGIpOworICAgIH0KKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZmRfd3JpdGUoQklPICpiLCBjb25zdCBjaGFyICppbiwgaW50IGlubCkgeworICBpbnQgcmV0ID0gd3JpdGUoYi0+bnVtLCBpbiwgaW5sKTsKKyAgQklPX2NsZWFyX3JldHJ5X2ZsYWdzKGIpOworICBpZiAocmV0IDw9IDApIHsKKyAgICBpZiAoYmlvX2ZkX3Nob3VsZF9yZXRyeShyZXQpKSB7CisgICAgICBCSU9fc2V0X3JldHJ5X3dyaXRlKGIpOworICAgIH0KKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBsb25nIGZkX2N0cmwoQklPICpiLCBpbnQgY21kLCBsb25nIG51bSwgdm9pZCAqcHRyKSB7CisgIGxvbmcgcmV0ID0gMTsKKyAgaW50ICppcDsKKworICBzd2l0Y2ggKGNtZCkgeworICAgIGNhc2UgQklPX0NUUkxfUkVTRVQ6CisgICAgICBudW0gPSAwOworICAgIGNhc2UgQklPX0NfRklMRV9TRUVLOgorICAgICAgcmV0ID0gMDsKKyAgICAgIGlmIChiLT5pbml0KSB7CisgICAgICAgIHJldCA9IChsb25nKWxzZWVrKGItPm51bSwgbnVtLCBTRUVLX1NFVCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEJJT19DX0ZJTEVfVEVMTDoKKyAgICBjYXNlIEJJT19DVFJMX0lORk86CisgICAgICByZXQgPSAwOworICAgICAgaWYgKGItPmluaXQpIHsKKyAgICAgICAgcmV0ID0gKGxvbmcpbHNlZWsoYi0+bnVtLCAwLCBTRUVLX0NVUik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEJJT19DX1NFVF9GRDoKKyAgICAgIGZkX2ZyZWUoYik7CisgICAgICBiLT5udW0gPSAqKChpbnQgKilwdHIpOworICAgICAgYi0+c2h1dGRvd24gPSAoaW50KW51bTsKKyAgICAgIGItPmluaXQgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCSU9fQ19HRVRfRkQ6CisgICAgICBpZiAoYi0+aW5pdCkgeworICAgICAgICBpcCA9IChpbnQgKilwdHI7CisgICAgICAgIGlmIChpcCAhPSBOVUxMKSB7CisgICAgICAgICAgKmlwID0gYi0+bnVtOworICAgICAgICB9CisgICAgICAgIHJldHVybiAxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQklPX0NUUkxfR0VUX0NMT1NFOgorICAgICAgcmV0ID0gYi0+c2h1dGRvd247CisgICAgICBicmVhazsKKyAgICBjYXNlIEJJT19DVFJMX1NFVF9DTE9TRToKKyAgICAgIGItPnNodXRkb3duID0gKGludCludW07CisgICAgICBicmVhazsKKyAgICBjYXNlIEJJT19DVFJMX1BFTkRJTkc6CisgICAgY2FzZSBCSU9fQ1RSTF9XUEVORElORzoKKyAgICAgIHJldCA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJJT19DVFJMX0ZMVVNIOgorICAgICAgcmV0ID0gMTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSAwOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZkX3B1dHMoQklPICpicCwgY29uc3QgY2hhciAqc3RyKSB7CisgIHJldHVybiBmZF93cml0ZShicCwgc3RyLCBzdHJsZW4oc3RyKSk7Cit9CisKK3N0YXRpYyBpbnQgZmRfZ2V0cyhCSU8gKmJwLCBjaGFyICpidWYsIGludCBzaXplKSB7CisgIGNoYXIgKnB0ciA9IGJ1ZjsKKyAgY2hhciAqZW5kID0gYnVmICsgc2l6ZSAtIDE7CisKKyAgaWYgKHNpemUgPD0gMCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgd2hpbGUgKHB0ciA8IGVuZCAmJiBmZF9yZWFkKGJwLCBwdHIsIDEpID4gMCAmJiBwdHJbMF0gIT0gJ1xuJykgeworICAgIHB0cisrOworICB9CisKKyAgcHRyWzBdID0gJ1wwJzsKKworICByZXR1cm4gcHRyIC0gYnVmOworfQorCitzdGF0aWMgY29uc3QgQklPX01FVEhPRCBtZXRob2RzX2ZkcCA9IHsKKyAgICBCSU9fVFlQRV9GRCwgImZpbGUgZGVzY3JpcHRvciIsIGZkX3dyaXRlLCBmZF9yZWFkLCBmZF9wdXRzLAorICAgIGZkX2dldHMsICAgICBmZF9jdHJsLCAgICAgICAgICAgZmRfbmV3LCAgIGZkX2ZyZWUsIE5VTEwsIH07CisKK2NvbnN0IEJJT19NRVRIT0QgKkJJT19zX2ZkKHZvaWQpIHsgcmV0dXJuICZtZXRob2RzX2ZkcDsgfQorCitpbnQgQklPX3NldF9mZChCSU8gKmJpbywgaW50IGZkLCBpbnQgY2xvc2VfZmxhZykgeworICByZXR1cm4gQklPX2ludF9jdHJsKGJpbywgQklPX0NfU0VUX0ZELCBjbG9zZV9mbGFnLCBmZCk7Cit9CisKK2ludCBCSU9fZ2V0X2ZkKEJJTyAqYmlvLCBpbnQgKm91dF9mZCkgeworICByZXR1cm4gQklPX2N0cmwoYmlvLCBCSU9fQ19HRVRfRkQsIDAsIChjaGFyICopIG91dF9mZCk7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vYmlvL2ZpbGUuYyBiL2NyeXB0by9iaW8vZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYTY3Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYmlvL2ZpbGUuYwpAQCAtMCwwICsxLDM0OSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2lmIGRlZmluZWQoX19saW51eCkgfHwgZGVmaW5lZChfX3N1bikgfHwgZGVmaW5lZChfX2hwdXgpCisvKiBGb2xsb3dpbmcgZGVmaW5pdGlvbiBhbGlhc2VzIGZvcGVuIHRvIGZvcGVuNjQgb24gYWJvdmUgbWVudGlvbmVkCisgKiBwbGF0Zm9ybXMuIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gb3BlbiBhbmQgc2VxdWVudGlhbGx5IGFjY2VzcworICogZmlsZXMgbGFyZ2VyIHRoYW4gMkdCIGZyb20gMzItYml0IGFwcGxpY2F0aW9uLiBJdCBkb2VzIG5vdCBhbGxvdyB0bworICogdHJhdmVyc2UgdGhlbSBiZXlvbmQgMkdCIHdpdGggZnNlZWsvZnRlbGwsIGJ1dCBvbiB0aGUgb3RoZXIgaGFuZCAqbm8qCisgKiAzMi1iaXQgcGxhdGZvcm0gcGVybWl0cyB0aGF0LCBub3Qgd2l0aCBmc2Vlay9mdGVsbC4gTm90IHRvIG1lbnRpb24KKyAqIHRoYXQgYnJlYWtpbmcgMkdCIGxpbWl0IGZvciBzZWVraW5nIHdvdWxkIHJlcXVpcmUgc3VyZ2VyeSB0byAqb3VyKgorICogQVBJLiBCdXQgc2VxdWVudGlhbCBhY2Nlc3Mgc3VmZmljZXMgZm9yIHByYWN0aWNhbCBjYXNlcyB3aGVuIHlvdQorICogY2FuIHJ1biBpbnRvIGxhcmdlIGZpbGVzLCBzdWNoIGFzIGZpbmdlcnByaW50aW5nLCBzbyB3ZSBjYW4gbGV0IEFQSQorICogYWxvbmUuIEZvciByZWZlcmVuY2UsIHRoZSBsaXN0IG9mIDMyLWJpdCBwbGF0Zm9ybXMgd2hpY2ggYWxsb3cgZm9yCisgKiBzZXF1ZW50aWFsIGFjY2VzcyBvZiBsYXJnZSBmaWxlcyB3aXRob3V0IGV4dHJhICJtYWdpYyIgY29tcHJpc2UgKkJTRCwKKyAqIERhcndpbiwgSVJJWC4uLgorICovCisjaWZuZGVmIF9GSUxFX09GRlNFVF9CSVRTCisjZGVmaW5lIF9GSUxFX09GRlNFVF9CSVRTIDY0CisjZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYnVmLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorCisKKyNkZWZpbmUgQklPX0ZQX1JFQUQgMHgwMgorI2RlZmluZSBCSU9fRlBfV1JJVEUgMHgwNAorI2RlZmluZSBCSU9fRlBfQVBQRU5EIDB4MDgKKworc3RhdGljIEZJTEUgKm9wZW5fZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqbW9kZSkgeworI2lmIGRlZmluZWQoX1dJTjMyKSAmJiBkZWZpbmVkKENQX1VURjgpCisgIGludCBzeiwgbGVuXzAgPSAoaW50KXN0cmxlbihmaWxlbmFtZSkgKyAxOworICBEV09SRCBmbGFnczsKKworICAvKiBCYXNpY2FsbHkgdGhlcmUgYXJlIHRocmVlIGNhc2VzIHRvIGNvdmVyOiBhKSBmaWxlbmFtZSBpcyBwdXJlIEFTQ0lJCisgICAqIHN0cmluZzsgYikgYWN0dWFsIFVURi04IGVuY29kZWQgc3RyaW5nIGFuZCBjKSBsb2NhbGUtaXplZCBzdHJpbmcsIGkuZS4gb25lCisgICAqIGNvbnRhaW5pbmcgOC1iaXQgY2hhcmFjdGVycyB0aGF0IGFyZSBtZWFuaW5nZnVsIGluIGN1cnJlbnQgc3lzdGVtIGxvY2FsZS4KKyAgICogSWYgZmlsZW5hbWUgaXMgcHVyZSBBU0NJSSBvciByZWFsIFVURi04IGVuY29kZWQgc3RyaW5nLAorICAgKiBNdWx0aUJ5dGVUb1dpZGVDaGFyIHN1Y2NlZWRzIGFuZCBfd2ZvcGVuIHdvcmtzLiBJZiBmaWxlbmFtZSBpcyBsb2NhbGUtaXplZAorICAgKiBzdHJpbmcsIGNoYW5jZXMgYXJlIHRoYXQgTXVsdGlCeXRlVG9XaWRlQ2hhciBmYWlscyByZXBvcnRpbmcKKyAgICogRVJST1JfTk9fVU5JQ09ERV9UUkFOU0xBVElPTiwgaW4gd2hpY2ggY2FzZSB3ZSBmYWxsIGJhY2sgdG8gZm9wZW4uLi4gKi8KKyAgaWYgKChzeiA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVVRGOCwgKGZsYWdzID0gTUJfRVJSX0lOVkFMSURfQ0hBUlMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgbGVuXzAsIE5VTEwsIDApKSA+IDAgfHwKKyAgICAgIChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9JTlZBTElEX0ZMQUdTICYmCisgICAgICAgKHN6ID0gTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9VVEY4LCAoZmxhZ3MgPSAwKSwgZmlsZW5hbWUsIGxlbl8wLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkpID4gMCkpIHsKKyAgICBXQ0hBUiB3bW9kZVs4XTsKKyAgICBXQ0hBUiAqd2ZpbGVuYW1lID0gX2FsbG9jYShzeiAqIHNpemVvZihXQ0hBUikpOworCisgICAgaWYgKE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVVRGOCwgZmxhZ3MsIGZpbGVuYW1lLCBsZW5fMCwgd2ZpbGVuYW1lLCBzeikgJiYKKyAgICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9VVEY4LCAwLCBtb2RlLCBzdHJsZW4obW9kZSkgKyAxLCB3bW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yod21vZGUpIC8gc2l6ZW9mKHdtb2RlWzBdKSkgJiYKKyAgICAgICAgKGZpbGUgPSBfd2ZvcGVuKHdmaWxlbmFtZSwgd21vZGUpKSA9PSBOVUxMICYmCisgICAgICAgIChlcnJubyA9PSBFTk9FTlQgfHwKKyAgICAgICAgIGVycm5vID09IEVCQURGKSkgLyogVVRGLTggZGVjb2RlIHN1Y2NlZWRlZCwgYnV0IG5vIGZpbGUsIGZpbGVuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGNvdWxkIHN0aWxsIGhhdmUgYmVlbiBsb2NhbGUtaXplZC4uLiAqLworICAgICAgcmV0dXJuIGZvcGVuKGZpbGVuYW1lLCBtb2RlKTsKKyAgfSBlbHNlIGlmIChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9OT19VTklDT0RFX1RSQU5TTEFUSU9OKSB7CisgICAgcmV0dXJuIGZvcGVuKGZpbGVuYW1lLCBtb2RlKTsKKyAgfQorI2Vsc2UKKyAgcmV0dXJuIGZvcGVuKGZpbGVuYW1lLCBtb2RlKTsKKyNlbmRpZgorfQorCitCSU8gKkJJT19uZXdfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqbW9kZSkgeworICBCSU8gKnJldDsKKyAgRklMRSAqZmlsZTsKKworICBmaWxlID0gb3Blbl9maWxlKGZpbGVuYW1lLCBtb2RlKTsKKyAgaWYgKGZpbGUgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX1NZU1RFTV9FUlJPUihmb3Blbik7CisKKyAgICBFUlJfYWRkX2Vycm9yX2RhdGEoNSwgImZvcGVuKCciLCBmaWxlbmFtZSwgIicsJyIsIG1vZGUsICInKSIpOworICAgIGlmIChlcnJubyA9PSBFTk9FTlQpIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX25ld19maWxlLCBCSU9fUl9OT19TVUNIX0ZJTEUpOworICAgIH0gZWxzZSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19uZXdfZmlsZSwgQklPX1JfU1lTX0xJQik7CisgICAgfQorICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0ID0gQklPX25ldyhCSU9fc19maWxlKCkpOworICBpZiAocmV0ID09IE5VTEwpIHsKKyAgICBmY2xvc2UoZmlsZSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBCSU9fc2V0X2ZwKHJldCwgZmlsZSwgQklPX0NMT1NFKTsKKyAgcmV0dXJuIHJldDsKK30KKworQklPICpCSU9fbmV3X2ZwKEZJTEUgKnN0cmVhbSwgaW50IGNsb3NlX2ZsYWcpIHsKKyAgQklPICpyZXQgPSBCSU9fbmV3KEJJT19zX2ZpbGUoKSk7CisKKyAgaWYgKHJldCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBCSU9fc2V0X2ZwKHJldCwgc3RyZWFtLCBjbG9zZV9mbGFnKTsKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmaWxlX25ldyhCSU8gKmJpbykgeyByZXR1cm4gMTsgfQorCitzdGF0aWMgaW50IGZpbGVfZnJlZShCSU8gKmJpbykgeworICBpZiAoYmlvID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmICghYmlvLT5zaHV0ZG93bikgeworICAgIHJldHVybiAxOworICB9CisKKyAgaWYgKGJpby0+aW5pdCAmJiBiaW8tPnB0ciAhPSBOVUxMKSB7CisgICAgZmNsb3NlKGJpby0+cHRyKTsKKyAgICBiaW8tPnB0ciA9IE5VTEw7CisgIH0KKyAgYmlvLT5pbml0ID0gMDsKKworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBmaWxlX3JlYWQoQklPICpiLCBjaGFyICpvdXQsIGludCBvdXRsKSB7CisgIGludCByZXQgPSAwOworCisgIGlmICghYi0+aW5pdCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgcmV0ID0gZnJlYWQob3V0LCAxLCBvdXRsLCAoRklMRSAqKWItPnB0cik7CisgIGlmIChyZXQgPT0gMCAmJiBmZXJyb3IoKEZJTEUgKiliLT5wdHIpKSB7CisgICAgT1BFTlNTTF9QVVRfU1lTVEVNX0VSUk9SKGZyZWFkKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIGZpbGVfcmVhZCwgRVJSX1JfU1lTX0xJQik7CisgICAgcmV0ID0gLTE7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZpbGVfd3JpdGUoQklPICpiLCBjb25zdCBjaGFyICppbiwgaW50IGlubCkgeworICBpbnQgcmV0ID0gMDsKKworICBpZiAoIWItPmluaXQpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldCA9IGZ3cml0ZShpbiwgaW5sLCAxLCAoRklMRSAqKWItPnB0cik7CisgIGlmIChyZXQgPiAwKSB7CisgICAgcmV0ID0gaW5sOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBsb25nIGZpbGVfY3RybChCSU8gKmIsIGludCBjbWQsIGxvbmcgbnVtLCB2b2lkICpwdHIpIHsKKyAgbG9uZyByZXQgPSAxOworICBGSUxFICpmcCA9IChGSUxFICopYi0+cHRyOworICBGSUxFICoqZnBwOworICBjaGFyIHBbNF07CisKKyAgc3dpdGNoIChjbWQpIHsKKyAgICBjYXNlIEJJT19DVFJMX1JFU0VUOgorICAgICAgbnVtID0gMDsKKyAgICBjYXNlIEJJT19DX0ZJTEVfU0VFSzoKKyAgICAgIHJldCA9IChsb25nKWZzZWVrKGZwLCBudW0sIDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCSU9fQ1RSTF9FT0Y6CisgICAgICByZXQgPSAobG9uZylmZW9mKGZwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQklPX0NfRklMRV9URUxMOgorICAgIGNhc2UgQklPX0NUUkxfSU5GTzoKKyAgICAgIHJldCA9IGZ0ZWxsKGZwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQklPX0NfU0VUX0ZJTEVfUFRSOgorICAgICAgZmlsZV9mcmVlKGIpOworICAgICAgYi0+c2h1dGRvd24gPSAoaW50KW51bSAmIEJJT19DTE9TRTsKKyAgICAgIGItPnB0ciA9IHB0cjsKKyAgICAgIGItPmluaXQgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCSU9fQ19TRVRfRklMRU5BTUU6CisgICAgICBmaWxlX2ZyZWUoYik7CisgICAgICBiLT5zaHV0ZG93biA9IChpbnQpbnVtICYgQklPX0NMT1NFOworICAgICAgaWYgKG51bSAmIEJJT19GUF9BUFBFTkQpIHsKKyAgICAgICAgaWYgKG51bSAmIEJJT19GUF9SRUFEKSB7CisgICAgICAgICAgQlVGX3N0cmxjcHkocCwgImErIiwgc2l6ZW9mKHApKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBCVUZfc3RybGNweShwLCAiYSIsIHNpemVvZihwKSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoKG51bSAmIEJJT19GUF9SRUFEKSAmJiAobnVtICYgQklPX0ZQX1dSSVRFKSkgeworICAgICAgICBCVUZfc3RybGNweShwLCAicisiLCBzaXplb2YocCkpOworICAgICAgfSBlbHNlIGlmIChudW0gJiBCSU9fRlBfV1JJVEUpIHsKKyAgICAgICAgQlVGX3N0cmxjcHkocCwgInciLCBzaXplb2YocCkpOworICAgICAgfSBlbHNlIGlmIChudW0gJiBCSU9fRlBfUkVBRCkgeworICAgICAgICBCVUZfc3RybGNweShwLCAiciIsIHNpemVvZihwKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIGZpbGVfY3RybCwgQklPX1JfQkFEX0ZPUEVOX01PREUpOworICAgICAgICByZXQgPSAwOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGZwID0gb3Blbl9maWxlKHB0ciwgcCk7CisgICAgICBpZiAoZnAgPT0gTlVMTCkgeworICAgICAgICBPUEVOU1NMX1BVVF9TWVNURU1fRVJST1IoZm9wZW4pOworICAgICAgICBFUlJfYWRkX2Vycm9yX2RhdGEoNSwgImZvcGVuKCciLCBwdHIsICInLCciLCBwLCAiJykiKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBmaWxlX2N0cmwsIEVSUl9SX1NZU19MSUIpOworICAgICAgICByZXQgPSAwOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGItPnB0ciA9IGZwOworICAgICAgYi0+aW5pdCA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJJT19DX0dFVF9GSUxFX1BUUjoKKyAgICAgIC8qIHRoZSBwdHIgcGFyYW1ldGVyIGlzIGFjdHVhbGx5IGEgRklMRSAqKiBpbiB0aGlzIGNhc2UuICovCisgICAgICBpZiAocHRyICE9IE5VTEwpIHsKKyAgICAgICAgZnBwID0gKEZJTEUgKiopcHRyOworICAgICAgICAqZnBwID0gKEZJTEUgKiliLT5wdHI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEJJT19DVFJMX0dFVF9DTE9TRToKKyAgICAgIHJldCA9IChsb25nKWItPnNodXRkb3duOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCSU9fQ1RSTF9TRVRfQ0xPU0U6CisgICAgICBiLT5zaHV0ZG93biA9IChpbnQpbnVtOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCSU9fQ1RSTF9GTFVTSDoKKyAgICAgIHJldCA9IDAgPT0gZmZsdXNoKChGSUxFICopYi0+cHRyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQklPX0NUUkxfV1BFTkRJTkc6CisgICAgY2FzZSBCSU9fQ1RSTF9QRU5ESU5HOgorICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSAwOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmaWxlX2dldHMoQklPICpicCwgY2hhciAqYnVmLCBpbnQgc2l6ZSkgeworICBpbnQgcmV0ID0gMDsKKworICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoIWZnZXRzKGJ1Ziwgc2l6ZSwgKEZJTEUgKilicC0+cHRyKSkgeworICAgIGJ1ZlswXSA9IDA7CisgICAgZ290byBlcnI7CisgIH0KKyAgcmV0ID0gc3RybGVuKGJ1Zik7CisKK2VycjoKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmaWxlX3B1dHMoQklPICpicCwgY29uc3QgY2hhciAqc3RyKSB7CisgIHJldHVybiBmaWxlX3dyaXRlKGJwLCBzdHIsIHN0cmxlbihzdHIpKTsKK30KKworc3RhdGljIGNvbnN0IEJJT19NRVRIT0QgbWV0aG9kc19maWxlcCA9IHsKKyAgICBCSU9fVFlQRV9GSUxFLCAiRklMRSBwb2ludGVyIiwgZmlsZV93cml0ZSwgZmlsZV9yZWFkLCBmaWxlX3B1dHMsCisgICAgZmlsZV9nZXRzLCAgICAgZmlsZV9jdHJsLCAgICAgIGZpbGVfbmV3LCAgIGZpbGVfZnJlZSwgTlVMTCwgfTsKKworY29uc3QgQklPX01FVEhPRCAqQklPX3NfZmlsZSh2b2lkKSB7IHJldHVybiAmbWV0aG9kc19maWxlcDsgfQorCisKK2ludCBCSU9fZ2V0X2ZwKEJJTyAqYmlvLCBGSUxFICoqb3V0X2ZpbGUpIHsKKyAgcmV0dXJuIEJJT19jdHJsKGJpbywgQklPX0NfR0VUX0ZJTEVfUFRSLCAwLCAoY2hhciopIG91dF9maWxlKTsKK30KKworaW50IEJJT19zZXRfZnAoQklPICpiaW8sIEZJTEUgKmZpbGUsIGludCBjbG9zZV9mbGFnKSB7CisgIHJldHVybiBCSU9fY3RybChiaW8sIEJJT19DX1NFVF9GSUxFX1BUUiwgY2xvc2VfZmxhZywgKGNoYXIgKikgZmlsZSk7Cit9CisKK2ludCBCSU9fcmVhZF9maWxlbmFtZShCSU8gKmJpbywgY29uc3QgY2hhciAqZmlsZW5hbWUpIHsKKyAgcmV0dXJuIEJJT19jdHJsKGJpbywgQklPX0NfU0VUX0ZJTEVOQU1FLCBCSU9fQ0xPU0UgfCBCSU9fRlBfUkVBRCwKKyAgICAgICAgICAgICAgICAgIChjaGFyICopZmlsZW5hbWUpOworfQorCitpbnQgQklPX3dyaXRlX2ZpbGVuYW1lKEJJTyAqYmlvLCBjb25zdCBjaGFyICpmaWxlbmFtZSkgeworICByZXR1cm4gQklPX2N0cmwoYmlvLCBCSU9fQ19TRVRfRklMRU5BTUUsIEJJT19DTE9TRSB8IEJJT19GUF9XUklURSwKKyAgICAgICAgICAgICAgICAgIChjaGFyICopZmlsZW5hbWUpOworfQorCitpbnQgQklPX2FwcGVuZF9maWxlbmFtZShCSU8gKmJpbywgY29uc3QgY2hhciAqZmlsZW5hbWUpIHsKKyAgcmV0dXJuIEJJT19jdHJsKGJpbywgQklPX0NfU0VUX0ZJTEVOQU1FLCBCSU9fQ0xPU0UgfCBCSU9fRlBfQVBQRU5ELAorICAgICAgICAgICAgICAgICAgKGNoYXIgKilmaWxlbmFtZSk7Cit9CisKK2ludCBCSU9fcndfZmlsZW5hbWUoQklPICpiaW8sIGNvbnN0IGNoYXIgKmZpbGVuYW1lKSB7CisgIHJldHVybiBCSU9fY3RybChiaW8sIEJJT19DX1NFVF9GSUxFTkFNRSwKKyAgICAgICAgICAgICAgICAgIEJJT19DTE9TRSB8IEJJT19GUF9SRUFEIHwgQklPX0ZQX1dSSVRFLCAoY2hhciAqKWZpbGVuYW1lKTsKK30KZGlmZiAtLWdpdCBhL2NyeXB0by9iaW8vaGV4ZHVtcC5jIGIvY3J5cHRvL2Jpby9oZXhkdW1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMxZDNhNAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9iaW8vaGV4ZHVtcC5jCkBAIC0wLDAgKzEsMTkwIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorCisKKy8qIGhleGR1bXBfY3R4IGNvbnRhaW5zIHRoZSBzdGF0ZSBvZiBhIGhleGR1bXAuICovCitzdHJ1Y3QgaGV4ZHVtcF9jdHggeworICBCSU8gKmJpbzsKKyAgY2hhciByaWdodF9jaGFyc1sxOF07IC8qIHRoZSBjb250ZW50cyBvZiB0aGUgcmlnaHQtaGFuZCBzaWRlLCBBU0NJSSBkdW1wLiAqLworICB1bnNpZ25lZCB1c2VkOyAgICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBjdXJyZW50IGxpbmUuICovCisgIHNpemVfdCBuOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYnl0ZXMgdG90YWwuICovCisgIHVuc2lnbmVkIGluZGVudDsKK307CisKK3N0YXRpYyB2b2lkIGhleGJ5dGUoY2hhciAqb3V0LCB1aW50OF90IGIpIHsKKyAgc3RhdGljIGNvbnN0IGNoYXIgaGV4dGFibGVbXSA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKKyAgb3V0WzBdID0gaGV4dGFibGVbYj4+NF07CisgIG91dFsxXSA9IGhleHRhYmxlW2ImMHgwZl07Cit9CisKK3N0YXRpYyBjaGFyIHRvX2NoYXIodWludDhfdCBiKSB7CisgIGlmIChiIDwgMzIgfHwgYiA+IDEyNikgeworICAgICAgICAgIHJldHVybiAnLic7CisgIH0KKyAgcmV0dXJuIGI7Cit9CisKKy8qIGhleGR1bXAgYWRkcyB8bGVufCBieXRlcyBvZiB8ZGF0YXwgdG8gdGhlIGN1cnJlbnQgaGV4IGR1bXAgZGVzY3JpYmVkIGJ5CisgKiB8Y3R4fC4gKi8KK3N0YXRpYyBpbnQgaGV4ZHVtcChzdHJ1Y3QgaGV4ZHVtcF9jdHggKmN0eCwgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGxlbikgeworICBzaXplX3QgaTsKKyAgY2hhciBidWZbMTBdOworICB1bnNpZ25lZCBsOworCisgIC8qIE91dHB1dCBsaW5lcyBsb29rIGxpa2U6CisgICAqIDAwMDAwMDEwICAyZSAyZiAzMCAzMSAzMiAzMyAzNCAzNSAgMzYgMzcgMzggLi4uIDNjIDNkIC8vIHwuLzAxMjM0NTY3ODk6Ozw9fAorICAgKiBeIG9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgXiBleHRyYSBzcGFjZSAgICAgICAgICAgXiBBU0NJSSBvZiBsaW5lCisgICAqLworCisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgIGlmIChjdHgtPnVzZWQgPT0gMCkgeworICAgICAgLyogVGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuICovCisgICAgICBCSU9faW5kZW50KGN0eC0+YmlvLCBjdHgtPmluZGVudCwgVUlOVF9NQVgpOworCisgICAgICBoZXhieXRlKCZidWZbMF0sIGN0eC0+biA+PiAyNCk7CisgICAgICBoZXhieXRlKCZidWZbMl0sIGN0eC0+biA+PiAxNik7CisgICAgICBoZXhieXRlKCZidWZbNF0sIGN0eC0+biA+PiA4KTsKKyAgICAgIGhleGJ5dGUoJmJ1Zls2XSwgY3R4LT5uKTsKKyAgICAgIGJ1Zls4XSA9IGJ1Zls5XSA9ICcgJzsKKyAgICAgIGlmIChCSU9fd3JpdGUoY3R4LT5iaW8sIGJ1ZiwgMTApIDwgMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBoZXhieXRlKGJ1ZiwgZGF0YVtpXSk7CisgICAgYnVmWzJdID0gJyAnOworICAgIGwgPSAzOworICAgIGlmIChjdHgtPnVzZWQgPT0gNykgeworICAgICAgLyogVGhlcmUncyBhbiBhZGRpdGlvbmFsIHNwYWNlIGFmdGVyIHRoZSA4dGggYnl0ZS4gKi8KKyAgICAgIGJ1ZlszXSA9ICcgJzsKKyAgICAgIGwgPSA0OworICAgIH0gZWxzZSBpZiAoY3R4LT51c2VkID09IDE1KSB7CisgICAgICAvKiBBdCB0aGUgZW5kIG9mIHRoZSBsaW5lIHRoZXJlJ3MgYW4gZXh0cmEgc3BhY2UgYW5kIHRoZSBiYXIgZm9yIHRoZQorICAgICAgICogcmlnaHQgY29sdW1uLiAqLworICAgICAgYnVmWzNdID0gJyAnOworICAgICAgYnVmWzRdID0gJ3wnOworICAgICAgbCA9IDU7CisgICAgfQorCisgICAgaWYgKEJJT193cml0ZShjdHgtPmJpbywgYnVmLCBsKSA8IDApIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBjdHgtPnJpZ2h0X2NoYXJzW2N0eC0+dXNlZF0gPSB0b19jaGFyKGRhdGFbaV0pOworICAgIGN0eC0+dXNlZCsrOworICAgIGN0eC0+bisrOworICAgIGlmIChjdHgtPnVzZWQgPT0gMTYpIHsKKyAgICAgIGN0eC0+cmlnaHRfY2hhcnNbMTZdID0gJ3wnOworICAgICAgY3R4LT5yaWdodF9jaGFyc1sxN10gPSAnXG4nOworICAgICAgaWYgKEJJT193cml0ZShjdHgtPmJpbywgY3R4LT5yaWdodF9jaGFycywgc2l6ZW9mKGN0eC0+cmlnaHRfY2hhcnMpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBjdHgtPnVzZWQgPSAwOworICAgIH0KKyAgfQorCisgIHJldHVybiAxOworfQorCisvKiBmaW5pc2ggZmx1c2hlcyBhbnkgYnVmZmVyZWQgZGF0YSBpbiB8Y3R4fC4gKi8KK3N0YXRpYyBpbnQgZmluaXNoKHN0cnVjdCBoZXhkdW1wX2N0eCAqY3R4KSB7CisgIC8qIFNlZSB0aGUgY29tbWVudHMgaW4gfGhleGR1bXB8IGZvciB0aGUgZGV0YWlscyBvZiB0aGlzIGZvcm1hdC4gKi8KKyAgY29uc3QgdW5zaWduZWQgbl9ieXRlcyA9IGN0eC0+dXNlZDsKKyAgdW5zaWduZWQgbDsKKyAgY2hhciBidWZbNV07CisKKyAgaWYgKG5fYnl0ZXMgPT0gMCkgeworICAgIHJldHVybiAxOworICB9CisKKyAgbWVtc2V0KGJ1ZiwgJyAnLCA0KTsKKyAgYnVmWzRdID0gJ3wnOworCisgIGZvciAoOyBjdHgtPnVzZWQgPCAxNjsgY3R4LT51c2VkKyspIHsKKyAgICBsID0gMzsKKyAgICBpZiAoY3R4LT51c2VkID09IDcpIHsKKyAgICAgIGwgPSA0OworICAgIH0gZWxzZSBpZiAoY3R4LT51c2VkID09IDE1KSB7CisgICAgICBsID0gNTsKKyAgICB9CisgICAgaWYgKEJJT193cml0ZShjdHgtPmJpbywgYnVmLCBsKSA8IDApIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIGN0eC0+cmlnaHRfY2hhcnNbbl9ieXRlc10gPSAnfCc7CisgIGN0eC0+cmlnaHRfY2hhcnNbbl9ieXRlcyArIDFdID0gJ1xuJzsKKyAgaWYgKEJJT193cml0ZShjdHgtPmJpbywgY3R4LT5yaWdodF9jaGFycywgbl9ieXRlcyArIDIpIDwgMCkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAxOworfQorCitpbnQgQklPX2hleGR1bXAoQklPICpiaW8sIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBsZW4sIHVuc2lnbmVkIGluZGVudCkgeworICBzdHJ1Y3QgaGV4ZHVtcF9jdHggY3R4OworICBtZW1zZXQoJmN0eCwgMCwgc2l6ZW9mKGN0eCkpOworICBjdHguYmlvID0gYmlvOworICBjdHguaW5kZW50ID0gaW5kZW50OworCisgIGlmICghaGV4ZHVtcCgmY3R4LCBkYXRhLCBsZW4pIHx8ICFmaW5pc2goJmN0eCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2Jpby9pbnRlcm5hbC5oIGIvY3J5cHRvL2Jpby9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0OTg3MDgKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYmlvL2ludGVybmFsLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpZm5kZWYgT1BFTlNTTF9IRUFERVJfQklPX0lOVEVSTkFMX0gKKyNkZWZpbmUgT1BFTlNTTF9IRUFERVJfQklPX0lOVEVSTkFMX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvYmFzZS5oPgorCisjaWYgIWRlZmluZWQoT1BFTlNTTF9XSU5ET1dTKQorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNlbHNlCisjaW5jbHVkZSA8V2luU29jazIuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogQklPX2lwX2FuZF9wb3J0X3RvX3NvY2tldF9hbmRfYWRkciBjcmVhdGVzIGEgc29ja2V0IGFuZCBmaWxscyBpbiB8Km91dF9hZGRyfAorICogd2l0aCB0aGUgY29ycmVjdCB2YWx1ZXMgZm9yIGNvbm5lY3RpbmcgdG8gfGhvc3RuYW1lfCBvbiB8cG9ydF9zdHJ8LiBJdAorICogcmV0dXJucyBvbmUgb24gc3VjY2VzcyBvciB6ZXJvIG9uIGVycm9yLiAqLworaW50IGJpb19pcF9hbmRfcG9ydF90b19zb2NrZXRfYW5kX2FkZHIoaW50ICpvdXRfc29jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICpvdXRfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3RuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcG9ydF9zdHIpOworCisvKiBCSU9fc29ja2V0X25iaW8gc2V0cyB3aGV0aGVyIHxzb2NrfCBpcyBub24tYmxvY2tpbmcuIEl0IHJldHVybnMgb25lIG9uCisgKiBzdWNjZXNzIGFuZCB6ZXJvIG90aGVyd2lzZS4gKi8KK2ludCBiaW9fc29ja2V0X25iaW8oaW50IHNvY2ssIGludCBvbik7CisKKy8qIEJJT19jbGVhcl9zb2NrZXRfZXJyb3IgY2xlYXJzIHRoZSBsYXN0IHN5c3RlbSBzb2NrZXQgZXJyb3IuCisgKgorICogVE9ETyhmb3JrKTogcmVtb3ZlIGFsbCBjYWxsZXJzIG9mIHRoaXMuICovCit2b2lkIGJpb19jbGVhcl9zb2NrZXRfZXJyb3IoKTsKKworLyogQklPX3NvY2tfZXJyb3IgcmV0dXJucyB0aGUgbGFzdCBzb2NrZXQgZXJyb3Igb24gfHNvY2t8LiAqLworaW50IGJpb19zb2NrX2Vycm9yKGludCBzb2NrKTsKKworLyogQklPX2ZkX3Nob3VsZF9yZXRyeSByZXR1cm5zIG5vbi16ZXJvIGlmIHxyZXR1cm5fdmFsdWV8IGluZGljYXRlcyBhbiBlcnJvcgorICogYW5kIHxlcnJub3wgaW5kaWNhdGVzIHRoYXQgaXQncyBub24tZmF0YWwuICovCitpbnQgYmlvX2ZkX3Nob3VsZF9yZXRyeShpbnQgcmV0dXJuX3ZhbHVlKTsKKworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30gIC8qIGV4dGVybiBDICovCisjZW5kaWYKKworI2VuZGlmICAvKiBPUEVOU1NMX0hFQURFUl9CSU9fSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2Jpby9wYWlyLmMgYi9jcnlwdG8vYmlvL3BhaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmNjNmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2Jpby9wYWlyLmMKQEAgLTAsMCArMSw1NDkgQEAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMyBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2J1Zi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKworCitzdHJ1Y3QgYmlvX2Jpb19zdCB7CisgIEJJTyAqcGVlcjsgLyogTlVMTCBpZiBidWYgPT0gTlVMTC4KKyAgICAgICAgICAgICAgKiBJZiBwZWVyICE9IE5VTEwsIHRoZW4gcGVlci0+cHRyIGlzIGFsc28gYSBiaW9fYmlvX3N0LAorICAgICAgICAgICAgICAqIGFuZCBpdHMgInBlZXIiIG1lbWJlciBwb2ludHMgYmFjayB0byB1cy4KKyAgICAgICAgICAgICAgKiBwZWVyICE9IE5VTEwgaWZmIGluaXQgIT0gMCBpbiB0aGUgQklPLiAqLworCisgIC8qIFRoaXMgaXMgZm9yIHdoYXQgd2Ugd3JpdGUgKGkuZS4gcmVhZGluZyB1c2VzIHBlZXIncyBzdHJ1Y3QpOiAqLworICBpbnQgY2xvc2VkOyAgICAvKiB2YWxpZCBpZmYgcGVlciAhPSBOVUxMICovCisgIHNpemVfdCBsZW47ICAgIC8qIHZhbGlkIGlmZiBidWYgIT0gTlVMTDsgMCBpZiBwZWVyID09IE5VTEwgKi8KKyAgc2l6ZV90IG9mZnNldDsgLyogdmFsaWQgaWZmIGJ1ZiAhPSBOVUxMOyAwIGlmIGxlbiA9PSAwICovCisgIHNpemVfdCBzaXplOworICBjaGFyICpidWY7IC8qICJzaXplIiBlbGVtZW50cyAoaWYgIT0gTlVMTCkgKi8KKworICBzaXplX3QgcmVxdWVzdDsgLyogdmFsaWQgaWZmIHBlZXIgIT0gTlVMTDsgMCBpZiBsZW4gIT0gMCwKKyAgICAgICAgICAgICAgICAgICAqIG90aGVyd2lzZSBzZXQgYnkgcGVlciB0byBudW1iZXIgb2YgYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAqIGl0ICh1bnN1Y2Nlc3NmdWxseSkgdHJpZWQgdG8gcmVhZCwKKyAgICAgICAgICAgICAgICAgICAqIG5ldmVyIG1vcmUgdGhhbiBidWZmZXIgc3BhY2UgKHNpemUtbGVuKSB3YXJyYW50cy4gKi8KK307CisKK3N0YXRpYyBpbnQgYmlvX25ldyhCSU8gKmJpbykgeworICBzdHJ1Y3QgYmlvX2Jpb19zdCAqYjsKKworICBiID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mICpiKTsKKyAgaWYgKGIgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgYi0+cGVlciA9IE5VTEw7CisgIGItPnNpemUgPSAxNyAqIDEwMjQ7IC8qIGVub3VnaCBmb3Igb25lIFRMUyByZWNvcmQgKGp1c3QgYSBkZWZhdWx0KSAqLworICBiLT5idWYgPSBOVUxMOworCisgIGJpby0+cHRyID0gYjsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGJpb19kZXN0cm95X3BhaXIoQklPICpiaW8pIHsKKyAgc3RydWN0IGJpb19iaW9fc3QgKmIgPSBiaW8tPnB0cjsKKyAgQklPICpwZWVyX2JpbzsKKyAgc3RydWN0IGJpb19iaW9fc3QgKnBlZXJfYjsKKworICBpZiAoYiA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgcGVlcl9iaW8gPSBiLT5wZWVyOworICBpZiAocGVlcl9iaW8gPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorCisgIHBlZXJfYiA9IHBlZXJfYmlvLT5wdHI7CisKKyAgYXNzZXJ0KHBlZXJfYiAhPSBOVUxMKTsKKyAgYXNzZXJ0KHBlZXJfYi0+cGVlciA9PSBiaW8pOworCisgIHBlZXJfYi0+cGVlciA9IE5VTEw7CisgIHBlZXJfYmlvLT5pbml0ID0gMDsKKyAgYXNzZXJ0KHBlZXJfYi0+YnVmICE9IE5VTEwpOworICBwZWVyX2ItPmxlbiA9IDA7CisgIHBlZXJfYi0+b2Zmc2V0ID0gMDsKKworICBiLT5wZWVyID0gTlVMTDsKKyAgYmlvLT5pbml0ID0gMDsKKyAgYXNzZXJ0KGItPmJ1ZiAhPSBOVUxMKTsKKyAgYi0+bGVuID0gMDsKKyAgYi0+b2Zmc2V0ID0gMDsKK30KKworc3RhdGljIGludCBiaW9fZnJlZShCSU8gKmJpbykgeworICBzdHJ1Y3QgYmlvX2Jpb19zdCAqYjsKKworICBpZiAoYmlvID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBiID0gYmlvLT5wdHI7CisKKyAgYXNzZXJ0KGIgIT0gTlVMTCk7CisKKyAgaWYgKGItPnBlZXIpIHsKKyAgICBiaW9fZGVzdHJveV9wYWlyKGJpbyk7CisgIH0KKworICBpZiAoYi0+YnVmICE9IE5VTEwpIHsKKyAgICBPUEVOU1NMX2ZyZWUoYi0+YnVmKTsKKyAgfQorCisgIE9QRU5TU0xfZnJlZShiKTsKKworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBiaW9fcmVhZChCSU8gKmJpbywgY2hhciAqYnVmLCBpbnQgc2l6ZV8pIHsKKyAgc2l6ZV90IHNpemUgPSBzaXplXzsKKyAgc2l6ZV90IHJlc3Q7CisgIHN0cnVjdCBiaW9fYmlvX3N0ICpiLCAqcGVlcl9iOworCisgIEJJT19jbGVhcl9yZXRyeV9mbGFncyhiaW8pOworCisgIGlmICghYmlvLT5pbml0KSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBiID0gYmlvLT5wdHI7CisgIGFzc2VydChiICE9IE5VTEwpOworICBhc3NlcnQoYi0+cGVlciAhPSBOVUxMKTsKKyAgcGVlcl9iID0gYi0+cGVlci0+cHRyOworICBhc3NlcnQocGVlcl9iICE9IE5VTEwpOworICBhc3NlcnQocGVlcl9iLT5idWYgIT0gTlVMTCk7CisKKyAgcGVlcl9iLT5yZXF1ZXN0ID0gMDsgLyogd2lsbCBiZSBzZXQgaW4gInJldHJ5X3JlYWQiIHNpdHVhdGlvbiAqLworCisgIGlmIChidWYgPT0gTlVMTCB8fCBzaXplID09IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChwZWVyX2ItPmxlbiA9PSAwKSB7CisgICAgaWYgKHBlZXJfYi0+Y2xvc2VkKSB7CisgICAgICByZXR1cm4gMDsgLyogd3JpdGVyIGhhcyBjbG9zZWQsIGFuZCBubyBkYXRhIGlzIGxlZnQgKi8KKyAgICB9IGVsc2UgeworICAgICAgQklPX3NldF9yZXRyeV9yZWFkKGJpbyk7IC8qIGJ1ZmZlciBpcyBlbXB0eSAqLworICAgICAgaWYgKHNpemUgPD0gcGVlcl9iLT5zaXplKSB7CisgICAgICAgIHBlZXJfYi0+cmVxdWVzdCA9IHNpemU7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBkb24ndCBhc2sgZm9yIG1vcmUgdGhhbiB0aGUgcGVlciBjYW4KKyAgICAgICAgICogZGVsaXZlciBpbiBvbmUgd3JpdGUgKi8KKyAgICAgICAgcGVlcl9iLT5yZXF1ZXN0ID0gcGVlcl9iLT5zaXplOworICAgICAgfQorICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorCisgIC8qIHdlIGNhbiByZWFkICovCisgIGlmIChwZWVyX2ItPmxlbiA8IHNpemUpIHsKKyAgICBzaXplID0gcGVlcl9iLT5sZW47CisgIH0KKworICAvKiBub3cgcmVhZCAic2l6ZSIgYnl0ZXMgKi8KKyAgcmVzdCA9IHNpemU7CisKKyAgYXNzZXJ0KHJlc3QgPiAwKTsKKyAgLyogb25lIG9yIHR3byBpdGVyYXRpb25zICovCisgIGRvIHsKKyAgICBzaXplX3QgY2h1bms7CisKKyAgICBhc3NlcnQocmVzdCA8PSBwZWVyX2ItPmxlbik7CisgICAgaWYgKHBlZXJfYi0+b2Zmc2V0ICsgcmVzdCA8PSBwZWVyX2ItPnNpemUpIHsKKyAgICAgIGNodW5rID0gcmVzdDsKKyAgICB9IGVsc2UgeworICAgICAgLyogd3JhcCBhcm91bmQgcmluZyBidWZmZXIgKi8KKyAgICAgIGNodW5rID0gcGVlcl9iLT5zaXplIC0gcGVlcl9iLT5vZmZzZXQ7CisgICAgfQorICAgIGFzc2VydChwZWVyX2ItPm9mZnNldCArIGNodW5rIDw9IHBlZXJfYi0+c2l6ZSk7CisKKyAgICBtZW1jcHkoYnVmLCBwZWVyX2ItPmJ1ZiArIHBlZXJfYi0+b2Zmc2V0LCBjaHVuayk7CisKKyAgICBwZWVyX2ItPmxlbiAtPSBjaHVuazsKKyAgICBpZiAocGVlcl9iLT5sZW4pIHsKKyAgICAgIHBlZXJfYi0+b2Zmc2V0ICs9IGNodW5rOworICAgICAgYXNzZXJ0KHBlZXJfYi0+b2Zmc2V0IDw9IHBlZXJfYi0+c2l6ZSk7CisgICAgICBpZiAocGVlcl9iLT5vZmZzZXQgPT0gcGVlcl9iLT5zaXplKSB7CisgICAgICAgIHBlZXJfYi0+b2Zmc2V0ID0gMDsKKyAgICAgIH0KKyAgICAgIGJ1ZiArPSBjaHVuazsKKyAgICB9IGVsc2UgeworICAgICAgLyogYnVmZmVyIG5vdyBlbXB0eSwgbm8gbmVlZCB0byBhZHZhbmNlICJidWYiICovCisgICAgICBhc3NlcnQoY2h1bmsgPT0gcmVzdCk7CisgICAgICBwZWVyX2ItPm9mZnNldCA9IDA7CisgICAgfQorICAgIHJlc3QgLT0gY2h1bms7CisgIH0gd2hpbGUgKHJlc3QpOworCisgIHJldHVybiBzaXplOworfQorCitzdGF0aWMgaW50IGJpb193cml0ZShCSU8gKmJpbywgY29uc3QgY2hhciAqYnVmLCBpbnQgbnVtXykgeworICBzaXplX3QgbnVtID0gbnVtXzsKKyAgc2l6ZV90IHJlc3Q7CisgIHN0cnVjdCBiaW9fYmlvX3N0ICpiOworCisgIEJJT19jbGVhcl9yZXRyeV9mbGFncyhiaW8pOworCisgIGlmICghYmlvLT5pbml0IHx8IGJ1ZiA9PSBOVUxMIHx8IG51bSA9PSAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBiID0gYmlvLT5wdHI7CisgIGFzc2VydChiICE9IE5VTEwpOworICBhc3NlcnQoYi0+cGVlciAhPSBOVUxMKTsKKyAgYXNzZXJ0KGItPmJ1ZiAhPSBOVUxMKTsKKworICBiLT5yZXF1ZXN0ID0gMDsKKyAgaWYgKGItPmNsb3NlZCkgeworICAgIC8qIHdlIGFscmVhZHkgY2xvc2VkICovCisgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBiaW9fd3JpdGUsIEJJT19SX0JST0tFTl9QSVBFKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBhc3NlcnQoYi0+bGVuIDw9IGItPnNpemUpOworCisgIGlmIChiLT5sZW4gPT0gYi0+c2l6ZSkgeworICAgIEJJT19zZXRfcmV0cnlfd3JpdGUoYmlvKTsgLyogYnVmZmVyIGlzIGZ1bGwgKi8KKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvKiB3ZSBjYW4gd3JpdGUgKi8KKyAgaWYgKG51bSA+IGItPnNpemUgLSBiLT5sZW4pIHsKKyAgICBudW0gPSBiLT5zaXplIC0gYi0+bGVuOworICB9CisKKyAgLyogbm93IHdyaXRlICJudW0iIGJ5dGVzICovCisgIHJlc3QgPSBudW07CisKKyAgYXNzZXJ0KHJlc3QgPiAwKTsKKyAgLyogb25lIG9yIHR3byBpdGVyYXRpb25zICovCisgIGRvIHsKKyAgICBzaXplX3Qgd3JpdGVfb2Zmc2V0OworICAgIHNpemVfdCBjaHVuazsKKworICAgIGFzc2VydChiLT5sZW4gKyByZXN0IDw9IGItPnNpemUpOworCisgICAgd3JpdGVfb2Zmc2V0ID0gYi0+b2Zmc2V0ICsgYi0+bGVuOworICAgIGlmICh3cml0ZV9vZmZzZXQgPj0gYi0+c2l6ZSkgeworICAgICAgd3JpdGVfb2Zmc2V0IC09IGItPnNpemU7CisgICAgfQorICAgIC8qIGItPmJ1Zlt3cml0ZV9vZmZzZXRdIGlzIHRoZSBmaXJzdCBieXRlIHdlIGNhbiB3cml0ZSB0by4gKi8KKworICAgIGlmICh3cml0ZV9vZmZzZXQgKyByZXN0IDw9IGItPnNpemUpIHsKKyAgICAgIGNodW5rID0gcmVzdDsKKyAgICB9IGVsc2UgeworICAgICAgLyogd3JhcCBhcm91bmQgcmluZyBidWZmZXIgKi8KKyAgICAgIGNodW5rID0gYi0+c2l6ZSAtIHdyaXRlX29mZnNldDsKKyAgICB9CisKKyAgICBtZW1jcHkoYi0+YnVmICsgd3JpdGVfb2Zmc2V0LCBidWYsIGNodW5rKTsKKworICAgIGItPmxlbiArPSBjaHVuazsKKworICAgIGFzc2VydChiLT5sZW4gPD0gYi0+c2l6ZSk7CisKKyAgICByZXN0IC09IGNodW5rOworICAgIGJ1ZiArPSBjaHVuazsKKyAgfSB3aGlsZSAocmVzdCk7CisKKyAgcmV0dXJuIG51bTsKK30KKworc3RhdGljIGludCBiaW9fbWFrZV9wYWlyKEJJTyAqYmlvMSwgQklPICpiaW8yKSB7CisgIHN0cnVjdCBiaW9fYmlvX3N0ICpiMSwgKmIyOworCisgIGFzc2VydChiaW8xICE9IE5VTEwpOworICBhc3NlcnQoYmlvMiAhPSBOVUxMKTsKKworICBiMSA9IGJpbzEtPnB0cjsKKyAgYjIgPSBiaW8yLT5wdHI7CisKKyAgaWYgKGIxLT5wZWVyICE9IE5VTEwgfHwgYjItPnBlZXIgIT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgYmlvX21ha2VfcGFpciwgQklPX1JfSU5fVVNFKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChiMS0+YnVmID09IE5VTEwpIHsKKyAgICBiMS0+YnVmID0gT1BFTlNTTF9tYWxsb2MoYjEtPnNpemUpOworICAgIGlmIChiMS0+YnVmID09IE5VTEwpIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgYmlvX21ha2VfcGFpciwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGIxLT5sZW4gPSAwOworICAgIGIxLT5vZmZzZXQgPSAwOworICB9CisKKyAgaWYgKGIyLT5idWYgPT0gTlVMTCkgeworICAgIGIyLT5idWYgPSBPUEVOU1NMX21hbGxvYyhiMi0+c2l6ZSk7CisgICAgaWYgKGIyLT5idWYgPT0gTlVMTCkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBiaW9fbWFrZV9wYWlyLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYjItPmxlbiA9IDA7CisgICAgYjItPm9mZnNldCA9IDA7CisgIH0KKworICBiMS0+cGVlciA9IGJpbzI7CisgIGIxLT5jbG9zZWQgPSAwOworICBiMS0+cmVxdWVzdCA9IDA7CisgIGIyLT5wZWVyID0gYmlvMTsKKyAgYjItPmNsb3NlZCA9IDA7CisgIGIyLT5yZXF1ZXN0ID0gMDsKKworICBiaW8xLT5pbml0ID0gMTsKKyAgYmlvMi0+aW5pdCA9IDE7CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBsb25nIGJpb19jdHJsKEJJTyAqYmlvLCBpbnQgY21kLCBsb25nIG51bSwgdm9pZCAqcHRyKSB7CisgIGxvbmcgcmV0OworICBzdHJ1Y3QgYmlvX2Jpb19zdCAqYiA9IGJpby0+cHRyOworCisgIGFzc2VydChiICE9IE5VTEwpOworCisgIHN3aXRjaCAoY21kKSB7CisgICAgLyogc3BlY2lmaWMgQ1RSTCBjb2RlcyAqLworCisgICAgY2FzZSBCSU9fQ19TRVRfQlVGRl9TSVpFOgorICAgICAgaWYgKGItPnBlZXIpIHsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBiaW9fY3RybCwgQklPX1JfSU5fVVNFKTsKKyAgICAgICAgcmV0ID0gMDsKKyAgICAgIH0gZWxzZSBpZiAobnVtID09IDApIHsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBiaW9fY3RybCwgQklPX1JfSU5WQUxJRF9BUkdVTUVOVCk7CisgICAgICAgIHJldCA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBzaXplX3QgbmV3X3NpemUgPSBudW07CisKKyAgICAgICAgaWYgKGItPnNpemUgIT0gbmV3X3NpemUpIHsKKyAgICAgICAgICBpZiAoYi0+YnVmKSB7CisgICAgICAgICAgICBPUEVOU1NMX2ZyZWUoYi0+YnVmKTsKKyAgICAgICAgICAgIGItPmJ1ZiA9IE5VTEw7CisgICAgICAgICAgfQorICAgICAgICAgIGItPnNpemUgPSBuZXdfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICByZXQgPSAxOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEJJT19DX0dFVF9XUklURV9CVUZfU0laRToKKyAgICAgIHJldCA9IChsb25nKWItPnNpemU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQklPX0NfR0VUX1dSSVRFX0dVQVJBTlRFRToKKyAgICAgIC8qIEhvdyBtYW55IGJ5dGVzIGNhbiB0aGUgY2FsbGVyIGZlZWQgdG8gdGhlIG5leHQgd3JpdGUKKyAgICAgICAqIHdpdGhvdXQgaGF2aW5nIHRvIGtlZXAgYW55PyAqLworICAgICAgaWYgKGItPnBlZXIgPT0gTlVMTCB8fCBiLT5jbG9zZWQpIHsKKyAgICAgICAgcmV0ID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IChsb25nKWItPnNpemUgLSBiLT5sZW47CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgQklPX0NfR0VUX1JFQURfUkVRVUVTVDoKKyAgICAgIC8qIElmIHRoZSBwZWVyIHVuc3VjY2Vzc2Z1bGx5IHRyaWVkIHRvIHJlYWQsIGhvdyBtYW55IGJ5dGVzCisgICAgICAgKiB3ZXJlIHJlcXVlc3RlZD8gIChBcyB3aXRoIEJJT19DVFJMX1BFTkRJTkcsIHRoYXQgbnVtYmVyCisgICAgICAgKiBjYW4gdXN1YWxseSBiZSB0cmVhdGVkIGFzIGJvb2xlYW4uKSAqLworICAgICAgcmV0ID0gKGxvbmcpYi0+cmVxdWVzdDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCSU9fQ19SRVNFVF9SRUFEX1JFUVVFU1Q6CisgICAgICAvKiBSZXNldCByZXF1ZXN0LiAgKENhbiBiZSB1c2VmdWwgYWZ0ZXIgcmVhZCBhdHRlbXB0cworICAgICAgICogYXQgdGhlIG90aGVyIHNpZGUgdGhhdCBhcmUgbWVhbnQgdG8gYmUgbm9uLWJsb2NraW5nLAorICAgICAgICogZS5nLiB3aGVuIHByb2JpbmcgU1NMX3JlYWQgdG8gc2VlIGlmIGFueSBkYXRhIGlzCisgICAgICAgKiBhdmFpbGFibGUuKSAqLworICAgICAgYi0+cmVxdWVzdCA9IDA7CisgICAgICByZXQgPSAxOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEJJT19DX1NIVVRET1dOX1dSOgorICAgICAgLyogc2ltaWxhciB0byBzaHV0ZG93biguLi4sIFNIVVRfV1IpICovCisgICAgICBiLT5jbG9zZWQgPSAxOworICAgICAgcmV0ID0gMTsKKyAgICAgIGJyZWFrOworCisgICAgLyogc3RhbmRhcmQgQ1RSTCBjb2RlcyBmb2xsb3cgKi8KKworICAgIGNhc2UgQklPX0NUUkxfUkVTRVQ6CisgICAgICBpZiAoYi0+YnVmICE9IE5VTEwpIHsKKyAgICAgICAgYi0+bGVuID0gMDsKKyAgICAgICAgYi0+b2Zmc2V0ID0gMDsKKyAgICAgIH0KKyAgICAgIHJldCA9IDA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQklPX0NUUkxfR0VUX0NMT1NFOgorICAgICAgcmV0ID0gYmlvLT5zaHV0ZG93bjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCSU9fQ1RSTF9TRVRfQ0xPU0U6CisgICAgICBiaW8tPnNodXRkb3duID0gKGludCludW07CisgICAgICByZXQgPSAxOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEJJT19DVFJMX1BFTkRJTkc6CisgICAgICBpZiAoYi0+cGVlciAhPSBOVUxMKSB7CisgICAgICAgIHN0cnVjdCBiaW9fYmlvX3N0ICpwZWVyX2IgPSBiLT5wZWVyLT5wdHI7CisgICAgICAgIHJldCA9IChsb25nKXBlZXJfYi0+bGVuOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCSU9fQ1RSTF9XUEVORElORzoKKyAgICAgIHJldCA9IDA7CisgICAgICBpZiAoYi0+YnVmICE9IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gKGxvbmcpYi0+bGVuOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEJJT19DVFJMX0ZMVVNIOgorICAgICAgcmV0ID0gMTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCSU9fQ1RSTF9FT0Y6IHsKKyAgICAgIEJJTyAqb3RoZXJfYmlvID0gcHRyOworCisgICAgICBpZiAob3RoZXJfYmlvKSB7CisgICAgICAgIHN0cnVjdCBiaW9fYmlvX3N0ICpvdGhlcl9iID0gb3RoZXJfYmlvLT5wdHI7CisgICAgICAgIGFzc2VydChvdGhlcl9iICE9IE5VTEwpOworICAgICAgICByZXQgPSBvdGhlcl9iLT5sZW4gPT0gMCAmJiBvdGhlcl9iLT5jbG9zZWQ7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXQgPSAxOworICAgICAgfQorICAgIH0gYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gMDsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGJpb19wdXRzKEJJTyAqYmlvLCBjb25zdCBjaGFyICpzdHIpIHsKKyAgcmV0dXJuIGJpb193cml0ZShiaW8sIHN0ciwgc3RybGVuKHN0cikpOworfQorCitpbnQgQklPX25ld19iaW9fcGFpcihCSU8gKipiaW8xX3AsIHNpemVfdCB3cml0ZWJ1ZjEsIEJJTyAqKmJpbzJfcCwKKyAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB3cml0ZWJ1ZjIpIHsKKyAgQklPICpiaW8xID0gTlVMTCwgKmJpbzIgPSBOVUxMOworICBsb25nIHI7CisgIGludCByZXQgPSAwOworCisgIGJpbzEgPSBCSU9fbmV3KEJJT19zX2JpbygpKTsKKyAgaWYgKGJpbzEgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisgIGJpbzIgPSBCSU9fbmV3KEJJT19zX2JpbygpKTsKKyAgaWYgKGJpbzIgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKHdyaXRlYnVmMSkgeworICAgIHIgPSBCSU9fc2V0X3dyaXRlX2J1ZmZlcl9zaXplKGJpbzEsIHdyaXRlYnVmMSk7CisgICAgaWYgKCFyKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0KKyAgaWYgKHdyaXRlYnVmMikgeworICAgIHIgPSBCSU9fc2V0X3dyaXRlX2J1ZmZlcl9zaXplKGJpbzIsIHdyaXRlYnVmMik7CisgICAgaWYgKCFyKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0KKworICBpZiAoIWJpb19tYWtlX3BhaXIoYmlvMSwgYmlvMikpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorICByZXQgPSAxOworCitlcnI6CisgIGlmIChyZXQgPT0gMCkgeworICAgIGlmIChiaW8xKSB7CisgICAgICBCSU9fZnJlZShiaW8xKTsKKyAgICAgIGJpbzEgPSBOVUxMOworICAgIH0KKyAgICBpZiAoYmlvMikgeworICAgICAgQklPX2ZyZWUoYmlvMik7CisgICAgICBiaW8yID0gTlVMTDsKKyAgICB9CisgIH0KKworICAqYmlvMV9wID0gYmlvMTsKKyAgKmJpbzJfcCA9IGJpbzI7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBCSU9fTUVUSE9EIG1ldGhvZHNfYmlvcCA9IHsKKyAgICBCSU9fVFlQRV9CSU8sICJCSU8gcGFpciIsICAgICAgICAgICAgIGJpb193cml0ZSwgYmlvX3JlYWQsCisgICAgYmlvX3B1dHMsICAgICBOVUxMIC8qIG5vIGJpb19nZXRzICovLCBiaW9fY3RybCwgIGJpb19uZXcsCisgICAgYmlvX2ZyZWUsICAgICBOVUxMIC8qIG5vIGJpb19jYWxsYmFja19jdHJsICovCit9OworCitjb25zdCBCSU9fTUVUSE9EICpCSU9fc19iaW8odm9pZCkgeyByZXR1cm4gJm1ldGhvZHNfYmlvcDsgfQorCitzaXplX3QgQklPX2N0cmxfZ2V0X3JlYWRfcmVxdWVzdChCSU8gKmJpbykgeworICByZXR1cm4gQklPX2N0cmwoYmlvLCBCSU9fQ19HRVRfUkVBRF9SRVFVRVNULCAwLCBOVUxMKTsKK30KKworc2l6ZV90IEJJT19jdHJsX2dldF93cml0ZV9ndWFyYW50ZWUoQklPICpiaW8pIHsKKyAgcmV0dXJuIEJJT19jdHJsKGJpbywgQklPX0NfR0VUX1dSSVRFX0dVQVJBTlRFRSwgMCwgTlVMTCk7Cit9CisKK2ludCBCSU9fc2h1dGRvd25fd3IoQklPICpiaW8pIHsKKyAgcmV0dXJuIEJJT19jdHJsKGJpbywgQklPX0NfU0hVVERPV05fV1IsIDAsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2Jpby9wcmludGYuYyBiL2NyeXB0by9iaW8vcHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUxM2ZmMwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9iaW8vcHJpbnRmLmMKQEAgLTAsMCArMSwxMTAgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNkZWZpbmUgX0JTRF9TT1VSQ0UgIC8qIGZvciBzbnByaW50ZiwgdnByaW50ZiBldGMgKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKworCitpbnQgQklPX3ByaW50ZihCSU8gKmJpbywgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pIHsKKyAgdmFfbGlzdCBhcmdzOworICBpbnQgcmV0OworCisgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisKKyAgcmV0ID0gQklPX3ZwcmludGYoYmlvLCBmb3JtYXQsIGFyZ3MpOworCisgIHZhX2VuZChhcmdzKTsKKyAgcmV0dXJuIHJldDsKK30KKworaW50IEJJT192cHJpbnRmKEJJTyAqYmlvLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykgeworICBjaGFyIGJ1ZlsyNTZdLCAqb3V0LCBvdXRfbWFsbG9jZWQgPSAwOworICBpbnQgb3V0X2xlbiwgcmV0OworCisgIC8qIE5vdGU6IHRoaXMgaXMgYXNzdW1pbmcgdGhhdCB2YV9saXN0IGlzIG9rIHRvIGNvcHkgYXMgUE9ELiBJZiB0aGUgc3lzdGVtCisgICAqIGRlZmluZXMgaXQgd2l0aCBhIHBvaW50ZXIgdG8gbXV0YWJsZSBzdGF0ZSB0aGVuIHBhc3NpbmcgaXQgdHdpY2UgdG8KKyAgICogdnNucHJpbnRmIHdpbGwgbm90IHdvcmsuICovCisgIG91dF9sZW4gPSB2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm9ybWF0LCBhcmdzKTsKKyAgaWYgKG91dF9sZW4gPj0gc2l6ZW9mKGJ1ZikpIHsKKyAgICBjb25zdCBpbnQgcmVxdWVzdGVkX2xlbiA9IG91dF9sZW47CisgICAgLyogVGhlIG91dHB1dCB3YXMgdHJ1bmNhdGVkLiAqLworICAgIG91dCA9IE9QRU5TU0xfbWFsbG9jKHJlcXVlc3RlZF9sZW4pOworICAgIG91dF9tYWxsb2NlZCA9IDE7CisgICAgaWYgKG91dCA9PSBOVUxMKSB7CisgICAgICAvKiBVbmNsZWFyIHdoYXQgY2FuIGJlIGRvbmUgaW4gdGhpcyBzaXR1YXRpb24uIE9wZW5TU0wgaGFzIGhpc3RvcmljYWxseQorICAgICAgICogY3Jhc2hlZCBhbmQgdGhhdCBzZWVtcyBiZXR0ZXIgdGhhbiBwcm9kdWNpbmcgdGhlIHdyb25nIG91dHB1dC4gKi8KKyAgICAgIGFib3J0KCk7CisgICAgfQorICAgIG91dF9sZW4gPSB2c25wcmludGYob3V0LCByZXF1ZXN0ZWRfbGVuLCBmb3JtYXQsIGFyZ3MpOworICAgIGFzc2VydChvdXRfbGVuID09IHJlcXVlc3RlZF9sZW4pOworICB9IGVsc2UgeworICAgIG91dCA9IGJ1ZjsKKyAgfQorCisgIHJldCA9IEJJT193cml0ZShiaW8sIG91dCwgb3V0X2xlbik7CisgIGlmIChvdXRfbWFsbG9jZWQpIHsKKyAgICBPUEVOU1NMX2ZyZWUob3V0KTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vYmlvL3NvY2tldC5jIGIvY3J5cHRvL2Jpby9zb2NrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2RkNTEyCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2Jpby9zb2NrZXQuYwpAQCAtMCwwICsxLDE4MCBAQAorLyogY3J5cHRvL2Jpby9ic3Nfc29jay5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKworI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpZiAhZGVmaW5lZChPUEVOU1NMX1dJTkRPV1MpCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImludGVybmFsLmgiCisKKworc3RhdGljIGludCBzb2NrX25ldyhCSU8gKmJpbykgeworICBiaW8tPmluaXQgPSAwOworICBiaW8tPm51bSA9IDA7CisgIGJpby0+cHRyID0gTlVMTDsKKyAgYmlvLT5mbGFncyA9IDA7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHNvY2tfZnJlZShCSU8gKmJpbykgeworICBpZiAoYmlvID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChiaW8tPnNodXRkb3duKSB7CisgICAgaWYgKGJpby0+aW5pdCkgeworICAgICAgY2xvc2UoYmlvLT5udW0pOworICAgIH0KKyAgICBiaW8tPmluaXQgPSAwOworICAgIGJpby0+ZmxhZ3MgPSAwOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHNvY2tfcmVhZChCSU8gKmIsIGNoYXIgKm91dCwgaW50IG91dGwpIHsKKyAgaW50IHJldCA9IDA7CisKKyAgaWYgKG91dCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBiaW9fY2xlYXJfc29ja2V0X2Vycm9yKCk7CisgIHJldCA9IHJlY3YoYi0+bnVtLCBvdXQsIG91dGwsIDApOworICBCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYik7CisgIGlmIChyZXQgPD0gMCkgeworICAgIGlmIChiaW9fZmRfc2hvdWxkX3JldHJ5KHJldCkpIHsKKyAgICAgIEJJT19zZXRfcmV0cnlfcmVhZChiKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzb2NrX3dyaXRlKEJJTyAqYiwgY29uc3QgY2hhciAqaW4sIGludCBpbmwpIHsKKyAgaW50IHJldDsKKworICBiaW9fY2xlYXJfc29ja2V0X2Vycm9yKCk7CisgIHJldCA9IHNlbmQoYi0+bnVtLCBpbiwgaW5sLCAwKTsKKyAgQklPX2NsZWFyX3JldHJ5X2ZsYWdzKGIpOworICBpZiAocmV0IDw9IDApIHsKKyAgICBpZiAoYmlvX2ZkX3Nob3VsZF9yZXRyeShyZXQpKSB7CisgICAgICBCSU9fc2V0X3JldHJ5X3dyaXRlKGIpOworICAgIH0KKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNvY2tfcHV0cyhCSU8gKmJwLCBjb25zdCBjaGFyICpzdHIpIHsKKyAgcmV0dXJuIHNvY2tfd3JpdGUoYnAsIHN0ciwgc3RybGVuKHN0cikpOworfQorCitzdGF0aWMgbG9uZyBzb2NrX2N0cmwoQklPICpiLCBpbnQgY21kLCBsb25nIG51bSwgdm9pZCAqcHRyKSB7CisgIGxvbmcgcmV0ID0gMTsKKyAgaW50ICppcDsKKworICBzd2l0Y2ggKGNtZCkgeworICAgIGNhc2UgQklPX0NfU0VUX0ZEOgorICAgICAgc29ja19mcmVlKGIpOworICAgICAgYi0+bnVtID0gKigoaW50ICopcHRyKTsKKyAgICAgIGItPnNodXRkb3duID0gKGludCludW07CisgICAgICBiLT5pbml0ID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQklPX0NfR0VUX0ZEOgorICAgICAgaWYgKGItPmluaXQpIHsKKyAgICAgICAgaXAgPSAoaW50ICopcHRyOworICAgICAgICBpZiAoaXAgIT0gTlVMTCkKKyAgICAgICAgICAqaXAgPSBiLT5udW07CisgICAgICAgIHJldCA9IGItPm51bTsKKyAgICAgIH0gZWxzZQorICAgICAgICByZXQgPSAtMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQklPX0NUUkxfR0VUX0NMT1NFOgorICAgICAgcmV0ID0gYi0+c2h1dGRvd247CisgICAgICBicmVhazsKKyAgICBjYXNlIEJJT19DVFJMX1NFVF9DTE9TRToKKyAgICAgIGItPnNodXRkb3duID0gKGludCludW07CisgICAgICBicmVhazsKKyAgICBjYXNlIEJJT19DVFJMX0ZMVVNIOgorICAgICAgcmV0ID0gMTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSAwOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IEJJT19NRVRIT0QgbWV0aG9kc19zb2NrcCA9IHsKKyAgICBCSU9fVFlQRV9TT0NLRVQsICAic29ja2V0IiwgIHNvY2tfd3JpdGUsIHNvY2tfcmVhZCwgc29ja19wdXRzLAorICAgIE5VTEwgLyogZ2V0cywgKi8sIHNvY2tfY3RybCwgc29ja19uZXcsICAgc29ja19mcmVlLCBOVUxMLAorfTsKKworY29uc3QgQklPX01FVEhPRCAqQklPX3Nfc29ja2V0KHZvaWQpIHsgcmV0dXJuICZtZXRob2RzX3NvY2twOyB9CisKK0JJTyAqQklPX25ld19zb2NrZXQoaW50IGZkLCBpbnQgY2xvc2VfZmxhZykgeworICBCSU8gKnJldDsKKworICByZXQgPSBCSU9fbmV3KEJJT19zX3NvY2tldCgpKTsKKyAgaWYgKHJldCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQklPX3NldF9mZChyZXQsIGZkLCBjbG9zZV9mbGFnKTsKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2NyeXB0by9iaW8vc29ja2V0X2hlbHBlci5jIGIvY3J5cHRvL2Jpby9zb2NrZXRfaGVscGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMwNGUxMgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9iaW8vc29ja2V0X2hlbHBlci5jCkBAIC0wLDAgKzEsMTA4IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTQsIEdvb2dsZSBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuICovCisKKyNkZWZpbmUgX1BPU0lYX1NPVVJDRQorCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2lmICFkZWZpbmVkKE9QRU5TU0xfV0lORE9XUykKKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxXaW5Tb2NrMi5oPgorI2luY2x1ZGUgPFdTMnRjcGlwLmg+Cit0eXBlZGVmIGludCBzb2NrbGVuX3Q7CisjZW5kaWYKKworI2luY2x1ZGUgImludGVybmFsLmgiCisKKworaW50IGJpb19pcF9hbmRfcG9ydF90b19zb2NrZXRfYW5kX2FkZHIoaW50ICpvdXRfc29jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICpvdXRfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3RuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcG9ydF9zdHIpIHsKKyAgc3RydWN0IGFkZHJpbmZvIGhpbnQsICpyZXN1bHQsICpjdXI7CisgIGludCByZXQ7CisKKyAgKm91dF9zb2NrID0gLTE7CisKKyAgbWVtc2V0KCZoaW50LCAwLCBzaXplb2YoaGludCkpOworICBoaW50LmFpX2ZhbWlseSA9IEFGX1VOU1BFQzsKKyAgaGludC5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworCisgIHJldCA9IGdldGFkZHJpbmZvKGhvc3RuYW1lLCBwb3J0X3N0ciwgJmhpbnQsICZyZXN1bHQpOworICBpZiAocmV0ICE9IDApIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihTWVMsIGdldGFkZHJpbmZvLCAwKTsKKyAgICBFUlJfYWRkX2Vycm9yX2RhdGEoMiwgZ2FpX3N0cmVycm9yKHJldCkpOworICAgIHJldHVybiAwOworICB9CisKKyAgcmV0ID0gMDsKKworICBmb3IgKGN1ciA9IHJlc3VsdDsgY3VyOyBjdXIgPSBjdXItPmFpX25leHQpIHsKKyAgICBpZiAoY3VyLT5haV9hZGRybGVuID4gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIG1lbXNldChvdXRfYWRkciwgMCwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKSk7CisgICAgbWVtY3B5KG91dF9hZGRyLCBjdXItPmFpX2FkZHIsIGN1ci0+YWlfYWRkcmxlbik7CisKKyAgICAqb3V0X3NvY2sgPSBzb2NrZXQoY3VyLT5haV9mYW1pbHksIGN1ci0+YWlfc29ja3R5cGUsIGN1ci0+YWlfcHJvdG9jb2wpOworICAgIGlmICgqb3V0X3NvY2sgPCAwKSB7CisgICAgICBPUEVOU1NMX1BVVF9TWVNURU1fRVJST1Ioc29ja2V0KTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIHJldCA9IDE7CisgICAgYnJlYWs7CisgIH0KKworb3V0OgorICBmcmVlYWRkcmluZm8ocmVzdWx0KTsKKyAgcmV0dXJuIHJldDsKK30KKworaW50IGJpb19zb2NrZXRfbmJpbyhpbnQgc29jaywgaW50IG9uKSB7CisjaWYgZGVmaW5lZChPUEVOU1NMX1dJTkRPV1MpCisgIHVfbG9uZyBhcmcgPSBvbjsKKworICByZXR1cm4gMCA9PSBpb2N0bHNvY2tldChzb2NrLCBGSU9OQklPLCAmYXJnKTsKKyNlbHNlCisgIGludCBmbGFncyA9IGZjbnRsKHNvY2ssIEZfR0VURkwsIDApOworICBpZiAoZmxhZ3MgPCAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCFvbikgeworICAgIGZsYWdzICY9IH5PX05PTkJMT0NLOworICB9IGVsc2UgeworICAgIGZsYWdzIHw9IE9fTk9OQkxPQ0s7CisgIH0KKyAgcmV0dXJuIGZjbnRsKHNvY2ssIEZfU0VURkwsIGZsYWdzKSA9PSAwOworI2VuZGlmCit9CisKK3ZvaWQgYmlvX2NsZWFyX3NvY2tldF9lcnJvcigpIHt9CisKK2ludCBiaW9fc29ja19lcnJvcihpbnQgc29jaykgeworICBpbnQgZXJyb3I7CisgIHNvY2tsZW5fdCBlcnJvcl9zaXplID0gc2l6ZW9mKGVycm9yKTsKKworICBpZiAoZ2V0c29ja29wdChzb2NrLCBTT0xfU09DS0VULCBTT19FUlJPUiwgKGNoYXIgKikmZXJyb3IsICZlcnJvcl9zaXplKSA8IDApIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gZXJyb3I7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vYm4vQ01ha2VMaXN0cy50eHQgYi9jcnlwdG8vYm4vQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQyZGZjYwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9ibi9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDgxIEBACitpbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKKworaWYgKCR7QVJDSH0gU1RSRVFVQUwgIng4Nl82NCIpCisJc2V0KAorCQlCTl9BUkNIX1NPVVJDRVMKKworCQlhc20veDg2XzY0LWdjYy5jCisJCXg4Nl82NC1tb250LiR7QVNNX0VYVH0KKwkJeDg2XzY0LW1vbnQ1LiR7QVNNX0VYVH0KKwkJbW9kZXhwNTEyLXg4Nl82NC4ke0FTTV9FWFR9CisJCXJzYXoteDg2XzY0LiR7QVNNX0VYVH0KKwkJcnNhei1hdngyLiR7QVNNX0VYVH0KKworCQlyc2F6X2V4cC5jCisJKQorZW5kaWYoKQorCitpZiAoJHtBUkNIfSBTVFJFUVVBTCAieDg2IikKKwlzZXQoCisJCUJOX0FSQ0hfU09VUkNFUworCisJCWJuLTU4Ni4ke0FTTV9FWFR9CisJCWNvLTU4Ni4ke0FTTV9FWFR9CisJCXg4Ni1tb250LiR7QVNNX0VYVH0KKwkJeDg2LiR7QVNNX0VYVH0KKwkpCitlbmRpZigpCisKK2lmICgke0FSQ0h9IFNUUkVRVUFMICJhcm0iKQorCXNldCgKKwkJQk5fQVJDSF9TT1VSQ0VTCisKKwkJYXJtdjQtbW9udC4ke0FTTV9FWFR9CisJKQorZW5kaWYoKQorCithZGRfbGlicmFyeSgKKwlibgorCisJT0JKRUNUCisKKwlibl9lcnJvci5jCisJYWRkLmMKKwlibi5jCisJY21wLmMKKwljb252ZXJ0LmMKKwljdHguYworCWRpdi5jCisJZXhwb25lbnRpYXRpb24uYworCWdlbmVyaWMuYworCWdjZC5jCisJa3JvbmVja2VyLmMKKwltb250Z29tZXJ5LmMKKwltdWwuYworCXByaW1lLmMKKwlyYW5kb20uYworCXNoaWZ0LmMKKwlzcXJ0LmMKKworCSR7Qk5fQVJDSF9TT1VSQ0VTfQorKQorCitwZXJsYXNtKHg4Nl82NC1tb250LiR7QVNNX0VYVH0gYXNtL3g4Nl82NC1tb250LnBsKQorcGVybGFzbSh4ODZfNjQtbW9udDUuJHtBU01fRVhUfSBhc20veDg2XzY0LW1vbnQ1LnBsKQorcGVybGFzbSh4ODZfNjQtZ2YybS4ke0FTTV9FWFR9IGFzbS94ODZfNjQtZ2YybS5wbCkKK3Blcmxhc20obW9kZXhwNTEyLXg4Nl82NC4ke0FTTV9FWFR9IGFzbS9tb2RleHA1MTIteDg2XzY0LnBsKQorcGVybGFzbShyc2F6LXg4Nl82NC4ke0FTTV9FWFR9IGFzbS9yc2F6LXg4Nl82NC5wbCkKK3Blcmxhc20ocnNhei1hdngyLiR7QVNNX0VYVH0gYXNtL3JzYXotYXZ4Mi5wbCkKK3Blcmxhc20oYm4tNTg2LiR7QVNNX0VYVH0gYXNtL2JuLTU4Ni5wbCkKK3Blcmxhc20oY28tNTg2LiR7QVNNX0VYVH0gYXNtL2NvLTU4Ni5wbCkKK3Blcmxhc20oeDg2LW1vbnQuJHtBU01fRVhUfSBhc20veDg2LW1vbnQucGwpCitwZXJsYXNtKHg4Ni4ke0FTTV9FWFR9IGFzbS94ODYucGwpCitwZXJsYXNtKGFybXY0LW1vbnQuJHtBU01fRVhUfSBhc20vYXJtdjQtbW9udC5wbCkKKworYWRkX2V4ZWN1dGFibGUoCisJYm5fdGVzdAorCisJYm5fdGVzdC5jCispCisKK3RhcmdldF9saW5rX2xpYnJhcmllcyhibl90ZXN0IGNyeXB0bykKZGlmZiAtLWdpdCBhL2NyeXB0by9ibi9hZGQuYyBiL2NyeXB0by9ibi9hZGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzZiMmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2JuL2FkZC5jCkBAIC0wLDAgKzEsMzk0IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworCitpbnQgQk5fYWRkKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIpIHsKKyAgY29uc3QgQklHTlVNICp0bXA7CisgIGludCBhX25lZyA9IGEtPm5lZywgcmV0OworCisgIC8qICBhICsgIGIJYStiCisgICAqICBhICsgLWIJYS1iCisgICAqIC1hICsgIGIJYi1hCisgICAqIC1hICsgLWIJLShhK2IpCisgICAqLworICBpZiAoYV9uZWcgXiBiLT5uZWcpIHsKKyAgICAvKiBvbmx5IG9uZSBpcyBuZWdhdGl2ZSAqLworICAgIGlmIChhX25lZykgeworICAgICAgdG1wID0gYTsKKyAgICAgIGEgPSBiOworICAgICAgYiA9IHRtcDsKKyAgICB9CisKKyAgICAvKiB3ZSBhcmUgbm93IGEgLSBiICovCisgICAgaWYgKEJOX3VjbXAoYSwgYikgPCAwKSB7CisgICAgICBpZiAoIUJOX3VzdWIociwgYiwgYSkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICByLT5uZWcgPSAxOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoIUJOX3VzdWIociwgYSwgYikpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICByLT5uZWcgPSAwOworICAgIH0KKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHJldCA9IEJOX3VhZGQociwgYSwgYik7CisgIHItPm5lZyA9IGFfbmVnOworICByZXR1cm4gcmV0OworfQorCitpbnQgQk5fdWFkZChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiKSB7CisgIGludCBtYXgsIG1pbiwgZGlmOworICBCTl9VTE9ORyAqYXAsICpicCwgKnJwLCBjYXJyeSwgdDEsIHQyOworICBjb25zdCBCSUdOVU0gKnRtcDsKKworICBpZiAoYS0+dG9wIDwgYi0+dG9wKSB7CisgICAgdG1wID0gYTsKKyAgICBhID0gYjsKKyAgICBiID0gdG1wOworICB9CisgIG1heCA9IGEtPnRvcDsKKyAgbWluID0gYi0+dG9wOworICBkaWYgPSBtYXggLSBtaW47CisKKyAgaWYgKGJuX3dleHBhbmQociwgbWF4ICsgMSkgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgci0+dG9wID0gbWF4OworCisgIGFwID0gYS0+ZDsKKyAgYnAgPSBiLT5kOworICBycCA9IHItPmQ7CisKKyAgY2FycnkgPSBibl9hZGRfd29yZHMocnAsIGFwLCBicCwgbWluKTsKKyAgcnAgKz0gbWluOworICBhcCArPSBtaW47CisgIGJwICs9IG1pbjsKKworICBpZiAoY2FycnkpIHsKKyAgICB3aGlsZSAoZGlmKSB7CisgICAgICBkaWYtLTsKKyAgICAgIHQxID0gKihhcCsrKTsKKyAgICAgIHQyID0gKHQxICsgMSkgJiBCTl9NQVNLMjsKKyAgICAgICoocnArKykgPSB0MjsKKyAgICAgIGlmICh0MikgeworICAgICAgICBjYXJyeSA9IDA7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAoY2FycnkpIHsKKyAgICAgIC8qIGNhcnJ5ICE9IDAgPT4gZGlmID09IDAgKi8KKyAgICAgICpycCA9IDE7CisgICAgICByLT50b3ArKzsKKyAgICB9CisgIH0KKworICBpZiAoZGlmICYmIHJwICE9IGFwKSB7CisgICAgd2hpbGUgKGRpZi0tKSB7CisgICAgICAvKiBjb3B5IHJlbWFpbmluZyB3b3JkcyBpZiBhcCAhPSBycCAqLworICAgICAgKihycCsrKSA9ICooYXArKyk7CisgICAgfQorICB9CisKKyAgci0+bmVnID0gMDsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBCTl9hZGRfd29yZChCSUdOVU0gKmEsIEJOX1VMT05HIHcpIHsKKyAgQk5fVUxPTkcgbDsKKyAgaW50IGk7CisKKyAgdyAmPSBCTl9NQVNLMjsKKworICAvKiBkZWdlbmVyYXRlIGNhc2U6IHcgaXMgemVybyAqLworICBpZiAoIXcpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIC8qIGRlZ2VuZXJhdGUgY2FzZTogYSBpcyB6ZXJvICovCisgIGlmIChCTl9pc196ZXJvKGEpKSB7CisgICAgcmV0dXJuIEJOX3NldF93b3JkKGEsIHcpOworICB9CisKKyAgLyogaGFuZGxlICdhJyB3aGVuIG5lZ2F0aXZlICovCisgIGlmIChhLT5uZWcpIHsKKyAgICBhLT5uZWcgPSAwOworICAgIGkgPSBCTl9zdWJfd29yZChhLCB3KTsKKyAgICBpZiAoIUJOX2lzX3plcm8oYSkpIHsKKyAgICAgIGEtPm5lZyA9ICEoYS0+bmVnKTsKKyAgICB9CisgICAgcmV0dXJuIGk7CisgIH0KKworICBmb3IgKGkgPSAwOyB3ICE9IDAgJiYgaSA8IGEtPnRvcDsgaSsrKSB7CisgICAgYS0+ZFtpXSA9IGwgPSAoYS0+ZFtpXSArIHcpICYgQk5fTUFTSzI7CisgICAgdyA9ICh3ID4gbCkgPyAxIDogMDsKKyAgfQorCisgIGlmICh3ICYmIGkgPT0gYS0+dG9wKSB7CisgICAgaWYgKGJuX3dleHBhbmQoYSwgYS0+dG9wICsgMSkgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGEtPnRvcCsrOworICAgIGEtPmRbaV0gPSB3OworICB9CisKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBCTl9zdWIoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYikgeworICBpbnQgbWF4OworICBpbnQgYWRkID0gMCwgbmVnID0gMDsKKyAgY29uc3QgQklHTlVNICp0bXA7CisKKyAgLyogIGEgLSAgYglhLWIKKyAgICogIGEgLSAtYglhK2IKKyAgICogLWEgLSAgYgktKGErYikKKyAgICogLWEgLSAtYgliLWEKKyAgICovCisgIGlmIChhLT5uZWcpIHsKKyAgICBpZiAoYi0+bmVnKSB7CisgICAgICB0bXAgPSBhOworICAgICAgYSA9IGI7CisgICAgICBiID0gdG1wOworICAgIH0gZWxzZSB7CisgICAgICBhZGQgPSAxOworICAgICAgbmVnID0gMTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGItPm5lZykgeworICAgICAgYWRkID0gMTsKKyAgICAgIG5lZyA9IDA7CisgICAgfQorICB9CisKKyAgaWYgKGFkZCkgeworICAgIGlmICghQk5fdWFkZChyLCBhLCBiKSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgci0+bmVnID0gbmVnOworICAgIHJldHVybiAxOworICB9CisKKyAgLyogV2UgYXJlIGFjdHVhbGx5IGRvaW5nIGEgLSBiIDotKSAqLworCisgIG1heCA9IChhLT50b3AgPiBiLT50b3ApID8gYS0+dG9wIDogYi0+dG9wOworICBpZiAoYm5fd2V4cGFuZChyLCBtYXgpID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChCTl91Y21wKGEsIGIpIDwgMCkgeworICAgIGlmICghQk5fdXN1YihyLCBiLCBhKSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHItPm5lZyA9IDE7CisgIH0gZWxzZSB7CisgICAgaWYgKCFCTl91c3ViKHIsIGEsIGIpKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgci0+bmVnID0gMDsKKyAgfQorCisgIHJldHVybiAxOworfQorCitpbnQgQk5fdXN1YihCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiKSB7CisgIGludCBtYXgsIG1pbiwgZGlmOworICByZWdpc3RlciBCTl9VTE9ORyB0MSwgdDIsICphcCwgKmJwLCAqcnA7CisgIGludCBpLCBjYXJyeTsKKworICBtYXggPSBhLT50b3A7CisgIG1pbiA9IGItPnRvcDsKKyAgZGlmID0gbWF4IC0gbWluOworCisgIGlmIChkaWYgPCAwKSAvKiBobW0uLi4gc2hvdWxkIG5vdCBiZSBoYXBwZW5pbmcgKi8KKyAgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl91c3ViLCBCTl9SX0FSRzJfTFRfQVJHMyk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoYm5fd2V4cGFuZChyLCBtYXgpID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGFwID0gYS0+ZDsKKyAgYnAgPSBiLT5kOworICBycCA9IHItPmQ7CisKKyAgY2FycnkgPSAwOworICBmb3IgKGkgPSBtaW47IGkgIT0gMDsgaS0tKSB7CisgICAgdDEgPSAqKGFwKyspOworICAgIHQyID0gKihicCsrKTsKKyAgICBpZiAoY2FycnkpIHsKKyAgICAgIGNhcnJ5ID0gKHQxIDw9IHQyKTsKKyAgICAgIHQxID0gKHQxIC0gdDIgLSAxKSAmIEJOX01BU0syOworICAgIH0gZWxzZSB7CisgICAgICBjYXJyeSA9ICh0MSA8IHQyKTsKKyAgICAgIHQxID0gKHQxIC0gdDIpICYgQk5fTUFTSzI7CisgICAgfQorICAgICoocnArKykgPSB0MSAmIEJOX01BU0syOworICB9CisKKyAgaWYgKGNhcnJ5KSAvKiBzdWJ0cmFjdGVkICovCisgIHsKKyAgICBpZiAoIWRpZikgeworICAgICAgLyogZXJyb3I6IGEgPCBiICovCisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB3aGlsZSAoZGlmKSB7CisgICAgICBkaWYtLTsKKyAgICAgIHQxID0gKihhcCsrKTsKKyAgICAgIHQyID0gKHQxIC0gMSkgJiBCTl9NQVNLMjsKKyAgICAgICoocnArKykgPSB0MjsKKyAgICAgIGlmICh0MSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAocnAgIT0gYXApIHsKKyAgICBmb3IgKDs7KSB7CisgICAgICBpZiAoIWRpZi0tKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcnBbMF0gPSBhcFswXTsKKyAgICAgIGlmICghZGlmLS0pIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBycFsxXSA9IGFwWzFdOworICAgICAgaWYgKCFkaWYtLSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHJwWzJdID0gYXBbMl07CisgICAgICBpZiAoIWRpZi0tKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcnBbM10gPSBhcFszXTsKKyAgICAgIHJwICs9IDQ7CisgICAgICBhcCArPSA0OworICAgIH0KKyAgfQorCisgIHItPnRvcCA9IG1heDsKKyAgci0+bmVnID0gMDsKKyAgYm5fY29ycmVjdF90b3Aocik7CisKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBCTl9zdWJfd29yZChCSUdOVU0gKmEsIEJOX1VMT05HIHcpIHsKKyAgaW50IGk7CisKKyAgdyAmPSBCTl9NQVNLMjsKKworICAvKiBkZWdlbmVyYXRlIGNhc2U6IHcgaXMgemVybyAqLworICBpZiAoIXcpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIC8qIGRlZ2VuZXJhdGUgY2FzZTogYSBpcyB6ZXJvICovCisgIGlmIChCTl9pc196ZXJvKGEpKSB7CisgICAgaSA9IEJOX3NldF93b3JkKGEsIHcpOworICAgIGlmIChpICE9IDApIHsKKyAgICAgIEJOX3NldF9uZWdhdGl2ZShhLCAxKTsKKyAgICB9CisgICAgcmV0dXJuIGk7CisgIH0KKworICAvKiBoYW5kbGUgJ2EnIHdoZW4gbmVnYXRpdmUgKi8KKyAgaWYgKGEtPm5lZykgeworICAgIGEtPm5lZyA9IDA7CisgICAgaSA9IEJOX2FkZF93b3JkKGEsIHcpOworICAgIGEtPm5lZyA9IDE7CisgICAgcmV0dXJuIGk7CisgIH0KKworICBpZiAoKGEtPnRvcCA9PSAxKSAmJiAoYS0+ZFswXSA8IHcpKSB7CisgICAgYS0+ZFswXSA9IHcgLSBhLT5kWzBdOworICAgIGEtPm5lZyA9IDE7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpID0gMDsKKyAgZm9yICg7OykgeworICAgIGlmIChhLT5kW2ldID49IHcpIHsKKyAgICAgIGEtPmRbaV0gLT0gdzsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICBhLT5kW2ldID0gKGEtPmRbaV0gLSB3KSAmIEJOX01BU0syOworICAgICAgaSsrOworICAgICAgdyA9IDE7CisgICAgfQorICB9CisKKyAgaWYgKChhLT5kW2ldID09IDApICYmIChpID09IChhLT50b3AgLSAxKSkpIHsKKyAgICBhLT50b3AtLTsKKyAgfQorCisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2JuL2FzbS9hcm12NC1tb250LnBsIGIvY3J5cHRvL2JuL2FzbS9hcm12NC1tb250LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlODFmOWIKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYm4vYXNtL2FybXY0LW1vbnQucGwKQEAgLTAsMCArMSw2NjkgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQG9wZW5zc2wub3JnPiBmb3IgdGhlIE9wZW5TU0wKKyMgcHJvamVjdC4gVGhlIG1vZHVsZSBpcywgaG93ZXZlciwgZHVhbCBsaWNlbnNlZCB1bmRlciBPcGVuU1NMIGFuZAorIyBDUllQVE9HQU1TIGxpY2Vuc2VzIGRlcGVuZGluZyBvbiB3aGVyZSB5b3Ugb2J0YWluIGl0LiBGb3IgZnVydGhlcgorIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyBKYW51YXJ5IDIwMDcuCisKKyMgTW9udGdvbWVyeSBtdWx0aXBsaWNhdGlvbiBmb3IgQVJNdjQuCisjCisjIFBlcmZvcm1hbmNlIGltcHJvdmVtZW50IG5hdHVyYWxseSB2YXJpZXMgYW1vbmcgQ1BVIGltcGxlbWVudGF0aW9ucworIyBhbmQgY29tcGlsZXJzLiBUaGUgY29kZSB3YXMgb2JzZXJ2ZWQgdG8gcHJvdmlkZSArNjUtMzUlIGltcHJvdmVtZW50CisjIFtkZXBlbmRpbmcgb24ga2V5IGxlbmd0aCwgbGVzcyBmb3IgbG9uZ2VyIGtleXNdIG9uIEFSTTkyMFQsIGFuZAorIyArMTE1LTgwJSBvbiBJbnRlbCBJWFA0MjUuIFRoaXMgaXMgY29tcGFyZWQgdG8gcHJlLWJuX211bF9tb250IGNvZGUKKyMgYmFzZSBhbmQgY29tcGlsZXIgZ2VuZXJhdGVkIGNvZGUgd2l0aCBpbi1saW5lZCB1bXVsbCBhbmQgZXZlbiB1bWxhbAorIyBpbnN0cnVjdGlvbnMuIFRoZSBsYXR0ZXIgbWVhbnMgdGhhdCB0aGlzIGNvZGUgZGlkbid0IHJlYWxseSBoYXZlIGFuIAorIyAiYWR2YW50YWdlIiBvZiB1dGlsaXppbmcgc29tZSAic2VjcmV0IiBpbnN0cnVjdGlvbi4KKyMKKyMgVGhlIGNvZGUgaXMgaW50ZXJvcGVyYWJsZSB3aXRoIFRodW1iIElTQSBhbmQgaXMgcmF0aGVyIGNvbXBhY3QsIGxlc3MKKyMgdGhhbiAxLzJLQi4gV2luZG93cyBDRSBwb3J0IHdvdWxkIGJlIHRyaXZpYWwsIGFzIGl0J3MgZXhjbHVzaXZlbHkKKyMgYWJvdXQgZGVjb3JhdGlvbnMsIEFCSSBhbmQgaW5zdHJ1Y3Rpb24gc3ludGF4IGFyZSBpZGVudGljYWwuCisKKyMgTm92ZW1iZXIgMjAxMworIworIyBBZGQgTkVPTiBjb2RlIHBhdGgsIHdoaWNoIGhhbmRsZXMgbGVuZ3RocyBkaXZpc2libGUgYnkgOC4gUlNBL0RTQQorIyBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBvbiBDb3J0ZXgtQTggaXMgfjQ1LTEwMCUgZGVwZW5kaW5nIG9uIGtleQorIyBsZW5ndGgsIG1vcmUgZm9yIGxvbmdlciBrZXlzLiBPbiBDb3J0ZXgtQTE1IHRoZSBzcGFuIGlzIH4xMC0xMDUlLgorIyBPbiBTbmFwZHJhZ29uIFM0IGltcHJvdmVtZW50IHdhcyBtZWFzdXJlZCB0byB2YXJ5IGZyb20gfjcwJSB0bworIyBpbmNyZWRpYmxlIH4zODAlLCB5ZXMsIDQuOHggZmFzdGVyLCBmb3IgUlNBNDA5NiBzaWduLiBCdXQgdGhpcyBpcworIyByYXRoZXIgYmVjYXVzZSBvcmlnaW5hbCBpbnRlZ2VyLW9ubHkgY29kZSBzZWVtcyB0byBwZXJmb3JtCisjIHN1Ym9wdGltYWxseSBvbiBTNC4gU2l0dWF0aW9uIG9uIENvcnRleC1BOSBpcyB1bmZvcnR1bmF0ZWx5CisjIGRpZmZlcmVudC4gSXQncyBiZWluZyBsb29rZWQgaW50bywgYnV0IHRoZSB0cm91YmxlIGlzIHRoYXQKKyMgcGVyZm9ybWFuY2UgZm9yIHZlY3RvcnMgbG9uZ2VyIHRoYW4gMjU2IGJpdHMgaXMgYWN0dWFsbHkgY291cGxlCisjIG9mIHBlcmNlbnQgd29yc2UgdGhhbiBmb3IgaW50ZWdlci1vbmx5IGNvZGUuIFRoZSBjb2RlIGlzIGNob3NlbgorIyBmb3IgZXhlY3V0aW9uIG9uIGFsbCBORU9OLWNhcGFibGUgcHJvY2Vzc29ycywgYmVjYXVzZSBnYWluIG9uCisjIG90aGVycyBvdXR3ZWlnaHMgdGhlIG1hcmdpbmFsIGxvc3Mgb24gQ29ydGV4LUE5LgorCit3aGlsZSAoKCRvdXRwdXQ9c2hpZnQpICYmICgkb3V0cHV0IX4vXlx3W1x3XC1dKlwuXHcrJC8pKSB7fQorb3BlbiBTVERPVVQsIj4kb3V0cHV0IjsKKworJG51bT0icjAiOwkjIHN0YXJ0cyBhcyBudW0gYXJndW1lbnQsIGJ1dCBob2xkcyAmdHBbbnVtLTFdCiskYXA9InIxIjsKKyRicD0icjIiOyAkYmk9InIyIjsgJHJwPSJyMiI7CiskbnA9InIzIjsKKyR0cD0icjQiOworJGFqPSJyNSI7Ciskbmo9InI2IjsKKyR0aj0icjciOworJG4wPSJyOCI7CisjIyMjIyMjIyMjIwkjIHI5IGlzIHJlc2VydmVkIGJ5IEVMRiBhcyBwbGF0Zm9ybSBzcGVjaWZpYywgZS5nLiBUTFMgcG9pbnRlcgorJGFsbz0icjEwIjsJIyBzbCwgZ2NjIHVzZXMgaXQgdG8ga2VlcCBAR09UCiskYWhpPSJyMTEiOwkjIGZwCiskbmxvPSJyMTIiOwkjIGlwCisjIyMjIyMjIyMjIwkjIHIxMyBpcyBzdGFjayBwb2ludGVyCiskbmhpPSJyMTQiOwkjIGxyCisjIyMjIyMjIyMjIwkjIHIxNSBpcyBwcm9ncmFtIGNvdW50ZXIKKworIyMjIyBhcmd1bWVudCBibG9jayBsYXlvdXQgcmVsYXRpdmUgdG8gJnRwW251bS0xXSwgYS5rLmEuICRudW0KKyRfcnA9IiRudW0sIzEyKjQiOworIyBhcCBwZXJtYW5lbnRseSByZXNpZGVzIGluIHIxCiskX2JwPSIkbnVtLCMxMyo0IjsKKyMgbnAgcGVybWFuZW50bHkgcmVzaWRlcyBpbiByMworJF9uMD0iJG51bSwjMTQqNCI7CiskX251bT0iJG51bSwjMTUqNCI7CSRfYnBlbmQ9JF9udW07CisKKyRjb2RlPTw8X19fOworI2luY2x1ZGUgImFybV9hcmNoLmgiCisKKy50ZXh0CisuY29kZQkzMgorCisjaWYgX19BUk1fQVJDSF9fPj03CisuYWxpZ24JNQorLkxPUEVOU1NMX2FybWNhcDoKKy53b3JkCU9QRU5TU0xfYXJtY2FwX1AtYm5fbXVsX21vbnQKKyNlbmRpZgorCisuZ2xvYmFsCWJuX211bF9tb250CisudHlwZQlibl9tdWxfbW9udCwlZnVuY3Rpb24KKworLmFsaWduCTUKK2JuX211bF9tb250OgorCWxkcglpcCxbc3AsIzRdCQlAIGxvYWQgbnVtCisJc3RtZGIJc3AhLHtyMCxyMn0JCUAgc3AgcG9pbnRzIGF0IGFyZ3VtZW50IGJsb2NrCisjaWYgX19BUk1fQVJDSF9fPj03CisJdHN0CWlwLCM3CisJYm5lCS5MaWFsdQorCWFkcglyMCxibl9tdWxfbW9udAorCWxkcglyMiwuTE9QRU5TU0xfYXJtY2FwCisJbGRyCXIwLFtyMCxyMl0KKwl0c3QJcjAsIzEJCQlAIE5FT04gYXZhaWxhYmxlPworCWxkbWlhCXNwLCB7cjAscjJ9CisJYmVxCS5MaWFsdQorCWFkZAlzcCxzcCwjOAorCWIJYm5fbXVsOHhfbW9udF9uZW9uCisuYWxpZ24JNAorLkxpYWx1OgorI2VuZGlmCisJY21wCWlwLCMyCisJbW92CSRudW0saXAJCQlAIGxvYWQgbnVtCisJbW92bHQJcjAsIzAKKwlhZGRsdAlzcCxzcCwjMio0CisJYmx0CS5MYWJydAorCisJc3RtZGIJc3AhLHtyNC1yMTIsbHJ9CQlAIHNhdmUgMTAgcmVnaXN0ZXJzCisKKwltb3YJJG51bSwkbnVtLGxzbCMyCQlAIHJlc2NhbGUgJG51bSBmb3IgYnl0ZSBjb3VudAorCXN1YglzcCxzcCwkbnVtCQlAIGFsbG9jYSg0Km51bSkKKwlzdWIJc3Asc3AsIzQJCUAgK2V4dHJhIGR3b3JkCisJc3ViCSRudW0sJG51bSwjNAkJQCAibnVtPW51bS0xIgorCWFkZAkkdHAsJGJwLCRudW0JCUAgJmJwW251bS0xXQorCisJYWRkCSRudW0sc3AsJG51bQkJQCAkbnVtIHRvIHBvaW50IGF0ICZ0cFtudW0tMV0KKwlsZHIJJG4wLFskX24wXQkJQCAmbjAKKwlsZHIJJGJpLFskYnBdCQlAIGJwWzBdCisJbGRyCSRhaixbJGFwXSwjNAkJQCBhcFswXSxhcCsrCisJbGRyCSRuaixbJG5wXSwjNAkJQCBucFswXSxucCsrCisJbGRyCSRuMCxbJG4wXQkJQCAqbjAKKwlzdHIJJHRwLFskX2JwZW5kXQkJQCBzYXZlICZicFtudW1dCisKKwl1bXVsbAkkYWxvLCRhaGksJGFqLCRiaQlAIGFwWzBdKmJwWzBdCisJc3RyCSRuMCxbJF9uMF0JCUAgc2F2ZSBuMCB2YWx1ZQorCW11bAkkbjAsJGFsbywkbjAJCUAgInRwWzBdIipuMAorCW1vdgkkbmxvLCMwCisJdW1sYWwJJGFsbywkbmxvLCRuaiwkbjAJQCBucFswXSpuMCsidFswXSIKKwltb3YJJHRwLHNwCisKKy5MMXN0OgorCWxkcgkkYWosWyRhcF0sIzQJCUAgYXBbal0sYXArKworCW1vdgkkYWxvLCRhaGkKKwlsZHIJJG5qLFskbnBdLCM0CQlAIG5wW2pdLG5wKysKKwltb3YJJGFoaSwjMAorCXVtbGFsCSRhbG8sJGFoaSwkYWosJGJpCUAgYXBbal0qYnBbMF0KKwltb3YJJG5oaSwjMAorCXVtbGFsCSRubG8sJG5oaSwkbmosJG4wCUAgbnBbal0qbjAKKwlhZGRzCSRubG8sJG5sbywkYWxvCisJc3RyCSRubG8sWyR0cF0sIzQJCUAgdHBbai0xXT0sdHArKworCWFkYwkkbmxvLCRuaGksIzAKKwljbXAJJHRwLCRudW0KKwlibmUJLkwxc3QKKworCWFkZHMJJG5sbywkbmxvLCRhaGkKKwlsZHIJJHRwLFskX2JwXQkJQCByZXN0b3JlIGJwCisJbW92CSRuaGksIzAKKwlsZHIJJG4wLFskX24wXQkJQCByZXN0b3JlIG4wCisJYWRjCSRuaGksJG5oaSwjMAorCXN0cgkkbmxvLFskbnVtXQkJQCB0cFtudW0tMV09CisJc3RyCSRuaGksWyRudW0sIzRdCQlAIHRwW251bV09CisMCisuTG91dGVyOgorCXN1YgkkdGosJG51bSxzcAkJQCAib3JpZ2luYWwiICRudW0tMSB2YWx1ZQorCXN1YgkkYXAsJGFwLCR0agkJQCAicmV3aW5kIiBhcCB0byAmYXBbMV0KKwlsZHIJJGJpLFskdHAsIzRdIQkJQCAqKCsrYnApCisJc3ViCSRucCwkbnAsJHRqCQlAICJyZXdpbmQiIG5wIHRvICZucFsxXQorCWxkcgkkYWosWyRhcCwjLTRdCQlAIGFwWzBdCisJbGRyCSRhbG8sW3NwXQkJQCB0cFswXQorCWxkcgkkbmosWyRucCwjLTRdCQlAIG5wWzBdCisJbGRyCSR0aixbc3AsIzRdCQlAIHRwWzFdCisKKwltb3YJJGFoaSwjMAorCXVtbGFsCSRhbG8sJGFoaSwkYWosJGJpCUAgYXBbMF0qYnBbaV0rdHBbMF0KKwlzdHIJJHRwLFskX2JwXQkJQCBzYXZlIGJwCisJbXVsCSRuMCwkYWxvLCRuMAorCW1vdgkkbmxvLCMwCisJdW1sYWwJJGFsbywkbmxvLCRuaiwkbjAJQCBucFswXSpuMCsidHBbMF0iCisJbW92CSR0cCxzcAorCisuTGlubmVyOgorCWxkcgkkYWosWyRhcF0sIzQJCUAgYXBbal0sYXArKworCWFkZHMJJGFsbywkYWhpLCR0agkJQCArPXRwW2pdCisJbGRyCSRuaixbJG5wXSwjNAkJQCBucFtqXSxucCsrCisJbW92CSRhaGksIzAKKwl1bWxhbAkkYWxvLCRhaGksJGFqLCRiaQlAIGFwW2pdKmJwW2ldCisJbW92CSRuaGksIzAKKwl1bWxhbAkkbmxvLCRuaGksJG5qLCRuMAlAIG5wW2pdKm4wCisJYWRjCSRhaGksJGFoaSwjMAorCWxkcgkkdGosWyR0cCwjOF0JCUAgdHBbaisxXQorCWFkZHMJJG5sbywkbmxvLCRhbG8KKwlzdHIJJG5sbyxbJHRwXSwjNAkJQCB0cFtqLTFdPSx0cCsrCisJYWRjCSRubG8sJG5oaSwjMAorCWNtcAkkdHAsJG51bQorCWJuZQkuTGlubmVyCisKKwlhZGRzCSRubG8sJG5sbywkYWhpCisJbW92CSRuaGksIzAKKwlsZHIJJHRwLFskX2JwXQkJQCByZXN0b3JlIGJwCisJYWRjCSRuaGksJG5oaSwjMAorCWxkcgkkbjAsWyRfbjBdCQlAIHJlc3RvcmUgbjAKKwlhZGRzCSRubG8sJG5sbywkdGoKKwlsZHIJJHRqLFskX2JwZW5kXQkJQCByZXN0b3JlICZicFtudW1dCisJYWRjCSRuaGksJG5oaSwjMAorCXN0cgkkbmxvLFskbnVtXQkJQCB0cFtudW0tMV09CisJc3RyCSRuaGksWyRudW0sIzRdCQlAIHRwW251bV09CisKKwljbXAJJHRwLCR0agorCWJuZQkuTG91dGVyCisMCisJbGRyCSRycCxbJF9ycF0JCUAgcHVsbCBycAorCWFkZAkkbnVtLCRudW0sIzQJCUAgJG51bSB0byBwb2ludCBhdCAmdHBbbnVtXQorCXN1YgkkYWosJG51bSxzcAkJQCAib3JpZ2luYWwiIG51bSB2YWx1ZQorCW1vdgkkdHAsc3AJCQlAICJyZXdpbmQiICR0cAorCW1vdgkkYXAsJHRwCQkJQCAiYm9ycm93IiAkYXAKKwlzdWIJJG5wLCRucCwkYWoJCUAgInJld2luZCIgJG5wIHRvICZucFswXQorCisJc3VicwkkdGosJHRqLCR0agkJQCAiY2xlYXIiIGNhcnJ5IGZsYWcKKy5Mc3ViOglsZHIJJHRqLFskdHBdLCM0CisJbGRyCSRuaixbJG5wXSwjNAorCXNiY3MJJHRqLCR0aiwkbmoJCUAgdHBbal0tbnBbal0KKwlzdHIJJHRqLFskcnBdLCM0CQlAIHJwW2pdPQorCXRlcQkkdHAsJG51bQkJQCBwcmVzZXJ2ZSBjYXJyeQorCWJuZQkuTHN1YgorCXNiY3MJJG5oaSwkbmhpLCMwCQlAIHVwbW9zdCBjYXJyeQorCW1vdgkkdHAsc3AJCQlAICJyZXdpbmQiICR0cAorCXN1YgkkcnAsJHJwLCRhagkJQCAicmV3aW5kIiAkcnAKKworCWFuZAkkYXAsJHRwLCRuaGkKKwliaWMJJG5wLCRycCwkbmhpCisJb3JyCSRhcCwkYXAsJG5wCQlAIGFwPWJvcnJvdz90cDpycAorCisuTGNvcHk6CWxkcgkkdGosWyRhcF0sIzQJCUAgY29weSBvciBpbi1wbGFjZSByZWZyZXNoCisJc3RyCXNwLFskdHBdLCM0CQlAIHphcCB0cAorCXN0cgkkdGosWyRycF0sIzQKKwljbXAJJHRwLCRudW0KKwlibmUJLkxjb3B5CisKKwlhZGQJc3AsJG51bSwjNAkJQCBza2lwIG92ZXIgdHBbbnVtKzFdCisJbGRtaWEJc3AhLHtyNC1yMTIsbHJ9CQlAIHJlc3RvcmUgcmVnaXN0ZXJzCisJYWRkCXNwLHNwLCMyKjQJCUAgc2tpcCBvdmVyIHtyMCxyMn0KKwltb3YJcjAsIzEKKy5MYWJydDoJdHN0CWxyLCMxCisJbW92ZXEJcGMsbHIJCQlAIGJlIGJpbmFyeSBjb21wYXRpYmxlIHdpdGggVjQsIHlldAorCWJ4CWxyCQkJQCBpbnRlcm9wZXJhYmxlIHdpdGggVGh1bWIgSVNBOi0pCisuc2l6ZQlibl9tdWxfbW9udCwuLWJuX211bF9tb250CitfX18KK3sKK3N1YiBEbG8oKSAgIHsgc2hpZnQ9fm18cShbMV0/WzAtOV0pfD8iZCIuKCQxKjIpOiIiOyAgICAgfQorc3ViIERoaSgpICAgeyBzaGlmdD1+bXxxKFsxXT9bMC05XSl8PyJkIi4oJDEqMisxKToiIjsgICB9CisKK215ICgkQTAsJEExLCRBMiwkQTMpPW1hcCgiZCRfIiwoMC4uMykpOworbXkgKCROMCwkTjEsJE4yLCROMyk9bWFwKCJkJF8iLCg0Li43KSk7CitteSAoJFosJFRlbXApPSgicTQiLCJxNSIpOworbXkgKCRBMHhCLCRBMXhCLCRBMnhCLCRBM3hCLCRBNHhCLCRBNXhCLCRBNnhCLCRBN3hCKT1tYXAoInEkXyIsKDYuLjEzKSk7CitteSAoJEJpLCROaSwkTTApPW1hcCgiZCRfIiwoMjguLjMxKSk7CitteSAkemVybz0mRGxvKCRaKTsKK215ICR0ZW1wPSZEbG8oJFRlbXApOworCitteSAoJHJwdHIsJGFwdHIsJGJwdHIsJG5wdHIsJG4wLCRudW0pPW1hcCgiciRfIiwoMC4uNSkpOworbXkgKCR0aW5wdHIsJHRvdXRwdHIsJGlubmVyLCRvdXRlcik9bWFwKCJyJF8iLCg2Li45KSk7CisKKyRjb2RlLj08PF9fXzsKKyNpZiBfX0FSTV9BUkNIX18+PTcKKy5mcHUJbmVvbgorCisudHlwZQlibl9tdWw4eF9tb250X25lb24sJWZ1bmN0aW9uCisuYWxpZ24JNQorYm5fbXVsOHhfbW9udF9uZW9uOgorCW1vdglpcCxzcAorCXN0bWRiCXNwISx7cjQtcjExfQorCXZzdG1kYglzcCEse2Q4LWQxNX0JCUAgQUJJIHNwZWNpZmljYXRpb24gc2F5cyBzbworCWxkbWlhCWlwLHtyNC1yNX0JCUAgbG9hZCByZXN0IG9mIHBhcmFtZXRlciBibG9jaworCisJc3ViCQkkdG91dHB0cixzcCwjMTYKKwl2bGQxLjMyCQl7JHtCaX1bMF19LCBbJGJwdHIsOjMyXSEKKwlzdWIJCSR0b3V0cHRyLCR0b3V0cHRyLCRudW0sbHNsIzQKKwl2bGQxLjMyCQl7JEEwLSRBM30sICBbJGFwdHJdIQkJQCBjYW4ndCBzcGVjaWZ5IDozMiA6LSgKKwlhbmQJCSR0b3V0cHRyLCR0b3V0cHRyLCMtNjQKKwl2bGQxLjMyCQl7JHtNMH1bMF19LCBbJG4wLDozMl0KKwltb3YJCXNwLCR0b3V0cHRyCQkJQCBhbGxvY2EKKwl2ZW9yCQkkemVybywkemVybywkemVybworCXN1YnMJCSRpbm5lciwkbnVtLCM4CisJdnppcC4xNgkJJEJpLCR6ZXJvCisKKwl2bXVsbC51MzIJJEEweEIsJEJpLCR7QTB9WzBdCisJdm11bGwudTMyCSRBMXhCLCRCaSwke0EwfVsxXQorCXZtdWxsLnUzMgkkQTJ4QiwkQmksJHtBMX1bMF0KKwl2c2hsLmk2NAkkdGVtcCxgJkRoaSgiJEEweEIiKWAsIzE2CisJdm11bGwudTMyCSRBM3hCLCRCaSwke0ExfVsxXQorCisJdmFkZC51NjQJJHRlbXAsJHRlbXAsYCZEbG8oIiRBMHhCIilgCisJdmVvcgkJJHplcm8sJHplcm8sJHplcm8KKwl2bXVsLnUzMgkkTmksJHRlbXAsJE0wCisKKwl2bXVsbC51MzIJJEE0eEIsJEJpLCR7QTJ9WzBdCisJIHZsZDEuMzIJeyROMC0kTjN9LCBbJG5wdHJdIQorCXZtdWxsLnUzMgkkQTV4QiwkQmksJHtBMn1bMV0KKwl2bXVsbC51MzIJJEE2eEIsJEJpLCR7QTN9WzBdCisJdnppcC4xNgkJJE5pLCR6ZXJvCisJdm11bGwudTMyCSRBN3hCLCRCaSwke0EzfVsxXQorCisJYm5lCS5MTkVPTl8xc3QKKworCUAgc3BlY2lhbCBjYXNlIGZvciBudW09OCwgZXZlcnl0aGluZyBpcyBpbiByZWdpc3RlciBiYW5rLi4uCisKKwl2bWxhbC51MzIJJEEweEIsJE5pLCR7TjB9WzBdCisJc3ViCQkkb3V0ZXIsJG51bSwjMQorCXZtbGFsLnUzMgkkQTF4QiwkTmksJHtOMH1bMV0KKwl2bWxhbC51MzIJJEEyeEIsJE5pLCR7TjF9WzBdCisJdm1sYWwudTMyCSRBM3hCLCROaSwke04xfVsxXQorCisJdm1sYWwudTMyCSRBNHhCLCROaSwke04yfVswXQorCXZtb3YJCSRUZW1wLCRBMHhCCisJdm1sYWwudTMyCSRBNXhCLCROaSwke04yfVsxXQorCXZtb3YJCSRBMHhCLCRBMXhCCisJdm1sYWwudTMyCSRBNnhCLCROaSwke04zfVswXQorCXZtb3YJCSRBMXhCLCRBMnhCCisJdm1sYWwudTMyCSRBN3hCLCROaSwke04zfVsxXQorCXZtb3YJCSRBMnhCLCRBM3hCCisJdm1vdgkJJEEzeEIsJEE0eEIKKwl2c2hyLnU2NAkkdGVtcCwkdGVtcCwjMTYKKwl2bW92CQkkQTR4QiwkQTV4QgorCXZtb3YJCSRBNXhCLCRBNnhCCisJdmFkZC51NjQJJHRlbXAsJHRlbXAsYCZEaGkoIiRUZW1wIilgCisJdm1vdgkJJEE2eEIsJEE3eEIKKwl2ZW9yCQkkQTd4QiwkQTd4QgorCXZzaHIudTY0CSR0ZW1wLCR0ZW1wLCMxNgorCisJYgkuTE5FT05fb3V0ZXI4CisKKy5hbGlnbgk0CisuTE5FT05fb3V0ZXI4OgorCXZsZDEuMzIJCXske0JpfVswXX0sIFskYnB0ciw6MzJdIQorCXZlb3IJCSR6ZXJvLCR6ZXJvLCR6ZXJvCisJdnppcC4xNgkJJEJpLCR6ZXJvCisJdmFkZC51NjQJYCZEbG8oIiRBMHhCIilgLGAmRGxvKCIkQTB4QiIpYCwkdGVtcAorCisJdm1sYWwudTMyCSRBMHhCLCRCaSwke0EwfVswXQorCXZtbGFsLnUzMgkkQTF4QiwkQmksJHtBMH1bMV0KKwl2bWxhbC51MzIJJEEyeEIsJEJpLCR7QTF9WzBdCisJdnNobC5pNjQJJHRlbXAsYCZEaGkoIiRBMHhCIilgLCMxNgorCXZtbGFsLnUzMgkkQTN4QiwkQmksJHtBMX1bMV0KKworCXZhZGQudTY0CSR0ZW1wLCR0ZW1wLGAmRGxvKCIkQTB4QiIpYAorCXZlb3IJCSR6ZXJvLCR6ZXJvLCR6ZXJvCisJc3VicwkJJG91dGVyLCRvdXRlciwjMQorCXZtdWwudTMyCSROaSwkdGVtcCwkTTAKKworCXZtbGFsLnUzMgkkQTR4QiwkQmksJHtBMn1bMF0KKwl2bWxhbC51MzIJJEE1eEIsJEJpLCR7QTJ9WzFdCisJdm1sYWwudTMyCSRBNnhCLCRCaSwke0EzfVswXQorCXZ6aXAuMTYJCSROaSwkemVybworCXZtbGFsLnUzMgkkQTd4QiwkQmksJHtBM31bMV0KKworCXZtbGFsLnUzMgkkQTB4QiwkTmksJHtOMH1bMF0KKwl2bWxhbC51MzIJJEExeEIsJE5pLCR7TjB9WzFdCisJdm1sYWwudTMyCSRBMnhCLCROaSwke04xfVswXQorCXZtbGFsLnUzMgkkQTN4QiwkTmksJHtOMX1bMV0KKworCXZtbGFsLnUzMgkkQTR4QiwkTmksJHtOMn1bMF0KKwl2bW92CQkkVGVtcCwkQTB4QgorCXZtbGFsLnUzMgkkQTV4QiwkTmksJHtOMn1bMV0KKwl2bW92CQkkQTB4QiwkQTF4QgorCXZtbGFsLnUzMgkkQTZ4QiwkTmksJHtOM31bMF0KKwl2bW92CQkkQTF4QiwkQTJ4QgorCXZtbGFsLnUzMgkkQTd4QiwkTmksJHtOM31bMV0KKwl2bW92CQkkQTJ4QiwkQTN4QgorCXZtb3YJCSRBM3hCLCRBNHhCCisJdnNoci51NjQJJHRlbXAsJHRlbXAsIzE2CisJdm1vdgkJJEE0eEIsJEE1eEIKKwl2bW92CQkkQTV4QiwkQTZ4QgorCXZhZGQudTY0CSR0ZW1wLCR0ZW1wLGAmRGhpKCIkVGVtcCIpYAorCXZtb3YJCSRBNnhCLCRBN3hCCisJdmVvcgkJJEE3eEIsJEE3eEIKKwl2c2hyLnU2NAkkdGVtcCwkdGVtcCwjMTYKKworCWJuZQkuTE5FT05fb3V0ZXI4CisKKwl2YWRkLnU2NAlgJkRsbygiJEEweEIiKWAsYCZEbG8oIiRBMHhCIilgLCR0ZW1wCisJbW92CQkkdG91dHB0cixzcAorCXZzaHIudTY0CSR0ZW1wLGAmRGxvKCIkQTB4QiIpYCwjMTYKKwltb3YJCSRpbm5lciwkbnVtCisJdmFkZC51NjQJYCZEaGkoIiRBMHhCIilgLGAmRGhpKCIkQTB4QiIpYCwkdGVtcAorCWFkZAkJJHRpbnB0cixzcCwjMTYKKwl2c2hyLnU2NAkkdGVtcCxgJkRoaSgiJEEweEIiKWAsIzE2CisJdnppcC4xNgkJYCZEbG8oIiRBMHhCIilgLGAmRGhpKCIkQTB4QiIpYAorCisJYgkuTE5FT05fdGFpbDIKKworLmFsaWduCTQKKy5MTkVPTl8xc3Q6CisJdm1sYWwudTMyCSRBMHhCLCROaSwke04wfVswXQorCSB2bGQxLjMyCXskQTAtJEEzfSwgWyRhcHRyXSEKKwl2bWxhbC51MzIJJEExeEIsJE5pLCR7TjB9WzFdCisJc3VicwkJJGlubmVyLCRpbm5lciwjOAorCXZtbGFsLnUzMgkkQTJ4QiwkTmksJHtOMX1bMF0KKwl2bWxhbC51MzIJJEEzeEIsJE5pLCR7TjF9WzFdCisKKwl2bWxhbC51MzIJJEE0eEIsJE5pLCR7TjJ9WzBdCisJIHZsZDEuMzIJeyROMC0kTjF9LCBbJG5wdHJdIQorCXZtbGFsLnUzMgkkQTV4QiwkTmksJHtOMn1bMV0KKwkgdnN0MS42NAl7JEEweEItJEExeEJ9LCBbJHRvdXRwdHIsOjI1Nl0hCisJdm1sYWwudTMyCSRBNnhCLCROaSwke04zfVswXQorCXZtbGFsLnUzMgkkQTd4QiwkTmksJHtOM31bMV0KKwkgdnN0MS42NAl7JEEyeEItJEEzeEJ9LCBbJHRvdXRwdHIsOjI1Nl0hCisKKwl2bXVsbC51MzIJJEEweEIsJEJpLCR7QTB9WzBdCisJIHZsZDEuMzIJeyROMi0kTjN9LCBbJG5wdHJdIQorCXZtdWxsLnUzMgkkQTF4QiwkQmksJHtBMH1bMV0KKwkgdnN0MS42NAl7JEE0eEItJEE1eEJ9LCBbJHRvdXRwdHIsOjI1Nl0hCisJdm11bGwudTMyCSRBMnhCLCRCaSwke0ExfVswXQorCXZtdWxsLnUzMgkkQTN4QiwkQmksJHtBMX1bMV0KKwkgdnN0MS42NAl7JEE2eEItJEE3eEJ9LCBbJHRvdXRwdHIsOjI1Nl0hCisKKwl2bXVsbC51MzIJJEE0eEIsJEJpLCR7QTJ9WzBdCisJdm11bGwudTMyCSRBNXhCLCRCaSwke0EyfVsxXQorCXZtdWxsLnUzMgkkQTZ4QiwkQmksJHtBM31bMF0KKwl2bXVsbC51MzIJJEE3eEIsJEJpLCR7QTN9WzFdCisKKwlibmUJLkxORU9OXzFzdAorCisJdm1sYWwudTMyCSRBMHhCLCROaSwke04wfVswXQorCWFkZAkJJHRpbnB0cixzcCwjMTYKKwl2bWxhbC51MzIJJEExeEIsJE5pLCR7TjB9WzFdCisJc3ViCQkkYXB0ciwkYXB0ciwkbnVtLGxzbCMyCQlAIHJld2luZCAkYXB0cgorCXZtbGFsLnUzMgkkQTJ4QiwkTmksJHtOMX1bMF0KKwkgdmxkMS42NAl7JFRlbXB9LCBbc3AsOjEyOF0KKwl2bWxhbC51MzIJJEEzeEIsJE5pLCR7TjF9WzFdCisJc3ViCQkkb3V0ZXIsJG51bSwjMQorCisJdm1sYWwudTMyCSRBNHhCLCROaSwke04yfVswXQorCXZzdDEuNjQJCXskQTB4Qi0kQTF4Qn0sIFskdG91dHB0ciw6MjU2XSEKKwl2bWxhbC51MzIJJEE1eEIsJE5pLCR7TjJ9WzFdCisJdnNoci51NjQJJHRlbXAsJHRlbXAsIzE2CisJIHZsZDEuNjQJeyRBMHhCfSwgICAgICAgWyR0aW5wdHIsIDoxMjhdIQorCXZtbGFsLnUzMgkkQTZ4QiwkTmksJHtOM31bMF0KKwl2c3QxLjY0CQl7JEEyeEItJEEzeEJ9LCBbJHRvdXRwdHIsOjI1Nl0hCisJdm1sYWwudTMyCSRBN3hCLCROaSwke04zfVsxXQorCisJdnN0MS42NAkJeyRBNHhCLSRBNXhCfSwgWyR0b3V0cHRyLDoyNTZdIQorCXZhZGQudTY0CSR0ZW1wLCR0ZW1wLGAmRGhpKCIkVGVtcCIpYAorCXZlb3IJCSRaLCRaLCRaCisJdnN0MS42NAkJeyRBNnhCLSRBN3hCfSwgWyR0b3V0cHRyLDoyNTZdIQorCSB2bGQxLjY0CXskQTF4Qi0kQTJ4Qn0sIFskdGlucHRyLCA6MjU2XSEKKwl2c3QxLjY0CQl7JFp9LCAgICAgICAgICBbJHRvdXRwdHIsOjEyOF0KKwl2c2hyLnU2NAkkdGVtcCwkdGVtcCwjMTYKKworCWIJCS5MTkVPTl9vdXRlcgorCisuYWxpZ24JNAorLkxORU9OX291dGVyOgorCXZsZDEuMzIJCXske0JpfVswXX0sIFskYnB0ciw6MzJdIQorCXN1YgkJJG5wdHIsJG5wdHIsJG51bSxsc2wjMgkJQCByZXdpbmQgJG5wdHIKKwl2bGQxLjMyCQl7JEEwLSRBM30sICBbJGFwdHJdIQorCXZlb3IJCSR6ZXJvLCR6ZXJvLCR6ZXJvCisJbW92CQkkdG91dHB0cixzcAorCXZ6aXAuMTYJCSRCaSwkemVybworCXN1YgkJJGlubmVyLCRudW0sIzgKKwl2YWRkLnU2NAlgJkRsbygiJEEweEIiKWAsYCZEbG8oIiRBMHhCIilgLCR0ZW1wCisKKwl2bWxhbC51MzIJJEEweEIsJEJpLCR7QTB9WzBdCisJIHZsZDEuNjQJeyRBM3hCLSRBNHhCfSxbJHRpbnB0ciw6MjU2XSEKKwl2bWxhbC51MzIJJEExeEIsJEJpLCR7QTB9WzFdCisJdm1sYWwudTMyCSRBMnhCLCRCaSwke0ExfVswXQorCSB2bGQxLjY0CXskQTV4Qi0kQTZ4Qn0sWyR0aW5wdHIsOjI1Nl0hCisJdm1sYWwudTMyCSRBM3hCLCRCaSwke0ExfVsxXQorCisJdnNobC5pNjQJJHRlbXAsYCZEaGkoIiRBMHhCIilgLCMxNgorCXZlb3IJCSR6ZXJvLCR6ZXJvLCR6ZXJvCisJdmFkZC51NjQJJHRlbXAsJHRlbXAsYCZEbG8oIiRBMHhCIilgCisJIHZsZDEuNjQJeyRBN3hCfSxbJHRpbnB0ciw6MTI4XSEKKwl2bXVsLnUzMgkkTmksJHRlbXAsJE0wCisKKwl2bWxhbC51MzIJJEE0eEIsJEJpLCR7QTJ9WzBdCisJIHZsZDEuMzIJeyROMC0kTjN9LCBbJG5wdHJdIQorCXZtbGFsLnUzMgkkQTV4QiwkQmksJHtBMn1bMV0KKwl2bWxhbC51MzIJJEE2eEIsJEJpLCR7QTN9WzBdCisJdnppcC4xNgkJJE5pLCR6ZXJvCisJdm1sYWwudTMyCSRBN3hCLCRCaSwke0EzfVsxXQorCisuTE5FT05faW5uZXI6CisJdm1sYWwudTMyCSRBMHhCLCROaSwke04wfVswXQorCSB2bGQxLjMyCXskQTAtJEEzfSwgWyRhcHRyXSEKKwl2bWxhbC51MzIJJEExeEIsJE5pLCR7TjB9WzFdCisJIHN1YnMJCSRpbm5lciwkaW5uZXIsIzgKKwl2bWxhbC51MzIJJEEyeEIsJE5pLCR7TjF9WzBdCisJdm1sYWwudTMyCSRBM3hCLCROaSwke04xfVsxXQorCXZzdDEuNjQJCXskQTB4Qi0kQTF4Qn0sIFskdG91dHB0ciw6MjU2XSEKKworCXZtbGFsLnUzMgkkQTR4QiwkTmksJHtOMn1bMF0KKwkgdmxkMS42NAl7JEEweEJ9LCAgICAgICBbJHRpbnB0ciwgOjEyOF0hCisJdm1sYWwudTMyCSRBNXhCLCROaSwke04yfVsxXQorCXZzdDEuNjQJCXskQTJ4Qi0kQTN4Qn0sIFskdG91dHB0ciw6MjU2XSEKKwl2bWxhbC51MzIJJEE2eEIsJE5pLCR7TjN9WzBdCisJIHZsZDEuNjQJeyRBMXhCLSRBMnhCfSwgWyR0aW5wdHIsIDoyNTZdIQorCXZtbGFsLnUzMgkkQTd4QiwkTmksJHtOM31bMV0KKwl2c3QxLjY0CQl7JEE0eEItJEE1eEJ9LCBbJHRvdXRwdHIsOjI1Nl0hCisKKwl2bWxhbC51MzIJJEEweEIsJEJpLCR7QTB9WzBdCisJIHZsZDEuNjQJeyRBM3hCLSRBNHhCfSwgWyR0aW5wdHIsIDoyNTZdIQorCXZtbGFsLnUzMgkkQTF4QiwkQmksJHtBMH1bMV0KKwl2c3QxLjY0CQl7JEE2eEItJEE3eEJ9LCBbJHRvdXRwdHIsOjI1Nl0hCisJdm1sYWwudTMyCSRBMnhCLCRCaSwke0ExfVswXQorCSB2bGQxLjY0CXskQTV4Qi0kQTZ4Qn0sIFskdGlucHRyLCA6MjU2XSEKKwl2bWxhbC51MzIJJEEzeEIsJEJpLCR7QTF9WzFdCisJIHZsZDEuMzIJeyROMC0kTjN9LCBbJG5wdHJdIQorCisJdm1sYWwudTMyCSRBNHhCLCRCaSwke0EyfVswXQorCSB2bGQxLjY0CXskQTd4Qn0sICAgICAgIFskdGlucHRyLCA6MTI4XSEKKwl2bWxhbC51MzIJJEE1eEIsJEJpLCR7QTJ9WzFdCisJdm1sYWwudTMyCSRBNnhCLCRCaSwke0EzfVswXQorCXZtbGFsLnUzMgkkQTd4QiwkQmksJHtBM31bMV0KKworCWJuZQkuTE5FT05faW5uZXIKKworCXZtbGFsLnUzMgkkQTB4QiwkTmksJHtOMH1bMF0KKwlhZGQJCSR0aW5wdHIsc3AsIzE2CisJdm1sYWwudTMyCSRBMXhCLCROaSwke04wfVsxXQorCXN1YgkJJGFwdHIsJGFwdHIsJG51bSxsc2wjMgkJQCByZXdpbmQgJGFwdHIKKwl2bWxhbC51MzIJJEEyeEIsJE5pLCR7TjF9WzBdCisJIHZsZDEuNjQJeyRUZW1wfSwgW3NwLDoxMjhdCisJdm1sYWwudTMyCSRBM3hCLCROaSwke04xfVsxXQorCXN1YnMJCSRvdXRlciwkb3V0ZXIsIzEKKworCXZtbGFsLnUzMgkkQTR4QiwkTmksJHtOMn1bMF0KKwl2c3QxLjY0CQl7JEEweEItJEExeEJ9LCBbJHRvdXRwdHIsOjI1Nl0hCisJdm1sYWwudTMyCSRBNXhCLCROaSwke04yfVsxXQorCSB2bGQxLjY0CXskQTB4Qn0sICAgICAgIFskdGlucHRyLCA6MTI4XSEKKwl2c2hyLnU2NAkkdGVtcCwkdGVtcCwjMTYKKwl2c3QxLjY0CQl7JEEyeEItJEEzeEJ9LCBbJHRvdXRwdHIsOjI1Nl0hCisJdm1sYWwudTMyCSRBNnhCLCROaSwke04zfVswXQorCSB2bGQxLjY0CXskQTF4Qi0kQTJ4Qn0sIFskdGlucHRyLCA6MjU2XSEKKwl2bWxhbC51MzIJJEE3eEIsJE5pLCR7TjN9WzFdCisKKwl2c3QxLjY0CQl7JEE0eEItJEE1eEJ9LCBbJHRvdXRwdHIsOjI1Nl0hCisJdmFkZC51NjQJJHRlbXAsJHRlbXAsYCZEaGkoIiRUZW1wIilgCisJdnN0MS42NAkJeyRBNnhCLSRBN3hCfSwgWyR0b3V0cHRyLDoyNTZdIQorCXZzaHIudTY0CSR0ZW1wLCR0ZW1wLCMxNgorCisJYm5lCS5MTkVPTl9vdXRlcgorCisJbW92CQkkdG91dHB0cixzcAorCW1vdgkJJGlubmVyLCRudW0KKworLkxORU9OX3RhaWw6CisJdmFkZC51NjQJYCZEbG8oIiRBMHhCIilgLGAmRGxvKCIkQTB4QiIpYCwkdGVtcAorCXZsZDEuNjQJCXskQTN4Qi0kQTR4Qn0sIFskdGlucHRyLCA6MjU2XSEKKwl2c2hyLnU2NAkkdGVtcCxgJkRsbygiJEEweEIiKWAsIzE2CisJdmFkZC51NjQJYCZEaGkoIiRBMHhCIilgLGAmRGhpKCIkQTB4QiIpYCwkdGVtcAorCXZsZDEuNjQJCXskQTV4Qi0kQTZ4Qn0sIFskdGlucHRyLCA6MjU2XSEKKwl2c2hyLnU2NAkkdGVtcCxgJkRoaSgiJEEweEIiKWAsIzE2CisJdmxkMS42NAkJeyRBN3hCfSwgICAgICAgWyR0aW5wdHIsIDoxMjhdIQorCXZ6aXAuMTYJCWAmRGxvKCIkQTB4QiIpYCxgJkRoaSgiJEEweEIiKWAKKworLkxORU9OX3RhaWwyOgorCXZhZGQudTY0CWAmRGxvKCIkQTF4QiIpYCxgJkRsbygiJEExeEIiKWAsJHRlbXAKKwl2c3QxLjMyCQl7YCZEbG8oIiRBMHhCIilgWzBdfSwgWyR0b3V0cHRyLCA6MzJdIQorCXZzaHIudTY0CSR0ZW1wLGAmRGxvKCIkQTF4QiIpYCwjMTYKKwl2YWRkLnU2NAlgJkRoaSgiJEExeEIiKWAsYCZEaGkoIiRBMXhCIilgLCR0ZW1wCisJdnNoci51NjQJJHRlbXAsYCZEaGkoIiRBMXhCIilgLCMxNgorCXZ6aXAuMTYJCWAmRGxvKCIkQTF4QiIpYCxgJkRoaSgiJEExeEIiKWAKKworCXZhZGQudTY0CWAmRGxvKCIkQTJ4QiIpYCxgJkRsbygiJEEyeEIiKWAsJHRlbXAKKwl2c3QxLjMyCQl7YCZEbG8oIiRBMXhCIilgWzBdfSwgWyR0b3V0cHRyLCA6MzJdIQorCXZzaHIudTY0CSR0ZW1wLGAmRGxvKCIkQTJ4QiIpYCwjMTYKKwl2YWRkLnU2NAlgJkRoaSgiJEEyeEIiKWAsYCZEaGkoIiRBMnhCIilgLCR0ZW1wCisJdnNoci51NjQJJHRlbXAsYCZEaGkoIiRBMnhCIilgLCMxNgorCXZ6aXAuMTYJCWAmRGxvKCIkQTJ4QiIpYCxgJkRoaSgiJEEyeEIiKWAKKworCXZhZGQudTY0CWAmRGxvKCIkQTN4QiIpYCxgJkRsbygiJEEzeEIiKWAsJHRlbXAKKwl2c3QxLjMyCQl7YCZEbG8oIiRBMnhCIilgWzBdfSwgWyR0b3V0cHRyLCA6MzJdIQorCXZzaHIudTY0CSR0ZW1wLGAmRGxvKCIkQTN4QiIpYCwjMTYKKwl2YWRkLnU2NAlgJkRoaSgiJEEzeEIiKWAsYCZEaGkoIiRBM3hCIilgLCR0ZW1wCisJdnNoci51NjQJJHRlbXAsYCZEaGkoIiRBM3hCIilgLCMxNgorCXZ6aXAuMTYJCWAmRGxvKCIkQTN4QiIpYCxgJkRoaSgiJEEzeEIiKWAKKworCXZhZGQudTY0CWAmRGxvKCIkQTR4QiIpYCxgJkRsbygiJEE0eEIiKWAsJHRlbXAKKwl2c3QxLjMyCQl7YCZEbG8oIiRBM3hCIilgWzBdfSwgWyR0b3V0cHRyLCA6MzJdIQorCXZzaHIudTY0CSR0ZW1wLGAmRGxvKCIkQTR4QiIpYCwjMTYKKwl2YWRkLnU2NAlgJkRoaSgiJEE0eEIiKWAsYCZEaGkoIiRBNHhCIilgLCR0ZW1wCisJdnNoci51NjQJJHRlbXAsYCZEaGkoIiRBNHhCIilgLCMxNgorCXZ6aXAuMTYJCWAmRGxvKCIkQTR4QiIpYCxgJkRoaSgiJEE0eEIiKWAKKworCXZhZGQudTY0CWAmRGxvKCIkQTV4QiIpYCxgJkRsbygiJEE1eEIiKWAsJHRlbXAKKwl2c3QxLjMyCQl7YCZEbG8oIiRBNHhCIilgWzBdfSwgWyR0b3V0cHRyLCA6MzJdIQorCXZzaHIudTY0CSR0ZW1wLGAmRGxvKCIkQTV4QiIpYCwjMTYKKwl2YWRkLnU2NAlgJkRoaSgiJEE1eEIiKWAsYCZEaGkoIiRBNXhCIilgLCR0ZW1wCisJdnNoci51NjQJJHRlbXAsYCZEaGkoIiRBNXhCIilgLCMxNgorCXZ6aXAuMTYJCWAmRGxvKCIkQTV4QiIpYCxgJkRoaSgiJEE1eEIiKWAKKworCXZhZGQudTY0CWAmRGxvKCIkQTZ4QiIpYCxgJkRsbygiJEE2eEIiKWAsJHRlbXAKKwl2c3QxLjMyCQl7YCZEbG8oIiRBNXhCIilgWzBdfSwgWyR0b3V0cHRyLCA6MzJdIQorCXZzaHIudTY0CSR0ZW1wLGAmRGxvKCIkQTZ4QiIpYCwjMTYKKwl2YWRkLnU2NAlgJkRoaSgiJEE2eEIiKWAsYCZEaGkoIiRBNnhCIilgLCR0ZW1wCisJdmxkMS42NAkJeyRBMHhCfSwgWyR0aW5wdHIsIDoxMjhdIQorCXZzaHIudTY0CSR0ZW1wLGAmRGhpKCIkQTZ4QiIpYCwjMTYKKwl2emlwLjE2CQlgJkRsbygiJEE2eEIiKWAsYCZEaGkoIiRBNnhCIilgCisKKwl2YWRkLnU2NAlgJkRsbygiJEE3eEIiKWAsYCZEbG8oIiRBN3hCIilgLCR0ZW1wCisJdnN0MS4zMgkJe2AmRGxvKCIkQTZ4QiIpYFswXX0sIFskdG91dHB0ciwgOjMyXSEKKwl2c2hyLnU2NAkkdGVtcCxgJkRsbygiJEE3eEIiKWAsIzE2CisJdmFkZC51NjQJYCZEaGkoIiRBN3hCIilgLGAmRGhpKCIkQTd4QiIpYCwkdGVtcAorCXZsZDEuNjQJCXskQTF4Qi0kQTJ4Qn0sCVskdGlucHRyLCA6MjU2XSEKKwl2c2hyLnU2NAkkdGVtcCxgJkRoaSgiJEE3eEIiKWAsIzE2CisJdnppcC4xNgkJYCZEbG8oIiRBN3hCIilgLGAmRGhpKCIkQTd4QiIpYAorCXN1YnMJCSRpbm5lciwkaW5uZXIsIzgKKwl2c3QxLjMyCQl7YCZEbG8oIiRBN3hCIilgWzBdfSwgWyR0b3V0cHRyLCA6MzJdIQorCisJYm5lCS5MTkVPTl90YWlsCisKKwl2c3QxLjMyCXske3RlbXB9WzBdfSwgWyR0b3V0cHRyLCA6MzJdCQlAIHRvcC1tb3N0IGJpdAorCXN1YgkkbnB0ciwkbnB0ciwkbnVtLGxzbCMyCQkJQCByZXdpbmQgJG5wdHIKKwlzdWJzCSRhcHRyLHNwLCMwCQkJCUAgY2xlYXIgY2FycnkgZmxhZworCWFkZAkkYnB0cixzcCwkbnVtLGxzbCMyCisKKy5MTkVPTl9zdWI6CisJbGRtaWEJJGFwdHIhLCB7cjQtcjd9CisJbGRtaWEJJG5wdHIhLCB7cjgtcjExfQorCXNiY3MJcjgsIHI0LHI4CisJc2JjcwlyOSwgcjUscjkKKwlzYmNzCXIxMCxyNixyMTAKKwlzYmNzCXIxMSxyNyxyMTEKKwl0ZXEJJGFwdHIsJGJwdHIJCQkJQCBwcmVzZXJ2ZXMgY2FycnkKKwlzdG1pYQkkcnB0ciEsIHtyOC1yMTF9CisJYm5lCS5MTkVPTl9zdWIKKworCWxkcglyMTAsIFskYXB0cl0JCQkJQCBsb2FkIHRvcC1tb3N0IGJpdAorCXZlb3IJcTAscTAscTAKKwlzdWIJcjExLCRicHRyLHNwCQkJCUAgdGhpcyBpcyBudW0qNAorCXZlb3IJcTEscTEscTEKKwltb3YJJGFwdHIsc3AKKwlzdWIJJHJwdHIsJHJwdHIscjExCQkJCUAgcmV3aW5kICRycHRyCisJbW92CSRucHRyLCRicHRyCQkJCUAgc2Vjb25kIDMvNHRoIG9mIGZyYW1lCisJc2JjcwlyMTAscjEwLCMwCQkJCUAgcmVzdWx0IGlzIGNhcnJ5IGZsYWcKKworLkxORU9OX2NvcHlfbl96YXA6CisJbGRtaWEJJGFwdHIhLCB7cjQtcjd9CisJbGRtaWEJJHJwdHIsICB7cjgtcjExfQorCW1vdmNjCXI4LCByNAorCXZzdDEuNjQJe3EwLXExfSwgWyRucHRyLDoyNTZdIQkJCUAgd2lwZQorCW1vdmNjCXI5LCByNQorCW1vdmNjCXIxMCxyNgorCXZzdDEuNjQJe3EwLXExfSwgWyRucHRyLDoyNTZdIQkJCUAgd2lwZQorCW1vdmNjCXIxMSxyNworCWxkbWlhCSRhcHRyLCB7cjQtcjd9CisJc3RtaWEJJHJwdHIhLCB7cjgtcjExfQorCXN1YgkkYXB0ciwkYXB0ciwjMTYKKwlsZG1pYQkkcnB0ciwge3I4LXIxMX0KKwltb3ZjYwlyOCwgcjQKKwl2c3QxLjY0CXtxMC1xMX0sIFskYXB0ciw6MjU2XSEJCQlAIHdpcGUKKwltb3ZjYwlyOSwgcjUKKwltb3ZjYwlyMTAscjYKKwl2c3QxLjY0CXtxMC1xMX0sIFskbnB0ciw6MjU2XSEJCQlAIHdpcGUKKwltb3ZjYwlyMTEscjcKKwl0ZXEJJGFwdHIsJGJwdHIJCQkJQCBwcmVzZXJ2ZXMgY2FycnkKKwlzdG1pYQkkcnB0ciEsIHtyOC1yMTF9CisJYm5lCS5MTkVPTl9jb3B5X25femFwCisKKwlzdWIJc3AsaXAsIzk2CisgICAgICAgIHZsZG1pYSAgc3AhLHtkOC1kMTV9CisgICAgICAgIGxkbWlhICAgc3AhLHtyNC1yMTF9CisJYngJbHIKKy5zaXplCWJuX211bDh4X21vbnRfbmVvbiwuLWJuX211bDh4X21vbnRfbmVvbgorI2VuZGlmCitfX18KK30KKyRjb2RlLj08PF9fXzsKKy5hc2NpegkiTW9udGdvbWVyeSBtdWx0aXBsaWNhdGlvbiBmb3IgQVJNdjQvTkVPTiwgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQG9wZW5zc2wub3JnPiIKKy5hbGlnbgkyCisjaWYgX19BUk1fQVJDSF9fPj03CisuY29tbQlPUEVOU1NMX2FybWNhcF9QLDQsNAorI2VuZGlmCitfX18KKworJGNvZGUgPX4gcy9cYChbXlxgXSopXGAvZXZhbCAkMS9nZW07CiskY29kZSA9fiBzL1xiYnhccytsclxiLy53b3JkXHQweGUxMmZmZjFlL2dtOwkjIG1ha2UgaXQgcG9zc2libGUgdG8gY29tcGlsZSB3aXRoIC1tYXJjaD1hcm12NAorcHJpbnQgJGNvZGU7CitjbG9zZSBTVERPVVQ7CmRpZmYgLS1naXQgYS9jcnlwdG8vYm4vYXNtL2JuLTU4Ni5wbCBiL2NyeXB0by9ibi9hc20vYm4tNTg2LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZDliY2IKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYm4vYXNtL2JuLTU4Ni5wbApAQCAtMCwwICsxLDc3NCBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCiskMCA9fiBtLyguKltcL1xcXSlbXlwvXFxdKyQvOyAkZGlyPSQxOworcHVzaChASU5DLCIke2Rpcn0iLCIke2Rpcn0uLi8uLi9wZXJsYXNtIik7CityZXF1aXJlICJ4ODZhc20ucGwiOworCismYXNtX2luaXQoJEFSR1ZbMF0sJDApOworCiskc3NlMj0wOworZm9yIChAQVJHVikgeyAkc3NlMj0xIGlmICgvLURPUEVOU1NMX0lBMzJfU1NFMi8pOyB9CisKKyZleHRlcm5hbF9sYWJlbCgiT1BFTlNTTF9pYTMyY2FwX1AiKSBpZiAoJHNzZTIpOworCismYm5fbXVsX2FkZF93b3JkcygiYm5fbXVsX2FkZF93b3JkcyIpOworJmJuX211bF93b3JkcygiYm5fbXVsX3dvcmRzIik7CismYm5fc3FyX3dvcmRzKCJibl9zcXJfd29yZHMiKTsKKyZibl9kaXZfd29yZHMoImJuX2Rpdl93b3JkcyIpOworJmJuX2FkZF93b3JkcygiYm5fYWRkX3dvcmRzIik7CismYm5fc3ViX3dvcmRzKCJibl9zdWJfd29yZHMiKTsKKyZibl9zdWJfcGFydF93b3JkcygiYm5fc3ViX3BhcnRfd29yZHMiKTsKKworJmFzbV9maW5pc2goKTsKKworc3ViIGJuX211bF9hZGRfd29yZHMKKwl7CisJbG9jYWwoJG5hbWUpPUBfOworCisJJmZ1bmN0aW9uX2JlZ2luX0IoJG5hbWUsJHNzZTI/IkVYVFJOXHRfT1BFTlNTTF9pYTMyY2FwX1A6RFdPUkQiOiIiKTsKKworCSRyPSJlYXgiOworCSRhPSJlZHgiOworCSRjPSJlY3giOworCisJaWYgKCRzc2UyKSB7CisJCSZwaWNtZXVwKCJlYXgiLCJPUEVOU1NMX2lhMzJjYXBfUCIpOworCQkmYnQoJkRXUCgwLCJlYXgiKSwyNik7CisJCSZqbmMoJmxhYmVsKCJtYXdfbm9uX3NzZTIiKSk7CisKKwkJJm1vdigkciwmd3BhcmFtKDApKTsKKwkJJm1vdigkYSwmd3BhcmFtKDEpKTsKKwkJJm1vdigkYywmd3BhcmFtKDIpKTsKKwkJJm1vdmQoIm1tMCIsJndwYXJhbSgzKSk7CSMgbW0wID0gdworCQkmcHhvcigibW0xIiwibW0xIik7CQkjIG1tMSA9IGNhcnJ5X2luCisJCSZqbXAoJmxhYmVsKCJtYXdfc3NlMl9lbnRyeSIpKTsKKwkJCisJJnNldF9sYWJlbCgibWF3X3NzZTJfdW5yb2xsZWQiLDE2KTsKKwkJJm1vdmQoIm1tMyIsJkRXUCgwLCRyLCIiLDApKTsJIyBtbTMgPSByWzBdCisJCSZwYWRkcSgibW0xIiwibW0zIik7CQkjIG1tMSA9IGNhcnJ5X2luICsgclswXQorCQkmbW92ZCgibW0yIiwmRFdQKDAsJGEsIiIsMCkpOwkjIG1tMiA9IGFbMF0KKwkJJnBtdWx1ZHEoIm1tMiIsIm1tMCIpOwkJIyBtbTIgPSB3KmFbMF0KKwkJJm1vdmQoIm1tNCIsJkRXUCg0LCRhLCIiLDApKTsJIyBtbTQgPSBhWzFdCisJCSZwbXVsdWRxKCJtbTQiLCJtbTAiKTsJCSMgbW00ID0gdyphWzFdCisJCSZtb3ZkKCJtbTYiLCZEV1AoOCwkYSwiIiwwKSk7CSMgbW02ID0gYVsyXQorCQkmcG11bHVkcSgibW02IiwibW0wIik7CQkjIG1tNiA9IHcqYVsyXQorCQkmbW92ZCgibW03IiwmRFdQKDEyLCRhLCIiLDApKTsJIyBtbTcgPSBhWzNdCisJCSZwbXVsdWRxKCJtbTciLCJtbTAiKTsJCSMgbW03ID0gdyphWzNdCisJCSZwYWRkcSgibW0xIiwibW0yIik7CQkjIG1tMSA9IGNhcnJ5X2luICsgclswXSArIHcqYVswXQorCQkmbW92ZCgibW0zIiwmRFdQKDQsJHIsIiIsMCkpOwkjIG1tMyA9IHJbMV0KKwkJJnBhZGRxKCJtbTMiLCJtbTQiKTsJCSMgbW0zID0gclsxXSArIHcqYVsxXQorCQkmbW92ZCgibW01IiwmRFdQKDgsJHIsIiIsMCkpOwkjIG1tNSA9IHJbMl0KKwkJJnBhZGRxKCJtbTUiLCJtbTYiKTsJCSMgbW01ID0gclsyXSArIHcqYVsyXQorCQkmbW92ZCgibW00IiwmRFdQKDEyLCRyLCIiLDApKTsJIyBtbTQgPSByWzNdCisJCSZwYWRkcSgibW03IiwibW00Iik7CQkjIG1tNyA9IHJbM10gKyB3KmFbM10KKwkJJm1vdmQoJkRXUCgwLCRyLCIiLDApLCJtbTEiKTsKKwkJJm1vdmQoIm1tMiIsJkRXUCgxNiwkYSwiIiwwKSk7CSMgbW0yID0gYVs0XQorCQkmcG11bHVkcSgibW0yIiwibW0wIik7CQkjIG1tMiA9IHcqYVs0XQorCQkmcHNybHEoIm1tMSIsMzIpOwkJIyBtbTEgPSBjYXJyeTAKKwkJJm1vdmQoIm1tNCIsJkRXUCgyMCwkYSwiIiwwKSk7CSMgbW00ID0gYVs1XQorCQkmcG11bHVkcSgibW00IiwibW0wIik7CQkjIG1tNCA9IHcqYVs1XQorCQkmcGFkZHEoIm1tMSIsIm1tMyIpOwkJIyBtbTEgPSBjYXJyeTAgKyByWzFdICsgdyphWzFdCisJCSZtb3ZkKCJtbTYiLCZEV1AoMjQsJGEsIiIsMCkpOwkjIG1tNiA9IGFbNl0KKwkJJnBtdWx1ZHEoIm1tNiIsIm1tMCIpOwkJIyBtbTYgPSB3KmFbNl0KKwkJJm1vdmQoJkRXUCg0LCRyLCIiLDApLCJtbTEiKTsKKwkJJnBzcmxxKCJtbTEiLDMyKTsJCSMgbW0xID0gY2FycnkxCisJCSZtb3ZkKCJtbTMiLCZEV1AoMjgsJGEsIiIsMCkpOwkjIG1tMyA9IGFbN10KKwkJJmFkZCgkYSwzMik7CisJCSZwbXVsdWRxKCJtbTMiLCJtbTAiKTsJCSMgbW0zID0gdyphWzddCisJCSZwYWRkcSgibW0xIiwibW01Iik7CQkjIG1tMSA9IGNhcnJ5MSArIHJbMl0gKyB3KmFbMl0KKwkJJm1vdmQoIm1tNSIsJkRXUCgxNiwkciwiIiwwKSk7CSMgbW01ID0gcls0XQorCQkmcGFkZHEoIm1tMiIsIm1tNSIpOwkJIyBtbTIgPSByWzRdICsgdyphWzRdCisJCSZtb3ZkKCZEV1AoOCwkciwiIiwwKSwibW0xIik7CisJCSZwc3JscSgibW0xIiwzMik7CQkjIG1tMSA9IGNhcnJ5MgorCQkmcGFkZHEoIm1tMSIsIm1tNyIpOwkJIyBtbTEgPSBjYXJyeTIgKyByWzNdICsgdyphWzNdCisJCSZtb3ZkKCJtbTUiLCZEV1AoMjAsJHIsIiIsMCkpOwkjIG1tNSA9IHJbNV0KKwkJJnBhZGRxKCJtbTQiLCJtbTUiKTsJCSMgbW00ID0gcls1XSArIHcqYVs1XQorCQkmbW92ZCgmRFdQKDEyLCRyLCIiLDApLCJtbTEiKTsKKwkJJnBzcmxxKCJtbTEiLDMyKTsJCSMgbW0xID0gY2FycnkzCisJCSZwYWRkcSgibW0xIiwibW0yIik7CQkjIG1tMSA9IGNhcnJ5MyArIHJbNF0gKyB3KmFbNF0KKwkJJm1vdmQoIm1tNSIsJkRXUCgyNCwkciwiIiwwKSk7CSMgbW01ID0gcls2XQorCQkmcGFkZHEoIm1tNiIsIm1tNSIpOwkJIyBtbTYgPSByWzZdICsgdyphWzZdCisJCSZtb3ZkKCZEV1AoMTYsJHIsIiIsMCksIm1tMSIpOworCQkmcHNybHEoIm1tMSIsMzIpOwkJIyBtbTEgPSBjYXJyeTQKKwkJJnBhZGRxKCJtbTEiLCJtbTQiKTsJCSMgbW0xID0gY2Fycnk0ICsgcls1XSArIHcqYVs1XQorCQkmbW92ZCgibW01IiwmRFdQKDI4LCRyLCIiLDApKTsJIyBtbTUgPSByWzddCisJCSZwYWRkcSgibW0zIiwibW01Iik7CQkjIG1tMyA9IHJbN10gKyB3KmFbN10KKwkJJm1vdmQoJkRXUCgyMCwkciwiIiwwKSwibW0xIik7CisJCSZwc3JscSgibW0xIiwzMik7CQkjIG1tMSA9IGNhcnJ5NQorCQkmcGFkZHEoIm1tMSIsIm1tNiIpOwkJIyBtbTEgPSBjYXJyeTUgKyByWzZdICsgdyphWzZdCisJCSZtb3ZkKCZEV1AoMjQsJHIsIiIsMCksIm1tMSIpOworCQkmcHNybHEoIm1tMSIsMzIpOwkJIyBtbTEgPSBjYXJyeTYKKwkJJnBhZGRxKCJtbTEiLCJtbTMiKTsJCSMgbW0xID0gY2Fycnk2ICsgcls3XSArIHcqYVs3XQorCQkmbW92ZCgmRFdQKDI4LCRyLCIiLDApLCJtbTEiKTsKKwkJJmxlYSgkciwmRFdQKDMyLCRyKSk7CisJCSZwc3JscSgibW0xIiwzMik7CQkjIG1tMSA9IGNhcnJ5X291dAorCisJCSZzdWIoJGMsOCk7CisJCSZqeigmbGFiZWwoIm1hd19zc2UyX2V4aXQiKSk7CisJJnNldF9sYWJlbCgibWF3X3NzZTJfZW50cnkiKTsKKwkJJnRlc3QoJGMsMHhmZmZmZmZmOCk7CisJCSZqbnooJmxhYmVsKCJtYXdfc3NlMl91bnJvbGxlZCIpKTsKKworCSZzZXRfbGFiZWwoIm1hd19zc2UyX2xvb3AiLDQpOworCQkmbW92ZCgibW0yIiwmRFdQKDAsJGEpKTsJIyBtbTIgPSBhW2ldCisJCSZtb3ZkKCJtbTMiLCZEV1AoMCwkcikpOwkjIG1tMyA9IHJbaV0KKwkJJnBtdWx1ZHEoIm1tMiIsIm1tMCIpOwkJIyBhW2ldICo9IHcKKwkJJmxlYSgkYSwmRFdQKDQsJGEpKTsKKwkJJnBhZGRxKCJtbTEiLCJtbTMiKTsJCSMgY2FycnkgKz0gcltpXQorCQkmcGFkZHEoIm1tMSIsIm1tMiIpOwkJIyBjYXJyeSArPSBhW2ldKncKKwkJJm1vdmQoJkRXUCgwLCRyKSwibW0xIik7CSMgcltpXSA9IGNhcnJ5X2xvdworCQkmc3ViKCRjLDEpOworCQkmcHNybHEoIm1tMSIsMzIpOwkJIyBjYXJyeSA9IGNhcnJ5X2hpZ2gKKwkJJmxlYSgkciwmRFdQKDQsJHIpKTsKKwkJJmpueigmbGFiZWwoIm1hd19zc2UyX2xvb3AiKSk7CisJJnNldF9sYWJlbCgibWF3X3NzZTJfZXhpdCIpOworCQkmbW92ZCgiZWF4IiwibW0xIik7CQkjIGMgPSBjYXJyeV9vdXQKKwkJJmVtbXMoKTsKKwkJJnJldCgpOworCisJJnNldF9sYWJlbCgibWF3X25vbl9zc2UyIiwxNik7CisJfQorCisJIyBmdW5jdGlvbl9iZWdpbiBwcm9sb2d1ZQorCSZwdXNoKCJlYnAiKTsKKwkmcHVzaCgiZWJ4Iik7CisJJnB1c2goImVzaSIpOworCSZwdXNoKCJlZGkiKTsKKworCSZjb21tZW50KCIiKTsKKwkkTG93PSJlYXgiOworCSRIaWdoPSJlZHgiOworCSRhPSJlYngiOworCSR3PSJlYnAiOworCSRyPSJlZGkiOworCSRjPSJlc2kiOworCisJJnhvcigkYywkYyk7CQkjIGNsZWFyIGNhcnJ5CisJJm1vdigkciwmd3BhcmFtKDApKTsJIworCisJJm1vdigiZWN4Iiwmd3BhcmFtKDIpKTsJIworCSZtb3YoJGEsJndwYXJhbSgxKSk7CSMKKworCSZhbmQoImVjeCIsMHhmZmZmZmZmOCk7CSMgbnVtIC8gOAorCSZtb3YoJHcsJndwYXJhbSgzKSk7CSMKKworCSZwdXNoKCJlY3giKTsJCSMgVXAgdGhlIHN0YWNrIGZvciBhIHRtcCB2YXJpYWJsZQorCisJJmp6KCZsYWJlbCgibWF3X2ZpbmlzaCIpKTsKKworCSZzZXRfbGFiZWwoIm1hd19sb29wIiwxNik7CisKKwlmb3IgKCRpPTA7ICRpPDMyOyAkaSs9NCkKKwkJeworCQkmY29tbWVudCgiUm91bmQgJGkiKTsKKworCQkgJm1vdigiZWF4IiwmRFdQKCRpLCRhKSk7IAkjICphCisJCSZtdWwoJHcpOwkJCSMgKmEgKiB3CisJCSZhZGQoImVheCIsJGMpOwkJCSMgTCh0KSs9IGMKKwkJJmFkYygiZWR4IiwwKTsJCQkjIEgodCkrPWNhcnJ5CisJCSAmYWRkKCJlYXgiLCZEV1AoJGksJHIpKTsJIyBMKHQpKz0gKnIKKwkJJmFkYygiZWR4IiwwKTsJCQkjIEgodCkrPWNhcnJ5CisJCSAmbW92KCZEV1AoJGksJHIpLCJlYXgiKTsJIyAqcj0gTCh0KTsKKwkJJm1vdigkYywiZWR4Iik7CQkJIyBjPSAgSCh0KTsKKwkJfQorCisJJmNvbW1lbnQoIiIpOworCSZzdWIoImVjeCIsOCk7CisJJmxlYSgkYSwmRFdQKDMyLCRhKSk7CisJJmxlYSgkciwmRFdQKDMyLCRyKSk7CisJJmpueigmbGFiZWwoIm1hd19sb29wIikpOworCisJJnNldF9sYWJlbCgibWF3X2ZpbmlzaCIsMCk7CisJJm1vdigiZWN4Iiwmd3BhcmFtKDIpKTsJIyBnZXQgbnVtCisJJmFuZCgiZWN4Iiw3KTsKKwkmam56KCZsYWJlbCgibWF3X2ZpbmlzaDIiKSk7CSMgaGVscHMgYnJhbmNoIHByZWRpY3Rpb24KKwkmam1wKCZsYWJlbCgibWF3X2VuZCIpKTsKKworCSZzZXRfbGFiZWwoIm1hd19maW5pc2gyIiwxKTsKKwlmb3IgKCRpPTA7ICRpPDc7ICRpKyspCisJCXsKKwkJJmNvbW1lbnQoIlRhaWwgUm91bmQgJGkiKTsKKwkJICZtb3YoImVheCIsJkRXUCgkaSo0LCRhKSk7CSMgKmEKKwkJJm11bCgkdyk7CQkJIyAqYSAqIHcKKwkJJmFkZCgiZWF4IiwkYyk7CQkJIyBMKHQpKz1jCisJCSZhZGMoImVkeCIsMCk7CQkJIyBIKHQpKz1jYXJyeQorCQkgJmFkZCgiZWF4IiwmRFdQKCRpKjQsJHIpKTsJIyBMKHQpKz0gKnIKKwkJJmFkYygiZWR4IiwwKTsJCQkjIEgodCkrPWNhcnJ5CisJCSAmZGVjKCJlY3giKSBpZiAoJGkgIT0gNy0xKTsKKwkJJm1vdigmRFdQKCRpKjQsJHIpLCJlYXgiKTsJIyAqcj0gTCh0KTsKKwkJICZtb3YoJGMsImVkeCIpOwkJIyBjPSAgSCh0KTsKKwkJJmp6KCZsYWJlbCgibWF3X2VuZCIpKSBpZiAoJGkgIT0gNy0xKTsKKwkJfQorCSZzZXRfbGFiZWwoIm1hd19lbmQiLDApOworCSZtb3YoImVheCIsJGMpOworCisJJnBvcCgiZWN4Iik7CSMgY2xlYXIgdmFyaWFibGUgZnJvbQorCisJJmZ1bmN0aW9uX2VuZCgkbmFtZSk7CisJfQorCitzdWIgYm5fbXVsX3dvcmRzCisJeworCWxvY2FsKCRuYW1lKT1AXzsKKworCSZmdW5jdGlvbl9iZWdpbl9CKCRuYW1lLCRzc2UyPyJFWFRSTlx0X09QRU5TU0xfaWEzMmNhcF9QOkRXT1JEIjoiIik7CisKKwkkcj0iZWF4IjsKKwkkYT0iZWR4IjsKKwkkYz0iZWN4IjsKKworCWlmICgkc3NlMikgeworCQkmcGljbWV1cCgiZWF4IiwiT1BFTlNTTF9pYTMyY2FwX1AiKTsKKwkJJmJ0KCZEV1AoMCwiZWF4IiksMjYpOworCQkmam5jKCZsYWJlbCgibXdfbm9uX3NzZTIiKSk7CisKKwkJJm1vdigkciwmd3BhcmFtKDApKTsKKwkJJm1vdigkYSwmd3BhcmFtKDEpKTsKKwkJJm1vdigkYywmd3BhcmFtKDIpKTsKKwkJJm1vdmQoIm1tMCIsJndwYXJhbSgzKSk7CSMgbW0wID0gdworCQkmcHhvcigibW0xIiwibW0xIik7CQkjIG1tMSA9IGNhcnJ5ID0gMAorCisJJnNldF9sYWJlbCgibXdfc3NlMl9sb29wIiwxNik7CisJCSZtb3ZkKCJtbTIiLCZEV1AoMCwkYSkpOwkjIG1tMiA9IGFbaV0KKwkJJnBtdWx1ZHEoIm1tMiIsIm1tMCIpOwkJIyBhW2ldICo9IHcKKwkJJmxlYSgkYSwmRFdQKDQsJGEpKTsKKwkJJnBhZGRxKCJtbTEiLCJtbTIiKTsJCSMgY2FycnkgKz0gYVtpXSp3CisJCSZtb3ZkKCZEV1AoMCwkciksIm1tMSIpOwkjIHJbaV0gPSBjYXJyeV9sb3cKKwkJJnN1YigkYywxKTsKKwkJJnBzcmxxKCJtbTEiLDMyKTsJCSMgY2FycnkgPSBjYXJyeV9oaWdoCisJCSZsZWEoJHIsJkRXUCg0LCRyKSk7CisJCSZqbnooJmxhYmVsKCJtd19zc2UyX2xvb3AiKSk7CisKKwkJJm1vdmQoImVheCIsIm1tMSIpOwkJIyByZXR1cm4gY2FycnkKKwkJJmVtbXMoKTsKKwkJJnJldCgpOworCSZzZXRfbGFiZWwoIm13X25vbl9zc2UyIiwxNik7CisJfQorCisJIyBmdW5jdGlvbl9iZWdpbiBwcm9sb2d1ZQorCSZwdXNoKCJlYnAiKTsKKwkmcHVzaCgiZWJ4Iik7CisJJnB1c2goImVzaSIpOworCSZwdXNoKCJlZGkiKTsKKworCSZjb21tZW50KCIiKTsKKwkkTG93PSJlYXgiOworCSRIaWdoPSJlZHgiOworCSRhPSJlYngiOworCSR3PSJlY3giOworCSRyPSJlZGkiOworCSRjPSJlc2kiOworCSRudW09ImVicCI7CisKKwkmeG9yKCRjLCRjKTsJCSMgY2xlYXIgY2FycnkKKwkmbW92KCRyLCZ3cGFyYW0oMCkpOwkjCisJJm1vdigkYSwmd3BhcmFtKDEpKTsJIworCSZtb3YoJG51bSwmd3BhcmFtKDIpKTsJIworCSZtb3YoJHcsJndwYXJhbSgzKSk7CSMKKworCSZhbmQoJG51bSwweGZmZmZmZmY4KTsJIyBudW0gLyA4CisJJmp6KCZsYWJlbCgibXdfZmluaXNoIikpOworCisJJnNldF9sYWJlbCgibXdfbG9vcCIsMCk7CisJZm9yICgkaT0wOyAkaTwzMjsgJGkrPTQpCisJCXsKKwkJJmNvbW1lbnQoIlJvdW5kICRpIik7CisKKwkJICZtb3YoImVheCIsJkRXUCgkaSwkYSwiIiwwKSk7IAkjICphCisJCSZtdWwoJHcpOwkJCSMgKmEgKiB3CisJCSZhZGQoImVheCIsJGMpOwkJCSMgTCh0KSs9YworCQkgIyBYWFgKKworCQkmYWRjKCJlZHgiLDApOwkJCSMgSCh0KSs9Y2FycnkKKwkJICZtb3YoJkRXUCgkaSwkciwiIiwwKSwiZWF4Iik7CSMgKnI9IEwodCk7CisKKwkJJm1vdigkYywiZWR4Iik7CQkJIyBjPSAgSCh0KTsKKwkJfQorCisJJmNvbW1lbnQoIiIpOworCSZhZGQoJGEsMzIpOworCSZhZGQoJHIsMzIpOworCSZzdWIoJG51bSw4KTsKKwkmanooJmxhYmVsKCJtd19maW5pc2giKSk7CisJJmptcCgmbGFiZWwoIm13X2xvb3AiKSk7CisKKwkmc2V0X2xhYmVsKCJtd19maW5pc2giLDApOworCSZtb3YoJG51bSwmd3BhcmFtKDIpKTsJIyBnZXQgbnVtCisJJmFuZCgkbnVtLDcpOworCSZqbnooJmxhYmVsKCJtd19maW5pc2gyIikpOworCSZqbXAoJmxhYmVsKCJtd19lbmQiKSk7CisKKwkmc2V0X2xhYmVsKCJtd19maW5pc2gyIiwxKTsKKwlmb3IgKCRpPTA7ICRpPDc7ICRpKyspCisJCXsKKwkJJmNvbW1lbnQoIlRhaWwgUm91bmQgJGkiKTsKKwkJICZtb3YoImVheCIsJkRXUCgkaSo0LCRhLCIiLDApKTsjICphCisJCSZtdWwoJHcpOwkJCSMgKmEgKiB3CisJCSZhZGQoImVheCIsJGMpOwkJCSMgTCh0KSs9YworCQkgIyBYWFgKKwkJJmFkYygiZWR4IiwwKTsJCQkjIEgodCkrPWNhcnJ5CisJCSAmbW92KCZEV1AoJGkqNCwkciwiIiwwKSwiZWF4Iik7IyAqcj0gTCh0KTsKKwkJJm1vdigkYywiZWR4Iik7CQkJIyBjPSAgSCh0KTsKKwkJICZkZWMoJG51bSkgaWYgKCRpICE9IDctMSk7CisJCSZqeigmbGFiZWwoIm13X2VuZCIpKSBpZiAoJGkgIT0gNy0xKTsKKwkJfQorCSZzZXRfbGFiZWwoIm13X2VuZCIsMCk7CisJJm1vdigiZWF4IiwkYyk7CisKKwkmZnVuY3Rpb25fZW5kKCRuYW1lKTsKKwl9CisKK3N1YiBibl9zcXJfd29yZHMKKwl7CisJbG9jYWwoJG5hbWUpPUBfOworCisJJmZ1bmN0aW9uX2JlZ2luX0IoJG5hbWUsJHNzZTI/IkVYVFJOXHRfT1BFTlNTTF9pYTMyY2FwX1A6RFdPUkQiOiIiKTsKKworCSRyPSJlYXgiOworCSRhPSJlZHgiOworCSRjPSJlY3giOworCisJaWYgKCRzc2UyKSB7CisJCSZwaWNtZXVwKCJlYXgiLCJPUEVOU1NMX2lhMzJjYXBfUCIpOworCQkmYnQoJkRXUCgwLCJlYXgiKSwyNik7CisJCSZqbmMoJmxhYmVsKCJzcXJfbm9uX3NzZTIiKSk7CisKKwkJJm1vdigkciwmd3BhcmFtKDApKTsKKwkJJm1vdigkYSwmd3BhcmFtKDEpKTsKKwkJJm1vdigkYywmd3BhcmFtKDIpKTsKKworCSZzZXRfbGFiZWwoInNxcl9zc2UyX2xvb3AiLDE2KTsKKwkJJm1vdmQoIm1tMCIsJkRXUCgwLCRhKSk7CSMgbW0wID0gYVtpXQorCQkmcG11bHVkcSgibW0wIiwibW0wIik7CQkjIGFbaV0gKj0gYVtpXQorCQkmbGVhKCRhLCZEV1AoNCwkYSkpOwkJIyBhKysKKwkJJm1vdnEoJlFXUCgwLCRyKSwibW0wIik7CSMgcltpXSA9IGFbaV0qYVtpXQorCQkmc3ViKCRjLDEpOworCQkmbGVhKCRyLCZEV1AoOCwkcikpOwkJIyByICs9IDIKKwkJJmpueigmbGFiZWwoInNxcl9zc2UyX2xvb3AiKSk7CisKKwkJJmVtbXMoKTsKKwkJJnJldCgpOworCSZzZXRfbGFiZWwoInNxcl9ub25fc3NlMiIsMTYpOworCX0KKworCSMgZnVuY3Rpb25fYmVnaW4gcHJvbG9ndWUKKwkmcHVzaCgiZWJwIik7CisJJnB1c2goImVieCIpOworCSZwdXNoKCJlc2kiKTsKKwkmcHVzaCgiZWRpIik7CisKKwkmY29tbWVudCgiIik7CisJJHI9ImVzaSI7CisJJGE9ImVkaSI7CisJJG51bT0iZWJ4IjsKKworCSZtb3YoJHIsJndwYXJhbSgwKSk7CSMKKwkmbW92KCRhLCZ3cGFyYW0oMSkpOwkjCisJJm1vdigkbnVtLCZ3cGFyYW0oMikpOwkjCisKKwkmYW5kKCRudW0sMHhmZmZmZmZmOCk7CSMgbnVtIC8gOAorCSZqeigmbGFiZWwoInN3X2ZpbmlzaCIpKTsKKworCSZzZXRfbGFiZWwoInN3X2xvb3AiLDApOworCWZvciAoJGk9MDsgJGk8MzI7ICRpKz00KQorCQl7CisJCSZjb21tZW50KCJSb3VuZCAkaSIpOworCQkmbW92KCJlYXgiLCZEV1AoJGksJGEsIiIsMCkpOyAJIyAqYQorCQkgIyBYWFgKKwkJJm11bCgiZWF4Iik7CQkJIyAqYSAqICphCisJCSZtb3YoJkRXUCgkaSoyLCRyLCIiLDApLCJlYXgiKTsJIworCQkgJm1vdigmRFdQKCRpKjIrNCwkciwiIiwwKSwiZWR4Iik7IworCQl9CisKKwkmY29tbWVudCgiIik7CisJJmFkZCgkYSwzMik7CisJJmFkZCgkciw2NCk7CisJJnN1YigkbnVtLDgpOworCSZqbnooJmxhYmVsKCJzd19sb29wIikpOworCisJJnNldF9sYWJlbCgic3dfZmluaXNoIiwwKTsKKwkmbW92KCRudW0sJndwYXJhbSgyKSk7CSMgZ2V0IG51bQorCSZhbmQoJG51bSw3KTsKKwkmanooJmxhYmVsKCJzd19lbmQiKSk7CisKKwlmb3IgKCRpPTA7ICRpPDc7ICRpKyspCisJCXsKKwkJJmNvbW1lbnQoIlRhaWwgUm91bmQgJGkiKTsKKwkJJm1vdigiZWF4IiwmRFdQKCRpKjQsJGEsIiIsMCkpOwkjICphCisJCSAjIFhYWAorCQkmbXVsKCJlYXgiKTsJCQkjICphICogKmEKKwkJJm1vdigmRFdQKCRpKjgsJHIsIiIsMCksImVheCIpOwkjCisJCSAmZGVjKCRudW0pIGlmICgkaSAhPSA3LTEpOworCQkmbW92KCZEV1AoJGkqOCs0LCRyLCIiLDApLCJlZHgiKTsKKwkJICZqeigmbGFiZWwoInN3X2VuZCIpKSBpZiAoJGkgIT0gNy0xKTsKKwkJfQorCSZzZXRfbGFiZWwoInN3X2VuZCIsMCk7CisKKwkmZnVuY3Rpb25fZW5kKCRuYW1lKTsKKwl9CisKK3N1YiBibl9kaXZfd29yZHMKKwl7CisJbG9jYWwoJG5hbWUpPUBfOworCisJJmZ1bmN0aW9uX2JlZ2luX0IoJG5hbWUsIiIpOworCSZtb3YoImVkeCIsJndwYXJhbSgwKSk7CSMKKwkmbW92KCJlYXgiLCZ3cGFyYW0oMSkpOwkjCisJJm1vdigiZWN4Iiwmd3BhcmFtKDIpKTsJIworCSZkaXYoImVjeCIpOworCSZyZXQoKTsKKwkmZnVuY3Rpb25fZW5kX0IoJG5hbWUpOworCX0KKworc3ViIGJuX2FkZF93b3JkcworCXsKKwlsb2NhbCgkbmFtZSk9QF87CisKKwkmZnVuY3Rpb25fYmVnaW4oJG5hbWUsIiIpOworCisJJmNvbW1lbnQoIiIpOworCSRhPSJlc2kiOworCSRiPSJlZGkiOworCSRjPSJlYXgiOworCSRyPSJlYngiOworCSR0bXAxPSJlY3giOworCSR0bXAyPSJlZHgiOworCSRudW09ImVicCI7CisKKwkmbW92KCRyLCZ3cGFyYW0oMCkpOwkjIGdldCByCisJICZtb3YoJGEsJndwYXJhbSgxKSk7CSMgZ2V0IGEKKwkmbW92KCRiLCZ3cGFyYW0oMikpOwkjIGdldCBiCisJICZtb3YoJG51bSwmd3BhcmFtKDMpKTsJIyBnZXQgbnVtCisJJnhvcigkYywkYyk7CQkjIGNsZWFyIGNhcnJ5CisJICZhbmQoJG51bSwweGZmZmZmZmY4KTsJIyBudW0gLyA4CisKKwkmanooJmxhYmVsKCJhd19maW5pc2giKSk7CisKKwkmc2V0X2xhYmVsKCJhd19sb29wIiwwKTsKKwlmb3IgKCRpPTA7ICRpPDg7ICRpKyspCisJCXsKKwkJJmNvbW1lbnQoIlJvdW5kICRpIik7CisKKwkJJm1vdigkdG1wMSwmRFdQKCRpKjQsJGEsIiIsMCkpOyAJIyAqYQorCQkgJm1vdigkdG1wMiwmRFdQKCRpKjQsJGIsIiIsMCkpOyAJIyAqYgorCQkmYWRkKCR0bXAxLCRjKTsKKwkJICZtb3YoJGMsMCk7CisJCSZhZGMoJGMsJGMpOworCQkgJmFkZCgkdG1wMSwkdG1wMik7CisJCSZhZGMoJGMsMCk7CisJCSAmbW92KCZEV1AoJGkqNCwkciwiIiwwKSwkdG1wMSk7IAkjICpyCisJCX0KKworCSZjb21tZW50KCIiKTsKKwkmYWRkKCRhLDMyKTsKKwkgJmFkZCgkYiwzMik7CisJJmFkZCgkciwzMik7CisJICZzdWIoJG51bSw4KTsKKwkmam56KCZsYWJlbCgiYXdfbG9vcCIpKTsKKworCSZzZXRfbGFiZWwoImF3X2ZpbmlzaCIsMCk7CisJJm1vdigkbnVtLCZ3cGFyYW0oMykpOwkjIGdldCBudW0KKwkmYW5kKCRudW0sNyk7CisJICZqeigmbGFiZWwoImF3X2VuZCIpKTsKKworCWZvciAoJGk9MDsgJGk8NzsgJGkrKykKKwkJeworCQkmY29tbWVudCgiVGFpbCBSb3VuZCAkaSIpOworCQkmbW92KCR0bXAxLCZEV1AoJGkqNCwkYSwiIiwwKSk7CSMgKmEKKwkJICZtb3YoJHRtcDIsJkRXUCgkaSo0LCRiLCIiLDApKTsjICpiCisJCSZhZGQoJHRtcDEsJGMpOworCQkgJm1vdigkYywwKTsKKwkJJmFkYygkYywkYyk7CisJCSAmYWRkKCR0bXAxLCR0bXAyKTsKKwkJJmFkYygkYywwKTsKKwkJICZkZWMoJG51bSkgaWYgKCRpICE9IDYpOworCQkmbW92KCZEV1AoJGkqNCwkciwiIiwwKSwkdG1wMSk7CSMgKnIKKwkJICZqeigmbGFiZWwoImF3X2VuZCIpKSBpZiAoJGkgIT0gNik7CisJCX0KKwkmc2V0X2xhYmVsKCJhd19lbmQiLDApOworCisjCSZtb3YoImVheCIsJGMpOwkJIyAkYyBpcyAiZWF4IgorCisJJmZ1bmN0aW9uX2VuZCgkbmFtZSk7CisJfQorCitzdWIgYm5fc3ViX3dvcmRzCisJeworCWxvY2FsKCRuYW1lKT1AXzsKKworCSZmdW5jdGlvbl9iZWdpbigkbmFtZSwiIik7CisKKwkmY29tbWVudCgiIik7CisJJGE9ImVzaSI7CisJJGI9ImVkaSI7CisJJGM9ImVheCI7CisJJHI9ImVieCI7CisJJHRtcDE9ImVjeCI7CisJJHRtcDI9ImVkeCI7CisJJG51bT0iZWJwIjsKKworCSZtb3YoJHIsJndwYXJhbSgwKSk7CSMgZ2V0IHIKKwkgJm1vdigkYSwmd3BhcmFtKDEpKTsJIyBnZXQgYQorCSZtb3YoJGIsJndwYXJhbSgyKSk7CSMgZ2V0IGIKKwkgJm1vdigkbnVtLCZ3cGFyYW0oMykpOwkjIGdldCBudW0KKwkmeG9yKCRjLCRjKTsJCSMgY2xlYXIgY2FycnkKKwkgJmFuZCgkbnVtLDB4ZmZmZmZmZjgpOwkjIG51bSAvIDgKKworCSZqeigmbGFiZWwoImF3X2ZpbmlzaCIpKTsKKworCSZzZXRfbGFiZWwoImF3X2xvb3AiLDApOworCWZvciAoJGk9MDsgJGk8ODsgJGkrKykKKwkJeworCQkmY29tbWVudCgiUm91bmQgJGkiKTsKKworCQkmbW92KCR0bXAxLCZEV1AoJGkqNCwkYSwiIiwwKSk7IAkjICphCisJCSAmbW92KCR0bXAyLCZEV1AoJGkqNCwkYiwiIiwwKSk7IAkjICpiCisJCSZzdWIoJHRtcDEsJGMpOworCQkgJm1vdigkYywwKTsKKwkJJmFkYygkYywkYyk7CisJCSAmc3ViKCR0bXAxLCR0bXAyKTsKKwkJJmFkYygkYywwKTsKKwkJICZtb3YoJkRXUCgkaSo0LCRyLCIiLDApLCR0bXAxKTsgCSMgKnIKKwkJfQorCisJJmNvbW1lbnQoIiIpOworCSZhZGQoJGEsMzIpOworCSAmYWRkKCRiLDMyKTsKKwkmYWRkKCRyLDMyKTsKKwkgJnN1YigkbnVtLDgpOworCSZqbnooJmxhYmVsKCJhd19sb29wIikpOworCisJJnNldF9sYWJlbCgiYXdfZmluaXNoIiwwKTsKKwkmbW92KCRudW0sJndwYXJhbSgzKSk7CSMgZ2V0IG51bQorCSZhbmQoJG51bSw3KTsKKwkgJmp6KCZsYWJlbCgiYXdfZW5kIikpOworCisJZm9yICgkaT0wOyAkaTw3OyAkaSsrKQorCQl7CisJCSZjb21tZW50KCJUYWlsIFJvdW5kICRpIik7CisJCSZtb3YoJHRtcDEsJkRXUCgkaSo0LCRhLCIiLDApKTsJIyAqYQorCQkgJm1vdigkdG1wMiwmRFdQKCRpKjQsJGIsIiIsMCkpOyMgKmIKKwkJJnN1YigkdG1wMSwkYyk7CisJCSAmbW92KCRjLDApOworCQkmYWRjKCRjLCRjKTsKKwkJICZzdWIoJHRtcDEsJHRtcDIpOworCQkmYWRjKCRjLDApOworCQkgJmRlYygkbnVtKSBpZiAoJGkgIT0gNik7CisJCSZtb3YoJkRXUCgkaSo0LCRyLCIiLDApLCR0bXAxKTsJIyAqcgorCQkgJmp6KCZsYWJlbCgiYXdfZW5kIikpIGlmICgkaSAhPSA2KTsKKwkJfQorCSZzZXRfbGFiZWwoImF3X2VuZCIsMCk7CisKKyMJJm1vdigiZWF4IiwkYyk7CQkjICRjIGlzICJlYXgiCisKKwkmZnVuY3Rpb25fZW5kKCRuYW1lKTsKKwl9CisKK3N1YiBibl9zdWJfcGFydF93b3JkcworCXsKKwlsb2NhbCgkbmFtZSk9QF87CisKKwkmZnVuY3Rpb25fYmVnaW4oJG5hbWUsIiIpOworCisJJmNvbW1lbnQoIiIpOworCSRhPSJlc2kiOworCSRiPSJlZGkiOworCSRjPSJlYXgiOworCSRyPSJlYngiOworCSR0bXAxPSJlY3giOworCSR0bXAyPSJlZHgiOworCSRudW09ImVicCI7CisKKwkmbW92KCRyLCZ3cGFyYW0oMCkpOwkjIGdldCByCisJICZtb3YoJGEsJndwYXJhbSgxKSk7CSMgZ2V0IGEKKwkmbW92KCRiLCZ3cGFyYW0oMikpOwkjIGdldCBiCisJICZtb3YoJG51bSwmd3BhcmFtKDMpKTsJIyBnZXQgbnVtCisJJnhvcigkYywkYyk7CQkjIGNsZWFyIGNhcnJ5CisJICZhbmQoJG51bSwweGZmZmZmZmY4KTsJIyBudW0gLyA4CisKKwkmanooJmxhYmVsKCJhd19maW5pc2giKSk7CisKKwkmc2V0X2xhYmVsKCJhd19sb29wIiwwKTsKKwlmb3IgKCRpPTA7ICRpPDg7ICRpKyspCisJCXsKKwkJJmNvbW1lbnQoIlJvdW5kICRpIik7CisKKwkJJm1vdigkdG1wMSwmRFdQKCRpKjQsJGEsIiIsMCkpOyAJIyAqYQorCQkgJm1vdigkdG1wMiwmRFdQKCRpKjQsJGIsIiIsMCkpOyAJIyAqYgorCQkmc3ViKCR0bXAxLCRjKTsKKwkJICZtb3YoJGMsMCk7CisJCSZhZGMoJGMsJGMpOworCQkgJnN1YigkdG1wMSwkdG1wMik7CisJCSZhZGMoJGMsMCk7CisJCSAmbW92KCZEV1AoJGkqNCwkciwiIiwwKSwkdG1wMSk7IAkjICpyCisJCX0KKworCSZjb21tZW50KCIiKTsKKwkmYWRkKCRhLDMyKTsKKwkgJmFkZCgkYiwzMik7CisJJmFkZCgkciwzMik7CisJICZzdWIoJG51bSw4KTsKKwkmam56KCZsYWJlbCgiYXdfbG9vcCIpKTsKKworCSZzZXRfbGFiZWwoImF3X2ZpbmlzaCIsMCk7CisJJm1vdigkbnVtLCZ3cGFyYW0oMykpOwkjIGdldCBudW0KKwkmYW5kKCRudW0sNyk7CisJICZqeigmbGFiZWwoImF3X2VuZCIpKTsKKworCWZvciAoJGk9MDsgJGk8NzsgJGkrKykKKwkJeworCQkmY29tbWVudCgiVGFpbCBSb3VuZCAkaSIpOworCQkmbW92KCR0bXAxLCZEV1AoMCwkYSwiIiwwKSk7CSMgKmEKKwkJICZtb3YoJHRtcDIsJkRXUCgwLCRiLCIiLDApKTsjICpiCisJCSZzdWIoJHRtcDEsJGMpOworCQkgJm1vdigkYywwKTsKKwkJJmFkYygkYywkYyk7CisJCSAmc3ViKCR0bXAxLCR0bXAyKTsKKwkJJmFkYygkYywwKTsKKwkJJm1vdigmRFdQKDAsJHIsIiIsMCksJHRtcDEpOwkjICpyCisJCSZhZGQoJGEsIDQpOworCQkmYWRkKCRiLCA0KTsKKwkJJmFkZCgkciwgNCk7CisJCSAmZGVjKCRudW0pIGlmICgkaSAhPSA2KTsKKwkJICZqeigmbGFiZWwoImF3X2VuZCIpKSBpZiAoJGkgIT0gNik7CisJCX0KKwkmc2V0X2xhYmVsKCJhd19lbmQiLDApOworCisJJmNtcCgmd3BhcmFtKDQpLDApOworCSZqZSgmbGFiZWwoInB3X2VuZCIpKTsKKworCSZtb3YoJG51bSwmd3BhcmFtKDQpKTsJIyBnZXQgZGwKKwkmY21wKCRudW0sMCk7CisJJmplKCZsYWJlbCgicHdfZW5kIikpOworCSZqZ2UoJmxhYmVsKCJwd19wb3MiKSk7CisKKwkmY29tbWVudCgicHdfbmVnIik7CisJJm1vdigkdG1wMiwwKTsKKwkmc3ViKCR0bXAyLCRudW0pOworCSZtb3YoJG51bSwkdG1wMik7CisJJmFuZCgkbnVtLDB4ZmZmZmZmZjgpOwkjIG51bSAvIDgKKwkmanooJmxhYmVsKCJwd19uZWdfZmluaXNoIikpOworCisJJnNldF9sYWJlbCgicHdfbmVnX2xvb3AiLDApOworCWZvciAoJGk9MDsgJGk8ODsgJGkrKykKKwl7CisJICAgICZjb21tZW50KCJkbDwwIFJvdW5kICRpIik7CisKKwkgICAgJm1vdigkdG1wMSwwKTsKKwkgICAgJm1vdigkdG1wMiwmRFdQKCRpKjQsJGIsIiIsMCkpOyAJIyAqYgorCSAgICAmc3ViKCR0bXAxLCRjKTsKKwkgICAgJm1vdigkYywwKTsKKwkgICAgJmFkYygkYywkYyk7CisJICAgICZzdWIoJHRtcDEsJHRtcDIpOworCSAgICAmYWRjKCRjLDApOworCSAgICAmbW92KCZEV1AoJGkqNCwkciwiIiwwKSwkdG1wMSk7IAkjICpyCisJfQorCSAgICAKKwkmY29tbWVudCgiIik7CisJJmFkZCgkYiwzMik7CisJJmFkZCgkciwzMik7CisJJnN1YigkbnVtLDgpOworCSZqbnooJmxhYmVsKCJwd19uZWdfbG9vcCIpKTsKKwkgICAgCisJJnNldF9sYWJlbCgicHdfbmVnX2ZpbmlzaCIsMCk7CisJJm1vdigkdG1wMiwmd3BhcmFtKDQpKTsJIyBnZXQgZGwKKwkmbW92KCRudW0sMCk7CisJJnN1YigkbnVtLCR0bXAyKTsKKwkmYW5kKCRudW0sNyk7CisJJmp6KCZsYWJlbCgicHdfZW5kIikpOworCSAgICAKKwlmb3IgKCRpPTA7ICRpPDc7ICRpKyspCisJeworCSAgICAmY29tbWVudCgiZGw8MCBUYWlsIFJvdW5kICRpIik7CisJICAgICZtb3YoJHRtcDEsMCk7CisJICAgICZtb3YoJHRtcDIsJkRXUCgkaSo0LCRiLCIiLDApKTsjICpiCisJICAgICZzdWIoJHRtcDEsJGMpOworCSAgICAmbW92KCRjLDApOworCSAgICAmYWRjKCRjLCRjKTsKKwkgICAgJnN1YigkdG1wMSwkdG1wMik7CisJICAgICZhZGMoJGMsMCk7CisJICAgICZkZWMoJG51bSkgaWYgKCRpICE9IDYpOworCSAgICAmbW92KCZEV1AoJGkqNCwkciwiIiwwKSwkdG1wMSk7CSMgKnIKKwkgICAgJmp6KCZsYWJlbCgicHdfZW5kIikpIGlmICgkaSAhPSA2KTsKKwl9CisKKwkmam1wKCZsYWJlbCgicHdfZW5kIikpOworCQorCSZzZXRfbGFiZWwoInB3X3BvcyIsMCk7CisJCisJJmFuZCgkbnVtLDB4ZmZmZmZmZjgpOwkjIG51bSAvIDgKKwkmanooJmxhYmVsKCJwd19wb3NfZmluaXNoIikpOworCisJJnNldF9sYWJlbCgicHdfcG9zX2xvb3AiLDApOworCisJZm9yICgkaT0wOyAkaTw4OyAkaSsrKQorCXsKKwkgICAgJmNvbW1lbnQoImRsPjAgUm91bmQgJGkiKTsKKworCSAgICAmbW92KCR0bXAxLCZEV1AoJGkqNCwkYSwiIiwwKSk7CSMgKmEKKwkgICAgJnN1YigkdG1wMSwkYyk7CisJICAgICZtb3YoJkRXUCgkaSo0LCRyLCIiLDApLCR0bXAxKTsJIyAqcgorCSAgICAmam5jKCZsYWJlbCgicHdfbmMiLiRpKSk7CisJfQorCSAgICAKKwkmY29tbWVudCgiIik7CisJJmFkZCgkYSwzMik7CisJJmFkZCgkciwzMik7CisJJnN1YigkbnVtLDgpOworCSZqbnooJmxhYmVsKCJwd19wb3NfbG9vcCIpKTsKKwkgICAgCisJJnNldF9sYWJlbCgicHdfcG9zX2ZpbmlzaCIsMCk7CisJJm1vdigkbnVtLCZ3cGFyYW0oNCkpOwkjIGdldCBkbAorCSZhbmQoJG51bSw3KTsKKwkmanooJmxhYmVsKCJwd19lbmQiKSk7CisJICAgIAorCWZvciAoJGk9MDsgJGk8NzsgJGkrKykKKwl7CisJICAgICZjb21tZW50KCJkbD4wIFRhaWwgUm91bmQgJGkiKTsKKwkgICAgJm1vdigkdG1wMSwmRFdQKCRpKjQsJGEsIiIsMCkpOwkjICphCisJICAgICZzdWIoJHRtcDEsJGMpOworCSAgICAmbW92KCZEV1AoJGkqNCwkciwiIiwwKSwkdG1wMSk7CSMgKnIKKwkgICAgJmpuYygmbGFiZWwoInB3X3RhaWxfbmMiLiRpKSk7CisJICAgICZkZWMoJG51bSkgaWYgKCRpICE9IDYpOworCSAgICAmanooJmxhYmVsKCJwd19lbmQiKSkgaWYgKCRpICE9IDYpOworCX0KKwkmbW92KCRjLDEpOworCSZqbXAoJmxhYmVsKCJwd19lbmQiKSk7CisKKwkmc2V0X2xhYmVsKCJwd19uY19sb29wIiwwKTsKKwlmb3IgKCRpPTA7ICRpPDg7ICRpKyspCisJeworCSAgICAmbW92KCR0bXAxLCZEV1AoJGkqNCwkYSwiIiwwKSk7CSMgKmEKKwkgICAgJm1vdigmRFdQKCRpKjQsJHIsIiIsMCksJHRtcDEpOwkjICpyCisJICAgICZzZXRfbGFiZWwoInB3X25jIi4kaSwwKTsKKwl9CisJICAgIAorCSZjb21tZW50KCIiKTsKKwkmYWRkKCRhLDMyKTsKKwkmYWRkKCRyLDMyKTsKKwkmc3ViKCRudW0sOCk7CisJJmpueigmbGFiZWwoInB3X25jX2xvb3AiKSk7CisJICAgIAorCSZtb3YoJG51bSwmd3BhcmFtKDQpKTsJIyBnZXQgZGwKKwkmYW5kKCRudW0sNyk7CisJJmp6KCZsYWJlbCgicHdfbmNfZW5kIikpOworCSAgICAKKwlmb3IgKCRpPTA7ICRpPDc7ICRpKyspCisJeworCSAgICAmbW92KCR0bXAxLCZEV1AoJGkqNCwkYSwiIiwwKSk7CSMgKmEKKwkgICAgJm1vdigmRFdQKCRpKjQsJHIsIiIsMCksJHRtcDEpOwkjICpyCisJICAgICZzZXRfbGFiZWwoInB3X3RhaWxfbmMiLiRpLDApOworCSAgICAmZGVjKCRudW0pIGlmICgkaSAhPSA2KTsKKwkgICAgJmp6KCZsYWJlbCgicHdfbmNfZW5kIikpIGlmICgkaSAhPSA2KTsKKwl9CisKKwkmc2V0X2xhYmVsKCJwd19uY19lbmQiLDApOworCSZtb3YoJGMsMCk7CisKKwkmc2V0X2xhYmVsKCJwd19lbmQiLDApOworCisjCSZtb3YoImVheCIsJGMpOwkJIyAkYyBpcyAiZWF4IgorCisJJmZ1bmN0aW9uX2VuZCgkbmFtZSk7CisJfQorCmRpZmYgLS1naXQgYS9jcnlwdG8vYm4vYXNtL2NvLTU4Ni5wbCBiL2NyeXB0by9ibi9hc20vY28tNTg2LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MTAxYTYKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYm4vYXNtL2NvLTU4Ni5wbApAQCAtMCwwICsxLDI4NyBAQAorIyEvdXNyL2xvY2FsL2Jpbi9wZXJsCisKKyQwID1+IG0vKC4qW1wvXFxdKVteXC9cXF0rJC87ICRkaXI9JDE7CitwdXNoKEBJTkMsIiR7ZGlyfSIsIiR7ZGlyfS4uLy4uL3Blcmxhc20iKTsKK3JlcXVpcmUgIng4NmFzbS5wbCI7CisKKyZhc21faW5pdCgkQVJHVlswXSwkMCk7CisKKyZibl9tdWxfY29tYmEoImJuX211bF9jb21iYTgiLDgpOworJmJuX211bF9jb21iYSgiYm5fbXVsX2NvbWJhNCIsNCk7CismYm5fc3FyX2NvbWJhKCJibl9zcXJfY29tYmE4Iiw4KTsKKyZibl9zcXJfY29tYmEoImJuX3Nxcl9jb21iYTQiLDQpOworCismYXNtX2ZpbmlzaCgpOworCitzdWIgbXVsX2FkZF9jCisJeworCWxvY2FsKCRhLCRhaSwkYiwkYmksJGMwLCRjMSwkYzIsJHBvcywkaSwkbmEsJG5iKT1AXzsKKworCSMgcG9zID09IC0xIGlmIGVheCBhbmQgZWR4IGFyZSBwcmUtbG9hZGVkLCAwIHRvIGxvYWQgZnJvbSBuZXh0CisJIyB3b3JkcywgYW5kIDEgaWYgbG9hZCByZXR1cm4gdmFsdWUKKworCSZjb21tZW50KCJtdWwgYVskYWldKmJbJGJpXSIpOworCisJIyAiZWF4IiBhbmQgImVkeCIgd2lsbCBhbHdheXMgYmUgcHJlLWxvYWRlZC4KKwkjICZtb3YoImVheCIsJkRXUCgkYWkqNCwkYSwiIiwwKSkgOworCSMgJm1vdigiZWR4IiwmRFdQKCRiaSo0LCRiLCIiLDApKTsKKworCSZtdWwoImVkeCIpOworCSZhZGQoJGMwLCJlYXgiKTsKKwkgJm1vdigiZWF4IiwmRFdQKCgkbmEpKjQsJGEsIiIsMCkpIGlmICRwb3MgPT0gMDsJIyBsYW9kIG5leHQgYQorCSAmbW92KCJlYXgiLCZ3cGFyYW0oMCkpIGlmICRwb3MgPiAwOwkJCSMgbG9hZCByW10KKwkgIyMjCisJJmFkYygkYzEsImVkeCIpOworCSAmbW92KCJlZHgiLCZEV1AoKCRuYikqNCwkYiwiIiwwKSkgaWYgJHBvcyA9PSAwOwkjIGxhb2QgbmV4dCBiCisJICZtb3YoImVkeCIsJkRXUCgoJG5iKSo0LCRiLCIiLDApKSBpZiAkcG9zID09IDE7CSMgbGFvZCBuZXh0IGIKKwkgIyMjCisJJmFkYygkYzIsMCk7CisJICMgaXMgcG9zID4gMSwgaXQgbWVhbnMgaXQgaXMgdGhlIGxhc3QgbG9vcCAKKwkgJm1vdigmRFdQKCRpKjQsImVheCIsIiIsMCksJGMwKSBpZiAkcG9zID4gMDsJCSMgc2F2ZSByW107CisJJm1vdigiZWF4IiwmRFdQKCgkbmEpKjQsJGEsIiIsMCkpIGlmICRwb3MgPT0gMTsJCSMgbGFvZCBuZXh0IGEKKwl9CisKK3N1YiBzcXJfYWRkX2MKKwl7CisJbG9jYWwoJHIsJGEsJGFpLCRiaSwkYzAsJGMxLCRjMiwkcG9zLCRpLCRuYSwkbmIpPUBfOworCisJIyBwb3MgPT0gLTEgaWYgZWF4IGFuZCBlZHggYXJlIHByZS1sb2FkZWQsIDAgdG8gbG9hZCBmcm9tIG5leHQKKwkjIHdvcmRzLCBhbmQgMSBpZiBsb2FkIHJldHVybiB2YWx1ZQorCisJJmNvbW1lbnQoInNxciBhWyRhaV0qYVskYmldIik7CisKKwkjICJlYXgiIGFuZCAiZWR4IiB3aWxsIGFsd2F5cyBiZSBwcmUtbG9hZGVkLgorCSMgJm1vdigiZWF4IiwmRFdQKCRhaSo0LCRhLCIiLDApKSA7CisJIyAmbW92KCJlZHgiLCZEV1AoJGJpKjQsJGIsIiIsMCkpOworCisJaWYgKCRhaSA9PSAkYmkpCisJCXsgJm11bCgiZWF4Iik7fQorCWVsc2UKKwkJeyAmbXVsKCJlZHgiKTt9CisJJmFkZCgkYzAsImVheCIpOworCSAmbW92KCJlYXgiLCZEV1AoKCRuYSkqNCwkYSwiIiwwKSkgaWYgJHBvcyA9PSAwOwkjIGxvYWQgbmV4dCBhCisJICMjIworCSZhZGMoJGMxLCJlZHgiKTsKKwkgJm1vdigiZWR4IiwmRFdQKCgkbmIpKjQsJGEsIiIsMCkpIGlmICgkcG9zID09IDEpICYmICgkbmEgIT0gJG5iKTsKKwkgIyMjCisJJmFkYygkYzIsMCk7CisJICMgaXMgcG9zID4gMSwgaXQgbWVhbnMgaXQgaXMgdGhlIGxhc3QgbG9vcCAKKwkgJm1vdigmRFdQKCRpKjQsJHIsIiIsMCksJGMwKSBpZiAkcG9zID4gMDsJCSMgc2F2ZSByW107CisJJm1vdigiZWF4IiwmRFdQKCgkbmEpKjQsJGEsIiIsMCkpIGlmICRwb3MgPT0gMTsJCSMgbG9hZCBuZXh0IGIKKwl9CisKK3N1YiBzcXJfYWRkX2MyCisJeworCWxvY2FsKCRyLCRhLCRhaSwkYmksJGMwLCRjMSwkYzIsJHBvcywkaSwkbmEsJG5iKT1AXzsKKworCSMgcG9zID09IC0xIGlmIGVheCBhbmQgZWR4IGFyZSBwcmUtbG9hZGVkLCAwIHRvIGxvYWQgZnJvbSBuZXh0CisJIyB3b3JkcywgYW5kIDEgaWYgbG9hZCByZXR1cm4gdmFsdWUKKworCSZjb21tZW50KCJzcXIgYVskYWldKmFbJGJpXSIpOworCisJIyAiZWF4IiBhbmQgImVkeCIgd2lsbCBhbHdheXMgYmUgcHJlLWxvYWRlZC4KKwkjICZtb3YoImVheCIsJkRXUCgkYWkqNCwkYSwiIiwwKSkgOworCSMgJm1vdigiZWR4IiwmRFdQKCRiaSo0LCRhLCIiLDApKTsKKworCWlmICgkYWkgPT0gJGJpKQorCQl7ICZtdWwoImVheCIpO30KKwllbHNlCisJCXsgJm11bCgiZWR4Iik7fQorCSZhZGQoImVheCIsImVheCIpOworCSAjIyMKKwkmYWRjKCJlZHgiLCJlZHgiKTsKKwkgIyMjCisJJmFkYygkYzIsMCk7CisJICZhZGQoJGMwLCJlYXgiKTsKKwkmYWRjKCRjMSwiZWR4Iik7CisJICZtb3YoImVheCIsJkRXUCgoJG5hKSo0LCRhLCIiLDApKSBpZiAkcG9zID09IDA7CSMgbG9hZCBuZXh0IGEKKwkgJm1vdigiZWF4IiwmRFdQKCgkbmEpKjQsJGEsIiIsMCkpIGlmICRwb3MgPT0gMTsJIyBsb2FkIG5leHQgYgorCSZhZGMoJGMyLDApOworCSZtb3YoJkRXUCgkaSo0LCRyLCIiLDApLCRjMCkgaWYgJHBvcyA+IDA7CQkjIHNhdmUgcltdOworCSAmbW92KCJlZHgiLCZEV1AoKCRuYikqNCwkYSwiIiwwKSkgaWYgKCRwb3MgPD0gMSkgJiYgKCRuYSAhPSAkbmIpOworCSAjIyMKKwl9CisKK3N1YiBibl9tdWxfY29tYmEKKwl7CisJbG9jYWwoJG5hbWUsJG51bSk9QF87CisJbG9jYWwoJGEsJGIsJGMwLCRjMSwkYzIpOworCWxvY2FsKCRpLCRhcywkYWUsJGJzLCRiZSwkYWksJGJpKTsKKwlsb2NhbCgkdG90LCRlbmQpOworCisJJmZ1bmN0aW9uX2JlZ2luX0IoJG5hbWUsIiIpOworCisJJGMwPSJlYngiOworCSRjMT0iZWN4IjsKKwkkYzI9ImVicCI7CisJJGE9ImVzaSI7CisJJGI9ImVkaSI7CisJCisJJGFzPTA7CisJJGFlPTA7CisJJGJzPTA7CisJJGJlPTA7CisJJHRvdD0kbnVtKyRudW0tMTsKKworCSZwdXNoKCJlc2kiKTsKKwkgJm1vdigkYSwmd3BhcmFtKDEpKTsKKwkmcHVzaCgiZWRpIik7CisJICZtb3YoJGIsJndwYXJhbSgyKSk7CisJJnB1c2goImVicCIpOworCSAmcHVzaCgiZWJ4Iik7CisKKwkmeG9yKCRjMCwkYzApOworCSAmbW92KCJlYXgiLCZEV1AoMCwkYSwiIiwwKSk7CSMgbG9hZCB0aGUgZmlyc3Qgd29yZCAKKwkmeG9yKCRjMSwkYzEpOworCSAmbW92KCJlZHgiLCZEV1AoMCwkYiwiIiwwKSk7CSMgbG9hZCB0aGUgZmlyc3Qgc2Vjb25kIAorCisJZm9yICgkaT0wOyAkaTwkdG90OyAkaSsrKQorCQl7CisJCSRhaT0kYXM7CisJCSRiaT0kYnM7CisJCSRlbmQ9JGJlKzE7CisKKwkJJmNvbW1lbnQoIiMjIyMjIyMjIyMjIyMjIyMjIyBDYWxjdWxhdGUgd29yZCAkaSIpOyAKKworCQlmb3IgKCRqPSRiczsgJGo8JGVuZDsgJGorKykKKwkJCXsKKwkJCSZ4b3IoJGMyLCRjMikgaWYgKCRqID09ICRicyk7CisJCQlpZiAoKCRqKzEpID09ICRlbmQpCisJCQkJeworCQkJCSR2PTE7CisJCQkJJHY9MiBpZiAoKCRpKzEpID09ICR0b3QpOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7ICR2PTA7IH0KKwkJCWlmICgoJGorMSkgIT0gJGVuZCkKKwkJCQl7CisJCQkJJG5hPSgkYWktMSk7CisJCQkJJG5iPSgkYmkrMSk7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQkkbmE9JGFzKygkaSA8ICgkbnVtLTEpKTsKKwkJCQkkbmI9JGJzKygkaSA+PSAoJG51bS0xKSk7CisJCQkJfQorI3ByaW50ZiBTVERFUlIgIlskYWksJGJpXSAtPiBbJG5hLCRuYl1cbiI7CisJCQkmbXVsX2FkZF9jKCRhLCRhaSwkYiwkYmksJGMwLCRjMSwkYzIsJHYsJGksJG5hLCRuYik7CisJCQlpZiAoJHYpCisJCQkJeworCQkJCSZjb21tZW50KCJzYXZlZCByWyRpXSIpOworCQkJCSMgJm1vdigiZWF4Iiwmd3BhcmFtKDApKTsKKwkJCQkjICZtb3YoJkRXUCgkaSo0LCJlYXgiLCIiLDApLCRjMCk7CisJCQkJKCRjMCwkYzEsJGMyKT0oJGMxLCRjMiwkYzApOworCQkJCX0KKwkJCSRhaS0tOworCQkJJGJpKys7CisJCQl9CisJCSRhcysrIGlmICgkaSA8ICgkbnVtLTEpKTsKKwkJJGFlKysgaWYgKCRpID49ICgkbnVtLTEpKTsKKworCQkkYnMrKyBpZiAoJGkgPj0gKCRudW0tMSkpOworCQkkYmUrKyBpZiAoJGkgPCAoJG51bS0xKSk7CisJCX0KKwkmY29tbWVudCgic2F2ZSByWyRpXSIpOworCSMgJm1vdigiZWF4Iiwmd3BhcmFtKDApKTsKKwkmbW92KCZEV1AoJGkqNCwiZWF4IiwiIiwwKSwkYzApOworCisJJnBvcCgiZWJ4Iik7CisJJnBvcCgiZWJwIik7CisJJnBvcCgiZWRpIik7CisJJnBvcCgiZXNpIik7CisJJnJldCgpOworCSZmdW5jdGlvbl9lbmRfQigkbmFtZSk7CisJfQorCitzdWIgYm5fc3FyX2NvbWJhCisJeworCWxvY2FsKCRuYW1lLCRudW0pPUBfOworCWxvY2FsKCRyLCRhLCRjMCwkYzEsJGMyKT1AXzsKKwlsb2NhbCgkaSwkYXMsJGFlLCRicywkYmUsJGFpLCRiaSk7CisJbG9jYWwoJGIsJHRvdCwkZW5kLCRoYWxmKTsKKworCSZmdW5jdGlvbl9iZWdpbl9CKCRuYW1lLCIiKTsKKworCSRjMD0iZWJ4IjsKKwkkYzE9ImVjeCI7CisJJGMyPSJlYnAiOworCSRhPSJlc2kiOworCSRyPSJlZGkiOworCisJJnB1c2goImVzaSIpOworCSAmcHVzaCgiZWRpIik7CisJJnB1c2goImVicCIpOworCSAmcHVzaCgiZWJ4Iik7CisJJm1vdigkciwmd3BhcmFtKDApKTsKKwkgJm1vdigkYSwmd3BhcmFtKDEpKTsKKwkmeG9yKCRjMCwkYzApOworCSAmeG9yKCRjMSwkYzEpOworCSZtb3YoImVheCIsJkRXUCgwLCRhLCIiLDApKTsgIyBsb2FkIHRoZSBmaXJzdCB3b3JkCisKKwkkYXM9MDsKKwkkYWU9MDsKKwkkYnM9MDsKKwkkYmU9MDsKKwkkdG90PSRudW0rJG51bS0xOworCisJZm9yICgkaT0wOyAkaTwkdG90OyAkaSsrKQorCQl7CisJCSRhaT0kYXM7CisJCSRiaT0kYnM7CisJCSRlbmQ9JGJlKzE7CisKKwkJJmNvbW1lbnQoIiMjIyMjIyMjIyMjIyMjIyBDYWxjdWxhdGUgd29yZCAkaSIpOworCQlmb3IgKCRqPSRiczsgJGo8JGVuZDsgJGorKykKKwkJCXsKKwkJCSZ4b3IoJGMyLCRjMikgaWYgKCRqID09ICRicyk7CisJCQlpZiAoKCRhaS0xKSA8ICgkYmkrMSkpCisJCQkJeworCQkJCSR2PTE7CisJCQkJJHY9MiBpZiAoJGkrMSkgPT0gJHRvdDsKKwkJCQl9CisJCQllbHNlCisJCQkJeyAkdj0wOyB9CisJCQlpZiAoISR2KQorCQkJCXsKKwkJCQkkbmE9JGFpLTE7CisJCQkJJG5iPSRiaSsxOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJJG5hPSRhcysoJGkgPCAoJG51bS0xKSk7CisJCQkJJG5iPSRicysoJGkgPj0gKCRudW0tMSkpOworCQkJCX0KKwkJCWlmICgkYWkgPT0gJGJpKQorCQkJCXsKKwkJCQkmc3FyX2FkZF9jKCRyLCRhLCRhaSwkYmksCisJCQkJCSRjMCwkYzEsJGMyLCR2LCRpLCRuYSwkbmIpOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJJnNxcl9hZGRfYzIoJHIsJGEsJGFpLCRiaSwKKwkJCQkJJGMwLCRjMSwkYzIsJHYsJGksJG5hLCRuYik7CisJCQkJfQorCQkJaWYgKCR2KQorCQkJCXsKKwkJCQkmY29tbWVudCgic2F2ZWQgclskaV0iKTsKKwkJCQkjJm1vdigmRFdQKCRpKjQsJHIsIiIsMCksJGMwKTsKKwkJCQkoJGMwLCRjMSwkYzIpPSgkYzEsJGMyLCRjMCk7CisJCQkJbGFzdDsKKwkJCQl9CisJCQkkYWktLTsKKwkJCSRiaSsrOworCQkJfQorCQkkYXMrKyBpZiAoJGkgPCAoJG51bS0xKSk7CisJCSRhZSsrIGlmICgkaSA+PSAoJG51bS0xKSk7CisKKwkJJGJzKysgaWYgKCRpID49ICgkbnVtLTEpKTsKKwkJJGJlKysgaWYgKCRpIDwgKCRudW0tMSkpOworCQl9CisJJm1vdigmRFdQKCRpKjQsJHIsIiIsMCksJGMwKTsKKwkmcG9wKCJlYngiKTsKKwkmcG9wKCJlYnAiKTsKKwkmcG9wKCJlZGkiKTsKKwkmcG9wKCJlc2kiKTsKKwkmcmV0KCk7CisJJmZ1bmN0aW9uX2VuZF9CKCRuYW1lKTsKKwl9CmRpZmYgLS1naXQgYS9jcnlwdG8vYm4vYXNtL21vZGV4cDUxMi14ODZfNjQucGwgYi9jcnlwdG8vYm4vYXNtL21vZGV4cDUxMi14ODZfNjQucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZkNmU5NwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9ibi9hc20vbW9kZXhwNTEyLXg4Nl82NC5wbApAQCAtMCwwICsxLDE0OTcgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgSW50ZWwgQ29ycC4KKyMgICBBdXRob3I6IFZpbm9kaC5Hb3BhbEBpbnRlbC5jb20KKyMgICAgICAgICAgIEppbSBHdWlsZm9yZAorIyAgICAgICAgICAgRXJkaW5jLk96dHVya0BpbnRlbC5jb20KKyMgICAgICAgICAgIE1heGltLlBlcm1pbm92QGludGVsLmNvbQorIworIyBNb3JlIGluZm9ybWF0aW9uIGFib3V0IGFsZ29yaXRobSB1c2VkIGNhbiBiZSBmb3VuZCBhdDoKKyMgICBodHRwOi8vd3d3LmNzZS5idWZmYWxvLmVkdS9zcmRzMjAwOS9lc2NzMjAwOV9zdWJtaXNzaW9uX0dvcGFsLnBkZgorIworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIworIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyMgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyAgICBkaXN0cmlidXRpb24uCisjCisjIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworIyAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyMgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorIyAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisjCisjIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworIyAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorIyAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisjICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyMKKyMgNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisjICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyMgICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorIworIyA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisjICAgIGFja25vd2xlZGdtZW50OgorIyAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisjICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyMgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyMgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyMgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyMgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisjIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisjIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyMgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisjIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworJGZsYXZvdXIgPSBzaGlmdDsKKyRvdXRwdXQgID0gc2hpZnQ7CitpZiAoJGZsYXZvdXIgPX4gL1wuLykgeyAkb3V0cHV0ID0gJGZsYXZvdXI7IHVuZGVmICRmbGF2b3VyOyB9CisKK215ICR3aW42ND0wOyAkd2luNjQ9MSBpZiAoJGZsYXZvdXIgPX4gL1tubV1hc218bWluZ3c2NC8gfHwgJG91dHB1dCA9fiAvXC5hc20kLyk7CisKKyQwID1+IG0vKC4qW1wvXFxdKVteXC9cXF0rJC87ICRkaXI9JDE7CisoICR4bGF0ZT0iJHtkaXJ9eDg2XzY0LXhsYXRlLnBsIiBhbmQgLWYgJHhsYXRlICkgb3IKKyggJHhsYXRlPSIke2Rpcn0uLi8uLi9wZXJsYXNtL3g4Nl82NC14bGF0ZS5wbCIgYW5kIC1mICR4bGF0ZSkgb3IKK2RpZSAiY2FuJ3QgbG9jYXRlIHg4Nl82NC14bGF0ZS5wbCI7CisKK29wZW4gT1VULCJ8IFwiJF5YXCIgJHhsYXRlICRmbGF2b3VyICRvdXRwdXQiOworKlNURE9VVD0qT1VUOworCit1c2Ugc3RyaWN0OworbXkgJGNvZGU9Ii50ZXh0XG5cbiI7CitteSAkbT0wOworCisjCisjIERlZmluZSB4NTEyIG1hY3JvcworIworCisjTVVMU1RFUF81MTJfQURECU1BQ1JPCXg3LCB4NiwgeDUsIHg0LCB4MywgeDIsIHgxLCB4MCwgZHN0LCBzcmMxLCBzcmMyLCBhZGRfc3JjLCB0bXAxLCB0bXAyCisjCisjIHVzZXMgcmF4LCByZHgsIGFuZCBhcmdzCitzdWIgTVVMU1RFUF81MTJfQURECit7CisgbXkgKCR4LCAkRFNULCAkU1JDMiwgJEFTUkMsICRPUCwgJFRNUCk9QF87CisgbXkgQFg9QCR4OwkjIG1ha2UgYSBjb3B5CiskY29kZS49PDxfX187CisJIG1vdgkoKzgqMCkoJFNSQzIpLCAlcmF4CisJIG11bAkkT1AJCQkjIHJkeDpyYXggPSAlT1AgKiBbMF0KKwkgbW92CSgkQVNSQyksICRYWzBdCisJIGFkZAklcmF4LCAkWFswXQorCSBhZGMJXCQwLCAlcmR4CisJIG1vdgkkWFswXSwgJERTVAorX19fCitmb3IobXkgJGk9MTskaTw4OyRpKyspIHsKKyRjb2RlLj08PF9fXzsKKwkgbW92CSVyZHgsICRUTVAKKworCSBtb3YJKCs4KiRpKSgkU1JDMiksICVyYXgKKwkgbXVsCSRPUAkJCSMgcmR4OnJheCA9ICVPUCAqIFskaV0KKwkgbW92CSgrOCokaSkoJEFTUkMpLCAkWFskaV0KKwkgYWRkCSVyYXgsICRYWyRpXQorCSBhZGMJXCQwLCAlcmR4CisJIGFkZAkkVE1QLCAkWFskaV0KKwkgYWRjCVwkMCwgJXJkeAorX19fCit9CiskY29kZS49PDxfX187CisJIG1vdgklcmR4LCAkWFswXQorX19fCit9CisKKyNNVUxTVEVQXzUxMglNQUNSTwl4NywgeDYsIHg1LCB4NCwgeDMsIHgyLCB4MSwgeDAsIGRzdCwgc3JjMiwgc3JjMV92YWwsIHRtcAorIworIyB1c2VzIHJheCwgcmR4LCBhbmQgYXJncworc3ViIE1VTFNURVBfNTEyCit7CisgbXkgKCR4LCAkRFNULCAkU1JDMiwgJE9QLCAkVE1QKT1AXzsKKyBteSBAWD1AJHg7CSMgbWFrZSBhIGNvcHkKKyRjb2RlLj08PF9fXzsKKwkgbW92CSgrOCowKSgkU1JDMiksICVyYXgKKwkgbXVsCSRPUAkJCSMgcmR4OnJheCA9ICVPUCAqIFswXQorCSBhZGQJJXJheCwgJFhbMF0KKwkgYWRjCVwkMCwgJXJkeAorCSBtb3YJJFhbMF0sICREU1QKK19fXworZm9yKG15ICRpPTE7JGk8ODskaSsrKSB7CiskY29kZS49PDxfX187CisJIG1vdgklcmR4LCAkVE1QCisKKwkgbW92CSgrOCokaSkoJFNSQzIpLCAlcmF4CisJIG11bAkkT1AJCQkjIHJkeDpyYXggPSAlT1AgKiBbJGldCisJIGFkZAklcmF4LCAkWFskaV0KKwkgYWRjCVwkMCwgJXJkeAorCSBhZGQJJFRNUCwgJFhbJGldCisJIGFkYwlcJDAsICVyZHgKK19fXworfQorJGNvZGUuPTw8X19fOworCSBtb3YJJXJkeCwgJFhbMF0KK19fXworfQorCisjCisjIFN3aXp6bGUgTWFjcm9zCisjCisKKyMgbWFjcm8gdG8gY29weSBkYXRhIGZyb20gZmxhdCBzcGFjZSB0byBzd2l6emxlZCB0YWJsZQorI01BQ1JPIHN3aXp6bGUJcERzdCwgcFNyYywgdG1wMSwgdG1wMgorIyBwRHN0IGFuZCBwU3JjIGFyZSBtb2RpZmllZAorc3ViIHN3aXp6bGUKK3sKKyBteSAoJHBEc3QsICRwU3JjLCAkY250LCAkZDApPUBfOworJGNvZGUuPTw8X19fOworCSBtb3YJXCQ4LCAkY250Citsb29wXyRtOgorCSBtb3YJKCRwU3JjKSwgJGQwCisJIG1vdgkkZDAjdywgKCRwRHN0KQorCSBzaHIJXCQxNiwgJGQwCisJIG1vdgkkZDAjdywgKCs2NCoxKSgkcERzdCkKKwkgc2hyCVwkMTYsICRkMAorCSBtb3YJJGQwI3csICgrNjQqMikoJHBEc3QpCisJIHNocglcJDE2LCAkZDAKKwkgbW92CSRkMCN3LCAoKzY0KjMpKCRwRHN0KQorCSBsZWEJOCgkcFNyYyksICRwU3JjCisJIGxlYQk2NCo0KCRwRHN0KSwgJHBEc3QKKwkgZGVjCSRjbnQKKwkgam56CWxvb3BfJG0KK19fXworCisgJG0rKzsKK30KKworIyBtYWNybyB0byBjb3B5IGRhdGEgZnJvbSBzd2l6emxlZCB0YWJsZSB0byAgZmxhdCBzcGFjZQorI01BQ1JPIHVuc3dpenpsZQlwRHN0LCBwU3JjLCB0bXAqMworc3ViIHVuc3dpenpsZQoreworIG15ICgkcERzdCwgJHBTcmMsICRjbnQsICRkMCwgJGQxKT1AXzsKKyRjb2RlLj08PF9fXzsKKwkgbW92CVwkNCwgJGNudAorbG9vcF8kbToKKwkgbW92enh3CSgrNjQqMysyNTYqMCkoJHBTcmMpLCAkZDAKKwkgbW92enh3CSgrNjQqMysyNTYqMSkoJHBTcmMpLCAkZDEKKwkgc2hsCVwkMTYsICRkMAorCSBzaGwJXCQxNiwgJGQxCisJIG1vdgkoKzY0KjIrMjU2KjApKCRwU3JjKSwgJGQwI3cKKwkgbW92CSgrNjQqMisyNTYqMSkoJHBTcmMpLCAkZDEjdworCSBzaGwJXCQxNiwgJGQwCisJIHNobAlcJDE2LCAkZDEKKwkgbW92CSgrNjQqMSsyNTYqMCkoJHBTcmMpLCAkZDAjdworCSBtb3YJKCs2NCoxKzI1NioxKSgkcFNyYyksICRkMSN3CisJIHNobAlcJDE2LCAkZDAKKwkgc2hsCVwkMTYsICRkMQorCSBtb3YJKCs2NCowKzI1NiowKSgkcFNyYyksICRkMCN3CisJIG1vdgkoKzY0KjArMjU2KjEpKCRwU3JjKSwgJGQxI3cKKwkgbW92CSRkMCwgKCs4KjApKCRwRHN0KQorCSBtb3YJJGQxLCAoKzgqMSkoJHBEc3QpCisJIGxlYQkyNTYqMigkcFNyYyksICRwU3JjCisJIGxlYQk4KjIoJHBEc3QpLCAkcERzdAorCSBzdWIJXCQxLCAkY250CisJIGpueglsb29wXyRtCitfX18KKworICRtKys7Cit9CisKKyMKKyMgRGF0YSBTdHJ1Y3R1cmVzCisjCisKKyMgUmVkdWNlIERhdGEKKyMKKyMKKyMgT2Zmc2V0ICBWYWx1ZQorIyAwQzAgICAgIENhcnJpZXMKKyMgMEI4ICAgICBYMlsxMF0KKyMgMEIwICAgICBYMls5XQorIyAwQTggICAgIFgyWzhdCisjIDBBMCAgICAgWDJbN10KKyMgMDk4ICAgICBYMls2XQorIyAwOTAgICAgIFgyWzVdCisjIDA4OCAgICAgWDJbNF0KKyMgMDgwICAgICBYMlszXQorIyAwNzggICAgIFgyWzJdCisjIDA3MCAgICAgWDJbMV0KKyMgMDY4ICAgICBYMlswXQorIyAwNjAgICAgIFgxWzEyXSAgUFsxMF0KKyMgMDU4ICAgICBYMVsxMV0gIFBbOV0gIFpbOF0KKyMgMDUwICAgICBYMVsxMF0gIFBbOF0gIFpbN10KKyMgMDQ4ICAgICBYMVs5XSAgIFBbN10gIFpbNl0KKyMgMDQwICAgICBYMVs4XSAgIFBbNl0gIFpbNV0KKyMgMDM4ICAgICBYMVs3XSAgIFBbNV0gIFpbNF0KKyMgMDMwICAgICBYMVs2XSAgIFBbNF0gIFpbM10KKyMgMDI4ICAgICBYMVs1XSAgIFBbM10gIFpbMl0KKyMgMDIwICAgICBYMVs0XSAgIFBbMl0gIFpbMV0KKyMgMDE4ICAgICBYMVszXSAgIFBbMV0gIFpbMF0KKyMgMDEwICAgICBYMVsyXSAgIFBbMF0gIFlbMl0KKyMgMDA4ICAgICBYMVsxXSAgIFFbMV0gIFlbMV0KKyMgMDAwICAgICBYMVswXSAgIFFbMF0gIFlbMF0KKworbXkgJFgxX29mZnNldCAgICAgICAgICAgPSAgMDsJCQkjIDEzIHF3b3JkcworbXkgJFgyX29mZnNldCAgICAgICAgICAgPSAgJFgxX29mZnNldCArIDEzKjg7CQkJIyAxMSBxd29yZHMKK215ICRDYXJyaWVzX29mZnNldCAgICAgID0gICRYMl9vZmZzZXQgKyAxMSo4OwkJCSMgMSBxd29yZAorbXkgJFFfb2Zmc2V0ICAgICAgICAgICAgPSAgMDsJCQkjIDIgcXdvcmRzCitteSAkUF9vZmZzZXQgICAgICAgICAgICA9ICAkUV9vZmZzZXQgKyAyKjg7CQkJIyAxMSBxd29yZHMKK215ICRZX29mZnNldCAgICAgICAgICAgID0gIDA7CQkJIyAzIHF3b3JkcworbXkgJFpfb2Zmc2V0ICAgICAgICAgICAgPSAgJFlfb2Zmc2V0ICsgMyo4OwkJCSMgOSBxd29yZHMKKworbXkgJFJlZF9EYXRhX1NpemUgICAgICAgPSAgJENhcnJpZXNfb2Zmc2V0ICsgMSo4OwkJCSMgKDI1IHF3b3JkcykKKworIworIyBTdGFjayBGcmFtZQorIworIworIyBvZmZzZXQJdmFsdWUKKyMgLi4uCQk8b2xkIHN0YWNrIGNvbnRlbnRzPgorIyAuLi4KKyMgMjgwCQlHYXJyYXkKKworIyAyNzgJCXRtcDE2WzE1XQorIyAuLi4JCS4uLgorIyAyMDAJCXRtcDE2WzBdCisKKyMgMUY4CQl0bXBbN10KKyMgLi4uCQkuLi4KKyMgMUMwCQl0bXBbMF0KKworIyAxQjgJCUdUWzddCisjIC4uLgkJLi4uCisjIDE4MAkJR1RbMF0KKworIyAxNzgJCVJlZHVjZSBEYXRhCisjIC4uLgkJLi4uCisjIDBCOAkJUmVkdWNlIERhdGEKKyMgMEIwCQlyZXNlcnZlZAorIyAwQTgJCXJlc2VydmVkCisjIDBBMAkJcmVzZXJ2ZWQKKyMgMDk4CQlyZXNlcnZlZAorIyAwOTAJCXJlc2VydmVkCisjIDA4OAkJcmVkdWNlIHJlc3VsdCBhZGRyCisjIDA4MAkJZXhwWzhdCisKKyMgLi4uCisjIDA0OAkJZXhwWzFdCisjIDA0MAkJZXhwWzBdCisKKyMgMDM4CQlyZXNlcnZlZAorIyAwMzAJCWxvb3BfaWR4CisjIDAyOAkJcGcKKyMgMDIwCQlpCisjIDAxOAkJcERhdGEJOyBhcmcgNAorIyAwMTAJCXBHCTsgYXJnIDIKKyMgMDA4CQlwUmVzdWx0CTsgYXJnIDEKKyMgMDAwCQlyc3AJOyBzdGFjayBwb2ludGVyIGJlZm9yZSBzdWJ0cmFjdAorCitteSAkcnNwX29mZnNldCAgICAgICAgICA9ICAwOworbXkgJHBSZXN1bHRfb2Zmc2V0ICAgICAgPSAgOCoxICsgJHJzcF9vZmZzZXQ7CitteSAkcEdfb2Zmc2V0ICAgICAgICAgICA9ICA4KjEgKyAkcFJlc3VsdF9vZmZzZXQ7CitteSAkcERhdGFfb2Zmc2V0ICAgICAgICA9ICA4KjEgKyAkcEdfb2Zmc2V0OworbXkgJGlfb2Zmc2V0ICAgICAgICAgICAgPSAgOCoxICsgJHBEYXRhX29mZnNldDsKK215ICRwZ19vZmZzZXQgICAgICAgICAgID0gIDgqMSArICRpX29mZnNldDsKK215ICRsb29wX2lkeF9vZmZzZXQgICAgID0gIDgqMSArICRwZ19vZmZzZXQ7CitteSAkcmVzZXJ2ZWQxX29mZnNldCAgICA9ICA4KjEgKyAkbG9vcF9pZHhfb2Zmc2V0OworbXkgJGV4cF9vZmZzZXQgICAgICAgICAgPSAgOCoxICsgJHJlc2VydmVkMV9vZmZzZXQ7CitteSAkcmVkX3Jlc3VsdF9hZGRyX29mZnNldD0gIDgqOSArICRleHBfb2Zmc2V0OworbXkgJHJlc2VydmVkMl9vZmZzZXQgICAgPSAgOCoxICsgJHJlZF9yZXN1bHRfYWRkcl9vZmZzZXQ7CitteSAkUmVkdWNlX0RhdGFfb2Zmc2V0ICA9ICA4KjUgKyAkcmVzZXJ2ZWQyX29mZnNldDsKK215ICRHVF9vZmZzZXQgICAgICAgICAgID0gICRSZWRfRGF0YV9TaXplICsgJFJlZHVjZV9EYXRhX29mZnNldDsKK215ICR0bXBfb2Zmc2V0ICAgICAgICAgID0gIDgqOCArICRHVF9vZmZzZXQ7CitteSAkdG1wMTZfb2Zmc2V0ICAgICAgICA9ICA4KjggKyAkdG1wX29mZnNldDsKK215ICRnYXJyYXlfb2Zmc2V0ICAgICAgID0gIDgqMTYgKyAkdG1wMTZfb2Zmc2V0OworbXkgJG1lbV9zaXplICAgICAgICAgICAgPSAgOCo4KjMyICsgJGdhcnJheV9vZmZzZXQ7CisKKyMKKyMgT2Zmc2V0cyB3aXRoaW4gUmVkdWNlIERhdGEKKyMKKyMKKyMJc3RydWN0IE1PREZfMkZPTERfTU9OVF81MTJfQzFfREFUQSB7CisjCVVJTlQ2NCB0WzhdWzhdOworIwlVSU5UNjQgbVs4XTsKKyMJVUlOVDY0IG0xWzhdOyAvKiAyXjc2OCAlIG0gKi8KKyMJVUlOVDY0IG0yWzhdOyAvKiAyXjY0MCAlIG0gKi8KKyMJVUlOVDY0IGsxWzJdOyAvKiAoLSAxL20pICUgMl4xMjggKi8KKyMJfTsKKworbXkgJFQgICAgICAgICAgICAgICAgICAgPSAgMDsKK215ICRNICAgICAgICAgICAgICAgICAgID0gIDUxMjsJCQkjID0gOCAqIDggKiA4CitteSAkTTEgICAgICAgICAgICAgICAgICA9ICA1NzY7CQkJIyA9IDggKiA4ICogOSAvKiArPSA4ICogOCAqLworbXkgJE0yICAgICAgICAgICAgICAgICAgPSAgNjQwOwkJCSMgPSA4ICogOCAqIDEwIC8qICs9IDggKiA4ICovCitteSAkSzEgICAgICAgICAgICAgICAgICA9ICA3MDQ7CQkJIyA9IDggKiA4ICogMTEgLyogKz0gOCAqIDggKi8KKworIworIyAgIEZVTkNUSU9OUworIworCit7e3sKKyMKKyMgTVVMQUREXzEyOHg1MTIgOiBGdW5jdGlvbiB0byBtdWx0aXBseSAxMjgtYml0cyAoMiBxd29yZHMpIGJ5IDUxMi1iaXRzICg4IHF3b3JkcykKKyMgICAgICAgICAgICAgICAgICAgICAgIGFuZCBhZGQgNTEyLWJpdHMgKDggcXdvcmRzKQorIyAgICAgICAgICAgICAgICAgICAgICAgdG8gZ2V0IDY0MCBiaXRzICgxMCBxd29yZHMpCisjIElucHV0OiAxMjgtYml0IG11bCBzb3VyY2U6IFtyZGkrOCoxXSwgcmJwCisjICAgICAgICA1MTItYml0IG11bCBzb3VyY2U6IFtyc2krOCpuXQorIyAgICAgICAgNTEyLWJpdCBhZGQgc291cmNlOiByMTUsIHIxNCwgLi4uLCByOSwgcjgKKyMgT3V0cHV0OiByOSwgcjgsIHIxNSwgcjE0LCByMTMsIHIxMiwgcjExLCByMTAsIFtyY3grOCoxXSwgW3JjeCs4KjBdCisjIENsb2JiZXJzIGFsbCByZWdzIGV4Y2VwdDogcmN4LCByc2ksIHJkaQorJGNvZGUuPTw8X19fOworLnR5cGUJTVVMQUREXzEyOHg1MTIsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2CitNVUxBRERfMTI4eDUxMjoKK19fXworCSZNVUxTVEVQXzUxMihbbWFwKCIlciRfIiwoOC4uMTUpKV0sICIoKzgqMCkoJXJjeCkiLCAiJXJzaSIsICIlcmJwIiwgIiVyYngiKTsKKyRjb2RlLj08PF9fXzsKKwkgbW92CSgrOCoxKSglcmRpKSwgJXJicAorX19fCisJJk1VTFNURVBfNTEyKFttYXAoIiVyJF8iLCg5Li4xNSw4KSldLCAiKCs4KjEpKCVyY3gpIiwgIiVyc2kiLCAiJXJicCIsICIlcmJ4Iik7CiskY29kZS49PDxfX187CisJIHJldAorLnNpemUJTVVMQUREXzEyOHg1MTIsLi1NVUxBRERfMTI4eDUxMgorX19fCit9fX0KKwore3t7CisjTVVMQUREXzI1Nng1MTIJTUFDUk8JcERzdCwgcEEsIHBCLCBPUCwgVE1QLCBYNywgWDYsIFg1LCBYNCwgWDMsIFgyLCBYMSwgWDAKKyMKKyMgSW5wdXRzOiBwRHN0OiBEZXN0aW5hdGlvbiAgKDc2OCBiaXRzLCAxMiBxd29yZHMpCisjICAgICAgICAgcEE6ICAgTXVsdGlwbGljYW5kICgxMDI0IGJpdHMsIDE2IHF3b3JkcykKKyMgICAgICAgICBwQjogICBNdWx0aXBsaWNhbmQgKDUxMiBiaXRzLCA4IHF3b3JkcykKKyMgRHN0ID0gQWggKiBCICsgQWwKKyMgd2hlcmUgQWggaXMgKGluIHF3b3JkcykgQVsxNToxMl0gKDI1NiBiaXRzKSBhbmQgQWwgaXMgQVs3OjBdICg1MTIgYml0cykKKyMgUmVzdWx0cyBpbiBYMyBYMiBYMSBYMCBYNyBYNiBYNSBYNCBEc3RbMzowXQorIyBVc2VzIHJlZ2lzdGVyczogYXJndW1lbnRzLCBSQVgsIFJEWAorc3ViIE1VTEFERF8yNTZ4NTEyCit7CisgbXkgKCRwRHN0LCAkcEEsICRwQiwgJE9QLCAkVE1QLCAkWCk9QF87CiskY29kZS49PDxfX187CisJbW92CSgrOCoxMikoJHBBKSwgJE9QCitfX18KKwkmTVVMU1RFUF81MTJfQUREKCRYLCAiKCs4KjApKCRwRHN0KSIsICRwQiwgJHBBLCAkT1AsICRUTVApOworCXB1c2goQCRYLHNoaWZ0KEAkWCkpOworCiskY29kZS49PDxfX187CisJIG1vdgkoKzgqMTMpKCRwQSksICRPUAorX19fCisJJk1VTFNURVBfNTEyKCRYLCAiKCs4KjEpKCRwRHN0KSIsICRwQiwgJE9QLCAkVE1QKTsKKwlwdXNoKEAkWCxzaGlmdChAJFgpKTsKKworJGNvZGUuPTw8X19fOworCSBtb3YJKCs4KjE0KSgkcEEpLCAkT1AKK19fXworCSZNVUxTVEVQXzUxMigkWCwgIigrOCoyKSgkcERzdCkiLCAkcEIsICRPUCwgJFRNUCk7CisJcHVzaChAJFgsc2hpZnQoQCRYKSk7CisKKyRjb2RlLj08PF9fXzsKKwkgbW92CSgrOCoxNSkoJHBBKSwgJE9QCitfX18KKwkmTVVMU1RFUF81MTIoJFgsICIoKzgqMykoJHBEc3QpIiwgJHBCLCAkT1AsICRUTVApOworCXB1c2goQCRYLHNoaWZ0KEAkWCkpOworfQorCisjCisjIG1vbnRfcmVkdWNlKFVJTlQ2NCAqeCwgIC8qIDEwMjQgYml0cywgMTYgcXdvcmRzICovCisjCSAgICAgICBVSU5UNjQgKm0sICAvKiAgNTEyIGJpdHMsICA4IHF3b3JkcyAqLworIwkgICAgICAgTU9ERl8yRk9MRF9NT05UXzUxMl9DMV9EQVRBICpkYXRhLAorIyAgICAgICAgICAgICBVSU5UNjQgKnIpICAvKiAgNTEyIGJpdHMsICA4IHF3b3JkcyAqLworIyBJbnB1dDogIHggKG51bWJlciB0byBiZSByZWR1Y2VkKTogdG1wMTYgKEltcGxpY2l0KQorIyAgICAgICAgIG0gKG1vZHVsdXMpOiAgICAgICAgICAgICAgW3BNXSAgKEltcGxpY2l0KQorIyAgICAgICAgIGRhdGEgKHJlZHVjZSBkYXRhKTogICAgICAgW3BEYXRhXSAoSW1wbGljaXQpCisjIE91dHB1dDogciAocmVzdWx0KToJCSAgICAgQWRkcmVzcyBpbiBbcmVkX3Jlc19hZGRyXQorIyAgICAgICAgIHJlc3VsdCBhbHNvIGluOiByOSwgcjgsIHIxNSwgcjE0LCByMTMsIHIxMiwgcjExLCByMTAKKworbXkgQFg9bWFwKCIlciRfIiwoOC4uMTUpKTsKKworJGNvZGUuPTw8X19fOworLnR5cGUJbW9udF9yZWR1Y2UsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2Cittb250X3JlZHVjZToKK19fXworCitteSAkU1RBQ0tfREVQVEggICAgICAgICA9ICA4OworCSMKKwkjIFgxID0gWGggKiBNMSArIFhsCiskY29kZS49PDxfX187CisJIGxlYQkoKyRSZWR1Y2VfRGF0YV9vZmZzZXQrJFgxX29mZnNldCskU1RBQ0tfREVQVEgpKCVyc3ApLCAlcmRpCQkJIyBwWDEgKERzdCkgNzY5IGJpdHMsIDEzIHF3b3JkcworCSBtb3YJKCskcERhdGFfb2Zmc2V0KyRTVEFDS19ERVBUSCkoJXJzcCksICVyc2kJCQkjIHBNMSAoQnNyYykgNTEyIGJpdHMsIDggcXdvcmRzCisJIGFkZAlcJCRNMSwgJXJzaQorCSBsZWEJKCskdG1wMTZfb2Zmc2V0KyRTVEFDS19ERVBUSCkoJXJzcCksICVyY3gJCQkjIFggKEFzcmMpIDEwMjQgYml0cywgMTYgcXdvcmRzCisKK19fXworCisJJk1VTEFERF8yNTZ4NTEyKCIlcmRpIiwgIiVyY3giLCAiJXJzaSIsICIlcmJwIiwgIiVyYngiLCBcQFgpOwkjIHJvdGF0ZXMgQFggNCB0aW1lcworCSMgcmVzdWx0cyBpbiByMTEsIHIxMCwgcjksIHI4LCByMTUsIHIxNCwgcjEzLCByMTIsIFgxWzM6MF0KKworJGNvZGUuPTw8X19fOworCSB4b3IJJXJheCwgJXJheAorCSMgWDEgKz0geGwKKwkgYWRkCSgrOCo4KSglcmN4KSwgJFhbNF0KKwkgYWRjCSgrOCo5KSglcmN4KSwgJFhbNV0KKwkgYWRjCSgrOCoxMCkoJXJjeCksICRYWzZdCisJIGFkYwkoKzgqMTEpKCVyY3gpLCAkWFs3XQorCSBhZGMJXCQwLCAlcmF4CisJIyBYMSBpcyBub3cgcmF4LCByMTEtcjgsIHIxNS1yMTIsIHRtcDE2WzM6MF0KKworCSMKKwkjIGNoZWNrIGZvciBjYXJyeSA7OyBjYXJyeSBzdG9yZWQgaW4gcmF4CisJIG1vdgkkWFs0XSwgKCs4KjgpKCVyZGkpCQkJIyByZGkgcG9pbnRzIHRvIFgxCisJIG1vdgkkWFs1XSwgKCs4KjkpKCVyZGkpCisJIG1vdgkkWFs2XSwgJXJicAorCSBtb3YJJFhbN10sICgrOCoxMSkoJXJkaSkKKworCSBtb3YJJXJheCwgKCskUmVkdWNlX0RhdGFfb2Zmc2V0KyRDYXJyaWVzX29mZnNldCskU1RBQ0tfREVQVEgpKCVyc3ApCisKKwkgbW92CSgrOCowKSglcmRpKSwgJFhbNF0KKwkgbW92CSgrOCoxKSglcmRpKSwgJFhbNV0KKwkgbW92CSgrOCoyKSglcmRpKSwgJFhbNl0KKwkgbW92CSgrOCozKSglcmRpKSwgJFhbN10KKworCSMgWDEgaXMgbm93IHN0b3JlZCBpbjogWDFbMTFdLCByYnAsIFgxWzk6OF0sIHIxNS1yOAorCSMgcmRpIC0+IFgxCisJIyByc2kgLT4gTTEKKworCSMKKwkjIFgyID0gWGggKiBNMiArIFhsCisJIyBkbyBmaXJzdCBwYXJ0IChYMiA9IFhoICogTTIpCisJIGFkZAlcJDgqMTAsICVyZGkJCQkjIHJkaSAtPiBwWGggOyAxMjggYml0cywgMiBxd29yZHMKKwkJCQkjICAgICAgICBYaCBpcyBhY3R1YWxseSB7IFtyZGkrOCoxXSwgcmJwIH0KKwkgYWRkCVwkYCRNMi0kTTFgLCAlcnNpCQkJIyByc2kgLT4gTTIKKwkgbGVhCSgrJFJlZHVjZV9EYXRhX29mZnNldCskWDJfb2Zmc2V0KyRTVEFDS19ERVBUSCkoJXJzcCksICVyY3gJCQkjIHJjeCAtPiBwWDIgOyA2NDEgYml0cywgMTEgcXdvcmRzCitfX18KKwl1bnNoaWZ0KEBYLHBvcChAWCkpOwl1bnNoaWZ0KEBYLHBvcChAWCkpOworJGNvZGUuPTw8X19fOworCisJIGNhbGwJTVVMQUREXzEyOHg1MTIJCQkjIGFyZ3MgaW4gcmN4LCByZGkgLyByYnAsIHJzaSwgcjE1LXI4CisJIyByZXN1bHQgaW4gcjksIHI4LCByMTUsIHIxNCwgcjEzLCByMTIsIHIxMSwgcjEwLCBYMlsxOjBdCisJIG1vdgkoKyRSZWR1Y2VfRGF0YV9vZmZzZXQrJENhcnJpZXNfb2Zmc2V0KyRTVEFDS19ERVBUSCkoJXJzcCksICVyYXgKKworCSMgWDIgKz0gWGwKKwkgYWRkCSgrOCo4LTgqMTApKCVyZGkpLCAkWFs2XQkJIyAoLTgqMTApIGlzIHRvIGFkanVzdCByZGkgLT4gWGggdG8gWGwKKwkgYWRjCSgrOCo5LTgqMTApKCVyZGkpLCAkWFs3XQorCSBtb3YJJFhbNl0sICgrOCo4KSglcmN4KQorCSBtb3YJJFhbN10sICgrOCo5KSglcmN4KQorCisJIGFkYwklcmF4LCAlcmF4CisJIG1vdgklcmF4LCAoKyRSZWR1Y2VfRGF0YV9vZmZzZXQrJENhcnJpZXNfb2Zmc2V0KyRTVEFDS19ERVBUSCkoJXJzcCkKKworCSBsZWEJKCskUmVkdWNlX0RhdGFfb2Zmc2V0KyRRX29mZnNldCskU1RBQ0tfREVQVEgpKCVyc3ApLCAlcmRpCQkJIyByZGkgLT4gcFEgOyAxMjggYml0cywgMiBxd29yZHMKKwkgYWRkCVwkYCRLMS0kTTJgLCAlcnNpCQkJIyByc2kgLT4gcEsxIDsgMTI4IGJpdHMsIDIgcXdvcmRzCisKKwkjIE1VTF8xMjh4MTI4dDEyOAlyZGksIHJjeCwgcnNpCTsgUSA9IFgyICogSzEgKGJvdHRvbSBoYWxmKQorCSMgQjE6QjAgPSByc2lbMTowXSA9IEsxWzE6MF0KKwkjIEExOkEwID0gcmN4WzE6MF0gPSBYMlsxOjBdCisJIyBSZXN1bHQgPSByZGlbMV0scmJwID0gUVsxXSxyYnAKKwkgbW92CSglcnNpKSwgJXI4CQkJIyBCMAorCSBtb3YJKCs4KjEpKCVyc2kpLCAlcmJ4CQkJIyBCMQorCisJIG1vdgkoJXJjeCksICVyYXgJCQkjIEEwCisJIG11bAklcjgJCQkjIEIwCisJIG1vdgklcmF4LCAlcmJwCisJIG1vdgklcmR4LCAlcjkKKworCSBtb3YJKCs4KjEpKCVyY3gpLCAlcmF4CQkJIyBBMQorCSBtdWwJJXI4CQkJIyBCMAorCSBhZGQJJXJheCwgJXI5CisKKwkgbW92CSglcmN4KSwgJXJheAkJCSMgQTAKKwkgbXVsCSVyYngJCQkjIEIxCisJIGFkZAklcmF4LCAlcjkKKworCSBtb3YJJXI5LCAoKzgqMSkoJXJkaSkKKwkjIGVuZCBNVUxfMTI4eDEyOHQxMjgKKworCSBzdWIJXCRgJEsxLSRNYCwgJXJzaQorCisJIG1vdgkoJXJjeCksICRYWzZdCisJIG1vdgkoKzgqMSkoJXJjeCksICRYWzddCQkJIyByOTpyOCA9IFgyWzE6MF0KKworCSBjYWxsCU1VTEFERF8xMjh4NTEyCQkJIyBhcmdzIGluIHJjeCwgcmRpIC8gcmJwLCByc2ksIHIxNS1yOAorCSMgcmVzdWx0IGluIHI5LCByOCwgcjE1LCByMTQsIHIxMywgcjEyLCByMTEsIHIxMCwgWDJbMTowXQorCisJIyBsb2FkIGZpcnN0IGhhbGYgb2YgbSB0byByZHgsIHJkaSwgcmJ4LCByYXgKKwkjIG1vdmVkIHRoaXMgaGVyZSBmb3IgZWZmaWNpZW5jeQorCSBtb3YJKCs4KjApKCVyc2kpLCAlcmF4CisJIG1vdgkoKzgqMSkoJXJzaSksICVyYngKKwkgbW92CSgrOCoyKSglcnNpKSwgJXJkaQorCSBtb3YJKCs4KjMpKCVyc2kpLCAlcmR4CisKKwkjIGNvbnRpbnVlIHdpdGggcmVkdWN0aW9uCisJIG1vdgkoKyRSZWR1Y2VfRGF0YV9vZmZzZXQrJENhcnJpZXNfb2Zmc2V0KyRTVEFDS19ERVBUSCkoJXJzcCksICVyYnAKKworCSBhZGQJKCs4KjgpKCVyY3gpLCAkWFs2XQorCSBhZGMJKCs4KjkpKCVyY3gpLCAkWFs3XQorCisJI2FjY3VtdWxhdGUgdGhlIGZpbmFsIGNhcnJ5IHRvIHJicAorCSBhZGMJJXJicCwgJXJicAorCisJIyBBZGQgaW4gb3ZlcmZsb3cgY29ycmVjdGlvbnM6IFIgPSAoWDI+PjEyOCkgKz0gVFtvdmVyZmxvd10KKwkjIFIgPSB7cjksIHI4LCByMTUsIHIxNCwgLi4uLCByMTB9CisJIHNobAlcJDMsICVyYnAKKwkgbW92CSgrJHBEYXRhX29mZnNldCskU1RBQ0tfREVQVEgpKCVyc3ApLCAlcmN4CQkJIyByc2kgLT4gRGF0YSAoYW5kIHBvaW50cyB0byBUKQorCSBhZGQJJXJjeCwgJXJicAkJCSMgcFQgOyA1MTIgYml0cywgOCBxd29yZHMsIHNwcmVhZCBvdXQKKworCSMgcnNpIHdpbGwgYmUgdXNlZCB0byBnZW5lcmF0ZSBhIG1hc2sgYWZ0ZXIgdGhlIGFkZGl0aW9uCisJIHhvcgklcnNpLCAlcnNpCisKKwkgYWRkCSgrOCo4KjApKCVyYnApLCAkWFswXQorCSBhZGMJKCs4KjgqMSkoJXJicCksICRYWzFdCisJIGFkYwkoKzgqOCoyKSglcmJwKSwgJFhbMl0KKwkgYWRjCSgrOCo4KjMpKCVyYnApLCAkWFszXQorCSBhZGMJKCs4KjgqNCkoJXJicCksICRYWzRdCisJIGFkYwkoKzgqOCo1KSglcmJwKSwgJFhbNV0KKwkgYWRjCSgrOCo4KjYpKCVyYnApLCAkWFs2XQorCSBhZGMJKCs4KjgqNykoJXJicCksICRYWzddCisKKwkjIGlmIHRoZXJlIGlzIGEgY2Fycnk6CXJzaSA9IDB4RkZGRkZGRkZGRkZGRkZGRgorCSMgaWYgY2FycnkgaXMgY2xlYXI6CXJzaSA9IDB4MDAwMDAwMDAwMDAwMDAwMAorCSBzYmIJXCQwLCAlcnNpCisKKwkjIGlmIGNhcnJ5IGlzIGNsZWFyLCBzdWJ0cmFjdCAwLiBPdGhlcndpc2UsIHN1YnRyYWN0IDI1NiBiaXRzIG9mIG0KKwkgYW5kCSVyc2ksICVyYXgKKwkgYW5kCSVyc2ksICVyYngKKwkgYW5kCSVyc2ksICVyZGkKKwkgYW5kCSVyc2ksICVyZHgKKworCSBtb3YJXCQxLCAlcmJwCisJIHN1YgklcmF4LCAkWFswXQorCSBzYmIJJXJieCwgJFhbMV0KKwkgc2JiCSVyZGksICRYWzJdCisJIHNiYgklcmR4LCAkWFszXQorCisJIyBpZiB0aGVyZSBpcyBhIGJvcnJvdzoJCXJicCA9IDAKKwkjIGlmIHRoZXJlIGlzIG5vIGJvcnJvdzoJcmJwID0gMQorCSMgdGhpcyBpcyB1c2VkIHRvIHNhdmUgdGhlIGJvcnJvd3MgaW4gYmV0d2VlbiB0aGUgZmlyc3QgaGFsZiBhbmQgdGhlIDJuZCBoYWxmIG9mIHRoZSBzdWJ0cmFjdGlvbiBvZiBtCisJIHNiYglcJDAsICVyYnAKKworCSNsb2FkIHNlY29uZCBoYWxmIG9mIG0gdG8gcmR4LCByZGksIHJieCwgcmF4CisKKwkgYWRkCVwkJE0sICVyY3gKKwkgbW92CSgrOCo0KSglcmN4KSwgJXJheAorCSBtb3YJKCs4KjUpKCVyY3gpLCAlcmJ4CisJIG1vdgkoKzgqNikoJXJjeCksICVyZGkKKwkgbW92CSgrOCo3KSglcmN4KSwgJXJkeAorCisJIyB1c2UgdGhlIHJzaSBtYXNrIGFzIGJlZm9yZQorCSMgaWYgY2FycnkgaXMgY2xlYXIsIHN1YnRyYWN0IDAuIE90aGVyd2lzZSwgc3VidHJhY3QgMjU2IGJpdHMgb2YgbQorCSBhbmQJJXJzaSwgJXJheAorCSBhbmQJJXJzaSwgJXJieAorCSBhbmQJJXJzaSwgJXJkaQorCSBhbmQJJXJzaSwgJXJkeAorCisJIyBpZiByYnAgPSAwLCB0aGVyZSB3YXMgYSBib3Jyb3cgYmVmb3JlLCBpdCBpcyBtb3ZlZCB0byB0aGUgY2FycnkgZmxhZworCSMgaWYgcmJwID0gMSwgdGhlcmUgd2FzIG5vdCBhIGJvcnJvdyBiZWZvcmUsIGNhcnJ5IGZsYWcgaXMgY2xlYXJlZAorCSBzdWIJXCQxLCAlcmJwCisKKwkgc2JiCSVyYXgsICRYWzRdCisJIHNiYgklcmJ4LCAkWFs1XQorCSBzYmIJJXJkaSwgJFhbNl0KKwkgc2JiCSVyZHgsICRYWzddCisKKwkjIHdyaXRlIFIgYmFjayB0byBtZW1vcnkKKworCSBtb3YJKCskcmVkX3Jlc3VsdF9hZGRyX29mZnNldCskU1RBQ0tfREVQVEgpKCVyc3ApLCAlcnNpCisJIG1vdgkkWFswXSwgKCs4KjApKCVyc2kpCisJIG1vdgkkWFsxXSwgKCs4KjEpKCVyc2kpCisJIG1vdgkkWFsyXSwgKCs4KjIpKCVyc2kpCisJIG1vdgkkWFszXSwgKCs4KjMpKCVyc2kpCisJIG1vdgkkWFs0XSwgKCs4KjQpKCVyc2kpCisJIG1vdgkkWFs1XSwgKCs4KjUpKCVyc2kpCisJIG1vdgkkWFs2XSwgKCs4KjYpKCVyc2kpCisJIG1vdgkkWFs3XSwgKCs4KjcpKCVyc2kpCisKKwkgcmV0Cisuc2l6ZQltb250X3JlZHVjZSwuLW1vbnRfcmVkdWNlCitfX18KK319fQorCit7e3sKKyNNVUxfNTEyeDUxMglNQUNSTwlwRHN0LCBwQSwgcEIsIHg3LCB4NiwgeDUsIHg0LCB4MywgeDIsIHgxLCB4MCwgdG1wKjIKKyMKKyMgSW5wdXRzOiBwRHN0OiBEZXN0aW5hdGlvbiAgKDEwMjQgYml0cywgMTYgcXdvcmRzKQorIyAgICAgICAgIHBBOiAgIE11bHRpcGxpY2FuZCAoNTEyIGJpdHMsIDggcXdvcmRzKQorIyAgICAgICAgIHBCOiAgIE11bHRpcGxpY2FuZCAoNTEyIGJpdHMsIDggcXdvcmRzKQorIyBVc2VzIHJlZ2lzdGVycyByYXgsIHJkeCwgYXJncworIyAgIEIgb3BlcmFuZCBpbiBbcEJdIGFuZCBhbHNvIGluIHg3Li4ueDAKK3N1YiBNVUxfNTEyeDUxMgoreworIG15ICgkcERzdCwgJHBBLCAkcEIsICR4LCAkT1AsICRUTVAsICRwRHN0X28pPUBfOworIG15ICgkcERzdCwgICRwRHN0X28pID0gKCRwRHN0ID1+IG0vKFteK10qKVwrPyguKik/Lyk7CisgbXkgQFg9QCR4OwkjIG1ha2UgYSBjb3B5CisKKyRjb2RlLj08PF9fXzsKKwkgbW92CSgrOCowKSgkcEEpLCAkT1AKKworCSBtb3YJJFhbMF0sICVyYXgKKwkgbXVsCSRPUAkJCSMgcmR4OnJheCA9ICVPUCAqIFswXQorCSBtb3YJJXJheCwgKCskcERzdF9vKzgqMCkoJHBEc3QpCisJIG1vdgklcmR4LCAkWFswXQorX19fCitmb3IobXkgJGk9MTskaTw4OyRpKyspIHsKKyRjb2RlLj08PF9fXzsKKwkgbW92CSRYWyRpXSwgJXJheAorCSBtdWwJJE9QCQkJIyByZHg6cmF4ID0gJU9QICogWyRpXQorCSBhZGQJJXJheCwgJFhbJGktMV0KKwkgYWRjCVwkMCwgJXJkeAorCSBtb3YJJXJkeCwgJFhbJGldCitfX18KK30KKworZm9yKG15ICRpPTE7JGk8ODskaSsrKSB7CiskY29kZS49PDxfX187CisJIG1vdgkoKzgqJGkpKCRwQSksICRPUAorX19fCisKKwkmTVVMU1RFUF81MTIoXEBYLCAiKCskcERzdF9vKzgqJGkpKCRwRHN0KSIsICRwQiwgJE9QLCAkVE1QKTsKKwlwdXNoKEBYLHNoaWZ0KEBYKSk7Cit9CisKKyRjb2RlLj08PF9fXzsKKwkgbW92CSRYWzBdLCAoKyRwRHN0X28rOCo4KSgkcERzdCkKKwkgbW92CSRYWzFdLCAoKyRwRHN0X28rOCo5KSgkcERzdCkKKwkgbW92CSRYWzJdLCAoKyRwRHN0X28rOCoxMCkoJHBEc3QpCisJIG1vdgkkWFszXSwgKCskcERzdF9vKzgqMTEpKCRwRHN0KQorCSBtb3YJJFhbNF0sICgrJHBEc3Rfbys4KjEyKSgkcERzdCkKKwkgbW92CSRYWzVdLCAoKyRwRHN0X28rOCoxMykoJHBEc3QpCisJIG1vdgkkWFs2XSwgKCskcERzdF9vKzgqMTQpKCRwRHN0KQorCSBtb3YJJFhbN10sICgrJHBEc3Rfbys4KjE1KSgkcERzdCkKK19fXworfQorCisjCisjIG1vbnRfbXVsX2EzYiA6IHN1YnJvdXRpbmUgdG8gY29tcHV0ZSAoU3JjMSAqIFNyYzIpICUgTSAoYWxsIDUxMi1iaXRzKQorIyBJbnB1dDogIHNyYzE6IEFkZHJlc3Mgb2Ygc291cmNlIDE6IHJkaQorIyAgICAgICAgIHNyYzI6IEFkZHJlc3Mgb2Ygc291cmNlIDI6IHJzaQorIyBPdXRwdXQ6IGRzdDogIEFkZHJlc3Mgb2YgZGVzdGluYXRpb246IFtyZWRfcmVzX2FkZHJdCisjICAgIHNyYzIgYW5kIHJlc3VsdCBhbHNvIGluOiByOSwgcjgsIHIxNSwgcjE0LCByMTMsIHIxMiwgcjExLCByMTAKKyMgVGVtcDogICBDbG9iYmVycyBbdG1wMTZdLCBhbGwgcmVnaXN0ZXJzCiskY29kZS49PDxfX187CisudHlwZQltb250X211bF9hM2IsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2Cittb250X211bF9hM2I6CisJIworCSMgbXVsdGlwbHkgdG1wID0gc3JjMSAqIHNyYzIKKwkjIEZvciBtdWx0aXBseTogZHN0ID0gcmN4LCBzcmMxID0gcmRpLCBzcmMyID0gcnNpCisJIyBzdGFjayBkZXB0aCBpcyBleHRyYSA4IGZyb20gY2FsbAorX19fCisJJk1VTF81MTJ4NTEyKCIlcnNwKyR0bXAxNl9vZmZzZXQrOCIsICIlcmRpIiwgIiVyc2kiLCBbbWFwKCIlciRfIiwoMTAuLjE1LDguLjkpKV0sICIlcmJwIiwgIiVyYngiKTsKKyRjb2RlLj08PF9fXzsKKwkjCisJIyBEc3QgPSB0bXAgJSBtCisJIyBDYWxsIHJlZHVjZSh0bXAsIG0sIGRhdGEsIGRzdCkKKworCSMgdGFpbCByZWN1cnNpb24gb3B0aW1pemF0aW9uOiBqbXAgdG8gbW9udF9yZWR1Y2UgYW5kIHJldHVybiBmcm9tIHRoZXJlCisJIGptcAltb250X3JlZHVjZQorCSMgY2FsbAltb250X3JlZHVjZQorCSMgcmV0Cisuc2l6ZQltb250X211bF9hM2IsLi1tb250X211bF9hM2IKK19fXworfX19CisKK3t7eworI1NRUl81MTIgTUFDUk8gcERlc3QsIHBBLCB4NywgeDYsIHg1LCB4NCwgeDMsIHgyLCB4MSwgeDAsIHRtcCo0CisjCisjIElucHV0IGluIG1lbW9yeSBbcEFdIGFuZCBhbHNvIGluIHg3Li4ueDAKKyMgVXNlcyBhbGwgYXJndW1lbnQgcmVnaXN0ZXJzIHBsdXMgcmF4IGFuZCByZHgKKyMKKyMgVGhpcyB2ZXJzaW9uIGNvbXB1dGVzIGFsbCBvZiB0aGUgb2ZmLWRpYWdvbmFsIHRlcm1zIGludG8gbWVtb3J5LAorIyBhbmQgdGhlbiBpdCBhZGRzIGluIHRoZSBkaWFnb25hbCB0ZXJtcworCitzdWIgU1FSXzUxMgoreworIG15ICgkcERzdCwgJHBBLCAkeCwgJEEsICR0bXAsICR4NywgJHg2LCAkcERzdF9vKT1AXzsKKyBteSAoJHBEc3QsICAkcERzdF9vKSA9ICgkcERzdCA9fiBtLyhbXitdKilcKz8oLiopPy8pOworIG15IEBYPUAkeDsJIyBtYWtlIGEgY29weQorJGNvZGUuPTw8X19fOworCSMgLS0tLS0tLS0tLS0tLS0tLS0tCisJIyBmaXJzdCBwYXNzIDAxLi4uMDcKKwkjIC0tLS0tLS0tLS0tLS0tLS0tLQorCSBtb3YJJFhbMF0sICRBCisKKwkgbW92CSRYWzFdLCVyYXgKKwkgbXVsCSRBCisJIG1vdgklcmF4LCAoKyRwRHN0X28rOCoxKSgkcERzdCkKK19fXworZm9yKG15ICRpPTI7JGk8ODskaSsrKSB7CiskY29kZS49PDxfX187CisJIG1vdgklcmR4LCAkWFskaS0yXQorCSBtb3YJJFhbJGldLCVyYXgKKwkgbXVsCSRBCisJIGFkZAklcmF4LCAkWFskaS0yXQorCSBhZGMJXCQwLCAlcmR4CitfX18KK30KKyRjb2RlLj08PF9fXzsKKwkgbW92CSVyZHgsICR4NworCisJIG1vdgkkWFswXSwgKCskcERzdF9vKzgqMikoJHBEc3QpCisKKwkjIC0tLS0tLS0tLS0tLS0tLS0tLQorCSMgc2Vjb25kIHBhc3MgMTIuLi4xNworCSMgLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkgbW92CSgrOCoxKSgkcEEpLCAkQQorCisJIG1vdgkoKzgqMikoJHBBKSwlcmF4CisJIG11bAkkQQorCSBhZGQJJXJheCwgJFhbMV0KKwkgYWRjCVwkMCwgJXJkeAorCSBtb3YJJFhbMV0sICgrJHBEc3Rfbys4KjMpKCRwRHN0KQorCisJIG1vdgklcmR4LCAkWFswXQorCSBtb3YJKCs4KjMpKCRwQSksJXJheAorCSBtdWwJJEEKKwkgYWRkCSVyYXgsICRYWzJdCisJIGFkYwlcJDAsICVyZHgKKwkgYWRkCSRYWzBdLCAkWFsyXQorCSBhZGMJXCQwLCAlcmR4CisJIG1vdgkkWFsyXSwgKCskcERzdF9vKzgqNCkoJHBEc3QpCisKKwkgbW92CSVyZHgsICRYWzBdCisJIG1vdgkoKzgqNCkoJHBBKSwlcmF4CisJIG11bAkkQQorCSBhZGQJJXJheCwgJFhbM10KKwkgYWRjCVwkMCwgJXJkeAorCSBhZGQJJFhbMF0sICRYWzNdCisJIGFkYwlcJDAsICVyZHgKKworCSBtb3YJJXJkeCwgJFhbMF0KKwkgbW92CSgrOCo1KSgkcEEpLCVyYXgKKwkgbXVsCSRBCisJIGFkZAklcmF4LCAkWFs0XQorCSBhZGMJXCQwLCAlcmR4CisJIGFkZAkkWFswXSwgJFhbNF0KKwkgYWRjCVwkMCwgJXJkeAorCisJIG1vdgklcmR4LCAkWFswXQorCSBtb3YJJFhbNl0sJXJheAorCSBtdWwJJEEKKwkgYWRkCSVyYXgsICRYWzVdCisJIGFkYwlcJDAsICVyZHgKKwkgYWRkCSRYWzBdLCAkWFs1XQorCSBhZGMJXCQwLCAlcmR4CisKKwkgbW92CSVyZHgsICRYWzBdCisJIG1vdgkkWFs3XSwlcmF4CisJIG11bAkkQQorCSBhZGQJJXJheCwgJHg3CisJIGFkYwlcJDAsICVyZHgKKwkgYWRkCSRYWzBdLCAkeDcKKwkgYWRjCVwkMCwgJXJkeAorCisJIG1vdgklcmR4LCAkWFsxXQorCisJIyAtLS0tLS0tLS0tLS0tLS0tLS0KKwkjIHRoaXJkIHBhc3MgMjMuLi4yNworCSMgLS0tLS0tLS0tLS0tLS0tLS0tCisJIG1vdgkoKzgqMikoJHBBKSwgJEEKKworCSBtb3YJKCs4KjMpKCRwQSksJXJheAorCSBtdWwJJEEKKwkgYWRkCSVyYXgsICRYWzNdCisJIGFkYwlcJDAsICVyZHgKKwkgbW92CSRYWzNdLCAoKyRwRHN0X28rOCo1KSgkcERzdCkKKworCSBtb3YJJXJkeCwgJFhbMF0KKwkgbW92CSgrOCo0KSgkcEEpLCVyYXgKKwkgbXVsCSRBCisJIGFkZAklcmF4LCAkWFs0XQorCSBhZGMJXCQwLCAlcmR4CisJIGFkZAkkWFswXSwgJFhbNF0KKwkgYWRjCVwkMCwgJXJkeAorCSBtb3YJJFhbNF0sICgrJHBEc3Rfbys4KjYpKCRwRHN0KQorCisJIG1vdgklcmR4LCAkWFswXQorCSBtb3YJKCs4KjUpKCRwQSksJXJheAorCSBtdWwJJEEKKwkgYWRkCSVyYXgsICRYWzVdCisJIGFkYwlcJDAsICVyZHgKKwkgYWRkCSRYWzBdLCAkWFs1XQorCSBhZGMJXCQwLCAlcmR4CisKKwkgbW92CSVyZHgsICRYWzBdCisJIG1vdgkkWFs2XSwlcmF4CisJIG11bAkkQQorCSBhZGQJJXJheCwgJHg3CisJIGFkYwlcJDAsICVyZHgKKwkgYWRkCSRYWzBdLCAkeDcKKwkgYWRjCVwkMCwgJXJkeAorCisJIG1vdgklcmR4LCAkWFswXQorCSBtb3YJJFhbN10sJXJheAorCSBtdWwJJEEKKwkgYWRkCSVyYXgsICRYWzFdCisJIGFkYwlcJDAsICVyZHgKKwkgYWRkCSRYWzBdLCAkWFsxXQorCSBhZGMJXCQwLCAlcmR4CisKKwkgbW92CSVyZHgsICRYWzJdCisKKwkjIC0tLS0tLS0tLS0tLS0tLS0tLQorCSMgZm91cnRoIHBhc3MgMzQuLi4zNworCSMgLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkgbW92CSgrOCozKSgkcEEpLCAkQQorCisJIG1vdgkoKzgqNCkoJHBBKSwlcmF4CisJIG11bAkkQQorCSBhZGQJJXJheCwgJFhbNV0KKwkgYWRjCVwkMCwgJXJkeAorCSBtb3YJJFhbNV0sICgrJHBEc3Rfbys4KjcpKCRwRHN0KQorCisJIG1vdgklcmR4LCAkWFswXQorCSBtb3YJKCs4KjUpKCRwQSksJXJheAorCSBtdWwJJEEKKwkgYWRkCSVyYXgsICR4NworCSBhZGMJXCQwLCAlcmR4CisJIGFkZAkkWFswXSwgJHg3CisJIGFkYwlcJDAsICVyZHgKKwkgbW92CSR4NywgKCskcERzdF9vKzgqOCkoJHBEc3QpCisKKwkgbW92CSVyZHgsICRYWzBdCisJIG1vdgkkWFs2XSwlcmF4CisJIG11bAkkQQorCSBhZGQJJXJheCwgJFhbMV0KKwkgYWRjCVwkMCwgJXJkeAorCSBhZGQJJFhbMF0sICRYWzFdCisJIGFkYwlcJDAsICVyZHgKKworCSBtb3YJJXJkeCwgJFhbMF0KKwkgbW92CSRYWzddLCVyYXgKKwkgbXVsCSRBCisJIGFkZAklcmF4LCAkWFsyXQorCSBhZGMJXCQwLCAlcmR4CisJIGFkZAkkWFswXSwgJFhbMl0KKwkgYWRjCVwkMCwgJXJkeAorCisJIG1vdgklcmR4LCAkWFs1XQorCisJIyAtLS0tLS0tLS0tLS0tLS0tLS0KKwkjIGZpZnRoIHBhc3MgNDUuLi40NworCSMgLS0tLS0tLS0tLS0tLS0tLS0tCisJIG1vdgkoKzgqNCkoJHBBKSwgJEEKKworCSBtb3YJKCs4KjUpKCRwQSksJXJheAorCSBtdWwJJEEKKwkgYWRkCSVyYXgsICRYWzFdCisJIGFkYwlcJDAsICVyZHgKKwkgbW92CSRYWzFdLCAoKyRwRHN0X28rOCo5KSgkcERzdCkKKworCSBtb3YJJXJkeCwgJFhbMF0KKwkgbW92CSRYWzZdLCVyYXgKKwkgbXVsCSRBCisJIGFkZAklcmF4LCAkWFsyXQorCSBhZGMJXCQwLCAlcmR4CisJIGFkZAkkWFswXSwgJFhbMl0KKwkgYWRjCVwkMCwgJXJkeAorCSBtb3YJJFhbMl0sICgrJHBEc3Rfbys4KjEwKSgkcERzdCkKKworCSBtb3YJJXJkeCwgJFhbMF0KKwkgbW92CSRYWzddLCVyYXgKKwkgbXVsCSRBCisJIGFkZAklcmF4LCAkWFs1XQorCSBhZGMJXCQwLCAlcmR4CisJIGFkZAkkWFswXSwgJFhbNV0KKwkgYWRjCVwkMCwgJXJkeAorCisJIG1vdgklcmR4LCAkWFsxXQorCisJIyAtLS0tLS0tLS0tLS0tLS0tLS0KKwkjIHNpeHRoIHBhc3MgNTYuLi41NworCSMgLS0tLS0tLS0tLS0tLS0tLS0tCisJIG1vdgkoKzgqNSkoJHBBKSwgJEEKKworCSBtb3YJJFhbNl0sJXJheAorCSBtdWwJJEEKKwkgYWRkCSVyYXgsICRYWzVdCisJIGFkYwlcJDAsICVyZHgKKwkgbW92CSRYWzVdLCAoKyRwRHN0X28rOCoxMSkoJHBEc3QpCisKKwkgbW92CSVyZHgsICRYWzBdCisJIG1vdgkkWFs3XSwlcmF4CisJIG11bAkkQQorCSBhZGQJJXJheCwgJFhbMV0KKwkgYWRjCVwkMCwgJXJkeAorCSBhZGQJJFhbMF0sICRYWzFdCisJIGFkYwlcJDAsICVyZHgKKwkgbW92CSRYWzFdLCAoKyRwRHN0X28rOCoxMikoJHBEc3QpCisKKwkgbW92CSVyZHgsICRYWzJdCisKKwkjIC0tLS0tLS0tLS0tLS0tLS0tLQorCSMgc2V2ZW50aCBwYXNzIDY3CisJIyAtLS0tLS0tLS0tLS0tLS0tLS0KKwkgbW92CSRYWzZdLCAkQQorCisJIG1vdgkkWFs3XSwlcmF4CisJIG11bAkkQQorCSBhZGQJJXJheCwgJFhbMl0KKwkgYWRjCVwkMCwgJXJkeAorCSBtb3YJJFhbMl0sICgrJHBEc3Rfbys4KjEzKSgkcERzdCkKKworCSBtb3YJJXJkeCwgKCskcERzdF9vKzgqMTQpKCRwRHN0KQorCisJIyBzdGFydCBmaW5hbGl6ZSAoYWRkCWluIHNxdWFyZXMsIGFuZCBkb3VibGUgb2ZmLXRlcm1zKQorCSBtb3YJKCskcERzdF9vKzgqMSkoJHBEc3QpLCAkWFswXQorCSBtb3YJKCskcERzdF9vKzgqMikoJHBEc3QpLCAkWFsxXQorCSBtb3YJKCskcERzdF9vKzgqMykoJHBEc3QpLCAkWFsyXQorCSBtb3YJKCskcERzdF9vKzgqNCkoJHBEc3QpLCAkWFszXQorCSBtb3YJKCskcERzdF9vKzgqNSkoJHBEc3QpLCAkWFs0XQorCSBtb3YJKCskcERzdF9vKzgqNikoJHBEc3QpLCAkWFs1XQorCisJIG1vdgkoKzgqMykoJHBBKSwgJXJheAorCSBtdWwJJXJheAorCSBtb3YJJXJheCwgJHg2CisJIG1vdgklcmR4LCAkWFs2XQorCisJIGFkZAkkWFswXSwgJFhbMF0KKwkgYWRjCSRYWzFdLCAkWFsxXQorCSBhZGMJJFhbMl0sICRYWzJdCisJIGFkYwkkWFszXSwgJFhbM10KKwkgYWRjCSRYWzRdLCAkWFs0XQorCSBhZGMJJFhbNV0sICRYWzVdCisJIGFkYwlcJDAsICRYWzZdCisKKwkgbW92CSgrOCowKSgkcEEpLCAlcmF4CisJIG11bAklcmF4CisJIG1vdgklcmF4LCAoKyRwRHN0X28rOCowKSgkcERzdCkKKwkgbW92CSVyZHgsICRBCisKKwkgbW92CSgrOCoxKSgkcEEpLCAlcmF4CisJIG11bAklcmF4CisKKwkgYWRkCSRBLCAkWFswXQorCSBhZGMJJXJheCwgJFhbMV0KKwkgYWRjCVwkMCwgJXJkeAorCisJIG1vdgklcmR4LCAkQQorCSBtb3YJJFhbMF0sICgrJHBEc3Rfbys4KjEpKCRwRHN0KQorCSBtb3YJJFhbMV0sICgrJHBEc3Rfbys4KjIpKCRwRHN0KQorCisJIG1vdgkoKzgqMikoJHBBKSwgJXJheAorCSBtdWwJJXJheAorCisJIGFkZAkkQSwgJFhbMl0KKwkgYWRjCSVyYXgsICRYWzNdCisJIGFkYwlcJDAsICVyZHgKKworCSBtb3YJJXJkeCwgJEEKKworCSBtb3YJJFhbMl0sICgrJHBEc3Rfbys4KjMpKCRwRHN0KQorCSBtb3YJJFhbM10sICgrJHBEc3Rfbys4KjQpKCRwRHN0KQorCisJIHhvcgkkdG1wLCAkdG1wCisJIGFkZAkkQSwgJFhbNF0KKwkgYWRjCSR4NiwgJFhbNV0KKwkgYWRjCVwkMCwgJHRtcAorCisJIG1vdgkkWFs0XSwgKCskcERzdF9vKzgqNSkoJHBEc3QpCisJIG1vdgkkWFs1XSwgKCskcERzdF9vKzgqNikoJHBEc3QpCisKKwkjICUldG1wIGhhcyAwLzEgaW4gY29sdW1uIDcKKwkjICUlQTYgaGFzIGEgZnVsbCB2YWx1ZSBpbiBjb2x1bW4gNworCisJIG1vdgkoKyRwRHN0X28rOCo3KSgkcERzdCksICRYWzBdCisJIG1vdgkoKyRwRHN0X28rOCo4KSgkcERzdCksICRYWzFdCisJIG1vdgkoKyRwRHN0X28rOCo5KSgkcERzdCksICRYWzJdCisJIG1vdgkoKyRwRHN0X28rOCoxMCkoJHBEc3QpLCAkWFszXQorCSBtb3YJKCskcERzdF9vKzgqMTEpKCRwRHN0KSwgJFhbNF0KKwkgbW92CSgrJHBEc3Rfbys4KjEyKSgkcERzdCksICRYWzVdCisJIG1vdgkoKyRwRHN0X28rOCoxMykoJHBEc3QpLCAkeDYKKwkgbW92CSgrJHBEc3Rfbys4KjE0KSgkcERzdCksICR4NworCisJIG1vdgkkWFs3XSwgJXJheAorCSBtdWwJJXJheAorCSBtb3YJJXJheCwgJFhbN10KKwkgbW92CSVyZHgsICRBCisKKwkgYWRkCSRYWzBdLCAkWFswXQorCSBhZGMJJFhbMV0sICRYWzFdCisJIGFkYwkkWFsyXSwgJFhbMl0KKwkgYWRjCSRYWzNdLCAkWFszXQorCSBhZGMJJFhbNF0sICRYWzRdCisJIGFkYwkkWFs1XSwgJFhbNV0KKwkgYWRjCSR4NiwgJHg2CisJIGFkYwkkeDcsICR4NworCSBhZGMJXCQwLCAkQQorCisJIGFkZAkkdG1wLCAkWFswXQorCisJIG1vdgkoKzgqNCkoJHBBKSwgJXJheAorCSBtdWwJJXJheAorCisJIGFkZAkkWFs2XSwgJFhbMF0KKwkgYWRjCSVyYXgsICRYWzFdCisJIGFkYwlcJDAsICVyZHgKKworCSBtb3YJJXJkeCwgJHRtcAorCisJIG1vdgkkWFswXSwgKCskcERzdF9vKzgqNykoJHBEc3QpCisJIG1vdgkkWFsxXSwgKCskcERzdF9vKzgqOCkoJHBEc3QpCisKKwkgbW92CSgrOCo1KSgkcEEpLCAlcmF4CisJIG11bAklcmF4CisKKwkgYWRkCSR0bXAsICRYWzJdCisJIGFkYwklcmF4LCAkWFszXQorCSBhZGMJXCQwLCAlcmR4CisKKwkgbW92CSVyZHgsICR0bXAKKworCSBtb3YJJFhbMl0sICgrJHBEc3Rfbys4KjkpKCRwRHN0KQorCSBtb3YJJFhbM10sICgrJHBEc3Rfbys4KjEwKSgkcERzdCkKKworCSBtb3YJKCs4KjYpKCRwQSksICVyYXgKKwkgbXVsCSVyYXgKKworCSBhZGQJJHRtcCwgJFhbNF0KKwkgYWRjCSVyYXgsICRYWzVdCisJIGFkYwlcJDAsICVyZHgKKworCSBtb3YJJFhbNF0sICgrJHBEc3Rfbys4KjExKSgkcERzdCkKKwkgbW92CSRYWzVdLCAoKyRwRHN0X28rOCoxMikoJHBEc3QpCisKKwkgYWRkCSVyZHgsICR4NgorCSBhZGMJJFhbN10sICR4NworCSBhZGMJXCQwLCAkQQorCisJIG1vdgkkeDYsICgrJHBEc3Rfbys4KjEzKSgkcERzdCkKKwkgbW92CSR4NywgKCskcERzdF9vKzgqMTQpKCRwRHN0KQorCSBtb3YJJEEsICgrJHBEc3Rfbys4KjE1KSgkcERzdCkKK19fXworfQorCisjCisjIHNxcl9yZWR1Y2U6IHN1YnJvdXRpbmUgdG8gY29tcHV0ZSBSZXN1bHQgPSByZWR1Y2UoUmVzdWx0ICogUmVzdWx0KQorIworIyBpbnB1dCBhbmQgcmVzdWx0IGFsc28gaW46IHI5LCByOCwgcjE1LCByMTQsIHIxMywgcjEyLCByMTEsIHIxMAorIworJGNvZGUuPTw8X19fOworLnR5cGUJc3FyX3JlZHVjZSxcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMTYKK3Nxcl9yZWR1Y2U6CisJIG1vdgkoKyRwUmVzdWx0X29mZnNldCs4KSglcnNwKSwgJXJjeAorX19fCisJJlNRUl81MTIoIiVyc3ArJHRtcDE2X29mZnNldCs4IiwgIiVyY3giLCBbbWFwKCIlciRfIiwoMTAuLjE1LDguLjkpKV0sICIlcmJ4IiwgIiVyYnAiLCAiJXJzaSIsICIlcmRpIik7CiskY29kZS49PDxfX187CisJIyB0YWlsIHJlY3Vyc2lvbiBvcHRpbWl6YXRpb246IGptcCB0byBtb250X3JlZHVjZSBhbmQgcmV0dXJuIGZyb20gdGhlcmUKKwkgam1wCW1vbnRfcmVkdWNlCisJIyBjYWxsCW1vbnRfcmVkdWNlCisJIyByZXQKKy5zaXplCXNxcl9yZWR1Y2UsLi1zcXJfcmVkdWNlCitfX18KK319fQorCisjCisjIE1BSU4gRlVOQ1RJT04KKyMKKworI21vZF9leHBfNTEyKFVJTlQ2NCAqcmVzdWx0LCAvKiA1MTIgYml0cywgOCBxd29yZHMgKi8KKyMgICAgICAgICAgIFVJTlQ2NCAqZywgICAvKiA1MTIgYml0cywgOCBxd29yZHMgKi8KKyMgICAgICAgICAgIFVJTlQ2NCAqZXhwLCAvKiA1MTIgYml0cywgOCBxd29yZHMgKi8KKyMgICAgICAgICAgIHN0cnVjdCBtb2RfY3R4XzUxMiAqZGF0YSkKKworIyB3aW5kb3cgc2l6ZSA9IDUKKyMgdGFibGUgc2l6ZSA9IDJeNSA9IDMyCisjdGFibGVfZW50cmllcwllcXUJMzIKKyN0YWJsZV9zaXplCWVxdQl0YWJsZV9lbnRyaWVzICogOAorJGNvZGUuPTw8X19fOworLmdsb2JsCW1vZF9leHBfNTEyCisudHlwZQltb2RfZXhwXzUxMixcQGZ1bmN0aW9uLDQKK21vZF9leHBfNTEyOgorCSBwdXNoCSVyYnAKKwkgcHVzaAklcmJ4CisJIHB1c2gJJXIxMgorCSBwdXNoCSVyMTMKKwkgcHVzaAklcjE0CisJIHB1c2gJJXIxNQorCisJIyBhZGp1c3Qgc3RhY2sgZG93biBhbmQgdGhlbiBhbGlnbiBpdCB3aXRoIGNhY2hlIGJvdW5kYXJ5CisJIG1vdgklcnNwLCAlcjgKKwkgc3ViCVwkJG1lbV9zaXplLCAlcnNwCisJIGFuZAlcJC02NCwgJXJzcAorCisJIyBzdG9yZSBwcmV2aW91cyBzdGFjayBwb2ludGVyIGFuZCBhcmd1bWVudHMKKwkgbW92CSVyOCwgKCskcnNwX29mZnNldCkoJXJzcCkKKwkgbW92CSVyZGksICgrJHBSZXN1bHRfb2Zmc2V0KSglcnNwKQorCSBtb3YJJXJzaSwgKCskcEdfb2Zmc2V0KSglcnNwKQorCSBtb3YJJXJjeCwgKCskcERhdGFfb2Zmc2V0KSglcnNwKQorLkxib2R5OgorCSMgdHJhbnNmb3JtIGcgaW50byBtb250Z29tZXJ5IHNwYWNlCisJIyBHVCA9IHJlZHVjZShnICogQzIpID0gcmVkdWNlKGcgKiAoMl4yNTYpKQorCSMgcmVkdWNlIGV4cGVjdHMgdG8gaGF2ZSB0aGUgaW5wdXQgaW4gW3RtcDE2XQorCSBweG9yCSV4bW00LCAleG1tNAorCSBtb3ZkcXUJKCsxNiowKSglcnNpKSwgJXhtbTAKKwkgbW92ZHF1CSgrMTYqMSkoJXJzaSksICV4bW0xCisJIG1vdmRxdQkoKzE2KjIpKCVyc2kpLCAleG1tMgorCSBtb3ZkcXUJKCsxNiozKSglcnNpKSwgJXhtbTMKKwkgbW92ZHFhCSV4bW00LCAoKyR0bXAxNl9vZmZzZXQrMTYqMCkoJXJzcCkKKwkgbW92ZHFhCSV4bW00LCAoKyR0bXAxNl9vZmZzZXQrMTYqMSkoJXJzcCkKKwkgbW92ZHFhCSV4bW00LCAoKyR0bXAxNl9vZmZzZXQrMTYqNikoJXJzcCkKKwkgbW92ZHFhCSV4bW00LCAoKyR0bXAxNl9vZmZzZXQrMTYqNykoJXJzcCkKKwkgbW92ZHFhCSV4bW0wLCAoKyR0bXAxNl9vZmZzZXQrMTYqMikoJXJzcCkKKwkgbW92ZHFhCSV4bW0xLCAoKyR0bXAxNl9vZmZzZXQrMTYqMykoJXJzcCkKKwkgbW92ZHFhCSV4bW0yLCAoKyR0bXAxNl9vZmZzZXQrMTYqNCkoJXJzcCkKKwkgbW92ZHFhCSV4bW0zLCAoKyR0bXAxNl9vZmZzZXQrMTYqNSkoJXJzcCkKKworCSMgbG9hZCBwRXhwIGJlZm9yZSByZHggZ2V0cyBibG93biBhd2F5CisJIG1vdmRxdQkoKzE2KjApKCVyZHgpLCAleG1tMAorCSBtb3ZkcXUJKCsxNioxKSglcmR4KSwgJXhtbTEKKwkgbW92ZHF1CSgrMTYqMikoJXJkeCksICV4bW0yCisJIG1vdmRxdQkoKzE2KjMpKCVyZHgpLCAleG1tMworCisJIGxlYQkoKyRHVF9vZmZzZXQpKCVyc3ApLCAlcmJ4CisJIG1vdgklcmJ4LCAoKyRyZWRfcmVzdWx0X2FkZHJfb2Zmc2V0KSglcnNwKQorCSBjYWxsCW1vbnRfcmVkdWNlCisKKwkjIEluaXRpYWxpemUgdG1wID0gQworCSBsZWEJKCskdG1wX29mZnNldCkoJXJzcCksICVyY3gKKwkgeG9yCSVyYXgsICVyYXgKKwkgbW92CSVyYXgsICgrOCowKSglcmN4KQorCSBtb3YJJXJheCwgKCs4KjEpKCVyY3gpCisJIG1vdgklcmF4LCAoKzgqMykoJXJjeCkKKwkgbW92CSVyYXgsICgrOCo0KSglcmN4KQorCSBtb3YJJXJheCwgKCs4KjUpKCVyY3gpCisJIG1vdgklcmF4LCAoKzgqNikoJXJjeCkKKwkgbW92CSVyYXgsICgrOCo3KSglcmN4KQorCSBtb3YJJXJheCwgKCskZXhwX29mZnNldCs4KjgpKCVyc3ApCisJIG1vdnEJXCQxLCAoKzgqMikoJXJjeCkKKworCSBsZWEJKCskZ2FycmF5X29mZnNldCkoJXJzcCksICVyYnAKKwkgbW92CSVyY3gsICVyc2kJCQkjIHBUbXAKKwkgbW92CSVyYnAsICVyZGkJCQkjIEdhcnJheVtdWzBdCitfX18KKworCSZzd2l6emxlKCIlcmRpIiwgIiVyY3giLCAiJXJheCIsICIlcmJ4Iik7CisKKwkjIGZvciAocmF4ID0gMzE7IHJheCAhPSAwOyByYXgtLSkgeworCSMgICAgIHRtcCA9IHJlZHVjZSh0bXAgKiBHKQorCSMgICAgIHN3aXp6bGUocGcsIHRtcCk7CisJIyAgICAgcGcgKz0gMjsgfQorJGNvZGUuPTw8X19fOworCSBtb3YJXCQzMSwgJXJheAorCSBtb3YJJXJheCwgKCskaV9vZmZzZXQpKCVyc3ApCisJIG1vdgklcmJwLCAoKyRwZ19vZmZzZXQpKCVyc3ApCisJIyByc2kgLT4gcFRtcAorCSBtb3YJJXJzaSwgKCskcmVkX3Jlc3VsdF9hZGRyX29mZnNldCkoJXJzcCkKKwkgbW92CSgrOCowKSglcnNpKSwgJXIxMAorCSBtb3YJKCs4KjEpKCVyc2kpLCAlcjExCisJIG1vdgkoKzgqMikoJXJzaSksICVyMTIKKwkgbW92CSgrOCozKSglcnNpKSwgJXIxMworCSBtb3YJKCs4KjQpKCVyc2kpLCAlcjE0CisJIG1vdgkoKzgqNSkoJXJzaSksICVyMTUKKwkgbW92CSgrOCo2KSglcnNpKSwgJXI4CisJIG1vdgkoKzgqNykoJXJzaSksICVyOQoraW5pdF9sb29wOgorCSBsZWEJKCskR1Rfb2Zmc2V0KSglcnNwKSwgJXJkaQorCSBjYWxsCW1vbnRfbXVsX2EzYgorCSBsZWEJKCskdG1wX29mZnNldCkoJXJzcCksICVyc2kKKwkgbW92CSgrJHBnX29mZnNldCkoJXJzcCksICVyYnAKKwkgYWRkCVwkMiwgJXJicAorCSBtb3YJJXJicCwgKCskcGdfb2Zmc2V0KSglcnNwKQorCSBtb3YJJXJzaSwgJXJjeAkJCSMgcmN4ID0gcnNpID0gYWRkciBvZiB0bXAKK19fXworCisJJnN3aXp6bGUoIiVyYnAiLCAiJXJjeCIsICIlcmF4IiwgIiVyYngiKTsKKyRjb2RlLj08PF9fXzsKKwkgbW92CSgrJGlfb2Zmc2V0KSglcnNwKSwgJXJheAorCSBzdWIJXCQxLCAlcmF4CisJIG1vdgklcmF4LCAoKyRpX29mZnNldCkoJXJzcCkKKwkgam5lCWluaXRfbG9vcAorCisJIworCSMgQ29weSBleHBvbmVudCBvbnRvIHN0YWNrCisJIG1vdmRxYQkleG1tMCwgKCskZXhwX29mZnNldCsxNiowKSglcnNwKQorCSBtb3ZkcWEJJXhtbTEsICgrJGV4cF9vZmZzZXQrMTYqMSkoJXJzcCkKKwkgbW92ZHFhCSV4bW0yLCAoKyRleHBfb2Zmc2V0KzE2KjIpKCVyc3ApCisJIG1vdmRxYQkleG1tMywgKCskZXhwX29mZnNldCsxNiozKSglcnNwKQorCisKKwkjCisJIyBEbyBleHBvbmVudGlhdGlvbgorCSMgSW5pdGlhbGl6ZSByZXN1bHQgdG8gR1tleHB7NTExOjUwN31dCisJIG1vdgkoKyRleHBfb2Zmc2V0KzYyKSglcnNwKSwgJWVheAorCSBtb3YJJXJheCwgJXJkeAorCSBzaHIJXCQxMSwgJXJheAorCSBhbmQJXCQweDA3RkYsICVlZHgKKwkgbW92CSVlZHgsICgrJGV4cF9vZmZzZXQrNjIpKCVyc3ApCisJIGxlYQkoKyRnYXJyYXlfb2Zmc2V0KSglcnNwLCVyYXgsMiksICVyc2kKKwkgbW92CSgrJHBSZXN1bHRfb2Zmc2V0KSglcnNwKSwgJXJkeAorX19fCisKKwkmdW5zd2l6emxlKCIlcmR4IiwgIiVyc2kiLCAiJXJicCIsICIlcmJ4IiwgIiVyYXgiKTsKKworCSMKKwkjIExvb3AgdmFyaWFibGVzCisJIyByY3ggPSBbbG9vcF9pZHhdID0gaW5kZXg6IDUxMC01IHRvIDAgYnkgNQorJGNvZGUuPTw8X19fOworCSBtb3ZxCVwkNTA1LCAoKyRsb29wX2lkeF9vZmZzZXQpKCVyc3ApCisKKwkgbW92CSgrJHBSZXN1bHRfb2Zmc2V0KSglcnNwKSwgJXJjeAorCSBtb3YJJXJjeCwgKCskcmVkX3Jlc3VsdF9hZGRyX29mZnNldCkoJXJzcCkKKwkgbW92CSgrOCowKSglcmN4KSwgJXIxMAorCSBtb3YJKCs4KjEpKCVyY3gpLCAlcjExCisJIG1vdgkoKzgqMikoJXJjeCksICVyMTIKKwkgbW92CSgrOCozKSglcmN4KSwgJXIxMworCSBtb3YJKCs4KjQpKCVyY3gpLCAlcjE0CisJIG1vdgkoKzgqNSkoJXJjeCksICVyMTUKKwkgbW92CSgrOCo2KSglcmN4KSwgJXI4CisJIG1vdgkoKzgqNykoJXJjeCksICVyOQorCSBqbXAJc3FyXzIKKworbWFpbl9sb29wX2EzYjoKKwkgY2FsbAlzcXJfcmVkdWNlCisJIGNhbGwJc3FyX3JlZHVjZQorCSBjYWxsCXNxcl9yZWR1Y2UKK3Nxcl8yOgorCSBjYWxsCXNxcl9yZWR1Y2UKKwkgY2FsbAlzcXJfcmVkdWNlCisKKwkjCisJIyBEbyBtdWx0aXBseSwgZmlyc3QgbG9vayB1cCBwcm9wZXIgdmFsdWUgaW4gR2FycmF5CisJIG1vdgkoKyRsb29wX2lkeF9vZmZzZXQpKCVyc3ApLCAlcmN4CQkJIyBiaXQgaW5kZXgKKwkgbW92CSVyY3gsICVyYXgKKwkgc2hyCVwkNCwgJXJheAkJCSMgcmF4IGlzIHdvcmQgcG9pbnRlcgorCSBtb3YJKCskZXhwX29mZnNldCkoJXJzcCwlcmF4LDIpLCAlZWR4CisJIGFuZAlcJDE1LCAlcmN4CisJIHNocnEJJWNsLCAlcmR4CisJIGFuZAlcJDB4MUYsICVyZHgKKworCSBsZWEJKCskZ2FycmF5X29mZnNldCkoJXJzcCwlcmR4LDIpLCAlcnNpCisJIGxlYQkoKyR0bXBfb2Zmc2V0KSglcnNwKSwgJXJkeAorCSBtb3YJJXJkeCwgJXJkaQorX19fCisKKwkmdW5zd2l6emxlKCIlcmR4IiwgIiVyc2kiLCAiJXJicCIsICIlcmJ4IiwgIiVyYXgiKTsKKwkjIHJkaSA9IHRtcCA9IHBHCisKKwkjCisJIyBDYWxsIG1vZF9tdWxfYTEocERzdCwgIHBTcmMxLCBwU3JjMiwgcE0sIHBEYXRhKQorCSMgICAgICAgICAgICAgICAgIHJlc3VsdCByZXN1bHQgcEcgICAgIE0gICBEYXRhCiskY29kZS49PDxfX187CisJIG1vdgkoKyRwUmVzdWx0X29mZnNldCkoJXJzcCksICVyc2kKKwkgY2FsbAltb250X211bF9hM2IKKworCSMKKwkjIGZpbmlzaCBsb29wCisJIG1vdgkoKyRsb29wX2lkeF9vZmZzZXQpKCVyc3ApLCAlcmN4CisJIHN1YglcJDUsICVyY3gKKwkgbW92CSVyY3gsICgrJGxvb3BfaWR4X29mZnNldCkoJXJzcCkKKwkgamdlCW1haW5fbG9vcF9hM2IKKworCSMKKworZW5kX21haW5fbG9vcF9hM2I6CisJIyB0cmFuc2Zvcm0gcmVzdWx0IG91dCBvZiBNb250Z29tZXJ5IHNwYWNlCisJIyByZXN1bHQgPSByZWR1Y2UocmVzdWx0KQorCSBtb3YJKCskcFJlc3VsdF9vZmZzZXQpKCVyc3ApLCAlcmR4CisJIHB4b3IJJXhtbTQsICV4bW00CisJIG1vdmRxdQkoKzE2KjApKCVyZHgpLCAleG1tMAorCSBtb3ZkcXUJKCsxNioxKSglcmR4KSwgJXhtbTEKKwkgbW92ZHF1CSgrMTYqMikoJXJkeCksICV4bW0yCisJIG1vdmRxdQkoKzE2KjMpKCVyZHgpLCAleG1tMworCSBtb3ZkcWEJJXhtbTQsICgrJHRtcDE2X29mZnNldCsxNio0KSglcnNwKQorCSBtb3ZkcWEJJXhtbTQsICgrJHRtcDE2X29mZnNldCsxNio1KSglcnNwKQorCSBtb3ZkcWEJJXhtbTQsICgrJHRtcDE2X29mZnNldCsxNio2KSglcnNwKQorCSBtb3ZkcWEJJXhtbTQsICgrJHRtcDE2X29mZnNldCsxNio3KSglcnNwKQorCSBtb3ZkcWEJJXhtbTAsICgrJHRtcDE2X29mZnNldCsxNiowKSglcnNwKQorCSBtb3ZkcWEJJXhtbTEsICgrJHRtcDE2X29mZnNldCsxNioxKSglcnNwKQorCSBtb3ZkcWEJJXhtbTIsICgrJHRtcDE2X29mZnNldCsxNioyKSglcnNwKQorCSBtb3ZkcWEJJXhtbTMsICgrJHRtcDE2X29mZnNldCsxNiozKSglcnNwKQorCSBjYWxsCW1vbnRfcmVkdWNlCisKKwkjIElmIHJlc3VsdCA+IG0sIHN1YnJhY3QgbQorCSMgbG9hZCByZXN1bHQgaW50byByMTU6cjgKKwkgbW92CSgrJHBSZXN1bHRfb2Zmc2V0KSglcnNwKSwgJXJheAorCSBtb3YJKCs4KjApKCVyYXgpLCAlcjgKKwkgbW92CSgrOCoxKSglcmF4KSwgJXI5CisJIG1vdgkoKzgqMikoJXJheCksICVyMTAKKwkgbW92CSgrOCozKSglcmF4KSwgJXIxMQorCSBtb3YJKCs4KjQpKCVyYXgpLCAlcjEyCisJIG1vdgkoKzgqNSkoJXJheCksICVyMTMKKwkgbW92CSgrOCo2KSglcmF4KSwgJXIxNAorCSBtb3YJKCs4KjcpKCVyYXgpLCAlcjE1CisKKwkjIHN1YnRyYWN0IG0KKwkgbW92CSgrJHBEYXRhX29mZnNldCkoJXJzcCksICVyYngKKwkgYWRkCVwkJE0sICVyYngKKworCSBzdWIJKCs4KjApKCVyYngpLCAlcjgKKwkgc2JiCSgrOCoxKSglcmJ4KSwgJXI5CisJIHNiYgkoKzgqMikoJXJieCksICVyMTAKKwkgc2JiCSgrOCozKSglcmJ4KSwgJXIxMQorCSBzYmIJKCs4KjQpKCVyYngpLCAlcjEyCisJIHNiYgkoKzgqNSkoJXJieCksICVyMTMKKwkgc2JiCSgrOCo2KSglcmJ4KSwgJXIxNAorCSBzYmIJKCs4KjcpKCVyYngpLCAlcjE1CisKKwkjIGlmIENhcnJ5IGlzIGNsZWFyLCByZXBsYWNlIHJlc3VsdCB3aXRoIGRpZmZlcmVuY2UKKwkgbW92CSgrOCowKSglcmF4KSwgJXJzaQorCSBtb3YJKCs4KjEpKCVyYXgpLCAlcmRpCisJIG1vdgkoKzgqMikoJXJheCksICVyY3gKKwkgbW92CSgrOCozKSglcmF4KSwgJXJkeAorCSBjbW92bmMJJXI4LCAlcnNpCisJIGNtb3ZuYwklcjksICVyZGkKKwkgY21vdm5jCSVyMTAsICVyY3gKKwkgY21vdm5jCSVyMTEsICVyZHgKKwkgbW92CSVyc2ksICgrOCowKSglcmF4KQorCSBtb3YJJXJkaSwgKCs4KjEpKCVyYXgpCisJIG1vdgklcmN4LCAoKzgqMikoJXJheCkKKwkgbW92CSVyZHgsICgrOCozKSglcmF4KQorCisJIG1vdgkoKzgqNCkoJXJheCksICVyc2kKKwkgbW92CSgrOCo1KSglcmF4KSwgJXJkaQorCSBtb3YJKCs4KjYpKCVyYXgpLCAlcmN4CisJIG1vdgkoKzgqNykoJXJheCksICVyZHgKKwkgY21vdm5jCSVyMTIsICVyc2kKKwkgY21vdm5jCSVyMTMsICVyZGkKKwkgY21vdm5jCSVyMTQsICVyY3gKKwkgY21vdm5jCSVyMTUsICVyZHgKKwkgbW92CSVyc2ksICgrOCo0KSglcmF4KQorCSBtb3YJJXJkaSwgKCs4KjUpKCVyYXgpCisJIG1vdgklcmN4LCAoKzgqNikoJXJheCkKKwkgbW92CSVyZHgsICgrOCo3KSglcmF4KQorCisJIG1vdgkoKyRyc3Bfb2Zmc2V0KSglcnNwKSwgJXJzaQorCSBtb3YJMCglcnNpKSwlcjE1CisJIG1vdgk4KCVyc2kpLCVyMTQKKwkgbW92CTE2KCVyc2kpLCVyMTMKKwkgbW92CTI0KCVyc2kpLCVyMTIKKwkgbW92CTMyKCVyc2kpLCVyYngKKwkgbW92CTQwKCVyc2kpLCVyYnAKKwkgbGVhCTQ4KCVyc2kpLCVyc3AKKy5MZXBpbG9ndWU6CisJIHJldAorLnNpemUgbW9kX2V4cF81MTIsIC4gLSBtb2RfZXhwXzUxMgorX19fCisKK2lmICgkd2luNjQpIHsKKyMgRVhDRVBUSU9OX0RJU1BPU0lUSU9OIGhhbmRsZXIgKEVYQ0VQVElPTl9SRUNPUkQgKnJlYyxVTE9ORzY0IGZyYW1lLAorIwkJQ09OVEVYVCAqY29udGV4dCxESVNQQVRDSEVSX0NPTlRFWFQgKmRpc3ApCitteSAkcmVjPSIlcmN4IjsKK215ICRmcmFtZT0iJXJkeCI7CitteSAkY29udGV4dD0iJXI4IjsKK215ICRkaXNwPSIlcjkiOworCiskY29kZS49PDxfX187CisuZXh0ZXJuCV9faW1wX1J0bFZpcnR1YWxVbndpbmQKKy50eXBlCW1vZF9leHBfNTEyX3NlX2hhbmRsZXIsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2Cittb2RfZXhwXzUxMl9zZV9oYW5kbGVyOgorCXB1c2gJJXJzaQorCXB1c2gJJXJkaQorCXB1c2gJJXJieAorCXB1c2gJJXJicAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCXB1c2gJJXIxNQorCXB1c2hmcQorCXN1YglcJDY0LCVyc3AKKworCW1vdgkxMjAoJGNvbnRleHQpLCVyYXgJIyBwdWxsIGNvbnRleHQtPlJheAorCW1vdgkyNDgoJGNvbnRleHQpLCVyYngJIyBwdWxsIGNvbnRleHQtPlJpcAorCisJbGVhCS5MYm9keSglcmlwKSwlcjEwCisJY21wCSVyMTAsJXJieAkJIyBjb250ZXh0LT5SaXA8cHJvbG9ndWUgbGFiZWwKKwlqYgkuTGluX3Byb2xvZ3VlCisKKwltb3YJMTUyKCRjb250ZXh0KSwlcmF4CSMgcHVsbCBjb250ZXh0LT5Sc3AKKworCWxlYQkuTGVwaWxvZ3VlKCVyaXApLCVyMTAKKwljbXAJJXIxMCwlcmJ4CQkjIGNvbnRleHQtPlJpcD49ZXBpbG9ndWUgbGFiZWwKKwlqYWUJLkxpbl9wcm9sb2d1ZQorCisJbW92CSRyc3Bfb2Zmc2V0KCVyYXgpLCVyYXgJIyBwdWxsIHNhdmVkIFJzcAorCisJbW92CTMyKCVyYXgpLCVyYngKKwltb3YJNDAoJXJheCksJXJicAorCW1vdgkyNCglcmF4KSwlcjEyCisJbW92CTE2KCVyYXgpLCVyMTMKKwltb3YJOCglcmF4KSwlcjE0CisJbW92CTAoJXJheCksJXIxNQorCWxlYQk0OCglcmF4KSwlcmF4CisJbW92CSVyYngsMTQ0KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UmJ4CisJbW92CSVyYnAsMTYwKCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UmJwCisJbW92CSVyMTIsMjE2KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UjEyCisJbW92CSVyMTMsMjI0KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UjEzCisJbW92CSVyMTQsMjMyKCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UjE0CisJbW92CSVyMTUsMjQwKCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UjE1CisKKy5MaW5fcHJvbG9ndWU6CisJbW92CTgoJXJheCksJXJkaQorCW1vdgkxNiglcmF4KSwlcnNpCisJbW92CSVyYXgsMTUyKCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UnNwCisJbW92CSVyc2ksMTY4KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UnNpCisJbW92CSVyZGksMTc2KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UmRpCisKKwltb3YJNDAoJGRpc3ApLCVyZGkJCSMgZGlzcC0+Q29udGV4dFJlY29yZAorCW1vdgkkY29udGV4dCwlcnNpCQkjIGNvbnRleHQKKwltb3YJXCQxNTQsJWVjeAkJIyBzaXplb2YoQ09OVEVYVCkKKwkubG9uZwkweGE1NDhmM2ZjCQkjIGNsZDsgcmVwIG1vdnNxCisKKwltb3YJJGRpc3AsJXJzaQorCXhvcgklcmN4LCVyY3gJCSMgYXJnMSwgVU5XX0ZMQUdfTkhBTkRMRVIKKwltb3YJOCglcnNpKSwlcmR4CQkjIGFyZzIsIGRpc3AtPkltYWdlQmFzZQorCW1vdgkwKCVyc2kpLCVyOAkJIyBhcmczLCBkaXNwLT5Db250cm9sUGMKKwltb3YJMTYoJXJzaSksJXI5CQkjIGFyZzQsIGRpc3AtPkZ1bmN0aW9uRW50cnkKKwltb3YJNDAoJXJzaSksJXIxMAkJIyBkaXNwLT5Db250ZXh0UmVjb3JkCisJbGVhCTU2KCVyc2kpLCVyMTEJCSMgJmRpc3AtPkhhbmRsZXJEYXRhCisJbGVhCTI0KCVyc2kpLCVyMTIJCSMgJmRpc3AtPkVzdGFibGlzaGVyRnJhbWUKKwltb3YJJXIxMCwzMiglcnNwKQkJIyBhcmc1CisJbW92CSVyMTEsNDAoJXJzcCkJCSMgYXJnNgorCW1vdgklcjEyLDQ4KCVyc3ApCQkjIGFyZzcKKwltb3YJJXJjeCw1NiglcnNwKQkJIyBhcmc4LCAoTlVMTCkKKwljYWxsCSpfX2ltcF9SdGxWaXJ0dWFsVW53aW5kKCVyaXApCisKKwltb3YJXCQxLCVlYXgJCSMgRXhjZXB0aW9uQ29udGludWVTZWFyY2gKKwlhZGQJXCQ2NCwlcnNwCisJcG9wZnEKKwlwb3AJJXIxNQorCXBvcAklcjE0CisJcG9wCSVyMTMKKwlwb3AJJXIxMgorCXBvcAklcmJwCisJcG9wCSVyYngKKwlwb3AJJXJkaQorCXBvcAklcnNpCisJcmV0Cisuc2l6ZQltb2RfZXhwXzUxMl9zZV9oYW5kbGVyLC4tbW9kX2V4cF81MTJfc2VfaGFuZGxlcgorCisuc2VjdGlvbgkucGRhdGEKKy5hbGlnbgk0CisJLnJ2YQkuTFNFSF9iZWdpbl9tb2RfZXhwXzUxMgorCS5ydmEJLkxTRUhfZW5kX21vZF9leHBfNTEyCisJLnJ2YQkuTFNFSF9pbmZvX21vZF9leHBfNTEyCisKKy5zZWN0aW9uCS54ZGF0YQorLmFsaWduCTgKKy5MU0VIX2luZm9fbW9kX2V4cF81MTI6CisJLmJ5dGUJOSwwLDAsMAorCS5ydmEJbW9kX2V4cF81MTJfc2VfaGFuZGxlcgorX19fCit9CisKK3N1YiByZWdfcGFydCB7CitteSAoJHJlZywkY29udik9QF87CisgICAgaWYgKCRyZWcgPX4gLyVyWzAtOV0rLykJeyAkcmVnIC49ICRjb252OyB9CisgICAgZWxzaWYgKCRjb252IGVxICJiIikJeyAkcmVnID1+IHMvJVtlcl0oW154XSspeD8vJSQxbC87CX0KKyAgICBlbHNpZiAoJGNvbnYgZXEgInciKQl7ICRyZWcgPX4gcy8lW2VyXSguKykvJSQxLzsJCX0KKyAgICBlbHNpZiAoJGNvbnYgZXEgImQiKQl7ICRyZWcgPX4gcy8lW2VyXSguKykvJWUkMS87CQl9CisgICAgcmV0dXJuICRyZWc7Cit9CisKKyRjb2RlID1+IHMvKCVbYS16MC05XSspIyhbYndkXSkvcmVnX3BhcnQoJDEsJDIpL2dlbTsKKyRjb2RlID1+IHMvXGAoW15cYF0qKVxgL2V2YWwgJDEvZ2VtOworJGNvZGUgPX4gcy8oXChcK1teKV0rXCkpL2V2YWwgJDEvZ2VtOworcHJpbnQgJGNvZGU7CitjbG9zZSBTVERPVVQ7CmRpZmYgLS1naXQgYS9jcnlwdG8vYm4vYXNtL3JzYXotYXZ4Mi5wbCBiL2NyeXB0by9ibi9hc20vcnNhei1hdngyLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYjk1NTYKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYm4vYXNtL3JzYXotYXZ4Mi5wbApAQCAtMCwwICsxLDE4NzUgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgIENvcHlyaWdodCAoYykgMjAxMiwgSW50ZWwgQ29ycG9yYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0ICAgICAgICAjCisjICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlICAgICMKKyMgIG1ldDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjICAqICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCAgICAgICAgICMKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gICAgICAgICAgIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjICAqICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCAgICAgICMKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgICAgIworIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlICAgICAgICAgICAgICAgICAjCisjICAgICBkaXN0cmlidXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyAgKiAgTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMgICAgICAgICAjCisjICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSAgICMKKyMgICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uICAgICAgICAgICAgICAgIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgSU5URUwgQ09SUE9SQVRJT04gIiJBUyBJUyIiIEFORCBBTlkgICAgICAgICAgIworIyAgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgICAgICAgICAjCisjICBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgICAgICAgICMKKyMgIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIElOVEVMIENPUlBPUkFUSU9OIE9SICAgICAgICAgICAgIworIyAgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsICAgICAjCisjICBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sICAgICAgICMKKyMgIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiAgICAgICAgIworIyAgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiAgICAjCisjICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyAgICAgICMKKyMgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyAgICAgICAgIworIyAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuICAgICAgICAgICAgICAjCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBEZXZlbG9wZXJzIGFuZCBhdXRob3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIFNoYXkgR3Vlcm9uICgxLCAyKSwgYW5kIFZsYWQgS3Jhc25vdiAoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgKDEpIEludGVsIENvcnBvcmF0aW9uLCBJc3JhZWwgRGV2ZWxvcG1lbnQgQ2VudGVyLCBIYWlmYSwgSXNyYWVsICAgICAgICAgICAgIworIyAoMikgVW5pdmVyc2l0eSBvZiBIYWlmYSwgSXNyYWVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUmVmZXJlbmNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyBbMV0gUy4gR3Vlcm9uLCBWLiBLcmFzbm92OiAiU29mdHdhcmUgSW1wbGVtZW50YXRpb24gb2YgTW9kdWxhciAgICAgICAgICAgICAjCisjICAgICBFeHBvbmVudGlhdGlvbiwgIFVzaW5nIEFkdmFuY2VkIFZlY3RvciBJbnN0cnVjdGlvbnMgQXJjaGl0ZWN0dXJlcyIsICAgICMKKyMgICAgIEYuIE96YnVkYWsgYW5kIEYuIFJvZHJpZ3Vlei1IZW5yaXF1ZXogKEVkcy4pOiBXQUlGSSAyMDEyLCBMTkNTIDczNjksICAgIworIyAgICAgcHAuIDExOT8xMzUsIDIwMTIuIFNwcmluZ2VyLVZlcmxhZyBCZXJsaW4gSGVpZGVsYmVyZyAyMDEyICAgICAgICAgICAgICAjCisjIFsyXSBTLiBHdWVyb246ICJFZmZpY2llbnQgU29mdHdhcmUgSW1wbGVtZW50YXRpb25zIG9mIE1vZHVsYXIgICAgICAgICAgICAgICMKKyMgICAgIEV4cG9uZW50aWF0aW9uIiwgSm91cm5hbCBvZiBDcnlwdG9ncmFwaGljIEVuZ2luZWVyaW5nIDI6MzEtNDMgKDIwMTIpLiAgIworIyBbM10gUy4gR3Vlcm9uLCBWLiBLcmFzbm92OiAiU3BlZWRpbmcgdXAgQmlnLW51bWJlcnMgU3F1YXJpbmciLElFRUUgICAgICAgICAjCisjICAgICBQcm9jZWVkaW5ncyBvZiA5dGggSW50ZXJuYXRpb25hbCBDb25mZXJlbmNlIG9uIEluZm9ybWF0aW9uIFRlY2hub2xvZ3k6ICMKKyMgICAgIE5ldyBHZW5lcmF0aW9ucyAoSVRORyAyMDEyKSwgcHAuODIxLTgyMyAoMjAxMikgICAgICAgICAgICAgICAgICAgICAgICAgIworIyBbNF0gUy4gR3Vlcm9uLCBWLiBLcmFzbm92OiAiW1BBVENIXSBFZmZpY2llbnQgYW5kIHNpZGUgY2hhbm5lbCBhbmFseXNpcyAgICAjCisjICAgICByZXNpc3RhbnQgMTAyNC1iaXQgbW9kdWxhciBleHBvbmVudGlhdGlvbiwgZm9yIG9wdGltaXppbmcgUlNBMjA0OCAgICAgICMKKyMgICAgIG9uIEFWWDIgY2FwYWJsZSB4ODZfNjQgcGxhdGZvcm1zIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyAgICAgaHR0cDovL3J0Lm9wZW5zc2wub3JnL1RpY2tldC9EaXNwbGF5Lmh0bWw/aWQ9Mjg1MCZ1c2VyPWd1ZXN0JnBhc3M9Z3Vlc3QjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgKzEzJSBpbXByb3ZlbWVudCBvdmVyIG9yaWdpbmFsIHN1Ym1pc3Npb24gYnkgPGFwcHJvQG9wZW5zc2wub3JnPgorIworIyByc2EyMDQ4IHNpZ24vc2VjCU9wZW5TU0wgMS4wLjEJc2NhbGFyKCopCXRoaXMKKyMgMi4zR0h6IEhhc3dlbGwJNjIxCQk3NjUvKzIzJQkxMTEzLys3OSUKKyMKKyMgKCopCWlmIHN5c3RlbSBkb2Vzbid0IHN1cHBvcnQgQVZYMiwgZm9yIHJlZmVyZW5jZSBwdXJwb3NlczsKKworJGZsYXZvdXIgPSBzaGlmdDsKKyRvdXRwdXQgID0gc2hpZnQ7CitpZiAoJGZsYXZvdXIgPX4gL1wuLykgeyAkb3V0cHV0ID0gJGZsYXZvdXI7IHVuZGVmICRmbGF2b3VyOyB9CisKKyR3aW42ND0wOyAkd2luNjQ9MSBpZiAoJGZsYXZvdXIgPX4gL1tubV1hc218bWluZ3c2NC8gfHwgJG91dHB1dCA9fiAvXC5hc20kLyk7CisKKyQwID1+IG0vKC4qW1wvXFxdKVteXC9cXF0rJC87ICRkaXI9JDE7CisoICR4bGF0ZT0iJHtkaXJ9eDg2XzY0LXhsYXRlLnBsIiBhbmQgLWYgJHhsYXRlICkgb3IKKyggJHhsYXRlPSIke2Rpcn0uLi8uLi9wZXJsYXNtL3g4Nl82NC14bGF0ZS5wbCIgYW5kIC1mICR4bGF0ZSkgb3IKK2RpZSAiY2FuJ3QgbG9jYXRlIHg4Nl82NC14bGF0ZS5wbCI7CisKK2lmIChgJEVOVntDQ30gLVdhLC12IC1jIC1vIC9kZXYvbnVsbCAteCBhc3NlbWJsZXIgL2Rldi9udWxsIDI+JjFgCisJCT1+IC9HTlUgYXNzZW1ibGVyIHZlcnNpb24gKFsyLTldXC5bMC05XSspLykgeworCSRhdnggPSAoJDE+PTIuMTkpICsgKCQxPj0yLjIyKTsKK30KKworaWYgKCEkYXZ4ICYmICR3aW42NCAmJiAoJGZsYXZvdXIgPX4gL25hc20vIHx8ICRFTlZ7QVNNfSA9fiAvbmFzbS8pICYmCisJICAgIGBuYXNtIC12IDI+JjFgID1+IC9OQVNNIHZlcnNpb24gKFsyLTldXC5bMC05XSspLykgeworCSRhdnggPSAoJDE+PTIuMDkpICsgKCQxPj0yLjEwKTsKK30KKworaWYgKCEkYXZ4ICYmICR3aW42NCAmJiAoJGZsYXZvdXIgPX4gL21hc20vIHx8ICRFTlZ7QVNNfSA9fiAvbWw2NC8pICYmCisJICAgIGBtbDY0IDI+JjFgID1+IC9WZXJzaW9uIChbMC05XSspXC4vKSB7CisJJGF2eCA9ICgkMT49MTApICsgKCQxPj0xMSk7Cit9CisKK29wZW4gT1VULCJ8ICReWCAkeGxhdGUgJGZsYXZvdXIgJG91dHB1dCI7CisqU1RET1VUID0gKk9VVDsKKworaWYgKCRhdng+MSkge3t7Cit7ICMgdm9pZCBBTVNfV1coCitteSAkcnA9IiVyZGkiOwkjIEJOX1VMT05HICpycCwKK215ICRhcD0iJXJzaSI7CSMgY29uc3QgQk5fVUxPTkcgKmFwLAorbXkgJG5wPSIlcmR4IjsJIyBjb25zdCBCTl9VTE9ORyAqbnAsCitteSAkbjA9IiVlY3giOwkjIGNvbnN0IEJOX1VMT05HIG4wLAorbXkgJHJlcD0iJXI4ZCI7CSMgaW50IHJlcGVhdCk7CisKKyMgVGhlIHJlZ2lzdGVycyB0aGF0IGhvbGQgdGhlIGFjY3VtdWxhdGVkIHJlZHVuZGFudCByZXN1bHQKKyMgVGhlIEFNTSB3b3JrcyBvbiAxMDI0IGJpdCBvcGVyYW5kcywgYW5kIHJlZHVuZGFudCB3b3JkIHNpemUgaXMgMjkKKyMgVGhlcmVmb3JlOiBjZWlsKDEwMjQvMjkpLzQgPSA5CitteSAkQUNDMD0iJXltbTAiOworbXkgJEFDQzE9IiV5bW0xIjsKK215ICRBQ0MyPSIleW1tMiI7CitteSAkQUNDMz0iJXltbTMiOworbXkgJEFDQzQ9IiV5bW00IjsKK215ICRBQ0M1PSIleW1tNSI7CitteSAkQUNDNj0iJXltbTYiOworbXkgJEFDQzc9IiV5bW03IjsKK215ICRBQ0M4PSIleW1tOCI7CitteSAkQUNDOT0iJXltbTkiOworIyBSZWdpc3RlcnMgdGhhdCBob2xkIHRoZSBicm9hZGNhc3RlZCB3b3JkcyBvZiBicCwgY3VycmVudGx5IHVzZWQKK215ICRCMT0iJXltbTEwIjsKK215ICRCMj0iJXltbTExIjsKKyMgUmVnaXN0ZXJzIHRoYXQgaG9sZCB0aGUgYnJvYWRjYXN0ZWQgd29yZHMgb2YgWSwgY3VycmVudGx5IHVzZWQKK215ICRZMT0iJXltbTEyIjsKK215ICRZMj0iJXltbTEzIjsKKyMgSGVscGVyIHJlZ2lzdGVycworbXkgJFRFTVAxPSIleW1tMTQiOworbXkgJEFORF9NQVNLPSIleW1tMTUiOworIyBhbHUgcmVnaXN0ZXJzIHRoYXQgaG9sZCB0aGUgZmlyc3Qgd29yZHMgb2YgdGhlIEFDQworbXkgJHIwPSIlcjkiOworbXkgJHIxPSIlcjEwIjsKK215ICRyMj0iJXIxMSI7CitteSAkcjM9IiVyMTIiOworCitteSAkaT0iJXIxNGQiOwkJCSMgbG9vcCBjb3VudGVyCitteSAkdG1wID0gIiVyMTUiOworCitteSAkRnJhbWVTaXplPTMyKjE4KzMyKjg7CSMgcGxhY2UgZm9yIEFeMiBhbmQgMipBCisKK215ICRhYXA9JHIwOworbXkgJHRwMD0iJXJieCI7CitteSAkdHAxPSRyMzsKK215ICR0cGE9JHRtcDsKKworJG5wPSIlcjEzIjsJCQkjIHJlYXNzaWduZWQgYXJndW1lbnQKKworJGNvZGUuPTw8X19fOworLnRleHQKKworLmdsb2JsCXJzYXpfMTAyNF9zcXJfYXZ4MgorLnR5cGUJcnNhel8xMDI0X3Nxcl9hdngyLFxAZnVuY3Rpb24sNQorLmFsaWduCTY0Cityc2F6XzEwMjRfc3FyX2F2eDI6CQkjIDcwMiBjeWNsZXMsIDE0JSBmYXN0ZXIgdGhhbiByc2F6XzEwMjRfbXVsX2F2eDIKKwlsZWEJKCVyc3ApLCAlcmF4CisJcHVzaAklcmJ4CisJcHVzaAklcmJwCisJcHVzaAklcjEyCisJcHVzaAklcjEzCisJcHVzaAklcjE0CisJcHVzaAklcjE1CisJdnplcm91cHBlcgorX19fCiskY29kZS49PDxfX18gaWYgKCR3aW42NCk7CisJbGVhCS0weGE4KCVyc3ApLCVyc3AKKwl2bW92YXBzCSV4bW02LC0weGQ4KCVyYXgpCisJdm1vdmFwcwkleG1tNywtMHhjOCglcmF4KQorCXZtb3ZhcHMJJXhtbTgsLTB4YjgoJXJheCkKKwl2bW92YXBzCSV4bW05LC0weGE4KCVyYXgpCisJdm1vdmFwcwkleG1tMTAsLTB4OTgoJXJheCkKKwl2bW92YXBzCSV4bW0xMSwtMHg4OCglcmF4KQorCXZtb3ZhcHMJJXhtbTEyLC0weDc4KCVyYXgpCisJdm1vdmFwcwkleG1tMTMsLTB4NjgoJXJheCkKKwl2bW92YXBzCSV4bW0xNCwtMHg1OCglcmF4KQorCXZtb3ZhcHMJJXhtbTE1LC0weDQ4KCVyYXgpCisuTHNxcl8xMDI0X2JvZHk6CitfX18KKyRjb2RlLj08PF9fXzsKKwltb3YJJXJheCwlcmJwCisJbW92CSVyZHgsICRucAkJCSMgcmVhc3NpZ25lZCBhcmd1bWVudAorCXN1YglcJCRGcmFtZVNpemUsICVyc3AKKwltb3YJJG5wLCAkdG1wCisJc3ViCVwkLTEyOCwgJHJwCQkJIyBzaXplIG9wdGltaXphdGlvbgorCXN1YglcJC0xMjgsICRhcAorCXN1YglcJC0xMjgsICRucAorCisJYW5kCVwkNDA5NSwgJHRtcAkJCSMgc2VlIGlmICRucCBjcm9zc2VzIHBhZ2UKKwlhZGQJXCQzMioxMCwgJHRtcAorCXNocglcJDEyLCAkdG1wCisJdnB4b3IJJEFDQzksJEFDQzksJEFDQzkKKwlqegkuTHNxcl8xMDI0X25vX25fY29weQorCisJIyB1bmFsaWduZWQgMjU2LWJpdCBsb2FkIHRoYXQgY3Jvc3NlcyBwYWdlIGJvdW5kYXJ5IGNhbgorCSMgY2F1c2UgPjJ4IHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uIGhlcmUsIHNvIGlmICRucCBkb2VzCisJIyBjcm9zcyBwYWdlIGJvdW5kYXJ5LCBjb3B5IGl0IHRvIHN0YWNrIGFuZCBtYWtlIHN1cmUgc3RhY2sKKwkjIGZyYW1lIGRvZXNuJ3QuLi4KKwlzdWIJCVwkMzIqMTAsJXJzcAorCXZtb3ZkcXUJCTMyKjAtMTI4KCRucCksICRBQ0MwCisJYW5kCQlcJC0yMDQ4LCAlcnNwCisJdm1vdmRxdQkJMzIqMS0xMjgoJG5wKSwgJEFDQzEKKwl2bW92ZHF1CQkzMioyLTEyOCgkbnApLCAkQUNDMgorCXZtb3ZkcXUJCTMyKjMtMTI4KCRucCksICRBQ0MzCisJdm1vdmRxdQkJMzIqNC0xMjgoJG5wKSwgJEFDQzQKKwl2bW92ZHF1CQkzMio1LTEyOCgkbnApLCAkQUNDNQorCXZtb3ZkcXUJCTMyKjYtMTI4KCRucCksICRBQ0M2CisJdm1vdmRxdQkJMzIqNy0xMjgoJG5wKSwgJEFDQzcKKwl2bW92ZHF1CQkzMio4LTEyOCgkbnApLCAkQUNDOAorCWxlYQkJJEZyYW1lU2l6ZSsxMjgoJXJzcCksJG5wCisJdm1vdmRxdQkJJEFDQzAsIDMyKjAtMTI4KCRucCkKKwl2bW92ZHF1CQkkQUNDMSwgMzIqMS0xMjgoJG5wKQorCXZtb3ZkcXUJCSRBQ0MyLCAzMioyLTEyOCgkbnApCisJdm1vdmRxdQkJJEFDQzMsIDMyKjMtMTI4KCRucCkKKwl2bW92ZHF1CQkkQUNDNCwgMzIqNC0xMjgoJG5wKQorCXZtb3ZkcXUJCSRBQ0M1LCAzMio1LTEyOCgkbnApCisJdm1vdmRxdQkJJEFDQzYsIDMyKjYtMTI4KCRucCkKKwl2bW92ZHF1CQkkQUNDNywgMzIqNy0xMjgoJG5wKQorCXZtb3ZkcXUJCSRBQ0M4LCAzMio4LTEyOCgkbnApCisJdm1vdmRxdQkJJEFDQzksIDMyKjktMTI4KCRucCkJIyAkQUNDOSBpcyB6ZXJvCisKKy5Mc3FyXzEwMjRfbm9fbl9jb3B5OgorCWFuZAkJXCQtMTAyNCwgJXJzcAorCisJdm1vdmRxdQkJMzIqMS0xMjgoJGFwKSwgJEFDQzEKKwl2bW92ZHF1CQkzMioyLTEyOCgkYXApLCAkQUNDMgorCXZtb3ZkcXUJCTMyKjMtMTI4KCRhcCksICRBQ0MzCisJdm1vdmRxdQkJMzIqNC0xMjgoJGFwKSwgJEFDQzQKKwl2bW92ZHF1CQkzMio1LTEyOCgkYXApLCAkQUNDNQorCXZtb3ZkcXUJCTMyKjYtMTI4KCRhcCksICRBQ0M2CisJdm1vdmRxdQkJMzIqNy0xMjgoJGFwKSwgJEFDQzcKKwl2bW92ZHF1CQkzMio4LTEyOCgkYXApLCAkQUNDOAorCisJbGVhCTE5MiglcnNwKSwgJHRwMAkJCSMgNjQrMTI4PTE5MgorCXZwYnJvYWRjYXN0cQkuTGFuZF9tYXNrKCVyaXApLCAkQU5EX01BU0sKKwlqbXAJLkxPT1BfR1JBTkRFX1NRUl8xMDI0CisKKy5hbGlnbgkzMgorLkxPT1BfR1JBTkRFX1NRUl8xMDI0OgorCWxlYQkzMioxOCsxMjgoJXJzcCksICRhYXAJCSMgc2l6ZSBvcHRpbWl6YXRpb24KKwlsZWEJNDQ4KCVyc3ApLCAkdHAxCQkJIyA2NCsxMjgrMjU2PTQ0OAorCisJIyB0aGUgc3F1YXJpbmcgaXMgcGVyZm9ybWVkIGFzIGRlc2NyaWJlZCBpbiBWYXJpYW50IEIgb2YKKwkjICJTcGVlZGluZyB1cCBCaWctTnVtYmVyIFNxdWFyaW5nIiwgc28gc3RhcnQgYnkgY2FsY3VsYXRpbmcKKwkjIHRoZSBBKjI9QStBIHZlY3RvcgorCXZwYWRkcQkJJEFDQzEsICRBQ0MxLCAkQUNDMQorCSB2cGJyb2FkY2FzdHEJMzIqMC0xMjgoJGFwKSwgJEIxCisJdnBhZGRxCQkkQUNDMiwgJEFDQzIsICRBQ0MyCisJdm1vdmRxYQkJJEFDQzEsIDMyKjAtMTI4KCRhYXApCisJdnBhZGRxCQkkQUNDMywgJEFDQzMsICRBQ0MzCisJdm1vdmRxYQkJJEFDQzIsIDMyKjEtMTI4KCRhYXApCisJdnBhZGRxCQkkQUNDNCwgJEFDQzQsICRBQ0M0CisJdm1vdmRxYQkJJEFDQzMsIDMyKjItMTI4KCRhYXApCisJdnBhZGRxCQkkQUNDNSwgJEFDQzUsICRBQ0M1CisJdm1vdmRxYQkJJEFDQzQsIDMyKjMtMTI4KCRhYXApCisJdnBhZGRxCQkkQUNDNiwgJEFDQzYsICRBQ0M2CisJdm1vdmRxYQkJJEFDQzUsIDMyKjQtMTI4KCRhYXApCisJdnBhZGRxCQkkQUNDNywgJEFDQzcsICRBQ0M3CisJdm1vdmRxYQkJJEFDQzYsIDMyKjUtMTI4KCRhYXApCisJdnBhZGRxCQkkQUNDOCwgJEFDQzgsICRBQ0M4CisJdm1vdmRxYQkJJEFDQzcsIDMyKjYtMTI4KCRhYXApCisJdnB4b3IJCSRBQ0M5LCAkQUNDOSwgJEFDQzkKKwl2bW92ZHFhCQkkQUNDOCwgMzIqNy0xMjgoJGFhcCkKKworCXZwbXVsdWRxCTMyKjAtMTI4KCRhcCksICRCMSwgJEFDQzAKKwkgdnBicm9hZGNhc3RxCTMyKjEtMTI4KCRhcCksICRCMgorCSB2bW92ZHF1CSRBQ0M5LCAzMio5LTE5MigkdHAwKQkjIHplcm8gdXBwZXIgaGFsZgorCXZwbXVsdWRxCSRCMSwgJEFDQzEsICRBQ0MxCisJIHZtb3ZkcXUJJEFDQzksIDMyKjEwLTQ0OCgkdHAxKQorCXZwbXVsdWRxCSRCMSwgJEFDQzIsICRBQ0MyCisJIHZtb3ZkcXUJJEFDQzksIDMyKjExLTQ0OCgkdHAxKQorCXZwbXVsdWRxCSRCMSwgJEFDQzMsICRBQ0MzCisJIHZtb3ZkcXUJJEFDQzksIDMyKjEyLTQ0OCgkdHAxKQorCXZwbXVsdWRxCSRCMSwgJEFDQzQsICRBQ0M0CisJIHZtb3ZkcXUJJEFDQzksIDMyKjEzLTQ0OCgkdHAxKQorCXZwbXVsdWRxCSRCMSwgJEFDQzUsICRBQ0M1CisJIHZtb3ZkcXUJJEFDQzksIDMyKjE0LTQ0OCgkdHAxKQorCXZwbXVsdWRxCSRCMSwgJEFDQzYsICRBQ0M2CisJIHZtb3ZkcXUJJEFDQzksIDMyKjE1LTQ0OCgkdHAxKQorCXZwbXVsdWRxCSRCMSwgJEFDQzcsICRBQ0M3CisJIHZtb3ZkcXUJJEFDQzksIDMyKjE2LTQ0OCgkdHAxKQorCXZwbXVsdWRxCSRCMSwgJEFDQzgsICRBQ0M4CisJIHZwYnJvYWRjYXN0cQkzMioyLTEyOCgkYXApLCAkQjEKKwkgdm1vdmRxdQkkQUNDOSwgMzIqMTctNDQ4KCR0cDEpCisKKwltb3YJJGFwLCAkdHBhCisJbW92IAlcJDQsICRpCisJam1wCS5Mc3FyX2VudHJ5XzEwMjQKK19fXworJFRFTVAwPSRZMTsKKyRURU1QMj0kWTI7CiskY29kZS49PDxfX187CisuYWxpZ24JMzIKKy5MT09QX1NRUl8xMDI0OgorCSB2cGJyb2FkY2FzdHEJMzIqMS0xMjgoJHRwYSksICRCMgorCXZwbXVsdWRxCTMyKjAtMTI4KCRhcCksICRCMSwgJEFDQzAKKwl2cGFkZHEJCTMyKjAtMTkyKCR0cDApLCAkQUNDMCwgJEFDQzAKKwl2cG11bHVkcQkzMiowLTEyOCgkYWFwKSwgJEIxLCAkQUNDMQorCXZwYWRkcQkJMzIqMS0xOTIoJHRwMCksICRBQ0MxLCAkQUNDMQorCXZwbXVsdWRxCTMyKjEtMTI4KCRhYXApLCAkQjEsICRBQ0MyCisJdnBhZGRxCQkzMioyLTE5MigkdHAwKSwgJEFDQzIsICRBQ0MyCisJdnBtdWx1ZHEJMzIqMi0xMjgoJGFhcCksICRCMSwgJEFDQzMKKwl2cGFkZHEJCTMyKjMtMTkyKCR0cDApLCAkQUNDMywgJEFDQzMKKwl2cG11bHVkcQkzMiozLTEyOCgkYWFwKSwgJEIxLCAkQUNDNAorCXZwYWRkcQkJMzIqNC0xOTIoJHRwMCksICRBQ0M0LCAkQUNDNAorCXZwbXVsdWRxCTMyKjQtMTI4KCRhYXApLCAkQjEsICRBQ0M1CisJdnBhZGRxCQkzMio1LTE5MigkdHAwKSwgJEFDQzUsICRBQ0M1CisJdnBtdWx1ZHEJMzIqNS0xMjgoJGFhcCksICRCMSwgJEFDQzYKKwl2cGFkZHEJCTMyKjYtMTkyKCR0cDApLCAkQUNDNiwgJEFDQzYKKwl2cG11bHVkcQkzMio2LTEyOCgkYWFwKSwgJEIxLCAkQUNDNworCXZwYWRkcQkJMzIqNy0xOTIoJHRwMCksICRBQ0M3LCAkQUNDNworCXZwbXVsdWRxCTMyKjctMTI4KCRhYXApLCAkQjEsICRBQ0M4CisJIHZwYnJvYWRjYXN0cQkzMioyLTEyOCgkdHBhKSwgJEIxCisJdnBhZGRxCQkzMio4LTE5MigkdHAwKSwgJEFDQzgsICRBQ0M4CisuTHNxcl9lbnRyeV8xMDI0OgorCXZtb3ZkcXUJCSRBQ0MwLCAzMiowLTE5MigkdHAwKQorCXZtb3ZkcXUJCSRBQ0MxLCAzMioxLTE5MigkdHAwKQorCisJdnBtdWx1ZHEJMzIqMS0xMjgoJGFwKSwgJEIyLCAkVEVNUDAKKwl2cGFkZHEJCSRURU1QMCwgJEFDQzIsICRBQ0MyCisJdnBtdWx1ZHEJMzIqMS0xMjgoJGFhcCksICRCMiwgJFRFTVAxCisJdnBhZGRxCQkkVEVNUDEsICRBQ0MzLCAkQUNDMworCXZwbXVsdWRxCTMyKjItMTI4KCRhYXApLCAkQjIsICRURU1QMgorCXZwYWRkcQkJJFRFTVAyLCAkQUNDNCwgJEFDQzQKKwl2cG11bHVkcQkzMiozLTEyOCgkYWFwKSwgJEIyLCAkVEVNUDAKKwl2cGFkZHEJCSRURU1QMCwgJEFDQzUsICRBQ0M1CisJdnBtdWx1ZHEJMzIqNC0xMjgoJGFhcCksICRCMiwgJFRFTVAxCisJdnBhZGRxCQkkVEVNUDEsICRBQ0M2LCAkQUNDNgorCXZwbXVsdWRxCTMyKjUtMTI4KCRhYXApLCAkQjIsICRURU1QMgorCXZwYWRkcQkJJFRFTVAyLCAkQUNDNywgJEFDQzcKKwl2cG11bHVkcQkzMio2LTEyOCgkYWFwKSwgJEIyLCAkVEVNUDAKKwl2cGFkZHEJCSRURU1QMCwgJEFDQzgsICRBQ0M4CisJdnBtdWx1ZHEJMzIqNy0xMjgoJGFhcCksICRCMiwgJEFDQzAKKwkgdnBicm9hZGNhc3RxCTMyKjMtMTI4KCR0cGEpLCAkQjIKKwl2cGFkZHEJCTMyKjktMTkyKCR0cDApLCAkQUNDMCwgJEFDQzAKKworCXZtb3ZkcXUJCSRBQ0MyLCAzMioyLTE5MigkdHAwKQorCXZtb3ZkcXUJCSRBQ0MzLCAzMiozLTE5MigkdHAwKQorCisJdnBtdWx1ZHEJMzIqMi0xMjgoJGFwKSwgJEIxLCAkVEVNUDIKKwl2cGFkZHEJCSRURU1QMiwgJEFDQzQsICRBQ0M0CisJdnBtdWx1ZHEJMzIqMi0xMjgoJGFhcCksICRCMSwgJFRFTVAwCisJdnBhZGRxCQkkVEVNUDAsICRBQ0M1LCAkQUNDNQorCXZwbXVsdWRxCTMyKjMtMTI4KCRhYXApLCAkQjEsICRURU1QMQorCXZwYWRkcQkJJFRFTVAxLCAkQUNDNiwgJEFDQzYKKwl2cG11bHVkcQkzMio0LTEyOCgkYWFwKSwgJEIxLCAkVEVNUDIKKwl2cGFkZHEJCSRURU1QMiwgJEFDQzcsICRBQ0M3CisJdnBtdWx1ZHEJMzIqNS0xMjgoJGFhcCksICRCMSwgJFRFTVAwCisJdnBhZGRxCQkkVEVNUDAsICRBQ0M4LCAkQUNDOAorCXZwbXVsdWRxCTMyKjYtMTI4KCRhYXApLCAkQjEsICRURU1QMQorCXZwYWRkcQkJJFRFTVAxLCAkQUNDMCwgJEFDQzAKKwl2cG11bHVkcQkzMio3LTEyOCgkYWFwKSwgJEIxLCAkQUNDMQorCSB2cGJyb2FkY2FzdHEJMzIqNC0xMjgoJHRwYSksICRCMQorCXZwYWRkcQkJMzIqMTAtNDQ4KCR0cDEpLCAkQUNDMSwgJEFDQzEKKworCXZtb3ZkcXUJCSRBQ0M0LCAzMio0LTE5MigkdHAwKQorCXZtb3ZkcXUJCSRBQ0M1LCAzMio1LTE5MigkdHAwKQorCisJdnBtdWx1ZHEJMzIqMy0xMjgoJGFwKSwgJEIyLCAkVEVNUDAKKwl2cGFkZHEJCSRURU1QMCwgJEFDQzYsICRBQ0M2CisJdnBtdWx1ZHEJMzIqMy0xMjgoJGFhcCksICRCMiwgJFRFTVAxCisJdnBhZGRxCQkkVEVNUDEsICRBQ0M3LCAkQUNDNworCXZwbXVsdWRxCTMyKjQtMTI4KCRhYXApLCAkQjIsICRURU1QMgorCXZwYWRkcQkJJFRFTVAyLCAkQUNDOCwgJEFDQzgKKwl2cG11bHVkcQkzMio1LTEyOCgkYWFwKSwgJEIyLCAkVEVNUDAKKwl2cGFkZHEJCSRURU1QMCwgJEFDQzAsICRBQ0MwCisJdnBtdWx1ZHEJMzIqNi0xMjgoJGFhcCksICRCMiwgJFRFTVAxCisJdnBhZGRxCQkkVEVNUDEsICRBQ0MxLCAkQUNDMQorCXZwbXVsdWRxCTMyKjctMTI4KCRhYXApLCAkQjIsICRBQ0MyCisJIHZwYnJvYWRjYXN0cQkzMio1LTEyOCgkdHBhKSwgJEIyCisJdnBhZGRxCQkzMioxMS00NDgoJHRwMSksICRBQ0MyLCAkQUNDMgkKKworCXZtb3ZkcXUJCSRBQ0M2LCAzMio2LTE5MigkdHAwKQorCXZtb3ZkcXUJCSRBQ0M3LCAzMio3LTE5MigkdHAwKQorCisJdnBtdWx1ZHEJMzIqNC0xMjgoJGFwKSwgJEIxLCAkVEVNUDAKKwl2cGFkZHEJCSRURU1QMCwgJEFDQzgsICRBQ0M4CisJdnBtdWx1ZHEJMzIqNC0xMjgoJGFhcCksICRCMSwgJFRFTVAxCisJdnBhZGRxCQkkVEVNUDEsICRBQ0MwLCAkQUNDMAorCXZwbXVsdWRxCTMyKjUtMTI4KCRhYXApLCAkQjEsICRURU1QMgorCXZwYWRkcQkJJFRFTVAyLCAkQUNDMSwgJEFDQzEKKwl2cG11bHVkcQkzMio2LTEyOCgkYWFwKSwgJEIxLCAkVEVNUDAKKwl2cGFkZHEJCSRURU1QMCwgJEFDQzIsICRBQ0MyCisJdnBtdWx1ZHEJMzIqNy0xMjgoJGFhcCksICRCMSwgJEFDQzMKKwkgdnBicm9hZGNhc3RxCTMyKjYtMTI4KCR0cGEpLCAkQjEKKwl2cGFkZHEJCTMyKjEyLTQ0OCgkdHAxKSwgJEFDQzMsICRBQ0MzCisKKwl2bW92ZHF1CQkkQUNDOCwgMzIqOC0xOTIoJHRwMCkKKwl2bW92ZHF1CQkkQUNDMCwgMzIqOS0xOTIoJHRwMCkKKwlsZWEJCTgoJHRwMCksICR0cDAKKworCXZwbXVsdWRxCTMyKjUtMTI4KCRhcCksICRCMiwgJFRFTVAyCisJdnBhZGRxCQkkVEVNUDIsICRBQ0MxLCAkQUNDMQorCXZwbXVsdWRxCTMyKjUtMTI4KCRhYXApLCAkQjIsICRURU1QMAorCXZwYWRkcQkJJFRFTVAwLCAkQUNDMiwgJEFDQzIKKwl2cG11bHVkcQkzMio2LTEyOCgkYWFwKSwgJEIyLCAkVEVNUDEKKwl2cGFkZHEJCSRURU1QMSwgJEFDQzMsICRBQ0MzCisJdnBtdWx1ZHEJMzIqNy0xMjgoJGFhcCksICRCMiwgJEFDQzQKKwkgdnBicm9hZGNhc3RxCTMyKjctMTI4KCR0cGEpLCAkQjIKKwl2cGFkZHEJCTMyKjEzLTQ0OCgkdHAxKSwgJEFDQzQsICRBQ0M0CisKKwl2bW92ZHF1CQkkQUNDMSwgMzIqMTAtNDQ4KCR0cDEpCisJdm1vdmRxdQkJJEFDQzIsIDMyKjExLTQ0OCgkdHAxKQorCisJdnBtdWx1ZHEJMzIqNi0xMjgoJGFwKSwgJEIxLCAkVEVNUDAKKwl2cGFkZHEJCSRURU1QMCwgJEFDQzMsICRBQ0MzCisJdnBtdWx1ZHEJMzIqNi0xMjgoJGFhcCksICRCMSwgJFRFTVAxCisJIHZwYnJvYWRjYXN0cQkzMio4LTEyOCgkdHBhKSwgJEFDQzAJCSMgYm9ycm93ICRBQ0MwIGZvciAkQjEKKwl2cGFkZHEJCSRURU1QMSwgJEFDQzQsICRBQ0M0CisJdnBtdWx1ZHEJMzIqNy0xMjgoJGFhcCksICRCMSwgJEFDQzUKKwkgdnBicm9hZGNhc3RxCTMyKjArOC0xMjgoJHRwYSksICRCMQkJIyBmb3IgbmV4dCBpdGVyYXRpb24KKwl2cGFkZHEJCTMyKjE0LTQ0OCgkdHAxKSwgJEFDQzUsICRBQ0M1CisKKwl2bW92ZHF1CQkkQUNDMywgMzIqMTItNDQ4KCR0cDEpCisJdm1vdmRxdQkJJEFDQzQsIDMyKjEzLTQ0OCgkdHAxKQorCWxlYQkJOCgkdHBhKSwgJHRwYQorCisJdnBtdWx1ZHEJMzIqNy0xMjgoJGFwKSwgJEIyLCAkVEVNUDAKKwl2cGFkZHEJCSRURU1QMCwgJEFDQzUsICRBQ0M1CisJdnBtdWx1ZHEJMzIqNy0xMjgoJGFhcCksICRCMiwgJEFDQzYKKwl2cGFkZHEJCTMyKjE1LTQ0OCgkdHAxKSwgJEFDQzYsICRBQ0M2CisKKwl2cG11bHVkcQkzMio4LTEyOCgkYXApLCAkQUNDMCwgJEFDQzcKKwl2bW92ZHF1CQkkQUNDNSwgMzIqMTQtNDQ4KCR0cDEpCisJdnBhZGRxCQkzMioxNi00NDgoJHRwMSksICRBQ0M3LCAkQUNDNworCXZtb3ZkcXUJCSRBQ0M2LCAzMioxNS00NDgoJHRwMSkKKwl2bW92ZHF1CQkkQUNDNywgMzIqMTYtNDQ4KCR0cDEpCisJbGVhCQk4KCR0cDEpLCAkdHAxCisKKwlkZWMJJGkgICAgICAgIAorCWpuegkuTE9PUF9TUVJfMTAyNAorX19fCiskWkVSTyA9ICRBQ0M5OworJFRFTVAwID0gJEIxOworJFRFTVAyID0gJEIyOworJFRFTVAzID0gJFkxOworJFRFTVA0ID0gJFkyOworJGNvZGUuPTw8X19fOworCSN3ZSBuZWVkIHRvIGZpeCBpbmRleGVzIDMyLTM5IHRvIGF2b2lkIG92ZXJmbG93CisJdm1vdmRxdQkJMzIqOCglcnNwKSwgJEFDQzgJCSMgMzIqOC0xOTIoJHRwMCksCisJdm1vdmRxdQkJMzIqOSglcnNwKSwgJEFDQzEJCSMgMzIqOS0xOTIoJHRwMCkKKwl2bW92ZHF1CQkzMioxMCglcnNwKSwgJEFDQzIJCSMgMzIqMTAtMTkyKCR0cDApCisJbGVhCQkxOTIoJXJzcCksICR0cDAJCQkjIDY0KzEyOD0xOTIKKworCXZwc3JscQkJXCQyOSwgJEFDQzgsICRURU1QMQorCXZwYW5kCQkkQU5EX01BU0ssICRBQ0M4LCAkQUNDOAorCXZwc3JscQkJXCQyOSwgJEFDQzEsICRURU1QMgorCXZwYW5kCQkkQU5EX01BU0ssICRBQ0MxLCAkQUNDMQorCisJdnBlcm1xCQlcJDB4OTMsICRURU1QMSwgJFRFTVAxCisJdnB4b3IJCSRaRVJPLCAkWkVSTywgJFpFUk8KKwl2cGVybXEJCVwkMHg5MywgJFRFTVAyLCAkVEVNUDIKKworCXZwYmxlbmRkCVwkMywgJFpFUk8sICRURU1QMSwgJFRFTVAwCisJdnBibGVuZGQJXCQzLCAkVEVNUDEsICRURU1QMiwgJFRFTVAxCisJdnBhZGRxCQkkVEVNUDAsICRBQ0M4LCAkQUNDOAorCXZwYmxlbmRkCVwkMywgJFRFTVAyLCAkWkVSTywgJFRFTVAyCisJdnBhZGRxCQkkVEVNUDEsICRBQ0MxLCAkQUNDMQorCXZwYWRkcQkJJFRFTVAyLCAkQUNDMiwgJEFDQzIKKwl2bW92ZHF1CQkkQUNDMSwgMzIqOS0xOTIoJHRwMCkKKwl2bW92ZHF1CQkkQUNDMiwgMzIqMTAtMTkyKCR0cDApCisKKwltb3YJKCVyc3ApLCAlcmF4CisJbW92CTgoJXJzcCksICRyMQorCW1vdgkxNiglcnNwKSwgJHIyCisJbW92CTI0KCVyc3ApLCAkcjMKKwl2bW92ZHF1CTMyKjEoJXJzcCksICRBQ0MxCisJdm1vdmRxdQkzMioyLTE5MigkdHAwKSwgJEFDQzIKKwl2bW92ZHF1CTMyKjMtMTkyKCR0cDApLCAkQUNDMworCXZtb3ZkcXUJMzIqNC0xOTIoJHRwMCksICRBQ0M0CisJdm1vdmRxdQkzMio1LTE5MigkdHAwKSwgJEFDQzUKKwl2bW92ZHF1CTMyKjYtMTkyKCR0cDApLCAkQUNDNgorCXZtb3ZkcXUJMzIqNy0xOTIoJHRwMCksICRBQ0M3CisKKwltb3YJJXJheCwgJHIwCisJaW11bGwJJG4wLCAlZWF4CisJYW5kCVwkMHgxZmZmZmZmZiwgJWVheAorCXZtb3ZkCSVlYXgsICRZMQorCisJbW92CSVyYXgsICVyZHgKKwlpbXVscQktMTI4KCRucCksICVyYXgKKwkgdnBicm9hZGNhc3RxCSRZMSwgJFkxCisJYWRkCSVyYXgsICRyMAorCW1vdgklcmR4LCAlcmF4CisJaW11bHEJOC0xMjgoJG5wKSwgJXJheAorCXNocglcJDI5LCAkcjAKKwlhZGQJJXJheCwgJHIxCisJbW92CSVyZHgsICVyYXgKKwlpbXVscQkxNi0xMjgoJG5wKSwgJXJheAorCWFkZAkkcjAsICRyMQorCWFkZAklcmF4LCAkcjIKKwlpbXVscQkyNC0xMjgoJG5wKSwgJXJkeAorCWFkZAklcmR4LCAkcjMKKworCW1vdgkkcjEsICVyYXgKKwlpbXVsbAkkbjAsICVlYXgKKwlhbmQJXCQweDFmZmZmZmZmLCAlZWF4CisKKwltb3YgXCQ5LCAkaQorCWptcCAuTE9PUF9SRURVQ0VfMTAyNAorCisuYWxpZ24JMzIKKy5MT09QX1JFRFVDRV8xMDI0OgorCXZtb3ZkCSVlYXgsICRZMgorCXZwYnJvYWRjYXN0cQkkWTIsICRZMgorCisJdnBtdWx1ZHEJMzIqMS0xMjgoJG5wKSwgJFkxLCAkVEVNUDAKKwkgbW92CSVyYXgsICVyZHgKKwkgaW11bHEJLTEyOCgkbnApLCAlcmF4CisJdnBhZGRxCQkkVEVNUDAsICRBQ0MxLCAkQUNDMQorCSBhZGQJJXJheCwgJHIxCisJdnBtdWx1ZHEJMzIqMi0xMjgoJG5wKSwgJFkxLCAkVEVNUDEKKwkgbW92CSVyZHgsICVyYXgKKwkgaW11bHEJOC0xMjgoJG5wKSwgJXJheAorCXZwYWRkcQkJJFRFTVAxLCAkQUNDMiwgJEFDQzIKKwl2cG11bHVkcQkzMiozLTEyOCgkbnApLCAkWTEsICRURU1QMgorCSAuYnl0ZQkweDY3CisJIGFkZAklcmF4LCAkcjIKKwkgLmJ5dGUJMHg2NworCSBtb3YJJXJkeCwgJXJheAorCSBpbXVscQkxNi0xMjgoJG5wKSwgJXJheAorCSBzaHIJXCQyOSwgJHIxCisJdnBhZGRxCQkkVEVNUDIsICRBQ0MzLCAkQUNDMworCXZwbXVsdWRxCTMyKjQtMTI4KCRucCksICRZMSwgJFRFTVAwCisJIGFkZAklcmF4LCAkcjMKKwkgYWRkCSRyMSwgJHIyCisJdnBhZGRxCQkkVEVNUDAsICRBQ0M0LCAkQUNDNAorCXZwbXVsdWRxCTMyKjUtMTI4KCRucCksICRZMSwgJFRFTVAxCisJIG1vdgkkcjIsICVyYXgKKwkgaW11bGwJJG4wLCAlZWF4CisJdnBhZGRxCQkkVEVNUDEsICRBQ0M1LCAkQUNDNQorCXZwbXVsdWRxCTMyKjYtMTI4KCRucCksICRZMSwgJFRFTVAyCisJIGFuZAlcJDB4MWZmZmZmZmYsICVlYXgKKwl2cGFkZHEJCSRURU1QMiwgJEFDQzYsICRBQ0M2CisJdnBtdWx1ZHEJMzIqNy0xMjgoJG5wKSwgJFkxLCAkVEVNUDAKKwl2cGFkZHEJCSRURU1QMCwgJEFDQzcsICRBQ0M3CisJdnBtdWx1ZHEJMzIqOC0xMjgoJG5wKSwgJFkxLCAkVEVNUDEKKwkgdm1vdmQJJWVheCwgJFkxCisJICN2bW92ZHF1CTMyKjEtOC0xMjgoJG5wKSwgJFRFTVAyCQkjIG1vdmVkIGJlbG93CisJdnBhZGRxCQkkVEVNUDEsICRBQ0M4LCAkQUNDOAorCSAjdm1vdmRxdQkzMioyLTgtMTI4KCRucCksICRURU1QMAkJIyBtb3ZlZCBiZWxvdworCSB2cGJyb2FkY2FzdHEJJFkxLCAkWTEKKworCXZwbXVsdWRxCTMyKjEtOC0xMjgoJG5wKSwgJFkyLCAkVEVNUDIJIyBzZWUgYWJvdmUKKwl2bW92ZHF1CQkzMiozLTgtMTI4KCRucCksICRURU1QMQorCSBtb3YJJXJheCwgJXJkeAorCSBpbXVscQktMTI4KCRucCksICVyYXgKKwl2cGFkZHEJCSRURU1QMiwgJEFDQzEsICRBQ0MxCisJdnBtdWx1ZHEJMzIqMi04LTEyOCgkbnApLCAkWTIsICRURU1QMAkjIHNlZSBhYm92ZQorCXZtb3ZkcXUJCTMyKjQtOC0xMjgoJG5wKSwgJFRFTVAyCisJIGFkZAklcmF4LCAkcjIKKwkgbW92CSVyZHgsICVyYXgKKwkgaW11bHEJOC0xMjgoJG5wKSwgJXJheAorCXZwYWRkcQkJJFRFTVAwLCAkQUNDMiwgJEFDQzIKKwkgYWRkCSRyMywgJXJheAorCSBzaHIJXCQyOSwgJHIyCisJdnBtdWx1ZHEJJFkyLCAkVEVNUDEsICRURU1QMQorCXZtb3ZkcXUJCTMyKjUtOC0xMjgoJG5wKSwgJFRFTVAwCisJIGFkZAkkcjIsICVyYXgKKwl2cGFkZHEJCSRURU1QMSwgJEFDQzMsICRBQ0MzCisJdnBtdWx1ZHEJJFkyLCAkVEVNUDIsICRURU1QMgorCXZtb3ZkcXUJCTMyKjYtOC0xMjgoJG5wKSwgJFRFTVAxCisJIC5ieXRlCTB4NjcKKwkgbW92CSVyYXgsICRyMworCSBpbXVsbAkkbjAsICVlYXgKKwl2cGFkZHEJCSRURU1QMiwgJEFDQzQsICRBQ0M0CisJdnBtdWx1ZHEJJFkyLCAkVEVNUDAsICRURU1QMAorCS5ieXRlCTB4YzQsMHg0MSwweDdlLDB4NmYsMHg5ZCwweDU4LDB4MDAsMHgwMCwweDAwCSMgdm1vdmRxdQkJMzIqNy04LTEyOCgkbnApLCAkVEVNUDIKKwkgYW5kCVwkMHgxZmZmZmZmZiwgJWVheAorCXZwYWRkcQkJJFRFTVAwLCAkQUNDNSwgJEFDQzUKKwl2cG11bHVkcQkkWTIsICRURU1QMSwgJFRFTVAxCisJdm1vdmRxdQkJMzIqOC04LTEyOCgkbnApLCAkVEVNUDAKKwl2cGFkZHEJCSRURU1QMSwgJEFDQzYsICRBQ0M2CisJdnBtdWx1ZHEJJFkyLCAkVEVNUDIsICRURU1QMgorCXZtb3ZkcXUJCTMyKjktOC0xMjgoJG5wKSwgJEFDQzkKKwkgdm1vdmQJJWVheCwgJEFDQzAJCQkjIGJvcnJvdyBBQ0MwIGZvciBZMgorCSBpbXVscQktMTI4KCRucCksICVyYXgKKwl2cGFkZHEJCSRURU1QMiwgJEFDQzcsICRBQ0M3CisJdnBtdWx1ZHEJJFkyLCAkVEVNUDAsICRURU1QMAorCSB2bW92ZHF1CTMyKjEtMTYtMTI4KCRucCksICRURU1QMQorCSB2cGJyb2FkY2FzdHEJJEFDQzAsICRBQ0MwCisJdnBhZGRxCQkkVEVNUDAsICRBQ0M4LCAkQUNDOAorCXZwbXVsdWRxCSRZMiwgJEFDQzksICRBQ0M5CisJIHZtb3ZkcXUJMzIqMi0xNi0xMjgoJG5wKSwgJFRFTVAyCisJIGFkZAklcmF4LCAkcjMKKworX19fCisoJEFDQzAsJFkyKT0oJFkyLCRBQ0MwKTsKKyRjb2RlLj08PF9fXzsKKwkgdm1vdmRxdQkzMioxLTI0LTEyOCgkbnApLCAkQUNDMAorCXZwbXVsdWRxCSRZMSwgJFRFTVAxLCAkVEVNUDEKKwl2bW92ZHF1CQkzMiozLTE2LTEyOCgkbnApLCAkVEVNUDAKKwl2cGFkZHEJCSRURU1QMSwgJEFDQzEsICRBQ0MxCisJIHZwbXVsdWRxCSRZMiwgJEFDQzAsICRBQ0MwCisJdnBtdWx1ZHEJJFkxLCAkVEVNUDIsICRURU1QMgorCS5ieXRlCTB4YzQsMHg0MSwweDdlLDB4NmYsMHhiNSwweGYwLDB4ZmYsMHhmZiwweGZmCSMgdm1vdmRxdQkJMzIqNC0xNi0xMjgoJG5wKSwgJFRFTVAxCisJIHZwYWRkcQkJJEFDQzEsICRBQ0MwLCAkQUNDMAorCXZwYWRkcQkJJFRFTVAyLCAkQUNDMiwgJEFDQzIKKwl2cG11bHVkcQkkWTEsICRURU1QMCwgJFRFTVAwCisJdm1vdmRxdQkJMzIqNS0xNi0xMjgoJG5wKSwgJFRFTVAyCisJIC5ieXRlCTB4NjcKKwkgdm1vdnEJCSRBQ0MwLCAlcmF4CisJIHZtb3ZkcXUJJEFDQzAsICglcnNwKQkJIyB0cmFuc2ZlciAkcjAtJHIzCisJdnBhZGRxCQkkVEVNUDAsICRBQ0MzLCAkQUNDMworCXZwbXVsdWRxCSRZMSwgJFRFTVAxLCAkVEVNUDEKKwl2bW92ZHF1CQkzMio2LTE2LTEyOCgkbnApLCAkVEVNUDAKKwl2cGFkZHEJCSRURU1QMSwgJEFDQzQsICRBQ0M0CisJdnBtdWx1ZHEJJFkxLCAkVEVNUDIsICRURU1QMgorCXZtb3ZkcXUJCTMyKjctMTYtMTI4KCRucCksICRURU1QMQorCXZwYWRkcQkJJFRFTVAyLCAkQUNDNSwgJEFDQzUKKwl2cG11bHVkcQkkWTEsICRURU1QMCwgJFRFTVAwCisJdm1vdmRxdQkJMzIqOC0xNi0xMjgoJG5wKSwgJFRFTVAyCisJdnBhZGRxCQkkVEVNUDAsICRBQ0M2LCAkQUNDNgorCXZwbXVsdWRxCSRZMSwgJFRFTVAxLCAkVEVNUDEKKwkgc2hyCVwkMjksICRyMworCXZtb3ZkcXUJCTMyKjktMTYtMTI4KCRucCksICRURU1QMAorCSBhZGQJJHIzLCAlcmF4CisJdnBhZGRxCQkkVEVNUDEsICRBQ0M3LCAkQUNDNworCXZwbXVsdWRxCSRZMSwgJFRFTVAyLCAkVEVNUDIKKwkgI3Ztb3ZkcXUJMzIqMi0yNC0xMjgoJG5wKSwgJFRFTVAxCSMgbW92ZWQgYmVsb3cKKwkgbW92CSVyYXgsICRyMAorCSBpbXVsbAkkbjAsICVlYXgKKwl2cGFkZHEJCSRURU1QMiwgJEFDQzgsICRBQ0M4CisJdnBtdWx1ZHEJJFkxLCAkVEVNUDAsICRURU1QMAorCSBhbmQJXCQweDFmZmZmZmZmLCAlZWF4CisJIHZtb3ZkCSVlYXgsICRZMQorCSB2bW92ZHF1CTMyKjMtMjQtMTI4KCRucCksICRURU1QMgorCS5ieXRlCTB4NjcKKwl2cGFkZHEJCSRURU1QMCwgJEFDQzksICRBQ0M5CisJIHZwYnJvYWRjYXN0cQkkWTEsICRZMQorCisJdnBtdWx1ZHEJMzIqMi0yNC0xMjgoJG5wKSwgJFkyLCAkVEVNUDEJIyBzZWUgYWJvdmUKKwl2bW92ZHF1CQkzMio0LTI0LTEyOCgkbnApLCAkVEVNUDAKKwkgbW92CSVyYXgsICVyZHgKKwkgaW11bHEJLTEyOCgkbnApLCAlcmF4CisJIG1vdgk4KCVyc3ApLCAkcjEKKwl2cGFkZHEJCSRURU1QMSwgJEFDQzIsICRBQ0MxCisJdnBtdWx1ZHEJJFkyLCAkVEVNUDIsICRURU1QMgorCXZtb3ZkcXUJCTMyKjUtMjQtMTI4KCRucCksICRURU1QMQorCSBhZGQJJXJheCwgJHIwCisJIG1vdgklcmR4LCAlcmF4CisJIGltdWxxCTgtMTI4KCRucCksICVyYXgKKwkgLmJ5dGUJMHg2NworCSBzaHIJXCQyOSwgJHIwCisJIG1vdgkxNiglcnNwKSwgJHIyCisJdnBhZGRxCQkkVEVNUDIsICRBQ0MzLCAkQUNDMgorCXZwbXVsdWRxCSRZMiwgJFRFTVAwLCAkVEVNUDAKKwl2bW92ZHF1CQkzMio2LTI0LTEyOCgkbnApLCAkVEVNUDIKKwkgYWRkCSVyYXgsICRyMQorCSBtb3YJJXJkeCwgJXJheAorCSBpbXVscQkxNi0xMjgoJG5wKSwgJXJheAorCXZwYWRkcQkJJFRFTVAwLCAkQUNDNCwgJEFDQzMKKwl2cG11bHVkcQkkWTIsICRURU1QMSwgJFRFTVAxCisJdm1vdmRxdQkJMzIqNy0yNC0xMjgoJG5wKSwgJFRFTVAwCisJIGltdWxxCTI0LTEyOCgkbnApLCAlcmR4CQkjIGZ1dHVyZSAkcjMKKwkgYWRkCSVyYXgsICRyMgorCSBsZWEJKCRyMCwkcjEpLCAlcmF4CisJdnBhZGRxCQkkVEVNUDEsICRBQ0M1LCAkQUNDNAorCXZwbXVsdWRxCSRZMiwgJFRFTVAyLCAkVEVNUDIKKwl2bW92ZHF1CQkzMio4LTI0LTEyOCgkbnApLCAkVEVNUDEKKwkgbW92CSVyYXgsICRyMQorCSBpbXVsbAkkbjAsICVlYXgKKwl2cG11bHVkcQkkWTIsICRURU1QMCwgJFRFTVAwCisJdnBhZGRxCQkkVEVNUDIsICRBQ0M2LCAkQUNDNQorCXZtb3ZkcXUJCTMyKjktMjQtMTI4KCRucCksICRURU1QMgorCSBhbmQJXCQweDFmZmZmZmZmLCAlZWF4CisJdnBhZGRxCQkkVEVNUDAsICRBQ0M3LCAkQUNDNgorCXZwbXVsdWRxCSRZMiwgJFRFTVAxLCAkVEVNUDEKKwkgYWRkCTI0KCVyc3ApLCAlcmR4CisJdnBhZGRxCQkkVEVNUDEsICRBQ0M4LCAkQUNDNworCXZwbXVsdWRxCSRZMiwgJFRFTVAyLCAkVEVNUDIKKwl2cGFkZHEJCSRURU1QMiwgJEFDQzksICRBQ0M4CisJIHZtb3ZxCSRyMywgJEFDQzkKKwkgbW92CSVyZHgsICRyMworCisJZGVjCSRpCisJam56CS5MT09QX1JFRFVDRV8xMDI0CitfX18KKygkQUNDMCwkWTIpPSgkWTIsJEFDQzApOworJGNvZGUuPTw8X19fOworCWxlYQk0NDgoJXJzcCksICR0cDEJCQkjIHNpemUgb3B0aW1pemF0aW9uCisJdnBhZGRxCSRBQ0M5LCAkWTIsICRBQ0MwCisJdnB4b3IJJFpFUk8sICRaRVJPLCAkWkVSTworCisJdnBhZGRxCQkzMio5LTE5MigkdHAwKSwgJEFDQzAsICRBQ0MwCisJdnBhZGRxCQkzMioxMC00NDgoJHRwMSksICRBQ0MxLCAkQUNDMQorCXZwYWRkcQkJMzIqMTEtNDQ4KCR0cDEpLCAkQUNDMiwgJEFDQzIKKwl2cGFkZHEJCTMyKjEyLTQ0OCgkdHAxKSwgJEFDQzMsICRBQ0MzCisJdnBhZGRxCQkzMioxMy00NDgoJHRwMSksICRBQ0M0LCAkQUNDNAorCXZwYWRkcQkJMzIqMTQtNDQ4KCR0cDEpLCAkQUNDNSwgJEFDQzUKKwl2cGFkZHEJCTMyKjE1LTQ0OCgkdHAxKSwgJEFDQzYsICRBQ0M2CisJdnBhZGRxCQkzMioxNi00NDgoJHRwMSksICRBQ0M3LCAkQUNDNworCXZwYWRkcQkJMzIqMTctNDQ4KCR0cDEpLCAkQUNDOCwgJEFDQzgKKworCXZwc3JscQkJXCQyOSwgJEFDQzAsICRURU1QMQorCXZwYW5kCQkkQU5EX01BU0ssICRBQ0MwLCAkQUNDMAorCXZwc3JscQkJXCQyOSwgJEFDQzEsICRURU1QMgorCXZwYW5kCQkkQU5EX01BU0ssICRBQ0MxLCAkQUNDMQorCXZwc3JscQkJXCQyOSwgJEFDQzIsICRURU1QMworCXZwZXJtcQkJXCQweDkzLCAkVEVNUDEsICRURU1QMQorCXZwYW5kCQkkQU5EX01BU0ssICRBQ0MyLCAkQUNDMgorCXZwc3JscQkJXCQyOSwgJEFDQzMsICRURU1QNAorCXZwZXJtcQkJXCQweDkzLCAkVEVNUDIsICRURU1QMgorCXZwYW5kCQkkQU5EX01BU0ssICRBQ0MzLCAkQUNDMworCXZwZXJtcQkJXCQweDkzLCAkVEVNUDMsICRURU1QMworCisJdnBibGVuZGQJXCQzLCAkWkVSTywgJFRFTVAxLCAkVEVNUDAKKwl2cGVybXEJCVwkMHg5MywgJFRFTVA0LCAkVEVNUDQKKwl2cGJsZW5kZAlcJDMsICRURU1QMSwgJFRFTVAyLCAkVEVNUDEKKwl2cGFkZHEJCSRURU1QMCwgJEFDQzAsICRBQ0MwCisJdnBibGVuZGQJXCQzLCAkVEVNUDIsICRURU1QMywgJFRFTVAyCisJdnBhZGRxCQkkVEVNUDEsICRBQ0MxLCAkQUNDMQorCXZwYmxlbmRkCVwkMywgJFRFTVAzLCAkVEVNUDQsICRURU1QMworCXZwYWRkcQkJJFRFTVAyLCAkQUNDMiwgJEFDQzIKKwl2cGJsZW5kZAlcJDMsICRURU1QNCwgJFpFUk8sICRURU1QNAorCXZwYWRkcQkJJFRFTVAzLCAkQUNDMywgJEFDQzMKKwl2cGFkZHEJCSRURU1QNCwgJEFDQzQsICRBQ0M0CisKKwl2cHNybHEJCVwkMjksICRBQ0MwLCAkVEVNUDEKKwl2cGFuZAkJJEFORF9NQVNLLCAkQUNDMCwgJEFDQzAKKwl2cHNybHEJCVwkMjksICRBQ0MxLCAkVEVNUDIKKwl2cGFuZAkJJEFORF9NQVNLLCAkQUNDMSwgJEFDQzEKKwl2cHNybHEJCVwkMjksICRBQ0MyLCAkVEVNUDMKKwl2cGVybXEJCVwkMHg5MywgJFRFTVAxLCAkVEVNUDEKKwl2cGFuZAkJJEFORF9NQVNLLCAkQUNDMiwgJEFDQzIKKwl2cHNybHEJCVwkMjksICRBQ0MzLCAkVEVNUDQKKwl2cGVybXEJCVwkMHg5MywgJFRFTVAyLCAkVEVNUDIKKwl2cGFuZAkJJEFORF9NQVNLLCAkQUNDMywgJEFDQzMKKwl2cGVybXEJCVwkMHg5MywgJFRFTVAzLCAkVEVNUDMKKworCXZwYmxlbmRkCVwkMywgJFpFUk8sICRURU1QMSwgJFRFTVAwCisJdnBlcm1xCQlcJDB4OTMsICRURU1QNCwgJFRFTVA0CisJdnBibGVuZGQJXCQzLCAkVEVNUDEsICRURU1QMiwgJFRFTVAxCisJdnBhZGRxCQkkVEVNUDAsICRBQ0MwLCAkQUNDMAorCXZwYmxlbmRkCVwkMywgJFRFTVAyLCAkVEVNUDMsICRURU1QMgorCXZwYWRkcQkJJFRFTVAxLCAkQUNDMSwgJEFDQzEKKwl2bW92ZHF1CQkkQUNDMCwgMzIqMC0xMjgoJHJwKQorCXZwYmxlbmRkCVwkMywgJFRFTVAzLCAkVEVNUDQsICRURU1QMworCXZwYWRkcQkJJFRFTVAyLCAkQUNDMiwgJEFDQzIKKwl2bW92ZHF1CQkkQUNDMSwgMzIqMS0xMjgoJHJwKQorCXZwYmxlbmRkCVwkMywgJFRFTVA0LCAkWkVSTywgJFRFTVA0CisJdnBhZGRxCQkkVEVNUDMsICRBQ0MzLCAkQUNDMworCXZtb3ZkcXUJCSRBQ0MyLCAzMioyLTEyOCgkcnApCisJdnBhZGRxCQkkVEVNUDQsICRBQ0M0LCAkQUNDNAorCXZtb3ZkcXUJCSRBQ0MzLCAzMiozLTEyOCgkcnApCitfX18KKyRURU1QNT0kQUNDMDsKKyRjb2RlLj08PF9fXzsKKwl2cHNybHEJCVwkMjksICRBQ0M0LCAkVEVNUDEKKwl2cGFuZAkJJEFORF9NQVNLLCAkQUNDNCwgJEFDQzQKKwl2cHNybHEJCVwkMjksICRBQ0M1LCAkVEVNUDIKKwl2cGFuZAkJJEFORF9NQVNLLCAkQUNDNSwgJEFDQzUKKwl2cHNybHEJCVwkMjksICRBQ0M2LCAkVEVNUDMKKwl2cGVybXEJCVwkMHg5MywgJFRFTVAxLCAkVEVNUDEKKwl2cGFuZAkJJEFORF9NQVNLLCAkQUNDNiwgJEFDQzYKKwl2cHNybHEJCVwkMjksICRBQ0M3LCAkVEVNUDQKKwl2cGVybXEJCVwkMHg5MywgJFRFTVAyLCAkVEVNUDIKKwl2cGFuZAkJJEFORF9NQVNLLCAkQUNDNywgJEFDQzcKKwl2cHNybHEJCVwkMjksICRBQ0M4LCAkVEVNUDUKKwl2cGVybXEJCVwkMHg5MywgJFRFTVAzLCAkVEVNUDMKKwl2cGFuZAkJJEFORF9NQVNLLCAkQUNDOCwgJEFDQzgKKwl2cGVybXEJCVwkMHg5MywgJFRFTVA0LCAkVEVNUDQKKworCXZwYmxlbmRkCVwkMywgJFpFUk8sICRURU1QMSwgJFRFTVAwCisJdnBlcm1xCQlcJDB4OTMsICRURU1QNSwgJFRFTVA1CisJdnBibGVuZGQJXCQzLCAkVEVNUDEsICRURU1QMiwgJFRFTVAxCisJdnBhZGRxCQkkVEVNUDAsICRBQ0M0LCAkQUNDNAorCXZwYmxlbmRkCVwkMywgJFRFTVAyLCAkVEVNUDMsICRURU1QMgorCXZwYWRkcQkJJFRFTVAxLCAkQUNDNSwgJEFDQzUKKwl2cGJsZW5kZAlcJDMsICRURU1QMywgJFRFTVA0LCAkVEVNUDMKKwl2cGFkZHEJCSRURU1QMiwgJEFDQzYsICRBQ0M2CisJdnBibGVuZGQJXCQzLCAkVEVNUDQsICRURU1QNSwgJFRFTVA0CisJdnBhZGRxCQkkVEVNUDMsICRBQ0M3LCAkQUNDNworCXZwYWRkcQkJJFRFTVA0LCAkQUNDOCwgJEFDQzgKKyAgICAgCisJdnBzcmxxCQlcJDI5LCAkQUNDNCwgJFRFTVAxCisJdnBhbmQJCSRBTkRfTUFTSywgJEFDQzQsICRBQ0M0CisJdnBzcmxxCQlcJDI5LCAkQUNDNSwgJFRFTVAyCisJdnBhbmQJCSRBTkRfTUFTSywgJEFDQzUsICRBQ0M1CisJdnBzcmxxCQlcJDI5LCAkQUNDNiwgJFRFTVAzCisJdnBlcm1xCQlcJDB4OTMsICRURU1QMSwgJFRFTVAxCisJdnBhbmQJCSRBTkRfTUFTSywgJEFDQzYsICRBQ0M2CisJdnBzcmxxCQlcJDI5LCAkQUNDNywgJFRFTVA0CisJdnBlcm1xCQlcJDB4OTMsICRURU1QMiwgJFRFTVAyCisJdnBhbmQJCSRBTkRfTUFTSywgJEFDQzcsICRBQ0M3CisJdnBzcmxxCQlcJDI5LCAkQUNDOCwgJFRFTVA1CisJdnBlcm1xCQlcJDB4OTMsICRURU1QMywgJFRFTVAzCisJdnBhbmQJCSRBTkRfTUFTSywgJEFDQzgsICRBQ0M4CisJdnBlcm1xCQlcJDB4OTMsICRURU1QNCwgJFRFTVA0CisKKwl2cGJsZW5kZAlcJDMsICRaRVJPLCAkVEVNUDEsICRURU1QMAorCXZwZXJtcQkJXCQweDkzLCAkVEVNUDUsICRURU1QNQorCXZwYmxlbmRkCVwkMywgJFRFTVAxLCAkVEVNUDIsICRURU1QMQorCXZwYWRkcQkJJFRFTVAwLCAkQUNDNCwgJEFDQzQKKwl2cGJsZW5kZAlcJDMsICRURU1QMiwgJFRFTVAzLCAkVEVNUDIKKwl2cGFkZHEJCSRURU1QMSwgJEFDQzUsICRBQ0M1CisJdm1vdmRxdQkJJEFDQzQsIDMyKjQtMTI4KCRycCkKKwl2cGJsZW5kZAlcJDMsICRURU1QMywgJFRFTVA0LCAkVEVNUDMKKwl2cGFkZHEJCSRURU1QMiwgJEFDQzYsICRBQ0M2CisJdm1vdmRxdQkJJEFDQzUsIDMyKjUtMTI4KCRycCkKKwl2cGJsZW5kZAlcJDMsICRURU1QNCwgJFRFTVA1LCAkVEVNUDQKKwl2cGFkZHEJCSRURU1QMywgJEFDQzcsICRBQ0M3CisJdm1vdmRxdQkJJEFDQzYsIDMyKjYtMTI4KCRycCkKKwl2cGFkZHEJCSRURU1QNCwgJEFDQzgsICRBQ0M4CisJdm1vdmRxdQkJJEFDQzcsIDMyKjctMTI4KCRycCkKKwl2bW92ZHF1CQkkQUNDOCwgMzIqOC0xMjgoJHJwKQorCisJbW92CSRycCwgJGFwCisJZGVjCSRyZXAKKwlqbmUJLkxPT1BfR1JBTkRFX1NRUl8xMDI0CisKKwl2emVyb2FsbAorCW1vdgklcmJwLCAlcmF4CitfX18KKyRjb2RlLj08PF9fXyBpZiAoJHdpbjY0KTsKKwltb3ZhcHMJLTB4ZDgoJXJheCksJXhtbTYKKwltb3ZhcHMJLTB4YzgoJXJheCksJXhtbTcKKwltb3ZhcHMJLTB4YjgoJXJheCksJXhtbTgKKwltb3ZhcHMJLTB4YTgoJXJheCksJXhtbTkKKwltb3ZhcHMJLTB4OTgoJXJheCksJXhtbTEwCisJbW92YXBzCS0weDg4KCVyYXgpLCV4bW0xMQorCW1vdmFwcwktMHg3OCglcmF4KSwleG1tMTIKKwltb3ZhcHMJLTB4NjgoJXJheCksJXhtbTEzCisJbW92YXBzCS0weDU4KCVyYXgpLCV4bW0xNAorCW1vdmFwcwktMHg0OCglcmF4KSwleG1tMTUKK19fXworJGNvZGUuPTw8X19fOworCW1vdgktNDgoJXJheCksJXIxNQorCW1vdgktNDAoJXJheCksJXIxNAorCW1vdgktMzIoJXJheCksJXIxMworCW1vdgktMjQoJXJheCksJXIxMgorCW1vdgktMTYoJXJheCksJXJicAorCW1vdgktOCglcmF4KSwlcmJ4CisJbGVhCSglcmF4KSwlcnNwCQkjIHJlc3RvcmUgJXJzcAorLkxzcXJfMTAyNF9lcGlsb2d1ZToKKwlyZXQKKy5zaXplCXJzYXpfMTAyNF9zcXJfYXZ4MiwuLXJzYXpfMTAyNF9zcXJfYXZ4MgorX19fCit9CisKK3sgIyB2b2lkIEFNTV9XVygKK215ICRycD0iJXJkaSI7CSMgQk5fVUxPTkcgKnJwLAorbXkgJGFwPSIlcnNpIjsJIyBjb25zdCBCTl9VTE9ORyAqYXAsCitteSAkYnA9IiVyZHgiOwkjIGNvbnN0IEJOX1VMT05HICpicCwKK215ICRucD0iJXJjeCI7CSMgY29uc3QgQk5fVUxPTkcgKm5wLAorbXkgJG4wPSIlcjhkIjsJIyB1bnNpZ25lZCBpbnQgbjApOworCisjIFRoZSByZWdpc3RlcnMgdGhhdCBob2xkIHRoZSBhY2N1bXVsYXRlZCByZWR1bmRhbnQgcmVzdWx0CisjIFRoZSBBTU0gd29ya3Mgb24gMTAyNCBiaXQgb3BlcmFuZHMsIGFuZCByZWR1bmRhbnQgd29yZCBzaXplIGlzIDI5CisjIFRoZXJlZm9yZTogY2VpbCgxMDI0LzI5KS80ID0gOQorbXkgJEFDQzA9IiV5bW0wIjsKK215ICRBQ0MxPSIleW1tMSI7CitteSAkQUNDMj0iJXltbTIiOworbXkgJEFDQzM9IiV5bW0zIjsKK215ICRBQ0M0PSIleW1tNCI7CitteSAkQUNDNT0iJXltbTUiOworbXkgJEFDQzY9IiV5bW02IjsKK215ICRBQ0M3PSIleW1tNyI7CitteSAkQUNDOD0iJXltbTgiOworbXkgJEFDQzk9IiV5bW05IjsKKworIyBSZWdpc3RlcnMgdGhhdCBob2xkIHRoZSBicm9hZGNhc3RlZCB3b3JkcyBvZiBtdWx0aXBsaWVyLCBjdXJyZW50bHkgdXNlZAorbXkgJEJpPSIleW1tMTAiOworbXkgJFlpPSIleW1tMTEiOworCisjIEhlbHBlciByZWdpc3RlcnMKK215ICRURU1QMD0kQUNDMDsKK215ICRURU1QMT0iJXltbTEyIjsKK215ICRURU1QMj0iJXltbTEzIjsKK215ICRaRVJPPSIleW1tMTQiOworbXkgJEFORF9NQVNLPSIleW1tMTUiOworCisjIGFsdSByZWdpc3RlcnMgdGhhdCBob2xkIHRoZSBmaXJzdCB3b3JkcyBvZiB0aGUgQUNDCitteSAkcjA9IiVyOSI7CitteSAkcjE9IiVyMTAiOworbXkgJHIyPSIlcjExIjsKK215ICRyMz0iJXIxMiI7CisKK215ICRpPSIlcjE0ZCI7CitteSAkdG1wPSIlcjE1IjsKKworJGJwPSIlcjEzIjsJIyByZWFzc2lnbmVkIGFyZ3VtZW50CisKKyRjb2RlLj08PF9fXzsKKy5nbG9ibAlyc2F6XzEwMjRfbXVsX2F2eDIKKy50eXBlCXJzYXpfMTAyNF9tdWxfYXZ4MixcQGZ1bmN0aW9uLDUKKy5hbGlnbgk2NAorcnNhel8xMDI0X211bF9hdngyOgorCWxlYQkoJXJzcCksICVyYXgKKwlwdXNoCSVyYngKKwlwdXNoCSVyYnAKKwlwdXNoCSVyMTIKKwlwdXNoCSVyMTMKKwlwdXNoCSVyMTQKKwlwdXNoCSVyMTUKK19fXworJGNvZGUuPTw8X19fIGlmICgkd2luNjQpOworCXZ6ZXJvdXBwZXIKKwlsZWEJLTB4YTgoJXJzcCksJXJzcAorCXZtb3ZhcHMJJXhtbTYsLTB4ZDgoJXJheCkKKwl2bW92YXBzCSV4bW03LC0weGM4KCVyYXgpCisJdm1vdmFwcwkleG1tOCwtMHhiOCglcmF4KQorCXZtb3ZhcHMJJXhtbTksLTB4YTgoJXJheCkKKwl2bW92YXBzCSV4bW0xMCwtMHg5OCglcmF4KQorCXZtb3ZhcHMJJXhtbTExLC0weDg4KCVyYXgpCisJdm1vdmFwcwkleG1tMTIsLTB4NzgoJXJheCkKKwl2bW92YXBzCSV4bW0xMywtMHg2OCglcmF4KQorCXZtb3ZhcHMJJXhtbTE0LC0weDU4KCVyYXgpCisJdm1vdmFwcwkleG1tMTUsLTB4NDgoJXJheCkKKy5MbXVsXzEwMjRfYm9keToKK19fXworJGNvZGUuPTw8X19fOworCW1vdgklcmF4LCVyYnAKKwl2emVyb2FsbAorCW1vdgklcmR4LCAkYnAJIyByZWFzc2lnbmVkIGFyZ3VtZW50CisJc3ViCVwkNjQsJXJzcAorCisJIyB1bmFsaWduZWQgMjU2LWJpdCBsb2FkIHRoYXQgY3Jvc3NlcyBwYWdlIGJvdW5kYXJ5IGNhbgorCSMgY2F1c2Ugc2V2ZXJlIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uIGhlcmUsIHNvIGlmICRhcCBkb2VzCisJIyBjcm9zcyBwYWdlIGJvdW5kYXJ5LCBzd2FwIGl0IHdpdGggJGJwIFttZWFuaW5nIHRoYXQgY2FsbGVyCisJIyBpcyBhZHZpc2VkIHRvIGxheSBkb3duICRhcCBhbmQgJGJwIG5leHQgdG8gZWFjaCBvdGhlciwgc28KKwkjIHRoYXQgb25seSBvbmUgY2FuIGNyb3NzIHBhZ2UgYm91bmRhcnldLgorCS5ieXRlCTB4NjcsMHg2NworCW1vdgkkYXAsICR0bXAKKwlhbmQJXCQ0MDk1LCAkdG1wCisJYWRkCVwkMzIqMTAsICR0bXAKKwlzaHIJXCQxMiwgJHRtcAorCW1vdgkkYXAsICR0bXAKKwljbW92bnoJJGJwLCAkYXAKKwljbW92bnoJJHRtcCwgJGJwCisKKwltb3YJJG5wLCAkdG1wCisJc3ViCVwkLTEyOCwkYXAJIyBzaXplIG9wdGltaXphdGlvbgorCXN1YglcJC0xMjgsJG5wCisJc3ViCVwkLTEyOCwkcnAKKworCWFuZAlcJDQwOTUsICR0bXAJIyBzZWUgaWYgJG5wIGNyb3NzZXMgcGFnZQorCWFkZAlcJDMyKjEwLCAkdG1wCisJLmJ5dGUJMHg2NywweDY3CisJc2hyCVwkMTIsICR0bXAKKwlqegkuTG11bF8xMDI0X25vX25fY29weQorCisJIyB1bmFsaWduZWQgMjU2LWJpdCBsb2FkIHRoYXQgY3Jvc3NlcyBwYWdlIGJvdW5kYXJ5IGNhbgorCSMgY2F1c2Ugc2V2ZXJlIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uIGhlcmUsIHNvIGlmICRucCBkb2VzCisJIyBjcm9zcyBwYWdlIGJvdW5kYXJ5LCBjb3B5IGl0IHRvIHN0YWNrIGFuZCBtYWtlIHN1cmUgc3RhY2sKKwkjIGZyYW1lIGRvZXNuJ3QuLi4KKwlzdWIJCVwkMzIqMTAsJXJzcAorCXZtb3ZkcXUJCTMyKjAtMTI4KCRucCksICRBQ0MwCisJYW5kCQlcJC01MTIsICVyc3AKKwl2bW92ZHF1CQkzMioxLTEyOCgkbnApLCAkQUNDMQorCXZtb3ZkcXUJCTMyKjItMTI4KCRucCksICRBQ0MyCisJdm1vdmRxdQkJMzIqMy0xMjgoJG5wKSwgJEFDQzMKKwl2bW92ZHF1CQkzMio0LTEyOCgkbnApLCAkQUNDNAorCXZtb3ZkcXUJCTMyKjUtMTI4KCRucCksICRBQ0M1CisJdm1vdmRxdQkJMzIqNi0xMjgoJG5wKSwgJEFDQzYKKwl2bW92ZHF1CQkzMio3LTEyOCgkbnApLCAkQUNDNworCXZtb3ZkcXUJCTMyKjgtMTI4KCRucCksICRBQ0M4CisJbGVhCQk2NCsxMjgoJXJzcCksJG5wCisJdm1vdmRxdQkJJEFDQzAsIDMyKjAtMTI4KCRucCkKKwl2cHhvcgkJJEFDQzAsICRBQ0MwLCAkQUNDMAorCXZtb3ZkcXUJCSRBQ0MxLCAzMioxLTEyOCgkbnApCisJdnB4b3IJCSRBQ0MxLCAkQUNDMSwgJEFDQzEKKwl2bW92ZHF1CQkkQUNDMiwgMzIqMi0xMjgoJG5wKQorCXZweG9yCQkkQUNDMiwgJEFDQzIsICRBQ0MyCisJdm1vdmRxdQkJJEFDQzMsIDMyKjMtMTI4KCRucCkKKwl2cHhvcgkJJEFDQzMsICRBQ0MzLCAkQUNDMworCXZtb3ZkcXUJCSRBQ0M0LCAzMio0LTEyOCgkbnApCisJdnB4b3IJCSRBQ0M0LCAkQUNDNCwgJEFDQzQKKwl2bW92ZHF1CQkkQUNDNSwgMzIqNS0xMjgoJG5wKQorCXZweG9yCQkkQUNDNSwgJEFDQzUsICRBQ0M1CisJdm1vdmRxdQkJJEFDQzYsIDMyKjYtMTI4KCRucCkKKwl2cHhvcgkJJEFDQzYsICRBQ0M2LCAkQUNDNgorCXZtb3ZkcXUJCSRBQ0M3LCAzMio3LTEyOCgkbnApCisJdnB4b3IJCSRBQ0M3LCAkQUNDNywgJEFDQzcKKwl2bW92ZHF1CQkkQUNDOCwgMzIqOC0xMjgoJG5wKQorCXZtb3ZkcWEJCSRBQ0MwLCAkQUNDOAorCXZtb3ZkcXUJCSRBQ0M5LCAzMio5LTEyOCgkbnApCSMgJEFDQzkgaXMgemVybyBhZnRlciB2emVyb2FsbAorLkxtdWxfMTAyNF9ub19uX2NvcHk6CisJYW5kCVwkLTY0LCVyc3AKKworCW1vdgkoJGJwKSwgJXJieAorCXZwYnJvYWRjYXN0cSAoJGJwKSwgJEJpCisJdm1vdmRxdQkkQUNDMCwgKCVyc3ApCQkJIyBjbGVhciB0b3Agb2Ygc3RhY2sKKwl4b3IJJHIwLCAkcjAKKwkuYnl0ZQkweDY3CisJeG9yCSRyMSwgJHIxCisJeG9yCSRyMiwgJHIyCisJeG9yCSRyMywgJHIzCisKKwl2bW92ZHF1CS5MYW5kX21hc2soJXJpcCksICRBTkRfTUFTSworCW1vdglcJDksICRpCisJam1wCS5Mb29wX211bF8xMDI0CisKKy5hbGlnbgkzMgorLkxvb3BfbXVsXzEwMjQ6CisJIHZwc3JscQkJXCQyOSwgJEFDQzMsICRBQ0M5CQkjIGNvcnJlY3QgJEFDQzMoKikKKwltb3YJJXJieCwgJXJheAorCWltdWxxCS0xMjgoJGFwKSwgJXJheAorCWFkZAkkcjAsICVyYXgKKwltb3YJJXJieCwgJHIxCisJaW11bHEJOC0xMjgoJGFwKSwgJHIxCisJYWRkCTgoJXJzcCksICRyMQorCisJbW92CSVyYXgsICRyMAorCWltdWxsCSRuMCwgJWVheAorCWFuZAlcJDB4MWZmZmZmZmYsICVlYXgKKworCSBtb3YJJXJieCwgJHIyCisJIGltdWxxCTE2LTEyOCgkYXApLCAkcjIKKwkgYWRkCTE2KCVyc3ApLCAkcjIKKworCSBtb3YJJXJieCwgJHIzCisJIGltdWxxCTI0LTEyOCgkYXApLCAkcjMKKwkgYWRkCTI0KCVyc3ApLCAkcjMKKwl2cG11bHVkcQkzMioxLTEyOCgkYXApLCRCaSwkVEVNUDAKKwkgdm1vdmQJCSVlYXgsICRZaQorCXZwYWRkcQkJJFRFTVAwLCRBQ0MxLCRBQ0MxCisJdnBtdWx1ZHEJMzIqMi0xMjgoJGFwKSwkQmksJFRFTVAxCisJIHZwYnJvYWRjYXN0cQkkWWksICRZaQorCXZwYWRkcQkJJFRFTVAxLCRBQ0MyLCRBQ0MyCisJdnBtdWx1ZHEJMzIqMy0xMjgoJGFwKSwkQmksJFRFTVAyCisJIHZwYW5kCQkkQU5EX01BU0ssICRBQ0MzLCAkQUNDMwkJIyBjb3JyZWN0ICRBQ0MzCisJdnBhZGRxCQkkVEVNUDIsJEFDQzMsJEFDQzMKKwl2cG11bHVkcQkzMio0LTEyOCgkYXApLCRCaSwkVEVNUDAKKwl2cGFkZHEJCSRURU1QMCwkQUNDNCwkQUNDNAorCXZwbXVsdWRxCTMyKjUtMTI4KCRhcCksJEJpLCRURU1QMQorCXZwYWRkcQkJJFRFTVAxLCRBQ0M1LCRBQ0M1CisJdnBtdWx1ZHEJMzIqNi0xMjgoJGFwKSwkQmksJFRFTVAyCisJdnBhZGRxCQkkVEVNUDIsJEFDQzYsJEFDQzYKKwl2cG11bHVkcQkzMio3LTEyOCgkYXApLCRCaSwkVEVNUDAKKwkgdnBlcm1xCQlcJDB4OTMsICRBQ0M5LCAkQUNDOQkJIyBjb3JyZWN0ICRBQ0MzCisJdnBhZGRxCQkkVEVNUDAsJEFDQzcsJEFDQzcKKwl2cG11bHVkcQkzMio4LTEyOCgkYXApLCRCaSwkVEVNUDEKKwkgdnBicm9hZGNhc3RxCTgoJGJwKSwgJEJpCisJdnBhZGRxCQkkVEVNUDEsJEFDQzgsJEFDQzgKKworCW1vdgklcmF4LCVyZHgKKwlpbXVscQktMTI4KCRucCksJXJheAorCWFkZAklcmF4LCRyMAorCW1vdgklcmR4LCVyYXgKKwlpbXVscQk4LTEyOCgkbnApLCVyYXgKKwlhZGQJJXJheCwkcjEKKwltb3YJJXJkeCwlcmF4CisJaW11bHEJMTYtMTI4KCRucCksJXJheAorCWFkZAklcmF4LCRyMgorCXNocglcJDI5LCAkcjAKKwlpbXVscQkyNC0xMjgoJG5wKSwlcmR4CisJYWRkCSVyZHgsJHIzCisJYWRkCSRyMCwgJHIxCisKKwl2cG11bHVkcQkzMioxLTEyOCgkbnApLCRZaSwkVEVNUDIKKwkgdm1vdnEJCSRCaSwgJXJieAorCXZwYWRkcQkJJFRFTVAyLCRBQ0MxLCRBQ0MxCisJdnBtdWx1ZHEJMzIqMi0xMjgoJG5wKSwkWWksJFRFTVAwCisJdnBhZGRxCQkkVEVNUDAsJEFDQzIsJEFDQzIKKwl2cG11bHVkcQkzMiozLTEyOCgkbnApLCRZaSwkVEVNUDEKKwl2cGFkZHEJCSRURU1QMSwkQUNDMywkQUNDMworCXZwbXVsdWRxCTMyKjQtMTI4KCRucCksJFlpLCRURU1QMgorCXZwYWRkcQkJJFRFTVAyLCRBQ0M0LCRBQ0M0CisJdnBtdWx1ZHEJMzIqNS0xMjgoJG5wKSwkWWksJFRFTVAwCisJdnBhZGRxCQkkVEVNUDAsJEFDQzUsJEFDQzUKKwl2cG11bHVkcQkzMio2LTEyOCgkbnApLCRZaSwkVEVNUDEKKwl2cGFkZHEJCSRURU1QMSwkQUNDNiwkQUNDNgorCXZwbXVsdWRxCTMyKjctMTI4KCRucCksJFlpLCRURU1QMgorCSB2cGJsZW5kZAlcJDMsICRaRVJPLCAkQUNDOSwgJEFDQzkJIyBjb3JyZWN0ICRBQ0MzCisJdnBhZGRxCQkkVEVNUDIsJEFDQzcsJEFDQzcKKwl2cG11bHVkcQkzMio4LTEyOCgkbnApLCRZaSwkVEVNUDAKKwkgdnBhZGRxCQkkQUNDOSwgJEFDQzMsICRBQ0MzCQkjIGNvcnJlY3QgJEFDQzMKKwl2cGFkZHEJCSRURU1QMCwkQUNDOCwkQUNDOAorCisJbW92CSVyYngsICVyYXgKKwlpbXVscQktMTI4KCRhcCksJXJheAorCWFkZAklcmF4LCRyMQorCSB2bW92ZHF1CS04KzMyKjEtMTI4KCRhcCksJFRFTVAxCisJbW92CSVyYngsICVyYXgKKwlpbXVscQk4LTEyOCgkYXApLCVyYXgKKwlhZGQJJXJheCwkcjIKKwkgdm1vdmRxdQktOCszMioyLTEyOCgkYXApLCRURU1QMgorCisJbW92CSRyMSwgJXJheAorCWltdWxsCSRuMCwgJWVheAorCWFuZAlcJDB4MWZmZmZmZmYsICVlYXgKKworCSBpbXVscQkxNi0xMjgoJGFwKSwlcmJ4CisJIGFkZAklcmJ4LCRyMworCXZwbXVsdWRxCSRCaSwkVEVNUDEsJFRFTVAxCisJIHZtb3ZkCQklZWF4LCAkWWkKKwl2bW92ZHF1CQktOCszMiozLTEyOCgkYXApLCRURU1QMAorCXZwYWRkcQkJJFRFTVAxLCRBQ0MxLCRBQ0MxCisJdnBtdWx1ZHEJJEJpLCRURU1QMiwkVEVNUDIKKwkgdnBicm9hZGNhc3RxCSRZaSwgJFlpCisJdm1vdmRxdQkJLTgrMzIqNC0xMjgoJGFwKSwkVEVNUDEKKwl2cGFkZHEJCSRURU1QMiwkQUNDMiwkQUNDMgorCXZwbXVsdWRxCSRCaSwkVEVNUDAsJFRFTVAwCisJdm1vdmRxdQkJLTgrMzIqNS0xMjgoJGFwKSwkVEVNUDIKKwl2cGFkZHEJCSRURU1QMCwkQUNDMywkQUNDMworCXZwbXVsdWRxCSRCaSwkVEVNUDEsJFRFTVAxCisJdm1vdmRxdQkJLTgrMzIqNi0xMjgoJGFwKSwkVEVNUDAKKwl2cGFkZHEJCSRURU1QMSwkQUNDNCwkQUNDNAorCXZwbXVsdWRxCSRCaSwkVEVNUDIsJFRFTVAyCisJdm1vdmRxdQkJLTgrMzIqNy0xMjgoJGFwKSwkVEVNUDEKKwl2cGFkZHEJCSRURU1QMiwkQUNDNSwkQUNDNQorCXZwbXVsdWRxCSRCaSwkVEVNUDAsJFRFTVAwCisJdm1vdmRxdQkJLTgrMzIqOC0xMjgoJGFwKSwkVEVNUDIKKwl2cGFkZHEJCSRURU1QMCwkQUNDNiwkQUNDNgorCXZwbXVsdWRxCSRCaSwkVEVNUDEsJFRFTVAxCisJdm1vdmRxdQkJLTgrMzIqOS0xMjgoJGFwKSwkQUNDOQorCXZwYWRkcQkJJFRFTVAxLCRBQ0M3LCRBQ0M3CisJdnBtdWx1ZHEJJEJpLCRURU1QMiwkVEVNUDIKKwl2cGFkZHEJCSRURU1QMiwkQUNDOCwkQUNDOAorCXZwbXVsdWRxCSRCaSwkQUNDOSwkQUNDOQorCSB2cGJyb2FkY2FzdHEJMTYoJGJwKSwgJEJpCisKKwltb3YJJXJheCwlcmR4CisJaW11bHEJLTEyOCgkbnApLCVyYXgKKwlhZGQJJXJheCwkcjEKKwkgdm1vdmRxdQktOCszMioxLTEyOCgkbnApLCRURU1QMAorCW1vdgklcmR4LCVyYXgKKwlpbXVscQk4LTEyOCgkbnApLCVyYXgKKwlhZGQJJXJheCwkcjIKKwkgdm1vdmRxdQktOCszMioyLTEyOCgkbnApLCRURU1QMQorCXNocglcJDI5LCAkcjEKKwlpbXVscQkxNi0xMjgoJG5wKSwlcmR4CisJYWRkCSVyZHgsJHIzCisJYWRkCSRyMSwgJHIyCisKKwl2cG11bHVkcQkkWWksJFRFTVAwLCRURU1QMAorCSB2bW92cQkJJEJpLCAlcmJ4CisJdm1vdmRxdQkJLTgrMzIqMy0xMjgoJG5wKSwkVEVNUDIKKwl2cGFkZHEJCSRURU1QMCwkQUNDMSwkQUNDMQorCXZwbXVsdWRxCSRZaSwkVEVNUDEsJFRFTVAxCisJdm1vdmRxdQkJLTgrMzIqNC0xMjgoJG5wKSwkVEVNUDAKKwl2cGFkZHEJCSRURU1QMSwkQUNDMiwkQUNDMgorCXZwbXVsdWRxCSRZaSwkVEVNUDIsJFRFTVAyCisJdm1vdmRxdQkJLTgrMzIqNS0xMjgoJG5wKSwkVEVNUDEKKwl2cGFkZHEJCSRURU1QMiwkQUNDMywkQUNDMworCXZwbXVsdWRxCSRZaSwkVEVNUDAsJFRFTVAwCisJdm1vdmRxdQkJLTgrMzIqNi0xMjgoJG5wKSwkVEVNUDIKKwl2cGFkZHEJCSRURU1QMCwkQUNDNCwkQUNDNAorCXZwbXVsdWRxCSRZaSwkVEVNUDEsJFRFTVAxCisJdm1vdmRxdQkJLTgrMzIqNy0xMjgoJG5wKSwkVEVNUDAKKwl2cGFkZHEJCSRURU1QMSwkQUNDNSwkQUNDNQorCXZwbXVsdWRxCSRZaSwkVEVNUDIsJFRFTVAyCisJdm1vdmRxdQkJLTgrMzIqOC0xMjgoJG5wKSwkVEVNUDEKKwl2cGFkZHEJCSRURU1QMiwkQUNDNiwkQUNDNgorCXZwbXVsdWRxCSRZaSwkVEVNUDAsJFRFTVAwCisJdm1vdmRxdQkJLTgrMzIqOS0xMjgoJG5wKSwkVEVNUDIKKwl2cGFkZHEJCSRURU1QMCwkQUNDNywkQUNDNworCXZwbXVsdWRxCSRZaSwkVEVNUDEsJFRFTVAxCisJdnBhZGRxCQkkVEVNUDEsJEFDQzgsJEFDQzgKKwl2cG11bHVkcQkkWWksJFRFTVAyLCRURU1QMgorCXZwYWRkcQkJJFRFTVAyLCRBQ0M5LCRBQ0M5CisKKwkgdm1vdmRxdQktMTYrMzIqMS0xMjgoJGFwKSwkVEVNUDAKKwltb3YJJXJieCwlcmF4CisJaW11bHEJLTEyOCgkYXApLCVyYXgKKwlhZGQJJHIyLCVyYXgKKworCSB2bW92ZHF1CS0xNiszMioyLTEyOCgkYXApLCRURU1QMQorCW1vdgklcmF4LCRyMgorCWltdWxsCSRuMCwgJWVheAorCWFuZAlcJDB4MWZmZmZmZmYsICVlYXgKKworCSBpbXVscQk4LTEyOCgkYXApLCVyYngKKwkgYWRkCSVyYngsJHIzCisJdnBtdWx1ZHEJJEJpLCRURU1QMCwkVEVNUDAKKwkgdm1vdmQJCSVlYXgsICRZaQorCXZtb3ZkcXUJCS0xNiszMiozLTEyOCgkYXApLCRURU1QMgorCXZwYWRkcQkJJFRFTVAwLCRBQ0MxLCRBQ0MxCisJdnBtdWx1ZHEJJEJpLCRURU1QMSwkVEVNUDEKKwkgdnBicm9hZGNhc3RxCSRZaSwgJFlpCisJdm1vdmRxdQkJLTE2KzMyKjQtMTI4KCRhcCksJFRFTVAwCisJdnBhZGRxCQkkVEVNUDEsJEFDQzIsJEFDQzIKKwl2cG11bHVkcQkkQmksJFRFTVAyLCRURU1QMgorCXZtb3ZkcXUJCS0xNiszMio1LTEyOCgkYXApLCRURU1QMQorCXZwYWRkcQkJJFRFTVAyLCRBQ0MzLCRBQ0MzCisJdnBtdWx1ZHEJJEJpLCRURU1QMCwkVEVNUDAKKwl2bW92ZHF1CQktMTYrMzIqNi0xMjgoJGFwKSwkVEVNUDIKKwl2cGFkZHEJCSRURU1QMCwkQUNDNCwkQUNDNAorCXZwbXVsdWRxCSRCaSwkVEVNUDEsJFRFTVAxCisJdm1vdmRxdQkJLTE2KzMyKjctMTI4KCRhcCksJFRFTVAwCisJdnBhZGRxCQkkVEVNUDEsJEFDQzUsJEFDQzUKKwl2cG11bHVkcQkkQmksJFRFTVAyLCRURU1QMgorCXZtb3ZkcXUJCS0xNiszMio4LTEyOCgkYXApLCRURU1QMQorCXZwYWRkcQkJJFRFTVAyLCRBQ0M2LCRBQ0M2CisJdnBtdWx1ZHEJJEJpLCRURU1QMCwkVEVNUDAKKwl2bW92ZHF1CQktMTYrMzIqOS0xMjgoJGFwKSwkVEVNUDIKKwl2cGFkZHEJCSRURU1QMCwkQUNDNywkQUNDNworCXZwbXVsdWRxCSRCaSwkVEVNUDEsJFRFTVAxCisJdnBhZGRxCQkkVEVNUDEsJEFDQzgsJEFDQzgKKwl2cG11bHVkcQkkQmksJFRFTVAyLCRURU1QMgorCSB2cGJyb2FkY2FzdHEJMjQoJGJwKSwgJEJpCisJdnBhZGRxCQkkVEVNUDIsJEFDQzksJEFDQzkKKworCSB2bW92ZHF1CS0xNiszMioxLTEyOCgkbnApLCRURU1QMAorCW1vdgklcmF4LCVyZHgKKwlpbXVscQktMTI4KCRucCksJXJheAorCWFkZAklcmF4LCRyMgorCSB2bW92ZHF1CS0xNiszMioyLTEyOCgkbnApLCRURU1QMQorCWltdWxxCTgtMTI4KCRucCksJXJkeAorCWFkZAklcmR4LCRyMworCXNocglcJDI5LCAkcjIKKworCXZwbXVsdWRxCSRZaSwkVEVNUDAsJFRFTVAwCisJIHZtb3ZxCQkkQmksICVyYngKKwl2bW92ZHF1CQktMTYrMzIqMy0xMjgoJG5wKSwkVEVNUDIKKwl2cGFkZHEJCSRURU1QMCwkQUNDMSwkQUNDMQorCXZwbXVsdWRxCSRZaSwkVEVNUDEsJFRFTVAxCisJdm1vdmRxdQkJLTE2KzMyKjQtMTI4KCRucCksJFRFTVAwCisJdnBhZGRxCQkkVEVNUDEsJEFDQzIsJEFDQzIKKwl2cG11bHVkcQkkWWksJFRFTVAyLCRURU1QMgorCXZtb3ZkcXUJCS0xNiszMio1LTEyOCgkbnApLCRURU1QMQorCXZwYWRkcQkJJFRFTVAyLCRBQ0MzLCRBQ0MzCisJdnBtdWx1ZHEJJFlpLCRURU1QMCwkVEVNUDAKKwl2bW92ZHF1CQktMTYrMzIqNi0xMjgoJG5wKSwkVEVNUDIKKwl2cGFkZHEJCSRURU1QMCwkQUNDNCwkQUNDNAorCXZwbXVsdWRxCSRZaSwkVEVNUDEsJFRFTVAxCisJdm1vdmRxdQkJLTE2KzMyKjctMTI4KCRucCksJFRFTVAwCisJdnBhZGRxCQkkVEVNUDEsJEFDQzUsJEFDQzUKKwl2cG11bHVkcQkkWWksJFRFTVAyLCRURU1QMgorCXZtb3ZkcXUJCS0xNiszMio4LTEyOCgkbnApLCRURU1QMQorCXZwYWRkcQkJJFRFTVAyLCRBQ0M2LCRBQ0M2CisJdnBtdWx1ZHEJJFlpLCRURU1QMCwkVEVNUDAKKwl2bW92ZHF1CQktMTYrMzIqOS0xMjgoJG5wKSwkVEVNUDIKKwl2cGFkZHEJCSRURU1QMCwkQUNDNywkQUNDNworCXZwbXVsdWRxCSRZaSwkVEVNUDEsJFRFTVAxCisJIHZtb3ZkcXUJLTI0KzMyKjEtMTI4KCRhcCksJFRFTVAwCisJdnBhZGRxCQkkVEVNUDEsJEFDQzgsJEFDQzgKKwl2cG11bHVkcQkkWWksJFRFTVAyLCRURU1QMgorCSB2bW92ZHF1CS0yNCszMioyLTEyOCgkYXApLCRURU1QMQorCXZwYWRkcQkJJFRFTVAyLCRBQ0M5LCRBQ0M5CisKKwlhZGQJJHIyLCAkcjMKKwlpbXVscQktMTI4KCRhcCksJXJieAorCWFkZAklcmJ4LCRyMworCisJbW92CSRyMywgJXJheAorCWltdWxsCSRuMCwgJWVheAorCWFuZAlcJDB4MWZmZmZmZmYsICVlYXgKKworCXZwbXVsdWRxCSRCaSwkVEVNUDAsJFRFTVAwCisJIHZtb3ZkCQklZWF4LCAkWWkKKwl2bW92ZHF1CQktMjQrMzIqMy0xMjgoJGFwKSwkVEVNUDIKKwl2cGFkZHEJCSRURU1QMCwkQUNDMSwkQUNDMQorCXZwbXVsdWRxCSRCaSwkVEVNUDEsJFRFTVAxCisJIHZwYnJvYWRjYXN0cQkkWWksICRZaQorCXZtb3ZkcXUJCS0yNCszMio0LTEyOCgkYXApLCRURU1QMAorCXZwYWRkcQkJJFRFTVAxLCRBQ0MyLCRBQ0MyCisJdnBtdWx1ZHEJJEJpLCRURU1QMiwkVEVNUDIKKwl2bW92ZHF1CQktMjQrMzIqNS0xMjgoJGFwKSwkVEVNUDEKKwl2cGFkZHEJCSRURU1QMiwkQUNDMywkQUNDMworCXZwbXVsdWRxCSRCaSwkVEVNUDAsJFRFTVAwCisJdm1vdmRxdQkJLTI0KzMyKjYtMTI4KCRhcCksJFRFTVAyCisJdnBhZGRxCQkkVEVNUDAsJEFDQzQsJEFDQzQKKwl2cG11bHVkcQkkQmksJFRFTVAxLCRURU1QMQorCXZtb3ZkcXUJCS0yNCszMio3LTEyOCgkYXApLCRURU1QMAorCXZwYWRkcQkJJFRFTVAxLCRBQ0M1LCRBQ0M1CisJdnBtdWx1ZHEJJEJpLCRURU1QMiwkVEVNUDIKKwl2bW92ZHF1CQktMjQrMzIqOC0xMjgoJGFwKSwkVEVNUDEKKwl2cGFkZHEJCSRURU1QMiwkQUNDNiwkQUNDNgorCXZwbXVsdWRxCSRCaSwkVEVNUDAsJFRFTVAwCisJdm1vdmRxdQkJLTI0KzMyKjktMTI4KCRhcCksJFRFTVAyCisJdnBhZGRxCQkkVEVNUDAsJEFDQzcsJEFDQzcKKwl2cG11bHVkcQkkQmksJFRFTVAxLCRURU1QMQorCXZwYWRkcQkJJFRFTVAxLCRBQ0M4LCRBQ0M4CisJdnBtdWx1ZHEJJEJpLCRURU1QMiwkVEVNUDIKKwkgdnBicm9hZGNhc3RxCTMyKCRicCksICRCaQorCXZwYWRkcQkJJFRFTVAyLCRBQ0M5LCRBQ0M5CisJIGFkZAkJXCQzMiwgJGJwCQkJIyAkYnArKworCisJdm1vdmRxdQkJLTI0KzMyKjEtMTI4KCRucCksJFRFTVAwCisJaW11bHEJLTEyOCgkbnApLCVyYXgKKwlhZGQJJXJheCwkcjMKKwlzaHIJXCQyOSwgJHIzCisKKwl2bW92ZHF1CQktMjQrMzIqMi0xMjgoJG5wKSwkVEVNUDEKKwl2cG11bHVkcQkkWWksJFRFTVAwLCRURU1QMAorCSB2bW92cQkJJEJpLCAlcmJ4CisJdm1vdmRxdQkJLTI0KzMyKjMtMTI4KCRucCksJFRFTVAyCisJdnBhZGRxCQkkVEVNUDAsJEFDQzEsJEFDQzAJCSMgJEFDQzA9PSRURU1QMAorCXZwbXVsdWRxCSRZaSwkVEVNUDEsJFRFTVAxCisJIHZtb3ZkcXUJJEFDQzAsICglcnNwKQkJCSMgdHJhbnNmZXIgJHIwLSRyMworCXZwYWRkcQkJJFRFTVAxLCRBQ0MyLCRBQ0MxCisJdm1vdmRxdQkJLTI0KzMyKjQtMTI4KCRucCksJFRFTVAwCisJdnBtdWx1ZHEJJFlpLCRURU1QMiwkVEVNUDIKKwl2bW92ZHF1CQktMjQrMzIqNS0xMjgoJG5wKSwkVEVNUDEKKwl2cGFkZHEJCSRURU1QMiwkQUNDMywkQUNDMgorCXZwbXVsdWRxCSRZaSwkVEVNUDAsJFRFTVAwCisJdm1vdmRxdQkJLTI0KzMyKjYtMTI4KCRucCksJFRFTVAyCisJdnBhZGRxCQkkVEVNUDAsJEFDQzQsJEFDQzMKKwl2cG11bHVkcQkkWWksJFRFTVAxLCRURU1QMQorCXZtb3ZkcXUJCS0yNCszMio3LTEyOCgkbnApLCRURU1QMAorCXZwYWRkcQkJJFRFTVAxLCRBQ0M1LCRBQ0M0CisJdnBtdWx1ZHEJJFlpLCRURU1QMiwkVEVNUDIKKwl2bW92ZHF1CQktMjQrMzIqOC0xMjgoJG5wKSwkVEVNUDEKKwl2cGFkZHEJCSRURU1QMiwkQUNDNiwkQUNDNQorCXZwbXVsdWRxCSRZaSwkVEVNUDAsJFRFTVAwCisJdm1vdmRxdQkJLTI0KzMyKjktMTI4KCRucCksJFRFTVAyCisJIG1vdgkkcjMsICRyMAorCXZwYWRkcQkJJFRFTVAwLCRBQ0M3LCRBQ0M2CisJdnBtdWx1ZHEJJFlpLCRURU1QMSwkVEVNUDEKKwkgYWRkCSglcnNwKSwgJHIwCisJdnBhZGRxCQkkVEVNUDEsJEFDQzgsJEFDQzcKKwl2cG11bHVkcQkkWWksJFRFTVAyLCRURU1QMgorCSB2bW92cQkkcjMsICRURU1QMQorCXZwYWRkcQkJJFRFTVAyLCRBQ0M5LCRBQ0M4CisKKwlkZWMJJGkKKwlqbnoJLkxvb3BfbXVsXzEwMjQKK19fXworCisjICgqKQlPcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiB3YXMgY29ycmVjdGluZyBBQ0MxLUFDQzMgZm9yIG92ZXJmbG93CisjCWFmdGVyIDcgbG9vcCBydW5zLCBvciBhZnRlciAyOCBpdGVyYXRpb25zLCBvciA1NiBhZGRpdGlvbnMuCisjCUJ1dCBhcyB3ZSB1bmRlcnV0aWxpemUgcmVzb3VyY2VzLCBpdCdzIHBvc3NpYmxlIHRvIGNvcnJlY3QgaW4KKyMJZWFjaCBpdGVyYXRpb24gd2l0aCBtYXJnaW5hbCBwZXJmb3JtYW5jZSBsb3NzLiBCdXQgdGhlbiwgYXMKKyMJd2UgZG8gaXQgaW4gZWFjaCBpdGVyYXRpb24sIHdlIGNhbiBjb3JyZWN0IGxlc3MgZGlnaXRzLCBhbmQKKyMJYXZvaWQgcGVyZm9ybWFuY2UgcGVuYWx0aWVzIGNvbXBsZXRlbHkuIEFsc28gbm90ZSB0aGF0IHdlCisjCWNvcnJlY3Qgb25seSB0aHJlZSBkaWdpdHMgb3V0IG9mIGZvdXIuIFRoaXMgd29ya3MgYmVjYXVzZQorIwltb3N0IHNpZ25pZmljYW50IGRpZ2l0IGlzIHN1YmplY3RlZCB0byBsZXNzIGFkZGl0aW9ucy4KKworJFRFTVAwID0gJEFDQzk7CiskVEVNUDMgPSAkQmk7CiskVEVNUDQgPSAkWWk7CiskY29kZS49PDxfX187CisJdnBlcm1xCQlcJDAsICRBTkRfTUFTSywgJEFORF9NQVNLCisJdnBhZGRxCQkoJXJzcCksICRURU1QMSwgJEFDQzAKKworCXZwc3JscQkJXCQyOSwgJEFDQzAsICRURU1QMQorCXZwYW5kCQkkQU5EX01BU0ssICRBQ0MwLCAkQUNDMAorCXZwc3JscQkJXCQyOSwgJEFDQzEsICRURU1QMgorCXZwYW5kCQkkQU5EX01BU0ssICRBQ0MxLCAkQUNDMQorCXZwc3JscQkJXCQyOSwgJEFDQzIsICRURU1QMworCXZwZXJtcQkJXCQweDkzLCAkVEVNUDEsICRURU1QMQorCXZwYW5kCQkkQU5EX01BU0ssICRBQ0MyLCAkQUNDMgorCXZwc3JscQkJXCQyOSwgJEFDQzMsICRURU1QNAorCXZwZXJtcQkJXCQweDkzLCAkVEVNUDIsICRURU1QMgorCXZwYW5kCQkkQU5EX01BU0ssICRBQ0MzLCAkQUNDMworCisJdnBibGVuZGQJXCQzLCAkWkVSTywgJFRFTVAxLCAkVEVNUDAKKwl2cGVybXEJCVwkMHg5MywgJFRFTVAzLCAkVEVNUDMKKwl2cGJsZW5kZAlcJDMsICRURU1QMSwgJFRFTVAyLCAkVEVNUDEKKwl2cGVybXEJCVwkMHg5MywgJFRFTVA0LCAkVEVNUDQKKwl2cGFkZHEJCSRURU1QMCwgJEFDQzAsICRBQ0MwCisJdnBibGVuZGQJXCQzLCAkVEVNUDIsICRURU1QMywgJFRFTVAyCisJdnBhZGRxCQkkVEVNUDEsICRBQ0MxLCAkQUNDMQorCXZwYmxlbmRkCVwkMywgJFRFTVAzLCAkVEVNUDQsICRURU1QMworCXZwYWRkcQkJJFRFTVAyLCAkQUNDMiwgJEFDQzIKKwl2cGJsZW5kZAlcJDMsICRURU1QNCwgJFpFUk8sICRURU1QNAorCXZwYWRkcQkJJFRFTVAzLCAkQUNDMywgJEFDQzMKKwl2cGFkZHEJCSRURU1QNCwgJEFDQzQsICRBQ0M0CisKKwl2cHNybHEJCVwkMjksICRBQ0MwLCAkVEVNUDEKKwl2cGFuZAkJJEFORF9NQVNLLCAkQUNDMCwgJEFDQzAKKwl2cHNybHEJCVwkMjksICRBQ0MxLCAkVEVNUDIKKwl2cGFuZAkJJEFORF9NQVNLLCAkQUNDMSwgJEFDQzEKKwl2cHNybHEJCVwkMjksICRBQ0MyLCAkVEVNUDMKKwl2cGVybXEJCVwkMHg5MywgJFRFTVAxLCAkVEVNUDEKKwl2cGFuZAkJJEFORF9NQVNLLCAkQUNDMiwgJEFDQzIKKwl2cHNybHEJCVwkMjksICRBQ0MzLCAkVEVNUDQKKwl2cGVybXEJCVwkMHg5MywgJFRFTVAyLCAkVEVNUDIKKwl2cGFuZAkJJEFORF9NQVNLLCAkQUNDMywgJEFDQzMKKwl2cGVybXEJCVwkMHg5MywgJFRFTVAzLCAkVEVNUDMKKworCXZwYmxlbmRkCVwkMywgJFpFUk8sICRURU1QMSwgJFRFTVAwCisJdnBlcm1xCQlcJDB4OTMsICRURU1QNCwgJFRFTVA0CisJdnBibGVuZGQJXCQzLCAkVEVNUDEsICRURU1QMiwgJFRFTVAxCisJdnBhZGRxCQkkVEVNUDAsICRBQ0MwLCAkQUNDMAorCXZwYmxlbmRkCVwkMywgJFRFTVAyLCAkVEVNUDMsICRURU1QMgorCXZwYWRkcQkJJFRFTVAxLCAkQUNDMSwgJEFDQzEKKwl2cGJsZW5kZAlcJDMsICRURU1QMywgJFRFTVA0LCAkVEVNUDMKKwl2cGFkZHEJCSRURU1QMiwgJEFDQzIsICRBQ0MyCisJdnBibGVuZGQJXCQzLCAkVEVNUDQsICRaRVJPLCAkVEVNUDQKKwl2cGFkZHEJCSRURU1QMywgJEFDQzMsICRBQ0MzCisJdnBhZGRxCQkkVEVNUDQsICRBQ0M0LCAkQUNDNAorCisJdm1vdmRxdQkJJEFDQzAsIDAtMTI4KCRycCkKKwl2bW92ZHF1CQkkQUNDMSwgMzItMTI4KCRycCkKKwl2bW92ZHF1CQkkQUNDMiwgNjQtMTI4KCRycCkKKwl2bW92ZHF1CQkkQUNDMywgOTYtMTI4KCRycCkKK19fXworCiskVEVNUDU9JEFDQzA7CiskY29kZS49PDxfX187CisJdnBzcmxxCQlcJDI5LCAkQUNDNCwgJFRFTVAxCisJdnBhbmQJCSRBTkRfTUFTSywgJEFDQzQsICRBQ0M0CisJdnBzcmxxCQlcJDI5LCAkQUNDNSwgJFRFTVAyCisJdnBhbmQJCSRBTkRfTUFTSywgJEFDQzUsICRBQ0M1CisJdnBzcmxxCQlcJDI5LCAkQUNDNiwgJFRFTVAzCisJdnBlcm1xCQlcJDB4OTMsICRURU1QMSwgJFRFTVAxCisJdnBhbmQJCSRBTkRfTUFTSywgJEFDQzYsICRBQ0M2CisJdnBzcmxxCQlcJDI5LCAkQUNDNywgJFRFTVA0CisJdnBlcm1xCQlcJDB4OTMsICRURU1QMiwgJFRFTVAyCisJdnBhbmQJCSRBTkRfTUFTSywgJEFDQzcsICRBQ0M3CisJdnBzcmxxCQlcJDI5LCAkQUNDOCwgJFRFTVA1CisJdnBlcm1xCQlcJDB4OTMsICRURU1QMywgJFRFTVAzCisJdnBhbmQJCSRBTkRfTUFTSywgJEFDQzgsICRBQ0M4CisJdnBlcm1xCQlcJDB4OTMsICRURU1QNCwgJFRFTVA0CisKKwl2cGJsZW5kZAlcJDMsICRaRVJPLCAkVEVNUDEsICRURU1QMAorCXZwZXJtcQkJXCQweDkzLCAkVEVNUDUsICRURU1QNQorCXZwYmxlbmRkCVwkMywgJFRFTVAxLCAkVEVNUDIsICRURU1QMQorCXZwYWRkcQkJJFRFTVAwLCAkQUNDNCwgJEFDQzQKKwl2cGJsZW5kZAlcJDMsICRURU1QMiwgJFRFTVAzLCAkVEVNUDIKKwl2cGFkZHEJCSRURU1QMSwgJEFDQzUsICRBQ0M1CisJdnBibGVuZGQJXCQzLCAkVEVNUDMsICRURU1QNCwgJFRFTVAzCisJdnBhZGRxCQkkVEVNUDIsICRBQ0M2LCAkQUNDNgorCXZwYmxlbmRkCVwkMywgJFRFTVA0LCAkVEVNUDUsICRURU1QNAorCXZwYWRkcQkJJFRFTVAzLCAkQUNDNywgJEFDQzcKKwl2cGFkZHEJCSRURU1QNCwgJEFDQzgsICRBQ0M4CisKKwl2cHNybHEJCVwkMjksICRBQ0M0LCAkVEVNUDEKKwl2cGFuZAkJJEFORF9NQVNLLCAkQUNDNCwgJEFDQzQKKwl2cHNybHEJCVwkMjksICRBQ0M1LCAkVEVNUDIKKwl2cGFuZAkJJEFORF9NQVNLLCAkQUNDNSwgJEFDQzUKKwl2cHNybHEJCVwkMjksICRBQ0M2LCAkVEVNUDMKKwl2cGVybXEJCVwkMHg5MywgJFRFTVAxLCAkVEVNUDEKKwl2cGFuZAkJJEFORF9NQVNLLCAkQUNDNiwgJEFDQzYKKwl2cHNybHEJCVwkMjksICRBQ0M3LCAkVEVNUDQKKwl2cGVybXEJCVwkMHg5MywgJFRFTVAyLCAkVEVNUDIKKwl2cGFuZAkJJEFORF9NQVNLLCAkQUNDNywgJEFDQzcKKwl2cHNybHEJCVwkMjksICRBQ0M4LCAkVEVNUDUKKwl2cGVybXEJCVwkMHg5MywgJFRFTVAzLCAkVEVNUDMKKwl2cGFuZAkJJEFORF9NQVNLLCAkQUNDOCwgJEFDQzgKKwl2cGVybXEJCVwkMHg5MywgJFRFTVA0LCAkVEVNUDQKKworCXZwYmxlbmRkCVwkMywgJFpFUk8sICRURU1QMSwgJFRFTVAwCisJdnBlcm1xCQlcJDB4OTMsICRURU1QNSwgJFRFTVA1CisJdnBibGVuZGQJXCQzLCAkVEVNUDEsICRURU1QMiwgJFRFTVAxCisJdnBhZGRxCQkkVEVNUDAsICRBQ0M0LCAkQUNDNAorCXZwYmxlbmRkCVwkMywgJFRFTVAyLCAkVEVNUDMsICRURU1QMgorCXZwYWRkcQkJJFRFTVAxLCAkQUNDNSwgJEFDQzUKKwl2cGJsZW5kZAlcJDMsICRURU1QMywgJFRFTVA0LCAkVEVNUDMKKwl2cGFkZHEJCSRURU1QMiwgJEFDQzYsICRBQ0M2CisJdnBibGVuZGQJXCQzLCAkVEVNUDQsICRURU1QNSwgJFRFTVA0CisJdnBhZGRxCQkkVEVNUDMsICRBQ0M3LCAkQUNDNworCXZwYWRkcQkJJFRFTVA0LCAkQUNDOCwgJEFDQzgKKworCXZtb3ZkcXUJCSRBQ0M0LCAxMjgtMTI4KCRycCkKKwl2bW92ZHF1CQkkQUNDNSwgMTYwLTEyOCgkcnApICAgIAorCXZtb3ZkcXUJCSRBQ0M2LCAxOTItMTI4KCRycCkKKwl2bW92ZHF1CQkkQUNDNywgMjI0LTEyOCgkcnApCisJdm1vdmRxdQkJJEFDQzgsIDI1Ni0xMjgoJHJwKQorCXZ6ZXJvdXBwZXIKKworCW1vdgklcmJwLCAlcmF4CitfX18KKyRjb2RlLj08PF9fXyBpZiAoJHdpbjY0KTsKKwltb3ZhcHMJLTB4ZDgoJXJheCksJXhtbTYKKwltb3ZhcHMJLTB4YzgoJXJheCksJXhtbTcKKwltb3ZhcHMJLTB4YjgoJXJheCksJXhtbTgKKwltb3ZhcHMJLTB4YTgoJXJheCksJXhtbTkKKwltb3ZhcHMJLTB4OTgoJXJheCksJXhtbTEwCisJbW92YXBzCS0weDg4KCVyYXgpLCV4bW0xMQorCW1vdmFwcwktMHg3OCglcmF4KSwleG1tMTIKKwltb3ZhcHMJLTB4NjgoJXJheCksJXhtbTEzCisJbW92YXBzCS0weDU4KCVyYXgpLCV4bW0xNAorCW1vdmFwcwktMHg0OCglcmF4KSwleG1tMTUKK19fXworJGNvZGUuPTw8X19fOworCW1vdgktNDgoJXJheCksJXIxNQorCW1vdgktNDAoJXJheCksJXIxNAorCW1vdgktMzIoJXJheCksJXIxMworCW1vdgktMjQoJXJheCksJXIxMgorCW1vdgktMTYoJXJheCksJXJicAorCW1vdgktOCglcmF4KSwlcmJ4CisJbGVhCSglcmF4KSwlcnNwCQkjIHJlc3RvcmUgJXJzcAorLkxtdWxfMTAyNF9lcGlsb2d1ZToKKwlyZXQKKy5zaXplCXJzYXpfMTAyNF9tdWxfYXZ4MiwuLXJzYXpfMTAyNF9tdWxfYXZ4MgorX19fCit9Cit7CitteSAoJG91dCwkaW5wKSA9ICR3aW42NCA/ICgiJXJjeCIsIiVyZHgiKSA6ICgiJXJkaSIsIiVyc2kiKTsKK215IEBUID0gbWFwKCIlciRfIiwoOC4uMTEpKTsKKworJGNvZGUuPTw8X19fOworLmdsb2JsCXJzYXpfMTAyNF9yZWQybm9ybV9hdngyCisudHlwZQlyc2F6XzEwMjRfcmVkMm5vcm1fYXZ4MixcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMzIKK3JzYXpfMTAyNF9yZWQybm9ybV9hdngyOgorCXN1YglcJC0xMjgsJGlucAkjIHNpemUgb3B0aW1pemF0aW9uCisJeG9yCSVyYXgsJXJheAorX19fCisKK2ZvciAoJGo9MCwkaT0wOyAkaTwxNjsgJGkrKykgeworICAgIG15ICRrPTA7CisgICAgd2hpbGUgKDI5KiRqPDY0KigkaSsxKSkgewkjIGxvYWQgZGF0YSB0aWxsIGJvdW5kYXJ5CisJJGNvZGUuPSIJbW92CWA4KiRqLTEyOGAoJGlucCksIEBUWzBdXG4iOworCSRqKys7ICRrKys7IHB1c2goQFQsc2hpZnQoQFQpKTsKKyAgICB9CisgICAgJGw9JGs7CisgICAgd2hpbGUgKCRrPjEpIHsJCSMgc2hpZnQgbG9hZGVkIGRhdGEgYnV0IGxhc3QgdmFsdWUKKwkkY29kZS49IglzaGwJXCRgMjkqKCRqLSRrKWAsQFRbLSRrXVxuIjsKKwkkay0tOworICAgIH0KKyAgICAkY29kZS49PDxfX187CQkjIHNoaWZ0IGxhc3QgdmFsdWUKKwltb3YJQFRbLTFdLCBAVFswXQorCXNobAlcJGAyOSooJGotMSlgLCBAVFstMV0KKwlzaHIJXCRgLTI5Kigkai0xKWAsIEBUWzBdCitfX18KKyAgICB3aGlsZSAoJGwpIHsJCSMgYWNjdW11bGF0ZSBhbGwgdmFsdWVzCisJJGNvZGUuPSIJYWRkCUBUWy0kbF0sICVyYXhcbiI7CisJJGwtLTsKKyAgICB9CisJJGNvZGUuPTw8X19fOworCWFkYwlcJDAsIEBUWzBdCSMgY29uc3VtZSBldmVudHVhbCBjYXJyeQorCW1vdgklcmF4LCA4KiRpKCRvdXQpCisJbW92CUBUWzBdLCAlcmF4CitfX18KKyAgICBwdXNoKEBULHNoaWZ0KEBUKSk7Cit9CiskY29kZS49PDxfX187CisJcmV0Cisuc2l6ZQlyc2F6XzEwMjRfcmVkMm5vcm1fYXZ4MiwuLXJzYXpfMTAyNF9yZWQybm9ybV9hdngyCisKKy5nbG9ibAlyc2F6XzEwMjRfbm9ybTJyZWRfYXZ4MgorLnR5cGUJcnNhel8xMDI0X25vcm0ycmVkX2F2eDIsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTMyCityc2F6XzEwMjRfbm9ybTJyZWRfYXZ4MjoKKwlzdWIJXCQtMTI4LCRvdXQJIyBzaXplIG9wdGltaXphdGlvbgorCW1vdgkoJGlucCksQFRbMF0KKwltb3YJXCQweDFmZmZmZmZmLCVlYXgKK19fXworZm9yICgkaj0wLCRpPTA7ICRpPDE2OyAkaSsrKSB7CisgICAgJGNvZGUuPSIJbW92CWA4KigkaSsxKWAoJGlucCksQFRbMV1cbiIJaWYgKCRpPDE1KTsKKyAgICAkY29kZS49Igl4b3IJQFRbMV0sQFRbMV1cbiIJCQlpZiAoJGk9PTE1KTsKKyAgICBteSAkaz0xOworICAgIHdoaWxlICgyOSooJGorMSk8NjQqKCRpKzEpKSB7CisgICAgCSRjb2RlLj08PF9fXzsKKwltb3YJQFRbMF0sQFRbLSRrXQorCXNocglcJGAyOSokamAsQFRbLSRrXQorCWFuZAklcmF4LEBUWy0ka10JCQkJIyAmMHgxZmZmZmZmZgorCW1vdglAVFstJGtdLGA4KiRqLTEyOGAoJG91dCkKK19fXworCSRqKys7ICRrKys7CisgICAgfQorICAgICRjb2RlLj08PF9fXzsKKwlzaHJkCVwkYDI5KiRqYCxAVFsxXSxAVFswXQorCWFuZAklcmF4LEBUWzBdCisJbW92CUBUWzBdLGA4KiRqLTEyOGAoJG91dCkKK19fXworICAgICRqKys7CisgICAgcHVzaChAVCxzaGlmdChAVCkpOworfQorJGNvZGUuPTw8X19fOworCW1vdglAVFswXSxgOCokai0xMjhgKCRvdXQpCQkJIyB6ZXJvCisJbW92CUBUWzBdLGA4KigkaisxKS0xMjhgKCRvdXQpCisJbW92CUBUWzBdLGA4KigkaisyKS0xMjhgKCRvdXQpCisJbW92CUBUWzBdLGA4KigkaiszKS0xMjhgKCRvdXQpCisJcmV0Cisuc2l6ZQlyc2F6XzEwMjRfbm9ybTJyZWRfYXZ4MiwuLXJzYXpfMTAyNF9ub3JtMnJlZF9hdngyCitfX18KK30KK3sKK215ICgkb3V0LCRpbnAsJHBvd2VyKSA9ICR3aW42NCA/ICgiJXJjeCIsIiVyZHgiLCIlcjhkIikgOiAoIiVyZGkiLCIlcnNpIiwiJWVkeCIpOworCiskY29kZS49PDxfX187CisuZ2xvYmwJcnNhel8xMDI0X3NjYXR0ZXI1X2F2eDIKKy50eXBlCXJzYXpfMTAyNF9zY2F0dGVyNV9hdngyLFxAYWJpLW9tbmlwb3RlbnQKKy5hbGlnbgkzMgorcnNhel8xMDI0X3NjYXR0ZXI1X2F2eDI6CisJdnplcm91cHBlcgorCXZtb3ZkcXUJLkxzY2F0dGVyX3Blcm1kKCVyaXApLCV5bW01CisJc2hsCVwkNCwkcG93ZXIKKwlsZWEJKCRvdXQsJHBvd2VyKSwkb3V0CisJbW92CVwkOSwlZWF4CisJam1wCS5Mb29wX3NjYXR0ZXJfMTAyNAorCisuYWxpZ24JMzIKKy5Mb29wX3NjYXR0ZXJfMTAyNDoKKwl2bW92ZHF1CQkoJGlucCksJXltbTAKKwlsZWEJCTMyKCRpbnApLCRpbnAKKwl2cGVybWQJCSV5bW0wLCV5bW01LCV5bW0wCisJdm1vdmRxdQkJJXhtbTAsKCRvdXQpCisJbGVhCQkxNiozMigkb3V0KSwkb3V0CisJZGVjCSVlYXgKKwlqbnoJLkxvb3Bfc2NhdHRlcl8xMDI0CisKKwl2emVyb3VwcGVyCisJcmV0Cisuc2l6ZQlyc2F6XzEwMjRfc2NhdHRlcjVfYXZ4MiwuLXJzYXpfMTAyNF9zY2F0dGVyNV9hdngyCisKKy5nbG9ibAlyc2F6XzEwMjRfZ2F0aGVyNV9hdngyCisudHlwZQlyc2F6XzEwMjRfZ2F0aGVyNV9hdngyLFxAYWJpLW9tbmlwb3RlbnQKKy5hbGlnbgkzMgorcnNhel8xMDI0X2dhdGhlcjVfYXZ4MjoKK19fXworJGNvZGUuPTw8X19fIGlmICgkd2luNjQpOworCWxlYQktMHg4OCglcnNwKSwlcmF4CisJdnplcm91cHBlcgorLkxTRUhfYmVnaW5fcnNhel8xMDI0X2dhdGhlcjU6CisJIyBJIGNhbid0IHRydXN0IGFzc2VtYmxlciB0byB1c2Ugc3BlY2lmaWMgZW5jb2Rpbmc6LSgKKwkuYnl0ZQkweDQ4LDB4OGQsMHg2MCwweGUwCQkjbGVhCS0weDIwKCVyYXgpLCVyc3AKKwkuYnl0ZQkweGM1LDB4ZjgsMHgyOSwweDcwLDB4ZTAJI3Ztb3ZhcHMgJXhtbTYsLTB4MjAoJXJheCkKKwkuYnl0ZQkweGM1LDB4ZjgsMHgyOSwweDc4LDB4ZjAJI3Ztb3ZhcHMgJXhtbTcsLTB4MTAoJXJheCkKKwkuYnl0ZQkweGM1LDB4NzgsMHgyOSwweDQwLDB4MDAJI3Ztb3ZhcHMgJXhtbTgsMCglcmF4KQorCS5ieXRlCTB4YzUsMHg3OCwweDI5LDB4NDgsMHgxMAkjdm1vdmFwcyAleG1tOSwweDEwKCVyYXgpCisJLmJ5dGUJMHhjNSwweDc4LDB4MjksMHg1MCwweDIwCSN2bW92YXBzICV4bW0xMCwweDIwKCVyYXgpCisJLmJ5dGUJMHhjNSwweDc4LDB4MjksMHg1OCwweDMwCSN2bW92YXBzICV4bW0xMSwweDMwKCVyYXgpCisJLmJ5dGUJMHhjNSwweDc4LDB4MjksMHg2MCwweDQwCSN2bW92YXBzICV4bW0xMiwweDQwKCVyYXgpCisJLmJ5dGUJMHhjNSwweDc4LDB4MjksMHg2OCwweDUwCSN2bW92YXBzICV4bW0xMywweDUwKCVyYXgpCisJLmJ5dGUJMHhjNSwweDc4LDB4MjksMHg3MCwweDYwCSN2bW92YXBzICV4bW0xNCwweDYwKCVyYXgpCisJLmJ5dGUJMHhjNSwweDc4LDB4MjksMHg3OCwweDcwCSN2bW92YXBzICV4bW0xNSwweDcwKCVyYXgpCitfX18KKyRjb2RlLj08PF9fXzsKKwlsZWEJLkxnYXRoZXJfdGFibGUoJXJpcCksJXIxMQorCW1vdgkkcG93ZXIsJWVheAorCWFuZAlcJDMsJHBvd2VyCisJc2hyCVwkMiwlZWF4CQkJIyBjYWNoZSBsaW5lIG51bWJlcgorCXNobAlcJDQsJHBvd2VyCQkJIyBvZmZzZXQgd2l0aGluIGNhY2hlIGxpbmUKKworCXZtb3ZkcXUJCS0zMiglcjExKSwleW1tNwkJIyAuTGdhdGhlcl9wZXJtZAorCXZwYnJvYWRjYXN0Ygk4KCVyMTEsJXJheCksICV4bW04CisJdnBicm9hZGNhc3RiCTcoJXIxMSwlcmF4KSwgJXhtbTkKKwl2cGJyb2FkY2FzdGIJNiglcjExLCVyYXgpLCAleG1tMTAKKwl2cGJyb2FkY2FzdGIJNSglcjExLCVyYXgpLCAleG1tMTEKKwl2cGJyb2FkY2FzdGIJNCglcjExLCVyYXgpLCAleG1tMTIKKwl2cGJyb2FkY2FzdGIJMyglcjExLCVyYXgpLCAleG1tMTMKKwl2cGJyb2FkY2FzdGIJMiglcjExLCVyYXgpLCAleG1tMTQKKwl2cGJyb2FkY2FzdGIJMSglcjExLCVyYXgpLCAleG1tMTUKKworCWxlYQk2NCgkaW5wLCRwb3dlciksJGlucAorCW1vdglcJDY0LCVyMTEJCQkjIHNpemUgb3B0aW1pemF0aW9uCisJbW92CVwkOSwlZWF4CisJam1wCS5Mb29wX2dhdGhlcl8xMDI0CisKKy5hbGlnbgkzMgorLkxvb3BfZ2F0aGVyXzEwMjQ6CisJdnBhbmQJCS02NCgkaW5wKSwJCSV4bW04LCV4bW0wCisJdnBhbmQJCSgkaW5wKSwJCQkleG1tOSwleG1tMQorCXZwYW5kCQk2NCgkaW5wKSwJCSV4bW0xMCwleG1tMgorCXZwYW5kCQkoJGlucCwlcjExLDIpLAkJJXhtbTExLCV4bW0zCisJIHZwb3IJCQkJCSV4bW0wLCV4bW0xLCV4bW0xCisJdnBhbmQJCTY0KCRpbnAsJXIxMSwyKSwJJXhtbTEyLCV4bW00CisJIHZwb3IJCQkJCSV4bW0yLCV4bW0zLCV4bW0zCisJdnBhbmQJCSgkaW5wLCVyMTEsNCksCQkleG1tMTMsJXhtbTUKKwkgdnBvcgkJCQkJJXhtbTEsJXhtbTMsJXhtbTMKKwl2cGFuZAkJNjQoJGlucCwlcjExLDQpLAkleG1tMTQsJXhtbTYKKwkgdnBvcgkJCQkJJXhtbTQsJXhtbTUsJXhtbTUKKwl2cGFuZAkJLTEyOCgkaW5wLCVyMTEsOCksCSV4bW0xNSwleG1tMgorCWxlYQkJKCRpbnAsJXIxMSw4KSwkaW5wCisJIHZwb3IJCQkJCSV4bW0zLCV4bW01LCV4bW01CisJIHZwb3IJCQkJCSV4bW0yLCV4bW02LCV4bW02CisJIHZwb3IJCQkJCSV4bW01LCV4bW02LCV4bW02CisJdnBlcm1kCQkleW1tNiwleW1tNywleW1tNgorCXZtb3ZkcXUJCSV5bW02LCgkb3V0KQorCWxlYQkJMzIoJG91dCksJG91dAorCWRlYwklZWF4CisJam56CS5Mb29wX2dhdGhlcl8xMDI0CisKKwl2cHhvcgkleW1tMCwleW1tMCwleW1tMAorCXZtb3ZkcXUJJXltbTAsKCRvdXQpCisJdnplcm91cHBlcgorX19fCiskY29kZS49PDxfX18gaWYgKCR3aW42NCk7CisJbW92YXBzCSglcnNwKSwleG1tNgorCW1vdmFwcwkweDEwKCVyc3ApLCV4bW03CisJbW92YXBzCTB4MjAoJXJzcCksJXhtbTgKKwltb3ZhcHMJMHgzMCglcnNwKSwleG1tOQorCW1vdmFwcwkweDQwKCVyc3ApLCV4bW0xMAorCW1vdmFwcwkweDUwKCVyc3ApLCV4bW0xMQorCW1vdmFwcwkweDYwKCVyc3ApLCV4bW0xMgorCW1vdmFwcwkweDcwKCVyc3ApLCV4bW0xMworCW1vdmFwcwkweDgwKCVyc3ApLCV4bW0xNAorCW1vdmFwcwkweDkwKCVyc3ApLCV4bW0xNQorCWxlYQkweGE4KCVyc3ApLCVyc3AKKy5MU0VIX2VuZF9yc2F6XzEwMjRfZ2F0aGVyNToKK19fXworJGNvZGUuPTw8X19fOworCXJldAorLnNpemUJcnNhel8xMDI0X2dhdGhlcjVfYXZ4MiwuLXJzYXpfMTAyNF9nYXRoZXI1X2F2eDIKK19fXworfQorCiskY29kZS49PDxfX187CisuZXh0ZXJuCU9QRU5TU0xfaWEzMmNhcF9QCisuZ2xvYmwJcnNhel9hdngyX2VsaWdpYmxlCisudHlwZQlyc2F6X2F2eDJfZWxpZ2libGUsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTMyCityc2F6X2F2eDJfZWxpZ2libGU6CisJbW92CU9QRU5TU0xfaWEzMmNhcF9QKzgoJXJpcCksJWVheAorCWFuZAlcJGAxPDw1YCwlZWF4CisJc2hyCVwkNSwlZWF4CisJcmV0Cisuc2l6ZQlyc2F6X2F2eDJfZWxpZ2libGUsLi1yc2F6X2F2eDJfZWxpZ2libGUKKworLmFsaWduCTY0CisuTGFuZF9tYXNrOgorCS5xdWFkCTB4MWZmZmZmZmYsMHgxZmZmZmZmZiwweDFmZmZmZmZmLC0xCisuTHNjYXR0ZXJfcGVybWQ6CisJLmxvbmcJMCwyLDQsNiw3LDcsNyw3CisuTGdhdGhlcl9wZXJtZDoKKwkubG9uZwkwLDcsMSw3LDIsNywzLDcKKy5MZ2F0aGVyX3RhYmxlOgorCS5ieXRlCTAsMCwwLDAsMCwwLDAsMCwgMHhmZiwwLDAsMCwwLDAsMCwwCisuYWxpZ24JNjQKK19fXworCitpZiAoJHdpbjY0KSB7CiskcmVjPSIlcmN4IjsKKyRmcmFtZT0iJXJkeCI7CiskY29udGV4dD0iJXI4IjsKKyRkaXNwPSIlcjkiOworCiskY29kZS49PDxfX18KKy5leHRlcm4JX19pbXBfUnRsVmlydHVhbFVud2luZAorLnR5cGUJcnNhel9zZV9oYW5kbGVyLFxAYWJpLW9tbmlwb3RlbnQKKy5hbGlnbgkxNgorcnNhel9zZV9oYW5kbGVyOgorCXB1c2gJJXJzaQorCXB1c2gJJXJkaQorCXB1c2gJJXJieAorCXB1c2gJJXJicAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCXB1c2gJJXIxNQorCXB1c2hmcQorCXN1YglcJDY0LCVyc3AKKworCW1vdgkxMjAoJGNvbnRleHQpLCVyYXgJIyBwdWxsIGNvbnRleHQtPlJheAorCW1vdgkyNDgoJGNvbnRleHQpLCVyYngJIyBwdWxsIGNvbnRleHQtPlJpcAorCisJbW92CTgoJGRpc3ApLCVyc2kJCSMgZGlzcC0+SW1hZ2VCYXNlCisJbW92CTU2KCRkaXNwKSwlcjExCQkjIGRpc3AtPkhhbmRsZXJEYXRhCisKKwltb3YJMCglcjExKSwlcjEwZAkJIyBIYW5kbGVyRGF0YVswXQorCWxlYQkoJXJzaSwlcjEwKSwlcjEwCSMgcHJvbG9ndWUgbGFiZWwKKwljbXAJJXIxMCwlcmJ4CQkjIGNvbnRleHQtPlJpcDxwcm9sb2d1ZSBsYWJlbAorCWpiCS5MY29tbW9uX3NlaF90YWlsCisKKwltb3YJMTUyKCRjb250ZXh0KSwlcmF4CSMgcHVsbCBjb250ZXh0LT5Sc3AKKworCW1vdgk0KCVyMTEpLCVyMTBkCQkjIEhhbmRsZXJEYXRhWzFdCisJbGVhCSglcnNpLCVyMTApLCVyMTAJIyBlcGlsb2d1ZSBsYWJlbAorCWNtcAklcjEwLCVyYngJCSMgY29udGV4dC0+UmlwPj1lcGlsb2d1ZSBsYWJlbAorCWphZQkuTGNvbW1vbl9zZWhfdGFpbAorCisJbW92CTE2MCgkY29udGV4dCksJXJheAkjIHB1bGwgY29udGV4dC0+UmJwCisKKwltb3YJLTQ4KCVyYXgpLCVyMTUKKwltb3YJLTQwKCVyYXgpLCVyMTQKKwltb3YJLTMyKCVyYXgpLCVyMTMKKwltb3YJLTI0KCVyYXgpLCVyMTIKKwltb3YJLTE2KCVyYXgpLCVyYnAKKwltb3YJLTgoJXJheCksJXJieAorCW1vdgklcjE1LDI0MCgkY29udGV4dCkKKwltb3YJJXIxNCwyMzIoJGNvbnRleHQpCisJbW92CSVyMTMsMjI0KCRjb250ZXh0KQorCW1vdgklcjEyLDIxNigkY29udGV4dCkKKwltb3YJJXJicCwxNjAoJGNvbnRleHQpCisJbW92CSVyYngsMTQ0KCRjb250ZXh0KQorCisJbGVhCS0weGQ4KCVyYXgpLCVyc2kJIyAleG1tIHNhdmUgYXJlYQorCWxlYQk1MTIoJGNvbnRleHQpLCVyZGkJIyAmIGNvbnRleHQuWG1tNgorCW1vdglcJDIwLCVlY3gJCSMgMTAqc2l6ZW9mKCV4bW0wKS9zaXplb2YoJXJheCkKKwkubG9uZwkweGE1NDhmM2ZjCQkjIGNsZDsgcmVwIG1vdnNxCisKKy5MY29tbW9uX3NlaF90YWlsOgorCW1vdgk4KCVyYXgpLCVyZGkKKwltb3YJMTYoJXJheCksJXJzaQorCW1vdgklcmF4LDE1MigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJzcAorCW1vdgklcnNpLDE2OCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJzaQorCW1vdgklcmRpLDE3NigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJkaQorCisJbW92CTQwKCRkaXNwKSwlcmRpCQkjIGRpc3AtPkNvbnRleHRSZWNvcmQKKwltb3YJJGNvbnRleHQsJXJzaQkJIyBjb250ZXh0CisJbW92CVwkMTU0LCVlY3gJCSMgc2l6ZW9mKENPTlRFWFQpCisJLmxvbmcJMHhhNTQ4ZjNmYwkJIyBjbGQ7IHJlcCBtb3ZzcQorCisJbW92CSRkaXNwLCVyc2kKKwl4b3IJJXJjeCwlcmN4CQkjIGFyZzEsIFVOV19GTEFHX05IQU5ETEVSCisJbW92CTgoJXJzaSksJXJkeAkJIyBhcmcyLCBkaXNwLT5JbWFnZUJhc2UKKwltb3YJMCglcnNpKSwlcjgJCSMgYXJnMywgZGlzcC0+Q29udHJvbFBjCisJbW92CTE2KCVyc2kpLCVyOQkJIyBhcmc0LCBkaXNwLT5GdW5jdGlvbkVudHJ5CisJbW92CTQwKCVyc2kpLCVyMTAJCSMgZGlzcC0+Q29udGV4dFJlY29yZAorCWxlYQk1NiglcnNpKSwlcjExCQkjICZkaXNwLT5IYW5kbGVyRGF0YQorCWxlYQkyNCglcnNpKSwlcjEyCQkjICZkaXNwLT5Fc3RhYmxpc2hlckZyYW1lCisJbW92CSVyMTAsMzIoJXJzcCkJCSMgYXJnNQorCW1vdgklcjExLDQwKCVyc3ApCQkjIGFyZzYKKwltb3YJJXIxMiw0OCglcnNwKQkJIyBhcmc3CisJbW92CSVyY3gsNTYoJXJzcCkJCSMgYXJnOCwgKE5VTEwpCisJY2FsbAkqX19pbXBfUnRsVmlydHVhbFVud2luZCglcmlwKQorCisJbW92CVwkMSwlZWF4CQkjIEV4Y2VwdGlvbkNvbnRpbnVlU2VhcmNoCisJYWRkCVwkNjQsJXJzcAorCXBvcGZxCisJcG9wCSVyMTUKKwlwb3AJJXIxNAorCXBvcAklcjEzCisJcG9wCSVyMTIKKwlwb3AJJXJicAorCXBvcAklcmJ4CisJcG9wCSVyZGkKKwlwb3AJJXJzaQorCXJldAorLnNpemUJcnNhel9zZV9oYW5kbGVyLC4tcnNhel9zZV9oYW5kbGVyCisKKy5zZWN0aW9uCS5wZGF0YQorLmFsaWduCTQKKwkucnZhCS5MU0VIX2JlZ2luX3JzYXpfMTAyNF9zcXJfYXZ4MgorCS5ydmEJLkxTRUhfZW5kX3JzYXpfMTAyNF9zcXJfYXZ4MgorCS5ydmEJLkxTRUhfaW5mb19yc2F6XzEwMjRfc3FyX2F2eDIKKworCS5ydmEJLkxTRUhfYmVnaW5fcnNhel8xMDI0X211bF9hdngyCisJLnJ2YQkuTFNFSF9lbmRfcnNhel8xMDI0X211bF9hdngyCisJLnJ2YQkuTFNFSF9pbmZvX3JzYXpfMTAyNF9tdWxfYXZ4MgorCisJLnJ2YQkuTFNFSF9iZWdpbl9yc2F6XzEwMjRfZ2F0aGVyNQorCS5ydmEJLkxTRUhfZW5kX3JzYXpfMTAyNF9nYXRoZXI1CisJLnJ2YQkuTFNFSF9pbmZvX3JzYXpfMTAyNF9nYXRoZXI1Cisuc2VjdGlvbgkueGRhdGEKKy5hbGlnbgk4CisuTFNFSF9pbmZvX3JzYXpfMTAyNF9zcXJfYXZ4MjoKKwkuYnl0ZQk5LDAsMCwwCisJLnJ2YQlyc2F6X3NlX2hhbmRsZXIKKwkucnZhCS5Mc3FyXzEwMjRfYm9keSwuTHNxcl8xMDI0X2VwaWxvZ3VlCisuTFNFSF9pbmZvX3JzYXpfMTAyNF9tdWxfYXZ4MjoKKwkuYnl0ZQk5LDAsMCwwCisJLnJ2YQlyc2F6X3NlX2hhbmRsZXIKKwkucnZhCS5MbXVsXzEwMjRfYm9keSwuTG11bF8xMDI0X2VwaWxvZ3VlCisuTFNFSF9pbmZvX3JzYXpfMTAyNF9nYXRoZXI1OgorCS5ieXRlCTB4MDEsMHgzMywweDE2LDB4MDAKKwkuYnl0ZQkweDM2LDB4ZjgsMHgwOSwweDAwCSN2bW92YXBzIDB4OTAocnNwKSx4bW0xNQorCS5ieXRlCTB4MzEsMHhlOCwweDA4LDB4MDAJI3Ztb3ZhcHMgMHg4MChyc3ApLHhtbTE0CisJLmJ5dGUJMHgyYywweGQ4LDB4MDcsMHgwMAkjdm1vdmFwcyAweDcwKHJzcCkseG1tMTMKKwkuYnl0ZQkweDI3LDB4YzgsMHgwNiwweDAwCSN2bW92YXBzIDB4NjAocnNwKSx4bW0xMgorCS5ieXRlCTB4MjIsMHhiOCwweDA1LDB4MDAJI3Ztb3ZhcHMgMHg1MChyc3ApLHhtbTExCisJLmJ5dGUJMHgxZCwweGE4LDB4MDQsMHgwMAkjdm1vdmFwcyAweDQwKHJzcCkseG1tMTAKKwkuYnl0ZQkweDE4LDB4OTgsMHgwMywweDAwCSN2bW92YXBzIDB4MzAocnNwKSx4bW05CisJLmJ5dGUJMHgxMywweDg4LDB4MDIsMHgwMAkjdm1vdmFwcyAweDIwKHJzcCkseG1tOAorCS5ieXRlCTB4MGUsMHg3OCwweDAxLDB4MDAJI3Ztb3ZhcHMgMHgxMChyc3ApLHhtbTcKKwkuYnl0ZQkweDA5LDB4NjgsMHgwMCwweDAwCSN2bW92YXBzIDB4MDAocnNwKSx4bW02CisJLmJ5dGUJMHgwNCwweDAxLDB4MTUsMHgwMAkjc3ViCXJzcCwweGE4CitfX18KK30KKworZm9yZWFjaCAoc3BsaXQoIlxuIiwkY29kZSkpIHsKKwlzL1xgKFteXGBdKilcYC9ldmFsKCQxKS9nZTsKKworCXMvXGIoc2hbcmxdZD9ccytcJCkoLT9bMC05XSspLyQxLiQyJTY0L2dlCQlvcgorCisJcy9cYih2bW92W2RxXSlcYiguKykleW1tKFswLTldKykvJDEkMiV4bW0kMy9nbwkJb3IKKwlzL1xiKHZtb3ZkcXUpXGIoLispJXgleW1tKFswLTldKykvJDEkMiV4bW0kMy9nbwkJb3IKKwlzL1xiKHZwaW5zcltxZF0pXGIoLispJXltbShbMC05XSspLyQxJDIleG1tJDMvZ28Jb3IKKwlzL1xiKHZwZXh0cltxZF0pXGIoLispJXltbShbMC05XSspLyQxJDIleG1tJDMvZ28Jb3IKKwlzL1xiKHZwYnJvYWRjYXN0W3FkXVxzKykleW1tKFswLTldKykvJDEleG1tJDIvZ287CisJcHJpbnQgJF8sIlxuIjsKK30KKworfX19IGVsc2Uge3t7CitwcmludCA8PF9fXzsJIyBhc3NlbWJsZXIgaXMgdG9vIG9sZAorLnRleHQKKworLmdsb2JsCXJzYXpfYXZ4Ml9lbGlnaWJsZQorLnR5cGUJcnNhel9hdngyX2VsaWdpYmxlLFxAYWJpLW9tbmlwb3RlbnQKK3JzYXpfYXZ4Ml9lbGlnaWJsZToKKwl4b3IJJWVheCwlZWF4CisJcmV0Cisuc2l6ZQlyc2F6X2F2eDJfZWxpZ2libGUsLi1yc2F6X2F2eDJfZWxpZ2libGUKKworLmdsb2JsCXJzYXpfMTAyNF9zcXJfYXZ4MgorLmdsb2JsCXJzYXpfMTAyNF9tdWxfYXZ4MgorLmdsb2JsCXJzYXpfMTAyNF9ub3JtMnJlZF9hdngyCisuZ2xvYmwJcnNhel8xMDI0X3JlZDJub3JtX2F2eDIKKy5nbG9ibAlyc2F6XzEwMjRfc2NhdHRlcjVfYXZ4MgorLmdsb2JsCXJzYXpfMTAyNF9nYXRoZXI1X2F2eDIKKy50eXBlCXJzYXpfMTAyNF9zcXJfYXZ4MixcQGFiaS1vbW5pcG90ZW50Cityc2F6XzEwMjRfc3FyX2F2eDI6Cityc2F6XzEwMjRfbXVsX2F2eDI6Cityc2F6XzEwMjRfbm9ybTJyZWRfYXZ4MjoKK3JzYXpfMTAyNF9yZWQybm9ybV9hdngyOgorcnNhel8xMDI0X3NjYXR0ZXI1X2F2eDI6Cityc2F6XzEwMjRfZ2F0aGVyNV9hdngyOgorCS5ieXRlCTB4MGYsMHgwYgkjIHVkMgorCXJldAorLnNpemUJcnNhel8xMDI0X3Nxcl9hdngyLC4tcnNhel8xMDI0X3Nxcl9hdngyCitfX18KK319fQorCitjbG9zZSBTVERPVVQ7CmRpZmYgLS1naXQgYS9jcnlwdG8vYm4vYXNtL3JzYXoteDg2XzY0LnBsIGIvY3J5cHRvL2JuL2FzbS9yc2F6LXg4Nl82NC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjBiNDczCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2JuL2FzbS9yc2F6LXg4Nl82NC5wbApAQCAtMCwwICsxLDIxMzkgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgIENvcHlyaWdodCAoYykgMjAxMiwgSW50ZWwgQ29ycG9yYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0ICAgICAgICAjCisjICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlICAgICMKKyMgIG1ldDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjICAqICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCAgICAgICAgICMKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gICAgICAgICAgIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjICAqICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCAgICAgICMKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgICAgIworIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlICAgICAgICAgICAgICAgICAjCisjICAgICBkaXN0cmlidXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyAgKiAgTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMgICAgICAgICAjCisjICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSAgICMKKyMgICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uICAgICAgICAgICAgICAgIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgSU5URUwgQ09SUE9SQVRJT04gIiJBUyBJUyIiIEFORCBBTlkgICAgICAgICAgIworIyAgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgICAgICAgICAjCisjICBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgICAgICAgICMKKyMgIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIElOVEVMIENPUlBPUkFUSU9OIE9SICAgICAgICAgICAgIworIyAgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsICAgICAjCisjICBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sICAgICAgICMKKyMgIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiAgICAgICAgIworIyAgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiAgICAjCisjICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyAgICAgICMKKyMgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyAgICAgICAgIworIyAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuICAgICAgICAgICAgICAjCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBEZXZlbG9wZXJzIGFuZCBhdXRob3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIFNoYXkgR3Vlcm9uICgxLCAyKSwgYW5kIFZsYWQgS3Jhc25vdiAoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgKDEpIEludGVsIEFyY2hpdGVjdHVyZSBHcm91cCwgTWljcm9wcm9jZXNzb3IgYW5kIENoaXBzZXQgRGV2ZWxvcG1lbnQsICAgICAgIworIyAgICAgSXNyYWVsIERldmVsb3BtZW50IENlbnRlciwgSGFpZmEsIElzcmFlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjICgyKSBVbml2ZXJzaXR5IG9mIEhhaWZhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBSZWZlcmVuY2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIFsxXSBTLiBHdWVyb24sICJFZmZpY2llbnQgU29mdHdhcmUgSW1wbGVtZW50YXRpb25zIG9mIE1vZHVsYXIgICAgICAgICAgICAgICMKKyMgICAgIEV4cG9uZW50aWF0aW9uIiwgaHR0cDovL2VwcmludC5pYWNyLm9yZy8yMDExLzIzOSAgICAgICAgICAgICAgICAgICAgICAgIworIyBbMl0gUy4gR3Vlcm9uLCBWLiBLcmFzbm92LiAiU3BlZWRpbmcgdXAgQmlnLU51bWJlcnMgU3F1YXJpbmciLiAgICAgICAgICAgICAjCisjICAgICBJRUVFIFByb2NlZWRpbmdzIG9mIDl0aCBJbnRlcm5hdGlvbmFsIENvbmZlcmVuY2Ugb24gSW5mb3JtYXRpb24gICAgICAgICMKKyMgICAgIFRlY2hub2xvZ3k6IE5ldyBHZW5lcmF0aW9ucyAoSVRORyAyMDEyKSwgODIxLTgyMyAoMjAxMikuICAgICAgICAgICAgICAgIworIyBbM10gUy4gR3Vlcm9uLCBFZmZpY2llbnQgU29mdHdhcmUgSW1wbGVtZW50YXRpb25zIG9mIE1vZHVsYXIgRXhwb25lbnRpYXRpb24jCisjICAgICBKb3VybmFsIG9mIENyeXB0b2dyYXBoaWMgRW5naW5lZXJpbmcgMjozMS00MyAoMjAxMikuICAgICAgICAgICAgICAgICAgICMKKyMgWzRdIFMuIEd1ZXJvbiwgVi4gS3Jhc25vdjogIltQQVRDSF0gRWZmaWNpZW50IGFuZCBzaWRlIGNoYW5uZWwgYW5hbHlzaXMgICAgIworIyAgICAgcmVzaXN0YW50IDUxMi1iaXQgYW5kIDEwMjQtYml0IG1vZHVsYXIgZXhwb25lbnRpYXRpb24gZm9yIG9wdGltaXppbmcgICAjCisjICAgICBSU0ExMDI0IGFuZCBSU0EyMDQ4IG9uIHg4Nl82NCBwbGF0Zm9ybXMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgICAgIGh0dHA6Ly9ydC5vcGVuc3NsLm9yZy9UaWNrZXQvRGlzcGxheS5odG1sP2lkPTI1ODImdXNlcj1ndWVzdCZwYXNzPWd1ZXN0IworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgV2hpbGUgb3JpZ2luYWwgc3VibWlzc2lvbiBjb3ZlcnMgNTEyLSBhbmQgMTAyNC1iaXQgZXhwb25lbnRpYXRpb24sCisjIHRoaXMgbW9kdWxlIGlzIGxpbWl0ZWQgdG8gNTEyLWJpdCB2ZXJzaW9uIG9ubHkgKGFuZCBhcyBzdWNoCisjIGFjY2VsZXJhdGVzIFJTQTEwMjQgc2lnbikuIFRoaXMgaXMgYmVjYXVzZSBpbXByb3ZlbWVudCBmb3IgbG9uZ2VyCisjIGtleXMgaXMgbm90IGhpZ2ggZW5vdWdoIHRvIGp1c3RpZnkgdGhlIGVmZm9ydCwgaGlnaGVzdCBtZWFzdXJlZAorIyB3YXMgfjUlIG9uIFdlc3RtZXJlLiBbVGhpcyBpcyByZWxhdGl2ZSB0byBPcGVuU1NMIDEuMC4yLCB1cGNvbWluZworIyBmb3IgdGhlIG1vbWVudCBvZiB0aGlzIHdyaXRpbmchXSBOb3IgZG9lcyB0aGlzIG1vZHVsZSBpbXBsZW1lbnQKKyMgIm1vbm9saXRoaWMiIGNvbXBsZXRlIGV4cG9uZW50aWF0aW9uIGp1bWJvLXN1YnJvdXRpbmUsIGJ1dCBhZGhlcmVzCisjIHRvIG1vcmUgbW9kdWxhciBtaXh0dXJlIG9mIEMgYW5kIGFzc2VtYmx5LiBBbmQgaXQncyBvcHRpbWl6ZWQgZXZlbgorIyBmb3IgcHJvY2Vzc29ycyBvdGhlciB0aGFuIEludGVsIENvcmUgZmFtaWx5IChzZWUgdGFibGUgYmVsb3cgZm9yCisjIGltcHJvdmVtZW50IGNvZWZmaWNpZW50cykuCisjIAkJCQkJCTxhcHByb0BvcGVuc3NsLm9yZz4KKyMKKyMgUlNBMTAyNCBzaWduL3NlYwl0aGlzL29yaWdpbmFsCXx0aGlzL3JzYXgoKikJdGhpcy9maXBzKCopCisjCQkJLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgT3B0ZXJvbgkJKzEzJQkJfCs1JQkJKzIwJQorIyBCdWxsZG96ZXIJCS0wJQkJfC0xJQkJKzEwJQorIyBQNAkJCSsxMSUJCXwrNyUJCSs4JQorIyBXZXN0bWVyZQkJKzUlCQl8KzE0JQkJKzE3JQorIyBTYW5keSBCcmlkZ2UJCSsyJQkJfCsxMiUJCSsyOSUKKyMgSXZ5IEJyaWRnZQkJKzElCQl8KzExJQkJKzM1JQorIyBIYXN3ZWxsKCoqKQkJLTAlCQl8KzEyJQkJKzM5JQorIyBBdG9tCQkJKzEzJQkJfCsxMSUJCSs0JQorIyBWSUEgTmFubwkJKzcwJQkJfCs5JQkJKzI1JQorIworIyAoKikJcnNheCBlbmdpbmUgYW5kIGZpcHMgbnVtYmVycyBhcmUgcHJlc2VudGVkIGZvciByZWZlcmVuY2UKKyMJcHVycG9zZXM7CisjICgqKikJTVVMWCB3YXMgYXR0ZW1wdGVkLCBidXQgZm91bmQgdG8gZ2l2ZSBvbmx5IG1hcmdpbmFsIGltcHJvdmVtZW50OworCiskZmxhdm91ciA9IHNoaWZ0OworJG91dHB1dCAgPSBzaGlmdDsKK2lmICgkZmxhdm91ciA9fiAvXC4vKSB7ICRvdXRwdXQgPSAkZmxhdm91cjsgdW5kZWYgJGZsYXZvdXI7IH0KKworJHdpbjY0PTA7ICR3aW42ND0xIGlmICgkZmxhdm91ciA9fiAvW25tXWFzbXxtaW5ndzY0LyB8fCAkb3V0cHV0ID1+IC9cLmFzbSQvKTsKKworJDAgPX4gbS8oLipbXC9cXF0pW15cL1xcXSskLzsgJGRpcj0kMTsKKyggJHhsYXRlPSIke2Rpcn14ODZfNjQteGxhdGUucGwiIGFuZCAtZiAkeGxhdGUgKSBvcgorKCAkeGxhdGU9IiR7ZGlyfS4uLy4uL3Blcmxhc20veDg2XzY0LXhsYXRlLnBsIiBhbmQgLWYgJHhsYXRlKSBvcgorZGllICJjYW4ndCBsb2NhdGUgeDg2XzY0LXhsYXRlLnBsIjsKKworb3BlbiBPVVQsInwgJF5YICR4bGF0ZSAkZmxhdm91ciAkb3V0cHV0IjsKKypTVERPVVQ9Kk9VVDsKKworaWYgKGAkRU5We0NDfSAtV2EsLXYgLWMgLW8gL2Rldi9udWxsIC14IGFzc2VtYmxlciAvZGV2L251bGwgMj4mMWAKKwkJPX4gL0dOVSBhc3NlbWJsZXIgdmVyc2lvbiAoWzItOV1cLlswLTldKykvKSB7CisJJGFkZHggPSAoJDE+PTIuMjMpOworfQorCitpZiAoISRhZGR4ICYmICR3aW42NCAmJiAoJGZsYXZvdXIgPX4gL25hc20vIHx8ICRFTlZ7QVNNfSA9fiAvbmFzbS8pICYmCisJICAgIGBuYXNtIC12IDI+JjFgID1+IC9OQVNNIHZlcnNpb24gKFsyLTldXC5bMC05XSspLykgeworCSRhZGR4ID0gKCQxPj0yLjEwKTsKK30KKworaWYgKCEkYWRkeCAmJiAkd2luNjQgJiYgKCRmbGF2b3VyID1+IC9tYXNtLyB8fCAkRU5We0FTTX0gPX4gL21sNjQvKSAmJgorCSAgICBgbWw2NCAyPiYxYCA9fiAvVmVyc2lvbiAoWzAtOV0rKVwuLykgeworCSRhZGR4ID0gKCQxPj0xMSk7Cit9CisKKygkb3V0LCAkaW5wLCAkbW9kKSA9ICgiJXJkaSIsICIlcnNpIiwgIiVyYnAiKTsJIyBjb21tb24gaW50ZXJuYWwgQVBJCit7CitteSAoJG91dCwkaW5wLCRtb2QsJG4wLCR0aW1lcykgPSAoIiVyZGkiLCIlcnNpIiwiJXJkeCIsIiVyY3giLCIlcjhkIik7CisKKyRjb2RlLj08PF9fXzsKKy50ZXh0CisKKy5leHRlcm4JT1BFTlNTTF9pYTMyY2FwX1AKKworLmdsb2JsCXJzYXpfNTEyX3NxcgorLnR5cGUJcnNhel81MTJfc3FyLFxAZnVuY3Rpb24sNQorLmFsaWduCTMyCityc2F6XzUxMl9zcXI6CQkJCSMgMjUtMjklIGZhc3RlciB0aGFuIHJzYXpfNTEyX211bAorCXB1c2gJJXJieAorCXB1c2gJJXJicAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCXB1c2gJJXIxNQorCisJc3VicQlcJDEyOCsyNCwgJXJzcAorLkxzcXJfYm9keToKKwltb3ZxCSRtb2QsICVyYnAJCSMgY29tbW9uIGFyZ3VtZW50CisJbW92cQkoJGlucCksICVyZHgKKwltb3ZxCTgoJGlucCksICVyYXgKKwltb3ZxCSRuMCwgMTI4KCVyc3ApCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJGFkZHgpOworCW1vdmwJXCQweDgwMTAwLCVyMTFkCisJYW5kbAlPUEVOU1NMX2lhMzJjYXBfUCs4KCVyaXApLCVyMTFkCisJY21wbAlcJDB4ODAxMDAsJXIxMWQJCSMgY2hlY2sgZm9yIE1VTFggYW5kIEFETy9DWAorCWplCS5Mb29wX3NxcngKK19fXworJGNvZGUuPTw8X19fOworCWptcAkuTG9vcF9zcXIKKworLmFsaWduCTMyCisuTG9vcF9zcXI6CisJbW92bAkkdGltZXMsMTI4KzgoJXJzcCkKKyNmaXJzdCBpdGVyYXRpb24KKwltb3ZxCSVyZHgsICVyYngKKwltdWxxCSVyZHgKKwltb3ZxCSVyYXgsICVyOAorCW1vdnEJMTYoJGlucCksICVyYXgKKwltb3ZxCSVyZHgsICVyOQorCisJbXVscQklcmJ4CisJYWRkcQklcmF4LCAlcjkKKwltb3ZxCTI0KCRpbnApLCAlcmF4CisJbW92cQklcmR4LCAlcjEwCisJYWRjcQlcJDAsICVyMTAKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwgJXIxMAorCW1vdnEJMzIoJGlucCksICVyYXgKKwltb3ZxCSVyZHgsICVyMTEKKwlhZGNxCVwkMCwgJXIxMQorCisJbXVscQklcmJ4CisJYWRkcQklcmF4LCAlcjExCisJbW92cQk0MCgkaW5wKSwgJXJheAorCW1vdnEJJXJkeCwgJXIxMgorCWFkY3EJXCQwLCAlcjEyCisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsICVyMTIKKwltb3ZxCTQ4KCRpbnApLCAlcmF4CisJbW92cQklcmR4LCAlcjEzCisJYWRjcQlcJDAsICVyMTMKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwgJXIxMworCW1vdnEJNTYoJGlucCksICVyYXgKKwltb3ZxCSVyZHgsICVyMTQKKwlhZGNxCVwkMCwgJXIxNAorCisJbXVscQklcmJ4CisJYWRkcQklcmF4LCAlcjE0CisJbW92cQklcmJ4LCAlcmF4CisJbW92cQklcmR4LCAlcjE1CisJYWRjcQlcJDAsICVyMTUKKworCWFkZHEJJXI4LCAlcjgJCSNzaGxxCVwkMSwgJXI4CisJbW92cQklcjksICVyY3gKKwlhZGNxCSVyOSwgJXI5CQkjc2hsZAlcJDEsICVyOCwgJXI5CisKKwltdWxxCSVyYXgKKwltb3ZxCSVyYXgsICglcnNwKQorCWFkZHEJJXJkeCwgJXI4CisJYWRjcQlcJDAsICVyOQorCisJbW92cQklcjgsIDgoJXJzcCkKKwlzaHJxCVwkNjMsICVyY3gKKworI3NlY29uZCBpdGVyYXRpb24KKwltb3ZxCTgoJGlucCksICVyOAorCW1vdnEJMTYoJGlucCksICVyYXgKKwltdWxxCSVyOAorCWFkZHEJJXJheCwgJXIxMAorCW1vdnEJMjQoJGlucCksICVyYXgKKwltb3ZxCSVyZHgsICVyYngKKwlhZGNxCVwkMCwgJXJieAorCisJbXVscQklcjgKKwlhZGRxCSVyYXgsICVyMTEKKwltb3ZxCTMyKCRpbnApLCAlcmF4CisJYWRjcQlcJDAsICVyZHgKKwlhZGRxCSVyYngsICVyMTEKKwltb3ZxCSVyZHgsICVyYngKKwlhZGNxCVwkMCwgJXJieAorCisJbXVscQklcjgKKwlhZGRxCSVyYXgsICVyMTIKKwltb3ZxCTQwKCRpbnApLCAlcmF4CisJYWRjcQlcJDAsICVyZHgKKwlhZGRxCSVyYngsICVyMTIKKwltb3ZxCSVyZHgsICVyYngKKwlhZGNxCVwkMCwgJXJieAorCisJbXVscQklcjgKKwlhZGRxCSVyYXgsICVyMTMKKwltb3ZxCTQ4KCRpbnApLCAlcmF4CisJYWRjcQlcJDAsICVyZHgKKwlhZGRxCSVyYngsICVyMTMKKwltb3ZxCSVyZHgsICVyYngKKwlhZGNxCVwkMCwgJXJieAorCisJbXVscQklcjgKKwlhZGRxCSVyYXgsICVyMTQKKwltb3ZxCTU2KCRpbnApLCAlcmF4CisJYWRjcQlcJDAsICVyZHgKKwlhZGRxCSVyYngsICVyMTQKKwltb3ZxCSVyZHgsICVyYngKKwlhZGNxCVwkMCwgJXJieAorCisJbXVscQklcjgKKwlhZGRxCSVyYXgsICVyMTUKKwltb3ZxCSVyOCwgJXJheAorCWFkY3EJXCQwLCAlcmR4CisJYWRkcQklcmJ4LCAlcjE1CisJbW92cQklcmR4LCAlcjgKKwltb3ZxCSVyMTAsICVyZHgKKwlhZGNxCVwkMCwgJXI4CisKKwlhZGQJJXJkeCwgJXJkeAorCWxlYQkoJXJjeCwlcjEwLDIpLCAlcjEwCSNzaGxkCVwkMSwgJXJjeCwgJXIxMAorCW1vdnEJJXIxMSwgJXJieAorCWFkY3EJJXIxMSwgJXIxMQkJI3NobGQJXCQxLCAlcjEwLCAlcjExCisKKwltdWxxCSVyYXgKKwlhZGRxCSVyYXgsICVyOQorCWFkY3EJJXJkeCwgJXIxMAorCWFkY3EJXCQwLCAlcjExCisKKwltb3ZxCSVyOSwgMTYoJXJzcCkKKwltb3ZxCSVyMTAsIDI0KCVyc3ApCisJc2hycQlcJDYzLCAlcmJ4CisJCisjdGhpcmQgaXRlcmF0aW9uCisJbW92cQkxNigkaW5wKSwgJXI5CQorCW1vdnEJMjQoJGlucCksICVyYXgKKwltdWxxCSVyOQorCWFkZHEJJXJheCwgJXIxMgorCW1vdnEJMzIoJGlucCksICVyYXgKKwltb3ZxCSVyZHgsICVyY3gKKwlhZGNxCVwkMCwgJXJjeAorCisJbXVscQklcjkKKwlhZGRxCSVyYXgsICVyMTMKKwltb3ZxCTQwKCRpbnApLCAlcmF4CisJYWRjcQlcJDAsICVyZHgKKwlhZGRxCSVyY3gsICVyMTMKKwltb3ZxCSVyZHgsICVyY3gKKwlhZGNxCVwkMCwgJXJjeAorCisJbXVscQklcjkKKwlhZGRxCSVyYXgsICVyMTQKKwltb3ZxCTQ4KCRpbnApLCAlcmF4CisJYWRjcQlcJDAsICVyZHgKKwlhZGRxCSVyY3gsICVyMTQKKwltb3ZxCSVyZHgsICVyY3gKKwlhZGNxCVwkMCwgJXJjeAorCisJbXVscQklcjkKKwkgbW92cQklcjEyLCAlcjEwCisJIGxlYQkoJXJieCwlcjEyLDIpLCAlcjEyCSNzaGxkCVwkMSwgJXJieCwgJXIxMgorCWFkZHEJJXJheCwgJXIxNQorCW1vdnEJNTYoJGlucCksICVyYXgKKwlhZGNxCVwkMCwgJXJkeAorCWFkZHEJJXJjeCwgJXIxNQorCW1vdnEJJXJkeCwgJXJjeAorCWFkY3EJXCQwLCAlcmN4CisKKwltdWxxCSVyOQorCSBzaHJxCVwkNjMsICVyMTAKKwlhZGRxCSVyYXgsICVyOAorCW1vdnEJJXI5LCAlcmF4CisJYWRjcQlcJDAsICVyZHgKKwlhZGRxCSVyY3gsICVyOAorCW1vdnEJJXJkeCwgJXI5CisJYWRjcQlcJDAsICVyOQorCisJbW92cQklcjEzLCAlcmN4CisJbGVhcQkoJXIxMCwlcjEzLDIpLCAlcjEzCSNzaGxkCVwkMSwgJXIxMiwgJXIxMworCisJbXVscQklcmF4CisJYWRkcQklcmF4LCAlcjExCisJYWRjcQklcmR4LCAlcjEyCisJYWRjcQlcJDAsICVyMTMKKworCW1vdnEJJXIxMSwgMzIoJXJzcCkKKwltb3ZxCSVyMTIsIDQwKCVyc3ApCisJc2hycQlcJDYzLCAlcmN4CisKKyNmb3VydGggaXRlcmF0aW9uCisJbW92cQkyNCgkaW5wKSwgJXIxMAorCW1vdnEJMzIoJGlucCksICVyYXgKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsICVyMTQKKwltb3ZxCTQwKCRpbnApLCAlcmF4CisJbW92cQklcmR4LCAlcmJ4CisJYWRjcQlcJDAsICVyYngKKworCW11bHEJJXIxMAorCWFkZHEJJXJheCwgJXIxNQorCW1vdnEJNDgoJGlucCksICVyYXgKKwlhZGNxCVwkMCwgJXJkeAorCWFkZHEJJXJieCwgJXIxNQorCW1vdnEJJXJkeCwgJXJieAorCWFkY3EJXCQwLCAlcmJ4CisKKwltdWxxCSVyMTAKKwkgbW92cQklcjE0LCAlcjEyCisJIGxlYXEJKCVyY3gsJXIxNCwyKSwgJXIxNAkjc2hsZAlcJDEsICVyY3gsICVyMTQKKwlhZGRxCSVyYXgsICVyOAorCW1vdnEJNTYoJGlucCksICVyYXgKKwlhZGNxCVwkMCwgJXJkeAorCWFkZHEJJXJieCwgJXI4CisJbW92cQklcmR4LCAlcmJ4CisJYWRjcQlcJDAsICVyYngKKworCW11bHEJJXIxMAorCSBzaHJxCVwkNjMsICVyMTIKKwlhZGRxCSVyYXgsICVyOQorCW1vdnEJJXIxMCwgJXJheAorCWFkY3EJXCQwLCAlcmR4CisJYWRkcQklcmJ4LCAlcjkKKwltb3ZxCSVyZHgsICVyMTAKKwlhZGNxCVwkMCwgJXIxMAorCisJbW92cQklcjE1LCAlcmJ4CisJbGVhcQkoJXIxMiwlcjE1LDIpLCVyMTUJI3NobGQJXCQxLCAlcjE0LCAlcjE1CisKKwltdWxxCSVyYXgKKwlhZGRxCSVyYXgsICVyMTMKKwlhZGNxCSVyZHgsICVyMTQKKwlhZGNxCVwkMCwgJXIxNQorCisJbW92cQklcjEzLCA0OCglcnNwKQorCW1vdnEJJXIxNCwgNTYoJXJzcCkKKwlzaHJxCVwkNjMsICVyYngKKworI2ZpZnRoIGl0ZXJhdGlvbgorCW1vdnEJMzIoJGlucCksICVyMTEKKwltb3ZxCTQwKCRpbnApLCAlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCAlcjgKKwltb3ZxCTQ4KCRpbnApLCAlcmF4CisJbW92cQklcmR4LCAlcmN4CisJYWRjcQlcJDAsICVyY3gKKworCW11bHEJJXIxMQorCWFkZHEJJXJheCwgJXI5CisJbW92cQk1NigkaW5wKSwgJXJheAorCWFkY3EJXCQwLCAlcmR4CisJIG1vdnEJJXI4LCAlcjEyCisJIGxlYXEJKCVyYngsJXI4LDIpLCAlcjgJI3NobGQJXCQxLCAlcmJ4LCAlcjgKKwlhZGRxCSVyY3gsICVyOQorCW1vdnEJJXJkeCwgJXJjeAorCWFkY3EJXCQwLCAlcmN4CisKKwltdWxxCSVyMTEKKwkgc2hycQlcJDYzLCAlcjEyCisJYWRkcQklcmF4LCAlcjEwCisJbW92cQklcjExLCAlcmF4CisJYWRjcQlcJDAsICVyZHgKKwlhZGRxCSVyY3gsICVyMTAKKwltb3ZxCSVyZHgsICVyMTEKKwlhZGNxCVwkMCwgJXIxMQorCisJbW92cQklcjksICVyY3gKKwlsZWFxCSglcjEyLCVyOSwyKSwgJXI5CSNzaGxkCVwkMSwgJXI4LCAlcjkKKworCW11bHEJJXJheAorCWFkZHEJJXJheCwgJXIxNQorCWFkY3EJJXJkeCwgJXI4CisJYWRjcQlcJDAsICVyOQorCisJbW92cQklcjE1LCA2NCglcnNwKQorCW1vdnEJJXI4LCA3MiglcnNwKQorCXNocnEJXCQ2MywgJXJjeAorCisjc2l4dGggaXRlcmF0aW9uCisJbW92cQk0MCgkaW5wKSwgJXIxMgorCW1vdnEJNDgoJGlucCksICVyYXgKKwltdWxxCSVyMTIKKwlhZGRxCSVyYXgsICVyMTAKKwltb3ZxCTU2KCRpbnApLCAlcmF4CisJbW92cQklcmR4LCAlcmJ4CisJYWRjcQlcJDAsICVyYngKKworCW11bHEJJXIxMgorCWFkZHEJJXJheCwgJXIxMQorCW1vdnEJJXIxMiwgJXJheAorCSBtb3ZxCSVyMTAsICVyMTUKKwkgbGVhcQkoJXJjeCwlcjEwLDIpLCAlcjEwCSNzaGxkCVwkMSwgJXJjeCwgJXIxMAorCWFkY3EJXCQwLCAlcmR4CisJIHNocnEJXCQ2MywgJXIxNQorCWFkZHEJJXJieCwgJXIxMQorCW1vdnEJJXJkeCwgJXIxMgorCWFkY3EJXCQwLCAlcjEyCisKKwltb3ZxCSVyMTEsICVyYngKKwlsZWFxCSglcjE1LCVyMTEsMiksICVyMTEJI3NobGQJXCQxLCAlcjEwLCAlcjExCisKKwltdWxxCSVyYXgKKwlhZGRxCSVyYXgsICVyOQorCWFkY3EJJXJkeCwgJXIxMAorCWFkY3EJXCQwLCAlcjExCisKKwltb3ZxCSVyOSwgODAoJXJzcCkKKwltb3ZxCSVyMTAsIDg4KCVyc3ApCisKKyNzZXZlbnRoIGl0ZXJhdGlvbgorCW1vdnEJNDgoJGlucCksICVyMTMKKwltb3ZxCTU2KCRpbnApLCAlcmF4CisJbXVscQklcjEzCisJYWRkcQklcmF4LCAlcjEyCisJbW92cQklcjEzLCAlcmF4CisJbW92cQklcmR4LCAlcjEzCisJYWRjcQlcJDAsICVyMTMKKworCXhvcnEJJXIxNCwgJXIxNAorCXNobHEJXCQxLCAlcmJ4CisJYWRjcQklcjEyLCAlcjEyCQkjc2hsZAlcJDEsICVyYngsICVyMTIKKwlhZGNxCSVyMTMsICVyMTMJCSNzaGxkCVwkMSwgJXIxMiwgJXIxMworCWFkY3EJJXIxNCwgJXIxNAkJI3NobGQJXCQxLCAlcjEzLCAlcjE0CisKKwltdWxxCSVyYXgKKwlhZGRxCSVyYXgsICVyMTEKKwlhZGNxCSVyZHgsICVyMTIKKwlhZGNxCVwkMCwgJXIxMworCisJbW92cQklcjExLCA5NiglcnNwKQorCW1vdnEJJXIxMiwgMTA0KCVyc3ApCisKKyNlaWdodGggaXRlcmF0aW9uCisJbW92cQk1NigkaW5wKSwgJXJheAorCW11bHEJJXJheAorCWFkZHEJJXJheCwgJXIxMworCWFkY3EJXCQwLCAlcmR4CisKKwlhZGRxCSVyZHgsICVyMTQKKworCW1vdnEJJXIxMywgMTEyKCVyc3ApCisJbW92cQklcjE0LCAxMjAoJXJzcCkKKworCW1vdnEJKCVyc3ApLCAlcjgKKwltb3ZxCTgoJXJzcCksICVyOQorCW1vdnEJMTYoJXJzcCksICVyMTAKKwltb3ZxCTI0KCVyc3ApLCAlcjExCisJbW92cQkzMiglcnNwKSwgJXIxMgorCW1vdnEJNDAoJXJzcCksICVyMTMKKwltb3ZxCTQ4KCVyc3ApLCAlcjE0CisJbW92cQk1NiglcnNwKSwgJXIxNQorCisJY2FsbAlfX3JzYXpfNTEyX3JlZHVjZQorCisJYWRkcQk2NCglcnNwKSwgJXI4CisJYWRjcQk3MiglcnNwKSwgJXI5CisJYWRjcQk4MCglcnNwKSwgJXIxMAorCWFkY3EJODgoJXJzcCksICVyMTEKKwlhZGNxCTk2KCVyc3ApLCAlcjEyCisJYWRjcQkxMDQoJXJzcCksICVyMTMKKwlhZGNxCTExMiglcnNwKSwgJXIxNAorCWFkY3EJMTIwKCVyc3ApLCAlcjE1CisJc2JicQklcmN4LCAlcmN4CisKKwljYWxsCV9fcnNhel81MTJfc3VidHJhY3QKKworCW1vdnEJJXI4LCAlcmR4CisJbW92cQklcjksICVyYXgKKwltb3ZsCTEyOCs4KCVyc3ApLCAkdGltZXMKKwltb3ZxCSRvdXQsICRpbnAKKworCWRlY2wJJHRpbWVzCisJam56CS5Mb29wX3NxcgorX19fCitpZiAoJGFkZHgpIHsKKyRjb2RlLj08PF9fXzsKKwlqbXAJLkxzcXJfdGFpbAorCisuYWxpZ24JMzIKKy5Mb29wX3Nxcng6CisJbW92bAkkdGltZXMsMTI4KzgoJXJzcCkKKwltb3ZxCSRvdXQsICV4bW0wCQkjIG9mZi1sb2FkCisJbW92cQklcmJwLCAleG1tMQkJIyBvZmYtbG9hZAorI2ZpcnN0IGl0ZXJhdGlvbgkKKwltdWx4CSVyYXgsICVyOCwgJXI5CisKKwltdWx4CTE2KCRpbnApLCAlcmN4LCAlcjEwCisJeG9yCSVyYnAsICVyYnAJCSMgY2Y9MCwgb2Y9MAorCisJbXVseAkyNCgkaW5wKSwgJXJheCwgJXIxMQorCWFkY3gJJXJjeCwgJXI5CisKKwltdWx4CTMyKCRpbnApLCAlcmN4LCAlcjEyCisJYWRjeAklcmF4LCAlcjEwCisKKwltdWx4CTQwKCRpbnApLCAlcmF4LCAlcjEzCisJYWRjeAklcmN4LCAlcjExCisKKwkuYnl0ZQkweGM0LDB4NjIsMHhmMywweGY2LDB4YjYsMHgzMCwweDAwLDB4MDAsMHgwMAkjIG11bHgJNDgoJGlucCksICVyY3gsICVyMTQKKwlhZGN4CSVyYXgsICVyMTIKKwlhZGN4CSVyY3gsICVyMTMKKworCS5ieXRlCTB4YzQsMHg2MiwweGZiLDB4ZjYsMHhiZSwweDM4LDB4MDAsMHgwMCwweDAwCSMgbXVseAk1NigkaW5wKSwgJXJheCwgJXIxNQorCWFkY3gJJXJheCwgJXIxNAorCWFkY3gJJXJicCwgJXIxNQkJIyAlcmJwIGlzIDAKKworCW1vdgklcjksICVyY3gKKwlzaGxkCVwkMSwgJXI4LCAlcjkKKwlzaGwJXCQxLCAlcjgKKworCXhvcgklZWJwLCAlZWJwCisJbXVseAklcmR4LCAlcmF4LCAlcmR4CisJYWRjeAklcmR4LCAlcjgKKwkgbW92CTgoJGlucCksICVyZHgKKwlhZGN4CSVyYnAsICVyOQorCisJbW92CSVyYXgsICglcnNwKQorCW1vdgklcjgsIDgoJXJzcCkKKworI3NlY29uZCBpdGVyYXRpb24JCisJbXVseAkxNigkaW5wKSwgJXJheCwgJXJieAorCWFkb3gJJXJheCwgJXIxMAorCWFkY3gJJXJieCwgJXIxMQorCisJLmJ5dGUJMHhjNCwweDYyLDB4YzMsMHhmNiwweDg2LDB4MTgsMHgwMCwweDAwLDB4MDAJIyBtdWx4CTI0KCRpbnApLCAkb3V0LCAlcjgKKwlhZG94CSRvdXQsICVyMTEKKwlhZGN4CSVyOCwgJXIxMgorCisJbXVseAkzMigkaW5wKSwgJXJheCwgJXJieAorCWFkb3gJJXJheCwgJXIxMgorCWFkY3gJJXJieCwgJXIxMworCisJbXVseAk0MCgkaW5wKSwgJG91dCwgJXI4CisJYWRveAkkb3V0LCAlcjEzCisJYWRjeAklcjgsICVyMTQKKworCS5ieXRlCTB4YzQsMHhlMiwweGZiLDB4ZjYsMHg5ZSwweDMwLDB4MDAsMHgwMCwweDAwCSMgbXVseAk0OCgkaW5wKSwgJXJheCwgJXJieAorCWFkb3gJJXJheCwgJXIxNAorCWFkY3gJJXJieCwgJXIxNQorCisJLmJ5dGUJMHhjNCwweDYyLDB4YzMsMHhmNiwweDg2LDB4MzgsMHgwMCwweDAwLDB4MDAJIyBtdWx4CTU2KCRpbnApLCAkb3V0LCAlcjgKKwlhZG94CSRvdXQsICVyMTUKKwlhZGN4CSVyYnAsICVyOAorCWFkb3gJJXJicCwgJXI4CisKKwltb3YJJXIxMSwgJXJieAorCXNobGQJXCQxLCAlcjEwLCAlcjExCisJc2hsZAlcJDEsICVyY3gsICVyMTAKKworCXhvcgklZWJwLCVlYnAKKwltdWx4CSVyZHgsICVyYXgsICVyY3gKKwkgbW92CTE2KCRpbnApLCAlcmR4CisJYWRjeAklcmF4LCAlcjkKKwlhZGN4CSVyY3gsICVyMTAKKwlhZGN4CSVyYnAsICVyMTEKKworCW1vdgklcjksIDE2KCVyc3ApCisJLmJ5dGUJMHg0YywweDg5LDB4OTQsMHgyNCwweDE4LDB4MDAsMHgwMCwweDAwCQkjIG1vdgklcjEwLCAyNCglcnNwKQorCQorI3RoaXJkIGl0ZXJhdGlvbgkKKwkuYnl0ZQkweGM0LDB4NjIsMHhjMywweGY2LDB4OGUsMHgxOCwweDAwLDB4MDAsMHgwMAkjIG11bHgJMjQoJGlucCksICRvdXQsICVyOQorCWFkb3gJJG91dCwgJXIxMgorCWFkY3gJJXI5LCAlcjEzCisKKwltdWx4CTMyKCRpbnApLCAlcmF4LCAlcmN4CisJYWRveAklcmF4LCAlcjEzCisJYWRjeAklcmN4LCAlcjE0CisKKwltdWx4CTQwKCRpbnApLCAkb3V0LCAlcjkKKwlhZG94CSRvdXQsICVyMTQKKwlhZGN4CSVyOSwgJXIxNQorCisJLmJ5dGUJMHhjNCwweGUyLDB4ZmIsMHhmNiwweDhlLDB4MzAsMHgwMCwweDAwLDB4MDAJIyBtdWx4CTQ4KCRpbnApLCAlcmF4LCAlcmN4CisJYWRveAklcmF4LCAlcjE1CisJYWRjeAklcmN4LCAlcjgKKworCS5ieXRlCTB4YzQsMHg2MiwweGMzLDB4ZjYsMHg4ZSwweDM4LDB4MDAsMHgwMCwweDAwCSMgbXVseAk1NigkaW5wKSwgJG91dCwgJXI5CisJYWRveAkkb3V0LCAlcjgKKwlhZGN4CSVyYnAsICVyOQorCWFkb3gJJXJicCwgJXI5CisKKwltb3YJJXIxMywgJXJjeAorCXNobGQJXCQxLCAlcjEyLCAlcjEzCisJc2hsZAlcJDEsICVyYngsICVyMTIKKworCXhvcgklZWJwLCAlZWJwCisJbXVseAklcmR4LCAlcmF4LCAlcmR4CisJYWRjeAklcmF4LCAlcjExCisJYWRjeAklcmR4LCAlcjEyCisJIG1vdgkyNCgkaW5wKSwgJXJkeAorCWFkY3gJJXJicCwgJXIxMworCisJbW92CSVyMTEsIDMyKCVyc3ApCisJLmJ5dGUJMHg0YywweDg5LDB4YTQsMHgyNCwweDI4LDB4MDAsMHgwMCwweDAwCQkjIG1vdgklcjEyLCA0MCglcnNwKQorCQorI2ZvdXJ0aCBpdGVyYXRpb24JCisJLmJ5dGUJMHhjNCwweGUyLDB4ZmIsMHhmNiwweDllLDB4MjAsMHgwMCwweDAwLDB4MDAJIyBtdWx4CTMyKCRpbnApLCAlcmF4LCAlcmJ4CisJYWRveAklcmF4LCAlcjE0CisJYWRjeAklcmJ4LCAlcjE1CisKKwltdWx4CTQwKCRpbnApLCAkb3V0LCAlcjEwCisJYWRveAkkb3V0LCAlcjE1CisJYWRjeAklcjEwLCAlcjgKKworCW11bHgJNDgoJGlucCksICVyYXgsICVyYngKKwlhZG94CSVyYXgsICVyOAorCWFkY3gJJXJieCwgJXI5CisKKwltdWx4CTU2KCRpbnApLCAkb3V0LCAlcjEwCisJYWRveAkkb3V0LCAlcjkKKwlhZGN4CSVyYnAsICVyMTAKKwlhZG94CSVyYnAsICVyMTAKKworCS5ieXRlCTB4NjYKKwltb3YJJXIxNSwgJXJieAorCXNobGQJXCQxLCAlcjE0LCAlcjE1CisJc2hsZAlcJDEsICVyY3gsICVyMTQKKworCXhvcgklZWJwLCAlZWJwCisJbXVseAklcmR4LCAlcmF4LCAlcmR4CisJYWRjeAklcmF4LCAlcjEzCisJYWRjeAklcmR4LCAlcjE0CisJIG1vdgkzMigkaW5wKSwgJXJkeAorCWFkY3gJJXJicCwgJXIxNQorCisJbW92CSVyMTMsIDQ4KCVyc3ApCisJbW92CSVyMTQsIDU2KCVyc3ApCisJCisjZmlmdGggaXRlcmF0aW9uCQorCS5ieXRlCTB4YzQsMHg2MiwweGMzLDB4ZjYsMHg5ZSwweDI4LDB4MDAsMHgwMCwweDAwCSMgbXVseAk0MCgkaW5wKSwgJG91dCwgJXIxMQorCWFkb3gJJG91dCwgJXI4CisJYWRjeAklcjExLCAlcjkKKworCW11bHgJNDgoJGlucCksICVyYXgsICVyY3gKKwlhZG94CSVyYXgsICVyOQorCWFkY3gJJXJjeCwgJXIxMAorCisJbXVseAk1NigkaW5wKSwgJG91dCwgJXIxMQorCWFkb3gJJG91dCwgJXIxMAorCWFkY3gJJXJicCwgJXIxMQorCWFkb3gJJXJicCwgJXIxMQorCisJbW92CSVyOSwgJXJjeAorCXNobGQJXCQxLCAlcjgsICVyOQorCXNobGQJXCQxLCAlcmJ4LCAlcjgKKworCXhvcgklZWJwLCAlZWJwCisJbXVseAklcmR4LCAlcmF4LCAlcmR4CisJYWRjeAklcmF4LCAlcjE1CisJYWRjeAklcmR4LCAlcjgKKwkgbW92CTQwKCRpbnApLCAlcmR4CisJYWRjeAklcmJwLCAlcjkKKworCW1vdgklcjE1LCA2NCglcnNwKQorCW1vdgklcjgsIDcyKCVyc3ApCisJCisjc2l4dGggaXRlcmF0aW9uCQorCS5ieXRlCTB4YzQsMHhlMiwweGZiLDB4ZjYsMHg5ZSwweDMwLDB4MDAsMHgwMCwweDAwCSMgbXVseAk0OCgkaW5wKSwgJXJheCwgJXJieAorCWFkb3gJJXJheCwgJXIxMAorCWFkY3gJJXJieCwgJXIxMQorCisJLmJ5dGUJMHhjNCwweDYyLDB4YzMsMHhmNiwweGE2LDB4MzgsMHgwMCwweDAwLDB4MDAJIyBtdWx4CTU2KCRpbnApLCAkb3V0LCAlcjEyCisJYWRveAkkb3V0LCAlcjExCisJYWRjeAklcmJwLCAlcjEyCisJYWRveAklcmJwLCAlcjEyCisKKwltb3YJJXIxMSwgJXJieAorCXNobGQJXCQxLCAlcjEwLCAlcjExCisJc2hsZAlcJDEsICVyY3gsICVyMTAKKworCXhvcgklZWJwLCAlZWJwCisJbXVseAklcmR4LCAlcmF4LCAlcmR4CisJYWRjeAklcmF4LCAlcjkKKwlhZGN4CSVyZHgsICVyMTAKKwkgbW92CTQ4KCRpbnApLCAlcmR4CisJYWRjeAklcmJwLCAlcjExCisKKwltb3YJJXI5LCA4MCglcnNwKQorCW1vdgklcjEwLCA4OCglcnNwKQorCisjc2V2ZW50aCBpdGVyYXRpb24KKwkuYnl0ZQkweGM0LDB4NjIsMHhmYiwweGY2LDB4YWUsMHgzOCwweDAwLDB4MDAsMHgwMAkjIG11bHgJNTYoJGlucCksICVyYXgsICVyMTMKKwlhZG94CSVyYXgsICVyMTIKKwlhZG94CSVyYnAsICVyMTMKKworCXhvcgklcjE0LCAlcjE0CisJc2hsZAlcJDEsICVyMTMsICVyMTQKKwlzaGxkCVwkMSwgJXIxMiwgJXIxMworCXNobGQJXCQxLCAlcmJ4LCAlcjEyCisKKwl4b3IJJWVicCwgJWVicAorCW11bHgJJXJkeCwgJXJheCwgJXJkeAorCWFkY3gJJXJheCwgJXIxMQorCWFkY3gJJXJkeCwgJXIxMgorCSBtb3YJNTYoJGlucCksICVyZHgKKwlhZGN4CSVyYnAsICVyMTMKKworCS5ieXRlCTB4NGMsMHg4OSwweDljLDB4MjQsMHg2MCwweDAwLDB4MDAsMHgwMAkJIyBtb3YJJXIxMSwgOTYoJXJzcCkKKwkuYnl0ZQkweDRjLDB4ODksMHhhNCwweDI0LDB4NjgsMHgwMCwweDAwLDB4MDAJCSMgbW92CSVyMTIsIDEwNCglcnNwKQorCisjZWlnaHRoIGl0ZXJhdGlvbgorCW11bHgJJXJkeCwgJXJheCwgJXJkeAorCWFkb3gJJXJheCwgJXIxMworCWFkb3gJJXJicCwgJXJkeAorCisJLmJ5dGUJMHg2NgorCWFkZAklcmR4LCAlcjE0CisKKwltb3ZxCSVyMTMsIDExMiglcnNwKQorCW1vdnEJJXIxNCwgMTIwKCVyc3ApCisJbW92cQkleG1tMCwgJG91dAorCW1vdnEJJXhtbTEsICVyYnAKKworCW1vdnEJMTI4KCVyc3ApLCAlcmR4CQkjIHB1bGwgJG4wCisJbW92cQkoJXJzcCksICVyOAorCW1vdnEJOCglcnNwKSwgJXI5CisJbW92cQkxNiglcnNwKSwgJXIxMAorCW1vdnEJMjQoJXJzcCksICVyMTEKKwltb3ZxCTMyKCVyc3ApLCAlcjEyCisJbW92cQk0MCglcnNwKSwgJXIxMworCW1vdnEJNDgoJXJzcCksICVyMTQKKwltb3ZxCTU2KCVyc3ApLCAlcjE1CisKKwljYWxsCV9fcnNhel81MTJfcmVkdWNleAorCisJYWRkcQk2NCglcnNwKSwgJXI4CisJYWRjcQk3MiglcnNwKSwgJXI5CisJYWRjcQk4MCglcnNwKSwgJXIxMAorCWFkY3EJODgoJXJzcCksICVyMTEKKwlhZGNxCTk2KCVyc3ApLCAlcjEyCisJYWRjcQkxMDQoJXJzcCksICVyMTMKKwlhZGNxCTExMiglcnNwKSwgJXIxNAorCWFkY3EJMTIwKCVyc3ApLCAlcjE1CisJc2JicQklcmN4LCAlcmN4CisKKwljYWxsCV9fcnNhel81MTJfc3VidHJhY3QKKworCW1vdnEJJXI4LCAlcmR4CisJbW92cQklcjksICVyYXgKKwltb3ZsCTEyOCs4KCVyc3ApLCAkdGltZXMKKwltb3ZxCSRvdXQsICRpbnAKKworCWRlY2wJJHRpbWVzCisJam56CS5Mb29wX3NxcngKKworLkxzcXJfdGFpbDoKK19fXworfQorJGNvZGUuPTw8X19fOworCisJbGVhcQkxMjgrMjQrNDgoJXJzcCksICVyYXgKKwltb3ZxCS00OCglcmF4KSwgJXIxNQorCW1vdnEJLTQwKCVyYXgpLCAlcjE0CisJbW92cQktMzIoJXJheCksICVyMTMKKwltb3ZxCS0yNCglcmF4KSwgJXIxMgorCW1vdnEJLTE2KCVyYXgpLCAlcmJwCisJbW92cQktOCglcmF4KSwgJXJieAorCWxlYXEJKCVyYXgpLCAlcnNwCisuTHNxcl9lcGlsb2d1ZToKKwlyZXQKKy5zaXplCXJzYXpfNTEyX3NxciwuLXJzYXpfNTEyX3NxcgorX19fCit9Cit7CitteSAoJG91dCwkYXAsJGJwLCRtb2QsJG4wKSA9ICgiJXJkaSIsIiVyc2kiLCIlcmR4IiwiJXJjeCIsIiVyOCIpOworJGNvZGUuPTw8X19fOworLmdsb2JsCXJzYXpfNTEyX211bAorLnR5cGUJcnNhel81MTJfbXVsLFxAZnVuY3Rpb24sNQorLmFsaWduCTMyCityc2F6XzUxMl9tdWw6CisJcHVzaAklcmJ4CisJcHVzaAklcmJwCisJcHVzaAklcjEyCisJcHVzaAklcjEzCisJcHVzaAklcjE0CisJcHVzaAklcjE1CisKKwlzdWJxCVwkMTI4KzI0LCAlcnNwCisuTG11bF9ib2R5OgorCW1vdnEJJG91dCwgJXhtbTAJCSMgb2ZmLWxvYWQgYXJndW1lbnRzCisJbW92cQkkbW9kLCAleG1tMQorCW1vdnEJJG4wLCAxMjgoJXJzcCkKK19fXworJGNvZGUuPTw8X19fIGlmICgkYWRkeCk7CisJbW92bAlcJDB4ODAxMDAsJXIxMWQKKwlhbmRsCU9QRU5TU0xfaWEzMmNhcF9QKzgoJXJpcCksJXIxMWQKKwljbXBsCVwkMHg4MDEwMCwlcjExZAkJIyBjaGVjayBmb3IgTVVMWCBhbmQgQURPL0NYCisJamUJLkxtdWx4CitfX18KKyRjb2RlLj08PF9fXzsKKwltb3ZxCSgkYnApLCAlcmJ4CQkjIHBhc3MgYlswXQorCW1vdnEJJGJwLCAlcmJwCQkjIHBhc3MgYXJndW1lbnQKKwljYWxsCV9fcnNhel81MTJfbXVsCisKKwltb3ZxCSV4bW0wLCAkb3V0CisJbW92cQkleG1tMSwgJXJicAorCisJbW92cQkoJXJzcCksICVyOAorCW1vdnEJOCglcnNwKSwgJXI5CisJbW92cQkxNiglcnNwKSwgJXIxMAorCW1vdnEJMjQoJXJzcCksICVyMTEKKwltb3ZxCTMyKCVyc3ApLCAlcjEyCisJbW92cQk0MCglcnNwKSwgJXIxMworCW1vdnEJNDgoJXJzcCksICVyMTQKKwltb3ZxCTU2KCVyc3ApLCAlcjE1CisKKwljYWxsCV9fcnNhel81MTJfcmVkdWNlCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJGFkZHgpOworCWptcAkuTG11bF90YWlsCisKKy5hbGlnbgkzMgorLkxtdWx4OgorCW1vdnEJJGJwLCAlcmJwCQkjIHBhc3MgYXJndW1lbnQKKwltb3ZxCSgkYnApLCAlcmR4CQkjIHBhc3MgYlswXQorCWNhbGwJX19yc2F6XzUxMl9tdWx4CisKKwltb3ZxCSV4bW0wLCAkb3V0CisJbW92cQkleG1tMSwgJXJicAorCisJbW92cQkxMjgoJXJzcCksICVyZHgJCSMgcHVsbCAkbjAKKwltb3ZxCSglcnNwKSwgJXI4CisJbW92cQk4KCVyc3ApLCAlcjkKKwltb3ZxCTE2KCVyc3ApLCAlcjEwCisJbW92cQkyNCglcnNwKSwgJXIxMQorCW1vdnEJMzIoJXJzcCksICVyMTIKKwltb3ZxCTQwKCVyc3ApLCAlcjEzCisJbW92cQk0OCglcnNwKSwgJXIxNAorCW1vdnEJNTYoJXJzcCksICVyMTUKKworCWNhbGwJX19yc2F6XzUxMl9yZWR1Y2V4CisuTG11bF90YWlsOgorX19fCiskY29kZS49PDxfX187CisJYWRkcQk2NCglcnNwKSwgJXI4CisJYWRjcQk3MiglcnNwKSwgJXI5CisJYWRjcQk4MCglcnNwKSwgJXIxMAorCWFkY3EJODgoJXJzcCksICVyMTEKKwlhZGNxCTk2KCVyc3ApLCAlcjEyCisJYWRjcQkxMDQoJXJzcCksICVyMTMKKwlhZGNxCTExMiglcnNwKSwgJXIxNAorCWFkY3EJMTIwKCVyc3ApLCAlcjE1CisJc2JicQklcmN4LCAlcmN4CisKKwljYWxsCV9fcnNhel81MTJfc3VidHJhY3QKKworCWxlYXEJMTI4KzI0KzQ4KCVyc3ApLCAlcmF4CisJbW92cQktNDgoJXJheCksICVyMTUKKwltb3ZxCS00MCglcmF4KSwgJXIxNAorCW1vdnEJLTMyKCVyYXgpLCAlcjEzCisJbW92cQktMjQoJXJheCksICVyMTIKKwltb3ZxCS0xNiglcmF4KSwgJXJicAorCW1vdnEJLTgoJXJheCksICVyYngKKwlsZWFxCSglcmF4KSwgJXJzcAorLkxtdWxfZXBpbG9ndWU6CisJcmV0Cisuc2l6ZQlyc2F6XzUxMl9tdWwsLi1yc2F6XzUxMl9tdWwKK19fXworfQoreworbXkgKCRvdXQsJGFwLCRicCwkbW9kLCRuMCwkcHdyKSA9ICgiJXJkaSIsIiVyc2kiLCIlcmR4IiwiJXJjeCIsIiVyOCIsIiVyOWQiKTsKKyRjb2RlLj08PF9fXzsKKy5nbG9ibAlyc2F6XzUxMl9tdWxfZ2F0aGVyNAorLnR5cGUJcnNhel81MTJfbXVsX2dhdGhlcjQsXEBmdW5jdGlvbiw2CisuYWxpZ24JMzIKK3JzYXpfNTEyX211bF9nYXRoZXI0OgorCXB1c2gJJXJieAorCXB1c2gJJXJicAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCXB1c2gJJXIxNQorCisJbW92CSRwd3IsICRwd3IKKwlzdWJxCVwkMTI4KzI0LCAlcnNwCisuTG11bF9nYXRoZXI0X2JvZHk6CitfX18KKyRjb2RlLj08PF9fXyBpZiAoJGFkZHgpOworCW1vdmwJXCQweDgwMTAwLCVyMTFkCisJYW5kbAlPUEVOU1NMX2lhMzJjYXBfUCs4KCVyaXApLCVyMTFkCisJY21wbAlcJDB4ODAxMDAsJXIxMWQJCSMgY2hlY2sgZm9yIE1VTFggYW5kIEFETy9DWAorCWplCS5MbXVseF9nYXRoZXIKK19fXworJGNvZGUuPTw8X19fOworCW1vdmwJNjQoJGJwLCRwd3IsNCksICVlYXgKKwltb3ZxCSRvdXQsICV4bW0wCQkjIG9mZi1sb2FkIGFyZ3VtZW50cworCW1vdmwJKCRicCwkcHdyLDQpLCAlZWJ4CisJbW92cQkkbW9kLCAleG1tMQorCW1vdnEJJG4wLCAxMjgoJXJzcCkKKworCXNobHEJXCQzMiwgJXJheAorCW9yCSVyYXgsICVyYngKKwltb3ZxCSgkYXApLCAlcmF4CisJIG1vdnEJOCgkYXApLCAlcmN4CisJIGxlYXEJMTI4KCRicCwkcHdyLDQpLCAlcmJwCisJbXVscQklcmJ4CQkJIyAwIGl0ZXJhdGlvbgorCW1vdnEJJXJheCwgKCVyc3ApCisJbW92cQklcmN4LCAlcmF4CisJbW92cQklcmR4LCAlcjgKKworCW11bHEJJXJieAorCSBtb3ZkCSglcmJwKSwgJXhtbTQKKwlhZGRxCSVyYXgsICVyOAorCW1vdnEJMTYoJGFwKSwgJXJheAorCW1vdnEJJXJkeCwgJXI5CisJYWRjcQlcJDAsICVyOQorCisJbXVscQklcmJ4CisJIG1vdmQJNjQoJXJicCksICV4bW01CisJYWRkcQklcmF4LCAlcjkKKwltb3ZxCTI0KCRhcCksICVyYXgKKwltb3ZxCSVyZHgsICVyMTAKKwlhZGNxCVwkMCwgJXIxMAorCisJbXVscQklcmJ4CisJIHBzbGxkcQlcJDQsICV4bW01CisJYWRkcQklcmF4LCAlcjEwCisJbW92cQkzMigkYXApLCAlcmF4CisJbW92cQklcmR4LCAlcjExCisJYWRjcQlcJDAsICVyMTEKKworCW11bHEJJXJieAorCSBwb3IJJXhtbTUsICV4bW00CisJYWRkcQklcmF4LCAlcjExCisJbW92cQk0MCgkYXApLCAlcmF4CisJbW92cQklcmR4LCAlcjEyCisJYWRjcQlcJDAsICVyMTIKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwgJXIxMgorCW1vdnEJNDgoJGFwKSwgJXJheAorCW1vdnEJJXJkeCwgJXIxMworCWFkY3EJXCQwLCAlcjEzCisKKwltdWxxCSVyYngKKwkgbGVhcQkxMjgoJXJicCksICVyYnAKKwlhZGRxCSVyYXgsICVyMTMKKwltb3ZxCTU2KCRhcCksICVyYXgKKwltb3ZxCSVyZHgsICVyMTQKKwlhZGNxCVwkMCwgJXIxNAorCQorCW11bHEJJXJieAorCSBtb3ZxCSV4bW00LCAlcmJ4CisJYWRkcQklcmF4LCAlcjE0CisJIG1vdnEJKCRhcCksICVyYXgKKwltb3ZxCSVyZHgsICVyMTUKKwlhZGNxCVwkMCwgJXIxNQorCisJbGVhcQk4KCVyc3ApLCAlcmRpCisJbW92bAlcJDcsICVlY3gKKwlqbXAJLkxvb3BfbXVsX2dhdGhlcgorCisuYWxpZ24JMzIKKy5Mb29wX211bF9nYXRoZXI6CisJbXVscQklcmJ4CisJYWRkcQklcmF4LCAlcjgKKwltb3ZxCTgoJGFwKSwgJXJheAorCW1vdnEJJXI4LCAoJXJkaSkKKwltb3ZxCSVyZHgsICVyOAorCWFkY3EJXCQwLCAlcjgKKworCW11bHEJJXJieAorCSBtb3ZkCSglcmJwKSwgJXhtbTQKKwlhZGRxCSVyYXgsICVyOQorCW1vdnEJMTYoJGFwKSwgJXJheAorCWFkY3EJXCQwLCAlcmR4CisJYWRkcQklcjksICVyOAorCW1vdnEJJXJkeCwgJXI5CisJYWRjcQlcJDAsICVyOQorCisJbXVscQklcmJ4CisJIG1vdmQJNjQoJXJicCksICV4bW01CisJYWRkcQklcmF4LCAlcjEwCisJbW92cQkyNCgkYXApLCAlcmF4CisJYWRjcQlcJDAsICVyZHgKKwlhZGRxCSVyMTAsICVyOQorCW1vdnEJJXJkeCwgJXIxMAorCWFkY3EJXCQwLCAlcjEwCisKKwltdWxxCSVyYngKKwkgcHNsbGRxCVwkNCwgJXhtbTUKKwlhZGRxCSVyYXgsICVyMTEKKwltb3ZxCTMyKCRhcCksICVyYXgKKwlhZGNxCVwkMCwgJXJkeAorCWFkZHEJJXIxMSwgJXIxMAorCW1vdnEJJXJkeCwgJXIxMQorCWFkY3EJXCQwLCAlcjExCisKKwltdWxxCSVyYngKKwkgcG9yCSV4bW01LCAleG1tNAorCWFkZHEJJXJheCwgJXIxMgorCW1vdnEJNDAoJGFwKSwgJXJheAorCWFkY3EJXCQwLCAlcmR4CisJYWRkcQklcjEyLCAlcjExCisJbW92cQklcmR4LCAlcjEyCisJYWRjcQlcJDAsICVyMTIKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwgJXIxMworCW1vdnEJNDgoJGFwKSwgJXJheAorCWFkY3EJXCQwLCAlcmR4CisJYWRkcQklcjEzLCAlcjEyCisJbW92cQklcmR4LCAlcjEzCisJYWRjcQlcJDAsICVyMTMKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwgJXIxNAorCW1vdnEJNTYoJGFwKSwgJXJheAorCWFkY3EJXCQwLCAlcmR4CisJYWRkcQklcjE0LCAlcjEzCisJbW92cQklcmR4LCAlcjE0CisJYWRjcQlcJDAsICVyMTQKKworCW11bHEJJXJieAorCSBtb3ZxCSV4bW00LCAlcmJ4CisJYWRkcQklcmF4LCAlcjE1CisJIG1vdnEJKCRhcCksICVyYXgKKwlhZGNxCVwkMCwgJXJkeAorCWFkZHEJJXIxNSwgJXIxNAorCW1vdnEJJXJkeCwgJXIxNQkKKwlhZGNxCVwkMCwgJXIxNQorCisJbGVhcQkxMjgoJXJicCksICVyYnAKKwlsZWFxCTgoJXJkaSksICVyZGkKKworCWRlY2wJJWVjeAorCWpuegkuTG9vcF9tdWxfZ2F0aGVyCisKKwltb3ZxCSVyOCwgKCVyZGkpCisJbW92cQklcjksIDgoJXJkaSkKKwltb3ZxCSVyMTAsIDE2KCVyZGkpCisJbW92cQklcjExLCAyNCglcmRpKQorCW1vdnEJJXIxMiwgMzIoJXJkaSkKKwltb3ZxCSVyMTMsIDQwKCVyZGkpCisJbW92cQklcjE0LCA0OCglcmRpKQorCW1vdnEJJXIxNSwgNTYoJXJkaSkKKworCW1vdnEJJXhtbTAsICRvdXQKKwltb3ZxCSV4bW0xLCAlcmJwCisKKwltb3ZxCSglcnNwKSwgJXI4CisJbW92cQk4KCVyc3ApLCAlcjkKKwltb3ZxCTE2KCVyc3ApLCAlcjEwCisJbW92cQkyNCglcnNwKSwgJXIxMQorCW1vdnEJMzIoJXJzcCksICVyMTIKKwltb3ZxCTQwKCVyc3ApLCAlcjEzCisJbW92cQk0OCglcnNwKSwgJXIxNAorCW1vdnEJNTYoJXJzcCksICVyMTUKKworCWNhbGwJX19yc2F6XzUxMl9yZWR1Y2UKK19fXworJGNvZGUuPTw8X19fIGlmICgkYWRkeCk7CisJam1wCS5MbXVsX2dhdGhlcl90YWlsCisKKy5hbGlnbgkzMgorLkxtdWx4X2dhdGhlcjoKKwltb3YJNjQoJGJwLCRwd3IsNCksICVlYXgKKwltb3ZxCSRvdXQsICV4bW0wCQkjIG9mZi1sb2FkIGFyZ3VtZW50cworCWxlYQkxMjgoJGJwLCRwd3IsNCksICVyYnAKKwltb3YJKCRicCwkcHdyLDQpLCAlZWR4CisJbW92cQkkbW9kLCAleG1tMQorCW1vdgkkbjAsIDEyOCglcnNwKQorCisJc2hsCVwkMzIsICVyYXgKKwlvcgklcmF4LCAlcmR4CisJbXVseAkoJGFwKSwgJXJieCwgJXI4CSMgMCBpdGVyYXRpb24KKwltb3YJJXJieCwgKCVyc3ApCisJeG9yCSVlZGksICVlZGkJCSMgY2Y9MCwgb2Y9MAorCisJbXVseAk4KCRhcCksICVyYXgsICVyOQorCSBtb3ZkCSglcmJwKSwgJXhtbTQKKworCW11bHgJMTYoJGFwKSwgJXJieCwgJXIxMAorCSBtb3ZkCTY0KCVyYnApLCAleG1tNQorCWFkY3gJJXJheCwgJXI4CisKKwltdWx4CTI0KCRhcCksICVyYXgsICVyMTEKKwkgcHNsbGRxCVwkNCwgJXhtbTUKKwlhZGN4CSVyYngsICVyOQorCisJbXVseAkzMigkYXApLCAlcmJ4LCAlcjEyCisJIHBvcgkleG1tNSwgJXhtbTQKKwlhZGN4CSVyYXgsICVyMTAKKworCW11bHgJNDAoJGFwKSwgJXJheCwgJXIxMworCWFkY3gJJXJieCwgJXIxMQorCisJbXVseAk0OCgkYXApLCAlcmJ4LCAlcjE0CisJIGxlYQkxMjgoJXJicCksICVyYnAKKwlhZGN4CSVyYXgsICVyMTIKKwkKKwltdWx4CTU2KCRhcCksICVyYXgsICVyMTUKKwkgbW92cQkleG1tNCwgJXJkeAorCWFkY3gJJXJieCwgJXIxMworCWFkY3gJJXJheCwgJXIxNAorCW1vdgklcjgsICVyYngKKwlhZGN4CSVyZGksICVyMTUJCSMgJXJkaSBpcyAwCisKKwltb3YJXCQtNywgJXJjeAorCWptcAkuTG9vcF9tdWx4X2dhdGhlcgorCisuYWxpZ24JMzIKKy5Mb29wX211bHhfZ2F0aGVyOgorCW11bHgJKCRhcCksICVyYXgsICVyOAorCWFkY3gJJXJheCwgJXJieAorCWFkb3gJJXI5LCAlcjgKKworCW11bHgJOCgkYXApLCAlcmF4LCAlcjkKKwkuYnl0ZQkweDY2LDB4MGYsMHg2ZSwweGE1LDB4MDAsMHgwMCwweDAwLDB4MDAJCSMgbW92ZAkoJXJicCksICV4bW00CisJYWRjeAklcmF4LCAlcjgKKwlhZG94CSVyMTAsICVyOQorCisJbXVseAkxNigkYXApLCAlcmF4LCAlcjEwCisJIG1vdmQJNjQoJXJicCksICV4bW01CisJIGxlYQkxMjgoJXJicCksICVyYnAKKwlhZGN4CSVyYXgsICVyOQorCWFkb3gJJXIxMSwgJXIxMAorCisJLmJ5dGUJMHhjNCwweDYyLDB4ZmIsMHhmNiwweDllLDB4MTgsMHgwMCwweDAwLDB4MDAJIyBtdWx4CTI0KCRhcCksICVyYXgsICVyMTEKKwkgcHNsbGRxCVwkNCwgJXhtbTUKKwkgcG9yCSV4bW01LCAleG1tNAorCWFkY3gJJXJheCwgJXIxMAorCWFkb3gJJXIxMiwgJXIxMQorCisJbXVseAkzMigkYXApLCAlcmF4LCAlcjEyCisJYWRjeAklcmF4LCAlcjExCisJYWRveAklcjEzLCAlcjEyCisKKwltdWx4CTQwKCRhcCksICVyYXgsICVyMTMKKwlhZGN4CSVyYXgsICVyMTIKKwlhZG94CSVyMTQsICVyMTMKKworCS5ieXRlCTB4YzQsMHg2MiwweGZiLDB4ZjYsMHhiNiwweDMwLDB4MDAsMHgwMCwweDAwCSMgbXVseAk0OCgkYXApLCAlcmF4LCAlcjE0CisJYWRjeAklcmF4LCAlcjEzCisJYWRveAklcjE1LCAlcjE0CisKKwltdWx4CTU2KCRhcCksICVyYXgsICVyMTUKKwkgbW92cQkleG1tNCwgJXJkeAorCSBtb3YJJXJieCwgNjQoJXJzcCwlcmN4LDgpCisJYWRjeAklcmF4LCAlcjE0CisJYWRveAklcmRpLCAlcjE1CisJbW92CSVyOCwgJXJieAorCWFkY3gJJXJkaSwgJXIxNQkJIyBjZj0wCisKKwlpbmMJJXJjeAkJCSMgb2Y9MAorCWpuegkuTG9vcF9tdWx4X2dhdGhlcgorCisJbW92CSVyOCwgNjQoJXJzcCkKKwltb3YJJXI5LCA2NCs4KCVyc3ApCisJbW92CSVyMTAsIDY0KzE2KCVyc3ApCisJbW92CSVyMTEsIDY0KzI0KCVyc3ApCisJbW92CSVyMTIsIDY0KzMyKCVyc3ApCisJbW92CSVyMTMsIDY0KzQwKCVyc3ApCisJbW92CSVyMTQsIDY0KzQ4KCVyc3ApCisJbW92CSVyMTUsIDY0KzU2KCVyc3ApCisKKwltb3ZxCSV4bW0wLCAkb3V0CisJbW92cQkleG1tMSwgJXJicAorCisJbW92CTEyOCglcnNwKSwgJXJkeAkJIyBwdWxsICRuMAorCW1vdgkoJXJzcCksICVyOAorCW1vdgk4KCVyc3ApLCAlcjkKKwltb3YJMTYoJXJzcCksICVyMTAKKwltb3YJMjQoJXJzcCksICVyMTEKKwltb3YJMzIoJXJzcCksICVyMTIKKwltb3YJNDAoJXJzcCksICVyMTMKKwltb3YJNDgoJXJzcCksICVyMTQKKwltb3YJNTYoJXJzcCksICVyMTUKKworCWNhbGwJX19yc2F6XzUxMl9yZWR1Y2V4CisKKy5MbXVsX2dhdGhlcl90YWlsOgorX19fCiskY29kZS49PDxfX187CisJYWRkcQk2NCglcnNwKSwgJXI4CisJYWRjcQk3MiglcnNwKSwgJXI5CisJYWRjcQk4MCglcnNwKSwgJXIxMAorCWFkY3EJODgoJXJzcCksICVyMTEKKwlhZGNxCTk2KCVyc3ApLCAlcjEyCisJYWRjcQkxMDQoJXJzcCksICVyMTMKKwlhZGNxCTExMiglcnNwKSwgJXIxNAorCWFkY3EJMTIwKCVyc3ApLCAlcjE1CisJc2JicQklcmN4LCAlcmN4CisKKwljYWxsCV9fcnNhel81MTJfc3VidHJhY3QKKworCWxlYXEJMTI4KzI0KzQ4KCVyc3ApLCAlcmF4CisJbW92cQktNDgoJXJheCksICVyMTUKKwltb3ZxCS00MCglcmF4KSwgJXIxNAorCW1vdnEJLTMyKCVyYXgpLCAlcjEzCisJbW92cQktMjQoJXJheCksICVyMTIKKwltb3ZxCS0xNiglcmF4KSwgJXJicAorCW1vdnEJLTgoJXJheCksICVyYngKKwlsZWFxCSglcmF4KSwgJXJzcAorLkxtdWxfZ2F0aGVyNF9lcGlsb2d1ZToKKwlyZXQKKy5zaXplCXJzYXpfNTEyX211bF9nYXRoZXI0LC4tcnNhel81MTJfbXVsX2dhdGhlcjQKK19fXworfQoreworbXkgKCRvdXQsJGFwLCRtb2QsJG4wLCR0YmwsJHB3cikgPSAoIiVyZGkiLCIlcnNpIiwiJXJkeCIsIiVyY3giLCIlcjgiLCIlcjlkIik7CiskY29kZS49PDxfX187CisuZ2xvYmwJcnNhel81MTJfbXVsX3NjYXR0ZXI0CisudHlwZQlyc2F6XzUxMl9tdWxfc2NhdHRlcjQsXEBmdW5jdGlvbiw2CisuYWxpZ24JMzIKK3JzYXpfNTEyX211bF9zY2F0dGVyNDoKKwlwdXNoCSVyYngKKwlwdXNoCSVyYnAKKwlwdXNoCSVyMTIKKwlwdXNoCSVyMTMKKwlwdXNoCSVyMTQKKwlwdXNoCSVyMTUKKworCW1vdgkkcHdyLCAkcHdyCisJc3VicQlcJDEyOCsyNCwgJXJzcAorLkxtdWxfc2NhdHRlcjRfYm9keToKKwlsZWFxCSgkdGJsLCRwd3IsNCksICR0YmwKKwltb3ZxCSRvdXQsICV4bW0wCQkjIG9mZi1sb2FkIGFyZ3VtZW50cworCW1vdnEJJG1vZCwgJXhtbTEKKwltb3ZxCSR0YmwsICV4bW0yCisJbW92cQkkbjAsIDEyOCglcnNwKQorCisJbW92cQkkb3V0LCAlcmJwCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJGFkZHgpOworCW1vdmwJXCQweDgwMTAwLCVyMTFkCisJYW5kbAlPUEVOU1NMX2lhMzJjYXBfUCs4KCVyaXApLCVyMTFkCisJY21wbAlcJDB4ODAxMDAsJXIxMWQJCSMgY2hlY2sgZm9yIE1VTFggYW5kIEFETy9DWAorCWplCS5MbXVseF9zY2F0dGVyCitfX18KKyRjb2RlLj08PF9fXzsKKwltb3ZxCSgkb3V0KSwlcmJ4CQkjIHBhc3MgYlswXQorCWNhbGwJX19yc2F6XzUxMl9tdWwKKworCW1vdnEJJXhtbTAsICRvdXQKKwltb3ZxCSV4bW0xLCAlcmJwCisKKwltb3ZxCSglcnNwKSwgJXI4CisJbW92cQk4KCVyc3ApLCAlcjkKKwltb3ZxCTE2KCVyc3ApLCAlcjEwCisJbW92cQkyNCglcnNwKSwgJXIxMQorCW1vdnEJMzIoJXJzcCksICVyMTIKKwltb3ZxCTQwKCVyc3ApLCAlcjEzCisJbW92cQk0OCglcnNwKSwgJXIxNAorCW1vdnEJNTYoJXJzcCksICVyMTUKKworCWNhbGwJX19yc2F6XzUxMl9yZWR1Y2UKK19fXworJGNvZGUuPTw8X19fIGlmICgkYWRkeCk7CisJam1wCS5MbXVsX3NjYXR0ZXJfdGFpbAorCQorLmFsaWduCTMyCisuTG11bHhfc2NhdHRlcjoKKwltb3ZxCSgkb3V0KSwgJXJkeAkJIyBwYXNzIGJbMF0KKwljYWxsCV9fcnNhel81MTJfbXVseAorCisJbW92cQkleG1tMCwgJG91dAorCW1vdnEJJXhtbTEsICVyYnAKKworCW1vdnEJMTI4KCVyc3ApLCAlcmR4CQkjIHB1bGwgJG4wCisJbW92cQkoJXJzcCksICVyOAorCW1vdnEJOCglcnNwKSwgJXI5CisJbW92cQkxNiglcnNwKSwgJXIxMAorCW1vdnEJMjQoJXJzcCksICVyMTEKKwltb3ZxCTMyKCVyc3ApLCAlcjEyCisJbW92cQk0MCglcnNwKSwgJXIxMworCW1vdnEJNDgoJXJzcCksICVyMTQKKwltb3ZxCTU2KCVyc3ApLCAlcjE1CisKKwljYWxsCV9fcnNhel81MTJfcmVkdWNleAorCisuTG11bF9zY2F0dGVyX3RhaWw6CitfX18KKyRjb2RlLj08PF9fXzsKKwlhZGRxCTY0KCVyc3ApLCAlcjgKKwlhZGNxCTcyKCVyc3ApLCAlcjkKKwlhZGNxCTgwKCVyc3ApLCAlcjEwCisJYWRjcQk4OCglcnNwKSwgJXIxMQorCWFkY3EJOTYoJXJzcCksICVyMTIKKwlhZGNxCTEwNCglcnNwKSwgJXIxMworCWFkY3EJMTEyKCVyc3ApLCAlcjE0CisJYWRjcQkxMjAoJXJzcCksICVyMTUKKwltb3ZxCSV4bW0yLCAkaW5wCisJc2JicQklcmN4LCAlcmN4CisKKwljYWxsCV9fcnNhel81MTJfc3VidHJhY3QKKworCW1vdmwJJXI4ZCwgNjQqMCgkaW5wKQkjIHNjYXR0ZXIKKwlzaHJxCVwkMzIsICVyOAorCW1vdmwJJXI5ZCwgNjQqMigkaW5wKQorCXNocnEJXCQzMiwgJXI5CisJbW92bAklcjEwZCwgNjQqNCgkaW5wKQorCXNocnEJXCQzMiwgJXIxMAorCW1vdmwJJXIxMWQsIDY0KjYoJGlucCkKKwlzaHJxCVwkMzIsICVyMTEKKwltb3ZsCSVyMTJkLCA2NCo4KCRpbnApCisJc2hycQlcJDMyLCAlcjEyCisJbW92bAklcjEzZCwgNjQqMTAoJGlucCkKKwlzaHJxCVwkMzIsICVyMTMKKwltb3ZsCSVyMTRkLCA2NCoxMigkaW5wKQorCXNocnEJXCQzMiwgJXIxNAorCW1vdmwJJXIxNWQsIDY0KjE0KCRpbnApCisJc2hycQlcJDMyLCAlcjE1CisJbW92bAklcjhkLCA2NCoxKCRpbnApCisJbW92bAklcjlkLCA2NCozKCRpbnApCisJbW92bAklcjEwZCwgNjQqNSgkaW5wKQorCW1vdmwJJXIxMWQsIDY0KjcoJGlucCkKKwltb3ZsCSVyMTJkLCA2NCo5KCRpbnApCisJbW92bAklcjEzZCwgNjQqMTEoJGlucCkKKwltb3ZsCSVyMTRkLCA2NCoxMygkaW5wKQorCW1vdmwJJXIxNWQsIDY0KjE1KCRpbnApCisKKwlsZWFxCTEyOCsyNCs0OCglcnNwKSwgJXJheAorCW1vdnEJLTQ4KCVyYXgpLCAlcjE1CisJbW92cQktNDAoJXJheCksICVyMTQKKwltb3ZxCS0zMiglcmF4KSwgJXIxMworCW1vdnEJLTI0KCVyYXgpLCAlcjEyCisJbW92cQktMTYoJXJheCksICVyYnAKKwltb3ZxCS04KCVyYXgpLCAlcmJ4CisJbGVhcQkoJXJheCksICVyc3AKKy5MbXVsX3NjYXR0ZXI0X2VwaWxvZ3VlOgorCXJldAorLnNpemUJcnNhel81MTJfbXVsX3NjYXR0ZXI0LC4tcnNhel81MTJfbXVsX3NjYXR0ZXI0CitfX18KK30KK3sKK215ICgkb3V0LCRpbnAsJG1vZCwkbjApID0gKCIlcmRpIiwiJXJzaSIsIiVyZHgiLCIlcmN4Iik7CiskY29kZS49PDxfX187CisuZ2xvYmwJcnNhel81MTJfbXVsX2J5X29uZQorLnR5cGUJcnNhel81MTJfbXVsX2J5X29uZSxcQGZ1bmN0aW9uLDQKKy5hbGlnbgkzMgorcnNhel81MTJfbXVsX2J5X29uZToKKwlwdXNoCSVyYngKKwlwdXNoCSVyYnAKKwlwdXNoCSVyMTIKKwlwdXNoCSVyMTMKKwlwdXNoCSVyMTQKKwlwdXNoCSVyMTUKKworCXN1YnEJXCQxMjgrMjQsICVyc3AKKy5MbXVsX2J5X29uZV9ib2R5OgorX19fCiskY29kZS49PDxfX18gaWYgKCRhZGR4KTsKKwltb3ZsCU9QRU5TU0xfaWEzMmNhcF9QKzgoJXJpcCksJWVheAorX19fCiskY29kZS49PDxfX187CisJbW92cQkkbW9kLCAlcmJwCSMgcmVhc3NpZ24gYXJndW1lbnQKKwltb3ZxCSRuMCwgMTI4KCVyc3ApCisKKwltb3ZxCSgkaW5wKSwgJXI4CisJcHhvcgkleG1tMCwgJXhtbTAKKwltb3ZxCTgoJGlucCksICVyOQorCW1vdnEJMTYoJGlucCksICVyMTAKKwltb3ZxCTI0KCRpbnApLCAlcjExCisJbW92cQkzMigkaW5wKSwgJXIxMgorCW1vdnEJNDAoJGlucCksICVyMTMKKwltb3ZxCTQ4KCRpbnApLCAlcjE0CisJbW92cQk1NigkaW5wKSwgJXIxNQorCisJbW92ZHFhCSV4bW0wLCAoJXJzcCkKKwltb3ZkcWEJJXhtbTAsIDE2KCVyc3ApCisJbW92ZHFhCSV4bW0wLCAzMiglcnNwKQorCW1vdmRxYQkleG1tMCwgNDgoJXJzcCkKKwltb3ZkcWEJJXhtbTAsIDY0KCVyc3ApCisJbW92ZHFhCSV4bW0wLCA4MCglcnNwKQorCW1vdmRxYQkleG1tMCwgOTYoJXJzcCkKK19fXworJGNvZGUuPTw8X19fIGlmICgkYWRkeCk7CisJYW5kbAlcJDB4ODAxMDAsJWVheAorCWNtcGwJXCQweDgwMTAwLCVlYXgJCSMgY2hlY2sgZm9yIE1VTFggYW5kIEFETy9DWAorCWplCS5MYnlfb25lX2NhbGx4CitfX18KKyRjb2RlLj08PF9fXzsKKwljYWxsCV9fcnNhel81MTJfcmVkdWNlCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJGFkZHgpOworCWptcAkuTGJ5X29uZV90YWlsCisuYWxpZ24JMzIKKy5MYnlfb25lX2NhbGx4OgorCW1vdnEJMTI4KCVyc3ApLCAlcmR4CQkjIHB1bGwgJG4wCisJY2FsbAlfX3JzYXpfNTEyX3JlZHVjZXgKKy5MYnlfb25lX3RhaWw6CitfX18KKyRjb2RlLj08PF9fXzsKKwltb3ZxCSVyOCwgKCRvdXQpCisJbW92cQklcjksIDgoJG91dCkKKwltb3ZxCSVyMTAsIDE2KCRvdXQpCisJbW92cQklcjExLCAyNCgkb3V0KQorCW1vdnEJJXIxMiwgMzIoJG91dCkKKwltb3ZxCSVyMTMsIDQwKCRvdXQpCisJbW92cQklcjE0LCA0OCgkb3V0KQorCW1vdnEJJXIxNSwgNTYoJG91dCkKKworCWxlYXEJMTI4KzI0KzQ4KCVyc3ApLCAlcmF4CisJbW92cQktNDgoJXJheCksICVyMTUKKwltb3ZxCS00MCglcmF4KSwgJXIxNAorCW1vdnEJLTMyKCVyYXgpLCAlcjEzCisJbW92cQktMjQoJXJheCksICVyMTIKKwltb3ZxCS0xNiglcmF4KSwgJXJicAorCW1vdnEJLTgoJXJheCksICVyYngKKwlsZWFxCSglcmF4KSwgJXJzcAorLkxtdWxfYnlfb25lX2VwaWxvZ3VlOgorCXJldAorLnNpemUJcnNhel81MTJfbXVsX2J5X29uZSwuLXJzYXpfNTEyX211bF9ieV9vbmUKK19fXworfQorewkjIF9fcnNhel81MTJfcmVkdWNlCisJIworCSMgaW5wdXQ6CSVyOC0lcjE1LCAlcmJwIC0gbW9kLCAxMjgoJXJzcCkgLSBuMAorCSMgb3V0cHV0OgklcjgtJXIxNQorCSMgY2xvYmJlcnM6CWV2ZXJ5dGhpbmcgZXhjZXB0ICVyYnAgYW5kICVyZGkKKyRjb2RlLj08PF9fXzsKKy50eXBlCV9fcnNhel81MTJfcmVkdWNlLFxAYWJpLW9tbmlwb3RlbnQKKy5hbGlnbgkzMgorX19yc2F6XzUxMl9yZWR1Y2U6CisJbW92cQklcjgsICVyYngKKwlpbXVscQkxMjgrOCglcnNwKSwgJXJieAorCW1vdnEJMCglcmJwKSwgJXJheAorCW1vdmwJXCQ4LCAlZWN4CisJam1wCS5McmVkdWN0aW9uX2xvb3AKKworLmFsaWduCTMyCisuTHJlZHVjdGlvbl9sb29wOgorCW11bHEJJXJieAorCW1vdnEJOCglcmJwKSwgJXJheAorCW5lZ3EJJXI4CisJbW92cQklcmR4LCAlcjgKKwlhZGNxCVwkMCwgJXI4CisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsICVyOQorCW1vdnEJMTYoJXJicCksICVyYXgKKwlhZGNxCVwkMCwgJXJkeAorCWFkZHEJJXI5LCAlcjgKKwltb3ZxCSVyZHgsICVyOQorCWFkY3EJXCQwLCAlcjkKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwgJXIxMAorCW1vdnEJMjQoJXJicCksICVyYXgKKwlhZGNxCVwkMCwgJXJkeAorCWFkZHEJJXIxMCwgJXI5CisJbW92cQklcmR4LCAlcjEwCisJYWRjcQlcJDAsICVyMTAKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwgJXIxMQorCW1vdnEJMzIoJXJicCksICVyYXgKKwlhZGNxCVwkMCwgJXJkeAorCWFkZHEJJXIxMSwgJXIxMAorCSBtb3ZxCTEyOCs4KCVyc3ApLCAlcnNpCisJI21vdnEJJXJkeCwgJXIxMQorCSNhZGNxCVwkMCwgJXIxMQorCWFkY3EJXCQwLCAlcmR4CisJbW92cQklcmR4LCAlcjExCisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsICVyMTIKKwltb3ZxCTQwKCVyYnApLCAlcmF4CisJYWRjcQlcJDAsICVyZHgKKwkgaW11bHEJJXI4LCAlcnNpCisJYWRkcQklcjEyLCAlcjExCisJbW92cQklcmR4LCAlcjEyCisJYWRjcQlcJDAsICVyMTIKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwgJXIxMworCW1vdnEJNDgoJXJicCksICVyYXgKKwlhZGNxCVwkMCwgJXJkeAorCWFkZHEJJXIxMywgJXIxMgorCW1vdnEJJXJkeCwgJXIxMworCWFkY3EJXCQwLCAlcjEzCisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsICVyMTQKKwltb3ZxCTU2KCVyYnApLCAlcmF4CisJYWRjcQlcJDAsICVyZHgKKwlhZGRxCSVyMTQsICVyMTMKKwltb3ZxCSVyZHgsICVyMTQKKwlhZGNxCVwkMCwgJXIxNAorCisJbXVscQklcmJ4CisJIG1vdnEJJXJzaSwgJXJieAorCWFkZHEJJXJheCwgJXIxNQorCSBtb3ZxCTAoJXJicCksICVyYXgKKwlhZGNxCVwkMCwgJXJkeAorCWFkZHEJJXIxNSwgJXIxNAorCW1vdnEJJXJkeCwgJXIxNQorCWFkY3EJXCQwLCAlcjE1CisKKwlkZWNsCSVlY3gKKwlqbmUJLkxyZWR1Y3Rpb25fbG9vcAorCisJcmV0Cisuc2l6ZQlfX3JzYXpfNTEyX3JlZHVjZSwuLV9fcnNhel81MTJfcmVkdWNlCitfX18KK30KK2lmICgkYWRkeCkgeworCSMgX19yc2F6XzUxMl9yZWR1Y2V4CisJIworCSMgaW5wdXQ6CSVyOC0lcjE1LCAlcmJwIC0gbW9kLCAxMjgoJXJzcCkgLSBuMAorCSMgb3V0cHV0OgklcjgtJXIxNQorCSMgY2xvYmJlcnM6CWV2ZXJ5dGhpbmcgZXhjZXB0ICVyYnAgYW5kICVyZGkKKyRjb2RlLj08PF9fXzsKKy50eXBlCV9fcnNhel81MTJfcmVkdWNleCxcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMzIKK19fcnNhel81MTJfcmVkdWNleDoKKwkjbW92cQkxMjgrOCglcnNwKSwgJXJkeAkJIyBwdWxsICRuMAorCWltdWxxCSVyOCwgJXJkeAorCXhvcnEJJXJzaSwgJXJzaQkJCSMgY2Y9MCxvZj0wCisJbW92bAlcJDgsICVlY3gKKwlqbXAJLkxyZWR1Y3Rpb25fbG9vcHgKKworLmFsaWduCTMyCisuTHJlZHVjdGlvbl9sb29weDoKKwltb3YJJXI4LCAlcmJ4CisJbXVseAkwKCVyYnApLCAlcmF4LCAlcjgKKwlhZGN4CSVyYngsICVyYXgKKwlhZG94CSVyOSwgJXI4CisKKwltdWx4CTgoJXJicCksICVyYXgsICVyOQorCWFkY3gJJXJheCwgJXI4CisJYWRveAklcjEwLCAlcjkKKworCW11bHgJMTYoJXJicCksICVyYngsICVyMTAKKwlhZGN4CSVyYngsICVyOQorCWFkb3gJJXIxMSwgJXIxMAorCisJbXVseAkyNCglcmJwKSwgJXJieCwgJXIxMQorCWFkY3gJJXJieCwgJXIxMAorCWFkb3gJJXIxMiwgJXIxMQorCisJLmJ5dGUJMHhjNCwweDYyLDB4ZTMsMHhmNiwweGE1LDB4MjAsMHgwMCwweDAwLDB4MDAJIyBtdWx4CTMyKCVyYnApLCAlcmJ4LCAlcjEyCisJIG1vdgklcmR4LCAlcmF4CisJIG1vdgklcjgsICVyZHgKKwlhZGN4CSVyYngsICVyMTEKKwlhZG94CSVyMTMsICVyMTIKKworCSBtdWx4CTEyOCs4KCVyc3ApLCAlcmJ4LCAlcmR4CisJIG1vdgklcmF4LCAlcmR4CisKKwltdWx4CTQwKCVyYnApLCAlcmF4LCAlcjEzCisJYWRjeAklcmF4LCAlcjEyCisJYWRveAklcjE0LCAlcjEzCisKKwkuYnl0ZQkweGM0LDB4NjIsMHhmYiwweGY2LDB4YjUsMHgzMCwweDAwLDB4MDAsMHgwMAkjIG11bHgJNDgoJXJicCksICVyYXgsICVyMTQKKwlhZGN4CSVyYXgsICVyMTMKKwlhZG94CSVyMTUsICVyMTQKKworCW11bHgJNTYoJXJicCksICVyYXgsICVyMTUKKwkgbW92CSVyYngsICVyZHgKKwlhZGN4CSVyYXgsICVyMTQKKwlhZG94CSVyc2ksICVyMTUJCQkjICVyc2kgaXMgMAorCWFkY3gJJXJzaSwgJXIxNQkJCSMgY2Y9MAorCisJZGVjbAklZWN4CQkJCSMgb2Y9MAorCWpuZQkuTHJlZHVjdGlvbl9sb29weAorCisJcmV0Cisuc2l6ZQlfX3JzYXpfNTEyX3JlZHVjZXgsLi1fX3JzYXpfNTEyX3JlZHVjZXgKK19fXworfQorewkjIF9fcnNhel81MTJfc3VidHJhY3QKKwkjIGlucHV0OiAlcjgtJXIxNSwgJXJkaSAtICRvdXQsICVyYnAgLSAkbW9kLCAlcmN4IC0gbWFzaworCSMgb3V0cHV0OgorCSMgY2xvYmJlcnM6IGV2ZXJ5dGhpbmcgYnV0ICVyZGksICVyc2kgYW5kICVyYnAKKyRjb2RlLj08PF9fXzsKKy50eXBlCV9fcnNhel81MTJfc3VidHJhY3QsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTMyCitfX3JzYXpfNTEyX3N1YnRyYWN0OgorCW1vdnEJJXI4LCAoJG91dCkKKwltb3ZxCSVyOSwgOCgkb3V0KQorCW1vdnEJJXIxMCwgMTYoJG91dCkKKwltb3ZxCSVyMTEsIDI0KCRvdXQpCisJbW92cQklcjEyLCAzMigkb3V0KQorCW1vdnEJJXIxMywgNDAoJG91dCkKKwltb3ZxCSVyMTQsIDQ4KCRvdXQpCisJbW92cQklcjE1LCA1Nigkb3V0KQorCisJbW92cQkwKCRtb2QpLCAlcjgKKwltb3ZxCTgoJG1vZCksICVyOQorCW5lZ3EJJXI4CisJbm90cQklcjkKKwlhbmRxCSVyY3gsICVyOAorCW1vdnEJMTYoJG1vZCksICVyMTAKKwlhbmRxCSVyY3gsICVyOQorCW5vdHEJJXIxMAorCW1vdnEJMjQoJG1vZCksICVyMTEKKwlhbmRxCSVyY3gsICVyMTAKKwlub3RxCSVyMTEKKwltb3ZxCTMyKCRtb2QpLCAlcjEyCisJYW5kcQklcmN4LCAlcjExCisJbm90cQklcjEyCisJbW92cQk0MCgkbW9kKSwgJXIxMworCWFuZHEJJXJjeCwgJXIxMgorCW5vdHEJJXIxMworCW1vdnEJNDgoJG1vZCksICVyMTQKKwlhbmRxCSVyY3gsICVyMTMKKwlub3RxCSVyMTQKKwltb3ZxCTU2KCRtb2QpLCAlcjE1CisJYW5kcQklcmN4LCAlcjE0CisJbm90cQklcjE1CisJYW5kcQklcmN4LCAlcjE1CisKKwlhZGRxCSgkb3V0KSwgJXI4CisJYWRjcQk4KCRvdXQpLCAlcjkKKwlhZGNxCTE2KCRvdXQpLCAlcjEwCisJYWRjcQkyNCgkb3V0KSwgJXIxMQorCWFkY3EJMzIoJG91dCksICVyMTIKKwlhZGNxCTQwKCRvdXQpLCAlcjEzCisJYWRjcQk0OCgkb3V0KSwgJXIxNAorCWFkY3EJNTYoJG91dCksICVyMTUKKworCW1vdnEJJXI4LCAoJG91dCkKKwltb3ZxCSVyOSwgOCgkb3V0KQorCW1vdnEJJXIxMCwgMTYoJG91dCkKKwltb3ZxCSVyMTEsIDI0KCRvdXQpCisJbW92cQklcjEyLCAzMigkb3V0KQorCW1vdnEJJXIxMywgNDAoJG91dCkKKwltb3ZxCSVyMTQsIDQ4KCRvdXQpCisJbW92cQklcjE1LCA1Nigkb3V0KQorCisJcmV0Cisuc2l6ZQlfX3JzYXpfNTEyX3N1YnRyYWN0LC4tX19yc2F6XzUxMl9zdWJ0cmFjdAorX19fCit9Cit7CSMgX19yc2F6XzUxMl9tdWwKKwkjCisJIyBpbnB1dDogJXJzaSAtIGFwLCAlcmJwIC0gYnAKKwkjIG91cHV0OgorCSMgY2xvYmJlcnM6IGV2ZXJ5dGhpbmcKK215ICgkYXAsJGJwKSA9ICgiJXJzaSIsIiVyYnAiKTsKKyRjb2RlLj08PF9fXzsKKy50eXBlCV9fcnNhel81MTJfbXVsLFxAYWJpLW9tbmlwb3RlbnQKKy5hbGlnbgkzMgorX19yc2F6XzUxMl9tdWw6CisJbGVhcQk4KCVyc3ApLCAlcmRpCisKKwltb3ZxCSgkYXApLCAlcmF4CisJbXVscQklcmJ4CisJbW92cQklcmF4LCAoJXJkaSkKKwltb3ZxCTgoJGFwKSwgJXJheAorCW1vdnEJJXJkeCwgJXI4CisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsICVyOAorCW1vdnEJMTYoJGFwKSwgJXJheAorCW1vdnEJJXJkeCwgJXI5CisJYWRjcQlcJDAsICVyOQorCisJbXVscQklcmJ4CisJYWRkcQklcmF4LCAlcjkKKwltb3ZxCTI0KCRhcCksICVyYXgKKwltb3ZxCSVyZHgsICVyMTAKKwlhZGNxCVwkMCwgJXIxMAorCisJbXVscQklcmJ4CisJYWRkcQklcmF4LCAlcjEwCisJbW92cQkzMigkYXApLCAlcmF4CisJbW92cQklcmR4LCAlcjExCisJYWRjcQlcJDAsICVyMTEKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwgJXIxMQorCW1vdnEJNDAoJGFwKSwgJXJheAorCW1vdnEJJXJkeCwgJXIxMgorCWFkY3EJXCQwLCAlcjEyCisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsICVyMTIKKwltb3ZxCTQ4KCRhcCksICVyYXgKKwltb3ZxCSVyZHgsICVyMTMKKwlhZGNxCVwkMCwgJXIxMworCisJbXVscQklcmJ4CisJYWRkcQklcmF4LCAlcjEzCisJbW92cQk1NigkYXApLCAlcmF4CisJbW92cQklcmR4LCAlcjE0CisJYWRjcQlcJDAsICVyMTQKKwkKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsICVyMTQKKwkgbW92cQkoJGFwKSwgJXJheAorCW1vdnEJJXJkeCwgJXIxNQorCWFkY3EJXCQwLCAlcjE1CisKKwlsZWFxCTgoJGJwKSwgJGJwCisJbGVhcQk4KCVyZGkpLCAlcmRpCisKKwltb3ZsCVwkNywgJWVjeAorCWptcAkuTG9vcF9tdWwKKworLmFsaWduCTMyCisuTG9vcF9tdWw6CisJbW92cQkoJGJwKSwgJXJieAorCW11bHEJJXJieAorCWFkZHEJJXJheCwgJXI4CisJbW92cQk4KCRhcCksICVyYXgKKwltb3ZxCSVyOCwgKCVyZGkpCisJbW92cQklcmR4LCAlcjgKKwlhZGNxCVwkMCwgJXI4CisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsICVyOQorCW1vdnEJMTYoJGFwKSwgJXJheAorCWFkY3EJXCQwLCAlcmR4CisJYWRkcQklcjksICVyOAorCW1vdnEJJXJkeCwgJXI5CisJYWRjcQlcJDAsICVyOQorCisJbXVscQklcmJ4CisJYWRkcQklcmF4LCAlcjEwCisJbW92cQkyNCgkYXApLCAlcmF4CisJYWRjcQlcJDAsICVyZHgKKwlhZGRxCSVyMTAsICVyOQorCW1vdnEJJXJkeCwgJXIxMAorCWFkY3EJXCQwLCAlcjEwCisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsICVyMTEKKwltb3ZxCTMyKCRhcCksICVyYXgKKwlhZGNxCVwkMCwgJXJkeAorCWFkZHEJJXIxMSwgJXIxMAorCW1vdnEJJXJkeCwgJXIxMQorCWFkY3EJXCQwLCAlcjExCisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsICVyMTIKKwltb3ZxCTQwKCRhcCksICVyYXgKKwlhZGNxCVwkMCwgJXJkeAorCWFkZHEJJXIxMiwgJXIxMQorCW1vdnEJJXJkeCwgJXIxMgorCWFkY3EJXCQwLCAlcjEyCisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsICVyMTMKKwltb3ZxCTQ4KCRhcCksICVyYXgKKwlhZGNxCVwkMCwgJXJkeAorCWFkZHEJJXIxMywgJXIxMgorCW1vdnEJJXJkeCwgJXIxMworCWFkY3EJXCQwLCAlcjEzCisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsICVyMTQKKwltb3ZxCTU2KCRhcCksICVyYXgKKwlhZGNxCVwkMCwgJXJkeAorCWFkZHEJJXIxNCwgJXIxMworCW1vdnEJJXJkeCwgJXIxNAorCSBsZWFxCTgoJGJwKSwgJGJwCisJYWRjcQlcJDAsICVyMTQKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwgJXIxNQorCSBtb3ZxCSgkYXApLCAlcmF4CisJYWRjcQlcJDAsICVyZHgKKwlhZGRxCSVyMTUsICVyMTQKKwltb3ZxCSVyZHgsICVyMTUJCisJYWRjcQlcJDAsICVyMTUKKworCWxlYXEJOCglcmRpKSwgJXJkaQorCisJZGVjbAklZWN4CisJam56CS5Mb29wX211bAorCisJbW92cQklcjgsICglcmRpKQorCW1vdnEJJXI5LCA4KCVyZGkpCisJbW92cQklcjEwLCAxNiglcmRpKQorCW1vdnEJJXIxMSwgMjQoJXJkaSkKKwltb3ZxCSVyMTIsIDMyKCVyZGkpCisJbW92cQklcjEzLCA0MCglcmRpKQorCW1vdnEJJXIxNCwgNDgoJXJkaSkKKwltb3ZxCSVyMTUsIDU2KCVyZGkpCisKKwlyZXQKKy5zaXplCV9fcnNhel81MTJfbXVsLC4tX19yc2F6XzUxMl9tdWwKK19fXworfQoraWYgKCRhZGR4KSB7CisJIyBfX3JzYXpfNTEyX211bHgKKwkjCisJIyBpbnB1dDogJXJzaSAtIGFwLCAlcmJwIC0gYnAKKwkjIG91cHV0OgorCSMgY2xvYmJlcnM6IGV2ZXJ5dGhpbmcKK215ICgkYXAsJGJwLCR6ZXJvKSA9ICgiJXJzaSIsIiVyYnAiLCIlcmRpIik7CiskY29kZS49PDxfX187CisudHlwZQlfX3JzYXpfNTEyX211bHgsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTMyCitfX3JzYXpfNTEyX211bHg6CisJbXVseAkoJGFwKSwgJXJieCwgJXI4CSMgaW5pdGlhbCAlcmR4IHByZWxvYWRlZCBieSBjYWxsZXIKKwltb3YJXCQtNiwgJXJjeAorCisJbXVseAk4KCRhcCksICVyYXgsICVyOQorCW1vdnEJJXJieCwgOCglcnNwKQorCisJbXVseAkxNigkYXApLCAlcmJ4LCAlcjEwCisJYWRjCSVyYXgsICVyOAorCisJbXVseAkyNCgkYXApLCAlcmF4LCAlcjExCisJYWRjCSVyYngsICVyOQorCisJbXVseAkzMigkYXApLCAlcmJ4LCAlcjEyCisJYWRjCSVyYXgsICVyMTAKKworCW11bHgJNDAoJGFwKSwgJXJheCwgJXIxMworCWFkYwklcmJ4LCAlcjExCisKKwltdWx4CTQ4KCRhcCksICVyYngsICVyMTQKKwlhZGMJJXJheCwgJXIxMgorCisJbXVseAk1NigkYXApLCAlcmF4LCAlcjE1CisJIG1vdgk4KCRicCksICVyZHgKKwlhZGMJJXJieCwgJXIxMworCWFkYwklcmF4LCAlcjE0CisJYWRjCVwkMCwgJXIxNQorCisJeG9yCSR6ZXJvLCAkemVybwkJIyBjZj0wLG9mPTAKKwlqbXAJLkxvb3BfbXVseAorCisuYWxpZ24JMzIKKy5Mb29wX211bHg6CisJbW92cQklcjgsICVyYngKKwltdWx4CSgkYXApLCAlcmF4LCAlcjgKKwlhZGN4CSVyYXgsICVyYngKKwlhZG94CSVyOSwgJXI4CisKKwltdWx4CTgoJGFwKSwgJXJheCwgJXI5CisJYWRjeAklcmF4LCAlcjgKKwlhZG94CSVyMTAsICVyOQorCisJbXVseAkxNigkYXApLCAlcmF4LCAlcjEwCisJYWRjeAklcmF4LCAlcjkKKwlhZG94CSVyMTEsICVyMTAKKworCW11bHgJMjQoJGFwKSwgJXJheCwgJXIxMQorCWFkY3gJJXJheCwgJXIxMAorCWFkb3gJJXIxMiwgJXIxMQorCisJLmJ5dGUJMHgzZSwweGM0LDB4NjIsMHhmYiwweGY2LDB4YTYsMHgyMCwweDAwLDB4MDAsMHgwMAkjIG11bHgJMzIoJGFwKSwgJXJheCwgJXIxMgorCWFkY3gJJXJheCwgJXIxMQorCWFkb3gJJXIxMywgJXIxMgorCisJbXVseAk0MCgkYXApLCAlcmF4LCAlcjEzCisJYWRjeAklcmF4LCAlcjEyCisJYWRveAklcjE0LCAlcjEzCisKKwltdWx4CTQ4KCRhcCksICVyYXgsICVyMTQKKwlhZGN4CSVyYXgsICVyMTMKKwlhZG94CSVyMTUsICVyMTQKKworCW11bHgJNTYoJGFwKSwgJXJheCwgJXIxNQorCSBtb3ZxCTY0KCRicCwlcmN4LDgpLCAlcmR4CisJIG1vdnEJJXJieCwgOCs2NC04KCVyc3AsJXJjeCw4KQorCWFkY3gJJXJheCwgJXIxNAorCWFkb3gJJHplcm8sICVyMTUKKwlhZGN4CSR6ZXJvLCAlcjE1CQkjIGNmPTAKKworCWluYwklcmN4CQkJIyBvZj0wCisJam56CS5Mb29wX211bHgKKworCW1vdnEJJXI4LCAlcmJ4CisJbXVseAkoJGFwKSwgJXJheCwgJXI4CisJYWRjeAklcmF4LCAlcmJ4CisJYWRveAklcjksICVyOAorCisJLmJ5dGUJMHhjNCwweDYyLDB4ZmIsMHhmNiwweDhlLDB4MDgsMHgwMCwweDAwLDB4MDAJIyBtdWx4CTgoJGFwKSwgJXJheCwgJXI5CisJYWRjeAklcmF4LCAlcjgKKwlhZG94CSVyMTAsICVyOQorCisJLmJ5dGUJMHhjNCwweDYyLDB4ZmIsMHhmNiwweDk2LDB4MTAsMHgwMCwweDAwLDB4MDAJIyBtdWx4CTE2KCRhcCksICVyYXgsICVyMTAKKwlhZGN4CSVyYXgsICVyOQorCWFkb3gJJXIxMSwgJXIxMAorCisJbXVseAkyNCgkYXApLCAlcmF4LCAlcjExCisJYWRjeAklcmF4LCAlcjEwCisJYWRveAklcjEyLCAlcjExCisKKwltdWx4CTMyKCRhcCksICVyYXgsICVyMTIKKwlhZGN4CSVyYXgsICVyMTEKKwlhZG94CSVyMTMsICVyMTIKKworCW11bHgJNDAoJGFwKSwgJXJheCwgJXIxMworCWFkY3gJJXJheCwgJXIxMgorCWFkb3gJJXIxNCwgJXIxMworCisJLmJ5dGUJMHhjNCwweDYyLDB4ZmIsMHhmNiwweGI2LDB4MzAsMHgwMCwweDAwLDB4MDAJIyBtdWx4CTQ4KCRhcCksICVyYXgsICVyMTQKKwlhZGN4CSVyYXgsICVyMTMKKwlhZG94CSVyMTUsICVyMTQKKworCS5ieXRlCTB4YzQsMHg2MiwweGZiLDB4ZjYsMHhiZSwweDM4LDB4MDAsMHgwMCwweDAwCSMgbXVseAk1NigkYXApLCAlcmF4LCAlcjE1CisJYWRjeAklcmF4LCAlcjE0CisJYWRveAkkemVybywgJXIxNQorCWFkY3gJJHplcm8sICVyMTUKKworCW1vdgklcmJ4LCA4KzY0LTgoJXJzcCkKKwltb3YJJXI4LCA4KzY0KCVyc3ApCisJbW92CSVyOSwgOCs2NCs4KCVyc3ApCisJbW92CSVyMTAsIDgrNjQrMTYoJXJzcCkKKwltb3YJJXIxMSwgOCs2NCsyNCglcnNwKQorCW1vdgklcjEyLCA4KzY0KzMyKCVyc3ApCisJbW92CSVyMTMsIDgrNjQrNDAoJXJzcCkKKwltb3YJJXIxNCwgOCs2NCs0OCglcnNwKQorCW1vdgklcjE1LCA4KzY0KzU2KCVyc3ApCisKKwlyZXQKKy5zaXplCV9fcnNhel81MTJfbXVseCwuLV9fcnNhel81MTJfbXVseAorX19fCit9Cit7CitteSAoJG91dCwkaW5wLCRwb3dlcik9ICR3aW42NCA/ICgiJXJjeCIsIiVyZHgiLCIlcjhkIikgOiAoIiVyZGkiLCIlcnNpIiwiJWVkeCIpOworJGNvZGUuPTw8X19fOworLmdsb2JsCXJzYXpfNTEyX3NjYXR0ZXI0CisudHlwZQlyc2F6XzUxMl9zY2F0dGVyNCxcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMTYKK3JzYXpfNTEyX3NjYXR0ZXI0OgorCWxlYXEJKCRvdXQsJHBvd2VyLDQpLCAkb3V0CisJbW92bAlcJDgsICVyOWQKKwlqbXAJLkxvb3Bfc2NhdHRlcgorLmFsaWduCTE2CisuTG9vcF9zY2F0dGVyOgorCW1vdnEJKCRpbnApLCAlcmF4CisJbGVhcQk4KCRpbnApLCAkaW5wCisJbW92bAklZWF4LCAoJG91dCkKKwlzaHJxCVwkMzIsICVyYXgKKwltb3ZsCSVlYXgsIDY0KCRvdXQpCisJbGVhcQkxMjgoJG91dCksICRvdXQKKwlkZWNsCSVyOWQKKwlqbnoJLkxvb3Bfc2NhdHRlcgorCXJldAorLnNpemUJcnNhel81MTJfc2NhdHRlcjQsLi1yc2F6XzUxMl9zY2F0dGVyNAorCisuZ2xvYmwJcnNhel81MTJfZ2F0aGVyNAorLnR5cGUJcnNhel81MTJfZ2F0aGVyNCxcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMTYKK3JzYXpfNTEyX2dhdGhlcjQ6CisJbGVhcQkoJGlucCwkcG93ZXIsNCksICRpbnAKKwltb3ZsCVwkOCwgJXI5ZAorCWptcAkuTG9vcF9nYXRoZXIKKy5hbGlnbgkxNgorLkxvb3BfZ2F0aGVyOgorCW1vdmwJKCRpbnApLCAlZWF4CisJbW92bAk2NCgkaW5wKSwgJXI4ZAorCWxlYXEJMTI4KCRpbnApLCAkaW5wCisJc2hscQlcJDMyLCAlcjgKKwlvcgklcjgsICVyYXgKKwltb3ZxCSVyYXgsICgkb3V0KQorCWxlYXEJOCgkb3V0KSwgJG91dAorCWRlY2wJJXI5ZAorCWpuegkuTG9vcF9nYXRoZXIKKwlyZXQKKy5zaXplCXJzYXpfNTEyX2dhdGhlcjQsLi1yc2F6XzUxMl9nYXRoZXI0CitfX18KK30KKworIyBFWENFUFRJT05fRElTUE9TSVRJT04gaGFuZGxlciAoRVhDRVBUSU9OX1JFQ09SRCAqcmVjLFVMT05HNjQgZnJhbWUsCisjCQlDT05URVhUICpjb250ZXh0LERJU1BBVENIRVJfQ09OVEVYVCAqZGlzcCkKK2lmICgkd2luNjQpIHsKKyRyZWM9IiVyY3giOworJGZyYW1lPSIlcmR4IjsKKyRjb250ZXh0PSIlcjgiOworJGRpc3A9IiVyOSI7CisKKyRjb2RlLj08PF9fXzsKKy5leHRlcm4JX19pbXBfUnRsVmlydHVhbFVud2luZAorLnR5cGUJc2VfaGFuZGxlcixcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMTYKK3NlX2hhbmRsZXI6CisJcHVzaAklcnNpCisJcHVzaAklcmRpCisJcHVzaAklcmJ4CisJcHVzaAklcmJwCisJcHVzaAklcjEyCisJcHVzaAklcjEzCisJcHVzaAklcjE0CisJcHVzaAklcjE1CisJcHVzaGZxCisJc3ViCVwkNjQsJXJzcAorCisJbW92CTEyMCgkY29udGV4dCksJXJheAkjIHB1bGwgY29udGV4dC0+UmF4CisJbW92CTI0OCgkY29udGV4dCksJXJieAkjIHB1bGwgY29udGV4dC0+UmlwCisKKwltb3YJOCgkZGlzcCksJXJzaQkJIyBkaXNwLT5JbWFnZUJhc2UKKwltb3YJNTYoJGRpc3ApLCVyMTEJCSMgZGlzcC0+SGFuZGxlckRhdGEKKworCW1vdgkwKCVyMTEpLCVyMTBkCQkjIEhhbmRsZXJEYXRhWzBdCisJbGVhCSglcnNpLCVyMTApLCVyMTAJIyBlbmQgb2YgcHJvbG9ndWUgbGFiZWwKKwljbXAJJXIxMCwlcmJ4CQkjIGNvbnRleHQtPlJpcDxlbmQgb2YgcHJvbG9ndWUgbGFiZWwKKwlqYgkuTGNvbW1vbl9zZWhfdGFpbAorCisJbW92CTE1MigkY29udGV4dCksJXJheAkjIHB1bGwgY29udGV4dC0+UnNwCisKKwltb3YJNCglcjExKSwlcjEwZAkJIyBIYW5kbGVyRGF0YVsxXQorCWxlYQkoJXJzaSwlcjEwKSwlcjEwCSMgZXBpbG9ndWUgbGFiZWwKKwljbXAJJXIxMCwlcmJ4CQkjIGNvbnRleHQtPlJpcD49ZXBpbG9ndWUgbGFiZWwKKwlqYWUJLkxjb21tb25fc2VoX3RhaWwKKworCWxlYQkxMjgrMjQrNDgoJXJheCksJXJheAorCisJbW92CS04KCVyYXgpLCVyYngKKwltb3YJLTE2KCVyYXgpLCVyYnAKKwltb3YJLTI0KCVyYXgpLCVyMTIKKwltb3YJLTMyKCVyYXgpLCVyMTMKKwltb3YJLTQwKCVyYXgpLCVyMTQKKwltb3YJLTQ4KCVyYXgpLCVyMTUKKwltb3YJJXJieCwxNDQoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SYngKKwltb3YJJXJicCwxNjAoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SYnAKKwltb3YJJXIxMiwyMTYoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SMTIKKwltb3YJJXIxMywyMjQoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SMTMKKwltb3YJJXIxNCwyMzIoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SMTQKKwltb3YJJXIxNSwyNDAoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SMTUKKworLkxjb21tb25fc2VoX3RhaWw6CisJbW92CTgoJXJheCksJXJkaQorCW1vdgkxNiglcmF4KSwlcnNpCisJbW92CSVyYXgsMTUyKCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UnNwCisJbW92CSVyc2ksMTY4KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UnNpCisJbW92CSVyZGksMTc2KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UmRpCisKKwltb3YJNDAoJGRpc3ApLCVyZGkJCSMgZGlzcC0+Q29udGV4dFJlY29yZAorCW1vdgkkY29udGV4dCwlcnNpCQkjIGNvbnRleHQKKwltb3YJXCQxNTQsJWVjeAkJIyBzaXplb2YoQ09OVEVYVCkKKwkubG9uZwkweGE1NDhmM2ZjCQkjIGNsZDsgcmVwIG1vdnNxCisKKwltb3YJJGRpc3AsJXJzaQorCXhvcgklcmN4LCVyY3gJCSMgYXJnMSwgVU5XX0ZMQUdfTkhBTkRMRVIKKwltb3YJOCglcnNpKSwlcmR4CQkjIGFyZzIsIGRpc3AtPkltYWdlQmFzZQorCW1vdgkwKCVyc2kpLCVyOAkJIyBhcmczLCBkaXNwLT5Db250cm9sUGMKKwltb3YJMTYoJXJzaSksJXI5CQkjIGFyZzQsIGRpc3AtPkZ1bmN0aW9uRW50cnkKKwltb3YJNDAoJXJzaSksJXIxMAkJIyBkaXNwLT5Db250ZXh0UmVjb3JkCisJbGVhCTU2KCVyc2kpLCVyMTEJCSMgJmRpc3AtPkhhbmRsZXJEYXRhCisJbGVhCTI0KCVyc2kpLCVyMTIJCSMgJmRpc3AtPkVzdGFibGlzaGVyRnJhbWUKKwltb3YJJXIxMCwzMiglcnNwKQkJIyBhcmc1CisJbW92CSVyMTEsNDAoJXJzcCkJCSMgYXJnNgorCW1vdgklcjEyLDQ4KCVyc3ApCQkjIGFyZzcKKwltb3YJJXJjeCw1NiglcnNwKQkJIyBhcmc4LCAoTlVMTCkKKwljYWxsCSpfX2ltcF9SdGxWaXJ0dWFsVW53aW5kKCVyaXApCisKKwltb3YJXCQxLCVlYXgJCSMgRXhjZXB0aW9uQ29udGludWVTZWFyY2gKKwlhZGQJXCQ2NCwlcnNwCisJcG9wZnEKKwlwb3AJJXIxNQorCXBvcAklcjE0CisJcG9wCSVyMTMKKwlwb3AJJXIxMgorCXBvcAklcmJwCisJcG9wCSVyYngKKwlwb3AJJXJkaQorCXBvcAklcnNpCisJcmV0Cisuc2l6ZQlzcXJfaGFuZGxlciwuLXNxcl9oYW5kbGVyCisKKy5zZWN0aW9uCS5wZGF0YQorLmFsaWduCTQKKwkucnZhCS5MU0VIX2JlZ2luX3JzYXpfNTEyX3NxcgorCS5ydmEJLkxTRUhfZW5kX3JzYXpfNTEyX3NxcgorCS5ydmEJLkxTRUhfaW5mb19yc2F6XzUxMl9zcXIKKworCS5ydmEJLkxTRUhfYmVnaW5fcnNhel81MTJfbXVsCisJLnJ2YQkuTFNFSF9lbmRfcnNhel81MTJfbXVsCisJLnJ2YQkuTFNFSF9pbmZvX3JzYXpfNTEyX211bAorCisJLnJ2YQkuTFNFSF9iZWdpbl9yc2F6XzUxMl9tdWxfZ2F0aGVyNAorCS5ydmEJLkxTRUhfZW5kX3JzYXpfNTEyX211bF9nYXRoZXI0CisJLnJ2YQkuTFNFSF9pbmZvX3JzYXpfNTEyX211bF9nYXRoZXI0CisKKwkucnZhCS5MU0VIX2JlZ2luX3JzYXpfNTEyX211bF9zY2F0dGVyNAorCS5ydmEJLkxTRUhfZW5kX3JzYXpfNTEyX211bF9zY2F0dGVyNAorCS5ydmEJLkxTRUhfaW5mb19yc2F6XzUxMl9tdWxfc2NhdHRlcjQKKworCS5ydmEJLkxTRUhfYmVnaW5fcnNhel81MTJfbXVsX2J5X29uZQorCS5ydmEJLkxTRUhfZW5kX3JzYXpfNTEyX211bF9ieV9vbmUKKwkucnZhCS5MU0VIX2luZm9fcnNhel81MTJfbXVsX2J5X29uZQorCisuc2VjdGlvbgkueGRhdGEKKy5hbGlnbgk4CisuTFNFSF9pbmZvX3JzYXpfNTEyX3NxcjoKKwkuYnl0ZQk5LDAsMCwwCisJLnJ2YQlzZV9oYW5kbGVyCisJLnJ2YQkuTHNxcl9ib2R5LC5Mc3FyX2VwaWxvZ3VlCQkJIyBIYW5kbGVyRGF0YVtdCisuTFNFSF9pbmZvX3JzYXpfNTEyX211bDoKKwkuYnl0ZQk5LDAsMCwwCisJLnJ2YQlzZV9oYW5kbGVyCisJLnJ2YQkuTG11bF9ib2R5LC5MbXVsX2VwaWxvZ3VlCQkJIyBIYW5kbGVyRGF0YVtdCisuTFNFSF9pbmZvX3JzYXpfNTEyX211bF9nYXRoZXI0OgorCS5ieXRlCTksMCwwLDAKKwkucnZhCXNlX2hhbmRsZXIKKwkucnZhCS5MbXVsX2dhdGhlcjRfYm9keSwuTG11bF9nYXRoZXI0X2VwaWxvZ3VlCSMgSGFuZGxlckRhdGFbXQorLkxTRUhfaW5mb19yc2F6XzUxMl9tdWxfc2NhdHRlcjQ6CisJLmJ5dGUJOSwwLDAsMAorCS5ydmEJc2VfaGFuZGxlcgorCS5ydmEJLkxtdWxfc2NhdHRlcjRfYm9keSwuTG11bF9zY2F0dGVyNF9lcGlsb2d1ZQkjIEhhbmRsZXJEYXRhW10KKy5MU0VIX2luZm9fcnNhel81MTJfbXVsX2J5X29uZToKKwkuYnl0ZQk5LDAsMCwwCisJLnJ2YQlzZV9oYW5kbGVyCisJLnJ2YQkuTG11bF9ieV9vbmVfYm9keSwuTG11bF9ieV9vbmVfZXBpbG9ndWUJCSMgSGFuZGxlckRhdGFbXQorX19fCit9CisKKyRjb2RlID1+IHMvXGAoW15cYF0qKVxgL2V2YWwgJDEvZ2VtOworcHJpbnQgJGNvZGU7CitjbG9zZSBTVERPVVQ7CmRpZmYgLS1naXQgYS9jcnlwdG8vYm4vYXNtL3g4Ni1tb250LnBsIGIvY3J5cHRvL2JuL2FzbS94ODYtbW9udC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGY2YjA1Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2JuL2FzbS94ODYtbW9udC5wbApAQCAtMCwwICsxLDU5MyBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFdyaXR0ZW4gYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+IGZvciB0aGUgT3BlblNTTAorIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCisjIENSWVBUT0dBTVMgbGljZW5zZXMgZGVwZW5kaW5nIG9uIHdoZXJlIHlvdSBvYnRhaW4gaXQuIEZvciBmdXJ0aGVyCisjIGRldGFpbHMgc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvfmFwcHJvL2NyeXB0b2dhbXMvLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjIE9jdG9iZXIgMjAwNQorIworIyBUaGlzIGlzIGEgInRlYXNlciIgY29kZSwgYXMgaXQgY2FuIGJlIGltcHJvdmVkIGluIHNldmVyYWwgd2F5cy4uLgorIyBGaXJzdCBvZiBhbGwgbm9uLVNTRTIgcGF0aCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgKHllcywgZm9yIG5vdyBpdAorIyBwZXJmb3JtcyBNb250Z29tZXJ5IG11bHRpcGxpY2F0aW9uL2NvbnZvbHV0aW9uIG9ubHkgb24gU1NFMi1jYXBhYmxlCisjIENQVXMgc3VjaCBhcyBQNCwgb3RoZXJzIGZhbGwgZG93biB0byBvcmlnaW5hbCBjb2RlKS4gVGhlbiBpbm5lciBsb29wCisjIGNhbiBiZSB1bnJvbGxlZCBhbmQgbW9kdWxvLXNjaGVkdWxlZCB0byBpbXByb3ZlIElMUCBhbmQgcG9zc2libHkKKyMgbW92ZWQgdG8gMTI4LWJpdCBYTU0gcmVnaXN0ZXIgYmFuayAodGhvdWdoIGl0IHdvdWxkIHJlcXVpcmUgaW5wdXQKKyMgcmVhcnJhbmdlbWVudCBhbmQvb3IgaW5jcmVhc2UgYnVzIGJhbmR3aWR0aCB1dGlsaXphdGlvbikuIERlZGljYXRlZAorIyBzcXVhcmluZyBwcm9jZWR1cmUgc2hvdWxkIGdpdmUgZnVydGhlciBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudC4uLgorIyBZZXQsIGZvciBiZWluZyBkcmFmdCwgdGhlIGNvZGUgaW1wcm92ZXMgcnNhNTEyICpzaWduKiBiZW5jaG1hcmsgYnkKKyMgMTEwJSghKSwgcnNhMTAyNCBvbmUgLSBieSA3MCUgYW5kIHJzYTQwOTYgLSBieSAyMCU6LSkKKworIyBEZWNlbWJlciAyMDA2CisjCisjIE1vZHVsby1zY2hlZHVsaW5nIFNTRTIgbG9vcHMgcmVzdWx0cyBpbiBmdXJ0aGVyIDE1LTIwJSBpbXByb3ZlbWVudC4KKyMgSW50ZWdlci1vbmx5IGNvZGUgW2JlaW5nIGVxdWlwcGVkIHdpdGggZGVkaWNhdGVkIHNxdWFyaW5nIHByb2NlZHVyZV0KKyMgZ2l2ZXMgfjQwJSBvbiByc2E1MTIgc2lnbiBiZW5jaG1hcmsuLi4KKworJDAgPX4gbS8oLipbXC9cXF0pW15cL1xcXSskLzsgJGRpcj0kMTsKK3B1c2goQElOQywiJHtkaXJ9IiwiJHtkaXJ9Li4vLi4vcGVybGFzbSIpOworcmVxdWlyZSAieDg2YXNtLnBsIjsKKworJmFzbV9pbml0KCRBUkdWWzBdLCQwKTsKKworJHNzZTI9MDsKK2ZvciAoQEFSR1YpIHsgJHNzZTI9MSBpZiAoLy1ET1BFTlNTTF9JQTMyX1NTRTIvKTsgfQorCismZXh0ZXJuYWxfbGFiZWwoIk9QRU5TU0xfaWEzMmNhcF9QIikgaWYgKCRzc2UyKTsKKworJmZ1bmN0aW9uX2JlZ2luKCJibl9tdWxfbW9udCIpOworCiskaT0iZWR4IjsKKyRqPSJlY3giOworJGFwPSJlc2kiOwkkdHA9ImVzaSI7CQkjIG92ZXJsYXBwaW5nIHZhcmlhYmxlcyEhIQorJHJwPSJlZGkiOwkkYnA9ImVkaSI7CQkjIG92ZXJsYXBwaW5nIHZhcmlhYmxlcyEhIQorJG5wPSJlYnAiOworJG51bT0iZWJ4IjsKKworJF9udW09JkRXUCg0KjAsImVzcCIpOwkJCSMgc3RhY2sgdG9wIGxheW91dAorJF9ycD0mRFdQKDQqMSwiZXNwIik7CiskX2FwPSZEV1AoNCoyLCJlc3AiKTsKKyRfYnA9JkRXUCg0KjMsImVzcCIpOworJF9ucD0mRFdQKDQqNCwiZXNwIik7CiskX24wPSZEV1AoNCo1LCJlc3AiKTsJJF9uMHE9JlFXUCg0KjUsImVzcCIpOworJF9zcD0mRFdQKDQqNiwiZXNwIik7CiskX2JwZW5kPSZEV1AoNCo3LCJlc3AiKTsKKyRmcmFtZT0zMjsJCQkJIyBzaXplIG9mIGFib3ZlIGZyYW1lIHJvdW5kZWQgdXAgdG8gMTZuCisKKwkmeG9yCSgiZWF4IiwiZWF4Iik7CisJJm1vdgkoImVkaSIsJndwYXJhbSg1KSk7CSMgaW50IG51bQorCSZjbXAJKCJlZGkiLDQpOworCSZqbAkoJmxhYmVsKCJqdXN0X2xlYXZlIikpOworCisJJmxlYQkoImVzaSIsJndwYXJhbSgwKSk7CSMgcHV0IGFzaWRlIHBvaW50ZXIgdG8gYXJndW1lbnQgYmxvY2sKKwkmbGVhCSgiZWR4Iiwmd3BhcmFtKDEpKTsJIyBsb2FkIGFwCisJJm1vdgkoImVicCIsImVzcCIpOwkJIyBzYXZlZCBzdGFjayBwb2ludGVyIQorCSZhZGQJKCJlZGkiLDIpOwkJIyBleHRyYSB0d28gd29yZHMgb24gdG9wIG9mIHRwCisJJm5lZwkoImVkaSIpOworCSZsZWEJKCJlc3AiLCZEV1AoLSRmcmFtZSwiZXNwIiwiZWRpIiw0KSk7CSMgYWxsb2NhKCRmcmFtZSs0KihudW0rMikpCisJJm5lZwkoImVkaSIpOworCisJIyBtaW5pbWl6ZSBjYWNoZSBjb250ZW50aW9uIGJ5IGFycmFuaW5nIDJLIHdpbmRvdyBiZXR3ZWVuIHN0YWNrCisJIyBwb2ludGVyIGFuZCBhcCBhcmd1bWVudCBbbnAgaXMgYWxzbyBwb3NpdGlvbiBzZW5zaXRpdmUgdmVjdG9yLAorCSMgYnV0IGl0J3MgYXNzdW1lZCB0byBiZSBuZWFyIGFwLCBhcyBpdCdzIGFsbG9jYXRlZCBhdCB+c2FtZQorCSMgdGltZV0uCisJJm1vdgkoImVheCIsImVzcCIpOworCSZzdWIJKCJlYXgiLCJlZHgiKTsKKwkmYW5kCSgiZWF4IiwyMDQ3KTsKKwkmc3ViCSgiZXNwIiwiZWF4Iik7CQkjIHRoaXMgYWxpZ25zIHNwIGFuZCBhcCBtb2R1bG8gMjA0OAorCisJJnhvcgkoImVkeCIsImVzcCIpOworCSZhbmQJKCJlZHgiLDIwNDgpOworCSZ4b3IJKCJlZHgiLDIwNDgpOworCSZzdWIJKCJlc3AiLCJlZHgiKTsJCSMgdGhpcyBzcGxpdHMgdGhlbSBhcGFydCBtb2R1bG8gNDA5NgorCisJJmFuZAkoImVzcCIsLTY0KTsJCSMgYWxpZ24gdG8gY2FjaGUgbGluZQorCisJIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIGxvYWQgYXJndW1lbnQgYmxvY2suLi4KKwkmbW92CSgiZWF4IiwmRFdQKDAqNCwiZXNpIikpOyMgQk5fVUxPTkcgKnJwCisJJm1vdgkoImVieCIsJkRXUCgxKjQsImVzaSIpKTsjIGNvbnN0IEJOX1VMT05HICphcAorCSZtb3YJKCJlY3giLCZEV1AoMio0LCJlc2kiKSk7IyBjb25zdCBCTl9VTE9ORyAqYnAKKwkmbW92CSgiZWR4IiwmRFdQKDMqNCwiZXNpIikpOyMgY29uc3QgQk5fVUxPTkcgKm5wCisJJm1vdgkoImVzaSIsJkRXUCg0KjQsImVzaSIpKTsjIGNvbnN0IEJOX1VMT05HICpuMAorCSMmbW92CSgiZWRpIiwmRFdQKDUqNCwiZXNpIikpOyMgaW50IG51bQorCisJJm1vdgkoImVzaSIsJkRXUCgwLCJlc2kiKSk7CSMgcHVsbCBuMFswXQorCSZtb3YJKCRfcnAsImVheCIpOwkJIyAuLi4gc2F2ZSBhIGNvcHkgb2YgYXJndW1lbnQgYmxvY2sKKwkmbW92CSgkX2FwLCJlYngiKTsKKwkmbW92CSgkX2JwLCJlY3giKTsKKwkmbW92CSgkX25wLCJlZHgiKTsKKwkmbW92CSgkX24wLCJlc2kiKTsKKwkmbGVhCSgkbnVtLCZEV1AoLTMsImVkaSIpKTsJIyBudW09bnVtLTEgdG8gYXNzaXN0IG1vZHVsby1zY2hlZHVsaW5nCisJIyZtb3YJKCRfbnVtLCRudW0pOwkJIyByZWR1bmRhbnQgYXMgJG51bSBpcyBub3QgcmV1c2VkCisJJm1vdgkoJF9zcCwiZWJwIik7CQkjIHNhdmVkIHN0YWNrIHBvaW50ZXIhCisMCitpZigkc3NlMikgeworJGFjYzA9Im1tMCI7CSMgbW14IHJlZ2lzdGVyIGJhbmsgbGF5b3V0CiskYWNjMT0ibW0xIjsKKyRjYXIwPSJtbTIiOworJGNhcjE9Im1tMyI7CiskbXVsMD0ibW00IjsKKyRtdWwxPSJtbTUiOworJHRlbXA9Im1tNiI7CiskbWFzaz0ibW03IjsKKworCSZwaWNtZXVwKCJlYXgiLCJPUEVOU1NMX2lhMzJjYXBfUCIpOworCSZidAkoJkRXUCgwLCJlYXgiKSwyNik7CisJJmpuYwkoJmxhYmVsKCJub25fc3NlMiIpKTsKKworCSZtb3YJKCJlYXgiLC0xKTsKKwkmbW92ZAkoJG1hc2ssImVheCIpOwkJIyBtYXNrIDMyIGxvd2VyIGJpdHMKKworCSZtb3YJKCRhcCwkX2FwKTsJCSMgbG9hZCBpbnB1dCBwb2ludGVycworCSZtb3YJKCRicCwkX2JwKTsKKwkmbW92CSgkbnAsJF9ucCk7CisKKwkmeG9yCSgkaSwkaSk7CQkjIGk9MAorCSZ4b3IJKCRqLCRqKTsJCSMgaj0wCisKKwkmbW92ZAkoJG11bDAsJkRXUCgwLCRicCkpOwkJIyBicFswXQorCSZtb3ZkCSgkbXVsMSwmRFdQKDAsJGFwKSk7CQkjIGFwWzBdCisJJm1vdmQJKCRjYXIxLCZEV1AoMCwkbnApKTsJCSMgbnBbMF0KKworCSZwbXVsdWRxKCRtdWwxLCRtdWwwKTsJCQkjIGFwWzBdKmJwWzBdCisJJm1vdnEJKCRjYXIwLCRtdWwxKTsKKwkmbW92cQkoJGFjYzAsJG11bDEpOwkJCSMgSSB3aXNoIG1vdmQgd29ya2VkIGZvcgorCSZwYW5kCSgkYWNjMCwkbWFzayk7CQkJIyBpbnRlci1yZWdpc3RlciB0cmFuc2ZlcnMKKworCSZwbXVsdWRxKCRtdWwxLCRfbjBxKTsJCQkjICo9bjAKKworCSZwbXVsdWRxKCRjYXIxLCRtdWwxKTsJCQkjICJ0WzBdIipucFswXSpuMAorCSZwYWRkcQkoJGNhcjEsJGFjYzApOworCisJJm1vdmQJKCRhY2MxLCZEV1AoNCwkbnApKTsJCSMgbnBbMV0KKwkmbW92ZAkoJGFjYzAsJkRXUCg0LCRhcCkpOwkJIyBhcFsxXQorCisJJnBzcmxxCSgkY2FyMCwzMik7CisJJnBzcmxxCSgkY2FyMSwzMik7CisKKwkmaW5jCSgkaik7CQkJCSMgaisrCismc2V0X2xhYmVsKCIxc3QiLDE2KTsKKwkmcG11bHVkcSgkYWNjMCwkbXVsMCk7CQkJIyBhcFtqXSpicFswXQorCSZwbXVsdWRxKCRhY2MxLCRtdWwxKTsJCQkjIG5wW2pdKm0xCisJJnBhZGRxCSgkY2FyMCwkYWNjMCk7CQkJIyArPWMwCisJJnBhZGRxCSgkY2FyMSwkYWNjMSk7CQkJIyArPWMxCisKKwkmbW92cQkoJGFjYzAsJGNhcjApOworCSZwYW5kCSgkYWNjMCwkbWFzayk7CisJJm1vdmQJKCRhY2MxLCZEV1AoNCwkbnAsJGosNCkpOwkjIG5wW2orMV0KKwkmcGFkZHEJKCRjYXIxLCRhY2MwKTsJCQkjICs9YXBbal0qYnBbMF07CisJJm1vdmQJKCRhY2MwLCZEV1AoNCwkYXAsJGosNCkpOwkjIGFwW2orMV0KKwkmcHNybHEJKCRjYXIwLDMyKTsKKwkmbW92ZAkoJkRXUCgkZnJhbWUtNCwiZXNwIiwkaiw0KSwkY2FyMSk7CSMgdHBbai0xXT0KKwkmcHNybHEJKCRjYXIxLDMyKTsKKworCSZsZWEJKCRqLCZEV1AoMSwkaikpOworCSZjbXAJKCRqLCRudW0pOworCSZqbAkoJmxhYmVsKCIxc3QiKSk7CisKKwkmcG11bHVkcSgkYWNjMCwkbXVsMCk7CQkJIyBhcFtudW0tMV0qYnBbMF0KKwkmcG11bHVkcSgkYWNjMSwkbXVsMSk7CQkJIyBucFtudW0tMV0qbTEKKwkmcGFkZHEJKCRjYXIwLCRhY2MwKTsJCQkjICs9YzAKKwkmcGFkZHEJKCRjYXIxLCRhY2MxKTsJCQkjICs9YzEKKworCSZtb3ZxCSgkYWNjMCwkY2FyMCk7CisJJnBhbmQJKCRhY2MwLCRtYXNrKTsKKwkmcGFkZHEJKCRjYXIxLCRhY2MwKTsJCQkjICs9YXBbbnVtLTFdKmJwWzBdOworCSZtb3ZkCSgmRFdQKCRmcmFtZS00LCJlc3AiLCRqLDQpLCRjYXIxKTsJIyB0cFtudW0tMl09CisKKwkmcHNybHEJKCRjYXIwLDMyKTsKKwkmcHNybHEJKCRjYXIxLDMyKTsKKworCSZwYWRkcQkoJGNhcjEsJGNhcjApOworCSZtb3ZxCSgmUVdQKCRmcmFtZSwiZXNwIiwkbnVtLDQpLCRjYXIxKTsJIyB0cFtudW1dLnRwW251bS0xXQorDAorCSZpbmMJKCRpKTsJCQkJIyBpKysKKyZzZXRfbGFiZWwoIm91dGVyIik7CisJJnhvcgkoJGosJGopOwkJCSMgaj0wCisKKwkmbW92ZAkoJG11bDAsJkRXUCgwLCRicCwkaSw0KSk7CSMgYnBbaV0KKwkmbW92ZAkoJG11bDEsJkRXUCgwLCRhcCkpOwkJIyBhcFswXQorCSZtb3ZkCSgkdGVtcCwmRFdQKCRmcmFtZSwiZXNwIikpOwkjIHRwWzBdCisJJm1vdmQJKCRjYXIxLCZEV1AoMCwkbnApKTsJCSMgbnBbMF0KKwkmcG11bHVkcSgkbXVsMSwkbXVsMCk7CQkJIyBhcFswXSpicFtpXQorCisJJnBhZGRxCSgkbXVsMSwkdGVtcCk7CQkJIyArPXRwWzBdCisJJm1vdnEJKCRhY2MwLCRtdWwxKTsKKwkmbW92cQkoJGNhcjAsJG11bDEpOworCSZwYW5kCSgkYWNjMCwkbWFzayk7CisKKwkmcG11bHVkcSgkbXVsMSwkX24wcSk7CQkJIyAqPW4wCisKKwkmcG11bHVkcSgkY2FyMSwkbXVsMSk7CisJJnBhZGRxCSgkY2FyMSwkYWNjMCk7CisKKwkmbW92ZAkoJHRlbXAsJkRXUCgkZnJhbWUrNCwiZXNwIikpOwkjIHRwWzFdCisJJm1vdmQJKCRhY2MxLCZEV1AoNCwkbnApKTsJCSMgbnBbMV0KKwkmbW92ZAkoJGFjYzAsJkRXUCg0LCRhcCkpOwkJIyBhcFsxXQorCisJJnBzcmxxCSgkY2FyMCwzMik7CisJJnBzcmxxCSgkY2FyMSwzMik7CisJJnBhZGRxCSgkY2FyMCwkdGVtcCk7CQkJIyArPXRwWzFdCisKKwkmaW5jCSgkaik7CQkJCSMgaisrCisJJmRlYwkoJG51bSk7Cismc2V0X2xhYmVsKCJpbm5lciIpOworCSZwbXVsdWRxKCRhY2MwLCRtdWwwKTsJCQkjIGFwW2pdKmJwW2ldCisJJnBtdWx1ZHEoJGFjYzEsJG11bDEpOwkJCSMgbnBbal0qbTEKKwkmcGFkZHEJKCRjYXIwLCRhY2MwKTsJCQkjICs9YzAKKwkmcGFkZHEJKCRjYXIxLCRhY2MxKTsJCQkjICs9YzEKKworCSZtb3ZxCSgkYWNjMCwkY2FyMCk7CisJJm1vdmQJKCR0ZW1wLCZEV1AoJGZyYW1lKzQsImVzcCIsJGosNCkpOyMgdHBbaisxXQorCSZwYW5kCSgkYWNjMCwkbWFzayk7CisJJm1vdmQJKCRhY2MxLCZEV1AoNCwkbnAsJGosNCkpOwkjIG5wW2orMV0KKwkmcGFkZHEJKCRjYXIxLCRhY2MwKTsJCQkjICs9YXBbal0qYnBbaV0rdHBbal0KKwkmbW92ZAkoJGFjYzAsJkRXUCg0LCRhcCwkaiw0KSk7CSMgYXBbaisxXQorCSZwc3JscQkoJGNhcjAsMzIpOworCSZtb3ZkCSgmRFdQKCRmcmFtZS00LCJlc3AiLCRqLDQpLCRjYXIxKTsjIHRwW2otMV09CisJJnBzcmxxCSgkY2FyMSwzMik7CisJJnBhZGRxCSgkY2FyMCwkdGVtcCk7CQkJIyArPXRwW2orMV0KKworCSZkZWMJKCRudW0pOworCSZsZWEJKCRqLCZEV1AoMSwkaikpOwkJIyBqKysKKwkmam56CSgmbGFiZWwoImlubmVyIikpOworCisJJm1vdgkoJG51bSwkaik7CisJJnBtdWx1ZHEoJGFjYzAsJG11bDApOwkJCSMgYXBbbnVtLTFdKmJwW2ldCisJJnBtdWx1ZHEoJGFjYzEsJG11bDEpOwkJCSMgbnBbbnVtLTFdKm0xCisJJnBhZGRxCSgkY2FyMCwkYWNjMCk7CQkJIyArPWMwCisJJnBhZGRxCSgkY2FyMSwkYWNjMSk7CQkJIyArPWMxCisKKwkmbW92cQkoJGFjYzAsJGNhcjApOworCSZwYW5kCSgkYWNjMCwkbWFzayk7CisJJnBhZGRxCSgkY2FyMSwkYWNjMCk7CQkJIyArPWFwW251bS0xXSpicFtpXSt0cFtudW0tMV0KKwkmbW92ZAkoJkRXUCgkZnJhbWUtNCwiZXNwIiwkaiw0KSwkY2FyMSk7CSMgdHBbbnVtLTJdPQorCSZwc3JscQkoJGNhcjAsMzIpOworCSZwc3JscQkoJGNhcjEsMzIpOworCisJJm1vdmQJKCR0ZW1wLCZEV1AoJGZyYW1lKzQsImVzcCIsJG51bSw0KSk7CSMgKz0gdHBbbnVtXQorCSZwYWRkcQkoJGNhcjEsJGNhcjApOworCSZwYWRkcQkoJGNhcjEsJHRlbXApOworCSZtb3ZxCSgmUVdQKCRmcmFtZSwiZXNwIiwkbnVtLDQpLCRjYXIxKTsJIyB0cFtudW1dLnRwW251bS0xXQorCisJJmxlYQkoJGksJkRXUCgxLCRpKSk7CQkjIGkrKworCSZjbXAJKCRpLCRudW0pOworCSZqbGUJKCZsYWJlbCgib3V0ZXIiKSk7CisKKwkmZW1tcwkoKTsJCQkJIyBkb25lIHdpdGggbW14IGJhbmsKKwkmam1wCSgmbGFiZWwoImNvbW1vbl90YWlsIikpOworCismc2V0X2xhYmVsKCJub25fc3NlMiIsMTYpOworfQorDAoraWYgKDApIHsKKwkmbW92CSgiZXNwIiwkX3NwKTsKKwkmeG9yCSgiZWF4IiwiZWF4Iik7CSMgc2lnbmFsICJub3QgZmFzdCBlbm91Z2ggW3lldF0iCisJJmptcAkoJmxhYmVsKCJqdXN0X2xlYXZlIikpOworCSMgV2hpbGUgdGhlIGJlbG93IGNvZGUgcHJvdmlkZXMgY29tcGV0aXRpdmUgcGVyZm9ybWFuY2UgZm9yCisJIyBhbGwga2V5IGxlbmd0aGVzIG9uIG1vZGVybiBJbnRlbCBjb3JlcywgaXQncyBzdGlsbCBtb3JlCisJIyB0aGFuIDEwJSBzbG93ZXIgZm9yIDQwOTYtYml0IGtleSBlbHNld2hlcmU6LSggIkNvbXBldGl0aXZlIgorCSMgbWVhbnMgY29tcGFyZWQgdG8gdGhlIG9yaWdpbmFsIGludGVnZXItb25seSBhc3NlbWJsZXIuCisJIyA1MTItYml0IFJTQSBzaWduIGlzIGJldHRlciBieSB+NDAlLCBidXQgdGhhdCdzIGFib3V0IGFsbAorCSMgb25lIGNhbiBzYXkgYWJvdXQgYWxsIENQVXMuLi4KK30gZWxzZSB7CiskaW5wPSJlc2kiOwkjIGludGVnZXIgcGF0aCB1c2VzIHRoZXNlIHJlZ2lzdGVycyBkaWZmZXJlbnRseQorJHdvcmQ9ImVkaSI7CiskY2Fycnk9ImVicCI7CisKKwkmbW92CSgkaW5wLCRfYXApOworCSZsZWEJKCRjYXJyeSwmRFdQKDEsJG51bSkpOworCSZtb3YJKCR3b3JkLCRfYnApOworCSZ4b3IJKCRqLCRqKTsJCQkJIyBqPTAKKwkmbW92CSgiZWR4IiwkaW5wKTsKKwkmYW5kCSgkY2FycnksMSk7CQkJCSMgc2VlIGlmIG51bSBpcyBldmVuCisJJnN1YgkoImVkeCIsJHdvcmQpOwkJCQkjIHNlZSBpZiBhcD09YnAKKwkmbGVhCSgiZWF4IiwmRFdQKDQsJHdvcmQsJG51bSw0KSk7CQkjICZicFtudW1dCisJJm9yCSgkY2FycnksImVkeCIpOworCSZtb3YJKCR3b3JkLCZEV1AoMCwkd29yZCkpOwkJCSMgYnBbMF0KKwkmanoJKCZsYWJlbCgiYm5fc3FyX21vbnQiKSk7CisJJm1vdgkoJF9icGVuZCwiZWF4Iik7CisJJm1vdgkoImVheCIsJkRXUCgwLCRpbnApKTsKKwkmeG9yCSgiZWR4IiwiZWR4Iik7CisKKyZzZXRfbGFiZWwoIm11bGwiLDE2KTsKKwkmbW92CSgkY2FycnksImVkeCIpOworCSZtdWwJKCR3b3JkKTsJCQkJIyBhcFtqXSpicFswXQorCSZhZGQJKCRjYXJyeSwiZWF4Iik7CisJJmxlYQkoJGosJkRXUCgxLCRqKSk7CisJJmFkYwkoImVkeCIsMCk7CisJJm1vdgkoImVheCIsJkRXUCgwLCRpbnAsJGosNCkpOwkJIyBhcFtqKzFdCisJJmNtcAkoJGosJG51bSk7CisJJm1vdgkoJkRXUCgkZnJhbWUtNCwiZXNwIiwkaiw0KSwkY2FycnkpOwkjIHRwW2pdPQorCSZqbAkoJmxhYmVsKCJtdWxsIikpOworCisJJm1vdgkoJGNhcnJ5LCJlZHgiKTsKKwkmbXVsCSgkd29yZCk7CQkJCSMgYXBbbnVtLTFdKmJwWzBdCisJICZtb3YJKCR3b3JkLCRfbjApOworCSZhZGQJKCJlYXgiLCRjYXJyeSk7CisJICZtb3YJKCRpbnAsJF9ucCk7CisJJmFkYwkoImVkeCIsMCk7CisJICZpbXVsCSgkd29yZCwmRFdQKCRmcmFtZSwiZXNwIikpOwkJIyBuMCp0cFswXQorCisJJm1vdgkoJkRXUCgkZnJhbWUsImVzcCIsJG51bSw0KSwiZWF4Iik7CSMgdHBbbnVtLTFdPQorCSZ4b3IJKCRqLCRqKTsKKwkmbW92CSgmRFdQKCRmcmFtZSs0LCJlc3AiLCRudW0sNCksImVkeCIpOwkjIHRwW251bV09CisJJm1vdgkoJkRXUCgkZnJhbWUrOCwiZXNwIiwkbnVtLDQpLCRqKTsJIyB0cFtudW0rMV09CisKKwkmbW92CSgiZWF4IiwmRFdQKDAsJGlucCkpOwkJCSMgbnBbMF0KKwkmbXVsCSgkd29yZCk7CQkJCSMgbnBbMF0qbQorCSZhZGQJKCJlYXgiLCZEV1AoJGZyYW1lLCJlc3AiKSk7CQkjICs9dHBbMF0KKwkmbW92CSgiZWF4IiwmRFdQKDQsJGlucCkpOwkJCSMgbnBbMV0KKwkmYWRjCSgiZWR4IiwwKTsKKwkmaW5jCSgkaik7CisKKwkmam1wCSgmbGFiZWwoIjJuZG1hZGQiKSk7CisMDAorJnNldF9sYWJlbCgiMXN0bWFkZCIsMTYpOworCSZtb3YJKCRjYXJyeSwiZWR4Iik7CisJJm11bAkoJHdvcmQpOwkJCQkjIGFwW2pdKmJwW2ldCisJJmFkZAkoJGNhcnJ5LCZEV1AoJGZyYW1lLCJlc3AiLCRqLDQpKTsJIyArPXRwW2pdCisJJmxlYQkoJGosJkRXUCgxLCRqKSk7CisJJmFkYwkoImVkeCIsMCk7CisJJmFkZAkoJGNhcnJ5LCJlYXgiKTsKKwkmbW92CSgiZWF4IiwmRFdQKDAsJGlucCwkaiw0KSk7CQkjIGFwW2orMV0KKwkmYWRjCSgiZWR4IiwwKTsKKwkmY21wCSgkaiwkbnVtKTsKKwkmbW92CSgmRFdQKCRmcmFtZS00LCJlc3AiLCRqLDQpLCRjYXJyeSk7CSMgdHBbal09CisJJmpsCSgmbGFiZWwoIjFzdG1hZGQiKSk7CisKKwkmbW92CSgkY2FycnksImVkeCIpOworCSZtdWwJKCR3b3JkKTsJCQkJIyBhcFtudW0tMV0qYnBbaV0KKwkmYWRkCSgiZWF4IiwmRFdQKCRmcmFtZSwiZXNwIiwkbnVtLDQpKTsJIyArPXRwW251bS0xXQorCSAmbW92CSgkd29yZCwkX24wKTsKKwkmYWRjCSgiZWR4IiwwKTsKKwkgJm1vdgkoJGlucCwkX25wKTsKKwkmYWRkCSgkY2FycnksImVheCIpOworCSZhZGMJKCJlZHgiLDApOworCSAmaW11bAkoJHdvcmQsJkRXUCgkZnJhbWUsImVzcCIpKTsJCSMgbjAqdHBbMF0KKworCSZ4b3IJKCRqLCRqKTsKKwkmYWRkCSgiZWR4IiwmRFdQKCRmcmFtZSs0LCJlc3AiLCRudW0sNCkpOwkjIGNhcnJ5Kz10cFtudW1dCisJJm1vdgkoJkRXUCgkZnJhbWUsImVzcCIsJG51bSw0KSwkY2FycnkpOwkjIHRwW251bS0xXT0KKwkmYWRjCSgkaiwwKTsKKwkgJm1vdgkoImVheCIsJkRXUCgwLCRpbnApKTsJCQkjIG5wWzBdCisJJm1vdgkoJkRXUCgkZnJhbWUrNCwiZXNwIiwkbnVtLDQpLCJlZHgiKTsJIyB0cFtudW1dPQorCSZtb3YJKCZEV1AoJGZyYW1lKzgsImVzcCIsJG51bSw0KSwkaik7CSMgdHBbbnVtKzFdPQorCisJJm11bAkoJHdvcmQpOwkJCQkjIG5wWzBdKm0KKwkmYWRkCSgiZWF4IiwmRFdQKCRmcmFtZSwiZXNwIikpOwkJIyArPXRwWzBdCisJJm1vdgkoImVheCIsJkRXUCg0LCRpbnApKTsJCQkjIG5wWzFdCisJJmFkYwkoImVkeCIsMCk7CisJJm1vdgkoJGosMSk7CisMCismc2V0X2xhYmVsKCIybmRtYWRkIiwxNik7CisJJm1vdgkoJGNhcnJ5LCJlZHgiKTsKKwkmbXVsCSgkd29yZCk7CQkJCSMgbnBbal0qbQorCSZhZGQJKCRjYXJyeSwmRFdQKCRmcmFtZSwiZXNwIiwkaiw0KSk7CSMgKz10cFtqXQorCSZsZWEJKCRqLCZEV1AoMSwkaikpOworCSZhZGMJKCJlZHgiLDApOworCSZhZGQJKCRjYXJyeSwiZWF4Iik7CisJJm1vdgkoImVheCIsJkRXUCgwLCRpbnAsJGosNCkpOwkJIyBucFtqKzFdCisJJmFkYwkoImVkeCIsMCk7CisJJmNtcAkoJGosJG51bSk7CisJJm1vdgkoJkRXUCgkZnJhbWUtOCwiZXNwIiwkaiw0KSwkY2FycnkpOwkjIHRwW2otMV09CisJJmpsCSgmbGFiZWwoIjJuZG1hZGQiKSk7CisKKwkmbW92CSgkY2FycnksImVkeCIpOworCSZtdWwJKCR3b3JkKTsJCQkJIyBucFtqXSptCisJJmFkZAkoJGNhcnJ5LCZEV1AoJGZyYW1lLCJlc3AiLCRudW0sNCkpOwkjICs9dHBbbnVtLTFdCisJJmFkYwkoImVkeCIsMCk7CisJJmFkZAkoJGNhcnJ5LCJlYXgiKTsKKwkmYWRjCSgiZWR4IiwwKTsKKwkmbW92CSgmRFdQKCRmcmFtZS00LCJlc3AiLCRudW0sNCksJGNhcnJ5KTsJIyB0cFtudW0tMl09CisKKwkmeG9yCSgiZWF4IiwiZWF4Iik7CisJICZtb3YJKCRqLCRfYnApOwkJCQkjICZicFtpXQorCSZhZGQJKCJlZHgiLCZEV1AoJGZyYW1lKzQsImVzcCIsJG51bSw0KSk7CSMgY2FycnkrPXRwW251bV0KKwkmYWRjCSgiZWF4IiwmRFdQKCRmcmFtZSs4LCJlc3AiLCRudW0sNCkpOwkjICs9dHBbbnVtKzFdCisJICZsZWEJKCRqLCZEV1AoNCwkaikpOworCSZtb3YJKCZEV1AoJGZyYW1lLCJlc3AiLCRudW0sNCksImVkeCIpOwkjIHRwW251bS0xXT0KKwkgJmNtcAkoJGosJF9icGVuZCk7CisJJm1vdgkoJkRXUCgkZnJhbWUrNCwiZXNwIiwkbnVtLDQpLCJlYXgiKTsJIyB0cFtudW1dPQorCSZqZQkoJmxhYmVsKCJjb21tb25fdGFpbCIpKTsKKworCSZtb3YJKCR3b3JkLCZEV1AoMCwkaikpOwkJCSMgYnBbaSsxXQorCSZtb3YJKCRpbnAsJF9hcCk7CisJJm1vdgkoJF9icCwkaik7CQkJCSMgJmJwWysraV0KKwkmeG9yCSgkaiwkaik7CisJJnhvcgkoImVkeCIsImVkeCIpOworCSZtb3YJKCJlYXgiLCZEV1AoMCwkaW5wKSk7CisJJmptcAkoJmxhYmVsKCIxc3RtYWRkIikpOworDAorJnNldF9sYWJlbCgiYm5fc3FyX21vbnQiLDE2KTsKKyRzYml0PSRudW07CisJJm1vdgkoJF9udW0sJG51bSk7CisJJm1vdgkoJF9icCwkaik7CQkJCSMgaT0wCisKKwkmbW92CSgiZWF4Iiwkd29yZCk7CQkJCSMgYXBbMF0KKwkmbXVsCSgkd29yZCk7CQkJCSMgYXBbMF0qYXBbMF0KKwkmbW92CSgmRFdQKCRmcmFtZSwiZXNwIiksImVheCIpOwkJIyB0cFswXT0KKwkmbW92CSgkc2JpdCwiZWR4Iik7CisJJnNocgkoImVkeCIsMSk7CisJJmFuZAkoJHNiaXQsMSk7CisJJmluYwkoJGopOworJnNldF9sYWJlbCgic3FyIiwxNik7CisJJm1vdgkoImVheCIsJkRXUCgwLCRpbnAsJGosNCkpOwkJIyBhcFtqXQorCSZtb3YJKCRjYXJyeSwiZWR4Iik7CisJJm11bAkoJHdvcmQpOwkJCQkjIGFwW2pdKmFwWzBdCisJJmFkZAkoImVheCIsJGNhcnJ5KTsKKwkmbGVhCSgkaiwmRFdQKDEsJGopKTsKKwkmYWRjCSgiZWR4IiwwKTsKKwkmbGVhCSgkY2FycnksJkRXUCgwLCRzYml0LCJlYXgiLDIpKTsKKwkmc2hyCSgiZWF4IiwzMSk7CisJJmNtcAkoJGosJF9udW0pOworCSZtb3YJKCRzYml0LCJlYXgiKTsKKwkmbW92CSgmRFdQKCRmcmFtZS00LCJlc3AiLCRqLDQpLCRjYXJyeSk7CSMgdHBbal09CisJJmpsCSgmbGFiZWwoInNxciIpKTsKKworCSZtb3YJKCJlYXgiLCZEV1AoMCwkaW5wLCRqLDQpKTsJCSMgYXBbbnVtLTFdCisJJm1vdgkoJGNhcnJ5LCJlZHgiKTsKKwkmbXVsCSgkd29yZCk7CQkJCSMgYXBbbnVtLTFdKmFwWzBdCisJJmFkZAkoImVheCIsJGNhcnJ5KTsKKwkgJm1vdgkoJHdvcmQsJF9uMCk7CisJJmFkYwkoImVkeCIsMCk7CisJICZtb3YJKCRpbnAsJF9ucCk7CisJJmxlYQkoJGNhcnJ5LCZEV1AoMCwkc2JpdCwiZWF4IiwyKSk7CisJICZpbXVsCSgkd29yZCwmRFdQKCRmcmFtZSwiZXNwIikpOwkJIyBuMCp0cFswXQorCSZzaHIJKCJlYXgiLDMxKTsKKwkmbW92CSgmRFdQKCRmcmFtZSwiZXNwIiwkaiw0KSwkY2FycnkpOwkjIHRwW251bS0xXT0KKworCSZsZWEJKCRjYXJyeSwmRFdQKDAsImVheCIsImVkeCIsMikpOworCSAmbW92CSgiZWF4IiwmRFdQKDAsJGlucCkpOwkJCSMgbnBbMF0KKwkmc2hyCSgiZWR4IiwzMSk7CisJJm1vdgkoJkRXUCgkZnJhbWUrNCwiZXNwIiwkaiw0KSwkY2FycnkpOwkjIHRwW251bV09CisJJm1vdgkoJkRXUCgkZnJhbWUrOCwiZXNwIiwkaiw0KSwiZWR4Iik7CSMgdHBbbnVtKzFdPQorCisJJm11bAkoJHdvcmQpOwkJCQkjIG5wWzBdKm0KKwkmYWRkCSgiZWF4IiwmRFdQKCRmcmFtZSwiZXNwIikpOwkJIyArPXRwWzBdCisJJm1vdgkoJG51bSwkaik7CisJJmFkYwkoImVkeCIsMCk7CisJJm1vdgkoImVheCIsJkRXUCg0LCRpbnApKTsJCQkjIG5wWzFdCisJJm1vdgkoJGosMSk7CisMDAorJnNldF9sYWJlbCgiM3JkbWFkZCIsMTYpOworCSZtb3YJKCRjYXJyeSwiZWR4Iik7CisJJm11bAkoJHdvcmQpOwkJCQkjIG5wW2pdKm0KKwkmYWRkCSgkY2FycnksJkRXUCgkZnJhbWUsImVzcCIsJGosNCkpOwkjICs9dHBbal0KKwkmYWRjCSgiZWR4IiwwKTsKKwkmYWRkCSgkY2FycnksImVheCIpOworCSZtb3YJKCJlYXgiLCZEV1AoNCwkaW5wLCRqLDQpKTsJCSMgbnBbaisxXQorCSZhZGMJKCJlZHgiLDApOworCSZtb3YJKCZEV1AoJGZyYW1lLTQsImVzcCIsJGosNCksJGNhcnJ5KTsJIyB0cFtqLTFdPQorCisJJm1vdgkoJGNhcnJ5LCJlZHgiKTsKKwkmbXVsCSgkd29yZCk7CQkJCSMgbnBbaisxXSptCisJJmFkZAkoJGNhcnJ5LCZEV1AoJGZyYW1lKzQsImVzcCIsJGosNCkpOwkjICs9dHBbaisxXQorCSZsZWEJKCRqLCZEV1AoMiwkaikpOworCSZhZGMJKCJlZHgiLDApOworCSZhZGQJKCRjYXJyeSwiZWF4Iik7CisJJm1vdgkoImVheCIsJkRXUCgwLCRpbnAsJGosNCkpOwkJIyBucFtqKzJdCisJJmFkYwkoImVkeCIsMCk7CisJJmNtcAkoJGosJG51bSk7CisJJm1vdgkoJkRXUCgkZnJhbWUtOCwiZXNwIiwkaiw0KSwkY2FycnkpOwkjIHRwW2pdPQorCSZqbAkoJmxhYmVsKCIzcmRtYWRkIikpOworCisJJm1vdgkoJGNhcnJ5LCJlZHgiKTsKKwkmbXVsCSgkd29yZCk7CQkJCSMgbnBbal0qbQorCSZhZGQJKCRjYXJyeSwmRFdQKCRmcmFtZSwiZXNwIiwkbnVtLDQpKTsJIyArPXRwW251bS0xXQorCSZhZGMJKCJlZHgiLDApOworCSZhZGQJKCRjYXJyeSwiZWF4Iik7CisJJmFkYwkoImVkeCIsMCk7CisJJm1vdgkoJkRXUCgkZnJhbWUtNCwiZXNwIiwkbnVtLDQpLCRjYXJyeSk7CSMgdHBbbnVtLTJdPQorCisJJm1vdgkoJGosJF9icCk7CQkJCSMgaQorCSZ4b3IJKCJlYXgiLCJlYXgiKTsKKwkmbW92CSgkaW5wLCRfYXApOworCSZhZGQJKCJlZHgiLCZEV1AoJGZyYW1lKzQsImVzcCIsJG51bSw0KSk7CSMgY2FycnkrPXRwW251bV0KKwkmYWRjCSgiZWF4IiwmRFdQKCRmcmFtZSs4LCJlc3AiLCRudW0sNCkpOwkjICs9dHBbbnVtKzFdCisJJm1vdgkoJkRXUCgkZnJhbWUsImVzcCIsJG51bSw0KSwiZWR4Iik7CSMgdHBbbnVtLTFdPQorCSZjbXAJKCRqLCRudW0pOworCSZtb3YJKCZEV1AoJGZyYW1lKzQsImVzcCIsJG51bSw0KSwiZWF4Iik7CSMgdHBbbnVtXT0KKwkmamUJKCZsYWJlbCgiY29tbW9uX3RhaWwiKSk7CisMCisJJm1vdgkoJHdvcmQsJkRXUCg0LCRpbnAsJGosNCkpOwkJIyBhcFtpXQorCSZsZWEJKCRqLCZEV1AoMSwkaikpOworCSZtb3YJKCJlYXgiLCR3b3JkKTsKKwkmbW92CSgkX2JwLCRqKTsJCQkJIyArK2kKKwkmbXVsCSgkd29yZCk7CQkJCSMgYXBbaV0qYXBbaV0KKwkmYWRkCSgiZWF4IiwmRFdQKCRmcmFtZSwiZXNwIiwkaiw0KSk7CSMgKz10cFtpXQorCSZhZGMJKCJlZHgiLDApOworCSZtb3YJKCZEV1AoJGZyYW1lLCJlc3AiLCRqLDQpLCJlYXgiKTsJIyB0cFtpXT0KKwkmeG9yCSgkY2FycnksJGNhcnJ5KTsKKwkmY21wCSgkaiwkbnVtKTsKKwkmbGVhCSgkaiwmRFdQKDEsJGopKTsKKwkmamUJKCZsYWJlbCgic3FybGFzdCIpKTsKKworCSZtb3YJKCRzYml0LCJlZHgiKTsJCQkJIyB6YXBzICRudW0KKwkmc2hyCSgiZWR4IiwxKTsKKwkmYW5kCSgkc2JpdCwxKTsKKyZzZXRfbGFiZWwoInNxcmFkZCIsMTYpOworCSZtb3YJKCJlYXgiLCZEV1AoMCwkaW5wLCRqLDQpKTsJCSMgYXBbal0KKwkmbW92CSgkY2FycnksImVkeCIpOworCSZtdWwJKCR3b3JkKTsJCQkJIyBhcFtqXSphcFtpXQorCSZhZGQJKCJlYXgiLCRjYXJyeSk7CisJJmxlYQkoJGNhcnJ5LCZEV1AoMCwiZWF4IiwiZWF4IikpOworCSZhZGMJKCJlZHgiLDApOworCSZzaHIJKCJlYXgiLDMxKTsKKwkmYWRkCSgkY2FycnksJkRXUCgkZnJhbWUsImVzcCIsJGosNCkpOwkjICs9dHBbal0KKwkmbGVhCSgkaiwmRFdQKDEsJGopKTsKKwkmYWRjCSgiZWF4IiwwKTsKKwkmYWRkCSgkY2FycnksJHNiaXQpOworCSZhZGMJKCJlYXgiLDApOworCSZjbXAJKCRqLCRfbnVtKTsKKwkmbW92CSgmRFdQKCRmcmFtZS00LCJlc3AiLCRqLDQpLCRjYXJyeSk7CSMgdHBbal09CisJJm1vdgkoJHNiaXQsImVheCIpOworCSZqbGUJKCZsYWJlbCgic3FyYWRkIikpOworCisJJm1vdgkoJGNhcnJ5LCJlZHgiKTsKKwkmYWRkCSgiZWR4IiwiZWR4Iik7CisJJnNocgkoJGNhcnJ5LDMxKTsKKwkmYWRkCSgiZWR4Iiwkc2JpdCk7CisJJmFkYwkoJGNhcnJ5LDApOworJnNldF9sYWJlbCgic3FybGFzdCIpOworCSZtb3YJKCR3b3JkLCRfbjApOworCSZtb3YJKCRpbnAsJF9ucCk7CisJJmltdWwJKCR3b3JkLCZEV1AoJGZyYW1lLCJlc3AiKSk7CQkjIG4wKnRwWzBdCisKKwkmYWRkCSgiZWR4IiwmRFdQKCRmcmFtZSwiZXNwIiwkaiw0KSk7CSMgKz10cFtudW1dCisJJm1vdgkoImVheCIsJkRXUCgwLCRpbnApKTsJCQkjIG5wWzBdCisJJmFkYwkoJGNhcnJ5LDApOworCSZtb3YJKCZEV1AoJGZyYW1lLCJlc3AiLCRqLDQpLCJlZHgiKTsJIyB0cFtudW1dPQorCSZtb3YJKCZEV1AoJGZyYW1lKzQsImVzcCIsJGosNCksJGNhcnJ5KTsJIyB0cFtudW0rMV09CisKKwkmbXVsCSgkd29yZCk7CQkJCSMgbnBbMF0qbQorCSZhZGQJKCJlYXgiLCZEV1AoJGZyYW1lLCJlc3AiKSk7CQkjICs9dHBbMF0KKwkmbGVhCSgkbnVtLCZEV1AoLTEsJGopKTsKKwkmYWRjCSgiZWR4IiwwKTsKKwkmbW92CSgkaiwxKTsKKwkmbW92CSgiZWF4IiwmRFdQKDQsJGlucCkpOwkJCSMgbnBbMV0KKworCSZqbXAJKCZsYWJlbCgiM3JkbWFkZCIpKTsKK30KKwwKKyZzZXRfbGFiZWwoImNvbW1vbl90YWlsIiwxNik7CisJJm1vdgkoJG5wLCRfbnApOwkJCSMgbG9hZCBtb2R1bHVzIHBvaW50ZXIKKwkmbW92CSgkcnAsJF9ycCk7CQkJIyBsb2FkIHJlc3VsdCBwb2ludGVyCisJJmxlYQkoJHRwLCZEV1AoJGZyYW1lLCJlc3AiKSk7CSMgWyRhcCBhbmQgJGJwIGFyZSB6YXBwZWRdCisKKwkmbW92CSgiZWF4IiwmRFdQKDAsJHRwKSk7CQkjIHRwWzBdCisJJm1vdgkoJGosJG51bSk7CQkJIyBqPW51bS0xCisJJnhvcgkoJGksJGkpOwkJCSMgaT0wIGFuZCBjbGVhciBDRiEKKworJnNldF9sYWJlbCgic3ViIiwxNik7CisJJnNiYgkoImVheCIsJkRXUCgwLCRucCwkaSw0KSk7CisJJm1vdgkoJkRXUCgwLCRycCwkaSw0KSwiZWF4Iik7CSMgcnBbaV09dHBbaV0tbnBbaV0KKwkmZGVjCSgkaik7CQkJCSMgZG9lc24ndCBhZmZlY3QgQ0YhCisJJm1vdgkoImVheCIsJkRXUCg0LCR0cCwkaSw0KSk7CSMgdHBbaSsxXQorCSZsZWEJKCRpLCZEV1AoMSwkaSkpOwkJIyBpKysKKwkmamdlCSgmbGFiZWwoInN1YiIpKTsKKworCSZzYmIJKCJlYXgiLDApOwkJCSMgaGFuZGxlIHVwbW9zdCBvdmVyZmxvdyBiaXQKKwkmYW5kCSgkdHAsImVheCIpOworCSZub3QJKCJlYXgiKTsKKwkmbW92CSgkbnAsJHJwKTsKKwkmYW5kCSgkbnAsImVheCIpOworCSZvcgkoJHRwLCRucCk7CQkJIyB0cD1jYXJyeT90cDpycAorCismc2V0X2xhYmVsKCJjb3B5IiwxNik7CQkJCSMgY29weSBvciBpbi1wbGFjZSByZWZyZXNoCisJJm1vdgkoImVheCIsJkRXUCgwLCR0cCwkbnVtLDQpKTsKKwkmbW92CSgmRFdQKDAsJHJwLCRudW0sNCksImVheCIpOwkjIHJwW2ldPXRwW2ldCisJJm1vdgkoJkRXUCgkZnJhbWUsImVzcCIsJG51bSw0KSwkaik7CSMgemFwIHRlbXBvcmFyeSB2ZWN0b3IKKwkmZGVjCSgkbnVtKTsKKwkmamdlCSgmbGFiZWwoImNvcHkiKSk7CisKKwkmbW92CSgiZXNwIiwkX3NwKTsJCSMgcHVsbCBzYXZlZCBzdGFjayBwb2ludGVyCisJJm1vdgkoImVheCIsMSk7Cismc2V0X2xhYmVsKCJqdXN0X2xlYXZlIik7CismZnVuY3Rpb25fZW5kKCJibl9tdWxfbW9udCIpOworCismYXNjaXooIk1vbnRnb21lcnkgTXVsdGlwbGljYXRpb24gZm9yIHg4NiwgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQG9wZW5zc2wub3JnPiIpOworCismYXNtX2ZpbmlzaCgpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2JuL2FzbS94ODYucGwgYi9jcnlwdG8vYm4vYXNtL3g4Ni5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODNmOGRkCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2JuL2FzbS94ODYucGwKQEAgLTAsMCArMSwyOCBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCiskMCA9fiBtLyguKltcL1xcXSlbXlwvXFxdKyQvOyAkZGlyPSQxOworcHVzaChASU5DLCIke2Rpcn0iLCIke2Rpcn0uLi8uLi9wZXJsYXNtIik7CityZXF1aXJlICJ4ODZhc20ucGwiOworCityZXF1aXJlKCJ4ODYvbXVsX2FkZC5wbCIpOworcmVxdWlyZSgieDg2L211bC5wbCIpOworcmVxdWlyZSgieDg2L3Nxci5wbCIpOworcmVxdWlyZSgieDg2L2Rpdi5wbCIpOworcmVxdWlyZSgieDg2L2FkZC5wbCIpOworcmVxdWlyZSgieDg2L3N1Yi5wbCIpOworcmVxdWlyZSgieDg2L2NvbWJhLnBsIik7CisKKyZhc21faW5pdCgkQVJHVlswXSwkMCk7CisKKyZibl9tdWxfYWRkX3dvcmRzKCJibl9tdWxfYWRkX3dvcmRzIik7CismYm5fbXVsX3dvcmRzKCJibl9tdWxfd29yZHMiKTsKKyZibl9zcXJfd29yZHMoImJuX3Nxcl93b3JkcyIpOworJmJuX2Rpdl93b3JkcygiYm5fZGl2X3dvcmRzIik7CismYm5fYWRkX3dvcmRzKCJibl9hZGRfd29yZHMiKTsKKyZibl9zdWJfd29yZHMoImJuX3N1Yl93b3JkcyIpOworJmJuX211bF9jb21iYSgiYm5fbXVsX2NvbWJhOCIsOCk7CismYm5fbXVsX2NvbWJhKCJibl9tdWxfY29tYmE0Iiw0KTsKKyZibl9zcXJfY29tYmEoImJuX3Nxcl9jb21iYTgiLDgpOworJmJuX3Nxcl9jb21iYSgiYm5fc3FyX2NvbWJhNCIsNCk7CisKKyZhc21fZmluaXNoKCk7CmRpZmYgLS1naXQgYS9jcnlwdG8vYm4vYXNtL3g4Ni9hZGQucGwgYi9jcnlwdG8vYm4vYXNtL3g4Ni9hZGQucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI1Y2Y1OAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9ibi9hc20veDg2L2FkZC5wbApAQCAtMCwwICsxLDc2IEBACisjIS91c3IvbG9jYWwvYmluL3BlcmwKKyMgeDg2IGFzc2VtYmVyCisKK3N1YiBibl9hZGRfd29yZHMKKwl7CisJbG9jYWwoJG5hbWUpPUBfOworCisJJmZ1bmN0aW9uX2JlZ2luKCRuYW1lLCIiKTsKKworCSZjb21tZW50KCIiKTsKKwkkYT0iZXNpIjsKKwkkYj0iZWRpIjsKKwkkYz0iZWF4IjsKKwkkcj0iZWJ4IjsKKwkkdG1wMT0iZWN4IjsKKwkkdG1wMj0iZWR4IjsKKwkkbnVtPSJlYnAiOworCisJJm1vdigkciwmd3BhcmFtKDApKTsJIyBnZXQgcgorCSAmbW92KCRhLCZ3cGFyYW0oMSkpOwkjIGdldCBhCisJJm1vdigkYiwmd3BhcmFtKDIpKTsJIyBnZXQgYgorCSAmbW92KCRudW0sJndwYXJhbSgzKSk7CSMgZ2V0IG51bQorCSZ4b3IoJGMsJGMpOwkJIyBjbGVhciBjYXJyeQorCSAmYW5kKCRudW0sMHhmZmZmZmZmOCk7CSMgbnVtIC8gOAorCisJJmp6KCZsYWJlbCgiYXdfZmluaXNoIikpOworCisJJnNldF9sYWJlbCgiYXdfbG9vcCIsMCk7CisJZm9yICgkaT0wOyAkaTw4OyAkaSsrKQorCQl7CisJCSZjb21tZW50KCJSb3VuZCAkaSIpOworCisJCSZtb3YoJHRtcDEsJkRXUCgkaSo0LCRhLCIiLDApKTsgCSMgKmEKKwkJICZtb3YoJHRtcDIsJkRXUCgkaSo0LCRiLCIiLDApKTsgCSMgKmIKKwkJJmFkZCgkdG1wMSwkYyk7CisJCSAmbW92KCRjLDApOworCQkmYWRjKCRjLCRjKTsKKwkJICZhZGQoJHRtcDEsJHRtcDIpOworCQkmYWRjKCRjLDApOworCQkgJm1vdigmRFdQKCRpKjQsJHIsIiIsMCksJHRtcDEpOyAJIyAqcgorCQl9CisKKwkmY29tbWVudCgiIik7CisJJmFkZCgkYSwzMik7CisJICZhZGQoJGIsMzIpOworCSZhZGQoJHIsMzIpOworCSAmc3ViKCRudW0sOCk7CisJJmpueigmbGFiZWwoImF3X2xvb3AiKSk7CisKKwkmc2V0X2xhYmVsKCJhd19maW5pc2giLDApOworCSZtb3YoJG51bSwmd3BhcmFtKDMpKTsJIyBnZXQgbnVtCisJJmFuZCgkbnVtLDcpOworCSAmanooJmxhYmVsKCJhd19lbmQiKSk7CisKKwlmb3IgKCRpPTA7ICRpPDc7ICRpKyspCisJCXsKKwkJJmNvbW1lbnQoIlRhaWwgUm91bmQgJGkiKTsKKwkJJm1vdigkdG1wMSwmRFdQKCRpKjQsJGEsIiIsMCkpOwkjICphCisJCSAmbW92KCR0bXAyLCZEV1AoJGkqNCwkYiwiIiwwKSk7IyAqYgorCQkmYWRkKCR0bXAxLCRjKTsKKwkJICZtb3YoJGMsMCk7CisJCSZhZGMoJGMsJGMpOworCQkgJmFkZCgkdG1wMSwkdG1wMik7CisJCSZhZGMoJGMsMCk7CisJCSAmZGVjKCRudW0pIGlmICgkaSAhPSA2KTsKKwkJJm1vdigmRFdQKCRpKjQsJHIsIiIsMCksJHRtcDEpOwkjICphCisJCSAmanooJmxhYmVsKCJhd19lbmQiKSkgaWYgKCRpICE9IDYpOworCQl9CisJJnNldF9sYWJlbCgiYXdfZW5kIiwwKTsKKworIwkmbW92KCJlYXgiLCRjKTsJCSMgJGMgaXMgImVheCIKKworCSZmdW5jdGlvbl9lbmQoJG5hbWUpOworCX0KKworMTsKZGlmZiAtLWdpdCBhL2NyeXB0by9ibi9hc20veDg2L2NvbWJhLnBsIGIvY3J5cHRvL2JuL2FzbS94ODYvY29tYmEucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI5MTI1MwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9ibi9hc20veDg2L2NvbWJhLnBsCkBAIC0wLDAgKzEsMjc3IEBACisjIS91c3IvbG9jYWwvYmluL3BlcmwKKyMgeDg2IGFzc2VtYmVyCisKK3N1YiBtdWxfYWRkX2MKKwl7CisJbG9jYWwoJGEsJGFpLCRiLCRiaSwkYzAsJGMxLCRjMiwkcG9zLCRpLCRuYSwkbmIpPUBfOworCisJIyBwb3MgPT0gLTEgaWYgZWF4IGFuZCBlZHggYXJlIHByZS1sb2FkZWQsIDAgdG8gbG9hZCBmcm9tIG5leHQKKwkjIHdvcmRzLCBhbmQgMSBpZiBsb2FkIHJldHVybiB2YWx1ZQorCisJJmNvbW1lbnQoIm11bCBhWyRhaV0qYlskYmldIik7CisKKwkjICJlYXgiIGFuZCAiZWR4IiB3aWxsIGFsd2F5cyBiZSBwcmUtbG9hZGVkLgorCSMgJm1vdigiZWF4IiwmRFdQKCRhaSo0LCRhLCIiLDApKSA7CisJIyAmbW92KCJlZHgiLCZEV1AoJGJpKjQsJGIsIiIsMCkpOworCisJJm11bCgiZWR4Iik7CisJJmFkZCgkYzAsImVheCIpOworCSAmbW92KCJlYXgiLCZEV1AoKCRuYSkqNCwkYSwiIiwwKSkgaWYgJHBvcyA9PSAwOwkjIGxhb2QgbmV4dCBhCisJICZtb3YoImVheCIsJndwYXJhbSgwKSkgaWYgJHBvcyA+IDA7CQkJIyBsb2FkIHJbXQorCSAjIyMKKwkmYWRjKCRjMSwiZWR4Iik7CisJICZtb3YoImVkeCIsJkRXUCgoJG5iKSo0LCRiLCIiLDApKSBpZiAkcG9zID09IDA7CSMgbGFvZCBuZXh0IGIKKwkgJm1vdigiZWR4IiwmRFdQKCgkbmIpKjQsJGIsIiIsMCkpIGlmICRwb3MgPT0gMTsJIyBsYW9kIG5leHQgYgorCSAjIyMKKwkmYWRjKCRjMiwwKTsKKwkgIyBpcyBwb3MgPiAxLCBpdCBtZWFucyBpdCBpcyB0aGUgbGFzdCBsb29wIAorCSAmbW92KCZEV1AoJGkqNCwiZWF4IiwiIiwwKSwkYzApIGlmICRwb3MgPiAwOwkJIyBzYXZlIHJbXTsKKwkmbW92KCJlYXgiLCZEV1AoKCRuYSkqNCwkYSwiIiwwKSkgaWYgJHBvcyA9PSAxOwkJIyBsYW9kIG5leHQgYQorCX0KKworc3ViIHNxcl9hZGRfYworCXsKKwlsb2NhbCgkciwkYSwkYWksJGJpLCRjMCwkYzEsJGMyLCRwb3MsJGksJG5hLCRuYik9QF87CisKKwkjIHBvcyA9PSAtMSBpZiBlYXggYW5kIGVkeCBhcmUgcHJlLWxvYWRlZCwgMCB0byBsb2FkIGZyb20gbmV4dAorCSMgd29yZHMsIGFuZCAxIGlmIGxvYWQgcmV0dXJuIHZhbHVlCisKKwkmY29tbWVudCgic3FyIGFbJGFpXSphWyRiaV0iKTsKKworCSMgImVheCIgYW5kICJlZHgiIHdpbGwgYWx3YXlzIGJlIHByZS1sb2FkZWQuCisJIyAmbW92KCJlYXgiLCZEV1AoJGFpKjQsJGEsIiIsMCkpIDsKKwkjICZtb3YoImVkeCIsJkRXUCgkYmkqNCwkYiwiIiwwKSk7CisKKwlpZiAoJGFpID09ICRiaSkKKwkJeyAmbXVsKCJlYXgiKTt9CisJZWxzZQorCQl7ICZtdWwoImVkeCIpO30KKwkmYWRkKCRjMCwiZWF4Iik7CisJICZtb3YoImVheCIsJkRXUCgoJG5hKSo0LCRhLCIiLDApKSBpZiAkcG9zID09IDA7CSMgbG9hZCBuZXh0IGEKKwkgIyMjCisJJmFkYygkYzEsImVkeCIpOworCSAmbW92KCJlZHgiLCZEV1AoKCRuYikqNCwkYSwiIiwwKSkgaWYgKCRwb3MgPT0gMSkgJiYgKCRuYSAhPSAkbmIpOworCSAjIyMKKwkmYWRjKCRjMiwwKTsKKwkgIyBpcyBwb3MgPiAxLCBpdCBtZWFucyBpdCBpcyB0aGUgbGFzdCBsb29wIAorCSAmbW92KCZEV1AoJGkqNCwkciwiIiwwKSwkYzApIGlmICRwb3MgPiAwOwkJIyBzYXZlIHJbXTsKKwkmbW92KCJlYXgiLCZEV1AoKCRuYSkqNCwkYSwiIiwwKSkgaWYgJHBvcyA9PSAxOwkJIyBsb2FkIG5leHQgYgorCX0KKworc3ViIHNxcl9hZGRfYzIKKwl7CisJbG9jYWwoJHIsJGEsJGFpLCRiaSwkYzAsJGMxLCRjMiwkcG9zLCRpLCRuYSwkbmIpPUBfOworCisJIyBwb3MgPT0gLTEgaWYgZWF4IGFuZCBlZHggYXJlIHByZS1sb2FkZWQsIDAgdG8gbG9hZCBmcm9tIG5leHQKKwkjIHdvcmRzLCBhbmQgMSBpZiBsb2FkIHJldHVybiB2YWx1ZQorCisJJmNvbW1lbnQoInNxciBhWyRhaV0qYVskYmldIik7CisKKwkjICJlYXgiIGFuZCAiZWR4IiB3aWxsIGFsd2F5cyBiZSBwcmUtbG9hZGVkLgorCSMgJm1vdigiZWF4IiwmRFdQKCRhaSo0LCRhLCIiLDApKSA7CisJIyAmbW92KCJlZHgiLCZEV1AoJGJpKjQsJGEsIiIsMCkpOworCisJaWYgKCRhaSA9PSAkYmkpCisJCXsgJm11bCgiZWF4Iik7fQorCWVsc2UKKwkJeyAmbXVsKCJlZHgiKTt9CisJJmFkZCgiZWF4IiwiZWF4Iik7CisJICMjIworCSZhZGMoImVkeCIsImVkeCIpOworCSAjIyMKKwkmYWRjKCRjMiwwKTsKKwkgJmFkZCgkYzAsImVheCIpOworCSZhZGMoJGMxLCJlZHgiKTsKKwkgJm1vdigiZWF4IiwmRFdQKCgkbmEpKjQsJGEsIiIsMCkpIGlmICRwb3MgPT0gMDsJIyBsb2FkIG5leHQgYQorCSAmbW92KCJlYXgiLCZEV1AoKCRuYSkqNCwkYSwiIiwwKSkgaWYgJHBvcyA9PSAxOwkjIGxvYWQgbmV4dCBiCisJJmFkYygkYzIsMCk7CisJJm1vdigmRFdQKCRpKjQsJHIsIiIsMCksJGMwKSBpZiAkcG9zID4gMDsJCSMgc2F2ZSByW107CisJICZtb3YoImVkeCIsJkRXUCgoJG5iKSo0LCRhLCIiLDApKSBpZiAoJHBvcyA8PSAxKSAmJiAoJG5hICE9ICRuYik7CisJICMjIworCX0KKworc3ViIGJuX211bF9jb21iYQorCXsKKwlsb2NhbCgkbmFtZSwkbnVtKT1AXzsKKwlsb2NhbCgkYSwkYiwkYzAsJGMxLCRjMik7CisJbG9jYWwoJGksJGFzLCRhZSwkYnMsJGJlLCRhaSwkYmkpOworCWxvY2FsKCR0b3QsJGVuZCk7CisKKwkmZnVuY3Rpb25fYmVnaW5fQigkbmFtZSwiIik7CisKKwkkYzA9ImVieCI7CisJJGMxPSJlY3giOworCSRjMj0iZWJwIjsKKwkkYT0iZXNpIjsKKwkkYj0iZWRpIjsKKwkKKwkkYXM9MDsKKwkkYWU9MDsKKwkkYnM9MDsKKwkkYmU9MDsKKwkkdG90PSRudW0rJG51bS0xOworCisJJnB1c2goImVzaSIpOworCSAmbW92KCRhLCZ3cGFyYW0oMSkpOworCSZwdXNoKCJlZGkiKTsKKwkgJm1vdigkYiwmd3BhcmFtKDIpKTsKKwkmcHVzaCgiZWJwIik7CisJICZwdXNoKCJlYngiKTsKKworCSZ4b3IoJGMwLCRjMCk7CisJICZtb3YoImVheCIsJkRXUCgwLCRhLCIiLDApKTsJIyBsb2FkIHRoZSBmaXJzdCB3b3JkIAorCSZ4b3IoJGMxLCRjMSk7CisJICZtb3YoImVkeCIsJkRXUCgwLCRiLCIiLDApKTsJIyBsb2FkIHRoZSBmaXJzdCBzZWNvbmQgCisKKwlmb3IgKCRpPTA7ICRpPCR0b3Q7ICRpKyspCisJCXsKKwkJJGFpPSRhczsKKwkJJGJpPSRiczsKKwkJJGVuZD0kYmUrMTsKKworCQkmY29tbWVudCgiIyMjIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSB3b3JkICRpIik7IAorCisJCWZvciAoJGo9JGJzOyAkajwkZW5kOyAkaisrKQorCQkJeworCQkJJnhvcigkYzIsJGMyKSBpZiAoJGogPT0gJGJzKTsKKwkJCWlmICgoJGorMSkgPT0gJGVuZCkKKwkJCQl7CisJCQkJJHY9MTsKKwkJCQkkdj0yIGlmICgoJGkrMSkgPT0gJHRvdCk7CisJCQkJfQorCQkJZWxzZQorCQkJCXsgJHY9MDsgfQorCQkJaWYgKCgkaisxKSAhPSAkZW5kKQorCQkJCXsKKwkJCQkkbmE9KCRhaS0xKTsKKwkJCQkkbmI9KCRiaSsxKTsKKwkJCQl9CisJCQllbHNlCisJCQkJeworCQkJCSRuYT0kYXMrKCRpIDwgKCRudW0tMSkpOworCQkJCSRuYj0kYnMrKCRpID49ICgkbnVtLTEpKTsKKwkJCQl9CisjcHJpbnRmIFNUREVSUiAiWyRhaSwkYmldIC0+IFskbmEsJG5iXVxuIjsKKwkJCSZtdWxfYWRkX2MoJGEsJGFpLCRiLCRiaSwkYzAsJGMxLCRjMiwkdiwkaSwkbmEsJG5iKTsKKwkJCWlmICgkdikKKwkJCQl7CisJCQkJJmNvbW1lbnQoInNhdmVkIHJbJGldIik7CisJCQkJIyAmbW92KCJlYXgiLCZ3cGFyYW0oMCkpOworCQkJCSMgJm1vdigmRFdQKCRpKjQsImVheCIsIiIsMCksJGMwKTsKKwkJCQkoJGMwLCRjMSwkYzIpPSgkYzEsJGMyLCRjMCk7CisJCQkJfQorCQkJJGFpLS07CisJCQkkYmkrKzsKKwkJCX0KKwkJJGFzKysgaWYgKCRpIDwgKCRudW0tMSkpOworCQkkYWUrKyBpZiAoJGkgPj0gKCRudW0tMSkpOworCisJCSRicysrIGlmICgkaSA+PSAoJG51bS0xKSk7CisJCSRiZSsrIGlmICgkaSA8ICgkbnVtLTEpKTsKKwkJfQorCSZjb21tZW50KCJzYXZlIHJbJGldIik7CisJIyAmbW92KCJlYXgiLCZ3cGFyYW0oMCkpOworCSZtb3YoJkRXUCgkaSo0LCJlYXgiLCIiLDApLCRjMCk7CisKKwkmcG9wKCJlYngiKTsKKwkmcG9wKCJlYnAiKTsKKwkmcG9wKCJlZGkiKTsKKwkmcG9wKCJlc2kiKTsKKwkmcmV0KCk7CisJJmZ1bmN0aW9uX2VuZF9CKCRuYW1lKTsKKwl9CisKK3N1YiBibl9zcXJfY29tYmEKKwl7CisJbG9jYWwoJG5hbWUsJG51bSk9QF87CisJbG9jYWwoJHIsJGEsJGMwLCRjMSwkYzIpPUBfOworCWxvY2FsKCRpLCRhcywkYWUsJGJzLCRiZSwkYWksJGJpKTsKKwlsb2NhbCgkYiwkdG90LCRlbmQsJGhhbGYpOworCisJJmZ1bmN0aW9uX2JlZ2luX0IoJG5hbWUsIiIpOworCisJJGMwPSJlYngiOworCSRjMT0iZWN4IjsKKwkkYzI9ImVicCI7CisJJGE9ImVzaSI7CisJJHI9ImVkaSI7CisKKwkmcHVzaCgiZXNpIik7CisJICZwdXNoKCJlZGkiKTsKKwkmcHVzaCgiZWJwIik7CisJICZwdXNoKCJlYngiKTsKKwkmbW92KCRyLCZ3cGFyYW0oMCkpOworCSAmbW92KCRhLCZ3cGFyYW0oMSkpOworCSZ4b3IoJGMwLCRjMCk7CisJICZ4b3IoJGMxLCRjMSk7CisJJm1vdigiZWF4IiwmRFdQKDAsJGEsIiIsMCkpOyAjIGxvYWQgdGhlIGZpcnN0IHdvcmQKKworCSRhcz0wOworCSRhZT0wOworCSRicz0wOworCSRiZT0wOworCSR0b3Q9JG51bSskbnVtLTE7CisKKwlmb3IgKCRpPTA7ICRpPCR0b3Q7ICRpKyspCisJCXsKKwkJJGFpPSRhczsKKwkJJGJpPSRiczsKKwkJJGVuZD0kYmUrMTsKKworCQkmY29tbWVudCgiIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSB3b3JkICRpIik7CisJCWZvciAoJGo9JGJzOyAkajwkZW5kOyAkaisrKQorCQkJeworCQkJJnhvcigkYzIsJGMyKSBpZiAoJGogPT0gJGJzKTsKKwkJCWlmICgoJGFpLTEpIDwgKCRiaSsxKSkKKwkJCQl7CisJCQkJJHY9MTsKKwkJCQkkdj0yIGlmICgkaSsxKSA9PSAkdG90OworCQkJCX0KKwkJCWVsc2UKKwkJCQl7ICR2PTA7IH0KKwkJCWlmICghJHYpCisJCQkJeworCQkJCSRuYT0kYWktMTsKKwkJCQkkbmI9JGJpKzE7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQkkbmE9JGFzKygkaSA8ICgkbnVtLTEpKTsKKwkJCQkkbmI9JGJzKygkaSA+PSAoJG51bS0xKSk7CisJCQkJfQorCQkJaWYgKCRhaSA9PSAkYmkpCisJCQkJeworCQkJCSZzcXJfYWRkX2MoJHIsJGEsJGFpLCRiaSwKKwkJCQkJJGMwLCRjMSwkYzIsJHYsJGksJG5hLCRuYik7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQkmc3FyX2FkZF9jMigkciwkYSwkYWksJGJpLAorCQkJCQkkYzAsJGMxLCRjMiwkdiwkaSwkbmEsJG5iKTsKKwkJCQl9CisJCQlpZiAoJHYpCisJCQkJeworCQkJCSZjb21tZW50KCJzYXZlZCByWyRpXSIpOworCQkJCSMmbW92KCZEV1AoJGkqNCwkciwiIiwwKSwkYzApOworCQkJCSgkYzAsJGMxLCRjMik9KCRjMSwkYzIsJGMwKTsKKwkJCQlsYXN0OworCQkJCX0KKwkJCSRhaS0tOworCQkJJGJpKys7CisJCQl9CisJCSRhcysrIGlmICgkaSA8ICgkbnVtLTEpKTsKKwkJJGFlKysgaWYgKCRpID49ICgkbnVtLTEpKTsKKworCQkkYnMrKyBpZiAoJGkgPj0gKCRudW0tMSkpOworCQkkYmUrKyBpZiAoJGkgPCAoJG51bS0xKSk7CisJCX0KKwkmbW92KCZEV1AoJGkqNCwkciwiIiwwKSwkYzApOworCSZwb3AoImVieCIpOworCSZwb3AoImVicCIpOworCSZwb3AoImVkaSIpOworCSZwb3AoImVzaSIpOworCSZyZXQoKTsKKwkmZnVuY3Rpb25fZW5kX0IoJG5hbWUpOworCX0KKworMTsKZGlmZiAtLWdpdCBhL2NyeXB0by9ibi9hc20veDg2L2Rpdi5wbCBiL2NyeXB0by9ibi9hc20veDg2L2Rpdi5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTkwMTUyCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2JuL2FzbS94ODYvZGl2LnBsCkBAIC0wLDAgKzEsMTUgQEAKKyMhL3Vzci9sb2NhbC9iaW4vcGVybAorIyB4ODYgYXNzZW1iZXIKKworc3ViIGJuX2Rpdl93b3JkcworCXsKKwlsb2NhbCgkbmFtZSk9QF87CisKKwkmZnVuY3Rpb25fYmVnaW4oJG5hbWUsIiIpOworCSZtb3YoImVkeCIsJndwYXJhbSgwKSk7CSMKKwkmbW92KCJlYXgiLCZ3cGFyYW0oMSkpOwkjCisJJm1vdigiZWJ4Iiwmd3BhcmFtKDIpKTsJIworCSZkaXYoImVieCIpOworCSZmdW5jdGlvbl9lbmQoJG5hbWUpOworCX0KKzE7CmRpZmYgLS1naXQgYS9jcnlwdG8vYm4vYXNtL3g4Ni9tdWwucGwgYi9jcnlwdG8vYm4vYXNtL3g4Ni9tdWwucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc0Y2I5YgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9ibi9hc20veDg2L211bC5wbApAQCAtMCwwICsxLDc3IEBACisjIS91c3IvbG9jYWwvYmluL3BlcmwKKyMgeDg2IGFzc2VtYmVyCisKK3N1YiBibl9tdWxfd29yZHMKKwl7CisJbG9jYWwoJG5hbWUpPUBfOworCisJJmZ1bmN0aW9uX2JlZ2luKCRuYW1lLCIiKTsKKworCSZjb21tZW50KCIiKTsKKwkkTG93PSJlYXgiOworCSRIaWdoPSJlZHgiOworCSRhPSJlYngiOworCSR3PSJlY3giOworCSRyPSJlZGkiOworCSRjPSJlc2kiOworCSRudW09ImVicCI7CisKKwkmeG9yKCRjLCRjKTsJCSMgY2xlYXIgY2FycnkKKwkmbW92KCRyLCZ3cGFyYW0oMCkpOwkjCisJJm1vdigkYSwmd3BhcmFtKDEpKTsJIworCSZtb3YoJG51bSwmd3BhcmFtKDIpKTsJIworCSZtb3YoJHcsJndwYXJhbSgzKSk7CSMKKworCSZhbmQoJG51bSwweGZmZmZmZmY4KTsJIyBudW0gLyA4CisJJmp6KCZsYWJlbCgibXdfZmluaXNoIikpOworCisJJnNldF9sYWJlbCgibXdfbG9vcCIsMCk7CisJZm9yICgkaT0wOyAkaTwzMjsgJGkrPTQpCisJCXsKKwkJJmNvbW1lbnQoIlJvdW5kICRpIik7CisKKwkJICZtb3YoImVheCIsJkRXUCgkaSwkYSwiIiwwKSk7IAkjICphCisJCSZtdWwoJHcpOwkJCSMgKmEgKiB3CisJCSZhZGQoImVheCIsJGMpOwkJCSMgTCh0KSs9YworCQkgIyBYWFgKKworCQkmYWRjKCJlZHgiLDApOwkJCSMgSCh0KSs9Y2FycnkKKwkJICZtb3YoJkRXUCgkaSwkciwiIiwwKSwiZWF4Iik7CSMgKnI9IEwodCk7CisKKwkJJm1vdigkYywiZWR4Iik7CQkJIyBjPSAgSCh0KTsKKwkJfQorCisJJmNvbW1lbnQoIiIpOworCSZhZGQoJGEsMzIpOworCSZhZGQoJHIsMzIpOworCSZzdWIoJG51bSw4KTsKKwkmanooJmxhYmVsKCJtd19maW5pc2giKSk7CisJJmptcCgmbGFiZWwoIm13X2xvb3AiKSk7CisKKwkmc2V0X2xhYmVsKCJtd19maW5pc2giLDApOworCSZtb3YoJG51bSwmd3BhcmFtKDIpKTsJIyBnZXQgbnVtCisJJmFuZCgkbnVtLDcpOworCSZqbnooJmxhYmVsKCJtd19maW5pc2gyIikpOworCSZqbXAoJmxhYmVsKCJtd19lbmQiKSk7CisKKwkmc2V0X2xhYmVsKCJtd19maW5pc2gyIiwxKTsKKwlmb3IgKCRpPTA7ICRpPDc7ICRpKyspCisJCXsKKwkJJmNvbW1lbnQoIlRhaWwgUm91bmQgJGkiKTsKKwkJICZtb3YoImVheCIsJkRXUCgkaSo0LCRhLCIiLDApKTsjICphCisJCSZtdWwoJHcpOwkJCSMgKmEgKiB3CisJCSZhZGQoImVheCIsJGMpOwkJCSMgTCh0KSs9YworCQkgIyBYWFgKKwkJJmFkYygiZWR4IiwwKTsJCQkjIEgodCkrPWNhcnJ5CisJCSAmbW92KCZEV1AoJGkqNCwkciwiIiwwKSwiZWF4Iik7IyAqcj0gTCh0KTsKKwkJJm1vdigkYywiZWR4Iik7CQkJIyBjPSAgSCh0KTsKKwkJICZkZWMoJG51bSkgaWYgKCRpICE9IDctMSk7CisJCSZqeigmbGFiZWwoIm13X2VuZCIpKSBpZiAoJGkgIT0gNy0xKTsKKwkJfQorCSZzZXRfbGFiZWwoIm13X2VuZCIsMCk7CisJJm1vdigiZWF4IiwkYyk7CisKKwkmZnVuY3Rpb25fZW5kKCRuYW1lKTsKKwl9CisKKzE7CmRpZmYgLS1naXQgYS9jcnlwdG8vYm4vYXNtL3g4Ni9tdWxfYWRkLnBsIGIvY3J5cHRvL2JuL2FzbS94ODYvbXVsX2FkZC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTgzMGQzCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2JuL2FzbS94ODYvbXVsX2FkZC5wbApAQCAtMCwwICsxLDg3IEBACisjIS91c3IvbG9jYWwvYmluL3BlcmwKKyMgeDg2IGFzc2VtYmVyCisKK3N1YiBibl9tdWxfYWRkX3dvcmRzCisJeworCWxvY2FsKCRuYW1lKT1AXzsKKworCSZmdW5jdGlvbl9iZWdpbigkbmFtZSwiIik7CisKKwkmY29tbWVudCgiIik7CisJJExvdz0iZWF4IjsKKwkkSGlnaD0iZWR4IjsKKwkkYT0iZWJ4IjsKKwkkdz0iZWJwIjsKKwkkcj0iZWRpIjsKKwkkYz0iZXNpIjsKKworCSZ4b3IoJGMsJGMpOwkJIyBjbGVhciBjYXJyeQorCSZtb3YoJHIsJndwYXJhbSgwKSk7CSMKKworCSZtb3YoImVjeCIsJndwYXJhbSgyKSk7CSMKKwkmbW92KCRhLCZ3cGFyYW0oMSkpOwkjCisKKwkmYW5kKCJlY3giLDB4ZmZmZmZmZjgpOwkjIG51bSAvIDgKKwkmbW92KCR3LCZ3cGFyYW0oMykpOwkjCisKKwkmcHVzaCgiZWN4Iik7CQkjIFVwIHRoZSBzdGFjayBmb3IgYSB0bXAgdmFyaWFibGUKKworCSZqeigmbGFiZWwoIm1hd19maW5pc2giKSk7CisKKwkmc2V0X2xhYmVsKCJtYXdfbG9vcCIsMCk7CisKKwkmbW92KCZzd3RtcCgwKSwiZWN4Iik7CSMKKworCWZvciAoJGk9MDsgJGk8MzI7ICRpKz00KQorCQl7CisJCSZjb21tZW50KCJSb3VuZCAkaSIpOworCisJCSAmbW92KCJlYXgiLCZEV1AoJGksJGEsIiIsMCkpOyAJIyAqYQorCQkmbXVsKCR3KTsJCQkjICphICogdworCQkmYWRkKCJlYXgiLCRjKTsJCSMgTCh0KSs9ICpyCisJCSAmbW92KCRjLCZEV1AoJGksJHIsIiIsMCkpOwkjIEwodCkrPSAqcgorCQkmYWRjKCJlZHgiLDApOwkJCSMgSCh0KSs9Y2FycnkKKwkJICZhZGQoImVheCIsJGMpOwkJIyBMKHQpKz1jCisJCSZhZGMoImVkeCIsMCk7CQkJIyBIKHQpKz1jYXJyeQorCQkgJm1vdigmRFdQKCRpLCRyLCIiLDApLCJlYXgiKTsJIyAqcj0gTCh0KTsKKwkJJm1vdigkYywiZWR4Iik7CQkJIyBjPSAgSCh0KTsKKwkJfQorCisJJmNvbW1lbnQoIiIpOworCSZtb3YoImVjeCIsJnN3dG1wKDApKTsJIworCSZhZGQoJGEsMzIpOworCSZhZGQoJHIsMzIpOworCSZzdWIoImVjeCIsOCk7CisJJmpueigmbGFiZWwoIm1hd19sb29wIikpOworCisJJnNldF9sYWJlbCgibWF3X2ZpbmlzaCIsMCk7CisJJm1vdigiZWN4Iiwmd3BhcmFtKDIpKTsJIyBnZXQgbnVtCisJJmFuZCgiZWN4Iiw3KTsKKwkmam56KCZsYWJlbCgibWF3X2ZpbmlzaDIiKSk7CSMgaGVscHMgYnJhbmNoIHByZWRpY3Rpb24KKwkmam1wKCZsYWJlbCgibWF3X2VuZCIpKTsKKworCSZzZXRfbGFiZWwoIm1hd19maW5pc2gyIiwxKTsKKwlmb3IgKCRpPTA7ICRpPDc7ICRpKyspCisJCXsKKwkJJmNvbW1lbnQoIlRhaWwgUm91bmQgJGkiKTsKKwkJICZtb3YoImVheCIsJkRXUCgkaSo0LCRhLCIiLDApKTsjICphCisJCSZtdWwoJHcpOwkJCSMgKmEgKiB3CisJCSZhZGQoImVheCIsJGMpOwkJCSMgTCh0KSs9YworCQkgJm1vdigkYywmRFdQKCRpKjQsJHIsIiIsMCkpOwkjIEwodCkrPSAqcgorCQkmYWRjKCJlZHgiLDApOwkJCSMgSCh0KSs9Y2FycnkKKwkJICZhZGQoImVheCIsJGMpOworCQkmYWRjKCJlZHgiLDApOwkJCSMgSCh0KSs9Y2FycnkKKwkJICZkZWMoImVjeCIpIGlmICgkaSAhPSA3LTEpOworCQkmbW92KCZEV1AoJGkqNCwkciwiIiwwKSwiZWF4Iik7CSMgKnI9IEwodCk7CisJCSAmbW92KCRjLCJlZHgiKTsJCQkjIGM9ICBIKHQpOworCQkmanooJmxhYmVsKCJtYXdfZW5kIikpIGlmICgkaSAhPSA3LTEpOworCQl9CisJJnNldF9sYWJlbCgibWF3X2VuZCIsMCk7CisJJm1vdigiZWF4IiwkYyk7CisKKwkmcG9wKCJlY3giKTsJIyBjbGVhciB2YXJpYWJsZSBmcm9tCisKKwkmZnVuY3Rpb25fZW5kKCRuYW1lKTsKKwl9CisKKzE7CmRpZmYgLS1naXQgYS9jcnlwdG8vYm4vYXNtL3g4Ni9zcXIucGwgYi9jcnlwdG8vYm4vYXNtL3g4Ni9zcXIucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY5MDk5MwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9ibi9hc20veDg2L3Nxci5wbApAQCAtMCwwICsxLDYwIEBACisjIS91c3IvbG9jYWwvYmluL3BlcmwKKyMgeDg2IGFzc2VtYmVyCisKK3N1YiBibl9zcXJfd29yZHMKKwl7CisJbG9jYWwoJG5hbWUpPUBfOworCisJJmZ1bmN0aW9uX2JlZ2luKCRuYW1lLCIiKTsKKworCSZjb21tZW50KCIiKTsKKwkkcj0iZXNpIjsKKwkkYT0iZWRpIjsKKwkkbnVtPSJlYngiOworCisJJm1vdigkciwmd3BhcmFtKDApKTsJIworCSZtb3YoJGEsJndwYXJhbSgxKSk7CSMKKwkmbW92KCRudW0sJndwYXJhbSgyKSk7CSMKKworCSZhbmQoJG51bSwweGZmZmZmZmY4KTsJIyBudW0gLyA4CisJJmp6KCZsYWJlbCgic3dfZmluaXNoIikpOworCisJJnNldF9sYWJlbCgic3dfbG9vcCIsMCk7CisJZm9yICgkaT0wOyAkaTwzMjsgJGkrPTQpCisJCXsKKwkJJmNvbW1lbnQoIlJvdW5kICRpIik7CisJCSZtb3YoImVheCIsJkRXUCgkaSwkYSwiIiwwKSk7IAkjICphCisJCSAjIFhYWAorCQkmbXVsKCJlYXgiKTsJCQkjICphICogKmEKKwkJJm1vdigmRFdQKCRpKjIsJHIsIiIsMCksImVheCIpOwkjCisJCSAmbW92KCZEV1AoJGkqMis0LCRyLCIiLDApLCJlZHgiKTsjCisJCX0KKworCSZjb21tZW50KCIiKTsKKwkmYWRkKCRhLDMyKTsKKwkmYWRkKCRyLDY0KTsKKwkmc3ViKCRudW0sOCk7CisJJmpueigmbGFiZWwoInN3X2xvb3AiKSk7CisKKwkmc2V0X2xhYmVsKCJzd19maW5pc2giLDApOworCSZtb3YoJG51bSwmd3BhcmFtKDIpKTsJIyBnZXQgbnVtCisJJmFuZCgkbnVtLDcpOworCSZqeigmbGFiZWwoInN3X2VuZCIpKTsKKworCWZvciAoJGk9MDsgJGk8NzsgJGkrKykKKwkJeworCQkmY29tbWVudCgiVGFpbCBSb3VuZCAkaSIpOworCQkmbW92KCJlYXgiLCZEV1AoJGkqNCwkYSwiIiwwKSk7CSMgKmEKKwkJICMgWFhYCisJCSZtdWwoImVheCIpOwkJCSMgKmEgKiAqYQorCQkmbW92KCZEV1AoJGkqOCwkciwiIiwwKSwiZWF4Iik7CSMKKwkJICZkZWMoJG51bSkgaWYgKCRpICE9IDctMSk7CisJCSZtb3YoJkRXUCgkaSo4KzQsJHIsIiIsMCksImVkeCIpOworCQkgJmp6KCZsYWJlbCgic3dfZW5kIikpIGlmICgkaSAhPSA3LTEpOworCQl9CisJJnNldF9sYWJlbCgic3dfZW5kIiwwKTsKKworCSZmdW5jdGlvbl9lbmQoJG5hbWUpOworCX0KKworMTsKZGlmZiAtLWdpdCBhL2NyeXB0by9ibi9hc20veDg2L3N1Yi5wbCBiL2NyeXB0by9ibi9hc20veDg2L3N1Yi5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzdiMGUxCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2JuL2FzbS94ODYvc3ViLnBsCkBAIC0wLDAgKzEsNzYgQEAKKyMhL3Vzci9sb2NhbC9iaW4vcGVybAorIyB4ODYgYXNzZW1iZXIKKworc3ViIGJuX3N1Yl93b3JkcworCXsKKwlsb2NhbCgkbmFtZSk9QF87CisKKwkmZnVuY3Rpb25fYmVnaW4oJG5hbWUsIiIpOworCisJJmNvbW1lbnQoIiIpOworCSRhPSJlc2kiOworCSRiPSJlZGkiOworCSRjPSJlYXgiOworCSRyPSJlYngiOworCSR0bXAxPSJlY3giOworCSR0bXAyPSJlZHgiOworCSRudW09ImVicCI7CisKKwkmbW92KCRyLCZ3cGFyYW0oMCkpOwkjIGdldCByCisJICZtb3YoJGEsJndwYXJhbSgxKSk7CSMgZ2V0IGEKKwkmbW92KCRiLCZ3cGFyYW0oMikpOwkjIGdldCBiCisJICZtb3YoJG51bSwmd3BhcmFtKDMpKTsJIyBnZXQgbnVtCisJJnhvcigkYywkYyk7CQkjIGNsZWFyIGNhcnJ5CisJICZhbmQoJG51bSwweGZmZmZmZmY4KTsJIyBudW0gLyA4CisKKwkmanooJmxhYmVsKCJhd19maW5pc2giKSk7CisKKwkmc2V0X2xhYmVsKCJhd19sb29wIiwwKTsKKwlmb3IgKCRpPTA7ICRpPDg7ICRpKyspCisJCXsKKwkJJmNvbW1lbnQoIlJvdW5kICRpIik7CisKKwkJJm1vdigkdG1wMSwmRFdQKCRpKjQsJGEsIiIsMCkpOyAJIyAqYQorCQkgJm1vdigkdG1wMiwmRFdQKCRpKjQsJGIsIiIsMCkpOyAJIyAqYgorCQkmc3ViKCR0bXAxLCRjKTsKKwkJICZtb3YoJGMsMCk7CisJCSZhZGMoJGMsJGMpOworCQkgJnN1YigkdG1wMSwkdG1wMik7CisJCSZhZGMoJGMsMCk7CisJCSAmbW92KCZEV1AoJGkqNCwkciwiIiwwKSwkdG1wMSk7IAkjICpyCisJCX0KKworCSZjb21tZW50KCIiKTsKKwkmYWRkKCRhLDMyKTsKKwkgJmFkZCgkYiwzMik7CisJJmFkZCgkciwzMik7CisJICZzdWIoJG51bSw4KTsKKwkmam56KCZsYWJlbCgiYXdfbG9vcCIpKTsKKworCSZzZXRfbGFiZWwoImF3X2ZpbmlzaCIsMCk7CisJJm1vdigkbnVtLCZ3cGFyYW0oMykpOwkjIGdldCBudW0KKwkmYW5kKCRudW0sNyk7CisJICZqeigmbGFiZWwoImF3X2VuZCIpKTsKKworCWZvciAoJGk9MDsgJGk8NzsgJGkrKykKKwkJeworCQkmY29tbWVudCgiVGFpbCBSb3VuZCAkaSIpOworCQkmbW92KCR0bXAxLCZEV1AoJGkqNCwkYSwiIiwwKSk7CSMgKmEKKwkJICZtb3YoJHRtcDIsJkRXUCgkaSo0LCRiLCIiLDApKTsjICpiCisJCSZzdWIoJHRtcDEsJGMpOworCQkgJm1vdigkYywwKTsKKwkJJmFkYygkYywkYyk7CisJCSAmc3ViKCR0bXAxLCR0bXAyKTsKKwkJJmFkYygkYywwKTsKKwkJICZkZWMoJG51bSkgaWYgKCRpICE9IDYpOworCQkmbW92KCZEV1AoJGkqNCwkciwiIiwwKSwkdG1wMSk7CSMgKmEKKwkJICZqeigmbGFiZWwoImF3X2VuZCIpKSBpZiAoJGkgIT0gNik7CisJCX0KKwkmc2V0X2xhYmVsKCJhd19lbmQiLDApOworCisjCSZtb3YoImVheCIsJGMpOwkJIyAkYyBpcyAiZWF4IgorCisJJmZ1bmN0aW9uX2VuZCgkbmFtZSk7CisJfQorCisxOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2JuL2FzbS94ODZfNjQtZ2NjLmMgYi9jcnlwdG8vYm4vYXNtL3g4Nl82NC1nY2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzZmMDAxCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2JuL2FzbS94ODZfNjQtZ2NjLmMKQEAgLTAsMCArMSw2MTMgQEAKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfWDg2XzY0KSAmJiAhZGVmaW5lZChPUEVOU1NMX1dJTkRPV1MpCisKKyNpbmNsdWRlICIuLi9pbnRlcm5hbC5oIgorCisvKiB4ODZfNjQgQklHTlVNIGFjY2VsZXJhdG9yIHZlcnNpb24gMC4xLCBEZWNlbWJlciAyMDAyLgorICoKKyAqIEltcGxlbWVudGVkIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QuCisgKgorICogUmlnaHRzIGZvciByZWRpc3RyaWJ1dGlvbiBhbmQgdXNhZ2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlCisgKiBncmFudGVkIGFjY29yZGluZyB0byB0aGUgT3BlblNTTCBsaWNlbnNlLiBXYXJyYW50eSBvZiBhbnkga2luZCBpcworICogZGlzY2xhaW1lZC4KKyAqCisgKiBRLiBWZXJzaW9uIDAuMT8gSXQgZG9lc24ndCBzb3VuZCBsaWtlIEFuZHksIGhlIHVzZWQgdG8gYXNzaWduIHJlYWwKKyAqICAgIHZlcnNpb25zLCBsaWtlIDEuMC4uLgorICogQS4gV2VsbCwgdGhhdCdzIGJlY2F1c2UgdGhpcyBjb2RlIGlzIGJhc2ljYWxseSBhIHF1aWNrLW4tZGlydHkKKyAqICAgIHByb29mLW9mLWNvbmNlcHQgaGFjay4gQXMgeW91IGNhbiBzZWUgaXQncyBpbXBsZW1lbnRlZCB3aXRoCisgKiAgICBpbmxpbmUgYXNzZW1ibGVyLCB3aGljaCBtZWFucyB0aGF0IHlvdSdyZSBib3VuZCB0byBHQ0MgYW5kIHRoYXQKKyAqICAgIHRoZXJlIG1pZ2h0IGJlIGVub3VnaCByb29tIGZvciBmdXJ0aGVyIGltcHJvdmVtZW50LgorICoKKyAqIFEuIFdoeSBpbmxpbmUgYXNzZW1ibGVyPworICogQS4geDg2XzY0IGZlYXR1cmVzIG93biBBQkkgd2hpY2ggSSdtIG5vdCBmYW1pbGlhciB3aXRoLiBUaGlzIGlzCisgKiAgICB3aHkgSSBkZWNpZGVkIHRvIGxldCB0aGUgY29tcGlsZXIgdGFrZSBjYXJlIG9mIHN1YnJvdXRpbmUKKyAqICAgIHByb2xvZ3VlL2VwaWxvZ3VlIGFzIHdlbGwgYXMgcmVnaXN0ZXIgYWxsb2NhdGlvbi4gRm9yIHJlZmVyZW5jZS4KKyAqICAgIFdpbjY0IGltcGxlbWVudHMgZGlmZmVyZW50IEFCSSBmb3IgQU1ENjQsIGRpZmZlcmVudCBmcm9tIExpbnV4LgorICoKKyAqIFEuIEhvdyBtdWNoIGZhc3RlciBkb2VzIGl0IGdldD8KKyAqIEEuICdhcHBzL29wZW5zc2wgc3BlZWQgcnNhIGRzYScgb3V0cHV0IHdpdGggbm8tYXNtOgorICoKKyAqCSAgICAgICAgICAgICAgICAgIHNpZ24gICAgdmVyaWZ5ICAgIHNpZ24vcyB2ZXJpZnkvcworICoJcnNhICA1MTIgYml0cyAgIDAuMDAwNnMgICAwLjAwMDFzICAgMTY4My44ICAxODQ1Ni4yCisgKglyc2EgMTAyNCBiaXRzICAgMC4wMDI4cyAgIDAuMDAwMnMgICAgMzU2LjAgICA2NDA3LjAKKyAqCXJzYSAyMDQ4IGJpdHMgICAwLjAxNzJzICAgMC4wMDA1cyAgICAgNTguMCAgIDE5NTcuOAorICoJcnNhIDQwOTYgYml0cyAgIDAuMTE1NXMgICAwLjAwMThzICAgICAgOC43ICAgIDU1NS42CisgKgkgICAgICAgICAgICAgICAgICBzaWduICAgIHZlcmlmeSAgICBzaWduL3MgdmVyaWZ5L3MKKyAqCWRzYSAgNTEyIGJpdHMgICAwLjAwMDVzICAgMC4wMDA2cyAgIDIxMDAuOCAgIDE3NjguMworICoJZHNhIDEwMjQgYml0cyAgIDAuMDAxNHMgICAwLjAwMThzICAgIDY5Mi4zICAgIDU1OS4yCisgKglkc2EgMjA0OCBiaXRzICAgMC4wMDQ5cyAgIDAuMDA2MXMgICAgMjA0LjcgICAgMTY1LjAKKyAqCisgKiAgICAnYXBwcy9vcGVuc3NsIHNwZWVkIHJzYSBkc2EnIG91dHB1dCB3aXRoIHRoaXMgbW9kdWxlOgorICoKKyAqCSAgICAgICAgICAgICAgICAgIHNpZ24gICAgdmVyaWZ5ICAgIHNpZ24vcyB2ZXJpZnkvcworICoJcnNhICA1MTIgYml0cyAgIDAuMDAwNHMgICAwLjAwMDBzICAgMjc2Ny4xICAzMzI5Ny45CisgKglyc2EgMTAyNCBiaXRzICAgMC4wMDEycyAgIDAuMDAwMXMgICAgODY3LjQgIDE0Njc0LjcKKyAqCXJzYSAyMDQ4IGJpdHMgICAwLjAwNjFzICAgMC4wMDAycyAgICAxNjQuMCAgIDUyNzAuMAorICoJcnNhIDQwOTYgYml0cyAgIDAuMDM4NHMgICAwLjAwMDZzICAgICAyNi4xICAgMTY1MC44CisgKgkgICAgICAgICAgICAgICAgICBzaWduICAgIHZlcmlmeSAgICBzaWduL3MgdmVyaWZ5L3MKKyAqCWRzYSAgNTEyIGJpdHMgICAwLjAwMDJzICAgMC4wMDAzcyAgIDQ0NDIuMiAgIDM3ODYuMworICoJZHNhIDEwMjQgYml0cyAgIDAuMDAwNXMgICAwLjAwMDdzICAgMTgzNS4xICAgMTQ5Ny40CisgKglkc2EgMjA0OCBiaXRzICAgMC4wMDE2cyAgIDAuMDAyMHMgICAgNjIwLjQgICAgNTA0LjYKKyAqCisgKiAgICBGb3IgdGhlIHJlZmVyZW5jZS4gSUEtMzIgYXNzZW1ibGVyIGltcGxlbWVudGF0aW9uIHBlcmZvcm1zCisgKiAgICB2ZXJ5IG11Y2ggbGlrZSA2NC1iaXQgY29kZSBjb21waWxlZCB3aXRoIG5vLWFzbSBvbiB0aGUgc2FtZQorICogICAgbWFjaGluZS4KKyAqLworCisjdW5kZWYgbXVsCisjdW5kZWYgbXVsX2FkZAorCisjZGVmaW5lIGFzbSBfX2FzbV9fCisKKy8qCisgKiAibSIoYSksICIrbSIocikJaXMgdGhlIHdheSB0byBmYXZvciBEaXJlY3RQYXRoILUtY29kZTsKKyAqICJnIigwKQkJbGV0IHRoZSBjb21waWxlciB0byBkZWNpZGUgd2hlcmUgZG9lcyBpdAorICoJCQl3YW50IHRvIGtlZXAgdGhlIHZhbHVlIG9mIHplcm87CisgKi8KKyNkZWZpbmUgbXVsX2FkZChyLCBhLCB3b3JkLCBjYXJyeSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVnaXN0ZXIgQk5fVUxPTkcgaGlnaCwgbG93OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc20oIm11bHEgJTMiIDogIj1hIihsb3cpLCAiPWQiKGhpZ2gpIDogImEiKHdvcmQpLCAibSIoYSkgOiAiY2MiKTsgXAorICAgIGFzbSgiYWRkcSAlMiwlMDsgYWRjcSAlMywlMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDogIityIihjYXJyeSksICIrZCIoaGlnaCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOiAiYSIobG93KSwgImciKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA6ICJjYyIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXNtKCJhZGRxICUyLCUwOyBhZGNxICUzLCUxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOiAiK20iKHIpLCAiK2QiKGhpZ2gpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA6ICJyIihjYXJyeSksICJnIigwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDogImNjIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXJyeSA9IGhpZ2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIG11bChyLCBhLCB3b3JkLCBjYXJyeSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJlZ2lzdGVyIEJOX1VMT05HIGhpZ2gsIGxvdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXNtKCJtdWxxICUzIiA6ICI9YSIobG93KSwgIj1kIihoaWdoKSA6ICJhIih3b3JkKSwgImciKGEpIDogImNjIik7IFwKKyAgICBhc20oImFkZHEgJTIsJTA7IGFkY3EgJTMsJTEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA6ICIrciIoY2FycnkpLCAiK2QiKGhpZ2gpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDogImEiKGxvdyksICJnIigwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOiAiY2MiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChyKSA9IGNhcnJ5LCBjYXJyeSA9IGhpZ2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisjdW5kZWYgc3FyCisjZGVmaW5lIHNxcihyMCwgcjEsIGEpIGFzbSgibXVscSAlMiIgOiAiPWEiKHIwKSwgIj1kIihyMSkgOiAiYSIoYSkgOiAiY2MiKTsKKworQk5fVUxPTkcgYm5fbXVsX2FkZF93b3JkcyhCTl9VTE9ORyAqcnAsIGNvbnN0IEJOX1VMT05HICphcCwgaW50IG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk5fVUxPTkcgdykgeworICBCTl9VTE9ORyBjMSA9IDA7CisKKyAgaWYgKG51bSA8PSAwKQorICAgIHJldHVybiAoYzEpOworCisgIHdoaWxlIChudW0gJiB+MykgeworICAgIG11bF9hZGQocnBbMF0sIGFwWzBdLCB3LCBjMSk7CisgICAgbXVsX2FkZChycFsxXSwgYXBbMV0sIHcsIGMxKTsKKyAgICBtdWxfYWRkKHJwWzJdLCBhcFsyXSwgdywgYzEpOworICAgIG11bF9hZGQocnBbM10sIGFwWzNdLCB3LCBjMSk7CisgICAgYXAgKz0gNDsKKyAgICBycCArPSA0OworICAgIG51bSAtPSA0OworICB9CisgIGlmIChudW0pIHsKKyAgICBtdWxfYWRkKHJwWzBdLCBhcFswXSwgdywgYzEpOworICAgIGlmICgtLW51bSA9PSAwKQorICAgICAgcmV0dXJuIGMxOworICAgIG11bF9hZGQocnBbMV0sIGFwWzFdLCB3LCBjMSk7CisgICAgaWYgKC0tbnVtID09IDApCisgICAgICByZXR1cm4gYzE7CisgICAgbXVsX2FkZChycFsyXSwgYXBbMl0sIHcsIGMxKTsKKyAgICByZXR1cm4gYzE7CisgIH0KKworICByZXR1cm4gKGMxKTsKK30KKworQk5fVUxPTkcgYm5fbXVsX3dvcmRzKEJOX1VMT05HICpycCwgY29uc3QgQk5fVUxPTkcgKmFwLCBpbnQgbnVtLCBCTl9VTE9ORyB3KSB7CisgIEJOX1VMT05HIGMxID0gMDsKKworICBpZiAobnVtIDw9IDApCisgICAgcmV0dXJuIChjMSk7CisKKyAgd2hpbGUgKG51bSAmIH4zKSB7CisgICAgbXVsKHJwWzBdLCBhcFswXSwgdywgYzEpOworICAgIG11bChycFsxXSwgYXBbMV0sIHcsIGMxKTsKKyAgICBtdWwocnBbMl0sIGFwWzJdLCB3LCBjMSk7CisgICAgbXVsKHJwWzNdLCBhcFszXSwgdywgYzEpOworICAgIGFwICs9IDQ7CisgICAgcnAgKz0gNDsKKyAgICBudW0gLT0gNDsKKyAgfQorICBpZiAobnVtKSB7CisgICAgbXVsKHJwWzBdLCBhcFswXSwgdywgYzEpOworICAgIGlmICgtLW51bSA9PSAwKQorICAgICAgcmV0dXJuIGMxOworICAgIG11bChycFsxXSwgYXBbMV0sIHcsIGMxKTsKKyAgICBpZiAoLS1udW0gPT0gMCkKKyAgICAgIHJldHVybiBjMTsKKyAgICBtdWwocnBbMl0sIGFwWzJdLCB3LCBjMSk7CisgIH0KKyAgcmV0dXJuIChjMSk7Cit9CisKK3ZvaWQgYm5fc3FyX3dvcmRzKEJOX1VMT05HICpyLCBjb25zdCBCTl9VTE9ORyAqYSwgaW50IG4pIHsKKyAgaWYgKG4gPD0gMCkKKyAgICByZXR1cm47CisKKyAgd2hpbGUgKG4gJiB+MykgeworICAgIHNxcihyWzBdLCByWzFdLCBhWzBdKTsKKyAgICBzcXIoclsyXSwgclszXSwgYVsxXSk7CisgICAgc3FyKHJbNF0sIHJbNV0sIGFbMl0pOworICAgIHNxcihyWzZdLCByWzddLCBhWzNdKTsKKyAgICBhICs9IDQ7CisgICAgciArPSA4OworICAgIG4gLT0gNDsKKyAgfQorICBpZiAobikgeworICAgIHNxcihyWzBdLCByWzFdLCBhWzBdKTsKKyAgICBpZiAoLS1uID09IDApCisgICAgICByZXR1cm47CisgICAgc3FyKHJbMl0sIHJbM10sIGFbMV0pOworICAgIGlmICgtLW4gPT0gMCkKKyAgICAgIHJldHVybjsKKyAgICBzcXIocls0XSwgcls1XSwgYVsyXSk7CisgIH0KK30KKworQk5fVUxPTkcgYm5fZGl2X3dvcmRzKEJOX1VMT05HIGgsIEJOX1VMT05HIGwsIEJOX1VMT05HIGQpIHsKKyAgQk5fVUxPTkcgcmV0LCB3YXN0ZTsKKworICBhc20oImRpdnEJJTQiIDogIj1hIihyZXQpLCAiPWQiKHdhc3RlKSA6ICJhIihsKSwgImQiKGgpLCAiZyIoZCkgOiAiY2MiKTsKKworICByZXR1cm4gcmV0OworfQorCitCTl9VTE9ORyBibl9hZGRfd29yZHMoQk5fVUxPTkcgKnJwLCBjb25zdCBCTl9VTE9ORyAqYXAsIGNvbnN0IEJOX1VMT05HICpicCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbikgeworICBCTl9VTE9ORyByZXQ7CisgIHNpemVfdCBpID0gMDsKKworICBpZiAobiA8PSAwKQorICAgIHJldHVybiAwOworCisgIGFzbSgiCXN1YnEJJTAsJTAJCVxuIiAvKiBjbGVhciBjYXJyeSAqLworICAgICAgIglqbXAJMWYJCVxuIgorICAgICAgIi5wMmFsaWduIDQJCQlcbiIKKyAgICAgICIxOgltb3ZxCSglNCwlMiw4KSwlMAlcbiIKKyAgICAgICIJYWRjcQkoJTUsJTIsOCksJTAJXG4iCisgICAgICAiCW1vdnEJJTAsKCUzLCUyLDgpCVxuIgorICAgICAgIglsZWEJMSglMiksJTIJXG4iCisgICAgICAiCWxvb3AJMWIJCVxuIgorICAgICAgIglzYmJxCSUwLCUwCQlcbiIKKyAgICAgIDogIj0mciIocmV0KSwgIitjIihuKSwgIityIihpKQorICAgICAgOiAiciIocnApLCAiciIoYXApLCAiciIoYnApCisgICAgICA6ICJjYyIpOworCisgIHJldHVybiByZXQgJiAxOworfQorCisjaWZuZGVmIFNJTUlDUworQk5fVUxPTkcgYm5fc3ViX3dvcmRzKEJOX1VMT05HICpycCwgY29uc3QgQk5fVUxPTkcgKmFwLCBjb25zdCBCTl9VTE9ORyAqYnAsCisgICAgICAgICAgICAgICAgICAgICAgaW50IG4pIHsKKyAgQk5fVUxPTkcgcmV0OworICBzaXplX3QgaSA9IDA7CisKKyAgaWYgKG4gPD0gMCkKKyAgICByZXR1cm4gMDsKKworICBhc20oIglzdWJxCSUwLCUwCQlcbiIgLyogY2xlYXIgYm9ycm93ICovCisgICAgICAiCWptcAkxZgkJXG4iCisgICAgICAiLnAyYWxpZ24gNAkJCVxuIgorICAgICAgIjE6CW1vdnEJKCU0LCUyLDgpLCUwCVxuIgorICAgICAgIglzYmJxCSglNSwlMiw4KSwlMAlcbiIKKyAgICAgICIJbW92cQklMCwoJTMsJTIsOCkJXG4iCisgICAgICAiCWxlYQkxKCUyKSwlMglcbiIKKyAgICAgICIJbG9vcAkxYgkJXG4iCisgICAgICAiCXNiYnEJJTAsJTAJCVxuIgorICAgICAgOiAiPSZyIihyZXQpLCAiK2MiKG4pLCAiK3IiKGkpCisgICAgICA6ICJyIihycCksICJyIihhcCksICJyIihicCkKKyAgICAgIDogImNjIik7CisKKyAgcmV0dXJuIHJldCAmIDE7Cit9CisjZWxzZQorLyogU2ltaWNzIDEuNDw3IGhhcyBidWdneSBzYmJxOi0oICovCisjZGVmaW5lIEJOX01BU0syIDB4ZmZmZmZmZmZmZmZmZmZmZkwKK0JOX1VMT05HIGJuX3N1Yl93b3JkcyhCTl9VTE9ORyAqciwgQk5fVUxPTkcgKmEsIEJOX1VMT05HICpiLCBpbnQgbikgeworICBCTl9VTE9ORyB0MSwgdDI7CisgIGludCBjID0gMDsKKworICBpZiAobiA8PSAwKQorICAgIHJldHVybiAoKEJOX1VMT05HKTApOworCisgIGZvciAoOzspIHsKKyAgICB0MSA9IGFbMF07CisgICAgdDIgPSBiWzBdOworICAgIHJbMF0gPSAodDEgLSB0MiAtIGMpICYgQk5fTUFTSzI7CisgICAgaWYgKHQxICE9IHQyKQorICAgICAgYyA9ICh0MSA8IHQyKTsKKyAgICBpZiAoLS1uIDw9IDApCisgICAgICBicmVhazsKKworICAgIHQxID0gYVsxXTsKKyAgICB0MiA9IGJbMV07CisgICAgclsxXSA9ICh0MSAtIHQyIC0gYykgJiBCTl9NQVNLMjsKKyAgICBpZiAodDEgIT0gdDIpCisgICAgICBjID0gKHQxIDwgdDIpOworICAgIGlmICgtLW4gPD0gMCkKKyAgICAgIGJyZWFrOworCisgICAgdDEgPSBhWzJdOworICAgIHQyID0gYlsyXTsKKyAgICByWzJdID0gKHQxIC0gdDIgLSBjKSAmIEJOX01BU0syOworICAgIGlmICh0MSAhPSB0MikKKyAgICAgIGMgPSAodDEgPCB0Mik7CisgICAgaWYgKC0tbiA8PSAwKQorICAgICAgYnJlYWs7CisKKyAgICB0MSA9IGFbM107CisgICAgdDIgPSBiWzNdOworICAgIHJbM10gPSAodDEgLSB0MiAtIGMpICYgQk5fTUFTSzI7CisgICAgaWYgKHQxICE9IHQyKQorICAgICAgYyA9ICh0MSA8IHQyKTsKKyAgICBpZiAoLS1uIDw9IDApCisgICAgICBicmVhazsKKworICAgIGEgKz0gNDsKKyAgICBiICs9IDQ7CisgICAgciArPSA0OworICB9CisgIHJldHVybiAoYyk7Cit9CisjZW5kaWYKKworLyogbXVsX2FkZF9jKGEsYixjMCxjMSxjMikgIC0tIGMrPWEqYiBmb3IgdGhyZWUgd29yZCBudW1iZXIgYz0oYzIsYzEsYzApICovCisvKiBtdWxfYWRkX2MyKGEsYixjMCxjMSxjMikgLS0gYys9MiphKmIgZm9yIHRocmVlIHdvcmQgbnVtYmVyIGM9KGMyLGMxLGMwKSAqLworLyogc3FyX2FkZF9jKGEsaSxjMCxjMSxjMikgIC0tIGMrPWFbaV1eMiBmb3IgdGhyZWUgd29yZCBudW1iZXIgYz0oYzIsYzEsYzApICovCisvKiBzcXJfYWRkX2MyKGEsaSxjMCxjMSxjMikgLS0gYys9MiphW2ldKmFbal0gZm9yIHRocmVlIHdvcmQgbnVtYmVyIGM9KGMyLGMxLGMwKQorICovCisKKyNpZiAwCisvKiBvcmlnaW5hbCBtYWNyb3MgYXJlIGtlcHQgZm9yIHJlZmVyZW5jZSBwdXJwb3NlcyAqLworI2RlZmluZSBtdWxfYWRkX2MoYSwgYiwgYzAsIGMxLCBjMikgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJOX1VMT05HIHRhID0gKGEpLCB0YiA9IChiKTsgICAgXAorICAgIHQxID0gdGEgKiB0YjsgICAgICAgICAgICAgICAgICAgXAorICAgIHQyID0gQk5fVU1VTFRfSElHSCh0YSwgdGIpOyAgICAgXAorICAgIGMwICs9IHQxOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHQyICs9IChjMCA8IHQxKSA/IDEgOiAwOyAgICAgICAgXAorICAgIGMxICs9IHQyOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGMyICs9IChjMSA8IHQyKSA/IDEgOiAwOyAgICAgICAgXAorICB9CisKKyNkZWZpbmUgbXVsX2FkZF9jMihhLCBiLCBjMCwgYzEsIGMyKSBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJOX1VMT05HIHRhID0gKGEpLCB0YiA9IChiKSwgdDA7IFwKKyAgICB0MSA9IEJOX1VNVUxUX0hJR0godGEsIHRiKTsgICAgICBcCisgICAgdDAgPSB0YSAqIHRiOyAgICAgICAgICAgICAgICAgICAgXAorICAgIHQyID0gdDEgKyB0MTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjMiArPSAodDIgPCB0MSkgPyAxIDogMDsgICAgICAgICBcCisgICAgdDEgPSB0MCArIHQwOyAgICAgICAgICAgICAgICAgICAgXAorICAgIHQyICs9ICh0MSA8IHQwKSA/IDEgOiAwOyAgICAgICAgIFwKKyAgICBjMCArPSB0MTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdDIgKz0gKGMwIDwgdDEpID8gMSA6IDA7ICAgICAgICAgXAorICAgIGMxICs9IHQyOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjMiArPSAoYzEgPCB0MikgPyAxIDogMDsgICAgICAgICBcCisgIH0KKyNlbHNlCisjZGVmaW5lIG11bF9hZGRfYyhhLCBiLCBjMCwgYzEsIGMyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzbSgibXVscSAlMyIgOiAiPWEiKHQxKSwgIj1kIih0MikgOiAiYSIoYSksICJtIihiKSA6ICJjYyIpOyBcCisgICAgYXNtKCJhZGRxICUyLCUwOyBhZGNxICUzLCUxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOiAiK3IiKGMwKSwgIitkIih0MikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA6ICJhIih0MSksICJnIigwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDogImNjIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc20oImFkZHEgJTIsJTA7IGFkY3EgJTMsJTEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA6ICIrciIoYzEpLCAiK3IiKGMyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDogImQiKHQyKSwgImciKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOiAiY2MiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIHNxcl9hZGRfYyhhLCBpLCBjMCwgYzEsIGMyKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXNtKCJtdWxxICUyIiA6ICI9YSIodDEpLCAiPWQiKHQyKSA6ICJhIihhW2ldKSA6ICJjYyIpOyBcCisgICAgYXNtKCJhZGRxICUyLCUwOyBhZGNxICUzLCUxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDogIityIihjMCksICIrZCIodDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDogImEiKHQxKSwgImciKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDogImNjIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXNtKCJhZGRxICUyLCUwOyBhZGNxICUzLCUxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDogIityIihjMSksICIrciIoYzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDogImQiKHQyKSwgImciKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDogImNjIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgbXVsX2FkZF9jMihhLCBiLCBjMCwgYzEsIGMyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc20oIm11bHEgJTMiIDogIj1hIih0MSksICI9ZCIodDIpIDogImEiKGEpLCAibSIoYikgOiAiY2MiKTsgICAgICAgIFwKKyAgICBhc20oImFkZHEgJTAsJTA7IGFkY3EgJTIsJTEiIDogIitkIih0MiksICIrciIoYzIpIDogImciKDApIDogImNjIik7IFwKKyAgICBhc20oImFkZHEgJTAsJTA7IGFkY3EgJTIsJTEiIDogIithIih0MSksICIrZCIodDIpIDogImciKDApIDogImNjIik7IFwKKyAgICBhc20oImFkZHEgJTIsJTA7IGFkY3EgJTMsJTEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOiAiK3IiKGMwKSwgIitkIih0MikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOiAiYSIodDEpLCAiZyIoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOiAiY2MiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc20oImFkZHEgJTIsJTA7IGFkY3EgJTMsJTEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOiAiK3IiKGMxKSwgIityIihjMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOiAiZCIodDIpLCAiZyIoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOiAiY2MiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjZGVmaW5lIHNxcl9hZGRfYzIoYSwgaSwgaiwgYzAsIGMxLCBjMikgbXVsX2FkZF9jMigoYSlbaV0sIChhKVtqXSwgYzAsIGMxLCBjMikKKwordm9pZCBibl9tdWxfY29tYmE4KEJOX1VMT05HICpyLCBCTl9VTE9ORyAqYSwgQk5fVUxPTkcgKmIpIHsKKyAgQk5fVUxPTkcgdDEsIHQyOworICBCTl9VTE9ORyBjMSwgYzIsIGMzOworCisgIGMxID0gMDsKKyAgYzIgPSAwOworICBjMyA9IDA7CisgIG11bF9hZGRfYyhhWzBdLCBiWzBdLCBjMSwgYzIsIGMzKTsKKyAgclswXSA9IGMxOworICBjMSA9IDA7CisgIG11bF9hZGRfYyhhWzBdLCBiWzFdLCBjMiwgYzMsIGMxKTsKKyAgbXVsX2FkZF9jKGFbMV0sIGJbMF0sIGMyLCBjMywgYzEpOworICByWzFdID0gYzI7CisgIGMyID0gMDsKKyAgbXVsX2FkZF9jKGFbMl0sIGJbMF0sIGMzLCBjMSwgYzIpOworICBtdWxfYWRkX2MoYVsxXSwgYlsxXSwgYzMsIGMxLCBjMik7CisgIG11bF9hZGRfYyhhWzBdLCBiWzJdLCBjMywgYzEsIGMyKTsKKyAgclsyXSA9IGMzOworICBjMyA9IDA7CisgIG11bF9hZGRfYyhhWzBdLCBiWzNdLCBjMSwgYzIsIGMzKTsKKyAgbXVsX2FkZF9jKGFbMV0sIGJbMl0sIGMxLCBjMiwgYzMpOworICBtdWxfYWRkX2MoYVsyXSwgYlsxXSwgYzEsIGMyLCBjMyk7CisgIG11bF9hZGRfYyhhWzNdLCBiWzBdLCBjMSwgYzIsIGMzKTsKKyAgclszXSA9IGMxOworICBjMSA9IDA7CisgIG11bF9hZGRfYyhhWzRdLCBiWzBdLCBjMiwgYzMsIGMxKTsKKyAgbXVsX2FkZF9jKGFbM10sIGJbMV0sIGMyLCBjMywgYzEpOworICBtdWxfYWRkX2MoYVsyXSwgYlsyXSwgYzIsIGMzLCBjMSk7CisgIG11bF9hZGRfYyhhWzFdLCBiWzNdLCBjMiwgYzMsIGMxKTsKKyAgbXVsX2FkZF9jKGFbMF0sIGJbNF0sIGMyLCBjMywgYzEpOworICByWzRdID0gYzI7CisgIGMyID0gMDsKKyAgbXVsX2FkZF9jKGFbMF0sIGJbNV0sIGMzLCBjMSwgYzIpOworICBtdWxfYWRkX2MoYVsxXSwgYls0XSwgYzMsIGMxLCBjMik7CisgIG11bF9hZGRfYyhhWzJdLCBiWzNdLCBjMywgYzEsIGMyKTsKKyAgbXVsX2FkZF9jKGFbM10sIGJbMl0sIGMzLCBjMSwgYzIpOworICBtdWxfYWRkX2MoYVs0XSwgYlsxXSwgYzMsIGMxLCBjMik7CisgIG11bF9hZGRfYyhhWzVdLCBiWzBdLCBjMywgYzEsIGMyKTsKKyAgcls1XSA9IGMzOworICBjMyA9IDA7CisgIG11bF9hZGRfYyhhWzZdLCBiWzBdLCBjMSwgYzIsIGMzKTsKKyAgbXVsX2FkZF9jKGFbNV0sIGJbMV0sIGMxLCBjMiwgYzMpOworICBtdWxfYWRkX2MoYVs0XSwgYlsyXSwgYzEsIGMyLCBjMyk7CisgIG11bF9hZGRfYyhhWzNdLCBiWzNdLCBjMSwgYzIsIGMzKTsKKyAgbXVsX2FkZF9jKGFbMl0sIGJbNF0sIGMxLCBjMiwgYzMpOworICBtdWxfYWRkX2MoYVsxXSwgYls1XSwgYzEsIGMyLCBjMyk7CisgIG11bF9hZGRfYyhhWzBdLCBiWzZdLCBjMSwgYzIsIGMzKTsKKyAgcls2XSA9IGMxOworICBjMSA9IDA7CisgIG11bF9hZGRfYyhhWzBdLCBiWzddLCBjMiwgYzMsIGMxKTsKKyAgbXVsX2FkZF9jKGFbMV0sIGJbNl0sIGMyLCBjMywgYzEpOworICBtdWxfYWRkX2MoYVsyXSwgYls1XSwgYzIsIGMzLCBjMSk7CisgIG11bF9hZGRfYyhhWzNdLCBiWzRdLCBjMiwgYzMsIGMxKTsKKyAgbXVsX2FkZF9jKGFbNF0sIGJbM10sIGMyLCBjMywgYzEpOworICBtdWxfYWRkX2MoYVs1XSwgYlsyXSwgYzIsIGMzLCBjMSk7CisgIG11bF9hZGRfYyhhWzZdLCBiWzFdLCBjMiwgYzMsIGMxKTsKKyAgbXVsX2FkZF9jKGFbN10sIGJbMF0sIGMyLCBjMywgYzEpOworICByWzddID0gYzI7CisgIGMyID0gMDsKKyAgbXVsX2FkZF9jKGFbN10sIGJbMV0sIGMzLCBjMSwgYzIpOworICBtdWxfYWRkX2MoYVs2XSwgYlsyXSwgYzMsIGMxLCBjMik7CisgIG11bF9hZGRfYyhhWzVdLCBiWzNdLCBjMywgYzEsIGMyKTsKKyAgbXVsX2FkZF9jKGFbNF0sIGJbNF0sIGMzLCBjMSwgYzIpOworICBtdWxfYWRkX2MoYVszXSwgYls1XSwgYzMsIGMxLCBjMik7CisgIG11bF9hZGRfYyhhWzJdLCBiWzZdLCBjMywgYzEsIGMyKTsKKyAgbXVsX2FkZF9jKGFbMV0sIGJbN10sIGMzLCBjMSwgYzIpOworICByWzhdID0gYzM7CisgIGMzID0gMDsKKyAgbXVsX2FkZF9jKGFbMl0sIGJbN10sIGMxLCBjMiwgYzMpOworICBtdWxfYWRkX2MoYVszXSwgYls2XSwgYzEsIGMyLCBjMyk7CisgIG11bF9hZGRfYyhhWzRdLCBiWzVdLCBjMSwgYzIsIGMzKTsKKyAgbXVsX2FkZF9jKGFbNV0sIGJbNF0sIGMxLCBjMiwgYzMpOworICBtdWxfYWRkX2MoYVs2XSwgYlszXSwgYzEsIGMyLCBjMyk7CisgIG11bF9hZGRfYyhhWzddLCBiWzJdLCBjMSwgYzIsIGMzKTsKKyAgcls5XSA9IGMxOworICBjMSA9IDA7CisgIG11bF9hZGRfYyhhWzddLCBiWzNdLCBjMiwgYzMsIGMxKTsKKyAgbXVsX2FkZF9jKGFbNl0sIGJbNF0sIGMyLCBjMywgYzEpOworICBtdWxfYWRkX2MoYVs1XSwgYls1XSwgYzIsIGMzLCBjMSk7CisgIG11bF9hZGRfYyhhWzRdLCBiWzZdLCBjMiwgYzMsIGMxKTsKKyAgbXVsX2FkZF9jKGFbM10sIGJbN10sIGMyLCBjMywgYzEpOworICByWzEwXSA9IGMyOworICBjMiA9IDA7CisgIG11bF9hZGRfYyhhWzRdLCBiWzddLCBjMywgYzEsIGMyKTsKKyAgbXVsX2FkZF9jKGFbNV0sIGJbNl0sIGMzLCBjMSwgYzIpOworICBtdWxfYWRkX2MoYVs2XSwgYls1XSwgYzMsIGMxLCBjMik7CisgIG11bF9hZGRfYyhhWzddLCBiWzRdLCBjMywgYzEsIGMyKTsKKyAgclsxMV0gPSBjMzsKKyAgYzMgPSAwOworICBtdWxfYWRkX2MoYVs3XSwgYls1XSwgYzEsIGMyLCBjMyk7CisgIG11bF9hZGRfYyhhWzZdLCBiWzZdLCBjMSwgYzIsIGMzKTsKKyAgbXVsX2FkZF9jKGFbNV0sIGJbN10sIGMxLCBjMiwgYzMpOworICByWzEyXSA9IGMxOworICBjMSA9IDA7CisgIG11bF9hZGRfYyhhWzZdLCBiWzddLCBjMiwgYzMsIGMxKTsKKyAgbXVsX2FkZF9jKGFbN10sIGJbNl0sIGMyLCBjMywgYzEpOworICByWzEzXSA9IGMyOworICBjMiA9IDA7CisgIG11bF9hZGRfYyhhWzddLCBiWzddLCBjMywgYzEsIGMyKTsKKyAgclsxNF0gPSBjMzsKKyAgclsxNV0gPSBjMTsKK30KKwordm9pZCBibl9tdWxfY29tYmE0KEJOX1VMT05HICpyLCBCTl9VTE9ORyAqYSwgQk5fVUxPTkcgKmIpIHsKKyAgQk5fVUxPTkcgdDEsIHQyOworICBCTl9VTE9ORyBjMSwgYzIsIGMzOworCisgIGMxID0gMDsKKyAgYzIgPSAwOworICBjMyA9IDA7CisgIG11bF9hZGRfYyhhWzBdLCBiWzBdLCBjMSwgYzIsIGMzKTsKKyAgclswXSA9IGMxOworICBjMSA9IDA7CisgIG11bF9hZGRfYyhhWzBdLCBiWzFdLCBjMiwgYzMsIGMxKTsKKyAgbXVsX2FkZF9jKGFbMV0sIGJbMF0sIGMyLCBjMywgYzEpOworICByWzFdID0gYzI7CisgIGMyID0gMDsKKyAgbXVsX2FkZF9jKGFbMl0sIGJbMF0sIGMzLCBjMSwgYzIpOworICBtdWxfYWRkX2MoYVsxXSwgYlsxXSwgYzMsIGMxLCBjMik7CisgIG11bF9hZGRfYyhhWzBdLCBiWzJdLCBjMywgYzEsIGMyKTsKKyAgclsyXSA9IGMzOworICBjMyA9IDA7CisgIG11bF9hZGRfYyhhWzBdLCBiWzNdLCBjMSwgYzIsIGMzKTsKKyAgbXVsX2FkZF9jKGFbMV0sIGJbMl0sIGMxLCBjMiwgYzMpOworICBtdWxfYWRkX2MoYVsyXSwgYlsxXSwgYzEsIGMyLCBjMyk7CisgIG11bF9hZGRfYyhhWzNdLCBiWzBdLCBjMSwgYzIsIGMzKTsKKyAgclszXSA9IGMxOworICBjMSA9IDA7CisgIG11bF9hZGRfYyhhWzNdLCBiWzFdLCBjMiwgYzMsIGMxKTsKKyAgbXVsX2FkZF9jKGFbMl0sIGJbMl0sIGMyLCBjMywgYzEpOworICBtdWxfYWRkX2MoYVsxXSwgYlszXSwgYzIsIGMzLCBjMSk7CisgIHJbNF0gPSBjMjsKKyAgYzIgPSAwOworICBtdWxfYWRkX2MoYVsyXSwgYlszXSwgYzMsIGMxLCBjMik7CisgIG11bF9hZGRfYyhhWzNdLCBiWzJdLCBjMywgYzEsIGMyKTsKKyAgcls1XSA9IGMzOworICBjMyA9IDA7CisgIG11bF9hZGRfYyhhWzNdLCBiWzNdLCBjMSwgYzIsIGMzKTsKKyAgcls2XSA9IGMxOworICByWzddID0gYzI7Cit9CisKK3ZvaWQgYm5fc3FyX2NvbWJhOChCTl9VTE9ORyAqciwgY29uc3QgQk5fVUxPTkcgKmEpIHsKKyAgQk5fVUxPTkcgdDEsIHQyOworICBCTl9VTE9ORyBjMSwgYzIsIGMzOworCisgIGMxID0gMDsKKyAgYzIgPSAwOworICBjMyA9IDA7CisgIHNxcl9hZGRfYyhhLCAwLCBjMSwgYzIsIGMzKTsKKyAgclswXSA9IGMxOworICBjMSA9IDA7CisgIHNxcl9hZGRfYzIoYSwgMSwgMCwgYzIsIGMzLCBjMSk7CisgIHJbMV0gPSBjMjsKKyAgYzIgPSAwOworICBzcXJfYWRkX2MoYSwgMSwgYzMsIGMxLCBjMik7CisgIHNxcl9hZGRfYzIoYSwgMiwgMCwgYzMsIGMxLCBjMik7CisgIHJbMl0gPSBjMzsKKyAgYzMgPSAwOworICBzcXJfYWRkX2MyKGEsIDMsIDAsIGMxLCBjMiwgYzMpOworICBzcXJfYWRkX2MyKGEsIDIsIDEsIGMxLCBjMiwgYzMpOworICByWzNdID0gYzE7CisgIGMxID0gMDsKKyAgc3FyX2FkZF9jKGEsIDIsIGMyLCBjMywgYzEpOworICBzcXJfYWRkX2MyKGEsIDMsIDEsIGMyLCBjMywgYzEpOworICBzcXJfYWRkX2MyKGEsIDQsIDAsIGMyLCBjMywgYzEpOworICByWzRdID0gYzI7CisgIGMyID0gMDsKKyAgc3FyX2FkZF9jMihhLCA1LCAwLCBjMywgYzEsIGMyKTsKKyAgc3FyX2FkZF9jMihhLCA0LCAxLCBjMywgYzEsIGMyKTsKKyAgc3FyX2FkZF9jMihhLCAzLCAyLCBjMywgYzEsIGMyKTsKKyAgcls1XSA9IGMzOworICBjMyA9IDA7CisgIHNxcl9hZGRfYyhhLCAzLCBjMSwgYzIsIGMzKTsKKyAgc3FyX2FkZF9jMihhLCA0LCAyLCBjMSwgYzIsIGMzKTsKKyAgc3FyX2FkZF9jMihhLCA1LCAxLCBjMSwgYzIsIGMzKTsKKyAgc3FyX2FkZF9jMihhLCA2LCAwLCBjMSwgYzIsIGMzKTsKKyAgcls2XSA9IGMxOworICBjMSA9IDA7CisgIHNxcl9hZGRfYzIoYSwgNywgMCwgYzIsIGMzLCBjMSk7CisgIHNxcl9hZGRfYzIoYSwgNiwgMSwgYzIsIGMzLCBjMSk7CisgIHNxcl9hZGRfYzIoYSwgNSwgMiwgYzIsIGMzLCBjMSk7CisgIHNxcl9hZGRfYzIoYSwgNCwgMywgYzIsIGMzLCBjMSk7CisgIHJbN10gPSBjMjsKKyAgYzIgPSAwOworICBzcXJfYWRkX2MoYSwgNCwgYzMsIGMxLCBjMik7CisgIHNxcl9hZGRfYzIoYSwgNSwgMywgYzMsIGMxLCBjMik7CisgIHNxcl9hZGRfYzIoYSwgNiwgMiwgYzMsIGMxLCBjMik7CisgIHNxcl9hZGRfYzIoYSwgNywgMSwgYzMsIGMxLCBjMik7CisgIHJbOF0gPSBjMzsKKyAgYzMgPSAwOworICBzcXJfYWRkX2MyKGEsIDcsIDIsIGMxLCBjMiwgYzMpOworICBzcXJfYWRkX2MyKGEsIDYsIDMsIGMxLCBjMiwgYzMpOworICBzcXJfYWRkX2MyKGEsIDUsIDQsIGMxLCBjMiwgYzMpOworICByWzldID0gYzE7CisgIGMxID0gMDsKKyAgc3FyX2FkZF9jKGEsIDUsIGMyLCBjMywgYzEpOworICBzcXJfYWRkX2MyKGEsIDYsIDQsIGMyLCBjMywgYzEpOworICBzcXJfYWRkX2MyKGEsIDcsIDMsIGMyLCBjMywgYzEpOworICByWzEwXSA9IGMyOworICBjMiA9IDA7CisgIHNxcl9hZGRfYzIoYSwgNywgNCwgYzMsIGMxLCBjMik7CisgIHNxcl9hZGRfYzIoYSwgNiwgNSwgYzMsIGMxLCBjMik7CisgIHJbMTFdID0gYzM7CisgIGMzID0gMDsKKyAgc3FyX2FkZF9jKGEsIDYsIGMxLCBjMiwgYzMpOworICBzcXJfYWRkX2MyKGEsIDcsIDUsIGMxLCBjMiwgYzMpOworICByWzEyXSA9IGMxOworICBjMSA9IDA7CisgIHNxcl9hZGRfYzIoYSwgNywgNiwgYzIsIGMzLCBjMSk7CisgIHJbMTNdID0gYzI7CisgIGMyID0gMDsKKyAgc3FyX2FkZF9jKGEsIDcsIGMzLCBjMSwgYzIpOworICByWzE0XSA9IGMzOworICByWzE1XSA9IGMxOworfQorCit2b2lkIGJuX3Nxcl9jb21iYTQoQk5fVUxPTkcgKnIsIGNvbnN0IEJOX1VMT05HICphKSB7CisgIEJOX1VMT05HIHQxLCB0MjsKKyAgQk5fVUxPTkcgYzEsIGMyLCBjMzsKKworICBjMSA9IDA7CisgIGMyID0gMDsKKyAgYzMgPSAwOworICBzcXJfYWRkX2MoYSwgMCwgYzEsIGMyLCBjMyk7CisgIHJbMF0gPSBjMTsKKyAgYzEgPSAwOworICBzcXJfYWRkX2MyKGEsIDEsIDAsIGMyLCBjMywgYzEpOworICByWzFdID0gYzI7CisgIGMyID0gMDsKKyAgc3FyX2FkZF9jKGEsIDEsIGMzLCBjMSwgYzIpOworICBzcXJfYWRkX2MyKGEsIDIsIDAsIGMzLCBjMSwgYzIpOworICByWzJdID0gYzM7CisgIGMzID0gMDsKKyAgc3FyX2FkZF9jMihhLCAzLCAwLCBjMSwgYzIsIGMzKTsKKyAgc3FyX2FkZF9jMihhLCAyLCAxLCBjMSwgYzIsIGMzKTsKKyAgclszXSA9IGMxOworICBjMSA9IDA7CisgIHNxcl9hZGRfYyhhLCAyLCBjMiwgYzMsIGMxKTsKKyAgc3FyX2FkZF9jMihhLCAzLCAxLCBjMiwgYzMsIGMxKTsKKyAgcls0XSA9IGMyOworICBjMiA9IDA7CisgIHNxcl9hZGRfYzIoYSwgMywgMiwgYzMsIGMxLCBjMik7CisgIHJbNV0gPSBjMzsKKyAgYzMgPSAwOworICBzcXJfYWRkX2MoYSwgMywgYzEsIGMyLCBjMyk7CisgIHJbNl0gPSBjMTsKKyAgcls3XSA9IGMyOworfQorCisjZW5kaWYgIC8qIGRlZmluZWQoT1BFTlNTTF9YODZfNjQpICYmICFkZWZpbmVkKE9QRU5TU0xfV0lORE9XUykgKi8KZGlmZiAtLWdpdCBhL2NyeXB0by9ibi9hc20veDg2XzY0LW1vbnQucGwgYi9jcnlwdG8vYm4vYXNtL3g4Nl82NC1tb250LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MDM5MjgKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYm4vYXNtL3g4Nl82NC1tb250LnBsCkBAIC0wLDAgKzEsMTQwMCBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFdyaXR0ZW4gYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9Ab3BlbnNzbC5vcmc+IGZvciB0aGUgT3BlblNTTAorIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCisjIENSWVBUT0dBTVMgbGljZW5zZXMgZGVwZW5kaW5nIG9uIHdoZXJlIHlvdSBvYnRhaW4gaXQuIEZvciBmdXJ0aGVyCisjIGRldGFpbHMgc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvfmFwcHJvL2NyeXB0b2dhbXMvLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjIE9jdG9iZXIgMjAwNS4KKyMKKyMgTW9udGdvbWVyeSBtdWx0aXBsaWNhdGlvbiByb3V0aW5lIGZvciB4ODZfNjQuIFdoaWxlIGl0IGdpdmVzIG1vZGVzdAorIyA5JSBpbXByb3ZlbWVudCBvZiByc2E0MDk2IHNpZ24gb24gT3B0ZXJvbiwgcnNhNTEyIHNpZ24gcnVucyBtb3JlCisjIHRoYW4gdHdpY2UsID4yeCwgYXMgZmFzdC4gTW9zdCBjb21tb24gcnNhMTAyNCBzaWduIGlzIGltcHJvdmVkIGJ5CisjIHJlc3BlY3RmdWwgNTAlLiBJdCByZW1haW5zIHRvIGJlIHNlZW4gaWYgbG9vcCB1bnJvbGxpbmcgYW5kCisjIGRlZGljYXRlZCBzcXVhcmluZyByb3V0aW5lIGNhbiBwcm92aWRlIGZ1cnRoZXIgaW1wcm92ZW1lbnQuLi4KKworIyBKdWx5IDIwMTEuCisjCisjIEFkZCBkZWRpY2F0ZWQgc3F1YXJpbmcgcHJvY2VkdXJlLiBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudCB2YXJpZXMKKyMgZnJvbSBwbGF0Zm9ybSB0byBwbGF0Zm9ybSwgYnV0IGluIGF2ZXJhZ2UgaXQncyB+NSUvMTUlLzI1JS8zMyUKKyMgZm9yIDUxMi0vMTAyNC0vMjA0OC0vNDA5Ni1iaXQgUlNBICpzaWduKiBiZW5jaG1hcmtzIHJlc3BlY3RpdmVseS4KKworIyBBdWd1c3QgMjAxMS4KKyMKKyMgVW5yb2xsIGFuZCBtb2R1bG8tc2NoZWR1bGUgaW5uZXIgbG9vcHMgaW4gc3VjaCBtYW5uZXIgdGhhdCB0aGV5CisjIGFyZSAiZmFsbGVuIHRocm91Z2giIGZvciBpbnB1dCBsZW5ndGhzIG9mIDgsIHdoaWNoIGlzIGNyaXRpY2FsIGZvcgorIyAxMDI0LWJpdCBSU0EgKnNpZ24qLiBBdmVyYWdlIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IGluIGNvbXBhcmlzb24KKyMgdG8gKmluaXRpYWwqIHZlcnNpb24gb2YgdGhpcyBtb2R1bGUgZnJvbSAyMDA1IGlzIH4wJS8zMCUvNDAlLzQ1JQorIyBmb3IgNTEyLS8xMDI0LS8yMDQ4LS80MDk2LWJpdCBSU0EgKnNpZ24qIGJlbmNobWFya3MgcmVzcGVjdGl2ZWx5LgorCisjIEp1bmUgMjAxMy4KKyMKKyMgT3B0aW1pemUgcmVkdWN0aW9uIGluIHNxdWFyaW5nIHByb2NlZHVyZSBhbmQgaW1wcm92ZSAxMDI0Ky1iaXQgUlNBCisjIHNpZ24gcGVyZm9ybWFuY2UgYnkgMTAtMTYlIG9uIEludGVsIFNhbmR5IEJyaWRnZSBhbmQgbGF0ZXIKKyMgKHZpcnR1YWxseSBzYW1lIG9uIG5vbi1JbnRlbCBwcm9jZXNzb3JzKS4KKworIyBBdWd1c3QgMjAxMy4KKyMKKyMgQWRkIE1VTFgvQURPWC9BRENYIGNvZGUgcGF0aC4KKworJGZsYXZvdXIgPSBzaGlmdDsKKyRvdXRwdXQgID0gc2hpZnQ7CitpZiAoJGZsYXZvdXIgPX4gL1wuLykgeyAkb3V0cHV0ID0gJGZsYXZvdXI7IHVuZGVmICRmbGF2b3VyOyB9CisKKyR3aW42ND0wOyAkd2luNjQ9MSBpZiAoJGZsYXZvdXIgPX4gL1tubV1hc218bWluZ3c2NC8gfHwgJG91dHB1dCA9fiAvXC5hc20kLyk7CisKKyQwID1+IG0vKC4qW1wvXFxdKVteXC9cXF0rJC87ICRkaXI9JDE7CisoICR4bGF0ZT0iJHtkaXJ9eDg2XzY0LXhsYXRlLnBsIiBhbmQgLWYgJHhsYXRlICkgb3IKKyggJHhsYXRlPSIke2Rpcn0uLi8uLi9wZXJsYXNtL3g4Nl82NC14bGF0ZS5wbCIgYW5kIC1mICR4bGF0ZSkgb3IKK2RpZSAiY2FuJ3QgbG9jYXRlIHg4Nl82NC14bGF0ZS5wbCI7CisKK29wZW4gT1VULCJ8IFwiJF5YXCIgJHhsYXRlICRmbGF2b3VyICRvdXRwdXQiOworKlNURE9VVD0qT1VUOworCitpZiAoYCRFTlZ7Q0N9IC1XYSwtdiAtYyAtbyAvZGV2L251bGwgLXggYXNzZW1ibGVyIC9kZXYvbnVsbCAyPiYxYAorCQk9fiAvR05VIGFzc2VtYmxlciB2ZXJzaW9uIChbMi05XVwuWzAtOV0rKS8pIHsKKwkkYWRkeCA9ICgkMT49Mi4yMyk7Cit9CisKK2lmICghJGFkZHggJiYgJHdpbjY0ICYmICgkZmxhdm91ciA9fiAvbmFzbS8gfHwgJEVOVntBU019ID1+IC9uYXNtLykgJiYKKwkgICAgYG5hc20gLXYgMj4mMWAgPX4gL05BU00gdmVyc2lvbiAoWzItOV1cLlswLTldKykvKSB7CisJJGFkZHggPSAoJDE+PTIuMTApOworfQorCitpZiAoISRhZGR4ICYmICR3aW42NCAmJiAoJGZsYXZvdXIgPX4gL21hc20vIHx8ICRFTlZ7QVNNfSA9fiAvbWw2NC8pICYmCisJICAgIGBtbDY0IDI+JjFgID1+IC9WZXJzaW9uIChbMC05XSspXC4vKSB7CisJJGFkZHggPSAoJDE+PTExKTsKK30KKworIyBpbnQgYm5fbXVsX21vbnQoCiskcnA9IiVyZGkiOwkjIEJOX1VMT05HICpycCwKKyRhcD0iJXJzaSI7CSMgY29uc3QgQk5fVUxPTkcgKmFwLAorJGJwPSIlcmR4IjsJIyBjb25zdCBCTl9VTE9ORyAqYnAsCiskbnA9IiVyY3giOwkjIGNvbnN0IEJOX1VMT05HICpucCwKKyRuMD0iJXI4IjsJIyBjb25zdCBCTl9VTE9ORyAqbjAsCiskbnVtPSIlcjkiOwkjIGludCBudW0pOworJGxvMD0iJXIxMCI7CiskaGkwPSIlcjExIjsKKyRoaTE9IiVyMTMiOworJGk9IiVyMTQiOworJGo9IiVyMTUiOworJG0wPSIlcmJ4IjsKKyRtMT0iJXJicCI7CisKKyRjb2RlPTw8X19fOworLnRleHQKKworLmV4dGVybglPUEVOU1NMX2lhMzJjYXBfUAorCisuZ2xvYmwJYm5fbXVsX21vbnQKKy50eXBlCWJuX211bF9tb250LFxAZnVuY3Rpb24sNgorLmFsaWduCTE2Citibl9tdWxfbW9udDoKKwl0ZXN0CVwkMywke251bX1kCisJam56CS5MbXVsX2VudGVyCisJY21wCVwkOCwke251bX1kCisJamIJLkxtdWxfZW50ZXIKK19fXworJGNvZGUuPTw8X19fIGlmICgkYWRkeCk7CisJbW92CU9QRU5TU0xfaWEzMmNhcF9QKzgoJXJpcCksJXIxMWQKK19fXworJGNvZGUuPTw8X19fOworCWNtcAkkYXAsJGJwCisJam5lCS5MbXVsNHhfZW50ZXIKKwl0ZXN0CVwkNywke251bX1kCisJanoJLkxzcXI4eF9lbnRlcgorCWptcAkuTG11bDR4X2VudGVyCisKKy5hbGlnbgkxNgorLkxtdWxfZW50ZXI6CisJcHVzaAklcmJ4CisJcHVzaAklcmJwCisJcHVzaAklcjEyCisJcHVzaAklcjEzCisJcHVzaAklcjE0CisJcHVzaAklcjE1CisKKwltb3YJJHtudW19ZCwke251bX1kCisJbGVhCTIoJG51bSksJXIxMAorCW1vdgklcnNwLCVyMTEKKwluZWcJJXIxMAorCWxlYQkoJXJzcCwlcjEwLDgpLCVyc3AJIyB0cD1hbGxvY2EoOCoobnVtKzIpKQorCWFuZAlcJC0xMDI0LCVyc3AJCSMgbWluaW1pemUgVExCIHVzYWdlCisKKwltb3YJJXIxMSw4KCVyc3AsJG51bSw4KQkjIHRwW251bSsxXT0lcnNwCisuTG11bF9ib2R5OgorCW1vdgkkYnAsJXIxMgkJIyByZWFzc2lnbiAkYnAKK19fXworCQkkYnA9IiVyMTIiOworJGNvZGUuPTw8X19fOworCW1vdgkoJG4wKSwkbjAJCSMgcHVsbCBuMFswXSB2YWx1ZQorCW1vdgkoJGJwKSwkbTAJCSMgbTA9YnBbMF0KKwltb3YJKCRhcCksJXJheAorCisJeG9yCSRpLCRpCQkJIyBpPTAKKwl4b3IJJGosJGoJCQkjIGo9MAorCisJbW92CSRuMCwkbTEKKwltdWxxCSRtMAkJCSMgYXBbMF0qYnBbMF0KKwltb3YJJXJheCwkbG8wCisJbW92CSgkbnApLCVyYXgKKworCWltdWxxCSRsbzAsJG0xCQkjICJ0cFswXSIqbjAKKwltb3YJJXJkeCwkaGkwCisKKwltdWxxCSRtMQkJCSMgbnBbMF0qbTEKKwlhZGQJJXJheCwkbG8wCQkjIGRpc2NhcmRlZAorCW1vdgk4KCRhcCksJXJheAorCWFkYwlcJDAsJXJkeAorCW1vdgklcmR4LCRoaTEKKworCWxlYQkxKCRqKSwkagkJIyBqKysKKwlqbXAJLkwxc3RfZW50ZXIKKworLmFsaWduCTE2CisuTDFzdDoKKwlhZGQJJXJheCwkaGkxCisJbW92CSgkYXAsJGosOCksJXJheAorCWFkYwlcJDAsJXJkeAorCWFkZAkkaGkwLCRoaTEJCSMgbnBbal0qbTErYXBbal0qYnBbMF0KKwltb3YJJGxvMCwkaGkwCisJYWRjCVwkMCwlcmR4CisJbW92CSRoaTEsLTE2KCVyc3AsJGosOCkJIyB0cFtqLTFdCisJbW92CSVyZHgsJGhpMQorCisuTDFzdF9lbnRlcjoKKwltdWxxCSRtMAkJCSMgYXBbal0qYnBbMF0KKwlhZGQJJXJheCwkaGkwCisJbW92CSgkbnAsJGosOCksJXJheAorCWFkYwlcJDAsJXJkeAorCWxlYQkxKCRqKSwkagkJIyBqKysKKwltb3YJJXJkeCwkbG8wCisKKwltdWxxCSRtMQkJCSMgbnBbal0qbTEKKwljbXAJJG51bSwkagorCWpuZQkuTDFzdAorCisJYWRkCSVyYXgsJGhpMQorCW1vdgkoJGFwKSwlcmF4CQkjIGFwWzBdCisJYWRjCVwkMCwlcmR4CisJYWRkCSRoaTAsJGhpMQkJIyBucFtqXSptMSthcFtqXSpicFswXQorCWFkYwlcJDAsJXJkeAorCW1vdgkkaGkxLC0xNiglcnNwLCRqLDgpCSMgdHBbai0xXQorCW1vdgklcmR4LCRoaTEKKwltb3YJJGxvMCwkaGkwCisKKwl4b3IJJXJkeCwlcmR4CisJYWRkCSRoaTAsJGhpMQorCWFkYwlcJDAsJXJkeAorCW1vdgkkaGkxLC04KCVyc3AsJG51bSw4KQorCW1vdgklcmR4LCglcnNwLCRudW0sOCkJIyBzdG9yZSB1cG1vc3Qgb3ZlcmZsb3cgYml0CisKKwlsZWEJMSgkaSksJGkJCSMgaSsrCisJam1wCS5Mb3V0ZXIKKy5hbGlnbgkxNgorLkxvdXRlcjoKKwltb3YJKCRicCwkaSw4KSwkbTAJCSMgbTA9YnBbaV0KKwl4b3IJJGosJGoJCQkjIGo9MAorCW1vdgkkbjAsJG0xCisJbW92CSglcnNwKSwkbG8wCisJbXVscQkkbTAJCQkjIGFwWzBdKmJwW2ldCisJYWRkCSVyYXgsJGxvMAkJIyBhcFswXSpicFtpXSt0cFswXQorCW1vdgkoJG5wKSwlcmF4CisJYWRjCVwkMCwlcmR4CisKKwlpbXVscQkkbG8wLCRtMQkJIyB0cFswXSpuMAorCW1vdgklcmR4LCRoaTAKKworCW11bHEJJG0xCQkJIyBucFswXSptMQorCWFkZAklcmF4LCRsbzAJCSMgZGlzY2FyZGVkCisJbW92CTgoJGFwKSwlcmF4CisJYWRjCVwkMCwlcmR4CisJbW92CTgoJXJzcCksJGxvMAkJIyB0cFsxXQorCW1vdgklcmR4LCRoaTEKKworCWxlYQkxKCRqKSwkagkJIyBqKysKKwlqbXAJLkxpbm5lcl9lbnRlcgorCisuYWxpZ24JMTYKKy5MaW5uZXI6CisJYWRkCSVyYXgsJGhpMQorCW1vdgkoJGFwLCRqLDgpLCVyYXgKKwlhZGMJXCQwLCVyZHgKKwlhZGQJJGxvMCwkaGkxCQkjIG5wW2pdKm0xK2FwW2pdKmJwW2ldK3RwW2pdCisJbW92CSglcnNwLCRqLDgpLCRsbzAKKwlhZGMJXCQwLCVyZHgKKwltb3YJJGhpMSwtMTYoJXJzcCwkaiw4KQkjIHRwW2otMV0KKwltb3YJJXJkeCwkaGkxCisKKy5MaW5uZXJfZW50ZXI6CisJbXVscQkkbTAJCQkjIGFwW2pdKmJwW2ldCisJYWRkCSVyYXgsJGhpMAorCW1vdgkoJG5wLCRqLDgpLCVyYXgKKwlhZGMJXCQwLCVyZHgKKwlhZGQJJGhpMCwkbG8wCQkjIGFwW2pdKmJwW2ldK3RwW2pdCisJbW92CSVyZHgsJGhpMAorCWFkYwlcJDAsJGhpMAorCWxlYQkxKCRqKSwkagkJIyBqKysKKworCW11bHEJJG0xCQkJIyBucFtqXSptMQorCWNtcAkkbnVtLCRqCisJam5lCS5MaW5uZXIKKworCWFkZAklcmF4LCRoaTEKKwltb3YJKCRhcCksJXJheAkJIyBhcFswXQorCWFkYwlcJDAsJXJkeAorCWFkZAkkbG8wLCRoaTEJCSMgbnBbal0qbTErYXBbal0qYnBbaV0rdHBbal0KKwltb3YJKCVyc3AsJGosOCksJGxvMAorCWFkYwlcJDAsJXJkeAorCW1vdgkkaGkxLC0xNiglcnNwLCRqLDgpCSMgdHBbai0xXQorCW1vdgklcmR4LCRoaTEKKworCXhvcgklcmR4LCVyZHgKKwlhZGQJJGhpMCwkaGkxCisJYWRjCVwkMCwlcmR4CisJYWRkCSRsbzAsJGhpMQkJIyBwdWxsIHVwbW9zdCBvdmVyZmxvdyBiaXQKKwlhZGMJXCQwLCVyZHgKKwltb3YJJGhpMSwtOCglcnNwLCRudW0sOCkKKwltb3YJJXJkeCwoJXJzcCwkbnVtLDgpCSMgc3RvcmUgdXBtb3N0IG92ZXJmbG93IGJpdAorCisJbGVhCTEoJGkpLCRpCQkjIGkrKworCWNtcAkkbnVtLCRpCisJamIJLkxvdXRlcgorCisJeG9yCSRpLCRpCQkJIyBpPTAgYW5kIGNsZWFyIENGIQorCW1vdgkoJXJzcCksJXJheAkJIyB0cFswXQorCWxlYQkoJXJzcCksJGFwCQkjIGJvcnJvdyBhcCBmb3IgdHAKKwltb3YJJG51bSwkagkJCSMgaj1udW0KKwlqbXAJLkxzdWIKKy5hbGlnbgkxNgorLkxzdWI6CXNiYgkoJG5wLCRpLDgpLCVyYXgKKwltb3YJJXJheCwoJHJwLCRpLDgpCQkjIHJwW2ldPXRwW2ldLW5wW2ldCisJbW92CTgoJGFwLCRpLDgpLCVyYXgJIyB0cFtpKzFdCisJbGVhCTEoJGkpLCRpCQkjIGkrKworCWRlYwkkagkJCSMgZG9lc25uJ3QgYWZmZWN0IENGIQorCWpuegkuTHN1YgorCisJc2JiCVwkMCwlcmF4CQkjIGhhbmRsZSB1cG1vc3Qgb3ZlcmZsb3cgYml0CisJeG9yCSRpLCRpCisJYW5kCSVyYXgsJGFwCisJbm90CSVyYXgKKwltb3YJJHJwLCRucAorCWFuZAklcmF4LCRucAorCW1vdgkkbnVtLCRqCQkJIyBqPW51bQorCW9yCSRucCwkYXAJCQkjIGFwPWJvcnJvdz90cDpycAorLmFsaWduCTE2CisuTGNvcHk6CQkJCQkjIGNvcHkgb3IgaW4tcGxhY2UgcmVmcmVzaAorCW1vdgkoJGFwLCRpLDgpLCVyYXgKKwltb3YJJGksKCVyc3AsJGksOCkJCSMgemFwIHRlbXBvcmFyeSB2ZWN0b3IKKwltb3YJJXJheCwoJHJwLCRpLDgpCQkjIHJwW2ldPXRwW2ldCisJbGVhCTEoJGkpLCRpCisJc3ViCVwkMSwkagorCWpuegkuTGNvcHkKKworCW1vdgk4KCVyc3AsJG51bSw4KSwlcnNpCSMgcmVzdG9yZSAlcnNwCisJbW92CVwkMSwlcmF4CisJbW92CSglcnNpKSwlcjE1CisJbW92CTgoJXJzaSksJXIxNAorCW1vdgkxNiglcnNpKSwlcjEzCisJbW92CTI0KCVyc2kpLCVyMTIKKwltb3YJMzIoJXJzaSksJXJicAorCW1vdgk0MCglcnNpKSwlcmJ4CisJbGVhCTQ4KCVyc2kpLCVyc3AKKy5MbXVsX2VwaWxvZ3VlOgorCXJldAorLnNpemUJYm5fbXVsX21vbnQsLi1ibl9tdWxfbW9udAorX19fCit7e3sKK215IEBBPSgiJXIxMCIsIiVyMTEiKTsKK215IEBOPSgiJXIxMyIsIiVyZGkiKTsKKyRjb2RlLj08PF9fXzsKKy50eXBlCWJuX211bDR4X21vbnQsXEBmdW5jdGlvbiw2CisuYWxpZ24JMTYKK2JuX211bDR4X21vbnQ6CisuTG11bDR4X2VudGVyOgorX19fCiskY29kZS49PDxfX18gaWYgKCRhZGR4KTsKKwlhbmQJXCQweDgwMTAwLCVyMTFkCisJY21wCVwkMHg4MDEwMCwlcjExZAorCWplCS5MbXVseDR4X2VudGVyCitfX18KKyRjb2RlLj08PF9fXzsKKwlwdXNoCSVyYngKKwlwdXNoCSVyYnAKKwlwdXNoCSVyMTIKKwlwdXNoCSVyMTMKKwlwdXNoCSVyMTQKKwlwdXNoCSVyMTUKKworCW1vdgkke251bX1kLCR7bnVtfWQKKwlsZWEJNCgkbnVtKSwlcjEwCisJbW92CSVyc3AsJXIxMQorCW5lZwklcjEwCisJbGVhCSglcnNwLCVyMTAsOCksJXJzcAkjIHRwPWFsbG9jYSg4KihudW0rNCkpCisJYW5kCVwkLTEwMjQsJXJzcAkJIyBtaW5pbWl6ZSBUTEIgdXNhZ2UKKworCW1vdgklcjExLDgoJXJzcCwkbnVtLDgpCSMgdHBbbnVtKzFdPSVyc3AKKy5MbXVsNHhfYm9keToKKwltb3YJJHJwLDE2KCVyc3AsJG51bSw4KQkjIHRwW251bSsyXT0kcnAKKwltb3YJJXJkeCwlcjEyCQkjIHJlYXNzaWduICRicAorX19fCisJCSRicD0iJXIxMiI7CiskY29kZS49PDxfX187CisJbW92CSgkbjApLCRuMAkJIyBwdWxsIG4wWzBdIHZhbHVlCisJbW92CSgkYnApLCRtMAkJIyBtMD1icFswXQorCW1vdgkoJGFwKSwlcmF4CisKKwl4b3IJJGksJGkJCQkjIGk9MAorCXhvcgkkaiwkagkJCSMgaj0wCisKKwltb3YJJG4wLCRtMQorCW11bHEJJG0wCQkJIyBhcFswXSpicFswXQorCW1vdgklcmF4LCRBWzBdCisJbW92CSgkbnApLCVyYXgKKworCWltdWxxCSRBWzBdLCRtMQkJIyAidHBbMF0iKm4wCisJbW92CSVyZHgsJEFbMV0KKworCW11bHEJJG0xCQkJIyBucFswXSptMQorCWFkZAklcmF4LCRBWzBdCQkjIGRpc2NhcmRlZAorCW1vdgk4KCRhcCksJXJheAorCWFkYwlcJDAsJXJkeAorCW1vdgklcmR4LCROWzFdCisKKwltdWxxCSRtMAorCWFkZAklcmF4LCRBWzFdCisJbW92CTgoJG5wKSwlcmF4CisJYWRjCVwkMCwlcmR4CisJbW92CSVyZHgsJEFbMF0KKworCW11bHEJJG0xCisJYWRkCSVyYXgsJE5bMV0KKwltb3YJMTYoJGFwKSwlcmF4CisJYWRjCVwkMCwlcmR4CisJYWRkCSRBWzFdLCROWzFdCisJbGVhCTQoJGopLCRqCQkjIGorKworCWFkYwlcJDAsJXJkeAorCW1vdgkkTlsxXSwoJXJzcCkKKwltb3YJJXJkeCwkTlswXQorCWptcAkuTDFzdDR4CisuYWxpZ24JMTYKKy5MMXN0NHg6CisJbXVscQkkbTAJCQkjIGFwW2pdKmJwWzBdCisJYWRkCSVyYXgsJEFbMF0KKwltb3YJLTE2KCRucCwkaiw4KSwlcmF4CisJYWRjCVwkMCwlcmR4CisJbW92CSVyZHgsJEFbMV0KKworCW11bHEJJG0xCQkJIyBucFtqXSptMQorCWFkZAklcmF4LCROWzBdCisJbW92CS04KCRhcCwkaiw4KSwlcmF4CisJYWRjCVwkMCwlcmR4CisJYWRkCSRBWzBdLCROWzBdCQkjIG5wW2pdKm0xK2FwW2pdKmJwWzBdCisJYWRjCVwkMCwlcmR4CisJbW92CSROWzBdLC0yNCglcnNwLCRqLDgpCSMgdHBbai0xXQorCW1vdgklcmR4LCROWzFdCisKKwltdWxxCSRtMAkJCSMgYXBbal0qYnBbMF0KKwlhZGQJJXJheCwkQVsxXQorCW1vdgktOCgkbnAsJGosOCksJXJheAorCWFkYwlcJDAsJXJkeAorCW1vdgklcmR4LCRBWzBdCisKKwltdWxxCSRtMQkJCSMgbnBbal0qbTEKKwlhZGQJJXJheCwkTlsxXQorCW1vdgkoJGFwLCRqLDgpLCVyYXgKKwlhZGMJXCQwLCVyZHgKKwlhZGQJJEFbMV0sJE5bMV0JCSMgbnBbal0qbTErYXBbal0qYnBbMF0KKwlhZGMJXCQwLCVyZHgKKwltb3YJJE5bMV0sLTE2KCVyc3AsJGosOCkJIyB0cFtqLTFdCisJbW92CSVyZHgsJE5bMF0KKworCW11bHEJJG0wCQkJIyBhcFtqXSpicFswXQorCWFkZAklcmF4LCRBWzBdCisJbW92CSgkbnAsJGosOCksJXJheAorCWFkYwlcJDAsJXJkeAorCW1vdgklcmR4LCRBWzFdCisKKwltdWxxCSRtMQkJCSMgbnBbal0qbTEKKwlhZGQJJXJheCwkTlswXQorCW1vdgk4KCRhcCwkaiw4KSwlcmF4CisJYWRjCVwkMCwlcmR4CisJYWRkCSRBWzBdLCROWzBdCQkjIG5wW2pdKm0xK2FwW2pdKmJwWzBdCisJYWRjCVwkMCwlcmR4CisJbW92CSROWzBdLC04KCVyc3AsJGosOCkJIyB0cFtqLTFdCisJbW92CSVyZHgsJE5bMV0KKworCW11bHEJJG0wCQkJIyBhcFtqXSpicFswXQorCWFkZAklcmF4LCRBWzFdCisJbW92CTgoJG5wLCRqLDgpLCVyYXgKKwlhZGMJXCQwLCVyZHgKKwlsZWEJNCgkaiksJGoJCSMgaisrCisJbW92CSVyZHgsJEFbMF0KKworCW11bHEJJG0xCQkJIyBucFtqXSptMQorCWFkZAklcmF4LCROWzFdCisJbW92CS0xNigkYXAsJGosOCksJXJheAorCWFkYwlcJDAsJXJkeAorCWFkZAkkQVsxXSwkTlsxXQkJIyBucFtqXSptMSthcFtqXSpicFswXQorCWFkYwlcJDAsJXJkeAorCW1vdgkkTlsxXSwtMzIoJXJzcCwkaiw4KQkjIHRwW2otMV0KKwltb3YJJXJkeCwkTlswXQorCWNtcAkkbnVtLCRqCisJamIJLkwxc3Q0eAorCisJbXVscQkkbTAJCQkjIGFwW2pdKmJwWzBdCisJYWRkCSVyYXgsJEFbMF0KKwltb3YJLTE2KCRucCwkaiw4KSwlcmF4CisJYWRjCVwkMCwlcmR4CisJbW92CSVyZHgsJEFbMV0KKworCW11bHEJJG0xCQkJIyBucFtqXSptMQorCWFkZAklcmF4LCROWzBdCisJbW92CS04KCRhcCwkaiw4KSwlcmF4CisJYWRjCVwkMCwlcmR4CisJYWRkCSRBWzBdLCROWzBdCQkjIG5wW2pdKm0xK2FwW2pdKmJwWzBdCisJYWRjCVwkMCwlcmR4CisJbW92CSROWzBdLC0yNCglcnNwLCRqLDgpCSMgdHBbai0xXQorCW1vdgklcmR4LCROWzFdCisKKwltdWxxCSRtMAkJCSMgYXBbal0qYnBbMF0KKwlhZGQJJXJheCwkQVsxXQorCW1vdgktOCgkbnAsJGosOCksJXJheAorCWFkYwlcJDAsJXJkeAorCW1vdgklcmR4LCRBWzBdCisKKwltdWxxCSRtMQkJCSMgbnBbal0qbTEKKwlhZGQJJXJheCwkTlsxXQorCW1vdgkoJGFwKSwlcmF4CQkjIGFwWzBdCisJYWRjCVwkMCwlcmR4CisJYWRkCSRBWzFdLCROWzFdCQkjIG5wW2pdKm0xK2FwW2pdKmJwWzBdCisJYWRjCVwkMCwlcmR4CisJbW92CSROWzFdLC0xNiglcnNwLCRqLDgpCSMgdHBbai0xXQorCW1vdgklcmR4LCROWzBdCisKKwl4b3IJJE5bMV0sJE5bMV0KKwlhZGQJJEFbMF0sJE5bMF0KKwlhZGMJXCQwLCROWzFdCisJbW92CSROWzBdLC04KCVyc3AsJGosOCkKKwltb3YJJE5bMV0sKCVyc3AsJGosOCkJIyBzdG9yZSB1cG1vc3Qgb3ZlcmZsb3cgYml0CisKKwlsZWEJMSgkaSksJGkJCSMgaSsrCisuYWxpZ24JNAorLkxvdXRlcjR4OgorCW1vdgkoJGJwLCRpLDgpLCRtMAkJIyBtMD1icFtpXQorCXhvcgkkaiwkagkJCSMgaj0wCisJbW92CSglcnNwKSwkQVswXQorCW1vdgkkbjAsJG0xCisJbXVscQkkbTAJCQkjIGFwWzBdKmJwW2ldCisJYWRkCSVyYXgsJEFbMF0JCSMgYXBbMF0qYnBbaV0rdHBbMF0KKwltb3YJKCRucCksJXJheAorCWFkYwlcJDAsJXJkeAorCisJaW11bHEJJEFbMF0sJG0xCQkjIHRwWzBdKm4wCisJbW92CSVyZHgsJEFbMV0KKworCW11bHEJJG0xCQkJIyBucFswXSptMQorCWFkZAklcmF4LCRBWzBdCQkjICIkTlswXSIsIGRpc2NhcmRlZAorCW1vdgk4KCRhcCksJXJheAorCWFkYwlcJDAsJXJkeAorCW1vdgklcmR4LCROWzFdCisKKwltdWxxCSRtMAkJCSMgYXBbal0qYnBbaV0KKwlhZGQJJXJheCwkQVsxXQorCW1vdgk4KCRucCksJXJheAorCWFkYwlcJDAsJXJkeAorCWFkZAk4KCVyc3ApLCRBWzFdCQkjICt0cFsxXQorCWFkYwlcJDAsJXJkeAorCW1vdgklcmR4LCRBWzBdCisKKwltdWxxCSRtMQkJCSMgbnBbal0qbTEKKwlhZGQJJXJheCwkTlsxXQorCW1vdgkxNigkYXApLCVyYXgKKwlhZGMJXCQwLCVyZHgKKwlhZGQJJEFbMV0sJE5bMV0JCSMgbnBbal0qbTErYXBbal0qYnBbaV0rdHBbal0KKwlsZWEJNCgkaiksJGoJCSMgais9MgorCWFkYwlcJDAsJXJkeAorCW1vdgkkTlsxXSwoJXJzcCkJCSMgdHBbai0xXQorCW1vdgklcmR4LCROWzBdCisJam1wCS5MaW5uZXI0eAorLmFsaWduCTE2CisuTGlubmVyNHg6CisJbXVscQkkbTAJCQkjIGFwW2pdKmJwW2ldCisJYWRkCSVyYXgsJEFbMF0KKwltb3YJLTE2KCRucCwkaiw4KSwlcmF4CisJYWRjCVwkMCwlcmR4CisJYWRkCS0xNiglcnNwLCRqLDgpLCRBWzBdCSMgYXBbal0qYnBbaV0rdHBbal0KKwlhZGMJXCQwLCVyZHgKKwltb3YJJXJkeCwkQVsxXQorCisJbXVscQkkbTEJCQkjIG5wW2pdKm0xCisJYWRkCSVyYXgsJE5bMF0KKwltb3YJLTgoJGFwLCRqLDgpLCVyYXgKKwlhZGMJXCQwLCVyZHgKKwlhZGQJJEFbMF0sJE5bMF0KKwlhZGMJXCQwLCVyZHgKKwltb3YJJE5bMF0sLTI0KCVyc3AsJGosOCkJIyB0cFtqLTFdCisJbW92CSVyZHgsJE5bMV0KKworCW11bHEJJG0wCQkJIyBhcFtqXSpicFtpXQorCWFkZAklcmF4LCRBWzFdCisJbW92CS04KCRucCwkaiw4KSwlcmF4CisJYWRjCVwkMCwlcmR4CisJYWRkCS04KCVyc3AsJGosOCksJEFbMV0KKwlhZGMJXCQwLCVyZHgKKwltb3YJJXJkeCwkQVswXQorCisJbXVscQkkbTEJCQkjIG5wW2pdKm0xCisJYWRkCSVyYXgsJE5bMV0KKwltb3YJKCRhcCwkaiw4KSwlcmF4CisJYWRjCVwkMCwlcmR4CisJYWRkCSRBWzFdLCROWzFdCisJYWRjCVwkMCwlcmR4CisJbW92CSROWzFdLC0xNiglcnNwLCRqLDgpCSMgdHBbai0xXQorCW1vdgklcmR4LCROWzBdCisKKwltdWxxCSRtMAkJCSMgYXBbal0qYnBbaV0KKwlhZGQJJXJheCwkQVswXQorCW1vdgkoJG5wLCRqLDgpLCVyYXgKKwlhZGMJXCQwLCVyZHgKKwlhZGQJKCVyc3AsJGosOCksJEFbMF0JIyBhcFtqXSpicFtpXSt0cFtqXQorCWFkYwlcJDAsJXJkeAorCW1vdgklcmR4LCRBWzFdCisKKwltdWxxCSRtMQkJCSMgbnBbal0qbTEKKwlhZGQJJXJheCwkTlswXQorCW1vdgk4KCRhcCwkaiw4KSwlcmF4CisJYWRjCVwkMCwlcmR4CisJYWRkCSRBWzBdLCROWzBdCisJYWRjCVwkMCwlcmR4CisJbW92CSROWzBdLC04KCVyc3AsJGosOCkJIyB0cFtqLTFdCisJbW92CSVyZHgsJE5bMV0KKworCW11bHEJJG0wCQkJIyBhcFtqXSpicFtpXQorCWFkZAklcmF4LCRBWzFdCisJbW92CTgoJG5wLCRqLDgpLCVyYXgKKwlhZGMJXCQwLCVyZHgKKwlhZGQJOCglcnNwLCRqLDgpLCRBWzFdCisJYWRjCVwkMCwlcmR4CisJbGVhCTQoJGopLCRqCQkjIGorKworCW1vdgklcmR4LCRBWzBdCisKKwltdWxxCSRtMQkJCSMgbnBbal0qbTEKKwlhZGQJJXJheCwkTlsxXQorCW1vdgktMTYoJGFwLCRqLDgpLCVyYXgKKwlhZGMJXCQwLCVyZHgKKwlhZGQJJEFbMV0sJE5bMV0KKwlhZGMJXCQwLCVyZHgKKwltb3YJJE5bMV0sLTMyKCVyc3AsJGosOCkJIyB0cFtqLTFdCisJbW92CSVyZHgsJE5bMF0KKwljbXAJJG51bSwkagorCWpiCS5MaW5uZXI0eAorCisJbXVscQkkbTAJCQkjIGFwW2pdKmJwW2ldCisJYWRkCSVyYXgsJEFbMF0KKwltb3YJLTE2KCRucCwkaiw4KSwlcmF4CisJYWRjCVwkMCwlcmR4CisJYWRkCS0xNiglcnNwLCRqLDgpLCRBWzBdCSMgYXBbal0qYnBbaV0rdHBbal0KKwlhZGMJXCQwLCVyZHgKKwltb3YJJXJkeCwkQVsxXQorCisJbXVscQkkbTEJCQkjIG5wW2pdKm0xCisJYWRkCSVyYXgsJE5bMF0KKwltb3YJLTgoJGFwLCRqLDgpLCVyYXgKKwlhZGMJXCQwLCVyZHgKKwlhZGQJJEFbMF0sJE5bMF0KKwlhZGMJXCQwLCVyZHgKKwltb3YJJE5bMF0sLTI0KCVyc3AsJGosOCkJIyB0cFtqLTFdCisJbW92CSVyZHgsJE5bMV0KKworCW11bHEJJG0wCQkJIyBhcFtqXSpicFtpXQorCWFkZAklcmF4LCRBWzFdCisJbW92CS04KCRucCwkaiw4KSwlcmF4CisJYWRjCVwkMCwlcmR4CisJYWRkCS04KCVyc3AsJGosOCksJEFbMV0KKwlhZGMJXCQwLCVyZHgKKwlsZWEJMSgkaSksJGkJCSMgaSsrCisJbW92CSVyZHgsJEFbMF0KKworCW11bHEJJG0xCQkJIyBucFtqXSptMQorCWFkZAklcmF4LCROWzFdCisJbW92CSgkYXApLCVyYXgJCSMgYXBbMF0KKwlhZGMJXCQwLCVyZHgKKwlhZGQJJEFbMV0sJE5bMV0KKwlhZGMJXCQwLCVyZHgKKwltb3YJJE5bMV0sLTE2KCVyc3AsJGosOCkJIyB0cFtqLTFdCisJbW92CSVyZHgsJE5bMF0KKworCXhvcgkkTlsxXSwkTlsxXQorCWFkZAkkQVswXSwkTlswXQorCWFkYwlcJDAsJE5bMV0KKwlhZGQJKCVyc3AsJG51bSw4KSwkTlswXQkjIHB1bGwgdXBtb3N0IG92ZXJmbG93IGJpdAorCWFkYwlcJDAsJE5bMV0KKwltb3YJJE5bMF0sLTgoJXJzcCwkaiw4KQorCW1vdgkkTlsxXSwoJXJzcCwkaiw4KQkjIHN0b3JlIHVwbW9zdCBvdmVyZmxvdyBiaXQKKworCWNtcAkkbnVtLCRpCisJamIJLkxvdXRlcjR4CitfX18KK3sKK215IEByaT0oIiVyYXgiLCIlcmR4IiwkbTAsJG0xKTsKKyRjb2RlLj08PF9fXzsKKwltb3YJMTYoJXJzcCwkbnVtLDgpLCRycAkjIHJlc3RvcmUgJHJwCisJbW92CTAoJXJzcCksQHJpWzBdCQkjIHRwWzBdCisJcHhvcgkleG1tMCwleG1tMAorCW1vdgk4KCVyc3ApLEByaVsxXQkJIyB0cFsxXQorCXNocglcJDIsJG51bQkJIyBudW0vPTQKKwlsZWEJKCVyc3ApLCRhcAkJIyBib3Jyb3cgYXAgZm9yIHRwCisJeG9yCSRpLCRpCQkJIyBpPTAgYW5kIGNsZWFyIENGIQorCisJc3ViCTAoJG5wKSxAcmlbMF0KKwltb3YJMTYoJGFwKSxAcmlbMl0JCSMgdHBbMl0KKwltb3YJMjQoJGFwKSxAcmlbM10JCSMgdHBbM10KKwlzYmIJOCgkbnApLEByaVsxXQorCWxlYQktMSgkbnVtKSwkagkJIyBqPW51bS80LTEKKwlqbXAJLkxzdWI0eAorLmFsaWduCTE2CisuTHN1YjR4OgorCW1vdglAcmlbMF0sMCgkcnAsJGksOCkJIyBycFtpXT10cFtpXS1ucFtpXQorCW1vdglAcmlbMV0sOCgkcnAsJGksOCkJIyBycFtpXT10cFtpXS1ucFtpXQorCXNiYgkxNigkbnAsJGksOCksQHJpWzJdCisJbW92CTMyKCRhcCwkaSw4KSxAcmlbMF0JIyB0cFtpKzFdCisJbW92CTQwKCRhcCwkaSw4KSxAcmlbMV0KKwlzYmIJMjQoJG5wLCRpLDgpLEByaVszXQorCW1vdglAcmlbMl0sMTYoJHJwLCRpLDgpCSMgcnBbaV09dHBbaV0tbnBbaV0KKwltb3YJQHJpWzNdLDI0KCRycCwkaSw4KQkjIHJwW2ldPXRwW2ldLW5wW2ldCisJc2JiCTMyKCRucCwkaSw4KSxAcmlbMF0KKwltb3YJNDgoJGFwLCRpLDgpLEByaVsyXQorCW1vdgk1NigkYXAsJGksOCksQHJpWzNdCisJc2JiCTQwKCRucCwkaSw4KSxAcmlbMV0KKwlsZWEJNCgkaSksJGkJCSMgaSsrCisJZGVjCSRqCQkJIyBkb2Vzbm4ndCBhZmZlY3QgQ0YhCisJam56CS5Mc3ViNHgKKworCW1vdglAcmlbMF0sMCgkcnAsJGksOCkJIyBycFtpXT10cFtpXS1ucFtpXQorCW1vdgkzMigkYXAsJGksOCksQHJpWzBdCSMgbG9hZCBvdmVyZmxvdyBiaXQKKwlzYmIJMTYoJG5wLCRpLDgpLEByaVsyXQorCW1vdglAcmlbMV0sOCgkcnAsJGksOCkJIyBycFtpXT10cFtpXS1ucFtpXQorCXNiYgkyNCgkbnAsJGksOCksQHJpWzNdCisJbW92CUByaVsyXSwxNigkcnAsJGksOCkJIyBycFtpXT10cFtpXS1ucFtpXQorCisJc2JiCVwkMCxAcmlbMF0JCSMgaGFuZGxlIHVwbW9zdCBvdmVyZmxvdyBiaXQKKwltb3YJQHJpWzNdLDI0KCRycCwkaSw4KQkjIHJwW2ldPXRwW2ldLW5wW2ldCisJeG9yCSRpLCRpCQkJIyBpPTAKKwlhbmQJQHJpWzBdLCRhcAorCW5vdAlAcmlbMF0KKwltb3YJJHJwLCRucAorCWFuZAlAcmlbMF0sJG5wCisJbGVhCS0xKCRudW0pLCRqCisJb3IJJG5wLCRhcAkJCSMgYXA9Ym9ycm93P3RwOnJwCisKKwltb3ZkcXUJKCRhcCksJXhtbTEKKwltb3ZkcWEJJXhtbTAsKCVyc3ApCisJbW92ZHF1CSV4bW0xLCgkcnApCisJam1wCS5MY29weTR4CisuYWxpZ24JMTYKKy5MY29weTR4OgkJCQkJIyBjb3B5IG9yIGluLXBsYWNlIHJlZnJlc2gKKwltb3ZkcXUJMTYoJGFwLCRpKSwleG1tMgorCW1vdmRxdQkzMigkYXAsJGkpLCV4bW0xCisJbW92ZHFhCSV4bW0wLDE2KCVyc3AsJGkpCisJbW92ZHF1CSV4bW0yLDE2KCRycCwkaSkKKwltb3ZkcWEJJXhtbTAsMzIoJXJzcCwkaSkKKwltb3ZkcXUJJXhtbTEsMzIoJHJwLCRpKQorCWxlYQkzMigkaSksJGkKKwlkZWMJJGoKKwlqbnoJLkxjb3B5NHgKKworCXNobAlcJDIsJG51bQorCW1vdmRxdQkxNigkYXAsJGkpLCV4bW0yCisJbW92ZHFhCSV4bW0wLDE2KCVyc3AsJGkpCisJbW92ZHF1CSV4bW0yLDE2KCRycCwkaSkKK19fXworfQorJGNvZGUuPTw8X19fOworCW1vdgk4KCVyc3AsJG51bSw4KSwlcnNpCSMgcmVzdG9yZSAlcnNwCisJbW92CVwkMSwlcmF4CisJbW92CSglcnNpKSwlcjE1CisJbW92CTgoJXJzaSksJXIxNAorCW1vdgkxNiglcnNpKSwlcjEzCisJbW92CTI0KCVyc2kpLCVyMTIKKwltb3YJMzIoJXJzaSksJXJicAorCW1vdgk0MCglcnNpKSwlcmJ4CisJbGVhCTQ4KCVyc2kpLCVyc3AKKy5MbXVsNHhfZXBpbG9ndWU6CisJcmV0Cisuc2l6ZQlibl9tdWw0eF9tb250LC4tYm5fbXVsNHhfbW9udAorX19fCit9fX0KKwx7e3sKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgdm9pZCBibl9zcXI4eF9tb250KAorbXkgJHJwdHI9IiVyZGkiOwkjIGNvbnN0IEJOX1VMT05HICpycHRyLAorbXkgJGFwdHI9IiVyc2kiOwkjIGNvbnN0IEJOX1VMT05HICphcHRyLAorbXkgJGJwdHI9IiVyZHgiOwkjIG5vdCB1c2VkCitteSAkbnB0cj0iJXJjeCI7CSMgY29uc3QgQk5fVUxPTkcgKm5wdHIsCitteSAkbjAgID0iJXI4IjsJCSMgY29uc3QgQk5fVUxPTkcgKm4wKTsKK215ICRudW0gPSIlcjkiOwkJIyBpbnQgbnVtLCBoYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IDgKKworbXkgKCRpLCRqLCR0cHRyKT0oIiVyYnAiLCIlcmN4IiwkcnB0cik7CitteSBAQTA9KCIlcjEwIiwiJXIxMSIpOworbXkgQEExPSgiJXIxMiIsIiVyMTMiKTsKK215ICgkYTAsJGExLCRhaSk9KCIlcjE0IiwiJXIxNSIsIiVyYngiKTsKKworJGNvZGUuPTw8X19fOworLmV4dGVybglibl9zcXI4eF9pbnRlcm5hbAkJIyBzZWUgeDg2XzY0LW1vbnQ1IG1vZHVsZQorLmV4dGVybglibl9zcXJ4OHhfaW50ZXJuYWwJCSMgc2VlIHg4Nl82NC1tb250NSBtb2R1bGUKKworLnR5cGUJYm5fc3FyOHhfbW9udCxcQGZ1bmN0aW9uLDYKKy5hbGlnbgkzMgorYm5fc3FyOHhfbW9udDoKKy5Mc3FyOHhfZW50ZXI6CisJbW92CSVyc3AsJXJheAorCXB1c2gJJXJieAorCXB1c2gJJXJicAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCXB1c2gJJXIxNQorCisJbW92CSR7bnVtfWQsJXIxMGQKKwlzaGwJXCQzLCR7bnVtfWQJCSMgY29udmVydCAkbnVtIHRvIGJ5dGVzCisJc2hsCVwkMysyLCVyMTAJCSMgNCokbnVtCisJbmVnCSRudW0KKworCSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisJIyBlbnN1cmUgdGhhdCBzdGFjayBmcmFtZSBkb2Vzbid0IGFsaWFzIHdpdGggJGFwdHIgbW9kdWxvCisJIyA0MDk2LiB0aGlzIGlzIGRvbmUgdG8gYWxsb3cgbWVtb3J5IGRpc2FtYmlndWF0aW9uIGxvZ2ljCisJIyBkbyBpdHMgam9iLgorCSMKKwlsZWEJLTY0KCVyc3AsJG51bSw0KSwlcjExCisJbW92CSgkbjApLCRuMAkJIyAqbjAKKwlzdWIJJGFwdHIsJXIxMQorCWFuZAlcJDQwOTUsJXIxMQorCWNtcAklcjExLCVyMTAKKwlqYgkuTHNxcjh4X3NwX2FsdAorCXN1YgklcjExLCVyc3AJCSMgYWxpZ24gd2l0aCAkYXB0cgorCWxlYQktNjQoJXJzcCwkbnVtLDQpLCVyc3AJIyBhbGxvY2EoZnJhbWUrNCokbnVtKQorCWptcAkuTHNxcjh4X3NwX2RvbmUKKworLmFsaWduCTMyCisuTHNxcjh4X3NwX2FsdDoKKwlsZWEJNDA5Ni02NCgsJG51bSw0KSwlcjEwCSMgNDA5Ni1mcmFtZS00KiRudW0KKwlsZWEJLTY0KCVyc3AsJG51bSw0KSwlcnNwCSMgYWxsb2NhKGZyYW1lKzQqJG51bSkKKwlzdWIJJXIxMCwlcjExCisJbW92CVwkMCwlcjEwCisJY21vdmMJJXIxMCwlcjExCisJc3ViCSVyMTEsJXJzcAorLkxzcXI4eF9zcF9kb25lOgorCWFuZAlcJC02NCwlcnNwCisJbW92CSRudW0sJXIxMAkKKwluZWcJJG51bQorCisJbGVhCTY0KCVyc3AsJG51bSwyKSwlcjExCSMgY29weSBvZiBtb2R1bHVzCisJbW92CSRuMCwgIDMyKCVyc3ApCisJbW92CSVyYXgsIDQwKCVyc3ApCQkjIHNhdmUgb3JpZ2luYWwgJXJzcAorLkxzcXI4eF9ib2R5OgorCisJbW92CSRudW0sJGkKKwltb3ZxCSVyMTEsICV4bW0yCQkjIHNhdmUgcG9pbnRlciB0byBtb2R1bHVzIGNvcHkKKwlzaHIJXCQzKzIsJGkKKwltb3YJT1BFTlNTTF9pYTMyY2FwX1ArOCglcmlwKSwlZWF4CisJam1wCS5Mc3FyOHhfY29weV9uCisKKy5hbGlnbgkzMgorLkxzcXI4eF9jb3B5X246CisJbW92cQk4KjAoJG5wdHIpLCV4bW0wCisJbW92cQk4KjEoJG5wdHIpLCV4bW0xCisJbW92cQk4KjIoJG5wdHIpLCV4bW0zCisJbW92cQk4KjMoJG5wdHIpLCV4bW00CisJbGVhCTgqNCgkbnB0ciksJG5wdHIKKwltb3ZkcWEJJXhtbTAsMTYqMCglcjExKQorCW1vdmRxYQkleG1tMSwxNioxKCVyMTEpCisJbW92ZHFhCSV4bW0zLDE2KjIoJXIxMSkKKwltb3ZkcWEJJXhtbTQsMTYqMyglcjExKQorCWxlYQkxNio0KCVyMTEpLCVyMTEKKwlkZWMJJGkKKwlqbnoJLkxzcXI4eF9jb3B5X24KKworCXB4b3IJJXhtbTAsJXhtbTAKKwltb3ZxCSRycHRyLCV4bW0xCQkjIHNhdmUgJHJwdHIKKwltb3ZxCSVyMTAsICV4bW0zCQkjIC0kbnVtCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJGFkZHgpOworCWFuZAlcJDB4ODAxMDAsJWVheAorCWNtcAlcJDB4ODAxMDAsJWVheAorCWpuZQkuTHNxcjh4X25veAorCisJY2FsbAlibl9zcXJ4OHhfaW50ZXJuYWwJIyBzZWUgeDg2XzY0LW1vbnQ1IG1vZHVsZQorCisJcHhvcgkleG1tMCwleG1tMAorCWxlYQk0OCglcnNwKSwlcmF4CisJbGVhCTY0KCVyc3AsJG51bSwyKSwlcmR4CisJc2hyCVwkMysyLCRudW0KKwltb3YJNDAoJXJzcCksJXJzaQkJIyByZXN0b3JlICVyc3AKKwlqbXAJLkxzcXI4eF96ZXJvCisKKy5hbGlnbgkzMgorLkxzcXI4eF9ub3g6CitfX18KKyRjb2RlLj08PF9fXzsKKwljYWxsCWJuX3Nxcjh4X2ludGVybmFsCSMgc2VlIHg4Nl82NC1tb250NSBtb2R1bGUKKworCXB4b3IJJXhtbTAsJXhtbTAKKwlsZWEJNDgoJXJzcCksJXJheAorCWxlYQk2NCglcnNwLCRudW0sMiksJXJkeAorCXNocglcJDMrMiwkbnVtCisJbW92CTQwKCVyc3ApLCVyc2kJCSMgcmVzdG9yZSAlcnNwCisJam1wCS5Mc3FyOHhfemVybworCisuYWxpZ24JMzIKKy5Mc3FyOHhfemVybzoKKwltb3ZkcWEJJXhtbTAsMTYqMCglcmF4KQkjIHdpcGUgdAorCW1vdmRxYQkleG1tMCwxNioxKCVyYXgpCisJbW92ZHFhCSV4bW0wLDE2KjIoJXJheCkKKwltb3ZkcWEJJXhtbTAsMTYqMyglcmF4KQorCWxlYQkxNio0KCVyYXgpLCVyYXgKKwltb3ZkcWEJJXhtbTAsMTYqMCglcmR4KQkjIHdpcGUgbgorCW1vdmRxYQkleG1tMCwxNioxKCVyZHgpCisJbW92ZHFhCSV4bW0wLDE2KjIoJXJkeCkKKwltb3ZkcWEJJXhtbTAsMTYqMyglcmR4KQorCWxlYQkxNio0KCVyZHgpLCVyZHgKKwlkZWMJJG51bQorCWpuegkuTHNxcjh4X3plcm8KKworCW1vdglcJDEsJXJheAorCW1vdgktNDgoJXJzaSksJXIxNQorCW1vdgktNDAoJXJzaSksJXIxNAorCW1vdgktMzIoJXJzaSksJXIxMworCW1vdgktMjQoJXJzaSksJXIxMgorCW1vdgktMTYoJXJzaSksJXJicAorCW1vdgktOCglcnNpKSwlcmJ4CisJbGVhCSglcnNpKSwlcnNwCisuTHNxcjh4X2VwaWxvZ3VlOgorCXJldAorLnNpemUJYm5fc3FyOHhfbW9udCwuLWJuX3Nxcjh4X21vbnQKK19fXworfX19CisMCitpZiAoJGFkZHgpIHt7eworbXkgJGJwPSIlcmR4IjsJIyBvcmlnaW5hbCB2YWx1ZQorCiskY29kZS49PDxfX187CisudHlwZQlibl9tdWx4NHhfbW9udCxcQGZ1bmN0aW9uLDYKKy5hbGlnbgkzMgorYm5fbXVseDR4X21vbnQ6CisuTG11bHg0eF9lbnRlcjoKKwltb3YJJXJzcCwlcmF4CisJcHVzaAklcmJ4CisJcHVzaAklcmJwCisJcHVzaAklcjEyCisJcHVzaAklcjEzCisJcHVzaAklcjE0CisJcHVzaAklcjE1CisKKwlzaGwJXCQzLCR7bnVtfWQJCSMgY29udmVydCAkbnVtIHRvIGJ5dGVzCisJLmJ5dGUJMHg2NworCXhvcgklcjEwLCVyMTAKKwlzdWIJJG51bSwlcjEwCQkjIC0kbnVtCisJbW92CSgkbjApLCRuMAkJIyAqbjAKKwlsZWEJLTcyKCVyc3AsJXIxMCksJXJzcAkjIGFsbG9jYShmcmFtZSskbnVtKzgpCisJbGVhCSgkYnAsJG51bSksJXIxMAorCWFuZAlcJC0xMjgsJXJzcAorCSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisJIyBTdGFjayBsYXlvdXQKKwkjICswCW51bQorCSMgKzgJb2ZmLWxvYWRlZCAmYltpXQorCSMgKzE2CWVuZCBvZiBiW251bV0KKwkjICsyNAlzYXZlZCBuMAorCSMgKzMyCXNhdmVkIHJwCisJIyArNDAJc2F2ZWQgJXJzcAorCSMgKzQ4CWlubmVyIGNvdW50ZXIKKwkjICs1NgorCSMgKzY0CXRtcFtudW0rMV0KKwkjCisJbW92CSRudW0sMCglcnNwKQkJIyBzYXZlICRudW0KKwlzaHIJXCQ1LCRudW0KKwltb3YJJXIxMCwxNiglcnNwKQkJIyBlbmQgb2YgYltudW1dCisJc3ViCVwkMSwkbnVtCisJbW92CSRuMCwgMjQoJXJzcCkJCSMgc2F2ZSAqbjAKKwltb3YJJHJwLCAzMiglcnNwKQkJIyBzYXZlICRycAorCW1vdgklcmF4LDQwKCVyc3ApCQkjIHNhdmUgb3JpZ2luYWwgJXJzcAorCW1vdgkkbnVtLDQ4KCVyc3ApCQkjIGlubmVyIGNvdW50ZXIKKwlqbXAJLkxtdWx4NHhfYm9keQorCisuYWxpZ24JMzIKKy5MbXVseDR4X2JvZHk6CitfX18KK215ICgkYXB0ciwgJGJwdHIsICRucHRyLCAkdHB0ciwgJG1pLCAgJGJpLCAgJHplcm8sICRudW0pPQorICAgKCIlcnNpIiwiJXJkaSIsIiVyY3giLCIlcmJ4IiwiJXI4IiwiJXI5IiwiJXJicCIsIiVyYXgiKTsKK215ICRycHRyPSRicHRyOworJGNvZGUuPTw8X19fOworCWxlYQk4KCRicCksJGJwdHIKKwltb3YJKCRicCksJXJkeAkJIyBiWzBdLCAkYnA9PSVyZHggYWN0dWFsbHkKKwlsZWEJNjQrMzIoJXJzcCksJHRwdHIKKwltb3YJJXJkeCwkYmkKKworCW11bHgJMCo4KCRhcHRyKSwkbWksJXJheAkjIGFbMF0qYlswXQorCW11bHgJMSo4KCRhcHRyKSwlcjExLCVyMTQJIyBhWzFdKmJbMF0KKwlhZGQJJXJheCwlcjExCisJbW92CSRicHRyLDgoJXJzcCkJCSMgb2ZmLWxvYWQgJmJbaV0KKwltdWx4CTIqOCgkYXB0ciksJXIxMiwlcjEzCSMgLi4uCisJYWRjCSVyMTQsJXIxMgorCWFkYwlcJDAsJXIxMworCisJbW92CSRtaSwkYnB0cgkJIyBib3Jyb3cgJGJwdHIKKwlpbXVscQkyNCglcnNwKSwkbWkJCSMgInRbMF0iKm4wCisJeG9yCSR6ZXJvLCR6ZXJvCQkjIGNmPTAsIG9mPTAKKworCW11bHgJMyo4KCRhcHRyKSwlcmF4LCVyMTQKKwkgbW92CSRtaSwlcmR4CisJbGVhCTQqOCgkYXB0ciksJGFwdHIKKwlhZGN4CSVyYXgsJXIxMworCWFkY3gJJHplcm8sJXIxNAkJIyBjZj0wCisKKwltdWx4CTAqOCgkbnB0ciksJXJheCwlcjEwCisJYWRjeAklcmF4LCRicHRyCQkjIGRpc2NhcmRlZAorCWFkb3gJJXIxMSwlcjEwCisJbXVseAkxKjgoJG5wdHIpLCVyYXgsJXIxMQorCWFkY3gJJXJheCwlcjEwCisJYWRveAklcjEyLCVyMTEKKwkuYnl0ZQkweGM0LDB4NjIsMHhmYiwweGY2LDB4YTEsMHgxMCwweDAwLDB4MDAsMHgwMAkjIG11bHgJMio4KCRucHRyKSwlcmF4LCVyMTIKKwltb3YJNDgoJXJzcCksJGJwdHIJCSMgY291bnRlciB2YWx1ZQorCW1vdgklcjEwLC00KjgoJHRwdHIpCisJYWRjeAklcmF4LCVyMTEKKwlhZG94CSVyMTMsJXIxMgorCW11bHgJMyo4KCRucHRyKSwlcmF4LCVyMTUKKwkgbW92CSRiaSwlcmR4CisJbW92CSVyMTEsLTMqOCgkdHB0cikKKwlhZGN4CSVyYXgsJXIxMgorCWFkb3gJJHplcm8sJXIxNQkJIyBvZj0wCisJbGVhCTQqOCgkbnB0ciksJG5wdHIKKwltb3YJJXIxMiwtMio4KCR0cHRyKQorCisJam1wCS5MbXVseDR4XzFzdAorCisuYWxpZ24JMzIKKy5MbXVseDR4XzFzdDoKKwlhZGN4CSR6ZXJvLCVyMTUJCSMgY2Y9MCwgbW9kdWxvLXNjaGVkdWxlZAorCW11bHgJMCo4KCRhcHRyKSwlcjEwLCVyYXgJIyBhWzRdKmJbMF0KKwlhZGN4CSVyMTQsJXIxMAorCW11bHgJMSo4KCRhcHRyKSwlcjExLCVyMTQJIyBhWzVdKmJbMF0KKwlhZGN4CSVyYXgsJXIxMQorCW11bHgJMio4KCRhcHRyKSwlcjEyLCVyYXgJIyAuLi4KKwlhZGN4CSVyMTQsJXIxMgorCW11bHgJMyo4KCRhcHRyKSwlcjEzLCVyMTQKKwkgLmJ5dGUJMHg2NywweDY3CisJIG1vdgkkbWksJXJkeAorCWFkY3gJJXJheCwlcjEzCisJYWRjeAkkemVybywlcjE0CQkjIGNmPTAKKwlsZWEJNCo4KCRhcHRyKSwkYXB0cgorCWxlYQk0KjgoJHRwdHIpLCR0cHRyCisKKwlhZG94CSVyMTUsJXIxMAorCW11bHgJMCo4KCRucHRyKSwlcmF4LCVyMTUKKwlhZGN4CSVyYXgsJXIxMAorCWFkb3gJJXIxNSwlcjExCisJbXVseAkxKjgoJG5wdHIpLCVyYXgsJXIxNQorCWFkY3gJJXJheCwlcjExCisJYWRveAklcjE1LCVyMTIKKwltdWx4CTIqOCgkbnB0ciksJXJheCwlcjE1CisJbW92CSVyMTAsLTUqOCgkdHB0cikKKwlhZGN4CSVyYXgsJXIxMgorCW1vdgklcjExLC00KjgoJHRwdHIpCisJYWRveAklcjE1LCVyMTMKKwltdWx4CTMqOCgkbnB0ciksJXJheCwlcjE1CisJIG1vdgkkYmksJXJkeAorCW1vdgklcjEyLC0zKjgoJHRwdHIpCisJYWRjeAklcmF4LCVyMTMKKwlhZG94CSR6ZXJvLCVyMTUKKwlsZWEJNCo4KCRucHRyKSwkbnB0cgorCW1vdgklcjEzLC0yKjgoJHRwdHIpCisKKwlkZWMJJGJwdHIJCQkjIG9mPTAsIHBhc3MgY2YKKwlqbnoJLkxtdWx4NHhfMXN0CisKKwltb3YJMCglcnNwKSwkbnVtCQkjIGxvYWQgbnVtCisJbW92CTgoJXJzcCksJGJwdHIJCSMgcmUtbG9hZCAmYltpXQorCWFkYwkkemVybywlcjE1CQkjIG1vZHVsby1zY2hlZHVsZWQKKwlhZGQJJXIxNSwlcjE0CisJc2JiCSVyMTUsJXIxNQkJIyB0b3AtbW9zdCBjYXJyeQorCW1vdgklcjE0LC0xKjgoJHRwdHIpCisJam1wCS5MbXVseDR4X291dGVyCisKKy5hbGlnbgkzMgorLkxtdWx4NHhfb3V0ZXI6CisJbW92CSgkYnB0ciksJXJkeAkJIyBiW2ldCisJbGVhCTgoJGJwdHIpLCRicHRyCQkjIGIrKworCXN1YgkkbnVtLCRhcHRyCQkjIHJld2luZCAkYXB0cgorCW1vdgklcjE1LCgkdHB0cikJCSMgc2F2ZSB0b3AtbW9zdCBjYXJyeQorCWxlYQk2NCs0KjgoJXJzcCksJHRwdHIKKwlzdWIJJG51bSwkbnB0cgkJIyByZXdpbmQgJG5wdHIKKworCW11bHgJMCo4KCRhcHRyKSwkbWksJXIxMQkjIGFbMF0qYltpXQorCXhvcgklZWJwLCVlYnAJCSMgeG9yCSR6ZXJvLCR6ZXJvCSMgY2Y9MCwgb2Y9MAorCW1vdgklcmR4LCRiaQorCW11bHgJMSo4KCRhcHRyKSwlcjE0LCVyMTIJIyBhWzFdKmJbaV0KKwlhZG94CS00KjgoJHRwdHIpLCRtaQorCWFkY3gJJXIxNCwlcjExCisJbXVseAkyKjgoJGFwdHIpLCVyMTUsJXIxMwkjIC4uLgorCWFkb3gJLTMqOCgkdHB0ciksJXIxMQorCWFkY3gJJXIxNSwlcjEyCisJYWRveAkkemVybywlcjEyCisJYWRjeAkkemVybywlcjEzCisKKwltb3YJJGJwdHIsOCglcnNwKQkJIyBvZmYtbG9hZCAmYltpXQorCS5ieXRlCTB4NjcKKwltb3YJJG1pLCVyMTUKKwlpbXVscQkyNCglcnNwKSwkbWkJCSMgInRbMF0iKm4wCisJeG9yCSVlYnAsJWVicAkJIyB4b3IJJHplcm8sJHplcm8JIyBjZj0wLCBvZj0wCisKKwltdWx4CTMqOCgkYXB0ciksJXJheCwlcjE0CisJIG1vdgkkbWksJXJkeAorCWFkb3gJLTIqOCgkdHB0ciksJXIxMgorCWFkY3gJJXJheCwlcjEzCisJYWRveAktMSo4KCR0cHRyKSwlcjEzCisJYWRjeAkkemVybywlcjE0CisJbGVhCTQqOCgkYXB0ciksJGFwdHIKKwlhZG94CSR6ZXJvLCVyMTQKKworCW11bHgJMCo4KCRucHRyKSwlcmF4LCVyMTAKKwlhZGN4CSVyYXgsJXIxNQkJIyBkaXNjYXJkZWQKKwlhZG94CSVyMTEsJXIxMAorCW11bHgJMSo4KCRucHRyKSwlcmF4LCVyMTEKKwlhZGN4CSVyYXgsJXIxMAorCWFkb3gJJXIxMiwlcjExCisJbXVseAkyKjgoJG5wdHIpLCVyYXgsJXIxMgorCW1vdgklcjEwLC00KjgoJHRwdHIpCisJYWRjeAklcmF4LCVyMTEKKwlhZG94CSVyMTMsJXIxMgorCW11bHgJMyo4KCRucHRyKSwlcmF4LCVyMTUKKwkgbW92CSRiaSwlcmR4CisJbW92CSVyMTEsLTMqOCgkdHB0cikKKwlsZWEJNCo4KCRucHRyKSwkbnB0cgorCWFkY3gJJXJheCwlcjEyCisJYWRveAkkemVybywlcjE1CQkjIG9mPTAKKwltb3YJNDgoJXJzcCksJGJwdHIJCSMgY291bnRlciB2YWx1ZQorCW1vdgklcjEyLC0yKjgoJHRwdHIpCisKKwlqbXAJLkxtdWx4NHhfaW5uZXIKKworLmFsaWduCTMyCisuTG11bHg0eF9pbm5lcjoKKwltdWx4CTAqOCgkYXB0ciksJXIxMCwlcmF4CSMgYVs0XSpiW2ldCisJYWRjeAkkemVybywlcjE1CQkjIGNmPTAsIG1vZHVsby1zY2hlZHVsZWQKKwlhZG94CSVyMTQsJXIxMAorCW11bHgJMSo4KCRhcHRyKSwlcjExLCVyMTQJIyBhWzVdKmJbaV0KKwlhZGN4CTAqOCgkdHB0ciksJXIxMAorCWFkb3gJJXJheCwlcjExCisJbXVseAkyKjgoJGFwdHIpLCVyMTIsJXJheAkjIC4uLgorCWFkY3gJMSo4KCR0cHRyKSwlcjExCisJYWRveAklcjE0LCVyMTIKKwltdWx4CTMqOCgkYXB0ciksJXIxMywlcjE0CisJIG1vdgkkbWksJXJkeAorCWFkY3gJMio4KCR0cHRyKSwlcjEyCisJYWRveAklcmF4LCVyMTMKKwlhZGN4CTMqOCgkdHB0ciksJXIxMworCWFkb3gJJHplcm8sJXIxNAkJIyBvZj0wCisJbGVhCTQqOCgkYXB0ciksJGFwdHIKKwlsZWEJNCo4KCR0cHRyKSwkdHB0cgorCWFkY3gJJHplcm8sJXIxNAkJIyBjZj0wCisKKwlhZG94CSVyMTUsJXIxMAorCW11bHgJMCo4KCRucHRyKSwlcmF4LCVyMTUKKwlhZGN4CSVyYXgsJXIxMAorCWFkb3gJJXIxNSwlcjExCisJbXVseAkxKjgoJG5wdHIpLCVyYXgsJXIxNQorCWFkY3gJJXJheCwlcjExCisJYWRveAklcjE1LCVyMTIKKwltdWx4CTIqOCgkbnB0ciksJXJheCwlcjE1CisJbW92CSVyMTAsLTUqOCgkdHB0cikKKwlhZGN4CSVyYXgsJXIxMgorCWFkb3gJJXIxNSwlcjEzCisJbXVseAkzKjgoJG5wdHIpLCVyYXgsJXIxNQorCSBtb3YJJGJpLCVyZHgKKwltb3YJJXIxMSwtNCo4KCR0cHRyKQorCW1vdgklcjEyLC0zKjgoJHRwdHIpCisJYWRjeAklcmF4LCVyMTMKKwlhZG94CSR6ZXJvLCVyMTUKKwlsZWEJNCo4KCRucHRyKSwkbnB0cgorCW1vdgklcjEzLC0yKjgoJHRwdHIpCisKKwlkZWMJJGJwdHIJCQkjIG9mPTAsIHBhc3MgY2YKKwlqbnoJLkxtdWx4NHhfaW5uZXIKKworCW1vdgkwKCVyc3ApLCRudW0JCSMgbG9hZCBudW0KKwltb3YJOCglcnNwKSwkYnB0cgkJIyByZS1sb2FkICZiW2ldCisJYWRjCSR6ZXJvLCVyMTUJCSMgbW9kdWxvLXNjaGVkdWxlZAorCXN1YgkwKjgoJHRwdHIpLCR6ZXJvCSMgcHVsbCB0b3AtbW9zdCBjYXJyeQorCWFkYwklcjE1LCVyMTQKKwltb3YJLTgoJG5wdHIpLCRtaQorCXNiYgklcjE1LCVyMTUJCSMgdG9wLW1vc3QgY2FycnkKKwltb3YJJXIxNCwtMSo4KCR0cHRyKQorCisJY21wCTE2KCVyc3ApLCRicHRyCisJam5lCS5MbXVseDR4X291dGVyCisKKwlzdWIJJXIxNCwkbWkJCSMgY29tcGFyZSB0b3AtbW9zdCB3b3JkcworCXNiYgkkbWksJG1pCisJb3IJJG1pLCVyMTUKKworCW5lZwkkbnVtCisJeG9yCSVyZHgsJXJkeAorCW1vdgkzMiglcnNwKSwkcnB0cgkJIyByZXN0b3JlIHJwCisJbGVhCTY0KCVyc3ApLCR0cHRyCisKKwlweG9yCSV4bW0wLCV4bW0wCisJbW92CTAqOCgkbnB0ciwkbnVtKSwlcjgKKwltb3YJMSo4KCRucHRyLCRudW0pLCVyOQorCW5lZwklcjgKKwlqbXAJLkxtdWx4NHhfc3ViX2VudHJ5CisKKy5hbGlnbgkzMgorLkxtdWx4NHhfc3ViOgorCW1vdgkwKjgoJG5wdHIsJG51bSksJXI4CisJbW92CTEqOCgkbnB0ciwkbnVtKSwlcjkKKwlub3QJJXI4CisuTG11bHg0eF9zdWJfZW50cnk6CisJbW92CTIqOCgkbnB0ciwkbnVtKSwlcjEwCisJbm90CSVyOQorCWFuZAklcjE1LCVyOAorCW1vdgkzKjgoJG5wdHIsJG51bSksJXIxMQorCW5vdAklcjEwCisJYW5kCSVyMTUsJXI5CisJbm90CSVyMTEKKwlhbmQJJXIxNSwlcjEwCisJYW5kCSVyMTUsJXIxMQorCisJbmVnCSVyZHgJCQkjIG1vdiAlcmR4LCVjZgorCWFkYwkwKjgoJHRwdHIpLCVyOAorCWFkYwkxKjgoJHRwdHIpLCVyOQorCW1vdmRxYQkleG1tMCwoJHRwdHIpCisJYWRjCTIqOCgkdHB0ciksJXIxMAorCWFkYwkzKjgoJHRwdHIpLCVyMTEKKwltb3ZkcWEJJXhtbTAsMTYoJHRwdHIpCisJbGVhCTQqOCgkdHB0ciksJHRwdHIKKwlzYmIJJXJkeCwlcmR4CQkjIG1vdiAlY2YsJXJkeAorCisJbW92CSVyOCwwKjgoJHJwdHIpCisJbW92CSVyOSwxKjgoJHJwdHIpCisJbW92CSVyMTAsMio4KCRycHRyKQorCW1vdgklcjExLDMqOCgkcnB0cikKKwlsZWEJNCo4KCRycHRyKSwkcnB0cgorCisJYWRkCVwkMzIsJG51bQorCWpuegkuTG11bHg0eF9zdWIKKworCW1vdgk0MCglcnNwKSwlcnNpCQkjIHJlc3RvcmUgJXJzcAorCW1vdglcJDEsJXJheAorCW1vdgktNDgoJXJzaSksJXIxNQorCW1vdgktNDAoJXJzaSksJXIxNAorCW1vdgktMzIoJXJzaSksJXIxMworCW1vdgktMjQoJXJzaSksJXIxMgorCW1vdgktMTYoJXJzaSksJXJicAorCW1vdgktOCglcnNpKSwlcmJ4CisJbGVhCSglcnNpKSwlcnNwCisuTG11bHg0eF9lcGlsb2d1ZToKKwlyZXQKKy5zaXplCWJuX211bHg0eF9tb250LC4tYm5fbXVseDR4X21vbnQKK19fXworfX19CiskY29kZS49PDxfX187CisuYXNjaXoJIk1vbnRnb21lcnkgTXVsdGlwbGljYXRpb24gZm9yIHg4Nl82NCwgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQG9wZW5zc2wub3JnPiIKKy5hbGlnbgkxNgorX19fCisKKyMgRVhDRVBUSU9OX0RJU1BPU0lUSU9OIGhhbmRsZXIgKEVYQ0VQVElPTl9SRUNPUkQgKnJlYyxVTE9ORzY0IGZyYW1lLAorIwkJQ09OVEVYVCAqY29udGV4dCxESVNQQVRDSEVSX0NPTlRFWFQgKmRpc3ApCitpZiAoJHdpbjY0KSB7CiskcmVjPSIlcmN4IjsKKyRmcmFtZT0iJXJkeCI7CiskY29udGV4dD0iJXI4IjsKKyRkaXNwPSIlcjkiOworCiskY29kZS49PDxfX187CisuZXh0ZXJuCV9faW1wX1J0bFZpcnR1YWxVbndpbmQKKy50eXBlCW11bF9oYW5kbGVyLFxAYWJpLW9tbmlwb3RlbnQKKy5hbGlnbgkxNgorbXVsX2hhbmRsZXI6CisJcHVzaAklcnNpCisJcHVzaAklcmRpCisJcHVzaAklcmJ4CisJcHVzaAklcmJwCisJcHVzaAklcjEyCisJcHVzaAklcjEzCisJcHVzaAklcjE0CisJcHVzaAklcjE1CisJcHVzaGZxCisJc3ViCVwkNjQsJXJzcAorCisJbW92CTEyMCgkY29udGV4dCksJXJheAkjIHB1bGwgY29udGV4dC0+UmF4CisJbW92CTI0OCgkY29udGV4dCksJXJieAkjIHB1bGwgY29udGV4dC0+UmlwCisKKwltb3YJOCgkZGlzcCksJXJzaQkJIyBkaXNwLT5JbWFnZUJhc2UKKwltb3YJNTYoJGRpc3ApLCVyMTEJCSMgZGlzcC0+SGFuZGxlckRhdGEKKworCW1vdgkwKCVyMTEpLCVyMTBkCQkjIEhhbmRsZXJEYXRhWzBdCisJbGVhCSglcnNpLCVyMTApLCVyMTAJIyBlbmQgb2YgcHJvbG9ndWUgbGFiZWwKKwljbXAJJXIxMCwlcmJ4CQkjIGNvbnRleHQtPlJpcDxlbmQgb2YgcHJvbG9ndWUgbGFiZWwKKwlqYgkuTGNvbW1vbl9zZWhfdGFpbAorCisJbW92CTE1MigkY29udGV4dCksJXJheAkjIHB1bGwgY29udGV4dC0+UnNwCisKKwltb3YJNCglcjExKSwlcjEwZAkJIyBIYW5kbGVyRGF0YVsxXQorCWxlYQkoJXJzaSwlcjEwKSwlcjEwCSMgZXBpbG9ndWUgbGFiZWwKKwljbXAJJXIxMCwlcmJ4CQkjIGNvbnRleHQtPlJpcD49ZXBpbG9ndWUgbGFiZWwKKwlqYWUJLkxjb21tb25fc2VoX3RhaWwKKworCW1vdgkxOTIoJGNvbnRleHQpLCVyMTAJIyBwdWxsICRudW0KKwltb3YJOCglcmF4LCVyMTAsOCksJXJheAkjIHB1bGwgc2F2ZWQgc3RhY2sgcG9pbnRlcgorCWxlYQk0OCglcmF4KSwlcmF4CisKKwltb3YJLTgoJXJheCksJXJieAorCW1vdgktMTYoJXJheCksJXJicAorCW1vdgktMjQoJXJheCksJXIxMgorCW1vdgktMzIoJXJheCksJXIxMworCW1vdgktNDAoJXJheCksJXIxNAorCW1vdgktNDgoJXJheCksJXIxNQorCW1vdgklcmJ4LDE0NCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJieAorCW1vdgklcmJwLDE2MCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJicAorCW1vdgklcjEyLDIxNigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlIxMgorCW1vdgklcjEzLDIyNCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlIxMworCW1vdgklcjE0LDIzMigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlIxNAorCW1vdgklcjE1LDI0MCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlIxNQorCisJam1wCS5MY29tbW9uX3NlaF90YWlsCisuc2l6ZQltdWxfaGFuZGxlciwuLW11bF9oYW5kbGVyCisKKy50eXBlCXNxcl9oYW5kbGVyLFxAYWJpLW9tbmlwb3RlbnQKKy5hbGlnbgkxNgorc3FyX2hhbmRsZXI6CisJcHVzaAklcnNpCisJcHVzaAklcmRpCisJcHVzaAklcmJ4CisJcHVzaAklcmJwCisJcHVzaAklcjEyCisJcHVzaAklcjEzCisJcHVzaAklcjE0CisJcHVzaAklcjE1CisJcHVzaGZxCisJc3ViCVwkNjQsJXJzcAorCisJbW92CTEyMCgkY29udGV4dCksJXJheAkjIHB1bGwgY29udGV4dC0+UmF4CisJbW92CTI0OCgkY29udGV4dCksJXJieAkjIHB1bGwgY29udGV4dC0+UmlwCisKKwltb3YJOCgkZGlzcCksJXJzaQkJIyBkaXNwLT5JbWFnZUJhc2UKKwltb3YJNTYoJGRpc3ApLCVyMTEJCSMgZGlzcC0+SGFuZGxlckRhdGEKKworCW1vdgkwKCVyMTEpLCVyMTBkCQkjIEhhbmRsZXJEYXRhWzBdCisJbGVhCSglcnNpLCVyMTApLCVyMTAJIyBlbmQgb2YgcHJvbG9ndWUgbGFiZWwKKwljbXAJJXIxMCwlcmJ4CQkjIGNvbnRleHQtPlJpcDwuTHNxcl9ib2R5CisJamIJLkxjb21tb25fc2VoX3RhaWwKKworCW1vdgkxNTIoJGNvbnRleHQpLCVyYXgJIyBwdWxsIGNvbnRleHQtPlJzcAorCisJbW92CTQoJXIxMSksJXIxMGQJCSMgSGFuZGxlckRhdGFbMV0KKwlsZWEJKCVyc2ksJXIxMCksJXIxMAkjIGVwaWxvZ3VlIGxhYmVsCisJY21wCSVyMTAsJXJieAkJIyBjb250ZXh0LT5SaXA+PS5Mc3FyX2VwaWxvZ3VlCisJamFlCS5MY29tbW9uX3NlaF90YWlsCisKKwltb3YJNDAoJXJheCksJXJheAkJIyBwdWxsIHNhdmVkIHN0YWNrIHBvaW50ZXIKKworCW1vdgktOCglcmF4KSwlcmJ4CisJbW92CS0xNiglcmF4KSwlcmJwCisJbW92CS0yNCglcmF4KSwlcjEyCisJbW92CS0zMiglcmF4KSwlcjEzCisJbW92CS00MCglcmF4KSwlcjE0CisJbW92CS00OCglcmF4KSwlcjE1CisJbW92CSVyYngsMTQ0KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UmJ4CisJbW92CSVyYnAsMTYwKCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UmJwCisJbW92CSVyMTIsMjE2KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UjEyCisJbW92CSVyMTMsMjI0KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UjEzCisJbW92CSVyMTQsMjMyKCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UjE0CisJbW92CSVyMTUsMjQwKCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UjE1CisKKy5MY29tbW9uX3NlaF90YWlsOgorCW1vdgk4KCVyYXgpLCVyZGkKKwltb3YJMTYoJXJheCksJXJzaQorCW1vdgklcmF4LDE1MigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJzcAorCW1vdgklcnNpLDE2OCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJzaQorCW1vdgklcmRpLDE3NigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJkaQorCisJbW92CTQwKCRkaXNwKSwlcmRpCQkjIGRpc3AtPkNvbnRleHRSZWNvcmQKKwltb3YJJGNvbnRleHQsJXJzaQkJIyBjb250ZXh0CisJbW92CVwkMTU0LCVlY3gJCSMgc2l6ZW9mKENPTlRFWFQpCisJLmxvbmcJMHhhNTQ4ZjNmYwkJIyBjbGQ7IHJlcCBtb3ZzcQorCisJbW92CSRkaXNwLCVyc2kKKwl4b3IJJXJjeCwlcmN4CQkjIGFyZzEsIFVOV19GTEFHX05IQU5ETEVSCisJbW92CTgoJXJzaSksJXJkeAkJIyBhcmcyLCBkaXNwLT5JbWFnZUJhc2UKKwltb3YJMCglcnNpKSwlcjgJCSMgYXJnMywgZGlzcC0+Q29udHJvbFBjCisJbW92CTE2KCVyc2kpLCVyOQkJIyBhcmc0LCBkaXNwLT5GdW5jdGlvbkVudHJ5CisJbW92CTQwKCVyc2kpLCVyMTAJCSMgZGlzcC0+Q29udGV4dFJlY29yZAorCWxlYQk1NiglcnNpKSwlcjExCQkjICZkaXNwLT5IYW5kbGVyRGF0YQorCWxlYQkyNCglcnNpKSwlcjEyCQkjICZkaXNwLT5Fc3RhYmxpc2hlckZyYW1lCisJbW92CSVyMTAsMzIoJXJzcCkJCSMgYXJnNQorCW1vdgklcjExLDQwKCVyc3ApCQkjIGFyZzYKKwltb3YJJXIxMiw0OCglcnNwKQkJIyBhcmc3CisJbW92CSVyY3gsNTYoJXJzcCkJCSMgYXJnOCwgKE5VTEwpCisJY2FsbAkqX19pbXBfUnRsVmlydHVhbFVud2luZCglcmlwKQorCisJbW92CVwkMSwlZWF4CQkjIEV4Y2VwdGlvbkNvbnRpbnVlU2VhcmNoCisJYWRkCVwkNjQsJXJzcAorCXBvcGZxCisJcG9wCSVyMTUKKwlwb3AJJXIxNAorCXBvcAklcjEzCisJcG9wCSVyMTIKKwlwb3AJJXJicAorCXBvcAklcmJ4CisJcG9wCSVyZGkKKwlwb3AJJXJzaQorCXJldAorLnNpemUJc3FyX2hhbmRsZXIsLi1zcXJfaGFuZGxlcgorCisuc2VjdGlvbgkucGRhdGEKKy5hbGlnbgk0CisJLnJ2YQkuTFNFSF9iZWdpbl9ibl9tdWxfbW9udAorCS5ydmEJLkxTRUhfZW5kX2JuX211bF9tb250CisJLnJ2YQkuTFNFSF9pbmZvX2JuX211bF9tb250CisKKwkucnZhCS5MU0VIX2JlZ2luX2JuX211bDR4X21vbnQKKwkucnZhCS5MU0VIX2VuZF9ibl9tdWw0eF9tb250CisJLnJ2YQkuTFNFSF9pbmZvX2JuX211bDR4X21vbnQKKworCS5ydmEJLkxTRUhfYmVnaW5fYm5fc3FyOHhfbW9udAorCS5ydmEJLkxTRUhfZW5kX2JuX3Nxcjh4X21vbnQKKwkucnZhCS5MU0VIX2luZm9fYm5fc3FyOHhfbW9udAorX19fCiskY29kZS49PDxfX18gaWYgKCRhZGR4KTsKKwkucnZhCS5MU0VIX2JlZ2luX2JuX211bHg0eF9tb250CisJLnJ2YQkuTFNFSF9lbmRfYm5fbXVseDR4X21vbnQKKwkucnZhCS5MU0VIX2luZm9fYm5fbXVseDR4X21vbnQKK19fXworJGNvZGUuPTw8X19fOworLnNlY3Rpb24JLnhkYXRhCisuYWxpZ24JOAorLkxTRUhfaW5mb19ibl9tdWxfbW9udDoKKwkuYnl0ZQk5LDAsMCwwCisJLnJ2YQltdWxfaGFuZGxlcgorCS5ydmEJLkxtdWxfYm9keSwuTG11bF9lcGlsb2d1ZQkjIEhhbmRsZXJEYXRhW10KKy5MU0VIX2luZm9fYm5fbXVsNHhfbW9udDoKKwkuYnl0ZQk5LDAsMCwwCisJLnJ2YQltdWxfaGFuZGxlcgorCS5ydmEJLkxtdWw0eF9ib2R5LC5MbXVsNHhfZXBpbG9ndWUJIyBIYW5kbGVyRGF0YVtdCisuTFNFSF9pbmZvX2JuX3Nxcjh4X21vbnQ6CisJLmJ5dGUJOSwwLDAsMAorCS5ydmEJc3FyX2hhbmRsZXIKKwkucnZhCS5Mc3FyOHhfYm9keSwuTHNxcjh4X2VwaWxvZ3VlCSMgSGFuZGxlckRhdGFbXQorX19fCiskY29kZS49PDxfX18gaWYgKCRhZGR4KTsKKy5MU0VIX2luZm9fYm5fbXVseDR4X21vbnQ6CisJLmJ5dGUJOSwwLDAsMAorCS5ydmEJc3FyX2hhbmRsZXIKKwkucnZhCS5MbXVseDR4X2JvZHksLkxtdWx4NHhfZXBpbG9ndWUJIyBIYW5kbGVyRGF0YVtdCitfX18KK30KKworcHJpbnQgJGNvZGU7CitjbG9zZSBTVERPVVQ7CmRpZmYgLS1naXQgYS9jcnlwdG8vYm4vYXNtL3g4Nl82NC1tb250NS5wbCBiL2NyeXB0by9ibi9hc20veDg2XzY0LW1vbnQ1LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMDdkZjkKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYm4vYXNtL3g4Nl82NC1tb250NS5wbApAQCAtMCwwICsxLDM1MTQgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQG9wZW5zc2wub3JnPiBmb3IgdGhlIE9wZW5TU0wKKyMgcHJvamVjdC4gVGhlIG1vZHVsZSBpcywgaG93ZXZlciwgZHVhbCBsaWNlbnNlZCB1bmRlciBPcGVuU1NMIGFuZAorIyBDUllQVE9HQU1TIGxpY2Vuc2VzIGRlcGVuZGluZyBvbiB3aGVyZSB5b3Ugb2J0YWluIGl0LiBGb3IgZnVydGhlcgorIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyBBdWd1c3QgMjAxMS4KKyMKKyMgQ29tcGFuaW9uIHRvIHg4Nl82NC1tb250LnBsIHRoYXQgb3B0aW1pemVzIGNhY2hlLXRpbWluZyBhdHRhY2sKKyMgY291bnRlcm1lYXN1cmVzLiBUaGUgc3Vicm91dGluZXMgYXJlIHByb2R1Y2VkIGJ5IHJlcGxhY2luZyBicFtpXQorIyByZWZlcmVuY2VzIGluIHRoZWlyIHg4Nl82NC1tb250LnBsIGNvdW50ZXJwYXJ0cyB3aXRoIGNhY2hlLW5ldXRyYWwKKyMgcmVmZXJlbmNlcyB0byBwb3dlcnMgdGFibGUgY29tcHV0ZWQgaW4gQk5fbW9kX2V4cF9tb250X2NvbnN0dGltZS4KKyMgSW4gYWRkaXRpb24gc3Vicm91dGluZSB0aGF0IHNjYXR0ZXJzIGVsZW1lbnRzIG9mIHRoZSBwb3dlcnMgdGFibGUKKyMgaXMgaW1wbGVtZW50ZWQsIHNvIHRoYXQgc2NhdHRlci0vZ2F0aGVyaW5nIGNhbiBiZSB0dW5lZCB3aXRob3V0CisjIGJuX2V4cC5jIG1vZGlmaWNhdGlvbnMuCisKKyMgQXVndXN0IDIwMTMuCisjCisjIEFkZCBNVUxYL0FEKlggY29kZSBwYXRocyBhbmQgYWRkaXRpb25hbCBpbnRlcmZhY2VzIHRvIG9wdGltaXplIGZvcgorIyBicmFuY2ggcHJlZGljdGlvbiB1bml0LiBGb3IgaW5wdXQgbGVuZ3RocyB0aGF0IGFyZSBtdWx0aXBsZXMgb2YgOAorIyB0aGUgbnAgYXJndW1lbnQgaXMgbm90IGp1c3QgbW9kdWx1cyB2YWx1ZSwgYnV0IG9uZSBpbnRlcmxlYXZlZAorIyB3aXRoIDAuIFRoaXMgaXMgdG8gb3B0aW1pemUgcG9zdC1jb25kaXRpb24uLi4KKworJGZsYXZvdXIgPSBzaGlmdDsKKyRvdXRwdXQgID0gc2hpZnQ7CitpZiAoJGZsYXZvdXIgPX4gL1wuLykgeyAkb3V0cHV0ID0gJGZsYXZvdXI7IHVuZGVmICRmbGF2b3VyOyB9CisKKyR3aW42ND0wOyAkd2luNjQ9MSBpZiAoJGZsYXZvdXIgPX4gL1tubV1hc218bWluZ3c2NC8gfHwgJG91dHB1dCA9fiAvXC5hc20kLyk7CisKKyQwID1+IG0vKC4qW1wvXFxdKVteXC9cXF0rJC87ICRkaXI9JDE7CisoICR4bGF0ZT0iJHtkaXJ9eDg2XzY0LXhsYXRlLnBsIiBhbmQgLWYgJHhsYXRlICkgb3IKKyggJHhsYXRlPSIke2Rpcn0uLi8uLi9wZXJsYXNtL3g4Nl82NC14bGF0ZS5wbCIgYW5kIC1mICR4bGF0ZSkgb3IKK2RpZSAiY2FuJ3QgbG9jYXRlIHg4Nl82NC14bGF0ZS5wbCI7CisKK29wZW4gT1VULCJ8IFwiJF5YXCIgJHhsYXRlICRmbGF2b3VyICRvdXRwdXQiOworKlNURE9VVD0qT1VUOworCitpZiAoYCRFTlZ7Q0N9IC1XYSwtdiAtYyAtbyAvZGV2L251bGwgLXggYXNzZW1ibGVyIC9kZXYvbnVsbCAyPiYxYAorCQk9fiAvR05VIGFzc2VtYmxlciB2ZXJzaW9uIChbMi05XVwuWzAtOV0rKS8pIHsKKwkkYWRkeCA9ICgkMT49Mi4yMyk7Cit9CisKK2lmICghJGFkZHggJiYgJHdpbjY0ICYmICgkZmxhdm91ciA9fiAvbmFzbS8gfHwgJEVOVntBU019ID1+IC9uYXNtLykgJiYKKwkgICAgYG5hc20gLXYgMj4mMWAgPX4gL05BU00gdmVyc2lvbiAoWzItOV1cLlswLTldKykvKSB7CisJJGFkZHggPSAoJDE+PTIuMTApOworfQorCitpZiAoISRhZGR4ICYmICR3aW42NCAmJiAoJGZsYXZvdXIgPX4gL21hc20vIHx8ICRFTlZ7QVNNfSA9fiAvbWw2NC8pICYmCisJICAgIGBtbDY0IDI+JjFgID1+IC9WZXJzaW9uIChbMC05XSspXC4vKSB7CisJJGFkZHggPSAoJDE+PTExKTsKK30KKworIyBpbnQgYm5fbXVsX21vbnRfZ2F0aGVyNSgKKyRycD0iJXJkaSI7CSMgQk5fVUxPTkcgKnJwLAorJGFwPSIlcnNpIjsJIyBjb25zdCBCTl9VTE9ORyAqYXAsCiskYnA9IiVyZHgiOwkjIGNvbnN0IEJOX1VMT05HICpicCwKKyRucD0iJXJjeCI7CSMgY29uc3QgQk5fVUxPTkcgKm5wLAorJG4wPSIlcjgiOwkjIGNvbnN0IEJOX1VMT05HICpuMCwKKyRudW09IiVyOSI7CSMgaW50IG51bSwKKwkJIyBpbnQgaWR4KTsJIyAwIHRvIDJeNS0xLCAiaW5kZXgiIGluICRicCBob2xkaW5nCisJCQkJIyBwcmUtY29tcHV0ZWQgcG93ZXJzIG9mIGEnLCBpbnRlcmxhY2VkCisJCQkJIyBpbiBzdWNoIG1hbm5lciB0aGF0IGJbMF0gaXMgJGJwW2lkeF0sCisJCQkJIyBiWzFdIGlzIFsyXjUraWR4XSwgZXRjLgorJGxvMD0iJXIxMCI7CiskaGkwPSIlcjExIjsKKyRoaTE9IiVyMTMiOworJGk9IiVyMTQiOworJGo9IiVyMTUiOworJG0wPSIlcmJ4IjsKKyRtMT0iJXJicCI7CisKKyRjb2RlPTw8X19fOworLnRleHQKKworLmV4dGVybglPUEVOU1NMX2lhMzJjYXBfUAorCisuZ2xvYmwJYm5fbXVsX21vbnRfZ2F0aGVyNQorLnR5cGUJYm5fbXVsX21vbnRfZ2F0aGVyNSxcQGZ1bmN0aW9uLDYKKy5hbGlnbgk2NAorYm5fbXVsX21vbnRfZ2F0aGVyNToKKwl0ZXN0CVwkNywke251bX1kCisJam56CS5MbXVsX2VudGVyCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJGFkZHgpOworCW1vdglPUEVOU1NMX2lhMzJjYXBfUCs4KCVyaXApLCVyMTFkCitfX18KKyRjb2RlLj08PF9fXzsKKwlqbXAJLkxtdWw0eF9lbnRlcgorCisuYWxpZ24JMTYKKy5MbXVsX2VudGVyOgorCW1vdgkke251bX1kLCR7bnVtfWQKKwltb3YJJXJzcCwlcmF4CisJbW92CWAoJHdpbjY0PzU2OjgpYCglcnNwKSwlcjEwZAkjIGxvYWQgN3RoIGFyZ3VtZW50CisJcHVzaAklcmJ4CisJcHVzaAklcmJwCisJcHVzaAklcjEyCisJcHVzaAklcjEzCisJcHVzaAklcjE0CisJcHVzaAklcjE1CitfX18KKyRjb2RlLj08PF9fXyBpZiAoJHdpbjY0KTsKKwlsZWEJLTB4MjgoJXJzcCksJXJzcAorCW1vdmFwcwkleG1tNiwoJXJzcCkKKwltb3ZhcHMJJXhtbTcsMHgxMCglcnNwKQorX19fCiskY29kZS49PDxfX187CisJbGVhCTIoJG51bSksJXIxMQorCW5lZwklcjExCisJbGVhCSglcnNwLCVyMTEsOCksJXJzcAkjIHRwPWFsbG9jYSg4KihudW0rMikpCisJYW5kCVwkLTEwMjQsJXJzcAkJIyBtaW5pbWl6ZSBUTEIgdXNhZ2UKKworCW1vdgklcmF4LDgoJXJzcCwkbnVtLDgpCSMgdHBbbnVtKzFdPSVyc3AKKy5MbXVsX2JvZHk6CisJbW92CSRicCwlcjEyCQkjIHJlYXNzaWduICRicAorX19fCisJCSRicD0iJXIxMiI7CisJCSRTVFJJREU9MioqNSo4OwkJIyA1IGlzICJ3aW5kb3cgc2l6ZSIKKwkJJE49JFNUUklERS80OwkJIyBzaG91bGQgbWF0Y2ggY2FjaGUgbGluZSBzaXplCiskY29kZS49PDxfX187CisJbW92CSVyMTAsJXIxMQorCXNocglcJGBsb2coJE4vOCkvbG9nKDIpYCwlcjEwCisJYW5kCVwkYCROLzgtMWAsJXIxMQorCW5vdAklcjEwCisJbGVhCS5MbWFnaWNfbWFza3MoJXJpcCksJXJheAorCWFuZAlcJGAyKio1LygkTi84KS0xYCwlcjEwCSMgNSBpcyAid2luZG93IHNpemUiCisJbGVhCTk2KCRicCwlcjExLDgpLCRicAkjIHBvaW50ZXIgd2l0aGluIDFzdCBjYWNoZSBsaW5lCisJbW92cQkwKCVyYXgsJXIxMCw4KSwleG1tNAkjIHNldCBvZiBtYXNrcyBkZW5vdGluZyB3aGljaAorCW1vdnEJOCglcmF4LCVyMTAsOCksJXhtbTUJIyBjYWNoZSBsaW5lIGNvbnRhaW5zIGVsZW1lbnQKKwltb3ZxCTE2KCVyYXgsJXIxMCw4KSwleG1tNgkjIGRlbm90ZWQgYnkgN3RoIGFyZ3VtZW50CisJbW92cQkyNCglcmF4LCVyMTAsOCksJXhtbTcKKworCW1vdnEJYDAqJFNUUklERS80LTk2YCgkYnApLCV4bW0wCisJbW92cQlgMSokU1RSSURFLzQtOTZgKCRicCksJXhtbTEKKwlwYW5kCSV4bW00LCV4bW0wCisJbW92cQlgMiokU1RSSURFLzQtOTZgKCRicCksJXhtbTIKKwlwYW5kCSV4bW01LCV4bW0xCisJbW92cQlgMyokU1RSSURFLzQtOTZgKCRicCksJXhtbTMKKwlwYW5kCSV4bW02LCV4bW0yCisJcG9yCSV4bW0xLCV4bW0wCisJcGFuZAkleG1tNywleG1tMworCXBvcgkleG1tMiwleG1tMAorCWxlYQkkU1RSSURFKCRicCksJGJwCisJcG9yCSV4bW0zLCV4bW0wCisKKwltb3ZxCSV4bW0wLCRtMAkJIyBtMD1icFswXQorCisJbW92CSgkbjApLCRuMAkJIyBwdWxsIG4wWzBdIHZhbHVlCisJbW92CSgkYXApLCVyYXgKKworCXhvcgkkaSwkaQkJCSMgaT0wCisJeG9yCSRqLCRqCQkJIyBqPTAKKworCW1vdnEJYDAqJFNUUklERS80LTk2YCgkYnApLCV4bW0wCisJbW92cQlgMSokU1RSSURFLzQtOTZgKCRicCksJXhtbTEKKwlwYW5kCSV4bW00LCV4bW0wCisJbW92cQlgMiokU1RSSURFLzQtOTZgKCRicCksJXhtbTIKKwlwYW5kCSV4bW01LCV4bW0xCisKKwltb3YJJG4wLCRtMQorCW11bHEJJG0wCQkJIyBhcFswXSpicFswXQorCW1vdgklcmF4LCRsbzAKKwltb3YJKCRucCksJXJheAorCisJbW92cQlgMyokU1RSSURFLzQtOTZgKCRicCksJXhtbTMKKwlwYW5kCSV4bW02LCV4bW0yCisJcG9yCSV4bW0xLCV4bW0wCisJcGFuZAkleG1tNywleG1tMworCisJaW11bHEJJGxvMCwkbTEJCSMgInRwWzBdIipuMAorCW1vdgklcmR4LCRoaTAKKworCXBvcgkleG1tMiwleG1tMAorCWxlYQkkU1RSSURFKCRicCksJGJwCisJcG9yCSV4bW0zLCV4bW0wCisKKwltdWxxCSRtMQkJCSMgbnBbMF0qbTEKKwlhZGQJJXJheCwkbG8wCQkjIGRpc2NhcmRlZAorCW1vdgk4KCRhcCksJXJheAorCWFkYwlcJDAsJXJkeAorCW1vdgklcmR4LCRoaTEKKworCWxlYQkxKCRqKSwkagkJIyBqKysKKwlqbXAJLkwxc3RfZW50ZXIKKworLmFsaWduCTE2CisuTDFzdDoKKwlhZGQJJXJheCwkaGkxCisJbW92CSgkYXAsJGosOCksJXJheAorCWFkYwlcJDAsJXJkeAorCWFkZAkkaGkwLCRoaTEJCSMgbnBbal0qbTErYXBbal0qYnBbMF0KKwltb3YJJGxvMCwkaGkwCisJYWRjCVwkMCwlcmR4CisJbW92CSRoaTEsLTE2KCVyc3AsJGosOCkJIyB0cFtqLTFdCisJbW92CSVyZHgsJGhpMQorCisuTDFzdF9lbnRlcjoKKwltdWxxCSRtMAkJCSMgYXBbal0qYnBbMF0KKwlhZGQJJXJheCwkaGkwCisJbW92CSgkbnAsJGosOCksJXJheAorCWFkYwlcJDAsJXJkeAorCWxlYQkxKCRqKSwkagkJIyBqKysKKwltb3YJJXJkeCwkbG8wCisKKwltdWxxCSRtMQkJCSMgbnBbal0qbTEKKwljbXAJJG51bSwkagorCWpuZQkuTDFzdAorCisJbW92cQkleG1tMCwkbTAJCSMgYnBbMV0KKworCWFkZAklcmF4LCRoaTEKKwltb3YJKCRhcCksJXJheAkJIyBhcFswXQorCWFkYwlcJDAsJXJkeAorCWFkZAkkaGkwLCRoaTEJCSMgbnBbal0qbTErYXBbal0qYnBbMF0KKwlhZGMJXCQwLCVyZHgKKwltb3YJJGhpMSwtMTYoJXJzcCwkaiw4KQkjIHRwW2otMV0KKwltb3YJJXJkeCwkaGkxCisJbW92CSRsbzAsJGhpMAorCisJeG9yCSVyZHgsJXJkeAorCWFkZAkkaGkwLCRoaTEKKwlhZGMJXCQwLCVyZHgKKwltb3YJJGhpMSwtOCglcnNwLCRudW0sOCkKKwltb3YJJXJkeCwoJXJzcCwkbnVtLDgpCSMgc3RvcmUgdXBtb3N0IG92ZXJmbG93IGJpdAorCisJbGVhCTEoJGkpLCRpCQkjIGkrKworCWptcAkuTG91dGVyCisuYWxpZ24JMTYKKy5Mb3V0ZXI6CisJeG9yCSRqLCRqCQkJIyBqPTAKKwltb3YJJG4wLCRtMQorCW1vdgkoJXJzcCksJGxvMAorCisJbW92cQlgMCokU1RSSURFLzQtOTZgKCRicCksJXhtbTAKKwltb3ZxCWAxKiRTVFJJREUvNC05NmAoJGJwKSwleG1tMQorCXBhbmQJJXhtbTQsJXhtbTAKKwltb3ZxCWAyKiRTVFJJREUvNC05NmAoJGJwKSwleG1tMgorCXBhbmQJJXhtbTUsJXhtbTEKKworCW11bHEJJG0wCQkJIyBhcFswXSpicFtpXQorCWFkZAklcmF4LCRsbzAJCSMgYXBbMF0qYnBbaV0rdHBbMF0KKwltb3YJKCRucCksJXJheAorCWFkYwlcJDAsJXJkeAorCisJbW92cQlgMyokU1RSSURFLzQtOTZgKCRicCksJXhtbTMKKwlwYW5kCSV4bW02LCV4bW0yCisJcG9yCSV4bW0xLCV4bW0wCisJcGFuZAkleG1tNywleG1tMworCisJaW11bHEJJGxvMCwkbTEJCSMgdHBbMF0qbjAKKwltb3YJJXJkeCwkaGkwCisKKwlwb3IJJXhtbTIsJXhtbTAKKwlsZWEJJFNUUklERSgkYnApLCRicAorCXBvcgkleG1tMywleG1tMAorCisJbXVscQkkbTEJCQkjIG5wWzBdKm0xCisJYWRkCSVyYXgsJGxvMAkJIyBkaXNjYXJkZWQKKwltb3YJOCgkYXApLCVyYXgKKwlhZGMJXCQwLCVyZHgKKwltb3YJOCglcnNwKSwkbG8wCQkjIHRwWzFdCisJbW92CSVyZHgsJGhpMQorCisJbGVhCTEoJGopLCRqCQkjIGorKworCWptcAkuTGlubmVyX2VudGVyCisKKy5hbGlnbgkxNgorLkxpbm5lcjoKKwlhZGQJJXJheCwkaGkxCisJbW92CSgkYXAsJGosOCksJXJheAorCWFkYwlcJDAsJXJkeAorCWFkZAkkbG8wLCRoaTEJCSMgbnBbal0qbTErYXBbal0qYnBbaV0rdHBbal0KKwltb3YJKCVyc3AsJGosOCksJGxvMAorCWFkYwlcJDAsJXJkeAorCW1vdgkkaGkxLC0xNiglcnNwLCRqLDgpCSMgdHBbai0xXQorCW1vdgklcmR4LCRoaTEKKworLkxpbm5lcl9lbnRlcjoKKwltdWxxCSRtMAkJCSMgYXBbal0qYnBbaV0KKwlhZGQJJXJheCwkaGkwCisJbW92CSgkbnAsJGosOCksJXJheAorCWFkYwlcJDAsJXJkeAorCWFkZAkkaGkwLCRsbzAJCSMgYXBbal0qYnBbaV0rdHBbal0KKwltb3YJJXJkeCwkaGkwCisJYWRjCVwkMCwkaGkwCisJbGVhCTEoJGopLCRqCQkjIGorKworCisJbXVscQkkbTEJCQkjIG5wW2pdKm0xCisJY21wCSRudW0sJGoKKwlqbmUJLkxpbm5lcgorCisJbW92cQkleG1tMCwkbTAJCSMgYnBbaSsxXQorCisJYWRkCSVyYXgsJGhpMQorCW1vdgkoJGFwKSwlcmF4CQkjIGFwWzBdCisJYWRjCVwkMCwlcmR4CisJYWRkCSRsbzAsJGhpMQkJIyBucFtqXSptMSthcFtqXSpicFtpXSt0cFtqXQorCW1vdgkoJXJzcCwkaiw4KSwkbG8wCisJYWRjCVwkMCwlcmR4CisJbW92CSRoaTEsLTE2KCVyc3AsJGosOCkJIyB0cFtqLTFdCisJbW92CSVyZHgsJGhpMQorCisJeG9yCSVyZHgsJXJkeAorCWFkZAkkaGkwLCRoaTEKKwlhZGMJXCQwLCVyZHgKKwlhZGQJJGxvMCwkaGkxCQkjIHB1bGwgdXBtb3N0IG92ZXJmbG93IGJpdAorCWFkYwlcJDAsJXJkeAorCW1vdgkkaGkxLC04KCVyc3AsJG51bSw4KQorCW1vdgklcmR4LCglcnNwLCRudW0sOCkJIyBzdG9yZSB1cG1vc3Qgb3ZlcmZsb3cgYml0CisKKwlsZWEJMSgkaSksJGkJCSMgaSsrCisJY21wCSRudW0sJGkKKwlqYgkuTG91dGVyCisKKwl4b3IJJGksJGkJCQkjIGk9MCBhbmQgY2xlYXIgQ0YhCisJbW92CSglcnNwKSwlcmF4CQkjIHRwWzBdCisJbGVhCSglcnNwKSwkYXAJCSMgYm9ycm93IGFwIGZvciB0cAorCW1vdgkkbnVtLCRqCQkJIyBqPW51bQorCWptcAkuTHN1YgorLmFsaWduCTE2CisuTHN1YjoJc2JiCSgkbnAsJGksOCksJXJheAorCW1vdgklcmF4LCgkcnAsJGksOCkJCSMgcnBbaV09dHBbaV0tbnBbaV0KKwltb3YJOCgkYXAsJGksOCksJXJheAkjIHRwW2krMV0KKwlsZWEJMSgkaSksJGkJCSMgaSsrCisJZGVjCSRqCQkJIyBkb2Vzbm4ndCBhZmZlY3QgQ0YhCisJam56CS5Mc3ViCisKKwlzYmIJXCQwLCVyYXgJCSMgaGFuZGxlIHVwbW9zdCBvdmVyZmxvdyBiaXQKKwl4b3IJJGksJGkKKwlhbmQJJXJheCwkYXAKKwlub3QJJXJheAorCW1vdgkkcnAsJG5wCisJYW5kCSVyYXgsJG5wCisJbW92CSRudW0sJGoJCQkjIGo9bnVtCisJb3IJJG5wLCRhcAkJCSMgYXA9Ym9ycm93P3RwOnJwCisuYWxpZ24JMTYKKy5MY29weToJCQkJCSMgY29weSBvciBpbi1wbGFjZSByZWZyZXNoCisJbW92CSgkYXAsJGksOCksJXJheAorCW1vdgkkaSwoJXJzcCwkaSw4KQkJIyB6YXAgdGVtcG9yYXJ5IHZlY3RvcgorCW1vdgklcmF4LCgkcnAsJGksOCkJCSMgcnBbaV09dHBbaV0KKwlsZWEJMSgkaSksJGkKKwlzdWIJXCQxLCRqCisJam56CS5MY29weQorCisJbW92CTgoJXJzcCwkbnVtLDgpLCVyc2kJIyByZXN0b3JlICVyc3AKKwltb3YJXCQxLCVyYXgKK19fXworJGNvZGUuPTw8X19fIGlmICgkd2luNjQpOworCW1vdmFwcwktODgoJXJzaSksJXhtbTYKKwltb3ZhcHMJLTcyKCVyc2kpLCV4bW03CitfX18KKyRjb2RlLj08PF9fXzsKKwltb3YJLTQ4KCVyc2kpLCVyMTUKKwltb3YJLTQwKCVyc2kpLCVyMTQKKwltb3YJLTMyKCVyc2kpLCVyMTMKKwltb3YJLTI0KCVyc2kpLCVyMTIKKwltb3YJLTE2KCVyc2kpLCVyYnAKKwltb3YJLTgoJXJzaSksJXJieAorCWxlYQkoJXJzaSksJXJzcAorLkxtdWxfZXBpbG9ndWU6CisJcmV0Cisuc2l6ZQlibl9tdWxfbW9udF9nYXRoZXI1LC4tYm5fbXVsX21vbnRfZ2F0aGVyNQorX19fCit7e3sKK215IEBBPSgiJXIxMCIsIiVyMTEiKTsKK215IEBOPSgiJXIxMyIsIiVyZGkiKTsKKyRjb2RlLj08PF9fXzsKKy50eXBlCWJuX211bDR4X21vbnRfZ2F0aGVyNSxcQGZ1bmN0aW9uLDYKKy5hbGlnbgkzMgorYm5fbXVsNHhfbW9udF9nYXRoZXI1OgorLkxtdWw0eF9lbnRlcjoKK19fXworJGNvZGUuPTw8X19fIGlmICgkYWRkeCk7CisJYW5kCVwkMHg4MDEwMCwlcjExZAorCWNtcAlcJDB4ODAxMDAsJXIxMWQKKwlqZQkuTG11bHg0eF9lbnRlcgorX19fCiskY29kZS49PDxfX187CisJLmJ5dGUJMHg2NworCW1vdgklcnNwLCVyYXgKKwlwdXNoCSVyYngKKwlwdXNoCSVyYnAKKwlwdXNoCSVyMTIKKwlwdXNoCSVyMTMKKwlwdXNoCSVyMTQKKwlwdXNoCSVyMTUKK19fXworJGNvZGUuPTw8X19fIGlmICgkd2luNjQpOworCWxlYQktMHgyOCglcnNwKSwlcnNwCisJbW92YXBzCSV4bW02LCglcnNwKQorCW1vdmFwcwkleG1tNywweDEwKCVyc3ApCitfX18KKyRjb2RlLj08PF9fXzsKKwkuYnl0ZQkweDY3CisJbW92CSR7bnVtfWQsJXIxMGQKKwlzaGwJXCQzLCR7bnVtfWQKKwlzaGwJXCQzKzIsJXIxMGQJCSMgNCokbnVtCisJbmVnCSRudW0JCQkjIC0kbnVtCisKKwkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCSMgZW5zdXJlIHRoYXQgc3RhY2sgZnJhbWUgZG9lc24ndCBhbGlhcyB3aXRoICRhcHRyKzQqJG51bQorCSMgbW9kdWxvIDQwOTYsIHdoaWNoIGNvdmVycyByZXRbbnVtXSwgYW1bbnVtXSBhbmQgblsyKm51bV0KKwkjIChzZWUgYm5fZXhwLmMpLiB0aGlzIGlzIGRvbmUgdG8gYWxsb3cgbWVtb3J5IGRpc2FtYmlndWF0aW9uCisJIyBsb2dpYyBkbyBpdHMgbWFnaWMuIFtleGNlc3NpdmUgZnJhbWUgaXMgYWxsb2NhdGVkIGluIG9yZGVyCisJIyB0byBhbGxvdyBibl9mcm9tX21vbnQ4eCB0byBjbGVhciBpdC5dCisJIworCWxlYQktNjQoJXJzcCwkbnVtLDIpLCVyMTEKKwlzdWIJJGFwLCVyMTEKKwlhbmQJXCQ0MDk1LCVyMTEKKwljbXAJJXIxMSwlcjEwCisJamIJLkxtdWw0eHNwX2FsdAorCXN1YgklcjExLCVyc3AJCSMgYWxpZ24gd2l0aCAkYXAKKwlsZWEJLTY0KCVyc3AsJG51bSwyKSwlcnNwCSMgYWxsb2NhKDEyOCtudW0qOCkKKwlqbXAJLkxtdWw0eHNwX2RvbmUKKworLmFsaWduCTMyCisuTG11bDR4c3BfYWx0OgorCWxlYQk0MDk2LTY0KCwkbnVtLDIpLCVyMTAKKwlsZWEJLTY0KCVyc3AsJG51bSwyKSwlcnNwCSMgYWxsb2NhKDEyOCtudW0qOCkKKwlzdWIJJXIxMCwlcjExCisJbW92CVwkMCwlcjEwCisJY21vdmMJJXIxMCwlcjExCisJc3ViCSVyMTEsJXJzcAorLkxtdWw0eHNwX2RvbmU6CisJYW5kCVwkLTY0LCVyc3AKKwluZWcJJG51bQorCisJbW92CSVyYXgsNDAoJXJzcCkKKy5MbXVsNHhfYm9keToKKworCWNhbGwJbXVsNHhfaW50ZXJuYWwKKworCW1vdgk0MCglcnNwKSwlcnNpCQkjIHJlc3RvcmUgJXJzcAorCW1vdglcJDEsJXJheAorX19fCiskY29kZS49PDxfX18gaWYgKCR3aW42NCk7CisJbW92YXBzCS04OCglcnNpKSwleG1tNgorCW1vdmFwcwktNzIoJXJzaSksJXhtbTcKK19fXworJGNvZGUuPTw8X19fOworCW1vdgktNDgoJXJzaSksJXIxNQorCW1vdgktNDAoJXJzaSksJXIxNAorCW1vdgktMzIoJXJzaSksJXIxMworCW1vdgktMjQoJXJzaSksJXIxMgorCW1vdgktMTYoJXJzaSksJXJicAorCW1vdgktOCglcnNpKSwlcmJ4CisJbGVhCSglcnNpKSwlcnNwCisuTG11bDR4X2VwaWxvZ3VlOgorCXJldAorLnNpemUJYm5fbXVsNHhfbW9udF9nYXRoZXI1LC4tYm5fbXVsNHhfbW9udF9nYXRoZXI1CisKKy50eXBlCW11bDR4X2ludGVybmFsLFxAYWJpLW9tbmlwb3RlbnQKKy5hbGlnbgkzMgorbXVsNHhfaW50ZXJuYWw6CisJc2hsCVwkNSwkbnVtCisJbW92CWAoJHdpbjY0PzU2OjgpYCglcmF4KSwlcjEwZAkjIGxvYWQgN3RoIGFyZ3VtZW50CisJbGVhCTI1NiglcmR4LCRudW0pLCVyMTMKKwlzaHIJXCQ1LCRudW0JCSMgcmVzdG9yZSAkbnVtCitfX18KKwkJJGJwPSIlcjEyIjsKKwkJJFNUUklERT0yKio1Kjg7CQkjIDUgaXMgIndpbmRvdyBzaXplIgorCQkkTj0kU1RSSURFLzQ7CQkjIHNob3VsZCBtYXRjaCBjYWNoZSBsaW5lIHNpemUKKwkJJHRwPSRpOworJGNvZGUuPTw8X19fOworCW1vdgklcjEwLCVyMTEKKwlzaHIJXCRgbG9nKCROLzgpL2xvZygyKWAsJXIxMAorCWFuZAlcJGAkTi84LTFgLCVyMTEKKwlub3QJJXIxMAorCWxlYQkuTG1hZ2ljX21hc2tzKCVyaXApLCVyYXgKKwlhbmQJXCRgMioqNS8oJE4vOCktMWAsJXIxMAkjIDUgaXMgIndpbmRvdyBzaXplIgorCWxlYQk5NiglcmR4LCVyMTEsOCksJGJwCSMgcG9pbnRlciB3aXRoaW4gMXN0IGNhY2hlIGxpbmUKKwltb3ZxCTAoJXJheCwlcjEwLDgpLCV4bW00CSMgc2V0IG9mIG1hc2tzIGRlbm90aW5nIHdoaWNoCisJbW92cQk4KCVyYXgsJXIxMCw4KSwleG1tNQkjIGNhY2hlIGxpbmUgY29udGFpbnMgZWxlbWVudAorCWFkZAlcJDcsJXIxMQorCW1vdnEJMTYoJXJheCwlcjEwLDgpLCV4bW02CSMgZGVub3RlZCBieSA3dGggYXJndW1lbnQKKwltb3ZxCTI0KCVyYXgsJXIxMCw4KSwleG1tNworCWFuZAlcJDcsJXIxMQorCisJbW92cQlgMCokU1RSSURFLzQtOTZgKCRicCksJXhtbTAKKwlsZWEJJFNUUklERSgkYnApLCR0cAkjIGJvcnJvdyAkdHAKKwltb3ZxCWAxKiRTVFJJREUvNC05NmAoJGJwKSwleG1tMQorCXBhbmQJJXhtbTQsJXhtbTAKKwltb3ZxCWAyKiRTVFJJREUvNC05NmAoJGJwKSwleG1tMgorCXBhbmQJJXhtbTUsJXhtbTEKKwltb3ZxCWAzKiRTVFJJREUvNC05NmAoJGJwKSwleG1tMworCXBhbmQJJXhtbTYsJXhtbTIKKwkuYnl0ZQkweDY3CisJcG9yCSV4bW0xLCV4bW0wCisJbW92cQlgMCokU1RSSURFLzQtOTZgKCR0cCksJXhtbTEKKwkuYnl0ZQkweDY3CisJcGFuZAkleG1tNywleG1tMworCS5ieXRlCTB4NjcKKwlwb3IJJXhtbTIsJXhtbTAKKwltb3ZxCWAxKiRTVFJJREUvNC05NmAoJHRwKSwleG1tMgorCS5ieXRlCTB4NjcKKwlwYW5kCSV4bW00LCV4bW0xCisJLmJ5dGUJMHg2NworCXBvcgkleG1tMywleG1tMAorCW1vdnEJYDIqJFNUUklERS80LTk2YCgkdHApLCV4bW0zCisKKwltb3ZxCSV4bW0wLCRtMAkJIyBtMD1icFswXQorCW1vdnEJYDMqJFNUUklERS80LTk2YCgkdHApLCV4bW0wCisJbW92CSVyMTMsMTYrOCglcnNwKQkJIyBzYXZlIGVuZCBvZiBiW251bV0KKwltb3YJJHJwLCA1Nis4KCVyc3ApCQkjIHNhdmUgJHJwCisKKwltb3YJKCRuMCksJG4wCQkjIHB1bGwgbjBbMF0gdmFsdWUKKwltb3YJKCRhcCksJXJheAorCWxlYQkoJGFwLCRudW0pLCRhcAkJIyBlbmQgb2YgYVtudW1dCisJbmVnCSRudW0KKworCW1vdgkkbjAsJG0xCisJbXVscQkkbTAJCQkjIGFwWzBdKmJwWzBdCisJbW92CSVyYXgsJEFbMF0KKwltb3YJKCRucCksJXJheAorCisJcGFuZAkleG1tNSwleG1tMgorCXBhbmQJJXhtbTYsJXhtbTMKKwlwb3IJJXhtbTIsJXhtbTEKKworCWltdWxxCSRBWzBdLCRtMQkJIyAidHBbMF0iKm4wCisJIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwkjICR0cCBpcyBjaG9zZW4gc28gdGhhdCB3cml0aW5nIHRvIHRvcC1tb3N0IGVsZW1lbnQgb2YgdGhlCisJIyB2ZWN0b3Igb2NjdXJzIGp1c3QgImFib3ZlIiByZWZlcmVuY2VzIHRvIHBvd2VycyB0YWJsZSwKKwkjICJhYm92ZSIgbW9kdWxvIGNhY2hlLWxpbmUgc2l6ZSwgd2hpY2ggZWZmZWN0aXZlbHkgcHJlY2x1ZGVzCisJIyBwb3NzaWJpbGl0eSBvZiBtZW1vcnkgZGlzYW1iaWd1YXRpb24gbG9naWMgZmFpbHVyZSB3aGVuCisJIyBhY2Nlc3NpbmcgdGhlIHRhYmxlLgorCSMgCisJbGVhCTY0KzgoJXJzcCwlcjExLDgpLCR0cAorCW1vdgklcmR4LCRBWzFdCisKKwlwYW5kCSV4bW03LCV4bW0wCisJcG9yCSV4bW0zLCV4bW0xCisJbGVhCTIqJFNUUklERSgkYnApLCRicAorCXBvcgkleG1tMSwleG1tMAorCisJbXVscQkkbTEJCQkjIG5wWzBdKm0xCisJYWRkCSVyYXgsJEFbMF0JCSMgZGlzY2FyZGVkCisJbW92CTgoJGFwLCRudW0pLCVyYXgKKwlhZGMJXCQwLCVyZHgKKwltb3YJJXJkeCwkTlsxXQorCisJbXVscQkkbTAKKwlhZGQJJXJheCwkQVsxXQorCW1vdgkxNioxKCRucCksJXJheAkJIyBpbnRlcmxlYXZlZCB3aXRoIDAsIHRoZXJlZm9yZSAxNipuCisJYWRjCVwkMCwlcmR4CisJbW92CSVyZHgsJEFbMF0KKworCW11bHEJJG0xCisJYWRkCSVyYXgsJE5bMV0KKwltb3YJMTYoJGFwLCRudW0pLCVyYXgKKwlhZGMJXCQwLCVyZHgKKwlhZGQJJEFbMV0sJE5bMV0KKwlsZWEJNCo4KCRudW0pLCRqCQkjIGo9NAorCWxlYQkxNio0KCRucCksJG5wCisJYWRjCVwkMCwlcmR4CisJbW92CSROWzFdLCgkdHApCisJbW92CSVyZHgsJE5bMF0KKwlqbXAJLkwxc3Q0eAorCisuYWxpZ24JMzIKKy5MMXN0NHg6CisJbXVscQkkbTAJCQkjIGFwW2pdKmJwWzBdCisJYWRkCSVyYXgsJEFbMF0KKwltb3YJLTE2KjIoJG5wKSwlcmF4CisJbGVhCTMyKCR0cCksJHRwCisJYWRjCVwkMCwlcmR4CisJbW92CSVyZHgsJEFbMV0KKworCW11bHEJJG0xCQkJIyBucFtqXSptMQorCWFkZAklcmF4LCROWzBdCisJbW92CS04KCRhcCwkaiksJXJheAorCWFkYwlcJDAsJXJkeAorCWFkZAkkQVswXSwkTlswXQkJIyBucFtqXSptMSthcFtqXSpicFswXQorCWFkYwlcJDAsJXJkeAorCW1vdgkkTlswXSwtMjQoJHRwKQkJIyB0cFtqLTFdCisJbW92CSVyZHgsJE5bMV0KKworCW11bHEJJG0wCQkJIyBhcFtqXSpicFswXQorCWFkZAklcmF4LCRBWzFdCisJbW92CS0xNioxKCRucCksJXJheAorCWFkYwlcJDAsJXJkeAorCW1vdgklcmR4LCRBWzBdCisKKwltdWxxCSRtMQkJCSMgbnBbal0qbTEKKwlhZGQJJXJheCwkTlsxXQorCW1vdgkoJGFwLCRqKSwlcmF4CisJYWRjCVwkMCwlcmR4CisJYWRkCSRBWzFdLCROWzFdCQkjIG5wW2pdKm0xK2FwW2pdKmJwWzBdCisJYWRjCVwkMCwlcmR4CisJbW92CSROWzFdLC0xNigkdHApCQkjIHRwW2otMV0KKwltb3YJJXJkeCwkTlswXQorCisJbXVscQkkbTAJCQkjIGFwW2pdKmJwWzBdCisJYWRkCSVyYXgsJEFbMF0KKwltb3YJMTYqMCgkbnApLCVyYXgKKwlhZGMJXCQwLCVyZHgKKwltb3YJJXJkeCwkQVsxXQorCisJbXVscQkkbTEJCQkjIG5wW2pdKm0xCisJYWRkCSVyYXgsJE5bMF0KKwltb3YJOCgkYXAsJGopLCVyYXgKKwlhZGMJXCQwLCVyZHgKKwlhZGQJJEFbMF0sJE5bMF0JCSMgbnBbal0qbTErYXBbal0qYnBbMF0KKwlhZGMJXCQwLCVyZHgKKwltb3YJJE5bMF0sLTgoJHRwKQkJIyB0cFtqLTFdCisJbW92CSVyZHgsJE5bMV0KKworCW11bHEJJG0wCQkJIyBhcFtqXSpicFswXQorCWFkZAklcmF4LCRBWzFdCisJbW92CTE2KjEoJG5wKSwlcmF4CisJYWRjCVwkMCwlcmR4CisJbW92CSVyZHgsJEFbMF0KKworCW11bHEJJG0xCQkJIyBucFtqXSptMQorCWFkZAklcmF4LCROWzFdCisJbW92CTE2KCRhcCwkaiksJXJheAorCWFkYwlcJDAsJXJkeAorCWFkZAkkQVsxXSwkTlsxXQkJIyBucFtqXSptMSthcFtqXSpicFswXQorCWxlYQkxNio0KCRucCksJG5wCisJYWRjCVwkMCwlcmR4CisJbW92CSROWzFdLCgkdHApCQkjIHRwW2otMV0KKwltb3YJJXJkeCwkTlswXQorCisJYWRkCVwkMzIsJGoJCQkjIGorPTQKKwlqbnoJLkwxc3Q0eAorCisJbXVscQkkbTAJCQkjIGFwW2pdKmJwWzBdCisJYWRkCSVyYXgsJEFbMF0KKwltb3YJLTE2KjIoJG5wKSwlcmF4CisJbGVhCTMyKCR0cCksJHRwCisJYWRjCVwkMCwlcmR4CisJbW92CSVyZHgsJEFbMV0KKworCW11bHEJJG0xCQkJIyBucFtqXSptMQorCWFkZAklcmF4LCROWzBdCisJbW92CS04KCRhcCksJXJheAorCWFkYwlcJDAsJXJkeAorCWFkZAkkQVswXSwkTlswXQkJIyBucFtqXSptMSthcFtqXSpicFswXQorCWFkYwlcJDAsJXJkeAorCW1vdgkkTlswXSwtMjQoJHRwKQkJIyB0cFtqLTFdCisJbW92CSVyZHgsJE5bMV0KKworCW11bHEJJG0wCQkJIyBhcFtqXSpicFswXQorCWFkZAklcmF4LCRBWzFdCisJbW92CS0xNioxKCRucCksJXJheAorCWFkYwlcJDAsJXJkeAorCW1vdgklcmR4LCRBWzBdCisKKwltdWxxCSRtMQkJCSMgbnBbal0qbTEKKwlhZGQJJXJheCwkTlsxXQorCW1vdgkoJGFwLCRudW0pLCVyYXgJCSMgYXBbMF0KKwlhZGMJXCQwLCVyZHgKKwlhZGQJJEFbMV0sJE5bMV0JCSMgbnBbal0qbTErYXBbal0qYnBbMF0KKwlhZGMJXCQwLCVyZHgKKwltb3YJJE5bMV0sLTE2KCR0cCkJCSMgdHBbai0xXQorCW1vdgklcmR4LCROWzBdCisKKwltb3ZxCSV4bW0wLCRtMAkJIyBicFsxXQorCWxlYQkoJG5wLCRudW0sMiksJG5wCSMgcmV3aW5kICRucAorCisJeG9yCSROWzFdLCROWzFdCisJYWRkCSRBWzBdLCROWzBdCisJYWRjCVwkMCwkTlsxXQorCW1vdgkkTlswXSwtOCgkdHApCisKKwlqbXAJLkxvdXRlcjR4CisKKy5hbGlnbgkzMgorLkxvdXRlcjR4OgorCW1vdgkoJHRwLCRudW0pLCRBWzBdCisJbW92CSRuMCwkbTEKKwltdWxxCSRtMAkJCSMgYXBbMF0qYnBbaV0KKwlhZGQJJXJheCwkQVswXQkJIyBhcFswXSpicFtpXSt0cFswXQorCW1vdgkoJG5wKSwlcmF4CisJYWRjCVwkMCwlcmR4CisKKwltb3ZxCWAwKiRTVFJJREUvNC05NmAoJGJwKSwleG1tMAorCW1vdnEJYDEqJFNUUklERS80LTk2YCgkYnApLCV4bW0xCisJcGFuZAkleG1tNCwleG1tMAorCW1vdnEJYDIqJFNUUklERS80LTk2YCgkYnApLCV4bW0yCisJcGFuZAkleG1tNSwleG1tMQorCW1vdnEJYDMqJFNUUklERS80LTk2YCgkYnApLCV4bW0zCisKKwlpbXVscQkkQVswXSwkbTEJCSMgdHBbMF0qbjAKKwkuYnl0ZQkweDY3CisJbW92CSVyZHgsJEFbMV0KKwltb3YJJE5bMV0sKCR0cCkJCSMgc3RvcmUgdXBtb3N0IG92ZXJmbG93IGJpdAorCisJcGFuZAkleG1tNiwleG1tMgorCXBvcgkleG1tMSwleG1tMAorCXBhbmQJJXhtbTcsJXhtbTMKKwlwb3IJJXhtbTIsJXhtbTAKKwlsZWEJKCR0cCwkbnVtKSwkdHAJCSMgcmV3aW5kICR0cAorCWxlYQkkU1RSSURFKCRicCksJGJwCisJcG9yCSV4bW0zLCV4bW0wCisKKwltdWxxCSRtMQkJCSMgbnBbMF0qbTEKKwlhZGQJJXJheCwkQVswXQkJIyAiJE5bMF0iLCBkaXNjYXJkZWQKKwltb3YJOCgkYXAsJG51bSksJXJheAorCWFkYwlcJDAsJXJkeAorCW1vdgklcmR4LCROWzFdCisKKwltdWxxCSRtMAkJCSMgYXBbal0qYnBbaV0KKwlhZGQJJXJheCwkQVsxXQorCW1vdgkxNioxKCRucCksJXJheAkJIyBpbnRlcmxlYXZlZCB3aXRoIDAsIHRoZXJlZm9yZSAxNipuCisJYWRjCVwkMCwlcmR4CisJYWRkCTgoJHRwKSwkQVsxXQkJIyArdHBbMV0KKwlhZGMJXCQwLCVyZHgKKwltb3YJJXJkeCwkQVswXQorCisJbXVscQkkbTEJCQkjIG5wW2pdKm0xCisJYWRkCSVyYXgsJE5bMV0KKwltb3YJMTYoJGFwLCRudW0pLCVyYXgKKwlhZGMJXCQwLCVyZHgKKwlhZGQJJEFbMV0sJE5bMV0JCSMgbnBbal0qbTErYXBbal0qYnBbaV0rdHBbal0KKwlsZWEJNCo4KCRudW0pLCRqCQkjIGo9NAorCWxlYQkxNio0KCRucCksJG5wCisJYWRjCVwkMCwlcmR4CisJbW92CSVyZHgsJE5bMF0KKwlqbXAJLkxpbm5lcjR4CisKKy5hbGlnbgkzMgorLkxpbm5lcjR4OgorCW11bHEJJG0wCQkJIyBhcFtqXSpicFtpXQorCWFkZAklcmF4LCRBWzBdCisJbW92CS0xNioyKCRucCksJXJheAorCWFkYwlcJDAsJXJkeAorCWFkZAkxNigkdHApLCRBWzBdCQkjIGFwW2pdKmJwW2ldK3RwW2pdCisJbGVhCTMyKCR0cCksJHRwCisJYWRjCVwkMCwlcmR4CisJbW92CSVyZHgsJEFbMV0KKworCW11bHEJJG0xCQkJIyBucFtqXSptMQorCWFkZAklcmF4LCROWzBdCisJbW92CS04KCRhcCwkaiksJXJheAorCWFkYwlcJDAsJXJkeAorCWFkZAkkQVswXSwkTlswXQorCWFkYwlcJDAsJXJkeAorCW1vdgkkTlsxXSwtMzIoJHRwKQkJIyB0cFtqLTFdCisJbW92CSVyZHgsJE5bMV0KKworCW11bHEJJG0wCQkJIyBhcFtqXSpicFtpXQorCWFkZAklcmF4LCRBWzFdCisJbW92CS0xNioxKCRucCksJXJheAorCWFkYwlcJDAsJXJkeAorCWFkZAktOCgkdHApLCRBWzFdCisJYWRjCVwkMCwlcmR4CisJbW92CSVyZHgsJEFbMF0KKworCW11bHEJJG0xCQkJIyBucFtqXSptMQorCWFkZAklcmF4LCROWzFdCisJbW92CSgkYXAsJGopLCVyYXgKKwlhZGMJXCQwLCVyZHgKKwlhZGQJJEFbMV0sJE5bMV0KKwlhZGMJXCQwLCVyZHgKKwltb3YJJE5bMF0sLTI0KCR0cCkJCSMgdHBbai0xXQorCW1vdgklcmR4LCROWzBdCisKKwltdWxxCSRtMAkJCSMgYXBbal0qYnBbaV0KKwlhZGQJJXJheCwkQVswXQorCW1vdgkxNiowKCRucCksJXJheAorCWFkYwlcJDAsJXJkeAorCWFkZAkoJHRwKSwkQVswXQkJIyBhcFtqXSpicFtpXSt0cFtqXQorCWFkYwlcJDAsJXJkeAorCW1vdgklcmR4LCRBWzFdCisKKwltdWxxCSRtMQkJCSMgbnBbal0qbTEKKwlhZGQJJXJheCwkTlswXQorCW1vdgk4KCRhcCwkaiksJXJheAorCWFkYwlcJDAsJXJkeAorCWFkZAkkQVswXSwkTlswXQorCWFkYwlcJDAsJXJkeAorCW1vdgkkTlsxXSwtMTYoJHRwKQkJIyB0cFtqLTFdCisJbW92CSVyZHgsJE5bMV0KKworCW11bHEJJG0wCQkJIyBhcFtqXSpicFtpXQorCWFkZAklcmF4LCRBWzFdCisJbW92CTE2KjEoJG5wKSwlcmF4CisJYWRjCVwkMCwlcmR4CisJYWRkCTgoJHRwKSwkQVsxXQorCWFkYwlcJDAsJXJkeAorCW1vdgklcmR4LCRBWzBdCisKKwltdWxxCSRtMQkJCSMgbnBbal0qbTEKKwlhZGQJJXJheCwkTlsxXQorCW1vdgkxNigkYXAsJGopLCVyYXgKKwlhZGMJXCQwLCVyZHgKKwlhZGQJJEFbMV0sJE5bMV0KKwlsZWEJMTYqNCgkbnApLCRucAorCWFkYwlcJDAsJXJkeAorCW1vdgkkTlswXSwtOCgkdHApCQkjIHRwW2otMV0KKwltb3YJJXJkeCwkTlswXQorCisJYWRkCVwkMzIsJGoJCQkjIGorPTQKKwlqbnoJLkxpbm5lcjR4CisKKwltdWxxCSRtMAkJCSMgYXBbal0qYnBbaV0KKwlhZGQJJXJheCwkQVswXQorCW1vdgktMTYqMigkbnApLCVyYXgKKwlhZGMJXCQwLCVyZHgKKwlhZGQJMTYoJHRwKSwkQVswXQkJIyBhcFtqXSpicFtpXSt0cFtqXQorCWxlYQkzMigkdHApLCR0cAorCWFkYwlcJDAsJXJkeAorCW1vdgklcmR4LCRBWzFdCisKKwltdWxxCSRtMQkJCSMgbnBbal0qbTEKKwlhZGQJJXJheCwkTlswXQorCW1vdgktOCgkYXApLCVyYXgKKwlhZGMJXCQwLCVyZHgKKwlhZGQJJEFbMF0sJE5bMF0KKwlhZGMJXCQwLCVyZHgKKwltb3YJJE5bMV0sLTMyKCR0cCkJCSMgdHBbai0xXQorCW1vdgklcmR4LCROWzFdCisKKwltdWxxCSRtMAkJCSMgYXBbal0qYnBbaV0KKwlhZGQJJXJheCwkQVsxXQorCW1vdgkkbTEsJXJheAorCW1vdgktMTYqMSgkbnApLCRtMQorCWFkYwlcJDAsJXJkeAorCWFkZAktOCgkdHApLCRBWzFdCisJYWRjCVwkMCwlcmR4CisJbW92CSVyZHgsJEFbMF0KKworCW11bHEJJG0xCQkJIyBucFtqXSptMQorCWFkZAklcmF4LCROWzFdCisJbW92CSgkYXAsJG51bSksJXJheAkJIyBhcFswXQorCWFkYwlcJDAsJXJkeAorCWFkZAkkQVsxXSwkTlsxXQorCWFkYwlcJDAsJXJkeAorCW1vdgkkTlswXSwtMjQoJHRwKQkJIyB0cFtqLTFdCisJbW92CSVyZHgsJE5bMF0KKworCW1vdnEJJXhtbTAsJG0wCQkjIGJwW2krMV0KKwltb3YJJE5bMV0sLTE2KCR0cCkJCSMgdHBbai0xXQorCWxlYQkoJG5wLCRudW0sMiksJG5wCSMgcmV3aW5kICRucAorCisJeG9yCSROWzFdLCROWzFdCisJYWRkCSRBWzBdLCROWzBdCisJYWRjCVwkMCwkTlsxXQorCWFkZAkoJHRwKSwkTlswXQkJIyBwdWxsIHVwbW9zdCBvdmVyZmxvdyBiaXQKKwlhZGMJXCQwLCROWzFdCQkjIHVwbW9zdCBvdmVyZmxvdyBiaXQKKwltb3YJJE5bMF0sLTgoJHRwKQorCisJY21wCTE2KzgoJXJzcCksJGJwCisJamIJLkxvdXRlcjR4CitfX18KK2lmICgxKSB7CiskY29kZS49PDxfX187CisJc3ViCSROWzBdLCRtMQkJIyBjb21wYXJlIHRvcC1tb3N0IHdvcmRzCisJYWRjCSRqLCRqCQkJIyAkaiBpcyB6ZXJvCisJb3IJJGosJE5bMV0KKwl4b3IJXCQxLCROWzFdCisJbGVhCSgkdHAsJG51bSksJXJieAkJIyB0cHRyIGluIC5zcXI0eF9zdWIKKwlsZWEJKCRucCwkTlsxXSw4KSwlcmJwCSMgbnB0ciBpbiAuc3FyNHhfc3ViCisJbW92CSVyOSwlcmN4CisJc2FyCVwkMysyLCVyY3gJCSMgY2Y9MAorCW1vdgk1Nis4KCVyc3ApLCVyZGkJCSMgcnB0ciBpbiAuc3FyNHhfc3ViCisJam1wCS5Mc3FyNHhfc3ViCitfX18KK30gZWxzZSB7CitteSBAcmk9KCIlcmF4IiwkYnAsJG0wLCRtMSk7CitteSAkcnA9IiVyZHgiOworJGNvZGUuPTw8X19fCisJeG9yCVwkMSwkTlsxXQorCWxlYQkoJHRwLCRudW0pLCR0cAkJIyByZXdpbmQgJHRwCisJc2FyCVwkNSwkbnVtCQkjIGNmPTAKKwlsZWEJKCRucCwkTlsxXSw4KSwkbnAKKwltb3YJNTYrOCglcnNwKSwkcnAJCSMgcmVzdG9yZSAkcnAKKwlqbXAJLkxzdWI0eAorCisuYWxpZ24JMzIKKy5Mc3ViNHg6CisJLmJ5dGUJMHg2NgorCW1vdgk4KjAoJHRwKSxAcmlbMF0KKwltb3YJOCoxKCR0cCksQHJpWzFdCisJLmJ5dGUJMHg2NgorCXNiYgkxNiowKCRucCksQHJpWzBdCisJbW92CTgqMigkdHApLEByaVsyXQorCXNiYgkxNioxKCRucCksQHJpWzFdCisJbW92CTMqOCgkdHApLEByaVszXQorCWxlYQk0KjgoJHRwKSwkdHAKKwlzYmIJMTYqMigkbnApLEByaVsyXQorCW1vdglAcmlbMF0sOCowKCRycCkKKwlzYmIJMTYqMygkbnApLEByaVszXQorCWxlYQkxNio0KCRucCksJG5wCisJbW92CUByaVsxXSw4KjEoJHJwKQorCW1vdglAcmlbMl0sOCoyKCRycCkKKwltb3YJQHJpWzNdLDgqMygkcnApCisJbGVhCTgqNCgkcnApLCRycAorCisJaW5jCSRudW0KKwlqbnoJLkxzdWI0eAorCisJcmV0CitfX18KK30KKyRjb2RlLj08PF9fXzsKKy5zaXplCW11bDR4X2ludGVybmFsLC4tbXVsNHhfaW50ZXJuYWwKK19fXworfX19CisMe3t7CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHZvaWQgYm5fcG93ZXI1KAorbXkgJHJwdHI9IiVyZGkiOwkjIEJOX1VMT05HICpycHRyLAorbXkgJGFwdHI9IiVyc2kiOwkjIGNvbnN0IEJOX1VMT05HICphcHRyLAorbXkgJGJwdHI9IiVyZHgiOwkjIGNvbnN0IHZvaWQgKnRhYmxlLAorbXkgJG5wdHI9IiVyY3giOwkjIGNvbnN0IEJOX1VMT05HICpucHRyLAorbXkgJG4wICA9IiVyOCI7CQkjIGNvbnN0IEJOX1VMT05HICpuMCk7CitteSAkbnVtID0iJXI5IjsJCSMgaW50IG51bSwgaGFzIHRvIGJlIGRpdmlzaWJsZSBieSA4CisJCQkjIGludCBwd3IgCisKK215ICgkaSwkaiwkdHB0cik9KCIlcmJwIiwiJXJjeCIsJHJwdHIpOworbXkgQEEwPSgiJXIxMCIsIiVyMTEiKTsKK215IEBBMT0oIiVyMTIiLCIlcjEzIik7CitteSAoJGEwLCRhMSwkYWkpPSgiJXIxNCIsIiVyMTUiLCIlcmJ4Iik7CisKKyRjb2RlLj08PF9fXzsKKy5nbG9ibAlibl9wb3dlcjUKKy50eXBlCWJuX3Bvd2VyNSxcQGZ1bmN0aW9uLDYKKy5hbGlnbgkzMgorYm5fcG93ZXI1OgorX19fCiskY29kZS49PDxfX18gaWYgKCRhZGR4KTsKKwltb3YJT1BFTlNTTF9pYTMyY2FwX1ArOCglcmlwKSwlcjExZAorCWFuZAlcJDB4ODAxMDAsJXIxMWQKKwljbXAJXCQweDgwMTAwLCVyMTFkCisJamUJLkxwb3dlcng1X2VudGVyCitfX18KKyRjb2RlLj08PF9fXzsKKwltb3YJJXJzcCwlcmF4CisJcHVzaAklcmJ4CisJcHVzaAklcmJwCisJcHVzaAklcjEyCisJcHVzaAklcjEzCisJcHVzaAklcjE0CisJcHVzaAklcjE1CitfX18KKyRjb2RlLj08PF9fXyBpZiAoJHdpbjY0KTsKKwlsZWEJLTB4MjgoJXJzcCksJXJzcAorCW1vdmFwcwkleG1tNiwoJXJzcCkKKwltb3ZhcHMJJXhtbTcsMHgxMCglcnNwKQorX19fCiskY29kZS49PDxfX187CisJbW92CSR7bnVtfWQsJXIxMGQKKwlzaGwJXCQzLCR7bnVtfWQJCSMgY29udmVydCAkbnVtIHRvIGJ5dGVzCisJc2hsCVwkMysyLCVyMTBkCQkjIDQqJG51bQorCW5lZwkkbnVtCisJbW92CSgkbjApLCRuMAkJIyAqbjAKKworCSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisJIyBlbnN1cmUgdGhhdCBzdGFjayBmcmFtZSBkb2Vzbid0IGFsaWFzIHdpdGggJGFwdHIrNCokbnVtCisJIyBtb2R1bG8gNDA5Niwgd2hpY2ggY292ZXJzIHJldFtudW1dLCBhbVtudW1dIGFuZCBuWzIqbnVtXQorCSMgKHNlZSBibl9leHAuYykuIHRoaXMgaXMgZG9uZSB0byBhbGxvdyBtZW1vcnkgZGlzYW1iaWd1YXRpb24KKwkjIGxvZ2ljIGRvIGl0cyBtYWdpYy4KKwkjCisJbGVhCS02NCglcnNwLCRudW0sMiksJXIxMQorCXN1YgkkYXB0ciwlcjExCisJYW5kCVwkNDA5NSwlcjExCisJY21wCSVyMTEsJXIxMAorCWpiCS5McHdyX3NwX2FsdAorCXN1YgklcjExLCVyc3AJCSMgYWxpZ24gd2l0aCAkYXB0cgorCWxlYQktNjQoJXJzcCwkbnVtLDIpLCVyc3AJIyBhbGxvY2EoZnJhbWUrMiokbnVtKQorCWptcAkuTHB3cl9zcF9kb25lCisKKy5hbGlnbgkzMgorLkxwd3Jfc3BfYWx0OgorCWxlYQk0MDk2LTY0KCwkbnVtLDIpLCVyMTAJIyA0MDk2LWZyYW1lLTIqJG51bQorCWxlYQktNjQoJXJzcCwkbnVtLDIpLCVyc3AJIyBhbGxvY2EoZnJhbWUrMiokbnVtKQorCXN1YgklcjEwLCVyMTEKKwltb3YJXCQwLCVyMTAKKwljbW92YwklcjEwLCVyMTEKKwlzdWIJJXIxMSwlcnNwCisuTHB3cl9zcF9kb25lOgorCWFuZAlcJC02NCwlcnNwCisJbW92CSRudW0sJXIxMAkKKwluZWcJJG51bQorCisJIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwkjIFN0YWNrIGxheW91dAorCSMKKwkjICswCXNhdmVkICRudW0sIHVzZWQgaW4gcmVkdWN0aW9uIHNlY3Rpb24KKwkjICs4CSZ0WzIqJG51bV0sIHVzZWQgaW4gcmVkdWN0aW9uIHNlY3Rpb24KKwkjICszMglzYXZlZCAqbjAKKwkjICs0MAlzYXZlZCAlcnNwCisJIyArNDgJdFsyKiRudW1dCisJIworCW1vdgkkbjAsICAzMiglcnNwKQorCW1vdgklcmF4LCA0MCglcnNwKQkJIyBzYXZlIG9yaWdpbmFsICVyc3AKKy5McG93ZXI1X2JvZHk6CisJbW92cQkkcnB0ciwleG1tMQkJIyBzYXZlICRycHRyCisJbW92cQkkbnB0ciwleG1tMgkJIyBzYXZlICRucHRyCisJbW92cQklcjEwLCAleG1tMwkJIyAtJG51bQorCW1vdnEJJGJwdHIsJXhtbTQKKworCWNhbGwJX19ibl9zcXI4eF9pbnRlcm5hbAorCWNhbGwJX19ibl9zcXI4eF9pbnRlcm5hbAorCWNhbGwJX19ibl9zcXI4eF9pbnRlcm5hbAorCWNhbGwJX19ibl9zcXI4eF9pbnRlcm5hbAorCWNhbGwJX19ibl9zcXI4eF9pbnRlcm5hbAorCisJbW92cQkleG1tMiwkbnB0cgorCW1vdnEJJXhtbTQsJGJwdHIKKwltb3YJJGFwdHIsJHJwdHIKKwltb3YJNDAoJXJzcCksJXJheAorCWxlYQkzMiglcnNwKSwkbjAKKworCWNhbGwJbXVsNHhfaW50ZXJuYWwKKworCW1vdgk0MCglcnNwKSwlcnNpCQkjIHJlc3RvcmUgJXJzcAorCW1vdglcJDEsJXJheAorCW1vdgktNDgoJXJzaSksJXIxNQorCW1vdgktNDAoJXJzaSksJXIxNAorCW1vdgktMzIoJXJzaSksJXIxMworCW1vdgktMjQoJXJzaSksJXIxMgorCW1vdgktMTYoJXJzaSksJXJicAorCW1vdgktOCglcnNpKSwlcmJ4CisJbGVhCSglcnNpKSwlcnNwCisuTHBvd2VyNV9lcGlsb2d1ZToKKwlyZXQKKy5zaXplCWJuX3Bvd2VyNSwuLWJuX3Bvd2VyNQorCisuZ2xvYmwJYm5fc3FyOHhfaW50ZXJuYWwKKy5oaWRkZW4JYm5fc3FyOHhfaW50ZXJuYWwKKy50eXBlCWJuX3Nxcjh4X2ludGVybmFsLFxAYWJpLW9tbmlwb3RlbnQKKy5hbGlnbgkzMgorYm5fc3FyOHhfaW50ZXJuYWw6CitfX2JuX3Nxcjh4X2ludGVybmFsOgorCSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisJIyBTcXVhcmluZyBwYXJ0OgorCSMKKwkjIGEpIG11bHRpcGx5LW4tYWRkIGV2ZXJ5dGhpbmcgYnV0IGFbaV0qYVtpXTsKKwkjIGIpIHNoaWZ0IHJlc3VsdCBvZiBhKSBieSAxIHRvIHRoZSBsZWZ0IGFuZCBhY2N1bXVsYXRlCisJIyAgICBhW2ldKmFbaV0gcHJvZHVjdHM7CisJIworCSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisJIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVsxXWFbMF0KKwkjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbMl1hWzBdCisJIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbM11hWzBdCisJIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbMl1hWzFdCisJIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVs0XWFbMF0KKwkjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzNdYVsxXQorCSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVs1XWFbMF0KKwkjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbNF1hWzFdCisJIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzNdYVsyXQorCSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzZdYVswXQorCSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzVdYVsxXQorCSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzRdYVsyXQorCSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbN11hWzBdCisJIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVs2XWFbMV0KKwkjICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzVdYVsyXQorCSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbNF1hWzNdCisJIyAgICAgICAgICAgICAgICAgICAgICAgICBhWzddYVsxXQorCSMgICAgICAgICAgICAgICAgICAgICAgICAgYVs2XWFbMl0KKwkjICAgICAgICAgICAgICAgICAgICAgICAgIGFbNV1hWzNdCisJIyAgICAgICAgICAgICAgICAgICAgIGFbN11hWzJdCisJIyAgICAgICAgICAgICAgICAgICAgIGFbNl1hWzNdCisJIyAgICAgICAgICAgICAgICAgICAgIGFbNV1hWzRdCisJIyAgICAgICAgICAgICAgICAgYVs3XWFbM10KKwkjICAgICAgICAgICAgICAgICBhWzZdYVs0XQorCSMgICAgICAgICAgICAgYVs3XWFbNF0KKwkjICAgICAgICAgICAgIGFbNl1hWzVdCisJIyAgICAgICAgIGFbN11hWzVdCisJIyAgICAgYVs3XWFbNl0KKwkjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzFdYVswXQorCSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVsyXWFbMF0KKwkjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVszXWFbMF0KKwkjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzRdYVswXQorCSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVs1XWFbMF0KKwkjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVs2XWFbMF0KKwkjICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzddYVswXQorCSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzJdYVsxXQorCSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbM11hWzFdCisJIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzRdYVsxXQorCSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzVdYVsxXQorCSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbNl1hWzFdCisJIyAgICAgICAgICAgICAgICAgICAgICAgICBhWzddYVsxXQorCSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVszXWFbMl0KKwkjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVs0XWFbMl0KKwkjICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzVdYVsyXQorCSMgICAgICAgICAgICAgICAgICAgICAgICAgYVs2XWFbMl0KKwkjICAgICAgICAgICAgICAgICAgICAgYVs3XWFbMl0KKwkjICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzRdYVszXQorCSMgICAgICAgICAgICAgICAgICAgICAgICAgYVs1XWFbM10KKwkjICAgICAgICAgICAgICAgICAgICAgYVs2XWFbM10KKwkjICAgICAgICAgICAgICAgICBhWzddYVszXQorCSMgICAgICAgICAgICAgICAgICAgICBhWzVdYVs0XQorCSMgICAgICAgICAgICAgICAgIGFbNl1hWzRdCisJIyAgICAgICAgICAgICBhWzddYVs0XQorCSMgICAgICAgICAgICAgYVs2XWFbNV0KKwkjICAgICAgICAgYVs3XWFbNV0KKwkjICAgICBhWzddYVs2XQorCSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzBdYVswXQorCSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVsxXWFbMV0KKwkjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzJdYVsyXQorCSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzNdYVszXQorCSMgICAgICAgICAgICAgICAgICAgICAgICAgYVs0XWFbNF0KKwkjICAgICAgICAgICAgICAgICBhWzVdYVs1XQorCSMgICAgICAgICBhWzZdYVs2XQorCSMgYVs3XWFbN10KKworCWxlYQkzMiglcjEwKSwkaQkJIyAkaT0tKCRudW0tMzIpCisJbGVhCSgkYXB0ciwkbnVtKSwkYXB0cgkjIGVuZCBvZiBhW10gYnVmZmVyLCAoJGFwdHIsJGkpPSZhcFsyXQorCisJbW92CSRudW0sJGoJCQkjICRqPSRudW0KKworCQkJCQkjIGNvbW1lbnRzIGFwcGx5IHRvICRudW09PTggY2FzZQorCW1vdgktMzIoJGFwdHIsJGkpLCRhMAkjIGFbMF0KKwlsZWEJNDgrOCglcnNwLCRudW0sMiksJHRwdHIJIyBlbmQgb2YgdHBbXSBidWZmZXIsICZ0cFsyKiRudW1dCisJbW92CS0yNCgkYXB0ciwkaSksJXJheAkjIGFbMV0KKwlsZWEJLTMyKCR0cHRyLCRpKSwkdHB0cgkjIGVuZCBvZiB0cFtdIHdpbmRvdywgJnRwWzIqJG51bS0iJGkiXQorCW1vdgktMTYoJGFwdHIsJGkpLCRhaQkjIGFbMl0KKwltb3YJJXJheCwkYTEKKworCW11bAkkYTAJCQkjIGFbMV0qYVswXQorCW1vdgklcmF4LCRBMFswXQkJIyBhWzFdKmFbMF0KKwkgbW92CSRhaSwlcmF4CQkjIGFbMl0KKwltb3YJJXJkeCwkQTBbMV0KKwltb3YJJEEwWzBdLC0yNCgkdHB0ciwkaSkJIyB0WzFdCisKKwltdWwJJGEwCQkJIyBhWzJdKmFbMF0KKwlhZGQJJXJheCwkQTBbMV0KKwkgbW92CSRhaSwlcmF4CisJYWRjCVwkMCwlcmR4CisJbW92CSRBMFsxXSwtMTYoJHRwdHIsJGkpCSMgdFsyXQorCW1vdgklcmR4LCRBMFswXQorCisKKwkgbW92CS04KCRhcHRyLCRpKSwkYWkJIyBhWzNdCisJbXVsCSRhMQkJCSMgYVsyXSphWzFdCisJbW92CSVyYXgsJEExWzBdCQkjIGFbMl0qYVsxXSt0WzNdCisJIG1vdgkkYWksJXJheAorCW1vdgklcmR4LCRBMVsxXQorCisJIGxlYQkoJGkpLCRqCisJbXVsCSRhMAkJCSMgYVszXSphWzBdCisJYWRkCSVyYXgsJEEwWzBdCQkjIGFbM10qYVswXSthWzJdKmFbMV0rdFszXQorCSBtb3YJJGFpLCVyYXgKKwltb3YJJXJkeCwkQTBbMV0KKwlhZGMJXCQwLCRBMFsxXQorCWFkZAkkQTFbMF0sJEEwWzBdCisJYWRjCVwkMCwkQTBbMV0KKwltb3YJJEEwWzBdLC04KCR0cHRyLCRqKQkjIHRbM10KKwlqbXAJLkxzcXI0eF8xc3QKKworLmFsaWduCTMyCisuTHNxcjR4XzFzdDoKKwkgbW92CSgkYXB0ciwkaiksJGFpCQkjIGFbNF0KKwltdWwJJGExCQkJIyBhWzNdKmFbMV0KKwlhZGQJJXJheCwkQTFbMV0JCSMgYVszXSphWzFdK3RbNF0KKwkgbW92CSRhaSwlcmF4CisJbW92CSVyZHgsJEExWzBdCisJYWRjCVwkMCwkQTFbMF0KKworCW11bAkkYTAJCQkjIGFbNF0qYVswXQorCWFkZAklcmF4LCRBMFsxXQkJIyBhWzRdKmFbMF0rYVszXSphWzFdK3RbNF0KKwkgbW92CSRhaSwlcmF4CQkjIGFbM10KKwkgbW92CTgoJGFwdHIsJGopLCRhaQkJIyBhWzVdCisJbW92CSVyZHgsJEEwWzBdCisJYWRjCVwkMCwkQTBbMF0KKwlhZGQJJEExWzFdLCRBMFsxXQorCWFkYwlcJDAsJEEwWzBdCisKKworCW11bAkkYTEJCQkjIGFbNF0qYVszXQorCWFkZAklcmF4LCRBMVswXQkJIyBhWzRdKmFbM10rdFs1XQorCSBtb3YJJGFpLCVyYXgKKwkgbW92CSRBMFsxXSwoJHRwdHIsJGopCSMgdFs0XQorCW1vdgklcmR4LCRBMVsxXQorCWFkYwlcJDAsJEExWzFdCisKKwltdWwJJGEwCQkJIyBhWzVdKmFbMl0KKwlhZGQJJXJheCwkQTBbMF0JCSMgYVs1XSphWzJdK2FbNF0qYVszXSt0WzVdCisJIG1vdgkkYWksJXJheAorCSBtb3YJMTYoJGFwdHIsJGopLCRhaQkjIGFbNl0KKwltb3YJJXJkeCwkQTBbMV0KKwlhZGMJXCQwLCRBMFsxXQorCWFkZAkkQTFbMF0sJEEwWzBdCisJYWRjCVwkMCwkQTBbMV0KKworCW11bAkkYTEJCQkjIGFbNV0qYVszXQorCWFkZAklcmF4LCRBMVsxXQkJIyBhWzVdKmFbM10rdFs2XQorCSBtb3YJJGFpLCVyYXgKKwkgbW92CSRBMFswXSw4KCR0cHRyLCRqKQkjIHRbNV0KKwltb3YJJXJkeCwkQTFbMF0KKwlhZGMJXCQwLCRBMVswXQorCisJbXVsCSRhMAkJCSMgYVs2XSphWzJdCisJYWRkCSVyYXgsJEEwWzFdCQkjIGFbNl0qYVsyXSthWzVdKmFbM10rdFs2XQorCSBtb3YJJGFpLCVyYXgJCSMgYVszXQorCSBtb3YJMjQoJGFwdHIsJGopLCRhaQkjIGFbN10KKwltb3YJJXJkeCwkQTBbMF0KKwlhZGMJXCQwLCRBMFswXQorCWFkZAkkQTFbMV0sJEEwWzFdCisJYWRjCVwkMCwkQTBbMF0KKworCisJbXVsCSRhMQkJCSMgYVs2XSphWzVdCisJYWRkCSVyYXgsJEExWzBdCQkjIGFbNl0qYVs1XSt0WzddCisJIG1vdgkkYWksJXJheAorCSBtb3YJJEEwWzFdLDE2KCR0cHRyLCRqKQkjIHRbNl0KKwltb3YJJXJkeCwkQTFbMV0KKwlhZGMJXCQwLCRBMVsxXQorCSBsZWEJMzIoJGopLCRqCisKKwltdWwJJGEwCQkJIyBhWzddKmFbNF0KKwlhZGQJJXJheCwkQTBbMF0JCSMgYVs3XSphWzRdK2FbNl0qYVs1XSt0WzZdCisJIG1vdgkkYWksJXJheAorCW1vdgklcmR4LCRBMFsxXQorCWFkYwlcJDAsJEEwWzFdCisJYWRkCSRBMVswXSwkQTBbMF0KKwlhZGMJXCQwLCRBMFsxXQorCW1vdgkkQTBbMF0sLTgoJHRwdHIsJGopCSMgdFs3XQorCisJY21wCVwkMCwkagorCWpuZQkuTHNxcjR4XzFzdAorCisJbXVsCSRhMQkJCSMgYVs3XSphWzVdCisJYWRkCSVyYXgsJEExWzFdCisJbGVhCTE2KCRpKSwkaQorCWFkYwlcJDAsJXJkeAorCWFkZAkkQTBbMV0sJEExWzFdCisJYWRjCVwkMCwlcmR4CisKKwltb3YJJEExWzFdLCgkdHB0cikJCSMgdFs4XQorCW1vdgklcmR4LCRBMVswXQorCW1vdgklcmR4LDgoJHRwdHIpCQkjIHRbOV0KKwlqbXAJLkxzcXI0eF9vdXRlcgorCisuYWxpZ24JMzIKKy5Mc3FyNHhfb3V0ZXI6CQkJCSMgY29tbWVudHMgYXBwbHkgdG8gJG51bT09NiBjYXNlCisJbW92CS0zMigkYXB0ciwkaSksJGEwCSMgYVswXQorCWxlYQk0OCs4KCVyc3AsJG51bSwyKSwkdHB0cgkjIGVuZCBvZiB0cFtdIGJ1ZmZlciwgJnRwWzIqJG51bV0KKwltb3YJLTI0KCRhcHRyLCRpKSwlcmF4CSMgYVsxXQorCWxlYQktMzIoJHRwdHIsJGkpLCR0cHRyCSMgZW5kIG9mIHRwW10gd2luZG93LCAmdHBbMiokbnVtLSIkaSJdCisJbW92CS0xNigkYXB0ciwkaSksJGFpCSMgYVsyXQorCW1vdgklcmF4LCRhMQorCisJbXVsCSRhMAkJCSMgYVsxXSphWzBdCisJbW92CS0yNCgkdHB0ciwkaSksJEEwWzBdCSMgdFsxXQorCWFkZAklcmF4LCRBMFswXQkJIyBhWzFdKmFbMF0rdFsxXQorCSBtb3YJJGFpLCVyYXgJCSMgYVsyXQorCWFkYwlcJDAsJXJkeAorCW1vdgkkQTBbMF0sLTI0KCR0cHRyLCRpKQkjIHRbMV0KKwltb3YJJXJkeCwkQTBbMV0KKworCW11bAkkYTAJCQkjIGFbMl0qYVswXQorCWFkZAklcmF4LCRBMFsxXQorCSBtb3YJJGFpLCVyYXgKKwlhZGMJXCQwLCVyZHgKKwlhZGQJLTE2KCR0cHRyLCRpKSwkQTBbMV0JIyBhWzJdKmFbMF0rdFsyXQorCW1vdgklcmR4LCRBMFswXQorCWFkYwlcJDAsJEEwWzBdCisJbW92CSRBMFsxXSwtMTYoJHRwdHIsJGkpCSMgdFsyXQorCisJeG9yCSRBMVswXSwkQTFbMF0KKworCSBtb3YJLTgoJGFwdHIsJGkpLCRhaQkjIGFbM10KKwltdWwJJGExCQkJIyBhWzJdKmFbMV0KKwlhZGQJJXJheCwkQTFbMF0JCSMgYVsyXSphWzFdK3RbM10KKwkgbW92CSRhaSwlcmF4CisJYWRjCVwkMCwlcmR4CisJYWRkCS04KCR0cHRyLCRpKSwkQTFbMF0KKwltb3YJJXJkeCwkQTFbMV0KKwlhZGMJXCQwLCRBMVsxXQorCisJbXVsCSRhMAkJCSMgYVszXSphWzBdCisJYWRkCSVyYXgsJEEwWzBdCQkjIGFbM10qYVswXSthWzJdKmFbMV0rdFszXQorCSBtb3YJJGFpLCVyYXgKKwlhZGMJXCQwLCVyZHgKKwlhZGQJJEExWzBdLCRBMFswXQorCW1vdgklcmR4LCRBMFsxXQorCWFkYwlcJDAsJEEwWzFdCisJbW92CSRBMFswXSwtOCgkdHB0ciwkaSkJIyB0WzNdCisKKwlsZWEJKCRpKSwkagorCWptcAkuTHNxcjR4X2lubmVyCisKKy5hbGlnbgkzMgorLkxzcXI0eF9pbm5lcjoKKwkgbW92CSgkYXB0ciwkaiksJGFpCQkjIGFbNF0KKwltdWwJJGExCQkJIyBhWzNdKmFbMV0KKwlhZGQJJXJheCwkQTFbMV0JCSMgYVszXSphWzFdK3RbNF0KKwkgbW92CSRhaSwlcmF4CisJbW92CSVyZHgsJEExWzBdCisJYWRjCVwkMCwkQTFbMF0KKwlhZGQJKCR0cHRyLCRqKSwkQTFbMV0KKwlhZGMJXCQwLCRBMVswXQorCisJLmJ5dGUJMHg2NworCW11bAkkYTAJCQkjIGFbNF0qYVswXQorCWFkZAklcmF4LCRBMFsxXQkJIyBhWzRdKmFbMF0rYVszXSphWzFdK3RbNF0KKwkgbW92CSRhaSwlcmF4CQkjIGFbM10KKwkgbW92CTgoJGFwdHIsJGopLCRhaQkJIyBhWzVdCisJbW92CSVyZHgsJEEwWzBdCisJYWRjCVwkMCwkQTBbMF0KKwlhZGQJJEExWzFdLCRBMFsxXQorCWFkYwlcJDAsJEEwWzBdCisKKwltdWwJJGExCQkJIyBhWzRdKmFbM10KKwlhZGQJJXJheCwkQTFbMF0JCSMgYVs0XSphWzNdK3RbNV0KKwltb3YJJEEwWzFdLCgkdHB0ciwkaikJIyB0WzRdCisJIG1vdgkkYWksJXJheAorCW1vdgklcmR4LCRBMVsxXQorCWFkYwlcJDAsJEExWzFdCisJYWRkCTgoJHRwdHIsJGopLCRBMVswXQorCWxlYQkxNigkaiksJGoJCSMgaisrCisJYWRjCVwkMCwkQTFbMV0KKworCW11bAkkYTAJCQkjIGFbNV0qYVsyXQorCWFkZAklcmF4LCRBMFswXQkJIyBhWzVdKmFbMl0rYVs0XSphWzNdK3RbNV0KKwkgbW92CSRhaSwlcmF4CisJYWRjCVwkMCwlcmR4CisJYWRkCSRBMVswXSwkQTBbMF0KKwltb3YJJXJkeCwkQTBbMV0KKwlhZGMJXCQwLCRBMFsxXQorCW1vdgkkQTBbMF0sLTgoJHRwdHIsJGopCSMgdFs1XSwgInByZWxvYWRlZCB0WzFdIiBiZWxvdworCisJY21wCVwkMCwkagorCWpuZQkuTHNxcjR4X2lubmVyCisKKwkuYnl0ZQkweDY3CisJbXVsCSRhMQkJCSMgYVs1XSphWzNdCisJYWRkCSVyYXgsJEExWzFdCisJYWRjCVwkMCwlcmR4CisJYWRkCSRBMFsxXSwkQTFbMV0KKwlhZGMJXCQwLCVyZHgKKworCW1vdgkkQTFbMV0sKCR0cHRyKQkJIyB0WzZdLCAicHJlbG9hZGVkIHRbMl0iIGJlbG93CisJbW92CSVyZHgsJEExWzBdCisJbW92CSVyZHgsOCgkdHB0cikJCSMgdFs3XSwgInByZWxvYWRlZCB0WzNdIiBiZWxvdworCisJYWRkCVwkMTYsJGkKKwlqbnoJLkxzcXI0eF9vdXRlcgorCisJCQkJCSMgY29tbWVudHMgYXBwbHkgdG8gJG51bT09NCBjYXNlCisJbW92CS0zMigkYXB0ciksJGEwCQkjIGFbMF0KKwlsZWEJNDgrOCglcnNwLCRudW0sMiksJHRwdHIJIyBlbmQgb2YgdHBbXSBidWZmZXIsICZ0cFsyKiRudW1dCisJbW92CS0yNCgkYXB0ciksJXJheAkJIyBhWzFdCisJbGVhCS0zMigkdHB0ciwkaSksJHRwdHIJIyBlbmQgb2YgdHBbXSB3aW5kb3csICZ0cFsyKiRudW0tIiRpIl0KKwltb3YJLTE2KCRhcHRyKSwkYWkJCSMgYVsyXQorCW1vdgklcmF4LCRhMQorCisJbXVsCSRhMAkJCSMgYVsxXSphWzBdCisJYWRkCSVyYXgsJEEwWzBdCQkjIGFbMV0qYVswXSt0WzFdLCBwcmVsb2FkZWQgdFsxXQorCSBtb3YJJGFpLCVyYXgJCSMgYVsyXQorCW1vdgklcmR4LCRBMFsxXQorCWFkYwlcJDAsJEEwWzFdCisKKwltdWwJJGEwCQkJIyBhWzJdKmFbMF0KKwlhZGQJJXJheCwkQTBbMV0KKwkgbW92CSRhaSwlcmF4CisJIG1vdgkkQTBbMF0sLTI0KCR0cHRyKQkjIHRbMV0KKwltb3YJJXJkeCwkQTBbMF0KKwlhZGMJXCQwLCRBMFswXQorCWFkZAkkQTFbMV0sJEEwWzFdCQkjIGFbMl0qYVswXSt0WzJdLCBwcmVsb2FkZWQgdFsyXQorCSBtb3YJLTgoJGFwdHIpLCRhaQkJIyBhWzNdCisJYWRjCVwkMCwkQTBbMF0KKworCW11bAkkYTEJCQkjIGFbMl0qYVsxXQorCWFkZAklcmF4LCRBMVswXQkJIyBhWzJdKmFbMV0rdFszXSwgcHJlbG9hZGVkIHRbM10KKwkgbW92CSRhaSwlcmF4CisJIG1vdgkkQTBbMV0sLTE2KCR0cHRyKQkjIHRbMl0KKwltb3YJJXJkeCwkQTFbMV0KKwlhZGMJXCQwLCRBMVsxXQorCisJbXVsCSRhMAkJCSMgYVszXSphWzBdCisJYWRkCSVyYXgsJEEwWzBdCQkjIGFbM10qYVswXSthWzJdKmFbMV0rdFszXQorCSBtb3YJJGFpLCVyYXgKKwltb3YJJXJkeCwkQTBbMV0KKwlhZGMJXCQwLCRBMFsxXQorCWFkZAkkQTFbMF0sJEEwWzBdCisJYWRjCVwkMCwkQTBbMV0KKwltb3YJJEEwWzBdLC04KCR0cHRyKQkjIHRbM10KKworCW11bAkkYTEJCQkjIGFbM10qYVsxXQorCWFkZAklcmF4LCRBMVsxXQorCSBtb3YJLTE2KCRhcHRyKSwlcmF4CQkjIGFbMl0KKwlhZGMJXCQwLCVyZHgKKwlhZGQJJEEwWzFdLCRBMVsxXQorCWFkYwlcJDAsJXJkeAorCisJbW92CSRBMVsxXSwoJHRwdHIpCQkjIHRbNF0KKwltb3YJJXJkeCwkQTFbMF0KKwltb3YJJXJkeCw4KCR0cHRyKQkJIyB0WzVdCisKKwltdWwJJGFpCQkJIyBhWzJdKmFbM10KK19fXworeworbXkgKCRzaGlmdCwkY2FycnkpPSgkYTAsJGExKTsKK215IEBTPShAQTEsJGFpLCRuMCk7CiskY29kZS49PDxfX187CisJIGFkZAlcJDE2LCRpCisJIHhvcgkkc2hpZnQsJHNoaWZ0CisJIHN1YgkkbnVtLCRpCQkJIyAkaT0xNi0kbnVtCisJIHhvcgkkY2FycnksJGNhcnJ5CisKKwlhZGQJJEExWzBdLCVyYXgJCSMgdFs1XQorCWFkYwlcJDAsJXJkeAorCW1vdgklcmF4LDgoJHRwdHIpCQkjIHRbNV0KKwltb3YJJXJkeCwxNigkdHB0cikJCSMgdFs2XQorCW1vdgkkY2FycnksMjQoJHRwdHIpCSMgdFs3XQorCisJIG1vdgktMTYoJGFwdHIsJGkpLCVyYXgJIyBhWzBdCisJbGVhCTQ4KzgoJXJzcCksJHRwdHIKKwkgeG9yCSRBMFswXSwkQTBbMF0JCSMgdFswXQorCSBtb3YJOCgkdHB0ciksJEEwWzFdCQkjIHRbMV0KKworCWxlYQkoJHNoaWZ0LCRBMFswXSwyKSwkU1swXQkjIHRbMippXTw8MSB8IHNoaWZ0CisJc2hyCVwkNjMsJEEwWzBdCisJbGVhCSgkaiwkQTBbMV0sMiksJFNbMV0JIyB0WzIqaSsxXTw8MSB8CisJc2hyCVwkNjMsJEEwWzFdCisJb3IJJEEwWzBdLCRTWzFdCQkjIHwgdFsyKmldPj42MworCSBtb3YJMTYoJHRwdHIpLCRBMFswXQkjIHRbMippKzJdCSMgcHJlZmV0Y2gKKwltb3YJJEEwWzFdLCRzaGlmdAkJIyBzaGlmdD10WzIqaSsxXT4+NjMKKwltdWwJJXJheAkJCSMgYVtpXSphW2ldCisJbmVnCSRjYXJyeQkJCSMgbW92ICRjYXJyeSxjZgorCSBtb3YJMjQoJHRwdHIpLCRBMFsxXQkjIHRbMippKzIrMV0JIyBwcmVmZXRjaAorCWFkYwklcmF4LCRTWzBdCisJIG1vdgktOCgkYXB0ciwkaSksJXJheAkjIGFbaSsxXQkjIHByZWZldGNoCisJbW92CSRTWzBdLCgkdHB0cikKKwlhZGMJJXJkeCwkU1sxXQorCisJbGVhCSgkc2hpZnQsJEEwWzBdLDIpLCRTWzJdCSMgdFsyKmldPDwxIHwgc2hpZnQKKwkgbW92CSRTWzFdLDgoJHRwdHIpCisJIHNiYgkkY2FycnksJGNhcnJ5CQkjIG1vdiBjZiwkY2FycnkKKwlzaHIJXCQ2MywkQTBbMF0KKwlsZWEJKCRqLCRBMFsxXSwyKSwkU1szXQkjIHRbMippKzFdPDwxIHwKKwlzaHIJXCQ2MywkQTBbMV0KKwlvcgkkQTBbMF0sJFNbM10JCSMgfCB0WzIqaV0+PjYzCisJIG1vdgkzMigkdHB0ciksJEEwWzBdCSMgdFsyKmkrMl0JIyBwcmVmZXRjaAorCW1vdgkkQTBbMV0sJHNoaWZ0CQkjIHNoaWZ0PXRbMippKzFdPj42MworCW11bAklcmF4CQkJIyBhW2ldKmFbaV0KKwluZWcJJGNhcnJ5CQkJIyBtb3YgJGNhcnJ5LGNmCisJIG1vdgk0MCgkdHB0ciksJEEwWzFdCSMgdFsyKmkrMisxXQkjIHByZWZldGNoCisJYWRjCSVyYXgsJFNbMl0KKwkgbW92CTAoJGFwdHIsJGkpLCVyYXgJIyBhW2krMV0JIyBwcmVmZXRjaAorCW1vdgkkU1syXSwxNigkdHB0cikKKwlhZGMJJXJkeCwkU1szXQorCWxlYQkxNigkaSksJGkKKwltb3YJJFNbM10sMjQoJHRwdHIpCisJc2JiCSRjYXJyeSwkY2FycnkJCSMgbW92IGNmLCRjYXJyeQorCWxlYQk2NCgkdHB0ciksJHRwdHIKKwlqbXAJLkxzcXI0eF9zaGlmdF9uX2FkZAorCisuYWxpZ24JMzIKKy5Mc3FyNHhfc2hpZnRfbl9hZGQ6CisJbGVhCSgkc2hpZnQsJEEwWzBdLDIpLCRTWzBdCSMgdFsyKmldPDwxIHwgc2hpZnQKKwlzaHIJXCQ2MywkQTBbMF0KKwlsZWEJKCRqLCRBMFsxXSwyKSwkU1sxXQkjIHRbMippKzFdPDwxIHwKKwlzaHIJXCQ2MywkQTBbMV0KKwlvcgkkQTBbMF0sJFNbMV0JCSMgfCB0WzIqaV0+PjYzCisJIG1vdgktMTYoJHRwdHIpLCRBMFswXQkjIHRbMippKzJdCSMgcHJlZmV0Y2gKKwltb3YJJEEwWzFdLCRzaGlmdAkJIyBzaGlmdD10WzIqaSsxXT4+NjMKKwltdWwJJXJheAkJCSMgYVtpXSphW2ldCisJbmVnCSRjYXJyeQkJCSMgbW92ICRjYXJyeSxjZgorCSBtb3YJLTgoJHRwdHIpLCRBMFsxXQkjIHRbMippKzIrMV0JIyBwcmVmZXRjaAorCWFkYwklcmF4LCRTWzBdCisJIG1vdgktOCgkYXB0ciwkaSksJXJheAkjIGFbaSsxXQkjIHByZWZldGNoCisJbW92CSRTWzBdLC0zMigkdHB0cikKKwlhZGMJJXJkeCwkU1sxXQorCisJbGVhCSgkc2hpZnQsJEEwWzBdLDIpLCRTWzJdCSMgdFsyKmldPDwxIHwgc2hpZnQKKwkgbW92CSRTWzFdLC0yNCgkdHB0cikKKwkgc2JiCSRjYXJyeSwkY2FycnkJCSMgbW92IGNmLCRjYXJyeQorCXNocglcJDYzLCRBMFswXQorCWxlYQkoJGosJEEwWzFdLDIpLCRTWzNdCSMgdFsyKmkrMV08PDEgfAorCXNocglcJDYzLCRBMFsxXQorCW9yCSRBMFswXSwkU1szXQkJIyB8IHRbMippXT4+NjMKKwkgbW92CTAoJHRwdHIpLCRBMFswXQkJIyB0WzIqaSsyXQkjIHByZWZldGNoCisJbW92CSRBMFsxXSwkc2hpZnQJCSMgc2hpZnQ9dFsyKmkrMV0+PjYzCisJbXVsCSVyYXgJCQkjIGFbaV0qYVtpXQorCW5lZwkkY2FycnkJCQkjIG1vdiAkY2FycnksY2YKKwkgbW92CTgoJHRwdHIpLCRBMFsxXQkJIyB0WzIqaSsyKzFdCSMgcHJlZmV0Y2gKKwlhZGMJJXJheCwkU1syXQorCSBtb3YJMCgkYXB0ciwkaSksJXJheAkjIGFbaSsxXQkjIHByZWZldGNoCisJbW92CSRTWzJdLC0xNigkdHB0cikKKwlhZGMJJXJkeCwkU1szXQorCisJbGVhCSgkc2hpZnQsJEEwWzBdLDIpLCRTWzBdCSMgdFsyKmldPDwxIHwgc2hpZnQKKwkgbW92CSRTWzNdLC04KCR0cHRyKQorCSBzYmIJJGNhcnJ5LCRjYXJyeQkJIyBtb3YgY2YsJGNhcnJ5CisJc2hyCVwkNjMsJEEwWzBdCisJbGVhCSgkaiwkQTBbMV0sMiksJFNbMV0JIyB0WzIqaSsxXTw8MSB8CisJc2hyCVwkNjMsJEEwWzFdCisJb3IJJEEwWzBdLCRTWzFdCQkjIHwgdFsyKmldPj42MworCSBtb3YJMTYoJHRwdHIpLCRBMFswXQkjIHRbMippKzJdCSMgcHJlZmV0Y2gKKwltb3YJJEEwWzFdLCRzaGlmdAkJIyBzaGlmdD10WzIqaSsxXT4+NjMKKwltdWwJJXJheAkJCSMgYVtpXSphW2ldCisJbmVnCSRjYXJyeQkJCSMgbW92ICRjYXJyeSxjZgorCSBtb3YJMjQoJHRwdHIpLCRBMFsxXQkjIHRbMippKzIrMV0JIyBwcmVmZXRjaAorCWFkYwklcmF4LCRTWzBdCisJIG1vdgk4KCRhcHRyLCRpKSwlcmF4CSMgYVtpKzFdCSMgcHJlZmV0Y2gKKwltb3YJJFNbMF0sMCgkdHB0cikKKwlhZGMJJXJkeCwkU1sxXQorCisJbGVhCSgkc2hpZnQsJEEwWzBdLDIpLCRTWzJdCSMgdFsyKmldPDwxIHwgc2hpZnQKKwkgbW92CSRTWzFdLDgoJHRwdHIpCisJIHNiYgkkY2FycnksJGNhcnJ5CQkjIG1vdiBjZiwkY2FycnkKKwlzaHIJXCQ2MywkQTBbMF0KKwlsZWEJKCRqLCRBMFsxXSwyKSwkU1szXQkjIHRbMippKzFdPDwxIHwKKwlzaHIJXCQ2MywkQTBbMV0KKwlvcgkkQTBbMF0sJFNbM10JCSMgfCB0WzIqaV0+PjYzCisJIG1vdgkzMigkdHB0ciksJEEwWzBdCSMgdFsyKmkrMl0JIyBwcmVmZXRjaAorCW1vdgkkQTBbMV0sJHNoaWZ0CQkjIHNoaWZ0PXRbMippKzFdPj42MworCW11bAklcmF4CQkJIyBhW2ldKmFbaV0KKwluZWcJJGNhcnJ5CQkJIyBtb3YgJGNhcnJ5LGNmCisJIG1vdgk0MCgkdHB0ciksJEEwWzFdCSMgdFsyKmkrMisxXQkjIHByZWZldGNoCisJYWRjCSVyYXgsJFNbMl0KKwkgbW92CTE2KCRhcHRyLCRpKSwlcmF4CSMgYVtpKzFdCSMgcHJlZmV0Y2gKKwltb3YJJFNbMl0sMTYoJHRwdHIpCisJYWRjCSVyZHgsJFNbM10KKwltb3YJJFNbM10sMjQoJHRwdHIpCisJc2JiCSRjYXJyeSwkY2FycnkJCSMgbW92IGNmLCRjYXJyeQorCWxlYQk2NCgkdHB0ciksJHRwdHIKKwlhZGQJXCQzMiwkaQorCWpuegkuTHNxcjR4X3NoaWZ0X25fYWRkCisKKwlsZWEJKCRzaGlmdCwkQTBbMF0sMiksJFNbMF0JIyB0WzIqaV08PDEgfCBzaGlmdAorCS5ieXRlCTB4NjcKKwlzaHIJXCQ2MywkQTBbMF0KKwlsZWEJKCRqLCRBMFsxXSwyKSwkU1sxXQkjIHRbMippKzFdPDwxIHwKKwlzaHIJXCQ2MywkQTBbMV0KKwlvcgkkQTBbMF0sJFNbMV0JCSMgfCB0WzIqaV0+PjYzCisJIG1vdgktMTYoJHRwdHIpLCRBMFswXQkjIHRbMippKzJdCSMgcHJlZmV0Y2gKKwltb3YJJEEwWzFdLCRzaGlmdAkJIyBzaGlmdD10WzIqaSsxXT4+NjMKKwltdWwJJXJheAkJCSMgYVtpXSphW2ldCisJbmVnCSRjYXJyeQkJCSMgbW92ICRjYXJyeSxjZgorCSBtb3YJLTgoJHRwdHIpLCRBMFsxXQkjIHRbMippKzIrMV0JIyBwcmVmZXRjaAorCWFkYwklcmF4LCRTWzBdCisJIG1vdgktOCgkYXB0ciksJXJheAkJIyBhW2krMV0JIyBwcmVmZXRjaAorCW1vdgkkU1swXSwtMzIoJHRwdHIpCisJYWRjCSVyZHgsJFNbMV0KKworCWxlYQkoJHNoaWZ0LCRBMFswXSwyKSwkU1syXQkjIHRbMippXTw8MXxzaGlmdAorCSBtb3YJJFNbMV0sLTI0KCR0cHRyKQorCSBzYmIJJGNhcnJ5LCRjYXJyeQkJIyBtb3YgY2YsJGNhcnJ5CisJc2hyCVwkNjMsJEEwWzBdCisJbGVhCSgkaiwkQTBbMV0sMiksJFNbM10JIyB0WzIqaSsxXTw8MSB8CisJc2hyCVwkNjMsJEEwWzFdCisJb3IJJEEwWzBdLCRTWzNdCQkjIHwgdFsyKmldPj42MworCW11bAklcmF4CQkJIyBhW2ldKmFbaV0KKwluZWcJJGNhcnJ5CQkJIyBtb3YgJGNhcnJ5LGNmCisJYWRjCSVyYXgsJFNbMl0KKwlhZGMJJXJkeCwkU1szXQorCW1vdgkkU1syXSwtMTYoJHRwdHIpCisJbW92CSRTWzNdLC04KCR0cHRyKQorX19fCit9DAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBNb250Z29tZXJ5IHJlZHVjdGlvbiBwYXJ0LCAid29yZC1ieS13b3JkIiBhbGdvcml0aG0uCisjCisjIFRoaXMgbmV3IHBhdGggaXMgaW5zcGlyZWQgYnkgbXVsdGlwbGUgc3VibWlzc2lvbnMgZnJvbSBJbnRlbCwgYnkKKyMgU2hheSBHdWVyb24sIFZsYWQgS3Jhc25vdiwgRXJkaW5jIE96dHVyaywgSmFtZXMgR3VpbGZvcmQsCisjIFZpbm9kaCBHb3BhbC4uLgoreworbXkgKCRucHRyLCR0cHRyLCRjYXJyeSwkbTApPSgiJXJicCIsIiVyZGkiLCIlcnNpIiwiJXJieCIpOworCiskY29kZS49PDxfX187CisJbW92cQkleG1tMiwkbnB0cgorc3FyOHhfcmVkdWN0aW9uOgorCXhvcgklcmF4LCVyYXgKKwlsZWEJKCRucHRyLCRudW0sMiksJXJjeAkjIGVuZCBvZiBuW10KKwlsZWEJNDgrOCglcnNwLCRudW0sMiksJXJkeAkjIGVuZCBvZiB0W10gYnVmZmVyCisJbW92CSVyY3gsMCs4KCVyc3ApCisJbGVhCTQ4KzgoJXJzcCwkbnVtKSwkdHB0cgkjIGVuZCBvZiBpbml0aWFsIHRbXSB3aW5kb3cKKwltb3YJJXJkeCw4KzgoJXJzcCkKKwluZWcJJG51bQorCWptcAkuTDh4X3JlZHVjdGlvbl9sb29wCisKKy5hbGlnbgkzMgorLkw4eF9yZWR1Y3Rpb25fbG9vcDoKKwlsZWEJKCR0cHRyLCRudW0pLCR0cHRyCSMgc3RhcnQgb2YgY3VycmVudCB0W10gd2luZG93CisJLmJ5dGUJMHg2NgorCW1vdgk4KjAoJHRwdHIpLCRtMAorCW1vdgk4KjEoJHRwdHIpLCVyOQorCW1vdgk4KjIoJHRwdHIpLCVyMTAKKwltb3YJOCozKCR0cHRyKSwlcjExCisJbW92CTgqNCgkdHB0ciksJXIxMgorCW1vdgk4KjUoJHRwdHIpLCVyMTMKKwltb3YJOCo2KCR0cHRyKSwlcjE0CisJbW92CTgqNygkdHB0ciksJXIxNQorCW1vdgklcmF4LCglcmR4KQkJIyBzdG9yZSB0b3AtbW9zdCBjYXJyeSBiaXQKKwlsZWEJOCo4KCR0cHRyKSwkdHB0cgorCisJLmJ5dGUJMHg2NworCW1vdgkkbTAsJXI4CisJaW11bHEJMzIrOCglcnNwKSwkbTAJCSMgbjAqYVswXQorCW1vdgkxNiowKCRucHRyKSwlcmF4CSMgblswXQorCW1vdglcJDgsJWVjeAorCWptcAkuTDh4X3JlZHVjZQorCisuYWxpZ24JMzIKKy5MOHhfcmVkdWNlOgorCW11bHEJJG0wCisJIG1vdgkxNioxKCRucHRyKSwlcmF4CSMgblsxXQorCW5lZwklcjgKKwltb3YJJXJkeCwlcjgKKwlhZGMJXCQwLCVyOAorCisJbXVscQkkbTAKKwlhZGQJJXJheCwlcjkKKwkgbW92CTE2KjIoJG5wdHIpLCVyYXgKKwlhZGMJXCQwLCVyZHgKKwlhZGQJJXI5LCVyOAorCSBtb3YJJG0wLDQ4LTgrOCglcnNwLCVyY3gsOCkJIyBwdXQgYXNpZGUgbjAqYVtpXQorCW1vdgklcmR4LCVyOQorCWFkYwlcJDAsJXI5CisKKwltdWxxCSRtMAorCWFkZAklcmF4LCVyMTAKKwkgbW92CTE2KjMoJG5wdHIpLCVyYXgKKwlhZGMJXCQwLCVyZHgKKwlhZGQJJXIxMCwlcjkKKwkgbW92CTMyKzgoJXJzcCksJGNhcnJ5CSMgcHVsbCBuMCwgYm9ycm93ICRjYXJyeQorCW1vdgklcmR4LCVyMTAKKwlhZGMJXCQwLCVyMTAKKworCW11bHEJJG0wCisJYWRkCSVyYXgsJXIxMQorCSBtb3YJMTYqNCgkbnB0ciksJXJheAorCWFkYwlcJDAsJXJkeAorCSBpbXVscQklcjgsJGNhcnJ5CQkjIG1vZHVsby1zY2hlZHVsZWQKKwlhZGQJJXIxMSwlcjEwCisJbW92CSVyZHgsJXIxMQorCWFkYwlcJDAsJXIxMQorCisJbXVscQkkbTAKKwlhZGQJJXJheCwlcjEyCisJIG1vdgkxNio1KCRucHRyKSwlcmF4CisJYWRjCVwkMCwlcmR4CisJYWRkCSVyMTIsJXIxMQorCW1vdgklcmR4LCVyMTIKKwlhZGMJXCQwLCVyMTIKKworCW11bHEJJG0wCisJYWRkCSVyYXgsJXIxMworCSBtb3YJMTYqNigkbnB0ciksJXJheAorCWFkYwlcJDAsJXJkeAorCWFkZAklcjEzLCVyMTIKKwltb3YJJXJkeCwlcjEzCisJYWRjCVwkMCwlcjEzCisKKwltdWxxCSRtMAorCWFkZAklcmF4LCVyMTQKKwkgbW92CTE2KjcoJG5wdHIpLCVyYXgKKwlhZGMJXCQwLCVyZHgKKwlhZGQJJXIxNCwlcjEzCisJbW92CSVyZHgsJXIxNAorCWFkYwlcJDAsJXIxNAorCisJbXVscQkkbTAKKwkgbW92CSRjYXJyeSwkbTAJCSMgbjAqYVtpXQorCWFkZAklcmF4LCVyMTUKKwkgbW92CTE2KjAoJG5wdHIpLCVyYXgJIyBuWzBdCisJYWRjCVwkMCwlcmR4CisJYWRkCSVyMTUsJXIxNAorCW1vdgklcmR4LCVyMTUKKwlhZGMJXCQwLCVyMTUKKworCWRlYwklZWN4CisJam56CS5MOHhfcmVkdWNlCisKKwlsZWEJMTYqOCgkbnB0ciksJG5wdHIKKwl4b3IJJXJheCwlcmF4CisJbW92CTgrOCglcnNwKSwlcmR4CQkjIHB1bGwgZW5kIG9mIHRbXQorCWNtcAkwKzgoJXJzcCksJG5wdHIJCSMgZW5kIG9mIG5bXT8KKwlqYWUJLkw4eF9ub190YWlsCisKKwkuYnl0ZQkweDY2CisJYWRkCTgqMCgkdHB0ciksJXI4CisJYWRjCTgqMSgkdHB0ciksJXI5CisJYWRjCTgqMigkdHB0ciksJXIxMAorCWFkYwk4KjMoJHRwdHIpLCVyMTEKKwlhZGMJOCo0KCR0cHRyKSwlcjEyCisJYWRjCTgqNSgkdHB0ciksJXIxMworCWFkYwk4KjYoJHRwdHIpLCVyMTQKKwlhZGMJOCo3KCR0cHRyKSwlcjE1CisJc2JiCSRjYXJyeSwkY2FycnkJCSMgdG9wIGNhcnJ5CisKKwltb3YJNDgrNTYrOCglcnNwKSwkbTAJIyBwdWxsIG4wKmFbMF0KKwltb3YJXCQ4LCVlY3gKKwltb3YJMTYqMCgkbnB0ciksJXJheAorCWptcAkuTDh4X3RhaWwKKworLmFsaWduCTMyCisuTDh4X3RhaWw6CisJbXVscQkkbTAKKwlhZGQJJXJheCwlcjgKKwkgbW92CTE2KjEoJG5wdHIpLCVyYXgKKwkgbW92CSVyOCwoJHRwdHIpCQkjIHNhdmUgcmVzdWx0CisJbW92CSVyZHgsJXI4CisJYWRjCVwkMCwlcjgKKworCW11bHEJJG0wCisJYWRkCSVyYXgsJXI5CisJIG1vdgkxNioyKCRucHRyKSwlcmF4CisJYWRjCVwkMCwlcmR4CisJYWRkCSVyOSwlcjgKKwkgbGVhCTgoJHRwdHIpLCR0cHRyCQkjICR0cHRyKysKKwltb3YJJXJkeCwlcjkKKwlhZGMJXCQwLCVyOQorCisJbXVscQkkbTAKKwlhZGQJJXJheCwlcjEwCisJIG1vdgkxNiozKCRucHRyKSwlcmF4CisJYWRjCVwkMCwlcmR4CisJYWRkCSVyMTAsJXI5CisJbW92CSVyZHgsJXIxMAorCWFkYwlcJDAsJXIxMAorCisJbXVscQkkbTAKKwlhZGQJJXJheCwlcjExCisJIG1vdgkxNio0KCRucHRyKSwlcmF4CisJYWRjCVwkMCwlcmR4CisJYWRkCSVyMTEsJXIxMAorCW1vdgklcmR4LCVyMTEKKwlhZGMJXCQwLCVyMTEKKworCW11bHEJJG0wCisJYWRkCSVyYXgsJXIxMgorCSBtb3YJMTYqNSgkbnB0ciksJXJheAorCWFkYwlcJDAsJXJkeAorCWFkZAklcjEyLCVyMTEKKwltb3YJJXJkeCwlcjEyCisJYWRjCVwkMCwlcjEyCisKKwltdWxxCSRtMAorCWFkZAklcmF4LCVyMTMKKwkgbW92CTE2KjYoJG5wdHIpLCVyYXgKKwlhZGMJXCQwLCVyZHgKKwlhZGQJJXIxMywlcjEyCisJbW92CSVyZHgsJXIxMworCWFkYwlcJDAsJXIxMworCisJbXVscQkkbTAKKwlhZGQJJXJheCwlcjE0CisJIG1vdgkxNio3KCRucHRyKSwlcmF4CisJYWRjCVwkMCwlcmR4CisJYWRkCSVyMTQsJXIxMworCW1vdgklcmR4LCVyMTQKKwlhZGMJXCQwLCVyMTQKKworCW11bHEJJG0wCisJIG1vdgk0OC0xNis4KCVyc3AsJXJjeCw4KSwkbTAjIHB1bGwgbjAqYVtpXQorCWFkZAklcmF4LCVyMTUKKwlhZGMJXCQwLCVyZHgKKwlhZGQJJXIxNSwlcjE0CisJIG1vdgkxNiowKCRucHRyKSwlcmF4CSMgcHVsbCBuWzBdCisJbW92CSVyZHgsJXIxNQorCWFkYwlcJDAsJXIxNQorCisJZGVjCSVlY3gKKwlqbnoJLkw4eF90YWlsCisKKwlsZWEJMTYqOCgkbnB0ciksJG5wdHIKKwltb3YJOCs4KCVyc3ApLCVyZHgJCSMgcHVsbCBlbmQgb2YgdFtdCisJY21wCTArOCglcnNwKSwkbnB0cgkJIyBlbmQgb2YgbltdPworCWphZQkuTDh4X3RhaWxfZG9uZQkJIyBicmVhayBvdXQgb2YgbG9vcAorCisJIG1vdgk0OCs1Nis4KCVyc3ApLCRtMAkjIHB1bGwgbjAqYVswXQorCW5lZwkkY2FycnkKKwkgbW92CTgqMCgkbnB0ciksJXJheAkJIyBwdWxsIG5bMF0KKwlhZGMJOCowKCR0cHRyKSwlcjgKKwlhZGMJOCoxKCR0cHRyKSwlcjkKKwlhZGMJOCoyKCR0cHRyKSwlcjEwCisJYWRjCTgqMygkdHB0ciksJXIxMQorCWFkYwk4KjQoJHRwdHIpLCVyMTIKKwlhZGMJOCo1KCR0cHRyKSwlcjEzCisJYWRjCTgqNigkdHB0ciksJXIxNAorCWFkYwk4KjcoJHRwdHIpLCVyMTUKKwlzYmIJJGNhcnJ5LCRjYXJyeQkJIyB0b3AgY2FycnkKKworCW1vdglcJDgsJWVjeAorCWptcAkuTDh4X3RhaWwKKworLmFsaWduCTMyCisuTDh4X3RhaWxfZG9uZToKKwlhZGQJKCVyZHgpLCVyOAkJIyBjYW4gdGhpcyBvdmVyZmxvdz8KKwl4b3IJJXJheCwlcmF4CisKKwluZWcJJGNhcnJ5CisuTDh4X25vX3RhaWw6CisJYWRjCTgqMCgkdHB0ciksJXI4CisJYWRjCTgqMSgkdHB0ciksJXI5CisJYWRjCTgqMigkdHB0ciksJXIxMAorCWFkYwk4KjMoJHRwdHIpLCVyMTEKKwlhZGMJOCo0KCR0cHRyKSwlcjEyCisJYWRjCTgqNSgkdHB0ciksJXIxMworCWFkYwk4KjYoJHRwdHIpLCVyMTQKKwlhZGMJOCo3KCR0cHRyKSwlcjE1CisJYWRjCVwkMCwlcmF4CQkjIHRvcC1tb3N0IGNhcnJ5CisJIG1vdgktMTYoJG5wdHIpLCVyY3gJCSMgbnBbbnVtLTFdCisJIHhvcgkkY2FycnksJGNhcnJ5CisKKwltb3ZxCSV4bW0yLCRucHRyCQkjIHJlc3RvcmUgJG5wdHIKKworCW1vdgklcjgsOCowKCR0cHRyKQkJIyBzdG9yZSB0b3AgNTEyIGJpdHMKKwltb3YJJXI5LDgqMSgkdHB0cikKKwkgbW92cQkleG1tMywkbnVtCQkjICRudW0gaXMgJXI5LCBjYW4ndCBiZSBtb3ZlZCB1cHdhcmRzCisJbW92CSVyMTAsOCoyKCR0cHRyKQorCW1vdgklcjExLDgqMygkdHB0cikKKwltb3YJJXIxMiw4KjQoJHRwdHIpCisJbW92CSVyMTMsOCo1KCR0cHRyKQorCW1vdgklcjE0LDgqNigkdHB0cikKKwltb3YJJXIxNSw4KjcoJHRwdHIpCisJbGVhCTgqOCgkdHB0ciksJHRwdHIKKworCWNtcAklcmR4LCR0cHRyCQkjIGVuZCBvZiB0W10/CisJamIJLkw4eF9yZWR1Y3Rpb25fbG9vcAorX19fCit9DAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUG9zdC1jb25kaXRpb24sIDR4IHVucm9sbGVkCisjCit7CitteSAoJHRwdHIsJG5wdHIpPSgiJXJieCIsIiVyYnAiKTsKKyRjb2RlLj08PF9fXzsKKwkjeG9yCSVyc2ksJXJzaQkJIyAlcnNpIHdhcyAkY2FycnkgYWJvdmUKKwlzdWIJJXIxNSwlcmN4CQkjIGNvbXBhcmUgdG9wLW1vc3Qgd29yZHMKKwlsZWEJKCVyZGksJG51bSksJHRwdHIJIyAlcmRpIHdhcyAkdHB0ciBhYm92ZQorCWFkYwklcnNpLCVyc2kKKwltb3YJJG51bSwlcmN4CisJb3IJJXJzaSwlcmF4CisJbW92cQkleG1tMSwkcnB0cgkJIyByZXN0b3JlICRycHRyCisJeG9yCVwkMSwlcmF4CisJbW92cQkleG1tMSwkYXB0cgkJIyBwcmVwYXJlIGZvciBiYWNrLXRvLWJhY2sgY2FsbAorCWxlYQkoJG5wdHIsJXJheCw4KSwkbnB0cgorCXNhcglcJDMrMiwlcmN4CQkjIGNmPTAKKwlqbXAJLkxzcXI0eF9zdWIKKworLmFsaWduCTMyCisuTHNxcjR4X3N1YjoKKwkuYnl0ZQkweDY2CisJbW92CTgqMCgkdHB0ciksJXIxMgorCW1vdgk4KjEoJHRwdHIpLCVyMTMKKwlzYmIJMTYqMCgkbnB0ciksJXIxMgorCW1vdgk4KjIoJHRwdHIpLCVyMTQKKwlzYmIJMTYqMSgkbnB0ciksJXIxMworCW1vdgk4KjMoJHRwdHIpLCVyMTUKKwlsZWEJOCo0KCR0cHRyKSwkdHB0cgorCXNiYgkxNioyKCRucHRyKSwlcjE0CisJbW92CSVyMTIsOCowKCRycHRyKQorCXNiYgkxNiozKCRucHRyKSwlcjE1CisJbGVhCTE2KjQoJG5wdHIpLCRucHRyCisJbW92CSVyMTMsOCoxKCRycHRyKQorCW1vdgklcjE0LDgqMigkcnB0cikKKwltb3YJJXIxNSw4KjMoJHJwdHIpCisJbGVhCTgqNCgkcnB0ciksJHJwdHIKKworCWluYwklcmN4CQkJIyBwYXNzICVjZgorCWpuegkuTHNxcjR4X3N1YgorX19fCit9CiskY29kZS49PDxfX187CisJbW92CSRudW0sJXIxMAkJIyBwcmVwYXJlIGZvciBiYWNrLXRvLWJhY2sgY2FsbAorCW5lZwkkbnVtCQkJIyByZXN0b3JlICRudW0JCisJcmV0Cisuc2l6ZQlibl9zcXI4eF9pbnRlcm5hbCwuLWJuX3Nxcjh4X2ludGVybmFsCitfX18KK3sKKyRjb2RlLj08PF9fXzsKKy5nbG9ibAlibl9mcm9tX21vbnRnb21lcnkKKy50eXBlCWJuX2Zyb21fbW9udGdvbWVyeSxcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMzIKK2JuX2Zyb21fbW9udGdvbWVyeToKKwl0ZXN0bAlcJDcsYCgkd2luNjQ/IjQ4KCVyc3ApIjoiJXI5ZCIpYAorCWp6CWJuX2Zyb21fbW9udDh4CisJeG9yCSVlYXgsJWVheAorCXJldAorLnNpemUJYm5fZnJvbV9tb250Z29tZXJ5LC4tYm5fZnJvbV9tb250Z29tZXJ5CisKKy50eXBlCWJuX2Zyb21fbW9udDh4LFxAZnVuY3Rpb24sNgorLmFsaWduCTMyCitibl9mcm9tX21vbnQ4eDoKKwkuYnl0ZQkweDY3CisJbW92CSVyc3AsJXJheAorCXB1c2gJJXJieAorCXB1c2gJJXJicAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCXB1c2gJJXIxNQorX19fCiskY29kZS49PDxfX18gaWYgKCR3aW42NCk7CisJbGVhCS0weDI4KCVyc3ApLCVyc3AKKwltb3ZhcHMJJXhtbTYsKCVyc3ApCisJbW92YXBzCSV4bW03LDB4MTAoJXJzcCkKK19fXworJGNvZGUuPTw8X19fOworCS5ieXRlCTB4NjcKKwltb3YJJHtudW19ZCwlcjEwZAorCXNobAlcJDMsJHtudW19ZAkJIyBjb252ZXJ0ICRudW0gdG8gYnl0ZXMKKwlzaGwJXCQzKzIsJXIxMGQJCSMgNCokbnVtCisJbmVnCSRudW0KKwltb3YJKCRuMCksJG4wCQkjICpuMAorCisJIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwkjIGVuc3VyZSB0aGF0IHN0YWNrIGZyYW1lIGRvZXNuJ3QgYWxpYXMgd2l0aCAkYXB0cis0KiRudW0KKwkjIG1vZHVsbyA0MDk2LCB3aGljaCBjb3ZlcnMgcmV0W251bV0sIGFtW251bV0gYW5kIG5bMipudW1dCisJIyAoc2VlIGJuX2V4cC5jKS4gdGhpcyBpcyBkb25lIHRvIGFsbG93IG1lbW9yeSBkaXNhbWJpZ3VhdGlvbgorCSMgbG9naWMgZG8gaXRzIG1hZ2ljLgorCSMKKwlsZWEJLTY0KCVyc3AsJG51bSwyKSwlcjExCisJc3ViCSRhcHRyLCVyMTEKKwlhbmQJXCQ0MDk1LCVyMTEKKwljbXAJJXIxMSwlcjEwCisJamIJLkxmcm9tX3NwX2FsdAorCXN1YgklcjExLCVyc3AJCSMgYWxpZ24gd2l0aCAkYXB0cgorCWxlYQktNjQoJXJzcCwkbnVtLDIpLCVyc3AJIyBhbGxvY2EoZnJhbWUrMiokbnVtKQorCWptcAkuTGZyb21fc3BfZG9uZQorCisuYWxpZ24JMzIKKy5MZnJvbV9zcF9hbHQ6CisJbGVhCTQwOTYtNjQoLCRudW0sMiksJXIxMAkjIDQwOTYtZnJhbWUtMiokbnVtCisJbGVhCS02NCglcnNwLCRudW0sMiksJXJzcAkjIGFsbG9jYShmcmFtZSsyKiRudW0pCisJc3ViCSVyMTAsJXIxMQorCW1vdglcJDAsJXIxMAorCWNtb3ZjCSVyMTAsJXIxMQorCXN1YgklcjExLCVyc3AKKy5MZnJvbV9zcF9kb25lOgorCWFuZAlcJC02NCwlcnNwCisJbW92CSRudW0sJXIxMAkKKwluZWcJJG51bQorCisJIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwkjIFN0YWNrIGxheW91dAorCSMKKwkjICswCXNhdmVkICRudW0sIHVzZWQgaW4gcmVkdWN0aW9uIHNlY3Rpb24KKwkjICs4CSZ0WzIqJG51bV0sIHVzZWQgaW4gcmVkdWN0aW9uIHNlY3Rpb24KKwkjICszMglzYXZlZCAqbjAKKwkjICs0MAlzYXZlZCAlcnNwCisJIyArNDgJdFsyKiRudW1dCisJIworCW1vdgkkbjAsICAzMiglcnNwKQorCW1vdgklcmF4LCA0MCglcnNwKQkJIyBzYXZlIG9yaWdpbmFsICVyc3AKKy5MZnJvbV9ib2R5OgorCW1vdgkkbnVtLCVyMTEKKwlsZWEJNDgoJXJzcCksJXJheAorCXB4b3IJJXhtbTAsJXhtbTAKKwlqbXAJLkxtdWxfYnlfMQorCisuYWxpZ24JMzIKKy5MbXVsX2J5XzE6CisJbW92ZHF1CSgkYXB0ciksJXhtbTEKKwltb3ZkcXUJMTYoJGFwdHIpLCV4bW0yCisJbW92ZHF1CTMyKCRhcHRyKSwleG1tMworCW1vdmRxYQkleG1tMCwoJXJheCwkbnVtKQorCW1vdmRxdQk0OCgkYXB0ciksJXhtbTQKKwltb3ZkcWEJJXhtbTAsMTYoJXJheCwkbnVtKQorCS5ieXRlCTB4NDgsMHg4ZCwweGI2LDB4NDAsMHgwMCwweDAwLDB4MDAJIyBsZWEJNjQoJGFwdHIpLCRhcHRyCisJbW92ZHFhCSV4bW0xLCglcmF4KQorCW1vdmRxYQkleG1tMCwzMiglcmF4LCRudW0pCisJbW92ZHFhCSV4bW0yLDE2KCVyYXgpCisJbW92ZHFhCSV4bW0wLDQ4KCVyYXgsJG51bSkKKwltb3ZkcWEJJXhtbTMsMzIoJXJheCkKKwltb3ZkcWEJJXhtbTQsNDgoJXJheCkKKwlsZWEJNjQoJXJheCksJXJheAorCXN1YglcJDY0LCVyMTEKKwlqbnoJLkxtdWxfYnlfMQorCisJbW92cQkkcnB0ciwleG1tMQorCW1vdnEJJG5wdHIsJXhtbTIKKwkuYnl0ZQkweDY3CisJbW92CSRucHRyLCVyYnAKKwltb3ZxCSVyMTAsICV4bW0zCQkjIC1udW0KK19fXworJGNvZGUuPTw8X19fIGlmICgkYWRkeCk7CisJbW92CU9QRU5TU0xfaWEzMmNhcF9QKzgoJXJpcCksJXIxMWQKKwlhbmQJXCQweDgwMTAwLCVyMTFkCisJY21wCVwkMHg4MDEwMCwlcjExZAorCWpuZQkuTGZyb21fbW9udF9ub3gKKworCWxlYQkoJXJheCwkbnVtKSwkcnB0cgorCWNhbGwJc3FyeDh4X3JlZHVjdGlvbgorCisJcHhvcgkleG1tMCwleG1tMAorCWxlYQk0OCglcnNwKSwlcmF4CisJbW92CTQwKCVyc3ApLCVyc2kJCSMgcmVzdG9yZSAlcnNwCisJam1wCS5MZnJvbV9tb250X3plcm8KKworLmFsaWduCTMyCisuTGZyb21fbW9udF9ub3g6CitfX18KKyRjb2RlLj08PF9fXzsKKwljYWxsCXNxcjh4X3JlZHVjdGlvbgorCisJcHhvcgkleG1tMCwleG1tMAorCWxlYQk0OCglcnNwKSwlcmF4CisJbW92CTQwKCVyc3ApLCVyc2kJCSMgcmVzdG9yZSAlcnNwCisJam1wCS5MZnJvbV9tb250X3plcm8KKworLmFsaWduCTMyCisuTGZyb21fbW9udF96ZXJvOgorCW1vdmRxYQkleG1tMCwxNiowKCVyYXgpCisJbW92ZHFhCSV4bW0wLDE2KjEoJXJheCkKKwltb3ZkcWEJJXhtbTAsMTYqMiglcmF4KQorCW1vdmRxYQkleG1tMCwxNiozKCVyYXgpCisJbGVhCTE2KjQoJXJheCksJXJheAorCXN1YglcJDMyLCRudW0KKwlqbnoJLkxmcm9tX21vbnRfemVybworCisJbW92CVwkMSwlcmF4CisJbW92CS00OCglcnNpKSwlcjE1CisJbW92CS00MCglcnNpKSwlcjE0CisJbW92CS0zMiglcnNpKSwlcjEzCisJbW92CS0yNCglcnNpKSwlcjEyCisJbW92CS0xNiglcnNpKSwlcmJwCisJbW92CS04KCVyc2kpLCVyYngKKwlsZWEJKCVyc2kpLCVyc3AKKy5MZnJvbV9lcGlsb2d1ZToKKwlyZXQKKy5zaXplCWJuX2Zyb21fbW9udDh4LC4tYm5fZnJvbV9tb250OHgKK19fXworfQorfX19CisMCitpZiAoJGFkZHgpIHt7eworbXkgJGJwPSIlcmR4IjsJIyByZXN0b3JlIG9yaWdpbmFsIHZhbHVlCisKKyRjb2RlLj08PF9fXzsKKy50eXBlCWJuX211bHg0eF9tb250X2dhdGhlcjUsXEBmdW5jdGlvbiw2CisuYWxpZ24JMzIKK2JuX211bHg0eF9tb250X2dhdGhlcjU6CisuTG11bHg0eF9lbnRlcjoKKwkuYnl0ZQkweDY3CisJbW92CSVyc3AsJXJheAorCXB1c2gJJXJieAorCXB1c2gJJXJicAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCXB1c2gJJXIxNQorX19fCiskY29kZS49PDxfX18gaWYgKCR3aW42NCk7CisJbGVhCS0weDI4KCVyc3ApLCVyc3AKKwltb3ZhcHMJJXhtbTYsKCVyc3ApCisJbW92YXBzCSV4bW03LDB4MTAoJXJzcCkKK19fXworJGNvZGUuPTw8X19fOworCS5ieXRlCTB4NjcKKwltb3YJJHtudW19ZCwlcjEwZAorCXNobAlcJDMsJHtudW19ZAkJIyBjb252ZXJ0ICRudW0gdG8gYnl0ZXMKKwlzaGwJXCQzKzIsJXIxMGQJCSMgNCokbnVtCisJbmVnCSRudW0JCQkjIC0kbnVtCisJbW92CSgkbjApLCRuMAkJIyAqbjAKKworCSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisJIyBlbnN1cmUgdGhhdCBzdGFjayBmcmFtZSBkb2Vzbid0IGFsaWFzIHdpdGggJGFwdHIrNCokbnVtCisJIyBtb2R1bG8gNDA5Niwgd2hpY2ggY292ZXJzIGFbbnVtXSwgcmV0W251bV0gYW5kIG5bMipudW1dCisJIyAoc2VlIGJuX2V4cC5jKS4gdGhpcyBpcyBkb25lIHRvIGFsbG93IG1lbW9yeSBkaXNhbWJpZ3VhdGlvbgorCSMgbG9naWMgZG8gaXRzIG1hZ2ljLiBbZXhjZXNzaXZlIGZyYW1lIGlzIGFsbG9jYXRlZCBpbiBvcmRlcgorCSMgdG8gYWxsb3cgYm5fZnJvbV9tb250OHggdG8gY2xlYXIgaXQuXQorCSMKKwlsZWEJLTY0KCVyc3AsJG51bSwyKSwlcjExCisJc3ViCSRhcCwlcjExCisJYW5kCVwkNDA5NSwlcjExCisJY21wCSVyMTEsJXIxMAorCWpiCS5MbXVseDR4c3BfYWx0CisJc3ViCSVyMTEsJXJzcAkJIyBhbGlnbiB3aXRoICRhcHRyCisJbGVhCS02NCglcnNwLCRudW0sMiksJXJzcAkjIGFsbG9jYShmcmFtZSskbnVtKQorCWptcAkuTG11bHg0eHNwX2RvbmUKKworLmFsaWduCTMyCisuTG11bHg0eHNwX2FsdDoKKwlsZWEJNDA5Ni02NCgsJG51bSwyKSwlcjEwCSMgNDA5Ni1mcmFtZS0kbnVtCisJbGVhCS02NCglcnNwLCRudW0sMiksJXJzcAkjIGFsbG9jYShmcmFtZSskbnVtKQorCXN1YgklcjEwLCVyMTEKKwltb3YJXCQwLCVyMTAKKwljbW92YwklcjEwLCVyMTEKKwlzdWIJJXIxMSwlcnNwCisuTG11bHg0eHNwX2RvbmU6CQorCWFuZAlcJC02NCwlcnNwCQkjIGVuc3VyZSBhbGlnbm1lbnQKKwkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCSMgU3RhY2sgbGF5b3V0CisJIyArMAktbnVtCisJIyArOAlvZmYtbG9hZGVkICZiW2ldCisJIyArMTYJZW5kIG9mIGJbbnVtXQorCSMgKzI0CWlubmVyIGNvdW50ZXIKKwkjICszMglzYXZlZCBuMAorCSMgKzQwCXNhdmVkICVyc3AKKwkjICs0OAorCSMgKzU2CXNhdmVkIHJwCisJIyArNjQJdG1wW251bSsxXQorCSMKKwltb3YJJG4wLCAzMiglcnNwKQkJIyBzYXZlICpuMAorCW1vdgklcmF4LDQwKCVyc3ApCQkjIHNhdmUgb3JpZ2luYWwgJXJzcAorLkxtdWx4NHhfYm9keToKKwljYWxsCW11bHg0eF9pbnRlcm5hbAorCisJbW92CTQwKCVyc3ApLCVyc2kJCSMgcmVzdG9yZSAlcnNwCisJbW92CVwkMSwlcmF4CitfX18KKyRjb2RlLj08PF9fXyBpZiAoJHdpbjY0KTsKKwltb3ZhcHMJLTg4KCVyc2kpLCV4bW02CisJbW92YXBzCS03MiglcnNpKSwleG1tNworX19fCiskY29kZS49PDxfX187CisJbW92CS00OCglcnNpKSwlcjE1CisJbW92CS00MCglcnNpKSwlcjE0CisJbW92CS0zMiglcnNpKSwlcjEzCisJbW92CS0yNCglcnNpKSwlcjEyCisJbW92CS0xNiglcnNpKSwlcmJwCisJbW92CS04KCVyc2kpLCVyYngKKwlsZWEJKCVyc2kpLCVyc3AKKy5MbXVseDR4X2VwaWxvZ3VlOgorCXJldAorLnNpemUJYm5fbXVseDR4X21vbnRfZ2F0aGVyNSwuLWJuX211bHg0eF9tb250X2dhdGhlcjUKKworLnR5cGUJbXVseDR4X2ludGVybmFsLFxAYWJpLW9tbmlwb3RlbnQKKy5hbGlnbgkzMgorbXVseDR4X2ludGVybmFsOgorCS5ieXRlCTB4NGMsMHg4OSwweDhjLDB4MjQsMHgwOCwweDAwLDB4MDAsMHgwMAkjIG1vdgkkbnVtLDgoJXJzcCkJCSMgc2F2ZSAtJG51bQorCS5ieXRlCTB4NjcKKwluZWcJJG51bQkJCSMgcmVzdG9yZSAkbnVtCisJc2hsCVwkNSwkbnVtCisJbGVhCTI1NigkYnAsJG51bSksJXIxMworCXNocglcJDUrNSwkbnVtCisJbW92CWAoJHdpbjY0PzU2OjgpYCglcmF4KSwlcjEwZAkjIGxvYWQgN3RoIGFyZ3VtZW50CisJc3ViCVwkMSwkbnVtCisJbW92CSVyMTMsMTYrOCglcnNwKQkJIyBlbmQgb2YgYltudW1dCisJbW92CSRudW0sMjQrOCglcnNwKQkJIyBpbm5lciBjb3VudGVyCisJbW92CSRycCwgNTYrOCglcnNwKQkJIyBzYXZlICRycAorX19fCitteSAoJGFwdHIsICRicHRyLCAkbnB0ciwgJHRwdHIsICRtaSwgICRiaSwgICR6ZXJvLCAkbnVtKT0KKyAgICgiJXJzaSIsIiVyZGkiLCIlcmN4IiwiJXJieCIsIiVyOCIsIiVyOSIsIiVyYnAiLCIlcmF4Iik7CitteSAkcnB0cj0kYnB0cjsKK215ICRTVFJJREU9MioqNSo4OwkJIyA1IGlzICJ3aW5kb3cgc2l6ZSIKK215ICROPSRTVFJJREUvNDsJCSMgc2hvdWxkIG1hdGNoIGNhY2hlIGxpbmUgc2l6ZQorJGNvZGUuPTw8X19fOworCW1vdgklcjEwLCVyMTEKKwlzaHIJXCRgbG9nKCROLzgpL2xvZygyKWAsJXIxMAorCWFuZAlcJGAkTi84LTFgLCVyMTEKKwlub3QJJXIxMAorCWxlYQkuTG1hZ2ljX21hc2tzKCVyaXApLCVyYXgKKwlhbmQJXCRgMioqNS8oJE4vOCktMWAsJXIxMAkjIDUgaXMgIndpbmRvdyBzaXplIgorCWxlYQk5NigkYnAsJXIxMSw4KSwkYnB0cgkjIHBvaW50ZXIgd2l0aGluIDFzdCBjYWNoZSBsaW5lCisJbW92cQkwKCVyYXgsJXIxMCw4KSwleG1tNAkjIHNldCBvZiBtYXNrcyBkZW5vdGluZyB3aGljaAorCW1vdnEJOCglcmF4LCVyMTAsOCksJXhtbTUJIyBjYWNoZSBsaW5lIGNvbnRhaW5zIGVsZW1lbnQKKwlhZGQJXCQ3LCVyMTEKKwltb3ZxCTE2KCVyYXgsJXIxMCw4KSwleG1tNgkjIGRlbm90ZWQgYnkgN3RoIGFyZ3VtZW50CisJbW92cQkyNCglcmF4LCVyMTAsOCksJXhtbTcKKwlhbmQJXCQ3LCVyMTEKKworCW1vdnEJYDAqJFNUUklERS80LTk2YCgkYnB0ciksJXhtbTAKKwlsZWEJJFNUUklERSgkYnB0ciksJHRwdHIJIyBib3Jyb3cgJHRwdHIKKwltb3ZxCWAxKiRTVFJJREUvNC05NmAoJGJwdHIpLCV4bW0xCisJcGFuZAkleG1tNCwleG1tMAorCW1vdnEJYDIqJFNUUklERS80LTk2YCgkYnB0ciksJXhtbTIKKwlwYW5kCSV4bW01LCV4bW0xCisJbW92cQlgMyokU1RSSURFLzQtOTZgKCRicHRyKSwleG1tMworCXBhbmQJJXhtbTYsJXhtbTIKKwlwb3IJJXhtbTEsJXhtbTAKKwltb3ZxCWAwKiRTVFJJREUvNC05NmAoJHRwdHIpLCV4bW0xCisJcGFuZAkleG1tNywleG1tMworCXBvcgkleG1tMiwleG1tMAorCW1vdnEJYDEqJFNUUklERS80LTk2YCgkdHB0ciksJXhtbTIKKwlwb3IJJXhtbTMsJXhtbTAKKwkuYnl0ZQkweDY3LDB4NjcKKwlwYW5kCSV4bW00LCV4bW0xCisJbW92cQlgMiokU1RSSURFLzQtOTZgKCR0cHRyKSwleG1tMworCisJbW92cQkleG1tMCwlcmR4CQkjIGJwWzBdCisJbW92cQlgMyokU1RSSURFLzQtOTZgKCR0cHRyKSwleG1tMAorCWxlYQkyKiRTVFJJREUoJGJwdHIpLCRicHRyCSMgbmV4dCAmYltpXQorCXBhbmQJJXhtbTUsJXhtbTIKKwkuYnl0ZQkweDY3LDB4NjcKKwlwYW5kCSV4bW02LCV4bW0zCisJIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwkjICR0cHRyIGlzIGNob3NlbiBzbyB0aGF0IHdyaXRpbmcgdG8gdG9wLW1vc3QgZWxlbWVudCBvZiB0aGUKKwkjIHZlY3RvciBvY2N1cnMganVzdCAiYWJvdmUiIHJlZmVyZW5jZXMgdG8gcG93ZXJzIHRhYmxlLAorCSMgImFib3ZlIiBtb2R1bG8gY2FjaGUtbGluZSBzaXplLCB3aGljaCBlZmZlY3RpdmVseSBwcmVjbHVkZXMKKwkjIHBvc3NpYmlsaXR5IG9mIG1lbW9yeSBkaXNhbWJpZ3VhdGlvbiBsb2dpYyBmYWlsdXJlIHdoZW4KKwkjIGFjY2Vzc2luZyB0aGUgdGFibGUuCisJIyAKKwlsZWEJNjQrOCo0KzgoJXJzcCwlcjExLDgpLCR0cHRyCisKKwltb3YJJXJkeCwkYmkKKwltdWx4CTAqOCgkYXB0ciksJG1pLCVyYXgJIyBhWzBdKmJbMF0KKwltdWx4CTEqOCgkYXB0ciksJXIxMSwlcjEyCSMgYVsxXSpiWzBdCisJYWRkCSVyYXgsJXIxMQorCW11bHgJMio4KCRhcHRyKSwlcmF4LCVyMTMJIyAuLi4KKwlhZGMJJXJheCwlcjEyCisJYWRjCVwkMCwlcjEzCisJbXVseAkzKjgoJGFwdHIpLCVyYXgsJXIxNAorCisJbW92CSRtaSwlcjE1CisJaW11bHEJMzIrOCglcnNwKSwkbWkJCSMgInRbMF0iKm4wCisJeG9yCSR6ZXJvLCR6ZXJvCQkjIGNmPTAsIG9mPTAKKwltb3YJJG1pLCVyZHgKKworCXBvcgkleG1tMiwleG1tMQorCXBhbmQJJXhtbTcsJXhtbTAKKwlwb3IJJXhtbTMsJXhtbTEKKwltb3YJJGJwdHIsOCs4KCVyc3ApCQkjIG9mZi1sb2FkICZiW2ldCisJcG9yCSV4bW0xLCV4bW0wCisKKwkuYnl0ZQkweDQ4LDB4OGQsMHhiNiwweDIwLDB4MDAsMHgwMCwweDAwCSMgbGVhCTQqOCgkYXB0ciksJGFwdHIKKwlhZGN4CSVyYXgsJXIxMworCWFkY3gJJHplcm8sJXIxNAkJIyBjZj0wCisKKwltdWx4CTAqMTYoJG5wdHIpLCVyYXgsJXIxMAorCWFkY3gJJXJheCwlcjE1CQkjIGRpc2NhcmRlZAorCWFkb3gJJXIxMSwlcjEwCisJbXVseAkxKjE2KCRucHRyKSwlcmF4LCVyMTEKKwlhZGN4CSVyYXgsJXIxMAorCWFkb3gJJXIxMiwlcjExCisJbXVseAkyKjE2KCRucHRyKSwlcmF4LCVyMTIKKwltb3YJMjQrOCglcnNwKSwkYnB0cgkjIGNvdW50ZXIgdmFsdWUKKwkuYnl0ZQkweDY2CisJbW92CSVyMTAsLTgqNCgkdHB0cikKKwlhZGN4CSVyYXgsJXIxMQorCWFkb3gJJXIxMywlcjEyCisJbXVseAkzKjE2KCRucHRyKSwlcmF4LCVyMTUKKwkgLmJ5dGUJMHg2NywweDY3CisJIG1vdgkkYmksJXJkeAorCW1vdgklcjExLC04KjMoJHRwdHIpCisJYWRjeAklcmF4LCVyMTIKKwlhZG94CSR6ZXJvLCVyMTUJCSMgb2Y9MAorCS5ieXRlCTB4NDgsMHg4ZCwweDg5LDB4NDAsMHgwMCwweDAwLDB4MDAJIyBsZWEJNCoxNigkbnB0ciksJG5wdHIKKwltb3YJJXIxMiwtOCoyKCR0cHRyKQorCSNqbXAJLkxtdWx4NHhfMXN0CisKKy5hbGlnbgkzMgorLkxtdWx4NHhfMXN0OgorCWFkY3gJJHplcm8sJXIxNQkJIyBjZj0wLCBtb2R1bG8tc2NoZWR1bGVkCisJbXVseAkwKjgoJGFwdHIpLCVyMTAsJXJheAkjIGFbNF0qYlswXQorCWFkY3gJJXIxNCwlcjEwCisJbXVseAkxKjgoJGFwdHIpLCVyMTEsJXIxNAkjIGFbNV0qYlswXQorCWFkY3gJJXJheCwlcjExCisJbXVseAkyKjgoJGFwdHIpLCVyMTIsJXJheAkjIC4uLgorCWFkY3gJJXIxNCwlcjEyCisJbXVseAkzKjgoJGFwdHIpLCVyMTMsJXIxNAorCSAuYnl0ZQkweDY3LDB4NjcKKwkgbW92CSRtaSwlcmR4CisJYWRjeAklcmF4LCVyMTMKKwlhZGN4CSR6ZXJvLCVyMTQJCSMgY2Y9MAorCWxlYQk0KjgoJGFwdHIpLCRhcHRyCisJbGVhCTQqOCgkdHB0ciksJHRwdHIKKworCWFkb3gJJXIxNSwlcjEwCisJbXVseAkwKjE2KCRucHRyKSwlcmF4LCVyMTUKKwlhZGN4CSVyYXgsJXIxMAorCWFkb3gJJXIxNSwlcjExCisJbXVseAkxKjE2KCRucHRyKSwlcmF4LCVyMTUKKwlhZGN4CSVyYXgsJXIxMQorCWFkb3gJJXIxNSwlcjEyCisJbXVseAkyKjE2KCRucHRyKSwlcmF4LCVyMTUKKwltb3YJJXIxMCwtNSo4KCR0cHRyKQorCWFkY3gJJXJheCwlcjEyCisJbW92CSVyMTEsLTQqOCgkdHB0cikKKwlhZG94CSVyMTUsJXIxMworCW11bHgJMyoxNigkbnB0ciksJXJheCwlcjE1CisJIG1vdgkkYmksJXJkeAorCW1vdgklcjEyLC0zKjgoJHRwdHIpCisJYWRjeAklcmF4LCVyMTMKKwlhZG94CSR6ZXJvLCVyMTUKKwlsZWEJNCoxNigkbnB0ciksJG5wdHIKKwltb3YJJXIxMywtMio4KCR0cHRyKQorCisJZGVjCSRicHRyCQkJIyBvZj0wLCBwYXNzIGNmCisJam56CS5MbXVseDR4XzFzdAorCisJbW92CTgoJXJzcCksJG51bQkJIyBsb2FkIC1udW0KKwltb3ZxCSV4bW0wLCVyZHgJCSMgYnBbMV0KKwlhZGMJJHplcm8sJXIxNQkJIyBtb2R1bG8tc2NoZWR1bGVkCisJbGVhCSgkYXB0ciwkbnVtKSwkYXB0cgkjIHJld2luZCAkYXB0cgorCWFkZAklcjE1LCVyMTQKKwltb3YJOCs4KCVyc3ApLCRicHRyCQkjIHJlLWxvYWQgJmJbaV0KKwlhZGMJJHplcm8sJHplcm8JCSMgdG9wLW1vc3QgY2FycnkKKwltb3YJJXIxNCwtMSo4KCR0cHRyKQorCWptcAkuTG11bHg0eF9vdXRlcgorCisuYWxpZ24JMzIKKy5MbXVseDR4X291dGVyOgorCW1vdgkkemVybywoJHRwdHIpCQkjIHNhdmUgdG9wLW1vc3QgY2FycnkKKwlsZWEJNCo4KCR0cHRyLCRudW0pLCR0cHRyCSMgcmV3aW5kICR0cHRyCisJbXVseAkwKjgoJGFwdHIpLCRtaSwlcjExCSMgYVswXSpiW2ldCisJeG9yCSR6ZXJvLCR6ZXJvCQkjIGNmPTAsIG9mPTAKKwltb3YJJXJkeCwkYmkKKwltdWx4CTEqOCgkYXB0ciksJXIxNCwlcjEyCSMgYVsxXSpiW2ldCisJYWRveAktNCo4KCR0cHRyKSwkbWkJCSMgK3RbMF0KKwlhZGN4CSVyMTQsJXIxMQorCW11bHgJMio4KCRhcHRyKSwlcjE1LCVyMTMJIyAuLi4KKwlhZG94CS0zKjgoJHRwdHIpLCVyMTEKKwlhZGN4CSVyMTUsJXIxMgorCW11bHgJMyo4KCRhcHRyKSwlcmR4LCVyMTQKKwlhZG94CS0yKjgoJHRwdHIpLCVyMTIKKwlhZGN4CSVyZHgsJXIxMworCWxlYQkoJG5wdHIsJG51bSwyKSwkbnB0cgkjIHJld2luZCAkbnB0cgorCWxlYQk0KjgoJGFwdHIpLCRhcHRyCisJYWRveAktMSo4KCR0cHRyKSwlcjEzCisJYWRjeAkkemVybywlcjE0CisJYWRveAkkemVybywlcjE0CisKKwkuYnl0ZQkweDY3CisJbW92CSRtaSwlcjE1CisJaW11bHEJMzIrOCglcnNwKSwkbWkJCSMgInRbMF0iKm4wCisKKwltb3ZxCWAwKiRTVFJJREUvNC05NmAoJGJwdHIpLCV4bW0wCisJLmJ5dGUJMHg2NywweDY3CisJbW92CSRtaSwlcmR4CisJbW92cQlgMSokU1RSSURFLzQtOTZgKCRicHRyKSwleG1tMQorCS5ieXRlCTB4NjcKKwlwYW5kCSV4bW00LCV4bW0wCisJbW92cQlgMiokU1RSSURFLzQtOTZgKCRicHRyKSwleG1tMgorCS5ieXRlCTB4NjcKKwlwYW5kCSV4bW01LCV4bW0xCisJbW92cQlgMyokU1RSSURFLzQtOTZgKCRicHRyKSwleG1tMworCWFkZAlcJCRTVFJJREUsJGJwdHIJCSMgbmV4dCAmYltpXQorCS5ieXRlCTB4NjcKKwlwYW5kCSV4bW02LCV4bW0yCisJcG9yCSV4bW0xLCV4bW0wCisJcGFuZAkleG1tNywleG1tMworCXhvcgkkemVybywkemVybwkJIyBjZj0wLCBvZj0wCisJbW92CSRicHRyLDgrOCglcnNwKQkJIyBvZmYtbG9hZCAmYltpXQorCisJbXVseAkwKjE2KCRucHRyKSwlcmF4LCVyMTAKKwlhZGN4CSVyYXgsJXIxNQkJIyBkaXNjYXJkZWQKKwlhZG94CSVyMTEsJXIxMAorCW11bHgJMSoxNigkbnB0ciksJXJheCwlcjExCisJYWRjeAklcmF4LCVyMTAKKwlhZG94CSVyMTIsJXIxMQorCW11bHgJMioxNigkbnB0ciksJXJheCwlcjEyCisJYWRjeAklcmF4LCVyMTEKKwlhZG94CSVyMTMsJXIxMgorCW11bHgJMyoxNigkbnB0ciksJXJheCwlcjE1CisJIG1vdgkkYmksJXJkeAorCSBwb3IJJXhtbTIsJXhtbTAKKwltb3YJMjQrOCglcnNwKSwkYnB0cgkjIGNvdW50ZXIgdmFsdWUKKwltb3YJJXIxMCwtOCo0KCR0cHRyKQorCSBwb3IJJXhtbTMsJXhtbTAKKwlhZGN4CSVyYXgsJXIxMgorCW1vdgklcjExLC04KjMoJHRwdHIpCisJYWRveAkkemVybywlcjE1CQkjIG9mPTAKKwltb3YJJXIxMiwtOCoyKCR0cHRyKQorCWxlYQk0KjE2KCRucHRyKSwkbnB0cgorCWptcAkuTG11bHg0eF9pbm5lcgorCisuYWxpZ24JMzIKKy5MbXVseDR4X2lubmVyOgorCW11bHgJMCo4KCRhcHRyKSwlcjEwLCVyYXgJIyBhWzRdKmJbaV0KKwlhZGN4CSR6ZXJvLCVyMTUJCSMgY2Y9MCwgbW9kdWxvLXNjaGVkdWxlZAorCWFkb3gJJXIxNCwlcjEwCisJbXVseAkxKjgoJGFwdHIpLCVyMTEsJXIxNAkjIGFbNV0qYltpXQorCWFkY3gJMCo4KCR0cHRyKSwlcjEwCisJYWRveAklcmF4LCVyMTEKKwltdWx4CTIqOCgkYXB0ciksJXIxMiwlcmF4CSMgLi4uCisJYWRjeAkxKjgoJHRwdHIpLCVyMTEKKwlhZG94CSVyMTQsJXIxMgorCW11bHgJMyo4KCRhcHRyKSwlcjEzLCVyMTQKKwkgbW92CSRtaSwlcmR4CisJYWRjeAkyKjgoJHRwdHIpLCVyMTIKKwlhZG94CSVyYXgsJXIxMworCWFkY3gJMyo4KCR0cHRyKSwlcjEzCisJYWRveAkkemVybywlcjE0CQkjIG9mPTAKKwlsZWEJNCo4KCRhcHRyKSwkYXB0cgorCWxlYQk0KjgoJHRwdHIpLCR0cHRyCisJYWRjeAkkemVybywlcjE0CQkjIGNmPTAKKworCWFkb3gJJXIxNSwlcjEwCisJbXVseAkwKjE2KCRucHRyKSwlcmF4LCVyMTUKKwlhZGN4CSVyYXgsJXIxMAorCWFkb3gJJXIxNSwlcjExCisJbXVseAkxKjE2KCRucHRyKSwlcmF4LCVyMTUKKwlhZGN4CSVyYXgsJXIxMQorCWFkb3gJJXIxNSwlcjEyCisJbXVseAkyKjE2KCRucHRyKSwlcmF4LCVyMTUKKwltb3YJJXIxMCwtNSo4KCR0cHRyKQorCWFkY3gJJXJheCwlcjEyCisJYWRveAklcjE1LCVyMTMKKwltb3YJJXIxMSwtNCo4KCR0cHRyKQorCW11bHgJMyoxNigkbnB0ciksJXJheCwlcjE1CisJIG1vdgkkYmksJXJkeAorCWxlYQk0KjE2KCRucHRyKSwkbnB0cgorCW1vdgklcjEyLC0zKjgoJHRwdHIpCisJYWRjeAklcmF4LCVyMTMKKwlhZG94CSR6ZXJvLCVyMTUKKwltb3YJJXIxMywtMio4KCR0cHRyKQorCisJZGVjCSRicHRyCQkJIyBvZj0wLCBwYXNzIGNmCisJam56CS5MbXVseDR4X2lubmVyCisKKwltb3YJMCs4KCVyc3ApLCRudW0JCSMgbG9hZCAtbnVtCisJbW92cQkleG1tMCwlcmR4CQkjIGJwW2krMV0KKwlhZGMJJHplcm8sJXIxNQkJIyBtb2R1bG8tc2NoZWR1bGVkCisJc3ViCTAqOCgkdHB0ciksJGJwdHIJIyBwdWxsIHRvcC1tb3N0IGNhcnJ5IHRvICVjZgorCW1vdgk4KzgoJXJzcCksJGJwdHIJCSMgcmUtbG9hZCAmYltpXQorCW1vdgkxNis4KCVyc3ApLCVyMTAKKwlhZGMJJXIxNSwlcjE0CisJbGVhCSgkYXB0ciwkbnVtKSwkYXB0cgkjIHJld2luZCAkYXB0cgorCWFkYwkkemVybywkemVybwkJIyB0b3AtbW9zdCBjYXJyeQorCW1vdgklcjE0LC0xKjgoJHRwdHIpCisKKwljbXAJJXIxMCwkYnB0cgorCWpiCS5MbXVseDR4X291dGVyCisKKwltb3YJLTE2KCRucHRyKSwlcjEwCisJeG9yCSVyMTUsJXIxNQorCXN1YgklcjE0LCVyMTAJCSMgY29tcGFyZSB0b3AtbW9zdCB3b3JkcworCWFkYwklcjE1LCVyMTUKKwlvcgklcjE1LCR6ZXJvCisJeG9yCVwkMSwkemVybworCWxlYQkoJHRwdHIsJG51bSksJXJkaQkjIHJld2luZCAkdHB0cgorCWxlYQkoJG5wdHIsJG51bSwyKSwkbnB0cgkjIHJld2luZCAkbnB0cgorCS5ieXRlCTB4NjcsMHg2NworCXNhcglcJDMrMiwkbnVtCQkjIGNmPTAKKwlsZWEJKCRucHRyLCR6ZXJvLDgpLCVyYnAKKwltb3YJNTYrOCglcnNwKSwlcmR4CQkjIHJlc3RvcmUgcnAKKwltb3YJJG51bSwlcmN4CisJam1wCS5Mc3FyeDR4X3N1YgkJIyBjb21tb24gcG9zdC1jb25kaXRpb24KKy5zaXplCW11bHg0eF9pbnRlcm5hbCwuLW11bHg0eF9pbnRlcm5hbAorX19fCit9DHsKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgdm9pZCBibl9wb3dlcjUoCitteSAkcnB0cj0iJXJkaSI7CSMgQk5fVUxPTkcgKnJwdHIsCitteSAkYXB0cj0iJXJzaSI7CSMgY29uc3QgQk5fVUxPTkcgKmFwdHIsCitteSAkYnB0cj0iJXJkeCI7CSMgY29uc3Qgdm9pZCAqdGFibGUsCitteSAkbnB0cj0iJXJjeCI7CSMgY29uc3QgQk5fVUxPTkcgKm5wdHIsCitteSAkbjAgID0iJXI4IjsJCSMgY29uc3QgQk5fVUxPTkcgKm4wKTsKK215ICRudW0gPSIlcjkiOwkJIyBpbnQgbnVtLCBoYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IDgKKwkJCSMgaW50IHB3cik7CisKK215ICgkaSwkaiwkdHB0cik9KCIlcmJwIiwiJXJjeCIsJHJwdHIpOworbXkgQEEwPSgiJXIxMCIsIiVyMTEiKTsKK215IEBBMT0oIiVyMTIiLCIlcjEzIik7CitteSAoJGEwLCRhMSwkYWkpPSgiJXIxNCIsIiVyMTUiLCIlcmJ4Iik7CisKKyRjb2RlLj08PF9fXzsKKy50eXBlCWJuX3Bvd2VyeDUsXEBmdW5jdGlvbiw2CisuYWxpZ24JMzIKK2JuX3Bvd2VyeDU6CisuTHBvd2VyeDVfZW50ZXI6CisJLmJ5dGUJMHg2NworCW1vdgklcnNwLCVyYXgKKwlwdXNoCSVyYngKKwlwdXNoCSVyYnAKKwlwdXNoCSVyMTIKKwlwdXNoCSVyMTMKKwlwdXNoCSVyMTQKKwlwdXNoCSVyMTUKK19fXworJGNvZGUuPTw8X19fIGlmICgkd2luNjQpOworCWxlYQktMHgyOCglcnNwKSwlcnNwCisJbW92YXBzCSV4bW02LCglcnNwKQorCW1vdmFwcwkleG1tNywweDEwKCVyc3ApCitfX18KKyRjb2RlLj08PF9fXzsKKwkuYnl0ZQkweDY3CisJbW92CSR7bnVtfWQsJXIxMGQKKwlzaGwJXCQzLCR7bnVtfWQJCSMgY29udmVydCAkbnVtIHRvIGJ5dGVzCisJc2hsCVwkMysyLCVyMTBkCQkjIDQqJG51bQorCW5lZwkkbnVtCisJbW92CSgkbjApLCRuMAkJIyAqbjAKKworCSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisJIyBlbnN1cmUgdGhhdCBzdGFjayBmcmFtZSBkb2Vzbid0IGFsaWFzIHdpdGggJGFwdHIrNCokbnVtCisJIyBtb2R1bG8gNDA5Niwgd2hpY2ggY292ZXJzIHJldFtudW1dLCBhbVtudW1dIGFuZCBuWzIqbnVtXQorCSMgKHNlZSBibl9leHAuYykuIHRoaXMgaXMgZG9uZSB0byBhbGxvdyBtZW1vcnkgZGlzYW1iaWd1YXRpb24KKwkjIGxvZ2ljIGRvIGl0cyBtYWdpYy4KKwkjCisJbGVhCS02NCglcnNwLCRudW0sMiksJXIxMQorCXN1YgkkYXB0ciwlcjExCisJYW5kCVwkNDA5NSwlcjExCisJY21wCSVyMTEsJXIxMAorCWpiCS5McHdyeF9zcF9hbHQKKwlzdWIJJXIxMSwlcnNwCQkjIGFsaWduIHdpdGggJGFwdHIKKwlsZWEJLTY0KCVyc3AsJG51bSwyKSwlcnNwCSMgYWxsb2NhKGZyYW1lKzIqJG51bSkKKwlqbXAJLkxwd3J4X3NwX2RvbmUKKworLmFsaWduCTMyCisuTHB3cnhfc3BfYWx0OgorCWxlYQk0MDk2LTY0KCwkbnVtLDIpLCVyMTAJIyA0MDk2LWZyYW1lLTIqJG51bQorCWxlYQktNjQoJXJzcCwkbnVtLDIpLCVyc3AJIyBhbGxvY2EoZnJhbWUrMiokbnVtKQorCXN1YgklcjEwLCVyMTEKKwltb3YJXCQwLCVyMTAKKwljbW92YwklcjEwLCVyMTEKKwlzdWIJJXIxMSwlcnNwCisuTHB3cnhfc3BfZG9uZToKKwlhbmQJXCQtNjQsJXJzcAorCW1vdgkkbnVtLCVyMTAJCisJbmVnCSRudW0KKworCSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisJIyBTdGFjayBsYXlvdXQKKwkjCisJIyArMAlzYXZlZCAkbnVtLCB1c2VkIGluIHJlZHVjdGlvbiBzZWN0aW9uCisJIyArOAkmdFsyKiRudW1dLCB1c2VkIGluIHJlZHVjdGlvbiBzZWN0aW9uCisJIyArMTYJaW50ZXJtZWRpYXRlIGNhcnJ5IGJpdAorCSMgKzI0CXRvcC1tb3N0IGNhcnJ5IGJpdCwgdXNlZCBpbiByZWR1Y3Rpb24gc2VjdGlvbgorCSMgKzMyCXNhdmVkICpuMAorCSMgKzQwCXNhdmVkICVyc3AKKwkjICs0OAl0WzIqJG51bV0KKwkjCisJcHhvcgkleG1tMCwleG1tMAorCW1vdnEJJHJwdHIsJXhtbTEJCSMgc2F2ZSAkcnB0cgorCW1vdnEJJG5wdHIsJXhtbTIJCSMgc2F2ZSAkbnB0cgorCW1vdnEJJXIxMCwgJXhtbTMJCSMgLSRudW0KKwltb3ZxCSRicHRyLCV4bW00CisJbW92CSRuMCwgIDMyKCVyc3ApCisJbW92CSVyYXgsIDQwKCVyc3ApCQkjIHNhdmUgb3JpZ2luYWwgJXJzcAorLkxwb3dlcng1X2JvZHk6CisKKwljYWxsCV9fYm5fc3FyeDh4X2ludGVybmFsCisJY2FsbAlfX2JuX3Nxcng4eF9pbnRlcm5hbAorCWNhbGwJX19ibl9zcXJ4OHhfaW50ZXJuYWwKKwljYWxsCV9fYm5fc3FyeDh4X2ludGVybmFsCisJY2FsbAlfX2JuX3Nxcng4eF9pbnRlcm5hbAorCisJbW92CSVyMTAsJG51bQkJIyAtbnVtCisJbW92CSRhcHRyLCRycHRyCisJbW92cQkleG1tMiwkbnB0cgorCW1vdnEJJXhtbTQsJGJwdHIKKwltb3YJNDAoJXJzcCksJXJheAorCisJY2FsbAltdWx4NHhfaW50ZXJuYWwKKworCW1vdgk0MCglcnNwKSwlcnNpCQkjIHJlc3RvcmUgJXJzcAorCW1vdglcJDEsJXJheAorX19fCiskY29kZS49PDxfX18gaWYgKCR3aW42NCk7CisJbW92YXBzCS04OCglcnNpKSwleG1tNgorCW1vdmFwcwktNzIoJXJzaSksJXhtbTcKK19fXworJGNvZGUuPTw8X19fOworCW1vdgktNDgoJXJzaSksJXIxNQorCW1vdgktNDAoJXJzaSksJXIxNAorCW1vdgktMzIoJXJzaSksJXIxMworCW1vdgktMjQoJXJzaSksJXIxMgorCW1vdgktMTYoJXJzaSksJXJicAorCW1vdgktOCglcnNpKSwlcmJ4CisJbGVhCSglcnNpKSwlcnNwCisuTHBvd2VyeDVfZXBpbG9ndWU6CisJcmV0Cisuc2l6ZQlibl9wb3dlcng1LC4tYm5fcG93ZXJ4NQorCisuZ2xvYmwJYm5fc3FyeDh4X2ludGVybmFsCisuaGlkZGVuCWJuX3Nxcng4eF9pbnRlcm5hbAorLnR5cGUJYm5fc3FyeDh4X2ludGVybmFsLFxAYWJpLW9tbmlwb3RlbnQKKy5hbGlnbgkzMgorYm5fc3FyeDh4X2ludGVybmFsOgorX19ibl9zcXJ4OHhfaW50ZXJuYWw6CisJIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisJIyBTcXVhcmluZyBwYXJ0OgorCSMKKwkjIGEpIG11bHRpcGx5LW4tYWRkIGV2ZXJ5dGhpbmcgYnV0IGFbaV0qYVtpXTsKKwkjIGIpIHNoaWZ0IHJlc3VsdCBvZiBhKSBieSAxIHRvIHRoZSBsZWZ0IGFuZCBhY2N1bXVsYXRlCisJIyAgICBhW2ldKmFbaV0gcHJvZHVjdHM7CisJIworCSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCSMgYVs3XWFbN11hWzZdYVs2XWFbNV1hWzVdYVs0XWFbNF1hWzNdYVszXWFbMl1hWzJdYVsxXWFbMV1hWzBdYVswXQorCSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbMV1hWzBdCisJIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzJdYVswXQorCSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzNdYVswXQorCSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzJdYVsxXQorCSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbM11hWzFdCisJIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzNdYVsyXQorCSMKKwkjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzRdYVswXQorCSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVs1XWFbMF0KKwkjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVs2XWFbMF0KKwkjICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzddYVswXQorCSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVs0XWFbMV0KKwkjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVs1XWFbMV0KKwkjICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzZdYVsxXQorCSMgICAgICAgICAgICAgICAgICAgICAgICAgYVs3XWFbMV0KKwkjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVs0XWFbMl0KKwkjICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzVdYVsyXQorCSMgICAgICAgICAgICAgICAgICAgICAgICAgYVs2XWFbMl0KKwkjICAgICAgICAgICAgICAgICAgICAgYVs3XWFbMl0KKwkjICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzRdYVszXQorCSMgICAgICAgICAgICAgICAgICAgICAgICAgYVs1XWFbM10KKwkjICAgICAgICAgICAgICAgICAgICAgYVs2XWFbM10KKwkjICAgICAgICAgICAgICAgICBhWzddYVszXQorCSMKKwkjICAgICAgICAgICAgICAgICAgICAgYVs1XWFbNF0KKwkjICAgICAgICAgICAgICAgICBhWzZdYVs0XQorCSMgICAgICAgICAgICAgYVs3XWFbNF0KKwkjICAgICAgICAgICAgIGFbNl1hWzVdCisJIyAgICAgICAgIGFbN11hWzVdCisJIyAgICAgYVs3XWFbNl0KKwkjIGFbN11hWzddYVs2XWFbNl1hWzVdYVs1XWFbNF1hWzRdYVszXWFbM11hWzJdYVsyXWFbMV1hWzFdYVswXWFbMF0KK19fXworeworbXkgKCR6ZXJvLCRjYXJyeSk9KCIlcmJwIiwiJXJjeCIpOworbXkgJGFhcHRyPSR6ZXJvOworJGNvZGUuPTw8X19fOworCWxlYQk0OCs4KCVyc3ApLCR0cHRyCisJbGVhCSgkYXB0ciwkbnVtKSwkYWFwdHIKKwltb3YJJG51bSwwKzgoJXJzcCkJCQkjIHNhdmUgJG51bQorCW1vdgkkYWFwdHIsOCs4KCVyc3ApCQkjIHNhdmUgZW5kIG9mICRhcHRyCisJam1wCS5Mc3FyOHhfemVyb19zdGFydAorCisuYWxpZ24JMzIKKy5ieXRlCTB4NjYsMHg2NiwweDY2LDB4MmUsMHgwZiwweDFmLDB4ODQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCisuTHNxcng4eF96ZXJvOgorCS5ieXRlCTB4M2UKKwltb3ZkcWEJJXhtbTAsMCo4KCR0cHRyKQorCW1vdmRxYQkleG1tMCwyKjgoJHRwdHIpCisJbW92ZHFhCSV4bW0wLDQqOCgkdHB0cikKKwltb3ZkcWEJJXhtbTAsNio4KCR0cHRyKQorLkxzcXI4eF96ZXJvX3N0YXJ0OgkJCSMgYWxpZ25lZCBhdCAzMgorCW1vdmRxYQkleG1tMCw4KjgoJHRwdHIpCisJbW92ZHFhCSV4bW0wLDEwKjgoJHRwdHIpCisJbW92ZHFhCSV4bW0wLDEyKjgoJHRwdHIpCisJbW92ZHFhCSV4bW0wLDE0KjgoJHRwdHIpCisJbGVhCTE2KjgoJHRwdHIpLCR0cHRyCisJc3ViCVwkNjQsJG51bQorCWpuegkuTHNxcng4eF96ZXJvCisKKwltb3YJMCo4KCRhcHRyKSwlcmR4CQkjIGFbMF0sIG1vZHVsby1zY2hlZHVsZWQKKwkjeG9yCSVyOSwlcjkJCQkjIHRbMV0sIGV4LSRudW0sIHplcm8gYWxyZWFkeQorCXhvcgklcjEwLCVyMTAKKwl4b3IJJXIxMSwlcjExCisJeG9yCSVyMTIsJXIxMgorCXhvcgklcjEzLCVyMTMKKwl4b3IJJXIxNCwlcjE0CisJeG9yCSVyMTUsJXIxNQorCWxlYQk0OCs4KCVyc3ApLCR0cHRyCisJeG9yCSR6ZXJvLCR6ZXJvCQkjIGNmPTAsIGNmPTAKKwlqbXAJLkxzcXJ4OHhfb3V0ZXJfbG9vcAorCisuYWxpZ24JMzIKKy5Mc3FyeDh4X291dGVyX2xvb3A6CisJbXVseAkxKjgoJGFwdHIpLCVyOCwlcmF4CSMgYVsxXSphWzBdCisJYWRjeAklcjksJXI4CQkJIyBhWzFdKmFbMF0rPXRbMV0KKwlhZG94CSVyYXgsJXIxMAorCW11bHgJMio4KCRhcHRyKSwlcjksJXJheAkjIGFbMl0qYVswXQorCWFkY3gJJXIxMCwlcjkKKwlhZG94CSVyYXgsJXIxMQorCS5ieXRlCTB4YzQsMHhlMiwweGFiLDB4ZjYsMHg4NiwweDE4LDB4MDAsMHgwMCwweDAwCSMgbXVseAkzKjgoJGFwdHIpLCVyMTAsJXJheAkjIC4uLgorCWFkY3gJJXIxMSwlcjEwCisJYWRveAklcmF4LCVyMTIKKwkuYnl0ZQkweGM0LDB4ZTIsMHhhMywweGY2LDB4ODYsMHgyMCwweDAwLDB4MDAsMHgwMAkjIG11bHgJNCo4KCRhcHRyKSwlcjExLCVyYXgKKwlhZGN4CSVyMTIsJXIxMQorCWFkb3gJJXJheCwlcjEzCisJbXVseAk1KjgoJGFwdHIpLCVyMTIsJXJheAorCWFkY3gJJXIxMywlcjEyCisJYWRveAklcmF4LCVyMTQKKwltdWx4CTYqOCgkYXB0ciksJXIxMywlcmF4CisJYWRjeAklcjE0LCVyMTMKKwlhZG94CSVyMTUsJXJheAorCW11bHgJNyo4KCRhcHRyKSwlcjE0LCVyMTUKKwkgbW92CTEqOCgkYXB0ciksJXJkeAkJIyBhWzFdCisJYWRjeAklcmF4LCVyMTQKKwlhZG94CSR6ZXJvLCVyMTUKKwlhZGMJOCo4KCR0cHRyKSwlcjE1CisJbW92CSVyOCwxKjgoJHRwdHIpCQkjIHRbMV0KKwltb3YJJXI5LDIqOCgkdHB0cikJCSMgdFsyXQorCXNiYgkkY2FycnksJGNhcnJ5CQkjIG1vdiAlY2YsJGNhcnJ5CisJeG9yCSR6ZXJvLCR6ZXJvCQkjIGNmPTAsIG9mPTAKKworCisJbXVseAkyKjgoJGFwdHIpLCVyOCwlcmJ4CSMgYVsyXSphWzFdCisJbXVseAkzKjgoJGFwdHIpLCVyOSwlcmF4CSMgYVszXSphWzFdCisJYWRjeAklcjEwLCVyOAorCWFkb3gJJXJieCwlcjkKKwltdWx4CTQqOCgkYXB0ciksJXIxMCwlcmJ4CSMgLi4uCisJYWRjeAklcjExLCVyOQorCWFkb3gJJXJheCwlcjEwCisJLmJ5dGUJMHhjNCwweGUyLDB4YTMsMHhmNiwweDg2LDB4MjgsMHgwMCwweDAwLDB4MDAJIyBtdWx4CTUqOCgkYXB0ciksJXIxMSwlcmF4CisJYWRjeAklcjEyLCVyMTAKKwlhZG94CSVyYngsJXIxMQorCS5ieXRlCTB4YzQsMHhlMiwweDliLDB4ZjYsMHg5ZSwweDMwLDB4MDAsMHgwMCwweDAwCSMgbXVseAk2KjgoJGFwdHIpLCVyMTIsJXJieAorCWFkY3gJJXIxMywlcjExCisJYWRveAklcjE0LCVyMTIKKwkuYnl0ZQkweGM0LDB4NjIsMHg5MywweGY2LDB4YjYsMHgzOCwweDAwLDB4MDAsMHgwMAkjIG11bHgJNyo4KCRhcHRyKSwlcjEzLCVyMTQKKwkgbW92CTIqOCgkYXB0ciksJXJkeAkJIyBhWzJdCisJYWRjeAklcmF4LCVyMTIKKwlhZG94CSVyYngsJXIxMworCWFkY3gJJXIxNSwlcjEzCisJYWRveAkkemVybywlcjE0CQkjIG9mPTAKKwlhZGN4CSR6ZXJvLCVyMTQJCSMgY2Y9MAorCisJbW92CSVyOCwzKjgoJHRwdHIpCQkjIHRbM10KKwltb3YJJXI5LDQqOCgkdHB0cikJCSMgdFs0XQorCisJbXVseAkzKjgoJGFwdHIpLCVyOCwlcmJ4CSMgYVszXSphWzJdCisJbXVseAk0KjgoJGFwdHIpLCVyOSwlcmF4CSMgYVs0XSphWzJdCisJYWRjeAklcjEwLCVyOAorCWFkb3gJJXJieCwlcjkKKwltdWx4CTUqOCgkYXB0ciksJXIxMCwlcmJ4CSMgLi4uCisJYWRjeAklcjExLCVyOQorCWFkb3gJJXJheCwlcjEwCisJLmJ5dGUJMHhjNCwweGUyLDB4YTMsMHhmNiwweDg2LDB4MzAsMHgwMCwweDAwLDB4MDAJIyBtdWx4CTYqOCgkYXB0ciksJXIxMSwlcmF4CisJYWRjeAklcjEyLCVyMTAKKwlhZG94CSVyMTMsJXIxMQorCS5ieXRlCTB4YzQsMHg2MiwweDliLDB4ZjYsMHhhZSwweDM4LDB4MDAsMHgwMCwweDAwCSMgbXVseAk3KjgoJGFwdHIpLCVyMTIsJXIxMworCS5ieXRlCTB4M2UKKwkgbW92CTMqOCgkYXB0ciksJXJkeAkJIyBhWzNdCisJYWRjeAklcmJ4LCVyMTEKKwlhZG94CSVyYXgsJXIxMgorCWFkY3gJJXIxNCwlcjEyCisJbW92CSVyOCw1KjgoJHRwdHIpCQkjIHRbNV0KKwltb3YJJXI5LDYqOCgkdHB0cikJCSMgdFs2XQorCSBtdWx4CTQqOCgkYXB0ciksJXI4LCVyYXgJIyBhWzRdKmFbM10KKwlhZG94CSR6ZXJvLCVyMTMJCSMgb2Y9MAorCWFkY3gJJHplcm8sJXIxMwkJIyBjZj0wCisKKwltdWx4CTUqOCgkYXB0ciksJXI5LCVyYngJIyBhWzVdKmFbM10KKwlhZGN4CSVyMTAsJXI4CisJYWRveAklcmF4LCVyOQorCW11bHgJNio4KCRhcHRyKSwlcjEwLCVyYXgJIyAuLi4KKwlhZGN4CSVyMTEsJXI5CisJYWRveAklcjEyLCVyMTAKKwltdWx4CTcqOCgkYXB0ciksJXIxMSwlcjEyCisJIG1vdgk0KjgoJGFwdHIpLCVyZHgJCSMgYVs0XQorCSBtb3YJNSo4KCRhcHRyKSwlcjE0CQkjIGFbNV0KKwlhZGN4CSVyYngsJXIxMAorCWFkb3gJJXJheCwlcjExCisJIG1vdgk2KjgoJGFwdHIpLCVyMTUJCSMgYVs2XQorCWFkY3gJJXIxMywlcjExCisJYWRveAkkemVybywlcjEyCQkjIG9mPTAKKwlhZGN4CSR6ZXJvLCVyMTIJCSMgY2Y9MAorCisJbW92CSVyOCw3KjgoJHRwdHIpCQkjIHRbN10KKwltb3YJJXI5LDgqOCgkdHB0cikJCSMgdFs4XQorCisJbXVseAklcjE0LCVyOSwlcmF4CQkjIGFbNV0qYVs0XQorCSBtb3YJNyo4KCRhcHRyKSwlcjgJCSMgYVs3XQorCWFkY3gJJXIxMCwlcjkKKwltdWx4CSVyMTUsJXIxMCwlcmJ4CQkjIGFbNl0qYVs0XQorCWFkb3gJJXJheCwlcjEwCisJYWRjeAklcjExLCVyMTAKKwltdWx4CSVyOCwlcjExLCVyYXgJCSMgYVs3XSphWzRdCisJIG1vdgklcjE0LCVyZHgJCSMgYVs1XQorCWFkb3gJJXJieCwlcjExCisJYWRjeAklcjEyLCVyMTEKKwkjYWRveAkkemVybywlcmF4CQkjIG9mPTAKKwlhZGN4CSR6ZXJvLCVyYXgJCSMgY2Y9MAorCisJbXVseAklcjE1LCVyMTQsJXJieAkJIyBhWzZdKmFbNV0KKwltdWx4CSVyOCwlcjEyLCVyMTMJCSMgYVs3XSphWzVdCisJIG1vdgklcjE1LCVyZHgJCSMgYVs2XQorCSBsZWEJOCo4KCRhcHRyKSwkYXB0cgorCWFkY3gJJXIxNCwlcjExCisJYWRveAklcmJ4LCVyMTIKKwlhZGN4CSVyYXgsJXIxMgorCWFkb3gJJHplcm8sJXIxMworCisJLmJ5dGUJMHg2NywweDY3CisJbXVseAklcjgsJXI4LCVyMTQJCSMgYVs3XSphWzZdCisJYWRjeAklcjgsJXIxMworCWFkY3gJJHplcm8sJXIxNAorCisJY21wCTgrOCglcnNwKSwkYXB0cgorCWplCS5Mc3FyeDh4X291dGVyX2JyZWFrCisKKwluZWcJJGNhcnJ5CQkJIyBtb3YgJGNhcnJ5LCVjZgorCW1vdglcJC04LCVyY3gKKwltb3YJJHplcm8sJXIxNQorCW1vdgk4KjgoJHRwdHIpLCVyOAorCWFkY3gJOSo4KCR0cHRyKSwlcjkJCSMgKz10WzldCisJYWRjeAkxMCo4KCR0cHRyKSwlcjEwCSMgLi4uCisJYWRjeAkxMSo4KCR0cHRyKSwlcjExCisJYWRjCTEyKjgoJHRwdHIpLCVyMTIKKwlhZGMJMTMqOCgkdHB0ciksJXIxMworCWFkYwkxNCo4KCR0cHRyKSwlcjE0CisJYWRjCTE1KjgoJHRwdHIpLCVyMTUKKwlsZWEJKCRhcHRyKSwkYWFwdHIKKwlsZWEJMio2NCgkdHB0ciksJHRwdHIKKwlzYmIJJXJheCwlcmF4CQkjIG1vdiAlY2YsJGNhcnJ5CisKKwltb3YJLTY0KCRhcHRyKSwlcmR4CQkjIGFbMF0KKwltb3YJJXJheCwxNis4KCVyc3ApCQkjIG9mZmxvYWQgJGNhcnJ5CisJbW92CSR0cHRyLDI0KzgoJXJzcCkKKworCSNsZWEJOCo4KCR0cHRyKSwkdHB0cgkjIHNlZSAyKjgqOCgkdHB0cikgYWJvdmUKKwl4b3IJJWVheCwlZWF4CQkjIGNmPTAsIG9mPTAKKwlqbXAJLkxzcXJ4OHhfbG9vcAorCisuYWxpZ24JMzIKKy5Mc3FyeDh4X2xvb3A6CisJbW92CSVyOCwlcmJ4CisJbXVseAkwKjgoJGFhcHRyKSwlcmF4LCVyOAkjIGFbOF0qYVtpXQorCWFkY3gJJXJheCwlcmJ4CQkjICs9dFs4XQorCWFkb3gJJXI5LCVyOAorCisJbXVseAkxKjgoJGFhcHRyKSwlcmF4LCVyOQkjIC4uLgorCWFkY3gJJXJheCwlcjgKKwlhZG94CSVyMTAsJXI5CisKKwltdWx4CTIqOCgkYWFwdHIpLCVyYXgsJXIxMAorCWFkY3gJJXJheCwlcjkKKwlhZG94CSVyMTEsJXIxMAorCisJbXVseAkzKjgoJGFhcHRyKSwlcmF4LCVyMTEKKwlhZGN4CSVyYXgsJXIxMAorCWFkb3gJJXIxMiwlcjExCisKKwkuYnl0ZQkweGM0LDB4NjIsMHhmYiwweGY2LDB4YTUsMHgyMCwweDAwLDB4MDAsMHgwMAkjIG11bHgJNCo4KCRhYXB0ciksJXJheCwlcjEyCisJYWRjeAklcmF4LCVyMTEKKwlhZG94CSVyMTMsJXIxMgorCisJbXVseAk1KjgoJGFhcHRyKSwlcmF4LCVyMTMKKwlhZGN4CSVyYXgsJXIxMgorCWFkb3gJJXIxNCwlcjEzCisKKwltdWx4CTYqOCgkYWFwdHIpLCVyYXgsJXIxNAorCSBtb3YJJXJieCwoJHRwdHIsJXJjeCw4KQkjIHN0b3JlIHRbOCtpXQorCSBtb3YJXCQwLCVlYngKKwlhZGN4CSVyYXgsJXIxMworCWFkb3gJJXIxNSwlcjE0CisKKwkuYnl0ZQkweGM0LDB4NjIsMHhmYiwweGY2LDB4YmQsMHgzOCwweDAwLDB4MDAsMHgwMAkjIG11bHgJNyo4KCRhYXB0ciksJXJheCwlcjE1CisJIG1vdgk4KCRhcHRyLCVyY3gsOCksJXJkeAkjIGFbaV0KKwlhZGN4CSVyYXgsJXIxNAorCWFkb3gJJXJieCwlcjE1CQkjICVyYnggaXMgMCwgb2Y9MAorCWFkY3gJJXJieCwlcjE1CQkjIGNmPTAKKworCS5ieXRlCTB4NjcKKwlpbmMJJXJjeAkJCSMgb2Y9MAorCWpuegkuTHNxcng4eF9sb29wCisKKwlsZWEJOCo4KCRhYXB0ciksJGFhcHRyCisJbW92CVwkLTgsJXJjeAorCWNtcAk4KzgoJXJzcCksJGFhcHRyCSMgZG9uZT8KKwlqZQkuTHNxcng4eF9icmVhaworCisJc3ViCTE2KzgoJXJzcCksJXJieAkJIyBtb3YgMTYoJXJzcCksJWNmCisJLmJ5dGUJMHg2NgorCW1vdgktNjQoJGFwdHIpLCVyZHgKKwlhZGN4CTAqOCgkdHB0ciksJXI4CisJYWRjeAkxKjgoJHRwdHIpLCVyOQorCWFkYwkyKjgoJHRwdHIpLCVyMTAKKwlhZGMJMyo4KCR0cHRyKSwlcjExCisJYWRjCTQqOCgkdHB0ciksJXIxMgorCWFkYwk1KjgoJHRwdHIpLCVyMTMKKwlhZGMJNio4KCR0cHRyKSwlcjE0CisJYWRjCTcqOCgkdHB0ciksJXIxNQorCWxlYQk4KjgoJHRwdHIpLCR0cHRyCisJLmJ5dGUJMHg2NworCXNiYgklcmF4LCVyYXgJCSMgbW92ICVjZiwlcmF4CisJeG9yCSVlYngsJWVieAkJIyBjZj0wLCBvZj0wCisJbW92CSVyYXgsMTYrOCglcnNwKQkJIyBvZmZsb2FkIGNhcnJ5CisJam1wCS5Mc3FyeDh4X2xvb3AKKworLmFsaWduCTMyCisuTHNxcng4eF9icmVhazoKKwlzdWIJMTYrOCglcnNwKSwlcjgJCSMgY29uc3VtZSBsYXN0IGNhcnJ5CisJbW92CTI0KzgoJXJzcCksJGNhcnJ5CSMgaW5pdGlhbCAkdHB0ciwgYm9ycm93ICRjYXJyeQorCW1vdgkwKjgoJGFwdHIpLCVyZHgJCSMgYVs4XSwgbW9kdWxvLXNjaGVkdWxlZAorCXhvcgklZWJwLCVlYnAJCSMgeG9yCSR6ZXJvLCR6ZXJvCisJbW92CSVyOCwwKjgoJHRwdHIpCisJY21wCSRjYXJyeSwkdHB0cgkJIyBjZj0wLCBvZj0wCisJamUJLkxzcXJ4OHhfb3V0ZXJfbG9vcAorCisJbW92CSVyOSwxKjgoJHRwdHIpCisJIG1vdgkxKjgoJGNhcnJ5KSwlcjkKKwltb3YJJXIxMCwyKjgoJHRwdHIpCisJIG1vdgkyKjgoJGNhcnJ5KSwlcjEwCisJbW92CSVyMTEsMyo4KCR0cHRyKQorCSBtb3YJMyo4KCRjYXJyeSksJXIxMQorCW1vdgklcjEyLDQqOCgkdHB0cikKKwkgbW92CTQqOCgkY2FycnkpLCVyMTIKKwltb3YJJXIxMyw1KjgoJHRwdHIpCisJIG1vdgk1KjgoJGNhcnJ5KSwlcjEzCisJbW92CSVyMTQsNio4KCR0cHRyKQorCSBtb3YJNio4KCRjYXJyeSksJXIxNAorCW1vdgklcjE1LDcqOCgkdHB0cikKKwkgbW92CTcqOCgkY2FycnkpLCVyMTUKKwltb3YJJGNhcnJ5LCR0cHRyCisJam1wCS5Mc3FyeDh4X291dGVyX2xvb3AKKworLmFsaWduCTMyCisuTHNxcng4eF9vdXRlcl9icmVhazoKKwltb3YJJXI5LDkqOCgkdHB0cikJCSMgdFs5XQorCSBtb3ZxCSV4bW0zLCVyY3gJCSMgLSRudW0KKwltb3YJJXIxMCwxMCo4KCR0cHRyKQkjIC4uLgorCW1vdgklcjExLDExKjgoJHRwdHIpCisJbW92CSVyMTIsMTIqOCgkdHB0cikKKwltb3YJJXIxMywxMyo4KCR0cHRyKQorCW1vdgklcjE0LDE0KjgoJHRwdHIpCitfX18KK30MeworbXkgJGk9IiVyY3giOworJGNvZGUuPTw8X19fOworCWxlYQk0OCs4KCVyc3ApLCR0cHRyCisJbW92CSgkYXB0ciwkaSksJXJkeAkJIyBhWzBdCisKKwltb3YJOCgkdHB0ciksJEEwWzFdCQkjIHRbMV0KKwl4b3IJJEEwWzBdLCRBMFswXQkJIyB0WzBdLCBvZj0wLCBjZj0wCisJbW92CTArOCglcnNwKSwkbnVtCQkjIHJlc3RvcmUgJG51bQorCWFkb3gJJEEwWzFdLCRBMFsxXQorCSBtb3YJMTYoJHRwdHIpLCRBMVswXQkjIHRbMl0JIyBwcmVmZXRjaAorCSBtb3YJMjQoJHRwdHIpLCRBMVsxXQkjIHRbM10JIyBwcmVmZXRjaAorCSNqbXAJLkxzcXJ4NHhfc2hpZnRfbl9hZGQJIyBoYXBwZW5zIHRvIGJlIGFsaWduZWQKKworLmFsaWduCTMyCisuTHNxcng0eF9zaGlmdF9uX2FkZDoKKwltdWx4CSVyZHgsJXJheCwlcmJ4CisJIGFkb3gJJEExWzBdLCRBMVswXQorCWFkY3gJJEEwWzBdLCVyYXgKKwkgLmJ5dGUJMHg0OCwweDhiLDB4OTQsMHgwZSwweDA4LDB4MDAsMHgwMCwweDAwCSMgbW92CTgoJGFwdHIsJGkpLCVyZHgJIyBhW2krMV0JIyBwcmVmZXRjaAorCSAuYnl0ZQkweDRjLDB4OGIsMHg5NywweDIwLDB4MDAsMHgwMCwweDAwCSMgbW92CTMyKCR0cHRyKSwkQTBbMF0JIyB0WzIqaSs0XQkjIHByZWZldGNoCisJIGFkb3gJJEExWzFdLCRBMVsxXQorCWFkY3gJJEEwWzFdLCVyYngKKwkgbW92CTQwKCR0cHRyKSwkQTBbMV0JCSMgdFsyKmkrNCsxXQkjIHByZWZldGNoCisJbW92CSVyYXgsMCgkdHB0cikKKwltb3YJJXJieCw4KCR0cHRyKQorCisJbXVseAklcmR4LCVyYXgsJXJieAorCSBhZG94CSRBMFswXSwkQTBbMF0KKwlhZGN4CSRBMVswXSwlcmF4CisJIG1vdgkxNigkYXB0ciwkaSksJXJkeAkjIGFbaSsyXQkjIHByZWZldGNoCisJIG1vdgk0OCgkdHB0ciksJEExWzBdCSMgdFsyKmkrNl0JIyBwcmVmZXRjaAorCSBhZG94CSRBMFsxXSwkQTBbMV0KKwlhZGN4CSRBMVsxXSwlcmJ4CisJIG1vdgk1NigkdHB0ciksJEExWzFdCSMgdFsyKmkrNisxXQkjIHByZWZldGNoCisJbW92CSVyYXgsMTYoJHRwdHIpCisJbW92CSVyYngsMjQoJHRwdHIpCisKKwltdWx4CSVyZHgsJXJheCwlcmJ4CisJIGFkb3gJJEExWzBdLCRBMVswXQorCWFkY3gJJEEwWzBdLCVyYXgKKwkgbW92CTI0KCRhcHRyLCRpKSwlcmR4CSMgYVtpKzNdCSMgcHJlZmV0Y2gKKwkgbGVhCTMyKCRpKSwkaQorCSBtb3YJNjQoJHRwdHIpLCRBMFswXQkjIHRbMippKzhdCSMgcHJlZmV0Y2gKKwkgYWRveAkkQTFbMV0sJEExWzFdCisJYWRjeAkkQTBbMV0sJXJieAorCSBtb3YJNzIoJHRwdHIpLCRBMFsxXQkjIHRbMippKzgrMV0JIyBwcmVmZXRjaAorCW1vdgklcmF4LDMyKCR0cHRyKQorCW1vdgklcmJ4LDQwKCR0cHRyKQorCisJbXVseAklcmR4LCVyYXgsJXJieAorCSBhZG94CSRBMFswXSwkQTBbMF0KKwlhZGN4CSRBMVswXSwlcmF4CisJanJjeHoJLkxzcXJ4NHhfc2hpZnRfbl9hZGRfYnJlYWsKKwkgLmJ5dGUJMHg0OCwweDhiLDB4OTQsMHgwZSwweDAwLDB4MDAsMHgwMCwweDAwCSMgbW92CTAoJGFwdHIsJGkpLCVyZHgJIyBhW2krNF0JIyBwcmVmZXRjaAorCSBhZG94CSRBMFsxXSwkQTBbMV0KKwlhZGN4CSRBMVsxXSwlcmJ4CisJIG1vdgk4MCgkdHB0ciksJEExWzBdCSMgdFsyKmkrMTBdCSMgcHJlZmV0Y2gKKwkgbW92CTg4KCR0cHRyKSwkQTFbMV0JIyB0WzIqaSsxMCsxXQkjIHByZWZldGNoCisJbW92CSVyYXgsNDgoJHRwdHIpCisJbW92CSVyYngsNTYoJHRwdHIpCisJbGVhCTY0KCR0cHRyKSwkdHB0cgorCW5vcAorCWptcAkuTHNxcng0eF9zaGlmdF9uX2FkZAorCisuYWxpZ24JMzIKKy5Mc3FyeDR4X3NoaWZ0X25fYWRkX2JyZWFrOgorCWFkY3gJJEExWzFdLCVyYngKKwltb3YJJXJheCw0OCgkdHB0cikKKwltb3YJJXJieCw1NigkdHB0cikKKwlsZWEJNjQoJHRwdHIpLCR0cHRyCQkjIGVuZCBvZiB0W10gYnVmZmVyCitfX18KK30MCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE1vbnRnb21lcnkgcmVkdWN0aW9uIHBhcnQsICJ3b3JkLWJ5LXdvcmQiIGFsZ29yaXRobS4KKyMKKyMgVGhpcyBuZXcgcGF0aCBpcyBpbnNwaXJlZCBieSBtdWx0aXBsZSBzdWJtaXNzaW9ucyBmcm9tIEludGVsLCBieQorIyBTaGF5IEd1ZXJvbiwgVmxhZCBLcmFzbm92LCBFcmRpbmMgT3p0dXJrLCBKYW1lcyBHdWlsZm9yZCwKKyMgVmlub2RoIEdvcGFsLi4uCit7CitteSAoJG5wdHIsJGNhcnJ5LCRtMCk9KCIlcmJwIiwiJXJzaSIsIiVyZHgiKTsKKworJGNvZGUuPTw8X19fOworCW1vdnEJJXhtbTIsJG5wdHIKK3Nxcng4eF9yZWR1Y3Rpb246CisJeG9yCSVlYXgsJWVheAkJIyBpbml0aWFsIHRvcC1tb3N0IGNhcnJ5IGJpdAorCW1vdgkzMis4KCVyc3ApLCVyYngJCSMgbjAKKwltb3YJNDgrOCglcnNwKSwlcmR4CQkjICIlcjgiLCA4KjAoJHRwdHIpCisJbGVhCS0xMjgoJG5wdHIsJG51bSwyKSwlcmN4CSMgZW5kIG9mIG5bXQorCSNsZWEJNDgrOCglcnNwLCRudW0sMiksJHRwdHIJIyBlbmQgb2YgdFtdIGJ1ZmZlcgorCW1vdgklcmN4LCAwKzgoJXJzcCkJCSMgc2F2ZSBlbmQgb2YgbltdCisJbW92CSR0cHRyLDgrOCglcnNwKQkJIyBzYXZlIGVuZCBvZiB0W10KKworCWxlYQk0OCs4KCVyc3ApLCR0cHRyCQkjIGluaXRpYWwgdFtdIHdpbmRvdworCWptcAkuTHNxcng4eF9yZWR1Y3Rpb25fbG9vcAorCisuYWxpZ24JMzIKKy5Mc3FyeDh4X3JlZHVjdGlvbl9sb29wOgorCW1vdgk4KjEoJHRwdHIpLCVyOQorCW1vdgk4KjIoJHRwdHIpLCVyMTAKKwltb3YJOCozKCR0cHRyKSwlcjExCisJbW92CTgqNCgkdHB0ciksJXIxMgorCW1vdgklcmR4LCVyOAorCWltdWxxCSVyYngsJXJkeAkJIyBuMCphW2ldCisJbW92CTgqNSgkdHB0ciksJXIxMworCW1vdgk4KjYoJHRwdHIpLCVyMTQKKwltb3YJOCo3KCR0cHRyKSwlcjE1CisJbW92CSVyYXgsMjQrOCglcnNwKQkJIyBzdG9yZSB0b3AtbW9zdCBjYXJyeSBiaXQKKworCWxlYQk4KjgoJHRwdHIpLCR0cHRyCisJeG9yCSRjYXJyeSwkY2FycnkJCSMgY2Y9MCxvZj0wCisJbW92CVwkLTgsJXJjeAorCWptcAkuTHNxcng4eF9yZWR1Y2UKKworLmFsaWduCTMyCisuTHNxcng4eF9yZWR1Y2U6CisJbW92CSVyOCwgJXJieAorCW11bHgJMTYqMCgkbnB0ciksJXJheCwlcjgJIyBuWzBdCisJYWRjeAklcmJ4LCVyYXgJCSMgZGlzY2FyZGVkCisJYWRveAklcjksJXI4CisKKwltdWx4CTE2KjEoJG5wdHIpLCVyYngsJXI5CSMgblsxXQorCWFkY3gJJXJieCwlcjgKKwlhZG94CSVyMTAsJXI5CisKKwltdWx4CTE2KjIoJG5wdHIpLCVyYngsJXIxMAorCWFkY3gJJXJieCwlcjkKKwlhZG94CSVyMTEsJXIxMAorCisJbXVseAkxNiozKCRucHRyKSwlcmJ4LCVyMTEKKwlhZGN4CSVyYngsJXIxMAorCWFkb3gJJXIxMiwlcjExCisKKwkuYnl0ZQkweGM0LDB4NjIsMHhlMywweGY2LDB4YTUsMHg0MCwweDAwLDB4MDAsMHgwMAkjIG11bHgJMTYqNCgkbnB0ciksJXJieCwlcjEyCisJIG1vdgklcmR4LCVyYXgKKwkgbW92CSVyOCwlcmR4CisJYWRjeAklcmJ4LCVyMTEKKwlhZG94CSVyMTMsJXIxMgorCisJIG11bHgJMzIrOCglcnNwKSwlcmJ4LCVyZHgJIyAlcmR4IGRpc2NhcmRlZAorCSBtb3YJJXJheCwlcmR4CisJIG1vdgklcmF4LDY0KzQ4KzgoJXJzcCwlcmN4LDgpCSMgcHV0IGFzaWRlIG4wKmFbaV0KKworCW11bHgJMTYqNSgkbnB0ciksJXJheCwlcjEzCisJYWRjeAklcmF4LCVyMTIKKwlhZG94CSVyMTQsJXIxMworCisJbXVseAkxNio2KCRucHRyKSwlcmF4LCVyMTQKKwlhZGN4CSVyYXgsJXIxMworCWFkb3gJJXIxNSwlcjE0CisKKwltdWx4CTE2KjcoJG5wdHIpLCVyYXgsJXIxNQorCSBtb3YJJXJieCwlcmR4CisJYWRjeAklcmF4LCVyMTQKKwlhZG94CSRjYXJyeSwlcjE1CQkjICRjYXJyeSBpcyAwCisJYWRjeAkkY2FycnksJXIxNQkJIyBjZj0wCisKKwkuYnl0ZQkweDY3LDB4NjcsMHg2NworCWluYwklcmN4CQkJIyBvZj0wCisJam56CS5Mc3FyeDh4X3JlZHVjZQorCisJbW92CSRjYXJyeSwlcmF4CQkjIHhvcgklcmF4LCVyYXgKKwljbXAJMCs4KCVyc3ApLCRucHRyCQkjIGVuZCBvZiBuW10/CisJamFlCS5Mc3FyeDh4X25vX3RhaWwKKworCW1vdgk0OCs4KCVyc3ApLCVyZHgJCSMgcHVsbCBuMCphWzBdCisJYWRkCTgqMCgkdHB0ciksJXI4CisJbGVhCTE2KjgoJG5wdHIpLCRucHRyCisJbW92CVwkLTgsJXJjeAorCWFkY3gJOCoxKCR0cHRyKSwlcjkKKwlhZGN4CTgqMigkdHB0ciksJXIxMAorCWFkYwk4KjMoJHRwdHIpLCVyMTEKKwlhZGMJOCo0KCR0cHRyKSwlcjEyCisJYWRjCTgqNSgkdHB0ciksJXIxMworCWFkYwk4KjYoJHRwdHIpLCVyMTQKKwlhZGMJOCo3KCR0cHRyKSwlcjE1CisJbGVhCTgqOCgkdHB0ciksJHRwdHIKKwlzYmIJJXJheCwlcmF4CQkjIHRvcCBjYXJyeQorCisJeG9yCSRjYXJyeSwkY2FycnkJCSMgb2Y9MCwgY2Y9MAorCW1vdgklcmF4LDE2KzgoJXJzcCkKKwlqbXAJLkxzcXJ4OHhfdGFpbAorCisuYWxpZ24JMzIKKy5Mc3FyeDh4X3RhaWw6CisJbW92CSVyOCwlcmJ4CisJbXVseAkxNiowKCRucHRyKSwlcmF4LCVyOAorCWFkY3gJJXJheCwlcmJ4CisJYWRveAklcjksJXI4CisKKwltdWx4CTE2KjEoJG5wdHIpLCVyYXgsJXI5CisJYWRjeAklcmF4LCVyOAorCWFkb3gJJXIxMCwlcjkKKworCW11bHgJMTYqMigkbnB0ciksJXJheCwlcjEwCisJYWRjeAklcmF4LCVyOQorCWFkb3gJJXIxMSwlcjEwCisKKwltdWx4CTE2KjMoJG5wdHIpLCVyYXgsJXIxMQorCWFkY3gJJXJheCwlcjEwCisJYWRveAklcjEyLCVyMTEKKworCS5ieXRlCTB4YzQsMHg2MiwweGZiLDB4ZjYsMHhhNSwweDQwLDB4MDAsMHgwMCwweDAwCSMgbXVseAkxNio0KCRucHRyKSwlcmF4LCVyMTIKKwlhZGN4CSVyYXgsJXIxMQorCWFkb3gJJXIxMywlcjEyCisKKwltdWx4CTE2KjUoJG5wdHIpLCVyYXgsJXIxMworCWFkY3gJJXJheCwlcjEyCisJYWRveAklcjE0LCVyMTMKKworCW11bHgJMTYqNigkbnB0ciksJXJheCwlcjE0CisJYWRjeAklcmF4LCVyMTMKKwlhZG94CSVyMTUsJXIxNAorCisJbXVseAkxNio3KCRucHRyKSwlcmF4LCVyMTUKKwkgbW92CTcyKzQ4KzgoJXJzcCwlcmN4LDgpLCVyZHgJIyBwdWxsIG4wKmFbaV0KKwlhZGN4CSVyYXgsJXIxNAorCWFkb3gJJGNhcnJ5LCVyMTUKKwkgbW92CSVyYngsKCR0cHRyLCVyY3gsOCkJIyBzYXZlIHJlc3VsdAorCSBtb3YJJXI4LCVyYngKKwlhZGN4CSRjYXJyeSwlcjE1CQkjIGNmPTAKKworCWluYwklcmN4CQkJIyBvZj0wCisJam56CS5Mc3FyeDh4X3RhaWwKKworCWNtcAkwKzgoJXJzcCksJG5wdHIJCSMgZW5kIG9mIG5bXT8KKwlqYWUJLkxzcXJ4OHhfdGFpbF9kb25lCSMgYnJlYWsgb3V0IG9mIGxvb3AKKworCXN1YgkxNis4KCVyc3ApLCRjYXJyeQkjIG1vdiAxNiglcnNwKSwlY2YKKwkgbW92CTQ4KzgoJXJzcCksJXJkeAkJIyBwdWxsIG4wKmFbMF0KKwkgbGVhCTE2KjgoJG5wdHIpLCRucHRyCisJYWRjCTgqMCgkdHB0ciksJXI4CisJYWRjCTgqMSgkdHB0ciksJXI5CisJYWRjCTgqMigkdHB0ciksJXIxMAorCWFkYwk4KjMoJHRwdHIpLCVyMTEKKwlhZGMJOCo0KCR0cHRyKSwlcjEyCisJYWRjCTgqNSgkdHB0ciksJXIxMworCWFkYwk4KjYoJHRwdHIpLCVyMTQKKwlhZGMJOCo3KCR0cHRyKSwlcjE1CisJbGVhCTgqOCgkdHB0ciksJHRwdHIKKwlzYmIJJXJheCwlcmF4CisJc3ViCVwkOCwlcmN4CQkjIG1vdglcJC04LCVyY3gKKworCXhvcgkkY2FycnksJGNhcnJ5CQkjIG9mPTAsIGNmPTAKKwltb3YJJXJheCwxNis4KCVyc3ApCisJam1wCS5Mc3FyeDh4X3RhaWwKKworLmFsaWduCTMyCisuTHNxcng4eF90YWlsX2RvbmU6CisJYWRkCTI0KzgoJXJzcCksJXI4CQkjIGNhbiB0aGlzIG92ZXJmbG93PworCW1vdgkkY2FycnksJXJheAkJIyB4b3IJJXJheCwlcmF4CisKKwlzdWIJMTYrOCglcnNwKSwkY2FycnkJIyBtb3YgMTYoJXJzcCksJWNmCisuTHNxcng4eF9ub190YWlsOgkJCSMgJWNmIGlzIDAgaWYganVtcGVkIGhlcmUKKwlhZGMJOCowKCR0cHRyKSwlcjgKKwkgbW92cQkleG1tMywlcmN4CisJYWRjCTgqMSgkdHB0ciksJXI5CisJIG1vdgkxNio3KCRucHRyKSwkY2FycnkKKwkgbW92cQkleG1tMiwkbnB0cgkJIyByZXN0b3JlICRucHRyCisJYWRjCTgqMigkdHB0ciksJXIxMAorCWFkYwk4KjMoJHRwdHIpLCVyMTEKKwlhZGMJOCo0KCR0cHRyKSwlcjEyCisJYWRjCTgqNSgkdHB0ciksJXIxMworCWFkYwk4KjYoJHRwdHIpLCVyMTQKKwlhZGMJOCo3KCR0cHRyKSwlcjE1CisJYWRjCSVyYXgsJXJheAkJIyB0b3AtbW9zdCBjYXJyeQorCisJbW92CTMyKzgoJXJzcCksJXJieAkJIyBuMAorCW1vdgk4KjgoJHRwdHIsJXJjeCksJXJkeAkjIG1vZHVsby1zY2hlZHVsZWQgIiVyOCIKKworCW1vdgklcjgsOCowKCR0cHRyKQkJIyBzdG9yZSB0b3AgNTEyIGJpdHMKKwkgbGVhCTgqOCgkdHB0ciksJXI4CQkjIGJvcnJvdyAlcjgKKwltb3YJJXI5LDgqMSgkdHB0cikKKwltb3YJJXIxMCw4KjIoJHRwdHIpCisJbW92CSVyMTEsOCozKCR0cHRyKQorCW1vdgklcjEyLDgqNCgkdHB0cikKKwltb3YJJXIxMyw4KjUoJHRwdHIpCisJbW92CSVyMTQsOCo2KCR0cHRyKQorCW1vdgklcjE1LDgqNygkdHB0cikKKworCWxlYQk4KjgoJHRwdHIsJXJjeCksJHRwdHIJIyBzdGFydCBvZiBjdXJyZW50IHRbXSB3aW5kb3cKKwljbXAJOCs4KCVyc3ApLCVyOAkJIyBlbmQgb2YgdFtdPworCWpiCS5Mc3FyeDh4X3JlZHVjdGlvbl9sb29wCitfX18KK30MCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBQb3N0LWNvbmRpdGlvbiwgNHggdW5yb2xsZWQKKyMKK3sKK215ICgkcnB0ciwkbnB0cik9KCIlcmR4IiwiJXJicCIpOworbXkgQHJpPW1hcCgiJXIkXyIsKDEwLi4xMykpOworbXkgQG5pPW1hcCgiJXIkXyIsKDE0Li4xNSkpOworJGNvZGUuPTw8X19fOworCXhvcgklcmJ4LCVyYngKKwlzdWIJJXIxNSwlcnNpCQkjIGNvbXBhcmUgdG9wLW1vc3Qgd29yZHMKKwlhZGMJJXJieCwlcmJ4CisJbW92CSVyY3gsJXIxMAkJIyAtJG51bQorCS5ieXRlCTB4NjcKKwlvcgklcmJ4LCVyYXgKKwkuYnl0ZQkweDY3CisJbW92CSVyY3gsJXI5CQkjIC0kbnVtCisJeG9yCVwkMSwlcmF4CisJc2FyCVwkMysyLCVyY3gJCSMgY2Y9MAorCSNsZWEJNDgrOCglcnNwLCVyOSksJHRwdHIKKwlsZWEJKCRucHRyLCVyYXgsOCksJG5wdHIKKwltb3ZxCSV4bW0xLCRycHRyCQkjIHJlc3RvcmUgJHJwdHIKKwltb3ZxCSV4bW0xLCRhcHRyCQkjIHByZXBhcmUgZm9yIGJhY2stdG8tYmFjayBjYWxsCisJam1wCS5Mc3FyeDR4X3N1YgorCisuYWxpZ24JMzIKKy5Mc3FyeDR4X3N1YjoKKwkuYnl0ZQkweDY2CisJbW92CTgqMCgkdHB0ciksJXIxMgorCW1vdgk4KjEoJHRwdHIpLCVyMTMKKwlzYmIJMTYqMCgkbnB0ciksJXIxMgorCW1vdgk4KjIoJHRwdHIpLCVyMTQKKwlzYmIJMTYqMSgkbnB0ciksJXIxMworCW1vdgk4KjMoJHRwdHIpLCVyMTUKKwlsZWEJOCo0KCR0cHRyKSwkdHB0cgorCXNiYgkxNioyKCRucHRyKSwlcjE0CisJbW92CSVyMTIsOCowKCRycHRyKQorCXNiYgkxNiozKCRucHRyKSwlcjE1CisJbGVhCTE2KjQoJG5wdHIpLCRucHRyCisJbW92CSVyMTMsOCoxKCRycHRyKQorCW1vdgklcjE0LDgqMigkcnB0cikKKwltb3YJJXIxNSw4KjMoJHJwdHIpCisJbGVhCTgqNCgkcnB0ciksJHJwdHIKKworCWluYwklcmN4CisJam56CS5Mc3FyeDR4X3N1YgorX19fCit9CiskY29kZS49PDxfX187CisJbmVnCSVyOQkJCSMgcmVzdG9yZSAkbnVtCisKKwlyZXQKKy5zaXplCWJuX3Nxcng4eF9pbnRlcm5hbCwuLWJuX3Nxcng4eF9pbnRlcm5hbAorX19fCit9fX0KK3sKK215ICgkaW5wLCRudW0sJHRibCwkaWR4KT0kd2luNjQ/KCIlcmN4IiwiJWVkeCIsIiVyOCIsICIlcjlkIikgOiAjIFdpbjY0IG9yZGVyCisJCQkJKCIlcmRpIiwiJWVzaSIsIiVyZHgiLCIlZWN4Iik7ICAjIFVuaXggb3JkZXIKK215ICRvdXQ9JGlucDsKK215ICRTVFJJREU9MioqNSo4OworbXkgJE49JFNUUklERS80OworCiskY29kZS49PDxfX187CisuZ2xvYmwJYm5fZ2V0X2JpdHM1CisudHlwZQlibl9nZXRfYml0czUsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2Citibl9nZXRfYml0czU6CisJbW92CSRpbnAsJXIxMAorCW1vdgkkbnVtLCVlY3gKKwlzaHIJXCQzLCRudW0KKwltb3Z6dwkoJXIxMCwkbnVtKSwlZWF4CisJYW5kCVwkNywlZWN4CisJc2hybAklY2wsJWVheAorCWFuZAlcJDMxLCVlYXgKKwlyZXQKKy5zaXplCWJuX2dldF9iaXRzNSwuLWJuX2dldF9iaXRzNQorCisuZ2xvYmwJYm5fc2NhdHRlcjUKKy50eXBlCWJuX3NjYXR0ZXI1LFxAYWJpLW9tbmlwb3RlbnQKKy5hbGlnbgkxNgorYm5fc2NhdHRlcjU6CisJY21wCVwkMCwgJG51bQorCWp6CS5Mc2NhdHRlcl9lcGlsb2d1ZQorCWxlYQkoJHRibCwkaWR4LDgpLCR0YmwKKy5Mc2NhdHRlcjoKKwltb3YJKCRpbnApLCVyYXgKKwlsZWEJOCgkaW5wKSwkaW5wCisJbW92CSVyYXgsKCR0YmwpCisJbGVhCTMyKjgoJHRibCksJHRibAorCXN1YglcJDEsJG51bQorCWpuegkuTHNjYXR0ZXIKKy5Mc2NhdHRlcl9lcGlsb2d1ZToKKwlyZXQKKy5zaXplCWJuX3NjYXR0ZXI1LC4tYm5fc2NhdHRlcjUKKworLmdsb2JsCWJuX2dhdGhlcjUKKy50eXBlCWJuX2dhdGhlcjUsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2Citibl9nYXRoZXI1OgorX19fCiskY29kZS49PDxfX18gaWYgKCR3aW42NCk7CisuTFNFSF9iZWdpbl9ibl9nYXRoZXI1OgorCSMgSSBjYW4ndCB0cnVzdCBhc3NlbWJsZXIgdG8gdXNlIHNwZWNpZmljIGVuY29kaW5nOi0oCisJLmJ5dGUJMHg0OCwweDgzLDB4ZWMsMHgyOAkJI3N1YglcJDB4MjgsJXJzcAorCS5ieXRlCTB4MGYsMHgyOSwweDM0LDB4MjQJCSNtb3ZhcHMJJXhtbTYsKCVyc3ApCisJLmJ5dGUJMHgwZiwweDI5LDB4N2MsMHgyNCwweDEwCSNtb3ZkcWEJJXhtbTcsMHgxMCglcnNwKQorX19fCiskY29kZS49PDxfX187CisJbW92CSRpZHgsJXIxMWQKKwlzaHIJXCRgbG9nKCROLzgpL2xvZygyKWAsJGlkeAorCWFuZAlcJGAkTi84LTFgLCVyMTEKKwlub3QJJGlkeAorCWxlYQkuTG1hZ2ljX21hc2tzKCVyaXApLCVyYXgKKwlhbmQJXCRgMioqNS8oJE4vOCktMWAsJGlkeAkjIDUgaXMgIndpbmRvdyBzaXplIgorCWxlYQkxMjgoJHRibCwlcjExLDgpLCR0YmwJIyBwb2ludGVyIHdpdGhpbiAxc3QgY2FjaGUgbGluZQorCW1vdnEJMCglcmF4LCRpZHgsOCksJXhtbTQJIyBzZXQgb2YgbWFza3MgZGVub3Rpbmcgd2hpY2gKKwltb3ZxCTgoJXJheCwkaWR4LDgpLCV4bW01CSMgY2FjaGUgbGluZSBjb250YWlucyBlbGVtZW50CisJbW92cQkxNiglcmF4LCRpZHgsOCksJXhtbTYJIyBkZW5vdGVkIGJ5IDd0aCBhcmd1bWVudAorCW1vdnEJMjQoJXJheCwkaWR4LDgpLCV4bW03CisJam1wCS5MZ2F0aGVyCisuYWxpZ24JMTYKKy5MZ2F0aGVyOgorCW1vdnEJYDAqJFNUUklERS80LTEyOGAoJHRibCksJXhtbTAKKwltb3ZxCWAxKiRTVFJJREUvNC0xMjhgKCR0YmwpLCV4bW0xCisJcGFuZAkleG1tNCwleG1tMAorCW1vdnEJYDIqJFNUUklERS80LTEyOGAoJHRibCksJXhtbTIKKwlwYW5kCSV4bW01LCV4bW0xCisJbW92cQlgMyokU1RSSURFLzQtMTI4YCgkdGJsKSwleG1tMworCXBhbmQJJXhtbTYsJXhtbTIKKwlwb3IJJXhtbTEsJXhtbTAKKwlwYW5kCSV4bW03LCV4bW0zCisJLmJ5dGUJMHg2NywweDY3CisJcG9yCSV4bW0yLCV4bW0wCisJbGVhCSRTVFJJREUoJHRibCksJHRibAorCXBvcgkleG1tMywleG1tMAorCisJbW92cQkleG1tMCwoJG91dCkJCSMgbTA9YnBbMF0KKwlsZWEJOCgkb3V0KSwkb3V0CisJc3ViCVwkMSwkbnVtCisJam56CS5MZ2F0aGVyCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJHdpbjY0KTsKKwltb3ZhcHMJKCVyc3ApLCV4bW02CisJbW92YXBzCTB4MTAoJXJzcCksJXhtbTcKKwlsZWEJMHgyOCglcnNwKSwlcnNwCitfX18KKyRjb2RlLj08PF9fXzsKKwlyZXQKKy5MU0VIX2VuZF9ibl9nYXRoZXI1OgorLnNpemUJYm5fZ2F0aGVyNSwuLWJuX2dhdGhlcjUKK19fXworfQorJGNvZGUuPTw8X19fOworLmFsaWduCTY0CisuTG1hZ2ljX21hc2tzOgorCS5sb25nCTAsMCwgMCwwLCAwLDAsIC0xLC0xCisJLmxvbmcJMCwwLCAwLDAsIDAsMCwgIDAsMAorLmFzY2l6CSJNb250Z29tZXJ5IE11bHRpcGxpY2F0aW9uIHdpdGggc2NhdHRlci9nYXRoZXIgZm9yIHg4Nl82NCwgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQG9wZW5zc2wub3JnPiIKK19fXworCisjIEVYQ0VQVElPTl9ESVNQT1NJVElPTiBoYW5kbGVyIChFWENFUFRJT05fUkVDT1JEICpyZWMsVUxPTkc2NCBmcmFtZSwKKyMJCUNPTlRFWFQgKmNvbnRleHQsRElTUEFUQ0hFUl9DT05URVhUICpkaXNwKQoraWYgKCR3aW42NCkgeworJHJlYz0iJXJjeCI7CiskZnJhbWU9IiVyZHgiOworJGNvbnRleHQ9IiVyOCI7CiskZGlzcD0iJXI5IjsKKworJGNvZGUuPTw8X19fOworLmV4dGVybglfX2ltcF9SdGxWaXJ0dWFsVW53aW5kCisudHlwZQltdWxfaGFuZGxlcixcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMTYKK211bF9oYW5kbGVyOgorCXB1c2gJJXJzaQorCXB1c2gJJXJkaQorCXB1c2gJJXJieAorCXB1c2gJJXJicAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCXB1c2gJJXIxNQorCXB1c2hmcQorCXN1YglcJDY0LCVyc3AKKworCW1vdgkxMjAoJGNvbnRleHQpLCVyYXgJIyBwdWxsIGNvbnRleHQtPlJheAorCW1vdgkyNDgoJGNvbnRleHQpLCVyYngJIyBwdWxsIGNvbnRleHQtPlJpcAorCisJbW92CTgoJGRpc3ApLCVyc2kJCSMgZGlzcC0+SW1hZ2VCYXNlCisJbW92CTU2KCRkaXNwKSwlcjExCQkjIGRpc3AtPkhhbmRsZXJEYXRhCisKKwltb3YJMCglcjExKSwlcjEwZAkJIyBIYW5kbGVyRGF0YVswXQorCWxlYQkoJXJzaSwlcjEwKSwlcjEwCSMgZW5kIG9mIHByb2xvZ3VlIGxhYmVsCisJY21wCSVyMTAsJXJieAkJIyBjb250ZXh0LT5SaXA8ZW5kIG9mIHByb2xvZ3VlIGxhYmVsCisJamIJLkxjb21tb25fc2VoX3RhaWwKKworCW1vdgkxNTIoJGNvbnRleHQpLCVyYXgJIyBwdWxsIGNvbnRleHQtPlJzcAorCisJbW92CTQoJXIxMSksJXIxMGQJCSMgSGFuZGxlckRhdGFbMV0KKwlsZWEJKCVyc2ksJXIxMCksJXIxMAkjIGVwaWxvZ3VlIGxhYmVsCisJY21wCSVyMTAsJXJieAkJIyBjb250ZXh0LT5SaXA+PWVwaWxvZ3VlIGxhYmVsCisJamFlCS5MY29tbW9uX3NlaF90YWlsCisKKwlsZWEJLkxtdWxfZXBpbG9ndWUoJXJpcCksJXIxMAorCWNtcAklcjEwLCVyYngKKwlqYgkuTGJvZHlfNDAKKworCW1vdgkxOTIoJGNvbnRleHQpLCVyMTAJIyBwdWxsICRudW0KKwltb3YJOCglcmF4LCVyMTAsOCksJXJheAkjIHB1bGwgc2F2ZWQgc3RhY2sgcG9pbnRlcgorCWptcAkuTGJvZHlfcHJvY2VlZAorCisuTGJvZHlfNDA6CisJbW92CTQwKCVyYXgpLCVyYXgJCSMgcHVsbCBzYXZlZCBzdGFjayBwb2ludGVyCisuTGJvZHlfcHJvY2VlZDoKKworCW1vdmFwcwktODgoJXJheCksJXhtbTAKKwltb3ZhcHMJLTcyKCVyYXgpLCV4bW0xCisKKwltb3YJLTgoJXJheCksJXJieAorCW1vdgktMTYoJXJheCksJXJicAorCW1vdgktMjQoJXJheCksJXIxMgorCW1vdgktMzIoJXJheCksJXIxMworCW1vdgktNDAoJXJheCksJXIxNAorCW1vdgktNDgoJXJheCksJXIxNQorCW1vdgklcmJ4LDE0NCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJieAorCW1vdgklcmJwLDE2MCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJicAorCW1vdgklcjEyLDIxNigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlIxMgorCW1vdgklcjEzLDIyNCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlIxMworCW1vdgklcjE0LDIzMigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlIxNAorCW1vdgklcjE1LDI0MCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlIxNQorCW1vdnVwcwkleG1tMCw1MTIoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5YbW02CisJbW92dXBzCSV4bW0xLDUyOCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlhtbTcKKworLkxjb21tb25fc2VoX3RhaWw6CisJbW92CTgoJXJheCksJXJkaQorCW1vdgkxNiglcmF4KSwlcnNpCisJbW92CSVyYXgsMTUyKCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UnNwCisJbW92CSVyc2ksMTY4KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UnNpCisJbW92CSVyZGksMTc2KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UmRpCisKKwltb3YJNDAoJGRpc3ApLCVyZGkJCSMgZGlzcC0+Q29udGV4dFJlY29yZAorCW1vdgkkY29udGV4dCwlcnNpCQkjIGNvbnRleHQKKwltb3YJXCQxNTQsJWVjeAkJIyBzaXplb2YoQ09OVEVYVCkKKwkubG9uZwkweGE1NDhmM2ZjCQkjIGNsZDsgcmVwIG1vdnNxCisKKwltb3YJJGRpc3AsJXJzaQorCXhvcgklcmN4LCVyY3gJCSMgYXJnMSwgVU5XX0ZMQUdfTkhBTkRMRVIKKwltb3YJOCglcnNpKSwlcmR4CQkjIGFyZzIsIGRpc3AtPkltYWdlQmFzZQorCW1vdgkwKCVyc2kpLCVyOAkJIyBhcmczLCBkaXNwLT5Db250cm9sUGMKKwltb3YJMTYoJXJzaSksJXI5CQkjIGFyZzQsIGRpc3AtPkZ1bmN0aW9uRW50cnkKKwltb3YJNDAoJXJzaSksJXIxMAkJIyBkaXNwLT5Db250ZXh0UmVjb3JkCisJbGVhCTU2KCVyc2kpLCVyMTEJCSMgJmRpc3AtPkhhbmRsZXJEYXRhCisJbGVhCTI0KCVyc2kpLCVyMTIJCSMgJmRpc3AtPkVzdGFibGlzaGVyRnJhbWUKKwltb3YJJXIxMCwzMiglcnNwKQkJIyBhcmc1CisJbW92CSVyMTEsNDAoJXJzcCkJCSMgYXJnNgorCW1vdgklcjEyLDQ4KCVyc3ApCQkjIGFyZzcKKwltb3YJJXJjeCw1NiglcnNwKQkJIyBhcmc4LCAoTlVMTCkKKwljYWxsCSpfX2ltcF9SdGxWaXJ0dWFsVW53aW5kKCVyaXApCisKKwltb3YJXCQxLCVlYXgJCSMgRXhjZXB0aW9uQ29udGludWVTZWFyY2gKKwlhZGQJXCQ2NCwlcnNwCisJcG9wZnEKKwlwb3AJJXIxNQorCXBvcAklcjE0CisJcG9wCSVyMTMKKwlwb3AJJXIxMgorCXBvcAklcmJwCisJcG9wCSVyYngKKwlwb3AJJXJkaQorCXBvcAklcnNpCisJcmV0Cisuc2l6ZQltdWxfaGFuZGxlciwuLW11bF9oYW5kbGVyCisKKy5zZWN0aW9uCS5wZGF0YQorLmFsaWduCTQKKwkucnZhCS5MU0VIX2JlZ2luX2JuX211bF9tb250X2dhdGhlcjUKKwkucnZhCS5MU0VIX2VuZF9ibl9tdWxfbW9udF9nYXRoZXI1CisJLnJ2YQkuTFNFSF9pbmZvX2JuX211bF9tb250X2dhdGhlcjUKKworCS5ydmEJLkxTRUhfYmVnaW5fYm5fbXVsNHhfbW9udF9nYXRoZXI1CisJLnJ2YQkuTFNFSF9lbmRfYm5fbXVsNHhfbW9udF9nYXRoZXI1CisJLnJ2YQkuTFNFSF9pbmZvX2JuX211bDR4X21vbnRfZ2F0aGVyNQorCisJLnJ2YQkuTFNFSF9iZWdpbl9ibl9wb3dlcjUKKwkucnZhCS5MU0VIX2VuZF9ibl9wb3dlcjUKKwkucnZhCS5MU0VIX2luZm9fYm5fcG93ZXI1CisKKwkucnZhCS5MU0VIX2JlZ2luX2JuX2Zyb21fbW9udDh4CisJLnJ2YQkuTFNFSF9lbmRfYm5fZnJvbV9tb250OHgKKwkucnZhCS5MU0VIX2luZm9fYm5fZnJvbV9tb250OHgKK19fXworJGNvZGUuPTw8X19fIGlmICgkYWRkeCk7CisJLnJ2YQkuTFNFSF9iZWdpbl9ibl9tdWx4NHhfbW9udF9nYXRoZXI1CisJLnJ2YQkuTFNFSF9lbmRfYm5fbXVseDR4X21vbnRfZ2F0aGVyNQorCS5ydmEJLkxTRUhfaW5mb19ibl9tdWx4NHhfbW9udF9nYXRoZXI1CisKKwkucnZhCS5MU0VIX2JlZ2luX2JuX3Bvd2VyeDUKKwkucnZhCS5MU0VIX2VuZF9ibl9wb3dlcng1CisJLnJ2YQkuTFNFSF9pbmZvX2JuX3Bvd2VyeDUKK19fXworJGNvZGUuPTw8X19fOworCS5ydmEJLkxTRUhfYmVnaW5fYm5fZ2F0aGVyNQorCS5ydmEJLkxTRUhfZW5kX2JuX2dhdGhlcjUKKwkucnZhCS5MU0VIX2luZm9fYm5fZ2F0aGVyNQorCisuc2VjdGlvbgkueGRhdGEKKy5hbGlnbgk4CisuTFNFSF9pbmZvX2JuX211bF9tb250X2dhdGhlcjU6CisJLmJ5dGUJOSwwLDAsMAorCS5ydmEJbXVsX2hhbmRsZXIKKwkucnZhCS5MbXVsX2JvZHksLkxtdWxfZXBpbG9ndWUJCSMgSGFuZGxlckRhdGFbXQorLmFsaWduCTgKKy5MU0VIX2luZm9fYm5fbXVsNHhfbW9udF9nYXRoZXI1OgorCS5ieXRlCTksMCwwLDAKKwkucnZhCW11bF9oYW5kbGVyCisJLnJ2YQkuTG11bDR4X2JvZHksLkxtdWw0eF9lcGlsb2d1ZQkJIyBIYW5kbGVyRGF0YVtdCisuYWxpZ24JOAorLkxTRUhfaW5mb19ibl9wb3dlcjU6CisJLmJ5dGUJOSwwLDAsMAorCS5ydmEJbXVsX2hhbmRsZXIKKwkucnZhCS5McG93ZXI1X2JvZHksLkxwb3dlcjVfZXBpbG9ndWUJCSMgSGFuZGxlckRhdGFbXQorLmFsaWduCTgKKy5MU0VIX2luZm9fYm5fZnJvbV9tb250OHg6CisJLmJ5dGUJOSwwLDAsMAorCS5ydmEJbXVsX2hhbmRsZXIKKwkucnZhCS5MZnJvbV9ib2R5LC5MZnJvbV9lcGlsb2d1ZQkJIyBIYW5kbGVyRGF0YVtdCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJGFkZHgpOworLmFsaWduCTgKKy5MU0VIX2luZm9fYm5fbXVseDR4X21vbnRfZ2F0aGVyNToKKwkuYnl0ZQk5LDAsMCwwCisJLnJ2YQltdWxfaGFuZGxlcgorCS5ydmEJLkxtdWx4NHhfYm9keSwuTG11bHg0eF9lcGlsb2d1ZQkJIyBIYW5kbGVyRGF0YVtdCisuYWxpZ24JOAorLkxTRUhfaW5mb19ibl9wb3dlcng1OgorCS5ieXRlCTksMCwwLDAKKwkucnZhCW11bF9oYW5kbGVyCisJLnJ2YQkuTHBvd2VyeDVfYm9keSwuTHBvd2VyeDVfZXBpbG9ndWUJIyBIYW5kbGVyRGF0YVtdCitfX18KKyRjb2RlLj08PF9fXzsKKy5hbGlnbgk4CisuTFNFSF9pbmZvX2JuX2dhdGhlcjU6CisgICAgICAgIC5ieXRlICAgMHgwMSwweDBkLDB4MDUsMHgwMAorICAgICAgICAuYnl0ZSAgIDB4MGQsMHg3OCwweDAxLDB4MDAJI21vdmFwcwkweDEwKHJzcCkseG1tNworICAgICAgICAuYnl0ZSAgIDB4MDgsMHg2OCwweDAwLDB4MDAJI21vdmFwcwkocnNwKSx4bW02CisgICAgICAgIC5ieXRlICAgMHgwNCwweDQyLDB4MDAsMHgwMAkjc3ViCXJzcCwweDI4CisuYWxpZ24JOAorX19fCit9CisKKyRjb2RlID1+IHMvXGAoW15cYF0qKVxgL2V2YWwoJDEpL2dlbTsKKworcHJpbnQgJGNvZGU7CitjbG9zZSBTVERPVVQ7CmRpZmYgLS1naXQgYS9jcnlwdG8vYm4vYm4uYyBiL2NyeXB0by9ibi9ibi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5OTZhNDcKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYm4vYm4uYwpAQCAtMCwwICsxLDMzNiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKworI2luY2x1ZGUgImludGVybmFsLmgiCisKKworQklHTlVNICpCTl9uZXcodm9pZCkgeworICBCSUdOVU0gKmJuID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEJJR05VTSkpOworCisgIGlmIChibiA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX25ldywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgbWVtc2V0KGJuLCAwLCBzaXplb2YoQklHTlVNKSk7CisgIGJuLT5mbGFncyA9IEJOX0ZMR19NQUxMT0NFRDsKKworICByZXR1cm4gYm47Cit9CisKK3ZvaWQgQk5faW5pdChCSUdOVU0gKmJuKSB7CisgIG1lbXNldChibiwgMCwgc2l6ZW9mKEJJR05VTSkpOworfQorCit2b2lkIEJOX2ZyZWUoQklHTlVNICpibikgeworICBpZiAoYm4gPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChibi0+ZCAhPSBOVUxMICYmIChibi0+ZmxhZ3MgJiBCTl9GTEdfU1RBVElDX0RBVEEpID09IDApIHsKKyAgICBPUEVOU1NMX2ZyZWUoYm4tPmQpOworICB9CisKKyAgaWYgKGJuLT5mbGFncyAmIEJOX0ZMR19NQUxMT0NFRCkgeworICAgIE9QRU5TU0xfZnJlZShibik7CisgIH0gZWxzZSB7CisgICAgYm4tPmQgPSBOVUxMOworICB9Cit9CisKK3ZvaWQgQk5fY2xlYXJfZnJlZShCSUdOVU0gKmJuKSB7CisgIGNoYXIgc2hvdWxkX2ZyZWU7CisKKyAgaWYgKGJuID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoYm4tPmQgIT0gTlVMTCkgeworICAgIE9QRU5TU0xfY2xlYW5zZShibi0+ZCwgYm4tPmRtYXggKiBzaXplb2YoYm4tPmRbMF0pKTsKKyAgICBpZiAoKGJuLT5mbGFncyAmIEJOX0ZMR19TVEFUSUNfREFUQSkgPT0gMCkgeworICAgICAgT1BFTlNTTF9mcmVlKGJuLT5kKTsKKyAgICB9CisgIH0KKworICBzaG91bGRfZnJlZSA9IChibi0+ZmxhZ3MgJiBCTl9GTEdfTUFMTE9DRUQpICE9IDA7CisgIE9QRU5TU0xfY2xlYW5zZShibiwgc2l6ZW9mKEJJR05VTSkpOworICBpZiAoc2hvdWxkX2ZyZWUpIHsKKyAgICBPUEVOU1NMX2ZyZWUoYm4pOworICB9Cit9CisKK0JJR05VTSAqQk5fZHVwKGNvbnN0IEJJR05VTSAqc3JjKSB7CisgIEJJR05VTSAqY29weTsKKworICBpZiAoc3JjID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGNvcHkgPSBCTl9uZXcoKTsKKyAgaWYgKGNvcHkgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYgKCFCTl9jb3B5KGNvcHksIHNyYykpIHsKKyAgICBCTl9mcmVlKGNvcHkpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIGNvcHk7Cit9CisKK0JJR05VTSAqQk5fY29weShCSUdOVU0gKmRlc3QsIGNvbnN0IEJJR05VTSAqc3JjKSB7CisgIGlmIChzcmMgPT0gZGVzdCkgeworICAgIHJldHVybiBkZXN0OworICB9CisKKyAgaWYgKGJuX3dleHBhbmQoZGVzdCwgc3JjLT50b3ApID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIG1lbWNweShkZXN0LT5kLCBzcmMtPmQsIHNpemVvZihzcmMtPmRbMF0pICogc3JjLT50b3ApOworCisgIGRlc3QtPnRvcCA9IHNyYy0+dG9wOworICBkZXN0LT5uZWcgPSBzcmMtPm5lZzsKKyAgcmV0dXJuIGRlc3Q7Cit9CisKK3ZvaWQgQk5fY2xlYXIoQklHTlVNICpibikgeworICBpZiAoYm4tPmQgIT0gTlVMTCkgeworICAgIG1lbXNldChibi0+ZCwgMCwgYm4tPmRtYXggKiBzaXplb2YoYm4tPmRbMF0pKTsKKyAgfQorCisgIGJuLT50b3AgPSAwOworICBibi0+bmVnID0gMDsKK30KKworY29uc3QgQklHTlVNICpCTl92YWx1ZV9vbmUodm9pZCkgeworICBzdGF0aWMgY29uc3QgQk5fVUxPTkcgZGF0YV9vbmUgPSAxOworICBzdGF0aWMgY29uc3QgQklHTlVNIGNvbnN0X29uZSA9IHsoQk5fVUxPTkcgKikmZGF0YV9vbmUsIDEsIDEsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJOX0ZMR19TVEFUSUNfREFUQX07CisKKyAgcmV0dXJuICZjb25zdF9vbmU7Cit9CisKK3ZvaWQgQk5fd2l0aF9mbGFncyhCSUdOVU0gKm91dCwgY29uc3QgQklHTlVNICppbiwgaW50IGZsYWdzKSB7CisgIG1lbWNweShvdXQsIGluLCBzaXplb2YoQklHTlVNKSk7CisgIG91dC0+ZmxhZ3MgJj0gfkJOX0ZMR19NQUxMT0NFRDsKKyAgb3V0LT5mbGFncyB8PSBCTl9GTEdfU1RBVElDX0RBVEEgfCBmbGFnczsKK30KKworLyogQk5fbnVtX2JpdHNfd29yZCByZXR1cm5zIHRoZSBtaW5pbXVtIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byByZXByZXNlbnQgdGhlCisgKiB2YWx1ZSBpbiB8bHwuICovCit1bnNpZ25lZCBCTl9udW1fYml0c193b3JkKEJOX1VMT05HIGwpIHsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYml0c1syNTZdID0geworICAgICAgMCwgMSwgMiwgMiwgMywgMywgMywgMywgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwKKyAgICAgIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsCisgICAgICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAorICAgICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywKKyAgICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCisgICAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LAorICAgICAgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwKKyAgICAgIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsCisgICAgICA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LAorICAgICAgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwKKyAgICAgIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDh9OworCisjaWYgZGVmaW5lZChPUEVOU1NMXzY0X0JJVCkKKyAgaWYgKGwgJiAweGZmZmZmZmZmMDAwMDAwMDBMKSB7CisgICAgaWYgKGwgJiAweGZmZmYwMDAwMDAwMDAwMDBMKSB7CisgICAgICBpZiAobCAmIDB4ZmYwMDAwMDAwMDAwMDAwMEwpIHsKKyAgICAgICAgcmV0dXJuIChiaXRzWyhpbnQpKGwgPj4gNTYpXSArIDU2KTsKKyAgICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gKGJpdHNbKGludCkobCA+PiA0OCldICsgNDgpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAobCAmIDB4MDAwMGZmMDAwMDAwMDAwMEwpIHsKKyAgICAgICAgcmV0dXJuIChiaXRzWyhpbnQpKGwgPj4gNDApXSArIDQwKTsKKyAgICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gKGJpdHNbKGludCkobCA+PiAzMildICsgMzIpOworICAgIH0KKyAgfSBlbHNlCisjZW5kaWYKKyAgeworICAgIGlmIChsICYgMHhmZmZmMDAwMEwpIHsKKyAgICAgIGlmIChsICYgMHhmZjAwMDAwMEwpIHsKKyAgICAgICAgcmV0dXJuIChiaXRzWyhpbnQpKGwgPj4gMjRMKV0gKyAyNCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gKGJpdHNbKGludCkobCA+PiAxNkwpXSArIDE2KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKGwgJiAweGZmMDBMKSB7CisgICAgICAgIHJldHVybiAoYml0c1soaW50KShsID4+IDgpXSArIDgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIChiaXRzWyhpbnQpKGwpXSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3Vuc2lnbmVkIEJOX251bV9iaXRzKGNvbnN0IEJJR05VTSAqYm4pIHsKKyAgY29uc3QgaW50IG1heCA9IGJuLT50b3AgLSAxOworCisgIGlmIChCTl9pc196ZXJvKGJuKSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgcmV0dXJuIG1heCpCTl9CSVRTMiArIEJOX251bV9iaXRzX3dvcmQoYm4tPmRbbWF4XSk7Cit9CisKK3Vuc2lnbmVkIEJOX251bV9ieXRlcyhjb25zdCBCSUdOVU0gKmJuKSB7CisgIHJldHVybiAoQk5fbnVtX2JpdHMoYm4pICsgNykgLyA4OworfQorCit2b2lkIEJOX3plcm8oQklHTlVNICpibikgeworICBibi0+dG9wID0gYm4tPm5lZyA9IDA7Cit9CisKK2ludCBCTl9vbmUoQklHTlVNICpibikgeworICByZXR1cm4gQk5fc2V0X3dvcmQoYm4sIDEpOworfQorCitpbnQgQk5fc2V0X3dvcmQoQklHTlVNICpibiwgQk5fVUxPTkcgdmFsdWUpIHsKKyAgaWYgKHZhbHVlID09IDApIHsKKyAgICBCTl96ZXJvKGJuKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGlmIChibl93ZXhwYW5kKGJuLCAxKSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBibi0+bmVnID0gMDsKKyAgYm4tPmRbMF0gPSB2YWx1ZTsKKyAgYm4tPnRvcCA9IDE7CisgIHJldHVybiAxOworfQorCitpbnQgQk5faXNfbmVnYXRpdmUoY29uc3QgQklHTlVNICpibikgeworICByZXR1cm4gYm4tPm5lZyAhPSAwOworfQorCit2b2lkIEJOX3NldF9uZWdhdGl2ZShCSUdOVU0gKmJuLCBpbnQgc2lnbikgeworICBpZiAoc2lnbiAmJiAhQk5faXNfemVybyhibikpIHsKKyAgICBibi0+bmVnID0gMTsKKyAgfSBlbHNlIHsKKyAgICBibi0+bmVnID0gMDsKKyAgfQorfQorCitCSUdOVU0gKmJuX3dleHBhbmQoQklHTlVNICpibiwgdW5zaWduZWQgd29yZHMpIHsKKyAgQk5fVUxPTkcgKmE7CisKKyAgaWYgKHdvcmRzIDw9ICh1bnNpZ25lZCkgYm4tPmRtYXgpIHsKKyAgICByZXR1cm4gYm47CisgIH0KKworICBpZiAod29yZHMgPiAoSU5UX01BWCAvICg0ICogQk5fQklUUzIpKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBibl93ZXhwYW5kLCBCTl9SX0JJR05VTV9UT09fTE9ORyk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBpZiAoYm4tPmZsYWdzICYgQk5fRkxHX1NUQVRJQ19EQVRBKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIGJuX3dleHBhbmQsIEJOX1JfRVhQQU5EX09OX1NUQVRJQ19CSUdOVU1fREFUQSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBhID0gKEJOX1VMT05HICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEJOX1VMT05HKSAqIHdvcmRzKTsKKyAgaWYgKGEgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBibl93ZXhwYW5kLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBtZW1jcHkoYSwgYm4tPmQsIHNpemVvZihCTl9VTE9ORykgKiBibi0+dG9wKTsKKworICBpZiAoYm4tPmQpIHsKKyAgICBPUEVOU1NMX2ZyZWUoYm4tPmQpOworICB9CisgIGJuLT5kID0gYTsKKyAgYm4tPmRtYXggPSB3b3JkczsKKworICByZXR1cm4gYm47Cit9CisKK0JJR05VTSAqYm5fZXhwYW5kKEJJR05VTSAqYm4sIHVuc2lnbmVkIGJpdHMpIHsKKyAgcmV0dXJuIGJuX3dleHBhbmQoYm4sIChiaXRzK0JOX0JJVFMyLTEpL0JOX0JJVFMyKTsKK30KKwordm9pZCBibl9jb3JyZWN0X3RvcChCSUdOVU0gKmJuKSB7CisgIEJOX1VMT05HICpmdGw7CisgIGludCB0bXBfdG9wID0gYm4tPnRvcDsKKworICBpZiAodG1wX3RvcCA+IDApIHsKKyAgICBmb3IgKGZ0bCA9ICYoYm4tPmRbdG1wX3RvcCAtIDFdKTsgdG1wX3RvcCA+IDA7IHRtcF90b3AtLSkgeworICAgICAgaWYgKCooZnRsLS0pKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBibi0+dG9wID0gdG1wX3RvcDsKKyAgfQorfQorCitpbnQgQk5fZ2V0X2ZsYWdzKGNvbnN0IEJJR05VTSAqYm4sIGludCBmbGFncykgeworICByZXR1cm4gYm4tPmZsYWdzICYgZmxhZ3M7Cit9CisKK3ZvaWQgQk5fc2V0X2ZsYWdzKEJJR05VTSAqYm4sIGludCBmbGFncykgeworICBibi0+ZmxhZ3MgfD0gZmxhZ3M7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vYm4vYm4uaCBiL2NyeXB0by9ibi9ibi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2Y2U2NWYKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYm4vYm4uaApAQCAtMCwwICsxLDc5MCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFMTCBSSUdIVFMgUkVTRVJWRUQuCisgKgorICogUG9ydGlvbnMgb2YgdGhlIGF0dGFjaGVkIHNvZnR3YXJlICgiQ29udHJpYnV0aW9uIikgYXJlIGRldmVsb3BlZCBieQorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiwgYW5kIGFyZSBjb250cmlidXRlZCB0byB0aGUgT3BlblNTTCBwcm9qZWN0LgorICoKKyAqIFRoZSBDb250cmlidXRpb24gaXMgbGljZW5zZWQgcHVyc3VhbnQgdG8gdGhlIEVyaWMgWW91bmcgb3BlbiBzb3VyY2UKKyAqIGxpY2Vuc2UgcHJvdmlkZWQgYWJvdmUuCisgKgorICogVGhlIGJpbmFyeSBwb2x5bm9taWFsIGFyaXRobWV0aWMgc29mdHdhcmUgaXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5CisgKiBTaGV1ZWxpbmcgQ2hhbmcgU2hhbnR6IGFuZCBEb3VnbGFzIFN0ZWJpbGEgb2YgU3VuIE1pY3Jvc3lzdGVtcworICogTGFib3JhdG9yaWVzLiAqLworCisjaWZuZGVmIE9QRU5TU0xfSEVBREVSX0JOX0gKKyNkZWZpbmUgT1BFTlNTTF9IRUFERVJfQk5fSAorCisjaW5jbHVkZSA8b3BlbnNzbC9iYXNlLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPiAgLyogZm9yIEZJTEUqICovCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBCTiBwcm92aWRlcyBzdXBwb3J0IGZvciB3b3JraW5nIHdpdGggYXJiaXRhcnkgc2l6ZWQgaW50ZWdlcnMuIEZvciBleGFtcGxlLAorICogYWx0aG91Z2ggdGhlIGxhcmdlc3QgaW50ZWdlciBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBpbGVyIG1pZ2h0IGJlIDY0IGJpdHMsIEJOCisgKiB3aWxsIGFsbG93IHlvdSB0byB3b3JrIHdpdGggbnVtYmVycyB1bnRpbCB5b3UgcnVuIG91dCBvZiBtZW1vcnkuICovCisKKworLyogQk5fVUxPTkcgaXMgdGhlIG5hdGl2ZSB3b3JkIHNpemUgd2hlbiB3b3JraW5nIHdpdGggYmlnIGludGVnZXJzLiAqLworI2lmIGRlZmluZWQoT1BFTlNTTF82NF9CSVQpCisjZGVmaW5lIEJOX1VMT05HIHVpbnQ2NF90CisjZGVmaW5lIEJOX0JJVFMyIDY0CisjZWxpZiBkZWZpbmVkKE9QRU5TU0xfMzJfQklUKQorI2RlZmluZSBCTl9VTE9ORyB1aW50MzJfdAorI2RlZmluZSBCTl9CSVRTMiAzMgorI2Vsc2UKKyNlcnJvciAiTXVzdCBkZWZpbmUgZWl0aGVyIE9QRU5TU0xfMzJfQklUIG9yIE9QRU5TU0xfNjRfQklUIgorI2VuZGlmCisKKworLyogQWxsb2NhdGlvbiBhbmQgZnJlZWluZy4gKi8KKworLyogQk5fbmV3IGNyZWF0ZXMgYSBuZXcsIGFsbG9jYXRlZCBCSUdOVU0gYW5kIGluaXRpYWxpc2VzIGl0LiAqLworQklHTlVNICpCTl9uZXcodm9pZCk7CisKKy8qIEJOX2luaXQgaW5pdGlhbGlzZXMgYSBzdGFjayBhbGxvY2F0ZWQgfEJJR05VTXwuICovCit2b2lkIEJOX2luaXQoQklHTlVNICpibik7CisKKy8qIEJOX2ZyZWUgZnJlZXMgdGhlIGRhdGEgcmVmZXJlbmNlZCBieSB8Ym58IGFuZCwgaWYgfGJufCB3YXMgb3JpZ2luYWxseQorICogYWxsb2NhdGVkIG9uIHRoZSBoZWFwLCBmcmVlcyB8Ym58IGFsc28uICovCit2b2lkIEJOX2ZyZWUoQklHTlVNICpibik7CisKKy8qIEJOX2NsZWFyX2ZyZWUgZXJhc2VzIGFuZCBmcmVlcyB0aGUgZGF0YSByZWZlcmVuY2VkIGJ5IHxibnwgYW5kLCBpZiB8Ym58IHdhcworICogb3JpZ2luYWxseSBhbGxvY2F0ZWQgb24gdGhlIGhlYXAsIGZyZWVzIHxibnwgYWxzby4gKi8KK3ZvaWQgQk5fY2xlYXJfZnJlZShCSUdOVU0gKmJuKTsKKworLyogQk5fZHVwIGFsbG9jYXRlcyBhIG5ldyBCSUdOVU0gYW5kIHNldHMgaXQgZXF1YWwgdG8gfHNyY3wuIEl0IHJldHVybnMgdGhlCisgKiBhbGxvY2F0ZWQgQklHTlVNIG9uIHN1Y2Nlc3Mgb3IgTlVMTCBvdGhlcndpc2UuICovCitCSUdOVU0gKkJOX2R1cChjb25zdCBCSUdOVU0gKnNyYyk7CisKKy8qIEJOX2NvcHkgc2V0cyB8ZGVzdHwgZXF1YWwgdG8gfHNyY3wgYW5kIHJldHVybnMgfGRlc3R8LiAqLworQklHTlVNICpCTl9jb3B5KEJJR05VTSAqZGVzdCwgY29uc3QgQklHTlVNICpzcmMpOworCisvKiBCTl9jbGVhciBzZXRzIHxibnwgdG8gemVybyBhbmQgZXJhc2VzIHRoZSBvbGQgZGF0YS4gKi8KK3ZvaWQgQk5fY2xlYXIoQklHTlVNICpibik7CisKKy8qIEJOX3ZhbHVlX29uZSByZXR1cm5zIGEgc3RhdGljIEJJR05VTSB3aXRoIHZhbHVlIDEuICovCitjb25zdCBCSUdOVU0gKkJOX3ZhbHVlX29uZSh2b2lkKTsKKworLyogQk5fd2l0aF9mbGFncyBpbml0aWFsaXNlcyBhIHN0YWNrIGFsbG9jYXRlZCB8QklHTlVNfCB3aXRoIHBvaW50ZXJzIHRvIHRoZQorICogY29udGVudHMgb2YgfGlufCBidXQgd2l0aCB8ZmxhZ3N8IE9SZWQgaW50byB0aGUgZmxhZ3MgZmllbGQuCisgKgorICogTm90ZTogdGhlIHR3byBCSUdOVU1zIHNoYXJlIHN0YXRlIGFuZCBzbyB8b3V0fCBzaG91bGQgL25vdC8gYmUgcGFzc2VkIHRvCisgKiB8Qk5fZnJlZXwuICovCit2b2lkIEJOX3dpdGhfZmxhZ3MoQklHTlVNICpvdXQsIGNvbnN0IEJJR05VTSAqaW4sIGludCBmbGFncyk7CisKKworLyogQmFzaWMgZnVuY3Rpb25zLiAqLworCisvKiBCTl9udW1fYml0cyByZXR1cm5zIHRoZSBtaW5pbXVtIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byByZXByZXNlbnQgdGhlCisgKiBhYnNvbHV0ZSB2YWx1ZSBvZiB8Ym58LiAqLwordW5zaWduZWQgQk5fbnVtX2JpdHMoY29uc3QgQklHTlVNICpibik7CisKKy8qIEJOX251bV9ieXRlcyByZXR1cm5zIHRoZSBtaW5pbXVtIG51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gcmVwcmVzZW50IHRoZQorICogYWJzb2x1dGUgdmFsdWUgb2YgfGJufC4gKi8KK3Vuc2lnbmVkIEJOX251bV9ieXRlcyhjb25zdCBCSUdOVU0gKmJuKTsKKworLyogQk5femVybyBzZXRzIHxibnwgdG8gemVyby4gKi8KK3ZvaWQgQk5femVybyhCSUdOVU0gKmJuKTsKKworLyogQk5fb25lIHNldHMgfGJufCB0byBvbmUuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3Mgb3IgemVybyBvbiBhbGxvY2F0aW9uCisgKiBmYWlsdXJlLiAqLworaW50IEJOX29uZShCSUdOVU0gKmJuKTsKKworLyogQk5fc2V0X3dvcmQgc2V0cyB8Ym58IHRvIHx2YWx1ZXwuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3Mgb3IgemVybyBvbgorICogYWxsb2NhdGlvbiBmYWlsdXJlLiAqLworaW50IEJOX3NldF93b3JkKEJJR05VTSAqYm4sIEJOX1VMT05HIHZhbHVlKTsKKworLyogQk5fc2V0X25lZ2F0aXZlIHNldHMgdGhlIHNpZ24gb2YgfGJufC4gKi8KK3ZvaWQgQk5fc2V0X25lZ2F0aXZlKEJJR05VTSAqYm4sIGludCBzaWduKTsKKworLyogQk5faXNfbmVnYXRpdmUgcmV0dXJucyBvbmUgaWYgfGJufCBpcyBuZWdhdGl2ZSBhbmQgemVybyBvdGhlcndpc2UuICovCitpbnQgQk5faXNfbmVnYXRpdmUoY29uc3QgQklHTlVNICpibik7CisKKy8qIEJOX2dldF9mbGFncyByZXR1cm5zIHxibi0+ZmxhZ3N8ICYgfGZsYWdzfC4gKi8KK2ludCBCTl9nZXRfZmxhZ3MoY29uc3QgQklHTlVNICpibiwgaW50IGZsYWdzKTsKKworLyogQk5fc2V0X2ZsYWdzIHNldHMgfGZsYWdzfCBvbiB8Ym58LiAqLwordm9pZCBCTl9zZXRfZmxhZ3MoQklHTlVNICpibiwgaW50IGZsYWdzKTsKKworCisvKiBDb252ZXJzaW9uIGZ1bmN0aW9ucy4gKi8KKworLyogQk5fYmluMmJuIHNldHMgfCpyZXR8IHRvIHRoZSB2YWx1ZSBvZiB8bGVufCBieXRlcyBmcm9tIHxpbnwsIGludGVycHJldGVkIGFzCisgKiBhIGJpZy1lbmRpYW4gbnVtYmVyLCBhbmQgcmV0dXJucyB8cmV0fC4gSWYgfHJldHwgaXMgTlVMTCB0aGVuIGEgZnJlc2gKKyAqIHxCSUdOVU18IGlzIGFsbG9jYXRlZCBhbmQgcmV0dXJuZWQuIEl0IHJldHVybnMgTlVMTCBvbiBhbGxvY2F0aW9uCisgKiBmYWlsdXJlLiAqLworQklHTlVNICpCTl9iaW4yYm4oY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBsZW4sIEJJR05VTSAqcmV0KTsKKworLyogQk5fYm4yYmluIHNlcmlhbGlzZXMgdGhlIGFic29sdXRlIHZhbHVlIG9mIHxpbnwgdG8gfG91dHwgYXMgYSBiaWctZW5kaWFuCisgKiBpbnRlZ2VyLCB3aGljaCBtdXN0IGhhdmUgfEJOX251bV9ieXRlc3wgb2Ygc3BhY2UgYXZhaWxhYmxlLiBJdCByZXR1cm5zIHRoZQorICogbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uICovCitzaXplX3QgQk5fYm4yYmluKGNvbnN0IEJJR05VTSAqaW4sIHVpbnQ4X3QgKm91dCk7CisKKy8qIEJOX2JuMmhleCByZXR1cm5zIGFuIGFsbG9jYXRlZCBzdHJpbmcgdGhhdCBjb250YWlucyBhIE5VTC10ZXJtaW5hdGVkLCBoZXgKKyAqIHJlcHJlc2VudGF0aW9uIG9mIHxibnwuIElmIHxibnwgaXMgbmVnYXRpdmUsIHRoZSBmaXJzdCBjaGFyIGluIHRoZSByZXN1bHRpbmcKKyAqIHN0cmluZyB3aWxsIGJlICctJy4gUmV0dXJucyBOVUxMIG9uIGFsbG9jYXRpb24gZmFpbHVyZS4gKi8KK2NoYXIgKkJOX2JuMmhleChjb25zdCBCSUdOVU0gKmJuKTsKKworLyogQk5faGV4MmJuIHBhcnNlcyB0aGUgbGVhZGluZyBoZXggbnVtYmVyIGZyb20gfGlufCwgd2hpY2ggbWF5IGJlIHByb2NlZWRlZCBieQorICogYSAnLScgdG8gaW5kaWNhdGUgYSBuZWdhdGl2ZSBudW1iZXIgYW5kIG1heSBjb250YWluIHRyYWlsaW5nLCBub24taGV4IGRhdGEuCisgKiBJZiB8b3V0cHwgaXMgbm90IE5VTEwsIGl0IGNvbnN0cnVjdHMgYSBCSUdOVU0gZXF1YWwgdG8gdGhlIGhleCBudW1iZXIgYW5kCisgKiBzdG9yZXMgaXQgaW4gfCpvdXRwfC4gSWYgfCpvdXRwfCBpcyBOVUxMIHRoZW4gaXQgYWxsb2NhdGVzIGEgbmV3IEJJR05VTSBhbmQKKyAqIHVwZGF0ZXMgfCpvdXRwfC4gSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIHxpbnwgcHJvY2Vzc2VkIG9yIHplcm8gb24KKyAqIGVycm9yLiAqLworaW50IEJOX2hleDJibihCSUdOVU0gKipvdXRwLCBjb25zdCBjaGFyICppbik7CisKKy8qIEJOX2JuMmRlYyByZXR1cm5zIGFuIGFsbG9jYXRlZCBzdHJpbmcgdGhhdCBjb250YWlucyBhIE5VTC10ZXJtaW5hdGVkLAorICogZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiB8Ym58LiBJZiB8Ym58IGlzIG5lZ2F0aXZlLCB0aGUgZmlyc3QgY2hhciBpbiB0aGUKKyAqIHJlc3VsdGluZyBzdHJpbmcgd2lsbCBiZSAnLScuIFJldHVybnMgTlVMTCBvbiBhbGxvY2F0aW9uIGZhaWx1cmUuICovCitjaGFyICpCTl9ibjJkZWMoY29uc3QgQklHTlVNICphKTsKKworLyogQk5fZGVjMmJuIHBhcnNlcyB0aGUgbGVhZGluZyBkZWNpbWFsIG51bWJlciBmcm9tIHxpbnwsIHdoaWNoIG1heSBiZQorICogcHJvY2VlZGVkIGJ5IGEgJy0nIHRvIGluZGljYXRlIGEgbmVnYXRpdmUgbnVtYmVyIGFuZCBtYXkgY29udGFpbiB0cmFpbGluZywKKyAqIG5vbi1kZWNpbWFsIGRhdGEuIElmIHxvdXRwfCBpcyBub3QgTlVMTCwgaXQgY29uc3RydWN0cyBhIEJJR05VTSBlcXVhbCB0byB0aGUKKyAqIGRlY2ltYWwgbnVtYmVyIGFuZCBzdG9yZXMgaXQgaW4gfCpvdXRwfC4gSWYgfCpvdXRwfCBpcyBOVUxMIHRoZW4gaXQKKyAqIGFsbG9jYXRlcyBhIG5ldyBCSUdOVU0gYW5kIHVwZGF0ZXMgfCpvdXRwfC4gSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzCisgKiBvZiB8aW58IHByb2Nlc3NlZCBvciB6ZXJvIG9uIGVycm9yLiAqLworaW50IEJOX2RlYzJibihCSUdOVU0gKipvdXRwLCBjb25zdCBjaGFyICppbik7CisKKy8qIEJOX2FzYzJibiBhY3RzIGxpa2UgfEJOX2RlYzJibnwgb3IgfEJOX2hleDJibnwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgfGlufAorICogYmVnaW5zIHdpdGggIjBYIiBvciAiMHgiIChpbmRpY2F0aW5nIGhleCkgb3Igbm90IChpbmRpY2F0aW5nIGRlY2ltYWwpLiBBCisgKiBsZWFkaW5nICctJyBpcyBzdGlsbCBwZXJtaXR0ZWQgYW5kIGNvbWVzIGJlZm9yZSB0aGUgb3B0aW9uYWwgMFgvMHguIEl0CisgKiByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIG9yIHplcm8gb24gZXJyb3IuICovCitpbnQgQk5fYXNjMmJuKEJJR05VTSAqKm91dHAsIGNvbnN0IGNoYXIgKmluKTsKKworLyogQk5fcHJpbnQgd3JpdGVzIGEgaGV4IGVuY29kaW5nIG9mIHxhfCB0byB8YmlvfC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcworICogYW5kIHplcm8gb24gZXJyb3IuICovCitpbnQgQk5fcHJpbnQoQklPICpiaW8sIGNvbnN0IEJJR05VTSAqYSk7CisKKy8qIEJOX3ByaW50X2ZwIGFjdHMgbGlrZSB8QklPX3ByaW50fCwgYnV0IHdyYXBzIHxmcHwgaW4gYSB8QklPfCBmaXJzdC4gKi8KK2ludCBCTl9wcmludF9mcChGSUxFICpmcCwgY29uc3QgQklHTlVNICphKTsKKworLyogQk5fZ2V0X3dvcmQgcmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgfGJufCBhcyBhIHNpbmdsZSB3b3JkLiBJZiB8Ym58IGlzCisgKiB0b28gbGFyZ2UgdG8gYmUgcmVwcmVzZW50ZWQgYXMgYSBzaW5nbGUgd29yZCwgdGhlIG1heGltdW0gcG9zc2libGUgdmFsdWUKKyAqIHdpbGwgYmUgcmV0dXJuZWQuICovCitCTl9VTE9ORyBCTl9nZXRfd29yZChjb25zdCBCSUdOVU0gKmJuKTsKKworCisvKiBCSUdOVU0gcG9vbHMuCisgKgorICogQ2VydGFpbiBCSUdOVU0gb3BlcmF0aW9ucyBuZWVkIHRvIHVzZSBtYW55IHRlbXBvcmFyeSB2YXJpYWJsZXMgYW5kCisgKiBhbGxvY2F0aW5nIGFuZCBmcmVlaW5nIHRoZW0gY2FuIGJlIHF1aXRlIHNsb3cuIFRodXMgc3VjaCBvcGVydGlvbnMgdHlwaWNhbGx5CisgKiB0YWtlIGEgfEJOX0NUWHwgcGFyYW1ldGVyLCB3aGljaCBjb250YWlucyBhIHBvb2wgb2YgfEJJR05VTXN8LiBUaGUgfGN0eHwKKyAqIGFyZ3VtZW50IHRvIGEgcHVibGljIGZ1bmN0aW9uIG1heSBiZSBOVUxMLCBpbiB3aGljaCBjYXNlIGEgbG9jYWwgfEJOX0NUWHwKKyAqIHdpbGwgYmUgY3JlYXRlZCBqdXN0IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhhdCBjYWxsLgorICoKKyAqIEEgZnVuY3Rpb24gbXVzdCBjYWxsIHxCTl9DVFhfc3RhcnR8IGZpcnN0LiBUaGVuLCB8Qk5fQ1RYX2dldHwgbWF5IGJlIGNhbGxlZAorICogcmVwZWF0ZWRseSB0byBvYnRhaW4gdGVtcG9yYXJ5IHxCSUdOVU18cy4gQWxsIHxCTl9DVFhfZ2V0fCBjYWxscyBtdXN0IGJlIG1hZGUKKyAqIGJlZm9yZSBjYWxsaW5nIGFueSBvdGhlciBmdW5jdGlvbnMgdGhhdCB1c2UgdGhlIHxjdHh8IGFzIGFuIGFyZ3VtZW50LgorICoKKyAqIEZpbmFsbHksIHxCTl9DVFhfZW5kfCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgcmV0dXJuaW5nIGZyb20gdGhlIGZ1bmN0aW9uLgorICogV2hlbiB8Qk5fQ1RYX2VuZHwgaXMgY2FsbGVkLCB0aGUgfEJJR05VTXwgcG9pbnRlcnMgb2J0YWluZWQgZnJvbQorICogfEJOX0NUWF9nZXR8IGJlY29tZSBpbnZhbGlkLiAqLworCisvKiBCTl9DVFhfbmV3IHJldHVybnMgYSBuZXcsIGVtcHR5IEJOX0NUWCBvciBOVUxMIG9uIGFsbG9jYXRpb24gZmFpbHVyZS4gKi8KK0JOX0NUWCAqQk5fQ1RYX25ldyh2b2lkKTsKKworLyogQk5fQ1RYX2ZyZWUgZnJlZXMgYWxsIEJJR05VTXMgY29udGFpbmVkIGluIHxjdHh8IGFuZCB0aGVuIGZyZWVzIHxjdHh8CisgKiBpdHNlbGYuICovCit2b2lkIEJOX0NUWF9mcmVlKEJOX0NUWCAqY3R4KTsKKworLyogQk5fQ1RYX3N0YXJ0ICJwdXNoZXMiIGEgbmV3IGVudHJ5IG9udG8gdGhlIHxjdHh8IHN0YWNrIGFuZCBhbGxvd3MgZnV0dXJlCisgKiBjYWxscyB0byB8Qk5fQ1RYX2dldHwuICovCit2b2lkIEJOX0NUWF9zdGFydChCTl9DVFggKmN0eCk7CisKKy8qIEJOX0NUWF9nZXQgcmV0dXJucyBhIG5ldyB8QklHTlVNfCwgb3IgTlVMTCBvbiBhbGxvY2F0aW9uIGZhaWx1cmUuIE9uY2UKKyAqIHxCTl9DVFhfZ2V0fCBoYXMgcmV0dXJuZWQgTlVMTCwgYWxsIGZ1dHVyZSBjYWxscyB3aWxsIGFsc28gcmV0dXJuIE5VTEwgdW50aWwKKyAqIHxCTl9DVFhfZW5kfCBpcyBjYWxsZWQuICovCitCSUdOVU0gKkJOX0NUWF9nZXQoQk5fQ1RYICpjdHgpOworCisvKiBCTl9DVFhfZW5kIGludmFsaWRhdGVzIGFsbCB8QklHTlVNfHMgcmV0dXJuZWQgZnJvbSB8Qk5fQ1RYX2dldHwgc2luY2UgdGhlCisgKiBtYXRjaGluZyB8Qk5fQ1RYX3N0YXJ0fCBjYWxsLiAqLwordm9pZCBCTl9DVFhfZW5kKEJOX0NUWCAqY3R4KTsKKworCisvKiBTaW1wbGUgYXJpdGhtZXRpYyAqLworCisvKiBCTl9hZGQgc2V0cyB8cnwgPSB8YXwgKyB8YnwsIHdoZXJlIHxyfCBtYXkgYmUgdGhlIHNhbWUgcG9pbnRlciBhcyBlaXRoZXIgfGF8CisgKiBvciB8YnwuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24gYWxsb2NhdGlvbiBmYWlsdXJlLiAqLworaW50IEJOX2FkZChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiKTsKKworLyogQk5fdWFkZCBzZXRzIHxyfCA9IHxhfCArIHxifCwgd2hlcmUgfGF8IGFuZCB8YnwgYXJlIG5vbi1uZWdhdGl2ZSBhbmQgfHJ8IG1heQorICogYmUgdGhlIHNhbWUgcG9pbnRlciBhcyBlaXRoZXIgfGF8IG9yIHxifC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybworICogb24gYWxsb2NhdGlvbiBmYWlsdXJlLiAqLworaW50IEJOX3VhZGQoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYik7CisKKy8qIEJOX2FkZF93b3JkIGFkZHMgfHd8IHRvIHxhfC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvdGhlcndpc2UuICovCitpbnQgQk5fYWRkX3dvcmQoQklHTlVNICphLCBCTl9VTE9ORyB3KTsKKworLyogQk5fc3ViIHNldHMgfHJ8ID0gfGF8ICsgfGJ8LCB3aGVyZSB8cnwgbXVzdCBiZSBhIGRpc3RpbmN0IHBvaW50ZXIgZnJvbSB8YXwKKyAqIGFuZCB8YnwuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24gYWxsb2NhdGlvbiBmYWlsdXJlLiAqLworaW50IEJOX3N1YihCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiKTsKKworLyogQk5fdXN1YiBzZXRzIHxyfCA9IHxhfCArIHxifCwgd2hlcmUgfGF8IGFuZCB8YnwgYXJlIG5vbi1uZWdhdGl2ZSBpbnRlZ2VycywKKyAqIHxifCA8IHxhfCBhbmQgfHJ8IG11c3QgYmUgYSBkaXN0aW5jdCBwb2ludGVyIGZyb20gfGF8IGFuZCB8YnwuIEl0IHJldHVybnMKKyAqIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG9uIGFsbG9jYXRpb24gZmFpbHVyZS4gKi8KK2ludCBCTl91c3ViKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIpOworCisvKiBCTl9zdWJfd29yZCBzdWJ0cmFjdHMgfHd8IGZyb20gfGF8LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG9uCisgKiBhbGxvY2F0aW9uIGZhaWx1cmUuICovCitpbnQgQk5fc3ViX3dvcmQoQklHTlVNICphLCBCTl9VTE9ORyB3KTsKKworLyogQk5fbXVsIHNldHMgfHJ8ID0gfGF8ICogfGJ8LCB3aGVyZSB8cnwgbWF5IGJlIHRoZSBzYW1lIHBvaW50ZXIgYXMgfGF8IG9yCisgKiB8YnwuIFJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb3RoZXJ3aXNlLiAqLworaW50IEJOX211bChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLCBCTl9DVFggKmN0eCk7CisKKy8qIEJOX211bF93b3JkIHNldHMgfGJufCA9IHxibnwgKiB8d3wuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3Mgb3IgemVybyBvbgorICogYWxsb2NhdGlvbiBmYWlsdXJlLiAqLworaW50IEJOX211bF93b3JkKEJJR05VTSAqYm4sIEJOX1VMT05HIHcpOworCisvKiBCTl9zcXIgc2V0cyB8cnwgPSB8YXxeMiAoaS5lLiBzcXVhcmVzKSwgd2hlcmUgfHJ8IG1heSBiZSB0aGUgc2FtZSBwb2ludGVyIGFzCisgKiB8YXwuIFJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb3RoZXJ3aXNlLiBUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4KKyAqIEJOX211bChyLCBhLCBhLCBjdHgpLiAqLworaW50IEJOX3NxcihCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgQk5fQ1RYICpjdHgpOworCisvKiBCTl9kaXYgZGl2aWRlcyB8bnVtZXJhdG9yfCBieSB8ZGl2aXNvcnwgYW5kIHBsYWNlcyB0aGUgcmVzdWx0IGluIHxxdW90aWVudHwKKyAqIGFuZCB0aGUgcmVtYWluZGVyIGluIHxyZW18LiBFaXRoZXIgb2YgfHF1b3RpZW50fCBvciB8cmVtfCBtYXkgYmUgTlVMTCwgaW4KKyAqIHdoaWNoIGNhc2UgdGhlIHJlc3BlY3RpdmUgdmFsdWUgaXMgbm90IHJldHVybmVkLiBUaGUgcmVzdWx0IGlzIHJvdW5kZWQKKyAqIHRvd2FyZHMgemVybzsgdGh1cyBpZiB8bnVtZXJhdG9yfCBpcyBuZWdhdGl2ZSwgdGhlIHJlbWFpbmRlciB3aWxsIGJlIHplcm8gb3IKKyAqIG5lZ2F0aXZlLiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIG9yIHplcm8gb24gZXJyb3IuICovCitpbnQgQk5fZGl2KEJJR05VTSAqcXVvdGllbnQsIEJJR05VTSAqcmVtLCBjb25zdCBCSUdOVU0gKm51bWVyYXRvciwKKyAgICAgICAgICAgY29uc3QgQklHTlVNICpkaXZpc29yLCBCTl9DVFggKmN0eCk7CisKKy8qIEJOX2Rpdl93b3JkIHNldHMgfG51bWVyYXRvcnwgPSB8bnVtZXJhdG9yfC98ZGl2aXNvcnwgYW5kIHJldHVybnMgdGhlCisgKiByZW1haW5kZXIgb3IgKEJOX1VMT05HKS0xIG9uIGVycm9yLiAqLworQk5fVUxPTkcgQk5fZGl2X3dvcmQoQklHTlVNICpudW1lcmF0b3IsIEJOX1VMT05HIGRpdmlzb3IpOworCisKKy8qIENvbXBhcmlzb24gZnVuY3Rpb25zICovCisKKy8qIEJOX2NtcCByZXR1cm5zIGEgdmFsdWUgbGVzcyB0aGFuLCBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4gemVybyBpZiB8YXwgaXMKKyAqIGxlc3MgdGhhbiwgZXF1YWwgdG8gb3IgZ3JlYXRlciB0aGFuIHxifCwgcmVzcGVjdGl2ZWx5LiAqLworaW50IEJOX2NtcChjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYik7CisKKy8qIEJOX3VjbXAgcmV0dXJucyBhIHZhbHVlIGxlc3MgdGhhbiwgZXF1YWwgdG8gb3IgZ3JlYXRlciB0aGFuIHplcm8gaWYgdGhlCisgKiBhYnNvbHV0ZSB2YWx1ZSBvZiB8YXwgaXMgbGVzcyB0aGFuLCBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4gdGhlIGFic29sdXRlCisgKiB2YWx1ZSBvZiB8YnwsIHJlc3BlY3RpdmVseS4gKi8KK2ludCBCTl91Y21wKGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiKTsKKworLyogQk5fYWJzX2lzX3dvcmQgcmV0dXJucyBvbmUgaWYgdGhlIGFic29sdXRlIHZhbHVlIG9mIHxibnwgZXF1YWxzIHx3fCBhbmQgemVybworICogb3RoZXJ3aXNlLiAqLworaW50IEJOX2Fic19pc193b3JkKGNvbnN0IEJJR05VTSAqYm4sIEJOX1VMT05HIHcpOworCisvKiBCTl9pc196ZXJvIHJldHVybnMgb25lIGlmIHxibnwgaXMgemVybyBhbmQgemVybyBvdGhlcndpc2UuICovCitpbnQgQk5faXNfemVybyhjb25zdCBCSUdOVU0gKmJuKTsKKworLyogQk5faXNfb25lIHJldHVybnMgb25lIGlmIHxibnwgZXF1YWxzIG9uZSBhbmQgemVybyBvdGhlcndpc2UuICovCitpbnQgQk5faXNfb25lKGNvbnN0IEJJR05VTSAqYm4pOworCisvKiBCTl9pc193b3JkIHJldHVybnMgb25lIGlmIHxibnwgaXMgZXhhY3RseSB8d3wgYW5kIHplcm8gb3RoZXJ3aXNlLiAqLworaW50IEJOX2lzX3dvcmQoY29uc3QgQklHTlVNICpibiwgQk5fVUxPTkcgdyk7CisKKy8qIEJOX2lzX29kZCByZXR1cm5zIG9uZSBpZiB8Ym58IGlzIG9kZCBhbmQgemVybyBvdGhlcndpc2UuICovCitpbnQgQk5faXNfb2RkKGNvbnN0IEJJR05VTSAqYm4pOworCisKKy8qIEJpdHdpc2Ugb3BlcmF0aW9ucy4gKi8KKworLyogQk5fbHNoaWZ0IHNldHMgfHJ8IGVxdWFsIHRvIHxhfCA8PCBuLiBUaGUgfGF8IGFuZCB8cnwgYXJndW1lbnRzIG1heSBiZSB0aGUKKyAqIHNhbWUgfEJJR05VTXwuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24gYWxsb2NhdGlvbiBmYWlsdXJlLiAqLworaW50IEJOX2xzaGlmdChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgaW50IG4pOworCisvKiBCTl9sc2hpZnQxIHNldHMgfHJ8IGVxdWFsIHRvIHxhfCA8PCAxLCB3aGVyZSB8cnwgYW5kIHxhfCBtYXkgYmUgdGhlIHNhbWUKKyAqIHBvaW50ZXIuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24gYWxsb2NhdGlvbiBmYWlsdXJlLiAqLworaW50IEJOX2xzaGlmdDEoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEpOworCisvKiBCTl9yc2hpZnQgc2V0cyB8cnwgZXF1YWwgdG8gfGF8ID4+IG4sIHdoZXJlIHxyfCBhbmQgfGF8IG1heSBiZSB0aGUgc2FtZQorICogcG9pbnRlci4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbiBhbGxvY2F0aW9uIGZhaWx1cmUuICovCitpbnQgQk5fcnNoaWZ0KEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBpbnQgbik7CisKKy8qIEJOX3JzaGlmdDEgc2V0cyB8cnwgZXF1YWwgdG8gfGF8ID4+IDEsIHdoZXJlIHxyfCBhbmQgfGF8IG1heSBiZSB0aGUgc2FtZQorICogcG9pbnRlci4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbiBhbGxvY2F0aW9uIGZhaWx1cmUuICovCitpbnQgQk5fcnNoaWZ0MShCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSk7CisKKy8qIEJOX3NldF9iaXQgc2V0cyB0aGUgfG58dGgsIGxlYXN0LXNpZ25pZmljYW50IGJpdCBpbiB8YXwuIEZvciBleGFtcGxlLCBpZiB8YXwKKyAqIGlzIDIgdGhlbiBzZXR0aW5nIGJpdCB6ZXJvIHdpbGwgbWFrZSBpdCAzLiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIG9yIHplcm8KKyAqIG9uIGFsbG9jYXRpb24gZmFpbHVyZS4gKi8KK2ludCBCTl9zZXRfYml0KEJJR05VTSAqYSwgaW50IG4pOworCisvKiBCTl9jbGVhcl9iaXQgY2xlYXJzIHRoZSB8bnx0aCwgbGVhc3Qtc2lnbmlmaWNhbnQgYml0IGluIHxhfC4gRm9yIGV4YW1wbGUsIGlmCisgKiB8YXwgaXMgMywgY2xlYXJpbmcgYml0IHplcm8gd2lsbCBtYWtlIGl0IHR3by4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBvcgorICogemVybyBvbiBhbGxvY2F0aW9uIGZhaWx1cmUuICovCitpbnQgQk5fY2xlYXJfYml0KEJJR05VTSAqYSwgaW50IG4pOworCisvKiBCTl9pc19iaXRfc2V0IHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSB8bnx0aCwgbGVhc3Qtc2lnbmlmaWNhbnQgYml0IGluIHxhfCwKKyAqIG9yIHplcm8gaWYgdGhlIGJpdCBkb2Vzbid0IGV4aXN0LiAqLworaW50IEJOX2lzX2JpdF9zZXQoY29uc3QgQklHTlVNICphLCBpbnQgbik7CisKKy8qIEJOX21hc2tfYml0cyB0cnVuY2F0ZXMgfGF8IHNvIHRoYXQgaXQgaXMgb25seSB8bnwgYml0cyBsb25nLiBJdCByZXR1cm5zIG9uZQorICogb24gc3VjY2VzcyBvciB6ZXJvIGlmIHxufCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB8YXwgYWxyZWFkeS4gKi8KK2ludCBCTl9tYXNrX2JpdHMoQklHTlVNICphLCBpbnQgbik7CisKKworLyogTW9kdWxvIGFyaXRobWV0aWMuICovCisKKy8qIEJOX21vZF93b3JkIHJldHVybnMgfGF8IG1vZCB8d3wuICovCitCTl9VTE9ORyBCTl9tb2Rfd29yZChjb25zdCBCSUdOVU0gKmEsIEJOX1VMT05HIHcpOworCisvKiBCTl9tb2QgaXMgYSBoZWxwZXIgbWFjcm8gdGhhdCBjYWxscyB8Qk5fZGl2fCBhbmQgZGlzY2FyZHMgdGhlIHF1b3RpZW50LiAqLworI2RlZmluZSBCTl9tb2QocmVtLCBudW1lcmF0b3IsIGRpdmlzb3IsIGN0eCkgXAorICBCTl9kaXYoTlVMTCwgKHJlbSksIChudW1lcmF0b3IpLCAoZGl2aXNvciksIChjdHgpKQorCisvKiBCTl9ubm1vZCBpcyBhIG5vbi1uZWdhdGl2ZSBtb2R1bG8gZnVuY3Rpb24uIEl0IGFjdHMgbGlrZSB8Qk5fbW9kfCwgYnV0IDAgPD0KKyAqIHxyZW18IDwgfGRpdmlzb3J8IGlzIGFsd2F5cyB0cnVlLiAqLworaW50IEJOX25ubW9kKEJJR05VTSAqcmVtLCBjb25zdCBCSUdOVU0gKm51bWVyYXRvciwgY29uc3QgQklHTlVNICpkaXZpc29yLAorICAgICAgICAgICAgIEJOX0NUWCAqY3R4KTsKKworLyogQk5fbW9kX2FkZCBzZXRzIHxyfCA9IHxhfCArIHxifCBtb2QgfG18LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvCisgKiBvbiBlcnJvci4gKi8KK2ludCBCTl9tb2RfYWRkKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIsIGNvbnN0IEJJR05VTSAqbSwKKyAgICAgICAgICAgICAgIEJOX0NUWCAqY3R4KTsKKworLyogQk5fbW9kX2FkZF9xdWljayBhY3RzIGxpa2UgfEJOX21vZF9hZGR8IGJ1dCByZXF1aXJlcyB0aGF0IHxhfCBhbmQgfGJ8IGJlCisgKiBub24tbmVnYXRpdmUgYW5kIGxlc3MgdGhhbiB8bXwuICovCitpbnQgQk5fbW9kX2FkZF9xdWljayhCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQklHTlVNICptKTsKKworLyogQk5fbW9kX3N1YiBzZXRzIHxyfCA9IHxhfCAtIHxifCBtb2QgfG18LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvCisgKiBvbiBlcnJvci4gKi8KK2ludCBCTl9tb2Rfc3ViKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIsIGNvbnN0IEJJR05VTSAqbSwKKyAgICAgICAgICAgICAgIEJOX0NUWCAqY3R4KTsKKworLyogQk5fbW9kX3N1Yl9xdWljayBhY3RzIGxpa2UgfEJOX21vZF9zdWJ8IGJ1dCByZXF1aXJlcyB0aGF0IHxhfCBhbmQgfGJ8IGJlCisgKiBub24tbmVnYXRpdmUgYW5kIGxlc3MgdGhhbiB8bXwuICovCitpbnQgQk5fbW9kX3N1Yl9xdWljayhCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQklHTlVNICptKTsKKworLyogQk5fbW9kX211bCBzZXRzIHxyfCA9IHxhfCp8YnwgbW9kIHxtfC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybworICogb24gZXJyb3IuICovCitpbnQgQk5fbW9kX211bChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLCBjb25zdCBCSUdOVU0gKm0sCisgICAgICAgICAgICAgICBCTl9DVFggKmN0eCk7CisKKy8qIEJOX21vZF9tdWwgc2V0cyB8cnwgPSB8YXxeMiBtb2QgfG18LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvCisgKiBvbiBlcnJvci4gKi8KK2ludCBCTl9tb2Rfc3FyKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4KTsKKworLyogQk5fbW9kX2xzaGlmdCBzZXRzIHxyfCA9ICh8YXwgPDwgbikgbW9kIHxtfCwgd2hlcmUgfHJ8IGFuZCB8YXwgbWF5IGJlIHRoZQorICogc2FtZSBwb2ludGVyLiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG9uIGVycm9yLiAqLworaW50IEJOX21vZF9sc2hpZnQoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGludCBuLCBjb25zdCBCSUdOVU0gKm0sCisgICAgICAgICAgICAgICAgICBCTl9DVFggKmN0eCk7CisKKy8qIEJOX21vZF9sc2hpZnRfcXVpY2sgYWN0cyBsaWtlIHxCTl9tb2RfbHNoaWZ0fCBidXQgcmVxdWlyZXMgdGhhdCB8YXwgYmUKKyAqIG5vbi1uZWdhdGl2ZSBhbmQgbGVzcyB0aGFuIHxtfC4gKi8KK2ludCBCTl9tb2RfbHNoaWZ0X3F1aWNrKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBpbnQgbiwgY29uc3QgQklHTlVNICptKTsKKworLyogQk5fbW9kX2xzaGlmdDEgc2V0cyB8cnwgPSAofGF8IDw8IDEpIG1vZCB8bXwsIHdoZXJlIHxyfCBhbmQgfGF8IG1heSBiZSB0aGUKKyAqIHNhbWUgcG9pbnRlci4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbiBlcnJvci4gKi8KK2ludCBCTl9tb2RfbHNoaWZ0MShCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICptLCBCTl9DVFggKmN0eCk7CisKKy8qIEJOX21vZF9sc2hpZnQxX3F1aWNrIGFjdHMgbGlrZSB8Qk5fbW9kX2xzaGlmdDF8IGJ1dCByZXF1aXJlcyB0aGF0IHxhfCBiZQorICogbm9uLW5lZ2F0aXZlIGFuZCBsZXNzIHRoYW4gfG18LiAqLworaW50IEJOX21vZF9sc2hpZnQxX3F1aWNrKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKm0pOworCisvKiBCTl9tb2Rfc3FydCByZXR1cm5zIGEgfEJJR05VTXwsIHIsIHN1Y2ggdGhhdCByXjIgPT0gYSAobW9kIHApLiAqLworQklHTlVNICpCTl9tb2Rfc3FydChCSUdOVU0gKmluLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqcCwgQk5fQ1RYICpjdHgpOworCisKKy8qIFJhbmRvbSBhbmQgcHJpbWUgbnVtYmVyIGdlbmVyYXRpb24uICovCisKKy8qIEJOX3JhbmQgc2V0cyB8cm5kfCB0byBhIHJhbmRvbSBudW1iZXIgb2YgbGVuZ3RoIHxiaXRzfC4gSWYgfHRvcHwgaXMgemVybywKKyAqIHRoZSBtb3N0LXNpZ25pZmljYW50IGJpdCB3aWxsIGJlIHNldC4gSWYgfHRvcHwgaXMgb25lLCB0aGUgdHdvIG1vc3QKKyAqIHNpZ25pZmljYW50IGJpdHMgd2lsbCBiZSBzZXQuCisgKgorICogSWYgfHRvcHwgaXMgLTEgdGhlbiBubyBleHRyYSBhY3Rpb24gd2lsbCBiZSB0YWtlbiBhbmQgfEJOX251bV9iaXRzKHJuZCl8IG1heQorICogbm90IGVxdWFsIHxiaXRzfCBpZiB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXRzIHJhbmRvbWx5IGVuZGVkIHVwIGFzIHplcm9zLgorICoKKyAqIElmIHxib3R0b218IGlzIG5vbi16ZXJvLCB0aGUgbGVhc3Qtc2lnbmlmaWNhbnQgYml0IHdpbGwgYmUgc2V0LiBUaGUgZnVuY3Rpb24KKyAqIHJldHVybnMgb25lIG9uIHN1Y2Nlc3Mgb3IgemVybyBvdGhlcndpc2UuICovCitpbnQgQk5fcmFuZChCSUdOVU0gKnJuZCwgaW50IGJpdHMsIGludCB0b3AsIGludCBib3R0b20pOworCisvKiBCTl9wc2V1ZG9fcmFuZCBpcyBhbiBhbGlhcyBmb3IgfEJOX3JhbmR8LiAqLworaW50IEJOX3BzZXVkb19yYW5kKEJJR05VTSAqcm5kLCBpbnQgYml0cywgaW50IHRvcCwgaW50IGJvdHRvbSk7CisKKy8qIEJOX3JhbmRfcmFuZ2Ugc2V0cyB8cm5kfCB0byBhIHJhbmRvbSB2YWx1ZSBbMC4ucmFuZ2UpLiBJdCByZXR1cm5zIG9uZSBvbgorICogc3VjY2VzcyBhbmQgemVybyBvdGhlcndpc2UuICovCitpbnQgQk5fcmFuZF9yYW5nZShCSUdOVU0gKnJuZCwgY29uc3QgQklHTlVNICpyYW5nZSk7CisKKy8qIEJOX3BzZXVkb19yYW5kX3JhbmdlIGlzIGFuIGFsaWFzIGZvciBCTl9yYW5kX3JhbmdlLiAqLworaW50IEJOX3BzZXVkb19yYW5kX3JhbmdlKEJJR05VTSAqcm5kLCBjb25zdCBCSUdOVU0gKnJhbmdlKTsKKworLyogQk5fR0VOQ0IgaG9sZHMgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIHVzZWQgYnkgZ2VuZXJhdGlvbiBmdW5jdGlvbnMgdGhhdAorICogY2FuIHRha2UgYSB2ZXJ5IGxvbmcgdGltZSB0byBjb21wbGV0ZS4gVXNlIHxCTl9HRU5DQl9zZXR8IHRvIGluaXRpYWxpc2UgYQorICogfEJOX0dFTkNCfCBzdHJ1Y3R1cmUuCisgKgorICogVGhlIGNhbGxiYWNrIHJlY2VpdmVzIHRoZSBhZGRyZXNzIG9mIHRoYXQgfEJOX0dFTkNCfCBzdHJ1Y3R1cmUgYXMgaXRzIGxhc3QKKyAqIGFyZ3VtZW50IGFuZCB0aGUgdXNlciBpcyBmcmVlIHRvIHB1dCBhbiBhcmJpdGFyeSBwb2ludGVyIGluIHxhcmd8LiBUaGUgb3RoZXIKKyAqIGFyZ3VtZW50cyBhcmUgc2V0IGFzIGZvbGxvd3M6CisgKiAgIGV2ZW50PUJOX0dFTkNCX0dFTkVSQVRFRCwgbj1pOiAgIGFmdGVyIGdlbmVyYXRpbmcgdGhlIGkndGggcG9zc2libGUgcHJpbWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyLgorICogICBldmVudD1CTl9HRU5DQl9QUklNRV9URVNULCBuPS0xOiB3aGVuIGZpbmlzaGVkIHRyaWFsIGRpdmlzaW9uIHByaW1hbGl0eQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja3MuCisgKiAgIGV2ZW50PUJOX0dFTkNCX1BSSU1FX1RFU1QsIG49aTogIHdoZW4gdGhlIGkndGggcHJpbWFsaXR5IHRlc3QgaGFzIGZpbmlzaGVkLgorICoKKyAqIFRoZSBjYWxsYmFjayBjYW4gcmV0dXJuIHplcm8gdG8gYWJvcnQgdGhlIGdlbmVyYXRpb24gcHJvZ3Jlc3Mgb3Igb25lIHRvCisgKiBhbGxvdyBpdCB0byBjb250aW51ZS4KKyAqCisgKiBXaGVuIG90aGVyIGNvZGUgbmVlZHMgdG8gY2FsbCBhIEJOIGdlbmVyYXRpb24gZnVuY3Rpb24gaXQgd2lsbCBvZnRlbiB0YWtlIGEKKyAqIEJOX0dFTkNCIGFyZ3VtZW50IGFuZCBtYXkgY2FsbCB0aGUgZnVuY3Rpb24gd2l0aCBvdGhlciBhcmd1bWVudCB2YWx1ZXMuICovCisjZGVmaW5lIEJOX0dFTkNCX0dFTkVSQVRFRCAwCisjZGVmaW5lIEJOX0dFTkNCX1BSSU1FX1RFU1QgMQorCitzdHJ1Y3QgYm5fZ2VuY2Jfc3QgeworICB2b2lkICphcmc7ICAgICAgICAvKiBjYWxsYmFjay1zcGVjaWZpYyBkYXRhICovCisgIGludCAoKmNhbGxiYWNrKShpbnQgZXZlbnQsIGludCBuLCBzdHJ1Y3QgYm5fZ2VuY2Jfc3QgKik7Cit9OworCisvKiBCTl9HRU5DQl9zZXQgY29uZmlndXJlcyB8Y2FsbGJhY2t8IHRvIGNhbGwgfGZ8IGFuZCBzZXRzIHxjYWxsb3V0LT5hcmd8IHRvCisgKiB8YXJnfC4gKi8KK3ZvaWQgQk5fR0VOQ0Jfc2V0KEJOX0dFTkNCICpjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgIGludCAoKmYpKGludCBldmVudCwgaW50IG4sIHN0cnVjdCBibl9nZW5jYl9zdCAqKSwKKyAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZyk7CisKKy8qIEJOX0dFTkNCX2NhbGwgY2FsbHMgfGNhbGxiYWNrfCwgaWYgbm90IE5VTEwsIGFuZCByZXR1cm5zIHRoZSByZXR1cm4gdmFsdWUgb2YKKyAqIHRoZSBjYWxsYmFjaywgb3IgMSBpZiB8Y2FsbGJhY2t8IGlzIE5VTEwuICovCitpbnQgQk5fR0VOQ0JfY2FsbChCTl9HRU5DQiAqY2FsbGJhY2ssIGludCBldmVudCwgaW50IG4pOworCisvKiBCTl9nZW5lcmF0ZV9wcmltZV9leCBzZXRzIHxyZXR8IHRvIGEgcHJpbWUgbnVtYmVyIG9mIHxiaXRzfCBsZW5ndGguIElmIHNhZmUKKyAqIGlzIG5vbi16ZXJvIHRoZW4gdGhlIHByaW1lIHdpbGwgYmUgc3VjaCB0aGF0IChyZXQtMSkvMiBpcyBhbHNvIGEgcHJpbWUuCisgKiAoVGhpcyBpcyBuZWVkZWQgZm9yIERpZmZpZS1IZWxsbWFuIGdyb3VwcyB0byBlbnN1cmUgdGhhdCB0aGUgb25seSBzdWJncm91cHMKKyAqIGFyZSBvZiBzaXplIDIgYW5kIChwLTEpLzIuKS4KKyAqCisgKiBJZiB8YWRkfCBpcyBub3QgTlVMTCwgdGhlIHByaW1lIHdpbGwgZnVsZmlsbCB0aGUgY29uZGl0aW9uIHxyZXR8ICUgfGFkZHwgPT0KKyAqIHxyZW18IGluIG9yZGVyIHRvIHN1aXQgYSBnaXZlbiBnZW5lcmF0b3IuIChJZiB8cmVtfCBpcyBOVUxMIHRoZW4gfHJldHwgJQorICogfGFkZHwgPT0gMS4pCisgKgorICogSWYgfGNifCBpcyBub3QgTlVMTCwgaXQgd2lsbCBiZSBjYWxsZWQgZHVyaW5nIHByb2Nlc3NpbmcgdG8gZ2l2ZSBhbgorICogaW5kaWNhdGlvbiBvZiBwcm9ncmVzcy4gU2VlIHRoZSBjb21tZW50cyBmb3IgfEJOX0dFTkNCfC4gSXQgcmV0dXJucyBvbmUgb24KKyAqIHN1Y2Nlc3MgYW5kIHplcm8gb3RoZXJ3aXNlLiAqLworaW50IEJOX2dlbmVyYXRlX3ByaW1lX2V4KEJJR05VTSAqcmV0LCBpbnQgYml0cywgaW50IHNhZmUsIGNvbnN0IEJJR05VTSAqYWRkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJJR05VTSAqcmVtLCBCTl9HRU5DQiAqY2IpOworCisvKiBCTl9wcmltZV9jaGVja3MgaXMgbWFnaWMgdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCBhcyB0aGUgfGNoZWNrc3wgYXJndW1lbnQgdG8KKyAqIHRoZSBwcmltYWxpdHkgdGVzdGluZyBmdW5jdGlvbnMgaW4gb3JkZXIgdG8gYXV0b21hdGljYWxseSBzZWxlY3QgYSBudW1iZXIgb2YKKyAqIE1pbGxlci1SYWJpbiBjaGVja3MgdGhhdCBnaXZlcyBhIGZhbHNlIHBvc2l0aXZlIHJhdGUgb2YgfjJeey04MH0uICovCisjZGVmaW5lIEJOX3ByaW1lX2NoZWNrcyAwCisKKy8qIEJOX3ByaW1hbGl0eV90ZXN0IHNldHMgfCppc19wcm9iYWJseV9wcmltZXwgdG8gb25lIGlmIHxjYW5kaWRhdGV8IGlzCisgKiBwcm9iYWJseSBhIHByaW1lIG51bWJlciBieSB0aGUgTWlsbGVyLVJhYmluIHRlc3Qgb3IgemVybyBpZiBpdCdzIGNlcnRhaW5seQorICogbm90LgorICoKKyAqIElmIHxkb190cmlhbF9kaXZpc2lvbnwgaXMgbm9uLXplcm8gdGhlbiB8Y2FuZGlkYXRlfCB3aWxsIGJlIHRlc3RlZCBhZ2FpbnN0IGEKKyAqIGxpc3Qgb2Ygc21hbGwgcHJpbWVzIGJlZm9yZSBNaWxsZXItUmFiaW4gdGVzdHMuIFRoZSBwcm9iYWJpbGl0eSBvZiB0aGlzCisgKiBmdW5jdGlvbiByZXR1cm5pbmcgYSBmYWxzZSBwb3NpdGl2ZSBpcyAyXnsyKmNoZWNrc30uIElmIHxjaGVja3N8IGlzCisgKiB8Qk5fcHJpbWVfY2hlY2tzfCB0aGVuIGEgdmFsdWUgdGhhdCByZXN1bHRzIGluIGFwcHJveGltYXRlbHkgMl57LTgwfSBmYWxzZQorICogcG9zaXRpdmUgcHJvYmFiaWxpdHkgaXMgdXNlZC4gSWYgfGNifCBpcyBub3QgTlVMTCB0aGVuIGl0IGlzIGNhbGxlZCBkdXJpbmcKKyAqIHRoZSBjaGVja2luZyBwcm9jZXNzLiBTZWUgdGhlIGNvbW1lbnQgYWJvdmUgfEJOX0dFTkNCfC4KKyAqCisgKiBUaGUgZnVuY3Rpb24gcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbiBlcnJvci4KKyAqCisgKiAoSWYgeW91IGFyZSB1bnN1cmUgd2hldGhlciB5b3Ugd2FudCB8ZG9fdHJpYWxfZGl2aXNpb258LCBkb24ndCBzZXQgaXQuKSAqLworaW50IEJOX3ByaW1hbGl0eV90ZXN0KGludCAqaXNfcHJvYmFibHlfcHJpbWUsIGNvbnN0IEJJR05VTSAqY2FuZGlkYXRlLAorICAgICAgICAgICAgICAgICAgICAgIGludCBjaGVja3MsIEJOX0NUWCAqY3R4LCBpbnQgZG9fdHJpYWxfZGl2aXNpb24sCisgICAgICAgICAgICAgICAgICAgICAgQk5fR0VOQ0IgKmNiKTsKKworLyogQk5faXNfcHJpbWVfZmFzdHRlc3RfZXggcmV0dXJucyBvbmUgaWYgfGNhbmRpZGF0ZXwgaXMgcHJvYmFibHkgYSBwcmltZQorICogbnVtYmVyIGJ5IHRoZSBNaWxsZXItUmFiaW4gdGVzdCwgemVybyBpZiBpdCdzIGNlcnRhaW5seSBub3QgYW5kIC0xIG9uIGVycm9yLgorICoKKyAqIElmIHxkb190cmlhbF9kaXZpc2lvbnwgaXMgbm9uLXplcm8gdGhlbiB8Y2FuZGlkYXRlfCB3aWxsIGJlIHRlc3RlZCBhZ2FpbnN0IGEKKyAqIGxpc3Qgb2Ygc21hbGwgcHJpbWVzIGJlZm9yZSBNaWxsZXItUmFiaW4gdGVzdHMuIFRoZSBwcm9iYWJpbGl0eSBvZiB0aGlzCisgKiBmdW5jdGlvbiByZXR1cm5pbmcgb25lIHdoZW4gfGNhbmRpZGF0ZXwgaXMgY29tcG9zaXRlIGlzIDJeezIqY2hlY2tzfS4gSWYKKyAqIHxjaGVja3N8IGlzIHxCTl9wcmltZV9jaGVja3N8IHRoZW4gYSB2YWx1ZSB0aGF0IHJlc3VsdHMgaW4gYXBwcm94aW1hdGVseQorICogMl57LTgwfSBmYWxzZSBwb3NpdGl2ZSBwcm9iYWJpbGl0eSBpcyB1c2VkLiBJZiB8Y2J8IGlzIG5vdCBOVUxMIHRoZW4gaXQgaXMKKyAqIGNhbGxlZCBkdXJpbmcgdGhlIGNoZWNraW5nIHByb2Nlc3MuIFNlZSB0aGUgY29tbWVudCBhYm92ZSB8Qk5fR0VOQ0J8LgorICoKKyAqIFdBUk5JTkc6IGRlcHJlY2F0ZWQuIFVzZSB8Qk5fcHJpbWFsaXR5X3Rlc3R8LiAqLworaW50IEJOX2lzX3ByaW1lX2Zhc3R0ZXN0X2V4KGNvbnN0IEJJR05VTSAqY2FuZGlkYXRlLCBpbnQgY2hlY2tzLCBCTl9DVFggKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZG9fdHJpYWxfZGl2aXNpb24sIEJOX0dFTkNCICpjYik7CisKKy8qIEJOX2lzX3ByaW1lX2V4IGFjdHMgdGhlIHNhbWUgYXMgfEJOX2lzX3ByaW1lX2Zhc3R0ZXN0X2V4fCB3aXRoCisgKiB8ZG9fdHJpYWxfZGl2aXNpb258IHNldCB0byB6ZXJvLgorICoKKyAqIFdBUk5JTkc6IGRlcHJlY2F0ZWQ6IFVzZSB8Qk5fcHJpbWFsaXR5X3Rlc3R8LiAqLworaW50IEJOX2lzX3ByaW1lX2V4KGNvbnN0IEJJR05VTSAqY2FuZGlkYXRlLCBpbnQgY2hlY2tzLCBCTl9DVFggKmN0eCwKKyAgICAgICAgICAgICAgICAgICBCTl9HRU5DQiAqY2IpOworCisKKy8qIE51bWJlciB0aGVvcnkgZnVuY3Rpb25zICovCisKKy8qIEJOX2djZCBzZXRzIHxyfCA9IGdjZCh8YXwsIHxifCkuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8KKyAqIG90aGVyd2lzZS4gKi8KK2ludCBCTl9nY2QoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYiwgQk5fQ1RYICpjdHgpOworCisvKiBCTl9tb2RfaW52ZXJzZSBzZXRzIHxvdXR8IGVxdWFsIHRvIHxhfF4tMSwgbW9kIHxufC4gSWYgZWl0aGVyIG9mIHxhfCBvciB8bnwKKyAqIGhhdmUgfEJOX0ZMR19DT05TVFRJTUV8IHNldCB0aGVuIHRoZSBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIGluIGNvbnN0YW50CisgKiB0aW1lLiBJZiB8b3V0fCBpcyBOVUxMLCBhIGZyZXNoIEJJR05VTSBpcyBhbGxvY2F0ZWQuIEl0IHJldHVybnMgdGhlIHJlc3VsdAorICogb3IgTlVMTCBvbiBlcnJvci4gKi8KK0JJR05VTSAqQk5fbW9kX2ludmVyc2UoQklHTlVNICpvdXQsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpuLAorICAgICAgICAgICAgICAgICAgICAgICBCTl9DVFggKmN0eCk7CisKKy8qIEJOX2tyb25lY2tlciByZXR1cm5zIHRoZSBLcm9uZWNrZXIgc3ltYm9sIG9mIHxhfCBhbmQgfGJ8ICh3aGljaCBpcyAtMSwgMCBvcgorICogMSksIG9yIC0yIG9uIGVycm9yLiAqLworaW50IEJOX2tyb25lY2tlcihjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYiwgQk5fQ1RYICpjdHgpOworCisKKy8qIE1vbnRnb21lcnkgYXJpdGhtZXRpYy4gKi8KKworLyogQk5fTU9OVF9DVFggY29udGFpbnMgdGhlIHByZWNvbXB1dGVkIHZhbHVlcyBuZWVkZWQgdG8gd29yayBpbiBhIHNwZWNpZmljCisgKiBNb250Z29tZXJ5IGRvbWFpbi4gKi8KKworLyogQk5fTU9OVF9DVFhfbmV3IHJldHVybnMgYSBmcmVzaCBCTl9NT05UX0NUWCBvciBOVUxMIG9uIGFsbG9jYXRpb24gZmFpbHVyZS4gKi8KK0JOX01PTlRfQ1RYICpCTl9NT05UX0NUWF9uZXcodm9pZCk7CisKKy8qIEJOX01PTlRfQ1RYX2luaXQgaW5pdGlhbGlzZXMgYSBzdGFjayBhbGxvY2F0ZWQgfEJOX01PTlRfQ1RYfC4gKi8KK3ZvaWQgQk5fTU9OVF9DVFhfaW5pdChCTl9NT05UX0NUWCAqbW9udCk7CisKKy8qIEJOX01PTlRfQ1RYX2ZyZWUgZnJlZXMgdGhlIGNvbnRleHRzIG9mIHxtb250fCBhbmQsIGlmIGl0IHdhcyBvcmlnaW5hbGx5CisgKiBhbGxvY2F0ZWQgd2l0aCB8Qk5fTU9OVF9DVFhfbmV3fCwgfG1vbnR8IGl0c2VsZi4gKi8KK3ZvaWQgQk5fTU9OVF9DVFhfZnJlZShCTl9NT05UX0NUWCAqbW9udCk7CisKKy8qIEJOX01PTlRfQ1RYX2NvcHkgc2V0cyB8dG98IGVxdWFsIHRvIHxmcm9tfC4gSXQgcmV0dXJucyB8dG98IG9uIHN1Y2Nlc3Mgb3IKKyAqIE5VTEwgb24gZXJyb3IuICovCitCTl9NT05UX0NUWCAqQk5fTU9OVF9DVFhfY29weShCTl9NT05UX0NUWCAqdG8sIEJOX01PTlRfQ1RYICpmcm9tKTsKKworLyogQk5fTU9OVF9DVFhfc2V0IHNldHMgdXAgYSBNb250Z29tZXJ5IGNvbnRleHQgZ2l2ZW4gdGhlIG1vZHVsdXMsIHxtb2R8LiBJdAorICogcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbiBlcnJvci4gKi8KK2ludCBCTl9NT05UX0NUWF9zZXQoQk5fTU9OVF9DVFggKm1vbnQsIGNvbnN0IEJJR05VTSAqbW9kLCBCTl9DVFggKmN0eCk7CisKKy8qIEJOX01PTlRfQ1RYX3NldF9sb2NrZWQgdGFrZXMgdGhlIGxvY2sgaW5kaWNhdGVkIGJ5IHxsb2NrfCBhbmQgY2hlY2tzIHdoZXRoZXIKKyAqIHwqcG1vbnR8IGlzIE5VTEwuIElmIHNvLCBpdCBjcmVhdGVzIGEgbmV3IHxCTl9NT05UX0NUWHwgYW5kIHNldHMgdGhlIG1vZHVsdXMKKyAqIGZvciBpdCB0byB8bW9kfC4gSXQgdGhlbiBzdG9yZXMgaXQgYXMgfCpwbW9udHwgYW5kIHJldHVybnMgaXQsIG9yIE5VTEwgb24KKyAqIGVycm9yLgorICoKKyAqIElmIHwqcG1vbnR8IGlzIGFscmVhZHkgbm9uLU5VTEwgdGhlbiB0aGUgZXhpc3RpbmcgdmFsdWUgaXMgcmV0dXJuZWQuICovCitCTl9NT05UX0NUWCAqQk5fTU9OVF9DVFhfc2V0X2xvY2tlZChCTl9NT05UX0NUWCAqKnBtb250LCBpbnQgbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJJR05VTSAqbW9kLCBCTl9DVFggKmN0eCk7CisKKy8qIEJOX3RvX21vbnRnb21lcnkgc2V0cyB8cmV0fCBlcXVhbCB0byB8YXwgaW4gdGhlIE1vbnRnb21lcnkgZG9tYWluLiBJdAorICogcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbiBlcnJvci4gKi8KK2ludCBCTl90b19tb250Z29tZXJ5KEJJR05VTSAqcmV0LCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJOX01PTlRfQ1RYICptb250LAorICAgICAgICAgICAgICAgICAgICAgQk5fQ1RYICpjdHgpOworCisvKiBCTl9mcm9tX21vbnRnb21lcnkgc2V0cyB8cmV0fCBlcXVhbCB0byB8YXwgKiBSXi0xLCBpLmUuIHRyYW5zbGF0ZXMgdmFsdWVzCisgKiBvdXQgb2YgdGhlIE1vbnRnb21lcnkgZG9tYWluLiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIG9yIHplcm8gb24gZXJyb3IuICovCitpbnQgQk5fZnJvbV9tb250Z29tZXJ5KEJJR05VTSAqcmV0LCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJOX01PTlRfQ1RYICptb250LAorICAgICAgICAgICAgICAgICAgICAgICBCTl9DVFggKmN0eCk7CisKKy8qIEJOX21vZF9tdWxfbW9udGdvbWVyeSBzZXQgfHJ8IGVxdWFsIHRvIHxhfCAqIHxifCwgaW4gdGhlIE1vbnRnb21lcnkgZG9tYWluLgorICogQm90aCB8YXwgYW5kIHxifCBtdXN0IGFscmVhZHkgYmUgaW4gdGhlIE1vbnRnb21lcnkgZG9tYWluIChieQorICogfEJOX3RvX21vbnRnb21lcnl8KS4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBvciB6ZXJvIG9uIGVycm9yLiAqLworaW50IEJOX21vZF9tdWxfbW9udGdvbWVyeShCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCTl9NT05UX0NUWCAqbW9udCwgQk5fQ1RYICpjdHgpOworCisKKy8qIEV4cG9uZW50aWF0aW9uLiAqLworCisvKiBCTl9leHAgc2V0cyB8cnwgZXF1YWwgdG8gfGF8Xnt8cHx9LiBJdCBkb2VzIHNvIHdpdGggYSBzcXVhcmUtYW5kLW11bHRpcGx5CisgKiBhbGdvcml0aG0gdGhhdCBsZWFrcyBzaWRlLWNoYW5uZWwgaW5mb3JtYXRpb24uIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3Mgb3IKKyAqIHplcm8gb3RoZXJ3aXNlLiAqLworaW50IEJOX2V4cChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpwLCBCTl9DVFggKmN0eCk7CisKKy8qIEJOX2V4cCBzZXRzIHxyfCBlcXVhbCB0byB8YXxee3xwfH0gbW9kIHxtfC4gSXQgZG9lcyBzbyB3aXRoIHRoZSBiZXN0CisgKiBhbGdvcml0aG0gZm9yIHRoZSB2YWx1ZXMgcHJvdmlkZWQgYW5kIGNhbiBydW4gaW4gY29uc3RhbnQgdGltZSBpZgorICogfEJOX0ZMR19DT05TVFRJTUV8IGlzIHNldCBmb3IgfHB8LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIG9yIHplcm8KKyAqIG90aGVyd2lzZS4gKi8KK2ludCBCTl9tb2RfZXhwKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKnAsIGNvbnN0IEJJR05VTSAqbSwKKyAgICAgICAgICAgICAgIEJOX0NUWCAqY3R4KTsKKworaW50IEJOX21vZF9leHBfbW9udChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpwLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4LCBCTl9NT05UX0NUWCAqbV9jdHgpOworCitpbnQgQk5fbW9kX2V4cF9tb250X2NvbnN0dGltZShCSUdOVU0gKnJyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJJR05VTSAqbSwgQk5fQ1RYICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTl9NT05UX0NUWCAqaW5fbW9udCk7CisKK2ludCBCTl9tb2RfZXhwX21vbnRfd29yZChCSUdOVU0gKnIsIEJOX1VMT05HIGEsIGNvbnN0IEJJR05VTSAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4LCBCTl9NT05UX0NUWCAqbV9jdHgpOworaW50IEJOX21vZF9leHAyX21vbnQoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmExLCBjb25zdCBCSUdOVU0gKnAxLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQklHTlVNICphMiwgY29uc3QgQklHTlVNICpwMiwgY29uc3QgQklHTlVNICptLAorICAgICAgICAgICAgICAgICAgICAgQk5fQ1RYICpjdHgsIEJOX01PTlRfQ1RYICptX2N0eCk7CitpbnQgQk5fbW9kX2V4cF9zaW1wbGUoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqcCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4KTsKKworCisKKy8qIFByaXZhdGUgZnVuY3Rpb25zICovCisKK3N0cnVjdCBiaWdudW1fc3QgeworICBCTl9VTE9ORyAqZDsgLyogUG9pbnRlciB0byBhbiBhcnJheSBvZiAnQk5fQklUUzInIGJpdCBjaHVua3MgaW4gbGl0dGxlLWVuZGlhbgorICAgICAgICAgICAgICAgICAgb3JkZXIuICovCisgIGludCB0b3A7ICAgLyogSW5kZXggb2YgbGFzdCB1c2VkIGVsZW1lbnQgaW4gfGR8LCBwbHVzIG9uZS4gKi8KKyAgaW50IGRtYXg7ICAvKiBTaXplIG9mIHxkfCwgaW4gd29yZHMuICovCisgIGludCBuZWc7ICAgLyogb25lIGlmIHRoZSBudW1iZXIgaXMgbmVnYXRpdmUgKi8KKyAgaW50IGZsYWdzOyAvKiBiaXRtYXNrIG9mIEJOX0ZMR18qIHZhbHVlcyAqLworfTsKKworc3RydWN0IGJuX21vbnRfY3R4X3N0IHsKKyAgQklHTlVNIFJSOyAvKiB1c2VkIHRvIGNvbnZlcnQgdG8gbW9udGdvbWVyeSBmb3JtICovCisgIEJJR05VTSBOOyAgLyogVGhlIG1vZHVsdXMgKi8KKyAgQklHTlVNIE5pOyAvKiBSKigxL1IgbW9kIE4pIC0gTipOaSA9IDEKKyAgICAgICAgICAgICAgKiAoTmkgaXMgb25seSBzdG9yZWQgZm9yIGJpZ251bSBhbGdvcml0aG0pICovCisgIEJOX1VMT05HIG4wWzJdOyAvKiBsZWFzdCBzaWduaWZpY2FudCB3b3JkKHMpIG9mIE5pOworICAgICAgICAgICAgICAgICAgICAgKHR5cGUgY2hhbmdlZCB3aXRoIDAuOS45LCB3YXMgIkJOX1VMT05HIG4wOyIgYmVmb3JlKSAqLworICBpbnQgZmxhZ3M7CisgIGludCByaTsgICAgLyogbnVtYmVyIG9mIGJpdHMgaW4gUiAqLworfTsKKwordW5zaWduZWQgQk5fbnVtX2JpdHNfd29yZChCTl9VTE9ORyBsKTsKKworI2RlZmluZSBCTl9GTEdfTUFMTE9DRUQgMHgwMQorI2RlZmluZSBCTl9GTEdfU1RBVElDX0RBVEEgMHgwMgorLyogYXZvaWQgbGVha2luZyBleHBvbmVudCBpbmZvcm1hdGlvbiB0aHJvdWdoIHRpbWluZywgQk5fbW9kX2V4cF9tb250KCkgd2lsbAorICogY2FsbCBCTl9tb2RfZXhwX21vbnRfY29uc3R0aW1lLCBCTl9kaXYoKSB3aWxsIGNhbGwgQk5fZGl2X25vX2JyYW5jaCwKKyAqIEJOX21vZF9pbnZlcnNlKCkgd2lsbCBjYWxsIEJOX21vZF9pbnZlcnNlX25vX2JyYW5jaC4gKi8KKyNkZWZpbmUgQk5fRkxHX0NPTlNUVElNRSAweDA0CisKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9ICAvKiBleHRlcm4gQyAqLworI2VuZGlmCisKKyNkZWZpbmUgQk5fRl9CTl9ibjJoZXggMTAwCisjZGVmaW5lIEJOX0ZfQk5fbmV3IDEwMQorI2RlZmluZSBCTl9GX0JOX2V4cCAxMDIKKyNkZWZpbmUgQk5fRl9tb2RfZXhwX3JlY3AgMTAzCisjZGVmaW5lIEJOX0ZfQk5fbW9kX3NxcnQgMTA0CisjZGVmaW5lIEJOX0ZfQk5fcmFuZCAxMDUKKyNkZWZpbmUgQk5fRl9CTl9yYW5kX3JhbmdlIDEwNgorI2RlZmluZSBCTl9GX2JuX3dleHBhbmQgMTA3CisjZGVmaW5lIEJOX0ZfQk5fbW9kX2V4cF9tb250IDEwOAorI2RlZmluZSBCTl9GX0JOX21vZF9leHAyX21vbnQgMTA5CisjZGVmaW5lIEJOX0ZfQk5fQ1RYX2dldCAxMTAKKyNkZWZpbmUgQk5fRl9CTl9tb2RfaW52ZXJzZSAxMTEKKyNkZWZpbmUgQk5fRl9CTl9ibjJkZWMgMTEyCisjZGVmaW5lIEJOX0ZfQk5fZGl2IDExMworI2RlZmluZSBCTl9GX0JOX2Rpdl9yZWNwIDExNAorI2RlZmluZSBCTl9GX0JOX21vZF9leHBfbW9udF9jb25zdHRpbWUgMTE1CisjZGVmaW5lIEJOX0ZfQk5fbW9kX2V4cF9tb250X3dvcmQgMTE2CisjZGVmaW5lIEJOX0ZfQk5fQ1RYX3N0YXJ0IDExNworI2RlZmluZSBCTl9GX0JOX3VzdWIgMTE4CisjZGVmaW5lIEJOX0ZfQk5fbW9kX2xzaGlmdF9xdWljayAxMTkKKyNkZWZpbmUgQk5fRl9CTl9DVFhfbmV3IDEyMAorI2RlZmluZSBCTl9GX0JOX21vZF9pbnZlcnNlX25vX2JyYW5jaCAxMjEKKyNkZWZpbmUgQk5fUl9OT1RfQV9TUVVBUkUgMTAwCisjZGVmaW5lIEJOX1JfVE9PX01BTllfSVRFUkFUSU9OUyAxMDEKKyNkZWZpbmUgQk5fUl9JTlBVVF9OT1RfUkVEVUNFRCAxMDIKKyNkZWZpbmUgQk5fUl9UT09fTUFOWV9URU1QT1JBUllfVkFSSUFCTEVTIDEwMworI2RlZmluZSBCTl9SX05PX0lOVkVSU0UgMTA0CisjZGVmaW5lIEJOX1JfTk9UX0lOSVRJQUxJWkVEIDEwNQorI2RlZmluZSBCTl9SX0RJVl9CWV9aRVJPIDEwNgorI2RlZmluZSBCTl9SX0NBTExFRF9XSVRIX0VWRU5fTU9EVUxVUyAxMDcKKyNkZWZpbmUgQk5fUl9FWFBBTkRfT05fU1RBVElDX0JJR05VTV9EQVRBIDEwOAorI2RlZmluZSBCTl9SX0JBRF9SRUNJUFJPQ0FMIDEwOQorI2RlZmluZSBCTl9SX1BfSVNfTk9UX1BSSU1FIDExMAorI2RlZmluZSBCTl9SX0lOVkFMSURfUkFOR0UgMTExCisjZGVmaW5lIEJOX1JfQVJHMl9MVF9BUkczIDExMgorI2RlZmluZSBCTl9SX0JJR05VTV9UT09fTE9ORyAxMTMKKworI2VuZGlmICAvKiBPUEVOU1NMX0hFQURFUl9CTl9IICovCmRpZmYgLS1naXQgYS9jcnlwdG8vYm4vYm5fZXJyb3IuYyBiL2NyeXB0by9ibi9ibl9lcnJvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MzU3MWMKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYm4vYm5fZXJyb3IuYwpAQCAtMCwwICsxLDU3IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTQsIEdvb2dsZSBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorCisjaW5jbHVkZSAiYm4uaCIKKworY29uc3QgRVJSX1NUUklOR19EQVRBIEJOX2Vycm9yX3N0cmluZ19kYXRhW10gPSB7CisgIHtFUlJfUEFDSyhFUlJfTElCX0JOLCBCTl9GX0JOX0NUWF9nZXQsIDApLCAiQk5fQ1RYX2dldCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9CTiwgQk5fRl9CTl9DVFhfbmV3LCAwKSwgIkJOX0NUWF9uZXcifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQk4sIEJOX0ZfQk5fQ1RYX3N0YXJ0LCAwKSwgIkJOX0NUWF9zdGFydCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9CTiwgQk5fRl9CTl9ibjJkZWMsIDApLCAiQk5fYm4yZGVjIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0JOLCBCTl9GX0JOX2JuMmhleCwgMCksICJCTl9ibjJoZXgifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQk4sIEJOX0ZfQk5fZGl2LCAwKSwgIkJOX2RpdiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9CTiwgQk5fRl9CTl9kaXZfcmVjcCwgMCksICJCTl9kaXZfcmVjcCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9CTiwgQk5fRl9CTl9leHAsIDApLCAiQk5fZXhwIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0JOLCBCTl9GX0JOX21vZF9leHAyX21vbnQsIDApLCAiQk5fbW9kX2V4cDJfbW9udCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9CTiwgQk5fRl9CTl9tb2RfZXhwX21vbnQsIDApLCAiQk5fbW9kX2V4cF9tb250In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0JOLCBCTl9GX0JOX21vZF9leHBfbW9udF9jb25zdHRpbWUsIDApLCAiQk5fbW9kX2V4cF9tb250X2NvbnN0dGltZSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9CTiwgQk5fRl9CTl9tb2RfZXhwX21vbnRfd29yZCwgMCksICJCTl9tb2RfZXhwX21vbnRfd29yZCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9CTiwgQk5fRl9CTl9tb2RfaW52ZXJzZSwgMCksICJCTl9tb2RfaW52ZXJzZSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9CTiwgQk5fRl9CTl9tb2RfaW52ZXJzZV9ub19icmFuY2gsIDApLCAiQk5fbW9kX2ludmVyc2Vfbm9fYnJhbmNoIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0JOLCBCTl9GX0JOX21vZF9sc2hpZnRfcXVpY2ssIDApLCAiQk5fbW9kX2xzaGlmdF9xdWljayJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9CTiwgQk5fRl9CTl9tb2Rfc3FydCwgMCksICJCTl9tb2Rfc3FydCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9CTiwgQk5fRl9CTl9uZXcsIDApLCAiQk5fbmV3In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0JOLCBCTl9GX0JOX3JhbmQsIDApLCAiQk5fcmFuZCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9CTiwgQk5fRl9CTl9yYW5kX3JhbmdlLCAwKSwgIkJOX3JhbmRfcmFuZ2UifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQk4sIEJOX0ZfQk5fdXN1YiwgMCksICJCTl91c3ViIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0JOLCBCTl9GX2JuX3dleHBhbmQsIDApLCAiYm5fd2V4cGFuZCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9CTiwgQk5fRl9tb2RfZXhwX3JlY3AsIDApLCAibW9kX2V4cF9yZWNwIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0JOLCAwLCBCTl9SX0FSRzJfTFRfQVJHMyksICJBUkcyX0xUX0FSRzMifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQk4sIDAsIEJOX1JfQkFEX1JFQ0lQUk9DQUwpLCAiQkFEX1JFQ0lQUk9DQUwifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQk4sIDAsIEJOX1JfQklHTlVNX1RPT19MT05HKSwgIkJJR05VTV9UT09fTE9ORyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9CTiwgMCwgQk5fUl9DQUxMRURfV0lUSF9FVkVOX01PRFVMVVMpLCAiQ0FMTEVEX1dJVEhfRVZFTl9NT0RVTFVTIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0JOLCAwLCBCTl9SX0RJVl9CWV9aRVJPKSwgIkRJVl9CWV9aRVJPIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0JOLCAwLCBCTl9SX0VYUEFORF9PTl9TVEFUSUNfQklHTlVNX0RBVEEpLCAiRVhQQU5EX09OX1NUQVRJQ19CSUdOVU1fREFUQSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9CTiwgMCwgQk5fUl9JTlBVVF9OT1RfUkVEVUNFRCksICJJTlBVVF9OT1RfUkVEVUNFRCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9CTiwgMCwgQk5fUl9JTlZBTElEX1JBTkdFKSwgIklOVkFMSURfUkFOR0UifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQk4sIDAsIEJOX1JfTk9UX0FfU1FVQVJFKSwgIk5PVF9BX1NRVUFSRSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9CTiwgMCwgQk5fUl9OT1RfSU5JVElBTElaRUQpLCAiTk9UX0lOSVRJQUxJWkVEIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0JOLCAwLCBCTl9SX05PX0lOVkVSU0UpLCAiTk9fSU5WRVJTRSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9CTiwgMCwgQk5fUl9QX0lTX05PVF9QUklNRSksICJQX0lTX05PVF9QUklNRSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9CTiwgMCwgQk5fUl9UT09fTUFOWV9JVEVSQVRJT05TKSwgIlRPT19NQU5ZX0lURVJBVElPTlMifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQk4sIDAsIEJOX1JfVE9PX01BTllfVEVNUE9SQVJZX1ZBUklBQkxFUyksICJUT09fTUFOWV9URU1QT1JBUllfVkFSSUFCTEVTIn0sCisgIHswLCBOVUxMfSwKK307CmRpZmYgLS1naXQgYS9jcnlwdG8vYm4vYm5fdGVzdC5jIGIvY3J5cHRvL2JuL2JuX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTg5ODAyCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2JuL2JuX3Rlc3QuYwpAQCAtMCwwICsxLDExNTIgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFMTCBSSUdIVFMgUkVTRVJWRUQuCisgKgorICogUG9ydGlvbnMgb2YgdGhlIGF0dGFjaGVkIHNvZnR3YXJlICgiQ29udHJpYnV0aW9uIikgYXJlIGRldmVsb3BlZCBieQorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiwgYW5kIGFyZSBjb250cmlidXRlZCB0byB0aGUgT3BlblNTTCBwcm9qZWN0LgorICoKKyAqIFRoZSBDb250cmlidXRpb24gaXMgbGljZW5zZWQgcHVyc3VhbnQgdG8gdGhlIEVyaWMgWW91bmcgb3BlbiBzb3VyY2UKKyAqIGxpY2Vuc2UgcHJvdmlkZWQgYWJvdmUuCisgKgorICogVGhlIGJpbmFyeSBwb2x5bm9taWFsIGFyaXRobWV0aWMgc29mdHdhcmUgaXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5CisgKiBTaGV1ZWxpbmcgQ2hhbmcgU2hhbnR6IGFuZCBEb3VnbGFzIFN0ZWJpbGEgb2YgU3VuIE1pY3Jvc3lzdGVtcworICogTGFib3JhdG9yaWVzLiAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitzdGF0aWMgY29uc3QgaW50IG51bTAgPSAxMDA7IC8qIG51bWJlciBvZiB0ZXN0cyAqLworc3RhdGljIGNvbnN0IGludCBudW0xID0gNTA7ICAvKiBhZGRpdGlvbmFsIHRlc3RzIGZvciBzb21lIGZ1bmN0aW9ucyAqLworc3RhdGljIGNvbnN0IGludCBudW0yID0gNTsgICAvKiBudW1iZXIgb2YgdGVzdHMgZm9yIHNsb3cgZnVuY3Rpb25zICovCisKK2ludCB0ZXN0X2FkZChCSU8gKmJwKTsKK2ludCB0ZXN0X3N1YihCSU8gKmJwKTsKK2ludCB0ZXN0X2xzaGlmdDEoQklPICpicCk7CitpbnQgdGVzdF9sc2hpZnQoQklPICpicCwgQk5fQ1RYICpjdHgsIEJJR05VTSAqYV8pOworaW50IHRlc3RfcnNoaWZ0MShCSU8gKmJwKTsKK2ludCB0ZXN0X3JzaGlmdChCSU8gKmJwLCBCTl9DVFggKmN0eCk7CitpbnQgdGVzdF9zcXIoQklPICpicCwgQk5fQ1RYICpjdHgpOworaW50IHRlc3RfbXVsKEJJTyAqYnApOworaW50IHRlc3RfZGl2KEJJTyAqYnAsIEJOX0NUWCAqY3R4KTsKK2ludCByYW5kX25lZyh2b2lkKTsKKworaW50IHRlc3RfZGl2X3dvcmQoQklPICpicCk7CitpbnQgdGVzdF9tb250KEJJTyAqYnAsIEJOX0NUWCAqY3R4KTsKK2ludCB0ZXN0X21vZChCSU8gKmJwLCBCTl9DVFggKmN0eCk7CitpbnQgdGVzdF9tb2RfbXVsKEJJTyAqYnAsIEJOX0NUWCAqY3R4KTsKK2ludCB0ZXN0X21vZF9leHAoQklPICpicCwgQk5fQ1RYICpjdHgpOworaW50IHRlc3RfbW9kX2V4cF9tb250X2NvbnN0dGltZShCSU8gKmJwLCBCTl9DVFggKmN0eCk7CitpbnQgdGVzdF9leHAoQklPICpicCwgQk5fQ1RYICpjdHgpOworaW50IHRlc3RfbW9kX3NxcnQoQklPICpicCwgQk5fQ1RYICpjdHgpOworI2lmIDAKK2ludCB0ZXN0X2dmMm1fYWRkKEJJTyAqYnApOworaW50IHRlc3RfZ2YybV9tb2QoQklPICpicCk7CitpbnQgdGVzdF9nZjJtX21vZF9tdWwoQklPICpicCwgQk5fQ1RYICpjdHgpOworaW50IHRlc3RfZ2YybV9tb2Rfc3FyKEJJTyAqYnAsIEJOX0NUWCAqY3R4KTsKK2ludCB0ZXN0X2dmMm1fbW9kX2ludihCSU8gKmJwLCBCTl9DVFggKmN0eCk7CitpbnQgdGVzdF9nZjJtX21vZF9kaXYoQklPICpicCwgQk5fQ1RYICpjdHgpOworaW50IHRlc3RfZ2YybV9tb2RfZXhwKEJJTyAqYnAsIEJOX0NUWCAqY3R4KTsKK2ludCB0ZXN0X2dmMm1fbW9kX3NxcnQoQklPICpicCwgQk5fQ1RYICpjdHgpOworaW50IHRlc3RfZ2YybV9tb2Rfc29sdmVfcXVhZChCSU8gKmJwLCBCTl9DVFggKmN0eCk7CisjZW5kaWYKK3N0YXRpYyBpbnQgcmVzdWx0cyA9IDA7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGxzdFtdID0KKyAgICAiXHhDNlx4NEZceDQzXHgwNFx4MkFceEVBXHhDQVx4NkVceDU4XHgzNlx4ODBceDVCXHhFOFx4QzkiCisgICAgIlx4OUJceDA0XHg1RFx4NDhceDM2XHhDMlx4RkRceDE2XHhDOVx4NjRceEYwIjsKKworc3RhdGljIHZvaWQgRVJSX3ByaW50X2Vycm9yc19mcChGSUxFICpvdXQpIHsKK30KKworc3RhdGljIHZvaWQgbWVzc2FnZShCSU8gKm91dCwgY2hhciAqbSkgeworICBCSU9fcHV0cyhvdXQsICJwcmludCBcInRlc3QgIik7CisgIEJJT19wdXRzKG91dCwgbSk7CisgIEJJT19wdXRzKG91dCwgIlxcblwiXG4iKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeworICBCTl9DVFggKmN0eDsKKyAgQklPICpvdXQgPSBOVUxMOworICBjaGFyICpvdXRmaWxlID0gTlVMTDsKKworICByZXN1bHRzID0gMDsKKworICBhcmdjLS07CisgIGFyZ3YrKzsKKyAgd2hpbGUgKGFyZ2MgPj0gMSkgeworICAgIGlmIChzdHJjbXAoKmFyZ3YsICItcmVzdWx0cyIpID09IDApCisgICAgICByZXN1bHRzID0gMTsKKyAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItb3V0IikgPT0gMCkgeworICAgICAgaWYgKC0tYXJnYyA8IDEpCisgICAgICAgIGJyZWFrOworICAgICAgb3V0ZmlsZSA9ICooKythcmd2KTsKKyAgICB9CisgICAgYXJnYy0tOworICAgIGFyZ3YrKzsKKyAgfQorCisKKyAgY3R4ID0gQk5fQ1RYX25ldygpOworICBpZiAoY3R4ID09IE5VTEwpCisgICAgcmV0dXJuIDE7CisKKyAgb3V0ID0gQklPX25ldyhCSU9fc19maWxlKCkpOworICBpZiAob3V0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGlmIChvdXRmaWxlID09IE5VTEwpIHsKKyAgICBCSU9fc2V0X2ZwKG91dCwgc3Rkb3V0LCBCSU9fTk9DTE9TRSk7CisgIH0gZWxzZSB7CisgICAgaWYgKCFCSU9fd3JpdGVfZmlsZW5hbWUob3V0LCBvdXRmaWxlKSkgeworICAgICAgcGVycm9yKG91dGZpbGUpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisKKyAgaWYgKCFyZXN1bHRzKQorICAgIEJJT19wdXRzKG91dCwgIm9iYXNlPTE2XG5pYmFzZT0xNlxuIik7CisKKyAgbWVzc2FnZShvdXQsICJCTl9hZGQiKTsKKyAgaWYgKCF0ZXN0X2FkZChvdXQpKQorICAgIGdvdG8gZXJyOworICAodm9pZClCSU9fZmx1c2gob3V0KTsKKworICBtZXNzYWdlKG91dCwgIkJOX3N1YiIpOworICBpZiAoIXRlc3Rfc3ViKG91dCkpCisgICAgZ290byBlcnI7CisgICh2b2lkKUJJT19mbHVzaChvdXQpOworCisgIG1lc3NhZ2Uob3V0LCAiQk5fbHNoaWZ0MSIpOworICBpZiAoIXRlc3RfbHNoaWZ0MShvdXQpKQorICAgIGdvdG8gZXJyOworICAodm9pZClCSU9fZmx1c2gob3V0KTsKKworICBtZXNzYWdlKG91dCwgIkJOX2xzaGlmdCAoZml4ZWQpIik7CisgIGlmICghdGVzdF9sc2hpZnQob3V0LCBjdHgsIEJOX2JpbjJibihsc3QsIHNpemVvZihsc3QpIC0gMSwgTlVMTCkpKQorICAgIGdvdG8gZXJyOworICAodm9pZClCSU9fZmx1c2gob3V0KTsKKworICBtZXNzYWdlKG91dCwgIkJOX2xzaGlmdCIpOworICBpZiAoIXRlc3RfbHNoaWZ0KG91dCwgY3R4LCBOVUxMKSkKKyAgICBnb3RvIGVycjsKKyAgKHZvaWQpQklPX2ZsdXNoKG91dCk7CisKKyAgbWVzc2FnZShvdXQsICJCTl9yc2hpZnQxIik7CisgIGlmICghdGVzdF9yc2hpZnQxKG91dCkpCisgICAgZ290byBlcnI7CisgICh2b2lkKUJJT19mbHVzaChvdXQpOworCisgIG1lc3NhZ2Uob3V0LCAiQk5fcnNoaWZ0Iik7CisgIGlmICghdGVzdF9yc2hpZnQob3V0LCBjdHgpKQorICAgIGdvdG8gZXJyOworICAodm9pZClCSU9fZmx1c2gob3V0KTsKKworICBtZXNzYWdlKG91dCwgIkJOX3NxciIpOworICBpZiAoIXRlc3Rfc3FyKG91dCwgY3R4KSkKKyAgICBnb3RvIGVycjsKKyAgKHZvaWQpQklPX2ZsdXNoKG91dCk7CisKKyAgbWVzc2FnZShvdXQsICJCTl9tdWwiKTsKKyAgaWYgKCF0ZXN0X211bChvdXQpKQorICAgIGdvdG8gZXJyOworICAodm9pZClCSU9fZmx1c2gob3V0KTsKKworICBtZXNzYWdlKG91dCwgIkJOX2RpdiIpOworICBpZiAoIXRlc3RfZGl2KG91dCwgY3R4KSkKKyAgICBnb3RvIGVycjsKKyAgKHZvaWQpQklPX2ZsdXNoKG91dCk7CisKKyAgbWVzc2FnZShvdXQsICJCTl9kaXZfd29yZCIpOworICBpZiAoIXRlc3RfZGl2X3dvcmQob3V0KSkKKyAgICBnb3RvIGVycjsKKyAgKHZvaWQpQklPX2ZsdXNoKG91dCk7CisKKyAgbWVzc2FnZShvdXQsICJCTl9tb2QiKTsKKyAgaWYgKCF0ZXN0X21vZChvdXQsIGN0eCkpCisgICAgZ290byBlcnI7CisgICh2b2lkKUJJT19mbHVzaChvdXQpOworCisgIG1lc3NhZ2Uob3V0LCAiQk5fbW9kX211bCIpOworICBpZiAoIXRlc3RfbW9kX211bChvdXQsIGN0eCkpCisgICAgZ290byBlcnI7CisgICh2b2lkKUJJT19mbHVzaChvdXQpOworCisgIG1lc3NhZ2Uob3V0LCAiQk5fbW9udCIpOworICBpZiAoIXRlc3RfbW9udChvdXQsIGN0eCkpCisgICAgZ290byBlcnI7CisgICh2b2lkKUJJT19mbHVzaChvdXQpOworCisgIG1lc3NhZ2Uob3V0LCAiQk5fbW9kX2V4cCIpOworICBpZiAoIXRlc3RfbW9kX2V4cChvdXQsIGN0eCkpCisgICAgZ290byBlcnI7CisgICh2b2lkKUJJT19mbHVzaChvdXQpOworCisgIG1lc3NhZ2Uob3V0LCAiQk5fbW9kX2V4cF9tb250X2NvbnN0dGltZSIpOworICBpZiAoIXRlc3RfbW9kX2V4cF9tb250X2NvbnN0dGltZShvdXQsIGN0eCkpCisgICAgZ290byBlcnI7CisgICh2b2lkKUJJT19mbHVzaChvdXQpOworCisgIG1lc3NhZ2Uob3V0LCAiQk5fZXhwIik7CisgIGlmICghdGVzdF9leHAob3V0LCBjdHgpKQorICAgIGdvdG8gZXJyOworICAodm9pZClCSU9fZmx1c2gob3V0KTsKKworICBtZXNzYWdlKG91dCwgIkJOX21vZF9zcXJ0Iik7CisgIGlmICghdGVzdF9tb2Rfc3FydChvdXQsIGN0eCkpCisgICAgZ290byBlcnI7CisgICh2b2lkKUJJT19mbHVzaChvdXQpOworCisgIEJOX0NUWF9mcmVlKGN0eCk7CisgIEJJT19mcmVlKG91dCk7CisKKyAgcHJpbnRmKCJQQVNTXG4iKTsKKyAgcmV0dXJuIDA7CisKK2VycjoKKyAgQklPX3B1dHMob3V0LCAiMVxuIik7IC8qIG1ha2Ugc3VyZSB0aGUgUGVybCBzY3JpcHQgZmVkIGJ5IGJjIG5vdGljZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBmYWlsdXJlLCBzZWUgdGVzdF9ibiBpbiB0ZXN0L01ha2VmaWxlLnNzbCovCisgICh2b2lkKUJJT19mbHVzaChvdXQpOworCisgIHJldHVybiAxOworfQorCitpbnQgdGVzdF9hZGQoQklPICpicCkgeworICBCSUdOVU0gYSwgYiwgYzsKKyAgaW50IGk7CisKKyAgQk5faW5pdCgmYSk7CisgIEJOX2luaXQoJmIpOworICBCTl9pbml0KCZjKTsKKworICBCTl9yYW5kKCZhLCA1MTIsIDAsIDApOworICBmb3IgKGkgPSAwOyBpIDwgbnVtMDsgaSsrKSB7CisgICAgQk5fcmFuZCgmYiwgNDUwICsgaSwgMCwgMCk7CisgICAgYS5uZWcgPSByYW5kX25lZygpOworICAgIGIubmVnID0gcmFuZF9uZWcoKTsKKyAgICBCTl9hZGQoJmMsICZhLCAmYik7CisgICAgaWYgKGJwICE9IE5VTEwpIHsKKyAgICAgIGlmICghcmVzdWx0cykgeworICAgICAgICBCTl9wcmludChicCwgJmEpOworICAgICAgICBCSU9fcHV0cyhicCwgIiArICIpOworICAgICAgICBCTl9wcmludChicCwgJmIpOworICAgICAgICBCSU9fcHV0cyhicCwgIiAtICIpOworICAgICAgfQorICAgICAgQk5fcHJpbnQoYnAsICZjKTsKKyAgICAgIEJJT19wdXRzKGJwLCAiXG4iKTsKKyAgICB9CisgICAgYS5uZWcgPSAhYS5uZWc7CisgICAgYi5uZWcgPSAhYi5uZWc7CisgICAgQk5fYWRkKCZjLCAmYywgJmIpOworICAgIEJOX2FkZCgmYywgJmMsICZhKTsKKyAgICBpZiAoIUJOX2lzX3plcm8oJmMpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkFkZCB0ZXN0IGZhaWxlZCFcbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIEJOX2ZyZWUoJmEpOworICBCTl9mcmVlKCZiKTsKKyAgQk5fZnJlZSgmYyk7CisgIHJldHVybiAoMSk7Cit9CisKK2ludCB0ZXN0X3N1YihCSU8gKmJwKSB7CisgIEJJR05VTSBhLCBiLCBjOworICBpbnQgaTsKKworICBCTl9pbml0KCZhKTsKKyAgQk5faW5pdCgmYik7CisgIEJOX2luaXQoJmMpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW0wICsgbnVtMTsgaSsrKSB7CisgICAgaWYgKGkgPCBudW0xKSB7CisgICAgICBCTl9yYW5kKCZhLCA1MTIsIDAsIDApOworICAgICAgQk5fY29weSgmYiwgJmEpOworICAgICAgaWYgKEJOX3NldF9iaXQoJmEsIGkpID09IDApCisgICAgICAgIHJldHVybiAoMCk7CisgICAgICBCTl9hZGRfd29yZCgmYiwgaSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEJOX3JhbmQoJmIsIDQwMCArIGkgLSBudW0xLCAwLCAwKTsKKyAgICAgIGEubmVnID0gcmFuZF9uZWcoKTsKKyAgICAgIGIubmVnID0gcmFuZF9uZWcoKTsKKyAgICB9CisgICAgQk5fc3ViKCZjLCAmYSwgJmIpOworICAgIGlmIChicCAhPSBOVUxMKSB7CisgICAgICBpZiAoIXJlc3VsdHMpIHsKKyAgICAgICAgQk5fcHJpbnQoYnAsICZhKTsKKyAgICAgICAgQklPX3B1dHMoYnAsICIgLSAiKTsKKyAgICAgICAgQk5fcHJpbnQoYnAsICZiKTsKKyAgICAgICAgQklPX3B1dHMoYnAsICIgLSAiKTsKKyAgICAgIH0KKyAgICAgIEJOX3ByaW50KGJwLCAmYyk7CisgICAgICBCSU9fcHV0cyhicCwgIlxuIik7CisgICAgfQorICAgIEJOX2FkZCgmYywgJmMsICZiKTsKKyAgICBCTl9zdWIoJmMsICZjLCAmYSk7CisgICAgaWYgKCFCTl9pc196ZXJvKCZjKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJTdWJ0cmFjdCB0ZXN0IGZhaWxlZCFcbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIEJOX2ZyZWUoJmEpOworICBCTl9mcmVlKCZiKTsKKyAgQk5fZnJlZSgmYyk7CisgIHJldHVybiAoMSk7Cit9CisKK2ludCB0ZXN0X2RpdihCSU8gKmJwLCBCTl9DVFggKmN0eCkgeworICBCSUdOVU0gYSwgYiwgYywgZCwgZTsKKyAgaW50IGk7CisKKyAgQk5faW5pdCgmYSk7CisgIEJOX2luaXQoJmIpOworICBCTl9pbml0KCZjKTsKKyAgQk5faW5pdCgmZCk7CisgIEJOX2luaXQoJmUpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW0wICsgbnVtMTsgaSsrKSB7CisgICAgaWYgKGkgPCBudW0xKSB7CisgICAgICBCTl9yYW5kKCZhLCA0MDAsIDAsIDApOworICAgICAgQk5fY29weSgmYiwgJmEpOworICAgICAgQk5fbHNoaWZ0KCZhLCAmYSwgaSk7CisgICAgICBCTl9hZGRfd29yZCgmYSwgaSk7CisgICAgfSBlbHNlCisgICAgICBCTl9yYW5kKCZiLCA1MCArIDMgKiAoaSAtIG51bTEpLCAwLCAwKTsKKyAgICBhLm5lZyA9IHJhbmRfbmVnKCk7CisgICAgYi5uZWcgPSByYW5kX25lZygpOworICAgIEJOX2RpdigmZCwgJmMsICZhLCAmYiwgY3R4KTsKKyAgICBpZiAoYnAgIT0gTlVMTCkgeworICAgICAgaWYgKCFyZXN1bHRzKSB7CisgICAgICAgIEJOX3ByaW50KGJwLCAmYSk7CisgICAgICAgIEJJT19wdXRzKGJwLCAiIC8gIik7CisgICAgICAgIEJOX3ByaW50KGJwLCAmYik7CisgICAgICAgIEJJT19wdXRzKGJwLCAiIC0gIik7CisgICAgICB9CisgICAgICBCTl9wcmludChicCwgJmQpOworICAgICAgQklPX3B1dHMoYnAsICJcbiIpOworCisgICAgICBpZiAoIXJlc3VsdHMpIHsKKyAgICAgICAgQk5fcHJpbnQoYnAsICZhKTsKKyAgICAgICAgQklPX3B1dHMoYnAsICIgJSAiKTsKKyAgICAgICAgQk5fcHJpbnQoYnAsICZiKTsKKyAgICAgICAgQklPX3B1dHMoYnAsICIgLSAiKTsKKyAgICAgIH0KKyAgICAgIEJOX3ByaW50KGJwLCAmYyk7CisgICAgICBCSU9fcHV0cyhicCwgIlxuIik7CisgICAgfQorICAgIEJOX211bCgmZSwgJmQsICZiLCBjdHgpOworICAgIEJOX2FkZCgmZCwgJmUsICZjKTsKKyAgICBCTl9zdWIoJmQsICZkLCAmYSk7CisgICAgaWYgKCFCTl9pc196ZXJvKCZkKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJEaXZpc2lvbiB0ZXN0IGZhaWxlZCFcbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIEJOX2ZyZWUoJmEpOworICBCTl9mcmVlKCZiKTsKKyAgQk5fZnJlZSgmYyk7CisgIEJOX2ZyZWUoJmQpOworICBCTl9mcmVlKCZlKTsKKyAgcmV0dXJuICgxKTsKK30KKworaW50IHRlc3RfbHNoaWZ0MShCSU8gKmJwKSB7CisgIEJJR05VTSAqYSwgKmIsICpjOworICBpbnQgaTsKKworICBhID0gQk5fbmV3KCk7CisgIGIgPSBCTl9uZXcoKTsKKyAgYyA9IEJOX25ldygpOworCisgIEJOX3JhbmQoYSwgMjAwLCAwLCAwKTsgLyoqLworICBhLT5uZWcgPSByYW5kX25lZygpOworICBmb3IgKGkgPSAwOyBpIDwgbnVtMDsgaSsrKSB7CisgICAgQk5fbHNoaWZ0MShiLCBhKTsKKyAgICBpZiAoYnAgIT0gTlVMTCkgeworICAgICAgaWYgKCFyZXN1bHRzKSB7CisgICAgICAgIEJOX3ByaW50KGJwLCBhKTsKKyAgICAgICAgQklPX3B1dHMoYnAsICIgKiAyIik7CisgICAgICAgIEJJT19wdXRzKGJwLCAiIC0gIik7CisgICAgICB9CisgICAgICBCTl9wcmludChicCwgYik7CisgICAgICBCSU9fcHV0cyhicCwgIlxuIik7CisgICAgfQorICAgIEJOX2FkZChjLCBhLCBhKTsKKyAgICBCTl9zdWIoYSwgYiwgYyk7CisgICAgaWYgKCFCTl9pc196ZXJvKGEpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkxlZnQgc2hpZnQgb25lIHRlc3QgZmFpbGVkIVxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBCTl9jb3B5KGEsIGIpOworICB9CisgIEJOX2ZyZWUoYSk7CisgIEJOX2ZyZWUoYik7CisgIEJOX2ZyZWUoYyk7CisgIHJldHVybiAoMSk7Cit9CisKK2ludCB0ZXN0X3JzaGlmdChCSU8gKmJwLCBCTl9DVFggKmN0eCkgeworICBCSUdOVU0gKmEsICpiLCAqYywgKmQsICplOworICBpbnQgaTsKKworICBhID0gQk5fbmV3KCk7CisgIGIgPSBCTl9uZXcoKTsKKyAgYyA9IEJOX25ldygpOworICBkID0gQk5fbmV3KCk7CisgIGUgPSBCTl9uZXcoKTsKKyAgQk5fb25lKGMpOworCisgIEJOX3JhbmQoYSwgMjAwLCAwLCAwKTsgLyoqLworICBhLT5uZWcgPSByYW5kX25lZygpOworICBmb3IgKGkgPSAwOyBpIDwgbnVtMDsgaSsrKSB7CisgICAgQk5fcnNoaWZ0KGIsIGEsIGkgKyAxKTsKKyAgICBCTl9hZGQoYywgYywgYyk7CisgICAgaWYgKGJwICE9IE5VTEwpIHsKKyAgICAgIGlmICghcmVzdWx0cykgeworICAgICAgICBCTl9wcmludChicCwgYSk7CisgICAgICAgIEJJT19wdXRzKGJwLCAiIC8gIik7CisgICAgICAgIEJOX3ByaW50KGJwLCBjKTsKKyAgICAgICAgQklPX3B1dHMoYnAsICIgLSAiKTsKKyAgICAgIH0KKyAgICAgIEJOX3ByaW50KGJwLCBiKTsKKyAgICAgIEJJT19wdXRzKGJwLCAiXG4iKTsKKyAgICB9CisgICAgQk5fZGl2KGQsIGUsIGEsIGMsIGN0eCk7CisgICAgQk5fc3ViKGQsIGQsIGIpOworICAgIGlmICghQk5faXNfemVybyhkKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJSaWdodCBzaGlmdCB0ZXN0IGZhaWxlZCFcbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIEJOX2ZyZWUoYSk7CisgIEJOX2ZyZWUoYik7CisgIEJOX2ZyZWUoYyk7CisgIEJOX2ZyZWUoZCk7CisgIEJOX2ZyZWUoZSk7CisgIHJldHVybiAoMSk7Cit9CisKK2ludCB0ZXN0X3JzaGlmdDEoQklPICpicCkgeworICBCSUdOVU0gKmEsICpiLCAqYzsKKyAgaW50IGk7CisKKyAgYSA9IEJOX25ldygpOworICBiID0gQk5fbmV3KCk7CisgIGMgPSBCTl9uZXcoKTsKKworICBCTl9yYW5kKGEsIDIwMCwgMCwgMCk7IC8qKi8KKyAgYS0+bmVnID0gcmFuZF9uZWcoKTsKKyAgZm9yIChpID0gMDsgaSA8IG51bTA7IGkrKykgeworICAgIEJOX3JzaGlmdDEoYiwgYSk7CisgICAgaWYgKGJwICE9IE5VTEwpIHsKKyAgICAgIGlmICghcmVzdWx0cykgeworICAgICAgICBCTl9wcmludChicCwgYSk7CisgICAgICAgIEJJT19wdXRzKGJwLCAiIC8gMiIpOworICAgICAgICBCSU9fcHV0cyhicCwgIiAtICIpOworICAgICAgfQorICAgICAgQk5fcHJpbnQoYnAsIGIpOworICAgICAgQklPX3B1dHMoYnAsICJcbiIpOworICAgIH0KKyAgICBCTl9zdWIoYywgYSwgYik7CisgICAgQk5fc3ViKGMsIGMsIGIpOworICAgIGlmICghQk5faXNfemVybyhjKSAmJiAhQk5fYWJzX2lzX3dvcmQoYywgMSkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiUmlnaHQgc2hpZnQgb25lIHRlc3QgZmFpbGVkIVxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgQk5fY29weShhLCBiKTsKKyAgfQorICBCTl9mcmVlKGEpOworICBCTl9mcmVlKGIpOworICBCTl9mcmVlKGMpOworICByZXR1cm4gKDEpOworfQorCitpbnQgdGVzdF9sc2hpZnQoQklPICpicCwgQk5fQ1RYICpjdHgsIEJJR05VTSAqYV8pIHsKKyAgQklHTlVNICphLCAqYiwgKmMsICpkOworICBpbnQgaTsKKworICBiID0gQk5fbmV3KCk7CisgIGMgPSBCTl9uZXcoKTsKKyAgZCA9IEJOX25ldygpOworICBCTl9vbmUoYyk7CisKKyAgaWYgKGFfKQorICAgIGEgPSBhXzsKKyAgZWxzZSB7CisgICAgYSA9IEJOX25ldygpOworICAgIEJOX3JhbmQoYSwgMjAwLCAwLCAwKTsgLyoqLworICAgIGEtPm5lZyA9IHJhbmRfbmVnKCk7CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IG51bTA7IGkrKykgeworICAgIEJOX2xzaGlmdChiLCBhLCBpICsgMSk7CisgICAgQk5fYWRkKGMsIGMsIGMpOworICAgIGlmIChicCAhPSBOVUxMKSB7CisgICAgICBpZiAoIXJlc3VsdHMpIHsKKyAgICAgICAgQk5fcHJpbnQoYnAsIGEpOworICAgICAgICBCSU9fcHV0cyhicCwgIiAqICIpOworICAgICAgICBCTl9wcmludChicCwgYyk7CisgICAgICAgIEJJT19wdXRzKGJwLCAiIC0gIik7CisgICAgICB9CisgICAgICBCTl9wcmludChicCwgYik7CisgICAgICBCSU9fcHV0cyhicCwgIlxuIik7CisgICAgfQorICAgIEJOX211bChkLCBhLCBjLCBjdHgpOworICAgIEJOX3N1YihkLCBkLCBiKTsKKyAgICBpZiAoIUJOX2lzX3plcm8oZCkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiTGVmdCBzaGlmdCB0ZXN0IGZhaWxlZCFcbiIpOworICAgICAgZnByaW50ZihzdGRlcnIsICJhPSIpOworICAgICAgQk5fcHJpbnRfZnAoc3RkZXJyLCBhKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiXG5iPSIpOworICAgICAgQk5fcHJpbnRfZnAoc3RkZXJyLCBiKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiXG5jPSIpOworICAgICAgQk5fcHJpbnRfZnAoc3RkZXJyLCBjKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiXG5kPSIpOworICAgICAgQk5fcHJpbnRfZnAoc3RkZXJyLCBkKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICBCTl9mcmVlKGEpOworICBCTl9mcmVlKGIpOworICBCTl9mcmVlKGMpOworICBCTl9mcmVlKGQpOworICByZXR1cm4gKDEpOworfQorCitpbnQgdGVzdF9tdWwoQklPICpicCkgeworICBCSUdOVU0gYSwgYiwgYywgZCwgZTsKKyAgaW50IGk7CisgIEJOX0NUWCAqY3R4OworCisgIGN0eCA9IEJOX0NUWF9uZXcoKTsKKyAgaWYgKGN0eCA9PSBOVUxMKQorICAgIGFib3J0KCk7CisKKyAgQk5faW5pdCgmYSk7CisgIEJOX2luaXQoJmIpOworICBCTl9pbml0KCZjKTsKKyAgQk5faW5pdCgmZCk7CisgIEJOX2luaXQoJmUpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW0wICsgbnVtMTsgaSsrKSB7CisgICAgaWYgKGkgPD0gbnVtMSkgeworICAgICAgQk5fcmFuZCgmYSwgMTAwLCAwLCAwKTsKKyAgICAgIEJOX3JhbmQoJmIsIDEwMCwgMCwgMCk7CisgICAgfSBlbHNlCisgICAgICBCTl9yYW5kKCZiLCBpIC0gbnVtMSwgMCwgMCk7CisgICAgYS5uZWcgPSByYW5kX25lZygpOworICAgIGIubmVnID0gcmFuZF9uZWcoKTsKKyAgICBCTl9tdWwoJmMsICZhLCAmYiwgY3R4KTsKKyAgICBpZiAoYnAgIT0gTlVMTCkgeworICAgICAgaWYgKCFyZXN1bHRzKSB7CisgICAgICAgIEJOX3ByaW50KGJwLCAmYSk7CisgICAgICAgIEJJT19wdXRzKGJwLCAiICogIik7CisgICAgICAgIEJOX3ByaW50KGJwLCAmYik7CisgICAgICAgIEJJT19wdXRzKGJwLCAiIC0gIik7CisgICAgICB9CisgICAgICBCTl9wcmludChicCwgJmMpOworICAgICAgQklPX3B1dHMoYnAsICJcbiIpOworICAgIH0KKyAgICBCTl9kaXYoJmQsICZlLCAmYywgJmEsIGN0eCk7CisgICAgQk5fc3ViKCZkLCAmZCwgJmIpOworICAgIGlmICghQk5faXNfemVybygmZCkgfHwgIUJOX2lzX3plcm8oJmUpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIk11bHRpcGxpY2F0aW9uIHRlc3QgZmFpbGVkIVxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgQk5fZnJlZSgmYSk7CisgIEJOX2ZyZWUoJmIpOworICBCTl9mcmVlKCZjKTsKKyAgQk5fZnJlZSgmZCk7CisgIEJOX2ZyZWUoJmUpOworICBCTl9DVFhfZnJlZShjdHgpOworICByZXR1cm4gKDEpOworfQorCitpbnQgdGVzdF9zcXIoQklPICpicCwgQk5fQ1RYICpjdHgpIHsKKyAgQklHTlVNIGEsIGMsIGQsIGU7CisgIGludCBpOworCisgIEJOX2luaXQoJmEpOworICBCTl9pbml0KCZjKTsKKyAgQk5faW5pdCgmZCk7CisgIEJOX2luaXQoJmUpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW0wOyBpKyspIHsKKyAgICBCTl9yYW5kKCZhLCA0MCArIGkgKiAxMCwgMCwgMCk7CisgICAgYS5uZWcgPSByYW5kX25lZygpOworICAgIEJOX3NxcigmYywgJmEsIGN0eCk7CisgICAgaWYgKGJwICE9IE5VTEwpIHsKKyAgICAgIGlmICghcmVzdWx0cykgeworICAgICAgICBCTl9wcmludChicCwgJmEpOworICAgICAgICBCSU9fcHV0cyhicCwgIiAqICIpOworICAgICAgICBCTl9wcmludChicCwgJmEpOworICAgICAgICBCSU9fcHV0cyhicCwgIiAtICIpOworICAgICAgfQorICAgICAgQk5fcHJpbnQoYnAsICZjKTsKKyAgICAgIEJJT19wdXRzKGJwLCAiXG4iKTsKKyAgICB9CisgICAgQk5fZGl2KCZkLCAmZSwgJmMsICZhLCBjdHgpOworICAgIEJOX3N1YigmZCwgJmQsICZhKTsKKyAgICBpZiAoIUJOX2lzX3plcm8oJmQpIHx8ICFCTl9pc196ZXJvKCZlKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJTcXVhcmUgdGVzdCBmYWlsZWQhXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICBCTl9mcmVlKCZhKTsKKyAgQk5fZnJlZSgmYyk7CisgIEJOX2ZyZWUoJmQpOworICBCTl9mcmVlKCZlKTsKKyAgcmV0dXJuICgxKTsKK30KKworCitpbnQgcmFuZF9uZWcodm9pZCkgeworICBzdGF0aWMgdW5zaWduZWQgaW50IG5lZyA9IDA7CisgIHN0YXRpYyBpbnQgc2lnbls4XSA9IHswLCAwLCAwLCAxLCAxLCAwLCAxLCAxfTsKKworICByZXR1cm4gKHNpZ25bKG5lZysrKSAlIDhdKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfd29yZChCSU8gKmJwLCBCTl9VTE9ORyB3KSB7CisjaWZkZWYgT1BFTlNTTF82NF9CSVQKKyAgaWYgKHNpemVvZih3KSA+IHNpemVvZih1bnNpZ25lZCBsb25nKSkgeworICAgIHVuc2lnbmVkIGxvbmcgaCA9ICh1bnNpZ25lZCBsb25nKSh3ID4+IDMyKSwgbCA9ICh1bnNpZ25lZCBsb25nKSh3KTsKKworICAgIGlmIChoKQorICAgICAgQklPX3ByaW50ZihicCwgIiVsWCUwOGxYIiwgaCwgbCk7CisgICAgZWxzZQorICAgICAgQklPX3ByaW50ZihicCwgIiVsWCIsIGwpOworICAgIHJldHVybjsKKyAgfQorI2VuZGlmCisgIEJJT19wcmludGYoYnAsIEJOX0hFWF9GTVQxLCB3KTsKK30KKworaW50IHRlc3RfZGl2X3dvcmQoQklPICpicCkgeworICBCSUdOVU0gYSwgYjsKKyAgQk5fVUxPTkcgciwgczsKKyAgaW50IGk7CisKKyAgQk5faW5pdCgmYSk7CisgIEJOX2luaXQoJmIpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW0wOyBpKyspIHsKKyAgICBkbyB7CisgICAgICBCTl9yYW5kKCZhLCA1MTIsIC0xLCAwKTsKKyAgICAgIEJOX3JhbmQoJmIsIEJOX0JJVFMyLCAtMSwgMCk7CisgICAgICBzID0gYi5kWzBdOworICAgIH0gd2hpbGUgKCFzKTsKKworICAgIEJOX2NvcHkoJmIsICZhKTsKKyAgICByID0gQk5fZGl2X3dvcmQoJmIsIHMpOworCisgICAgaWYgKGJwICE9IE5VTEwpIHsKKyAgICAgIGlmICghcmVzdWx0cykgeworICAgICAgICBCTl9wcmludChicCwgJmEpOworICAgICAgICBCSU9fcHV0cyhicCwgIiAvICIpOworICAgICAgICBwcmludF93b3JkKGJwLCBzKTsKKyAgICAgICAgQklPX3B1dHMoYnAsICIgLSAiKTsKKyAgICAgIH0KKyAgICAgIEJOX3ByaW50KGJwLCAmYik7CisgICAgICBCSU9fcHV0cyhicCwgIlxuIik7CisKKyAgICAgIGlmICghcmVzdWx0cykgeworICAgICAgICBCTl9wcmludChicCwgJmEpOworICAgICAgICBCSU9fcHV0cyhicCwgIiAlICIpOworICAgICAgICBwcmludF93b3JkKGJwLCBzKTsKKyAgICAgICAgQklPX3B1dHMoYnAsICIgLSAiKTsKKyAgICAgIH0KKyAgICAgIHByaW50X3dvcmQoYnAsIHIpOworICAgICAgQklPX3B1dHMoYnAsICJcbiIpOworICAgIH0KKyAgICBCTl9tdWxfd29yZCgmYiwgcyk7CisgICAgQk5fYWRkX3dvcmQoJmIsIHIpOworICAgIEJOX3N1YigmYiwgJmEsICZiKTsKKyAgICBpZiAoIUJOX2lzX3plcm8oJmIpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkRpdmlzaW9uICh3b3JkKSB0ZXN0IGZhaWxlZCFcbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIEJOX2ZyZWUoJmEpOworICBCTl9mcmVlKCZiKTsKKyAgcmV0dXJuICgxKTsKK30KKworaW50IHRlc3RfbW9udChCSU8gKmJwLCBCTl9DVFggKmN0eCkgeworICBCSUdOVU0gYSwgYiwgYywgZCwgQSwgQjsKKyAgQklHTlVNIG47CisgIGludCBpOworICBCTl9NT05UX0NUWCAqbW9udDsKKworICBCTl9pbml0KCZhKTsKKyAgQk5faW5pdCgmYik7CisgIEJOX2luaXQoJmMpOworICBCTl9pbml0KCZkKTsKKyAgQk5faW5pdCgmQSk7CisgIEJOX2luaXQoJkIpOworICBCTl9pbml0KCZuKTsKKworICBtb250ID0gQk5fTU9OVF9DVFhfbmV3KCk7CisgIGlmIChtb250ID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisKKyAgQk5fcmFuZCgmYSwgMTAwLCAwLCAwKTsgLyoqLworICBCTl9yYW5kKCZiLCAxMDAsIDAsIDApOyAvKiovCisgIGZvciAoaSA9IDA7IGkgPCBudW0yOyBpKyspIHsKKyAgICBpbnQgYml0cyA9ICgyMDAgKiAoaSArIDEpKSAvIG51bTI7CisKKyAgICBpZiAoYml0cyA9PSAwKQorICAgICAgY29udGludWU7CisgICAgQk5fcmFuZCgmbiwgYml0cywgMCwgMSk7CisgICAgQk5fTU9OVF9DVFhfc2V0KG1vbnQsICZuLCBjdHgpOworCisgICAgQk5fbm5tb2QoJmEsICZhLCAmbiwgY3R4KTsKKyAgICBCTl9ubm1vZCgmYiwgJmIsICZuLCBjdHgpOworCisgICAgQk5fdG9fbW9udGdvbWVyeSgmQSwgJmEsIG1vbnQsIGN0eCk7CisgICAgQk5fdG9fbW9udGdvbWVyeSgmQiwgJmIsIG1vbnQsIGN0eCk7CisKKyAgICBCTl9tb2RfbXVsX21vbnRnb21lcnkoJmMsICZBLCAmQiwgbW9udCwgY3R4KTsgLyoqLworICAgIEJOX2Zyb21fbW9udGdvbWVyeSgmQSwgJmMsIG1vbnQsIGN0eCk7ICAgICAgICAvKiovCisgICAgaWYgKGJwICE9IE5VTEwpIHsKKyAgICAgIGlmICghcmVzdWx0cykgeworI2lmZGVmIHVuZGVmCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJWQgKiAlZCAlJSAlZFxuIiwgQk5fbnVtX2JpdHMoJmEpLCBCTl9udW1fYml0cygmYiksCisgICAgICAgICAgICAgICAgQk5fbnVtX2JpdHMobW9udC0+TikpOworI2VuZGlmCisgICAgICAgIEJOX3ByaW50KGJwLCAmYSk7CisgICAgICAgIEJJT19wdXRzKGJwLCAiICogIik7CisgICAgICAgIEJOX3ByaW50KGJwLCAmYik7CisgICAgICAgIEJJT19wdXRzKGJwLCAiICUgIik7CisgICAgICAgIEJOX3ByaW50KGJwLCAmKG1vbnQtPk4pKTsKKyAgICAgICAgQklPX3B1dHMoYnAsICIgLSAiKTsKKyAgICAgIH0KKyAgICAgIEJOX3ByaW50KGJwLCAmQSk7CisgICAgICBCSU9fcHV0cyhicCwgIlxuIik7CisgICAgfQorICAgIEJOX21vZF9tdWwoJmQsICZhLCAmYiwgJm4sIGN0eCk7CisgICAgQk5fc3ViKCZkLCAmZCwgJkEpOworICAgIGlmICghQk5faXNfemVybygmZCkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiTW9udGdvbWVyeSBtdWx0aXBsaWNhdGlvbiB0ZXN0IGZhaWxlZCFcbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIEJOX01PTlRfQ1RYX2ZyZWUobW9udCk7CisgIEJOX2ZyZWUoJmEpOworICBCTl9mcmVlKCZiKTsKKyAgQk5fZnJlZSgmYyk7CisgIEJOX2ZyZWUoJmQpOworICBCTl9mcmVlKCZBKTsKKyAgQk5fZnJlZSgmQik7CisgIEJOX2ZyZWUoJm4pOworICByZXR1cm4gKDEpOworfQorCitpbnQgdGVzdF9tb2QoQklPICpicCwgQk5fQ1RYICpjdHgpIHsKKyAgQklHTlVNICphLCAqYiwgKmMsICpkLCAqZTsKKyAgaW50IGk7CisKKyAgYSA9IEJOX25ldygpOworICBiID0gQk5fbmV3KCk7CisgIGMgPSBCTl9uZXcoKTsKKyAgZCA9IEJOX25ldygpOworICBlID0gQk5fbmV3KCk7CisKKyAgQk5fcmFuZChhLCAxMDI0LCAwLCAwKTsgLyoqLworICBmb3IgKGkgPSAwOyBpIDwgbnVtMDsgaSsrKSB7CisgICAgQk5fcmFuZChiLCA0NTAgKyBpICogMTAsIDAsIDApOyAvKiovCisgICAgYS0+bmVnID0gcmFuZF9uZWcoKTsKKyAgICBiLT5uZWcgPSByYW5kX25lZygpOworICAgIEJOX21vZChjLCBhLCBiLCBjdHgpOyAvKiovCisgICAgaWYgKGJwICE9IE5VTEwpIHsKKyAgICAgIGlmICghcmVzdWx0cykgeworICAgICAgICBCTl9wcmludChicCwgYSk7CisgICAgICAgIEJJT19wdXRzKGJwLCAiICUgIik7CisgICAgICAgIEJOX3ByaW50KGJwLCBiKTsKKyAgICAgICAgQklPX3B1dHMoYnAsICIgLSAiKTsKKyAgICAgIH0KKyAgICAgIEJOX3ByaW50KGJwLCBjKTsKKyAgICAgIEJJT19wdXRzKGJwLCAiXG4iKTsKKyAgICB9CisgICAgQk5fZGl2KGQsIGUsIGEsIGIsIGN0eCk7CisgICAgQk5fc3ViKGUsIGUsIGMpOworICAgIGlmICghQk5faXNfemVybyhlKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJNb2R1bG8gdGVzdCBmYWlsZWQhXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICBCTl9mcmVlKGEpOworICBCTl9mcmVlKGIpOworICBCTl9mcmVlKGMpOworICBCTl9mcmVlKGQpOworICBCTl9mcmVlKGUpOworICByZXR1cm4gKDEpOworfQorCitpbnQgdGVzdF9tb2RfbXVsKEJJTyAqYnAsIEJOX0NUWCAqY3R4KSB7CisgIEJJR05VTSAqYSwgKmIsICpjLCAqZCwgKmU7CisgIGludCBpLCBqOworCisgIGEgPSBCTl9uZXcoKTsKKyAgYiA9IEJOX25ldygpOworICBjID0gQk5fbmV3KCk7CisgIGQgPSBCTl9uZXcoKTsKKyAgZSA9IEJOX25ldygpOworCisgIGZvciAoaiA9IDA7IGogPCAzOyBqKyspIHsKKyAgICBCTl9yYW5kKGMsIDEwMjQsIDAsIDApOyAvKiovCisgICAgZm9yIChpID0gMDsgaSA8IG51bTA7IGkrKykgeworICAgICAgQk5fcmFuZChhLCA0NzUgKyBpICogMTAsIDAsIDApOyAvKiovCisgICAgICBCTl9yYW5kKGIsIDQyNSArIGkgKiAxMSwgMCwgMCk7IC8qKi8KKyAgICAgIGEtPm5lZyA9IHJhbmRfbmVnKCk7CisgICAgICBiLT5uZWcgPSByYW5kX25lZygpOworICAgICAgaWYgKCFCTl9tb2RfbXVsKGUsIGEsIGIsIGMsIGN0eCkpIHsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBsOworCisgICAgICAgIHdoaWxlICgobCA9IEVSUl9nZXRfZXJyb3IoKSkpCisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjolc1xuIiwgRVJSX2Vycm9yX3N0cmluZyhsLCBOVUxMKSk7CisgICAgICAgIGFib3J0KCk7CisgICAgICB9CisgICAgICBpZiAoYnAgIT0gTlVMTCkgeworICAgICAgICBpZiAoIXJlc3VsdHMpIHsKKyAgICAgICAgICBCTl9wcmludChicCwgYSk7CisgICAgICAgICAgQklPX3B1dHMoYnAsICIgKiAiKTsKKyAgICAgICAgICBCTl9wcmludChicCwgYik7CisgICAgICAgICAgQklPX3B1dHMoYnAsICIgJSAiKTsKKyAgICAgICAgICBCTl9wcmludChicCwgYyk7CisgICAgICAgICAgaWYgKChhLT5uZWcgXiBiLT5uZWcpICYmICFCTl9pc196ZXJvKGUpKSB7CisgICAgICAgICAgICAvKiBJZiAgKGEqYikgJSBjICBpcyBuZWdhdGl2ZSwgIGMgIG11c3QgYmUgYWRkZWQKKyAgICAgICAgICAgICAqIGluIG9yZGVyIHRvIG9idGFpbiB0aGUgbm9ybWFsaXplZCByZW1haW5kZXIKKyAgICAgICAgICAgICAqIChuZXcgd2l0aCBPcGVuU1NMIDAuOS43LCBwcmV2aW91cyB2ZXJzaW9ucyBvZgorICAgICAgICAgICAgICogQk5fbW9kX211bCBjb3VsZCBnZW5lcmF0ZSBuZWdhdGl2ZSByZXN1bHRzKQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBCSU9fcHV0cyhicCwgIiArICIpOworICAgICAgICAgICAgQk5fcHJpbnQoYnAsIGMpOworICAgICAgICAgIH0KKyAgICAgICAgICBCSU9fcHV0cyhicCwgIiAtICIpOworICAgICAgICB9CisgICAgICAgIEJOX3ByaW50KGJwLCBlKTsKKyAgICAgICAgQklPX3B1dHMoYnAsICJcbiIpOworICAgICAgfQorICAgICAgQk5fbXVsKGQsIGEsIGIsIGN0eCk7CisgICAgICBCTl9zdWIoZCwgZCwgZSk7CisgICAgICBCTl9kaXYoYSwgYiwgZCwgYywgY3R4KTsKKyAgICAgIGlmICghQk5faXNfemVybyhiKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1vZHVsbyBtdWx0aXBseSB0ZXN0IGZhaWxlZCFcbiIpOworICAgICAgICBFUlJfcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgIH0KKyAgfQorICBCTl9mcmVlKGEpOworICBCTl9mcmVlKGIpOworICBCTl9mcmVlKGMpOworICBCTl9mcmVlKGQpOworICBCTl9mcmVlKGUpOworICByZXR1cm4gKDEpOworfQorCitpbnQgdGVzdF9tb2RfZXhwKEJJTyAqYnAsIEJOX0NUWCAqY3R4KSB7CisgIEJJR05VTSAqYSwgKmIsICpjLCAqZCwgKmU7CisgIGludCBpOworCisgIGEgPSBCTl9uZXcoKTsKKyAgYiA9IEJOX25ldygpOworICBjID0gQk5fbmV3KCk7CisgIGQgPSBCTl9uZXcoKTsKKyAgZSA9IEJOX25ldygpOworCisgIEJOX3JhbmQoYywgMzAsIDAsIDEpOyAvKiBtdXN0IGJlIG9kZCBmb3IgbW9udGdvbWVyeSAqLworICBmb3IgKGkgPSAwOyBpIDwgbnVtMjsgaSsrKSB7CisgICAgQk5fcmFuZChhLCAyMCArIGkgKiA1LCAwLCAwKTsgLyoqLworICAgIEJOX3JhbmQoYiwgMiArIGksIDAsIDApOyAgICAgIC8qKi8KKworICAgIGlmICghQk5fbW9kX2V4cChkLCBhLCBiLCBjLCBjdHgpKQorICAgICAgcmV0dXJuICgwKTsKKworICAgIGlmIChicCAhPSBOVUxMKSB7CisgICAgICBpZiAoIXJlc3VsdHMpIHsKKyAgICAgICAgQk5fcHJpbnQoYnAsIGEpOworICAgICAgICBCSU9fcHV0cyhicCwgIiBeICIpOworICAgICAgICBCTl9wcmludChicCwgYik7CisgICAgICAgIEJJT19wdXRzKGJwLCAiICUgIik7CisgICAgICAgIEJOX3ByaW50KGJwLCBjKTsKKyAgICAgICAgQklPX3B1dHMoYnAsICIgLSAiKTsKKyAgICAgIH0KKyAgICAgIEJOX3ByaW50KGJwLCBkKTsKKyAgICAgIEJJT19wdXRzKGJwLCAiXG4iKTsKKyAgICB9CisgICAgQk5fZXhwKGUsIGEsIGIsIGN0eCk7CisgICAgQk5fc3ViKGUsIGUsIGQpOworICAgIEJOX2RpdihhLCBiLCBlLCBjLCBjdHgpOworICAgIGlmICghQk5faXNfemVybyhiKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJNb2R1bG8gZXhwb25lbnRpYXRpb24gdGVzdCBmYWlsZWQhXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICBCTl9mcmVlKGEpOworICBCTl9mcmVlKGIpOworICBCTl9mcmVlKGMpOworICBCTl9mcmVlKGQpOworICBCTl9mcmVlKGUpOworICByZXR1cm4gKDEpOworfQorCitpbnQgdGVzdF9tb2RfZXhwX21vbnRfY29uc3R0aW1lKEJJTyAqYnAsIEJOX0NUWCAqY3R4KSB7CisgIEJJR05VTSAqYSwgKmIsICpjLCAqZCwgKmU7CisgIGludCBpOworCisgIGEgPSBCTl9uZXcoKTsKKyAgYiA9IEJOX25ldygpOworICBjID0gQk5fbmV3KCk7CisgIGQgPSBCTl9uZXcoKTsKKyAgZSA9IEJOX25ldygpOworCisgIEJOX3JhbmQoYywgMzAsIDAsIDEpOyAvKiBtdXN0IGJlIG9kZCBmb3IgbW9udGdvbWVyeSAqLworICBmb3IgKGkgPSAwOyBpIDwgbnVtMjsgaSsrKSB7CisgICAgQk5fcmFuZChhLCAyMCArIGkgKiA1LCAwLCAwKTsgLyoqLworICAgIEJOX3JhbmQoYiwgMiArIGksIDAsIDApOyAgICAgIC8qKi8KKworICAgIGlmICghQk5fbW9kX2V4cF9tb250X2NvbnN0dGltZShkLCBhLCBiLCBjLCBjdHgsIE5VTEwpKQorICAgICAgcmV0dXJuICgwMCk7CisKKyAgICBpZiAoYnAgIT0gTlVMTCkgeworICAgICAgaWYgKCFyZXN1bHRzKSB7CisgICAgICAgIEJOX3ByaW50KGJwLCBhKTsKKyAgICAgICAgQklPX3B1dHMoYnAsICIgXiAiKTsKKyAgICAgICAgQk5fcHJpbnQoYnAsIGIpOworICAgICAgICBCSU9fcHV0cyhicCwgIiAlICIpOworICAgICAgICBCTl9wcmludChicCwgYyk7CisgICAgICAgIEJJT19wdXRzKGJwLCAiIC0gIik7CisgICAgICB9CisgICAgICBCTl9wcmludChicCwgZCk7CisgICAgICBCSU9fcHV0cyhicCwgIlxuIik7CisgICAgfQorICAgIEJOX2V4cChlLCBhLCBiLCBjdHgpOworICAgIEJOX3N1YihlLCBlLCBkKTsKKyAgICBCTl9kaXYoYSwgYiwgZSwgYywgY3R4KTsKKyAgICBpZiAoIUJOX2lzX3plcm8oYikpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiTW9kdWxvIGV4cG9uZW50aWF0aW9uIHRlc3QgZmFpbGVkIVxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgQk5fZnJlZShhKTsKKyAgQk5fZnJlZShiKTsKKyAgQk5fZnJlZShjKTsKKyAgQk5fZnJlZShkKTsKKyAgQk5fZnJlZShlKTsKKyAgcmV0dXJuICgxKTsKK30KKworaW50IHRlc3RfZXhwKEJJTyAqYnAsIEJOX0NUWCAqY3R4KSB7CisgIEJJR05VTSAqYSwgKmIsICpkLCAqZSwgKm9uZTsKKyAgaW50IGk7CisKKyAgYSA9IEJOX25ldygpOworICBiID0gQk5fbmV3KCk7CisgIGQgPSBCTl9uZXcoKTsKKyAgZSA9IEJOX25ldygpOworICBvbmUgPSBCTl9uZXcoKTsKKyAgQk5fb25lKG9uZSk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bTI7IGkrKykgeworICAgIEJOX3JhbmQoYSwgMjAgKyBpICogNSwgMCwgMCk7IC8qKi8KKyAgICBCTl9yYW5kKGIsIDIgKyBpLCAwLCAwKTsgICAgICAvKiovCisKKyAgICBpZiAoQk5fZXhwKGQsIGEsIGIsIGN0eCkgPD0gMCkKKyAgICAgIHJldHVybiAoMCk7CisKKyAgICBpZiAoYnAgIT0gTlVMTCkgeworICAgICAgaWYgKCFyZXN1bHRzKSB7CisgICAgICAgIEJOX3ByaW50KGJwLCBhKTsKKyAgICAgICAgQklPX3B1dHMoYnAsICIgXiAiKTsKKyAgICAgICAgQk5fcHJpbnQoYnAsIGIpOworICAgICAgICBCSU9fcHV0cyhicCwgIiAtICIpOworICAgICAgfQorICAgICAgQk5fcHJpbnQoYnAsIGQpOworICAgICAgQklPX3B1dHMoYnAsICJcbiIpOworICAgIH0KKyAgICBCTl9vbmUoZSk7CisgICAgZm9yICg7ICFCTl9pc196ZXJvKGIpOyBCTl9zdWIoYiwgYiwgb25lKSkKKyAgICAgIEJOX211bChlLCBlLCBhLCBjdHgpOworICAgIEJOX3N1YihlLCBlLCBkKTsKKyAgICBpZiAoIUJOX2lzX3plcm8oZSkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRXhwb25lbnRpYXRpb24gdGVzdCBmYWlsZWQhXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICBCTl9mcmVlKGEpOworICBCTl9mcmVlKGIpOworICBCTl9mcmVlKGQpOworICBCTl9mcmVlKGUpOworICBCTl9mcmVlKG9uZSk7CisgIHJldHVybiAoMSk7Cit9CisKK3N0YXRpYyBpbnQgZ2VucHJpbWVfY2IoaW50IHAsIGludCBuLCBCTl9HRU5DQiAqYXJnKSB7CisgIGNoYXIgYyA9ICcqJzsKKworICBpZiAocCA9PSAwKQorICAgIGMgPSAnLic7CisgIGlmIChwID09IDEpCisgICAgYyA9ICcrJzsKKyAgaWYgKHAgPT0gMikKKyAgICBjID0gJyonOworICBpZiAocCA9PSAzKQorICAgIGMgPSAnXG4nOworICBwdXRjKGMsIHN0ZG91dCk7CisgIGZmbHVzaChzdGRvdXQpOworICByZXR1cm4gMTsKK30KKworaW50IHRlc3RfbW9kX3NxcnQoQklPICpicCwgQk5fQ1RYICpjdHgpIHsKKyAgQk5fR0VOQ0IgY2I7CisgIEJJR05VTSAqYSwgKnAsICpyOworICBpbnQgaSwgajsKKyAgaW50IHJldCA9IDA7CisKKyAgYSA9IEJOX25ldygpOworICBwID0gQk5fbmV3KCk7CisgIHIgPSBCTl9uZXcoKTsKKyAgaWYgKGEgPT0gTlVMTCB8fCBwID09IE5VTEwgfHwgciA9PSBOVUxMKQorICAgIGdvdG8gZXJyOworCisgIEJOX0dFTkNCX3NldCgmY2IsIGdlbnByaW1lX2NiLCBOVUxMKTsKKworICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgIGlmIChpIDwgOCkgeworICAgICAgdW5zaWduZWQgcHJpbWVzWzhdID0gezIsIDMsIDUsIDcsIDExLCAxMywgMTcsIDE5fTsKKworICAgICAgaWYgKCFCTl9zZXRfd29yZChwLCBwcmltZXNbaV0pKQorICAgICAgICBnb3RvIGVycjsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCFCTl9zZXRfd29yZChhLCAzMikpCisgICAgICAgIGdvdG8gZXJyOworICAgICAgaWYgKCFCTl9zZXRfd29yZChyLCAyICogaSArIDEpKQorICAgICAgICBnb3RvIGVycjsKKworICAgICAgaWYgKCFCTl9nZW5lcmF0ZV9wcmltZV9leChwLCAyNTYsIDAsIGEsIHIsICZjYikpCisgICAgICAgIGdvdG8gZXJyOworICAgICAgcHV0YygnXG4nLCBzdGRvdXQpOworICAgIH0KKyAgICBwLT5uZWcgPSByYW5kX25lZygpOworCisgICAgZm9yIChqID0gMDsgaiA8IG51bTI7IGorKykgeworICAgICAgLyogY29uc3RydWN0ICdhJyBzdWNoIHRoYXQgaXQgaXMgYSBzcXVhcmUgbW9kdWxvIHAsCisgICAgICAgKiBidXQgaW4gZ2VuZXJhbCBub3QgYSBwcm9wZXIgc3F1YXJlIGFuZCBub3QgcmVkdWNlZCBtb2R1bG8gcCAqLworICAgICAgaWYgKCFCTl9yYW5kKHIsIDI1NiwgMCwgMykpCisgICAgICAgIGdvdG8gZXJyOworICAgICAgaWYgKCFCTl9ubm1vZChyLCByLCBwLCBjdHgpKQorICAgICAgICBnb3RvIGVycjsKKyAgICAgIGlmICghQk5fbW9kX3NxcihyLCByLCBwLCBjdHgpKQorICAgICAgICBnb3RvIGVycjsKKyAgICAgIGlmICghQk5fcmFuZChhLCAyNTYsIDAsIDMpKQorICAgICAgICBnb3RvIGVycjsKKyAgICAgIGlmICghQk5fbm5tb2QoYSwgYSwgcCwgY3R4KSkKKyAgICAgICAgZ290byBlcnI7CisgICAgICBpZiAoIUJOX21vZF9zcXIoYSwgYSwgcCwgY3R4KSkKKyAgICAgICAgZ290byBlcnI7CisgICAgICBpZiAoIUJOX211bChhLCBhLCByLCBjdHgpKQorICAgICAgICBnb3RvIGVycjsKKyAgICAgIGlmIChyYW5kX25lZygpKQorICAgICAgICBpZiAoIUJOX3N1YihhLCBhLCBwKSkKKyAgICAgICAgICBnb3RvIGVycjsKKworICAgICAgaWYgKCFCTl9tb2Rfc3FydChyLCBhLCBwLCBjdHgpKQorICAgICAgICBnb3RvIGVycjsKKyAgICAgIGlmICghQk5fbW9kX3NxcihyLCByLCBwLCBjdHgpKQorICAgICAgICBnb3RvIGVycjsKKworICAgICAgaWYgKCFCTl9ubm1vZChhLCBhLCBwLCBjdHgpKQorICAgICAgICBnb3RvIGVycjsKKworICAgICAgaWYgKEJOX2NtcChhLCByKSAhPSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQk5fbW9kX3NxcnQgZmFpbGVkOiBhID0gIik7CisgICAgICAgIEJOX3ByaW50X2ZwKHN0ZGVyciwgYSk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiLCByID0gIik7CisgICAgICAgIEJOX3ByaW50X2ZwKHN0ZGVyciwgcik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiLCBwID0gIik7CisgICAgICAgIEJOX3ByaW50X2ZwKHN0ZGVyciwgcCk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisKKyAgICAgIHB1dGMoJy4nLCBzdGRvdXQpOworICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgfQorCisgICAgcHV0YygnXG4nLCBzdGRvdXQpOworICAgIGZmbHVzaChzdGRlcnIpOworICB9CisgIHJldCA9IDE7CitlcnI6CisgIGlmIChhICE9IE5VTEwpCisgICAgQk5fZnJlZShhKTsKKyAgaWYgKHAgIT0gTlVMTCkKKyAgICBCTl9mcmVlKHApOworICBpZiAociAhPSBOVUxMKQorICAgIEJOX2ZyZWUocik7CisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vYm4vY21wLmMgYi9jcnlwdG8vYm4vY21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNlNzIzMwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9ibi9jbXAuYwpAQCAtMCwwICsxLDIwMCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKworI2luY2x1ZGUgImludGVybmFsLmgiCisKKworaW50IEJOX3VjbXAoY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIpIHsKKyAgaW50IGk7CisgIEJOX1VMT05HIHQxLCB0MiwgKmFwLCAqYnA7CisKKyAgaSA9IGEtPnRvcCAtIGItPnRvcDsKKyAgaWYgKGkgIT0gMCkgeworICAgIHJldHVybiBpOworICB9CisKKyAgYXAgPSBhLT5kOworICBicCA9IGItPmQ7CisgIGZvciAoaSA9IGEtPnRvcCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgdDEgPSBhcFtpXTsKKyAgICB0MiA9IGJwW2ldOworICAgIGlmICh0MSAhPSB0MikgeworICAgICAgcmV0dXJuICh0MSA+IHQyKSA/IDEgOiAtMTsKKyAgICB9CisgIH0KKworICByZXR1cm4gMDsKK30KKworaW50IEJOX2NtcChjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYikgeworICBpbnQgaTsKKyAgaW50IGd0LCBsdDsKKyAgQk5fVUxPTkcgdDEsIHQyOworCisgIGlmICgoYSA9PSBOVUxMKSB8fCAoYiA9PSBOVUxMKSkgeworICAgIGlmIChhICE9IE5VTEwpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgaWYgKGIgIT0gTlVMTCkgeworICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIGlmIChhLT5uZWcgIT0gYi0+bmVnKSB7CisgICAgaWYgKGEtPm5lZykgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoYS0+bmVnID09IDApIHsKKyAgICBndCA9IDE7CisgICAgbHQgPSAtMTsKKyAgfSBlbHNlIHsKKyAgICBndCA9IC0xOworICAgIGx0ID0gMTsKKyAgfQorCisgIGlmIChhLT50b3AgPiBiLT50b3ApIHsKKyAgICByZXR1cm4gZ3Q7CisgIH0KKyAgaWYgKGEtPnRvcCA8IGItPnRvcCkgeworICAgIHJldHVybiBsdDsKKyAgfQorCisgIGZvciAoaSA9IGEtPnRvcCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgdDEgPSBhLT5kW2ldOworICAgIHQyID0gYi0+ZFtpXTsKKyAgICBpZiAodDEgPiB0MikgeworICAgICAgcmV0dXJuIGd0OworICAgIH0gaWYgKHQxIDwgdDIpIHsKKyAgICAgIHJldHVybiBsdDsKKyAgICB9CisgIH0KKworICByZXR1cm4gMDsKK30KKworaW50IGJuX2NtcF93b3Jkcyhjb25zdCBCTl9VTE9ORyAqYSwgY29uc3QgQk5fVUxPTkcgKmIsIGludCBuKSB7CisgIGludCBpOworICBCTl9VTE9ORyBhYSwgYmI7CisKKyAgYWEgPSBhW24gLSAxXTsKKyAgYmIgPSBiW24gLSAxXTsKKyAgaWYgKGFhICE9IGJiKSB7CisgICAgcmV0dXJuIChhYSA+IGJiKSA/IDEgOiAtMTsKKyAgfQorCisgIGZvciAoaSA9IG4gLSAyOyBpID49IDA7IGktLSkgeworICAgIGFhID0gYVtpXTsKKyAgICBiYiA9IGJbaV07CisgICAgaWYgKGFhICE9IGJiKSB7CisgICAgICByZXR1cm4gKGFhID4gYmIpID8gMSA6IC0xOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IGJuX2NtcF9wYXJ0X3dvcmRzKGNvbnN0IEJOX1VMT05HICphLCBjb25zdCBCTl9VTE9ORyAqYiwgaW50IGNsLCBpbnQgZGwpIHsKKyAgaW50IG4sIGk7CisgIG4gPSBjbCAtIDE7CisKKyAgaWYgKGRsIDwgMCkgeworICAgIGZvciAoaSA9IGRsOyBpIDwgMDsgaSsrKSB7CisgICAgICBpZiAoYltuIC0gaV0gIT0gMCkgeworICAgICAgICByZXR1cm4gLTE7IC8qIGEgPCBiICovCisgICAgICB9CisgICAgfQorICB9CisgIGlmIChkbCA+IDApIHsKKyAgICBmb3IgKGkgPSBkbDsgaSA+IDA7IGktLSkgeworICAgICAgaWYgKGFbbiArIGldICE9IDApIHsKKyAgICAgICAgcmV0dXJuIDE7IC8qIGEgPiBiICovCisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIGJuX2NtcF93b3JkcyhhLCBiLCBjbCk7Cit9CisKK2ludCBCTl9hYnNfaXNfd29yZChjb25zdCBCSUdOVU0gKmJuLCBCTl9VTE9ORyB3KSB7CisgIHN3aXRjaCAoYm4tPnRvcCkgeworICAgIGNhc2UgMToKKyAgICAgIHJldHVybiBibi0+ZFswXSA9PSB3OworICAgIGNhc2UgMDoKKyAgICAgIHJldHVybiB3ID09IDA7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAwOworICB9Cit9CisKK2ludCBCTl9pc196ZXJvKGNvbnN0IEJJR05VTSAqYm4pIHsKKyAgcmV0dXJuIGJuLT50b3AgPT0gMDsKK30KKworaW50IEJOX2lzX29uZShjb25zdCBCSUdOVU0gKmJuKSB7CisgIHJldHVybiBibi0+bmVnID09IDAgJiYgQk5fYWJzX2lzX3dvcmQoYm4sIDEpOworfQorCitpbnQgQk5faXNfd29yZChjb25zdCBCSUdOVU0gKmJuLCBCTl9VTE9ORyB3KSB7CisgIHJldHVybiBCTl9hYnNfaXNfd29yZChibiwgdykgJiYgKHcgPT0gMCB8fCBibi0+bmVnID09IDApOworfQorCitpbnQgQk5faXNfb2RkKGNvbnN0IEJJR05VTSAqYm4pIHsKKyAgcmV0dXJuIGJuLT50b3AgPiAwICYmIChibi0+ZFswXSAmIDEpID09IDE7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vYm4vY29udmVydC5jIGIvY3J5cHRvL2JuL2NvbnZlcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmIzOTFhCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2JuL2NvbnZlcnQuYwpAQCAtMCwwICsxLDQzOSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworQklHTlVNICpCTl9iaW4yYm4oY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBsZW4sIEJJR05VTSAqcmV0KSB7CisgIHVuc2lnbmVkIG51bV93b3JkcywgbTsKKyAgQk5fVUxPTkcgd29yZCA9IDA7CisgIEJJR05VTSAqYm4gPSBOVUxMOworCisgIGlmIChyZXQgPT0gTlVMTCkgeworICAgIHJldCA9IGJuID0gQk5fbmV3KCk7CisgIH0KKworICBpZiAocmV0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmIChsZW4gPT0gMCkgeworICAgIHJldC0+dG9wID0gMDsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgbnVtX3dvcmRzID0gKChsZW4gLSAxKSAvIEJOX0JZVEVTKSArIDE7CisgIG0gPSAobGVuIC0gMSkgJSBCTl9CWVRFUzsKKyAgaWYgKGJuX3dleHBhbmQocmV0LCBudW1fd29yZHMpID09IE5VTEwpIHsKKyAgICBpZiAoYm4pIHsKKyAgICAgIEJOX2ZyZWUoYm4pOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJldC0+dG9wID0gbnVtX3dvcmRzOworICByZXQtPm5lZyA9IDA7CisKKyAgd2hpbGUgKGxlbi0tKSB7CisgICAgd29yZCA9ICh3b3JkIDw8IDgpIHwgKihpbisrKTsKKyAgICBpZiAobS0tID09IDApIHsKKyAgICAgIHJldC0+ZFstLW51bV93b3Jkc10gPSB3b3JkOworICAgICAgd29yZCA9IDA7CisgICAgICBtID0gQk5fQllURVMgLSAxOworICAgIH0KKyAgfQorCisgIC8qIG5lZWQgdG8gY2FsbCB0aGlzIGR1ZSB0byBjbGVhciBieXRlIGF0IHRvcCBpZiBhdm9pZGluZyBoYXZpbmcgdGhlIHRvcCBiaXQKKyAgICogc2V0ICgtdmUgbnVtYmVyKSAqLworICBibl9jb3JyZWN0X3RvcChyZXQpOworICByZXR1cm4gcmV0OworfQorCitzaXplX3QgQk5fYm4yYmluKGNvbnN0IEJJR05VTSAqaW4sIHVpbnQ4X3QgKm91dCkgeworICBzaXplX3QgbiwgaTsKKyAgQk5fVUxPTkcgbDsKKworICBuID0gaSA9IEJOX251bV9ieXRlcyhpbik7CisgIHdoaWxlIChpLS0pIHsKKyAgICBsID0gaW4tPmRbaSAvIEJOX0JZVEVTXTsKKyAgICAqKG91dCsrKSA9ICh1bnNpZ25lZCBjaGFyKShsID4+ICg4ICogKGkgJSBCTl9CWVRFUykpKSAmIDB4ZmY7CisgIH0KKyAgcmV0dXJuIG47Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIGhleHRhYmxlW10gPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisKK2NoYXIgKkJOX2JuMmhleChjb25zdCBCSUdOVU0gKmJuKSB7CisgIGludCBpLCBqLCB2LCB6ID0gMDsKKyAgY2hhciAqYnVmOworICBjaGFyICpwOworCisgIGJ1ZiA9IChjaGFyICopT1BFTlNTTF9tYWxsb2MoYm4tPnRvcCAqIEJOX0JZVEVTICogMiArIDIpOworICBpZiAoYnVmID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fYm4yaGV4LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBwID0gYnVmOworICBpZiAoYm4tPm5lZykgeworICAgICoocCsrKSA9ICctJzsKKyAgfQorCisgIGlmIChCTl9pc196ZXJvKGJuKSkgeworICAgICoocCsrKSA9ICcwJzsKKyAgfQorCisgIGZvciAoaSA9IGJuLT50b3AgLSAxOyBpID49IDA7IGktLSkgeworICAgIGZvciAoaiA9IEJOX0JJVFMyIC0gODsgaiA+PSAwOyBqIC09IDgpIHsKKyAgICAgIC8qIHN0cmlwIGxlYWRpbmcgemVyb3MgKi8KKyAgICAgIHYgPSAoKGludCkoYm4tPmRbaV0gPj4gKGxvbmcpaikpICYgMHhmZjsKKyAgICAgIGlmICh6IHx8IHYgIT0gMCkgeworICAgICAgICAqKHArKykgPSBoZXh0YWJsZVt2ID4+IDRdOworICAgICAgICAqKHArKykgPSBoZXh0YWJsZVt2ICYgMHgwZl07CisgICAgICAgIHogPSAxOworICAgICAgfQorICAgIH0KKyAgfQorICAqcCA9ICdcMCc7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworLyogZGVjb2RlX2hleCBkZWNvZGVzIHxpfCBieXRlcyBvZiBoZXggZGF0YSBmcm9tIHxpbnwgYW5kIHVwZGF0ZXMgfGJufC4gKi8KK3N0YXRpYyB2b2lkIGRlY29kZV9oZXgoQklHTlVNICpibiwgY29uc3QgY2hhciAqaW4sIGludCBpKSB7CisgIGludCBoLCBtLCBqLCBrLCBjOworICBCTl9VTE9ORyBsPTA7CisKKyAgaiA9IGk7IC8qIGxlYXN0IHNpZ25pZmljYW50ICdoZXgnICovCisgIG0gPSAwOworICBoID0gMDsKKyAgd2hpbGUgKGogPiAwKSB7CisgICAgbSA9ICgoQk5fQllURVMgKiAyKSA8PSBqKSA/IChCTl9CWVRFUyAqIDIpIDogajsKKyAgICBsID0gMDsKKyAgICBmb3IgKDs7KSB7CisgICAgICBjID0gaW5baiAtIG1dOworICAgICAgaWYgKChjID49ICcwJykgJiYgKGMgPD0gJzknKSkgeworICAgICAgICBrID0gYyAtICcwJzsKKyAgICAgIH0gZWxzZSBpZiAoKGMgPj0gJ2EnKSAmJiAoYyA8PSAnZicpKSB7CisgICAgICAgIGsgPSBjIC0gJ2EnICsgMTA7CisgICAgICB9IGVsc2UgaWYgKChjID49ICdBJykgJiYgKGMgPD0gJ0YnKSkgeworICAgICAgICBrID0gYyAtICdBJyArIDEwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgayA9IDA7IC8qIHBhcmFub2lhICovCisgICAgICB9CisKKyAgICAgIGwgPSAobCA8PCA0KSB8IGs7CisKKyAgICAgIGlmICgtLW0gPD0gMCkgeworICAgICAgICBibi0+ZFtoKytdID0gbDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgaiAtPSAoQk5fQllURVMgKiAyKTsKKyAgfQorCisgIGJuLT50b3AgPSBoOworfQorCisvKiBkZWNvZGVfZGVjIGRlY29kZXMgfGl8IGJ5dGVzIG9mIGRlY2ltYWwgZGF0YSBmcm9tIHxpbnwgYW5kIHVwZGF0ZXMgfGJufC4gKi8KK3N0YXRpYyB2b2lkIGRlY29kZV9kZWMoQklHTlVNICpibiwgY29uc3QgY2hhciAqaW4sIGludCBpKSB7CisgIGludCBqOworICBCTl9VTE9ORyBsID0gMDsKKworICBqID0gQk5fREVDX05VTSAtIChpICUgQk5fREVDX05VTSk7CisgIGlmIChqID09IEJOX0RFQ19OVU0pIHsKKyAgICBqID0gMDsKKyAgfQorICBsID0gMDsKKyAgd2hpbGUgKCppbikgeworICAgIGwgKj0gMTA7CisgICAgbCArPSAqaW4gLSAnMCc7CisgICAgaW4rKzsKKyAgICBpZiAoKytqID09IEJOX0RFQ19OVU0pIHsKKyAgICAgIEJOX211bF93b3JkKGJuLCBCTl9ERUNfQ09OVik7CisgICAgICBCTl9hZGRfd29yZChibiwgbCk7CisgICAgICBsID0gMDsKKyAgICAgIGogPSAwOworICAgIH0KKyAgfQorfQorCit0eXBlZGVmIHZvaWQgKCpkZWNvZGVfZnVuYykgKEJJR05VTSAqYm4sIGNvbnN0IGNoYXIgKmluLCBpbnQgaSk7Cit0eXBlZGVmIGludCAoKmNoYXJfdGVzdF9mdW5jKSAoaW50IGMpOworCitzdGF0aWMgaW50IGJuX3gyYm4oQklHTlVNICoqb3V0cCwgY29uc3QgY2hhciAqaW4sIGRlY29kZV9mdW5jIGRlY29kZSwgY2hhcl90ZXN0X2Z1bmMgd2FudF9jaGFyKSB7CisgIEJJR05VTSAqcmV0ID0gTlVMTDsKKyAgaW50IG5lZyA9IDAsIGk7CisgIGludCBudW07CisKKyAgaWYgKGluID09IE5VTEwgfHwgKmluID09IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmICgqaW4gPT0gJy0nKSB7CisgICAgbmVnID0gMTsKKyAgICBpbisrOworICB9CisKKyAgZm9yIChpID0gMDsgd2FudF9jaGFyKCh1bnNpZ25lZCBjaGFyKWluW2ldKTsgaSsrKSB7fQorCisgIG51bSA9IGkgKyBuZWc7CisgIGlmIChvdXRwID09IE5VTEwpIHsKKyAgICByZXR1cm4gbnVtOworICB9CisKKyAgLyogaW4gaXMgdGhlIHN0YXJ0IG9mIHRoZSBoZXggZGlnaXRzLCBhbmQgaXQgaXMgJ2knIGxvbmcgKi8KKyAgaWYgKCpvdXRwID09IE5VTEwpIHsKKyAgICByZXQgPSBCTl9uZXcoKTsKKyAgICBpZiAocmV0ID09IE5VTEwpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXQgPSAqb3V0cDsKKyAgICBCTl96ZXJvKHJldCk7CisgIH0KKyAgcmV0LT5uZWcgPSBuZWc7CisKKyAgLyogaSBpcyB0aGUgbnVtYmVyIG9mIGhleCBkaWdlc3RzOyAqLworICBpZiAoYm5fZXhwYW5kKHJldCwgaSAqIDQpID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGRlY29kZShyZXQsIGluLCBpKTsKKworICBibl9jb3JyZWN0X3RvcChyZXQpOworCisgICpvdXRwID0gcmV0OworICByZXR1cm4gbnVtOworCitlcnI6CisgIGlmICgqb3V0cCA9PSBOVUxMKSB7CisgICAgQk5fZnJlZShyZXQpOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBCTl9oZXgyYm4oQklHTlVNICoqb3V0cCwgY29uc3QgY2hhciAqaW4pIHsKKyAgcmV0dXJuIGJuX3gyYm4ob3V0cCwgaW4sIGRlY29kZV9oZXgsIGlzeGRpZ2l0KTsKK30KKworY2hhciAqQk5fYm4yZGVjKGNvbnN0IEJJR05VTSAqYSkgeworICBpbnQgaSA9IDAsIG51bSwgb2sgPSAwOworICBjaGFyICpidWYgPSBOVUxMOworICBjaGFyICpwOworICBCSUdOVU0gKnQgPSBOVUxMOworICBCTl9VTE9ORyAqYm5fZGF0YSA9IE5VTEwsICpscDsKKworICAvKiBnZXQgYW4gdXBwZXIgYm91bmQgZm9yIHRoZSBsZW5ndGggb2YgdGhlIGRlY2ltYWwgaW50ZWdlcgorICAgKiBudW0gPD0gKEJOX251bV9iaXRzKGEpICsgMSkgKiBsb2coMikKKyAgICogICAgIDw9IDMgKiBCTl9udW1fYml0cyhhKSAqIDAuMTAwMSArIGxvZygyKSArIDEgICAgIChyb3VuZGluZyBlcnJvcikKKyAgICogICAgIDw9IEJOX251bV9iaXRzKGEpLzEwICsgQk5fbnVtX2JpdHMvMTAwMCArIDEgKyAxCisgICAqLworICBpID0gQk5fbnVtX2JpdHMoYSkgKiAzOworICBudW0gPSBpIC8gMTAgKyBpIC8gMTAwMCArIDEgKyAxOworICBibl9kYXRhID0KKyAgICAgIChCTl9VTE9ORyAqKU9QRU5TU0xfbWFsbG9jKChudW0gLyBCTl9ERUNfTlVNICsgMSkgKiBzaXplb2YoQk5fVUxPTkcpKTsKKyAgYnVmID0gKGNoYXIgKilPUEVOU1NMX21hbGxvYyhudW0gKyAzKTsKKyAgaWYgKChidWYgPT0gTlVMTCkgfHwgKGJuX2RhdGEgPT0gTlVMTCkpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fYm4yZGVjLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgZ290byBlcnI7CisgIH0KKyAgdCA9IEJOX2R1cChhKTsKKyAgaWYgKHQgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisKKyNkZWZpbmUgQlVGX1JFTUFJTiAobnVtICsgMyAtIChzaXplX3QpKHAgLSBidWYpKQorICBwID0gYnVmOworICBscCA9IGJuX2RhdGE7CisgIGlmIChCTl9pc196ZXJvKHQpKSB7CisgICAgKihwKyspID0gJzAnOworICAgICoocCsrKSA9ICdcMCc7CisgIH0gZWxzZSB7CisgICAgaWYgKEJOX2lzX25lZ2F0aXZlKHQpKSB7CisgICAgICAqcCsrID0gJy0nOworICAgIH0KKworICAgIGkgPSAwOworICAgIHdoaWxlICghQk5faXNfemVybyh0KSkgeworICAgICAgKmxwID0gQk5fZGl2X3dvcmQodCwgQk5fREVDX0NPTlYpOworICAgICAgbHArKzsKKyAgICB9CisgICAgbHAtLTsKKyAgICAvKiBXZSBub3cgaGF2ZSBhIHNlcmllcyBvZiBibG9ja3MsIEJOX0RFQ19OVU0gY2hhcnMKKyAgICAgKiBpbiBsZW5ndGgsIHdoZXJlIHRoZSBsYXN0IG9uZSBuZWVkcyB0cnVuY2F0aW9uLgorICAgICAqIFRoZSBibG9ja3MgbmVlZCB0byBiZSByZXZlcnNlZCBpbiBvcmRlci4gKi8KKyAgICBCSU9fc25wcmludGYocCwgQlVGX1JFTUFJTiwgQk5fREVDX0ZNVDEsICpscCk7CisgICAgd2hpbGUgKCpwKSB7CisgICAgICBwKys7CisgICAgfQorICAgIHdoaWxlIChscCAhPSBibl9kYXRhKSB7CisgICAgICBscC0tOworICAgICAgQklPX3NucHJpbnRmKHAsIEJVRl9SRU1BSU4sIEJOX0RFQ19GTVQyLCAqbHApOworICAgICAgd2hpbGUgKCpwKSB7CisgICAgICAgIHArKzsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgb2sgPSAxOworCitlcnI6CisgIGlmIChibl9kYXRhICE9IE5VTEwpIHsKKyAgICBPUEVOU1NMX2ZyZWUoYm5fZGF0YSk7CisgIH0KKyAgaWYgKHQgIT0gTlVMTCkgeworICAgIEJOX2ZyZWUodCk7CisgIH0KKyAgaWYgKCFvayAmJiBidWYpIHsKKyAgICBPUEVOU1NMX2ZyZWUoYnVmKTsKKyAgICBidWYgPSBOVUxMOworICB9CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworaW50IEJOX2RlYzJibihCSUdOVU0gKipvdXRwLCBjb25zdCBjaGFyICppbikgeworICByZXR1cm4gYm5feDJibihvdXRwLCBpbiwgZGVjb2RlX2RlYywgaXNkaWdpdCk7Cit9CisKK2ludCBCTl9hc2MyYm4oQklHTlVNICoqb3V0cCwgY29uc3QgY2hhciAqaW4pIHsKKyAgY29uc3QgY2hhciAqY29uc3Qgb3JpZ19pbiA9IGluOworICBpZiAoKmluID09ICctJykgeworICAgIGluKys7CisgIH0KKworICBpZiAoaW5bMF0gPT0gJzAnICYmIChpblsxXSA9PSAnWCcgfHwgaW5bMV0gPT0gJ3gnKSkgeworICAgIGlmICghQk5faGV4MmJuKG91dHAsIGluKzIpKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKCFCTl9kZWMyYm4ob3V0cCwgaW4pKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICBpZiAoKm9yaWdfaW4gPT0gJy0nKSB7CisgICAgKCpvdXRwKS0+bmVnID0gMTsKKyAgfQorCisgIHJldHVybiAxOworfQorCitpbnQgQk5fcHJpbnQoQklPICpicCwgY29uc3QgQklHTlVNICphKSB7CisgIGludCBpLCBqLCB2LCB6ID0gMDsKKyAgaW50IHJldCA9IDA7CisKKyAgaWYgKGEtPm5lZyAmJiBCSU9fd3JpdGUoYnAsICItIiwgMSkgIT0gMSkgeworICAgIGdvdG8gZW5kOworICB9CisKKyAgaWYgKEJOX2lzX3plcm8oYSkgJiYgQklPX3dyaXRlKGJwLCAiMCIsIDEpICE9IDEpIHsKKyAgICBnb3RvIGVuZDsKKyAgfQorCisgIGZvciAoaSA9IGEtPnRvcCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgZm9yIChqID0gQk5fQklUUzIgLSA0OyBqID49IDA7IGogLT0gNCkgeworICAgICAgLyogc3RyaXAgbGVhZGluZyB6ZXJvcyAqLworICAgICAgdiA9ICgoaW50KShhLT5kW2ldID4+IChsb25nKWopKSAmIDB4MGY7CisgICAgICBpZiAoeiB8fCB2ICE9IDApIHsKKyAgICAgICAgaWYgKEJJT193cml0ZShicCwgJmhleHRhYmxlW3ZdLCAxKSAhPSAxKSB7CisgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgeiA9IDE7CisgICAgICB9CisgICAgfQorICB9CisgIHJldCA9IDE7CisKK2VuZDoKKyAgcmV0dXJuIHJldDsKK30KKworaW50IEJOX3ByaW50X2ZwKEZJTEUgKmZwLCBjb25zdCBCSUdOVU0gKmEpIHsKKyAgQklPICpiOworICBpbnQgcmV0OworCisgIGIgPSBCSU9fbmV3KEJJT19zX2ZpbGUoKSk7CisgIGlmIChiID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBCSU9fc2V0X2ZwKGIsIGZwLCBCSU9fTk9DTE9TRSk7CisgIHJldCA9IEJOX3ByaW50KGIsIGEpOworICBCSU9fZnJlZShiKTsKKworICByZXR1cm4gcmV0OworfQorCitCTl9VTE9ORyBCTl9nZXRfd29yZChjb25zdCBCSUdOVU0gKmJuKSB7CisgIHN3aXRjaCAoYm4tPnRvcCkgeworICAgIGNhc2UgMDoKKyAgICAgIHJldHVybiAwOworICAgIGNhc2UgMToKKyAgICAgIHJldHVybiBibi0+ZFswXTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEJOX01BU0syOworICB9Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vYm4vY3R4LmMgYi9jcnlwdG8vYm4vY3R4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg5Zjg3ZAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9ibi9jdHguYwpAQCAtMCwwICsxLDMxMyBAQAorLyogV3JpdHRlbiBieSBVbGYgTW9lbGxlciBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdC4gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisKKworLyogSG93IG1hbnkgYmlnbnVtcyBhcmUgaW4gZWFjaCAicG9vbCBpdGVtIjsgKi8KKyNkZWZpbmUgQk5fQ1RYX1BPT0xfU0laRSAxNgorLyogVGhlIHN0YWNrIGZyYW1lIGluZm8gaXMgcmVzaXppbmcsIHNldCBhIGZpcnN0LXRpbWUgZXhwYW5zaW9uIHNpemU7ICovCisjZGVmaW5lIEJOX0NUWF9TVEFSVF9GUkFNRVMgMzIKKworLyogQSBidW5kbGUgb2YgYmlnbnVtcyB0aGF0IGNhbiBiZSBsaW5rZWQgd2l0aCBvdGhlciBidW5kbGVzICovCit0eXBlZGVmIHN0cnVjdCBiaWdudW1fcG9vbF9pdGVtIHsKKyAgLyogVGhlIGJpZ251bSB2YWx1ZXMgKi8KKyAgQklHTlVNIHZhbHNbQk5fQ1RYX1BPT0xfU0laRV07CisgIC8qIExpbmtlZC1saXN0IGFkbWluICovCisgIHN0cnVjdCBiaWdudW1fcG9vbF9pdGVtICpwcmV2LCAqbmV4dDsKK30gQk5fUE9PTF9JVEVNOworCisKK3R5cGVkZWYgc3RydWN0IGJpZ251bV9wb29sIHsKKyAgLyogTGlua2VkLWxpc3QgYWRtaW4gKi8KKyAgQk5fUE9PTF9JVEVNICpoZWFkLCAqY3VycmVudCwgKnRhaWw7CisgIC8qIFN0YWNrIGRlcHRoIGFuZCBhbGxvY2F0aW9uIHNpemUgKi8KKyAgdW5zaWduZWQgdXNlZCwgc2l6ZTsKK30gQk5fUE9PTDsKKworc3RhdGljIHZvaWQgQk5fUE9PTF9pbml0KEJOX1BPT0wgKik7CitzdGF0aWMgdm9pZCBCTl9QT09MX2ZpbmlzaChCTl9QT09MICopOworc3RhdGljIEJJR05VTSAqQk5fUE9PTF9nZXQoQk5fUE9PTCAqKTsKK3N0YXRpYyB2b2lkIEJOX1BPT0xfcmVsZWFzZShCTl9QT09MICosIHVuc2lnbmVkIGludCk7CisKKy8qKioqKioqKioqKiovCisvKiBCTl9TVEFDSyAqLworLyoqKioqKioqKioqKi8KKworLyogQSB3cmFwcGVyIHRvIG1hbmFnZSB0aGUgInN0YWNrIGZyYW1lcyIgKi8KK3R5cGVkZWYgc3RydWN0IGJpZ251bV9jdHhfc3RhY2sgeworICAvKiBBcnJheSBvZiBpbmRleGVzIGludG8gdGhlIGJpZ251bSBzdGFjayAqLworICB1bnNpZ25lZCBpbnQgKmluZGV4ZXM7CisgIC8qIE51bWJlciBvZiBzdGFjayBmcmFtZXMsIGFuZCB0aGUgc2l6ZSBvZiB0aGUgYWxsb2NhdGVkIGFycmF5ICovCisgIHVuc2lnbmVkIGludCBkZXB0aCwgc2l6ZTsKK30gQk5fU1RBQ0s7CisKK3N0YXRpYyB2b2lkCQlCTl9TVEFDS19pbml0KEJOX1NUQUNLICopOworc3RhdGljIHZvaWQJCUJOX1NUQUNLX2ZpbmlzaChCTl9TVEFDSyAqKTsKK3N0YXRpYyBpbnQJCUJOX1NUQUNLX3B1c2goQk5fU1RBQ0sgKiwgdW5zaWduZWQgaW50KTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQJQk5fU1RBQ0tfcG9wKEJOX1NUQUNLICopOworCisvKioqKioqKioqKi8KKy8qIEJOX0NUWCAqLworLyoqKioqKioqKiovCisKKy8qIFRoZSBvcGFxdWUgQk5fQ1RYIHR5cGUgKi8KK3N0cnVjdCBiaWdudW1fY3R4IHsKKyAgLyogVGhlIGJpZ251bSBidW5kbGVzICovCisgIEJOX1BPT0wgcG9vbDsKKyAgLyogVGhlICJzdGFjayBmcmFtZXMiLCBpZiB5b3Ugd2lsbCAqLworICBCTl9TVEFDSyBzdGFjazsKKyAgLyogVGhlIG51bWJlciBvZiBiaWdudW1zIGN1cnJlbnRseSBhc3NpZ25lZCAqLworICB1bnNpZ25lZCBpbnQgdXNlZDsKKyAgLyogRGVwdGggb2Ygc3RhY2sgb3ZlcmZsb3cgKi8KKyAgaW50IGVycl9zdGFjazsKKyAgLyogQmxvY2sgImdldHMiIHVudGlsIGFuICJlbmQiIChjb21wYXRpYmlsaXR5IGJlaGF2aW91cikgKi8KKyAgaW50IHRvb19tYW55OworfTsKKworQk5fQ1RYICpCTl9DVFhfbmV3KHZvaWQpIHsKKyAgQk5fQ1RYICpyZXQgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoQk5fQ1RYKSk7CisgIGlmICghcmV0KSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX0NUWF9uZXcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIC8qIEluaXRpYWxpc2UgdGhlIHN0cnVjdHVyZSAqLworICBCTl9QT09MX2luaXQoJnJldC0+cG9vbCk7CisgIEJOX1NUQUNLX2luaXQoJnJldC0+c3RhY2spOworICByZXQtPnVzZWQgPSAwOworICByZXQtPmVycl9zdGFjayA9IDA7CisgIHJldC0+dG9vX21hbnkgPSAwOworICByZXR1cm4gcmV0OworfQorCit2b2lkIEJOX0NUWF9mcmVlKEJOX0NUWCAqY3R4KSB7CisgIGlmIChjdHggPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorCisgIEJOX1NUQUNLX2ZpbmlzaCgmY3R4LT5zdGFjayk7CisgIEJOX1BPT0xfZmluaXNoKCZjdHgtPnBvb2wpOworICBPUEVOU1NMX2ZyZWUoY3R4KTsKK30KKwordm9pZCBCTl9DVFhfc3RhcnQoQk5fQ1RYICpjdHgpIHsKKyAgLyogSWYgd2UncmUgYWxyZWFkeSBvdmVyZmxvd2luZyAuLi4gKi8KKyAgaWYgKGN0eC0+ZXJyX3N0YWNrIHx8IGN0eC0+dG9vX21hbnkpIHsKKyAgICBjdHgtPmVycl9zdGFjaysrOworICB9IGVsc2UgaWYgKCFCTl9TVEFDS19wdXNoKCZjdHgtPnN0YWNrLCBjdHgtPnVzZWQpKSB7CisgICAgLyogKFRyeSB0bykgZ2V0IGEgbmV3IGZyYW1lIHBvaW50ZXIgKi8KKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fQ1RYX3N0YXJ0LCBCTl9SX1RPT19NQU5ZX1RFTVBPUkFSWV9WQVJJQUJMRVMpOworICAgIGN0eC0+ZXJyX3N0YWNrKys7CisgIH0KK30KKworQklHTlVNICpCTl9DVFhfZ2V0KEJOX0NUWCAqY3R4KSB7CisgIEJJR05VTSAqcmV0OworICBpZiAoY3R4LT5lcnJfc3RhY2sgfHwgY3R4LT50b29fbWFueSkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0ID0gQk5fUE9PTF9nZXQoJmN0eC0+cG9vbCk7CisgIGlmIChyZXQgPT0gTlVMTCkgeworICAgIC8qIFNldHRpbmcgdG9vX21hbnkgcHJldmVudHMgcmVwZWF0ZWQgImdldCIgYXR0ZW1wdHMgZnJvbQorICAgICAqIGNsdXR0ZXJpbmcgdGhlIGVycm9yIHN0YWNrLiAqLworICAgIGN0eC0+dG9vX21hbnkgPSAxOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9DVFhfZ2V0LCBCTl9SX1RPT19NQU5ZX1RFTVBPUkFSWV9WQVJJQUJMRVMpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgLyogT0ssIG1ha2Ugc3VyZSB0aGUgcmV0dXJuZWQgYmlnbnVtIGlzICJ6ZXJvIiAqLworICBCTl96ZXJvKHJldCk7CisgIGN0eC0+dXNlZCsrOworICByZXR1cm4gcmV0OworfQorCit2b2lkIEJOX0NUWF9lbmQoQk5fQ1RYICpjdHgpIHsKKyAgaWYgKGN0eC0+ZXJyX3N0YWNrKSB7CisgICAgY3R4LT5lcnJfc3RhY2stLTsKKyAgfSBlbHNlIHsKKyAgICB1bnNpZ25lZCBpbnQgZnAgPSBCTl9TVEFDS19wb3AoJmN0eC0+c3RhY2spOworICAgIC8qIERvZXMgdGhpcyBzdGFjayBmcmFtZSBoYXZlIGFueXRoaW5nIHRvIHJlbGVhc2U/ICovCisgICAgaWYgKGZwIDwgY3R4LT51c2VkKSB7CisgICAgICBCTl9QT09MX3JlbGVhc2UoJmN0eC0+cG9vbCwgY3R4LT51c2VkIC0gZnApOworICAgIH0KKworICAgIGN0eC0+dXNlZCA9IGZwOworICAgIC8qIFVuamFtICJ0b29fbWFueSIgaW4gY2FzZSAiZ2V0IiBoYWQgZmFpbGVkICovCisgICAgY3R4LT50b29fbWFueSA9IDA7CisgIH0KK30KKworLyoqKioqKioqKioqKi8KKy8qIEJOX1NUQUNLICovCisvKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBCTl9TVEFDS19pbml0KEJOX1NUQUNLICpzdCkgeworICBzdC0+aW5kZXhlcyA9IE5VTEw7CisgIHN0LT5kZXB0aCA9IHN0LT5zaXplID0gMDsKK30KKworc3RhdGljIHZvaWQgQk5fU1RBQ0tfZmluaXNoKEJOX1NUQUNLICpzdCkgeworICBpZiAoc3QtPnNpemUpCisgICAgT1BFTlNTTF9mcmVlKHN0LT5pbmRleGVzKTsKK30KKworc3RhdGljIGludCBCTl9TVEFDS19wdXNoKEJOX1NUQUNLICpzdCwgdW5zaWduZWQgaW50IGlkeCkgeworICBpZiAoc3QtPmRlcHRoID09IHN0LT5zaXplKQorICAgICAgLyogTmVlZCB0byBleHBhbmQgKi8KKyAgeworICAgIHVuc2lnbmVkIGludCBuZXdzaXplID0KKyAgICAgICAgKHN0LT5zaXplID8gKHN0LT5zaXplICogMyAvIDIpIDogQk5fQ1RYX1NUQVJUX0ZSQU1FUyk7CisgICAgdW5zaWduZWQgaW50ICpuZXdpdGVtcyA9IE9QRU5TU0xfbWFsbG9jKG5ld3NpemUgKiBzaXplb2YodW5zaWduZWQgaW50KSk7CisgICAgaWYgKCFuZXdpdGVtcykgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChzdC0+ZGVwdGgpIHsKKyAgICAgIG1lbWNweShuZXdpdGVtcywgc3QtPmluZGV4ZXMsIHN0LT5kZXB0aCAqIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKKyAgICB9CisgICAgaWYgKHN0LT5zaXplKSB7CisgICAgICBPUEVOU1NMX2ZyZWUoc3QtPmluZGV4ZXMpOworICAgIH0KKyAgICBzdC0+aW5kZXhlcyA9IG5ld2l0ZW1zOworICAgIHN0LT5zaXplID0gbmV3c2l6ZTsKKyAgfQorCisgIHN0LT5pbmRleGVzWyhzdC0+ZGVwdGgpKytdID0gaWR4OworICByZXR1cm4gMTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBCTl9TVEFDS19wb3AoQk5fU1RBQ0sgKnN0KSB7CisgIHJldHVybiBzdC0+aW5kZXhlc1stLShzdC0+ZGVwdGgpXTsKK30KKworc3RhdGljIHZvaWQgQk5fUE9PTF9pbml0KEJOX1BPT0wgKnApIHsKKyAgcC0+aGVhZCA9IHAtPmN1cnJlbnQgPSBwLT50YWlsID0gTlVMTDsKKyAgcC0+dXNlZCA9IHAtPnNpemUgPSAwOworfQorCitzdGF0aWMgdm9pZCBCTl9QT09MX2ZpbmlzaChCTl9QT09MICpwKSB7CisgIHdoaWxlIChwLT5oZWFkKSB7CisgICAgdW5zaWduZWQgaW50IGxvb3AgPSAwOworICAgIEJJR05VTSAqYm4gPSBwLT5oZWFkLT52YWxzOworICAgIHdoaWxlIChsb29wKysgPCBCTl9DVFhfUE9PTF9TSVpFKSB7CisgICAgICBpZiAoYm4tPmQpIHsKKyAgICAgICAgQk5fY2xlYXJfZnJlZShibik7CisgICAgICB9CisgICAgICBibisrOworICAgIH0KKworICAgIHAtPmN1cnJlbnQgPSBwLT5oZWFkLT5uZXh0OworICAgIE9QRU5TU0xfZnJlZShwLT5oZWFkKTsKKyAgICBwLT5oZWFkID0gcC0+Y3VycmVudDsKKyAgfQorfQorCitzdGF0aWMgQklHTlVNICpCTl9QT09MX2dldChCTl9QT09MICpwKSB7CisgIGlmIChwLT51c2VkID09IHAtPnNpemUpIHsKKyAgICBCSUdOVU0gKmJuOworICAgIHVuc2lnbmVkIGludCBsb29wID0gMDsKKyAgICBCTl9QT09MX0lURU0gKml0ZW0gPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoQk5fUE9PTF9JVEVNKSk7CisgICAgaWYgKCFpdGVtKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXNlIHRoZSBzdHJ1Y3R1cmUgKi8KKyAgICBibiA9IGl0ZW0tPnZhbHM7CisgICAgd2hpbGUgKGxvb3ArKyA8IEJOX0NUWF9QT09MX1NJWkUpIHsKKyAgICAgIEJOX2luaXQoYm4rKyk7CisgICAgfQorCisgICAgaXRlbS0+cHJldiA9IHAtPnRhaWw7CisgICAgaXRlbS0+bmV4dCA9IE5VTEw7CisgICAgLyogTGluayBpdCBpbiAqLworICAgIGlmICghcC0+aGVhZCkgeworICAgICAgcC0+aGVhZCA9IHAtPmN1cnJlbnQgPSBwLT50YWlsID0gaXRlbTsKKyAgICB9IGVsc2UgeworICAgICAgcC0+dGFpbC0+bmV4dCA9IGl0ZW07CisgICAgICBwLT50YWlsID0gaXRlbTsKKyAgICAgIHAtPmN1cnJlbnQgPSBpdGVtOworICAgIH0KKworICAgIHAtPnNpemUgKz0gQk5fQ1RYX1BPT0xfU0laRTsKKyAgICBwLT51c2VkKys7CisgICAgLyogUmV0dXJuIHRoZSBmaXJzdCBiaWdudW0gZnJvbSB0aGUgbmV3IHBvb2wgKi8KKyAgICByZXR1cm4gaXRlbS0+dmFsczsKKyAgfQorCisgIGlmICghcC0+dXNlZCkgeworICAgIHAtPmN1cnJlbnQgPSBwLT5oZWFkOworICB9IGVsc2UgaWYgKChwLT51c2VkICUgQk5fQ1RYX1BPT0xfU0laRSkgPT0gMCkgeworICAgIHAtPmN1cnJlbnQgPSBwLT5jdXJyZW50LT5uZXh0OworICB9CisKKyAgcmV0dXJuIHAtPmN1cnJlbnQtPnZhbHMgKyAoKHAtPnVzZWQrKykgJSBCTl9DVFhfUE9PTF9TSVpFKTsKK30KKworc3RhdGljIHZvaWQgQk5fUE9PTF9yZWxlYXNlKEJOX1BPT0wgKnAsIHVuc2lnbmVkIGludCBudW0pIHsKKyAgdW5zaWduZWQgaW50IG9mZnNldCA9IChwLT51c2VkIC0gMSkgJSBCTl9DVFhfUE9PTF9TSVpFOworICBwLT51c2VkIC09IG51bTsKKworICB3aGlsZSAobnVtLS0pIHsKKyAgICBpZiAoIW9mZnNldCkgeworICAgICAgb2Zmc2V0ID0gQk5fQ1RYX1BPT0xfU0laRSAtIDE7CisgICAgICBwLT5jdXJyZW50ID0gcC0+Y3VycmVudC0+cHJldjsKKyAgICB9IGVsc2UgeworICAgICAgb2Zmc2V0LS07CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vYm4vZGl2LmMgYi9jcnlwdG8vYm4vZGl2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY5MmU5ZQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9ibi9kaXYuYwpAQCAtMCwwICsxLDYxOSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisKKyNkZWZpbmUgYXNtIF9fYXNtX18KKworI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fQVNNKQorIyBpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXz49MgorIyAgaWYgZGVmaW5lZChPUEVOU1NMX1g4NikKKyAgIC8qCisgICAgKiBUaGVyZSB3ZXJlIHR3byByZWFzb25zIGZvciBpbXBsZW1lbnRpbmcgdGhpcyB0ZW1wbGF0ZToKKyAgICAqIC0gR05VIEMgZ2VuZXJhdGVzIGEgY2FsbCB0byBhIGZ1bmN0aW9uIChfX3VkaXZkaTMgdG8gYmUgZXhhY3QpCisgICAgKiAgIGluIHJlcGx5IHRvICgoKChCTl9VTExPTkcpbjApPDxCTl9CSVRTMil8bjEpL2QwIChJIGZhaWwgdG8KKyAgICAqICAgdW5kZXJzdGFuZCB3aHkuLi4pOworICAgICogLSBkaXZsIGRvZXNuJ3Qgb25seSBjYWxjdWxhdGUgcXVvdGllbnQsIGJ1dCBhbHNvIGxlYXZlcworICAgICogICByZW1haW5kZXIgaW4gJWVkeCB3aGljaCB3ZSBjYW4gZGVmaW5pdGVseSB1c2UgaGVyZTotKQorICAgICoKKyAgICAqCQkJCQk8YXBwcm9AZnkuY2hhbG1lcnMuc2U+CisgICAgKi8KKyN1bmRlZiBkaXZfYXNtCisjICBkZWZpbmUgZGl2X2FzbShuMCxuMSxkMCkJCVwKKwkoeyAgYXNtIHZvbGF0aWxlICgJCQlcCisJCSJkaXZsCSU0IgkJCVwKKwkJOiAiPWEiKHEpLCAiPWQiKHJlbSkJCVwKKwkJOiAiYSIobjEpLCAiZCIobjApLCAiZyIoZDApCVwKKwkJOiAiY2MiKTsJCQlcCisJICAgIHE7CQkJCQlcCisJfSkKKyMgIGRlZmluZSBSRU1BSU5ERVJfSVNfQUxSRUFEWV9DQUxDVUxBVEVECisjICBlbGlmIGRlZmluZWQoT1BFTlNTTF9YODZfNjQpCisgICAvKgorICAgICogU2FtZSBzdG9yeSBoZXJlLCBidXQgaXQncyAxMjgtYml0IGJ5IDY0LWJpdCBkaXZpc2lvbi4gV293IQorICAgICoJCQkJCTxhcHByb0BmeS5jaGFsbWVycy5zZT4KKyAgICAqLworIyAgdW5kZWYgZGl2X2FzbQorIyAgZGVmaW5lIGRpdl9hc20objAsbjEsZDApCQlcCisJKHsgIGFzbSB2b2xhdGlsZSAoCQkJXAorCQkiZGl2cQklNCIJCQlcCisJCTogIj1hIihxKSwgIj1kIihyZW0pCQlcCisJCTogImEiKG4xKSwgImQiKG4wKSwgImciKGQwKQlcCisJCTogImNjIik7CQkJXAorCSAgICBxOwkJCQkJXAorCX0pCisjICBkZWZpbmUgUkVNQUlOREVSX0lTX0FMUkVBRFlfQ0FMQ1VMQVRFRAorIyAgZW5kaWYgLyogX188Y3B1PiAqLworIyBlbmRpZiAvKiBfX0dOVUNfXyAqLworI2VuZGlmIC8qIE9QRU5TU0xfTk9fQVNNICovCisKKy8qIEJOX2RpdiBjb21wdXRlcyAgZHYgOj0gbnVtIC8gZGl2aXNvciwgIHJvdW5kaW5nIHRvd2FyZHMKKyAqIHplcm8sIGFuZCBzZXRzIHVwIHJtICBzdWNoIHRoYXQgIGR2KmRpdmlzb3IgKyBybSA9IG51bSAgaG9sZHMuCisgKiBUaHVzOgorICogICAgIGR2LT5uZWcgPT0gbnVtLT5uZWcgXiBkaXZpc29yLT5uZWcgICh1bmxlc3MgdGhlIHJlc3VsdCBpcyB6ZXJvKQorICogICAgIHJtLT5uZWcgPT0gbnVtLT5uZWcgICAgICAgICAgICAgICAgICh1bmxlc3MgdGhlIHJlbWFpbmRlciBpcyB6ZXJvKQorICogSWYgJ2R2JyBvciAncm0nIGlzIE5VTEwsIHRoZSByZXNwZWN0aXZlIHZhbHVlIGlzIG5vdCByZXR1cm5lZC4gKi8KK2ludCBCTl9kaXYoQklHTlVNICpkdiwgQklHTlVNICpybSwgY29uc3QgQklHTlVNICpudW0sIGNvbnN0IEJJR05VTSAqZGl2aXNvciwKKyAgICAgICAgICAgQk5fQ1RYICpjdHgpIHsKKyAgaW50IG5vcm1fc2hpZnQsIGksIGxvb3A7CisgIEJJR05VTSAqdG1wLCB3bnVtLCAqc251bSwgKnNkaXYsICpyZXM7CisgIEJOX1VMT05HICpyZXNwLCAqd251bXA7CisgIEJOX1VMT05HIGQwLCBkMTsKKyAgaW50IG51bV9uLCBkaXZfbjsKKyAgaW50IG5vX2JyYW5jaCA9IDA7CisKKyAgLyogSW52YWxpZCB6ZXJvLXBhZGRpbmcgd291bGQgaGF2ZSBwYXJ0aWN1bGFybHkgYmFkIGNvbnNlcXVlbmNlcworICAgKiBpbiB0aGUgY2FzZSBvZiAnbnVtJy4gKi8KKyAgaWYgKG51bS0+dG9wID4gMCAmJiBudW0tPmRbbnVtLT50b3AgLSAxXSA9PSAwKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX2RpdiwgQk5fUl9OT1RfSU5JVElBTElaRUQpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKChudW0tPmZsYWdzICYgQk5fRkxHX0NPTlNUVElNRSkgIT0gMCB8fAorICAgICAgKGRpdmlzb3ItPmZsYWdzICYgQk5fRkxHX0NPTlNUVElNRSkgIT0gMCkgeworICAgIG5vX2JyYW5jaCA9IDE7CisgIH0KKworICBpZiAoQk5faXNfemVybyhkaXZpc29yKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9kaXYsIEJOX1JfRElWX0JZX1pFUk8pOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKCFub19icmFuY2ggJiYgQk5fdWNtcChudW0sIGRpdmlzb3IpIDwgMCkgeworICAgIGlmIChybSAhPSBOVUxMKSB7CisgICAgICBpZiAoQk5fY29weShybSwgbnVtKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgIH0KKyAgICBpZiAoZHYgIT0gTlVMTCkgeworICAgICAgQk5femVybyhkdik7CisgICAgfQorICAgIHJldHVybiAxOworICB9CisKKyAgQk5fQ1RYX3N0YXJ0KGN0eCk7CisgIHRtcCA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgc251bSA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgc2RpdiA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgaWYgKGR2ID09IE5VTEwpIHsKKyAgICByZXMgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIH0gZWxzZSB7CisgICAgcmVzID0gZHY7CisgIH0KKyAgaWYgKHNkaXYgPT0gTlVMTCB8fCByZXMgPT0gTlVMTCB8fCB0bXAgPT0gTlVMTCB8fCBzbnVtID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIC8qIEZpcnN0IHdlIG5vcm1hbGlzZSB0aGUgbnVtYmVycyAqLworICBub3JtX3NoaWZ0ID0gQk5fQklUUzIgLSAoKEJOX251bV9iaXRzKGRpdmlzb3IpKSAlIEJOX0JJVFMyKTsKKyAgaWYgKCEoQk5fbHNoaWZ0KHNkaXYsIGRpdmlzb3IsIG5vcm1fc2hpZnQpKSkgeworICAgIGdvdG8gZXJyOworICB9CisgIHNkaXYtPm5lZyA9IDA7CisgIG5vcm1fc2hpZnQgKz0gQk5fQklUUzI7CisgIGlmICghKEJOX2xzaGlmdChzbnVtLCBudW0sIG5vcm1fc2hpZnQpKSkgeworICAgIGdvdG8gZXJyOworICB9CisgIHNudW0tPm5lZyA9IDA7CisKKyAgaWYgKG5vX2JyYW5jaCkgeworICAgIC8qIFNpbmNlIHdlIGRvbid0IGtub3cgd2hldGhlciBzbnVtIGlzIGxhcmdlciB0aGFuIHNkaXYsCisgICAgICogd2UgcGFkIHNudW0gd2l0aCBlbm91Z2ggemVyb2VzIHdpdGhvdXQgY2hhbmdpbmcgaXRzCisgICAgICogdmFsdWUuCisgICAgICovCisgICAgaWYgKHNudW0tPnRvcCA8PSBzZGl2LT50b3AgKyAxKSB7CisgICAgICBpZiAoYm5fd2V4cGFuZChzbnVtLCBzZGl2LT50b3AgKyAyKSA9PSBOVUxMKSB7CisgICAgICAgIGdvdG8gZXJyOworICAgICAgfQorICAgICAgZm9yIChpID0gc251bS0+dG9wOyBpIDwgc2Rpdi0+dG9wICsgMjsgaSsrKSB7CisgICAgICAgIHNudW0tPmRbaV0gPSAwOworICAgICAgfQorICAgICAgc251bS0+dG9wID0gc2Rpdi0+dG9wICsgMjsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGJuX3dleHBhbmQoc251bSwgc251bS0+dG9wICsgMSkgPT0gTlVMTCkgeworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICAgIHNudW0tPmRbc251bS0+dG9wXSA9IDA7CisgICAgICBzbnVtLT50b3ArKzsKKyAgICB9CisgIH0KKworICBkaXZfbiA9IHNkaXYtPnRvcDsKKyAgbnVtX24gPSBzbnVtLT50b3A7CisgIGxvb3AgPSBudW1fbiAtIGRpdl9uOworICAvKiBMZXRzIHNldHVwIGEgJ3dpbmRvdycgaW50byBzbnVtCisgICAqIFRoaXMgaXMgdGhlIHBhcnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgY3VycmVudAorICAgKiAnYXJlYScgYmVpbmcgZGl2aWRlZCAqLworICB3bnVtLm5lZyA9IDA7CisgIHdudW0uZCA9ICYoc251bS0+ZFtsb29wXSk7CisgIHdudW0udG9wID0gZGl2X247CisgIC8qIG9ubHkgbmVlZGVkIHdoZW4gQk5fdWNtcCBtZXNzZXMgdXAgdGhlIHZhbHVlcyBiZXR3ZWVuIHRvcCBhbmQgbWF4ICovCisgIHdudW0uZG1heCA9IHNudW0tPmRtYXggLSBsb29wOyAvKiBzbyB3ZSBkb24ndCBzdGVwIG91dCBvZiBib3VuZHMgKi8KKworICAvKiBHZXQgdGhlIHRvcCAyIHdvcmRzIG9mIHNkaXYgKi8KKyAgLyogZGl2X249c2Rpdi0+dG9wOyAqLworICBkMCA9IHNkaXYtPmRbZGl2X24gLSAxXTsKKyAgZDEgPSAoZGl2X24gPT0gMSkgPyAwIDogc2Rpdi0+ZFtkaXZfbiAtIDJdOworCisgIC8qIHBvaW50ZXIgdG8gdGhlICd0b3AnIG9mIHNudW0gKi8KKyAgd251bXAgPSAmKHNudW0tPmRbbnVtX24gLSAxXSk7CisKKyAgLyogU2V0dXAgdG8gJ3JlcycgKi8KKyAgcmVzLT5uZWcgPSAobnVtLT5uZWcgXiBkaXZpc29yLT5uZWcpOworICBpZiAoIWJuX3dleHBhbmQocmVzLCAobG9vcCArIDEpKSkgeworICAgIGdvdG8gZXJyOworICB9CisgIHJlcy0+dG9wID0gbG9vcCAtIG5vX2JyYW5jaDsKKyAgcmVzcCA9ICYocmVzLT5kW2xvb3AgLSAxXSk7CisKKyAgLyogc3BhY2UgZm9yIHRlbXAgKi8KKyAgaWYgKCFibl93ZXhwYW5kKHRtcCwgKGRpdl9uICsgMSkpKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAoIW5vX2JyYW5jaCkgeworICAgIGlmIChCTl91Y21wKCZ3bnVtLCBzZGl2KSA+PSAwKSB7CisgICAgICBibl9zdWJfd29yZHMod251bS5kLCB3bnVtLmQsIHNkaXYtPmQsIGRpdl9uKTsKKyAgICAgICpyZXNwID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzLT50b3AtLTsKKyAgICB9CisgIH0KKworICAvKiBpZiByZXMtPnRvcCA9PSAwIHRoZW4gY2xlYXIgdGhlIG5lZyB2YWx1ZSBvdGhlcndpc2UgZGVjcmVhc2UKKyAgICogdGhlIHJlc3AgcG9pbnRlciAqLworICBpZiAocmVzLT50b3AgPT0gMCkgeworICAgIHJlcy0+bmVnID0gMDsKKyAgfSBlbHNlIHsKKyAgICByZXNwLS07CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgbG9vcCAtIDE7IGkrKywgd251bXAtLSwgcmVzcC0tKSB7CisgICAgQk5fVUxPTkcgcSwgbDA7CisgICAgLyogdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGxvb3AgdXNlcyB0aGUgdG9wIHR3byB3b3JkcyBvZiBzbnVtIGFuZCBzZGl2IHRvCisgICAgICogY2FsY3VsYXRlIGEgQk5fVUxPTkcgcSBzdWNoIHRoYXQgfCB3bnVtIC0gc2RpdiAqIHEgfCA8IHNkaXYgKi8KKyAgICBCTl9VTE9ORyBuMCwgbjEsIHJlbSA9IDA7CisKKyAgICBuMCA9IHdudW1wWzBdOworICAgIG4xID0gd251bXBbLTFdOworICAgIGlmIChuMCA9PSBkMCkgeworICAgICAgcSA9IEJOX01BU0syOworICAgIH0gZWxzZSB7CisgICAgICAvKiBuMCA8IGQwICovCisjaWZkZWYgQk5fTExPTkcKKyAgICAgIEJOX1VMTE9ORyB0MjsKKworI2lmIGRlZmluZWQoQk5fTExPTkcpICYmIGRlZmluZWQoQk5fRElWMlcpICYmICFkZWZpbmVkKGRpdl9hc20pCisgICAgICBxID0gKEJOX1VMT05HKSgoKCgoQk5fVUxMT05HKW4wKSA8PCBCTl9CSVRTMikgfCBuMSkgLyBkMCk7CisjZWxzZQorICAgICAgcSA9IGRpdl9hc20objAsIG4xLCBkMCk7CisjZW5kaWYKKworI2lmbmRlZiBSRU1BSU5ERVJfSVNfQUxSRUFEWV9DQUxDVUxBVEVECisgICAgICAvKiByZW0gZG9lc24ndCBoYXZlIHRvIGJlIEJOX1VMTE9ORy4gVGhlIGxlYXN0IHdlIGtub3cgaXQncyBsZXNzIHRoYXQgZDAsCisgICAgICAgKiBpc24ndCBpdD8gKi8KKyAgICAgIHJlbSA9IChuMSAtIHEgKiBkMCkgJiBCTl9NQVNLMjsKKyNlbmRpZgorCisgICAgICB0MiA9IChCTl9VTExPTkcpZDEgKiBxOworCisgICAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmICh0MiA8PSAoKCgoQk5fVUxMT05HKXJlbSkgPDwgQk5fQklUUzIpIHwgd251bXBbLTJdKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcS0tOworICAgICAgICByZW0gKz0gZDA7CisgICAgICAgIGlmIChyZW0gPCBkMCkKKyAgICAgICAgICBicmVhazsgLyogZG9uJ3QgbGV0IHJlbSBvdmVyZmxvdyAqLworICAgICAgICB0MiAtPSBkMTsKKyAgICAgIH0KKyNlbHNlIC8qICFCTl9MTE9ORyAqLworICAgICAgQk5fVUxPTkcgdDJsLCB0Mmg7CisKKyNpZiBkZWZpbmVkKGRpdl9hc20pCisgICAgICBxID0gZGl2X2FzbShuMCwgbjEsIGQwKTsKKyNlbHNlCisgICAgICBxID0gYm5fZGl2X3dvcmRzKG4wLCBuMSwgZDApOworI2VuZGlmCisKKyNpZm5kZWYgUkVNQUlOREVSX0lTX0FMUkVBRFlfQ0FMQ1VMQVRFRAorICAgICAgcmVtID0gKG4xIC0gcSAqIGQwKSAmIEJOX01BU0syOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX1VNVUxUX0xPSEkpCisgICAgICBCTl9VTVVMVF9MT0hJKHQybCwgdDJoLCBkMSwgcSk7CisjZWxpZiBkZWZpbmVkKEJOX1VNVUxUX0hJR0gpCisgICAgICB0MmwgPSBkMSAqIHE7CisgICAgICB0MmggPSBCTl9VTVVMVF9ISUdIKGQxLCBxKTsKKyNlbHNlCisgICAgICB7CisgICAgICAgIEJOX1VMT05HIHFsLCBxaDsKKyAgICAgICAgdDJsID0gTEJJVFMoZDEpOworICAgICAgICB0MmggPSBIQklUUyhkMSk7CisgICAgICAgIHFsID0gTEJJVFMocSk7CisgICAgICAgIHFoID0gSEJJVFMocSk7CisgICAgICAgIG11bDY0KHQybCwgdDJoLCBxbCwgcWgpOyAvKiB0Mj0oQk5fVUxMT05HKWQxKnE7ICovCisgICAgICB9CisjZW5kaWYKKworICAgICAgZm9yICg7OykgeworICAgICAgICBpZiAoKHQyaCA8IHJlbSkgfHwgKCh0MmggPT0gcmVtKSAmJiAodDJsIDw9IHdudW1wWy0yXSkpKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBxLS07CisgICAgICAgIHJlbSArPSBkMDsKKyAgICAgICAgaWYgKHJlbSA8IGQwKQorICAgICAgICAgIGJyZWFrOyAvKiBkb24ndCBsZXQgcmVtIG92ZXJmbG93ICovCisgICAgICAgIGlmICh0MmwgPCBkMSkKKyAgICAgICAgICB0MmgtLTsKKyAgICAgICAgdDJsIC09IGQxOworICAgICAgfQorI2VuZGlmIC8qICFCTl9MTE9ORyAqLworICAgIH0KKworICAgIGwwID0gYm5fbXVsX3dvcmRzKHRtcC0+ZCwgc2Rpdi0+ZCwgZGl2X24sIHEpOworICAgIHRtcC0+ZFtkaXZfbl0gPSBsMDsKKyAgICB3bnVtLmQtLTsKKyAgICAvKiBpbmdvcmUgdG9wIHZhbHVlcyBvZiB0aGUgYmlnbnVtcyBqdXN0IHN1YiB0aGUgdHdvCisgICAgICogQk5fVUxPTkcgYXJyYXlzIHdpdGggYm5fc3ViX3dvcmRzICovCisgICAgaWYgKGJuX3N1Yl93b3Jkcyh3bnVtLmQsIHdudW0uZCwgdG1wLT5kLCBkaXZfbiArIDEpKSB7CisgICAgICAvKiBOb3RlOiBBcyB3ZSBoYXZlIGNvbnNpZGVyZWQgb25seSB0aGUgbGVhZGluZworICAgICAgICogdHdvIEJOX1VMT05HcyBpbiB0aGUgY2FsY3VsYXRpb24gb2YgcSwgc2RpdiAqIHEKKyAgICAgICAqIG1pZ2h0IGJlIGdyZWF0ZXIgdGhhbiB3bnVtIChidXQgdGhlbiAocS0xKSAqIHNkaXYKKyAgICAgICAqIGlzIGxlc3Mgb3IgZXF1YWwgdGhhbiB3bnVtKQorICAgICAgICovCisgICAgICBxLS07CisgICAgICBpZiAoYm5fYWRkX3dvcmRzKHdudW0uZCwgd251bS5kLCBzZGl2LT5kLCBkaXZfbikpIHsKKyAgICAgICAgLyogd2UgY2FuJ3QgaGF2ZSBhbiBvdmVyZmxvdyBoZXJlIChhc3N1bWluZworICAgICAgICAgKiB0aGF0IHEgIT0gMCwgYnV0IGlmIHEgPT0gMCB0aGVuIHRtcCBpcworICAgICAgICAgKiB6ZXJvIGFueXdheSkgKi8KKyAgICAgICAgKCp3bnVtcCkrKzsKKyAgICAgIH0KKyAgICB9CisgICAgLyogc3RvcmUgcGFydCBvZiB0aGUgcmVzdWx0ICovCisgICAgKnJlc3AgPSBxOworICB9CisgIGJuX2NvcnJlY3RfdG9wKHNudW0pOworICBpZiAocm0gIT0gTlVMTCkgeworICAgIC8qIEtlZXAgYSBjb3B5IG9mIHRoZSBuZWcgZmxhZyBpbiBudW0gYmVjYXVzZSBpZiBybT09bnVtCisgICAgICogQk5fcnNoaWZ0KCkgd2lsbCBvdmVyd3JpdGUgaXQuCisgICAgICovCisgICAgaW50IG5lZyA9IG51bS0+bmVnOworICAgIEJOX3JzaGlmdChybSwgc251bSwgbm9ybV9zaGlmdCk7CisgICAgaWYgKCFCTl9pc196ZXJvKHJtKSkgeworICAgICAgcm0tPm5lZyA9IG5lZzsKKyAgICB9CisgIH0KKyAgaWYgKG5vX2JyYW5jaCkgeworICAgIGJuX2NvcnJlY3RfdG9wKHJlcyk7CisgIH0KKyAgQk5fQ1RYX2VuZChjdHgpOworICByZXR1cm4gMTsKKworZXJyOgorICBCTl9DVFhfZW5kKGN0eCk7CisgIHJldHVybiAwOworfQorCitpbnQgQk5fbm5tb2QoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKm0sIGNvbnN0IEJJR05VTSAqZCwgQk5fQ1RYICpjdHgpIHsKKyAgaWYgKCEoQk5fbW9kKHIsIG0sIGQsIGN0eCkpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCFyLT5uZWcpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIC8qIG5vdyAtfGR8IDwgciA8IDAsIHNvIHdlIGhhdmUgdG8gc2V0IHIgOj0gciArIHxkfC4gKi8KKyAgcmV0dXJuIChkLT5uZWcgPyBCTl9zdWIgOiBCTl9hZGQpKHIsIHIsIGQpOworfQorCitpbnQgQk5fbW9kX2FkZChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLCBjb25zdCBCSUdOVU0gKm0sCisgICAgICAgICAgICAgICBCTl9DVFggKmN0eCkgeworICBpZiAoIUJOX2FkZChyLCBhLCBiKSkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBCTl9ubm1vZChyLCByLCBtLCBjdHgpOworfQorCitpbnQgQk5fbW9kX2FkZF9xdWljayhCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQklHTlVNICptKSB7CisgIGlmICghQk5fdWFkZChyLCBhLCBiKSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChCTl91Y21wKHIsIG0pID49IDApIHsKKyAgICByZXR1cm4gQk5fdXN1YihyLCByLCBtKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IEJOX21vZF9zdWIoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYiwgY29uc3QgQklHTlVNICptLAorICAgICAgICAgICAgICAgQk5fQ1RYICpjdHgpIHsKKyAgaWYgKCFCTl9zdWIociwgYSwgYikpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gQk5fbm5tb2QociwgciwgbSwgY3R4KTsKK30KKworLyogQk5fbW9kX3N1YiB2YXJpYW50IHRoYXQgbWF5IGJlIHVzZWQgaWYgYm90aCAgYSAgYW5kICBiICBhcmUgbm9uLW5lZ2F0aXZlCisgKiBhbmQgbGVzcyB0aGFuICBtICovCitpbnQgQk5fbW9kX3N1Yl9xdWljayhCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQklHTlVNICptKSB7CisgIGlmICghQk5fc3ViKHIsIGEsIGIpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKHItPm5lZykgeworICAgIHJldHVybiBCTl9hZGQociwgciwgbSk7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBCTl9tb2RfbXVsKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIsIGNvbnN0IEJJR05VTSAqbSwKKyAgICAgICAgICAgICAgIEJOX0NUWCAqY3R4KSB7CisgIEJJR05VTSAqdDsKKyAgaW50IHJldCA9IDA7CisKKyAgQk5fQ1RYX3N0YXJ0KGN0eCk7CisgIHQgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIGlmICh0ID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmIChhID09IGIpIHsKKyAgICBpZiAoIUJOX3Nxcih0LCBhLCBjdHgpKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKCFCTl9tdWwodCwgYSwgYiwgY3R4KSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICB9CisKKyAgaWYgKCFCTl9ubm1vZChyLCB0LCBtLCBjdHgpKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICByZXQgPSAxOworCitlcnI6CisgIEJOX0NUWF9lbmQoY3R4KTsKKyAgcmV0dXJuIHJldDsKK30KKworaW50IEJOX21vZF9zcXIoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqbSwgQk5fQ1RYICpjdHgpIHsKKyAgaWYgKCFCTl9zcXIociwgYSwgY3R4KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgLyogci0+bmVnID09IDAsICB0aHVzIHdlIGRvbid0IG5lZWQgQk5fbm5tb2QgKi8KKyAgcmV0dXJuIEJOX21vZChyLCByLCBtLCBjdHgpOworfQorCitpbnQgQk5fbW9kX2xzaGlmdChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgaW50IG4sIGNvbnN0IEJJR05VTSAqbSwKKyAgICAgICAgICAgICAgICAgIEJOX0NUWCAqY3R4KSB7CisgIEJJR05VTSAqYWJzX20gPSBOVUxMOworICBpbnQgcmV0OworCisgIGlmICghQk5fbm5tb2QociwgYSwgbSwgY3R4KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKG0tPm5lZykgeworICAgIGFic19tID0gQk5fZHVwKG0pOworICAgIGlmIChhYnNfbSA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYWJzX20tPm5lZyA9IDA7CisgIH0KKworICByZXQgPSBCTl9tb2RfbHNoaWZ0X3F1aWNrKHIsIHIsIG4sIChhYnNfbSA/IGFic19tIDogbSkpOworCisgIGlmIChhYnNfbSkgeworICAgIEJOX2ZyZWUoYWJzX20pOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK2ludCBCTl9tb2RfbHNoaWZ0X3F1aWNrKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBpbnQgbiwgY29uc3QgQklHTlVNICptKSB7CisgIGlmIChyICE9IGEpIHsKKyAgICBpZiAoQk5fY29weShyLCBhKSA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICB3aGlsZSAobiA+IDApIHsKKyAgICBpbnQgbWF4X3NoaWZ0OworCisgICAgLyogMCA8IHIgPCBtICovCisgICAgbWF4X3NoaWZ0ID0gQk5fbnVtX2JpdHMobSkgLSBCTl9udW1fYml0cyhyKTsKKyAgICAvKiBtYXhfc2hpZnQgPj0gMCAqLworCisgICAgaWYgKG1heF9zaGlmdCA8IDApIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9tb2RfbHNoaWZ0X3F1aWNrLCBCTl9SX0lOUFVUX05PVF9SRURVQ0VEKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChtYXhfc2hpZnQgPiBuKSB7CisgICAgICBtYXhfc2hpZnQgPSBuOworICAgIH0KKworICAgIGlmIChtYXhfc2hpZnQpIHsKKyAgICAgIGlmICghQk5fbHNoaWZ0KHIsIHIsIG1heF9zaGlmdCkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBuIC09IG1heF9zaGlmdDsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCFCTl9sc2hpZnQxKHIsIHIpKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgLS1uOworICAgIH0KKworICAgIC8qIEJOX251bV9iaXRzKHIpIDw9IEJOX251bV9iaXRzKG0pICovCisgICAgaWYgKEJOX2NtcChyLCBtKSA+PSAwKSB7CisgICAgICBpZiAoIUJOX3N1YihyLCByLCBtKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gMTsKK30KKworaW50IEJOX21vZF9sc2hpZnQxKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4KSB7CisgIGlmICghQk5fbHNoaWZ0MShyLCBhKSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgcmV0dXJuIEJOX25ubW9kKHIsIHIsIG0sIGN0eCk7Cit9CisKK2ludCBCTl9tb2RfbHNoaWZ0MV9xdWljayhCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICptKSB7CisgIGlmICghQk5fbHNoaWZ0MShyLCBhKSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChCTl9jbXAociwgbSkgPj0gMCkgeworICAgIHJldHVybiBCTl9zdWIociwgciwgbSk7CisgIH0KKworICByZXR1cm4gMTsKK30KKworQk5fVUxPTkcgQk5fZGl2X3dvcmQoQklHTlVNICphLCBCTl9VTE9ORyB3KSB7CisgIEJOX1VMT05HIHJldCA9IDA7CisgIGludCBpLCBqOworCisgIHcgJj0gQk5fTUFTSzI7CisKKyAgaWYgKCF3KSB7CisgICAgLyogYWN0dWFsbHkgdGhpcyBhbiBlcnJvciAoZGl2aXNpb24gYnkgemVybykgKi8KKyAgICByZXR1cm4gKEJOX1VMT05HKSAtIDE7CisgIH0KKworICBpZiAoYS0+dG9wID09IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8qIG5vcm1hbGl6ZSBpbnB1dCAoc28gYm5fZGl2X3dvcmRzIGRvZXNuJ3QgY29tcGxhaW4pICovCisgIGogPSBCTl9CSVRTMiAtIEJOX251bV9iaXRzX3dvcmQodyk7CisgIHcgPDw9IGo7CisgIGlmICghQk5fbHNoaWZ0KGEsIGEsIGopKSB7CisgICAgcmV0dXJuIChCTl9VTE9ORykgLSAxOworICB9CisKKyAgZm9yIChpID0gYS0+dG9wIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBCTl9VTE9ORyBsLCBkOworCisgICAgbCA9IGEtPmRbaV07CisgICAgZCA9IGJuX2Rpdl93b3JkcyhyZXQsIGwsIHcpOworICAgIHJldCA9IChsIC0gKChkICogdykgJiBCTl9NQVNLMikpICYgQk5fTUFTSzI7CisgICAgYS0+ZFtpXSA9IGQ7CisgIH0KKworICBpZiAoKGEtPnRvcCA+IDApICYmIChhLT5kW2EtPnRvcCAtIDFdID09IDApKSB7CisgICAgYS0+dG9wLS07CisgIH0KKworICByZXQgPj49IGo7CisgIHJldHVybiByZXQ7Cit9CisKK0JOX1VMT05HIEJOX21vZF93b3JkKGNvbnN0IEJJR05VTSAqYSwgQk5fVUxPTkcgdykgeworI2lmbmRlZiBCTl9MTE9ORworICBCTl9VTE9ORyByZXQgPSAwOworI2Vsc2UKKyAgQk5fVUxMT05HIHJldCA9IDA7CisjZW5kaWYKKyAgaW50IGk7CisKKyAgaWYgKHcgPT0gMCkgeworICAgIHJldHVybiAoQk5fVUxPTkcpIC0xOworICB9CisKKyAgdyAmPSBCTl9NQVNLMjsKKyAgZm9yIChpID0gYS0+dG9wIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyNpZm5kZWYgQk5fTExPTkcKKyAgICByZXQgPSAoKHJldCA8PCBCTl9CSVRTNCkgfCAoKGEtPmRbaV0gPj4gQk5fQklUUzQpICYgQk5fTUFTSzJsKSkgJSB3OworICAgIHJldCA9ICgocmV0IDw8IEJOX0JJVFM0KSB8IChhLT5kW2ldICYgQk5fTUFTSzJsKSkgJSB3OworI2Vsc2UKKyAgICByZXQgPSAoQk5fVUxMT05HKSgoKHJldCA8PCAoQk5fVUxMT05HKUJOX0JJVFMyKSB8IGEtPmRbaV0pICUgKEJOX1VMTE9ORyl3KTsKKyNlbmRpZgorICB9CisgIHJldHVybiAoQk5fVUxPTkcpcmV0OworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2JuL2V4cG9uZW50aWF0aW9uLmMgYi9jcnlwdG8vYm4vZXhwb25lbnRpYXRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTFmMTVmCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2JuL2V4cG9uZW50aWF0aW9uLmMKQEAgLTAsMCArMSwxNTAwIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDUgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9jcHUuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisKKyNpZiAhZGVmaW5lZChPUEVOU1NMX05PX0FTTSkgJiYgZGVmaW5lZChPUEVOU1NMX1g4Nl82NCkKKyNkZWZpbmUgT1BFTlNTTF9CTl9BU01fTU9OVDUKKyNkZWZpbmUgUlNBWl9FTkFCTEVECisKKyNpbmNsdWRlICJyc2F6X2V4cC5oIgorI2VuZGlmCisKK2ludCBCTl9leHAoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqcCwgQk5fQ1RYICpjdHgpIHsKKyAgaW50IGksIGJpdHMsIHJldCA9IDA7CisgIEJJR05VTSAqdiwgKnJyOworCisgIGlmICgocC0+ZmxhZ3MgJiBCTl9GTEdfQ09OU1RUSU1FKSAhPSAwKSB7CisgICAgLyogQk5fRkxHX0NPTlNUVElNRSBvbmx5IHN1cHBvcnRlZCBieSBCTl9tb2RfZXhwX21vbnQoKSAqLworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9leHAsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBCTl9DVFhfc3RhcnQoY3R4KTsKKyAgaWYgKHIgPT0gYSB8fCByID09IHApIHsKKyAgICByciA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgfSBlbHNlIHsKKyAgICByciA9IHI7CisgIH0KKworICB2ID0gQk5fQ1RYX2dldChjdHgpOworICBpZiAocnIgPT0gTlVMTCB8fCB2ID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmIChCTl9jb3B5KHYsIGEpID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorICBiaXRzID0gQk5fbnVtX2JpdHMocCk7CisKKyAgaWYgKEJOX2lzX29kZChwKSkgeworICAgIGlmIChCTl9jb3B5KHJyLCBhKSA9PSBOVUxMKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKCFCTl9vbmUocnIpKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0KKworICBmb3IgKGkgPSAxOyBpIDwgYml0czsgaSsrKSB7CisgICAgaWYgKCFCTl9zcXIodiwgdiwgY3R4KSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICAgIGlmIChCTl9pc19iaXRfc2V0KHAsIGkpKSB7CisgICAgICBpZiAoIUJOX211bChyciwgcnIsIHYsIGN0eCkpIHsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgfQorICB9CisgIHJldCA9IDE7CisKK2VycjoKKyAgaWYgKHIgIT0gcnIpIHsKKyAgICBCTl9jb3B5KHIsIHJyKTsKKyAgfQorICBCTl9DVFhfZW5kKGN0eCk7CisgIHJldHVybiByZXQ7Cit9CisKKy8qIG1heGltdW0gcHJlY29tcHV0YXRpb24gdGFibGUgc2l6ZSBmb3IgKnZhcmlhYmxlKiBzbGlkaW5nIHdpbmRvd3MgKi8KKyNkZWZpbmUgVEFCTEVfU0laRSAzMgorCit0eXBlZGVmIHN0cnVjdCBibl9yZWNwX2N0eF9zdCB7CisgIEJJR05VTSBOOyAgLyogdGhlIGRpdmlzb3IgKi8KKyAgQklHTlVNIE5yOyAvKiB0aGUgcmVjaXByb2NhbCAqLworICBpbnQgbnVtX2JpdHM7CisgIGludCBzaGlmdDsKKyAgaW50IGZsYWdzOworfSBCTl9SRUNQX0NUWDsKKworc3RhdGljIHZvaWQgQk5fUkVDUF9DVFhfaW5pdChCTl9SRUNQX0NUWCAqcmVjcCkgeworICBCTl9pbml0KCZyZWNwLT5OKTsKKyAgQk5faW5pdCgmcmVjcC0+TnIpOworICByZWNwLT5udW1fYml0cyA9IDA7CisgIHJlY3AtPmZsYWdzID0gMDsKK30KKworc3RhdGljIHZvaWQgQk5fUkVDUF9DVFhfZnJlZShCTl9SRUNQX0NUWCAqcmVjcCkgeworICBpZiAocmVjcCA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgQk5fZnJlZSgmcmVjcC0+Tik7CisgIEJOX2ZyZWUoJnJlY3AtPk5yKTsKK30KKworc3RhdGljIGludCBCTl9SRUNQX0NUWF9zZXQoQk5fUkVDUF9DVFggKnJlY3AsIGNvbnN0IEJJR05VTSAqZCwgQk5fQ1RYICpjdHgpIHsKKyAgaWYgKCFCTl9jb3B5KCYocmVjcC0+TiksIGQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgQk5femVybygmcmVjcC0+TnIpOworICByZWNwLT5udW1fYml0cyA9IEJOX251bV9iaXRzKGQpOworICByZWNwLT5zaGlmdCA9IDA7CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qIGxlbiBpcyB0aGUgZXhwZWN0ZWQgc2l6ZSBvZiB0aGUgcmVzdWx0IFdlIGFjdHVhbGx5IGNhbGN1bGF0ZSB3aXRoIGFuIGV4dHJhCisgKiB3b3JkIG9mIHByZWNpc2lvbiwgc28gd2UgY2FuIGRvIGZhc3RlciBkaXZpc2lvbiBpZiB0aGUgcmVtYWluZGVyIGlzIG5vdAorICogcmVxdWlyZWQuCisgKiByIDo9IDJebGVuIC8gbSAqLworc3RhdGljIGludCBCTl9yZWNpcHJvY2FsKEJJR05VTSAqciwgY29uc3QgQklHTlVNICptLCBpbnQgbGVuLCBCTl9DVFggKmN0eCkgeworICBpbnQgcmV0ID0gLTE7CisgIEJJR05VTSAqdDsKKworICBCTl9DVFhfc3RhcnQoY3R4KTsKKyAgdCA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgaWYgKHQgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKCFCTl9zZXRfYml0KHQsIGxlbikpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmICghQk5fZGl2KHIsIE5VTEwsIHQsIG0sIGN0eCkpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIHJldCA9IGxlbjsKKworZXJyOgorICBCTl9DVFhfZW5kKGN0eCk7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgQk5fZGl2X3JlY3AoQklHTlVNICpkdiwgQklHTlVNICpyZW0sIGNvbnN0IEJJR05VTSAqbSwKKyAgICAgICAgICAgICAgICAgICAgICAgQk5fUkVDUF9DVFggKnJlY3AsIEJOX0NUWCAqY3R4KSB7CisgIGludCBpLCBqLCByZXQgPSAwOworICBCSUdOVU0gKmEsICpiLCAqZCwgKnI7CisKKyAgQk5fQ1RYX3N0YXJ0KGN0eCk7CisgIGEgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIGIgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIGlmIChkdiAhPSBOVUxMKSB7CisgICAgZCA9IGR2OworICB9IGVsc2UgeworICAgIGQgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIH0KKworICBpZiAocmVtICE9IE5VTEwpIHsKKyAgICByID0gcmVtOworICB9IGVsc2UgeworICAgIHIgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIH0KKworICBpZiAoYSA9PSBOVUxMIHx8IGIgPT0gTlVMTCB8fCBkID09IE5VTEwgfHwgciA9PSBOVUxMKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAoQk5fdWNtcChtLCAmKHJlY3AtPk4pKSA8IDApIHsKKyAgICBCTl96ZXJvKGQpOworICAgIGlmICghQk5fY29weShyLCBtKSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIEJOX0NUWF9lbmQoY3R4KTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIC8qIFdlIHdhbnQgdGhlIHJlbWFpbmRlcgorICAgKiBHaXZlbiBpbnB1dCBvZiBBQkNERUYgLyBhYgorICAgKiB3ZSBuZWVkIG11bHRpcGx5IEFCQ0RFRiBieSAzIGRpZ2VzdHMgb2YgdGhlIHJlY2lwcm9jYWwgb2YgYWIgKi8KKworICAvKiBpIDo9IG1heChCTl9udW1fYml0cyhtKSwgMipCTl9udW1fYml0cyhOKSkgKi8KKyAgaSA9IEJOX251bV9iaXRzKG0pOworICBqID0gcmVjcC0+bnVtX2JpdHMgPDwgMTsKKyAgaWYgKGogPiBpKSB7CisgICAgaSA9IGo7CisgIH0KKworICAvKiBOciA6PSByb3VuZCgyXmkgLyBOKSAqLworICBpZiAoaSAhPSByZWNwLT5zaGlmdCkgeworICAgIHJlY3AtPnNoaWZ0ID0KKyAgICAgICAgQk5fcmVjaXByb2NhbCgmKHJlY3AtPk5yKSwgJihyZWNwLT5OKSwgaSwKKyAgICAgICAgICAgICAgICAgICAgICBjdHgpOyAvKiBCTl9yZWNpcHJvY2FsIHJldHVybnMgaSwgb3IgLTEgZm9yIGFuIGVycm9yICovCisgIH0KKworICBpZiAocmVjcC0+c2hpZnQgPT0gLTEpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIC8qIGQgOj0gfHJvdW5kKHJvdW5kKG0gLyAyXkJOX251bV9iaXRzKE4pKSAqIHJlY3AtPk5yIC8gMl4oaSAtCisgICAqIEJOX251bV9iaXRzKE4pKSl8CisgICAqICAgID0gfHJvdW5kKHJvdW5kKG0gLyAyXkJOX251bV9iaXRzKE4pKSAqIHJvdW5kKDJeaSAvIE4pIC8gMl4oaSAtCisgICAqIEJOX251bV9iaXRzKE4pKSl8CisgICAqICAgPD0gfChtIC8gMl5CTl9udW1fYml0cyhOKSkgKiAoMl5pIC8gTikgKiAoMl5CTl9udW1fYml0cyhOKSAvIDJeaSl8CisgICAqICAgID0gfG0vTnwgKi8KKyAgaWYgKCFCTl9yc2hpZnQoYSwgbSwgcmVjcC0+bnVtX2JpdHMpKSB7CisgICAgZ290byBlcnI7CisgIH0KKyAgaWYgKCFCTl9tdWwoYiwgYSwgJihyZWNwLT5OciksIGN0eCkpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorICBpZiAoIUJOX3JzaGlmdChkLCBiLCBpIC0gcmVjcC0+bnVtX2JpdHMpKSB7CisgICAgZ290byBlcnI7CisgIH0KKyAgZC0+bmVnID0gMDsKKworICBpZiAoIUJOX211bChiLCAmKHJlY3AtPk4pLCBkLCBjdHgpKSB7CisgICAgZ290byBlcnI7CisgIH0KKyAgaWYgKCFCTl91c3ViKHIsIG0sIGIpKSB7CisgICAgZ290byBlcnI7CisgIH0KKyAgci0+bmVnID0gMDsKKworICBqID0gMDsKKyAgd2hpbGUgKEJOX3VjbXAociwgJihyZWNwLT5OKSkgPj0gMCkgeworICAgIGlmIChqKysgPiAyKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fZGl2X3JlY3AsIEJOX1JfQkFEX1JFQ0lQUk9DQUwpOworICAgICAgZ290byBlcnI7CisgICAgfQorICAgIGlmICghQk5fdXN1YihyLCByLCAmKHJlY3AtPk4pKSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICAgIGlmICghQk5fYWRkX3dvcmQoZCwgMSkpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfQorCisgIHItPm5lZyA9IEJOX2lzX3plcm8ocikgPyAwIDogbS0+bmVnOworICBkLT5uZWcgPSBtLT5uZWcgXiByZWNwLT5OLm5lZzsKKyAgcmV0ID0gMTsKKworZXJyOgorICBCTl9DVFhfZW5kKGN0eCk7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgQk5fbW9kX211bF9yZWNpcHJvY2FsKEJJR05VTSAqciwgY29uc3QgQklHTlVNICp4LCBjb25zdCBCSUdOVU0gKnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTl9SRUNQX0NUWCAqcmVjcCwgQk5fQ1RYICpjdHgpIHsKKyAgaW50IHJldCA9IDA7CisgIEJJR05VTSAqYTsKKyAgY29uc3QgQklHTlVNICpjYTsKKworICBCTl9DVFhfc3RhcnQoY3R4KTsKKyAgYSA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgaWYgKGEgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKHkgIT0gTlVMTCkgeworICAgIGlmICh4ID09IHkpIHsKKyAgICAgIGlmICghQk5fc3FyKGEsIHgsIGN0eCkpIHsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghQk5fbXVsKGEsIHgsIHksIGN0eCkpIHsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgfQorICAgIGNhID0gYTsKKyAgfSBlbHNlIHsKKyAgICBjYSA9IHg7IC8qIEp1c3QgZG8gdGhlIG1vZCAqLworICB9CisKKyAgcmV0ID0gQk5fZGl2X3JlY3AoTlVMTCwgciwgY2EsIHJlY3AsIGN0eCk7CisKK2VycjoKKyAgQk5fQ1RYX2VuZChjdHgpOworICByZXR1cm4gcmV0OworfQorCisvKiBCTl93aW5kb3dfYml0c19mb3JfZXhwb25lbnRfc2l6ZSAtLSBtYWNybyBmb3Igc2xpZGluZyB3aW5kb3cgbW9kX2V4cAorICogZnVuY3Rpb25zCisgKgorICogRm9yIHdpbmRvdyBzaXplICd3JyAodyA+PSAyKSBhbmQgYSByYW5kb20gJ2InIGJpdHMgZXhwb25lbnQsIHRoZSBudW1iZXIgb2YKKyAqIG11bHRpcGxpY2F0aW9ucyBpcyBhIGNvbnN0YW50IHBsdXMgb24gYXZlcmFnZQorICoKKyAqICAgIDJeKHctMSkgKyAoYi13KS8odysxKTsKKyAqCisgKiBoZXJlIDJeKHctMSkgIGlzIGZvciBwcmVjb21wdXRpbmcgdGhlIHRhYmxlICh3ZSBhY3R1YWxseSBuZWVkIGVudHJpZXMgb25seQorICogZm9yIHdpbmRvd3MgdGhhdCBoYXZlIHRoZSBsb3dlc3QgYml0IHNldCksIGFuZCAoYi13KS8odysxKSAgaXMgYW4KKyAqIGFwcHJveGltYXRpb24gZm9yIHRoZSBleHBlY3RlZCBudW1iZXIgb2Ygdy1iaXQgd2luZG93cywgbm90IGNvdW50aW5nIHRoZQorICogZmlyc3Qgb25lLgorICoKKyAqIFRodXMgd2Ugc2hvdWxkIHVzZQorICoKKyAqICAgIHcgPj0gNiAgaWYgICAgICAgIGIgPiA2NzEKKyAqICAgICB3ID0gNSAgaWYgIDY3MSA+IGIgPiAyMzkKKyAqICAgICB3ID0gNCAgaWYgIDIzOSA+IGIgPiAgNzkKKyAqICAgICB3ID0gMyAgaWYgICA3OSA+IGIgPiAgMjMKKyAqICAgIHcgPD0gMiAgaWYgICAyMyA+IGIKKyAqCisgKiAod2l0aCBkcmF3cyBpbiBiZXR3ZWVuKS4gIFZlcnkgc21hbGwgZXhwb25lbnRzIGFyZSBvZnRlbiBzZWxlY3RlZAorICogd2l0aCBsb3cgSGFtbWluZyB3ZWlnaHQsIHNvIHdlIHVzZSAgdyA9IDEgIGZvciBiIDw9IDIzLiAqLworI2RlZmluZSBCTl93aW5kb3dfYml0c19mb3JfZXhwb25lbnRfc2l6ZShiKSBcCisJCSgoYikgPiA2NzEgPyA2IDogXAorCQkgKGIpID4gMjM5ID8gNSA6IFwKKwkJIChiKSA+ICA3OSA/IDQgOiBcCisJCSAoYikgPiAgMjMgPyAzIDogMSkKKworc3RhdGljIGludCBtb2RfZXhwX3JlY3AoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJJR05VTSAqbSwgQk5fQ1RYICpjdHgpIHsKKyAgaW50IGksIGosIGJpdHMsIHJldCA9IDAsIHdzdGFydCwgd2VuZCwgd2luZG93LCB3dmFsdWU7CisgIGludCBzdGFydCA9IDE7CisgIEJJR05VTSAqYWE7CisgIC8qIFRhYmxlIG9mIHZhcmlhYmxlcyBvYnRhaW5lZCBmcm9tICdjdHgnICovCisgIEJJR05VTSAqdmFsW1RBQkxFX1NJWkVdOworICBCTl9SRUNQX0NUWCByZWNwOworCisgIGlmIChCTl9nZXRfZmxhZ3MocCwgQk5fRkxHX0NPTlNUVElNRSkgIT0gMCkgeworICAgIC8qIEJOX0ZMR19DT05TVFRJTUUgb25seSBzdXBwb3J0ZWQgYnkgQk5fbW9kX2V4cF9tb250KCkgKi8KKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgbW9kX2V4cF9yZWNwLCBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworICAgIHJldHVybiAwOworICB9CisKKyAgYml0cyA9IEJOX251bV9iaXRzKHApOworCisgIGlmIChiaXRzID09IDApIHsKKyAgICByZXQgPSBCTl9vbmUocik7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIEJOX0NUWF9zdGFydChjdHgpOworICBhYSA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgdmFsWzBdID0gQk5fQ1RYX2dldChjdHgpOworICBpZiAoIWFhIHx8ICF2YWxbMF0pIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIEJOX1JFQ1BfQ1RYX2luaXQoJnJlY3ApOworICBpZiAobS0+bmVnKSB7CisgICAgLyogaWdub3JlIHNpZ24gb2YgJ20nICovCisgICAgaWYgKCFCTl9jb3B5KGFhLCBtKSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICAgIGFhLT5uZWcgPSAwOworICAgIGlmIChCTl9SRUNQX0NUWF9zZXQoJnJlY3AsIGFhLCBjdHgpIDw9IDApIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoQk5fUkVDUF9DVFhfc2V0KCZyZWNwLCBtLCBjdHgpIDw9IDApIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfQorCisgIGlmICghQk5fbm5tb2QodmFsWzBdLCBhLCBtLCBjdHgpKSB7CisgICAgZ290byBlcnI7IC8qIDEgKi8KKyAgfQorICBpZiAoQk5faXNfemVybyh2YWxbMF0pKSB7CisgICAgQk5femVybyhyKTsKKyAgICByZXQgPSAxOworICAgIGdvdG8gZXJyOworICB9CisKKyAgd2luZG93ID0gQk5fd2luZG93X2JpdHNfZm9yX2V4cG9uZW50X3NpemUoYml0cyk7CisgIGlmICh3aW5kb3cgPiAxKSB7CisgICAgaWYgKCFCTl9tb2RfbXVsX3JlY2lwcm9jYWwoYWEsIHZhbFswXSwgdmFsWzBdLCAmcmVjcCwgY3R4KSkgeworICAgICAgZ290byBlcnI7IC8qIDIgKi8KKyAgICB9CisgICAgaiA9IDEgPDwgKHdpbmRvdyAtIDEpOworICAgIGZvciAoaSA9IDE7IGkgPCBqOyBpKyspIHsKKyAgICAgIGlmICgoKHZhbFtpXSA9IEJOX0NUWF9nZXQoY3R4KSkgPT0gTlVMTCkgfHwKKyAgICAgICAgICAhQk5fbW9kX211bF9yZWNpcHJvY2FsKHZhbFtpXSwgdmFsW2kgLSAxXSwgYWEsICZyZWNwLCBjdHgpKSB7CisgICAgICAgIGdvdG8gZXJyOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHN0YXJ0ID0gMTsgLyogVGhpcyBpcyB1c2VkIHRvIGF2b2lkIG11bHRpcGxpY2F0aW9uIGV0YworICAgICAgICAgICAgICAqIHdoZW4gdGhlcmUgaXMgb25seSB0aGUgdmFsdWUgJzEnIGluIHRoZQorICAgICAgICAgICAgICAqIGJ1ZmZlci4gKi8KKyAgd3ZhbHVlID0gMDsgICAgICAgIC8qIFRoZSAndmFsdWUnIG9mIHRoZSB3aW5kb3cgKi8KKyAgd3N0YXJ0ID0gYml0cyAtIDE7IC8qIFRoZSB0b3AgYml0IG9mIHRoZSB3aW5kb3cgKi8KKyAgd2VuZCA9IDA7ICAgICAgICAgIC8qIFRoZSBib3R0b20gYml0IG9mIHRoZSB3aW5kb3cgKi8KKworICBpZiAoIUJOX29uZShyKSkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgZm9yICg7OykgeworICAgIGlmIChCTl9pc19iaXRfc2V0KHAsIHdzdGFydCkgPT0gMCkgeworICAgICAgaWYgKCFzdGFydCkgeworICAgICAgICBpZiAoIUJOX21vZF9tdWxfcmVjaXByb2NhbChyLCByLCByLCAmcmVjcCwgY3R4KSkgeworICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAod3N0YXJ0ID09IDApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICB3c3RhcnQtLTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIFdlIG5vdyBoYXZlIHdzdGFydCBvbiBhICdzZXQnIGJpdCwgd2Ugbm93IG5lZWQgdG8gd29yayBvdXQKKyAgICAgKiBob3cgYml0IGEgd2luZG93IHRvIGRvLiAgVG8gZG8gdGhpcyB3ZSBuZWVkIHRvIHNjYW4KKyAgICAgKiBmb3J3YXJkIHVudGlsIHRoZSBsYXN0IHNldCBiaXQgYmVmb3JlIHRoZSBlbmQgb2YgdGhlCisgICAgICogd2luZG93ICovCisgICAgaiA9IHdzdGFydDsKKyAgICB3dmFsdWUgPSAxOworICAgIHdlbmQgPSAwOworICAgIGZvciAoaSA9IDE7IGkgPCB3aW5kb3c7IGkrKykgeworICAgICAgaWYgKHdzdGFydCAtIGkgPCAwKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKEJOX2lzX2JpdF9zZXQocCwgd3N0YXJ0IC0gaSkpIHsKKyAgICAgICAgd3ZhbHVlIDw8PSAoaSAtIHdlbmQpOworICAgICAgICB3dmFsdWUgfD0gMTsKKyAgICAgICAgd2VuZCA9IGk7CisgICAgICB9CisgICAgfQorCisgICAgLyogd2VuZCBpcyB0aGUgc2l6ZSBvZiB0aGUgY3VycmVudCB3aW5kb3cgKi8KKyAgICBqID0gd2VuZCArIDE7CisgICAgLyogYWRkIHRoZSAnYnl0ZXMgYWJvdmUnICovCisgICAgaWYgKCFzdGFydCkgeworICAgICAgZm9yIChpID0gMDsgaSA8IGo7IGkrKykgeworICAgICAgICBpZiAoIUJOX21vZF9tdWxfcmVjaXByb2NhbChyLCByLCByLCAmcmVjcCwgY3R4KSkgeworICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyogd3ZhbHVlIHdpbGwgYmUgYW4gb2RkIG51bWJlciA8IDJed2luZG93ICovCisgICAgaWYgKCFCTl9tb2RfbXVsX3JlY2lwcm9jYWwociwgciwgdmFsW3d2YWx1ZSA+PiAxXSwgJnJlY3AsIGN0eCkpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIC8qIG1vdmUgdGhlICd3aW5kb3cnIGRvd24gZnVydGhlciAqLworICAgIHdzdGFydCAtPSB3ZW5kICsgMTsKKyAgICB3dmFsdWUgPSAwOworICAgIHN0YXJ0ID0gMDsKKyAgICBpZiAod3N0YXJ0IDwgMCkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldCA9IDE7CisKK2VycjoKKyAgQk5fQ1RYX2VuZChjdHgpOworICBCTl9SRUNQX0NUWF9mcmVlKCZyZWNwKTsKKyAgcmV0dXJuIHJldDsKK30KKworaW50IEJOX21vZF9leHAoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqcCwgY29uc3QgQklHTlVNICptLAorICAgICAgICAgICAgICAgQk5fQ1RYICpjdHgpIHsKKyAgLyogRm9yIGV2ZW4gbW9kdWx1cyAgbSA9IDJeayptX29kZCwgIGl0IG1pZ2h0IG1ha2Ugc2Vuc2UgdG8gY29tcHV0ZQorICAgKiBhXnAgbW9kIG1fb2RkICBhbmQgIGFecCBtb2QgMl5rICBzZXBhcmF0ZWx5ICh3aXRoIE1vbnRnb21lcnkKKyAgICogZXhwb25lbnRpYXRpb24gZm9yIHRoZSBvZGQgcGFydCksIHVzaW5nIGFwcHJvcHJpYXRlIGV4cG9uZW50CisgICAqIHJlZHVjdGlvbnMsIGFuZCBjb21iaW5lIHRoZSByZXN1bHRzIHVzaW5nIHRoZSBDUlQuCisgICAqCisgICAqIEZvciBub3csIHdlIHVzZSBNb250Z29tZXJ5IG9ubHkgaWYgdGhlIG1vZHVsdXMgaXMgb2RkOyBvdGhlcndpc2UsCisgICAqIGV4cG9uZW50aWF0aW9uIHVzaW5nIHRoZSByZWNpcHJvY2FsLWJhc2VkIHF1aWNrIHJlbWFpbmRlcmluZworICAgKiBhbGdvcml0aG0gaXMgdXNlZC4KKyAgICoKKyAgICogKFRpbWluZyBvYnRhaW5lZCB3aXRoIGV4cHNwZWVkLmMgW2NvbXB1dGF0aW9ucyAgYV5wIG1vZCBtCisgICAqIHdoZXJlICBhLCBwLCBtICBhcmUgb2YgdGhlIHNhbWUgbGVuZ3RoOiAyNTYsIDUxMiwgMTAyNCwgMjA0OCwKKyAgICogNDA5NiwgODE5MiBiaXRzXSwgY29tcGFyZWQgdG8gdGhlIHJ1bm5pbmcgdGltZSBvZiB0aGUKKyAgICogc3RhbmRhcmQgYWxnb3JpdGhtOgorICAgKgorICAgKiAgIEJOX21vZF9leHBfbW9udCAgIDMzIC4uIDQwICUgIFtBTUQgSzYtMiwgTGludXgsIGRlYnVnIGNvbmZpZ3VyYXRpb25dCisgICAqICAgICAgICAgICAgICAgICAgICAgNTUgLi4gNzcgJSAgW1VsdHJhU3BhcmMgcHJvY2Vzc29yLCBidXQKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWctc29sYXJpcy1zcGFyY3Y4LWdjYyBjb25mLl0KKyAgICoKKyAgICogICBCTl9tb2RfZXhwX3JlY3AgICA1MCAuLiA3MCAlICBbQU1EIEs2LTIsIExpbnV4LCBkZWJ1ZyBjb25maWd1cmF0aW9uXQorICAgKiAgICAgICAgICAgICAgICAgICAgIDYyIC4uIDExOCAlIFtVbHRyYVNwYXJjLCBkZWJ1Zy1zb2xhcmlzLXNwYXJjdjgtZ2NjXQorICAgKgorICAgKiBPbiB0aGUgU3BhcmMsIEJOX21vZF9leHBfcmVjcCB3YXMgZmFzdGVyIHRoYW4gQk5fbW9kX2V4cF9tb250CisgICAqIGF0IDIwNDggYW5kIG1vcmUgYml0cywgYnV0IGF0IDUxMiBhbmQgMTAyNCBiaXRzLCBpdCB3YXMKKyAgICogc2xvd2VyIGV2ZW4gdGhhbiB0aGUgc3RhbmRhcmQgYWxnb3JpdGhtIQorICAgKgorICAgKiAiUmVhbCIgdGltaW5ncyBbbGludXgtZWxmLCBzb2xhcmlzLXNwYXJjdjktZ2NjIGNvbmZpZ3VyYXRpb25zXQorICAgKiBzaG91bGQgYmUgb2J0YWluZWQgd2hlbiB0aGUgbmV3IE1vbnRnb21lcnkgcmVkdWN0aW9uIGNvZGUKKyAgICogaGFzIGJlZW4gaW50ZWdyYXRlZCBpbnRvIE9wZW5TU0wuKSAqLworCisgIGlmIChCTl9pc19vZGQobSkpIHsKKyAgICBpZiAoYS0+dG9wID09IDEgJiYgIWEtPm5lZyAmJiBCTl9nZXRfZmxhZ3MocCwgQk5fRkxHX0NPTlNUVElNRSkgPT0gMCkgeworICAgICAgQk5fVUxPTkcgQSA9IGEtPmRbMF07CisgICAgICByZXR1cm4gQk5fbW9kX2V4cF9tb250X3dvcmQociwgQSwgcCwgbSwgY3R4LCBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gQk5fbW9kX2V4cF9tb250KHIsIGEsIHAsIG0sIGN0eCwgTlVMTCk7CisgIH0KKworICByZXR1cm4gbW9kX2V4cF9yZWNwKHIsIGEsIHAsIG0sIGN0eCk7Cit9CisKK2ludCBCTl9tb2RfZXhwX21vbnQoQklHTlVNICpyciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKnAsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJJR05VTSAqbSwgQk5fQ1RYICpjdHgsIEJOX01PTlRfQ1RYICppbl9tb250KSB7CisgIGludCBpLCBqLCBiaXRzLCByZXQgPSAwLCB3c3RhcnQsIHdlbmQsIHdpbmRvdywgd3ZhbHVlOworICBpbnQgc3RhcnQgPSAxOworICBCSUdOVU0gKmQsICpyOworICBjb25zdCBCSUdOVU0gKmFhOworICAvKiBUYWJsZSBvZiB2YXJpYWJsZXMgb2J0YWluZWQgZnJvbSAnY3R4JyAqLworICBCSUdOVU0gKnZhbFtUQUJMRV9TSVpFXTsKKyAgQk5fTU9OVF9DVFggKm1vbnQgPSBOVUxMOworCisgIGlmIChCTl9nZXRfZmxhZ3MocCwgQk5fRkxHX0NPTlNUVElNRSkgIT0gMCkgeworICAgIHJldHVybiBCTl9tb2RfZXhwX21vbnRfY29uc3R0aW1lKHJyLCBhLCBwLCBtLCBjdHgsIGluX21vbnQpOworICB9CisKKyAgaWYgKCFCTl9pc19vZGQobSkpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fbW9kX2V4cF9tb250LCBCTl9SX0NBTExFRF9XSVRIX0VWRU5fTU9EVUxVUyk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgYml0cyA9IEJOX251bV9iaXRzKHApOworICBpZiAoYml0cyA9PSAwKSB7CisgICAgcmV0ID0gQk5fb25lKHJyKTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgQk5fQ1RYX3N0YXJ0KGN0eCk7CisgIGQgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIHIgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIHZhbFswXSA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgaWYgKCFkIHx8ICFyIHx8ICF2YWxbMF0pIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIC8qIElmIHRoaXMgaXMgbm90IGRvbmUsIHRoaW5ncyB3aWxsIGJyZWFrIGluIHRoZSBtb250Z29tZXJ5IHBhcnQgKi8KKworICBpZiAoaW5fbW9udCAhPSBOVUxMKSB7CisgICAgbW9udCA9IGluX21vbnQ7CisgIH0gZWxzZSB7CisgICAgbW9udCA9IEJOX01PTlRfQ1RYX25ldygpOworICAgIGlmIChtb250ID09IE5VTEwpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBpZiAoIUJOX01PTlRfQ1RYX3NldChtb250LCBtLCBjdHgpKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0KKworICBpZiAoYS0+bmVnIHx8IEJOX3VjbXAoYSwgbSkgPj0gMCkgeworICAgIGlmICghQk5fbm5tb2QodmFsWzBdLCBhLCBtLCBjdHgpKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgYWEgPSB2YWxbMF07CisgIH0gZWxzZSB7CisgICAgYWEgPSBhOworICB9CisKKyAgaWYgKEJOX2lzX3plcm8oYWEpKSB7CisgICAgQk5femVybyhycik7CisgICAgcmV0ID0gMTsKKyAgICBnb3RvIGVycjsKKyAgfQorICBpZiAoIUJOX3RvX21vbnRnb21lcnkodmFsWzBdLCBhYSwgbW9udCwgY3R4KSkgeworICAgIGdvdG8gZXJyOyAvKiAxICovCisgIH0KKworICB3aW5kb3cgPSBCTl93aW5kb3dfYml0c19mb3JfZXhwb25lbnRfc2l6ZShiaXRzKTsKKyAgaWYgKHdpbmRvdyA+IDEpIHsKKyAgICBpZiAoIUJOX21vZF9tdWxfbW9udGdvbWVyeShkLCB2YWxbMF0sIHZhbFswXSwgbW9udCwgY3R4KSkgeworICAgICAgZ290byBlcnI7IC8qIDIgKi8KKyAgICB9CisgICAgaiA9IDEgPDwgKHdpbmRvdyAtIDEpOworICAgIGZvciAoaSA9IDE7IGkgPCBqOyBpKyspIHsKKyAgICAgIGlmICgoKHZhbFtpXSA9IEJOX0NUWF9nZXQoY3R4KSkgPT0gTlVMTCkgfHwKKyAgICAgICAgICAhQk5fbW9kX211bF9tb250Z29tZXJ5KHZhbFtpXSwgdmFsW2kgLSAxXSwgZCwgbW9udCwgY3R4KSkgeworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzdGFydCA9IDE7IC8qIFRoaXMgaXMgdXNlZCB0byBhdm9pZCBtdWx0aXBsaWNhdGlvbiBldGMKKyAgICAgICAgICAgICAgKiB3aGVuIHRoZXJlIGlzIG9ubHkgdGhlIHZhbHVlICcxJyBpbiB0aGUKKyAgICAgICAgICAgICAgKiBidWZmZXIuICovCisgIHd2YWx1ZSA9IDA7ICAgICAgICAvKiBUaGUgJ3ZhbHVlJyBvZiB0aGUgd2luZG93ICovCisgIHdzdGFydCA9IGJpdHMgLSAxOyAvKiBUaGUgdG9wIGJpdCBvZiB0aGUgd2luZG93ICovCisgIHdlbmQgPSAwOyAgICAgICAgICAvKiBUaGUgYm90dG9tIGJpdCBvZiB0aGUgd2luZG93ICovCisKKyAgaiA9IG0tPnRvcDsgLyogYm9ycm93IGogKi8KKyAgaWYgKG0tPmRbaiAtIDFdICYgKCgoQk5fVUxPTkcpMSkgPDwgKEJOX0JJVFMyIC0gMSkpKSB7CisgICAgaWYgKGJuX3dleHBhbmQociwgaikgPT0gTlVMTCkKKyAgICAgIGdvdG8gZXJyOworICAgIC8qIDJeKHRvcCpCTl9CSVRTMikgLSBtICovCisgICAgci0+ZFswXSA9ICgwIC0gbS0+ZFswXSkgJiBCTl9NQVNLMjsKKyAgICBmb3IgKGkgPSAxOyBpIDwgajsgaSsrKQorICAgICAgci0+ZFtpXSA9ICh+bS0+ZFtpXSkgJiBCTl9NQVNLMjsKKyAgICByLT50b3AgPSBqOworICB9IGVsc2UgaWYgKCFCTl90b19tb250Z29tZXJ5KHIsIEJOX3ZhbHVlX29uZSgpLCBtb250LCBjdHgpKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBmb3IgKDs7KSB7CisgICAgaWYgKEJOX2lzX2JpdF9zZXQocCwgd3N0YXJ0KSA9PSAwKSB7CisgICAgICBpZiAoIXN0YXJ0KSB7CisgICAgICAgIGlmICghQk5fbW9kX211bF9tb250Z29tZXJ5KHIsIHIsIHIsIG1vbnQsIGN0eCkpCisgICAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgICBpZiAod3N0YXJ0ID09IDApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICB3c3RhcnQtLTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIFdlIG5vdyBoYXZlIHdzdGFydCBvbiBhICdzZXQnIGJpdCwgd2Ugbm93IG5lZWQgdG8gd29yayBvdXQgaG93IGJpdCBhCisgICAgICogd2luZG93IHRvIGRvLiAgVG8gZG8gdGhpcyB3ZSBuZWVkIHRvIHNjYW4gZm9yd2FyZCB1bnRpbCB0aGUgbGFzdCBzZXQgYml0CisgICAgICogYmVmb3JlIHRoZSBlbmQgb2YgdGhlIHdpbmRvdyAqLworICAgIGogPSB3c3RhcnQ7CisgICAgd3ZhbHVlID0gMTsKKyAgICB3ZW5kID0gMDsKKyAgICBmb3IgKGkgPSAxOyBpIDwgd2luZG93OyBpKyspIHsKKyAgICAgIGlmICh3c3RhcnQgLSBpIDwgMCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChCTl9pc19iaXRfc2V0KHAsIHdzdGFydCAtIGkpKSB7CisgICAgICAgIHd2YWx1ZSA8PD0gKGkgLSB3ZW5kKTsKKyAgICAgICAgd3ZhbHVlIHw9IDE7CisgICAgICAgIHdlbmQgPSBpOworICAgICAgfQorICAgIH0KKworICAgIC8qIHdlbmQgaXMgdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgd2luZG93ICovCisgICAgaiA9IHdlbmQgKyAxOworICAgIC8qIGFkZCB0aGUgJ2J5dGVzIGFib3ZlJyAqLworICAgIGlmICghc3RhcnQpIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBqOyBpKyspIHsKKyAgICAgICAgaWYgKCFCTl9tb2RfbXVsX21vbnRnb21lcnkociwgciwgciwgbW9udCwgY3R4KSkgeworICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyogd3ZhbHVlIHdpbGwgYmUgYW4gb2RkIG51bWJlciA8IDJed2luZG93ICovCisgICAgaWYgKCFCTl9tb2RfbXVsX21vbnRnb21lcnkociwgciwgdmFsW3d2YWx1ZSA+PiAxXSwgbW9udCwgY3R4KSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgLyogbW92ZSB0aGUgJ3dpbmRvdycgZG93biBmdXJ0aGVyICovCisgICAgd3N0YXJ0IC09IHdlbmQgKyAxOworICAgIHd2YWx1ZSA9IDA7CisgICAgc3RhcnQgPSAwOworICAgIGlmICh3c3RhcnQgPCAwKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoIUJOX2Zyb21fbW9udGdvbWVyeShyciwgciwgbW9udCwgY3R4KSkgeworICAgIGdvdG8gZXJyOworICB9CisgIHJldCA9IDE7CisKK2VycjoKKyAgaWYgKGluX21vbnQgPT0gTlVMTCAmJiBtb250ICE9IE5VTEwpIHsKKyAgICBCTl9NT05UX0NUWF9mcmVlKG1vbnQpOworICB9CisgIEJOX0NUWF9lbmQoY3R4KTsKKyAgcmV0dXJuIHJldDsKK30KKworLyogQk5fbW9kX2V4cF9tb250X2NvbnN0dGltZSgpIHN0b3JlcyB0aGUgcHJlY29tcHV0ZWQgcG93ZXJzIGluIGEgc3BlY2lmaWMKKyAqIGxheW91dCBzbyB0aGF0IGFjY2Vzc2luZyBhbnkgb2YgdGhlc2UgdGFibGUgdmFsdWVzIHNob3dzIHRoZSBzYW1lIGFjY2VzcworICogcGF0dGVybiBhcyBmYXIgYXMgY2FjaGUgbGluZXMgYXJlIGNvbmNlcm5lZC4gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlCisgKiB1c2VkIHRvIHRyYW5zZmVyIGEgQklHTlVNIGZyb20vdG8gdGhhdCB0YWJsZS4gKi8KK3N0YXRpYyBpbnQgY29weV90b19wcmVidWYoY29uc3QgQklHTlVNICpiLCBpbnQgdG9wLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBpZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCkgeworICBzaXplX3QgaSwgajsKKworICBpZiAodG9wID4gYi0+dG9wKSB7CisgICAgdG9wID0gYi0+dG9wOyAvKiB0aGlzIHdvcmtzIGJlY2F1c2UgJ2J1ZicgaXMgZXhwbGljaXRseSB6ZXJvZWQgKi8KKyAgfQorICBmb3IgKGkgPSAwLCBqID0gaWR4OyBpIDwgdG9wICogc2l6ZW9mIGItPmRbMF07IGkrKywgaiArPSB3aWR0aCkgeworICAgIGJ1ZltqXSA9ICgodW5zaWduZWQgY2hhciAqKWItPmQpW2ldOworICB9CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY29weV9mcm9tX3ByZWJ1ZihCSUdOVU0gKmIsIGludCB0b3AsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpIHsKKyAgc2l6ZV90IGksIGo7CisKKyAgaWYgKGJuX3dleHBhbmQoYiwgdG9wKSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBmb3IgKGkgPSAwLCBqID0gaWR4OyBpIDwgdG9wICogc2l6ZW9mIGItPmRbMF07IGkrKywgaiArPSB3aWR0aCkgeworICAgICgodW5zaWduZWQgY2hhciAqKWItPmQpW2ldID0gYnVmW2pdOworICB9CisKKyAgYi0+dG9wID0gdG9wOworICBibl9jb3JyZWN0X3RvcChiKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qIEJOX21vZF9leHBfbW9udF9jb250dGltZSBpcyBiYXNlZCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBMMSBkYXRhIGNhY2hlCisgKiBsaW5lIHdpZHRoIG9mIHRoZSB0YXJnZXQgcHJvY2Vzc29yIGlzIGF0IGxlYXN0IHRoZSBmb2xsb3dpbmcgdmFsdWUuICovCisjZGVmaW5lIE1PRF9FWFBfQ1RJTUVfTUlOX0NBQ0hFX0xJTkVfV0lEVEggKDY0KQorI2RlZmluZSBNT0RfRVhQX0NUSU1FX01JTl9DQUNIRV9MSU5FX01BU0sgXAorICAoTU9EX0VYUF9DVElNRV9NSU5fQ0FDSEVfTElORV9XSURUSCAtIDEpCisKKy8qIFdpbmRvdyBzaXplcyBvcHRpbWl6ZWQgZm9yIGZpeGVkIHdpbmRvdyBzaXplIG1vZHVsYXIgZXhwb25lbnRpYXRpb24KKyAqIGFsZ29yaXRobSAoQk5fbW9kX2V4cF9tb250X2NvbnN0dGltZSkuCisgKgorICogVG8gYWNoaWV2ZSB0aGUgc2VjdXJpdHkgZ29hbHMgb2YgQk5fbW9kZV9leHBfbW9udF9jb25zdHRpbWUsIHRoZSBtYXhpbXVtCisgKiBzaXplIG9mIHRoZSB3aW5kb3cgbXVzdCBub3QgZXhjZWVkCisgKiBsb2dfMihNT0RfRVhQX0NUSU1FX01JTl9DQUNIRV9MSU5FX1dJRFRIKS4gCisgKgorICogV2luZG93IHNpemUgdGhyZXNob2xkcyBhcmUgZGVmaW5lZCBmb3IgY2FjaGUgbGluZSBzaXplcyBvZiAzMiBhbmQgNjQsIGNhY2hlCisgKiBsaW5lIHNpemVzIHdoZXJlIGxvZ18yKDMyKT01IGFuZCBsb2dfMig2NCk9NiByZXNwZWN0aXZlbHkuIEEgd2luZG93IHNpemUgb2YKKyAqIDcgc2hvdWxkIG9ubHkgYmUgdXNlZCBvbiBwcm9jZXNzb3JzIHRoYXQgaGF2ZSBhIDEyOCBieXRlIG9yIGdyZWF0ZXIgY2FjaGUKKyAqIGxpbmUgc2l6ZS4gKi8KKyNpZiBNT0RfRVhQX0NUSU1FX01JTl9DQUNIRV9MSU5FX1dJRFRIID09IDY0CisKKyNkZWZpbmUgQk5fd2luZG93X2JpdHNfZm9yX2N0aW1lX2V4cG9uZW50X3NpemUoYikgXAorICAoKGIpID4gOTM3ID8gNiA6IChiKSA+IDMwNiA/IDUgOiAoYikgPiA4OSA/IDQgOiAoYikgPiAyMiA/IDMgOiAxKQorI2RlZmluZSBCTl9NQVhfV0lORE9XX0JJVFNfRk9SX0NUSU1FX0VYUE9ORU5UX1NJWkUgKDYpCisKKyNlbGlmIE1PRF9FWFBfQ1RJTUVfTUlOX0NBQ0hFX0xJTkVfV0lEVEggPT0gMzIKKworI2RlZmluZSBCTl93aW5kb3dfYml0c19mb3JfY3RpbWVfZXhwb25lbnRfc2l6ZShiKSBcCisgICgoYikgPiAzMDYgPyA1IDogKGIpID4gODkgPyA0IDogKGIpID4gMjIgPyAzIDogMSkKKyNkZWZpbmUgQk5fTUFYX1dJTkRPV19CSVRTX0ZPUl9DVElNRV9FWFBPTkVOVF9TSVpFICg1KQorCisjZW5kaWYKKworLyogR2l2ZW4gYSBwb2ludGVyIHZhbHVlLCBjb21wdXRlIHRoZSBuZXh0IGFkZHJlc3MgdGhhdCBpcyBhIGNhY2hlIGxpbmUKKyAqIG11bHRpcGxlLiAqLworI2RlZmluZSBNT0RfRVhQX0NUSU1FX0FMSUdOKHhfKSAgICAgICAgICBcCisgICgodW5zaWduZWQgY2hhciAqKSh4XykgKyAgICAgICAgICAgICAgIFwKKyAgIChNT0RfRVhQX0NUSU1FX01JTl9DQUNIRV9MSU5FX1dJRFRIIC0gXAorICAgICgoKHNpemVfdCkoeF8pKSAmIChNT0RfRVhQX0NUSU1FX01JTl9DQUNIRV9MSU5FX01BU0spKSkpCisKKy8qIFRoaXMgdmFyaWFudCBvZiBCTl9tb2RfZXhwX21vbnQoKSB1c2VzIGZpeGVkIHdpbmRvd3MgYW5kIHRoZSBzcGVjaWFsCisgKiBwcmVjb21wdXRhdGlvbiBtZW1vcnkgbGF5b3V0IHRvIGxpbWl0IGRhdGEtZGVwZW5kZW5jeSB0byBhIG1pbmltdW0KKyAqIHRvIHByb3RlY3Qgc2VjcmV0IGV4cG9uZW50cyAoY2YuIHRoZSBoeXBlci10aHJlYWRpbmcgdGltaW5nIGF0dGFja3MKKyAqIHBvaW50ZWQgb3V0IGJ5IENvbGluIFBlcmNpdmFsLAorICogaHR0cDovL3d3dy5kYWVtb25vbG9neS5uZXQvaHlwZXJ0aHJlYWRpbmctY29uc2lkZXJlZC1oYXJtZnVsLykKKyAqLworaW50IEJOX21vZF9leHBfbW9udF9jb25zdHRpbWUoQklHTlVNICpyciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk5fTU9OVF9DVFggKmluX21vbnQpIHsKKyAgaW50IGksIGJpdHMsIHJldCA9IDAsIHdpbmRvdywgd3ZhbHVlOworICBpbnQgdG9wOworICBCTl9NT05UX0NUWCAqbW9udCA9IE5VTEw7CisKKyAgaW50IG51bVBvd2VyczsKKyAgdW5zaWduZWQgY2hhciAqcG93ZXJidWZGcmVlID0gTlVMTDsKKyAgaW50IHBvd2VyYnVmTGVuID0gMDsKKyAgdW5zaWduZWQgY2hhciAqcG93ZXJidWYgPSBOVUxMOworICBCSUdOVU0gdG1wLCBhbTsKKworICB0b3AgPSBtLT50b3A7CisKKyAgaWYgKCEobS0+ZFswXSAmIDEpKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX21vZF9leHBfbW9udF9jb25zdHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgQk5fUl9DQUxMRURfV0lUSF9FVkVOX01PRFVMVVMpOworICAgIHJldHVybiAwOworICB9CisgIGJpdHMgPSBCTl9udW1fYml0cyhwKTsKKyAgaWYgKGJpdHMgPT0gMCkgeworICAgIHJldCA9IEJOX29uZShycik7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIEJOX0NUWF9zdGFydChjdHgpOworCisgIC8qIEFsbG9jYXRlIGEgbW9udGdvbWVyeSBjb250ZXh0IGlmIGl0IHdhcyBub3Qgc3VwcGxpZWQgYnkgdGhlIGNhbGxlci4KKyAgICogSWYgdGhpcyBpcyBub3QgZG9uZSwgdGhpbmdzIHdpbGwgYnJlYWsgaW4gdGhlIG1vbnRnb21lcnkgcGFydC4KKyAgICovCisgIGlmIChpbl9tb250ICE9IE5VTEwpCisgICAgbW9udCA9IGluX21vbnQ7CisgIGVsc2UgeworICAgIGlmICgobW9udCA9IEJOX01PTlRfQ1RYX25ldygpKSA9PSBOVUxMKQorICAgICAgZ290byBlcnI7CisgICAgaWYgKCFCTl9NT05UX0NUWF9zZXQobW9udCwgbSwgY3R4KSkKKyAgICAgIGdvdG8gZXJyOworICB9CisKKyNpZmRlZiBSU0FaX0VOQUJMRUQKKyAgLyogSWYgdGhlIHNpemUgb2YgdGhlIG9wZXJhbmRzIGFsbG93IGl0LCBwZXJmb3JtIHRoZSBvcHRpbWl6ZWQKKyAgICogUlNBWiBleHBvbmVudGlhdGlvbi4gRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gc2VlCisgICAqIGNyeXB0by9ibi9yc2F6X2V4cC5jIGFuZCBhY2NvbXBhbnlpbmcgYXNzZW1ibHkgbW9kdWxlcy4gKi8KKyAgaWYgKCgoT1BFTlNTTF9pYTMyY2FwX1BbMl0gJiAweDgwMTAwKSAhPSAweDgwMTAwKSAvKiBjaGVjayBmb3IgTVVMWC9BRCpYICovCisgICAgICAmJiAoMTYgPT0gYS0+dG9wKSAmJiAoMTYgPT0gcC0+dG9wKSAmJiAoQk5fbnVtX2JpdHMobSkgPT0gMTAyNCkgJiYKKyAgICAgIHJzYXpfYXZ4Ml9lbGlnaWJsZSgpKSB7CisgICAgaWYgKE5VTEwgPT0gYm5fd2V4cGFuZChyciwgMTYpKQorICAgICAgZ290byBlcnI7CisgICAgUlNBWl8xMDI0X21vZF9leHBfYXZ4Mihyci0+ZCwgYS0+ZCwgcC0+ZCwgbS0+ZCwgbW9udC0+UlIuZCwgbW9udC0+bjBbMF0pOworICAgIHJyLT50b3AgPSAxNjsKKyAgICByci0+bmVnID0gMDsKKyAgICBibl9jb3JyZWN0X3RvcChycik7CisgICAgcmV0ID0gMTsKKyAgICBnb3RvIGVycjsKKyAgfSBlbHNlIGlmICgoOCA9PSBhLT50b3ApICYmICg4ID09IHAtPnRvcCkgJiYgKEJOX251bV9iaXRzKG0pID09IDUxMikpIHsKKyAgICBpZiAoTlVMTCA9PSBibl93ZXhwYW5kKHJyLCA4KSkKKyAgICAgIGdvdG8gZXJyOworICAgIFJTQVpfNTEyX21vZF9leHAocnItPmQsIGEtPmQsIHAtPmQsIG0tPmQsIG1vbnQtPm4wWzBdLCBtb250LT5SUi5kKTsKKyAgICByci0+dG9wID0gODsKKyAgICByci0+bmVnID0gMDsKKyAgICBibl9jb3JyZWN0X3RvcChycik7CisgICAgcmV0ID0gMTsKKyAgICBnb3RvIGVycjsKKyAgfQorI2VuZGlmCisKKyAgLyogR2V0IHRoZSB3aW5kb3cgc2l6ZSB0byB1c2Ugd2l0aCBzaXplIG9mIHAuICovCisgIHdpbmRvdyA9IEJOX3dpbmRvd19iaXRzX2Zvcl9jdGltZV9leHBvbmVudF9zaXplKGJpdHMpOworI2lmIGRlZmluZWQoT1BFTlNTTF9CTl9BU01fTU9OVDUpCisgIGlmICh3aW5kb3cgPj0gNSkgeworICAgIHdpbmRvdyA9IDU7IC8qIH41JSBpbXByb3ZlbWVudCBmb3IgUlNBMjA0OCBzaWduLCBhbmQgZXZlbiBmb3IgUlNBNDA5NiAqLworICAgIGlmICgodG9wICYgNykgPT0gMCkKKyAgICAgIHBvd2VyYnVmTGVuICs9IDIgKiB0b3AgKiBzaXplb2YobS0+ZFswXSk7CisgIH0KKyNlbmRpZgorICAodm9pZCkwOworCisgIC8qIEFsbG9jYXRlIGEgYnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGFsbCBvZiB0aGUgcHJlLWNvbXB1dGVkCisgICAqIHBvd2VycyBvZiBhbSwgYW0gaXRzZWxmIGFuZCB0bXAuCisgICAqLworICBudW1Qb3dlcnMgPSAxIDw8IHdpbmRvdzsKKyAgcG93ZXJidWZMZW4gKz0KKyAgICAgIHNpemVvZihtLT5kWzBdKSAqCisgICAgICAodG9wICogbnVtUG93ZXJzICsgKCgyICogdG9wKSA+IG51bVBvd2VycyA/ICgyICogdG9wKSA6IG51bVBvd2VycykpOworI2lmZGVmIGFsbG9jYQorICBpZiAocG93ZXJidWZMZW4gPCAzMDcyKQorICAgIHBvd2VyYnVmRnJlZSA9IGFsbG9jYShwb3dlcmJ1ZkxlbiArIE1PRF9FWFBfQ1RJTUVfTUlOX0NBQ0hFX0xJTkVfV0lEVEgpOworICBlbHNlCisjZW5kaWYKKyAgICAgIGlmICgocG93ZXJidWZGcmVlID0gKHVuc2lnbmVkIGNoYXIgKilPUEVOU1NMX21hbGxvYygKKyAgICAgICAgICAgICAgIHBvd2VyYnVmTGVuICsgTU9EX0VYUF9DVElNRV9NSU5fQ0FDSEVfTElORV9XSURUSCkpID09IE5VTEwpCisgICAgZ290byBlcnI7CisKKyAgcG93ZXJidWYgPSBNT0RfRVhQX0NUSU1FX0FMSUdOKHBvd2VyYnVmRnJlZSk7CisgIG1lbXNldChwb3dlcmJ1ZiwgMCwgcG93ZXJidWZMZW4pOworCisjaWZkZWYgYWxsb2NhCisgIGlmIChwb3dlcmJ1ZkxlbiA8IDMwNzIpCisgICAgcG93ZXJidWZGcmVlID0gTlVMTDsKKyNlbmRpZgorCisgIC8qIGxheSBkb3duIHRtcCBhbmQgYW0gcmlnaHQgYWZ0ZXIgcG93ZXJzIHRhYmxlICovCisgIHRtcC5kID0gKEJOX1VMT05HICopKHBvd2VyYnVmICsgc2l6ZW9mKG0tPmRbMF0pICogdG9wICogbnVtUG93ZXJzKTsKKyAgYW0uZCA9IHRtcC5kICsgdG9wOworICB0bXAudG9wID0gYW0udG9wID0gMDsKKyAgdG1wLmRtYXggPSBhbS5kbWF4ID0gdG9wOworICB0bXAubmVnID0gYW0ubmVnID0gMDsKKyAgdG1wLmZsYWdzID0gYW0uZmxhZ3MgPSBCTl9GTEdfU1RBVElDX0RBVEE7CisKKy8qIHByZXBhcmUgYV4wIGluIE1vbnRnb21lcnkgZG9tYWluICovCisvKiBieSBTaGF5IEd1ZXJvbidzIHN1Z2dlc3Rpb24gKi8KKyAgaWYgKG0tPmRbdG9wIC0gMV0gJiAoKChCTl9VTE9ORykxKSA8PCAoQk5fQklUUzIgLSAxKSkpIHsKKyAgICAvKiAyXih0b3AqQk5fQklUUzIpIC0gbSAqLworICAgIHRtcC5kWzBdID0gKDAgLSBtLT5kWzBdKSAmIEJOX01BU0syOworICAgIGZvciAoaSA9IDE7IGkgPCB0b3A7IGkrKykKKyAgICAgIHRtcC5kW2ldID0gKH5tLT5kW2ldKSAmIEJOX01BU0syOworICAgIHRtcC50b3AgPSB0b3A7CisgIH0gZWxzZSBpZiAoIUJOX3RvX21vbnRnb21lcnkoJnRtcCwgQk5fdmFsdWVfb25lKCksIG1vbnQsIGN0eCkpCisgICAgZ290byBlcnI7CisKKyAgLyogcHJlcGFyZSBhXjEgaW4gTW9udGdvbWVyeSBkb21haW4gKi8KKyAgaWYgKGEtPm5lZyB8fCBCTl91Y21wKGEsIG0pID49IDApIHsKKyAgICBpZiAoIUJOX21vZCgmYW0sIGEsIG0sIGN0eCkpCisgICAgICBnb3RvIGVycjsKKyAgICBpZiAoIUJOX3RvX21vbnRnb21lcnkoJmFtLCAmYW0sIG1vbnQsIGN0eCkpCisgICAgICBnb3RvIGVycjsKKyAgfSBlbHNlIGlmICghQk5fdG9fbW9udGdvbWVyeSgmYW0sIGEsIG1vbnQsIGN0eCkpCisgICAgZ290byBlcnI7CisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfQk5fQVNNX01PTlQ1KQorICAvKiBUaGlzIG9wdGltaXphdGlvbiB1c2VzIGlkZWFzIGZyb20gaHR0cDovL2VwcmludC5pYWNyLm9yZy8yMDExLzIzOSwKKyAgICogc3BlY2lmaWNhbGx5IG9wdGltaXphdGlvbiBvZiBjYWNoZS10aW1pbmcgYXR0YWNrIGNvdW50ZXJtZWFzdXJlcworICAgKiBhbmQgcHJlLWNvbXB1dGF0aW9uIG9wdGltaXphdGlvbi4gKi8KKworICAvKiBEZWRpY2F0ZWQgd2luZG93PT00IGNhc2UgaW1wcm92ZXMgNTEyLWJpdCBSU0Egc2lnbiBieSB+MTUlLCBidXQgYXMKKyAgICogNTEyLWJpdCBSU0EgaXMgaGFyZGx5IHJlbGV2YW50LCB3ZSBvbWl0IGl0IHRvIHNwYXJlIHNpemUuLi4gKi8KKyAgaWYgKHdpbmRvdyA9PSA1KSB7CisgICAgdm9pZCBibl9tdWxfbW9udF9nYXRoZXI1KEJOX1VMT05HICogcnAsIGNvbnN0IEJOX1VMT05HICogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKiB0YWJsZSwgY29uc3QgQk5fVUxPTkcgKiBucCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQk5fVUxPTkcgKiBuMCwgaW50IG51bSwgaW50IHBvd2VyKTsKKyAgICB2b2lkIGJuX3NjYXR0ZXI1KGNvbnN0IEJOX1VMT05HICogaW5wLCBzaXplX3QgbnVtLCB2b2lkICogdGFibGUsCisgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcG93ZXIpOworICAgIHZvaWQgYm5fZ2F0aGVyNShCTl9VTE9ORyAqIG91dCwgc2l6ZV90IG51bSwgdm9pZCAqIHRhYmxlLCBzaXplX3QgcG93ZXIpOworICAgIHZvaWQgYm5fcG93ZXI1KEJOX1VMT05HICogcnAsIGNvbnN0IEJOX1VMT05HICogYXAsIGNvbnN0IHZvaWQgKiB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBCTl9VTE9ORyAqIG5wLCBjb25zdCBCTl9VTE9ORyAqIG4wLCBpbnQgbnVtLAorICAgICAgICAgICAgICAgICAgIGludCBwb3dlcik7CisgICAgaW50IGJuX2dldF9iaXRzNShjb25zdCBCTl9VTE9ORyAqIGFwLCBpbnQgb2ZmKTsKKyAgICBpbnQgYm5fZnJvbV9tb250Z29tZXJ5KEJOX1VMT05HICogcnAsIGNvbnN0IEJOX1VMT05HICogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCTl9VTE9ORyAqIG5vdF91c2VkLCBjb25zdCBCTl9VTE9ORyAqIG5wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQk5fVUxPTkcgKiBuMCwgaW50IG51bSk7CisKKyAgICBCTl9VTE9ORyAqbnAgPSBtb250LT5OLmQsICpuMCA9IG1vbnQtPm4wLCAqbnAyOworCisgICAgLyogQk5fdG9fbW9udGdvbWVyeSBjYW4gY29udGFtaW5hdGUgd29yZHMgYWJvdmUgLnRvcAorICAgICAqIFtpbiBCTl9ERUJVR1tfREVCVUddIGJ1aWxkXS4uLiAqLworICAgIGZvciAoaSA9IGFtLnRvcDsgaSA8IHRvcDsgaSsrKQorICAgICAgYW0uZFtpXSA9IDA7CisgICAgZm9yIChpID0gdG1wLnRvcDsgaSA8IHRvcDsgaSsrKQorICAgICAgdG1wLmRbaV0gPSAwOworCisgICAgaWYgKHRvcCAmIDcpCisgICAgICBucDIgPSBucDsKKyAgICBlbHNlCisgICAgICBmb3IgKG5wMiA9IGFtLmQgKyB0b3AsIGkgPSAwOyBpIDwgdG9wOyBpKyspCisgICAgICAgIG5wMlsyICogaV0gPSBucFtpXTsKKworICAgIGJuX3NjYXR0ZXI1KHRtcC5kLCB0b3AsIHBvd2VyYnVmLCAwKTsKKyAgICBibl9zY2F0dGVyNShhbS5kLCBhbS50b3AsIHBvd2VyYnVmLCAxKTsKKyAgICBibl9tdWxfbW9udCh0bXAuZCwgYW0uZCwgYW0uZCwgbnAsIG4wLCB0b3ApOworICAgIGJuX3NjYXR0ZXI1KHRtcC5kLCB0b3AsIHBvd2VyYnVmLCAyKTsKKworICAgIC8qIHNhbWUgYXMgYWJvdmUsIGJ1dCB1c2VzIHNxdWFyaW5nIGZvciAxLzIgb2Ygb3BlcmF0aW9ucyAqLworICAgIGZvciAoaSA9IDQ7IGkgPCAzMjsgaSAqPSAyKSB7CisgICAgICBibl9tdWxfbW9udCh0bXAuZCwgdG1wLmQsIHRtcC5kLCBucCwgbjAsIHRvcCk7CisgICAgICBibl9zY2F0dGVyNSh0bXAuZCwgdG9wLCBwb3dlcmJ1ZiwgaSk7CisgICAgfQorICAgIGZvciAoaSA9IDM7IGkgPCA4OyBpICs9IDIpIHsKKyAgICAgIGludCBqOworICAgICAgYm5fbXVsX21vbnRfZ2F0aGVyNSh0bXAuZCwgYW0uZCwgcG93ZXJidWYsIG5wMiwgbjAsIHRvcCwgaSAtIDEpOworICAgICAgYm5fc2NhdHRlcjUodG1wLmQsIHRvcCwgcG93ZXJidWYsIGkpOworICAgICAgZm9yIChqID0gMiAqIGk7IGogPCAzMjsgaiAqPSAyKSB7CisgICAgICAgIGJuX211bF9tb250KHRtcC5kLCB0bXAuZCwgdG1wLmQsIG5wLCBuMCwgdG9wKTsKKyAgICAgICAgYm5fc2NhdHRlcjUodG1wLmQsIHRvcCwgcG93ZXJidWYsIGopOworICAgICAgfQorICAgIH0KKyAgICBmb3IgKDsgaSA8IDE2OyBpICs9IDIpIHsKKyAgICAgIGJuX211bF9tb250X2dhdGhlcjUodG1wLmQsIGFtLmQsIHBvd2VyYnVmLCBucDIsIG4wLCB0b3AsIGkgLSAxKTsKKyAgICAgIGJuX3NjYXR0ZXI1KHRtcC5kLCB0b3AsIHBvd2VyYnVmLCBpKTsKKyAgICAgIGJuX211bF9tb250KHRtcC5kLCB0bXAuZCwgdG1wLmQsIG5wLCBuMCwgdG9wKTsKKyAgICAgIGJuX3NjYXR0ZXI1KHRtcC5kLCB0b3AsIHBvd2VyYnVmLCAyICogaSk7CisgICAgfQorICAgIGZvciAoOyBpIDwgMzI7IGkgKz0gMikgeworICAgICAgYm5fbXVsX21vbnRfZ2F0aGVyNSh0bXAuZCwgYW0uZCwgcG93ZXJidWYsIG5wMiwgbjAsIHRvcCwgaSAtIDEpOworICAgICAgYm5fc2NhdHRlcjUodG1wLmQsIHRvcCwgcG93ZXJidWYsIGkpOworICAgIH0KKworICAgIGJpdHMtLTsKKyAgICBmb3IgKHd2YWx1ZSA9IDAsIGkgPSBiaXRzICUgNTsgaSA+PSAwOyBpLS0sIGJpdHMtLSkKKyAgICAgIHd2YWx1ZSA9ICh3dmFsdWUgPDwgMSkgKyBCTl9pc19iaXRfc2V0KHAsIGJpdHMpOworICAgIGJuX2dhdGhlcjUodG1wLmQsIHRvcCwgcG93ZXJidWYsIHd2YWx1ZSk7CisKKyAgICAvKiBTY2FuIHRoZSBleHBvbmVudCBvbmUgd2luZG93IGF0IGEgdGltZSBzdGFydGluZyBmcm9tIHRoZSBtb3N0CisgICAgICogc2lnbmlmaWNhbnQgYml0cy4KKyAgICAgKi8KKyAgICBpZiAodG9wICYgNykKKyAgICAgIHdoaWxlIChiaXRzID49IDApIHsKKyAgICAgICAgZm9yICh3dmFsdWUgPSAwLCBpID0gMDsgaSA8IDU7IGkrKywgYml0cy0tKQorICAgICAgICAgIHd2YWx1ZSA9ICh3dmFsdWUgPDwgMSkgKyBCTl9pc19iaXRfc2V0KHAsIGJpdHMpOworCisgICAgICAgIGJuX211bF9tb250KHRtcC5kLCB0bXAuZCwgdG1wLmQsIG5wLCBuMCwgdG9wKTsKKyAgICAgICAgYm5fbXVsX21vbnQodG1wLmQsIHRtcC5kLCB0bXAuZCwgbnAsIG4wLCB0b3ApOworICAgICAgICBibl9tdWxfbW9udCh0bXAuZCwgdG1wLmQsIHRtcC5kLCBucCwgbjAsIHRvcCk7CisgICAgICAgIGJuX211bF9tb250KHRtcC5kLCB0bXAuZCwgdG1wLmQsIG5wLCBuMCwgdG9wKTsKKyAgICAgICAgYm5fbXVsX21vbnQodG1wLmQsIHRtcC5kLCB0bXAuZCwgbnAsIG4wLCB0b3ApOworICAgICAgICBibl9tdWxfbW9udF9nYXRoZXI1KHRtcC5kLCB0bXAuZCwgcG93ZXJidWYsIG5wLCBuMCwgdG9wLCB3dmFsdWUpOworICAgICAgfQorICAgIGVsc2UgeworICAgICAgd2hpbGUgKGJpdHMgPj0gMCkgeworICAgICAgICB3dmFsdWUgPSBibl9nZXRfYml0czUocC0+ZCwgYml0cyAtIDQpOworICAgICAgICBiaXRzIC09IDU7CisgICAgICAgIGJuX3Bvd2VyNSh0bXAuZCwgdG1wLmQsIHBvd2VyYnVmLCBucDIsIG4wLCB0b3AsIHd2YWx1ZSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0ID0gYm5fZnJvbV9tb250Z29tZXJ5KHRtcC5kLCB0bXAuZCwgTlVMTCwgbnAyLCBuMCwgdG9wKTsKKyAgICB0bXAudG9wID0gdG9wOworICAgIGJuX2NvcnJlY3RfdG9wKCZ0bXApOworICAgIGlmIChyZXQpIHsKKyAgICAgIGlmICghQk5fY29weShyciwgJnRtcCkpCisgICAgICAgIHJldCA9IDA7CisgICAgICBnb3RvIGVycjsgLyogbm9uLXplcm8gcmV0IG1lYW5zIGl0J3Mgbm90IGVycm9yICovCisgICAgfQorICB9IGVsc2UKKyNlbmRpZgorICB7CisgICAgaWYgKCFjb3B5X3RvX3ByZWJ1ZigmdG1wLCB0b3AsIHBvd2VyYnVmLCAwLCBudW1Qb3dlcnMpKQorICAgICAgZ290byBlcnI7CisgICAgaWYgKCFjb3B5X3RvX3ByZWJ1ZigmYW0sIHRvcCwgcG93ZXJidWYsIDEsIG51bVBvd2VycykpCisgICAgICBnb3RvIGVycjsKKworICAgIC8qIElmIHRoZSB3aW5kb3cgc2l6ZSBpcyBncmVhdGVyIHRoYW4gMSwgdGhlbiBjYWxjdWxhdGUKKyAgICAgKiB2YWxbaT0yLi4yXndpbnNpemUtMV0uIFBvd2VycyBhcmUgY29tcHV0ZWQgYXMgYSphXihpLTEpCisgICAgICogKGV2ZW4gcG93ZXJzIGNvdWxkIGluc3RlYWQgYmUgY29tcHV0ZWQgYXMgKGFeKGkvMikpXjIKKyAgICAgKiB0byB1c2UgdGhlIHNsaWdodCBwZXJmb3JtYW5jZSBhZHZhbnRhZ2Ugb2Ygc3FyIG92ZXIgbXVsKS4KKyAgICAgKi8KKyAgICBpZiAod2luZG93ID4gMSkgeworICAgICAgaWYgKCFCTl9tb2RfbXVsX21vbnRnb21lcnkoJnRtcCwgJmFtLCAmYW0sIG1vbnQsIGN0eCkpCisgICAgICAgIGdvdG8gZXJyOworICAgICAgaWYgKCFjb3B5X3RvX3ByZWJ1ZigmdG1wLCB0b3AsIHBvd2VyYnVmLCAyLCBudW1Qb3dlcnMpKQorICAgICAgICBnb3RvIGVycjsKKyAgICAgIGZvciAoaSA9IDM7IGkgPCBudW1Qb3dlcnM7IGkrKykgeworICAgICAgICAvKiBDYWxjdWxhdGUgYV5pID0gYV4oaS0xKSAqIGEgKi8KKyAgICAgICAgaWYgKCFCTl9tb2RfbXVsX21vbnRnb21lcnkoJnRtcCwgJmFtLCAmdG1wLCBtb250LCBjdHgpKQorICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICBpZiAoIWNvcHlfdG9fcHJlYnVmKCZ0bXAsIHRvcCwgcG93ZXJidWYsIGksIG51bVBvd2VycykpCisgICAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgfQorCisgICAgYml0cy0tOworICAgIGZvciAod3ZhbHVlID0gMCwgaSA9IGJpdHMgJSB3aW5kb3c7IGkgPj0gMDsgaS0tLCBiaXRzLS0pCisgICAgICB3dmFsdWUgPSAod3ZhbHVlIDw8IDEpICsgQk5faXNfYml0X3NldChwLCBiaXRzKTsKKyAgICBpZiAoIWNvcHlfZnJvbV9wcmVidWYoJnRtcCwgdG9wLCBwb3dlcmJ1Ziwgd3ZhbHVlLCBudW1Qb3dlcnMpKQorICAgICAgZ290byBlcnI7CisKKyAgICAvKiBTY2FuIHRoZSBleHBvbmVudCBvbmUgd2luZG93IGF0IGEgdGltZSBzdGFydGluZyBmcm9tIHRoZSBtb3N0CisgICAgICogc2lnbmlmaWNhbnQgYml0cy4KKyAgICAgKi8KKyAgICB3aGlsZSAoYml0cyA+PSAwKSB7CisgICAgICB3dmFsdWUgPSAwOyAvKiBUaGUgJ3ZhbHVlJyBvZiB0aGUgd2luZG93ICovCisKKyAgICAgIC8qIFNjYW4gdGhlIHdpbmRvdywgc3F1YXJpbmcgdGhlIHJlc3VsdCBhcyB3ZSBnbyAqLworICAgICAgZm9yIChpID0gMDsgaSA8IHdpbmRvdzsgaSsrLCBiaXRzLS0pIHsKKyAgICAgICAgaWYgKCFCTl9tb2RfbXVsX21vbnRnb21lcnkoJnRtcCwgJnRtcCwgJnRtcCwgbW9udCwgY3R4KSkKKyAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgd3ZhbHVlID0gKHd2YWx1ZSA8PCAxKSArIEJOX2lzX2JpdF9zZXQocCwgYml0cyk7CisgICAgICB9CisKKyAgICAgIC8qIEZldGNoIHRoZSBhcHByb3ByaWF0ZSBwcmUtY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGUgcHJlLWJ1ZiAqLworICAgICAgaWYgKCFjb3B5X2Zyb21fcHJlYnVmKCZhbSwgdG9wLCBwb3dlcmJ1Ziwgd3ZhbHVlLCBudW1Qb3dlcnMpKQorICAgICAgICBnb3RvIGVycjsKKworICAgICAgLyogTXVsdGlwbHkgdGhlIHJlc3VsdCBpbnRvIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0ICovCisgICAgICBpZiAoIUJOX21vZF9tdWxfbW9udGdvbWVyeSgmdG1wLCAmdG1wLCAmYW0sIG1vbnQsIGN0eCkpCisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfQorCisgIC8qIENvbnZlcnQgdGhlIGZpbmFsIHJlc3VsdCBmcm9tIG1vbnRnb21lcnkgdG8gc3RhbmRhcmQgZm9ybWF0ICovCisgIGlmICghQk5fZnJvbV9tb250Z29tZXJ5KHJyLCAmdG1wLCBtb250LCBjdHgpKQorICAgIGdvdG8gZXJyOworICByZXQgPSAxOworZXJyOgorICBpZiAoKGluX21vbnQgPT0gTlVMTCkgJiYgKG1vbnQgIT0gTlVMTCkpCisgICAgQk5fTU9OVF9DVFhfZnJlZShtb250KTsKKyAgaWYgKHBvd2VyYnVmICE9IE5VTEwpIHsKKyAgICBPUEVOU1NMX2NsZWFuc2UocG93ZXJidWYsIHBvd2VyYnVmTGVuKTsKKyAgICBpZiAocG93ZXJidWZGcmVlKQorICAgICAgT1BFTlNTTF9mcmVlKHBvd2VyYnVmRnJlZSk7CisgIH0KKyAgQk5fQ1RYX2VuZChjdHgpOworICByZXR1cm4gKHJldCk7Cit9CisKK2ludCBCTl9tb2RfZXhwX21vbnRfd29yZChCSUdOVU0gKnJyLCBCTl9VTE9ORyBhLCBjb25zdCBCSUdOVU0gKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQklHTlVNICptLCBCTl9DVFggKmN0eCwgQk5fTU9OVF9DVFggKmluX21vbnQpIHsKKyAgQk5fTU9OVF9DVFggKm1vbnQgPSBOVUxMOworICBpbnQgYiwgYml0cywgcmV0ID0gMDsKKyAgaW50IHJfaXNfb25lOworICBCTl9VTE9ORyB3LCBuZXh0X3c7CisgIEJJR05VTSAqZCwgKnIsICp0OworICBCSUdOVU0gKnN3YXBfdG1wOworI2RlZmluZSBCTl9NT0RfTVVMX1dPUkQociwgdywgbSkgICBcCisgIChCTl9tdWxfd29yZChyLCAodykpICYmICAgICAgICAgIFwKKyAgICgvKiBCTl91Y21wKHIsIChtKSkgPCAwID8gMSA6Ki8gXAorICAgIChCTl9tb2QodCwgciwgbSwgY3R4KSAmJiAoc3dhcF90bXAgPSByLCByID0gdCwgdCA9IHN3YXBfdG1wLCAxKSkpKQorICAvKiBCTl9NT0RfTVVMX1dPUkQgaXMgb25seSB1c2VkIHdpdGggJ3cnIGxhcmdlLCBzbyB0aGUgQk5fdWNtcCB0ZXN0IGlzCisgICAqIHByb2JhYmx5IG1vcmUgb3ZlcmhlYWQgdGhhbiBhbHdheXMgdXNpbmcgQk5fbW9kICh3aGljaCB1c2VzIEJOX2NvcHkgaWYgYQorICAgKiBzaW1pbGFyIHRlc3QgcmV0dXJucyB0cnVlKS4gV2UgY2FuIHVzZSBCTl9tb2QgYW5kIGRvIG5vdCBuZWVkIEJOX25ubW9kCisgICAqIGJlY2F1c2Ugb3VyIGFjY3VtdWxhdG9yIGlzIG5ldmVyIG5lZ2F0aXZlICh0aGUgcmVzdWx0IG9mIEJOX21vZCBkb2VzIG5vdAorICAgKiBkZXBlbmQgb24gdGhlIHNpZ24gb2YgdGhlIG1vZHVsdXMpLiAqLworI2RlZmluZSBCTl9UT19NT05UR09NRVJZX1dPUkQociwgdywgbW9udCkgXAorICAoQk5fc2V0X3dvcmQociwgKHcpKSAmJiBCTl90b19tb250Z29tZXJ5KHIsIHIsIChtb250KSwgY3R4KSkKKworICBpZiAoQk5fZ2V0X2ZsYWdzKHAsIEJOX0ZMR19DT05TVFRJTUUpICE9IDApIHsKKyAgICAvKiBCTl9GTEdfQ09OU1RUSU1FIG9ubHkgc3VwcG9ydGVkIGJ5IEJOX21vZF9leHBfbW9udCgpICovCisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX21vZF9leHBfbW9udF93b3JkLAorICAgICAgICBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKCFCTl9pc19vZGQobSkpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fbW9kX2V4cF9tb250X3dvcmQsIEJOX1JfQ0FMTEVEX1dJVEhfRVZFTl9NT0RVTFVTKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChtLT50b3AgPT0gMSkgeworICAgIGEgJT0gbS0+ZFswXTsgLyogbWFrZSBzdXJlIHRoYXQgJ2EnIGlzIHJlZHVjZWQgKi8KKyAgfQorCisgIGJpdHMgPSBCTl9udW1fYml0cyhwKTsKKyAgaWYgKGJpdHMgPT0gMCkgeworICAgIHJldCA9IEJOX29uZShycik7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICBpZiAoYSA9PSAwKSB7CisgICAgQk5femVybyhycik7CisgICAgcmV0ID0gMTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgQk5fQ1RYX3N0YXJ0KGN0eCk7CisgIGQgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIHIgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIHQgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIGlmIChkID09IE5VTEwgfHwgciA9PSBOVUxMIHx8IHQgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKGluX21vbnQgIT0gTlVMTCkKKyAgICBtb250ID0gaW5fbW9udDsKKyAgZWxzZSB7CisgICAgaWYgKChtb250ID0gQk5fTU9OVF9DVFhfbmV3KCkpID09IE5VTEwpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBpZiAoIUJOX01PTlRfQ1RYX3NldChtb250LCBtLCBjdHgpKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0KKworICByX2lzX29uZSA9IDE7IC8qIGV4Y2VwdCBmb3IgTW9udGdvbWVyeSBmYWN0b3IgKi8KKworICAvKiBiaXRzLTEgPj0gMCAqLworCisgIC8qIFRoZSByZXN1bHQgaXMgYWNjdW11bGF0ZWQgaW4gdGhlIHByb2R1Y3Qgcip3LiAqLworICB3ID0gYTsgLyogYml0ICdiaXRzLTEnIG9mICdwJyBpcyBhbHdheXMgc2V0ICovCisgIGZvciAoYiA9IGJpdHMgLSAyOyBiID49IDA7IGItLSkgeworICAgIC8qIEZpcnN0LCBzcXVhcmUgcip3LiAqLworICAgIG5leHRfdyA9IHcgKiB3OworICAgIGlmICgobmV4dF93IC8gdykgIT0gdykgeworICAgICAgLyogb3ZlcmZsb3cgKi8KKyAgICAgIGlmIChyX2lzX29uZSkgeworICAgICAgICBpZiAoIUJOX1RPX01PTlRHT01FUllfV09SRChyLCB3LCBtb250KSkgeworICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICB9CisgICAgICAgIHJfaXNfb25lID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghQk5fTU9EX01VTF9XT1JEKHIsIHcsIG0pKSB7CisgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIG5leHRfdyA9IDE7CisgICAgfQorCisgICAgdyA9IG5leHRfdzsKKyAgICBpZiAoIXJfaXNfb25lKSB7CisgICAgICBpZiAoIUJOX21vZF9tdWxfbW9udGdvbWVyeShyLCByLCByLCBtb250LCBjdHgpKSB7CisgICAgICAgIGdvdG8gZXJyOworICAgICAgfQorICAgIH0KKworICAgIC8qIFNlY29uZCwgbXVsdGlwbHkgcip3IGJ5ICdhJyBpZiBleHBvbmVudCBiaXQgaXMgc2V0LiAqLworICAgIGlmIChCTl9pc19iaXRfc2V0KHAsIGIpKSB7CisgICAgICBuZXh0X3cgPSB3ICogYTsKKyAgICAgIGlmICgobmV4dF93IC8gYSkgIT0gdykgeworICAgICAgICAvKiBvdmVyZmxvdyAqLworICAgICAgICBpZiAocl9pc19vbmUpIHsKKyAgICAgICAgICBpZiAoIUJOX1RPX01PTlRHT01FUllfV09SRChyLCB3LCBtb250KSkgeworICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgfQorICAgICAgICAgIHJfaXNfb25lID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoIUJOX01PRF9NVUxfV09SRChyLCB3LCBtKSkgeworICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG5leHRfdyA9IGE7CisgICAgICB9CisgICAgICB3ID0gbmV4dF93OworICAgIH0KKyAgfQorCisgIC8qIEZpbmFsbHksIHNldCByOj1yKncuICovCisgIGlmICh3ICE9IDEpIHsKKyAgICBpZiAocl9pc19vbmUpIHsKKyAgICAgIGlmICghQk5fVE9fTU9OVEdPTUVSWV9XT1JEKHIsIHcsIG1vbnQpKSB7CisgICAgICAgIGdvdG8gZXJyOworICAgICAgfQorICAgICAgcl9pc19vbmUgPSAwOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoIUJOX01PRF9NVUxfV09SRChyLCB3LCBtKSkgeworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAocl9pc19vbmUpIHsKKyAgICAvKiBjYW4gaGFwcGVuIG9ubHkgaWYgYSA9PSAxKi8KKyAgICBpZiAoIUJOX29uZShycikpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoIUJOX2Zyb21fbW9udGdvbWVyeShyciwgciwgbW9udCwgY3R4KSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICB9CisgIHJldCA9IDE7CisKK2VycjoKKyAgaWYgKGluX21vbnQgPT0gTlVMTCAmJiBtb250ICE9IE5VTEwpIHsKKyAgICBCTl9NT05UX0NUWF9mcmVlKG1vbnQpOworICB9CisgIEJOX0NUWF9lbmQoY3R4KTsKKyAgcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBUQUJMRV9TSVpFIDMyCisKK2ludCBCTl9tb2RfZXhwMl9tb250KEJJR05VTSAqcnIsIGNvbnN0IEJJR05VTSAqYTEsIGNvbnN0IEJJR05VTSAqcDEsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBCSUdOVU0gKmEyLCBjb25zdCBCSUdOVU0gKnAyLCBjb25zdCBCSUdOVU0gKm0sCisgICAgICAgICAgICAgICAgICAgICBCTl9DVFggKmN0eCwgQk5fTU9OVF9DVFggKmluX21vbnQpIHsKKyAgaW50IGksIGosIGJpdHMsIGIsIGJpdHMxLCBiaXRzMiwgcmV0ID0gMCwgd3BvczEsIHdwb3MyLCB3aW5kb3cxLCB3aW5kb3cyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3dmFsdWUxLCB3dmFsdWUyOworICBpbnQgcl9pc19vbmUgPSAxOworICBCSUdOVU0gKmQsICpyOworICBjb25zdCBCSUdOVU0gKmFfbW9kX207CisgIC8qIFRhYmxlcyBvZiB2YXJpYWJsZXMgb2J0YWluZWQgZnJvbSAnY3R4JyAqLworICBCSUdOVU0gKnZhbDFbVEFCTEVfU0laRV0sICp2YWwyW1RBQkxFX1NJWkVdOworICBCTl9NT05UX0NUWCAqbW9udCA9IE5VTEw7CisKKyAgaWYgKCEobS0+ZFswXSAmIDEpKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX21vZF9leHAyX21vbnQsIEJOX1JfQ0FMTEVEX1dJVEhfRVZFTl9NT0RVTFVTKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBiaXRzMSA9IEJOX251bV9iaXRzKHAxKTsKKyAgYml0czIgPSBCTl9udW1fYml0cyhwMik7CisgIGlmIChiaXRzMSA9PSAwICYmIGJpdHMyID09IDApIHsKKyAgICByZXQgPSBCTl9vbmUocnIpOworICAgIHJldHVybiByZXQ7CisgIH0KKworICBiaXRzID0gKGJpdHMxID4gYml0czIpID8gYml0czEgOiBiaXRzMjsKKworICBCTl9DVFhfc3RhcnQoY3R4KTsKKyAgZCA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgciA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgdmFsMVswXSA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgdmFsMlswXSA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgaWYgKCFkIHx8ICFyIHx8ICF2YWwxWzBdIHx8ICF2YWwyWzBdKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAoaW5fbW9udCAhPSBOVUxMKSB7CisgICAgbW9udCA9IGluX21vbnQ7CisgIH0gZWxzZSB7CisgICAgbW9udCA9IEJOX01PTlRfQ1RYX25ldygpOworICAgIGlmIChtb250ID09IE5VTEwpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBpZiAoIUJOX01PTlRfQ1RYX3NldChtb250LCBtLCBjdHgpKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0KKworICB3aW5kb3cxID0gQk5fd2luZG93X2JpdHNfZm9yX2V4cG9uZW50X3NpemUoYml0czEpOworICB3aW5kb3cyID0gQk5fd2luZG93X2JpdHNfZm9yX2V4cG9uZW50X3NpemUoYml0czIpOworCisgIC8qIEJ1aWxkIHRhYmxlIGZvciBhMTogICB2YWwxW2ldIDo9IGExXigyKmkgKyAxKSBtb2QgbSAgZm9yIGkgPSAwIC4uCisgICAqIDJeKHdpbmRvdzEtMSkgKi8KKyAgaWYgKGExLT5uZWcgfHwgQk5fdWNtcChhMSwgbSkgPj0gMCkgeworICAgIGlmICghQk5fbW9kKHZhbDFbMF0sIGExLCBtLCBjdHgpKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgYV9tb2RfbSA9IHZhbDFbMF07CisgIH0gZWxzZSB7CisgICAgYV9tb2RfbSA9IGExOworICB9CisKKyAgaWYgKEJOX2lzX3plcm8oYV9tb2RfbSkpIHsKKyAgICBCTl96ZXJvKHJyKTsKKyAgICByZXQgPSAxOworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKCFCTl90b19tb250Z29tZXJ5KHZhbDFbMF0sIGFfbW9kX20sIG1vbnQsIGN0eCkpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmICh3aW5kb3cxID4gMSkgeworICAgIGlmICghQk5fbW9kX211bF9tb250Z29tZXJ5KGQsIHZhbDFbMF0sIHZhbDFbMF0sIG1vbnQsIGN0eCkpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGogPSAxIDw8ICh3aW5kb3cxIC0gMSk7CisgICAgZm9yIChpID0gMTsgaSA8IGo7IGkrKykgeworICAgICAgaWYgKCgodmFsMVtpXSA9IEJOX0NUWF9nZXQoY3R4KSkgPT0gTlVMTCkgfHwKKyAgICAgICAgICAhQk5fbW9kX211bF9tb250Z29tZXJ5KHZhbDFbaV0sIHZhbDFbaSAtIDFdLCBkLCBtb250LCBjdHgpKSB7CisgICAgICAgIGdvdG8gZXJyOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIEJ1aWxkIHRhYmxlIGZvciBhMjogICB2YWwyW2ldIDo9IGEyXigyKmkgKyAxKSBtb2QgbSAgZm9yIGkgPSAwIC4uCisgICAqIDJeKHdpbmRvdzItMSkgKi8KKyAgaWYgKGEyLT5uZWcgfHwgQk5fdWNtcChhMiwgbSkgPj0gMCkgeworICAgIGlmICghQk5fbW9kKHZhbDJbMF0sIGEyLCBtLCBjdHgpKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgYV9tb2RfbSA9IHZhbDJbMF07CisgIH0gZWxzZSB7CisgICAgYV9tb2RfbSA9IGEyOworICB9CisKKyAgaWYgKEJOX2lzX3plcm8oYV9tb2RfbSkpIHsKKyAgICBCTl96ZXJvKHJyKTsKKyAgICByZXQgPSAxOworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKCFCTl90b19tb250Z29tZXJ5KHZhbDJbMF0sIGFfbW9kX20sIG1vbnQsIGN0eCkpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmICh3aW5kb3cyID4gMSkgeworICAgIGlmICghQk5fbW9kX211bF9tb250Z29tZXJ5KGQsIHZhbDJbMF0sIHZhbDJbMF0sIG1vbnQsIGN0eCkpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGogPSAxIDw8ICh3aW5kb3cyIC0gMSk7CisgICAgZm9yIChpID0gMTsgaSA8IGo7IGkrKykgeworICAgICAgaWYgKCgodmFsMltpXSA9IEJOX0NUWF9nZXQoY3R4KSkgPT0gTlVMTCkgfHwKKyAgICAgICAgICAhQk5fbW9kX211bF9tb250Z29tZXJ5KHZhbDJbaV0sIHZhbDJbaSAtIDFdLCBkLCBtb250LCBjdHgpKSB7CisgICAgICAgIGdvdG8gZXJyOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIE5vdyBjb21wdXRlIHRoZSBwb3dlciBwcm9kdWN0LCB1c2luZyBpbmRlcGVuZGVudCB3aW5kb3dzLiAqLworICByX2lzX29uZSA9IDE7CisgIHd2YWx1ZTEgPSAwOyAvKiBUaGUgJ3ZhbHVlJyBvZiB0aGUgZmlyc3Qgd2luZG93ICovCisgIHd2YWx1ZTIgPSAwOyAvKiBUaGUgJ3ZhbHVlJyBvZiB0aGUgc2Vjb25kIHdpbmRvdyAqLworICB3cG9zMSA9IDA7ICAgLyogSWYgd3ZhbHVlMSA+IDAsIHRoZSBib3R0b20gYml0IG9mIHRoZSBmaXJzdCB3aW5kb3cgKi8KKyAgd3BvczIgPSAwOyAgIC8qIElmIHd2YWx1ZTIgPiAwLCB0aGUgYm90dG9tIGJpdCBvZiB0aGUgc2Vjb25kIHdpbmRvdyAqLworCisgIGlmICghQk5fdG9fbW9udGdvbWVyeShyLCBCTl92YWx1ZV9vbmUoKSwgbW9udCwgY3R4KSkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgZm9yIChiID0gYml0cyAtIDE7IGIgPj0gMDsgYi0tKSB7CisgICAgaWYgKCFyX2lzX29uZSkgeworICAgICAgaWYgKCFCTl9tb2RfbXVsX21vbnRnb21lcnkociwgciwgciwgbW9udCwgY3R4KSkgeworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXd2YWx1ZTEgJiYgQk5faXNfYml0X3NldChwMSwgYikpIHsKKyAgICAgIC8qIGNvbnNpZGVyIGJpdHMgYi13aW5kb3cxKzEgLi4gYiBmb3IgdGhpcyB3aW5kb3cgKi8KKyAgICAgIGkgPSBiIC0gd2luZG93MSArIDE7CisgICAgICB3aGlsZSAoIUJOX2lzX2JpdF9zZXQocDEsIGkpKSAvKiB3b3JrcyBmb3IgaTwwICovCisgICAgICAgIGkrKzsKKyAgICAgIHdwb3MxID0gaTsKKyAgICAgIHd2YWx1ZTEgPSAxOworICAgICAgZm9yIChpID0gYiAtIDE7IGkgPj0gd3BvczE7IGktLSkgeworICAgICAgICB3dmFsdWUxIDw8PSAxOworICAgICAgICBpZiAoQk5faXNfYml0X3NldChwMSwgaSkpCisgICAgICAgICAgd3ZhbHVlMSsrOworICAgICAgfQorICAgIH0KKworICAgIGlmICghd3ZhbHVlMiAmJiBCTl9pc19iaXRfc2V0KHAyLCBiKSkgeworICAgICAgLyogY29uc2lkZXIgYml0cyBiLXdpbmRvdzIrMSAuLiBiIGZvciB0aGlzIHdpbmRvdyAqLworICAgICAgaSA9IGIgLSB3aW5kb3cyICsgMTsKKyAgICAgIHdoaWxlICghQk5faXNfYml0X3NldChwMiwgaSkpCisgICAgICAgIGkrKzsKKyAgICAgIHdwb3MyID0gaTsKKyAgICAgIHd2YWx1ZTIgPSAxOworICAgICAgZm9yIChpID0gYiAtIDE7IGkgPj0gd3BvczI7IGktLSkgeworICAgICAgICB3dmFsdWUyIDw8PSAxOworICAgICAgICBpZiAoQk5faXNfYml0X3NldChwMiwgaSkpCisgICAgICAgICAgd3ZhbHVlMisrOworICAgICAgfQorICAgIH0KKworICAgIGlmICh3dmFsdWUxICYmIGIgPT0gd3BvczEpIHsKKyAgICAgIC8qIHd2YWx1ZTEgaXMgb2RkIGFuZCA8IDJed2luZG93MSAqLworICAgICAgaWYgKCFCTl9tb2RfbXVsX21vbnRnb21lcnkociwgciwgdmFsMVt3dmFsdWUxID4+IDFdLCBtb250LCBjdHgpKSB7CisgICAgICAgIGdvdG8gZXJyOworICAgICAgfQorICAgICAgd3ZhbHVlMSA9IDA7CisgICAgICByX2lzX29uZSA9IDA7CisgICAgfQorCisgICAgaWYgKHd2YWx1ZTIgJiYgYiA9PSB3cG9zMikgeworICAgICAgLyogd3ZhbHVlMiBpcyBvZGQgYW5kIDwgMl53aW5kb3cyICovCisgICAgICBpZiAoIUJOX21vZF9tdWxfbW9udGdvbWVyeShyLCByLCB2YWwyW3d2YWx1ZTIgPj4gMV0sIG1vbnQsIGN0eCkpIHsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgICB3dmFsdWUyID0gMDsKKyAgICAgIHJfaXNfb25lID0gMDsKKyAgICB9CisgIH0KKworICBpZiAoIUJOX2Zyb21fbW9udGdvbWVyeShyciwgciwgbW9udCwgY3R4KSkgeworICAgIGdvdG8gZXJyOworICB9CisgIHJldCA9IDE7CisKK2VycjoKKyAgaWYgKGluX21vbnQgPT0gTlVMTCAmJiBtb250ICE9IE5VTEwpIHsKKyAgICBCTl9NT05UX0NUWF9mcmVlKG1vbnQpOworICB9CisgIEJOX0NUWF9lbmQoY3R4KTsKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2NyeXB0by9ibi9nY2QuYyBiL2NyeXB0by9ibi9nY2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGNlMjk2Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2JuL2djZC5jCkBAIC0wLDAgKzEsNzA0IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDEgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKworI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyBCSUdOVU0gKmV1Y2xpZChCSUdOVU0gKmEsIEJJR05VTSAqYikgeworICBCSUdOVU0gKnQ7CisgIGludCBzaGlmdHMgPSAwOworCisgIC8qIDAgPD0gYiA8PSBhICovCisgIHdoaWxlICghQk5faXNfemVybyhiKSkgeworICAgIC8qIDAgPCBiIDw9IGEgKi8KKworICAgIGlmIChCTl9pc19vZGQoYSkpIHsKKyAgICAgIGlmIChCTl9pc19vZGQoYikpIHsKKyAgICAgICAgaWYgKCFCTl9zdWIoYSwgYSwgYikpIHsKKyAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUJOX3JzaGlmdDEoYSwgYSkpIHsKKyAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgICAgICBpZiAoQk5fY21wKGEsIGIpIDwgMCkgeworICAgICAgICAgIHQgPSBhOworICAgICAgICAgIGEgPSBiOworICAgICAgICAgIGIgPSB0OworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBhIG9kZCAtIGIgZXZlbiAqLworICAgICAgICBpZiAoIUJOX3JzaGlmdDEoYiwgYikpIHsKKyAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgICAgICBpZiAoQk5fY21wKGEsIGIpIDwgMCkgeworICAgICAgICAgIHQgPSBhOworICAgICAgICAgIGEgPSBiOworICAgICAgICAgIGIgPSB0OworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGEgaXMgZXZlbiAqLworICAgICAgaWYgKEJOX2lzX29kZChiKSkgeworICAgICAgICBpZiAoIUJOX3JzaGlmdDEoYSwgYSkpIHsKKyAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgICAgICBpZiAoQk5fY21wKGEsIGIpIDwgMCkgeworICAgICAgICAgIHQgPSBhOworICAgICAgICAgIGEgPSBiOworICAgICAgICAgIGIgPSB0OworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBhIGV2ZW4gLSBiIGV2ZW4gKi8KKyAgICAgICAgaWYgKCFCTl9yc2hpZnQxKGEsIGEpKSB7CisgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFCTl9yc2hpZnQxKGIsIGIpKSB7CisgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKyAgICAgICAgc2hpZnRzKys7CisgICAgICB9CisgICAgfQorICAgIC8qIDAgPD0gYiA8PSBhICovCisgIH0KKworICBpZiAoc2hpZnRzKSB7CisgICAgaWYgKCFCTl9sc2hpZnQoYSwgYSwgc2hpZnRzKSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGE7CisKK2VycjoKKyAgcmV0dXJuIE5VTEw7Cit9CisKK2ludCBCTl9nY2QoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmluX2EsIGNvbnN0IEJJR05VTSAqaW5fYiwgQk5fQ1RYICpjdHgpIHsKKyAgQklHTlVNICphLCAqYiwgKnQ7CisgIGludCByZXQgPSAwOworCisgIEJOX0NUWF9zdGFydChjdHgpOworICBhID0gQk5fQ1RYX2dldChjdHgpOworICBiID0gQk5fQ1RYX2dldChjdHgpOworCisgIGlmIChhID09IE5VTEwgfHwgYiA9PSBOVUxMKSB7CisgICAgZ290byBlcnI7CisgIH0KKyAgaWYgKEJOX2NvcHkoYSwgaW5fYSkgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisgIGlmIChCTl9jb3B5KGIsIGluX2IpID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGEtPm5lZyA9IDA7CisgIGItPm5lZyA9IDA7CisKKyAgaWYgKEJOX2NtcChhLCBiKSA8IDApIHsKKyAgICB0ID0gYTsKKyAgICBhID0gYjsKKyAgICBiID0gdDsKKyAgfQorICB0ID0gZXVjbGlkKGEsIGIpOworICBpZiAodCA9PSBOVUxMKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAoQk5fY29weShyLCB0KSA9PSBOVUxMKSB7CisgICAgZ290byBlcnI7CisgIH0KKyAgcmV0ID0gMTsKKworZXJyOgorICBCTl9DVFhfZW5kKGN0eCk7CisgIHJldHVybiByZXQ7Cit9CisKKy8qIHNvbHZlcyBheCA9PSAxIChtb2QgbikgKi8KK3N0YXRpYyBCSUdOVU0gKkJOX21vZF9pbnZlcnNlX25vX2JyYW5jaChCSUdOVU0gKm91dCwgY29uc3QgQklHTlVNICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJJR05VTSAqbiwgQk5fQ1RYICpjdHgpOworCitCSUdOVU0gKkJOX21vZF9pbnZlcnNlKEJJR05VTSAqb3V0LCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqbiwKKyAgICAgICAgICAgICAgICAgICAgICAgQk5fQ1RYICpjdHgpIHsKKyAgQklHTlVNICpBLCAqQiwgKlgsICpZLCAqTSwgKkQsICpULCAqUiA9IE5VTEw7CisgIEJJR05VTSAqcmV0ID0gTlVMTDsKKyAgaW50IHNpZ247CisKKyAgaWYgKChhLT5mbGFncyAmIEJOX0ZMR19DT05TVFRJTUUpICE9IDAgfHwKKyAgICAgIChuLT5mbGFncyAmIEJOX0ZMR19DT05TVFRJTUUpICE9IDApIHsKKyAgICByZXR1cm4gQk5fbW9kX2ludmVyc2Vfbm9fYnJhbmNoKG91dCwgYSwgbiwgY3R4KTsKKyAgfQorCisgIEJOX0NUWF9zdGFydChjdHgpOworICBBID0gQk5fQ1RYX2dldChjdHgpOworICBCID0gQk5fQ1RYX2dldChjdHgpOworICBYID0gQk5fQ1RYX2dldChjdHgpOworICBEID0gQk5fQ1RYX2dldChjdHgpOworICBNID0gQk5fQ1RYX2dldChjdHgpOworICBZID0gQk5fQ1RYX2dldChjdHgpOworICBUID0gQk5fQ1RYX2dldChjdHgpOworICBpZiAoVCA9PSBOVUxMKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAob3V0ID09IE5VTEwpIHsKKyAgICBSID0gQk5fbmV3KCk7CisgIH0gZWxzZSB7CisgICAgUiA9IG91dDsKKyAgfQorICBpZiAoUiA9PSBOVUxMKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBCTl9vbmUoWCk7CisgIEJOX3plcm8oWSk7CisgIGlmIChCTl9jb3B5KEIsIGEpID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorICBpZiAoQk5fY29weShBLCBuKSA9PSBOVUxMKSB7CisgICAgZ290byBlcnI7CisgIH0KKyAgQS0+bmVnID0gMDsKKyAgaWYgKEItPm5lZyB8fCAoQk5fdWNtcChCLCBBKSA+PSAwKSkgeworICAgIGlmICghQk5fbm5tb2QoQiwgQiwgQSwgY3R4KSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICB9CisgIHNpZ24gPSAtMTsKKyAgLyogRnJvbSAgQiA9IGEgbW9kIHxufCwgIEEgPSB8bnwgIGl0IGZvbGxvd3MgdGhhdAorICAgKgorICAgKiAgICAgIDAgPD0gQiA8IEEsCisgICAqICAgICAtc2lnbipYKmEgID09ICBCICAgKG1vZCB8bnwpLAorICAgKiAgICAgIHNpZ24qWSphICA9PSAgQSAgIChtb2QgfG58KS4KKyAgICovCisKKyAgaWYgKEJOX2lzX29kZChuKSAmJiAoQk5fbnVtX2JpdHMobikgPD0gKEJOX0JJVFMgPD0gMzIgPyA0NTAgOiAyMDQ4KSkpIHsKKyAgICAvKiBCaW5hcnkgaW52ZXJzaW9uIGFsZ29yaXRobTsgcmVxdWlyZXMgb2RkIG1vZHVsdXMuCisgICAgICogVGhpcyBpcyBmYXN0ZXIgdGhhbiB0aGUgZ2VuZXJhbCBhbGdvcml0aG0gaWYgdGhlIG1vZHVsdXMKKyAgICAgKiBpcyBzdWZmaWNpZW50bHkgc21hbGwgKGFib3V0IDQwMCAuLiA1MDAgYml0cyBvbiAzMi1iaXQKKyAgICAgKiBzeXRlbXMsIGJ1dCBtdWNoIG1vcmUgb24gNjQtYml0IHN5c3RlbXMpICovCisgICAgaW50IHNoaWZ0OworCisgICAgd2hpbGUgKCFCTl9pc196ZXJvKEIpKSB7CisgICAgICAvKiAgICAgIDAgPCBCIDwgfG58LAorICAgICAgICogICAgICAwIDwgQSA8PSB8bnwsCisgICAgICAgKiAoMSkgLXNpZ24qWCphICA9PSAgQiAgIChtb2QgfG58KSwKKyAgICAgICAqICgyKSAgc2lnbipZKmEgID09ICBBICAgKG1vZCB8bnwpICovCisKKyAgICAgIC8qIE5vdyBkaXZpZGUgIEIgIGJ5IHRoZSBtYXhpbXVtIHBvc3NpYmxlIHBvd2VyIG9mIHR3byBpbiB0aGUgaW50ZWdlcnMsCisgICAgICAgKiBhbmQgZGl2aWRlICBYICBieSB0aGUgc2FtZSB2YWx1ZSBtb2QgfG58LgorICAgICAgICogV2hlbiB3ZSdyZSBkb25lLCAoMSkgc3RpbGwgaG9sZHMuICovCisgICAgICBzaGlmdCA9IDA7CisgICAgICB3aGlsZSAoIUJOX2lzX2JpdF9zZXQoQiwgc2hpZnQpKSB7CisgICAgICAgIC8qIG5vdGUgdGhhdCAwIDwgQiAqLworICAgICAgICBzaGlmdCsrOworCisgICAgICAgIGlmIChCTl9pc19vZGQoWCkpIHsKKyAgICAgICAgICBpZiAoIUJOX3VhZGQoWCwgWCwgbikpIHsKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBub3cgWCBpcyBldmVuLCBzbyB3ZSBjYW4gZWFzaWx5IGRpdmlkZSBpdCBieSB0d28gKi8KKyAgICAgICAgaWYgKCFCTl9yc2hpZnQxKFgsIFgpKSB7CisgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChzaGlmdCA+IDApIHsKKyAgICAgICAgaWYgKCFCTl9yc2hpZnQoQiwgQiwgc2hpZnQpKSB7CisgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogU2FtZSBmb3IgQSBhbmQgWS4gQWZ0ZXJ3YXJkcywgKDIpIHN0aWxsIGhvbGRzLiAqLworICAgICAgc2hpZnQgPSAwOworICAgICAgd2hpbGUgKCFCTl9pc19iaXRfc2V0KEEsIHNoaWZ0KSkgeworICAgICAgICAvKiBub3RlIHRoYXQgMCA8IEEgKi8KKyAgICAgICAgc2hpZnQrKzsKKworICAgICAgICBpZiAoQk5faXNfb2RkKFkpKSB7CisgICAgICAgICAgaWYgKCFCTl91YWRkKFksIFksIG4pKSB7CisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogbm93IFkgaXMgZXZlbiAqLworICAgICAgICBpZiAoIUJOX3JzaGlmdDEoWSwgWSkpIHsKKyAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHNoaWZ0ID4gMCkgeworICAgICAgICBpZiAoIUJOX3JzaGlmdChBLCBBLCBzaGlmdCkpIHsKKyAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBXZSBzdGlsbCBoYXZlICgxKSBhbmQgKDIpLgorICAgICAgICogQm90aCAgQSAgYW5kICBCICBhcmUgb2RkLgorICAgICAgICogVGhlIGZvbGxvd2luZyBjb21wdXRhdGlvbnMgZW5zdXJlIHRoYXQKKyAgICAgICAqCisgICAgICAgKiAgICAgMCA8PSBCIDwgfG58LAorICAgICAgICogICAgICAwIDwgQSA8IHxufCwKKyAgICAgICAqICgxKSAtc2lnbipYKmEgID09ICBCICAgKG1vZCB8bnwpLAorICAgICAgICogKDIpICBzaWduKlkqYSAgPT0gIEEgICAobW9kIHxufCksCisgICAgICAgKgorICAgICAgICogYW5kIHRoYXQgZWl0aGVyICBBICBvciAgQiAgaXMgZXZlbiBpbiB0aGUgbmV4dCBpdGVyYXRpb24uICovCisgICAgICBpZiAoQk5fdWNtcChCLCBBKSA+PSAwKSB7CisgICAgICAgIC8qIC1zaWduKihYICsgWSkqYSA9PSBCIC0gQSAgKG1vZCB8bnwpICovCisgICAgICAgIGlmICghQk5fdWFkZChYLCBYLCBZKSkgeworICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICB9CisgICAgICAgIC8qIE5COiB3ZSBjb3VsZCB1c2UgQk5fbW9kX2FkZF9xdWljayhYLCBYLCBZLCBuKSwgYnV0IHRoYXQKKyAgICAgICAgICogYWN0dWFsbHkgbWFrZXMgdGhlIGFsZ29yaXRobSBzbG93ZXIgKi8KKyAgICAgICAgaWYgKCFCTl91c3ViKEIsIEIsIEEpKSB7CisgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qICBzaWduKihYICsgWSkqYSA9PSBBIC0gQiAgKG1vZCB8bnwpICovCisgICAgICAgIGlmICghQk5fdWFkZChZLCBZLCBYKSkgeworICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICB9CisgICAgICAgIC8qIGFzIGFib3ZlLCBCTl9tb2RfYWRkX3F1aWNrKFksIFksIFgsIG4pIHdvdWxkIHNsb3cgdGhpbmdzIGRvd24gKi8KKyAgICAgICAgaWYgKCFCTl91c3ViKEEsIEEsIEIpKSB7CisgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogZ2VuZXJhbCBpbnZlcnNpb24gYWxnb3JpdGhtICovCisKKyAgICB3aGlsZSAoIUJOX2lzX3plcm8oQikpIHsKKyAgICAgIEJJR05VTSAqdG1wOworCisgICAgICAvKgorICAgICAgICogICAgICAwIDwgQiA8IEEsCisgICAgICAgKiAoKikgLXNpZ24qWCphICA9PSAgQiAgIChtb2QgfG58KSwKKyAgICAgICAqICAgICAgc2lnbipZKmEgID09ICBBICAgKG1vZCB8bnwpICovCisKKyAgICAgIC8qIChELCBNKSA6PSAoQS9CLCBBJUIpIC4uLiAqLworICAgICAgaWYgKEJOX251bV9iaXRzKEEpID09IEJOX251bV9iaXRzKEIpKSB7CisgICAgICAgIGlmICghQk5fb25lKEQpKSB7CisgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFCTl9zdWIoTSwgQSwgQikpIHsKKyAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChCTl9udW1fYml0cyhBKSA9PSBCTl9udW1fYml0cyhCKSArIDEpIHsKKyAgICAgICAgLyogQS9CIGlzIDEsIDIsIG9yIDMgKi8KKyAgICAgICAgaWYgKCFCTl9sc2hpZnQxKFQsIEIpKSB7CisgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEJOX3VjbXAoQSwgVCkgPCAwKSB7CisgICAgICAgICAgLyogQSA8IDIqQiwgc28gRD0xICovCisgICAgICAgICAgaWYgKCFCTl9vbmUoRCkpIHsKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoIUJOX3N1YihNLCBBLCBCKSkgeworICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8qIEEgPj0gMipCLCBzbyBEPTIgb3IgRD0zICovCisgICAgICAgICAgaWYgKCFCTl9zdWIoTSwgQSwgVCkpIHsKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoIUJOX2FkZChELCBULCBCKSkgeworICAgICAgICAgICAgZ290byBlcnI7IC8qIHVzZSBEICg6PSAzKkIpIGFzIHRlbXAgKi8KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKEJOX3VjbXAoQSwgRCkgPCAwKSB7CisgICAgICAgICAgICAvKiBBIDwgMypCLCBzbyBEPTIgKi8KKyAgICAgICAgICAgIGlmICghQk5fc2V0X3dvcmQoRCwgMikpIHsKKyAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBNICg9IEEgLSAyKkIpIGFscmVhZHkgaGFzIHRoZSBjb3JyZWN0IHZhbHVlICovCisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIG9ubHkgRD0zIHJlbWFpbnMgKi8KKyAgICAgICAgICAgIGlmICghQk5fc2V0X3dvcmQoRCwgMykpIHsKKyAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBjdXJyZW50bHkgIE0gPSBBIC0gMipCLCAgYnV0IHdlIG5lZWQgIE0gPSBBIC0gMypCICovCisgICAgICAgICAgICBpZiAoIUJOX3N1YihNLCBNLCBCKSkgeworICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghQk5fZGl2KEQsIE0sIEEsIEIsIGN0eCkpIHsKKyAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBOb3cKKyAgICAgICAqICAgICAgQSA9IEQqQiArIE07CisgICAgICAgKiB0aHVzIHdlIGhhdmUKKyAgICAgICAqICgqKikgIHNpZ24qWSphICA9PSAgRCpCICsgTSAgIChtb2QgfG58KS4gKi8KKworICAgICAgdG1wID0gQTsgLyoga2VlcCB0aGUgQklHTlVNIG9iamVjdCwgdGhlIHZhbHVlIGRvZXMgbm90IG1hdHRlciAqLworCisgICAgICAvKiAoQSwgQikgOj0gKEIsIEEgbW9kIEIpIC4uLiAqLworICAgICAgQSA9IEI7CisgICAgICBCID0gTTsKKyAgICAgIC8qIC4uLiBzbyB3ZSBoYXZlICAwIDw9IEIgPCBBICBhZ2FpbiAqLworCisgICAgICAvKiBTaW5jZSB0aGUgZm9ybWVyICBNICBpcyBub3cgIEIgIGFuZCB0aGUgZm9ybWVyICBCICBpcyBub3cgIEEsCisgICAgICAgKiAoKiopIHRyYW5zbGF0ZXMgaW50bworICAgICAgICogICAgICAgc2lnbipZKmEgID09ICBEKkEgKyBCICAgIChtb2QgfG58KSwKKyAgICAgICAqIGkuZS4KKyAgICAgICAqICAgICAgIHNpZ24qWSphIC0gRCpBICA9PSAgQiAgICAobW9kIHxufCkuCisgICAgICAgKiBTaW1pbGFybHksICgqKSB0cmFuc2xhdGVzIGludG8KKyAgICAgICAqICAgICAgLXNpZ24qWCphICA9PSAgQSAgICAgICAgICAobW9kIHxufCkuCisgICAgICAgKgorICAgICAgICogVGh1cywKKyAgICAgICAqICAgc2lnbipZKmEgKyBEKnNpZ24qWCphICA9PSAgQiAgKG1vZCB8bnwpLAorICAgICAgICogaS5lLgorICAgICAgICogICAgICAgIHNpZ24qKFkgKyBEKlgpKmEgID09ICBCICAobW9kIHxufCkuCisgICAgICAgKgorICAgICAgICogU28gaWYgd2Ugc2V0ICAoWCwgWSwgc2lnbikgOj0gKFkgKyBEKlgsIFgsIC1zaWduKSwgIHdlIGFycml2ZSBiYWNrIGF0CisgICAgICAgKiAgICAgIC1zaWduKlgqYSAgPT0gIEIgICAobW9kIHxufCksCisgICAgICAgKiAgICAgICBzaWduKlkqYSAgPT0gIEEgICAobW9kIHxufCkuCisgICAgICAgKiBOb3RlIHRoYXQgIFggIGFuZCAgWSAgc3RheSBub24tbmVnYXRpdmUgYWxsIHRoZSB0aW1lLiAqLworCisgICAgICAvKiBtb3N0IG9mIHRoZSB0aW1lIEQgaXMgdmVyeSBzbWFsbCwgc28gd2UgY2FuIG9wdGltaXplIHRtcCA6PSBEKlgrWSAqLworICAgICAgaWYgKEJOX2lzX29uZShEKSkgeworICAgICAgICBpZiAoIUJOX2FkZCh0bXAsIFgsIFkpKSB7CisgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChCTl9pc193b3JkKEQsIDIpKSB7CisgICAgICAgICAgaWYgKCFCTl9sc2hpZnQxKHRtcCwgWCkpIHsKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChCTl9pc193b3JkKEQsIDQpKSB7CisgICAgICAgICAgaWYgKCFCTl9sc2hpZnQodG1wLCBYLCAyKSkgeworICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKEQtPnRvcCA9PSAxKSB7CisgICAgICAgICAgaWYgKCFCTl9jb3B5KHRtcCwgWCkpIHsKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoIUJOX211bF93b3JkKHRtcCwgRC0+ZFswXSkpIHsKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoIUJOX211bCh0bXAsIEQsIFgsIGN0eCkpIHsKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIUJOX2FkZCh0bXAsIHRtcCwgWSkpIHsKKyAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBNID0gWTsgLyoga2VlcCB0aGUgQklHTlVNIG9iamVjdCwgdGhlIHZhbHVlIGRvZXMgbm90IG1hdHRlciAqLworICAgICAgWSA9IFg7CisgICAgICBYID0gdG1wOworICAgICAgc2lnbiA9IC1zaWduOworICAgIH0KKyAgfQorCisgIC8qIFRoZSB3aGlsZSBsb29wIChFdWNsaWQncyBhbGdvcml0aG0pIGVuZHMgd2hlbgorICAgKiAgICAgIEEgPT0gZ2NkKGEsbik7CisgICAqIHdlIGhhdmUKKyAgICogICAgICAgc2lnbipZKmEgID09ICBBICAobW9kIHxufCksCisgICAqIHdoZXJlICBZICBpcyBub24tbmVnYXRpdmUuICovCisKKyAgaWYgKHNpZ24gPCAwKSB7CisgICAgaWYgKCFCTl9zdWIoWSwgbiwgWSkpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfQorICAvKiBOb3cgIFkqYSAgPT0gIEEgIChtb2QgfG58KS4gICovCisKKyAgaWYgKEJOX2lzX29uZShBKSkgeworICAgIC8qIFkqYSA9PSAxICAobW9kIHxufCkgKi8KKyAgICBpZiAoIVktPm5lZyAmJiBCTl91Y21wKFksIG4pIDwgMCkgeworICAgICAgaWYgKCFCTl9jb3B5KFIsIFkpKSB7CisgICAgICAgIGdvdG8gZXJyOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoIUJOX25ubW9kKFIsIFksIG4sIGN0eCkpIHsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9tb2RfaW52ZXJzZSwgQk5fUl9OT19JTlZFUlNFKTsKKyAgICBnb3RvIGVycjsKKyAgfQorICByZXQgPSBSOworCitlcnI6CisgIGlmIChyZXQgPT0gTlVMTCAmJiBvdXQgPT0gTlVMTCkgeworICAgIEJOX2ZyZWUoUik7CisgIH0KKyAgQk5fQ1RYX2VuZChjdHgpOworICByZXR1cm4gcmV0OworfQorCisvKiBCTl9tb2RfaW52ZXJzZV9ub19icmFuY2ggaXMgYSBzcGVjaWFsIHZlcnNpb24gb2YgQk5fbW9kX2ludmVyc2UuCisgKiBJdCBkb2VzIG5vdCBjb250YWluIGJyYW5jaGVzIHRoYXQgbWF5IGxlYWsgc2Vuc2l0aXZlIGluZm9ybWF0aW9uLiAqLworc3RhdGljIEJJR05VTSAqQk5fbW9kX2ludmVyc2Vfbm9fYnJhbmNoKEJJR05VTSAqb3V0LCBjb25zdCBCSUdOVU0gKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQklHTlVNICpuLCBCTl9DVFggKmN0eCkgeworICBCSUdOVU0gKkEsICpCLCAqWCwgKlksICpNLCAqRCwgKlQsICpSID0gTlVMTDsKKyAgQklHTlVNIGxvY2FsX0EsIGxvY2FsX0I7CisgIEJJR05VTSAqcEEsICpwQjsKKyAgQklHTlVNICpyZXQgPSBOVUxMOworICBpbnQgc2lnbjsKKworICBCTl9DVFhfc3RhcnQoY3R4KTsKKyAgQSA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgQiA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgWCA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgRCA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgTSA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgWSA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgVCA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgaWYgKFQgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKG91dCA9PSBOVUxMKSB7CisgICAgUiA9IEJOX25ldygpOworICB9IGVsc2UgeworICAgIFIgPSBvdXQ7CisgIH0KKyAgaWYgKFIgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgQk5fb25lKFgpOworICBCTl96ZXJvKFkpOworICBpZiAoQk5fY29weShCLCBhKSA9PSBOVUxMKSB7CisgICAgZ290byBlcnI7CisgIH0KKyAgaWYgKEJOX2NvcHkoQSwgbikgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisgIEEtPm5lZyA9IDA7CisKKyAgaWYgKEItPm5lZyB8fCAoQk5fdWNtcChCLCBBKSA+PSAwKSkgeworICAgIC8qIFR1cm4gQk5fRkxHX0NPTlNUVElNRSBmbGFnIG9uLCBzbyB0aGF0IHdoZW4gQk5fZGl2IGlzIGludm9rZWQsCisgICAgICogQk5fZGl2X25vX2JyYW5jaCB3aWxsIGJlIGNhbGxlZCBldmVudHVhbGx5LgorICAgICAqLworICAgIHBCID0gJmxvY2FsX0I7CisgICAgQk5fd2l0aF9mbGFncyhwQiwgQiwgQk5fRkxHX0NPTlNUVElNRSk7CisgICAgaWYgKCFCTl9ubm1vZChCLCBwQiwgQSwgY3R4KSkKKyAgICAgIGdvdG8gZXJyOworICB9CisgIHNpZ24gPSAtMTsKKyAgLyogRnJvbSAgQiA9IGEgbW9kIHxufCwgIEEgPSB8bnwgIGl0IGZvbGxvd3MgdGhhdAorICAgKgorICAgKiAgICAgIDAgPD0gQiA8IEEsCisgICAqICAgICAtc2lnbipYKmEgID09ICBCICAgKG1vZCB8bnwpLAorICAgKiAgICAgIHNpZ24qWSphICA9PSAgQSAgIChtb2QgfG58KS4KKyAgICovCisKKyAgd2hpbGUgKCFCTl9pc196ZXJvKEIpKSB7CisgICAgQklHTlVNICp0bXA7CisKKyAgICAvKgorICAgICAqICAgICAgMCA8IEIgPCBBLAorICAgICAqICgqKSAtc2lnbipYKmEgID09ICBCICAgKG1vZCB8bnwpLAorICAgICAqICAgICAgc2lnbipZKmEgID09ICBBICAgKG1vZCB8bnwpCisgICAgICovCisKKyAgICAvKiBUdXJuIEJOX0ZMR19DT05TVFRJTUUgZmxhZyBvbiwgc28gdGhhdCB3aGVuIEJOX2RpdiBpcyBpbnZva2VkLAorICAgICAqIEJOX2Rpdl9ub19icmFuY2ggd2lsbCBiZSBjYWxsZWQgZXZlbnR1YWxseS4KKyAgICAgKi8KKyAgICBwQSA9ICZsb2NhbF9BOworICAgIEJOX3dpdGhfZmxhZ3MocEEsIEEsIEJOX0ZMR19DT05TVFRJTUUpOworCisgICAgLyogKEQsIE0pIDo9IChBL0IsIEElQikgLi4uICovCisgICAgaWYgKCFCTl9kaXYoRCwgTSwgcEEsIEIsIGN0eCkpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIC8qIE5vdworICAgICAqICAgICAgQSA9IEQqQiArIE07CisgICAgICogdGh1cyB3ZSBoYXZlCisgICAgICogKCoqKSAgc2lnbipZKmEgID09ICBEKkIgKyBNICAgKG1vZCB8bnwpLgorICAgICAqLworCisgICAgdG1wID0gQTsgLyoga2VlcCB0aGUgQklHTlVNIG9iamVjdCwgdGhlIHZhbHVlIGRvZXMgbm90IG1hdHRlciAqLworCisgICAgLyogKEEsIEIpIDo9IChCLCBBIG1vZCBCKSAuLi4gKi8KKyAgICBBID0gQjsKKyAgICBCID0gTTsKKyAgICAvKiAuLi4gc28gd2UgaGF2ZSAgMCA8PSBCIDwgQSAgYWdhaW4gKi8KKworICAgIC8qIFNpbmNlIHRoZSBmb3JtZXIgIE0gIGlzIG5vdyAgQiAgYW5kIHRoZSBmb3JtZXIgIEIgIGlzIG5vdyAgQSwKKyAgICAgKiAoKiopIHRyYW5zbGF0ZXMgaW50bworICAgICAqICAgICAgIHNpZ24qWSphICA9PSAgRCpBICsgQiAgICAobW9kIHxufCksCisgICAgICogaS5lLgorICAgICAqICAgICAgIHNpZ24qWSphIC0gRCpBICA9PSAgQiAgICAobW9kIHxufCkuCisgICAgICogU2ltaWxhcmx5LCAoKikgdHJhbnNsYXRlcyBpbnRvCisgICAgICogICAgICAtc2lnbipYKmEgID09ICBBICAgICAgICAgIChtb2QgfG58KS4KKyAgICAgKgorICAgICAqIFRodXMsCisgICAgICogICBzaWduKlkqYSArIEQqc2lnbipYKmEgID09ICBCICAobW9kIHxufCksCisgICAgICogaS5lLgorICAgICAqICAgICAgICBzaWduKihZICsgRCpYKSphICA9PSAgQiAgKG1vZCB8bnwpLgorICAgICAqCisgICAgICogU28gaWYgd2Ugc2V0ICAoWCwgWSwgc2lnbikgOj0gKFkgKyBEKlgsIFgsIC1zaWduKSwgIHdlIGFycml2ZSBiYWNrIGF0CisgICAgICogICAgICAtc2lnbipYKmEgID09ICBCICAgKG1vZCB8bnwpLAorICAgICAqICAgICAgIHNpZ24qWSphICA9PSAgQSAgIChtb2QgfG58KS4KKyAgICAgKiBOb3RlIHRoYXQgIFggIGFuZCAgWSAgc3RheSBub24tbmVnYXRpdmUgYWxsIHRoZSB0aW1lLgorICAgICAqLworCisgICAgaWYgKCFCTl9tdWwodG1wLCBELCBYLCBjdHgpKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgaWYgKCFCTl9hZGQodG1wLCB0bXAsIFkpKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBNID0gWTsgLyoga2VlcCB0aGUgQklHTlVNIG9iamVjdCwgdGhlIHZhbHVlIGRvZXMgbm90IG1hdHRlciAqLworICAgIFkgPSBYOworICAgIFggPSB0bXA7CisgICAgc2lnbiA9IC1zaWduOworICB9CisKKyAgLyoKKyAgICogVGhlIHdoaWxlIGxvb3AgKEV1Y2xpZCdzIGFsZ29yaXRobSkgZW5kcyB3aGVuCisgICAqICAgICAgQSA9PSBnY2QoYSxuKTsKKyAgICogd2UgaGF2ZQorICAgKiAgICAgICBzaWduKlkqYSAgPT0gIEEgIChtb2QgfG58KSwKKyAgICogd2hlcmUgIFkgIGlzIG5vbi1uZWdhdGl2ZS4KKyAgICovCisKKyAgaWYgKHNpZ24gPCAwKSB7CisgICAgaWYgKCFCTl9zdWIoWSwgbiwgWSkpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfQorICAvKiBOb3cgIFkqYSAgPT0gIEEgIChtb2QgfG58KS4gICovCisKKyAgaWYgKEJOX2lzX29uZShBKSkgeworICAgIC8qIFkqYSA9PSAxICAobW9kIHxufCkgKi8KKyAgICBpZiAoIVktPm5lZyAmJiBCTl91Y21wKFksIG4pIDwgMCkgeworICAgICAgaWYgKCFCTl9jb3B5KFIsIFkpKSB7CisgICAgICAgIGdvdG8gZXJyOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoIUJOX25ubW9kKFIsIFksIG4sIGN0eCkpIHsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9tb2RfaW52ZXJzZV9ub19icmFuY2gsIEJOX1JfTk9fSU5WRVJTRSk7CisgICAgZ290byBlcnI7CisgIH0KKyAgcmV0ID0gUjsKKworZXJyOgorICBpZiAocmV0ID09IE5VTEwgJiYgb3V0ID09IE5VTEwpIHsKKyAgICBCTl9mcmVlKFIpOworICB9CisKKyAgQk5fQ1RYX2VuZChjdHgpOworICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2JuL2dlbmVyaWMuYyBiL2NyeXB0by9ibi9nZW5lcmljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc0NTc1MAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9ibi9nZW5lcmljLmMKQEAgLTAsMCArMSwxMTg5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfV0lORE9XUykgfHwgZGVmaW5lZChPUEVOU1NMX05PX0FTTSkgfHwgXAorICAgICghZGVmaW5lZChPUEVOU1NMX1g4Nl82NCkgJiYgIWRlZmluZWQoT1BFTlNTTF9YODYpKQorCisjaWYgZGVmaW5lZChPUEVOU1NMX1dJTkRPV1MpCisjZGVmaW5lIGFsbG9jYSBfYWxsb2NhCisjZWxzZQorI2luY2x1ZGUgPGFsbG9jYS5oPgorI2VuZGlmCisKKyNpZmRlZiBCTl9MTE9ORworI2RlZmluZSBtdWxfYWRkKHIsIGEsIHcsIGMpICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQk5fVUxMT05HIHQ7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHQgPSAoQk5fVUxMT05HKXcgKiAoYSkgKyAocikgKyAoYyk7IFwKKyAgICAocikgPSBMdyh0KTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGMpID0gSHcodCk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgbXVsKHIsIGEsIHcsIGMpICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJOX1VMTE9ORyB0OyAgICAgICAgICAgICAgICAgIFwKKyAgICB0ID0gKEJOX1VMTE9ORyl3ICogKGEpICsgKGMpOyBcCisgICAgKHIpID0gTHcodCk7ICAgICAgICAgICAgICAgICAgXAorICAgIChjKSA9IEh3KHQpOyAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIHNxcihyMCwgcjEsIGEpICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQk5fVUxMT05HIHQ7ICAgICAgICAgICAgICBcCisgICAgdCA9IChCTl9VTExPTkcpKGEpICogKGEpOyBcCisgICAgKHIwKSA9IEx3KHQpOyAgICAgICAgICAgICBcCisgICAgKHIxKSA9IEh3KHQpOyAgICAgICAgICAgICBcCisgIH0KKworI2VsaWYgZGVmaW5lZChCTl9VTVVMVF9MT0hJKQorI2RlZmluZSBtdWxfYWRkKHIsIGEsIHcsIGMpICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQk5fVUxPTkcgaGlnaCwgbG93LCByZXQsIHRtcCA9IChhKTsgXAorICAgIHJldCA9IChyKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCTl9VTVVMVF9MT0hJKGxvdywgaGlnaCwgdywgdG1wKTsgICBcCisgICAgcmV0ICs9IChjKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChjKSA9IChyZXQgPCAoYykpID8gMSA6IDA7ICAgICAgICAgIFwKKyAgICAoYykgKz0gaGlnaDsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0ICs9IGxvdzsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChjKSArPSAocmV0IDwgbG93KSA/IDEgOiAwOyAgICAgICAgIFwKKyAgICAocikgPSByZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBtdWwociwgYSwgdywgYykgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJOX1VMT05HIGhpZ2gsIGxvdywgcmV0LCB0YSA9IChhKTsgXAorICAgIEJOX1VNVUxUX0xPSEkobG93LCBoaWdoLCB3LCB0YSk7ICAgXAorICAgIHJldCA9IGxvdyArIChjKTsgICAgICAgICAgICAgICAgICAgXAorICAgIChjKSA9IGhpZ2g7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChjKSArPSAocmV0IDwgbG93KSA/IDEgOiAwOyAgICAgICAgXAorICAgIChyKSA9IHJldDsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgc3FyKHIwLCByMSwgYSkgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJOX1VMT05HIHRtcCA9IChhKTsgICAgICAgICAgICAgIFwKKyAgICBCTl9VTVVMVF9MT0hJKHIwLCByMSwgdG1wLCB0bXApOyBcCisgIH0KKworI2VsaWYgZGVmaW5lZChCTl9VTVVMVF9ISUdIKQorI2RlZmluZSBtdWxfYWRkKHIsIGEsIHcsIGMpICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQk5fVUxPTkcgaGlnaCwgbG93LCByZXQsIHRtcCA9IChhKTsgXAorICAgIHJldCA9IChyKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBoaWdoID0gQk5fVU1VTFRfSElHSCh3LCB0bXApOyAgICAgICBcCisgICAgcmV0ICs9IChjKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGxvdyA9ICh3KSAqIHRtcDsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoYykgPSAocmV0IDwgKGMpKSA/IDEgOiAwOyAgICAgICAgICBcCisgICAgKGMpICs9IGhpZ2g7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldCArPSBsb3c7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoYykgKz0gKHJldCA8IGxvdykgPyAxIDogMDsgICAgICAgICBcCisgICAgKHIpID0gcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgbXVsKHIsIGEsIHcsIGMpICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCTl9VTE9ORyBoaWdoLCBsb3csIHJldCwgdGEgPSAoYSk7IFwKKyAgICBsb3cgPSAodykgKiB0YTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBoaWdoID0gQk5fVU1VTFRfSElHSCh3LCB0YSk7ICAgICAgIFwKKyAgICByZXQgPSBsb3cgKyAoYyk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAoYykgPSBoaWdoOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoYykgKz0gKHJldCA8IGxvdykgPyAxIDogMDsgICAgICAgIFwKKyAgICAocikgPSByZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIHNxcihyMCwgcjEsIGEpICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQk5fVUxPTkcgdG1wID0gKGEpOyAgICAgICAgICAgICBcCisgICAgKHIwKSA9IHRtcCAqIHRtcDsgICAgICAgICAgICAgICBcCisgICAgKHIxKSA9IEJOX1VNVUxUX0hJR0godG1wLCB0bXApOyBcCisgIH0KKworI2Vsc2UKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBObyBsb25nIGxvbmcgdHlwZQorICovCisKKyNkZWZpbmUgTEJJVFMoYSkgKChhKSAmIEJOX01BU0sybCkKKyNkZWZpbmUgSEJJVFMoYSkgKCgoYSkgPj4gQk5fQklUUzQpICYgQk5fTUFTSzJsKQorI2RlZmluZSBMMkhCSVRTKGEpICgoKGEpIDw8IEJOX0JJVFM0KSAmIEJOX01BU0syKQorCisjZGVmaW5lIExMQklUUyhhKSAoKGEpICYgQk5fTUFTS2wpCisjZGVmaW5lIExIQklUUyhhKSAoKChhKSA+PiBCTl9CSVRTMikgJiBCTl9NQVNLbCkKKyNkZWZpbmUgTEwySEJJVFMoYSkgKChCTl9VTExPTkcpKChhKSAmIEJOX01BU0tsKSA8PCBCTl9CSVRTMikKKworI2RlZmluZSBtdWw2NChsLCBoLCBibCwgYmgpICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQk5fVUxPTkcgbSwgbTEsIGx0LCBodDsgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBsdCA9IGw7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaHQgPSBoOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG0gPSAoYmgpICogKGx0KTsgICAgICAgICAgICAgIFwKKyAgICBsdCA9IChibCkgKiAobHQpOyAgICAgICAgICAgICBcCisgICAgbTEgPSAoYmwpICogKGh0KTsgICAgICAgICAgICAgXAorICAgIGh0ID0gKGJoKSAqIChodCk7ICAgICAgICAgICAgIFwKKyAgICBtID0gKG0gKyBtMSkgJiBCTl9NQVNLMjsgICAgICBcCisgICAgaWYgKG0gPCBtMSkgICAgICAgICAgICAgICAgICAgXAorICAgICAgaHQgKz0gTDJIQklUUygoQk5fVUxPTkcpMSk7IFwKKyAgICBodCArPSBIQklUUyhtKTsgICAgICAgICAgICAgICBcCisgICAgbTEgPSBMMkhCSVRTKG0pOyAgICAgICAgICAgICAgXAorICAgIGx0ID0gKGx0ICsgbTEpICYgQk5fTUFTSzI7ICAgIFwKKyAgICBpZiAobHQgPCBtMSkgICAgICAgICAgICAgICAgICBcCisgICAgICBodCsrOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChsKSA9IGx0OyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoaCkgPSBodDsgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBzcXI2NChsbywgaG8sIGluKSAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJOX1VMT05HIGwsIGgsIG07ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGggPSAoaW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGwgPSBMQklUUyhoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGggPSBIQklUUyhoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG0gPSAobCkgKiAoaCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGwgKj0gbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGggKj0gaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGggKz0gKG0gJiBCTl9NQVNLMmgxKSA+PiAoQk5fQklUUzQgLSAxKTsgXAorICAgIG0gPSAobSAmIEJOX01BU0sybCkgPDwgKEJOX0JJVFM0ICsgMSk7ICAgXAorICAgIGwgPSAobCArIG0pICYgQk5fTUFTSzI7ICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChsIDwgbSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChsbykgPSBsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChobykgPSBoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgbXVsX2FkZChyLCBhLCBibCwgYmgsIGMpIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCTl9VTE9ORyBsLCBoOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBoID0gKGEpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBsID0gTEJJVFMoaCk7ICAgICAgICAgICAgICAgIFwKKyAgICBoID0gSEJJVFMoaCk7ICAgICAgICAgICAgICAgIFwKKyAgICBtdWw2NChsLCBoLCAoYmwpLCAoYmgpKTsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBub24tbXVsdGlwbHkgcGFydCAqLyAgICAgIFwKKyAgICBsID0gKGwgKyAoYykpICYgQk5fTUFTSzI7ICAgIFwKKyAgICBpZiAobCA8IChjKSkgICAgICAgICAgICAgICAgIFwKKyAgICAgIGgrKzsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoYykgPSAocik7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBsID0gKGwgKyAoYykpICYgQk5fTUFTSzI7ICAgIFwKKyAgICBpZiAobCA8IChjKSkgICAgICAgICAgICAgICAgIFwKKyAgICAgIGgrKzsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoYykgPSBoICYgQk5fTUFTSzI7ICAgICAgICAgIFwKKyAgICAocikgPSBsOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIG11bChyLCBhLCBibCwgYmgsIGMpICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQk5fVUxPTkcgbCwgaDsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaCA9IChhKTsgICAgICAgICAgICAgICAgICBcCisgICAgbCA9IExCSVRTKGgpOyAgICAgICAgICAgICBcCisgICAgaCA9IEhCSVRTKGgpOyAgICAgICAgICAgICBcCisgICAgbXVsNjQobCwgaCwgKGJsKSwgKGJoKSk7ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogbm9uLW11bHRpcGx5IHBhcnQgKi8gICBcCisgICAgbCArPSAoYyk7ICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChsICYgQk5fTUFTSzIpIDwgKGMpKSBcCisgICAgICBoKys7ICAgICAgICAgICAgICAgICAgICBcCisgICAgKGMpID0gaCAmIEJOX01BU0syOyAgICAgICBcCisgICAgKHIpID0gbCAmIEJOX01BU0syOyAgICAgICBcCisgIH0KKyNlbmRpZiAvKiAhQk5fTExPTkcgKi8KKworI2lmIGRlZmluZWQoQk5fTExPTkcpIHx8IGRlZmluZWQoQk5fVU1VTFRfSElHSCkKKworQk5fVUxPTkcgYm5fbXVsX2FkZF93b3JkcyhCTl9VTE9ORyAqcnAsIGNvbnN0IEJOX1VMT05HICphcCwgaW50IG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk5fVUxPTkcgdykgeworICBCTl9VTE9ORyBjMSA9IDA7CisKKyAgYXNzZXJ0KG51bSA+PSAwKTsKKyAgaWYgKG51bSA8PSAwKSB7CisgICAgcmV0dXJuIGMxOworICB9CisKKyAgd2hpbGUgKG51bSAmIH4zKSB7CisgICAgbXVsX2FkZChycFswXSwgYXBbMF0sIHcsIGMxKTsKKyAgICBtdWxfYWRkKHJwWzFdLCBhcFsxXSwgdywgYzEpOworICAgIG11bF9hZGQocnBbMl0sIGFwWzJdLCB3LCBjMSk7CisgICAgbXVsX2FkZChycFszXSwgYXBbM10sIHcsIGMxKTsKKyAgICBhcCArPSA0OworICAgIHJwICs9IDQ7CisgICAgbnVtIC09IDQ7CisgIH0KKworICB3aGlsZSAobnVtKSB7CisgICAgbXVsX2FkZChycFswXSwgYXBbMF0sIHcsIGMxKTsKKyAgICBhcCsrOworICAgIHJwKys7CisgICAgbnVtLS07CisgIH0KKworICByZXR1cm4gYzE7Cit9CisKK0JOX1VMT05HIGJuX211bF93b3JkcyhCTl9VTE9ORyAqcnAsIGNvbnN0IEJOX1VMT05HICphcCwgaW50IG51bSwgQk5fVUxPTkcgdykgeworICBCTl9VTE9ORyBjMSA9IDA7CisKKyAgYXNzZXJ0KG51bSA+PSAwKTsKKyAgaWYgKG51bSA8PSAwKSB7CisgICAgcmV0dXJuIGMxOworICB9CisKKyAgd2hpbGUgKG51bSAmIH4zKSB7CisgICAgbXVsKHJwWzBdLCBhcFswXSwgdywgYzEpOworICAgIG11bChycFsxXSwgYXBbMV0sIHcsIGMxKTsKKyAgICBtdWwocnBbMl0sIGFwWzJdLCB3LCBjMSk7CisgICAgbXVsKHJwWzNdLCBhcFszXSwgdywgYzEpOworICAgIGFwICs9IDQ7CisgICAgcnAgKz0gNDsKKyAgICBudW0gLT0gNDsKKyAgfQorICB3aGlsZSAobnVtKSB7CisgICAgbXVsKHJwWzBdLCBhcFswXSwgdywgYzEpOworICAgIGFwKys7CisgICAgcnArKzsKKyAgICBudW0tLTsKKyAgfQorICByZXR1cm4gYzE7Cit9CisKK3ZvaWQgYm5fc3FyX3dvcmRzKEJOX1VMT05HICpyLCBjb25zdCBCTl9VTE9ORyAqYSwgaW50IG4pIHsKKyAgYXNzZXJ0KG4gPj0gMCk7CisgIGlmIChuIDw9IDApIHsKKyAgICByZXR1cm47CisgIH0KKworICB3aGlsZSAobiAmIH4zKSB7CisgICAgc3FyKHJbMF0sIHJbMV0sIGFbMF0pOworICAgIHNxcihyWzJdLCByWzNdLCBhWzFdKTsKKyAgICBzcXIocls0XSwgcls1XSwgYVsyXSk7CisgICAgc3FyKHJbNl0sIHJbN10sIGFbM10pOworICAgIGEgKz0gNDsKKyAgICByICs9IDg7CisgICAgbiAtPSA0OworICB9CisgIHdoaWxlIChuKSB7CisgICAgc3FyKHJbMF0sIHJbMV0sIGFbMF0pOworICAgIGErKzsKKyAgICByICs9IDI7CisgICAgbi0tOworICB9Cit9CisKKyNlbHNlIC8qICEoZGVmaW5lZChCTl9MTE9ORykgfHwgZGVmaW5lZChCTl9VTVVMVF9ISUdIKSkgKi8KKworQk5fVUxPTkcgYm5fbXVsX2FkZF93b3JkcyhCTl9VTE9ORyAqcnAsIGNvbnN0IEJOX1VMT05HICphcCwgaW50IG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk5fVUxPTkcgdykgeworICBCTl9VTE9ORyBjID0gMDsKKyAgQk5fVUxPTkcgYmwsIGJoOworCisgIGFzc2VydChudW0gPj0gMCk7CisgIGlmIChudW0gPD0gMCkgeworICAgIHJldHVybiAoQk5fVUxPTkcpMDsKKyAgfQorCisgIGJsID0gTEJJVFModyk7CisgIGJoID0gSEJJVFModyk7CisKKyAgd2hpbGUgKG51bSAmIH4zKSB7CisgICAgbXVsX2FkZChycFswXSwgYXBbMF0sIGJsLCBiaCwgYyk7CisgICAgbXVsX2FkZChycFsxXSwgYXBbMV0sIGJsLCBiaCwgYyk7CisgICAgbXVsX2FkZChycFsyXSwgYXBbMl0sIGJsLCBiaCwgYyk7CisgICAgbXVsX2FkZChycFszXSwgYXBbM10sIGJsLCBiaCwgYyk7CisgICAgYXAgKz0gNDsKKyAgICBycCArPSA0OworICAgIG51bSAtPSA0OworICB9CisgIHdoaWxlIChudW0pIHsKKyAgICBtdWxfYWRkKHJwWzBdLCBhcFswXSwgYmwsIGJoLCBjKTsKKyAgICBhcCsrOworICAgIHJwKys7CisgICAgbnVtLS07CisgIH0KKyAgcmV0dXJuIGM7Cit9CisKK0JOX1VMT05HIGJuX211bF93b3JkcyhCTl9VTE9ORyAqcnAsIGNvbnN0IEJOX1VMT05HICphcCwgaW50IG51bSwgQk5fVUxPTkcgdykgeworICBCTl9VTE9ORyBjYXJyeSA9IDA7CisgIEJOX1VMT05HIGJsLCBiaDsKKworICBhc3NlcnQobnVtID49IDApOworICBpZiAobnVtIDw9IDApIHsKKyAgICByZXR1cm4gKEJOX1VMT05HKTA7CisgIH0KKworICBibCA9IExCSVRTKHcpOworICBiaCA9IEhCSVRTKHcpOworCisgIHdoaWxlIChudW0gJiB+MykgeworICAgIG11bChycFswXSwgYXBbMF0sIGJsLCBiaCwgY2FycnkpOworICAgIG11bChycFsxXSwgYXBbMV0sIGJsLCBiaCwgY2FycnkpOworICAgIG11bChycFsyXSwgYXBbMl0sIGJsLCBiaCwgY2FycnkpOworICAgIG11bChycFszXSwgYXBbM10sIGJsLCBiaCwgY2FycnkpOworICAgIGFwICs9IDQ7CisgICAgcnAgKz0gNDsKKyAgICBudW0gLT0gNDsKKyAgfQorICB3aGlsZSAobnVtKSB7CisgICAgbXVsKHJwWzBdLCBhcFswXSwgYmwsIGJoLCBjYXJyeSk7CisgICAgYXArKzsKKyAgICBycCsrOworICAgIG51bS0tOworICB9CisgIHJldHVybiBjYXJyeTsKK30KKwordm9pZCBibl9zcXJfd29yZHMoQk5fVUxPTkcgKnIsIGNvbnN0IEJOX1VMT05HICphLCBpbnQgbikgeworICBhc3NlcnQobiA+PSAwKTsKKyAgaWYgKG4gPD0gMCkgeworICAgIHJldHVybjsKKyAgfQorCisgIHdoaWxlIChuICYgfjMpIHsKKyAgICBzcXI2NChyWzBdLCByWzFdLCBhWzBdKTsKKyAgICBzcXI2NChyWzJdLCByWzNdLCBhWzFdKTsKKyAgICBzcXI2NChyWzRdLCByWzVdLCBhWzJdKTsKKyAgICBzcXI2NChyWzZdLCByWzddLCBhWzNdKTsKKyAgICBhICs9IDQ7CisgICAgciArPSA4OworICAgIG4gLT0gNDsKKyAgfQorICB3aGlsZSAobikgeworICAgIHNxcjY0KHJbMF0sIHJbMV0sIGFbMF0pOworICAgIGErKzsKKyAgICByICs9IDI7CisgICAgbi0tOworICB9Cit9CisKKyNlbmRpZiAvKiAhKGRlZmluZWQoQk5fTExPTkcpIHx8IGRlZmluZWQoQk5fVU1VTFRfSElHSCkpICovCisKKyNpZiBkZWZpbmVkKEJOX0xMT05HKSAmJiBkZWZpbmVkKEJOX0RJVjJXKQorCitCTl9VTE9ORyBibl9kaXZfd29yZHMoQk5fVUxPTkcgaCwgQk5fVUxPTkcgbCwgQk5fVUxPTkcgZCkgeworICByZXR1cm4gKEJOX1VMT05HKSgoKCgoQk5fVUxMT05HKWgpIDw8IEJOX0JJVFMyKSB8IGwpIC8gKEJOX1VMTE9ORylkKTsKK30KKworI2Vsc2UKKworLyogRGl2aWRlIGgsbCBieSBkIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4gKi8KK0JOX1VMT05HIGJuX2Rpdl93b3JkcyhCTl9VTE9ORyBoLCBCTl9VTE9ORyBsLCBCTl9VTE9ORyBkKSB7CisgIEJOX1VMT05HIGRoLCBkbCwgcSwgcmV0ID0gMCwgdGgsIHRsLCB0OworICBpbnQgaSwgY291bnQgPSAyOworCisgIGlmIChkID09IDApIHsKKyAgICByZXR1cm4gQk5fTUFTSzI7CisgIH0KKworICBpID0gQk5fbnVtX2JpdHNfd29yZChkKTsKKyAgYXNzZXJ0KChpID09IEJOX0JJVFMyKSB8fCAoaCA8PSAoQk5fVUxPTkcpMSA8PCBpKSk7CisKKyAgaSA9IEJOX0JJVFMyIC0gaTsKKyAgaWYgKGggPj0gZCkgeworICAgIGggLT0gZDsKKyAgfQorCisgIGlmIChpKSB7CisgICAgZCA8PD0gaTsKKyAgICBoID0gKGggPDwgaSkgfCAobCA+PiAoQk5fQklUUzIgLSBpKSk7CisgICAgbCA8PD0gaTsKKyAgfQorICBkaCA9IChkICYgQk5fTUFTSzJoKSA+PiBCTl9CSVRTNDsKKyAgZGwgPSAoZCAmIEJOX01BU0sybCk7CisgIGZvciAoOzspIHsKKyAgICBpZiAoKGggPj4gQk5fQklUUzQpID09IGRoKSB7CisgICAgICBxID0gQk5fTUFTSzJsOworICAgIH0gZWxzZSB7CisgICAgICBxID0gaCAvIGRoOworICAgIH0KKworICAgIHRoID0gcSAqIGRoOworICAgIHRsID0gZGwgKiBxOworICAgIGZvciAoOzspIHsKKyAgICAgIHQgPSBoIC0gdGg7CisgICAgICBpZiAoKHQgJiBCTl9NQVNLMmgpIHx8CisgICAgICAgICAgKCh0bCkgPD0gKCh0IDw8IEJOX0JJVFM0KSB8ICgobCAmIEJOX01BU0syaCkgPj4gQk5fQklUUzQpKSkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBxLS07CisgICAgICB0aCAtPSBkaDsKKyAgICAgIHRsIC09IGRsOworICAgIH0KKyAgICB0ID0gKHRsID4+IEJOX0JJVFM0KTsKKyAgICB0bCA9ICh0bCA8PCBCTl9CSVRTNCkgJiBCTl9NQVNLMmg7CisgICAgdGggKz0gdDsKKworICAgIGlmIChsIDwgdGwpIHsKKyAgICAgIHRoKys7CisgICAgfQorICAgIGwgLT0gdGw7CisgICAgaWYgKGggPCB0aCkgeworICAgICAgaCArPSBkOworICAgICAgcS0tOworICAgIH0KKyAgICBoIC09IHRoOworCisgICAgaWYgKC0tY291bnQgPT0gMCkgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0ID0gcSA8PCBCTl9CSVRTNDsKKyAgICBoID0gKChoIDw8IEJOX0JJVFM0KSB8IChsID4+IEJOX0JJVFM0KSkgJiBCTl9NQVNLMjsKKyAgICBsID0gKGwgJiBCTl9NQVNLMmwpIDw8IEJOX0JJVFM0OworICB9CisKKyAgcmV0IHw9IHE7CisgIHJldHVybiByZXQ7Cit9CisKKyNlbmRpZiAvKiAhZGVmaW5lZChCTl9MTE9ORykgJiYgZGVmaW5lZChCTl9ESVYyVykgKi8KKworI2lmZGVmIEJOX0xMT05HCitCTl9VTE9ORyBibl9hZGRfd29yZHMoQk5fVUxPTkcgKnIsIGNvbnN0IEJOX1VMT05HICphLCBjb25zdCBCTl9VTE9ORyAqYiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbikgeworICBCTl9VTExPTkcgbGwgPSAwOworCisgIGFzc2VydChuID49IDApOworICBpZiAobiA8PSAwKSB7CisgICAgcmV0dXJuIChCTl9VTE9ORykwOworICB9CisKKyAgd2hpbGUgKG4gJiB+MykgeworICAgIGxsICs9IChCTl9VTExPTkcpYVswXSArIGJbMF07CisgICAgclswXSA9IChCTl9VTE9ORylsbCAmIEJOX01BU0syOworICAgIGxsID4+PSBCTl9CSVRTMjsKKyAgICBsbCArPSAoQk5fVUxMT05HKWFbMV0gKyBiWzFdOworICAgIHJbMV0gPSAoQk5fVUxPTkcpbGwgJiBCTl9NQVNLMjsKKyAgICBsbCA+Pj0gQk5fQklUUzI7CisgICAgbGwgKz0gKEJOX1VMTE9ORylhWzJdICsgYlsyXTsKKyAgICByWzJdID0gKEJOX1VMT05HKWxsICYgQk5fTUFTSzI7CisgICAgbGwgPj49IEJOX0JJVFMyOworICAgIGxsICs9IChCTl9VTExPTkcpYVszXSArIGJbM107CisgICAgclszXSA9IChCTl9VTE9ORylsbCAmIEJOX01BU0syOworICAgIGxsID4+PSBCTl9CSVRTMjsKKyAgICBhICs9IDQ7CisgICAgYiArPSA0OworICAgIHIgKz0gNDsKKyAgICBuIC09IDQ7CisgIH0KKyAgd2hpbGUgKG4pIHsKKyAgICBsbCArPSAoQk5fVUxMT05HKWFbMF0gKyBiWzBdOworICAgIHJbMF0gPSAoQk5fVUxPTkcpbGwgJiBCTl9NQVNLMjsKKyAgICBsbCA+Pj0gQk5fQklUUzI7CisgICAgYSsrOworICAgIGIrKzsKKyAgICByKys7CisgICAgbi0tOworICB9CisgIHJldHVybiAoQk5fVUxPTkcpbGw7Cit9CisKKyNlbHNlIC8qICFCTl9MTE9ORyAqLworCitCTl9VTE9ORyBibl9hZGRfd29yZHMoQk5fVUxPTkcgKnIsIGNvbnN0IEJOX1VMT05HICphLCBjb25zdCBCTl9VTE9ORyAqYiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbikgeworICBCTl9VTE9ORyBjLCBsLCB0OworCisgIGFzc2VydChuID49IDApOworICBpZiAobiA8PSAwKSB7CisgICAgcmV0dXJuIChCTl9VTE9ORykwOworICB9CisKKyAgYyA9IDA7CisgIHdoaWxlIChuICYgfjMpIHsKKyAgICB0ID0gYVswXTsKKyAgICB0ID0gKHQgKyBjKSAmIEJOX01BU0syOworICAgIGMgPSAodCA8IGMpOworICAgIGwgPSAodCArIGJbMF0pICYgQk5fTUFTSzI7CisgICAgYyArPSAobCA8IHQpOworICAgIHJbMF0gPSBsOworICAgIHQgPSBhWzFdOworICAgIHQgPSAodCArIGMpICYgQk5fTUFTSzI7CisgICAgYyA9ICh0IDwgYyk7CisgICAgbCA9ICh0ICsgYlsxXSkgJiBCTl9NQVNLMjsKKyAgICBjICs9IChsIDwgdCk7CisgICAgclsxXSA9IGw7CisgICAgdCA9IGFbMl07CisgICAgdCA9ICh0ICsgYykgJiBCTl9NQVNLMjsKKyAgICBjID0gKHQgPCBjKTsKKyAgICBsID0gKHQgKyBiWzJdKSAmIEJOX01BU0syOworICAgIGMgKz0gKGwgPCB0KTsKKyAgICByWzJdID0gbDsKKyAgICB0ID0gYVszXTsKKyAgICB0ID0gKHQgKyBjKSAmIEJOX01BU0syOworICAgIGMgPSAodCA8IGMpOworICAgIGwgPSAodCArIGJbM10pICYgQk5fTUFTSzI7CisgICAgYyArPSAobCA8IHQpOworICAgIHJbM10gPSBsOworICAgIGEgKz0gNDsKKyAgICBiICs9IDQ7CisgICAgciArPSA0OworICAgIG4gLT0gNDsKKyAgfQorICB3aGlsZSAobikgeworICAgIHQgPSBhWzBdOworICAgIHQgPSAodCArIGMpICYgQk5fTUFTSzI7CisgICAgYyA9ICh0IDwgYyk7CisgICAgbCA9ICh0ICsgYlswXSkgJiBCTl9NQVNLMjsKKyAgICBjICs9IChsIDwgdCk7CisgICAgclswXSA9IGw7CisgICAgYSsrOworICAgIGIrKzsKKyAgICByKys7CisgICAgbi0tOworICB9CisgIHJldHVybiAoQk5fVUxPTkcpYzsKK30KKworI2VuZGlmIC8qICFCTl9MTE9ORyAqLworCitCTl9VTE9ORyBibl9zdWJfd29yZHMoQk5fVUxPTkcgKnIsIGNvbnN0IEJOX1VMT05HICphLCBjb25zdCBCTl9VTE9ORyAqYiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbikgeworICBCTl9VTE9ORyB0MSwgdDI7CisgIGludCBjID0gMDsKKworICBhc3NlcnQobiA+PSAwKTsKKyAgaWYgKG4gPD0gMCkgeworICAgIHJldHVybiAoQk5fVUxPTkcpMDsKKyAgfQorCisgIHdoaWxlIChuICYgfjMpIHsKKyAgICB0MSA9IGFbMF07CisgICAgdDIgPSBiWzBdOworICAgIHJbMF0gPSAodDEgLSB0MiAtIGMpICYgQk5fTUFTSzI7CisgICAgaWYgKHQxICE9IHQyKQorICAgICAgYyA9ICh0MSA8IHQyKTsKKyAgICB0MSA9IGFbMV07CisgICAgdDIgPSBiWzFdOworICAgIHJbMV0gPSAodDEgLSB0MiAtIGMpICYgQk5fTUFTSzI7CisgICAgaWYgKHQxICE9IHQyKQorICAgICAgYyA9ICh0MSA8IHQyKTsKKyAgICB0MSA9IGFbMl07CisgICAgdDIgPSBiWzJdOworICAgIHJbMl0gPSAodDEgLSB0MiAtIGMpICYgQk5fTUFTSzI7CisgICAgaWYgKHQxICE9IHQyKQorICAgICAgYyA9ICh0MSA8IHQyKTsKKyAgICB0MSA9IGFbM107CisgICAgdDIgPSBiWzNdOworICAgIHJbM10gPSAodDEgLSB0MiAtIGMpICYgQk5fTUFTSzI7CisgICAgaWYgKHQxICE9IHQyKQorICAgICAgYyA9ICh0MSA8IHQyKTsKKyAgICBhICs9IDQ7CisgICAgYiArPSA0OworICAgIHIgKz0gNDsKKyAgICBuIC09IDQ7CisgIH0KKyAgd2hpbGUgKG4pIHsKKyAgICB0MSA9IGFbMF07CisgICAgdDIgPSBiWzBdOworICAgIHJbMF0gPSAodDEgLSB0MiAtIGMpICYgQk5fTUFTSzI7CisgICAgaWYgKHQxICE9IHQyKQorICAgICAgYyA9ICh0MSA8IHQyKTsKKyAgICBhKys7CisgICAgYisrOworICAgIHIrKzsKKyAgICBuLS07CisgIH0KKyAgcmV0dXJuIGM7Cit9CisKKy8qIG11bF9hZGRfYyhhLGIsYzAsYzEsYzIpICAtLSBjKz1hKmIgZm9yIHRocmVlIHdvcmQgbnVtYmVyIGM9KGMyLGMxLGMwKSAqLworLyogbXVsX2FkZF9jMihhLGIsYzAsYzEsYzIpIC0tIGMrPTIqYSpiIGZvciB0aHJlZSB3b3JkIG51bWJlciBjPShjMixjMSxjMCkgKi8KKy8qIHNxcl9hZGRfYyhhLGksYzAsYzEsYzIpICAtLSBjKz1hW2ldXjIgZm9yIHRocmVlIHdvcmQgbnVtYmVyIGM9KGMyLGMxLGMwKSAqLworLyogc3FyX2FkZF9jMihhLGksYzAsYzEsYzIpIC0tIGMrPTIqYVtpXSphW2pdIGZvciB0aHJlZSB3b3JkIG51bWJlciBjPShjMixjMSxjMCkgKi8KKworI2lmZGVmIEJOX0xMT05HCisjZGVmaW5lIG11bF9hZGRfYyhhLCBiLCBjMCwgYzEsIGMyKSBcCisgIHQgPSAoQk5fVUxMT05HKWEgKiBiOyAgICAgICAgICAgICBcCisgIHQxID0gKEJOX1VMT05HKUx3KHQpOyAgICAgICAgICAgICBcCisgIHQyID0gKEJOX1VMT05HKUh3KHQpOyAgICAgICAgICAgICBcCisgIGMwID0gKGMwICsgdDEpICYgQk5fTUFTSzI7ICAgICAgICBcCisgIGlmICgoYzApIDwgdDEpICAgICAgICAgICAgICAgICAgICBcCisgICAgdDIrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGMxID0gKGMxICsgdDIpICYgQk5fTUFTSzI7ICAgICAgICBcCisgIGlmICgoYzEpIDwgdDIpICAgICAgICAgICAgICAgICAgICBcCisgICAgYzIrKzsKKworI2RlZmluZSBtdWxfYWRkX2MyKGEsIGIsIGMwLCBjMSwgYzIpICAgICAgICAgICBcCisgIHQgPSAoQk5fVUxMT05HKWEgKiBiOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdHQgPSAodCArIHQpICYgQk5fTUFTSzsgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAodHQgPCB0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYzIrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDEgPSAoQk5fVUxPTkcpTHcodHQpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICB0MiA9IChCTl9VTE9ORylIdyh0dCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgIGMwID0gKGMwICsgdDEpICYgQk5fTUFTSzI7ICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKChjMCA8IHQxKSAmJiAoKCgrK3QyKSAmIEJOX01BU0syKSA9PSAwKSkgXAorICAgIGMyKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGMxID0gKGMxICsgdDIpICYgQk5fTUFTSzI7ICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKChjMSkgPCB0MikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGMyKys7CisKKyNkZWZpbmUgc3FyX2FkZF9jKGEsIGksIGMwLCBjMSwgYzIpIFwKKyAgdCA9IChCTl9VTExPTkcpYVtpXSAqIGFbaV07ICAgICAgIFwKKyAgdDEgPSAoQk5fVUxPTkcpTHcodCk7ICAgICAgICAgICAgIFwKKyAgdDIgPSAoQk5fVUxPTkcpSHcodCk7ICAgICAgICAgICAgIFwKKyAgYzAgPSAoYzAgKyB0MSkgJiBCTl9NQVNLMjsgICAgICAgIFwKKyAgaWYgKChjMCkgPCB0MSkgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0MisrOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYzEgPSAoYzEgKyB0MikgJiBCTl9NQVNLMjsgICAgICAgIFwKKyAgaWYgKChjMSkgPCB0MikgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjMisrOworCisjZGVmaW5lIHNxcl9hZGRfYzIoYSwgaSwgaiwgYzAsIGMxLCBjMikgbXVsX2FkZF9jMigoYSlbaV0sIChhKVtqXSwgYzAsIGMxLCBjMikKKworI2VsaWYgZGVmaW5lZChCTl9VTVVMVF9MT0hJKQorCisjZGVmaW5lIG11bF9hZGRfYyhhLCBiLCBjMCwgYzEsIGMyKSBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQk5fVUxPTkcgdGEgPSAoYSksIHRiID0gKGIpOyAgICBcCisgICAgQk5fVU1VTFRfTE9ISSh0MSwgdDIsIHRhLCB0Yik7ICBcCisgICAgYzAgKz0gdDE7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdDIgKz0gKGMwIDwgdDEpID8gMSA6IDA7ICAgICAgICBcCisgICAgYzEgKz0gdDI7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYzIgKz0gKGMxIDwgdDIpID8gMSA6IDA7ICAgICAgICBcCisgIH0KKworI2RlZmluZSBtdWxfYWRkX2MyKGEsIGIsIGMwLCBjMSwgYzIpIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQk5fVUxPTkcgdGEgPSAoYSksIHRiID0gKGIpLCB0MDsgXAorICAgIEJOX1VNVUxUX0xPSEkodDAsIHQxLCB0YSwgdGIpOyAgIFwKKyAgICB0MiA9IHQxICsgdDE7ICAgICAgICAgICAgICAgICAgICBcCisgICAgYzIgKz0gKHQyIDwgdDEpID8gMSA6IDA7ICAgICAgICAgXAorICAgIHQxID0gdDAgKyB0MDsgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0MiArPSAodDEgPCB0MCkgPyAxIDogMDsgICAgICAgICBcCisgICAgYzAgKz0gdDE7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHQyICs9IChjMCA8IHQxKSA/IDEgOiAwOyAgICAgICAgIFwKKyAgICBjMSArPSB0MjsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYzIgKz0gKGMxIDwgdDIpID8gMSA6IDA7ICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgc3FyX2FkZF9jKGEsIGksIGMwLCBjMSwgYzIpIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCTl9VTE9ORyB0YSA9IChhKVtpXTsgICAgICAgICAgIFwKKyAgICBCTl9VTVVMVF9MT0hJKHQxLCB0MiwgdGEsIHRhKTsgIFwKKyAgICBjMCArPSB0MTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0MiArPSAoYzAgPCB0MSkgPyAxIDogMDsgICAgICAgIFwKKyAgICBjMSArPSB0MjsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjMiArPSAoYzEgPCB0MikgPyAxIDogMDsgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIHNxcl9hZGRfYzIoYSwgaSwgaiwgYzAsIGMxLCBjMikgbXVsX2FkZF9jMigoYSlbaV0sIChhKVtqXSwgYzAsIGMxLCBjMikKKworI2VsaWYgZGVmaW5lZChCTl9VTVVMVF9ISUdIKQorCisjZGVmaW5lIG11bF9hZGRfYyhhLCBiLCBjMCwgYzEsIGMyKSBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQk5fVUxPTkcgdGEgPSAoYSksIHRiID0gKGIpOyAgICBcCisgICAgdDEgPSB0YSAqIHRiOyAgICAgICAgICAgICAgICAgICBcCisgICAgdDIgPSBCTl9VTVVMVF9ISUdIKHRhLCB0Yik7ICAgICBcCisgICAgYzAgKz0gdDE7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdDIgKz0gKGMwIDwgdDEpID8gMSA6IDA7ICAgICAgICBcCisgICAgYzEgKz0gdDI7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYzIgKz0gKGMxIDwgdDIpID8gMSA6IDA7ICAgICAgICBcCisgIH0KKworI2RlZmluZSBtdWxfYWRkX2MyKGEsIGIsIGMwLCBjMSwgYzIpIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQk5fVUxPTkcgdGEgPSAoYSksIHRiID0gKGIpLCB0MDsgXAorICAgIHQxID0gQk5fVU1VTFRfSElHSCh0YSwgdGIpOyAgICAgIFwKKyAgICB0MCA9IHRhICogdGI7ICAgICAgICAgICAgICAgICAgICBcCisgICAgdDIgPSB0MSArIHQxOyAgICAgICAgICAgICAgICAgICAgXAorICAgIGMyICs9ICh0MiA8IHQxKSA/IDEgOiAwOyAgICAgICAgIFwKKyAgICB0MSA9IHQwICsgdDA7ICAgICAgICAgICAgICAgICAgICBcCisgICAgdDIgKz0gKHQxIDwgdDApID8gMSA6IDA7ICAgICAgICAgXAorICAgIGMwICs9IHQxOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0MiArPSAoYzAgPCB0MSkgPyAxIDogMDsgICAgICAgICBcCisgICAgYzEgKz0gdDI7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGMyICs9IChjMSA8IHQyKSA/IDEgOiAwOyAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIHNxcl9hZGRfYyhhLCBpLCBjMCwgYzEsIGMyKSBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQk5fVUxPTkcgdGEgPSAoYSlbaV07ICAgICAgICAgICBcCisgICAgdDEgPSB0YSAqIHRhOyAgICAgICAgICAgICAgICAgICBcCisgICAgdDIgPSBCTl9VTVVMVF9ISUdIKHRhLCB0YSk7ICAgICBcCisgICAgYzAgKz0gdDE7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdDIgKz0gKGMwIDwgdDEpID8gMSA6IDA7ICAgICAgICBcCisgICAgYzEgKz0gdDI7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYzIgKz0gKGMxIDwgdDIpID8gMSA6IDA7ICAgICAgICBcCisgIH0KKworI2RlZmluZSBzcXJfYWRkX2MyKGEsIGksIGosIGMwLCBjMSwgYzIpIG11bF9hZGRfYzIoKGEpW2ldLCAoYSlbal0sIGMwLCBjMSwgYzIpCisKKyNlbHNlIC8qICFCTl9MTE9ORyAqLworI2RlZmluZSBtdWxfYWRkX2MoYSwgYiwgYzAsIGMxLCBjMikgXAorICB0MSA9IExCSVRTKGEpOyAgICAgICAgICAgICAgICAgICAgXAorICB0MiA9IEhCSVRTKGEpOyAgICAgICAgICAgICAgICAgICAgXAorICBibCA9IExCSVRTKGIpOyAgICAgICAgICAgICAgICAgICAgXAorICBiaCA9IEhCSVRTKGIpOyAgICAgICAgICAgICAgICAgICAgXAorICBtdWw2NCh0MSwgdDIsIGJsLCBiaCk7ICAgICAgICAgICAgXAorICBjMCA9IChjMCArIHQxKSAmIEJOX01BU0syOyAgICAgICAgXAorICBpZiAoKGMwKSA8IHQxKSAgICAgICAgICAgICAgICAgICAgXAorICAgIHQyKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjMSA9IChjMSArIHQyKSAmIEJOX01BU0syOyAgICAgICAgXAorICBpZiAoKGMxKSA8IHQyKSAgICAgICAgICAgICAgICAgICAgXAorICAgIGMyKys7CisKKyNkZWZpbmUgbXVsX2FkZF9jMihhLCBiLCBjMCwgYzEsIGMyKSAgICAgICAgICAgXAorICB0MSA9IExCSVRTKGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQyID0gSEJJVFMoYSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYmwgPSBMQklUUyhiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBiaCA9IEhCSVRTKGIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG11bDY0KHQxLCB0MiwgYmwsIGJoKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKHQyICYgQk5fVEJJVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGMyKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQyID0gKHQyICsgdDIpICYgQk5fTUFTSzI7ICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKHQxICYgQk5fVEJJVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHQyKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQxID0gKHQxICsgdDEpICYgQk5fTUFTSzI7ICAgICAgICAgICAgICAgICAgIFwKKyAgYzAgPSAoYzAgKyB0MSkgJiBCTl9NQVNLMjsgICAgICAgICAgICAgICAgICAgXAorICBpZiAoKGMwIDwgdDEpICYmICgoKCsrdDIpICYgQk5fTUFTSzIpID09IDApKSBcCisgICAgYzIrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYzEgPSAoYzEgKyB0MikgJiBCTl9NQVNLMjsgICAgICAgICAgICAgICAgICAgXAorICBpZiAoKGMxKSA8IHQyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYzIrKzsKKworI2RlZmluZSBzcXJfYWRkX2MoYSwgaSwgYzAsIGMxLCBjMikgXAorICBzcXI2NCh0MSwgdDIsIChhKVtpXSk7ICAgICAgICAgICAgXAorICBjMCA9IChjMCArIHQxKSAmIEJOX01BU0syOyAgICAgICAgXAorICBpZiAoKGMwKSA8IHQxKSAgICAgICAgICAgICAgICAgICAgXAorICAgIHQyKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjMSA9IChjMSArIHQyKSAmIEJOX01BU0syOyAgICAgICAgXAorICBpZiAoKGMxKSA8IHQyKSAgICAgICAgICAgICAgICAgICAgXAorICAgIGMyKys7CisKKyNkZWZpbmUgc3FyX2FkZF9jMihhLCBpLCBqLCBjMCwgYzEsIGMyKSBtdWxfYWRkX2MyKChhKVtpXSwgKGEpW2pdLCBjMCwgYzEsIGMyKQorI2VuZGlmIC8qICFCTl9MTE9ORyAqLworCit2b2lkIGJuX211bF9jb21iYTgoQk5fVUxPTkcgKnIsIEJOX1VMT05HICphLCBCTl9VTE9ORyAqYikgeworI2lmZGVmIEJOX0xMT05HCisgIEJOX1VMTE9ORyB0OworI2Vsc2UKKyAgQk5fVUxPTkcgYmwsIGJoOworI2VuZGlmCisgIEJOX1VMT05HIHQxLCB0MjsKKyAgQk5fVUxPTkcgYzEsIGMyLCBjMzsKKworICBjMSA9IDA7CisgIGMyID0gMDsKKyAgYzMgPSAwOworICBtdWxfYWRkX2MoYVswXSwgYlswXSwgYzEsIGMyLCBjMyk7CisgIHJbMF0gPSBjMTsKKyAgYzEgPSAwOworICBtdWxfYWRkX2MoYVswXSwgYlsxXSwgYzIsIGMzLCBjMSk7CisgIG11bF9hZGRfYyhhWzFdLCBiWzBdLCBjMiwgYzMsIGMxKTsKKyAgclsxXSA9IGMyOworICBjMiA9IDA7CisgIG11bF9hZGRfYyhhWzJdLCBiWzBdLCBjMywgYzEsIGMyKTsKKyAgbXVsX2FkZF9jKGFbMV0sIGJbMV0sIGMzLCBjMSwgYzIpOworICBtdWxfYWRkX2MoYVswXSwgYlsyXSwgYzMsIGMxLCBjMik7CisgIHJbMl0gPSBjMzsKKyAgYzMgPSAwOworICBtdWxfYWRkX2MoYVswXSwgYlszXSwgYzEsIGMyLCBjMyk7CisgIG11bF9hZGRfYyhhWzFdLCBiWzJdLCBjMSwgYzIsIGMzKTsKKyAgbXVsX2FkZF9jKGFbMl0sIGJbMV0sIGMxLCBjMiwgYzMpOworICBtdWxfYWRkX2MoYVszXSwgYlswXSwgYzEsIGMyLCBjMyk7CisgIHJbM10gPSBjMTsKKyAgYzEgPSAwOworICBtdWxfYWRkX2MoYVs0XSwgYlswXSwgYzIsIGMzLCBjMSk7CisgIG11bF9hZGRfYyhhWzNdLCBiWzFdLCBjMiwgYzMsIGMxKTsKKyAgbXVsX2FkZF9jKGFbMl0sIGJbMl0sIGMyLCBjMywgYzEpOworICBtdWxfYWRkX2MoYVsxXSwgYlszXSwgYzIsIGMzLCBjMSk7CisgIG11bF9hZGRfYyhhWzBdLCBiWzRdLCBjMiwgYzMsIGMxKTsKKyAgcls0XSA9IGMyOworICBjMiA9IDA7CisgIG11bF9hZGRfYyhhWzBdLCBiWzVdLCBjMywgYzEsIGMyKTsKKyAgbXVsX2FkZF9jKGFbMV0sIGJbNF0sIGMzLCBjMSwgYzIpOworICBtdWxfYWRkX2MoYVsyXSwgYlszXSwgYzMsIGMxLCBjMik7CisgIG11bF9hZGRfYyhhWzNdLCBiWzJdLCBjMywgYzEsIGMyKTsKKyAgbXVsX2FkZF9jKGFbNF0sIGJbMV0sIGMzLCBjMSwgYzIpOworICBtdWxfYWRkX2MoYVs1XSwgYlswXSwgYzMsIGMxLCBjMik7CisgIHJbNV0gPSBjMzsKKyAgYzMgPSAwOworICBtdWxfYWRkX2MoYVs2XSwgYlswXSwgYzEsIGMyLCBjMyk7CisgIG11bF9hZGRfYyhhWzVdLCBiWzFdLCBjMSwgYzIsIGMzKTsKKyAgbXVsX2FkZF9jKGFbNF0sIGJbMl0sIGMxLCBjMiwgYzMpOworICBtdWxfYWRkX2MoYVszXSwgYlszXSwgYzEsIGMyLCBjMyk7CisgIG11bF9hZGRfYyhhWzJdLCBiWzRdLCBjMSwgYzIsIGMzKTsKKyAgbXVsX2FkZF9jKGFbMV0sIGJbNV0sIGMxLCBjMiwgYzMpOworICBtdWxfYWRkX2MoYVswXSwgYls2XSwgYzEsIGMyLCBjMyk7CisgIHJbNl0gPSBjMTsKKyAgYzEgPSAwOworICBtdWxfYWRkX2MoYVswXSwgYls3XSwgYzIsIGMzLCBjMSk7CisgIG11bF9hZGRfYyhhWzFdLCBiWzZdLCBjMiwgYzMsIGMxKTsKKyAgbXVsX2FkZF9jKGFbMl0sIGJbNV0sIGMyLCBjMywgYzEpOworICBtdWxfYWRkX2MoYVszXSwgYls0XSwgYzIsIGMzLCBjMSk7CisgIG11bF9hZGRfYyhhWzRdLCBiWzNdLCBjMiwgYzMsIGMxKTsKKyAgbXVsX2FkZF9jKGFbNV0sIGJbMl0sIGMyLCBjMywgYzEpOworICBtdWxfYWRkX2MoYVs2XSwgYlsxXSwgYzIsIGMzLCBjMSk7CisgIG11bF9hZGRfYyhhWzddLCBiWzBdLCBjMiwgYzMsIGMxKTsKKyAgcls3XSA9IGMyOworICBjMiA9IDA7CisgIG11bF9hZGRfYyhhWzddLCBiWzFdLCBjMywgYzEsIGMyKTsKKyAgbXVsX2FkZF9jKGFbNl0sIGJbMl0sIGMzLCBjMSwgYzIpOworICBtdWxfYWRkX2MoYVs1XSwgYlszXSwgYzMsIGMxLCBjMik7CisgIG11bF9hZGRfYyhhWzRdLCBiWzRdLCBjMywgYzEsIGMyKTsKKyAgbXVsX2FkZF9jKGFbM10sIGJbNV0sIGMzLCBjMSwgYzIpOworICBtdWxfYWRkX2MoYVsyXSwgYls2XSwgYzMsIGMxLCBjMik7CisgIG11bF9hZGRfYyhhWzFdLCBiWzddLCBjMywgYzEsIGMyKTsKKyAgcls4XSA9IGMzOworICBjMyA9IDA7CisgIG11bF9hZGRfYyhhWzJdLCBiWzddLCBjMSwgYzIsIGMzKTsKKyAgbXVsX2FkZF9jKGFbM10sIGJbNl0sIGMxLCBjMiwgYzMpOworICBtdWxfYWRkX2MoYVs0XSwgYls1XSwgYzEsIGMyLCBjMyk7CisgIG11bF9hZGRfYyhhWzVdLCBiWzRdLCBjMSwgYzIsIGMzKTsKKyAgbXVsX2FkZF9jKGFbNl0sIGJbM10sIGMxLCBjMiwgYzMpOworICBtdWxfYWRkX2MoYVs3XSwgYlsyXSwgYzEsIGMyLCBjMyk7CisgIHJbOV0gPSBjMTsKKyAgYzEgPSAwOworICBtdWxfYWRkX2MoYVs3XSwgYlszXSwgYzIsIGMzLCBjMSk7CisgIG11bF9hZGRfYyhhWzZdLCBiWzRdLCBjMiwgYzMsIGMxKTsKKyAgbXVsX2FkZF9jKGFbNV0sIGJbNV0sIGMyLCBjMywgYzEpOworICBtdWxfYWRkX2MoYVs0XSwgYls2XSwgYzIsIGMzLCBjMSk7CisgIG11bF9hZGRfYyhhWzNdLCBiWzddLCBjMiwgYzMsIGMxKTsKKyAgclsxMF0gPSBjMjsKKyAgYzIgPSAwOworICBtdWxfYWRkX2MoYVs0XSwgYls3XSwgYzMsIGMxLCBjMik7CisgIG11bF9hZGRfYyhhWzVdLCBiWzZdLCBjMywgYzEsIGMyKTsKKyAgbXVsX2FkZF9jKGFbNl0sIGJbNV0sIGMzLCBjMSwgYzIpOworICBtdWxfYWRkX2MoYVs3XSwgYls0XSwgYzMsIGMxLCBjMik7CisgIHJbMTFdID0gYzM7CisgIGMzID0gMDsKKyAgbXVsX2FkZF9jKGFbN10sIGJbNV0sIGMxLCBjMiwgYzMpOworICBtdWxfYWRkX2MoYVs2XSwgYls2XSwgYzEsIGMyLCBjMyk7CisgIG11bF9hZGRfYyhhWzVdLCBiWzddLCBjMSwgYzIsIGMzKTsKKyAgclsxMl0gPSBjMTsKKyAgYzEgPSAwOworICBtdWxfYWRkX2MoYVs2XSwgYls3XSwgYzIsIGMzLCBjMSk7CisgIG11bF9hZGRfYyhhWzddLCBiWzZdLCBjMiwgYzMsIGMxKTsKKyAgclsxM10gPSBjMjsKKyAgYzIgPSAwOworICBtdWxfYWRkX2MoYVs3XSwgYls3XSwgYzMsIGMxLCBjMik7CisgIHJbMTRdID0gYzM7CisgIHJbMTVdID0gYzE7Cit9CisKK3ZvaWQgYm5fbXVsX2NvbWJhNChCTl9VTE9ORyAqciwgQk5fVUxPTkcgKmEsIEJOX1VMT05HICpiKSB7CisjaWZkZWYgQk5fTExPTkcKKyAgQk5fVUxMT05HIHQ7CisjZWxzZQorICBCTl9VTE9ORyBibCwgYmg7CisjZW5kaWYKKyAgQk5fVUxPTkcgdDEsIHQyOworICBCTl9VTE9ORyBjMSwgYzIsIGMzOworCisgIGMxID0gMDsKKyAgYzIgPSAwOworICBjMyA9IDA7CisgIG11bF9hZGRfYyhhWzBdLCBiWzBdLCBjMSwgYzIsIGMzKTsKKyAgclswXSA9IGMxOworICBjMSA9IDA7CisgIG11bF9hZGRfYyhhWzBdLCBiWzFdLCBjMiwgYzMsIGMxKTsKKyAgbXVsX2FkZF9jKGFbMV0sIGJbMF0sIGMyLCBjMywgYzEpOworICByWzFdID0gYzI7CisgIGMyID0gMDsKKyAgbXVsX2FkZF9jKGFbMl0sIGJbMF0sIGMzLCBjMSwgYzIpOworICBtdWxfYWRkX2MoYVsxXSwgYlsxXSwgYzMsIGMxLCBjMik7CisgIG11bF9hZGRfYyhhWzBdLCBiWzJdLCBjMywgYzEsIGMyKTsKKyAgclsyXSA9IGMzOworICBjMyA9IDA7CisgIG11bF9hZGRfYyhhWzBdLCBiWzNdLCBjMSwgYzIsIGMzKTsKKyAgbXVsX2FkZF9jKGFbMV0sIGJbMl0sIGMxLCBjMiwgYzMpOworICBtdWxfYWRkX2MoYVsyXSwgYlsxXSwgYzEsIGMyLCBjMyk7CisgIG11bF9hZGRfYyhhWzNdLCBiWzBdLCBjMSwgYzIsIGMzKTsKKyAgclszXSA9IGMxOworICBjMSA9IDA7CisgIG11bF9hZGRfYyhhWzNdLCBiWzFdLCBjMiwgYzMsIGMxKTsKKyAgbXVsX2FkZF9jKGFbMl0sIGJbMl0sIGMyLCBjMywgYzEpOworICBtdWxfYWRkX2MoYVsxXSwgYlszXSwgYzIsIGMzLCBjMSk7CisgIHJbNF0gPSBjMjsKKyAgYzIgPSAwOworICBtdWxfYWRkX2MoYVsyXSwgYlszXSwgYzMsIGMxLCBjMik7CisgIG11bF9hZGRfYyhhWzNdLCBiWzJdLCBjMywgYzEsIGMyKTsKKyAgcls1XSA9IGMzOworICBjMyA9IDA7CisgIG11bF9hZGRfYyhhWzNdLCBiWzNdLCBjMSwgYzIsIGMzKTsKKyAgcls2XSA9IGMxOworICByWzddID0gYzI7Cit9CisKK3ZvaWQgYm5fc3FyX2NvbWJhOChCTl9VTE9ORyAqciwgY29uc3QgQk5fVUxPTkcgKmEpIHsKKyNpZmRlZiBCTl9MTE9ORworICBCTl9VTExPTkcgdCwgdHQ7CisjZWxzZQorICBCTl9VTE9ORyBibCwgYmg7CisjZW5kaWYKKyAgQk5fVUxPTkcgdDEsIHQyOworICBCTl9VTE9ORyBjMSwgYzIsIGMzOworCisgIGMxID0gMDsKKyAgYzIgPSAwOworICBjMyA9IDA7CisgIHNxcl9hZGRfYyhhLCAwLCBjMSwgYzIsIGMzKTsKKyAgclswXSA9IGMxOworICBjMSA9IDA7CisgIHNxcl9hZGRfYzIoYSwgMSwgMCwgYzIsIGMzLCBjMSk7CisgIHJbMV0gPSBjMjsKKyAgYzIgPSAwOworICBzcXJfYWRkX2MoYSwgMSwgYzMsIGMxLCBjMik7CisgIHNxcl9hZGRfYzIoYSwgMiwgMCwgYzMsIGMxLCBjMik7CisgIHJbMl0gPSBjMzsKKyAgYzMgPSAwOworICBzcXJfYWRkX2MyKGEsIDMsIDAsIGMxLCBjMiwgYzMpOworICBzcXJfYWRkX2MyKGEsIDIsIDEsIGMxLCBjMiwgYzMpOworICByWzNdID0gYzE7CisgIGMxID0gMDsKKyAgc3FyX2FkZF9jKGEsIDIsIGMyLCBjMywgYzEpOworICBzcXJfYWRkX2MyKGEsIDMsIDEsIGMyLCBjMywgYzEpOworICBzcXJfYWRkX2MyKGEsIDQsIDAsIGMyLCBjMywgYzEpOworICByWzRdID0gYzI7CisgIGMyID0gMDsKKyAgc3FyX2FkZF9jMihhLCA1LCAwLCBjMywgYzEsIGMyKTsKKyAgc3FyX2FkZF9jMihhLCA0LCAxLCBjMywgYzEsIGMyKTsKKyAgc3FyX2FkZF9jMihhLCAzLCAyLCBjMywgYzEsIGMyKTsKKyAgcls1XSA9IGMzOworICBjMyA9IDA7CisgIHNxcl9hZGRfYyhhLCAzLCBjMSwgYzIsIGMzKTsKKyAgc3FyX2FkZF9jMihhLCA0LCAyLCBjMSwgYzIsIGMzKTsKKyAgc3FyX2FkZF9jMihhLCA1LCAxLCBjMSwgYzIsIGMzKTsKKyAgc3FyX2FkZF9jMihhLCA2LCAwLCBjMSwgYzIsIGMzKTsKKyAgcls2XSA9IGMxOworICBjMSA9IDA7CisgIHNxcl9hZGRfYzIoYSwgNywgMCwgYzIsIGMzLCBjMSk7CisgIHNxcl9hZGRfYzIoYSwgNiwgMSwgYzIsIGMzLCBjMSk7CisgIHNxcl9hZGRfYzIoYSwgNSwgMiwgYzIsIGMzLCBjMSk7CisgIHNxcl9hZGRfYzIoYSwgNCwgMywgYzIsIGMzLCBjMSk7CisgIHJbN10gPSBjMjsKKyAgYzIgPSAwOworICBzcXJfYWRkX2MoYSwgNCwgYzMsIGMxLCBjMik7CisgIHNxcl9hZGRfYzIoYSwgNSwgMywgYzMsIGMxLCBjMik7CisgIHNxcl9hZGRfYzIoYSwgNiwgMiwgYzMsIGMxLCBjMik7CisgIHNxcl9hZGRfYzIoYSwgNywgMSwgYzMsIGMxLCBjMik7CisgIHJbOF0gPSBjMzsKKyAgYzMgPSAwOworICBzcXJfYWRkX2MyKGEsIDcsIDIsIGMxLCBjMiwgYzMpOworICBzcXJfYWRkX2MyKGEsIDYsIDMsIGMxLCBjMiwgYzMpOworICBzcXJfYWRkX2MyKGEsIDUsIDQsIGMxLCBjMiwgYzMpOworICByWzldID0gYzE7CisgIGMxID0gMDsKKyAgc3FyX2FkZF9jKGEsIDUsIGMyLCBjMywgYzEpOworICBzcXJfYWRkX2MyKGEsIDYsIDQsIGMyLCBjMywgYzEpOworICBzcXJfYWRkX2MyKGEsIDcsIDMsIGMyLCBjMywgYzEpOworICByWzEwXSA9IGMyOworICBjMiA9IDA7CisgIHNxcl9hZGRfYzIoYSwgNywgNCwgYzMsIGMxLCBjMik7CisgIHNxcl9hZGRfYzIoYSwgNiwgNSwgYzMsIGMxLCBjMik7CisgIHJbMTFdID0gYzM7CisgIGMzID0gMDsKKyAgc3FyX2FkZF9jKGEsIDYsIGMxLCBjMiwgYzMpOworICBzcXJfYWRkX2MyKGEsIDcsIDUsIGMxLCBjMiwgYzMpOworICByWzEyXSA9IGMxOworICBjMSA9IDA7CisgIHNxcl9hZGRfYzIoYSwgNywgNiwgYzIsIGMzLCBjMSk7CisgIHJbMTNdID0gYzI7CisgIGMyID0gMDsKKyAgc3FyX2FkZF9jKGEsIDcsIGMzLCBjMSwgYzIpOworICByWzE0XSA9IGMzOworICByWzE1XSA9IGMxOworfQorCit2b2lkIGJuX3Nxcl9jb21iYTQoQk5fVUxPTkcgKnIsIGNvbnN0IEJOX1VMT05HICphKSB7CisjaWZkZWYgQk5fTExPTkcKKyAgQk5fVUxMT05HIHQsIHR0OworI2Vsc2UKKyAgQk5fVUxPTkcgYmwsIGJoOworI2VuZGlmCisgIEJOX1VMT05HIHQxLCB0MjsKKyAgQk5fVUxPTkcgYzEsIGMyLCBjMzsKKworICBjMSA9IDA7CisgIGMyID0gMDsKKyAgYzMgPSAwOworICBzcXJfYWRkX2MoYSwgMCwgYzEsIGMyLCBjMyk7CisgIHJbMF0gPSBjMTsKKyAgYzEgPSAwOworICBzcXJfYWRkX2MyKGEsIDEsIDAsIGMyLCBjMywgYzEpOworICByWzFdID0gYzI7CisgIGMyID0gMDsKKyAgc3FyX2FkZF9jKGEsIDEsIGMzLCBjMSwgYzIpOworICBzcXJfYWRkX2MyKGEsIDIsIDAsIGMzLCBjMSwgYzIpOworICByWzJdID0gYzM7CisgIGMzID0gMDsKKyAgc3FyX2FkZF9jMihhLCAzLCAwLCBjMSwgYzIsIGMzKTsKKyAgc3FyX2FkZF9jMihhLCAyLCAxLCBjMSwgYzIsIGMzKTsKKyAgclszXSA9IGMxOworICBjMSA9IDA7CisgIHNxcl9hZGRfYyhhLCAyLCBjMiwgYzMsIGMxKTsKKyAgc3FyX2FkZF9jMihhLCAzLCAxLCBjMiwgYzMsIGMxKTsKKyAgcls0XSA9IGMyOworICBjMiA9IDA7CisgIHNxcl9hZGRfYzIoYSwgMywgMiwgYzMsIGMxLCBjMik7CisgIHJbNV0gPSBjMzsKKyAgYzMgPSAwOworICBzcXJfYWRkX2MoYSwgMywgYzEsIGMyLCBjMyk7CisgIHJbNl0gPSBjMTsKKyAgcls3XSA9IGMyOworfQorCisjaWYgZGVmaW5lZChPUEVOU1NMX05PX0FTTSkgfHwgKCFkZWZpbmVkKE9QRU5TU0xfQVJNKSAmJiAhZGVmaW5lZChPUEVOU1NMX1g4Nl82NCkpCisvKiBUaGlzIGlzIGVzc2VudGlhbGx5IHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggbWF5IG9yIG1heSBub3QKKyAqIHJlc3VsdCBpbiBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudC4gRS5nLiBvbiBJQS0zMiB0aGlzIHJvdXRpbmUgd2FzCisgKiBvYnNlcnZlZCB0byBnaXZlIDQwJSBmYXN0ZXIgcnNhMTAyNCBwcml2YXRlIGtleSBvcGVyYXRpb25zIGFuZCAxMCUKKyAqIGZhc3RlciByc2E0MDk2IG9uZXMsIHdoaWxlIG9uIEFNRDY0IGl0IGltcHJvdmVzIHJzYTEwMjQgc2lnbiBvbmx5CisgKiBieSAxMCUgYW5kICp3b3JzZW5zKiByc2E0MDk2IHNpZ24gYnkgMTUlLiBPbmNlIGFnYWluLCBpdCdzIGEKKyAqIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiwgb25lIHRvIGJlIHVzZWQgYXMgc3RhcnRpbmcgcG9pbnQgZm9yCisgKiBwbGF0Zm9ybS1zcGVjaWZpYyBhc3NlbWJsZXIuIE1lbnRpb25lZCBudW1iZXJzIGFwcGx5IHRvIGNvbXBpbGVyCisgKiBnZW5lcmF0ZWQgY29kZSBjb21waWxlZCB3aXRoIGFuZCB3aXRob3V0IC1ET1BFTlNTTF9CTl9BU01fTU9OVCBhbmQKKyAqIGNhbiB2YXJ5IG5vdCBvbmx5IGZyb20gcGxhdGZvcm0gdG8gcGxhdGZvcm0sIGJ1dCBldmVuIGZvciBjb21waWxlcgorICogdmVyc2lvbnMuIEFzc2VtYmxlciB2cy4gYXNzZW1ibGVyIGltcHJvdmVtZW50IGNvZWZmaWNpZW50cyBjYW4KKyAqIFthbmQgYXJlIGtub3duIHRvXSBkaWZmZXIgYW5kIGFyZSB0byBiZSBkb2N1bWVudGVkIGVsc2V3aGVyZS4gKi8KK2ludCBibl9tdWxfbW9udChCTl9VTE9ORyAqcnAsIGNvbnN0IEJOX1VMT05HICphcCwgY29uc3QgQk5fVUxPTkcgKmJwLAorICAgICAgICAgICAgICAgIGNvbnN0IEJOX1VMT05HICpucCwgY29uc3QgQk5fVUxPTkcgKm4wcCwgaW50IG51bSkgeworICBCTl9VTE9ORyBjMCwgYzEsIG1sLCAqdHAsIG4wOworI2lmZGVmIG11bDY0CisgIEJOX1VMT05HIG1oOworI2VuZGlmCisgIHZvbGF0aWxlIEJOX1VMT05HICp2cDsKKyAgaW50IGkgPSAwLCBqOworCisjaWYgMCAvKiB0ZW1wbGF0ZSBmb3IgcGxhdGZvcm0tc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gKi8KKwlpZiAoYXA9PWJwKQlyZXR1cm4gYm5fc3FyX21vbnQocnAsYXAsbnAsbjBwLG51bSk7CisjZW5kaWYKKyAgdnAgPSB0cCA9IGFsbG9jYSgobnVtICsgMikgKiBzaXplb2YoQk5fVUxPTkcpKTsKKworICBuMCA9ICpuMHA7CisKKyAgYzAgPSAwOworICBtbCA9IGJwWzBdOworI2lmZGVmIG11bDY0CisgIG1oID0gSEJJVFMobWwpOworICBtbCA9IExCSVRTKG1sKTsKKyAgZm9yIChqID0gMDsgaiA8IG51bTsgKytqKQorICAgIG11bCh0cFtqXSwgYXBbal0sIG1sLCBtaCwgYzApOworI2Vsc2UKKyAgZm9yIChqID0gMDsgaiA8IG51bTsgKytqKQorICAgIG11bCh0cFtqXSwgYXBbal0sIG1sLCBjMCk7CisjZW5kaWYKKworICB0cFtudW1dID0gYzA7CisgIHRwW251bSArIDFdID0gMDsKKyAgZ290byBlbnRlcjsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKyAgICBjMCA9IDA7CisgICAgbWwgPSBicFtpXTsKKyNpZmRlZiBtdWw2NAorICAgIG1oID0gSEJJVFMobWwpOworICAgIG1sID0gTEJJVFMobWwpOworICAgIGZvciAoaiA9IDA7IGogPCBudW07ICsraikKKyAgICAgIG11bF9hZGQodHBbal0sIGFwW2pdLCBtbCwgbWgsIGMwKTsKKyNlbHNlCisgICAgZm9yIChqID0gMDsgaiA8IG51bTsgKytqKQorICAgICAgbXVsX2FkZCh0cFtqXSwgYXBbal0sIG1sLCBjMCk7CisjZW5kaWYKKyAgICBjMSA9ICh0cFtudW1dICsgYzApICYgQk5fTUFTSzI7CisgICAgdHBbbnVtXSA9IGMxOworICAgIHRwW251bSArIDFdID0gKGMxIDwgYzAgPyAxIDogMCk7CisgIGVudGVyOgorICAgIGMxID0gdHBbMF07CisgICAgbWwgPSAoYzEgKiBuMCkgJiBCTl9NQVNLMjsKKyAgICBjMCA9IDA7CisjaWZkZWYgbXVsNjQKKyAgICBtaCA9IEhCSVRTKG1sKTsKKyAgICBtbCA9IExCSVRTKG1sKTsKKyAgICBtdWxfYWRkKGMxLCBucFswXSwgbWwsIG1oLCBjMCk7CisjZWxzZQorICAgIG11bF9hZGQoYzEsIG1sLCBucFswXSwgYzApOworI2VuZGlmCisgICAgZm9yIChqID0gMTsgaiA8IG51bTsgaisrKSB7CisgICAgICBjMSA9IHRwW2pdOworI2lmZGVmIG11bDY0CisgICAgICBtdWxfYWRkKGMxLCBucFtqXSwgbWwsIG1oLCBjMCk7CisjZWxzZQorICAgICAgbXVsX2FkZChjMSwgbWwsIG5wW2pdLCBjMCk7CisjZW5kaWYKKyAgICAgIHRwW2ogLSAxXSA9IGMxICYgQk5fTUFTSzI7CisgICAgfQorICAgIGMxID0gKHRwW251bV0gKyBjMCkgJiBCTl9NQVNLMjsKKyAgICB0cFtudW0gLSAxXSA9IGMxOworICAgIHRwW251bV0gPSB0cFtudW0gKyAxXSArIChjMSA8IGMwID8gMSA6IDApOworICB9CisKKyAgaWYgKHRwW251bV0gIT0gMCB8fCB0cFtudW0gLSAxXSA+PSBucFtudW0gLSAxXSkgeworICAgIGMwID0gYm5fc3ViX3dvcmRzKHJwLCB0cCwgbnAsIG51bSk7CisgICAgaWYgKHRwW251bV0gIT0gMCB8fCBjMCA9PSAwKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtICsgMjsgaSsrKQorICAgICAgICB2cFtpXSA9IDA7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQorICAgIHJwW2ldID0gdHBbaV0sIHZwW2ldID0gMDsKKyAgdnBbbnVtXSA9IDA7CisgIHZwW251bSArIDFdID0gMDsKKyAgcmV0dXJuIDE7Cit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jcnlwdG8vYm4vaW50ZXJuYWwuaCBiL2NyeXB0by9ibi9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNmQ3NWQKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYm4vaW50ZXJuYWwuaApAQCAtMCwwICsxLDI5MSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFMTCBSSUdIVFMgUkVTRVJWRUQuCisgKgorICogUG9ydGlvbnMgb2YgdGhlIGF0dGFjaGVkIHNvZnR3YXJlICgiQ29udHJpYnV0aW9uIikgYXJlIGRldmVsb3BlZCBieQorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiwgYW5kIGFyZSBjb250cmlidXRlZCB0byB0aGUgT3BlblNTTCBwcm9qZWN0LgorICoKKyAqIFRoZSBDb250cmlidXRpb24gaXMgbGljZW5zZWQgcHVyc3VhbnQgdG8gdGhlIEVyaWMgWW91bmcgb3BlbiBzb3VyY2UKKyAqIGxpY2Vuc2UgcHJvdmlkZWQgYWJvdmUuCisgKgorICogVGhlIGJpbmFyeSBwb2x5bm9taWFsIGFyaXRobWV0aWMgc29mdHdhcmUgaXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5CisgKiBTaGV1ZWxpbmcgQ2hhbmcgU2hhbnR6IGFuZCBEb3VnbGFzIFN0ZWJpbGEgb2YgU3VuIE1pY3Jvc3lzdGVtcworICogTGFib3JhdG9yaWVzLiAqLworCisjaWZuZGVmIE9QRU5TU0xfSEVBREVSX0JOX0lOVEVSTkFMX0gKKyNkZWZpbmUgT1BFTlNTTF9IRUFERVJfQk5fSU5URVJOQUxfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9iYXNlLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogQk5fd2V4cGFuZCBlbnN1cmVzIHRoYXQgfGJufCBoYXMgYXQgbGVhc3QgfHdvcmRzfCB3b3JrcyBvZiBzcGFjZSB3aXRob3V0CisgKiBhbHRlcmluZyBpdHMgdmFsdWUuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3Mgb3IgemVybyBvbiBhbGxvY2F0aW9uCisgKiBmYWlsdXJlLiAqLworQklHTlVNICpibl93ZXhwYW5kKEJJR05VTSAqYm4sIHVuc2lnbmVkIHdvcmRzKTsKKworLyogYm5fZXhwYW5kIGFjdHMgdGhlIHNhbWUgYXMgfEJOX3dleHBhbmR8LCBidXQgdGFrZXMgYSBudW1iZXIgb2YgYml0cyByYXRoZXIKKyAqIHRoYW4gYSBudW1iZXIgb2Ygd29yZHMuICovCitCSUdOVU0gKmJuX2V4cGFuZChCSUdOVU0gKmJuLCB1bnNpZ25lZCBiaXRzKTsKKworLyogYm5fY29ycmVjdF90b3AgZGVjcmVtZW50cyB8Ym4tPnRvcHwgdW50aWwgfGJuLT5kW3RvcC0xXXwgaXMgbm9uLXplcm8gb3IKKyAqIHVudGlsIHx0b3B8IGlzIHplcm8uICovCit2b2lkIGJuX2NvcnJlY3RfdG9wKEJJR05VTSAqYm4pOworCisjaWYgZGVmaW5lZChPUEVOU1NMXzY0X0JJVCkKKworI2RlZmluZSBCTl9VTExPTkcJdW5zaWduZWQgbG9uZyBsb25nCisjZGVmaW5lIEJOX0xPTkcJCWxvbmcKKyNkZWZpbmUgQk5fQklUUwkJMTI4CisjZGVmaW5lIEJOX0JZVEVTCTgKKyNkZWZpbmUgQk5fQklUUzQJMzIKKyNkZWZpbmUgQk5fTUFTSwkJKDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZMTCkKKyNkZWZpbmUgQk5fTUFTSzIJKDB4ZmZmZmZmZmZmZmZmZmZmZkwpCisjZGVmaW5lIEJOX01BU0sybAkoMHhmZmZmZmZmZkwpCisjZGVmaW5lIEJOX01BU0syaAkoMHhmZmZmZmZmZjAwMDAwMDAwTCkKKyNkZWZpbmUgQk5fTUFTSzJoMQkoMHhmZmZmZmZmZjgwMDAwMDAwTCkKKyNkZWZpbmUgQk5fVEJJVAkJKDB4ODAwMDAwMDAwMDAwMDAwMEwpCisjZGVmaW5lIEJOX0RFQ19DT05WCSgxMDAwMDAwMDAwMDAwMDAwMDAwMFVMKQorI2RlZmluZSBCTl9ERUNfRk1UMQkiJWx1IgorI2RlZmluZSBCTl9ERUNfRk1UMgkiJTAxOWx1IgorI2RlZmluZSBCTl9ERUNfTlVNCTE5CisjZGVmaW5lIEJOX0hFWF9GTVQxCSIlbFgiCisjZGVmaW5lIEJOX0hFWF9GTVQyCSIlMDE2bFgiCisKKyNlbGlmIGRlZmluZWQoT1BFTlNTTF8zMl9CSVQpCisKKyNkZWZpbmUgQk5fVUxMT05HCXVuc2lnbmVkIGxvbmcgbG9uZworI2RlZmluZSBCTl9NQVNLCSgweGZmZmZmZmZmZmZmZmZmZmZMTCkKKyNkZWZpbmUgQk5fTE9ORwkJaW50MzJfdAorI2RlZmluZSBCTl9CSVRTCQk2NAorI2RlZmluZSBCTl9CWVRFUwk0CisjZGVmaW5lIEJOX0JJVFM0CTE2CisjZGVmaW5lIEJOX01BU0syCSgweGZmZmZmZmZmTCkKKyNkZWZpbmUgQk5fTUFTSzJsCSgweGZmZmYpCisjZGVmaW5lIEJOX01BU0syaDEJKDB4ZmZmZjgwMDBMKQorI2RlZmluZSBCTl9NQVNLMmgJKDB4ZmZmZjAwMDBMKQorI2RlZmluZSBCTl9UQklUCQkoMHg4MDAwMDAwMEwpCisjZGVmaW5lIEJOX0RFQ19DT05WCSgxMDAwMDAwMDAwTCkKKyNkZWZpbmUgQk5fREVDX0ZNVDEJIiV1IgorI2RlZmluZSBCTl9ERUNfRk1UMgkiJTA5dSIKKyNkZWZpbmUgQk5fREVDX05VTQk5CisjZGVmaW5lIEJOX0hFWF9GTVQxCSIlWCIKKyNkZWZpbmUgQk5fSEVYX0ZNVDIJIiUwOFgiCisKKyNlbHNlCisjZXJyb3IgIk11c3QgZGVmaW5lIGVpdGhlciBPUEVOU1NMXzMyX0JJVCBvciBPUEVOU1NMXzY0X0JJVCIKKyNlbmRpZgorCisvKiBQZW50aXVtIHBybyAxNiwxNiwxNiwzMiw2NCAqLworLyogQWxwaGEgICAgICAgMTYsMTYsMTYsMTYuNjQgKi8KKyNkZWZpbmUgQk5fTVVMTF9TSVpFX05PUk1BTCAoMTYpICAgICAgICAgICAgICAvKiAzMiAqLworI2RlZmluZSBCTl9NVUxfUkVDVVJTSVZFX1NJWkVfTk9STUFMICgxNikgICAgIC8qIDMyIGxlc3MgdGhhbiAqLworI2RlZmluZSBCTl9TUVJfUkVDVVJTSVZFX1NJWkVfTk9STUFMICgxNikgICAgIC8qIDMyICovCisjZGVmaW5lIEJOX01VTF9MT1dfUkVDVVJTSVZFX1NJWkVfTk9STUFMICgzMikgLyogMzIgKi8KKyNkZWZpbmUgQk5fTU9OVF9DVFhfU0VUX1NJWkVfV09SRCAoNjQpICAgICAgICAvKiAzMiAqLworCitCTl9VTE9ORyBibl9tdWxfYWRkX3dvcmRzKEJOX1VMT05HICpycCwgY29uc3QgQk5fVUxPTkcgKmFwLCBpbnQgbnVtLCBCTl9VTE9ORyB3KTsKK0JOX1VMT05HIGJuX211bF93b3JkcyhCTl9VTE9ORyAqcnAsIGNvbnN0IEJOX1VMT05HICphcCwgaW50IG51bSwgQk5fVUxPTkcgdyk7Cit2b2lkICAgICBibl9zcXJfd29yZHMoQk5fVUxPTkcgKnJwLCBjb25zdCBCTl9VTE9ORyAqYXAsIGludCBudW0pOworQk5fVUxPTkcgYm5fZGl2X3dvcmRzKEJOX1VMT05HIGgsIEJOX1VMT05HIGwsIEJOX1VMT05HIGQpOworQk5fVUxPTkcgYm5fYWRkX3dvcmRzKEJOX1VMT05HICpycCwgY29uc3QgQk5fVUxPTkcgKmFwLCBjb25zdCBCTl9VTE9ORyAqYnAsaW50IG51bSk7CitCTl9VTE9ORyBibl9zdWJfd29yZHMoQk5fVUxPTkcgKnJwLCBjb25zdCBCTl9VTE9ORyAqYXAsIGNvbnN0IEJOX1VMT05HICpicCxpbnQgbnVtKTsKKwordm9pZCBibl9tdWxfY29tYmE0KEJOX1VMT05HICpyLCBCTl9VTE9ORyAqYSwgQk5fVUxPTkcgKmIpOwordm9pZCBibl9tdWxfY29tYmE4KEJOX1VMT05HICpyLCBCTl9VTE9ORyAqYSwgQk5fVUxPTkcgKmIpOwordm9pZCBibl9zcXJfY29tYmE4KEJOX1VMT05HICpyLCBjb25zdCBCTl9VTE9ORyAqYSk7Cit2b2lkIGJuX3Nxcl9jb21iYTQoQk5fVUxPTkcgKnIsIGNvbnN0IEJOX1VMT05HICphKTsKKworLyogYm5fY21wX3dvcmRzIHJldHVybnMgYSB2YWx1ZSBsZXNzIHRoYW4sIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbiB6ZXJvIGlmCisgKiB0aGUsIGxlbmd0aCB8bnwsIGFycmF5IHxhfCBpcyBsZXNzIHRoYW4sIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbiB8YnwuICovCitpbnQgYm5fY21wX3dvcmRzKGNvbnN0IEJOX1VMT05HICphLCBjb25zdCBCTl9VTE9ORyAqYiwgaW50IG4pOworCisvKiBibl9jbXBfd29yZHMgcmV0dXJucyBhIHZhbHVlIGxlc3MgdGhhbiwgZXF1YWwgdG8gb3IgZ3JlYXRlciB0aGFuIHplcm8gaWYgdGhlCisgKiBhcnJheSB8YXwgaXMgbGVzcyB0aGFuLCBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4gfGJ8LiBUaGUgYXJyYXlzIGNhbiBiZSBvZgorICogZGlmZmVyZW50IGxlbmd0aHM6IHxjbHwgZ2l2ZXMgdGhlIG1pbmltdW0gb2YgdGhlIHR3byBsZW5ndGhzIGFuZCB8ZGx8IGdpdmVzCisgKiB0aGUgbGVuZ3RoIG9mIHxhfCBtaW51cyB0aGUgbGVuZ3RoIG9mIHxifC4gKi8KK2ludCBibl9jbXBfcGFydF93b3Jkcyhjb25zdCBCTl9VTE9ORyAqYSwgY29uc3QgQk5fVUxPTkcgKmIsIGludCBjbCwgaW50IGRsKTsKKworaW50IGJuX211bF9tb250KEJOX1VMT05HICpycCwgY29uc3QgQk5fVUxPTkcgKmFwLCBjb25zdCBCTl9VTE9ORyAqYnAsCisgICAgICAgICAgICAgICAgY29uc3QgQk5fVUxPTkcgKm5wLCBjb25zdCBCTl9VTE9ORyAqbjAsIGludCBudW0pOworCisjZGVmaW5lIExCSVRTKGEpICgoYSkgJiBCTl9NQVNLMmwpCisjZGVmaW5lIEhCSVRTKGEpICgoKGEpID4+IEJOX0JJVFM0KSAmIEJOX01BU0sybCkKKyNkZWZpbmUgTDJIQklUUyhhKSAoKChhKSA8PCBCTl9CSVRTNCkgJiBCTl9NQVNLMikKKworI2RlZmluZSBMTEJJVFMoYSkgKChhKSAmIEJOX01BU0tsKQorI2RlZmluZSBMSEJJVFMoYSkgKCgoYSkgPj4gQk5fQklUUzIpICYgQk5fTUFTS2wpCisjZGVmaW5lIExMMkhCSVRTKGEpICgoQk5fVUxMT05HKSgoYSkgJiBCTl9NQVNLbCkgPDwgQk5fQklUUzIpCisKKyNkZWZpbmUgbXVsNjQobCwgaCwgYmwsIGJoKSAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJOX1VMT05HIG0sIG0xLCBsdCwgaHQ7ICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbHQgPSBsOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGh0ID0gaDsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtID0gKGJoKSAqIChsdCk7ICAgICAgICAgICAgICBcCisgICAgbHQgPSAoYmwpICogKGx0KTsgICAgICAgICAgICAgXAorICAgIG0xID0gKGJsKSAqIChodCk7ICAgICAgICAgICAgIFwKKyAgICBodCA9IChiaCkgKiAoaHQpOyAgICAgICAgICAgICBcCisgICAgbSA9IChtICsgbTEpICYgQk5fTUFTSzI7ICAgICAgXAorICAgIGlmIChtIDwgbTEpICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGh0ICs9IEwySEJJVFMoKEJOX1VMT05HKTEpOyBcCisgICAgaHQgKz0gSEJJVFMobSk7ICAgICAgICAgICAgICAgXAorICAgIG0xID0gTDJIQklUUyhtKTsgICAgICAgICAgICAgIFwKKyAgICBsdCA9IChsdCArIG0xKSAmIEJOX01BU0syOyAgICBcCisgICAgaWYgKGx0IDwgbTEpICAgICAgICAgICAgICAgICAgXAorICAgICAgaHQrKzsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAobCkgPSBsdDsgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGgpID0gaHQ7ICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNpZiAhZGVmaW5lZChPUEVOU1NMX05PX0FTTSkgJiYgZGVmaW5lZChPUEVOU1NMX1g4Nl82NCkKKyMgaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18+PTIKKyMgIGRlZmluZSBCTl9VTVVMVF9ISUdIKGEsYikJKHsJXAorCXJlZ2lzdGVyIEJOX1VMT05HIHJldCxkaXNjYXJkOwlcCisJX19hc21fXyAoIm11bHEJJTMiCQlcCisJICAgICA6ICI9YSIoZGlzY2FyZCksIj1kIihyZXQpCVwKKwkgICAgIDogImEiKGEpLCAiZyIoYikJCVwKKwkgICAgIDogImNjIik7CQkJXAorCXJldDsJCQl9KQorIyAgZGVmaW5lIEJOX1VNVUxUX0xPSEkobG93LGhpZ2gsYSxiKQlcCisJX19hc21fXyAoIm11bHEJJTMiCQlcCisJCTogIj1hIihsb3cpLCI9ZCIoaGlnaCkJXAorCQk6ICJhIihhKSwiZyIoYikJCVwKKwkJOiAiY2MiKTsKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVI+PTE0MDAKKyAgIHVuc2lnbmVkIF9faW50NjQgX191bXVsaAkodW5zaWduZWQgX19pbnQ2NCBhLHVuc2lnbmVkIF9faW50NjQgYik7CisgICB1bnNpZ25lZCBfX2ludDY0IF91bXVsMTI4CSh1bnNpZ25lZCBfX2ludDY0IGEsdW5zaWduZWQgX19pbnQ2NCBiLAorCQkJCSB1bnNpZ25lZCBfX2ludDY0ICpoKTsKKyMgIHByYWdtYSBpbnRyaW5zaWMoX191bXVsaCxfdW11bDEyOCkKKyMgIGRlZmluZSBCTl9VTVVMVF9ISUdIKGEsYikJCV9fdW11bGgoKGEpLChiKSkKKyMgIGRlZmluZSBCTl9VTVVMVF9MT0hJKGxvdyxoaWdoLGEsYikJKChsb3cpPV91bXVsMTI4KChhKSwoYiksJihoaWdoKSkpCisjIGVuZGlmCisjZWxpZiAhZGVmaW5lZChPUEVOU1NMX05PX0FTTSkgJiYgZGVmaW5lZChPUEVOU1NMX0FBUkNINjQpCisjIGlmIGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fPj0yCisjICBkZWZpbmUgQk5fVU1VTFRfSElHSChhLGIpCSh7CVwKKwlyZWdpc3RlciBCTl9VTE9ORyByZXQ7CQlcCisJX19hc21fXyAoInVtdWxoCSUwLCUxLCUyIglcCisJICAgICA6ICI9ciIocmV0KQkJXAorCSAgICAgOiAiciIoYSksICJyIihiKSk7CQlcCisJcmV0OwkJCX0pCisjIGVuZGlmCisjZW5kaWYKKworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30gIC8qIGV4dGVybiBDICovCisjZW5kaWYKKworI2VuZGlmICAvKiBPUEVOU1NMX0hFQURFUl9CTl9JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9jcnlwdG8vYm4va3JvbmVja2VyLmMgYi9jcnlwdG8vYm4va3JvbmVja2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNlZjc5YQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9ibi9rcm9uZWNrZXIuYwpAQCAtMCwwICsxLDE3NSBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAwIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKworI2luY2x1ZGUgImludGVybmFsLmgiCisKKworLyogbGVhc3Qgc2lnbmlmaWNhbnQgd29yZCAqLworI2RlZmluZSBCTl9sc3cobikgKCgobiktPnRvcCA9PSAwKSA/IChCTl9VTE9ORykgMCA6IChuKS0+ZFswXSkKKworLyogUmV0dXJucyAtMiBmb3IgZXJyb3JzIGJlY2F1c2UgYm90aCAtMSBhbmQgMCBhcmUgdmFsaWQgcmVzdWx0cy4gKi8KK2ludCBCTl9rcm9uZWNrZXIoY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIsIEJOX0NUWCAqY3R4KSB7CisgIGludCBpOworICBpbnQgcmV0ID0gLTI7CisgIEJJR05VTSAqQSwgKkIsICp0bXA7CisgIC8qIEluICd0YWInLCBvbmx5IG9kZC1pbmRleGVkIGVudHJpZXMgYXJlIHJlbGV2YW50OgorICAgKiBGb3IgYW55IG9kZCBCSUdOVU0gbiwKKyAgICogICAgIHRhYltCTl9sc3cobikgJiA3XQorICAgKiBpcyAkKC0xKV57KG5eMi0xKS84fSQgKHVzaW5nIFRlWCBub3RhdGlvbikuCisgICAqIE5vdGUgdGhhdCB0aGUgc2lnbiBvZiBuIGRvZXMgbm90IG1hdHRlci4gKi8KKyAgc3RhdGljIGNvbnN0IGludCB0YWJbOF0gPSB7MCwgMSwgMCwgLTEsIDAsIC0xLCAwLCAxfTsKKworICBCTl9DVFhfc3RhcnQoY3R4KTsKKyAgQSA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgQiA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgaWYgKEIgPT0gTlVMTCkgeworICAgIGdvdG8gZW5kOworICB9CisKKyAgaWYgKCFCTl9jb3B5KEEsIGEpIHx8CisgICAgICAhQk5fY29weShCLCBiKSkgeworICAgIGdvdG8gZW5kOworICB9CisKKyAgLyogS3JvbmVja2VyIHN5bWJvbCwgaW1sZW1lbnRlZCBhY2NvcmRpbmcgdG8gSGVucmkgQ29oZW4sCisgICAqICJBIENvdXJzZSBpbiBDb21wdXRhdGlvbmFsIEFsZ2VicmFpYyBOdW1iZXIgVGhlb3J5IgorICAgKiAoYWxnb3JpdGhtIDEuNC4xMCkuICovCisKKyAgLyogQ29oZW4ncyBzdGVwIDE6ICovCisKKyAgaWYgKEJOX2lzX3plcm8oQikpIHsKKyAgICByZXQgPSBCTl9hYnNfaXNfd29yZChBLCAxKTsKKyAgICBnb3RvIGVuZDsKKyAgfQorCisgIC8qIENvaGVuJ3Mgc3RlcCAyOiAqLworCisgIGlmICghQk5faXNfb2RkKEEpICYmICFCTl9pc19vZGQoQikpIHsKKyAgICByZXQgPSAwOworICAgIGdvdG8gZW5kOworICB9CisKKyAgLyogbm93IEIgaXMgbm9uLXplcm8gKi8KKyAgaSA9IDA7CisgIHdoaWxlICghQk5faXNfYml0X3NldChCLCBpKSkgeworICAgIGkrKzsKKyAgfQorICBpZiAoIUJOX3JzaGlmdChCLCBCLCBpKSkgeworICAgIGdvdG8gZW5kOworICB9CisgIGlmIChpICYgMSkgeworICAgIC8qIGkgaXMgb2RkICovCisgICAgLyogKHRodXMgQiB3YXMgZXZlbiwgdGh1cyBBIG11c3QgYmUgb2RkISkgICovCisKKyAgICAvKiBzZXQgJ3JldCcgdG8gJCgtMSleeyhBXjItMSkvOH0kICovCisgICAgcmV0ID0gdGFiW0JOX2xzdyhBKSAmIDddOworICB9IGVsc2UgeworICAgIC8qIGkgaXMgZXZlbiAqLworICAgIHJldCA9IDE7CisgIH0KKworICBpZiAoQi0+bmVnKSB7CisgICAgQi0+bmVnID0gMDsKKyAgICBpZiAoQS0+bmVnKSB7CisgICAgICByZXQgPSAtcmV0OworICAgIH0KKyAgfQorCisgIC8qIG5vdyBCIGlzIHBvc2l0aXZlIGFuZCBvZGQsIHNvIHdoYXQgcmVtYWlucyB0byBiZSBkb25lIGlzIHRvIGNvbXB1dGUgdGhlCisgICAqIEphY29iaSBzeW1ib2wgKEEvQikgYW5kIG11bHRpcGx5IGl0IGJ5ICdyZXQnICovCisKKyAgd2hpbGUgKDEpIHsKKyAgICAvKiBDb2hlbidzIHN0ZXAgMzogKi8KKworICAgIC8qIEIgaXMgcG9zaXRpdmUgYW5kIG9kZCAqLworICAgIGlmIChCTl9pc196ZXJvKEEpKSB7CisgICAgICByZXQgPSBCTl9pc19vbmUoQikgPyByZXQgOiAwOworICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgLyogbm93IEEgaXMgbm9uLXplcm8gKi8KKyAgICBpID0gMDsKKyAgICB3aGlsZSAoIUJOX2lzX2JpdF9zZXQoQSwgaSkpIHsKKyAgICAgIGkrKzsKKyAgICB9CisgICAgaWYgKCFCTl9yc2hpZnQoQSwgQSwgaSkpIHsKKyAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICBpZiAoaSAmIDEpIHsKKyAgICAgIC8qIGkgaXMgb2RkICovCisgICAgICAvKiBtdWx0aXBseSAncmV0JyBieSAgJCgtMSleeyhCXjItMSkvOH0kICovCisgICAgICByZXQgPSByZXQgKiB0YWJbQk5fbHN3KEIpICYgN107CisgICAgfQorCisgICAgLyogQ29oZW4ncyBzdGVwIDQ6ICovCisgICAgLyogbXVsdGlwbHkgJ3JldCcgYnkgICQoLTEpXnsoQS0xKShCLTEpLzR9JCAqLworICAgIGlmICgoQS0+bmVnID8gfkJOX2xzdyhBKSA6IEJOX2xzdyhBKSkgJiBCTl9sc3coQikgJiAyKSB7CisgICAgICByZXQgPSAtcmV0OworICAgIH0KKworICAgIC8qIChBLCBCKSA6PSAoQiBtb2QgfEF8LCB8QXwpICovCisgICAgaWYgKCFCTl9ubm1vZChCLCBCLCBBLCBjdHgpKSB7CisgICAgICByZXQgPSAtMjsKKyAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICB0bXAgPSBBOworICAgIEEgPSBCOworICAgIEIgPSB0bXA7CisgICAgdG1wLT5uZWcgPSAwOworICB9CisKK2VuZDoKKyAgQk5fQ1RYX2VuZChjdHgpOworICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2JuL21vbnRnb21lcnkuYyBiL2NyeXB0by9ibi9tb250Z29tZXJ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM4MDNkMgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9ibi9tb250Z29tZXJ5LmMKQEAgLTAsMCArMSw1NjEgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvdGhyZWFkLmg+CisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisKKyNpZiAhZGVmaW5lZChPUEVOU1NMX05PX0FTTSkgJiYgXAorICAgIChkZWZpbmVkKE9QRU5TU0xfWDg2KSB8fCBkZWZpbmVkKE9QRU5TU0xfWDg2XzY0KSkKKyNkZWZpbmUgT1BFTlNTTF9CTl9BU01fTU9OVAorI2VuZGlmCisKK0JOX01PTlRfQ1RYICpCTl9NT05UX0NUWF9uZXcodm9pZCkgeworICBCTl9NT05UX0NUWCAqcmV0ID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEJOX01PTlRfQ1RYKSk7CisKKyAgaWYgKHJldCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBCTl9NT05UX0NUWF9pbml0KHJldCk7CisgIHJldC0+ZmxhZ3MgPSBCTl9GTEdfTUFMTE9DRUQ7CisgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgQk5fTU9OVF9DVFhfaW5pdChCTl9NT05UX0NUWCAqbW9udCkgeworICBtZW1zZXQobW9udCwgMCwgc2l6ZW9mKEJOX01PTlRfQ1RYKSk7CisgIEJOX2luaXQoJm1vbnQtPlJSKTsKKyAgQk5faW5pdCgmbW9udC0+Tik7CisgIEJOX2luaXQoJm1vbnQtPk5pKTsKK30KKwordm9pZCBCTl9NT05UX0NUWF9mcmVlKEJOX01PTlRfQ1RYICptb250KSB7CisgIGlmIChtb250ID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKworICBCTl9mcmVlKCZtb250LT5SUik7CisgIEJOX2ZyZWUoJm1vbnQtPk4pOworICBCTl9mcmVlKCZtb250LT5OaSk7CisgIGlmIChtb250LT5mbGFncyAmIEJOX0ZMR19NQUxMT0NFRCkgeworICAgIE9QRU5TU0xfZnJlZShtb250KTsKKyAgfQorfQorCitCTl9NT05UX0NUWCAqQk5fTU9OVF9DVFhfY29weShCTl9NT05UX0NUWCAqdG8sIEJOX01PTlRfQ1RYICpmcm9tKSB7CisgIGlmICh0byA9PSBmcm9tKSB7CisgICAgcmV0dXJuIHRvOworICB9CisKKyAgaWYgKCFCTl9jb3B5KCZ0by0+UlIsICZmcm9tLT5SUikgfHwKKyAgICAgICFCTl9jb3B5KCZ0by0+TiwgJmZyb20tPk4pIHx8CisgICAgICAhQk5fY29weSgmdG8tPk5pLCAmZnJvbS0+TmkpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgdG8tPnJpID0gZnJvbS0+cmk7CisgIHRvLT5uMFswXSA9IGZyb20tPm4wWzBdOworICB0by0+bjBbMV0gPSBmcm9tLT5uMFsxXTsKKyAgcmV0dXJuIHRvOworfQorCitpbnQgQk5fTU9OVF9DVFhfc2V0KEJOX01PTlRfQ1RYICptb250LCBjb25zdCBCSUdOVU0gKm1vZCwgQk5fQ1RYICpjdHgpIHsKKyAgaW50IHJldCA9IDA7CisgIEJJR05VTSAqUmksICpSOworICBCSUdOVU0gdG1vZDsKKyAgQk5fVUxPTkcgYnVmWzJdOworCisgIEJOX0NUWF9zdGFydChjdHgpOworICBSaSA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgaWYgKFJpID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorICBSID0gJm1vbnQtPlJSOyAvKiBncmFiIFJSIGFzIGEgdGVtcCAqLworICBpZiAoIUJOX2NvcHkoJm1vbnQtPk4sIG1vZCkpIHsKKyAgICBnb3RvIGVycjsgLyogU2V0IE4gKi8KKyAgfQorICBtb250LT5OLm5lZyA9IDA7CisKKyAgQk5faW5pdCgmdG1vZCk7CisgIHRtb2QuZCA9IGJ1ZjsKKyAgdG1vZC5kbWF4ID0gMjsKKyAgdG1vZC5uZWcgPSAwOworCisgIG1vbnQtPnJpID0gKEJOX251bV9iaXRzKG1vZCkgKyAoQk5fQklUUzIgLSAxKSkgLyBCTl9CSVRTMiAqIEJOX0JJVFMyOworCisjaWYgZGVmaW5lZChPUEVOU1NMX0JOX0FTTV9NT05UKSAmJiAoQk5fQklUUzIgPD0gMzIpCisgIC8qIE9ubHkgY2VydGFpbiBCTl9CSVRTMjw9MzIgcGxhdGZvcm1zIGFjdHVhbGx5IG1ha2UgdXNlIG9mCisgICAqIG4wWzFdLCBhbmQgd2UgY291bGQgdXNlIHRoZSAjZWxzZSBjYXNlICh3aXRoIGEgc2hvcnRlciBSCisgICAqIHZhbHVlKSBmb3IgdGhlIG90aGVycy4gIEhvd2V2ZXIsIGN1cnJlbnRseSBvbmx5IHRoZSBhc3NlbWJsZXIKKyAgICogZmlsZXMgZG8ga25vdyB3aGljaCBpcyB3aGljaC4gKi8KKworICBCTl96ZXJvKFIpOworICBpZiAoIUJOX3NldF9iaXQoUiwgMiAqIEJOX0JJVFMyKSkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgdG1vZC50b3AgPSAwOworICBpZiAoKGJ1ZlswXSA9IG1vZC0+ZFswXSkpIHsKKyAgICB0bW9kLnRvcCA9IDE7CisgIH0KKyAgaWYgKChidWZbMV0gPSBtb2QtPnRvcCA+IDEgPyBtb2QtPmRbMV0gOiAwKSkgeworICAgIHRtb2QudG9wID0gMjsKKyAgfQorCisgIGlmIChCTl9tb2RfaW52ZXJzZShSaSwgUiwgJnRtb2QsIGN0eCkgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisgIGlmICghQk5fbHNoaWZ0KFJpLCBSaSwgMiAqIEJOX0JJVFMyKSkgeworICAgIGdvdG8gZXJyOyAvKiBSKlJpICovCisgIH0KKyAgaWYgKCFCTl9pc196ZXJvKFJpKSkgeworICAgIGlmICghQk5fc3ViX3dvcmQoUmksIDEpKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogaWYgTiBtb2Qgd29yZCBzaXplID09IDEgKi8KKyAgICBpZiAoYm5fZXhwYW5kKFJpLCAoaW50KXNpemVvZihCTl9VTE9ORykgKiAyKSA9PSBOVUxMKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgLyogUmktLSAobW9kIGRvdWJsZSB3b3JkIHNpemUpICovCisgICAgUmktPm5lZyA9IDA7CisgICAgUmktPmRbMF0gPSBCTl9NQVNLMjsKKyAgICBSaS0+ZFsxXSA9IEJOX01BU0syOworICAgIFJpLT50b3AgPSAyOworICB9CisKKyAgaWYgKCFCTl9kaXYoUmksIE5VTEwsIFJpLCAmdG1vZCwgY3R4KSkgeworICAgIGdvdG8gZXJyOworICB9CisgIC8qIE5pID0gKFIqUmktMSkvTiwKKyAgICoga2VlcCBvbmx5IGNvdXBsZSBvZiBsZWFzdCBzaWduaWZpY2FudCB3b3JkczogKi8KKyAgbW9udC0+bjBbMF0gPSAoUmktPnRvcCA+IDApID8gUmktPmRbMF0gOiAwOworICBtb250LT5uMFsxXSA9IChSaS0+dG9wID4gMSkgPyBSaS0+ZFsxXSA6IDA7CisjZWxzZQorICBCTl96ZXJvKFIpOworICBpZiAoIUJOX3NldF9iaXQoUiwgQk5fQklUUzIpKSB7CisgICAgZ290byBlcnI7IC8qIFIgKi8KKyAgfQorCisgIGJ1ZlswXSA9IG1vZC0+ZFswXTsgLyogdG1vZCA9IE4gbW9kIHdvcmQgc2l6ZSAqLworICBidWZbMV0gPSAwOworICB0bW9kLnRvcCA9IGJ1ZlswXSAhPSAwID8gMSA6IDA7CisgIC8qIFJpID0gUl4tMSBtb2QgTiovCisgIGlmIChCTl9tb2RfaW52ZXJzZShSaSwgUiwgJnRtb2QsIGN0eCkgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisgIGlmICghQk5fbHNoaWZ0KFJpLCBSaSwgQk5fQklUUzIpKSB7CisgICAgZ290byBlcnI7IC8qIFIqUmkgKi8KKyAgfQorICBpZiAoIUJOX2lzX3plcm8oUmkpKSB7CisgICAgaWYgKCFCTl9zdWJfd29yZChSaSwgMSkpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBpZiBOIG1vZCB3b3JkIHNpemUgPT0gMSAqLworICAgIGlmICghQk5fc2V0X3dvcmQoUmksIEJOX01BU0syKSkgeworICAgICAgZ290byBlcnI7IC8qIFJpLS0gKG1vZCB3b3JkIHNpemUpICovCisgICAgfQorICB9CisgIGlmICghQk5fZGl2KFJpLCBOVUxMLCBSaSwgJnRtb2QsIGN0eCkpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorICAvKiBOaSA9IChSKlJpLTEpL04sCisgICAqIGtlZXAgb25seSBsZWFzdCBzaWduaWZpY2FudCB3b3JkOiAqLworICBtb250LT5uMFswXSA9IChSaS0+dG9wID4gMCkgPyBSaS0+ZFswXSA6IDA7CisgIG1vbnQtPm4wWzFdID0gMDsKKyNlbmRpZgorCisgIC8qIHNldHVwIFJSIGZvciBjb252ZXJzaW9ucyAqLworICBCTl96ZXJvKCYobW9udC0+UlIpKTsKKyAgaWYgKCFCTl9zZXRfYml0KCYobW9udC0+UlIpLCBtb250LT5yaSAqIDIpKSB7CisgICAgZ290byBlcnI7CisgIH0KKyAgaWYgKCFCTl9tb2QoJihtb250LT5SUiksICYobW9udC0+UlIpLCAmKG1vbnQtPk4pLCBjdHgpKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICByZXQgPSAxOworCitlcnI6CisgIEJOX0NUWF9lbmQoY3R4KTsKKyAgcmV0dXJuIHJldDsKK30KKworQk5fTU9OVF9DVFggKkJOX01PTlRfQ1RYX3NldF9sb2NrZWQoQk5fTU9OVF9DVFggKipwbW9udCwgaW50IGxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCSUdOVU0gKm1vZCwgQk5fQ1RYICpjdHgpIHsKKyAgaW50IGdvdF93cml0ZV9sb2NrID0gMDsKKyAgQk5fTU9OVF9DVFggKnJldDsKKworICBDUllQVE9fcl9sb2NrKGxvY2spOworICBpZiAoISpwbW9udCkgeworICAgIENSWVBUT19yX3VubG9jayhsb2NrKTsKKyAgICBDUllQVE9fd19sb2NrKGxvY2spOworICAgIGdvdF93cml0ZV9sb2NrID0gMTsKKworICAgIGlmICghKnBtb250KSB7CisgICAgICByZXQgPSBCTl9NT05UX0NUWF9uZXcoKTsKKyAgICAgIGlmIChyZXQgJiYgIUJOX01PTlRfQ1RYX3NldChyZXQsIG1vZCwgY3R4KSkgeworICAgICAgICBCTl9NT05UX0NUWF9mcmVlKHJldCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAqcG1vbnQgPSByZXQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0ID0gKnBtb250OworCisgIGlmIChnb3Rfd3JpdGVfbG9jaykgeworICAgIENSWVBUT193X3VubG9jayhsb2NrKTsKKyAgfSBlbHNlIHsKKyAgICBDUllQVE9fcl91bmxvY2sobG9jayk7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitpbnQgQk5fdG9fbW9udGdvbWVyeShCSUdOVU0gKnJldCwgY29uc3QgQklHTlVNICphLCBjb25zdCBCTl9NT05UX0NUWCAqbW9udCwKKyAgICAgICAgICAgICAgICAgICAgIEJOX0NUWCAqY3R4KSB7CisgIHJldHVybiBCTl9tb2RfbXVsX21vbnRnb21lcnkocmV0LCBhLCAmbW9udC0+UlIsIG1vbnQsIGN0eCk7Cit9CisKKyNpZiAwCitzdGF0aWMgaW50IEJOX2Zyb21fbW9udGdvbWVyeV93b3JkKEJJR05VTSAqcmV0LCBCSUdOVU0gKnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJOX01PTlRfQ1RYICptb250KSB7CisgIGNvbnN0IEJJR05VTSAqbjsKKyAgQk5fVUxPTkcgKmFwLCAqbnAsICpycCwgbjAsIHYsIGNhcnJ5OworICBpbnQgbmwsIG1heCwgaTsKKworICBuID0gJm1vbnQtPk47CisgIG5sID0gbi0+dG9wOworICBpZiAobmwgPT0gMCkgeworICAgIHJldC0+dG9wID0gMDsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIG1heCA9ICgyICogbmwpOyAvKiBjYXJyeSBpcyBzdG9yZWQgc2VwYXJhdGVseSAqLworICBpZiAoYm5fd2V4cGFuZChyLCBtYXgpID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHItPm5lZyBePSBuLT5uZWc7CisgIG5wID0gbi0+ZDsKKyAgcnAgPSByLT5kOworCisgIC8qIGNsZWFyIHRoZSB0b3Agd29yZHMgb2YgVCAqLworICBpZiAobWF4ID4gci0+dG9wKSB7CisgICAgbWVtc2V0KCZycFtyLT50b3BdLCAwLCAobWF4IC0gci0+dG9wKSAqIHNpemVvZihCTl9VTE9ORykpOworICB9CisKKyAgci0+dG9wID0gbWF4OworICBuMCA9IG1vbnQtPm4wWzBdOworCisgIGZvciAoY2FycnkgPSAwLCBpID0gMDsgaSA8IG5sOyBpKyssIHJwKyspIHsKKyAgICB2ID0gYm5fbXVsX2FkZF93b3JkcyhycCwgbnAsIG5sLCAocnBbMF0gKiBuMCkgJiBCTl9NQVNLMik7CisgICAgdiA9ICh2ICsgY2FycnkgKyBycFtubF0pICYgQk5fTUFTSzI7CisgICAgY2FycnkgfD0gKHYgIT0gcnBbbmxdKTsKKyAgICBjYXJyeSAmPSAodiA8PSBycFtubF0pOworICAgIHJwW25sXSA9IHY7CisgIH0KKworICBpZiAoYm5fd2V4cGFuZChyZXQsIG5sKSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0LT50b3AgPSBubDsKKyAgcmV0LT5uZWcgPSByLT5uZWc7CisKKyAgcnAgPSByZXQtPmQ7CisgIGFwID0gJihyLT5kW25sXSk7CisKKyAgeworICAgIEJOX1VMT05HICpucnA7CisgICAgc2l6ZV90IG07CisKKyAgICB2ID0gYm5fc3ViX3dvcmRzKHJwLCBhcCwgbnAsIG5sKSAtIGNhcnJ5OworICAgIC8qIGlmIHN1YnRyYWN0aW9uIHJlc3VsdCBpcyByZWFsLCB0aGVuIHRyaWNrIHVuY29uZGl0aW9uYWwgbWVtY3B5IGJlbG93IHRvCisgICAgICogcGVyZm9ybSBpbi1wbGFjZSAicmVmcmVzaCIgaW5zdGVhZCBvZiBhY3R1YWwgY29weS4gKi8KKyAgICBtID0gKDAgLSAoc2l6ZV90KXYpOworICAgIG5ycCA9IChCTl9VTE9ORyAqKSgoKGludHB0cl90KXJwICYgfm0pIHwgKChpbnRwdHJfdClhcCAmIG0pKTsKKworICAgIGZvciAoaSA9IDAsIG5sIC09IDQ7IGkgPCBubDsgaSArPSA0KSB7CisgICAgICBCTl9VTE9ORyB0MSwgdDIsIHQzLCB0NDsKKworICAgICAgdDEgPSBucnBbaSArIDBdOworICAgICAgdDIgPSBucnBbaSArIDFdOworICAgICAgdDMgPSBucnBbaSArIDJdOworICAgICAgYXBbaSArIDBdID0gMDsKKyAgICAgIHQ0ID0gbnJwW2kgKyAzXTsKKyAgICAgIGFwW2kgKyAxXSA9IDA7CisgICAgICBycFtpICsgMF0gPSB0MTsKKyAgICAgIGFwW2kgKyAyXSA9IDA7CisgICAgICBycFtpICsgMV0gPSB0MjsKKyAgICAgIGFwW2kgKyAzXSA9IDA7CisgICAgICBycFtpICsgMl0gPSB0MzsKKyAgICAgIHJwW2kgKyAzXSA9IHQ0OworICAgIH0KKworICAgIGZvciAobmwgKz0gNDsgaSA8IG5sOyBpKyspIHsKKyAgICAgIHJwW2ldID0gbnJwW2ldLCBhcFtpXSA9IDA7CisgICAgfQorICB9CisKKyAgYm5fY29ycmVjdF90b3Aocik7CisgIGJuX2NvcnJlY3RfdG9wKHJldCk7CisKKyAgcmV0dXJuIDE7Cit9CisjZW5kaWYKKworI2RlZmluZSBQVFJfU0laRV9JTlQgc2l6ZV90CisKK3N0YXRpYyBpbnQgQk5fZnJvbV9tb250Z29tZXJ5X3dvcmQoQklHTlVNICpyZXQsIEJJR05VTSAqciwgY29uc3QgQk5fTU9OVF9DVFggKm1vbnQpCisJeworCUJJR05VTSAqbjsKKwlCTl9VTE9ORyAqYXAsKm5wLCpycCxuMCx2LGNhcnJ5OworCWludCBubCxtYXgsaTsKKworCW49IChCSUdOVU0qKSAmKG1vbnQtPk4pOworCW5sPW4tPnRvcDsKKwlpZiAobmwgPT0gMCkgeyByZXQtPnRvcD0wOyByZXR1cm4oMSk7IH0KKworCW1heD0oMipubCk7IC8qIGNhcnJ5IGlzIHN0b3JlZCBzZXBhcmF0ZWx5ICovCisJaWYgKGJuX3dleHBhbmQocixtYXgpID09IE5VTEwpIHJldHVybigwKTsKKworCXItPm5lZ149bi0+bmVnOworCW5wPW4tPmQ7CisJcnA9ci0+ZDsKKworCS8qIGNsZWFyIHRoZSB0b3Agd29yZHMgb2YgVCAqLworI2lmIDEKKwlmb3IgKGk9ci0+dG9wOyBpPG1heDsgaSsrKSAvKiBtZW1zZXQ/IFhYWCAqLworCQlycFtpXT0wOworI2Vsc2UKKwltZW1zZXQoJihycFtyLT50b3BdKSwwLChtYXgtci0+dG9wKSpzaXplb2YoQk5fVUxPTkcpKTsgCisjZW5kaWYKKworCXItPnRvcD1tYXg7CisJbjA9bW9udC0+bjBbMF07CisKKwlmb3IgKGNhcnJ5PTAsIGk9MDsgaTxubDsgaSsrLCBycCsrKQorCQl7CisJCXY9Ym5fbXVsX2FkZF93b3JkcyhycCxucCxubCwocnBbMF0qbjApJkJOX01BU0syKTsKKwkJdiA9ICh2K2NhcnJ5K3JwW25sXSkmQk5fTUFTSzI7CisJCWNhcnJ5IHw9ICh2ICE9IHJwW25sXSk7CisJCWNhcnJ5ICY9ICh2IDw9IHJwW25sXSk7CisJCXJwW25sXT12OworCQl9CisKKwlpZiAoYm5fd2V4cGFuZChyZXQsbmwpID09IE5VTEwpIHJldHVybigwKTsKKwlyZXQtPnRvcD1ubDsKKwlyZXQtPm5lZz1yLT5uZWc7CisKKwlycD1yZXQtPmQ7CisJYXA9JihyLT5kW25sXSk7CisKKwl7CisJQk5fVUxPTkcgKm5ycDsKKwlzaXplX3QgbTsKKworCXY9Ym5fc3ViX3dvcmRzKHJwLGFwLG5wLG5sKS1jYXJyeTsKKwkvKiBpZiBzdWJ0cmFjdGlvbiByZXN1bHQgaXMgcmVhbCwgdGhlbgorCSAqIHRyaWNrIHVuY29uZGl0aW9uYWwgbWVtY3B5IGJlbG93IHRvIHBlcmZvcm0gaW4tcGxhY2UKKwkgKiAicmVmcmVzaCIgaW5zdGVhZCBvZiBhY3R1YWwgY29weS4gKi8KKwltPSgwLShzaXplX3Qpdik7CisJbnJwPShCTl9VTE9ORyAqKSgoKFBUUl9TSVpFX0lOVClycCZ+bSl8KChQVFJfU0laRV9JTlQpYXAmbSkpOworCisJZm9yIChpPTAsbmwtPTQ7IGk8bmw7IGkrPTQpCisJCXsKKwkJQk5fVUxPTkcgdDEsdDIsdDMsdDQ7CisJCQorCQl0MT1ucnBbaSswXTsKKwkJdDI9bnJwW2krMV07CisJCXQzPW5ycFtpKzJdOwlhcFtpKzBdPTA7CisJCXQ0PW5ycFtpKzNdOwlhcFtpKzFdPTA7CisJCXJwW2krMF09dDE7CWFwW2krMl09MDsKKwkJcnBbaSsxXT10MjsJYXBbaSszXT0wOworCQlycFtpKzJdPXQzOworCQlycFtpKzNdPXQ0OworCQl9CisJZm9yIChubCs9NDsgaTxubDsgaSsrKQorCQlycFtpXT1ucnBbaV0sIGFwW2ldPTA7CisJfQorCWJuX2NvcnJlY3RfdG9wKHIpOworCWJuX2NvcnJlY3RfdG9wKHJldCk7CisKKwlyZXR1cm4oMSk7CisJfQorCitpbnQgQk5fZnJvbV9tb250Z29tZXJ5KEJJR05VTSAqcmV0LCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJOX01PTlRfQ1RYICptb250LAorICAgICAgICAgICAgICAgICAgICAgICBCTl9DVFggKmN0eCkgeworICBpbnQgcmV0biA9IDA7CisgIEJJR05VTSAqdDsKKworICBCTl9DVFhfc3RhcnQoY3R4KTsKKyAgdCA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgaWYgKHQgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKEJOX2NvcHkodCwgYSkpCisgICAgcmV0biA9IEJOX2Zyb21fbW9udGdvbWVyeV93b3JkKHJldCwgdCwgbW9udCk7CisgIEJOX0NUWF9lbmQoY3R4KTsKKworICByZXR1cm4gcmV0bjsKK30KKworaW50IEJOX21vZF9tdWxfbW9udGdvbWVyeShCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCTl9NT05UX0NUWCAqbW9udCwgQk5fQ1RYICpjdHgpIHsKKyAgQklHTlVNICp0bXA7CisgIGludCByZXQgPSAwOworCisjaWYgZGVmaW5lZChPUEVOU1NMX0JOX0FTTV9NT05UKQorICBpbnQgbnVtID0gbW9udC0+Ti50b3A7CisKKyAgaWYgKG51bSA+IDEgJiYgYS0+dG9wID09IG51bSAmJiBiLT50b3AgPT0gbnVtKSB7CisgICAgaWYgKGJuX3dleHBhbmQociwgbnVtKSA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGJuX211bF9tb250KHItPmQsIGEtPmQsIGItPmQsIG1vbnQtPk4uZCwgbW9udC0+bjAsIG51bSkpIHsKKyAgICAgIHItPm5lZyA9IGEtPm5lZyBeIGItPm5lZzsKKyAgICAgIHItPnRvcCA9IG51bTsKKyAgICAgIGJuX2NvcnJlY3RfdG9wKHIpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisjZW5kaWYKKworICBCTl9DVFhfc3RhcnQoY3R4KTsKKyAgdG1wID0gQk5fQ1RYX2dldChjdHgpOworICBpZiAodG1wID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmIChhID09IGIpIHsKKyAgICBpZiAoIUJOX3Nxcih0bXAsIGEsIGN0eCkpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoIUJOX211bCh0bXAsIGEsIGIsIGN0eCkpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfQorCisgIC8qIHJlZHVjZSBmcm9tIGFSUiB0byBhUiAqLworICBpZiAoIUJOX2Zyb21fbW9udGdvbWVyeV93b3JkKHIsIHRtcCwgbW9udCkpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIHJldCA9IDE7CisKK2VycjoKKyAgQk5fQ1RYX2VuZChjdHgpOworICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2JuL211bC5jIGIvY3J5cHRvL2JuL211bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMjZlYmEKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYm4vbXVsLmMKQEAgLTAsMCArMSw4ODQgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgImludGVybmFsLmgiCisKKwordm9pZCBibl9tdWxfbm9ybWFsKEJOX1VMT05HICpyLCBCTl9VTE9ORyAqYSwgaW50IG5hLCBCTl9VTE9ORyAqYiwgaW50IG5iKSB7CisgIEJOX1VMT05HICpycjsKKworICBpZiAobmEgPCBuYikgeworICAgIGludCBpdG1wOworICAgIEJOX1VMT05HICpsdG1wOworCisgICAgaXRtcCA9IG5hOworICAgIG5hID0gbmI7CisgICAgbmIgPSBpdG1wOworICAgIGx0bXAgPSBhOworICAgIGEgPSBiOworICAgIGIgPSBsdG1wOworICB9CisgIHJyID0gJihyW25hXSk7CisgIGlmIChuYiA8PSAwKSB7CisgICAgKHZvaWQpYm5fbXVsX3dvcmRzKHIsIGEsIG5hLCAwKTsKKyAgICByZXR1cm47CisgIH0gZWxzZSB7CisgICAgcnJbMF0gPSBibl9tdWxfd29yZHMociwgYSwgbmEsIGJbMF0pOworICB9CisKKyAgZm9yICg7OykgeworICAgIGlmICgtLW5iIDw9IDApIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgcnJbMV0gPSBibl9tdWxfYWRkX3dvcmRzKCYoclsxXSksIGEsIG5hLCBiWzFdKTsKKyAgICBpZiAoLS1uYiA8PSAwKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHJyWzJdID0gYm5fbXVsX2FkZF93b3JkcygmKHJbMl0pLCBhLCBuYSwgYlsyXSk7CisgICAgaWYgKC0tbmIgPD0gMCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICByclszXSA9IGJuX211bF9hZGRfd29yZHMoJihyWzNdKSwgYSwgbmEsIGJbM10pOworICAgIGlmICgtLW5iIDw9IDApIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgcnJbNF0gPSBibl9tdWxfYWRkX3dvcmRzKCYocls0XSksIGEsIG5hLCBiWzRdKTsKKyAgICByciArPSA0OworICAgIHIgKz0gNDsKKyAgICBiICs9IDQ7CisgIH0KK30KKwordm9pZCBibl9tdWxfbG93X25vcm1hbChCTl9VTE9ORyAqciwgQk5fVUxPTkcgKmEsIEJOX1VMT05HICpiLCBpbnQgbikgeworICBibl9tdWxfd29yZHMociwgYSwgbiwgYlswXSk7CisKKyAgZm9yICg7OykgeworICAgIGlmICgtLW4gPD0gMCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBibl9tdWxfYWRkX3dvcmRzKCYoclsxXSksIGEsIG4sIGJbMV0pOworICAgIGlmICgtLW4gPD0gMCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBibl9tdWxfYWRkX3dvcmRzKCYoclsyXSksIGEsIG4sIGJbMl0pOworICAgIGlmICgtLW4gPD0gMCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBibl9tdWxfYWRkX3dvcmRzKCYoclszXSksIGEsIG4sIGJbM10pOworICAgIGlmICgtLW4gPD0gMCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBibl9tdWxfYWRkX3dvcmRzKCYocls0XSksIGEsIG4sIGJbNF0pOworICAgIHIgKz0gNDsKKyAgICBiICs9IDQ7CisgIH0KK30KKworI2lmICFkZWZpbmVkKE9QRU5TU0xfWDg2KQorLyogSGVyZSBmb2xsb3dzIHNwZWNpYWxpc2VkIHZhcmlhbnRzIG9mIGJuX2FkZF93b3JkcygpIGFuZCBibl9zdWJfd29yZHMoKS4gVGhleQorICogaGF2ZSB0aGUgcHJvcGVydHkgcGVyZm9ybWluZyBvcGVyYXRpb25zIG9uIGFycmF5cyBvZiBkaWZmZXJlbnQgc2l6ZXMuIFRoZQorICogc2l6ZXMgb2YgdGhvc2UgYXJyYXlzIGlzIGV4cHJlc3NlZCB0aHJvdWdoIGNsLCB3aGljaCBpcyB0aGUgY29tbW9uIGxlbmd0aCAoCisgKiBiYXNpY2FsbCwgbWluKGxlbihhKSxsZW4oYikpICksIGFuZCBkbCwgd2hpY2ggaXMgdGhlIGRlbHRhIGJldHdlZW4gdGhlIHR3bworICogbGVuZ3RocywgY2FsY3VsYXRlZCBhcyBsZW4oYSktbGVuKGIpLiBBbGwgbGVuZ3RocyBhcmUgdGhlIG51bWJlciBvZgorICogQk5fVUxPTkdzLi4uICBGb3IgdGhlIG9wZXJhdGlvbnMgdGhhdCByZXF1aXJlIGEgcmVzdWx0IGFycmF5IGFzIHBhcmFtZXRlciwKKyAqIGl0IG11c3QgaGF2ZSB0aGUgbGVuZ3RoIGNsK2FicyhkbCkuIFRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgcHJvYmFibHkgZW5kIHVwCisgKiBpbiBibl9hc20uYyBhcyBzb29uIGFzIHRoZXJlIGFyZSBhc3NlbWJsZXIgY291bnRlcnBhcnRzIGZvciB0aGUgc3lzdGVtcyB0aGF0CisgKiB1c2UgYXNzZW1ibGVyIGZpbGVzLiAgKi8KKworc3RhdGljIEJOX1VMT05HIGJuX3N1Yl9wYXJ0X3dvcmRzKEJOX1VMT05HICpyLCBjb25zdCBCTl9VTE9ORyAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCTl9VTE9ORyAqYiwgaW50IGNsLCBpbnQgZGwpIHsKKyAgQk5fVUxPTkcgYywgdDsKKworICBhc3NlcnQoY2wgPj0gMCk7CisgIGMgPSBibl9zdWJfd29yZHMociwgYSwgYiwgY2wpOworCisgIGlmIChkbCA9PSAwKQorICAgIHJldHVybiBjOworCisgIHIgKz0gY2w7CisgIGEgKz0gY2w7CisgIGIgKz0gY2w7CisKKyAgaWYgKGRsIDwgMCkgeworICAgIGZvciAoOzspIHsKKyAgICAgIHQgPSBiWzBdOworICAgICAgclswXSA9ICgwIC0gdCAtIGMpICYgQk5fTUFTSzI7CisgICAgICBpZiAodCAhPSAwKSB7CisgICAgICAgIGMgPSAxOworICAgICAgfQorICAgICAgaWYgKCsrZGwgPj0gMCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgdCA9IGJbMV07CisgICAgICByWzFdID0gKDAgLSB0IC0gYykgJiBCTl9NQVNLMjsKKyAgICAgIGlmICh0ICE9IDApIHsKKyAgICAgICAgYyA9IDE7CisgICAgICB9CisgICAgICBpZiAoKytkbCA+PSAwKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICB0ID0gYlsyXTsKKyAgICAgIHJbMl0gPSAoMCAtIHQgLSBjKSAmIEJOX01BU0syOworICAgICAgaWYgKHQgIT0gMCkgeworICAgICAgICBjID0gMTsKKyAgICAgIH0KKyAgICAgIGlmICgrK2RsID49IDApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIHQgPSBiWzNdOworICAgICAgclszXSA9ICgwIC0gdCAtIGMpICYgQk5fTUFTSzI7CisgICAgICBpZiAodCAhPSAwKSB7CisgICAgICAgIGMgPSAxOworICAgICAgfQorICAgICAgaWYgKCsrZGwgPj0gMCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgYiArPSA0OworICAgICAgciArPSA0OworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpbnQgc2F2ZV9kbCA9IGRsOworICAgIHdoaWxlIChjKSB7CisgICAgICB0ID0gYVswXTsKKyAgICAgIHJbMF0gPSAodCAtIGMpICYgQk5fTUFTSzI7CisgICAgICBpZiAodCAhPSAwKSB7CisgICAgICAgIGMgPSAwOworICAgICAgfQorICAgICAgaWYgKC0tZGwgPD0gMCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgdCA9IGFbMV07CisgICAgICByWzFdID0gKHQgLSBjKSAmIEJOX01BU0syOworICAgICAgaWYgKHQgIT0gMCkgeworICAgICAgICBjID0gMDsKKyAgICAgIH0KKyAgICAgIGlmICgtLWRsIDw9IDApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIHQgPSBhWzJdOworICAgICAgclsyXSA9ICh0IC0gYykgJiBCTl9NQVNLMjsKKyAgICAgIGlmICh0ICE9IDApIHsKKyAgICAgICAgYyA9IDA7CisgICAgICB9CisgICAgICBpZiAoLS1kbCA8PSAwKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICB0ID0gYVszXTsKKyAgICAgIHJbM10gPSAodCAtIGMpICYgQk5fTUFTSzI7CisgICAgICBpZiAodCAhPSAwKSB7CisgICAgICAgIGMgPSAwOworICAgICAgfQorICAgICAgaWYgKC0tZGwgPD0gMCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgc2F2ZV9kbCA9IGRsOworICAgICAgYSArPSA0OworICAgICAgciArPSA0OworICAgIH0KKyAgICBpZiAoZGwgPiAwKSB7CisgICAgICBpZiAoc2F2ZV9kbCA+IGRsKSB7CisgICAgICAgIHN3aXRjaCAoc2F2ZV9kbCAtIGRsKSB7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgclsxXSA9IGFbMV07CisgICAgICAgICAgICBpZiAoLS1kbCA8PSAwKSB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHJbMl0gPSBhWzJdOworICAgICAgICAgICAgaWYgKC0tZGwgPD0gMCkgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICByWzNdID0gYVszXTsKKyAgICAgICAgICAgIGlmICgtLWRsIDw9IDApIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYSArPSA0OworICAgICAgICByICs9IDQ7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGRsID4gMCkgeworICAgICAgZm9yICg7OykgeworICAgICAgICByWzBdID0gYVswXTsKKyAgICAgICAgaWYgKC0tZGwgPD0gMCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJbMV0gPSBhWzFdOworICAgICAgICBpZiAoLS1kbCA8PSAwKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgclsyXSA9IGFbMl07CisgICAgICAgIGlmICgtLWRsIDw9IDApIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByWzNdID0gYVszXTsKKyAgICAgICAgaWYgKC0tZGwgPD0gMCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgYSArPSA0OworICAgICAgICByICs9IDQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIGM7Cit9CisjZWxzZQorLyogT24gb3RoZXIgcGxhdGZvcm1zIHRoZSBmdW5jdGlvbiBpcyBkZWZpbmVkIGluIGFzbS4gKi8KK0JOX1VMT05HIGJuX3N1Yl9wYXJ0X3dvcmRzKEJOX1VMT05HICpyLCBjb25zdCBCTl9VTE9ORyAqYSwgY29uc3QgQk5fVUxPTkcgKmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2wsIGludCBkbCk7CisjZW5kaWYKKworLyogS2FyYXRzdWJhIHJlY3Vyc2l2ZSBtdWx0aXBsaWNhdGlvbiBhbGdvcml0aG0KKyAqIChjZi4gS251dGgsIFRoZSBBcnQgb2YgQ29tcHV0ZXIgUHJvZ3JhbW1pbmcsIFZvbC4gMikgKi8KKworLyogciBpcyAyKm4yIHdvcmRzIGluIHNpemUsCisgKiBhIGFuZCBiIGFyZSBib3RoIG4yIHdvcmRzIGluIHNpemUuCisgKiBuMiBtdXN0IGJlIGEgcG93ZXIgb2YgMi4KKyAqIFdlIG11bHRpcGx5IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KKyAqIHQgbXVzdCBiZSAyKm4yIHdvcmRzIGluIHNpemUKKyAqIFdlIGNhbGN1bGF0ZQorICogYVswXSpiWzBdCisgKiBhWzBdKmJbMF0rYVsxXSpiWzFdKyhhWzBdLWFbMV0pKihiWzFdLWJbMF0pCisgKiBhWzFdKmJbMV0KKyAqLworLyogZG5YIG1heSBub3QgYmUgcG9zaXRpdmUsIGJ1dCBuMi8yK2RuWCBoYXMgdG8gYmUgKi8KK3N0YXRpYyB2b2lkIGJuX211bF9yZWN1cnNpdmUoQk5fVUxPTkcgKnIsIEJOX1VMT05HICphLCBCTl9VTE9ORyAqYiwgaW50IG4yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZG5hLCBpbnQgZG5iLCBCTl9VTE9ORyAqdCkgeworICBpbnQgbiA9IG4yIC8gMiwgYzEsIGMyOworICBpbnQgdG5hID0gbiArIGRuYSwgdG5iID0gbiArIGRuYjsKKyAgdW5zaWduZWQgaW50IG5lZywgemVybzsKKyAgQk5fVUxPTkcgbG4sIGxvLCAqcDsKKworICAvKiBPbmx5IGNhbGwgYm5fbXVsX2NvbWJhIDggaWYgbjIgPT0gOCBhbmQgdGhlCisgICAqIHR3byBhcnJheXMgYXJlIGNvbXBsZXRlIFtzdGV2ZV0KKyAgICovCisgIGlmIChuMiA9PSA4ICYmIGRuYSA9PSAwICYmIGRuYiA9PSAwKSB7CisgICAgYm5fbXVsX2NvbWJhOChyLCBhLCBiKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBFbHNlIGRvIG5vcm1hbCBtdWx0aXBseSAqLworICBpZiAobjIgPCBCTl9NVUxfUkVDVVJTSVZFX1NJWkVfTk9STUFMKSB7CisgICAgYm5fbXVsX25vcm1hbChyLCBhLCBuMiArIGRuYSwgYiwgbjIgKyBkbmIpOworICAgIGlmICgoZG5hICsgZG5iKSA8IDApCisgICAgICBtZW1zZXQoJnJbMiAqIG4yICsgZG5hICsgZG5iXSwgMCwgc2l6ZW9mKEJOX1VMT05HKSAqIC0oZG5hICsgZG5iKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogcj0oYVswXS1hWzFdKSooYlsxXS1iWzBdKSAqLworICBjMSA9IGJuX2NtcF9wYXJ0X3dvcmRzKGEsICYoYVtuXSksIHRuYSwgbiAtIHRuYSk7CisgIGMyID0gYm5fY21wX3BhcnRfd29yZHMoJihiW25dKSwgYiwgdG5iLCB0bmIgLSBuKTsKKyAgemVybyA9IG5lZyA9IDA7CisgIHN3aXRjaCAoYzEgKiAzICsgYzIpIHsKKyAgICBjYXNlIC00OgorICAgICAgYm5fc3ViX3BhcnRfd29yZHModCwgJihhW25dKSwgYSwgdG5hLCB0bmEgLSBuKTsgICAgICAgLyogLSAqLworICAgICAgYm5fc3ViX3BhcnRfd29yZHMoJih0W25dKSwgYiwgJihiW25dKSwgdG5iLCBuIC0gdG5iKTsgLyogLSAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAtMzoKKyAgICAgIHplcm8gPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSAtMjoKKyAgICAgIGJuX3N1Yl9wYXJ0X3dvcmRzKHQsICYoYVtuXSksIGEsIHRuYSwgdG5hIC0gbik7ICAgICAgIC8qIC0gKi8KKyAgICAgIGJuX3N1Yl9wYXJ0X3dvcmRzKCYodFtuXSksICYoYltuXSksIGIsIHRuYiwgdG5iIC0gbik7IC8qICsgKi8KKyAgICAgIG5lZyA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIC0xOgorICAgIGNhc2UgMDoKKyAgICBjYXNlIDE6CisgICAgICB6ZXJvID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIGJuX3N1Yl9wYXJ0X3dvcmRzKHQsIGEsICYoYVtuXSksIHRuYSwgbiAtIHRuYSk7ICAgICAgIC8qICsgKi8KKyAgICAgIGJuX3N1Yl9wYXJ0X3dvcmRzKCYodFtuXSksIGIsICYoYltuXSksIHRuYiwgbiAtIHRuYik7IC8qIC0gKi8KKyAgICAgIG5lZyA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICB6ZXJvID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIGJuX3N1Yl9wYXJ0X3dvcmRzKHQsIGEsICYoYVtuXSksIHRuYSwgbiAtIHRuYSk7CisgICAgICBibl9zdWJfcGFydF93b3JkcygmKHRbbl0pLCAmKGJbbl0pLCBiLCB0bmIsIHRuYiAtIG4pOworICAgICAgYnJlYWs7CisgIH0KKworICBpZiAobiA9PSA0ICYmIGRuYSA9PSAwICYmIGRuYiA9PSAwKSB7CisgICAgLyogWFhYOiBibl9tdWxfY29tYmE0IGNvdWxkIHRha2UgZXh0cmEgYXJncyB0byBkbyB0aGlzIHdlbGwgKi8KKyAgICBpZiAoIXplcm8pIHsKKyAgICAgIGJuX211bF9jb21iYTQoJih0W24yXSksIHQsICYodFtuXSkpOworICAgIH0gZWxzZSB7CisgICAgICBtZW1zZXQoJih0W24yXSksIDAsIDggKiBzaXplb2YoQk5fVUxPTkcpKTsKKyAgICB9CisKKyAgICBibl9tdWxfY29tYmE0KHIsIGEsIGIpOworICAgIGJuX211bF9jb21iYTQoJihyW24yXSksICYoYVtuXSksICYoYltuXSkpOworICB9IGVsc2UgaWYgKG4gPT0gOCAmJiBkbmEgPT0gMCAmJiBkbmIgPT0gMCkgeworICAgIC8qIFhYWDogYm5fbXVsX2NvbWJhOCBjb3VsZCB0YWtlIGV4dHJhIGFyZ3MgdG8gZG8gdGhpcyB3ZWxsICovCisgICAgaWYgKCF6ZXJvKSB7CisgICAgICBibl9tdWxfY29tYmE4KCYodFtuMl0pLCB0LCAmKHRbbl0pKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVtc2V0KCYodFtuMl0pLCAwLCAxNiAqIHNpemVvZihCTl9VTE9ORykpOworICAgIH0KKworICAgIGJuX211bF9jb21iYTgociwgYSwgYik7CisgICAgYm5fbXVsX2NvbWJhOCgmKHJbbjJdKSwgJihhW25dKSwgJihiW25dKSk7CisgIH0gZWxzZSB7CisgICAgcCA9ICYodFtuMiAqIDJdKTsKKyAgICBpZiAoIXplcm8pIHsKKyAgICAgIGJuX211bF9yZWN1cnNpdmUoJih0W24yXSksIHQsICYodFtuXSksIG4sIDAsIDAsIHApOworICAgIH0gZWxzZSB7CisgICAgICBtZW1zZXQoJih0W24yXSksIDAsIG4yICogc2l6ZW9mKEJOX1VMT05HKSk7CisgICAgfQorICAgIGJuX211bF9yZWN1cnNpdmUociwgYSwgYiwgbiwgMCwgMCwgcCk7CisgICAgYm5fbXVsX3JlY3Vyc2l2ZSgmKHJbbjJdKSwgJihhW25dKSwgJihiW25dKSwgbiwgZG5hLCBkbmIsIHApOworICB9CisKKyAgLyogdFszMl0gaG9sZHMgKGFbMF0tYVsxXSkqKGJbMV0tYlswXSksIGMxIGlzIHRoZSBzaWduCisgICAqIHJbMTBdIGhvbGRzIChhWzBdKmJbMF0pCisgICAqIHJbMzJdIGhvbGRzIChiWzFdKmJbMV0pICovCisKKyAgYzEgPSAoaW50KShibl9hZGRfd29yZHModCwgciwgJihyW24yXSksIG4yKSk7CisKKyAgaWYgKG5lZykgeworICAgIC8qIGlmIHRbMzJdIGlzIG5lZ2F0aXZlICovCisgICAgYzEgLT0gKGludCkoYm5fc3ViX3dvcmRzKCYodFtuMl0pLCB0LCAmKHRbbjJdKSwgbjIpKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBNaWdodCBoYXZlIGEgY2FycnkgKi8KKyAgICBjMSArPSAoaW50KShibl9hZGRfd29yZHMoJih0W24yXSksICYodFtuMl0pLCB0LCBuMikpOworICB9CisKKyAgLyogdFszMl0gaG9sZHMgKGFbMF0tYVsxXSkqKGJbMV0tYlswXSkrKGFbMF0qYlswXSkrKGFbMV0qYlsxXSkKKyAgICogclsxMF0gaG9sZHMgKGFbMF0qYlswXSkKKyAgICogclszMl0gaG9sZHMgKGJbMV0qYlsxXSkKKyAgICogYzEgaG9sZHMgdGhlIGNhcnJ5IGJpdHMgKi8KKyAgYzEgKz0gKGludCkoYm5fYWRkX3dvcmRzKCYocltuXSksICYocltuXSksICYodFtuMl0pLCBuMikpOworICBpZiAoYzEpIHsKKyAgICBwID0gJihyW24gKyBuMl0pOworICAgIGxvID0gKnA7CisgICAgbG4gPSAobG8gKyBjMSkgJiBCTl9NQVNLMjsKKyAgICAqcCA9IGxuOworCisgICAgLyogVGhlIG92ZXJmbG93IHdpbGwgc3RvcCBiZWZvcmUgd2Ugb3ZlciB3cml0ZQorICAgICAqIHdvcmRzIHdlIHNob3VsZCBub3Qgb3ZlcndyaXRlICovCisgICAgaWYgKGxuIDwgKEJOX1VMT05HKWMxKSB7CisgICAgICBkbyB7CisgICAgICAgIHArKzsKKyAgICAgICAgbG8gPSAqcDsKKyAgICAgICAgbG4gPSAobG8gKyAxKSAmIEJOX01BU0syOworICAgICAgICAqcCA9IGxuOworICAgICAgfSB3aGlsZSAobG4gPT0gMCk7CisgICAgfQorICB9Cit9CisKKy8qIG4rdG4gaXMgdGhlIHdvcmQgbGVuZ3RoCisgKiB0IG5lZWRzIHRvIGJlIG4qNCBpcyBzaXplLCBhcyBkb2VzIHIgKi8KKy8qIHRuWCBtYXkgbm90IGJlIG5lZ2F0aXZlIGJ1dCBsZXNzIHRoYW4gbiAqLworc3RhdGljIHZvaWQgYm5fbXVsX3BhcnRfcmVjdXJzaXZlKEJOX1VMT05HICpyLCBCTl9VTE9ORyAqYSwgQk5fVUxPTkcgKmIsIGludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0bmEsIGludCB0bmIsIEJOX1VMT05HICp0KSB7CisgIGludCBpLCBqLCBuMiA9IG4gKiAyOworICBpbnQgYzEsIGMyLCBuZWc7CisgIEJOX1VMT05HIGxuLCBsbywgKnA7CisKKyAgaWYgKG4gPCA4KSB7CisgICAgYm5fbXVsX25vcm1hbChyLCBhLCBuICsgdG5hLCBiLCBuICsgdG5iKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiByPShhWzBdLWFbMV0pKihiWzFdLWJbMF0pICovCisgIGMxID0gYm5fY21wX3BhcnRfd29yZHMoYSwgJihhW25dKSwgdG5hLCBuIC0gdG5hKTsKKyAgYzIgPSBibl9jbXBfcGFydF93b3JkcygmKGJbbl0pLCBiLCB0bmIsIHRuYiAtIG4pOworICBuZWcgPSAwOworICBzd2l0Y2ggKGMxICogMyArIGMyKSB7CisgICAgY2FzZSAtNDoKKyAgICAgIGJuX3N1Yl9wYXJ0X3dvcmRzKHQsICYoYVtuXSksIGEsIHRuYSwgdG5hIC0gbik7ICAgICAgIC8qIC0gKi8KKyAgICAgIGJuX3N1Yl9wYXJ0X3dvcmRzKCYodFtuXSksIGIsICYoYltuXSksIHRuYiwgbiAtIHRuYik7IC8qIC0gKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgLTM6CisgICAgLyogYnJlYWs7ICovCisgICAgY2FzZSAtMjoKKyAgICAgIGJuX3N1Yl9wYXJ0X3dvcmRzKHQsICYoYVtuXSksIGEsIHRuYSwgdG5hIC0gbik7ICAgICAgIC8qIC0gKi8KKyAgICAgIGJuX3N1Yl9wYXJ0X3dvcmRzKCYodFtuXSksICYoYltuXSksIGIsIHRuYiwgdG5iIC0gbik7IC8qICsgKi8KKyAgICAgIG5lZyA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIC0xOgorICAgIGNhc2UgMDoKKyAgICBjYXNlIDE6CisgICAgLyogYnJlYWs7ICovCisgICAgY2FzZSAyOgorICAgICAgYm5fc3ViX3BhcnRfd29yZHModCwgYSwgJihhW25dKSwgdG5hLCBuIC0gdG5hKTsgICAgICAgLyogKyAqLworICAgICAgYm5fc3ViX3BhcnRfd29yZHMoJih0W25dKSwgYiwgJihiW25dKSwgdG5iLCBuIC0gdG5iKTsgLyogLSAqLworICAgICAgbmVnID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAvKiBicmVhazsgKi8KKyAgICBjYXNlIDQ6CisgICAgICBibl9zdWJfcGFydF93b3Jkcyh0LCBhLCAmKGFbbl0pLCB0bmEsIG4gLSB0bmEpOworICAgICAgYm5fc3ViX3BhcnRfd29yZHMoJih0W25dKSwgJihiW25dKSwgYiwgdG5iLCB0bmIgLSBuKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKG4gPT0gOCkgeworICAgIGJuX211bF9jb21iYTgoJih0W24yXSksIHQsICYodFtuXSkpOworICAgIGJuX211bF9jb21iYTgociwgYSwgYik7CisgICAgYm5fbXVsX25vcm1hbCgmKHJbbjJdKSwgJihhW25dKSwgdG5hLCAmKGJbbl0pLCB0bmIpOworICAgIG1lbXNldCgmKHJbbjIgKyB0bmEgKyB0bmJdKSwgMCwgc2l6ZW9mKEJOX1VMT05HKSAqIChuMiAtIHRuYSAtIHRuYikpOworICB9IGVsc2UgeworICAgIHAgPSAmKHRbbjIgKiAyXSk7CisgICAgYm5fbXVsX3JlY3Vyc2l2ZSgmKHRbbjJdKSwgdCwgJih0W25dKSwgbiwgMCwgMCwgcCk7CisgICAgYm5fbXVsX3JlY3Vyc2l2ZShyLCBhLCBiLCBuLCAwLCAwLCBwKTsKKyAgICBpID0gbiAvIDI7CisgICAgLyogSWYgdGhlcmUgaXMgb25seSBhIGJvdHRvbSBoYWxmIHRvIHRoZSBudW1iZXIsCisgICAgICoganVzdCBkbyBpdCAqLworICAgIGlmICh0bmEgPiB0bmIpIHsKKyAgICAgIGogPSB0bmEgLSBpOworICAgIH0gZWxzZSB7CisgICAgICBqID0gdG5iIC0gaTsKKyAgICB9CisKKyAgICBpZiAoaiA9PSAwKSB7CisgICAgICBibl9tdWxfcmVjdXJzaXZlKCYocltuMl0pLCAmKGFbbl0pLCAmKGJbbl0pLCBpLCB0bmEgLSBpLCB0bmIgLSBpLCBwKTsKKyAgICAgIG1lbXNldCgmKHJbbjIgKyBpICogMl0pLCAwLCBzaXplb2YoQk5fVUxPTkcpICogKG4yIC0gaSAqIDIpKTsKKyAgICB9IGVsc2UgaWYgKGogPiAwKSB7CisgICAgICAvKiBlZywgbiA9PSAxNiwgaSA9PSA4IGFuZCB0biA9PSAxMSAqLworICAgICAgYm5fbXVsX3BhcnRfcmVjdXJzaXZlKCYocltuMl0pLCAmKGFbbl0pLCAmKGJbbl0pLCBpLCB0bmEgLSBpLCB0bmIgLSBpLCBwKTsKKyAgICAgIG1lbXNldCgmKHJbbjIgKyB0bmEgKyB0bmJdKSwgMCwgc2l6ZW9mKEJOX1VMT05HKSAqIChuMiAtIHRuYSAtIHRuYikpOworICAgIH0gZWxzZSB7CisgICAgICAvKiAoaiA8IDApIGVnLCBuID09IDE2LCBpID09IDggYW5kIHRuID09IDUgKi8KKyAgICAgIG1lbXNldCgmKHJbbjJdKSwgMCwgc2l6ZW9mKEJOX1VMT05HKSAqIG4yKTsKKyAgICAgIGlmICh0bmEgPCBCTl9NVUxfUkVDVVJTSVZFX1NJWkVfTk9STUFMICYmCisgICAgICAgICAgdG5iIDwgQk5fTVVMX1JFQ1VSU0lWRV9TSVpFX05PUk1BTCkgeworICAgICAgICBibl9tdWxfbm9ybWFsKCYocltuMl0pLCAmKGFbbl0pLCB0bmEsICYoYltuXSksIHRuYik7CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgaSAvPSAyOworICAgICAgICAgIC8qIHRoZXNlIHNpbXBsaWZpZWQgY29uZGl0aW9ucyB3b3JrCisgICAgICAgICAgICogZXhjbHVzaXZlbHkgYmVjYXVzZSBkaWZmZXJlbmNlCisgICAgICAgICAgICogYmV0d2VlbiB0bmEgYW5kIHRuYiBpcyAxIG9yIDAgKi8KKyAgICAgICAgICBpZiAoaSA8IHRuYSB8fCBpIDwgdG5iKSB7CisgICAgICAgICAgICBibl9tdWxfcGFydF9yZWN1cnNpdmUoJihyW24yXSksICYoYVtuXSksICYoYltuXSksIGksIHRuYSAtIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5iIC0gaSwgcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gdG5hIHx8IGkgPT0gdG5iKSB7CisgICAgICAgICAgICBibl9tdWxfcmVjdXJzaXZlKCYocltuMl0pLCAmKGFbbl0pLCAmKGJbbl0pLCBpLCB0bmEgLSBpLCB0bmIgLSBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIHRbMzJdIGhvbGRzIChhWzBdLWFbMV0pKihiWzFdLWJbMF0pLCBjMSBpcyB0aGUgc2lnbgorICAgKiByWzEwXSBob2xkcyAoYVswXSpiWzBdKQorICAgKiByWzMyXSBob2xkcyAoYlsxXSpiWzFdKQorICAgKi8KKworICBjMSA9IChpbnQpKGJuX2FkZF93b3Jkcyh0LCByLCAmKHJbbjJdKSwgbjIpKTsKKworICBpZiAobmVnKSB7CisgICAgLyogaWYgdFszMl0gaXMgbmVnYXRpdmUgKi8KKyAgICBjMSAtPSAoaW50KShibl9zdWJfd29yZHMoJih0W24yXSksIHQsICYodFtuMl0pLCBuMikpOworICB9IGVsc2UgeworICAgIC8qIE1pZ2h0IGhhdmUgYSBjYXJyeSAqLworICAgIGMxICs9IChpbnQpKGJuX2FkZF93b3JkcygmKHRbbjJdKSwgJih0W24yXSksIHQsIG4yKSk7CisgIH0KKworICAvKiB0WzMyXSBob2xkcyAoYVswXS1hWzFdKSooYlsxXS1iWzBdKSsoYVswXSpiWzBdKSsoYVsxXSpiWzFdKQorICAgKiByWzEwXSBob2xkcyAoYVswXSpiWzBdKQorICAgKiByWzMyXSBob2xkcyAoYlsxXSpiWzFdKQorICAgKiBjMSBob2xkcyB0aGUgY2FycnkgYml0cyAqLworICBjMSArPSAoaW50KShibl9hZGRfd29yZHMoJihyW25dKSwgJihyW25dKSwgJih0W24yXSksIG4yKSk7CisgIGlmIChjMSkgeworICAgIHAgPSAmKHJbbiArIG4yXSk7CisgICAgbG8gPSAqcDsKKyAgICBsbiA9IChsbyArIGMxKSAmIEJOX01BU0syOworICAgICpwID0gbG47CisKKyAgICAvKiBUaGUgb3ZlcmZsb3cgd2lsbCBzdG9wIGJlZm9yZSB3ZSBvdmVyIHdyaXRlCisgICAgICogd29yZHMgd2Ugc2hvdWxkIG5vdCBvdmVyd3JpdGUgKi8KKyAgICBpZiAobG4gPCAoQk5fVUxPTkcpYzEpIHsKKyAgICAgIGRvIHsKKyAgICAgICAgcCsrOworICAgICAgICBsbyA9ICpwOworICAgICAgICBsbiA9IChsbyArIDEpICYgQk5fTUFTSzI7CisgICAgICAgICpwID0gbG47CisgICAgICB9IHdoaWxlIChsbiA9PSAwKTsKKyAgICB9CisgIH0KK30KKworaW50IEJOX211bChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLCBCTl9DVFggKmN0eCkgeworICBpbnQgcmV0ID0gMDsKKyAgaW50IHRvcCwgYWwsIGJsOworICBCSUdOVU0gKnJyOworICBpbnQgaTsKKyAgQklHTlVNICp0ID0gTlVMTDsKKyAgaW50IGogPSAwLCBrOworCisgIGFsID0gYS0+dG9wOworICBibCA9IGItPnRvcDsKKworICBpZiAoKGFsID09IDApIHx8IChibCA9PSAwKSkgeworICAgIEJOX3plcm8ocik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgdG9wID0gYWwgKyBibDsKKworICBCTl9DVFhfc3RhcnQoY3R4KTsKKyAgaWYgKChyID09IGEpIHx8IChyID09IGIpKSB7CisgICAgaWYgKChyciA9IEJOX0NUWF9nZXQoY3R4KSkgPT0gTlVMTCkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICB9IGVsc2UgeworICAgIHJyID0gcjsKKyAgfQorICByci0+bmVnID0gYS0+bmVnIF4gYi0+bmVnOworCisgIGkgPSBhbCAtIGJsOworICBpZiAoaSA9PSAwKSB7CisgICAgaWYgKGFsID09IDgpIHsKKyAgICAgIGlmIChibl93ZXhwYW5kKHJyLCAxNikgPT0gTlVMTCkgeworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICAgIHJyLT50b3AgPSAxNjsKKyAgICAgIGJuX211bF9jb21iYTgocnItPmQsIGEtPmQsIGItPmQpOworICAgICAgZ290byBlbmQ7CisgICAgfQorICB9CisKKyAgaWYgKChhbCA+PSBCTl9NVUxMX1NJWkVfTk9STUFMKSAmJiAoYmwgPj0gQk5fTVVMTF9TSVpFX05PUk1BTCkpIHsKKyAgICBpZiAoaSA+PSAtMSAmJiBpIDw9IDEpIHsKKyAgICAgIC8qIEZpbmQgb3V0IHRoZSBwb3dlciBvZiB0d28gbG93ZXIgb3IgZXF1YWwKKyAgICAgICAgIHRvIHRoZSBsb25nZXN0IG9mIHRoZSB0d28gbnVtYmVycyAqLworICAgICAgaWYgKGkgPj0gMCkgeworICAgICAgICBqID0gQk5fbnVtX2JpdHNfd29yZCgoQk5fVUxPTkcpYWwpOworICAgICAgfQorICAgICAgaWYgKGkgPT0gLTEpIHsKKyAgICAgICAgaiA9IEJOX251bV9iaXRzX3dvcmQoKEJOX1VMT05HKWJsKTsKKyAgICAgIH0KKyAgICAgIGogPSAxIDw8IChqIC0gMSk7CisgICAgICBhc3NlcnQoaiA8PSBhbCB8fCBqIDw9IGJsKTsKKyAgICAgIGsgPSBqICsgajsKKyAgICAgIHQgPSBCTl9DVFhfZ2V0KGN0eCk7CisgICAgICBpZiAodCA9PSBOVUxMKSB7CisgICAgICAgIGdvdG8gZXJyOworICAgICAgfQorICAgICAgaWYgKGFsID4gaiB8fCBibCA+IGopIHsKKyAgICAgICAgaWYgKGJuX3dleHBhbmQodCwgayAqIDQpID09IE5VTEwpIHsKKyAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYm5fd2V4cGFuZChyciwgayAqIDQpID09IE5VTEwpIHsKKyAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgICAgICBibl9tdWxfcGFydF9yZWN1cnNpdmUocnItPmQsIGEtPmQsIGItPmQsIGosIGFsIC0gaiwgYmwgLSBqLCB0LT5kKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGFsIDw9IGogfHwgYmwgPD0gaiAqLworICAgICAgICBpZiAoYm5fd2V4cGFuZCh0LCBrICogMikgPT0gTlVMTCkgeworICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICB9CisgICAgICAgIGlmIChibl93ZXhwYW5kKHJyLCBrICogMikgPT0gTlVMTCkgeworICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICB9CisgICAgICAgIGJuX211bF9yZWN1cnNpdmUocnItPmQsIGEtPmQsIGItPmQsIGosIGFsIC0gaiwgYmwgLSBqLCB0LT5kKTsKKyAgICAgIH0KKyAgICAgIHJyLT50b3AgPSB0b3A7CisgICAgICBnb3RvIGVuZDsKKyAgICB9CisgIH0KKworICBpZiAoYm5fd2V4cGFuZChyciwgdG9wKSA9PSBOVUxMKSB7CisgICAgZ290byBlcnI7CisgIH0KKyAgcnItPnRvcCA9IHRvcDsKKyAgYm5fbXVsX25vcm1hbChyci0+ZCwgYS0+ZCwgYWwsIGItPmQsIGJsKTsKKworZW5kOgorICBibl9jb3JyZWN0X3RvcChycik7CisgIGlmIChyICE9IHJyKSB7CisgICAgQk5fY29weShyLCBycik7CisgIH0KKyAgcmV0ID0gMTsKKworZXJyOgorICBCTl9DVFhfZW5kKGN0eCk7CisgIHJldHVybiByZXQ7Cit9CisKKy8qIHRtcCBtdXN0IGhhdmUgMipuIHdvcmRzICovCitzdGF0aWMgdm9pZCBibl9zcXJfbm9ybWFsKEJOX1VMT05HICpyLCBjb25zdCBCTl9VTE9ORyAqYSwgaW50IG4sIEJOX1VMT05HICp0bXApIHsKKyAgaW50IGksIGosIG1heDsKKyAgY29uc3QgQk5fVUxPTkcgKmFwOworICBCTl9VTE9ORyAqcnA7CisKKyAgbWF4ID0gbiAqIDI7CisgIGFwID0gYTsKKyAgcnAgPSByOworICBycFswXSA9IHJwW21heCAtIDFdID0gMDsKKyAgcnArKzsKKyAgaiA9IG47CisKKyAgaWYgKC0taiA+IDApIHsKKyAgICBhcCsrOworICAgIHJwW2pdID0gYm5fbXVsX3dvcmRzKHJwLCBhcCwgaiwgYXBbLTFdKTsKKyAgICBycCArPSAyOworICB9CisKKyAgZm9yIChpID0gbiAtIDI7IGkgPiAwOyBpLS0pIHsKKyAgICBqLS07CisgICAgYXArKzsKKyAgICBycFtqXSA9IGJuX211bF9hZGRfd29yZHMocnAsIGFwLCBqLCBhcFstMV0pOworICAgIHJwICs9IDI7CisgIH0KKworICBibl9hZGRfd29yZHMociwgciwgciwgbWF4KTsKKworICAvKiBUaGVyZSB3aWxsIG5vdCBiZSBhIGNhcnJ5ICovCisKKyAgYm5fc3FyX3dvcmRzKHRtcCwgYSwgbik7CisKKyAgYm5fYWRkX3dvcmRzKHIsIHIsIHRtcCwgbWF4KTsKK30KKworLyogciBpcyAyKm4gd29yZHMgaW4gc2l6ZSwKKyAqIGEgYW5kIGIgYXJlIGJvdGggbiB3b3JkcyBpbiBzaXplLiAgICAoVGhlcmUncyBub3QgYWN0dWFsbHkgYSAnYicgaGVyZSAuLi4pCisgKiBuIG11c3QgYmUgYSBwb3dlciBvZiAyLgorICogV2UgbXVsdGlwbHkgYW5kIHJldHVybiB0aGUgcmVzdWx0LgorICogdCBtdXN0IGJlIDIqbiB3b3JkcyBpbiBzaXplCisgKiBXZSBjYWxjdWxhdGUKKyAqIGFbMF0qYlswXQorICogYVswXSpiWzBdK2FbMV0qYlsxXSsoYVswXS1hWzFdKSooYlsxXS1iWzBdKQorICogYVsxXSpiWzFdCisgKi8KK3N0YXRpYyB2b2lkIGJuX3Nxcl9yZWN1cnNpdmUoQk5fVUxPTkcgKnIsIGNvbnN0IEJOX1VMT05HICphLCBpbnQgbjIsIEJOX1VMT05HICp0KSB7CisgIGludCBuID0gbjIgLyAyOworICBpbnQgemVybywgYzE7CisgIEJOX1VMT05HIGxuLCBsbywgKnA7CisKKyAgaWYgKG4yID09IDQpIHsKKyAgICBibl9zcXJfY29tYmE0KHIsIGEpOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmIChuMiA9PSA4KSB7CisgICAgYm5fc3FyX2NvbWJhOChyLCBhKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG4yIDwgQk5fU1FSX1JFQ1VSU0lWRV9TSVpFX05PUk1BTCkgeworICAgIGJuX3Nxcl9ub3JtYWwociwgYSwgbjIsIHQpOworICAgIHJldHVybjsKKyAgfQorICAvKiByPShhWzBdLWFbMV0pKihhWzFdLWFbMF0pICovCisgIGMxID0gYm5fY21wX3dvcmRzKGEsICYoYVtuXSksIG4pOworICB6ZXJvID0gMDsKKyAgaWYgKGMxID4gMCkgeworICAgIGJuX3N1Yl93b3Jkcyh0LCBhLCAmKGFbbl0pLCBuKTsKKyAgfSBlbHNlIGlmIChjMSA8IDApIHsKKyAgICBibl9zdWJfd29yZHModCwgJihhW25dKSwgYSwgbik7CisgIH0gZWxzZSB7CisgICAgemVybyA9IDE7CisgIH0KKworICAvKiBUaGUgcmVzdWx0IHdpbGwgYWx3YXlzIGJlIG5lZ2F0aXZlIHVubGVzcyBpdCBpcyB6ZXJvICovCisgIHAgPSAmKHRbbjIgKiAyXSk7CisKKyAgaWYgKCF6ZXJvKSB7CisgICAgYm5fc3FyX3JlY3Vyc2l2ZSgmKHRbbjJdKSwgdCwgbiwgcCk7CisgIH0gZWxzZSB7CisgICAgbWVtc2V0KCYodFtuMl0pLCAwLCBuMiAqIHNpemVvZihCTl9VTE9ORykpOworICB9CisgIGJuX3Nxcl9yZWN1cnNpdmUociwgYSwgbiwgcCk7CisgIGJuX3Nxcl9yZWN1cnNpdmUoJihyW24yXSksICYoYVtuXSksIG4sIHApOworCisgIC8qIHRbMzJdIGhvbGRzIChhWzBdLWFbMV0pKihhWzFdLWFbMF0pLCBpdCBpcyBuZWdhdGl2ZSBvciB6ZXJvCisgICAqIHJbMTBdIGhvbGRzIChhWzBdKmJbMF0pCisgICAqIHJbMzJdIGhvbGRzIChiWzFdKmJbMV0pICovCisKKyAgYzEgPSAoaW50KShibl9hZGRfd29yZHModCwgciwgJihyW24yXSksIG4yKSk7CisKKyAgLyogdFszMl0gaXMgbmVnYXRpdmUgKi8KKyAgYzEgLT0gKGludCkoYm5fc3ViX3dvcmRzKCYodFtuMl0pLCB0LCAmKHRbbjJdKSwgbjIpKTsKKworICAvKiB0WzMyXSBob2xkcyAoYVswXS1hWzFdKSooYVsxXS1hWzBdKSsoYVswXSphWzBdKSsoYVsxXSphWzFdKQorICAgKiByWzEwXSBob2xkcyAoYVswXSphWzBdKQorICAgKiByWzMyXSBob2xkcyAoYVsxXSphWzFdKQorICAgKiBjMSBob2xkcyB0aGUgY2FycnkgYml0cyAqLworICBjMSArPSAoaW50KShibl9hZGRfd29yZHMoJihyW25dKSwgJihyW25dKSwgJih0W24yXSksIG4yKSk7CisgIGlmIChjMSkgeworICAgIHAgPSAmKHJbbiArIG4yXSk7CisgICAgbG8gPSAqcDsKKyAgICBsbiA9IChsbyArIGMxKSAmIEJOX01BU0syOworICAgICpwID0gbG47CisKKyAgICAvKiBUaGUgb3ZlcmZsb3cgd2lsbCBzdG9wIGJlZm9yZSB3ZSBvdmVyIHdyaXRlCisgICAgICogd29yZHMgd2Ugc2hvdWxkIG5vdCBvdmVyd3JpdGUgKi8KKyAgICBpZiAobG4gPCAoQk5fVUxPTkcpYzEpIHsKKyAgICAgIGRvIHsKKyAgICAgICAgcCsrOworICAgICAgICBsbyA9ICpwOworICAgICAgICBsbiA9IChsbyArIDEpICYgQk5fTUFTSzI7CisgICAgICAgICpwID0gbG47CisgICAgICB9IHdoaWxlIChsbiA9PSAwKTsKKyAgICB9CisgIH0KK30KKworaW50IEJOX211bF93b3JkKEJJR05VTSAqYm4sIEJOX1VMT05HIHcpIHsKKyAgQk5fVUxPTkcgbGw7CisKKyAgdyAmPSBCTl9NQVNLMjsKKyAgaWYgKCFibi0+dG9wKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpZiAodyA9PSAwKSB7CisgICAgQk5femVybyhibik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBsbCA9IGJuX211bF93b3Jkcyhibi0+ZCwgYm4tPmQsIGJuLT50b3AsIHcpOworICBpZiAobGwpIHsKKyAgICBpZiAoYm5fd2V4cGFuZChibiwgYm4tPnRvcCArIDEpID09IE5VTEwpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBibi0+ZFtibi0+dG9wKytdID0gbGw7CisgIH0KKworICByZXR1cm4gMTsKK30KKworaW50IEJOX3NxcihCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgQk5fQ1RYICpjdHgpIHsKKyAgaW50IG1heCwgYWw7CisgIGludCByZXQgPSAwOworICBCSUdOVU0gKnRtcCwgKnJyOworCisgIGFsID0gYS0+dG9wOworICBpZiAoYWwgPD0gMCkgeworICAgIHItPnRvcCA9IDA7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBCTl9DVFhfc3RhcnQoY3R4KTsKKyAgcnIgPSAoYSAhPSByKSA/IHIgOiBCTl9DVFhfZ2V0KGN0eCk7CisgIHRtcCA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgaWYgKCFyciB8fCAhdG1wKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBtYXggPSAyICogYWw7IC8qIE5vbi16ZXJvIChmcm9tIGFib3ZlKSAqLworICBpZiAoYm5fd2V4cGFuZChyciwgbWF4KSA9PSBOVUxMKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAoYWwgPT0gNCkgeworICAgIGJuX3Nxcl9jb21iYTQocnItPmQsIGEtPmQpOworICB9IGVsc2UgaWYgKGFsID09IDgpIHsKKyAgICBibl9zcXJfY29tYmE4KHJyLT5kLCBhLT5kKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoYWwgPCBCTl9TUVJfUkVDVVJTSVZFX1NJWkVfTk9STUFMKSB7CisgICAgICBCTl9VTE9ORyB0W0JOX1NRUl9SRUNVUlNJVkVfU0laRV9OT1JNQUwgKiAyXTsKKyAgICAgIGJuX3Nxcl9ub3JtYWwocnItPmQsIGEtPmQsIGFsLCB0KTsKKyAgICB9IGVsc2UgeworICAgICAgaW50IGosIGs7CisKKyAgICAgIGogPSBCTl9udW1fYml0c193b3JkKChCTl9VTE9ORylhbCk7CisgICAgICBqID0gMSA8PCAoaiAtIDEpOworICAgICAgayA9IGogKyBqOworICAgICAgaWYgKGFsID09IGopIHsKKyAgICAgICAgaWYgKGJuX3dleHBhbmQodG1wLCBrICogMikgPT0gTlVMTCkgeworICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICB9CisgICAgICAgIGJuX3Nxcl9yZWN1cnNpdmUocnItPmQsIGEtPmQsIGFsLCB0bXAtPmQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGJuX3dleHBhbmQodG1wLCBtYXgpID09IE5VTEwpIHsKKyAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgICAgICBibl9zcXJfbm9ybWFsKHJyLT5kLCBhLT5kLCBhbCwgdG1wLT5kKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByci0+bmVnID0gMDsKKyAgLyogSWYgdGhlIG1vc3Qtc2lnbmlmaWNhbnQgaGFsZiBvZiB0aGUgdG9wIHdvcmQgb2YgJ2EnIGlzIHplcm8sIHRoZW4KKyAgICogdGhlIHNxdWFyZSBvZiAnYScgd2lsbCBtYXgtMSB3b3Jkcy4gKi8KKyAgaWYgKGEtPmRbYWwgLSAxXSA9PSAoYS0+ZFthbCAtIDFdICYgQk5fTUFTSzJsKSkgeworICAgIHJyLT50b3AgPSBtYXggLSAxOworICB9IGVsc2UgeworICAgIHJyLT50b3AgPSBtYXg7CisgIH0KKworICBpZiAocnIgIT0gcikgeworICAgIEJOX2NvcHkociwgcnIpOworICB9CisgIHJldCA9IDE7CisKK2VycjoKKyAgQk5fQ1RYX2VuZChjdHgpOworICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2JuL3ByaW1lLmMgYi9jcnlwdG8vYm4vcHJpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjgyMjFiCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2JuL3ByaW1lLmMKQEAgLTAsMCArMSw3OTAgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisvKiBudW1iZXIgb2YgTWlsbGVyLVJhYmluIGl0ZXJhdGlvbnMgZm9yIGFuIGVycm9yIHJhdGUgIG9mIGxlc3MgdGhhbiAyXi04MAorICogZm9yIHJhbmRvbSAnYictYml0IGlucHV0LCBiID49IDEwMCAodGFrZW4gZnJvbSB0YWJsZSA0LjQgaW4gdGhlIEhhbmRib29rCisgKiBvZiBBcHBsaWVkIENyeXB0b2dyYXBoeSBbTWVuZXplcywgdmFuIE9vcnNjaG90LCBWYW5zdG9uZTsgQ1JDIFByZXNzIDE5OTZdOworICogb3JpZ2luYWwgcGFwZXI6IERhbWdhYXJkLCBMYW5kcm9jaywgUG9tZXJhbmNlOiBBdmVyYWdlIGNhc2UgZXJyb3IgZXN0aW1hdGVzCisgKiBmb3IgdGhlIHN0cm9uZyBwcm9iYWJsZSBwcmltZSB0ZXN0LiAtLSBNYXRoLiBDb21wLiA2MSAoMTk5MykgMTc3LTE5NCkgKi8KKyNkZWZpbmUgQk5fcHJpbWVfY2hlY2tzX2Zvcl9zaXplKGIpICgoYikgPj0gMTMwMCA/ICAyIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYikgPj0gIDg1MCA/ICAzIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYikgPj0gIDY1MCA/ICA0IDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYikgPj0gIDU1MCA/ICA1IDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYikgPj0gIDQ1MCA/ICA2IDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYikgPj0gIDQwMCA/ICA3IDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYikgPj0gIDM1MCA/ICA4IDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYikgPj0gIDMwMCA/ICA5IDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYikgPj0gIDI1MCA/IDEyIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYikgPj0gIDIwMCA/IDE1IDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYikgPj0gIDE1MCA/IDE4IDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiID49IDEwMCAqLyAyNykKKworLyogVGhlIHF1aWNrIHNpZXZlIGFsZ29yaXRobSBhcHByb2FjaCB0byB3ZWVkaW5nIG91dCBwcmltZXMgaXMgUGhpbGlwCisgKiBaaW1tZXJtYW5uJ3MsIGFzIGltcGxlbWVudGVkIGluIFBHUC4gIEkgaGF2ZSBoYWQgYSByZWFkIG9mIGhpcyBjb21tZW50cyBhbmQKKyAqIGltcGxlbWVudGVkIG15IG93biB2ZXJzaW9uLiAqLworCisvKiBOVU1QUklNRVMgaXMgdGhlIG51bWJlciBvZiBwcmltZXMgdGhhdCBmaXQgaW50byBhIHVpbnQxNl90LiAqLworI2RlZmluZSBOVU1QUklNRVMgMjA0OAorCisvKiBwcmltZXMgaXMgZGVmaW5lZCBhdCB0aGUgYm90dG9tIG9mIHRoZSBmaWxlIGFuZCBjb250YWlucyBhbGwgdGhlIHByaW1lcyB0aGF0CisgKiBmaXQgaW50byBhIHVpbnQxNl90LiAqLworc3RhdGljIGNvbnN0IHVpbnQxNl90IHByaW1lc1tOVU1QUklNRVNdOworCitzdGF0aWMgaW50IHdpdG5lc3MoQklHTlVNICp3LCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYTEsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQklHTlVNICphMV9vZGQsIGludCBrLCBCTl9DVFggKmN0eCwgQk5fTU9OVF9DVFggKm1vbnQpOworc3RhdGljIGludCBwcm9iYWJsZV9wcmltZShCSUdOVU0gKnJuZCwgaW50IGJpdHMpOworc3RhdGljIGludCBwcm9iYWJsZV9wcmltZV9kaChCSUdOVU0gKnJuZCwgaW50IGJpdHMsIGNvbnN0IEJJR05VTSAqYWRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCSUdOVU0gKnJlbSwgQk5fQ1RYICpjdHgpOworc3RhdGljIGludCBwcm9iYWJsZV9wcmltZV9kaF9zYWZlKEJJR05VTSAqcm5kLCBpbnQgYml0cywgY29uc3QgQklHTlVNICphZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQklHTlVNICpyZW0sIEJOX0NUWCAqY3R4KTsKKwordm9pZCBCTl9HRU5DQl9zZXQoQk5fR0VOQ0IgKmNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgaW50ICgqZikoaW50IGV2ZW50LCBpbnQgbiwgc3RydWN0IGJuX2dlbmNiX3N0ICopLAorICAgICAgICAgICAgICAgICAgdm9pZCAqYXJnKSB7CisgIGNhbGxiYWNrLT5jYWxsYmFjayA9IGY7CisgIGNhbGxiYWNrLT5hcmcgPSBhcmc7Cit9CisKK2ludCBCTl9HRU5DQl9jYWxsKEJOX0dFTkNCICpjYWxsYmFjaywgaW50IGV2ZW50LCBpbnQgbikgeworICBpZiAoIWNhbGxiYWNrKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKworICByZXR1cm4gY2FsbGJhY2stPmNhbGxiYWNrKGV2ZW50LCBuLCBjYWxsYmFjayk7Cit9CisKK2ludCBCTl9nZW5lcmF0ZV9wcmltZV9leChCSUdOVU0gKnJldCwgaW50IGJpdHMsIGludCBzYWZlLCBjb25zdCBCSUdOVU0gKmFkZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCSUdOVU0gKnJlbSwgQk5fR0VOQ0IgKmNiKSB7CisgIEJJR05VTSAqdDsKKyAgaW50IGZvdW5kID0gMDsKKyAgaW50IGksIGosIGMxID0gMDsKKyAgQk5fQ1RYICpjdHg7CisgIGludCBjaGVja3MgPSBCTl9wcmltZV9jaGVja3NfZm9yX3NpemUoYml0cyk7CisKKyAgY3R4ID0gQk5fQ1RYX25ldygpOworICBpZiAoY3R4ID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorICBCTl9DVFhfc3RhcnQoY3R4KTsKKyAgdCA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgaWYgKCF0KSB7CisgICAgZ290byBlcnI7CisgIH0KKworbG9vcDoKKyAgLyogbWFrZSBhIHJhbmRvbSBudW1iZXIgYW5kIHNldCB0aGUgdG9wIGFuZCBib3R0b20gYml0cyAqLworICBpZiAoYWRkID09IE5VTEwpIHsKKyAgICBpZiAoIXByb2JhYmxlX3ByaW1lKHJldCwgYml0cykpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoc2FmZSkgeworICAgICAgaWYgKCFwcm9iYWJsZV9wcmltZV9kaF9zYWZlKHJldCwgYml0cywgYWRkLCByZW0sIGN0eCkpIHsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghcHJvYmFibGVfcHJpbWVfZGgocmV0LCBiaXRzLCBhZGQsIHJlbSwgY3R4KSkgeworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoIUJOX0dFTkNCX2NhbGwoY2IsIEJOX0dFTkNCX0dFTkVSQVRFRCwgYzErKykpIHsKKyAgICAvKiBhYm9ydGVkICovCisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAoIXNhZmUpIHsKKyAgICBpID0gQk5faXNfcHJpbWVfZmFzdHRlc3RfZXgocmV0LCBjaGVja3MsIGN0eCwgMCwgY2IpOworICAgIGlmIChpID09IC0xKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9IGVsc2UgaWYgKGkgPT0gMCkgeworICAgICAgZ290byBsb29wOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBmb3IgInNhZmUgcHJpbWUiIGdlbmVyYXRpb24sIGNoZWNrIHRoYXQgKHAtMSkvMiBpcyBwcmltZS4gU2luY2UgYSBwcmltZQorICAgICAqIGlzIG9kZCwgV2UganVzdCBuZWVkIHRvIGRpdmlkZSBieSAyICovCisgICAgaWYgKCFCTl9yc2hpZnQxKHQsIHJldCkpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBjaGVja3M7IGkrKykgeworICAgICAgaiA9IEJOX2lzX3ByaW1lX2Zhc3R0ZXN0X2V4KHJldCwgMSwgY3R4LCAwLCBOVUxMKTsKKyAgICAgIGlmIChqID09IC0xKSB7CisgICAgICAgIGdvdG8gZXJyOworICAgICAgfSBlbHNlIGlmIChqID09IDApIHsKKyAgICAgICAgZ290byBsb29wOworICAgICAgfQorCisgICAgICBqID0gQk5faXNfcHJpbWVfZmFzdHRlc3RfZXgodCwgMSwgY3R4LCAwLCBOVUxMKTsKKyAgICAgIGlmIChqID09IC0xKSB7CisgICAgICAgIGdvdG8gZXJyOworICAgICAgfSBlbHNlIGlmIChqID09IDApIHsKKyAgICAgICAgZ290byBsb29wOworICAgICAgfQorCisgICAgICBpZiAoIUJOX0dFTkNCX2NhbGwoY2IsIGksIGMxIC0gMSkpIHsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgICAvKiBXZSBoYXZlIGEgc2FmZSBwcmltZSB0ZXN0IHBhc3MgKi8KKyAgICB9CisgIH0KKworICAvKiB3ZSBoYXZlIGEgcHJpbWUgOi0pICovCisgIGZvdW5kID0gMTsKKworZXJyOgorICBpZiAoY3R4ICE9IE5VTEwpIHsKKyAgICBCTl9DVFhfZW5kKGN0eCk7CisgICAgQk5fQ1RYX2ZyZWUoY3R4KTsKKyAgfQorCisgIHJldHVybiBmb3VuZDsKK30KKworaW50IEJOX3ByaW1hbGl0eV90ZXN0KGludCAqaXNfcHJvYmFibHlfcHJpbWUsIGNvbnN0IEJJR05VTSAqY2FuZGlkYXRlLAorICAgICAgICAgICAgICAgICAgICAgIGludCBjaGVja3MsIEJOX0NUWCAqY3R4LCBpbnQgZG9fdHJpYWxfZGl2aXNpb24sCisgICAgICAgICAgICAgICAgICAgICAgQk5fR0VOQ0IgKmNiKSB7CisgIHN3aXRjaCAoQk5faXNfcHJpbWVfZmFzdHRlc3RfZXgoY2FuZGlkYXRlLCBjaGVja3MsIGN0eCwgZG9fdHJpYWxfZGl2aXNpb24sIGNiKSkgeworICAgIGNhc2UgMToKKyAgICAgICppc19wcm9iYWJseV9wcmltZSA9IDE7CisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIDA6CisgICAgICAqaXNfcHJvYmFibHlfcHJpbWUgPSAwOworICAgICAgcmV0dXJuIDE7CisgICAgZGVmYXVsdDoKKyAgICAgICppc19wcm9iYWJseV9wcmltZSA9IDA7CisgICAgICByZXR1cm4gMDsKKyAgfQorfQorCitpbnQgQk5faXNfcHJpbWVfZXgoY29uc3QgQklHTlVNICpjYW5kaWRhdGUsIGludCBjaGVja3MsIEJOX0NUWCAqY3R4LCBCTl9HRU5DQiAqY2IpIHsKKyAgcmV0dXJuIEJOX2lzX3ByaW1lX2Zhc3R0ZXN0X2V4KGNhbmRpZGF0ZSwgY2hlY2tzLCBjdHgsIDAsIGNiKTsKK30KKworaW50IEJOX2lzX3ByaW1lX2Zhc3R0ZXN0X2V4KGNvbnN0IEJJR05VTSAqYSwgaW50IGNoZWNrcywgQk5fQ1RYICpjdHhfcGFzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkb190cmlhbF9kaXZpc2lvbiwgQk5fR0VOQ0IgKmNiKSB7CisgIGludCBpLCBqLCByZXQgPSAtMTsKKyAgaW50IGs7CisgIEJOX0NUWCAqY3R4ID0gTlVMTDsKKyAgQklHTlVNICpBMSwgKkExX29kZCwgKmNoZWNrOyAvKiB0YWtlbiBmcm9tIGN0eCAqLworICBCTl9NT05UX0NUWCAqbW9udCA9IE5VTEw7CisgIGNvbnN0IEJJR05VTSAqQSA9IE5VTEw7CisKKyAgaWYgKEJOX2NtcChhLCBCTl92YWx1ZV9vbmUoKSkgPD0gMCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKGNoZWNrcyA9PSBCTl9wcmltZV9jaGVja3MpIHsKKyAgICBjaGVja3MgPSBCTl9wcmltZV9jaGVja3NfZm9yX3NpemUoQk5fbnVtX2JpdHMoYSkpOworICB9CisKKyAgLyogZmlyc3QgbG9vayBmb3Igc21hbGwgZmFjdG9ycyAqLworICBpZiAoIUJOX2lzX29kZChhKSkgeworICAgIC8qIGEgaXMgZXZlbiA9PiBhIGlzIHByaW1lIGlmIGFuZCBvbmx5IGlmIGEgPT0gMiAqLworICAgIHJldHVybiBCTl9pc193b3JkKGEsIDIpOworICB9CisKKyAgaWYgKGRvX3RyaWFsX2RpdmlzaW9uKSB7CisgICAgZm9yIChpID0gMTsgaSA8IE5VTVBSSU1FUzsgaSsrKSB7CisgICAgICBpZiAoQk5fbW9kX3dvcmQoYSwgcHJpbWVzW2ldKSA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgIH0KKworICAgIGlmICghQk5fR0VOQ0JfY2FsbChjYiwgMSwgLTEpKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0KKworICBpZiAoY3R4X3Bhc3NlZCAhPSBOVUxMKSB7CisgICAgY3R4ID0gY3R4X3Bhc3NlZDsKKyAgfSBlbHNlIGlmICgoY3R4ID0gQk5fQ1RYX25ldygpKSA9PSBOVUxMKSB7CisgICAgZ290byBlcnI7CisgIH0KKyAgQk5fQ1RYX3N0YXJ0KGN0eCk7CisKKyAgLyogQSA6PSBhYnMoYSkgKi8KKyAgaWYgKGEtPm5lZykgeworICAgIEJJR05VTSAqdDsKKyAgICBpZiAoKHQgPSBCTl9DVFhfZ2V0KGN0eCkpID09IE5VTEwpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBCTl9jb3B5KHQsIGEpOworICAgIHQtPm5lZyA9IDA7CisgICAgQSA9IHQ7CisgIH0gZWxzZSB7CisgICAgQSA9IGE7CisgIH0KKworICBBMSA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgQTFfb2RkID0gQk5fQ1RYX2dldChjdHgpOworICBjaGVjayA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgaWYgKGNoZWNrID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIC8qIGNvbXB1dGUgQTEgOj0gQSAtIDEgKi8KKyAgaWYgKCFCTl9jb3B5KEExLCBBKSkgeworICAgIGdvdG8gZXJyOworICB9CisgIGlmICghQk5fc3ViX3dvcmQoQTEsIDEpKSB7CisgICAgZ290byBlcnI7CisgIH0KKyAgaWYgKEJOX2lzX3plcm8oQTEpKSB7CisgICAgcmV0ID0gMDsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIC8qIHdyaXRlICBBMSAgYXMgIEExX29kZCAqIDJeayAqLworICBrID0gMTsKKyAgd2hpbGUgKCFCTl9pc19iaXRfc2V0KEExLCBrKSkgeworICAgIGsrKzsKKyAgfQorICBpZiAoIUJOX3JzaGlmdChBMV9vZGQsIEExLCBrKSkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgLyogTW9udGdvbWVyeSBzZXR1cCBmb3IgY29tcHV0YXRpb25zIG1vZCBBICovCisgIG1vbnQgPSBCTl9NT05UX0NUWF9uZXcoKTsKKyAgaWYgKG1vbnQgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisgIGlmICghQk5fTU9OVF9DVFhfc2V0KG1vbnQsIEEsIGN0eCkpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBjaGVja3M7IGkrKykgeworICAgIGlmICghQk5fcHNldWRvX3JhbmRfcmFuZ2UoY2hlY2ssIEExKSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICAgIGlmICghQk5fYWRkX3dvcmQoY2hlY2ssIDEpKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgLyogbm93IDEgPD0gY2hlY2sgPCBBICovCisKKyAgICBqID0gd2l0bmVzcyhjaGVjaywgQSwgQTEsIEExX29kZCwgaywgY3R4LCBtb250KTsKKyAgICBpZiAoaiA9PSAtMSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICAgIGlmIChqKSB7CisgICAgICByZXQgPSAwOworICAgICAgZ290byBlcnI7CisgICAgfQorICAgIGlmICghQk5fR0VOQ0JfY2FsbChjYiwgMSwgaSkpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfQorICByZXQgPSAxOworCitlcnI6CisgIGlmIChjdHggIT0gTlVMTCkgeworICAgIEJOX0NUWF9lbmQoY3R4KTsKKyAgICBpZiAoY3R4X3Bhc3NlZCA9PSBOVUxMKSB7CisgICAgICBCTl9DVFhfZnJlZShjdHgpOworICAgIH0KKyAgfQorICBpZiAobW9udCAhPSBOVUxMKSB7CisgICAgQk5fTU9OVF9DVFhfZnJlZShtb250KTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd2l0bmVzcyhCSUdOVU0gKncsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICphMSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBCSUdOVU0gKmExX29kZCwgaW50IGssIEJOX0NUWCAqY3R4LAorICAgICAgICAgICAgICAgICAgIEJOX01PTlRfQ1RYICptb250KSB7CisgIGlmICghQk5fbW9kX2V4cF9tb250KHcsIHcsIGExX29kZCwgYSwgY3R4LCBtb250KSkgeyAvKiB3IDo9IHdeYTFfb2RkIG1vZCBhICovCisgICAgcmV0dXJuIC0xOworICB9CisgIGlmIChCTl9pc19vbmUodykpIHsKKyAgICByZXR1cm4gMDsgLyogcHJvYmFibHkgcHJpbWUgKi8KKyAgfQorICBpZiAoQk5fY21wKHcsIGExKSA9PSAwKSB7CisgICAgcmV0dXJuIDA7IC8qIHcgPT0gLTEgKG1vZCBhKSwgICdhJyBpcyBwcm9iYWJseSBwcmltZSAqLworICB9CisKKyAgd2hpbGUgKC0taykgeworICAgIGlmICghQk5fbW9kX211bCh3LCB3LCB3LCBhLCBjdHgpKSB7IC8qIHcgOj0gd14yIG1vZCBhICovCisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKEJOX2lzX29uZSh3KSkgeworICAgICAgcmV0dXJuIDE7IC8qICdhJyBpcyBjb21wb3NpdGUsIG90aGVyd2lzZSBhIHByZXZpb3VzICd3JyB3b3VsZAorICAgICAgICAgICAgICAgICAqIGhhdmUgYmVlbiA9PSAtMSAobW9kICdhJykgKi8KKyAgICB9CisKKyAgICBpZiAoQk5fY21wKHcsIGExKSA9PSAwKSB7CisgICAgICByZXR1cm4gMDsgLyogdyA9PSAtMSAobW9kIGEpLCAnYScgaXMgcHJvYmFibHkgcHJpbWUgKi8KKyAgICB9CisgIH0KKworICAvKiBJZiB3ZSBnZXQgaGVyZSwgJ3cnIGlzIHRoZSAoYS0xKS8yLXRoIHBvd2VyIG9mIHRoZSBvcmlnaW5hbCAndycsCisgICAqIGFuZCBpdCBpcyBuZWl0aGVyIC0xIG5vciArMSAtLSBzbyAnYScgY2Fubm90IGJlIHByaW1lICovCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHByb2JhYmxlX3ByaW1lKEJJR05VTSAqcm5kLCBpbnQgYml0cykgeworICBpbnQgaTsKKyAgdWludDE2X3QgbW9kc1tOVU1QUklNRVNdOworICBCTl9VTE9ORyBkZWx0YSwgbWF4ZGVsdGE7CisKK2FnYWluOgorICBpZiAoIUJOX3JhbmQocm5kLCBiaXRzLCAxLCAxKSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgLyogd2Ugbm93IGhhdmUgYSByYW5kb20gbnVtYmVyICdyYW5kJyB0byB0ZXN0LiAqLworICBmb3IgKGkgPSAxOyBpIDwgTlVNUFJJTUVTOyBpKyspIHsKKyAgICBtb2RzW2ldID0gKHVpbnQxNl90KUJOX21vZF93b3JkKHJuZCwgKEJOX1VMT05HKXByaW1lc1tpXSk7CisgIH0KKyAgbWF4ZGVsdGEgPSBCTl9NQVNLMiAtIHByaW1lc1tOVU1QUklNRVMgLSAxXTsKKyAgZGVsdGEgPSAwOworCitsb29wOgorICBmb3IgKGkgPSAxOyBpIDwgTlVNUFJJTUVTOyBpKyspIHsKKyAgICAvKiBjaGVjayB0aGF0IHJuZCBpcyBub3QgYSBwcmltZSBhbmQgYWxzbworICAgICAqIHRoYXQgZ2NkKHJuZC0xLHByaW1lcykgPT0gMSAoZXhjZXB0IGZvciAyKSAqLworICAgIGlmICgoKG1vZHNbaV0gKyBkZWx0YSkgJSBwcmltZXNbaV0pIDw9IDEpIHsKKyAgICAgIGRlbHRhICs9IDI7CisgICAgICBpZiAoZGVsdGEgPiBtYXhkZWx0YSkgeworICAgICAgICBnb3RvIGFnYWluOworICAgICAgfQorICAgICAgZ290byBsb29wOworICAgIH0KKyAgfQorCisgIGlmICghQk5fYWRkX3dvcmQocm5kLCBkZWx0YSkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHByb2JhYmxlX3ByaW1lX2RoKEJJR05VTSAqcm5kLCBpbnQgYml0cywgY29uc3QgQklHTlVNICphZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJJR05VTSAqcmVtLCBCTl9DVFggKmN0eCkgeworICBpbnQgaSwgcmV0ID0gMDsKKyAgQklHTlVNICp0MTsKKworICBCTl9DVFhfc3RhcnQoY3R4KTsKKyAgaWYgKCh0MSA9IEJOX0NUWF9nZXQoY3R4KSkgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKCFCTl9yYW5kKHJuZCwgYml0cywgMCwgMSkpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIC8qIHdlIG5lZWQgKChybmQtcmVtKSAlIGFkZCkgPT0gMCAqLworCisgIGlmICghQk5fbW9kKHQxLCBybmQsIGFkZCwgY3R4KSkgeworICAgIGdvdG8gZXJyOworICB9CisgIGlmICghQk5fc3ViKHJuZCwgcm5kLCB0MSkpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorICBpZiAocmVtID09IE5VTEwpIHsKKyAgICBpZiAoIUJOX2FkZF93b3JkKHJuZCwgMSkpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoIUJOX2FkZChybmQsIHJuZCwgcmVtKSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICB9CisgIC8qIHdlIG5vdyBoYXZlIGEgcmFuZG9tIG51bWJlciAncmFuZCcgdG8gdGVzdC4gKi8KKworbG9vcDoKKyAgZm9yIChpID0gMTsgaSA8IE5VTVBSSU1FUzsgaSsrKSB7CisgICAgLyogY2hlY2sgdGhhdCBybmQgaXMgYSBwcmltZSAqLworICAgIGlmIChCTl9tb2Rfd29yZChybmQsIChCTl9VTE9ORylwcmltZXNbaV0pIDw9IDEpIHsKKyAgICAgIGlmICghQk5fYWRkKHJuZCwgcm5kLCBhZGQpKSB7CisgICAgICAgIGdvdG8gZXJyOworICAgICAgfQorICAgICAgZ290byBsb29wOworICAgIH0KKyAgfQorCisgIHJldCA9IDE7CisKK2VycjoKKyAgQk5fQ1RYX2VuZChjdHgpOworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHByb2JhYmxlX3ByaW1lX2RoX3NhZmUoQklHTlVNICpwLCBpbnQgYml0cywgY29uc3QgQklHTlVNICpwYWRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJJR05VTSAqcmVtLCBCTl9DVFggKmN0eCkgeworICBpbnQgaSwgcmV0ID0gMDsKKyAgQklHTlVNICp0MSwgKnFhZGQsICpxOworCisgIGJpdHMtLTsKKyAgQk5fQ1RYX3N0YXJ0KGN0eCk7CisgIHQxID0gQk5fQ1RYX2dldChjdHgpOworICBxID0gQk5fQ1RYX2dldChjdHgpOworICBxYWRkID0gQk5fQ1RYX2dldChjdHgpOworICBpZiAocWFkZCA9PSBOVUxMKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAoIUJOX3JzaGlmdDEocWFkZCwgcGFkZCkpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmICghQk5fcmFuZChxLCBiaXRzLCAwLCAxKSkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgLyogd2UgbmVlZCAoKHJuZC1yZW0pICUgYWRkKSA9PSAwICovCisgIGlmICghQk5fbW9kKHQxLCBxLCBxYWRkLCBjdHgpKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAoIUJOX3N1YihxLCBxLCB0MSkpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmIChyZW0gPT0gTlVMTCkgeworICAgIGlmICghQk5fYWRkX3dvcmQocSwgMSkpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoIUJOX3JzaGlmdDEodDEsIHJlbSkpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBpZiAoIUJOX2FkZChxLCBxLCB0MSkpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfQorCisgIC8qIHdlIG5vdyBoYXZlIGEgcmFuZG9tIG51bWJlciAncmFuZCcgdG8gdGVzdC4gKi8KKyAgaWYgKCFCTl9sc2hpZnQxKHAsIHEpKSB7CisgICAgZ290byBlcnI7CisgIH0KKyAgaWYgKCFCTl9hZGRfd29yZChwLCAxKSkgeworICAgIGdvdG8gZXJyOworICB9CisKK2xvb3A6CisgIGZvciAoaSA9IDE7IGkgPCBOVU1QUklNRVM7IGkrKykgeworICAgIC8qIGNoZWNrIHRoYXQgcCBhbmQgcSBhcmUgcHJpbWUgKi8KKyAgICAvKiBjaGVjayB0aGF0IGZvciBwIGFuZCBxCisgICAgICogZ2NkKHAtMSxwcmltZXMpID09IDEgKGV4Y2VwdCBmb3IgMikgKi8KKyAgICBpZiAoKEJOX21vZF93b3JkKHAsIChCTl9VTE9ORylwcmltZXNbaV0pID09IDApIHx8CisgICAgICAgIChCTl9tb2Rfd29yZChxLCAoQk5fVUxPTkcpcHJpbWVzW2ldKSA9PSAwKSkgeworICAgICAgaWYgKCFCTl9hZGQocCwgcCwgcGFkZCkpIHsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgICBpZiAoIUJOX2FkZChxLCBxLCBxYWRkKSkgeworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICAgIGdvdG8gbG9vcDsKKyAgICB9CisgIH0KKworICByZXQgPSAxOworCitlcnI6CisgIEJOX0NUWF9lbmQoY3R4KTsKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHByaW1lc1tOVU1QUklNRVNdID0geworICAgIDIsICAgICAzLCAgICAgNSwgICAgIDcsICAgICAxMSwgICAgMTMsICAgIDE3LCAgICAxOSwgICAgMjMsICAgIDI5LCAgICAzMSwKKyAgICAzNywgICAgNDEsICAgIDQzLCAgICA0NywgICAgNTMsICAgIDU5LCAgICA2MSwgICAgNjcsICAgIDcxLCAgICA3MywgICAgNzksCisgICAgODMsICAgIDg5LCAgICA5NywgICAgMTAxLCAgIDEwMywgICAxMDcsICAgMTA5LCAgIDExMywgICAxMjcsICAgMTMxLCAgIDEzNywKKyAgICAxMzksICAgMTQ5LCAgIDE1MSwgICAxNTcsICAgMTYzLCAgIDE2NywgICAxNzMsICAgMTc5LCAgIDE4MSwgICAxOTEsICAgMTkzLAorICAgIDE5NywgICAxOTksICAgMjExLCAgIDIyMywgICAyMjcsICAgMjI5LCAgIDIzMywgICAyMzksICAgMjQxLCAgIDI1MSwgICAyNTcsCisgICAgMjYzLCAgIDI2OSwgICAyNzEsICAgMjc3LCAgIDI4MSwgICAyODMsICAgMjkzLCAgIDMwNywgICAzMTEsICAgMzEzLCAgIDMxNywKKyAgICAzMzEsICAgMzM3LCAgIDM0NywgICAzNDksICAgMzUzLCAgIDM1OSwgICAzNjcsICAgMzczLCAgIDM3OSwgICAzODMsICAgMzg5LAorICAgIDM5NywgICA0MDEsICAgNDA5LCAgIDQxOSwgICA0MjEsICAgNDMxLCAgIDQzMywgICA0MzksICAgNDQzLCAgIDQ0OSwgICA0NTcsCisgICAgNDYxLCAgIDQ2MywgICA0NjcsICAgNDc5LCAgIDQ4NywgICA0OTEsICAgNDk5LCAgIDUwMywgICA1MDksICAgNTIxLCAgIDUyMywKKyAgICA1NDEsICAgNTQ3LCAgIDU1NywgICA1NjMsICAgNTY5LCAgIDU3MSwgICA1NzcsICAgNTg3LCAgIDU5MywgICA1OTksICAgNjAxLAorICAgIDYwNywgICA2MTMsICAgNjE3LCAgIDYxOSwgICA2MzEsICAgNjQxLCAgIDY0MywgICA2NDcsICAgNjUzLCAgIDY1OSwgICA2NjEsCisgICAgNjczLCAgIDY3NywgICA2ODMsICAgNjkxLCAgIDcwMSwgICA3MDksICAgNzE5LCAgIDcyNywgICA3MzMsICAgNzM5LCAgIDc0MywKKyAgICA3NTEsICAgNzU3LCAgIDc2MSwgICA3NjksICAgNzczLCAgIDc4NywgICA3OTcsICAgODA5LCAgIDgxMSwgICA4MjEsICAgODIzLAorICAgIDgyNywgICA4MjksICAgODM5LCAgIDg1MywgICA4NTcsICAgODU5LCAgIDg2MywgICA4NzcsICAgODgxLCAgIDg4MywgICA4ODcsCisgICAgOTA3LCAgIDkxMSwgICA5MTksICAgOTI5LCAgIDkzNywgICA5NDEsICAgOTQ3LCAgIDk1MywgICA5NjcsICAgOTcxLCAgIDk3NywKKyAgICA5ODMsICAgOTkxLCAgIDk5NywgICAxMDA5LCAgMTAxMywgIDEwMTksICAxMDIxLCAgMTAzMSwgIDEwMzMsICAxMDM5LCAgMTA0OSwKKyAgICAxMDUxLCAgMTA2MSwgIDEwNjMsICAxMDY5LCAgMTA4NywgIDEwOTEsICAxMDkzLCAgMTA5NywgIDExMDMsICAxMTA5LCAgMTExNywKKyAgICAxMTIzLCAgMTEyOSwgIDExNTEsICAxMTUzLCAgMTE2MywgIDExNzEsICAxMTgxLCAgMTE4NywgIDExOTMsICAxMjAxLCAgMTIxMywKKyAgICAxMjE3LCAgMTIyMywgIDEyMjksICAxMjMxLCAgMTIzNywgIDEyNDksICAxMjU5LCAgMTI3NywgIDEyNzksICAxMjgzLCAgMTI4OSwKKyAgICAxMjkxLCAgMTI5NywgIDEzMDEsICAxMzAzLCAgMTMwNywgIDEzMTksICAxMzIxLCAgMTMyNywgIDEzNjEsICAxMzY3LCAgMTM3MywKKyAgICAxMzgxLCAgMTM5OSwgIDE0MDksICAxNDIzLCAgMTQyNywgIDE0MjksICAxNDMzLCAgMTQzOSwgIDE0NDcsICAxNDUxLCAgMTQ1MywKKyAgICAxNDU5LCAgMTQ3MSwgIDE0ODEsICAxNDgzLCAgMTQ4NywgIDE0ODksICAxNDkzLCAgMTQ5OSwgIDE1MTEsICAxNTIzLCAgMTUzMSwKKyAgICAxNTQzLCAgMTU0OSwgIDE1NTMsICAxNTU5LCAgMTU2NywgIDE1NzEsICAxNTc5LCAgMTU4MywgIDE1OTcsICAxNjAxLCAgMTYwNywKKyAgICAxNjA5LCAgMTYxMywgIDE2MTksICAxNjIxLCAgMTYyNywgIDE2MzcsICAxNjU3LCAgMTY2MywgIDE2NjcsICAxNjY5LCAgMTY5MywKKyAgICAxNjk3LCAgMTY5OSwgIDE3MDksICAxNzIxLCAgMTcyMywgIDE3MzMsICAxNzQxLCAgMTc0NywgIDE3NTMsICAxNzU5LCAgMTc3NywKKyAgICAxNzgzLCAgMTc4NywgIDE3ODksICAxODAxLCAgMTgxMSwgIDE4MjMsICAxODMxLCAgMTg0NywgIDE4NjEsICAxODY3LCAgMTg3MSwKKyAgICAxODczLCAgMTg3NywgIDE4NzksICAxODg5LCAgMTkwMSwgIDE5MDcsICAxOTEzLCAgMTkzMSwgIDE5MzMsICAxOTQ5LCAgMTk1MSwKKyAgICAxOTczLCAgMTk3OSwgIDE5ODcsICAxOTkzLCAgMTk5NywgIDE5OTksICAyMDAzLCAgMjAxMSwgIDIwMTcsICAyMDI3LCAgMjAyOSwKKyAgICAyMDM5LCAgMjA1MywgIDIwNjMsICAyMDY5LCAgMjA4MSwgIDIwODMsICAyMDg3LCAgMjA4OSwgIDIwOTksICAyMTExLCAgMjExMywKKyAgICAyMTI5LCAgMjEzMSwgIDIxMzcsICAyMTQxLCAgMjE0MywgIDIxNTMsICAyMTYxLCAgMjE3OSwgIDIyMDMsICAyMjA3LCAgMjIxMywKKyAgICAyMjIxLCAgMjIzNywgIDIyMzksICAyMjQzLCAgMjI1MSwgIDIyNjcsICAyMjY5LCAgMjI3MywgIDIyODEsICAyMjg3LCAgMjI5MywKKyAgICAyMjk3LCAgMjMwOSwgIDIzMTEsICAyMzMzLCAgMjMzOSwgIDIzNDEsICAyMzQ3LCAgMjM1MSwgIDIzNTcsICAyMzcxLCAgMjM3NywKKyAgICAyMzgxLCAgMjM4MywgIDIzODksICAyMzkzLCAgMjM5OSwgIDI0MTEsICAyNDE3LCAgMjQyMywgIDI0MzcsICAyNDQxLCAgMjQ0NywKKyAgICAyNDU5LCAgMjQ2NywgIDI0NzMsICAyNDc3LCAgMjUwMywgIDI1MjEsICAyNTMxLCAgMjUzOSwgIDI1NDMsICAyNTQ5LCAgMjU1MSwKKyAgICAyNTU3LCAgMjU3OSwgIDI1OTEsICAyNTkzLCAgMjYwOSwgIDI2MTcsICAyNjIxLCAgMjYzMywgIDI2NDcsICAyNjU3LCAgMjY1OSwKKyAgICAyNjYzLCAgMjY3MSwgIDI2NzcsICAyNjgzLCAgMjY4NywgIDI2ODksICAyNjkzLCAgMjY5OSwgIDI3MDcsICAyNzExLCAgMjcxMywKKyAgICAyNzE5LCAgMjcyOSwgIDI3MzEsICAyNzQxLCAgMjc0OSwgIDI3NTMsICAyNzY3LCAgMjc3NywgIDI3ODksICAyNzkxLCAgMjc5NywKKyAgICAyODAxLCAgMjgwMywgIDI4MTksICAyODMzLCAgMjgzNywgIDI4NDMsICAyODUxLCAgMjg1NywgIDI4NjEsICAyODc5LCAgMjg4NywKKyAgICAyODk3LCAgMjkwMywgIDI5MDksICAyOTE3LCAgMjkyNywgIDI5MzksICAyOTUzLCAgMjk1NywgIDI5NjMsICAyOTY5LCAgMjk3MSwKKyAgICAyOTk5LCAgMzAwMSwgIDMwMTEsICAzMDE5LCAgMzAyMywgIDMwMzcsICAzMDQxLCAgMzA0OSwgIDMwNjEsICAzMDY3LCAgMzA3OSwKKyAgICAzMDgzLCAgMzA4OSwgIDMxMDksICAzMTE5LCAgMzEyMSwgIDMxMzcsICAzMTYzLCAgMzE2NywgIDMxNjksICAzMTgxLCAgMzE4NywKKyAgICAzMTkxLCAgMzIwMywgIDMyMDksICAzMjE3LCAgMzIyMSwgIDMyMjksICAzMjUxLCAgMzI1MywgIDMyNTcsICAzMjU5LCAgMzI3MSwKKyAgICAzMjk5LCAgMzMwMSwgIDMzMDcsICAzMzEzLCAgMzMxOSwgIDMzMjMsICAzMzI5LCAgMzMzMSwgIDMzNDMsICAzMzQ3LCAgMzM1OSwKKyAgICAzMzYxLCAgMzM3MSwgIDMzNzMsICAzMzg5LCAgMzM5MSwgIDM0MDcsICAzNDEzLCAgMzQzMywgIDM0NDksICAzNDU3LCAgMzQ2MSwKKyAgICAzNDYzLCAgMzQ2NywgIDM0NjksICAzNDkxLCAgMzQ5OSwgIDM1MTEsICAzNTE3LCAgMzUyNywgIDM1MjksICAzNTMzLCAgMzUzOSwKKyAgICAzNTQxLCAgMzU0NywgIDM1NTcsICAzNTU5LCAgMzU3MSwgIDM1ODEsICAzNTgzLCAgMzU5MywgIDM2MDcsICAzNjEzLCAgMzYxNywKKyAgICAzNjIzLCAgMzYzMSwgIDM2MzcsICAzNjQzLCAgMzY1OSwgIDM2NzEsICAzNjczLCAgMzY3NywgIDM2OTEsICAzNjk3LCAgMzcwMSwKKyAgICAzNzA5LCAgMzcxOSwgIDM3MjcsICAzNzMzLCAgMzczOSwgIDM3NjEsICAzNzY3LCAgMzc2OSwgIDM3NzksICAzNzkzLCAgMzc5NywKKyAgICAzODAzLCAgMzgyMSwgIDM4MjMsICAzODMzLCAgMzg0NywgIDM4NTEsICAzODUzLCAgMzg2MywgIDM4NzcsICAzODgxLCAgMzg4OSwKKyAgICAzOTA3LCAgMzkxMSwgIDM5MTcsICAzOTE5LCAgMzkyMywgIDM5MjksICAzOTMxLCAgMzk0MywgIDM5NDcsICAzOTY3LCAgMzk4OSwKKyAgICA0MDAxLCAgNDAwMywgIDQwMDcsICA0MDEzLCAgNDAxOSwgIDQwMjEsICA0MDI3LCAgNDA0OSwgIDQwNTEsICA0MDU3LCAgNDA3MywKKyAgICA0MDc5LCAgNDA5MSwgIDQwOTMsICA0MDk5LCAgNDExMSwgIDQxMjcsICA0MTI5LCAgNDEzMywgIDQxMzksICA0MTUzLCAgNDE1NywKKyAgICA0MTU5LCAgNDE3NywgIDQyMDEsICA0MjExLCAgNDIxNywgIDQyMTksICA0MjI5LCAgNDIzMSwgIDQyNDEsICA0MjQzLCAgNDI1MywKKyAgICA0MjU5LCAgNDI2MSwgIDQyNzEsICA0MjczLCAgNDI4MywgIDQyODksICA0Mjk3LCAgNDMyNywgIDQzMzcsICA0MzM5LCAgNDM0OSwKKyAgICA0MzU3LCAgNDM2MywgIDQzNzMsICA0MzkxLCAgNDM5NywgIDQ0MDksICA0NDIxLCAgNDQyMywgIDQ0NDEsICA0NDQ3LCAgNDQ1MSwKKyAgICA0NDU3LCAgNDQ2MywgIDQ0ODEsICA0NDgzLCAgNDQ5MywgIDQ1MDcsICA0NTEzLCAgNDUxNywgIDQ1MTksICA0NTIzLCAgNDU0NywKKyAgICA0NTQ5LCAgNDU2MSwgIDQ1NjcsICA0NTgzLCAgNDU5MSwgIDQ1OTcsICA0NjAzLCAgNDYyMSwgIDQ2MzcsICA0NjM5LCAgNDY0MywKKyAgICA0NjQ5LCAgNDY1MSwgIDQ2NTcsICA0NjYzLCAgNDY3MywgIDQ2NzksICA0NjkxLCAgNDcwMywgIDQ3MjEsICA0NzIzLCAgNDcyOSwKKyAgICA0NzMzLCAgNDc1MSwgIDQ3NTksICA0NzgzLCAgNDc4NywgIDQ3ODksICA0NzkzLCAgNDc5OSwgIDQ4MDEsICA0ODEzLCAgNDgxNywKKyAgICA0ODMxLCAgNDg2MSwgIDQ4NzEsICA0ODc3LCAgNDg4OSwgIDQ5MDMsICA0OTA5LCAgNDkxOSwgIDQ5MzEsICA0OTMzLCAgNDkzNywKKyAgICA0OTQzLCAgNDk1MSwgIDQ5NTcsICA0OTY3LCAgNDk2OSwgIDQ5NzMsICA0OTg3LCAgNDk5MywgIDQ5OTksICA1MDAzLCAgNTAwOSwKKyAgICA1MDExLCAgNTAyMSwgIDUwMjMsICA1MDM5LCAgNTA1MSwgIDUwNTksICA1MDc3LCAgNTA4MSwgIDUwODcsICA1MDk5LCAgNTEwMSwKKyAgICA1MTA3LCAgNTExMywgIDUxMTksICA1MTQ3LCAgNTE1MywgIDUxNjcsICA1MTcxLCAgNTE3OSwgIDUxODksICA1MTk3LCAgNTIwOSwKKyAgICA1MjI3LCAgNTIzMSwgIDUyMzMsICA1MjM3LCAgNTI2MSwgIDUyNzMsICA1Mjc5LCAgNTI4MSwgIDUyOTcsICA1MzAzLCAgNTMwOSwKKyAgICA1MzIzLCAgNTMzMywgIDUzNDcsICA1MzUxLCAgNTM4MSwgIDUzODcsICA1MzkzLCAgNTM5OSwgIDU0MDcsICA1NDEzLCAgNTQxNywKKyAgICA1NDE5LCAgNTQzMSwgIDU0MzcsICA1NDQxLCAgNTQ0MywgIDU0NDksICA1NDcxLCAgNTQ3NywgIDU0NzksICA1NDgzLCAgNTUwMSwKKyAgICA1NTAzLCAgNTUwNywgIDU1MTksICA1NTIxLCAgNTUyNywgIDU1MzEsICA1NTU3LCAgNTU2MywgIDU1NjksICA1NTczLCAgNTU4MSwKKyAgICA1NTkxLCAgNTYyMywgIDU2MzksICA1NjQxLCAgNTY0NywgIDU2NTEsICA1NjUzLCAgNTY1NywgIDU2NTksICA1NjY5LCAgNTY4MywKKyAgICA1Njg5LCAgNTY5MywgIDU3MDEsICA1NzExLCAgNTcxNywgIDU3MzcsICA1NzQxLCAgNTc0MywgIDU3NDksICA1Nzc5LCAgNTc4MywKKyAgICA1NzkxLCAgNTgwMSwgIDU4MDcsICA1ODEzLCAgNTgyMSwgIDU4MjcsICA1ODM5LCAgNTg0MywgIDU4NDksICA1ODUxLCAgNTg1NywKKyAgICA1ODYxLCAgNTg2NywgIDU4NjksICA1ODc5LCAgNTg4MSwgIDU4OTcsICA1OTAzLCAgNTkyMywgIDU5MjcsICA1OTM5LCAgNTk1MywKKyAgICA1OTgxLCAgNTk4NywgIDYwMDcsICA2MDExLCAgNjAyOSwgIDYwMzcsICA2MDQzLCAgNjA0NywgIDYwNTMsICA2MDY3LCAgNjA3MywKKyAgICA2MDc5LCAgNjA4OSwgIDYwOTEsICA2MTAxLCAgNjExMywgIDYxMjEsICA2MTMxLCAgNjEzMywgIDYxNDMsICA2MTUxLCAgNjE2MywKKyAgICA2MTczLCAgNjE5NywgIDYxOTksICA2MjAzLCAgNjIxMSwgIDYyMTcsICA2MjIxLCAgNjIyOSwgIDYyNDcsICA2MjU3LCAgNjI2MywKKyAgICA2MjY5LCAgNjI3MSwgIDYyNzcsICA2Mjg3LCAgNjI5OSwgIDYzMDEsICA2MzExLCAgNjMxNywgIDYzMjMsICA2MzI5LCAgNjMzNywKKyAgICA2MzQzLCAgNjM1MywgIDYzNTksICA2MzYxLCAgNjM2NywgIDYzNzMsICA2Mzc5LCAgNjM4OSwgIDYzOTcsICA2NDIxLCAgNjQyNywKKyAgICA2NDQ5LCAgNjQ1MSwgIDY0NjksICA2NDczLCAgNjQ4MSwgIDY0OTEsICA2NTIxLCAgNjUyOSwgIDY1NDcsICA2NTUxLCAgNjU1MywKKyAgICA2NTYzLCAgNjU2OSwgIDY1NzEsICA2NTc3LCAgNjU4MSwgIDY1OTksICA2NjA3LCAgNjYxOSwgIDY2MzcsICA2NjUzLCAgNjY1OSwKKyAgICA2NjYxLCAgNjY3MywgIDY2NzksICA2Njg5LCAgNjY5MSwgIDY3MDEsICA2NzAzLCAgNjcwOSwgIDY3MTksICA2NzMzLCAgNjczNywKKyAgICA2NzYxLCAgNjc2MywgIDY3NzksICA2NzgxLCAgNjc5MSwgIDY3OTMsICA2ODAzLCAgNjgyMywgIDY4MjcsICA2ODI5LCAgNjgzMywKKyAgICA2ODQxLCAgNjg1NywgIDY4NjMsICA2ODY5LCAgNjg3MSwgIDY4ODMsICA2ODk5LCAgNjkwNywgIDY5MTEsICA2OTE3LCAgNjk0NywKKyAgICA2OTQ5LCAgNjk1OSwgIDY5NjEsICA2OTY3LCAgNjk3MSwgIDY5NzcsICA2OTgzLCAgNjk5MSwgIDY5OTcsICA3MDAxLCAgNzAxMywKKyAgICA3MDE5LCAgNzAyNywgIDcwMzksICA3MDQzLCAgNzA1NywgIDcwNjksICA3MDc5LCAgNzEwMywgIDcxMDksICA3MTIxLCAgNzEyNywKKyAgICA3MTI5LCAgNzE1MSwgIDcxNTksICA3MTc3LCAgNzE4NywgIDcxOTMsICA3MjA3LCAgNzIxMSwgIDcyMTMsICA3MjE5LCAgNzIyOSwKKyAgICA3MjM3LCAgNzI0MywgIDcyNDcsICA3MjUzLCAgNzI4MywgIDcyOTcsICA3MzA3LCAgNzMwOSwgIDczMjEsICA3MzMxLCAgNzMzMywKKyAgICA3MzQ5LCAgNzM1MSwgIDczNjksICA3MzkzLCAgNzQxMSwgIDc0MTcsICA3NDMzLCAgNzQ1MSwgIDc0NTcsICA3NDU5LCAgNzQ3NywKKyAgICA3NDgxLCAgNzQ4NywgIDc0ODksICA3NDk5LCAgNzUwNywgIDc1MTcsICA3NTIzLCAgNzUyOSwgIDc1MzcsICA3NTQxLCAgNzU0NywKKyAgICA3NTQ5LCAgNzU1OSwgIDc1NjEsICA3NTczLCAgNzU3NywgIDc1ODMsICA3NTg5LCAgNzU5MSwgIDc2MDMsICA3NjA3LCAgNzYyMSwKKyAgICA3NjM5LCAgNzY0MywgIDc2NDksICA3NjY5LCAgNzY3MywgIDc2ODEsICA3Njg3LCAgNzY5MSwgIDc2OTksICA3NzAzLCAgNzcxNywKKyAgICA3NzIzLCAgNzcyNywgIDc3NDEsICA3NzUzLCAgNzc1NywgIDc3NTksICA3Nzg5LCAgNzc5MywgIDc4MTcsICA3ODIzLCAgNzgyOSwKKyAgICA3ODQxLCAgNzg1MywgIDc4NjcsICA3ODczLCAgNzg3NywgIDc4NzksICA3ODgzLCAgNzkwMSwgIDc5MDcsICA3OTE5LCAgNzkyNywKKyAgICA3OTMzLCAgNzkzNywgIDc5NDksICA3OTUxLCAgNzk2MywgIDc5OTMsICA4MDA5LCAgODAxMSwgIDgwMTcsICA4MDM5LCAgODA1MywKKyAgICA4MDU5LCAgODA2OSwgIDgwODEsICA4MDg3LCAgODA4OSwgIDgwOTMsICA4MTAxLCAgODExMSwgIDgxMTcsICA4MTIzLCAgODE0NywKKyAgICA4MTYxLCAgODE2NywgIDgxNzEsICA4MTc5LCAgODE5MSwgIDgyMDksICA4MjE5LCAgODIyMSwgIDgyMzEsICA4MjMzLCAgODIzNywKKyAgICA4MjQzLCAgODI2MywgIDgyNjksICA4MjczLCAgODI4NywgIDgyOTEsICA4MjkzLCAgODI5NywgIDgzMTEsICA4MzE3LCAgODMyOSwKKyAgICA4MzUzLCAgODM2MywgIDgzNjksICA4Mzc3LCAgODM4NywgIDgzODksICA4NDE5LCAgODQyMywgIDg0MjksICA4NDMxLCAgODQ0MywKKyAgICA4NDQ3LCAgODQ2MSwgIDg0NjcsICA4NTAxLCAgODUxMywgIDg1MjEsICA4NTI3LCAgODUzNywgIDg1MzksICA4NTQzLCAgODU2MywKKyAgICA4NTczLCAgODU4MSwgIDg1OTcsICA4NTk5LCAgODYwOSwgIDg2MjMsICA4NjI3LCAgODYyOSwgIDg2NDEsICA4NjQ3LCAgODY2MywKKyAgICA4NjY5LCAgODY3NywgIDg2ODEsICA4Njg5LCAgODY5MywgIDg2OTksICA4NzA3LCAgODcxMywgIDg3MTksICA4NzMxLCAgODczNywKKyAgICA4NzQxLCAgODc0NywgIDg3NTMsICA4NzYxLCAgODc3OSwgIDg3ODMsICA4ODAzLCAgODgwNywgIDg4MTksICA4ODIxLCAgODgzMSwKKyAgICA4ODM3LCAgODgzOSwgIDg4NDksICA4ODYxLCAgODg2MywgIDg4NjcsICA4ODg3LCAgODg5MywgIDg5MjMsICA4OTI5LCAgODkzMywKKyAgICA4OTQxLCAgODk1MSwgIDg5NjMsICA4OTY5LCAgODk3MSwgIDg5OTksICA5MDAxLCAgOTAwNywgIDkwMTEsICA5MDEzLCAgOTAyOSwKKyAgICA5MDQxLCAgOTA0MywgIDkwNDksICA5MDU5LCAgOTA2NywgIDkwOTEsICA5MTAzLCAgOTEwOSwgIDkxMjcsICA5MTMzLCAgOTEzNywKKyAgICA5MTUxLCAgOTE1NywgIDkxNjEsICA5MTczLCAgOTE4MSwgIDkxODcsICA5MTk5LCAgOTIwMywgIDkyMDksICA5MjIxLCAgOTIyNywKKyAgICA5MjM5LCAgOTI0MSwgIDkyNTcsICA5Mjc3LCAgOTI4MSwgIDkyODMsICA5MjkzLCAgOTMxMSwgIDkzMTksICA5MzIzLCAgOTMzNywKKyAgICA5MzQxLCAgOTM0MywgIDkzNDksICA5MzcxLCAgOTM3NywgIDkzOTEsICA5Mzk3LCAgOTQwMywgIDk0MTMsICA5NDE5LCAgOTQyMSwKKyAgICA5NDMxLCAgOTQzMywgIDk0MzcsICA5NDM5LCAgOTQ2MSwgIDk0NjMsICA5NDY3LCAgOTQ3MywgIDk0NzksICA5NDkxLCAgOTQ5NywKKyAgICA5NTExLCAgOTUyMSwgIDk1MzMsICA5NTM5LCAgOTU0NywgIDk1NTEsICA5NTg3LCAgOTYwMSwgIDk2MTMsICA5NjE5LCAgOTYyMywKKyAgICA5NjI5LCAgOTYzMSwgIDk2NDMsICA5NjQ5LCAgOTY2MSwgIDk2NzcsICA5Njc5LCAgOTY4OSwgIDk2OTcsICA5NzE5LCAgOTcyMSwKKyAgICA5NzMzLCAgOTczOSwgIDk3NDMsICA5NzQ5LCAgOTc2NywgIDk3NjksICA5NzgxLCAgOTc4NywgIDk3OTEsICA5ODAzLCAgOTgxMSwKKyAgICA5ODE3LCAgOTgyOSwgIDk4MzMsICA5ODM5LCAgOTg1MSwgIDk4NTcsICA5ODU5LCAgOTg3MSwgIDk4ODMsICA5ODg3LCAgOTkwMSwKKyAgICA5OTA3LCAgOTkyMywgIDk5MjksICA5OTMxLCAgOTk0MSwgIDk5NDksICA5OTY3LCAgOTk3MywgIDEwMDA3LCAxMDAwOSwgMTAwMzcsCisgICAgMTAwMzksIDEwMDYxLCAxMDA2NywgMTAwNjksIDEwMDc5LCAxMDA5MSwgMTAwOTMsIDEwMDk5LCAxMDEwMywgMTAxMTEsIDEwMTMzLAorICAgIDEwMTM5LCAxMDE0MSwgMTAxNTEsIDEwMTU5LCAxMDE2MywgMTAxNjksIDEwMTc3LCAxMDE4MSwgMTAxOTMsIDEwMjExLCAxMDIyMywKKyAgICAxMDI0MywgMTAyNDcsIDEwMjUzLCAxMDI1OSwgMTAyNjcsIDEwMjcxLCAxMDI3MywgMTAyODksIDEwMzAxLCAxMDMwMywgMTAzMTMsCisgICAgMTAzMjEsIDEwMzMxLCAxMDMzMywgMTAzMzcsIDEwMzQzLCAxMDM1NywgMTAzNjksIDEwMzkxLCAxMDM5OSwgMTA0MjcsIDEwNDI5LAorICAgIDEwNDMzLCAxMDQ1MywgMTA0NTcsIDEwNDU5LCAxMDQ2MywgMTA0NzcsIDEwNDg3LCAxMDQ5OSwgMTA1MDEsIDEwNTEzLCAxMDUyOSwKKyAgICAxMDUzMSwgMTA1NTksIDEwNTY3LCAxMDU4OSwgMTA1OTcsIDEwNjAxLCAxMDYwNywgMTA2MTMsIDEwNjI3LCAxMDYzMSwgMTA2MzksCisgICAgMTA2NTEsIDEwNjU3LCAxMDY2MywgMTA2NjcsIDEwNjg3LCAxMDY5MSwgMTA3MDksIDEwNzExLCAxMDcyMywgMTA3MjksIDEwNzMzLAorICAgIDEwNzM5LCAxMDc1MywgMTA3NzEsIDEwNzgxLCAxMDc4OSwgMTA3OTksIDEwODMxLCAxMDgzNywgMTA4NDcsIDEwODUzLCAxMDg1OSwKKyAgICAxMDg2MSwgMTA4NjcsIDEwODgzLCAxMDg4OSwgMTA4OTEsIDEwOTAzLCAxMDkwOSwgMTA5MzcsIDEwOTM5LCAxMDk0OSwgMTA5NTcsCisgICAgMTA5NzMsIDEwOTc5LCAxMDk4NywgMTA5OTMsIDExMDAzLCAxMTAyNywgMTEwNDcsIDExMDU3LCAxMTA1OSwgMTEwNjksIDExMDcxLAorICAgIDExMDgzLCAxMTA4NywgMTEwOTMsIDExMTEzLCAxMTExNywgMTExMTksIDExMTMxLCAxMTE0OSwgMTExNTksIDExMTYxLCAxMTE3MSwKKyAgICAxMTE3MywgMTExNzcsIDExMTk3LCAxMTIxMywgMTEyMzksIDExMjQzLCAxMTI1MSwgMTEyNTcsIDExMjYxLCAxMTI3MywgMTEyNzksCisgICAgMTEyODcsIDExMjk5LCAxMTMxMSwgMTEzMTcsIDExMzIxLCAxMTMyOSwgMTEzNTEsIDExMzUzLCAxMTM2OSwgMTEzODMsIDExMzkzLAorICAgIDExMzk5LCAxMTQxMSwgMTE0MjMsIDExNDM3LCAxMTQ0MywgMTE0NDcsIDExNDY3LCAxMTQ3MSwgMTE0ODMsIDExNDg5LCAxMTQ5MSwKKyAgICAxMTQ5NywgMTE1MDMsIDExNTE5LCAxMTUyNywgMTE1NDksIDExNTUxLCAxMTU3OSwgMTE1ODcsIDExNTkzLCAxMTU5NywgMTE2MTcsCisgICAgMTE2MjEsIDExNjMzLCAxMTY1NywgMTE2NzcsIDExNjgxLCAxMTY4OSwgMTE2OTksIDExNzAxLCAxMTcxNywgMTE3MTksIDExNzMxLAorICAgIDExNzQzLCAxMTc3NywgMTE3NzksIDExNzgzLCAxMTc4OSwgMTE4MDEsIDExODA3LCAxMTgxMywgMTE4MjEsIDExODI3LCAxMTgzMSwKKyAgICAxMTgzMywgMTE4MzksIDExODYzLCAxMTg2NywgMTE4ODcsIDExODk3LCAxMTkwMywgMTE5MDksIDExOTIzLCAxMTkyNywgMTE5MzMsCisgICAgMTE5MzksIDExOTQxLCAxMTk1MywgMTE5NTksIDExOTY5LCAxMTk3MSwgMTE5ODEsIDExOTg3LCAxMjAwNywgMTIwMTEsIDEyMDM3LAorICAgIDEyMDQxLCAxMjA0MywgMTIwNDksIDEyMDcxLCAxMjA3MywgMTIwOTcsIDEyMTAxLCAxMjEwNywgMTIxMDksIDEyMTEzLCAxMjExOSwKKyAgICAxMjE0MywgMTIxNDksIDEyMTU3LCAxMjE2MSwgMTIxNjMsIDEyMTk3LCAxMjIwMywgMTIyMTEsIDEyMjI3LCAxMjIzOSwgMTIyNDEsCisgICAgMTIyNTEsIDEyMjUzLCAxMjI2MywgMTIyNjksIDEyMjc3LCAxMjI4MSwgMTIyODksIDEyMzAxLCAxMjMyMywgMTIzMjksIDEyMzQzLAorICAgIDEyMzQ3LCAxMjM3MywgMTIzNzcsIDEyMzc5LCAxMjM5MSwgMTI0MDEsIDEyNDA5LCAxMjQxMywgMTI0MjEsIDEyNDMzLCAxMjQzNywKKyAgICAxMjQ1MSwgMTI0NTcsIDEyNDczLCAxMjQ3OSwgMTI0ODcsIDEyNDkxLCAxMjQ5NywgMTI1MDMsIDEyNTExLCAxMjUxNywgMTI1MjcsCisgICAgMTI1MzksIDEyNTQxLCAxMjU0NywgMTI1NTMsIDEyNTY5LCAxMjU3NywgMTI1ODMsIDEyNTg5LCAxMjYwMSwgMTI2MTEsIDEyNjEzLAorICAgIDEyNjE5LCAxMjYzNywgMTI2NDEsIDEyNjQ3LCAxMjY1MywgMTI2NTksIDEyNjcxLCAxMjY4OSwgMTI2OTcsIDEyNzAzLCAxMjcxMywKKyAgICAxMjcyMSwgMTI3MzksIDEyNzQzLCAxMjc1NywgMTI3NjMsIDEyNzgxLCAxMjc5MSwgMTI3OTksIDEyODA5LCAxMjgyMSwgMTI4MjMsCisgICAgMTI4MjksIDEyODQxLCAxMjg1MywgMTI4ODksIDEyODkzLCAxMjg5OSwgMTI5MDcsIDEyOTExLCAxMjkxNywgMTI5MTksIDEyOTIzLAorICAgIDEyOTQxLCAxMjk1MywgMTI5NTksIDEyOTY3LCAxMjk3MywgMTI5NzksIDEyOTgzLCAxMzAwMSwgMTMwMDMsIDEzMDA3LCAxMzAwOSwKKyAgICAxMzAzMywgMTMwMzcsIDEzMDQzLCAxMzA0OSwgMTMwNjMsIDEzMDkzLCAxMzA5OSwgMTMxMDMsIDEzMTA5LCAxMzEyMSwgMTMxMjcsCisgICAgMTMxNDcsIDEzMTUxLCAxMzE1OSwgMTMxNjMsIDEzMTcxLCAxMzE3NywgMTMxODMsIDEzMTg3LCAxMzIxNywgMTMyMTksIDEzMjI5LAorICAgIDEzMjQxLCAxMzI0OSwgMTMyNTksIDEzMjY3LCAxMzI5MSwgMTMyOTcsIDEzMzA5LCAxMzMxMywgMTMzMjcsIDEzMzMxLCAxMzMzNywKKyAgICAxMzMzOSwgMTMzNjcsIDEzMzgxLCAxMzM5NywgMTMzOTksIDEzNDExLCAxMzQxNywgMTM0MjEsIDEzNDQxLCAxMzQ1MSwgMTM0NTcsCisgICAgMTM0NjMsIDEzNDY5LCAxMzQ3NywgMTM0ODcsIDEzNDk5LCAxMzUxMywgMTM1MjMsIDEzNTM3LCAxMzU1MywgMTM1NjcsIDEzNTc3LAorICAgIDEzNTkxLCAxMzU5NywgMTM2MTMsIDEzNjE5LCAxMzYyNywgMTM2MzMsIDEzNjQ5LCAxMzY2OSwgMTM2NzksIDEzNjgxLCAxMzY4NywKKyAgICAxMzY5MSwgMTM2OTMsIDEzNjk3LCAxMzcwOSwgMTM3MTEsIDEzNzIxLCAxMzcyMywgMTM3MjksIDEzNzUxLCAxMzc1NywgMTM3NTksCisgICAgMTM3NjMsIDEzNzgxLCAxMzc4OSwgMTM3OTksIDEzODA3LCAxMzgyOSwgMTM4MzEsIDEzODQxLCAxMzg1OSwgMTM4NzMsIDEzODc3LAorICAgIDEzODc5LCAxMzg4MywgMTM5MDEsIDEzOTAzLCAxMzkwNywgMTM5MTMsIDEzOTIxLCAxMzkzMSwgMTM5MzMsIDEzOTYzLCAxMzk2NywKKyAgICAxMzk5NywgMTM5OTksIDE0MDA5LCAxNDAxMSwgMTQwMjksIDE0MDMzLCAxNDA1MSwgMTQwNTcsIDE0MDcxLCAxNDA4MSwgMTQwODMsCisgICAgMTQwODcsIDE0MTA3LCAxNDE0MywgMTQxNDksIDE0MTUzLCAxNDE1OSwgMTQxNzMsIDE0MTc3LCAxNDE5NywgMTQyMDcsIDE0MjIxLAorICAgIDE0MjQzLCAxNDI0OSwgMTQyNTEsIDE0MjgxLCAxNDI5MywgMTQzMDMsIDE0MzIxLCAxNDMyMywgMTQzMjcsIDE0MzQxLCAxNDM0NywKKyAgICAxNDM2OSwgMTQzODcsIDE0Mzg5LCAxNDQwMSwgMTQ0MDcsIDE0NDExLCAxNDQxOSwgMTQ0MjMsIDE0NDMxLCAxNDQzNywgMTQ0NDcsCisgICAgMTQ0NDksIDE0NDYxLCAxNDQ3OSwgMTQ0ODksIDE0NTAzLCAxNDUxOSwgMTQ1MzMsIDE0NTM3LCAxNDU0MywgMTQ1NDksIDE0NTUxLAorICAgIDE0NTU3LCAxNDU2MSwgMTQ1NjMsIDE0NTkxLCAxNDU5MywgMTQ2MjEsIDE0NjI3LCAxNDYyOSwgMTQ2MzMsIDE0NjM5LCAxNDY1MywKKyAgICAxNDY1NywgMTQ2NjksIDE0NjgzLCAxNDY5OSwgMTQ3MTMsIDE0NzE3LCAxNDcyMywgMTQ3MzEsIDE0NzM3LCAxNDc0MSwgMTQ3NDcsCisgICAgMTQ3NTMsIDE0NzU5LCAxNDc2NywgMTQ3NzEsIDE0Nzc5LCAxNDc4MywgMTQ3OTcsIDE0ODEzLCAxNDgyMSwgMTQ4MjcsIDE0ODMxLAorICAgIDE0ODQzLCAxNDg1MSwgMTQ4NjcsIDE0ODY5LCAxNDg3OSwgMTQ4ODcsIDE0ODkxLCAxNDg5NywgMTQ5MjMsIDE0OTI5LCAxNDkzOSwKKyAgICAxNDk0NywgMTQ5NTEsIDE0OTU3LCAxNDk2OSwgMTQ5ODMsIDE1MDEzLCAxNTAxNywgMTUwMzEsIDE1MDUzLCAxNTA2MSwgMTUwNzMsCisgICAgMTUwNzcsIDE1MDgzLCAxNTA5MSwgMTUxMDEsIDE1MTA3LCAxNTEyMSwgMTUxMzEsIDE1MTM3LCAxNTEzOSwgMTUxNDksIDE1MTYxLAorICAgIDE1MTczLCAxNTE4NywgMTUxOTMsIDE1MTk5LCAxNTIxNywgMTUyMjcsIDE1MjMzLCAxNTI0MSwgMTUyNTksIDE1MjYzLCAxNTI2OSwKKyAgICAxNTI3MSwgMTUyNzcsIDE1Mjg3LCAxNTI4OSwgMTUyOTksIDE1MzA3LCAxNTMxMywgMTUzMTksIDE1MzI5LCAxNTMzMSwgMTUzNDksCisgICAgMTUzNTksIDE1MzYxLCAxNTM3MywgMTUzNzcsIDE1MzgzLCAxNTM5MSwgMTU0MDEsIDE1NDEzLCAxNTQyNywgMTU0MzksIDE1NDQzLAorICAgIDE1NDUxLCAxNTQ2MSwgMTU0NjcsIDE1NDczLCAxNTQ5MywgMTU0OTcsIDE1NTExLCAxNTUyNywgMTU1NDEsIDE1NTUxLCAxNTU1OSwKKyAgICAxNTU2OSwgMTU1ODEsIDE1NTgzLCAxNTYwMSwgMTU2MDcsIDE1NjE5LCAxNTYyOSwgMTU2NDEsIDE1NjQzLCAxNTY0NywgMTU2NDksCisgICAgMTU2NjEsIDE1NjY3LCAxNTY3MSwgMTU2NzksIDE1NjgzLCAxNTcyNywgMTU3MzEsIDE1NzMzLCAxNTczNywgMTU3MzksIDE1NzQ5LAorICAgIDE1NzYxLCAxNTc2NywgMTU3NzMsIDE1Nzg3LCAxNTc5MSwgMTU3OTcsIDE1ODAzLCAxNTgwOSwgMTU4MTcsIDE1ODIzLCAxNTg1OSwKKyAgICAxNTg3NywgMTU4ODEsIDE1ODg3LCAxNTg4OSwgMTU5MDEsIDE1OTA3LCAxNTkxMywgMTU5MTksIDE1OTIzLCAxNTkzNywgMTU5NTksCisgICAgMTU5NzEsIDE1OTczLCAxNTk5MSwgMTYwMDEsIDE2MDA3LCAxNjAzMywgMTYwNTcsIDE2MDYxLCAxNjA2MywgMTYwNjcsIDE2MDY5LAorICAgIDE2MDczLCAxNjA4NywgMTYwOTEsIDE2MDk3LCAxNjEwMywgMTYxMTEsIDE2MTI3LCAxNjEzOSwgMTYxNDEsIDE2MTgzLCAxNjE4NywKKyAgICAxNjE4OSwgMTYxOTMsIDE2MjE3LCAxNjIyMywgMTYyMjksIDE2MjMxLCAxNjI0OSwgMTYyNTMsIDE2MjY3LCAxNjI3MywgMTYzMDEsCisgICAgMTYzMTksIDE2MzMzLCAxNjMzOSwgMTYzNDksIDE2MzYxLCAxNjM2MywgMTYzNjksIDE2MzgxLCAxNjQxMSwgMTY0MTcsIDE2NDIxLAorICAgIDE2NDI3LCAxNjQzMywgMTY0NDcsIDE2NDUxLCAxNjQ1MywgMTY0NzcsIDE2NDgxLCAxNjQ4NywgMTY0OTMsIDE2NTE5LCAxNjUyOSwKKyAgICAxNjU0NywgMTY1NTMsIDE2NTYxLCAxNjU2NywgMTY1NzMsIDE2NjAzLCAxNjYwNywgMTY2MTksIDE2NjMxLCAxNjYzMywgMTY2NDksCisgICAgMTY2NTEsIDE2NjU3LCAxNjY2MSwgMTY2NzMsIDE2NjkxLCAxNjY5MywgMTY2OTksIDE2NzAzLCAxNjcyOSwgMTY3NDEsIDE2NzQ3LAorICAgIDE2NzU5LCAxNjc2MywgMTY3ODcsIDE2ODExLCAxNjgyMywgMTY4MjksIDE2ODMxLCAxNjg0MywgMTY4NzEsIDE2ODc5LCAxNjg4MywKKyAgICAxNjg4OSwgMTY5MDEsIDE2OTAzLCAxNjkyMSwgMTY5MjcsIDE2OTMxLCAxNjkzNywgMTY5NDMsIDE2OTYzLCAxNjk3OSwgMTY5ODEsCisgICAgMTY5ODcsIDE2OTkzLCAxNzAxMSwgMTcwMjEsIDE3MDI3LCAxNzAyOSwgMTcwMzMsIDE3MDQxLCAxNzA0NywgMTcwNTMsIDE3MDc3LAorICAgIDE3MDkzLCAxNzA5OSwgMTcxMDcsIDE3MTE3LCAxNzEyMywgMTcxMzcsIDE3MTU5LCAxNzE2NywgMTcxODMsIDE3MTg5LCAxNzE5MSwKKyAgICAxNzIwMywgMTcyMDcsIDE3MjA5LCAxNzIzMSwgMTcyMzksIDE3MjU3LCAxNzI5MSwgMTcyOTMsIDE3Mjk5LCAxNzMxNywgMTczMjEsCisgICAgMTczMjcsIDE3MzMzLCAxNzM0MSwgMTczNTEsIDE3MzU5LCAxNzM3NywgMTczODMsIDE3Mzg3LCAxNzM4OSwgMTczOTMsIDE3NDAxLAorICAgIDE3NDE3LCAxNzQxOSwgMTc0MzEsIDE3NDQzLCAxNzQ0OSwgMTc0NjcsIDE3NDcxLCAxNzQ3NywgMTc0ODMsIDE3NDg5LCAxNzQ5MSwKKyAgICAxNzQ5NywgMTc1MDksIDE3NTE5LCAxNzUzOSwgMTc1NTEsIDE3NTY5LCAxNzU3MywgMTc1NzksIDE3NTgxLCAxNzU5NywgMTc1OTksCisgICAgMTc2MDksIDE3NjIzLCAxNzYyNywgMTc2NTcsIDE3NjU5LCAxNzY2OSwgMTc2ODEsIDE3NjgzLCAxNzcwNywgMTc3MTMsIDE3NzI5LAorICAgIDE3NzM3LCAxNzc0NywgMTc3NDksIDE3NzYxLCAxNzc4MywgMTc3ODksIDE3NzkxLCAxNzgwNywgMTc4MjcsIDE3ODM3LCAxNzgzOSwKKyAgICAxNzg1MSwgMTc4NjMsIH07CmRpZmYgLS1naXQgYS9jcnlwdG8vYm4vcmFuZG9tLmMgYi9jcnlwdG8vYm4vcmFuZG9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYxZDczMgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9ibi9yYW5kb20uYwpAQCAtMCwwICsxLDIzNyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAxIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKworaW50IEJOX3JhbmQoQklHTlVNICpybmQsIGludCBiaXRzLCBpbnQgdG9wLCBpbnQgYm90dG9tKSB7CisgIHVpbnQ4X3QgKmJ1ZiA9IE5VTEw7CisgIGludCByZXQgPSAwLCBiaXQsIGJ5dGVzLCBtYXNrOworCisgIGlmIChiaXRzID09IDApIHsKKyAgICBCTl96ZXJvKHJuZCk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBieXRlcyA9IChiaXRzICsgNykgLyA4OworICBiaXQgPSAoYml0cyAtIDEpICUgODsKKyAgbWFzayA9IDB4ZmYgPDwgKGJpdCArIDEpOworCisgIGJ1ZiA9IE9QRU5TU0xfbWFsbG9jKGJ5dGVzKTsKKyAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX3JhbmQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIC8qIG1ha2UgYSByYW5kb20gbnVtYmVyIGFuZCBzZXQgdGhlIHRvcCBhbmQgYm90dG9tIGJpdHMgKi8KKyAgaWYgKFJBTkRfcHNldWRvX2J5dGVzKGJ1ZiwgYnl0ZXMpIDw9IDApCisgICAgZ290byBlcnI7CisKKyAgaWYgKHRvcCAhPSAtMSkgeworICAgIGlmICh0b3ApIHsKKyAgICAgIGlmIChiaXQgPT0gMCkgeworICAgICAgICBidWZbMF0gPSAxOworICAgICAgICBidWZbMV0gfD0gMHg4MDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJ1ZlswXSB8PSAoMyA8PCAoYml0IC0gMSkpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBidWZbMF0gfD0gKDEgPDwgYml0KTsKKyAgICB9CisgIH0KKworICBidWZbMF0gJj0gfm1hc2s7CisKKyAgLyogc2V0IGJvdHRvbSBiaXQgaWYgcmVxdWVzdGVkICovCisgIGlmIChib3R0b20pICB7CisgICAgYnVmW2J5dGVzIC0gMV0gfD0gMTsKKyAgfQorCisgIGlmICghQk5fYmluMmJuKGJ1ZiwgYnl0ZXMsIHJuZCkpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIHJldCA9IDE7CisKK2VycjoKKyAgaWYgKGJ1ZiAhPSBOVUxMKSB7CisgICAgT1BFTlNTTF9jbGVhbnNlKGJ1ZiwgYnl0ZXMpOworICAgIE9QRU5TU0xfZnJlZShidWYpOworICB9CisgIHJldHVybiAocmV0KTsKK30KKworaW50IEJOX3BzZXVkb19yYW5kKEJJR05VTSAqcm5kLCBpbnQgYml0cywgaW50IHRvcCwgaW50IGJvdHRvbSkgeworICByZXR1cm4gQk5fcmFuZChybmQsIGJpdHMsIHRvcCwgYm90dG9tKTsKK30KKworaW50IEJOX3JhbmRfcmFuZ2UoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKnJhbmdlKSB7CisgIHVuc2lnbmVkIG47CisgIHVuc2lnbmVkIGNvdW50ID0gMTAwOworCisgIGlmIChyYW5nZS0+bmVnIHx8IEJOX2lzX3plcm8ocmFuZ2UpKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX3JhbmRfcmFuZ2UsIEJOX1JfSU5WQUxJRF9SQU5HRSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBuID0gQk5fbnVtX2JpdHMocmFuZ2UpOyAvKiBuID4gMCAqLworCisgIC8qIEJOX2lzX2JpdF9zZXQocmFuZ2UsIG4gLSAxKSBhbHdheXMgaG9sZHMgKi8KKyAgaWYgKG4gPT0gMSkgeworICAgIEJOX3plcm8ocik7CisgIH0gZWxzZSBpZiAoIUJOX2lzX2JpdF9zZXQocmFuZ2UsIG4gLSAyKSAmJiAhQk5faXNfYml0X3NldChyYW5nZSwgbiAtIDMpKSB7CisgICAgLyogcmFuZ2UgPSAxMDAuLi5fMiwKKyAgICAgKiBzbyAgMypyYW5nZSAoPSAxMS4uLl8yKSAgaXMgZXhhY3RseSBvbmUgYml0IGxvbmdlciB0aGFuICByYW5nZSAqLworICAgIGRvIHsKKyAgICAgIGlmICghQk5fcmFuZChyLCBuICsgMSwgLTEgLyogZG9uJ3Qgc2V0IG1vc3Qgc2lnbmlmaWNhbnQgYml0cyAqLywKKyAgICAgICAgICAgICAgICAgICAwIC8qIGRvbid0IHNldCBsZWFzdCBzaWduaWZpY2FudCBiaXRzICovKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgLyogSWYgciA8IDMqcmFuZ2UsIHVzZSByIDo9IHIgTU9EIHJhbmdlICh3aGljaCBpcyBlaXRoZXIgciwgciAtIHJhbmdlLCBvcgorICAgICAgICogciAtIDIqcmFuZ2UpLiBPdGhlcndpc2UsIGl0ZXJhdGUgYWdhaW4uIFNpbmNlIDMqcmFuZ2UgPSAxMS4uLl8yLCBlYWNoCisgICAgICAgKiBpdGVyYXRpb24gc3VjY2VlZHMgd2l0aCBwcm9iYWJpbGl0eSA+PSAuNzUuICovCisgICAgICBpZiAoQk5fY21wKHIsIHJhbmdlKSA+PSAwKSB7CisgICAgICAgIGlmICghQk5fc3ViKHIsIHIsIHJhbmdlKSkgeworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmIChCTl9jbXAociwgcmFuZ2UpID49IDApIHsKKyAgICAgICAgICBpZiAoIUJOX3N1YihyLCByLCByYW5nZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoIS0tY291bnQpIHsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX3JhbmRfcmFuZ2UsIEJOX1JfVE9PX01BTllfSVRFUkFUSU9OUyk7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgIH0gd2hpbGUgKEJOX2NtcChyLCByYW5nZSkgPj0gMCk7CisgIH0gZWxzZSB7CisgICAgZG8geworICAgICAgLyogcmFuZ2UgPSAxMS4uLl8yICBvciAgcmFuZ2UgPSAxMDEuLi5fMiAqLworICAgICAgaWYgKCFCTl9yYW5kKHIsIG4sIC0xLCAwKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgaWYgKCEtLWNvdW50KSB7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9yYW5kX3JhbmdlLCBCTl9SX1RPT19NQU5ZX0lURVJBVElPTlMpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9IHdoaWxlIChCTl9jbXAociwgcmFuZ2UpID49IDApOworICB9CisKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBCTl9wc2V1ZG9fcmFuZF9yYW5nZShCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqcmFuZ2UpIHsKKyAgcmV0dXJuIEJOX3JhbmRfcmFuZ2UociwgcmFuZ2UpOworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2JuL3JzYXpfZXhwLmMgYi9jcnlwdG8vYm4vcnNhel9leHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2JiMzUxCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2JuL3JzYXpfZXhwLmMKQEAgLTAsMCArMSwzMjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICBDb3B5cmlnaHQgKGMpIDIwMTIsIEludGVsIENvcnBvcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCAgICAgICAgKgorKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSAgICAqCisqICBtZXQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgKiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgICAgICAgICAqCisqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgKiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgICAgICAqCisqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlICAgICoKKyogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSAgICAgICAgICAgICAgICAgKgorKiAgICAgZGlzdHJpYnV0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICogIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzICAgICAgICAgKgorKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gICAqCisqICAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAgICAgICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIElOVEVMIENPUlBPUkFUSU9OICIiQVMgSVMiIiBBTkQgQU5ZICAgICAgICAgICoKKyogIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFICAgICAgICAgKgorKiAgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSICAgICAgICAqCisqICBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBJTlRFTCBDT1JQT1JBVElPTiBPUiAgICAgICAgICAgICoKKyogIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCAgICAgKgorKiAgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCAgICAgICAqCisqICBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgICAgICAgICoKKyogIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgICAgKgorKiAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgICAgICAqCisqICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgICAgICAgICoKKyogIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRGV2ZWxvcGVycyBhbmQgYXV0aG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBTaGF5IEd1ZXJvbiAoMSwgMiksIGFuZCBWbGFkIEtyYXNub3YgKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICgxKSBJbnRlbCBDb3Jwb3JhdGlvbiwgSXNyYWVsIERldmVsb3BtZW50IENlbnRlciwgSGFpZmEsIElzcmFlbCAgICAgICAgICAgICoKKyogKDIpIFVuaXZlcnNpdHkgb2YgSGFpZmEsIElzcmFlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJyc2F6X2V4cC5oIgorCisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKworLyoKKyAqIFNlZSBjcnlwdG8vYm4vYXNtL3JzYXotYXZ4Mi5wbCBmb3IgZnVydGhlciBkZXRhaWxzLgorICovCit2b2lkIHJzYXpfMTAyNF9ub3JtMnJlZF9hdngyKHZvaWQgKnJlZCxjb25zdCB2b2lkICpub3JtKTsKK3ZvaWQgcnNhel8xMDI0X211bF9hdngyKHZvaWQgKnJldCxjb25zdCB2b2lkICphLGNvbnN0IHZvaWQgKmIsY29uc3Qgdm9pZCAqbixCTl9VTE9ORyBrKTsKK3ZvaWQgcnNhel8xMDI0X3Nxcl9hdngyKHZvaWQgKnJldCxjb25zdCB2b2lkICphLGNvbnN0IHZvaWQgKm4sQk5fVUxPTkcgayxpbnQgY250KTsKK3ZvaWQgcnNhel8xMDI0X3NjYXR0ZXI1X2F2eDIodm9pZCAqdGJsLGNvbnN0IHZvaWQgKnZhbCxpbnQgaSk7Cit2b2lkIHJzYXpfMTAyNF9nYXRoZXI1X2F2eDIodm9pZCAqdmFsLGNvbnN0IHZvaWQgKnRibCxpbnQgaSk7Cit2b2lkIHJzYXpfMTAyNF9yZWQybm9ybV9hdngyKHZvaWQgKm5vcm0sY29uc3Qgdm9pZCAqcmVkKTsKKworI2lmIGRlZmluZWQoX19HTlVDX18pCisjIGRlZmluZSBBTElHTjY0CV9fYXR0cmlidXRlX18oKGFsaWduZWQoNjQpKSkKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisjIGRlZmluZSBBTElHTjY0CV9fZGVjbHNwZWMoYWxpZ24oNjQpKQorI2VsaWYgZGVmaW5lZChfX1NVTlBST19DKQorIyBkZWZpbmUgQUxJR042NAorIyBwcmFnbWEgYWxpZ24gNjQob25lLHR3bzgwKQorI2Vsc2UKKyMgZGVmaW5lIEFMSUdONjQJLyogbm90IGZhdGFsLCBtaWdodCBodXJ0IHBlcmZvcm1hbmNlIGEgbGl0dGxlICovCisjZW5kaWYKKworQUxJR042NCBzdGF0aWMgY29uc3QgQk5fVUxPTkcgb25lWzQwXSA9CisJezEsMCwwLCAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfTsKK0FMSUdONjQgc3RhdGljIGNvbnN0IEJOX1VMT05HIHR3bzgwWzQwXSA9CisJezAsMCwxPDwyMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfTsKKwordm9pZCBSU0FaXzEwMjRfbW9kX2V4cF9hdngyKEJOX1VMT05HIHJlc3VsdF9ub3JtWzE2XSwKKwljb25zdCBCTl9VTE9ORyBiYXNlX25vcm1bMTZdLCBjb25zdCBCTl9VTE9ORyBleHBvbmVudFsxNl0sCisJY29uc3QgQk5fVUxPTkcgbV9ub3JtWzE2XSwgY29uc3QgQk5fVUxPTkcgUlJbMTZdLCBCTl9VTE9ORyBrMCkKK3sKKwl1bnNpZ25lZCBjaGFyCSBzdG9yYWdlWzMyMCozKzMyKjkqMTYrNjRdOwkvKiA1LjVLQiAqLworCXVuc2lnbmVkIGNoYXIJKnBfc3RyID0gc3RvcmFnZSArICg2NC0oKHNpemVfdClzdG9yYWdlJTY0KSk7CisJdW5zaWduZWQgY2hhcgkqYV9pbnYsICptLCAqcmVzdWx0LAorCQkJKnRhYmxlX3MgPSBwX3N0ciszMjAqMywKKwkJCSpSMiAgICAgID0gdGFibGVfczsJLyogYm9ycm93ICovCisJaW50IGluZGV4OworCWludCB3dmFsdWU7CisKKwlpZiAoKCgoc2l6ZV90KXBfc3RyJjQwOTUpKzMyMCk+PjEyKSB7CisJCXJlc3VsdCA9IHBfc3RyOworCQlhX2ludiA9IHBfc3RyICsgMzIwOworCQltID0gcF9zdHIgKyAzMjAqMjsJLyogc2hvdWxkIG5vdCBjcm9zcyBwYWdlICovCisJfSBlbHNlIHsKKwkJbSA9IHBfc3RyOwkJLyogc2hvdWxkIG5vdCBjcm9zcyBwYWdlICovCisJCXJlc3VsdCA9IHBfc3RyICsgMzIwOworCQlhX2ludiA9IHBfc3RyICsgMzIwKjI7CisJfQorCisJcnNhel8xMDI0X25vcm0ycmVkX2F2eDIobSwgbV9ub3JtKTsKKwlyc2F6XzEwMjRfbm9ybTJyZWRfYXZ4MihhX2ludiwgYmFzZV9ub3JtKTsKKwlyc2F6XzEwMjRfbm9ybTJyZWRfYXZ4MihSMiwgUlIpOworCisJcnNhel8xMDI0X211bF9hdngyKFIyLCBSMiwgUjIsIG0sIGswKTsKKwlyc2F6XzEwMjRfbXVsX2F2eDIoUjIsIFIyLCB0d284MCwgbSwgazApOworCisJLyogdGFibGVbMF0gPSAxICovCisJcnNhel8xMDI0X211bF9hdngyKHJlc3VsdCwgUjIsIG9uZSwgbSwgazApOworCS8qIHRhYmxlWzFdID0gYV9pbnZeMSAqLworCXJzYXpfMTAyNF9tdWxfYXZ4MihhX2ludiwgYV9pbnYsIFIyLCBtLCBrMCk7CisKKwlyc2F6XzEwMjRfc2NhdHRlcjVfYXZ4Mih0YWJsZV9zLHJlc3VsdCwwKTsKKwlyc2F6XzEwMjRfc2NhdHRlcjVfYXZ4Mih0YWJsZV9zLGFfaW52LDEpOworCisJLyogdGFibGVbMl0gPSBhX2ludl4yICovCisJcnNhel8xMDI0X3Nxcl9hdngyKHJlc3VsdCwgYV9pbnYsIG0sIGswLCAxKTsKKwlyc2F6XzEwMjRfc2NhdHRlcjVfYXZ4Mih0YWJsZV9zLHJlc3VsdCwyKTsKKyNpZiAwCisJLyogdGhpcyBpcyBhbG1vc3QgMnggc21hbGxlciBhbmQgbGVzcyB0aGFuIDElIHNsb3dlciAqLworCWZvciAoaW5kZXg9MzsgaW5kZXg8MzI7IGluZGV4KyspIHsKKwkJcnNhel8xMDI0X211bF9hdngyKHJlc3VsdCwgcmVzdWx0LCBhX2ludiwgbSwgazApOworCQlyc2F6XzEwMjRfc2NhdHRlcjVfYXZ4Mih0YWJsZV9zLHJlc3VsdCxpbmRleCk7CisJfQorI2Vsc2UKKwkvKiB0YWJsZVs0XSA9IGFfaW52XjQgKi8KKwlyc2F6XzEwMjRfc3FyX2F2eDIocmVzdWx0LCByZXN1bHQsIG0sIGswLCAxKTsKKwlyc2F6XzEwMjRfc2NhdHRlcjVfYXZ4Mih0YWJsZV9zLHJlc3VsdCw0KTsKKwkvKiB0YWJsZVs4XSA9IGFfaW52XjggKi8KKwlyc2F6XzEwMjRfc3FyX2F2eDIocmVzdWx0LCByZXN1bHQsIG0sIGswLCAxKTsKKwlyc2F6XzEwMjRfc2NhdHRlcjVfYXZ4Mih0YWJsZV9zLHJlc3VsdCw4KTsKKwkvKiB0YWJsZVsxNl0gPSBhX2ludl4xNiAqLworCXJzYXpfMTAyNF9zcXJfYXZ4MihyZXN1bHQsIHJlc3VsdCwgbSwgazAsIDEpOworCXJzYXpfMTAyNF9zY2F0dGVyNV9hdngyKHRhYmxlX3MscmVzdWx0LDE2KTsKKwkvKiB0YWJsZVsxN10gPSBhX2ludl4xNyAqLworCXJzYXpfMTAyNF9tdWxfYXZ4MihyZXN1bHQsIHJlc3VsdCwgYV9pbnYsIG0sIGswKTsKKwlyc2F6XzEwMjRfc2NhdHRlcjVfYXZ4Mih0YWJsZV9zLHJlc3VsdCwxNyk7CisKKwkvKiB0YWJsZVszXSAqLworCXJzYXpfMTAyNF9nYXRoZXI1X2F2eDIocmVzdWx0LHRhYmxlX3MsMik7CisJcnNhel8xMDI0X211bF9hdngyKHJlc3VsdCxyZXN1bHQsYV9pbnYsbSxrMCk7CisJcnNhel8xMDI0X3NjYXR0ZXI1X2F2eDIodGFibGVfcyxyZXN1bHQsMyk7CisJLyogdGFibGVbNl0gKi8KKwlyc2F6XzEwMjRfc3FyX2F2eDIocmVzdWx0LCByZXN1bHQsIG0sIGswLCAxKTsKKwlyc2F6XzEwMjRfc2NhdHRlcjVfYXZ4Mih0YWJsZV9zLHJlc3VsdCw2KTsKKwkvKiB0YWJsZVsxMl0gKi8KKwlyc2F6XzEwMjRfc3FyX2F2eDIocmVzdWx0LCByZXN1bHQsIG0sIGswLCAxKTsKKwlyc2F6XzEwMjRfc2NhdHRlcjVfYXZ4Mih0YWJsZV9zLHJlc3VsdCwxMik7CisgCS8qIHRhYmxlWzI0XSAqLworCXJzYXpfMTAyNF9zcXJfYXZ4MihyZXN1bHQsIHJlc3VsdCwgbSwgazAsIDEpOworCXJzYXpfMTAyNF9zY2F0dGVyNV9hdngyKHRhYmxlX3MscmVzdWx0LDI0KTsKKwkvKiB0YWJsZVsyNV0gKi8KKwlyc2F6XzEwMjRfbXVsX2F2eDIocmVzdWx0LCByZXN1bHQsIGFfaW52LCBtLCBrMCk7CisJcnNhel8xMDI0X3NjYXR0ZXI1X2F2eDIodGFibGVfcyxyZXN1bHQsMjUpOworCisJLyogdGFibGVbNV0gKi8KKwlyc2F6XzEwMjRfZ2F0aGVyNV9hdngyKHJlc3VsdCx0YWJsZV9zLDQpOworCXJzYXpfMTAyNF9tdWxfYXZ4MihyZXN1bHQscmVzdWx0LGFfaW52LG0sazApOworCXJzYXpfMTAyNF9zY2F0dGVyNV9hdngyKHRhYmxlX3MscmVzdWx0LDUpOworCS8qIHRhYmxlWzEwXSAqLworCXJzYXpfMTAyNF9zcXJfYXZ4MihyZXN1bHQsIHJlc3VsdCwgbSwgazAsIDEpOworCXJzYXpfMTAyNF9zY2F0dGVyNV9hdngyKHRhYmxlX3MscmVzdWx0LDEwKTsKKwkvKiB0YWJsZVsyMF0gKi8KKwlyc2F6XzEwMjRfc3FyX2F2eDIocmVzdWx0LCByZXN1bHQsIG0sIGswLCAxKTsKKwlyc2F6XzEwMjRfc2NhdHRlcjVfYXZ4Mih0YWJsZV9zLHJlc3VsdCwyMCk7CisJLyogdGFibGVbMjFdICovCisJcnNhel8xMDI0X211bF9hdngyKHJlc3VsdCwgcmVzdWx0LCBhX2ludiwgbSwgazApOworCXJzYXpfMTAyNF9zY2F0dGVyNV9hdngyKHRhYmxlX3MscmVzdWx0LDIxKTsKKworCS8qIHRhYmxlWzddICovCisJcnNhel8xMDI0X2dhdGhlcjVfYXZ4MihyZXN1bHQsdGFibGVfcyw2KTsKKwlyc2F6XzEwMjRfbXVsX2F2eDIocmVzdWx0LHJlc3VsdCxhX2ludixtLGswKTsKKwlyc2F6XzEwMjRfc2NhdHRlcjVfYXZ4Mih0YWJsZV9zLHJlc3VsdCw3KTsKKwkvKiB0YWJsZVsxNF0gKi8KKwlyc2F6XzEwMjRfc3FyX2F2eDIocmVzdWx0LCByZXN1bHQsIG0sIGswLCAxKTsKKwlyc2F6XzEwMjRfc2NhdHRlcjVfYXZ4Mih0YWJsZV9zLHJlc3VsdCwxNCk7CisJLyogdGFibGVbMjhdICovCisJcnNhel8xMDI0X3Nxcl9hdngyKHJlc3VsdCwgcmVzdWx0LCBtLCBrMCwgMSk7CisJcnNhel8xMDI0X3NjYXR0ZXI1X2F2eDIodGFibGVfcyxyZXN1bHQsMjgpOworCS8qIHRhYmxlWzI5XSAqLworCXJzYXpfMTAyNF9tdWxfYXZ4MihyZXN1bHQsIHJlc3VsdCwgYV9pbnYsIG0sIGswKTsKKwlyc2F6XzEwMjRfc2NhdHRlcjVfYXZ4Mih0YWJsZV9zLHJlc3VsdCwyOSk7CisKKwkvKiB0YWJsZVs5XSAqLworCXJzYXpfMTAyNF9nYXRoZXI1X2F2eDIocmVzdWx0LHRhYmxlX3MsOCk7CisJcnNhel8xMDI0X211bF9hdngyKHJlc3VsdCxyZXN1bHQsYV9pbnYsbSxrMCk7CisJcnNhel8xMDI0X3NjYXR0ZXI1X2F2eDIodGFibGVfcyxyZXN1bHQsOSk7CisJLyogdGFibGVbMThdICovCisJcnNhel8xMDI0X3Nxcl9hdngyKHJlc3VsdCwgcmVzdWx0LCBtLCBrMCwgMSk7CisJcnNhel8xMDI0X3NjYXR0ZXI1X2F2eDIodGFibGVfcyxyZXN1bHQsMTgpOworCS8qIHRhYmxlWzE5XSAqLworCXJzYXpfMTAyNF9tdWxfYXZ4MihyZXN1bHQsIHJlc3VsdCwgYV9pbnYsIG0sIGswKTsKKwlyc2F6XzEwMjRfc2NhdHRlcjVfYXZ4Mih0YWJsZV9zLHJlc3VsdCwxOSk7CisKKwkvKiB0YWJsZVsxMV0gKi8KKwlyc2F6XzEwMjRfZ2F0aGVyNV9hdngyKHJlc3VsdCx0YWJsZV9zLDEwKTsKKwlyc2F6XzEwMjRfbXVsX2F2eDIocmVzdWx0LHJlc3VsdCxhX2ludixtLGswKTsKKwlyc2F6XzEwMjRfc2NhdHRlcjVfYXZ4Mih0YWJsZV9zLHJlc3VsdCwxMSk7CisJLyogdGFibGVbMjJdICovCisJcnNhel8xMDI0X3Nxcl9hdngyKHJlc3VsdCwgcmVzdWx0LCBtLCBrMCwgMSk7CisJcnNhel8xMDI0X3NjYXR0ZXI1X2F2eDIodGFibGVfcyxyZXN1bHQsMjIpOworCS8qIHRhYmxlWzIzXSAqLworCXJzYXpfMTAyNF9tdWxfYXZ4MihyZXN1bHQsIHJlc3VsdCwgYV9pbnYsIG0sIGswKTsKKwlyc2F6XzEwMjRfc2NhdHRlcjVfYXZ4Mih0YWJsZV9zLHJlc3VsdCwyMyk7CisKKwkvKiB0YWJsZVsxM10gKi8KKwlyc2F6XzEwMjRfZ2F0aGVyNV9hdngyKHJlc3VsdCx0YWJsZV9zLDEyKTsKKwlyc2F6XzEwMjRfbXVsX2F2eDIocmVzdWx0LHJlc3VsdCxhX2ludixtLGswKTsKKwlyc2F6XzEwMjRfc2NhdHRlcjVfYXZ4Mih0YWJsZV9zLHJlc3VsdCwxMyk7CisJLyogdGFibGVbMjZdICovCisJcnNhel8xMDI0X3Nxcl9hdngyKHJlc3VsdCwgcmVzdWx0LCBtLCBrMCwgMSk7CisJcnNhel8xMDI0X3NjYXR0ZXI1X2F2eDIodGFibGVfcyxyZXN1bHQsMjYpOworCS8qIHRhYmxlWzI3XSAqLworCXJzYXpfMTAyNF9tdWxfYXZ4MihyZXN1bHQsIHJlc3VsdCwgYV9pbnYsIG0sIGswKTsKKwlyc2F6XzEwMjRfc2NhdHRlcjVfYXZ4Mih0YWJsZV9zLHJlc3VsdCwyNyk7CisKKwkvKiB0YWJsZVsxNV0gKi8KKwlyc2F6XzEwMjRfZ2F0aGVyNV9hdngyKHJlc3VsdCx0YWJsZV9zLDE0KTsKKwlyc2F6XzEwMjRfbXVsX2F2eDIocmVzdWx0LHJlc3VsdCxhX2ludixtLGswKTsKKwlyc2F6XzEwMjRfc2NhdHRlcjVfYXZ4Mih0YWJsZV9zLHJlc3VsdCwxNSk7CisJLyogdGFibGVbMzBdICovCisJcnNhel8xMDI0X3Nxcl9hdngyKHJlc3VsdCwgcmVzdWx0LCBtLCBrMCwgMSk7CisJcnNhel8xMDI0X3NjYXR0ZXI1X2F2eDIodGFibGVfcyxyZXN1bHQsMzApOworCS8qIHRhYmxlWzMxXSAqLworCXJzYXpfMTAyNF9tdWxfYXZ4MihyZXN1bHQsIHJlc3VsdCwgYV9pbnYsIG0sIGswKTsKKwlyc2F6XzEwMjRfc2NhdHRlcjVfYXZ4Mih0YWJsZV9zLHJlc3VsdCwzMSk7CisjZW5kaWYKKworCS8qIGxvYWQgZmlyc3Qgd2luZG93ICovCisJcF9zdHIgPSAodW5zaWduZWQgY2hhciopZXhwb25lbnQ7CisJd3ZhbHVlID0gcF9zdHJbMTI3XSA+PiAzOworCXJzYXpfMTAyNF9nYXRoZXI1X2F2eDIocmVzdWx0LHRhYmxlX3Msd3ZhbHVlKTsKKworCWluZGV4ID0gMTAxNDsKKworCXdoaWxlKGluZGV4ID4gLTEpIHsJLyogbG9vcCBmb3IgdGhlIHJlbWFpbmluZyAxMjcgd2luZG93cyAqLworCisJCXJzYXpfMTAyNF9zcXJfYXZ4MihyZXN1bHQsIHJlc3VsdCwgbSwgazAsIDUpOworCisJCXd2YWx1ZSA9ICooKHVuc2lnbmVkIHNob3J0KikmcF9zdHJbaW5kZXgvOF0pOworCQl3dmFsdWUgPSAod3ZhbHVlPj4gKGluZGV4JTgpKSAmIDMxOworCQlpbmRleC09NTsKKworCQlyc2F6XzEwMjRfZ2F0aGVyNV9hdngyKGFfaW52LHRhYmxlX3Msd3ZhbHVlKTsJLyogYm9ycm93IGFfaW52ICovCisJCXJzYXpfMTAyNF9tdWxfYXZ4MihyZXN1bHQsIHJlc3VsdCwgYV9pbnYsIG0sIGswKTsKKwl9CisKKwkvKiBzcXVhcmUgZm91ciB0aW1lcyAqLworCXJzYXpfMTAyNF9zcXJfYXZ4MihyZXN1bHQsIHJlc3VsdCwgbSwgazAsIDQpOworCisJd3ZhbHVlID0gcF9zdHJbMF0gJiAxNTsKKworCXJzYXpfMTAyNF9nYXRoZXI1X2F2eDIoYV9pbnYsdGFibGVfcyx3dmFsdWUpOwkvKiBib3Jyb3cgYV9pbnYgKi8KKwlyc2F6XzEwMjRfbXVsX2F2eDIocmVzdWx0LCByZXN1bHQsIGFfaW52LCBtLCBrMCk7CisKKwkvKiBmcm9tIE1vbnRnb21lcnkgKi8KKwlyc2F6XzEwMjRfbXVsX2F2eDIocmVzdWx0LCByZXN1bHQsIG9uZSwgbSwgazApOworCisJcnNhel8xMDI0X3JlZDJub3JtX2F2eDIocmVzdWx0X25vcm0sIHJlc3VsdCk7CisKKwlPUEVOU1NMX2NsZWFuc2Uoc3RvcmFnZSxzaXplb2Yoc3RvcmFnZSkpOworfQorCisvKgorICogU2VlIGNyeXB0by9ibi9yc2F6LXg4Nl82NC5wbCBmb3IgZnVydGhlciBkZXRhaWxzLgorICovCit2b2lkIHJzYXpfNTEyX211bCh2b2lkICpyZXQsY29uc3Qgdm9pZCAqYSxjb25zdCB2b2lkICpiLGNvbnN0IHZvaWQgKm4sQk5fVUxPTkcgayk7Cit2b2lkIHJzYXpfNTEyX211bF9zY2F0dGVyNCh2b2lkICpyZXQsY29uc3Qgdm9pZCAqYSxjb25zdCB2b2lkICpuLEJOX1VMT05HIGssY29uc3Qgdm9pZCAqdGJsLHVuc2lnbmVkIGludCBwb3dlcik7Cit2b2lkIHJzYXpfNTEyX211bF9nYXRoZXI0KHZvaWQgKnJldCxjb25zdCB2b2lkICphLGNvbnN0IHZvaWQgKnRibCxjb25zdCB2b2lkICpuLEJOX1VMT05HIGssdW5zaWduZWQgaW50IHBvd2VyKTsKK3ZvaWQgcnNhel81MTJfbXVsX2J5X29uZSh2b2lkICpyZXQsY29uc3Qgdm9pZCAqYSxjb25zdCB2b2lkICpuLEJOX1VMT05HIGspOwordm9pZCByc2F6XzUxMl9zcXIodm9pZCAqcmV0LGNvbnN0IHZvaWQgKmEsY29uc3Qgdm9pZCAqbixCTl9VTE9ORyBrLGludCBjbnQpOwordm9pZCByc2F6XzUxMl9zY2F0dGVyNCh2b2lkICp0YmwsIGNvbnN0IEJOX1VMT05HICp2YWwsIGludCBwb3dlcik7Cit2b2lkIHJzYXpfNTEyX2dhdGhlcjQoQk5fVUxPTkcgKnZhbCwgY29uc3Qgdm9pZCAqdGJsLCBpbnQgcG93ZXIpOworCit2b2lkIFJTQVpfNTEyX21vZF9leHAoQk5fVUxPTkcgcmVzdWx0WzhdLAorCWNvbnN0IEJOX1VMT05HIGJhc2VbOF0sIGNvbnN0IEJOX1VMT05HIGV4cG9uZW50WzhdLAorCWNvbnN0IEJOX1VMT05HIG1bOF0sIEJOX1VMT05HIGswLCBjb25zdCBCTl9VTE9ORyBSUls4XSkKK3sKKwl1bnNpZ25lZCBjaGFyCSBzdG9yYWdlWzE2KjgqOCs2NCoyKzY0XTsJLyogMS4yS0IgKi8KKwl1bnNpZ25lZCBjaGFyCSp0YWJsZSA9IHN0b3JhZ2UgKyAoNjQtKChzaXplX3Qpc3RvcmFnZSU2NCkpOworCUJOX1VMT05HCSphX2ludiA9IChCTl9VTE9ORyAqKSh0YWJsZSsxNio4KjgpLAorCQkJKnRlbXAgID0gKEJOX1VMT05HICopKHRhYmxlKzE2KjgqOCs4KjgpOworCXVuc2lnbmVkIGNoYXIJKnBfc3RyID0gKHVuc2lnbmVkIGNoYXIqKWV4cG9uZW50OworCWludCBpbmRleDsKKwl1bnNpZ25lZCBpbnQgd3ZhbHVlOworCisJLyogdGFibGVbMF0gPSAxX2ludiAqLworCXRlbXBbMF0gPSAwLW1bMF07CXRlbXBbMV0gPSB+bVsxXTsKKwl0ZW1wWzJdID0gfm1bMl07CXRlbXBbM10gPSB+bVszXTsKKwl0ZW1wWzRdID0gfm1bNF07CXRlbXBbNV0gPSB+bVs1XTsKKwl0ZW1wWzZdID0gfm1bNl07CXRlbXBbN10gPSB+bVs3XTsKKwlyc2F6XzUxMl9zY2F0dGVyNCh0YWJsZSwgdGVtcCwgMCk7CisKKwkvKiB0YWJsZSBbMV0gPSBhX2ludl4xICovCisJcnNhel81MTJfbXVsKGFfaW52LCBiYXNlLCBSUiwgbSwgazApOworCXJzYXpfNTEyX3NjYXR0ZXI0KHRhYmxlLCBhX2ludiwgMSk7CisKKwkvKiB0YWJsZSBbMl0gPSBhX2ludl4yICovCisJcnNhel81MTJfc3FyKHRlbXAsIGFfaW52LCBtLCBrMCwgMSk7CisJcnNhel81MTJfc2NhdHRlcjQodGFibGUsIHRlbXAsIDIpOworCisJZm9yIChpbmRleD0zOyBpbmRleDwxNjsgaW5kZXgrKykKKwkJcnNhel81MTJfbXVsX3NjYXR0ZXI0KHRlbXAsIGFfaW52LCBtLCBrMCwgdGFibGUsIGluZGV4KTsKKworCS8qIGxvYWQgZmlyc3Qgd2luZG93ICovCisJd3ZhbHVlID0gcF9zdHJbNjNdOworCisJcnNhel81MTJfZ2F0aGVyNCh0ZW1wLCB0YWJsZSwgd3ZhbHVlPj40KTsKKwlyc2F6XzUxMl9zcXIodGVtcCwgdGVtcCwgbSwgazAsIDQpOworCXJzYXpfNTEyX211bF9nYXRoZXI0KHRlbXAsIHRlbXAsIHRhYmxlLCBtLCBrMCwgd3ZhbHVlJjB4Zik7CisKKwlmb3IgKGluZGV4PTYyOyBpbmRleD49MDsgaW5kZXgtLSkgeworCQl3dmFsdWUgPSBwX3N0cltpbmRleF07CisKKwkJcnNhel81MTJfc3FyKHRlbXAsIHRlbXAsIG0sIGswLCA0KTsKKwkJcnNhel81MTJfbXVsX2dhdGhlcjQodGVtcCwgdGVtcCwgdGFibGUsIG0sIGswLCB3dmFsdWU+PjQpOworCisJCXJzYXpfNTEyX3Nxcih0ZW1wLCB0ZW1wLCBtLCBrMCwgNCk7CisJCXJzYXpfNTEyX211bF9nYXRoZXI0KHRlbXAsIHRlbXAsIHRhYmxlLCBtLCBrMCwgd3ZhbHVlJjB4MGYpOworCX0KKworCS8qIGZyb20gTW9udGdvbWVyeSAqLworCXJzYXpfNTEyX211bF9ieV9vbmUocmVzdWx0LCB0ZW1wLCBtLCBrMCk7CisKKwlPUEVOU1NMX2NsZWFuc2Uoc3RvcmFnZSxzaXplb2Yoc3RvcmFnZSkpOworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2JuL3JzYXpfZXhwLmggYi9jcnlwdG8vYm4vcnNhel9leHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjQxYTFmCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2JuL3JzYXpfZXhwLmgKQEAgLTAsMCArMSw0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQoYykgMjAxMiwgSW50ZWwgQ29ycC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyogRGV2ZWxvcGVycyBhbmQgYXV0aG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisqIFNoYXkgR3Vlcm9uICgxLCAyKSwgYW5kIFZsYWQgS3Jhc25vdiAoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorKiAoMSkgSW50ZWwgQ29ycG9yYXRpb24sIElzcmFlbCBEZXZlbG9wbWVudCBDZW50ZXIsIEhhaWZhLCBJc3JhZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisqICgyKSBVbml2ZXJzaXR5IG9mIEhhaWZhLCBJc3JhZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogTElDRU5TRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisqIFRoaXMgc3VibWlzc2lvbiB0byBPcGVuU1NMIGlzIHRvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBPcGVuU1NMICAKKyogbGljZW5zZSwgYW5kIG9ubHkgdG8gdGhlIE9wZW5TU0wgcHJvamVjdCwgaW4gb3JkZXIgdG8gYWxsb3cgaW50ZWdyYXRpb24gICAgCisqIGludG8gdGhlIHB1YmxpY2x5IGRpc3RyaWJ1dGVkIGNvZGUuIAorKiBUaGUgdXNlIG9mIHRoaXMgY29kZSwgb3IgcG9ydGlvbnMgb2YgdGhpcyBjb2RlLCBvciBjb25jZXB0cyBlbWJlZGRlZCBpbgorKiB0aGlzIGNvZGUsIG9yIG1vZGlmaWNhdGlvbiBvZiB0aGlzIGNvZGUgYW5kL29yIGFsZ29yaXRobShzKSBpbiBpdCwgb3IgdGhlCisqIHVzZSBvZiB0aGlzIGNvZGUgZm9yIGFueSBvdGhlciBwdXJwb3NlIHRoYW4gc3RhdGVkIGFib3ZlLCByZXF1aXJlcyBzcGVjaWFsCisqIGxpY2Vuc2luZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBESVNDTEFJTUVSOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09OVFJJQlVUT1JTIEFORCBUSEUgQ09QWVJJR0hUIE9XTkVSUyAgICAgCisqIGBgQVMgSVMnJy4gQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIAorKiBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiAKKyogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPTlRSSUJVVE9SUyBPUiBUSEUgQ09QWVJJR0hUCisqIE9XTkVSUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIAorKiBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiAgICAKKyogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTICAgCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOICAgIAorKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAgICAKKyogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgCisqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFJTQVpfRVhQX0gKKyNkZWZpbmUgUlNBWl9FWFBfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorCit2b2lkIFJTQVpfMTAyNF9tb2RfZXhwX2F2eDIoQk5fVUxPTkcgcmVzdWx0WzE2XSwKKwljb25zdCBCTl9VTE9ORyBiYXNlX25vcm1bMTZdLCBjb25zdCBCTl9VTE9ORyBleHBvbmVudFsxNl0sCisJY29uc3QgQk5fVUxPTkcgbV9ub3JtWzE2XSwgY29uc3QgQk5fVUxPTkcgUlJbMTZdLCBCTl9VTE9ORyBrMCk7CitpbnQgcnNhel9hdngyX2VsaWdpYmxlKCk7CisKK3ZvaWQgUlNBWl81MTJfbW9kX2V4cChCTl9VTE9ORyByZXN1bHRbOF0sCisJY29uc3QgQk5fVUxPTkcgYmFzZV9ub3JtWzhdLCBjb25zdCBCTl9VTE9ORyBleHBvbmVudFs4XSwKKwljb25zdCBCTl9VTE9ORyBtX25vcm1bOF0sIEJOX1VMT05HIGswLCBjb25zdCBCTl9VTE9ORyBSUls4XSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NyeXB0by9ibi9zaGlmdC5jIGIvY3J5cHRvL2JuL3NoaWZ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg0YTY5NwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9ibi9zaGlmdC5jCkBAIC0wLDAgKzEsMjg0IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworaW50IEJOX2xzaGlmdChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgaW50IG4pIHsKKyAgaW50IGksIG53LCBsYiwgcmI7CisgIEJOX1VMT05HICp0LCAqZjsKKyAgQk5fVUxPTkcgbDsKKworICByLT5uZWcgPSBhLT5uZWc7CisgIG53ID0gbiAvIEJOX0JJVFMyOworICBpZiAoYm5fd2V4cGFuZChyLCBhLT50b3AgKyBudyArIDEpID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBsYiA9IG4gJSBCTl9CSVRTMjsKKyAgcmIgPSBCTl9CSVRTMiAtIGxiOworICBmID0gYS0+ZDsKKyAgdCA9IHItPmQ7CisgIHRbYS0+dG9wICsgbnddID0gMDsKKyAgaWYgKGxiID09IDApIHsKKyAgICBmb3IgKGkgPSBhLT50b3AgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgdFtudyArIGldID0gZltpXTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpID0gYS0+dG9wIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgIGwgPSBmW2ldOworICAgICAgdFtudyArIGkgKyAxXSB8PSAobCA+PiByYikgJiBCTl9NQVNLMjsKKyAgICAgIHRbbncgKyBpXSA9IChsIDw8IGxiKSAmIEJOX01BU0syOworICAgIH0KKyAgfQorICBtZW1zZXQodCwgMCwgbncgKiBzaXplb2YodFswXSkpOworICByLT50b3AgPSBhLT50b3AgKyBudyArIDE7CisgIGJuX2NvcnJlY3RfdG9wKHIpOworCisgIHJldHVybiAxOworfQorCitpbnQgQk5fbHNoaWZ0MShCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSkgeworICBCTl9VTE9ORyAqYXAsICpycCwgdCwgYzsKKyAgaW50IGk7CisKKyAgaWYgKHIgIT0gYSkgeworICAgIHItPm5lZyA9IGEtPm5lZzsKKyAgICBpZiAoYm5fd2V4cGFuZChyLCBhLT50b3AgKyAxKSA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgci0+dG9wID0gYS0+dG9wOworICB9IGVsc2UgeworICAgIGlmIChibl93ZXhwYW5kKHIsIGEtPnRvcCArIDEpID09IE5VTEwpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICBhcCA9IGEtPmQ7CisgIHJwID0gci0+ZDsKKyAgYyA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBhLT50b3A7IGkrKykgeworICAgIHQgPSAqKGFwKyspOworICAgICoocnArKykgPSAoKHQgPDwgMSkgfCBjKSAmIEJOX01BU0syOworICAgIGMgPSAodCAmIEJOX1RCSVQpID8gMSA6IDA7CisgIH0KKyAgaWYgKGMpIHsKKyAgICAqcnAgPSAxOworICAgIHItPnRvcCsrOworICB9CisKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBCTl9yc2hpZnQoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGludCBuKSB7CisgIGludCBpLCBqLCBudywgbGIsIHJiOworICBCTl9VTE9ORyAqdCwgKmY7CisgIEJOX1VMT05HIGwsIHRtcDsKKworICBudyA9IG4gLyBCTl9CSVRTMjsKKyAgcmIgPSBuICUgQk5fQklUUzI7CisgIGxiID0gQk5fQklUUzIgLSByYjsKKyAgaWYgKG53ID49IGEtPnRvcCB8fCBhLT50b3AgPT0gMCkgeworICAgIEJOX3plcm8ocik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaSA9IChCTl9udW1fYml0cyhhKSAtIG4gKyAoQk5fQklUUzIgLSAxKSkgLyBCTl9CSVRTMjsKKyAgaWYgKHIgIT0gYSkgeworICAgIHItPm5lZyA9IGEtPm5lZzsKKyAgICBpZiAoYm5fd2V4cGFuZChyLCBpKSA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKG4gPT0gMCkgeworICAgICAgcmV0dXJuIDE7IC8qIG9yIHRoZSBjb3B5aW5nIGxvb3Agd2lsbCBnbyBiZXJzZXJrICovCisgICAgfQorICB9CisKKyAgZiA9ICYoYS0+ZFtud10pOworICB0ID0gci0+ZDsKKyAgaiA9IGEtPnRvcCAtIG53OworICByLT50b3AgPSBpOworCisgIGlmIChyYiA9PSAwKSB7CisgICAgZm9yIChpID0gajsgaSAhPSAwOyBpLS0pIHsKKyAgICAgICoodCsrKSA9ICooZisrKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgbCA9ICooZisrKTsKKyAgICBmb3IgKGkgPSBqIC0gMTsgaSAhPSAwOyBpLS0pIHsKKyAgICAgIHRtcCA9IChsID4+IHJiKSAmIEJOX01BU0syOworICAgICAgbCA9ICooZisrKTsKKyAgICAgICoodCsrKSA9ICh0bXAgfCAobCA8PCBsYikpICYgQk5fTUFTSzI7CisgICAgfQorICAgIGlmICgobCA9IChsID4+IHJiKSAmIEJOX01BU0syKSkgeworICAgICAgKih0KSA9IGw7CisgICAgfQorICB9CisKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBCTl9yc2hpZnQxKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphKSB7CisgIEJOX1VMT05HICphcCwgKnJwLCB0LCBjOworICBpbnQgaSwgajsKKworICBpZiAoQk5faXNfemVybyhhKSkgeworICAgIEJOX3plcm8ocik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaSA9IGEtPnRvcDsKKyAgYXAgPSBhLT5kOworICBqID0gaSAtIChhcFtpIC0gMV0gPT0gMSk7CisgIGlmIChhICE9IHIpIHsKKyAgICBpZiAoYm5fd2V4cGFuZChyLCBqKSA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgci0+bmVnID0gYS0+bmVnOworICB9CisgIHJwID0gci0+ZDsKKyAgdCA9IGFwWy0taV07CisgIGMgPSAodCAmIDEpID8gQk5fVEJJVCA6IDA7CisgIGlmICh0ID4+PSAxKSB7CisgICAgcnBbaV0gPSB0OworICB9CisgIHdoaWxlIChpID4gMCkgeworICAgIHQgPSBhcFstLWldOworICAgIHJwW2ldID0gKCh0ID4+IDEpICYgQk5fTUFTSzIpIHwgYzsKKyAgICBjID0gKHQgJiAxKSA/IEJOX1RCSVQgOiAwOworICB9CisgIHItPnRvcCA9IGo7CisKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBCTl9zZXRfYml0KEJJR05VTSAqYSwgaW50IG4pIHsKKyAgaW50IGksIGosIGs7CisKKyAgaWYgKG4gPCAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpID0gbiAvIEJOX0JJVFMyOworICBqID0gbiAlIEJOX0JJVFMyOworICBpZiAoYS0+dG9wIDw9IGkpIHsKKyAgICBpZiAoYm5fd2V4cGFuZChhLCBpICsgMSkgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGZvciAoayA9IGEtPnRvcDsgayA8IGkgKyAxOyBrKyspIHsKKyAgICAgIGEtPmRba10gPSAwOworICAgIH0KKyAgICBhLT50b3AgPSBpICsgMTsKKyAgfQorCisgIGEtPmRbaV0gfD0gKCgoQk5fVUxPTkcpMSkgPDwgaik7CisKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBCTl9jbGVhcl9iaXQoQklHTlVNICphLCBpbnQgbikgeworICBpbnQgaSwgajsKKworICBpZiAobiA8IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGkgPSBuIC8gQk5fQklUUzI7CisgIGogPSBuICUgQk5fQklUUzI7CisgIGlmIChhLT50b3AgPD0gaSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgYS0+ZFtpXSAmPSAofigoKEJOX1VMT05HKTEpIDw8IGopKTsKKyAgYm5fY29ycmVjdF90b3AoYSk7CisgIHJldHVybiAxOworfQorCitpbnQgQk5faXNfYml0X3NldChjb25zdCBCSUdOVU0gKmEsIGludCBuKSB7CisgIGludCBpLCBqOworCisgIGlmIChuIDwgMCkgeworICAgIHJldHVybiAwOworICB9CisgIGkgPSBuIC8gQk5fQklUUzI7CisgIGogPSBuICUgQk5fQklUUzI7CisgIGlmIChhLT50b3AgPD0gaSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgcmV0dXJuIChhLT5kW2ldPj5qKSYxOworfQorCitpbnQgQk5fbWFza19iaXRzKEJJR05VTSAqYSwgaW50IG4pIHsKKyAgaW50IGIsIHc7CisKKyAgaWYgKG4gPCAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICB3ID0gbiAvIEJOX0JJVFMyOworICBiID0gbiAlIEJOX0JJVFMyOworICBpZiAodyA+PSBhLT50b3ApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoYiA9PSAwKSB7CisgICAgYS0+dG9wID0gdzsKKyAgfSBlbHNlIHsKKyAgICBhLT50b3AgPSB3ICsgMTsKKyAgICBhLT5kW3ddICY9IH4oQk5fTUFTSzIgPDwgYik7CisgIH0KKworICBibl9jb3JyZWN0X3RvcChhKTsKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vYm4vc3FydC5jIGIvY3J5cHRvL2JuL3NxcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWM3NjNiCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2JuL3NxcnQuYwpAQCAtMCwwICsxLDQzMCBAQAorLyogV3JpdHRlbiBieSBMZW5rYSBGaWJpa292YSA8ZmliaWtvdmFAZXhwLW1hdGgudW5pLWVzc2VuLmRlPgorICogYW5kIEJvZG8gTW9lbGxlciBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdC4gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKworCisvKiBSZXR1cm5zICdyZXQnIHN1Y2ggdGhhdAorICogICAgICByZXReMiA9PSBhIChtb2QgcCksCisgKiB1c2luZyB0aGUgVG9uZWxsaS9TaGFua3MgYWxnb3JpdGhtIChjZi4gSGVucmkgQ29oZW4sICJBIENvdXJzZQorICogaW4gQWxnZWJyYWljIENvbXB1dGF0aW9uYWwgTnVtYmVyIFRoZW9yeSIsIGFsZ29yaXRobSAxLjUuMSkuCisgKiAncCcgbXVzdCBiZSBwcmltZSEgKi8KK0JJR05VTSAqQk5fbW9kX3NxcnQoQklHTlVNICppbiwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKnAsIEJOX0NUWCAqY3R4KSB7CisgIEJJR05VTSAqcmV0ID0gaW47CisgIGludCBlcnIgPSAxOworICBpbnQgcjsKKyAgQklHTlVNICpBLCAqYiwgKnEsICp0LCAqeCwgKnk7CisgIGludCBlLCBpLCBqOworCisgIGlmICghQk5faXNfb2RkKHApIHx8IEJOX2Fic19pc193b3JkKHAsIDEpKSB7CisgICAgaWYgKEJOX2Fic19pc193b3JkKHAsIDIpKSB7CisgICAgICBpZiAocmV0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gQk5fbmV3KCk7CisgICAgICB9CisgICAgICBpZiAocmV0ID09IE5VTEwpIHsKKyAgICAgICAgZ290byBlbmQ7CisgICAgICB9CisgICAgICBpZiAoIUJOX3NldF93b3JkKHJldCwgQk5faXNfYml0X3NldChhLCAwKSkpIHsKKyAgICAgICAgaWYgKHJldCAhPSBpbikgeworICAgICAgICAgIEJOX2ZyZWUocmV0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX21vZF9zcXJ0LCBCTl9SX1BfSVNfTk9UX1BSSU1FKTsKKyAgICByZXR1cm4gKE5VTEwpOworICB9CisKKyAgaWYgKEJOX2lzX3plcm8oYSkgfHwgQk5faXNfb25lKGEpKSB7CisgICAgaWYgKHJldCA9PSBOVUxMKSB7CisgICAgICByZXQgPSBCTl9uZXcoKTsKKyAgICB9CisgICAgaWYgKHJldCA9PSBOVUxMKSB7CisgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgaWYgKCFCTl9zZXRfd29yZChyZXQsIEJOX2lzX29uZShhKSkpIHsKKyAgICAgIGlmIChyZXQgIT0gaW4pIHsKKyAgICAgICAgQk5fZnJlZShyZXQpOworICAgICAgfQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiByZXQ7CisgIH0KKworICBCTl9DVFhfc3RhcnQoY3R4KTsKKyAgQSA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgYiA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgcSA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgdCA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgeCA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgeSA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgaWYgKHkgPT0gTlVMTCkgeworICAgIGdvdG8gZW5kOworICB9CisKKyAgaWYgKHJldCA9PSBOVUxMKSB7CisgICAgcmV0ID0gQk5fbmV3KCk7CisgIH0KKyAgaWYgKHJldCA9PSBOVUxMKSB7CisgICAgZ290byBlbmQ7CisgIH0KKworICAvKiBBID0gYSBtb2QgcCAqLworICBpZiAoIUJOX25ubW9kKEEsIGEsIHAsIGN0eCkpIHsKKyAgICBnb3RvIGVuZDsKKyAgfQorCisgIC8qIG5vdyB3cml0ZSAgfHB8IC0gMSAgYXMgIDJeZSpxICB3aGVyZSAgcSAgaXMgb2RkICovCisgIGUgPSAxOworICB3aGlsZSAoIUJOX2lzX2JpdF9zZXQocCwgZSkpIHsKKyAgICBlKys7CisgIH0KKyAgLyogd2UnbGwgc2V0ICBxICBsYXRlciAoaWYgbmVlZGVkKSAqLworCisgIGlmIChlID09IDEpIHsKKyAgICAvKiBUaGUgZWFzeSBjYXNlOiAgKHxwfC0xKS8yICBpcyBvZGQsIHNvIDIgaGFzIGFuIGludmVyc2UKKyAgICAgKiBtb2R1bG8gICh8cHwtMSkvMiwgIGFuZCBzcXVhcmUgcm9vdHMgY2FuIGJlIGNvbXB1dGVkCisgICAgICogZGlyZWN0bHkgYnkgbW9kdWxhciBleHBvbmVudGlhdGlvbi4KKyAgICAgKiBXZSBoYXZlCisgICAgICogICAgIDIgKiAofHB8KzEpLzQgPT0gMSAgIChtb2QgKHxwfC0xKS8yKSwKKyAgICAgKiBzbyB3ZSBjYW4gdXNlIGV4cG9uZW50ICAofHB8KzEpLzQsICBpLmUuICAofHB8LTMpLzQgKyAxLgorICAgICAqLworICAgIGlmICghQk5fcnNoaWZ0KHEsIHAsIDIpKSB7CisgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgcS0+bmVnID0gMDsKKyAgICBpZiAoIUJOX2FkZF93b3JkKHEsIDEpIHx8CisgICAgICAgICFCTl9tb2RfZXhwKHJldCwgQSwgcSwgcCwgY3R4KSkgeworICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIGVyciA9IDA7CisgICAgZ290byB2cmZ5OworICB9CisKKyAgaWYgKGUgPT0gMikgeworICAgIC8qIHxwfCA9PSA1ICAobW9kIDgpCisgICAgICoKKyAgICAgKiBJbiB0aGlzIGNhc2UgIDIgIGlzIGFsd2F5cyBhIG5vbi1zcXVhcmUgc2luY2UKKyAgICAgKiBMZWdlbmRyZSgyLHApID0gKC0xKV4oKHBeMi0xKS84KSAgZm9yIGFueSBvZGQgcHJpbWUuCisgICAgICogU28gaWYgIGEgIHJlYWxseSBpcyBhIHNxdWFyZSwgdGhlbiAgMiphICBpcyBhIG5vbi1zcXVhcmUuCisgICAgICogVGh1cyBmb3IKKyAgICAgKiAgICAgIGIgOj0gKDIqYSleKCh8cHwtNSkvOCksCisgICAgICogICAgICBpIDo9ICgyKmEpKmJeMgorICAgICAqIHdlIGhhdmUKKyAgICAgKiAgICAgaV4yID0gKDIqYSleKCgxICsgKHxwfC01KS80KSoyKQorICAgICAqICAgICAgICAgPSAoMiphKV4oKHAtMSkvMikKKyAgICAgKiAgICAgICAgID0gLTE7CisgICAgICogc28gaWYgd2Ugc2V0CisgICAgICogICAgICB4IDo9IGEqYiooaS0xKSwKKyAgICAgKiB0aGVuCisgICAgICogICAgIHheMiA9IGFeMiAqIGJeMiAqIChpXjIgLSAyKmkgKyAxKQorICAgICAqICAgICAgICAgPSBhXjIgKiBiXjIgKiAoLTIqaSkKKyAgICAgKiAgICAgICAgID0gYSooLWkpKigyKmEqYl4yKQorICAgICAqICAgICAgICAgPSBhKigtaSkqaQorICAgICAqICAgICAgICAgPSBhLgorICAgICAqCisgICAgICogKFRoaXMgaXMgZHVlIHRvIEEuTy5MLiBBdGtpbiwKKyAgICAgKiA8VVJMOgorICAgICAqaHR0cDovL2xpc3RzZXJ2Lm5vZGFrLmVkdS9zY3JpcHRzL3dhLmV4ZT9BMj1pbmQ5MjExJkw9bm1icnRocnkmTz1UJlA9NTYyPiwKKyAgICAgKiBOb3ZlbWJlciAxOTkyLikKKyAgICAgKi8KKworICAgIC8qIHQgOj0gMiphICovCisgICAgaWYgKCFCTl9tb2RfbHNoaWZ0MV9xdWljayh0LCBBLCBwKSkgeworICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgLyogYiA6PSAoMiphKV4oKHxwfC01KS84KSAqLworICAgIGlmICghQk5fcnNoaWZ0KHEsIHAsIDMpKSB7CisgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgcS0+bmVnID0gMDsKKyAgICBpZiAoIUJOX21vZF9leHAoYiwgdCwgcSwgcCwgY3R4KSkgeworICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgLyogeSA6PSBiXjIgKi8KKyAgICBpZiAoIUJOX21vZF9zcXIoeSwgYiwgcCwgY3R4KSkgeworICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgLyogdCA6PSAoMiphKSpiXjIgLSAxKi8KKyAgICBpZiAoIUJOX21vZF9tdWwodCwgdCwgeSwgcCwgY3R4KSB8fAorICAgICAgICAhQk5fc3ViX3dvcmQodCwgMSkpIHsKKyAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIC8qIHggPSBhKmIqdCAqLworICAgIGlmICghQk5fbW9kX211bCh4LCBBLCBiLCBwLCBjdHgpIHx8CisgICAgICAgICFCTl9tb2RfbXVsKHgsIHgsIHQsIHAsIGN0eCkpIHsKKyAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIGlmICghQk5fY29weShyZXQsIHgpKSB7CisgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgZXJyID0gMDsKKyAgICBnb3RvIHZyZnk7CisgIH0KKworICAvKiBlID4gMiwgc28gd2UgcmVhbGx5IGhhdmUgdG8gdXNlIHRoZSBUb25lbGxpL1NoYW5rcyBhbGdvcml0aG0uCisgICAqIEZpcnN0LCBmaW5kIHNvbWUgIHkgIHRoYXQgaXMgbm90IGEgc3F1YXJlLiAqLworICBpZiAoIUJOX2NvcHkocSwgcCkpIHsKKyAgICBnb3RvIGVuZDsgLyogdXNlICdxJyBhcyB0ZW1wICovCisgIH0KKyAgcS0+bmVnID0gMDsKKyAgaSA9IDI7CisgIGRvIHsKKyAgICAvKiBGb3IgZWZmaWNpZW5jeSwgdHJ5IHNtYWxsIG51bWJlcnMgZmlyc3Q7CisgICAgICogaWYgdGhpcyBmYWlscywgdHJ5IHJhbmRvbSBudW1iZXJzLgorICAgICAqLworICAgIGlmIChpIDwgMjIpIHsKKyAgICAgIGlmICghQk5fc2V0X3dvcmQoeSwgaSkpIHsKKyAgICAgICAgZ290byBlbmQ7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghQk5fcHNldWRvX3JhbmQoeSwgQk5fbnVtX2JpdHMocCksIDAsIDApKSB7CisgICAgICAgIGdvdG8gZW5kOworICAgICAgfQorICAgICAgaWYgKEJOX3VjbXAoeSwgcCkgPj0gMCkgeworICAgICAgICBpZiAoIShwLT5uZWcgPyBCTl9hZGQgOiBCTl9zdWIpKHksIHksIHApKSB7CisgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIG5vdyAwIDw9IHkgPCB8cHwgKi8KKyAgICAgIGlmIChCTl9pc196ZXJvKHkpKSB7CisgICAgICAgIGlmICghQk5fc2V0X3dvcmQoeSwgaSkpIHsKKyAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHIgPSBCTl9rcm9uZWNrZXIoeSwgcSwgY3R4KTsgLyogaGVyZSAncScgaXMgfHB8ICovCisgICAgaWYgKHIgPCAtMSkgeworICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIGlmIChyID09IDApIHsKKyAgICAgIC8qIG0gZGl2aWRlcyBwICovCisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fbW9kX3NxcnQsIEJOX1JfUF9JU19OT1RfUFJJTUUpOworICAgICAgZ290byBlbmQ7CisgICAgfQorICB9IHdoaWxlIChyID09IDEgJiYgKytpIDwgODIpOworCisgIGlmIChyICE9IC0xKSB7CisgICAgLyogTWFueSByb3VuZHMgYW5kIHN0aWxsIG5vIG5vbi1zcXVhcmUgLS0gdGhpcyBpcyBtb3JlIGxpa2VseQorICAgICAqIGEgYnVnIHRoYW4ganVzdCBiYWQgbHVjay4KKyAgICAgKiBFdmVuIGlmICBwICBpcyBub3QgcHJpbWUsIHdlIHNob3VsZCBoYXZlIGZvdW5kIHNvbWUgIHkKKyAgICAgKiBzdWNoIHRoYXQgciA9PSAtMS4KKyAgICAgKi8KKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fbW9kX3NxcnQsIEJOX1JfVE9PX01BTllfSVRFUkFUSU9OUyk7CisgICAgZ290byBlbmQ7CisgIH0KKworICAvKiBIZXJlJ3Mgb3VyIGFjdHVhbCAncSc6ICovCisgIGlmICghQk5fcnNoaWZ0KHEsIHEsIGUpKSB7CisgICAgZ290byBlbmQ7CisgIH0KKworICAvKiBOb3cgdGhhdCB3ZSBoYXZlIHNvbWUgbm9uLXNxdWFyZSwgd2UgY2FuIGZpbmQgYW4gZWxlbWVudAorICAgKiBvZiBvcmRlciAgMl5lICBieSBjb21wdXRpbmcgaXRzIHEndGggcG93ZXIuICovCisgIGlmICghQk5fbW9kX2V4cCh5LCB5LCBxLCBwLCBjdHgpKSB7CisgICAgZ290byBlbmQ7CisgIH0KKyAgaWYgKEJOX2lzX29uZSh5KSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9tb2Rfc3FydCwgQk5fUl9QX0lTX05PVF9QUklNRSk7CisgICAgZ290byBlbmQ7CisgIH0KKworICAvKiBOb3cgd2Uga25vdyB0aGF0IChpZiAgcCAgaXMgaW5kZWVkIHByaW1lKSB0aGVyZSBpcyBhbiBpbnRlZ2VyCisgICAqIGssICAwIDw9IGsgPCAyXmUsICBzdWNoIHRoYXQKKyAgICoKKyAgICogICAgICBhXnEgKiB5XmsgPT0gMSAgIChtb2QgcCkuCisgICAqCisgICAqIEFzICBhXnEgIGlzIGEgc3F1YXJlIGFuZCAgeSAgaXMgbm90LCAgayAgbXVzdCBiZSBldmVuLgorICAgKiBxKzEgIGlzIGV2ZW4sIHRvbywgc28gdGhlcmUgaXMgYW4gZWxlbWVudAorICAgKgorICAgKiAgICAgWCA6PSBhXigocSsxKS8yKSAqIHleKGsvMiksCisgICAqCisgICAqIGFuZCBpdCBzYXRpc2ZpZXMKKyAgICoKKyAgICogICAgIFheMiA9IGFecSAqIGEgICAgICogeV5rCisgICAqICAgICAgICAgPSBhLAorICAgKgorICAgKiBzbyBpdCBpcyB0aGUgc3F1YXJlIHJvb3QgdGhhdCB3ZSBhcmUgbG9va2luZyBmb3IuCisgICAqLworCisgIC8qIHQgOj0gKHEtMSkvMiAgKG5vdGUgdGhhdCAgcSAgaXMgb2RkKSAqLworICBpZiAoIUJOX3JzaGlmdDEodCwgcSkpIHsKKyAgICBnb3RvIGVuZDsKKyAgfQorCisgIC8qIHggOj0gYV4oKHEtMSkvMikgKi8KKyAgaWYgKEJOX2lzX3plcm8odCkpIC8qIHNwZWNpYWwgY2FzZTogcCA9IDJeZSArIDEgKi8KKyAgeworICAgIGlmICghQk5fbm5tb2QodCwgQSwgcCwgY3R4KSkgeworICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIGlmIChCTl9pc196ZXJvKHQpKSB7CisgICAgICAvKiBzcGVjaWFsIGNhc2U6IGEgPT0gMCAgKG1vZCBwKSAqLworICAgICAgQk5femVybyhyZXQpOworICAgICAgZXJyID0gMDsKKyAgICAgIGdvdG8gZW5kOworICAgIH0gZWxzZSBpZiAoIUJOX29uZSh4KSkgeworICAgICAgZ290byBlbmQ7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmICghQk5fbW9kX2V4cCh4LCBBLCB0LCBwLCBjdHgpKSB7CisgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgaWYgKEJOX2lzX3plcm8oeCkpIHsKKyAgICAgIC8qIHNwZWNpYWwgY2FzZTogYSA9PSAwICAobW9kIHApICovCisgICAgICBCTl96ZXJvKHJldCk7CisgICAgICBlcnIgPSAwOworICAgICAgZ290byBlbmQ7CisgICAgfQorICB9CisKKyAgLyogYiA6PSBhKnheMiAgKD0gYV5xKSAqLworICBpZiAoIUJOX21vZF9zcXIoYiwgeCwgcCwgY3R4KSB8fAorICAgICAgIUJOX21vZF9tdWwoYiwgYiwgQSwgcCwgY3R4KSkgeworICAgIGdvdG8gZW5kOworICB9CisKKyAgLyogeCA6PSBhKnggICAgKD0gYV4oKHErMSkvMikpICovCisgIGlmICghQk5fbW9kX211bCh4LCB4LCBBLCBwLCBjdHgpKSB7CisgICAgZ290byBlbmQ7CisgIH0KKworICB3aGlsZSAoMSkgeworICAgIC8qIE5vdyAgYiAgaXMgIGFecSAqIHleayAgZm9yIHNvbWUgZXZlbiAgayAgKDAgPD0gayA8IDJeRQorICAgICAqIHdoZXJlICBFICByZWZlcnMgdG8gdGhlIG9yaWdpbmFsIHZhbHVlIG9mICBlLCAgd2hpY2ggd2UKKyAgICAgKiBkb24ndCBrZWVwIGluIGEgdmFyaWFibGUpLCAgYW5kICB4ICBpcyAgYV4oKHErMSkvMikgKiB5XihrLzIpLgorICAgICAqCisgICAgICogV2UgaGF2ZSAgYSpiID0geF4yLAorICAgICAqICAgIHleMl4oZS0xKSA9IC0xLAorICAgICAqICAgIGJeMl4oZS0xKSA9IDEuCisgICAgICovCisKKyAgICBpZiAoQk5faXNfb25lKGIpKSB7CisgICAgICBpZiAoIUJOX2NvcHkocmV0LCB4KSkgeworICAgICAgICBnb3RvIGVuZDsKKyAgICAgIH0KKyAgICAgIGVyciA9IDA7CisgICAgICBnb3RvIHZyZnk7CisgICAgfQorCisKKyAgICAvKiBmaW5kIHNtYWxsZXN0ICBpICBzdWNoIHRoYXQgIGJeKDJeaSkgPSAxICovCisgICAgaSA9IDE7CisgICAgaWYgKCFCTl9tb2Rfc3FyKHQsIGIsIHAsIGN0eCkpIHsKKyAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICB3aGlsZSAoIUJOX2lzX29uZSh0KSkgeworICAgICAgaSsrOworICAgICAgaWYgKGkgPT0gZSkgeworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fbW9kX3NxcnQsIEJOX1JfTk9UX0FfU1FVQVJFKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgICB9CisgICAgICBpZiAoIUJOX21vZF9tdWwodCwgdCwgdCwgcCwgY3R4KSkgeworICAgICAgICBnb3RvIGVuZDsKKyAgICAgIH0KKyAgICB9CisKKworICAgIC8qIHQgOj0geV4yXihlIC0gaSAtIDEpICovCisgICAgaWYgKCFCTl9jb3B5KHQsIHkpKSB7CisgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgZm9yIChqID0gZSAtIGkgLSAxOyBqID4gMDsgai0tKSB7CisgICAgICBpZiAoIUJOX21vZF9zcXIodCwgdCwgcCwgY3R4KSkgeworICAgICAgICBnb3RvIGVuZDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFCTl9tb2RfbXVsKHksIHQsIHQsIHAsIGN0eCkgfHwKKyAgICAgICAgIUJOX21vZF9tdWwoeCwgeCwgdCwgcCwgY3R4KSB8fAorICAgICAgICAhQk5fbW9kX211bChiLCBiLCB5LCBwLCBjdHgpKSB7CisgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgZSA9IGk7CisgIH0KKwordnJmeToKKyAgaWYgKCFlcnIpIHsKKyAgICAvKiB2ZXJpZnkgdGhlIHJlc3VsdCAtLSB0aGUgaW5wdXQgbWlnaHQgaGF2ZSBiZWVuIG5vdCBhIHNxdWFyZQorICAgICAqICh0ZXN0IGFkZGVkIGluIDAuOS44KSAqLworCisgICAgaWYgKCFCTl9tb2Rfc3FyKHgsIHJldCwgcCwgY3R4KSkgeworICAgICAgZXJyID0gMTsKKyAgICB9CisKKyAgICBpZiAoIWVyciAmJiAwICE9IEJOX2NtcCh4LCBBKSkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX21vZF9zcXJ0LCBCTl9SX05PVF9BX1NRVUFSRSk7CisgICAgICBlcnIgPSAxOworICAgIH0KKyAgfQorCitlbmQ6CisgIGlmIChlcnIpIHsKKyAgICBpZiAocmV0ICE9IE5VTEwgJiYgcmV0ICE9IGluKSB7CisgICAgICBCTl9jbGVhcl9mcmVlKHJldCk7CisgICAgfQorICAgIHJldCA9IE5VTEw7CisgIH0KKyAgQk5fQ1RYX2VuZChjdHgpOworICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2J1Zi9DTWFrZUxpc3RzLnR4dCBiL2NyeXB0by9idWYvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAzOTI2MAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9idWYvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxMCBAQAoraW5jbHVkZV9kaXJlY3RvcmllcyguIC4uIC4uLy4uL2luY2x1ZGUpCisKK2FkZF9saWJyYXJ5KAorCWJ1ZgorCisJT0JKRUNUCisKKwlidWYuYworCWJ1Zl9lcnJvci5jCispCmRpZmYgLS1naXQgYS9jcnlwdG8vYnVmL2J1Zi5jIGIvY3J5cHRvL2J1Zi9idWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTU1YzBjCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2J1Zi9idWYuYwpAQCAtMCwwICsxLDIxOCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYnVmLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisKKworQlVGX01FTSAqQlVGX01FTV9uZXcodm9pZCkgeworICBCVUZfTUVNICpyZXQ7CisKKyAgcmV0ID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEJVRl9NRU0pKTsKKyAgaWYgKHJldCA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQlVGLCBCVUZfTUVNX25ldywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgbWVtc2V0KHJldCwgMCwgc2l6ZW9mKEJVRl9NRU0pKTsKKyAgcmV0dXJuIHJldDsKK30KKwordm9pZCBCVUZfTUVNX2ZyZWUoQlVGX01FTSAqYnVmKSB7CisgIGlmIChidWYgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChidWYtPmRhdGEgIT0gTlVMTCkgeworICAgIE9QRU5TU0xfY2xlYW5zZShidWYtPmRhdGEsIGJ1Zi0+bWF4KTsKKyAgICBPUEVOU1NMX2ZyZWUoYnVmLT5kYXRhKTsKKyAgfQorCisgIE9QRU5TU0xfZnJlZShidWYpOworfQorCitzdGF0aWMgc2l6ZV90IGJ1Zl9tZW1fZ3JvdyhCVUZfTUVNICpidWYsIHNpemVfdCBsZW4sIGNoYXIgY2xlYW4pIHsKKyAgY2hhciAqbmV3X2J1ZjsKKyAgc2l6ZV90IG4sIGFsbG9jX3NpemU7CisKKyAgaWYgKGJ1Zi0+bGVuZ3RoID49IGxlbikgeworICAgIGJ1Zi0+bGVuZ3RoID0gbGVuOworICAgIHJldHVybiBsZW47CisgIH0KKyAgaWYgKGJ1Zi0+bWF4ID49IGxlbikgeworICAgIG1lbXNldCgmYnVmLT5kYXRhW2J1Zi0+bGVuZ3RoXSwgMCwgbGVuIC0gYnVmLT5sZW5ndGgpOworICAgIGJ1Zi0+bGVuZ3RoID0gbGVuOworICAgIHJldHVybiBsZW47CisgIH0KKworICBuID0gbGVuICsgMzsKKyAgaWYgKG4gPCBsZW4pIHsKKyAgICAvKiBvdmVyZmxvdyAqLworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJVRiwgYnVmX21lbV9ncm93LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgbiA9IG4gLyAzOworICBhbGxvY19zaXplID0gbiAqIDQ7CisgIGlmIChhbGxvY19zaXplIC8gNCAhPSBuKSB7CisgICAgLyogb3ZlcmZsb3cgKi8KKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCVUYsIGJ1Zl9tZW1fZ3JvdywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKGJ1Zi0+ZGF0YSA9PSBOVUxMKSB7CisgICAgbmV3X2J1ZiA9IE9QRU5TU0xfbWFsbG9jKGFsbG9jX3NpemUpOworICB9IGVsc2UgeworICAgIGlmIChjbGVhbikgeworICAgICAgbmV3X2J1ZiA9IE9QRU5TU0xfcmVhbGxvY19jbGVhbihidWYtPmRhdGEsIGJ1Zi0+bWF4LCBhbGxvY19zaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgbmV3X2J1ZiA9IE9QRU5TU0xfcmVhbGxvYyhidWYtPmRhdGEsIGFsbG9jX3NpemUpOworICAgIH0KKyAgfQorCisgIGlmIChuZXdfYnVmID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCVUYsIGJ1Zl9tZW1fZ3JvdywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIGxlbiA9IDA7CisgIH0gZWxzZSB7CisgICAgYnVmLT5kYXRhID0gbmV3X2J1ZjsKKyAgICBidWYtPm1heCA9IGFsbG9jX3NpemU7CisgICAgbWVtc2V0KCZidWYtPmRhdGFbYnVmLT5sZW5ndGhdLCAwLCBsZW4gLSBidWYtPmxlbmd0aCk7CisgICAgYnVmLT5sZW5ndGggPSBsZW47CisgIH0KKworICByZXR1cm4gbGVuOworfQorCitzaXplX3QgQlVGX01FTV9ncm93KEJVRl9NRU0gKmJ1Ziwgc2l6ZV90IGxlbikgeworICByZXR1cm4gYnVmX21lbV9ncm93KGJ1ZiwgbGVuLCAwIC8qIGRvbid0IGNsZWFyIG9sZCBidWZmZXIgY29udGVudHMuICovKTsKK30KKworc2l6ZV90IEJVRl9NRU1fZ3Jvd19jbGVhbihCVUZfTUVNICpidWYsIHNpemVfdCBsZW4pIHsKKyAgcmV0dXJuIGJ1Zl9tZW1fZ3JvdyhidWYsIGxlbiwgMSAvKiBjbGVhciBvbGQgYnVmZmVyIGNvbnRlbnRzLiAqLyk7Cit9CisKK2NoYXIgKkJVRl9zdHJkdXAoY29uc3QgY2hhciAqYnVmKSB7CisgIGlmIChidWYgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIEJVRl9zdHJuZHVwKGJ1Ziwgc3RybGVuKGJ1ZikpOworfQorCitjaGFyICpCVUZfc3RybmR1cChjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKSB7CisgIGNoYXIgKnJldDsKKyAgc2l6ZV90IGFsbG9jX3NpemU7CisKKyAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBhbGxvY19zaXplID0gc2l6ZSArIDE7CisgIGlmIChhbGxvY19zaXplIDwgc2l6ZSkgeworICAgIC8qIG92ZXJmbG93ICovCisgICAgT1BFTlNTTF9QVVRfRVJST1IoQlVGLCBCVUZfc3RybmR1cCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldCA9IE9QRU5TU0xfbWFsbG9jKGFsbG9jX3NpemUpOworICBpZiAocmV0ID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCVUYsIEJVRl9zdHJuZHVwLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBCVUZfc3RybGNweShyZXQsIGJ1ZiwgYWxsb2Nfc2l6ZSk7CisgIHJldHVybiByZXQ7Cit9CisKK3NpemVfdCBCVUZfc3RybGNweShjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IGRzdF9zaXplKSB7CisgIHNpemVfdCBsID0gMDsKKworICBmb3IgKDsgZHN0X3NpemUgPiAxICYmICpzcmM7IGRzdF9zaXplLS0pIHsKKyAgICAqZHN0KysgPSAqc3JjKys7CisgICAgbCsrOworICB9CisKKyAgaWYgKGRzdF9zaXplKSB7CisgICAgKmRzdCA9IDA7CisgIH0KKworICByZXR1cm4gbCArIHN0cmxlbihzcmMpOworfQorCitzaXplX3QgQlVGX3N0cmxjYXQoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBkc3Rfc2l6ZSkgeworICBzaXplX3QgbCA9IDA7CisgIGZvciAoOyBkc3Rfc2l6ZSA+IDAgJiYgKmRzdDsgZHN0X3NpemUtLSwgZHN0KyspIHsKKyAgICBsKys7CisgIH0KKyAgcmV0dXJuIGwgKyBCVUZfc3RybGNweShkc3QsIHNyYywgZHN0X3NpemUpOworfQorCit2b2lkICpCVUZfbWVtZHVwKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBkc3Rfc2l6ZSkgeworICB2b2lkICpyZXQ7CisKKyAgaWYgKGRhdGEgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0ID0gT1BFTlNTTF9tYWxsb2MoZHN0X3NpemUpOworICBpZiAocmV0ID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCVUYsIEJVRl9tZW1kdXAsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIG1lbWNweShyZXQsIGRhdGEsIGRzdF9zaXplKTsKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2NyeXB0by9idWYvYnVmLmggYi9jcnlwdG8vYnVmL2J1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZmVlZTQKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYnVmL2J1Zi5oCkBAIC0wLDAgKzEsMTE1IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaWZuZGVmIE9QRU5TU0xfSEVBREVSX0JVRkZFUl9ICisjZGVmaW5lIE9QRU5TU0xfSEVBREVSX0JVRkZFUl9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jhc2UuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIEJVRl9NRU0gaXMgYSBnZW5lcmljIGJ1ZmZlciBvYmplY3QgdXNlZCBieSBPcGVuU1NMLiAqLworc3RydWN0IGJ1Zl9tZW1fc3QgeworICBzaXplX3QgbGVuZ3RoOyAvKiBjdXJyZW50IG51bWJlciBvZiBieXRlcyAqLworICBjaGFyICpkYXRhOworICBzaXplX3QgbWF4OyAvKiBzaXplIG9mIGJ1ZmZlciAqLworfTsKKworLyogQlVGX01FTV9uZXcgY3JlYXRlcyBhIG5ldyBCVUZfTUVNIHdoaWNoIGhhcyBubyBhbGxvY2F0ZWQgZGF0YSBidWZmZXIuICovCitCVUZfTUVNICpCVUZfTUVNX25ldyh2b2lkKTsKKworLyogQlVGX01FTV9mcmVlIGZyZWVzIHxidWYtPmRhdGF8IGlmIG5lZWRlZCBhbmQgdGhlbiBmcmVlcyB8YnVmfCBpdHNlbGYuICovCit2b2lkIEJVRl9NRU1fZnJlZShCVUZfTUVNICpidWYpOworCisvKiBCVUZfTUVNX2dyb3cgZW5zdXJlcyB0aGF0IHxidWZ8IGhhcyBsZW5ndGggfGxlbnwgYW5kIGFsbG9jYXRlcyBtZW1vcnkgaWYKKyAqIG5lZWRlZC4gSWYgdGhlIGxlbmd0aCBvZiB8YnVmfCBpbmNyZWFzZWQsIHRoZSBuZXcgYnl0ZXMgYXJlIGZpbGxlZCB3aXRoCisgKiB6ZXJvcy4gSXQgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHxidWZ8LCBvciB6ZXJvIGlmIHRoZXJlJ3MgYW4gZXJyb3IuICovCitzaXplX3QgQlVGX01FTV9ncm93KEJVRl9NRU0gKmJ1Ziwgc2l6ZV90IGxlbik7CisKKy8qIEJVRl9NRU1fZ3Jvd19jbGVhbiBhY3RzIHRoZSBzYW1lIGFzIHxCVUZfTUVNX2dyb3d8LCBidXQgY2xlYXJzIHRoZSBwcmV2aW91cworICogY29udGVudHMgb2YgbWVtb3J5IGlmIHJlYWxsb2NpbmcuICovCitzaXplX3QgQlVGX01FTV9ncm93X2NsZWFuKEJVRl9NRU0gKnN0ciwgc2l6ZV90IGxlbik7CisKKy8qIEJVRl9zdHJkdXAgcmV0dXJucyBhbiBhbGxvY2F0ZWQsIGR1cGxpY2F0ZSBvZiB8c3RyfC4gKi8KK2NoYXIgKkJVRl9zdHJkdXAoY29uc3QgY2hhciAqc3RyKTsKKworLyogQlVGX3N0cm5kdXAgcmV0dXJucyBhbiBhbGxvY2F0ZWQsIGR1cGxpY2F0ZSBvZiB8c3RyfCwgd2hpY2ggaXMsIGF0IG1vc3QsCisgKiB8c2l6ZXwgYnl0ZXMuIFRoZSByZXN1bHQgaXMgYWx3YXlzIE5VTCB0ZXJtaW5hdGVkLiAqLworY2hhciAqQlVGX3N0cm5kdXAoY29uc3QgY2hhciAqc3RyLCBzaXplX3Qgc2l6ZSk7CisKKy8qIEJVRl9tZW1kdXAgcmV0dXJucyBhbiBhbGxvY2F0ZWQsIGR1cGxpY2F0ZSBvZiB8c2l6ZXwgYnl0ZXMgZnJvbSB8ZGF0YXwuICovCit2b2lkICpCVUZfbWVtZHVwKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKworLyogQlVGX3N0cmxjcHkgYWN0cyBsaWtlIHN0cmxjcHkoMykuICovCitzaXplX3QgQlVGX3N0cmxjcHkoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBkc3Rfc2l6ZSk7CisKKy8qIEJVRl9zdHJsY2F0IGFjdHMgbGlrZSBzdHJsY2F0KDMpLiAqLworc2l6ZV90IEJVRl9zdHJsY2F0KGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3Qgc2l6ZSk7CisKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9ICAvKiBleHRlcm4gQyAqLworI2VuZGlmCisKKyNkZWZpbmUgQlVGX0ZfQlVGX01FTV9uZXcgMTAwCisjZGVmaW5lIEJVRl9GX2J1Zl9tZW1fZ3JvdyAxMDEKKyNkZWZpbmUgQlVGX0ZfQlVGX3N0cm5kdXAgMTAyCisjZGVmaW5lIEJVRl9GX0JVRl9tZW1kdXAgMTAzCisKKyNlbmRpZiAgLyogT1BFTlNTTF9IRUFERVJfQlVGRkVSX0ggKi8KZGlmZiAtLWdpdCBhL2NyeXB0by9idWYvYnVmX2Vycm9yLmMgYi9jcnlwdG8vYnVmL2J1Zl9lcnJvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YmU2MDQKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYnVmL2J1Zl9lcnJvci5jCkBAIC0wLDAgKzEsMjUgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNCwgR29vZ2xlIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisKKyNpbmNsdWRlICJidWYuaCIKKworY29uc3QgRVJSX1NUUklOR19EQVRBIEJVRl9lcnJvcl9zdHJpbmdfZGF0YVtdID0geworICB7RVJSX1BBQ0soRVJSX0xJQl9CVUYsIEJVRl9GX0JVRl9NRU1fbmV3LCAwKSwgIkJVRl9NRU1fbmV3In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0JVRiwgQlVGX0ZfQlVGX21lbWR1cCwgMCksICJCVUZfbWVtZHVwIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0JVRiwgQlVGX0ZfQlVGX3N0cm5kdXAsIDApLCAiQlVGX3N0cm5kdXAifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQlVGLCBCVUZfRl9idWZfbWVtX2dyb3csIDApLCAiYnVmX21lbV9ncm93In0sCisgIHswLCBOVUxMfSwKK307CmRpZmYgLS1naXQgYS9jcnlwdG8vYnl0ZXN0cmluZy9DTWFrZUxpc3RzLnR4dCBiL2NyeXB0by9ieXRlc3RyaW5nL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwOWEwY2UKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYnl0ZXN0cmluZy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDE4IEBACitpbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKKworYWRkX2xpYnJhcnkoCisJYnl0ZXN0cmluZworCisJT0JKRUNUCisKKwljYnMuYworCWNiYi5jCispCisKK2FkZF9leGVjdXRhYmxlKAorCWJ5dGVzdHJpbmdfdGVzdAorCisJYnl0ZXN0cmluZ190ZXN0LmMKKykKKwordGFyZ2V0X2xpbmtfbGlicmFyaWVzKGJ5dGVzdHJpbmdfdGVzdCBjcnlwdG8pCmRpZmYgLS1naXQgYS9jcnlwdG8vYnl0ZXN0cmluZy9ieXRlc3RyaW5nLmggYi9jcnlwdG8vYnl0ZXN0cmluZy9ieXRlc3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY3ODhhNwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9ieXRlc3RyaW5nL2J5dGVzdHJpbmcuaApAQCAtMCwwICsxLDIzOSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE0LCBHb29nbGUgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQorICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLiAqLworCisjaWZuZGVmIE9QRU5TU0xfSEVBREVSX0JZVEVTVFJJTkdfSAorI2RlZmluZSBPUEVOU1NMX0hFQURFUl9CWVRFU1RSSU5HX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvYmFzZS5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogQnl0ZXN0cmluZ3MgYXJlIHVzZWQgZm9yIHBhcnNpbmcgYW5kIGJ1aWxkaW5nIFRMUyBhbmQgQVNOLjEgbWVzc2FnZXMuCisgKgorICogQSAiQ0JTIiAoQ1JZUFRPIEJ5dGVTdHJpbmcpIHJlcHJlc2VudHMgYSBzdHJpbmcgb2YgYnl0ZXMgaW4gbWVtb3J5IGFuZAorICogcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHNhZmVseSBwYXJzaW5nIGxlbmd0aC1wcmVmaXhlZCBzdHJ1Y3R1cmVzCisgKiBsaWtlIFRMUyBhbmQgQVNOLjEgZnJvbSBpdC4KKyAqCisgKiBBICJDQkIiIChDUllQVE8gQnl0ZUJ1aWxkZXIpIGlzIGEgbWVtb3J5IGJ1ZmZlciB0aGF0IGdyb3dzIGFzIG5lZWRlZCBhbmQKKyAqIHByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBidWlsZGluZyBsZW5ndGgtcHJlZml4ZWQgbWVzc2FnZXMuICovCisKKworLyogQ1JZUFRPIEJ5dGVTdHJpbmcgKi8KKworc3RydWN0IGNic19zdCB7CisgIGNvbnN0IHVpbnQ4X3QgKmRhdGE7CisgIHNpemVfdCBsZW47Cit9OworCisvKiBDQlNfaW5pdCBzZXRzIHxjYnN8IHRvIHBvaW50IHRvIHxkYXRhfC4gSXQgZG9lcyBub3QgdGFrZSBvd25lcnNoaXAgb2YKKyAqIHxkYXRhfC4gKi8KK3ZvaWQgQ0JTX2luaXQoQ0JTICpjYnMsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBsZW4pOworCisvKiBDQlNfc2tpcCBhZHZhbmNlcyB8Y2JzfCBieSB8bGVufCBieXRlcy4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybworICogb3RoZXJ3aXNlLiAqLworaW50IENCU19za2lwKENCUyAqY2JzLCBzaXplX3QgbGVuKTsKKworLyogQ0JTX2RhdGEgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGNvbnRhaW5zIG9mIHxjYnN8LiAqLworY29uc3QgdWludDhfdCAqQ0JTX2RhdGEoY29uc3QgQ0JTICpjYnMpOworCisvKiBDQlNfbGVuIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZW1haW5pbmcgaW4gfGNic3wuICovCitzaXplX3QgQ0JTX2xlbihjb25zdCBDQlMgKmNicyk7CisKKy8qIENCU19nZXRfdTggc2V0cyB8Km91dHwgdG8gdGhlIG5leHQgdWludDhfdCBmcm9tIHxjYnN8IGFuZCBhZHZhbmNlcyB8Y2JzfC4gSXQKKyAqIHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24gZXJyb3IuICovCitpbnQgQ0JTX2dldF91OChDQlMgKmNicywgdWludDhfdCAqb3V0KTsKKworLyogQ0JTX2dldF91MTYgc2V0cyB8Km91dHwgdG8gdGhlIG5leHQsIGJpZy1lbmRpYW4gdWludDE2X3QgZnJvbSB8Y2JzfCBhbmQKKyAqIGFkdmFuY2VzIHxjYnN8LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG9uIGVycm9yLiAqLworaW50IENCU19nZXRfdTE2KENCUyAqY2JzLCB1aW50MTZfdCAqb3V0KTsKKworLyogQ0JTX2dldF91MjQgc2V0cyB8Km91dHwgdG8gdGhlIG5leHQsIGJpZy1lbmRpYW4gMjQtYml0IHZhbHVlIGZyb20gfGNic3wgYW5kCisgKiBhZHZhbmNlcyB8Y2JzfC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbiBlcnJvci4gKi8KK2ludCBDQlNfZ2V0X3UyNChDQlMgKmNicywgdWludDMyX3QgKm91dCk7CisKKy8qIENCU19nZXRfdTMyIHNldHMgfCpvdXR8IHRvIHRoZSBuZXh0LCBiaWctZW5kaWFuIHVpbnQzMl90IHZhbHVlIGZyb20gfGNic3wKKyAqIGFuZCBhZHZhbmNlcyB8Y2JzfC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbiBlcnJvci4gKi8KK2ludCBDQlNfZ2V0X3UzMihDQlMgKmNicywgdWludDMyX3QgKm91dCk7CisKKy8qIENCU19nZXRfYnl0ZXMgc2V0cyB8Km91dHwgdG8gdGhlIG5leHQgfGxlbnwgYnl0ZXMgZnJvbSB8Y2JzfCBhbmQgYWR2YW5jZXMKKyAqIHxjYnN8LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG9uIGVycm9yLiAqLworaW50IENCU19nZXRfYnl0ZXMoQ0JTICpjYnMsIENCUyAqb3V0LCBzaXplX3QgbGVuKTsKKworLyogQ0JTX2dldF91OF9sZW5ndGhfcHJlZml4ZWQgc2V0cyB8Km91dHwgdG8gdGhlIGNvbnRlbnRzIG9mIGFuIDgtYml0LAorICogbGVuZ3RoLXByZWZpeGVkIHZhbHVlIGZyb20gfGNic3wgYW5kIGFkdmFuY2VzIHxjYnN8IG92ZXIgaXQuIEl0IHJldHVybnMgb25lCisgKiBvbiBzdWNjZXNzIGFuZCB6ZXJvIG9uIGVycm9yLiAqLworaW50IENCU19nZXRfdThfbGVuZ3RoX3ByZWZpeGVkKENCUyAqY2JzLCBDQlMgKm91dCk7CisKKy8qIENCU19nZXRfdTE2X2xlbmd0aF9wcmVmaXhlZCBzZXRzIHwqb3V0fCB0byB0aGUgY29udGVudHMgb2YgYSAxNi1iaXQsCisgKiBiaWctZW5kaWFuLCBsZW5ndGgtcHJlZml4ZWQgdmFsdWUgZnJvbSB8Y2JzfCBhbmQgYWR2YW5jZXMgfGNic3wgb3ZlciBpdC4gSXQKKyAqIHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24gZXJyb3IuICovCitpbnQgQ0JTX2dldF91MTZfbGVuZ3RoX3ByZWZpeGVkKENCUyAqY2JzLCBDQlMgKm91dCk7CisKKy8qIENCU19nZXRfdTI0X2xlbmd0aF9wcmVmaXhlZCBzZXRzIHwqb3V0fCB0byB0aGUgY29udGVudHMgb2YgYSAyNC1iaXQsCisgKiBiaWctZW5kaWFuLCBsZW5ndGgtcHJlZml4ZWQgdmFsdWUgZnJvbSB8Y2JzfCBhbmQgYWR2YW5jZXMgfGNic3wgb3ZlciBpdC4gSXQKKyAqIHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24gZXJyb3IuICovCitpbnQgQ0JTX2dldF91MjRfbGVuZ3RoX3ByZWZpeGVkKENCUyAqY2JzLCBDQlMgKm91dCk7CisKKworLyogUGFyc2luZyBBU04uMSAqLworCisjZGVmaW5lIENCU19BU04xX0JPT0xFQU4gMHgxCisjZGVmaW5lIENCU19BU04xX0lOVEVHRVIgMHgyCisjZGVmaW5lIENCU19BU04xX0JJVFNUUklORyAweDMKKyNkZWZpbmUgQ0JTX0FTTjFfT0NURVRTVFJJTkcgMHg0CisjZGVmaW5lIENCU19BU04xX09CSkVDVCAweDYKKyNkZWZpbmUgQ0JTX0FTTjFfU0VRVUVOQ0UgKDB4MTAgfCBDQlNfQVNOMV9DT05TVFJVQ1RFRCkKKyNkZWZpbmUgQ0JTX0FTTjFfU0VUICgweDExIHwgQ0JTX0FTTjFfQ09OU1RSVUNURUQpCisKKyNkZWZpbmUgQ0JTX0FTTjFfQ09OU1RSVUNURUQgMHgyMAorI2RlZmluZSBDQlNfQVNOMV9DT05URVhUX1NQRUNJRklDIDB4ODAKKworI2RlZmluZSBDQlNfQVNOMV9BTlkgMHgxMDAwMAorCisvKiBDQlNfZ2V0X2FzbjEgc2V0cyB8Km91dHwgdG8gdGhlIGNvbnRlbnRzIG9mIERFUi1lbmNvZGVkLCBBU04uMSBlbGVtZW50IChub3QKKyAqIGluY2x1ZGluZyB0YWcgYW5kIGxlbmd0aCBieXRlcykgYW5kIGFkdmFuY2VzIHxjYnN8IG92ZXIgaXQuIFRoZSBBU04uMQorICogZWxlbWVudCBtdXN0IG1hdGNoIHx0YWdfdmFsdWV8LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvCisgKiBvbiBlcnJvci4KKyAqCisgKiBUYWcgbnVtYmVycyBncmVhdGVyIHRoYW4gMzEgYXJlIG5vdCBzdXBwb3J0ZWQuICovCitpbnQgQ0JTX2dldF9hc24xKENCUyAqY2JzLCBDQlMgKm91dCwgdW5zaWduZWQgdGFnX3ZhbHVlKTsKKworLyogQ0JTX2dldF9hc24xX2JlciBzZXRzIHwqb3V0fCB0byB0aGUgY29udGVudHMgb2YgQkVSLWVuY29kZWQsIEFTTi4xIGVsZW1lbnQKKyAqIChub3QgaW5jbHVkaW5nIHRhZyBhbmQgbGVuZ3RoIGJ5dGVzKSBhbmQgYWR2YW5jZXMgfGNic3wgb3ZlciBpdC4gVGhlIEFTTi4xCisgKiBlbGVtZW50IG11c3QgbWF0Y2ggfHRhZ192YWx1ZXwuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24gZXJyb3IuCisgKgorICogVGhlIG1ham9yIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIGZ1bmN0aW9uIGFuZCB8Q0JTX2dldF9hc24xfCBpcyB0aGF0CisgKiBpbmRlZmluaXRlLWxlbmd0aCBlbGVtZW50cyBtYXkgYmUgcHJvY2Vzc2VkIGJ5IHRoaXMgZnVuY3Rpb24uCisgKgorICogVGFnIG51bWJlcnMgZ3JlYXRlciB0aGFuIDMxIGFyZSBub3Qgc3VwcG9ydGVkLiAqLworaW50IENCU19nZXRfYXNuMV9iZXIoQ0JTICpjYnMsIENCUyAqb3V0LCB1bnNpZ25lZCB0YWdfdmFsdWUpOworCisvKiBDQlNfZ2V0X2FzbjFfZWxlbWVudCBhY3RzIGxpa2UgfENCU19nZXRfYXNuMXwgYnV0IHxvdXR8IHdpbGwgaW5jbHVkZSB0aGUKKyAqIEFTTi4xIGhlYWRlciBieXRlcyB0b28uICovCitpbnQgQ0JTX2dldF9hc24xX2VsZW1lbnQoQ0JTICpjYnMsIENCUyAqb3V0LCB1bnNpZ25lZCB0YWdfdmFsdWUpOworCisKKy8qIENSWVBUTyBCeXRlQnVpbGRlci4KKyAqCisgKiB8Q0JCfCBvYmplY3RzIGFsbG93IG9uZSB0byBidWlsZCBsZW5ndGgtcHJlZml4ZWQgc2VyaWFsaXNhdGlvbnMuIEEgfENCQnwKKyAqIG9iamVjdCBpcyBhc3NvY2lhdGVkIHdpdGggYSBidWZmZXIgYW5kIG5ldyBidWZmZXJzIGFyZSBjcmVhdGVkIHdpdGgKKyAqIHxDQkJfaW5pdHwuIFNldmVyYWwgfENCQnwgb2JqZWN0cyBjYW4gcG9pbnQgYXQgdGhlIHNhbWUgYnVmZmVyIHdoZW4gYQorICogbGVuZ3RoLXByZWZpeCBpcyBwZW5kaW5nLCBob3dldmVyIG9ubHkgYSBzaW5nbGUgfENCQnwgY2FuIGJlICdjdXJyZW50JyBhdAorICogYW55IG9uZSB0aW1lLiBGb3IgZXhhbXBsZSwgaWYgb25lIGNhbGxzIHxDQkJfYWRkX3U4X2xlbmd0aF9wcmVmaXhlZHwgdGhlbgorICogdGhlIG5ldyB8Q0JCfCBwb2ludHMgYXQgdGhlIHNhbWUgYnVmZmVyIGFzIHRoZSBvcmlnaW5hbC4gQnV0IGlmIHRoZSBvcmlnaW5hbAorICogfENCQnwgaXMgdXNlZCB0aGVuIHRoZSBsZW5ndGggcHJlZml4IGlzIHdyaXR0ZW4gb3V0IGFuZCB0aGUgbmV3IHxDQkJ8IG11c3QKKyAqIG5vdCBiZSB1c2VkIGFnYWluLgorICoKKyAqIElmIG9uZSBuZWVkcyB0byBmb3JjZSBhIGxlbmd0aCBwcmVmaXggdG8gYmUgd3JpdHRlbiBvdXQgYmVjYXVzZSBhIHxDQkJ8IGlzCisgKiBnb2luZyBvdXQgb2Ygc2NvcGUsIHVzZSB8Q0JCX2ZsdXNofC4gKi8KKworc3RydWN0IGNiYl9idWZmZXJfc3QgeworICB1aW50OF90ICpidWY7CisgIHNpemVfdCBsZW47ICAgICAgLyogVGhlIG51bWJlciBvZiB2YWxpZCBieXRlcy4gKi8KKyAgc2l6ZV90IGNhcDsgICAgICAvKiBUaGUgc2l6ZSBvZiBidWYuICovCisgIGNoYXIgY2FuX3Jlc2l6ZTsgLyogT25lIGlmZiB8YnVmfCBpcyBvd25lZCBieSB0aGlzIG9iamVjdC4gSWYgbm90IHRoZW4gfGJ1ZnwKKyAgICAgICAgICAgICAgICAgICAgICBjYW5ub3QgYmUgcmVzaXplZC4gKi8KK307CisKK3N0cnVjdCBjYmJfc3QgeworICBzdHJ1Y3QgY2JiX2J1ZmZlcl9zdCAqYmFzZTsKKyAgLyogb2Zmc2V0IGlzIHRoZSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgfGJhc2UtPmJ1ZnwgdG8gdGhlIHBvc2l0aW9uIG9mIGFueQorICAgKiBwZW5kaW5nIGxlbmd0aC1wcmVmaXguICovCisgIHNpemVfdCBvZmZzZXQ7CisgIC8qIGNoaWxkIHBvaW50cyB0byBhIGNoaWxkIENCQiBpZiBhIGxlbmd0aC1wcmVmaXggaXMgcGVuZGluZy4gKi8KKyAgc3RydWN0IGNiYl9zdCAqY2hpbGQ7CisgIC8qIHBlbmRpbmdfbGVuX2xlbiBjb250YWlucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIGEgcGVuZGluZyBsZW5ndGgtcHJlZml4LAorICAgKiBvciB6ZXJvIGlmIG5vIGxlbmd0aC1wcmVmaXggaXMgcGVuZGluZy4gKi8KKyAgdWludDhfdCBwZW5kaW5nX2xlbl9sZW47CisgIGNoYXIgcGVuZGluZ19pc19hc24xOworICAvKiBpc190b3BfbGV2ZWwgaXMgdHJ1ZSBpZmYgdGhpcyBpcyBhIHRvcC1sZXZlbCB8Q0JCfCAoYXMgb3Bwb3NlZCB0byBhIGNoaWxkCisgICAqIHxDQkJ8KS4gVG9wLWxldmVsIG9iamVjdHMgYXJlIHZhbGlkIGFyZ3VtZW50cyBmb3IgfENCQl9maW5pc2h8LiAqLworICBjaGFyIGlzX3RvcF9sZXZlbDsKK307CisKKy8qIENCQl9pbml0IGluaXRpYWxpc2VzIHxjYmJ8IHdpdGggfGluaXRpYWxfY2FwYWNpdHl8LiBTaW5jZSBhIHxDQkJ8IGdyb3dzIGFzCisgKiBuZWVkZWQsIHRoZSB8aW5pdGlhbF9jYXBhY2l0eXwgaXMganVzdCBhIGhpbnQuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3Mgb3IKKyAqIHplcm8gb24gZXJyb3IuICovCitpbnQgQ0JCX2luaXQoQ0JCICpjYmIsIHNpemVfdCBpbml0aWFsX2NhcGFjaXR5KTsKKworLyogQ0JCX2luaXRfZml4ZWQgaW5pdGlhbGlzZXMgfGNiYnwgdG8gd3JpdGUgdG8gfGxlbnwgYnl0ZXMgYXQgfGJ1ZnwuIFNpbmNlCisgKiB8YnVmfCBjYW5ub3QgZ3JvdywgdHJ5aW5nIHRvIHdyaXRlIG1vcmUgdGhhbiB8bGVufCBieXRlcyB3aWxsIGNhdXNlIENCQgorICogZnVuY3Rpb25zIHRvIGZhaWwuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3Mgb3IgemVybyBvbiBlcnJvci4gKi8KK2ludCBDQkJfaW5pdF9maXhlZChDQkIgKmNiYiwgdWludDhfdCAqYnVmLCBzaXplX3QgbGVuKTsKKworLyogQ0JCX2NsZWFudXAgZnJlZXMgYWxsIHJlc291cmNlcyBvd25lZCBieSB8Y2JifCBhbmQgb3RoZXIgfENCQnwgb2JqZWN0cworICogd3JpdGluZyB0byB0aGUgc2FtZSBidWZmZXIuIFRoaXMgc2hvdWxkIGJlIHVzZWQgaW4gYW4gZXJyb3IgY2FzZSB3aGVyZSBhCisgKiBzZXJpYWxpc2F0aW9uIGlzIGFiYW5kb25lZC4gKi8KK3ZvaWQgQ0JCX2NsZWFudXAoQ0JCICpjYmIpOworCisvKiBDQkJfZmluaXNoIGNvbXBsZXRlcyBhbnkgcGVuZGluZyBsZW5ndGggcHJlZml4IGFuZCBzZXRzIHwqb3V0X2RhdGF8IHRvIGEKKyAqIG1hbGxvY2VkIGJ1ZmZlciBhbmQgfCpvdXRfbGVufCB0byB0aGUgbGVuZ3RoIG9mIHRoYXQgYnVmZmVyLiBUaGUgY2FsbGVyCisgKiB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIGJ1ZmZlciBhbmQsIHVubGVzcyB0aGUgYnVmZmVyIHdhcyBmaXhlZCB3aXRoCisgKiB8Q0JCX2luaXRfZml4ZWR8LCBtdXN0IGNhbGwgfE9QRU5TU0xfZnJlZXwgd2hlbiBkb25lLgorICoKKyAqIEl0IGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBhICJ0b3AgbGV2ZWwiIHxDQkJ8LCBpLmUuIG9uZSBpbml0aWFsaXNlZCB3aXRoCisgKiB8Q0JCX2luaXR8IG9yIHxDQkJfaW5pdF9maXhlZHwuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24KKyAqIGVycm9yLiAqLworaW50IENCQl9maW5pc2goQ0JCICpjYmIsIHVpbnQ4X3QgKipvdXRfZGF0YSwgc2l6ZV90ICpvdXRfbGVuKTsKKworLyogQ0JCX2ZsdXNoIGNhdXNlcyBhbnkgcGVuZGluZyBsZW5ndGggcHJlZml4ZXMgdG8gYmUgd3JpdHRlbiBvdXQgYW5kIGFueSBjaGlsZAorICogfENCQnwgb2JqZWN0cyBvZiB8Y2JifCB0byBiZSBpbnZhbGlkYXRlZC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBvciB6ZXJvCisgKiBvbiBlcnJvci4gKi8KK2ludCBDQkJfZmx1c2goQ0JCICpjYmIpOworCisvKiBDQkJfYWRkX3U4X2xlbmd0aF9wcmVmaXhlZCBzZXRzIHwqb3V0X2NvbnRlbnRzfCB0byBhIG5ldyBjaGlsZCBvZiB8Y2JifC4gVGhlCisgKiBkYXRhIHdyaXR0ZW4gdG8gfCpvdXRfY29udGVudHN8IHdpbGwgYmUgcHJlZml4ZWQgaW4gfGNiYnwgd2l0aCBhbiA4LWJpdAorICogbGVuZ3RoLiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIG9yIHplcm8gb24gZXJyb3IuICovCitpbnQgQ0JCX2FkZF91OF9sZW5ndGhfcHJlZml4ZWQoQ0JCICpjYmIsIENCQiAqb3V0X2NvbnRlbnRzKTsKKworLyogQ0JCX2FkZF91MTZfbGVuZ3RoX3ByZWZpeGVkIHNldHMgfCpvdXRfY29udGVudHN8IHRvIGEgbmV3IGNoaWxkIG9mIHxjYmJ8LgorICogVGhlIGRhdGEgd3JpdHRlbiB0byB8Km91dF9jb250ZW50c3wgd2lsbCBiZSBwcmVmaXhlZCBpbiB8Y2JifCB3aXRoIGEgMTYtYml0LAorICogYmlnLWVuZGlhbiBsZW5ndGguIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3Mgb3IgemVybyBvbiBlcnJvci4gKi8KK2ludCBDQkJfYWRkX3UxNl9sZW5ndGhfcHJlZml4ZWQoQ0JCICpjYmIsIENCQiAqb3V0X2NvbnRlbnRzKTsKKworLyogQ0JCX2FkZF91MjRfbGVuZ3RoX3ByZWZpeGVkIHNldHMgfCpvdXRfY29udGVudHN8IHRvIGEgbmV3IGNoaWxkIG9mIHxjYmJ8LgorICogVGhlIGRhdGEgd3JpdHRlbiB0byB8Km91dF9jb250ZW50c3wgd2lsbCBiZSBwcmVmaXhlZCBpbiB8Y2JifCB3aXRoIGEgMjQtYml0LAorICogYmlnLWVuZGlhbiBsZW5ndGguIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3Mgb3IgemVybyBvbiBlcnJvci4gKi8KK2ludCBDQkJfYWRkX3UyNF9sZW5ndGhfcHJlZml4ZWQoQ0JCICpjYmIsIENCQiAqb3V0X2NvbnRlbnRzKTsKKworLyogQ0JCX2FkZF9hc24gc2V0cyB8Km91dF9jb250ZW50c3wgdG8gYSB8Q0JCfCBpbnRvIHdoaWNoIHRoZSBjb250ZW50cyBvZiBhbgorICogQVNOLjEgb2JqZWN0IGNhbiBiZSB3cml0dGVuLiBUaGUgfHRhZ3wgYXJndW1lbnQgd2lsbCBiZSB1c2VkIGFzIHRoZSB0YWcgZm9yCisgKiB0aGUgb2JqZWN0LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIG9yIHplcm8gb24gZXJyb3IuICovCitpbnQgQ0JCX2FkZF9hc24xKENCQiAqY2JiLCBDQkIgKm91dF9jb250ZW50cywgdWludDhfdCB0YWcpOworCisvKiBDQkJfYWRkX2J5dGVzIGFwcGVuZHMgfGxlbnwgYnl0ZXMgZnJvbSB8ZGF0YXwgdG8gfGNiYnwuIEl0IHJldHVybnMgb25lIG9uCisgKiBzdWNjZXNzIGFuZCB6ZXJvIG90aGVyd2lzZS4gKi8KK2ludCBDQkJfYWRkX2J5dGVzKENCQiAqY2JiLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgbGVuKTsKKworLyogQ0JCX2FkZF91OCBhcHBlbmRzIGFuIDgtYml0IG51bWJlciBmcm9tIHx2YWx1ZXwgdG8gfGNiYnwuIEl0IHJldHVybnMgb25lIG9uCisgKiBzdWNjZXNzIGFuZCB6ZXJvIG90aGVyd2lzZS4gKi8KK2ludCBDQkJfYWRkX3U4KENCQiAqY2JiLCB1aW50OF90IHZhbHVlKTsKKworLyogQ0JCX2FkZF91OCBhcHBlbmRzIGEgMTYtYml0LCBiaWctZW5kaWFuIG51bWJlciBmcm9tIHx2YWx1ZXwgdG8gfGNiYnwuIEl0CisgKiByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG90aGVyd2lzZS4gKi8KK2ludCBDQkJfYWRkX3UxNihDQkIgKmNiYiwgdWludDE2X3QgdmFsdWUpOworCisvKiBDQkJfYWRkX3UyNCBhcHBlbmRzIGEgMjQtYml0LCBiaWctZW5kaWFuIG51bWJlciBmcm9tIHx2YWx1ZXwgdG8gfGNiYnwuIEl0CisgKiByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG90aGVyd2lzZS4gKi8KK2ludCBDQkJfYWRkX3UyNChDQkIgKmNiYiwgdWludDMyX3QgdmFsdWUpOworCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfSAgLyogZXh0ZXJuIEMgKi8KKyNlbmRpZgorCisjZW5kaWYgIC8qIE9QRU5TU0xfSEVBREVSX0JZVEVTVFJJTkdfSCAqLwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2J5dGVzdHJpbmcvYnl0ZXN0cmluZ190ZXN0LmMgYi9jcnlwdG8vYnl0ZXN0cmluZy9ieXRlc3RyaW5nX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmZlNjFiCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2J5dGVzdHJpbmcvYnl0ZXN0cmluZ190ZXN0LmMKQEAgLTAsMCArMSw0MTEgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNCwgR29vZ2xlIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4gKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2J5dGVzdHJpbmcuaD4KKworCitzdGF0aWMgaW50IHRlc3Rfc2tpcCgpIHsKKyAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0RhdGFbXSA9IHsxLCAyLCAzfTsKKyAgQ0JTIGRhdGE7CisKKyAgQ0JTX2luaXQoJmRhdGEsIGtEYXRhLCBzaXplb2Yoa0RhdGEpKTsKKyAgcmV0dXJuIENCU19sZW4oJmRhdGEpID09IDMgJiYKKyAgICAgIENCU19za2lwKCZkYXRhLCAxKSAmJgorICAgICAgQ0JTX2xlbigmZGF0YSkgPT0gMiAmJgorICAgICAgQ0JTX3NraXAoJmRhdGEsIDIpICYmCisgICAgICBDQlNfbGVuKCZkYXRhKSA9PSAwICYmCisgICAgICAhQ0JTX3NraXAoJmRhdGEsIDEpOworfQorCitzdGF0aWMgaW50IHRlc3RfZ2V0X3UoKSB7CisgIHN0YXRpYyBjb25zdCB1aW50OF90IGtEYXRhW10gPSB7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTB9OworICB1aW50OF90IHU4OworICB1aW50MTZfdCB1MTY7CisgIHVpbnQzMl90IHUzMjsKKyAgQ0JTIGRhdGE7CisKKyAgQ0JTX2luaXQoJmRhdGEsIGtEYXRhLCBzaXplb2Yoa0RhdGEpKTsKKyAgcmV0dXJuIENCU19nZXRfdTgoJmRhdGEsICZ1OCkgJiYKKyAgICB1OCA9PSAxICYmCisgICAgQ0JTX2dldF91MTYoJmRhdGEsICZ1MTYpICYmCisgICAgdTE2ID09IDB4MjAzICYmCisgICAgQ0JTX2dldF91MjQoJmRhdGEsICZ1MzIpICYmCisgICAgdTMyID09IDB4NDA1MDYgJiYKKyAgICBDQlNfZ2V0X3UzMigmZGF0YSwgJnUzMikgJiYKKyAgICB1MzIgPT0gMHg3MDgwOTBhICYmCisgICAgIUNCU19nZXRfdTgoJmRhdGEsICZ1OCk7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9nZXRfcHJlZml4ZWQoKSB7CisgIHN0YXRpYyBjb25zdCB1aW50OF90IGtEYXRhW10gPSB7MSwgMiwgMCwgMiwgMywgNCwgMCwgMCwgMywgMywgMiwgMX07CisgIHVpbnQ4X3QgdTg7CisgIHVpbnQxNl90IHUxNjsKKyAgdWludDMyX3QgdTMyOworICBDQlMgZGF0YSwgcHJlZml4ZWQ7CisKKyAgQ0JTX2luaXQoJmRhdGEsIGtEYXRhLCBzaXplb2Yoa0RhdGEpKTsKKyAgcmV0dXJuIENCU19nZXRfdThfbGVuZ3RoX3ByZWZpeGVkKCZkYXRhLCAmcHJlZml4ZWQpICYmCisgICAgQ0JTX2xlbigmcHJlZml4ZWQpID09IDEgJiYKKyAgICBDQlNfZ2V0X3U4KCZwcmVmaXhlZCwgJnU4KSAmJgorICAgIHU4ID09IDIgJiYKKyAgICBDQlNfZ2V0X3UxNl9sZW5ndGhfcHJlZml4ZWQoJmRhdGEsICZwcmVmaXhlZCkgJiYKKyAgICBDQlNfbGVuKCZwcmVmaXhlZCkgPT0gMiAmJgorICAgIENCU19nZXRfdTE2KCZwcmVmaXhlZCwgJnUxNikgJiYKKyAgICB1MTYgPT0gMHgzMDQgJiYKKyAgICBDQlNfZ2V0X3UyNF9sZW5ndGhfcHJlZml4ZWQoJmRhdGEsICZwcmVmaXhlZCkgJiYKKyAgICBDQlNfbGVuKCZwcmVmaXhlZCkgPT0gMyAmJgorICAgIENCU19nZXRfdTI0KCZwcmVmaXhlZCwgJnUzMikgJiYKKyAgICB1MzIgPT0gMHgzMDIwMTsKK30KKworc3RhdGljIGludCB0ZXN0X2dldF9wcmVmaXhlZF9iYWQoKSB7CisgIHN0YXRpYyBjb25zdCB1aW50OF90IGtEYXRhMVtdID0gezIsIDF9OworICBzdGF0aWMgY29uc3QgdWludDhfdCBrRGF0YTJbXSA9IHswLCAyLCAxfTsKKyAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0RhdGEzW10gPSB7MCwgMCwgMiwgMX07CisgIENCUyBkYXRhLCBwcmVmaXhlZDsKKworICBDQlNfaW5pdCgmZGF0YSwga0RhdGExLCBzaXplb2Yoa0RhdGExKSk7CisgIGlmIChDQlNfZ2V0X3U4X2xlbmd0aF9wcmVmaXhlZCgmZGF0YSwgJnByZWZpeGVkKSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgQ0JTX2luaXQoJmRhdGEsIGtEYXRhMiwgc2l6ZW9mKGtEYXRhMikpOworICBpZiAoQ0JTX2dldF91MTZfbGVuZ3RoX3ByZWZpeGVkKCZkYXRhLCAmcHJlZml4ZWQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBDQlNfaW5pdCgmZGF0YSwga0RhdGEzLCBzaXplb2Yoa0RhdGEzKSk7CisgIGlmIChDQlNfZ2V0X3UyNF9sZW5ndGhfcHJlZml4ZWQoJmRhdGEsICZwcmVmaXhlZCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHRlc3RfZ2V0X2FzbjEoKSB7CisgIHN0YXRpYyBjb25zdCB1aW50OF90IGtEYXRhMVtdID0gezB4MzAsIDIsIDEsIDJ9OworICBzdGF0aWMgY29uc3QgdWludDhfdCBrRGF0YTJbXSA9IHsweDMwLCAzLCAxLCAyfTsKKyAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0RhdGEzW10gPSB7MHgzMCwgMHg4MH07CisgIHN0YXRpYyBjb25zdCB1aW50OF90IGtEYXRhNFtdID0gezB4MzAsIDB4ODEsIDEsIDF9OworICBzdGF0aWMgY29uc3QgdWludDhfdCBrRGF0YTVbXSA9IHsweDMwLCAweDgyLCAwLCAxLCAxfTsKKworICBDQlMgZGF0YSwgY29udGVudHM7CisKKyAgQ0JTX2luaXQoJmRhdGEsIGtEYXRhMSwgc2l6ZW9mKGtEYXRhMSkpOworICBpZiAoIUNCU19nZXRfYXNuMSgmZGF0YSwgJmNvbnRlbnRzLCAweDMwKSB8fAorICAgICAgQ0JTX2xlbigmY29udGVudHMpICE9IDIgfHwKKyAgICAgIG1lbWNtcChDQlNfZGF0YSgmY29udGVudHMpLCAiXHgwMVx4MDIiLCAyKSAhPSAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBDQlNfaW5pdCgmZGF0YSwga0RhdGEyLCBzaXplb2Yoa0RhdGEyKSk7CisgIC8qIGRhdGEgaXMgdHJ1bmNhdGVkICovCisgIGlmIChDQlNfZ2V0X2FzbjEoJmRhdGEsICZjb250ZW50cywgMHgzMCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIENCU19pbml0KCZkYXRhLCBrRGF0YTMsIHNpemVvZihrRGF0YTMpKTsKKyAgLyogemVybyBieXRlIGxlbmd0aCBvZiBsZW5ndGggKi8KKyAgaWYgKENCU19nZXRfYXNuMSgmZGF0YSwgJmNvbnRlbnRzLCAweDMwKSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgQ0JTX2luaXQoJmRhdGEsIGtEYXRhNCwgc2l6ZW9mKGtEYXRhNCkpOworICAvKiBsb25nIGZvcm0gbWlzdGFrZW5seSB1c2VkLiAqLworICBpZiAoQ0JTX2dldF9hc24xKCZkYXRhLCAmY29udGVudHMsIDB4MzApKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBDQlNfaW5pdCgmZGF0YSwga0RhdGE1LCBzaXplb2Yoa0RhdGE1KSk7CisgIC8qIGxlbmd0aCB0YWtlcyB0b28gbWFueSBieXRlcy4gKi8KKyAgaWYgKENCU19nZXRfYXNuMSgmZGF0YSwgJmNvbnRlbnRzLCAweDMwKSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgQ0JTX2luaXQoJmRhdGEsIGtEYXRhMSwgc2l6ZW9mKGtEYXRhMSkpOworICAvKiB3cm9uZyB0YWcuICovCisgIGlmIChDQlNfZ2V0X2FzbjEoJmRhdGEsICZjb250ZW50cywgMHgzMSkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHRlc3RfZ2V0X2luZGVmKCkgeworICBzdGF0aWMgY29uc3QgdWludDhfdCBrRGF0YTFbXSA9IHsweDMwLCAweDgwLCAweDAwLCAweDAwfTsKKyAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0RhdGFXaXRob3V0RU9DW10gPSB7MHgzMCwgMHg4MCwgMHgwMSwgMHgwMH07CisgIHN0YXRpYyBjb25zdCB1aW50OF90IGtEYXRhV2l0aEJhZEludGVybmFsTGVuZ3RoW10gPSB7MHgzMCwgMHg4MCwgMHgwMSwgMHgwMX07CisgIHN0YXRpYyBjb25zdCB1aW50OF90IGtEYXRhTmVzdGVkW10gPSB7MHgzMCwgMHg4MCwgMHgzMCwgMHg4MCwgMHgzMCwgMHg4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKworICBDQlMgZGF0YSwgY29udGVudHM7CisgIENCU19pbml0KCZkYXRhLCBrRGF0YTEsIHNpemVvZihrRGF0YTEpKTsKKyAgaWYgKENCU19nZXRfYXNuMSgmZGF0YSwgJmNvbnRlbnRzLCAweDMwKSkgeworICAgIC8qIEluZGVmaW5pdGUgbGVuZ3RocyBzaG91bGQgbm90IGJlIHN1cHBvcnRlZCBpbiBERVIgbW9kZS4gKi8KKyAgICBmcHJpbnRmKHN0ZGVyciwgIkluZGVmaW5pdGUgbGVuZ3RoIHBhcnNlZCBieSBDQlNfZ2V0X2FzbjEuXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmICghQ0JTX2dldF9hc24xX2JlcigmZGF0YSwgJmNvbnRlbnRzLCAweDMwKSB8fAorICAgICAgQ0JTX2xlbigmY29udGVudHMpICE9IDAgfHwKKyAgICAgIENCU19sZW4oJmRhdGEpICE9IDApIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlNpbXBsZSBpbmRlZmluaXRlIGxlbmd0aCBmYWlsZWQuXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIENCU19pbml0KCZkYXRhLCBrRGF0YVdpdGhvdXRFT0MsIHNpemVvZihrRGF0YVdpdGhvdXRFT0MpKTsKKyAgaWYgKENCU19nZXRfYXNuMV9iZXIoJmRhdGEsICZjb250ZW50cywgMHgzMCkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlBhcnNlZCB3aXRob3V0IEVPQy5cbiIpOworICAgIHJldHVybiAwOworICB9CisKKyAgQ0JTX2luaXQoJmRhdGEsIGtEYXRhV2l0aEJhZEludGVybmFsTGVuZ3RoLAorICAgICAgICAgICBzaXplb2Yoa0RhdGFXaXRoQmFkSW50ZXJuYWxMZW5ndGgpKTsKKyAgaWYgKENCU19nZXRfYXNuMV9iZXIoJmRhdGEsICZjb250ZW50cywgMHgzMCkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlBhcnNlZCB3aXRoIGludGVybmFsIGxlbmd0aC5cbiIpOworICAgIHJldHVybiAwOworICB9CisKKyAgQ0JTX2luaXQoJmRhdGEsIGtEYXRhTmVzdGVkLCBzaXplb2Yoa0RhdGFOZXN0ZWQpKTsKKyAgaWYgKCFDQlNfZ2V0X2FzbjFfYmVyKCZkYXRhLCAmY29udGVudHMsIDB4MzApIHx8CisgICAgICBDQlNfbGVuKCZjb250ZW50cykgIT0gOCB8fAorICAgICAgQ0JTX2xlbigmZGF0YSkgIT0gMCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiTmVzdGVkIGluZGVmaW5pdGUgbGVuZ3RocyBmYWlsZWQuXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHRlc3RfY2JiX2Jhc2ljKCkgeworICBzdGF0aWMgY29uc3QgdWludDhfdCBrRXhwZWN0ZWRbXSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4fTsKKyAgdWludDhfdCAqYnVmOworICBzaXplX3QgYnVmX2xlbjsKKyAgaW50IG9rOworICBDQkIgY2JiOworCisgIGlmICghQ0JCX2luaXQoJmNiYiwgMTAwKSkgeworICAgIHJldHVybiAwOworICB9CisgIENCQl9jbGVhbnVwKCZjYmIpOworCisgIGlmICghQ0JCX2luaXQoJmNiYiwgMCkgfHwKKyAgICAgICFDQkJfYWRkX3U4KCZjYmIsIDEpIHx8CisgICAgICAhQ0JCX2FkZF91MTYoJmNiYiwgMHgyMDMpIHx8CisgICAgICAhQ0JCX2FkZF91MjQoJmNiYiwgMHg0MDUwNikgfHwKKyAgICAgICFDQkJfYWRkX2J5dGVzKCZjYmIsIChjb25zdCB1aW50OF90KikgIlx4MDdceDA4IiwgMikgfHwKKyAgICAgICFDQkJfZmluaXNoKCZjYmIsICZidWYsICZidWZfbGVuKSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgb2sgPSBidWZfbGVuID09IHNpemVvZihrRXhwZWN0ZWQpICYmIG1lbWNtcChidWYsIGtFeHBlY3RlZCwgYnVmX2xlbikgPT0gMDsKKyAgZnJlZShidWYpOworICByZXR1cm4gb2s7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9jYmJfZml4ZWQoKSB7CisgIENCQiBjYmI7CisgIHVpbnQ4X3QgYnVmWzFdOworICB1aW50OF90ICpvdXRfYnVmOworICBzaXplX3Qgb3V0X3NpemU7CisKKyAgaWYgKCFDQkJfaW5pdF9maXhlZCgmY2JiLCBOVUxMLCAwKSB8fAorICAgICAgQ0JCX2FkZF91OCgmY2JiLCAxKSB8fAorICAgICAgIUNCQl9maW5pc2goJmNiYiwgJm91dF9idWYsICZvdXRfc2l6ZSkgfHwKKyAgICAgIG91dF9idWYgIT0gTlVMTCB8fAorICAgICAgb3V0X3NpemUgIT0gMCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKCFDQkJfaW5pdF9maXhlZCgmY2JiLCBidWYsIDEpIHx8CisgICAgICAhQ0JCX2FkZF91OCgmY2JiLCAxKSB8fAorICAgICAgQ0JCX2FkZF91OCgmY2JiLCAyKSB8fAorICAgICAgIUNCQl9maW5pc2goJmNiYiwgJm91dF9idWYsICZvdXRfc2l6ZSkgfHwKKyAgICAgIG91dF9idWYgIT0gYnVmIHx8CisgICAgICBvdXRfc2l6ZSAhPSAxIHx8CisgICAgICBidWZbMF0gIT0gMSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9jYmJfZmluaXNoX2NoaWxkKCkgeworICBDQkIgY2JiLCBjaGlsZDsKKyAgdWludDhfdCAqb3V0X2J1ZjsKKyAgc2l6ZV90IG91dF9zaXplOworCisgIGlmICghQ0JCX2luaXQoJmNiYiwgMTYpIHx8CisgICAgICAhQ0JCX2FkZF91OF9sZW5ndGhfcHJlZml4ZWQoJmNiYiwgJmNoaWxkKSB8fAorICAgICAgQ0JCX2ZpbmlzaCgmY2hpbGQsICZvdXRfYnVmLCAmb3V0X3NpemUpIHx8CisgICAgICAhQ0JCX2ZpbmlzaCgmY2JiLCAmb3V0X2J1ZiwgJm91dF9zaXplKSB8fAorICAgICAgb3V0X3NpemUgIT0gMSB8fAorICAgICAgb3V0X2J1ZlswXSAhPSAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBmcmVlKG91dF9idWYpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCB0ZXN0X2NiYl9wcmVmaXhlZCgpIHsKKyAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0V4cGVjdGVkW10gPSB7MCwgMSwgMSwgMCwgMiwgMiwgMywgMCwgMCwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgNSwgNiwgNSwgNCwgMSwgMCwgMSwgMn07CisgIHVpbnQ4X3QgKmJ1ZjsKKyAgc2l6ZV90IGJ1Zl9sZW47CisgIENCQiBjYmIsIGNvbnRlbnRzLCBpbm5lcl9jb250ZW50cywgaW5uZXJfaW5uZXJfY29udGVudHM7CisgIGludCBvazsKKworICBpZiAoIUNCQl9pbml0KCZjYmIsIDApIHx8CisgICAgICAhQ0JCX2FkZF91OF9sZW5ndGhfcHJlZml4ZWQoJmNiYiwgJmNvbnRlbnRzKSB8fAorICAgICAgIUNCQl9hZGRfdThfbGVuZ3RoX3ByZWZpeGVkKCZjYmIsICZjb250ZW50cykgfHwKKyAgICAgICFDQkJfYWRkX3U4KCZjb250ZW50cywgMSkgfHwKKyAgICAgICFDQkJfYWRkX3UxNl9sZW5ndGhfcHJlZml4ZWQoJmNiYiwgJmNvbnRlbnRzKSB8fAorICAgICAgIUNCQl9hZGRfdTE2KCZjb250ZW50cywgMHgyMDMpIHx8CisgICAgICAhQ0JCX2FkZF91MjRfbGVuZ3RoX3ByZWZpeGVkKCZjYmIsICZjb250ZW50cykgfHwKKyAgICAgICFDQkJfYWRkX3UyNCgmY29udGVudHMsIDB4NDA1MDYpIHx8CisgICAgICAhQ0JCX2FkZF91OF9sZW5ndGhfcHJlZml4ZWQoJmNiYiwgJmNvbnRlbnRzKSB8fAorICAgICAgIUNCQl9hZGRfdThfbGVuZ3RoX3ByZWZpeGVkKCZjb250ZW50cywgJmlubmVyX2NvbnRlbnRzKSB8fAorICAgICAgIUNCQl9hZGRfdTgoJmlubmVyX2NvbnRlbnRzLCAxKSB8fAorICAgICAgIUNCQl9hZGRfdTE2X2xlbmd0aF9wcmVmaXhlZCgmaW5uZXJfY29udGVudHMsICZpbm5lcl9pbm5lcl9jb250ZW50cykgfHwKKyAgICAgICFDQkJfYWRkX3U4KCZpbm5lcl9pbm5lcl9jb250ZW50cywgMikgfHwKKyAgICAgICFDQkJfZmluaXNoKCZjYmIsICZidWYsICZidWZfbGVuKSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgb2sgPSBidWZfbGVuID09IHNpemVvZihrRXhwZWN0ZWQpICYmIG1lbWNtcChidWYsIGtFeHBlY3RlZCwgYnVmX2xlbikgPT0gMDsKKyAgZnJlZShidWYpOworICByZXR1cm4gb2s7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9jYmJfbWlzdXNlKCkgeworICBDQkIgY2JiLCBjaGlsZCwgY29udGVudHM7CisgIHVpbnQ4X3QgKmJ1ZjsKKyAgc2l6ZV90IGJ1Zl9sZW47CisKKyAgaWYgKCFDQkJfaW5pdCgmY2JiLCAwKSB8fAorICAgICAgIUNCQl9hZGRfdThfbGVuZ3RoX3ByZWZpeGVkKCZjYmIsICZjaGlsZCkgfHwKKyAgICAgICFDQkJfYWRkX3U4KCZjaGlsZCwgMSkgfHwKKyAgICAgICFDQkJfYWRkX3U4KCZjYmIsIDIpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiBTaW5jZSB3ZSB3cm90ZSB0byB8Y2JifCwgfGNoaWxkfCBpcyBub3cgaW52YWxpZCBhbmQgYXR0ZW1wdHMgdG8gd3JpdGUgdG8KKyAgICogaXQgc2hvdWxkIGZhaWwuICovCisgIGlmIChDQkJfYWRkX3U4KCZjaGlsZCwgMSkgfHwKKyAgICAgIENCQl9hZGRfdTE2KCZjaGlsZCwgMSkgfHwKKyAgICAgIENCQl9hZGRfdTI0KCZjaGlsZCwgMSkgfHwKKyAgICAgIENCQl9hZGRfdThfbGVuZ3RoX3ByZWZpeGVkKCZjaGlsZCwgJmNvbnRlbnRzKSB8fAorICAgICAgQ0JCX2FkZF91MTZfbGVuZ3RoX3ByZWZpeGVkKCZjaGlsZCwgJmNvbnRlbnRzKSB8fAorICAgICAgQ0JCX2FkZF9hc24xKCZjaGlsZCwgJmNvbnRlbnRzLCAxKSB8fAorICAgICAgQ0JCX2FkZF9ieXRlcygmY2hpbGQsIChjb25zdCB1aW50OF90KikgImEiLCAxKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiQ0JCIG9wZXJhdGlvbiBvbiBpbnZhbGlkIENCQiBkaWQgbm90IGZhaWwuXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmICghQ0JCX2ZpbmlzaCgmY2JiLCAmYnVmLCAmYnVmX2xlbikgfHwKKyAgICAgIGJ1Zl9sZW4gIT0gMyB8fAorICAgICAgbWVtY21wKGJ1ZiwgIlx4MDFceDAxXHgwMiIsIDMpICE9IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGZyZWUoYnVmKTsKKworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCB0ZXN0X2NiYl9hc24xKCkgeworICBzdGF0aWMgY29uc3QgdWludDhfdCBrRXhwZWN0ZWRbXSA9IHsweDMwLCAzLCAxLCAyLCAzfTsKKyAgdWludDhfdCAqYnVmLCAqdGVzdF9kYXRhOworICBzaXplX3QgYnVmX2xlbjsKKyAgQ0JCIGNiYiwgY29udGVudHMsIGlubmVyX2NvbnRlbnRzOworCisgIGlmICghQ0JCX2luaXQoJmNiYiwgMCkgfHwKKyAgICAgICFDQkJfYWRkX2FzbjEoJmNiYiwgJmNvbnRlbnRzLCAweDMwKSB8fAorICAgICAgIUNCQl9hZGRfYnl0ZXMoJmNvbnRlbnRzLCAoY29uc3QgdWludDhfdCopICJceDAxXHgwMlx4MDMiLCAzKSB8fAorICAgICAgIUNCQl9maW5pc2goJmNiYiwgJmJ1ZiwgJmJ1Zl9sZW4pKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoYnVmX2xlbiAhPSBzaXplb2Yoa0V4cGVjdGVkKSB8fCBtZW1jbXAoYnVmLCBrRXhwZWN0ZWQsIGJ1Zl9sZW4pICE9IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBmcmVlKGJ1Zik7CisKKyAgdGVzdF9kYXRhID0gY2FsbG9jKDEsIDEwMDAwMCk7CisKKyAgaWYgKCFDQkJfaW5pdCgmY2JiLCAwKSB8fAorICAgICAgIUNCQl9hZGRfYXNuMSgmY2JiLCAmY29udGVudHMsIDB4MzApIHx8CisgICAgICAhQ0JCX2FkZF9ieXRlcygmY29udGVudHMsIHRlc3RfZGF0YSwgMTMwKSB8fAorICAgICAgIUNCQl9maW5pc2goJmNiYiwgJmJ1ZiwgJmJ1Zl9sZW4pKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoYnVmX2xlbiAhPSAzICsgMTMwIHx8IG1lbWNtcChidWYsICJceDMwXHg4MVx4ODIiLCAzKSAhPSAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZnJlZShidWYpOworCisgIGlmICghQ0JCX2luaXQoJmNiYiwgMCkgfHwKKyAgICAgICFDQkJfYWRkX2FzbjEoJmNiYiwgJmNvbnRlbnRzLCAweDMwKSB8fAorICAgICAgIUNCQl9hZGRfYnl0ZXMoJmNvbnRlbnRzLCB0ZXN0X2RhdGEsIDEwMDApIHx8CisgICAgICAhQ0JCX2ZpbmlzaCgmY2JiLCAmYnVmLCAmYnVmX2xlbikpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChidWZfbGVuICE9IDQgKyAxMDAwIHx8IG1lbWNtcChidWYsICJceDMwXHg4Mlx4MDNceGU4IiwgNCkgIT0gMCkgeworICAgIHJldHVybiAwOworICB9CisgIGZyZWUoYnVmKTsKKworICBpZiAoIUNCQl9pbml0KCZjYmIsIDApIHx8CisgICAgICAhQ0JCX2FkZF9hc24xKCZjYmIsICZjb250ZW50cywgMHgzMCkgfHwKKyAgICAgICFDQkJfYWRkX2FzbjEoJmNvbnRlbnRzLCAmaW5uZXJfY29udGVudHMsIDB4MzApIHx8CisgICAgICAhQ0JCX2FkZF9ieXRlcygmaW5uZXJfY29udGVudHMsIHRlc3RfZGF0YSwgMTAwMDAwKSB8fAorICAgICAgIUNCQl9maW5pc2goJmNiYiwgJmJ1ZiwgJmJ1Zl9sZW4pKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoYnVmX2xlbiAhPSA1ICsgNSArIDEwMDAwMCB8fAorICAgICAgbWVtY21wKGJ1ZiwgIlx4MzBceDgzXHgwMVx4ODZceGE1XHgzMFx4ODNceDAxXHg4Nlx4YTAiLCAxMCkgIT0gMCkgeworICAgIHJldHVybiAwOworICB9CisgIGZyZWUoYnVmKTsKKworICBmcmVlKHRlc3RfZGF0YSk7CisgIHJldHVybiAxOworfQorCitpbnQgbWFpbigpIHsKKyAgaWYgKCF0ZXN0X3NraXAoKSB8fAorICAgICAgIXRlc3RfZ2V0X3UoKSB8fAorICAgICAgIXRlc3RfZ2V0X3ByZWZpeGVkKCkgfHwKKyAgICAgICF0ZXN0X2dldF9wcmVmaXhlZF9iYWQoKSB8fAorICAgICAgIXRlc3RfZ2V0X2FzbjEoKSB8fAorICAgICAgIXRlc3RfZ2V0X2luZGVmKCkgfHwKKyAgICAgICF0ZXN0X2NiYl9iYXNpYygpIHx8CisgICAgICAhdGVzdF9jYmJfZml4ZWQoKSB8fAorICAgICAgIXRlc3RfY2JiX2ZpbmlzaF9jaGlsZCgpIHx8CisgICAgICAhdGVzdF9jYmJfbWlzdXNlKCkgfHwKKyAgICAgICF0ZXN0X2NiYl9wcmVmaXhlZCgpIHx8CisgICAgICAhdGVzdF9jYmJfYXNuMSgpKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBwcmludGYoIlBBU1NcbiIpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NyeXB0by9ieXRlc3RyaW5nL2NiYi5jIGIvY3J5cHRvL2J5dGVzdHJpbmcvY2JiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UzNWQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9ieXRlc3RyaW5nL2NiYi5jCkBAIC0wLDAgKzEsMzE3IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTQsIEdvb2dsZSBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2J5dGVzdHJpbmcuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisKKworc3RhdGljIGludCBjYmJfaW5pdChDQkIgKmNiYiwgdWludDhfdCAqYnVmLCBzaXplX3QgY2FwKSB7CisgIHN0cnVjdCBjYmJfYnVmZmVyX3N0ICpiYXNlOworCisgIGJhc2UgPSBPUEVOU1NMX21hbGxvYyhzaXplb2Yoc3RydWN0IGNiYl9idWZmZXJfc3QpKTsKKyAgaWYgKGJhc2UgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfZnJlZShidWYpOworICAgIHJldHVybiAwOworICB9CisKKyAgYmFzZS0+YnVmID0gYnVmOworICBiYXNlLT5sZW4gPSAwOworICBiYXNlLT5jYXAgPSBjYXA7CisgIGJhc2UtPmNhbl9yZXNpemUgPSAxOworCisgIG1lbXNldChjYmIsIDAsIHNpemVvZihDQkIpKTsKKyAgY2JiLT5iYXNlID0gYmFzZTsKKyAgY2JiLT5pc190b3BfbGV2ZWwgPSAxOworICByZXR1cm4gMTsKK30KKworaW50IENCQl9pbml0KENCQiAqY2JiLCBzaXplX3QgaW5pdGlhbF9jYXBhY2l0eSkgeworICB1aW50OF90ICpidWY7CisKKyAgYnVmID0gT1BFTlNTTF9tYWxsb2MoaW5pdGlhbF9jYXBhY2l0eSk7CisgIGlmIChpbml0aWFsX2NhcGFjaXR5ID4gMCAmJiBidWYgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgcmV0dXJuIGNiYl9pbml0KGNiYiwgYnVmLCBpbml0aWFsX2NhcGFjaXR5KTsKK30KKworaW50IENCQl9pbml0X2ZpeGVkKENCQiAqY2JiLCB1aW50OF90ICpidWYsIHNpemVfdCBsZW4pIHsKKyAgaWYgKCFjYmJfaW5pdChjYmIsIGJ1ZiwgbGVuKSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgY2JiLT5iYXNlLT5jYW5fcmVzaXplID0gMDsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgQ0JCX2NsZWFudXAoQ0JCICpjYmIpIHsKKyAgaWYgKGNiYi0+YmFzZSkgeworICAgIGlmIChjYmItPmJhc2UtPmJ1ZiAmJiBjYmItPmJhc2UtPmNhbl9yZXNpemUpIHsKKyAgICAgIE9QRU5TU0xfZnJlZShjYmItPmJhc2UtPmJ1Zik7CisgICAgfQorICAgIE9QRU5TU0xfZnJlZShjYmItPmJhc2UpOworICB9CisgIGNiYi0+YmFzZSA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgY2JiX2J1ZmZlcl9hZGQoc3RydWN0IGNiYl9idWZmZXJfc3QgKmJhc2UsIHVpbnQ4X3QgKipvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4pIHsKKyAgc2l6ZV90IG5ld2xlbjsKKworICBpZiAoYmFzZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBuZXdsZW4gPSBiYXNlLT5sZW4gKyBsZW47CisgIGlmIChuZXdsZW4gPCBiYXNlLT5sZW4pIHsKKyAgICAvKiBPdmVyZmxvdyAqLworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKG5ld2xlbiA+IGJhc2UtPmNhcCkgeworICAgIHNpemVfdCBuZXdjYXAgPSBiYXNlLT5jYXAgKiAyOworICAgIHVpbnQ4X3QgKm5ld2J1ZjsKKworICAgIGlmICghYmFzZS0+Y2FuX3Jlc2l6ZSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKG5ld2NhcCA8IGJhc2UtPmNhcCB8fCBuZXdjYXAgPCBuZXdsZW4pIHsKKyAgICAgIG5ld2NhcCA9IG5ld2xlbjsKKyAgICB9CisgICAgbmV3YnVmID0gT1BFTlNTTF9yZWFsbG9jKGJhc2UtPmJ1ZiwgbmV3Y2FwKTsKKyAgICBpZiAobmV3YnVmID09IE5VTEwpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGJhc2UtPmJ1ZiA9IG5ld2J1ZjsKKyAgICBiYXNlLT5jYXAgPSBuZXdjYXA7CisgIH0KKworICBpZiAob3V0KSB7CisgICAgKm91dCA9IGJhc2UtPmJ1ZiArIGJhc2UtPmxlbjsKKyAgfQorICBiYXNlLT5sZW4gPSBuZXdsZW47CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNiYl9idWZmZXJfYWRkX3Uoc3RydWN0IGNiYl9idWZmZXJfc3QgKmJhc2UsIHVpbnQzMl90IHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbl9sZW4pIHsKKyAgdWludDhfdCAqYnVmOworICBzaXplX3QgaTsKKworICBpZiAobGVuX2xlbiA9PSAwKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKCFjYmJfYnVmZmVyX2FkZChiYXNlLCAmYnVmLCBsZW5fbGVuKSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgZm9yIChpID0gbGVuX2xlbiAtIDE7IGkgPCBsZW5fbGVuOyBpLS0pIHsKKyAgICBidWZbaV0gPSB2OworICAgIHYgPj49IDg7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBDQkJfZmluaXNoKENCQiAqY2JiLCB1aW50OF90ICoqb3V0X2RhdGEsIHNpemVfdCAqb3V0X2xlbikgeworICBpZiAoIWNiYi0+aXNfdG9wX2xldmVsKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoIUNCQl9mbHVzaChjYmIpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAqb3V0X2RhdGEgPSBjYmItPmJhc2UtPmJ1ZjsKKyAgKm91dF9sZW4gPSBjYmItPmJhc2UtPmxlbjsKKyAgY2JiLT5iYXNlLT5idWYgPSBOVUxMOworICBDQkJfY2xlYW51cChjYmIpOworICByZXR1cm4gMTsKK30KKworLyogQ0JCX2ZsdXNoIHJlY3Vyc2VzIGFuZCB0aGVuIHdyaXRlcyBvdXQgYW55IHBlbmRpbmcgbGVuZ3RoIHByZWZpeC4gVGhlCisgKiBjdXJyZW50IGxlbmd0aCBvZiB0aGUgdW5kZXJseWluZyBiYXNlIGlzIHRha2VuIHRvIGJlIHRoZSBsZW5ndGggb2YgdGhlCisgKiBsZW5ndGgtcHJlZml4ZWQgZGF0YS4gKi8KK2ludCBDQkJfZmx1c2goQ0JCICpjYmIpIHsKKyAgc2l6ZV90IGNoaWxkX3N0YXJ0LCBpLCBsZW47CisKKyAgaWYgKGNiYi0+YmFzZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoY2JiLT5jaGlsZCA9PSBOVUxMIHx8IGNiYi0+cGVuZGluZ19sZW5fbGVuID09IDApIHsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGNoaWxkX3N0YXJ0ID0gY2JiLT5vZmZzZXQgKyBjYmItPnBlbmRpbmdfbGVuX2xlbjsKKworICBpZiAoIUNCQl9mbHVzaChjYmItPmNoaWxkKSB8fAorICAgICAgY2hpbGRfc3RhcnQgPCBjYmItPm9mZnNldCB8fAorICAgICAgY2JiLT5iYXNlLT5sZW4gPCBjaGlsZF9zdGFydCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgbGVuID0gY2JiLT5iYXNlLT5sZW4gLSBjaGlsZF9zdGFydDsKKworICBpZiAoY2JiLT5wZW5kaW5nX2lzX2FzbjEpIHsKKyAgICAvKiBGb3IgQVNOLjEgd2UgYXNzdW1lIHRoYXQgd2UnbGwgb25seSBuZWVkIGEgc2luZ2xlIGJ5dGUgZm9yIHRoZSBsZW5ndGguCisgICAgICogSWYgdGhhdCB0dXJuZWQgb3V0IHRvIGJlIGluY29ycmVjdCwgd2UgaGF2ZSB0byBtb3ZlIHRoZSBjb250ZW50cyBhbG9uZworICAgICAqIGluIG9yZGVyIHRvIG1ha2Ugc3BhY2UuICovCisgICAgc2l6ZV90IGxlbl9sZW47CisgICAgdWludDhfdCBpbml0aWFsX2xlbmd0aF9ieXRlOworCisgICAgaWYgKGxlbiA+IDB4ZmZmZmZmZmUpIHsKKyAgICAgIC8qIFRvbyBsYXJnZS4gKi8KKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSBpZiAobGVuID4gMHhmZmZmZmYpIHsKKyAgICAgIGxlbl9sZW4gPSA1OworICAgICAgaW5pdGlhbF9sZW5ndGhfYnl0ZSA9IDB4ODAgfCA0OworICAgIH0gZWxzZSBpZiAobGVuID4gMHhmZmZmKSB7CisgICAgICBsZW5fbGVuID0gNDsKKyAgICAgIGluaXRpYWxfbGVuZ3RoX2J5dGUgPSAweDgwIHwgMzsKKyAgICB9IGVsc2UgaWYgKGxlbiA+IDB4ZmYpIHsKKyAgICAgIGxlbl9sZW4gPSAzOworICAgICAgaW5pdGlhbF9sZW5ndGhfYnl0ZSA9IDB4ODAgfCAyOworICAgIH0gZWxzZSBpZiAobGVuID4gMHg3ZikgeworICAgICAgbGVuX2xlbiA9IDI7CisgICAgICBpbml0aWFsX2xlbmd0aF9ieXRlID0gMHg4MCB8IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIGxlbl9sZW4gPSAxOworICAgICAgaW5pdGlhbF9sZW5ndGhfYnl0ZSA9IGxlbjsKKyAgICAgIGxlbiA9IDA7CisgICAgfQorCisgICAgaWYgKGxlbl9sZW4gIT0gMSkgeworICAgICAgLyogV2UgbmVlZCB0byBtb3ZlIHRoZSBjb250ZW50cyBhbG9uZyBpbiBvcmRlciB0byBtYWtlIHNwYWNlLiAqLworICAgICAgc2l6ZV90IGV4dHJhX2J5dGVzID0gbGVuX2xlbiAtIDE7CisgICAgICBpZiAoIWNiYl9idWZmZXJfYWRkKGNiYi0+YmFzZSwgTlVMTCwgZXh0cmFfYnl0ZXMpKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgbWVtbW92ZShjYmItPmJhc2UtPmJ1ZiArIGNiYi0+b2Zmc2V0ICsgZXh0cmFfYnl0ZXMsCisgICAgICAgICAgICAgIGNiYi0+YmFzZS0+YnVmICsgY2JiLT5vZmZzZXQsIGxlbik7CisgICAgfQorICAgIGNiYi0+YmFzZS0+YnVmW2NiYi0+b2Zmc2V0KytdID0gaW5pdGlhbF9sZW5ndGhfYnl0ZTsKKyAgICBjYmItPnBlbmRpbmdfbGVuX2xlbiA9IGxlbl9sZW4gLSAxOworICB9CisKKyAgZm9yIChpID0gY2JiLT5wZW5kaW5nX2xlbl9sZW4gLSAxOyBpIDwgY2JiLT5wZW5kaW5nX2xlbl9sZW47IGktLSkgeworICAgIGNiYi0+YmFzZS0+YnVmW2NiYi0+b2Zmc2V0ICsgaV0gPSBsZW47CisgICAgbGVuID4+PSA4OworICB9CisgIGlmIChsZW4gIT0gMCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgY2JiLT5jaGlsZC0+YmFzZSA9IE5VTEw7CisgIGNiYi0+Y2hpbGQgPSBOVUxMOworICBjYmItPnBlbmRpbmdfbGVuX2xlbiA9IDA7CisgIGNiYi0+cGVuZGluZ19pc19hc24xID0gMDsKKyAgY2JiLT5vZmZzZXQgPSAwOworCisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgY2JiX2FkZF9sZW5ndGhfcHJlZml4ZWQoQ0JCICpjYmIsIENCQiAqb3V0X2NvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuX2xlbikgeworICB1aW50OF90ICpwcmVmaXhfYnl0ZXM7CisKKyAgaWYgKCFDQkJfZmx1c2goY2JiKSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgY2JiLT5vZmZzZXQgPSBjYmItPmJhc2UtPmxlbjsKKyAgaWYgKCFjYmJfYnVmZmVyX2FkZChjYmItPmJhc2UsICZwcmVmaXhfYnl0ZXMsIGxlbl9sZW4pKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBtZW1zZXQocHJlZml4X2J5dGVzLCAwLCBsZW5fbGVuKTsKKyAgbWVtc2V0KG91dF9jb250ZW50cywgMCwgc2l6ZW9mKENCQikpOworICBvdXRfY29udGVudHMtPmJhc2UgPSBjYmItPmJhc2U7CisgIGNiYi0+Y2hpbGQgPSBvdXRfY29udGVudHM7CisgIGNiYi0+cGVuZGluZ19sZW5fbGVuID0gbGVuX2xlbjsKKyAgY2JiLT5wZW5kaW5nX2lzX2FzbjEgPSAwOworCisgIHJldHVybiAxOworfQorCitpbnQgQ0JCX2FkZF91OF9sZW5ndGhfcHJlZml4ZWQoQ0JCICpjYmIsIENCQiAqb3V0X2NvbnRlbnRzKSB7CisgIHJldHVybiBjYmJfYWRkX2xlbmd0aF9wcmVmaXhlZChjYmIsIG91dF9jb250ZW50cywgMSk7Cit9CisKK2ludCBDQkJfYWRkX3UxNl9sZW5ndGhfcHJlZml4ZWQoQ0JCICpjYmIsIENCQiAqb3V0X2NvbnRlbnRzKSB7CisgIHJldHVybiBjYmJfYWRkX2xlbmd0aF9wcmVmaXhlZChjYmIsIG91dF9jb250ZW50cywgMik7Cit9CisKK2ludCBDQkJfYWRkX3UyNF9sZW5ndGhfcHJlZml4ZWQoQ0JCICpjYmIsIENCQiAqb3V0X2NvbnRlbnRzKSB7CisgIHJldHVybiBjYmJfYWRkX2xlbmd0aF9wcmVmaXhlZChjYmIsIG91dF9jb250ZW50cywgMyk7Cit9CisKK2ludCBDQkJfYWRkX2FzbjEoQ0JCICpjYmIsIENCQiAqb3V0X2NvbnRlbnRzLCB1aW50OF90IHRhZykgeworICBpZiAoIUNCQl9mbHVzaChjYmIpIHx8CisgICAgICAhQ0JCX2FkZF91OChjYmIsIHRhZykpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGNiYi0+b2Zmc2V0ID0gY2JiLT5iYXNlLT5sZW47CisgIGlmICghQ0JCX2FkZF91OChjYmIsIDApKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBtZW1zZXQob3V0X2NvbnRlbnRzLCAwLCBzaXplb2YoQ0JCKSk7CisgIG91dF9jb250ZW50cy0+YmFzZSA9IGNiYi0+YmFzZTsKKyAgY2JiLT5jaGlsZCA9IG91dF9jb250ZW50czsKKyAgY2JiLT5wZW5kaW5nX2xlbl9sZW4gPSAxOworICBjYmItPnBlbmRpbmdfaXNfYXNuMSA9IDE7CisKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBDQkJfYWRkX2J5dGVzKENCQiAqY2JiLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgbGVuKSB7CisgIHVpbnQ4X3QgKmRlc3Q7CisKKyAgaWYgKCFDQkJfZmx1c2goY2JiKSB8fAorICAgICAgIWNiYl9idWZmZXJfYWRkKGNiYi0+YmFzZSwgJmRlc3QsIGxlbikpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBtZW1jcHkoZGVzdCwgZGF0YSwgbGVuKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBDQkJfYWRkX3U4KENCQiAqY2JiLCB1aW50OF90IHZhbHVlKSB7CisgIGlmICghQ0JCX2ZsdXNoKGNiYikpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiBjYmJfYnVmZmVyX2FkZF91KGNiYi0+YmFzZSwgdmFsdWUsIDEpOworfQorCitpbnQgQ0JCX2FkZF91MTYoQ0JCICpjYmIsIHVpbnQxNl90IHZhbHVlKSB7CisgIGlmICghQ0JCX2ZsdXNoKGNiYikpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiBjYmJfYnVmZmVyX2FkZF91KGNiYi0+YmFzZSwgdmFsdWUsIDIpOworfQorCitpbnQgQ0JCX2FkZF91MjQoQ0JCICpjYmIsIHVpbnQzMl90IHZhbHVlKSB7CisgIGlmICghQ0JCX2ZsdXNoKGNiYikpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiBjYmJfYnVmZmVyX2FkZF91KGNiYi0+YmFzZSwgdmFsdWUsIDMpOworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2J5dGVzdHJpbmcvY2JzLmMgYi9jcnlwdG8vYnl0ZXN0cmluZy9jYnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWI4YTc0Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2J5dGVzdHJpbmcvY2JzLmMKQEAgLTAsMCArMSwyNjMgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNCwgR29vZ2xlIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYnl0ZXN0cmluZy5oPgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKwordm9pZCBDQlNfaW5pdChDQlMgKmNicywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGxlbikgeworICBjYnMtPmRhdGEgPSBkYXRhOworICBjYnMtPmxlbiA9IGxlbjsKK30KKworc3RhdGljIGludCBjYnNfZ2V0KENCUyAqY2JzLCBjb25zdCB1aW50OF90ICoqcCwgc2l6ZV90IG4pIHsKKyAgaWYgKGNicy0+bGVuIDwgbikgeworICAgIHJldHVybiAwOworICB9CisKKyAgKnAgPSBjYnMtPmRhdGE7CisgIGNicy0+ZGF0YSArPSBuOworICBjYnMtPmxlbiAtPSBuOworICByZXR1cm4gMTsKK30KKworaW50IENCU19za2lwKENCUyAqY2JzLCBzaXplX3QgbGVuKSB7CisgIGNvbnN0IHVpbnQ4X3QgKmR1bW15OworICByZXR1cm4gY2JzX2dldChjYnMsICZkdW1teSwgbGVuKTsKK30KKworY29uc3QgdWludDhfdCAqQ0JTX2RhdGEoY29uc3QgQ0JTICpjYnMpIHsKKyAgcmV0dXJuIGNicy0+ZGF0YTsKK30KKworc2l6ZV90IENCU19sZW4oY29uc3QgQ0JTICpjYnMpIHsKKyAgcmV0dXJuIGNicy0+bGVuOworfQorCitzdGF0aWMgaW50IGNic19nZXRfdShDQlMgKmNicywgdWludDMyX3QgKm91dCwgc2l6ZV90IGxlbikgeworICB1aW50MzJfdCByZXN1bHQgPSAwOworICBzaXplX3QgaTsKKyAgY29uc3QgdWludDhfdCAqZGF0YTsKKworICBpZiAoIWNic19nZXQoY2JzLCAmZGF0YSwgbGVuKSkgeworICAgIHJldHVybiAwOworICB9CisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgIHJlc3VsdCA8PD0gODsKKyAgICByZXN1bHQgfD0gZGF0YVtpXTsKKyAgfQorICAqb3V0ID0gcmVzdWx0OworICByZXR1cm4gMTsKK30KKworaW50IENCU19nZXRfdTgoQ0JTICpjYnMsIHVpbnQ4X3QgKm91dCkgeworICBjb25zdCB1aW50OF90ICp2OworICBpZiAoIWNic19nZXQoY2JzLCAmdiwgMSkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICAqb3V0ID0gKnY7CisgIHJldHVybiAxOworfQorCitpbnQgQ0JTX2dldF91MTYoQ0JTICpjYnMsIHVpbnQxNl90ICpvdXQpIHsKKyAgdWludDMyX3QgdjsKKyAgaWYgKCFjYnNfZ2V0X3UoY2JzLCAmdiwgMikpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICAqb3V0ID0gdjsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBDQlNfZ2V0X3UyNChDQlMgKmNicywgdWludDMyX3QgKm91dCkgeworICByZXR1cm4gY2JzX2dldF91KGNicywgb3V0LCAzKTsKK30KKworaW50IENCU19nZXRfdTMyKENCUyAqY2JzLCB1aW50MzJfdCAqb3V0KSB7CisgIHJldHVybiBjYnNfZ2V0X3UoY2JzLCBvdXQsIDQpOworfQorCitpbnQgQ0JTX2dldF9ieXRlcyhDQlMgKmNicywgQ0JTICpvdXQsIHNpemVfdCBsZW4pIHsKKyAgY29uc3QgdWludDhfdCAqdjsKKyAgaWYgKCFjYnNfZ2V0KGNicywgJnYsIGxlbikpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBDQlNfaW5pdChvdXQsIHYsIGxlbik7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNic19nZXRfbGVuZ3RoX3ByZWZpeGVkKENCUyAqY2JzLCBDQlMgKm91dCwgc2l6ZV90IGxlbl9sZW4pIHsKKyAgdWludDMyX3QgbGVuOworICBpZiAoIWNic19nZXRfdShjYnMsICZsZW4sIGxlbl9sZW4pKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIENCU19nZXRfYnl0ZXMoY2JzLCBvdXQsIGxlbik7Cit9CisKK2ludCBDQlNfZ2V0X3U4X2xlbmd0aF9wcmVmaXhlZChDQlMgKmNicywgQ0JTICpvdXQpIHsKKyAgcmV0dXJuIGNic19nZXRfbGVuZ3RoX3ByZWZpeGVkKGNicywgb3V0LCAxKTsKK30KKworaW50IENCU19nZXRfdTE2X2xlbmd0aF9wcmVmaXhlZChDQlMgKmNicywgQ0JTICpvdXQpIHsKKyAgcmV0dXJuIGNic19nZXRfbGVuZ3RoX3ByZWZpeGVkKGNicywgb3V0LCAyKTsKK30KKworaW50IENCU19nZXRfdTI0X2xlbmd0aF9wcmVmaXhlZChDQlMgKmNicywgQ0JTICpvdXQpIHsKKyAgcmV0dXJuIGNic19nZXRfbGVuZ3RoX3ByZWZpeGVkKGNicywgb3V0LCAzKTsKK30KKworc3RhdGljIGludCBjYnNfZ2V0X2FzbjFfZWxlbWVudChDQlMgKmNicywgQ0JTICpvdXQsIHVuc2lnbmVkICpvdXRfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm91dF9oZWFkZXJfbGVuLCB1bnNpZ25lZCBkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp3YXNfaW5kZWZpbml0ZV9sZW4pOworCisvKiBjYnNfZ2V0X2FzbjFfaW5kZWZpbml0ZV9sZW4gc2V0cyB8Km91dHwgdG8gYmUgYSBDQlMgdGhhdCBjb3ZlcnMgYW4KKyAqIGluZGVmaW5pdGUgbGVuZ3RoIGVsZW1lbnQgaW4gfGNic3wgYW5kIGFkdmFuY2VzIHwqaW58LiBPbiBlbnRyeSwgfGNic3wgd2lsbAorICogbm90IGhhdmUgaGFkIHRoZSB0YWcgYW5kIGxlbmd0aCBieXRlIHJlbW92ZWQuIE9uIGV4aXQsIHwqb3V0fCBkb2VzIG5vdCBjb3ZlcgorICogdGhlIEVPQyBlbGVtZW50LCBidXQgfCppbnwgaXMgc2tpcHBlZCBvdmVyIGl0LgorICoKKyAqIFRoZSB8ZGVwdGh8IGFyZ3VtZW50IGNvdW50cyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBjb2RlIGhhcyByZWN1cnNlZCB0cnlpbmcKKyAqIHRvIGZpbmQgYW4gaW5kZWZpbml0ZSBsZW5ndGguICovCitzdGF0aWMgaW50IGNic19nZXRfYXNuMV9pbmRlZmluaXRlX2xlbihDQlMgKmluLCBDQlMgKm91dCwgdW5zaWduZWQgZGVwdGgpIHsKKyAgc3RhdGljIGNvbnN0IHNpemVfdCBrRU9DTGVuZ3RoID0gMjsKKyAgc2l6ZV90IGhlYWRlcl9sZW47CisgIHVuc2lnbmVkIHRhZzsKKyAgaW50IHdhc19pbmRlZmluaXRlX2xlbjsKKyAgQ0JTIG9yaWcgPSAqaW4sIGNoaWxkOworCisgIGlmICghQ0JTX3NraXAoaW4sIDIgLyogdGFnIHBsdXMgMHg4MCBieXRlIGZvciBpbmRlZmluaXRlIGxlbiAqLykpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGZvciAoOzspIHsKKyAgICBpZiAoIWNic19nZXRfYXNuMV9lbGVtZW50KGluLCAmY2hpbGQsICZ0YWcsICZoZWFkZXJfbGVuLCBkZXB0aCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzX2luZGVmaW5pdGVfbGVuKSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKCF3YXNfaW5kZWZpbml0ZV9sZW4gJiYgQ0JTX2xlbigmY2hpbGQpID09IGtFT0NMZW5ndGggJiYKKyAgICAgICAgaGVhZGVyX2xlbiA9PSBrRU9DTGVuZ3RoICYmIHRhZyA9PSAwKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICByZXR1cm4gQ0JTX2dldF9ieXRlcygmb3JpZywgb3V0LCBDQlNfbGVuKCZvcmlnKSAtIENCU19sZW4oaW4pIC0ga0VPQ0xlbmd0aCk7Cit9CisKKy8qIE1BWF9ERVBUSCB0aGUgbWF4aW11bSBudW1iZXIgb2YgbGV2ZWxzIG9mIGluZGVmaW5pdGUgbGVuZ3RocyB0aGF0IHdlJ2xsCisgKiBzdXBwb3J0LiAqLworI2RlZmluZSBNQVhfREVQVEggNjQKKworc3RhdGljIGludCBjYnNfZ2V0X2FzbjFfZWxlbWVudChDQlMgKmNicywgQ0JTICpvdXQsIHVuc2lnbmVkICpvdXRfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm91dF9oZWFkZXJfbGVuLCB1bnNpZ25lZCBkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp3YXNfaW5kZWZpbml0ZV9sZW4pIHsKKyAgdWludDhfdCB0YWcsIGxlbmd0aF9ieXRlOworICBDQlMgaGVhZGVyID0gKmNiczsKKyAgaWYgKCFDQlNfZ2V0X3U4KCZoZWFkZXIsICZ0YWcpIHx8CisgICAgICAhQ0JTX2dldF91OCgmaGVhZGVyLCAmbGVuZ3RoX2J5dGUpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoKHRhZyAmIDB4MWYpID09IDB4MWYpIHsKKyAgICAvKiBMb25nIGZvcm0gdGFncyBhcmUgbm90IHN1cHBvcnRlZC4gKi8KKyAgICByZXR1cm4gMDsKKyAgfQorCisgICpvdXRfdGFnID0gdGFnOworICBpZiAod2FzX2luZGVmaW5pdGVfbGVuKSB7CisgICAgKndhc19pbmRlZmluaXRlX2xlbiA9IDA7CisgIH0KKworICBzaXplX3QgbGVuOworICBpZiAoKGxlbmd0aF9ieXRlICYgMHg4MCkgPT0gMCkgeworICAgIC8qIFNob3J0IGZvcm0gbGVuZ3RoLiAqLworICAgIGxlbiA9ICgoc2l6ZV90KSBsZW5ndGhfYnl0ZSkgKyAyOworICAgICpvdXRfaGVhZGVyX2xlbiA9IDI7CisgIH0gZWxzZSB7CisgICAgLyogTG9uZyBmb3JtIGxlbmd0aC4gKi8KKyAgICBjb25zdCBzaXplX3QgbnVtX2J5dGVzID0gbGVuZ3RoX2J5dGUgJiAweDdmOworICAgIHVpbnQzMl90IGxlbjMyOworCisgICAgaWYgKGRlcHRoIDwgTUFYX0RFUFRIICYmIG51bV9ieXRlcyA9PSAwKSB7CisgICAgICAvKiBpbmRlZmluaXRlIGxlbmd0aCAqLworICAgICAgKm91dF9oZWFkZXJfbGVuID0gMjsKKyAgICAgIGlmICh3YXNfaW5kZWZpbml0ZV9sZW4pIHsKKyAgICAgICAgKndhc19pbmRlZmluaXRlX2xlbiA9IDE7CisgICAgICB9CisgICAgICByZXR1cm4gY2JzX2dldF9hc24xX2luZGVmaW5pdGVfbGVuKGNicywgb3V0LCBkZXB0aCk7CisgICAgfQorCisgICAgaWYgKG51bV9ieXRlcyA9PSAwIHx8IG51bV9ieXRlcyA+IDQpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoIWNic19nZXRfdSgmaGVhZGVyLCAmbGVuMzIsIG51bV9ieXRlcykpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAobGVuMzIgPCAxMjgpIHsKKyAgICAgIC8qIExlbmd0aCBzaG91bGQgaGF2ZSB1c2VkIHNob3J0LWZvcm0gZW5jb2RpbmcuICovCisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKChsZW4zMiA+PiAoKG51bV9ieXRlcy0xKSo4KSkgPT0gMCkgeworICAgICAgLyogTGVuZ3RoIHNob3VsZCBoYXZlIGJlZW4gYXQgbGVhc3Qgb25lIGJ5dGUgc2hvcnRlci4gKi8KKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBsZW4gPSBsZW4zMjsKKyAgICBpZiAobGVuICsgMiArIG51bV9ieXRlcyA8IGxlbikgeworICAgICAgLyogT3ZlcmZsb3cuICovCisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgbGVuICs9IDIgKyBudW1fYnl0ZXM7CisgICAgKm91dF9oZWFkZXJfbGVuID0gMiArIG51bV9ieXRlczsKKyAgfQorCisgIHJldHVybiBDQlNfZ2V0X2J5dGVzKGNicywgb3V0LCBsZW4pOworfQorCitzdGF0aWMgaW50IGNic19nZXRfYXNuMShDQlMgKmNicywgQ0JTICpvdXQsIHVuc2lnbmVkIHRhZ192YWx1ZSwgaW50IGJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBza2lwX2hlYWRlcikgeworICBzaXplX3QgaGVhZGVyX2xlbjsKKyAgdW5zaWduZWQgdGFnOworICBDQlMgdGhyb3dhd2F5OworCisgIGlmIChvdXQgPT0gTlVMTCkgeworICAgIG91dCA9ICZ0aHJvd2F3YXk7CisgIH0KKworICBpZiAoIWNic19nZXRfYXNuMV9lbGVtZW50KGNicywgb3V0LCAmdGFnLCAmaGVhZGVyX2xlbiwgYmVyID8gMCA6IE1BWF9ERVBUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSB8fAorICAgICAgdGFnICE9IHRhZ192YWx1ZSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKHNraXBfaGVhZGVyICYmICFDQlNfc2tpcChvdXQsIGhlYWRlcl9sZW4pKSB7CisgICAgYXNzZXJ0KDApOworICAgIHJldHVybiAwOworICB9CisKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBDQlNfZ2V0X2FzbjEoQ0JTICpjYnMsIENCUyAqb3V0LCB1bnNpZ25lZCB0YWdfdmFsdWUpIHsKKyAgcmV0dXJuIGNic19nZXRfYXNuMShjYnMsIG91dCwgdGFnX3ZhbHVlLCAwIC8qIERFUiAqLywKKyAgICAgICAgICAgICAgICAgICAgICAxIC8qIHNraXAgaGVhZGVyICovKTsKK30KKworaW50IENCU19nZXRfYXNuMV9iZXIoQ0JTICpjYnMsIENCUyAqb3V0LCB1bnNpZ25lZCB0YWdfdmFsdWUpIHsKKyAgcmV0dXJuIGNic19nZXRfYXNuMShjYnMsIG91dCwgdGFnX3ZhbHVlLCAxIC8qIEJFUiAqLywKKyAgICAgICAgICAgICAgICAgICAgICAxIC8qIHNraXAgaGVhZGVyICovKTsKK30KKworaW50IENCU19nZXRfYXNuMV9lbGVtZW50KENCUyAqY2JzLCBDQlMgKm91dCwgdW5zaWduZWQgdGFnX3ZhbHVlKSB7CisgIHJldHVybiBjYnNfZ2V0X2FzbjEoY2JzLCBvdXQsIHRhZ192YWx1ZSwgMCAvKiBERVIgKi8sCisgICAgICAgICAgICAgICAgICAgICAgMCAvKiBpbmNsdWRlIGhlYWRlciAqLyk7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vY2lwaGVyL0NNYWtlTGlzdHMudHh0IGIvY3J5cHRvL2NpcGhlci9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWE1Zjg3Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2NpcGhlci9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDI0IEBACitpbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKKworYWRkX2xpYnJhcnkoCisJY2lwaGVyCisKKwlPQkpFQ1QKKworCWNpcGhlci5jCisJY2lwaGVyX2Vycm9yLmMKKwlkZXJpdmVfa2V5LmMKKworCWVfbnVsbC5jCisJZV9yYzQuYworCWVfZGVzLmMKKwllX2Flcy5jCispCisKK2FkZF9leGVjdXRhYmxlKAorCWNpcGhlcl90ZXN0CisKKwljaXBoZXJfdGVzdC5jCispCisKK3RhcmdldF9saW5rX2xpYnJhcmllcyhjaXBoZXJfdGVzdCBjcnlwdG8pCmRpZmYgLS1naXQgYS9jcnlwdG8vY2lwaGVyL2NpcGhlci5jIGIvY3J5cHRvL2NpcGhlci9jaXBoZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjVjNTU5Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2NpcGhlci9jaXBoZXIuYwpAQCAtMCwwICsxLDU5NiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvY2lwaGVyLmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgorCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworCitjb25zdCBFVlBfQ0lQSEVSICpFVlBfZ2V0X2NpcGhlcmJ5bmlkKGludCBuaWQpIHsKKyAgc3dpdGNoIChuaWQpIHsKKyAgICBjYXNlIE5JRF9kZXNfZWRlM19jYmM6CisgICAgICByZXR1cm4gRVZQX2Rlc19lZGUzX2NiYygpOworICAgIGNhc2UgTklEX2Rlc19lZGVfY2JjOgorICAgICAgcmV0dXJuIEVWUF9kZXNfY2JjKCk7CisgICAgY2FzZSBOSURfYWVzXzEyOF9jYmM6CisgICAgICByZXR1cm4gRVZQX2Flc18xMjhfY2JjKCk7CisgICAgY2FzZSBOSURfYWVzXzI1Nl9jYmM6CisgICAgICByZXR1cm4gRVZQX2Flc18yNTZfY2JjKCk7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3ZvaWQgRVZQX0NJUEhFUl9DVFhfaW5pdChFVlBfQ0lQSEVSX0NUWCAqY3R4KSB7CisgIG1lbXNldChjdHgsIDAsIHNpemVvZihFVlBfQ0lQSEVSX0NUWCkpOworfQorCitFVlBfQ0lQSEVSX0NUWCAqRVZQX0NJUEhFUl9DVFhfbmV3KHZvaWQpIHsKKyAgRVZQX0NJUEhFUl9DVFggKmN0eCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihFVlBfQ0lQSEVSX0NUWCkpOworICBpZiAoY3R4KSB7CisgICAgRVZQX0NJUEhFUl9DVFhfaW5pdChjdHgpOworICB9CisgIHJldHVybiBjdHg7Cit9CisKK2ludCBFVlBfQ2lwaGVySW5pdChFVlBfQ0lQSEVSX0NUWCAqY3R4LCBjb25zdCBFVlBfQ0lQSEVSICpjaXBoZXIsCisgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBjb25zdCB1bnNpZ25lZCBjaGFyICppdiwgaW50IGVuYykgeworICBpZiAoY2lwaGVyKSB7CisgICAgRVZQX0NJUEhFUl9DVFhfaW5pdChjdHgpOworICB9CisgIHJldHVybiBFVlBfQ2lwaGVySW5pdF9leChjdHgsIGNpcGhlciwgTlVMTCwga2V5LCBpdiwgZW5jKTsKK30KKworaW50IEVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoRVZQX0NJUEhFUl9DVFggKmMpIHsKKyAgaWYgKGMtPmNpcGhlciAhPSBOVUxMICYmIGMtPmNpcGhlci0+Y2xlYW51cCAmJiAhYy0+Y2lwaGVyLT5jbGVhbnVwKGMpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoYy0+Y2lwaGVyX2RhdGEpIHsKKyAgICBPUEVOU1NMX2NsZWFuc2UoYy0+Y2lwaGVyX2RhdGEsIGMtPmNpcGhlci0+Y3R4X3NpemUpOworICAgIE9QRU5TU0xfZnJlZShjLT5jaXBoZXJfZGF0YSk7CisgIH0KKworICBtZW1zZXQoYywgMCwgc2l6ZW9mKEVWUF9DSVBIRVJfQ1RYKSk7CisgIHJldHVybiAxOworfQorCit2b2lkIEVWUF9DSVBIRVJfQ1RYX2ZyZWUoRVZQX0NJUEhFUl9DVFggKmN0eCkgeworICBpZiAoY3R4KSB7CisgICAgRVZQX0NJUEhFUl9DVFhfY2xlYW51cChjdHgpOworICAgIE9QRU5TU0xfZnJlZShjdHgpOworICB9Cit9CisKK2ludCBFVlBfQ0lQSEVSX0NUWF9jb3B5KEVWUF9DSVBIRVJfQ1RYICpvdXQsIGNvbnN0IEVWUF9DSVBIRVJfQ1RYICppbikgeworICBpZiAoaW4gPT0gTlVMTCB8fCBpbi0+Y2lwaGVyID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIEVWUF9DSVBIRVJfQ1RYX2NvcHksIENJUEhFUl9SX0lOUFVUX05PVF9JTklUSUFMSVpFRCk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKG91dCk7CisgIG1lbWNweShvdXQsIGluLCBzaXplb2YoRVZQX0NJUEhFUl9DVFgpKTsKKworICBpZiAoaW4tPmNpcGhlcl9kYXRhICYmIGluLT5jaXBoZXItPmN0eF9zaXplKSB7CisgICAgb3V0LT5jaXBoZXJfZGF0YSA9IE9QRU5TU0xfbWFsbG9jKGluLT5jaXBoZXItPmN0eF9zaXplKTsKKyAgICBpZiAoIW91dC0+Y2lwaGVyX2RhdGEpIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgRVZQX0NJUEhFUl9DVFhfY29weSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIG1lbWNweShvdXQtPmNpcGhlcl9kYXRhLCBpbi0+Y2lwaGVyX2RhdGEsIGluLT5jaXBoZXItPmN0eF9zaXplKTsKKyAgfQorCisgIHJldHVybiAxOworfQorCitpbnQgRVZQX0NpcGhlckluaXRfZXgoRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyLAorICAgICAgICAgICAgICAgICAgICAgIEVOR0lORSAqZW5naW5lLCBjb25zdCB1aW50OF90ICprZXksIGNvbnN0IHVpbnQ4X3QgKml2LAorICAgICAgICAgICAgICAgICAgICAgIGludCBlbmMpIHsKKyAgaWYgKGVuYyA9PSAtMSkgeworICAgIGVuYyA9IGN0eC0+ZW5jcnlwdDsKKyAgfSBlbHNlIHsKKyAgICBpZiAoZW5jKSB7CisgICAgICBlbmMgPSAxOworICAgIH0KKyAgICBjdHgtPmVuY3J5cHQgPSBlbmM7CisgIH0KKworICBpZiAoY2lwaGVyKSB7CisgICAgLyogRW5zdXJlIGEgY29udGV4dCBsZWZ0IGZyb20gbGFzdCB0aW1lIGlzIGNsZWFyZWQgKHRoZSBwcmV2aW91cyBjaGVjaworICAgICAqIGF0dGVtcHRlZCB0byBhdm9pZCB0aGlzIGlmIHRoZSBzYW1lIEVOR0lORSBhbmQgRVZQX0NJUEhFUiBjb3VsZCBiZQorICAgICAqIHVzZWQpLiAqLworICAgIGlmIChjdHgtPmNpcGhlcikgeworICAgICAgRVZQX0NJUEhFUl9DVFhfY2xlYW51cChjdHgpOworICAgICAgLyogUmVzdG9yZSBlbmNyeXB0IGFuZCBmbGFncyAqLworICAgICAgY3R4LT5lbmNyeXB0ID0gZW5jOworICAgIH0KKworICAgIGN0eC0+Y2lwaGVyID0gY2lwaGVyOworICAgIGlmIChjdHgtPmNpcGhlci0+Y3R4X3NpemUpIHsKKyAgICAgIGN0eC0+Y2lwaGVyX2RhdGEgPSBPUEVOU1NMX21hbGxvYyhjdHgtPmNpcGhlci0+Y3R4X3NpemUpOworICAgICAgaWYgKCFjdHgtPmNpcGhlcl9kYXRhKSB7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgRVZQX0NpcGhlckluaXRfZXgsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGN0eC0+Y2lwaGVyX2RhdGEgPSBOVUxMOworICAgIH0KKworICAgIGN0eC0+a2V5X2xlbiA9IGNpcGhlci0+a2V5X2xlbjsKKyAgICBjdHgtPmZsYWdzID0gMDsKKworICAgIGlmIChjdHgtPmNpcGhlci0+ZmxhZ3MgJiBFVlBfQ0lQSF9DVFJMX0lOSVQpIHsKKyAgICAgIGlmICghRVZQX0NJUEhFUl9DVFhfY3RybChjdHgsIEVWUF9DVFJMX0lOSVQsIDAsIE5VTEwpKSB7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgRVZQX0NpcGhlckluaXRfZXgsIENJUEhFUl9SX0lOSVRJQUxJWkFUSU9OX0VSUk9SKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgaWYgKCFjdHgtPmNpcGhlcikgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgRVZQX0NpcGhlckluaXRfZXgsIENJUEhFUl9SX05PX0NJUEhFUl9TRVQpOworICAgIHJldHVybiAwOworICB9CisKKyAgLyogd2UgYXNzdW1lIGJsb2NrIHNpemUgaXMgYSBwb3dlciBvZiAyIGluICpjcnlwdFVwZGF0ZSAqLworICBhc3NlcnQoY3R4LT5jaXBoZXItPmJsb2NrX3NpemUgPT0gMSB8fCBjdHgtPmNpcGhlci0+YmxvY2tfc2l6ZSA9PSA4IHx8CisgICAgICAgICBjdHgtPmNpcGhlci0+YmxvY2tfc2l6ZSA9PSAxNik7CisKKyAgaWYgKCEoRVZQX0NJUEhFUl9DVFhfZmxhZ3MoY3R4KSAmIEVWUF9DSVBIX0NVU1RPTV9JVikpIHsKKyAgICBzd2l0Y2ggKEVWUF9DSVBIRVJfQ1RYX21vZGUoY3R4KSkgeworICAgICAgY2FzZSBFVlBfQ0lQSF9TVFJFQU1fQ0lQSEVSOgorICAgICAgY2FzZSBFVlBfQ0lQSF9FQ0JfTU9ERToKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRVZQX0NJUEhfQ0ZCX01PREU6CisgICAgICBjYXNlIEVWUF9DSVBIX09GQl9NT0RFOgorICAgICAgICBjdHgtPm51bSA9IDA7CisgICAgICAgIC8qIGZhbGwtdGhyb3VnaCAqLworCisgICAgICBjYXNlIEVWUF9DSVBIX0NCQ19NT0RFOgorICAgICAgICBhc3NlcnQoRVZQX0NJUEhFUl9DVFhfaXZfbGVuZ3RoKGN0eCkgPD0gc2l6ZW9mKGN0eC0+aXYpKTsKKyAgICAgICAgaWYgKGl2KSB7CisgICAgICAgICAgbWVtY3B5KGN0eC0+b2l2LCBpdiwgRVZQX0NJUEhFUl9DVFhfaXZfbGVuZ3RoKGN0eCkpOworICAgICAgICB9CisgICAgICAgIG1lbWNweShjdHgtPml2LCBjdHgtPm9pdiwgRVZQX0NJUEhFUl9DVFhfaXZfbGVuZ3RoKGN0eCkpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBFVlBfQ0lQSF9DVFJfTU9ERToKKyAgICAgICAgY3R4LT5udW0gPSAwOworICAgICAgICAvKiBEb24ndCByZXVzZSBJViBmb3IgQ1RSIG1vZGUgKi8KKyAgICAgICAgaWYgKGl2KSB7CisgICAgICAgICAgbWVtY3B5KGN0eC0+aXYsIGl2LCBFVlBfQ0lQSEVSX0NUWF9pdl9sZW5ndGgoY3R4KSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIGlmIChrZXkgfHwgKGN0eC0+Y2lwaGVyLT5mbGFncyAmIEVWUF9DSVBIX0FMV0FZU19DQUxMX0lOSVQpKSB7CisgICAgaWYgKCFjdHgtPmNpcGhlci0+aW5pdChjdHgsIGtleSwgaXYsIGVuYykpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIGN0eC0+YnVmX2xlbiA9IDA7CisgIGN0eC0+ZmluYWxfdXNlZCA9IDA7CisgIGN0eC0+YmxvY2tfbWFzayA9IGN0eC0+Y2lwaGVyLT5ibG9ja19zaXplIC0gMTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBFVlBfRW5jcnlwdEluaXRfZXgoRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyLAorICAgICAgICAgICAgICAgICAgICAgICBFTkdJTkUgKmltcGwsIGNvbnN0IHVpbnQ4X3QgKmtleSwgY29uc3QgdWludDhfdCAqaXYpIHsKKyAgcmV0dXJuIEVWUF9DaXBoZXJJbml0X2V4KGN0eCwgY2lwaGVyLCBpbXBsLCBrZXksIGl2LCAxKTsKK30KKworaW50IEVWUF9EZWNyeXB0SW5pdF9leChFVlBfQ0lQSEVSX0NUWCAqY3R4LCBjb25zdCBFVlBfQ0lQSEVSICpjaXBoZXIsCisgICAgICAgICAgICAgICAgICAgICAgIEVOR0lORSAqaW1wbCwgY29uc3QgdWludDhfdCAqa2V5LCBjb25zdCB1aW50OF90ICppdikgeworICByZXR1cm4gRVZQX0NpcGhlckluaXRfZXgoY3R4LCBjaXBoZXIsIGltcGwsIGtleSwgaXYsIDApOworfQorCitpbnQgRVZQX0VuY3J5cHRVcGRhdGUoRVZQX0NJUEhFUl9DVFggKmN0eCwgdWludDhfdCAqb3V0LCBpbnQgKm91dF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW4sIGludCBpbl9sZW4pIHsKKyAgaW50IGksIGosIGJsOworCisgIGlmIChjdHgtPmNpcGhlci0+ZmxhZ3MgJiBFVlBfQ0lQSF9GTEFHX0NVU1RPTV9DSVBIRVIpIHsKKyAgICBpID0gY3R4LT5jaXBoZXItPmNpcGhlcihjdHgsIG91dCwgaW4sIGluX2xlbik7CisgICAgaWYgKGkgPCAwKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgKm91dF9sZW4gPSBpOworICAgIH0KKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGlmIChpbl9sZW4gPD0gMCkgeworICAgICpvdXRfbGVuID0gMDsKKyAgICByZXR1cm4gaW5fbGVuID09IDA7CisgIH0KKworICBpZiAoY3R4LT5idWZfbGVuID09IDAgJiYgKGluX2xlbiAmIGN0eC0+YmxvY2tfbWFzaykgPT0gMCkgeworICAgIGlmIChjdHgtPmNpcGhlci0+Y2lwaGVyKGN0eCwgb3V0LCBpbiwgaW5fbGVuKSkgeworICAgICAgKm91dF9sZW4gPSBpbl9sZW47CisgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgeworICAgICAgKm91dF9sZW4gPSAwOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgaSA9IGN0eC0+YnVmX2xlbjsKKyAgYmwgPSBjdHgtPmNpcGhlci0+YmxvY2tfc2l6ZTsKKyAgYXNzZXJ0KGJsIDw9IChpbnQpc2l6ZW9mKGN0eC0+YnVmKSk7CisgIGlmIChpICE9IDApIHsKKyAgICBpZiAoaSArIGluX2xlbiA8IGJsKSB7CisgICAgICBtZW1jcHkoJmN0eC0+YnVmW2ldLCBpbiwgaW5fbGVuKTsKKyAgICAgIGN0eC0+YnVmX2xlbiArPSBpbl9sZW47CisgICAgICAqb3V0X2xlbiA9IDA7CisgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgeworICAgICAgaiA9IGJsIC0gaTsKKyAgICAgIG1lbWNweSgmY3R4LT5idWZbaV0sIGluLCBqKTsKKyAgICAgIGlmICghY3R4LT5jaXBoZXItPmNpcGhlcihjdHgsIG91dCwgY3R4LT5idWYsIGJsKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGluX2xlbiAtPSBqOworICAgICAgaW4gKz0gajsKKyAgICAgIG91dCArPSBibDsKKyAgICAgICpvdXRfbGVuID0gYmw7CisgICAgfQorICB9IGVsc2UgeworICAgICpvdXRfbGVuID0gMDsKKyAgfQorCisgIGkgPSBpbl9sZW4gJiBjdHgtPmJsb2NrX21hc2s7CisgIGluX2xlbiAtPSBpOworICBpZiAoaW5fbGVuID4gMCkgeworICAgIGlmICghY3R4LT5jaXBoZXItPmNpcGhlcihjdHgsIG91dCwgaW4sIGluX2xlbikpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqb3V0X2xlbiArPSBpbl9sZW47CisgIH0KKworICBpZiAoaSAhPSAwKSB7CisgICAgbWVtY3B5KGN0eC0+YnVmLCAmaW5baW5fbGVuXSwgaSk7CisgIH0KKyAgY3R4LT5idWZfbGVuID0gaTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBFVlBfRW5jcnlwdEZpbmFsX2V4KEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVpbnQ4X3QgKm91dCwgaW50ICpvdXRfbGVuKSB7CisgIGludCBuLCByZXQ7CisgIHVuc2lnbmVkIGludCBpLCBiLCBibDsKKworICBpZiAoY3R4LT5jaXBoZXItPmZsYWdzICYgRVZQX0NJUEhfRkxBR19DVVNUT01fQ0lQSEVSKSB7CisgICAgcmV0ID0gY3R4LT5jaXBoZXItPmNpcGhlcihjdHgsIG91dCwgTlVMTCwgMCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICAqb3V0X2xlbiA9IHJldDsKKyAgICB9CisgICAgcmV0dXJuIDE7CisgIH0KKworICBiID0gY3R4LT5jaXBoZXItPmJsb2NrX3NpemU7CisgIGFzc2VydChiIDw9IHNpemVvZihjdHgtPmJ1ZikpOworICBpZiAoYiA9PSAxKSB7CisgICAgKm91dF9sZW4gPSAwOworICAgIHJldHVybiAxOworICB9CisKKyAgYmwgPSBjdHgtPmJ1Zl9sZW47CisgIGlmIChjdHgtPmZsYWdzICYgRVZQX0NJUEhfTk9fUEFERElORykgeworICAgIGlmIChibCkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBFVlBfRW5jcnlwdEZpbmFsX2V4LAorICAgICAgICAgICAgICAgICAgICAgICAgQ0lQSEVSX1JfREFUQV9OT1RfTVVMVElQTEVfT0ZfQkxPQ0tfTEVOR1RIKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqb3V0X2xlbiA9IDA7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBuID0gYiAtIGJsOworICBmb3IgKGkgPSBibDsgaSA8IGI7IGkrKykgeworICAgIGN0eC0+YnVmW2ldID0gbjsKKyAgfQorICByZXQgPSBjdHgtPmNpcGhlci0+Y2lwaGVyKGN0eCwgb3V0LCBjdHgtPmJ1ZiwgYik7CisKKyAgaWYgKHJldCkgeworICAgICpvdXRfbGVuID0gYjsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK2ludCBFVlBfRGVjcnlwdFVwZGF0ZShFVlBfQ0lQSEVSX0NUWCAqY3R4LCB1aW50OF90ICpvdXQsIGludCAqb3V0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppbiwgaW50IGluX2xlbikgeworICBpbnQgZml4X2xlbjsKKyAgdW5zaWduZWQgaW50IGI7CisKKyAgaWYgKGN0eC0+Y2lwaGVyLT5mbGFncyAmIEVWUF9DSVBIX0ZMQUdfQ1VTVE9NX0NJUEhFUikgeworICAgIGludCByID0gY3R4LT5jaXBoZXItPmNpcGhlcihjdHgsIG91dCwgaW4sIGluX2xlbik7CisgICAgaWYgKHIgPCAwKSB7CisgICAgICAqb3V0X2xlbiA9IDA7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgKm91dF9sZW4gPSByOworICAgIH0KKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGlmIChpbl9sZW4gPD0gMCkgeworICAgICpvdXRfbGVuID0gMDsKKyAgICByZXR1cm4gaW5fbGVuID09IDA7CisgIH0KKworICBpZiAoY3R4LT5mbGFncyAmIEVWUF9DSVBIX05PX1BBRERJTkcpIHsKKyAgICByZXR1cm4gRVZQX0VuY3J5cHRVcGRhdGUoY3R4LCBvdXQsIG91dF9sZW4sIGluLCBpbl9sZW4pOworICB9CisKKyAgYiA9IGN0eC0+Y2lwaGVyLT5ibG9ja19zaXplOworICBhc3NlcnQoYiA8PSBzaXplb2YoY3R4LT5maW5hbCkpOworCisgIGlmIChjdHgtPmZpbmFsX3VzZWQpIHsKKyAgICBtZW1jcHkob3V0LCBjdHgtPmZpbmFsLCBiKTsKKyAgICBvdXQgKz0gYjsKKyAgICBmaXhfbGVuID0gMTsKKyAgfSBlbHNlIHsKKyAgICBmaXhfbGVuID0gMDsKKyAgfQorCisgIGlmICghRVZQX0VuY3J5cHRVcGRhdGUoY3R4LCBvdXQsIG91dF9sZW4sIGluLCBpbl9sZW4pKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiBpZiB3ZSBoYXZlICdkZWNyeXB0ZWQnIGEgbXVsdGlwbGUgb2YgYmxvY2sgc2l6ZSwgbWFrZSBzdXJlCisgICAqIHdlIGhhdmUgYSBjb3B5IG9mIHRoaXMgbGFzdCBibG9jayAqLworICBpZiAoYiA+IDEgJiYgIWN0eC0+YnVmX2xlbikgeworICAgICpvdXRfbGVuIC09IGI7CisgICAgY3R4LT5maW5hbF91c2VkID0gMTsKKyAgICBtZW1jcHkoY3R4LT5maW5hbCwgJm91dFsqb3V0X2xlbl0sIGIpOworICB9IGVsc2UgeworICAgIGN0eC0+ZmluYWxfdXNlZCA9IDA7CisgIH0KKworICBpZiAoZml4X2xlbikgeworICAgICpvdXRfbGVuICs9IGI7CisgIH0KKworICByZXR1cm4gMTsKK30KKworaW50IEVWUF9EZWNyeXB0RmluYWxfZXgoRVZQX0NJUEhFUl9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgKm91dF9sZW4pIHsKKyAgaW50IGksIG47CisgIHVuc2lnbmVkIGludCBiOworICAqb3V0X2xlbiA9IDA7CisKKyAgaWYgKGN0eC0+Y2lwaGVyLT5mbGFncyAmIEVWUF9DSVBIX0ZMQUdfQ1VTVE9NX0NJUEhFUikgeworICAgIGkgPSBjdHgtPmNpcGhlci0+Y2lwaGVyKGN0eCwgb3V0LCBOVUxMLCAwKTsKKyAgICBpZiAoaSA8IDApIHsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICAqb3V0X2xlbiA9IGk7CisgICAgfQorICAgIHJldHVybiAxOworICB9CisKKyAgYiA9IGN0eC0+Y2lwaGVyLT5ibG9ja19zaXplOworICBpZiAoY3R4LT5mbGFncyAmIEVWUF9DSVBIX05PX1BBRERJTkcpIHsKKyAgICBpZiAoY3R4LT5idWZfbGVuKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIEVWUF9EZWNyeXB0RmluYWxfZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBDSVBIRVJfUl9EQVRBX05PVF9NVUxUSVBMRV9PRl9CTE9DS19MRU5HVEgpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpvdXRfbGVuID0gMDsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGlmIChiID4gMSkgeworICAgIGlmIChjdHgtPmJ1Zl9sZW4gfHwgIWN0eC0+ZmluYWxfdXNlZCkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBFVlBfRGVjcnlwdEZpbmFsX2V4LAorICAgICAgICAgICAgICAgICAgICAgICAgQ0lQSEVSX1JfV1JPTkdfRklOQUxfQkxPQ0tfTEVOR1RIKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhc3NlcnQoYiA8PSBzaXplb2YoY3R4LT5maW5hbCkpOworCisgICAgLyogVGhlIGZvbGxvd2luZyBhc3N1bWVzIHRoYXQgdGhlIGNpcGhlcnRleHQgaGFzIGJlZW4gYXV0aGVudGljYXRlZC4KKyAgICAgKiBPdGhlcndpc2UgaXQgcHJvdmlkZXMgYSBwYWRkaW5nIG9yYWNsZS4gKi8KKyAgICBuID0gY3R4LT5maW5hbFtiIC0gMV07CisgICAgaWYgKG4gPT0gMCB8fCBuID4gKGludCliKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIEVWUF9EZWNyeXB0RmluYWxfZXgsIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgIGlmIChjdHgtPmZpbmFsWy0tYl0gIT0gbikgeworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIEVWUF9EZWNyeXB0RmluYWxfZXgsIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfQorCisgICAgbiA9IGN0eC0+Y2lwaGVyLT5ibG9ja19zaXplIC0gbjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICBvdXRbaV0gPSBjdHgtPmZpbmFsW2ldOworICAgIH0KKyAgICAqb3V0X2xlbiA9IG47CisgIH0gZWxzZSB7CisgICAgKm91dF9sZW4gPSAwOworICB9CisKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBFVlBfQ2lwaGVyKEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVpbnQ4X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4sCisgICAgICAgICAgICAgICBzaXplX3QgaW5fbGVuKSB7CisgIHJldHVybiBjdHgtPmNpcGhlci0+Y2lwaGVyKGN0eCwgb3V0LCBpbiwgaW5fbGVuKTsKK30KKworaW50IEVWUF9DaXBoZXJVcGRhdGUoRVZQX0NJUEhFUl9DVFggKmN0eCwgdWludDhfdCAqb3V0LCBpbnQgKm91dF9sZW4sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppbiwgaW50IGluX2xlbikgeworICBpZiAoY3R4LT5lbmNyeXB0KSB7CisgICAgcmV0dXJuIEVWUF9FbmNyeXB0VXBkYXRlKGN0eCwgb3V0LCBvdXRfbGVuLCBpbiwgaW5fbGVuKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gRVZQX0RlY3J5cHRVcGRhdGUoY3R4LCBvdXQsIG91dF9sZW4sIGluLCBpbl9sZW4pOworICB9Cit9CisKK2ludCBFVlBfQ2lwaGVyRmluYWxfZXgoRVZQX0NJUEhFUl9DVFggKmN0eCwgdWludDhfdCAqb3V0LCBpbnQgKm91dF9sZW4pIHsKKyAgaWYgKGN0eC0+ZW5jcnlwdCkgeworICAgIHJldHVybiBFVlBfRW5jcnlwdEZpbmFsX2V4KGN0eCwgb3V0LCBvdXRfbGVuKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gRVZQX0RlY3J5cHRGaW5hbF9leChjdHgsIG91dCwgb3V0X2xlbik7CisgIH0KK30KKworY29uc3QgRVZQX0NJUEhFUiAqRVZQX0NJUEhFUl9DVFhfY2lwaGVyKGNvbnN0IEVWUF9DSVBIRVJfQ1RYICpjdHgpIHsKKyAgcmV0dXJuIGN0eC0+Y2lwaGVyOworfQorCitpbnQgRVZQX0NJUEhFUl9DVFhfbmlkKGNvbnN0IEVWUF9DSVBIRVJfQ1RYICpjdHgpIHsKKyAgcmV0dXJuIGN0eC0+Y2lwaGVyLT5uaWQ7Cit9CisKK3Vuc2lnbmVkIEVWUF9DSVBIRVJfQ1RYX2Jsb2NrX3NpemUoY29uc3QgRVZQX0NJUEhFUl9DVFggKmN0eCkgeworICByZXR1cm4gY3R4LT5jaXBoZXItPmJsb2NrX3NpemU7Cit9CisKK3Vuc2lnbmVkIEVWUF9DSVBIRVJfQ1RYX2tleV9sZW5ndGgoY29uc3QgRVZQX0NJUEhFUl9DVFggKmN0eCkgeworICByZXR1cm4gY3R4LT5rZXlfbGVuOworfQorCit1bnNpZ25lZCBFVlBfQ0lQSEVSX0NUWF9pdl9sZW5ndGgoY29uc3QgRVZQX0NJUEhFUl9DVFggKmN0eCkgeworICByZXR1cm4gY3R4LT5jaXBoZXItPml2X2xlbjsKK30KKwordm9pZCAqRVZQX0NJUEhFUl9DVFhfZ2V0X2FwcF9kYXRhKGNvbnN0IEVWUF9DSVBIRVJfQ1RYICpjdHgpIHsKKyAgcmV0dXJuIGN0eC0+YXBwX2RhdGE7Cit9CisKK3ZvaWQgRVZQX0NJUEhFUl9DVFhfc2V0X2FwcF9kYXRhKEVWUF9DSVBIRVJfQ1RYICpjdHgsIHZvaWQgKmRhdGEpIHsKKyAgY3R4LT5hcHBfZGF0YSA9IGRhdGE7Cit9CisKK3VpbnQzMl90IEVWUF9DSVBIRVJfQ1RYX2ZsYWdzKGNvbnN0IEVWUF9DSVBIRVJfQ1RYICpjdHgpIHsKKyAgcmV0dXJuIGN0eC0+Y2lwaGVyLT5mbGFncyAmIH5FVlBfQ0lQSF9NT0RFX01BU0s7Cit9CisKK3VpbnQzMl90IEVWUF9DSVBIRVJfQ1RYX21vZGUoY29uc3QgRVZQX0NJUEhFUl9DVFggKmN0eCkgeworICByZXR1cm4gY3R4LT5jaXBoZXItPmZsYWdzICYgRVZQX0NJUEhfTU9ERV9NQVNLOworfQorCitpbnQgRVZQX0NJUEhFUl9DVFhfY3RybChFVlBfQ0lQSEVSX0NUWCAqY3R4LCBpbnQgY29tbWFuZCwgaW50IGFyZywgdm9pZCAqcHRyKSB7CisgIGludCByZXQ7CisgIGlmICghY3R4LT5jaXBoZXIpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIEVWUF9DSVBIRVJfQ1RYX2N0cmwsIENJUEhFUl9SX05PX0NJUEhFUl9TRVQpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKCFjdHgtPmNpcGhlci0+Y3RybCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgRVZQX0NJUEhFUl9DVFhfY3RybCwgQ0lQSEVSX1JfQ1RSTF9OT1RfSU1QTEVNRU5URUQpOworICAgIHJldHVybiAwOworICB9CisKKyAgcmV0ID0gY3R4LT5jaXBoZXItPmN0cmwoY3R4LCBjb21tYW5kLCBhcmcsIHB0cik7CisgIGlmIChyZXQgPT0gLTEpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIEVWUF9DSVBIRVJfQ1RYX2N0cmwsCisgICAgICAgICAgICAgICAgICAgICAgQ0lQSEVSX1JfQ1RSTF9PUEVSQVRJT05fTk9UX0lNUExFTUVOVEVEKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK2ludCBFVlBfQ0lQSEVSX0NUWF9zZXRfcGFkZGluZyhFVlBfQ0lQSEVSX0NUWCAqY3R4LCBpbnQgcGFkKSB7CisgIGlmIChwYWQpIHsKKyAgICBjdHgtPmZsYWdzICY9IH5FVlBfQ0lQSF9OT19QQURESU5HOworICB9IGVsc2UgeworICAgIGN0eC0+ZmxhZ3MgfD0gRVZQX0NJUEhfTk9fUEFERElORzsKKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IEVWUF9DSVBIRVJfbmlkKGNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlcikgeyByZXR1cm4gY2lwaGVyLT5uaWQ7IH0KKworY29uc3QgY2hhciAqRVZQX0NJUEhFUl9uYW1lKGNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlcikgeworICByZXR1cm4gT0JKX25pZDJzbihjaXBoZXItPm5pZCk7Cit9CisKK3Vuc2lnbmVkIEVWUF9DSVBIRVJfYmxvY2tfc2l6ZShjb25zdCBFVlBfQ0lQSEVSICpjaXBoZXIpIHsKKyAgcmV0dXJuIGNpcGhlci0+YmxvY2tfc2l6ZTsKK30KKwordW5zaWduZWQgRVZQX0NJUEhFUl9rZXlfbGVuZ3RoKGNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlcikgeworICByZXR1cm4gY2lwaGVyLT5rZXlfbGVuOworfQorCit1bnNpZ25lZCBFVlBfQ0lQSEVSX2l2X2xlbmd0aChjb25zdCBFVlBfQ0lQSEVSICpjaXBoZXIpIHsKKyAgcmV0dXJuIGNpcGhlci0+aXZfbGVuOworfQorCit1aW50MzJfdCBFVlBfQ0lQSEVSX2ZsYWdzKGNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlcikgeworICByZXR1cm4gY2lwaGVyLT5mbGFncyAmIH5FVlBfQ0lQSF9NT0RFX01BU0s7Cit9CisKK3VpbnQzMl90IEVWUF9DSVBIRVJfbW9kZShjb25zdCBFVlBfQ0lQSEVSICpjaXBoZXIpIHsKKyAgcmV0dXJuIGNpcGhlci0+ZmxhZ3MgJiBFVlBfQ0lQSF9NT0RFX01BU0s7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vY2lwaGVyL2NpcGhlci5oIGIvY3J5cHRvL2NpcGhlci9jaXBoZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDEwNWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2NpcGhlci9jaXBoZXIuaApAQCAtMCwwICsxLDQ0MiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2lmbmRlZiBPUEVOU1NMX0hFQURFUl9DSVBIRVJfSAorI2RlZmluZSBPUEVOU1NMX0hFQURFUl9DSVBIRVJfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9iYXNlLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBDaXBoZXJzLiAqLworCisKKy8qIENpcGhlciBwcmltaXRpdmVzLgorICoKKyAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHJldHVybiB8RVZQX0NJUEhFUnwgb2JqZWN0cyB0aGF0IGltcGxlbWVudCB0aGUgbmFtZWQKKyAqIGNpcGhlciBhbGdvcml0aG0uICovCisKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9yYzQodm9pZCk7CisKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9kZXNfY2JjKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Rlc19lZGUzX2NiYyh2b2lkKTsKKworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Flc18xMjhfZWNiKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Flc18xMjhfY2JjKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Flc18xMjhfY3RyKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Flc18xMjhfZ2NtKHZvaWQpOworCitjb25zdCBFVlBfQ0lQSEVSICpFVlBfYWVzXzI1Nl9lY2Iodm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfYWVzXzI1Nl9jYmModm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfYWVzXzI1Nl9jdHIodm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfYWVzXzI1Nl9nY20odm9pZCk7CisKKy8qIEVWUF9lbmNfbnVsbCByZXR1cm5zIGEgJ2NpcGhlcicgdGhhdCBwYXNzZXMgcGxhaW50ZXh0IHRocm91Z2ggYXMKKyAqIGNpcGhlcnRleHQuICovCitjb25zdCBFVlBfQ0lQSEVSICpFVlBfZW5jX251bGwodm9pZCk7CisKKy8qIEVWUF9nZXRfY2lwaGVyYnluaWQgcmV0dXJucyB0aGUgY2lwaGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIE5JRCwgb3IKKyAqIE5VTEwgaWYgbm8gc3VjaCBjaXBoZXIgaXMga25vd24uICovCitjb25zdCBFVlBfQ0lQSEVSICpFVlBfZ2V0X2NpcGhlcmJ5bmlkKGludCBuaWQpOworCisKKy8qIENpcGhlciBjb250ZXh0IGFsbG9jYXRpb24uCisgKgorICogQW4gfEVWUF9DSVBIRVJfQ1RYfCByZXByZXNlbnRzIHRoZSBzdGF0ZSBvZiBhbiBlbmNyeXB0aW9uIG9yIGRlY3J5cHRpb24gaW4KKyAqIHByb2dyZXNzLiAqLworCisvKiBFVlBfQ0lQSEVSX0NUWF9pbml0IGluaXRpYWxpc2VzIGFuLCBhbHJlYWR5IGFsbG9jYXRlZCwgfEVWUF9DSVBIRVJfQ1RYfC4gKi8KK3ZvaWQgRVZQX0NJUEhFUl9DVFhfaW5pdChFVlBfQ0lQSEVSX0NUWCAqY3R4KTsKKworLyogRVZQX0NJUEhFUl9DVFhfbmV3IGFsbG9jYXRlcyBhIGZyZXNoIHxFVlBfQ0lQSEVSX0NUWHwsIGNhbGxzCisgKiB8RVZQX0NJUEhFUl9DVFhfaW5pdHwgYW5kIHJldHVybnMgaXQsIG9yIE5VTEwgb24gYWxsb2NhdGlvbiBmYWlsdXJlLiAqLworRVZQX0NJUEhFUl9DVFggKkVWUF9DSVBIRVJfQ1RYX25ldyh2b2lkKTsKKworLyogRVZQX0NJUEhFUl9DVFhfY2xlYW51cCBmcmVlcyBhbnkgbWVtb3J5IHJlZmVyZW5jZWQgYnkgfGN0eHwuIEl0IHJldHVybnMgb25lCisgKiBvbiBzdWNjZXNzIGFuZCB6ZXJvIG90aGVyd2lzZS4gKi8KK2ludCBFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKEVWUF9DSVBIRVJfQ1RYICpjdHgpOworCisvKiBFVlBfQ0lQSEVSX0NUWF9mcmVlIGNhbGxzIHxFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwfCBvbiB8Y3R4fCBhbmQgdGhlbiBmcmVlcworICogfGN0eHwgaXRzZWxmLiAqLwordm9pZCBFVlBfQ0lQSEVSX0NUWF9mcmVlKEVWUF9DSVBIRVJfQ1RYICpjdHgpOworCisvKiBFVlBfQ0lQSEVSX0NUWF9jb3B5IHNldHMgfG91dHwgdG8gYmUgYSBkdXBsaWNhdGUgb2YgdGhlIGN1cnJlbnQgc3RhdGUgb2YKKyAqIHxpbnwuIFRoZSB8b3V0fCBhcmd1bWVudCBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IGluaXRpYWxpc2VkLiAqLworaW50IEVWUF9DSVBIRVJfQ1RYX2NvcHkoRVZQX0NJUEhFUl9DVFggKm91dCwgY29uc3QgRVZQX0NJUEhFUl9DVFggKmluKTsKKworCisvKiBDaXBoZXIgY29udGV4dCBjb25maWd1cmF0aW9uLiAqLworCisvKiBFVlBfQ2lwaGVySW5pdF9leCBjb25maWd1cmVzIHxjdHh8IGZvciBhIGZyZXNoIGVuY3J5cHRpb24gKG9yIGRlY3J5cHRpb24sIGlmCisgKiB8ZW5jfCBpcyB6ZXJvKSBvcGVyYXRpb24gdXNpbmcgfGNpcGhlcnwuIElmIHxjdHh8IGhhcyBiZWVuIHByZXZpb3VzbHkKKyAqIGNvbmZpZ3VyZWQgd2l0aCBhIGNpcGhlciB0aGVuIHxjaXBoZXJ8LCB8a2V5fCBhbmQgfGl2fCBtYXkgYmUgfE5VTEx8IGFuZAorICogfGVuY3wgbWF5IGJlIC0xIHRvIHJldXNlIHRoZSBwcmV2aW91cyB2YWx1ZXMuIFRoZSBvcGVyYXRpb24gd2lsbCB1c2UgfGtleXwKKyAqIGFzIHRoZSBrZXkgYW5kIHxpdnwgYXMgdGhlIElWIChpZiBhbnkpLiBUaGVzZSBzaG91bGQgaGF2ZSB0aGUgY29ycmVjdAorICogbGVuZ3RocyBnaXZlbiBieSB8RVZQX0NJUEhFUl9rZXlfbGVuZ3RofCBhbmQgfEVWUF9DSVBIRVJfaXZfbGVuZ3RofC4gSXQKKyAqIHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24gZXJyb3IuICovCitpbnQgRVZQX0NpcGhlckluaXRfZXgoRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyLAorICAgICAgICAgICAgICAgICAgICAgIEVOR0lORSAqZW5naW5lLCBjb25zdCB1aW50OF90ICprZXksIGNvbnN0IHVpbnQ4X3QgKml2LAorICAgICAgICAgICAgICAgICAgICAgIGludCBlbmMpOworCisvKiBFVlBfRW5jcnlwdEluaXRfZXggY2FsbHMgfEVWUF9DaXBoZXJJbml0X2V4fCB3aXRoIHxlbmN8IGVxdWFsIHRvIG9uZS4gKi8KK2ludCBFVlBfRW5jcnlwdEluaXRfZXgoRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyLAorICAgICAgICAgICAgICAgICAgICAgICBFTkdJTkUgKmltcGwsIGNvbnN0IHVpbnQ4X3QgKmtleSwgY29uc3QgdWludDhfdCAqaXYpOworCisvKiBFVlBfRGVjcnlwdEluaXRfZXggY2FsbHMgfEVWUF9DaXBoZXJJbml0X2V4fCB3aXRoIHxlbmN8IGVxdWFsIHRvIHplcm8uICovCitpbnQgRVZQX0RlY3J5cHRJbml0X2V4KEVWUF9DSVBIRVJfQ1RYICpjdHgsIGNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgRU5HSU5FICppbXBsLCBjb25zdCB1aW50OF90ICprZXksIGNvbnN0IHVpbnQ4X3QgKml2KTsKKworCisvKiBDaXBoZXIgb3BlcmF0aW9ucy4gKi8KKworLyogRVZQX0VuY3J5cHRVcGRhdGUgZW5jcnlwdHMgfGluX2xlbnwgYnl0ZXMgZnJvbSB8aW58IHRvIHxvdXR8LiBUaGUgbnVtYmVyCisgKiBvZiBvdXRwdXQgYnl0ZXMgbWF5IGJlIHVwIHRvIHxpbl9sZW58IHBsdXMgdGhlIGJsb2NrIGxlbmd0aCBtaW51cyBvbmUgYW5kCisgKiB8b3V0fCBtdXN0IGhhdmUgc3VmZmljaWVudCBzcGFjZS4gVGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSBvdXRwdXQgaXMKKyAqIHdyaXR0ZW4gdG8gfCpvdXRfbGVufC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvdGhlcndpc2UuICovCitpbnQgRVZQX0VuY3J5cHRVcGRhdGUoRVZQX0NJUEhFUl9DVFggKmN0eCwgdWludDhfdCAqb3V0LCBpbnQgKm91dF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW4sIGludCBpbl9sZW4pOworCisvKiBFVlBfRW5jcnlwdEZpbmFsX2V4IHdyaXRlcyBhdCBtb3N0IGEgYmxvY2sgb2YgY2lwaGVydGV4dCB0byB8b3V0fCBhbmQgc2V0cworICogfCpvdXRfbGVufCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uIElmIHBhZGRpbmcgaXMgZW5hYmxlZCAodGhlCisgKiBkZWZhdWx0KSB0aGVuIHN0YW5kYXJkIHBhZGRpbmcgaXMgYXBwbGllZCB0byBjcmVhdGUgdGhlIGZpbmFsIGJsb2NrLiBJZgorICogcGFkZGluZyBpcyBkaXNhYmxlZCAod2l0aCB8RVZQX0NJUEhFUl9DVFhfc2V0X3BhZGRpbmd8KSB0aGVuIGFueSBwYXJ0aWFsCisgKiBibG9jayByZW1haW5pbmcgd2lsbCBjYXVzZSBhbiBlcnJvci4gVGhlIGZ1bmN0aW9uIHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kCisgKiB6ZXJvIG90aGVyd2lzZS4gKi8KK2ludCBFVlBfRW5jcnlwdEZpbmFsX2V4KEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVpbnQ4X3QgKm91dCwgaW50ICpvdXRfbGVuKTsKKworLyogRVZQX0RlY3J5cHRVcGRhdGUgZGVjcnlwdHMgfGluX2xlbnwgYnl0ZXMgZnJvbSB8aW58IHRvIHxvdXR8LiBUaGUgbnVtYmVyIG9mCisgKiBvdXRwdXQgYnl0ZXMgbWF5IGJlIHVwIHRvIHxpbl9sZW58IHBsdXMgdGhlIGJsb2NrIGxlbmd0aCBtaW51cyBvbmUgYW5kIHxvdXR8CisgKiBtdXN0IGhhdmUgc3VmZmljaWVudCBzcGFjZS4gVGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSBvdXRwdXQgaXMgd3JpdHRlbgorICogdG8gfCpvdXRfbGVufC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvdGhlcndpc2UuICovCitpbnQgRVZQX0RlY3J5cHRVcGRhdGUoRVZQX0NJUEhFUl9DVFggKmN0eCwgdWludDhfdCAqb3V0LCBpbnQgKm91dF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW4sIGludCBpbl9sZW4pOworCisvKiBFVlBfRGVjcnlwdEZpbmFsX2V4IHdyaXRlcyBhdCBtb3N0IGEgYmxvY2sgb2YgY2lwaGVydGV4dCB0byB8b3V0fCBhbmQgc2V0cworICogfCpvdXRfbGVufCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uIElmIHBhZGRpbmcgaXMgZW5hYmxlZCAodGhlCisgKiBkZWZhdWx0KSB0aGVuIHBhZGRpbmcgaXMgcmVtb3ZlZCBmcm9tIHRoZSBmaW5hbCBibG9jay4KKyAqCisgKiBXQVJOSU5HOiBpdCBpcyB1bnNhZmUgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggdW5hdXRoZW50aWN0ZWQKKyAqIGNpcGhlcnRleHQgaWYgcGFkZGluZyBpcyBlbmFibGVkLiAqLworaW50IEVWUF9EZWNyeXB0RmluYWxfZXgoRVZQX0NJUEhFUl9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgKm91dF9sZW4pOworCisvKiBFVlBfQ2lwaGVyIHBlcmZvcm1zIGEgb25lLXNob3QgZW5jcnlwdGlvbi9kZWNyeXB0aW9uIG9wZXJhdGlvbi4gTm8gcGFydGlhbAorICogYmxvY2tzIGV0YyBhcmUgbWFpbnRhaW5lZCBiZXR3ZWVuIGNhbGxzLiBJdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMKKyAqIHdyaXR0ZW4gb3IgLTEgb24gZXJyb3IuCisgKgorICogV0FSTklORzogdGhpcyBkaWZmZXJzIGZyb20gdGhlIHVzdWFsIHJldHVybiB2YWx1ZSBjb252ZW50aW9uLiAqLworaW50IEVWUF9DaXBoZXIoRVZQX0NJUEhFUl9DVFggKmN0eCwgdWludDhfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwKKyAgICAgICAgICAgICAgIHNpemVfdCBpbl9sZW4pOworCisvKiBFVlBfQ2lwaGVyVXBkYXRlIGNhbGxzIGVpdGhlciB8RVZQX0VuY3J5cHRVcGRhdGV8IG9yIHxFVlBfRGVjcnlwdFVwZGF0ZXwKKyAqIGRlcGVuZGluZyBvbiBob3cgfGN0eHwgaGFzIGJlZW4gc2V0dXAuICovCitpbnQgRVZQX0NpcGhlclVwZGF0ZShFVlBfQ0lQSEVSX0NUWCAqY3R4LCB1aW50OF90ICpvdXQsIGludCAqb3V0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluLCBpbnQgaW5fbGVuKTsKKworLyogRVZQX0NpcGhlckZpbmFsX2V4IGNhbGxzIGVpdGhlciB8RVZQX0VuY3J5cHRGaW5hbF9leHwgb3IKKyAqIHxFVlBfRGVjcnlwdEZpbmFsX2V4fCBkZXBlbmRpbmcgb24gaG93IHxjdHh8IGhhcyBiZWVuIHNldHVwLiAqLworaW50IEVWUF9DaXBoZXJGaW5hbF9leChFVlBfQ0lQSEVSX0NUWCAqY3R4LCB1aW50OF90ICpvdXQsIGludCAqb3V0X2xlbik7CisKKworLyogQ2lwaGVyIGNvbnRleHQgYWNjZXNzb3JzLiAqLworCisvKiBFVlBfQ0lQSEVSX0NUWF9jaXBoZXIgcmV0dXJucyB0aGUgfEVWUF9DSVBIRVJ8IHVuZGVybHlpbmcgfGN0eHwsIG9yIE5VTEwgaWYKKyAqIG5vbmUgaGFzIGJlZW4gc2V0LiAqLworY29uc3QgRVZQX0NJUEhFUiAqRVZQX0NJUEhFUl9DVFhfY2lwaGVyKGNvbnN0IEVWUF9DSVBIRVJfQ1RYICpjdHgpOworCisvKiBFVlBfQ0lQSEVSX0NUWF9uaWQgcmV0dXJucyBhIE5JRCBpZGVudGlmeWluZyB0aGUgfEVWUF9DSVBIRVJ8IHVuZGVybHlpbmcKKyAqIHxjdHh8IChlLmcuIHxOSURfcmM0fCkuIEl0IHdpbGwgY3Jhc2ggaWYgbm8gY2lwaGVyIGhhcyBiZWVuIGNvbmZpZ3VyZWQuICovCitpbnQgRVZQX0NJUEhFUl9DVFhfbmlkKGNvbnN0IEVWUF9DSVBIRVJfQ1RYICpjdHgpOworCisvKiBFVlBfQ0lQSEVSX0NUWF9ibG9ja19zaXplIHJldHVybnMgdGhlIGJsb2NrIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgY2lwaGVyCisgKiB1bmRlcmx5aW5nIHxjdHh8LCBvciBvbmUgaWYgdGhlIGNpcGhlciBpcyBhIHN0cmVhbSBjaXBoZXIuIEl0IHdpbGwgY3Jhc2ggaWYKKyAqIG5vIGNpcGhlciBoYXMgYmVlbiBjb25maWd1cmVkLiAqLwordW5zaWduZWQgRVZQX0NJUEhFUl9DVFhfYmxvY2tfc2l6ZShjb25zdCBFVlBfQ0lQSEVSX0NUWCAqY3R4KTsKKworLyogRVZQX0NJUEhFUl9DVFhfa2V5X2xlbmd0aCByZXR1cm5zIHRoZSBrZXkgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBjaXBoZXIKKyAqIHVuZGVybHlpbmcgfGN0eHwgb3IgemVybyBpZiBubyBjaXBoZXIgaGFzIGJlZW4gY29uZmlndXJlZC4gKi8KK3Vuc2lnbmVkIEVWUF9DSVBIRVJfQ1RYX2tleV9sZW5ndGgoY29uc3QgRVZQX0NJUEhFUl9DVFggKmN0eCk7CisKKy8qIEVWUF9DSVBIRVJfQ1RYX2l2X2xlbmd0aCByZXR1cm5zIHRoZSBJViBzaXplLCBpbiBieXRlcywgb2YgdGhlIGNpcGhlcgorICogdW5kZXJseWluZyB8Y3R4fC4gSXQgd2lsbCBjcmFzaCBpZiBubyBjaXBoZXIgaGFzIGJlZW4gY29uZmlndXJlZC4gKi8KK3Vuc2lnbmVkIEVWUF9DSVBIRVJfQ1RYX2l2X2xlbmd0aChjb25zdCBFVlBfQ0lQSEVSX0NUWCAqY3R4KTsKKworLyogRVZQX0NJUEhFUl9DVFhfZ2V0X2FwcF9kYXRhIHJldHVybnMgdGhlIG9wYXF1ZSwgYXBwbGljYXRpb24gZGF0YSBwb2ludGVyIGZvcgorICogfGN0eHwsIG9yIE5VTEwgaWYgbm9uZSBoYXMgYmVlbiBzZXQuICovCit2b2lkICpFVlBfQ0lQSEVSX0NUWF9nZXRfYXBwX2RhdGEoY29uc3QgRVZQX0NJUEhFUl9DVFggKmN0eCk7CisKKy8qIEVWUF9DSVBIRVJfQ1RYX3NldF9hcHBfZGF0YSBzZXRzIHRoZSBvcGFxdWUsIGFwcGxpY2F0aW9uIGRhdGEgcG9pbnRlciBmb3IKKyAqIHxjdHh8IHRvIHxkYXRhfC4gKi8KK3ZvaWQgRVZQX0NJUEhFUl9DVFhfc2V0X2FwcF9kYXRhKEVWUF9DSVBIRVJfQ1RYICpjdHgsIHZvaWQgKmRhdGEpOworCisvKiBFVlBfQ0lQSEVSX0NUWF9mbGFncyByZXR1cm5zIGEgdmFsdWUgd2hpY2ggaXMgdGhlIE9SIG9mIHplcm8gb3IgbW9yZQorICogfEVWUF9DSVBIXyp8IGZsYWdzLiBJdCB3aWxsIGNyYXNoIGlmIG5vIGNpcGhlciBoYXMgYmVlbiBjb25maWd1cmVkLiAqLwordWludDMyX3QgRVZQX0NJUEhFUl9DVFhfZmxhZ3MoY29uc3QgRVZQX0NJUEhFUl9DVFggKmN0eCk7CisKKy8qIEVWUF9DSVBIRVJfQ1RYX21vZGUgcmV0dXJucyBvbmUgb2YgdGhlIHxFVlBfQ0lQSF8qfCBjaXBoZXIgbW9kZSB2YWx1ZXMKKyAqIGVudW1lcmF0ZWQgYmVsb3cuIEl0IHdpbGwgY3Jhc2ggaWYgbm8gY2lwaGVyIGhhcyBiZWVuIGNvbmZpZ3VyZWQuICovCit1aW50MzJfdCBFVlBfQ0lQSEVSX0NUWF9tb2RlKGNvbnN0IEVWUF9DSVBIRVJfQ1RYICpjdHgpOworCisvKiBFVlBfQ0lQSEVSX0NUWF9jdHJsIGlzIGFuIHxpb2N0bHwgbGlrZSBmdW5jdGlvbi4gVGhlIHxjb21tYW5kfCBhcmd1bWVudAorICogc2hvdWxkIGJlIG9uZSBvZiB0aGUgfEVWUF9DVFJMXyp8IHZhbHVlcy4gVGhlIHxhcmd8IGFuZCB8cHRyfCBhcmd1bWVudHMgYXJlCisgKiBzcGVjaWZpYyB0byB0aGUgY29tbWFuZCBpbiBxdWVzdGlvbi4gKi8KK2ludCBFVlBfQ0lQSEVSX0NUWF9jdHJsKEVWUF9DSVBIRVJfQ1RYICpjdHgsIGludCBjb21tYW5kLCBpbnQgYXJnLCB2b2lkICpwdHIpOworCisvKiBFVlBfQ0lQSEVSX0NUWF9zZXRfcGFkZGluZyBzZXRzIHdoZXRoZXIgcGFkZGluZyBpcyBlbmFibGVkIGZvciB8Y3R4fCBhbmQKKyAqIHJldHVybnMgb25lLiBQYXNzIGEgbm9uLXplcm8gfHBhZHwgdG8gZW5hYmxlIHBhZGRpbmcgKHRoZSBkZWZhdWx0KSBvciB6ZXJvCisgKiB0byBkaXNhYmxlLiAqLworaW50IEVWUF9DSVBIRVJfQ1RYX3NldF9wYWRkaW5nKEVWUF9DSVBIRVJfQ1RYICpjdHgsIGludCBwYWQpOworCisKKy8qIENpcGhlciBhY2Nlc3NvcnMuICovCisKKy8qIEVWUF9DSVBIRVJfbmlkIHJldHVybnMgYSBOSUQgaWRlbnRpZmluZyB8Y2lwaGVyfC4gKEZvciBleGFtcGxlLAorICogfE5JRF9yYzR8LikgKi8KK2ludCBFVlBfQ0lQSEVSX25pZChjb25zdCBFVlBfQ0lQSEVSICpjaXBoZXIpOworCisvKiBFVlBfQ0lQSEVSX25hbWUgcmV0dXJucyB0aGUgc2hvcnQgbmFtZSBmb3IgfGNpcGhlcnwgb3IgTlVMTCBpZiBubyBuYW1lIGlzCisgKiBrbm93bi4gKi8KK2NvbnN0IGNoYXIgKkVWUF9DSVBIRVJfbmFtZShjb25zdCBFVlBfQ0lQSEVSICpjaXBoZXIpOworCisvKiBFVlBfQ0lQSEVSX2Jsb2NrX3NpemUgcmV0dXJucyB0aGUgYmxvY2sgc2l6ZSwgaW4gYnl0ZXMsIGZvciB8Y2lwaGVyfCwgb3Igb25lCisgKiBpZiB8Y2lwaGVyfCBpcyBhIHN0cmVhbSBjaXBoZXIuICovCit1bnNpZ25lZCBFVlBfQ0lQSEVSX2Jsb2NrX3NpemUoY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyKTsKKworLyogRVZQX0NJUEhFUl9rZXlfbGVuZ3RoIHJldHVybnMgdGhlIGtleSBzaXplLCBpbiBieXRlcywgZm9yIHxjaXBoZXJ8LiBJZgorICogfGNpcGhlcnwgY2FuIHRha2UgYSB2YXJpYWJsZSBrZXkgbGVuZ3RoIHRoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZQorICogZGVmYXVsdCBrZXkgbGVuZ3RoIGFuZCB8RVZQX0NJUEhFUl9mbGFnc3wgd2lsbCByZXR1cm4gYSB2YWx1ZSB3aXRoCisgKiB8RVZQX0NJUEhfVkFSSUFCTEVfTEVOR1RIfCBzZXQuICovCit1bnNpZ25lZCBFVlBfQ0lQSEVSX2tleV9sZW5ndGgoY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyKTsKKworLyogRVZQX0NJUEhFUl9pdl9sZW5ndGggcmV0dXJucyB0aGUgSVYgc2l6ZSwgaW4gYnl0ZXMsIG9mIHxjaXBoZXJ8LCBvciB6ZXJvIGlmCisgKiB8Y2lwaGVyfCBkb2Vzbid0IHRha2UgYW4gSVYuICovCit1bnNpZ25lZCBFVlBfQ0lQSEVSX2l2X2xlbmd0aChjb25zdCBFVlBfQ0lQSEVSICpjaXBoZXIpOworCisvKiBFVlBfQ0lQSEVSX2ZsYWdzIHJldHVybnMgYSB2YWx1ZSB3aGljaCBpcyB0aGUgT1Igb2YgemVybyBvciBtb3JlCisgKiB8RVZQX0NJUEhfKnwgZmxhZ3MuICovCit1aW50MzJfdCBFVlBfQ0lQSEVSX2ZsYWdzKGNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlcik7CisKKy8qIEVWUF9DSVBIRVJfbW9kZSByZXR1cm5zIG9uZSBvZiB0aGUgY2lwaGVyIG1vZGUgdmFsdWVzIGVudW1lcmF0ZWQgYmVsb3cuICovCit1aW50MzJfdCBFVlBfQ0lQSEVSX21vZGUoY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyKTsKKworCisvKiBLZXkgZGVyaXZhdGlvbi4gKi8KKworLyogRVZQX0J5dGVzVG9LZXkgZ2VuZXJhdGVzIGEga2V5IGFuZCBJViBmb3IgdGhlIGNpcGhlciB8dHlwZXwgYnkgaXRlcmF0aW5nCisgKiB8bWR8IHxjb3VudHwgdGltZXMgdXNpbmcgfGRhdGF8IGFuZCB8c2FsdHwuIE9uIGVudHJ5LCB0aGUgfGtleXwgYW5kIHxpdnwKKyAqIGJ1ZmZlcnMgbXVzdCBoYXZlIGVub3VnaCBzcGFjZSB0byBob2xkIGEga2V5IGFuZCBJViBmb3IgfHR5cGV8LiBJdCByZXR1cm5zCisgKiB0aGUgbGVuZ3RoIG9mIHRoZSBrZXkgb24gc3VjY2VzcyBvciB6ZXJvIG9uIGVycm9yLiAqLworaW50IEVWUF9CeXRlc1RvS2V5KGNvbnN0IEVWUF9DSVBIRVIgKnR5cGUsIGNvbnN0IEVWUF9NRCAqbWQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc2FsdCwgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNvdW50LCB1aW50OF90ICprZXksIHVpbnQ4X3QgKml2KTsKKworCisvKiBDaXBoZXIgbW9kZXMgKGZvciB8RVZQX0NJUEhFUl9tb2RlfCkuICovCisKKyNkZWZpbmUgRVZQX0NJUEhfU1RSRUFNX0NJUEhFUiAweDAKKyNkZWZpbmUgRVZQX0NJUEhfRUNCX01PREUgMHgxCisjZGVmaW5lIEVWUF9DSVBIX0NCQ19NT0RFIDB4MgorI2RlZmluZSBFVlBfQ0lQSF9DRkJfTU9ERSAweDMKKyNkZWZpbmUgRVZQX0NJUEhfT0ZCX01PREUgMHg0CisjZGVmaW5lIEVWUF9DSVBIX0NUUl9NT0RFIDB4NQorI2RlZmluZSBFVlBfQ0lQSF9HQ01fTU9ERSAweDYKKworCisvKiBDaXBoZXIgZmxhZ3MgKGZvciB8RVZQX0NJUEhFUl9mbGFnc3wpLiAqLworCisvKiBFVlBfQ0lQSF9WQVJJQUJMRV9MRU5HVEggaW5kaWNhdGVzIHRoYXQgdGhlIGNpcGhlciB0YWtlcyBhIHZhcmlhYmxlIGxlbmd0aAorICoga2V5LiAqLworI2RlZmluZSBFVlBfQ0lQSF9WQVJJQUJMRV9MRU5HVEggMHg0MAorCisvKiBFVlBfQ0lQSF9BTFdBWVNfQ0FMTF9JTklUIGluZGljYXRlcyB0aGF0IHRoZSB8aW5pdHwgZnVuY3Rpb24gZm9yIHRoZSBjaXBoZXIKKyAqIHNob3VsZCBhbHdheXMgYmUgY2FsbGVkIHdoZW4gaW5pdGlhbGlzaW5nIGEgbmV3IG9wZXJhdGlvbiwgZXZlbiBpZiB0aGUga2V5CisgKiBpcyBOVUxMIHRvIGluZGljYXRlIHRoYXQgdGhlIHNhbWUga2V5IGlzIGJlaW5nIHVzZWQuICovCisjZGVmaW5lIEVWUF9DSVBIX0FMV0FZU19DQUxMX0lOSVQgMHg4MAorCisvKiBFVlBfQ0lQSF9DVVNUT01fSVYgaW5kaWNhdGVzIHRoYXQgdGhlIGNpcGhlciBtYW5hZ2VzIHRoZSBJViBpdHNlbGYgcmF0aGVyCisgKiB0aGFuIGtlZXBpbmcgaXQgaW4gdGhlIHxpdnwgbWVtYmVyIG9mIHxFVlBfQ0lQSEVSX0NUWHwuICovCisjZGVmaW5lIEVWUF9DSVBIX0NVU1RPTV9JViAweDEwMAorCisvKiBFVlBfQ0lQSF9DVFJMX0lOSVQgaW5kaWNhdGVzIHRoYXQgRVZQX0NUUkxfSU5JVCBzaG91bGQgYmUgdXNlZCB3aGVuCisgKiBpbml0aWFsaXNpbmcgYW4gfEVWUF9DSVBIRVJfQ1RYfC4gKi8KKyNkZWZpbmUgRVZQX0NJUEhfQ1RSTF9JTklUIDB4MjAwCisKKy8qIEVWUF9DSVBIX0ZMQUdfQ1VTVE9NX0NJUEhFUiBpbmRpY2F0ZXMgdGhhdCB0aGUgY2lwaGVyIG1hbmFnZXMgYmxvY2tpbmcKKyAqIGl0c2VsZi4gVGhpcyBjYXVzZXMgRVZQXyhFbnxEZSljcnlwdF9leCB0byBiZSBzaW1wbGUgd3JhcHBlciBmdW5jdGlvbnMuICovCisjZGVmaW5lIEVWUF9DSVBIX0ZMQUdfQ1VTVE9NX0NJUEhFUiAweDQwMAorCisvKiBFVlBfQ0lQSF9GTEFHX0FFQURfQ0lQSEVSIHNwZWNpZmllcyB0aGF0IHRoZSBjaXBoZXIgaXMgYW4gQUVBRC4gVGhpcyBpcyBhbgorICogb2xkZXIgdmVyc2lvbiBvZiB0aGUgcHJvcGVyIEFFQUQgaW50ZXJmYWNlLiBTZWUgYWVhZC5oIGZvciB0aGUgY3VycmVudAorICogb25lLiAqLworI2RlZmluZSBFVlBfQ0lQSF9GTEFHX0FFQURfQ0lQSEVSIDB4ODAwCisKKworLyogUHJpdmF0ZSBmdW5jdGlvbnMuICovCisKKy8qIEVWUF9DSVBIX05PX1BBRERJTkcgZGlzYWJsZXMgcGFkZGluZyBpbiBibG9jayBjaXBoZXJzLiAqLworI2RlZmluZSBFVlBfQ0lQSF9OT19QQURESU5HIDB4ODAwCisKKy8qIEVWUF9DSVBIRVJfQ1RYX2N0cmwgY29tbWFuZHMuICovCisjZGVmaW5lIEVWUF9DVFJMX0lOSVQgMHgwCisjZGVmaW5lIEVWUF9DVFJMX1NFVF9LRVlfTEVOR1RIIDB4MQorI2RlZmluZSBFVlBfQ1RSTF9HRVRfUkMyX0tFWV9CSVRTIDB4MgorI2RlZmluZSBFVlBfQ1RSTF9TRVRfUkMyX0tFWV9CSVRTIDB4MworI2RlZmluZSBFVlBfQ1RSTF9HRVRfUkM1X1JPVU5EUyAweDQKKyNkZWZpbmUgRVZQX0NUUkxfU0VUX1JDNV9ST1VORFMgMHg1CisjZGVmaW5lIEVWUF9DVFJMX1JBTkRfS0VZIDB4NgorI2RlZmluZSBFVlBfQ1RSTF9QQkVfUFJGX05JRCAweDcKKyNkZWZpbmUgRVZQX0NUUkxfQ09QWSAweDgKKyNkZWZpbmUgRVZQX0NUUkxfR0NNX1NFVF9JVkxFTiAweDkKKyNkZWZpbmUgRVZQX0NUUkxfR0NNX0dFVF9UQUcgMHgxMAorI2RlZmluZSBFVlBfQ1RSTF9HQ01fU0VUX1RBRyAweDExCisjZGVmaW5lIEVWUF9DVFJMX0dDTV9TRVRfSVZfRklYRUQgMHgxMgorI2RlZmluZSBFVlBfQ1RSTF9HQ01fSVZfR0VOIDB4MTMKKyNkZWZpbmUgRVZQX0NUUkxfQUVBRF9UTFMxX0FBRCAweDE2CisjZGVmaW5lIEVWUF9DVFJMX0FFQURfU0VUX01BQ19LRVkgMHgxNworLyogU2V0IHRoZSBHQ00gaW52b2NhdGlvbiBmaWVsZCwgZGVjcnlwdCBvbmx5ICovCisjZGVmaW5lIEVWUF9DVFJMX0dDTV9TRVRfSVZfSU5WIDB4MTgKKworLyogR0NNIFRMUyBjb25zdGFudHMgKi8KKy8qIExlbmd0aCBvZiBmaXhlZCBwYXJ0IG9mIElWIGRlcml2ZWQgZnJvbSBQUkYgKi8KKyNkZWZpbmUgRVZQX0dDTV9UTFNfRklYRURfSVZfTEVOIDQKKy8qIExlbmd0aCBvZiBleHBsaWNpdCBwYXJ0IG9mIElWIHBhcnQgb2YgVExTIHJlY29yZHMgKi8KKyNkZWZpbmUgRVZQX0dDTV9UTFNfRVhQTElDSVRfSVZfTEVOIDgKKy8qIExlbmd0aCBvZiB0YWcgZm9yIFRMUyAqLworI2RlZmluZSBFVlBfR0NNX1RMU19UQUdfTEVOIDE2CisKKyNkZWZpbmUgRVZQX01BWF9LRVlfTEVOR1RIIDY0CisjZGVmaW5lIEVWUF9NQVhfSVZfTEVOR1RIIDE2CisjZGVmaW5lIEVWUF9NQVhfQkxPQ0tfTEVOR1RIIDMyCisKK3N0cnVjdCBldnBfY2lwaGVyX2N0eF9zdCB7CisgIC8qIGNpcGhlciBjb250YWlucyB0aGUgdW5kZXJseWluZyBjaXBoZXIgZm9yIHRoaXMgY29udGV4dC4gKi8KKyAgY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyOworCisgIC8qIGFwcF9kYXRhIGlzIGEgcG9pbnRlciB0byBvcGFxdWUsIHVzZXIgZGF0YS4gKi8KKyAgdm9pZCAqYXBwX2RhdGE7ICAgICAgLyogYXBwbGljYXRpb24gc3R1ZmYgKi8KKworICAvKiBjaXBoZXJfZGF0YSBwb2ludHMgdG8gdGhlIHxjaXBoZXJ8IHNwZWNpZmljIHN0YXRlLiAqLworICB2b2lkICpjaXBoZXJfZGF0YTsKKworICAvKiBrZXlfbGVuIGNvbnRhaW5zIHRoZSBsZW5ndGggb2YgdGhlIGtleSwgd2hpY2ggbWF5IGRpZmZlciBmcm9tCisgICAqIHxjaXBoZXItPmtleV9sZW58IGlmIHRoZSBjaXBoZXIgY2FuIHRha2UgYSB2YXJpYWJsZSBrZXkgbGVuZ3RoLiAqLworICB1bnNpZ25lZCBrZXlfbGVuOworCisgIC8qIGVuY3J5cHQgaXMgb25lIGlmIGVuY3J5cHRpbmcgYW5kIHplcm8gaWYgZGVjcnlwdGluZy4gKi8KKyAgaW50IGVuY3J5cHQ7CisKKyAgLyogZmxhZ3MgY29udGFpbnMgdGhlIE9SIG9mIHplcm8gb3IgbW9yZSB8RVZQX0NJUEhfKnwgZmxhZ3MsIGFib3ZlLiAqLworICB1aW50MzJfdCBmbGFnczsKKworICAvKiBvaXYgY29udGFpbnMgdGhlIG9yaWdpbmFsIElWIHZhbHVlLiAqLworICB1aW50OF90IG9pdltFVlBfTUFYX0lWX0xFTkdUSF07CisKKyAgLyogaXYgY29udGFpbnMgdGhlIGN1cnJlbnQgSVYgdmFsdWUsIHdoaWNoIG1heSBoYXZlIGJlZW4gdXBkYXRlZC4gKi8KKyAgdWludDhfdCBpdltFVlBfTUFYX0lWX0xFTkdUSF07CisKKyAgLyogYnVmIGNvbnRhaW5zIGEgcGFydGlhbCBibG9jayB3aGljaCBpcyB1c2VkIGJ5LCBmb3IgZXhhbXBsZSwgQ1RSIG1vZGUgdG8KKyAgICogc3RvcmUgdW51c2VkIGtleXN0cmVhbSBieXRlcy4gKi8KKyAgdWludDhfdCBidWZbRVZQX01BWF9CTE9DS19MRU5HVEhdOworCisgIC8qIGJ1Zl9sZW4gY29udGFpbnMgdGhlIG51bWJlciBvZiBieXRlcyBvZiBhIHBhcnRpYWwgYmxvY2sgY29udGFpbmVkIGluCisgICAqIHxidWZ8LiAqLworICBpbnQgYnVmX2xlbjsKKworICAvKiBudW0gY29udGFpbnMgdGhlIG51bWJlciBvZiBieXRlcyBvZiB8aXZ8IHdoaWNoIGFyZSB2YWxpZCBmb3IgbW9kZXMgdGhhdAorICAgKiBtYW5hZ2UgcGFydGlhbCBibG9ja3MgdGhlbXNlbHZlcy4gKi8KKyAgaW50IG51bTsKKworICAvKiBmaW5hbF91c2VkIGlzIG5vbi16ZXJvIGlmIHRoZSB8ZmluYWx8IGJ1ZmZlciBjb250YWlucyBwbGFpbnRleHQuICovCisgIGludCBmaW5hbF91c2VkOworCisgIC8qIGJsb2NrX21hc2sgY29udGFpbnMgfGNpcGhlci0+YmxvY2tfc2l6ZXwgbWludXMgb25lLiAoVGhlIGJsb2NrIHNpemUKKyAgICogYXNzdW1lZCB0byBiZSBhIHBvd2VyIG9mIHR3by4pICovCisgIGludCBibG9ja19tYXNrOworCisgIHVpbnQ4X3QgZmluYWxbRVZQX01BWF9CTE9DS19MRU5HVEhdOyAvKiBwb3NzaWJsZSBmaW5hbCBibG9jayAqLworfSAvKiBFVlBfQ0lQSEVSX0NUWCAqLzsKKwordHlwZWRlZiBzdHJ1Y3QgZXZwX2NpcGhlcl9pbmZvX3N0IHsKKyAgY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyOworICB1bnNpZ25lZCBjaGFyIGl2W0VWUF9NQVhfSVZfTEVOR1RIXTsKK30gRVZQX0NJUEhFUl9JTkZPOworCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfSAgLyogZXh0ZXJuIEMgKi8KKyNlbmRpZgorCisjZGVmaW5lIENJUEhFUl9GX0VWUF9DaXBoZXJJbml0X2V4IDEwMAorI2RlZmluZSBDSVBIRVJfRl9FVlBfRW5jcnlwdEZpbmFsX2V4IDEwMQorI2RlZmluZSBDSVBIRVJfRl9FVlBfRGVjcnlwdEZpbmFsX2V4IDEwMgorI2RlZmluZSBDSVBIRVJfRl9FVlBfQ0lQSEVSX0NUWF9jdHJsIDEwMworI2RlZmluZSBDSVBIRVJfRl9hZXNfaW5pdF9rZXkgMTA0CisjZGVmaW5lIENJUEhFUl9GX2Flc25pX2luaXRfa2V5IDEwNQorI2RlZmluZSBDSVBIRVJfRl9FVlBfQ0lQSEVSX0NUWF9jb3B5IDEwNgorI2RlZmluZSBDSVBIRVJfUl9XUkFQX01PREVfTk9UX0FMTE9XRUQgMTAwCisjZGVmaW5lIENJUEhFUl9SX0FFU19LRVlfU0VUVVBfRkFJTEVEIDEwMQorI2RlZmluZSBDSVBIRVJfUl9JTlBVVF9OT1RfSU5JVElBTElaRUQgMTAyCisjZGVmaW5lIENJUEhFUl9SX0RBVEFfTk9UX01VTFRJUExFX09GX0JMT0NLX0xFTkdUSCAxMDMKKyNkZWZpbmUgQ0lQSEVSX1JfSU5JVElBTElaQVRJT05fRVJST1IgMTA0CisjZGVmaW5lIENJUEhFUl9SX0NUUkxfTk9UX0lNUExFTUVOVEVEIDEwNQorI2RlZmluZSBDSVBIRVJfUl9OT19DSVBIRVJfU0VUIDEwNgorI2RlZmluZSBDSVBIRVJfUl9CQURfREVDUllQVCAxMDcKKyNkZWZpbmUgQ0lQSEVSX1JfV1JPTkdfRklOQUxfQkxPQ0tfTEVOR1RIIDEwOAorI2RlZmluZSBDSVBIRVJfUl9DVFJMX09QRVJBVElPTl9OT1RfSU1QTEVNRU5URUQgMTA5CisKKyNlbmRpZiAgLyogT1BFTlNTTF9IRUFERVJfQ0lQSEVSX0ggKi8KZGlmZiAtLWdpdCBhL2NyeXB0by9jaXBoZXIvY2lwaGVyX2Vycm9yLmMgYi9jcnlwdG8vY2lwaGVyL2NpcGhlcl9lcnJvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZGVjZGQKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vY2lwaGVyL2NpcGhlcl9lcnJvci5jCkBAIC0wLDAgKzEsMzggQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNCwgR29vZ2xlIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisKKyNpbmNsdWRlICJjaXBoZXIuaCIKKworY29uc3QgRVJSX1NUUklOR19EQVRBIENJUEhFUl9lcnJvcl9zdHJpbmdfZGF0YVtdID0geworICB7RVJSX1BBQ0soRVJSX0xJQl9DSVBIRVIsIENJUEhFUl9GX0VWUF9DSVBIRVJfQ1RYX2NvcHksIDApLCAiRVZQX0NJUEhFUl9DVFhfY29weSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9DSVBIRVIsIENJUEhFUl9GX0VWUF9DSVBIRVJfQ1RYX2N0cmwsIDApLCAiRVZQX0NJUEhFUl9DVFhfY3RybCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9DSVBIRVIsIENJUEhFUl9GX0VWUF9DaXBoZXJJbml0X2V4LCAwKSwgIkVWUF9DaXBoZXJJbml0X2V4In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0NJUEhFUiwgQ0lQSEVSX0ZfRVZQX0RlY3J5cHRGaW5hbF9leCwgMCksICJFVlBfRGVjcnlwdEZpbmFsX2V4In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0NJUEhFUiwgQ0lQSEVSX0ZfRVZQX0VuY3J5cHRGaW5hbF9leCwgMCksICJFVlBfRW5jcnlwdEZpbmFsX2V4In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0NJUEhFUiwgQ0lQSEVSX0ZfYWVzX2luaXRfa2V5LCAwKSwgImFlc19pbml0X2tleSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9DSVBIRVIsIENJUEhFUl9GX2Flc25pX2luaXRfa2V5LCAwKSwgImFlc25pX2luaXRfa2V5In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0NJUEhFUiwgMCwgQ0lQSEVSX1JfQUVTX0tFWV9TRVRVUF9GQUlMRUQpLCAiQUVTX0tFWV9TRVRVUF9GQUlMRUQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQ0lQSEVSLCAwLCBDSVBIRVJfUl9CQURfREVDUllQVCksICJCQURfREVDUllQVCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9DSVBIRVIsIDAsIENJUEhFUl9SX0NUUkxfTk9UX0lNUExFTUVOVEVEKSwgIkNUUkxfTk9UX0lNUExFTUVOVEVEIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0NJUEhFUiwgMCwgQ0lQSEVSX1JfQ1RSTF9PUEVSQVRJT05fTk9UX0lNUExFTUVOVEVEKSwgIkNUUkxfT1BFUkFUSU9OX05PVF9JTVBMRU1FTlRFRCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9DSVBIRVIsIDAsIENJUEhFUl9SX0RBVEFfTk9UX01VTFRJUExFX09GX0JMT0NLX0xFTkdUSCksICJEQVRBX05PVF9NVUxUSVBMRV9PRl9CTE9DS19MRU5HVEgifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQ0lQSEVSLCAwLCBDSVBIRVJfUl9JTklUSUFMSVpBVElPTl9FUlJPUiksICJJTklUSUFMSVpBVElPTl9FUlJPUiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9DSVBIRVIsIDAsIENJUEhFUl9SX0lOUFVUX05PVF9JTklUSUFMSVpFRCksICJJTlBVVF9OT1RfSU5JVElBTElaRUQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQ0lQSEVSLCAwLCBDSVBIRVJfUl9OT19DSVBIRVJfU0VUKSwgIk5PX0NJUEhFUl9TRVQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQ0lQSEVSLCAwLCBDSVBIRVJfUl9XUkFQX01PREVfTk9UX0FMTE9XRUQpLCAiV1JBUF9NT0RFX05PVF9BTExPV0VEIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0NJUEhFUiwgMCwgQ0lQSEVSX1JfV1JPTkdfRklOQUxfQkxPQ0tfTEVOR1RIKSwgIldST05HX0ZJTkFMX0JMT0NLX0xFTkdUSCJ9LAorICB7MCwgTlVMTH0sCit9OwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2NpcGhlci9jaXBoZXJfdGVzdC5jIGIvY3J5cHRvL2NpcGhlci9jaXBoZXJfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYWRiOGEKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vY2lwaGVyL2NpcGhlcl90ZXN0LmMKQEAgLTAsMCArMSw0MDkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9jaXBoZXIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisKKworc3RhdGljIHZvaWQgaGV4ZHVtcChGSUxFICpmLCBjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgdWludDhfdCAqcywgaW50IGwpIHsKKyAgaW50IG4gPSAwOworCisgIGZwcmludGYoZiwgIiVzIiwgdGl0bGUpOworICBmb3IgKDsgbiA8IGw7ICsrbikgeworICAgIGlmICgobiAlIDE2KSA9PSAwKQorICAgICAgZnByaW50ZihmLCAiXG4lMDR4Iiwgbik7CisgICAgZnByaW50ZihmLCAiICUwMngiLCBzW25dKTsKKyAgfQorICBmcHJpbnRmKGYsICJcbiIpOworfQorCitzdGF0aWMgaW50IGNvbnZlcnQodWludDhfdCAqcykgeworICB1aW50OF90ICpkOworCisgIGZvciAoZCA9IHM7ICpzOyBzICs9IDIsICsrZCkgeworICAgIHVuc2lnbmVkIGludCBuOworCisgICAgaWYgKCFzWzFdKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIk9kZCBudW1iZXIgb2YgaGV4IGRpZ2l0cyEiKTsKKyAgICAgIGV4aXQoNCk7CisgICAgfQorICAgIHNzY2FuZigoY2hhciAqKXMsICIlMngiLCAmbik7CisgICAgKmQgPSAodWludDhfdCluOworICB9CisgIHJldHVybiBzIC0gZDsKK30KKworc3RhdGljIGNoYXIgKnNzdHJzZXAoY2hhciAqKnN0cmluZywgY29uc3QgY2hhciAqZGVsaW0pIHsKKyAgY2hhciBpc2RlbGltWzI1Nl07CisgIGNoYXIgKnRva2VuID0gKnN0cmluZzsKKworICBpZiAoKipzdHJpbmcgPT0gMCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgbWVtc2V0KGlzZGVsaW0sIDAsIDI1Nik7CisgIGlzZGVsaW1bMF0gPSAxOworCisgIHdoaWxlICgqZGVsaW0pIHsKKyAgICBpc2RlbGltWyh1aW50OF90KSgqZGVsaW0pXSA9IDE7CisgICAgZGVsaW0rKzsKKyAgfQorCisgIHdoaWxlICghaXNkZWxpbVsodWludDhfdCkoKipzdHJpbmcpXSkgeworICAgICgqc3RyaW5nKSsrOworICB9CisKKyAgaWYgKCoqc3RyaW5nKSB7CisgICAgKipzdHJpbmcgPSAwOworICAgICgqc3RyaW5nKSsrOworICB9CisKKyAgcmV0dXJuIHRva2VuOworfQorCitzdGF0aWMgdWludDhfdCAqdXN0cnNlcChjaGFyICoqcCwgY29uc3QgY2hhciAqc2VwKSB7CisgIHJldHVybiAodWludDhfdCAqKXNzdHJzZXAocCwgc2VwKTsKK30KKworc3RhdGljIHZvaWQgdGVzdDEoY29uc3QgRVZQX0NJUEhFUiAqYywgY29uc3QgdWludDhfdCAqa2V5LCBpbnQga24sCisgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppdiwgaW50IGluLCBjb25zdCB1aW50OF90ICpwbGFpbnRleHQsIGludCBwbiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmNpcGhlcnRleHQsIGludCBjbiwgY29uc3QgdWludDhfdCAqYWFkLCBpbnQgYW4sCisgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICp0YWcsIGludCB0biwgaW50IGVuY2RlYykgeworICBFVlBfQ0lQSEVSX0NUWCBjdHg7CisgIHVpbnQ4X3Qgb3V0WzQwOTZdOworICBpbnQgb3V0bCwgb3V0bDIsIG1vZGU7CisKKyAgcHJpbnRmKCJUZXN0aW5nIGNpcGhlciAlcyVzXG4iLCBFVlBfQ0lQSEVSX25hbWUoYyksCisgICAgICAgICAoZW5jZGVjID09IDEgPyAiKGVuY3J5cHQpIgorICAgICAgICAgICAgICAgICAgICAgIDogKGVuY2RlYyA9PSAwID8gIihkZWNyeXB0KSIgOiAiKGVuY3J5cHQvZGVjcnlwdCkiKSkpOworICBoZXhkdW1wKHN0ZG91dCwgIktleSIsIGtleSwga24pOworICBpZiAoaW4pIHsKKyAgICBoZXhkdW1wKHN0ZG91dCwgIklWIiwgaXYsIGluKTsKKyAgfQorICBoZXhkdW1wKHN0ZG91dCwgIlBsYWludGV4dCIsIHBsYWludGV4dCwgcG4pOworICBoZXhkdW1wKHN0ZG91dCwgIkNpcGhlcnRleHQiLCBjaXBoZXJ0ZXh0LCBjbik7CisgIGlmIChhbikgeworICAgIGhleGR1bXAoc3Rkb3V0LCAiQUFEIiwgYWFkLCBhbik7CisgIH0KKyAgaWYgKHRuKSB7CisgICAgaGV4ZHVtcChzdGRvdXQsICJUYWciLCB0YWcsIHRuKTsKKyAgfQorICBtb2RlID0gRVZQX0NJUEhFUl9tb2RlKGMpOworICBpZiAoa24gIT0gRVZQX0NJUEhFUl9rZXlfbGVuZ3RoKGMpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJLZXkgbGVuZ3RoIGRvZXNuJ3QgbWF0Y2gsIGdvdCAlZCBleHBlY3RlZCAlbHVcbiIsIGtuLAorICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpRVZQX0NJUEhFUl9rZXlfbGVuZ3RoKGMpKTsKKyAgICBleGl0KDUpOworICB9CisgIEVWUF9DSVBIRVJfQ1RYX2luaXQoJmN0eCk7CisgIGlmIChlbmNkZWMgIT0gMCkgeworICAgIGlmIChtb2RlID09IEVWUF9DSVBIX0dDTV9NT0RFKSB7CisgICAgICBpZiAoIUVWUF9FbmNyeXB0SW5pdF9leCgmY3R4LCBjLCBOVUxMLCBOVUxMLCBOVUxMKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVuY3J5cHRJbml0IGZhaWxlZFxuIik7CisgICAgICAgIEJJT19wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKyAgICAgICAgZXhpdCgxMCk7CisgICAgICB9CisgICAgICBpZiAoIUVWUF9DSVBIRVJfQ1RYX2N0cmwoJmN0eCwgRVZQX0NUUkxfR0NNX1NFVF9JVkxFTiwgaW4sIE5VTEwpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSVYgbGVuZ3RoIHNldCBmYWlsZWRcbiIpOworICAgICAgICBCSU9fcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7CisgICAgICAgIGV4aXQoMTEpOworICAgICAgfQorICAgICAgaWYgKCFFVlBfRW5jcnlwdEluaXRfZXgoJmN0eCwgTlVMTCwgTlVMTCwga2V5LCBpdikpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJLZXkvSVYgc2V0IGZhaWxlZFxuIik7CisgICAgICAgIEJJT19wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKyAgICAgICAgZXhpdCgxMik7CisgICAgICB9CisgICAgICBpZiAoYW4gJiYgIUVWUF9FbmNyeXB0VXBkYXRlKCZjdHgsIE5VTEwsICZvdXRsLCBhYWQsIGFuKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkFBRCBzZXQgZmFpbGVkXG4iKTsKKyAgICAgICAgQklPX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOworICAgICAgICBleGl0KDEzKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFFVlBfRW5jcnlwdEluaXRfZXgoJmN0eCwgYywgTlVMTCwga2V5LCBpdikpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRW5jcnlwdEluaXQgZmFpbGVkXG4iKTsKKyAgICAgIEJJT19wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKyAgICAgIGV4aXQoMTApOworICAgIH0KKyAgICBFVlBfQ0lQSEVSX0NUWF9zZXRfcGFkZGluZygmY3R4LCAwKTsKKworICAgIGlmICghRVZQX0VuY3J5cHRVcGRhdGUoJmN0eCwgb3V0LCAmb3V0bCwgcGxhaW50ZXh0LCBwbikpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRW5jcnlwdCBmYWlsZWRcbiIpOworICAgICAgQklPX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOworICAgICAgZXhpdCg2KTsKKyAgICB9CisgICAgaWYgKCFFVlBfRW5jcnlwdEZpbmFsX2V4KCZjdHgsIG91dCArIG91dGwsICZvdXRsMikpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRW5jcnlwdEZpbmFsIGZhaWxlZFxuIik7CisgICAgICBCSU9fcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7CisgICAgICBleGl0KDcpOworICAgIH0KKworICAgIGlmIChvdXRsICsgb3V0bDIgIT0gY24pIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2lwaGVydGV4dCBsZW5ndGggbWlzbWF0Y2ggZ290ICVkIGV4cGVjdGVkICVkXG4iLAorICAgICAgICAgICAgICBvdXRsICsgb3V0bDIsIGNuKTsKKyAgICAgIGV4aXQoOCk7CisgICAgfQorCisgICAgaWYgKG1lbWNtcChvdXQsIGNpcGhlcnRleHQsIGNuKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJDaXBoZXJ0ZXh0IG1pc21hdGNoXG4iKTsKKyAgICAgIGhleGR1bXAoc3RkZXJyLCAiR290Iiwgb3V0LCBjbik7CisgICAgICBoZXhkdW1wKHN0ZGVyciwgIkV4cGVjdGVkIiwgY2lwaGVydGV4dCwgY24pOworICAgICAgZXhpdCg5KTsKKyAgICB9CisgICAgaWYgKG1vZGUgPT0gRVZQX0NJUEhfR0NNX01PREUpIHsKKyAgICAgIHVpbnQ4X3QgcnRhZ1sxNl07CisgICAgICAvKiBOb3RlOiBFVlBfQ1RSTF9DQ01fR0VUX1RBRyBoYXMgc2FtZSB2YWx1ZSBhcworICAgICAgICogRVZQX0NUUkxfR0NNX0dFVF9UQUcKKyAgICAgICAqLworICAgICAgaWYgKCFFVlBfQ0lQSEVSX0NUWF9jdHJsKCZjdHgsIEVWUF9DVFJMX0dDTV9HRVRfVEFHLCB0biwgcnRhZykpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJHZXQgdGFnIGZhaWxlZFxuIik7CisgICAgICAgIEJJT19wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKyAgICAgICAgZXhpdCgxNCk7CisgICAgICB9CisgICAgICBpZiAobWVtY21wKHJ0YWcsIHRhZywgdG4pKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVGFnIG1pc21hdGNoXG4iKTsKKyAgICAgICAgaGV4ZHVtcChzdGRlcnIsICJHb3QiLCBydGFnLCB0bik7CisgICAgICAgIGhleGR1bXAoc3RkZXJyLCAiRXhwZWN0ZWQiLCB0YWcsIHRuKTsKKyAgICAgICAgZXhpdCg5KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoZW5jZGVjIDw9IDApIHsKKyAgICBpZiAobW9kZSA9PSBFVlBfQ0lQSF9HQ01fTU9ERSkgeworICAgICAgaWYgKCFFVlBfRGVjcnlwdEluaXRfZXgoJmN0eCwgYywgTlVMTCwgTlVMTCwgTlVMTCkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFbmNyeXB0SW5pdCBmYWlsZWRcbiIpOworICAgICAgICBCSU9fcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7CisgICAgICAgIGV4aXQoMTApOworICAgICAgfQorICAgICAgaWYgKCFFVlBfQ0lQSEVSX0NUWF9jdHJsKCZjdHgsIEVWUF9DVFJMX0dDTV9TRVRfSVZMRU4sIGluLCBOVUxMKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIklWIGxlbmd0aCBzZXQgZmFpbGVkXG4iKTsKKyAgICAgICAgQklPX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOworICAgICAgICBleGl0KDExKTsKKyAgICAgIH0KKyAgICAgIGlmICghRVZQX0RlY3J5cHRJbml0X2V4KCZjdHgsIE5VTEwsIE5VTEwsIGtleSwgaXYpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiS2V5L0lWIHNldCBmYWlsZWRcbiIpOworICAgICAgICBCSU9fcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7CisgICAgICAgIGV4aXQoMTIpOworICAgICAgfQorICAgICAgaWYgKCFFVlBfQ0lQSEVSX0NUWF9jdHJsKCZjdHgsIEVWUF9DVFJMX0dDTV9TRVRfVEFHLCB0biwgKHZvaWQgKil0YWcpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiU2V0IHRhZyBmYWlsZWRcbiIpOworICAgICAgICBCSU9fcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7CisgICAgICAgIGV4aXQoMTQpOworICAgICAgfQorICAgICAgaWYgKGFuICYmICFFVlBfRGVjcnlwdFVwZGF0ZSgmY3R4LCBOVUxMLCAmb3V0bCwgYWFkLCBhbikpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJBQUQgc2V0IGZhaWxlZFxuIik7CisgICAgICAgIEJJT19wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKyAgICAgICAgZXhpdCgxMyk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICghRVZQX0RlY3J5cHRJbml0X2V4KCZjdHgsIGMsIE5VTEwsIGtleSwgaXYpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkRlY3J5cHRJbml0IGZhaWxlZFxuIik7CisgICAgICBCSU9fcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7CisgICAgICBleGl0KDExKTsKKyAgICB9CisgICAgRVZQX0NJUEhFUl9DVFhfc2V0X3BhZGRpbmcoJmN0eCwgMCk7CisKKyAgICBpZiAoIUVWUF9EZWNyeXB0VXBkYXRlKCZjdHgsIG91dCwgJm91dGwsIGNpcGhlcnRleHQsIGNuKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJEZWNyeXB0IGZhaWxlZFxuIik7CisgICAgICBCSU9fcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7CisgICAgICBleGl0KDYpOworICAgIH0KKyAgICBvdXRsMiA9IDA7CisgICAgaWYgKCFFVlBfRGVjcnlwdEZpbmFsX2V4KCZjdHgsIG91dCArIG91dGwsICZvdXRsMikpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRGVjcnlwdEZpbmFsIGZhaWxlZFxuIik7CisgICAgICBCSU9fcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7CisgICAgICBleGl0KDcpOworICAgIH0KKworICAgIGlmIChvdXRsICsgb3V0bDIgIT0gcG4pIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiUGxhaW50ZXh0IGxlbmd0aCBtaXNtYXRjaCBnb3QgJWQgZXhwZWN0ZWQgJWRcbiIsCisgICAgICAgICAgICAgIG91dGwgKyBvdXRsMiwgcG4pOworICAgICAgZXhpdCg4KTsKKyAgICB9CisKKyAgICBpZiAobWVtY21wKG91dCwgcGxhaW50ZXh0LCBwbikpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiUGxhaW50ZXh0IG1pc21hdGNoXG4iKTsKKyAgICAgIGhleGR1bXAoc3RkZXJyLCAiR290Iiwgb3V0LCBwbik7CisgICAgICBoZXhkdW1wKHN0ZGVyciwgIkV4cGVjdGVkIiwgcGxhaW50ZXh0LCBwbik7CisgICAgICBleGl0KDkpOworICAgIH0KKyAgfQorCisgIEVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoJmN0eCk7CisKKyAgcHJpbnRmKCJcbiIpOworfQorCitzdGF0aWMgaW50IHRlc3RfY2lwaGVyKGNvbnN0IGNoYXIgKmNpcGhlciwgY29uc3QgdWludDhfdCAqa2V5LCBpbnQga24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKml2LCBpbnQgaW4sIGNvbnN0IHVpbnQ4X3QgKnBsYWludGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHBuLCBjb25zdCB1aW50OF90ICpjaXBoZXJ0ZXh0LCBpbnQgY24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmFhZCwgaW50IGFuLCBjb25zdCB1aW50OF90ICp0YWcsIGludCB0biwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuY2RlYykgeworICBjb25zdCBFVlBfQ0lQSEVSICpjOworCisgIGlmIChzdHJjbXAoY2lwaGVyLCAiREVTLUNCQyIpID09IDApIHsKKyAgICBjID0gRVZQX2Rlc19jYmMoKTsKKyAgfSBlbHNlIGlmIChzdHJjbXAoY2lwaGVyLCAiREVTLUVERTMtQ0JDIikgPT0gMCkgeworICAgIGMgPSBFVlBfZGVzX2VkZTNfY2JjKCk7CisgIH0gZWxzZSBpZiAoc3RyY21wKGNpcGhlciwgIlJDNCIpID09IDApIHsKKyAgICBjID0gRVZQX3JjNCgpOworICB9IGVsc2UgaWYgKHN0cmNtcChjaXBoZXIsICJBRVMtMTI4LUVDQiIpID09IDApIHsKKyAgICBjID0gRVZQX2Flc18xMjhfZWNiKCk7CisgIH0gZWxzZSBpZiAoc3RyY21wKGNpcGhlciwgIkFFUy0yNTYtRUNCIikgPT0gMCkgeworICAgIGMgPSBFVlBfYWVzXzI1Nl9lY2IoKTsKKyAgfSBlbHNlIGlmIChzdHJjbXAoY2lwaGVyLCAiQUVTLTEyOC1DQkMiKSA9PSAwKSB7CisgICAgYyA9IEVWUF9hZXNfMTI4X2NiYygpOworICB9IGVsc2UgaWYgKHN0cmNtcChjaXBoZXIsICJBRVMtMTI4LUdDTSIpID09IDApIHsKKyAgICBjID0gRVZQX2Flc18xMjhfZ2NtKCk7CisgIH0gZWxzZSBpZiAoc3RyY21wKGNpcGhlciwgIkFFUy0yNTYtQ0JDIikgPT0gMCkgeworICAgIGMgPSBFVlBfYWVzXzI1Nl9jYmMoKTsKKyAgfSBlbHNlIGlmIChzdHJjbXAoY2lwaGVyLCAiQUVTLTEyOC1DVFIiKSA9PSAwKSB7CisgICAgYyA9IEVWUF9hZXNfMTI4X2N0cigpOworICB9IGVsc2UgaWYgKHN0cmNtcChjaXBoZXIsICJBRVMtMjU2LUNUUiIpID09IDApIHsKKyAgICBjID0gRVZQX2Flc18yNTZfY3RyKCk7CisgIH0gZWxzZSBpZiAoc3RyY21wKGNpcGhlciwgIkFFUy0yNTYtR0NNIikgPT0gMCkgeworICAgIGMgPSBFVlBfYWVzXzI1Nl9nY20oKTsKKyAgfSBlbHNlIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gY2lwaGVyIHR5cGUgJXNcbiIsIGNpcGhlcik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICB0ZXN0MShjLCBrZXksIGtuLCBpdiwgaW4sIHBsYWludGV4dCwgcG4sIGNpcGhlcnRleHQsIGNuLCBhYWQsIGFuLCB0YWcsIHRuLAorICAgICAgICBlbmNkZWMpOworCisgIHJldHVybiAxOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgY29uc3QgY2hhciAqaW5wdXRfZmlsZTsKKyAgRklMRSAqZjsKKworICBpZiAoYXJnYyAhPSAyKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIlcyA8dGVzdCBmaWxlPlxuIiwgYXJndlswXSk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpbnB1dF9maWxlID0gYXJndlsxXTsKKworICBmID0gZm9wZW4oaW5wdXRfZmlsZSwgInIiKTsKKyAgaWYgKCFmKSB7CisgICAgcGVycm9yKGlucHV0X2ZpbGUpOworICAgIHJldHVybiAyOworICB9CisKKyAgRVJSX2xvYWRfY3J5cHRvX3N0cmluZ3MoKTsKKworICBmb3IgKDs7KSB7CisgICAgY2hhciBsaW5lWzQwOTZdOworICAgIGNoYXIgKnA7CisgICAgY2hhciAqY2lwaGVyOworICAgIHVpbnQ4X3QgKml2LCAqa2V5LCAqcGxhaW50ZXh0LCAqY2lwaGVydGV4dCwgKmFhZCwgKnRhZzsKKyAgICBpbnQgZW5jZGVjOworICAgIGludCBrbiwgaW4sIHBuLCBjbjsKKyAgICBpbnQgYW4gPSAwOworICAgIGludCB0biA9IDA7CisKKyAgICBpZiAoIWZnZXRzKChjaGFyICopbGluZSwgc2l6ZW9mIGxpbmUsIGYpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGxpbmVbMF0gPT0gJyMnIHx8IGxpbmVbMF0gPT0gJ1xuJykgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIHAgPSBsaW5lOworICAgIGNpcGhlciA9IHNzdHJzZXAoJnAsICI6Iik7CisgICAga2V5ID0gdXN0cnNlcCgmcCwgIjoiKTsKKyAgICBpdiA9IHVzdHJzZXAoJnAsICI6Iik7CisgICAgcGxhaW50ZXh0ID0gdXN0cnNlcCgmcCwgIjoiKTsKKyAgICBjaXBoZXJ0ZXh0ID0gdXN0cnNlcCgmcCwgIjoiKTsKKyAgICBpZiAocFstMV0gPT0gJ1xuJykgeworICAgICAgZW5jZGVjID0gLTE7CisgICAgICBwWy0xXSA9ICdcMCc7CisgICAgICB0YWcgPSBhYWQgPSBOVUxMOworICAgICAgYW4gPSB0biA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIGFhZCA9IHVzdHJzZXAoJnAsICI6Iik7CisgICAgICB0YWcgPSB1c3Ryc2VwKCZwLCAiOiIpOworICAgICAgaWYgKHRhZyA9PSBOVUxMKSB7CisgICAgICAgIHAgPSAoY2hhciAqKWFhZDsKKyAgICAgICAgdGFnID0gYWFkID0gTlVMTDsKKyAgICAgICAgYW4gPSB0biA9IDA7CisgICAgICB9CisgICAgICBpZiAocFstMV0gPT0gJ1xuJykgeworICAgICAgICBlbmNkZWMgPSAtMTsKKyAgICAgICAgcFstMV0gPSAnXDAnOworICAgICAgfSBlbHNlCisgICAgICAgIGVuY2RlYyA9IGF0b2koc3N0cnNlcCgmcCwgIlxuIikpOworICAgIH0KKworICAgIGtuID0gY29udmVydChrZXkpOworICAgIGluID0gY29udmVydChpdik7CisgICAgcG4gPSBjb252ZXJ0KHBsYWludGV4dCk7CisgICAgY24gPSBjb252ZXJ0KGNpcGhlcnRleHQpOworICAgIGlmIChhYWQpIHsKKyAgICAgIGFuID0gY29udmVydChhYWQpOworICAgICAgdG4gPSBjb252ZXJ0KHRhZyk7CisgICAgfQorCisgICAgaWYgKCF0ZXN0X2NpcGhlcihjaXBoZXIsIGtleSwga24sIGl2LCBpbiwgcGxhaW50ZXh0LCBwbiwgY2lwaGVydGV4dCwgY24sCisgICAgICAgICAgICAgICAgICAgICBhYWQsIGFuLCB0YWcsIHRuLCBlbmNkZWMpKSB7CisgICAgICByZXR1cm4gMzsKKyAgICB9CisgIH0KKyAgZmNsb3NlKGYpOworCisgIHByaW50ZigiUEFTU1xuIik7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2NpcGhlci9jaXBoZXJfdGVzdC50eHQgYi9jcnlwdG8vY2lwaGVyL2NpcGhlcl90ZXN0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjUwZGYzCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2NpcGhlci9jaXBoZXJfdGVzdC50eHQKQEAgLTAsMCArMSw4MSBAQAorIyBSQzQgdGVzdHMgKGZyb20gcmM0dGVzdCkKK1JDNDowMTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OWFiY2RlZjo6MDEyMzQ1Njc4OWFiY2RlZjo3NWI3ODc4MDk5ZTBjNTk2CitSQzQ6MDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWY6OjAwMDAwMDAwMDAwMDAwMDA6NzQ5NGMyZTcxMDRiMDg3OQorUkM0OjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOjowMDAwMDAwMDAwMDAwMDAwOmRlMTg4OTQxYTMzNzVkM2EKK1JDNDplZjAxMjM0NWVmMDEyMzQ1ZWYwMTIzNDVlZjAxMjM0NTo6MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDpkNmExNDFhN2VjM2MzOGRmYmQ2MTVhMTE2MmUxYzdiYTM2YjY3ODU4CitSQzQ6MDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWY6OjEyMzQ1Njc4OUFCQ0RFRjAxMjM0NTY3ODlBQkNERUYwMTIzNDU2Nzg5QUJDREVGMDEyMzQ1Njc4OjY2YTA5NDlmOGFmN2Q2ODkxZjdmODMyYmE4MzNjMDBjODkyZWJlMzAxNDNjZTI4NzQwMDExZWNmCitSQzQ6ZWYwMTIzNDVlZjAxMjM0NWVmMDEyMzQ1ZWYwMTIzNDU6OjAwMDAwMDAwMDAwMDAwMDAwMDAwOmQ2YTE0MWE3ZWMzYzM4ZGZiZDYxCisKKyMgREVTIEVERTMgQ0JDIHRlc3RzIChmcm9tIGRlc3Rlc3QpCitERVMtRURFMy1DQkM6MDEyMzQ1Njc4OWFiY2RlZmYxZTBkM2MyYjVhNDk3ODZmZWRjYmE5ODc2NTQzMjEwOmZlZGNiYTk4NzY1NDMyMTA6MzczNjM1MzQzMzMyMzEyMDRFNkY3NzIwNjk3MzIwNzQ2ODY1MjA3NDY5NkQ2NTIwNjY2RjcyMjAwMDAwMDAwMDozRkUzMDFDOTYyQUMwMUQwMjIxMzc2M0MxQ0JENENEQzc5OTY1N0MwNjRFQ0Y1RDQxQzY3MzgxMkNGREU5Njc1CisKKyMgQUVTIDEyOCBFQ0IgdGVzdHMgKGZyb20gRklQUy0xOTcgdGVzdCB2ZWN0b3JzLCBlbmNyeXB0KQorQUVTLTEyOC1FQ0I6MDAwMTAyMDMwNDA1MDYwNzA4MDkwQTBCMEMwRDBFMEY6OjAwMTEyMjMzNDQ1NTY2Nzc4ODk5QUFCQkNDRERFRUZGOjY5QzRFMEQ4NkE3QjA0MzBEOENEQjc4MDcwQjRDNTVBOjEKKworIyBBRVMgMjU2IEVDQiB0ZXN0cyAoZnJvbSBGSVBTLTE5NyB0ZXN0IHZlY3RvcnMsIGVuY3J5cHQpCitBRVMtMjU2LUVDQjowMDAxMDIwMzA0MDUwNjA3MDgwOTBBMEIwQzBEMEUwRjEwMTExMjEzMTQxNTE2MTcxODE5MUExQjFDMUQxRTFGOjowMDExMjIzMzQ0NTU2Njc3ODg5OUFBQkJDQ0RERUVGRjo4RUEyQjdDQTUxNjc0NUJGRUFGQzQ5OTA0QjQ5NjA4OToxCisKKyMgQUVTIDEyOCBDQkMgdGVzdHMgKGZyb20gTklTVCB0ZXN0IHZlY3RvcnMsIGRlY3J5cHQpCisKKyMgQUVTIHRlc3RzIGZyb20gTklTVCBkb2N1bWVudCBTUDgwMC0zOEEKKyMgRm9yIGFsbCBFQ0IgZW5jcnlwdHMgYW5kIGRlY3J5cHRzLCB0aGUgdHJhbnNmb3JtZWQgc2VxdWVuY2UgaXMKKyMgICBBRVMtYml0cy1FQ0I6a2V5OjpwbGFpbnRleHQ6Y2lwaGVydGV4dDplbmNkZWMKKyMgRUNCLUFFUzEyOC5FbmNyeXB0IGFuZCBFQ0ItQUVTMTI4LkRlY3J5cHQKK0FFUy0xMjgtRUNCOjJCN0UxNTE2MjhBRUQyQTZBQkY3MTU4ODA5Q0Y0RjNDOjo2QkMxQkVFMjJFNDA5Rjk2RTkzRDdFMTE3MzkzMTcyQTozQUQ3N0JCNDBEN0EzNjYwQTg5RUNBRjMyNDY2RUY5NworQUVTLTEyOC1FQ0I6MkI3RTE1MTYyOEFFRDJBNkFCRjcxNTg4MDlDRjRGM0M6OkFFMkQ4QTU3MUUwM0FDOUM5RUI3NkZBQzQ1QUY4RTUxOkY1RDNENTg1MDNCOTY5OURFNzg1ODk1QTk2RkRCQUFGCitBRVMtMTI4LUVDQjoyQjdFMTUxNjI4QUVEMkE2QUJGNzE1ODgwOUNGNEYzQzo6MzBDODFDNDZBMzVDRTQxMUU1RkJDMTE5MUEwQTUyRUY6NDNCMUNEN0Y1OThFQ0UyMzg4MUIwMEUzRUQwMzA2ODgKK0FFUy0xMjgtRUNCOjJCN0UxNTE2MjhBRUQyQTZBQkY3MTU4ODA5Q0Y0RjNDOjpGNjlGMjQ0NURGNEY5QjE3QUQyQjQxN0JFNjZDMzcxMDo3QjBDNzg1RTI3RThBRDNGODIyMzIwNzEwNDcyNURENAorIyBFQ0ItQUVTMjU2LkVuY3J5cHQgYW5kIEVDQi1BRVMyNTYuRGVjcnlwdAorQUVTLTI1Ni1FQ0I6NjAzREVCMTAxNUNBNzFCRTJCNzNBRUYwODU3RDc3ODExRjM1MkMwNzNCNjEwOEQ3MkQ5ODEwQTMwOTE0REZGNDo6NkJDMUJFRTIyRTQwOUY5NkU5M0Q3RTExNzM5MzE3MkE6RjNFRUQxQkRCNUQyQTAzQzA2NEI1QTdFM0RCMTgxRjgKK0FFUy0yNTYtRUNCOjYwM0RFQjEwMTVDQTcxQkUyQjczQUVGMDg1N0Q3NzgxMUYzNTJDMDczQjYxMDhENzJEOTgxMEEzMDkxNERGRjQ6OkFFMkQ4QTU3MUUwM0FDOUM5RUI3NkZBQzQ1QUY4RTUxOjU5MUNDQjEwRDQxMEVEMjZEQzVCQTc0QTMxMzYyODcwCitBRVMtMjU2LUVDQjo2MDNERUIxMDE1Q0E3MUJFMkI3M0FFRjA4NTdENzc4MTFGMzUyQzA3M0I2MTA4RDcyRDk4MTBBMzA5MTRERkY0OjozMEM4MUM0NkEzNUNFNDExRTVGQkMxMTkxQTBBNTJFRjpCNkVEMjFCOTlDQTZGNEY5RjE1M0U3QjFCRUFGRUQxRAorQUVTLTI1Ni1FQ0I6NjAzREVCMTAxNUNBNzFCRTJCNzNBRUYwODU3RDc3ODExRjM1MkMwNzNCNjEwOEQ3MkQ5ODEwQTMwOTE0REZGNDo6RjY5RjI0NDVERjRGOUIxN0FEMkI0MTdCRTY2QzM3MTA6MjMzMDRCN0EzOUY5RjNGRjA2N0Q4RDhGOUUyNEVDQzcKKyMgRm9yIGFsbCBDQkMgZW5jcnlwdHMgYW5kIGRlY3J5cHRzLCB0aGUgdHJhbnNmb3JtZWQgc2VxdWVuY2UgaXMKKyMgICBBRVMtYml0cy1DQkM6a2V5OklWL2NpcGhlcnRleHQnOnBsYWludGV4dDpjaXBoZXJ0ZXh0OmVuY2RlYworIyBDQkMtQUVTMTI4LkVuY3J5cHQgYW5kIENCQy1BRVMxMjguRGVjcnlwdAorQUVTLTEyOC1DQkM6MkI3RTE1MTYyOEFFRDJBNkFCRjcxNTg4MDlDRjRGM0M6MDAwMTAyMDMwNDA1MDYwNzA4MDkwQTBCMEMwRDBFMEY6NkJDMUJFRTIyRTQwOUY5NkU5M0Q3RTExNzM5MzE3MkE6NzY0OUFCQUM4MTE5QjI0NkNFRTk4RTlCMTJFOTE5N0QKK0FFUy0xMjgtQ0JDOjJCN0UxNTE2MjhBRUQyQTZBQkY3MTU4ODA5Q0Y0RjNDOjc2NDlBQkFDODExOUIyNDZDRUU5OEU5QjEyRTkxOTdEOkFFMkQ4QTU3MUUwM0FDOUM5RUI3NkZBQzQ1QUY4RTUxOjUwODZDQjlCNTA3MjE5RUU5NURCMTEzQTkxNzY3OEIyCitBRVMtMTI4LUNCQzoyQjdFMTUxNjI4QUVEMkE2QUJGNzE1ODgwOUNGNEYzQzo1MDg2Q0I5QjUwNzIxOUVFOTVEQjExM0E5MTc2NzhCMjozMEM4MUM0NkEzNUNFNDExRTVGQkMxMTkxQTBBNTJFRjo3M0JFRDZCOEUzQzE3NDNCNzExNkU2OUUyMjIyOTUxNgorQUVTLTEyOC1DQkM6MkI3RTE1MTYyOEFFRDJBNkFCRjcxNTg4MDlDRjRGM0M6NzNCRUQ2QjhFM0MxNzQzQjcxMTZFNjlFMjIyMjk1MTY6RjY5RjI0NDVERjRGOUIxN0FEMkI0MTdCRTY2QzM3MTA6M0ZGMUNBQTE2ODFGQUMwOTEyMEVDQTMwNzU4NkUxQTcKKyMgQ0JDLUFFUzI1Ni5FbmNyeXB0IGFuZCBDQkMtQUVTMjU2LkRlY3J5cHQKK0FFUy0yNTYtQ0JDOjYwM0RFQjEwMTVDQTcxQkUyQjczQUVGMDg1N0Q3NzgxMUYzNTJDMDczQjYxMDhENzJEOTgxMEEzMDkxNERGRjQ6MDAwMTAyMDMwNDA1MDYwNzA4MDkwQTBCMEMwRDBFMEY6NkJDMUJFRTIyRTQwOUY5NkU5M0Q3RTExNzM5MzE3MkE6RjU4QzRDMDRENkU1RjFCQTc3OUVBQkZCNUY3QkZCRDYKK0FFUy0yNTYtQ0JDOjYwM0RFQjEwMTVDQTcxQkUyQjczQUVGMDg1N0Q3NzgxMUYzNTJDMDczQjYxMDhENzJEOTgxMEEzMDkxNERGRjQ6RjU4QzRDMDRENkU1RjFCQTc3OUVBQkZCNUY3QkZCRDY6QUUyRDhBNTcxRTAzQUM5QzlFQjc2RkFDNDVBRjhFNTE6OUNGQzRFOTY3RURCODA4RDY3OUY3NzdCQzY3MDJDN0QKK0FFUy0yNTYtQ0JDOjYwM0RFQjEwMTVDQTcxQkUyQjczQUVGMDg1N0Q3NzgxMUYzNTJDMDczQjYxMDhENzJEOTgxMEEzMDkxNERGRjQ6OUNGQzRFOTY3RURCODA4RDY3OUY3NzdCQzY3MDJDN0Q6MzBDODFDNDZBMzVDRTQxMUU1RkJDMTE5MUEwQTUyRUY6MzlGMjMzNjlBOUQ5QkFDRkE1MzBFMjYzMDQyMzE0NjEKK0FFUy0yNTYtQ0JDOjYwM0RFQjEwMTVDQTcxQkUyQjczQUVGMDg1N0Q3NzgxMUYzNTJDMDczQjYxMDhENzJEOTgxMEEzMDkxNERGRjQ6MzlGMjMzNjlBOUQ5QkFDRkE1MzBFMjYzMDQyMzE0NjE6RjY5RjI0NDVERjRGOUIxN0FEMkI0MTdCRTY2QzM3MTA6QjJFQjA1RTJDMzlCRTlGQ0RBNkMxOTA3OEM2QTlEMUIKKworIyBBRVMgQ291bnRlciB0ZXN0IHZlY3RvcnMgZnJvbSBSRkMzNjg2CitBRVMtMTI4LUNUUjpBRTY4NTJGODEyMTA2N0NDNEJGN0E1NzY1NTc3RjM5RTowMDAwMDAzMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTo1MzY5NkU2NzZDNjUyMDYyNkM2RjYzNkIyMDZENzM2NzpFNDA5NUQ0RkI3QTdCMzc5MkQ2MTc1QTMyNjEzMTFCODoxCitBRVMtMTI4LUNUUjo3RTI0MDY3ODE3RkFFMEQ3NDNENkNFMUYzMjUzOTE2MzowMDZDQjZEQkMwNTQzQjU5REE0OEQ5MEIwMDAwMDAwMTowMDAxMDIwMzA0MDUwNjA3MDgwOTBBMEIwQzBEMEUwRjEwMTExMjEzMTQxNTE2MTcxODE5MUExQjFDMUQxRTFGOjUxMDRBMTA2MTY4QTcyRDk3OTBENDFFRThFREFEMzg4RUIyRTFFRkM0NkRBNTdDOEZDRTYzMERGOTE0MUJFMjg6MQorQUVTLTEyOC1DVFI6NzY5MUJFMDM1RTUwMjBBOEFDNkU2MTg1MjlGOUEwREM6MDBFMDAxN0IyNzc3N0YzRjRBMTc4NkYwMDAwMDAwMDE6MDAwMTAyMDMwNDA1MDYwNzA4MDkwQTBCMEMwRDBFMEYxMDExMTIxMzE0MTUxNjE3MTgxOTFBMUIxQzFEMUUxRjIwMjEyMjIzOkMxQ0Y0OEE4OUYyRkZERDlDRjQ2NTJFOUVGREI3MkQ3NDU0MEE0MkJERTZENzgzNkQ1OUE1Q0VBQUVGMzEwNTMyNUIyMDcyRjoxCisKK0FFUy0yNTYtQ1RSOjc3NkJFRkYyODUxREIwNkY0QzhBMDU0MkM4Njk2RjZDNkE4MUFGMUVFQzk2QjREMzdGQzFENjg5RTZDMUMxMDQ6MDAwMDAwNjBEQjU2NzJDOTdBQThGMEIyMDAwMDAwMDE6NTM2OTZFNjc2QzY1MjA2MjZDNkY2MzZCMjA2RDczNjc6MTQ1QUQwMURCRjgyNEVDNzU2MDg2M0RDNzFFM0UwQzA6MQorQUVTLTI1Ni1DVFI6RjZENjZENkJENTJENTlCQjA3OTYzNjU4NzlFRkY4ODZDNjZERDUxQTVCNkE5OTc0NEI1MDU5MEM4N0EyMzg4NDowMEZBQUMyNEMxNTg1RUYxNUE0M0Q4NzUwMDAwMDAwMTowMDAxMDIwMzA0MDUwNjA3MDgwOTBBMEIwQzBEMEUwRjEwMTExMjEzMTQxNTE2MTcxODE5MUExQjFDMUQxRTFGOkYwNUUyMzFCMzg5NDYxMkM0OUVFMDAwQjgwNEVCMkE5QjgzMDZCNTA4RjgzOUQ2QTU1MzA4MzFEOTM0NEFGMUM6MQorQUVTLTI1Ni1DVFI6RkY3QTYxN0NFNjkxNDhFNEYxNzI2RTJGNDM1ODFERTJBQTYyRDlGODA1NTMyRURGRjFFRUQ2ODdGQjU0MTUzRDowMDFDQzVCNzUxQTUxRDcwQTFDMTExNDgwMDAwMDAwMTowMDAxMDIwMzA0MDUwNjA3MDgwOTBBMEIwQzBEMEUwRjEwMTExMjEzMTQxNTE2MTcxODE5MUExQjFDMUQxRTFGMjAyMTIyMjM6RUI2QzUyODIxRDBCQkJGN0NFNzU5NDQ2MkFDQTRGQUFCNDA3REY4NjY1NjlGRDA3RjQ4Q0MwQjU4M0Q2MDcxRjFFQzBFNkI4OjEKKworIyBBRVMgR0NNIHRlc3QgdmVjdG9ycyBmcm9tIGh0dHA6Ly9jc3JjLm5pc3QuZ292L2dyb3Vwcy9TVC90b29sa2l0L0JDTS9kb2N1bWVudHMvcHJvcG9zZWRtb2Rlcy9nY20vZ2NtLXNwZWMucGRmCitBRVMtMTI4LUdDTTowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA6Ojo6NThlMmZjY2VmYTdlMzA2MTM2N2YxZDU3YTRlNzQ1NWEKK0FFUy0xMjgtR0NNOjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDowMzg4ZGFjZTYwYjZhMzkyZjMyOGMyYjk3MWIyZmU3ODo6YWI2ZTQ3ZDQyY2VjMTNiZGY1M2E2N2IyMTI1N2JkZGYKK0FFUy0xMjgtR0NNOmZlZmZlOTkyODY2NTczMWM2ZDZhOGY5NDY3MzA4MzA4OmNhZmViYWJlZmFjZWRiYWRkZWNhZjg4ODpkOTMxMzIyNWY4ODQwNmU1YTU1OTA5YzVhZmY1MjY5YTg2YTdhOTUzMTUzNGY3ZGEyZTRjMzAzZDhhMzE4YTcyMWMzYzBjOTU5NTY4MDk1MzJmY2YwZTI0NDlhNmI1MjViMTZhZWRmNWFhMGRlNjU3YmE2MzdiMzkxYWFmZDI1NTo0MjgzMWVjMjIxNzc3NDI0NGI3MjIxYjc4NGQwZDQ5Y2UzYWEyMTJmMmMwMmE0ZTAzNWMxN2UyMzI5YWNhMTJlMjFkNTE0YjI1NDY2OTMxYzdkOGY2YTVhYWM4NGFhMDUxYmEzMGIzOTZhMGFhYzk3M2Q1OGUwOTE0NzNmNTk4NTo6NGQ1YzJhZjMyN2NkNjRhNjJjZjM1YWJkMmJhNmZhYjQKK0FFUy0xMjgtR0NNOmZlZmZlOTkyODY2NTczMWM2ZDZhOGY5NDY3MzA4MzA4OmNhZmViYWJlZmFjZWRiYWRkZWNhZjg4ODpkOTMxMzIyNWY4ODQwNmU1YTU1OTA5YzVhZmY1MjY5YTg2YTdhOTUzMTUzNGY3ZGEyZTRjMzAzZDhhMzE4YTcyMWMzYzBjOTU5NTY4MDk1MzJmY2YwZTI0NDlhNmI1MjViMTZhZWRmNWFhMGRlNjU3YmE2MzdiMzk6NDI4MzFlYzIyMTc3NzQyNDRiNzIyMWI3ODRkMGQ0OWNlM2FhMjEyZjJjMDJhNGUwMzVjMTdlMjMyOWFjYTEyZTIxZDUxNGIyNTQ2NjkzMWM3ZDhmNmE1YWFjODRhYTA1MWJhMzBiMzk2YTBhYWM5NzNkNThlMDkxOmZlZWRmYWNlZGVhZGJlZWZmZWVkZmFjZWRlYWRiZWVmYWJhZGRhZDI6NWJjOTRmYmMzMjIxYTVkYjk0ZmFlOTVhZTcxMjFhNDcKK0FFUy0xMjgtR0NNOmZlZmZlOTkyODY2NTczMWM2ZDZhOGY5NDY3MzA4MzA4OmNhZmViYWJlZmFjZWRiYWQ6ZDkzMTMyMjVmODg0MDZlNWE1NTkwOWM1YWZmNTI2OWE4NmE3YTk1MzE1MzRmN2RhMmU0YzMwM2Q4YTMxOGE3MjFjM2MwYzk1OTU2ODA5NTMyZmNmMGUyNDQ5YTZiNTI1YjE2YWVkZjVhYTBkZTY1N2JhNjM3YjM5OjYxMzUzYjRjMjgwNjkzNGE3NzdmZjUxZmEyMmE0NzU1Njk5YjJhNzE0ZmNkYzZmODM3NjZlNWY5N2I2Yzc0MjM3MzgwNjkwMGU0OWYyNGIyMmIwOTc1NDRkNDg5NmI0MjQ5ODliNWUxZWJhYzBmMDdjMjNmNDU5ODpmZWVkZmFjZWRlYWRiZWVmZmVlZGZhY2VkZWFkYmVlZmFiYWRkYWQyOjM2MTJkMmU3OWUzYjA3ODU1NjFiZTE0YWFjYTJmY2NiCitBRVMtMTI4LUdDTTpmZWZmZTk5Mjg2NjU3MzFjNmQ2YThmOTQ2NzMwODMwODo5MzEzMjI1ZGY4ODQwNmU1NTU5MDljNWFmZjUyNjlhYTZhN2E5NTM4NTM0ZjdkYTFlNGMzMDNkMmEzMThhNzI4YzNjMGM5NTE1NjgwOTUzOWZjZjBlMjQyOWE2YjUyNTQxNmFlZGJmNWEwZGU2YTU3YTYzN2IzOWI6ZDkzMTMyMjVmODg0MDZlNWE1NTkwOWM1YWZmNTI2OWE4NmE3YTk1MzE1MzRmN2RhMmU0YzMwM2Q4YTMxOGE3MjFjM2MwYzk1OTU2ODA5NTMyZmNmMGUyNDQ5YTZiNTI1YjE2YWVkZjVhYTBkZTY1N2JhNjM3YjM5OjhjZTI0OTk4NjI1NjE1YjYwM2EwMzNhY2ExM2ZiODk0YmU5MTEyYTVjM2EyMTFhOGJhMjYyYTNjY2E3ZTJjYTcwMWU0YTlhNGZiYTQzYzkwY2NkY2IyODFkNDhjN2M2ZmQ2Mjg3NWQyYWNhNDE3MDM0YzM0YWVlNTpmZWVkZmFjZWRlYWRiZWVmZmVlZGZhY2VkZWFkYmVlZmFiYWRkYWQyOjYxOWNjNWFlZmZmZTBiZmE0NjJhZjQzYzE2OTlkMDUwCitBRVMtMjU2LUdDTTowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDo6Ojo1MzBmOGFmYmM3NDUzNmI5YTk2M2I0ZjFjNGNiNzM4YgorQUVTLTI1Ni1HQ006MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA6MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA6Y2VhNzQwM2Q0ZDYwNmI2ZTA3NGVjNWQzYmFmMzlkMTg6OmQwZDFjOGE3OTk5OTZiZjAyNjViOThiNWQ0OGFiOTE5CitBRVMtMjU2LUdDTTpmZWZmZTk5Mjg2NjU3MzFjNmQ2YThmOTQ2NzMwODMwOGZlZmZlOTkyODY2NTczMWM2ZDZhOGY5NDY3MzA4MzA4OmNhZmViYWJlZmFjZWRiYWRkZWNhZjg4ODpkOTMxMzIyNWY4ODQwNmU1YTU1OTA5YzVhZmY1MjY5YTg2YTdhOTUzMTUzNGY3ZGEyZTRjMzAzZDhhMzE4YTcyMWMzYzBjOTU5NTY4MDk1MzJmY2YwZTI0NDlhNmI1MjViMTZhZWRmNWFhMGRlNjU3YmE2MzdiMzkxYWFmZDI1NTo1MjJkYzFmMDk5NTY3ZDA3ZjQ3ZjM3YTMyYTg0NDI3ZDY0M2E4Y2RjYmZlNWMwYzk3NTk4YTJiZDI1NTVkMWFhOGNiMDhlNDg1OTBkYmIzZGE3YjA4YjEwNTY4Mjg4MzhjNWY2MWU2MzkzYmE3YTBhYmNjOWY2NjI4OTgwMTVhZDo6YjA5NGRhYzVkOTM0NzFiZGVjMWE1MDIyNzBlM2NjNmMKK0FFUy0yNTYtR0NNOmZlZmZlOTkyODY2NTczMWM2ZDZhOGY5NDY3MzA4MzA4ZmVmZmU5OTI4NjY1NzMxYzZkNmE4Zjk0NjczMDgzMDg6Y2FmZWJhYmVmYWNlZGJhZGRlY2FmODg4OmQ5MzEzMjI1Zjg4NDA2ZTVhNTU5MDljNWFmZjUyNjlhODZhN2E5NTMxNTM0ZjdkYTJlNGMzMDNkOGEzMThhNzIxYzNjMGM5NTk1NjgwOTUzMmZjZjBlMjQ0OWE2YjUyNWIxNmFlZGY1YWEwZGU2NTdiYTYzN2IzOTo1MjJkYzFmMDk5NTY3ZDA3ZjQ3ZjM3YTMyYTg0NDI3ZDY0M2E4Y2RjYmZlNWMwYzk3NTk4YTJiZDI1NTVkMWFhOGNiMDhlNDg1OTBkYmIzZGE3YjA4YjEwNTY4Mjg4MzhjNWY2MWU2MzkzYmE3YTBhYmNjOWY2NjI6ZmVlZGZhY2VkZWFkYmVlZmZlZWRmYWNlZGVhZGJlZWZhYmFkZGFkMjo3NmZjNmVjZTBmNGUxNzY4Y2RkZjg4NTNiYjJkNTUxYgorQUVTLTI1Ni1HQ006ZmVmZmU5OTI4NjY1NzMxYzZkNmE4Zjk0NjczMDgzMDhmZWZmZTk5Mjg2NjU3MzFjNmQ2YThmOTQ2NzMwODMwODpjYWZlYmFiZWZhY2VkYmFkOmQ5MzEzMjI1Zjg4NDA2ZTVhNTU5MDljNWFmZjUyNjlhODZhN2E5NTMxNTM0ZjdkYTJlNGMzMDNkOGEzMThhNzIxYzNjMGM5NTk1NjgwOTUzMmZjZjBlMjQ0OWE2YjUyNWIxNmFlZGY1YWEwZGU2NTdiYTYzN2IzOTpjMzc2MmRmMWNhNzg3ZDMyYWU0N2MxM2JmMTk4NDRjYmFmMWFlMTRkMGI5NzZhZmFjNTJmZjdkNzliYmE5ZGUwZmViNTgyZDMzOTM0YTRmMDk1NGNjMjM2M2JjNzNmNzg2MmFjNDMwZTY0YWJlNDk5ZjQ3YzliMWY6ZmVlZGZhY2VkZWFkYmVlZmZlZWRmYWNlZGVhZGJlZWZhYmFkZGFkMjozYTMzN2RiZjQ2YTc5MmM0NWU0NTQ5MTNmZTJlYThmMgorQUVTLTI1Ni1HQ006ZmVmZmU5OTI4NjY1NzMxYzZkNmE4Zjk0NjczMDgzMDhmZWZmZTk5Mjg2NjU3MzFjNmQ2YThmOTQ2NzMwODMwODo5MzEzMjI1ZGY4ODQwNmU1NTU5MDljNWFmZjUyNjlhYTZhN2E5NTM4NTM0ZjdkYTFlNGMzMDNkMmEzMThhNzI4YzNjMGM5NTE1NjgwOTUzOWZjZjBlMjQyOWE2YjUyNTQxNmFlZGJmNWEwZGU2YTU3YTYzN2IzOWI6ZDkzMTMyMjVmODg0MDZlNWE1NTkwOWM1YWZmNTI2OWE4NmE3YTk1MzE1MzRmN2RhMmU0YzMwM2Q4YTMxOGE3MjFjM2MwYzk1OTU2ODA5NTMyZmNmMGUyNDQ5YTZiNTI1YjE2YWVkZjVhYTBkZTY1N2JhNjM3YjM5OjVhOGRlZjJmMGM5ZTUzZjFmNzVkNzg1MzY1OWUyYTIwZWViMmIyMmFhZmRlNjQxOWEwNThhYjRmNmY3NDZiZjQwZmMwYzNiNzgwZjI0NDQ1MmRhM2ViZjFjNWQ4MmNkZWEyNDE4OTk3MjAwZWY4MmU0NGFlN2UzZjpmZWVkZmFjZWRlYWRiZWVmZmVlZGZhY2VkZWFkYmVlZmFiYWRkYWQyOmE0NGE4MjY2ZWUxYzhlYjBjOGI1ZDRjZjVhZTlmMTlhCisjIGxvY2FsIGFkZC1vbnMsIHByaW1hcmlseSBzdHJlYW1pbmcgZ2hhc2ggdGVzdHMKKyMgMTI4IGJ5dGVzIGFhZAorQUVTLTEyOC1HQ006MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA6MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOjo6ZDkzMTMyMjVmODg0MDZlNWE1NTkwOWM1YWZmNTI2OWE4NmE3YTk1MzE1MzRmN2RhMmU0YzMwM2Q4YTMxOGE3MjFjM2MwYzk1OTU2ODA5NTMyZmNmMGUyNDQ5YTZiNTI1YjE2YWVkZjVhYTBkZTY1N2JhNjM3YjM5MWFhZmQyNTU1MjJkYzFmMDk5NTY3ZDA3ZjQ3ZjM3YTMyYTg0NDI3ZDY0M2E4Y2RjYmZlNWMwYzk3NTk4YTJiZDI1NTVkMWFhOGNiMDhlNDg1OTBkYmIzZGE3YjA4YjEwNTY4Mjg4MzhjNWY2MWU2MzkzYmE3YTBhYmNjOWY2NjI4OTgwMTVhZDo1ZmVhNzkzYTJkNmY5NzRkMzdlNjhlMGNiOGZmOTQ5MgorIyA0OCBieXRlcyBwbGFpbnRleHQKK0FFUy0xMjgtR0NNOjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA6MDM4OGRhY2U2MGI2YTM5MmYzMjhjMmI5NzFiMmZlNzhmNzk1YWFhYjQ5NGI1OTIzZjdmZDg5ZmY5NDhiYzFlMDIwMDIxMTIxNGU3Mzk0ZGEyMDg5YjZhY2QwOTNhYmUwOjo5ZGQwYTM3NmIwOGU0MGViMDBjMzVmMjlmOWVhNjFhNAorIyA4MCBieXRlcyBwbGFpbnRleHQKK0FFUy0xMjgtR0NNOjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOjAzODhkYWNlNjBiNmEzOTJmMzI4YzJiOTcxYjJmZTc4Zjc5NWFhYWI0OTRiNTkyM2Y3ZmQ4OWZmOTQ4YmMxZTAyMDAyMTEyMTRlNzM5NGRhMjA4OWI2YWNkMDkzYWJlMGM5NGRhMjE5MTE4ZTI5N2Q3YjdlYmNiY2M5YzM4OGYyOGFkZTdkODVhOGVlMzU2MTZmNzEyNGE5ZDUyNzAyOTE6Ojk4ODg1YTNhMjJiZDQ3NDJmZTdiNzIxNzIxOTNiMTYzCisjIDEyOCBieXRlcyBwbGFpbnRleHQKK0FFUy0xMjgtR0NNOjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOjAzODhkYWNlNjBiNmEzOTJmMzI4YzJiOTcxYjJmZTc4Zjc5NWFhYWI0OTRiNTkyM2Y3ZmQ4OWZmOTQ4YmMxZTAyMDAyMTEyMTRlNzM5NGRhMjA4OWI2YWNkMDkzYWJlMGM5NGRhMjE5MTE4ZTI5N2Q3YjdlYmNiY2M5YzM4OGYyOGFkZTdkODVhOGVlMzU2MTZmNzEyNGE5ZDUyNzAyOTE5NWI4NGQxYjk2YzY5MGZmMmYyZGUzMGJmMmVjODllMDAyNTM3ODZlMTI2NTA0ZjBkYWI5MGM0OGEzMDMyMWRlMzM0NWU2YjA0NjFlN2M5ZTZjNmI3YWZlZGRlODNmNDA6OmNhYzQ1ZjYwZTMxZWZkM2I1YTQzYjk4YTIyY2UxYWExCisjIDE5MiBieXRlcyBwbGFpbnRleHQsIGl2IGlzIGNob3NlbiBzbyB0aGF0IGluaXRpYWwgY291bnRlciBMU0IgaXMgMHhGRgorQUVTLTEyOC1HQ006MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA6ZmZmZmZmZmYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA6MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOjU2YjMzNzNjYTllZjZlNGEyYjY0ZmUxZTlhMTdiNjE0MjVmMTBkNDdhNzVhNWZjZTEzZWZjNmJjNzg0YWYyNGY0MTQxYmRkNDhjZjdjNzcwODg3YWZkNTczY2NhNTQxOGE5YWVmZmNkN2M1Y2VkZGZjNmE3ODM5N2I5YTg1YjQ5OWRhNTU4MjU3MjY3Y2FhYjJhZDBiMjNjYTQ3NmE1M2NiMTdmYjQxYzRiOGI0NzVjYjRmM2Y3MTY1MDk0YzIyOWM5ZThjNGRjMGEyYTVmZjE5MDNlNTAxNTExMjIxMzc2YTFjZGI4MzY0YzUwNjFhMjBjYWU3NGJjNGFjZDc2Y2ViMGFiYzlmZDMyMTdlZjlmOGM5MGJlNDAyZGRmNmQ4Njk3ZjRmODgwZGZmMTViZmI3YTZiMjgyNDFlYzhmZTE4M2MyZDU5ZTNmOWRmZmY2NTNjNzEyNmYwYWNiOWU2NDIxMWY0MmJhZTEyYWY0NjJiMTA3MGJlZjFhYjVlMzYwNjo6NTY2ZjhlZjY4MzA3OGJmZGVlZmZhODY5ZDc1MWEwMTcKKyMgODAgYnl0ZXMgcGxhaW50ZXh0LCBzdWJtaXR0ZWQgYnkgSW50ZWwKK0FFUy0xMjgtR0NNOjg0M2ZmY2Y1ZDJiNzI2OTRkMTllZDAxZDAxMjQ5NDEyOmRiY2NhMzJlYmY5YjgwNDYxN2MzYWE5ZTowMDAxMDIwMzA0MDUwNjA3MDgwOTBhMGIwYzBkMGUwZjEwMTExMjEzMTQxNTE2MTcxODE5MWExYjFjMWQxZTFmMjAyMTIyMjMyNDI1MjYyNzI4MjkyYTJiMmMyZDJlMmYzMDMxMzIzMzM0MzUzNjM3MzgzOTNhM2IzYzNkM2UzZjQwNDE0MjQzNDQ0NTQ2NDc0ODQ5NGE0YjRjNGQ0ZTRmOjYyNjhjNmZhMmE4MGIyZDEzNzQ2N2YwOTJmNjU3YWMwNGQ4OWJlMmJlYWE2MjNkNjFiNWE4NjhjOGYwM2ZmOTVkM2RjZWUyM2FkMmYxYWIzYTZjODBlYWY0YjE0MGViMDVkZTM0NTdmMGZiYzExMWE2YjQzZDA3NjNhYTQyMmEzMDEzY2YxZGMzN2ZlNDE3ZDFmYmZjNDQ5Yjc1ZDRjYzU6MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDExMTIxMzE0MTUxNjE3MTgxOTFhMWIxYzFkMWUxZjozYjYyOWNjZmJjMTExOWI3MzE5ZTFkY2UyY2Q2ZmQ2ZAorCmRpZmYgLS1naXQgYS9jcnlwdG8vY2lwaGVyL2Rlcml2ZV9rZXkuYyBiL2NyeXB0by9jaXBoZXIvZGVyaXZlX2tleS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMTYzNGEKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vY2lwaGVyL2Rlcml2ZV9rZXkuYwpAQCAtMCwwICsxLDE1NCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvY2lwaGVyLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvZGlnZXN0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKworI2luY2x1ZGUgImludGVybmFsLmgiCisKKworI2RlZmluZSBQS0NTNV9TQUxUX0xFTiA4CisKK2ludCBFVlBfQnl0ZXNUb0tleShjb25zdCBFVlBfQ0lQSEVSICp0eXBlLCBjb25zdCBFVlBfTUQgKm1kLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNhbHQsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBkYXRhX2xlbiwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjb3VudCwgdWludDhfdCAqa2V5LCB1aW50OF90ICppdikgeworICBFVlBfTURfQ1RYIGM7CisgIHVpbnQ4X3QgbWRfYnVmW0VWUF9NQVhfTURfU0laRV07CisgIHVuc2lnbmVkIG5pdiwgbmtleSwgYWRkbWQgPSAwOworICB1bnNpZ25lZCBtZHMgPSAwLCBpOworICBpbnQgcnYgPSAwOworCisgIG5rZXkgPSB0eXBlLT5rZXlfbGVuOworICBuaXYgPSB0eXBlLT5pdl9sZW47CisKKyAgYXNzZXJ0KG5rZXkgPD0gRVZQX01BWF9LRVlfTEVOR1RIKTsKKyAgYXNzZXJ0KG5pdiA8PSBFVlBfTUFYX0lWX0xFTkdUSCk7CisKKyAgaWYgKGRhdGEgPT0gTlVMTCkgeworICAgIHJldHVybiBua2V5OworICB9CisKKyAgRVZQX01EX0NUWF9pbml0KCZjKTsKKyAgZm9yICg7OykgeworICAgIGlmICghRVZQX0RpZ2VzdEluaXRfZXgoJmMsIG1kLCBOVUxMKSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChhZGRtZCsrKSB7CisgICAgICBpZiAoIUVWUF9EaWdlc3RVcGRhdGUoJmMsIG1kX2J1ZiwgbWRzKSkgeworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFFVlBfRGlnZXN0VXBkYXRlKCZjLCBkYXRhLCBkYXRhX2xlbikpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBpZiAoc2FsdCAhPSBOVUxMKSB7CisgICAgICBpZiAoIUVWUF9EaWdlc3RVcGRhdGUoJmMsIHNhbHQsIFBLQ1M1X1NBTFRfTEVOKSkgeworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFFVlBfRGlnZXN0RmluYWxfZXgoJmMsIG1kX2J1ZiwgJm1kcykpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGZvciAoaSA9IDE7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICBpZiAoIUVWUF9EaWdlc3RJbml0X2V4KCZjLCBtZCwgTlVMTCkgfHwKKyAgICAgICAgICAhRVZQX0RpZ2VzdFVwZGF0ZSgmYywgbWRfYnVmLCBtZHMpIHx8CisgICAgICAgICAgIUVWUF9EaWdlc3RGaW5hbF9leCgmYywgbWRfYnVmLCAmbWRzKSkgeworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpID0gMDsKKyAgICBpZiAobmtleSkgeworICAgICAgZm9yICg7OykgeworICAgICAgICBpZiAobmtleSA9PSAwIHx8IGkgPT0gbWRzKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGtleSAhPSBOVUxMKSB7CisgICAgICAgICAgKihrZXkrKykgPSBtZF9idWZbaV07CisgICAgICAgIH0KKyAgICAgICAgbmtleS0tOworICAgICAgICBpKys7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG5pdiAmJiBpICE9IG1kcykgeworICAgICAgZm9yICg7OykgeworICAgICAgICBpZiAobml2ID09IDAgfHwgaSA9PSBtZHMpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXYgIT0gTlVMTCkgeworICAgICAgICAgICooaXYrKykgPSBtZF9idWZbaV07CisgICAgICAgIH0KKyAgICAgICAgbml2LS07CisgICAgICAgIGkrKzsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG5rZXkgPT0gMCAmJiBuaXYgPT0gMCkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJ2ID0gdHlwZS0+a2V5X2xlbjsKKworZXJyOgorICBFVlBfTURfQ1RYX2NsZWFudXAoJmMpOworICBPUEVOU1NMX2NsZWFuc2UobWRfYnVmLCBFVlBfTUFYX01EX1NJWkUpOworICByZXR1cm4gcnY7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vY2lwaGVyL2VfYWVzLmMgYi9jcnlwdG8vY2lwaGVyL2VfYWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIyZTMwNgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9jaXBoZXIvZV9hZXMuYwpAQCAtMCwwICsxLDkxNSBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDExIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY2lwaGVyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jcHUuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tb2Rlcy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqLmg+CisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIi4uL21vZGVzL2ludGVybmFsLmgiCisKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1bmlvbiB7CisgICAgZG91YmxlIGFsaWduOworICAgIEFFU19LRVkga3M7CisgIH0ga3M7CisgIGJsb2NrMTI4X2YgYmxvY2s7CisgIHVuaW9uIHsKKyAgICBjYmMxMjhfZiBjYmM7CisgICAgY3RyMTI4X2YgY3RyOworICB9IHN0cmVhbTsKK30gRVZQX0FFU19LRVk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5pb24geworICAgIGRvdWJsZSBhbGlnbjsKKyAgICBBRVNfS0VZIGtzOworICB9IGtzOyAgICAgICAgLyogQUVTIGtleSBzY2hlZHVsZSB0byB1c2UgKi8KKyAgaW50IGtleV9zZXQ7IC8qIFNldCBpZiBrZXkgaW5pdGlhbGlzZWQgKi8KKyAgaW50IGl2X3NldDsgIC8qIFNldCBpZiBhbiBpdiBpcyBzZXQgKi8KKyAgR0NNMTI4X0NPTlRFWFQgZ2NtOworICB1aW50OF90ICppdjsgLyogVGVtcG9yYXJ5IElWIHN0b3JlICovCisgIGludCBpdmxlbjsgICAgICAgICAvKiBJViBsZW5ndGggKi8KKyAgaW50IHRhZ2xlbjsKKyAgaW50IGl2X2dlbjsgICAgICAvKiBJdCBpcyBPSyB0byBnZW5lcmF0ZSBJVnMgKi8KKyAgaW50IHRsc19hYWRfbGVuOyAvKiBUTFMgQUFEIGxlbmd0aCAqLworICBjdHIxMjhfZiBjdHI7Cit9IEVWUF9BRVNfR0NNX0NUWDsKKworCit2b2lkIEFFU19jdHIzMl9lbmNyeXB0KGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50OF90ICpvdXQsIHNpemVfdCBibG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFFU19LRVkgKmtleSwgY29uc3QgdWludDhfdCBpdmVjW0FFU19CTE9DS19TSVpFXSk7CisKKworI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fQVNNKSAmJiBcCisgICAgKGRlZmluZWQoT1BFTlNTTF9YODZfNjQpIHx8IGRlZmluZWQoT1BFTlNTTF9YODYpKQorI2RlZmluZSBWUEFFUworZXh0ZXJuIHVuc2lnbmVkIGludCBPUEVOU1NMX2lhMzJjYXBfUFtdOworCitzdGF0aWMgY2hhciB2cGFlc19jYXBhYmxlKCkgeworICByZXR1cm4gKE9QRU5TU0xfaWEzMmNhcF9QWzFdICYgKDEgPDwgKDQxIC0gMzIpKSkgIT0gMDsKK30KKworI2lmIGRlZmluZWQoT1BFTlNTTF9YODZfNjQpCisjZGVmaW5lIEJTQUVTCitzdGF0aWMgY2hhciBic2Flc19jYXBhYmxlKCkgeworICByZXR1cm4gdnBhZXNfY2FwYWJsZSgpOworfQorI2VuZGlmCisKKyNlbGlmICFkZWZpbmVkKE9QRU5TU0xfTk9fQVNNKSAmJiBkZWZpbmVkKE9QRU5TU0xfQVJNKQorI2luY2x1ZGUgIi4uL2FybV9hcmNoLmgiCisjaWYgX19BUk1fQVJDSF9fID49IDcKKyNkZWZpbmUgQlNBRVMKK3N0YXRpYyBjaGFyIGJzYWVzX2NhcGFibGUoKSB7CisgIHJldHVybiBDUllQVE9faXNfTkVPTl9jYXBhYmxlKCk7Cit9CisjZW5kaWYgIC8qIF9fQVJNX0FSQ0hfXyA+PSA3ICovCisjZW5kaWYgIC8qIE9QRU5TU0xfQVJNICovCisKKyNpZiBkZWZpbmVkKEJTQUVTKQorLyogT24gcGxhdGZvcm1zIHdoZXJlIEJTQUVTIGdldHMgZGVmaW5lZCAoanVzdCBhYm92ZSksIHRoZW4gdGhlc2UgZnVuY3Rpb25zIGFyZQorICogcHJvdmlkZWQgYnkgYXNtLiAqLwordm9pZCBic2Flc19jYmNfZW5jcnlwdChjb25zdCB1aW50OF90ICppbiwgdWludDhfdCAqb3V0LCBzaXplX3QgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBRVNfS0VZICprZXksIHVpbnQ4X3QgaXZlY1sxNl0sIGludCBlbmMpOwordm9pZCBic2Flc19jdHIzMl9lbmNyeXB0X2Jsb2Nrcyhjb25zdCB1aW50OF90ICppbiwgdWludDhfdCAqb3V0LCBzaXplX3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBRVNfS0VZICprZXksIGNvbnN0IHVpbnQ4X3QgaXZlY1sxNl0pOworI2Vsc2UKK3N0YXRpYyBjaGFyIGJzYWVzX2NhcGFibGUoKSB7CisgIHJldHVybiAwOworfQorCisvKiBPbiBvdGhlciBwbGF0Zm9ybXMsIGJzYWVzX2NhcGFibGUoKSB3aWxsIGFsd2F5cyByZXR1cm4gZmFsc2UgYW5kIHNvIHRoZQorICogZm9sbG93aW5nIHdpbGwgbmV2ZXIgYmUgY2FsbGVkLiAqLwordm9pZCBic2Flc19jYmNfZW5jcnlwdChjb25zdCB1aW50OF90ICppbiwgdWludDhfdCAqb3V0LCBzaXplX3QgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBRVNfS0VZICprZXksIHVpbnQ4X3QgaXZlY1sxNl0sIGludCBlbmMpIHsKKyAgYWJvcnQoKTsKK30KKwordm9pZCBic2Flc19jdHIzMl9lbmNyeXB0X2Jsb2Nrcyhjb25zdCB1aW50OF90ICppbiwgdWludDhfdCAqb3V0LCBzaXplX3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBRVNfS0VZICprZXksIGNvbnN0IHVpbnQ4X3QgaXZlY1sxNl0pIHsKKyAgYWJvcnQoKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChWUEFFUykKKy8qIE9uIHBsYXRmb3JtcyB3aGVyZSBCU0FFUyBnZXRzIGRlZmluZWQgKGp1c3QgYWJvdmUpLCB0aGVuIHRoZXNlIGZ1bmN0aW9ucyBhcmUKKyAqIHByb3ZpZGVkIGJ5IGFzbS4gKi8KK2ludCB2cGFlc19zZXRfZW5jcnlwdF9rZXkoY29uc3QgdWludDhfdCAqdXNlcktleSwgaW50IGJpdHMsIEFFU19LRVkgKmtleSk7CitpbnQgdnBhZXNfc2V0X2RlY3J5cHRfa2V5KGNvbnN0IHVpbnQ4X3QgKnVzZXJLZXksIGludCBiaXRzLCBBRVNfS0VZICprZXkpOworCit2b2lkIHZwYWVzX2VuY3J5cHQoY29uc3QgdWludDhfdCAqaW4sIHVpbnQ4X3QgKm91dCwgY29uc3QgQUVTX0tFWSAqa2V5KTsKK3ZvaWQgdnBhZXNfZGVjcnlwdChjb25zdCB1aW50OF90ICppbiwgdWludDhfdCAqb3V0LCBjb25zdCBBRVNfS0VZICprZXkpOworCit2b2lkIHZwYWVzX2NiY19lbmNyeXB0KGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50OF90ICpvdXQsIHNpemVfdCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFFU19LRVkgKmtleSwgdWludDhfdCAqaXZlYywgaW50IGVuYyk7CisjZWxzZQorc3RhdGljIGNoYXIgdnBhZXNfY2FwYWJsZSgpIHsKKyAgcmV0dXJuIDA7Cit9CisKKy8qIE9uIG90aGVyIHBsYXRmb3JtcywgdnBhZXNfY2FwYWJsZSgpIHdpbGwgYWx3YXlzIHJldHVybiBmYWxzZSBhbmQgc28gdGhlCisgKiBmb2xsb3dpbmcgd2lsbCBuZXZlciBiZSBjYWxsZWQuICovCitpbnQgdnBhZXNfc2V0X2VuY3J5cHRfa2V5KGNvbnN0IHVpbnQ4X3QgKnVzZXJLZXksIGludCBiaXRzLCBBRVNfS0VZICprZXkpIHsKKyAgYWJvcnQoKTsKK30KK2ludCB2cGFlc19zZXRfZGVjcnlwdF9rZXkoY29uc3QgdWludDhfdCAqdXNlcktleSwgaW50IGJpdHMsIEFFU19LRVkgKmtleSkgeworICBhYm9ydCgpOworfQordm9pZCB2cGFlc19lbmNyeXB0KGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50OF90ICpvdXQsIGNvbnN0IEFFU19LRVkgKmtleSkgeworICBhYm9ydCgpOworfQordm9pZCB2cGFlc19kZWNyeXB0KGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50OF90ICpvdXQsIGNvbnN0IEFFU19LRVkgKmtleSkgeworICBhYm9ydCgpOworfQordm9pZCB2cGFlc19jYmNfZW5jcnlwdChjb25zdCB1aW50OF90ICppbiwgdWludDhfdCAqb3V0LCBzaXplX3QgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBRVNfS0VZICprZXksIHVpbnQ4X3QgKml2ZWMsIGludCBlbmMpIHsKKyAgYWJvcnQoKTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoT1BFTlNTTF9OT19BU00pICYmIFwKKyAgICAoZGVmaW5lZChPUEVOU1NMX1g4Nl82NCkgfHwgZGVmaW5lZChPUEVOU1NMX1g4NikpCitpbnQgYWVzbmlfc2V0X2VuY3J5cHRfa2V5KGNvbnN0IHVpbnQ4X3QgKnVzZXJLZXksIGludCBiaXRzLCBBRVNfS0VZICprZXkpOworaW50IGFlc25pX3NldF9kZWNyeXB0X2tleShjb25zdCB1aW50OF90ICp1c2VyS2V5LCBpbnQgYml0cywgQUVTX0tFWSAqa2V5KTsKKwordm9pZCBhZXNuaV9lbmNyeXB0KGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50OF90ICpvdXQsIGNvbnN0IEFFU19LRVkgKmtleSk7Cit2b2lkIGFlc25pX2RlY3J5cHQoY29uc3QgdWludDhfdCAqaW4sIHVpbnQ4X3QgKm91dCwgY29uc3QgQUVTX0tFWSAqa2V5KTsKKwordm9pZCBhZXNuaV9lY2JfZW5jcnlwdChjb25zdCB1aW50OF90ICppbiwgdWludDhfdCAqb3V0LCBzaXplX3QgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBRVNfS0VZICprZXksIGludCBlbmMpOwordm9pZCBhZXNuaV9jYmNfZW5jcnlwdChjb25zdCB1aW50OF90ICppbiwgdWludDhfdCAqb3V0LCBzaXplX3QgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBRVNfS0VZICprZXksIHVpbnQ4X3QgKml2ZWMsIGludCBlbmMpOworCit2b2lkIGFlc25pX2N0cjMyX2VuY3J5cHRfYmxvY2tzKGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50OF90ICpvdXQsIHNpemVfdCBibG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmtleSwgY29uc3QgdWludDhfdCAqaXZlYyk7CisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfWDg2XzY0KQorc2l6ZV90IGFlc25pX2djbV9lbmNyeXB0KGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50OF90ICpvdXQsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqa2V5LCB1aW50OF90IGl2ZWNbMTZdLCB1aW50NjRfdCAqWGkpOworI2RlZmluZSBBRVNfZ2NtX2VuY3J5cHQgYWVzbmlfZ2NtX2VuY3J5cHQKK3NpemVfdCBhZXNuaV9nY21fZGVjcnlwdChjb25zdCB1aW50OF90ICppbiwgdWludDhfdCAqb3V0LCBzaXplX3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmtleSwgdWludDhfdCBpdmVjWzE2XSwgdWludDY0X3QgKlhpKTsKKyNkZWZpbmUgQUVTX2djbV9kZWNyeXB0IGFlc25pX2djbV9kZWNyeXB0Cit2b2lkIGdjbV9naGFzaF9hdngodWludDY0X3QgWGlbMl0sIGNvbnN0IHUxMjggSHRhYmxlWzE2XSwgY29uc3QgdWludDhfdCAqaW4sCisgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbik7CisjZGVmaW5lIEFFU19HQ01fQVNNKGdjdHgpIFwKKyAgKGdjdHgtPmN0ciA9PSBhZXNuaV9jdHIzMl9lbmNyeXB0X2Jsb2NrcyAmJiBnY3R4LT5nY20uZ2hhc2ggPT0gZ2NtX2doYXNoX2F2eCkKKyNlbmRpZgorCisjZWxzZQorCisvKiBPbiBvdGhlciBwbGF0Zm9ybXMsIGFlc25pX2NhcGFibGUoKSB3aWxsIGFsd2F5cyByZXR1cm4gZmFsc2UgYW5kIHNvIHRoZQorICogZm9sbG93aW5nIHdpbGwgbmV2ZXIgYmUgY2FsbGVkLiAqLwordm9pZCBhZXNuaV9lbmNyeXB0KGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50OF90ICpvdXQsIGNvbnN0IEFFU19LRVkgKmtleSkgeworICBhYm9ydCgpOworfQoraW50IGFlc25pX3NldF9lbmNyeXB0X2tleShjb25zdCB1aW50OF90ICp1c2VyS2V5LCBpbnQgYml0cywgQUVTX0tFWSAqa2V5KSB7CisgIGFib3J0KCk7Cit9Cit2b2lkIGFlc25pX2N0cjMyX2VuY3J5cHRfYmxvY2tzKGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50OF90ICpvdXQsIHNpemVfdCBibG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmtleSwgY29uc3QgdWludDhfdCAqaXZlYykgeworICBhYm9ydCgpOworfQorCisjZW5kaWYKKworc3RhdGljIGludCBhZXNfaW5pdF9rZXkoRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgdWludDhfdCAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaXYsIGludCBlbmMpIHsKKyAgaW50IHJldCwgbW9kZTsKKyAgRVZQX0FFU19LRVkgKmRhdCA9IChFVlBfQUVTX0tFWSAqKWN0eC0+Y2lwaGVyX2RhdGE7CisKKyAgbW9kZSA9IGN0eC0+Y2lwaGVyLT5mbGFncyAmIEVWUF9DSVBIX01PREVfTUFTSzsKKyAgaWYgKChtb2RlID09IEVWUF9DSVBIX0VDQl9NT0RFIHx8IG1vZGUgPT0gRVZQX0NJUEhfQ0JDX01PREUpICYmICFlbmMpIHsKKyAgICBpZiAoYnNhZXNfY2FwYWJsZSgpICYmIG1vZGUgPT0gRVZQX0NJUEhfQ0JDX01PREUpIHsKKyAgICAgIHJldCA9IEFFU19zZXRfZGVjcnlwdF9rZXkoa2V5LCBjdHgtPmtleV9sZW4gKiA4LCAmZGF0LT5rcy5rcyk7CisgICAgICBkYXQtPmJsb2NrID0gKGJsb2NrMTI4X2YpQUVTX2RlY3J5cHQ7CisgICAgICBkYXQtPnN0cmVhbS5jYmMgPSAoY2JjMTI4X2YpYnNhZXNfY2JjX2VuY3J5cHQ7CisgICAgfSBlbHNlIGlmICh2cGFlc19jYXBhYmxlKCkpIHsKKyAgICAgIHJldCA9IHZwYWVzX3NldF9kZWNyeXB0X2tleShrZXksIGN0eC0+a2V5X2xlbiAqIDgsICZkYXQtPmtzLmtzKTsKKyAgICAgIGRhdC0+YmxvY2sgPSAoYmxvY2sxMjhfZil2cGFlc19kZWNyeXB0OworICAgICAgZGF0LT5zdHJlYW0uY2JjID0KKyAgICAgICAgICBtb2RlID09IEVWUF9DSVBIX0NCQ19NT0RFID8gKGNiYzEyOF9mKXZwYWVzX2NiY19lbmNyeXB0IDogTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0ID0gQUVTX3NldF9kZWNyeXB0X2tleShrZXksIGN0eC0+a2V5X2xlbiAqIDgsICZkYXQtPmtzLmtzKTsKKyAgICAgIGRhdC0+YmxvY2sgPSAoYmxvY2sxMjhfZilBRVNfZGVjcnlwdDsKKyAgICAgIGRhdC0+c3RyZWFtLmNiYyA9CisgICAgICAgICAgbW9kZSA9PSBFVlBfQ0lQSF9DQkNfTU9ERSA/IChjYmMxMjhfZilBRVNfY2JjX2VuY3J5cHQgOiBOVUxMOworICAgIH0KKyAgfSBlbHNlIGlmIChic2Flc19jYXBhYmxlKCkgJiYgbW9kZSA9PSBFVlBfQ0lQSF9DVFJfTU9ERSkgeworICAgIHJldCA9IEFFU19zZXRfZW5jcnlwdF9rZXkoa2V5LCBjdHgtPmtleV9sZW4gKiA4LCAmZGF0LT5rcy5rcyk7CisgICAgZGF0LT5ibG9jayA9IChibG9jazEyOF9mKUFFU19lbmNyeXB0OworICAgIGRhdC0+c3RyZWFtLmN0ciA9IChjdHIxMjhfZilic2Flc19jdHIzMl9lbmNyeXB0X2Jsb2NrczsKKyAgfSBlbHNlIGlmICh2cGFlc19jYXBhYmxlKCkpIHsKKyAgICByZXQgPSB2cGFlc19zZXRfZW5jcnlwdF9rZXkoa2V5LCBjdHgtPmtleV9sZW4gKiA4LCAmZGF0LT5rcy5rcyk7CisgICAgZGF0LT5ibG9jayA9IChibG9jazEyOF9mKXZwYWVzX2VuY3J5cHQ7CisgICAgZGF0LT5zdHJlYW0uY2JjID0KKyAgICAgICAgbW9kZSA9PSBFVlBfQ0lQSF9DQkNfTU9ERSA/IChjYmMxMjhfZil2cGFlc19jYmNfZW5jcnlwdCA6IE5VTEw7CisgIH0gZWxzZSB7CisgICAgcmV0ID0gQUVTX3NldF9lbmNyeXB0X2tleShrZXksIGN0eC0+a2V5X2xlbiAqIDgsICZkYXQtPmtzLmtzKTsKKyAgICBkYXQtPmJsb2NrID0gKGJsb2NrMTI4X2YpQUVTX2VuY3J5cHQ7CisgICAgZGF0LT5zdHJlYW0uY2JjID0KKyAgICAgICAgbW9kZSA9PSBFVlBfQ0lQSF9DQkNfTU9ERSA/IChjYmMxMjhfZilBRVNfY2JjX2VuY3J5cHQgOiBOVUxMOworICB9CisKKyAgaWYgKHJldCA8IDApIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlc19pbml0X2tleSwgQ0lQSEVSX1JfQUVTX0tFWV9TRVRVUF9GQUlMRUQpOworICAgIHJldHVybiAwOworICB9CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgYWVzX2NiY19jaXBoZXIoRVZQX0NJUEhFUl9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgc2l6ZV90IGxlbikgeworICBFVlBfQUVTX0tFWSAqZGF0ID0gKEVWUF9BRVNfS0VZICopY3R4LT5jaXBoZXJfZGF0YTsKKworICBpZiAoZGF0LT5zdHJlYW0uY2JjKSB7CisgICAgKCpkYXQtPnN0cmVhbS5jYmMpKGluLCBvdXQsIGxlbiwgJmRhdC0+a3MsIGN0eC0+aXYsIGN0eC0+ZW5jcnlwdCk7CisgIH0gZWxzZSBpZiAoY3R4LT5lbmNyeXB0KSB7CisgICAgQ1JZUFRPX2NiYzEyOF9lbmNyeXB0KGluLCBvdXQsIGxlbiwgJmRhdC0+a3MsIGN0eC0+aXYsIGRhdC0+YmxvY2spOworICB9IGVsc2UgeworICAgIENSWVBUT19jYmMxMjhfZGVjcnlwdChpbiwgb3V0LCBsZW4sICZkYXQtPmtzLCBjdHgtPml2LCBkYXQtPmJsb2NrKTsKKyAgfQorCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGFlc19lY2JfY2lwaGVyKEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHNpemVfdCBsZW4pIHsKKyAgc2l6ZV90IGJsID0gY3R4LT5jaXBoZXItPmJsb2NrX3NpemU7CisgIHNpemVfdCBpOworICBFVlBfQUVTX0tFWSAqZGF0ID0gKEVWUF9BRVNfS0VZICopY3R4LT5jaXBoZXJfZGF0YTsKKworICBpZiAobGVuIDwgYmwpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGZvciAoaSA9IDAsIGxlbiAtPSBibDsgaSA8PSBsZW47IGkgKz0gYmwpIHsKKyAgICAoKmRhdC0+YmxvY2spKGluICsgaSwgb3V0ICsgaSwgJmRhdC0+a3MpOworICB9CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgYWVzX2N0cl9jaXBoZXIoRVZQX0NJUEhFUl9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgc2l6ZV90IGxlbikgeworICB1bnNpZ25lZCBpbnQgbnVtID0gY3R4LT5udW07CisgIEVWUF9BRVNfS0VZICpkYXQgPSAoRVZQX0FFU19LRVkgKiljdHgtPmNpcGhlcl9kYXRhOworCisgIGlmIChkYXQtPnN0cmVhbS5jdHIpIHsKKyAgICBDUllQVE9fY3RyMTI4X2VuY3J5cHRfY3RyMzIoaW4sIG91dCwgbGVuLCAmZGF0LT5rcywgY3R4LT5pdiwgY3R4LT5idWYsICZudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdC0+c3RyZWFtLmN0cik7CisgIH0gZWxzZSB7CisgICAgQ1JZUFRPX2N0cjEyOF9lbmNyeXB0KGluLCBvdXQsIGxlbiwgJmRhdC0+a3MsIGN0eC0+aXYsIGN0eC0+YnVmLCAmbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkYXQtPmJsb2NrKTsKKyAgfQorICBjdHgtPm51bSA9IChzaXplX3QpbnVtOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBhZXNfZ2NtX2luaXRfa2V5KEVWUF9DSVBIRVJfQ1RYICpjdHgsIGNvbnN0IHVpbnQ4X3QgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppdiwgaW50IGVuYykgeworICBFVlBfQUVTX0dDTV9DVFggKmdjdHggPSBjdHgtPmNpcGhlcl9kYXRhOworICBpZiAoIWl2ICYmICFrZXkpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGlmIChrZXkpIHsKKyAgICBpZiAoYnNhZXNfY2FwYWJsZSgpKSB7CisgICAgICBBRVNfc2V0X2VuY3J5cHRfa2V5KGtleSwgY3R4LT5rZXlfbGVuICogOCwgJmdjdHgtPmtzLmtzKTsKKyAgICAgIENSWVBUT19nY20xMjhfaW5pdCgmZ2N0eC0+Z2NtLCAmZ2N0eC0+a3MsIChibG9jazEyOF9mKUFFU19lbmNyeXB0KTsKKyAgICAgIGdjdHgtPmN0ciA9IChjdHIxMjhfZilic2Flc19jdHIzMl9lbmNyeXB0X2Jsb2NrczsKKyAgICB9IGVsc2UgaWYgKHZwYWVzX2NhcGFibGUoKSkgeworICAgICAgdnBhZXNfc2V0X2VuY3J5cHRfa2V5KGtleSwgY3R4LT5rZXlfbGVuICogOCwgJmdjdHgtPmtzLmtzKTsKKyAgICAgIENSWVBUT19nY20xMjhfaW5pdCgmZ2N0eC0+Z2NtLCAmZ2N0eC0+a3MsIChibG9jazEyOF9mKXZwYWVzX2VuY3J5cHQpOworICAgICAgZ2N0eC0+Y3RyID0gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgQUVTX3NldF9lbmNyeXB0X2tleShrZXksIGN0eC0+a2V5X2xlbiAqIDgsICZnY3R4LT5rcy5rcyk7CisgICAgICBDUllQVE9fZ2NtMTI4X2luaXQoJmdjdHgtPmdjbSwgJmdjdHgtPmtzLCAoYmxvY2sxMjhfZilBRVNfZW5jcnlwdCk7CisgICAgICBnY3R4LT5jdHIgPSBOVUxMOworICAgIH0KKworICAgIC8qIElmIHdlIGhhdmUgYW4gaXYgY2FuIHNldCBpdCBkaXJlY3RseSwgb3RoZXJ3aXNlIHVzZQorICAgICAqIHNhdmVkIElWLiAqLworICAgIGlmIChpdiA9PSBOVUxMICYmIGdjdHgtPml2X3NldCkgeworICAgICAgaXYgPSBnY3R4LT5pdjsKKyAgICB9CisgICAgaWYgKGl2KSB7CisgICAgICBDUllQVE9fZ2NtMTI4X3NldGl2KCZnY3R4LT5nY20sIGl2LCBnY3R4LT5pdmxlbik7CisgICAgICBnY3R4LT5pdl9zZXQgPSAxOworICAgIH0KKyAgICBnY3R4LT5rZXlfc2V0ID0gMTsKKyAgfSBlbHNlIHsKKyAgICAvKiBJZiBrZXkgc2V0IHVzZSBJViwgb3RoZXJ3aXNlIGNvcHkgKi8KKyAgICBpZiAoZ2N0eC0+a2V5X3NldCkgeworICAgICAgQ1JZUFRPX2djbTEyOF9zZXRpdigmZ2N0eC0+Z2NtLCBpdiwgZ2N0eC0+aXZsZW4pOworICAgIH0gZWxzZSB7CisgICAgICBtZW1jcHkoZ2N0eC0+aXYsIGl2LCBnY3R4LT5pdmxlbik7CisgICAgfQorICAgIGdjdHgtPml2X3NldCA9IDE7CisgICAgZ2N0eC0+aXZfZ2VuID0gMDsKKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBhZXNfZ2NtX2NsZWFudXAoRVZQX0NJUEhFUl9DVFggKmMpIHsKKyAgRVZQX0FFU19HQ01fQ1RYICpnY3R4ID0gYy0+Y2lwaGVyX2RhdGE7CisgIE9QRU5TU0xfY2xlYW5zZSgmZ2N0eC0+Z2NtLCBzaXplb2YoZ2N0eC0+Z2NtKSk7CisgIGlmIChnY3R4LT5pdiAhPSBjLT5pdikgeworICAgIE9QRU5TU0xfZnJlZShnY3R4LT5pdik7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8qIGluY3JlbWVudCBjb3VudGVyICg2NC1iaXQgaW50KSBieSAxICovCitzdGF0aWMgdm9pZCBjdHI2NF9pbmModWludDhfdCAqY291bnRlcikgeworICBpbnQgbiA9IDg7CisgIHVpbnQ4X3QgYzsKKworICBkbyB7CisgICAgLS1uOworICAgIGMgPSBjb3VudGVyW25dOworICAgICsrYzsKKyAgICBjb3VudGVyW25dID0gYzsKKyAgICBpZiAoYykgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgfSB3aGlsZSAobik7Cit9CisKK3N0YXRpYyBpbnQgYWVzX2djbV9jdHJsKEVWUF9DSVBIRVJfQ1RYICpjLCBpbnQgdHlwZSwgaW50IGFyZywgdm9pZCAqcHRyKSB7CisgIEVWUF9BRVNfR0NNX0NUWCAqZ2N0eCA9IGMtPmNpcGhlcl9kYXRhOworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEVWUF9DVFJMX0lOSVQ6CisgICAgICBnY3R4LT5rZXlfc2V0ID0gMDsKKyAgICAgIGdjdHgtPml2X3NldCA9IDA7CisgICAgICBnY3R4LT5pdmxlbiA9IGMtPmNpcGhlci0+aXZfbGVuOworICAgICAgZ2N0eC0+aXYgPSBjLT5pdjsKKyAgICAgIGdjdHgtPnRhZ2xlbiA9IC0xOworICAgICAgZ2N0eC0+aXZfZ2VuID0gMDsKKyAgICAgIGdjdHgtPnRsc19hYWRfbGVuID0gLTE7CisgICAgICByZXR1cm4gMTsKKworICAgIGNhc2UgRVZQX0NUUkxfR0NNX1NFVF9JVkxFTjoKKyAgICAgIGlmIChhcmcgPD0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBJViBpZiBuZWVkZWQgKi8KKyAgICAgIGlmIChhcmcgPiBFVlBfTUFYX0lWX0xFTkdUSCAmJiBhcmcgPiBnY3R4LT5pdmxlbikgeworICAgICAgICBpZiAoZ2N0eC0+aXYgIT0gYy0+aXYpIHsKKyAgICAgICAgICBPUEVOU1NMX2ZyZWUoZ2N0eC0+aXYpOworICAgICAgICB9CisgICAgICAgIGdjdHgtPml2ID0gT1BFTlNTTF9tYWxsb2MoYXJnKTsKKyAgICAgICAgaWYgKCFnY3R4LT5pdikgeworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICB9CisgICAgICBnY3R4LT5pdmxlbiA9IGFyZzsKKyAgICAgIHJldHVybiAxOworCisgICAgY2FzZSBFVlBfQ1RSTF9HQ01fU0VUX1RBRzoKKyAgICAgIGlmIChhcmcgPD0gMCB8fCBhcmcgPiAxNiB8fCBjLT5lbmNyeXB0KSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgbWVtY3B5KGMtPmJ1ZiwgcHRyLCBhcmcpOworICAgICAgZ2N0eC0+dGFnbGVuID0gYXJnOworICAgICAgcmV0dXJuIDE7CisKKyAgICBjYXNlIEVWUF9DVFJMX0dDTV9HRVRfVEFHOgorICAgICAgaWYgKGFyZyA8PSAwIHx8IGFyZyA+IDE2IHx8ICFjLT5lbmNyeXB0IHx8IGdjdHgtPnRhZ2xlbiA8IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBtZW1jcHkocHRyLCBjLT5idWYsIGFyZyk7CisgICAgICByZXR1cm4gMTsKKworICAgIGNhc2UgRVZQX0NUUkxfR0NNX1NFVF9JVl9GSVhFRDoKKyAgICAgIC8qIFNwZWNpYWwgY2FzZTogLTEgbGVuZ3RoIHJlc3RvcmVzIHdob2xlIElWICovCisgICAgICBpZiAoYXJnID09IC0xKSB7CisgICAgICAgIG1lbWNweShnY3R4LT5pdiwgcHRyLCBnY3R4LT5pdmxlbik7CisgICAgICAgIGdjdHgtPml2X2dlbiA9IDE7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgLyogRml4ZWQgZmllbGQgbXVzdCBiZSBhdCBsZWFzdCA0IGJ5dGVzIGFuZCBpbnZvY2F0aW9uIGZpZWxkCisgICAgICAgKiBhdCBsZWFzdCA4LiAqLworICAgICAgaWYgKGFyZyA8IDQgfHwgKGdjdHgtPml2bGVuIC0gYXJnKSA8IDgpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBpZiAoYXJnKSB7CisgICAgICAgIG1lbWNweShnY3R4LT5pdiwgcHRyLCBhcmcpOworICAgICAgfQorICAgICAgaWYgKGMtPmVuY3J5cHQgJiYKKyAgICAgICAgICBSQU5EX3BzZXVkb19ieXRlcyhnY3R4LT5pdiArIGFyZywgZ2N0eC0+aXZsZW4gLSBhcmcpIDw9IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBnY3R4LT5pdl9nZW4gPSAxOworICAgICAgcmV0dXJuIDE7CisKKyAgICBjYXNlIEVWUF9DVFJMX0dDTV9JVl9HRU46CisgICAgICBpZiAoZ2N0eC0+aXZfZ2VuID09IDAgfHwgZ2N0eC0+a2V5X3NldCA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgQ1JZUFRPX2djbTEyOF9zZXRpdigmZ2N0eC0+Z2NtLCBnY3R4LT5pdiwgZ2N0eC0+aXZsZW4pOworICAgICAgaWYgKGFyZyA8PSAwIHx8IGFyZyA+IGdjdHgtPml2bGVuKSB7CisgICAgICAgIGFyZyA9IGdjdHgtPml2bGVuOworICAgICAgfQorICAgICAgbWVtY3B5KHB0ciwgZ2N0eC0+aXYgKyBnY3R4LT5pdmxlbiAtIGFyZywgYXJnKTsKKyAgICAgIC8qIEludm9jYXRpb24gZmllbGQgd2lsbCBiZSBhdCBsZWFzdCA4IGJ5dGVzIGluIHNpemUgYW5kCisgICAgICAgKiBzbyBubyBuZWVkIHRvIGNoZWNrIHdyYXAgYXJvdW5kIG9yIGluY3JlbWVudCBtb3JlIHRoYW4KKyAgICAgICAqIGxhc3QgOCBieXRlcy4gKi8KKyAgICAgIGN0cjY0X2luYyhnY3R4LT5pdiArIGdjdHgtPml2bGVuIC0gOCk7CisgICAgICBnY3R4LT5pdl9zZXQgPSAxOworICAgICAgcmV0dXJuIDE7CisKKyAgICBjYXNlIEVWUF9DVFJMX0dDTV9TRVRfSVZfSU5WOgorICAgICAgaWYgKGdjdHgtPml2X2dlbiA9PSAwIHx8IGdjdHgtPmtleV9zZXQgPT0gMCB8fCBjLT5lbmNyeXB0KSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgbWVtY3B5KGdjdHgtPml2ICsgZ2N0eC0+aXZsZW4gLSBhcmcsIHB0ciwgYXJnKTsKKyAgICAgIENSWVBUT19nY20xMjhfc2V0aXYoJmdjdHgtPmdjbSwgZ2N0eC0+aXYsIGdjdHgtPml2bGVuKTsKKyAgICAgIGdjdHgtPml2X3NldCA9IDE7CisgICAgICByZXR1cm4gMTsKKworICAgIGNhc2UgRVZQX0NUUkxfQUVBRF9UTFMxX0FBRDoKKyAgICAgIC8qIFNhdmUgdGhlIEFBRCBmb3IgbGF0ZXIgdXNlICovCisgICAgICBpZiAoYXJnICE9IDEzKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgbWVtY3B5KGMtPmJ1ZiwgcHRyLCBhcmcpOworICAgICAgZ2N0eC0+dGxzX2FhZF9sZW4gPSBhcmc7CisgICAgICB7CisgICAgICAgIHVuc2lnbmVkIGludCBsZW4gPSBjLT5idWZbYXJnIC0gMl0gPDwgOCB8IGMtPmJ1ZlthcmcgLSAxXTsKKyAgICAgICAgLyogQ29ycmVjdCBsZW5ndGggZm9yIGV4cGxpY2l0IElWICovCisgICAgICAgIGxlbiAtPSBFVlBfR0NNX1RMU19FWFBMSUNJVF9JVl9MRU47CisgICAgICAgIC8qIElmIGRlY3J5cHRpbmcgY29ycmVjdCBmb3IgdGFnIHRvbyAqLworICAgICAgICBpZiAoIWMtPmVuY3J5cHQpCisgICAgICAgICAgbGVuIC09IEVWUF9HQ01fVExTX1RBR19MRU47CisgICAgICAgIGMtPmJ1ZlthcmcgLSAyXSA9IGxlbiA+PiA4OworICAgICAgICBjLT5idWZbYXJnIC0gMV0gPSBsZW4gJiAweGZmOworICAgICAgfQorCisgICAgICAvKiBFeHRyYSBwYWRkaW5nOiB0YWcgYXBwZW5kZWQgdG8gcmVjb3JkICovCisgICAgICByZXR1cm4gRVZQX0dDTV9UTFNfVEFHX0xFTjsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gLTE7CisgIH0KK30KKworLyogSGFuZGxlIFRMUyBHQ00gcGFja2V0IGZvcm1hdC4gVGhpcyBjb25zaXN0cyBvZiB0aGUgbGFzdCBwb3J0aW9uIG9mIHRoZSBJVgorICogZm9sbG93ZWQgYnkgdGhlIHBheWxvYWQgYW5kIGZpbmFsbHkgdGhlIHRhZy4gT24gZW5jcnlwdCBnZW5lcmF0ZSBJViwgZW5jcnlwdAorICogcGF5bG9hZCBhbmQgd3JpdGUgdGhlIHRhZy4gT24gdmVyaWZ5IHJldHJpZXZlIElWLCBkZWNyeXB0IHBheWxvYWQgYW5kIHZlcmlmeQorICogdGFnLiAqLworCitzdGF0aWMgaW50IGFlc19nY21fdGxzX2NpcGhlcihFVlBfQ0lQSEVSX0NUWCAqY3R4LCB1aW50OF90ICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGxlbikgeworICBFVlBfQUVTX0dDTV9DVFggKmdjdHggPSBjdHgtPmNpcGhlcl9kYXRhOworICBpbnQgcnYgPSAtMTsKKyAgLyogRW5jcnlwdC9kZWNyeXB0IG11c3QgYmUgcGVyZm9ybWVkIGluIHBsYWNlICovCisgIGlmIChvdXQgIT0gaW4gfHwgbGVuIDwgKEVWUF9HQ01fVExTX0VYUExJQ0lUX0lWX0xFTiArIEVWUF9HQ01fVExTX1RBR19MRU4pKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIC8qIFNldCBJViBmcm9tIHN0YXJ0IG9mIGJ1ZmZlciBvciBnZW5lcmF0ZSBJViBhbmQgd3JpdGUgdG8gc3RhcnQKKyAgICogb2YgYnVmZmVyLgorICAgKi8KKyAgaWYgKEVWUF9DSVBIRVJfQ1RYX2N0cmwoCisgICAgICAgICAgY3R4LCBjdHgtPmVuY3J5cHQgPyBFVlBfQ1RSTF9HQ01fSVZfR0VOIDogRVZQX0NUUkxfR0NNX1NFVF9JVl9JTlYsCisgICAgICAgICAgRVZQX0dDTV9UTFNfRVhQTElDSVRfSVZfTEVOLCBvdXQpIDw9IDApCisgICAgZ290byBlcnI7CisgIC8qIFVzZSBzYXZlZCBBQUQgKi8KKyAgaWYgKCFDUllQVE9fZ2NtMTI4X2FhZCgmZ2N0eC0+Z2NtLCBjdHgtPmJ1ZiwgZ2N0eC0+dGxzX2FhZF9sZW4pKQorICAgIGdvdG8gZXJyOworICAvKiBGaXggYnVmZmVyIGFuZCBsZW5ndGggdG8gcG9pbnQgdG8gcGF5bG9hZCAqLworICBpbiArPSBFVlBfR0NNX1RMU19FWFBMSUNJVF9JVl9MRU47CisgIG91dCArPSBFVlBfR0NNX1RMU19FWFBMSUNJVF9JVl9MRU47CisgIGxlbiAtPSBFVlBfR0NNX1RMU19FWFBMSUNJVF9JVl9MRU4gKyBFVlBfR0NNX1RMU19UQUdfTEVOOworICBpZiAoY3R4LT5lbmNyeXB0KSB7CisgICAgLyogRW5jcnlwdCBwYXlsb2FkICovCisgICAgaWYgKGdjdHgtPmN0cikgeworICAgICAgc2l6ZV90IGJ1bGsgPSAwOworI2lmIGRlZmluZWQoQUVTX0dDTV9BU00pCisgICAgICBpZiAobGVuID49IDMyICYmIEFFU19HQ01fQVNNKGdjdHgpKSB7CisgICAgICAgIGlmICghQ1JZUFRPX2djbTEyOF9lbmNyeXB0KCZnY3R4LT5nY20sIE5VTEwsIE5VTEwsIDApKQorICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBidWxrID0gQUVTX2djbV9lbmNyeXB0KGluLCBvdXQsIGxlbiwgZ2N0eC0+Z2NtLmtleSwgZ2N0eC0+Z2NtLllpLmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2N0eC0+Z2NtLlhpLnUpOworICAgICAgICBnY3R4LT5nY20ubGVuLnVbMV0gKz0gYnVsazsKKyAgICAgIH0KKyNlbmRpZgorICAgICAgaWYgKCFDUllQVE9fZ2NtMTI4X2VuY3J5cHRfY3RyMzIoJmdjdHgtPmdjbSwgaW4gKyBidWxrLCBvdXQgKyBidWxrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLSBidWxrLCBnY3R4LT5jdHIpKQorICAgICAgICBnb3RvIGVycjsKKyAgICB9IGVsc2UgeworICAgICAgc2l6ZV90IGJ1bGsgPSAwOworICAgICAgaWYgKCFDUllQVE9fZ2NtMTI4X2VuY3J5cHQoJmdjdHgtPmdjbSwgaW4gKyBidWxrLCBvdXQgKyBidWxrLCBsZW4gLSBidWxrKSkKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorICAgIG91dCArPSBsZW47CisgICAgLyogRmluYWxseSB3cml0ZSB0YWcgKi8KKyAgICBDUllQVE9fZ2NtMTI4X3RhZygmZ2N0eC0+Z2NtLCBvdXQsIEVWUF9HQ01fVExTX1RBR19MRU4pOworICAgIHJ2ID0gbGVuICsgRVZQX0dDTV9UTFNfRVhQTElDSVRfSVZfTEVOICsgRVZQX0dDTV9UTFNfVEFHX0xFTjsKKyAgfSBlbHNlIHsKKyAgICAvKiBEZWNyeXB0ICovCisgICAgaWYgKGdjdHgtPmN0cikgeworICAgICAgc2l6ZV90IGJ1bGsgPSAwOworI2lmIGRlZmluZWQoQUVTX0dDTV9BU00pCisgICAgICBpZiAobGVuID49IDE2ICYmIEFFU19HQ01fQVNNKGdjdHgpKSB7CisgICAgICAgIGlmICghQ1JZUFRPX2djbTEyOF9kZWNyeXB0KCZnY3R4LT5nY20sIE5VTEwsIE5VTEwsIDApKQorICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBidWxrID0gQUVTX2djbV9kZWNyeXB0KGluLCBvdXQsIGxlbiwgZ2N0eC0+Z2NtLmtleSwgZ2N0eC0+Z2NtLllpLmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2N0eC0+Z2NtLlhpLnUpOworICAgICAgICBnY3R4LT5nY20ubGVuLnVbMV0gKz0gYnVsazsKKyAgICAgIH0KKyNlbmRpZgorICAgICAgaWYgKCFDUllQVE9fZ2NtMTI4X2RlY3J5cHRfY3RyMzIoJmdjdHgtPmdjbSwgaW4gKyBidWxrLCBvdXQgKyBidWxrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLSBidWxrLCBnY3R4LT5jdHIpKQorICAgICAgICBnb3RvIGVycjsKKyAgICB9IGVsc2UgeworICAgICAgc2l6ZV90IGJ1bGsgPSAwOworICAgICAgaWYgKCFDUllQVE9fZ2NtMTI4X2RlY3J5cHQoJmdjdHgtPmdjbSwgaW4gKyBidWxrLCBvdXQgKyBidWxrLCBsZW4gLSBidWxrKSkKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorICAgIC8qIFJldHJpZXZlIHRhZyAqLworICAgIENSWVBUT19nY20xMjhfdGFnKCZnY3R4LT5nY20sIGN0eC0+YnVmLCBFVlBfR0NNX1RMU19UQUdfTEVOKTsKKyAgICAvKiBJZiB0YWcgbWlzbWF0Y2ggd2lwZSBidWZmZXIgKi8KKyAgICBpZiAobWVtY21wKGN0eC0+YnVmLCBpbiArIGxlbiwgRVZQX0dDTV9UTFNfVEFHX0xFTikpIHsKKyAgICAgIE9QRU5TU0xfY2xlYW5zZShvdXQsIGxlbik7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgcnYgPSBsZW47CisgIH0KKworZXJyOgorICBnY3R4LT5pdl9zZXQgPSAwOworICBnY3R4LT50bHNfYWFkX2xlbiA9IC0xOworICByZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBpbnQgYWVzX2djbV9jaXBoZXIoRVZQX0NJUEhFUl9DVFggKmN0eCwgdWludDhfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbikgeworICBFVlBfQUVTX0dDTV9DVFggKmdjdHggPSBjdHgtPmNpcGhlcl9kYXRhOworICAvKiBJZiBub3Qgc2V0IHVwLCByZXR1cm4gZXJyb3IgKi8KKyAgaWYgKCFnY3R4LT5rZXlfc2V0KQorICAgIHJldHVybiAtMTsKKworICBpZiAoZ2N0eC0+dGxzX2FhZF9sZW4gPj0gMCkKKyAgICByZXR1cm4gYWVzX2djbV90bHNfY2lwaGVyKGN0eCwgb3V0LCBpbiwgbGVuKTsKKworICBpZiAoIWdjdHgtPml2X3NldCkKKyAgICByZXR1cm4gLTE7CisgIGlmIChpbikgeworICAgIGlmIChvdXQgPT0gTlVMTCkgeworICAgICAgaWYgKCFDUllQVE9fZ2NtMTI4X2FhZCgmZ2N0eC0+Z2NtLCBpbiwgbGVuKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSBpZiAoY3R4LT5lbmNyeXB0KSB7CisgICAgICBpZiAoZ2N0eC0+Y3RyKSB7CisgICAgICAgIHNpemVfdCBidWxrID0gMDsKKyNpZiBkZWZpbmVkKEFFU19HQ01fQVNNKQorICAgICAgICBpZiAobGVuID49IDMyICYmIEFFU19HQ01fQVNNKGdjdHgpKSB7CisgICAgICAgICAgc2l6ZV90IHJlcyA9ICgxNiAtIGdjdHgtPmdjbS5tcmVzKSAlIDE2OworCisgICAgICAgICAgaWYgKCFDUllQVE9fZ2NtMTI4X2VuY3J5cHQoJmdjdHgtPmdjbSwgaW4sIG91dCwgcmVzKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAgIGJ1bGsgPSBBRVNfZ2NtX2VuY3J5cHQoaW4gKyByZXMsIG91dCArIHJlcywgbGVuIC0gcmVzLCBnY3R4LT5nY20ua2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2N0eC0+Z2NtLllpLmMsIGdjdHgtPmdjbS5YaS51KTsKKyAgICAgICAgICBnY3R4LT5nY20ubGVuLnVbMV0gKz0gYnVsazsKKyAgICAgICAgICBidWxrICs9IHJlczsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmICghQ1JZUFRPX2djbTEyOF9lbmNyeXB0X2N0cjMyKCZnY3R4LT5nY20sIGluICsgYnVsaywgb3V0ICsgYnVsaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLSBidWxrLCBnY3R4LT5jdHIpKQorICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNpemVfdCBidWxrID0gMDsKKyAgICAgICAgaWYgKCFDUllQVE9fZ2NtMTI4X2VuY3J5cHQoJmdjdHgtPmdjbSwgaW4gKyBidWxrLCBvdXQgKyBidWxrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtIGJ1bGspKQorICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKGdjdHgtPmN0cikgeworICAgICAgICBzaXplX3QgYnVsayA9IDA7CisjaWYgZGVmaW5lZChBRVNfR0NNX0FTTSkKKyAgICAgICAgaWYgKGxlbiA+PSAxNiAmJiBBRVNfR0NNX0FTTShnY3R4KSkgeworICAgICAgICAgIHNpemVfdCByZXMgPSAoMTYgLSBnY3R4LT5nY20ubXJlcykgJSAxNjsKKworICAgICAgICAgIGlmICghQ1JZUFRPX2djbTEyOF9kZWNyeXB0KCZnY3R4LT5nY20sIGluLCBvdXQsIHJlcykpCisgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgICBidWxrID0gQUVTX2djbV9kZWNyeXB0KGluICsgcmVzLCBvdXQgKyByZXMsIGxlbiAtIHJlcywgZ2N0eC0+Z2NtLmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjdHgtPmdjbS5ZaS5jLCBnY3R4LT5nY20uWGkudSk7CisgICAgICAgICAgZ2N0eC0+Z2NtLmxlbi51WzFdICs9IGJ1bGs7CisgICAgICAgICAgYnVsayArPSByZXM7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBpZiAoIUNSWVBUT19nY20xMjhfZGVjcnlwdF9jdHIzMigmZ2N0eC0+Z2NtLCBpbiArIGJ1bGssIG91dCArIGJ1bGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC0gYnVsaywgZ2N0eC0+Y3RyKSkKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICB9IGVsc2UgeworICAgICAgICBzaXplX3QgYnVsayA9IDA7CisgICAgICAgIGlmICghQ1JZUFRPX2djbTEyOF9kZWNyeXB0KCZnY3R4LT5nY20sIGluICsgYnVsaywgb3V0ICsgYnVsaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLSBidWxrKSkKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBsZW47CisgIH0gZWxzZSB7CisgICAgaWYgKCFjdHgtPmVuY3J5cHQpIHsKKyAgICAgIGlmIChnY3R4LT50YWdsZW4gPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgICBpZiAoIUNSWVBUT19nY20xMjhfZmluaXNoKCZnY3R4LT5nY20sIGN0eC0+YnVmLCBnY3R4LT50YWdsZW4pICE9IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGdjdHgtPml2X3NldCA9IDA7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgQ1JZUFRPX2djbTEyOF90YWcoJmdjdHgtPmdjbSwgY3R4LT5idWYsIDE2KTsKKyAgICBnY3R4LT50YWdsZW4gPSAxNjsKKyAgICAvKiBEb24ndCByZXVzZSB0aGUgSVYgKi8KKyAgICBnY3R4LT5pdl9zZXQgPSAwOworICAgIHJldHVybiAwOworICB9Cit9CisKK3N0YXRpYyBjb25zdCBFVlBfQ0lQSEVSIGFlc18xMjhfY2JjID0geworICAgIE5JRF9hZXNfMTI4X2NiYywgICAgIDE2IC8qIGJsb2NrX3NpemUgKi8sIDE2IC8qIGtleV9zaXplICovLAorICAgIDE2IC8qIGl2X2xlbiAqLywgICAgIHNpemVvZihFVlBfQUVTX0tFWSksIEVWUF9DSVBIX0NCQ19NT0RFLAorICAgIE5VTEwgLyogYXBwX2RhdGEgKi8sIGFlc19pbml0X2tleSwgICAgICAgIGFlc19jYmNfY2lwaGVyLAorICAgIE5VTEwgLyogY2xlYW51cCAqLywgIE5VTEwgLyogY3RybCAqL307CisKK3N0YXRpYyBjb25zdCBFVlBfQ0lQSEVSIGFlc18xMjhfY3RyID0geworICAgIE5JRF9hZXNfMTI4X2N0ciwgICAgIDEgLyogYmxvY2tfc2l6ZSAqLywgIDE2IC8qIGtleV9zaXplICovLAorICAgIDE2IC8qIGl2X2xlbiAqLywgICAgIHNpemVvZihFVlBfQUVTX0tFWSksIEVWUF9DSVBIX0NUUl9NT0RFLAorICAgIE5VTEwgLyogYXBwX2RhdGEgKi8sIGFlc19pbml0X2tleSwgICAgICAgIGFlc19jdHJfY2lwaGVyLAorICAgIE5VTEwgLyogY2xlYW51cCAqLywgIE5VTEwgLyogY3RybCAqL307CisKK3N0YXRpYyBjb25zdCBFVlBfQ0lQSEVSIGFlc18xMjhfZWNiID0geworICAgIE5JRF9hZXNfMTI4X2VjYiwgICAgIDE2IC8qIGJsb2NrX3NpemUgKi8sIDE2IC8qIGtleV9zaXplICovLAorICAgIDE2IC8qIGl2X2xlbiAqLywgICAgIHNpemVvZihFVlBfQUVTX0tFWSksIEVWUF9DSVBIX0VDQl9NT0RFLAorICAgIE5VTEwgLyogYXBwX2RhdGEgKi8sIGFlc19pbml0X2tleSwgICAgICAgIGFlc19lY2JfY2lwaGVyLAorICAgIE5VTEwgLyogY2xlYW51cCAqLywgIE5VTEwgLyogY3RybCAqL307CisKK3N0YXRpYyBjb25zdCBFVlBfQ0lQSEVSIGFlc18xMjhfZ2NtID0geworICAgIE5JRF9hZXNfMTI4X2djbSwgMSAvKiBibG9ja19zaXplICovLCAxNiAvKiBrZXlfc2l6ZSAqLywgMTIgLyogaXZfbGVuICovLAorICAgIHNpemVvZihFVlBfQUVTX0dDTV9DVFgpLAorICAgIEVWUF9DSVBIX0dDTV9NT0RFIHwgRVZQX0NJUEhfQ1VTVE9NX0lWIHwgRVZQX0NJUEhfRkxBR19DVVNUT01fQ0lQSEVSIHwKKyAgICAgICAgRVZQX0NJUEhfQUxXQVlTX0NBTExfSU5JVCB8IEVWUF9DSVBIX0NUUkxfSU5JVCB8CisgICAgICAgIEVWUF9DSVBIX0ZMQUdfQUVBRF9DSVBIRVIsCisgICAgTlVMTCAvKiBhcHBfZGF0YSAqLywgYWVzX2djbV9pbml0X2tleSwgYWVzX2djbV9jaXBoZXIsIGFlc19nY21fY2xlYW51cCwKKyAgICBhZXNfZ2NtX2N0cmx9OworCisKK3N0YXRpYyBjb25zdCBFVlBfQ0lQSEVSIGFlc18yNTZfY2JjID0geworICAgIE5JRF9hZXNfMTI4X2NiYywgICAgIDE2IC8qIGJsb2NrX3NpemUgKi8sIDMyIC8qIGtleV9zaXplICovLAorICAgIDE2IC8qIGl2X2xlbiAqLywgICAgIHNpemVvZihFVlBfQUVTX0tFWSksIEVWUF9DSVBIX0NCQ19NT0RFLAorICAgIE5VTEwgLyogYXBwX2RhdGEgKi8sIGFlc19pbml0X2tleSwgICAgICAgIGFlc19jYmNfY2lwaGVyLAorICAgIE5VTEwgLyogY2xlYW51cCAqLywgIE5VTEwgLyogY3RybCAqL307CisKK3N0YXRpYyBjb25zdCBFVlBfQ0lQSEVSIGFlc18yNTZfY3RyID0geworICAgIE5JRF9hZXNfMTI4X2N0ciwgICAgIDEgLyogYmxvY2tfc2l6ZSAqLywgIDMyIC8qIGtleV9zaXplICovLAorICAgIDE2IC8qIGl2X2xlbiAqLywgICAgIHNpemVvZihFVlBfQUVTX0tFWSksIEVWUF9DSVBIX0NUUl9NT0RFLAorICAgIE5VTEwgLyogYXBwX2RhdGEgKi8sIGFlc19pbml0X2tleSwgICAgICAgIGFlc19jdHJfY2lwaGVyLAorICAgIE5VTEwgLyogY2xlYW51cCAqLywgIE5VTEwgLyogY3RybCAqL307CisKK3N0YXRpYyBjb25zdCBFVlBfQ0lQSEVSIGFlc18yNTZfZWNiID0geworICAgIE5JRF9hZXNfMTI4X2VjYiwgICAgIDE2IC8qIGJsb2NrX3NpemUgKi8sIDMyIC8qIGtleV9zaXplICovLAorICAgIDE2IC8qIGl2X2xlbiAqLywgICAgIHNpemVvZihFVlBfQUVTX0tFWSksIEVWUF9DSVBIX0VDQl9NT0RFLAorICAgIE5VTEwgLyogYXBwX2RhdGEgKi8sIGFlc19pbml0X2tleSwgICAgICAgIGFlc19lY2JfY2lwaGVyLAorICAgIE5VTEwgLyogY2xlYW51cCAqLywgIE5VTEwgLyogY3RybCAqL307CisKK3N0YXRpYyBjb25zdCBFVlBfQ0lQSEVSIGFlc18yNTZfZ2NtID0geworICAgIE5JRF9hZXNfMTI4X2djbSwgMSAvKiBibG9ja19zaXplICovLCAzMiAvKiBrZXlfc2l6ZSAqLywgMTIgLyogaXZfbGVuICovLAorICAgIHNpemVvZihFVlBfQUVTX0dDTV9DVFgpLAorICAgIEVWUF9DSVBIX0dDTV9NT0RFIHwgRVZQX0NJUEhfQ1VTVE9NX0lWIHwgRVZQX0NJUEhfRkxBR19DVVNUT01fQ0lQSEVSIHwKKyAgICAgICAgRVZQX0NJUEhfQUxXQVlTX0NBTExfSU5JVCB8IEVWUF9DSVBIX0NUUkxfSU5JVCB8CisgICAgICAgIEVWUF9DSVBIX0ZMQUdfQUVBRF9DSVBIRVIsCisgICAgTlVMTCAvKiBhcHBfZGF0YSAqLywgYWVzX2djbV9pbml0X2tleSwgYWVzX2djbV9jaXBoZXIsIGFlc19nY21fY2xlYW51cCwKKyAgICBhZXNfZ2NtX2N0cmx9OworCisjaWYgIWRlZmluZWQoT1BFTlNTTF9OT19BU00pICYmIFwKKyAgICAoZGVmaW5lZChPUEVOU1NMX1g4Nl82NCkgfHwgZGVmaW5lZChPUEVOU1NMX1g4NikpCisKKy8qIEFFUy1OSSBzZWN0aW9uLiAqLworCitzdGF0aWMgY2hhciBhZXNuaV9jYXBhYmxlKCkgeworICByZXR1cm4gKE9QRU5TU0xfaWEzMmNhcF9QWzFdICYgKDEgPDwgKDU3IC0gMzIpKSkgIT0gMDsKK30KKworc3RhdGljIGludCBhZXNuaV9pbml0X2tleShFVlBfQ0lQSEVSX0NUWCAqY3R4LCBjb25zdCB1aW50OF90ICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKml2LCBpbnQgZW5jKSB7CisgIGludCByZXQsIG1vZGU7CisgIEVWUF9BRVNfS0VZICpkYXQgPSAoRVZQX0FFU19LRVkgKiljdHgtPmNpcGhlcl9kYXRhOworCisgIG1vZGUgPSBjdHgtPmNpcGhlci0+ZmxhZ3MgJiBFVlBfQ0lQSF9NT0RFX01BU0s7CisgIGlmICgobW9kZSA9PSBFVlBfQ0lQSF9FQ0JfTU9ERSB8fCBtb2RlID09IEVWUF9DSVBIX0NCQ19NT0RFKSAmJiAhZW5jKSB7CisgICAgcmV0ID0gYWVzbmlfc2V0X2RlY3J5cHRfa2V5KGtleSwgY3R4LT5rZXlfbGVuICogOCwgY3R4LT5jaXBoZXJfZGF0YSk7CisgICAgZGF0LT5ibG9jayA9IChibG9jazEyOF9mKWFlc25pX2RlY3J5cHQ7CisgICAgZGF0LT5zdHJlYW0uY2JjID0KKyAgICAgICAgbW9kZSA9PSBFVlBfQ0lQSF9DQkNfTU9ERSA/IChjYmMxMjhfZilhZXNuaV9jYmNfZW5jcnlwdCA6IE5VTEw7CisgIH0gZWxzZSB7CisgICAgcmV0ID0gYWVzbmlfc2V0X2VuY3J5cHRfa2V5KGtleSwgY3R4LT5rZXlfbGVuICogOCwgY3R4LT5jaXBoZXJfZGF0YSk7CisgICAgZGF0LT5ibG9jayA9IChibG9jazEyOF9mKWFlc25pX2VuY3J5cHQ7CisgICAgaWYgKG1vZGUgPT0gRVZQX0NJUEhfQ0JDX01PREUpIHsKKyAgICAgIGRhdC0+c3RyZWFtLmNiYyA9IChjYmMxMjhfZilhZXNuaV9jYmNfZW5jcnlwdDsKKyAgICB9IGVsc2UgaWYgKG1vZGUgPT0gRVZQX0NJUEhfQ1RSX01PREUpIHsKKyAgICAgIGRhdC0+c3RyZWFtLmN0ciA9IChjdHIxMjhfZilhZXNuaV9jdHIzMl9lbmNyeXB0X2Jsb2NrczsKKyAgICB9IGVsc2UgeworICAgICAgZGF0LT5zdHJlYW0uY2JjID0gTlVMTDsKKyAgICB9CisgIH0KKworICBpZiAocmV0IDwgMCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVzbmlfaW5pdF9rZXksIENJUEhFUl9SX0FFU19LRVlfU0VUVVBfRkFJTEVEKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGFlc25pX2NiY19jaXBoZXIoRVZQX0NJUEhFUl9DVFggKmN0eCwgdWludDhfdCAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgbGVuKSB7CisgIGFlc25pX2NiY19lbmNyeXB0KGluLCBvdXQsIGxlbiwgY3R4LT5jaXBoZXJfZGF0YSwgY3R4LT5pdiwgY3R4LT5lbmNyeXB0KTsKKworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBhZXNuaV9lY2JfY2lwaGVyKEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVpbnQ4X3QgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGxlbikgeworICBzaXplX3QgYmwgPSBjdHgtPmNpcGhlci0+YmxvY2tfc2l6ZTsKKworICBpZiAobGVuIDwgYmwpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGFlc25pX2VjYl9lbmNyeXB0KGluLCBvdXQsIGxlbiwgY3R4LT5jaXBoZXJfZGF0YSwgY3R4LT5lbmNyeXB0KTsKKworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBhZXNuaV9nY21faW5pdF9rZXkoRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgdWludDhfdCAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaXYsIGludCBlbmMpIHsKKyAgRVZQX0FFU19HQ01fQ1RYICpnY3R4ID0gY3R4LT5jaXBoZXJfZGF0YTsKKyAgaWYgKCFpdiAmJiAha2V5KQorICAgIHJldHVybiAxOworICBpZiAoa2V5KSB7CisgICAgYWVzbmlfc2V0X2VuY3J5cHRfa2V5KGtleSwgY3R4LT5rZXlfbGVuICogOCwgJmdjdHgtPmtzLmtzKTsKKyAgICBDUllQVE9fZ2NtMTI4X2luaXQoJmdjdHgtPmdjbSwgJmdjdHgtPmtzLCAoYmxvY2sxMjhfZilhZXNuaV9lbmNyeXB0KTsKKyAgICBnY3R4LT5jdHIgPSAoY3RyMTI4X2YpYWVzbmlfY3RyMzJfZW5jcnlwdF9ibG9ja3M7CisgICAgLyogSWYgd2UgaGF2ZSBhbiBpdiBjYW4gc2V0IGl0IGRpcmVjdGx5LCBvdGhlcndpc2UgdXNlCisgICAgICogc2F2ZWQgSVYuICovCisgICAgaWYgKGl2ID09IE5VTEwgJiYgZ2N0eC0+aXZfc2V0KSB7CisgICAgICBpdiA9IGdjdHgtPml2OworICAgIH0KKyAgICBpZiAoaXYpIHsKKyAgICAgIENSWVBUT19nY20xMjhfc2V0aXYoJmdjdHgtPmdjbSwgaXYsIGdjdHgtPml2bGVuKTsKKyAgICAgIGdjdHgtPml2X3NldCA9IDE7CisgICAgfQorICAgIGdjdHgtPmtleV9zZXQgPSAxOworICB9IGVsc2UgeworICAgIC8qIElmIGtleSBzZXQgdXNlIElWLCBvdGhlcndpc2UgY29weSAqLworICAgIGlmIChnY3R4LT5rZXlfc2V0KSB7CisgICAgICBDUllQVE9fZ2NtMTI4X3NldGl2KCZnY3R4LT5nY20sIGl2LCBnY3R4LT5pdmxlbik7CisgICAgfSBlbHNlIHsKKyAgICAgIG1lbWNweShnY3R4LT5pdiwgaXYsIGdjdHgtPml2bGVuKTsKKyAgICB9CisgICAgZ2N0eC0+aXZfc2V0ID0gMTsKKyAgICBnY3R4LT5pdl9nZW4gPSAwOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgY29uc3QgRVZQX0NJUEhFUiBhZXNuaV8xMjhfY2JjID0geworICAgIE5JRF9hZXNfMTI4X2NiYywgICAgIDE2IC8qIGJsb2NrX3NpemUgKi8sIDE2IC8qIGtleV9zaXplICovLAorICAgIDE2IC8qIGl2X2xlbiAqLywgICAgIHNpemVvZihFVlBfQUVTX0tFWSksIEVWUF9DSVBIX0NCQ19NT0RFLAorICAgIE5VTEwgLyogYXBwX2RhdGEgKi8sIGFlc25pX2luaXRfa2V5LCAgICAgIGFlc25pX2NiY19jaXBoZXIsCisgICAgTlVMTCAvKiBjbGVhbnVwICovLCAgTlVMTCAvKiBjdHJsICovfTsKKworc3RhdGljIGNvbnN0IEVWUF9DSVBIRVIgYWVzbmlfMTI4X2N0ciA9IHsKKyAgICBOSURfYWVzXzEyOF9jdHIsICAgICAxIC8qIGJsb2NrX3NpemUgKi8sICAxNiAvKiBrZXlfc2l6ZSAqLywKKyAgICAxNiAvKiBpdl9sZW4gKi8sICAgICBzaXplb2YoRVZQX0FFU19LRVkpLCBFVlBfQ0lQSF9DVFJfTU9ERSwKKyAgICBOVUxMIC8qIGFwcF9kYXRhICovLCBhZXNuaV9pbml0X2tleSwgICAgICBhZXNfY3RyX2NpcGhlciwKKyAgICBOVUxMIC8qIGNsZWFudXAgKi8sICBOVUxMIC8qIGN0cmwgKi99OworCitzdGF0aWMgY29uc3QgRVZQX0NJUEhFUiBhZXNuaV8xMjhfZWNiID0geworICAgIE5JRF9hZXNfMTI4X2VjYiwgICAgIDE2IC8qIGJsb2NrX3NpemUgKi8sIDE2IC8qIGtleV9zaXplICovLAorICAgIDE2IC8qIGl2X2xlbiAqLywgICAgIHNpemVvZihFVlBfQUVTX0tFWSksIEVWUF9DSVBIX0VDQl9NT0RFLAorICAgIE5VTEwgLyogYXBwX2RhdGEgKi8sIGFlc25pX2luaXRfa2V5LCAgICAgIGFlc25pX2VjYl9jaXBoZXIsCisgICAgTlVMTCAvKiBjbGVhbnVwICovLCAgTlVMTCAvKiBjdHJsICovfTsKKworc3RhdGljIGNvbnN0IEVWUF9DSVBIRVIgYWVzbmlfMTI4X2djbSA9IHsKKyAgICBOSURfYWVzXzEyOF9nY20sIDEgLyogYmxvY2tfc2l6ZSAqLywgMTYgLyoga2V5X3NpemUgKi8sIDEyIC8qIGl2X2xlbiAqLywKKyAgICBzaXplb2YoRVZQX0FFU19HQ01fQ1RYKSwKKyAgICBFVlBfQ0lQSF9HQ01fTU9ERSB8IEVWUF9DSVBIX0NVU1RPTV9JViB8IEVWUF9DSVBIX0ZMQUdfQ1VTVE9NX0NJUEhFUiB8CisgICAgICAgIEVWUF9DSVBIX0FMV0FZU19DQUxMX0lOSVQgfCBFVlBfQ0lQSF9DVFJMX0lOSVQgfAorICAgICAgICBFVlBfQ0lQSF9GTEFHX0FFQURfQ0lQSEVSLAorICAgIE5VTEwgLyogYXBwX2RhdGEgKi8sIGFlc25pX2djbV9pbml0X2tleSwgYWVzX2djbV9jaXBoZXIsIGFlc19nY21fY2xlYW51cCwKKyAgICBhZXNfZ2NtX2N0cmx9OworCisKK3N0YXRpYyBjb25zdCBFVlBfQ0lQSEVSIGFlc25pXzI1Nl9jYmMgPSB7CisgICAgTklEX2Flc18xMjhfY2JjLCAgICAgMTYgLyogYmxvY2tfc2l6ZSAqLywgMzIgLyoga2V5X3NpemUgKi8sCisgICAgMTYgLyogaXZfbGVuICovLCAgICAgc2l6ZW9mKEVWUF9BRVNfS0VZKSwgRVZQX0NJUEhfQ0JDX01PREUsCisgICAgTlVMTCAvKiBhcHBfZGF0YSAqLywgYWVzbmlfaW5pdF9rZXksICAgICAgYWVzbmlfY2JjX2NpcGhlciwKKyAgICBOVUxMIC8qIGNsZWFudXAgKi8sICBOVUxMIC8qIGN0cmwgKi99OworCitzdGF0aWMgY29uc3QgRVZQX0NJUEhFUiBhZXNuaV8yNTZfY3RyID0geworICAgIE5JRF9hZXNfMTI4X2N0ciwgICAgIDEgLyogYmxvY2tfc2l6ZSAqLywgIDMyIC8qIGtleV9zaXplICovLAorICAgIDE2IC8qIGl2X2xlbiAqLywgICAgIHNpemVvZihFVlBfQUVTX0tFWSksIEVWUF9DSVBIX0NUUl9NT0RFLAorICAgIE5VTEwgLyogYXBwX2RhdGEgKi8sIGFlc25pX2luaXRfa2V5LCAgICAgIGFlc19jdHJfY2lwaGVyLAorICAgIE5VTEwgLyogY2xlYW51cCAqLywgIE5VTEwgLyogY3RybCAqL307CisKK3N0YXRpYyBjb25zdCBFVlBfQ0lQSEVSIGFlc25pXzI1Nl9lY2IgPSB7CisgICAgTklEX2Flc18xMjhfZWNiLCAgICAgMTYgLyogYmxvY2tfc2l6ZSAqLywgMzIgLyoga2V5X3NpemUgKi8sCisgICAgMTYgLyogaXZfbGVuICovLCAgICAgc2l6ZW9mKEVWUF9BRVNfS0VZKSwgRVZQX0NJUEhfRUNCX01PREUsCisgICAgTlVMTCAvKiBhcHBfZGF0YSAqLywgYWVzbmlfaW5pdF9rZXksICAgICAgYWVzbmlfZWNiX2NpcGhlciwKKyAgICBOVUxMIC8qIGNsZWFudXAgKi8sICBOVUxMIC8qIGN0cmwgKi99OworCitzdGF0aWMgY29uc3QgRVZQX0NJUEhFUiBhZXNuaV8yNTZfZ2NtID0geworICAgIE5JRF9hZXNfMjU2X2djbSwgMSAvKiBibG9ja19zaXplICovLCAzMiAvKiBrZXlfc2l6ZSAqLywgMTIgLyogaXZfbGVuICovLAorICAgIHNpemVvZihFVlBfQUVTX0dDTV9DVFgpLAorICAgIEVWUF9DSVBIX0dDTV9NT0RFIHwgRVZQX0NJUEhfQ1VTVE9NX0lWIHwgRVZQX0NJUEhfRkxBR19DVVNUT01fQ0lQSEVSIHwKKyAgICAgICAgRVZQX0NJUEhfQUxXQVlTX0NBTExfSU5JVCB8IEVWUF9DSVBIX0NUUkxfSU5JVCB8CisgICAgICAgIEVWUF9DSVBIX0ZMQUdfQUVBRF9DSVBIRVIsCisgICAgTlVMTCAvKiBhcHBfZGF0YSAqLywgYWVzbmlfZ2NtX2luaXRfa2V5LCBhZXNfZ2NtX2NpcGhlciwgYWVzX2djbV9jbGVhbnVwLAorICAgIGFlc19nY21fY3RybH07CisKKyNkZWZpbmUgRVZQX0NJUEhFUl9GVU5DVElPTihrZXliaXRzLCBtb2RlKSAgICAgICAgICAgICBcCisgIGNvbnN0IEVWUF9DSVBIRVIgKkVWUF9hZXNfIyNrZXliaXRzIyNfIyNtb2RlKHZvaWQpIHsgXAorICAgIGlmIChhZXNuaV9jYXBhYmxlKCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiAmYWVzbmlfIyNrZXliaXRzIyNfIyNtb2RlOyAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuICZhZXNfIyNrZXliaXRzIyNfIyNtb2RlOyAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2Vsc2UgIC8qIF5eXiAgT1BFTlNTTF9YODZfNjQgfHwgT1BFTlNTTF9YODYgKi8KKworI2RlZmluZSBFVlBfQ0lQSEVSX0ZVTkNUSU9OKGtleWJpdHMsIG1vZGUpICAgICAgICAgICAgIFwKKyAgY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Flc18jI2tleWJpdHMjI18jI21vZGUodm9pZCkgeyBcCisgICAgcmV0dXJuICZhZXNfIyNrZXliaXRzIyNfIyNtb2RlOyAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNlbmRpZgorCitFVlBfQ0lQSEVSX0ZVTkNUSU9OKDEyOCwgY2JjKQorRVZQX0NJUEhFUl9GVU5DVElPTigxMjgsIGN0cikKK0VWUF9DSVBIRVJfRlVOQ1RJT04oMTI4LCBlY2IpCitFVlBfQ0lQSEVSX0ZVTkNUSU9OKDEyOCwgZ2NtKQorCitFVlBfQ0lQSEVSX0ZVTkNUSU9OKDI1NiwgY2JjKQorRVZQX0NJUEhFUl9GVU5DVElPTigyNTYsIGN0cikKK0VWUF9DSVBIRVJfRlVOQ1RJT04oMjU2LCBlY2IpCitFVlBfQ0lQSEVSX0ZVTkNUSU9OKDI1NiwgZ2NtKQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2NpcGhlci9lX2Rlcy5jIGIvY3J5cHRvL2NpcGhlci9lX2Rlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YjA0ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vY2lwaGVyL2VfZGVzLmMKQEAgLTAsMCArMSwxNTcgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2NpcGhlci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZGVzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKworI2luY2x1ZGUgImludGVybmFsLmgiCisKKworI2RlZmluZSBFVlBfTUFYQ0hVTksgKDE8PDMwKQorCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuaW9uIHsKKyAgICBkb3VibGUgYWxpZ247CisgICAgREVTX2tleV9zY2hlZHVsZSBrczsKKyAgfSBrczsKK30gRVZQX0RFU19LRVk7CisKK3N0YXRpYyBpbnQgZGVzX2luaXRfa2V5KEVWUF9DSVBIRVJfQ1RYICpjdHgsIGNvbnN0IHVpbnQ4X3QgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKml2LCBpbnQgZW5jKSB7CisgIERFU19jYmxvY2sgKmRlc2tleSA9IChERVNfY2Jsb2NrICopa2V5OworICBFVlBfREVTX0tFWSAqZGF0ID0gKEVWUF9ERVNfS0VZICopY3R4LT5jaXBoZXJfZGF0YTsKKworICBERVNfc2V0X2tleShkZXNrZXksICZkYXQtPmtzLmtzKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZGVzX2NiY19jaXBoZXIoRVZQX0NJUEhFUl9DVFggKmN0eCwgdWludDhfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluX2xlbikgeworICBFVlBfREVTX0tFWSAqZGF0ID0gKEVWUF9ERVNfS0VZICopY3R4LT5jaXBoZXJfZGF0YTsKKworICB3aGlsZSAoaW5fbGVuID49IEVWUF9NQVhDSFVOSykgeworICAgIERFU19uY2JjX2VuY3J5cHQoaW4sIG91dCwgRVZQX01BWENIVU5LLCAmZGF0LT5rcy5rcywgKERFU19jYmxvY2sgKiljdHgtPml2LAorICAgICAgICAgICAgICAgICAgICAgY3R4LT5lbmNyeXB0KTsKKyAgICBpbl9sZW4gLT0gRVZQX01BWENIVU5LOworICAgIGluICs9IEVWUF9NQVhDSFVOSzsKKyAgICBvdXQgKz0gRVZQX01BWENIVU5LOworICB9CisKKyAgaWYgKGluX2xlbikgeworICAgIERFU19uY2JjX2VuY3J5cHQoaW4sIG91dCwgKGxvbmcpaW5fbGVuLCAmZGF0LT5rcy5rcywKKyAgICAgICAgICAgICAgICAgICAgIChERVNfY2Jsb2NrICopY3R4LT5pdiwgY3R4LT5lbmNyeXB0KTsKKyAgfQorCisgIHJldHVybiAxOworfQorCitzdGF0aWMgY29uc3QgRVZQX0NJUEhFUiBkZXNfY2JjID0geworICAgIE5JRF9kZXNfY2JjLCAgICAgICAgIDggLyogYmxvY2tfc2l6ZSAqLywgIDggLyoga2V5X3NpemUgKi8sCisgICAgOCAvKiBpdl9sZW4gKi8sICAgICAgc2l6ZW9mKEVWUF9ERVNfS0VZKSwgRVZQX0NJUEhfQ0JDX01PREUsCisgICAgTlVMTCAvKiBhcHBfZGF0YSAqLywgZGVzX2luaXRfa2V5LCAgICAgICAgZGVzX2NiY19jaXBoZXIsCisgICAgTlVMTCAvKiBjbGVhbnVwICovLCAgTlVMTCAvKiBjdHJsICovLCB9OworCitjb25zdCBFVlBfQ0lQSEVSICpFVlBfZGVzX2NiYyh2b2lkKSB7IHJldHVybiAmZGVzX2NiYzsgfQorCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5pb24geworICAgIGRvdWJsZSBhbGlnbjsKKyAgICBERVNfa2V5X3NjaGVkdWxlIGtzWzNdOworICB9IGtzOworfSBERVNfRURFX0tFWTsKKworCitzdGF0aWMgaW50IGRlc19lZGUzX2luaXRfa2V5KEVWUF9DSVBIRVJfQ1RYICpjdHgsIGNvbnN0IHVpbnQ4X3QgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaXYsIGludCBlbmMpIHsKKyAgREVTX2NibG9jayAqZGVza2V5ID0gKERFU19jYmxvY2sgKilrZXk7CisgIERFU19FREVfS0VZICpkYXQgPSAoREVTX0VERV9LRVkqKSBjdHgtPmNpcGhlcl9kYXRhOworCisgIERFU19zZXRfa2V5KCZkZXNrZXlbMF0sICZkYXQtPmtzLmtzWzBdKTsKKyAgREVTX3NldF9rZXkoJmRlc2tleVsxXSwgJmRhdC0+a3Mua3NbMV0pOworICBERVNfc2V0X2tleSgmZGVza2V5WzJdLCAmZGF0LT5rcy5rc1syXSk7CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZGVzX2VkZTNfY2JjX2NpcGhlcihFVlBfQ0lQSEVSX0NUWCAqY3R4LCB1aW50OF90ICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluX2xlbikgeworICBERVNfRURFX0tFWSAqZGF0ID0gKERFU19FREVfS0VZKikgY3R4LT5jaXBoZXJfZGF0YTsKKworICB3aGlsZSAoaW5fbGVuID49IEVWUF9NQVhDSFVOSykgeworICAgIERFU19lZGUzX2NiY19lbmNyeXB0KGluLCBvdXQsIEVWUF9NQVhDSFVOSywgJmRhdC0+a3Mua3NbMF0sICZkYXQtPmtzLmtzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICZkYXQtPmtzLmtzWzJdLCAoREVTX2NibG9jayAqKWN0eC0+aXYsIGN0eC0+ZW5jcnlwdCk7CisgICAgaW5fbGVuIC09IEVWUF9NQVhDSFVOSzsKKyAgICBpbiArPSBFVlBfTUFYQ0hVTks7CisgICAgb3V0ICs9IEVWUF9NQVhDSFVOSzsKKyAgfQorCisgIGlmIChpbl9sZW4pIHsKKyAgICBERVNfZWRlM19jYmNfZW5jcnlwdChpbiwgb3V0LCBpbl9sZW4sICZkYXQtPmtzLmtzWzBdLCAmZGF0LT5rcy5rc1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0LT5rcy5rc1syXSwgKERFU19jYmxvY2sgKiljdHgtPml2LCBjdHgtPmVuY3J5cHQpOworICB9CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjb25zdCBFVlBfQ0lQSEVSIGRlczNfY2JjID0geworICAgIE5JRF9kZXNfY2JjLCAgICAgICAgIDggLyogYmxvY2tfc2l6ZSAqLywgIDI0IC8qIGtleV9zaXplICovLAorICAgIDggLyogaXZfbGVuICovLCAgICAgIHNpemVvZihERVNfRURFX0tFWSksIEVWUF9DSVBIX0NCQ19NT0RFLAorICAgIE5VTEwgLyogYXBwX2RhdGEgKi8sIGRlc19lZGUzX2luaXRfa2V5LCAgIGRlc19lZGUzX2NiY19jaXBoZXIsCisgICAgTlVMTCAvKiBjbGVhbnVwICovLCAgTlVMTCAvKiBjdHJsICovLCB9OworCitjb25zdCBFVlBfQ0lQSEVSICpFVlBfZGVzX2VkZTNfY2JjKHZvaWQpIHsgcmV0dXJuICZkZXMzX2NiYzsgfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2NpcGhlci9lX251bGwuYyBiL2NyeXB0by9jaXBoZXIvZV9udWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk2NTIwZAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9jaXBoZXIvZV9udWxsLmMKQEAgLTAsMCArMSw4MyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvY2lwaGVyLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgorCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworCitzdGF0aWMgaW50IG51bGxfaW5pdF9rZXkoRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgdWludDhfdCAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKml2LCBpbnQgZW5jKSB7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IG51bGxfY2lwaGVyKEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVpbnQ4X3QgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpbl9sZW4pIHsKKyAgaWYgKGluICE9IG91dCkgeworICAgIG1lbWNweShvdXQsIGluLCBpbl9sZW4pOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgY29uc3QgRVZQX0NJUEhFUiBuX2NpcGhlciA9IHsKKyAgICBOSURfdW5kZWYsICAgICAgICAxIC8qIGJsb2NrIHNpemUgKi8sIDAgLyoga2V5X2xlbiAqLywgICAgIDAgLyogaXZfbGVuICovLAorICAgIDAgLyogY3R4X3NpemUgKi8sIDAgLyogZmxhZ3MgKi8sICAgICAgTlVMTCAvKiBhcHBfZGF0YSAqLywgbnVsbF9pbml0X2tleSwKKyAgICBudWxsX2NpcGhlciwgICAgICBOVUxMIC8qIGNsZWFudXAgKi8sIE5VTEwgLyogY3RybCAqLywKK307CisKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9lbmNfbnVsbCh2b2lkKSB7IHJldHVybiAmbl9jaXBoZXI7IH0KZGlmZiAtLWdpdCBhL2NyeXB0by9jaXBoZXIvZV9yYzQuYyBiL2NyeXB0by9jaXBoZXIvZV9yYzQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDA4NTVhCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2NpcGhlci9lX3JjNC5jCkBAIC0wLDAgKzEsODcgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2NpcGhlci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JjNC5oPgorCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworCitzdGF0aWMgaW50IHJjNF9pbml0X2tleShFVlBfQ0lQSEVSX0NUWCAqY3R4LCBjb25zdCB1aW50OF90ICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppdiwgaW50IGVuYykgeworICBSQzRfS0VZICpyYzRrZXkgPSAoUkM0X0tFWSAqKWN0eC0+Y2lwaGVyX2RhdGE7CisKKyAgUkM0X3NldF9rZXkocmM0a2V5LCBFVlBfQ0lQSEVSX0NUWF9rZXlfbGVuZ3RoKGN0eCksIGtleSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHJjNF9jaXBoZXIoRVZQX0NJUEhFUl9DVFggKmN0eCwgdWludDhfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5fbGVuKSB7CisgIFJDNF9LRVkgKnJjNGtleSA9IChSQzRfS0VZICopY3R4LT5jaXBoZXJfZGF0YTsKKworICBSQzQocmM0a2V5LCBpbl9sZW4sIGluLCBvdXQpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGNvbnN0IEVWUF9DSVBIRVIgcmM0ID0geworICAgIE5JRF9yYzQsICAgICAgICAgICAgIDEgLyogYmxvY2tfc2l6ZSAqLywgMTYgLyoga2V5X3NpemUgKi8sCisgICAgMCAvKiBpdl9sZW4gKi8sICAgICAgc2l6ZW9mKFJDNF9LRVkpLCAgICBFVlBfQ0lQSF9WQVJJQUJMRV9MRU5HVEgsCisgICAgTlVMTCAvKiBhcHBfZGF0YSAqLywgcmM0X2luaXRfa2V5LCAgICAgICByYzRfY2lwaGVyLAorICAgIE5VTEwgLyogY2xlYW51cCAqLywgIE5VTEwgLyogY3RybCAqLywgfTsKKworY29uc3QgRVZQX0NJUEhFUiAqRVZQX3JjNCh2b2lkKSB7IHJldHVybiAmcmM0OyB9CmRpZmYgLS1naXQgYS9jcnlwdG8vY2lwaGVyL2ludGVybmFsLmggYi9jcnlwdG8vY2lwaGVyL2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVkYzA1OQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9jaXBoZXIvaW50ZXJuYWwuaApAQCAtMCwwICsxLDExMyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2lmbmRlZiBPUEVOU1NMX0hFQURFUl9DSVBIRVJfSU5URVJOQUxfSAorI2RlZmluZSBPUEVOU1NMX0hFQURFUl9DSVBIRVJfSU5URVJOQUxfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9iYXNlLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCitzdHJ1Y3QgZXZwX2NpcGhlcl9zdCB7CisgIC8qIHR5cGUgY29udGFpbnMgYSBOSUQgaWRlbnRpZmluZyB0aGUgY2lwaGVyLiAoRm9yIGV4YW1wbGUsIE5JRF9yYzQuKSAqLworICBpbnQgbmlkOworCisgIC8qIGJsb2NrX3NpemUgY29udGFpbnMgdGhlIGJsb2NrIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgY2lwaGVyLCBvciAxIGZvciBhCisgICAqIHN0cmVhbSBjaXBoZXIuICovCisgIHVuc2lnbmVkIGJsb2NrX3NpemU7CisKKyAgLyoga2V5X2xlbiBjb250YWlucyB0aGUga2V5IHNpemUsIGluIGJ5dGVzLCBmb3IgdGhlIGNpcGhlci4gSWYgdGhlIGNpcGhlcgorICAgKiB0YWtlcyBhIHZhcmlhYmxlIGtleSBzaXplIHRoZW4gdGhpcyBjb250YWlucyB0aGUgZGVmYXVsdCBzaXplLiAqLworICB1bnNpZ25lZCBrZXlfbGVuOworCisgIC8qIGl2X2xlbiBjb250YWlucyB0aGUgSVYgc2l6ZSwgaW4gYnl0ZXMsIG9yIHplcm8gaWYgaW5hcHBsaWNhYmxlLiAqLworICB1bnNpZ25lZCBpdl9sZW47CisKKyAgLyogY3R4X3NpemUgY29udGFpbnMgdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgcGVyLWtleSBjb250ZXh0IGZvciB0aGlzCisgICAqIGNpcGhlci4gKi8KKyAgdW5zaWduZWQgY3R4X3NpemU7CisKKyAgLyogZmxhZ3MgY29udGFpbnMgdGhlIE9SIG9mIGEgbnVtYmVyIG9mIGZsYWdzLiBTZWUgfEVWUF9DSVBIXyp8LiAqLworICB1aW50MzJfdCBmbGFnczsKKworICAvKiBhcHBfZGF0YSBpcyBhIHBvaW50ZXIgdG8gb3BhcXVlLCB1c2VyIGRhdGEuICovCisgIHZvaWQgKmFwcF9kYXRhOworCisgIGludCAoKmluaXQpKEVWUF9DSVBIRVJfQ1RYICpjdHgsIGNvbnN0IHVpbnQ4X3QgKmtleSwgY29uc3QgdWludDhfdCAqaXYsCisgICAgICAgICAgICAgIGludCBlbmMpOworCisgIGludCAoKmNpcGhlcikoRVZQX0NJUEhFUl9DVFggKmN0eCwgdWludDhfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwKKyAgICAgICAgICAgICAgICBzaXplX3QgaW5sKTsKKworICBpbnQgKCpjbGVhbnVwKShFVlBfQ0lQSEVSX0NUWCAqKTsKKworICBpbnQgKCpjdHJsKShFVlBfQ0lQSEVSX0NUWCAqLCBpbnQgdHlwZSwgaW50IGFyZywgdm9pZCAqcHRyKTsKK307CisKKy8qIEVWUF9DSVBIX01PREVfTUFTSyBjb250YWlucyB0aGUgYml0cyBvZiB8ZmxhZ3N8IHRoYXQgcmVwcmVzZW50IHRoZSBtb2RlLiAqLworI2RlZmluZSBFVlBfQ0lQSF9NT0RFX01BU0sgMHgzZgorCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfSAvKiBleHRlcm4gQyAqLworI2VuZGlmCisKKyNlbmRpZiAvKiBPUEVOU1NMX0hFQURFUl9DSVBIRVJfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2NvbXAvQ01ha2VMaXN0cy50eHQgYi9jcnlwdG8vY29tcC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDU0M2FkCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2NvbXAvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxMCBAQAoraW5jbHVkZV9kaXJlY3RvcmllcyguIC4uIC4uLy4uL2luY2x1ZGUpCisKK2FkZF9saWJyYXJ5KAorCWNvbXAKKworCU9CSkVDVAorCisJY29tcC5jCisJemxpYi5jCispCmRpZmYgLS1naXQgYS9jcnlwdG8vY29tcC9jb21wLmMgYi9jcnlwdG8vY29tcC9jb21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRjOWE4MAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9jb21wL2NvbXAuYwpAQCAtMCwwICsxLDExOSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvY29tcC5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKworCitDT01QX0NUWCAqQ09NUF9DVFhfbmV3KENPTVBfTUVUSE9EICptZXRoKSB7CisgIENPTVBfQ1RYICpyZXQ7CisKKyAgcmV0ID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKENPTVBfQ1RYKSk7CisgIGlmIChyZXQgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgbWVtc2V0KHJldCwgMCwgc2l6ZW9mKENPTVBfQ1RYKSk7CisgIHJldC0+bWV0aCA9IG1ldGg7CisgIGlmIChyZXQtPm1ldGgtPmluaXQgIT0gTlVMTCAmJiAhcmV0LT5tZXRoLT5pbml0KHJldCkpIHsKKyAgICBPUEVOU1NMX2ZyZWUocmV0KTsKKyAgICByZXQgPSBOVUxMOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKwordm9pZCBDT01QX0NUWF9mcmVlKENPTVBfQ1RYICpjdHgpIHsKKyAgaWYgKGN0eCA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGN0eC0+bWV0aC0+ZmluaXNoICE9IE5VTEwpIHsKKyAgICBjdHgtPm1ldGgtPmZpbmlzaChjdHgpOworICB9CisKKyAgT1BFTlNTTF9mcmVlKGN0eCk7Cit9CisKK2ludCBDT01QX2NvbXByZXNzX2Jsb2NrKENPTVBfQ1RYICpjdHgsIHVpbnQ4X3QgKm91dCwgc2l6ZV90IG91dF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICppbiwgc2l6ZV90IGluX2xlbikgeworICBpbnQgcmV0OworICBpZiAoY3R4LT5tZXRoLT5jb21wcmVzcyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHJldCA9IGN0eC0+bWV0aC0+Y29tcHJlc3MoY3R4LCBvdXQsIG91dF9sZW4sIGluLCBpbl9sZW4pOworICBpZiAocmV0ID4gMCkgeworICAgIGN0eC0+Y29tcHJlc3NfaW4gKz0gaW5fbGVuOworICAgIGN0eC0+Y29tcHJlc3Nfb3V0ICs9IHJldDsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitpbnQgQ09NUF9leHBhbmRfYmxvY2soQ09NUF9DVFggKmN0eCwgdWludDhfdCAqb3V0LCBzaXplX3Qgb3V0X2xlbiwgdWludDhfdCAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluX2xlbikgeworICBpbnQgcmV0OworCisgIGlmIChjdHgtPm1ldGgtPmV4cGFuZCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHJldCA9IGN0eC0+bWV0aC0+ZXhwYW5kKGN0eCwgb3V0LCBvdXRfbGVuLCBpbiwgaW5fbGVuKTsKKyAgaWYgKHJldCA+IDApIHsKKyAgICBjdHgtPmV4cGFuZF9pbiArPSBpbl9sZW47CisgICAgY3R4LT5leHBhbmRfb3V0ICs9IHJldDsKKyAgfQorICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2NvbXAvY29tcC5oIGIvY3J5cHRvL2NvbXAvY29tcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYTk2N2EKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vY29tcC9jb21wLmgKQEAgLTAsMCArMSwxMjMgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpZm5kZWYgT1BFTlNTTF9IRUFERVJfQ09NUF9ICisjZGVmaW5lIE9QRU5TU0xfSEVBREVSX0NPTVBfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9iYXNlLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2V4X2RhdGEuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIENvbXByZXNzaW9uIG1ldGhvZHMgKi8KKworLyogQ09NUF96bGliIHJldHVybnMgYSBtZXRob2QgdGhhdCBpbXBsZW1lbnRzIHN0YW5kYXJkLCB6bGliIGNvbXByZXNzaW9uLiAqLworQ09NUF9NRVRIT0QgKkNPTVBfemxpYih2b2lkKTsKKworCisvKiBDb21wcmVzc2lvbiBjb250ZXh0cyAqLworCisvKiBDT01QX0NUWF9uZXcgYWxsb2NhdGVzIGEgZnJlc2ggfENPTVBfQ1RYfCB3aGljaCB3aWxsIGNvbXByZXNzIHdpdGggdGhlIGdpdmVuCisgKiBjb21wcmVzc2lvbiBtZXRob2QuIEl0IHJldHVybnMgdGhlIG5ldyB8Q09NUF9DVFh8IG9yIE5VTEwgb24gZXJyb3IuICovCitDT01QX0NUWCAqQ09NUF9DVFhfbmV3KENPTVBfTUVUSE9EICptZXRoKTsKKworLyogQ09NUF9DVFhfZnJlZSBmcmVlcyBhbGwgZGF0YSBvd25lZCBieSB8Y3R4fCBhbmQgfGN0eHwgaXRzZWxmLiAqLwordm9pZCBDT01QX0NUWF9mcmVlKENPTVBfQ1RYICpjdHgpOworCisKK2ludCBDT01QX2NvbXByZXNzX2Jsb2NrKENPTVBfQ1RYICpjdHgsIHVpbnQ4X3QgKm91dCwgc2l6ZV90IG91dF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICppbiwgc2l6ZV90IGluX2xlbik7CisKK2ludCBDT01QX2V4cGFuZF9ibG9jayhDT01QX0NUWCAqY3R4LCB1aW50OF90ICpvdXQsIHNpemVfdCBvdXRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmluLCBzaXplX3QgaW5fbGVuKTsKKworCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAqLworCitzdHJ1Y3QgY29tcF9jdHhfc3QgeworICBDT01QX01FVEhPRCAqbWV0aDsKKyAgdW5zaWduZWQgbG9uZyBjb21wcmVzc19pbjsKKyAgdW5zaWduZWQgbG9uZyBjb21wcmVzc19vdXQ7CisgIHVuc2lnbmVkIGxvbmcgZXhwYW5kX2luOworICB1bnNpZ25lZCBsb25nIGV4cGFuZF9vdXQ7CisKKyAgQ1JZUFRPX0VYX0RBVEEgZXhfZGF0YTsKK307CisKK3N0cnVjdCBjb21wX21ldGhvZF9zdCB7CisgIGludCB0eXBlOyAgICAgICAgIC8qIE5JRCBmb3IgY29tcHJlc3Npb24gbGlicmFyeSAqLworICBjb25zdCBjaGFyICpuYW1lOyAvKiBBIHRleHQgc3RyaW5nIHRvIGlkZW50aWZ5IHRoZSBsaWJyYXJ5ICovCisgIGludCAoKmluaXQpKENPTVBfQ1RYICpjdHgpOworICB2b2lkICgqZmluaXNoKShDT01QX0NUWCAqY3R4KTsKKyAgaW50ICgqY29tcHJlc3MpKENPTVBfQ1RYICpjdHgsIHVpbnQ4X3QgKm91dCwgdW5zaWduZWQgaW50IG9sZW4sIHVpbnQ4X3QgKmluLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlsZW4pOworICBpbnQgKCpleHBhbmQpKENPTVBfQ1RYICpjdHgsIHVpbnQ4X3QgKm91dCwgdW5zaWduZWQgaW50IG9sZW4sIHVpbnQ4X3QgKmluLAorICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpbGVuKTsKKyAgLyogVGhlIGZvbGxvd2luZyB0d28gZG8gTk9USElORywgYnV0IGFyZSBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCisgIGxvbmcgKCpjdHJsKSh2b2lkKTsKKyAgbG9uZyAoKmNhbGxiYWNrX2N0cmwpKHZvaWQpOworfSAvKiBDT01QX01FVEhPRCAqLzsKKworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30gIC8qIGV4dGVybiBDICovCisjZW5kaWYKKworI2VuZGlmICAvKiBPUEVOU1NMX0hFQURFUl9ITUFDX0ggKi8KZGlmZiAtLWdpdCBhL2NyeXB0by9jb21wL3psaWIuYyBiL2NyeXB0by9jb21wL3psaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjdmZGMzCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2NvbXAvemxpYi5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2NvbXAuaD4KKworCitDT01QX01FVEhPRCAqQ09NUF96bGliKHZvaWQpIHsKKyAgcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vY29uZi9DTWFrZUxpc3RzLnR4dCBiL2NyeXB0by9jb25mL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NDM5ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vY29uZi9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDEwIEBACitpbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKKworYWRkX2xpYnJhcnkoCisJY29uZgorCisJT0JKRUNUCisKKwljb25mLmMKKwljb25mX2Vycm9yLmMKKykKZGlmZiAtLWdpdCBhL2NyeXB0by9jb25mL2NvbmYuYyBiL2NyeXB0by9jb25mL2NvbmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OThhOWJhCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2NvbmYvY29uZi5jCkBAIC0wLDAgKzEsNzQxIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9jb25mLmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2J1Zi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKworI2luY2x1ZGUgImNvbmZfZGVmLmgiCisKKworc3RhdGljIHVpbnQzMl90IGNvbmZfdmFsdWVfaGFzaChjb25zdCBDT05GX1ZBTFVFICp2KSB7CisgIHJldHVybiAobGhfc3RyaGFzaCh2LT5zZWN0aW9uKSA8PCAyKSBeIGxoX3N0cmhhc2godi0+bmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgY29uZl92YWx1ZV9jbXAoY29uc3QgQ09ORl9WQUxVRSAqYSwgY29uc3QgQ09ORl9WQUxVRSAqYikgeworICBpbnQgaTsKKworICBpZiAoYS0+c2VjdGlvbiAhPSBiLT5zZWN0aW9uKSB7CisgICAgaSA9IHN0cmNtcChhLT5zZWN0aW9uLCBiLT5zZWN0aW9uKTsKKyAgICBpZiAoaSkgeworICAgICAgcmV0dXJuIGk7CisgICAgfQorICB9CisKKyAgaWYgKGEtPm5hbWUgIT0gTlVMTCAmJiBiLT5uYW1lICE9IE5VTEwpIHsKKyAgICByZXR1cm4gc3RyY21wKGEtPm5hbWUsIGItPm5hbWUpOworICB9IGVsc2UgaWYgKGEtPm5hbWUgPT0gYi0+bmFtZSkgeworICAgIHJldHVybiAwOworICB9IGVsc2UgeworICAgIHJldHVybiAoYS0+bmFtZSA9PSBOVUxMKSA/IC0xIDogMTsKKyAgfQorfQorCitDT05GICpOQ09ORl9uZXcoKSB7CisgIENPTkYgKmNvbmY7CisKKyAgY29uZiA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihDT05GKSk7CisgIGlmIChjb25mID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGNvbmYtPmRhdGEgPSBsaF9DT05GX1ZBTFVFX25ldyhjb25mX3ZhbHVlX2hhc2gsIGNvbmZfdmFsdWVfY21wKTsKKyAgaWYgKGNvbmYtPmRhdGEgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfZnJlZShjb25mKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJldHVybiBjb25mOworfQorCitzdGF0aWMgdm9pZCB2YWx1ZV9mcmVlX2NvbnRlbnRzKENPTkZfVkFMVUUgKnZhbHVlKSB7CisgIGlmICh2YWx1ZS0+c2VjdGlvbikgeworICAgIE9QRU5TU0xfZnJlZSh2YWx1ZS0+c2VjdGlvbik7CisgIH0KKyAgaWYgKHZhbHVlLT5uYW1lKSB7CisgICAgT1BFTlNTTF9mcmVlKHZhbHVlLT5uYW1lKTsKKyAgICBpZiAodmFsdWUtPnZhbHVlKSB7CisgICAgICBPUEVOU1NMX2ZyZWUodmFsdWUtPnZhbHVlKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKHZhbHVlLT52YWx1ZSkgeworICAgICAgc2tfQ09ORl9WQUxVRV9mcmVlKChTVEFDS19PRihDT05GX1ZBTFVFKSopdmFsdWUtPnZhbHVlKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgdmFsdWVfZnJlZShDT05GX1ZBTFVFICp2YWx1ZSkgeworICB2YWx1ZV9mcmVlX2NvbnRlbnRzKHZhbHVlKTsKKyAgT1BFTlNTTF9mcmVlKHZhbHVlKTsKK30KKwordm9pZCBOQ09ORl9mcmVlKENPTkYgKmNvbmYpIHsKKyAgaWYgKGNvbmYgPT0gTlVMTCB8fCBjb25mLT5kYXRhID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKworICBsaF9DT05GX1ZBTFVFX2RvYWxsKGNvbmYtPmRhdGEsIHZhbHVlX2ZyZWVfY29udGVudHMpOworICBsaF9DT05GX1ZBTFVFX2ZyZWUoY29uZi0+ZGF0YSk7CisgIE9QRU5TU0xfZnJlZShjb25mKTsKK30KKworQ09ORl9WQUxVRSAqTkNPTkZfbmV3X3NlY3Rpb24oY29uc3QgQ09ORiAqY29uZiwgY29uc3QgY2hhciAqc2VjdGlvbikgeworICBTVEFDS19PRihDT05GX1ZBTFVFKSAqc2sgPSBOVUxMOworICBpbnQgb2sgPSAwLCBpOworICBDT05GX1ZBTFVFICp2ID0gTlVMTCwgKm9sZF92YWx1ZTsKKworICBzayA9IHNrX0NPTkZfVkFMVUVfbmV3X251bGwoKTsKKyAgdiA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihDT05GX1ZBTFVFKSk7CisgIGlmIChzayA9PSBOVUxMIHx8IHYgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisgIGkgPSBzdHJsZW4oc2VjdGlvbikgKyAxOworICB2LT5zZWN0aW9uID0gT1BFTlNTTF9tYWxsb2MoaSk7CisgIGlmICh2LT5zZWN0aW9uID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIG1lbWNweSh2LT5zZWN0aW9uLCBzZWN0aW9uLCBpKTsKKyAgdi0+c2VjdGlvbltpLTFdID0gMDsKKyAgdi0+bmFtZSA9IE5VTEw7CisgIHYtPnZhbHVlID0gKGNoYXIgKilzazsKKworICBpZiAoIWxoX0NPTkZfVkFMVUVfaW5zZXJ0KGNvbmYtPmRhdGEsICZvbGRfdmFsdWUsIHYpKSB7CisgICAgZ290byBlcnI7CisgIH0KKyAgaWYgKG9sZF92YWx1ZSkgeworICAgIHZhbHVlX2ZyZWUob2xkX3ZhbHVlKTsKKyAgfQorICBvayA9IDE7CisKK2VycjoKKyAgaWYgKCFvaykgeworICAgIGlmIChzayAhPSBOVUxMKSB7CisgICAgICBza19DT05GX1ZBTFVFX2ZyZWUoc2spOworICAgIH0KKyAgICBpZiAodiAhPSBOVUxMKSB7CisgICAgICBPUEVOU1NMX2ZyZWUodik7CisgICAgfQorICAgIHYgPSBOVUxMOworICB9CisgIHJldHVybiB2OworfQorCitzdGF0aWMgaW50IHN0cl9jb3B5KENPTkYgKmNvbmYsIGNoYXIgKnNlY3Rpb24sIGNoYXIgKipwdG8sIGNoYXIgKmZyb20pIHsKKyAgaW50IHEsIHIsIHJyID0gMCwgdG8gPSAwLCBsZW4gPSAwOworICBjaGFyICpzLCAqZSwgKnJwLCAqcnJwLCAqbnAsICpjcCwgdjsKKyAgY29uc3QgY2hhciAqcDsKKyAgQlVGX01FTSAqYnVmOworCisgIGJ1ZiA9IEJVRl9NRU1fbmV3KCk7CisgIGlmIChidWYgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgbGVuID0gc3RybGVuKGZyb20pICsgMTsKKyAgaWYgKCFCVUZfTUVNX2dyb3coYnVmLCBsZW4pKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBmb3IgKDs7KSB7CisgICAgaWYgKElTX1FVT1RFKGNvbmYsICpmcm9tKSkgeworICAgICAgcSA9ICpmcm9tOworICAgICAgZnJvbSsrOworICAgICAgd2hpbGUgKCFJU19FT0YoY29uZiwgKmZyb20pICYmICgqZnJvbSAhPSBxKSkgeworICAgICAgICBpZiAoSVNfRVNDKGNvbmYsICpmcm9tKSkgeworICAgICAgICAgIGZyb20rKzsKKyAgICAgICAgICBpZiAoSVNfRU9GKGNvbmYsICpmcm9tKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJ1Zi0+ZGF0YVt0bysrXSA9ICooZnJvbSsrKTsKKyAgICAgIH0KKyAgICAgIGlmICgqZnJvbSA9PSBxKSB7CisgICAgICAgIGZyb20rKzsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKElTX0RRVU9URShjb25mLCAqZnJvbSkpIHsKKyAgICAgIHEgPSAqZnJvbTsKKyAgICAgIGZyb20rKzsKKyAgICAgIHdoaWxlICghSVNfRU9GKGNvbmYsICpmcm9tKSkgeworICAgICAgICBpZiAoKmZyb20gPT0gcSkgeworICAgICAgICAgIGlmICgqKGZyb20gKyAxKSA9PSBxKSB7CisgICAgICAgICAgICBmcm9tKys7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBidWYtPmRhdGFbdG8rK10gPSAqKGZyb20rKyk7CisgICAgICB9CisgICAgICBpZiAoKmZyb20gPT0gcSkgeworICAgICAgICBmcm9tKys7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChJU19FU0MoY29uZiwgKmZyb20pKSB7CisgICAgICBmcm9tKys7CisgICAgICB2ID0gKihmcm9tKyspOworICAgICAgaWYgKElTX0VPRihjb25mLCB2KSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSBpZiAodiA9PSAncicpIHsKKyAgICAgICAgdiA9ICdccic7CisgICAgICB9IGVsc2UgaWYgKHYgPT0gJ24nKSB7CisgICAgICAgIHYgPSAnXG4nOworICAgICAgfSBlbHNlIGlmICh2ID09ICdiJykgeworICAgICAgICB2ID0gJ1xiJzsKKyAgICAgIH0gZWxzZSBpZiAodiA9PSAndCcpIHsKKyAgICAgICAgdiA9ICdcdCc7CisgICAgICB9CisgICAgICBidWYtPmRhdGFbdG8rK10gPSB2OworICAgIH0gZWxzZSBpZiAoSVNfRU9GKGNvbmYsICpmcm9tKSkgeworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIGlmICgqZnJvbSA9PSAnJCcpIHsKKyAgICAgIC8qIHRyeSB0byBleHBhbmQgaXQgKi8KKyAgICAgIHJycCA9IE5VTEw7CisgICAgICBzID0gJihmcm9tWzFdKTsKKyAgICAgIGlmICgqcyA9PSAneycpIHsKKyAgICAgICAgcSA9ICd9JzsKKyAgICAgIH0gZWxzZSBpZiAoKnMgPT0gJygnKSB7CisgICAgICAgIHEgPSAnKSc7CisgICAgICB9IGVsc2UgeworICAgICAgICBxID0gMDsKKyAgICAgIH0KKworICAgICAgaWYgKHEpIHsKKyAgICAgICAgcysrOworICAgICAgfQorICAgICAgY3AgPSBzZWN0aW9uOworICAgICAgZSA9IG5wID0gczsKKyAgICAgIHdoaWxlIChJU19BTFBIQV9OVU1FUklDKGNvbmYsICplKSkgeworICAgICAgICBlKys7CisgICAgICB9CisgICAgICBpZiAoZVswXSA9PSAnOicgJiYgZVsxXSA9PSAnOicpIHsKKyAgICAgICAgY3AgPSBucDsKKyAgICAgICAgcnJwID0gZTsKKyAgICAgICAgcnIgPSAqZTsKKyAgICAgICAgKnJycCA9ICdcMCc7CisgICAgICAgIGUgKz0gMjsKKyAgICAgICAgbnAgPSBlOworICAgICAgICB3aGlsZSAoSVNfQUxQSEFfTlVNRVJJQyhjb25mLCAqZSkpIHsKKyAgICAgICAgICBlKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHIgPSAqZTsKKyAgICAgICplID0gJ1wwJzsKKyAgICAgIHJwID0gZTsKKyAgICAgIGlmIChxKSB7CisgICAgICAgIGlmIChyICE9IHEpIHsKKyAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDT05GLCBzdHJfY29weSwgQ09ORl9SX05PX0NMT1NFX0JSQUNFKTsKKyAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgICAgICBlKys7CisgICAgICB9CisgICAgICAvKiBTbyBhdCB0aGlzIHBvaW50IHdlIGhhdmUKKyAgICAgICAqIG5wIHdoaWNoIGlzIHRoZSBzdGFydCBvZiB0aGUgbmFtZSBzdHJpbmcgd2hpY2ggaXMKKyAgICAgICAqICAgJ1wwJyB0ZXJtaW5hdGVkLgorICAgICAgICogY3Agd2hpY2ggaXMgdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uIHN0cmluZyB3aGljaCBpcworICAgICAgICogICAnXDAnIHRlcm1pbmF0ZWQuCisgICAgICAgKiBlIGlzIHRoZSAnbmV4dCBwb2ludCBhZnRlcicuCisgICAgICAgKiByIGFuZCByciBhcmUgdGhlIGNoYXJzIHJlcGxhY2VkIGJ5IHRoZSAnXDAnCisgICAgICAgKiBycCBhbmQgcnJwIGlzIHdoZXJlICdyJyBhbmQgJ3JyJyBjYW1lIGZyb20uICovCisgICAgICBwID0gTkNPTkZfZ2V0X3N0cmluZyhjb25mLCBjcCwgbnApOworICAgICAgaWYgKHJycCAhPSBOVUxMKSB7CisgICAgICAgICpycnAgPSBycjsKKyAgICAgIH0KKyAgICAgICpycCA9IHI7CisgICAgICBpZiAocCA9PSBOVUxMKSB7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENPTkYsIHN0cl9jb3B5LCBDT05GX1JfVkFSSUFCTEVfSEFTX05PX1ZBTFVFKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgICBCVUZfTUVNX2dyb3dfY2xlYW4oYnVmLCAoc3RybGVuKHApICsgYnVmLT5sZW5ndGggLSAoZSAtIGZyb20pKSk7CisgICAgICB3aGlsZSAoKnApIHsKKyAgICAgICAgYnVmLT5kYXRhW3RvKytdID0gKihwKyspOworICAgICAgfQorCisgICAgICAvKiBTaW5jZSB3ZSBjaGFuZ2UgdGhlIHBvaW50ZXIgJ2Zyb20nLCB3ZSBhbHNvIGhhdmUKKyAgICAgICAgIHRvIGNoYW5nZSB0aGUgcGVyY2VpdmVkIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGl0CisgICAgICAgICBwb2ludHMgYXQuICAvUkwgKi8KKyAgICAgIGxlbiAtPSBlIC0gZnJvbTsKKyAgICAgIGZyb20gPSBlOworCisgICAgICAvKiBJbiBjYXNlIHRoZXJlIHdlcmUgbm8gYnJhY2VzIG9yIHBhcmVudGhlc2lzIGFyb3VuZAorICAgICAgICAgdGhlIHZhcmlhYmxlIHJlZmVyZW5jZSwgd2UgaGF2ZSB0byBwdXQgYmFjayB0aGUKKyAgICAgICAgIGNoYXJhY3RlciB0aGF0IHdhcyByZXBsYWNlZCB3aXRoIGEgJ1wwJy4gIC9STCAqLworICAgICAgKnJwID0gcjsKKyAgICB9IGVsc2UgeworICAgICAgYnVmLT5kYXRhW3RvKytdID0gKihmcm9tKyspOworICAgIH0KKyAgfQorCisgIGJ1Zi0+ZGF0YVt0b10gPSAnXDAnOworICBpZiAoKnB0byAhPSBOVUxMKSB7CisgICAgT1BFTlNTTF9mcmVlKCpwdG8pOworICB9CisgICpwdG8gPSBidWYtPmRhdGE7CisgIE9QRU5TU0xfZnJlZShidWYpOworICByZXR1cm4gMTsKKworZXJyOgorICBpZiAoYnVmICE9IE5VTEwpIHsKKyAgICBCVUZfTUVNX2ZyZWUoYnVmKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIENPTkZfVkFMVUUgKmdldF9zZWN0aW9uKGNvbnN0IENPTkYgKmNvbmYsIGNvbnN0IGNoYXIgKnNlY3Rpb24pIHsKKyAgQ09ORl9WQUxVRSB0ZW1wbGF0ZTsKKworICBtZW1zZXQoJnRlbXBsYXRlLCAwLCBzaXplb2YodGVtcGxhdGUpKTsKKyAgdGVtcGxhdGUuc2VjdGlvbiA9IChjaGFyICopIHNlY3Rpb247CisgIHJldHVybiBsaF9DT05GX1ZBTFVFX3JldHJpZXZlKGNvbmYtPmRhdGEsICZ0ZW1wbGF0ZSk7Cit9CisKK1NUQUNLX09GKENPTkZfVkFMVUUpICpOQ09ORl9nZXRfc2VjdGlvbihjb25zdCBDT05GICpjb25mLCBjb25zdCBjaGFyICpzZWN0aW9uKSB7CisgIENPTkZfVkFMVUUgKnNlY3Rpb25fdmFsdWUgPSBnZXRfc2VjdGlvbihjb25mLCBzZWN0aW9uKTsKKyAgaWYgKHNlY3Rpb25fdmFsdWUgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiAoU1RBQ0tfT0YoQ09ORl9WQUxVRSkqKSBzZWN0aW9uX3ZhbHVlLT52YWx1ZTsKK30KKworY29uc3QgY2hhciAqTkNPTkZfZ2V0X3N0cmluZyhjb25zdCBDT05GICpjb25mLCBjb25zdCBjaGFyICpzZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKSB7CisgIENPTkZfVkFMVUUgdGVtcGxhdGUsICp2YWx1ZTsKKworICBtZW1zZXQoJnRlbXBsYXRlLCAwLCBzaXplb2YodGVtcGxhdGUpKTsKKyAgdGVtcGxhdGUuc2VjdGlvbiA9IChjaGFyICopIHNlY3Rpb247CisgIHRlbXBsYXRlLm5hbWUgPSAoY2hhciAqKSBuYW1lOworICB2YWx1ZSA9IGxoX0NPTkZfVkFMVUVfcmV0cmlldmUoY29uZi0+ZGF0YSwgJnRlbXBsYXRlKTsKKyAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gdmFsdWUtPnZhbHVlOworfQorCitpbnQgYWRkX3N0cmluZyhjb25zdCBDT05GICpjb25mLCBDT05GX1ZBTFVFICpzZWN0aW9uLCBDT05GX1ZBTFVFICp2YWx1ZSkgeworICBTVEFDS19PRihDT05GX1ZBTFVFKSAqc2VjdGlvbl9zdGFjayA9IChTVEFDS19PRihDT05GX1ZBTFVFKSopIHNlY3Rpb24tPnZhbHVlOworICBDT05GX1ZBTFVFICpvbGRfdmFsdWU7CisKKyAgdmFsdWUtPnNlY3Rpb24gPSBzZWN0aW9uLT5zZWN0aW9uOworICBpZiAoIXNrX0NPTkZfVkFMVUVfcHVzaChzZWN0aW9uX3N0YWNrLCB2YWx1ZSkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmICghbGhfQ09ORl9WQUxVRV9pbnNlcnQoY29uZi0+ZGF0YSwgJm9sZF92YWx1ZSwgdmFsdWUpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKG9sZF92YWx1ZSAhPSBOVUxMKSB7CisgICAgKHZvaWQpc2tfQ09ORl9WQUxVRV9kZWxldGVfcHRyKHNlY3Rpb25fc3RhY2ssIG9sZF92YWx1ZSk7CisgICAgdmFsdWVfZnJlZShvbGRfdmFsdWUpOworICB9CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjaGFyICplYXRfd3MoQ09ORiAqY29uZiwgY2hhciAqcCkgeworICB3aGlsZSAoSVNfV1MoY29uZiwgKnApICYmICFJU19FT0YoY29uZiwgKnApKSB7CisgICAgcCsrOworICB9CisgIHJldHVybiBwOworfQorCisjZGVmaW5lIHNjYW5fZXNjKGNvbmYsIHApICgoKElTX0VPRigoY29uZiksIChwKVsxXSkpID8gKChwKSArIDEpIDogKChwKSArIDIpKSkKKworc3RhdGljIGNoYXIgKmVhdF9hbHBoYV9udW1lcmljKENPTkYgKmNvbmYsIGNoYXIgKnApIHsKKyAgZm9yICg7OykgeworICAgIGlmIChJU19FU0MoY29uZiwgKnApKSB7CisgICAgICBwID0gc2Nhbl9lc2MoY29uZiwgcCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKCFJU19BTFBIQV9OVU1FUklDX1BVTkNUKGNvbmYsICpwKSkgeworICAgICAgcmV0dXJuIHA7CisgICAgfQorICAgIHArKzsKKyAgfQorfQorCitzdGF0aWMgY2hhciAqc2Nhbl9xdW90ZShDT05GICpjb25mLCBjaGFyICpwKSB7CisgIGludCBxID0gKnA7CisKKyAgcCsrOworICB3aGlsZSAoIUlTX0VPRihjb25mLCAqcCkgJiYgKnAgIT0gcSkgeworICAgIGlmIChJU19FU0MoY29uZiwgKnApKSB7CisgICAgICBwKys7CisgICAgICBpZiAoSVNfRU9GKGNvbmYsICpwKSkgeworICAgICAgICByZXR1cm4gcDsKKyAgICAgIH0KKyAgICB9CisgICAgcCsrOworICB9CisgIGlmICgqcCA9PSBxKSB7CisgICAgcCsrOworICB9CisgIHJldHVybiBwOworfQorCisKK3N0YXRpYyBjaGFyICpzY2FuX2RxdW90ZShDT05GICpjb25mLCBjaGFyICpwKSB7CisgIGludCBxID0gKnA7CisKKyAgcCsrOworICB3aGlsZSAoIShJU19FT0YoY29uZiwgKnApKSkgeworICAgIGlmICgqcCA9PSBxKSB7CisgICAgICBpZiAoKihwICsgMSkgPT0gcSkgeworICAgICAgICBwKys7CisgICAgICB9IGVsc2UgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgcCsrOworICB9CisgIGlmICgqcCA9PSBxKSB7CisgICAgcCsrOworICB9CisgIHJldHVybiBwOworfQorCitzdGF0aWMgdm9pZCBjbGVhcl9jb21tZW50cyhDT05GICpjb25mLCBjaGFyICpwKSB7CisgIGZvciAoOzspIHsKKyAgICBpZiAoSVNfRkNPTU1FTlQoY29uZiwgKnApKSB7CisgICAgICAqcCA9ICdcMCc7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghSVNfV1MoY29uZiwgKnApKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgcCsrOworICB9CisKKyAgZm9yICg7OykgeworICAgIGlmIChJU19DT01NRU5UKGNvbmYsICpwKSkgeworICAgICAgKnAgPSAnXDAnOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoSVNfRFFVT1RFKGNvbmYsICpwKSkgeworICAgICAgcCA9IHNjYW5fZHF1b3RlKGNvbmYsIHApOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChJU19RVU9URShjb25mLCAqcCkpIHsKKyAgICAgIHAgPSBzY2FuX3F1b3RlKGNvbmYsIHApOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChJU19FU0MoY29uZiwgKnApKSB7CisgICAgICBwID0gc2Nhbl9lc2MoY29uZiwgcCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKElTX0VPRihjb25mLCAqcCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgcCsrOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgaW50IGRlZl9sb2FkX2JpbyhDT05GICpjb25mLCBCSU8gKmluLCBsb25nICpvdXRfZXJyb3JfbGluZSkgeworICBzdGF0aWMgY29uc3Qgc2l6ZV90IENPTkZCVUZTSVpFID0gNTEyOworICBpbnQgYnVmbnVtID0gMCwgaSwgaWk7CisgIEJVRl9NRU0gKmJ1ZmYgPSBOVUxMOworICBjaGFyICpzLCAqcCwgKmVuZDsKKyAgaW50IGFnYWluOworICBsb25nIGVsaW5lID0gMDsKKyAgY2hhciBidG1wW0RFQ0lNQUxfU0laRShlbGluZSkgKyAxXTsKKyAgQ09ORl9WQUxVRSAqdiA9IE5VTEwsICp0djsKKyAgQ09ORl9WQUxVRSAqc3YgPSBOVUxMOworICBjaGFyICpzZWN0aW9uID0gTlVMTCwgKmJ1ZjsKKyAgY2hhciAqc3RhcnQsICpwc2VjdGlvbiwgKnBuYW1lOworCisgIGlmICgoYnVmZiA9IEJVRl9NRU1fbmV3KCkpID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDT05GLCBkZWZfbG9hZF9iaW8sIEVSUl9SX0JVRl9MSUIpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgc2VjdGlvbiA9IChjaGFyICopT1BFTlNTTF9tYWxsb2MoMTApOworICBpZiAoc2VjdGlvbiA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ09ORiwgZGVmX2xvYWRfYmlvLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgZ290byBlcnI7CisgIH0KKyAgQlVGX3N0cmxjcHkoc2VjdGlvbiwgImRlZmF1bHQiLCAxMCk7CisKKyAgc3YgPSBOQ09ORl9uZXdfc2VjdGlvbihjb25mLCBzZWN0aW9uKTsKKyAgaWYgKHN2ID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDT05GLCBkZWZfbG9hZF9iaW8sIENPTkZfUl9VTkFCTEVfVE9fQ1JFQVRFX05FV19TRUNUSU9OKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGJ1Zm51bSA9IDA7CisgIGFnYWluID0gMDsKKyAgZm9yICg7OykgeworICAgIGlmICghQlVGX01FTV9ncm93KGJ1ZmYsIGJ1Zm51bSArIENPTkZCVUZTSVpFKSkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ09ORiwgZGVmX2xvYWRfYmlvLCBFUlJfUl9CVUZfTElCKTsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBwID0gJihidWZmLT5kYXRhW2J1Zm51bV0pOworICAgICpwID0gJ1wwJzsKKyAgICBCSU9fZ2V0cyhpbiwgcCwgQ09ORkJVRlNJWkUgLSAxKTsKKyAgICBwW0NPTkZCVUZTSVpFIC0gMV0gPSAnXDAnOworICAgIGlpID0gaSA9IHN0cmxlbihwKTsKKyAgICBpZiAoaSA9PSAwICYmICFhZ2FpbikKKyAgICAgIGJyZWFrOworICAgIGFnYWluID0gMDsKKyAgICB3aGlsZSAoaSA+IDApIHsKKyAgICAgIGlmICgocFtpIC0gMV0gIT0gJ1xyJykgJiYgKHBbaSAtIDFdICE9ICdcbicpKQorICAgICAgICBicmVhazsKKyAgICAgIGVsc2UKKyAgICAgICAgaS0tOworICAgIH0KKyAgICAvKiB3ZSByZW1vdmVkIHNvbWUgdHJhaWxpbmcgc3R1ZmYgc28gdGhlcmUgaXMgYSBuZXcKKyAgICAgKiBsaW5lIG9uIHRoZSBlbmQuICovCisgICAgaWYgKGlpICYmIGkgPT0gaWkpCisgICAgICBhZ2FpbiA9IDE7IC8qIGxvbmcgbGluZSAqLworICAgIGVsc2UgeworICAgICAgcFtpXSA9ICdcMCc7CisgICAgICBlbGluZSsrOyAvKiBhbm90aGVyIGlucHV0IGxpbmUgKi8KKyAgICB9CisKKyAgICAvKiB3ZSBub3cgaGF2ZSBhIGxpbmUgd2l0aCB0cmFpbGluZyBcclxuIHJlbW92ZWQgKi8KKworICAgIC8qIGkgaXMgdGhlIG51bWJlciBvZiBieXRlcyAqLworICAgIGJ1Zm51bSArPSBpOworCisgICAgdiA9IE5VTEw7CisgICAgLyogY2hlY2sgZm9yIGxpbmUgY29udGludWF0aW9uICovCisgICAgaWYgKGJ1Zm51bSA+PSAxKSB7CisgICAgICAvKiBJZiB3ZSBoYXZlIGJ5dGVzIGFuZCB0aGUgbGFzdCBjaGFyICdcXCcgYW5kCisgICAgICAgKiBzZWNvbmQgbGFzdCBjaGFyIGlzIG5vdCAnXFwnICovCisgICAgICBwID0gJihidWZmLT5kYXRhW2J1Zm51bSAtIDFdKTsKKyAgICAgIGlmIChJU19FU0MoY29uZiwgcFswXSkgJiYgKChidWZudW0gPD0gMSkgfHwgIUlTX0VTQyhjb25mLCBwWy0xXSkpKSB7CisgICAgICAgIGJ1Zm51bS0tOworICAgICAgICBhZ2FpbiA9IDE7CisgICAgICB9CisgICAgfQorICAgIGlmIChhZ2FpbikKKyAgICAgIGNvbnRpbnVlOworICAgIGJ1Zm51bSA9IDA7CisgICAgYnVmID0gYnVmZi0+ZGF0YTsKKworICAgIGNsZWFyX2NvbW1lbnRzKGNvbmYsIGJ1Zik7CisgICAgcyA9IGVhdF93cyhjb25mLCBidWYpOworICAgIGlmIChJU19FT0YoY29uZiwgKnMpKQorICAgICAgY29udGludWU7IC8qIGJsYW5rIGxpbmUgKi8KKyAgICBpZiAoKnMgPT0gJ1snKSB7CisgICAgICBjaGFyICpzczsKKworICAgICAgcysrOworICAgICAgc3RhcnQgPSBlYXRfd3MoY29uZiwgcyk7CisgICAgICBzcyA9IHN0YXJ0OworICAgIGFnYWluOgorICAgICAgZW5kID0gZWF0X2FscGhhX251bWVyaWMoY29uZiwgc3MpOworICAgICAgcCA9IGVhdF93cyhjb25mLCBlbmQpOworICAgICAgaWYgKCpwICE9ICddJykgeworICAgICAgICBpZiAoKnAgIT0gJ1wwJykgeworICAgICAgICAgIHNzID0gcDsKKyAgICAgICAgICBnb3RvIGFnYWluOworICAgICAgICB9CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENPTkYsIGRlZl9sb2FkX2JpbywgQ09ORl9SX01JU1NJTkdfQ0xPU0VfU1FVQVJFX0JSQUNLRVQpOworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICAgICplbmQgPSAnXDAnOworICAgICAgaWYgKCFzdHJfY29weShjb25mLCBOVUxMLCAmc2VjdGlvbiwgc3RhcnQpKQorICAgICAgICBnb3RvIGVycjsKKyAgICAgIGlmICgoc3YgPSBnZXRfc2VjdGlvbihjb25mLCBzZWN0aW9uKSkgPT0gTlVMTCkKKyAgICAgICAgc3YgPSBOQ09ORl9uZXdfc2VjdGlvbihjb25mLCBzZWN0aW9uKTsKKyAgICAgIGlmIChzdiA9PSBOVUxMKSB7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENPTkYsIGRlZl9sb2FkX2JpbywgQ09ORl9SX1VOQUJMRV9UT19DUkVBVEVfTkVXX1NFQ1RJT04pOworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0gZWxzZSB7CisgICAgICBwbmFtZSA9IHM7CisgICAgICBwc2VjdGlvbiA9IE5VTEw7CisgICAgICBlbmQgPSBlYXRfYWxwaGFfbnVtZXJpYyhjb25mLCBzKTsKKyAgICAgIGlmICgoZW5kWzBdID09ICc6JykgJiYgKGVuZFsxXSA9PSAnOicpKSB7CisgICAgICAgICplbmQgPSAnXDAnOworICAgICAgICBlbmQgKz0gMjsKKyAgICAgICAgcHNlY3Rpb24gPSBwbmFtZTsKKyAgICAgICAgcG5hbWUgPSBlbmQ7CisgICAgICAgIGVuZCA9IGVhdF9hbHBoYV9udW1lcmljKGNvbmYsIGVuZCk7CisgICAgICB9CisgICAgICBwID0gZWF0X3dzKGNvbmYsIGVuZCk7CisgICAgICBpZiAoKnAgIT0gJz0nKSB7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENPTkYsIGRlZl9sb2FkX2JpbywgQ09ORl9SX01JU1NJTkdfRVFVQUxfU0lHTik7CisgICAgICAgIGdvdG8gZXJyOworICAgICAgfQorICAgICAgKmVuZCA9ICdcMCc7CisgICAgICBwKys7CisgICAgICBzdGFydCA9IGVhdF93cyhjb25mLCBwKTsKKyAgICAgIHdoaWxlICghSVNfRU9GKGNvbmYsICpwKSkKKyAgICAgICAgcCsrOworICAgICAgcC0tOworICAgICAgd2hpbGUgKChwICE9IHN0YXJ0KSAmJiAoSVNfV1MoY29uZiwgKnApKSkKKyAgICAgICAgcC0tOworICAgICAgcCsrOworICAgICAgKnAgPSAnXDAnOworCisgICAgICBpZiAoISh2ID0gKENPTkZfVkFMVUUgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoQ09ORl9WQUxVRSkpKSkgeworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDT05GLCBkZWZfbG9hZF9iaW8sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgICBpZiAocHNlY3Rpb24gPT0gTlVMTCkKKyAgICAgICAgcHNlY3Rpb24gPSBzZWN0aW9uOworICAgICAgdi0+bmFtZSA9IChjaGFyICopT1BFTlNTTF9tYWxsb2Moc3RybGVuKHBuYW1lKSArIDEpOworICAgICAgdi0+dmFsdWUgPSBOVUxMOworICAgICAgaWYgKHYtPm5hbWUgPT0gTlVMTCkgeworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDT05GLCBkZWZfbG9hZF9iaW8sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgICBCVUZfc3RybGNweSh2LT5uYW1lLCBwbmFtZSwgc3RybGVuKHBuYW1lKSArIDEpOworICAgICAgaWYgKCFzdHJfY29weShjb25mLCBwc2VjdGlvbiwgJih2LT52YWx1ZSksIHN0YXJ0KSkKKyAgICAgICAgZ290byBlcnI7CisKKyAgICAgIGlmIChzdHJjbXAocHNlY3Rpb24sIHNlY3Rpb24pICE9IDApIHsKKyAgICAgICAgaWYgKCh0diA9IGdldF9zZWN0aW9uKGNvbmYsIHBzZWN0aW9uKSkgPT0gTlVMTCkKKyAgICAgICAgICB0diA9IE5DT05GX25ld19zZWN0aW9uKGNvbmYsIHBzZWN0aW9uKTsKKyAgICAgICAgaWYgKHR2ID09IE5VTEwpIHsKKyAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDT05GLCBkZWZfbG9hZF9iaW8sIENPTkZfUl9VTkFCTEVfVE9fQ1JFQVRFX05FV19TRUNUSU9OKTsKKyAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlCisgICAgICAgIHR2ID0gc3Y7CisgICAgICBpZiAoYWRkX3N0cmluZyhjb25mLCB0diwgdikgPT0gMCkgeworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDT05GLCBkZWZfbG9hZF9iaW8sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgICB2ID0gTlVMTDsKKyAgICB9CisgIH0KKyAgaWYgKGJ1ZmYgIT0gTlVMTCkKKyAgICBCVUZfTUVNX2ZyZWUoYnVmZik7CisgIGlmIChzZWN0aW9uICE9IE5VTEwpCisgICAgT1BFTlNTTF9mcmVlKHNlY3Rpb24pOworICByZXR1cm4gMTsKKworZXJyOgorICBpZiAoYnVmZiAhPSBOVUxMKQorICAgIEJVRl9NRU1fZnJlZShidWZmKTsKKyAgaWYgKHNlY3Rpb24gIT0gTlVMTCkKKyAgICBPUEVOU1NMX2ZyZWUoc2VjdGlvbik7CisgIGlmIChvdXRfZXJyb3JfbGluZSAhPSBOVUxMKQorICAgICpvdXRfZXJyb3JfbGluZSA9IGVsaW5lOworICBCSU9fc25wcmludGYoYnRtcCwgc2l6ZW9mIGJ0bXAsICIlbGQiLCBlbGluZSk7CisgIEVSUl9hZGRfZXJyb3JfZGF0YSgyLCAibGluZSAiLCBidG1wKTsKKworICBpZiAodiAhPSBOVUxMKSB7CisgICAgaWYgKHYtPm5hbWUgIT0gTlVMTCkKKyAgICAgIE9QRU5TU0xfZnJlZSh2LT5uYW1lKTsKKyAgICBpZiAodi0+dmFsdWUgIT0gTlVMTCkKKyAgICAgIE9QRU5TU0xfZnJlZSh2LT52YWx1ZSk7CisgICAgaWYgKHYgIT0gTlVMTCkKKyAgICAgIE9QRU5TU0xfZnJlZSh2KTsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IE5DT05GX2xvYWQoQ09ORiAqY29uZiwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGxvbmcgKm91dF9lcnJvcl9saW5lKSB7CisgIEJJTyAqaW4gPSBCSU9fbmV3X2ZpbGUoZmlsZW5hbWUsICJyYiIpOworICBpbnQgcmV0OworCisgIGlmIChpbiA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ09ORiwgTkNPTkZfbG9hZCwgRVJSX1JfU1lTX0xJQik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICByZXQgPSBkZWZfbG9hZF9iaW8oY29uZiwgaW4sIG91dF9lcnJvcl9saW5lKTsKKyAgQklPX2ZyZWUoaW4pOworCisgIHJldHVybiByZXQ7Cit9CisKK2ludCBDT05GX3BhcnNlX2xpc3QoY29uc3QgY2hhciAqbGlzdCwgY2hhciBzZXAsIGludCByZW1vdmVfd2hpdGVzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgaW50ICgqbGlzdF9jYikoY29uc3QgY2hhciAqZWxlbSwgaW50IGxlbiwgdm9pZCAqdXNyKSwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXJnKSB7CisgIGludCByZXQ7CisgIGNvbnN0IGNoYXIgKmxzdGFydCwgKnRtcGVuZCwgKnA7CisKKyAgaWYgKGxpc3QgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENPTkYsIENPTkZfcGFyc2VfbGlzdCwgQ09ORl9SX0xJU1RfQ0FOTk9UX0JFX05VTEwpOworICAgIHJldHVybiAwOworICB9CisKKyAgbHN0YXJ0ID0gbGlzdDsKKyAgZm9yICg7OykgeworICAgIGlmIChyZW1vdmVfd2hpdGVzcGFjZSkgeworICAgICAgd2hpbGUgKCpsc3RhcnQgJiYgaXNzcGFjZSgodW5zaWduZWQgY2hhcikqbHN0YXJ0KSkKKyAgICAgICAgbHN0YXJ0Kys7CisgICAgfQorICAgIHAgPSBzdHJjaHIobHN0YXJ0LCBzZXApOworICAgIGlmIChwID09IGxzdGFydCB8fCAhKmxzdGFydCkKKyAgICAgIHJldCA9IGxpc3RfY2IoTlVMTCwgMCwgYXJnKTsKKyAgICBlbHNlIHsKKyAgICAgIGlmIChwKQorICAgICAgICB0bXBlbmQgPSBwIC0gMTsKKyAgICAgIGVsc2UKKyAgICAgICAgdG1wZW5kID0gbHN0YXJ0ICsgc3RybGVuKGxzdGFydCkgLSAxOworICAgICAgaWYgKHJlbW92ZV93aGl0ZXNwYWNlKSB7CisgICAgICAgIHdoaWxlIChpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSp0bXBlbmQpKQorICAgICAgICAgIHRtcGVuZC0tOworICAgICAgfQorICAgICAgcmV0ID0gbGlzdF9jYihsc3RhcnQsIHRtcGVuZCAtIGxzdGFydCArIDEsIGFyZyk7CisgICAgfQorICAgIGlmIChyZXQgPD0gMCkKKyAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgIHJldHVybiAxOworICAgIGxzdGFydCA9IHAgKyAxOworICB9Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vY29uZi9jb25mLmggYi9jcnlwdG8vY29uZi9jb25mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFjNTUyNQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9jb25mL2NvbmYuaApAQCAtMCwwICsxLDE0MyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2lmbmRlZiBPUEVOU1NMX0hFQURFUl9DT05GX0gKKyNkZWZpbmUgT1BFTlNTTF9IRUFERVJfQ09ORl9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jhc2UuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvc3RhY2suaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2xoYXNoLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBDb25maWcgZmlsZXMgbG9vayBsaWtlOgorICoKKyAqICAgIyBDb21tZW50CisgKgorICogICAjIFRoaXMga2V5IGlzIGluIHRoZSBkZWZhdWx0IHNlY3Rpb24uCisgKiAgIGtleT12YWx1ZQorICoKKyAqICAgW3NlY3Rpb25fbmFtZV0KKyAqICAga2V5Mj12YWx1ZTIKKyAqCisgKiBDb25maWcgZmlsZXMgYXJlIHJlcHJlc2VudGF0ZWQgYnkgYSB8Q09ORnwuICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY2hhciAqc2VjdGlvbjsKKyAgY2hhciAqbmFtZTsKKyAgY2hhciAqdmFsdWU7Cit9IENPTkZfVkFMVUU7CisKK3N0cnVjdCBjb25mX3N0IHsKKyAgTEhBU0hfT0YoQ09ORl9WQUxVRSkgKmRhdGE7Cit9OworCisKKy8qIE5DT05GX25ldyByZXR1cm5zIGEgZnJlc2gsIGVtcHR5IHxDT05GfCwgb3IgTlVMTCBvbiBlcnJvci4gKi8KK0NPTkYgKk5DT05GX25ldygpOworCisvKiBOQ09ORl9mcmVlIGZyZWVzIGFsbCB0aGUgZGF0YSBvd25lZCBieSB8Y29uZnwgYW5kIHRoZW4gfGNvbmZ8IGl0c2VsZi4gKi8KK3ZvaWQgTkNPTkZfZnJlZShDT05GICpjb25mKTsKKworLyogTkNPTkZfbG9hZCBwYXJzZXMgdGhlIGZpbGUgbmFtZWQgfGZpbGVuYW1lfCBhbmQgYWRkcyB0aGUgdmFsdWVzIGZvdW5kIHRvCisgKiB8Y29uZnwuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24gZXJyb3IuIEluIHRoZSBldmVudCBvZiBhbgorICogZXJyb3IsIGlmIHxvdXRfZXJyb3JfbGluZXwgaXMgbm90IE5VTEwsIHwqb3V0X2Vycm9yX2xpbmV8IGlzIHNldCB0byB0aGUKKyAqIG51bWJlciBvZiB0aGUgbGluZSB0aGF0IGNvbnRhaW5lZCB0aGUgZXJyb3IuICovCitpbnQgTkNPTkZfbG9hZChDT05GICpjb25mLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgbG9uZyAqb3V0X2Vycm9yX2xpbmUpOworCisvKiBOQ09ORl9nZXRfc2VjdGlvbiByZXR1cm5zIGEgc3RhY2sgb2YgdmFsdWVzIGZvciBhIGdpdmVuIHNlY3Rpb24gaW4gfGNvbmZ8LgorICogSWYgfHNlY3Rpb258IGlzIE5VTEwsIHRoZSBkZWZhdWx0IHNlY3Rpb24gaXMgcmV0dXJuZWQuIEl0IHJldHVybnMgTlVMTCBvbgorICogZXJyb3IuICovCitTVEFDS19PRihDT05GX1ZBTFVFKSAqTkNPTkZfZ2V0X3NlY3Rpb24oY29uc3QgQ09ORiAqY29uZiwgY29uc3QgY2hhciAqc2VjdGlvbik7CisKKy8qIE5DT05GX2dldF9zdHJpbmcgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGtleSB8bmFtZXwsIGluIHNlY3Rpb24gfHNlY3Rpb258LgorICogVGhlIHxzZWN0aW9ufCBhcmd1bWVudCBtYXkgYmUgTlVMTCB0byBpbmRpY2F0ZSB0aGUgZGVmYXVsdCBzZWN0aW9uLiBJdAorICogcmV0dXJucyB0aGUgdmFsdWUgb3IgTlVMTCBvbiBlcnJvci4gKi8KK2NvbnN0IGNoYXIgKk5DT05GX2dldF9zdHJpbmcoY29uc3QgQ09ORiAqY29uZiwgY29uc3QgY2hhciAqc2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSk7CisKKworLyogVXRpbGl0eSBmdW5jdGlvbnMgKi8KKworLyogQ09ORl9wYXJzZV9saXN0IHRha2VzIGEgbGlzdCBzZXBhcmF0ZWQgYnkgJ3NlcCcgYW5kIGNhbGxzIHxsaXN0X2NifCBnaXZpbmcKKyAqIHRoZSBzdGFydCBhbmQgbGVuZ3RoIG9mIGVhY2ggbWVtYmVyLCBvcHRpb25hbGx5IHN0cmlwcGluZyBsZWFkaW5nIGFuZAorICogdHJhaWxpbmcgd2hpdGVzcGFjZS4gVGhpcyBjYW4gYmUgdXNlZCB0byBwYXJzZSBjb21tYSBzZXBhcmF0ZWQgbGlzdHMgZm9yCisgKiBleGFtcGxlLiBJZiB8bGlzdF9jYnwgcmV0dXJucyA8PSAwLCB0aGVuIHRoZSBpdGVyYXRpb24gaXMgaGFsdGVkIGFuZCB0aGF0CisgKiB2YWx1ZSBpcyByZXR1cm5lZCBpbW1lZGlhdGVseS4gT3RoZXJ3aXNlIGl0IHJldHVybnMgb25lLiAqLworaW50IENPTkZfcGFyc2VfbGlzdChjb25zdCBjaGFyICpsaXN0LCBjaGFyIHNlcCwgaW50IHJlbW92ZV93aGl0ZXNwYWNlLAorICAgICAgICAgICAgICAgICAgICBpbnQgKCpsaXN0X2NiKShjb25zdCBjaGFyICplbGVtLCBpbnQgbGVuLCB2b2lkICp1c3IpLAorICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcpOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30gIC8qIGV4dGVybiBDICovCisjZW5kaWYKKworI2RlZmluZSBDT05GX0ZfQ09ORl9wYXJzZV9saXN0IDEwMAorI2RlZmluZSBDT05GX0Zfc3RyX2NvcHkgMTAxCisjZGVmaW5lIENPTkZfRl9kZWZfbG9hZF9iaW8gMTAyCisjZGVmaW5lIENPTkZfRl9OQ09ORl9sb2FkIDEwMworI2RlZmluZSBDT05GX1JfTUlTU0lOR19FUVVBTF9TSUdOIDEwMAorI2RlZmluZSBDT05GX1JfTElTVF9DQU5OT1RfQkVfTlVMTCAxMDEKKyNkZWZpbmUgQ09ORl9SX05PX0NMT1NFX0JSQUNFIDEwMgorI2RlZmluZSBDT05GX1JfVkFSSUFCTEVfSEFTX05PX1ZBTFVFIDEwMworI2RlZmluZSBDT05GX1JfVU5BQkxFX1RPX0NSRUFURV9ORVdfU0VDVElPTiAxMDQKKyNkZWZpbmUgQ09ORl9SX01JU1NJTkdfQ0xPU0VfU1FVQVJFX0JSQUNLRVQgMTA1CisKKyNlbmRpZiAgLyogT1BFTlNTTF9IRUFERVJfVEhSRUFEX0ggKi8KZGlmZiAtLWdpdCBhL2NyeXB0by9jb25mL2NvbmZfZGVmLmggYi9jcnlwdG8vY29uZi9jb25mX2RlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYzAzNWIKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vY29uZi9jb25mX2RlZi5oCkBAIC0wLDAgKzEsMTI3IEBACisvKiBjcnlwdG8vY29uZi9jb25mX2RlZi5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKy8qIFRISVMgRklMRSBXQVMgQVVUT01BR0lDQUxMWSBHRU5FUkFURUQhCisgICBQbGVhc2UgbW9kaWZ5IGFuZCB1c2Uga2V5c2V0cy5wbCB0byByZWdlbmVyYXRlIGl0LiAqLworCisjZGVmaW5lIENPTkZfTlVNQkVSCQkxCisjZGVmaW5lIENPTkZfVVBQRVIJCTIKKyNkZWZpbmUgQ09ORl9MT1dFUgkJNAorI2RlZmluZSBDT05GX1VOREVSCQkyNTYKKyNkZWZpbmUgQ09ORl9QVU5DVFVBVElPTgk1MTIKKyNkZWZpbmUgQ09ORl9XUwkJCTE2CisjZGVmaW5lIENPTkZfRVNDCQkzMgorI2RlZmluZSBDT05GX1FVT1RFCQk2NAorI2RlZmluZSBDT05GX0RRVU9URQkJMTAyNAorI2RlZmluZSBDT05GX0NPTU1FTlQJCTEyOAorI2RlZmluZSBDT05GX0ZDT01NRU5UCQkyMDQ4CisjZGVmaW5lIENPTkZfRU9GCQk4CisjZGVmaW5lIENPTkZfSElHSEJJVAkJNDA5NgorI2RlZmluZSBDT05GX0FMUEhBCQkoQ09ORl9VUFBFUnxDT05GX0xPV0VSKQorI2RlZmluZSBDT05GX0FMUEhBX05VTUVSSUMJKENPTkZfQUxQSEF8Q09ORl9OVU1CRVJ8Q09ORl9VTkRFUikKKyNkZWZpbmUgQ09ORl9BTFBIQV9OVU1FUklDX1BVTkNUIChDT05GX0FMUEhBfENPTkZfTlVNQkVSfENPTkZfVU5ERVJ8IFwKKwkJCQkJQ09ORl9QVU5DVFVBVElPTikKKworI2RlZmluZSBLRVlUWVBFUyhjKQkJQ09ORl90eXBlX2RlZmF1bHQKKyNkZWZpbmUgSVNfQ09NTUVOVChjLGEpCQkoS0VZVFlQRVMoYylbKGEpJjB4ZmZdJkNPTkZfQ09NTUVOVCkKKyNkZWZpbmUgSVNfRkNPTU1FTlQoYyxhKQkoS0VZVFlQRVMoYylbKGEpJjB4ZmZdJkNPTkZfRkNPTU1FTlQpCisjZGVmaW5lIElTX0VPRihjLGEpCQkoS0VZVFlQRVMoYylbKGEpJjB4ZmZdJkNPTkZfRU9GKQorI2RlZmluZSBJU19FU0MoYyxhKQkJKEtFWVRZUEVTKGMpWyhhKSYweGZmXSZDT05GX0VTQykKKyNkZWZpbmUgSVNfTlVNQkVSKGMsYSkJCShLRVlUWVBFUyhjKVsoYSkmMHhmZl0mQ09ORl9OVU1CRVIpCisjZGVmaW5lIElTX1dTKGMsYSkJCShLRVlUWVBFUyhjKVsoYSkmMHhmZl0mQ09ORl9XUykKKyNkZWZpbmUgSVNfQUxQSEFfTlVNRVJJQyhjLGEpCShLRVlUWVBFUyhjKVsoYSkmMHhmZl0mQ09ORl9BTFBIQV9OVU1FUklDKQorI2RlZmluZSBJU19BTFBIQV9OVU1FUklDX1BVTkNUKGMsYSkgXAorCQkJCShLRVlUWVBFUyhjKVsoYSkmMHhmZl0mQ09ORl9BTFBIQV9OVU1FUklDX1BVTkNUKQorI2RlZmluZSBJU19RVU9URShjLGEpCQkoS0VZVFlQRVMoYylbKGEpJjB4ZmZdJkNPTkZfUVVPVEUpCisjZGVmaW5lIElTX0RRVU9URShjLGEpCQkoS0VZVFlQRVMoYylbKGEpJjB4ZmZdJkNPTkZfRFFVT1RFKQorI2RlZmluZSBJU19ISUdIQklUKGMsYSkJCShLRVlUWVBFUyhjKVsoYSkmMHhmZl0mQ09ORl9ISUdIQklUKQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgQ09ORl90eXBlX2RlZmF1bHRbMjU2XT17CisJMHgwMDA4LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwKKwkweDAwMDAsMHgwMDEwLDB4MDAxMCwweDAwMDAsMHgwMDAwLDB4MDAxMCwweDAwMDAsMHgwMDAwLAorCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwKKwkweDAwMTAsMHgwMjAwLDB4MDA0MCwweDAwODAsMHgwMDAwLDB4MDIwMCwweDAyMDAsMHgwMDQwLAorCTB4MDAwMCwweDAwMDAsMHgwMjAwLDB4MDIwMCwweDAyMDAsMHgwMjAwLDB4MDIwMCwweDAyMDAsCisJMHgwMDAxLDB4MDAwMSwweDAwMDEsMHgwMDAxLDB4MDAwMSwweDAwMDEsMHgwMDAxLDB4MDAwMSwKKwkweDAwMDEsMHgwMDAxLDB4MDAwMCwweDAyMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMjAwLAorCTB4MDIwMCwweDAwMDIsMHgwMDAyLDB4MDAwMiwweDAwMDIsMHgwMDAyLDB4MDAwMiwweDAwMDIsCisJMHgwMDAyLDB4MDAwMiwweDAwMDIsMHgwMDAyLDB4MDAwMiwweDAwMDIsMHgwMDAyLDB4MDAwMiwKKwkweDAwMDIsMHgwMDAyLDB4MDAwMiwweDAwMDIsMHgwMDAyLDB4MDAwMiwweDAwMDIsMHgwMDAyLAorCTB4MDAwMiwweDAwMDIsMHgwMDAyLDB4MDAwMCwweDAwMjAsMHgwMDAwLDB4MDIwMCwweDAxMDAsCisJMHgwMDQwLDB4MDAwNCwweDAwMDQsMHgwMDA0LDB4MDAwNCwweDAwMDQsMHgwMDA0LDB4MDAwNCwKKwkweDAwMDQsMHgwMDA0LDB4MDAwNCwweDAwMDQsMHgwMDA0LDB4MDAwNCwweDAwMDQsMHgwMDA0LAorCTB4MDAwNCwweDAwMDQsMHgwMDA0LDB4MDAwNCwweDAwMDQsMHgwMDA0LDB4MDAwNCwweDAwMDQsCisJMHgwMDA0LDB4MDAwNCwweDAwMDQsMHgwMDAwLDB4MDIwMCwweDAwMDAsMHgwMjAwLDB4MDAwMCwKKwkweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLAorCTB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsCisJMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwKKwkweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLAorCTB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsCisJMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwKKwkweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLAorCTB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsCisJMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwKKwkweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLAorCTB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsCisJMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwKKwkweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLAorCTB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsCisJMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwKKwkweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLAorCX07CmRpZmYgLS1naXQgYS9jcnlwdG8vY29uZi9jb25mX2Vycm9yLmMgYi9jcnlwdG8vY29uZi9jb25mX2Vycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjczOWQxOQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9jb25mL2NvbmZfZXJyb3IuYwpAQCAtMCwwICsxLDMxIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTQsIEdvb2dsZSBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorCisjaW5jbHVkZSAiY29uZi5oIgorCitjb25zdCBFUlJfU1RSSU5HX0RBVEEgQ09ORl9lcnJvcl9zdHJpbmdfZGF0YVtdID0geworICB7RVJSX1BBQ0soRVJSX0xJQl9DT05GLCBDT05GX0ZfQ09ORl9wYXJzZV9saXN0LCAwKSwgIkNPTkZfcGFyc2VfbGlzdCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9DT05GLCBDT05GX0ZfTkNPTkZfbG9hZCwgMCksICJOQ09ORl9sb2FkIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0NPTkYsIENPTkZfRl9kZWZfbG9hZF9iaW8sIDApLCAiZGVmX2xvYWRfYmlvIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0NPTkYsIENPTkZfRl9zdHJfY29weSwgMCksICJzdHJfY29weSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9DT05GLCAwLCBDT05GX1JfTElTVF9DQU5OT1RfQkVfTlVMTCksICJMSVNUX0NBTk5PVF9CRV9OVUxMIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0NPTkYsIDAsIENPTkZfUl9NSVNTSU5HX0NMT1NFX1NRVUFSRV9CUkFDS0VUKSwgIk1JU1NJTkdfQ0xPU0VfU1FVQVJFX0JSQUNLRVQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQ09ORiwgMCwgQ09ORl9SX01JU1NJTkdfRVFVQUxfU0lHTiksICJNSVNTSU5HX0VRVUFMX1NJR04ifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQ09ORiwgMCwgQ09ORl9SX05PX0NMT1NFX0JSQUNFKSwgIk5PX0NMT1NFX0JSQUNFIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0NPTkYsIDAsIENPTkZfUl9VTkFCTEVfVE9fQ1JFQVRFX05FV19TRUNUSU9OKSwgIlVOQUJMRV9UT19DUkVBVEVfTkVXX1NFQ1RJT04ifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfQ09ORiwgMCwgQ09ORl9SX1ZBUklBQkxFX0hBU19OT19WQUxVRSksICJWQVJJQUJMRV9IQVNfTk9fVkFMVUUifSwKKyAgezAsIE5VTEx9LAorfTsKZGlmZiAtLWdpdCBhL2NyeXB0by9jcHUtYXJtLmMgYi9jcnlwdG8vY3B1LWFybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOTdmYzEKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vY3B1LWFybS5jCkBAIC0wLDAgKzEsODQgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2NwdS5oPgorCisjaWYgZGVmaW5lZChPUEVOU1NMX0FSTSkKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImFybV9hcmNoLmgiCisKKyNpZiBkZWZpbmVkKF9fQVJNX05FT05fXykKK3VpbnQzMl90IE9QRU5TU0xfYXJtY2FwX1AgPSBBUk1WN19ORU9OOworI2Vsc2UKK3VpbnQzMl90IE9QRU5TU0xfYXJtY2FwX1AgPSBBUk1WN19ORU9OOworI2VuZGlmCisKK2NoYXIgQ1JZUFRPX2lzX05FT05fY2FwYWJsZSgpIHsKKyAgcmV0dXJuIChPUEVOU1NMX2FybWNhcF9QICYgQVJNVjdfTkVPTikgIT0gMDsKK30KKwordm9pZCBDUllQVE9fc2V0X05FT05fY2FwYWJsZShjaGFyIG5lb25fY2FwYWJsZSkgeworICBpZiAobmVvbl9jYXBhYmxlKSB7CisgICAgT1BFTlNTTF9hcm1jYXBfUCB8PSBBUk1WN19ORU9OOworICB9IGVsc2UgeworICAgIE9QRU5TU0xfYXJtY2FwX1AgJj0gfkFSTVY3X05FT047CisgIH0KK30KKworI2VuZGlmICAvKiBkZWZpbmVkKE9QRU5TU0xfQVJNKSAqLwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2NwdS1pbnRlbC5jIGIvY3J5cHRvL2NwdS1pbnRlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYTgwZWEKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vY3B1LWludGVsLmMKQEAgLTAsMCArMSwxMzkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpZiAhZGVmaW5lZChfX1NURENfRk9STUFUX01BQ1JPUykKKyNkZWZpbmUgX19TVERDX0ZPUk1BVF9NQUNST1MKKyNlbmRpZgorCisjaW5jbHVkZSA8b3BlbnNzbC9jcHUuaD4KKworCisjaWYgZGVmaW5lZChPUEVOU1NMX1g4NikgfHwgZGVmaW5lZChPUEVOU1NMX1g4Nl82NCkKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwordWludDMyX3QgT1BFTlNTTF9pYTMyY2FwX1BbNF07CisKKy8qIE9QRU5TU0xfaWEzMl9jcHVpZCBpcyBkZWZpbmVkIGluIGNwdS14ODZfNjQtYXNtLnBsLiAqLworZXh0ZXJuIHVpbnQ2NF90IE9QRU5TU0xfaWEzMl9jcHVpZCh1aW50MzJfdCopOworCisjaWYgIWRlZmluZWQoT1BFTlNTTF9XSU5ET1dTKQordm9pZCBPUEVOU1NMX2NwdWlkX3NldHVwKHZvaWQpIF9fYXR0cmlidXRlX18gKChjb25zdHJ1Y3RvcikpOworI2VuZGlmCisKKy8qIGhhbmRsZV9jcHVfZW52IGFwcGxpZXMgdGhlIHZhbHVlIGZyb20gfGlufCB0byB0aGUgQ1BVSUQgdmFsdWVzIGluIHxvdXRbMF18CisgKiBhbmQgfG91dFsxXXwuIFNlZSB0aGUgY29tbWVudCBpbiB8T1BFTlNTTF9jcHVpZF9zZXR1cHwgYWJvdXQgdGhpcy4gKi8KK3N0YXRpYyB2b2lkIGhhbmRsZV9jcHVfZW52KHVpbnQzMl90ICpvdXQsIGNvbnN0IGNoYXIgKmluKSB7CisgIGNvbnN0IGludCBpbnZlcnQgPSBpblswXSA9PSAnfic7CisgIHVpbnQ2NF90IHY7CisKKyAgaWYgKCFzc2NhbmYoaW4gKyBpbnZlcnQsICIlIiBQUklpNjQsICZ2KSkgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChpbnZlcnQpIHsKKyAgICBvdXRbMF0gJj0gfnY7CisgICAgb3V0WzFdICY9IH4odiA+PiAzMik7CisgIH0gZWxzZSB7CisgICAgb3V0WzBdID0gdjsKKyAgICBvdXRbMV0gPSB2ID4+IDMyOworICB9Cit9CisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfV0lORE9XUykKKyNwcmFnbWEgc2VjdGlvbigiLkNSVCRYQ1UiLCByZWFkKQordm9pZCBfX2NkZWNsIE9QRU5TU0xfY3B1aWRfc2V0dXAodm9pZCk7CitfX2RlY2xzcGVjKGFsbG9jYXRlKCIuQ1JUJFhDVSIpKSB2b2lkKCpjcHVpZF9jb25zdHJ1Y3Rvcikodm9pZCkgPSBPUEVOU1NMX2NwdWlkX3NldHVwOwordm9pZCBfX2NkZWNsIE9QRU5TU0xfY3B1aWRfc2V0dXAodm9pZCkgeworI2Vsc2UKK3ZvaWQgT1BFTlNTTF9jcHVpZF9zZXR1cCh2b2lkKSB7CisjZW5kaWYKKyAgY29uc3QgY2hhciAqZW52MSwgKmVudjI7CisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfWDg2XzY0KQorICBPUEVOU1NMX2lhMzJfY3B1aWQoT1BFTlNTTF9pYTMyY2FwX1ApOworI2Vsc2UKKyAgdWludDY0X3QgdmVjID0gT1BFTlNTTF9pYTMyX2NwdWlkKE9QRU5TU0xfaWEzMmNhcF9QKTsKKyAgLyogMTw8MTAgc2V0cyBhIHJlc2VydmVkIGJpdCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB2YXJpYWJsZQorICAgKiB3YXMgYWxyZWFkeSBpbml0aWFsaXNlZC4gKi8KKyAgT1BFTlNTTF9pYTMyY2FwX1BbMF0gPSAoKHVpbnQzMl90KXZlYykgfCAoMSA8PCAxMCk7CisgIE9QRU5TU0xfaWEzMmNhcF9QWzFdID0gdmVjID4+IDMyOworI2VuZGlmCisKKyAgZW52MSA9IGdldGVudigiT1BFTlNTTF9pYTMyY2FwIik7CisgIGlmIChlbnYxID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBPUEVOU1NMX2lhMzJjYXAgY2FuIGNvbnRhaW4gemVybywgb25lIG9yIHR3byB2YWx1ZXMsIHNlcGFyYXRlZCB3aXRoIGEgJzonLgorICAgKiBFYWNoIHZhbHVlIGlzIGEgNjQtYml0LCB1bnNpZ25lZCB2YWx1ZSB3aGljaCBtYXkgc3RhcnQgd2l0aCAiMHgiIHRvCisgICAqIGluZGljYXRlIGEgaGV4IHZhbHVlLiBQcmlvciB0byB0aGUgNjQtYml0IHZhbHVlLCBhICd+JyBtYXkgYmUgZ2l2ZW4uCisgICAqCisgICAqIElmICd+JyBpc24ndCBwcmVzZW50LCB0aGVuIHRoZSB2YWx1ZSBpcyB0YWtlbiBhcyB0aGUgcmVzdWx0IG9mIHRoZSBDUFVJRC4KKyAgICogT3RoZXJ3aXNlIHRoZSB2YWx1ZSBpcyBpbnZlcnRlZCBhbmQgQU5EZWQgd2l0aCB0aGUgcHJvYmVkIENQVUlEIHJlc3VsdC4KKyAgICoKKyAgICogVGhlIGZpcnN0IHZhbHVlIGRldGVybWluZXMgT1BFTlNTTF9pYTMyY2FwX1BbMF0gYW5kIFsxXS4gVGhlIHNlY29uZCBbMl0KKyAgICogYW5kIFszXS4gKi8KKworICBoYW5kbGVfY3B1X2VudigmT1BFTlNTTF9pYTMyY2FwX1BbMF0sIGVudjEpOworICBlbnYyID0gc3RyY2hyKGVudjEsICc6Jyk7CisgIGlmIChlbnYyICE9IE5VTEwpIHsKKyAgICBoYW5kbGVfY3B1X2VudigmT1BFTlNTTF9pYTMyY2FwX1BbMl0sIGVudjIgKyAxKTsKKyAgfQorfQorCisjZW5kaWYgIC8qIE9QRU5TU0xfWDg2IHx8IE9QRU5TU0xfWDg2XzY0ICovCmRpZmYgLS1naXQgYS9jcnlwdG8vY3B1LXg4Ni1hc20ucGwgYi9jcnlwdG8vY3B1LXg4Ni1hc20ucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUxNDkzYQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9jcHUteDg2LWFzbS5wbApAQCAtMCwwICsxLDM3MiBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCiskMCA9fiBtLyguKltcL1xcXSlbXlwvXFxdKyQvOyAkZGlyPSQxOworcHVzaChASU5DLCAiJHtkaXJ9cGVybGFzbSIsICJwZXJsYXNtIik7CityZXF1aXJlICJ4ODZhc20ucGwiOworCismYXNtX2luaXQoJEFSR1ZbMF0sImNyeXB0by9jcHUteDg2LWFzbSIpOworCitmb3IgKEBBUkdWKSB7ICRzc2UyPTEgaWYgKC8tRE9QRU5TU0xfSUEzMl9TU0UyLyk7IH0KKworJmZ1bmN0aW9uX2JlZ2luKCJPUEVOU1NMX2lhMzJfY3B1aWQiKTsKKwkmeG9yCSgiZWR4IiwiZWR4Iik7CisJJnB1c2hmCSgpOworCSZwb3AJKCJlYXgiKTsKKwkmbW92CSgiZWN4IiwiZWF4Iik7CisJJnhvcgkoImVheCIsMTw8MjEpOworCSZwdXNoCSgiZWF4Iik7CisJJnBvcGYJKCk7CisJJnB1c2hmCSgpOworCSZwb3AJKCJlYXgiKTsKKwkmeG9yCSgiZWN4IiwiZWF4Iik7CisJJnhvcgkoImVheCIsImVheCIpOworCSZidAkoImVjeCIsMjEpOworCSZqbmMJKCZsYWJlbCgibm9jcHVpZCIpKTsKKwkmbW92CSgiZXNpIiwmd3BhcmFtKDApKTsKKwkmbW92CSgmRFdQKDgsImVzaSIpLCJlYXgiKTsJIyBjbGVhciAzcmQgd29yZAorCSZjcHVpZAkoKTsKKwkmbW92CSgiZWRpIiwiZWF4Iik7CQkjIG1heCB2YWx1ZSBmb3Igc3RhbmRhcmQgcXVlcnkgbGV2ZWwKKworCSZ4b3IJKCJlYXgiLCJlYXgiKTsKKwkmY21wCSgiZWJ4IiwweDc1NmU2NTQ3KTsJIyAiR2VudSIKKwkmc2V0bmUJKCZMQigiZWF4IikpOworCSZtb3YJKCJlYnAiLCJlYXgiKTsKKwkmY21wCSgiZWR4IiwweDQ5NjU2ZTY5KTsJIyAiaW5lSSIKKwkmc2V0bmUJKCZMQigiZWF4IikpOworCSZvcgkoImVicCIsImVheCIpOworCSZjbXAJKCJlY3giLDB4NmM2NTc0NmUpOwkjICJudGVsIgorCSZzZXRuZQkoJkxCKCJlYXgiKSk7CisJJm9yCSgiZWJwIiwiZWF4Iik7CQkjIDAgaW5kaWNhdGVzIEludGVsIENQVQorCSZqegkoJmxhYmVsKCJpbnRlbCIpKTsKKworCSZjbXAJKCJlYngiLDB4Njg3NDc1NDEpOwkjICJBdXRoIgorCSZzZXRuZQkoJkxCKCJlYXgiKSk7CisJJm1vdgkoImVzaSIsImVheCIpOworCSZjbXAJKCJlZHgiLDB4Njk3NDZFNjUpOwkjICJlbnRpIgorCSZzZXRuZQkoJkxCKCJlYXgiKSk7CisJJm9yCSgiZXNpIiwiZWF4Iik7CisJJmNtcAkoImVjeCIsMHg0NDRENDE2Myk7CSMgImNBTUQiCisJJnNldG5lCSgmTEIoImVheCIpKTsKKwkmb3IJKCJlc2kiLCJlYXgiKTsJCSMgMCBpbmRpY2F0ZXMgQU1EIENQVQorCSZqbnoJKCZsYWJlbCgiaW50ZWwiKSk7CisKKwkjIEFNRCBzcGVjaWZpYworCSZtb3YJKCJlYXgiLDB4ODAwMDAwMDApOworCSZjcHVpZAkoKTsKKwkmY21wCSgiZWF4IiwweDgwMDAwMDAxKTsKKwkmamIJKCZsYWJlbCgiaW50ZWwiKSk7CisJJm1vdgkoImVzaSIsImVheCIpOworCSZtb3YJKCJlYXgiLDB4ODAwMDAwMDEpOworCSZjcHVpZAkoKTsKKwkmb3IJKCJlYnAiLCJlY3giKTsKKwkmYW5kCSgiZWJwIiwxPDwxMXwxKTsJIyBpc29sYXRlIFhPUCBiaXQKKwkmY21wCSgiZXNpIiwweDgwMDAwMDA4KTsKKwkmamIJKCZsYWJlbCgiaW50ZWwiKSk7CisKKwkmbW92CSgiZWF4IiwweDgwMDAwMDA4KTsKKwkmY3B1aWQJKCk7CisJJm1vdnoJKCJlc2kiLCZMQigiZWN4IikpOwkjIG51bWJlciBvZiBjb3JlcyAtIDEKKwkmaW5jCSgiZXNpIik7CQkjIG51bWJlciBvZiBjb3JlcworCisJJm1vdgkoImVheCIsMSk7CisJJnhvcgkoImVjeCIsImVjeCIpOworCSZjcHVpZAkoKTsKKwkmYnQJKCJlZHgiLDI4KTsKKwkmam5jCSgmbGFiZWwoImdlbmVyaWMiKSk7CisJJnNocgkoImVieCIsMTYpOworCSZhbmQJKCJlYngiLDB4ZmYpOworCSZjbXAJKCJlYngiLCJlc2kiKTsKKwkmamEJKCZsYWJlbCgiZ2VuZXJpYyIpKTsKKwkmYW5kCSgiZWR4IiwweGVmZmZmZmZmKTsJIyBjbGVhciBoeXBlci10aHJlYWRpbmcgYml0CisJJmptcAkoJmxhYmVsKCJnZW5lcmljIikpOworCQorJnNldF9sYWJlbCgiaW50ZWwiKTsKKwkmY21wCSgiZWRpIiw3KTsKKwkmamIJKCZsYWJlbCgiY2FjaGVpbmZvIikpOworCisJJm1vdgkoImVzaSIsJndwYXJhbSgwKSk7CisJJm1vdgkoImVheCIsNyk7CisJJnhvcgkoImVjeCIsImVjeCIpOworCSZjcHVpZAkoKTsKKwkmbW92CSgmRFdQKDgsImVzaSIpLCJlYngiKTsKKworJnNldF9sYWJlbCgiY2FjaGVpbmZvIik7CisJJmNtcAkoImVkaSIsNCk7CisJJm1vdgkoImVkaSIsLTEpOworCSZqYgkoJmxhYmVsKCJub2NhY2hlaW5mbyIpKTsKKworCSZtb3YJKCJlYXgiLDQpOworCSZtb3YJKCJlY3giLDApOwkJIyBxdWVyeSBMMUQKKwkmY3B1aWQJKCk7CisJJm1vdgkoImVkaSIsImVheCIpOworCSZzaHIJKCJlZGkiLDE0KTsKKwkmYW5kCSgiZWRpIiwweGZmZik7CQkjIG51bWJlciBvZiBjb3JlcyAtMSBwZXIgTDFECisKKyZzZXRfbGFiZWwoIm5vY2FjaGVpbmZvIik7CisJJm1vdgkoImVheCIsMSk7CisJJnhvcgkoImVjeCIsImVjeCIpOworCSZjcHVpZAkoKTsKKwkmYW5kCSgiZWR4IiwweGJmZWZmZmZmKTsJIyBmb3JjZSByZXNlcnZlZCBiaXRzICMyMCwgIzMwIHRvIDAKKwkmY21wCSgiZWJwIiwwKTsKKwkmam5lCSgmbGFiZWwoIm5vdGludGVsIikpOworCSZvcgkoImVkeCIsMTw8MzApOwkJIyBzZXQgcmVzZXJ2ZWQgYml0IzMwIG9uIEludGVsIENQVXMKKwkmYW5kCSgmSEIoImVheCIpLDE1KTsJIyBmYW1pbGl5IElECisJJmNtcAkoJkhCKCJlYXgiKSwxNSk7CSMgUDQ/CisJJmpuZQkoJmxhYmVsKCJub3RpbnRlbCIpKTsKKwkmb3IJKCJlZHgiLDE8PDIwKTsJCSMgc2V0IHJlc2VydmVkIGJpdCMyMCB0byBlbmdhZ2UgUkM0X0NIQVIKKyZzZXRfbGFiZWwoIm5vdGludGVsIik7CisJJmJ0CSgiZWR4IiwyOCk7CQkjIHRlc3QgaHlwZXItdGhyZWFkaW5nIGJpdAorCSZqbmMJKCZsYWJlbCgiZ2VuZXJpYyIpKTsKKwkmYW5kCSgiZWR4IiwweGVmZmZmZmZmKTsKKwkmY21wCSgiZWRpIiwwKTsKKwkmamUJKCZsYWJlbCgiZ2VuZXJpYyIpKTsKKworCSZvcgkoImVkeCIsMHgxMDAwMDAwMCk7CisJJnNocgkoImVieCIsMTYpOworCSZjbXAJKCZMQigiZWJ4IiksMSk7CisJJmphCSgmbGFiZWwoImdlbmVyaWMiKSk7CisJJmFuZAkoImVkeCIsMHhlZmZmZmZmZik7CSMgY2xlYXIgaHlwZXItdGhyZWFkaW5nIGJpdCBpZiBub3QKKworJnNldF9sYWJlbCgiZ2VuZXJpYyIpOworCSZhbmQJKCJlYnAiLDE8PDExKTsJCSMgaXNvbGF0ZSBBTUQgWE9QIGZsYWcKKwkmYW5kCSgiZWN4IiwweGZmZmZmN2ZmKTsJIyBmb3JjZSAxMXRoIGJpdCB0byAwCisJJm1vdgkoImVzaSIsImVkeCIpOworCSZvcgkoImVicCIsImVjeCIpOwkJIyBtZXJnZSBBTUQgWE9QIGZsYWcKKworCSZidAkoImVjeCIsMjcpOwkJIyBjaGVjayBPU1hTQVZFIGJpdAorCSZqbmMJKCZsYWJlbCgiY2xlYXJfYXZ4IikpOworCSZ4b3IJKCJlY3giLCJlY3giKTsKKwkmZGF0YV9ieXRlKDB4MGYsMHgwMSwweGQwKTsJIyB4Z2V0YnYKKwkmYW5kCSgiZWF4Iiw2KTsKKwkmY21wCSgiZWF4Iiw2KTsKKwkmamUJKCZsYWJlbCgiZG9uZSIpKTsKKwkmY21wCSgiZWF4IiwyKTsKKwkmamUJKCZsYWJlbCgiY2xlYXJfYXZ4IikpOworJnNldF9sYWJlbCgiY2xlYXJfeG1tIik7CisJJmFuZAkoImVicCIsMHhmZGZmZmZmZCk7CSMgY2xlYXIgQUVTTkkgYW5kIFBDTE1VTFFEUSBiaXRzCisJJmFuZAkoImVzaSIsMHhmZWZmZmZmZik7CSMgY2xlYXIgRlhTUgorJnNldF9sYWJlbCgiY2xlYXJfYXZ4Iik7CisJJmFuZAkoImVicCIsMHhlZmZmZTdmZik7CSMgY2xlYXIgQVZYLCBGTUEgYW5kIEFNRCBYT1AgYml0cworCSZtb3YJKCJlZGkiLCZ3cGFyYW0oMCkpOworCSZhbmQJKCZEV1AoOCwiZWRpIiksMHhmZmZmZmZkZik7CSMgY2xlYXIgQVZYMgorJnNldF9sYWJlbCgiZG9uZSIpOworCSZtb3YJKCJlYXgiLCJlc2kiKTsKKwkmbW92CSgiZWR4IiwiZWJwIik7Cismc2V0X2xhYmVsKCJub2NwdWlkIik7CismZnVuY3Rpb25fZW5kKCJPUEVOU1NMX2lhMzJfY3B1aWQiKTsKKworJmV4dGVybmFsX2xhYmVsKCJPUEVOU1NMX2lhMzJjYXBfUCIpOworCismZnVuY3Rpb25fYmVnaW5fQigiT1BFTlNTTF9yZHRzYyIsIkVYVFJOXHRfT1BFTlNTTF9pYTMyY2FwX1A6RFdPUkQiKTsKKwkmeG9yCSgiZWF4IiwiZWF4Iik7CisJJnhvcgkoImVkeCIsImVkeCIpOworCSZwaWNtZXVwKCJlY3giLCJPUEVOU1NMX2lhMzJjYXBfUCIpOworCSZidAkoJkRXUCgwLCJlY3giKSw0KTsKKwkmam5jCSgmbGFiZWwoIm5vdHNjIikpOworCSZyZHRzYwkoKTsKKyZzZXRfbGFiZWwoIm5vdHNjIik7CisJJnJldAkoKTsKKyZmdW5jdGlvbl9lbmRfQigiT1BFTlNTTF9yZHRzYyIpOworCisjIFRoaXMgd29ya3MgaW4gUmluZyAwIG9ubHkgW3JlYWQgREpHUFArTVMtRE9TK3ByaXZpbGVnZWQgRFBNSSBob3N0XSwKKyMgYnV0IGl0J3Mgc2FmZSB0byBjYWxsIGl0IG9uIGFueSBbc3VwcG9ydGVkXSAzMi1iaXQgcGxhdGZvcm0uLi4KKyMgSnVzdCBjaGVjayBmb3IgW25vbi1demVybyByZXR1cm4gdmFsdWUuLi4KKyZmdW5jdGlvbl9iZWdpbl9CKCJPUEVOU1NMX2luc3RydW1lbnRfaGFsdCIsIkVYVFJOXHRfT1BFTlNTTF9pYTMyY2FwX1A6RFdPUkQiKTsKKwkmcGljbWV1cCgiZWN4IiwiT1BFTlNTTF9pYTMyY2FwX1AiKTsKKwkmYnQJKCZEV1AoMCwiZWN4IiksNCk7CisJJmpuYwkoJmxhYmVsKCJub2hhbHQiKSk7CSMgbm8gVFNDCisKKwkmZGF0YV93b3JkKDB4OTA1ODkwMGUpOwkJIyBwdXNoICVjczsgcG9wICVlYXgKKwkmYW5kCSgiZWF4IiwzKTsKKwkmam56CSgmbGFiZWwoIm5vaGFsdCIpKTsJIyBub3QgZW5vdWdoIHByaXZpbGVnZXMKKworCSZwdXNoZgkoKTsKKwkmcG9wCSgiZWF4Iik7CisJJmJ0CSgiZWF4Iiw5KTsKKwkmam5jCSgmbGFiZWwoIm5vaGFsdCIpKTsJIyBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZAorCisJJnJkdHNjCSgpOworCSZwdXNoCSgiZWR4Iik7CisJJnB1c2gJKCJlYXgiKTsKKwkmaGFsdAkoKTsKKwkmcmR0c2MJKCk7CisKKwkmc3ViCSgiZWF4IiwmRFdQKDAsImVzcCIpKTsKKwkmc2JiCSgiZWR4IiwmRFdQKDQsImVzcCIpKTsKKwkmYWRkCSgiZXNwIiw4KTsKKwkmcmV0CSgpOworCismc2V0X2xhYmVsKCJub2hhbHQiKTsKKwkmeG9yCSgiZWF4IiwiZWF4Iik7CisJJnhvcgkoImVkeCIsImVkeCIpOworCSZyZXQJKCk7CismZnVuY3Rpb25fZW5kX0IoIk9QRU5TU0xfaW5zdHJ1bWVudF9oYWx0Iik7CisKKyMgRXNzZW50aWFsbHkgdGhlcmUgaXMgb25seSBvbmUgdXNlIGZvciB0aGlzIGZ1bmN0aW9uLiBVbmRlciBESkdQUDoKKyMKKyMJI2luY2x1ZGUgPGdvMzIuaD4KKyMJLi4uCisjCWk9T1BFTlNTTF9mYXJfc3BpbihfZG9zX2RzLDB4NDZjKTsKKyMJLi4uCisjIHRvIG9idGFpbiB0aGUgbnVtYmVyIG9mIHNwaW5zIHRpbGwgY2xvc2VzdCB0aW1lciBpbnRlcnJ1cHQuCisKKyZmdW5jdGlvbl9iZWdpbl9CKCJPUEVOU1NMX2Zhcl9zcGluIik7CisJJnB1c2hmCSgpOworCSZwb3AJKCJlYXgiKTsKKwkmYnQJKCJlYXgiLDkpOworCSZqbmMJKCZsYWJlbCgibm9zcGluIikpOwkjIGludGVycnVwdHMgYXJlIGRpc2FibGVkCisKKwkmbW92CSgiZWF4IiwmRFdQKDQsImVzcCIpKTsKKwkmbW92CSgiZWN4IiwmRFdQKDgsImVzcCIpKTsKKwkmZGF0YV93b3JkICgweDkwZDg4ZTFlKTsJIyBwdXNoICVkcywgbW92ICVlYXgsJWRzCisJJnhvcgkoImVheCIsImVheCIpOworCSZtb3YJKCJlZHgiLCZEV1AoMCwiZWN4IikpOworCSZqbXAJKCZsYWJlbCgic3BpbiIpKTsKKworCSZhbGlnbgkoMTYpOworJnNldF9sYWJlbCgic3BpbiIpOworCSZpbmMJKCJlYXgiKTsKKwkmY21wCSgiZWR4IiwmRFdQKDAsImVjeCIpKTsKKwkmamUJKCZsYWJlbCgic3BpbiIpKTsKKworCSZkYXRhX3dvcmQgKDB4MWY5MDkwOTApOwkjIHBvcAklZHMKKwkmcmV0CSgpOworCismc2V0X2xhYmVsKCJub3NwaW4iKTsKKwkmeG9yCSgiZWF4IiwiZWF4Iik7CisJJnhvcgkoImVkeCIsImVkeCIpOworCSZyZXQJKCk7CismZnVuY3Rpb25fZW5kX0IoIk9QRU5TU0xfZmFyX3NwaW4iKTsKKworJmZ1bmN0aW9uX2JlZ2luX0IoIk9QRU5TU0xfd2lwZV9jcHUiLCJFWFRSTlx0X09QRU5TU0xfaWEzMmNhcF9QOkRXT1JEIik7CisJJnhvcgkoImVheCIsImVheCIpOworCSZ4b3IJKCJlZHgiLCJlZHgiKTsKKwkmcGljbWV1cCgiZWN4IiwiT1BFTlNTTF9pYTMyY2FwX1AiKTsKKwkmbW92CSgiZWN4IiwmRFdQKDAsImVjeCIpKTsKKwkmYnQJKCZEV1AoMCwiZWN4IiksMSk7CisJJmpuYwkoJmxhYmVsKCJub194ODciKSk7CisJaWYgKCRzc2UyKSB7CisJCSZhbmQJKCJlY3giLDE8PDI2fDE8PDI0KTsJIyBjaGVjayBTU0UyIGFuZCBGWFNSIGJpdHMKKwkJJmNtcAkoImVjeCIsMTw8MjZ8MTw8MjQpOworCQkmam5lCSgmbGFiZWwoIm5vX3NzZTIiKSk7CisJCSZweG9yCSgieG1tMCIsInhtbTAiKTsKKwkJJnB4b3IJKCJ4bW0xIiwieG1tMSIpOworCQkmcHhvcgkoInhtbTIiLCJ4bW0yIik7CisJCSZweG9yCSgieG1tMyIsInhtbTMiKTsKKwkJJnB4b3IJKCJ4bW00IiwieG1tNCIpOworCQkmcHhvcgkoInhtbTUiLCJ4bW01Iik7CisJCSZweG9yCSgieG1tNiIsInhtbTYiKTsKKwkJJnB4b3IJKCJ4bW03IiwieG1tNyIpOworCSZzZXRfbGFiZWwoIm5vX3NzZTIiKTsKKwl9CisJIyBqdXN0IGEgYnVuY2ggb2YgZmxkeiB0byB6YXAgdGhlIGZwL21tIGJhbmsgZm9sbG93ZWQgYnkgZmluaXQuLi4KKwkmZGF0YV93b3JkKDB4ZWVkOWVlZDksMHhlZWQ5ZWVkOSwweGVlZDllZWQ5LDB4ZWVkOWVlZDksMHg5MGUzZGI5Yik7Cismc2V0X2xhYmVsKCJub194ODciKTsKKwkmbGVhCSgiZWF4IiwmRFdQKDQsImVzcCIpKTsKKwkmcmV0CSgpOworJmZ1bmN0aW9uX2VuZF9CKCJPUEVOU1NMX3dpcGVfY3B1Iik7CisKKyZmdW5jdGlvbl9iZWdpbl9CKCJPUEVOU1NMX2F0b21pY19hZGQiKTsKKwkmbW92CSgiZWR4IiwmRFdQKDQsImVzcCIpKTsJIyBmZXRjaCB0aGUgcG9pbnRlciwgMXN0IGFyZworCSZtb3YJKCJlY3giLCZEV1AoOCwiZXNwIikpOwkjIGZldGNoIHRoZSBpbmNyZW1lbnQsIDJuZCBhcmcKKwkmcHVzaAkoImVieCIpOworCSZub3AJKCk7CisJJm1vdgkoImVheCIsJkRXUCgwLCJlZHgiKSk7Cismc2V0X2xhYmVsKCJzcGluIik7CisJJmxlYQkoImVieCIsJkRXUCgwLCJlYXgiLCJlY3giKSk7CisJJm5vcAkoKTsKKwkmZGF0YV93b3JkKDB4MWFiMTBmZjApOwkjIGxvY2s7CWNtcHhjaGcJJWVieCwoJWVkeCkJIyAlZWF4IGlzIGVudm9sdmVkIGFuZCBpcyBhbHdheXMgcmVsb2FkZWQKKwkmam5lCSgmbGFiZWwoInNwaW4iKSk7CisJJm1vdgkoImVheCIsImVieCIpOwkjIE9wZW5TU0wgZXhwZWN0cyB0aGUgbmV3IHZhbHVlCisJJnBvcAkoImVieCIpOworCSZyZXQJKCk7CismZnVuY3Rpb25fZW5kX0IoIk9QRU5TU0xfYXRvbWljX2FkZCIpOworCisjIFRoaXMgZnVuY3Rpb24gY2FuIGJlY29tZSBoYW5keSB1bmRlciBXaW4zMiBpbiBzaXR1YXRpb25zIHdoZW4KKyMgd2UgZG9uJ3Qga25vdyB3aGljaCBjYWxsaW5nIGNvbnZlbnRpb24sIF9fc3RkY2FsbCBvciBfX2NkZWNsKCopLAorIyBpbmRpcmVjdCBjYWxsZWUgaXMgdXNpbmcuIEluIEMgaXQgY2FuIGJlIGRlcGxveWVkIGFzCisjCisjaWZkZWYgT1BFTlNTTF9DUFVJRF9PQkoKKyMJdHlwZSBPUEVOU1NMX2luZGlyZWN0X2NhbGwodm9pZCAqZiwuLi4pOworIwkuLi4KKyMJT1BFTlNTTF9pbmRpcmVjdF9jYWxsKGZ1bmMsW3VwIHRvICRtYXggYXJndW1lbnRzXSk7CisjZW5kaWYKKyMKKyMgKCopCWl0J3MgZGVzaWduZWQgdG8gd29yayBldmVuIGZvciBfX2Zhc3RjYWxsIGlmIG51bWJlciBvZgorIwlhcmd1bWVudHMgaXMgMSBvciAyIQorJmZ1bmN0aW9uX2JlZ2luX0IoIk9QRU5TU0xfaW5kaXJlY3RfY2FsbCIpOworCXsKKwlteSAoJG1heCwkaSk9KDcsKTsJIyAkbWF4IGhhcyB0byBiZSBjaG9zZW4gYXMgNCpuLTEKKwkJCQkjIGluIG9yZGVyIHRvIHByZXNlcnZlIGV2ZW50dWFsCisJCQkJIyBzdGFjayBhbGlnbm1lbnQKKwkmcHVzaAkoImVicCIpOworCSZtb3YJKCJlYnAiLCJlc3AiKTsKKwkmc3ViCSgiZXNwIiwkbWF4KjQpOworCSZtb3YJKCJlY3giLCZEV1AoMTIsImVicCIpKTsKKwkmbW92CSgmRFdQKDAsImVzcCIpLCJlY3giKTsKKwkmbW92CSgiZWR4IiwmRFdQKDE2LCJlYnAiKSk7CisJJm1vdgkoJkRXUCg0LCJlc3AiKSwiZWR4Iik7CisJZm9yKCRpPTI7JGk8JG1heDskaSsrKQorCQl7CisJCSMgU29tZSBjb3BpZXMgd2lsbCBiZSByZWR1bmRhbnQvYm9ndXMuLi4KKwkJJm1vdgkoImVheCIsJkRXUCgxMiskaSo0LCJlYnAiKSk7CisJCSZtb3YJKCZEV1AoMCskaSo0LCJlc3AiKSwiZWF4Iik7CisJCX0KKwkmY2FsbF9wdHIJKCZEV1AoOCwiZWJwIikpOyMgbWFrZSB0aGUgY2FsbC4uLgorCSZtb3YJKCJlc3AiLCJlYnAiKTsJIyAuLi4gYW5kIGp1c3QgcmVzdG9yZSB0aGUgc3RhY2sgcG9pbnRlcgorCQkJCSMgd2l0aG91dCBwYXlpbmcgYXR0ZW50aW9uIHRvIHdoYXQgd2UgY2FsbGVkLAorCQkJCSMgKF9fY2RlY2wgKmZ1bmMpIG9yIChfX3N0ZGNhbGwgKm9uZSkuCisJJnBvcAkoImVicCIpOworCSZyZXQJKCk7CisJfQorJmZ1bmN0aW9uX2VuZF9CKCJPUEVOU1NMX2luZGlyZWN0X2NhbGwiKTsKKworJmZ1bmN0aW9uX2JlZ2luX0IoIk9QRU5TU0xfY2xlYW5zZSIpOworCSZtb3YJKCJlZHgiLCZ3cGFyYW0oMCkpOworCSZtb3YJKCJlY3giLCZ3cGFyYW0oMSkpOworCSZ4b3IJKCJlYXgiLCJlYXgiKTsKKwkmY21wCSgiZWN4Iiw3KTsKKwkmamFlCSgmbGFiZWwoImxvdCIpKTsKKwkmY21wCSgiZWN4IiwwKTsKKwkmamUJKCZsYWJlbCgicmV0IikpOworJnNldF9sYWJlbCgibGl0dGxlIik7CisJJm1vdgkoJkJQKDAsImVkeCIpLCJhbCIpOworCSZzdWIJKCJlY3giLDEpOworCSZsZWEJKCJlZHgiLCZEV1AoMSwiZWR4IikpOworCSZqbnoJKCZsYWJlbCgibGl0dGxlIikpOworJnNldF9sYWJlbCgicmV0Iik7CisJJnJldAkoKTsKKworJnNldF9sYWJlbCgibG90IiwxNik7CisJJnRlc3QJKCJlZHgiLDMpOworCSZqegkoJmxhYmVsKCJhbGlnbmVkIikpOworCSZtb3YJKCZCUCgwLCJlZHgiKSwiYWwiKTsKKwkmbGVhCSgiZWN4IiwmRFdQKC0xLCJlY3giKSk7CisJJmxlYQkoImVkeCIsJkRXUCgxLCJlZHgiKSk7CisJJmptcAkoJmxhYmVsKCJsb3QiKSk7Cismc2V0X2xhYmVsKCJhbGlnbmVkIik7CisJJm1vdgkoJkRXUCgwLCJlZHgiKSwiZWF4Iik7CisJJmxlYQkoImVjeCIsJkRXUCgtNCwiZWN4IikpOworCSZ0ZXN0CSgiZWN4IiwtNCk7CisJJmxlYQkoImVkeCIsJkRXUCg0LCJlZHgiKSk7CisJJmpuegkoJmxhYmVsKCJhbGlnbmVkIikpOworCSZjbXAJKCJlY3giLDApOworCSZqbmUJKCZsYWJlbCgibGl0dGxlIikpOworCSZyZXQJKCk7CismZnVuY3Rpb25fZW5kX0IoIk9QRU5TU0xfY2xlYW5zZSIpOworCismZnVuY3Rpb25fYmVnaW5fQigiT1BFTlNTTF9pYTMyX3JkcmFuZCIpOworCSZtb3YJKCJlY3giLDgpOworJnNldF9sYWJlbCgibG9vcCIpOworCSZyZHJhbmQJKCJlYXgiKTsKKwkmamMJKCZsYWJlbCgiYnJlYWsiKSk7CisJJmxvb3AJKCZsYWJlbCgibG9vcCIpKTsKKyZzZXRfbGFiZWwoImJyZWFrIik7CisJJmNtcAkoImVheCIsMCk7CisJJmNtb3ZlCSgiZWF4IiwiZWN4Iik7CisJJnJldAkoKTsKKyZmdW5jdGlvbl9lbmRfQigiT1BFTlNTTF9pYTMyX3JkcmFuZCIpOworCismaGlkZGVuKCJPUEVOU1NMX2lhMzJjYXBfUCIpOworCismYXNtX2ZpbmlzaCgpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2NwdS14ODZfNjQtYXNtLnBsIGIvY3J5cHRvL2NwdS14ODZfNjQtYXNtLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5Y2ZkMTgKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vY3B1LXg4Nl82NC1hc20ucGwKQEAgLTAsMCArMSwxNjcgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworJGZsYXZvdXIgPSBzaGlmdDsKKyRvdXRwdXQgID0gc2hpZnQ7CitpZiAoJGZsYXZvdXIgPX4gL1wuLykgeyAkb3V0cHV0ID0gJGZsYXZvdXI7IHVuZGVmICRmbGF2b3VyOyB9CisKKyR3aW42ND0wOyAkd2luNjQ9MSBpZiAoJGZsYXZvdXIgPX4gL1tubV1hc218bWluZ3c2NC8gfHwgJG91dHB1dCA9fiAvXC5hc20kLyk7CisKKyQwID1+IG0vKC4qW1wvXFxdKVteXC9cXF0rJC87ICRkaXI9JDE7CisoICR4bGF0ZT0iJHtkaXJ9eDg2XzY0LXhsYXRlLnBsIiBhbmQgLWYgJHhsYXRlICkgb3IKKyggJHhsYXRlPSIke2Rpcn1wZXJsYXNtL3g4Nl82NC14bGF0ZS5wbCIgYW5kIC1mICR4bGF0ZSkgb3IKK2RpZSAiY2FuJ3QgbG9jYXRlIHg4Nl82NC14bGF0ZS5wbCI7CisKK29wZW4gT1VULCJ8IFwiJF5YXCIgJHhsYXRlICRmbGF2b3VyICRvdXRwdXQiOworKlNURE9VVD0qT1VUOworCisoJGFyZzEsJGFyZzIsJGFyZzMsJGFyZzQpPSR3aW42ND8oIiVyY3giLCIlcmR4IiwiJXI4IiwgIiVyOSIpIDoJIyBXaW42NCBvcmRlcgorCQkJCSAoIiVyZGkiLCIlcnNpIiwiJXJkeCIsIiVyY3giKTsJIyBVbml4IG9yZGVyCisKK3ByaW50PDxfX187CisudGV4dAorCisuZ2xvYmwJT1BFTlNTTF9pYTMyX2NwdWlkCisudHlwZQlPUEVOU1NMX2lhMzJfY3B1aWQsXEBmdW5jdGlvbiwxCisuYWxpZ24JMTYKK09QRU5TU0xfaWEzMl9jcHVpZDoKKwkjIE9uIFdpbmRvd3MsICRhcmcxIGlzIHJjeCwgYnV0IHRoYXQgd2lsbCBiZSBjbG9iYmVyZWQuIFNvIG1ha2UgV2luZG93cworCSMgdXNlIHRoZSBzYW1lIHJlZ2lzdGVyIGFzIFVuaXguCisJbW92CSRhcmcxLCVyZGkKKwltb3YJJXJieCwlcjgJCSMgc2F2ZSAlcmJ4CisKKwl4b3IJJWVheCwlZWF4CisJbW92CSVlYXgsOCglcmRpKQkJIyBjbGVhciAzcmQgd29yZAorCWNwdWlkCisJbW92CSVlYXgsJXIxMWQJCSMgbWF4IHZhbHVlIGZvciBzdGFuZGFyZCBxdWVyeSBsZXZlbAorCisJeG9yCSVlYXgsJWVheAorCWNtcAlcJDB4NzU2ZTY1NDcsJWVieAkjICJHZW51IgorCXNldG5lCSVhbAorCW1vdgklZWF4LCVyOWQKKwljbXAJXCQweDQ5NjU2ZTY5LCVlZHgJIyAiaW5lSSIKKwlzZXRuZQklYWwKKwlvcgklZWF4LCVyOWQKKwljbXAJXCQweDZjNjU3NDZlLCVlY3gJIyAibnRlbCIKKwlzZXRuZQklYWwKKwlvcgklZWF4LCVyOWQJCSMgMCBpbmRpY2F0ZXMgSW50ZWwgQ1BVCisJanoJLkxpbnRlbAorCisJY21wCVwkMHg2ODc0NzU0MSwlZWJ4CSMgIkF1dGgiCisJc2V0bmUJJWFsCisJbW92CSVlYXgsJXIxMGQKKwljbXAJXCQweDY5NzQ2RTY1LCVlZHgJIyAiZW50aSIKKwlzZXRuZQklYWwKKwlvcgklZWF4LCVyMTBkCisJY21wCVwkMHg0NDRENDE2MywlZWN4CSMgImNBTUQiCisJc2V0bmUJJWFsCisJb3IJJWVheCwlcjEwZAkJIyAwIGluZGljYXRlcyBBTUQgQ1BVCisJam56CS5MaW50ZWwKKworCSMgQU1EIHNwZWNpZmljCisJIyBTZWUgaHR0cDovL2RldmVsb3Blci5hbWQuY29tL3dvcmRwcmVzcy9tZWRpYS8yMDEyLzEwLzI1NDgxMS5wZGYgKDEpCisKKwltb3YJXCQweDgwMDAwMDAwLCVlYXgKKwljcHVpZAorCSMgUmV0dXJucyAiVGhlIGxhcmdlc3QgQ1BVSUQgZXh0ZW5kZWQgZnVuY3Rpb24gaW5wdXQgdmFsdWUgc3VwcG9ydGVkIGJ5CisJIyB0aGUgcHJvY2Vzc29yIGltcGxlbWVudGF0aW9uLiIgaW4gRUFYLgorCWNtcAlcJDB4ODAwMDAwMDEsJWVheAorCWpiCS5MaW50ZWwKKwltb3YJJWVheCwlcjEwZAorCW1vdglcJDB4ODAwMDAwMDEsJWVheAorCWNwdWlkCisJIyBSZXR1cm5zIGZlYXR1cmUgYml0cyBpbiBFQ1guIFNlZSBwYWdlIDIwIG9mIFsxXS4KKwkjIFRPRE8oZm9yayk6IEkgdGhpbmsgdGhpcyBzaG91bGQgYmUgYSBNT1YuCisJb3IJJWVjeCwlcjlkCisJYW5kCVwkMHgwMDAwMDgwMSwlcjlkCSMgaXNvbGF0ZSBBTUQgWE9QIGJpdCwgMTw8MTEKKworCWNtcAlcJDB4ODAwMDAwMDgsJXIxMGQKKwlqYgkuTGludGVsCisKKwltb3YJXCQweDgwMDAwMDA4LCVlYXgKKwljcHVpZAorCSMgUmV0dXJucyBBUElDIElEIGFuZCBudW1iZXIgb2YgY29yZXMgaW4gRUNYLiBTZWUgcGFnZSAyNyBvZiBbMV0uCisJbW92emIJJWNsLCVyMTAJCSMgbnVtYmVyIG9mIGNvcmVzIC0gMQorCWluYwklcjEwCQkJIyBudW1iZXIgb2YgY29yZXMKKworCW1vdglcJDEsJWVheAorCWNwdWlkCisJIyBTZWUgcGFnZSAxMyBvZiBbMV0uCisJYnQJXCQyOCwlZWR4CQkjIHRlc3QgaHlwZXItdGhyZWFkaW5nIGJpdAorCWpuYwkuTGdlbmVyaWMKKwlzaHIJXCQxNiwlZWJ4CQkjIG51bWJlciBvZiBsb2dpY2FsIHByb2Nlc3NvcnMKKwljbXAJJXIxMGIsJWJsCisJamEJLkxnZW5lcmljCisJYW5kCVwkMHhlZmZmZmZmZiwlZWR4CSMgQ2xlYXIgaHlwZXItdGhyZWFkaW5nIGJpdC4KKwlqbXAJLkxnZW5lcmljCisKKy5MaW50ZWw6CisJY21wCVwkNCwlcjExZAorCW1vdglcJC0xLCVyMTBkCisJamIJLkxub2NhY2hlaW5mbworCisJbW92CVwkNCwlZWF4CisJbW92CVwkMCwlZWN4CQkjIHF1ZXJ5IEwxRAorCWNwdWlkCisJbW92CSVlYXgsJXIxMGQKKwlzaHIJXCQxNCwlcjEwZAorCWFuZAlcJDB4ZmZmLCVyMTBkCQkjIG51bWJlciBvZiBjb3JlcyAtMSBwZXIgTDFECisKKwljbXAJXCQ3LCVyMTFkCisJamIJLkxub2NhY2hlaW5mbworCisJbW92CVwkNywlZWF4CisJeG9yCSVlY3gsJWVjeAorCWNwdWlkCisJbW92CSVlYngsOCglcmRpKQorCisuTG5vY2FjaGVpbmZvOgorCW1vdglcJDEsJWVheAorCWNwdWlkCisJIyBHZXRzIGZlYXR1cmUgaW5mb3JtYXRpb24uIFNlZSB0YWJsZSAzLTIxIGluIHRoZSBJbnRlbCBtYW51YWwuCisJYW5kCVwkMHhiZmVmZmZmZiwlZWR4CSMgZm9yY2UgcmVzZXJ2ZWQgYml0cyB0byAwCisJY21wCVwkMCwlcjlkCisJam5lCS5Mbm90aW50ZWwKKwlvcglcJDB4NDAwMDAwMDAsJWVkeAkjIHNldCByZXNlcnZlZCBiaXQjMzAgb24gSW50ZWwgQ1BVcworCWFuZAlcJDE1LCVhaAorCWNtcAlcJDE1LCVhaAkJIyBleGFtaW5lIEZhbWlseSBJRAorCWpuZQkuTG5vdGludGVsCisJb3IJXCQweDAwMTAwMDAwLCVlZHgJIyBzZXQgcmVzZXJ2ZWQgYml0IzIwIHRvIGVuZ2FnZSBSQzRfQ0hBUgorLkxub3RpbnRlbDoKKwlidAlcJDI4LCVlZHgJCSMgdGVzdCBoeXBlci10aHJlYWRpbmcgYml0CisJam5jCS5MZ2VuZXJpYworCWFuZAlcJDB4ZWZmZmZmZmYsJWVkeAkjIH4oMTw8MjgpIC0gY2xlYXIgaHlwZXItdGhyZWFkaW5nLgorCWNtcAlcJDAsJXIxMGQKKwlqZQkuTGdlbmVyaWMKKworCW9yCVwkMHgxMDAwMDAwMCwlZWR4CSMgMTw8MjgKKwlzaHIJXCQxNiwlZWJ4CisJY21wCVwkMSwlYmwJCQkjIHNlZSBpZiBjYWNoZSBpcyBzaGFyZWQKKwlqYQkuTGdlbmVyaWMKKwlhbmQJXCQweGVmZmZmZmZmLCVlZHgJIyB+KDE8PDI4KQorLkxnZW5lcmljOgorCWFuZAlcJDB4MDAwMDA4MDAsJXI5ZAkjIGlzb2xhdGUgQU1EIFhPUCBmbGFnCisJYW5kCVwkMHhmZmZmZjdmZiwlZWN4CisJb3IJJWVjeCwlcjlkCQkjIG1lcmdlIEFNRCBYT1AgZmxhZworCisJbW92CSVlZHgsJXIxMGQJCSMgJXI5ZDolcjEwZCBpcyBjb3B5IG9mICVlY3g6JWVkeAorCWJ0CVwkMjcsJXI5ZAkJIyBjaGVjayBPU1hTQVZFIGJpdAorCWpuYwkuTGNsZWFyX2F2eAorCXhvcgklZWN4LCVlY3gJCSMgWENSMAorCS5ieXRlCTB4MGYsMHgwMSwweGQwCQkjIHhnZXRidgorCWFuZAlcJDYsJWVheAkJIyBpc29sYXRlIFhNTSBhbmQgWU1NIHN0YXRlIHN1cHBvcnQKKwljbXAJXCQ2LCVlYXgKKwlqZQkuTGRvbmUKKy5MY2xlYXJfYXZ4OgorCW1vdglcJDB4ZWZmZmU3ZmYsJWVheAkjIH4oMTw8Mjh8MTw8MTJ8MTw8MTEpCisJYW5kCSVlYXgsJXI5ZAkJIyBjbGVhciBBVlgsIEZNQSBhbmQgQU1EIFhPUCBiaXRzCisJYW5kbAlcJDB4ZmZmZmZmZGYsOCglcmRpKQkjIGNsZWF4IEFWWDIsIH4oMTw8NSkKKy5MZG9uZToKKwltb3ZsCSVyOWQsNCglcmRpKQorCW1vdmwJJXIxMGQsMCglcmRpKQorCW1vdgklcjgsJXJieAkJIyByZXN0b3JlICVyYngKKwlyZXQKKy5zaXplCU9QRU5TU0xfaWEzMl9jcHVpZCwuLU9QRU5TU0xfaWEzMl9jcHVpZAorCitfX18KKworY2xvc2UgU1RET1VUOwkjIGZsdXNoCmRpZmYgLS1naXQgYS9jcnlwdG8vY3B1LmggYi9jcnlwdG8vY3B1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJmNmRhMgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9jcHUuaApAQCAtMCwwICsxLDEwMyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisjaWZuZGVmIE9QRU5TU0xfSEVBREVSX0NQVV9ICisjZGVmaW5lIE9QRU5TU0xfSEVBREVSX0NQVV9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jhc2UuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfWDg2KSB8fCBkZWZpbmVkKE9QRU5TU0xfWDg2XzY0KQorLyogT1BFTlNTTF9pYTMyY2FwX1AgY29udGFpbnMgdGhlIEludGVsIENQVUlEIGJpdHMgd2hlbiBydW5uaW5nIG9uIGFuIHg4NiBvcgorICogeDg2LTY0IHN5c3RlbS4KKyAqCisgKiAgIEluZGV4IDA6CisgKiAgICAgRURYIGZvciBDUFVJRCB3aGVyZSBFQVggPSAxCisgKiAgICAgQml0IDMwIGlzIHVzZWQgdG8gaW5kaWNhdGUgYW4gSW50ZWwgQ1BVCisgKiAgICAgQml0IDIwIGlzIHVzZWQgdG8gaW5kaWNhdGUgUkM0X0NIQVIKKyAqICAgSW5kZXggMToKKyAqICAgICBFQ1ggZm9yIENQVUlEIHdoZXJlIEVBWCA9IDEKKyAqICAgSW5kZXggMjoKKyAqICAgICBFQlggZm9yIENQVUlEIHdoZXJlIEVBWCA9IDcgKi8KK2V4dGVybiB1aW50MzJfdCBPUEVOU1NMX2lhMzJjYXBfUFs0XTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChPUEVOU1NMX0FSTSkKKy8qIENSWVBUT19pc19ORU9OX2NhcGFibGUgcmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IENQVSBoYXMgYSBORU9OIHVuaXQuIE5vdGUKKyAqIHRoYXQgfE9QRU5TU0xfYXJtY2FwX1B8IGFsc28gZXhpc3RzIGFuZCBjb250YWlucyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBpbiBhCisgKiBmb3JtIHRoYXQncyBlYXNpZXIgZm9yIGFzc2VtYmx5IHRvIHVzZS4gKi8KK2NoYXIgQ1JZUFRPX2lzX05FT05fY2FwYWJsZSgpOworCisvKiBDUllQVE9fc2V0X05FT05fY2FwYWJsZSBzZXRzIHRoZSByZXR1cm4gdmFsdWUgb2YgfENSWVBUT19pc19ORU9OX2NhcGFibGV8LgorICogQnkgZGVmYXVsdCwgdW5sZXNzIHRoZSBjb2RlIHdhcyBjb21waWxlZCB3aXRoIHwtbWZwdT1uZW9ufCwgTkVPTiBpcyBhc3N1bWVkCisgKiBub3QgdG8gYmUgcHJlc2VudC4gSXQgaXMgbm90IGF1dG9kZXRlY3RlZC4gKi8KK3ZvaWQgQ1JZUFRPX3NldF9ORU9OX2NhcGFibGUoY2hhciBuZW9uX2NhcGFibGUpOworI2VuZGlmICAvKiBPUEVOU1NMX0FSTSAqLworCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfSAgLyogZXh0ZXJuIEMgKi8KKyNlbmRpZgorCisjZW5kaWYgIC8qIE9QRU5TU0xfSEVBREVSX0NQVV9IICovCmRpZmYgLS1naXQgYS9jcnlwdG8vY3J5cHRvX2Vycm9yLmMgYi9jcnlwdG8vY3J5cHRvX2Vycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgzYmJlMwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9jcnlwdG9fZXJyb3IuYwpAQCAtMCwwICsxLDI1IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTQsIEdvb2dsZSBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorCisjaW5jbHVkZSAiY3J5cHRvX2Vycm9yLmgiCisKK2NvbnN0IEVSUl9TVFJJTkdfREFUQSBDUllQVE9fZXJyb3Jfc3RyaW5nX2RhdGFbXSA9IHsKKyAge0VSUl9QQUNLKEVSUl9MSUJfQ1JZUFRPLCBDUllQVE9fRl9DUllQVE9fc2V0X2V4X2RhdGEsIDApLCAiQ1JZUFRPX3NldF9leF9kYXRhIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0NSWVBUTywgQ1JZUFRPX0ZfZ2V0X2NsYXNzLCAwKSwgImdldF9jbGFzcyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9DUllQVE8sIENSWVBUT19GX2dldF9mdW5jX3BvaW50ZXJzLCAwKSwgImdldF9mdW5jX3BvaW50ZXJzIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0NSWVBUTywgQ1JZUFRPX0ZfZ2V0X25ld19pbmRleCwgMCksICJnZXRfbmV3X2luZGV4In0sCisgIHswLCBOVUxMfSwKK307CmRpZmYgLS1naXQgYS9jcnlwdG8vY3J5cHRvX2Vycm9yLmggYi9jcnlwdG8vY3J5cHRvX2Vycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQzZDYwNwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9jcnlwdG9fZXJyb3IuaApAQCAtMCwwICsxLDUgQEAKKyNkZWZpbmUgQ1JZUFRPX0ZfQ1JZUFRPX3NldF9leF9kYXRhIDEwMAorI2RlZmluZSBDUllQVE9fRl9nZXRfY2xhc3MgMTAxCisjZGVmaW5lIENSWVBUT19GX2dldF9uZXdfaW5kZXggMTAyCisjZGVmaW5lIENSWVBUT19GX2dldF9mdW5jX3BvaW50ZXJzIDEwMworCmRpZmYgLS1naXQgYS9jcnlwdG8vZGVzL0NNYWtlTGlzdHMudHh0IGIvY3J5cHRvL2Rlcy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWNlNDUyCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2Rlcy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDkgQEAKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQorCithZGRfbGlicmFyeSgKKwlkZXMKKworCU9CSkVDVAorCisJZGVzLmMKKykKZGlmZiAtLWdpdCBhL2NyeXB0by9kZXMvZGVzLmMgYi9jcnlwdG8vZGVzL2Rlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhODdlZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vZGVzL2Rlcy5jCkBAIC0wLDAgKzEsNzE0IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9kZXMuaD4KKworI2luY2x1ZGUgImludGVybmFsLmgiCisKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IGRlc19za2JbOF1bNjRdID0geworICAgIHsvKiBmb3IgQyBiaXRzIChudW1iZXJlZCBhcyBwZXIgRklQUyA0NikgMSAyIDMgNCA1IDYgKi8KKyAgICAgMHgwMDAwMDAwMEwsIDB4MDAwMDAwMTBMLCAweDIwMDAwMDAwTCwgMHgyMDAwMDAxMEwsIDB4MDAwMTAwMDBMLAorICAgICAweDAwMDEwMDEwTCwgMHgyMDAxMDAwMEwsIDB4MjAwMTAwMTBMLCAweDAwMDAwODAwTCwgMHgwMDAwMDgxMEwsCisgICAgIDB4MjAwMDA4MDBMLCAweDIwMDAwODEwTCwgMHgwMDAxMDgwMEwsIDB4MDAwMTA4MTBMLCAweDIwMDEwODAwTCwKKyAgICAgMHgyMDAxMDgxMEwsIDB4MDAwMDAwMjBMLCAweDAwMDAwMDMwTCwgMHgyMDAwMDAyMEwsIDB4MjAwMDAwMzBMLAorICAgICAweDAwMDEwMDIwTCwgMHgwMDAxMDAzMEwsIDB4MjAwMTAwMjBMLCAweDIwMDEwMDMwTCwgMHgwMDAwMDgyMEwsCisgICAgIDB4MDAwMDA4MzBMLCAweDIwMDAwODIwTCwgMHgyMDAwMDgzMEwsIDB4MDAwMTA4MjBMLCAweDAwMDEwODMwTCwKKyAgICAgMHgyMDAxMDgyMEwsIDB4MjAwMTA4MzBMLCAweDAwMDgwMDAwTCwgMHgwMDA4MDAxMEwsIDB4MjAwODAwMDBMLAorICAgICAweDIwMDgwMDEwTCwgMHgwMDA5MDAwMEwsIDB4MDAwOTAwMTBMLCAweDIwMDkwMDAwTCwgMHgyMDA5MDAxMEwsCisgICAgIDB4MDAwODA4MDBMLCAweDAwMDgwODEwTCwgMHgyMDA4MDgwMEwsIDB4MjAwODA4MTBMLCAweDAwMDkwODAwTCwKKyAgICAgMHgwMDA5MDgxMEwsIDB4MjAwOTA4MDBMLCAweDIwMDkwODEwTCwgMHgwMDA4MDAyMEwsIDB4MDAwODAwMzBMLAorICAgICAweDIwMDgwMDIwTCwgMHgyMDA4MDAzMEwsIDB4MDAwOTAwMjBMLCAweDAwMDkwMDMwTCwgMHgyMDA5MDAyMEwsCisgICAgIDB4MjAwOTAwMzBMLCAweDAwMDgwODIwTCwgMHgwMDA4MDgzMEwsIDB4MjAwODA4MjBMLCAweDIwMDgwODMwTCwKKyAgICAgMHgwMDA5MDgyMEwsIDB4MDAwOTA4MzBMLCAweDIwMDkwODIwTCwgMHgyMDA5MDgzMEwsIH0sCisgICAgey8qIGZvciBDIGJpdHMgKG51bWJlcmVkIGFzIHBlciBGSVBTIDQ2KSA3IDggMTAgMTEgMTIgMTMgKi8KKyAgICAgMHgwMDAwMDAwMEwsIDB4MDIwMDAwMDBMLCAweDAwMDAyMDAwTCwgMHgwMjAwMjAwMEwsIDB4MDAyMDAwMDBMLAorICAgICAweDAyMjAwMDAwTCwgMHgwMDIwMjAwMEwsIDB4MDIyMDIwMDBMLCAweDAwMDAwMDA0TCwgMHgwMjAwMDAwNEwsCisgICAgIDB4MDAwMDIwMDRMLCAweDAyMDAyMDA0TCwgMHgwMDIwMDAwNEwsIDB4MDIyMDAwMDRMLCAweDAwMjAyMDA0TCwKKyAgICAgMHgwMjIwMjAwNEwsIDB4MDAwMDA0MDBMLCAweDAyMDAwNDAwTCwgMHgwMDAwMjQwMEwsIDB4MDIwMDI0MDBMLAorICAgICAweDAwMjAwNDAwTCwgMHgwMjIwMDQwMEwsIDB4MDAyMDI0MDBMLCAweDAyMjAyNDAwTCwgMHgwMDAwMDQwNEwsCisgICAgIDB4MDIwMDA0MDRMLCAweDAwMDAyNDA0TCwgMHgwMjAwMjQwNEwsIDB4MDAyMDA0MDRMLCAweDAyMjAwNDA0TCwKKyAgICAgMHgwMDIwMjQwNEwsIDB4MDIyMDI0MDRMLCAweDEwMDAwMDAwTCwgMHgxMjAwMDAwMEwsIDB4MTAwMDIwMDBMLAorICAgICAweDEyMDAyMDAwTCwgMHgxMDIwMDAwMEwsIDB4MTIyMDAwMDBMLCAweDEwMjAyMDAwTCwgMHgxMjIwMjAwMEwsCisgICAgIDB4MTAwMDAwMDRMLCAweDEyMDAwMDA0TCwgMHgxMDAwMjAwNEwsIDB4MTIwMDIwMDRMLCAweDEwMjAwMDA0TCwKKyAgICAgMHgxMjIwMDAwNEwsIDB4MTAyMDIwMDRMLCAweDEyMjAyMDA0TCwgMHgxMDAwMDQwMEwsIDB4MTIwMDA0MDBMLAorICAgICAweDEwMDAyNDAwTCwgMHgxMjAwMjQwMEwsIDB4MTAyMDA0MDBMLCAweDEyMjAwNDAwTCwgMHgxMDIwMjQwMEwsCisgICAgIDB4MTIyMDI0MDBMLCAweDEwMDAwNDA0TCwgMHgxMjAwMDQwNEwsIDB4MTAwMDI0MDRMLCAweDEyMDAyNDA0TCwKKyAgICAgMHgxMDIwMDQwNEwsIDB4MTIyMDA0MDRMLCAweDEwMjAyNDA0TCwgMHgxMjIwMjQwNEwsIH0sCisgICAgey8qIGZvciBDIGJpdHMgKG51bWJlcmVkIGFzIHBlciBGSVBTIDQ2KSAxNCAxNSAxNiAxNyAxOSAyMCAqLworICAgICAweDAwMDAwMDAwTCwgMHgwMDAwMDAwMUwsIDB4MDAwNDAwMDBMLCAweDAwMDQwMDAxTCwgMHgwMTAwMDAwMEwsCisgICAgIDB4MDEwMDAwMDFMLCAweDAxMDQwMDAwTCwgMHgwMTA0MDAwMUwsIDB4MDAwMDAwMDJMLCAweDAwMDAwMDAzTCwKKyAgICAgMHgwMDA0MDAwMkwsIDB4MDAwNDAwMDNMLCAweDAxMDAwMDAyTCwgMHgwMTAwMDAwM0wsIDB4MDEwNDAwMDJMLAorICAgICAweDAxMDQwMDAzTCwgMHgwMDAwMDIwMEwsIDB4MDAwMDAyMDFMLCAweDAwMDQwMjAwTCwgMHgwMDA0MDIwMUwsCisgICAgIDB4MDEwMDAyMDBMLCAweDAxMDAwMjAxTCwgMHgwMTA0MDIwMEwsIDB4MDEwNDAyMDFMLCAweDAwMDAwMjAyTCwKKyAgICAgMHgwMDAwMDIwM0wsIDB4MDAwNDAyMDJMLCAweDAwMDQwMjAzTCwgMHgwMTAwMDIwMkwsIDB4MDEwMDAyMDNMLAorICAgICAweDAxMDQwMjAyTCwgMHgwMTA0MDIwM0wsIDB4MDgwMDAwMDBMLCAweDA4MDAwMDAxTCwgMHgwODA0MDAwMEwsCisgICAgIDB4MDgwNDAwMDFMLCAweDA5MDAwMDAwTCwgMHgwOTAwMDAwMUwsIDB4MDkwNDAwMDBMLCAweDA5MDQwMDAxTCwKKyAgICAgMHgwODAwMDAwMkwsIDB4MDgwMDAwMDNMLCAweDA4MDQwMDAyTCwgMHgwODA0MDAwM0wsIDB4MDkwMDAwMDJMLAorICAgICAweDA5MDAwMDAzTCwgMHgwOTA0MDAwMkwsIDB4MDkwNDAwMDNMLCAweDA4MDAwMjAwTCwgMHgwODAwMDIwMUwsCisgICAgIDB4MDgwNDAyMDBMLCAweDA4MDQwMjAxTCwgMHgwOTAwMDIwMEwsIDB4MDkwMDAyMDFMLCAweDA5MDQwMjAwTCwKKyAgICAgMHgwOTA0MDIwMUwsIDB4MDgwMDAyMDJMLCAweDA4MDAwMjAzTCwgMHgwODA0MDIwMkwsIDB4MDgwNDAyMDNMLAorICAgICAweDA5MDAwMjAyTCwgMHgwOTAwMDIwM0wsIDB4MDkwNDAyMDJMLCAweDA5MDQwMjAzTCwgfSwKKyAgICB7LyogZm9yIEMgYml0cyAobnVtYmVyZWQgYXMgcGVyIEZJUFMgNDYpIDIxIDIzIDI0IDI2IDI3IDI4ICovCisgICAgIDB4MDAwMDAwMDBMLCAweDAwMTAwMDAwTCwgMHgwMDAwMDEwMEwsIDB4MDAxMDAxMDBMLCAweDAwMDAwMDA4TCwKKyAgICAgMHgwMDEwMDAwOEwsIDB4MDAwMDAxMDhMLCAweDAwMTAwMTA4TCwgMHgwMDAwMTAwMEwsIDB4MDAxMDEwMDBMLAorICAgICAweDAwMDAxMTAwTCwgMHgwMDEwMTEwMEwsIDB4MDAwMDEwMDhMLCAweDAwMTAxMDA4TCwgMHgwMDAwMTEwOEwsCisgICAgIDB4MDAxMDExMDhMLCAweDA0MDAwMDAwTCwgMHgwNDEwMDAwMEwsIDB4MDQwMDAxMDBMLCAweDA0MTAwMTAwTCwKKyAgICAgMHgwNDAwMDAwOEwsIDB4MDQxMDAwMDhMLCAweDA0MDAwMTA4TCwgMHgwNDEwMDEwOEwsIDB4MDQwMDEwMDBMLAorICAgICAweDA0MTAxMDAwTCwgMHgwNDAwMTEwMEwsIDB4MDQxMDExMDBMLCAweDA0MDAxMDA4TCwgMHgwNDEwMTAwOEwsCisgICAgIDB4MDQwMDExMDhMLCAweDA0MTAxMTA4TCwgMHgwMDAyMDAwMEwsIDB4MDAxMjAwMDBMLCAweDAwMDIwMTAwTCwKKyAgICAgMHgwMDEyMDEwMEwsIDB4MDAwMjAwMDhMLCAweDAwMTIwMDA4TCwgMHgwMDAyMDEwOEwsIDB4MDAxMjAxMDhMLAorICAgICAweDAwMDIxMDAwTCwgMHgwMDEyMTAwMEwsIDB4MDAwMjExMDBMLCAweDAwMTIxMTAwTCwgMHgwMDAyMTAwOEwsCisgICAgIDB4MDAxMjEwMDhMLCAweDAwMDIxMTA4TCwgMHgwMDEyMTEwOEwsIDB4MDQwMjAwMDBMLCAweDA0MTIwMDAwTCwKKyAgICAgMHgwNDAyMDEwMEwsIDB4MDQxMjAxMDBMLCAweDA0MDIwMDA4TCwgMHgwNDEyMDAwOEwsIDB4MDQwMjAxMDhMLAorICAgICAweDA0MTIwMTA4TCwgMHgwNDAyMTAwMEwsIDB4MDQxMjEwMDBMLCAweDA0MDIxMTAwTCwgMHgwNDEyMTEwMEwsCisgICAgIDB4MDQwMjEwMDhMLCAweDA0MTIxMDA4TCwgMHgwNDAyMTEwOEwsIDB4MDQxMjExMDhMLCB9LAorICAgIHsvKiBmb3IgRCBiaXRzIChudW1iZXJlZCBhcyBwZXIgRklQUyA0NikgMSAyIDMgNCA1IDYgKi8KKyAgICAgMHgwMDAwMDAwMEwsIDB4MTAwMDAwMDBMLCAweDAwMDEwMDAwTCwgMHgxMDAxMDAwMEwsIDB4MDAwMDAwMDRMLAorICAgICAweDEwMDAwMDA0TCwgMHgwMDAxMDAwNEwsIDB4MTAwMTAwMDRMLCAweDIwMDAwMDAwTCwgMHgzMDAwMDAwMEwsCisgICAgIDB4MjAwMTAwMDBMLCAweDMwMDEwMDAwTCwgMHgyMDAwMDAwNEwsIDB4MzAwMDAwMDRMLCAweDIwMDEwMDA0TCwKKyAgICAgMHgzMDAxMDAwNEwsIDB4MDAxMDAwMDBMLCAweDEwMTAwMDAwTCwgMHgwMDExMDAwMEwsIDB4MTAxMTAwMDBMLAorICAgICAweDAwMTAwMDA0TCwgMHgxMDEwMDAwNEwsIDB4MDAxMTAwMDRMLCAweDEwMTEwMDA0TCwgMHgyMDEwMDAwMEwsCisgICAgIDB4MzAxMDAwMDBMLCAweDIwMTEwMDAwTCwgMHgzMDExMDAwMEwsIDB4MjAxMDAwMDRMLCAweDMwMTAwMDA0TCwKKyAgICAgMHgyMDExMDAwNEwsIDB4MzAxMTAwMDRMLCAweDAwMDAxMDAwTCwgMHgxMDAwMTAwMEwsIDB4MDAwMTEwMDBMLAorICAgICAweDEwMDExMDAwTCwgMHgwMDAwMTAwNEwsIDB4MTAwMDEwMDRMLCAweDAwMDExMDA0TCwgMHgxMDAxMTAwNEwsCisgICAgIDB4MjAwMDEwMDBMLCAweDMwMDAxMDAwTCwgMHgyMDAxMTAwMEwsIDB4MzAwMTEwMDBMLCAweDIwMDAxMDA0TCwKKyAgICAgMHgzMDAwMTAwNEwsIDB4MjAwMTEwMDRMLCAweDMwMDExMDA0TCwgMHgwMDEwMTAwMEwsIDB4MTAxMDEwMDBMLAorICAgICAweDAwMTExMDAwTCwgMHgxMDExMTAwMEwsIDB4MDAxMDEwMDRMLCAweDEwMTAxMDA0TCwgMHgwMDExMTAwNEwsCisgICAgIDB4MTAxMTEwMDRMLCAweDIwMTAxMDAwTCwgMHgzMDEwMTAwMEwsIDB4MjAxMTEwMDBMLCAweDMwMTExMDAwTCwKKyAgICAgMHgyMDEwMTAwNEwsIDB4MzAxMDEwMDRMLCAweDIwMTExMDA0TCwgMHgzMDExMTAwNEwsIH0sCisgICAgey8qIGZvciBEIGJpdHMgKG51bWJlcmVkIGFzIHBlciBGSVBTIDQ2KSA4IDkgMTEgMTIgMTMgMTQgKi8KKyAgICAgMHgwMDAwMDAwMEwsIDB4MDgwMDAwMDBMLCAweDAwMDAwMDA4TCwgMHgwODAwMDAwOEwsIDB4MDAwMDA0MDBMLAorICAgICAweDA4MDAwNDAwTCwgMHgwMDAwMDQwOEwsIDB4MDgwMDA0MDhMLCAweDAwMDIwMDAwTCwgMHgwODAyMDAwMEwsCisgICAgIDB4MDAwMjAwMDhMLCAweDA4MDIwMDA4TCwgMHgwMDAyMDQwMEwsIDB4MDgwMjA0MDBMLCAweDAwMDIwNDA4TCwKKyAgICAgMHgwODAyMDQwOEwsIDB4MDAwMDAwMDFMLCAweDA4MDAwMDAxTCwgMHgwMDAwMDAwOUwsIDB4MDgwMDAwMDlMLAorICAgICAweDAwMDAwNDAxTCwgMHgwODAwMDQwMUwsIDB4MDAwMDA0MDlMLCAweDA4MDAwNDA5TCwgMHgwMDAyMDAwMUwsCisgICAgIDB4MDgwMjAwMDFMLCAweDAwMDIwMDA5TCwgMHgwODAyMDAwOUwsIDB4MDAwMjA0MDFMLCAweDA4MDIwNDAxTCwKKyAgICAgMHgwMDAyMDQwOUwsIDB4MDgwMjA0MDlMLCAweDAyMDAwMDAwTCwgMHgwQTAwMDAwMEwsIDB4MDIwMDAwMDhMLAorICAgICAweDBBMDAwMDA4TCwgMHgwMjAwMDQwMEwsIDB4MEEwMDA0MDBMLCAweDAyMDAwNDA4TCwgMHgwQTAwMDQwOEwsCisgICAgIDB4MDIwMjAwMDBMLCAweDBBMDIwMDAwTCwgMHgwMjAyMDAwOEwsIDB4MEEwMjAwMDhMLCAweDAyMDIwNDAwTCwKKyAgICAgMHgwQTAyMDQwMEwsIDB4MDIwMjA0MDhMLCAweDBBMDIwNDA4TCwgMHgwMjAwMDAwMUwsIDB4MEEwMDAwMDFMLAorICAgICAweDAyMDAwMDA5TCwgMHgwQTAwMDAwOUwsIDB4MDIwMDA0MDFMLCAweDBBMDAwNDAxTCwgMHgwMjAwMDQwOUwsCisgICAgIDB4MEEwMDA0MDlMLCAweDAyMDIwMDAxTCwgMHgwQTAyMDAwMUwsIDB4MDIwMjAwMDlMLCAweDBBMDIwMDA5TCwKKyAgICAgMHgwMjAyMDQwMUwsIDB4MEEwMjA0MDFMLCAweDAyMDIwNDA5TCwgMHgwQTAyMDQwOUwsIH0sCisgICAgey8qIGZvciBEIGJpdHMgKG51bWJlcmVkIGFzIHBlciBGSVBTIDQ2KSAxNiAxNyAxOCAxOSAyMCAyMSAqLworICAgICAweDAwMDAwMDAwTCwgMHgwMDAwMDEwMEwsIDB4MDAwODAwMDBMLCAweDAwMDgwMTAwTCwgMHgwMTAwMDAwMEwsCisgICAgIDB4MDEwMDAxMDBMLCAweDAxMDgwMDAwTCwgMHgwMTA4MDEwMEwsIDB4MDAwMDAwMTBMLCAweDAwMDAwMTEwTCwKKyAgICAgMHgwMDA4MDAxMEwsIDB4MDAwODAxMTBMLCAweDAxMDAwMDEwTCwgMHgwMTAwMDExMEwsIDB4MDEwODAwMTBMLAorICAgICAweDAxMDgwMTEwTCwgMHgwMDIwMDAwMEwsIDB4MDAyMDAxMDBMLCAweDAwMjgwMDAwTCwgMHgwMDI4MDEwMEwsCisgICAgIDB4MDEyMDAwMDBMLCAweDAxMjAwMTAwTCwgMHgwMTI4MDAwMEwsIDB4MDEyODAxMDBMLCAweDAwMjAwMDEwTCwKKyAgICAgMHgwMDIwMDExMEwsIDB4MDAyODAwMTBMLCAweDAwMjgwMTEwTCwgMHgwMTIwMDAxMEwsIDB4MDEyMDAxMTBMLAorICAgICAweDAxMjgwMDEwTCwgMHgwMTI4MDExMEwsIDB4MDAwMDAyMDBMLCAweDAwMDAwMzAwTCwgMHgwMDA4MDIwMEwsCisgICAgIDB4MDAwODAzMDBMLCAweDAxMDAwMjAwTCwgMHgwMTAwMDMwMEwsIDB4MDEwODAyMDBMLCAweDAxMDgwMzAwTCwKKyAgICAgMHgwMDAwMDIxMEwsIDB4MDAwMDAzMTBMLCAweDAwMDgwMjEwTCwgMHgwMDA4MDMxMEwsIDB4MDEwMDAyMTBMLAorICAgICAweDAxMDAwMzEwTCwgMHgwMTA4MDIxMEwsIDB4MDEwODAzMTBMLCAweDAwMjAwMjAwTCwgMHgwMDIwMDMwMEwsCisgICAgIDB4MDAyODAyMDBMLCAweDAwMjgwMzAwTCwgMHgwMTIwMDIwMEwsIDB4MDEyMDAzMDBMLCAweDAxMjgwMjAwTCwKKyAgICAgMHgwMTI4MDMwMEwsIDB4MDAyMDAyMTBMLCAweDAwMjAwMzEwTCwgMHgwMDI4MDIxMEwsIDB4MDAyODAzMTBMLAorICAgICAweDAxMjAwMjEwTCwgMHgwMTIwMDMxMEwsIDB4MDEyODAyMTBMLCAweDAxMjgwMzEwTCwgfSwKKyAgICB7LyogZm9yIEQgYml0cyAobnVtYmVyZWQgYXMgcGVyIEZJUFMgNDYpIDIyIDIzIDI0IDI1IDI3IDI4ICovCisgICAgIDB4MDAwMDAwMDBMLCAweDA0MDAwMDAwTCwgMHgwMDA0MDAwMEwsIDB4MDQwNDAwMDBMLCAweDAwMDAwMDAyTCwKKyAgICAgMHgwNDAwMDAwMkwsIDB4MDAwNDAwMDJMLCAweDA0MDQwMDAyTCwgMHgwMDAwMjAwMEwsIDB4MDQwMDIwMDBMLAorICAgICAweDAwMDQyMDAwTCwgMHgwNDA0MjAwMEwsIDB4MDAwMDIwMDJMLCAweDA0MDAyMDAyTCwgMHgwMDA0MjAwMkwsCisgICAgIDB4MDQwNDIwMDJMLCAweDAwMDAwMDIwTCwgMHgwNDAwMDAyMEwsIDB4MDAwNDAwMjBMLCAweDA0MDQwMDIwTCwKKyAgICAgMHgwMDAwMDAyMkwsIDB4MDQwMDAwMjJMLCAweDAwMDQwMDIyTCwgMHgwNDA0MDAyMkwsIDB4MDAwMDIwMjBMLAorICAgICAweDA0MDAyMDIwTCwgMHgwMDA0MjAyMEwsIDB4MDQwNDIwMjBMLCAweDAwMDAyMDIyTCwgMHgwNDAwMjAyMkwsCisgICAgIDB4MDAwNDIwMjJMLCAweDA0MDQyMDIyTCwgMHgwMDAwMDgwMEwsIDB4MDQwMDA4MDBMLCAweDAwMDQwODAwTCwKKyAgICAgMHgwNDA0MDgwMEwsIDB4MDAwMDA4MDJMLCAweDA0MDAwODAyTCwgMHgwMDA0MDgwMkwsIDB4MDQwNDA4MDJMLAorICAgICAweDAwMDAyODAwTCwgMHgwNDAwMjgwMEwsIDB4MDAwNDI4MDBMLCAweDA0MDQyODAwTCwgMHgwMDAwMjgwMkwsCisgICAgIDB4MDQwMDI4MDJMLCAweDAwMDQyODAyTCwgMHgwNDA0MjgwMkwsIDB4MDAwMDA4MjBMLCAweDA0MDAwODIwTCwKKyAgICAgMHgwMDA0MDgyMEwsIDB4MDQwNDA4MjBMLCAweDAwMDAwODIyTCwgMHgwNDAwMDgyMkwsIDB4MDAwNDA4MjJMLAorICAgICAweDA0MDQwODIyTCwgMHgwMDAwMjgyMEwsIDB4MDQwMDI4MjBMLCAweDAwMDQyODIwTCwgMHgwNDA0MjgyMEwsCisgICAgIDB4MDAwMDI4MjJMLCAweDA0MDAyODIyTCwgMHgwMDA0MjgyMkwsIDB4MDQwNDI4MjJMLCB9fTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IERFU19TUHRyYW5zWzhdWzY0XSA9IHsKKyAgICB7LyogbmliYmxlIDAgKi8KKyAgICAgMHgwMjA4MDgwMEwsIDB4MDAwODAwMDBMLCAweDAyMDAwMDAyTCwgMHgwMjA4MDgwMkwsIDB4MDIwMDAwMDBMLAorICAgICAweDAwMDgwODAyTCwgMHgwMDA4MDAwMkwsIDB4MDIwMDAwMDJMLCAweDAwMDgwODAyTCwgMHgwMjA4MDgwMEwsCisgICAgIDB4MDIwODAwMDBMLCAweDAwMDAwODAyTCwgMHgwMjAwMDgwMkwsIDB4MDIwMDAwMDBMLCAweDAwMDAwMDAwTCwKKyAgICAgMHgwMDA4MDAwMkwsIDB4MDAwODAwMDBMLCAweDAwMDAwMDAyTCwgMHgwMjAwMDgwMEwsIDB4MDAwODA4MDBMLAorICAgICAweDAyMDgwODAyTCwgMHgwMjA4MDAwMEwsIDB4MDAwMDA4MDJMLCAweDAyMDAwODAwTCwgMHgwMDAwMDAwMkwsCisgICAgIDB4MDAwMDA4MDBMLCAweDAwMDgwODAwTCwgMHgwMjA4MDAwMkwsIDB4MDAwMDA4MDBMLCAweDAyMDAwODAyTCwKKyAgICAgMHgwMjA4MDAwMkwsIDB4MDAwMDAwMDBMLCAweDAwMDAwMDAwTCwgMHgwMjA4MDgwMkwsIDB4MDIwMDA4MDBMLAorICAgICAweDAwMDgwMDAyTCwgMHgwMjA4MDgwMEwsIDB4MDAwODAwMDBMLCAweDAwMDAwODAyTCwgMHgwMjAwMDgwMEwsCisgICAgIDB4MDIwODAwMDJMLCAweDAwMDAwODAwTCwgMHgwMDA4MDgwMEwsIDB4MDIwMDAwMDJMLCAweDAwMDgwODAyTCwKKyAgICAgMHgwMDAwMDAwMkwsIDB4MDIwMDAwMDJMLCAweDAyMDgwMDAwTCwgMHgwMjA4MDgwMkwsIDB4MDAwODA4MDBMLAorICAgICAweDAyMDgwMDAwTCwgMHgwMjAwMDgwMkwsIDB4MDIwMDAwMDBMLCAweDAwMDAwODAyTCwgMHgwMDA4MDAwMkwsCisgICAgIDB4MDAwMDAwMDBMLCAweDAwMDgwMDAwTCwgMHgwMjAwMDAwMEwsIDB4MDIwMDA4MDJMLCAweDAyMDgwODAwTCwKKyAgICAgMHgwMDAwMDAwMkwsIDB4MDIwODAwMDJMLCAweDAwMDAwODAwTCwgMHgwMDA4MDgwMkwsIH0sCisgICAgey8qIG5pYmJsZSAxICovCisgICAgIDB4NDAxMDgwMTBMLCAweDAwMDAwMDAwTCwgMHgwMDEwODAwMEwsIDB4NDAxMDAwMDBMLCAweDQwMDAwMDEwTCwKKyAgICAgMHgwMDAwODAxMEwsIDB4NDAwMDgwMDBMLCAweDAwMTA4MDAwTCwgMHgwMDAwODAwMEwsIDB4NDAxMDAwMTBMLAorICAgICAweDAwMDAwMDEwTCwgMHg0MDAwODAwMEwsIDB4MDAxMDAwMTBMLCAweDQwMTA4MDAwTCwgMHg0MDEwMDAwMEwsCisgICAgIDB4MDAwMDAwMTBMLCAweDAwMTAwMDAwTCwgMHg0MDAwODAxMEwsIDB4NDAxMDAwMTBMLCAweDAwMDA4MDAwTCwKKyAgICAgMHgwMDEwODAxMEwsIDB4NDAwMDAwMDBMLCAweDAwMDAwMDAwTCwgMHgwMDEwMDAxMEwsIDB4NDAwMDgwMTBMLAorICAgICAweDAwMTA4MDEwTCwgMHg0MDEwODAwMEwsIDB4NDAwMDAwMTBMLCAweDQwMDAwMDAwTCwgMHgwMDEwMDAwMEwsCisgICAgIDB4MDAwMDgwMTBMLCAweDQwMTA4MDEwTCwgMHgwMDEwMDAxMEwsIDB4NDAxMDgwMDBMLCAweDQwMDA4MDAwTCwKKyAgICAgMHgwMDEwODAxMEwsIDB4NDAxMDgwMTBMLCAweDAwMTAwMDEwTCwgMHg0MDAwMDAxMEwsIDB4MDAwMDAwMDBMLAorICAgICAweDQwMDAwMDAwTCwgMHgwMDAwODAxMEwsIDB4MDAxMDAwMDBMLCAweDQwMTAwMDEwTCwgMHgwMDAwODAwMEwsCisgICAgIDB4NDAwMDAwMDBMLCAweDAwMTA4MDEwTCwgMHg0MDAwODAxMEwsIDB4NDAxMDgwMDBMLCAweDAwMDA4MDAwTCwKKyAgICAgMHgwMDAwMDAwMEwsIDB4NDAwMDAwMTBMLCAweDAwMDAwMDEwTCwgMHg0MDEwODAxMEwsIDB4MDAxMDgwMDBMLAorICAgICAweDQwMTAwMDAwTCwgMHg0MDEwMDAxMEwsIDB4MDAxMDAwMDBMLCAweDAwMDA4MDEwTCwgMHg0MDAwODAwMEwsCisgICAgIDB4NDAwMDgwMTBMLCAweDAwMDAwMDEwTCwgMHg0MDEwMDAwMEwsIDB4MDAxMDgwMDBMLCB9LAorICAgIHsvKiBuaWJibGUgMiAqLworICAgICAweDA0MDAwMDAxTCwgMHgwNDA0MDEwMEwsIDB4MDAwMDAxMDBMLCAweDA0MDAwMTAxTCwgMHgwMDA0MDAwMUwsCisgICAgIDB4MDQwMDAwMDBMLCAweDA0MDAwMTAxTCwgMHgwMDA0MDEwMEwsIDB4MDQwMDAxMDBMLCAweDAwMDQwMDAwTCwKKyAgICAgMHgwNDA0MDAwMEwsIDB4MDAwMDAwMDFMLCAweDA0MDQwMTAxTCwgMHgwMDAwMDEwMUwsIDB4MDAwMDAwMDFMLAorICAgICAweDA0MDQwMDAxTCwgMHgwMDAwMDAwMEwsIDB4MDAwNDAwMDFMLCAweDA0MDQwMTAwTCwgMHgwMDAwMDEwMEwsCisgICAgIDB4MDAwMDAxMDFMLCAweDA0MDQwMTAxTCwgMHgwMDA0MDAwMEwsIDB4MDQwMDAwMDFMLCAweDA0MDQwMDAxTCwKKyAgICAgMHgwNDAwMDEwMEwsIDB4MDAwNDAxMDFMLCAweDA0MDQwMDAwTCwgMHgwMDA0MDEwMEwsIDB4MDAwMDAwMDBMLAorICAgICAweDA0MDAwMDAwTCwgMHgwMDA0MDEwMUwsIDB4MDQwNDAxMDBMLCAweDAwMDAwMTAwTCwgMHgwMDAwMDAwMUwsCisgICAgIDB4MDAwNDAwMDBMLCAweDAwMDAwMTAxTCwgMHgwMDA0MDAwMUwsIDB4MDQwNDAwMDBMLCAweDA0MDAwMTAxTCwKKyAgICAgMHgwMDAwMDAwMEwsIDB4MDQwNDAxMDBMLCAweDAwMDQwMTAwTCwgMHgwNDA0MDAwMUwsIDB4MDAwNDAwMDFMLAorICAgICAweDA0MDAwMDAwTCwgMHgwNDA0MDEwMUwsIDB4MDAwMDAwMDFMLCAweDAwMDQwMTAxTCwgMHgwNDAwMDAwMUwsCisgICAgIDB4MDQwMDAwMDBMLCAweDA0MDQwMTAxTCwgMHgwMDA0MDAwMEwsIDB4MDQwMDAxMDBMLCAweDA0MDAwMTAxTCwKKyAgICAgMHgwMDA0MDEwMEwsIDB4MDQwMDAxMDBMLCAweDAwMDAwMDAwTCwgMHgwNDA0MDAwMUwsIDB4MDAwMDAxMDFMLAorICAgICAweDA0MDAwMDAxTCwgMHgwMDA0MDEwMUwsIDB4MDAwMDAxMDBMLCAweDA0MDQwMDAwTCwgfSwKKyAgICB7LyogbmliYmxlIDMgKi8KKyAgICAgMHgwMDQwMTAwOEwsIDB4MTAwMDEwMDBMLCAweDAwMDAwMDA4TCwgMHgxMDQwMTAwOEwsIDB4MDAwMDAwMDBMLAorICAgICAweDEwNDAwMDAwTCwgMHgxMDAwMTAwOEwsIDB4MDA0MDAwMDhMLCAweDEwNDAxMDAwTCwgMHgxMDAwMDAwOEwsCisgICAgIDB4MTAwMDAwMDBMLCAweDAwMDAxMDA4TCwgMHgxMDAwMDAwOEwsIDB4MDA0MDEwMDhMLCAweDAwNDAwMDAwTCwKKyAgICAgMHgxMDAwMDAwMEwsIDB4MTA0MDAwMDhMLCAweDAwNDAxMDAwTCwgMHgwMDAwMTAwMEwsIDB4MDAwMDAwMDhMLAorICAgICAweDAwNDAxMDAwTCwgMHgxMDAwMTAwOEwsIDB4MTA0MDAwMDBMLCAweDAwMDAxMDAwTCwgMHgwMDAwMTAwOEwsCisgICAgIDB4MDAwMDAwMDBMLCAweDAwNDAwMDA4TCwgMHgxMDQwMTAwMEwsIDB4MTAwMDEwMDBMLCAweDEwNDAwMDA4TCwKKyAgICAgMHgxMDQwMTAwOEwsIDB4MDA0MDAwMDBMLCAweDEwNDAwMDA4TCwgMHgwMDAwMTAwOEwsIDB4MDA0MDAwMDBMLAorICAgICAweDEwMDAwMDA4TCwgMHgwMDQwMTAwMEwsIDB4MTAwMDEwMDBMLCAweDAwMDAwMDA4TCwgMHgxMDQwMDAwMEwsCisgICAgIDB4MTAwMDEwMDhMLCAweDAwMDAwMDAwTCwgMHgwMDAwMTAwMEwsIDB4MDA0MDAwMDhMLCAweDAwMDAwMDAwTCwKKyAgICAgMHgxMDQwMDAwOEwsIDB4MTA0MDEwMDBMLCAweDAwMDAxMDAwTCwgMHgxMDAwMDAwMEwsIDB4MTA0MDEwMDhMLAorICAgICAweDAwNDAxMDA4TCwgMHgwMDQwMDAwMEwsIDB4MTA0MDEwMDhMLCAweDAwMDAwMDA4TCwgMHgxMDAwMTAwMEwsCisgICAgIDB4MDA0MDEwMDhMLCAweDAwNDAwMDA4TCwgMHgwMDQwMTAwMEwsIDB4MTA0MDAwMDBMLCAweDEwMDAxMDA4TCwKKyAgICAgMHgwMDAwMTAwOEwsIDB4MTAwMDAwMDBMLCAweDEwMDAwMDA4TCwgMHgxMDQwMTAwMEwsIH0sCisgICAgey8qIG5pYmJsZSA0ICovCisgICAgIDB4MDgwMDAwMDBMLCAweDAwMDEwMDAwTCwgMHgwMDAwMDQwMEwsIDB4MDgwMTA0MjBMLCAweDA4MDEwMDIwTCwKKyAgICAgMHgwODAwMDQwMEwsIDB4MDAwMTA0MjBMLCAweDA4MDEwMDAwTCwgMHgwMDAxMDAwMEwsIDB4MDAwMDAwMjBMLAorICAgICAweDA4MDAwMDIwTCwgMHgwMDAxMDQwMEwsIDB4MDgwMDA0MjBMLCAweDA4MDEwMDIwTCwgMHgwODAxMDQwMEwsCisgICAgIDB4MDAwMDAwMDBMLCAweDAwMDEwNDAwTCwgMHgwODAwMDAwMEwsIDB4MDAwMTAwMjBMLCAweDAwMDAwNDIwTCwKKyAgICAgMHgwODAwMDQwMEwsIDB4MDAwMTA0MjBMLCAweDAwMDAwMDAwTCwgMHgwODAwMDAyMEwsIDB4MDAwMDAwMjBMLAorICAgICAweDA4MDAwNDIwTCwgMHgwODAxMDQyMEwsIDB4MDAwMTAwMjBMLCAweDA4MDEwMDAwTCwgMHgwMDAwMDQwMEwsCisgICAgIDB4MDAwMDA0MjBMLCAweDA4MDEwNDAwTCwgMHgwODAxMDQwMEwsIDB4MDgwMDA0MjBMLCAweDAwMDEwMDIwTCwKKyAgICAgMHgwODAxMDAwMEwsIDB4MDAwMTAwMDBMLCAweDAwMDAwMDIwTCwgMHgwODAwMDAyMEwsIDB4MDgwMDA0MDBMLAorICAgICAweDA4MDAwMDAwTCwgMHgwMDAxMDQwMEwsIDB4MDgwMTA0MjBMLCAweDAwMDAwMDAwTCwgMHgwMDAxMDQyMEwsCisgICAgIDB4MDgwMDAwMDBMLCAweDAwMDAwNDAwTCwgMHgwMDAxMDAyMEwsIDB4MDgwMDA0MjBMLCAweDAwMDAwNDAwTCwKKyAgICAgMHgwMDAwMDAwMEwsIDB4MDgwMTA0MjBMLCAweDA4MDEwMDIwTCwgMHgwODAxMDQwMEwsIDB4MDAwMDA0MjBMLAorICAgICAweDAwMDEwMDAwTCwgMHgwMDAxMDQwMEwsIDB4MDgwMTAwMjBMLCAweDA4MDAwNDAwTCwgMHgwMDAwMDQyMEwsCisgICAgIDB4MDAwMDAwMjBMLCAweDAwMDEwNDIwTCwgMHgwODAxMDAwMEwsIDB4MDgwMDAwMjBMLCB9LAorICAgIHsvKiBuaWJibGUgNSAqLworICAgICAweDgwMDAwMDQwTCwgMHgwMDIwMDA0MEwsIDB4MDAwMDAwMDBMLCAweDgwMjAyMDAwTCwgMHgwMDIwMDA0MEwsCisgICAgIDB4MDAwMDIwMDBMLCAweDgwMDAyMDQwTCwgMHgwMDIwMDAwMEwsIDB4MDAwMDIwNDBMLCAweDgwMjAyMDQwTCwKKyAgICAgMHgwMDIwMjAwMEwsIDB4ODAwMDAwMDBMLCAweDgwMDAyMDAwTCwgMHg4MDAwMDA0MEwsIDB4ODAyMDAwMDBMLAorICAgICAweDAwMjAyMDQwTCwgMHgwMDIwMDAwMEwsIDB4ODAwMDIwNDBMLCAweDgwMjAwMDQwTCwgMHgwMDAwMDAwMEwsCisgICAgIDB4MDAwMDIwMDBMLCAweDAwMDAwMDQwTCwgMHg4MDIwMjAwMEwsIDB4ODAyMDAwNDBMLCAweDgwMjAyMDQwTCwKKyAgICAgMHg4MDIwMDAwMEwsIDB4ODAwMDAwMDBMLCAweDAwMDAyMDQwTCwgMHgwMDAwMDA0MEwsIDB4MDAyMDIwMDBMLAorICAgICAweDAwMjAyMDQwTCwgMHg4MDAwMjAwMEwsIDB4MDAwMDIwNDBMLCAweDgwMDAwMDAwTCwgMHg4MDAwMjAwMEwsCisgICAgIDB4MDAyMDIwNDBMLCAweDgwMjAyMDAwTCwgMHgwMDIwMDA0MEwsIDB4MDAwMDAwMDBMLCAweDgwMDAyMDAwTCwKKyAgICAgMHg4MDAwMDAwMEwsIDB4MDAwMDIwMDBMLCAweDgwMjAwMDQwTCwgMHgwMDIwMDAwMEwsIDB4MDAyMDAwNDBMLAorICAgICAweDgwMjAyMDQwTCwgMHgwMDIwMjAwMEwsIDB4MDAwMDAwNDBMLCAweDgwMjAyMDQwTCwgMHgwMDIwMjAwMEwsCisgICAgIDB4MDAyMDAwMDBMLCAweDgwMDAyMDQwTCwgMHg4MDAwMDA0MEwsIDB4ODAyMDAwMDBMLCAweDAwMjAyMDQwTCwKKyAgICAgMHgwMDAwMDAwMEwsIDB4MDAwMDIwMDBMLCAweDgwMDAwMDQwTCwgMHg4MDAwMjA0MEwsIDB4ODAyMDIwMDBMLAorICAgICAweDgwMjAwMDAwTCwgMHgwMDAwMjA0MEwsIDB4MDAwMDAwNDBMLCAweDgwMjAwMDQwTCwgfSwKKyAgICB7LyogbmliYmxlIDYgKi8KKyAgICAgMHgwMDAwNDAwMEwsIDB4MDAwMDAyMDBMLCAweDAxMDAwMjAwTCwgMHgwMTAwMDAwNEwsIDB4MDEwMDQyMDRMLAorICAgICAweDAwMDA0MDA0TCwgMHgwMDAwNDIwMEwsIDB4MDAwMDAwMDBMLCAweDAxMDAwMDAwTCwgMHgwMTAwMDIwNEwsCisgICAgIDB4MDAwMDAyMDRMLCAweDAxMDA0MDAwTCwgMHgwMDAwMDAwNEwsIDB4MDEwMDQyMDBMLCAweDAxMDA0MDAwTCwKKyAgICAgMHgwMDAwMDIwNEwsIDB4MDEwMDAyMDRMLCAweDAwMDA0MDAwTCwgMHgwMDAwNDAwNEwsIDB4MDEwMDQyMDRMLAorICAgICAweDAwMDAwMDAwTCwgMHgwMTAwMDIwMEwsIDB4MDEwMDAwMDRMLCAweDAwMDA0MjAwTCwgMHgwMTAwNDAwNEwsCisgICAgIDB4MDAwMDQyMDRMLCAweDAxMDA0MjAwTCwgMHgwMDAwMDAwNEwsIDB4MDAwMDQyMDRMLCAweDAxMDA0MDA0TCwKKyAgICAgMHgwMDAwMDIwMEwsIDB4MDEwMDAwMDBMLCAweDAwMDA0MjA0TCwgMHgwMTAwNDAwMEwsIDB4MDEwMDQwMDRMLAorICAgICAweDAwMDAwMjA0TCwgMHgwMDAwNDAwMEwsIDB4MDAwMDAyMDBMLCAweDAxMDAwMDAwTCwgMHgwMTAwNDAwNEwsCisgICAgIDB4MDEwMDAyMDRMLCAweDAwMDA0MjA0TCwgMHgwMDAwNDIwMEwsIDB4MDAwMDAwMDBMLCAweDAwMDAwMjAwTCwKKyAgICAgMHgwMTAwMDAwNEwsIDB4MDAwMDAwMDRMLCAweDAxMDAwMjAwTCwgMHgwMDAwMDAwMEwsIDB4MDEwMDAyMDRMLAorICAgICAweDAxMDAwMjAwTCwgMHgwMDAwNDIwMEwsIDB4MDAwMDAyMDRMLCAweDAwMDA0MDAwTCwgMHgwMTAwNDIwNEwsCisgICAgIDB4MDEwMDAwMDBMLCAweDAxMDA0MjAwTCwgMHgwMDAwMDAwNEwsIDB4MDAwMDQwMDRMLCAweDAxMDA0MjA0TCwKKyAgICAgMHgwMTAwMDAwNEwsIDB4MDEwMDQyMDBMLCAweDAxMDA0MDAwTCwgMHgwMDAwNDAwNEwsIH0sCisgICAgey8qIG5pYmJsZSA3ICovCisgICAgIDB4MjA4MDAwODBMLCAweDIwODIwMDAwTCwgMHgwMDAyMDA4MEwsIDB4MDAwMDAwMDBMLCAweDIwMDIwMDAwTCwKKyAgICAgMHgwMDgwMDA4MEwsIDB4MjA4MDAwMDBMLCAweDIwODIwMDgwTCwgMHgwMDAwMDA4MEwsIDB4MjAwMDAwMDBMLAorICAgICAweDAwODIwMDAwTCwgMHgwMDAyMDA4MEwsIDB4MDA4MjAwODBMLCAweDIwMDIwMDgwTCwgMHgyMDAwMDA4MEwsCisgICAgIDB4MjA4MDAwMDBMLCAweDAwMDIwMDAwTCwgMHgwMDgyMDA4MEwsIDB4MDA4MDAwODBMLCAweDIwMDIwMDAwTCwKKyAgICAgMHgyMDgyMDA4MEwsIDB4MjAwMDAwODBMLCAweDAwMDAwMDAwTCwgMHgwMDgyMDAwMEwsIDB4MjAwMDAwMDBMLAorICAgICAweDAwODAwMDAwTCwgMHgyMDAyMDA4MEwsIDB4MjA4MDAwODBMLCAweDAwODAwMDAwTCwgMHgwMDAyMDAwMEwsCisgICAgIDB4MjA4MjAwMDBMLCAweDAwMDAwMDgwTCwgMHgwMDgwMDAwMEwsIDB4MDAwMjAwMDBMLCAweDIwMDAwMDgwTCwKKyAgICAgMHgyMDgyMDA4MEwsIDB4MDAwMjAwODBMLCAweDIwMDAwMDAwTCwgMHgwMDAwMDAwMEwsIDB4MDA4MjAwMDBMLAorICAgICAweDIwODAwMDgwTCwgMHgyMDAyMDA4MEwsIDB4MjAwMjAwMDBMLCAweDAwODAwMDgwTCwgMHgyMDgyMDAwMEwsCisgICAgIDB4MDAwMDAwODBMLCAweDAwODAwMDgwTCwgMHgyMDAyMDAwMEwsIDB4MjA4MjAwODBMLCAweDAwODAwMDAwTCwKKyAgICAgMHgyMDgwMDAwMEwsIDB4MjAwMDAwODBMLCAweDAwODIwMDAwTCwgMHgwMDAyMDA4MEwsIDB4MjAwMjAwODBMLAorICAgICAweDIwODAwMDAwTCwgMHgwMDAwMDA4MEwsIDB4MjA4MjAwMDBMLCAweDAwODIwMDgwTCwgMHgwMDAwMDAwMEwsCisgICAgIDB4MjAwMDAwMDBMLCAweDIwODAwMDgwTCwgMHgwMDAyMDAwMEwsIDB4MDA4MjAwODBMLCB9fTsKKworI2RlZmluZSBIUEVSTV9PUChhLCB0LCBuLCBtKSAgICAgICAgICAgICAgICAgIFwKKyAgKCh0KSA9ICgoKChhKSA8PCAoMTYgLSAobikpKSBeIChhKSkgJiAobSkpLCBcCisgICAoYSkgPSAoYSkgXiAodCkgXiAodCA+PiAoMTYgLSAobikpKSkKKwordm9pZCBERVNfc2V0X2tleShjb25zdCBERVNfY2Jsb2NrICprZXksIERFU19rZXlfc2NoZWR1bGUgKnNjaGVkdWxlKSB7CisgIHN0YXRpYyBjb25zdCBpbnQgc2hpZnRzMlsxNl0gPSB7MCwgMCwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCAxLCAxLCAxLCAxLCAxLCAwfTsKKyAgdWludDMyX3QgYywgZCwgdCwgcywgdDI7CisgIGNvbnN0IHVpbnQ4X3QgKmluOworICB1aW50MzJfdCAqazsKKyAgaW50IGk7CisKKyAgayA9ICZzY2hlZHVsZS0+a3MtPmRlc2xvbmdbMF07CisgIGluID0ga2V5LT5ieXRlczsKKworICBjMmwoaW4sIGMpOworICBjMmwoaW4sIGQpOworCisgIC8qIGRvIFBDMSBpbiA0NyBzaW1wbGUgb3BlcmF0aW9ucyA6LSkKKyAgICogVGhhbmtzIHRvIEpvaG4gRmxldGNoZXIgKGpvaG5fZmxldGNoZXJAbGNjbWFpbC5vY2YubGxubC5nb3YpCisgICAqIGZvciB0aGUgaW5zcGlyYXRpb24uIDotKSAqLworICBQRVJNX09QKGQsIGMsIHQsIDQsIDB4MGYwZjBmMGZMKTsKKyAgSFBFUk1fT1AoYywgdCwgLTIsIDB4Y2NjYzAwMDBMKTsKKyAgSFBFUk1fT1AoZCwgdCwgLTIsIDB4Y2NjYzAwMDBMKTsKKyAgUEVSTV9PUChkLCBjLCB0LCAxLCAweDU1NTU1NTU1TCk7CisgIFBFUk1fT1AoYywgZCwgdCwgOCwgMHgwMGZmMDBmZkwpOworICBQRVJNX09QKGQsIGMsIHQsIDEsIDB4NTU1NTU1NTVMKTsKKyAgZCA9ICgoKGQgJiAweDAwMDAwMGZmTCkgPDwgMTZMKSB8IChkICYgMHgwMDAwZmYwMEwpIHwKKyAgICAgICAoKGQgJiAweDAwZmYwMDAwTCkgPj4gMTZMKSB8ICgoYyAmIDB4ZjAwMDAwMDBMKSA+PiA0TCkpOworICBjICY9IDB4MGZmZmZmZmZMOworCisgIGZvciAoaSA9IDA7IGkgPCBJVEVSQVRJT05TOyBpKyspIHsKKyAgICBpZiAoc2hpZnRzMltpXSkgeworICAgICAgYyA9ICgoYyA+PiAyTCkgfCAoYyA8PCAyNkwpKTsKKyAgICAgIGQgPSAoKGQgPj4gMkwpIHwgKGQgPDwgMjZMKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGMgPSAoKGMgPj4gMUwpIHwgKGMgPDwgMjdMKSk7CisgICAgICBkID0gKChkID4+IDFMKSB8IChkIDw8IDI3TCkpOworICAgIH0KKyAgICBjICY9IDB4MGZmZmZmZmZMOworICAgIGQgJj0gMHgwZmZmZmZmZkw7CisgICAgLyogY291bGQgYmUgYSBmZXcgbGVzcyBzaGlmdHMgYnV0IEkgYW0gdG8gbGF6eSBhdCB0aGlzCisgICAgICogcG9pbnQgaW4gdGltZSB0byBpbnZlc3RpZ2F0ZSAqLworICAgIHMgPSBkZXNfc2tiWzBdWyhjKSAmIDB4M2ZdIHwKKyAgICAgICAgZGVzX3NrYlsxXVsoKGMgPj4gNkwpICYgMHgwMykgfCAoKGMgPj4gN0wpICYgMHgzYyldIHwKKyAgICAgICAgZGVzX3NrYlsyXVsoKGMgPj4gMTNMKSAmIDB4MGYpIHwgKChjID4+IDE0TCkgJiAweDMwKV0gfAorICAgICAgICBkZXNfc2tiWzNdWygoYyA+PiAyMEwpICYgMHgwMSkgfCAoKGMgPj4gMjFMKSAmIDB4MDYpIHwKKyAgICAgICAgICAgICAgICAgICAoKGMgPj4gMjJMKSAmIDB4MzgpXTsKKyAgICB0ID0gZGVzX3NrYls0XVsoZCkgJiAweDNmXSB8CisgICAgICAgIGRlc19za2JbNV1bKChkID4+IDdMKSAmIDB4MDMpIHwgKChkID4+IDhMKSAmIDB4M2MpXSB8CisgICAgICAgIGRlc19za2JbNl1bKGQgPj4gMTVMKSAmIDB4M2ZdIHwKKyAgICAgICAgZGVzX3NrYls3XVsoKGQgPj4gMjFMKSAmIDB4MGYpIHwgKChkID4+IDIyTCkgJiAweDMwKV07CisKKyAgICAvKiB0YWJsZSBjb250YWluZWQgMDIxMyA0NjU3ICovCisgICAgdDIgPSAoKHQgPDwgMTZMKSB8IChzICYgMHgwMDAwZmZmZkwpKSAmIDB4ZmZmZmZmZmZMOworICAgICooaysrKSA9IFJPVEFURSh0MiwgMzApICYgMHhmZmZmZmZmZkw7CisKKyAgICB0MiA9ICgocyA+PiAxNkwpIHwgKHQgJiAweGZmZmYwMDAwTCkpOworICAgICooaysrKSA9IFJPVEFURSh0MiwgMjYpICYgMHhmZmZmZmZmZkw7CisgIH0KK30KKworc3RhdGljIHZvaWQgREVTX2VuY3J5cHQxKHVpbnQzMl90ICpkYXRhLCBjb25zdCBERVNfa2V5X3NjaGVkdWxlICprcywgaW50IGVuYykgeworICB1aW50MzJfdCBsLCByLCB0LCB1OworICBjb25zdCB1aW50MzJfdCAqczsKKworICByID0gZGF0YVswXTsKKyAgbCA9IGRhdGFbMV07CisKKyAgSVAociwgbCk7CisgIC8qIFRoaW5ncyBoYXZlIGJlZW4gbW9kaWZpZWQgc28gdGhhdCB0aGUgaW5pdGlhbCByb3RhdGUgaXMgZG9uZSBvdXRzaWRlCisgICAqIHRoZSBsb29wLiAgVGhpcyByZXF1aXJlZCB0aGUgREVTX1NQdHJhbnMgdmFsdWVzIGluIHNwLmggdG8gYmUKKyAgICogcm90YXRlZCAxIGJpdCB0byB0aGUgcmlnaHQuIE9uZSBwZXJsIHNjcmlwdCBsYXRlciBhbmQgdGhpbmdzIGhhdmUgYQorICAgKiA1JSBzcGVlZCB1cCBvbiBhIHNwYXJjMi4gVGhhbmtzIHRvIFJpY2hhcmQgT3V0ZXJicmlkZ2UKKyAgICogPDcxNzU1LjIwNEBDb21wdVNlcnZlLkNPTT4gZm9yIHBvaW50aW5nIHRoaXMgb3V0LiAqLworICAvKiBjbGVhciB0aGUgdG9wIGJpdHMgb24gbWFjaGluZXMgd2l0aCA4Ynl0ZSBsb25ncyAqLworICAvKiBzaGlmdCBsZWZ0IGJ5IDIgKi8KKyAgciA9IFJPVEFURShyLCAyOSkgJiAweGZmZmZmZmZmTDsKKyAgbCA9IFJPVEFURShsLCAyOSkgJiAweGZmZmZmZmZmTDsKKworICBzID0ga3MtPmtzLT5kZXNsb25nOworICAvKiBJIGRvbid0IGtub3cgaWYgaXQgaXMgd29ydGggdGhlIGVmZm9ydCBvZiBsb29wIHVucm9sbGluZyB0aGUKKyAgICogaW5uZXIgbG9vcCAqLworICBpZiAoZW5jKSB7CisgICAgRF9FTkNSWVBUKGwsIHIsIDApOyAgLyogIDEgKi8KKyAgICBEX0VOQ1JZUFQociwgbCwgMik7ICAvKiAgMiAqLworICAgIERfRU5DUllQVChsLCByLCA0KTsgIC8qICAzICovCisgICAgRF9FTkNSWVBUKHIsIGwsIDYpOyAgLyogIDQgKi8KKyAgICBEX0VOQ1JZUFQobCwgciwgOCk7ICAvKiAgNSAqLworICAgIERfRU5DUllQVChyLCBsLCAxMCk7IC8qICA2ICovCisgICAgRF9FTkNSWVBUKGwsIHIsIDEyKTsgLyogIDcgKi8KKyAgICBEX0VOQ1JZUFQociwgbCwgMTQpOyAvKiAgOCAqLworICAgIERfRU5DUllQVChsLCByLCAxNik7IC8qICA5ICovCisgICAgRF9FTkNSWVBUKHIsIGwsIDE4KTsgLyogIDEwICovCisgICAgRF9FTkNSWVBUKGwsIHIsIDIwKTsgLyogIDExICovCisgICAgRF9FTkNSWVBUKHIsIGwsIDIyKTsgLyogIDEyICovCisgICAgRF9FTkNSWVBUKGwsIHIsIDI0KTsgLyogIDEzICovCisgICAgRF9FTkNSWVBUKHIsIGwsIDI2KTsgLyogIDE0ICovCisgICAgRF9FTkNSWVBUKGwsIHIsIDI4KTsgLyogIDE1ICovCisgICAgRF9FTkNSWVBUKHIsIGwsIDMwKTsgLyogIDE2ICovCisgIH0gZWxzZSB7CisgICAgRF9FTkNSWVBUKGwsIHIsIDMwKTsgLyogMTYgKi8KKyAgICBEX0VOQ1JZUFQociwgbCwgMjgpOyAvKiAxNSAqLworICAgIERfRU5DUllQVChsLCByLCAyNik7IC8qIDE0ICovCisgICAgRF9FTkNSWVBUKHIsIGwsIDI0KTsgLyogMTMgKi8KKyAgICBEX0VOQ1JZUFQobCwgciwgMjIpOyAvKiAxMiAqLworICAgIERfRU5DUllQVChyLCBsLCAyMCk7IC8qIDExICovCisgICAgRF9FTkNSWVBUKGwsIHIsIDE4KTsgLyogMTAgKi8KKyAgICBEX0VOQ1JZUFQociwgbCwgMTYpOyAvKiAgOSAqLworICAgIERfRU5DUllQVChsLCByLCAxNCk7IC8qICA4ICovCisgICAgRF9FTkNSWVBUKHIsIGwsIDEyKTsgLyogIDcgKi8KKyAgICBEX0VOQ1JZUFQobCwgciwgMTApOyAvKiAgNiAqLworICAgIERfRU5DUllQVChyLCBsLCA4KTsgIC8qICA1ICovCisgICAgRF9FTkNSWVBUKGwsIHIsIDYpOyAgLyogIDQgKi8KKyAgICBEX0VOQ1JZUFQociwgbCwgNCk7ICAvKiAgMyAqLworICAgIERfRU5DUllQVChsLCByLCAyKTsgIC8qICAyICovCisgICAgRF9FTkNSWVBUKHIsIGwsIDApOyAgLyogIDEgKi8KKyAgfQorCisgIC8qIHJvdGF0ZSBhbmQgY2xlYXIgdGhlIHRvcCBiaXRzIG9uIG1hY2hpbmVzIHdpdGggOGJ5dGUgbG9uZ3MgKi8KKyAgbCA9IFJPVEFURShsLCAzKSAmIDB4ZmZmZmZmZmZMOworICByID0gUk9UQVRFKHIsIDMpICYgMHhmZmZmZmZmZkw7CisKKyAgRlAociwgbCk7CisgIGRhdGFbMF0gPSBsOworICBkYXRhWzFdID0gcjsKKyAgbCA9IHIgPSB0ID0gdSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIERFU19lbmNyeXB0Mih1aW50MzJfdCAqZGF0YSwgY29uc3QgREVTX2tleV9zY2hlZHVsZSAqa3MsIGludCBlbmMpIHsKKyAgdWludDMyX3QgbCwgciwgdCwgdTsKKyAgY29uc3QgdWludDMyX3QgKnM7CisKKyAgciA9IGRhdGFbMF07CisgIGwgPSBkYXRhWzFdOworCisgIC8qIFRoaW5ncyBoYXZlIGJlZW4gbW9kaWZpZWQgc28gdGhhdCB0aGUgaW5pdGlhbCByb3RhdGUgaXMgZG9uZSBvdXRzaWRlIHRoZQorICAgKiBsb29wLiAgVGhpcyByZXF1aXJlZCB0aGUgREVTX1NQdHJhbnMgdmFsdWVzIGluIHNwLmggdG8gYmUgcm90YXRlZCAxIGJpdCB0bworICAgKiB0aGUgcmlnaHQuIE9uZSBwZXJsIHNjcmlwdCBsYXRlciBhbmQgdGhpbmdzIGhhdmUgYSA1JSBzcGVlZCB1cCBvbiBhCisgICAqIHNwYXJjMi4gVGhhbmtzIHRvIFJpY2hhcmQgT3V0ZXJicmlkZ2UgPDcxNzU1LjIwNEBDb21wdVNlcnZlLkNPTT4gZm9yCisgICAqIHBvaW50aW5nIHRoaXMgb3V0LiAqLworICAvKiBjbGVhciB0aGUgdG9wIGJpdHMgb24gbWFjaGluZXMgd2l0aCA4Ynl0ZSBsb25ncyAqLworICByID0gUk9UQVRFKHIsIDI5KSAmIDB4ZmZmZmZmZmZMOworICBsID0gUk9UQVRFKGwsIDI5KSAmIDB4ZmZmZmZmZmZMOworCisgIHMgPSBrcy0+a3MtPmRlc2xvbmc7CisgIC8qIEkgZG9uJ3Qga25vdyBpZiBpdCBpcyB3b3J0aCB0aGUgZWZmb3J0IG9mIGxvb3AgdW5yb2xsaW5nIHRoZQorICAgKiBpbm5lciBsb29wICovCisgIGlmIChlbmMpIHsKKyAgICBEX0VOQ1JZUFQobCwgciwgMCk7ICAvKiAgMSAqLworICAgIERfRU5DUllQVChyLCBsLCAyKTsgIC8qICAyICovCisgICAgRF9FTkNSWVBUKGwsIHIsIDQpOyAgLyogIDMgKi8KKyAgICBEX0VOQ1JZUFQociwgbCwgNik7ICAvKiAgNCAqLworICAgIERfRU5DUllQVChsLCByLCA4KTsgIC8qICA1ICovCisgICAgRF9FTkNSWVBUKHIsIGwsIDEwKTsgLyogIDYgKi8KKyAgICBEX0VOQ1JZUFQobCwgciwgMTIpOyAvKiAgNyAqLworICAgIERfRU5DUllQVChyLCBsLCAxNCk7IC8qICA4ICovCisgICAgRF9FTkNSWVBUKGwsIHIsIDE2KTsgLyogIDkgKi8KKyAgICBEX0VOQ1JZUFQociwgbCwgMTgpOyAvKiAgMTAgKi8KKyAgICBEX0VOQ1JZUFQobCwgciwgMjApOyAvKiAgMTEgKi8KKyAgICBEX0VOQ1JZUFQociwgbCwgMjIpOyAvKiAgMTIgKi8KKyAgICBEX0VOQ1JZUFQobCwgciwgMjQpOyAvKiAgMTMgKi8KKyAgICBEX0VOQ1JZUFQociwgbCwgMjYpOyAvKiAgMTQgKi8KKyAgICBEX0VOQ1JZUFQobCwgciwgMjgpOyAvKiAgMTUgKi8KKyAgICBEX0VOQ1JZUFQociwgbCwgMzApOyAvKiAgMTYgKi8KKyAgfSBlbHNlIHsKKyAgICBEX0VOQ1JZUFQobCwgciwgMzApOyAvKiAxNiAqLworICAgIERfRU5DUllQVChyLCBsLCAyOCk7IC8qIDE1ICovCisgICAgRF9FTkNSWVBUKGwsIHIsIDI2KTsgLyogMTQgKi8KKyAgICBEX0VOQ1JZUFQociwgbCwgMjQpOyAvKiAxMyAqLworICAgIERfRU5DUllQVChsLCByLCAyMik7IC8qIDEyICovCisgICAgRF9FTkNSWVBUKHIsIGwsIDIwKTsgLyogMTEgKi8KKyAgICBEX0VOQ1JZUFQobCwgciwgMTgpOyAvKiAxMCAqLworICAgIERfRU5DUllQVChyLCBsLCAxNik7IC8qICA5ICovCisgICAgRF9FTkNSWVBUKGwsIHIsIDE0KTsgLyogIDggKi8KKyAgICBEX0VOQ1JZUFQociwgbCwgMTIpOyAvKiAgNyAqLworICAgIERfRU5DUllQVChsLCByLCAxMCk7IC8qICA2ICovCisgICAgRF9FTkNSWVBUKHIsIGwsIDgpOyAgLyogIDUgKi8KKyAgICBEX0VOQ1JZUFQobCwgciwgNik7ICAvKiAgNCAqLworICAgIERfRU5DUllQVChyLCBsLCA0KTsgIC8qICAzICovCisgICAgRF9FTkNSWVBUKGwsIHIsIDIpOyAgLyogIDIgKi8KKyAgICBEX0VOQ1JZUFQociwgbCwgMCk7ICAvKiAgMSAqLworICB9CisgIC8qIHJvdGF0ZSBhbmQgY2xlYXIgdGhlIHRvcCBiaXRzIG9uIG1hY2hpbmVzIHdpdGggOGJ5dGUgbG9uZ3MgKi8KKyAgZGF0YVswXSA9IFJPVEFURShsLCAzKSAmIDB4ZmZmZmZmZmZMOworICBkYXRhWzFdID0gUk9UQVRFKHIsIDMpICYgMHhmZmZmZmZmZkw7CisgIGwgPSByID0gdCA9IHUgPSAwOworfQorCitzdGF0aWMgdm9pZCBERVNfZW5jcnlwdDModWludDMyX3QgKmRhdGEsIGNvbnN0IERFU19rZXlfc2NoZWR1bGUgKmtzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBERVNfa2V5X3NjaGVkdWxlICprczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREVTX2tleV9zY2hlZHVsZSAqa3MzKSB7CisgIHVpbnQzMl90IGwsIHI7CisKKyAgbCA9IGRhdGFbMF07CisgIHIgPSBkYXRhWzFdOworICBJUChsLCByKTsKKyAgZGF0YVswXSA9IGw7CisgIGRhdGFbMV0gPSByOworICBERVNfZW5jcnlwdDIoKHVpbnQzMl90ICopZGF0YSwga3MxLCBERVNfRU5DUllQVCk7CisgIERFU19lbmNyeXB0MigodWludDMyX3QgKilkYXRhLCBrczIsIERFU19ERUNSWVBUKTsKKyAgREVTX2VuY3J5cHQyKCh1aW50MzJfdCAqKWRhdGEsIGtzMywgREVTX0VOQ1JZUFQpOworICBsID0gZGF0YVswXTsKKyAgciA9IGRhdGFbMV07CisgIEZQKHIsIGwpOworICBkYXRhWzBdID0gbDsKKyAgZGF0YVsxXSA9IHI7Cit9CisKK3N0YXRpYyB2b2lkIERFU19kZWNyeXB0Myh1aW50MzJfdCAqZGF0YSwgY29uc3QgREVTX2tleV9zY2hlZHVsZSAqa3MxLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERFU19rZXlfc2NoZWR1bGUgKmtzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBERVNfa2V5X3NjaGVkdWxlICprczMpIHsKKyAgdWludDMyX3QgbCwgcjsKKworICBsID0gZGF0YVswXTsKKyAgciA9IGRhdGFbMV07CisgIElQKGwsIHIpOworICBkYXRhWzBdID0gbDsKKyAgZGF0YVsxXSA9IHI7CisgIERFU19lbmNyeXB0MigodWludDMyX3QgKilkYXRhLCBrczMsIERFU19ERUNSWVBUKTsKKyAgREVTX2VuY3J5cHQyKCh1aW50MzJfdCAqKWRhdGEsIGtzMiwgREVTX0VOQ1JZUFQpOworICBERVNfZW5jcnlwdDIoKHVpbnQzMl90ICopZGF0YSwga3MxLCBERVNfREVDUllQVCk7CisgIGwgPSBkYXRhWzBdOworICByID0gZGF0YVsxXTsKKyAgRlAociwgbCk7CisgIGRhdGFbMF0gPSBsOworICBkYXRhWzFdID0gcjsKK30KKwordm9pZCBERVNfZWNiX2VuY3J5cHQoY29uc3QgREVTX2NibG9jayAqaW5fYmxvY2ssIERFU19jYmxvY2sgKm91dF9ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERFU19rZXlfc2NoZWR1bGUgKnNjaGVkdWxlLCBpbnQgaXNfZW5jcnlwdCkgeworICB1aW50MzJfdCBsOworICB1aW50MzJfdCBsbFsyXTsKKyAgY29uc3QgdWludDhfdCAqaW4gPSBpbl9ibG9jay0+Ynl0ZXM7CisgIHVpbnQ4X3QgKm91dCA9IG91dF9ibG9jay0+Ynl0ZXM7CisKKyAgYzJsKGluLCBsKTsKKyAgbGxbMF0gPSBsOworICBjMmwoaW4sIGwpOworICBsbFsxXSA9IGw7CisgIERFU19lbmNyeXB0MShsbCwgc2NoZWR1bGUsIGlzX2VuY3J5cHQpOworICBsID0gbGxbMF07CisgIGwyYyhsLCBvdXQpOworICBsID0gbGxbMV07CisgIGwyYyhsLCBvdXQpOworICBsID0gbGxbMF0gPSBsbFsxXSA9IDA7Cit9CisKK3ZvaWQgREVTX25jYmNfZW5jcnlwdChjb25zdCB1aW50OF90ICppbiwgdWludDhfdCAqb3V0LCBzaXplX3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERFU19rZXlfc2NoZWR1bGUgKnNjaGVkdWxlLCBERVNfY2Jsb2NrICppdmVjLAorICAgICAgICAgICAgICAgICAgICAgIGludCBlbmMpIHsKKyAgdWludDMyX3QgdGluMCwgdGluMTsKKyAgdWludDMyX3QgdG91dDAsIHRvdXQxLCB4b3IwLCB4b3IxOworICB1aW50MzJfdCB0aW5bMl07CisgIHVuc2lnbmVkIGNoYXIgKml2OworCisgIGl2ID0gaXZlYy0+Ynl0ZXM7CisKKyAgaWYgKGVuYykgeworICAgIGMybChpdiwgdG91dDApOworICAgIGMybChpdiwgdG91dDEpOworICAgIGZvciAoOyBsZW4gPj0gODsgbGVuIC09IDgpIHsKKyAgICAgIGMybChpbiwgdGluMCk7CisgICAgICBjMmwoaW4sIHRpbjEpOworICAgICAgdGluMCBePSB0b3V0MDsKKyAgICAgIHRpblswXSA9IHRpbjA7CisgICAgICB0aW4xIF49IHRvdXQxOworICAgICAgdGluWzFdID0gdGluMTsKKyAgICAgIERFU19lbmNyeXB0MSgodWludDMyX3QgKil0aW4sIHNjaGVkdWxlLCBERVNfRU5DUllQVCk7CisgICAgICB0b3V0MCA9IHRpblswXTsKKyAgICAgIGwyYyh0b3V0MCwgb3V0KTsKKyAgICAgIHRvdXQxID0gdGluWzFdOworICAgICAgbDJjKHRvdXQxLCBvdXQpOworICAgIH0KKyAgICBpZiAobGVuICE9IDApIHsKKyAgICAgIGMybG4oaW4sIHRpbjAsIHRpbjEsIGxlbik7CisgICAgICB0aW4wIF49IHRvdXQwOworICAgICAgdGluWzBdID0gdGluMDsKKyAgICAgIHRpbjEgXj0gdG91dDE7CisgICAgICB0aW5bMV0gPSB0aW4xOworICAgICAgREVTX2VuY3J5cHQxKCh1aW50MzJfdCAqKXRpbiwgc2NoZWR1bGUsIERFU19FTkNSWVBUKTsKKyAgICAgIHRvdXQwID0gdGluWzBdOworICAgICAgbDJjKHRvdXQwLCBvdXQpOworICAgICAgdG91dDEgPSB0aW5bMV07CisgICAgICBsMmModG91dDEsIG91dCk7CisgICAgfQorICAgIGl2ID0gaXZlYy0+Ynl0ZXM7CisgICAgbDJjKHRvdXQwLCBpdik7CisgICAgbDJjKHRvdXQxLCBpdik7CisgIH0gZWxzZSB7CisgICAgYzJsKGl2LCB4b3IwKTsKKyAgICBjMmwoaXYsIHhvcjEpOworICAgIGZvciAoOyBsZW4gPj0gODsgbGVuIC09IDgpIHsKKyAgICAgIGMybChpbiwgdGluMCk7CisgICAgICB0aW5bMF0gPSB0aW4wOworICAgICAgYzJsKGluLCB0aW4xKTsKKyAgICAgIHRpblsxXSA9IHRpbjE7CisgICAgICBERVNfZW5jcnlwdDEoKHVpbnQzMl90ICopdGluLCBzY2hlZHVsZSwgREVTX0RFQ1JZUFQpOworICAgICAgdG91dDAgPSB0aW5bMF0gXiB4b3IwOworICAgICAgdG91dDEgPSB0aW5bMV0gXiB4b3IxOworICAgICAgbDJjKHRvdXQwLCBvdXQpOworICAgICAgbDJjKHRvdXQxLCBvdXQpOworICAgICAgeG9yMCA9IHRpbjA7CisgICAgICB4b3IxID0gdGluMTsKKyAgICB9CisgICAgaWYgKGxlbiAhPSAwKSB7CisgICAgICBjMmwoaW4sIHRpbjApOworICAgICAgdGluWzBdID0gdGluMDsKKyAgICAgIGMybChpbiwgdGluMSk7CisgICAgICB0aW5bMV0gPSB0aW4xOworICAgICAgREVTX2VuY3J5cHQxKCh1aW50MzJfdCAqKXRpbiwgc2NoZWR1bGUsIERFU19ERUNSWVBUKTsKKyAgICAgIHRvdXQwID0gdGluWzBdIF4geG9yMDsKKyAgICAgIHRvdXQxID0gdGluWzFdIF4geG9yMTsKKyAgICAgIGwyY24odG91dDAsIHRvdXQxLCBvdXQsIGxlbik7CisgICAgICB4b3IwID0gdGluMDsKKyAgICAgIHhvcjEgPSB0aW4xOworICAgIH0KKyAgICBpdiA9IGl2ZWMtPmJ5dGVzOworICAgIGwyYyh4b3IwLCBpdik7CisgICAgbDJjKHhvcjEsIGl2KTsKKyAgfQorICB0aW4wID0gdGluMSA9IHRvdXQwID0gdG91dDEgPSB4b3IwID0geG9yMSA9IDA7CisgIHRpblswXSA9IHRpblsxXSA9IDA7Cit9CisKK3ZvaWQgREVTX2VkZTNfY2JjX2VuY3J5cHQoY29uc3QgdWludDhfdCAqaW4sIHVpbnQ4X3QgKm91dCwgc2l6ZV90IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREVTX2tleV9zY2hlZHVsZSAqa3MxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBERVNfa2V5X3NjaGVkdWxlICprczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERFU19rZXlfc2NoZWR1bGUgKmtzMywgREVTX2NibG9jayAqaXZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuYykgeworICB1aW50MzJfdCB0aW4wLCB0aW4xOworICB1aW50MzJfdCB0b3V0MCwgdG91dDEsIHhvcjAsIHhvcjE7CisgIHVpbnQzMl90IHRpblsyXTsKKyAgdWludDhfdCAqaXY7CisKKyAgaXYgPSBpdmVjLT5ieXRlczsKKworICBpZiAoZW5jKSB7CisgICAgYzJsKGl2LCB0b3V0MCk7CisgICAgYzJsKGl2LCB0b3V0MSk7CisgICAgZm9yICg7IGxlbiA+PSA4OyBsZW4gLT0gOCkgeworICAgICAgYzJsKGluLCB0aW4wKTsKKyAgICAgIGMybChpbiwgdGluMSk7CisgICAgICB0aW4wIF49IHRvdXQwOworICAgICAgdGluMSBePSB0b3V0MTsKKworICAgICAgdGluWzBdID0gdGluMDsKKyAgICAgIHRpblsxXSA9IHRpbjE7CisgICAgICBERVNfZW5jcnlwdDMoKHVpbnQzMl90ICopdGluLCBrczEsIGtzMiwga3MzKTsKKyAgICAgIHRvdXQwID0gdGluWzBdOworICAgICAgdG91dDEgPSB0aW5bMV07CisKKyAgICAgIGwyYyh0b3V0MCwgb3V0KTsKKyAgICAgIGwyYyh0b3V0MSwgb3V0KTsKKyAgICB9CisgICAgaWYgKGxlbiAhPSAwKSB7CisgICAgICBjMmxuKGluLCB0aW4wLCB0aW4xLCBsZW4pOworICAgICAgdGluMCBePSB0b3V0MDsKKyAgICAgIHRpbjEgXj0gdG91dDE7CisKKyAgICAgIHRpblswXSA9IHRpbjA7CisgICAgICB0aW5bMV0gPSB0aW4xOworICAgICAgREVTX2VuY3J5cHQzKCh1aW50MzJfdCAqKXRpbiwga3MxLCBrczIsIGtzMyk7CisgICAgICB0b3V0MCA9IHRpblswXTsKKyAgICAgIHRvdXQxID0gdGluWzFdOworCisgICAgICBsMmModG91dDAsIG91dCk7CisgICAgICBsMmModG91dDEsIG91dCk7CisgICAgfQorICAgIGl2ID0gaXZlYy0+Ynl0ZXM7CisgICAgbDJjKHRvdXQwLCBpdik7CisgICAgbDJjKHRvdXQxLCBpdik7CisgIH0gZWxzZSB7CisgICAgdWludDMyX3QgdDAsIHQxOworCisgICAgYzJsKGl2LCB4b3IwKTsKKyAgICBjMmwoaXYsIHhvcjEpOworICAgIGZvciAoOyBsZW4gPj0gODsgbGVuIC09IDgpIHsKKyAgICAgIGMybChpbiwgdGluMCk7CisgICAgICBjMmwoaW4sIHRpbjEpOworCisgICAgICB0MCA9IHRpbjA7CisgICAgICB0MSA9IHRpbjE7CisKKyAgICAgIHRpblswXSA9IHRpbjA7CisgICAgICB0aW5bMV0gPSB0aW4xOworICAgICAgREVTX2RlY3J5cHQzKCh1aW50MzJfdCAqKXRpbiwga3MxLCBrczIsIGtzMyk7CisgICAgICB0b3V0MCA9IHRpblswXTsKKyAgICAgIHRvdXQxID0gdGluWzFdOworCisgICAgICB0b3V0MCBePSB4b3IwOworICAgICAgdG91dDEgXj0geG9yMTsKKyAgICAgIGwyYyh0b3V0MCwgb3V0KTsKKyAgICAgIGwyYyh0b3V0MSwgb3V0KTsKKyAgICAgIHhvcjAgPSB0MDsKKyAgICAgIHhvcjEgPSB0MTsKKyAgICB9CisgICAgaWYgKGxlbiAhPSAwKSB7CisgICAgICBjMmwoaW4sIHRpbjApOworICAgICAgYzJsKGluLCB0aW4xKTsKKworICAgICAgdDAgPSB0aW4wOworICAgICAgdDEgPSB0aW4xOworCisgICAgICB0aW5bMF0gPSB0aW4wOworICAgICAgdGluWzFdID0gdGluMTsKKyAgICAgIERFU19kZWNyeXB0MygodWludDMyX3QgKil0aW4sIGtzMSwga3MyLCBrczMpOworICAgICAgdG91dDAgPSB0aW5bMF07CisgICAgICB0b3V0MSA9IHRpblsxXTsKKworICAgICAgdG91dDAgXj0geG9yMDsKKyAgICAgIHRvdXQxIF49IHhvcjE7CisgICAgICBsMmNuKHRvdXQwLCB0b3V0MSwgb3V0LCBsZW4pOworICAgICAgeG9yMCA9IHQwOworICAgICAgeG9yMSA9IHQxOworICAgIH0KKworICAgIGl2ID0gaXZlYy0+Ynl0ZXM7CisgICAgbDJjKHhvcjAsIGl2KTsKKyAgICBsMmMoeG9yMSwgaXYpOworICB9CisKKyAgdGluMCA9IHRpbjEgPSB0b3V0MCA9IHRvdXQxID0geG9yMCA9IHhvcjEgPSAwOworICB0aW5bMF0gPSB0aW5bMV0gPSAwOworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2Rlcy9kZXMuaCBiL2NyeXB0by9kZXMvZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQzZTFkNgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9kZXMvZGVzLmgKQEAgLTAsMCArMSwxMTkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpZm5kZWYgT1BFTlNTTF9IRUFERVJfREVTX0gKKyNkZWZpbmUgT1BFTlNTTF9IRUFERVJfREVTX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvYmFzZS5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKwordHlwZWRlZiBzdHJ1Y3QgREVTX2NibG9ja19zdCB7CisgIHVpbnQ4X3QgYnl0ZXNbOF07Cit9IERFU19jYmxvY2s7CisKK3R5cGVkZWYgc3RydWN0IERFU19rcyB7CisgIHVuaW9uIHsKKyAgICBERVNfY2Jsb2NrIGNibG9jazsKKyAgICAvKiBtYWtlIHN1cmUgdGhpbmdzIGFyZSBjb3JyZWN0IHNpemUgb24gbWFjaGluZXMgd2l0aAorICAgICAqIDggYnl0ZSBsb25ncyAqLworICAgIHVpbnQzMl90IGRlc2xvbmdbMl07CisgIH0ga3NbMTZdOworfSBERVNfa2V5X3NjaGVkdWxlOworCisKKyNkZWZpbmUgREVTX0tFWV9TWiAoc2l6ZW9mKERFU19jYmxvY2spKQorI2RlZmluZSBERVNfU0NIRURVTEVfU1ogKHNpemVvZihERVNfa2V5X3NjaGVkdWxlKSkKKworI2RlZmluZSBERVNfRU5DUllQVCAxCisjZGVmaW5lIERFU19ERUNSWVBUIDAKKworI2RlZmluZSBERVNfQ0JDX01PREUgMAorI2RlZmluZSBERVNfUENCQ19NT0RFIDEKKworLyogREVTX3NldF9rZXkgcGVyZm9ybXMgYSBrZXkgc2NoZWR1bGUgYW5kIGluaXRpYWxpc2VzIHxzY2hlZHVsZXwgd2l0aCB8a2V5fC4gKi8KK3ZvaWQgREVTX3NldF9rZXkoY29uc3QgREVTX2NibG9jayAqa2V5LCBERVNfa2V5X3NjaGVkdWxlICpzY2hlZHVsZSk7CisKKy8qIERFU19lY2JfZW5jcnlwdCBlbmNyeXB0cyAob3IgZGVjcnlwdHMsIGlmIHxpc19lbmNyeXB0fCBpcyB8REVTX0RFQ1JZUFR8KSBhCisgKiBzaW5nbGUgREVTIGJsb2NrICg4IGJ5dGVzKSBmcm9tIGluIHRvIG91dCwgdXNpbmcgdGhlIGtleSBjb25maWd1cmVkIGluCisgKiB8c2NoZWR1bGV8LiAqLwordm9pZCBERVNfZWNiX2VuY3J5cHQoY29uc3QgREVTX2NibG9jayAqaW4sIERFU19jYmxvY2sgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERFU19rZXlfc2NoZWR1bGUgKnNjaGVkdWxlLCBpbnQgaXNfZW5jcnlwdCk7CisKKy8qIERFU19uY2JjX2VuY3J5cHQgZW5jcnlwdHMgKG9yIGRlY3J5cHRzLCBpZiB8ZW5jfCBpcyB8REVTX0RFQ1JZUFR8KSB8bGVufAorICogYnl0ZXMgZnJvbSB8aW58IHRvIHxvdXR8IHdpdGggREVTIGluIENCQyBtb2RlLiAqLwordm9pZCBERVNfbmNiY19lbmNyeXB0KGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50OF90ICpvdXQsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREVTX2tleV9zY2hlZHVsZSAqc2NoZWR1bGUsIERFU19jYmxvY2sgKml2ZWMsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGVuYyk7CisKKy8qIERFU19lZGUzX2NiY19lbmNyeXB0IGVuY3J5cHRzIChvciBkZWNyeXB0cywgaWYgfGVuY3wgaXMgfERFU19ERUNSWVBUfCkgfGxlbnwKKyAqIGJ5dGVzIGZyb20gfGlufCB0byB8b3V0fCB3aXRoIDNERVMgaW4gQ0JDIG1vZGUuIDNERVMgdXNlcyB0aHJlZSBrZXlzLCB0aHVzCisgKiB0aGUgZnVuY3Rpb24gdGFrZXMgdGhyZWUgZGlmZmVyZW50IHxERVNfa2V5X3NjaGVkdWxlfHMuICovCit2b2lkIERFU19lZGUzX2NiY19lbmNyeXB0KGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50OF90ICpvdXQsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERFU19rZXlfc2NoZWR1bGUgKmtzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREVTX2tleV9zY2hlZHVsZSAqa3MyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBERVNfa2V5X3NjaGVkdWxlICprczMsIERFU19jYmxvY2sgKml2ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmMpOworCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfSAgLyogZXh0ZXJuIEMgKi8KKyNlbmRpZgorCisjZW5kaWYgIC8qIE9QRU5TU0xfSEVBREVSX0RFU19IICovCmRpZmYgLS1naXQgYS9jcnlwdG8vZGVzL2ludGVybmFsLmggYi9jcnlwdG8vZGVzL2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNhNWNlYwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9kZXMvaW50ZXJuYWwuaApAQCAtMCwwICsxLDIyOSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2lmbmRlZiBPUEVOU1NMX0hFQURFUl9ERVNfSU5URVJOQUxfSAorI2RlZmluZSBPUEVOU1NMX0hFQURFUl9ERVNfSU5URVJOQUxfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9iYXNlLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisjZGVmaW5lIGMybChjLCBsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChsID0gKCh1aW50MzJfdCkoKigoYykrKykpKSwgbCB8PSAoKHVpbnQzMl90KSgqKChjKSsrKSkpIDw8IDhMLCBcCisgICBsIHw9ICgodWludDMyX3QpKCooKGMpKyspKSkgPDwgMTZMLCBsIHw9ICgodWludDMyX3QpKCooKGMpKyspKSkgPDwgMjRMKQorCisjZGVmaW5lIGwyYyhsLCBjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKigoYykrKykgPSAodW5zaWduZWQgY2hhcikoKChsKSkgJiAweGZmKSwgICAgICAgIFwKKyAgICooKGMpKyspID0gKHVuc2lnbmVkIGNoYXIpKCgobCkgPj4gOEwpICYgMHhmZiksICBcCisgICAqKChjKSsrKSA9ICh1bnNpZ25lZCBjaGFyKSgoKGwpID4+IDE2TCkgJiAweGZmKSwgXAorICAgKigoYykrKykgPSAodW5zaWduZWQgY2hhcikoKChsKSA+PiAyNEwpICYgMHhmZikpCisKKy8qIE5PVEUgLSBjIGlzIG5vdCBpbmNyZW1lbnRlZCBhcyBwZXIgYzJsICovCisjZGVmaW5lIGMybG4oYywgbDEsIGwyLCBuKSAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYyArPSBuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbDEgPSBsMiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3dpdGNoIChuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjYXNlIDg6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGwyID0gKCh1aW50MzJfdCkoKigtLShjKSkpKSA8PCAyNEw7ICBcCisgICAgICBjYXNlIDc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGwyIHw9ICgodWludDMyX3QpKCooLS0oYykpKSkgPDwgMTZMOyBcCisgICAgICBjYXNlIDY6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGwyIHw9ICgodWludDMyX3QpKCooLS0oYykpKSkgPDwgOEw7ICBcCisgICAgICBjYXNlIDU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGwyIHw9ICgodWludDMyX3QpKCooLS0oYykpKSk7ICAgICAgICBcCisgICAgICBjYXNlIDQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGwxID0gKCh1aW50MzJfdCkoKigtLShjKSkpKSA8PCAyNEw7ICBcCisgICAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGwxIHw9ICgodWludDMyX3QpKCooLS0oYykpKSkgPDwgMTZMOyBcCisgICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGwxIHw9ICgodWludDMyX3QpKCooLS0oYykpKSkgPDwgOEw7ICBcCisgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGwxIHw9ICgodWludDMyX3QpKCooLS0oYykpKSk7ICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworLyogTk9URSAtIGMgaXMgbm90IGluY3JlbWVudGVkIGFzIHBlciBsMmMgKi8KKyNkZWZpbmUgbDJjbihsMSwgbDIsIGMsIG4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGMgKz0gbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzd2l0Y2ggKG4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjYXNlIDg6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAqKC0tKGMpKSA9ICh1bnNpZ25lZCBjaGFyKSgoKGwyKSA+PiAyNEwpICYgMHhmZik7IFwKKyAgICAgIGNhc2UgNzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICooLS0oYykpID0gKHVuc2lnbmVkIGNoYXIpKCgobDIpID4+IDE2TCkgJiAweGZmKTsgXAorICAgICAgY2FzZSA2OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKigtLShjKSkgPSAodW5zaWduZWQgY2hhcikoKChsMikgPj4gOEwpICYgMHhmZik7ICBcCisgICAgICBjYXNlIDU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAqKC0tKGMpKSA9ICh1bnNpZ25lZCBjaGFyKSgoKGwyKSkgJiAweGZmKTsgICAgICAgIFwKKyAgICAgIGNhc2UgNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICooLS0oYykpID0gKHVuc2lnbmVkIGNoYXIpKCgobDEpID4+IDI0TCkgJiAweGZmKTsgXAorICAgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKigtLShjKSkgPSAodW5zaWduZWQgY2hhcikoKChsMSkgPj4gMTZMKSAmIDB4ZmYpOyBcCisgICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAqKC0tKGMpKSA9ICh1bnNpZ25lZCBjaGFyKSgoKGwxKSA+PiA4TCkgJiAweGZmKTsgIFwKKyAgICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICooLS0oYykpID0gKHVuc2lnbmVkIGNoYXIpKCgobDEpKSAmIDB4ZmYpOyAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisvKiBJUCBhbmQgRlAKKyAqIFRoZSBwcm9ibGVtIGlzIG1vcmUgb2YgYSBnZW9tZXRyaWMgcHJvYmxlbSB0aGF0IHJhbmRvbSBiaXQgZmlkZGxpbmcuCisgMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgICAgIDYyIDU0IDQ2IDM4IDMwIDIyIDE0ICA2CisgOCAgOSAxMCAxMSAxMiAxMyAxNCAxNSAgICAgIDYwIDUyIDQ0IDM2IDI4IDIwIDEyICA0CisxNiAxNyAxOCAxOSAyMCAyMSAyMiAyMyAgICAgIDU4IDUwIDQyIDM0IDI2IDE4IDEwICAyCisyNCAyNSAyNiAyNyAyOCAyOSAzMCAzMSAgdG8gIDU2IDQ4IDQwIDMyIDI0IDE2ICA4ICAwCisKKzMyIDMzIDM0IDM1IDM2IDM3IDM4IDM5ICAgICAgNjMgNTUgNDcgMzkgMzEgMjMgMTUgIDcKKzQwIDQxIDQyIDQzIDQ0IDQ1IDQ2IDQ3ICAgICAgNjEgNTMgNDUgMzcgMjkgMjEgMTMgIDUKKzQ4IDQ5IDUwIDUxIDUyIDUzIDU0IDU1ICAgICAgNTkgNTEgNDMgMzUgMjcgMTkgMTEgIDMKKzU2IDU3IDU4IDU5IDYwIDYxIDYyIDYzICAgICAgNTcgNDkgNDEgMzMgMjUgMTcgIDkgIDEKKworVGhlIG91dHB1dCBoYXMgYmVlbiBzdWJqZWN0IHRvIHN3YXBzIG9mIHRoZSBmb3JtCiswIDEgLT4gMyAxIGJ1dCB0aGUgb2RkIGFuZCBldmVuIGJpdHMgaGF2ZSBiZWVuIHB1dCBpbnRvCisyIDMgICAgMiAwCitkaWZmZXJlbnQgd29yZHMuICBUaGUgbWFpbiB0cmljayBpcyB0byByZW1lbWJlciB0aGF0Cit0PSgobD4+c2l6ZSlecikmKG1hc2spOworcl49dDsKK2xePSh0PDxzaXplKTsKK2NhbiBiZSB1c2VkIHRvIHN3YXAgYW5kIG1vdmUgYml0cyBiZXR3ZWVuIHdvcmRzLgorCitTbyBsID0gIDAgIDEgIDIgIDMgIHIgPSAxNiAxNyAxOCAxOQorICAgICAgICA0ICA1ICA2ICA3ICAgICAgMjAgMjEgMjIgMjMKKyAgICAgICAgOCAgOSAxMCAxMSAgICAgIDI0IDI1IDI2IDI3CisgICAgICAgMTIgMTMgMTQgMTUgICAgICAyOCAyOSAzMCAzMQorYmVjb21lcyAoZm9yIHNpemUgPT0gMiBhbmQgbWFzayA9PSAweDMzMzMpCisgICB0ID0gICAyXjE2ICAzXjE3IC0tIC0tICAgbCA9ICAwICAxIDE2IDE3ICByID0gIDIgIDMgMTggMTkKKyAgICAgICAgIDZeMjAgIDdeMjEgLS0gLS0gICAgICAgIDQgIDUgMjAgMjEgICAgICAgNiAgNyAyMiAyMworICAgICAgICAxMF4yNCAxMV4yNSAtLSAtLSAgICAgICAgOCAgOSAyNCAyNSAgICAgIDEwIDExIDI0IDI1CisgICAgICAgIDE0XjI4IDE1XjI5IC0tIC0tICAgICAgIDEyIDEzIDI4IDI5ICAgICAgMTQgMTUgMjggMjkKKworVGhhbmtzIGZvciBoaW50cyBmcm9tIFJpY2hhcmQgT3V0ZXJicmlkZ2UgLSBoZSB0b2xkIG1lIElQJkZQCitjb3VsZCBiZSBkb25lIGluIDE1IHhvciwgMTAgc2hpZnRzIGFuZCA1IGFuZHMuCitXaGVuIEkgZmluYWxseSBzdGFydGVkIHRvIHRoaW5rIG9mIHRoZSBwcm9ibGVtIGluIDJECitJIGZpcnN0IGdvdCB+NDIgb3BlcmF0aW9ucyB3aXRob3V0IHhvcnMuICBXaGVuIEkgcmVtZW1iZXJlZAoraG93IHRvIHVzZSB4b3JzIDotKSBJIGdvdCBpdCB0byBpdHMgZmluYWwgc3RhdGUuCisqLworI2RlZmluZSBQRVJNX09QKGEsIGIsIHQsIG4sIG0pIFwKKyAgKCh0KSA9ICgoKChhKSA+PiAobikpIF4gKGIpKSAmIChtKSksIChiKSBePSAodCksIChhKSBePSAoKHQpIDw8IChuKSkpCisKKyNkZWZpbmUgSVAobCwgcikgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQzMl90IHR0OyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQRVJNX09QKHIsIGwsIHR0LCA0LCAweDBmMGYwZjBmTCk7ICBcCisgICAgUEVSTV9PUChsLCByLCB0dCwgMTYsIDB4MDAwMGZmZmZMKTsgXAorICAgIFBFUk1fT1AociwgbCwgdHQsIDIsIDB4MzMzMzMzMzNMKTsgIFwKKyAgICBQRVJNX09QKGwsIHIsIHR0LCA4LCAweDAwZmYwMGZmTCk7ICBcCisgICAgUEVSTV9PUChyLCBsLCB0dCwgMSwgMHg1NTU1NTU1NUwpOyAgXAorICB9CisKKyNkZWZpbmUgRlAobCwgcikgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQzMl90IHR0OyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQRVJNX09QKGwsIHIsIHR0LCAxLCAweDU1NTU1NTU1TCk7ICBcCisgICAgUEVSTV9PUChyLCBsLCB0dCwgOCwgMHgwMGZmMDBmZkwpOyAgXAorICAgIFBFUk1fT1AobCwgciwgdHQsIDIsIDB4MzMzMzMzMzNMKTsgIFwKKyAgICBQRVJNX09QKHIsIGwsIHR0LCAxNiwgMHgwMDAwZmZmZkwpOyBcCisgICAgUEVSTV9PUChsLCByLCB0dCwgNCwgMHgwZjBmMGYwZkwpOyAgXAorICB9CisKKyNkZWZpbmUgTE9BRF9EQVRBKFIsIFMsIHUsIHQsIEUwLCBFMSkgXAorICB1ID0gUiBeIHNbU107ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdCA9IFIgXiBzW1MgKyAxXQorCisjZGVmaW5lIERfRU5DUllQVChMTCwgUiwgUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBMT0FEX0RBVEEoUiwgUywgdSwgdCwgRTAsIEUxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdCA9IFJPVEFURSh0LCA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIExMIF49ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgREVTX1NQdHJhbnNbMF1bKHUgPj4gMkwpICYgMHgzZl0gXiBERVNfU1B0cmFuc1syXVsodSA+PiAxMEwpICYgMHgzZl0gXiBcCisgICAgICAgIERFU19TUHRyYW5zWzRdWyh1ID4+IDE4TCkgJiAweDNmXSBeICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBERVNfU1B0cmFuc1s2XVsodSA+PiAyNkwpICYgMHgzZl0gXiBERVNfU1B0cmFuc1sxXVsodCA+PiAyTCkgJiAweDNmXSBeIFwKKyAgICAgICAgREVTX1NQdHJhbnNbM11bKHQgPj4gMTBMKSAmIDB4M2ZdIF4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIERFU19TUHRyYW5zWzVdWyh0ID4+IDE4TCkgJiAweDNmXSBeIERFU19TUHRyYW5zWzddWyh0ID4+IDI2TCkgJiAweDNmXTsgXAorICB9CisKKyNkZWZpbmUgSVRFUkFUSU9OUyAxNgorI2RlZmluZSBIQUxGX0lURVJBVElPTlMgOAorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNkZWZpbmUgUk9UQVRFKGEsIG4pIChfbHJvdHIoYSwgbikpCisjZWxpZiBkZWZpbmVkKF9fSUNDKQorI2RlZmluZSBST1RBVEUoYSwgbikgKF9yb3RyKGEsIG4pKQorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPj0gMiAmJiAhZGVmaW5lZChPUEVOU1NMX05PX0FTTSkgJiYgXAorICAgICAgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSAmJiBcCisgICAgICAoZGVmaW5lZChPUEVOU1NMX1g4NikgfHwgZGVmaW5lZChPUEVOU1NMX1g4Nl82NCkpCisjZGVmaW5lIFJPVEFURShhLCBuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVuc2lnbmVkIGludCByZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXNtKCJyb3JsICUxLCUwIiA6ICI9ciIocmV0KSA6ICJJIihuKSwgIjAiKGEpIDogImNjIik7IFwKKyAgICByZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9KQorI2VuZGlmCisKKyNpZm5kZWYgUk9UQVRFCisjZGVmaW5lIFJPVEFURShhLCBuKSAoKChhKSA+PiAobikpICsgKChhKSA8PCAoMzIgLSAobikpKSkKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfSAvKiBleHRlcm4gQyAqLworI2VuZGlmCisKKyNlbmRpZiAvKiBPUEVOU1NMX0hFQURFUl9ERVNfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2RoL0NNYWtlTGlzdHMudHh0IGIvY3J5cHRvL2RoL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxOTYwNmMKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vZGgvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwyMiBAQAoraW5jbHVkZV9kaXJlY3RvcmllcyguIC4uIC4uLy4uL2luY2x1ZGUpCisKK2FkZF9saWJyYXJ5KAorCWRoCisKKwlPQkpFQ1QKKworCWRoLmMKKwlkaF9pbXBsLmMKKwlwYXJhbXMuYworCWNoZWNrLmMKKwlkaF9hc24xLmMKKwlkaF9lcnJvci5jCispCisKK2FkZF9leGVjdXRhYmxlKAorCWRoX3Rlc3QKKworCWRoX3Rlc3QuYworKQorCit0YXJnZXRfbGlua19saWJyYXJpZXMoZGhfdGVzdCBjcnlwdG8pCmRpZmYgLS1naXQgYS9jcnlwdG8vZGgvY2hlY2suYyBiL2NyeXB0by9kaC9jaGVjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MDk5ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vZGgvY2hlY2suYwpAQCAtMCwwICsxLDE3NyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvZGguaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKworI2luY2x1ZGUgImludGVybmFsLmgiCisKKworaW50IERIX2NoZWNrX3B1Yl9rZXkoY29uc3QgREggKmRoLCBjb25zdCBCSUdOVU0gKnB1Yl9rZXksIGludCAqcmV0KSB7CisgIGludCBvayA9IDA7CisgIEJJR05VTSBxOworCisgICpyZXQgPSAwOworICBCTl9pbml0KCZxKTsKKyAgaWYgKCFCTl9zZXRfd29yZCgmcSwgMSkpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmIChCTl9jbXAocHViX2tleSwgJnEpIDw9IDApIHsKKyAgICAqcmV0IHw9IERIX0NIRUNLX1BVQktFWV9UT09fU01BTEw7CisgIH0KKyAgaWYgKCFCTl9jb3B5KCZxLCBkaC0+cCkgfHwKKyAgICAgICFCTl9zdWJfd29yZCgmcSwgMSkpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorICBpZiAoQk5fY21wKHB1Yl9rZXksICZxKSA+PSAwKSB7CisgICAgKnJldCB8PSBESF9DSEVDS19QVUJLRVlfVE9PX0xBUkdFOworICB9CisKKyAgb2sgPSAxOworCitlcnI6CisgIEJOX2ZyZWUoJnEpOworICByZXR1cm4gb2s7Cit9CisKKworaW50IERIX2NoZWNrKGNvbnN0IERIICpkaCwgaW50ICpyZXQpIHsKKyAgLyogQ2hlY2sgdGhhdCBwIGlzIGEgc2FmZSBwcmltZSBhbmQgaWYgZyBpcyAyLCAzIG9yIDUsIGNoZWNrIHRoYXQgaXQgaXMgYQorICAgKiBzdWl0YWJsZSBnZW5lcmF0b3Igd2hlcmU6CisgICAqICAgZm9yIDIsIHAgbW9kIDI0ID09IDExCisgICAqICAgZm9yIDMsIHAgbW9kIDEyID09IDUKKyAgICogICBmb3IgNSwgcCBtb2QgMTAgPT0gMyBvciA3CisgICAqIHNob3VsZCBob2xkLgorICAgKi8KKyAgaW50IG9rID0gMDsKKyAgQk5fQ1RYICpjdHggPSBOVUxMOworICBCTl9VTE9ORyBsOworICBCSUdOVU0gKnQxID0gTlVMTCwgKnQyID0gTlVMTDsKKworICAqcmV0ID0gMDsKKyAgY3R4ID0gQk5fQ1RYX25ldygpOworICBpZiAoY3R4ID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorICBCTl9DVFhfc3RhcnQoY3R4KTsKKyAgdDEgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIHQyID0gQk5fQ1RYX2dldChjdHgpOworICBpZiAodDIgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKGRoLT5xKSB7CisgICAgaWYgKEJOX2NtcChkaC0+ZywgQk5fdmFsdWVfb25lKCkpIDw9IDApIHsKKyAgICAgICpyZXQgfD0gREhfQ0hFQ0tfTk9UX1NVSVRBQkxFX0dFTkVSQVRPUjsKKyAgICB9IGVsc2UgaWYgKEJOX2NtcChkaC0+ZywgZGgtPnApID49IDApIHsKKyAgICAgICpyZXQgfD0gREhfQ0hFQ0tfTk9UX1NVSVRBQkxFX0dFTkVSQVRPUjsKKyAgICB9IGVsc2UgeworICAgICAgLyogQ2hlY2sgZ15xID09IDEgbW9kIHAgKi8KKyAgICAgIGlmICghQk5fbW9kX2V4cCh0MSwgZGgtPmcsIGRoLT5xLCBkaC0+cCwgY3R4KSkgeworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICAgIGlmICghQk5faXNfb25lKHQxKSkgeworICAgICAgICAqcmV0IHw9IERIX0NIRUNLX05PVF9TVUlUQUJMRV9HRU5FUkFUT1I7CisgICAgICB9CisgICAgfQorICAgIGlmICghQk5faXNfcHJpbWVfZXgoZGgtPnEsIEJOX3ByaW1lX2NoZWNrcywgY3R4LCBOVUxMKSkgeworICAgICAgKnJldCB8PSBESF9DSEVDS19RX05PVF9QUklNRTsKKyAgICB9CisgICAgLyogQ2hlY2sgcCA9PSAxIG1vZCBxICBpLmUuIHEgZGl2aWRlcyBwIC0gMSAqLworICAgIGlmICghQk5fZGl2KHQxLCB0MiwgZGgtPnAsIGRoLT5xLCBjdHgpKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgaWYgKCFCTl9pc19vbmUodDIpKSB7CisgICAgICAqcmV0IHw9IERIX0NIRUNLX0lOVkFMSURfUV9WQUxVRTsKKyAgICB9CisgICAgaWYgKGRoLT5qICYmIEJOX2NtcChkaC0+aiwgdDEpKSB7CisgICAgICAqcmV0IHw9IERIX0NIRUNLX0lOVkFMSURfSl9WQUxVRTsKKyAgICB9CisgIH0gZWxzZSBpZiAoQk5faXNfd29yZChkaC0+ZywgREhfR0VORVJBVE9SXzIpKSB7CisgICAgbCA9IEJOX21vZF93b3JkKGRoLT5wLCAyNCk7CisgICAgaWYgKGwgIT0gMTEpIHsKKyAgICAgICpyZXQgfD0gREhfQ0hFQ0tfTk9UX1NVSVRBQkxFX0dFTkVSQVRPUjsKKyAgICB9CisgIH0gZWxzZSBpZiAoQk5faXNfd29yZChkaC0+ZywgREhfR0VORVJBVE9SXzUpKSB7CisgICAgbCA9IEJOX21vZF93b3JkKGRoLT5wLCAxMCk7CisgICAgaWYgKGwgIT0gMyAmJiBsICE9IDcpIHsKKyAgICAgICpyZXQgfD0gREhfQ0hFQ0tfTk9UX1NVSVRBQkxFX0dFTkVSQVRPUjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgKnJldCB8PSBESF9DSEVDS19VTkFCTEVfVE9fQ0hFQ0tfR0VORVJBVE9SOworICB9CisKKyAgaWYgKCFCTl9pc19wcmltZV9leChkaC0+cCwgQk5fcHJpbWVfY2hlY2tzLCBjdHgsIE5VTEwpKSB7CisgICAgKnJldCB8PSBESF9DSEVDS19QX05PVF9QUklNRTsKKyAgfSBlbHNlIGlmICghZGgtPnEpIHsKKyAgICBpZiAoIUJOX3JzaGlmdDEodDEsIGRoLT5wKSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICAgIGlmICghQk5faXNfcHJpbWVfZXgodDEsIEJOX3ByaW1lX2NoZWNrcywgY3R4LCBOVUxMKSkgeworICAgICAgKnJldCB8PSBESF9DSEVDS19QX05PVF9TQUZFX1BSSU1FOworICAgIH0KKyAgfQorICBvayA9IDE7CisKK2VycjoKKyAgaWYgKGN0eCAhPSBOVUxMKSB7CisgICAgQk5fQ1RYX2VuZChjdHgpOworICAgIEJOX0NUWF9mcmVlKGN0eCk7CisgIH0KKyAgcmV0dXJuIG9rOworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2RoL2RoLmMgYi9jcnlwdG8vZGgvZGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTZhZTZkCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2RoL2RoLmMKQEAgLTAsMCArMSwyNDEgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2RoLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9idWYuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXhfZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC90aHJlYWQuaD4KKworI2luY2x1ZGUgImludGVybmFsLmgiCisKKworZXh0ZXJuIGNvbnN0IERIX01FVEhPRCBESF9kZWZhdWx0X21ldGhvZDsKKworREggKkRIX25ldyh2b2lkKSB7IHJldHVybiBESF9uZXdfbWV0aG9kKE5VTEwpOyB9CisKK0RIICpESF9uZXdfbWV0aG9kKGNvbnN0IEVOR0lORSAqZW5naW5lKSB7CisgIERIICpkaCA9IChESCAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihESCkpOworICBpZiAoZGggPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKERILCBESF9uZXdfbWV0aG9kLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBtZW1zZXQoZGgsIDAsIHNpemVvZihESCkpOworCisgIGlmIChlbmdpbmUpIHsKKyAgICBkaC0+bWV0aCA9IEVOR0lORV9nZXRfREhfbWV0aG9kKGVuZ2luZSk7CisgIH0KKworICBpZiAoZGgtPm1ldGggPT0gTlVMTCkgeworICAgIGRoLT5tZXRoID0gKERIX01FVEhPRCopICZESF9kZWZhdWx0X21ldGhvZDsKKyAgfQorICBNRVRIT0RfcmVmKGRoLT5tZXRoKTsKKworICBkaC0+cmVmZXJlbmNlcyA9IDE7CisgIGlmICghQ1JZUFRPX25ld19leF9kYXRhKENSWVBUT19FWF9JTkRFWF9ESCwgZGgsICZkaC0+ZXhfZGF0YSkpIHsKKyAgICBPUEVOU1NMX2ZyZWUoZGgpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYgKGRoLT5tZXRoLT5pbml0ICYmICFkaC0+bWV0aC0+aW5pdChkaCkpIHsKKyAgICBDUllQVE9fZnJlZV9leF9kYXRhKENSWVBUT19FWF9JTkRFWF9ESCwgZGgsICZkaC0+ZXhfZGF0YSk7CisgICAgTUVUSE9EX3VucmVmKGRoLT5tZXRoKTsKKyAgICBPUEVOU1NMX2ZyZWUoZGgpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIGRoOworfQorCit2b2lkIERIX2ZyZWUoREggKmRoKSB7CisgIGlmIChkaCA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKENSWVBUT19hZGQoJmRoLT5yZWZlcmVuY2VzLCAtMSwgQ1JZUFRPX0xPQ0tfREgpID4gMCkgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChkaC0+bWV0aC0+ZmluaXNoKSB7CisgICAgZGgtPm1ldGgtPmZpbmlzaChkaCk7CisgIH0KKyAgTUVUSE9EX3VucmVmKGRoLT5tZXRoKTsKKworICBDUllQVE9fZnJlZV9leF9kYXRhKENSWVBUT19FWF9JTkRFWF9ESCwgZGgsICZkaC0+ZXhfZGF0YSk7CisKKyAgaWYgKGRoLT5tZXRob2RfbW9udF9wKSBCTl9NT05UX0NUWF9mcmVlKGRoLT5tZXRob2RfbW9udF9wKTsKKyAgaWYgKGRoLT5wICE9IE5VTEwpIEJOX2NsZWFyX2ZyZWUoZGgtPnApOworICBpZiAoZGgtPmcgIT0gTlVMTCkgQk5fY2xlYXJfZnJlZShkaC0+Zyk7CisgIGlmIChkaC0+cSAhPSBOVUxMKSBCTl9jbGVhcl9mcmVlKGRoLT5xKTsKKyAgaWYgKGRoLT5qICE9IE5VTEwpIEJOX2NsZWFyX2ZyZWUoZGgtPmopOworICBpZiAoZGgtPnNlZWQpIE9QRU5TU0xfZnJlZShkaC0+c2VlZCk7CisgIGlmIChkaC0+Y291bnRlciAhPSBOVUxMKSBCTl9jbGVhcl9mcmVlKGRoLT5jb3VudGVyKTsKKyAgaWYgKGRoLT5wdWJfa2V5ICE9IE5VTEwpIEJOX2NsZWFyX2ZyZWUoZGgtPnB1Yl9rZXkpOworICBpZiAoZGgtPnByaXZfa2V5ICE9IE5VTEwpIEJOX2NsZWFyX2ZyZWUoZGgtPnByaXZfa2V5KTsKKworICBPUEVOU1NMX2ZyZWUoZGgpOworfQorCitpbnQgREhfZ2VuZXJhdGVfcGFyYW1ldGVyc19leChESCAqZGgsIGludCBwcmltZV9iaXRzLCBpbnQgZ2VuZXJhdG9yLCBCTl9HRU5DQiAqY2IpIHsKKyAgaWYgKGRoLT5tZXRoLT5nZW5lcmF0ZV9wYXJhbWV0ZXJzKSB7CisgICAgcmV0dXJuIGRoLT5tZXRoLT5nZW5lcmF0ZV9wYXJhbWV0ZXJzKGRoLCBwcmltZV9iaXRzLCBnZW5lcmF0b3IsIGNiKTsKKyAgfQorICByZXR1cm4gREhfZGVmYXVsdF9tZXRob2QuZ2VuZXJhdGVfcGFyYW1ldGVycyhkaCwgcHJpbWVfYml0cywgZ2VuZXJhdG9yLCBjYik7Cit9CisKK2ludCBESF9nZW5lcmF0ZV9rZXkoREggKmRoKSB7CisgIGlmIChkaC0+bWV0aC0+Z2VuZXJhdGVfa2V5KSB7CisgICAgcmV0dXJuIGRoLT5tZXRoLT5nZW5lcmF0ZV9rZXkoZGgpOworICB9CisgIHJldHVybiBESF9kZWZhdWx0X21ldGhvZC5nZW5lcmF0ZV9rZXkoZGgpOworfQorCitzc2l6ZV90IERIX2NvbXB1dGVfa2V5KHVuc2lnbmVkIGNoYXIgKm91dCwgY29uc3QgQklHTlVNICpwZWVyc19rZXksIERIICpkaCkgeworICBpZiAoZGgtPm1ldGgtPmNvbXB1dGVfa2V5KSB7CisgICAgcmV0dXJuIGRoLT5tZXRoLT5jb21wdXRlX2tleShkaCwgb3V0LCBwZWVyc19rZXkpOworICB9CisgIHJldHVybiBESF9kZWZhdWx0X21ldGhvZC5jb21wdXRlX2tleShkaCwgb3V0LCBwZWVyc19rZXkpOworfQorCitpbnQgREhfc2l6ZShjb25zdCBESCAqZGgpIHsgcmV0dXJuIEJOX251bV9ieXRlcyhkaC0+cCk7IH0KKworaW50IERIX3VwX3JlZihESCAqcikgeworICBDUllQVE9fYWRkKCZyLT5yZWZlcmVuY2VzLCAxLCBDUllQVE9fTE9DS19ESCk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGludF9kaF9ibl9jcHkoQklHTlVNICoqZHN0LCBjb25zdCBCSUdOVU0gKnNyYykgeworICBCSUdOVU0gKmEgPSBOVUxMOworCisgIGlmIChzcmMpIHsKKyAgICBhID0gQk5fZHVwKHNyYyk7CisgICAgaWYgKCFhKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICBpZiAoKmRzdCkgeworICAgIEJOX2ZyZWUoKmRzdCk7CisgIH0KKyAgKmRzdCA9IGE7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGludF9kaF9wYXJhbV9jb3B5KERIICp0bywgY29uc3QgREggKmZyb20sIGludCBpc194OTQyKSB7CisgIGlmIChpc194OTQyID09IC0xKSB7CisgICAgaXNfeDk0MiA9ICEhZnJvbS0+cTsKKyAgfQorICBpZiAoIWludF9kaF9ibl9jcHkoJnRvLT5wLCBmcm9tLT5wKSB8fAorICAgICAgIWludF9kaF9ibl9jcHkoJnRvLT5nLCBmcm9tLT5nKSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKCFpc194OTQyKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpZiAoIWludF9kaF9ibl9jcHkoJnRvLT5xLCBmcm9tLT5xKSB8fAorICAgICAgIWludF9kaF9ibl9jcHkoJnRvLT5qLCBmcm9tLT5qKSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKHRvLT5zZWVkKSB7CisgICAgT1BFTlNTTF9mcmVlKHRvLT5zZWVkKTsKKyAgICB0by0+c2VlZCA9IE5VTEw7CisgICAgdG8tPnNlZWRsZW4gPSAwOworICB9CisgIGlmIChmcm9tLT5zZWVkKSB7CisgICAgdG8tPnNlZWQgPSBCVUZfbWVtZHVwKGZyb20tPnNlZWQsIGZyb20tPnNlZWRsZW4pOworICAgIGlmICghdG8tPnNlZWQpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICB0by0+c2VlZGxlbiA9IGZyb20tPnNlZWRsZW47CisgIH0KKworICByZXR1cm4gMTsKK30KKworREggKkRIcGFyYW1zX2R1cChjb25zdCBESCAqZGgpIHsKKyAgREggKnJldCA9IERIX25ldygpOworICBpZiAoIXJldCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYgKCFpbnRfZGhfcGFyYW1fY29weShyZXQsIGRoLCAtMSkpIHsKKyAgICBESF9mcmVlKHJldCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitpbnQgREhfZ2V0X2V4X25ld19pbmRleChsb25nIGFyZ2wsIHZvaWQgKmFyZ3AsIENSWVBUT19FWF9uZXcgKm5ld19mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgQ1JZUFRPX0VYX2R1cCAqZHVwX2Z1bmMsIENSWVBUT19FWF9mcmVlICpmcmVlX2Z1bmMpIHsKKyAgcmV0dXJuIENSWVBUT19nZXRfZXhfbmV3X2luZGV4KENSWVBUT19FWF9JTkRFWF9ESCwgYXJnbCwgYXJncCwgbmV3X2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBfZnVuYywgZnJlZV9mdW5jKTsKK30KKworaW50IERIX3NldF9leF9kYXRhKERIICpkLCBpbnQgaWR4LCB2b2lkICphcmcpIHsKKyAgcmV0dXJuIChDUllQVE9fc2V0X2V4X2RhdGEoJmQtPmV4X2RhdGEsIGlkeCwgYXJnKSk7Cit9CisKK3ZvaWQgKkRIX2dldF9leF9kYXRhKERIICpkLCBpbnQgaWR4KSB7CisgIHJldHVybiAoQ1JZUFRPX2dldF9leF9kYXRhKCZkLT5leF9kYXRhLCBpZHgpKTsKK30KZGlmZiAtLWdpdCBhL2NyeXB0by9kaC9kaC5oIGIvY3J5cHRvL2RoL2RoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFiODRmOQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9kaC9kaC5oCkBAIC0wLDAgKzEsMjU5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaWZuZGVmIE9QRU5TU0xfSEVBREVSX0RIX0gKKyNkZWZpbmUgT1BFTlNTTF9IRUFERVJfREhfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9iYXNlLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2VuZ2luZS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXhfZGF0YS5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogREggY29udGFpbnMgZnVuY3Rpb25zIGZvciBwZXJmb3JtaW5nIERpZmZpZS1IZWxsbWFuIGtleSBhZ3JlZW1lbnQgaW4KKyAqIG11bHRpcGxpY2F0aXZlIGdyb3Vwcy4gKi8KKworCisvKiBBbGxvY2F0aW9uIGFuZCBkZXN0cnVjdGlvbi4gKi8KKworLyogREhfbmV3IHJldHVybnMgYSBuZXcsIGVtcHR5IERIIG9iamVjdCBvciBOVUxMIG9uIGVycm9yLiAqLworREggKkRIX25ldyh2b2lkKTsKKworLyogREhfbmV3X21ldGhvZCBhY3RzIHRoZSBzYW1lIGFzIHxESF9uZXd8IGJ1dCB0YWtlcyBhbiBleHBsaWNpdCB8RU5HSU5FfC4gKi8KK0RIICpESF9uZXdfbWV0aG9kKGNvbnN0IEVOR0lORSAqZW5naW5lKTsKKworLyogREhfZnJlZSBkZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgb2YgfGRofCBhbmQgZnJlZXMgaXQgaWYgdGhlIHJlZmVyZW5jZQorICogY291bnQgZHJvcHMgdG8gemVyby4gKi8KK3ZvaWQgREhfZnJlZShESCAqZGgpOworCisvKiBESF91cF9yZWYgaW5jcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHxkaHwuICovCitpbnQgREhfdXBfcmVmKERIICpkaCk7CisKKworLyogU3RhbmRhcmQgcGFyYW1ldGVycy4KKyAqCisgKiBUaGVzZSBmdW5jdGlvbnMgcmV0dXJuIG5ldyBESCBvYmplY3RzIHdpdGggc3RhbmRhcmQgcGFyYW1ldGVycyBjb25maWd1cmVkCisgKiB0aGF0IHVzZSB0aGUgZ2l2ZW4gRU5HSU5FLCB3aGljaCBtYXkgYmUgTlVMTC4gVGhleSByZXR1cm4gTlVMTCBvbiBhbGxvY2F0aW9uCisgKiBmYWlsdXJlLiAqLworCisvKiBUaGVzZSBwYXJhbWV0ZXJzIGFyZSB0YWtlbiBmcm9tIFJGQyA1MTE0LiAqLworCitESCAqREhfZ2V0XzEwMjRfMTYwKGNvbnN0IEVOR0lORSAqZW5naW5lKTsKK0RIICpESF9nZXRfMjA0OF8yMjQoY29uc3QgRU5HSU5FICplbmdpbmUpOworREggKkRIX2dldF8yMDQ4XzI1Nihjb25zdCBFTkdJTkUgKmVuZ2luZSk7CisKKworLyogUGFyYW1ldGVyIGdlbmVyYXRpb24uICovCisKKyNkZWZpbmUgREhfR0VORVJBVE9SXzIgMgorI2RlZmluZSBESF9HRU5FUkFUT1JfNSA1CisKKy8qIERIX2dlbmVyYXRlX3BhcmFtZXRlcnNfZXggZ2VuZXJhdGVzIGEgc3VpdGFibGUgRGlmZmllLUhlbGxtYW4gZ3JvdXAgd2l0aCBhCisgKiBwcmltZSB0aGF0IGlzIHxwcmltZV9iaXRzfCBsb25nIGFuZCBzdG9yZXMgaXQgaW4gfGRofC4gVGhlIGdlbmVyYXRvciBvZiB0aGUKKyAqIGdyb3VwIHdpbGwgYmUgfGdlbmVyYXRvcnwsIHdoaWNoIHNob3VsZCBiZSB8REhfR0VORVJBVE9SXzJ8IHVubGVzcyB0aGVyZSdzIGEKKyAqIGdvb2QgcmVhc29uIHRvIHVzZSBhIGRpZmZlcmVudCB2YWx1ZS4gVGhlIHxjYnwgYXJndW1lbnQgY29udGFpbnMgYSBjYWxsYmFjaworICogZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBkdXJpbmcgdGhlIGdlbmVyYXRpb24uIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBpbgorICogfGJuLmh8IGFib3V0IHRoaXMuIEluIGFkZGl0aW9uIHRvIHRoZSBjYWxsYmFjayBpbnZvY2F0aW9ucyBmcm9tIHxCTnwsIHxjYnwKKyAqIHdpbGwgYWxzbyBiZSBjYWxsZWQgd2l0aCB8ZXZlbnR8IGVxdWFsIHRvIHRocmVlIHdoZW4gdGhlIGdlbmVyYXRpb24gaXMKKyAqIGNvbXBsZXRlLiAqLworaW50IERIX2dlbmVyYXRlX3BhcmFtZXRlcnNfZXgoREggKmRoLCBpbnQgcHJpbWVfYml0cywgaW50IGdlbmVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJOX0dFTkNCICpjYik7CisKKworLyogRGlmZmllLUhlbGxtYW4gb3BlcmF0aW9ucy4gKi8KKworLyogREhfZ2VuZXJhdGVfa2V5IGdlbmVyYXRlcyBhIG5ldywgcmFuZG9tLCBwcml2YXRlIGtleSBhbmQgc3RvcmVzIGl0IGluCisgKiB8ZGh8LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG9uIGVycm9yLiAqLworaW50IERIX2dlbmVyYXRlX2tleShESCAqZGgpOworCisvKiBESF9jb21wdXRlX2tleSBjYWxjdWxhdGVzIHRoZSBzaGFyZWQga2V5IGJldHdlZW4gfGRofCBhbmQgfHBlZXJzX2tleXwgYW5kCisgKiB3cml0ZXMgaXQgYXMgYSBiaWctZW5kaWFuIGludGVnZXIgaW50byB8b3V0fCwgd2hpY2ggbXVzdCBoYXZlIHxESF9zaXplfAorICogYnl0ZXMgb2Ygc3BhY2UuIEl0IHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLCBvciBhIG5lZ2F0aXZlIG51bWJlcgorICogb24gZXJyb3IuICovCitzc2l6ZV90IERIX2NvbXB1dGVfa2V5KHVpbnQ4X3QgKm91dCwgY29uc3QgQklHTlVNICpwZWVyc19rZXksIERIICpkaCk7CisKKworLyogVXRpbGl0eSBmdW5jdGlvbnMuICovCisKKy8qIERIX3NpemUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBESCBncm91cCdzIHByaW1lLiAqLworaW50IERIX3NpemUoY29uc3QgREggKmRoKTsKKworI2RlZmluZSBESF9DSEVDS19QX05PVF9QUklNRSAweDAxCisjZGVmaW5lIERIX0NIRUNLX1BfTk9UX1NBRkVfUFJJTUUgMHgwMgorI2RlZmluZSBESF9DSEVDS19VTkFCTEVfVE9fQ0hFQ0tfR0VORVJBVE9SIDB4MDQKKyNkZWZpbmUgREhfQ0hFQ0tfTk9UX1NVSVRBQkxFX0dFTkVSQVRPUiAweDA4CisjZGVmaW5lIERIX0NIRUNLX1FfTk9UX1BSSU1FIDB4MTAKKyNkZWZpbmUgREhfQ0hFQ0tfSU5WQUxJRF9RX1ZBTFVFIDB4MjAKKyNkZWZpbmUgREhfQ0hFQ0tfSU5WQUxJRF9KX1ZBTFVFIDB4NDAKKworLyogREhfY2hlY2sgY2hlY2tzIHRoZSBzdWl0YWJpbGl0eSBvZiB8ZGh8IGFzIGEgRGlmZmllLUhlbGxtYW4gZ3JvdXAuIGFuZCBzZXRzCisgKiB8REhfQ0hFQ0tfKnwgZmxhZ3MgaW4gfCpvdXRfZmxhZ3N8IGlmIGl0IGZpbmRzIGFueSBlcnJvcnMuIEl0IHJldHVybnMgb25lIGlmCisgKiB8Km91dF9mbGFnc3wgd2FzIHN1Y2Nlc3NmdWxseSBzZXQgYW5kIHplcm8gb24gZXJyb3IuCisgKgorICogTm90ZTogdGhlc2UgY2hlY2tzIG1heSBiZSBxdWl0ZSBjb21wdXRhdGlvbmFsbHkgZXhwZW5zaXZlLiAqLworaW50IERIX2NoZWNrKGNvbnN0IERIICpkaCwgaW50ICpvdXRfZmxhZ3MpOworCisjZGVmaW5lIERIX0NIRUNLX1BVQktFWV9UT09fU01BTEwgMQorI2RlZmluZSBESF9DSEVDS19QVUJLRVlfVE9PX0xBUkdFIDIKKworLyogREhfY2hlY2tfcHViX2tleSBjaGVja3MgdGhlIHN1aXRhYmlsaXR5IG9mIHxwdWJfa2V5fCBhcyBhIHB1YmxpYyBrZXkgZm9yIHRoZQorICogREggZ3JvdXAgaW4gfGRofCBhbmQgc2V0cyB8REhfQ0hFQ0tfUFVCS0VZXyp8IGZsYWdzIGluIHwqb3V0X2ZsYWdzfCBpZiBpdAorICogZmluZHMgYW55IGVycm9ycy4gSXQgcmV0dXJucyBvbmUgaWYgfCpvdXRfZmxhZ3N8IHdhcyBzdWNjZXNzZnVsbHkgc2V0IGFuZAorICogemVybyBvbiBlcnJvci4gKi8KK2ludCBESF9jaGVja19wdWJfa2V5KGNvbnN0IERIICpkaCwgY29uc3QgQklHTlVNICpwdWJfa2V5LCBpbnQgKm91dF9mbGFncyk7CisKKy8qIERIcGFyYW1zX2R1cCBhbGxvY2F0ZXMgYSBmcmVzaCB8REh8IGFuZCBjb3BpZXMgdGhlIHBhcmFtZXRlcnMgZnJvbSB8ZGh8IGludG8KKyAqIGl0LiBJdCByZXR1cm5zIHRoZSBuZXcgfERIfCBvciBOVUxMIG9uIGVycm9yLiAqLworREggKkRIcGFyYW1zX2R1cChjb25zdCBESCAqZGgpOworCisKKy8qIEFTTi4xIGZ1bmN0aW9ucy4gKi8KKworLyogZDJpX0RIcGFyYW1zIHBhcnNlcyBhbiBBU04uMSwgREVSIGVuY29kZWQgRGlmZmllLUhlbGxtYW4gcGFyYW1ldGVycworICogc3RydWN0dXJlIGZyb20gfGxlbnwgYnl0ZXMgYXQgfCppbnB8LiBJZiB8cmV0fCBpcyBub3QgTlVMTCB0aGVuLCBvbiBleGl0LCBhCisgKiBwb2ludGVyIHRvIHRoZSByZXN1bHQgaXMgaW4gfCpyZXR8LiBJZiB8KnJldHwgaXMgYWxyZWFkeSBub24tTlVMTCBvbiBlbnRyeQorICogdGhlbiB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4gZGlyZWN0bHkgaW50byB8KnJldHwsIG90aGVyd2lzZSBhIGZyZXNoIHxESHwgaXMKKyAqIGFsbG9jYXRlZC4gT24gc3VjY2Vzc2Z1bCBleGl0LCB8KmlucHwgaXMgYWR2YW5jZWQgcGFzdCB0aGUgREVSIHN0cnVjdHVyZS4gSXQKKyAqIHJldHVybnMgdGhlIHJlc3VsdCBvciBOVUxMIG9uIGVycm9yLiAqLworREggKmQyaV9ESHBhcmFtcyhESCAqKnJldCwgY29uc3QgdW5zaWduZWQgY2hhciAqKmlucCwgbG9uZyBsZW4pOworCisvKiBpMmRfREhwYXJhbXMgbWFyc2hhbHMgfGlufCB0byBhbiBBU04uMSwgREVSIHN0cnVjdHVyZS4gSWYgfG91dHB8IGlzIG5vdCBOVUxMCisgKiB0aGVuIHRoZSByZXN1bHQgaXMgd3JpdHRlbiB0byB8Km91dHB8IGFuZCB8Km91dHB8IGlzIGFkdmFuY2VkIGp1c3QgcGFzdCB0aGUKKyAqIG91dHB1dC4gSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSByZXN1bHQsIHdoZXRoZXIgd3JpdHRlbiBvcgorICogbm90LCBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yLiAqLworaW50IGkyZF9ESHBhcmFtcyhjb25zdCBESCAqaW4sIHVuc2lnbmVkIGNoYXIgKipvdXRwKTsKKworCisvKiBleF9kYXRhIGZ1bmN0aW9ucy4KKyAqCisgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIHdyYXBwZXJzLiBTZWUgfGV4X2RhdGEuaHwgZm9yIGRldGFpbHMuICovCisKK2ludCBESF9nZXRfZXhfbmV3X2luZGV4KGxvbmcgYXJnbCwgdm9pZCAqYXJncCwgQ1JZUFRPX0VYX25ldyAqbmV3X2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICBDUllQVE9fRVhfZHVwICpkdXBfZnVuYywgQ1JZUFRPX0VYX2ZyZWUgKmZyZWVfZnVuYyk7CitpbnQgREhfc2V0X2V4X2RhdGEoREggKmQsIGludCBpZHgsIHZvaWQgKmFyZyk7Cit2b2lkICpESF9nZXRfZXhfZGF0YShESCAqZCwgaW50IGlkeCk7CisKKworLyogZGhfbWV0aG9kIGNvbnRhaW5zIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIG92ZXJyaWRlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBESC4KKyAqIFNlZSB8ZW5naW5lLmh8IGZvciBkZXRhaWxzLiAqLworc3RydWN0IGRoX21ldGhvZCB7CisgIHN0cnVjdCBvcGVuc3NsX21ldGhvZF9jb21tb25fc3QgY29tbW9uOworCisgIC8qIGFwcF9kYXRhIGlzIGFuIG9wYXF1ZSBwb2ludGVyIGZvciB0aGUgbWV0aG9kIHRvIHVzZS4gKi8KKyAgdm9pZCAqYXBwX2RhdGE7CisKKyAgLyogaW5pdCBpcyBjYWxsZWQganVzdCBiZWZvcmUgdGhlIHJldHVybiBvZiB8REhfbmV3X21ldGhvZHwuIEl0IHJldHVybnMgb25lCisgICAqIG9uIHN1Y2Nlc3Mgb3IgemVybyBvbiBlcnJvci4gKi8KKyAgaW50ICgqaW5pdCkoREggKmRoKTsKKworICAvKiBmaW5pc2ggaXMgY2FsbGVkIGJlZm9yZSB8ZGh8IGlzIGRlc3RydWN0ZWQuICovCisgIHZvaWQgKCpmaW5pc2gpKERIICpkaCk7CisKKyAgLyogZ2VuZXJhdGVfcGFyYW1ldGVycyBpcyBjYWxsZWQgYnkgfERIX2dlbmVyYXRlX3BhcmFtZXRlcnNfZXh8LiAqLworICBpbnQgKCpnZW5lcmF0ZV9wYXJhbWV0ZXJzKShESCAqZGgsIGludCBwcmltZV9iaXRzLCBpbnQgZ2VuZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTl9HRU5DQiAqY2IpOworCisgIC8qIGdlbmVyYXRlX3BhcmFtZXRlcnMgaXMgY2FsbGVkIGJ5IHxESF9nZW5lcmF0ZV9rZXl8LiAqLworICBpbnQgKCpnZW5lcmF0ZV9rZXkpKERIICpkaCk7CisKKyAgLyogZ2VuZXJhdGVfcGFyYW1ldGVycyBpcyBjYWxsZWQgYnkgfERIX2NvbXB1dGVfa2V5fC4gKi8KKyAgc3NpemVfdCAoKmNvbXB1dGVfa2V5KShESCAqZGgsIHVpbnQ4X3QgKm91dCwgY29uc3QgQklHTlVNICpwdWJfa2V5KTsKK307CisKK3N0cnVjdCBkaF9zdCB7CisgIERIX01FVEhPRCAqbWV0aDsKKworICBCSUdOVU0gKnA7CisgIEJJR05VTSAqZzsKKyAgQklHTlVNICpwdWJfa2V5OyAgLyogZ154ICovCisgIEJJR05VTSAqcHJpdl9rZXk7IC8qIHggKi8KKworICAvKiBwcml2X2xlbmd0aCBjb250YWlucyB0aGUgbGVuZ3RoLCBpbiBiaXRzLCBvZiB0aGUgcHJpdmF0ZSB2YWx1ZS4gSWYgemVybywKKyAgICogdGhlIHByaXZhdGUgdmFsdWUgd2lsbCBiZSB0aGUgc2FtZSBsZW5ndGggYXMgfHB8LiAqLworICB1bnNpZ25lZCBwcml2X2xlbmd0aDsKKyAgQk5fTU9OVF9DVFggKm1ldGhvZF9tb250X3A7CisKKyAgLyogUGxhY2UgaG9sZGVycyBpZiB3ZSB3YW50IHRvIGRvIFg5LjQyIERIICovCisgIEJJR05VTSAqcTsKKyAgQklHTlVNICpqOworICB1bnNpZ25lZCBjaGFyICpzZWVkOworICBpbnQgc2VlZGxlbjsKKyAgQklHTlVNICpjb3VudGVyOworCisgIGludCBmbGFnczsKKyAgaW50IHJlZmVyZW5jZXM7CisgIENSWVBUT19FWF9EQVRBIGV4X2RhdGE7Cit9OworCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfSAgLyogZXh0ZXJuIEMgKi8KKyNlbmRpZgorCisjZGVmaW5lIERIX0ZfZ2VuZXJhdGVfcGFyYW1ldGVycyAxMDAKKyNkZWZpbmUgREhfRl9nZW5lcmF0ZV9rZXkgMTAxCisjZGVmaW5lIERIX0ZfY29tcHV0ZV9rZXkgMTAyCisjZGVmaW5lIERIX0ZfREhfbmV3X21ldGhvZCAxMDMKKyNkZWZpbmUgREhfUl9JTlZBTElEX1BVQktFWSAxMDAKKyNkZWZpbmUgREhfUl9CQURfR0VORVJBVE9SIDEwMQorI2RlZmluZSBESF9SX01PRFVMVVNfVE9PX0xBUkdFIDEwMgorI2RlZmluZSBESF9SX05PX1BSSVZBVEVfVkFMVUUgMTAzCisKKyNlbmRpZiAgLyogT1BFTlNTTF9IRUFERVJfREhfSCAqLwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2RoL2RoX2FzbjEuYyBiL2NyeXB0by9kaC9kaF9hc24xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNjZDRkZgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9kaC9kaF9hc24xLmMKQEAgLTAsMCArMSw4NCBAQAorLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDAuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2RoLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+CisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisvKiBPdmVycmlkZSB0aGUgZGVmYXVsdCBmcmVlIGFuZCBuZXcgbWV0aG9kcyAqLworc3RhdGljIGludCBkaF9jYihpbnQgb3BlcmF0aW9uLCBBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9JVEVNICppdCwKKyAgICAgICAgICAgICAgICAgdm9pZCAqZXhhcmcpIHsKKyAgaWYgKG9wZXJhdGlvbiA9PSBBU04xX09QX05FV19QUkUpIHsKKyAgICAqcHZhbCA9IChBU04xX1ZBTFVFICopREhfbmV3KCk7CisgICAgaWYgKCpwdmFsKSB7CisgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSBpZiAob3BlcmF0aW9uID09IEFTTjFfT1BfRlJFRV9QUkUpIHsKKyAgICBESF9mcmVlKChESCAqKSpwdmFsKTsKKyAgICAqcHZhbCA9IE5VTEw7CisgICAgcmV0dXJuIDI7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK0FTTjFfU0VRVUVOQ0VfY2IoREhwYXJhbXMsIGRoX2NiKSA9IHsKKyAgICBBU04xX1NJTVBMRShESCwgcCwgQklHTlVNKSwgQVNOMV9TSU1QTEUoREgsIGcsIEJJR05VTSksCisgICAgQVNOMV9PUFQoREgsIHByaXZfbGVuZ3RoLCBaTE9ORyl9IEFTTjFfU0VRVUVOQ0VfRU5EX2NiKERILCBESHBhcmFtcyk7CisKK0lNUExFTUVOVF9BU04xX0VOQ09ERV9GVU5DVElPTlNfY29uc3RfZm5hbWUoREgsIERIcGFyYW1zLCBESHBhcmFtcykKZGlmZiAtLWdpdCBhL2NyeXB0by9kaC9kaF9lcnJvci5jIGIvY3J5cHRvL2RoL2RoX2Vycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE3MDQxYwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9kaC9kaF9lcnJvci5jCkBAIC0wLDAgKzEsMjkgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNCwgR29vZ2xlIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisKKyNpbmNsdWRlICJkaC5oIgorCitjb25zdCBFUlJfU1RSSU5HX0RBVEEgREhfZXJyb3Jfc3RyaW5nX2RhdGFbXSA9IHsKKyAge0VSUl9QQUNLKEVSUl9MSUJfREgsIERIX0ZfREhfbmV3X21ldGhvZCwgMCksICJESF9uZXdfbWV0aG9kIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0RILCBESF9GX2NvbXB1dGVfa2V5LCAwKSwgImNvbXB1dGVfa2V5In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0RILCBESF9GX2dlbmVyYXRlX2tleSwgMCksICJnZW5lcmF0ZV9rZXkifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfREgsIERIX0ZfZ2VuZXJhdGVfcGFyYW1ldGVycywgMCksICJnZW5lcmF0ZV9wYXJhbWV0ZXJzIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0RILCAwLCBESF9SX0JBRF9HRU5FUkFUT1IpLCAiQkFEX0dFTkVSQVRPUiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9ESCwgMCwgREhfUl9JTlZBTElEX1BVQktFWSksICJJTlZBTElEX1BVQktFWSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9ESCwgMCwgREhfUl9NT0RVTFVTX1RPT19MQVJHRSksICJNT0RVTFVTX1RPT19MQVJHRSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9ESCwgMCwgREhfUl9OT19QUklWQVRFX1ZBTFVFKSwgIk5PX1BSSVZBVEVfVkFMVUUifSwKKyAgezAsIE5VTEx9LAorfTsKZGlmZiAtLWdpdCBhL2NyeXB0by9kaC9kaF9pbXBsLmMgYi9jcnlwdG8vZGgvZGhfaW1wbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYzNkYjcKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vZGgvZGhfaW1wbC5jCkBAIC0wLDAgKzEsMzIzIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9kaC5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIE9QRU5TU0xfREhfTUFYX01PRFVMVVNfQklUUyAxMDAwMAorCitzdGF0aWMgaW50IGdlbmVyYXRlX3BhcmFtZXRlcnMoREggKnJldCwgaW50IHByaW1lX2JpdHMsIGludCBnZW5lcmF0b3IsIEJOX0dFTkNCICpjYikgeworICAvKiBXZSBnZW5lcmF0ZSBESCBwYXJhbWV0ZXJzIGFzIGZvbGxvd3MKKyAgICogZmluZCBhIHByaW1lIHEgd2hpY2ggaXMgcHJpbWVfYml0cy8yIGJpdHMgbG9uZy4KKyAgICogcD0oMipxKSsxIG9yIChwLTEpLzIgPSBxCisgICAqIEZvciB0aGlzIGNhc2UsIGcgaXMgYSBnZW5lcmF0b3IgaWYKKyAgICogZ14oKHAtMSkvcSkgbW9kIHAgIT0gMSBmb3IgdmFsdWVzIG9mIHEgd2hpY2ggYXJlIHRoZSBmYWN0b3JzIG9mIHAtMS4KKyAgICogU2luY2UgdGhlIGZhY3RvcnMgb2YgcC0xIGFyZSBxIGFuZCAyLCB3ZSBqdXN0IG5lZWQgdG8gY2hlY2sKKyAgICogZ14yIG1vZCBwICE9IDEgYW5kIGdecSBtb2QgcCAhPSAxLgorICAgKgorICAgKiBIYXZpbmcgc2FpZCBhbGwgdGhhdCwKKyAgICogdGhlcmUgaXMgYW5vdGhlciBzcGVjaWFsIGNhc2UgbWV0aG9kIGZvciB0aGUgZ2VuZXJhdG9ycyAyLCAzIGFuZCA1LgorICAgKiBmb3IgMiwgcCBtb2QgMjQgPT0gMTEKKyAgICogZm9yIDMsIHAgbW9kIDEyID09IDUgIDw8PDw8IGRvZXMgbm90IHdvcmsgZm9yIHNhZmUgcHJpbWVzLgorICAgKiBmb3IgNSwgcCBtb2QgMTAgPT0gMyBvciA3CisgICAqCisgICAqIFRoYW5rcyB0byBQaGlsIEthcm4gPGthcm5AcXVhbGNvbW0uY29tPiBmb3IgdGhlIHBvaW50ZXJzIGFib3V0IHRoZQorICAgKiBzcGVjaWFsIGdlbmVyYXRvcnMgYW5kIGZvciBhbnN3ZXJpbmcgc29tZSBvZiBteSBxdWVzdGlvbnMuCisgICAqCisgICAqIEkndmUgaW1wbGVtZW50ZWQgdGhlIHNlY29uZCBzaW1wbGUgbWV0aG9kIDotKS4KKyAgICogU2luY2UgREggc2hvdWxkIGJlIHVzaW5nIGEgc2FmZSBwcmltZSAoYm90aCBwIGFuZCBxIGFyZSBwcmltZSksCisgICAqIHRoaXMgZ2VuZXJhdG9yIGZ1bmN0aW9uIGNhbiB0YWtlIGEgdmVyeSB2ZXJ5IGxvbmcgdGltZSB0byBydW4uCisgICAqLworCisgIC8qIEFjdHVhbGx5IHRoZXJlIGlzIG5vIHJlYXNvbiB0byBpbnNpc3QgdGhhdCAnZ2VuZXJhdG9yJyBiZSBhIGdlbmVyYXRvci4KKyAgICogSXQncyBqdXN0IGFzIE9LIChhbmQgaW4gc29tZSBzZW5zZSBiZXR0ZXIpIHRvIHVzZSBhIGdlbmVyYXRvciBvZiB0aGUKKyAgICogb3JkZXItcSBzdWJncm91cC4KKyAgICovCisKKyAgQklHTlVNICp0MSwgKnQyOworICBpbnQgZywgb2sgPSAwOworICBCTl9DVFggKmN0eCA9IE5VTEw7CisKKyAgY3R4ID0gQk5fQ1RYX25ldygpOworICBpZiAoY3R4ID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorICBCTl9DVFhfc3RhcnQoY3R4KTsKKyAgdDEgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIHQyID0gQk5fQ1RYX2dldChjdHgpOworICBpZiAodDEgPT0gTlVMTCB8fCB0MiA9PSBOVUxMKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICAvKiBNYWtlIHN1cmUgJ3JldCcgaGFzIHRoZSBuZWNlc3NhcnkgZWxlbWVudHMgKi8KKyAgaWYgKCFyZXQtPnAgJiYgKChyZXQtPnAgPSBCTl9uZXcoKSkgPT0gTlVMTCkpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorICBpZiAoIXJldC0+ZyAmJiAoKHJldC0+ZyA9IEJOX25ldygpKSA9PSBOVUxMKSkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKGdlbmVyYXRvciA8PSAxKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoREgsIGdlbmVyYXRlX3BhcmFtZXRlcnMsIERIX1JfQkFEX0dFTkVSQVRPUik7CisgICAgZ290byBlcnI7CisgIH0KKyAgaWYgKGdlbmVyYXRvciA9PSBESF9HRU5FUkFUT1JfMikgeworICAgIGlmICghQk5fc2V0X3dvcmQodDEsIDI0KSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICAgIGlmICghQk5fc2V0X3dvcmQodDIsIDExKSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICAgIGcgPSAyOworICB9IGVsc2UgaWYgKGdlbmVyYXRvciA9PSBESF9HRU5FUkFUT1JfNSkgeworICAgIGlmICghQk5fc2V0X3dvcmQodDEsIDEwKSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICAgIGlmICghQk5fc2V0X3dvcmQodDIsIDMpKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgLyogQk5fc2V0X3dvcmQodDMsNyk7IGp1c3QgaGF2ZSB0byBtaXNzCisgICAgICogb3V0IG9uIHRoZXNlIG9uZXMgOi0oICovCisgICAgZyA9IDU7CisgIH0gZWxzZSB7CisgICAgLyogaW4gdGhlIGdlbmVyYWwgY2FzZSwgZG9uJ3Qgd29ycnkgaWYgJ2dlbmVyYXRvcicgaXMgYQorICAgICAqIGdlbmVyYXRvciBvciBub3Q6IHNpbmNlIHdlIGFyZSB1c2luZyBzYWZlIHByaW1lcywKKyAgICAgKiBpdCB3aWxsIGdlbmVyYXRlIGVpdGhlciBhbiBvcmRlci1xIG9yIGFuIG9yZGVyLTJxIGdyb3VwLAorICAgICAqIHdoaWNoIGJvdGggaXMgT0sgKi8KKyAgICBpZiAoIUJOX3NldF93b3JkKHQxLCAyKSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICAgIGlmICghQk5fc2V0X3dvcmQodDIsIDEpKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgZyA9IGdlbmVyYXRvcjsKKyAgfQorCisgIGlmICghQk5fZ2VuZXJhdGVfcHJpbWVfZXgocmV0LT5wLCBwcmltZV9iaXRzLCAxLCB0MSwgdDIsIGNiKSkgeworICAgIGdvdG8gZXJyOworICB9CisgIGlmICghQk5fR0VOQ0JfY2FsbChjYiwgMywgMCkpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorICBpZiAoIUJOX3NldF93b3JkKHJldC0+ZywgZykpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorICBvayA9IDE7CisKK2VycjoKKyAgaWYgKCFvaykgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKERILCBnZW5lcmF0ZV9wYXJhbWV0ZXJzLCBFUlJfUl9CTl9MSUIpOworICB9CisKKyAgaWYgKGN0eCAhPSBOVUxMKSB7CisgICAgQk5fQ1RYX2VuZChjdHgpOworICAgIEJOX0NUWF9mcmVlKGN0eCk7CisgIH0KKyAgcmV0dXJuIG9rOworfQorCitzdGF0aWMgaW50IGdlbmVyYXRlX2tleShESCAqZGgpIHsKKyAgaW50IG9rID0gMDsKKyAgaW50IGdlbmVyYXRlX25ld19rZXkgPSAwOworICB1bnNpZ25lZCBsOworICBCTl9DVFggKmN0eDsKKyAgQk5fTU9OVF9DVFggKm1vbnQgPSBOVUxMOworICBCSUdOVU0gKnB1Yl9rZXkgPSBOVUxMLCAqcHJpdl9rZXkgPSBOVUxMOworICBCSUdOVU0gbG9jYWxfcHJpdjsKKworICBjdHggPSBCTl9DVFhfbmV3KCk7CisgIGlmIChjdHggPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKGRoLT5wcml2X2tleSA9PSBOVUxMKSB7CisgICAgcHJpdl9rZXkgPSBCTl9uZXcoKTsKKyAgICBpZiAocHJpdl9rZXkgPT0gTlVMTCkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICAgIGdlbmVyYXRlX25ld19rZXkgPSAxOworICB9IGVsc2UgeworICAgIHByaXZfa2V5ID0gZGgtPnByaXZfa2V5OworICB9CisKKyAgaWYgKGRoLT5wdWJfa2V5ID09IE5VTEwpIHsKKyAgICBwdWJfa2V5ID0gQk5fbmV3KCk7CisgICAgaWYgKHB1Yl9rZXkgPT0gTlVMTCkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICB9IGVsc2UgeworICAgIHB1Yl9rZXkgPSBkaC0+cHViX2tleTsKKyAgfQorCisgIG1vbnQgPQorICAgICAgQk5fTU9OVF9DVFhfc2V0X2xvY2tlZCgmZGgtPm1ldGhvZF9tb250X3AsIENSWVBUT19MT0NLX0RILCBkaC0+cCwgY3R4KTsKKyAgaWYgKCFtb250KSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAoZ2VuZXJhdGVfbmV3X2tleSkgeworICAgIGlmIChkaC0+cSkgeworICAgICAgZG8geworICAgICAgICBpZiAoIUJOX3JhbmRfcmFuZ2UocHJpdl9rZXksIGRoLT5xKSkgeworICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICB9CisgICAgICB9IHdoaWxlIChCTl9pc196ZXJvKHByaXZfa2V5KSB8fCBCTl9pc19vbmUocHJpdl9rZXkpKTsKKyAgICB9IGVsc2UgeworICAgICAgLyogc2VjcmV0IGV4cG9uZW50IGxlbmd0aCAqLworICAgICAgbCA9IGRoLT5wcml2X2xlbmd0aCA/IGRoLT5wcml2X2xlbmd0aCA6IEJOX251bV9iaXRzKGRoLT5wKSAtIDE7CisgICAgICBpZiAoIUJOX3JhbmQocHJpdl9rZXksIGwsIDAsIDApKSB7CisgICAgICAgIGdvdG8gZXJyOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEJOX3dpdGhfZmxhZ3MoJmxvY2FsX3ByaXYsIHByaXZfa2V5LCBCTl9GTEdfQ09OU1RUSU1FKTsKKyAgaWYgKCFCTl9tb2RfZXhwX21vbnQocHViX2tleSwgZGgtPmcsICZsb2NhbF9wcml2LCBkaC0+cCwgY3R4LCBtb250KSkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgZGgtPnB1Yl9rZXkgPSBwdWJfa2V5OworICBkaC0+cHJpdl9rZXkgPSBwcml2X2tleTsKKyAgb2sgPSAxOworCitlcnI6CisgIGlmIChvayAhPSAxKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoREgsIGdlbmVyYXRlX2tleSwgRVJSX1JfQk5fTElCKTsKKyAgfQorCisgIGlmIChwdWJfa2V5ICE9IE5VTEwgJiYgZGgtPnB1Yl9rZXkgPT0gTlVMTCkgeworICAgIEJOX2ZyZWUocHViX2tleSk7CisgIH0KKyAgaWYgKHByaXZfa2V5ICE9IE5VTEwgJiYgZGgtPnByaXZfa2V5ID09IE5VTEwpIHsKKyAgICBCTl9mcmVlKHByaXZfa2V5KTsKKyAgfQorICBCTl9DVFhfZnJlZShjdHgpOworICByZXR1cm4gb2s7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNvbXB1dGVfa2V5KERIICpkaCwgdW5zaWduZWQgY2hhciAqb3V0LCBjb25zdCBCSUdOVU0gKnB1Yl9rZXkpIHsKKyAgQk5fQ1RYICpjdHggPSBOVUxMOworICBCTl9NT05UX0NUWCAqbW9udCA9IE5VTEw7CisgIEJJR05VTSAqc2hhcmVkX2tleTsKKyAgaW50IHJldCA9IC0xOworICBpbnQgY2hlY2tfcmVzdWx0OworICBCSUdOVU0gbG9jYWxfcHJpdjsKKworICBpZiAoQk5fbnVtX2JpdHMoZGgtPnApID4gT1BFTlNTTF9ESF9NQVhfTU9EVUxVU19CSVRTKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoREgsIGNvbXB1dGVfa2V5LCBESF9SX01PRFVMVVNfVE9PX0xBUkdFKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGN0eCA9IEJOX0NUWF9uZXcoKTsKKyAgaWYgKGN0eCA9PSBOVUxMKSB7CisgICAgZ290byBlcnI7CisgIH0KKyAgQk5fQ1RYX3N0YXJ0KGN0eCk7CisgIHNoYXJlZF9rZXkgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIGlmIChzaGFyZWRfa2V5ID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmIChkaC0+cHJpdl9rZXkgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKERILCBjb21wdXRlX2tleSwgREhfUl9OT19QUklWQVRFX1ZBTFVFKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIG1vbnQgPQorICAgICAgQk5fTU9OVF9DVFhfc2V0X2xvY2tlZCgmZGgtPm1ldGhvZF9tb250X3AsIENSWVBUT19MT0NLX0RILCBkaC0+cCwgY3R4KTsKKyAgaWYgKCFtb250KSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAoIURIX2NoZWNrX3B1Yl9rZXkoZGgsIHB1Yl9rZXksICZjaGVja19yZXN1bHQpIHx8IGNoZWNrX3Jlc3VsdCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKERILCBjb21wdXRlX2tleSwgREhfUl9JTlZBTElEX1BVQktFWSk7CisgICAgZ290byBlcnI7CisgIH0KKworICBCTl93aXRoX2ZsYWdzKCZsb2NhbF9wcml2LCBkaC0+cHJpdl9rZXksIEJOX0ZMR19DT05TVFRJTUUpOworICBpZiAoIUJOX21vZF9leHBfbW9udChzaGFyZWRfa2V5LCBwdWJfa2V5LCAmbG9jYWxfcHJpdiwgZGgtPnAsIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgbW9udCkpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihESCwgY29tcHV0ZV9rZXksIEVSUl9SX0JOX0xJQik7CisgICAgZ290byBlcnI7CisgIH0KKworICByZXQgPSBCTl9ibjJiaW4oc2hhcmVkX2tleSwgb3V0KTsKKworZXJyOgorICBpZiAoY3R4ICE9IE5VTEwpIHsKKyAgICBCTl9DVFhfZW5kKGN0eCk7CisgICAgQk5fQ1RYX2ZyZWUoY3R4KTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK2NvbnN0IHN0cnVjdCBkaF9tZXRob2QgREhfZGVmYXVsdF9tZXRob2QgPSB7CisgIHsKKyAgICAwIC8qIHJlZmVyZW5jZXMgKi8sCisgICAgMSAvKiBpc19zdGF0aWMgKi8sCisgIH0sCisgIE5VTEwgLyogYXBwX2RhdGEgKi8sCisgIE5VTEwgLyogaW5pdCAqLywKKyAgTlVMTCAvKiBmaW5pc2ggKi8sCisgIGdlbmVyYXRlX3BhcmFtZXRlcnMsCisgIGdlbmVyYXRlX2tleSwKKyAgY29tcHV0ZV9rZXksCit9OwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2RoL2RoX3Rlc3QuYyBiL2NyeXB0by9kaC9kaF90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNkYmJhOQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9kaC9kaF90ZXN0LmMKQEAgLTAsMCArMSw0OTggQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2RoLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKworI2luY2x1ZGUgImludGVybmFsLmgiCisKKworc3RhdGljIGludCBjYihpbnQgcCwgaW50IG4sIEJOX0dFTkNCICphcmcpIHsKKyAgY2hhciBjID0gJyonOworCisgIGlmIChwID09IDApCisgICAgYyA9ICcuJzsKKyAgaWYgKHAgPT0gMSkKKyAgICBjID0gJysnOworICBpZiAocCA9PSAyKQorICAgIGMgPSAnKic7CisgIGlmIChwID09IDMpCisgICAgYyA9ICdcbic7CisgIEJJT193cml0ZShhcmctPmFyZywgJmMsIDEpOworICAodm9pZClCSU9fZmx1c2goYXJnLT5hcmcpOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHJ1bl9yZmM1MTE0X3Rlc3RzKHZvaWQpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CisgIEJOX0dFTkNCIF9jYjsKKyAgREggKmE7CisgIERIICpiID0gTlVMTDsKKyAgY2hhciBidWZbMTJdOworICB1bnNpZ25lZCBjaGFyICphYnVmID0gTlVMTCwgKmJidWYgPSBOVUxMOworICBpbnQgaSwgYWxlbiwgYmxlbiwgYW91dCwgYm91dCwgcmV0ID0gMTsKKyAgQklPICpvdXQ7CisKKyAgb3V0ID0gQklPX25ldyhCSU9fc19maWxlKCkpOworICBpZiAob3V0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICBCSU9fc2V0X2ZwKG91dCwgc3Rkb3V0LCBCSU9fTk9DTE9TRSk7CisKKyAgQk5fR0VOQ0Jfc2V0KCZfY2IsICZjYiwgb3V0KTsKKyAgaWYgKCgoYSA9IERIX25ldygpKSA9PSBOVUxMKSB8fAorICAgICAgIURIX2dlbmVyYXRlX3BhcmFtZXRlcnNfZXgoYSwgNjQsIERIX0dFTkVSQVRPUl81LCAmX2NiKSkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKCFESF9jaGVjayhhLCAmaSkpCisgICAgZ290byBlcnI7CisgIGlmIChpICYgREhfQ0hFQ0tfUF9OT1RfUFJJTUUpCisgICAgQklPX3B1dHMob3V0LCAicCB2YWx1ZSBpcyBub3QgcHJpbWVcbiIpOworICBpZiAoaSAmIERIX0NIRUNLX1BfTk9UX1NBRkVfUFJJTUUpCisgICAgQklPX3B1dHMob3V0LCAicCB2YWx1ZSBpcyBub3QgYSBzYWZlIHByaW1lXG4iKTsKKyAgaWYgKGkgJiBESF9DSEVDS19VTkFCTEVfVE9fQ0hFQ0tfR0VORVJBVE9SKQorICAgIEJJT19wdXRzKG91dCwgInVuYWJsZSB0byBjaGVjayB0aGUgZ2VuZXJhdG9yIHZhbHVlXG4iKTsKKyAgaWYgKGkgJiBESF9DSEVDS19OT1RfU1VJVEFCTEVfR0VORVJBVE9SKQorICAgIEJJT19wdXRzKG91dCwgInRoZSBnIHZhbHVlIGlzIG5vdCBhIGdlbmVyYXRvclxuIik7CisKKyAgQklPX3B1dHMob3V0LCAiXG5wICAgID0iKTsKKyAgQk5fcHJpbnQob3V0LCBhLT5wKTsKKyAgQklPX3B1dHMob3V0LCAiXG5nICAgID0iKTsKKyAgQk5fcHJpbnQob3V0LCBhLT5nKTsKKyAgQklPX3B1dHMob3V0LCAiXG4iKTsKKworICBiID0gREhfbmV3KCk7CisgIGlmIChiID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGItPnAgPSBCTl9kdXAoYS0+cCk7CisgIGItPmcgPSBCTl9kdXAoYS0+Zyk7CisgIGlmIChiLT5wID09IE5VTEwgfHwgYi0+ZyA9PSBOVUxMKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAoIURIX2dlbmVyYXRlX2tleShhKSkKKyAgICBnb3RvIGVycjsKKyAgQklPX3B1dHMob3V0LCAicHJpIDE9Iik7CisgIEJOX3ByaW50KG91dCwgYS0+cHJpdl9rZXkpOworICBCSU9fcHV0cyhvdXQsICJcbnB1YiAxPSIpOworICBCTl9wcmludChvdXQsIGEtPnB1Yl9rZXkpOworICBCSU9fcHV0cyhvdXQsICJcbiIpOworCisgIGlmICghREhfZ2VuZXJhdGVfa2V5KGIpKQorICAgIGdvdG8gZXJyOworICBCSU9fcHV0cyhvdXQsICJwcmkgMj0iKTsKKyAgQk5fcHJpbnQob3V0LCBiLT5wcml2X2tleSk7CisgIEJJT19wdXRzKG91dCwgIlxucHViIDI9Iik7CisgIEJOX3ByaW50KG91dCwgYi0+cHViX2tleSk7CisgIEJJT19wdXRzKG91dCwgIlxuIik7CisKKyAgYWxlbiA9IERIX3NpemUoYSk7CisgIGFidWYgPSAodW5zaWduZWQgY2hhciAqKU9QRU5TU0xfbWFsbG9jKGFsZW4pOworICBhb3V0ID0gREhfY29tcHV0ZV9rZXkoYWJ1ZiwgYi0+cHViX2tleSwgYSk7CisKKyAgQklPX3B1dHMob3V0LCAia2V5MSA9Iik7CisgIGZvciAoaSA9IDA7IGkgPCBhb3V0OyBpKyspIHsKKyAgICBzcHJpbnRmKGJ1ZiwgIiUwMlgiLCBhYnVmW2ldKTsKKyAgICBCSU9fcHV0cyhvdXQsIGJ1Zik7CisgIH0KKyAgQklPX3B1dHMob3V0LCAiXG4iKTsKKworICBibGVuID0gREhfc2l6ZShiKTsKKyAgYmJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopT1BFTlNTTF9tYWxsb2MoYmxlbik7CisgIGJvdXQgPSBESF9jb21wdXRlX2tleShiYnVmLCBhLT5wdWJfa2V5LCBiKTsKKworICBCSU9fcHV0cyhvdXQsICJrZXkyID0iKTsKKyAgZm9yIChpID0gMDsgaSA8IGJvdXQ7IGkrKykgeworICAgIHNwcmludGYoYnVmLCAiJTAyWCIsIGJidWZbaV0pOworICAgIEJJT19wdXRzKG91dCwgYnVmKTsKKyAgfQorICBCSU9fcHV0cyhvdXQsICJcbiIpOworICBpZiAoKGFvdXQgPCA0KSB8fCAoYm91dCAhPSBhb3V0KSB8fCAobWVtY21wKGFidWYsIGJidWYsIGFvdXQpICE9IDApKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBpbiBESCByb3V0aW5lc1xuIik7CisgICAgcmV0ID0gMTsKKyAgfSBlbHNlCisgICAgcmV0ID0gMDsKKworICBpZiAoIXJ1bl9yZmM1MTE0X3Rlc3RzKCkpCisgICAgcmV0ID0gMTsKKworZXJyOgorICBCSU9fcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7CisKKyAgaWYgKGFidWYgIT0gTlVMTCkKKyAgICBPUEVOU1NMX2ZyZWUoYWJ1Zik7CisgIGlmIChiYnVmICE9IE5VTEwpCisgICAgT1BFTlNTTF9mcmVlKGJidWYpOworICBpZiAoYiAhPSBOVUxMKQorICAgIERIX2ZyZWUoYik7CisgIGlmIChhICE9IE5VTEwpCisgICAgREhfZnJlZShhKTsKKyAgQklPX2ZyZWUob3V0KTsKKyAgcmV0dXJuIHJldDsKK30KKworLyogVGVzdCBkYXRhIGZyb20gUkZDIDUxMTQgKi8KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZGh0ZXN0XzEwMjRfMTYwX3hBW10gPSB7CisgICAgMHhCOSwgMHhBMywgMHhCMywgMHhBRSwgMHg4RiwgMHhFRiwgMHhDMSwgMHhBMiwgMHg5MywgMHgwNCwKKyAgICAweDk2LCAweDUwLCAweDcwLCAweDg2LCAweEY4LCAweDQ1LCAweDVELCAweDQ4LCAweDk0LCAweDNFfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRodGVzdF8xMDI0XzE2MF95QVtdID0geworICAgIDB4MkEsIDB4ODUsIDB4M0IsIDB4M0QsIDB4OTIsIDB4MTksIDB4NzUsIDB4MDEsIDB4QjksIDB4MDEsIDB4NUIsIDB4MkQsCisgICAgMHhFQiwgMHgzRSwgMHhEOCwgMHg0RiwgMHg1RSwgMHgwMiwgMHgxRCwgMHhDQywgMHgzRSwgMHg1MiwgMHhGMSwgMHgwOSwKKyAgICAweEQzLCAweDI3LCAweDNELCAweDJCLCAweDc1LCAweDIxLCAweDI4LCAweDFDLCAweEJBLCAweEJFLCAweDBFLCAweDc2LAorICAgIDB4RkYsIDB4NTcsIDB4MjcsIDB4RkEsIDB4OEEsIDB4Q0MsIDB4RTIsIDB4NjksIDB4NTYsIDB4QkEsIDB4OUEsIDB4MUYsCisgICAgMHhDQSwgMHgyNiwgMHhGMiwgMHgwMiwgMHgyOCwgMHhEOCwgMHg2OSwgMHgzRiwgMHhFQiwgMHgxMCwgMHg4NCwgMHgxRCwKKyAgICAweDg0LCAweEE3LCAweDM2LCAweDAwLCAweDU0LCAweEVDLCAweEU1LCAweEE3LCAweEY1LCAweEI3LCAweEE2LCAweDFBLAorICAgIDB4RDMsIDB4REYsIDB4QjMsIDB4QzYsIDB4MEQsIDB4MkUsIDB4NDMsIDB4MTAsIDB4NkQsIDB4ODcsIDB4MjcsIDB4REEsCisgICAgMHgzNywgMHhERiwgMHg5QywgMHhDRSwgMHg5NSwgMHhCNCwgMHg3OCwgMHg3NSwgMHg1RCwgMHgwNiwgMHhCQywgMHhFQSwKKyAgICAweDhGLCAweDlELCAweDQ1LCAweDk2LCAweDVGLCAweDc1LCAweEE1LCAweEYzLCAweEQxLCAweERGLCAweDM3LCAweDAxLAorICAgIDB4MTYsIDB4NUYsIDB4QzksIDB4RTUsIDB4MEMsIDB4NDIsIDB4NzksIDB4Q0UsIDB4QjAsIDB4N0YsIDB4OTgsIDB4OTUsCisgICAgMHg0MCwgMHhBRSwgMHg5NiwgMHhENSwgMHhEOCwgMHg4RSwgMHhENywgMHg3Nn07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBkaHRlc3RfMTAyNF8xNjBfeEJbXSA9IHsKKyAgICAweDkzLCAweDkyLCAweEM5LCAweEY5LCAweEVCLCAweDZBLCAweDdBLCAweDZBLCAweDkwLCAweDIyLAorICAgIDB4RjcsIDB4RDgsIDB4M0UsIDB4NzIsIDB4MjMsIDB4QzYsIDB4ODMsIDB4NUIsIDB4QkQsIDB4REF9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZGh0ZXN0XzEwMjRfMTYwX3lCW10gPSB7CisgICAgMHg3MSwgMHg3QSwgMHg2QywgMHhCMCwgMHg1MywgMHgzNywgMHgxRiwgMHhGNCwgMHhBMywgMHhCOSwgMHgzMiwgMHg5NCwKKyAgICAweDFDLCAweDFFLCAweDU2LCAweDYzLCAweEY4LCAweDYxLCAweEExLCAweEQ2LCAweEFELCAweDM0LCAweEFFLCAweDY2LAorICAgIDB4NTcsIDB4NkQsIDB4RkIsIDB4OTgsIDB4RjYsIDB4QzYsIDB4Q0IsIDB4RjksIDB4REQsIDB4RDUsIDB4QTUsIDB4NkMsCisgICAgMHg3OCwgMHgzMywgMHhGNiwgMHhCQywgMHhGRCwgMHhGRiwgMHgwOSwgMHg1NSwgMHg4MiwgMHhBRCwgMHg4NiwgMHg4RSwKKyAgICAweDQ0LCAweDBFLCAweDhELCAweDA5LCAweEZELCAweDc2LCAweDlFLCAweDNDLCAweEVDLCAweENELCAweEMzLCAweEQzLAorICAgIDB4QjEsIDB4RTQsIDB4Q0YsIDB4QTAsIDB4NTcsIDB4NzcsIDB4NkMsIDB4QUEsIDB4RjksIDB4NzMsIDB4OUIsIDB4NkEsCisgICAgMHg5RiwgMHhFRSwgMHg4RSwgMHg3NCwgMHgxMSwgMHhGOCwgMHhENiwgMHhEQSwgMHhDMCwgMHg5RCwgMHg2QSwgMHg0RSwKKyAgICAweERCLCAweDQ2LCAweENDLCAweDJCLCAweDVELCAweDUyLCAweDAzLCAweDA5LCAweDBFLCAweEFFLCAweDYxLCAweDI2LAorICAgIDB4MzEsIDB4MUUsIDB4NTMsIDB4RkQsIDB4MkMsIDB4MTQsIDB4QjUsIDB4NzQsIDB4RTYsIDB4QTMsIDB4MTAsIDB4OUEsCisgICAgMHgzRCwgMHhBMSwgMHhCRSwgMHg0MSwgMHhCRCwgMHhDRSwgMHhBQSwgMHgxOCwgMHg2RiwgMHg1QywgMHhFMCwgMHg2NywKKyAgICAweDE2LCAweEEyLCAweEI2LCAweEEwLCAweDdCLCAweDNDLCAweDMzLCAweEZFfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRodGVzdF8xMDI0XzE2MF9aW10gPSB7CisgICAgMHg1QywgMHg4MCwgMHg0RiwgMHg0NSwgMHg0RCwgMHgzMCwgMHhEOSwgMHhDNCwgMHhERiwgMHg4NSwgMHgyNywgMHgxRiwKKyAgICAweDkzLCAweDUyLCAweDhDLCAweDkxLCAweERGLCAweDZCLCAweDQ4LCAweEFCLCAweDVGLCAweDgwLCAweEIzLCAweEI1LAorICAgIDB4OUMsIDB4QUEsIDB4QzEsIDB4QjIsIDB4OEYsIDB4OEEsIDB4Q0IsIDB4QTksIDB4Q0QsIDB4M0UsIDB4MzksIDB4RjMsCisgICAgMHhDQiwgMHg2MSwgMHg0NSwgMHgyNSwgMHhEOSwgMHg1MiwgMHgxRCwgMHgyRSwgMHg2NCwgMHg0QywgMHg1MywgMHhCOCwKKyAgICAweDA3LCAweEI4LCAweDEwLCAweEYzLCAweDQwLCAweDA2LCAweDJGLCAweDI1LCAweDdELCAweDdELCAweDZGLCAweEJGLAorICAgIDB4RTgsIDB4RDUsIDB4RTgsIDB4RjAsIDB4NzIsIDB4RTksIDB4QjYsIDB4RTksIDB4QUYsIDB4REEsIDB4OTQsIDB4MTMsCisgICAgMHhFQSwgMHhGQiwgMHgyRSwgMHg4QiwgMHgwNiwgMHg5OSwgMHhCMSwgMHhGQiwgMHg1QSwgMHgwQywgMHhBQywgMHhFRCwKKyAgICAweERFLCAweEFFLCAweEFELCAweDdFLCAweDlDLCAweEZCLCAweEIzLCAweDZBLCAweEUyLCAweEI0LCAweDIwLCAweDgzLAorICAgIDB4NUIsIDB4RDgsIDB4M0EsIDB4MTksIDB4RkIsIDB4MEIsIDB4NUUsIDB4OTYsIDB4QkYsIDB4OEYsIDB4QTQsIDB4RDAsCisgICAgMHg5RSwgMHgzNCwgMHg1NSwgMHgyNSwgMHgxNiwgMHg3RSwgMHhDRCwgMHg5MSwgMHg1NSwgMHg0MSwgMHg2RiwgMHg0NiwKKyAgICAweEY0LCAweDA4LCAweEVELCAweDMxLCAweEI2LCAweDNDLCAweDZFLCAweDZEfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRodGVzdF8yMDQ4XzIyNF94QVtdID0geworICAgIDB4MjIsIDB4RTYsIDB4MjYsIDB4MDEsIDB4REIsIDB4RkYsIDB4RDAsIDB4NjcsIDB4MDgsIDB4QTYsCisgICAgMHg4MCwgMHhGNywgMHg0NywgMHhGMywgMHg2MSwgMHhGNywgMHg2RCwgMHg4RiwgMHg0RiwgMHg3MiwKKyAgICAweDFBLCAweDA1LCAweDQ4LCAweEU0LCAweDgzLCAweDI5LCAweDRCLCAweDBDfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRodGVzdF8yMDQ4XzIyNF95QVtdID0geworICAgIDB4MUIsIDB4M0EsIDB4NjMsIDB4NDUsIDB4MUIsIDB4RDgsIDB4ODYsIDB4RTYsIDB4OTksIDB4RTYsIDB4N0IsIDB4NDksCisgICAgMHg0RSwgMHgyOCwgMHg4QiwgMHhENywgMHhGOCwgMHhFMCwgMHhEMywgMHg3MCwgMHhCQSwgMHhERCwgMHhBNywgMHhBMCwKKyAgICAweEVGLCAweEQyLCAweEZELCAweEU3LCAweEQ4LCAweEY2LCAweDYxLCAweDQ1LCAweENDLCAweDlGLCAweDI4LCAweDA0LAorICAgIDB4MTksIDB4OTcsIDB4NUUsIDB4QjgsIDB4MDgsIDB4ODcsIDB4N0MsIDB4OEEsIDB4NEMsIDB4MEMsIDB4OEUsIDB4MEIsCisgICAgMHhENCwgMHg4RCwgMHg0QSwgMHg1NCwgMHgwMSwgMHhFQiwgMHgxRSwgMHg4NywgMHg3NiwgMHhCRiwgMHhFRSwgMHhFMSwKKyAgICAweDM0LCAweEMwLCAweDM4LCAweDMxLCAweEFDLCAweDI3LCAweDNDLCAweEQ5LCAweEQ2LCAweDM1LCAweEFCLCAweDBDLAorICAgIDB4RTAsIDB4MDYsIDB4QTQsIDB4MkEsIDB4ODgsIDB4N0UsIDB4M0YsIDB4NTIsIDB4RkIsIDB4ODcsIDB4NjYsIDB4QjYsCisgICAgMHg1MCwgMHhGMywgMHg4MCwgMHg3OCwgMHhCQywgMHg4RSwgMHhFOCwgMHg1OCwgMHgwQywgMHhFRiwgMHhFMiwgMHg0MywKKyAgICAweDk2LCAweDhDLCAweEZDLCAweDRGLCAweDhELCAweEMzLCAweERCLCAweDA4LCAweDQ1LCAweDU0LCAweDE3LCAweDFELAorICAgIDB4NDEsIDB4QkYsIDB4MkUsIDB4ODYsIDB4MUIsIDB4N0IsIDB4QjQsIDB4RDYsIDB4OUQsIDB4RDAsIDB4RTAsIDB4MUUsCisgICAgMHhBMywgMHg4NywgMHhDQiwgMHhBQSwgMHg1QywgMHhBNiwgMHg3MiwgMHhBRiwgMHhDQiwgMHhFOCwgMHhCRCwgMHhCOSwKKyAgICAweEQ2LCAweDJELCAweDRDLCAweEUxLCAweDVGLCAweDE3LCAweERELCAweDM2LCAweEY5LCAweDFFLCAweEQxLCAweEVFLAorICAgIDB4REQsIDB4NjUsIDB4Q0EsIDB4NEEsIDB4MDYsIDB4NDUsIDB4NUMsIDB4QjksIDB4NEMsIDB4RDQsIDB4MEEsIDB4NTIsCisgICAgMHhFQywgMHgzNiwgMHgwRSwgMHg4NCwgMHhCMywgMHhDOSwgMHgyNiwgMHhFMiwgMHgyQywgMHg0MywgMHg4MCwgMHhBMywKKyAgICAweEJGLCAweDMwLCAweDlELCAweDU2LCAweDg0LCAweDk3LCAweDY4LCAweEI3LCAweEY1LCAweDJDLCAweEZELCAweEY2LAorICAgIDB4NTUsIDB4RkQsIDB4MDUsIDB4M0EsIDB4N0UsIDB4RjcsIDB4MDYsIDB4OTcsIDB4OUUsIDB4N0UsIDB4NTgsIDB4MDYsCisgICAgMHhCMSwgMHg3RCwgMHhGQSwgMHhFNSwgMHgzQSwgMHhEMiwgMHhBNSwgMHhCQywgMHg1NiwgMHg4RSwgMHhCQiwgMHg1MiwKKyAgICAweDlBLCAweDdBLCAweDYxLCAweEQ2LCAweDhELCAweDI1LCAweDZGLCAweDhGLCAweEM5LCAweDdDLCAweDA3LCAweDRBLAorICAgIDB4ODYsIDB4MUQsIDB4ODIsIDB4N0UsIDB4MkUsIDB4QkMsIDB4OEMsIDB4NjEsIDB4MzQsIDB4NTUsIDB4MzEsIDB4MTUsCisgICAgMHhCNywgMHgwRSwgMHg3MSwgMHgwMywgMHg5MiwgMHgwQSwgMHhBMSwgMHg2RCwgMHg4NSwgMHhFNSwgMHgyQiwgMHhDQiwKKyAgICAweEFCLCAweDhELCAweDc4LCAweDZBLCAweDY4LCAweDE3LCAweDhGLCAweEE4LCAweEZGLCAweDdDLCAweDJGLCAweDVDLAorICAgIDB4NzEsIDB4NjQsIDB4OEQsIDB4NkZ9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZGh0ZXN0XzIwNDhfMjI0X3hCW10gPSB7CisgICAgMHg0RiwgMHhGMywgMHhCQywgMHg5NiwgMHhDNywgMHhGQywgMHg2QSwgMHg2RCwgMHg3MSwgMHhEMywKKyAgICAweEIzLCAweDYzLCAweDgwLCAweDBBLCAweDdDLCAweERGLCAweEVGLCAweDZGLCAweEM0LCAweDFCLAorICAgIDB4NDQsIDB4MTcsIDB4RUEsIDB4MTUsIDB4MzUsIDB4M0IsIDB4NzUsIDB4OTB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZGh0ZXN0XzIwNDhfMjI0X3lCW10gPSB7CisgICAgMHg0RCwgMHhDRSwgMHhFOSwgMHg5MiwgMHhBOSwgMHg3NiwgMHgyQSwgMHgxMywgMHhGMiwgMHhGOCwgMHgzOCwgMHg0NCwKKyAgICAweEFELCAweDNELCAweDc3LCAweEVFLCAweDBFLCAweDMxLCAweEM5LCAweDcxLCAweDhCLCAweDNELCAweEI2LCAweEMyLAorICAgIDB4MDMsIDB4NUQsIDB4MzksIDB4NjEsIDB4MTgsIDB4MkMsIDB4M0UsIDB4MEIsIDB4QTIsIDB4NDcsIDB4RUMsIDB4NDEsCisgICAgMHg4MiwgMHhENywgMHg2MCwgMHhDRCwgMHg0OCwgMHhEOSwgMHg5NSwgMHg5OSwgMHg5NywgMHgwNiwgMHgyMiwgMHhBMSwKKyAgICAweDg4LCAweDFCLCAweEJBLCAweDJELCAweEM4LCAweDIyLCAweDkzLCAweDlDLCAweDc4LCAweEMzLCAweDkxLCAweDJDLAorICAgIDB4NjYsIDB4NjEsIDB4RkEsIDB4NTQsIDB4MzgsIDB4QjIsIDB4MDcsIDB4NjYsIDB4MjIsIDB4MkIsIDB4NzUsIDB4RTIsCisgICAgMHg0QywgMHgyRSwgMHgzQSwgMHhEMCwgMHhDNywgMHgyOCwgMHg3MiwgMHgzNiwgMHgxMiwgMHg5NSwgMHgyNSwgMHhFRSwKKyAgICAweDE1LCAweEI1LCAweERELCAweDc5LCAweDk4LCAweEFBLCAweDA0LCAweEM0LCAweEE5LCAweDY5LCAweDZDLCAweEFDLAorICAgIDB4RDcsIDB4MTcsIDB4MjAsIDB4ODMsIDB4QTksIDB4N0EsIDB4ODEsIDB4NjYsIDB4NEUsIDB4QUQsIDB4MkMsIDB4NDcsCisgICAgMHg5RSwgMHg0NCwgMHg0RSwgMHg0QywgMHgwNiwgMHg1NCwgMHhDQywgMHgxOSwgMHhFMiwgMHg4RCwgMHg3NywgMHgwMywKKyAgICAweENFLCAweEU4LCAweERBLCAweENELCAweDYxLCAweDI2LCAweEY1LCAweEQ2LCAweDY1LCAweEVDLCAweDUyLCAweEM2LAorICAgIDB4NzIsIDB4NTUsIDB4REIsIDB4OTIsIDB4MDEsIDB4NEIsIDB4MDMsIDB4N0UsIDB4QjYsIDB4MjEsIDB4QTIsIDB4QUMsCisgICAgMHg4RSwgMHgzNiwgMHg1RCwgMHhFMCwgMHg3MSwgMHhGRiwgMHhDMSwgMHg0MCwgMHgwQSwgMHhDRiwgMHgwNywgMHg3QSwKKyAgICAweDEyLCAweDkxLCAweDNELCAweEQ4LCAweERFLCAweDg5LCAweDQ3LCAweDM0LCAweDM3LCAweEFCLCAweDdCLCAweEEzLAorICAgIDB4NDYsIDB4NzQsIDB4M0MsIDB4MUIsIDB4MjEsIDB4NUQsIDB4RDksIDB4QzEsIDB4MjEsIDB4NjQsIDB4QTcsIDB4RTQsCisgICAgMHgwNSwgMHgzMSwgMHgxOCwgMHhEMSwgMHg5OSwgMHhCRSwgMHhDOCwgMHhFRiwgMHg2RiwgMHhDNSwgMHg2MSwgMHgxNywKKyAgICAweDBDLCAweDg0LCAweEM4LCAweDdELCAweDEwLCAweEVFLCAweDlBLCAweDY3LCAweDRBLCAweDFGLCAweEE4LCAweEZGLAorICAgIDB4RTEsIDB4M0IsIDB4REYsIDB4QkEsIDB4MUQsIDB4NDQsIDB4REUsIDB4NDgsIDB4OTQsIDB4NkQsIDB4NjgsIDB4REMsCisgICAgMHgwQywgMHhERCwgMHg3NywgMHg3NiwgMHgzNSwgMHhBNywgMHhBQiwgMHg1QiwgMHhGQiwgMHgxRSwgMHg0QiwgMHhCNywKKyAgICAweEI4LCAweDU2LCAweEY5LCAweDY4LCAweDI3LCAweDczLCAweDRDLCAweDE4LCAweDQxLCAweDM4LCAweEU5LCAweDE1LAorICAgIDB4RDksIDB4QzMsIDB4MDAsIDB4MkUsIDB4QkMsIDB4RTUsIDB4MzEsIDB4MjAsIDB4NTQsIDB4NkEsIDB4N0UsIDB4MjAsCisgICAgMHgwMiwgMHgxNCwgMHgyQiwgMHg2Q307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBkaHRlc3RfMjA0OF8yMjRfWltdID0geworICAgIDB4MzQsIDB4RDksIDB4QkQsIDB4REMsIDB4MUIsIDB4NDIsIDB4MTcsIDB4NkMsIDB4MzEsIDB4M0YsIDB4RUEsIDB4MDMsCisgICAgMHg0QywgMHgyMSwgMHgwMywgMHg0RCwgMHgwNywgMHg0QSwgMHg2MywgMHgxMywgMHhCQiwgMHg0RSwgMHhDRCwgMHhCMywKKyAgICAweDcwLCAweDNGLCAweEZGLCAweDQyLCAweDQ1LCAweDY3LCAweEE0LCAweDZCLCAweERGLCAweDc1LCAweDUzLCAweDBFLAorICAgIDB4REUsIDB4MEEsIDB4OUQsIDB4QTUsIDB4MjIsIDB4OUQsIDB4RTcsIDB4RDcsIDB4NjcsIDB4MzIsIDB4MjgsIDB4NkMsCisgICAgMHhCQywgMHgwRiwgMHg5MSwgMHhEQSwgMHg0QywgMHgzQywgMHg4NSwgMHgyRiwgMHhDMCwgMHg5OSwgMHhDNiwgMHg3OSwKKyAgICAweDUzLCAweDFELCAweDk0LCAweEM3LCAweDhBLCAweEIwLCAweDNELCAweDlELCAweEVDLCAweEIwLCAweEE0LCAweEU0LAorICAgIDB4Q0EsIDB4OEIsIDB4MkIsIDB4QjQsIDB4NTksIDB4MUMsIDB4NDAsIDB4MjEsIDB4Q0YsIDB4OEMsIDB4RTMsIDB4QTIsCisgICAgMHgwQSwgMHg1NCwgMHgxRCwgMHgzMywgMHg5OSwgMHg0MCwgMHgxNywgMHhEMCwgMHgyMCwgMHgwQSwgMHhFMiwgMHhDOSwKKyAgICAweDUxLCAweDZFLCAweDJGLCAweEY1LCAweDE0LCAweDU3LCAweDc5LCAweDI2LCAweDlFLCAweDg2LCAweDJCLCAweDBGLAorICAgIDB4QjQsIDB4NzQsIDB4QTIsIDB4RDUsIDB4NkQsIDB4QzMsIDB4MUUsIDB4RDUsIDB4NjksIDB4QTcsIDB4NzAsIDB4MEIsCisgICAgMHg0QywgMHg0QSwgMHhCMSwgMHg2QiwgMHgyMiwgMHhBNCwgMHg1NSwgMHgxMywgMHg1MywgMHgxRSwgMHhGNSwgMHgyMywKKyAgICAweEQ3LCAweDEyLCAweDEyLCAweDA3LCAweDdCLCAweDVBLCAweDE2LCAweDlCLCAweERFLCAweEZGLCAweEFELCAweDdBLAorICAgIDB4RDksIDB4NjAsIDB4ODIsIDB4ODQsIDB4QzcsIDB4NzksIDB4NUIsIDB4NkQsIDB4NUEsIDB4NTEsIDB4ODMsIDB4QjgsCisgICAgMHg3MCwgMHg2NiwgMHhERSwgMHgxNywgMHhEOCwgMHhENiwgMHg3MSwgMHhDOSwgMHhFQiwgMHhEOCwgMHhFQywgMHg4OSwKKyAgICAweDU0LCAweDRELCAweDQ1LCAweEVDLCAweDA2LCAweDE1LCAweDkzLCAweEQ0LCAweDQyLCAweEM2LCAweDJBLCAweEI5LAorICAgIDB4Q0UsIDB4M0IsIDB4MUMsIDB4QjksIDB4OTQsIDB4M0EsIDB4MUQsIDB4MjMsIDB4QTUsIDB4RUEsIDB4M0IsIDB4Q0YsCisgICAgMHgyMSwgMHhBMCwgMHgxNCwgMHg3MSwgMHhFNiwgMHg3RSwgMHgwMCwgMHgzRSwgMHg3RiwgMHg4QSwgMHg2OSwgMHhDNywKKyAgICAweDI4LCAweEJFLCAweDQ5LCAweDBCLCAweDJGLCAweEM4LCAweDhDLCAweEZFLCAweEI5LCAweDJELCAweEI2LCAweEEyLAorICAgIDB4MTUsIDB4RTUsIDB4RDAsIDB4M0MsIDB4MTcsIDB4QzQsIDB4NjQsIDB4QzksIDB4QUMsIDB4MUEsIDB4NDYsIDB4RTIsCisgICAgMHgwMywgMHhFMSwgMHgzRiwgMHg5NSwgMHgyOSwgMHg5NSwgMHhGQiwgMHgwMywgMHhDNiwgMHg5RCwgMHgzQywgMHhDNCwKKyAgICAweDdGLCAweENCLCAweDUxLCAweDBCLCAweDY5LCAweDk4LCAweEZGLCAweEQzLCAweEFBLCAweDZELCAweEU3LCAweDNDLAorICAgIDB4RjksIDB4RjYsIDB4MzgsIDB4Njl9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZGh0ZXN0XzIwNDhfMjU2X3hBW10gPSB7CisgICAgMHgwOCwgMHg4MSwgMHgzOCwgMHgyQywgMHhEQiwgMHg4NywgMHg2NiwgMHgwQywgMHg2RCwgMHhDMSwgMHgzRSwKKyAgICAweDYxLCAweDQ5LCAweDM4LCAweEQ1LCAweEI5LCAweEM4LCAweEIyLCAweEYyLCAweDQ4LCAweDU4LCAweDFDLAorICAgIDB4QzUsIDB4RTMsIDB4MUIsIDB4MzUsIDB4NDUsIDB4NDMsIDB4OTcsIDB4RkMsIDB4RTUsIDB4MEV9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZGh0ZXN0XzIwNDhfMjU2X3lBW10gPSB7CisgICAgMHgyRSwgMHg5MywgMHg4MCwgMHhDOCwgMHgzMiwgMHgzQSwgMHhGOSwgMHg3NSwgMHg0NSwgMHhCQywgMHg0OSwgMHg0MSwKKyAgICAweERFLCAweEIwLCAweEVDLCAweDM3LCAweDQyLCAweEM2LCAweDJGLCAweEUwLCAweEVDLCAweEU4LCAweDI0LCAweEE2LAorICAgIDB4QUIsIDB4REIsIDB4RTYsIDB4NkMsIDB4NTksIDB4QkUsIDB4RTAsIDB4MjQsIDB4MjksIDB4MTEsIDB4QkYsIDB4QjksCisgICAgMHg2NywgMHgyMywgMHg1QywgMHhFQiwgMHhBMywgMHg1QSwgMHhFMSwgMHgzRSwgMHg0RSwgMHhDNywgMHg1MiwgMHhCRSwKKyAgICAweDYzLCAweDBCLCAweDkyLCAweERDLCAweDRCLCAweERFLCAweDI4LCAweDQ3LCAweEE5LCAweEM2LCAweDJDLCAweEI4LAorICAgIDB4MTUsIDB4MjcsIDB4NDUsIDB4NDIsIDB4MUYsIDB4QjcsIDB4RUIsIDB4NjAsIDB4QTYsIDB4M0MsIDB4MEYsIDB4RTksCisgICAgMHgxNSwgMHg5RiwgMHhDQywgMHhFNywgMHgyNiwgMHhDRSwgMHg3QywgMHhEOCwgMHg1MiwgMHgzRCwgMHg3NCwgMHg1MCwKKyAgICAweDY2LCAweDdFLCAweEY4LCAweDQwLCAweEU0LCAweDkxLCAweDkxLCAweDIxLCAweEVCLCAweDVGLCAweDAxLCAweEM4LAorICAgIDB4QzksIDB4QjAsIDB4RDMsIDB4RDYsIDB4NDgsIDB4QTksIDB4M0IsIDB4RkIsIDB4NzUsIDB4NjgsIDB4OUUsIDB4ODIsCisgICAgMHg0NCwgMHhBQywgMHgxMywgMHg0QSwgMHhGNSwgMHg0NCwgMHg3MSwgMHgxQywgMHhFNywgMHg5QSwgMHgwMiwgMHhEQywKKyAgICAweEMzLCAweDQyLCAweDI2LCAweDY4LCAweDQ3LCAweDgwLCAweERELCAweERDLCAweEI0LCAweDk4LCAweDU5LCAweDQxLAorICAgIDB4MDYsIDB4QzMsIDB4N0YsIDB4NUIsIDB4QzcsIDB4OTgsIDB4NTYsIDB4NDgsIDB4N0EsIDB4RjUsIDB4QUIsIDB4MDIsCisgICAgMHgyQSwgMHgyRSwgMHg1RSwgMHg0MiwgMHhGMCwgMHg5OCwgMHg5NywgMHhDMSwgMHhBOCwgMHg1QSwgMHgxMSwgMHhFQSwKKyAgICAweDAyLCAweDEyLCAweEFGLCAweDA0LCAweEQ5LCAweEI0LCAweENFLCAweEJDLCAweDkzLCAweDdDLCAweDNDLCAweDFBLAorICAgIDB4M0UsIDB4MTUsIDB4QTgsIDB4QTAsIDB4MzQsIDB4MkUsIDB4MzMsIDB4NzYsIDB4MTUsIDB4QzgsIDB4NEUsIDB4N0YsCisgICAgMHhFMywgMHhCOCwgMHhCOSwgMHhCOCwgMHg3RiwgMHhCMSwgMHhFNywgMHgzQSwgMHgxNSwgMHhBRiwgMHgxMiwgMHhBMywKKyAgICAweDBELCAweDc0LCAweDZFLCAweDA2LCAweERGLCAweEMzLCAweDRGLCAweDI5LCAweDBELCAweDc5LCAweDdDLCAweEU1LAorICAgIDB4MUEsIDB4QTEsIDB4M0EsIDB4QTcsIDB4ODUsIDB4QkYsIDB4NjYsIDB4NTgsIDB4QUYsIDB4RjUsIDB4RTQsIDB4QjAsCisgICAgMHg5MywgMHgwMCwgMHgzQywgMHhCRSwgMHhBRiwgMHg2NiwgMHg1QiwgMHgzQywgMHgyRSwgMHgxMSwgMHgzQSwgMHgzQSwKKyAgICAweDRFLCAweDkwLCAweDUyLCAweDY5LCAweDM0LCAweDFELCAweEMwLCAweDcxLCAweDE0LCAweDI2LCAweDY4LCAweDVGLAorICAgIDB4NEUsIDB4RjMsIDB4N0UsIDB4ODYsIDB4OEEsIDB4ODEsIDB4MjYsIDB4RkYsIDB4M0YsIDB4MjIsIDB4NzksIDB4QjUsCisgICAgMHg3QywgMHhBNiwgMHg3RSwgMHgyOX07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBkaHRlc3RfMjA0OF8yNTZfeEJbXSA9IHsKKyAgICAweDdELCAweDYyLCAweEE3LCAweEUzLCAweEVGLCAweDM2LCAweERFLCAweDYxLCAweDdCLCAweDEzLCAweEQxLAorICAgIDB4QUYsIDB4QjgsIDB4MkMsIDB4NzgsIDB4MEQsIDB4ODMsIDB4QTIsIDB4M0IsIDB4RDQsIDB4RUUsIDB4NjcsCisgICAgMHgwNSwgMHg2NCwgMHg1MSwgMHgyMSwgMHhGMywgMHg3MSwgMHhGNSwgMHg0NiwgMHhBNSwgMHgzRH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBkaHRlc3RfMjA0OF8yNTZfeUJbXSA9IHsKKyAgICAweDU3LCAweDVGLCAweDAzLCAweDUxLCAweEJELCAweDJCLCAweDFCLCAweDgxLCAweDc0LCAweDQ4LCAweEJELCAweEY4LAorICAgIDB4N0EsIDB4NkMsIDB4MzYsIDB4MkMsIDB4MUUsIDB4MjgsIDB4OUQsIDB4MzksIDB4MDMsIDB4QTMsIDB4MEIsIDB4OTgsCisgICAgMHgzMiwgMHhDNSwgMHg3NCwgMHgxRiwgMHhBMiwgMHg1MCwgMHgzNiwgMHgzRSwgMHg3QSwgMHhDQiwgMHhDNywgMHhGNywKKyAgICAweDdGLCAweDNELCAweEFDLCAweEJDLCAweDFGLCAweDEzLCAweDFBLCAweERELCAweDhFLCAweDAzLCAweDM2LCAweDdFLAorICAgIDB4RkYsIDB4OEYsIDB4QkIsIDB4QjMsIDB4RTEsIDB4QzUsIDB4NzgsIDB4NDQsIDB4MjQsIDB4ODAsIDB4OUIsIDB4MjUsCisgICAgMHhBRiwgMHhFNCwgMHhEMiwgMHgyNiwgMHgyQSwgMHgxQSwgMHg2RiwgMHhEMiwgMHhGQSwgMHhCNiwgMHg0MSwgMHgwNSwKKyAgICAweENBLCAweDMwLCAweEE2LCAweDc0LCAweEUwLCAweDdGLCAweDc4LCAweDA5LCAweDg1LCAweDIwLCAweDg4LCAweDYzLAorICAgIDB4MkYsIDB4QzAsIDB4NDksIDB4MjMsIDB4MzcsIDB4OTEsIDB4QUQsIDB4NEUsIDB4REQsIDB4MDgsIDB4M0EsIDB4OTcsCisgICAgMHg4QiwgMHg4OCwgMHgzRSwgMHhFNiwgMHgxOCwgMHhCQywgMHg1RSwgMHgwRCwgMHhEMCwgMHg0NywgMHg0MSwgMHg1RiwKKyAgICAweDJELCAweDk1LCAweEU2LCAweDgzLCAweENGLCAweDE0LCAweDgyLCAweDZCLCAweDVGLCAweEJFLCAweDEwLCAweEQzLAorICAgIDB4Q0UsIDB4NDEsIDB4QzYsIDB4QzEsIDB4MjAsIDB4QzcsIDB4OEEsIDB4QjIsIDB4MDAsIDB4MDgsIDB4QzYsIDB4OTgsCisgICAgMHhCRiwgMHg3RiwgMHgwQiwgMHhDQSwgMHhCOSwgMHhENywgMHhGNCwgMHgwNywgMHhCRSwgMHhEMCwgMHhGNCwgMHgzQSwKKyAgICAweEZCLCAweDI5LCAweDcwLCAweEY1LCAweDdGLCAweDhELCAweDEyLCAweDA0LCAweDM5LCAweDYzLCAweEU2LCAweDZELAorICAgIDB4REQsIDB4MzIsIDB4MEQsIDB4NTksIDB4OUEsIDB4RDksIDB4OTMsIDB4NkMsIDB4OEYsIDB4NDQsIDB4MTMsIDB4N0MsCisgICAgMHgwOCwgMHhCMSwgMHg4MCwgMHhFQywgMHg1RSwgMHg5OCwgMHg1QywgMHhFQiwgMHhFMSwgMHg4NiwgMHhGMywgMHhENSwKKyAgICAweDQ5LCAweDY3LCAweDdFLCAweDgwLCAweDYwLCAweDczLCAweDMxLCAweEVFLCAweDE3LCAweEFGLCAweDMzLCAweDgwLAorICAgIDB4QTcsIDB4MjUsIDB4QjAsIDB4NzgsIDB4MjMsIDB4MTcsIDB4RDcsIDB4REQsIDB4NDMsIDB4RjUsIDB4OUQsIDB4N0EsCisgICAgMHhGOSwgMHg1NiwgMHg4QSwgMHg5QiwgMHhCNiwgMHgzQSwgMHg4NCwgMHhEMywgMHg2NSwgMHhGOSwgMHgyMiwgMHg0NCwKKyAgICAweEVELCAweDEyLCAweDA5LCAweDg4LCAweDIxLCAweDkzLCAweDAyLCAweEY0LCAweDI5LCAweDI0LCAweEM3LCAweENBLAorICAgIDB4OTAsIDB4QjgsIDB4OUQsIDB4MjQsIDB4RjcsIDB4MUIsIDB4MEEsIDB4QjYsIDB4OTcsIDB4ODIsIDB4M0QsIDB4N0QsCisgICAgMHhFQiwgMHgxQSwgMHhGRiwgMHg1QiwgMHgwRSwgMHg4RSwgMHg0QSwgMHg0NSwgMHhENCwgMHg5RiwgMHg3RiwgMHg1MywKKyAgICAweDc1LCAweDdFLCAweDE5LCAweDEzfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRodGVzdF8yMDQ4XzI1Nl9aW10gPSB7CisgICAgMHg4NiwgMHhDNywgMHgwQiwgMHhGOCwgMHhEMCwgMHhCQiwgMHg4MSwgMHhCQiwgMHgwMSwgMHgwNywgMHg4QSwgMHgxNywKKyAgICAweDIxLCAweDlDLCAweEI3LCAweEQyLCAweDcyLCAweDAzLCAweERCLCAweDJBLCAweDE5LCAweEM4LCAweDc3LCAweEYxLAorICAgIDB4RDEsIDB4RjEsIDB4OUYsIDB4RDcsIDB4RDcsIDB4N0UsIDB4RjIsIDB4MjUsIDB4NDYsIDB4QTYsIDB4OEYsIDB4MDAsCisgICAgMHg1QSwgMHhENSwgMHgyRCwgMHhDOCwgMHg0NSwgMHg1MywgMHhCNywgMHg4RiwgMHhDNiwgMHgwMywgMHgzMCwgMHhCRSwKKyAgICAweDUxLCAweEVBLCAweDdDLCAweDA2LCAweDcyLCAweENBLCAweEMxLCAweDUxLCAweDVFLCAweDRCLCAweDM1LCAweEMwLAorICAgIDB4NDcsIDB4QjksIDB4QTUsIDB4NTEsIDB4QjgsIDB4OEYsIDB4MzksIDB4REMsIDB4MjYsIDB4REEsIDB4MTQsIDB4QTAsCisgICAgMHg5RSwgMHhGNywgMHg0NywgMHg3NCwgMHhENCwgMHg3QywgMHg3NiwgMHgyRCwgMHhEMSwgMHg3NywgMHhGOSwgMHhFRCwKKyAgICAweDVCLCAweEMyLCAweEYxLCAweDFFLCAweDUyLCAweEM4LCAweDc5LCAweEJELCAweDk1LCAweDA5LCAweDg1LCAweDA0LAorICAgIDB4Q0QsIDB4OUUsIDB4RUMsIDB4RDgsIDB4QTgsIDB4RjksIDB4QjMsIDB4RUYsIDB4QkQsIDB4MUYsIDB4MDAsIDB4OEEsCisgICAgMHhDNSwgMHg4NSwgMHgzMCwgMHg5NywgMHhEOSwgMHhEMSwgMHg4MywgMHg3RiwgMHgyQiwgMHgxOCwgMHhGNywgMHg3QywKKyAgICAweEQ3LCAweEJFLCAweDAxLCAweEFGLCAweDgwLCAweEE3LCAweEM3LCAweEI1LCAweEVBLCAweDNDLCAweEE1LCAweDRDLAorICAgIDB4QzAsIDB4MkQsIDB4MEMsIDB4MTEsIDB4NkYsIDB4RUUsIDB4M0YsIDB4OTUsIDB4QkIsIDB4ODcsIDB4MzksIDB4OTMsCisgICAgMHg4NSwgMHg4NywgMHg1RCwgMHg3RSwgMHg4NiwgMHg3NCwgMHg3RSwgMHg2NywgMHg2RSwgMHg3MiwgMHg4OSwgMHgzOCwKKyAgICAweEFDLCAweEJGLCAweEY3LCAweDA5LCAweDhFLCAweDA1LCAweEJFLCAweDRELCAweENGLCAweEIyLCAweDQwLCAweDUyLAorICAgIDB4QjgsIDB4M0EsIDB4RUYsIDB4RkIsIDB4MTQsIDB4NzgsIDB4M0YsIDB4MDIsIDB4OUEsIDB4REIsIDB4REUsIDB4N0YsCisgICAgMHg1MywgMHhGQSwgMHhFOSwgMHgyMCwgMHg4NCwgMHgyMiwgMHg0MCwgMHg5MCwgMHhFMCwgMHgwNywgMHhDRSwgMHhFOSwKKyAgICAweDRELCAweDRCLCAweEYyLCAweEJBLCAweENFLCAweDlGLCAweEZELCAweDRCLCAweDU3LCAweEQyLCAweEFGLCAweDdDLAorICAgIDB4NzIsIDB4NEQsIDB4MEMsIDB4QUEsIDB4MTksIDB4QkYsIDB4MDUsIDB4MDEsIDB4RjYsIDB4RjEsIDB4N0IsIDB4NEEsCisgICAgMHhBMSwgMHgwRiwgMHg0MiwgMHg1RSwgMHgzRSwgMHhBNywgMHg2MCwgMHg4MCwgMHhCNCwgMHhCOSwgMHhENiwgMHhCMywKKyAgICAweENFLCAweEZFLCAweEExLCAweDE1LCAweEIyLCAweENFLCAweEI4LCAweDc4LCAweDlCLCAweEI4LCAweEEzLCAweEIwLAorICAgIDB4RUEsIDB4ODcsIDB4RkUsIDB4QkUsIDB4NjMsIDB4QjYsIDB4QzgsIDB4RjgsIDB4NDYsIDB4RUMsIDB4NkQsIDB4QjAsCisgICAgMHhDMiwgMHg2QywgMHg1RCwgMHg3Q307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgREggKigqZ2V0X3BhcmFtKShjb25zdCBFTkdJTkUgKmVuZ2luZSk7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnhBOworICBzaXplX3QgeEFfbGVuOworICBjb25zdCB1bnNpZ25lZCBjaGFyICp5QTsKKyAgc2l6ZV90IHlBX2xlbjsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqeEI7CisgIHNpemVfdCB4Ql9sZW47CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnlCOworICBzaXplX3QgeUJfbGVuOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpaOworICBzaXplX3QgWl9sZW47Cit9IHJmYzUxMTRfdGQ7CisKKyNkZWZpbmUgbWFrZV9yZmM1MTE0X3RkKHByZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBESF9nZXRfIyNwcmUsIGRodGVzdF8jI3ByZSMjX3hBLCBzaXplb2YoZGh0ZXN0XyMjcHJlIyNfeEEpLCAgICAgICAgICAgICAgIFwKKyAgICAgICAgZGh0ZXN0XyMjcHJlIyNfeUEsIHNpemVvZihkaHRlc3RfIyNwcmUjI195QSksIGRodGVzdF8jI3ByZSMjX3hCLCAgICAgIFwKKyAgICAgICAgc2l6ZW9mKGRodGVzdF8jI3ByZSMjX3hCKSwgZGh0ZXN0XyMjcHJlIyNfeUIsICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc2l6ZW9mKGRodGVzdF8jI3ByZSMjX3lCKSwgZGh0ZXN0XyMjcHJlIyNfWiwgc2l6ZW9mKGRodGVzdF8jI3ByZSMjX1opIFwKKyAgfQorCitzdGF0aWMgY29uc3QgcmZjNTExNF90ZCByZmN0ZFtdID0ge21ha2VfcmZjNTExNF90ZCgxMDI0XzE2MCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcmZjNTExNF90ZCgyMDQ4XzIyNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcmZjNTExNF90ZCgyMDQ4XzI1Nil9OworCitzdGF0aWMgaW50IHJ1bl9yZmM1MTE0X3Rlc3RzKHZvaWQpIHsKKyAgaW50IGk7CisgIERIICpkaEEgPSBOVUxMLCAqZGhCID0gTlVMTDsKKyAgdW5zaWduZWQgY2hhciAqWjEgPSBOVUxMLCAqWjIgPSBOVUxMOworCisgIGZvciAoaSA9IDA7IGkgPCAoaW50KShzaXplb2YocmZjdGQpIC8gc2l6ZW9mKHJmYzUxMTRfdGQpKTsgaSsrKSB7CisgICAgY29uc3QgcmZjNTExNF90ZCAqdGQgPSByZmN0ZCArIGk7CisgICAgLyogU2V0IHVwIERIIHN0cnVjdHVyZXMgc2V0dGluZyBrZXkgY29tcG9uZW50cyAqLworICAgIGRoQSA9IHRkLT5nZXRfcGFyYW0oTlVMTCk7CisgICAgZGhCID0gdGQtPmdldF9wYXJhbShOVUxMKTsKKyAgICBpZiAoIWRoQSB8fCAhZGhCKQorICAgICAgZ290byBiYWRfZXJyOworCisgICAgZGhBLT5wcml2X2tleSA9IEJOX2JpbjJibih0ZC0+eEEsIHRkLT54QV9sZW4sIE5VTEwpOworICAgIGRoQS0+cHViX2tleSA9IEJOX2JpbjJibih0ZC0+eUEsIHRkLT55QV9sZW4sIE5VTEwpOworCisgICAgZGhCLT5wcml2X2tleSA9IEJOX2JpbjJibih0ZC0+eEIsIHRkLT54Ql9sZW4sIE5VTEwpOworICAgIGRoQi0+cHViX2tleSA9IEJOX2JpbjJibih0ZC0+eUIsIHRkLT55Ql9sZW4sIE5VTEwpOworCisgICAgaWYgKCFkaEEtPnByaXZfa2V5IHx8ICFkaEEtPnB1Yl9rZXkgfHwgIWRoQi0+cHJpdl9rZXkgfHwgIWRoQi0+cHViX2tleSkKKyAgICAgIGdvdG8gYmFkX2VycjsKKworICAgIGlmICgodGQtPlpfbGVuICE9IChzaXplX3QpREhfc2l6ZShkaEEpKSB8fAorICAgICAgICAodGQtPlpfbGVuICE9IChzaXplX3QpREhfc2l6ZShkaEIpKSkKKyAgICAgIGdvdG8gZXJyOworCisgICAgWjEgPSBPUEVOU1NMX21hbGxvYyhESF9zaXplKGRoQSkpOworICAgIFoyID0gT1BFTlNTTF9tYWxsb2MoREhfc2l6ZShkaEIpKTsKKyAgICAvKiBXb3JrIG91dCBzaGFyZWQgc2VjcmV0cyB1c2luZyBib3RoIHNpZGVzIGFuZCBjb21wYXJlCisgICAgICogd2l0aCBleHBlY3RlZCB2YWx1ZXMuCisgICAgICovCisgICAgaWYgKCFESF9jb21wdXRlX2tleShaMSwgZGhCLT5wdWJfa2V5LCBkaEEpKQorICAgICAgZ290byBiYWRfZXJyOworICAgIGlmICghREhfY29tcHV0ZV9rZXkoWjIsIGRoQS0+cHViX2tleSwgZGhCKSkKKyAgICAgIGdvdG8gYmFkX2VycjsKKworICAgIGlmIChtZW1jbXAoWjEsIHRkLT5aLCB0ZC0+Wl9sZW4pKQorICAgICAgZ290byBlcnI7CisgICAgaWYgKG1lbWNtcChaMiwgdGQtPlosIHRkLT5aX2xlbikpCisgICAgICBnb3RvIGVycjsKKworICAgIHByaW50ZigiUkZDNTExNCBwYXJhbWV0ZXIgdGVzdCAlZCBPS1xuIiwgaSArIDEpOworCisgICAgREhfZnJlZShkaEEpOworICAgIGRoQSA9IE5VTEw7CisgICAgREhfZnJlZShkaEIpOworICAgIGRoQiA9IE5VTEw7CisgICAgT1BFTlNTTF9mcmVlKFoxKTsKKyAgICBaMSA9IE5VTEw7CisgICAgT1BFTlNTTF9mcmVlKFoyKTsKKyAgICBaMiA9IE5VTEw7CisgIH0KKworICBwcmludGYoIlBBU1NcbiIpOworICByZXR1cm4gMTsKKworYmFkX2VycjoKKyAgZnByaW50ZihzdGRlcnIsICJJbml0YWxpc2F0aW9uIGVycm9yIFJGQzUxMTQgc2V0ICVkXG4iLCBpICsgMSk7CisgIEJJT19wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKworZXJyOgorICBpZiAoWjEgIT0gTlVMTCkgeworICAgIE9QRU5TU0xfZnJlZShaMSk7CisgIH0KKyAgaWYgKFoyICE9IE5VTEwpIHsKKyAgICBPUEVOU1NMX2ZyZWUoWjIpOworICB9CisgIGlmIChkaEEgIT0gTlVMTCkgeworICAgIERIX2ZyZWUoZGhBKTsKKyAgfQorICBpZiAoZGhCICE9IE5VTEwpIHsKKyAgICBESF9mcmVlKGRoQik7CisgIH0KKworICBmcHJpbnRmKHN0ZGVyciwgIlRlc3QgZmFpbGVkIFJGQzUxMTQgc2V0ICVkXG4iLCBpICsgMSk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2RoL2ludGVybmFsLmggYi9jcnlwdG8vZGgvaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGM3MjVjCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2RoL2ludGVybmFsLmgKQEAgLTAsMCArMSw3NiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2lmbmRlZiBPUEVOU1NMX0hFQURFUl9ESF9JTlRFUk5BTF9ICisjZGVmaW5lIE9QRU5TU0xfSEVBREVSX0RIX0lOVEVSTkFMX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvYmFzZS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXhfZGF0YS5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfSAgLyogZXh0ZXJuIEMgKi8KKyNlbmRpZgorCisjZW5kaWYgIC8qIE9QRU5TU0xfSEVBREVSX0RIX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2NyeXB0by9kaC9wYXJhbXMuYyBiL2NyeXB0by9kaC9wYXJhbXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjMwYzA0Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2RoL3BhcmFtcy5jCkBAIC0wLDAgKzEsMjcxIEBACisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDExIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvZGguaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKworI2luY2x1ZGUgImludGVybmFsLmgiCisKKworI2lmIEJOX0JJVFMyID09IDY0CitzdGF0aWMgY29uc3QgQk5fVUxPTkcgZGgxMDI0XzE2MF9wW10gPSB7CisgICAgMHhERjFGQjJCQzJFNEE0MzcxVUxMLCAweEU2OENGREE3NkQ0REE3MDhVTEwsIDB4NDVCRjM3REYzNjVDMUE2NVVMTCwKKyAgICAweEExNTFBRjVGMERDOEI0QkRVTEwsIDB4RkFBMzFBNEZGNTVCQ0NDMFVMTCwgMHg0RUZGRDZGQUU1NjQ0NzM4VUxMLAorICAgIDB4OTg0ODhFOUMyMTlBNzM3MlVMTCwgMHhBQ0NCREQ3RDkwQzRCRDcwVUxMLCAweDI0OTc1QzNDRDQ5QjgzQkZVTEwsCisgICAgMHgxM0VDQjRBRUE5MDYxMTIzVUxMLCAweDk4MzhFRjFFMkVFNjUyQzBVTEwsIDB4NjA3M0UyODY3NUEyM0QxOFVMTCwKKyAgICAweDlBNkE5RENBNTJEMjNCNjFVTEwsIDB4NTJDOTlGQkNGQjA2QTNDNlVMTCwgMHhERTkyREU1RUFFNUQ1NEVDVUxMLAorICAgIDB4QjEwQjhGOTZBMDgwRTAxRFVMTH07CitzdGF0aWMgY29uc3QgQk5fVUxPTkcgZGgxMDI0XzE2MF9nW10gPSB7CisgICAgMHg4NTVFNkVFQjIyQjNCMkU1VUxMLCAweDg1OEY0RENFRjk3QzJBMjRVTEwsIDB4MkQ3NzlENTkxOEQwOEJDOFVMTCwKKyAgICAweEQ2NjJBNEQxOEU3M0FGQTNVTEwsIDB4MURCRjBBMDE2OUI2QTI4QVVMTCwgMHhBNkEyNEMwODdBMDkxRjUzVUxMLAorICAgIDB4OTA5RDBEMjI2M0Y4MEE3NlVMTCwgMHhEN0ZCRDdEM0I5QTkyRUUxVUxMLCAweDVFOTE1NDdGOUUyNzQ5RjRVTEwsCisgICAgMHgxNjAyMTdCNEIwMUI4ODZBVUxMLCAweDc3N0U2OTBGNTUwNEYyMTNVTEwsIDB4MjY2RkVBMUU1QzQxNTY0QlVMTCwKKyAgICAweEQ2NDA2Q0ZGMTQyNjZEMzFVTEwsIDB4RjgxMDRERDI1OEFDNTA3RlVMTCwgMHg2NzY1QTQ0MkVGQjk5OTA1VUxMLAorICAgIDB4QTREMUNCRDVDM0ZEMzQxMlVMTH07CitzdGF0aWMgY29uc3QgQk5fVUxPTkcgZGgxMDI0XzE2MF9xW10gPSB7CisgICAgMHg2NEI3Q0I5RDQ5NDYyMzUzVUxMLCAweDgxQThERjI3OEFCQTRFN0RVTEwsIDB4MDAwMDAwMDBGNTE4QUE4N1VMTH07CisKK3N0YXRpYyBjb25zdCBCTl9VTE9ORyBkaDIwNDhfMjI0X3BbXSA9IHsKKyAgICAweDBBQzRERkZFMEMxMEU2NEZVTEwsIDB4Q0Y5REU1Mzg0RTcxQjgxQ1VMTCwgMHg3RUYzNjNFMkZGQTMxRjcxVUxMLAorICAgIDB4RTNGQjczQzE2QjhFNzVCOVVMTCwgMHhDOUI1M0RDRjRCQTgwQTI5VUxMLCAweDIzRjEwQjBFMTZFNzk3NjNVTEwsCisgICAgMHhDNTIxNzJFNDEzMDQyRTlCVUxMLCAweEJFNjBFNjlDQzkyOEIyQjlVTEwsIDB4ODBDRDg2QTFCOUU1ODdFOFVMTCwKKyAgICAweDMxNUQ3NUUxOThDNjQxQTRVTEwsIDB4Q0RGOTNBQ0M0NDMyODM4N1VMTCwgMHgxNTk4N0Q5QURDMEE0ODZEVUxMLAorICAgIDB4NzMxMEY3MTIxRkQ1QTA3NFVMTCwgMHgyNzgyNzNDN0RFMzFFRkRDVUxMLCAweDE2MDJFNzE0NDE1RDkzMzBVTEwsCisgICAgMHg4MTI4NjEzMEJDODk4NURCVUxMLCAweEIzQkY4QTMxNzA5MTg4MzZVTEwsIDB4NkEwMEUwQTBCOUM0OTcwOFVMTCwKKyAgICAweEM2QkEwQjJDOEJCQzI3QkVVTEwsIDB4QzlGOThEMTFFRDM0REJGNlVMTCwgMHg3QUQ1QjdEMEI2QzEyMjA3VUxMLAorICAgIDB4RDkxRThGRUY1NUI3Mzk0QlVMTCwgMHg5MDM3QzlFREVGREE0REY4VUxMLCAweDZEM0Y4MTUyQUQ2QUMyMTJVTEwsCisgICAgMHgxREU2Qjg1QTEyNzRBMEE2VUxMLCAweEVCM0Q2ODhBMzA5QzE4MEVVTEwsIDB4QUY5QTNDNDA3QkExREYxNVVMTCwKKyAgICAweEU2RkExNDFERjk1QTU2REJVTEwsIDB4QjU0QjE1OTdCNjFEMEE3NVVMTCwgMHhBMjBENjRFNTY4M0I5RkQxVUxMLAorICAgIDB4RDY2MEZBQTc5NTU5QzUxRlVMTCwgMHhBRDEwN0UxRTkxMjNBOUQwVUxMfTsKK3N0YXRpYyBjb25zdCBCTl9VTE9ORyBkaDIwNDhfMjI0X2dbXSA9IHsKKyAgICAweDg0Qjg5MEQzMTkxRjJCRkFVTEwsIDB4ODFCQzA4N0YyQTcwNjVCM1VMTCwgMHgxOUM0MThFMUY2RUMwMTc5VUxMLAorICAgIDB4N0I1QTBGMUM3MUNGRkY0Q1VMTCwgMHhFREZFNzJGRTlCNkFBNEJEVUxMLCAweDgxRTFCQ0ZFOTRCMzAyNjlVTEwsCisgICAgMHg1NjZBRkJCNDhENkMwMTkxVUxMLCAweEI1MzlDQ0UzNDA5RDEzQ0RVTEwsIDB4NkFBMjFFN0Y1RjJGRjM4MVVMTCwKKyAgICAweEQ5RTI2M0U0NzcwNTg5RUZVTEwsIDB4MTBFMTgzRUREMTk5NjNERFVMTCwgMHhCNzBBODEzNzE1MEI4RUVCVUxMLAorICAgIDB4MDUxQUUzRDQyOEM4RjhBQ1VMTCwgMHhCQjc3QTg2RjBDMUFCMTVCVUxMLCAweDZFMzAyNUUzMTZBMzMwRUZVTEwsCisgICAgMHgxOTUyOUE0NUQ2RjgzNDU2VUxMLCAweEYxODBFQjM0MTE4RTk4RDFVTEwsIDB4QjVGNkM2QjI1MDcxN0NCRVVMTCwKKyAgICAweDA5OTM5RDU0REE3NDYwQ0RVTEwsIDB4RTI0NzE1MDQyMkVBMUVENFVMTCwgMHhCOEE3NjJEMDUyMUJDOThBVUxMLAorICAgIDB4RjREMDI3Mjc1QUMxMzQ4QlVMTCwgMHhDMTc2NjkxMDE5OTkwMjRBVUxMLCAweEJFNUU5MDAxQThENjZBRDdVTEwsCisgICAgMHhDNTdEQjE3QzYyMEE4NjUyVUxMLCAweEFCNzM5RDc3MDBDMjlGNTJVTEwsIDB4REQ5MjFGMDFBNzBDNEFGQVVMTCwKKyAgICAweEE2ODI0QTRFMTBCOUE2RjBVTEwsIDB4NzQ4NjZBMDhDRkU0RkZFM1VMTCwgMHg2Q0RFQkU3Qjg5OTk4Q0FGVUxMLAorICAgIDB4OURGMzBCNUM4RkZEQUM1MFVMTCwgMHhBQzQwMzJFRjRGMkQ5QUUzVUxMfTsKK3N0YXRpYyBjb25zdCBCTl9VTE9ORyBkaDIwNDhfMjI0X3FbXSA9IHsKKyAgICAweEJGMzg5QTk5QjM2MzcxRUJVTEwsIDB4MUY4MDUzNUE0NzM4Q0VCQ1VMTCwgMHhDNThEOTNGRTk5NzE3NzEwVUxMLAorICAgIDB4MDAwMDAwMDA4MDFDMEQzNFVMTH07CisKK3N0YXRpYyBjb25zdCBCTl9VTE9ORyBkaDIwNDhfMjU2X3BbXSA9IHsKKyAgICAweERCMDk0QUU5MUUxQTE1OTdVTEwsIDB4NjkzODc3RkFEN0VGMDlDQVVMTCwgMHg2MTE2RDIyNzZFMTE3MTVGVUxMLAorICAgIDB4QTRCNTQzMzBDMTk4QUYxMlVMTCwgMHg3NUYyNjM3NUQ3MDE0MTAzVUxMLCAweEMzQTM5NjBBNTRFNzEwQzNVTEwsCisgICAgMHhERUQ0MDEwQUJEMEJFNjIxVUxMLCAweEMwQjg1N0Y2ODk5NjI4NTZVTEwsIDB4QjNDQTNGNzk3MTUwNjAyNlVMTCwKKyAgICAweDFDQ0FDQjgzRTZCNDg2RjZVTEwsIDB4NjdFMTQ0RTUxNDA1NjQyNVVMTCwgMHhGNkExNjdCNUE0MTgyNUQ5VUxMLAorICAgIDB4M0FEODM0Nzc5NjUyNEQ4RVVMTCwgMHhGMTNDNkQ5QTUxQkZBNEFCVUxMLCAweDJENTI1MjY3MzU0ODhBMEVVTEwsCisgICAgMHhCNjNBQ0FFMUNBQTZCNzkwVUxMLCAweDRGREI3MEM1ODFCMjNGNzZVTEwsIDB4QkMzOUEwQkYxMjMwN0Y1Q1VMTCwKKyAgICAweEI5NDFGNTRFQjFFNTlCQjhVTEwsIDB4NkM1QkZDMTFENDVGOTA4OFVMTCwgMHgyMkUwQjFFRjQyNzVCRjdCVUxMLAorICAgIDB4OTFGOUU2NzI1QjQ3NThDMFVMTCwgMHg1QThBOUQzMDZCQ0Y2N0VEVUxMLCAweDIwOUUwQzY0OTc1MTdBQkRVTEwsCisgICAgMHgzQkY0Mjk2RDgzMEU5QTdDVUxMLCAweDE2QzNEOTExMzQwOTZGQUFVTEwsIDB4RkFGN0RGNDU2MUIyQUEzMFVMTCwKKyAgICAweEUwMERGOEYxRDYxOTU3RDRVTEwsIDB4NUQyQ0VFRDQ0MzVFM0IwMFVMTCwgMHg4Q0VFRjYwODY2MEREMEYyVUxMLAorICAgIDB4RkZCQkQxOUM2NTE5NTk5OVVMTCwgMHg4N0E4RTYxREI0QjY2NjNDVUxMfTsKK3N0YXRpYyBjb25zdCBCTl9VTE9ORyBkaDIwNDhfMjU2X2dbXSA9IHsKKyAgICAweDY2NEI0QzBGNkNDNDE2NTlVTEwsIDB4NUUyMzI3Q0ZFRjk4QzU4MlVMTCwgMHhENjQ3RDE0OEQ0Nzk1NDUxVUxMLAorICAgIDB4MkY2MzA3ODQ5MEYwMEVGOFVMTCwgMHgxODRCNTIzRDFEQjI0NkMzVUxMLCAweEM3ODkxNDI4Q0RDNjdFQjZVTEwsCisgICAgMHg3RkQwMjgzNzBERjkyQjUyVUxMLCAweEIzMzUzQkJCNjRFMEVDMzdVTEwsIDB4RUNEMDZFMTU1N0NEMDkxNVVMTCwKKyAgICAweEI3RDJCQkQyREYwMTYxOTlVTEwsIDB4Qzg0ODRCMUUwNTI1ODhCOVVMTCwgMHhEQjJBM0I3MzEzRDNGRTE0VUxMLAorICAgIDB4RDA1MkI5ODVEMTgyRUEwQVVMTCwgMHhBNEJEMUJGRkU4M0I5QzgwVUxMLCAweERGQzk2N0MxRkIzRjJFNTVVTEwsCisgICAgMHhCNTA0NUFGMjc2NzE2NEUxVUxMLCAweDFEMTQzNDhGNkYyRjkxOTNVTEwsIDB4NjRFNjc5ODI0MjhFQkM4M1VMTCwKKyAgICAweDhBQzM3NkQyODJENkVEMzhVTEwsIDB4Nzc3REU2MkFBQUI4QTg2MlVMTCwgMHhEREY0NjNFNUU5RUMxNDRCVUxMLAorICAgIDB4MDE5NkY5MzFDNzdBNTdGMlVMTCwgMHhBNTVBRTMxMzQxMDAwQTY1VUxMLCAweDkwMTIyOEY4QzI4Q0JCMThVTEwsCisgICAgMHhCQzM3NzNCRjdFOEM2RjYyVUxMLCAweEJFM0E2QzFCMEM2QjQ3QjFVTEwsIDB4RkY0RkVENEFBQzBCQjU1NVVMTCwKKyAgICAweDEwREJDMTUwNzdCRTQ2M0ZVTEwsIDB4MDdGNDc5M0ExQTBCQTEyNVVMTCwgMHg0Q0E3QjE4RjIxRUYyMDU0VUxMLAorICAgIDB4MkU3NzUwNjY2MEVEQkQ0OFVMTCwgMHgzRkIzMkM5QjczMTM0RDBCVUxMfTsKK3N0YXRpYyBjb25zdCBCTl9VTE9ORyBkaDIwNDhfMjU2X3FbXSA9IHsKKyAgICAweEEzMDhCMEZFNjRGNUZCRDNVTEwsIDB4OTlCMUE0N0QxRUIzNzUwQlVMTCwgMHhCNDQ3OTk3NjQwMTI5REEyVUxMLAorICAgIDB4OENGODM2NDJBNzA5QTA5N1VMTH07CisKKyNlbGlmIEJOX0JJVFMyID09IDMyCisKK3N0YXRpYyBjb25zdCBCTl9VTE9ORyBkaDEwMjRfMTYwX3BbXSA9IHsKKyAgICAweDJFNEE0MzcxLCAweERGMUZCMkJDLCAweDZENERBNzA4LCAweEU2OENGREE3LCAweDM2NUMxQTY1LCAweDQ1QkYzN0RGLAorICAgIDB4MERDOEI0QkQsIDB4QTE1MUFGNUYsIDB4RjU1QkNDQzAsIDB4RkFBMzFBNEYsIDB4RTU2NDQ3MzgsIDB4NEVGRkQ2RkEsCisgICAgMHgyMTlBNzM3MiwgMHg5ODQ4OEU5QywgMHg5MEM0QkQ3MCwgMHhBQ0NCREQ3RCwgMHhENDlCODNCRiwgMHgyNDk3NUMzQywKKyAgICAweEE5MDYxMTIzLCAweDEzRUNCNEFFLCAweDJFRTY1MkMwLCAweDk4MzhFRjFFLCAweDc1QTIzRDE4LCAweDYwNzNFMjg2LAorICAgIDB4NTJEMjNCNjEsIDB4OUE2QTlEQ0EsIDB4RkIwNkEzQzYsIDB4NTJDOTlGQkMsIDB4QUU1RDU0RUMsIDB4REU5MkRFNUUsCisgICAgMHhBMDgwRTAxRCwgMHhCMTBCOEY5Nn07CitzdGF0aWMgY29uc3QgQk5fVUxPTkcgZGgxMDI0XzE2MF9nW10gPSB7CisgICAgMHgyMkIzQjJFNSwgMHg4NTVFNkVFQiwgMHhGOTdDMkEyNCwgMHg4NThGNERDRSwgMHgxOEQwOEJDOCwgMHgyRDc3OUQ1OSwKKyAgICAweDhFNzNBRkEzLCAweEQ2NjJBNEQxLCAweDY5QjZBMjhBLCAweDFEQkYwQTAxLCAweDdBMDkxRjUzLCAweEE2QTI0QzA4LAorICAgIDB4NjNGODBBNzYsIDB4OTA5RDBEMjIsIDB4QjlBOTJFRTEsIDB4RDdGQkQ3RDMsIDB4OUUyNzQ5RjQsIDB4NUU5MTU0N0YsCisgICAgMHhCMDFCODg2QSwgMHgxNjAyMTdCNCwgMHg1NTA0RjIxMywgMHg3NzdFNjkwRiwgMHg1QzQxNTY0QiwgMHgyNjZGRUExRSwKKyAgICAweDE0MjY2RDMxLCAweEQ2NDA2Q0ZGLCAweDU4QUM1MDdGLCAweEY4MTA0REQyLCAweEVGQjk5OTA1LCAweDY3NjVBNDQyLAorICAgIDB4QzNGRDM0MTIsIDB4QTREMUNCRDV9Oworc3RhdGljIGNvbnN0IEJOX1VMT05HIGRoMTAyNF8xNjBfcVtdID0gezB4NDk0NjIzNTMsIDB4NjRCN0NCOUQsIDB4OEFCQTRFN0QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MUE4REYyNywgMHhGNTE4QUE4N307CisKK3N0YXRpYyBjb25zdCBCTl9VTE9ORyBkaDIwNDhfMjI0X3BbXSA9IHsKKyAgICAweDBDMTBFNjRGLCAweDBBQzRERkZFLCAweDRFNzFCODFDLCAweENGOURFNTM4LCAweEZGQTMxRjcxLCAweDdFRjM2M0UyLAorICAgIDB4NkI4RTc1QjksIDB4RTNGQjczQzEsIDB4NEJBODBBMjksIDB4QzlCNTNEQ0YsIDB4MTZFNzk3NjMsIDB4MjNGMTBCMEUsCisgICAgMHgxMzA0MkU5QiwgMHhDNTIxNzJFNCwgMHhDOTI4QjJCOSwgMHhCRTYwRTY5QywgMHhCOUU1ODdFOCwgMHg4MENEODZBMSwKKyAgICAweDk4QzY0MUE0LCAweDMxNUQ3NUUxLCAweDQ0MzI4Mzg3LCAweENERjkzQUNDLCAweERDMEE0ODZELCAweDE1OTg3RDlBLAorICAgIDB4MUZENUEwNzQsIDB4NzMxMEY3MTIsIDB4REUzMUVGREMsIDB4Mjc4MjczQzcsIDB4NDE1RDkzMzAsIDB4MTYwMkU3MTQsCisgICAgMHhCQzg5ODVEQiwgMHg4MTI4NjEzMCwgMHg3MDkxODgzNiwgMHhCM0JGOEEzMSwgMHhCOUM0OTcwOCwgMHg2QTAwRTBBMCwKKyAgICAweDhCQkMyN0JFLCAweEM2QkEwQjJDLCAweEVEMzREQkY2LCAweEM5Rjk4RDExLCAweEI2QzEyMjA3LCAweDdBRDVCN0QwLAorICAgIDB4NTVCNzM5NEIsIDB4RDkxRThGRUYsIDB4RUZEQTRERjgsIDB4OTAzN0M5RUQsIDB4QUQ2QUMyMTIsIDB4NkQzRjgxNTIsCisgICAgMHgxMjc0QTBBNiwgMHgxREU2Qjg1QSwgMHgzMDlDMTgwRSwgMHhFQjNENjg4QSwgMHg3QkExREYxNSwgMHhBRjlBM0M0MCwKKyAgICAweEY5NUE1NkRCLCAweEU2RkExNDFELCAweEI2MUQwQTc1LCAweEI1NEIxNTk3LCAweDY4M0I5RkQxLCAweEEyMEQ2NEU1LAorICAgIDB4OTU1OUM1MUYsIDB4RDY2MEZBQTcsIDB4OTEyM0E5RDAsIDB4QUQxMDdFMUV9Oworc3RhdGljIGNvbnN0IEJOX1VMT05HIGRoMjA0OF8yMjRfZ1tdID0geworICAgIDB4MTkxRjJCRkEsIDB4ODRCODkwRDMsIDB4MkE3MDY1QjMsIDB4ODFCQzA4N0YsIDB4RjZFQzAxNzksIDB4MTlDNDE4RTEsCisgICAgMHg3MUNGRkY0QywgMHg3QjVBMEYxQywgMHg5QjZBQTRCRCwgMHhFREZFNzJGRSwgMHg5NEIzMDI2OSwgMHg4MUUxQkNGRSwKKyAgICAweDhENkMwMTkxLCAweDU2NkFGQkI0LCAweDQwOUQxM0NELCAweEI1MzlDQ0UzLCAweDVGMkZGMzgxLCAweDZBQTIxRTdGLAorICAgIDB4NzcwNTg5RUYsIDB4RDlFMjYzRTQsIDB4RDE5OTYzREQsIDB4MTBFMTgzRUQsIDB4MTUwQjhFRUIsIDB4QjcwQTgxMzcsCisgICAgMHgyOEM4RjhBQywgMHgwNTFBRTNENCwgMHgwQzFBQjE1QiwgMHhCQjc3QTg2RiwgMHgxNkEzMzBFRiwgMHg2RTMwMjVFMywKKyAgICAweEQ2RjgzNDU2LCAweDE5NTI5QTQ1LCAweDExOEU5OEQxLCAweEYxODBFQjM0LCAweDUwNzE3Q0JFLCAweEI1RjZDNkIyLAorICAgIDB4REE3NDYwQ0QsIDB4MDk5MzlENTQsIDB4MjJFQTFFRDQsIDB4RTI0NzE1MDQsIDB4NTIxQkM5OEEsIDB4QjhBNzYyRDAsCisgICAgMHg1QUMxMzQ4QiwgMHhGNEQwMjcyNywgMHgxOTk5MDI0QSwgMHhDMTc2NjkxMCwgMHhBOEQ2NkFENywgMHhCRTVFOTAwMSwKKyAgICAweDYyMEE4NjUyLCAweEM1N0RCMTdDLCAweDAwQzI5RjUyLCAweEFCNzM5RDc3LCAweEE3MEM0QUZBLCAweEREOTIxRjAxLAorICAgIDB4MTBCOUE2RjAsIDB4QTY4MjRBNEUsIDB4Q0ZFNEZGRTMsIDB4NzQ4NjZBMDgsIDB4ODk5OThDQUYsIDB4NkNERUJFN0IsCisgICAgMHg4RkZEQUM1MCwgMHg5REYzMEI1QywgMHg0RjJEOUFFMywgMHhBQzQwMzJFRn07CitzdGF0aWMgY29uc3QgQk5fVUxPTkcgZGgyMDQ4XzIyNF9xW10gPSB7MHhCMzYzNzFFQiwgMHhCRjM4OUE5OSwgMHg0NzM4Q0VCQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFGODA1MzVBLCAweDk5NzE3NzEwLCAweEM1OEQ5M0ZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAxQzBEMzR9OworCitzdGF0aWMgY29uc3QgQk5fVUxPTkcgZGgyMDQ4XzI1Nl9wW10gPSB7CisgICAgMHgxRTFBMTU5NywgMHhEQjA5NEFFOSwgMHhEN0VGMDlDQSwgMHg2OTM4NzdGQSwgMHg2RTExNzE1RiwgMHg2MTE2RDIyNywKKyAgICAweEMxOThBRjEyLCAweEE0QjU0MzMwLCAweEQ3MDE0MTAzLCAweDc1RjI2Mzc1LCAweDU0RTcxMEMzLCAweEMzQTM5NjBBLAorICAgIDB4QkQwQkU2MjEsIDB4REVENDAxMEEsIDB4ODk5NjI4NTYsIDB4QzBCODU3RjYsIDB4NzE1MDYwMjYsIDB4QjNDQTNGNzksCisgICAgMHhFNkI0ODZGNiwgMHgxQ0NBQ0I4MywgMHgxNDA1NjQyNSwgMHg2N0UxNDRFNSwgMHhBNDE4MjVEOSwgMHhGNkExNjdCNSwKKyAgICAweDk2NTI0RDhFLCAweDNBRDgzNDc3LCAweDUxQkZBNEFCLCAweEYxM0M2RDlBLCAweDM1NDg4QTBFLCAweDJENTI1MjY3LAorICAgIDB4Q0FBNkI3OTAsIDB4QjYzQUNBRTEsIDB4ODFCMjNGNzYsIDB4NEZEQjcwQzUsIDB4MTIzMDdGNUMsIDB4QkMzOUEwQkYsCisgICAgMHhCMUU1OUJCOCwgMHhCOTQxRjU0RSwgMHhENDVGOTA4OCwgMHg2QzVCRkMxMSwgMHg0Mjc1QkY3QiwgMHgyMkUwQjFFRiwKKyAgICAweDVCNDc1OEMwLCAweDkxRjlFNjcyLCAweDZCQ0Y2N0VELCAweDVBOEE5RDMwLCAweDk3NTE3QUJELCAweDIwOUUwQzY0LAorICAgIDB4ODMwRTlBN0MsIDB4M0JGNDI5NkQsIDB4MzQwOTZGQUEsIDB4MTZDM0Q5MTEsIDB4NjFCMkFBMzAsIDB4RkFGN0RGNDUsCisgICAgMHhENjE5NTdENCwgMHhFMDBERjhGMSwgMHg0MzVFM0IwMCwgMHg1RDJDRUVENCwgMHg2NjBERDBGMiwgMHg4Q0VFRjYwOCwKKyAgICAweDY1MTk1OTk5LCAweEZGQkJEMTlDLCAweEI0QjY2NjNDLCAweDg3QThFNjFEfTsKK3N0YXRpYyBjb25zdCBCTl9VTE9ORyBkaDIwNDhfMjU2X2dbXSA9IHsKKyAgICAweDZDQzQxNjU5LCAweDY2NEI0QzBGLCAweEVGOThDNTgyLCAweDVFMjMyN0NGLCAweEQ0Nzk1NDUxLCAweEQ2NDdEMTQ4LAorICAgIDB4OTBGMDBFRjgsIDB4MkY2MzA3ODQsIDB4MURCMjQ2QzMsIDB4MTg0QjUyM0QsIDB4Q0RDNjdFQjYsIDB4Qzc4OTE0MjgsCisgICAgMHgwREY5MkI1MiwgMHg3RkQwMjgzNywgMHg2NEUwRUMzNywgMHhCMzM1M0JCQiwgMHg1N0NEMDkxNSwgMHhFQ0QwNkUxNSwKKyAgICAweERGMDE2MTk5LCAweEI3RDJCQkQyLCAweDA1MjU4OEI5LCAweEM4NDg0QjFFLCAweDEzRDNGRTE0LCAweERCMkEzQjczLAorICAgIDB4RDE4MkVBMEEsIDB4RDA1MkI5ODUsIDB4RTgzQjlDODAsIDB4QTRCRDFCRkYsIDB4RkIzRjJFNTUsIDB4REZDOTY3QzEsCisgICAgMHg3NjcxNjRFMSwgMHhCNTA0NUFGMiwgMHg2RjJGOTE5MywgMHgxRDE0MzQ4RiwgMHg0MjhFQkM4MywgMHg2NEU2Nzk4MiwKKyAgICAweDgyRDZFRDM4LCAweDhBQzM3NkQyLCAweEFBQjhBODYyLCAweDc3N0RFNjJBLCAweEU5RUMxNDRCLCAweERERjQ2M0U1LAorICAgIDB4Qzc3QTU3RjIsIDB4MDE5NkY5MzEsIDB4NDEwMDBBNjUsIDB4QTU1QUUzMTMsIDB4QzI4Q0JCMTgsIDB4OTAxMjI4RjgsCisgICAgMHg3RThDNkY2MiwgMHhCQzM3NzNCRiwgMHgwQzZCNDdCMSwgMHhCRTNBNkMxQiwgMHhBQzBCQjU1NSwgMHhGRjRGRUQ0QSwKKyAgICAweDc3QkU0NjNGLCAweDEwREJDMTUwLCAweDFBMEJBMTI1LCAweDA3RjQ3OTNBLCAweDIxRUYyMDU0LCAweDRDQTdCMThGLAorICAgIDB4NjBFREJENDgsIDB4MkU3NzUwNjYsIDB4NzMxMzREMEIsIDB4M0ZCMzJDOUJ9Oworc3RhdGljIGNvbnN0IEJOX1VMT05HIGRoMjA0OF8yNTZfcVtdID0gezB4NjRGNUZCRDMsIDB4QTMwOEIwRkUsIDB4MUVCMzc1MEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5OUIxQTQ3RCwgMHg0MDEyOURBMiwgMHhCNDQ3OTk3NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEE3MDlBMDk3LCAweDhDRjgzNjQyfTsKKworI2Vsc2UKKyNlcnJvciAidW5zdXBwb3J0ZWQgQk5fQklUUzIiCisjZW5kaWYKKworI2RlZmluZSBTVEFUSUNfQklHTlVNKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKEJOX1VMT05HICopIHgsIHNpemVvZih4KSAvIHNpemVvZihCTl9VTE9ORyksICAgICAgICAgICAgXAorICAgICAgICBzaXplb2YoeCkgLyBzaXplb2YoQk5fVUxPTkcpLCAwLCBCTl9GTEdfU1RBVElDX0RBVEEgXAorICB9CisKK3N0cnVjdCBzdGFuZGFyZF9wYXJhbWV0ZXJzIHsKKyAgQklHTlVNIHAsIHEsIGc7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHN0YW5kYXJkX3BhcmFtZXRlcnMgZGgxMDI0XzE2MCA9IHsKKyAgU1RBVElDX0JJR05VTShkaDEwMjRfMTYwX3ApLAorICBTVEFUSUNfQklHTlVNKGRoMTAyNF8xNjBfcSksCisgIFNUQVRJQ19CSUdOVU0oZGgxMDI0XzE2MF9nKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RhbmRhcmRfcGFyYW1ldGVycyBkaDIwNDhfMjI0ID0geworICBTVEFUSUNfQklHTlVNKGRoMjA0OF8yMjRfcCksCisgIFNUQVRJQ19CSUdOVU0oZGgyMDQ4XzIyNF9xKSwKKyAgU1RBVElDX0JJR05VTShkaDIwNDhfMjI0X2cpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzdGFuZGFyZF9wYXJhbWV0ZXJzIGRoMjA0OF8yNTYgPSB7CisgIFNUQVRJQ19CSUdOVU0oZGgyMDQ4XzI1Nl9wKSwKKyAgU1RBVElDX0JJR05VTShkaDIwNDhfMjU2X3EpLAorICBTVEFUSUNfQklHTlVNKGRoMjA0OF8yNTZfZyksCit9OworCitzdGF0aWMgREggKmdldF9zdGFuZGFyZF9wYXJhbWV0ZXJzKGNvbnN0IHN0cnVjdCBzdGFuZGFyZF9wYXJhbWV0ZXJzICpwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVOR0lORSAqZW5naW5lKSB7CisgIERIICpkaDsKKworICBkaCA9IERIX25ld19tZXRob2QoZW5naW5lKTsKKyAgaWYgKCFkaCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgZGgtPnAgPSBCTl9kdXAoJnBhcmFtcy0+cCk7CisgIGRoLT5xID0gQk5fZHVwKCZwYXJhbXMtPnEpOworICBkaC0+ZyA9IEJOX2R1cCgmcGFyYW1zLT5nKTsKKyAgaWYgKCFkaC0+cCB8fCAhZGgtPnEgfHwgIWRoLT5nKSB7CisgICAgREhfZnJlZShkaCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICByZXR1cm4gZGg7Cit9CisKK0RIICpESF9nZXRfMTAyNF8xNjAoY29uc3QgRU5HSU5FICplbmdpbmUpIHsKKyAgcmV0dXJuIGdldF9zdGFuZGFyZF9wYXJhbWV0ZXJzKCZkaDEwMjRfMTYwLCBlbmdpbmUpOworfQorCitESCAqREhfZ2V0XzIwNDhfMjI0KGNvbnN0IEVOR0lORSAqZW5naW5lKSB7CisgIHJldHVybiBnZXRfc3RhbmRhcmRfcGFyYW1ldGVycygmZGgyMDQ4XzIyNCwgZW5naW5lKTsKK30KKworREggKkRIX2dldF8yMDQ4XzI1Nihjb25zdCBFTkdJTkUgKmVuZ2luZSkgeworICByZXR1cm4gZ2V0X3N0YW5kYXJkX3BhcmFtZXRlcnMoJmRoMjA0OF8yNTYsIGVuZ2luZSk7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vZGlnZXN0L0NNYWtlTGlzdHMudHh0IGIvY3J5cHRvL2RpZ2VzdC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2VhNzA4Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2RpZ2VzdC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDExIEBACitpbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKKworYWRkX2xpYnJhcnkoCisJZGlnZXN0CisKKwlPQkpFQ1QKKworCWRpZ2VzdC5jCisJZGlnZXN0cy5jCisJZGlnZXN0X2Vycm9yLmMKKykKZGlmZiAtLWdpdCBhL2NyeXB0by9kaWdlc3QvZGlnZXN0LmMgYi9jcnlwdG8vZGlnZXN0L2RpZ2VzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZmIwZmEKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vZGlnZXN0L2RpZ2VzdC5jCkBAIC0wLDAgKzEsMjY5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9kaWdlc3QuaD4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisKK2ludCBFVlBfTURfdHlwZShjb25zdCBFVlBfTUQgKm1kKSB7IHJldHVybiBtZC0+dHlwZTsgfQorCitjb25zdCBjaGFyICpFVlBfTURfbmFtZShjb25zdCBFVlBfTUQgKm1kKSB7IHJldHVybiBPQkpfbmlkMnNuKG1kLT50eXBlKTsgfQorCit1aW50MzJfdCBFVlBfTURfZmxhZ3MoY29uc3QgRVZQX01EICptZCkgeyByZXR1cm4gbWQtPmZsYWdzOyB9CisKK3NpemVfdCBFVlBfTURfc2l6ZShjb25zdCBFVlBfTUQgKm1kKSB7IHJldHVybiBtZC0+bWRfc2l6ZTsgfQorCitzaXplX3QgRVZQX01EX2Jsb2NrX3NpemUoY29uc3QgRVZQX01EICptZCkgeyByZXR1cm4gbWQtPmJsb2NrX3NpemU7IH0KKworCit2b2lkIEVWUF9NRF9DVFhfaW5pdChFVlBfTURfQ1RYICpjdHgpIHsgbWVtc2V0KGN0eCwgMCwgc2l6ZW9mKEVWUF9NRF9DVFgpKTsgfQorCitFVlBfTURfQ1RYICpFVlBfTURfQ1RYX2NyZWF0ZSh2b2lkKSB7CisgIEVWUF9NRF9DVFggKmN0eCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihFVlBfTURfQ1RYKSk7CisKKyAgaWYgKGN0eCkgeworICAgIEVWUF9NRF9DVFhfaW5pdChjdHgpOworICB9CisKKyAgcmV0dXJuIGN0eDsKK30KKworaW50IEVWUF9NRF9DVFhfY2xlYW51cChFVlBfTURfQ1RYICpjdHgpIHsKKyAgaWYgKGN0eC0+ZGlnZXN0ICYmIGN0eC0+ZGlnZXN0LT5jdHhfc2l6ZSAmJiBjdHgtPm1kX2RhdGEpIHsKKyAgICBPUEVOU1NMX2NsZWFuc2UoY3R4LT5tZF9kYXRhLCBjdHgtPmRpZ2VzdC0+Y3R4X3NpemUpOworICAgIE9QRU5TU0xfZnJlZShjdHgtPm1kX2RhdGEpOworICB9CisKKyAgYXNzZXJ0KGN0eC0+cGN0eCA9PSBOVUxMIHx8IGN0eC0+cGN0eF9vcHMgIT0gTlVMTCk7CisgIGlmIChjdHgtPnBjdHhfb3BzKSB7CisgICAgY3R4LT5wY3R4X29wcy0+ZnJlZShjdHgtPnBjdHgpOworICB9CisKKyAgRVZQX01EX0NUWF9pbml0KGN0eCk7CisKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgRVZQX01EX0NUWF9kZXN0cm95KEVWUF9NRF9DVFggKmN0eCkgeworICBpZiAoIWN0eCkgeworICAgIHJldHVybjsKKyAgfQorCisgIEVWUF9NRF9DVFhfY2xlYW51cChjdHgpOworICBPUEVOU1NMX2ZyZWUoY3R4KTsKK30KKworaW50IEVWUF9NRF9DVFhfY29weV9leChFVlBfTURfQ1RYICpvdXQsIGNvbnN0IEVWUF9NRF9DVFggKmluKSB7CisgIHVpbnQ4X3QgKnRtcF9idWYgPSBOVUxMOworCisgIGlmIChpbiA9PSBOVUxMIHx8IGluLT5kaWdlc3QgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKERJR0VTVCwgRVZQX01EX0NUWF9jb3B5X2V4LAorICAgICAgICAgICAgICAgICAgICAgIERJR0VTVF9SX0lOUFVUX05PVF9JTklUSUFMSVpFRCk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAob3V0LT5kaWdlc3QgPT0gaW4tPmRpZ2VzdCkgeworICAgIC8qIHxtZF9kYXRhfCB3aWxsIGJlIHRoZSBjb3JyZWN0IHNpemUgaW4gdGhpcyBjYXNlIHNvIGl0J3MgcmVtb3ZlZCBmcm9tCisgICAgICogfG91dHwgYXQgdGhpcyBwb2ludCBzbyB0aGF0IHxFVlBfTURfQ1RYX2NsZWFudXB8IGRvZXNuJ3QgZnJlZSBpdCBhbmQKKyAgICAgKiB0aGVuIGl0J3MgcmV1c2VkLiAqLworICAgIHRtcF9idWYgPSBvdXQtPm1kX2RhdGE7CisgICAgb3V0LT5tZF9kYXRhID0gTlVMTDsKKyAgfQorCisgIEVWUF9NRF9DVFhfY2xlYW51cChvdXQpOworICBtZW1jcHkob3V0LCBpbiwgc2l6ZW9mKEVWUF9NRF9DVFgpKTsKKworICBpZiAoaW4tPm1kX2RhdGEgJiYgaW4tPmRpZ2VzdC0+Y3R4X3NpemUpIHsKKyAgICBpZiAodG1wX2J1ZikgeworICAgICAgb3V0LT5tZF9kYXRhID0gdG1wX2J1ZjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0LT5tZF9kYXRhID0gT1BFTlNTTF9tYWxsb2MoaW4tPmRpZ2VzdC0+Y3R4X3NpemUpOworICAgICAgaWYgKCFvdXQtPm1kX2RhdGEpIHsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRElHRVNULCBFVlBfTURfQ1RYX2NvcHlfZXgsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfQorICAgIG1lbWNweShvdXQtPm1kX2RhdGEsIGluLT5tZF9kYXRhLCBpbi0+ZGlnZXN0LT5jdHhfc2l6ZSk7CisgIH0KKworICBhc3NlcnQoaW4tPnBjdHggPT0gTlVMTCB8fCBpbi0+cGN0eF9vcHMgIT0gTlVMTCk7CisgIGlmIChpbi0+cGN0eCAmJiBpbi0+cGN0eF9vcHMpIHsKKyAgICBvdXQtPnBjdHggPSBpbi0+cGN0eF9vcHMtPmR1cChpbi0+cGN0eCk7CisgICAgaWYgKCFvdXQtPnBjdHgpIHsKKyAgICAgIEVWUF9NRF9DVFhfY2xlYW51cChvdXQpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBFVlBfTURfQ1RYX2NvcHkoRVZQX01EX0NUWCAqb3V0LCBjb25zdCBFVlBfTURfQ1RYICppbikgeworICBFVlBfTURfQ1RYX2luaXQob3V0KTsKKyAgcmV0dXJuIEVWUF9NRF9DVFhfY29weV9leChvdXQsIGluKTsKK30KKworaW50IEVWUF9EaWdlc3RJbml0X2V4KEVWUF9NRF9DVFggKmN0eCwgY29uc3QgRVZQX01EICp0eXBlLCBFTkdJTkUgKmVuZ2luZSkgeworICBpZiAoY3R4LT5kaWdlc3QgIT0gdHlwZSkgeworICAgIGlmIChjdHgtPmRpZ2VzdCAmJiBjdHgtPmRpZ2VzdC0+Y3R4X3NpemUpIHsKKyAgICAgIE9QRU5TU0xfZnJlZShjdHgtPm1kX2RhdGEpOworICAgIH0KKyAgICBjdHgtPmRpZ2VzdCA9IHR5cGU7CisgICAgaWYgKCEoY3R4LT5mbGFncyAmIEVWUF9NRF9DVFhfRkxBR19OT19JTklUKSAmJiB0eXBlLT5jdHhfc2l6ZSkgeworICAgICAgY3R4LT51cGRhdGUgPSB0eXBlLT51cGRhdGU7CisgICAgICBjdHgtPm1kX2RhdGEgPSBPUEVOU1NMX21hbGxvYyh0eXBlLT5jdHhfc2l6ZSk7CisgICAgICBpZiAoY3R4LT5tZF9kYXRhID09IE5VTEwpIHsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRElHRVNULCBFVlBfRGlnZXN0SW5pdF9leCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBhc3NlcnQoY3R4LT5wY3R4ID09IE5VTEwgfHwgY3R4LT5wY3R4X29wcyAhPSBOVUxMKTsKKyAgaWYgKGN0eC0+cGN0eF9vcHMpIHsKKyAgICBpZiAoIWN0eC0+cGN0eF9vcHMtPmJlZ2luX2RpZ2VzdChjdHgpKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICBpZiAoY3R4LT5mbGFncyAmIEVWUF9NRF9DVFhfRkxBR19OT19JTklUKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKworICByZXR1cm4gY3R4LT5kaWdlc3QtPmluaXQoY3R4KTsKK30KKworaW50IEVWUF9EaWdlc3RJbml0KEVWUF9NRF9DVFggKmN0eCwgY29uc3QgRVZQX01EICp0eXBlKSB7CisgIEVWUF9NRF9DVFhfaW5pdChjdHgpOworICByZXR1cm4gRVZQX0RpZ2VzdEluaXRfZXgoY3R4LCB0eXBlLCBOVUxMKTsKK30KKworaW50IEVWUF9EaWdlc3RVcGRhdGUoRVZQX01EX0NUWCAqY3R4LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKSB7CisgIHJldHVybiBjdHgtPnVwZGF0ZShjdHgsIGRhdGEsIGxlbik7Cit9CisKK2ludCBFVlBfRGlnZXN0RmluYWxfZXgoRVZQX01EX0NUWCAqY3R4LCB1aW50OF90ICptZF9vdXQsIHVuc2lnbmVkIGludCAqc2l6ZSkgeworICBpbnQgcmV0OworCisgIGFzc2VydChjdHgtPmRpZ2VzdC0+bWRfc2l6ZSA8PSBFVlBfTUFYX01EX1NJWkUpOworICByZXQgPSBjdHgtPmRpZ2VzdC0+ZmluYWwoY3R4LCBtZF9vdXQpOworICBpZiAoc2l6ZSAhPSBOVUxMKSB7CisgICAgKnNpemUgPSBjdHgtPmRpZ2VzdC0+bWRfc2l6ZTsKKyAgfQorICBPUEVOU1NMX2NsZWFuc2UoY3R4LT5tZF9kYXRhLCBjdHgtPmRpZ2VzdC0+Y3R4X3NpemUpOworCisgIHJldHVybiByZXQ7Cit9CisKK2ludCBFVlBfRGlnZXN0RmluYWwoRVZQX01EX0NUWCAqY3R4LCB1aW50OF90ICptZCwgdW5zaWduZWQgaW50ICpzaXplKSB7CisgIGludCByZXQgPSBFVlBfRGlnZXN0RmluYWxfZXgoY3R4LCBtZCwgc2l6ZSk7CisgIEVWUF9NRF9DVFhfY2xlYW51cChjdHgpOworICByZXR1cm4gcmV0OworfQorCitpbnQgRVZQX0RpZ2VzdChjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgY291bnQsIHVpbnQ4X3QgKm91dF9tZCwKKyAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqb3V0X3NpemUsIGNvbnN0IEVWUF9NRCAqdHlwZSwgRU5HSU5FICppbXBsKSB7CisgIEVWUF9NRF9DVFggY3R4OworICBpbnQgcmV0OworCisgIEVWUF9NRF9DVFhfaW5pdCgmY3R4KTsKKyAgcmV0ID0gRVZQX0RpZ2VzdEluaXRfZXgoJmN0eCwgdHlwZSwgaW1wbCkgJiYKKyAgICAgICAgRVZQX0RpZ2VzdFVwZGF0ZSgmY3R4LCBkYXRhLCBjb3VudCkgJiYKKyAgICAgICAgRVZQX0RpZ2VzdEZpbmFsX2V4KCZjdHgsIG91dF9tZCwgb3V0X3NpemUpOworICBFVlBfTURfQ1RYX2NsZWFudXAoJmN0eCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworCitjb25zdCBFVlBfTUQgKkVWUF9NRF9DVFhfbWQoY29uc3QgRVZQX01EX0NUWCAqY3R4KSB7CisgIGlmIChjdHggPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBjdHgtPmRpZ2VzdDsKK30KKwordW5zaWduZWQgRVZQX01EX0NUWF9zaXplKGNvbnN0IEVWUF9NRF9DVFggKmN0eCkgeworICByZXR1cm4gRVZQX01EX3NpemUoRVZQX01EX0NUWF9tZChjdHgpKTsKK30KKwordW5zaWduZWQgRVZQX01EX0NUWF9ibG9ja19zaXplKGNvbnN0IEVWUF9NRF9DVFggKmN0eCkgeworICByZXR1cm4gRVZQX01EX2Jsb2NrX3NpemUoRVZQX01EX0NUWF9tZChjdHgpKTsKK30KKworaW50IEVWUF9NRF9DVFhfdHlwZShjb25zdCBFVlBfTURfQ1RYICpjdHgpIHsKKyAgcmV0dXJuIEVWUF9NRF90eXBlKEVWUF9NRF9DVFhfbWQoY3R4KSk7Cit9CisKK3ZvaWQgRVZQX01EX0NUWF9zZXRfZmxhZ3MoRVZQX01EX0NUWCAqY3R4LCB1aW50MzJfdCBmbGFncykgeworICBjdHgtPmZsYWdzIHw9IGZsYWdzOworfQorCit2b2lkIEVWUF9NRF9DVFhfY2xlYXJfZmxhZ3MoRVZQX01EX0NUWCAqY3R4LCB1aW50MzJfdCBmbGFncykgeworICBjdHgtPmZsYWdzICY9IH5mbGFnczsKK30KKwordWludDMyX3QgRVZQX01EX0NUWF90ZXN0X2ZsYWdzKGNvbnN0IEVWUF9NRF9DVFggKmN0eCwgdWludDMyX3QgZmxhZ3MpIHsKKyAgcmV0dXJuIGN0eC0+ZmxhZ3MgJiBmbGFnczsKK30KZGlmZiAtLWdpdCBhL2NyeXB0by9kaWdlc3QvZGlnZXN0LmggYi9jcnlwdG8vZGlnZXN0L2RpZ2VzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhOTE5MDgKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vZGlnZXN0L2RpZ2VzdC5oCkBAIC0wLDAgKzEsMjY3IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaWZuZGVmIE9QRU5TU0xfSEVBREVSX0RJR0VTVF9ICisjZGVmaW5lIE9QRU5TU0xfSEVBREVSX0RJR0VTVF9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jhc2UuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIERpZ2VzdCBmdW5jdGlvbnMuCisgKgorICogQW4gRVZQX01EIGFic3RyYWN0cyB0aGUgZGV0YWlscyBvZiBhIHNwZWNpZmljIGhhc2ggZnVuY3Rpb24gYWxsb3dpbmcgY29kZSB0bworICogZGVhbCB3aXRoIHRoZSBjb25jZXB0IG9mIGEgImhhc2ggZnVuY3Rpb24iIHdpdGhvdXQgbmVlZGluZyB0byBrbm93IGV4YWN0bHkKKyAqIHdoaWNoIGhhc2ggZnVuY3Rpb24gaXQgaXMuICovCisKKworLyogSGFzaCBhbGdvcml0aG1zLgorICoKKyAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHJldHVybiB8RVZQX01EfCBvYmplY3RzIHRoYXQgaW1wbGVtZW50IHRoZSBuYW1lZCBoYXNoCisgKiBmdW5jdGlvbi4gKi8KKworY29uc3QgRVZQX01EICpFVlBfbWQ1KHZvaWQpOworY29uc3QgRVZQX01EICpFVlBfc2hhMSh2b2lkKTsKK2NvbnN0IEVWUF9NRCAqRVZQX3NoYTIyNCh2b2lkKTsKK2NvbnN0IEVWUF9NRCAqRVZQX3NoYTI1Nih2b2lkKTsKK2NvbnN0IEVWUF9NRCAqRVZQX3NoYTM4NCh2b2lkKTsKK2NvbnN0IEVWUF9NRCAqRVZQX3NoYTUxMih2b2lkKTsKKworLyogRVZQX2dldF9kaWdlc3RieW5pZCByZXR1cm5zIGFuIHxFVlBfTUR8IGZvciB0aGUgZ2l2ZW4gTklELCBvciBOVUxMIGlmIG5vCisgKiBzdWNoIGRpZ2VzdCBpcyBrbm93bi4gKi8KK2NvbnN0IEVWUF9NRCAqRVZQX2dldF9kaWdlc3RieW5pZChpbnQgbmlkKTsKKworLyogRVZQX2dldF9kaWdlc3RieW9iaiByZXR1cm5zIGFuIHxFVlBfTUR8IGZvciB0aGUgZ2l2ZW4gfEFTTjFfT0JKRUNUfCwgb3IgTlVMTAorICogaWYgbm8gc3VjaCBkaWdlc3QgaXMga25vd24uICovCitjb25zdCBFVlBfTUQgKkVWUF9nZXRfZGlnZXN0YnlvYmooY29uc3QgQVNOMV9PQkpFQ1QgKm9iaik7CisKKworLyogRGlnZXN0IGNvbnRleHRzLgorICoKKyAqIEFuIEVWUF9NRF9DVFggcmVwcmVzZW50cyB0aGUgc3RhdGUgb2YgYSBzcGVjaWZpYyBkaWdlc3Qgb3BlcmF0aW9uIGluCisgKiBwcm9ncmVzcy4gKi8KKworLyogRVZQX01EX0NUWF9pbml0IGluaXRpYWxpc2VzIGFuLCBhbHJlYWR5IGFsbG9jYXRlZCwgfEVWUF9NRF9DVFh8LiAqLwordm9pZCBFVlBfTURfQ1RYX2luaXQoRVZQX01EX0NUWCAqY3R4KTsKKworLyogRVZQX01EX0NUWF9jcmVhdGUgYWxsb2NhdGVzIGFuZCBpbml0aWFsaXNlcyBhIGZyZXNoIHxFVlBfTURfQ1RYfCBhbmQgcmV0dXJucworICogaXQsIG9yIE5VTEwgb24gYWxsb2NhdGlvbiBmYWlsdXJlLiAqLworRVZQX01EX0NUWCAqRVZQX01EX0NUWF9jcmVhdGUodm9pZCk7CisKKy8qIEVWUF9NRF9DVFhfY2xlYW51cCBmcmVlcyBhbnkgcmVzb3VyY2VzIG93bmVkIGJ5IHxjdHh8IGFuZCByZXNldHMgaXQgdG8gYQorICogZnJlc2hseSBpbml0aWFsaXNlZCBzdGF0ZS4gSXQgZG9lcyBub3QgZnJlZSB8Y3R4fCBpdHNlbGYuIEl0IHJldHVybnMgb25lLiAqLworaW50IEVWUF9NRF9DVFhfY2xlYW51cChFVlBfTURfQ1RYICpjdHgpOworCisvKiBFVlBfTURfQ1RYX2Rlc3Ryb3kgY2FsbHMgfEVWUF9NRF9DVFhfY2xlYW51cHwgYW5kIHRoZW4gZnJlZXMgfGN0eHwgaXRzZWxmLiAqLwordm9pZCBFVlBfTURfQ1RYX2Rlc3Ryb3koRVZQX01EX0NUWCAqY3R4KTsKKworLyogRVZQX01EX0NUWF9jb3B5X2V4IHNldHMgfG91dHwsIHdoaWNoIG11c3QgYWxyZWFkeSBiZSBpbml0aWFsaXNlZCwgdG8gYmUgYQorICogY29weSBvZiB8aW58LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG9uIGVycm9yLiAqLworaW50IEVWUF9NRF9DVFhfY29weV9leChFVlBfTURfQ1RYICpvdXQsIGNvbnN0IEVWUF9NRF9DVFggKmluKTsKKworCisvKiBEaWdlc3Qgb3BlcmF0aW9ucy4gKi8KKworLyogRVZQX0RpZ2VzdEluaXRfZXggY29uZmlndXJlcyB8Y3R4fCwgd2hpY2ggbXVzdCBhbHJlYWR5IGhhdmUgYmVlbgorICogaW5pdGlhbGlzZWQsIGZvciBhIGZyZXNoIGhhc2hpbmcgb3BlcmF0aW9uIHVzaW5nIHx0eXBlfC4gSXQgcmV0dXJucyBvbmUgb24KKyAqIHN1Y2Nlc3MgYW5kIHplcm8gb3RoZXJ3aXNlLiAqLworaW50IEVWUF9EaWdlc3RJbml0X2V4KEVWUF9NRF9DVFggKmN0eCwgY29uc3QgRVZQX01EICp0eXBlLCBFTkdJTkUgKmVuZ2luZSk7CisKKy8qIEVWUF9EaWdlc3RJbml0IGFjdHMgbGlrZSB8RVZQX0RpZ2VzdEluaXRfZXh8IGV4Y2VwdCB0aGF0IHxjdHh8IGlzCisgKiBpbml0aWFsaXNlZCBiZWZvcmUgdXNlLiAqLworaW50IEVWUF9EaWdlc3RJbml0KEVWUF9NRF9DVFggKmN0eCwgY29uc3QgRVZQX01EICp0eXBlKTsKKworLyogRVZQX0RpZ2VzdFVwZGF0ZSBoYXNoZXMgfGxlbnwgYnl0ZXMgZnJvbSB8ZGF0YXwgaW50byB0aGUgaGFzaGluZyBvcGVyYXRpb24KKyAqIGluIHxjdHh8LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG90aGVyd2lzZS4gKi8KK2ludCBFVlBfRGlnZXN0VXBkYXRlKEVWUF9NRF9DVFggKmN0eCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbik7CisKKy8qIEVWUF9NQVhfTURfU0laRSBpcyB0aGUgbGFyZ2VzdCBkaWdlc3Qgc2l6ZSBzdXBwb3J0ZWQuIEZ1bmN0aW9ucyB0aGF0IG91dHB1dAorICogYSBkaWdlc3QgZ2VuZXJhbGx5IHJlcXVpcmUgdGhlIGJ1ZmZlciBoYXZlIGF0IGxlYXN0IHRoaXMgbXVjaCBzcGFjZS4gKi8KKyNkZWZpbmUgRVZQX01BWF9NRF9TSVpFIDY0IC8qIFNIQS01MTIgaXMgdGhlIGxvbmdlc3Qgc28gZmFyLiAqLworCisvKiBFVlBfRGlnZXN0RmluYWxfZXggZmluaXNoZXMgdGhlIGRpZ2VzdCBpbiB8Y3R4fCBhbmQgd3JpdGVzIHRoZSBvdXRwdXQgdG8KKyAqIHxtZF9vdXR8LiBBdCBtb3N0IHxFVlBfTUFYX01EX1NJWkV8IGJ5dGVzIGFyZSB3cml0dGVuLiBJZiB8b3V0X3NpemV8IGlzIG5vdAorICogTlVMTCB0aGVuIHwqb3V0X3NpemV8IGlzIHNldCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uIEl0IHJldHVybnMgb25lCisgKiBvbiBzdWNjZXNzIGFuZCB6ZXJvIG90aGVyd2lzZS4gQWZ0ZXIgdGhpcyBjYWxsLCB0aGUgaGFzaCBjYW5ub3QgYmUgdXBkYXRlZAorICogb3IgZmluaXNoZWQgYWdhaW4gdW50aWwgfEVWUF9EaWdlc3RGaW5hbF9leHwgaXMgY2FsbGVkIHRvIHN0YXJ0IGFub3RoZXIKKyAqIGhhc2hpbmcgb3BlcmF0aW9uLiAqLworaW50IEVWUF9EaWdlc3RGaW5hbF9leChFVlBfTURfQ1RYICpjdHgsIHVpbnQ4X3QgKm1kX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpvdXRfc2l6ZSk7CisKKy8qIEVWUF9EaWdlc3RGaW5hbCBhY3RzIGxpa2UgfEVWUF9EaWdlc3RGaW5hbF9leHwgZXhjZXB0IHRoYXQKKyAqIHxFVlBfTURfQ1RYX2NsZWFudXB8IGlzIGNhbGxlZCBvbiB8Y3R4fCBiZWZvcmUgcmV0dXJuaW5nLiAqLworaW50IEVWUF9EaWdlc3RGaW5hbChFVlBfTURfQ1RYICpjdHgsIHVpbnQ4X3QgKm1kX291dCwgdW5zaWduZWQgaW50ICpvdXRfc2l6ZSk7CisKKy8qIEVWUF9EaWdlc3QgcGVyZm9ybXMgYSBjb21wbGV0ZSBoYXNoaW5nIG9wZXJhdGlvbiBpbiBvbmUgY2FsbC4gSXQgaGFzaGVzCisgKiB8bGVufCBieXRlcyBmcm9tIHxkYXRhfCBhbmQgd3JpdGVzIHRoZSBkaWdlc3QgdG8gfG1kX291dHwuIEF0IG1vc3QKKyAqIHxFVlBfTUFYX01EX1NJWkV8IGJ5dGVzIGFyZSB3cml0dGVuLiBJZiB8b3V0X3NpemV8IGlzIG5vdCBOVUxMIHRoZW4KKyAqIHwqb3V0X3NpemV8IGlzIHNldCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MKKyAqIGFuZCB6ZXJvIG90aGVyd2lzZS4gKi8KK2ludCBFVlBfRGlnZXN0KGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4sIHVpbnQ4X3QgKm1kX291dCwKKyAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbWRfb3V0X3NpemUsIGNvbnN0IEVWUF9NRCAqdHlwZSwgRU5HSU5FICppbXBsKTsKKworCisvKiBEaWdlc3QgZnVuY3Rpb24gYWNjZXNzb3JzLgorICoKKyAqIFRoZXNlIGZ1bmN0aW9ucyBhbGxvdyBjb2RlIHRvIGxlYXJuIGRldGFpbHMgYWJvdXQgYW4gYWJzdHJhY3QgaGFzaAorICogZnVuY3Rpb24uICovCisKKy8qIEVWUF9NRF90eXBlIHJldHVybnMgYSBOSUQgaWRlbnRpZmluZyB8bWR8LiAoRm9yIGV4YW1wbGUsIHxOSURfbWQ1fC4pICovCitpbnQgRVZQX01EX3R5cGUoY29uc3QgRVZQX01EICptZCk7CisKKy8qIEVWUF9NRF9uYW1lIHJldHVybnMgdGhlIHNob3J0IG5hbWUgZm9yIHxtZHwgb3IgTlVMTCBpZiBubyBuYW1lIGlzIGtub3duLiAqLworY29uc3QgY2hhciAqRVZQX01EX25hbWUoY29uc3QgRVZQX01EICptZCk7CisKKy8qIEVWUF9NRF9mbGFncyByZXR1cm5zIHRoZSBmbGFncyBmb3IgfG1kfCwgd2hpY2ggaXMgYSBzZXQgb2YgfEVWUF9NRF9GTEFHXyp8CisgKiB2YWx1ZXMsIE9SZWQgdG9nZXRoZXIuICovCit1aW50MzJfdCBFVlBfTURfZmxhZ3MoY29uc3QgRVZQX01EICptZCk7CisKKy8qIEVWUF9NRF9zaXplIHJldHVybnMgdGhlIGRpZ2VzdCBzaXplIG9mIHxtZHwsIGluIGJ5dGVzLiAqLworc2l6ZV90IEVWUF9NRF9zaXplKGNvbnN0IEVWUF9NRCAqbWQpOworCisvKiBFVlBfTURfYmxvY2tfc2l6ZSByZXR1cm5zIHRoZSBuYXRpdmUgYmxvY2stc2l6ZSBvZiB8bWR8LiAqLworc2l6ZV90IEVWUF9NRF9ibG9ja19zaXplKGNvbnN0IEVWUF9NRCAqbWQpOworCisvKiBFVlBfTURfRkxBR19QS0VZX0RJR0VTVCBpbmRpY2F0ZXMgdGhlIHRoZSBkaWdlc3QgZnVuY3Rpb24gaXMgdXNlZCB3aXRoIGEKKyAqIHNwZWNpZmljIHB1YmxpYyBrZXkgaW4gb3JkZXIgdG8gdmVyaWZ5IHNpZ25hdHVyZXMuIChGb3IgZXhhbXBsZSwKKyAqIEVWUF9kc3MxLikgKi8KKyNkZWZpbmUgRVZQX01EX0ZMQUdfUEtFWV9ESUdFU1QgMQorCisvKiBFVlBfTURfRkxBR19ESUdBTEdJRF9BQlNFTlQgaW5kaWNhdGVzIHRoYXQgdGhlIHBhcmFtZXRlciB0eXBlIGluIGFuIFguNTA5CisgKiBEaWdlc3RBbGdvcml0aG1JZGVudGlmaWVyIHJlcHJlc2VudGluZyB0aGlzIGRpZ2VzdCBmdW5jdGlvbiBzaG91bGQgYmUKKyAqIHVuZGVmaW5lZCByYXRoZXIgdGhhbiBOVUxMLiAqLworI2RlZmluZSBFVlBfTURfRkxBR19ESUdBTEdJRF9BQlNFTlQgMgorCisKKy8qIERlcHJlY2F0ZWQgZnVuY3Rpb25zLiAqLworCisvKiBFVlBfTURfQ1RYX2NvcHkgc2V0cyB8b3V0fCwgd2hpY2ggbXVzdCAvbm90LyBiZSBpbml0aWFsaXNlZCwgdG8gYmUgYSBjb3B5IG9mCisgKiB8aW58LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG9uIGVycm9yLiAqLworaW50IEVWUF9NRF9DVFhfY29weShFVlBfTURfQ1RYICpvdXQsIGNvbnN0IEVWUF9NRF9DVFggKmluKTsKKworCisvKiBEaWdlc3Qgb3BlcmF0aW9uIGFjY2Vzc29ycy4gKi8KKworLyogRVZQX01EX0NUWF9tZCByZXR1cm5zIHRoZSB1bmRlcmx5aW5nIGRpZ2VzdCBmdW5jdGlvbiwgb3IgTlVMTCBpZiBvbmUgaGFzIG5vdAorICogYmVlbiBzZXQuICovCitjb25zdCBFVlBfTUQgKkVWUF9NRF9DVFhfbWQoY29uc3QgRVZQX01EX0NUWCAqY3R4KTsKKworLyogRVZQX01EX0NUWF9zaXplIHJldHVybnMgdGhlIGRpZ2VzdCBzaXplIG9mIHxjdHh8LiBJdCB3aWxsIGNyYXNoIGlmIGEgZGlnZXN0CisgKiBoYXNuJ3QgYmVlbiBzZXQgb24gfGN0eHwuICovCit1bnNpZ25lZCBFVlBfTURfQ1RYX3NpemUoY29uc3QgRVZQX01EX0NUWCAqY3R4KTsKKworLyogRVZQX01EX0NUWF9ibG9ja19zaXplIHJldHVybnMgdGhlIGJsb2NrIHNpemUgb2YgdGhlIGRpZ2VzdCBmdW5jdGlvbiB1c2VkIGJ5CisgKiB8Y3R4fC4gSXQgd2lsbCBjcmFzaCBpZiBhIGRpZ2VzdCBoYXNuJ3QgYmVlbiBzZXQgb24gfGN0eHwuICovCit1bnNpZ25lZCBFVlBfTURfQ1RYX2Jsb2NrX3NpemUoY29uc3QgRVZQX01EX0NUWCAqY3R4KTsKKworLyogRVZQX01EX0NUWF90eXBlIHJldHVybnMgYSBOSUQgZGVzY3JpYmluZyB0aGUgZGlnZXN0IGZ1bmN0aW9uIHVzZWQgYnkgfGN0eHwuCisgKiAoRm9yIGV4YW1wbGUsIHxOSURfbWQ1fC4pIEl0IHdpbGwgY3Jhc2ggaWYgYSBkaWdlc3QgaGFzbid0IGJlZW4gc2V0IG9uCisgKiB8Y3R4fC4gKi8KK2ludCBFVlBfTURfQ1RYX3R5cGUoY29uc3QgRVZQX01EX0NUWCAqY3R4KTsKKworLyogRVZQX01EX0NUWF9zZXRfZmxhZ3MgT1JzIHxmbGFnc3wgaW50byB0aGUgZmxhZ3MgbWVtYmVyIG9mIHxjdHh8LiAqLwordm9pZCBFVlBfTURfQ1RYX3NldF9mbGFncyhFVlBfTURfQ1RYICpjdHgsIHVpbnQzMl90IGZsYWdzKTsKKworLyogRVZQX01EX0NUWF9jbGVhcl9mbGFncyBjbGVhcnMgYW55IGJpdHMgZnJvbSB0aGUgZmxhZ3MgbWVtYmVyIG9mIHxjdHh8IHRoYXQKKyAqIGFyZSBzZXQgaW4gfGZsYWdzfC4gKi8KK3ZvaWQgRVZQX01EX0NUWF9jbGVhcl9mbGFncyhFVlBfTURfQ1RYICpjdHgsIHVpbnQzMl90IGZsYWdzKTsKKworLyogRVZQX01EX0NUWF90ZXN0X2ZsYWdzIHJldHVybnMgdGhlIEFORCBvZiB8ZmxhZ3N8IGFuZCB0aGUgZmxhZ3MgbWVtYmVyIG9mCisgKiB8Y3R4fC4gKi8KK3VpbnQzMl90IEVWUF9NRF9DVFhfdGVzdF9mbGFncyhjb25zdCBFVlBfTURfQ1RYICpjdHgsIHVpbnQzMl90IGZsYWdzKTsKKworCitzdHJ1Y3QgZXZwX21kX3BjdHhfb3BzOworCitzdHJ1Y3QgZW52X21kX2N0eF9zdCB7CisgIC8qIGRpZ2VzdCBpcyB0aGUgdW5kZXJseWluZyBkaWdlc3QgZnVuY3Rpb24sIG9yIE5VTEwgaWYgbm90IHNldC4gKi8KKyAgY29uc3QgRVZQX01EICpkaWdlc3Q7CisgIC8qIGZsYWdzIGlzIHRoZSBPUiBvZiBhIG51bWJlciBvZiB8RVZQX01EX0NUWF9GTEFHXyp8IHZhbHVlcy4gKi8KKyAgdWludDMyX3QgZmxhZ3M7CisgIC8qIG1kX2RhdGEgcG9pbnRzIHRvIGEgYmxvY2sgb2YgbWVtb3J5IHRoYXQgY29udGFpbnMgdGhlIGhhc2gtc3BlY2lmaWMKKyAgICogY29udGV4dC4gKi8KKyAgdm9pZCAqbWRfZGF0YTsKKyAgLyogdXBkYXRlIGlzIHVzdWFsbHkgY29waWVkIGZyb20gfGRpZ2VzdC0+dXBkYXRlfCBidXQgY2FuIGRpZmZlciBpbiBzb21lCisgICAqIGNhc2VzLCBpLmUuIEhNQUMuICovCisgIGludCAoKnVwZGF0ZSkoRVZQX01EX0NUWCAqY3R4LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgY291bnQpOworCisgIC8qIHBjdHggaXMgYW4gb3BhcXVlIChhdCB0aGlzIGxheWVyKSBwb2ludGVyIHRvIGFkZGl0aW9uYWwgY29udGV4dCB0aGF0CisgICAqIEVWUF9QS0VZIGZ1bmN0aW9ucyBtYXkgc3RvcmUgaW4gdGhpcyBvYmplY3QuICovCisgIEVWUF9QS0VZX0NUWCAqcGN0eDsKKworICAvKiBwY3R4X29wcywgaWYgbm90IE5VTEwsIHBvaW50cyB0byBhIHZ0YWJsZSB0aGF0IGNvbnRhaW5zIGZ1bmN0aW9ucyB0bworICAgKiBtYW5pcHVsYXRlIHxwY3R4fC4gKi8KKyAgY29uc3Qgc3RydWN0IGV2cF9tZF9wY3R4X29wcyAqcGN0eF9vcHM7Cit9IC8qIEVWUF9NRF9DVFggKi87CisKKy8qIEVWUF9NRF9DVFhfRkxBR19OT19JTklUIGNhdXNlcyB0aGUgfEVWUF9NRHwncyB8aW5pdHwgZnVuY3Rpb24gbm90IHRvIGJlCisgKiBjYWxsZWQsIHRoZSB8dXBkYXRlfCBtZW1iZXIgbm90IHRvIGJlIGNvcGllZCBmcm9tIHRoZSB8RVZQX01EfCBpbgorICogfEVWUF9EaWdlc3RJbml0X2V4fCBhbmQgZm9yIHxtZF9kYXRhfCBub3QgdG8gYmUgaW5pdGlhbGlzZWQuICovCisjZGVmaW5lIEVWUF9NRF9DVFhfRkxBR19OT19JTklUIDEKKworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30gIC8qIGV4dGVybiBDICovCisjZW5kaWYKKworI2RlZmluZSBESUdFU1RfRl9FVlBfRGlnZXN0SW5pdF9leCAxMDAKKyNkZWZpbmUgRElHRVNUX0ZfRVZQX01EX0NUWF9jb3B5X2V4IDEwMQorI2RlZmluZSBESUdFU1RfUl9JTlBVVF9OT1RfSU5JVElBTElaRUQgMTAwCisKKyNlbmRpZiAgLyogT1BFTlNTTF9IRUFERVJfRElHRVNUX0ggKi8KZGlmZiAtLWdpdCBhL2NyeXB0by9kaWdlc3QvZGlnZXN0X2Vycm9yLmMgYi9jcnlwdG8vZGlnZXN0L2RpZ2VzdF9lcnJvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MGE1ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vZGlnZXN0L2RpZ2VzdF9lcnJvci5jCkBAIC0wLDAgKzEsMjQgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNCwgR29vZ2xlIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisKKyNpbmNsdWRlICJkaWdlc3QuaCIKKworY29uc3QgRVJSX1NUUklOR19EQVRBIERJR0VTVF9lcnJvcl9zdHJpbmdfZGF0YVtdID0geworICB7RVJSX1BBQ0soRVJSX0xJQl9ESUdFU1QsIERJR0VTVF9GX0VWUF9EaWdlc3RJbml0X2V4LCAwKSwgIkVWUF9EaWdlc3RJbml0X2V4In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0RJR0VTVCwgRElHRVNUX0ZfRVZQX01EX0NUWF9jb3B5X2V4LCAwKSwgIkVWUF9NRF9DVFhfY29weV9leCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9ESUdFU1QsIDAsIERJR0VTVF9SX0lOUFVUX05PVF9JTklUSUFMSVpFRCksICJJTlBVVF9OT1RfSU5JVElBTElaRUQifSwKKyAgezAsIE5VTEx9LAorfTsKZGlmZiAtLWdpdCBhL2NyeXB0by9kaWdlc3QvZGlnZXN0cy5jIGIvY3J5cHRvL2RpZ2VzdC9kaWdlc3RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc1N2VhOAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9kaWdlc3QvZGlnZXN0cy5jCkBAIC0wLDAgKzEsMjE1IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9kaWdlc3QuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NoYS5oPgorCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworCitzdGF0aWMgaW50IG1kNV9pbml0KEVWUF9NRF9DVFggKmN0eCkgeyByZXR1cm4gTUQ1X0luaXQoY3R4LT5tZF9kYXRhKTsgfQorCitzdGF0aWMgaW50IG1kNV91cGRhdGUoRVZQX01EX0NUWCAqY3R4LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgY291bnQpIHsKKyAgcmV0dXJuIE1ENV9VcGRhdGUoY3R4LT5tZF9kYXRhLCBkYXRhLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbnQgbWQ1X2ZpbmFsKEVWUF9NRF9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0KSB7CisgIHJldHVybiBNRDVfRmluYWwob3V0LCBjdHgtPm1kX2RhdGEpOworfQorCitzdGF0aWMgY29uc3QgRVZQX01EIG1kNV9tZCA9IHsKKyAgICBOSURfbWQ1LCAgICBNRDVfRElHRVNUX0xFTkdUSCwgMCAvKiBmbGFncyAqLywgICAgICAgbWQ1X2luaXQsCisgICAgbWQ1X3VwZGF0ZSwgbWQ1X2ZpbmFsLCAgICAgICAgIDY0IC8qIGJsb2NrIHNpemUgKi8sIHNpemVvZihNRDVfQ1RYKSwKK307CisKK2NvbnN0IEVWUF9NRCAqRVZQX21kNSh2b2lkKSB7IHJldHVybiAmbWQ1X21kOyB9CisKKworc3RhdGljIGludCBzaGExX2luaXQoRVZQX01EX0NUWCAqY3R4KSB7IHJldHVybiBTSEExX0luaXQoY3R4LT5tZF9kYXRhKTsgfQorCitzdGF0aWMgaW50IHNoYTFfdXBkYXRlKEVWUF9NRF9DVFggKmN0eCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGNvdW50KSB7CisgIHJldHVybiBTSEExX1VwZGF0ZShjdHgtPm1kX2RhdGEsIGRhdGEsIGNvdW50KTsKK30KKworc3RhdGljIGludCBzaGExX2ZpbmFsKEVWUF9NRF9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqbWQpIHsKKyAgcmV0dXJuIFNIQTFfRmluYWwobWQsIGN0eC0+bWRfZGF0YSk7Cit9CisKK3N0YXRpYyBjb25zdCBFVlBfTUQgc2hhMV9tZCA9IHsKKyAgICBOSURfc2hhMSwgICAgU0hBX0RJR0VTVF9MRU5HVEgsIDAgLyogZmxhZ3MgKi8sICAgICAgIHNoYTFfaW5pdCwKKyAgICBzaGExX3VwZGF0ZSwgc2hhMV9maW5hbCwgICAgICAgIDY0IC8qIGJsb2NrIHNpemUgKi8sIHNpemVvZihTSEFfQ1RYKSwKK307CisKK2NvbnN0IEVWUF9NRCAqRVZQX3NoYTEodm9pZCkgeyByZXR1cm4gJnNoYTFfbWQ7IH0KKworCitzdGF0aWMgaW50IHNoYTIyNF9pbml0KEVWUF9NRF9DVFggKmN0eCkgeyByZXR1cm4gU0hBMjI0X0luaXQoY3R4LT5tZF9kYXRhKTsgfQorCitzdGF0aWMgaW50IHNoYTIyNF91cGRhdGUoRVZQX01EX0NUWCAqY3R4LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgY291bnQpIHsKKyAgcmV0dXJuIFNIQTIyNF9VcGRhdGUoY3R4LT5tZF9kYXRhLCBkYXRhLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbnQgc2hhMjI0X2ZpbmFsKEVWUF9NRF9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqbWQpIHsKKyAgcmV0dXJuIFNIQTIyNF9GaW5hbChtZCwgY3R4LT5tZF9kYXRhKTsKK30KKworc3RhdGljIGNvbnN0IEVWUF9NRCBzaGEyMjRfbWQgPSB7CisgICAgTklEX3NoYTIyNCwgICAgICAgICAgU0hBMjI0X0RJR0VTVF9MRU5HVEgsIDAgLyogZmxhZ3MgKi8sCisgICAgc2hhMjI0X2luaXQsICAgICAgICAgc2hhMjI0X3VwZGF0ZSwgICAgICAgIHNoYTIyNF9maW5hbCwKKyAgICA2NCAvKiBibG9jayBzaXplICovLCBzaXplb2YoU0hBMjU2X0NUWCksCit9OworCitjb25zdCBFVlBfTUQgKkVWUF9zaGEyMjQodm9pZCkgeyByZXR1cm4gJnNoYTIyNF9tZDsgfQorCisKK3N0YXRpYyBpbnQgc2hhMjU2X2luaXQoRVZQX01EX0NUWCAqY3R4KSB7IHJldHVybiBTSEEyNTZfSW5pdChjdHgtPm1kX2RhdGEpOyB9CisKK3N0YXRpYyBpbnQgc2hhMjU2X3VwZGF0ZShFVlBfTURfQ1RYICpjdHgsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBjb3VudCkgeworICByZXR1cm4gU0hBMjU2X1VwZGF0ZShjdHgtPm1kX2RhdGEsIGRhdGEsIGNvdW50KTsKK30KKworc3RhdGljIGludCBzaGEyNTZfZmluYWwoRVZQX01EX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICptZCkgeworICByZXR1cm4gU0hBMjU2X0ZpbmFsKG1kLCBjdHgtPm1kX2RhdGEpOworfQorCitzdGF0aWMgY29uc3QgRVZQX01EIHNoYTI1Nl9tZCA9IHsKKyAgICBOSURfc2hhMjU2LCAgICAgICAgICBTSEEyNTZfRElHRVNUX0xFTkdUSCwgMCAvKiBmbGFncyAqLywKKyAgICBzaGEyNTZfaW5pdCwgICAgICAgICBzaGEyNTZfdXBkYXRlLCAgICAgICAgc2hhMjU2X2ZpbmFsLAorICAgIDY0IC8qIGJsb2NrIHNpemUgKi8sIHNpemVvZihTSEEyNTZfQ1RYKSwKK307CisKK2NvbnN0IEVWUF9NRCAqRVZQX3NoYTI1Nih2b2lkKSB7IHJldHVybiAmc2hhMjU2X21kOyB9CisKKworc3RhdGljIGludCBzaGEzODRfaW5pdChFVlBfTURfQ1RYICpjdHgpIHsgcmV0dXJuIFNIQTM4NF9Jbml0KGN0eC0+bWRfZGF0YSk7IH0KKworc3RhdGljIGludCBzaGEzODRfdXBkYXRlKEVWUF9NRF9DVFggKmN0eCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGNvdW50KSB7CisgIHJldHVybiBTSEEzODRfVXBkYXRlKGN0eC0+bWRfZGF0YSwgZGF0YSwgY291bnQpOworfQorCitzdGF0aWMgaW50IHNoYTM4NF9maW5hbChFVlBfTURfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm1kKSB7CisgIHJldHVybiBTSEEzODRfRmluYWwobWQsIGN0eC0+bWRfZGF0YSk7Cit9CisKK3N0YXRpYyBjb25zdCBFVlBfTUQgc2hhMzg0X21kID0geworICAgIE5JRF9zaGEzODQsICAgICAgICAgICBTSEEzODRfRElHRVNUX0xFTkdUSCwgMCAvKiBmbGFncyAqLywKKyAgICBzaGEzODRfaW5pdCwgICAgICAgICAgc2hhMzg0X3VwZGF0ZSwgICAgICAgIHNoYTM4NF9maW5hbCwKKyAgICAxMjggLyogYmxvY2sgc2l6ZSAqLywgc2l6ZW9mKFNIQTUxMl9DVFgpLAorfTsKKworY29uc3QgRVZQX01EICpFVlBfc2hhMzg0KHZvaWQpIHsgcmV0dXJuICZzaGEzODRfbWQ7IH0KKworCitzdGF0aWMgaW50IHNoYTUxMl9pbml0KEVWUF9NRF9DVFggKmN0eCkgeyByZXR1cm4gU0hBNTEyX0luaXQoY3R4LT5tZF9kYXRhKTsgfQorCitzdGF0aWMgaW50IHNoYTUxMl91cGRhdGUoRVZQX01EX0NUWCAqY3R4LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgY291bnQpIHsKKyAgcmV0dXJuIFNIQTUxMl9VcGRhdGUoY3R4LT5tZF9kYXRhLCBkYXRhLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbnQgc2hhNTEyX2ZpbmFsKEVWUF9NRF9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqbWQpIHsKKyAgcmV0dXJuIFNIQTUxMl9GaW5hbChtZCwgY3R4LT5tZF9kYXRhKTsKK30KKworc3RhdGljIGNvbnN0IEVWUF9NRCBzaGE1MTJfbWQgPSB7CisgICAgTklEX3NoYTUxMiwgICAgICAgICAgIFNIQTUxMl9ESUdFU1RfTEVOR1RILCAwIC8qIGZsYWdzICovLAorICAgIHNoYTUxMl9pbml0LCAgICAgICAgICBzaGE1MTJfdXBkYXRlLCAgICAgICAgc2hhNTEyX2ZpbmFsLAorICAgIDEyOCAvKiBibG9jayBzaXplICovLCBzaXplb2YoU0hBNTEyX0NUWCksCit9OworCitjb25zdCBFVlBfTUQgKkVWUF9zaGE1MTIodm9pZCkgeyByZXR1cm4gJnNoYTUxMl9tZDsgfQorCitzdHJ1Y3QgbmlkX3RvX2RpZ2VzdCB7CisgIGludCBuaWQ7CisgIGNvbnN0IEVWUF9NRCAqKCptZF9mdW5jKSgpOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBuaWRfdG9fZGlnZXN0IG5pZF90b19kaWdlc3RfbWFwcGluZ1tdID0geworICB7IE5JRF9tZDUsIEVWUF9tZDUgfSwKKyAgeyBOSURfc2hhMSwgRVZQX3NoYTEgfSwKKyAgeyBOSURfc2hhMjI0LCBFVlBfc2hhMjI0IH0sCisgIHsgTklEX3NoYTI1NiwgRVZQX3NoYTI1NiB9LAorICB7IE5JRF9zaGEzODQsIEVWUF9zaGEzODQgfSwKKyAgeyBOSURfc2hhNTEyLCBFVlBfc2hhNTEyIH0sCisgIHsgTklEX2RzYVdpdGhTSEEsIEVWUF9zaGExIH0sCisgIHsgTklEX2RzYVdpdGhTSEExLCBFVlBfc2hhMSB9LAorICB7IE5JRF9lY2RzYV93aXRoX1NIQTEsIEVWUF9zaGExIH0sCisgIHsgTklEX21kNVdpdGhSU0FFbmNyeXB0aW9uLCBFVlBfbWQ1IH0sCisgIHsgTklEX3NoYTFXaXRoUlNBRW5jcnlwdGlvbiwgRVZQX3NoYTEgfSwKKyAgeyBOSURfc2hhMjI0V2l0aFJTQUVuY3J5cHRpb24sIEVWUF9zaGEyMjQgfSwKKyAgeyBOSURfc2hhMjU2V2l0aFJTQUVuY3J5cHRpb24sIEVWUF9zaGEyNTYgfSwKKyAgeyBOSURfc2hhMzg0V2l0aFJTQUVuY3J5cHRpb24sIEVWUF9zaGEzODQgfSwKKyAgeyBOSURfc2hhNTEyV2l0aFJTQUVuY3J5cHRpb24sIEVWUF9zaGE1MTIgfSwKK307CisKK2NvbnN0IEVWUF9NRCogRVZQX2dldF9kaWdlc3RieW5pZChpbnQgbmlkKSB7CisgIHVuc2lnbmVkIGk7CisKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZihuaWRfdG9fZGlnZXN0X21hcHBpbmcpIC8gc2l6ZW9mKHN0cnVjdCBuaWRfdG9fZGlnZXN0KTsKKyAgICAgICBpKyspIHsKKyAgICBpZiAobmlkX3RvX2RpZ2VzdF9tYXBwaW5nW2ldLm5pZCA9PSBuaWQpIHsKKyAgICAgIHJldHVybiBuaWRfdG9fZGlnZXN0X21hcHBpbmdbaV0ubWRfZnVuYygpOworICAgIH0KKyAgfQorCisgIHJldHVybiBOVUxMOworfQorCitjb25zdCBFVlBfTUQqIEVWUF9nZXRfZGlnZXN0YnlvYmooY29uc3QgQVNOMV9PQkpFQ1QgKm9iaikgeworICByZXR1cm4gRVZQX2dldF9kaWdlc3RieW5pZChPQkpfb2JqMm5pZChvYmopKTsKK30KZGlmZiAtLWdpdCBhL2NyeXB0by9kaWdlc3QvaW50ZXJuYWwuaCBiL2NyeXB0by9kaWdlc3QvaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGRiZmFhCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2RpZ2VzdC9pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMTE3IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaWZuZGVmIE9QRU5TU0xfSEVBREVSX0RJR0VTVF9JTlRFUk5BTF9ICisjZGVmaW5lIE9QRU5TU0xfSEVBREVSX0RJR0VTVF9JTlRFUk5BTF9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jhc2UuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKK3N0cnVjdCBlbnZfbWRfc3QgeworICAvKiB0eXBlIGNvbnRhaW5zIGEgTklEIGlkZW50aWZpbmcgdGhlIGRpZ2VzdCBmdW5jdGlvbi4gKEZvciBleGFtcGxlLAorICAgKiBOSURfbWQ1LikgKi8KKyAgaW50IHR5cGU7CisKKyAgLyogbWRfc2l6ZSBjb250YWlucyB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSByZXN1bHRpbmcgZGlnZXN0LiAqLworICB1bnNpZ25lZCBtZF9zaXplOworCisgIC8qIGZsYWdzIGNvbnRhaW5zIHRoZSBPUiBvZiB8RVZQX01EX0ZMQUdfKnwgdmFsdWVzLiAqLworICB1aW50MzJfdCBmbGFnczsKKworICAvKiBpbml0IGluaXRpYWxpc2VzIHRoZSBzdGF0ZSBpbiB8Y3R4LT5tZF9kYXRhfC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcworICAgKiBhbmQgemVybyBvdGhlcndpc2UuICovCisgIGludCAoKmluaXQpKEVWUF9NRF9DVFggKmN0eCk7CisKKyAgLyogdXBkYXRlIGhhc2hlcyB8bGVufCBieXRlcyBvZiB8ZGF0YXwgaW50byB0aGUgc3RhdGUgaW4gfGN0eC0+bWRfZGF0YXwuICovCisgIGludCAoKnVwZGF0ZSkoRVZQX01EX0NUWCAqY3R4LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgY291bnQpOworCisgIC8qIGZpbmFsIGNvbXBsZXRlcyB0aGUgaGFzaCBhbmQgd3JpdGVzIHxtZF9zaXplfCBieXRlcyBvZiBkaWdlc3QgdG8gfG91dHwuICovCisgIGludCAoKmZpbmFsKShFVlBfTURfQ1RYICpjdHgsIHVpbnQ4X3QgKm91dCk7CisKKyAgLyogYmxvY2tfc2l6ZSBjb250YWlucyB0aGUgaGFzaCdzIG5hdGl2ZSBibG9jayBzaXplLiAqLworICB1bnNpZ25lZCBibG9ja19zaXplOworCisgIC8qIGN0eF9zaXplIGNvbnRhaW5zIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIHN0YXRlIG9mIHRoZSBoYXNoIGZ1bmN0aW9uLiAqLworICB1bnNpZ25lZCBjdHhfc2l6ZTsKK307CisKKy8qIGV2cF9tZF9wY3R4X29wcyBjb250YWlucyBmdW5jdGlvbiBwb2ludGVycyB0byBhbGxvdyB0aGUgfHBjdHh8IG1lbWJlciBvZgorICogfEVWUF9NRF9DVFh8IHRvIGJlIG1hbmlwdWxhdGVkIHdpdGhvdXQgYnJlYWtpbmcgbGF5aW5nIGJ5IGNhbGxpbmcgRVZQCisgKiBmdW5jdGlvbnMuICovCitzdHJ1Y3QgZXZwX21kX3BjdHhfb3BzIHsKKyAgLyogZnJlZSBpcyBjYWxsZWQgd2hlbiBhbiB8RVZQX01EX0NUWHwgaXMgYmVpbmcgZnJlZWQgYW5kIHRoZSB8cGN0eHwgYWxzbworICAgKiBuZWVkcyB0byBiZSBmcmVlZC4gKi8KKyAgdm9pZCAoKmZyZWUpIChFVlBfUEtFWV9DVFggKnBjdHgpOworCisgIC8qIGR1cCBpcyBjYWxsZWQgd2hlbiBhbiB8RVZQX01EX0NUWHwgaXMgY29waWVkIGFuZCBzbyB0aGUgfHBjdHh8IGFsc28gbmVlZHMKKyAgICogdG8gYmUgY29waWVkLiAqLworICBFVlBfUEtFWV9DVFgqICgqZHVwKSAoRVZQX1BLRVlfQ1RYICpwY3R4KTsKKworICAvKiBiZWdpbl9kaWdlc3QgaXMgY2FsbGVkIHdoZW4gYSBuZXcgZGlnZXN0IG9wZXJhdGlvbiBpcyBzdGFydGVkLiBJdCByZXR1cm5zCisgICAqIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG90aGVyd2lzZS4gKi8KKyAgaW50ICgqYmVnaW5fZGlnZXN0KSAoRVZQX01EX0NUWCAqY3R4KTsKK307CisKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9ICAvKiBleHRlcm4gQyAqLworI2VuZGlmCisKKyNlbmRpZiAgLyogT1BFTlNTTF9IRUFERVJfRElHRVNUX0lOVEVSTkFMICovCmRpZmYgLS1naXQgYS9jcnlwdG8vZGlnZXN0L21kMzJfY29tbW9uLmggYi9jcnlwdG8vZGlnZXN0L21kMzJfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDllODQzMgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9kaWdlc3QvbWQzMl9jb21tb24uaApAQCAtMCwwICsxLDM3MCBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA3IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyNpZm5kZWYgT1BFTlNTTF9IRUFERVJfTUQzMl9DT01NT05fSAorI2RlZmluZSBPUEVOU1NMX0hFQURFUl9NRDMyX0NPTU1PTl9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jhc2UuaD4KKworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgYXNtIF9fYXNtX18KKworLyogVGhpcyBpcyBhIGdlbmVyaWMgMzIgYml0ICJjb2xsZWN0b3IiIGZvciBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG1zLgorICogV2hlbmV2ZXIgbmVlZGVkIGl0IGNvbGxlY3RzIGlucHV0IGNoYXJhY3RlciBzdHJlYW0gaW50byBjaHVua3Mgb2YKKyAqIDMyIGJpdCB2YWx1ZXMgYW5kIGludm9rZXMgYSBibG9jayBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGFjdHVhbCBoYXNoCisgKiBjYWxjdWxhdGlvbnMuCisgKgorICogUG9ydGluZyBndWlkZS4KKyAqCisgKiBPYmxpZ2F0b3J5IG1hY3JvczoKKyAqCisgKiBEQVRBX09SREVSX0lTX0JJR19FTkRJQU4gb3IgREFUQV9PUkRFUl9JU19MSVRUTEVfRU5ESUFOCisgKgl0aGlzIG1hY3JvIGRlZmluZXMgYnl0ZSBvcmRlciBvZiBpbnB1dCBzdHJlYW0uCisgKiBIQVNIX0NCTE9DSworICoJc2l6ZSBvZiBhIHVuaXQgY2h1bmsgSEFTSF9CTE9DSyBvcGVyYXRlcyBvbi4KKyAqIEhBU0hfTE9ORworICoJaGFzIHRvIGJlIGF0IGxlc3QgMzIgYml0IHdpZGUsIGlmIGl0J3Mgd2lkZXIsIHRoZW4KKyAqCUhBU0hfTE9OR19MT0cyICpoYXMgdG8qIGJlIGRlZmluZWQgYWxvbmcKKyAqIEhBU0hfQ1RYCisgKgljb250ZXh0IHN0cnVjdHVyZSB0aGF0IGF0IGxlYXN0IGNvbnRhaW5zIGZvbGxvd2luZworICoJbWVtYmVyczoKKyAqCQl0eXBlZGVmIHN0cnVjdCB7CisgKgkJCS4uLgorICoJCQlIQVNIX0xPTkcJTmwsTmg7CisgKgkJCWVpdGhlciB7CisgKgkJCUhBU0hfTE9ORwlkYXRhW0hBU0hfTEJMT0NLXTsKKyAqCQkJdW5zaWduZWQgY2hhcglkYXRhW0hBU0hfQ0JMT0NLXTsKKyAqCQkJfTsKKyAqCQkJdW5zaWduZWQgaW50CW51bTsKKyAqCQkJLi4uCisgKgkJCX0gSEFTSF9DVFg7CisgKglkYXRhW10gdmVjdG9yIGlzIGV4cGVjdGVkIHRvIGJlIHplcm9lZCB1cG9uIGZpcnN0IGNhbGwgdG8KKyAqCUhBU0hfVVBEQVRFLgorICogSEFTSF9VUERBVEUKKyAqCW5hbWUgb2YgIlVwZGF0ZSIgZnVuY3Rpb24sIGltcGxlbWVudGVkIGhlcmUuCisgKiBIQVNIX1RSQU5TRk9STQorICoJbmFtZSBvZiAiVHJhbnNmb3JtIiBmdW5jdGlvbiwgaW1wbGVtZW50ZWQgaGVyZS4KKyAqIEhBU0hfRklOQUwKKyAqCW5hbWUgb2YgIkZpbmFsIiBmdW5jdGlvbiwgaW1wbGVtZW50ZWQgaGVyZS4KKyAqIEhBU0hfQkxPQ0tfREFUQV9PUkRFUgorICoJbmFtZSBvZiAiYmxvY2siIGZ1bmN0aW9uIGNhcGFibGUgb2YgdHJlYXRpbmcgKnVuYWxpZ25lZCogaW5wdXQKKyAqCW1lc3NhZ2UgaW4gb3JpZ2luYWwgKGRhdGEpIGJ5dGUgb3JkZXIsIGltcGxlbWVudGVkIGV4dGVybmFsbHkuCisgKiBIQVNIX01BS0VfU1RSSU5HCisgKgltYWNybyBjb252ZXJpbmcgY29udGV4dCB2YXJpYWJsZXMgdG8gYW4gQVNDSUkgaGFzaCBzdHJpbmcuCisgKgorICogTUQ1IGV4YW1wbGU6CisgKgorICoJI2RlZmluZSBEQVRBX09SREVSX0lTX0xJVFRMRV9FTkRJQU4KKyAqCisgKgkjZGVmaW5lIEhBU0hfTE9ORwkJTUQ1X0xPTkcKKyAqCSNkZWZpbmUgSEFTSF9MT05HX0xPRzIJCU1ENV9MT05HX0xPRzIKKyAqCSNkZWZpbmUgSEFTSF9DVFgJCU1ENV9DVFgKKyAqCSNkZWZpbmUgSEFTSF9DQkxPQ0sJCU1ENV9DQkxPQ0sKKyAqCSNkZWZpbmUgSEFTSF9VUERBVEUJCU1ENV9VcGRhdGUKKyAqCSNkZWZpbmUgSEFTSF9UUkFOU0ZPUk0JCU1ENV9UcmFuc2Zvcm0KKyAqCSNkZWZpbmUgSEFTSF9GSU5BTAkJTUQ1X0ZpbmFsCisgKgkjZGVmaW5lIEhBU0hfQkxPQ0tfREFUQV9PUkRFUgltZDVfYmxvY2tfZGF0YV9vcmRlcgorICoKKyAqCQkJCQk8YXBwcm9AZnkuY2hhbG1lcnMuc2U+CisgKi8KKworI2lmICFkZWZpbmVkKERBVEFfT1JERVJfSVNfQklHX0VORElBTikgJiYgIWRlZmluZWQoREFUQV9PUkRFUl9JU19MSVRUTEVfRU5ESUFOKQorI2Vycm9yICJEQVRBX09SREVSIG11c3QgYmUgZGVmaW5lZCEiCisjZW5kaWYKKworI2lmbmRlZiBIQVNIX0NCTE9DSworI2Vycm9yICJIQVNIX0NCTE9DSyBtdXN0IGJlIGRlZmluZWQhIgorI2VuZGlmCisjaWZuZGVmIEhBU0hfTE9ORworI2Vycm9yICJIQVNIX0xPTkcgbXVzdCBiZSBkZWZpbmVkISIKKyNlbmRpZgorI2lmbmRlZiBIQVNIX0NUWAorI2Vycm9yICJIQVNIX0NUWCBtdXN0IGJlIGRlZmluZWQhIgorI2VuZGlmCisKKyNpZm5kZWYgSEFTSF9VUERBVEUKKyNlcnJvciAiSEFTSF9VUERBVEUgbXVzdCBiZSBkZWZpbmVkISIKKyNlbmRpZgorI2lmbmRlZiBIQVNIX1RSQU5TRk9STQorI2Vycm9yICJIQVNIX1RSQU5TRk9STSBtdXN0IGJlIGRlZmluZWQhIgorI2VuZGlmCisjaWZuZGVmIEhBU0hfRklOQUwKKyNlcnJvciAiSEFTSF9GSU5BTCBtdXN0IGJlIGRlZmluZWQhIgorI2VuZGlmCisKKyNpZm5kZWYgSEFTSF9CTE9DS19EQVRBX09SREVSCisjZXJyb3IgIkhBU0hfQkxPQ0tfREFUQV9PUkRFUiBtdXN0IGJlIGRlZmluZWQhIgorI2VuZGlmCisKKy8qCisgKiBFbmdhZ2UgY29tcGlsZXIgc3BlY2lmaWMgcm90YXRlIGludHJpbnNpYyBmdW5jdGlvbiBpZiBhdmFpbGFibGUuCisgKi8KKyN1bmRlZiBST1RBVEUKKyMgaWYgZGVmaW5lZChfTVNDX1ZFUikKKyMgIGRlZmluZSBST1RBVEUoYSxuKQlfbHJvdGwoYSxuKQorIyBlbGlmIGRlZmluZWQoX19JQ0MpCisjICBkZWZpbmUgUk9UQVRFKGEsbikJX3JvdGwoYSxuKQorIyBlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fPj0yICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fQVNNKQorICAvKgorICAgKiBTb21lIEdOVSBDIGlubGluZSBhc3NlbWJsZXIgdGVtcGxhdGVzLiBOb3RlIHRoYXQgdGhlc2UgYXJlCisgICAqIHJvdGF0ZXMgYnkgKmNvbnN0YW50KiBudW1iZXIgb2YgYml0cyEgQnV0IHRoYXQncyBleGFjdGx5CisgICAqIHdoYXQgd2UgbmVlZCBoZXJlLi4uCisgICAqIAkJCQkJPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPgorICAgKi8KKyMgIGlmIGRlZmluZWQoT1BFTlNTTF9YODYpIHx8IGRlZmluZWQoT1BFTlNTTF9YODZfNjQpCisjICAgZGVmaW5lIFJPVEFURShhLG4pCSh7IHJlZ2lzdGVyIHVuc2lnbmVkIGludCByZXQ7CVwKKwkJCQlhc20gKAkJCVwKKwkJCQkicm9sbCAlMSwlMCIJCVwKKwkJCQk6ICI9ciIocmV0KQkJXAorCQkJCTogIkkiKG4pLCAiMCIoKHVuc2lnbmVkIGludCkoYSkpCVwKKwkJCQk6ICJjYyIpOwkJXAorCQkJICAgcmV0OwkJCQlcCisJCQl9KQorIyBlbmRpZgorI2VuZGlmIC8qIFBFREFOVElDICovCisKKyNpZm5kZWYgUk9UQVRFCisjZGVmaW5lIFJPVEFURShhLG4pICAgICAoKChhKTw8KG4pKXwoKChhKSYweGZmZmZmZmZmKT4+KDMyLShuKSkpKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKERBVEFfT1JERVJfSVNfQklHX0VORElBTikKKworI2lmbmRlZiBQRURBTlRJQworIyBpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXz49MiAmJiAhZGVmaW5lZChPUEVOU1NMX05PX0FTTSkKKyMgaWYgZGVmaW5lZChPUEVOU1NMX1g4NikgfHwgZGVmaW5lZChPUEVOU1NMX1g4Nl82NCkKKyAgICAvKgorICAgICAqIFRoaXMgZ2l2ZXMgfjMwLTQwJSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBpbiBTSEEtMjU2IGNvbXBpbGVkCisgICAgICogd2l0aCBnY2MgW29uIFA0XS4gV2VsbCwgZmlyc3QgbWFjcm8gdG8gYmUgZnJhbmsuIFdlIGNhbiBwdWxsCisgICAgICogdGhpcyB0cmljayBvbiB4ODYqIHBsYXRmb3JtcyBvbmx5LCBiZWNhdXNlIHRoZXNlIENQVXMgY2FuIGZldGNoCisgICAgICogdW5hbGlnbmVkIGRhdGEgd2l0aG91dCByYWlzaW5nIGFuIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyMgICBkZWZpbmUgSE9TVF9jMmwoYyxsKQkoeyB1bnNpZ25lZCBpbnQgcj0qKChjb25zdCB1bnNpZ25lZCBpbnQgKikoYykpOwlcCisJCQkJICAgYXNtICgiYnN3YXBsICUwIjoiPXIiKHIpOiIwIihyKSk7CVwKKwkJCQkgICAoYykrPTQ7IChsKT1yOwkJCX0pCisjICAgZGVmaW5lIEhPU1RfbDJjKGwsYykJKHsgdW5zaWduZWQgaW50IHI9KGwpOwkJCVwKKwkJCQkgICBhc20gKCJic3dhcGwgJTAiOiI9ciIocik6IjAiKHIpKTsJXAorCQkJCSAgICooKHVuc2lnbmVkIGludCAqKShjKSk9cjsgKGMpKz00OyByOwl9KQorIyAgZWxpZiBkZWZpbmVkKF9fYWFyY2g2NF9fKQorIyAgIGlmIGRlZmluZWQoX19CWVRFX09SREVSX18pCisjICAgIGlmIGRlZmluZWQoX19PUkRFUl9MSVRUTEVfRU5ESUFOX18pICYmIF9fQllURV9PUkRFUl9fPT1fX09SREVSX0xJVFRMRV9FTkRJQU5fXworIyAgICAgZGVmaW5lIEhPU1RfYzJsKGMsbCkJKHsgdW5zaWduZWQgaW50IHI7CQlcCisJCQkJICAgYXNtICgicmV2CSV3MCwldzEiCVwKKwkJCQkJOiI9ciIocikJCVwKKwkJCQkJOiJyIigqKChjb25zdCB1bnNpZ25lZCBpbnQgKikoYykpKSk7XAorCQkJCSAgIChjKSs9NDsgKGwpPXI7CQl9KQorIyAgICAgZGVmaW5lIEhPU1RfbDJjKGwsYykJKHsgdW5zaWduZWQgaW50IHI7CQlcCisJCQkJICAgYXNtICgicmV2CSV3MCwldzEiCVwKKwkJCQkJOiI9ciIocikJCVwKKwkJCQkJOiJyIigodW5zaWduZWQgaW50KShsKSkpO1wKKwkJCQkgICAqKCh1bnNpZ25lZCBpbnQgKikoYykpPXI7IChjKSs9NDsgcjsJfSkKKyMgICAgZWxpZiBkZWZpbmVkKF9fT1JERVJfQklHX0VORElBTl9fKSAmJiBfX0JZVEVfT1JERVJfXz09X19PUkRFUl9CSUdfRU5ESUFOX18KKyMgICAgIGRlZmluZSBIT1NUX2MybChjLGwpCSgobCk9KigoY29uc3QgdW5zaWduZWQgaW50ICopKGMpKSwgKGMpKz00LCAobCkpCisjICAgICBkZWZpbmUgSE9TVF9sMmMobCxjKQkoKigodW5zaWduZWQgaW50ICopKGMpKT0obCksIChjKSs9NCwgKGwpKQorIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgSE9TVF9jMmwKKyNkZWZpbmUgSE9TVF9jMmwoYyxsKQkobCA9KCgodW5zaWduZWQgbG9uZykoKigoYykrKykpKTw8MjQpLAkJXAorCQkJIGx8PSgoKHVuc2lnbmVkIGxvbmcpKCooKGMpKyspKSk8PDE2KSwJCVwKKwkJCSBsfD0oKCh1bnNpZ25lZCBsb25nKSgqKChjKSsrKSkpPDwgOCksCQlcCisJCQkgbHw9KCgodW5zaWduZWQgbG9uZykoKigoYykrKykpKSAgICApLAkJXAorCQkJIGwpCisjZW5kaWYKKyNpZm5kZWYgSE9TVF9sMmMKKyNkZWZpbmUgSE9TVF9sMmMobCxjKQkoKigoYykrKyk9KHVuc2lnbmVkIGNoYXIpKCgobCk+PjI0KSYweGZmKSwJXAorCQkJICooKGMpKyspPSh1bnNpZ25lZCBjaGFyKSgoKGwpPj4xNikmMHhmZiksCVwKKwkJCSAqKChjKSsrKT0odW5zaWduZWQgY2hhcikoKChsKT4+IDgpJjB4ZmYpLAlcCisJCQkgKigoYykrKyk9KHVuc2lnbmVkIGNoYXIpKCgobCkgICAgKSYweGZmKSwJXAorCQkJIGwpCisjZW5kaWYKKworI2VsaWYgZGVmaW5lZChEQVRBX09SREVSX0lTX0xJVFRMRV9FTkRJQU4pCisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfWDg2KSB8fCBkZWZpbmVkKE9QRU5TU0xfWDg2XzY0KQorICAgLyogU2VlIGNvbW1lbnQgaW4gREFUQV9PUkRFUl9JU19CSUdfRU5ESUFOIHNlY3Rpb24uICovCisjICBkZWZpbmUgSE9TVF9jMmwoYyxsKQkoKGwpPSooKGNvbnN0IHVuc2lnbmVkIGludCAqKShjKSksIChjKSs9NCwgbCkKKyMgIGRlZmluZSBIT1NUX2wyYyhsLGMpCSgqKCh1bnNpZ25lZCBpbnQgKikoYykpPShsKSwgKGMpKz00LCBsKQorI2VuZGlmCisKKyNpZm5kZWYgSE9TVF9jMmwKKyNkZWZpbmUgSE9TVF9jMmwoYyxsKQkobCA9KCgodW5zaWduZWQgbG9uZykoKigoYykrKykpKSAgICApLAkJXAorCQkJIGx8PSgoKHVuc2lnbmVkIGxvbmcpKCooKGMpKyspKSk8PCA4KSwJCVwKKwkJCSBsfD0oKCh1bnNpZ25lZCBsb25nKSgqKChjKSsrKSkpPDwxNiksCQlcCisJCQkgbHw9KCgodW5zaWduZWQgbG9uZykoKigoYykrKykpKTw8MjQpLAkJXAorCQkJIGwpCisjZW5kaWYKKyNpZm5kZWYgSE9TVF9sMmMKKyNkZWZpbmUgSE9TVF9sMmMobCxjKQkoKigoYykrKyk9KHVuc2lnbmVkIGNoYXIpKCgobCkgICAgKSYweGZmKSwJXAorCQkJICooKGMpKyspPSh1bnNpZ25lZCBjaGFyKSgoKGwpPj4gOCkmMHhmZiksCVwKKwkJCSAqKChjKSsrKT0odW5zaWduZWQgY2hhcikoKChsKT4+MTYpJjB4ZmYpLAlcCisJCQkgKigoYykrKyk9KHVuc2lnbmVkIGNoYXIpKCgobCk+PjI0KSYweGZmKSwJXAorCQkJIGwpCisjZW5kaWYKKworI2VuZGlmCisKK2ludCBIQVNIX1VQREFURSAoSEFTSF9DVFggKmMsIGNvbnN0IHZvaWQgKmRhdGFfLCBzaXplX3QgbGVuKQorCXsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhPWRhdGFfOworCXVuc2lnbmVkIGNoYXIgKnA7CisJSEFTSF9MT05HIGw7CisJc2l6ZV90IG47CisKKwlpZiAobGVuPT0wKSByZXR1cm4gMTsKKworCWw9KGMtPk5sKygoKEhBU0hfTE9ORylsZW4pPDwzKSkmMHhmZmZmZmZmZlVMOworCS8qIDk1LTA1LTI0IGVheSBGaXhlZCBhIGJ1ZyB3aXRoIHRoZSBvdmVyZmxvdyBoYW5kbGluZywgdGhhbmtzIHRvCisJICogV2VpIERhaSA8d2VpZGFpQGVza2ltby5jb20+IGZvciBwb2ludGluZyBpdCBvdXQuICovCisJaWYgKGwgPCBjLT5ObCkgLyogb3ZlcmZsb3cgKi8KKwkJYy0+TmgrKzsKKwljLT5OaCs9KEhBU0hfTE9ORykobGVuPj4yOSk7CS8qIG1pZ2h0IGNhdXNlIGNvbXBpbGVyIHdhcm5pbmcgb24gMTYtYml0ICovCisJYy0+Tmw9bDsKKworCW4gPSBjLT5udW07CisJaWYgKG4gIT0gMCkKKwkJeworCQlwPSh1bnNpZ25lZCBjaGFyICopYy0+ZGF0YTsKKworCQlpZiAobGVuID49IEhBU0hfQ0JMT0NLIHx8IGxlbituID49IEhBU0hfQ0JMT0NLKQorCQkJeworCQkJbWVtY3B5IChwK24sZGF0YSxIQVNIX0NCTE9DSy1uKTsKKwkJCUhBU0hfQkxPQ0tfREFUQV9PUkRFUiAoYyxwLDEpOworCQkJbiAgICAgID0gSEFTSF9DQkxPQ0stbjsKKwkJCWRhdGEgICs9IG47CisJCQlsZW4gICAtPSBuOworCQkJYy0+bnVtID0gMDsKKwkJCW1lbXNldCAocCwwLEhBU0hfQ0JMT0NLKTsJLyoga2VlcCBpdCB6ZXJvZWQgKi8KKwkJCX0KKwkJZWxzZQorCQkJeworCQkJbWVtY3B5IChwK24sZGF0YSxsZW4pOworCQkJYy0+bnVtICs9ICh1bnNpZ25lZCBpbnQpbGVuOworCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKworCW4gPSBsZW4vSEFTSF9DQkxPQ0s7CisJaWYgKG4gPiAwKQorCQl7CisJCUhBU0hfQkxPQ0tfREFUQV9PUkRFUiAoYyxkYXRhLG4pOworCQluICAgICo9IEhBU0hfQ0JMT0NLOworCQlkYXRhICs9IG47CisJCWxlbiAgLT0gbjsKKwkJfQorCisJaWYgKGxlbiAhPSAwKQorCQl7CisJCXAgPSAodW5zaWduZWQgY2hhciAqKWMtPmRhdGE7CisJCWMtPm51bSA9ICh1bnNpZ25lZCBpbnQpbGVuOworCQltZW1jcHkgKHAsZGF0YSxsZW4pOworCQl9CisJcmV0dXJuIDE7CisJfQorCisKK3ZvaWQgSEFTSF9UUkFOU0ZPUk0gKEhBU0hfQ1RYICpjLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhKQorCXsKKwlIQVNIX0JMT0NLX0RBVEFfT1JERVIgKGMsZGF0YSwxKTsKKwl9CisKKworaW50IEhBU0hfRklOQUwgKHVuc2lnbmVkIGNoYXIgKm1kLCBIQVNIX0NUWCAqYykKKwl7CisJdW5zaWduZWQgY2hhciAqcCA9ICh1bnNpZ25lZCBjaGFyICopYy0+ZGF0YTsKKwlzaXplX3QgbiA9IGMtPm51bTsKKworCXBbbl0gPSAweDgwOyAvKiB0aGVyZSBpcyBhbHdheXMgcm9vbSBmb3Igb25lICovCisJbisrOworCisJaWYgKG4gPiAoSEFTSF9DQkxPQ0stOCkpCisJCXsKKwkJbWVtc2V0IChwK24sMCxIQVNIX0NCTE9DSy1uKTsKKwkJbj0wOworCQlIQVNIX0JMT0NLX0RBVEFfT1JERVIgKGMscCwxKTsKKwkJfQorCW1lbXNldCAocCtuLDAsSEFTSF9DQkxPQ0stOC1uKTsKKworCXAgKz0gSEFTSF9DQkxPQ0stODsKKyNpZiAgIGRlZmluZWQoREFUQV9PUkRFUl9JU19CSUdfRU5ESUFOKQorCSh2b2lkKUhPU1RfbDJjKGMtPk5oLHApOworCSh2b2lkKUhPU1RfbDJjKGMtPk5sLHApOworI2VsaWYgZGVmaW5lZChEQVRBX09SREVSX0lTX0xJVFRMRV9FTkRJQU4pCisJKHZvaWQpSE9TVF9sMmMoYy0+TmwscCk7CisJKHZvaWQpSE9TVF9sMmMoYy0+TmgscCk7CisjZW5kaWYKKwlwIC09IEhBU0hfQ0JMT0NLOworCUhBU0hfQkxPQ0tfREFUQV9PUkRFUiAoYyxwLDEpOworCWMtPm51bT0wOworCW1lbXNldCAocCwwLEhBU0hfQ0JMT0NLKTsKKworI2lmbmRlZiBIQVNIX01BS0VfU1RSSU5HCisjZXJyb3IgIkhBU0hfTUFLRV9TVFJJTkcgbXVzdCBiZSBkZWZpbmVkISIKKyNlbHNlCisJSEFTSF9NQUtFX1NUUklORyhjLG1kKTsKKyNlbmRpZgorCisJcmV0dXJuIDE7CisJfQorCisjaWZuZGVmIE1EMzJfUkVHX1QKKyNkZWZpbmUgTUQzMl9SRUdfVCBpbnQKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfSAgLyogZXh0ZXJuIEMgKi8KKyNlbmRpZgorCisjZW5kaWYgIC8qIE9QRU5TU0xfSEVBREVSX01EMzJfQ09NTU9OX0ggKi8KZGlmZiAtLWdpdCBhL2NyeXB0by9kaXJlY3RvcnkuaCBiL2NyeXB0by9kaXJlY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTRkZjNjCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2RpcmVjdG9yeS5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qIENvcGllZCBmcm9tIFJpY2hhcmQgTGV2aXR0ZSdzIChyaWNoYXJkQGxldml0dGUub3JnKSBMUCBsaWJyYXJ5LiAgQWxsCisgKiBzeW1ib2wgbmFtZXMgaGF2ZSBiZWVuIGNoYW5nZWQsIHdpdGggcGVybWlzc2lvbiBmcm9tIHRoZSBhdXRob3IuICovCisKKy8qICRMUDogTFBsaWIvc291cmNlL0xQZGlyLmgsdiAxLjEgMjAwNC8wNi8xNCAwODo1NjowNCBfY3ZzX2xldml0dGUgRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIFJpY2hhcmQgTGV2aXR0ZSA8cmljaGFyZEBsZXZpdHRlLm9yZz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIE9QRU5TU0xfSEVBREVSX0RJUkVDVE9SWV9ICisjZGVmaW5lIE9QRU5TU0xfSEVBREVSX0RJUkVDVE9SWV9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jhc2UuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIERpcmVjdG9yeSBmdW5jdGlvbnMgYWJzdHJhY3QgdGhlIE8vUyBzcGVjaWZpYyBvcGVyYXRpb25zIGZvciBvcGVuaW5nIGFuZAorICogcmVhZGluZyBkaXJlY3RvcmllcyBpbiB0aGUgZmlsZXN5c3RlbS4gKi8KKworCisvKiBPUEVOU1NMX2Rpcl9jb250ZXh0X3N0IGlzIGFuIG9wYXF1ZSBzdHJ1Y3R1cmUgdGhhdCByZXByZXNlbnRzIGFuIG9wZW4KKyAqIGRpcmVjdG9yeSBhbmQgYSBwb3NpdGlvbiBpbiB0aGF0IGRpcmVjdG9yeS4gKi8KK3R5cGVkZWYgc3RydWN0IE9QRU5TU0xfZGlyX2NvbnRleHRfc3QgT1BFTlNTTF9ESVJfQ1RYOworCisvKiBPUEVOU1NMX0RJUl9yZWFkIHJlYWRzIGEgc2luZ2xlIGZpbGVuYW1lIGZyb20gfGN0eHwuIE9uIHRoZSBmaXJzdCBjYWxsLAorICogfGRpcmVjdG9yeXwgbXVzdCBiZSBnaXZlbiBhbmQgfCpjdHh8IG11c3QgYmUgTlVMTC4gU3Vic2VxdWVudCBjYWxscyB3aXRoIHRoZQorICogc2FtZSB8KmN0eHwgd2lsbCByZXR1cm4gc3Vic2VxdWVudCBmaWxlIG5hbWVzIHVudGlsIGl0IHJldHVybnMgTlVMTCB0bworICogaW5kaWNhdGUgRU9GLiBUaGUgc3RyaW5ncyByZXR1cm5lZCByZWZlcmVuY2UgYSBidWZmZXIgaW50ZXJuYWwgdG8gdGhlCisgKiB8T1BFTlNTTF9ESVJfQ1RYfCBhbmQgd2lsbCBiZSBvdmVycmlkZGVuIGJ5IHN1YnNlcXVlbnQgY2FsbHMuICovCitjb25zdCBjaGFyICpPUEVOU1NMX0RJUl9yZWFkKE9QRU5TU0xfRElSX0NUWCAqKmN0eCwgY29uc3QgY2hhciAqZGlyZWN0b3J5KTsKKworLyogT1BFTlNTTF9ESVJfZW5kIGNsb3NlcyB8KmN0eHwuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24KKyAqIGVycm9yLiAqLworaW50IE9QRU5TU0xfRElSX2VuZChPUEVOU1NMX0RJUl9DVFggKipjdHgpOworCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfSAgLyogZXh0ZXJuIEMgKi8KKyNlbmRpZgorCisjZW5kaWYgIC8qIE9QRU5TU0xfSEVBREVSX0RJUkVDVE9SWV9IICovCmRpZmYgLS1naXQgYS9jcnlwdG8vZGlyZWN0b3J5X3Bvc2l4LmMgYi9jcnlwdG8vZGlyZWN0b3J5X3Bvc2l4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkwZjY2MwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9kaXJlY3RvcnlfcG9zaXguYwpAQCAtMCwwICsxLDg5IEBACisvKiAkTFA6IExQbGliL3NvdXJjZS9MUGRpcl91bml4LmMsdiAxLjExIDIwMDQvMDkvMjMgMjI6MDc6MjIgX2N2c19sZXZpdHRlIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCBSaWNoYXJkIExldml0dGUgPHJpY2hhcmRAbGV2aXR0ZS5vcmc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuICovCisKKyNkZWZpbmUgX1BPU0lYX0NfU09VUkNFIDEgIC8qIGZvciByZWFkZGlyX3IgKi8KKworI2luY2x1ZGUgImRpcmVjdG9yeS5oIgorCisKKyNpZiAhZGVmaW5lZChPUEVOU1NMX1dJTkRPV1MpCisKKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCitzdHJ1Y3QgT1BFTlNTTF9kaXJfY29udGV4dF9zdCB7CisgIERJUiAqZGlyOworICBzdHJ1Y3QgZGlyZW50IGRpcmVudDsKK307CisKK2NvbnN0IGNoYXIgKk9QRU5TU0xfRElSX3JlYWQoT1BFTlNTTF9ESVJfQ1RYICoqY3R4LCBjb25zdCBjaGFyICpkaXJlY3RvcnkpIHsKKyAgc3RydWN0IGRpcmVudCAqZGlyZW50OworCisgIGlmIChjdHggPT0gTlVMTCB8fCBkaXJlY3RvcnkgPT0gTlVMTCkgeworICAgIGVycm5vID0gRUlOVkFMOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgZXJybm8gPSAwOworICBpZiAoKmN0eCA9PSBOVUxMKSB7CisgICAgKmN0eCA9IG1hbGxvYyhzaXplb2YoT1BFTlNTTF9ESVJfQ1RYKSk7CisgICAgaWYgKCpjdHggPT0gTlVMTCkgeworICAgICAgZXJybm8gPSBFTk9NRU07CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgbWVtc2V0KCpjdHgsIDAsIHNpemVvZihPUEVOU1NMX0RJUl9DVFgpKTsKKworICAgICgqY3R4KS0+ZGlyID0gb3BlbmRpcihkaXJlY3RvcnkpOworICAgIGlmICgoKmN0eCktPmRpciA9PSBOVUxMKSB7CisgICAgICBpbnQgc2F2ZV9lcnJubyA9IGVycm5vOyAvKiBQcm9iYWJseSBub3QgbmVlZGVkLCBidXQgSSdtIHBhcmFub2lkICovCisgICAgICBmcmVlKCpjdHgpOworICAgICAgKmN0eCA9IE5VTEw7CisgICAgICBlcnJubyA9IHNhdmVfZXJybm87CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICBpZiAocmVhZGRpcl9yKCgqY3R4KS0+ZGlyLCAmKCpjdHgpLT5kaXJlbnQsICZkaXJlbnQpICE9IDAgfHwKKyAgICAgIGRpcmVudCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICByZXR1cm4gKCpjdHgpLT5kaXJlbnQuZF9uYW1lOworfQorCitpbnQgT1BFTlNTTF9ESVJfZW5kKE9QRU5TU0xfRElSX0NUWCAqKmN0eCkgeworICBpZiAoY3R4ICE9IE5VTEwgJiYgKmN0eCAhPSBOVUxMKSB7CisgICAgaW50IHIgPSBjbG9zZWRpcigoKmN0eCktPmRpcik7CisgICAgZnJlZSgqY3R4KTsKKyAgICAqY3R4ID0gTlVMTDsKKyAgICByZXR1cm4gciA9PSAwOworICB9CisKKyAgZXJybm8gPSBFSU5WQUw7CisgIHJldHVybiAwOworfQorCisjZW5kaWYgIC8qICFPUEVOU1NMX1dJTkRPV1MgKi8KZGlmZiAtLWdpdCBhL2NyeXB0by9kaXJlY3Rvcnlfd2luLmMgYi9jcnlwdG8vZGlyZWN0b3J5X3dpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NTYzODMKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vZGlyZWN0b3J5X3dpbi5jCkBAIC0wLDAgKzEsMTM4IEBACisvKiAkTFA6IExQbGliL3NvdXJjZS9MUGRpcl93aW4uYyx2IDEuMTAgMjAwNC8wOC8yNiAxMzozNjowNSBfY3ZzX2xldml0dGUgRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIFJpY2hhcmQgTGV2aXR0ZSA8cmljaGFyZEBsZXZpdHRlLm9yZz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJkaXJlY3RvcnkuaCIKKworCisjaWYgZGVmaW5lZChPUEVOU1NMX1dJTkRPV1MpCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8dGNoYXIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaWZuZGVmIE5BTUVfTUFYCisjZGVmaW5lIE5BTUVfTUFYIDI1NQorI2VuZGlmCisKK3N0cnVjdCBPUEVOU1NMX2Rpcl9jb250ZXh0X3N0IHsKKyAgV0lOMzJfRklORF9EQVRBIGN0eDsKKyAgSEFORExFIGhhbmRsZTsKKyAgY2hhciBlbnRyeV9uYW1lW05BTUVfTUFYICsgMV07Cit9OworCitjb25zdCBjaGFyICpPUEVOU1NMX0RJUl9yZWFkKE9QRU5TU0xfRElSX0NUWCAqKmN0eCwgY29uc3QgY2hhciAqZGlyZWN0b3J5KSB7CisgIGlmIChjdHggPT0gTlVMTCB8fCBkaXJlY3RvcnkgPT0gTlVMTCkgeworICAgIGVycm5vID0gRUlOVkFMOworICAgIHJldHVybiAwOworICB9CisKKyAgZXJybm8gPSAwOworICBpZiAoKmN0eCA9PSBOVUxMKSB7CisgICAgKmN0eCA9IG1hbGxvYyhzaXplb2YoT1BFTlNTTF9ESVJfQ1RYKSk7CisgICAgaWYgKCpjdHggPT0gTlVMTCkgeworICAgICAgZXJybm8gPSBFTk9NRU07CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgbWVtc2V0KCpjdHgsIDAsIHNpemVvZihPUEVOU1NMX0RJUl9DVFgpKTsKKworICAgIGlmIChzaXplb2YoVENIQVIpICE9IHNpemVvZihjaGFyKSkgeworICAgICAgVENIQVIgKndkaXIgPSBOVUxMOworICAgICAgLyogbGVuXzAgZGVub3RlcyBzdHJpbmcgbGVuZ3RoICp3aXRoKiB0cmFpbGluZyAwICovCisgICAgICBzaXplX3QgaW5kZXggPSAwLCBsZW5fMCA9IHN0cmxlbihkaXJlY3RvcnkpICsgMTsKKworICAgICAgd2RpciA9IChUQ0hBUiAqKW1hbGxvYyhsZW5fMCAqIHNpemVvZihUQ0hBUikpOworICAgICAgaWYgKHdkaXIgPT0gTlVMTCkgeworICAgICAgICBmcmVlKCpjdHgpOworICAgICAgICAqY3R4ID0gTlVMTDsKKyAgICAgICAgZXJybm8gPSBFTk9NRU07CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorCisgICAgICBpZiAoIU11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBkaXJlY3RvcnksIGxlbl8wLCAoV0NIQVIgKil3ZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbl8wKSkgeworICAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBsZW5fMDsgaW5kZXgrKykgeworICAgICAgICAgIHdkaXJbaW5kZXhdID0gKFRDSEFSKWRpcmVjdG9yeVtpbmRleF07CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgKCpjdHgpLT5oYW5kbGUgPSBGaW5kRmlyc3RGaWxlKHdkaXIsICYoKmN0eCktPmN0eCk7CisKKyAgICAgIGZyZWUod2Rpcik7CisgICAgfSBlbHNlIHsKKyAgICAgICgqY3R4KS0+aGFuZGxlID0gRmluZEZpcnN0RmlsZSgoVENIQVIgKilkaXJlY3RvcnksICYoKmN0eCktPmN0eCk7CisgICAgfQorCisgICAgaWYgKCgqY3R4KS0+aGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisgICAgICBmcmVlKCpjdHgpOworICAgICAgKmN0eCA9IE5VTEw7CisgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoRmluZE5leHRGaWxlKCgqY3R4KS0+aGFuZGxlLCAmKCpjdHgpLT5jdHgpID09IEZBTFNFKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICBpZiAoc2l6ZW9mKFRDSEFSKSAhPSBzaXplb2YoY2hhcikpIHsKKyAgICBUQ0hBUiAqd2RpciA9ICgqY3R4KS0+Y3R4LmNGaWxlTmFtZTsKKyAgICBzaXplX3QgaW5kZXgsIGxlbl8wID0gMDsKKworICAgIHdoaWxlICh3ZGlyW2xlbl8wXSAmJiBsZW5fMCA8IChzaXplb2YoKCpjdHgpLT5lbnRyeV9uYW1lKSAtIDEpKSB7CisgICAgICBsZW5fMCsrOworICAgIH0KKyAgICBsZW5fMCsrOworCisgICAgaWYgKCFXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgKFdDSEFSICopd2RpciwgbGVuXzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqY3R4KS0+ZW50cnlfbmFtZSwgc2l6ZW9mKCgqY3R4KS0+ZW50cnlfbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDApKSB7CisgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBsZW5fMDsgaW5kZXgrKykgeworICAgICAgICAoKmN0eCktPmVudHJ5X25hbWVbaW5kZXhdID0gKGNoYXIpd2RpcltpbmRleF07CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIHN0cm5jcHkoKCpjdHgpLT5lbnRyeV9uYW1lLCAoY29uc3QgY2hhciAqKSgqY3R4KS0+Y3R4LmNGaWxlTmFtZSwKKyAgICAgICAgICAgIHNpemVvZigoKmN0eCktPmVudHJ5X25hbWUpIC0gMSk7CisgIH0KKworICAoKmN0eCktPmVudHJ5X25hbWVbc2l6ZW9mKCgqY3R4KS0+ZW50cnlfbmFtZSkgLSAxXSA9ICdcMCc7CisKKyAgcmV0dXJuICgqY3R4KS0+ZW50cnlfbmFtZTsKK30KKworaW50IE9QRU5TU0xfRElSX2VuZChPUEVOU1NMX0RJUl9DVFggKipjdHgpIHsKKyAgaWYgKGN0eCAhPSBOVUxMICYmICpjdHggIT0gTlVMTCkgeworICAgIEZpbmRDbG9zZSgoKmN0eCktPmhhbmRsZSk7CisgICAgZnJlZSgqY3R4KTsKKyAgICAqY3R4ID0gTlVMTDsKKyAgICByZXR1cm4gMTsKKyAgfQorICBlcnJubyA9IEVJTlZBTDsKKyAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAgLyogT1BFTlNTTF9XSU5ET1dTICovCmRpZmYgLS1naXQgYS9jcnlwdG8vZHNhL0NNYWtlTGlzdHMudHh0IGIvY3J5cHRvL2RzYS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGZiMmE2Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2RzYS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDIwIEBACitpbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKKworYWRkX2xpYnJhcnkoCisJZHNhCisKKwlPQkpFQ1QKKworCWRzYS5jCisJZHNhX2ltcGwuYworCWRzYV9hc24xLmMKKwlkc2FfZXJyb3IuYworKQorCithZGRfZXhlY3V0YWJsZSgKKwlkc2FfdGVzdAorCisJZHNhX3Rlc3QuYworKQorCit0YXJnZXRfbGlua19saWJyYXJpZXMoZHNhX3Rlc3QgY3J5cHRvKQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2RzYS9kc2EuYyBiL2NyeXB0by9kc2EvZHNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFlNjg3NgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9kc2EvZHNhLmMKQEAgLTAsMCArMSwzMzQgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKgorICogVGhlIERTUyByb3V0aW5lcyBhcmUgYmFzZWQgb24gcGF0Y2hlcyBzdXBwbGllZCBieQorICogU3RldmVuIFNjaG9jaCA8c2Nob2NoQHNoZWJhLmFyYy5uYXNhLmdvdj4uICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2RzYS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lbmdpbmUuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXhfZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitleHRlcm4gY29uc3QgRFNBX01FVEhPRCBEU0FfZGVmYXVsdF9tZXRob2Q7CisKK0RTQSAqRFNBX25ldyh2b2lkKSB7IHJldHVybiBEU0FfbmV3X21ldGhvZChOVUxMKTsgfQorCitEU0EgKkRTQV9uZXdfbWV0aG9kKGNvbnN0IEVOR0lORSAqZW5naW5lKSB7CisgIERTQSAqZHNhID0gKERTQSAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihEU0EpKTsKKyAgaWYgKGRzYSA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRFNBLCBEU0FfbmV3X21ldGhvZCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgbWVtc2V0KGRzYSwgMCwgc2l6ZW9mKERTQSkpOworCisgIGlmIChlbmdpbmUpIHsKKyAgICBkc2EtPm1ldGggPSBFTkdJTkVfZ2V0X0RTQV9tZXRob2QoZW5naW5lKTsKKyAgfQorCisgIGlmIChkc2EtPm1ldGggPT0gTlVMTCkgeworICAgIGRzYS0+bWV0aCA9IChEU0FfTUVUSE9EKikgJkRTQV9kZWZhdWx0X21ldGhvZDsKKyAgfQorICBNRVRIT0RfcmVmKGRzYS0+bWV0aCk7CisKKyAgZHNhLT53cml0ZV9wYXJhbXMgPSAxOworICBkc2EtPnJlZmVyZW5jZXMgPSAxOworCisgIGlmICghQ1JZUFRPX25ld19leF9kYXRhKENSWVBUT19FWF9JTkRFWF9EU0EsIGRzYSwgJmRzYS0+ZXhfZGF0YSkpIHsKKyAgICBNRVRIT0RfdW5yZWYoZHNhLT5tZXRoKTsKKyAgICBPUEVOU1NMX2ZyZWUoZHNhKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmIChkc2EtPm1ldGgtPmluaXQgJiYgIWRzYS0+bWV0aC0+aW5pdChkc2EpKSB7CisgICAgQ1JZUFRPX2ZyZWVfZXhfZGF0YShDUllQVE9fRVhfSU5ERVhfRFNBLCBkc2EsICZkc2EtPmV4X2RhdGEpOworICAgIE1FVEhPRF91bnJlZihkc2EtPm1ldGgpOworICAgIE9QRU5TU0xfZnJlZShkc2EpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIGRzYTsKK30KKwordm9pZCBEU0FfZnJlZShEU0EgKmRzYSkgeworICBpZiAoZHNhID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoQ1JZUFRPX2FkZCgmZHNhLT5yZWZlcmVuY2VzLCAtMSwgQ1JZUFRPX0xPQ0tfRFNBKSA+IDApIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoZHNhLT5tZXRoLT5maW5pc2gpIHsKKyAgICBkc2EtPm1ldGgtPmZpbmlzaChkc2EpOworICB9CisgIE1FVEhPRF91bnJlZihkc2EtPm1ldGgpOworCisgIENSWVBUT19mcmVlX2V4X2RhdGEoQ1JZUFRPX0VYX0lOREVYX0RTQSwgZHNhLCAmZHNhLT5leF9kYXRhKTsKKworICBpZiAoZHNhLT5wICE9IE5VTEwpCisgICAgQk5fY2xlYXJfZnJlZShkc2EtPnApOworICBpZiAoZHNhLT5xICE9IE5VTEwpCisgICAgQk5fY2xlYXJfZnJlZShkc2EtPnEpOworICBpZiAoZHNhLT5nICE9IE5VTEwpCisgICAgQk5fY2xlYXJfZnJlZShkc2EtPmcpOworICBpZiAoZHNhLT5wdWJfa2V5ICE9IE5VTEwpCisgICAgQk5fY2xlYXJfZnJlZShkc2EtPnB1Yl9rZXkpOworICBpZiAoZHNhLT5wcml2X2tleSAhPSBOVUxMKQorICAgIEJOX2NsZWFyX2ZyZWUoZHNhLT5wcml2X2tleSk7CisgIGlmIChkc2EtPmtpbnYgIT0gTlVMTCkKKyAgICBCTl9jbGVhcl9mcmVlKGRzYS0+a2ludik7CisgIGlmIChkc2EtPnIgIT0gTlVMTCkKKyAgICBCTl9jbGVhcl9mcmVlKGRzYS0+cik7CisgIE9QRU5TU0xfZnJlZShkc2EpOworfQorCitpbnQgRFNBX3VwX3JlZihEU0EgKmRzYSkgeworICBDUllQVE9fYWRkKCZkc2EtPnJlZmVyZW5jZXMsIDEsIENSWVBUT19MT0NLX0RTQSk7CisgIHJldHVybiAxOworfQorCitpbnQgRFNBX2dlbmVyYXRlX3BhcmFtZXRlcnNfZXgoRFNBICpkc2EsIHVuc2lnbmVkIGJpdHMsIGNvbnN0IHVpbnQ4X3QgKnNlZWRfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNlZWRfbGVuLCBpbnQgKm91dF9jb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF9oLCBCTl9HRU5DQiAqY2IpIHsKKyAgaWYgKGRzYS0+bWV0aC0+Z2VuZXJhdGVfcGFyYW1ldGVycykgeworICAgIHJldHVybiBkc2EtPm1ldGgtPmdlbmVyYXRlX3BhcmFtZXRlcnMoZHNhLCBiaXRzLCBzZWVkX2luLCBzZWVkX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9jb3VudGVyLCBvdXRfaCwgY2IpOworICB9CisgIHJldHVybiBEU0FfZGVmYXVsdF9tZXRob2QuZ2VuZXJhdGVfcGFyYW1ldGVycyhkc2EsIGJpdHMsIHNlZWRfaW4sIHNlZWRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X2NvdW50ZXIsIG91dF9oLCBjYik7Cit9CisKK2ludCBEU0FfZ2VuZXJhdGVfa2V5KERTQSAqZHNhKSB7CisgIGlmIChkc2EtPm1ldGgtPmtleWdlbikgeworICAgIHJldHVybiBkc2EtPm1ldGgtPmtleWdlbihkc2EpOworICB9CisgIHJldHVybiBEU0FfZGVmYXVsdF9tZXRob2Qua2V5Z2VuKGRzYSk7Cit9CisKK0RTQV9TSUcgKkRTQV9TSUdfbmV3KHZvaWQpIHsKKyAgRFNBX1NJRyAqc2lnOworICBzaWcgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoRFNBX1NJRykpOworICBpZiAoIXNpZykgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHNpZy0+ciA9IE5VTEw7CisgIHNpZy0+cyA9IE5VTEw7CisgIHJldHVybiBzaWc7Cit9CisKK3ZvaWQgRFNBX1NJR19mcmVlKERTQV9TSUcgKnNpZykgeworICBpZiAoIXNpZykgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChzaWctPnIpIHsKKyAgICBCTl9mcmVlKHNpZy0+cik7CisgIH0KKyAgaWYgKHNpZy0+cykgeworICAgIEJOX2ZyZWUoc2lnLT5zKTsKKyAgfQorICBPUEVOU1NMX2ZyZWUoc2lnKTsKK30KKworRFNBX1NJRyAqRFNBX2RvX3NpZ24oY29uc3QgdWludDhfdCAqZGlnZXN0LCBzaXplX3QgZGlnZXN0X2xlbiwgRFNBICpkc2EpIHsKKyAgaWYgKGRzYS0+bWV0aC0+c2lnbikgeworICAgIHJldHVybiBkc2EtPm1ldGgtPnNpZ24oZGlnZXN0LCBkaWdlc3RfbGVuLCBkc2EpOworICB9CisgIHJldHVybiBEU0FfZGVmYXVsdF9tZXRob2Quc2lnbihkaWdlc3QsIGRpZ2VzdF9sZW4sIGRzYSk7Cit9CisKK2ludCBEU0FfZG9fdmVyaWZ5KGNvbnN0IHVpbnQ4X3QgKmRpZ2VzdCwgc2l6ZV90IGRpZ2VzdF9sZW4sIERTQV9TSUcgKnNpZywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IERTQSAqZHNhKSB7CisgIGludCB2YWxpZCwgcmV0OworCisgIGlmIChkc2EtPm1ldGgtPnZlcmlmeSkgeworICAgIHJldCA9IGRzYS0+bWV0aC0+dmVyaWZ5KCZ2YWxpZCwgZGlnZXN0LCBkaWdlc3RfbGVuLCBzaWcsIGRzYSk7CisgIH0gZWxzZSB7CisgICAgcmV0ID0gRFNBX2RlZmF1bHRfbWV0aG9kLnZlcmlmeSgmdmFsaWQsIGRpZ2VzdCwgZGlnZXN0X2xlbiwgc2lnLCBkc2EpOworICB9CisKKyAgaWYgKCFyZXQpIHsKKyAgICByZXR1cm4gLTE7CisgIH0gZWxzZSBpZiAoIXZhbGlkKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBEU0FfZG9fY2hlY2tfc2lnbmF0dXJlKGludCAqb3V0X3ZhbGlkLCBjb25zdCB1aW50OF90ICpkaWdlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGlnZXN0X2xlbiwgRFNBX1NJRyAqc2lnLCBjb25zdCBEU0EgKmRzYSkgeworICBpZiAoZHNhLT5tZXRoLT52ZXJpZnkpIHsKKyAgICByZXR1cm4gZHNhLT5tZXRoLT52ZXJpZnkob3V0X3ZhbGlkLCBkaWdlc3QsIGRpZ2VzdF9sZW4sIHNpZywgZHNhKTsKKyAgfQorCisgIHJldHVybiBEU0FfZGVmYXVsdF9tZXRob2QudmVyaWZ5KG91dF92YWxpZCwgZGlnZXN0LCBkaWdlc3RfbGVuLCBzaWcsIGRzYSk7Cit9CisKK2ludCBEU0Ffc2lnbihpbnQgdHlwZSwgY29uc3QgdWludDhfdCAqZGlnZXN0LCBzaXplX3QgZGlnZXN0X2xlbiwKKyAgICAgICAgICAgICB1aW50OF90ICpvdXRfc2lnLCB1bnNpZ25lZCBpbnQgKm91dF9zaWdsZW4sIERTQSAqZHNhKSB7CisgIERTQV9TSUcgKnM7CisKKyAgcyA9IERTQV9kb19zaWduKGRpZ2VzdCwgZGlnZXN0X2xlbiwgZHNhKTsKKyAgaWYgKHMgPT0gTlVMTCkgeworICAgICpvdXRfc2lnbGVuID0gMDsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgICpvdXRfc2lnbGVuID0gaTJkX0RTQV9TSUcocywgJm91dF9zaWcpOworICBEU0FfU0lHX2ZyZWUocyk7CisgIHJldHVybiAxOworfQorCitpbnQgRFNBX3ZlcmlmeShpbnQgdHlwZSwgY29uc3QgdWludDhfdCAqZGlnZXN0LCBzaXplX3QgZGlnZXN0X2xlbiwKKyAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNpZywgc2l6ZV90IHNpZ19sZW4sIGNvbnN0IERTQSAqZHNhKSB7CisgIERTQV9TSUcgKnMgPSBOVUxMOworICBpbnQgcmV0ID0gLTEsIHZhbGlkOworCisgIHMgPSBEU0FfU0lHX25ldygpOworICBpZiAocyA9PSBOVUxMKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAoZDJpX0RTQV9TSUcoJnMsICZzaWcsIHNpZ19sZW4pID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmICghRFNBX2RvX2NoZWNrX3NpZ25hdHVyZSgmdmFsaWQsIGRpZ2VzdCwgZGlnZXN0X2xlbiwgcywgZHNhKSkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgcmV0ID0gdmFsaWQ7CisKK2VycjoKKyAgaWYgKHMpIHsKKyAgICBEU0FfU0lHX2ZyZWUocyk7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworaW50IERTQV9jaGVja19zaWduYXR1cmUoaW50ICpvdXRfdmFsaWQsIGNvbnN0IHVpbnQ4X3QgKmRpZ2VzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkaWdlc3RfbGVuLCBjb25zdCB1aW50OF90ICpzaWcsIHNpemVfdCBzaWdfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRFNBICpkc2EpIHsKKyAgRFNBX1NJRyAqcyA9IE5VTEw7CisgIGludCByZXQgPSAwOworCisgIHMgPSBEU0FfU0lHX25ldygpOworICBpZiAocyA9PSBOVUxMKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAoZDJpX0RTQV9TSUcoJnMsICZzaWcsIHNpZ19sZW4pID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIHJldCA9IERTQV9kb19jaGVja19zaWduYXR1cmUob3V0X3ZhbGlkLCBkaWdlc3QsIGRpZ2VzdF9sZW4sIHMsIGRzYSk7CisKK2VycjoKKyAgaWYgKHMpIHsKKyAgICBEU0FfU0lHX2ZyZWUocyk7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworaW50IERTQV9zaXplKGNvbnN0IERTQSAqZHNhKSB7CisgIGludCByZXQsIGk7CisgIEFTTjFfSU5URUdFUiBiczsKKyAgdW5zaWduZWQgY2hhciBidWZbNF07IC8qIDQgYnl0ZXMgbG9va3MgcmVhbGx5IHNtYWxsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSG93ZXZlciwgaTJkX0FTTjFfSU5URUdFUigpIHdpbGwgbm90IGxvb2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJleW9uZCB0aGUgZmlyc3QgYnl0ZSwgYXMgbG9uZyBhcyB0aGUgc2Vjb25kCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgaXMgTlVMTC4gKi8KKworICBpID0gQk5fbnVtX2JpdHMoZHNhLT5xKTsKKyAgYnMubGVuZ3RoID0gKGkgKyA3KSAvIDg7CisgIGJzLmRhdGEgPSBidWY7CisgIGJzLnR5cGUgPSBWX0FTTjFfSU5URUdFUjsKKyAgLyogSWYgdGhlIHRvcCBiaXQgaXMgc2V0IHRoZSBhc24xIGVuY29kaW5nIGlzIDEgbGFyZ2VyLiAqLworICBidWZbMF0gPSAweGZmOworCisgIGkgPSBpMmRfQVNOMV9JTlRFR0VSKCZicywgTlVMTCk7CisgIGkgKz0gaTsgLyogciBhbmQgcyAqLworICByZXQgPSBBU04xX29iamVjdF9zaXplKDEsIGksIFZfQVNOMV9TRVFVRU5DRSk7CisgIHJldHVybiByZXQ7Cit9CisKK2ludCBEU0Ffc2lnbl9zZXR1cChjb25zdCBEU0EgKmRzYSwgQk5fQ1RYICpjdHgsIEJJR05VTSAqKm91dF9raW52LAorICAgICAgICAgICAgICAgICAgIEJJR05VTSAqKm91dF9yKSB7CisgIGlmIChkc2EtPm1ldGgtPnNpZ25fc2V0dXApIHsKKyAgICByZXR1cm4gZHNhLT5tZXRoLT5zaWduX3NldHVwKGRzYSwgY3R4LCBvdXRfa2ludiwgb3V0X3IpOworICB9CisKKyAgcmV0dXJuIERTQV9kZWZhdWx0X21ldGhvZC5zaWduX3NldHVwKGRzYSwgY3R4LCBvdXRfa2ludiwgb3V0X3IpOworfQorCitpbnQgRFNBX2dldF9leF9uZXdfaW5kZXgobG9uZyBhcmdsLCB2b2lkICphcmdwLCBDUllQVE9fRVhfbmV3ICpuZXdfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDUllQVE9fRVhfZHVwICpkdXBfZnVuYywgQ1JZUFRPX0VYX2ZyZWUgKmZyZWVfZnVuYykgeworICByZXR1cm4gQ1JZUFRPX2dldF9leF9uZXdfaW5kZXgoQ1JZUFRPX0VYX0lOREVYX0RTQSwgYXJnbCwgYXJncCwgbmV3X2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBfZnVuYywgZnJlZV9mdW5jKTsKK30KKworaW50IERTQV9zZXRfZXhfZGF0YShEU0EgKmQsIGludCBpZHgsIHZvaWQgKmFyZykgeworICByZXR1cm4gQ1JZUFRPX3NldF9leF9kYXRhKCZkLT5leF9kYXRhLCBpZHgsIGFyZyk7Cit9CisKK3ZvaWQgKkRTQV9nZXRfZXhfZGF0YShjb25zdCBEU0EgKmQsIGludCBpZHgpIHsKKyAgcmV0dXJuIENSWVBUT19nZXRfZXhfZGF0YSgmZC0+ZXhfZGF0YSwgaWR4KTsKK30KZGlmZiAtLWdpdCBhL2NyeXB0by9kc2EvZHNhLmggYi9jcnlwdG8vZHNhL2RzYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1N2VkYzAKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vZHNhL2RzYS5oCkBAIC0wLDAgKzEsMzU5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICoKKyAqIFRoZSBEU1Mgcm91dGluZXMgYXJlIGJhc2VkIG9uIHBhdGNoZXMgc3VwcGxpZWQgYnkKKyAqIFN0ZXZlbiBTY2hvY2ggPHNjaG9jaEBzaGViYS5hcmMubmFzYS5nb3Y+LiAqLworCisjaWZuZGVmIE9QRU5TU0xfSEVBREVSX0RTQV9ICisjZGVmaW5lIE9QRU5TU0xfSEVBREVSX0RTQV9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jhc2UuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvZW5naW5lLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9leF9kYXRhLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBEU0EgY29udGFpbnMgZnVuY3Rpb25zIGZvciBzaWduaW5nIGFuZCB2ZXJpZmluZyB3aXRoIHRoZSBEaWdpdGFsIFNpZ25hdHVyZQorICogQWxnb3JpdGhtLiAqLworCisKKy8qIEFsbG9jYXRpb24gYW5kIGRlc3RydWN0aW9uLiAqLworCisvKiBEU0FfbmV3IHJldHVybnMgYSBuZXcsIGVtcHR5IERTQSBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvci4gKi8KK0RTQSAqRFNBX25ldyh2b2lkKTsKKworLyogRFNBX25ld19tZXRob2QgYWN0cyB0aGUgc2FtZSBhcyB8REhfbmV3fCBidXQgdGFrZXMgYW4gZXhwbGljaXQgfEVOR0lORXwuICovCitEU0EgKkRTQV9uZXdfbWV0aG9kKGNvbnN0IEVOR0lORSAqZW5naW5lKTsKKworLyogRFNBX2ZyZWUgZGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHxkc2F8IGFuZCBmcmVlcyBpdCBpZiB0aGUKKyAqIHJlZmVyZW5jZSBjb3VudCBkcm9wcyB0byB6ZXJvLiAqLwordm9pZCBEU0FfZnJlZShEU0EgKmRzYSk7CisKKy8qIERTQV91cF9yZWYgaW5jcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHxkc2F8LiAqLworaW50IERTQV91cF9yZWYoRFNBICpkc2EpOworCisKKy8qIFBhcmFtZXRlciBnZW5lcmF0aW9uLiAqLworCisvKiBEU0FfZ2VuZXJhdGVfcGFyYW1ldGVyc19leCBnZW5lcmF0ZXMgYSBzZXQgb2YgRFNBIHBhcmFtZXRlcnMgYnkgZm9sbG93aW5nCisgKiB0aGUgcHJvY2VkdXJlIGdpdmVuIGluIEZJUFMgMTg2LTQsIGFwcGVuZGl4IEEuCisgKiAoaHR0cDovL252bHB1YnMubmlzdC5nb3YvbmlzdHB1YnMvRklQUy9OSVNULkZJUFMuMTg2LTQucGRmKQorICoKKyAqIFRoZSBsYXJnZXIgcHJpbWUgd2lsbCBoYXZlIGEgbGVuZ3RoIG9mIHxiaXRzfCAoZS5nLiAyMDQ4KS4gVGhlIHxzZWVkfCB2YWx1ZQorICogYWxsb3dzIG90aGVycyB0byBnZW5lcmF0ZSBhbmQgdmVyaWZ5IHRoZSBzYW1lIHBhcmFtZXRlcnMgYW5kIHNob3VsZCBiZQorICogcmFuZG9tIGlucHV0IHdoaWNoIGlzIGtlcHQgZm9yIHJlZmVyZW5jZS4gSWYgfG91dF9jb3VudGVyfCBvciB8b3V0X2h8IGFyZQorICogbm90IE5VTEwgdGhlbiB0aGUgY291bnRlciBhbmQgaCB2YWx1ZSB1c2VkIGluIHRoZSBnZW5lcmF0aW9uIGFyZSB3cml0dGVuIHRvCisgKiB0aGVtLgorICoKKyAqIFRoZSB8Y2J8IGFyZ3VtZW50IGlzIHBhc3NlZCB0byB8Qk5fZ2VuZXJhdGVfcHJpbWVfZXh8IGFuZCBpcyB0aHVzIGNhbGxlZAorICogZHVyaW5nIHRoZSBnZW5lcmF0aW9uIHByb2Nlc3MgaW4gb3JkZXIgdG8gaW5kaWNhdGUgcHJvZ3Jlc3MuIFNlZSB0aGUKKyAqIGNvbW1lbnRzIGZvciB0aGF0IGZ1bmN0aW9uIGZvciBkZXRhaWxzLiBJbiBhZGRpdGlvbiB0byB0aGUgY2FsbHMgbWFkZSBieQorICogfEJOX2dlbmVyYXRlX3ByaW1lX2V4fCwgfERTQV9nZW5lcmF0ZV9wYXJhbWV0ZXJzX2V4fCB3aWxsIGNhbGwgaXQgd2l0aAorICogfGV2ZW50fCBlcXVhbCB0byAyIGFuZCAzIGF0IGRpZmZlcmVudCBzdGFnZXMgb2YgdGhlIHByb2Nlc3MuCisgKgorICogSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvdGhlcndpc2UuICovCitpbnQgRFNBX2dlbmVyYXRlX3BhcmFtZXRlcnNfZXgoRFNBICpkc2EsIHVuc2lnbmVkIGJpdHMsIGNvbnN0IHVpbnQ4X3QgKnNlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNlZWRfbGVuLCBpbnQgKm91dF9jb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF9oLCBCTl9HRU5DQiAqY2IpOworCisvKiBEU0FwYXJhbXNfZHVwIHJldHVybnMgYSBmcmVzaGx5IGFsbG9jYXRlZCB8RFNBfCB0aGF0IGNvbnRhaW5zIGEgY29weSBvZiB0aGUKKyAqIHBhcmFtZXRlcnMgZnJvbSB8ZHNhfC4gSXQgcmV0dXJucyBOVUxMIG9uIGVycm9yLiAqLworRFNBICpEU0FwYXJhbXNfZHVwKGNvbnN0IERTQSAqZHNhKTsKKworCisvKiBLZXkgZ2VuZXJhdGlvbi4gKi8KKworLyogRFNBX2dlbmVyYXRlX2tleSBnZW5lcmF0ZXMgYSBwdWJsaWMvcHJpdmF0ZSBrZXkgcGFpciBpbiB8ZHNhfCwgd2hpY2ggbXVzdAorICogYWxyZWFkeSBoYXZlIHBhcmFtZXRlcnMgc2V0dXAuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24KKyAqIGVycm9yLiAqLworaW50IERTQV9nZW5lcmF0ZV9rZXkoRFNBICpkc2EpOworCisKKy8qIFNpZ25hdHVyZXMuICovCisKKy8qIERTQV9TSUcgY29udGFpbnMgYSBEU0Egc2lnbmF0dXJlIGFzIGEgcGFpciBvZiBpbnRlZ2Vycy4gKi8KK3R5cGVkZWYgc3RydWN0IERTQV9TSUdfc3QgeworICBCSUdOVU0gKnIsICpzOworfSBEU0FfU0lHOworCisvKiBEU0FfU0lHX25ldyByZXR1cm5zIGEgZnJlc2hseSBhbGxvY2F0ZWQsIERJR19TSUcgc3RydWN0dXJlIG9yIE5VTEwgb24gZXJyb3IuCisgKiBCb3RoIHxyfCBhbmQgfHN8IGluIHRoZSBzaWduYXR1cmUgd2lsbCBiZSBOVUxMLiAqLworRFNBX1NJRyAqRFNBX1NJR19uZXcodm9pZCk7CisKKy8qIERTQV9TSUdfZnJlZSBmcmVlcyB0aGUgY29udGVudHMgb2YgfHNpZ3wgYW5kIHRoZW4gZnJlZXMgfHNpZ3wgaXRzZWxmLiAqLwordm9pZCBEU0FfU0lHX2ZyZWUoRFNBX1NJRyAqc2lnKTsKKworLyogRFNBX2RvX3NpZ24gcmV0dXJucyBhIHNpZ25hdHVyZSBvZiB0aGUgaGFzaCBpbiB8ZGlnZXN0fCBieSB0aGUga2V5IGluIHxkc2F8CisgKiBhbmQgcmV0dXJucyBhbiBhbGxvY2F0ZWQsIERTQV9TSUcgc3RydWN0dXJlLCBvciBOVUxMIG9uIGVycm9yLiAqLworRFNBX1NJRyAqRFNBX2RvX3NpZ24oY29uc3QgdWludDhfdCAqZGlnZXN0LCBzaXplX3QgZGlnZXN0X2xlbiwgRFNBICpkc2EpOworCisvKiBEU0FfZG9fdmVyaWZ5IHZlcmlmaWVzIHRoYXQgfHNpZ3wgaXMgYSB2YWxpZCBzaWduYXR1cmUsIGJ5IHRoZSBwdWJsaWMga2V5IGluCisgKiB8ZHNhfCwgb2YgdGhlIGhhc2ggaW4gfGRpZ2VzdHwuIEl0IHJldHVybnMgb25lIGlmIHNvLCB6ZXJvIGlmIGludmFsaWQgYW5kIC0xCisgKiBvbiBlcnJvci4KKyAqCisgKiBXQVJOSU5HOiBkbyBub3QgdXNlLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgLTEgZm9yIGVycm9yLCAwIGZvciBpbnZhbGlkIGFuZCAxCisgKiBmb3IgdmFsaWQuIEhvd2V2ZXIsIHRoaXMgaXMgZGFuZ2Vyb3VzbHkgZGlmZmVyZW50IHRvIHRoZSB1c3VhbCBPcGVuU1NMCisgKiBjb252ZW50aW9uIGFuZCBjb3VsZCBiZSBhIGRpc2FzdGVyIGlmIGEgdXNlciBkaWQgfGlmIChEU0FfZG9fdmVyaWZ5KC4uLikpfC4KKyAqIEJlY2F1c2Ugb2YgdGhpcywgfERTQV9jaGVja19zaWduYXR1cmV8IGlzIGEgc2FmZXIgdmVyc2lvbiBvZiB0aGlzLgorICoKKyAqIFRPRE8oZm9yayk6IGRlcHJlY2F0ZS4gKi8KK2ludCBEU0FfZG9fdmVyaWZ5KGNvbnN0IHVpbnQ4X3QgKmRpZ2VzdCwgc2l6ZV90IGRpZ2VzdF9sZW4sIERTQV9TSUcgKnNpZywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IERTQSAqZHNhKTsKKworLyogRFNBX2NoZWNrX3NpZ25hdHVyZSBzZXRzIHwqb3V0X3ZhbGlkfCB0byB6ZXJvLiBUaGVuIGl0IHZlcmlmaWVzIHRoYXQgfHNpZ3wKKyAqIGlzIGEgdmFsaWQgc2lnbmF0dXJlLCBieSB0aGUgcHVibGljIGtleSBpbiB8ZHNhfCBvZiB0aGUgaGFzaCBpbiB8ZGlnZXN0fAorICogYW5kLCBpZiBzbywgaXQgc2V0cyB8Km91dF92YWxpZHwgdG8gb25lLgorICoKKyAqIEl0IHJldHVybnMgb25lIGlmIGl0IHdhcyBhYmxlIHRvIHZlcmlmeSB0aGUgc2lnbmF0dXJlIGFzIHZhbGlkIG9yIGludmFsaWQsCisgKiBhbmQgemVybyBvbiBlcnJvci4gKi8KK2ludCBEU0FfZG9fY2hlY2tfc2lnbmF0dXJlKGludCAqb3V0X3ZhbGlkLCBjb25zdCB1aW50OF90ICpkaWdlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGlnZXN0X2xlbiwgRFNBX1NJRyAqc2lnLCBjb25zdCBEU0EgKmRzYSk7CisKKworLyogQVNOLjEgc2lnbmF0dXJlcy4KKyAqCisgKiBUaGVzZSBmdW5jdGlvbnMgYWxzbyBwZXJmb3JtIERTQSBzaWduYXR1cmUgb3BlcmF0aW9ucywgYnV0IGRlYWwgd2l0aCBBU04uMQorICogZW5jb2RlZCBzaWduYXR1cmVzIGFzIG9wcG9zZWQgdG8gcmF3IHxCSUdOVU18cy4gSWYgeW91IGRvbid0IGtub3cgd2hhdAorICogZW5jb2RpbmcgYSBEU0Egc2lnbmF0dXJlIGlzIGluLCBpdCdzIHByb2JhYmx5IEFTTi4xLiAqLworCisvKiBEU0Ffc2lnbiBzaWducyB8ZGlnZXN0fCB3aXRoIHRoZSBrZXkgaW4gfGRzYXwgYW5kIHdyaXRlcyB0aGUgcmVzdWx0aW5nCisgKiBzaWduYXR1cmUsIGluIEFTTi4xIGZvcm0sIHRvIHxvdXRfc2lnfCBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgc2lnbmF0dXJlIHRvCisgKiB8Km91dF9zaWdsZW58LiBUaGVyZSBtdXN0IGJlLCBhdCBsZWFzdCwgfERTQV9zaXplKGRzYSl8IGJ5dGVzIG9mIHNwYWNlIGluCisgKiB8b3V0X3NpZ3wuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb3RoZXJ3aXNlLgorICoKKyAqIChUaGUgfHR5cGV8IGFyZ3VtZW50IGlzIGlnbm9yZWQuKSAqLworaW50IERTQV9zaWduKGludCB0eXBlLCBjb25zdCB1aW50OF90ICpkaWdlc3QsIHNpemVfdCBkaWdlc3RfbGVuLAorICAgICAgICAgICAgIHVpbnQ4X3QgKm91dF9zaWcsIHVuc2lnbmVkIGludCAqb3V0X3NpZ2xlbiwgRFNBICpkc2EpOworCisvKiBEU0FfdmVyaWZ5IHZlcmlmaWVzIHRoYXQgfHNpZ3wgaXMgYSB2YWxpZCwgQVNOLjEgc2lnbmF0dXJlLCBieSB0aGUgcHVibGljCisgKiBrZXkgaW4gfGRzYXwsIG9mIHRoZSBoYXNoIGluIHxkaWdlc3R8LiBJdCByZXR1cm5zIG9uZSBpZiBzbywgemVybyBpZiBpbnZhbGlkCisgKiBhbmQgLTEgb24gZXJyb3IuCisgKgorICogKFRoZSB8dHlwZXwgYXJndW1lbnQgaXMgaWdub3JlZC4pCisgKgorICogV0FSTklORzogZG8gbm90IHVzZS4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIC0xIGZvciBlcnJvciwgMCBmb3IgaW52YWxpZCBhbmQgMQorICogZm9yIHZhbGlkLiBIb3dldmVyLCB0aGlzIGlzIGRhbmdlcm91c2x5IGRpZmZlcmVudCB0byB0aGUgdXN1YWwgT3BlblNTTAorICogY29udmVudGlvbiBhbmQgY291bGQgYmUgYSBkaXNhc3RlciBpZiBhIHVzZXIgZGlkIHxpZiAoRFNBX2RvX3ZlcmlmeSguLi4pKXwuCisgKiBCZWNhdXNlIG9mIHRoaXMsIHxEU0FfY2hlY2tfc2lnbmF0dXJlfCBpcyBhIHNhZmVyIHZlcnNpb24gb2YgdGhpcy4KKyAqCisgKiBUT0RPKGZvcmspOiBkZXByZWNhdGUuICovCitpbnQgRFNBX3ZlcmlmeShpbnQgdHlwZSwgY29uc3QgdWludDhfdCAqZGlnZXN0LCBzaXplX3QgZGlnZXN0X2xlbiwKKyAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNpZywgc2l6ZV90IHNpZ19sZW4sIGNvbnN0IERTQSAqZHNhKTsKKworLyogRFNBX2NoZWNrX3NpZ25hdHVyZSBzZXRzIHwqb3V0X3ZhbGlkfCB0byB6ZXJvLiBUaGVuIGl0IHZlcmlmaWVzIHRoYXQgfHNpZ3wKKyAqIGlzIGEgdmFsaWQsIEFTTi4xIHNpZ25hdHVyZSwgYnkgdGhlIHB1YmxpYyBrZXkgaW4gfGRzYXwsIG9mIHRoZSBoYXNoIGluCisgKiB8ZGlnZXN0fC4gSWYgc28sIGl0IHNldHMgfCpvdXRfdmFsaWR8IHRvIG9uZS4KKyAqCisgKiBJdCByZXR1cm5zIG9uZSBpZiBpdCB3YXMgYWJsZSB0byB2ZXJpZnkgdGhlIHNpZ25hdHVyZSBhcyB2YWxpZCBvciBpbnZhbGlkLAorICogYW5kIHplcm8gb24gZXJyb3IuICovCitpbnQgRFNBX2NoZWNrX3NpZ25hdHVyZShpbnQgKm91dF92YWxpZCwgY29uc3QgdWludDhfdCAqZGlnZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRpZ2VzdF9sZW4sIGNvbnN0IHVpbnQ4X3QgKnNpZywgc2l6ZV90IHNpZ19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEU0EgKmRzYSk7CisKKy8qIERTQV9zaXplIHJldHVybnMgdGhlIHNpemUsIGluIGJ5dGVzLCBvZiBhbiBBU04uMSBlbmNvZGVkLCBEU0Egc2lnbmF0dXJlCisgKiBnZW5lcmF0ZWQgYnkgfGRzYXwuIFBhcmFtZXRlcnMgbXVzdCBhbHJlYWR5IGhhdmUgYmVlbiBzZXR1cCBpbiB8ZHNhfC4gKi8KK2ludCBEU0Ffc2l6ZShjb25zdCBEU0EgKmRzYSk7CisKKworLyogQVNOLjEgZW5jb2RpbmcuICovCisKKy8qIGQyaV9EU0FfU0lHIHBhcnNlcyBhbiBBU04uMSwgREVSLWVuY29kZWQsIERTQSBzaWduYXR1cmUgZnJvbSB8bGVufCBieXRlcyBhdAorICogfCppbnB8LiBJZiB8b3V0X3NpZ3wgaXMgbm90IE5VTEwgdGhlbiwgb24gZXhpdCwgYSBwb2ludGVyIHRvIHRoZSByZXN1bHQgaXMKKyAqIGluIHwqb3V0X3NpZ3wuIElmIHwqb3V0X3NpZ3wgaXMgYWxyZWFkeSBub24tTlVMTCBvbiBlbnRyeSB0aGVuIHRoZSByZXN1bHQgaXMKKyAqIHdyaXR0ZW4gZGlyZWN0bHkgaW50byB8Km91dF9zaWd8LCBvdGhlcndpc2UgYSBmcmVzaCB8RFNBX1NJR3wgaXMgYWxsb2NhdGVkLgorICogT24gc3VjY2Vzc2Z1bCBleGl0LCB8KmlucHwgaXMgYWR2YW5jZWQgcGFzdCB0aGUgREVSIHN0cnVjdHVyZS4gSXQgcmV0dXJucworICogdGhlIHJlc3VsdCBvciBOVUxMIG9uIGVycm9yLiAqLworRFNBX1NJRyAqZDJpX0RTQV9TSUcoRFNBX1NJRyAqKm91dF9zaWcsIGNvbnN0IHVpbnQ4X3QgKippbnAsIGxvbmcgbGVuKTsKKworLyogaTJkX0RTQV9TSUcgbWFyc2hhbHMgfGlufCB0byBhbiBBU04uMSwgREVSIHN0cnVjdHVyZS4gSWYgfG91dHB8IGlzIG5vdCBOVUxMCisgKiB0aGVuIHRoZSByZXN1bHQgaXMgd3JpdHRlbiB0byB8Km91dHB8IGFuZCB8Km91dHB8IGlzIGFkdmFuY2VkIGp1c3QgcGFzdCB0aGUKKyAqIG91dHB1dC4gSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSByZXN1bHQsIHdoZXRoZXIgd3JpdHRlbiBvciBub3QsCisgKiBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yLiAqLworaW50IGkyZF9EU0FfU0lHKGNvbnN0IERTQV9TSUcgKmluLCB1aW50OF90ICoqb3V0cCk7CisKKy8qIGQyaV9EU0FQdWJsaWNLZXkgcGFyc2VzIGFuIEFTTi4xLCBERVItZW5jb2RlZCwgRFNBIHB1YmxpYyBrZXkgZnJvbSB8bGVufAorICogYnl0ZXMgYXQgfCppbnB8LiBJZiB8b3V0fCBpcyBub3QgTlVMTCB0aGVuLCBvbiBleGl0LCBhIHBvaW50ZXIgdG8gdGhlIHJlc3VsdAorICogaXMgaW4gfCpvdXR8LiBJZiB8Km91dHwgaXMgYWxyZWFkeSBub24tTlVMTCBvbiBlbnRyeSB0aGVuIHRoZSByZXN1bHQgaXMKKyAqIHdyaXR0ZW4gZGlyZWN0bHkgaW50byB8Km91dHwsIG90aGVyd2lzZSBhIGZyZXNoIHxEU0F8IGlzIGFsbG9jYXRlZC4gT24KKyAqIHN1Y2Nlc3NmdWwgZXhpdCwgfCppbnB8IGlzIGFkdmFuY2VkIHBhc3QgdGhlIERFUiBzdHJ1Y3R1cmUuIEl0IHJldHVybnMgdGhlCisgKiByZXN1bHQgb3IgTlVMTCBvbiBlcnJvci4gKi8KK0RTQSAqZDJpX0RTQVB1YmxpY0tleShEU0EgKipvdXQsIGNvbnN0IHVpbnQ4X3QgKippbnAsIGxvbmcgbGVuKTsKKworLyogaTJkX0RTQVB1YmxpY0tleSBtYXJzaGFscyBhIHB1YmxpYyBrZXkgZnJvbSB8aW58IHRvIGFuIEFTTi4xLCBERVIgc3RydWN0dXJlLgorICogSWYgfG91dHB8IGlzIG5vdCBOVUxMIHRoZW4gdGhlIHJlc3VsdCBpcyB3cml0dGVuIHRvIHwqb3V0cHwgYW5kIHwqb3V0cHwgaXMKKyAqIGFkdmFuY2VkIGp1c3QgcGFzdCB0aGUgb3V0cHV0LiBJdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHJlc3VsdCwKKyAqIHdoZXRoZXIgd3JpdHRlbiBvciBub3QsIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IuICovCitpbnQgaTJkX0RTQVB1YmxpY0tleShjb25zdCBEU0EgKmluLCB1bnNpZ25lZCBjaGFyICoqb3V0cCk7CisKKy8qIGQyaV9EU0FQcml2YXRlS2V5IHBhcnNlcyBhbiBBU04uMSwgREVSLWVuY29kZWQsIERTQSBwcml2YXRlIGtleSBmcm9tIHxsZW58CisgKiBieXRlcyBhdCB8KmlucHwuIElmIHxvdXR8IGlzIG5vdCBOVUxMIHRoZW4sIG9uIGV4aXQsIGEgcG9pbnRlciB0byB0aGUgcmVzdWx0CisgKiBpcyBpbiB8Km91dHwuIElmIHwqb3V0fCBpcyBhbHJlYWR5IG5vbi1OVUxMIG9uIGVudHJ5IHRoZW4gdGhlIHJlc3VsdCBpcworICogd3JpdHRlbiBkaXJlY3RseSBpbnRvIHwqb3V0fCwgb3RoZXJ3aXNlIGEgZnJlc2ggfERTQXwgaXMgYWxsb2NhdGVkLiBPbgorICogc3VjY2Vzc2Z1bCBleGl0LCB8KmlucHwgaXMgYWR2YW5jZWQgcGFzdCB0aGUgREVSIHN0cnVjdHVyZS4gSXQgcmV0dXJucyB0aGUKKyAqIHJlc3VsdCBvciBOVUxMIG9uIGVycm9yLiAqLworRFNBICpkMmlfRFNBUHJpdmF0ZUtleShEU0EgKipvdXQsIGNvbnN0IHVpbnQ4X3QgKippbnAsIGxvbmcgbGVuKTsKKworLyogaTJkX0RTQVByaXZhdGVLZXkgbWFyc2hhbHMgYSBwcml2YXRlIGtleSBmcm9tIHxpbnwgdG8gYW4gQVNOLjEsIERFUiBzdHJ1Y3R1cmUuCisgKiBJZiB8b3V0cHwgaXMgbm90IE5VTEwgdGhlbiB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8gfCpvdXRwfCBhbmQgfCpvdXRwfCBpcworICogYWR2YW5jZWQganVzdCBwYXN0IHRoZSBvdXRwdXQuIEl0IHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgcmVzdWx0LAorICogd2hldGhlciB3cml0dGVuIG9yIG5vdCwgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvci4gKi8KK2ludCBpMmRfRFNBUHJpdmF0ZUtleShjb25zdCBEU0EgKmluLCB1bnNpZ25lZCBjaGFyICoqb3V0cCk7CisKKy8qIGQyaV9EU0FwYXJhbXMgcGFyc2VzIEFTTi4xLCBERVItZW5jb2RlZCwgRFNBIHBhcmFtZXRlcnMgZnJvbSB8bGVufCBieXRlcyBhdAorICogfCppbnB8LiBJZiB8b3V0fCBpcyBub3QgTlVMTCB0aGVuLCBvbiBleGl0LCBhIHBvaW50ZXIgdG8gdGhlIHJlc3VsdCBpcyBpbgorICogfCpvdXR8LiBJZiB8Km91dHwgaXMgYWxyZWFkeSBub24tTlVMTCBvbiBlbnRyeSB0aGVuIHRoZSByZXN1bHQgaXMgd3JpdHRlbgorICogZGlyZWN0bHkgaW50byB8Km91dHwsIG90aGVyd2lzZSBhIGZyZXNoIHxEU0F8IGlzIGFsbG9jYXRlZC4gT24gc3VjY2Vzc2Z1bAorICogZXhpdCwgfCppbnB8IGlzIGFkdmFuY2VkIHBhc3QgdGhlIERFUiBzdHJ1Y3R1cmUuIEl0IHJldHVybnMgdGhlIHJlc3VsdCBvcgorICogTlVMTCBvbiBlcnJvci4gKi8KK0RTQSAqZDJpX0RTQXBhcmFtcyhEU0EgKipvdXQsIGNvbnN0IHVpbnQ4X3QgKippbnAsIGxvbmcgbGVuKTsKKworLyogaTJkX0RTQXBhcmFtcyBtYXJzaGFscyBEU0EgcGFyYW1ldGVycyBmcm9tIHxpbnwgdG8gYW4gQVNOLjEsIERFUiBzdHJ1Y3R1cmUuCisgKiBJZiB8b3V0cHwgaXMgbm90IE5VTEwgdGhlbiB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8gfCpvdXRwfCBhbmQgfCpvdXRwfCBpcworICogYWR2YW5jZWQganVzdCBwYXN0IHRoZSBvdXRwdXQuIEl0IHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgcmVzdWx0LAorICogd2hldGhlciB3cml0dGVuIG9yIG5vdCwgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvci4gKi8KK2ludCBpMmRfRFNBcGFyYW1zKGNvbnN0IERTQSAqaW4sIHVuc2lnbmVkIGNoYXIgKipvdXRwKTsKKworCisvKiBQcmVjb21wdXRhdGlvbi4gKi8KKworLyogRFNBX3NpZ25fc2V0dXAgcHJlY29tcHV0ZXMgdGhlIG1lc3NhZ2UgaW5kZXBlbmRlbnQgcGFydCBvZiB0aGUgRFNBIHNpZ25hdHVyZQorICogYW5kIHdyaXRlcyB0aGVtIHRvIHwqb3V0X2tpbnZ8IGFuZCB8Km91dF9yfC4gUmV0dXJucyBvbmUgb24gc3VjY2VzcywgemVybyBvbgorICogZXJyb3IuCisgKgorICogVE9ETyhmb3JrKTogZGVjaWRlIHdoYXQgdG8gZG8gd2l0aCB0aGlzLiBTaW5jZSBtYWtpbmcgRFNBKiBvcGFxdWUgdGhlcmUncyBubworICogd2F5IGZvciB0aGUgdXNlciB0byBpbnN0YWxsIHRoZW0uIEFsc28sIGl0IGZvcmNlcyB0aGUgRFNBKiBub3QgdG8gYmUgY29uc3QKKyAqIHdoZW4gcGFzc2luZyB0byB0aGUgc2lnbmluZyBmdW5jdGlvbi4gKi8KK2ludCBEU0Ffc2lnbl9zZXR1cChjb25zdCBEU0EgKmRzYSwgQk5fQ1RYICpjdHgsIEJJR05VTSAqKm91dF9raW52LAorICAgICAgICAgICAgICAgICAgIEJJR05VTSAqKm91dF9yKTsKKworCisvKiBleF9kYXRhIGZ1bmN0aW9ucy4KKyAqCisgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIHdyYXBwZXJzLiBTZWUgfGV4X2RhdGEuaHwgZm9yIGRldGFpbHMuICovCisKK2ludCBEU0FfZ2V0X2V4X25ld19pbmRleChsb25nIGFyZ2wsIHZvaWQgKmFyZ3AsIENSWVBUT19FWF9uZXcgKm5ld19mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgIENSWVBUT19FWF9kdXAgKmR1cF9mdW5jLCBDUllQVE9fRVhfZnJlZSAqZnJlZV9mdW5jKTsKK2ludCBEU0Ffc2V0X2V4X2RhdGEoRFNBICpkLCBpbnQgaWR4LCB2b2lkICphcmcpOwordm9pZCAqRFNBX2dldF9leF9kYXRhKGNvbnN0IERTQSAqZCwgaW50IGlkeCk7CisKKworc3RydWN0IGRzYV9tZXRob2QgeworICBzdHJ1Y3Qgb3BlbnNzbF9tZXRob2RfY29tbW9uX3N0IGNvbW1vbjsKKworICB2b2lkICphcHBfZGF0YTsKKworICBpbnQgKCppbml0KShEU0EgKmRzYSk7CisgIGludCAoKmZpbmlzaCkoRFNBICpkc2EpOworCisgIERTQV9TSUcgKigqc2lnbikoY29uc3QgdWludDhfdCAqZGlnZXN0LCBzaXplX3QgZGlnZXN0X2xlbiwgRFNBICpkc2EpOworCisgIGludCAoKnNpZ25fc2V0dXApKGNvbnN0IERTQSAqZHNhLCBCTl9DVFggKmN0eF9pbiwgQklHTlVNICoqa2ludnAsIEJJR05VTSAqKnJwKTsKKworICBpbnQgKCp2ZXJpZnkpKGludCAqb3V0X3ZhbGlkLCBjb25zdCB1aW50OF90ICpkaWdlc3QsIHNpemVfdCBkaWdlc3RfbGVuLAorICAgICAgICAgICAgICAgIERTQV9TSUcgKnNpZywgY29uc3QgRFNBICpkc2EpOworCisgIC8qIGdlbmVyYXRlX3BhcmFtZXRlcnMsIGlmIG5vbi1OVUxMLCBpcyB1c2VkIHRvIGdlbmVyYXRlIERTQSBwYXJhbWV0ZXJzLiAqLworICBpbnQgKCpnZW5lcmF0ZV9wYXJhbWV0ZXJzKShEU0EgKmRzYSwgdW5zaWduZWQgYml0cywgY29uc3QgdWludDhfdCAqc2VlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNlZWRfbGVuLCBpbnQgKmNvdW50ZXJfcmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICpoX3JldCwgQk5fR0VOQ0IgKmNiKTsKKworICAvKiBrZXlnZW4sIGlmIG5vbi1OVUxMLCBpcyB1c2VkIHRvIGdlbmVyYXRlIERTQSBrZXlzLiAqLworICBpbnQgKCprZXlnZW4pKERTQSAqZHNhKTsKK307CisKK3N0cnVjdCBkc2Ffc3QgeworICBsb25nIHZlcnNpb247CisgIGludCB3cml0ZV9wYXJhbXM7CisgIEJJR05VTSAqcDsKKyAgQklHTlVNICpxOyAvKiA9PSAyMCAqLworICBCSUdOVU0gKmc7CisKKyAgQklHTlVNICpwdWJfa2V5OyAgLyogeSBwdWJsaWMga2V5ICovCisgIEJJR05VTSAqcHJpdl9rZXk7IC8qIHggcHJpdmF0ZSBrZXkgKi8KKworICBCSUdOVU0gKmtpbnY7IC8qIFNpZ25pbmcgcHJlLWNhbGMgKi8KKyAgQklHTlVNICpyOyAgICAvKiBTaWduaW5nIHByZS1jYWxjICovCisKKyAgaW50IGZsYWdzOworICAvKiBOb3JtYWxseSB1c2VkIHRvIGNhY2hlIG1vbnRnb21lcnkgdmFsdWVzICovCisgIEJOX01PTlRfQ1RYICptZXRob2RfbW9udF9wOworICBpbnQgcmVmZXJlbmNlczsKKyAgQ1JZUFRPX0VYX0RBVEEgZXhfZGF0YTsKKyAgRFNBX01FVEhPRCAqbWV0aDsKKyAgLyogZnVuY3Rpb25hbCByZWZlcmVuY2UgaWYgJ21ldGgnIGlzIEVOR0lORS1wcm92aWRlZCAqLworICBFTkdJTkUgKmVuZ2luZTsKK307CisKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9ICAvKiBleHRlcm4gQyAqLworI2VuZGlmCisKKyNkZWZpbmUgRFNBX0Zfc2lnbiAxMDAKKyNkZWZpbmUgRFNBX0ZfdmVyaWZ5IDEwMQorI2RlZmluZSBEU0FfRl9kc2Ffc2lnX2NiIDEwMgorI2RlZmluZSBEU0FfRl9EU0FfbmV3X21ldGhvZCAxMDMKKyNkZWZpbmUgRFNBX0Zfc2lnbl9zZXR1cCAxMDQKKyNkZWZpbmUgRFNBX1JfTkVFRF9ORVdfU0VUVVBfVkFMVUVTIDEwMAorI2RlZmluZSBEU0FfUl9CQURfUV9WQUxVRSAxMDEKKyNkZWZpbmUgRFNBX1JfTU9EVUxVU19UT09fTEFSR0UgMTAyCisjZGVmaW5lIERTQV9SX01JU1NJTkdfUEFSQU1FVEVSUyAxMDMKKworI2VuZGlmICAvKiBPUEVOU1NMX0hFQURFUl9EU0FfSCAqLwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2RzYS9kc2FfYXNuMS5jIGIvY3J5cHRvL2RzYS9kc2FfYXNuMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYjJjYzYKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vZHNhL2RzYV9hc24xLmMKQEAgLTAsMCArMSwxNDggQEAKKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDAwLiAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvZHNhLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworCitzdGF0aWMgaW50IGRzYV9zaWdfY2IoaW50IG9wZXJhdGlvbiwgQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZXhhcmcpIHsKKyAgaWYgKG9wZXJhdGlvbiAhPSBBU04xX09QX05FV19QUkUpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIERTQV9TSUcgKnNpZzsKKyAgc2lnID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKERTQV9TSUcpKTsKKyAgaWYgKCFzaWcpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihEU0EsIGRzYV9zaWdfY2IsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIG1lbXNldChzaWcsIDAsIHNpemVvZihEU0FfU0lHKSk7CisgICpwdmFsID0gKEFTTjFfVkFMVUUgKilzaWc7CisgIHJldHVybiAyOworfQorCitBU04xX1NFUVVFTkNFX2NiKERTQV9TSUcsIGRzYV9zaWdfY2IpID0geworICAgIEFTTjFfU0lNUExFKERTQV9TSUcsIHIsIENCSUdOVU0pLAorICAgIEFTTjFfU0lNUExFKERTQV9TSUcsIHMsIENCSUdOVU0pfSBBU04xX1NFUVVFTkNFX0VORF9jYihEU0FfU0lHLCBEU0FfU0lHKTsKKworSU1QTEVNRU5UX0FTTjFfRU5DT0RFX0ZVTkNUSU9OU19jb25zdF9mbmFtZShEU0FfU0lHLCBEU0FfU0lHLCBEU0FfU0lHKTsKKworCitzdGF0aWMgaW50IGRzYV9jYihpbnQgb3BlcmF0aW9uLCBBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9JVEVNICppdCwKKyAgICAgICAgICAgICAgICAgIHZvaWQgKmV4YXJnKSB7CisgIHN3aXRjaCAob3BlcmF0aW9uKSB7CisgICAgY2FzZSBBU04xX09QX05FV19QUkU6CisgICAgICAqcHZhbCA9IChBU04xX1ZBTFVFICopRFNBX25ldygpOworICAgICAgaWYgKCpwdmFsKSB7CisgICAgICAgIHJldHVybiAyOworICAgICAgfQorICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlIEFTTjFfT1BfRlJFRV9QUkU6CisgICAgICBEU0FfZnJlZSgoRFNBICopKnB2YWwpOworICAgICAgKnB2YWwgPSBOVUxMOworICAgICAgcmV0dXJuIDI7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDE7CisgIH0KK30KKworQVNOMV9TRVFVRU5DRV9jYihEU0FQcml2YXRlS2V5LCBkc2FfY2IpID0geworICAgIEFTTjFfU0lNUExFKERTQSwgdmVyc2lvbiwgTE9ORyksCisgICAgQVNOMV9TSU1QTEUoRFNBLCBwLCBCSUdOVU0pLAorICAgIEFTTjFfU0lNUExFKERTQSwgcSwgQklHTlVNKSwKKyAgICBBU04xX1NJTVBMRShEU0EsIGcsIEJJR05VTSksCisgICAgQVNOMV9TSU1QTEUoRFNBLCBwdWJfa2V5LCBCSUdOVU0pLAorICAgIEFTTjFfU0lNUExFKERTQSwgcHJpdl9rZXksIEJJR05VTSl9IEFTTjFfU0VRVUVOQ0VfRU5EX2NiKERTQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEU0FQcml2YXRlS2V5KTsKKworSU1QTEVNRU5UX0FTTjFfRU5DT0RFX0ZVTkNUSU9OU19jb25zdF9mbmFtZShEU0EsIERTQVByaXZhdGVLZXksIERTQVByaXZhdGVLZXkpOworCitBU04xX1NFUVVFTkNFX2NiKERTQXBhcmFtcywgZHNhX2NiKSA9IHsKKyAgICBBU04xX1NJTVBMRShEU0EsIHAsIEJJR05VTSksIEFTTjFfU0lNUExFKERTQSwgcSwgQklHTlVNKSwKKyAgICBBU04xX1NJTVBMRShEU0EsIGcsIEJJR05VTSksIH0gQVNOMV9TRVFVRU5DRV9FTkRfY2IoRFNBLCBEU0FwYXJhbXMpOworCitJTVBMRU1FTlRfQVNOMV9FTkNPREVfRlVOQ1RJT05TX2NvbnN0X2ZuYW1lKERTQSwgRFNBcGFyYW1zLCBEU0FwYXJhbXMpOworCisKKy8qIERTQSBwdWJsaWMga2V5IGlzIGEgYml0IHRyaWNraWVyLi4uIGl0cyBlZmZlY3RpdmVseSBhIENIT0lDRSB0eXBlIGRlY2lkZWQgYnkKKyAqIGEgZmllbGQgY2FsbGVkIHdyaXRlX3BhcmFtcyB3aGljaCBjYW4gZWl0aGVyIHdyaXRlIG91dCBqdXN0IHRoZSBwdWJsaWMga2V5CisgKiBhcyBhbiBJTlRFR0VSIG9yIHRoZSBwYXJhbWV0ZXJzIGFuZCBwdWJsaWMga2V5IGluIGEgU0VRVUVOQ0UuICovCisKK0FTTjFfU0VRVUVOQ0UoZHNhX3B1Yl9pbnRlcm5hbCkgPSB7CisJQVNOMV9TSU1QTEUoRFNBLCBwdWJfa2V5LCBCSUdOVU0pLAorCUFTTjFfU0lNUExFKERTQSwgcCwgQklHTlVNKSwKKwlBU04xX1NJTVBMRShEU0EsIHEsIEJJR05VTSksCisJQVNOMV9TSU1QTEUoRFNBLCBnLCBCSUdOVU0pCit9IEFTTjFfU0VRVUVOQ0VfRU5EX25hbWUoRFNBLCBkc2FfcHViX2ludGVybmFsKTsKKworQVNOMV9DSE9JQ0VfY2IoRFNBUHVibGljS2V5LCBkc2FfY2IpID0geworCUFTTjFfU0lNUExFKERTQSwgcHViX2tleSwgQklHTlVNKSwKKwlBU04xX0VYX0NPTUJJTkUoMCwgMCwgZHNhX3B1Yl9pbnRlcm5hbCkKK30gQVNOMV9DSE9JQ0VfRU5EX2NiKERTQSwgRFNBUHVibGljS2V5LCB3cml0ZV9wYXJhbXMpOworCitJTVBMRU1FTlRfQVNOMV9FTkNPREVfRlVOQ1RJT05TX2NvbnN0X2ZuYW1lKERTQSwgRFNBUHVibGljS2V5LCBEU0FQdWJsaWNLZXkpOworCitEU0EgKkRTQXBhcmFtc19kdXAoY29uc3QgRFNBICpkc2EpIHsKKyAgcmV0dXJuIEFTTjFfaXRlbV9kdXAoQVNOMV9JVEVNX3JwdHIoRFNBcGFyYW1zKSwgKERTQSopIGRzYSk7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vZHNhL2RzYV9lcnJvci5jIGIvY3J5cHRvL2RzYS9kc2FfZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmUwOGFlCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2RzYS9kc2FfZXJyb3IuYwpAQCAtMCwwICsxLDMwIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTQsIEdvb2dsZSBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorCisjaW5jbHVkZSAiZHNhLmgiCisKK2NvbnN0IEVSUl9TVFJJTkdfREFUQSBEU0FfZXJyb3Jfc3RyaW5nX2RhdGFbXSA9IHsKKyAge0VSUl9QQUNLKEVSUl9MSUJfRFNBLCBEU0FfRl9EU0FfbmV3X21ldGhvZCwgMCksICJEU0FfbmV3X21ldGhvZCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9EU0EsIERTQV9GX2RzYV9zaWdfY2IsIDApLCAiZHNhX3NpZ19jYiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9EU0EsIERTQV9GX3NpZ24sIDApLCAic2lnbiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9EU0EsIERTQV9GX3NpZ25fc2V0dXAsIDApLCAic2lnbl9zZXR1cCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9EU0EsIERTQV9GX3ZlcmlmeSwgMCksICJ2ZXJpZnkifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRFNBLCAwLCBEU0FfUl9CQURfUV9WQUxVRSksICJCQURfUV9WQUxVRSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9EU0EsIDAsIERTQV9SX01JU1NJTkdfUEFSQU1FVEVSUyksICJNSVNTSU5HX1BBUkFNRVRFUlMifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRFNBLCAwLCBEU0FfUl9NT0RVTFVTX1RPT19MQVJHRSksICJNT0RVTFVTX1RPT19MQVJHRSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9EU0EsIDAsIERTQV9SX05FRURfTkVXX1NFVFVQX1ZBTFVFUyksICJORUVEX05FV19TRVRVUF9WQUxVRVMifSwKKyAgezAsIE5VTEx9LAorfTsKZGlmZiAtLWdpdCBhL2NyeXB0by9kc2EvZHNhX2ltcGwuYyBiL2NyeXB0by9kc2EvZHNhX2ltcGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWNjNzQyCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2RzYS9kc2FfaW1wbC5jCkBAIC0wLDAgKzEsNzIzIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICoKKyAqIFRoZSBEU1Mgcm91dGluZXMgYXJlIGJhc2VkIG9uIHBhdGNoZXMgc3VwcGxpZWQgYnkKKyAqIFN0ZXZlbiBTY2hvY2ggPHNjaG9jaEBzaGViYS5hcmMubmFzYS5nb3Y+LiAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9kc2EuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2RpZ2VzdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zaGEuaD4KKworI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgT1BFTlNTTF9EU0FfTUFYX01PRFVMVVNfQklUUyAxMDAwMAorCisvKiBQcmltYWxpdHkgdGVzdCBhY2NvcmRpbmcgdG8gRklQUyBQVUIgMTg2Wy0xXSwgQXBwZW5kaXggMi4xOiA1MCByb3VuZHMgb2YKKyAqIFJhYmluLU1pbGxlciAqLworI2RlZmluZSBEU1NfcHJpbWVfY2hlY2tzIDUwCisKK3N0YXRpYyBpbnQgc2lnbl9zZXR1cChjb25zdCBEU0EgKmRzYSwgQk5fQ1RYICpjdHhfaW4sIEJJR05VTSAqKmtpbnZwLAorICAgICAgICAgICAgICAgICAgICAgIEJJR05VTSAqKnJwKSB7CisgIEJOX0NUWCAqY3R4OworICBCSUdOVU0gaywga3EsICpLLCAqa2ludiA9IE5VTEwsICpyID0gTlVMTDsKKyAgaW50IHJldCA9IDA7CisKKyAgaWYgKCFkc2EtPnAgfHwgIWRzYS0+cSB8fCAhZHNhLT5nKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRFNBLCBzaWduX3NldHVwLCBEU0FfUl9NSVNTSU5HX1BBUkFNRVRFUlMpOworICAgIHJldHVybiAwOworICB9CisKKyAgQk5faW5pdCgmayk7CisgIEJOX2luaXQoJmtxKTsKKworICBjdHggPSBjdHhfaW47CisgIGlmIChjdHggPT0gTlVMTCkgeworICAgIGN0eCA9IEJOX0NUWF9uZXcoKTsKKyAgICBpZiAoY3R4ID09IE5VTEwpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfQorCisgIHIgPSBCTl9uZXcoKTsKKyAgaWYgKHIgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgLyogR2V0IHJhbmRvbSBrICovCisgIGRvIHsKKyAgICBpZiAoIUJOX3JhbmRfcmFuZ2UoJmssIGRzYS0+cSkpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfSB3aGlsZSAoQk5faXNfemVybygmaykpOworCisgIEJOX3NldF9mbGFncygmaywgQk5fRkxHX0NPTlNUVElNRSk7CisKKyAgaWYgKCFCTl9NT05UX0NUWF9zZXRfbG9ja2VkKChCTl9NT05UX0NUWCAqKikmZHNhLT5tZXRob2RfbW9udF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JZUFRPX0xPQ0tfRFNBLCBkc2EtPnAsIGN0eCkpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIC8qIENvbXB1dGUgciA9IChnXmsgbW9kIHApIG1vZCBxICovCisgIGlmICghQk5fY29weSgma3EsICZrKSkKKyAgICBnb3RvIGVycjsKKworICAvKiBXZSBkbyBub3Qgd2FudCB0aW1pbmcgaW5mb3JtYXRpb24gdG8gbGVhayB0aGUgbGVuZ3RoIG9mIGssCisgICAqIHNvIHdlIGNvbXB1dGUgZ15rIHVzaW5nIGFuIGVxdWl2YWxlbnQgZXhwb25lbnQgb2YgZml4ZWQgbGVuZ3RoLgorICAgKgorICAgKiAoVGhpcyBpcyBhIGtsdWRnZSB0aGF0IHdlIG5lZWQgYmVjYXVzZSB0aGUgQk5fbW9kX2V4cF9tb250KCkKKyAgICogZG9lcyBub3QgbGV0IHVzIHNwZWNpZnkgdGhlIGRlc2lyZWQgdGltaW5nIGJlaGF2aW91ci4pICovCisKKyAgaWYgKCFCTl9hZGQoJmtxLCAma3EsIGRzYS0+cSkpCisgICAgZ290byBlcnI7CisgIGlmIChCTl9udW1fYml0cygma3EpIDw9IEJOX251bV9iaXRzKGRzYS0+cSkpIHsKKyAgICBpZiAoIUJOX2FkZCgma3EsICZrcSwgZHNhLT5xKSkKKyAgICAgIGdvdG8gZXJyOworICB9CisKKyAgSyA9ICZrcTsKKworICBpZiAoIUJOX21vZF9leHBfbW9udChyLCBkc2EtPmcsIEssIGRzYS0+cCwgY3R4LCBkc2EtPm1ldGhvZF9tb250X3ApKSB7CisgICAgZ290byBlcnI7CisgIH0KKyAgaWYgKCFCTl9tb2QociwgciwgZHNhLT5xLCBjdHgpKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICAvKiBDb21wdXRlICBwYXJ0IG9mICdzID0gaW52KGspIChtICsgeHIpIG1vZCBxJyAqLworICBraW52ID0gQk5fbW9kX2ludmVyc2UoTlVMTCwgJmssIGRzYS0+cSwgY3R4KTsKKyAgaWYgKGtpbnYgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKCpraW52cCAhPSBOVUxMKSB7CisgICAgQk5fY2xlYXJfZnJlZSgqa2ludnApOworICB9CisgICpraW52cCA9IGtpbnY7CisgIGtpbnYgPSBOVUxMOworICBpZiAoKnJwICE9IE5VTEwpIHsKKyAgICBCTl9jbGVhcl9mcmVlKCpycCk7CisgIH0KKyAgKnJwID0gcjsKKyAgcmV0ID0gMTsKKworZXJyOgorICBpZiAoIXJldCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKERTQSwgc2lnbl9zZXR1cCwgRVJSX1JfQk5fTElCKTsKKyAgICBpZiAociAhPSBOVUxMKSB7CisgICAgICBCTl9jbGVhcl9mcmVlKHIpOworICAgIH0KKyAgfQorCisgIGlmIChjdHhfaW4gPT0gTlVMTCkgeworICAgIEJOX0NUWF9mcmVlKGN0eCk7CisgIH0KKyAgQk5fY2xlYXJfZnJlZSgmayk7CisgIEJOX2NsZWFyX2ZyZWUoJmtxKTsKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIERTQV9TSUcgKnNpZ24oY29uc3QgdWludDhfdCAqZGlnZXN0LCBzaXplX3QgZGlnZXN0X2xlbiwgRFNBICpkc2EpIHsKKyAgQklHTlVNICpraW52ID0gTlVMTCwgKnIgPSBOVUxMLCAqcyA9IE5VTEw7CisgIEJJR05VTSBtOworICBCSUdOVU0geHI7CisgIEJOX0NUWCAqY3R4ID0gTlVMTDsKKyAgaW50IHJlYXNvbiA9IEVSUl9SX0JOX0xJQjsKKyAgRFNBX1NJRyAqcmV0ID0gTlVMTDsKKyAgaW50IG5vcmVkbyA9IDA7CisKKyAgQk5faW5pdCgmbSk7CisgIEJOX2luaXQoJnhyKTsKKworICBpZiAoIWRzYS0+cCB8fCAhZHNhLT5xIHx8ICFkc2EtPmcpIHsKKyAgICByZWFzb24gPSBEU0FfUl9NSVNTSU5HX1BBUkFNRVRFUlM7CisgICAgZ290byBlcnI7CisgIH0KKworICBzID0gQk5fbmV3KCk7CisgIGlmIChzID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorICBjdHggPSBCTl9DVFhfbmV3KCk7CisgIGlmIChjdHggPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisKK3JlZG86CisgIGlmIChkc2EtPmtpbnYgPT0gTlVMTCB8fCBkc2EtPnIgPT0gTlVMTCkgeworICAgIGlmICghRFNBX3NpZ25fc2V0dXAoZHNhLCBjdHgsICZraW52LCAmcikpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBraW52ID0gZHNhLT5raW52OworICAgIGRzYS0+a2ludiA9IE5VTEw7CisgICAgciA9IGRzYS0+cjsKKyAgICBkc2EtPnIgPSBOVUxMOworICAgIG5vcmVkbyA9IDE7CisgIH0KKworICBpZiAoZGlnZXN0X2xlbiA+IEJOX251bV9ieXRlcyhkc2EtPnEpKSB7CisgICAgLyogaWYgdGhlIGRpZ2VzdCBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIHRoZSBzaXplIG9mIHEgdXNlIHRoZQorICAgICAqIEJOX251bV9iaXRzKGRzYS0+cSkgbGVmdG1vc3QgYml0cyBvZiB0aGUgZGlnZXN0LCBzZWUKKyAgICAgKiBmaXBzIDE4Ni0zLCA0LjIgKi8KKyAgICBkaWdlc3RfbGVuID0gQk5fbnVtX2J5dGVzKGRzYS0+cSk7CisgIH0KKworICBpZiAoQk5fYmluMmJuKGRpZ2VzdCwgZGlnZXN0X2xlbiwgJm0pID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIC8qIENvbXB1dGUgIHMgPSBpbnYoaykgKG0gKyB4cikgbW9kIHEgKi8KKyAgaWYgKCFCTl9tb2RfbXVsKCZ4ciwgZHNhLT5wcml2X2tleSwgciwgZHNhLT5xLCBjdHgpKSB7CisgICAgZ290byBlcnI7IC8qIHMgPSB4ciAqLworICB9CisgIGlmICghQk5fYWRkKHMsICZ4ciwgJm0pKSB7CisgICAgZ290byBlcnI7IC8qIHMgPSBtICsgeHIgKi8KKyAgfQorICBpZiAoQk5fY21wKHMsIGRzYS0+cSkgPiAwKSB7CisgICAgaWYgKCFCTl9zdWIocywgcywgZHNhLT5xKSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICB9CisgIGlmICghQk5fbW9kX211bChzLCBzLCBraW52LCBkc2EtPnEsIGN0eCkpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIHJldCA9IERTQV9TSUdfbmV3KCk7CisgIGlmIChyZXQgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisgIC8qIFJlZG8gaWYgciBvciBzIGlzIHplcm8gYXMgcmVxdWlyZWQgYnkgRklQUyAxODYtMzogdGhpcyBpcworICAgKiB2ZXJ5IHVubGlrZWx5LiAqLworICBpZiAoQk5faXNfemVybyhyKSB8fCBCTl9pc196ZXJvKHMpKSB7CisgICAgaWYgKG5vcmVkbykgeworICAgICAgcmVhc29uID0gRFNBX1JfTkVFRF9ORVdfU0VUVVBfVkFMVUVTOworICAgICAgZ290byBlcnI7CisgICAgfQorICAgIGdvdG8gcmVkbzsKKyAgfQorICByZXQtPnIgPSByOworICByZXQtPnMgPSBzOworCitlcnI6CisgIGlmICghcmV0KSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRFNBLCBzaWduLCByZWFzb24pOworICAgIEJOX2ZyZWUocik7CisgICAgQk5fZnJlZShzKTsKKyAgfQorICBpZiAoY3R4ICE9IE5VTEwpIHsKKyAgICBCTl9DVFhfZnJlZShjdHgpOworICB9CisgIEJOX2NsZWFyX2ZyZWUoJm0pOworICBCTl9jbGVhcl9mcmVlKCZ4cik7CisgIGlmIChraW52ICE9IE5VTEwpIHsKKyAgICAvKiBkc2EtPmtpbnYgaXMgTlVMTCBub3cgaWYgd2UgdXNlZCBpdCAqLworICAgIEJOX2NsZWFyX2ZyZWUoa2ludik7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZlcmlmeShpbnQgKm91dF92YWxpZCwgY29uc3QgdWludDhfdCAqZGdzdCwgc2l6ZV90IGRpZ2VzdF9sZW4sCisgICAgICAgICAgICAgICAgICBEU0FfU0lHICpzaWcsIGNvbnN0IERTQSAqZHNhKSB7CisgIEJOX0NUWCAqY3R4OworICBCSUdOVU0gdTEsIHUyLCB0MTsKKyAgQk5fTU9OVF9DVFggKm1vbnQgPSBOVUxMOworICBpbnQgcmV0ID0gMDsKKyAgdW5zaWduZWQgaTsKKworICAqb3V0X3ZhbGlkID0gMDsKKworICBpZiAoIWRzYS0+cCB8fCAhZHNhLT5xIHx8ICFkc2EtPmcpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihEU0EsIHZlcmlmeSwgRFNBX1JfTUlTU0lOR19QQVJBTUVURVJTKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGkgPSBCTl9udW1fYml0cyhkc2EtPnEpOworICAvKiBmaXBzIDE4Ni0zIGFsbG93cyBvbmx5IGRpZmZlcmVudCBzaXplcyBmb3IgcSAqLworICBpZiAoaSAhPSAxNjAgJiYgaSAhPSAyMjQgJiYgaSAhPSAyNTYpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihEU0EsIHZlcmlmeSwgRFNBX1JfQkFEX1FfVkFMVUUpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKEJOX251bV9iaXRzKGRzYS0+cCkgPiBPUEVOU1NMX0RTQV9NQVhfTU9EVUxVU19CSVRTKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRFNBLCB2ZXJpZnksIERTQV9SX01PRFVMVVNfVE9PX0xBUkdFKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIEJOX2luaXQoJnUxKTsKKyAgQk5faW5pdCgmdTIpOworICBCTl9pbml0KCZ0MSk7CisKKyAgY3R4ID0gQk5fQ1RYX25ldygpOworICBpZiAoY3R4ID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmIChCTl9pc196ZXJvKHNpZy0+cikgfHwgQk5faXNfbmVnYXRpdmUoc2lnLT5yKSB8fAorICAgICAgQk5fdWNtcChzaWctPnIsIGRzYS0+cSkgPj0gMCkgeworICAgIHJldCA9IDE7CisgICAgZ290byBlcnI7CisgIH0KKyAgaWYgKEJOX2lzX3plcm8oc2lnLT5zKSB8fCBCTl9pc19uZWdhdGl2ZShzaWctPnMpIHx8CisgICAgICBCTl91Y21wKHNpZy0+cywgZHNhLT5xKSA+PSAwKSB7CisgICAgcmV0ID0gMTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIC8qIENhbGN1bGF0ZSBXID0gaW52KFMpIG1vZCBRCisgICAqIHNhdmUgVyBpbiB1MiAqLworICBpZiAoQk5fbW9kX2ludmVyc2UoJnUyLCBzaWctPnMsIGRzYS0+cSwgY3R4KSA9PSBOVUxMKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICAvKiBzYXZlIE0gaW4gdTEgKi8KKyAgaWYgKGRpZ2VzdF9sZW4gPiAoaSA+PiAzKSkgeworICAgIC8qIGlmIHRoZSBkaWdlc3QgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2l6ZSBvZiBxIHVzZSB0aGUKKyAgICAgKiBCTl9udW1fYml0cyhkc2EtPnEpIGxlZnRtb3N0IGJpdHMgb2YgdGhlIGRpZ2VzdCwgc2VlCisgICAgICogZmlwcyAxODYtMywgNC4yICovCisgICAgZGlnZXN0X2xlbiA9IChpID4+IDMpOworICB9CisKKyAgaWYgKEJOX2JpbjJibihkZ3N0LCBkaWdlc3RfbGVuLCAmdTEpID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIC8qIHUxID0gTSAqIHcgbW9kIHEgKi8KKyAgaWYgKCFCTl9tb2RfbXVsKCZ1MSwgJnUxLCAmdTIsIGRzYS0+cSwgY3R4KSkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgLyogdTIgPSByICogdyBtb2QgcSAqLworICBpZiAoIUJOX21vZF9tdWwoJnUyLCBzaWctPnIsICZ1MiwgZHNhLT5xLCBjdHgpKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBtb250ID0gQk5fTU9OVF9DVFhfc2V0X2xvY2tlZCgoQk5fTU9OVF9DVFggKiopJmRzYS0+bWV0aG9kX21vbnRfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JZUFRPX0xPQ0tfRFNBLCBkc2EtPnAsIGN0eCk7CisgIGlmICghbW9udCkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKCFCTl9tb2RfZXhwMl9tb250KCZ0MSwgZHNhLT5nLCAmdTEsIGRzYS0+cHViX2tleSwgJnUyLCBkc2EtPnAsIGN0eCwgbW9udCkpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIC8qIEJOX2NvcHkoJnUxLCZ0MSk7ICovCisgIC8qIGxldCB1MSA9IHUxIG1vZCBxICovCisgIGlmICghQk5fbW9kKCZ1MSwgJnQxLCBkc2EtPnEsIGN0eCkpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIC8qIFYgaXMgbm93IGluIHUxLiAgSWYgdGhlIHNpZ25hdHVyZSBpcyBjb3JyZWN0LCBpdCB3aWxsIGJlCisgICAqIGVxdWFsIHRvIFIuICovCisgICpvdXRfdmFsaWQgPSBCTl91Y21wKCZ1MSwgc2lnLT5yKSA9PSAwOworICByZXQgPSAxOworCitlcnI6CisgIGlmIChyZXQgIT0gMSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKERTQSwgdmVyaWZ5LCBFUlJfUl9CTl9MSUIpOworICB9CisgIGlmIChjdHggIT0gTlVMTCkgeworICAgIEJOX0NUWF9mcmVlKGN0eCk7CisgIH0KKyAgQk5fZnJlZSgmdTEpOworICBCTl9mcmVlKCZ1Mik7CisgIEJOX2ZyZWUoJnQxKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGtleWdlbihEU0EgKmRzYSkgeworICBpbnQgb2sgPSAwOworICBCTl9DVFggKmN0eCA9IE5VTEw7CisgIEJJR05VTSAqcHViX2tleSA9IE5VTEwsICpwcml2X2tleSA9IE5VTEw7CisgIEJJR05VTSBwcms7CisKKyAgY3R4ID0gQk5fQ1RYX25ldygpOworICBpZiAoY3R4ID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIHByaXZfa2V5ID0gZHNhLT5wcml2X2tleTsKKyAgaWYgKHByaXZfa2V5ID09IE5VTEwpIHsKKyAgICBwcml2X2tleSA9IEJOX25ldygpOworICAgIGlmIChwcml2X2tleSA9PSBOVUxMKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0KKworICBkbyB7CisgICAgaWYgKCFCTl9yYW5kX3JhbmdlKHByaXZfa2V5LCBkc2EtPnEpKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0gd2hpbGUgKEJOX2lzX3plcm8ocHJpdl9rZXkpKTsKKworICBwdWJfa2V5ID0gZHNhLT5wdWJfa2V5OworICBpZiAocHViX2tleSA9PSBOVUxMKSB7CisgICAgcHViX2tleSA9IEJOX25ldygpOworICAgIGlmIChwdWJfa2V5ID09IE5VTEwpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfQorCisgIEJOX2luaXQoJnByayk7CisgIEJOX3dpdGhfZmxhZ3MoJnByaywgcHJpdl9rZXksIEJOX0ZMR19DT05TVFRJTUUpOworCisgIGlmICghQk5fbW9kX2V4cChwdWJfa2V5LCBkc2EtPmcsICZwcmssIGRzYS0+cCwgY3R4KSkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgZHNhLT5wcml2X2tleSA9IHByaXZfa2V5OworICBkc2EtPnB1Yl9rZXkgPSBwdWJfa2V5OworICBvayA9IDE7CisKK2VycjoKKyAgaWYgKHB1Yl9rZXkgIT0gTlVMTCAmJiBkc2EtPnB1Yl9rZXkgPT0gTlVMTCkgeworICAgIEJOX2ZyZWUocHViX2tleSk7CisgIH0KKyAgaWYgKHByaXZfa2V5ICE9IE5VTEwgJiYgZHNhLT5wcml2X2tleSA9PSBOVUxMKSB7CisgICAgQk5fZnJlZShwcml2X2tleSk7CisgIH0KKyAgaWYgKGN0eCAhPSBOVUxMKSB7CisgICAgQk5fQ1RYX2ZyZWUoY3R4KTsKKyAgfQorCisgIHJldHVybiBvazsKK30KKworc3RhdGljIGludCBwYXJhbWdlbihEU0EgKnJldCwgdW5zaWduZWQgYml0cywgY29uc3QgdWludDhfdCAqc2VlZF9pbiwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNlZWRfbGVuLCBpbnQgKmNvdW50ZXJfcmV0LCB1bnNpZ25lZCBsb25nICpoX3JldCwKKyAgICAgICAgICAgICAgICAgICAgQk5fR0VOQ0IgKmNiKSB7CisgIGludCBvayA9IDA7CisgIHVuc2lnbmVkIGNoYXIgc2VlZFtTSEEyNTZfRElHRVNUX0xFTkdUSF07CisgIHVuc2lnbmVkIGNoYXIgbWRbU0hBMjU2X0RJR0VTVF9MRU5HVEhdOworICB1bnNpZ25lZCBjaGFyIGJ1ZltTSEEyNTZfRElHRVNUX0xFTkdUSF0sIGJ1ZjJbU0hBMjU2X0RJR0VTVF9MRU5HVEhdOworICBCSUdOVU0gKnIwLCAqVywgKlgsICpjLCAqdGVzdDsKKyAgQklHTlVNICpnID0gTlVMTCwgKnEgPSBOVUxMLCAqcCA9IE5VTEw7CisgIEJOX01PTlRfQ1RYICptb250ID0gTlVMTDsKKyAgaW50IGssIG4gPSAwLCBtID0gMDsKKyAgdW5zaWduZWQgaTsKKyAgaW50IGNvdW50ZXIgPSAwOworICBpbnQgciA9IDA7CisgIEJOX0NUWCAqY3R4ID0gTlVMTDsKKyAgdW5zaWduZWQgaW50IGggPSAyOworICB1bnNpZ25lZCBxYml0cywgcXNpemU7CisgIGNvbnN0IEVWUF9NRCAqZXZwbWQ7CisKKyAgaWYgKGJpdHMgPj0gMjA0OCkgeworICAgIHFiaXRzID0gMjU2OworICAgIGV2cG1kID0gRVZQX3NoYTI1NigpOworICB9IGVsc2UgeworICAgIHFiaXRzID0gMTYwOworICAgIGV2cG1kID0gRVZQX3NoYTEoKTsKKyAgfQorICBxc2l6ZSA9IHFiaXRzIC8gODsKKworICBpZiAocXNpemUgIT0gU0hBX0RJR0VTVF9MRU5HVEggJiYgcXNpemUgIT0gU0hBMjI0X0RJR0VTVF9MRU5HVEggJiYKKyAgICAgIHFzaXplICE9IFNIQTI1Nl9ESUdFU1RfTEVOR1RIKQorICAgIC8qIGludmFsaWQgcSBzaXplICovCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKGJpdHMgPCA1MTIpCisgICAgYml0cyA9IDUxMjsKKworICBiaXRzID0gKGJpdHMgKyA2MykgLyA2NCAqIDY0OworCisgIC8qIE5COiBzZWVkX2xlbiA9PSAwIGlzIHNwZWNpYWwgY2FzZTogY29weSBnZW5lcmF0ZWQgc2VlZCB0bworICAgKiBzZWVkX2luIGlmIGl0IGlzIG5vdCBOVUxMLiAqLworICBpZiAoc2VlZF9sZW4gJiYgKHNlZWRfbGVuIDwgKHNpemVfdClxc2l6ZSkpCisgICAgc2VlZF9pbiA9IE5VTEw7IC8qIHNlZWQgYnVmZmVyIHRvbyBzbWFsbCAtLSBpZ25vcmUgKi8KKyAgaWYgKHNlZWRfbGVuID4gKHNpemVfdClxc2l6ZSkKKyAgICBzZWVkX2xlbiA9IHFzaXplOyAvKiBBcHAuIDIuMiBvZiBGSVBTIFBVQiAxODYgYWxsb3dzIGxhcmdlciBTRUVELAorICAgICAgICAgICAgICAgICAgICAgICAqIGJ1dCBvdXIgaW50ZXJuYWwgYnVmZmVycyBhcmUgcmVzdHJpY3RlZCB0byAxNjAgYml0cyovCisgIGlmIChzZWVkX2luICE9IE5VTEwpCisgICAgbWVtY3B5KHNlZWQsIHNlZWRfaW4sIHNlZWRfbGVuKTsKKworICBpZiAoKGN0eCA9IEJOX0NUWF9uZXcoKSkgPT0gTlVMTCkKKyAgICBnb3RvIGVycjsKKworICBpZiAoKG1vbnQgPSBCTl9NT05UX0NUWF9uZXcoKSkgPT0gTlVMTCkKKyAgICBnb3RvIGVycjsKKworICBCTl9DVFhfc3RhcnQoY3R4KTsKKyAgcjAgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIGcgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIFcgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIHEgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIFggPSBCTl9DVFhfZ2V0KGN0eCk7CisgIGMgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIHAgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIHRlc3QgPSBCTl9DVFhfZ2V0KGN0eCk7CisKKyAgaWYgKCFCTl9sc2hpZnQodGVzdCwgQk5fdmFsdWVfb25lKCksIGJpdHMgLSAxKSkKKyAgICBnb3RvIGVycjsKKworICBmb3IgKDs7KSB7CisgICAgZm9yICg7OykgLyogZmluZCBxICovCisgICAgeworICAgICAgaW50IHNlZWRfaXNfcmFuZG9tOworCisgICAgICAvKiBzdGVwIDEgKi8KKyAgICAgIGlmICghQk5fR0VOQ0JfY2FsbChjYiwgMCwgbSsrKSkKKyAgICAgICAgZ290byBlcnI7CisKKyAgICAgIGlmICghc2VlZF9sZW4pIHsKKyAgICAgICAgUkFORF9wc2V1ZG9fYnl0ZXMoc2VlZCwgcXNpemUpOworICAgICAgICBzZWVkX2lzX3JhbmRvbSA9IDE7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZWVkX2lzX3JhbmRvbSA9IDA7CisgICAgICAgIHNlZWRfbGVuID0gMDsgLyogdXNlIHJhbmRvbSBzZWVkIGlmICdzZWVkX2luJyB0dXJucyBvdXQgdG8gYmUgYmFkKi8KKyAgICAgIH0KKyAgICAgIG1lbWNweShidWYsIHNlZWQsIHFzaXplKTsKKyAgICAgIG1lbWNweShidWYyLCBzZWVkLCBxc2l6ZSk7CisgICAgICAvKiBwcmVjb21wdXRlICJTRUVEICsgMSIgZm9yIHN0ZXAgNzogKi8KKyAgICAgIGZvciAoaSA9IHFzaXplIC0gMTsgaSA8IHFzaXplOyBpLS0pIHsKKyAgICAgICAgYnVmW2ldKys7CisgICAgICAgIGlmIChidWZbaV0gIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLyogc3RlcCAyICovCisgICAgICBpZiAoIUVWUF9EaWdlc3Qoc2VlZCwgcXNpemUsIG1kLCBOVUxMLCBldnBtZCwgTlVMTCkpCisgICAgICAgIGdvdG8gZXJyOworICAgICAgaWYgKCFFVlBfRGlnZXN0KGJ1ZiwgcXNpemUsIGJ1ZjIsIE5VTEwsIGV2cG1kLCBOVUxMKSkKKyAgICAgICAgZ290byBlcnI7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgcXNpemU7IGkrKykKKyAgICAgICAgbWRbaV0gXj0gYnVmMltpXTsKKworICAgICAgLyogc3RlcCAzICovCisgICAgICBtZFswXSB8PSAweDgwOworICAgICAgbWRbcXNpemUgLSAxXSB8PSAweDAxOworICAgICAgaWYgKCFCTl9iaW4yYm4obWQsIHFzaXplLCBxKSkKKyAgICAgICAgZ290byBlcnI7CisKKyAgICAgIC8qIHN0ZXAgNCAqLworICAgICAgciA9IEJOX2lzX3ByaW1lX2Zhc3R0ZXN0X2V4KHEsIERTU19wcmltZV9jaGVja3MsIGN0eCwgc2VlZF9pc19yYW5kb20sIGNiKTsKKyAgICAgIGlmIChyID4gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICBpZiAociAhPSAwKQorICAgICAgICBnb3RvIGVycjsKKworICAgICAgLyogZG8gYSBjYWxsYmFjayBjYWxsICovCisgICAgICAvKiBzdGVwIDUgKi8KKyAgICB9CisKKyAgICBpZiAoIUJOX0dFTkNCX2NhbGwoY2IsIDIsIDApKQorICAgICAgZ290byBlcnI7CisgICAgaWYgKCFCTl9HRU5DQl9jYWxsKGNiLCAzLCAwKSkKKyAgICAgIGdvdG8gZXJyOworCisgICAgLyogc3RlcCA2ICovCisgICAgY291bnRlciA9IDA7CisgICAgLyogIm9mZnNldCA9IDIiICovCisKKyAgICBuID0gKGJpdHMgLSAxKSAvIDE2MDsKKworICAgIGZvciAoOzspIHsKKyAgICAgIGlmICgoY291bnRlciAhPSAwKSAmJiAhQk5fR0VOQ0JfY2FsbChjYiwgMCwgY291bnRlcikpCisgICAgICAgIGdvdG8gZXJyOworCisgICAgICAvKiBzdGVwIDcgKi8KKyAgICAgIEJOX3plcm8oVyk7CisgICAgICAvKiBub3cgJ2J1ZicgY29udGFpbnMgIlNFRUQgKyBvZmZzZXQgLSAxIiAqLworICAgICAgZm9yIChrID0gMDsgayA8PSBuOyBrKyspIHsKKyAgICAgICAgLyogb2J0YWluICJTRUVEICsgb2Zmc2V0ICsgayIgYnkgaW5jcmVtZW50aW5nOiAqLworICAgICAgICBmb3IgKGkgPSBxc2l6ZSAtIDE7IGkgPCBxc2l6ZTsgaS0tKSB7CisgICAgICAgICAgYnVmW2ldKys7CisgICAgICAgICAgaWYgKGJ1ZltpXSAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIUVWUF9EaWdlc3QoYnVmLCBxc2l6ZSwgbWQsIE5VTEwsIGV2cG1kLCBOVUxMKSkKKyAgICAgICAgICBnb3RvIGVycjsKKworICAgICAgICAvKiBzdGVwIDggKi8KKyAgICAgICAgaWYgKCFCTl9iaW4yYm4obWQsIHFzaXplLCByMCkpCisgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIGlmICghQk5fbHNoaWZ0KHIwLCByMCwgKHFzaXplIDw8IDMpICogaykpCisgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIGlmICghQk5fYWRkKFcsIFcsIHIwKSkKKyAgICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKworICAgICAgLyogbW9yZSBvZiBzdGVwIDggKi8KKyAgICAgIGlmICghQk5fbWFza19iaXRzKFcsIGJpdHMgLSAxKSkKKyAgICAgICAgZ290byBlcnI7CisgICAgICBpZiAoIUJOX2NvcHkoWCwgVykpCisgICAgICAgIGdvdG8gZXJyOworICAgICAgaWYgKCFCTl9hZGQoWCwgWCwgdGVzdCkpCisgICAgICAgIGdvdG8gZXJyOworCisgICAgICAvKiBzdGVwIDkgKi8KKyAgICAgIGlmICghQk5fbHNoaWZ0MShyMCwgcSkpCisgICAgICAgIGdvdG8gZXJyOworICAgICAgaWYgKCFCTl9tb2QoYywgWCwgcjAsIGN0eCkpCisgICAgICAgIGdvdG8gZXJyOworICAgICAgaWYgKCFCTl9zdWIocjAsIGMsIEJOX3ZhbHVlX29uZSgpKSkKKyAgICAgICAgZ290byBlcnI7CisgICAgICBpZiAoIUJOX3N1YihwLCBYLCByMCkpCisgICAgICAgIGdvdG8gZXJyOworCisgICAgICAvKiBzdGVwIDEwICovCisgICAgICBpZiAoQk5fY21wKHAsIHRlc3QpID49IDApIHsKKyAgICAgICAgLyogc3RlcCAxMSAqLworICAgICAgICByID0gQk5faXNfcHJpbWVfZmFzdHRlc3RfZXgocCwgRFNTX3ByaW1lX2NoZWNrcywgY3R4LCAxLCBjYik7CisgICAgICAgIGlmIChyID4gMCkKKyAgICAgICAgICBnb3RvIGVuZDsgLyogZm91bmQgaXQgKi8KKyAgICAgICAgaWYgKHIgIT0gMCkKKyAgICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKworICAgICAgLyogc3RlcCAxMyAqLworICAgICAgY291bnRlcisrOworICAgICAgLyogIm9mZnNldCA9IG9mZnNldCArIG4gKyAxIiAqLworCisgICAgICAvKiBzdGVwIDE0ICovCisgICAgICBpZiAoY291bnRlciA+PSA0MDk2KQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KK2VuZDoKKyAgaWYgKCFCTl9HRU5DQl9jYWxsKGNiLCAyLCAxKSkKKyAgICBnb3RvIGVycjsKKworICAvKiBXZSBub3cgbmVlZCB0byBnZW5lcmF0ZSBnICovCisgIC8qIFNldCByMD0ocC0xKS9xICovCisgIGlmICghQk5fc3ViKHRlc3QsIHAsIEJOX3ZhbHVlX29uZSgpKSkKKyAgICBnb3RvIGVycjsKKyAgaWYgKCFCTl9kaXYocjAsIE5VTEwsIHRlc3QsIHEsIGN0eCkpCisgICAgZ290byBlcnI7CisKKyAgaWYgKCFCTl9zZXRfd29yZCh0ZXN0LCBoKSkKKyAgICBnb3RvIGVycjsKKyAgaWYgKCFCTl9NT05UX0NUWF9zZXQobW9udCwgcCwgY3R4KSkKKyAgICBnb3RvIGVycjsKKworICBmb3IgKDs7KSB7CisgICAgLyogZz10ZXN0XnIwJXAgKi8KKyAgICBpZiAoIUJOX21vZF9leHBfbW9udChnLCB0ZXN0LCByMCwgcCwgY3R4LCBtb250KSkKKyAgICAgIGdvdG8gZXJyOworICAgIGlmICghQk5faXNfb25lKGcpKQorICAgICAgYnJlYWs7CisgICAgaWYgKCFCTl9hZGQodGVzdCwgdGVzdCwgQk5fdmFsdWVfb25lKCkpKQorICAgICAgZ290byBlcnI7CisgICAgaCsrOworICB9CisKKyAgaWYgKCFCTl9HRU5DQl9jYWxsKGNiLCAzLCAxKSkKKyAgICBnb3RvIGVycjsKKworICBvayA9IDE7CisKK2VycjoKKyAgaWYgKG9rKSB7CisgICAgaWYgKHJldC0+cCkKKyAgICAgIEJOX2ZyZWUocmV0LT5wKTsKKyAgICBpZiAocmV0LT5xKQorICAgICAgQk5fZnJlZShyZXQtPnEpOworICAgIGlmIChyZXQtPmcpCisgICAgICBCTl9mcmVlKHJldC0+Zyk7CisgICAgcmV0LT5wID0gQk5fZHVwKHApOworICAgIHJldC0+cSA9IEJOX2R1cChxKTsKKyAgICByZXQtPmcgPSBCTl9kdXAoZyk7CisgICAgaWYgKHJldC0+cCA9PSBOVUxMIHx8IHJldC0+cSA9PSBOVUxMIHx8IHJldC0+ZyA9PSBOVUxMKSB7CisgICAgICBvayA9IDA7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgaWYgKGNvdW50ZXJfcmV0ICE9IE5VTEwpCisgICAgICAqY291bnRlcl9yZXQgPSBjb3VudGVyOworICAgIGlmIChoX3JldCAhPSBOVUxMKQorICAgICAgKmhfcmV0ID0gaDsKKyAgfQorCisgIGlmIChjdHgpIHsKKyAgICBCTl9DVFhfZW5kKGN0eCk7CisgICAgQk5fQ1RYX2ZyZWUoY3R4KTsKKyAgfQorCisgIGlmIChtb250ICE9IE5VTEwpCisgICAgQk5fTU9OVF9DVFhfZnJlZShtb250KTsKKworICByZXR1cm4gb2s7Cit9CisKK3N0YXRpYyBpbnQgZmluaXNoKERTQSAqZHNhKSB7CisgIEJOX01PTlRfQ1RYX2ZyZWUoZHNhLT5tZXRob2RfbW9udF9wKTsKKyAgZHNhLT5tZXRob2RfbW9udF9wID0gTlVMTDsKKyAgcmV0dXJuIDE7Cit9CisKK2NvbnN0IHN0cnVjdCBkc2FfbWV0aG9kIERTQV9kZWZhdWx0X21ldGhvZCA9IHsKKyAgeworICAgIDAgLyogcmVmZXJlbmNlcyAqLywKKyAgICAxIC8qIGlzX3N0YXRpYyAqLywKKyAgfSwKKyAgTlVMTCAvKiBhcHBfZGF0YSAqLywKKworICBOVUxMIC8qIGluaXQgKi8sCisgIGZpbmlzaCAvKiBmaW5pc2ggKi8sCisKKyAgc2lnbiwKKyAgc2lnbl9zZXR1cCwKKyAgdmVyaWZ5LAorCisgIHBhcmFtZ2VuLAorICBrZXlnZW4sCit9OwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2RzYS9kc2FfdGVzdC5jIGIvY3J5cHRvL2RzYS9kc2FfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NDFjMTIKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vZHNhL2RzYV90ZXN0LmMKQEAgLTAsMCArMSwyMTQgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKgorICogVGhlIERTUyByb3V0aW5lcyBhcmUgYmFzZWQgb24gcGF0Y2hlcyBzdXBwbGllZCBieQorICogU3RldmVuIFNjaG9jaCA8c2Nob2NoQHNoZWJhLmFyYy5uYXNhLmdvdj4uICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2RzYS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisKK3N0YXRpYyBpbnQgZHNhX2NiKGludCBwLCBpbnQgbiwgQk5fR0VOQ0IgKmFyZyk7CisKKy8qIHNlZWQsIG91dF9wLCBvdXRfcSwgb3V0X2cgYXJlIHRha2VuIGZyb20gdGhlIHVwZGF0ZWQgQXBwZW5kaXggNSB0bworICogRklQUyBQVUIgMTg2IGFuZCBhbHNvIGFwcGVhciBpbiBBcHBlbmRpeCA1IHRvIEZJUFMgUElCIDE4Ni0xICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBzZWVkWzIwXSA9IHsweGQ1LCAweDAxLCAweDRlLCAweDRiLCAweDYwLCAweGVmLCAweDJiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhOCwgMHhiNiwgMHgyMSwgMHgxYiwgMHg0MCwgMHg2MiwgMHhiYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzIsIDB4MjQsIDB4ZTAsIDB4NDIsIDB4N2QsIDB4ZDMsIH07CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG91dF9wW10gPSB7CisgICAgMHg4ZCwgMHhmMiwgMHhhNCwgMHg5NCwgMHg0OSwgMHgyMiwgMHg3NiwgMHhhYSwgMHgzZCwgMHgyNSwgMHg3NSwKKyAgICAweDliLCAweGIwLCAweDY4LCAweDY5LCAweGNiLCAweGVhLCAweGMwLCAweGQ4LCAweDNhLCAweGZiLCAweDhkLAorICAgIDB4MGMsIDB4ZjcsIDB4Y2IsIDB4YjgsIDB4MzIsIDB4NGYsIDB4MGQsIDB4NzgsIDB4ODIsIDB4ZTUsIDB4ZDAsCisgICAgMHg3NiwgMHgyZiwgMHhjNSwgMHhiNywgMHgyMSwgMHgwZSwgMHhhZiwgMHhjMiwgMHhlOSwgMHhhZCwgMHhhYywKKyAgICAweDMyLCAweGFiLCAweDdhLCAweGFjLCAweDQ5LCAweDY5LCAweDNkLCAweGZiLCAweGY4LCAweDM3LCAweDI0LAorICAgIDB4YzIsIDB4ZWMsIDB4MDcsIDB4MzYsIDB4ZWUsIDB4MzEsIDB4YzgsIDB4MDIsIDB4OTEsIH07CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG91dF9xW10gPSB7MHhjNywgMHg3MywgMHgyMSwgMHg4YywgMHg3MywgMHg3ZSwgMHhjOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhlZSwgMHg5OSwgMHgzYiwgMHg0ZiwgMHgyZCwgMHhlZCwgMHgzMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmNCwgMHg4ZSwgMHhkYSwgMHhjZSwgMHg5MSwgMHg1ZiwgfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgb3V0X2dbXSA9IHsKKyAgICAweDYyLCAweDZkLCAweDAyLCAweDc4LCAweDM5LCAweGVhLCAweDBhLCAweDEzLCAweDQxLCAweDMxLCAweDYzLAorICAgIDB4YTUsIDB4NWIsIDB4NGMsIDB4YjUsIDB4MDAsIDB4MjksIDB4OWQsIDB4NTUsIDB4MjIsIDB4OTUsIDB4NmMsCisgICAgMHhlZiwgMHhjYiwgMHgzYiwgMHhmZiwgMHgxMCwgMHhmMywgMHg5OSwgMHhjZSwgMHgyYywgMHgyZSwgMHg3MSwKKyAgICAweGNiLCAweDlkLCAweGU1LCAweGZhLCAweDI0LCAweGJhLCAweGJmLCAweDU4LCAweGU1LCAweGI3LCAweDk1LAorICAgIDB4MjEsIDB4OTIsIDB4NWMsIDB4OWMsIDB4YzQsIDB4MmUsIDB4OWYsIDB4NmYsIDB4NDYsIDB4NGIsIDB4MDgsCisgICAgMHg4YywgMHhjNSwgMHg3MiwgMHhhZiwgMHg1MywgMHhlNiwgMHhkNywgMHg4OCwgMHgwMiwgfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc3RyMVtdPSIxMjM0NTY3ODkwMTIzNDU2Nzg5MCI7CisKK3N0YXRpYyBCSU8gKmJpb19lcnIgPSBOVUxMOworc3RhdGljIEJJTyAqYmlvX291dCA9IE5VTEw7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICBCTl9HRU5DQiBjYjsKKyAgRFNBICpkc2EgPSBOVUxMOworICBpbnQgY291bnRlciwgb2sgPSAwLCBpLCBqOworICB1bnNpZ25lZCBjaGFyIGJ1ZlsyNTZdOworICB1bnNpZ25lZCBsb25nIGg7CisgIHVuc2lnbmVkIGNoYXIgc2lnWzI1Nl07CisgIHVuc2lnbmVkIGludCBzaWdsZW47CisKKyAgYmlvX2VyciA9IEJJT19uZXdfZnAoc3RkZXJyLCBCSU9fTk9DTE9TRSk7CisgIGJpb19vdXQgPSBCSU9fbmV3X2ZwKHN0ZG91dCwgQklPX05PQ0xPU0UpOworCisgIEJJT19wcmludGYoYmlvX291dCwgInRlc3QgZ2VuZXJhdGlvbiBvZiBEU0EgcGFyYW1ldGVyc1xuIik7CisKKyAgQk5fR0VOQ0Jfc2V0KCZjYiwgZHNhX2NiLCBiaW9fb3V0KTsKKyAgZHNhID0gRFNBX25ldygpOworICBpZiAoZHNhID09IE5VTEwgfHwKKyAgICAgICFEU0FfZ2VuZXJhdGVfcGFyYW1ldGVyc19leChkc2EsIDUxMiwgc2VlZCwgMjAsICZjb3VudGVyLCAmaCwgJmNiKSkgeworICAgIGdvdG8gZW5kOworICB9CisKKyAgQklPX3ByaW50ZihiaW9fb3V0LCAic2VlZFxuIik7CisgIGZvciAoaSA9IDA7IGkgPCAyMDsgaSArPSA0KSB7CisgICAgQklPX3ByaW50ZihiaW9fb3V0LCAiJTAyWCUwMlglMDJYJTAyWCAiLCBzZWVkW2ldLCBzZWVkW2kgKyAxXSwgc2VlZFtpICsgMl0sCisgICAgICAgICAgICAgICBzZWVkW2kgKyAzXSk7CisgIH0KKyAgQklPX3ByaW50ZihiaW9fb3V0LCAiXG5jb3VudGVyPSVkIGg9JWxkXG4iLCBjb3VudGVyLCBoKTsKKworICBpZiAoY291bnRlciAhPSAxMDUpIHsKKyAgICBCSU9fcHJpbnRmKGJpb19lcnIsICJjb3VudGVyIHNob3VsZCBiZSAxMDVcbiIpOworICAgIGdvdG8gZW5kOworICB9CisgIGlmIChoICE9IDIpIHsKKyAgICBCSU9fcHJpbnRmKGJpb19lcnIsICJoIHNob3VsZCBiZSAyXG4iKTsKKyAgICBnb3RvIGVuZDsKKyAgfQorCisgIGkgPSBCTl9ibjJiaW4oZHNhLT5xLCBidWYpOworICBqID0gc2l6ZW9mKG91dF9xKTsKKyAgaWYgKGkgIT0gaiB8fCBtZW1jbXAoYnVmLCBvdXRfcSwgaSkgIT0gMCkgeworICAgIEJJT19wcmludGYoYmlvX2VyciwgInEgdmFsdWUgaXMgd3JvbmdcbiIpOworICAgIGdvdG8gZW5kOworICB9CisKKyAgaSA9IEJOX2JuMmJpbihkc2EtPnAsIGJ1Zik7CisgIGogPSBzaXplb2Yob3V0X3ApOworICBpZiAoaSAhPSBqIHx8IG1lbWNtcChidWYsIG91dF9wLCBpKSAhPSAwKSB7CisgICAgQklPX3ByaW50ZihiaW9fZXJyLCAicCB2YWx1ZSBpcyB3cm9uZ1xuIik7CisgICAgZ290byBlbmQ7CisgIH0KKworICBpID0gQk5fYm4yYmluKGRzYS0+ZywgYnVmKTsKKyAgaiA9IHNpemVvZihvdXRfZyk7CisgIGlmIChpICE9IGogfHwgbWVtY21wKGJ1Ziwgb3V0X2csIGkpICE9IDApIHsKKyAgICBCSU9fcHJpbnRmKGJpb19lcnIsICJnIHZhbHVlIGlzIHdyb25nXG4iKTsKKyAgICBnb3RvIGVuZDsKKyAgfQorCisgIERTQV9nZW5lcmF0ZV9rZXkoZHNhKTsKKyAgRFNBX3NpZ24oMCwgc3RyMSwgMjAsIHNpZywgJnNpZ2xlbiwgZHNhKTsKKyAgaWYgKERTQV92ZXJpZnkoMCwgc3RyMSwgMjAsIHNpZywgc2lnbGVuLCBkc2EpID09IDEpIHsKKyAgICBvayA9IDE7CisgIH0gZWxzZSB7CisgICAgQklPX3ByaW50ZihiaW9fZXJyLCAidmVyaWZpY2F0aW9uIGZhaWx1cmVcbiIpOworICB9CisKK2VuZDoKKyAgaWYgKCFvaykgeworICAgIEJJT19wcmludF9lcnJvcnMoYmlvX2Vycik7CisgIH0KKyAgaWYgKGRzYSAhPSBOVUxMKSB7CisgICAgRFNBX2ZyZWUoZHNhKTsKKyAgfQorCisgIEJJT19mcmVlKGJpb19lcnIpOworICBCSU9fZnJlZShiaW9fb3V0KTsKKworICBpZiAob2spIHsKKyAgICBwcmludGYoIlBBU1NcbiIpOworICB9CisKKyAgcmV0dXJuIG9rID09IDEgPyAwIDogMTsKK30KKworc3RhdGljIGludCBkc2FfY2IoaW50IHAsIGludCBuLCBCTl9HRU5DQiAqYXJnKSB7CisgIGNoYXIgYyA9ICcqJzsKKyAgc3RhdGljIGludCBvayA9IDAsIG51bSA9IDA7CisKKyAgc3dpdGNoIChwKSB7CisgIGNhc2UgMDoKKyAgICBjID0gJy4nOworICAgIG51bSsrOworICAgIGJyZWFrOworICBjYXNlIDE6CisgICAgYyA9ICcrJzsKKyAgICBicmVhazsKKyAgY2FzZSAyOgorICAgIGMgPSAnKic7CisgICAgb2srKzsKKyAgICBicmVhazsKKyAgY2FzZSAzOgorICAgIGMgPSAnXG4nOworICB9CisKKyAgQklPX3dyaXRlKGFyZy0+YXJnLCAmYywgMSk7CisgICh2b2lkKUJJT19mbHVzaChhcmctPmFyZyk7CisKKyAgaWYgKCFvayAmJiBwID09IDAgJiYgbnVtID4gMSkgeworICAgIEJJT19wcmludGYoKEJJTyAqKWFyZywgImVycm9yIGluIGRzYXRlc3RcbiIpOworICAgIHJldHVybiAwOworICB9CisKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vZHNhL2ludGVybmFsLmggYi9jcnlwdG8vZHNhL2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY5OTE1OAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9kc2EvaW50ZXJuYWwuaApAQCAtMCwwICsxLDc4IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICoKKyAqIFRoZSBEU1Mgcm91dGluZXMgYXJlIGJhc2VkIG9uIHBhdGNoZXMgc3VwcGxpZWQgYnkKKyAqIFN0ZXZlbiBTY2hvY2ggPHNjaG9jaEBzaGViYS5hcmMubmFzYS5nb3Y+LiAqLworCisjaWZuZGVmIE9QRU5TU0xfSEVBREVSX0RTQV9JTlRFUk5BTF9ICisjZGVmaW5lIE9QRU5TU0xfSEVBREVSX0RTQV9JTlRFUk5BTF9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jhc2UuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V4X2RhdGEuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9ICAvKiBleHRlcm4gQyAqLworI2VuZGlmCisKKyNlbmRpZiAgLyogT1BFTlNTTF9IRUFERVJfRFNBX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2NyeXB0by9lYy9DTWFrZUxpc3RzLnR4dCBiL2NyeXB0by9lYy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTk5MTZmCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2VjL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjQgQEAKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQorCithZGRfbGlicmFyeSgKKwllYworCisJT0JKRUNUCisKKwllYy5jCisJb2N0LmMKKwlzaW1wbGUuYworCWVjX21vbnRnb21lcnkuYworCXduYWYuYworCWVjX2tleS5jCisJZWNfYXNuMS5jCisJZWNfZXJyb3IuYworKQorCithZGRfZXhlY3V0YWJsZSgKKwlleGFtcGxlX211bAorCisJZXhhbXBsZV9tdWwuYworKQorCit0YXJnZXRfbGlua19saWJyYXJpZXMoZXhhbXBsZV9tdWwgY3J5cHRvKQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2VjL2VjLmMgYi9jcnlwdG8vZWMvZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjAyMmJjCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2VjL2VjLmMKQEAgLTAsMCArMSw4NzIgQEAKKy8qIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBCb2RvIE1vZWxsZXIgZm9yIHRoZSBPcGVuU1NMIHByb2plY3QuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDUgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRC4KKyAqCisgKiBQb3J0aW9ucyBvZiB0aGUgYXR0YWNoZWQgc29mdHdhcmUgKCJDb250cmlidXRpb24iKSBhcmUgZGV2ZWxvcGVkIGJ5CisgKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuLCBhbmQgYXJlIGNvbnRyaWJ1dGVkIHRvIHRoZSBPcGVuU1NMIHByb2plY3QuCisgKgorICogVGhlIENvbnRyaWJ1dGlvbiBpcyBsaWNlbnNlZCBwdXJzdWFudCB0byB0aGUgT3BlblNTTCBvcGVuIHNvdXJjZQorICogbGljZW5zZSBwcm92aWRlZCBhYm92ZS4KKyAqCisgKiBUaGUgZWxsaXB0aWMgY3VydmUgYmluYXJ5IHBvbHlub21pYWwgc29mdHdhcmUgaXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5CisgKiBTaGV1ZWxpbmcgQ2hhbmcgU2hhbnR6IGFuZCBEb3VnbGFzIFN0ZWJpbGEgb2YgU3VuIE1pY3Jvc3lzdGVtcworICogTGFib3JhdG9yaWVzLiAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9lYy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgorCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworCisvKiBjdXJ2ZV9kYXRhIGNvbnRhaW5zIGRhdGEgYWJvdXQgYSBidWlsdC1pbiBlbGxpcHRpYyBjdXJ2ZS4gKi8KK3N0cnVjdCBjdXJ2ZV9kYXRhIHsKKyAgLyogY29tbWVudCBpcyBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZyBkZXNjcmliaW5nIHRoZSBjdXJ2ZS4gKi8KKyAgY29uc3QgY2hhciAqY29tbWVudDsKKyAgLyogcGFyYW1fbGVuIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIHRvIHN0b3JlIGEgZmllbGQgZWxlbWVudC4gKi8KKyAgdWludDhfdCBwYXJhbV9sZW47CisgIC8qIGNvZmFjdG9yIGlzIHRoZSBjb2ZhY3RvciBvZiB0aGUgZ3JvdXAgKGkuZS4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUKKyAgICogZ3JvdXAgZGl2aWRlZCBieSB0aGUgc2l6ZSBvZiB0aGUgbWFpbiBzdWJncm91cC4gKi8KKyAgdWludDhfdCBjb2ZhY3RvcjsgLyogcHJvbW90ZWQgdG8gQk5fVUxPTkcgKi8KKyAgLyogZGF0YSBwb2ludHMgdG8gYW4gYXJyYXkgb2YgNip8cGFyYW1fbGVufCBieXRlcyB3aGljaCBob2xkIHRoZSBmaWVsZAorICAgKiBlbGVtZW50cyBvZiB0aGUgZm9sbG93aW5nIChpbiBiaWctZW5kaWFuIG9yZGVyKTogcHJpbWUsIGEsIGIsIGdlbmVyYXRvciB4LAorICAgKiBnZW5lcmF0b3IgeSwgb3JkZXIuICovCisgIGNvbnN0IHVpbnQ4X3QgZGF0YVtdOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjdXJ2ZV9kYXRhIFAyMjQgPSB7CisgICAgIk5JU1QgUC0yMjQiLAorICAgIDI4LAorICAgIDEsCisgICAgey8qIHAgKi8KKyAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwKKyAgICAgLyogYSAqLworICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgICAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgICAweEZGLCAweEZGLCAweEZGLCAweEZFLAorICAgICAvKiBiICovCisgICAgIDB4QjQsIDB4MDUsIDB4MEEsIDB4ODUsIDB4MEMsIDB4MDQsIDB4QjMsIDB4QUIsIDB4RjUsIDB4NDEsIDB4MzIsIDB4NTYsCisgICAgIDB4NTAsIDB4NDQsIDB4QjAsIDB4QjcsIDB4RDcsIDB4QkYsIDB4RDgsIDB4QkEsIDB4MjcsIDB4MEIsIDB4MzksIDB4NDMsCisgICAgIDB4MjMsIDB4NTUsIDB4RkYsIDB4QjQsCisgICAgIC8qIHggKi8KKyAgICAgMHhCNywgMHgwRSwgMHgwQywgMHhCRCwgMHg2QiwgMHhCNCwgMHhCRiwgMHg3RiwgMHgzMiwgMHgxMywgMHg5MCwgMHhCOSwKKyAgICAgMHg0QSwgMHgwMywgMHhDMSwgMHhEMywgMHg1NiwgMHhDMiwgMHgxMSwgMHgyMiwgMHgzNCwgMHgzMiwgMHg4MCwgMHhENiwKKyAgICAgMHgxMSwgMHg1QywgMHgxRCwgMHgyMSwKKyAgICAgLyogeSAqLworICAgICAweGJkLCAweDM3LCAweDYzLCAweDg4LCAweGI1LCAweGY3LCAweDIzLCAweGZiLCAweDRjLCAweDIyLCAweGRmLCAweGU2LAorICAgICAweGNkLCAweDQzLCAweDc1LCAweGEwLCAweDVhLCAweDA3LCAweDQ3LCAweDY0LCAweDQ0LCAweGQ1LCAweDgxLCAweDk5LAorICAgICAweDg1LCAweDAwLCAweDdlLCAweDM0LAorICAgICAvKiBvcmRlciAqLworICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgICAweEZGLCAweEZGLCAweDE2LCAweEEyLCAweEUwLCAweEI4LCAweEYwLCAweDNFLCAweDEzLCAweERELCAweDI5LCAweDQ1LAorICAgICAweDVDLCAweDVDLCAweDJBLCAweDNELAorICAgIH19OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGN1cnZlX2RhdGEgUDI1NiA9IHsKKyAgICAiTklTVCBQLTI1NiIsCisgICAgMzIsCisgICAgMSwKKyAgICB7LyogcCAqLworICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgICAvKiBhICovCisgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkMsCisgICAgIC8qIGIgKi8KKyAgICAgMHg1QSwgMHhDNiwgMHgzNSwgMHhEOCwgMHhBQSwgMHgzQSwgMHg5MywgMHhFNywgMHhCMywgMHhFQiwgMHhCRCwgMHg1NSwKKyAgICAgMHg3NiwgMHg5OCwgMHg4NiwgMHhCQywgMHg2NSwgMHgxRCwgMHgwNiwgMHhCMCwgMHhDQywgMHg1MywgMHhCMCwgMHhGNiwKKyAgICAgMHgzQiwgMHhDRSwgMHgzQywgMHgzRSwgMHgyNywgMHhEMiwgMHg2MCwgMHg0QiwKKyAgICAgLyogeCAqLworICAgICAweDZCLCAweDE3LCAweEQxLCAweEYyLCAweEUxLCAweDJDLCAweDQyLCAweDQ3LCAweEY4LCAweEJDLCAweEU2LCAweEU1LAorICAgICAweDYzLCAweEE0LCAweDQwLCAweEYyLCAweDc3LCAweDAzLCAweDdELCAweDgxLCAweDJELCAweEVCLCAweDMzLCAweEEwLAorICAgICAweEY0LCAweEExLCAweDM5LCAweDQ1LCAweEQ4LCAweDk4LCAweEMyLCAweDk2LAorICAgICAvKiB5ICovCisgICAgIDB4NGYsIDB4ZTMsIDB4NDIsIDB4ZTIsIDB4ZmUsIDB4MWEsIDB4N2YsIDB4OWIsIDB4OGUsIDB4ZTcsIDB4ZWIsIDB4NGEsCisgICAgIDB4N2MsIDB4MGYsIDB4OWUsIDB4MTYsIDB4MmIsIDB4Y2UsIDB4MzMsIDB4NTcsIDB4NmIsIDB4MzEsIDB4NWUsIDB4Y2UsCisgICAgIDB4Y2IsIDB4YjYsIDB4NDAsIDB4NjgsIDB4MzcsIDB4YmYsIDB4NTEsIDB4ZjUsCisgICAgIC8qIG9yZGVyICovCisgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkMsIDB4RTYsIDB4RkEsIDB4QUQsIDB4QTcsIDB4MTcsIDB4OUUsIDB4ODQsCisgICAgIDB4RjMsIDB4QjksIDB4Q0EsIDB4QzIsIDB4RkMsIDB4NjMsIDB4MjUsIDB4NTF9fTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjdXJ2ZV9kYXRhIFAzODQgPSB7CisgICAgIk5JU1QgUC0zODQiLAorICAgIDQ4LAorICAgIDEsCisgICAgey8qIHAgKi8KKyAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAgLyogYSAqLworICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweEZGLCAweEZDLAorICAgICAvKiBiICovCisgICAgIDB4QjMsIDB4MzEsIDB4MkYsIDB4QTcsIDB4RTIsIDB4M0UsIDB4RTcsIDB4RTQsIDB4OTgsIDB4OEUsIDB4MDUsIDB4NkIsCisgICAgIDB4RTMsIDB4RjgsIDB4MkQsIDB4MTksIDB4MTgsIDB4MUQsIDB4OUMsIDB4NkUsIDB4RkUsIDB4ODEsIDB4NDEsIDB4MTIsCisgICAgIDB4MDMsIDB4MTQsIDB4MDgsIDB4OEYsIDB4NTAsIDB4MTMsIDB4ODcsIDB4NUEsIDB4QzYsIDB4NTYsIDB4MzksIDB4OEQsCisgICAgIDB4OEEsIDB4MkUsIDB4RDEsIDB4OUQsIDB4MkEsIDB4ODUsIDB4QzgsIDB4RUQsIDB4RDMsIDB4RUMsIDB4MkEsIDB4RUYsCisgICAgIC8qIHggKi8KKyAgICAgMHhBQSwgMHg4NywgMHhDQSwgMHgyMiwgMHhCRSwgMHg4QiwgMHgwNSwgMHgzNywgMHg4RSwgMHhCMSwgMHhDNywgMHgxRSwKKyAgICAgMHhGMywgMHgyMCwgMHhBRCwgMHg3NCwgMHg2RSwgMHgxRCwgMHgzQiwgMHg2MiwgMHg4QiwgMHhBNywgMHg5QiwgMHg5OCwKKyAgICAgMHg1OSwgMHhGNywgMHg0MSwgMHhFMCwgMHg4MiwgMHg1NCwgMHgyQSwgMHgzOCwgMHg1NSwgMHgwMiwgMHhGMiwgMHg1RCwKKyAgICAgMHhCRiwgMHg1NSwgMHgyOSwgMHg2QywgMHgzQSwgMHg1NCwgMHg1RSwgMHgzOCwgMHg3MiwgMHg3NiwgMHgwQSwgMHhCNywKKyAgICAgLyogeSAqLworICAgICAweDM2LCAweDE3LCAweGRlLCAweDRhLCAweDk2LCAweDI2LCAweDJjLCAweDZmLCAweDVkLCAweDllLCAweDk4LCAweGJmLAorICAgICAweDkyLCAweDkyLCAweGRjLCAweDI5LCAweGY4LCAweGY0LCAweDFkLCAweGJkLCAweDI4LCAweDlhLCAweDE0LCAweDdjLAorICAgICAweGU5LCAweGRhLCAweDMxLCAweDEzLCAweGI1LCAweGYwLCAweGI4LCAweGMwLCAweDBhLCAweDYwLCAweGIxLCAweGNlLAorICAgICAweDFkLCAweDdlLCAweDgxLCAweDlkLCAweDdhLCAweDQzLCAweDFkLCAweDdjLCAweDkwLCAweGVhLCAweDBlLCAweDVmLAorICAgICAvKiBvcmRlciAqLworICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgICAweEM3LCAweDYzLCAweDRELCAweDgxLCAweEY0LCAweDM3LCAweDJELCAweERGLCAweDU4LCAweDFBLCAweDBELCAweEIyLAorICAgICAweDQ4LCAweEIwLCAweEE3LCAweDdBLCAweEVDLCAweEVDLCAweDE5LCAweDZBLCAweENDLCAweEM1LCAweDI5LCAweDczfX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3VydmVfZGF0YSBQNTIxID0geworICAgICJOSVNUIFAtNTIxIiwKKyAgICA2NiwKKyAgICAxLAorICAgIHsvKiBwICovCisgICAgIDB4MDEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgIC8qIGEgKi8KKyAgICAgMHgwMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQywKKyAgICAgLyogYiAqLworICAgICAweDAwLCAweDUxLCAweDk1LCAweDNFLCAweEI5LCAweDYxLCAweDhFLCAweDFDLCAweDlBLCAweDFGLCAweDkyLCAweDlBLAorICAgICAweDIxLCAweEEwLCAweEI2LCAweDg1LCAweDQwLCAweEVFLCAweEEyLCAweERBLCAweDcyLCAweDVCLCAweDk5LCAweEIzLAorICAgICAweDE1LCAweEYzLCAweEI4LCAweEI0LCAweDg5LCAweDkxLCAweDhFLCAweEYxLCAweDA5LCAweEUxLCAweDU2LCAweDE5LAorICAgICAweDM5LCAweDUxLCAweEVDLCAweDdFLCAweDkzLCAweDdCLCAweDE2LCAweDUyLCAweEMwLCAweEJELCAweDNCLCAweEIxLAorICAgICAweEJGLCAweDA3LCAweDM1LCAweDczLCAweERGLCAweDg4LCAweDNELCAweDJDLCAweDM0LCAweEYxLCAweEVGLCAweDQ1LAorICAgICAweDFGLCAweEQ0LCAweDZCLCAweDUwLCAweDNGLCAweDAwLAorICAgICAvKiB4ICovCisgICAgIDB4MDAsIDB4QzYsIDB4ODUsIDB4OEUsIDB4MDYsIDB4QjcsIDB4MDQsIDB4MDQsIDB4RTksIDB4Q0QsIDB4OUUsIDB4M0UsCisgICAgIDB4Q0IsIDB4NjYsIDB4MjMsIDB4OTUsIDB4QjQsIDB4NDIsIDB4OUMsIDB4NjQsIDB4ODEsIDB4MzksIDB4MDUsIDB4M0YsCisgICAgIDB4QjUsIDB4MjEsIDB4RjgsIDB4MjgsIDB4QUYsIDB4NjAsIDB4NkIsIDB4NEQsIDB4M0QsIDB4QkEsIDB4QTEsIDB4NEIsCisgICAgIDB4NUUsIDB4NzcsIDB4RUYsIDB4RTcsIDB4NTksIDB4MjgsIDB4RkUsIDB4MUQsIDB4QzEsIDB4MjcsIDB4QTIsIDB4RkYsCisgICAgIDB4QTgsIDB4REUsIDB4MzMsIDB4NDgsIDB4QjMsIDB4QzEsIDB4ODUsIDB4NkEsIDB4NDIsIDB4OUIsIDB4RjksIDB4N0UsCisgICAgIDB4N0UsIDB4MzEsIDB4QzIsIDB4RTUsIDB4QkQsIDB4NjYsCisgICAgIC8qIHkgKi8KKyAgICAgMHgwMSwgMHgxOCwgMHgzOSwgMHgyOSwgMHg2YSwgMHg3OCwgMHg5YSwgMHgzYiwgMHhjMCwgMHgwNCwgMHg1YywgMHg4YSwKKyAgICAgMHg1ZiwgMHhiNCwgMHgyYywgMHg3ZCwgMHgxYiwgMHhkOSwgMHg5OCwgMHhmNSwgMHg0NCwgMHg0OSwgMHg1NywgMHg5YiwKKyAgICAgMHg0NCwgMHg2OCwgMHgxNywgMHhhZiwgMHhiZCwgMHgxNywgMHgyNywgMHgzZSwgMHg2NiwgMHgyYywgMHg5NywgMHhlZSwKKyAgICAgMHg3MiwgMHg5OSwgMHg1ZSwgMHhmNCwgMHgyNiwgMHg0MCwgMHhjNSwgMHg1MCwgMHhiOSwgMHgwMSwgMHgzZiwgMHhhZCwKKyAgICAgMHgwNywgMHg2MSwgMHgzNSwgMHgzYywgMHg3MCwgMHg4NiwgMHhhMiwgMHg3MiwgMHhjMiwgMHg0MCwgMHg4OCwgMHhiZSwKKyAgICAgMHg5NCwgMHg3NiwgMHg5ZiwgMHhkMSwgMHg2NiwgMHg1MCwKKyAgICAgLyogb3JkZXIgKi8KKyAgICAgMHgwMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQSwgMHg1MSwgMHg4NiwKKyAgICAgMHg4NywgMHg4MywgMHhCRiwgMHgyRiwgMHg5NiwgMHg2QiwgMHg3RiwgMHhDQywgMHgwMSwgMHg0OCwgMHhGNywgMHgwOSwKKyAgICAgMHhBNSwgMHhEMCwgMHgzQiwgMHhCNSwgMHhDOSwgMHhCOCwgMHg4OSwgMHg5QywgMHg0NywgMHhBRSwgMHhCQiwgMHg2RiwKKyAgICAgMHhCNywgMHgxRSwgMHg5MSwgMHgzOCwgMHg2NCwgMHgwOX19OworCitzdHJ1Y3QgYnVpbHRfaW5fY3VydmUgeworICBpbnQgbmlkOworICBjb25zdCBzdHJ1Y3QgY3VydmVfZGF0YSAqZGF0YTsKKyAgY29uc3QgRUNfTUVUSE9EICooKm1ldGhvZCkodm9pZCk7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGJ1aWx0X2luX2N1cnZlIGJ1aWx0X2luX2N1cnZlc1tdID0geworICB7TklEX3NlY3AyMjRyMSwgJlAyMjQsIDB9LAorICB7TklEX1g5XzYyX3ByaW1lMjU2djEsICZQMjU2LCAwfSwKKyAge05JRF9zZWNwMzg0cjEsICZQMzg0LCAwfSwKKyAge05JRF9zZWNwNTIxcjEsICZQNTIxLCAwfSwKKyAge05JRF91bmRlZiwgMCwgMH0sCit9OworCitFQ19HUk9VUCAqZWNfZ3JvdXBfbmV3KGNvbnN0IEVDX01FVEhPRCAqbWV0aCkgeworICBFQ19HUk9VUCAqcmV0OworCisgIGlmIChtZXRoID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfZ3JvdXBfbmV3LCBFQ19SX1NMT1RfRlVMTCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBpZiAobWV0aC0+Z3JvdXBfaW5pdCA9PSAwKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX2dyb3VwX25ldywgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJldCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihFQ19HUk9VUCkpOworICBpZiAocmV0ID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfZ3JvdXBfbmV3LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgbWVtc2V0KHJldCwgMCwgc2l6ZW9mKEVDX0dST1VQKSk7CisKKyAgcmV0LT5tZXRoID0gbWV0aDsKKyAgQk5faW5pdCgmcmV0LT5vcmRlcik7CisgIEJOX2luaXQoJnJldC0+Y29mYWN0b3IpOworICByZXQtPmFzbjFfZm9ybSA9IFBPSU5UX0NPTlZFUlNJT05fVU5DT01QUkVTU0VEOworCisgIGlmICghbWV0aC0+Z3JvdXBfaW5pdChyZXQpKSB7CisgICAgT1BFTlNTTF9mcmVlKHJldCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgRUNfR1JPVVAgKmVjX2dyb3VwX25ld19jdXJ2ZV9HRnAoY29uc3QgQklHTlVNICpwLCBjb25zdCBCSUdOVU0gKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQklHTlVNICpiLCBCTl9DVFggKmN0eCkgeworICBjb25zdCBFQ19NRVRIT0QgKm1ldGggPSBFQ19HRnBfbW9udF9tZXRob2QoKTsKKyAgRUNfR1JPVVAgKnJldDsKKworICByZXQgPSBlY19ncm91cF9uZXcobWV0aCk7CisgIGlmIChyZXQgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYgKHJldC0+bWV0aC0+Z3JvdXBfc2V0X2N1cnZlID09IDApIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfZ3JvdXBfbmV3X2N1cnZlX0dGcCwKKyAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworICAgIHJldHVybiAwOworICB9CisgIGlmICghcmV0LT5tZXRoLT5ncm91cF9zZXRfY3VydmUocmV0LCBwLCBhLCBiLCBjdHgpKSB7CisgICAgRUNfR1JPVVBfZnJlZShyZXQpOworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBFQ19HUk9VUCAqZWNfZ3JvdXBfbmV3X2Zyb21fZGF0YShjb25zdCBzdHJ1Y3QgYnVpbHRfaW5fY3VydmUgKmN1cnZlKSB7CisgIEVDX0dST1VQICpncm91cCA9IE5VTEw7CisgIEVDX1BPSU5UICpQID0gTlVMTDsKKyAgQk5fQ1RYICpjdHggPSBOVUxMOworICBCSUdOVU0gKnAgPSBOVUxMLCAqYSA9IE5VTEwsICpiID0gTlVMTCwgKnggPSBOVUxMLCAqeSA9IE5VTEwsICpvcmRlciA9IE5VTEw7CisgIGludCBvayA9IDA7CisgIHVuc2lnbmVkIHBhcmFtX2xlbjsKKyAgY29uc3QgRUNfTUVUSE9EICptZXRoOworICBjb25zdCBzdHJ1Y3QgY3VydmVfZGF0YSAqZGF0YTsKKyAgY29uc3QgdWludDhfdCAqcGFyYW1zOworCisgIGlmICgoY3R4ID0gQk5fQ1RYX25ldygpKSA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX2dyb3VwX25ld19mcm9tX2RhdGEsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGRhdGEgPSBjdXJ2ZS0+ZGF0YTsKKyAgcGFyYW1fbGVuID0gZGF0YS0+cGFyYW1fbGVuOworICBwYXJhbXMgPSBkYXRhLT5kYXRhOworCisgIGlmICghKHAgPSBCTl9iaW4yYm4ocGFyYW1zICsgMCAqIHBhcmFtX2xlbiwgcGFyYW1fbGVuLCBOVUxMKSkgfHwKKyAgICAgICEoYSA9IEJOX2JpbjJibihwYXJhbXMgKyAxICogcGFyYW1fbGVuLCBwYXJhbV9sZW4sIE5VTEwpKSB8fAorICAgICAgIShiID0gQk5fYmluMmJuKHBhcmFtcyArIDIgKiBwYXJhbV9sZW4sIHBhcmFtX2xlbiwgTlVMTCkpKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX2dyb3VwX25ld19mcm9tX2RhdGEsIEVSUl9SX0JOX0xJQik7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAoY3VydmUtPm1ldGhvZCAhPSAwKSB7CisgICAgbWV0aCA9IGN1cnZlLT5tZXRob2QoKTsKKyAgICBpZiAoKChncm91cCA9IGVjX2dyb3VwX25ldyhtZXRoKSkgPT0gTlVMTCkgfHwKKyAgICAgICAgKCEoZ3JvdXAtPm1ldGgtPmdyb3VwX3NldF9jdXJ2ZShncm91cCwgcCwgYSwgYiwgY3R4KSkpKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfZ3JvdXBfbmV3X2Zyb21fZGF0YSwgRVJSX1JfRUNfTElCKTsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoKGdyb3VwID0gZWNfZ3JvdXBfbmV3X2N1cnZlX0dGcChwLCBhLCBiLCBjdHgpKSA9PSBOVUxMKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfZ3JvdXBfbmV3X2Zyb21fZGF0YSwgRVJSX1JfRUNfTElCKTsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfQorCisgIGlmICgoUCA9IEVDX1BPSU5UX25ldyhncm91cCkpID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfZ3JvdXBfbmV3X2Zyb21fZGF0YSwgRVJSX1JfRUNfTElCKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmICghKHggPSBCTl9iaW4yYm4ocGFyYW1zICsgMyAqIHBhcmFtX2xlbiwgcGFyYW1fbGVuLCBOVUxMKSkgfHwKKyAgICAgICEoeSA9IEJOX2JpbjJibihwYXJhbXMgKyA0ICogcGFyYW1fbGVuLCBwYXJhbV9sZW4sIE5VTEwpKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19ncm91cF9uZXdfZnJvbV9kYXRhLCBFUlJfUl9CTl9MSUIpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKCFFQ19QT0lOVF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcChncm91cCwgUCwgeCwgeSwgY3R4KSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19ncm91cF9uZXdfZnJvbV9kYXRhLCBFUlJfUl9FQ19MSUIpOworICAgIGdvdG8gZXJyOworICB9CisgIGlmICghKG9yZGVyID0gQk5fYmluMmJuKHBhcmFtcyArIDUgKiBwYXJhbV9sZW4sIHBhcmFtX2xlbiwgTlVMTCkpIHx8CisgICAgICAhQk5fc2V0X3dvcmQoeCwgKEJOX1VMT05HKWRhdGEtPmNvZmFjdG9yKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19ncm91cF9uZXdfZnJvbV9kYXRhLCBFUlJfUl9CTl9MSUIpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgZ3JvdXAtPmdlbmVyYXRvciA9IFA7CisgIFAgPSBOVUxMOworICBpZiAoIUJOX2NvcHkoJmdyb3VwLT5vcmRlciwgb3JkZXIpIHx8CisgICAgICAhQk5fc2V0X3dvcmQoJmdyb3VwLT5jb2ZhY3RvciwgKEJOX1VMT05HKWRhdGEtPmNvZmFjdG9yKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19ncm91cF9uZXdfZnJvbV9kYXRhLCBFUlJfUl9CTl9MSUIpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgb2sgPSAxOworCitlcnI6CisgIGlmICghb2spIHsKKyAgICBFQ19HUk9VUF9mcmVlKGdyb3VwKTsKKyAgICBncm91cCA9IE5VTEw7CisgIH0KKyAgaWYgKFApCisgICAgRUNfUE9JTlRfZnJlZShQKTsKKyAgaWYgKGN0eCkKKyAgICBCTl9DVFhfZnJlZShjdHgpOworICBpZiAocCkKKyAgICBCTl9mcmVlKHApOworICBpZiAoYSkKKyAgICBCTl9mcmVlKGEpOworICBpZiAoYikKKyAgICBCTl9mcmVlKGIpOworICBpZiAob3JkZXIpCisgICAgQk5fZnJlZShvcmRlcik7CisgIGlmICh4KQorICAgIEJOX2ZyZWUoeCk7CisgIGlmICh5KQorICAgIEJOX2ZyZWUoeSk7CisgIHJldHVybiBncm91cDsKK30KKworRUNfR1JPVVAgKkVDX0dST1VQX25ld19ieV9jdXJ2ZV9uYW1lKGludCBuaWQpIHsKKyAgdW5zaWduZWQgaTsKKyAgY29uc3Qgc3RydWN0IGJ1aWx0X2luX2N1cnZlICpjdXJ2ZTsKKyAgRUNfR1JPVVAgKnJldCA9IE5VTEw7CisKKyAgZm9yIChpID0gMDsgYnVpbHRfaW5fY3VydmVzW2ldLm5pZCAhPSBOSURfdW5kZWY7IGkrKykgeworICAgIGN1cnZlID0gJmJ1aWx0X2luX2N1cnZlc1tpXTsKKyAgICBpZiAoY3VydmUtPm5pZCA9PSBuaWQpIHsKKyAgICAgIHJldCA9IGVjX2dyb3VwX25ld19mcm9tX2RhdGEoY3VydmUpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKHJldCA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX0dST1VQX25ld19ieV9jdXJ2ZV9uYW1lLCBFQ19SX1VOS05PV05fR1JPVVApOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0LT5jdXJ2ZV9uYW1lID0gbmlkOworICByZXR1cm4gcmV0OworfQorCit2b2lkIEVDX0dST1VQX2ZyZWUoRUNfR1JPVVAgKmdyb3VwKSB7CisgIGlmICghZ3JvdXApIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoZ3JvdXAtPm1ldGgtPmdyb3VwX2ZpbmlzaCAhPSAwKSB7CisgICAgZ3JvdXAtPm1ldGgtPmdyb3VwX2ZpbmlzaChncm91cCk7CisgIH0KKworICBlY19wcmVfY29tcF9mcmVlKGdyb3VwLT5wcmVfY29tcCk7CisKKyAgaWYgKGdyb3VwLT5nZW5lcmF0b3IgIT0gTlVMTCkgeworICAgIEVDX1BPSU5UX2ZyZWUoZ3JvdXAtPmdlbmVyYXRvcik7CisgIH0KKyAgQk5fZnJlZSgmZ3JvdXAtPm9yZGVyKTsKKyAgQk5fZnJlZSgmZ3JvdXAtPmNvZmFjdG9yKTsKKworICBPUEVOU1NMX2ZyZWUoZ3JvdXApOworfQorCitpbnQgRUNfR1JPVVBfY29weShFQ19HUk9VUCAqZGVzdCwgY29uc3QgRUNfR1JPVVAgKnNyYykgeworICBpZiAoZGVzdC0+bWV0aC0+Z3JvdXBfY29weSA9PSAwKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX0dST1VQX2NvcHksIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGRlc3QtPm1ldGggIT0gc3JjLT5tZXRoKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX0dST1VQX2NvcHksIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOworICAgIHJldHVybiAwOworICB9CisgIGlmIChkZXN0ID09IHNyYykgeworICAgIHJldHVybiAxOworICB9CisKKyAgZWNfcHJlX2NvbXBfZnJlZShkZXN0LT5wcmVfY29tcCk7CisgIGRlc3QtPnByZV9jb21wID0gZWNfcHJlX2NvbXBfZHVwKHNyYy0+cHJlX2NvbXApOworCisgIGlmIChzcmMtPmdlbmVyYXRvciAhPSBOVUxMKSB7CisgICAgaWYgKGRlc3QtPmdlbmVyYXRvciA9PSBOVUxMKSB7CisgICAgICBkZXN0LT5nZW5lcmF0b3IgPSBFQ19QT0lOVF9uZXcoZGVzdCk7CisgICAgICBpZiAoZGVzdC0+Z2VuZXJhdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfQorICAgIGlmICghRUNfUE9JTlRfY29weShkZXN0LT5nZW5lcmF0b3IsIHNyYy0+Z2VuZXJhdG9yKSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIHNyYy0+Z2VuZXJhdG9yID09IE5VTEwgKi8KKyAgICBpZiAoZGVzdC0+Z2VuZXJhdG9yICE9IE5VTEwpIHsKKyAgICAgIEVDX1BPSU5UX2NsZWFyX2ZyZWUoZGVzdC0+Z2VuZXJhdG9yKTsKKyAgICAgIGRlc3QtPmdlbmVyYXRvciA9IE5VTEw7CisgICAgfQorICB9CisKKyAgaWYgKCFCTl9jb3B5KCZkZXN0LT5vcmRlciwgJnNyYy0+b3JkZXIpIHx8CisgICAgICAhQk5fY29weSgmZGVzdC0+Y29mYWN0b3IsICZzcmMtPmNvZmFjdG9yKSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgZGVzdC0+Y3VydmVfbmFtZSA9IHNyYy0+Y3VydmVfbmFtZTsKKyAgZGVzdC0+YXNuMV9mb3JtID0gc3JjLT5hc24xX2Zvcm07CisKKyAgcmV0dXJuIGRlc3QtPm1ldGgtPmdyb3VwX2NvcHkoZGVzdCwgc3JjKTsKK30KKworRUNfR1JPVVAgKkVDX0dST1VQX2R1cChjb25zdCBFQ19HUk9VUCAqYSkgeworICBFQ19HUk9VUCAqdCA9IE5VTEw7CisgIGludCBvayA9IDA7CisKKyAgaWYgKGEgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgdCA9IGVjX2dyb3VwX25ldyhhLT5tZXRoKTsKKyAgaWYgKHQgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmICghRUNfR1JPVVBfY29weSh0LCBhKSkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgb2sgPSAxOworCitlcnI6CisgIGlmICghb2spIHsKKyAgICBpZiAodCkgeworICAgICAgRUNfR1JPVVBfZnJlZSh0KTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHQ7CisgIH0KK30KKworaW50IEVDX0dST1VQX2NtcChjb25zdCBFQ19HUk9VUCAqYSwgY29uc3QgRUNfR1JPVVAgKmIpIHsKKyAgaWYgKGEtPmN1cnZlX25hbWUgPT0gTklEX3VuZGVmIHx8IGItPmN1cnZlX25hbWUgPT0gTklEX3VuZGVmKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIGEtPmN1cnZlX25hbWUgPT0gYi0+Y3VydmVfbmFtZTsKK30KKworY29uc3QgRUNfUE9JTlQgKkVDX0dST1VQX2dldDBfZ2VuZXJhdG9yKGNvbnN0IEVDX0dST1VQICpncm91cCkgeworICByZXR1cm4gZ3JvdXAtPmdlbmVyYXRvcjsKK30KKworaW50IEVDX0dST1VQX2dldF9vcmRlcihjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEJJR05VTSAqb3JkZXIsIEJOX0NUWCAqY3R4KSB7CisgIGlmICghQk5fY29weShvcmRlciwgJmdyb3VwLT5vcmRlcikpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiAhQk5faXNfemVybyhvcmRlcik7Cit9CisKK2ludCBFQ19HUk9VUF9nZXRfY29mYWN0b3IoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBCSUdOVU0gKmNvZmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCTl9DVFggKmN0eCkgeworICBpZiAoIUJOX2NvcHkoY29mYWN0b3IsICZncm91cC0+Y29mYWN0b3IpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICByZXR1cm4gIUJOX2lzX3plcm8oJmdyb3VwLT5jb2ZhY3Rvcik7Cit9CisKK2ludCBFQ19HUk9VUF9nZXRfY3VydmVfbmFtZShjb25zdCBFQ19HUk9VUCAqZ3JvdXApIHsgcmV0dXJuIGdyb3VwLT5jdXJ2ZV9uYW1lOyB9CisKK2ludCBFQ19HUk9VUF9nZXRfZGVncmVlKGNvbnN0IEVDX0dST1VQICpncm91cCkgeworICBpZiAoZ3JvdXAtPm1ldGgtPmdyb3VwX2dldF9kZWdyZWUgPT0gMCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19HUk9VUF9nZXRfZGVncmVlLAorICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIGdyb3VwLT5tZXRoLT5ncm91cF9nZXRfZGVncmVlKGdyb3VwKTsKK30KKwordm9pZCBFQ19HUk9VUF9zZXRfcG9pbnRfY29udmVyc2lvbl9mb3JtKEVDX0dST1VQICpncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9jb252ZXJzaW9uX2Zvcm1fdCBmb3JtKSB7CisgIGdyb3VwLT5hc24xX2Zvcm0gPSBmb3JtOworfQorCitpbnQgRUNfR1JPVVBfcHJlY29tcHV0ZV9tdWx0KEVDX0dST1VQICpncm91cCwgQk5fQ1RYICpjdHgpIHsKKyAgaWYgKGdyb3VwLT5tZXRoLT5tdWwgPT0gMCkgeworICAgIC8qIHVzZSBkZWZhdWx0ICovCisgICAgcmV0dXJuIGVjX3dOQUZfcHJlY29tcHV0ZV9tdWx0KGdyb3VwLCBjdHgpOworICB9CisKKyAgaWYgKGdyb3VwLT5tZXRoLT5wcmVjb21wdXRlX211bHQgIT0gMCkgeworICAgIHJldHVybiBncm91cC0+bWV0aC0+cHJlY29tcHV0ZV9tdWx0KGdyb3VwLCBjdHgpOworICB9CisKKyAgcmV0dXJuIDE7IC8qIG5vdGhpbmcgdG8gZG8sIHNvIHJlcG9ydCBzdWNjZXNzICovCit9CisKK2ludCBFQ19HUk9VUF9oYXZlX3ByZWNvbXB1dGVfbXVsdChjb25zdCBFQ19HUk9VUCAqZ3JvdXApIHsKKyAgaWYgKGdyb3VwLT5tZXRoLT5tdWwgPT0gMCkgeworICAgIC8qIHVzZSBkZWZhdWx0ICovCisgICAgcmV0dXJuIGVjX3dOQUZfaGF2ZV9wcmVjb21wdXRlX211bHQoZ3JvdXApOworICB9CisKKyAgaWYgKGdyb3VwLT5tZXRoLT5oYXZlX3ByZWNvbXB1dGVfbXVsdCAhPSAwKSB7CisgICAgcmV0dXJuIGdyb3VwLT5tZXRoLT5oYXZlX3ByZWNvbXB1dGVfbXVsdChncm91cCk7CisgIH0KKworICByZXR1cm4gMDsgLyogY2Fubm90IHRlbGwgd2hldGhlciBwcmVjb21wdXRhdGlvbiBoYXMgYmVlbiBwZXJmb3JtZWQgKi8KK30KKworRUNfUE9JTlQgKkVDX1BPSU5UX25ldyhjb25zdCBFQ19HUk9VUCAqZ3JvdXApIHsKKyAgRUNfUE9JTlQgKnJldDsKKworICBpZiAoZ3JvdXAgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVF9uZXcsIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKGdyb3VwLT5tZXRoLT5wb2ludF9pbml0ID09IDApIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUE9JTlRfbmV3LCBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0ID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mICpyZXQpOworICBpZiAocmV0ID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUE9JTlRfbmV3LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICByZXQtPm1ldGggPSBncm91cC0+bWV0aDsKKworICBpZiAoIXJldC0+bWV0aC0+cG9pbnRfaW5pdChyZXQpKSB7CisgICAgT1BFTlNTTF9mcmVlKHJldCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCit2b2lkIEVDX1BPSU5UX2ZyZWUoRUNfUE9JTlQgKnBvaW50KSB7CisgIGlmICghcG9pbnQpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAocG9pbnQtPm1ldGgtPnBvaW50X2ZpbmlzaCAhPSAwKSB7CisgICAgcG9pbnQtPm1ldGgtPnBvaW50X2ZpbmlzaChwb2ludCk7CisgIH0KKyAgT1BFTlNTTF9mcmVlKHBvaW50KTsKK30KKwordm9pZCBFQ19QT0lOVF9jbGVhcl9mcmVlKEVDX1BPSU5UICpwb2ludCkgeworICBpZiAoIXBvaW50KSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHBvaW50LT5tZXRoLT5wb2ludF9jbGVhcl9maW5pc2ggIT0gMCkgeworICAgIHBvaW50LT5tZXRoLT5wb2ludF9jbGVhcl9maW5pc2gocG9pbnQpOworICB9IGVsc2UgaWYgKHBvaW50LT5tZXRoLT5wb2ludF9maW5pc2ggIT0gMCkgeworICAgIHBvaW50LT5tZXRoLT5wb2ludF9maW5pc2gocG9pbnQpOworICB9CisgIE9QRU5TU0xfY2xlYW5zZShwb2ludCwgc2l6ZW9mICpwb2ludCk7CisgIE9QRU5TU0xfZnJlZShwb2ludCk7Cit9CisKK2ludCBFQ19QT0lOVF9jb3B5KEVDX1BPSU5UICpkZXN0LCBjb25zdCBFQ19QT0lOVCAqc3JjKSB7CisgIGlmIChkZXN0LT5tZXRoLT5wb2ludF9jb3B5ID09IDApIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUE9JTlRfY29weSwgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoZGVzdC0+bWV0aCAhPSBzcmMtPm1ldGgpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUE9JTlRfY29weSwgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGRlc3QgPT0gc3JjKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIGRlc3QtPm1ldGgtPnBvaW50X2NvcHkoZGVzdCwgc3JjKTsKK30KKworRUNfUE9JTlQgKkVDX1BPSU5UX2R1cChjb25zdCBFQ19QT0lOVCAqYSwgY29uc3QgRUNfR1JPVVAgKmdyb3VwKSB7CisgIEVDX1BPSU5UICp0OworICBpbnQgcjsKKworICBpZiAoYSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICB0ID0gRUNfUE9JTlRfbmV3KGdyb3VwKTsKKyAgaWYgKHQgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVF9kdXAsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByID0gRUNfUE9JTlRfY29weSh0LCBhKTsKKyAgaWYgKCFyKSB7CisgICAgRUNfUE9JTlRfZnJlZSh0KTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gdDsKKyAgfQorfQorCitpbnQgRUNfUE9JTlRfc2V0X3RvX2luZmluaXR5KGNvbnN0IEVDX0dST1VQICpncm91cCwgRUNfUE9JTlQgKnBvaW50KSB7CisgIGlmIChncm91cC0+bWV0aC0+cG9pbnRfc2V0X3RvX2luZmluaXR5ID09IDApIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUE9JTlRfc2V0X3RvX2luZmluaXR5LAorICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGdyb3VwLT5tZXRoICE9IHBvaW50LT5tZXRoKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX3NldF90b19pbmZpbml0eSwgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIGdyb3VwLT5tZXRoLT5wb2ludF9zZXRfdG9faW5maW5pdHkoZ3JvdXAsIHBvaW50KTsKK30KKworaW50IEVDX1BPSU5UX2lzX2F0X2luZmluaXR5KGNvbnN0IEVDX0dST1VQICpncm91cCwgY29uc3QgRUNfUE9JTlQgKnBvaW50KSB7CisgIGlmIChncm91cC0+bWV0aC0+aXNfYXRfaW5maW5pdHkgPT0gMCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVF9pc19hdF9pbmZpbml0eSwKKyAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworICAgIHJldHVybiAwOworICB9CisgIGlmIChncm91cC0+bWV0aCAhPSBwb2ludC0+bWV0aCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVF9pc19hdF9pbmZpbml0eSwgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIGdyb3VwLT5tZXRoLT5pc19hdF9pbmZpbml0eShncm91cCwgcG9pbnQpOworfQorCitpbnQgRUNfUE9JTlRfaXNfb25fY3VydmUoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBjb25zdCBFQ19QT0lOVCAqcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQk5fQ1RYICpjdHgpIHsKKyAgaWYgKGdyb3VwLT5tZXRoLT5pc19vbl9jdXJ2ZSA9PSAwKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX2lzX29uX2N1cnZlLAorICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGdyb3VwLT5tZXRoICE9IHBvaW50LT5tZXRoKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX2lzX29uX2N1cnZlLCBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gZ3JvdXAtPm1ldGgtPmlzX29uX2N1cnZlKGdyb3VwLCBwb2ludCwgY3R4KTsKK30KKworaW50IEVDX1BPSU5UX2NtcChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIGNvbnN0IEVDX1BPSU5UICphLCBjb25zdCBFQ19QT0lOVCAqYiwKKyAgICAgICAgICAgICAgICAgQk5fQ1RYICpjdHgpIHsKKyAgaWYgKGdyb3VwLT5tZXRoLT5wb2ludF9jbXAgPT0gMCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVF9jbXAsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmICgoZ3JvdXAtPm1ldGggIT0gYS0+bWV0aCkgfHwgKGEtPm1ldGggIT0gYi0+bWV0aCkpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUE9JTlRfY21wLCBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIGdyb3VwLT5tZXRoLT5wb2ludF9jbXAoZ3JvdXAsIGEsIGIsIGN0eCk7Cit9CisKK2ludCBFQ19QT0lOVF9tYWtlX2FmZmluZShjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEVDX1BPSU5UICpwb2ludCwgQk5fQ1RYICpjdHgpIHsKKyAgaWYgKGdyb3VwLT5tZXRoLT5tYWtlX2FmZmluZSA9PSAwKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX21ha2VfYWZmaW5lLAorICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGdyb3VwLT5tZXRoICE9IHBvaW50LT5tZXRoKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX21ha2VfYWZmaW5lLCBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gZ3JvdXAtPm1ldGgtPm1ha2VfYWZmaW5lKGdyb3VwLCBwb2ludCwgY3R4KTsKK30KKworaW50IEVDX1BPSU5Uc19tYWtlX2FmZmluZShjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIHNpemVfdCBudW0sIEVDX1BPSU5UICpwb2ludHNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk5fQ1RYICpjdHgpIHsKKyAgc2l6ZV90IGk7CisKKyAgaWYgKGdyb3VwLT5tZXRoLT5wb2ludHNfbWFrZV9hZmZpbmUgPT0gMCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVHNfbWFrZV9hZmZpbmUsCisgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKyAgICBpZiAoZ3JvdXAtPm1ldGggIT0gcG9pbnRzW2ldLT5tZXRoKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUE9JTlRzX21ha2VfYWZmaW5lLCBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICByZXR1cm4gZ3JvdXAtPm1ldGgtPnBvaW50c19tYWtlX2FmZmluZShncm91cCwgbnVtLCBwb2ludHMsIGN0eCk7Cit9CisKK2ludCBFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRUNfUE9JTlQgKnBvaW50LCBCSUdOVU0gKngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklHTlVNICp5LCBCTl9DVFggKmN0eCkgeworICBpZiAoZ3JvdXAtPm1ldGgtPnBvaW50X2dldF9hZmZpbmVfY29vcmRpbmF0ZXMgPT0gMCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcCwKKyAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworICAgIHJldHVybiAwOworICB9CisgIGlmIChncm91cC0+bWV0aCAhPSBwb2ludC0+bWV0aCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcCwKKyAgICAgICAgICAgICAgICAgICAgICBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gZ3JvdXAtPm1ldGgtPnBvaW50X2dldF9hZmZpbmVfY29vcmRpbmF0ZXMoZ3JvdXAsIHBvaW50LCB4LCB5LCBjdHgpOworfQorCitpbnQgRUNfUE9JTlRfc2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQklHTlVNICp4LCBjb25zdCBCSUdOVU0gKnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk5fQ1RYICpjdHgpIHsKKyAgaWYgKGdyb3VwLT5tZXRoLT5wb2ludF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzID09IDApIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUE9JTlRfc2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAsCisgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoZ3JvdXAtPm1ldGggIT0gcG9pbnQtPm1ldGgpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUE9JTlRfc2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAsCisgICAgICAgICAgICAgICAgICAgICAgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIGdyb3VwLT5tZXRoLT5wb2ludF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzKGdyb3VwLCBwb2ludCwgeCwgeSwgY3R4KTsKK30KKworaW50IEVDX1BPSU5UX2FkZChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEVDX1BPSU5UICpyLCBjb25zdCBFQ19QT0lOVCAqYSwKKyAgICAgICAgICAgICAgICAgY29uc3QgRUNfUE9JTlQgKmIsIEJOX0NUWCAqY3R4KSB7CisgIGlmIChncm91cC0+bWV0aC0+YWRkID09IDApIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUE9JTlRfYWRkLCBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworICAgIHJldHVybiAwOworICB9CisgIGlmICgoZ3JvdXAtPm1ldGggIT0gci0+bWV0aCkgfHwgKHItPm1ldGggIT0gYS0+bWV0aCkgfHwKKyAgICAgIChhLT5tZXRoICE9IGItPm1ldGgpKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX2FkZCwgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIGdyb3VwLT5tZXRoLT5hZGQoZ3JvdXAsIHIsIGEsIGIsIGN0eCk7Cit9CisKKworaW50IEVDX1BPSU5UX2RibChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEVDX1BPSU5UICpyLCBjb25zdCBFQ19QT0lOVCAqYSwKKyAgICAgICAgICAgICAgICAgQk5fQ1RYICpjdHgpIHsKKyAgaWYgKGdyb3VwLT5tZXRoLT5kYmwgPT0gMCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVF9kYmwsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKChncm91cC0+bWV0aCAhPSByLT5tZXRoKSB8fCAoci0+bWV0aCAhPSBhLT5tZXRoKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVF9kYmwsIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBncm91cC0+bWV0aC0+ZGJsKGdyb3VwLCByLCBhLCBjdHgpOworfQorCisKK2ludCBFQ19QT0lOVF9pbnZlcnQoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqYSwgQk5fQ1RYICpjdHgpIHsKKyAgaWYgKGdyb3VwLT5tZXRoLT5kYmwgPT0gMCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVF9pbnZlcnQsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGdyb3VwLT5tZXRoICE9IGEtPm1ldGgpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUE9JTlRfaW52ZXJ0LCBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gZ3JvdXAtPm1ldGgtPmludmVydChncm91cCwgYSwgY3R4KTsKK30KKworaW50IEVDX1BPSU5UX211bChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEVDX1BPSU5UICpyLCBjb25zdCBCSUdOVU0gKmdfc2NhbGFyLAorICAgICAgICAgICAgICAgICBjb25zdCBFQ19QT0lOVCAqcG9pbnQsIGNvbnN0IEJJR05VTSAqcF9zY2FsYXIsIEJOX0NUWCAqY3R4KSB7CisgIC8qIGp1c3QgYSBjb252ZW5pZW50IGludGVyZmFjZSB0byBFQ19QT0lOVHNfbXVsKCkgKi8KKworICBjb25zdCBFQ19QT0lOVCAqcG9pbnRzWzFdOworICBjb25zdCBCSUdOVU0gKnNjYWxhcnNbMV07CisKKyAgcG9pbnRzWzBdID0gcG9pbnQ7CisgIHNjYWxhcnNbMF0gPSBwX3NjYWxhcjsKKworICByZXR1cm4gRUNfUE9JTlRzX211bChncm91cCwgciwgZ19zY2FsYXIsIChwb2ludCAhPSBOVUxMICYmIHBfc2NhbGFyICE9IE5VTEwpLAorICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMsIHNjYWxhcnMsIGN0eCk7Cit9CisKK2ludCBFQ19QT0lOVHNfbXVsKGNvbnN0IEVDX0dST1VQICpncm91cCwgRUNfUE9JTlQgKnIsIGNvbnN0IEJJR05VTSAqc2NhbGFyLAorICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bSwgY29uc3QgRUNfUE9JTlQgKnBvaW50c1tdLCBjb25zdCBCSUdOVU0gKnNjYWxhcnNbXSwKKyAgICAgICAgICAgICAgICAgIEJOX0NUWCAqY3R4KSB7CisgIGlmIChncm91cC0+bWV0aC0+bXVsID09IDApIHsKKyAgICAvKiB1c2UgZGVmYXVsdC4gV2FybmluZywgbm90IGNvbnN0YW50LXRpbWUuICovCisgICAgcmV0dXJuIGVjX3dOQUZfbXVsKGdyb3VwLCByLCBzY2FsYXIsIG51bSwgcG9pbnRzLCBzY2FsYXJzLCBjdHgpOworICB9CisKKyAgcmV0dXJuIGdyb3VwLT5tZXRoLT5tdWwoZ3JvdXAsIHIsIHNjYWxhciwgbnVtLCBwb2ludHMsIHNjYWxhcnMsIGN0eCk7Cit9CisKK2ludCBlY19wb2ludF9zZXRfSnByb2plY3RpdmVfY29vcmRpbmF0ZXNfR0ZwKGNvbnN0IEVDX0dST1VQICpncm91cCwgRUNfUE9JTlQgKnBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQklHTlVNICp4LCBjb25zdCBCSUdOVU0gKnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCSUdOVU0gKnosIEJOX0NUWCAqY3R4KSB7CisgIGlmIChncm91cC0+bWV0aC0+cG9pbnRfc2V0X0pwcm9qZWN0aXZlX2Nvb3JkaW5hdGVzX0dGcCA9PSAwKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX3BvaW50X3NldF9KcHJvamVjdGl2ZV9jb29yZGluYXRlc19HRnAsCisgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoZ3JvdXAtPm1ldGggIT0gcG9pbnQtPm1ldGgpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfcG9pbnRfc2V0X0pwcm9qZWN0aXZlX2Nvb3JkaW5hdGVzX0dGcCwKKyAgICAgICAgICAgICAgICAgICAgICBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gZ3JvdXAtPm1ldGgtPnBvaW50X3NldF9KcHJvamVjdGl2ZV9jb29yZGluYXRlc19HRnAoZ3JvdXAsIHBvaW50LCB4LCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiwgY3R4KTsKK30KZGlmZiAtLWdpdCBhL2NyeXB0by9lYy9lYy5oIGIvY3J5cHRvL2VjL2VjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY4NDMyZQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9lYy9lYy5oCkBAIC0wLDAgKzEsMzY3IEBACisvKiBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQm9kbyBNb2VsbGVyIGZvciB0aGUgT3BlblNTTCBwcm9qZWN0LgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA1IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFMTCBSSUdIVFMgUkVTRVJWRUQuCisgKgorICogUG9ydGlvbnMgb2YgdGhlIGF0dGFjaGVkIHNvZnR3YXJlICgiQ29udHJpYnV0aW9uIikgYXJlIGRldmVsb3BlZCBieQorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiwgYW5kIGFyZSBjb250cmlidXRlZCB0byB0aGUgT3BlblNTTCBwcm9qZWN0LgorICoKKyAqIFRoZSBDb250cmlidXRpb24gaXMgbGljZW5zZWQgcHVyc3VhbnQgdG8gdGhlIE9wZW5TU0wgb3BlbiBzb3VyY2UKKyAqIGxpY2Vuc2UgcHJvdmlkZWQgYWJvdmUuCisgKgorICogVGhlIGVsbGlwdGljIGN1cnZlIGJpbmFyeSBwb2x5bm9taWFsIHNvZnR3YXJlIGlzIG9yaWdpbmFsbHkgd3JpdHRlbiBieQorICogU2hldWVsaW5nIENoYW5nIFNoYW50eiBhbmQgRG91Z2xhcyBTdGViaWxhIG9mIFN1biBNaWNyb3N5c3RlbXMKKyAqIExhYm9yYXRvcmllcy4gKi8KKworI2lmbmRlZiBPUEVOU1NMX0hFQURFUl9FQ19ICisjZGVmaW5lIE9QRU5TU0xfSEVBREVSX0VDX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvYmFzZS5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKwordHlwZWRlZiBzdHJ1Y3QgZWNfZ3JvdXBfc3QgRUNfR1JPVVA7Cit0eXBlZGVmIHN0cnVjdCBlY19wb2ludF9zdCBFQ19QT0lOVDsKKworLyoqIEVudW0gZm9yIHRoZSBwb2ludCBjb252ZXJzaW9uIGZvcm0gYXMgZGVmaW5lZCBpbiBYOS42MiAoRUNEU0EpCisgKiAgZm9yIHRoZSBlbmNvZGluZyBvZiBhIGVsbGlwdGljIGN1cnZlIHBvaW50ICh4LHkpICovCit0eXBlZGVmIGVudW0geworCS8qKiB0aGUgcG9pbnQgaXMgZW5jb2RlZCBhcyB6fHx4LCB3aGVyZSB0aGUgb2N0ZXQgeiBzcGVjaWZpZXMgCisJICogIHdoaWNoIHNvbHV0aW9uIG9mIHRoZSBxdWFkcmF0aWMgZXF1YXRpb24geSBpcyAgKi8KKwlQT0lOVF9DT05WRVJTSU9OX0NPTVBSRVNTRUQgPSAyLAorCS8qKiB0aGUgcG9pbnQgaXMgZW5jb2RlZCBhcyB6fHx4fHx5LCB3aGVyZSB6IGlzIHRoZSBvY3RldCAweDAyICAqLworCVBPSU5UX0NPTlZFUlNJT05fVU5DT01QUkVTU0VEID0gNCwKKwkvKiogdGhlIHBvaW50IGlzIGVuY29kZWQgYXMgenx8eHx8eSwgd2hlcmUgdGhlIG9jdGV0IHogc3BlY2lmaWVzCisgICAgICAgICAqICB3aGljaCBzb2x1dGlvbiBvZiB0aGUgcXVhZHJhdGljIGVxdWF0aW9uIHkgaXMgICovCisJUE9JTlRfQ09OVkVSU0lPTl9IWUJSSUQgPSA2Cit9IHBvaW50X2NvbnZlcnNpb25fZm9ybV90OworCisKKy8qIEVsbGlwdGljIGN1cnZlIGdyb3Vwcy4gKi8KKworLyogRUNfR1JPVVBfbmV3X2J5X2N1cnZlX25hbWUgcmV0dXJucyBhIGZyZXNoIEVDX0dST1VQIG9iamVjdCBmb3IgdGhlIGVsbGlwdGljCisgKiBjdXJ2ZSBzcGVjaWZpZWQgYnkgfG5pZHwsIG9yIE5VTEwgb24gZXJyb3IuCisgKgorICogVGhlIHN1cHBvcnRlZCBOSURzIGFyZToKKyAqICAgTklEX3NlY3AyMjRyMSwKKyAqICAgTklEX1g5XzYyX3ByaW1lMjU2djEsCisgKiAgIE5JRF9zZWNwMzg0cjEsCisgKiAgIE5JRF9zZWNwNTIxcjEgKi8KK0VDX0dST1VQICpFQ19HUk9VUF9uZXdfYnlfY3VydmVfbmFtZShpbnQgbmlkKTsKKworLyogRUNfR1JPVVBfZnJlZSBmcmVlcyB8Z3JvdXB8IGFuZCB0aGUgZGF0YSB0aGF0IGl0IHBvaW50cyB0by4gKi8KK3ZvaWQgRUNfR1JPVVBfZnJlZShFQ19HUk9VUCAqZ3JvdXApOworCisvKiBFQ19HUk9VUF9jb3B5IHNldHMgfCpkZXN0fCBlcXVhbCB0byB8KnNyY3wuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kCisgKiB6ZXJvIG90aGVyd2lzZS4gKi8KK2ludCBFQ19HUk9VUF9jb3B5KEVDX0dST1VQICpkZXN0LCBjb25zdCBFQ19HUk9VUCAqc3JjKTsKKworLyogRUNfR1JPVVBfZHVwIHJldHVybnMgYSBmcmVzaCB8RUNfR1JPVVB8IHdoaWNoIGlzIGVxdWFsIHRvIHxhfCBvciBOVUxMIG9uCisgKiBlcnJvci4gKi8KK0VDX0dST1VQICpFQ19HUk9VUF9kdXAoY29uc3QgRUNfR1JPVVAgKmEpOworCisvKiBFQ19HUk9VUF9jbXAgcmV0dXJucyBvbmUgaWYgfGF8IGFuZCB8YnwgYXJlIHRoZSBzYW1lIGdyb3VwIGFuZCB6ZXJvCisgKiBvdGhlcndpc2UuICovCitpbnQgRUNfR1JPVVBfY21wKGNvbnN0IEVDX0dST1VQICphLCBjb25zdCBFQ19HUk9VUCAqYik7CisKKy8qIEVDX0dST1VQX2dldDBfZ2VuZXJhdG9yIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBpbnRlcm5hbCB8RUNfUE9JTlR8IG9iamVjdAorICogaW4gfGdyb3VwfCB0aGF0IHNwZWNpZmllcyB0aGUgZ2VuZXJhdG9yIGZvciB0aGUgZ3JvdXAuICovCitjb25zdCBFQ19QT0lOVCAqRUNfR1JPVVBfZ2V0MF9nZW5lcmF0b3IoY29uc3QgRUNfR1JPVVAgKmdyb3VwKTsKKworLyogRUNfR1JPVVBfZ2V0X29yZGVyIHNldHMgfCpvcmRlcnwgdG8gdGhlIG9yZGVyIG9mIHxncm91cHwgdXNpbmcgfGN0eHwsIGlmCisgKiBpdCdzIG5vdCBOVUxMLiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG90aGVyd2lzZS4gKi8KK2ludCBFQ19HUk9VUF9nZXRfb3JkZXIoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBCSUdOVU0gKm9yZGVyLCBCTl9DVFggKmN0eCk7CisKKy8qIEVDX0dST1VQX2dldF9jb2ZhY3RvciBzZXRzIHwqY29mYWN0b3J8IHRvIHRoZSBjb2ZhY3RvciBvZiB8Z3JvdXB8IHVzaW5nCisgKiB8Y3R4fCwgaWYgaXQncyBub3QgTlVMTC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvdGhlcndpc2UuICovCitpbnQgRUNfR1JPVVBfZ2V0X2NvZmFjdG9yKGNvbnN0IEVDX0dST1VQICpncm91cCwgQklHTlVNICpjb2ZhY3RvciwgQk5fQ1RYICpjdHgpOworCisvKiBFQ19HUk9VUF9nZXRfY3VydmVfbmFtZSByZXR1cm5zIGEgTklEIHRoYXQgaWRlbnRpZmllcyB8Z3JvdXB8LiAqLworaW50IEVDX0dST1VQX2dldF9jdXJ2ZV9uYW1lKGNvbnN0IEVDX0dST1VQICpncm91cCk7CisKKy8qIEVDX0dST1VQX2dldF9kZWdyZWUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIHRvIHJlcHJlc2VudCBhbgorICogZWxlbWVudCBvZiB0aGUgZmllbGQgdW5kZXJseWluZyB8Z3JvdXB8LiAqLworaW50IEVDX0dST1VQX2dldF9kZWdyZWUoY29uc3QgRUNfR1JPVVAgKmdyb3VwKTsKKworLyogRUNfR1JPVVBfc2V0X3BvaW50X2NvbnZlcnNpb25fZm9ybSBzZXRzIHRoZSBmb3JtIHRoYXQgc2VyaWFsaXNlZCBwb2ludHMgd2lsbAorICogdGFrZSBhcyBvbmUgb2YgdGhlIHxQT0lOVF9DT05WRVJTSU9OXyp8IHZhbHVlcy4gKi8KK3ZvaWQgRUNfR1JPVVBfc2V0X3BvaW50X2NvbnZlcnNpb25fZm9ybShFQ19HUk9VUCAqZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfY29udmVyc2lvbl9mb3JtX3QgZm9ybSk7CisKKy8qIEVDX0dST1VQX3ByZWNvbXB1dGVfbXVsdCBwcmVjb21wdXRlcyBtdWx0aXBsaWVzIG9mIHRoZSBnZW5lcmF0b3IgaW4gb3JkZXIgdG8KKyAqIHNwZWVkIHVwIG9wZXJhdGlvbnMgdGhhdCBpbnZvbHZlIGNhbGN1bGF0aW5nIGdlbmVyYXRvciBtdWx0aXBsZXMuIEl0IHJldHVybnMKKyAqIG9uZSBvbiBzdWNlc3MgYW5kIHplcm8gb3RoZXJ3aXNlLiBJZiB8Y3R4fCBpcyBub3QgTlVMTCwgaXQgbWF5IGJlIHVzZWQuICovCitpbnQgRUNfR1JPVVBfcHJlY29tcHV0ZV9tdWx0KEVDX0dST1VQICpncm91cCwgQk5fQ1RYICpjdHgpOworCisvKiBFQ19HUk9VUF9oYXZlX3ByZWNvbXB1dGVfbXVsdCByZXR1cm5zIG9uZSBpZiB8Z3JvdXB8IGNvbnRhaW5zIHByZWNvbXB1dGVkCisgKiBnZW5lcmF0b3IgbXVsdGlwbGVzLiAqLworaW50IEVDX0dST1VQX2hhdmVfcHJlY29tcHV0ZV9tdWx0KGNvbnN0IEVDX0dST1VQICpncm91cCk7CisKKworLyogUG9pbnRzIG9uIGVsbGlwdGljIGN1cnZlcy4gKi8KKworLyogRUNfUE9JTlRfbmV3IHJldHVybnMgYSBmcmVzaCB8RUNfUE9JTlR8IG9iamVjdCBpbiB0aGUgZ2l2ZW4gZ3JvdXAsIG9yIE5VTEwKKyAqIG9uIGVycm9yLiAqLworRUNfUE9JTlQgKkVDX1BPSU5UX25ldyhjb25zdCBFQ19HUk9VUCAqZ3JvdXApOworCisvKiBFQ19QT0lOVF9mcmVlIGZyZWVzIHxwb2ludHwgYW5kIHRoZSBkYXRhIHRoYXQgaXQgcG9pbnRzIHRvLiAqLwordm9pZCBFQ19QT0lOVF9mcmVlKEVDX1BPSU5UICpwb2ludCk7CisKKy8qIEVDX1BPSU5UX2NsZWFyX2ZyZWUgY2xlYXJzIHRoZSBkYXRhIHRoYXQgfHBvaW50fCBwb2ludHMgdG8sIGZyZWVzIGl0IGFuZAorICogdGhlbiBmcmVlcyB8cG9pbnR8IGl0c2VsZi4gKi8KK3ZvaWQgRUNfUE9JTlRfY2xlYXJfZnJlZShFQ19QT0lOVCAqcG9pbnQpOworCisvKiBFQ19QT0lOVF9jb3B5IHNldHMgfCpkZXN0fCBlcXVhbCB0byB8KnNyY3wuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kCisgKiB6ZXJvIG90aGVyd2lzZS4gKi8KK2ludCBFQ19QT0lOVF9jb3B5KEVDX1BPSU5UICpkZXN0LCBjb25zdCBFQ19QT0lOVCAqc3JjKTsKKworLyogRUNfUE9JTlRfZHVwIHJldHVybnMgYSBmcmVzaCB8RUNfUE9JTlR8IHRoYXQgY29udGFpbnMgdGhlIHNhbWUgdmFsdWVzIGFzCisgKiB8c3JjfCwgb3IgTlVMTCBvbiBlcnJvci4gKi8KK0VDX1BPSU5UICpFQ19QT0lOVF9kdXAoY29uc3QgRUNfUE9JTlQgKnNyYywgY29uc3QgRUNfR1JPVVAgKmdyb3VwKTsKKworLyogRUNfUE9JTlRfc2V0X3RvX2luZmluaXR5IHNldHMgfHBvaW50fCB0byBiZSB0aGUgInBvaW50IGF0IGluZmluaXR5IiBmb3IgdGhlCisgKiBnaXZlbiBncm91cC4gKi8KK2ludCBFQ19QT0lOVF9zZXRfdG9faW5maW5pdHkoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqcG9pbnQpOworCisvKiBFQ19QT0lOVF9pc19hdF9pbmZpbml0eSByZXR1cm5zIG9uZSBpZmYgfHBvaW50fCBpcyB0aGUgcG9pbnQgYXQgaW5maW5pdHkgYW5kCisgKiB6ZXJvIG90aGVyd2lzZS4gKi8KK2ludCBFQ19QT0lOVF9pc19hdF9pbmZpbml0eShjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIGNvbnN0IEVDX1BPSU5UICpwb2ludCk7CisKKy8qIEVDX1BPSU5UX2lzX29uX2N1cnZlIHJldHVybnMgb25lIGlmIHxwb2ludHwgaXMgYW4gZWxlbWVudCBvZiB8Z3JvdXB8IGFuZAorICogemVybyBvdGhlcml3c2UuIElmIHxjdHh8IGlzIG5vbi1OVUxMLCBpdCBtYXkgYmUgdXNlZC4gKi8KK2ludCBFQ19QT0lOVF9pc19vbl9jdXJ2ZShjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIGNvbnN0IEVDX1BPSU5UICpwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCTl9DVFggKmN0eCk7CisKKy8qIEVDX1BPSU5UX2NtcCByZXR1cm5zIHplcm8gaWYgfGF8IGlzIGVxdWFsIHRvIHxifCwgZ3JlYXRlciB0aGFuIHplcm8gaXMKKyAqIG5vbi1lcXVhbCBhbmQgLTEgb24gZXJyb3IuIElmIHxjdHh8IGlzIG5vdCBOVUxMLCBpdCBtYXkgYmUgdXNlZC4gKi8KK2ludCBFQ19QT0lOVF9jbXAoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBjb25zdCBFQ19QT0lOVCAqYSwgY29uc3QgRUNfUE9JTlQgKmIsCisgICAgICAgICAgICAgICAgIEJOX0NUWCAqY3R4KTsKKworLyogRUNfUE9JTlRfbWFrZV9hZmZpbmUgY29udmVydHMgfHBvaW50fCB0byBhZmZpbmUgZm9ybSwgaW50ZXJuYWxseS4gSXQgcmV0dXJucworICogb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb3RoZXJ3aXNlLiBJZiB8Y3R4fCBpcyBub3QgTlVMTCwgaXQgbWF5IGJlIHVzZWQuICovCitpbnQgRUNfUE9JTlRfbWFrZV9hZmZpbmUoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqcG9pbnQsIEJOX0NUWCAqY3R4KTsKKworLyogRUNfUE9JTlRzX21ha2VfYWZmaW5lIGNvbnZlcnRzIHxudW18IHBvaW50cyBmcm9tIHxwb2ludHN8IHRvIGFmZmluZSBmb3JtLAorICogaW50ZXJuYWxseS4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvdGhlcndpc2UuIElmIHxjdHh8IGlzIG5vdAorICogTlVMTCwgaXQgbWF5IGJlIHVzZWQuICovCitpbnQgRUNfUE9JTlRzX21ha2VfYWZmaW5lKGNvbnN0IEVDX0dST1VQICpncm91cCwgc2l6ZV90IG51bSwgRUNfUE9JTlQgKnBvaW50c1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCTl9DVFggKmN0eCk7CisKKworLyogUG9pbnQgY29udmVyc2lvbi4gKi8KKworLyogRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAgc2V0cyB8eHwgYW5kIHx5fCB0byB0aGUgYWZmaW5lIHZhbHVlIG9mCisgKiB8cG9pbnR8IHVzaW5nIHxjdHh8LCBpZiBpdCdzIG5vdCBOVUxMLiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvCisgKiBvdGhlcndpc2UuICovCitpbnQgRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAoY29uc3QgRUNfR1JPVVAgKmdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVDX1BPSU5UICpwb2ludCwgQklHTlVNICp4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJR05VTSAqeSwgQk5fQ1RYICpjdHgpOworCisvKiBFQ19QT0lOVF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzIHNldHMgdGhlIHZhbHVlIG9mIHxwfCB0byBiZSAofHh8LCB8eXwpLiBUaGUKKyAqIHxjdHh8IGFyZ3VtZW50IG1heSBiZSB1c2VkIGlmIG5vdCBOVUxMLiAqLworaW50IEVDX1BPSU5UX3NldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwKGNvbnN0IEVDX0dST1VQICpncm91cCwgRUNfUE9JTlQgKnBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJJR05VTSAqeCwgY29uc3QgQklHTlVNICp5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJOX0NUWCAqY3R4KTsKKworLyogRUNfUE9JTlRfcG9pbnQyb2N0IHNlcmlhbGlzZXMgfHBvaW50fCBpbnRvIHRoZSBYOS42MiBmb3JtIGdpdmVuIGJ5IHxmb3JtfAorICogaW50bywgYXQgbW9zdCwgfGxlbnwgYnl0ZXMgYXQgfGJ1ZnwuIEl0IHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuCisgKiBvciB6ZXJvIG9uIGVycm9yIGlmIHxidWZ8IGlzIG5vbi1OVUxMLCBlbHNlIHRoZSBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkLiBUaGUKKyAqIHxjdHh8IGFyZ3VtZW50IG1heSBiZSB1c2VkIGlmIG5vdCBOVUxMLiAqLworc2l6ZV90IEVDX1BPSU5UX3BvaW50Mm9jdChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIGNvbnN0IEVDX1BPSU5UICpwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfY29udmVyc2lvbl9mb3JtX3QgZm9ybSwgdWludDhfdCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuLCBCTl9DVFggKmN0eCk7CisKKy8qIEVDX1BPSU5UX29jdDJwb2ludCBzZXRzIHxwb2ludHwgZnJvbSB8bGVufCBieXRlcyBvZiBYOS42MiBmb3JtYXQKKyAqIHNlcmlhbGlzYXRpb24gaW4gfGJ1ZnwuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb3RoZXJ3aXNlLiBUaGUKKyAqIHxjdHh8IGFyZ3VtZW50IG1heSBiZSB1c2VkIGlmIG5vdCBOVUxMLiAqLworaW50IEVDX1BPSU5UX29jdDJwb2ludChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEVDX1BPSU5UICpwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBzaXplX3QgbGVuLCBCTl9DVFggKmN0eCk7CisKKy8qIEVDX1BPSU5UX3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzX0dGcCBzZXRzIHxwb2ludHwgdG8gZXF1YWwgdGhlIHBvaW50IHdpdGgKKyAqIHRoZSBnaXZlbiB8eHwgY29vcmRpbmF0ZSBhbmQgdGhlIHkgY29vcmRpbmF0ZSBzcGVjaWZpZWQgYnkgfHlfYml0fCAoc2VlCisgKiBYOS42MikuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb3RoZXJ3aXNlLiAqLworaW50IEVDX1BPSU5UX3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzX0dGcChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVDX1BPSU5UICpwb2ludCwgY29uc3QgQklHTlVNICp4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9iaXQsIEJOX0NUWCAqY3R4KTsKKworCisvKiBHcm91cCBvcGVyYXRpb25zLiAqLworCisvKiBFQ19QT0lOVF9hZGQgc2V0cyB8cnwgZXF1YWwgdG8gfGF8IHBsdXMgfGJ8LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZAorICogemVybyBvdGhlcndpc2UuIElmIHxjdHh8IGlzIG5vdCBOVUxMLCBpdCBtYXkgYmUgdXNlZC4gKi8KK2ludCBFQ19QT0lOVF9hZGQoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqciwgY29uc3QgRUNfUE9JTlQgKmEsCisgICAgICAgICAgICAgICAgIGNvbnN0IEVDX1BPSU5UICpiLCBCTl9DVFggKmN0eCk7CisKKy8qIEVDX1BPSU5UX2RibCBzZXRzIHxyfCBlcXVhbCB0byB8YXwgcGx1cyB8YXwuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kCisgKiB6ZXJvIG90aGVyd2lzZS4gSWYgfGN0eHwgaXMgbm90IE5VTEwsIGl0IG1heSBiZSB1c2VkLiAqLworaW50IEVDX1BPSU5UX2RibChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEVDX1BPSU5UICpyLCBjb25zdCBFQ19QT0lOVCAqYSwKKyAgICAgICAgICAgICAgICAgQk5fQ1RYICpjdHgpOworCisvKiBFQ19QT0lOVF9kYmwgc2V0cyB8YXwgZXF1YWwgdG8gbWludXMgfGF8LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvCisgKiBvdGhlcndpc2UuIElmIHxjdHh8IGlzIG5vdCBOVUxMLCBpdCBtYXkgYmUgdXNlZC4gKi8KK2ludCBFQ19QT0lOVF9pbnZlcnQoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqYSwgQk5fQ1RYICpjdHgpOworCisvKiBFQ19QT0lOVF9tdWwgc2V0cyByID0gZ2VuZXJhdG9yKm4gKyBxKm0uIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8KKyAqIG90aGVyd2lzZS4gSWYgfGN0eHwgaXMgbm90IE5VTEwsIGl0IG1heSBiZSB1c2VkLiAqLworaW50IEVDX1BPSU5UX211bChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEVDX1BPSU5UICpyLCBjb25zdCBCSUdOVU0gKm4sCisgICAgICAgICAgICAgICAgIGNvbnN0IEVDX1BPSU5UICpxLCBjb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4KTsKKworLyogRUNfUE9JTlRzX211bCBzZXRzIHIgPSBnZW5lcmF0b3IqbiArIHN1bShwW2ldKm1baV0pLiBJdCByZXR1cm5zIG9uZSBvbgorICogc3VjY2VzcyBhbmQgemVybyBvdGhlcndpc2UuIElmIHxjdHh8IGlzIG5vdCBOVUxMLCBpdCBtYXkgYmUgdXNlZC4gKi8KK2ludCBFQ19QT0lOVHNfbXVsKGNvbnN0IEVDX0dST1VQICpncm91cCwgRUNfUE9JTlQgKnIsIGNvbnN0IEJJR05VTSAqbiwKKyAgICAgICAgICAgICAgICAgIHNpemVfdCBudW0sIGNvbnN0IEVDX1BPSU5UICpwW10sIGNvbnN0IEJJR05VTSAqbVtdLAorICAgICAgICAgICAgICAgICAgQk5fQ1RYICpjdHgpOworCisKKy8qIE9sZCBjb2RlIGV4cGVjdHMgdG8gZ2V0IEVDX0tFWSBmcm9tIGVjLmguICovCisjaWYgIWRlZmluZWQoT1BFTlNTTF9IRUFERVJfRUNfS0VZX0gpCisjaW5jbHVkZSA8b3BlbnNzbC9lY19rZXkuaD4KKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfSAgLyogZXh0ZXJuIEMgKi8KKyNlbmRpZgorCisjZGVmaW5lIEVDX0ZfZWNfcHJlX2NvbXBfbmV3IDEwMAorI2RlZmluZSBFQ19GX2VjX0dGcF9tb250X2ZpZWxkX2RlY29kZSAxMDEKKyNkZWZpbmUgRUNfRl9lY19ncm91cF9uZXdfZnJvbV9kYXRhIDEwMgorI2RlZmluZSBFQ19GX2VjX0dGcF9zaW1wbGVfcG9pbnRfZ2V0X2FmZmluZV9jb29yZGluYXRlcyAxMDMKKyNkZWZpbmUgRUNfRl9lY19HRnBfc2ltcGxlX21ha2VfYWZmaW5lIDEwNAorI2RlZmluZSBFQ19GX0VDX0tFWV9uZXdfbWV0aG9kIDEwNQorI2RlZmluZSBFQ19GX2VjX0dGcF9tb250X2ZpZWxkX2VuY29kZSAxMDYKKyNkZWZpbmUgRUNfRl9FQ19HUk9VUF9uZXdfYnlfY3VydmVfbmFtZSAxMDcKKyNkZWZpbmUgRUNfRl9lY19ncm91cF9uZXcgMTA4CisjZGVmaW5lIEVDX0ZfZWNfYXNuMV9ncm91cDJwa3BhcmFtZXRlcnMgMTA5CisjZGVmaW5lIEVDX0ZfRUNfUE9JTlRfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXNfR0ZwIDExMAorI2RlZmluZSBFQ19GX2VjX0dGcF9tb250X2ZpZWxkX3NxciAxMTEKKyNkZWZpbmUgRUNfRl9FQ19QT0lOVF9tYWtlX2FmZmluZSAxMTIKKyNkZWZpbmUgRUNfRl9pMmRfRUNQYXJhbWV0ZXJzIDExMworI2RlZmluZSBFQ19GX2VjX3dOQUZfbXVsIDExNAorI2RlZmluZSBFQ19GX0VDX0dST1VQX2NvcHkgMTE1CisjZGVmaW5lIEVDX0ZfRUNfUE9JTlRfY21wIDExNgorI2RlZmluZSBFQ19GX2VjX0dGcF9tb250X2ZpZWxkX211bCAxMTcKKyNkZWZpbmUgRUNfRl9FQ19QT0lOVF9kdXAgMTE4CisjZGVmaW5lIEVDX0ZfRUNfUE9JTlRfaW52ZXJ0IDExOQorI2RlZmluZSBFQ19GX2VjX0dGcF9zaW1wbGVfcG9pbnRfc2V0X2FmZmluZV9jb29yZGluYXRlcyAxMjAKKyNkZWZpbmUgRUNfRl9lY19HRnBfc2ltcGxlX3BvaW50c19tYWtlX2FmZmluZSAxMjEKKyNkZWZpbmUgRUNfRl9pMm9fRUNQdWJsaWNLZXkgMTIyCisjZGVmaW5lIEVDX0ZfRUNfS0VZX2NoZWNrX2tleSAxMjMKKyNkZWZpbmUgRUNfRl9lY193TkFGX3ByZWNvbXB1dGVfbXVsdCAxMjQKKyNkZWZpbmUgRUNfRl9FQ19QT0lOVF9vY3QycG9pbnQgMTI1CisjZGVmaW5lIEVDX0ZfRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkgMTI2CisjZGVmaW5lIEVDX0ZfRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAgMTI3CisjZGVmaW5lIEVDX0ZfZWNfcG9pbnRfc2V0X0pwcm9qZWN0aXZlX2Nvb3JkaW5hdGVzX0dGcCAxMjgKKyNkZWZpbmUgRUNfRl9vMmlfRUNQdWJsaWNLZXkgMTI5CisjZGVmaW5lIEVDX0ZfZWNfR0ZwX21vbnRfZmllbGRfc2V0X3RvX29uZSAxMzAKKyNkZWZpbmUgRUNfRl9lY19ncm91cF9uZXdfY3VydmVfR0ZwIDEzMQorI2RlZmluZSBFQ19GX0VDX1BPSU5UX2RibCAxMzIKKyNkZWZpbmUgRUNfRl9lY19hc24xX3BrcGFyYW1ldGVyczJncm91cCAxMzMKKyNkZWZpbmUgRUNfRl9pMmRfRUNQS1BhcmFtZXRlcnMgMTM0CisjZGVmaW5lIEVDX0ZfRUNfS0VZX2NvcHkgMTM1CisjZGVmaW5lIEVDX0ZfRUNfUE9JTlRfbmV3IDEzNgorI2RlZmluZSBFQ19GX0VDX1BPSU5UX3BvaW50Mm9jdCAxMzcKKyNkZWZpbmUgRUNfRl9FQ19QT0lOVF9jb3B5IDEzOAorI2RlZmluZSBFQ19GX0VDX1BPSU5UX2lzX29uX2N1cnZlIDEzOQorI2RlZmluZSBFQ19GX2VjX0dGcF9zaW1wbGVfZ3JvdXBfc2V0X2N1cnZlIDE0MAorI2RlZmluZSBFQ19GX2kyZF9FQ1ByaXZhdGVLZXkgMTQxCisjZGVmaW5lIEVDX0ZfZDJpX0VDUGFyYW1ldGVycyAxNDIKKyNkZWZpbmUgRUNfRl9lY19HRnBfbW9udF9ncm91cF9zZXRfY3VydmUgMTQzCisjZGVmaW5lIEVDX0ZfRUNfUE9JTlRfc2V0X3RvX2luZmluaXR5IDE0NAorI2RlZmluZSBFQ19GX0VDX1BPSU5Uc19tYWtlX2FmZmluZSAxNDUKKyNkZWZpbmUgRUNfRl9jb21wdXRlX3dOQUYgMTQ2CisjZGVmaW5lIEVDX0ZfZWNfR0ZwX3NpbXBsZV9wb2ludDJvY3QgMTQ3CisjZGVmaW5lIEVDX0ZfRUNfR1JPVVBfZ2V0X2RlZ3JlZSAxNDgKKyNkZWZpbmUgRUNfRl9lY19HRnBfc2ltcGxlX2dyb3VwX2NoZWNrX2Rpc2NyaW1pbmFudCAxNDkKKyNkZWZpbmUgRUNfRl9kMmlfRUNQS1BhcmFtZXRlcnMgMTUwCisjZGVmaW5lIEVDX0ZfZDJpX0VDUHJpdmF0ZUtleSAxNTEKKyNkZWZpbmUgRUNfRl9lY19HRnBfc2ltcGxlX29jdDJwb2ludCAxNTIKKyNkZWZpbmUgRUNfRl9FQ19QT0lOVF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcCAxNTMKKyNkZWZpbmUgRUNfRl9FQ19LRVlfc2V0X3B1YmxpY19rZXlfYWZmaW5lX2Nvb3JkaW5hdGVzIDE1NAorI2RlZmluZSBFQ19GX0VDX0tFWV9nZW5lcmF0ZV9rZXkgMTU1CisjZGVmaW5lIEVDX0ZfZWNfR0ZwX3NpbXBsZV9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlcyAxNTYKKyNkZWZpbmUgRUNfRl9FQ19QT0lOVF9hZGQgMTU3CisjZGVmaW5lIEVDX1JfUEtQQVJBTUVURVJTMkdST1VQX0ZBSUxVUkUgMTAwCisjZGVmaW5lIEVDX1JfTk9OX05BTUVEX0NVUlZFIDEwMQorI2RlZmluZSBFQ19SX0NPT1JESU5BVEVTX09VVF9PRl9SQU5HRSAxMDIKKyNkZWZpbmUgRUNfUl9QT0lOVF9BVF9JTkZJTklUWSAxMDMKKyNkZWZpbmUgRUNfUl9OT1RfSU5JVElBTElaRUQgMTA0CisjZGVmaW5lIEVDX1JfTUlTU0lOR19QUklWQVRFX0tFWSAxMDUKKyNkZWZpbmUgRUNfUl9HUk9VUDJQS1BBUkFNRVRFUlNfRkFJTFVSRSAxMDYKKyNkZWZpbmUgRUNfUl9JTlZBTElEX0VOQ09ESU5HIDEwNworI2RlZmluZSBFQ19SX0JVRkZFUl9UT09fU01BTEwgMTA4CisjZGVmaW5lIEVDX1JfRDJJX0VDUEtQQVJBTUVURVJTX0ZBSUxVUkUgMTA5CisjZGVmaW5lIEVDX1JfSU5WQUxJRF9GT1JNIDExMAorI2RlZmluZSBFQ19SX0lOVkFMSURfUFJJVkFURV9LRVkgMTExCisjZGVmaW5lIEVDX1JfSU5WQUxJRF9DT01QUkVTU0VEX1BPSU5UIDExMgorI2RlZmluZSBFQ19SX01JU1NJTkdfUEFSQU1FVEVSUyAxMTMKKyNkZWZpbmUgRUNfUl9JTlZBTElEX0ZJRUxEIDExNAorI2RlZmluZSBFQ19SX0lOVkFMSURfQ09NUFJFU1NJT05fQklUIDExNQorI2RlZmluZSBFQ19SX0dGMk1fTk9UX1NVUFBPUlRFRCAxMTYKKyNkZWZpbmUgRUNfUl9QT0lOVF9JU19OT1RfT05fQ1VSVkUgMTE3CisjZGVmaW5lIEVDX1JfVU5LTk9XTl9PUkRFUiAxMTgKKyNkZWZpbmUgRUNfUl9VTktOT1dOX0dST1VQIDExOQorI2RlZmluZSBFQ19SX1dST05HX09SREVSIDEyMAorI2RlZmluZSBFQ19SX1VOREVGSU5FRF9HRU5FUkFUT1IgMTIxCisjZGVmaW5lIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMgMTIyCisjZGVmaW5lIEVDX1JfSTJEX0VDUEtQQVJBTUVURVJTX0ZBSUxVUkUgMTIzCisjZGVmaW5lIEVDX1JfRUNfR1JPVVBfTkVXX0JZX05BTUVfRkFJTFVSRSAxMjQKKyNkZWZpbmUgRUNfUl9JTlZBTElEX0dST1VQX09SREVSIDEyNQorI2RlZmluZSBFQ19SX1NMT1RfRlVMTCAxMjYKKworI2VuZGlmICAvKiBPUEVOU1NMX0hFQURFUl9FQ19IICovCmRpZmYgLS1naXQgYS9jcnlwdG8vZWMvZWNfYXNuMS5jIGIvY3J5cHRvL2VjL2VjX2FzbjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjRmNzRmCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2VjL2VjX2FzbjEuYwpAQCAtMCwwICsxLDU1NiBAQAorLyogV3JpdHRlbiBieSBOaWxzIExhcnNjaCBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdC4gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9lYy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKworI2luY2x1ZGUgImludGVybmFsLmgiCisKKwordHlwZWRlZiBzdHJ1Y3QgeDlfNjJfZmllbGRpZF9zdCB7CisgIEFTTjFfT0JKRUNUICpmaWVsZFR5cGU7CisgIHVuaW9uIHsKKyAgICBjaGFyICpwdHI7CisgICAgLyogTklEX1g5XzYyX3ByaW1lX2ZpZWxkICovCisgICAgQVNOMV9JTlRFR0VSICpwcmltZTsKKyAgICAvKiBhbnl0aGluZyBlbHNlICovCisgICAgQVNOMV9UWVBFICpvdGhlcjsKKyAgfSBwOworfSBYOV82Ml9GSUVMRElEOworCitBU04xX0FEQl9URU1QTEFURShmaWVsZElEX2RlZikgPSBBU04xX1NJTVBMRShYOV82Ml9GSUVMRElELCBwLm90aGVyLCBBU04xX0FOWSk7CisKK0FTTjFfQURCKFg5XzYyX0ZJRUxESUQpID0geworICBBREJfRU5UUlkoTklEX1g5XzYyX3ByaW1lX2ZpZWxkLCBBU04xX1NJTVBMRShYOV82Ml9GSUVMRElELCBwLnByaW1lLCBBU04xX0lOVEVHRVIpKSwKK30gQVNOMV9BREJfRU5EKFg5XzYyX0ZJRUxESUQsIDAsIGZpZWxkVHlwZSwgMCwgJmZpZWxkSURfZGVmX3R0LCBOVUxMKTsKKworQVNOMV9TRVFVRU5DRShYOV82Ml9GSUVMRElEKSA9IHsKKyAgQVNOMV9TSU1QTEUoWDlfNjJfRklFTERJRCwgZmllbGRUeXBlLCBBU04xX09CSkVDVCksCisgIEFTTjFfQURCX09CSkVDVChYOV82Ml9GSUVMRElEKQorfSBBU04xX1NFUVVFTkNFX0VORChYOV82Ml9GSUVMRElEKTsKKwordHlwZWRlZiBzdHJ1Y3QgeDlfNjJfY3VydmVfc3QgeworICBBU04xX09DVEVUX1NUUklORyAqYTsKKyAgQVNOMV9PQ1RFVF9TVFJJTkcgKmI7CisgIEFTTjFfQklUX1NUUklORyAqc2VlZDsKK30gWDlfNjJfQ1VSVkU7CisKK0FTTjFfU0VRVUVOQ0UoWDlfNjJfQ1VSVkUpID0geworICBBU04xX1NJTVBMRShYOV82Ml9DVVJWRSwgYSwgQVNOMV9PQ1RFVF9TVFJJTkcpLAorICBBU04xX1NJTVBMRShYOV82Ml9DVVJWRSwgYiwgQVNOMV9PQ1RFVF9TVFJJTkcpLAorICBBU04xX09QVChYOV82Ml9DVVJWRSwgc2VlZCwgQVNOMV9CSVRfU1RSSU5HKQorfSBBU04xX1NFUVVFTkNFX0VORChYOV82Ml9DVVJWRSk7CisKK3R5cGVkZWYgc3RydWN0IGVjX3BhcmFtZXRlcnNfc3QgeworICBsb25nIHZlcnNpb247CisgIFg5XzYyX0ZJRUxESUQgKmZpZWxkSUQ7CisgIFg5XzYyX0NVUlZFICpjdXJ2ZTsKKyAgQVNOMV9PQ1RFVF9TVFJJTkcgKmJhc2U7CisgIEFTTjFfSU5URUdFUiAqb3JkZXI7CisgIEFTTjFfSU5URUdFUiAqY29mYWN0b3I7Cit9IEVDUEFSQU1FVEVSUzsKKworQVNOMV9TRVFVRU5DRShFQ1BBUkFNRVRFUlMpID0geworICAgIEFTTjFfU0lNUExFKEVDUEFSQU1FVEVSUywgdmVyc2lvbiwgTE9ORyksCisgICAgQVNOMV9TSU1QTEUoRUNQQVJBTUVURVJTLCBmaWVsZElELCBYOV82Ml9GSUVMRElEKSwKKyAgICBBU04xX1NJTVBMRShFQ1BBUkFNRVRFUlMsIGN1cnZlLCBYOV82Ml9DVVJWRSksCisgICAgQVNOMV9TSU1QTEUoRUNQQVJBTUVURVJTLCBiYXNlLCBBU04xX09DVEVUX1NUUklORyksCisgICAgQVNOMV9TSU1QTEUoRUNQQVJBTUVURVJTLCBvcmRlciwgQVNOMV9JTlRFR0VSKSwKKyAgICBBU04xX09QVChFQ1BBUkFNRVRFUlMsIGNvZmFjdG9yLCBBU04xX0lOVEVHRVIpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKEVDUEFSQU1FVEVSUyk7CisKK0RFQ0xBUkVfQVNOMV9BTExPQ19GVU5DVElPTlMoRUNQQVJBTUVURVJTKTsKK0lNUExFTUVOVF9BU04xX0FMTE9DX0ZVTkNUSU9OUyhFQ1BBUkFNRVRFUlMpOworCit0eXBlZGVmIHN0cnVjdCBlY3BrX3BhcmFtZXRlcnNfc3QgeworICBpbnQgdHlwZTsKKyAgdW5pb24geworICAgIEFTTjFfT0JKRUNUICpuYW1lZF9jdXJ2ZTsKKyAgICBFQ1BBUkFNRVRFUlMgKnBhcmFtZXRlcnM7CisgIH0gdmFsdWU7Cit9IEVDUEtQQVJBTUVURVJTOworCisvKiBTRUMxIEVDUHJpdmF0ZUtleSAqLwordHlwZWRlZiBzdHJ1Y3QgZWNfcHJpdmF0ZWtleV9zdCB7CisgIGxvbmcgdmVyc2lvbjsKKyAgQVNOMV9PQ1RFVF9TVFJJTkcgKnByaXZhdGVLZXk7CisgIEVDUEtQQVJBTUVURVJTICpwYXJhbWV0ZXJzOworICBBU04xX0JJVF9TVFJJTkcgKnB1YmxpY0tleTsKK30gRUNfUFJJVkFURUtFWTsKKworQVNOMV9DSE9JQ0UoRUNQS1BBUkFNRVRFUlMpID0geworICAgIEFTTjFfU0lNUExFKEVDUEtQQVJBTUVURVJTLCB2YWx1ZS5uYW1lZF9jdXJ2ZSwgQVNOMV9PQkpFQ1QpLAorICAgIEFTTjFfU0lNUExFKEVDUEtQQVJBTUVURVJTLCB2YWx1ZS5wYXJhbWV0ZXJzLCBFQ1BBUkFNRVRFUlMpLAorfSBBU04xX0NIT0lDRV9FTkQoRUNQS1BBUkFNRVRFUlMpOworCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TX2NvbnN0KEVDUEtQQVJBTUVURVJTKTsKK0RFQ0xBUkVfQVNOMV9FTkNPREVfRlVOQ1RJT05TX2NvbnN0KEVDUEtQQVJBTUVURVJTLCBFQ1BLUEFSQU1FVEVSUyk7CitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlNfY29uc3QoRUNQS1BBUkFNRVRFUlMpOworCitBU04xX1NFUVVFTkNFKEVDX1BSSVZBVEVLRVkpID0geworICAgIEFTTjFfU0lNUExFKEVDX1BSSVZBVEVLRVksIHZlcnNpb24sIExPTkcpLAorICAgIEFTTjFfU0lNUExFKEVDX1BSSVZBVEVLRVksIHByaXZhdGVLZXksIEFTTjFfT0NURVRfU1RSSU5HKSwKKyAgICBBU04xX0VYUF9PUFQoRUNfUFJJVkFURUtFWSwgcGFyYW1ldGVycywgRUNQS1BBUkFNRVRFUlMsIDApLAorICAgIEFTTjFfRVhQX09QVChFQ19QUklWQVRFS0VZLCBwdWJsaWNLZXksIEFTTjFfQklUX1NUUklORywgMSksCit9IEFTTjFfU0VRVUVOQ0VfRU5EKEVDX1BSSVZBVEVLRVkpOworCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TX2NvbnN0KEVDX1BSSVZBVEVLRVkpOworREVDTEFSRV9BU04xX0VOQ09ERV9GVU5DVElPTlNfY29uc3QoRUNfUFJJVkFURUtFWSwgRUNfUFJJVkFURUtFWSk7CitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlNfY29uc3QoRUNfUFJJVkFURUtFWSk7CisKKworRUNQS1BBUkFNRVRFUlMgKmVjX2FzbjFfZ3JvdXAycGtwYXJhbWV0ZXJzKGNvbnN0IEVDX0dST1VQICpncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFQ1BLUEFSQU1FVEVSUyAqcGFyYW1zKSB7CisgIGludCBvayA9IDAsIG5pZDsKKyAgRUNQS1BBUkFNRVRFUlMgKnJldCA9IHBhcmFtczsKKworICBpZiAocmV0ID09IE5VTEwpIHsKKyAgICByZXQgPSBFQ1BLUEFSQU1FVEVSU19uZXcoKTsKKyAgICBpZiAocmV0ID09IE5VTEwpIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19hc24xX2dyb3VwMnBrcGFyYW1ldGVycywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChyZXQtPnZhbHVlLm5hbWVkX2N1cnZlKSB7CisgICAgICBBU04xX09CSkVDVF9mcmVlKHJldC0+dmFsdWUubmFtZWRfY3VydmUpOworICAgIH0KKyAgfQorCisgIC8qIHVzZSB0aGUgQVNOLjEgT0lEIHRvIGRlc2NyaWJlIHRoZSB0aGUgZWxsaXB0aWMgY3VydmUgcGFyYW1ldGVycy4gKi8KKyAgbmlkID0gRUNfR1JPVVBfZ2V0X2N1cnZlX25hbWUoZ3JvdXApOworICBpZiAobmlkKSB7CisgICAgcmV0LT50eXBlID0gMDsKKyAgICByZXQtPnZhbHVlLm5hbWVkX2N1cnZlID0gKEFTTjFfT0JKRUNUKikgT0JKX25pZDJvYmoobmlkKTsKKyAgICBvayA9IHJldC0+dmFsdWUubmFtZWRfY3VydmUgIT0gTlVMTDsKKyAgfQorCisgIGlmICghb2spIHsKKyAgICBFQ1BLUEFSQU1FVEVSU19mcmVlKHJldCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitFQ19HUk9VUCAqZWNfYXNuMV9wa3BhcmFtZXRlcnMyZ3JvdXAoY29uc3QgRUNQS1BBUkFNRVRFUlMgKnBhcmFtcykgeworICBFQ19HUk9VUCAqcmV0ID0gTlVMTDsKKyAgaW50IG5pZCA9IDA7CisKKyAgaWYgKHBhcmFtcyA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX2FzbjFfcGtwYXJhbWV0ZXJzMmdyb3VwLCBFQ19SX01JU1NJTkdfUEFSQU1FVEVSUyk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBpZiAocGFyYW1zLT50eXBlICE9IDApIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfYXNuMV9wa3BhcmFtZXRlcnMyZ3JvdXAsIEVDX1JfTk9OX05BTUVEX0NVUlZFKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIG5pZCA9IE9CSl9vYmoybmlkKHBhcmFtcy0+dmFsdWUubmFtZWRfY3VydmUpOworICByZXQgPSBFQ19HUk9VUF9uZXdfYnlfY3VydmVfbmFtZShuaWQpOworICBpZiAocmV0ID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfYXNuMV9wa3BhcmFtZXRlcnMyZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgRUNfUl9FQ19HUk9VUF9ORVdfQllfTkFNRV9GQUlMVVJFKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBFQ19HUk9VUCAqZDJpX0VDUEtQYXJhbWV0ZXJzKEVDX0dST1VQICoqZ3JvdXBwLCBjb25zdCB1aW50OF90ICoqaW5wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBsZW4pIHsKKyAgRUNfR1JPVVAgKmdyb3VwID0gTlVMTDsKKyAgRUNQS1BBUkFNRVRFUlMgKnBhcmFtcyA9IE5VTEw7CisKKyAgcGFyYW1zID0gZDJpX0VDUEtQQVJBTUVURVJTKE5VTEwsIGlucCwgbGVuKTsKKyAgaWYgKHBhcmFtcyA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGQyaV9FQ1BLUGFyYW1ldGVycywgRUNfUl9EMklfRUNQS1BBUkFNRVRFUlNfRkFJTFVSRSk7CisgICAgRUNQS1BBUkFNRVRFUlNfZnJlZShwYXJhbXMpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgZ3JvdXAgPSBlY19hc24xX3BrcGFyYW1ldGVyczJncm91cChwYXJhbXMpOworICBpZiAoZ3JvdXAgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBkMmlfRUNQS1BhcmFtZXRlcnMsIEVDX1JfUEtQQVJBTUVURVJTMkdST1VQX0ZBSUxVUkUpOworICAgIEVDUEtQQVJBTUVURVJTX2ZyZWUocGFyYW1zKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmIChncm91cHAgJiYgKmdyb3VwcCkgeworICAgIEVDX0dST1VQX2ZyZWUoKmdyb3VwcCk7CisgIH0KKyAgaWYgKGdyb3VwcCkgeworICAgICpncm91cHAgPSBncm91cDsKKyAgfQorCisgIEVDUEtQQVJBTUVURVJTX2ZyZWUocGFyYW1zKTsKKyAgcmV0dXJuIGdyb3VwOworfQorCitzdGF0aWMgaW50IGkyZF9FQ1BLUGFyYW1ldGVycyhjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIHVpbnQ4X3QgKipvdXRwKSB7CisgIGludCByZXQgPSAwOworICBFQ1BLUEFSQU1FVEVSUyAqdG1wID0gZWNfYXNuMV9ncm91cDJwa3BhcmFtZXRlcnMoZ3JvdXAsIE5VTEwpOworICBpZiAodG1wID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgaTJkX0VDUEtQYXJhbWV0ZXJzLCBFQ19SX0dST1VQMlBLUEFSQU1FVEVSU19GQUlMVVJFKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXQgPSBpMmRfRUNQS1BBUkFNRVRFUlModG1wLCBvdXRwKTsKKyAgaWYgKHJldCA9PSAwKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGkyZF9FQ1BLUGFyYW1ldGVycywgRUNfUl9JMkRfRUNQS1BBUkFNRVRFUlNfRkFJTFVSRSk7CisgICAgRUNQS1BBUkFNRVRFUlNfZnJlZSh0bXApOworICAgIHJldHVybiAwOworICB9CisgIEVDUEtQQVJBTUVURVJTX2ZyZWUodG1wKTsKKyAgcmV0dXJuIHJldDsKK30KKworRUNfS0VZICpkMmlfRUNQcml2YXRlS2V5KEVDX0tFWSAqKmEsIGNvbnN0IHVpbnQ4X3QgKippbiwgbG9uZyBsZW4pIHsKKyAgaW50IG9rID0gMDsKKyAgRUNfS0VZICpyZXQgPSBOVUxMOworICBFQ19QUklWQVRFS0VZICpwcml2X2tleSA9IE5VTEw7CisKKyAgcHJpdl9rZXkgPSBFQ19QUklWQVRFS0VZX25ldygpOworICBpZiAocHJpdl9rZXkgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBkMmlfRUNQcml2YXRlS2V5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBwcml2X2tleSA9IGQyaV9FQ19QUklWQVRFS0VZKCZwcml2X2tleSwgaW4sIGxlbik7CisgIGlmIChwcml2X2tleSA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGQyaV9FQ1ByaXZhdGVLZXksIEVSUl9SX0VDX0xJQik7CisgICAgRUNfUFJJVkFURUtFWV9mcmVlKHByaXZfa2V5KTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmIChhID09IE5VTEwgfHwgKmEgPT0gTlVMTCkgeworICAgIHJldCA9IEVDX0tFWV9uZXcoKTsKKyAgICBpZiAocmV0ID09IE5VTEwpIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBkMmlfRUNQcml2YXRlS2V5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgaWYgKGEpIHsKKyAgICAgICphID0gcmV0OworICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXQgPSAqYTsKKyAgfQorCisgIGlmIChwcml2X2tleS0+cGFyYW1ldGVycykgeworICAgIGlmIChyZXQtPmdyb3VwKSB7CisgICAgICBFQ19HUk9VUF9mcmVlKHJldC0+Z3JvdXApOworICAgIH0KKyAgICByZXQtPmdyb3VwID0gZWNfYXNuMV9wa3BhcmFtZXRlcnMyZ3JvdXAocHJpdl9rZXktPnBhcmFtZXRlcnMpOworICB9CisKKyAgaWYgKHJldC0+Z3JvdXAgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBkMmlfRUNQcml2YXRlS2V5LCBFUlJfUl9FQ19MSUIpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgcmV0LT52ZXJzaW9uID0gcHJpdl9rZXktPnZlcnNpb247CisKKyAgaWYgKHByaXZfa2V5LT5wcml2YXRlS2V5KSB7CisgICAgcmV0LT5wcml2X2tleSA9CisgICAgICAgIEJOX2JpbjJibihNX0FTTjFfU1RSSU5HX2RhdGEocHJpdl9rZXktPnByaXZhdGVLZXkpLAorICAgICAgICAgICAgICAgICAgTV9BU04xX1NUUklOR19sZW5ndGgocHJpdl9rZXktPnByaXZhdGVLZXkpLCByZXQtPnByaXZfa2V5KTsKKyAgICBpZiAocmV0LT5wcml2X2tleSA9PSBOVUxMKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZDJpX0VDUHJpdmF0ZUtleSwgRVJSX1JfQk5fTElCKTsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZDJpX0VDUHJpdmF0ZUtleSwgRUNfUl9NSVNTSU5HX1BSSVZBVEVfS0VZKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIC8qIFRPRE8oZm9yayk6IGxvYWRpbmcgdGhlIHB1YmxpYyBrZXkgaXMgc2lsbHkuIFdoeSBub3QgY2FsY3VsYXRlIGl0PyAqLworICBpZiAocHJpdl9rZXktPnB1YmxpY0tleSkgeworICAgIGNvbnN0IHVpbnQ4X3QgKnB1Yl9vY3Q7CisgICAgc2l6ZV90IHB1Yl9vY3RfbGVuOworCisgICAgaWYgKHJldC0+cHViX2tleSkgeworICAgICAgRUNfUE9JTlRfZnJlZShyZXQtPnB1Yl9rZXkpOworICAgIH0KKyAgICByZXQtPnB1Yl9rZXkgPSBFQ19QT0lOVF9uZXcocmV0LT5ncm91cCk7CisgICAgaWYgKHJldC0+cHViX2tleSA9PSBOVUxMKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZDJpX0VDUHJpdmF0ZUtleSwgRVJSX1JfRUNfTElCKTsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBwdWJfb2N0ID0gTV9BU04xX1NUUklOR19kYXRhKHByaXZfa2V5LT5wdWJsaWNLZXkpOworICAgIHB1Yl9vY3RfbGVuID0gTV9BU04xX1NUUklOR19sZW5ndGgocHJpdl9rZXktPnB1YmxpY0tleSk7CisgICAgLyogc2F2ZSB0aGUgcG9pbnQgY29udmVyc2lvbiBmb3JtICovCisgICAgcmV0LT5jb252X2Zvcm0gPSAocG9pbnRfY29udmVyc2lvbl9mb3JtX3QpKHB1Yl9vY3RbMF0gJiB+MHgwMSk7CisgICAgaWYgKCFFQ19QT0lOVF9vY3QycG9pbnQocmV0LT5ncm91cCwgcmV0LT5wdWJfa2V5LCBwdWJfb2N0LCBwdWJfb2N0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGQyaV9FQ1ByaXZhdGVLZXksIEVSUl9SX0VDX0xJQik7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0KKworICBvayA9IDE7CisKK2VycjoKKyAgaWYgKCFvaykgeworICAgIGlmIChyZXQpIHsKKyAgICAgIEVDX0tFWV9mcmVlKHJldCk7CisgICAgfQorICAgIHJldCA9IE5VTEw7CisgIH0KKworICBpZiAocHJpdl9rZXkpIHsKKyAgICBFQ19QUklWQVRFS0VZX2ZyZWUocHJpdl9rZXkpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworaW50IGkyZF9FQ1ByaXZhdGVLZXkoY29uc3QgRUNfS0VZICprZXksIHVpbnQ4X3QgKipvdXRwKSB7CisgIGludCByZXQgPSAwLCBvayA9IDA7CisgIHVpbnQ4X3QgKmJ1ZmZlciA9IE5VTEw7CisgIHNpemVfdCBidWZfbGVuID0gMCwgdG1wX2xlbjsKKyAgRUNfUFJJVkFURUtFWSAqcHJpdl9rZXkgPSBOVUxMOworCisgIGlmIChrZXkgPT0gTlVMTCB8fCBrZXktPmdyb3VwID09IE5VTEwgfHwga2V5LT5wcml2X2tleSA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGkyZF9FQ1ByaXZhdGVLZXksIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisgICAgZ290byBlcnI7CisgIH0KKworICBwcml2X2tleSA9IEVDX1BSSVZBVEVLRVlfbmV3KCk7CisgIGlmIChwcml2X2tleSA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGkyZF9FQ1ByaXZhdGVLZXksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIHByaXZfa2V5LT52ZXJzaW9uID0ga2V5LT52ZXJzaW9uOworCisgIGJ1Zl9sZW4gPSBCTl9udW1fYnl0ZXMoa2V5LT5wcml2X2tleSk7CisgIGJ1ZmZlciA9IE9QRU5TU0xfbWFsbG9jKGJ1Zl9sZW4pOworICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgaTJkX0VDUHJpdmF0ZUtleSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKCFCTl9ibjJiaW4oa2V5LT5wcml2X2tleSwgYnVmZmVyKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBpMmRfRUNQcml2YXRlS2V5LCBFUlJfUl9CTl9MSUIpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKCFNX0FTTjFfT0NURVRfU1RSSU5HX3NldChwcml2X2tleS0+cHJpdmF0ZUtleSwgYnVmZmVyLCBidWZfbGVuKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBpMmRfRUNQcml2YXRlS2V5LCBFUlJfUl9BU04xX0xJQik7CisgICAgZ290byBlcnI7CisgIH0KKworICAvKiBUT0RPKGZvcmspOiByZXBsYWNlIHRoaXMgZmxleGliaWxpdHkgd2l0aCBrZXkgc2Vuc2libGUgZGVmYXVsdD8gKi8KKyAgaWYgKCEoa2V5LT5lbmNfZmxhZyAmIEVDX1BLRVlfTk9fUEFSQU1FVEVSUykpIHsKKyAgICBpZiAoKHByaXZfa2V5LT5wYXJhbWV0ZXJzID0gZWNfYXNuMV9ncm91cDJwa3BhcmFtZXRlcnMoCisgICAgICAgICAgICAga2V5LT5ncm91cCwgcHJpdl9rZXktPnBhcmFtZXRlcnMpKSA9PSBOVUxMKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgaTJkX0VDUHJpdmF0ZUtleSwgRVJSX1JfRUNfTElCKTsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfQorCisgIC8qIFRPRE8oZm9yayk6IHJlcGxhY2UgdGhpcyBmbGV4aWJpbGl0eSB3aXRoIGtleSBzZW5zaWJsZSBkZWZhdWx0PyAqLworICBpZiAoIShrZXktPmVuY19mbGFnICYgRUNfUEtFWV9OT19QVUJLRVkpKSB7CisgICAgcHJpdl9rZXktPnB1YmxpY0tleSA9IE1fQVNOMV9CSVRfU1RSSU5HX25ldygpOworICAgIGlmIChwcml2X2tleS0+cHVibGljS2V5ID09IE5VTEwpIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBpMmRfRUNQcml2YXRlS2V5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICB0bXBfbGVuID0gRUNfUE9JTlRfcG9pbnQyb2N0KGtleS0+Z3JvdXAsIGtleS0+cHViX2tleSwga2V5LT5jb252X2Zvcm0sIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMKTsKKworICAgIGlmICh0bXBfbGVuID4gYnVmX2xlbikgeworICAgICAgdWludDhfdCAqdG1wX2J1ZmZlciA9IE9QRU5TU0xfcmVhbGxvYyhidWZmZXIsIHRtcF9sZW4pOworICAgICAgaWYgKCF0bXBfYnVmZmVyKSB7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBpMmRfRUNQcml2YXRlS2V5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICAgIGdvdG8gZXJyOworICAgICAgfQorICAgICAgYnVmZmVyID0gdG1wX2J1ZmZlcjsKKyAgICAgIGJ1Zl9sZW4gPSB0bXBfbGVuOworICAgIH0KKworICAgIGlmICghRUNfUE9JTlRfcG9pbnQyb2N0KGtleS0+Z3JvdXAsIGtleS0+cHViX2tleSwga2V5LT5jb252X2Zvcm0sIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfbGVuLCBOVUxMKSkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGkyZF9FQ1ByaXZhdGVLZXksIEVSUl9SX0VDX0xJQik7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBwcml2X2tleS0+cHVibGljS2V5LT5mbGFncyAmPSB+KEFTTjFfU1RSSU5HX0ZMQUdfQklUU19MRUZUIHwgMHgwNyk7CisgICAgcHJpdl9rZXktPnB1YmxpY0tleS0+ZmxhZ3MgfD0gQVNOMV9TVFJJTkdfRkxBR19CSVRTX0xFRlQ7CisgICAgaWYgKCFNX0FTTjFfQklUX1NUUklOR19zZXQocHJpdl9rZXktPnB1YmxpY0tleSwgYnVmZmVyLCBidWZfbGVuKSkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGkyZF9FQ1ByaXZhdGVLZXksIEVSUl9SX0FTTjFfTElCKTsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfQorCisgIHJldCA9IGkyZF9FQ19QUklWQVRFS0VZKHByaXZfa2V5LCBvdXRwKTsKKyAgaWYgKHJldCA9PSAwKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGkyZF9FQ1ByaXZhdGVLZXksIEVSUl9SX0VDX0xJQik7CisgICAgZ290byBlcnI7CisgIH0KKyAgb2sgPSAxOworCitlcnI6CisgIGlmIChidWZmZXIpIHsKKyAgICBPUEVOU1NMX2ZyZWUoYnVmZmVyKTsKKyAgfQorICBpZiAocHJpdl9rZXkpIHsKKyAgICBFQ19QUklWQVRFS0VZX2ZyZWUocHJpdl9rZXkpOworICB9CisgIHJldHVybiAob2sgPyByZXQgOiAwKTsKK30KKworaW50IGkyZF9FQ1BhcmFtZXRlcnMoY29uc3QgRUNfS0VZICprZXksIHVpbnQ4X3QgKipvdXRwKSB7CisgIGlmIChrZXkgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBpMmRfRUNQYXJhbWV0ZXJzLCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBpMmRfRUNQS1BhcmFtZXRlcnMoa2V5LT5ncm91cCwgb3V0cCk7Cit9CisKK0VDX0tFWSAqZDJpX0VDUGFyYW1ldGVycyhFQ19LRVkgKiprZXksIGNvbnN0IHVpbnQ4X3QgKippbnAsIGxvbmcgbGVuKSB7CisgIEVDX0tFWSAqcmV0OworCisgIGlmIChpbnAgPT0gTlVMTCB8fCAqaW5wID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZDJpX0VDUGFyYW1ldGVycywgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmIChrZXkgPT0gTlVMTCB8fCAqa2V5ID09IE5VTEwpIHsKKyAgICByZXQgPSBFQ19LRVlfbmV3KCk7CisgICAgaWYgKHJldCA9PSBOVUxMKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZDJpX0VDUGFyYW1ldGVycywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChrZXkpIHsKKyAgICAgICprZXkgPSByZXQ7CisgICAgfQorICB9IGVsc2UgeworICAgIHJldCA9ICprZXk7CisgIH0KKworICBpZiAoIWQyaV9FQ1BLUGFyYW1ldGVycygmcmV0LT5ncm91cCwgaW5wLCBsZW4pKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGQyaV9FQ1BhcmFtZXRlcnMsIEVSUl9SX0VDX0xJQik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitFQ19LRVkgKm8yaV9FQ1B1YmxpY0tleShFQ19LRVkgKiprZXlwLCBjb25zdCB1aW50OF90ICoqaW5wLCBsb25nIGxlbikgeworICBFQ19LRVkgKnJldCA9IE5VTEw7CisKKyAgaWYgKGtleXAgPT0gTlVMTCB8fCAqa2V5cCA9PSBOVUxMIHx8ICgqa2V5cCktPmdyb3VwID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgbzJpX0VDUHVibGljS2V5LCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworICAgIHJldHVybiAwOworICB9CisgIHJldCA9ICprZXlwOworICBpZiAocmV0LT5wdWJfa2V5ID09IE5VTEwgJiYKKyAgICAgIChyZXQtPnB1Yl9rZXkgPSBFQ19QT0lOVF9uZXcocmV0LT5ncm91cCkpID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgbzJpX0VDUHVibGljS2V5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCFFQ19QT0lOVF9vY3QycG9pbnQocmV0LT5ncm91cCwgcmV0LT5wdWJfa2V5LCAqaW5wLCBsZW4sIE5VTEwpKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIG8yaV9FQ1B1YmxpY0tleSwgRVJSX1JfRUNfTElCKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICAvKiBzYXZlIHRoZSBwb2ludCBjb252ZXJzaW9uIGZvcm0gKi8KKyAgcmV0LT5jb252X2Zvcm0gPSAocG9pbnRfY29udmVyc2lvbl9mb3JtX3QpKCppbnBbMF0gJiB+MHgwMSk7CisgICppbnAgKz0gbGVuOworICByZXR1cm4gcmV0OworfQorCitpbnQgaTJvX0VDUHVibGljS2V5KGNvbnN0IEVDX0tFWSAqa2V5LCB1aW50OF90ICoqb3V0cCkgeworICBzaXplX3QgYnVmX2xlbiA9IDA7CisgIGludCBuZXdfYnVmZmVyID0gMDsKKworICBpZiAoa2V5ID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgaTJvX0VDUHVibGljS2V5LCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworICAgIHJldHVybiAwOworICB9CisKKyAgYnVmX2xlbiA9IEVDX1BPSU5UX3BvaW50Mm9jdChrZXktPmdyb3VwLCBrZXktPnB1Yl9rZXksIGtleS0+Y29udl9mb3JtLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwpOworCisgIGlmIChvdXRwID09IE5VTEwgfHwgYnVmX2xlbiA9PSAwKSB7CisgICAgLyogb3V0ID09IE5VTEwgPT4ganVzdCByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgb2N0ZXQgc3RyaW5nICovCisgICAgcmV0dXJuIGJ1Zl9sZW47CisgIH0KKworICBpZiAoKm91dHAgPT0gTlVMTCkgeworICAgICpvdXRwID0gT1BFTlNTTF9tYWxsb2MoYnVmX2xlbik7CisgICAgaWYgKCpvdXRwID09IE5VTEwpIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBpMm9fRUNQdWJsaWNLZXksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBuZXdfYnVmZmVyID0gMTsKKyAgfQorICBpZiAoIUVDX1BPSU5UX3BvaW50Mm9jdChrZXktPmdyb3VwLCBrZXktPnB1Yl9rZXksIGtleS0+Y29udl9mb3JtLCAqb3V0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX2xlbiwgTlVMTCkpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgaTJvX0VDUHVibGljS2V5LCBFUlJfUl9FQ19MSUIpOworICAgIE9QRU5TU0xfZnJlZSgqb3V0cCk7CisgICAgKm91dHAgPSBOVUxMOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKCFuZXdfYnVmZmVyKSB7CisgICAgKm91dHAgKz0gYnVmX2xlbjsKKyAgfQorICByZXR1cm4gYnVmX2xlbjsKK30KZGlmZiAtLWdpdCBhL2NyeXB0by9lYy9lY19lcnJvci5jIGIvY3J5cHRvL2VjL2VjX2Vycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk1YjFhZgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9lYy9lY19lcnJvci5jCkBAIC0wLDAgKzEsMTA2IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTQsIEdvb2dsZSBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorCisjaW5jbHVkZSAiZWMuaCIKKworY29uc3QgRVJSX1NUUklOR19EQVRBIEVDX2Vycm9yX3N0cmluZ19kYXRhW10gPSB7CisgIHtFUlJfUEFDSyhFUlJfTElCX0VDLCBFQ19GX0VDX0dST1VQX2NvcHksIDApLCAiRUNfR1JPVVBfY29weSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQywgRUNfRl9FQ19HUk9VUF9nZXRfZGVncmVlLCAwKSwgIkVDX0dST1VQX2dldF9kZWdyZWUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRUMsIEVDX0ZfRUNfR1JPVVBfbmV3X2J5X2N1cnZlX25hbWUsIDApLCAiRUNfR1JPVVBfbmV3X2J5X2N1cnZlX25hbWUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRUMsIEVDX0ZfRUNfS0VZX2NoZWNrX2tleSwgMCksICJFQ19LRVlfY2hlY2tfa2V5In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDLCBFQ19GX0VDX0tFWV9jb3B5LCAwKSwgIkVDX0tFWV9jb3B5In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDLCBFQ19GX0VDX0tFWV9nZW5lcmF0ZV9rZXksIDApLCAiRUNfS0VZX2dlbmVyYXRlX2tleSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQywgRUNfRl9FQ19LRVlfbmV3X21ldGhvZCwgMCksICJFQ19LRVlfbmV3X21ldGhvZCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQywgRUNfRl9FQ19LRVlfc2V0X3B1YmxpY19rZXlfYWZmaW5lX2Nvb3JkaW5hdGVzLCAwKSwgIkVDX0tFWV9zZXRfcHVibGljX2tleV9hZmZpbmVfY29vcmRpbmF0ZXMifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRUMsIEVDX0ZfRUNfUE9JTlRfYWRkLCAwKSwgIkVDX1BPSU5UX2FkZCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQywgRUNfRl9FQ19QT0lOVF9jbXAsIDApLCAiRUNfUE9JTlRfY21wIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDLCBFQ19GX0VDX1BPSU5UX2NvcHksIDApLCAiRUNfUE9JTlRfY29weSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQywgRUNfRl9FQ19QT0lOVF9kYmwsIDApLCAiRUNfUE9JTlRfZGJsIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDLCBFQ19GX0VDX1BPSU5UX2R1cCwgMCksICJFQ19QT0lOVF9kdXAifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRUMsIEVDX0ZfRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAsIDApLCAiRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRUMsIEVDX0ZfRUNfUE9JTlRfaW52ZXJ0LCAwKSwgIkVDX1BPSU5UX2ludmVydCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQywgRUNfRl9FQ19QT0lOVF9pc19hdF9pbmZpbml0eSwgMCksICJFQ19QT0lOVF9pc19hdF9pbmZpbml0eSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQywgRUNfRl9FQ19QT0lOVF9pc19vbl9jdXJ2ZSwgMCksICJFQ19QT0lOVF9pc19vbl9jdXJ2ZSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQywgRUNfRl9FQ19QT0lOVF9tYWtlX2FmZmluZSwgMCksICJFQ19QT0lOVF9tYWtlX2FmZmluZSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQywgRUNfRl9FQ19QT0lOVF9uZXcsIDApLCAiRUNfUE9JTlRfbmV3In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDLCBFQ19GX0VDX1BPSU5UX29jdDJwb2ludCwgMCksICJFQ19QT0lOVF9vY3QycG9pbnQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRUMsIEVDX0ZfRUNfUE9JTlRfcG9pbnQyb2N0LCAwKSwgIkVDX1BPSU5UX3BvaW50Mm9jdCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQywgRUNfRl9FQ19QT0lOVF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcCwgMCksICJFQ19QT0lOVF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQywgRUNfRl9FQ19QT0lOVF9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlc19HRnAsIDApLCAiRUNfUE9JTlRfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXNfR0ZwIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDLCBFQ19GX0VDX1BPSU5UX3NldF90b19pbmZpbml0eSwgMCksICJFQ19QT0lOVF9zZXRfdG9faW5maW5pdHkifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRUMsIEVDX0ZfRUNfUE9JTlRzX21ha2VfYWZmaW5lLCAwKSwgIkVDX1BPSU5Uc19tYWtlX2FmZmluZSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQywgRUNfRl9jb21wdXRlX3dOQUYsIDApLCAiY29tcHV0ZV93TkFGIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDLCBFQ19GX2QyaV9FQ1BLUGFyYW1ldGVycywgMCksICJkMmlfRUNQS1BhcmFtZXRlcnMifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRUMsIEVDX0ZfZDJpX0VDUGFyYW1ldGVycywgMCksICJkMmlfRUNQYXJhbWV0ZXJzIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDLCBFQ19GX2QyaV9FQ1ByaXZhdGVLZXksIDApLCAiZDJpX0VDUHJpdmF0ZUtleSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQywgRUNfRl9lY19HRnBfbW9udF9maWVsZF9kZWNvZGUsIDApLCAiZWNfR0ZwX21vbnRfZmllbGRfZGVjb2RlIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDLCBFQ19GX2VjX0dGcF9tb250X2ZpZWxkX2VuY29kZSwgMCksICJlY19HRnBfbW9udF9maWVsZF9lbmNvZGUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRUMsIEVDX0ZfZWNfR0ZwX21vbnRfZmllbGRfbXVsLCAwKSwgImVjX0dGcF9tb250X2ZpZWxkX211bCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQywgRUNfRl9lY19HRnBfbW9udF9maWVsZF9zZXRfdG9fb25lLCAwKSwgImVjX0dGcF9tb250X2ZpZWxkX3NldF90b19vbmUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRUMsIEVDX0ZfZWNfR0ZwX21vbnRfZmllbGRfc3FyLCAwKSwgImVjX0dGcF9tb250X2ZpZWxkX3NxciJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQywgRUNfRl9lY19HRnBfbW9udF9ncm91cF9zZXRfY3VydmUsIDApLCAiZWNfR0ZwX21vbnRfZ3JvdXBfc2V0X2N1cnZlIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDLCBFQ19GX2VjX0dGcF9zaW1wbGVfZ3JvdXBfY2hlY2tfZGlzY3JpbWluYW50LCAwKSwgImVjX0dGcF9zaW1wbGVfZ3JvdXBfY2hlY2tfZGlzY3JpbWluYW50In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDLCBFQ19GX2VjX0dGcF9zaW1wbGVfZ3JvdXBfc2V0X2N1cnZlLCAwKSwgImVjX0dGcF9zaW1wbGVfZ3JvdXBfc2V0X2N1cnZlIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDLCBFQ19GX2VjX0dGcF9zaW1wbGVfbWFrZV9hZmZpbmUsIDApLCAiZWNfR0ZwX3NpbXBsZV9tYWtlX2FmZmluZSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQywgRUNfRl9lY19HRnBfc2ltcGxlX29jdDJwb2ludCwgMCksICJlY19HRnBfc2ltcGxlX29jdDJwb2ludCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQywgRUNfRl9lY19HRnBfc2ltcGxlX3BvaW50Mm9jdCwgMCksICJlY19HRnBfc2ltcGxlX3BvaW50Mm9jdCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQywgRUNfRl9lY19HRnBfc2ltcGxlX3BvaW50X2dldF9hZmZpbmVfY29vcmRpbmF0ZXMsIDApLCAiZWNfR0ZwX3NpbXBsZV9wb2ludF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDLCBFQ19GX2VjX0dGcF9zaW1wbGVfcG9pbnRfc2V0X2FmZmluZV9jb29yZGluYXRlcywgMCksICJlY19HRnBfc2ltcGxlX3BvaW50X3NldF9hZmZpbmVfY29vcmRpbmF0ZXMifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRUMsIEVDX0ZfZWNfR0ZwX3NpbXBsZV9wb2ludHNfbWFrZV9hZmZpbmUsIDApLCAiZWNfR0ZwX3NpbXBsZV9wb2ludHNfbWFrZV9hZmZpbmUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRUMsIEVDX0ZfZWNfR0ZwX3NpbXBsZV9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlcywgMCksICJlY19HRnBfc2ltcGxlX3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDLCBFQ19GX2VjX2FzbjFfZ3JvdXAycGtwYXJhbWV0ZXJzLCAwKSwgImVjX2FzbjFfZ3JvdXAycGtwYXJhbWV0ZXJzIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDLCBFQ19GX2VjX2FzbjFfcGtwYXJhbWV0ZXJzMmdyb3VwLCAwKSwgImVjX2FzbjFfcGtwYXJhbWV0ZXJzMmdyb3VwIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDLCBFQ19GX2VjX2dyb3VwX25ldywgMCksICJlY19ncm91cF9uZXcifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRUMsIEVDX0ZfZWNfZ3JvdXBfbmV3X2N1cnZlX0dGcCwgMCksICJlY19ncm91cF9uZXdfY3VydmVfR0ZwIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDLCBFQ19GX2VjX2dyb3VwX25ld19mcm9tX2RhdGEsIDApLCAiZWNfZ3JvdXBfbmV3X2Zyb21fZGF0YSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQywgRUNfRl9lY19wb2ludF9zZXRfSnByb2plY3RpdmVfY29vcmRpbmF0ZXNfR0ZwLCAwKSwgImVjX3BvaW50X3NldF9KcHJvamVjdGl2ZV9jb29yZGluYXRlc19HRnAifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRUMsIEVDX0ZfZWNfcHJlX2NvbXBfbmV3LCAwKSwgImVjX3ByZV9jb21wX25ldyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQywgRUNfRl9lY193TkFGX211bCwgMCksICJlY193TkFGX211bCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQywgRUNfRl9lY193TkFGX3ByZWNvbXB1dGVfbXVsdCwgMCksICJlY193TkFGX3ByZWNvbXB1dGVfbXVsdCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQywgRUNfRl9pMmRfRUNQS1BhcmFtZXRlcnMsIDApLCAiaTJkX0VDUEtQYXJhbWV0ZXJzIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDLCBFQ19GX2kyZF9FQ1BhcmFtZXRlcnMsIDApLCAiaTJkX0VDUGFyYW1ldGVycyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQywgRUNfRl9pMmRfRUNQcml2YXRlS2V5LCAwKSwgImkyZF9FQ1ByaXZhdGVLZXkifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRUMsIEVDX0ZfaTJvX0VDUHVibGljS2V5LCAwKSwgImkyb19FQ1B1YmxpY0tleSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQywgRUNfRl9vMmlfRUNQdWJsaWNLZXksIDApLCAibzJpX0VDUHVibGljS2V5In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDLCAwLCBFQ19SX0JVRkZFUl9UT09fU01BTEwpLCAiQlVGRkVSX1RPT19TTUFMTCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQywgMCwgRUNfUl9DT09SRElOQVRFU19PVVRfT0ZfUkFOR0UpLCAiQ09PUkRJTkFURVNfT1VUX09GX1JBTkdFIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDLCAwLCBFQ19SX0QySV9FQ1BLUEFSQU1FVEVSU19GQUlMVVJFKSwgIkQySV9FQ1BLUEFSQU1FVEVSU19GQUlMVVJFIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDLCAwLCBFQ19SX0VDX0dST1VQX05FV19CWV9OQU1FX0ZBSUxVUkUpLCAiRUNfR1JPVVBfTkVXX0JZX05BTUVfRkFJTFVSRSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQywgMCwgRUNfUl9HRjJNX05PVF9TVVBQT1JURUQpLCAiR0YyTV9OT1RfU1VQUE9SVEVEIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDLCAwLCBFQ19SX0dST1VQMlBLUEFSQU1FVEVSU19GQUlMVVJFKSwgIkdST1VQMlBLUEFSQU1FVEVSU19GQUlMVVJFIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDLCAwLCBFQ19SX0kyRF9FQ1BLUEFSQU1FVEVSU19GQUlMVVJFKSwgIkkyRF9FQ1BLUEFSQU1FVEVSU19GQUlMVVJFIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDLCAwLCBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKSwgIklOQ09NUEFUSUJMRV9PQkpFQ1RTIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDLCAwLCBFQ19SX0lOVkFMSURfQ09NUFJFU1NFRF9QT0lOVCksICJJTlZBTElEX0NPTVBSRVNTRURfUE9JTlQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRUMsIDAsIEVDX1JfSU5WQUxJRF9DT01QUkVTU0lPTl9CSVQpLCAiSU5WQUxJRF9DT01QUkVTU0lPTl9CSVQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRUMsIDAsIEVDX1JfSU5WQUxJRF9FTkNPRElORyksICJJTlZBTElEX0VOQ09ESU5HIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDLCAwLCBFQ19SX0lOVkFMSURfRklFTEQpLCAiSU5WQUxJRF9GSUVMRCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQywgMCwgRUNfUl9JTlZBTElEX0ZPUk0pLCAiSU5WQUxJRF9GT1JNIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDLCAwLCBFQ19SX0lOVkFMSURfR1JPVVBfT1JERVIpLCAiSU5WQUxJRF9HUk9VUF9PUkRFUiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQywgMCwgRUNfUl9JTlZBTElEX1BSSVZBVEVfS0VZKSwgIklOVkFMSURfUFJJVkFURV9LRVkifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRUMsIDAsIEVDX1JfTUlTU0lOR19QQVJBTUVURVJTKSwgIk1JU1NJTkdfUEFSQU1FVEVSUyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQywgMCwgRUNfUl9NSVNTSU5HX1BSSVZBVEVfS0VZKSwgIk1JU1NJTkdfUFJJVkFURV9LRVkifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRUMsIDAsIEVDX1JfTk9OX05BTUVEX0NVUlZFKSwgIk5PTl9OQU1FRF9DVVJWRSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQywgMCwgRUNfUl9OT1RfSU5JVElBTElaRUQpLCAiTk9UX0lOSVRJQUxJWkVEIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDLCAwLCBFQ19SX1BLUEFSQU1FVEVSUzJHUk9VUF9GQUlMVVJFKSwgIlBLUEFSQU1FVEVSUzJHUk9VUF9GQUlMVVJFIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDLCAwLCBFQ19SX1BPSU5UX0FUX0lORklOSVRZKSwgIlBPSU5UX0FUX0lORklOSVRZIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDLCAwLCBFQ19SX1BPSU5UX0lTX05PVF9PTl9DVVJWRSksICJQT0lOVF9JU19OT1RfT05fQ1VSVkUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRUMsIDAsIEVDX1JfU0xPVF9GVUxMKSwgIlNMT1RfRlVMTCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQywgMCwgRUNfUl9VTkRFRklORURfR0VORVJBVE9SKSwgIlVOREVGSU5FRF9HRU5FUkFUT1IifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRUMsIDAsIEVDX1JfVU5LTk9XTl9HUk9VUCksICJVTktOT1dOX0dST1VQIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDLCAwLCBFQ19SX1VOS05PV05fT1JERVIpLCAiVU5LTk9XTl9PUkRFUiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQywgMCwgRUNfUl9XUk9OR19PUkRFUiksICJXUk9OR19PUkRFUiJ9LAorICB7MCwgTlVMTH0sCit9OwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2VjL2VjX2tleS5jIGIvY3J5cHRvL2VjL2VjX2tleS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZWY2OTgKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vZWMvZWNfa2V5LmMKQEAgLTAsMCArMSw1MTMgQEAKKy8qIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBCb2RvIE1vZWxsZXIgZm9yIHRoZSBPcGVuU1NMIHByb2plY3QuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDUgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRC4KKyAqCisgKiBQb3J0aW9ucyBvZiB0aGUgYXR0YWNoZWQgc29mdHdhcmUgKCJDb250cmlidXRpb24iKSBhcmUgZGV2ZWxvcGVkIGJ5CisgKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuLCBhbmQgYXJlIGNvbnRyaWJ1dGVkIHRvIHRoZSBPcGVuU1NMIHByb2plY3QuCisgKgorICogVGhlIENvbnRyaWJ1dGlvbiBpcyBsaWNlbnNlZCBwdXJzdWFudCB0byB0aGUgT3BlblNTTCBvcGVuIHNvdXJjZQorICogbGljZW5zZSBwcm92aWRlZCBhYm92ZS4KKyAqCisgKiBUaGUgZWxsaXB0aWMgY3VydmUgYmluYXJ5IHBvbHlub21pYWwgc29mdHdhcmUgaXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5CisgKiBTaGV1ZWxpbmcgQ2hhbmcgU2hhbnR6IGFuZCBEb3VnbGFzIFN0ZWJpbGEgb2YgU3VuIE1pY3Jvc3lzdGVtcworICogTGFib3JhdG9yaWVzLiAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9lY19rZXkuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvZWMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2VuZ2luZS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9leF9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKworI2luY2x1ZGUgImludGVybmFsLmgiCisKKworRUNfS0VZICpFQ19LRVlfbmV3KHZvaWQpIHsgcmV0dXJuIEVDX0tFWV9uZXdfbWV0aG9kKE5VTEwpOyB9CisKK0VDX0tFWSAqRUNfS0VZX25ld19tZXRob2QoY29uc3QgRU5HSU5FICplbmdpbmUpIHsKKyAgRUNfS0VZICpyZXQgPSAoRUNfS0VZICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEVDX0tFWSkpOworICBpZiAocmV0ID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfS0VZX25ld19tZXRob2QsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIG1lbXNldChyZXQsIDAsIHNpemVvZihFQ19LRVkpKTsKKworICBpZiAoZW5naW5lKSB7CisgICAgcmV0LT5lY2RzYV9tZXRoID0gRU5HSU5FX2dldF9FQ0RTQV9tZXRob2QoZW5naW5lKTsKKyAgfQorICBpZiAocmV0LT5lY2RzYV9tZXRoKSB7CisgICAgTUVUSE9EX3JlZihyZXQtPmVjZHNhX21ldGgpOworICB9CisKKyAgcmV0LT52ZXJzaW9uID0gMTsKKyAgcmV0LT5jb252X2Zvcm0gPSBQT0lOVF9DT05WRVJTSU9OX1VOQ09NUFJFU1NFRDsKKyAgcmV0LT5yZWZlcmVuY2VzID0gMTsKKworICBpZiAoIUNSWVBUT19uZXdfZXhfZGF0YShDUllQVE9fRVhfSU5ERVhfRUNfS0VZLCByZXQsICZyZXQtPmV4X2RhdGEpKSB7CisgICAgZ290byBlcnIxOworICB9CisKKyAgaWYgKHJldC0+ZWNkc2FfbWV0aCAmJiByZXQtPmVjZHNhX21ldGgtPmluaXQgJiYgIXJldC0+ZWNkc2FfbWV0aC0+aW5pdChyZXQpKSB7CisgICAgZ290byBlcnIyOworICB9CisKKyAgcmV0dXJuIHJldDsKKworZXJyMjoKKyAgQ1JZUFRPX2ZyZWVfZXhfZGF0YShDUllQVE9fRVhfSU5ERVhfRUNfS0VZLCByZXQsICZyZXQtPmV4X2RhdGEpOworZXJyMToKKyAgaWYgKHJldC0+ZWNkc2FfbWV0aCkgeworICAgIE1FVEhPRF91bnJlZihyZXQtPmVjZHNhX21ldGgpOworICB9CisgIE9QRU5TU0xfZnJlZShyZXQpOworICByZXR1cm4gTlVMTDsKK30KKworRUNfS0VZICpFQ19LRVlfbmV3X2J5X2N1cnZlX25hbWUoaW50IG5pZCkgeworICBFQ19LRVkgKnJldCA9IEVDX0tFWV9uZXcoKTsKKyAgaWYgKHJldCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0LT5ncm91cCA9IEVDX0dST1VQX25ld19ieV9jdXJ2ZV9uYW1lKG5pZCk7CisgIGlmIChyZXQtPmdyb3VwID09IE5VTEwpIHsKKyAgICBFQ19LRVlfZnJlZShyZXQpOworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgRUNfS0VZX2ZyZWUoRUNfS0VZICpyKSB7CisgIGlmIChyID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoQ1JZUFRPX2FkZCgmci0+cmVmZXJlbmNlcywgLTEsIENSWVBUT19MT0NLX0VDKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChyLT5lY2RzYV9tZXRoKSB7CisgICAgaWYgKHItPmVjZHNhX21ldGgtPmZpbmlzaCkgeworICAgICAgci0+ZWNkc2FfbWV0aC0+ZmluaXNoKHIpOworICAgIH0KKyAgICBNRVRIT0RfdW5yZWYoci0+ZWNkc2FfbWV0aCk7CisgIH0KKworICBpZiAoci0+Z3JvdXAgIT0gTlVMTCkgeworICAgIEVDX0dST1VQX2ZyZWUoci0+Z3JvdXApOworICB9CisgIGlmIChyLT5wdWJfa2V5ICE9IE5VTEwpIHsKKyAgICBFQ19QT0lOVF9mcmVlKHItPnB1Yl9rZXkpOworICB9CisgIGlmIChyLT5wcml2X2tleSAhPSBOVUxMKSB7CisgICAgQk5fY2xlYXJfZnJlZShyLT5wcml2X2tleSk7CisgIH0KKworICBDUllQVE9fZnJlZV9leF9kYXRhKENSWVBUT19FWF9JTkRFWF9FQ19LRVksIHIsICZyLT5leF9kYXRhKTsKKworICBPUEVOU1NMX2NsZWFuc2UoKHZvaWQgKilyLCBzaXplb2YoRUNfS0VZKSk7CisgIE9QRU5TU0xfZnJlZShyKTsKK30KKworRUNfS0VZICpFQ19LRVlfY29weShFQ19LRVkgKmRlc3QsIGNvbnN0IEVDX0tFWSAqc3JjKSB7CisgIGlmIChkZXN0ID09IE5VTEwgfHwgc3JjID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfS0VZX2NvcHksIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgLyogY29weSB0aGUgcGFyYW1ldGVycyAqLworICBpZiAoc3JjLT5ncm91cCkgeworICAgIC8qIFRPRE8oZm9yayk6IGR1cGxpY2F0aW5nIHRoZSBncm91cCBzZWVtcyB3YXN0ZWZ1bC4gKi8KKyAgICBjb25zdCBFQ19NRVRIT0QgKm1ldGggPSBzcmMtPmdyb3VwLT5tZXRoOworICAgIC8qIGNsZWFyIHRoZSBvbGQgZ3JvdXAgKi8KKyAgICBpZiAoZGVzdC0+Z3JvdXApIHsKKyAgICAgIEVDX0dST1VQX2ZyZWUoZGVzdC0+Z3JvdXApOworICAgIH0KKyAgICBkZXN0LT5ncm91cCA9IGVjX2dyb3VwX25ldyhtZXRoKTsKKyAgICBpZiAoZGVzdC0+Z3JvdXAgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICghRUNfR1JPVVBfY29weShkZXN0LT5ncm91cCwgc3JjLT5ncm91cCkpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgfQorCisgIC8qICBjb3B5IHRoZSBwdWJsaWMga2V5ICovCisgIGlmIChzcmMtPnB1Yl9rZXkgJiYgc3JjLT5ncm91cCkgeworICAgIGlmIChkZXN0LT5wdWJfa2V5KSB7CisgICAgICBFQ19QT0lOVF9mcmVlKGRlc3QtPnB1Yl9rZXkpOworICAgIH0KKyAgICBkZXN0LT5wdWJfa2V5ID0gRUNfUE9JTlRfbmV3KHNyYy0+Z3JvdXApOworICAgIGlmIChkZXN0LT5wdWJfa2V5ID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIUVDX1BPSU5UX2NvcHkoZGVzdC0+cHViX2tleSwgc3JjLT5wdWJfa2V5KSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9CisKKyAgLyogY29weSB0aGUgcHJpdmF0ZSBrZXkgKi8KKyAgaWYgKHNyYy0+cHJpdl9rZXkpIHsKKyAgICBpZiAoZGVzdC0+cHJpdl9rZXkgPT0gTlVMTCkgeworICAgICAgZGVzdC0+cHJpdl9rZXkgPSBCTl9uZXcoKTsKKyAgICAgIGlmIChkZXN0LT5wcml2X2tleSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIUJOX2NvcHkoZGVzdC0+cHJpdl9rZXksIHNyYy0+cHJpdl9rZXkpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIH0KKyAgLyogY29weSBtZXRob2QvZXh0cmEgZGF0YSAqLworICBDUllQVE9fZnJlZV9leF9kYXRhKENSWVBUT19FWF9JTkRFWF9FQ19LRVksIGRlc3QsICZkZXN0LT5leF9kYXRhKTsKKyAgaWYgKCFDUllQVE9fZHVwX2V4X2RhdGEoQ1JZUFRPX0VYX0lOREVYX0VDX0tFWSwgJmRlc3QtPmV4X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmMtPmV4X2RhdGEpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAvKiBjb3B5IHRoZSByZXN0ICovCisgIGRlc3QtPmVuY19mbGFnID0gc3JjLT5lbmNfZmxhZzsKKyAgZGVzdC0+Y29udl9mb3JtID0gc3JjLT5jb252X2Zvcm07CisgIGRlc3QtPnZlcnNpb24gPSBzcmMtPnZlcnNpb247CisgIGRlc3QtPmZsYWdzID0gc3JjLT5mbGFnczsKKworICByZXR1cm4gZGVzdDsKK30KKworRUNfS0VZICpFQ19LRVlfZHVwKGNvbnN0IEVDX0tFWSAqZWNfa2V5KSB7CisgIEVDX0tFWSAqcmV0ID0gRUNfS0VZX25ldygpOworICBpZiAocmV0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoRUNfS0VZX2NvcHkocmV0LCBlY19rZXkpID09IE5VTEwpIHsKKyAgICBFQ19LRVlfZnJlZShyZXQpOworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK2ludCBFQ19LRVlfdXBfcmVmKEVDX0tFWSAqcikgeworICByZXR1cm4gQ1JZUFRPX2FkZCgmci0+cmVmZXJlbmNlcywgMSwgQ1JZUFRPX0xPQ0tfRUMpID4gMTsKK30KKworY29uc3QgRUNfR1JPVVAgKkVDX0tFWV9nZXQwX2dyb3VwKGNvbnN0IEVDX0tFWSAqa2V5KSB7IHJldHVybiBrZXktPmdyb3VwOyB9CisKK2ludCBFQ19LRVlfc2V0X2dyb3VwKEVDX0tFWSAqa2V5LCBjb25zdCBFQ19HUk9VUCAqZ3JvdXApIHsKKyAgaWYgKGtleS0+Z3JvdXAgIT0gTlVMTCkgeworICAgIEVDX0dST1VQX2ZyZWUoa2V5LT5ncm91cCk7CisgIH0KKyAgLyogVE9ETyhmb3JrKTogZHVwbGljYXRpbmcgdGhlIGdyb3VwIHNlZW1zIHdhc3RlZnVsIGJ1dCBzZWUKKyAgICogfEVDX0tFWV9zZXRfY29udl9mb3JtfC4gKi8KKyAga2V5LT5ncm91cCA9IEVDX0dST1VQX2R1cChncm91cCk7CisgIHJldHVybiAoa2V5LT5ncm91cCA9PSBOVUxMKSA/IDAgOiAxOworfQorCitjb25zdCBCSUdOVU0gKkVDX0tFWV9nZXQwX3ByaXZhdGVfa2V5KGNvbnN0IEVDX0tFWSAqa2V5KSB7CisgIHJldHVybiBrZXktPnByaXZfa2V5OworfQorCitpbnQgRUNfS0VZX3NldF9wcml2YXRlX2tleShFQ19LRVkgKmtleSwgY29uc3QgQklHTlVNICpwcml2X2tleSkgeworICBpZiAoa2V5LT5wcml2X2tleSkgeworICAgIEJOX2NsZWFyX2ZyZWUoa2V5LT5wcml2X2tleSk7CisgIH0KKyAga2V5LT5wcml2X2tleSA9IEJOX2R1cChwcml2X2tleSk7CisgIHJldHVybiAoa2V5LT5wcml2X2tleSA9PSBOVUxMKSA/IDAgOiAxOworfQorCitjb25zdCBFQ19QT0lOVCAqRUNfS0VZX2dldDBfcHVibGljX2tleShjb25zdCBFQ19LRVkgKmtleSkgeworICByZXR1cm4ga2V5LT5wdWJfa2V5OworfQorCitpbnQgRUNfS0VZX3NldF9wdWJsaWNfa2V5KEVDX0tFWSAqa2V5LCBjb25zdCBFQ19QT0lOVCAqcHViX2tleSkgeworICBpZiAoa2V5LT5wdWJfa2V5ICE9IE5VTEwpIHsKKyAgICBFQ19QT0lOVF9mcmVlKGtleS0+cHViX2tleSk7CisgIH0KKyAga2V5LT5wdWJfa2V5ID0gRUNfUE9JTlRfZHVwKHB1Yl9rZXksIGtleS0+Z3JvdXApOworICByZXR1cm4gKGtleS0+cHViX2tleSA9PSBOVUxMKSA/IDAgOiAxOworfQorCit1bnNpZ25lZCBpbnQgRUNfS0VZX2dldF9lbmNfZmxhZ3MoY29uc3QgRUNfS0VZICprZXkpIHsgcmV0dXJuIGtleS0+ZW5jX2ZsYWc7IH0KKwordm9pZCBFQ19LRVlfc2V0X2VuY19mbGFncyhFQ19LRVkgKmtleSwgdW5zaWduZWQgaW50IGZsYWdzKSB7CisgIGtleS0+ZW5jX2ZsYWcgPSBmbGFnczsKK30KKworcG9pbnRfY29udmVyc2lvbl9mb3JtX3QgRUNfS0VZX2dldF9jb252X2Zvcm0oY29uc3QgRUNfS0VZICprZXkpIHsKKyAgcmV0dXJuIGtleS0+Y29udl9mb3JtOworfQorCit2b2lkIEVDX0tFWV9zZXRfY29udl9mb3JtKEVDX0tFWSAqa2V5LCBwb2ludF9jb252ZXJzaW9uX2Zvcm1fdCBjZm9ybSkgeworICBrZXktPmNvbnZfZm9ybSA9IGNmb3JtOworICBpZiAoa2V5LT5ncm91cCAhPSBOVUxMKSB7CisgICAgRUNfR1JPVVBfc2V0X3BvaW50X2NvbnZlcnNpb25fZm9ybShrZXktPmdyb3VwLCBjZm9ybSk7CisgIH0KK30KKworaW50IEVDX0tFWV9wcmVjb21wdXRlX211bHQoRUNfS0VZICprZXksIEJOX0NUWCAqY3R4KSB7CisgIGlmIChrZXktPmdyb3VwID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gRUNfR1JPVVBfcHJlY29tcHV0ZV9tdWx0KGtleS0+Z3JvdXAsIGN0eCk7Cit9CisKK2ludCBFQ19LRVlfY2hlY2tfa2V5KGNvbnN0IEVDX0tFWSAqZWNrZXkpIHsKKyAgaW50IG9rID0gMDsKKyAgQk5fQ1RYICpjdHggPSBOVUxMOworICBjb25zdCBCSUdOVU0gKm9yZGVyID0gTlVMTDsKKyAgRUNfUE9JTlQgKnBvaW50ID0gTlVMTDsKKworICBpZiAoIWVja2V5IHx8ICFlY2tleS0+Z3JvdXAgfHwgIWVja2V5LT5wdWJfa2V5KSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX0tFWV9jaGVja19rZXksIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZWNrZXktPmdyb3VwLCBlY2tleS0+cHViX2tleSkpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfS0VZX2NoZWNrX2tleSwgRUNfUl9QT0lOVF9BVF9JTkZJTklUWSk7CisgICAgZ290byBlcnI7CisgIH0KKworICBjdHggPSBCTl9DVFhfbmV3KCk7CisgIHBvaW50ID0gRUNfUE9JTlRfbmV3KGVja2V5LT5ncm91cCk7CisKKyAgaWYgKGN0eCA9PSBOVUxMIHx8CisgICAgICBwb2ludCA9PSBOVUxMKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICAvKiB0ZXN0aW5nIHdoZXRoZXIgdGhlIHB1Yl9rZXkgaXMgb24gdGhlIGVsbGlwdGljIGN1cnZlICovCisgIGlmICghRUNfUE9JTlRfaXNfb25fY3VydmUoZWNrZXktPmdyb3VwLCBlY2tleS0+cHViX2tleSwgY3R4KSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19LRVlfY2hlY2tfa2V5LCBFQ19SX1BPSU5UX0lTX05PVF9PTl9DVVJWRSk7CisgICAgZ290byBlcnI7CisgIH0KKyAgLyogdGVzdGluZyB3aGV0aGVyIHB1Yl9rZXkgKiBvcmRlciBpcyB0aGUgcG9pbnQgYXQgaW5maW5pdHkgKi8KKyAgLyogVE9ETyhmb3JrKTogY2FuIHRoaXMgYmUgc2tpcHBlZCBpZiB0aGUgY29mYWN0b3IgaXMgb25lIG9yIGlmIHdlJ3JlIGFib3V0CisgICAqIHRvIGNoZWNrIHRoZSBwcml2YXRlIGtleSwgYmVsb3c/ICovCisgIG9yZGVyID0gJmVja2V5LT5ncm91cC0+b3JkZXI7CisgIGlmIChCTl9pc196ZXJvKG9yZGVyKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19LRVlfY2hlY2tfa2V5LCBFQ19SX0lOVkFMSURfR1JPVVBfT1JERVIpOworICAgIGdvdG8gZXJyOworICB9CisgIGlmICghRUNfUE9JTlRfbXVsKGVja2V5LT5ncm91cCwgcG9pbnQsIE5VTEwsIGVja2V5LT5wdWJfa2V5LCBvcmRlciwgY3R4KSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19LRVlfY2hlY2tfa2V5LCBFUlJfUl9FQ19MSUIpOworICAgIGdvdG8gZXJyOworICB9CisgIGlmICghRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZWNrZXktPmdyb3VwLCBwb2ludCkpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfS0VZX2NoZWNrX2tleSwgRUNfUl9XUk9OR19PUkRFUik7CisgICAgZ290byBlcnI7CisgIH0KKyAgLyogaW4gY2FzZSB0aGUgcHJpdl9rZXkgaXMgcHJlc2VudCA6CisgICAqIGNoZWNrIGlmIGdlbmVyYXRvciAqIHByaXZfa2V5ID09IHB1Yl9rZXkKKyAgICovCisgIGlmIChlY2tleS0+cHJpdl9rZXkpIHsKKyAgICBpZiAoQk5fY21wKGVja2V5LT5wcml2X2tleSwgb3JkZXIpID49IDApIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19LRVlfY2hlY2tfa2V5LCBFQ19SX1dST05HX09SREVSKTsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBpZiAoIUVDX1BPSU5UX211bChlY2tleS0+Z3JvdXAsIHBvaW50LCBlY2tleS0+cHJpdl9rZXksIE5VTEwsIE5VTEwsIGN0eCkpIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19LRVlfY2hlY2tfa2V5LCBFUlJfUl9FQ19MSUIpOworICAgICAgZ290byBlcnI7CisgICAgfQorICAgIGlmIChFQ19QT0lOVF9jbXAoZWNrZXktPmdyb3VwLCBwb2ludCwgZWNrZXktPnB1Yl9rZXksIGN0eCkgIT0gMCkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX0tFWV9jaGVja19rZXksIEVDX1JfSU5WQUxJRF9QUklWQVRFX0tFWSk7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0KKyAgb2sgPSAxOworCitlcnI6CisgIGlmIChjdHggIT0gTlVMTCkKKyAgICBCTl9DVFhfZnJlZShjdHgpOworICBpZiAocG9pbnQgIT0gTlVMTCkKKyAgICBFQ19QT0lOVF9mcmVlKHBvaW50KTsKKyAgcmV0dXJuIG9rOworfQorCitpbnQgRUNfS0VZX3NldF9wdWJsaWNfa2V5X2FmZmluZV9jb29yZGluYXRlcyhFQ19LRVkgKmtleSwgQklHTlVNICp4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklHTlVNICp5KSB7CisgIEJOX0NUWCAqY3R4ID0gTlVMTDsKKyAgQklHTlVNICp0eCwgKnR5OworICBFQ19QT0lOVCAqcG9pbnQgPSBOVUxMOworICBpbnQgb2sgPSAwOworCisgIGlmICgha2V5IHx8ICFrZXktPmdyb3VwIHx8ICF4IHx8ICF5KSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX0tFWV9zZXRfcHVibGljX2tleV9hZmZpbmVfY29vcmRpbmF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBjdHggPSBCTl9DVFhfbmV3KCk7CisgIHBvaW50ID0gRUNfUE9JTlRfbmV3KGtleS0+Z3JvdXApOworCisgIGlmIChjdHggPT0gTlVMTCB8fAorICAgICAgcG9pbnQgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgdHggPSBCTl9DVFhfZ2V0KGN0eCk7CisgIHR5ID0gQk5fQ1RYX2dldChjdHgpOworCisgIGlmICghRUNfUE9JTlRfc2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAoa2V5LT5ncm91cCwgcG9pbnQsIHgsIHksIGN0eCkgfHwKKyAgICAgICFFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcChrZXktPmdyb3VwLCBwb2ludCwgdHgsIHR5LCBjdHgpKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICAvKiBDaGVjayBpZiByZXRyaWV2ZWQgY29vcmRpbmF0ZXMgbWF0Y2ggb3JpZ2luYWxzOiBpZiBub3QgdmFsdWVzCisgICAqIGFyZSBvdXQgb2YgcmFuZ2UuICovCisgIGlmIChCTl9jbXAoeCwgdHgpIHx8IEJOX2NtcCh5LCB0eSkpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfS0VZX3NldF9wdWJsaWNfa2V5X2FmZmluZV9jb29yZGluYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICBFQ19SX0NPT1JESU5BVEVTX09VVF9PRl9SQU5HRSk7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAoIUVDX0tFWV9zZXRfcHVibGljX2tleShrZXksIHBvaW50KSkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKEVDX0tFWV9jaGVja19rZXkoa2V5KSA9PSAwKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBvayA9IDE7CisKK2VycjoKKyAgaWYgKGN0eCkKKyAgICBCTl9DVFhfZnJlZShjdHgpOworICBpZiAocG9pbnQpCisgICAgRUNfUE9JTlRfZnJlZShwb2ludCk7CisgIHJldHVybiBvazsKK30KKworaW50IEVDX0tFWV9nZW5lcmF0ZV9rZXkoRUNfS0VZICplY2tleSkgeworICBpbnQgb2sgPSAwOworICBCTl9DVFggKmN0eCA9IE5VTEw7CisgIEJJR05VTSAqcHJpdl9rZXkgPSBOVUxMLCAqb3JkZXIgPSBOVUxMOworICBFQ19QT0lOVCAqcHViX2tleSA9IE5VTEw7CisKKyAgaWYgKCFlY2tleSB8fCAhZWNrZXktPmdyb3VwKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX0tFWV9nZW5lcmF0ZV9rZXksIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBvcmRlciA9IEJOX25ldygpOworICBjdHggPSBCTl9DVFhfbmV3KCk7CisKKyAgaWYgKG9yZGVyID09IE5VTEwgfHwKKyAgICAgIGN0eCA9PSBOVUxMKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAoZWNrZXktPnByaXZfa2V5ID09IE5VTEwpIHsKKyAgICBwcml2X2tleSA9IEJOX25ldygpOworICAgIGlmIChwcml2X2tleSA9PSBOVUxMKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcHJpdl9rZXkgPSBlY2tleS0+cHJpdl9rZXk7CisgIH0KKworICBpZiAoIUVDX0dST1VQX2dldF9vcmRlcihlY2tleS0+Z3JvdXAsIG9yZGVyLCBjdHgpKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBkbyB7CisgICAgaWYgKCFCTl9yYW5kX3JhbmdlKHByaXZfa2V5LCBvcmRlcikpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfSB3aGlsZSAoQk5faXNfemVybyhwcml2X2tleSkpOworCisgIGlmIChlY2tleS0+cHViX2tleSA9PSBOVUxMKSB7CisgICAgcHViX2tleSA9IEVDX1BPSU5UX25ldyhlY2tleS0+Z3JvdXApOworICAgIGlmIChwdWJfa2V5ID09IE5VTEwpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBwdWJfa2V5ID0gZWNrZXktPnB1Yl9rZXk7CisgIH0KKworICBpZiAoIUVDX1BPSU5UX211bChlY2tleS0+Z3JvdXAsIHB1Yl9rZXksIHByaXZfa2V5LCBOVUxMLCBOVUxMLCBjdHgpKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBlY2tleS0+cHJpdl9rZXkgPSBwcml2X2tleTsKKyAgZWNrZXktPnB1Yl9rZXkgPSBwdWJfa2V5OworCisgIG9rID0gMTsKKworZXJyOgorICBpZiAob3JkZXIpCisgICAgQk5fZnJlZShvcmRlcik7CisgIGlmIChwdWJfa2V5ICE9IE5VTEwgJiYgZWNrZXktPnB1Yl9rZXkgPT0gTlVMTCkKKyAgICBFQ19QT0lOVF9mcmVlKHB1Yl9rZXkpOworICBpZiAocHJpdl9rZXkgIT0gTlVMTCAmJiBlY2tleS0+cHJpdl9rZXkgPT0gTlVMTCkKKyAgICBCTl9mcmVlKHByaXZfa2V5KTsKKyAgaWYgKGN0eCAhPSBOVUxMKQorICAgIEJOX0NUWF9mcmVlKGN0eCk7CisgIHJldHVybiBvazsKK30KKworaW50IEVDX0tFWV9nZXRfZXhfbmV3X2luZGV4KGxvbmcgYXJnbCwgdm9pZCAqYXJncCwgQ1JZUFRPX0VYX25ldyAqbmV3X2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JZUFRPX0VYX2R1cCAqZHVwX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JZUFRPX0VYX2ZyZWUgKmZyZWVfZnVuYykgeworICByZXR1cm4gQ1JZUFRPX2dldF9leF9uZXdfaW5kZXgoQ1JZUFRPX0VYX0lOREVYX0VDX0tFWSwgYXJnbCwgYXJncCwgbmV3X2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBfZnVuYywgZnJlZV9mdW5jKTsKK30KKworaW50IEVDX0tFWV9zZXRfZXhfZGF0YShFQ19LRVkgKmQsIGludCBpZHgsIHZvaWQgKmFyZykgeworICByZXR1cm4gQ1JZUFRPX3NldF9leF9kYXRhKCZkLT5leF9kYXRhLCBpZHgsIGFyZyk7Cit9CisKK3ZvaWQgKkVDX0tFWV9nZXRfZXhfZGF0YShjb25zdCBFQ19LRVkgKmQsIGludCBpZHgpIHsKKyAgcmV0dXJuIENSWVBUT19nZXRfZXhfZGF0YSgmZC0+ZXhfZGF0YSwgaWR4KTsKK30KZGlmZiAtLWdpdCBhL2NyeXB0by9lYy9lY19rZXkuaCBiL2NyeXB0by9lYy9lY19rZXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTQ4NDZiCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2VjL2VjX2tleS5oCkBAIC0wLDAgKzEsMjYwIEBACisvKiBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQm9kbyBNb2VsbGVyIGZvciB0aGUgT3BlblNTTCBwcm9qZWN0LgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA1IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFMTCBSSUdIVFMgUkVTRVJWRUQuCisgKgorICogUG9ydGlvbnMgb2YgdGhlIGF0dGFjaGVkIHNvZnR3YXJlICgiQ29udHJpYnV0aW9uIikgYXJlIGRldmVsb3BlZCBieQorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiwgYW5kIGFyZSBjb250cmlidXRlZCB0byB0aGUgT3BlblNTTCBwcm9qZWN0LgorICoKKyAqIFRoZSBDb250cmlidXRpb24gaXMgbGljZW5zZWQgcHVyc3VhbnQgdG8gdGhlIE9wZW5TU0wgb3BlbiBzb3VyY2UKKyAqIGxpY2Vuc2UgcHJvdmlkZWQgYWJvdmUuCisgKgorICogVGhlIGVsbGlwdGljIGN1cnZlIGJpbmFyeSBwb2x5bm9taWFsIHNvZnR3YXJlIGlzIG9yaWdpbmFsbHkgd3JpdHRlbiBieQorICogU2hldWVsaW5nIENoYW5nIFNoYW50eiBhbmQgRG91Z2xhcyBTdGViaWxhIG9mIFN1biBNaWNyb3N5c3RlbXMKKyAqIExhYm9yYXRvcmllcy4gKi8KKworI2lmbmRlZiBPUEVOU1NMX0hFQURFUl9FQ19LRVlfSAorI2RlZmluZSBPUEVOU1NMX0hFQURFUl9FQ19LRVlfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9iYXNlLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2VjLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lbmdpbmUuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V4X2RhdGEuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIGVjX2tleS5oIGNvbmF0aW5zIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZSBlbGxpcHRpYy1jdXJ2ZSBwb2ludHMgdGhhdCBhcmUKKyAqIHB1YmxpYy9wcml2YXRlIGtleXMuICovCisKKworLyogRUMga2V5IG9iamVjdHMuICovCisKKy8qIEVDX0tFWV9uZXcgcmV0dXJucyBhIGZyZXNoIHxFQ19LRVl8IG9iamVjdCBvciBOVUxMIG9uIGVycm9yLiAqLworRUNfS0VZICpFQ19LRVlfbmV3KHZvaWQpOworCisvKiBFQ19LRVlfbmV3X21ldGhvZCBhY3RzIHRoZSBzYW1lIGFzIHxFQ19LRVlfbmV3fCwgYnV0IHRha2VzIGFuIGV4cGxpY2l0CisgKiB8RU5HSU5FfC4gKi8KK0VDX0tFWSAqRUNfS0VZX25ld19tZXRob2QoY29uc3QgRU5HSU5FICplbmdpbmUpOworCisvKiBFQ19LRVlfbmV3X2J5X2N1cnZlX25hbWUgcmV0dXJucyBhIGZyZXNoIEVDX0tFWSBmb3IgZ3JvdXAgc3BlY2lmaWVkIGJ5IHxuaWR8CisgKiBvciBOVUxMIG9uIGVycm9yLiAqLworRUNfS0VZICpFQ19LRVlfbmV3X2J5X2N1cnZlX25hbWUoaW50IG5pZCk7CisKKy8qIEVDX0tFWV9mcmVlIGZyZWVzIGFsbCB0aGUgZGF0YSBvd25lZCBieSB8a2V5fCBhbmQgfGtleXwgaXRzZWxmLiAqLwordm9pZCBFQ19LRVlfZnJlZShFQ19LRVkgKmtleSk7CisKKy8qIEVDX0tFWV9jb3B5IHNldHMgfGRzdHwgZXF1YWwgdG8gfHNyY3wgYW5kIHJldHVybnMgfGRzdHwgb3IgTlVMTCBvbiBlcnJvci4gKi8KK0VDX0tFWSAqRUNfS0VZX2NvcHkoRUNfS0VZICpkc3QsIGNvbnN0IEVDX0tFWSAqc3JjKTsKKworLyogRUNfS0VZX2R1cCByZXR1cm5zIGEgZnJlc2ggY29weSBvZiB8c3JjfCBvciBOVUxMIG9uIGVycm9yLiAqLworRUNfS0VZICpFQ19LRVlfZHVwKGNvbnN0IEVDX0tFWSAqc3JjKTsKKworLyogRUNfS0VZX3VwX3JlZiBpbmNyZWFzZXMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB8a2V5fC4gSXQgcmV0dXJucyBvbmUgb24KKyAqIHN1Y2Nlc3MgYW5kIHplcm8gb3RoZXJ3aXNlLiAqLworaW50IEVDX0tFWV91cF9yZWYoRUNfS0VZICprZXkpOworCisvKiBFQ19LRVlfZ2V0MF9ncm91cCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgfEVDX0dST1VQfCBvYmplY3QgaW5zaWRlIHxrZXl8LiAqLworY29uc3QgRUNfR1JPVVAgKkVDX0tFWV9nZXQwX2dyb3VwKGNvbnN0IEVDX0tFWSAqa2V5KTsKKworLyogRUNfS0VZX3NldF9ncm91cCBzZXRzIHRoZSB8RUNfR1JPVVB8IG9iamVjdCB0aGF0IHxrZXl8IHdpbGwgdXNlIHRvIHxncm91cHwuCisgKiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG90aGVyd2lzZS4gKi8KK2ludCBFQ19LRVlfc2V0X2dyb3VwKEVDX0tFWSAqa2V5LCBjb25zdCBFQ19HUk9VUCAqZ3JvdXApOworCisvKiBFQ19LRVlfZ2V0MF9wcml2YXRlX2tleSByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgcHJpdmF0ZSBrZXkgaW5zaWRlIHxrZXl8LiAqLworY29uc3QgQklHTlVNICpFQ19LRVlfZ2V0MF9wcml2YXRlX2tleShjb25zdCBFQ19LRVkgKmtleSk7CisKKy8qIEVDX0tFWV9zZXRfcHJpdmF0ZV9rZXkgc2V0cyB0aGUgcHJpdmF0ZSBrZXkgb2YgfGtleXwgdG8gfHByaXZ8LiBJdCByZXR1cm5zCisgKiBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvdGhlcndpc2UuICovCitpbnQgRUNfS0VZX3NldF9wcml2YXRlX2tleShFQ19LRVkgKmtleSwgY29uc3QgQklHTlVNICpwcnYpOworCisvKiBFQ19LRVlfZ2V0MF9wdWJsaWNfa2V5IHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBwdWJsaWMga2V5IHBvaW50IGluc2lkZQorICogfGtleXwuICovCitjb25zdCBFQ19QT0lOVCAqRUNfS0VZX2dldDBfcHVibGljX2tleShjb25zdCBFQ19LRVkgKmtleSk7CisKKy8qIEVDX0tFWV9zZXRfcHVibGljX2tleSBzZXRzIHRoZSBwdWJsaWMga2V5IG9mIHxrZXl8IHRvIHxwdWJ8LCBieSBjb3B5aW5nIGl0LgorICogSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvdGhlcndpc2UuICovCitpbnQgRUNfS0VZX3NldF9wdWJsaWNfa2V5KEVDX0tFWSAqa2V5LCBjb25zdCBFQ19QT0lOVCAqcHViKTsKKworI2RlZmluZSBFQ19QS0VZX05PX1BBUkFNRVRFUlMgMHgwMDEKKyNkZWZpbmUgRUNfUEtFWV9OT19QVUJLRVkgMHgwMDIKKworLyogRUNfS0VZX2dldF9lbmNfZmxhZ3MgcmV0dXJucyB0aGUgZW5jb2RpbmcgZmxhZ3MgZm9yIHxrZXl8LCB3aGljaCBpcyBhCisgKiBiaXR3aXNlLU9SIG9mIHxFQ19QS0VZXyp8IHZhbHVlcy4gKi8KK3Vuc2lnbmVkIEVDX0tFWV9nZXRfZW5jX2ZsYWdzKGNvbnN0IEVDX0tFWSAqa2V5KTsKKworLyogRUNfS0VZX3NldF9lbmNfZmxhZ3Mgc2V0cyB0aGUgZW5jb2RpbmcgZmxhZ3MgZm9yIHxrZXl8LCB3aGljaCBpcyBhCisgKiBiaXR3aXNlLU9SIG9mIHxFQ19QS0VZXyp8IHZhbHVlcy4gKi8KK3ZvaWQgRUNfS0VZX3NldF9lbmNfZmxhZ3MoRUNfS0VZICprZXksIHVuc2lnbmVkIGZsYWdzKTsKKworLyogRUNfS0VZX2dldF9jb252X2Zvcm0gcmV0dXJucyB0aGUgY29udmVyc2F0aW9uIGZvcm0gdGhhdCB3aWxsIGJlIHVzZWQgYnkKKyAqIHxrZXl8LiAqLworcG9pbnRfY29udmVyc2lvbl9mb3JtX3QgRUNfS0VZX2dldF9jb252X2Zvcm0oY29uc3QgRUNfS0VZICprZXkpOworCisvKiBFQ19LRVlfc2V0X2NvbnZfZm9ybSBzZXRzIHRoZSBjb252ZXJzaW9uIGZvcm0gdG8gYmUgdXNlZCBieSB8a2V5fC4gKi8KK3ZvaWQgRUNfS0VZX3NldF9jb252X2Zvcm0oRUNfS0VZICprZXksIHBvaW50X2NvbnZlcnNpb25fZm9ybV90IGNmb3JtKTsKKworLyogRUNfS0VZX3ByZWNvbXB1dGVfbXVsdCBwcmVjb21wdXRlcyBtdWx0aXBsaWVzIG9mIHRoZSBnZW5lcmF0b3Igb2YgdGhlCisgKiB1bmRlcmx5aW5nIGdyb3VwIGluIG9yZGVyIHRvIHNwZWVkIHVwIG9wZXJhdGlvbnMgdGhhdCBjYWxjdWxhdGUgZ2VuZXJhdG9yCisgKiBtdWx0aXBsZXMuIElmIHxjdHh8IGlzIG5vdCBOVUxMLCBpdCBtYXkgYmUgdXNlZC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcworICogYW5kIHplcm8gb3RoZXJ3aXNlLiAqLworaW50IEVDX0tFWV9wcmVjb21wdXRlX211bHQoRUNfS0VZICprZXksIEJOX0NUWCAqY3R4KTsKKworLyogRUNfS0VZX2NoZWNrX2tleSBwZXJmb3JtcyBzZXZlcmFsIGNoZWNrcyBvbiB8a2V5fCAocG9zc2libHkgaW5jbHVkaW5nIGFuCisgKiBleHBlbnNpdmUgY2hlY2sgdGhhdCB0aGUgcHVibGljIGtleSBpcyBpbiB0aGUgcHJpbWFyeSBzdWJncm91cCkuIEl0IHJldHVybnMKKyAqIG9uZSBpZiBhbGwgY2hlY2tzIHBhc3MgYW5kIHplcm8gb3RoZXJ3aXNlLiBJZiBpdCByZXR1cm5zIHplcm8gdGhlbiBkZXRhaWwKKyAqIGFib3V0IHRoZSBwcm9ibGVtIGNhbiBiZSBmb3VuZCBvbiB0aGUgZXJyb3Igc3RhY2suICovCitpbnQgRUNfS0VZX2NoZWNrX2tleShjb25zdCBFQ19LRVkgKmtleSk7CisKKy8qIEVDX0tFWV9zZXRfcHVibGljX2tleV9hZmZpbmVfY29vcmRpbmF0ZXMgc2V0cyB0aGUgcHVibGljIGtleSBpbiB8a2V5fCB0bworICogKHx4fCwgfHl8KS4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvdGhlcndpc2UuICovCitpbnQgRUNfS0VZX3NldF9wdWJsaWNfa2V5X2FmZmluZV9jb29yZGluYXRlcyhFQ19LRVkgKmtleSwgQklHTlVNICp4LCBCSUdOVU0gKnkpOworCisKKy8qIEtleSBnZW5lcmF0aW9uLiAqLworCisvKiBFQ19LRVlfZ2VuZXJhdGVfa2V5IGdlbmVyYXRlcyBhIHJhbmRvbSwgcHJpdmF0ZSBrZXksIGNhbGN1bGF0ZXMgdGhlCisgKiBjb3JyZXNwb25kaW5nIHB1YmxpYyBrZXkgYW5kIHN0b3JlcyBib3RoIGluIHxrZXl8LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzCisgKiBvciB6ZXJvIG90aGVyd2lzZS4gKi8KK2ludCBFQ19LRVlfZ2VuZXJhdGVfa2V5KEVDX0tFWSAqa2V5KTsKKworCisvKiBTZXJpYWxpc2F0aW9uLiAqLworCisvKiBkMmlfRUNQcml2YXRlS2V5IHBhcnNlcyBhbiBBU04uMSwgREVSLWVuY29kZWQsIHByaXZhdGUga2V5IGZyb20gfGxlbnwgYnl0ZXMKKyAqIGF0IHwqaW5wfC4gSWYgfG91dF9rZXl8IGlzIG5vdCBOVUxMIHRoZW4sIG9uIGV4aXQsIGEgcG9pbnRlciB0byB0aGUgcmVzdWx0CisgKiBpcyBpbiB8Km91dF9rZXl8LiBJZiB8Km91dF9rZXl8IGlzIGFscmVhZHkgbm9uLU5VTEwgb24gZW50cnkgdGhlbiB0aGUgcmVzdWx0CisgKiBpcyB3cml0dGVuIGRpcmVjdGx5IGludG8gfCpvdXRfa2V5fCwgb3RoZXJ3aXNlIGEgZnJlc2ggfEVDX0tFWXwgaXMKKyAqIGFsbG9jYXRlZC4gT24gc3VjY2Vzc2Z1bCBleGl0LCB8KmlucHwgaXMgYWR2YW5jZWQgcGFzdCB0aGUgREVSIHN0cnVjdHVyZS4gSXQKKyAqIHJldHVybnMgdGhlIHJlc3VsdCBvciBOVUxMIG9uIGVycm9yLiAqLworRUNfS0VZICpkMmlfRUNQcml2YXRlS2V5KEVDX0tFWSAqKm91dF9rZXksIGNvbnN0IHVpbnQ4X3QgKippbnAsIGxvbmcgbGVuKTsKKworLyogaTJkX0VDUGFyYW1ldGVycyBtYXJzaGFscyBhbiBFQyBwcml2YXRlIGtleSBmcm9tIHxrZXl8IHRvIGFuIEFTTi4xLCBERVIKKyAqIHN0cnVjdHVyZS4gSWYgfG91dHB8IGlzIG5vdCBOVUxMIHRoZW4gdGhlIHJlc3VsdCBpcyB3cml0dGVuIHRvIHwqb3V0cHwgYW5kCisgKiB8Km91dHB8IGlzIGFkdmFuY2VkIGp1c3QgcGFzdCB0aGUgb3V0cHV0LiBJdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4KKyAqIHRoZSByZXN1bHQsIHdoZXRoZXIgd3JpdHRlbiBvciBub3QsIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IuICovCitpbnQgaTJkX0VDUHJpdmF0ZUtleShjb25zdCBFQ19LRVkgKmtleSwgdWludDhfdCAqKm91dHApOworCisvKiBkMmlfRUNQYXJhbWV0ZXJzIHBhcnNlcyBhbiBBU04uMSwgREVSLWVuY29kZWQsIHNldCBvZiBFQyBwYXJhbWV0ZXJzIGZyb20KKyAqIHxsZW58IGJ5dGVzIGF0IHwqaW5wfC4gSWYgfG91dF9rZXl8IGlzIG5vdCBOVUxMIHRoZW4sIG9uIGV4aXQsIGEgcG9pbnRlciB0bworICogdGhlIHJlc3VsdCBpcyBpbiB8Km91dF9rZXl8LiBJZiB8Km91dF9rZXl8IGlzIGFscmVhZHkgbm9uLU5VTEwgb24gZW50cnkgdGhlbgorICogdGhlIHJlc3VsdCBpcyB3cml0dGVuIGRpcmVjdGx5IGludG8gfCpvdXRfa2V5fCwgb3RoZXJ3aXNlIGEgZnJlc2ggfEVDX0tFWXwKKyAqIGlzIGFsbG9jYXRlZC4gT24gc3VjY2Vzc2Z1bCBleGl0LCB8KmlucHwgaXMgYWR2YW5jZWQgcGFzdCB0aGUgREVSIHN0cnVjdHVyZS4KKyAqIEl0IHJldHVybnMgdGhlIHJlc3VsdCBvciBOVUxMIG9uIGVycm9yLiAqLworRUNfS0VZICpkMmlfRUNQYXJhbWV0ZXJzKEVDX0tFWSAqKm91dF9rZXksIGNvbnN0IHVpbnQ4X3QgKippbnAsIGxvbmcgbGVuKTsKKworLyogaTJkX0VDUGFyYW1ldGVycyBtYXJzaGFscyBFQyBwYXJhbWV0ZXJzIGZyb20gfGtleXwgdG8gYW4gQVNOLjEsIERFUgorICogc3RydWN0dXJlLiBJZiB8b3V0cHwgaXMgbm90IE5VTEwgdGhlbiB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8gfCpvdXRwfCBhbmQKKyAqIHwqb3V0cHwgaXMgYWR2YW5jZWQganVzdCBwYXN0IHRoZSBvdXRwdXQuIEl0IHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBpbgorICogdGhlIHJlc3VsdCwgd2hldGhlciB3cml0dGVuIG9yIG5vdCwgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvci4gKi8KK2ludCBpMmRfRUNQYXJhbWV0ZXJzKGNvbnN0IEVDX0tFWSAqa2V5LCB1aW50OF90ICoqb3V0cCk7CisKKy8qIG8yaV9FQ1B1YmxpY0tleSBwYXJzZXMgYW4gRUMgcG9pbnQgZnJvbSB8bGVufCBieXRlcyBhdCB8KmlucHwgaW50bworICogfCpvdXRfa2V5fC4gTm90ZSB0aGF0IHRoaXMgZGlmZmVycyBmcm9tIHRoZSBkMmkgZm9ybWF0IGluIHRoYXQgfCpvdXRfa2V5fAorICogbXVzdCBiZSBub24tTlVMTC4gT24gc3VjY2Vzc2Z1bCBleGl0LCB8KmlucHwgaXMgYWR2YW5jZWQgcGFzdCB0aGUgREVSCisgKiBzdHJ1Y3R1cmUuIEl0IHJldHVybnMgfCpvdXRfa2V5fCBvciBOVUxMIG9uIGVycm9yLiAqLworRUNfS0VZICpvMmlfRUNQdWJsaWNLZXkoRUNfS0VZICoqb3V0X2tleSwgY29uc3QgdWludDhfdCAqKmlucCwgbG9uZyBsZW4pOworCisvKiBpMm9fRUNQdWJsaWNLZXkgbWFyc2hhbHMgYW4gRUMgcG9pbnQgZnJvbSB8a2V5fC4gSWYgfG91dHB8IGlzIG5vdCBOVUxMIHRoZW4KKyAqIHRoZSByZXN1bHQgaXMgd3JpdHRlbiB0byB8Km91dHB8IGFuZCB8Km91dHB8IGlzIGFkdmFuY2VkIGp1c3QgcGFzdCB0aGUKKyAqIG91dHB1dC4gSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSByZXN1bHQsIHdoZXRoZXIgd3JpdHRlbiBvcgorICogbm90LCBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yLiAqLworaW50IGkyb19FQ1B1YmxpY0tleShjb25zdCBFQ19LRVkgKmtleSwgdW5zaWduZWQgY2hhciAqKm91dHApOworCisKKy8qIGV4X2RhdGEgZnVuY3Rpb25zLgorICoKKyAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgd3JhcHBlcnMuIFNlZSB8ZXhfZGF0YS5ofCBmb3IgZGV0YWlscy4gKi8KKworaW50IEVDX0tFWV9nZXRfZXhfbmV3X2luZGV4KGxvbmcgYXJnbCwgdm9pZCAqYXJncCwgQ1JZUFRPX0VYX25ldyAqbmV3X2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JZUFRPX0VYX2R1cCAqZHVwX2Z1bmMsIENSWVBUT19FWF9mcmVlICpmcmVlX2Z1bmMpOworaW50IEVDX0tFWV9zZXRfZXhfZGF0YShFQ19LRVkgKnIsIGludCBpZHgsIHZvaWQgKmFyZyk7Cit2b2lkICpFQ19LRVlfZ2V0X2V4X2RhdGEoY29uc3QgRUNfS0VZICpyLCBpbnQgaWR4KTsKKworCisvKiBFQ0RTQSBtZXRob2QuICovCisKKy8qIGVjZHNhX21ldGhvZF9zdCBpcyBhIHN0cnVjdHVyZSBvZiBmdW5jdGlvbiBwb2ludGVycyBmb3IgaW1wbGVtZW50aW5nIEVDRFNBLgorICogU2VlIGVuZ2luZS5oLiAqLworc3RydWN0IGVjZHNhX21ldGhvZF9zdCB7CisgIHN0cnVjdCBvcGVuc3NsX21ldGhvZF9jb21tb25fc3QgY29tbW9uOworCisgIHZvaWQgKmFwcF9kYXRhOworCisgIGludCAoKmluaXQpKEVDX0tFWSAqa2V5KTsKKyAgaW50ICgqZmluaXNoKShFQ19LRVkgKmtleSk7CisKKyAgLyogc2l6ZSByZXR1cm5zIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIERFUiBlbmNvZGVkLCBFQ0RTQSBzaWduYXR1cmUKKyAgICogcmVzdWx0aW5nIGZyb20gfGtleXwuICovCisgIHNpemVfdCAoKnNpemUpKGNvbnN0IEVDX0tFWSAqa2V5KTsKKworICAvKiBzaWduIG1hdGNoZXMgdGhlIGFyZ3VtZW50cyBhbmQgYmVoYXZpb3VyIG9mIHxFQ0RTQV9zaWdufC4gKi8KKyAgaW50ICgqc2lnbikoY29uc3QgdWludDhfdCAqZGlnZXN0LCBzaXplX3QgZGlnZXN0X2xlbiwgdWludDhfdCAqc2lnLAorICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKnNpZ19sZW4sIEVDX0tFWSAqZWNrZXkpOworCisgIC8qIHZlcmlmeSBtYXRjaGVzIHRoZSBhcmd1bWVudHMgYW5kIGJlaGF2aW91ciBvZiB8RUNEU0FfdmVyaWZ5fC4gKi8KKyAgaW50ICgqdmVyaWZ5KShjb25zdCB1aW50OF90ICpkaWdlc3QsIHNpemVfdCBkaWdlc3RfbGVuLCBjb25zdCB1aW50OF90ICpzaWcsCisgICAgICAgICAgICAgICAgc2l6ZV90IHNpZ19sZW4sIEVDX0tFWSAqZWNrZXkpOworfTsKKworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30gIC8qIGV4dGVybiBDICovCisjZW5kaWYKKworI2VuZGlmICAvKiBPUEVOU1NMX0hFQURFUl9FQ19LRVlfSCAqLwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2VjL2VjX21vbnRnb21lcnkuYyBiL2NyeXB0by9lYy9lY19tb250Z29tZXJ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIwNDU1NgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9lYy9lY19tb250Z29tZXJ5LmMKQEAgLTAsMCArMSwyOTYgQEAKKy8qIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBCb2RvIE1vZWxsZXIgYW5kIE5pbHMgTGFyc2NoIGZvciB0aGUgT3BlblNTTCBwcm9qZWN0LgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA1IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFMTCBSSUdIVFMgUkVTRVJWRUQuCisgKgorICogUG9ydGlvbnMgb2YgdGhlIGF0dGFjaGVkIHNvZnR3YXJlICgiQ29udHJpYnV0aW9uIikgYXJlIGRldmVsb3BlZCBieQorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiwgYW5kIGFyZSBjb250cmlidXRlZCB0byB0aGUgT3BlblNTTCBwcm9qZWN0LgorICoKKyAqIFRoZSBDb250cmlidXRpb24gaXMgbGljZW5zZWQgcHVyc3VhbnQgdG8gdGhlIE9wZW5TU0wgb3BlbiBzb3VyY2UKKyAqIGxpY2Vuc2UgcHJvdmlkZWQgYWJvdmUuCisgKgorICogVGhlIGVsbGlwdGljIGN1cnZlIGJpbmFyeSBwb2x5bm9taWFsIHNvZnR3YXJlIGlzIG9yaWdpbmFsbHkgd3JpdHRlbiBieQorICogU2hldWVsaW5nIENoYW5nIFNoYW50eiBhbmQgRG91Z2xhcyBTdGViaWxhIG9mIFN1biBNaWNyb3N5c3RlbXMKKyAqIExhYm9yYXRvcmllcy4gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvZWMuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisKK2NvbnN0IEVDX01FVEhPRCAqRUNfR0ZwX21vbnRfbWV0aG9kKHZvaWQpIHsKKyAgc3RhdGljIGNvbnN0IEVDX01FVEhPRCByZXQgPSB7RUNfRkxBR1NfREVGQVVMVF9PQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjX0dGcF9tb250X2dyb3VwX2luaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjX0dGcF9tb250X2dyb3VwX2ZpbmlzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNfR0ZwX21vbnRfZ3JvdXBfY2xlYXJfZmluaXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY19HRnBfbW9udF9ncm91cF9jb3B5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY19HRnBfbW9udF9ncm91cF9zZXRfY3VydmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjX0dGcF9zaW1wbGVfZ3JvdXBfZ2V0X2N1cnZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY19HRnBfc2ltcGxlX2dyb3VwX2dldF9kZWdyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjX0dGcF9zaW1wbGVfZ3JvdXBfY2hlY2tfZGlzY3JpbWluYW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY19HRnBfc2ltcGxlX3BvaW50X2luaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjX0dGcF9zaW1wbGVfcG9pbnRfZmluaXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY19HRnBfc2ltcGxlX3BvaW50X2NsZWFyX2ZpbmlzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNfR0ZwX3NpbXBsZV9wb2ludF9jb3B5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY19HRnBfc2ltcGxlX3BvaW50X3NldF90b19pbmZpbml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNfR0ZwX3NpbXBsZV9zZXRfSnByb2plY3RpdmVfY29vcmRpbmF0ZXNfR0ZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY19HRnBfc2ltcGxlX2dldF9KcHJvamVjdGl2ZV9jb29yZGluYXRlc19HRnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjX0dGcF9zaW1wbGVfcG9pbnRfc2V0X2FmZmluZV9jb29yZGluYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNfR0ZwX3NpbXBsZV9wb2ludF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY19HRnBfc2ltcGxlX2FkZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNfR0ZwX3NpbXBsZV9kYmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjX0dGcF9zaW1wbGVfaW52ZXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY19HRnBfc2ltcGxlX2lzX2F0X2luZmluaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY19HRnBfc2ltcGxlX2lzX29uX2N1cnZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY19HRnBfc2ltcGxlX2NtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNfR0ZwX3NpbXBsZV9tYWtlX2FmZmluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNfR0ZwX3NpbXBsZV9wb2ludHNfbWFrZV9hZmZpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogbXVsICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIHByZWNvbXB1dGVfbXVsdCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBoYXZlX3ByZWNvbXB1dGVfbXVsdCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNfR0ZwX21vbnRfZmllbGRfbXVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY19HRnBfbW9udF9maWVsZF9zcXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogZmllbGRfZGl2ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY19HRnBfbW9udF9maWVsZF9lbmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjX0dGcF9tb250X2ZpZWxkX2RlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNfR0ZwX21vbnRfZmllbGRfc2V0X3RvX29uZX07CisKKyAgcmV0dXJuICZyZXQ7Cit9CisKK2ludCBlY19HRnBfbW9udF9ncm91cF9pbml0KEVDX0dST1VQICpncm91cCkgeworICBpbnQgb2s7CisKKyAgb2sgPSBlY19HRnBfc2ltcGxlX2dyb3VwX2luaXQoZ3JvdXApOworICBncm91cC0+ZmllbGRfZGF0YTEgPSBOVUxMOworICBncm91cC0+ZmllbGRfZGF0YTIgPSBOVUxMOworICByZXR1cm4gb2s7Cit9CisKK3ZvaWQgZWNfR0ZwX21vbnRfZ3JvdXBfZmluaXNoKEVDX0dST1VQICpncm91cCkgeworICBpZiAoZ3JvdXAtPmZpZWxkX2RhdGExICE9IE5VTEwpIHsKKyAgICBCTl9NT05UX0NUWF9mcmVlKGdyb3VwLT5maWVsZF9kYXRhMSk7CisgICAgZ3JvdXAtPmZpZWxkX2RhdGExID0gTlVMTDsKKyAgfQorICBpZiAoZ3JvdXAtPmZpZWxkX2RhdGEyICE9IE5VTEwpIHsKKyAgICBCTl9mcmVlKGdyb3VwLT5maWVsZF9kYXRhMik7CisgICAgZ3JvdXAtPmZpZWxkX2RhdGEyID0gTlVMTDsKKyAgfQorICBlY19HRnBfc2ltcGxlX2dyb3VwX2ZpbmlzaChncm91cCk7Cit9CisKK3ZvaWQgZWNfR0ZwX21vbnRfZ3JvdXBfY2xlYXJfZmluaXNoKEVDX0dST1VQICpncm91cCkgeworICBpZiAoZ3JvdXAtPmZpZWxkX2RhdGExICE9IE5VTEwpIHsKKyAgICBCTl9NT05UX0NUWF9mcmVlKGdyb3VwLT5maWVsZF9kYXRhMSk7CisgICAgZ3JvdXAtPmZpZWxkX2RhdGExID0gTlVMTDsKKyAgfQorICBpZiAoZ3JvdXAtPmZpZWxkX2RhdGEyICE9IE5VTEwpIHsKKyAgICBCTl9jbGVhcl9mcmVlKGdyb3VwLT5maWVsZF9kYXRhMik7CisgICAgZ3JvdXAtPmZpZWxkX2RhdGEyID0gTlVMTDsKKyAgfQorICBlY19HRnBfc2ltcGxlX2dyb3VwX2NsZWFyX2ZpbmlzaChncm91cCk7Cit9CisKK2ludCBlY19HRnBfbW9udF9ncm91cF9jb3B5KEVDX0dST1VQICpkZXN0LCBjb25zdCBFQ19HUk9VUCAqc3JjKSB7CisgIGlmIChkZXN0LT5maWVsZF9kYXRhMSAhPSBOVUxMKSB7CisgICAgQk5fTU9OVF9DVFhfZnJlZShkZXN0LT5maWVsZF9kYXRhMSk7CisgICAgZGVzdC0+ZmllbGRfZGF0YTEgPSBOVUxMOworICB9CisgIGlmIChkZXN0LT5maWVsZF9kYXRhMiAhPSBOVUxMKSB7CisgICAgQk5fY2xlYXJfZnJlZShkZXN0LT5maWVsZF9kYXRhMik7CisgICAgZGVzdC0+ZmllbGRfZGF0YTIgPSBOVUxMOworICB9CisKKyAgaWYgKCFlY19HRnBfc2ltcGxlX2dyb3VwX2NvcHkoZGVzdCwgc3JjKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoc3JjLT5maWVsZF9kYXRhMSAhPSBOVUxMKSB7CisgICAgZGVzdC0+ZmllbGRfZGF0YTEgPSBCTl9NT05UX0NUWF9uZXcoKTsKKyAgICBpZiAoZGVzdC0+ZmllbGRfZGF0YTEgPT0gTlVMTCkKKyAgICAgIHJldHVybiAwOworICAgIGlmICghQk5fTU9OVF9DVFhfY29weShkZXN0LT5maWVsZF9kYXRhMSwgc3JjLT5maWVsZF9kYXRhMSkpCisgICAgICBnb3RvIGVycjsKKyAgfQorICBpZiAoc3JjLT5maWVsZF9kYXRhMiAhPSBOVUxMKSB7CisgICAgZGVzdC0+ZmllbGRfZGF0YTIgPSBCTl9kdXAoc3JjLT5maWVsZF9kYXRhMik7CisgICAgaWYgKGRlc3QtPmZpZWxkX2RhdGEyID09IE5VTEwpCisgICAgICBnb3RvIGVycjsKKyAgfQorCisgIHJldHVybiAxOworCitlcnI6CisgIGlmIChkZXN0LT5maWVsZF9kYXRhMSAhPSBOVUxMKSB7CisgICAgQk5fTU9OVF9DVFhfZnJlZShkZXN0LT5maWVsZF9kYXRhMSk7CisgICAgZGVzdC0+ZmllbGRfZGF0YTEgPSBOVUxMOworICB9CisgIHJldHVybiAwOworfQorCitpbnQgZWNfR0ZwX21vbnRfZ3JvdXBfc2V0X2N1cnZlKEVDX0dST1VQICpncm91cCwgY29uc3QgQklHTlVNICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYiwgQk5fQ1RYICpjdHgpIHsKKyAgQk5fQ1RYICpuZXdfY3R4ID0gTlVMTDsKKyAgQk5fTU9OVF9DVFggKm1vbnQgPSBOVUxMOworICBCSUdOVU0gKm9uZSA9IE5VTEw7CisgIGludCByZXQgPSAwOworCisgIGlmIChncm91cC0+ZmllbGRfZGF0YTEgIT0gTlVMTCkgeworICAgIEJOX01PTlRfQ1RYX2ZyZWUoZ3JvdXAtPmZpZWxkX2RhdGExKTsKKyAgICBncm91cC0+ZmllbGRfZGF0YTEgPSBOVUxMOworICB9CisgIGlmIChncm91cC0+ZmllbGRfZGF0YTIgIT0gTlVMTCkgeworICAgIEJOX2ZyZWUoZ3JvdXAtPmZpZWxkX2RhdGEyKTsKKyAgICBncm91cC0+ZmllbGRfZGF0YTIgPSBOVUxMOworICB9CisKKyAgaWYgKGN0eCA9PSBOVUxMKSB7CisgICAgY3R4ID0gbmV3X2N0eCA9IEJOX0NUWF9uZXcoKTsKKyAgICBpZiAoY3R4ID09IE5VTEwpCisgICAgICByZXR1cm4gMDsKKyAgfQorCisgIG1vbnQgPSBCTl9NT05UX0NUWF9uZXcoKTsKKyAgaWYgKG1vbnQgPT0gTlVMTCkKKyAgICBnb3RvIGVycjsKKyAgaWYgKCFCTl9NT05UX0NUWF9zZXQobW9udCwgcCwgY3R4KSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfbW9udF9ncm91cF9zZXRfY3VydmUsIEVSUl9SX0JOX0xJQik7CisgICAgZ290byBlcnI7CisgIH0KKyAgb25lID0gQk5fbmV3KCk7CisgIGlmIChvbmUgPT0gTlVMTCkKKyAgICBnb3RvIGVycjsKKyAgaWYgKCFCTl90b19tb250Z29tZXJ5KG9uZSwgQk5fdmFsdWVfb25lKCksIG1vbnQsIGN0eCkpCisgICAgZ290byBlcnI7CisKKyAgZ3JvdXAtPmZpZWxkX2RhdGExID0gbW9udDsKKyAgbW9udCA9IE5VTEw7CisgIGdyb3VwLT5maWVsZF9kYXRhMiA9IG9uZTsKKyAgb25lID0gTlVMTDsKKworICByZXQgPSBlY19HRnBfc2ltcGxlX2dyb3VwX3NldF9jdXJ2ZShncm91cCwgcCwgYSwgYiwgY3R4KTsKKworICBpZiAoIXJldCkgeworICAgIEJOX01PTlRfQ1RYX2ZyZWUoZ3JvdXAtPmZpZWxkX2RhdGExKTsKKyAgICBncm91cC0+ZmllbGRfZGF0YTEgPSBOVUxMOworICAgIEJOX2ZyZWUoZ3JvdXAtPmZpZWxkX2RhdGEyKTsKKyAgICBncm91cC0+ZmllbGRfZGF0YTIgPSBOVUxMOworICB9CisKK2VycjoKKyAgaWYgKG5ld19jdHggIT0gTlVMTCkKKyAgICBCTl9DVFhfZnJlZShuZXdfY3R4KTsKKyAgaWYgKG1vbnQgIT0gTlVMTCkKKyAgICBCTl9NT05UX0NUWF9mcmVlKG1vbnQpOworICByZXR1cm4gcmV0OworfQorCitpbnQgZWNfR0ZwX21vbnRfZmllbGRfbXVsKGNvbnN0IEVDX0dST1VQICpncm91cCwgQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJJR05VTSAqYiwgQk5fQ1RYICpjdHgpIHsKKyAgaWYgKGdyb3VwLT5maWVsZF9kYXRhMSA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9tb250X2ZpZWxkX211bCwgRUNfUl9OT1RfSU5JVElBTElaRUQpOworICAgIHJldHVybiAwOworICB9CisKKyAgcmV0dXJuIEJOX21vZF9tdWxfbW9udGdvbWVyeShyLCBhLCBiLCBncm91cC0+ZmllbGRfZGF0YTEsIGN0eCk7Cit9CisKK2ludCBlY19HRnBfbW9udF9maWVsZF9zcXIoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk5fQ1RYICpjdHgpIHsKKyAgaWYgKGdyb3VwLT5maWVsZF9kYXRhMSA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9tb250X2ZpZWxkX3NxciwgRUNfUl9OT1RfSU5JVElBTElaRUQpOworICAgIHJldHVybiAwOworICB9CisKKyAgcmV0dXJuIEJOX21vZF9tdWxfbW9udGdvbWVyeShyLCBhLCBhLCBncm91cC0+ZmllbGRfZGF0YTEsIGN0eCk7Cit9CisKK2ludCBlY19HRnBfbW9udF9maWVsZF9lbmNvZGUoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk5fQ1RYICpjdHgpIHsKKyAgaWYgKGdyb3VwLT5maWVsZF9kYXRhMSA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9tb250X2ZpZWxkX2VuY29kZSwgRUNfUl9OT1RfSU5JVElBTElaRUQpOworICAgIHJldHVybiAwOworICB9CisKKyAgcmV0dXJuIEJOX3RvX21vbnRnb21lcnkociwgYSwgKEJOX01PTlRfQ1RYICopZ3JvdXAtPmZpZWxkX2RhdGExLCBjdHgpOworfQorCitpbnQgZWNfR0ZwX21vbnRfZmllbGRfZGVjb2RlKGNvbnN0IEVDX0dST1VQICpncm91cCwgQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJOX0NUWCAqY3R4KSB7CisgIGlmIChncm91cC0+ZmllbGRfZGF0YTEgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfbW9udF9maWVsZF9kZWNvZGUsIEVDX1JfTk9UX0lOSVRJQUxJWkVEKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiBCTl9mcm9tX21vbnRnb21lcnkociwgYSwgZ3JvdXAtPmZpZWxkX2RhdGExLCBjdHgpOworfQorCitpbnQgZWNfR0ZwX21vbnRfZmllbGRfc2V0X3RvX29uZShjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEJJR05VTSAqciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJOX0NUWCAqY3R4KSB7CisgIGlmIChncm91cC0+ZmllbGRfZGF0YTIgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfbW9udF9maWVsZF9zZXRfdG9fb25lLCBFQ19SX05PVF9JTklUSUFMSVpFRCk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoIUJOX2NvcHkociwgZ3JvdXAtPmZpZWxkX2RhdGEyKSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vZWMvZXhhbXBsZV9tdWwuYyBiL2NyeXB0by9lYy9leGFtcGxlX211bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlODNkNjEKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vZWMvZXhhbXBsZV9tdWwuYwpAQCAtMCwwICsxLDEzMCBAQAorLyogT3JpZ2luYWxseSB3cml0dGVuIGJ5IEJvZG8gTW9lbGxlciBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBTEwgUklHSFRTIFJFU0VSVkVELgorICoKKyAqIFBvcnRpb25zIG9mIHRoZSBhdHRhY2hlZCBzb2Z0d2FyZSAoIkNvbnRyaWJ1dGlvbiIpIGFyZSBkZXZlbG9wZWQgYnkKKyAqIFNVTiBNSUNST1NZU1RFTVMsIElOQy4sIGFuZCBhcmUgY29udHJpYnV0ZWQgdG8gdGhlIE9wZW5TU0wgcHJvamVjdC4KKyAqCisgKiBUaGUgQ29udHJpYnV0aW9uIGlzIGxpY2Vuc2VkIHB1cnN1YW50IHRvIHRoZSBPcGVuU1NMIG9wZW4gc291cmNlCisgKiBsaWNlbnNlIHByb3ZpZGVkIGFib3ZlLgorICoKKyAqIFRoZSBlbGxpcHRpYyBjdXJ2ZSBiaW5hcnkgcG9seW5vbWlhbCBzb2Z0d2FyZSBpcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkKKyAqIFNoZXVlbGluZyBDaGFuZyBTaGFudHogYW5kIERvdWdsYXMgU3RlYmlsYSBvZiBTdW4gTWljcm9zeXN0ZW1zCisgKiBMYWJvcmF0b3JpZXMuICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZWMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgorCisKK2ludCBleGFtcGxlX0VDX1BPSU5UX211bCgpIHsKKyAgLyogVGhpcyBleGFtcGxlIGVuc3VyZXMgdGhhdCAxMMOX4oieICsgRyA9IEcsIGluIFAtMjU2LiAqLworICBFQ19HUk9VUCAqZ3JvdXAgPSBOVUxMOworICBFQ19QT0lOVCAqcCA9IE5VTEwsICpyZXN1bHQgPSBOVUxMOworICBCSUdOVU0gKm4gPSBOVUxMOworICBpbnQgcmV0ID0gMDsKKyAgY29uc3QgRUNfUE9JTlQgKmdlbmVyYXRvcjsKKworICBncm91cCA9IEVDX0dST1VQX25ld19ieV9jdXJ2ZV9uYW1lKE5JRF9YOV82Ml9wcmltZTI1NnYxKTsKKyAgcCA9IEVDX1BPSU5UX25ldyhncm91cCk7CisgIHJlc3VsdCA9IEVDX1BPSU5UX25ldyhncm91cCk7CisgIG4gPSBCTl9uZXcoKTsKKworICBpZiAocCA9PSBOVUxMIHx8CisgICAgICByZXN1bHQgPT0gTlVMTCB8fAorICAgICAgZ3JvdXAgPT0gTlVMTCB8fAorICAgICAgbiA9PSBOVUxMIHx8CisgICAgICAhRUNfUE9JTlRfc2V0X3RvX2luZmluaXR5KGdyb3VwLCBwKSB8fAorICAgICAgIUJOX3NldF93b3JkKG4sIDEwKSkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgLyogRmlyc3QgY2hlY2sgdGhhdCAxMMOX4oieID0g4oieLiAqLworICBpZiAoIUVDX1BPSU5UX211bChncm91cCwgcmVzdWx0LCBOVUxMLCBwLCBuLCBOVUxMKSB8fAorICAgICAgIUVDX1BPSU5UX2lzX2F0X2luZmluaXR5KGdyb3VwLCByZXN1bHQpKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBnZW5lcmF0b3IgPSBFQ19HUk9VUF9nZXQwX2dlbmVyYXRvcihncm91cCk7CisKKyAgLyogTm93IGNoZWNrIHRoYXQgMTDDl+KIniArIEcgPSBHLiAqLworICBpZiAoIUVDX1BPSU5UX211bChncm91cCwgcmVzdWx0LCBCTl92YWx1ZV9vbmUoKSwgcCwgbiwgTlVMTCkgfHwKKyAgICAgIEVDX1BPSU5UX2NtcChncm91cCwgcmVzdWx0LCBnZW5lcmF0b3IsIE5VTEwpICE9IDApIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIHJldCA9IDE7CisKK2VycjoKKyAgQk5fZnJlZShuKTsKKyAgRUNfUE9JTlRfZnJlZShyZXN1bHQpOworICBFQ19QT0lOVF9mcmVlKHApOworICBFQ19HUk9VUF9mcmVlKGdyb3VwKTsKKworICByZXR1cm4gcmV0OworfQorCitpbnQgbWFpbigpIHsKKyAgaWYgKCFleGFtcGxlX0VDX1BPSU5UX211bCgpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJmYWlsZWRcbiIpOworICAgIHJldHVybiAxOworICB9CisKKyAgcHJpbnRmKCJQQVNTXG4iKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vZWMvaW50ZXJuYWwuaCBiL2NyeXB0by9lYy9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNzkxODYKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vZWMvaW50ZXJuYWwuaApAQCAtMCwwICsxLDM1NyBAQAorLyogT3JpZ2luYWxseSB3cml0dGVuIGJ5IEJvZG8gTW9lbGxlciBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBTEwgUklHSFRTIFJFU0VSVkVELgorICoKKyAqIFBvcnRpb25zIG9mIHRoZSBhdHRhY2hlZCBzb2Z0d2FyZSAoIkNvbnRyaWJ1dGlvbiIpIGFyZSBkZXZlbG9wZWQgYnkKKyAqIFNVTiBNSUNST1NZU1RFTVMsIElOQy4sIGFuZCBhcmUgY29udHJpYnV0ZWQgdG8gdGhlIE9wZW5TU0wgcHJvamVjdC4KKyAqCisgKiBUaGUgQ29udHJpYnV0aW9uIGlzIGxpY2Vuc2VkIHB1cnN1YW50IHRvIHRoZSBPcGVuU1NMIG9wZW4gc291cmNlCisgKiBsaWNlbnNlIHByb3ZpZGVkIGFib3ZlLgorICoKKyAqIFRoZSBlbGxpcHRpYyBjdXJ2ZSBiaW5hcnkgcG9seW5vbWlhbCBzb2Z0d2FyZSBpcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkKKyAqIFNoZXVlbGluZyBDaGFuZyBTaGFudHogYW5kIERvdWdsYXMgU3RlYmlsYSBvZiBTdW4gTWljcm9zeXN0ZW1zCisgKiBMYWJvcmF0b3JpZXMuICovCisKKyNpZm5kZWYgT1BFTlNTTF9IRUFERVJfRUNfSU5URVJOQUxfSAorI2RlZmluZSBPUEVOU1NMX0hFQURFUl9FQ19JTlRFUk5BTF9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jhc2UuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V4X2RhdGEuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIFVzZSBkZWZhdWx0IGZ1bmN0aW9ucyBmb3IgcG9pbjJvY3QsIG9jdDJwb2ludCBhbmQgY29tcHJlc3NlZCBjb29yZGluYXRlcyAqLworI2RlZmluZSBFQ19GTEFHU19ERUZBVUxUX09DVCAweDEKKwordHlwZWRlZiBzdHJ1Y3QgZWNfbWV0aG9kX3N0IEVDX01FVEhPRDsKKworc3RydWN0IGVjX21ldGhvZF9zdCB7CisgIC8qIFZhcmlvdXMgbWV0aG9kIGZsYWdzICovCisgIGludCBmbGFnczsKKworICAvKiB1c2VkIGJ5IEVDX0dST1VQX25ldywgRUNfR1JPVVBfZnJlZSwgRUNfR1JPVVBfY2xlYXJfZnJlZSwgRUNfR1JPVVBfY29weTogKi8KKyAgaW50ICgqZ3JvdXBfaW5pdCkoRUNfR1JPVVAgKik7CisgIHZvaWQgKCpncm91cF9maW5pc2gpKEVDX0dST1VQICopOworICB2b2lkICgqZ3JvdXBfY2xlYXJfZmluaXNoKShFQ19HUk9VUCAqKTsKKyAgaW50ICgqZ3JvdXBfY29weSkoRUNfR1JPVVAgKiwgY29uc3QgRUNfR1JPVVAgKik7CisKKyAgLyogdXNlZCBieSBFQ19HUk9VUF9zZXRfY3VydmVfR0ZwLCBFQ19HUk9VUF9nZXRfY3VydmVfR0ZwLCAqLworICAvKiBFQ19HUk9VUF9zZXRfY3VydmVfR0YybSwgYW5kIEVDX0dST1VQX2dldF9jdXJ2ZV9HRjJtOiAqLworICBpbnQgKCpncm91cF9zZXRfY3VydmUpKEVDX0dST1VQICosIGNvbnN0IEJJR05VTSAqcCwgY29uc3QgQklHTlVNICphLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJJR05VTSAqYiwgQk5fQ1RYICopOworICBpbnQgKCpncm91cF9nZXRfY3VydmUpKGNvbnN0IEVDX0dST1VQICosIEJJR05VTSAqcCwgQklHTlVNICphLCBCSUdOVU0gKmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQk5fQ1RYICopOworCisgIC8qIHVzZWQgYnkgRUNfR1JPVVBfZ2V0X2RlZ3JlZTogKi8KKyAgaW50ICgqZ3JvdXBfZ2V0X2RlZ3JlZSkoY29uc3QgRUNfR1JPVVAgKik7CisKKyAgLyogdXNlZCBieSBFQ19HUk9VUF9jaGVjazogKi8KKyAgaW50ICgqZ3JvdXBfY2hlY2tfZGlzY3JpbWluYW50KShjb25zdCBFQ19HUk9VUCAqLCBCTl9DVFggKik7CisKKyAgLyogdXNlZCBieSBFQ19QT0lOVF9uZXcsIEVDX1BPSU5UX2ZyZWUsIEVDX1BPSU5UX2NsZWFyX2ZyZWUsIEVDX1BPSU5UX2NvcHk6ICovCisgIGludCAoKnBvaW50X2luaXQpKEVDX1BPSU5UICopOworICB2b2lkICgqcG9pbnRfZmluaXNoKShFQ19QT0lOVCAqKTsKKyAgdm9pZCAoKnBvaW50X2NsZWFyX2ZpbmlzaCkoRUNfUE9JTlQgKik7CisgIGludCAoKnBvaW50X2NvcHkpKEVDX1BPSU5UICosIGNvbnN0IEVDX1BPSU5UICopOworCisgIC8qIHVzZWQgYnkgRUNfUE9JTlRfc2V0X3RvX2luZmluaXR5LAorICAgKiBFQ19QT0lOVF9zZXRfSnByb2plY3RpdmVfY29vcmRpbmF0ZXNfR0ZwLAorICAgKiBFQ19QT0lOVF9nZXRfSnByb2plY3RpdmVfY29vcmRpbmF0ZXNfR0ZwLAorICAgKiBFQ19QT0lOVF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcCwgICAgIC4uLl9HRjJtLAorICAgKiBFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcCwgICAgIC4uLl9HRjJtLAorICAgKiBFQ19QT0lOVF9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlc19HRnAsIC4uLl9HRjJtOgorICAgKi8KKyAgaW50ICgqcG9pbnRfc2V0X3RvX2luZmluaXR5KShjb25zdCBFQ19HUk9VUCAqLCBFQ19QT0lOVCAqKTsKKyAgaW50ICgqcG9pbnRfc2V0X0pwcm9qZWN0aXZlX2Nvb3JkaW5hdGVzX0dGcCkoY29uc3QgRUNfR1JPVVAgKiwgRUNfUE9JTlQgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQklHTlVNICp4LCBjb25zdCBCSUdOVU0gKnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJJR05VTSAqeiwgQk5fQ1RYICopOworICBpbnQgKCpwb2ludF9nZXRfSnByb2plY3RpdmVfY29vcmRpbmF0ZXNfR0ZwKShjb25zdCBFQ19HUk9VUCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFQ19QT0lOVCAqLCBCSUdOVU0gKngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJR05VTSAqeSwgQklHTlVNICp6LCBCTl9DVFggKik7CisgIGludCAoKnBvaW50X3NldF9hZmZpbmVfY29vcmRpbmF0ZXMpKGNvbnN0IEVDX0dST1VQICosIEVDX1BPSU5UICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJJR05VTSAqeCwgY29uc3QgQklHTlVNICp5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTl9DVFggKik7CisgIGludCAoKnBvaW50X2dldF9hZmZpbmVfY29vcmRpbmF0ZXMpKGNvbnN0IEVDX0dST1VQICosIGNvbnN0IEVDX1BPSU5UICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJR05VTSAqeCwgQklHTlVNICp5LCBCTl9DVFggKik7CisgIGludCAoKnBvaW50X3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzKShjb25zdCBFQ19HUk9VUCAqLCBFQ19QT0lOVCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQklHTlVNICp4LCBpbnQgeV9iaXQsIEJOX0NUWCAqKTsKKworICAvKiB1c2VkIGJ5IEVDX1BPSU5UX3BvaW50Mm9jdCwgRUNfUE9JTlRfb2N0MnBvaW50OiAqLworICBzaXplX3QgKCpwb2ludDJvY3QpKGNvbnN0IEVDX0dST1VQICosIGNvbnN0IEVDX1BPSU5UICosCisgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfY29udmVyc2lvbl9mb3JtX3QgZm9ybSwgdW5zaWduZWQgY2hhciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4sIEJOX0NUWCAqKTsKKyAgaW50ICgqb2N0MnBvaW50KShjb25zdCBFQ19HUk9VUCAqLCBFQ19QT0lOVCAqLCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCisgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbiwgQk5fQ1RYICopOworCisgIC8qIHVzZWQgYnkgRUNfUE9JTlRfYWRkLCBFQ19QT0lOVF9kYmwsIEVDUF9QT0lOVF9pbnZlcnQ6ICovCisgIGludCAoKmFkZCkoY29uc3QgRUNfR1JPVVAgKiwgRUNfUE9JTlQgKnIsIGNvbnN0IEVDX1BPSU5UICphLAorICAgICAgICAgICAgIGNvbnN0IEVDX1BPSU5UICpiLCBCTl9DVFggKik7CisgIGludCAoKmRibCkoY29uc3QgRUNfR1JPVVAgKiwgRUNfUE9JTlQgKnIsIGNvbnN0IEVDX1BPSU5UICphLCBCTl9DVFggKik7CisgIGludCAoKmludmVydCkoY29uc3QgRUNfR1JPVVAgKiwgRUNfUE9JTlQgKiwgQk5fQ1RYICopOworCisgIC8qIHVzZWQgYnkgRUNfUE9JTlRfaXNfYXRfaW5maW5pdHksIEVDX1BPSU5UX2lzX29uX2N1cnZlLCBFQ19QT0lOVF9jbXA6ICovCisgIGludCAoKmlzX2F0X2luZmluaXR5KShjb25zdCBFQ19HUk9VUCAqLCBjb25zdCBFQ19QT0lOVCAqKTsKKyAgaW50ICgqaXNfb25fY3VydmUpKGNvbnN0IEVDX0dST1VQICosIGNvbnN0IEVDX1BPSU5UICosIEJOX0NUWCAqKTsKKyAgaW50ICgqcG9pbnRfY21wKShjb25zdCBFQ19HUk9VUCAqLCBjb25zdCBFQ19QT0lOVCAqYSwgY29uc3QgRUNfUE9JTlQgKmIsCisgICAgICAgICAgICAgICAgICAgQk5fQ1RYICopOworCisgIC8qIHVzZWQgYnkgRUNfUE9JTlRfbWFrZV9hZmZpbmUsIEVDX1BPSU5Uc19tYWtlX2FmZmluZTogKi8KKyAgaW50ICgqbWFrZV9hZmZpbmUpKGNvbnN0IEVDX0dST1VQICosIEVDX1BPSU5UICosIEJOX0NUWCAqKTsKKyAgaW50ICgqcG9pbnRzX21ha2VfYWZmaW5lKShjb25zdCBFQ19HUk9VUCAqLCBzaXplX3QgbnVtLCBFQ19QT0lOVCAqIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJOX0NUWCAqKTsKKworICAvKiB1c2VkIGJ5IEVDX1BPSU5Uc19tdWwsIEVDX1BPSU5UX211bCwgRUNfUE9JTlRfcHJlY29tcHV0ZV9tdWx0LAorICAgKiBFQ19QT0lOVF9oYXZlX3ByZWNvbXB1dGVfbXVsdAorICAgKiAoZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgYXJlIHVzZWQgaWYgdGhlICdtdWwnIHBvaW50ZXIgaXMgMCk6ICovCisgIGludCAoKm11bCkoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqciwgY29uc3QgQklHTlVNICpzY2FsYXIsCisgICAgICAgICAgICAgc2l6ZV90IG51bSwgY29uc3QgRUNfUE9JTlQgKnBvaW50c1tdLCBjb25zdCBCSUdOVU0gKnNjYWxhcnNbXSwKKyAgICAgICAgICAgICBCTl9DVFggKik7CisgIGludCAoKnByZWNvbXB1dGVfbXVsdCkoRUNfR1JPVVAgKmdyb3VwLCBCTl9DVFggKik7CisgIGludCAoKmhhdmVfcHJlY29tcHV0ZV9tdWx0KShjb25zdCBFQ19HUk9VUCAqZ3JvdXApOworCisKKyAgLyogaW50ZXJuYWwgZnVuY3Rpb25zICovCisKKyAgLyogJ2ZpZWxkX211bCcsICdmaWVsZF9zcXInLCBhbmQgJ2ZpZWxkX2RpdicgY2FuIGJlIHVzZWQgYnkgJ2FkZCcgYW5kICdkYmwnCisgICAqIHNvIHRoYXQgdGhlIHNhbWUgaW1wbGVtZW50YXRpb25zIG9mIHBvaW50IG9wZXJhdGlvbnMgY2FuIGJlIHVzZWQgd2l0aAorICAgKiBkaWZmZXJlbnQgb3B0aW1pemVkIGltcGxlbWVudGF0aW9ucyBvZiBleHBlbnNpdmUgZmllbGQgb3BlcmF0aW9uczogKi8KKyAgaW50ICgqZmllbGRfbXVsKShjb25zdCBFQ19HUk9VUCAqLCBCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBCSUdOVU0gKmIsIEJOX0NUWCAqKTsKKyAgaW50ICgqZmllbGRfc3FyKShjb25zdCBFQ19HUk9VUCAqLCBCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgQk5fQ1RYICopOworICBpbnQgKCpmaWVsZF9kaXYpKGNvbnN0IEVDX0dST1VQICosIEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEJJR05VTSAqYiwgQk5fQ1RYICopOworCisgIGludCAoKmZpZWxkX2VuY29kZSkoY29uc3QgRUNfR1JPVVAgKiwgQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsCisgICAgICAgICAgICAgICAgICAgICAgQk5fQ1RYICopOyAvKiBlLmcuIHRvIE1vbnRnb21lcnkgKi8KKyAgaW50ICgqZmllbGRfZGVjb2RlKShjb25zdCBFQ19HUk9VUCAqLCBCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwKKyAgICAgICAgICAgICAgICAgICAgICBCTl9DVFggKik7IC8qIGUuZy4gZnJvbSBNb250Z29tZXJ5ICovCisgIGludCAoKmZpZWxkX3NldF90b19vbmUpKGNvbnN0IEVDX0dST1VQICosIEJJR05VTSAqciwgQk5fQ1RYICopOworfSAvKiBFQ19NRVRIT0QgKi87CisKK2NvbnN0IEVDX01FVEhPRCogRUNfR0ZwX21vbnRfbWV0aG9kKCk7CisKK3N0cnVjdCBlY19wcmVfY29tcF9zdDsKK3ZvaWQgZWNfcHJlX2NvbXBfZnJlZShzdHJ1Y3QgZWNfcHJlX2NvbXBfc3QgKnByZV9jb21wKTsKK3ZvaWQgKmVjX3ByZV9jb21wX2R1cChzdHJ1Y3QgZWNfcHJlX2NvbXBfc3QgKnByZV9jb21wKTsKKworc3RydWN0IGVjX2dyb3VwX3N0IHsKKyAgY29uc3QgRUNfTUVUSE9EICptZXRoOworCisgIEVDX1BPSU5UICpnZW5lcmF0b3I7IC8qIG9wdGlvbmFsICovCisgIEJJR05VTSBvcmRlciwgY29mYWN0b3I7CisKKyAgaW50IGN1cnZlX25hbWU7IC8qIG9wdGlvbmFsIE5JRCBmb3IgbmFtZWQgY3VydmUgKi8KKyAgcG9pbnRfY29udmVyc2lvbl9mb3JtX3QgYXNuMV9mb3JtOworCisgIHN0cnVjdCBlY19wcmVfY29tcF9zdCAqcHJlX2NvbXA7CisKKyAgLyogVGhlIGZvbGxvd2luZyBtZW1iZXJzIGFyZSBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgZnVuY3Rpb25zLAorICAgKiBldmVuIGlmIHRoZXkgYXBwZWFyIGdlbmVyaWMgKi8KKworICBCSUdOVU0gZmllbGQ7IC8qIEZpZWxkIHNwZWNpZmljYXRpb24uCisgICAgICAgICAgICAgICAgICogRm9yIGN1cnZlcyBvdmVyIEdGKHApLCB0aGlzIGlzIHRoZSBtb2R1bHVzOworICAgICAgICAgICAgICAgICAqIGZvciBjdXJ2ZXMgb3ZlciBHRigyXm0pLCB0aGlzIGlzIHRoZQorICAgICAgICAgICAgICAgICAqIGlycmVkdWNpYmxlIHBvbHlub21pYWwgZGVmaW5pbmcgdGhlIGZpZWxkLiAqLworCisgIGludCBwb2x5WzZdOyAvKiBGaWVsZCBzcGVjaWZpY2F0aW9uIGZvciBjdXJ2ZXMgb3ZlciBHRigyXm0pLgorICAgICAgICAgICAgICAgICogVGhlIGlycmVkdWNpYmxlIGYodCkgaXMgdGhlbiBvZiB0aGUgZm9ybToKKyAgICAgICAgICAgICAgICAqICAgICB0XnBvbHlbMF0gKyB0XnBvbHlbMV0gKyAuLi4gKyB0XnBvbHlba10KKyAgICAgICAgICAgICAgICAqIHdoZXJlIG0gPSBwb2x5WzBdID4gcG9seVsxXSA+IC4uLiA+IHBvbHlba10gPSAwLgorICAgICAgICAgICAgICAgICogVGhlIGFycmF5IGlzIHRlcm1pbmF0ZWQgd2l0aCBwb2x5W2srMV09LTEuCisgICAgICAgICAgICAgICAgKiBBbGwgZWxsaXB0aWMgY3VydmUgaXJyZWR1Y2libGVzIGhhdmUgYXQgbW9zdCA1CisgICAgICAgICAgICAgICAgKiBub24temVybyB0ZXJtcy4gKi8KKworICBCSUdOVU0gYSwgYjsgLyogQ3VydmUgY29lZmZpY2llbnRzLgorICAgICAgICAgICAgICAgICogKEhlcmUgdGhlIGFzc3VtcHRpb24gaXMgdGhhdCBCSUdOVU1zIGNhbiBiZSB1c2VkCisgICAgICAgICAgICAgICAgKiBvciBhYnVzZWQgZm9yIGFsbCBraW5kcyBvZiBmaWVsZHMsIG5vdCBqdXN0IEdGKHApLikKKyAgICAgICAgICAgICAgICAqIEZvciBjaGFyYWN0ZXJpc3RpYyAgPiAzLCAgdGhlIGN1cnZlIGlzIGRlZmluZWQKKyAgICAgICAgICAgICAgICAqIGJ5IGEgV2VpZXJzdHJhc3MgZXF1YXRpb24gb2YgdGhlIGZvcm0KKyAgICAgICAgICAgICAgICAqICAgICB5XjIgPSB4XjMgKyBhKnggKyBiLgorICAgICAgICAgICAgICAgICogRm9yIGNoYXJhY3RlcmlzdGljICAyLCAgdGhlIGN1cnZlIGlzIGRlZmluZWQgYnkKKyAgICAgICAgICAgICAgICAqIGFuIGVxdWF0aW9uIG9mIHRoZSBmb3JtCisgICAgICAgICAgICAgICAgKiAgICAgeV4yICsgeCp5ID0geF4zICsgYSp4XjIgKyBiLiAqLworCisgIGludCBhX2lzX21pbnVzMzsgLyogZW5hYmxlIG9wdGltaXplZCBwb2ludCBhcml0aG1ldGljcyBmb3Igc3BlY2lhbCBjYXNlICovCisKKyAgdm9pZCAqZmllbGRfZGF0YTE7IC8qIG1ldGhvZC1zcGVjaWZpYyAoZS5nLiwgTW9udGdvbWVyeSBzdHJ1Y3R1cmUpICovCisgIHZvaWQgKmZpZWxkX2RhdGEyOyAvKiBtZXRob2Qtc3BlY2lmaWMgKi8KKyAgaW50ICgqZmllbGRfbW9kX2Z1bmMpKEJJR05VTSAqLCBjb25zdCBCSUdOVU0gKiwgY29uc3QgQklHTlVNICosCisgICAgICAgICAgICAgICAgICAgICAgICBCTl9DVFggKik7IC8qIG1ldGhvZC1zcGVjaWZpYyAqLworfSAvKiBFQ19HUk9VUCAqLzsKKworc3RydWN0IGVjX3BvaW50X3N0IHsKKyAgY29uc3QgRUNfTUVUSE9EICptZXRoOworCisgIC8qIEFsbCBtZW1iZXJzIGV4Y2VwdCAnbWV0aCcgYXJlIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBmdW5jdGlvbnMsCisgICAqIGV2ZW4gaWYgdGhleSBhcHBlYXIgZ2VuZXJpYyAqLworCisgIEJJR05VTSBYOworICBCSUdOVU0gWTsKKyAgQklHTlVNIFo7IC8qIEphY29iaWFuIHByb2plY3RpdmUgY29vcmRpbmF0ZXM6CisgICAgICAgICAgICAgKiAoWCwgWSwgWikgIHJlcHJlc2VudHMgIChYL1peMiwgWS9aXjMpICBpZiAgWiAhPSAwICovCisgIGludCBaX2lzX29uZTsgLyogZW5hYmxlIG9wdGltaXplZCBwb2ludCBhcml0aG1ldGljcyBmb3Igc3BlY2lhbCBjYXNlICovCit9IC8qIEVDX1BPSU5UICovOworCitFQ19HUk9VUCAqZWNfZ3JvdXBfbmV3KGNvbnN0IEVDX01FVEhPRCAqbWV0aCk7CisKK2ludCBlY193TkFGX211bChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEVDX1BPSU5UICpyLCBjb25zdCBCSUdOVU0gKnNjYWxhciwKKyAgICAgICAgICAgICAgICBzaXplX3QgbnVtLCBjb25zdCBFQ19QT0lOVCAqcG9pbnRzW10sIGNvbnN0IEJJR05VTSAqc2NhbGFyc1tdLAorICAgICAgICAgICAgICAgIEJOX0NUWCAqKTsKK2ludCBlY193TkFGX3ByZWNvbXB1dGVfbXVsdChFQ19HUk9VUCAqZ3JvdXAsIEJOX0NUWCAqKTsKK2ludCBlY193TkFGX2hhdmVfcHJlY29tcHV0ZV9tdWx0KGNvbnN0IEVDX0dST1VQICpncm91cCk7CisKKy8qIG1ldGhvZCBmdW5jdGlvbnMgaW4gc2ltcGxlLmMgKi8KK2ludCBlY19HRnBfc2ltcGxlX2dyb3VwX2luaXQoRUNfR1JPVVAgKik7Cit2b2lkIGVjX0dGcF9zaW1wbGVfZ3JvdXBfZmluaXNoKEVDX0dST1VQICopOwordm9pZCBlY19HRnBfc2ltcGxlX2dyb3VwX2NsZWFyX2ZpbmlzaChFQ19HUk9VUCAqKTsKK2ludCBlY19HRnBfc2ltcGxlX2dyb3VwX2NvcHkoRUNfR1JPVVAgKiwgY29uc3QgRUNfR1JPVVAgKik7CitpbnQgZWNfR0ZwX3NpbXBsZV9ncm91cF9zZXRfY3VydmUoRUNfR1JPVVAgKiwgY29uc3QgQklHTlVNICpwLCBjb25zdCBCSUdOVU0gKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQklHTlVNICpiLCBCTl9DVFggKik7CitpbnQgZWNfR0ZwX3NpbXBsZV9ncm91cF9nZXRfY3VydmUoY29uc3QgRUNfR1JPVVAgKiwgQklHTlVNICpwLCBCSUdOVU0gKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklHTlVNICpiLCBCTl9DVFggKik7CitpbnQgZWNfR0ZwX3NpbXBsZV9ncm91cF9nZXRfZGVncmVlKGNvbnN0IEVDX0dST1VQICopOworaW50IGVjX0dGcF9zaW1wbGVfZ3JvdXBfY2hlY2tfZGlzY3JpbWluYW50KGNvbnN0IEVDX0dST1VQICosIEJOX0NUWCAqKTsKK2ludCBlY19HRnBfc2ltcGxlX3BvaW50X2luaXQoRUNfUE9JTlQgKik7Cit2b2lkIGVjX0dGcF9zaW1wbGVfcG9pbnRfZmluaXNoKEVDX1BPSU5UICopOwordm9pZCBlY19HRnBfc2ltcGxlX3BvaW50X2NsZWFyX2ZpbmlzaChFQ19QT0lOVCAqKTsKK2ludCBlY19HRnBfc2ltcGxlX3BvaW50X2NvcHkoRUNfUE9JTlQgKiwgY29uc3QgRUNfUE9JTlQgKik7CitpbnQgZWNfR0ZwX3NpbXBsZV9wb2ludF9zZXRfdG9faW5maW5pdHkoY29uc3QgRUNfR1JPVVAgKiwgRUNfUE9JTlQgKik7CitpbnQgZWNfR0ZwX3NpbXBsZV9zZXRfSnByb2plY3RpdmVfY29vcmRpbmF0ZXNfR0ZwKGNvbnN0IEVDX0dST1VQICosIEVDX1BPSU5UICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJJR05VTSAqeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQklHTlVNICp5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCSUdOVU0gKnosIEJOX0NUWCAqKTsKK2ludCBlY19HRnBfc2ltcGxlX2dldF9KcHJvamVjdGl2ZV9jb29yZGluYXRlc19HRnAoY29uc3QgRUNfR1JPVVAgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRUNfUE9JTlQgKiwgQklHTlVNICp4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSUdOVU0gKnksIEJJR05VTSAqeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk5fQ1RYICopOworaW50IGVjX0dGcF9zaW1wbGVfcG9pbnRfc2V0X2FmZmluZV9jb29yZGluYXRlcyhjb25zdCBFQ19HUk9VUCAqLCBFQ19QT0lOVCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCSUdOVU0gKngsIGNvbnN0IEJJR05VTSAqeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk5fQ1RYICopOworaW50IGVjX0dGcF9zaW1wbGVfcG9pbnRfZ2V0X2FmZmluZV9jb29yZGluYXRlcyhjb25zdCBFQ19HUk9VUCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFQ19QT0lOVCAqLCBCSUdOVU0gKngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJR05VTSAqeSwgQk5fQ1RYICopOworaW50IGVjX0dGcF9zaW1wbGVfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXMoY29uc3QgRUNfR1JPVVAgKiwgRUNfUE9JTlQgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJJR05VTSAqeCwgaW50IHlfYml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk5fQ1RYICopOworaW50IGVjX0dGcF9zaW1wbGVfYWRkKGNvbnN0IEVDX0dST1VQICosIEVDX1BPSU5UICpyLCBjb25zdCBFQ19QT0lOVCAqYSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFQ19QT0lOVCAqYiwgQk5fQ1RYICopOworaW50IGVjX0dGcF9zaW1wbGVfZGJsKGNvbnN0IEVDX0dST1VQICosIEVDX1BPSU5UICpyLCBjb25zdCBFQ19QT0lOVCAqYSwKKyAgICAgICAgICAgICAgICAgICAgICBCTl9DVFggKik7CitpbnQgZWNfR0ZwX3NpbXBsZV9pbnZlcnQoY29uc3QgRUNfR1JPVVAgKiwgRUNfUE9JTlQgKiwgQk5fQ1RYICopOworaW50IGVjX0dGcF9zaW1wbGVfaXNfYXRfaW5maW5pdHkoY29uc3QgRUNfR1JPVVAgKiwgY29uc3QgRUNfUE9JTlQgKik7CitpbnQgZWNfR0ZwX3NpbXBsZV9pc19vbl9jdXJ2ZShjb25zdCBFQ19HUk9VUCAqLCBjb25zdCBFQ19QT0lOVCAqLCBCTl9DVFggKik7CitpbnQgZWNfR0ZwX3NpbXBsZV9jbXAoY29uc3QgRUNfR1JPVVAgKiwgY29uc3QgRUNfUE9JTlQgKmEsIGNvbnN0IEVDX1BPSU5UICpiLAorICAgICAgICAgICAgICAgICAgICAgIEJOX0NUWCAqKTsKK2ludCBlY19HRnBfc2ltcGxlX21ha2VfYWZmaW5lKGNvbnN0IEVDX0dST1VQICosIEVDX1BPSU5UICosIEJOX0NUWCAqKTsKK2ludCBlY19HRnBfc2ltcGxlX3BvaW50c19tYWtlX2FmZmluZShjb25zdCBFQ19HUk9VUCAqLCBzaXplX3QgbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVDX1BPSU5UICogW10sIEJOX0NUWCAqKTsKK2ludCBlY19HRnBfc2ltcGxlX2ZpZWxkX211bChjb25zdCBFQ19HUk9VUCAqLCBCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCSUdOVU0gKmIsIEJOX0NUWCAqKTsKK2ludCBlY19HRnBfc2ltcGxlX2ZpZWxkX3Nxcihjb25zdCBFQ19HUk9VUCAqLCBCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTl9DVFggKik7CisKKy8qIG1ldGhvZCBmdW5jdGlvbnMgaW4gbW9udGdvbWVyeS5jICovCitpbnQgZWNfR0ZwX21vbnRfZ3JvdXBfaW5pdChFQ19HUk9VUCAqKTsKK2ludCBlY19HRnBfbW9udF9ncm91cF9zZXRfY3VydmUoRUNfR1JPVVAgKiwgY29uc3QgQklHTlVNICpwLCBjb25zdCBCSUdOVU0gKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJJR05VTSAqYiwgQk5fQ1RYICopOwordm9pZCBlY19HRnBfbW9udF9ncm91cF9maW5pc2goRUNfR1JPVVAgKik7Cit2b2lkIGVjX0dGcF9tb250X2dyb3VwX2NsZWFyX2ZpbmlzaChFQ19HUk9VUCAqKTsKK2ludCBlY19HRnBfbW9udF9ncm91cF9jb3B5KEVDX0dST1VQICosIGNvbnN0IEVDX0dST1VQICopOworaW50IGVjX0dGcF9tb250X2ZpZWxkX211bChjb25zdCBFQ19HUk9VUCAqLCBCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQklHTlVNICpiLCBCTl9DVFggKik7CitpbnQgZWNfR0ZwX21vbnRfZmllbGRfc3FyKGNvbnN0IEVDX0dST1VQICosIEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCTl9DVFggKik7CitpbnQgZWNfR0ZwX21vbnRfZmllbGRfZW5jb2RlKGNvbnN0IEVDX0dST1VQICosIEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTl9DVFggKik7CitpbnQgZWNfR0ZwX21vbnRfZmllbGRfZGVjb2RlKGNvbnN0IEVDX0dST1VQICosIEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTl9DVFggKik7CitpbnQgZWNfR0ZwX21vbnRfZmllbGRfc2V0X3RvX29uZShjb25zdCBFQ19HUk9VUCAqLCBCSUdOVU0gKnIsIEJOX0NUWCAqKTsKKworaW50IGVjX3BvaW50X3NldF9KcHJvamVjdGl2ZV9jb29yZGluYXRlc19HRnAoY29uc3QgRUNfR1JPVVAgKmdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUNfUE9JTlQgKnBvaW50LCBjb25zdCBCSUdOVU0gKngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCSUdOVU0gKnksIGNvbnN0IEJJR05VTSAqeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJOX0NUWCAqY3R4KTsKKworc3RydWN0IGVjX2tleV9zdCB7CisgIGludCB2ZXJzaW9uOworCisgIEVDX0dST1VQICpncm91cDsKKworICBFQ19QT0lOVCAqcHViX2tleTsKKyAgQklHTlVNICpwcml2X2tleTsKKworICB1bnNpZ25lZCBpbnQgZW5jX2ZsYWc7CisgIHBvaW50X2NvbnZlcnNpb25fZm9ybV90IGNvbnZfZm9ybTsKKworICBpbnQgcmVmZXJlbmNlczsKKyAgaW50IGZsYWdzOworCisgIEVDRFNBX01FVEhPRCAqZWNkc2FfbWV0aDsKKworICBDUllQVE9fRVhfREFUQSBleF9kYXRhOworfSAvKiBFQ19LRVkgKi87CisKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9ICAvKiBleHRlcm4gQyAqLworI2VuZGlmCisKKyNlbmRpZiAgLyogT1BFTlNTTF9IRUFERVJfRUNfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2VjL29jdC5jIGIvY3J5cHRvL2VjL29jdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNWVhMTQKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vZWMvb2N0LmMKQEAgLTAsMCArMSw0OTUgQEAKKy8qIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBCb2RvIE1vZWxsZXIgZm9yIHRoZSBPcGVuU1NMIHByb2plY3QuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDUgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRC4KKyAqCisgKiBQb3J0aW9ucyBvZiB0aGUgYXR0YWNoZWQgc29mdHdhcmUgKCJDb250cmlidXRpb24iKSBhcmUgZGV2ZWxvcGVkIGJ5CisgKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuLCBhbmQgYXJlIGNvbnRyaWJ1dGVkIHRvIHRoZSBPcGVuU1NMIHByb2plY3QuCisgKgorICogVGhlIENvbnRyaWJ1dGlvbiBpcyBsaWNlbnNlZCBwdXJzdWFudCB0byB0aGUgT3BlblNTTCBvcGVuIHNvdXJjZQorICogbGljZW5zZSBwcm92aWRlZCBhYm92ZS4KKyAqCisgKiBUaGUgZWxsaXB0aWMgY3VydmUgYmluYXJ5IHBvbHlub21pYWwgc29mdHdhcmUgaXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5CisgKiBTaGV1ZWxpbmcgQ2hhbmcgU2hhbnR6IGFuZCBEb3VnbGFzIFN0ZWJpbGEgb2YgU3VuIE1pY3Jvc3lzdGVtcworICogTGFib3JhdG9yaWVzLiAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9lYy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisKK3N0YXRpYyBzaXplX3QgZWNfR0ZwX3NpbXBsZV9wb2ludDJvY3QoY29uc3QgRUNfR1JPVVAgKmdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFQ19QT0lOVCAqcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2NvbnZlcnNpb25fZm9ybV90IGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IGxlbiwgQk5fQ1RYICpjdHgpIHsKKyAgc2l6ZV90IHJldDsKKyAgQk5fQ1RYICpuZXdfY3R4ID0gTlVMTDsKKyAgaW50IHVzZWRfY3R4ID0gMDsKKyAgQklHTlVNICp4LCAqeTsKKyAgc2l6ZV90IGZpZWxkX2xlbiwgaSwgc2tpcDsKKworICBpZiAoKGZvcm0gIT0gUE9JTlRfQ09OVkVSU0lPTl9DT01QUkVTU0VEKSAmJgorICAgICAgKGZvcm0gIT0gUE9JTlRfQ09OVkVSU0lPTl9VTkNPTVBSRVNTRUQpICYmCisgICAgICAoZm9ybSAhPSBQT0lOVF9DT05WRVJTSU9OX0hZQlJJRCkpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfR0ZwX3NpbXBsZV9wb2ludDJvY3QsIEVDX1JfSU5WQUxJRF9GT1JNKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmIChFQ19QT0lOVF9pc19hdF9pbmZpbml0eShncm91cCwgcG9pbnQpKSB7CisgICAgLyogZW5jb2RlcyB0byBhIHNpbmdsZSAwIG9jdGV0ICovCisgICAgaWYgKGJ1ZiAhPSBOVUxMKSB7CisgICAgICBpZiAobGVuIDwgMSkgeworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfR0ZwX3NpbXBsZV9wb2ludDJvY3QsIEVDX1JfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgYnVmWzBdID0gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7CisgIH0KKworCisgIC8qIHJldCA6PSByZXF1aXJlZCBvdXRwdXQgYnVmZmVyIGxlbmd0aCAqLworICBmaWVsZF9sZW4gPSBCTl9udW1fYnl0ZXMoJmdyb3VwLT5maWVsZCk7CisgIHJldCA9CisgICAgICAoZm9ybSA9PSBQT0lOVF9DT05WRVJTSU9OX0NPTVBSRVNTRUQpID8gMSArIGZpZWxkX2xlbiA6IDEgKyAyICogZmllbGRfbGVuOworCisgIC8qIGlmICdidWYnIGlzIE5VTEwsIGp1c3QgcmV0dXJuIHJlcXVpcmVkIGxlbmd0aCAqLworICBpZiAoYnVmICE9IE5VTEwpIHsKKyAgICBpZiAobGVuIDwgcmV0KSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfR0ZwX3NpbXBsZV9wb2ludDJvY3QsIEVDX1JfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBpZiAoY3R4ID09IE5VTEwpIHsKKyAgICAgIGN0eCA9IG5ld19jdHggPSBCTl9DVFhfbmV3KCk7CisgICAgICBpZiAoY3R4ID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEJOX0NUWF9zdGFydChjdHgpOworICAgIHVzZWRfY3R4ID0gMTsKKyAgICB4ID0gQk5fQ1RYX2dldChjdHgpOworICAgIHkgPSBCTl9DVFhfZ2V0KGN0eCk7CisgICAgaWYgKHkgPT0gTlVMTCkKKyAgICAgIGdvdG8gZXJyOworCisgICAgaWYgKCFFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcChncm91cCwgcG9pbnQsIHgsIHksIGN0eCkpCisgICAgICBnb3RvIGVycjsKKworICAgIGlmICgoZm9ybSA9PSBQT0lOVF9DT05WRVJTSU9OX0NPTVBSRVNTRUQgfHwKKyAgICAgICAgIGZvcm0gPT0gUE9JTlRfQ09OVkVSU0lPTl9IWUJSSUQpICYmCisgICAgICAgIEJOX2lzX29kZCh5KSkKKyAgICAgIGJ1ZlswXSA9IGZvcm0gKyAxOworICAgIGVsc2UKKyAgICAgIGJ1ZlswXSA9IGZvcm07CisKKyAgICBpID0gMTsKKworICAgIHNraXAgPSBmaWVsZF9sZW4gLSBCTl9udW1fYnl0ZXMoeCk7CisgICAgaWYgKHNraXAgPiBmaWVsZF9sZW4pIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfc2ltcGxlX3BvaW50Mm9jdCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgZ290byBlcnI7CisgICAgfQorICAgIHdoaWxlIChza2lwID4gMCkgeworICAgICAgYnVmW2krK10gPSAwOworICAgICAgc2tpcC0tOworICAgIH0KKyAgICBza2lwID0gQk5fYm4yYmluKHgsIGJ1ZiArIGkpOworICAgIGkgKz0gc2tpcDsKKyAgICBpZiAoaSAhPSAxICsgZmllbGRfbGVuKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfR0ZwX3NpbXBsZV9wb2ludDJvY3QsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGlmIChmb3JtID09IFBPSU5UX0NPTlZFUlNJT05fVU5DT01QUkVTU0VEIHx8CisgICAgICAgIGZvcm0gPT0gUE9JTlRfQ09OVkVSU0lPTl9IWUJSSUQpIHsKKyAgICAgIHNraXAgPSBmaWVsZF9sZW4gLSBCTl9udW1fYnl0ZXMoeSk7CisgICAgICBpZiAoc2tpcCA+IGZpZWxkX2xlbikgeworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfR0ZwX3NpbXBsZV9wb2ludDJvY3QsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgICB3aGlsZSAoc2tpcCA+IDApIHsKKyAgICAgICAgYnVmW2krK10gPSAwOworICAgICAgICBza2lwLS07CisgICAgICB9CisgICAgICBza2lwID0gQk5fYm4yYmluKHksIGJ1ZiArIGkpOworICAgICAgaSArPSBza2lwOworICAgIH0KKworICAgIGlmIChpICE9IHJldCkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9zaW1wbGVfcG9pbnQyb2N0LCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0KKworICBpZiAodXNlZF9jdHgpCisgICAgQk5fQ1RYX2VuZChjdHgpOworICBpZiAobmV3X2N0eCAhPSBOVUxMKQorICAgIEJOX0NUWF9mcmVlKG5ld19jdHgpOworICByZXR1cm4gcmV0OworCitlcnI6CisgIGlmICh1c2VkX2N0eCkKKyAgICBCTl9DVFhfZW5kKGN0eCk7CisgIGlmIChuZXdfY3R4ICE9IE5VTEwpCisgICAgQk5fQ1RYX2ZyZWUobmV3X2N0eCk7CisgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZWNfR0ZwX3NpbXBsZV9vY3QycG9pbnQoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk5fQ1RYICpjdHgpIHsKKyAgcG9pbnRfY29udmVyc2lvbl9mb3JtX3QgZm9ybTsKKyAgaW50IHlfYml0OworICBCTl9DVFggKm5ld19jdHggPSBOVUxMOworICBCSUdOVU0gKngsICp5OworICBzaXplX3QgZmllbGRfbGVuLCBlbmNfbGVuOworICBpbnQgcmV0ID0gMDsKKworICBpZiAobGVuID09IDApIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfR0ZwX3NpbXBsZV9vY3QycG9pbnQsIEVDX1JfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZm9ybSA9IGJ1ZlswXTsKKyAgeV9iaXQgPSBmb3JtICYgMTsKKyAgZm9ybSA9IGZvcm0gJiB+MVU7CisgIGlmICgoZm9ybSAhPSAwKSAmJiAoZm9ybSAhPSBQT0lOVF9DT05WRVJTSU9OX0NPTVBSRVNTRUQpICYmCisgICAgICAoZm9ybSAhPSBQT0lOVF9DT05WRVJTSU9OX1VOQ09NUFJFU1NFRCkgJiYKKyAgICAgIChmb3JtICE9IFBPSU5UX0NPTlZFUlNJT05fSFlCUklEKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfc2ltcGxlX29jdDJwb2ludCwgRUNfUl9JTlZBTElEX0VOQ09ESU5HKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoKGZvcm0gPT0gMCB8fCBmb3JtID09IFBPSU5UX0NPTlZFUlNJT05fVU5DT01QUkVTU0VEKSAmJiB5X2JpdCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfc2ltcGxlX29jdDJwb2ludCwgRUNfUl9JTlZBTElEX0VOQ09ESU5HKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChmb3JtID09IDApIHsKKyAgICBpZiAobGVuICE9IDEpIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfc2ltcGxlX29jdDJwb2ludCwgRUNfUl9JTlZBTElEX0VOQ09ESU5HKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiBFQ19QT0lOVF9zZXRfdG9faW5maW5pdHkoZ3JvdXAsIHBvaW50KTsKKyAgfQorCisgIGZpZWxkX2xlbiA9IEJOX251bV9ieXRlcygmZ3JvdXAtPmZpZWxkKTsKKyAgZW5jX2xlbiA9CisgICAgICAoZm9ybSA9PSBQT0lOVF9DT05WRVJTSU9OX0NPTVBSRVNTRUQpID8gMSArIGZpZWxkX2xlbiA6IDEgKyAyICogZmllbGRfbGVuOworCisgIGlmIChsZW4gIT0gZW5jX2xlbikgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfc2ltcGxlX29jdDJwb2ludCwgRUNfUl9JTlZBTElEX0VOQ09ESU5HKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChjdHggPT0gTlVMTCkgeworICAgIGN0eCA9IG5ld19jdHggPSBCTl9DVFhfbmV3KCk7CisgICAgaWYgKGN0eCA9PSBOVUxMKQorICAgICAgcmV0dXJuIDA7CisgIH0KKworICBCTl9DVFhfc3RhcnQoY3R4KTsKKyAgeCA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgeSA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgaWYgKHkgPT0gTlVMTCkKKyAgICBnb3RvIGVycjsKKworICBpZiAoIUJOX2JpbjJibihidWYgKyAxLCBmaWVsZF9sZW4sIHgpKQorICAgIGdvdG8gZXJyOworICBpZiAoQk5fdWNtcCh4LCAmZ3JvdXAtPmZpZWxkKSA+PSAwKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9zaW1wbGVfb2N0MnBvaW50LCBFQ19SX0lOVkFMSURfRU5DT0RJTkcpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKGZvcm0gPT0gUE9JTlRfQ09OVkVSU0lPTl9DT01QUkVTU0VEKSB7CisgICAgaWYgKCFFQ19QT0lOVF9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlc19HRnAoZ3JvdXAsIHBvaW50LCB4LCB5X2JpdCwgY3R4KSkKKyAgICAgIGdvdG8gZXJyOworICB9IGVsc2UgeworICAgIGlmICghQk5fYmluMmJuKGJ1ZiArIDEgKyBmaWVsZF9sZW4sIGZpZWxkX2xlbiwgeSkpCisgICAgICBnb3RvIGVycjsKKyAgICBpZiAoQk5fdWNtcCh5LCAmZ3JvdXAtPmZpZWxkKSA+PSAwKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfR0ZwX3NpbXBsZV9vY3QycG9pbnQsIEVDX1JfSU5WQUxJRF9FTkNPRElORyk7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgaWYgKGZvcm0gPT0gUE9JTlRfQ09OVkVSU0lPTl9IWUJSSUQpIHsKKyAgICAgIGlmICh5X2JpdCAhPSBCTl9pc19vZGQoeSkpIHsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9zaW1wbGVfb2N0MnBvaW50LCBFQ19SX0lOVkFMSURfRU5DT0RJTkcpOworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIUVDX1BPSU5UX3NldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwKGdyb3VwLCBwb2ludCwgeCwgeSwgY3R4KSkKKyAgICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKCFFQ19QT0lOVF9pc19vbl9jdXJ2ZShncm91cCwgcG9pbnQsIGN0eCkpIC8qIHRlc3QgcmVxdWlyZWQgYnkgWDkuNjIgKi8KKyAgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfc2ltcGxlX29jdDJwb2ludCwgRUNfUl9QT0lOVF9JU19OT1RfT05fQ1VSVkUpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgcmV0ID0gMTsKKworZXJyOgorICBCTl9DVFhfZW5kKGN0eCk7CisgIGlmIChuZXdfY3R4ICE9IE5VTEwpCisgICAgQk5fQ1RYX2ZyZWUobmV3X2N0eCk7CisgIHJldHVybiByZXQ7Cit9CisKK2ludCBFQ19QT0lOVF9vY3QycG9pbnQoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IGxlbiwgQk5fQ1RYICpjdHgpIHsKKyAgaWYgKGdyb3VwLT5tZXRoLT5vY3QycG9pbnQgPT0gMCAmJgorICAgICAgIShncm91cC0+bWV0aC0+ZmxhZ3MgJiBFQ19GTEFHU19ERUZBVUxUX09DVCkpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUE9JTlRfb2N0MnBvaW50LAorICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGdyb3VwLT5tZXRoICE9IHBvaW50LT5tZXRoKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX29jdDJwb2ludCwgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGdyb3VwLT5tZXRoLT5mbGFncyAmIEVDX0ZMQUdTX0RFRkFVTFRfT0NUKSB7CisgICAgcmV0dXJuIGVjX0dGcF9zaW1wbGVfb2N0MnBvaW50KGdyb3VwLCBwb2ludCwgYnVmLCBsZW4sIGN0eCk7CisgIH0KKworICByZXR1cm4gZ3JvdXAtPm1ldGgtPm9jdDJwb2ludChncm91cCwgcG9pbnQsIGJ1ZiwgbGVuLCBjdHgpOworfQorCitzaXplX3QgRUNfUE9JTlRfcG9pbnQyb2N0KGNvbnN0IEVDX0dST1VQICpncm91cCwgY29uc3QgRUNfUE9JTlQgKnBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9jb252ZXJzaW9uX2Zvcm1fdCBmb3JtLCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4sIEJOX0NUWCAqY3R4KSB7CisgIGlmIChncm91cC0+bWV0aC0+cG9pbnQyb2N0ID09IDAgJiYKKyAgICAgICEoZ3JvdXAtPm1ldGgtPmZsYWdzICYgRUNfRkxBR1NfREVGQVVMVF9PQ1QpKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX3BvaW50Mm9jdCwKKyAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworICAgIHJldHVybiAwOworICB9CisgIGlmIChncm91cC0+bWV0aCAhPSBwb2ludC0+bWV0aCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVF9wb2ludDJvY3QsIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOworICAgIHJldHVybiAwOworICB9CisgIGlmIChncm91cC0+bWV0aC0+ZmxhZ3MgJiBFQ19GTEFHU19ERUZBVUxUX09DVCkgeworICAgIHJldHVybiBlY19HRnBfc2ltcGxlX3BvaW50Mm9jdChncm91cCwgcG9pbnQsIGZvcm0sIGJ1ZiwgbGVuLCBjdHgpOworICB9CisKKyAgcmV0dXJuIGdyb3VwLT5tZXRoLT5wb2ludDJvY3QoZ3JvdXAsIHBvaW50LCBmb3JtLCBidWYsIGxlbiwgY3R4KTsKK30KKworaW50IGVjX0dGcF9zaW1wbGVfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXMoY29uc3QgRUNfR1JPVVAgKmdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUNfUE9JTlQgKnBvaW50LCBjb25zdCBCSUdOVU0gKnhfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfYml0LCBCTl9DVFggKmN0eCkgeworICBCTl9DVFggKm5ld19jdHggPSBOVUxMOworICBCSUdOVU0gKnRtcDEsICp0bXAyLCAqeCwgKnk7CisgIGludCByZXQgPSAwOworCisgIEVSUl9jbGVhcl9lcnJvcigpOworCisgIGlmIChjdHggPT0gTlVMTCkgeworICAgIGN0eCA9IG5ld19jdHggPSBCTl9DVFhfbmV3KCk7CisgICAgaWYgKGN0eCA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICB5X2JpdCA9ICh5X2JpdCAhPSAwKTsKKworICBCTl9DVFhfc3RhcnQoY3R4KTsKKyAgdG1wMSA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgdG1wMiA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgeCA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgeSA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgaWYgKHkgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgLyogUmVjb3ZlciB5LiAgV2UgaGF2ZSBhIFdlaWVyc3RyYXNzIGVxdWF0aW9uCisgICAqICAgICB5XjIgPSB4XjMgKyBhKnggKyBiLAorICAgKiBzbyAgeSAgaXMgb25lIG9mIHRoZSBzcXVhcmUgcm9vdHMgb2YgIHheMyArIGEqeCArIGIuICovCisKKyAgLyogdG1wMSA6PSB4XjMgKi8KKyAgaWYgKCFCTl9ubm1vZCh4LCB4XywgJmdyb3VwLT5maWVsZCwgY3R4KSkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKGdyb3VwLT5tZXRoLT5maWVsZF9kZWNvZGUgPT0gMCkgeworICAgIC8qIGZpZWxkX3tzcXIsbXVsfSB3b3JrIG9uIHN0YW5kYXJkIHJlcHJlc2VudGF0aW9uICovCisgICAgaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfc3FyKGdyb3VwLCB0bXAyLCB4XywgY3R4KSB8fAorICAgICAgICAhZ3JvdXAtPm1ldGgtPmZpZWxkX211bChncm91cCwgdG1wMSwgdG1wMiwgeF8sIGN0eCkpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoIUJOX21vZF9zcXIodG1wMiwgeF8sICZncm91cC0+ZmllbGQsIGN0eCkgfHwKKyAgICAgICAgIUJOX21vZF9tdWwodG1wMSwgdG1wMiwgeF8sICZncm91cC0+ZmllbGQsIGN0eCkpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfQorCisgIC8qIHRtcDEgOj0gdG1wMSArIGEqeCAqLworICBpZiAoZ3JvdXAtPmFfaXNfbWludXMzKSB7CisgICAgaWYgKCFCTl9tb2RfbHNoaWZ0MV9xdWljayh0bXAyLCB4LCAmZ3JvdXAtPmZpZWxkKSB8fAorICAgICAgICAhQk5fbW9kX2FkZF9xdWljayh0bXAyLCB0bXAyLCB4LCAmZ3JvdXAtPmZpZWxkKSB8fAorICAgICAgICAhQk5fbW9kX3N1Yl9xdWljayh0bXAxLCB0bXAxLCB0bXAyLCAmZ3JvdXAtPmZpZWxkKSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChncm91cC0+bWV0aC0+ZmllbGRfZGVjb2RlKSB7CisgICAgICBpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9kZWNvZGUoZ3JvdXAsIHRtcDIsICZncm91cC0+YSwgY3R4KSB8fAorICAgICAgICAgICFCTl9tb2RfbXVsKHRtcDIsIHRtcDIsIHgsICZncm91cC0+ZmllbGQsIGN0eCkpIHsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGZpZWxkX211bCB3b3JrcyBvbiBzdGFuZGFyZCByZXByZXNlbnRhdGlvbiAqLworICAgICAgaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfbXVsKGdyb3VwLCB0bXAyLCAmZ3JvdXAtPmEsIHgsIGN0eCkpIHsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFCTl9tb2RfYWRkX3F1aWNrKHRtcDEsIHRtcDEsIHRtcDIsICZncm91cC0+ZmllbGQpKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0KKworICAvKiB0bXAxIDo9IHRtcDEgKyBiICovCisgIGlmIChncm91cC0+bWV0aC0+ZmllbGRfZGVjb2RlKSB7CisgICAgaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfZGVjb2RlKGdyb3VwLCB0bXAyLCAmZ3JvdXAtPmIsIGN0eCkgfHwKKyAgICAgICAgIUJOX21vZF9hZGRfcXVpY2sodG1wMSwgdG1wMSwgdG1wMiwgJmdyb3VwLT5maWVsZCkpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoIUJOX21vZF9hZGRfcXVpY2sodG1wMSwgdG1wMSwgJmdyb3VwLT5iLCAmZ3JvdXAtPmZpZWxkKSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICB9CisKKyAgaWYgKCFCTl9tb2Rfc3FydCh5LCB0bXAxLCAmZ3JvdXAtPmZpZWxkLCBjdHgpKSB7CisgICAgdW5zaWduZWQgbG9uZyBlcnIgPSBFUlJfcGVla19sYXN0X2Vycm9yKCk7CisKKyAgICBpZiAoRVJSX0dFVF9MSUIoZXJyKSA9PSBFUlJfTElCX0JOICYmCisgICAgICAgIEVSUl9HRVRfUkVBU09OKGVycikgPT0gQk5fUl9OT1RfQV9TUVVBUkUpIHsKKyAgICAgIEVSUl9jbGVhcl9lcnJvcigpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9zaW1wbGVfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXMsIEVDX1JfSU5WQUxJRF9DT01QUkVTU0VEX1BPSU5UKTsKKyAgICB9IGVsc2UgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9zaW1wbGVfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXMsIEVSUl9SX0JOX0xJQik7CisgICAgfQorICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKHlfYml0ICE9IEJOX2lzX29kZCh5KSkgeworICAgIGlmIChCTl9pc196ZXJvKHkpKSB7CisgICAgICBpbnQga3JvbjsKKworICAgICAga3JvbiA9IEJOX2tyb25lY2tlcih4LCAmZ3JvdXAtPmZpZWxkLCBjdHgpOworICAgICAgaWYgKGtyb24gPT0gLTIpIHsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisKKyAgICAgIGlmIChrcm9uID09IDEpIHsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9zaW1wbGVfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEVDX1JfSU5WQUxJRF9DT01QUkVTU0lPTl9CSVQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogQk5fbW9kX3NxcnQoKSBzaG91bGQgaGF2ZSBjb3VnaHQgdGhpcyBlcnJvciAobm90IGEgc3F1YXJlKSAqLworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfR0ZwX3NpbXBsZV9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRUNfUl9JTlZBTElEX0NPTVBSRVNTRURfUE9JTlQpOworICAgICAgfQorICAgICAgZ290byBlcnI7CisgICAgfQorICAgIGlmICghQk5fdXN1Yih5LCAmZ3JvdXAtPmZpZWxkLCB5KSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICB9CisgIGlmICh5X2JpdCAhPSBCTl9pc19vZGQoeSkpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfR0ZwX3NpbXBsZV9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAoIUVDX1BPSU5UX3NldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwKGdyb3VwLCBwb2ludCwgeCwgeSwgY3R4KSkKKyAgICBnb3RvIGVycjsKKworICByZXQgPSAxOworCitlcnI6CisgIEJOX0NUWF9lbmQoY3R4KTsKKyAgaWYgKG5ld19jdHggIT0gTlVMTCkKKyAgICBCTl9DVFhfZnJlZShuZXdfY3R4KTsKKyAgcmV0dXJuIHJldDsKK30KKworaW50IEVDX1BPSU5UX3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzX0dGcChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVDX1BPSU5UICpwb2ludCwgY29uc3QgQklHTlVNICp4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9iaXQsIEJOX0NUWCAqY3R4KSB7CisgIGlmIChncm91cC0+bWV0aC0+cG9pbnRfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXMgPT0gMCAmJgorICAgICAgIShncm91cC0+bWV0aC0+ZmxhZ3MgJiBFQ19GTEFHU19ERUZBVUxUX09DVCkpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUE9JTlRfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXNfR0ZwLAorICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGdyb3VwLT5tZXRoICE9IHBvaW50LT5tZXRoKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzX0dGcCwKKyAgICAgICAgICAgICAgICAgICAgICBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoZ3JvdXAtPm1ldGgtPmZsYWdzICYgRUNfRkxBR1NfREVGQVVMVF9PQ1QpIHsKKyAgICByZXR1cm4gZWNfR0ZwX3NpbXBsZV9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlcyhncm91cCwgcG9pbnQsIHgsIHlfYml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eCk7CisgIH0KKyAgcmV0dXJuIGdyb3VwLT5tZXRoLT5wb2ludF9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlcyhncm91cCwgcG9pbnQsIHgsIHlfYml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eCk7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vZWMvc2ltcGxlLmMgYi9jcnlwdG8vZWMvc2ltcGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ0ZDA1NgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9lYy9zaW1wbGUuYwpAQCAtMCwwICsxLDEzNzEgQEAKKy8qIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBCb2RvIE1vZWxsZXIgZm9yIHRoZSBPcGVuU1NMIHByb2plY3QuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDUgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRC4KKyAqCisgKiBQb3J0aW9ucyBvZiB0aGUgYXR0YWNoZWQgc29mdHdhcmUgKCJDb250cmlidXRpb24iKSBhcmUgZGV2ZWxvcGVkIGJ5CisgKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuLCBhbmQgYXJlIGNvbnRyaWJ1dGVkIHRvIHRoZSBPcGVuU1NMIHByb2plY3QuCisgKgorICogVGhlIENvbnRyaWJ1dGlvbiBpcyBsaWNlbnNlZCBwdXJzdWFudCB0byB0aGUgT3BlblNTTCBvcGVuIHNvdXJjZQorICogbGljZW5zZSBwcm92aWRlZCBhYm92ZS4KKyAqCisgKiBUaGUgZWxsaXB0aWMgY3VydmUgYmluYXJ5IHBvbHlub21pYWwgc29mdHdhcmUgaXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5CisgKiBTaGV1ZWxpbmcgQ2hhbmcgU2hhbnR6IGFuZCBEb3VnbGFzIFN0ZWJpbGEgb2YgU3VuIE1pY3Jvc3lzdGVtcworICogTGFib3JhdG9yaWVzLiAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9lYy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKworI2luY2x1ZGUgImludGVybmFsLmgiCisKKworY29uc3QgRUNfTUVUSE9EICpFQ19HRnBfc2ltcGxlX21ldGhvZCh2b2lkKSB7CisgIHN0YXRpYyBjb25zdCBFQ19NRVRIT0QgcmV0ID0ge0VDX0ZMQUdTX0RFRkFVTFRfT0NULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY19HRnBfc2ltcGxlX2dyb3VwX2luaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjX0dGcF9zaW1wbGVfZ3JvdXBfZmluaXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY19HRnBfc2ltcGxlX2dyb3VwX2NsZWFyX2ZpbmlzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNfR0ZwX3NpbXBsZV9ncm91cF9jb3B5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY19HRnBfc2ltcGxlX2dyb3VwX3NldF9jdXJ2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNfR0ZwX3NpbXBsZV9ncm91cF9nZXRfY3VydmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjX0dGcF9zaW1wbGVfZ3JvdXBfZ2V0X2RlZ3JlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNfR0ZwX3NpbXBsZV9ncm91cF9jaGVja19kaXNjcmltaW5hbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjX0dGcF9zaW1wbGVfcG9pbnRfaW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNfR0ZwX3NpbXBsZV9wb2ludF9maW5pc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjX0dGcF9zaW1wbGVfcG9pbnRfY2xlYXJfZmluaXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY19HRnBfc2ltcGxlX3BvaW50X2NvcHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjX0dGcF9zaW1wbGVfcG9pbnRfc2V0X3RvX2luZmluaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY19HRnBfc2ltcGxlX3NldF9KcHJvamVjdGl2ZV9jb29yZGluYXRlc19HRnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjX0dGcF9zaW1wbGVfZ2V0X0pwcm9qZWN0aXZlX2Nvb3JkaW5hdGVzX0dGcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNfR0ZwX3NpbXBsZV9wb2ludF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY19HRnBfc2ltcGxlX3BvaW50X2dldF9hZmZpbmVfY29vcmRpbmF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjX0dGcF9zaW1wbGVfYWRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY19HRnBfc2ltcGxlX2RibCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNfR0ZwX3NpbXBsZV9pbnZlcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjX0dGcF9zaW1wbGVfaXNfYXRfaW5maW5pdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjX0dGcF9zaW1wbGVfaXNfb25fY3VydmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjX0dGcF9zaW1wbGVfY21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY19HRnBfc2ltcGxlX21ha2VfYWZmaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY19HRnBfc2ltcGxlX3BvaW50c19tYWtlX2FmZmluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBtdWwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogcHJlY29tcHV0ZV9tdWx0ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIGhhdmVfcHJlY29tcHV0ZV9tdWx0ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY19HRnBfc2ltcGxlX2ZpZWxkX211bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNfR0ZwX3NpbXBsZV9maWVsZF9zcXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogZmllbGRfZGl2ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIGZpZWxkX2VuY29kZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBmaWVsZF9kZWNvZGUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogZmllbGRfc2V0X3RvX29uZSAqL307CisKKyAgcmV0dXJuICZyZXQ7Cit9CisKKworLyogTW9zdCBtZXRob2QgZnVuY3Rpb25zIGluIHRoaXMgZmlsZSBhcmUgZGVzaWduZWQgdG8gd29yayB3aXRoIG5vbi10cml2aWFsCisgKiByZXByZXNlbnRhdGlvbnMgb2YgZmllbGQgZWxlbWVudHMgaWYgbmVjZXNzYXJ5IChzZWUgZWNwX21vbnQuYyk6IHdoaWxlCisgKiBzdGFuZGFyZCBtb2R1bGFyIGFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbiBhcmUgdXNlZCwgdGhlIGZpZWxkX211bCBhbmQKKyAqIGZpZWxkX3NxciBtZXRob2RzIHdpbGwgYmUgdXNlZCBmb3IgbXVsdGlwbGljYXRpb24sIGFuZCBmaWVsZF9lbmNvZGUgYW5kCisgKiBmaWVsZF9kZWNvZGUgKGlmIGRlZmluZWQpIHdpbGwgYmUgdXNlZCBmb3IgY29udmVydGluZyBiZXR3ZWVuCisgKiByZXByZXNlbnRhdGlvbnMuCisKKyAqIEZ1bmN0aW9ucyBlY19HRnBfc2ltcGxlX3BvaW50c19tYWtlX2FmZmluZSgpIGFuZAorICogZWNfR0ZwX3NpbXBsZV9wb2ludF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzKCkgc3BlY2lmaWNhbGx5IGFzc3VtZSB0aGF0IGlmIGEKKyAqIG5vbi10cml2aWFsIHJlcHJlc2VudGF0aW9uIGlzIHVzZWQsIGl0IGlzIGEgTW9udGdvbWVyeSByZXByZXNlbnRhdGlvbiAoaS5lLgorICogJ2VuY29kaW5nJyBtZWFucyBtdWx0aXBseWluZyBieSBzb21lIGZhY3RvciBSKS4gKi8KKworaW50IGVjX0dGcF9zaW1wbGVfZ3JvdXBfaW5pdChFQ19HUk9VUCAqZ3JvdXApIHsKKyAgQk5faW5pdCgmZ3JvdXAtPmZpZWxkKTsKKyAgQk5faW5pdCgmZ3JvdXAtPmEpOworICBCTl9pbml0KCZncm91cC0+Yik7CisgIGdyb3VwLT5hX2lzX21pbnVzMyA9IDA7CisgIHJldHVybiAxOworfQorCit2b2lkIGVjX0dGcF9zaW1wbGVfZ3JvdXBfZmluaXNoKEVDX0dST1VQICpncm91cCkgeworICBCTl9mcmVlKCZncm91cC0+ZmllbGQpOworICBCTl9mcmVlKCZncm91cC0+YSk7CisgIEJOX2ZyZWUoJmdyb3VwLT5iKTsKK30KKwordm9pZCBlY19HRnBfc2ltcGxlX2dyb3VwX2NsZWFyX2ZpbmlzaChFQ19HUk9VUCAqZ3JvdXApIHsKKyAgQk5fY2xlYXJfZnJlZSgmZ3JvdXAtPmZpZWxkKTsKKyAgQk5fY2xlYXJfZnJlZSgmZ3JvdXAtPmEpOworICBCTl9jbGVhcl9mcmVlKCZncm91cC0+Yik7Cit9CisKK2ludCBlY19HRnBfc2ltcGxlX2dyb3VwX2NvcHkoRUNfR1JPVVAgKmRlc3QsIGNvbnN0IEVDX0dST1VQICpzcmMpIHsKKyAgaWYgKCFCTl9jb3B5KCZkZXN0LT5maWVsZCwgJnNyYy0+ZmllbGQpIHx8CisgICAgICAhQk5fY29weSgmZGVzdC0+YSwgJnNyYy0+YSkgfHwKKyAgICAgICFCTl9jb3B5KCZkZXN0LT5iLCAmc3JjLT5iKSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgZGVzdC0+YV9pc19taW51czMgPSBzcmMtPmFfaXNfbWludXMzOworICByZXR1cm4gMTsKK30KKworaW50IGVjX0dGcF9zaW1wbGVfZ3JvdXBfc2V0X2N1cnZlKEVDX0dST1VQICpncm91cCwgY29uc3QgQklHTlVNICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJOX0NUWCAqY3R4KSB7CisgIGludCByZXQgPSAwOworICBCTl9DVFggKm5ld19jdHggPSBOVUxMOworICBCSUdOVU0gKnRtcF9hOworCisgIC8qIHAgbXVzdCBiZSBhIHByaW1lID4gMyAqLworICBpZiAoQk5fbnVtX2JpdHMocCkgPD0gMiB8fCAhQk5faXNfb2RkKHApKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9zaW1wbGVfZ3JvdXBfc2V0X2N1cnZlLCBFQ19SX0lOVkFMSURfRklFTEQpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKGN0eCA9PSBOVUxMKSB7CisgICAgY3R4ID0gbmV3X2N0eCA9IEJOX0NUWF9uZXcoKTsKKyAgICBpZiAoY3R4ID09IE5VTEwpCisgICAgICByZXR1cm4gMDsKKyAgfQorCisgIEJOX0NUWF9zdGFydChjdHgpOworICB0bXBfYSA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgaWYgKHRtcF9hID09IE5VTEwpCisgICAgZ290byBlcnI7CisKKyAgLyogZ3JvdXAtPmZpZWxkICovCisgIGlmICghQk5fY29weSgmZ3JvdXAtPmZpZWxkLCBwKSkKKyAgICBnb3RvIGVycjsKKyAgQk5fc2V0X25lZ2F0aXZlKCZncm91cC0+ZmllbGQsIDApOworCisgIC8qIGdyb3VwLT5hICovCisgIGlmICghQk5fbm5tb2QodG1wX2EsIGEsIHAsIGN0eCkpCisgICAgZ290byBlcnI7CisgIGlmIChncm91cC0+bWV0aC0+ZmllbGRfZW5jb2RlKSB7CisgICAgaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfZW5jb2RlKGdyb3VwLCAmZ3JvdXAtPmEsIHRtcF9hLCBjdHgpKQorICAgICAgZ290byBlcnI7CisgIH0gZWxzZSBpZiAoIUJOX2NvcHkoJmdyb3VwLT5hLCB0bXBfYSkpCisgICAgZ290byBlcnI7CisKKyAgLyogZ3JvdXAtPmIgKi8KKyAgaWYgKCFCTl9ubm1vZCgmZ3JvdXAtPmIsIGIsIHAsIGN0eCkpCisgICAgZ290byBlcnI7CisgIGlmIChncm91cC0+bWV0aC0+ZmllbGRfZW5jb2RlKQorICAgIGlmICghZ3JvdXAtPm1ldGgtPmZpZWxkX2VuY29kZShncm91cCwgJmdyb3VwLT5iLCAmZ3JvdXAtPmIsIGN0eCkpCisgICAgICBnb3RvIGVycjsKKworICAvKiBncm91cC0+YV9pc19taW51czMgKi8KKyAgaWYgKCFCTl9hZGRfd29yZCh0bXBfYSwgMykpCisgICAgZ290byBlcnI7CisgIGdyb3VwLT5hX2lzX21pbnVzMyA9ICgwID09IEJOX2NtcCh0bXBfYSwgJmdyb3VwLT5maWVsZCkpOworCisgIHJldCA9IDE7CisKK2VycjoKKyAgQk5fQ1RYX2VuZChjdHgpOworICBpZiAobmV3X2N0eCAhPSBOVUxMKQorICAgIEJOX0NUWF9mcmVlKG5ld19jdHgpOworICByZXR1cm4gcmV0OworfQorCitpbnQgZWNfR0ZwX3NpbXBsZV9ncm91cF9nZXRfY3VydmUoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBCSUdOVU0gKnAsIEJJR05VTSAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSUdOVU0gKmIsIEJOX0NUWCAqY3R4KSB7CisgIGludCByZXQgPSAwOworICBCTl9DVFggKm5ld19jdHggPSBOVUxMOworCisgIGlmIChwICE9IE5VTEwpIHsKKyAgICBpZiAoIUJOX2NvcHkocCwgJmdyb3VwLT5maWVsZCkpCisgICAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChhICE9IE5VTEwgfHwgYiAhPSBOVUxMKSB7CisgICAgaWYgKGdyb3VwLT5tZXRoLT5maWVsZF9kZWNvZGUpIHsKKyAgICAgIGlmIChjdHggPT0gTlVMTCkgeworICAgICAgICBjdHggPSBuZXdfY3R4ID0gQk5fQ1RYX25ldygpOworICAgICAgICBpZiAoY3R4ID09IE5VTEwpCisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBpZiAoYSAhPSBOVUxMKSB7CisgICAgICAgIGlmICghZ3JvdXAtPm1ldGgtPmZpZWxkX2RlY29kZShncm91cCwgYSwgJmdyb3VwLT5hLCBjdHgpKQorICAgICAgICAgIGdvdG8gZXJyOworICAgICAgfQorICAgICAgaWYgKGIgIT0gTlVMTCkgeworICAgICAgICBpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9kZWNvZGUoZ3JvdXAsIGIsICZncm91cC0+YiwgY3R4KSkKKyAgICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKGEgIT0gTlVMTCkgeworICAgICAgICBpZiAoIUJOX2NvcHkoYSwgJmdyb3VwLT5hKSkKKyAgICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICAgIGlmIChiICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKCFCTl9jb3B5KGIsICZncm91cC0+YikpCisgICAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0ID0gMTsKKworZXJyOgorICBpZiAobmV3X2N0eCkKKyAgICBCTl9DVFhfZnJlZShuZXdfY3R4KTsKKyAgcmV0dXJuIHJldDsKK30KKworaW50IGVjX0dGcF9zaW1wbGVfZ3JvdXBfZ2V0X2RlZ3JlZShjb25zdCBFQ19HUk9VUCAqZ3JvdXApIHsKKyAgcmV0dXJuIEJOX251bV9iaXRzKCZncm91cC0+ZmllbGQpOworfQorCitpbnQgZWNfR0ZwX3NpbXBsZV9ncm91cF9jaGVja19kaXNjcmltaW5hbnQoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBCTl9DVFggKmN0eCkgeworICBpbnQgcmV0ID0gMDsKKyAgQklHTlVNICphLCAqYiwgKm9yZGVyLCAqdG1wXzEsICp0bXBfMjsKKyAgY29uc3QgQklHTlVNICpwID0gJmdyb3VwLT5maWVsZDsKKyAgQk5fQ1RYICpuZXdfY3R4ID0gTlVMTDsKKworICBpZiAoY3R4ID09IE5VTEwpIHsKKyAgICBjdHggPSBuZXdfY3R4ID0gQk5fQ1RYX25ldygpOworICAgIGlmIChjdHggPT0gTlVMTCkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9zaW1wbGVfZ3JvdXBfY2hlY2tfZGlzY3JpbWluYW50LAorICAgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgZ290byBlcnI7CisgICAgfQorICB9CisgIEJOX0NUWF9zdGFydChjdHgpOworICBhID0gQk5fQ1RYX2dldChjdHgpOworICBiID0gQk5fQ1RYX2dldChjdHgpOworICB0bXBfMSA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgdG1wXzIgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIG9yZGVyID0gQk5fQ1RYX2dldChjdHgpOworICBpZiAob3JkZXIgPT0gTlVMTCkKKyAgICBnb3RvIGVycjsKKworICBpZiAoZ3JvdXAtPm1ldGgtPmZpZWxkX2RlY29kZSkgeworICAgIGlmICghZ3JvdXAtPm1ldGgtPmZpZWxkX2RlY29kZShncm91cCwgYSwgJmdyb3VwLT5hLCBjdHgpKQorICAgICAgZ290byBlcnI7CisgICAgaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfZGVjb2RlKGdyb3VwLCBiLCAmZ3JvdXAtPmIsIGN0eCkpCisgICAgICBnb3RvIGVycjsKKyAgfSBlbHNlIHsKKyAgICBpZiAoIUJOX2NvcHkoYSwgJmdyb3VwLT5hKSkKKyAgICAgIGdvdG8gZXJyOworICAgIGlmICghQk5fY29weShiLCAmZ3JvdXAtPmIpKQorICAgICAgZ290byBlcnI7CisgIH0KKworICAvKiBjaGVjayB0aGUgZGlzY3JpbWluYW50OgorICAgKiB5XjIgPSB4XjMgKyBhKnggKyBiIGlzIGFuIGVsbGlwdGljIGN1cnZlIDw9PiA0KmFeMyArIDI3KmJeMiAhPSAwIChtb2QgcCkKKyAgICogMCA9PCBhLCBiIDwgcCAqLworICBpZiAoQk5faXNfemVybyhhKSkgeworICAgIGlmIChCTl9pc196ZXJvKGIpKQorICAgICAgZ290byBlcnI7CisgIH0gZWxzZSBpZiAoIUJOX2lzX3plcm8oYikpIHsKKyAgICBpZiAoIUJOX21vZF9zcXIodG1wXzEsIGEsIHAsIGN0eCkpCisgICAgICBnb3RvIGVycjsKKyAgICBpZiAoIUJOX21vZF9tdWwodG1wXzIsIHRtcF8xLCBhLCBwLCBjdHgpKQorICAgICAgZ290byBlcnI7CisgICAgaWYgKCFCTl9sc2hpZnQodG1wXzEsIHRtcF8yLCAyKSkKKyAgICAgIGdvdG8gZXJyOworICAgIC8qIHRtcF8xID0gNCphXjMgKi8KKworICAgIGlmICghQk5fbW9kX3Nxcih0bXBfMiwgYiwgcCwgY3R4KSkKKyAgICAgIGdvdG8gZXJyOworICAgIGlmICghQk5fbXVsX3dvcmQodG1wXzIsIDI3KSkKKyAgICAgIGdvdG8gZXJyOworICAgIC8qIHRtcF8yID0gMjcqYl4yICovCisKKyAgICBpZiAoIUJOX21vZF9hZGQoYSwgdG1wXzEsIHRtcF8yLCBwLCBjdHgpKQorICAgICAgZ290byBlcnI7CisgICAgaWYgKEJOX2lzX3plcm8oYSkpCisgICAgICBnb3RvIGVycjsKKyAgfQorICByZXQgPSAxOworCitlcnI6CisgIGlmIChjdHggIT0gTlVMTCkKKyAgICBCTl9DVFhfZW5kKGN0eCk7CisgIGlmIChuZXdfY3R4ICE9IE5VTEwpCisgICAgQk5fQ1RYX2ZyZWUobmV3X2N0eCk7CisgIHJldHVybiByZXQ7Cit9CisKK2ludCBlY19HRnBfc2ltcGxlX3BvaW50X2luaXQoRUNfUE9JTlQgKnBvaW50KSB7CisgIEJOX2luaXQoJnBvaW50LT5YKTsKKyAgQk5faW5pdCgmcG9pbnQtPlkpOworICBCTl9pbml0KCZwb2ludC0+Wik7CisgIHBvaW50LT5aX2lzX29uZSA9IDA7CisKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgZWNfR0ZwX3NpbXBsZV9wb2ludF9maW5pc2goRUNfUE9JTlQgKnBvaW50KSB7CisgIEJOX2ZyZWUoJnBvaW50LT5YKTsKKyAgQk5fZnJlZSgmcG9pbnQtPlkpOworICBCTl9mcmVlKCZwb2ludC0+Wik7Cit9CisKK3ZvaWQgZWNfR0ZwX3NpbXBsZV9wb2ludF9jbGVhcl9maW5pc2goRUNfUE9JTlQgKnBvaW50KSB7CisgIEJOX2NsZWFyX2ZyZWUoJnBvaW50LT5YKTsKKyAgQk5fY2xlYXJfZnJlZSgmcG9pbnQtPlkpOworICBCTl9jbGVhcl9mcmVlKCZwb2ludC0+Wik7CisgIHBvaW50LT5aX2lzX29uZSA9IDA7Cit9CisKK2ludCBlY19HRnBfc2ltcGxlX3BvaW50X2NvcHkoRUNfUE9JTlQgKmRlc3QsIGNvbnN0IEVDX1BPSU5UICpzcmMpIHsKKyAgaWYgKCFCTl9jb3B5KCZkZXN0LT5YLCAmc3JjLT5YKSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKCFCTl9jb3B5KCZkZXN0LT5ZLCAmc3JjLT5ZKSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKCFCTl9jb3B5KCZkZXN0LT5aLCAmc3JjLT5aKSkKKyAgICByZXR1cm4gMDsKKyAgZGVzdC0+Wl9pc19vbmUgPSBzcmMtPlpfaXNfb25lOworCisgIHJldHVybiAxOworfQorCitpbnQgZWNfR0ZwX3NpbXBsZV9wb2ludF9zZXRfdG9faW5maW5pdHkoY29uc3QgRUNfR1JPVVAgKmdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVDX1BPSU5UICpwb2ludCkgeworICBwb2ludC0+Wl9pc19vbmUgPSAwOworICBCTl96ZXJvKCZwb2ludC0+Wik7CisgIHJldHVybiAxOworfQorCitpbnQgZWNfR0ZwX3NpbXBsZV9zZXRfSnByb2plY3RpdmVfY29vcmRpbmF0ZXNfR0ZwKAorICAgIGNvbnN0IEVDX0dST1VQICpncm91cCwgRUNfUE9JTlQgKnBvaW50LCBjb25zdCBCSUdOVU0gKngsIGNvbnN0IEJJR05VTSAqeSwKKyAgICBjb25zdCBCSUdOVU0gKnosIEJOX0NUWCAqY3R4KSB7CisgIEJOX0NUWCAqbmV3X2N0eCA9IE5VTEw7CisgIGludCByZXQgPSAwOworCisgIGlmIChjdHggPT0gTlVMTCkgeworICAgIGN0eCA9IG5ld19jdHggPSBCTl9DVFhfbmV3KCk7CisgICAgaWYgKGN0eCA9PSBOVUxMKQorICAgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoeCAhPSBOVUxMKSB7CisgICAgaWYgKCFCTl9ubm1vZCgmcG9pbnQtPlgsIHgsICZncm91cC0+ZmllbGQsIGN0eCkpCisgICAgICBnb3RvIGVycjsKKyAgICBpZiAoZ3JvdXAtPm1ldGgtPmZpZWxkX2VuY29kZSkgeworICAgICAgaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfZW5jb2RlKGdyb3VwLCAmcG9pbnQtPlgsICZwb2ludC0+WCwgY3R4KSkKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorICB9CisKKyAgaWYgKHkgIT0gTlVMTCkgeworICAgIGlmICghQk5fbm5tb2QoJnBvaW50LT5ZLCB5LCAmZ3JvdXAtPmZpZWxkLCBjdHgpKQorICAgICAgZ290byBlcnI7CisgICAgaWYgKGdyb3VwLT5tZXRoLT5maWVsZF9lbmNvZGUpIHsKKyAgICAgIGlmICghZ3JvdXAtPm1ldGgtPmZpZWxkX2VuY29kZShncm91cCwgJnBvaW50LT5ZLCAmcG9pbnQtPlksIGN0eCkpCisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfQorCisgIGlmICh6ICE9IE5VTEwpIHsKKyAgICBpbnQgWl9pc19vbmU7CisKKyAgICBpZiAoIUJOX25ubW9kKCZwb2ludC0+WiwgeiwgJmdyb3VwLT5maWVsZCwgY3R4KSkKKyAgICAgIGdvdG8gZXJyOworICAgIFpfaXNfb25lID0gQk5faXNfb25lKCZwb2ludC0+Wik7CisgICAgaWYgKGdyb3VwLT5tZXRoLT5maWVsZF9lbmNvZGUpIHsKKyAgICAgIGlmIChaX2lzX29uZSAmJiAoZ3JvdXAtPm1ldGgtPmZpZWxkX3NldF90b19vbmUgIT0gMCkpIHsKKyAgICAgICAgaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfc2V0X3RvX29uZShncm91cCwgJnBvaW50LT5aLCBjdHgpKQorICAgICAgICAgIGdvdG8gZXJyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfZW5jb2RlKGdyb3VwLCAmcG9pbnQtPlosICZwb2ludC0+WiwgY3R4KSkKKyAgICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICB9CisgICAgcG9pbnQtPlpfaXNfb25lID0gWl9pc19vbmU7CisgIH0KKworICByZXQgPSAxOworCitlcnI6CisgIGlmIChuZXdfY3R4ICE9IE5VTEwpCisgICAgQk5fQ1RYX2ZyZWUobmV3X2N0eCk7CisgIHJldHVybiByZXQ7Cit9CisKK2ludCBlY19HRnBfc2ltcGxlX2dldF9KcHJvamVjdGl2ZV9jb29yZGluYXRlc19HRnAoY29uc3QgRUNfR1JPVVAgKmdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFQ19QT0lOVCAqcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJR05VTSAqeCwgQklHTlVNICp5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSUdOVU0gKnosIEJOX0NUWCAqY3R4KSB7CisgIEJOX0NUWCAqbmV3X2N0eCA9IE5VTEw7CisgIGludCByZXQgPSAwOworCisgIGlmIChncm91cC0+bWV0aC0+ZmllbGRfZGVjb2RlICE9IDApIHsKKyAgICBpZiAoY3R4ID09IE5VTEwpIHsKKyAgICAgIGN0eCA9IG5ld19jdHggPSBCTl9DVFhfbmV3KCk7CisgICAgICBpZiAoY3R4ID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICh4ICE9IE5VTEwpIHsKKyAgICAgIGlmICghZ3JvdXAtPm1ldGgtPmZpZWxkX2RlY29kZShncm91cCwgeCwgJnBvaW50LT5YLCBjdHgpKQorICAgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgaWYgKHkgIT0gTlVMTCkgeworICAgICAgaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfZGVjb2RlKGdyb3VwLCB5LCAmcG9pbnQtPlksIGN0eCkpCisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBpZiAoeiAhPSBOVUxMKSB7CisgICAgICBpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9kZWNvZGUoZ3JvdXAsIHosICZwb2ludC0+WiwgY3R4KSkKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmICh4ICE9IE5VTEwpIHsKKyAgICAgIGlmICghQk5fY29weSh4LCAmcG9pbnQtPlgpKQorICAgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgaWYgKHkgIT0gTlVMTCkgeworICAgICAgaWYgKCFCTl9jb3B5KHksICZwb2ludC0+WSkpCisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBpZiAoeiAhPSBOVUxMKSB7CisgICAgICBpZiAoIUJOX2NvcHkoeiwgJnBvaW50LT5aKSkKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorICB9CisKKyAgcmV0ID0gMTsKKworZXJyOgorICBpZiAobmV3X2N0eCAhPSBOVUxMKQorICAgIEJOX0NUWF9mcmVlKG5ld19jdHgpOworICByZXR1cm4gcmV0OworfQorCitpbnQgZWNfR0ZwX3NpbXBsZV9wb2ludF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzKGNvbnN0IEVDX0dST1VQICpncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUNfUE9JTlQgKnBvaW50LCBjb25zdCBCSUdOVU0gKngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJJR05VTSAqeSwgQk5fQ1RYICpjdHgpIHsKKyAgaWYgKHggPT0gTlVMTCB8fCB5ID09IE5VTEwpIHsKKyAgICAvKiB1bmxpa2UgZm9yIHByb2plY3RpdmUgY29vcmRpbmF0ZXMsIHdlIGRvIG5vdCB0b2xlcmF0ZSB0aGlzICovCisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9zaW1wbGVfcG9pbnRfc2V0X2FmZmluZV9jb29yZGluYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworICAgIHJldHVybiAwOworICB9CisKKyAgcmV0dXJuIGVjX3BvaW50X3NldF9KcHJvamVjdGl2ZV9jb29yZGluYXRlc19HRnAoZ3JvdXAsIHBvaW50LCB4LCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTl92YWx1ZV9vbmUoKSwgY3R4KTsKK30KKworaW50IGVjX0dGcF9zaW1wbGVfcG9pbnRfZ2V0X2FmZmluZV9jb29yZGluYXRlcyhjb25zdCBFQ19HUk9VUCAqZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVDX1BPSU5UICpwb2ludCwgQklHTlVNICp4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSUdOVU0gKnksIEJOX0NUWCAqY3R4KSB7CisgIEJOX0NUWCAqbmV3X2N0eCA9IE5VTEw7CisgIEJJR05VTSAqWiwgKlpfMSwgKlpfMiwgKlpfMzsKKyAgY29uc3QgQklHTlVNICpaXzsKKyAgaW50IHJldCA9IDA7CisKKyAgaWYgKEVDX1BPSU5UX2lzX2F0X2luZmluaXR5KGdyb3VwLCBwb2ludCkpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfR0ZwX3NpbXBsZV9wb2ludF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzLAorICAgICAgICAgICAgICAgICAgICAgIEVDX1JfUE9JTlRfQVRfSU5GSU5JVFkpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKGN0eCA9PSBOVUxMKSB7CisgICAgY3R4ID0gbmV3X2N0eCA9IEJOX0NUWF9uZXcoKTsKKyAgICBpZiAoY3R4ID09IE5VTEwpCisgICAgICByZXR1cm4gMDsKKyAgfQorCisgIEJOX0NUWF9zdGFydChjdHgpOworICBaID0gQk5fQ1RYX2dldChjdHgpOworICBaXzEgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIFpfMiA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgWl8zID0gQk5fQ1RYX2dldChjdHgpOworICBpZiAoWl8zID09IE5VTEwpCisgICAgZ290byBlcnI7CisKKyAgLyogdHJhbnNmb3JtICAoWCwgWSwgWikgIGludG8gICh4LCB5KSA6PSAoWC9aXjIsIFkvWl4zKSAqLworCisgIGlmIChncm91cC0+bWV0aC0+ZmllbGRfZGVjb2RlKSB7CisgICAgaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfZGVjb2RlKGdyb3VwLCBaLCAmcG9pbnQtPlosIGN0eCkpCisgICAgICBnb3RvIGVycjsKKyAgICBaXyA9IFo7CisgIH0gZWxzZSB7CisgICAgWl8gPSAmcG9pbnQtPlo7CisgIH0KKworICBpZiAoQk5faXNfb25lKFpfKSkgeworICAgIGlmIChncm91cC0+bWV0aC0+ZmllbGRfZGVjb2RlKSB7CisgICAgICBpZiAoeCAhPSBOVUxMKSB7CisgICAgICAgIGlmICghZ3JvdXAtPm1ldGgtPmZpZWxkX2RlY29kZShncm91cCwgeCwgJnBvaW50LT5YLCBjdHgpKQorICAgICAgICAgIGdvdG8gZXJyOworICAgICAgfQorICAgICAgaWYgKHkgIT0gTlVMTCkgeworICAgICAgICBpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9kZWNvZGUoZ3JvdXAsIHksICZwb2ludC0+WSwgY3R4KSkKKyAgICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKHggIT0gTlVMTCkgeworICAgICAgICBpZiAoIUJOX2NvcHkoeCwgJnBvaW50LT5YKSkKKyAgICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICAgIGlmICh5ICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKCFCTl9jb3B5KHksICZwb2ludC0+WSkpCisgICAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGlmICghQk5fbW9kX2ludmVyc2UoWl8xLCBaXywgJmdyb3VwLT5maWVsZCwgY3R4KSkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9zaW1wbGVfcG9pbnRfZ2V0X2FmZmluZV9jb29yZGluYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX0JOX0xJQik7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBpZiAoZ3JvdXAtPm1ldGgtPmZpZWxkX2VuY29kZSA9PSAwKSB7CisgICAgICAvKiBmaWVsZF9zcXIgd29ya3Mgb24gc3RhbmRhcmQgcmVwcmVzZW50YXRpb24gKi8KKyAgICAgIGlmICghZ3JvdXAtPm1ldGgtPmZpZWxkX3Nxcihncm91cCwgWl8yLCBaXzEsIGN0eCkpCisgICAgICAgIGdvdG8gZXJyOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoIUJOX21vZF9zcXIoWl8yLCBaXzEsICZncm91cC0+ZmllbGQsIGN0eCkpCisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGlmICh4ICE9IE5VTEwpIHsKKyAgICAgIC8qIGluIHRoZSBNb250Z29tZXJ5IGNhc2UsIGZpZWxkX211bCB3aWxsIGNhbmNlbCBvdXQgTW9udGdvbWVyeSBmYWN0b3IgaW4KKyAgICAgICAqIFg6ICovCisgICAgICBpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9tdWwoZ3JvdXAsIHgsICZwb2ludC0+WCwgWl8yLCBjdHgpKQorICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBpZiAoeSAhPSBOVUxMKSB7CisgICAgICBpZiAoZ3JvdXAtPm1ldGgtPmZpZWxkX2VuY29kZSA9PSAwKSB7CisgICAgICAgIC8qIGZpZWxkX211bCB3b3JrcyBvbiBzdGFuZGFyZCByZXByZXNlbnRhdGlvbiAqLworICAgICAgICBpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9tdWwoZ3JvdXAsIFpfMywgWl8yLCBaXzEsIGN0eCkpCisgICAgICAgICAgZ290byBlcnI7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoIUJOX21vZF9tdWwoWl8zLCBaXzIsIFpfMSwgJmdyb3VwLT5maWVsZCwgY3R4KSkKKyAgICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKworICAgICAgLyogaW4gdGhlIE1vbnRnb21lcnkgY2FzZSwgZmllbGRfbXVsIHdpbGwgY2FuY2VsIG91dCBNb250Z29tZXJ5IGZhY3RvciBpbgorICAgICAgICogWTogKi8KKyAgICAgIGlmICghZ3JvdXAtPm1ldGgtPmZpZWxkX211bChncm91cCwgeSwgJnBvaW50LT5ZLCBaXzMsIGN0eCkpCisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfQorCisgIHJldCA9IDE7CisKK2VycjoKKyAgQk5fQ1RYX2VuZChjdHgpOworICBpZiAobmV3X2N0eCAhPSBOVUxMKQorICAgIEJOX0NUWF9mcmVlKG5ld19jdHgpOworICByZXR1cm4gcmV0OworfQorCitpbnQgZWNfR0ZwX3NpbXBsZV9hZGQoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqciwgY29uc3QgRUNfUE9JTlQgKmEsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRUNfUE9JTlQgKmIsIEJOX0NUWCAqY3R4KSB7CisgIGludCAoKmZpZWxkX211bCkoY29uc3QgRUNfR1JPVVAgKiwgQklHTlVNICosIGNvbnN0IEJJR05VTSAqLCBjb25zdCBCSUdOVU0gKiwKKyAgICAgICAgICAgICAgICAgICBCTl9DVFggKik7CisgIGludCAoKmZpZWxkX3NxcikoY29uc3QgRUNfR1JPVVAgKiwgQklHTlVNICosIGNvbnN0IEJJR05VTSAqLCBCTl9DVFggKik7CisgIGNvbnN0IEJJR05VTSAqcDsKKyAgQk5fQ1RYICpuZXdfY3R4ID0gTlVMTDsKKyAgQklHTlVNICpuMCwgKm4xLCAqbjIsICpuMywgKm40LCAqbjUsICpuNjsKKyAgaW50IHJldCA9IDA7CisKKyAgaWYgKGEgPT0gYikKKyAgICByZXR1cm4gRUNfUE9JTlRfZGJsKGdyb3VwLCByLCBhLCBjdHgpOworICBpZiAoRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZ3JvdXAsIGEpKQorICAgIHJldHVybiBFQ19QT0lOVF9jb3B5KHIsIGIpOworICBpZiAoRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZ3JvdXAsIGIpKQorICAgIHJldHVybiBFQ19QT0lOVF9jb3B5KHIsIGEpOworCisgIGZpZWxkX211bCA9IGdyb3VwLT5tZXRoLT5maWVsZF9tdWw7CisgIGZpZWxkX3NxciA9IGdyb3VwLT5tZXRoLT5maWVsZF9zcXI7CisgIHAgPSAmZ3JvdXAtPmZpZWxkOworCisgIGlmIChjdHggPT0gTlVMTCkgeworICAgIGN0eCA9IG5ld19jdHggPSBCTl9DVFhfbmV3KCk7CisgICAgaWYgKGN0eCA9PSBOVUxMKQorICAgICAgcmV0dXJuIDA7CisgIH0KKworICBCTl9DVFhfc3RhcnQoY3R4KTsKKyAgbjAgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIG4xID0gQk5fQ1RYX2dldChjdHgpOworICBuMiA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgbjMgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIG40ID0gQk5fQ1RYX2dldChjdHgpOworICBuNSA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgbjYgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIGlmIChuNiA9PSBOVUxMKQorICAgIGdvdG8gZW5kOworCisgIC8qIE5vdGUgdGhhdCBpbiB0aGlzIGZ1bmN0aW9uIHdlIG11c3Qgbm90IHJlYWQgY29tcG9uZW50cyBvZiAnYScgb3IgJ2InCisgICAqIG9uY2Ugd2UgaGF2ZSB3cml0dGVuIHRoZSBjb3JyZXNwb25kaW5nIGNvbXBvbmVudHMgb2YgJ3InLgorICAgKiAoJ3InIG1pZ2h0IGJlIG9uZSBvZiAnYScgb3IgJ2InLikKKyAgICovCisKKyAgLyogbjEsIG4yICovCisgIGlmIChiLT5aX2lzX29uZSkgeworICAgIGlmICghQk5fY29weShuMSwgJmEtPlgpKQorICAgICAgZ290byBlbmQ7CisgICAgaWYgKCFCTl9jb3B5KG4yLCAmYS0+WSkpCisgICAgICBnb3RvIGVuZDsKKyAgICAvKiBuMSA9IFhfYSAqLworICAgIC8qIG4yID0gWV9hICovCisgIH0gZWxzZSB7CisgICAgaWYgKCFmaWVsZF9zcXIoZ3JvdXAsIG4wLCAmYi0+WiwgY3R4KSkKKyAgICAgIGdvdG8gZW5kOworICAgIGlmICghZmllbGRfbXVsKGdyb3VwLCBuMSwgJmEtPlgsIG4wLCBjdHgpKQorICAgICAgZ290byBlbmQ7CisgICAgLyogbjEgPSBYX2EgKiBaX2JeMiAqLworCisgICAgaWYgKCFmaWVsZF9tdWwoZ3JvdXAsIG4wLCBuMCwgJmItPlosIGN0eCkpCisgICAgICBnb3RvIGVuZDsKKyAgICBpZiAoIWZpZWxkX211bChncm91cCwgbjIsICZhLT5ZLCBuMCwgY3R4KSkKKyAgICAgIGdvdG8gZW5kOworICAgIC8qIG4yID0gWV9hICogWl9iXjMgKi8KKyAgfQorCisgIC8qIG4zLCBuNCAqLworICBpZiAoYS0+Wl9pc19vbmUpIHsKKyAgICBpZiAoIUJOX2NvcHkobjMsICZiLT5YKSkKKyAgICAgIGdvdG8gZW5kOworICAgIGlmICghQk5fY29weShuNCwgJmItPlkpKQorICAgICAgZ290byBlbmQ7CisgICAgLyogbjMgPSBYX2IgKi8KKyAgICAvKiBuNCA9IFlfYiAqLworICB9IGVsc2UgeworICAgIGlmICghZmllbGRfc3FyKGdyb3VwLCBuMCwgJmEtPlosIGN0eCkpCisgICAgICBnb3RvIGVuZDsKKyAgICBpZiAoIWZpZWxkX211bChncm91cCwgbjMsICZiLT5YLCBuMCwgY3R4KSkKKyAgICAgIGdvdG8gZW5kOworICAgIC8qIG4zID0gWF9iICogWl9hXjIgKi8KKworICAgIGlmICghZmllbGRfbXVsKGdyb3VwLCBuMCwgbjAsICZhLT5aLCBjdHgpKQorICAgICAgZ290byBlbmQ7CisgICAgaWYgKCFmaWVsZF9tdWwoZ3JvdXAsIG40LCAmYi0+WSwgbjAsIGN0eCkpCisgICAgICBnb3RvIGVuZDsKKyAgICAvKiBuNCA9IFlfYiAqIFpfYV4zICovCisgIH0KKworICAvKiBuNSwgbjYgKi8KKyAgaWYgKCFCTl9tb2Rfc3ViX3F1aWNrKG41LCBuMSwgbjMsIHApKQorICAgIGdvdG8gZW5kOworICBpZiAoIUJOX21vZF9zdWJfcXVpY2sobjYsIG4yLCBuNCwgcCkpCisgICAgZ290byBlbmQ7CisgIC8qIG41ID0gbjEgLSBuMyAqLworICAvKiBuNiA9IG4yIC0gbjQgKi8KKworICBpZiAoQk5faXNfemVybyhuNSkpIHsKKyAgICBpZiAoQk5faXNfemVybyhuNikpIHsKKyAgICAgIC8qIGEgaXMgdGhlIHNhbWUgcG9pbnQgYXMgYiAqLworICAgICAgQk5fQ1RYX2VuZChjdHgpOworICAgICAgcmV0ID0gRUNfUE9JTlRfZGJsKGdyb3VwLCByLCBhLCBjdHgpOworICAgICAgY3R4ID0gTlVMTDsKKyAgICAgIGdvdG8gZW5kOworICAgIH0gZWxzZSB7CisgICAgICAvKiBhIGlzIHRoZSBpbnZlcnNlIG9mIGIgKi8KKyAgICAgIEJOX3plcm8oJnItPlopOworICAgICAgci0+Wl9pc19vbmUgPSAwOworICAgICAgcmV0ID0gMTsKKyAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgfQorCisgIC8qICduNycsICduOCcgKi8KKyAgaWYgKCFCTl9tb2RfYWRkX3F1aWNrKG4xLCBuMSwgbjMsIHApKQorICAgIGdvdG8gZW5kOworICBpZiAoIUJOX21vZF9hZGRfcXVpY2sobjIsIG4yLCBuNCwgcCkpCisgICAgZ290byBlbmQ7CisgIC8qICduNycgPSBuMSArIG4zICovCisgIC8qICduOCcgPSBuMiArIG40ICovCisKKyAgLyogWl9yICovCisgIGlmIChhLT5aX2lzX29uZSAmJiBiLT5aX2lzX29uZSkgeworICAgIGlmICghQk5fY29weSgmci0+WiwgbjUpKQorICAgICAgZ290byBlbmQ7CisgIH0gZWxzZSB7CisgICAgaWYgKGEtPlpfaXNfb25lKSB7CisgICAgICBpZiAoIUJOX2NvcHkobjAsICZiLT5aKSkKKyAgICAgICAgZ290byBlbmQ7CisgICAgfSBlbHNlIGlmIChiLT5aX2lzX29uZSkgeworICAgICAgaWYgKCFCTl9jb3B5KG4wLCAmYS0+WikpCisgICAgICAgIGdvdG8gZW5kOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoIWZpZWxkX211bChncm91cCwgbjAsICZhLT5aLCAmYi0+WiwgY3R4KSkKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIGlmICghZmllbGRfbXVsKGdyb3VwLCAmci0+WiwgbjAsIG41LCBjdHgpKQorICAgICAgZ290byBlbmQ7CisgIH0KKyAgci0+Wl9pc19vbmUgPSAwOworICAvKiBaX3IgPSBaX2EgKiBaX2IgKiBuNSAqLworCisgIC8qIFhfciAqLworICBpZiAoIWZpZWxkX3Nxcihncm91cCwgbjAsIG42LCBjdHgpKQorICAgIGdvdG8gZW5kOworICBpZiAoIWZpZWxkX3Nxcihncm91cCwgbjQsIG41LCBjdHgpKQorICAgIGdvdG8gZW5kOworICBpZiAoIWZpZWxkX211bChncm91cCwgbjMsIG4xLCBuNCwgY3R4KSkKKyAgICBnb3RvIGVuZDsKKyAgaWYgKCFCTl9tb2Rfc3ViX3F1aWNrKCZyLT5YLCBuMCwgbjMsIHApKQorICAgIGdvdG8gZW5kOworICAvKiBYX3IgPSBuNl4yIC0gbjVeMiAqICduNycgKi8KKworICAvKiAnbjknICovCisgIGlmICghQk5fbW9kX2xzaGlmdDFfcXVpY2sobjAsICZyLT5YLCBwKSkKKyAgICBnb3RvIGVuZDsKKyAgaWYgKCFCTl9tb2Rfc3ViX3F1aWNrKG4wLCBuMywgbjAsIHApKQorICAgIGdvdG8gZW5kOworICAvKiBuOSA9IG41XjIgKiAnbjcnIC0gMiAqIFhfciAqLworCisgIC8qIFlfciAqLworICBpZiAoIWZpZWxkX211bChncm91cCwgbjAsIG4wLCBuNiwgY3R4KSkKKyAgICBnb3RvIGVuZDsKKyAgaWYgKCFmaWVsZF9tdWwoZ3JvdXAsIG41LCBuNCwgbjUsIGN0eCkpCisgICAgZ290byBlbmQ7IC8qIG5vdyBuNSBpcyBuNV4zICovCisgIGlmICghZmllbGRfbXVsKGdyb3VwLCBuMSwgbjIsIG41LCBjdHgpKQorICAgIGdvdG8gZW5kOworICBpZiAoIUJOX21vZF9zdWJfcXVpY2sobjAsIG4wLCBuMSwgcCkpCisgICAgZ290byBlbmQ7CisgIGlmIChCTl9pc19vZGQobjApKQorICAgIGlmICghQk5fYWRkKG4wLCBuMCwgcCkpCisgICAgICBnb3RvIGVuZDsKKyAgLyogbm93ICAwIDw9IG4wIDwgMipwLCAgYW5kIG4wIGlzIGV2ZW4gKi8KKyAgaWYgKCFCTl9yc2hpZnQxKCZyLT5ZLCBuMCkpCisgICAgZ290byBlbmQ7CisgIC8qIFlfciA9IChuNiAqICduOScgLSAnbjgnICogJ241XjMnKSAvIDIgKi8KKworICByZXQgPSAxOworCitlbmQ6CisgIGlmIChjdHgpIC8qIG90aGVyd2lzZSB3ZSBhbHJlYWR5IGNhbGxlZCBCTl9DVFhfZW5kICovCisgICAgQk5fQ1RYX2VuZChjdHgpOworICBpZiAobmV3X2N0eCAhPSBOVUxMKQorICAgIEJOX0NUWF9mcmVlKG5ld19jdHgpOworICByZXR1cm4gcmV0OworfQorCitpbnQgZWNfR0ZwX3NpbXBsZV9kYmwoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqciwgY29uc3QgRUNfUE9JTlQgKmEsCisgICAgICAgICAgICAgICAgICAgICAgQk5fQ1RYICpjdHgpIHsKKyAgaW50ICgqZmllbGRfbXVsKShjb25zdCBFQ19HUk9VUCAqLCBCSUdOVU0gKiwgY29uc3QgQklHTlVNICosIGNvbnN0IEJJR05VTSAqLAorICAgICAgICAgICAgICAgICAgIEJOX0NUWCAqKTsKKyAgaW50ICgqZmllbGRfc3FyKShjb25zdCBFQ19HUk9VUCAqLCBCSUdOVU0gKiwgY29uc3QgQklHTlVNICosIEJOX0NUWCAqKTsKKyAgY29uc3QgQklHTlVNICpwOworICBCTl9DVFggKm5ld19jdHggPSBOVUxMOworICBCSUdOVU0gKm4wLCAqbjEsICpuMiwgKm4zOworICBpbnQgcmV0ID0gMDsKKworICBpZiAoRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZ3JvdXAsIGEpKSB7CisgICAgQk5femVybygmci0+Wik7CisgICAgci0+Wl9pc19vbmUgPSAwOworICAgIHJldHVybiAxOworICB9CisKKyAgZmllbGRfbXVsID0gZ3JvdXAtPm1ldGgtPmZpZWxkX211bDsKKyAgZmllbGRfc3FyID0gZ3JvdXAtPm1ldGgtPmZpZWxkX3NxcjsKKyAgcCA9ICZncm91cC0+ZmllbGQ7CisKKyAgaWYgKGN0eCA9PSBOVUxMKSB7CisgICAgY3R4ID0gbmV3X2N0eCA9IEJOX0NUWF9uZXcoKTsKKyAgICBpZiAoY3R4ID09IE5VTEwpCisgICAgICByZXR1cm4gMDsKKyAgfQorCisgIEJOX0NUWF9zdGFydChjdHgpOworICBuMCA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgbjEgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIG4yID0gQk5fQ1RYX2dldChjdHgpOworICBuMyA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgaWYgKG4zID09IE5VTEwpCisgICAgZ290byBlcnI7CisKKyAgLyogTm90ZSB0aGF0IGluIHRoaXMgZnVuY3Rpb24gd2UgbXVzdCBub3QgcmVhZCBjb21wb25lbnRzIG9mICdhJworICAgKiBvbmNlIHdlIGhhdmUgd3JpdHRlbiB0aGUgY29ycmVzcG9uZGluZyBjb21wb25lbnRzIG9mICdyJy4KKyAgICogKCdyJyBtaWdodCB0aGUgc2FtZSBhcyAnYScuKQorICAgKi8KKworICAvKiBuMSAqLworICBpZiAoYS0+Wl9pc19vbmUpIHsKKyAgICBpZiAoIWZpZWxkX3Nxcihncm91cCwgbjAsICZhLT5YLCBjdHgpKQorICAgICAgZ290byBlcnI7CisgICAgaWYgKCFCTl9tb2RfbHNoaWZ0MV9xdWljayhuMSwgbjAsIHApKQorICAgICAgZ290byBlcnI7CisgICAgaWYgKCFCTl9tb2RfYWRkX3F1aWNrKG4wLCBuMCwgbjEsIHApKQorICAgICAgZ290byBlcnI7CisgICAgaWYgKCFCTl9tb2RfYWRkX3F1aWNrKG4xLCBuMCwgJmdyb3VwLT5hLCBwKSkKKyAgICAgIGdvdG8gZXJyOworICAgIC8qIG4xID0gMyAqIFhfYV4yICsgYV9jdXJ2ZSAqLworICB9IGVsc2UgaWYgKGdyb3VwLT5hX2lzX21pbnVzMykgeworICAgIGlmICghZmllbGRfc3FyKGdyb3VwLCBuMSwgJmEtPlosIGN0eCkpCisgICAgICBnb3RvIGVycjsKKyAgICBpZiAoIUJOX21vZF9hZGRfcXVpY2sobjAsICZhLT5YLCBuMSwgcCkpCisgICAgICBnb3RvIGVycjsKKyAgICBpZiAoIUJOX21vZF9zdWJfcXVpY2sobjIsICZhLT5YLCBuMSwgcCkpCisgICAgICBnb3RvIGVycjsKKyAgICBpZiAoIWZpZWxkX211bChncm91cCwgbjEsIG4wLCBuMiwgY3R4KSkKKyAgICAgIGdvdG8gZXJyOworICAgIGlmICghQk5fbW9kX2xzaGlmdDFfcXVpY2sobjAsIG4xLCBwKSkKKyAgICAgIGdvdG8gZXJyOworICAgIGlmICghQk5fbW9kX2FkZF9xdWljayhuMSwgbjAsIG4xLCBwKSkKKyAgICAgIGdvdG8gZXJyOworICAgIC8qIG4xID0gMyAqIChYX2EgKyBaX2FeMikgKiAoWF9hIC0gWl9hXjIpCisgICAgICogICAgPSAzICogWF9hXjIgLSAzICogWl9hXjQgKi8KKyAgfSBlbHNlIHsKKyAgICBpZiAoIWZpZWxkX3Nxcihncm91cCwgbjAsICZhLT5YLCBjdHgpKQorICAgICAgZ290byBlcnI7CisgICAgaWYgKCFCTl9tb2RfbHNoaWZ0MV9xdWljayhuMSwgbjAsIHApKQorICAgICAgZ290byBlcnI7CisgICAgaWYgKCFCTl9tb2RfYWRkX3F1aWNrKG4wLCBuMCwgbjEsIHApKQorICAgICAgZ290byBlcnI7CisgICAgaWYgKCFmaWVsZF9zcXIoZ3JvdXAsIG4xLCAmYS0+WiwgY3R4KSkKKyAgICAgIGdvdG8gZXJyOworICAgIGlmICghZmllbGRfc3FyKGdyb3VwLCBuMSwgbjEsIGN0eCkpCisgICAgICBnb3RvIGVycjsKKyAgICBpZiAoIWZpZWxkX211bChncm91cCwgbjEsIG4xLCAmZ3JvdXAtPmEsIGN0eCkpCisgICAgICBnb3RvIGVycjsKKyAgICBpZiAoIUJOX21vZF9hZGRfcXVpY2sobjEsIG4xLCBuMCwgcCkpCisgICAgICBnb3RvIGVycjsKKyAgICAvKiBuMSA9IDMgKiBYX2FeMiArIGFfY3VydmUgKiBaX2FeNCAqLworICB9CisKKyAgLyogWl9yICovCisgIGlmIChhLT5aX2lzX29uZSkgeworICAgIGlmICghQk5fY29weShuMCwgJmEtPlkpKQorICAgICAgZ290byBlcnI7CisgIH0gZWxzZSB7CisgICAgaWYgKCFmaWVsZF9tdWwoZ3JvdXAsIG4wLCAmYS0+WSwgJmEtPlosIGN0eCkpCisgICAgICBnb3RvIGVycjsKKyAgfQorICBpZiAoIUJOX21vZF9sc2hpZnQxX3F1aWNrKCZyLT5aLCBuMCwgcCkpCisgICAgZ290byBlcnI7CisgIHItPlpfaXNfb25lID0gMDsKKyAgLyogWl9yID0gMiAqIFlfYSAqIFpfYSAqLworCisgIC8qIG4yICovCisgIGlmICghZmllbGRfc3FyKGdyb3VwLCBuMywgJmEtPlksIGN0eCkpCisgICAgZ290byBlcnI7CisgIGlmICghZmllbGRfbXVsKGdyb3VwLCBuMiwgJmEtPlgsIG4zLCBjdHgpKQorICAgIGdvdG8gZXJyOworICBpZiAoIUJOX21vZF9sc2hpZnRfcXVpY2sobjIsIG4yLCAyLCBwKSkKKyAgICBnb3RvIGVycjsKKyAgLyogbjIgPSA0ICogWF9hICogWV9hXjIgKi8KKworICAvKiBYX3IgKi8KKyAgaWYgKCFCTl9tb2RfbHNoaWZ0MV9xdWljayhuMCwgbjIsIHApKQorICAgIGdvdG8gZXJyOworICBpZiAoIWZpZWxkX3Nxcihncm91cCwgJnItPlgsIG4xLCBjdHgpKQorICAgIGdvdG8gZXJyOworICBpZiAoIUJOX21vZF9zdWJfcXVpY2soJnItPlgsICZyLT5YLCBuMCwgcCkpCisgICAgZ290byBlcnI7CisgIC8qIFhfciA9IG4xXjIgLSAyICogbjIgKi8KKworICAvKiBuMyAqLworICBpZiAoIWZpZWxkX3Nxcihncm91cCwgbjAsIG4zLCBjdHgpKQorICAgIGdvdG8gZXJyOworICBpZiAoIUJOX21vZF9sc2hpZnRfcXVpY2sobjMsIG4wLCAzLCBwKSkKKyAgICBnb3RvIGVycjsKKyAgLyogbjMgPSA4ICogWV9hXjQgKi8KKworICAvKiBZX3IgKi8KKyAgaWYgKCFCTl9tb2Rfc3ViX3F1aWNrKG4wLCBuMiwgJnItPlgsIHApKQorICAgIGdvdG8gZXJyOworICBpZiAoIWZpZWxkX211bChncm91cCwgbjAsIG4xLCBuMCwgY3R4KSkKKyAgICBnb3RvIGVycjsKKyAgaWYgKCFCTl9tb2Rfc3ViX3F1aWNrKCZyLT5ZLCBuMCwgbjMsIHApKQorICAgIGdvdG8gZXJyOworICAvKiBZX3IgPSBuMSAqIChuMiAtIFhfcikgLSBuMyAqLworCisgIHJldCA9IDE7CisKK2VycjoKKyAgQk5fQ1RYX2VuZChjdHgpOworICBpZiAobmV3X2N0eCAhPSBOVUxMKQorICAgIEJOX0NUWF9mcmVlKG5ld19jdHgpOworICByZXR1cm4gcmV0OworfQorCitpbnQgZWNfR0ZwX3NpbXBsZV9pbnZlcnQoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqcG9pbnQsIEJOX0NUWCAqY3R4KSB7CisgIGlmIChFQ19QT0lOVF9pc19hdF9pbmZpbml0eShncm91cCwgcG9pbnQpIHx8IEJOX2lzX3plcm8oJnBvaW50LT5ZKSkKKyAgICAvKiBwb2ludCBpcyBpdHMgb3duIGludmVyc2UgKi8KKyAgICByZXR1cm4gMTsKKworICByZXR1cm4gQk5fdXN1YigmcG9pbnQtPlksICZncm91cC0+ZmllbGQsICZwb2ludC0+WSk7Cit9CisKK2ludCBlY19HRnBfc2ltcGxlX2lzX2F0X2luZmluaXR5KGNvbnN0IEVDX0dST1VQICpncm91cCwgY29uc3QgRUNfUE9JTlQgKnBvaW50KSB7CisgIHJldHVybiAhcG9pbnQtPlpfaXNfb25lICYmIEJOX2lzX3plcm8oJnBvaW50LT5aKTsKK30KKworaW50IGVjX0dGcF9zaW1wbGVfaXNfb25fY3VydmUoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBjb25zdCBFQ19QT0lOVCAqcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTl9DVFggKmN0eCkgeworICBpbnQgKCpmaWVsZF9tdWwpKGNvbnN0IEVDX0dST1VQICosIEJJR05VTSAqLCBjb25zdCBCSUdOVU0gKiwgY29uc3QgQklHTlVNICosCisgICAgICAgICAgICAgICAgICAgQk5fQ1RYICopOworICBpbnQgKCpmaWVsZF9zcXIpKGNvbnN0IEVDX0dST1VQICosIEJJR05VTSAqLCBjb25zdCBCSUdOVU0gKiwgQk5fQ1RYICopOworICBjb25zdCBCSUdOVU0gKnA7CisgIEJOX0NUWCAqbmV3X2N0eCA9IE5VTEw7CisgIEJJR05VTSAqcmgsICp0bXAsICpaNCwgKlo2OworICBpbnQgcmV0ID0gLTE7CisKKyAgaWYgKEVDX1BPSU5UX2lzX2F0X2luZmluaXR5KGdyb3VwLCBwb2ludCkpCisgICAgcmV0dXJuIDE7CisKKyAgZmllbGRfbXVsID0gZ3JvdXAtPm1ldGgtPmZpZWxkX211bDsKKyAgZmllbGRfc3FyID0gZ3JvdXAtPm1ldGgtPmZpZWxkX3NxcjsKKyAgcCA9ICZncm91cC0+ZmllbGQ7CisKKyAgaWYgKGN0eCA9PSBOVUxMKSB7CisgICAgY3R4ID0gbmV3X2N0eCA9IEJOX0NUWF9uZXcoKTsKKyAgICBpZiAoY3R4ID09IE5VTEwpCisgICAgICByZXR1cm4gLTE7CisgIH0KKworICBCTl9DVFhfc3RhcnQoY3R4KTsKKyAgcmggPSBCTl9DVFhfZ2V0KGN0eCk7CisgIHRtcCA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgWjQgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIFo2ID0gQk5fQ1RYX2dldChjdHgpOworICBpZiAoWjYgPT0gTlVMTCkKKyAgICBnb3RvIGVycjsKKworICAvKiBXZSBoYXZlIGEgY3VydmUgZGVmaW5lZCBieSBhIFdlaWVyc3RyYXNzIGVxdWF0aW9uCisgICAqICAgICAgeV4yID0geF4zICsgYSp4ICsgYi4KKyAgICogVGhlIHBvaW50IHRvIGNvbnNpZGVyIGlzIGdpdmVuIGluIEphY29iaWFuIHByb2plY3RpdmUgY29vcmRpbmF0ZXMKKyAgICogd2hlcmUgIChYLCBZLCBaKSAgcmVwcmVzZW50cyAgKHgsIHkpID0gKFgvWl4yLCBZL1peMykuCisgICAqIFN1YnN0aXR1dGluZyB0aGlzIGFuZCBtdWx0aXBseWluZyBieSAgWl42ICB0cmFuc2Zvcm1zIHRoZSBhYm92ZSBlcXVhdGlvbgorICAgKiBpbnRvCisgICAqICAgICAgWV4yID0gWF4zICsgYSpYKlpeNCArIGIqWl42LgorICAgKiBUbyB0ZXN0IHRoaXMsIHdlIGFkZCB1cCB0aGUgcmlnaHQtaGFuZCBzaWRlIGluICdyaCcuCisgICAqLworCisgIC8qIHJoIDo9IFheMiAqLworICBpZiAoIWZpZWxkX3Nxcihncm91cCwgcmgsICZwb2ludC0+WCwgY3R4KSkKKyAgICBnb3RvIGVycjsKKworICBpZiAoIXBvaW50LT5aX2lzX29uZSkgeworICAgIGlmICghZmllbGRfc3FyKGdyb3VwLCB0bXAsICZwb2ludC0+WiwgY3R4KSkKKyAgICAgIGdvdG8gZXJyOworICAgIGlmICghZmllbGRfc3FyKGdyb3VwLCBaNCwgdG1wLCBjdHgpKQorICAgICAgZ290byBlcnI7CisgICAgaWYgKCFmaWVsZF9tdWwoZ3JvdXAsIFo2LCBaNCwgdG1wLCBjdHgpKQorICAgICAgZ290byBlcnI7CisKKyAgICAvKiByaCA6PSAocmggKyBhKlpeNCkqWCAqLworICAgIGlmIChncm91cC0+YV9pc19taW51czMpIHsKKyAgICAgIGlmICghQk5fbW9kX2xzaGlmdDFfcXVpY2sodG1wLCBaNCwgcCkpCisgICAgICAgIGdvdG8gZXJyOworICAgICAgaWYgKCFCTl9tb2RfYWRkX3F1aWNrKHRtcCwgdG1wLCBaNCwgcCkpCisgICAgICAgIGdvdG8gZXJyOworICAgICAgaWYgKCFCTl9tb2Rfc3ViX3F1aWNrKHJoLCByaCwgdG1wLCBwKSkKKyAgICAgICAgZ290byBlcnI7CisgICAgICBpZiAoIWZpZWxkX211bChncm91cCwgcmgsIHJoLCAmcG9pbnQtPlgsIGN0eCkpCisgICAgICAgIGdvdG8gZXJyOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoIWZpZWxkX211bChncm91cCwgdG1wLCBaNCwgJmdyb3VwLT5hLCBjdHgpKQorICAgICAgICBnb3RvIGVycjsKKyAgICAgIGlmICghQk5fbW9kX2FkZF9xdWljayhyaCwgcmgsIHRtcCwgcCkpCisgICAgICAgIGdvdG8gZXJyOworICAgICAgaWYgKCFmaWVsZF9tdWwoZ3JvdXAsIHJoLCByaCwgJnBvaW50LT5YLCBjdHgpKQorICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICAvKiByaCA6PSByaCArIGIqWl42ICovCisgICAgaWYgKCFmaWVsZF9tdWwoZ3JvdXAsIHRtcCwgJmdyb3VwLT5iLCBaNiwgY3R4KSkKKyAgICAgIGdvdG8gZXJyOworICAgIGlmICghQk5fbW9kX2FkZF9xdWljayhyaCwgcmgsIHRtcCwgcCkpCisgICAgICBnb3RvIGVycjsKKyAgfSBlbHNlIHsKKyAgICAvKiBwb2ludC0+Wl9pc19vbmUgKi8KKworICAgIC8qIHJoIDo9IChyaCArIGEpKlggKi8KKyAgICBpZiAoIUJOX21vZF9hZGRfcXVpY2socmgsIHJoLCAmZ3JvdXAtPmEsIHApKQorICAgICAgZ290byBlcnI7CisgICAgaWYgKCFmaWVsZF9tdWwoZ3JvdXAsIHJoLCByaCwgJnBvaW50LT5YLCBjdHgpKQorICAgICAgZ290byBlcnI7CisgICAgLyogcmggOj0gcmggKyBiICovCisgICAgaWYgKCFCTl9tb2RfYWRkX3F1aWNrKHJoLCByaCwgJmdyb3VwLT5iLCBwKSkKKyAgICAgIGdvdG8gZXJyOworICB9CisKKyAgLyogJ2xoJyA6PSBZXjIgKi8KKyAgaWYgKCFmaWVsZF9zcXIoZ3JvdXAsIHRtcCwgJnBvaW50LT5ZLCBjdHgpKQorICAgIGdvdG8gZXJyOworCisgIHJldCA9ICgwID09IEJOX3VjbXAodG1wLCByaCkpOworCitlcnI6CisgIEJOX0NUWF9lbmQoY3R4KTsKKyAgaWYgKG5ld19jdHggIT0gTlVMTCkKKyAgICBCTl9DVFhfZnJlZShuZXdfY3R4KTsKKyAgcmV0dXJuIHJldDsKK30KKworaW50IGVjX0dGcF9zaW1wbGVfY21wKGNvbnN0IEVDX0dST1VQICpncm91cCwgY29uc3QgRUNfUE9JTlQgKmEsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRUNfUE9JTlQgKmIsIEJOX0NUWCAqY3R4KSB7CisgIC8qIHJldHVybiB2YWx1ZXM6CisgICAqICAtMSAgIGVycm9yCisgICAqICAgMCAgIGVxdWFsIChpbiBhZmZpbmUgY29vcmRpbmF0ZXMpCisgICAqICAgMSAgIG5vdCBlcXVhbAorICAgKi8KKworICBpbnQgKCpmaWVsZF9tdWwpKGNvbnN0IEVDX0dST1VQICosIEJJR05VTSAqLCBjb25zdCBCSUdOVU0gKiwgY29uc3QgQklHTlVNICosCisgICAgICAgICAgICAgICAgICAgQk5fQ1RYICopOworICBpbnQgKCpmaWVsZF9zcXIpKGNvbnN0IEVDX0dST1VQICosIEJJR05VTSAqLCBjb25zdCBCSUdOVU0gKiwgQk5fQ1RYICopOworICBCTl9DVFggKm5ld19jdHggPSBOVUxMOworICBCSUdOVU0gKnRtcDEsICp0bXAyLCAqWmEyMywgKlpiMjM7CisgIGNvbnN0IEJJR05VTSAqdG1wMV8sICp0bXAyXzsKKyAgaW50IHJldCA9IC0xOworCisgIGlmIChFQ19QT0lOVF9pc19hdF9pbmZpbml0eShncm91cCwgYSkpIHsKKyAgICByZXR1cm4gRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZ3JvdXAsIGIpID8gMCA6IDE7CisgIH0KKworICBpZiAoRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZ3JvdXAsIGIpKQorICAgIHJldHVybiAxOworCisgIGlmIChhLT5aX2lzX29uZSAmJiBiLT5aX2lzX29uZSkgeworICAgIHJldHVybiAoKEJOX2NtcCgmYS0+WCwgJmItPlgpID09IDApICYmIEJOX2NtcCgmYS0+WSwgJmItPlkpID09IDApID8gMCA6IDE7CisgIH0KKworICBmaWVsZF9tdWwgPSBncm91cC0+bWV0aC0+ZmllbGRfbXVsOworICBmaWVsZF9zcXIgPSBncm91cC0+bWV0aC0+ZmllbGRfc3FyOworCisgIGlmIChjdHggPT0gTlVMTCkgeworICAgIGN0eCA9IG5ld19jdHggPSBCTl9DVFhfbmV3KCk7CisgICAgaWYgKGN0eCA9PSBOVUxMKQorICAgICAgcmV0dXJuIC0xOworICB9CisKKyAgQk5fQ1RYX3N0YXJ0KGN0eCk7CisgIHRtcDEgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIHRtcDIgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIFphMjMgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIFpiMjMgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIGlmIChaYjIzID09IE5VTEwpCisgICAgZ290byBlbmQ7CisKKyAgLyogV2UgaGF2ZSB0byBkZWNpZGUgd2hldGhlcgorICAgKiAgICAgKFhfYS9aX2FeMiwgWV9hL1pfYV4zKSA9IChYX2IvWl9iXjIsIFlfYi9aX2JeMyksCisgICAqIG9yIGVxdWl2YWxlbnRseSwgd2hldGhlcgorICAgKiAgICAgKFhfYSpaX2JeMiwgWV9hKlpfYl4zKSA9IChYX2IqWl9hXjIsIFlfYipaX2FeMykuCisgICAqLworCisgIGlmICghYi0+Wl9pc19vbmUpIHsKKyAgICBpZiAoIWZpZWxkX3Nxcihncm91cCwgWmIyMywgJmItPlosIGN0eCkpCisgICAgICBnb3RvIGVuZDsKKyAgICBpZiAoIWZpZWxkX211bChncm91cCwgdG1wMSwgJmEtPlgsIFpiMjMsIGN0eCkpCisgICAgICBnb3RvIGVuZDsKKyAgICB0bXAxXyA9IHRtcDE7CisgIH0gZWxzZQorICAgIHRtcDFfID0gJmEtPlg7CisgIGlmICghYS0+Wl9pc19vbmUpIHsKKyAgICBpZiAoIWZpZWxkX3Nxcihncm91cCwgWmEyMywgJmEtPlosIGN0eCkpCisgICAgICBnb3RvIGVuZDsKKyAgICBpZiAoIWZpZWxkX211bChncm91cCwgdG1wMiwgJmItPlgsIFphMjMsIGN0eCkpCisgICAgICBnb3RvIGVuZDsKKyAgICB0bXAyXyA9IHRtcDI7CisgIH0gZWxzZQorICAgIHRtcDJfID0gJmItPlg7CisKKyAgLyogY29tcGFyZSAgWF9hKlpfYl4yICB3aXRoICBYX2IqWl9hXjIgKi8KKyAgaWYgKEJOX2NtcCh0bXAxXywgdG1wMl8pICE9IDApIHsKKyAgICByZXQgPSAxOyAvKiBwb2ludHMgZGlmZmVyICovCisgICAgZ290byBlbmQ7CisgIH0KKworCisgIGlmICghYi0+Wl9pc19vbmUpIHsKKyAgICBpZiAoIWZpZWxkX211bChncm91cCwgWmIyMywgWmIyMywgJmItPlosIGN0eCkpCisgICAgICBnb3RvIGVuZDsKKyAgICBpZiAoIWZpZWxkX211bChncm91cCwgdG1wMSwgJmEtPlksIFpiMjMsIGN0eCkpCisgICAgICBnb3RvIGVuZDsKKyAgICAvKiB0bXAxXyA9IHRtcDEgKi8KKyAgfSBlbHNlCisgICAgdG1wMV8gPSAmYS0+WTsKKyAgaWYgKCFhLT5aX2lzX29uZSkgeworICAgIGlmICghZmllbGRfbXVsKGdyb3VwLCBaYTIzLCBaYTIzLCAmYS0+WiwgY3R4KSkKKyAgICAgIGdvdG8gZW5kOworICAgIGlmICghZmllbGRfbXVsKGdyb3VwLCB0bXAyLCAmYi0+WSwgWmEyMywgY3R4KSkKKyAgICAgIGdvdG8gZW5kOworICAgIC8qIHRtcDJfID0gdG1wMiAqLworICB9IGVsc2UKKyAgICB0bXAyXyA9ICZiLT5ZOworCisgIC8qIGNvbXBhcmUgIFlfYSpaX2JeMyAgd2l0aCAgWV9iKlpfYV4zICovCisgIGlmIChCTl9jbXAodG1wMV8sIHRtcDJfKSAhPSAwKSB7CisgICAgcmV0ID0gMTsgLyogcG9pbnRzIGRpZmZlciAqLworICAgIGdvdG8gZW5kOworICB9CisKKyAgLyogcG9pbnRzIGFyZSBlcXVhbCAqLworICByZXQgPSAwOworCitlbmQ6CisgIEJOX0NUWF9lbmQoY3R4KTsKKyAgaWYgKG5ld19jdHggIT0gTlVMTCkKKyAgICBCTl9DVFhfZnJlZShuZXdfY3R4KTsKKyAgcmV0dXJuIHJldDsKK30KKworaW50IGVjX0dGcF9zaW1wbGVfbWFrZV9hZmZpbmUoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTl9DVFggKmN0eCkgeworICBCTl9DVFggKm5ld19jdHggPSBOVUxMOworICBCSUdOVU0gKngsICp5OworICBpbnQgcmV0ID0gMDsKKworICBpZiAocG9pbnQtPlpfaXNfb25lIHx8IEVDX1BPSU5UX2lzX2F0X2luZmluaXR5KGdyb3VwLCBwb2ludCkpCisgICAgcmV0dXJuIDE7CisKKyAgaWYgKGN0eCA9PSBOVUxMKSB7CisgICAgY3R4ID0gbmV3X2N0eCA9IEJOX0NUWF9uZXcoKTsKKyAgICBpZiAoY3R4ID09IE5VTEwpCisgICAgICByZXR1cm4gMDsKKyAgfQorCisgIEJOX0NUWF9zdGFydChjdHgpOworICB4ID0gQk5fQ1RYX2dldChjdHgpOworICB5ID0gQk5fQ1RYX2dldChjdHgpOworICBpZiAoeSA9PSBOVUxMKQorICAgIGdvdG8gZXJyOworCisgIGlmICghRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAoZ3JvdXAsIHBvaW50LCB4LCB5LCBjdHgpKQorICAgIGdvdG8gZXJyOworICBpZiAoIUVDX1BPSU5UX3NldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwKGdyb3VwLCBwb2ludCwgeCwgeSwgY3R4KSkKKyAgICBnb3RvIGVycjsKKyAgaWYgKCFwb2ludC0+Wl9pc19vbmUpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfR0ZwX3NpbXBsZV9tYWtlX2FmZmluZSwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgcmV0ID0gMTsKKworZXJyOgorICBCTl9DVFhfZW5kKGN0eCk7CisgIGlmIChuZXdfY3R4ICE9IE5VTEwpCisgICAgQk5fQ1RYX2ZyZWUobmV3X2N0eCk7CisgIHJldHVybiByZXQ7Cit9CisKK2ludCBlY19HRnBfc2ltcGxlX3BvaW50c19tYWtlX2FmZmluZShjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIHNpemVfdCBudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUNfUE9JTlQgKnBvaW50c1tdLCBCTl9DVFggKmN0eCkgeworICBCTl9DVFggKm5ld19jdHggPSBOVUxMOworICBCSUdOVU0gKnRtcDAsICp0bXAxOworICBzaXplX3QgcG93MiA9IDA7CisgIEJJR05VTSAqKmhlYXAgPSBOVUxMOworICBzaXplX3QgaTsKKyAgaW50IHJldCA9IDA7CisKKyAgaWYgKG51bSA9PSAwKQorICAgIHJldHVybiAxOworCisgIGlmIChjdHggPT0gTlVMTCkgeworICAgIGN0eCA9IG5ld19jdHggPSBCTl9DVFhfbmV3KCk7CisgICAgaWYgKGN0eCA9PSBOVUxMKQorICAgICAgcmV0dXJuIDA7CisgIH0KKworICBCTl9DVFhfc3RhcnQoY3R4KTsKKyAgdG1wMCA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgdG1wMSA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgaWYgKHRtcDAgPT0gTlVMTCB8fCB0bXAxID09IE5VTEwpCisgICAgZ290byBlcnI7CisKKyAgLyogQmVmb3JlIGNvbnZlcnRpbmcgdGhlIGluZGl2aWR1YWwgcG9pbnRzLCBjb21wdXRlIGludmVyc2VzIG9mIGFsbCBaIHZhbHVlcy4KKyAgICogTW9kdWxhciBpbnZlcnNpb24gaXMgcmF0aGVyIHNsb3csIGJ1dCBsdWNraWx5IHdlIGNhbiBkbyB3aXRoIGEgc2luZ2xlCisgICAqIGV4cGxpY2l0IGludmVyc2lvbiwgcGx1cyBhYm91dCAzIG11bHRpcGxpY2F0aW9ucyBwZXIgaW5wdXQgdmFsdWUuCisgICAqLworCisgIHBvdzIgPSAxOworICB3aGlsZSAobnVtID4gcG93MikKKyAgICBwb3cyIDw8PSAxOworICAvKiBOb3cgcG93MiBpcyB0aGUgc21hbGxlc3QgcG93ZXIgb2YgMiBzYXRpZnN5aW5nIHBvdzIgPj0gbnVtLgorICAgKiBXZSBuZWVkIHR3aWNlIHRoYXQuICovCisgIHBvdzIgPDw9IDE7CisKKyAgaGVhcCA9IE9QRU5TU0xfbWFsbG9jKHBvdzIgKiBzaXplb2YgaGVhcFswXSk7CisgIGlmIChoZWFwID09IE5VTEwpCisgICAgZ290byBlcnI7CisKKyAgLyogVGhlIGFycmF5IGlzIHVzZWQgYXMgYSBiaW5hcnkgdHJlZSwgZXhhY3RseSBhcyBpbiBoZWFwc29ydDoKKyAgICoKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcFsxXQorICAgKiAgICAgICAgICAgICAgICAgaGVhcFsyXSAgICAgICAgICAgICAgICAgICAgIGhlYXBbM10KKyAgICogICAgICAgICAgaGVhcFs0XSAgICAgICBoZWFwWzVdICAgICAgIGhlYXBbNl0gICAgICAgaGVhcFs3XQorICAgKiAgIGhlYXBbOF1oZWFwWzldIGhlYXBbMTBdaGVhcFsxMV0gaGVhcFsxMl1oZWFwWzEzXSBoZWFwWzE0XSBoZWFwWzE1XQorICAgKgorICAgKiBXZSBwdXQgdGhlIFoncyBpbiB0aGUgbGFzdCBsaW5lOworICAgKiB0aGVuIHdlIHNldCBlYWNoIG90aGVyIG5vZGUgdG8gdGhlIHByb2R1Y3Qgb2YgaXRzIHR3byBjaGlsZC1ub2RlcyAod2hlcmUKKyAgICogZW1wdHkgb3IgMCBlbnRyaWVzIGFyZSB0cmVhdGVkIGFzIG9uZXMpOworICAgKiB0aGVuIHdlIGludmVydCBoZWFwWzFdOworICAgKiB0aGVuIHdlIGludmVydCBlYWNoIG90aGVyIG5vZGUgYnkgcmVwbGFjaW5nIGl0IGJ5IHRoZSBwcm9kdWN0IG9mIGl0cworICAgKiBwYXJlbnQgKGFmdGVyIGludmVyc2lvbikgYW5kIGl0cyBzaWJsaW5nIChiZWZvcmUgaW52ZXJzaW9uKS4KKyAgICovCisgIGhlYXBbMF0gPSBOVUxMOworICBmb3IgKGkgPSBwb3cyIC8gMiAtIDE7IGkgPiAwOyBpLS0pCisgICAgaGVhcFtpXSA9IE5VTEw7CisgIGZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKKyAgICBoZWFwW3BvdzIgLyAyICsgaV0gPSAmcG9pbnRzW2ldLT5aOworICBmb3IgKGkgPSBwb3cyIC8gMiArIG51bTsgaSA8IHBvdzI7IGkrKykKKyAgICBoZWFwW2ldID0gTlVMTDsKKworICAvKiBzZXQgZWFjaCBub2RlIHRvIHRoZSBwcm9kdWN0IG9mIGl0cyBjaGlsZHJlbiAqLworICBmb3IgKGkgPSBwb3cyIC8gMiAtIDE7IGkgPiAwOyBpLS0pIHsKKyAgICBoZWFwW2ldID0gQk5fbmV3KCk7CisgICAgaWYgKGhlYXBbaV0gPT0gTlVMTCkKKyAgICAgIGdvdG8gZXJyOworCisgICAgaWYgKGhlYXBbMiAqIGldICE9IE5VTEwpIHsKKyAgICAgIGlmICgoaGVhcFsyICogaSArIDFdID09IE5VTEwpIHx8IEJOX2lzX3plcm8oaGVhcFsyICogaSArIDFdKSkgeworICAgICAgICBpZiAoIUJOX2NvcHkoaGVhcFtpXSwgaGVhcFsyICogaV0pKQorICAgICAgICAgIGdvdG8gZXJyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKEJOX2lzX3plcm8oaGVhcFsyICogaV0pKSB7CisgICAgICAgICAgaWYgKCFCTl9jb3B5KGhlYXBbaV0sIGhlYXBbMiAqIGkgKyAxXSkpCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9tdWwoZ3JvdXAsIGhlYXBbaV0sIGhlYXBbMiAqIGldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFwWzIgKiBpICsgMV0sIGN0eCkpCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIGludmVydCBoZWFwWzFdICovCisgIGlmICghQk5faXNfemVybyhoZWFwWzFdKSkgeworICAgIGlmICghQk5fbW9kX2ludmVyc2UoaGVhcFsxXSwgaGVhcFsxXSwgJmdyb3VwLT5maWVsZCwgY3R4KSkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9zaW1wbGVfcG9pbnRzX21ha2VfYWZmaW5lLCBFUlJfUl9CTl9MSUIpOworICAgICAgZ290byBlcnI7CisgICAgfQorICB9CisgIGlmIChncm91cC0+bWV0aC0+ZmllbGRfZW5jb2RlICE9IDApIHsKKyAgICAvKiBpbiB0aGUgTW9udGdvbWVyeSBjYXNlLCB3ZSBqdXN0IHR1cm5lZCAgUipIICAocmVwcmVzZW50aW5nIEgpCisgICAgICogaW50byAgMS8oUipIKSwgIGJ1dCB3ZSBuZWVkICBSKigxL0gpICAocmVwcmVzZW50aW5nIDEvSCk7CisgICAgICogaS5lLiB3ZSBoYXZlIG5lZWQgdG8gbXVsdGlwbHkgYnkgdGhlIE1vbnRnb21lcnkgZmFjdG9yIHR3aWNlICovCisgICAgaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfZW5jb2RlKGdyb3VwLCBoZWFwWzFdLCBoZWFwWzFdLCBjdHgpKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfZW5jb2RlKGdyb3VwLCBoZWFwWzFdLCBoZWFwWzFdLCBjdHgpKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0KKworICAvKiBzZXQgb3RoZXIgaGVhcFtpXSdzIHRvIHRoZWlyIGludmVyc2VzICovCisgIGZvciAoaSA9IDI7IGkgPCBwb3cyIC8gMiArIG51bTsgaSArPSAyKSB7CisgICAgLyogaSBpcyBldmVuICovCisgICAgaWYgKChoZWFwW2kgKyAxXSAhPSBOVUxMKSAmJiAhQk5faXNfemVybyhoZWFwW2kgKyAxXSkpIHsKKyAgICAgIGlmICghZ3JvdXAtPm1ldGgtPmZpZWxkX211bChncm91cCwgdG1wMCwgaGVhcFtpIC8gMl0sIGhlYXBbaSArIDFdLCBjdHgpKQorICAgICAgICBnb3RvIGVycjsKKyAgICAgIGlmICghZ3JvdXAtPm1ldGgtPmZpZWxkX211bChncm91cCwgdG1wMSwgaGVhcFtpIC8gMl0sIGhlYXBbaV0sIGN0eCkpCisgICAgICAgIGdvdG8gZXJyOworICAgICAgaWYgKCFCTl9jb3B5KGhlYXBbaV0sIHRtcDApKQorICAgICAgICBnb3RvIGVycjsKKyAgICAgIGlmICghQk5fY29weShoZWFwW2kgKyAxXSwgdG1wMSkpCisgICAgICAgIGdvdG8gZXJyOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoIUJOX2NvcHkoaGVhcFtpXSwgaGVhcFtpIC8gMl0pKQorICAgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0KKworICAvKiB3ZSBoYXZlIHJlcGxhY2VkIGFsbCBub24temVybyBaJ3MgYnkgdGhlaXIgaW52ZXJzZXMsIG5vdyBmaXggdXAgYWxsIHRoZQorICAgKiBwb2ludHMgKi8KKyAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisgICAgRUNfUE9JTlQgKnAgPSBwb2ludHNbaV07CisKKyAgICBpZiAoIUJOX2lzX3plcm8oJnAtPlopKSB7CisgICAgICAvKiB0dXJuICAoWCwgWSwgMS9aKSAgaW50byAgKFgvWl4yLCBZL1peMywgMSkgKi8KKworICAgICAgaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfc3FyKGdyb3VwLCB0bXAxLCAmcC0+WiwgY3R4KSkKKyAgICAgICAgZ290byBlcnI7CisgICAgICBpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9tdWwoZ3JvdXAsICZwLT5YLCAmcC0+WCwgdG1wMSwgY3R4KSkKKyAgICAgICAgZ290byBlcnI7CisKKyAgICAgIGlmICghZ3JvdXAtPm1ldGgtPmZpZWxkX211bChncm91cCwgdG1wMSwgdG1wMSwgJnAtPlosIGN0eCkpCisgICAgICAgIGdvdG8gZXJyOworICAgICAgaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfbXVsKGdyb3VwLCAmcC0+WSwgJnAtPlksIHRtcDEsIGN0eCkpCisgICAgICAgIGdvdG8gZXJyOworCisgICAgICBpZiAoZ3JvdXAtPm1ldGgtPmZpZWxkX3NldF90b19vbmUgIT0gMCkgeworICAgICAgICBpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9zZXRfdG9fb25lKGdyb3VwLCAmcC0+WiwgY3R4KSkKKyAgICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghQk5fb25lKCZwLT5aKSkKKyAgICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICAgIHAtPlpfaXNfb25lID0gMTsKKyAgICB9CisgIH0KKworICByZXQgPSAxOworCitlcnI6CisgIEJOX0NUWF9lbmQoY3R4KTsKKyAgaWYgKG5ld19jdHggIT0gTlVMTCkKKyAgICBCTl9DVFhfZnJlZShuZXdfY3R4KTsKKyAgaWYgKGhlYXAgIT0gTlVMTCkgeworICAgIC8qIGhlYXBbcG93Mi8yXSAuLiBoZWFwW3BvdzItMV0gaGF2ZSBub3QgYmVlbiBhbGxvY2F0ZWQgbG9jYWxseSEgKi8KKyAgICBmb3IgKGkgPSBwb3cyIC8gMiAtIDE7IGkgPiAwOyBpLS0pIHsKKyAgICAgIGlmIChoZWFwW2ldICE9IE5VTEwpCisgICAgICAgIEJOX2NsZWFyX2ZyZWUoaGVhcFtpXSk7CisgICAgfQorICAgIE9QRU5TU0xfZnJlZShoZWFwKTsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitpbnQgZWNfR0ZwX3NpbXBsZV9maWVsZF9tdWwoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCSUdOVU0gKmIsIEJOX0NUWCAqY3R4KSB7CisgIHJldHVybiBCTl9tb2RfbXVsKHIsIGEsIGIsICZncm91cC0+ZmllbGQsIGN0eCk7Cit9CisKK2ludCBlY19HRnBfc2ltcGxlX2ZpZWxkX3Nxcihjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJOX0NUWCAqY3R4KSB7CisgIHJldHVybiBCTl9tb2Rfc3FyKHIsIGEsICZncm91cC0+ZmllbGQsIGN0eCk7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vZWMvd25hZi5jIGIvY3J5cHRvL2VjL3duYWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODYxMDdkCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2VjL3duYWYuYwpAQCAtMCwwICsxLDg0MSBAQAorLyogT3JpZ2luYWxseSB3cml0dGVuIGJ5IEJvZG8gTW9lbGxlciBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBTEwgUklHSFRTIFJFU0VSVkVELgorICoKKyAqIFBvcnRpb25zIG9mIHRoZSBhdHRhY2hlZCBzb2Z0d2FyZSAoIkNvbnRyaWJ1dGlvbiIpIGFyZSBkZXZlbG9wZWQgYnkKKyAqIFNVTiBNSUNST1NZU1RFTVMsIElOQy4sIGFuZCBhcmUgY29udHJpYnV0ZWQgdG8gdGhlIE9wZW5TU0wgcHJvamVjdC4KKyAqCisgKiBUaGUgQ29udHJpYnV0aW9uIGlzIGxpY2Vuc2VkIHB1cnN1YW50IHRvIHRoZSBPcGVuU1NMIG9wZW4gc291cmNlCisgKiBsaWNlbnNlIHByb3ZpZGVkIGFib3ZlLgorICoKKyAqIFRoZSBlbGxpcHRpYyBjdXJ2ZSBiaW5hcnkgcG9seW5vbWlhbCBzb2Z0d2FyZSBpcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkKKyAqIFNoZXVlbGluZyBDaGFuZyBTaGFudHogYW5kIERvdWdsYXMgU3RlYmlsYSBvZiBTdW4gTWljcm9zeXN0ZW1zCisgKiBMYWJvcmF0b3JpZXMuICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2VjLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworCisvKiBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgd05BRi1iYXNlZCBpbnRlcmxlYXZpbmcgbXVsdGktZXhwb25lbnRhdGlvbiBtZXRob2QKKyAqICg8VVJMOmh0dHA6Ly93d3cuaW5mb3JtYXRpay50dS1kYXJtc3RhZHQuZGUvVEkvTWl0YXJiZWl0ZXIvbW9lbGxlci5odG1sI211bHRpZXhwPik7CisgKiBmb3IgbXVsdGlwbGljYXRpb24gd2l0aCBwcmVjb21wdXRhdGlvbiwgd2UgdXNlIHdOQUYgc3BsaXR0aW5nCisgKiAoPFVSTDpodHRwOi8vd3d3LmluZm9ybWF0aWsudHUtZGFybXN0YWR0LmRlL1RJL01pdGFyYmVpdGVyL21vZWxsZXIuaHRtbCNmYXN0ZXhwPikuCisgKiAqLworCisvKiBzdHJ1Y3R1cmUgZm9yIHByZWNvbXB1dGVkIG11bHRpcGxlcyBvZiB0aGUgZ2VuZXJhdG9yICovCit0eXBlZGVmIHN0cnVjdCBlY19wcmVfY29tcF9zdCB7CisgIGNvbnN0IEVDX0dST1VQICpncm91cDsgLyogcGFyZW50IEVDX0dST1VQIG9iamVjdCAqLworICBzaXplX3QgYmxvY2tzaXplOyAgICAgIC8qIGJsb2NrIHNpemUgZm9yIHdOQUYgc3BsaXR0aW5nICovCisgIHNpemVfdCBudW1ibG9ja3M7IC8qIG1heC4gbnVtYmVyIG9mIGJsb2NrcyBmb3Igd2hpY2ggd2UgaGF2ZSBwcmVjb21wdXRhdGlvbiAqLworICBzaXplX3QgdzsgICAgICAgICAvKiB3aW5kb3cgc2l6ZSAqLworICBFQ19QT0lOVCAqKnBvaW50czsgLyogYXJyYXkgd2l0aCBwcmUtY2FsY3VsYXRlZCBtdWx0aXBsZXMgb2YgZ2VuZXJhdG9yOgorICAgICAgICAgICAgICAgICAgICAgICogJ251bScgcG9pbnRlcnMgdG8gRUNfUE9JTlQgb2JqZWN0cyBmb2xsb3dlZCBieSBhIE5VTEwgKi8KKyAgc2l6ZV90IG51bTsgLyogbnVtYmxvY2tzICogMl4ody0xKSAqLworICBpbnQgcmVmZXJlbmNlczsKK30gRUNfUFJFX0NPTVA7CisKK3N0YXRpYyBFQ19QUkVfQ09NUCAqZWNfcHJlX2NvbXBfbmV3KGNvbnN0IEVDX0dST1VQICpncm91cCkgeworICBFQ19QUkVfQ09NUCAqcmV0ID0gTlVMTDsKKworICBpZiAoIWdyb3VwKQorICAgIHJldHVybiBOVUxMOworCisgIHJldCA9IChFQ19QUkVfQ09NUCAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihFQ19QUkVfQ09NUCkpOworICBpZiAoIXJldCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19wcmVfY29tcF9uZXcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICByZXR1cm4gcmV0OworICB9CisgIHJldC0+Z3JvdXAgPSBncm91cDsKKyAgcmV0LT5ibG9ja3NpemUgPSA4OyAvKiBkZWZhdWx0ICovCisgIHJldC0+bnVtYmxvY2tzID0gMDsKKyAgcmV0LT53ID0gNDsgLyogZGVmYXVsdCAqLworICByZXQtPnBvaW50cyA9IE5VTEw7CisgIHJldC0+bnVtID0gMDsKKyAgcmV0LT5yZWZlcmVuY2VzID0gMTsKKyAgcmV0dXJuIHJldDsKK30KKwordm9pZCAqZWNfcHJlX2NvbXBfZHVwKEVDX1BSRV9DT01QICpwcmVfY29tcCkgeworICBpZiAocHJlX2NvbXAgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgQ1JZUFRPX2FkZCgmcHJlX2NvbXAtPnJlZmVyZW5jZXMsIDEsIENSWVBUT19MT0NLX0VDX1BSRV9DT01QKTsKKyAgcmV0dXJuIHByZV9jb21wOworfQorCit2b2lkIGVjX3ByZV9jb21wX2ZyZWUoRUNfUFJFX0NPTVAgKnByZV9jb21wKSB7CisgIGludCBpOworCisgIGlmICghcHJlX2NvbXApIHsKKyAgICByZXR1cm47CisgIH0KKworICBpID0gQ1JZUFRPX2FkZCgmcHJlX2NvbXAtPnJlZmVyZW5jZXMsIC0xLCBDUllQVE9fTE9DS19FQ19QUkVfQ09NUCk7CisgIGlmIChpID4gMCkgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChwcmVfY29tcC0+cG9pbnRzKSB7CisgICAgRUNfUE9JTlQgKipwOworCisgICAgZm9yIChwID0gcHJlX2NvbXAtPnBvaW50czsgKnAgIT0gTlVMTDsgcCsrKSB7CisgICAgICBFQ19QT0lOVF9mcmVlKCpwKTsKKyAgICB9CisgICAgT1BFTlNTTF9mcmVlKHByZV9jb21wLT5wb2ludHMpOworICB9CisgIE9QRU5TU0xfZnJlZShwcmVfY29tcCk7Cit9CisKKworLyogRGV0ZXJtaW5lIHRoZSBtb2RpZmllZCB3aWR0aC0odysxKSBOb24tQWRqYWNlbnQgRm9ybSAod05BRikgb2YgJ3NjYWxhcicuCisgKiBUaGlzIGlzIGFuIGFycmF5ICByW10gIG9mIHZhbHVlcyB0aGF0IGFyZSBlaXRoZXIgemVybyBvciBvZGQgd2l0aCBhbgorICogYWJzb2x1dGUgdmFsdWUgbGVzcyB0aGFuICAyXncgIHNhdGlzZnlpbmcKKyAqICAgICBzY2FsYXIgPSBcc3VtX2ogcltqXSoyXmoKKyAqIHdoZXJlIGF0IG1vc3Qgb25lIG9mIGFueSAgdysxICBjb25zZWN1dGl2ZSBkaWdpdHMgaXMgbm9uLXplcm8KKyAqIHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0IHRoZSBtb3N0IHNpZ25pZmljYW50IGRpZ2l0IG1heSBiZSBvbmx5CisgKiB3LTEgemVyb3MgYXdheSBmcm9tIHRoYXQgbmV4dCBub24temVybyBkaWdpdC4KKyAqLworc3RhdGljIHNpZ25lZCBjaGFyICpjb21wdXRlX3dOQUYoY29uc3QgQklHTlVNICpzY2FsYXIsIGludCB3LCBzaXplX3QgKnJldF9sZW4pIHsKKyAgaW50IHdpbmRvd192YWw7CisgIGludCBvayA9IDA7CisgIHNpZ25lZCBjaGFyICpyID0gTlVMTDsKKyAgaW50IHNpZ24gPSAxOworICBpbnQgYml0LCBuZXh0X2JpdCwgbWFzazsKKyAgc2l6ZV90IGxlbiA9IDAsIGo7CisKKyAgaWYgKEJOX2lzX3plcm8oc2NhbGFyKSkgeworICAgIHIgPSBPUEVOU1NMX21hbGxvYygxKTsKKyAgICBpZiAoIXIpIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBjb21wdXRlX3dOQUYsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICByWzBdID0gMDsKKyAgICAqcmV0X2xlbiA9IDE7CisgICAgcmV0dXJuIHI7CisgIH0KKworICBpZiAodyA8PSAwIHx8IHcgPiA3KSAvKiAnc2lnbmVkIGNoYXInIGNhbiByZXByZXNlbnQgaW50ZWdlcnMgd2l0aCBhYnNvbHV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgbGVzcyB0aGFuIDJeNyAqLworICB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGNvbXB1dGVfd05BRiwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgIGdvdG8gZXJyOworICB9CisgIGJpdCA9IDEgPDwgdzsgICAgICAgIC8qIGF0IG1vc3QgMTI4ICovCisgIG5leHRfYml0ID0gYml0IDw8IDE7IC8qIGF0IG1vc3QgMjU2ICovCisgIG1hc2sgPSBuZXh0X2JpdCAtIDE7IC8qIGF0IG1vc3QgMjU1ICovCisKKyAgaWYgKEJOX2lzX25lZ2F0aXZlKHNjYWxhcikpIHsKKyAgICBzaWduID0gLTE7CisgIH0KKworICBpZiAoc2NhbGFyLT5kID09IE5VTEwgfHwgc2NhbGFyLT50b3AgPT0gMCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBjb21wdXRlX3dOQUYsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGxlbiA9IEJOX251bV9iaXRzKHNjYWxhcik7CisgIHIgPSBPUEVOU1NMX21hbGxvYygKKyAgICAgIGxlbiArCisgICAgICAxKTsgLyogbW9kaWZpZWQgd05BRiBtYXkgYmUgb25lIGRpZ2l0IGxvbmdlciB0aGFuIGJpbmFyeSByZXByZXNlbnRhdGlvbgorICAgICAgICAgICAqICgqcmV0X2xlbiB3aWxsIGJlIHNldCB0byB0aGUgYWN0dWFsIGxlbmd0aCwgaS5lLiBhdCBtb3N0CisgICAgICAgICAgICogQk5fbnVtX2JpdHMoc2NhbGFyKSArIDEpICovCisgIGlmIChyID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgY29tcHV0ZV93TkFGLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgZ290byBlcnI7CisgIH0KKyAgd2luZG93X3ZhbCA9IHNjYWxhci0+ZFswXSAmIG1hc2s7CisgIGogPSAwOworICB3aGlsZSAoKHdpbmRvd192YWwgIT0gMCkgfHwKKyAgICAgICAgIChqICsgdyArIDEgPCBsZW4pKSAvKiBpZiBqK3crMSA+PSBsZW4sIHdpbmRvd192YWwgd2lsbCBub3QgaW5jcmVhc2UgKi8KKyAgeworICAgIGludCBkaWdpdCA9IDA7CisKKyAgICAvKiAwIDw9IHdpbmRvd192YWwgPD0gMl4odysxKSAqLworCisgICAgaWYgKHdpbmRvd192YWwgJiAxKSB7CisgICAgICAvKiAwIDwgd2luZG93X3ZhbCA8IDJeKHcrMSkgKi8KKworICAgICAgaWYgKHdpbmRvd192YWwgJiBiaXQpIHsKKyAgICAgICAgZGlnaXQgPSB3aW5kb3dfdmFsIC0gbmV4dF9iaXQ7IC8qIC0yXncgPCBkaWdpdCA8IDAgKi8KKworI2lmIDEgLyogbW9kaWZpZWQgd05BRiAqLworICAgICAgICBpZiAoaiArIHcgKyAxID49IGxlbikgeworICAgICAgICAgIC8qIHNwZWNpYWwgY2FzZSBmb3IgZ2VuZXJhdGluZyBtb2RpZmllZCB3TkFGczoKKyAgICAgICAgICAgKiBubyBuZXcgYml0cyB3aWxsIGJlIGFkZGVkIGludG8gd2luZG93X3ZhbCwKKyAgICAgICAgICAgKiBzbyB1c2luZyBhIHBvc2l0aXZlIGRpZ2l0IGhlcmUgd2lsbCBkZWNyZWFzZQorICAgICAgICAgICAqIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIHJlcHJlc2VudGF0aW9uICovCisKKyAgICAgICAgICBkaWdpdCA9IHdpbmRvd192YWwgJiAobWFzayA+PiAxKTsgLyogMCA8IGRpZ2l0IDwgMl53ICovCisgICAgICAgIH0KKyNlbmRpZgorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGlnaXQgPSB3aW5kb3dfdmFsOyAvKiAwIDwgZGlnaXQgPCAyXncgKi8KKyAgICAgIH0KKworICAgICAgaWYgKGRpZ2l0IDw9IC1iaXQgfHwgZGlnaXQgPj0gYml0IHx8ICEoZGlnaXQgJiAxKSkgeworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgY29tcHV0ZV93TkFGLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICAgIGdvdG8gZXJyOworICAgICAgfQorCisgICAgICB3aW5kb3dfdmFsIC09IGRpZ2l0OworCisgICAgICAvKiBub3cgd2luZG93X3ZhbCBpcyAwIG9yIDJeKHcrMSkgaW4gc3RhbmRhcmQgd05BRiBnZW5lcmF0aW9uOworICAgICAgICogZm9yIG1vZGlmaWVkIHdpbmRvdyBOQUZzLCBpdCBtYXkgYWxzbyBiZSAyXncKKyAgICAgICAqLworICAgICAgaWYgKHdpbmRvd192YWwgIT0gMCAmJiB3aW5kb3dfdmFsICE9IG5leHRfYml0ICYmIHdpbmRvd192YWwgIT0gYml0KSB7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBjb21wdXRlX3dOQUYsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgfQorCisgICAgcltqKytdID0gc2lnbiAqIGRpZ2l0OworCisgICAgd2luZG93X3ZhbCA+Pj0gMTsKKyAgICB3aW5kb3dfdmFsICs9IGJpdCAqIEJOX2lzX2JpdF9zZXQoc2NhbGFyLCBqICsgdyk7CisKKyAgICBpZiAod2luZG93X3ZhbCA+IG5leHRfYml0KSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgY29tcHV0ZV93TkFGLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0KKworICBpZiAoaiA+IGxlbiArIDEpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgY29tcHV0ZV93TkFGLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgZ290byBlcnI7CisgIH0KKyAgbGVuID0gajsKKyAgb2sgPSAxOworCitlcnI6CisgIGlmICghb2spIHsKKyAgICBPUEVOU1NMX2ZyZWUocik7CisgICAgciA9IE5VTEw7CisgIH0KKyAgaWYgKG9rKQorICAgICpyZXRfbGVuID0gbGVuOworICByZXR1cm4gcjsKK30KKworCisvKiBUT0RPOiB0YWJsZSBzaG91bGQgYmUgb3B0aW1pc2VkIGZvciB0aGUgd05BRi1iYXNlZCBpbXBsZW1lbnRhdGlvbiwKKyAqICAgICAgIHNvbWV0aW1lcyBzbWFsbGVyIHdpbmRvd3Mgd2lsbCBnaXZlIGJldHRlciBwZXJmb3JtYW5jZQorICogICAgICAgKHRodXMgdGhlIGJvdW5kYXJpZXMgc2hvdWxkIGJlIGluY3JlYXNlZCkKKyAqLworI2RlZmluZSBFQ193aW5kb3dfYml0c19mb3Jfc2NhbGFyX3NpemUoYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChzaXplX3QpKChiKSA+PSAyMDAwID8gNiA6IChiKSA+PSA4MDAgPyA1IDogKGIpID49IDMwMCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDQgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoYikgPj0gNzAgPyAzIDogKGIpID49IDIwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAxKSkKKworLyogQ29tcHV0ZQorICogICAgICBcc3VtIHNjYWxhcnNbaV0qcG9pbnRzW2ldLAorICogYWxzbyBpbmNsdWRpbmcKKyAqICAgICAgc2NhbGFyKmdlbmVyYXRvcgorICogaW4gdGhlIGFkZGl0aW9uIGlmIHNjYWxhciAhPSBOVUxMCisgKi8KK2ludCBlY193TkFGX211bChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEVDX1BPSU5UICpyLCBjb25zdCBCSUdOVU0gKnNjYWxhciwKKyAgICAgICAgICAgICAgICBzaXplX3QgbnVtLCBjb25zdCBFQ19QT0lOVCAqcG9pbnRzW10sIGNvbnN0IEJJR05VTSAqc2NhbGFyc1tdLAorICAgICAgICAgICAgICAgIEJOX0NUWCAqY3R4KSB7CisgIEJOX0NUWCAqbmV3X2N0eCA9IE5VTEw7CisgIGNvbnN0IEVDX1BPSU5UICpnZW5lcmF0b3IgPSBOVUxMOworICBFQ19QT0lOVCAqdG1wID0gTlVMTDsKKyAgc2l6ZV90IHRvdGFsbnVtOworICBzaXplX3QgYmxvY2tzaXplID0gMCwgbnVtYmxvY2tzID0gMDsgLyogZm9yIHdOQUYgc3BsaXR0aW5nICovCisgIHNpemVfdCBwcmVfcG9pbnRzX3Blcl9ibG9jayA9IDA7CisgIHNpemVfdCBpLCBqOworICBpbnQgazsKKyAgaW50IHJfaXNfaW52ZXJ0ZWQgPSAwOworICBpbnQgcl9pc19hdF9pbmZpbml0eSA9IDE7CisgIHNpemVfdCAqd3NpemUgPSBOVUxMOyAgICAgIC8qIGluZGl2aWR1YWwgd2luZG93IHNpemVzICovCisgIHNpZ25lZCBjaGFyICoqd05BRiA9IE5VTEw7IC8qIGluZGl2aWR1YWwgd05BRnMgKi8KKyAgc2l6ZV90ICp3TkFGX2xlbiA9IE5VTEw7CisgIHNpemVfdCBtYXhfbGVuID0gMDsKKyAgc2l6ZV90IG51bV92YWw7CisgIEVDX1BPSU5UICoqdmFsID0gTlVMTDsgLyogcHJlY29tcHV0YXRpb24gKi8KKyAgRUNfUE9JTlQgKip2OworICBFQ19QT0lOVCAqKip2YWxfc3ViID0KKyAgICAgIE5VTEw7IC8qIHBvaW50ZXJzIHRvIHN1Yi1hcnJheXMgb2YgJ3ZhbCcgb3IgJ3ByZV9jb21wLT5wb2ludHMnICovCisgIGNvbnN0IEVDX1BSRV9DT01QICpwcmVfY29tcCA9IE5VTEw7CisgIGludCBudW1fc2NhbGFyID0gMDsgLyogZmxhZzogd2lsbCBiZSBzZXQgdG8gMSBpZiAnc2NhbGFyJyBtdXN0IGJlIHRyZWF0ZWQgbGlrZQorICAgICAgICAgICAgICAgICAgICAgICAqIG90aGVyIHNjYWxhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICogaS5lLiBwcmVjb21wdXRhdGlvbiBpcyBub3QgYXZhaWxhYmxlICovCisgIGludCByZXQgPSAwOworCisgIGlmIChncm91cC0+bWV0aCAhPSByLT5tZXRoKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX3dOQUZfbXVsLCBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmICgoc2NhbGFyID09IE5VTEwpICYmIChudW0gPT0gMCkpIHsKKyAgICByZXR1cm4gRUNfUE9JTlRfc2V0X3RvX2luZmluaXR5KGdyb3VwLCByKTsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworICAgIGlmIChncm91cC0+bWV0aCAhPSBwb2ludHNbaV0tPm1ldGgpIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY193TkFGX211bCwgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICBpZiAoY3R4ID09IE5VTEwpIHsKKyAgICBjdHggPSBuZXdfY3R4ID0gQk5fQ1RYX25ldygpOworICAgIGlmIChjdHggPT0gTlVMTCkKKyAgICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKHNjYWxhciAhPSBOVUxMKSB7CisgICAgZ2VuZXJhdG9yID0gRUNfR1JPVVBfZ2V0MF9nZW5lcmF0b3IoZ3JvdXApOworICAgIGlmIChnZW5lcmF0b3IgPT0gTlVMTCkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX3dOQUZfbXVsLCBFQ19SX1VOREVGSU5FRF9HRU5FUkFUT1IpOworICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgLyogbG9vayBpZiB3ZSBjYW4gdXNlIHByZWNvbXB1dGVkIG11bHRpcGxlcyBvZiBnZW5lcmF0b3IgKi8KKworICAgIHByZV9jb21wID0gZ3JvdXAtPnByZV9jb21wOworCisgICAgaWYgKHByZV9jb21wICYmIHByZV9jb21wLT5udW1ibG9ja3MgJiYKKyAgICAgICAgKEVDX1BPSU5UX2NtcChncm91cCwgZ2VuZXJhdG9yLCBwcmVfY29tcC0+cG9pbnRzWzBdLCBjdHgpID09IDApKSB7CisgICAgICBibG9ja3NpemUgPSBwcmVfY29tcC0+YmxvY2tzaXplOworCisgICAgICAvKiBkZXRlcm1pbmUgbWF4aW11bSBudW1iZXIgb2YgYmxvY2tzIHRoYXQgd05BRiBzcGxpdHRpbmcgbWF5IHlpZWxkCisgICAgICAgKiAoTkI6IG1heGltdW0gd05BRiBsZW5ndGggaXMgYml0IGxlbmd0aCBwbHVzIG9uZSkgKi8KKyAgICAgIG51bWJsb2NrcyA9IChCTl9udW1fYml0cyhzY2FsYXIpIC8gYmxvY2tzaXplKSArIDE7CisKKyAgICAgIC8qIHdlIGNhbm5vdCB1c2UgbW9yZSBibG9ja3MgdGhhbiB3ZSBoYXZlIHByZWNvbXB1dGF0aW9uIGZvciAqLworICAgICAgaWYgKG51bWJsb2NrcyA+IHByZV9jb21wLT5udW1ibG9ja3MpCisgICAgICAgIG51bWJsb2NrcyA9IHByZV9jb21wLT5udW1ibG9ja3M7CisKKyAgICAgIHByZV9wb2ludHNfcGVyX2Jsb2NrID0gKHNpemVfdCkxIDw8IChwcmVfY29tcC0+dyAtIDEpOworCisgICAgICAvKiBjaGVjayB0aGF0IHByZV9jb21wIGxvb2tzIHNhbmUgKi8KKyAgICAgIGlmIChwcmVfY29tcC0+bnVtICE9IChwcmVfY29tcC0+bnVtYmxvY2tzICogcHJlX3BvaW50c19wZXJfYmxvY2spKSB7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY193TkFGX211bCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogY2FuJ3QgdXNlIHByZWNvbXB1dGF0aW9uICovCisgICAgICBwcmVfY29tcCA9IE5VTEw7CisgICAgICBudW1ibG9ja3MgPSAxOworICAgICAgbnVtX3NjYWxhciA9IDE7IC8qIHRyZWF0ICdzY2FsYXInIGxpa2UgJ251bSctdGggZWxlbWVudCBvZiAnc2NhbGFycycgKi8KKyAgICB9CisgIH0KKworICB0b3RhbG51bSA9IG51bSArIG51bWJsb2NrczsKKworICB3c2l6ZSA9IE9QRU5TU0xfbWFsbG9jKHRvdGFsbnVtICogc2l6ZW9mIHdzaXplWzBdKTsKKyAgd05BRl9sZW4gPSBPUEVOU1NMX21hbGxvYyh0b3RhbG51bSAqIHNpemVvZiB3TkFGX2xlblswXSk7CisgIHdOQUYgPSBPUEVOU1NMX21hbGxvYygodG90YWxudW0gKyAxKSAqCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Ygd05BRlswXSk7IC8qIGluY2x1ZGVzIHNwYWNlIGZvciBwaXZvdCAqLworICB2YWxfc3ViID0gT1BFTlNTTF9tYWxsb2ModG90YWxudW0gKiBzaXplb2YgdmFsX3N1YlswXSk7CisKKyAgaWYgKCF3c2l6ZSB8fCAhd05BRl9sZW4gfHwgIXdOQUYgfHwgIXZhbF9zdWIpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfd05BRl9tdWwsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIHdOQUZbMF0gPSBOVUxMOyAvKiBwcmVsaW1pbmFyeSBwaXZvdCAqLworCisgIC8qIG51bV92YWwgd2lsbCBiZSB0aGUgdG90YWwgbnVtYmVyIG9mIHRlbXBvcmFyaWx5IHByZWNvbXB1dGVkIHBvaW50cyAqLworICBudW1fdmFsID0gMDsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtICsgbnVtX3NjYWxhcjsgaSsrKSB7CisgICAgc2l6ZV90IGJpdHM7CisKKyAgICBiaXRzID0gaSA8IG51bSA/IEJOX251bV9iaXRzKHNjYWxhcnNbaV0pIDogQk5fbnVtX2JpdHMoc2NhbGFyKTsKKyAgICB3c2l6ZVtpXSA9IEVDX3dpbmRvd19iaXRzX2Zvcl9zY2FsYXJfc2l6ZShiaXRzKTsKKyAgICBudW1fdmFsICs9IChzaXplX3QpMSA8PCAod3NpemVbaV0gLSAxKTsKKyAgICB3TkFGW2kgKyAxXSA9IE5VTEw7IC8qIG1ha2Ugc3VyZSB3ZSBhbHdheXMgaGF2ZSBhIHBpdm90ICovCisgICAgd05BRltpXSA9CisgICAgICAgIGNvbXB1dGVfd05BRigoaSA8IG51bSA/IHNjYWxhcnNbaV0gOiBzY2FsYXIpLCB3c2l6ZVtpXSwgJndOQUZfbGVuW2ldKTsKKyAgICBpZiAod05BRltpXSA9PSBOVUxMKQorICAgICAgZ290byBlcnI7CisgICAgaWYgKHdOQUZfbGVuW2ldID4gbWF4X2xlbikKKyAgICAgIG1heF9sZW4gPSB3TkFGX2xlbltpXTsKKyAgfQorCisgIGlmIChudW1ibG9ja3MpIHsKKyAgICAvKiB3ZSBnbyBoZXJlIGlmZiBzY2FsYXIgIT0gTlVMTCAqLworCisgICAgaWYgKHByZV9jb21wID09IE5VTEwpIHsKKyAgICAgIGlmIChudW1fc2NhbGFyICE9IDEpIHsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX3dOQUZfbXVsLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICAgIGdvdG8gZXJyOworICAgICAgfQorICAgICAgLyogd2UgaGF2ZSBhbHJlYWR5IGdlbmVyYXRlZCBhIHdOQUYgZm9yICdzY2FsYXInICovCisgICAgfSBlbHNlIHsKKyAgICAgIHNpZ25lZCBjaGFyICp0bXBfd05BRiA9IE5VTEw7CisgICAgICBzaXplX3QgdG1wX2xlbiA9IDA7CisKKyAgICAgIGlmIChudW1fc2NhbGFyICE9IDApIHsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX3dOQUZfbXVsLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICAgIGdvdG8gZXJyOworICAgICAgfQorCisgICAgICAvKiB1c2UgdGhlIHdpbmRvdyBzaXplIGZvciB3aGljaCB3ZSBoYXZlIHByZWNvbXB1dGF0aW9uICovCisgICAgICB3c2l6ZVtudW1dID0gcHJlX2NvbXAtPnc7CisgICAgICB0bXBfd05BRiA9IGNvbXB1dGVfd05BRihzY2FsYXIsIHdzaXplW251bV0sICZ0bXBfbGVuKTsKKyAgICAgIGlmICghdG1wX3dOQUYpCisgICAgICAgIGdvdG8gZXJyOworCisgICAgICBpZiAodG1wX2xlbiA8PSBtYXhfbGVuKSB7CisgICAgICAgIC8qIE9uZSBvZiB0aGUgb3RoZXIgd05BRnMgaXMgYXQgbGVhc3QgYXMgbG9uZworICAgICAgICAgKiBhcyB0aGUgd05BRiBiZWxvbmdpbmcgdG8gdGhlIGdlbmVyYXRvciwKKyAgICAgICAgICogc28gd05BRiBzcGxpdHRpbmcgd2lsbCBub3QgYnV5IHVzIGFueXRoaW5nLiAqLworCisgICAgICAgIG51bWJsb2NrcyA9IDE7CisgICAgICAgIHRvdGFsbnVtID0gbnVtICsgMTsgLyogZG9uJ3QgdXNlIHdOQUYgc3BsaXR0aW5nICovCisgICAgICAgIHdOQUZbbnVtXSA9IHRtcF93TkFGOworICAgICAgICB3TkFGW251bSArIDFdID0gTlVMTDsKKyAgICAgICAgd05BRl9sZW5bbnVtXSA9IHRtcF9sZW47CisgICAgICAgIGlmICh0bXBfbGVuID4gbWF4X2xlbikKKyAgICAgICAgICBtYXhfbGVuID0gdG1wX2xlbjsKKyAgICAgICAgLyogcHJlX2NvbXAtPnBvaW50cyBzdGFydHMgd2l0aCB0aGUgcG9pbnRzIHRoYXQgd2UgbmVlZCBoZXJlOiAqLworICAgICAgICB2YWxfc3ViW251bV0gPSBwcmVfY29tcC0+cG9pbnRzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogZG9uJ3QgaW5jbHVkZSB0bXBfd05BRiBkaXJlY3RseSBpbnRvIHdOQUYgYXJyYXkKKyAgICAgICAgICogLSB1c2Ugd05BRiBzcGxpdHRpbmcgYW5kIGluY2x1ZGUgdGhlIGJsb2NrcyAqLworCisgICAgICAgIHNpZ25lZCBjaGFyICpwcDsKKyAgICAgICAgRUNfUE9JTlQgKip0bXBfcG9pbnRzOworCisgICAgICAgIGlmICh0bXBfbGVuIDwgbnVtYmxvY2tzICogYmxvY2tzaXplKSB7CisgICAgICAgICAgLyogcG9zc2libHkgd2UgY2FuIGRvIHdpdGggZmV3ZXIgYmxvY2tzIHRoYW4gZXN0aW1hdGVkICovCisgICAgICAgICAgbnVtYmxvY2tzID0gKHRtcF9sZW4gKyBibG9ja3NpemUgLSAxKSAvIGJsb2Nrc2l6ZTsKKyAgICAgICAgICBpZiAobnVtYmxvY2tzID4gcHJlX2NvbXAtPm51bWJsb2NrcykgeworICAgICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX3dOQUZfbXVsLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICB9CisgICAgICAgICAgdG90YWxudW0gPSBudW0gKyBudW1ibG9ja3M7CisgICAgICAgIH0KKworICAgICAgICAvKiBzcGxpdCB3TkFGIGluICdudW1ibG9ja3MnIHBhcnRzICovCisgICAgICAgIHBwID0gdG1wX3dOQUY7CisgICAgICAgIHRtcF9wb2ludHMgPSBwcmVfY29tcC0+cG9pbnRzOworCisgICAgICAgIGZvciAoaSA9IG51bTsgaSA8IHRvdGFsbnVtOyBpKyspIHsKKyAgICAgICAgICBpZiAoaSA8IHRvdGFsbnVtIC0gMSkgeworICAgICAgICAgICAgd05BRl9sZW5baV0gPSBibG9ja3NpemU7CisgICAgICAgICAgICBpZiAodG1wX2xlbiA8IGJsb2Nrc2l6ZSkgeworICAgICAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfd05BRl9tdWwsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0bXBfbGVuIC09IGJsb2Nrc2l6ZTsKKyAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIC8qIGxhc3QgYmxvY2sgZ2V0cyB3aGF0ZXZlciBpcyBsZWZ0CisgICAgICAgICAgICAgKiAodGhpcyBjb3VsZCBiZSBtb3JlIG9yIGxlc3MgdGhhbiAnYmxvY2tzaXplJyEpICovCisgICAgICAgICAgICB3TkFGX2xlbltpXSA9IHRtcF9sZW47CisKKyAgICAgICAgICB3TkFGW2kgKyAxXSA9IE5VTEw7CisgICAgICAgICAgd05BRltpXSA9IE9QRU5TU0xfbWFsbG9jKHdOQUZfbGVuW2ldKTsKKyAgICAgICAgICBpZiAod05BRltpXSA9PSBOVUxMKSB7CisgICAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfd05BRl9tdWwsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgICAgICAgIE9QRU5TU0xfZnJlZSh0bXBfd05BRik7CisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICB9CisgICAgICAgICAgbWVtY3B5KHdOQUZbaV0sIHBwLCB3TkFGX2xlbltpXSk7CisgICAgICAgICAgaWYgKHdOQUZfbGVuW2ldID4gbWF4X2xlbikKKyAgICAgICAgICAgIG1heF9sZW4gPSB3TkFGX2xlbltpXTsKKworICAgICAgICAgIGlmICgqdG1wX3BvaW50cyA9PSBOVUxMKSB7CisgICAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfd05BRl9tdWwsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICAgICAgICAgIE9QRU5TU0xfZnJlZSh0bXBfd05BRik7CisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICB9CisgICAgICAgICAgdmFsX3N1YltpXSA9IHRtcF9wb2ludHM7CisgICAgICAgICAgdG1wX3BvaW50cyArPSBwcmVfcG9pbnRzX3Blcl9ibG9jazsKKyAgICAgICAgICBwcCArPSBibG9ja3NpemU7CisgICAgICAgIH0KKyAgICAgICAgT1BFTlNTTF9mcmVlKHRtcF93TkFGKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBBbGwgcG9pbnRzIHdlIHByZWNvbXB1dGUgbm93IGdvIGludG8gYSBzaW5nbGUgYXJyYXkgJ3ZhbCcuCisgICAqICd2YWxfc3ViW2ldJyBpcyBhIHBvaW50ZXIgdG8gdGhlIHN1YmFycmF5IGZvciB0aGUgaS10aCBwb2ludCwKKyAgICogb3IgdG8gYSBzdWJhcnJheSBvZiAncHJlX2NvbXAtPnBvaW50cycgaWYgd2UgYWxyZWFkeSBoYXZlIHByZWNvbXB1dGF0aW9uLgorICAgKi8KKyAgdmFsID0gT1BFTlNTTF9tYWxsb2MoKG51bV92YWwgKyAxKSAqIHNpemVvZiB2YWxbMF0pOworICBpZiAodmFsID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfd05BRl9tdWwsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBnb3RvIGVycjsKKyAgfQorICB2YWxbbnVtX3ZhbF0gPSBOVUxMOyAvKiBwaXZvdCBlbGVtZW50ICovCisKKyAgLyogYWxsb2NhdGUgcG9pbnRzIGZvciBwcmVjb21wdXRhdGlvbiAqLworICB2ID0gdmFsOworICBmb3IgKGkgPSAwOyBpIDwgbnVtICsgbnVtX3NjYWxhcjsgaSsrKSB7CisgICAgdmFsX3N1YltpXSA9IHY7CisgICAgZm9yIChqID0gMDsgaiA8ICgoc2l6ZV90KTEgPDwgKHdzaXplW2ldIC0gMSkpOyBqKyspIHsKKyAgICAgICp2ID0gRUNfUE9JTlRfbmV3KGdyb3VwKTsKKyAgICAgIGlmICgqdiA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycjsKKyAgICAgIHYrKzsKKyAgICB9CisgIH0KKyAgaWYgKCEodiA9PSB2YWwgKyBudW1fdmFsKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY193TkFGX211bCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKCEodG1wID0gRUNfUE9JTlRfbmV3KGdyb3VwKSkpCisgICAgZ290byBlcnI7CisKKyAgLyogcHJlcGFyZSBwcmVjb21wdXRlZCB2YWx1ZXM6CisgICAqICAgIHZhbF9zdWJbaV1bMF0gOj0gICAgIHBvaW50c1tpXQorICAgKiAgICB2YWxfc3ViW2ldWzFdIDo9IDMgKiBwb2ludHNbaV0KKyAgICogICAgdmFsX3N1YltpXVsyXSA6PSA1ICogcG9pbnRzW2ldCisgICAqICAgIC4uLgorICAgKi8KKyAgZm9yIChpID0gMDsgaSA8IG51bSArIG51bV9zY2FsYXI7IGkrKykgeworICAgIGlmIChpIDwgbnVtKSB7CisgICAgICBpZiAoIUVDX1BPSU5UX2NvcHkodmFsX3N1YltpXVswXSwgcG9pbnRzW2ldKSkKKyAgICAgICAgZ290byBlcnI7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghRUNfUE9JTlRfY29weSh2YWxfc3ViW2ldWzBdLCBnZW5lcmF0b3IpKQorICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBpZiAod3NpemVbaV0gPiAxKSB7CisgICAgICBpZiAoIUVDX1BPSU5UX2RibChncm91cCwgdG1wLCB2YWxfc3ViW2ldWzBdLCBjdHgpKQorICAgICAgICBnb3RvIGVycjsKKyAgICAgIGZvciAoaiA9IDE7IGogPCAoKHNpemVfdCkxIDw8ICh3c2l6ZVtpXSAtIDEpKTsgaisrKSB7CisgICAgICAgIGlmICghRUNfUE9JTlRfYWRkKGdyb3VwLCB2YWxfc3ViW2ldW2pdLCB2YWxfc3ViW2ldW2ogLSAxXSwgdG1wLCBjdHgpKQorICAgICAgICAgIGdvdG8gZXJyOworICAgICAgfQorICAgIH0KKyAgfQorCisjaWYgMSAvKiBvcHRpb25hbDsgRUNfd2luZG93X2JpdHNfZm9yX3NjYWxhcl9zaXplIGFzc3VtZXMgd2UgZG8gdGhpcyBzdGVwICovCisgIGlmICghRUNfUE9JTlRzX21ha2VfYWZmaW5lKGdyb3VwLCBudW1fdmFsLCB2YWwsIGN0eCkpCisgICAgZ290byBlcnI7CisjZW5kaWYKKworICByX2lzX2F0X2luZmluaXR5ID0gMTsKKworICBmb3IgKGsgPSBtYXhfbGVuIC0gMTsgayA+PSAwOyBrLS0pIHsKKyAgICBpZiAoIXJfaXNfYXRfaW5maW5pdHkpIHsKKyAgICAgIGlmICghRUNfUE9JTlRfZGJsKGdyb3VwLCByLCByLCBjdHgpKQorICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgdG90YWxudW07IGkrKykgeworICAgICAgaWYgKHdOQUZfbGVuW2ldID4gKHNpemVfdClrKSB7CisgICAgICAgIGludCBkaWdpdCA9IHdOQUZbaV1ba107CisgICAgICAgIGludCBpc19uZWc7CisKKyAgICAgICAgaWYgKGRpZ2l0KSB7CisgICAgICAgICAgaXNfbmVnID0gZGlnaXQgPCAwOworCisgICAgICAgICAgaWYgKGlzX25lZykKKyAgICAgICAgICAgIGRpZ2l0ID0gLWRpZ2l0OworCisgICAgICAgICAgaWYgKGlzX25lZyAhPSByX2lzX2ludmVydGVkKSB7CisgICAgICAgICAgICBpZiAoIXJfaXNfYXRfaW5maW5pdHkpIHsKKyAgICAgICAgICAgICAgaWYgKCFFQ19QT0lOVF9pbnZlcnQoZ3JvdXAsIHIsIGN0eCkpCisgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByX2lzX2ludmVydGVkID0gIXJfaXNfaW52ZXJ0ZWQ7CisgICAgICAgICAgfQorCisgICAgICAgICAgLyogZGlnaXQgPiAwICovCisKKyAgICAgICAgICBpZiAocl9pc19hdF9pbmZpbml0eSkgeworICAgICAgICAgICAgaWYgKCFFQ19QT0lOVF9jb3B5KHIsIHZhbF9zdWJbaV1bZGlnaXQgPj4gMV0pKQorICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICAgIHJfaXNfYXRfaW5maW5pdHkgPSAwOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIUVDX1BPSU5UX2FkZChncm91cCwgciwgciwgdmFsX3N1YltpXVtkaWdpdCA+PiAxXSwgY3R4KSkKKyAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKHJfaXNfYXRfaW5maW5pdHkpIHsKKyAgICBpZiAoIUVDX1BPSU5UX3NldF90b19pbmZpbml0eShncm91cCwgcikpCisgICAgICBnb3RvIGVycjsKKyAgfSBlbHNlIHsKKyAgICBpZiAocl9pc19pbnZlcnRlZCkKKyAgICAgIGlmICghRUNfUE9JTlRfaW52ZXJ0KGdyb3VwLCByLCBjdHgpKQorICAgICAgICBnb3RvIGVycjsKKyAgfQorCisgIHJldCA9IDE7CisKK2VycjoKKyAgaWYgKG5ld19jdHggIT0gTlVMTCkKKyAgICBCTl9DVFhfZnJlZShuZXdfY3R4KTsKKyAgaWYgKHRtcCAhPSBOVUxMKQorICAgIEVDX1BPSU5UX2ZyZWUodG1wKTsKKyAgaWYgKHdzaXplICE9IE5VTEwpCisgICAgT1BFTlNTTF9mcmVlKHdzaXplKTsKKyAgaWYgKHdOQUZfbGVuICE9IE5VTEwpCisgICAgT1BFTlNTTF9mcmVlKHdOQUZfbGVuKTsKKyAgaWYgKHdOQUYgIT0gTlVMTCkgeworICAgIHNpZ25lZCBjaGFyICoqdzsKKworICAgIGZvciAodyA9IHdOQUY7ICp3ICE9IE5VTEw7IHcrKykKKyAgICAgIE9QRU5TU0xfZnJlZSgqdyk7CisKKyAgICBPUEVOU1NMX2ZyZWUod05BRik7CisgIH0KKyAgaWYgKHZhbCAhPSBOVUxMKSB7CisgICAgZm9yICh2ID0gdmFsOyAqdiAhPSBOVUxMOyB2KyspCisgICAgICBFQ19QT0lOVF9jbGVhcl9mcmVlKCp2KTsKKworICAgIE9QRU5TU0xfZnJlZSh2YWwpOworICB9CisgIGlmICh2YWxfc3ViICE9IE5VTEwpIHsKKyAgICBPUEVOU1NMX2ZyZWUodmFsX3N1Yik7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworCisvKiBlY193TkFGX3ByZWNvbXB1dGVfbXVsdCgpCisgKiBjcmVhdGVzIGFuIEVDX1BSRV9DT01QIG9iamVjdCB3aXRoIHByZXByZWNvbXB1dGVkIG11bHRpcGxlcyBvZiB0aGUgZ2VuZXJhdG9yCisgKiBmb3IgdXNlIHdpdGggd05BRiBzcGxpdHRpbmcgYXMgaW1wbGVtZW50ZWQgaW4gZWNfd05BRl9tdWwoKS4KKyAqCisgKiAncHJlX2NvbXAtPnBvaW50cycgaXMgYW4gYXJyYXkgb2YgbXVsdGlwbGVzIG9mIHRoZSBnZW5lcmF0b3IKKyAqIG9mIHRoZSBmb2xsb3dpbmcgZm9ybToKKyAqIHBvaW50c1swXSA9ICAgICBnZW5lcmF0b3I7CisgKiBwb2ludHNbMV0gPSAzICogZ2VuZXJhdG9yOworICogLi4uCisgKiBwb2ludHNbMl4ody0xKS0xXSA9ICAgICAoMl4ody0xKS0xKSAqIGdlbmVyYXRvcjsKKyAqIHBvaW50c1syXih3LTEpXSAgID0gICAgIDJeYmxvY2tzaXplICogZ2VuZXJhdG9yOworICogcG9pbnRzWzJeKHctMSkrMV0gPSAzICogMl5ibG9ja3NpemUgKiBnZW5lcmF0b3I7CisgKiAuLi4KKyAqIHBvaW50c1syXih3LTEpKihudW1ibG9ja3MtMSktMV0gPSAoMl4ody0xKSkgKiAgMl4oYmxvY2tzaXplKihudW1ibG9ja3MtMikpICoKKyAqZ2VuZXJhdG9yCisgKiBwb2ludHNbMl4ody0xKSoobnVtYmxvY2tzLTEpXSAgID0gICAgICAgICAgICAgIDJeKGJsb2Nrc2l6ZSoobnVtYmxvY2tzLTEpKSAqCisgKmdlbmVyYXRvcgorICogLi4uCisgKiBwb2ludHNbMl4ody0xKSpudW1ibG9ja3MtMV0gICAgID0gKDJeKHctMSkpICogIDJeKGJsb2Nrc2l6ZSoobnVtYmxvY2tzLTEpKSAqCisgKmdlbmVyYXRvcgorICogcG9pbnRzWzJeKHctMSkqbnVtYmxvY2tzXSAgICAgICA9IE5VTEwKKyAqLworaW50IGVjX3dOQUZfcHJlY29tcHV0ZV9tdWx0KEVDX0dST1VQICpncm91cCwgQk5fQ1RYICpjdHgpIHsKKyAgY29uc3QgRUNfUE9JTlQgKmdlbmVyYXRvcjsKKyAgRUNfUE9JTlQgKnRtcF9wb2ludCA9IE5VTEwsICpiYXNlID0gTlVMTCwgKip2YXI7CisgIEJOX0NUWCAqbmV3X2N0eCA9IE5VTEw7CisgIEJJR05VTSAqb3JkZXI7CisgIHNpemVfdCBpLCBiaXRzLCB3LCBwcmVfcG9pbnRzX3Blcl9ibG9jaywgYmxvY2tzaXplLCBudW1ibG9ja3MsIG51bTsKKyAgRUNfUE9JTlQgKipwb2ludHMgPSBOVUxMOworICBFQ19QUkVfQ09NUCAqcHJlX2NvbXA7CisgIGludCByZXQgPSAwOworCisgIC8qIGlmIHRoZXJlIGlzIGFuIG9sZCBFQ19QUkVfQ09NUCBvYmplY3QsIHRocm93IGl0IGF3YXkgKi8KKyAgaWYgKGdyb3VwLT5wcmVfY29tcCkgeworICAgIGVjX3ByZV9jb21wX2ZyZWUoZ3JvdXAtPnByZV9jb21wKTsKKyAgICBncm91cC0+cHJlX2NvbXAgPSBOVUxMOworICB9CisKKyAgaWYgKChwcmVfY29tcCA9IGVjX3ByZV9jb21wX25ldyhncm91cCkpID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisKKyAgZ2VuZXJhdG9yID0gRUNfR1JPVVBfZ2V0MF9nZW5lcmF0b3IoZ3JvdXApOworICBpZiAoZ2VuZXJhdG9yID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfd05BRl9wcmVjb21wdXRlX211bHQsIEVDX1JfVU5ERUZJTkVEX0dFTkVSQVRPUik7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAoY3R4ID09IE5VTEwpIHsKKyAgICBjdHggPSBuZXdfY3R4ID0gQk5fQ1RYX25ldygpOworICAgIGlmIChjdHggPT0gTlVMTCkKKyAgICAgIGdvdG8gZXJyOworICB9CisKKyAgQk5fQ1RYX3N0YXJ0KGN0eCk7CisgIG9yZGVyID0gQk5fQ1RYX2dldChjdHgpOworICBpZiAob3JkZXIgPT0gTlVMTCkKKyAgICBnb3RvIGVycjsKKworICBpZiAoIUVDX0dST1VQX2dldF9vcmRlcihncm91cCwgb3JkZXIsIGN0eCkpCisgICAgZ290byBlcnI7CisgIGlmIChCTl9pc196ZXJvKG9yZGVyKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY193TkFGX3ByZWNvbXB1dGVfbXVsdCwgRUNfUl9VTktOT1dOX09SREVSKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGJpdHMgPSBCTl9udW1fYml0cyhvcmRlcik7CisgIC8qIFRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBtZWFuIHdlIHByZWNvbXB1dGUgKGFwcHJveGltYXRlbHkpCisgICAqIG9uZSBwb2ludCBwZXIgYml0LgorICAgKgorICAgKiBUQkQ6IFRoZSBjb21iaW5hdGlvbiAgOCwgNCAgaXMgcGVyZmVjdCBmb3IgMTYwIGJpdHM7IGZvciBvdGhlcgorICAgKiBiaXQgbGVuZ3Rocywgb3RoZXIgcGFyYW1ldGVyIGNvbWJpbmF0aW9ucyBtaWdodCBwcm92aWRlIGJldHRlcgorICAgKiBlZmZpY2llbmN5LgorICAgKi8KKyAgYmxvY2tzaXplID0gODsKKyAgdyA9IDQ7CisgIGlmIChFQ193aW5kb3dfYml0c19mb3Jfc2NhbGFyX3NpemUoYml0cykgPiB3KSB7CisgICAgLyogbGV0J3Mgbm90IG1ha2UgdGhlIHdpbmRvdyB0b28gc21hbGwgLi4uICovCisgICAgdyA9IEVDX3dpbmRvd19iaXRzX2Zvcl9zY2FsYXJfc2l6ZShiaXRzKTsKKyAgfQorCisgIG51bWJsb2NrcyA9IChiaXRzICsgYmxvY2tzaXplIC0gMSkgLworICAgICAgICAgICAgICBibG9ja3NpemU7IC8qIG1heC4gbnVtYmVyIG9mIGJsb2NrcyB0byB1c2UgZm9yIHdOQUYgc3BsaXR0aW5nICovCisKKyAgcHJlX3BvaW50c19wZXJfYmxvY2sgPSAoc2l6ZV90KTEgPDwgKHcgLSAxKTsKKyAgbnVtID0gcHJlX3BvaW50c19wZXJfYmxvY2sgKgorICAgICAgICBudW1ibG9ja3M7IC8qIG51bWJlciBvZiBwb2ludHMgdG8gY29tcHV0ZSBhbmQgc3RvcmUgKi8KKworICBwb2ludHMgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoRUNfUE9JTlQgKikgKiAobnVtICsgMSkpOworICBpZiAoIXBvaW50cykgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY193TkFGX3ByZWNvbXB1dGVfbXVsdCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgdmFyID0gcG9pbnRzOworICB2YXJbbnVtXSA9IE5VTEw7IC8qIHBpdm90ICovCisgIGZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworICAgIGlmICgodmFyW2ldID0gRUNfUE9JTlRfbmV3KGdyb3VwKSkgPT0gTlVMTCkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX3dOQUZfcHJlY29tcHV0ZV9tdWx0LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0KKworICBpZiAoISh0bXBfcG9pbnQgPSBFQ19QT0lOVF9uZXcoZ3JvdXApKSB8fCAhKGJhc2UgPSBFQ19QT0lOVF9uZXcoZ3JvdXApKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY193TkFGX3ByZWNvbXB1dGVfbXVsdCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKCFFQ19QT0lOVF9jb3B5KGJhc2UsIGdlbmVyYXRvcikpCisgICAgZ290byBlcnI7CisKKyAgLyogZG8gdGhlIHByZWNvbXB1dGF0aW9uICovCisgIGZvciAoaSA9IDA7IGkgPCBudW1ibG9ja3M7IGkrKykgeworICAgIHNpemVfdCBqOworCisgICAgaWYgKCFFQ19QT0lOVF9kYmwoZ3JvdXAsIHRtcF9wb2ludCwgYmFzZSwgY3R4KSkKKyAgICAgIGdvdG8gZXJyOworCisgICAgaWYgKCFFQ19QT0lOVF9jb3B5KCp2YXIrKywgYmFzZSkpCisgICAgICBnb3RvIGVycjsKKworICAgIGZvciAoaiA9IDE7IGogPCBwcmVfcG9pbnRzX3Blcl9ibG9jazsgaisrLCB2YXIrKykgeworICAgICAgLyogY2FsY3VsYXRlIG9kZCBtdWx0aXBsZXMgb2YgdGhlIGN1cnJlbnQgYmFzZSBwb2ludCAqLworICAgICAgaWYgKCFFQ19QT0lOVF9hZGQoZ3JvdXAsICp2YXIsIHRtcF9wb2ludCwgKih2YXIgLSAxKSwgY3R4KSkKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgaWYgKGkgPCBudW1ibG9ja3MgLSAxKSB7CisgICAgICAvKiBnZXQgdGhlIG5leHQgYmFzZSAobXVsdGlwbHkgY3VycmVudCBvbmUgYnkgMl5ibG9ja3NpemUpICovCisgICAgICBzaXplX3QgazsKKworICAgICAgaWYgKGJsb2Nrc2l6ZSA8PSAyKSB7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY193TkFGX3ByZWNvbXB1dGVfbXVsdCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKworICAgICAgaWYgKCFFQ19QT0lOVF9kYmwoZ3JvdXAsIGJhc2UsIHRtcF9wb2ludCwgY3R4KSkKKyAgICAgICAgZ290byBlcnI7CisgICAgICBmb3IgKGsgPSAyOyBrIDwgYmxvY2tzaXplOyBrKyspIHsKKyAgICAgICAgaWYgKCFFQ19QT0lOVF9kYmwoZ3JvdXAsIGJhc2UsIGJhc2UsIGN0eCkpCisgICAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKCFFQ19QT0lOVHNfbWFrZV9hZmZpbmUoZ3JvdXAsIG51bSwgcG9pbnRzLCBjdHgpKQorICAgIGdvdG8gZXJyOworCisgIHByZV9jb21wLT5ncm91cCA9IGdyb3VwOworICBwcmVfY29tcC0+YmxvY2tzaXplID0gYmxvY2tzaXplOworICBwcmVfY29tcC0+bnVtYmxvY2tzID0gbnVtYmxvY2tzOworICBwcmVfY29tcC0+dyA9IHc7CisgIHByZV9jb21wLT5wb2ludHMgPSBwb2ludHM7CisgIHBvaW50cyA9IE5VTEw7CisgIHByZV9jb21wLT5udW0gPSBudW07CisKKyAgZ3JvdXAtPnByZV9jb21wID0gcHJlX2NvbXA7CisgIHByZV9jb21wID0gTlVMTDsKKworICByZXQgPSAxOworCitlcnI6CisgIGlmIChjdHggIT0gTlVMTCkKKyAgICBCTl9DVFhfZW5kKGN0eCk7CisgIGlmIChuZXdfY3R4ICE9IE5VTEwpCisgICAgQk5fQ1RYX2ZyZWUobmV3X2N0eCk7CisgIGlmIChwcmVfY29tcCkKKyAgICBlY19wcmVfY29tcF9mcmVlKHByZV9jb21wKTsKKyAgaWYgKHBvaW50cykgeworICAgIEVDX1BPSU5UICoqcDsKKworICAgIGZvciAocCA9IHBvaW50czsgKnAgIT0gTlVMTDsgcCsrKQorICAgICAgRUNfUE9JTlRfZnJlZSgqcCk7CisgICAgT1BFTlNTTF9mcmVlKHBvaW50cyk7CisgIH0KKyAgaWYgKHRtcF9wb2ludCkKKyAgICBFQ19QT0lOVF9mcmVlKHRtcF9wb2ludCk7CisgIGlmIChiYXNlKQorICAgIEVDX1BPSU5UX2ZyZWUoYmFzZSk7CisgIHJldHVybiByZXQ7Cit9CisKKworaW50IGVjX3dOQUZfaGF2ZV9wcmVjb21wdXRlX211bHQoY29uc3QgRUNfR1JPVVAgKmdyb3VwKSB7CisgIHJldHVybiBncm91cC0+cHJlX2NvbXAgIT0gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2NyeXB0by9lY2RoL0NNYWtlTGlzdHMudHh0IGIvY3J5cHRvL2VjZGgvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY3MTM2OAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9lY2RoL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTAgQEAKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQorCithZGRfbGlicmFyeSgKKwllY2RoCisKKwlPQkpFQ1QKKworCWVjZGguYworCWVjZGhfZXJyb3IuYworKQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2VjZGgvZWNkaC5jIGIvY3J5cHRvL2VjZGgvZWNkaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NGEwYWQKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vZWNkaC9lY2RoLmMKQEAgLTAsMCArMSwyMTggQEAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFMTCBSSUdIVFMgUkVTRVJWRUQuCisgKgorICogVGhlIEVsbGlwdGljIEN1cnZlIFB1YmxpYy1LZXkgQ3J5cHRvIExpYnJhcnkgKEVDQyBDb2RlKSBpbmNsdWRlZAorICogaGVyZWluIGlzIGRldmVsb3BlZCBieSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuLCBhbmQgaXMgY29udHJpYnV0ZWQKKyAqIHRvIHRoZSBPcGVuU1NMIHByb2plY3QuCisgKgorICogVGhlIEVDQyBDb2RlIGlzIGxpY2Vuc2VkIHB1cnN1YW50IHRvIHRoZSBPcGVuU1NMIG9wZW4gc291cmNlCisgKiBsaWNlbnNlIHByb3ZpZGVkIGJlbG93LgorICoKKyAqIFRoZSBFQ0RIIHNvZnR3YXJlIGlzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBEb3VnbGFzIFN0ZWJpbGEgb2YKKyAqIFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzLgorICoKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvZWNkaC5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZGlnZXN0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorCisKK2ludCBFQ0RIX2NvbXB1dGVfa2V5KHZvaWQgKm91dCwgc2l6ZV90IG91dGxlbiwgY29uc3QgRUNfUE9JTlQgKnB1Yl9rZXksCisgICAgICAgICAgICAgICAgICAgICBFQ19LRVkgKnByaXZfa2V5LCB2b2lkICooKktERikoY29uc3Qgdm9pZCAqaW4sIHNpemVfdCBpbmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm91dCwgc2l6ZV90ICpvdXRsZW4pKSB7CisgIEJOX0NUWCAqY3R4OworICBFQ19QT0lOVCAqdG1wID0gTlVMTDsKKyAgQklHTlVNICp4ID0gTlVMTCwgKnkgPSBOVUxMOworICBjb25zdCBCSUdOVU0gKnByaXY7CisgIGNvbnN0IEVDX0dST1VQICpncm91cDsKKyAgaW50IHJldCA9IC0xOworICBzaXplX3QgYnVmbGVuLCBsZW47CisgIHVpbnQ4X3QgKmJ1ZiA9IE5VTEw7CisKKyAgaWYgKChjdHggPSBCTl9DVFhfbmV3KCkpID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorICBCTl9DVFhfc3RhcnQoY3R4KTsKKyAgeCA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgeSA9IEJOX0NUWF9nZXQoY3R4KTsKKworICBwcml2ID0gRUNfS0VZX2dldDBfcHJpdmF0ZV9rZXkocHJpdl9rZXkpOworICBpZiAocHJpdiA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNESCwgRUNESF9jb21wdXRlX2tleSwgRUNESF9SX05PX1BSSVZBVEVfVkFMVUUpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgZ3JvdXAgPSBFQ19LRVlfZ2V0MF9ncm91cChwcml2X2tleSk7CisKKyAgdG1wID0gRUNfUE9JTlRfbmV3KGdyb3VwKTsKKyAgaWYgKHRtcCA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNESCwgRUNESF9jb21wdXRlX2tleSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKCFFQ19QT0lOVF9tdWwoZ3JvdXAsIHRtcCwgTlVMTCwgcHViX2tleSwgcHJpdiwgY3R4KSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDREgsIEVDREhfY29tcHV0ZV9rZXksIEVDREhfUl9QT0lOVF9BUklUSE1FVElDX0ZBSUxVUkUpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKCFFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcChncm91cCwgdG1wLCB4LCB5LCBjdHgpKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNESCwgRUNESF9jb21wdXRlX2tleSwgRUNESF9SX1BPSU5UX0FSSVRITUVUSUNfRkFJTFVSRSk7CisgICAgZ290byBlcnI7CisgIH0KKworICBidWZsZW4gPSAoRUNfR1JPVVBfZ2V0X2RlZ3JlZShncm91cCkgKyA3KSAvIDg7CisgIGxlbiA9IEJOX251bV9ieXRlcyh4KTsKKyAgaWYgKGxlbiA+IGJ1ZmxlbikgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDREgsIEVDREhfY29tcHV0ZV9rZXksIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICBnb3RvIGVycjsKKyAgfQorICBidWYgPSBPUEVOU1NMX21hbGxvYyhidWZsZW4pOworICBpZiAoYnVmID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RILCBFQ0RIX2NvbXB1dGVfa2V5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgZ290byBlcnI7CisgIH0KKworICBtZW1zZXQoYnVmLCAwLCBidWZsZW4gLSBsZW4pOworICBpZiAobGVuICE9IChzaXplX3QpQk5fYm4yYmluKHgsIGJ1ZiArIGJ1ZmxlbiAtIGxlbikpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RILCBFQ0RIX2NvbXB1dGVfa2V5LCBFUlJfUl9CTl9MSUIpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKEtERiAhPSAwKSB7CisgICAgaWYgKEtERihidWYsIGJ1Zmxlbiwgb3V0LCAmb3V0bGVuKSA9PSBOVUxMKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RILCBFQ0RIX2NvbXB1dGVfa2V5LCBFQ0RIX1JfS0RGX0ZBSUxFRCk7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgcmV0ID0gb3V0bGVuOworICB9IGVsc2UgeworICAgIC8qIG5vIEtERiwganVzdCBjb3B5IGFzIG11Y2ggYXMgd2UgY2FuICovCisgICAgaWYgKG91dGxlbiA+IGJ1ZmxlbikgeworICAgICAgb3V0bGVuID0gYnVmbGVuOworICAgIH0KKyAgICBtZW1jcHkob3V0LCBidWYsIG91dGxlbik7CisgICAgcmV0ID0gb3V0bGVuOworICB9CisKK2VycjoKKyAgaWYgKHRtcCkKKyAgICBFQ19QT0lOVF9mcmVlKHRtcCk7CisgIGlmIChjdHgpCisgICAgQk5fQ1RYX2VuZChjdHgpOworICBpZiAoY3R4KQorICAgIEJOX0NUWF9mcmVlKGN0eCk7CisgIGlmIChidWYpCisgICAgT1BFTlNTTF9mcmVlKGJ1Zik7CisgIHJldHVybiByZXQ7Cit9CisKKy8qIEtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uIGZyb20gWDkuNjIvU0VDRyAqLworLyogV2F5IG1vcmUgdGhhbiB3ZSB3aWxsIGV2ZXIgbmVlZCAqLworI2RlZmluZSBFQ0RIX0tERl9NQVgJKDEgPDwgMzApCisKK2ludCBFQ0RIX0tERl9YOV82Mih1aW50OF90ICpvdXQsIHNpemVfdCBvdXRsZW4sIGNvbnN0IHVpbnQ4X3QgKlosCisgICAgICAgICAgICAgICAgICAgc2l6ZV90IFpsZW4sIGNvbnN0IHVpbnQ4X3QgKnNpbmZvLCBzaXplX3Qgc2luZm9sZW4sCisgICAgICAgICAgICAgICAgICAgY29uc3QgRVZQX01EICptZCkgeworICBFVlBfTURfQ1RYIG1jdHg7CisgIGludCBydiA9IDA7CisgIHVuc2lnbmVkIGludCBpOworICBzaXplX3QgbWRsZW47CisgIHVpbnQ4X3QgY3RyWzRdOworCisgIGlmIChzaW5mb2xlbiA+IEVDREhfS0RGX01BWCB8fCBvdXRsZW4gPiBFQ0RIX0tERl9NQVggfHwgWmxlbiA+IEVDREhfS0RGX01BWCkgeworICAgIHJldHVybiAwOworICB9CisgIG1kbGVuID0gRVZQX01EX3NpemUobWQpOworICBFVlBfTURfQ1RYX2luaXQoJm1jdHgpOworCisgIGZvciAoaSA9IDE7OyBpKyspIHsKKyAgICB1aW50OF90IG10bXBbRVZQX01BWF9NRF9TSVpFXTsKKyAgICBFVlBfRGlnZXN0SW5pdF9leCgmbWN0eCwgbWQsIE5VTEwpOworICAgIGN0clszXSA9IGkgJiAweEZGOworICAgIGN0clsyXSA9IChpID4+IDgpICYgMHhGRjsKKyAgICBjdHJbMV0gPSAoaSA+PiAxNikgJiAweEZGOworICAgIGN0clswXSA9IChpID4+IDI0KSAmIDB4RkY7CisgICAgaWYgKCFFVlBfRGlnZXN0VXBkYXRlKCZtY3R4LCBaLCBabGVuKSB8fAorICAgICAgICAhRVZQX0RpZ2VzdFVwZGF0ZSgmbWN0eCwgY3RyLCBzaXplb2YoY3RyKSkgfHwKKyAgICAgICAgIUVWUF9EaWdlc3RVcGRhdGUoJm1jdHgsIHNpbmZvLCBzaW5mb2xlbikpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGlmIChvdXRsZW4gPj0gbWRsZW4pIHsKKyAgICAgIGlmICghRVZQX0RpZ2VzdEZpbmFsKCZtY3R4LCBvdXQsIE5VTEwpKSB7CisgICAgICAgIGdvdG8gZXJyOworICAgICAgfQorICAgICAgb3V0bGVuIC09IG1kbGVuOworICAgICAgaWYgKG91dGxlbiA9PSAwKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgb3V0ICs9IG1kbGVuOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoIUVWUF9EaWdlc3RGaW5hbCgmbWN0eCwgbXRtcCwgTlVMTCkpIHsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgICBtZW1jcHkob3V0LCBtdG1wLCBvdXRsZW4pOworICAgICAgT1BFTlNTTF9jbGVhbnNlKG10bXAsIG1kbGVuKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBydiA9IDE7CisKK2VycjoKKyAgRVZQX01EX0NUWF9jbGVhbnVwKCZtY3R4KTsKKyAgcmV0dXJuIHJ2OworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2VjZGgvZWNkaC5oIGIvY3J5cHRvL2VjZGgvZWNkaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YWEwOGQKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vZWNkaC9lY2RoLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFMTCBSSUdIVFMgUkVTRVJWRUQuCisgKgorICogVGhlIEVsbGlwdGljIEN1cnZlIFB1YmxpYy1LZXkgQ3J5cHRvIExpYnJhcnkgKEVDQyBDb2RlKSBpbmNsdWRlZAorICogaGVyZWluIGlzIGRldmVsb3BlZCBieSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuLCBhbmQgaXMgY29udHJpYnV0ZWQKKyAqIHRvIHRoZSBPcGVuU1NMIHByb2plY3QuCisgKgorICogVGhlIEVDQyBDb2RlIGlzIGxpY2Vuc2VkIHB1cnN1YW50IHRvIHRoZSBPcGVuU1NMIG9wZW4gc291cmNlCisgKiBsaWNlbnNlIHByb3ZpZGVkIGJlbG93LgorICoKKyAqIFRoZSBFQ0RIIHNvZnR3YXJlIGlzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBEb3VnbGFzIFN0ZWJpbGEgb2YKKyAqIFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzLgorICoKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4gKi8KKworI2lmbmRlZiBPUEVOU1NMX0hFQURFUl9FQ0RIX0gKKyNkZWZpbmUgT1BFTlNTTF9IRUFERVJfRUNESF9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jhc2UuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvZWNfa2V5Lmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBFQ0RIX2NvbXB1dGVfa2V5IGNhbGN1bGF0ZXMgdGhlIHNoYXJlZCBrZXkgYmV0d2VlbiB8cHViX2tleXwgYW5kIHxwcml2X2tleXwuCisgKiBJZiB8S0RGfCBpcyBub3QgTlVMTCwgdGhlbiBpdCBpcyBjYWxsZWQgd2l0aCB0aGUgYnl0ZXMgb2YgdGhlIHNoYXJlZCBrZXkgYW5kCisgKiB0aGUgcGFyYW1ldGVyIHxvdXR8LiBXaGVuIHxLREZ8IHJldHVybnMsIHRoZSB2YWx1ZSBvZiB8Km91dGxlbnwgYmVjb21lcyB0aGUKKyAqIHJldHVybiB2YWx1ZS4gT3RoZXJ3aXNlLCBhcyBtYW55IGJ5dGVzIG9mIHRoZSBzaGFyZWQga2V5IGFzIHdpbGwgZml0IGFyZQorICogY29waWVkIGRpcmVjdGx5IHRvLCBhdCBtb3N0LCB8b3V0bGVufCBieXRlcyBhdCB8b3V0fC4gSXQgcmV0dXJucyB0aGUgbnVtYmVyCisgKiBvZiBieXRlcyB3cml0dGVuIHRvIHxvdXR8LCBvciAtMSBvbiBlcnJvci4gKi8KK2ludCBFQ0RIX2NvbXB1dGVfa2V5KHZvaWQgKm91dCwgc2l6ZV90IG91dGxlbiwgY29uc3QgRUNfUE9JTlQgKnB1Yl9rZXksCisgICAgICAgICAgICAgICAgICAgICBFQ19LRVkgKnByaXZfa2V5LCB2b2lkICooKktERikoY29uc3Qgdm9pZCAqaW4sIHNpemVfdCBpbmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm91dCwgc2l6ZV90ICpvdXRsZW4pKTsKKworLyogRUNESF9LREZfWDlfNjIgd3JpdGVzIHxvdXRsZW58IGJ5dGVzIHRvIHxvdXR8IHVzaW5nIHRoZSBLREYgZnJvbSBYOS42MgorICogYXBwbGllZCB0byB8WnwgYW5kIHxzaW5mb3wgYW5kIHVzaW5nIHRoZSBoYXNoIHxtZHwuIEl0IHJldHVybnMgb25lIG9uCisgKiBzdWNjZXNzIGFuZCB6ZXJvIG90aGVyd2lzZS4gKi8KK2ludCBFQ0RIX0tERl9YOV82Mih1aW50OF90ICpvdXQsIHNpemVfdCBvdXRsZW4sIGNvbnN0IHVpbnQ4X3QgKlosCisgICAgICAgICAgICAgICAgICAgc2l6ZV90IFpsZW4sIGNvbnN0IHVpbnQ4X3QgKnNpbmZvLCBzaXplX3Qgc2luZm9sZW4sCisgICAgICAgICAgICAgICAgICAgY29uc3QgRVZQX01EICptZCk7CisKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9ICAvKiBleHRlcm4gQyAqLworI2VuZGlmCisKKyNkZWZpbmUgRUNESF9GX0VDREhfY29tcHV0ZV9rZXkgMTAwCisjZGVmaW5lIEVDREhfUl9QT0lOVF9BUklUSE1FVElDX0ZBSUxVUkUgMTAwCisjZGVmaW5lIEVDREhfUl9LREZfRkFJTEVEIDEwMQorI2RlZmluZSBFQ0RIX1JfTk9fUFJJVkFURV9WQUxVRSAxMDIKKworI2VuZGlmICAvKiBPUEVOU1NMX0hFQURFUl9FQ0RIX0ggKi8KZGlmZiAtLWdpdCBhL2NyeXB0by9lY2RoL2VjZGhfZXJyb3IuYyBiL2NyeXB0by9lY2RoL2VjZGhfZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTUzNDY3Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2VjZGgvZWNkaF9lcnJvci5jCkBAIC0wLDAgKzEsMjUgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNCwgR29vZ2xlIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisKKyNpbmNsdWRlICJlY2RoLmgiCisKK2NvbnN0IEVSUl9TVFJJTkdfREFUQSBFQ0RIX2Vycm9yX3N0cmluZ19kYXRhW10gPSB7CisgIHtFUlJfUEFDSyhFUlJfTElCX0VDREgsIEVDREhfRl9FQ0RIX2NvbXB1dGVfa2V5LCAwKSwgIkVDREhfY29tcHV0ZV9rZXkifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRUNESCwgMCwgRUNESF9SX0tERl9GQUlMRUQpLCAiS0RGX0ZBSUxFRCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQ0RILCAwLCBFQ0RIX1JfTk9fUFJJVkFURV9WQUxVRSksICJOT19QUklWQVRFX1ZBTFVFIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDREgsIDAsIEVDREhfUl9QT0lOVF9BUklUSE1FVElDX0ZBSUxVUkUpLCAiUE9JTlRfQVJJVEhNRVRJQ19GQUlMVVJFIn0sCisgIHswLCBOVUxMfSwKK307CmRpZmYgLS1naXQgYS9jcnlwdG8vZWNkc2EvQ01ha2VMaXN0cy50eHQgYi9jcnlwdG8vZWNkc2EvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YwY2FmMAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9lY2RzYS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDIwIEBACitpbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKKworYWRkX2xpYnJhcnkoCisJZWNkc2EKKworCU9CSkVDVAorCisJZWNkc2EuYworCWVjZHNhX2FzbjEuYworCWVjZHNhX2Vycm9yLmMKKykKKworCithZGRfZXhlY3V0YWJsZSgKKwllY2RzYV90ZXN0CisKKwllY2RzYV90ZXN0LmMKKykKKwordGFyZ2V0X2xpbmtfbGlicmFyaWVzKGVjZHNhX3Rlc3QgY3J5cHRvKQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2VjZHNhL2VjZHNhLmMgYi9jcnlwdG8vZWNkc2EvZWNkc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmU5ZWY2Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2VjZHNhL2VjZHNhLmMKQEAgLTAsMCArMSw0NjUgQEAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2VjZHNhLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvdGhyZWFkLmg+CisKKyNpbmNsdWRlICIuLi9lYy9pbnRlcm5hbC5oIgorCisKK2ludCBFQ0RTQV9zaWduKGludCB0eXBlLCBjb25zdCB1aW50OF90ICpkaWdlc3QsIHNpemVfdCBkaWdlc3RfbGVuLCB1aW50OF90ICpzaWcsCisgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKnNpZ19sZW4sIEVDX0tFWSAqZWNrZXkpIHsKKyAgaWYgKGVja2V5LT5lY2RzYV9tZXRoICYmIGVja2V5LT5lY2RzYV9tZXRoLT5zaWduKSB7CisgICAgcmV0dXJuIGVja2V5LT5lY2RzYV9tZXRoLT5zaWduKGRpZ2VzdCwgZGlnZXN0X2xlbiwgc2lnLCBzaWdfbGVuLCBlY2tleSk7CisgIH0KKworICByZXR1cm4gRUNEU0Ffc2lnbl9leCh0eXBlLCBkaWdlc3QsIGRpZ2VzdF9sZW4sIHNpZywgc2lnX2xlbiwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgZWNrZXkpOworfQorCitpbnQgRUNEU0FfdmVyaWZ5KGludCB0eXBlLCBjb25zdCB1aW50OF90ICpkaWdlc3QsIHNpemVfdCBkaWdlc3RfbGVuLAorICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzaWcsIHNpemVfdCBzaWdfbGVuLCBFQ19LRVkgKmVja2V5KSB7CisgIEVDRFNBX1NJRyAqczsKKyAgaW50IHJldCA9IC0xOworCisgIGlmIChlY2tleS0+ZWNkc2FfbWV0aCAmJiBlY2tleS0+ZWNkc2FfbWV0aC0+dmVyaWZ5KSB7CisgICAgcmV0dXJuIGVja2V5LT5lY2RzYV9tZXRoLT52ZXJpZnkoZGlnZXN0LCBkaWdlc3RfbGVuLCBzaWcsIHNpZ19sZW4sIGVja2V5KTsKKyAgfQorCisgIHMgPSBFQ0RTQV9TSUdfbmV3KCk7CisgIGlmIChzID09IE5VTEwgfHwgZDJpX0VDRFNBX1NJRygmcywgJnNpZywgc2lnX2xlbikgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisgIHJldCA9IEVDRFNBX2RvX3ZlcmlmeShkaWdlc3QsIGRpZ2VzdF9sZW4sIHMsIGVja2V5KTsKKworZXJyOgorICBpZiAocyAhPSBOVUxMKSB7CisgICAgRUNEU0FfU0lHX2ZyZWUocyk7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworLyogZGlnZXN0X3RvX2JuIGludGVycHJldHMgfGRpZ2VzdF9sZW58IGJ5dGVzIGZyb20gfGRpZ2VzdHwgYXMgYSBiaWctZW5kaWFuCisgKiBudW1iZXIgYW5kIHNldHMgfG91dHwgdG8gdGhhdCB2YWx1ZS4gSXQgdGhlbiB0cnVuY2F0ZXMgfG91dHwgc28gdGhhdCBpdCdzLAorICogYXQgbW9zdCwgYXMgbG9uZyBhcyB8b3JkZXJ8LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG90aGVyd2lzZS4gKi8KK3N0YXRpYyBpbnQgZGlnZXN0X3RvX2JuKEJJR05VTSAqb3V0LCBjb25zdCB1aW50OF90ICpkaWdlc3QsIHNpemVfdCBkaWdlc3RfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQklHTlVNICpvcmRlcikgeworICBzaXplX3QgbnVtX2JpdHM7CisKKyAgbnVtX2JpdHMgPSBCTl9udW1fYml0cyhvcmRlcik7CisgIC8qIE5lZWQgdG8gdHJ1bmNhdGUgZGlnZXN0IGlmIGl0IGlzIHRvbyBsb25nOiBmaXJzdCB0cnVuY2F0ZSB3aG9sZQorICAgKiBieXRlcy4gKi8KKyAgaWYgKDggKiBkaWdlc3RfbGVuID4gbnVtX2JpdHMpIHsKKyAgICBkaWdlc3RfbGVuID0gKG51bV9iaXRzICsgNykgLyA4OworICB9CisgIGlmICghQk5fYmluMmJuKGRpZ2VzdCwgZGlnZXN0X2xlbiwgb3V0KSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBkaWdlc3RfdG9fYm4sIEVSUl9SX0JOX0xJQik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiBJZiBzdGlsbCB0b28gbG9uZyB0cnVuY2F0ZSByZW1haW5pbmcgYml0cyB3aXRoIGEgc2hpZnQgKi8KKyAgaWYgKCg4ICogZGlnZXN0X2xlbiA+IG51bV9iaXRzKSAmJgorICAgICAgIUJOX3JzaGlmdChvdXQsIG91dCwgOCAtIChudW1fYml0cyAmIDB4NykpKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIGRpZ2VzdF90b19ibiwgRVJSX1JfQk5fTElCKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiAxOworfQorCitFQ0RTQV9TSUcgKkVDRFNBX2RvX3NpZ24oY29uc3QgdWludDhfdCAqZGlnZXN0LCBzaXplX3QgZGlnZXN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFQ19LRVkgKmtleSkgeworICByZXR1cm4gRUNEU0FfZG9fc2lnbl9leChkaWdlc3QsIGRpZ2VzdF9sZW4sIE5VTEwsIE5VTEwsIGtleSk7Cit9CisKK2ludCBFQ0RTQV9kb192ZXJpZnkoY29uc3QgdWludDhfdCAqZGlnZXN0LCBzaXplX3QgZGlnZXN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRUNEU0FfU0lHICpzaWcsIEVDX0tFWSAqZWNrZXkpIHsKKyAgaW50IHJldCA9IC0xOworICBCTl9DVFggKmN0eDsKKyAgQklHTlVNICpvcmRlciwgKnUxLCAqdTIsICptLCAqWDsKKyAgRUNfUE9JTlQgKnBvaW50ID0gTlVMTDsKKyAgY29uc3QgRUNfR1JPVVAgKmdyb3VwOworICBjb25zdCBFQ19QT0lOVCAqcHViX2tleTsKKworICBpZiAoZWNrZXktPmVjZHNhX21ldGggJiYgZWNrZXktPmVjZHNhX21ldGgtPnZlcmlmeSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9zaWduX2V4LCBFQ0RTQV9SX05PVF9JTVBMRU1FTlRFRCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLyogY2hlY2sgaW5wdXQgdmFsdWVzICovCisgIGlmIChlY2tleSA9PSBOVUxMIHx8IChncm91cCA9IEVDX0tFWV9nZXQwX2dyb3VwKGVja2V5KSkgPT0gTlVMTCB8fAorICAgICAgKHB1Yl9rZXkgPSBFQ19LRVlfZ2V0MF9wdWJsaWNfa2V5KGVja2V5KSkgPT0gTlVMTCB8fCBzaWcgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9kb192ZXJpZnksIEVDRFNBX1JfTUlTU0lOR19QQVJBTUVURVJTKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBjdHggPSBCTl9DVFhfbmV3KCk7CisgIGlmICghY3R4KSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX2RvX3ZlcmlmeSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIHJldHVybiAtMTsKKyAgfQorICBCTl9DVFhfc3RhcnQoY3R4KTsKKyAgb3JkZXIgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIHUxID0gQk5fQ1RYX2dldChjdHgpOworICB1MiA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgbSA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgWCA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgaWYgKCFYKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX2RvX3ZlcmlmeSwgRVJSX1JfQk5fTElCKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmICghRUNfR1JPVVBfZ2V0X29yZGVyKGdyb3VwLCBvcmRlciwgY3R4KSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9kb192ZXJpZnksIEVSUl9SX0VDX0xJQik7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAoQk5faXNfemVybyhzaWctPnIpIHx8IEJOX2lzX25lZ2F0aXZlKHNpZy0+cikgfHwKKyAgICAgIEJOX3VjbXAoc2lnLT5yLCBvcmRlcikgPj0gMCB8fCBCTl9pc196ZXJvKHNpZy0+cykgfHwKKyAgICAgIEJOX2lzX25lZ2F0aXZlKHNpZy0+cykgfHwgQk5fdWNtcChzaWctPnMsIG9yZGVyKSA+PSAwKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX2RvX3ZlcmlmeSwgRUNEU0FfUl9CQURfU0lHTkFUVVJFKTsKKyAgICByZXQgPSAwOyAvKiBzaWduYXR1cmUgaXMgaW52YWxpZCAqLworICAgIGdvdG8gZXJyOworICB9CisgIC8qIGNhbGN1bGF0ZSB0bXAxID0gaW52KFMpIG1vZCBvcmRlciAqLworICBpZiAoIUJOX21vZF9pbnZlcnNlKHUyLCBzaWctPnMsIG9yZGVyLCBjdHgpKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX2RvX3ZlcmlmeSwgRVJSX1JfQk5fTElCKTsKKyAgICBnb3RvIGVycjsKKyAgfQorICBpZiAoIWRpZ2VzdF90b19ibihtLCBkaWdlc3QsIGRpZ2VzdF9sZW4sIG9yZGVyKSkgeworICAgIGdvdG8gZXJyOworICB9CisgIC8qIHUxID0gbSAqIHRtcCBtb2Qgb3JkZXIgKi8KKyAgaWYgKCFCTl9tb2RfbXVsKHUxLCBtLCB1Miwgb3JkZXIsIGN0eCkpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRUNEU0FfZG9fdmVyaWZ5LCBFUlJfUl9CTl9MSUIpOworICAgIGdvdG8gZXJyOworICB9CisgIC8qIHUyID0gciAqIHcgbW9kIHEgKi8KKyAgaWYgKCFCTl9tb2RfbXVsKHUyLCBzaWctPnIsIHUyLCBvcmRlciwgY3R4KSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9kb192ZXJpZnksIEVSUl9SX0JOX0xJQik7CisgICAgZ290byBlcnI7CisgIH0KKworICBwb2ludCA9IEVDX1BPSU5UX25ldyhncm91cCk7CisgIGlmIChwb2ludCA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX2RvX3ZlcmlmeSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIGdvdG8gZXJyOworICB9CisgIGlmICghRUNfUE9JTlRfbXVsKGdyb3VwLCBwb2ludCwgdTEsIHB1Yl9rZXksIHUyLCBjdHgpKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX2RvX3ZlcmlmeSwgRVJSX1JfRUNfTElCKTsKKyAgICBnb3RvIGVycjsKKyAgfQorICBpZiAoIUVDX1BPSU5UX2dldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwKGdyb3VwLCBwb2ludCwgWCwgTlVMTCwgY3R4KSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9kb192ZXJpZnksIEVSUl9SX0VDX0xJQik7CisgICAgZ290byBlcnI7CisgIH0KKyAgaWYgKCFCTl9ubm1vZCh1MSwgWCwgb3JkZXIsIGN0eCkpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRUNEU0FfZG9fdmVyaWZ5LCBFUlJfUl9CTl9MSUIpOworICAgIGdvdG8gZXJyOworICB9CisgIC8qIGlmIHRoZSBzaWduYXR1cmUgaXMgY29ycmVjdCB1MSBpcyBlcXVhbCB0byBzaWctPnIgKi8KKyAgcmV0ID0gKEJOX3VjbXAodTEsIHNpZy0+cikgPT0gMCk7CisKK2VycjoKKyAgQk5fQ1RYX2VuZChjdHgpOworICBCTl9DVFhfZnJlZShjdHgpOworICBpZiAocG9pbnQpIHsKKyAgICBFQ19QT0lOVF9mcmVlKHBvaW50KTsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitpbnQgRUNEU0Ffc2lnbl9zZXR1cChFQ19LRVkgKmVja2V5LCBCTl9DVFggKmN0eF9pbiwgQklHTlVNICoqa2ludnAsCisgICAgICAgICAgICAgICAgICAgICBCSUdOVU0gKipycCkgeworICBCTl9DVFggKmN0eCA9IE5VTEw7CisgIEJJR05VTSAqayA9IE5VTEwsICpyID0gTlVMTCwgKm9yZGVyID0gTlVMTCwgKlggPSBOVUxMOworICBFQ19QT0lOVCAqdG1wX3BvaW50ID0gTlVMTDsKKyAgY29uc3QgRUNfR1JPVVAgKmdyb3VwOworICBpbnQgcmV0ID0gMDsKKworICBpZiAoZWNrZXkgPT0gTlVMTCB8fCAoZ3JvdXAgPSBFQ19LRVlfZ2V0MF9ncm91cChlY2tleSkpID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRUNEU0Ffc2lnbl9zZXR1cCwgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChjdHhfaW4gPT0gTlVMTCkgeworICAgIGlmICgoY3R4ID0gQk5fQ1RYX25ldygpKSA9PSBOVUxMKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRUNEU0Ffc2lnbl9zZXR1cCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9IGVsc2UgeworICAgIGN0eCA9IGN0eF9pbjsKKyAgfQorCisgIGsgPSBCTl9uZXcoKTsgLyogdGhpcyB2YWx1ZSBpcyBsYXRlciByZXR1cm5lZCBpbiAqa2ludnAgKi8KKyAgciA9IEJOX25ldygpOyAvKiB0aGlzIHZhbHVlIGlzIGxhdGVyIHJldHVybmVkIGluICpycCAgICAqLworICBvcmRlciA9IEJOX25ldygpOworICBYID0gQk5fbmV3KCk7CisgIGlmICghayB8fCAhciB8fCAhb3JkZXIgfHwgIVgpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRUNEU0Ffc2lnbl9zZXR1cCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIGdvdG8gZXJyOworICB9CisgIHRtcF9wb2ludCA9IEVDX1BPSU5UX25ldyhncm91cCk7CisgIGlmICh0bXBfcG9pbnQgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9zaWduX3NldHVwLCBFUlJfUl9FQ19MSUIpOworICAgIGdvdG8gZXJyOworICB9CisgIGlmICghRUNfR1JPVVBfZ2V0X29yZGVyKGdyb3VwLCBvcmRlciwgY3R4KSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9zaWduX3NldHVwLCBFUlJfUl9FQ19MSUIpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgZG8geworICAgIC8qIGdldCByYW5kb20gayAqLworICAgIGRvIHsKKyAgICAgIGlmICghQk5fcmFuZF9yYW5nZShrLCBvcmRlcikpIHsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX3NpZ25fc2V0dXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEVDRFNBX1JfUkFORE9NX05VTUJFUl9HRU5FUkFUSU9OX0ZBSUxFRCk7CisgICAgICAgIGdvdG8gZXJyOworICAgICAgfQorICAgIH0gd2hpbGUgKEJOX2lzX3plcm8oaykpOworCisgICAgLyogV2UgZG8gbm90IHdhbnQgdGltaW5nIGluZm9ybWF0aW9uIHRvIGxlYWsgdGhlIGxlbmd0aCBvZiBrLAorICAgICAqIHNvIHdlIGNvbXB1dGUgRyprIHVzaW5nIGFuIGVxdWl2YWxlbnQgc2NhbGFyIG9mIGZpeGVkCisgICAgICogYml0LWxlbmd0aC4gKi8KKworICAgIGlmICghQk5fYWRkKGssIGssIG9yZGVyKSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICAgIGlmIChCTl9udW1fYml0cyhrKSA8PSBCTl9udW1fYml0cyhvcmRlcikpIHsKKyAgICAgIGlmICghQk5fYWRkKGssIGssIG9yZGVyKSkgeworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBjb21wdXRlIHIgdGhlIHgtY29vcmRpbmF0ZSBvZiBnZW5lcmF0b3IgKiBrICovCisgICAgaWYgKCFFQ19QT0lOVF9tdWwoZ3JvdXAsIHRtcF9wb2ludCwgaywgTlVMTCwgTlVMTCwgY3R4KSkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX3NpZ25fc2V0dXAsIEVSUl9SX0VDX0xJQik7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgaWYgKCFFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcChncm91cCwgdG1wX3BvaW50LCBYLCBOVUxMLCBjdHgpKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRUNEU0Ffc2lnbl9zZXR1cCwgRVJSX1JfRUNfTElCKTsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGlmICghQk5fbm5tb2QociwgWCwgb3JkZXIsIGN0eCkpIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9zaWduX3NldHVwLCBFUlJfUl9CTl9MSUIpOworICAgICAgZ290byBlcnI7CisgICAgfQorICB9IHdoaWxlIChCTl9pc196ZXJvKHIpKTsKKworICAvKiBjb21wdXRlIHRoZSBpbnZlcnNlIG9mIGsgKi8KKyAgaWYgKCFCTl9tb2RfaW52ZXJzZShrLCBrLCBvcmRlciwgY3R4KSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9zaWduX3NldHVwLCBFUlJfUl9CTl9MSUIpOworICAgIGdvdG8gZXJyOworICB9CisgIC8qIGNsZWFyIG9sZCB2YWx1ZXMgaWYgbmVjZXNzYXJ5ICovCisgIGlmICgqcnAgIT0gTlVMTCkgeworICAgIEJOX2NsZWFyX2ZyZWUoKnJwKTsKKyAgfQorICBpZiAoKmtpbnZwICE9IE5VTEwpIHsKKyAgICBCTl9jbGVhcl9mcmVlKCpraW52cCk7CisgIH0KKworICAvKiBzYXZlIHRoZSBwcmUtY29tcHV0ZWQgdmFsdWVzICAqLworICAqcnAgPSByOworICAqa2ludnAgPSBrOworICByZXQgPSAxOworCitlcnI6CisgIGlmICghcmV0KSB7CisgICAgaWYgKGsgIT0gTlVMTCkgeworICAgICAgQk5fY2xlYXJfZnJlZShrKTsKKyAgICB9CisgICAgaWYgKHIgIT0gTlVMTCkgeworICAgICAgQk5fY2xlYXJfZnJlZShyKTsKKyAgICB9CisgIH0KKyAgaWYgKGN0eF9pbiA9PSBOVUxMKQorICAgIEJOX0NUWF9mcmVlKGN0eCk7CisgIGlmIChvcmRlciAhPSBOVUxMKQorICAgIEJOX2ZyZWUob3JkZXIpOworICBpZiAodG1wX3BvaW50ICE9IE5VTEwpCisgICAgRUNfUE9JTlRfZnJlZSh0bXBfcG9pbnQpOworICBpZiAoWCkKKyAgICBCTl9jbGVhcl9mcmVlKFgpOworICByZXR1cm4gcmV0OworfQorCitFQ0RTQV9TSUcgKkVDRFNBX2RvX3NpZ25fZXgoY29uc3QgdWludDhfdCAqZGlnZXN0LCBzaXplX3QgZGlnZXN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCSUdOVU0gKmluX2tpbnYsIGNvbnN0IEJJR05VTSAqaW5fciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFQ19LRVkgKmVja2V5KSB7CisgIGludCBvayA9IDA7CisgIEJJR05VTSAqa2ludiA9IE5VTEwsICpzLCAqbSA9IE5VTEwsICp0bXAgPSBOVUxMLCAqb3JkZXIgPSBOVUxMOworICBjb25zdCBCSUdOVU0gKmNraW52OworICBCTl9DVFggKmN0eCA9IE5VTEw7CisgIGNvbnN0IEVDX0dST1VQICpncm91cDsKKyAgRUNEU0FfU0lHICpyZXQ7CisgIGNvbnN0IEJJR05VTSAqcHJpdl9rZXk7CisKKyAgaWYgKGVja2V5LT5lY2RzYV9tZXRoICYmIGVja2V5LT5lY2RzYV9tZXRoLT5zaWduKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX3NpZ25fZXgsIEVDRFNBX1JfTk9UX0lNUExFTUVOVEVEKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGdyb3VwID0gRUNfS0VZX2dldDBfZ3JvdXAoZWNrZXkpOworICBwcml2X2tleSA9IEVDX0tFWV9nZXQwX3ByaXZhdGVfa2V5KGVja2V5KTsKKworICBpZiAoZ3JvdXAgPT0gTlVMTCB8fCBwcml2X2tleSA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX2RvX3NpZ25fZXgsIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICByZXQgPSBFQ0RTQV9TSUdfbmV3KCk7CisgIGlmICghcmV0KSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX2RvX3NpZ25fZXgsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBzID0gcmV0LT5zOworCisgIGlmICgoY3R4ID0gQk5fQ1RYX25ldygpKSA9PSBOVUxMIHx8IChvcmRlciA9IEJOX25ldygpKSA9PSBOVUxMIHx8CisgICAgICAodG1wID0gQk5fbmV3KCkpID09IE5VTEwgfHwgKG0gPSBCTl9uZXcoKSkgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9kb19zaWduX2V4LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAoIUVDX0dST1VQX2dldF9vcmRlcihncm91cCwgb3JkZXIsIGN0eCkpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRUNEU0FfZG9fc2lnbl9leCwgRVJSX1JfRUNfTElCKTsKKyAgICBnb3RvIGVycjsKKyAgfQorICBpZiAoIWRpZ2VzdF90b19ibihtLCBkaWdlc3QsIGRpZ2VzdF9sZW4sIG9yZGVyKSkgeworICAgIGdvdG8gZXJyOworICB9CisgIGZvciAoOzspIHsKKyAgICBpZiAoaW5fa2ludiA9PSBOVUxMIHx8IGluX3IgPT0gTlVMTCkgeworICAgICAgaWYgKCFFQ0RTQV9zaWduX3NldHVwKGVja2V5LCBjdHgsICZraW52LCAmcmV0LT5yKSkgeworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRUNEU0FfZG9fc2lnbl9leCwgRVJSX1JfRUNEU0FfTElCKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgICBja2ludiA9IGtpbnY7CisgICAgfSBlbHNlIHsKKyAgICAgIGNraW52ID0gaW5fa2ludjsKKyAgICAgIGlmIChCTl9jb3B5KHJldC0+ciwgaW5fcikgPT0gTlVMTCkgeworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRUNEU0FfZG9fc2lnbl9leCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIUJOX21vZF9tdWwodG1wLCBwcml2X2tleSwgcmV0LT5yLCBvcmRlciwgY3R4KSkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX2RvX3NpZ25fZXgsIEVSUl9SX0JOX0xJQik7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgaWYgKCFCTl9tb2RfYWRkX3F1aWNrKHMsIHRtcCwgbSwgb3JkZXIpKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRUNEU0FfZG9fc2lnbl9leCwgRVJSX1JfQk5fTElCKTsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBpZiAoIUJOX21vZF9tdWwocywgcywgY2tpbnYsIG9yZGVyLCBjdHgpKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRUNEU0FfZG9fc2lnbl9leCwgRVJSX1JfQk5fTElCKTsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBpZiAoQk5faXNfemVybyhzKSkgeworICAgICAgLyogaWYga2ludiBhbmQgciBoYXZlIGJlZW4gc3VwcGxpZWQgYnkgdGhlIGNhbGxlcgorICAgICAgICogZG9uJ3QgdG8gZ2VuZXJhdGUgbmV3IGtpbnYgYW5kIHIgdmFsdWVzICovCisgICAgICBpZiAoaW5fa2ludiAhPSBOVUxMICYmIGluX3IgIT0gTlVMTCkgeworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRUNEU0FfZG9fc2lnbl9leCwgRUNEU0FfUl9ORUVEX05FV19TRVRVUF9WQUxVRVMpOworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogcyAhPSAwID0+IHdlIGhhdmUgYSB2YWxpZCBzaWduYXR1cmUgKi8KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIG9rID0gMTsKKworZXJyOgorICBpZiAoIW9rKSB7CisgICAgRUNEU0FfU0lHX2ZyZWUocmV0KTsKKyAgICByZXQgPSBOVUxMOworICB9CisgIGlmIChjdHgpCisgICAgQk5fQ1RYX2ZyZWUoY3R4KTsKKyAgaWYgKG0pCisgICAgQk5fY2xlYXJfZnJlZShtKTsKKyAgaWYgKHRtcCkKKyAgICBCTl9jbGVhcl9mcmVlKHRtcCk7CisgIGlmIChvcmRlcikKKyAgICBCTl9mcmVlKG9yZGVyKTsKKyAgaWYgKGtpbnYpCisgICAgQk5fY2xlYXJfZnJlZShraW52KTsKKyAgcmV0dXJuIHJldDsKK30KKworaW50IEVDRFNBX3NpZ25fZXgoaW50IHR5cGUsIGNvbnN0IHVpbnQ4X3QgKmRpZ2VzdCwgc2l6ZV90IGRpZ2VzdF9sZW4sCisgICAgICAgICAgICAgICAgICB1aW50OF90ICpzaWcsIHVuc2lnbmVkIGludCAqc2lnX2xlbiwgY29uc3QgQklHTlVNICpraW52LAorICAgICAgICAgICAgICAgICAgY29uc3QgQklHTlVNICpyLCBFQ19LRVkgKmVja2V5KSB7CisgIEVDRFNBX1NJRyAqcyA9IE5VTEw7CisKKyAgaWYgKGVja2V5LT5lY2RzYV9tZXRoICYmIGVja2V5LT5lY2RzYV9tZXRoLT5zaWduKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX3NpZ25fZXgsIEVDRFNBX1JfTk9UX0lNUExFTUVOVEVEKTsKKyAgICAqc2lnX2xlbiA9IDA7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBzID0gRUNEU0FfZG9fc2lnbl9leChkaWdlc3QsIGRpZ2VzdF9sZW4sIGtpbnYsIHIsIGVja2V5KTsKKyAgaWYgKHMgPT0gTlVMTCkgeworICAgICpzaWdfbGVuID0gMDsKKyAgICByZXR1cm4gMDsKKyAgfQorICAqc2lnX2xlbiA9IGkyZF9FQ0RTQV9TSUcocywgJnNpZyk7CisgIEVDRFNBX1NJR19mcmVlKHMpOworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2NyeXB0by9lY2RzYS9lY2RzYS5oIGIvY3J5cHRvL2VjZHNhL2VjZHNhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFkN2FkMgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9lY2RzYS9lY2RzYS5oCkBAIC0wLDAgKzEsMTg3IEBACisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDUgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisjaWZuZGVmIE9QRU5TU0xfSEVBREVSX0VDRFNBX0gKKyNkZWZpbmUgT1BFTlNTTF9IRUFERVJfRUNEU0FfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9iYXNlLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2VjX2tleS5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogRFNBIGNvbnRhaW5zIGZ1bmN0aW9ucyBmb3Igc2lnbmluZyBhbmQgdmVyaWZpbmcgd2l0aCB0aGUgRGlnaXRhbCBTaWduYXR1cmUKKyAqIEFsZ29yaXRobSBvdmVyIGVsbGlwdGljIGN1cnZlcy4gKi8KKworCisvKiBTaWduaW5nIGFuZCB2ZXJpZmluZy4gKi8KKworLyogRUNEU0Ffc2lnbiBzaWducyB8ZGlnZXN0X2xlbnwgYnl0ZXMgZnJvbSB8ZGlnZXN0fCB3aXRoIHxrZXl8IGFuZCB3cml0ZXMgdGhlCisgKiByZXN1bHRpbmcgc2lnbmF0dXJlIHRvIHxzaWd8LCB3aGljaCBtdXN0IGhhdmUgfEVDRFNBX3NpemUoa2V5KXwgYnl0ZXMgb2YKKyAqIHNwYWNlLiBPbiBzdWNjZXNzZnVsIGV4aXQsIHwqc2lnX2xlbnwgaXMgc2V0IHRvIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzCisgKiB3cml0dGVuLiBUaGUgfHR5cGV8IGFyZ3VtZW50IHNob3VsZCBiZSB6ZXJvLiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZAorICogemVybyBvdGhlcndpc2UuICovCitpbnQgRUNEU0Ffc2lnbihpbnQgdHlwZSwgY29uc3QgdWludDhfdCAqZGlnZXN0LCBzaXplX3QgZGlnZXN0X2xlbiwgdWludDhfdCAqc2lnLAorICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpzaWdfbGVuLCBFQ19LRVkgKmtleSk7CisKKy8qIEVDRFNBX3ZlcmlmeSB2ZXJpZmllcyB0aGF0IHxzaWdfbGVufCBieXRlcyBmcm9tIHxzaWd8IGNvbnN0aXR1dGUgYSB2YWxpZAorICogc2lnbmF0dXJlIGJ5IHxrZXl8IG9mIHxkaWdlc3R8LiAoVGhlIHx0eXBlfCBhcmd1bWVudCBzaG91bGQgYmUgemVyby4pIEl0CisgKiByZXR1cm5zIG9uZSBvbiBzdWNjZXNzLCB6ZXJvIGlmIHRoZSBzaWduYXR1cmUgaXMgaW52YWxpZCBhbmQgLTEgb24gZXJyb3IuCisgKgorICogREFOR0VSOiB0aGlzIGZ1bmN0aW9uIGRpZmZlcnMgZnJvbSB0aGUgdXN1YWwgT3BlblNTTCByZXR1cm4gdmFsdWUKKyAqIGNvbnZlbnRpb24uCisgKgorICogVE9ETyhmb3JrKTogY2hhbmdlIHRoaXMgdG8gcmV0dXJuIHRoZSB1c3VhbCAwLzEuICovCitpbnQgRUNEU0FfdmVyaWZ5KGludCB0eXBlLCBjb25zdCB1aW50OF90ICpkaWdlc3QsIHNpemVfdCBkaWdlc3RfbGVuLAorICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzaWcsIHNpemVfdCBzaWdfbGVuLCBFQ19LRVkgKmtleSk7CisKKy8qIEVDRFNBX3NpemUgcmV0dXJucyB0aGUgbWF4aW11bSBzaXplIG9mIGFuIEVDRFNBIHNpZ25hdHVyZSB1c2luZyB8a2V5fC4gSXQKKyAqIHJldHVybnMgemVybyBvbiBlcnJvci4gKi8KK3NpemVfdCBFQ0RTQV9zaXplKGNvbnN0IEVDX0tFWSAqa2V5KTsKKworCisvKiBMb3ctbGV2ZWwgc2lnbmluZyBhbmQgdmVyaWZpY2F0aW9uLgorICoKKyAqIExvdy1sZXZlbCBmdW5jdGlvbnMgaGFuZGxlIHNpZ25hdHVyZXMgYXMgfEVDRFNBX1NJR3wgc3RydWN0dXJlcyB3aGljaCBhbGxvdworICogdGhlIHR3byB2YWx1ZXMgaW4gYW4gRUNEU0Egc2lnbmF0dXJlIHRvIGJlIGhhbmRsZWQgc2VwYXJhdGVseS4gKi8KKworc3RydWN0IGVjZHNhX3NpZ19zdCB7CisgIEJJR05VTSAqcjsKKyAgQklHTlVNICpzOworfTsKKworLyogRUNEU0FfU0lHX25ldyByZXR1cm5zIGEgZnJlc2ggfEVDRFNBX1NJR3wgc3RydWN0dXJlIG9yIE5VTEwgb24gZXJyb3IuICovCitFQ0RTQV9TSUcgKkVDRFNBX1NJR19uZXcodm9pZCk7CisKKy8qIEVDRFNBX1NJR19mcmVlIGZyZWVzIHxzaWd8IGl0cyBtZW1iZXIgfEJJR05VTXxzLiAqLwordm9pZCBFQ0RTQV9TSUdfZnJlZShFQ0RTQV9TSUcgKnNpZyk7CisKKy8qIEVDRFNBX3NpZ24gc2lnbnMgfGRpZ2VzdF9sZW58IGJ5dGVzIGZyb20gfGRpZ2VzdHwgd2l0aCB8a2V5fCBhbmQgcmV0dXJucyB0aGUKKyAqIHJlc3VsdGluZyBzaWduYXR1cmUgc3RydWN0dXJlLCBvciBOVUxMIG9uIGVycm9yLgorICoKKyAqIFRPRE8oZm9yayk6IHJlbW92ZSB0aGlzIGZ1bmN0aW9uLiAqLworRUNEU0FfU0lHICpFQ0RTQV9kb19zaWduKGNvbnN0IHVpbnQ4X3QgKmRpZ2VzdCwgc2l6ZV90IGRpZ2VzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgRUNfS0VZICprZXkpOworCisvKiBFQ0RTQV92ZXJpZnkgdmVyaWZpZXMgdGhhdCB8c2lnfCBjb25zdGl0dXRlcyBhIHZhbGlkIHNpZ25hdHVyZSBieSB8a2V5fCBvZgorICogfGRpZ2VzdHwuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MsIHplcm8gaWYgdGhlIHNpZ25hdHVyZSBpcyBpbnZhbGlkIGFuZCAtMQorICogb24gZXJyb3IuCisgKgorICogREFOR0VSOiB0aGlzIGZ1bmN0aW9uIGRpZmZlcnMgZnJvbSB0aGUgdXN1YWwgT3BlblNTTCByZXR1cm4gdmFsdWUKKyAqIGNvbnZlbnRpb24uCisgKgorICogVE9ETyhmb3JrKTogcmVtb3ZlIHRoaXMgZnVuY3Rpb24uICovCitpbnQgRUNEU0FfZG9fdmVyaWZ5KGNvbnN0IHVpbnQ4X3QgKmRpZ2VzdCwgc2l6ZV90IGRpZ2VzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVDRFNBX1NJRyAqc2lnLCBFQ19LRVkgKmtleSk7CisKKworLyogU2lnbmluZyB3aXRoIHByZWNvbXB1dGF0aW9uLgorICoKKyAqIFBhcnRzIG9mIHRoZSBFQ0RTQSBzaWduYXR1cmUgY2FuIGJlIGluZGVwZW5kZW50IG9mIHRoZSBtZXNzYWdlIHRvIGJlIHNpZ25lZAorICogdGh1cyBpdCdzIHBvc3NpYmxlIHRvIHByZWNvbXB1dGUgdGhlbSBhbmQgcmVkdWNlIHRoZSBzaWduaW5nIGxhdGVuY3kuCisgKgorICogVE9ETyhmb3JrKTogcmVtb3ZlIHN1cHBvcnQgZm9yIHRoaXMgYXMgaXQgY2Fubm90IHN1cHBvcnQgc2FmZS1yYW5kb21uZXNzLiAqLworCisvKiBFQ0RTQV9zaWduX3NldHVwIHByZWNvbXB1dGVzIHBhcnRzIG9mIGFuIEVDRFNBIHNpZ25pbmcgb3BlcmF0aW9uLiBJdCBzZXRzCisgKiB8KmtpbnZ8IGFuZCB8KnJwfCB0byB0aGUgcHJlY29tcHV0ZWQgdmFsdWVzIGFuZCB1c2VzIHRoZSB8Y3R4fCBhcmd1bWVudCwgaWYKKyAqIG5vdCBOVUxMLiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG90aGVyd2lzZS4gKi8KK2ludCBFQ0RTQV9zaWduX3NldHVwKEVDX0tFWSAqZWNrZXksIEJOX0NUWCAqY3R4LCBCSUdOVU0gKipraW52LCBCSUdOVU0gKipycCk7CisKKy8qIEVDRFNBX2RvX3NpZ25fZXggaXMgdGhlIHNhbWUgYXMgfEVDRFNBX2RvX3NpZ258IGJ1dCB0YWtlcyBwcmVjb21wdXRlZCB2YWx1ZXMKKyAqIGFzIGdlbmVyYXRlZCBieSB8RUNEU0Ffc2lnbl9zZXR1cHwuICovCitFQ0RTQV9TSUcgKkVDRFNBX2RvX3NpZ25fZXgoY29uc3QgdWludDhfdCAqZGlnZXN0LCBzaXplX3QgZGlnZXN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCSUdOVU0gKmtpbnYsIGNvbnN0IEJJR05VTSAqcnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUNfS0VZICplY2tleSk7CisKKy8qIEVDRFNBX3NpZ25fZXggaXMgdGhlIHNhbWUgYXMgfEVDRFNBX3NpZ258IGJ1dCB0YWtlcyBwcmVjb21wdXRlZCB2YWx1ZXMgYXMKKyAqIGdlbmVyYXRlZCBieSB8RUNEU0Ffc2lnbl9zZXR1cHwuICovCitpbnQgRUNEU0Ffc2lnbl9leChpbnQgdHlwZSwgY29uc3QgdWludDhfdCAqZGlnZXN0LCBzaXplX3QgZGlnZXN0X2xlbiwKKyAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNpZywgdW5zaWduZWQgaW50ICpzaWdfbGVuLCBjb25zdCBCSUdOVU0gKmtpbnYsCisgICAgICAgICAgICAgICAgICBjb25zdCBCSUdOVU0gKnJwLCBFQ19LRVkgKmVja2V5KTsKKworCisvKiBBU04uMSBmdW5jdGlvbnMuICovCisKKy8qIGQyaV9FQ0RTQV9TSUcgcGFyc2VzIGFuIEFTTi4xLCBERVItZW5jb2RlZCwgc2lnbmF0dXJlIGZyb20gfGxlbnwgYnl0ZXMgYXQKKyAqIHwqaW5wfC4gSWYgfG91dHwgaXMgbm90IE5VTEwgdGhlbiwgb24gZXhpdCwgYSBwb2ludGVyIHRvIHRoZSByZXN1bHQgaXMgaW4KKyAqIHwqb3V0fC4gSWYgfCpvdXR8IGlzIGFscmVhZHkgbm9uLU5VTEwgb24gZW50cnkgdGhlbiB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4KKyAqIGRpcmVjdGx5IGludG8gfCpvdXR8LCBvdGhlcndpc2UgYSBmcmVzaCB8RUNEU0FfU0lHfCBpcyBhbGxvY2F0ZWQuIE9uCisgKiBzdWNjZXNzZnVsIGV4aXQsIHwqaW5wfCBpcyBhZHZhbmNlZCBwYXN0IHRoZSBERVIgc3RydWN0dXJlLiBJdCByZXR1cm5zIHRoZQorICogcmVzdWx0IG9yIE5VTEwgb24gZXJyb3IuICovCitFQ0RTQV9TSUcgKmQyaV9FQ0RTQV9TSUcoRUNEU0FfU0lHICoqb3V0LCBjb25zdCB1aW50OF90ICoqaW5wLCBsb25nIGxlbik7CisKKy8qIGkyZF9FQ0RTQV9TSUcgbWFyc2hhbHMgYSBzaWduYXR1cmUgZnJvbSB8c2lnfCB0byBhbiBBU04uMSwgREVSCisgKiBzdHJ1Y3R1cmUuIElmIHxvdXRwfCBpcyBub3QgTlVMTCB0aGVuIHRoZSByZXN1bHQgaXMgd3JpdHRlbiB0byB8Km91dHB8IGFuZAorICogfCpvdXRwfCBpcyBhZHZhbmNlZCBqdXN0IHBhc3QgdGhlIG91dHB1dC4gSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluCisgKiB0aGUgcmVzdWx0LCB3aGV0aGVyIHdyaXR0ZW4gb3Igbm90LCBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yLiAqLworaW50IGkyZF9FQ0RTQV9TSUcoY29uc3QgRUNEU0FfU0lHICpzaWcsIHVpbnQ4X3QgKipvdXRwKTsKKworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30gIC8qIGV4dGVybiBDICovCisjZW5kaWYKKworI2RlZmluZSBFQ0RTQV9GX2RpZ2VzdF90b19ibiAxMDAKKyNkZWZpbmUgRUNEU0FfRl9FQ0RTQV9kb192ZXJpZnkgMTAxCisjZGVmaW5lIEVDRFNBX0ZfRUNEU0Ffc2lnbl9zZXR1cCAxMDIKKyNkZWZpbmUgRUNEU0FfRl9FQ0RTQV9kb19zaWduX2V4IDEwMworI2RlZmluZSBFQ0RTQV9GX0VDRFNBX3NpZ25fZXggMTA0CisjZGVmaW5lIEVDRFNBX1JfUkFORE9NX05VTUJFUl9HRU5FUkFUSU9OX0ZBSUxFRCAxMDAKKyNkZWZpbmUgRUNEU0FfUl9ORUVEX05FV19TRVRVUF9WQUxVRVMgMTAxCisjZGVmaW5lIEVDRFNBX1JfTUlTU0lOR19QQVJBTUVURVJTIDEwMgorI2RlZmluZSBFQ0RTQV9SX0JBRF9TSUdOQVRVUkUgMTAzCisjZGVmaW5lIEVDRFNBX1JfTk9UX0lNUExFTUVOVEVEIDEwNAorCisjZW5kaWYgIC8qIE9QRU5TU0xfSEVBREVSX0VDRFNBX0ggKi8KZGlmZiAtLWdpdCBhL2NyeXB0by9lY2RzYS9lY2RzYV9hc24xLmMgYi9jcnlwdG8vZWNkc2EvZWNkc2FfYXNuMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNjgzNjEKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vZWNkc2EvZWNkc2FfYXNuMS5jCkBAIC0wLDAgKzEsMTExIEBACisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDUgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9lY2RzYS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZWNfa2V5Lmg+CisKKyNpbmNsdWRlICIuLi9lYy9pbnRlcm5hbC5oIgorCisKK0FTTjFfU0VRVUVOQ0UoRUNEU0FfU0lHKSA9IHsKKyAgICBBU04xX1NJTVBMRShFQ0RTQV9TSUcsIHIsIENCSUdOVU0pLAorICAgIEFTTjFfU0lNUExFKEVDRFNBX1NJRywgcywgQ0JJR05VTSksCit9IEFTTjFfU0VRVUVOQ0VfRU5EKEVDRFNBX1NJRyk7CisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlNfY29uc3QoRUNEU0FfU0lHKTsKK0RFQ0xBUkVfQVNOMV9FTkNPREVfRlVOQ1RJT05TX2NvbnN0KEVDRFNBX1NJRywgRUNEU0FfU0lHKTsKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OU19jb25zdChFQ0RTQV9TSUcpOworCitzaXplX3QgRUNEU0Ffc2l6ZShjb25zdCBFQ19LRVkgKmtleSkgeworICBzaXplX3QgcmV0LCBpOworICBBU04xX0lOVEVHRVIgYnM7CisgIEJJR05VTSAqb3JkZXIgPSBOVUxMOworICB1bnNpZ25lZCBjaGFyIGJ1Zls0XTsKKyAgY29uc3QgRUNfR1JPVVAgKmdyb3VwOworCisgIGlmIChrZXktPmVjZHNhX21ldGggJiYga2V5LT5lY2RzYV9tZXRoLT5zaXplKSB7CisgICAgcmV0dXJuIGtleS0+ZWNkc2FfbWV0aC0+c2l6ZShrZXkpOworICB9CisKKyAgaWYgKGtleSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZ3JvdXAgPSBFQ19LRVlfZ2V0MF9ncm91cChrZXkpOworICBpZiAoZ3JvdXAgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgb3JkZXIgPSBCTl9uZXcoKTsKKyAgaWYgKG9yZGVyID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoIUVDX0dST1VQX2dldF9vcmRlcihncm91cCwgb3JkZXIsIE5VTEwpKSB7CisgICAgQk5fY2xlYXJfZnJlZShvcmRlcik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpID0gQk5fbnVtX2JpdHMob3JkZXIpOworICBicy5sZW5ndGggPSAoaSArIDcpIC8gODsKKyAgYnMuZGF0YSA9IGJ1ZjsKKyAgYnMudHlwZSA9IFZfQVNOMV9JTlRFR0VSOworICAvKiBJZiB0aGUgdG9wIGJpdCBpcyBzZXQgdGhlIEFTTi4xIGVuY29kaW5nIGlzIDEgbGFyZ2VyLiAqLworICBidWZbMF0gPSAweGZmOworCisgIGkgPSBpMmRfQVNOMV9JTlRFR0VSKCZicywgTlVMTCk7CisgIGkgKz0gaTsgLyogciBhbmQgcyAqLworICByZXQgPSBBU04xX29iamVjdF9zaXplKDEsIGksIFZfQVNOMV9TRVFVRU5DRSk7CisgIEJOX2NsZWFyX2ZyZWUob3JkZXIpOworICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2VjZHNhL2VjZHNhX2Vycm9yLmMgYi9jcnlwdG8vZWNkc2EvZWNkc2FfZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGU1MDhhCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2VjZHNhL2VjZHNhX2Vycm9yLmMKQEAgLTAsMCArMSwzMSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE0LCBHb29nbGUgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQorICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLiAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKworI2luY2x1ZGUgImVjZHNhLmgiCisKK2NvbnN0IEVSUl9TVFJJTkdfREFUQSBFQ0RTQV9lcnJvcl9zdHJpbmdfZGF0YVtdID0geworICB7RVJSX1BBQ0soRVJSX0xJQl9FQ0RTQSwgRUNEU0FfRl9FQ0RTQV9kb19zaWduX2V4LCAwKSwgIkVDRFNBX2RvX3NpZ25fZXgifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRUNEU0EsIEVDRFNBX0ZfRUNEU0FfZG9fdmVyaWZ5LCAwKSwgIkVDRFNBX2RvX3ZlcmlmeSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQ0RTQSwgRUNEU0FfRl9FQ0RTQV9zaWduX2V4LCAwKSwgIkVDRFNBX3NpZ25fZXgifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRUNEU0EsIEVDRFNBX0ZfRUNEU0Ffc2lnbl9zZXR1cCwgMCksICJFQ0RTQV9zaWduX3NldHVwIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDRFNBLCBFQ0RTQV9GX2RpZ2VzdF90b19ibiwgMCksICJkaWdlc3RfdG9fYm4ifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRUNEU0EsIDAsIEVDRFNBX1JfQkFEX1NJR05BVFVSRSksICJCQURfU0lHTkFUVVJFIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDRFNBLCAwLCBFQ0RTQV9SX01JU1NJTkdfUEFSQU1FVEVSUyksICJNSVNTSU5HX1BBUkFNRVRFUlMifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRUNEU0EsIDAsIEVDRFNBX1JfTkVFRF9ORVdfU0VUVVBfVkFMVUVTKSwgIk5FRURfTkVXX1NFVFVQX1ZBTFVFUyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FQ0RTQSwgMCwgRUNEU0FfUl9OT1RfSU1QTEVNRU5URUQpLCAiTk9UX0lNUExFTUVOVEVEIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VDRFNBLCAwLCBFQ0RTQV9SX1JBTkRPTV9OVU1CRVJfR0VORVJBVElPTl9GQUlMRUQpLCAiUkFORE9NX05VTUJFUl9HRU5FUkFUSU9OX0ZBSUxFRCJ9LAorICB7MCwgTlVMTH0sCit9OwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2VjZHNhL2VjZHNhX3Rlc3QuYyBiL2NyeXB0by9lY2RzYS9lY2RzYV90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ0ODBlMwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9lY2RzYS9lY2RzYV90ZXN0LmMKQEAgLTAsMCArMSwzMDkgQEAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2VjZHNhLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2VjLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisKKworaW50IHRlc3RfYnVpbHRpbihCSU8gKm91dCkgeworICBzaXplX3QgbiA9IDA7CisgIEVDX0tFWSAqZWNrZXkgPSBOVUxMLCAqd3JvbmdfZWNrZXkgPSBOVUxMOworICBFQ19HUk9VUCAqZ3JvdXA7CisgIEVDRFNBX1NJRyAqZWNkc2Ffc2lnID0gTlVMTDsKKyAgdW5zaWduZWQgY2hhciBkaWdlc3RbMjBdLCB3cm9uZ19kaWdlc3RbMjBdOworICB1bnNpZ25lZCBjaGFyICpzaWduYXR1cmUgPSBOVUxMOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpzaWdfcHRyOworICB1bnNpZ25lZCBjaGFyICpzaWdfcHRyMjsKKyAgdW5zaWduZWQgY2hhciAqcmF3X2J1ZiA9IE5VTEw7CisgIHVuc2lnbmVkIGludCBzaWdfbGVuLCBkZWdyZWUsIHJfbGVuLCBzX2xlbiwgYm5fbGVuLCBidWZfbGVuOworICBpbnQgbmlkLCByZXQgPSAwOworCisgIC8qIGZpbGwgZGlnZXN0IHZhbHVlcyB3aXRoIHNvbWUgcmFuZG9tIGRhdGEgKi8KKyAgaWYgKCFSQU5EX3BzZXVkb19ieXRlcyhkaWdlc3QsIDIwKSB8fCAhUkFORF9wc2V1ZG9fYnl0ZXMod3JvbmdfZGlnZXN0LCAyMCkpIHsKKyAgICBCSU9fcHJpbnRmKG91dCwgIkVSUk9SOiB1bmFibGUgdG8gZ2V0IHJhbmRvbSBkYXRhXG4iKTsKKyAgICBnb3RvIGJ1aWx0aW5fZXJyOworICB9CisKKyAgLyogY3JlYXRlIGFuZCB2ZXJpZnkgYSBlY2RzYSBzaWduYXR1cmUgd2l0aCBldmVyeSBhdmFpbGJsZSBjdXJ2ZQorICAgKiAod2l0aCApICovCisgIEJJT19wcmludGYob3V0LAorICAgICAgICAgICAgICJcbnRlc3RpbmcgRUNEU0Ffc2lnbigpIGFuZCBFQ0RTQV92ZXJpZnkoKSAiCisgICAgICAgICAgICAgIndpdGggc29tZSBpbnRlcm5hbCBjdXJ2ZXM6XG4iKTsKKworICBzdGF0aWMgY29uc3QgaW50IGtDdXJ2ZU5JRHNbXSA9IHtOSURfc2VjcDIyNHIxLCBOSURfWDlfNjJfcHJpbWUyNTZ2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTklEX3NlY3AzODRyMSwgTklEX3NlY3A1MjFyMSwgTklEX3VuZGVmfTsKKworICAvKiBub3cgY3JlYXRlIGFuZCB2ZXJpZnkgYSBzaWduYXR1cmUgZm9yIGV2ZXJ5IGN1cnZlICovCisgIGZvciAobiA9IDA7IGtDdXJ2ZU5JRHNbbl0gIT0gTklEX3VuZGVmOyBuKyspIHsKKyAgICB1bnNpZ25lZCBjaGFyIGRpcnQsIG9mZnNldDsKKworICAgIG5pZCA9IGtDdXJ2ZU5JRHNbbl07CisgICAgLyogY3JlYXRlIG5ldyBlY2RzYSBrZXkgKD09IEVDX0tFWSkgKi8KKyAgICBlY2tleSA9IEVDX0tFWV9uZXcoKTsKKyAgICBpZiAoZWNrZXkgPT0gTlVMTCkgeworICAgICAgZ290byBidWlsdGluX2VycjsKKyAgICB9CisgICAgZ3JvdXAgPSBFQ19HUk9VUF9uZXdfYnlfY3VydmVfbmFtZShuaWQpOworICAgIGlmIChncm91cCA9PSBOVUxMKSB7CisgICAgICBnb3RvIGJ1aWx0aW5fZXJyOworICAgIH0KKyAgICBpZiAoIUVDX0tFWV9zZXRfZ3JvdXAoZWNrZXksIGdyb3VwKSkgeworICAgICAgZ290byBidWlsdGluX2VycjsKKyAgICB9CisgICAgRUNfR1JPVVBfZnJlZShncm91cCk7CisgICAgZGVncmVlID0gRUNfR1JPVVBfZ2V0X2RlZ3JlZShFQ19LRVlfZ2V0MF9ncm91cChlY2tleSkpOworICAgIGlmIChkZWdyZWUgPCAxNjApIHsKKyAgICAgIC8qIFRvbyBzbWFsbCB0byB0ZXN0LiAqLworICAgICAgRUNfS0VZX2ZyZWUoZWNrZXkpOworICAgICAgZWNrZXkgPSBOVUxMOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgQklPX3ByaW50ZihvdXQsICIlczogIiwgT0JKX25pZDJzbihuaWQpKTsKKyAgICAvKiBjcmVhdGUga2V5ICovCisgICAgaWYgKCFFQ19LRVlfZ2VuZXJhdGVfa2V5KGVja2V5KSkgeworICAgICAgQklPX3ByaW50ZihvdXQsICIgZmFpbGVkXG4iKTsKKyAgICAgIGdvdG8gYnVpbHRpbl9lcnI7CisgICAgfQorICAgIC8qIGNyZWF0ZSBzZWNvbmQga2V5ICovCisgICAgd3JvbmdfZWNrZXkgPSBFQ19LRVlfbmV3KCk7CisgICAgaWYgKHdyb25nX2Vja2V5ID09IE5VTEwpIHsKKyAgICAgIGdvdG8gYnVpbHRpbl9lcnI7CisgICAgfQorICAgIGdyb3VwID0gRUNfR1JPVVBfbmV3X2J5X2N1cnZlX25hbWUobmlkKTsKKyAgICBpZiAoZ3JvdXAgPT0gTlVMTCkgeworICAgICAgZ290byBidWlsdGluX2VycjsKKyAgICB9CisgICAgaWYgKEVDX0tFWV9zZXRfZ3JvdXAod3JvbmdfZWNrZXksIGdyb3VwKSA9PSAwKSB7CisgICAgICBnb3RvIGJ1aWx0aW5fZXJyOworICAgIH0KKyAgICBFQ19HUk9VUF9mcmVlKGdyb3VwKTsKKyAgICBpZiAoIUVDX0tFWV9nZW5lcmF0ZV9rZXkod3JvbmdfZWNrZXkpKSB7CisgICAgICBCSU9fcHJpbnRmKG91dCwgIiBmYWlsZWRcbiIpOworICAgICAgZ290byBidWlsdGluX2VycjsKKyAgICB9CisKKyAgICBCSU9fcHJpbnRmKG91dCwgIi4iKTsKKyAgICAodm9pZClCSU9fZmx1c2gob3V0KTsKKyAgICAvKiBjaGVjayBrZXkgKi8KKyAgICBpZiAoIUVDX0tFWV9jaGVja19rZXkoZWNrZXkpKSB7CisgICAgICBCSU9fcHJpbnRmKG91dCwgIiBmYWlsZWRcbiIpOworICAgICAgZ290byBidWlsdGluX2VycjsKKyAgICB9CisgICAgQklPX3ByaW50ZihvdXQsICIuIik7CisgICAgKHZvaWQpQklPX2ZsdXNoKG91dCk7CisgICAgLyogY3JlYXRlIHNpZ25hdHVyZSAqLworICAgIHNpZ19sZW4gPSBFQ0RTQV9zaXplKGVja2V5KTsKKyAgICBzaWduYXR1cmUgPSBPUEVOU1NMX21hbGxvYyhzaWdfbGVuKTsKKyAgICBpZiAoc2lnbmF0dXJlID09IE5VTEwpIHsKKyAgICAgIGdvdG8gYnVpbHRpbl9lcnI7CisgICAgfQorICAgIGlmICghRUNEU0Ffc2lnbigwLCBkaWdlc3QsIDIwLCBzaWduYXR1cmUsICZzaWdfbGVuLCBlY2tleSkpIHsKKyAgICAgIEJJT19wcmludGYob3V0LCAiIGZhaWxlZFxuIik7CisgICAgICBnb3RvIGJ1aWx0aW5fZXJyOworICAgIH0KKyAgICBCSU9fcHJpbnRmKG91dCwgIi4iKTsKKyAgICAodm9pZClCSU9fZmx1c2gob3V0KTsKKyAgICAvKiB2ZXJpZnkgc2lnbmF0dXJlICovCisgICAgaWYgKEVDRFNBX3ZlcmlmeSgwLCBkaWdlc3QsIDIwLCBzaWduYXR1cmUsIHNpZ19sZW4sIGVja2V5KSAhPSAxKSB7CisgICAgICBCSU9fcHJpbnRmKG91dCwgIiBmYWlsZWRcbiIpOworICAgICAgZ290byBidWlsdGluX2VycjsKKyAgICB9CisgICAgQklPX3ByaW50ZihvdXQsICIuIik7CisgICAgKHZvaWQpQklPX2ZsdXNoKG91dCk7CisgICAgLyogdmVyaWZ5IHNpZ25hdHVyZSB3aXRoIHRoZSB3cm9uZyBrZXkgKi8KKyAgICBpZiAoRUNEU0FfdmVyaWZ5KDAsIGRpZ2VzdCwgMjAsIHNpZ25hdHVyZSwgc2lnX2xlbiwgd3JvbmdfZWNrZXkpID09IDEpIHsKKyAgICAgIEJJT19wcmludGYob3V0LCAiIGZhaWxlZFxuIik7CisgICAgICBnb3RvIGJ1aWx0aW5fZXJyOworICAgIH0KKyAgICBCSU9fcHJpbnRmKG91dCwgIi4iKTsKKyAgICAodm9pZClCSU9fZmx1c2gob3V0KTsKKyAgICAvKiB3cm9uZyBkaWdlc3QgKi8KKyAgICBpZiAoRUNEU0FfdmVyaWZ5KDAsIHdyb25nX2RpZ2VzdCwgMjAsIHNpZ25hdHVyZSwgc2lnX2xlbiwgZWNrZXkpID09IDEpIHsKKyAgICAgIEJJT19wcmludGYob3V0LCAiIGZhaWxlZFxuIik7CisgICAgICBnb3RvIGJ1aWx0aW5fZXJyOworICAgIH0KKyAgICBCSU9fcHJpbnRmKG91dCwgIi4iKTsKKyAgICAodm9pZClCSU9fZmx1c2gob3V0KTsKKyAgICAvKiB3cm9uZyBsZW5ndGggKi8KKyAgICBpZiAoRUNEU0FfdmVyaWZ5KDAsIGRpZ2VzdCwgMjAsIHNpZ25hdHVyZSwgc2lnX2xlbiAtIDEsIGVja2V5KSA9PSAxKSB7CisgICAgICBCSU9fcHJpbnRmKG91dCwgIiBmYWlsZWRcbiIpOworICAgICAgZ290byBidWlsdGluX2VycjsKKyAgICB9CisgICAgQklPX3ByaW50ZihvdXQsICIuIik7CisgICAgKHZvaWQpQklPX2ZsdXNoKG91dCk7CisKKyAgICAvKiBNb2RpZnkgYSBzaW5nbGUgYnl0ZSBvZiB0aGUgc2lnbmF0dXJlOiB0byBlbnN1cmUgd2UgZG9uJ3QKKyAgICAgKiBnYXJibGUgdGhlIEFTTjEgc3RydWN0dXJlLCB3ZSByZWFkIHRoZSByYXcgc2lnbmF0dXJlIGFuZAorICAgICAqIG1vZGlmeSBhIGJ5dGUgaW4gb25lIG9mIHRoZSBiaWdudW1zIGRpcmVjdGx5LiAqLworICAgIHNpZ19wdHIgPSBzaWduYXR1cmU7CisgICAgZWNkc2Ffc2lnID0gZDJpX0VDRFNBX1NJRyhOVUxMLCAmc2lnX3B0ciwgc2lnX2xlbik7CisgICAgaWYgKGVjZHNhX3NpZyA9PSBOVUxMKSB7CisgICAgICBCSU9fcHJpbnRmKG91dCwgIiBmYWlsZWRcbiIpOworICAgICAgZ290byBidWlsdGluX2VycjsKKyAgICB9CisKKyAgICAvKiBTdG9yZSB0aGUgdHdvIEJJR05VTXMgaW4gcmF3X2J1Zi4gKi8KKyAgICByX2xlbiA9IEJOX251bV9ieXRlcyhlY2RzYV9zaWctPnIpOworICAgIHNfbGVuID0gQk5fbnVtX2J5dGVzKGVjZHNhX3NpZy0+cyk7CisgICAgYm5fbGVuID0gKGRlZ3JlZSArIDcpIC8gODsKKyAgICBpZiAocl9sZW4gPiBibl9sZW4gfHwgc19sZW4gPiBibl9sZW4pIHsKKyAgICAgIEJJT19wcmludGYob3V0LCAiIGZhaWxlZFxuIik7CisgICAgICBnb3RvIGJ1aWx0aW5fZXJyOworICAgIH0KKyAgICBidWZfbGVuID0gMiAqIGJuX2xlbjsKKyAgICByYXdfYnVmID0gT1BFTlNTTF9tYWxsb2MoYnVmX2xlbik7CisgICAgaWYgKHJhd19idWYgPT0gTlVMTCkgeworICAgICAgZ290byBidWlsdGluX2VycjsKKyAgICB9CisgICAgLyogUGFkIHRoZSBiaWdudW1zIHdpdGggbGVhZGluZyB6ZXJvZXMuICovCisgICAgbWVtc2V0KHJhd19idWYsIDAsIGJ1Zl9sZW4pOworICAgIEJOX2JuMmJpbihlY2RzYV9zaWctPnIsIHJhd19idWYgKyBibl9sZW4gLSByX2xlbik7CisgICAgQk5fYm4yYmluKGVjZHNhX3NpZy0+cywgcmF3X2J1ZiArIGJ1Zl9sZW4gLSBzX2xlbik7CisKKyAgICAvKiBNb2RpZnkgYSBzaW5nbGUgYnl0ZSBpbiB0aGUgYnVmZmVyLiAqLworICAgIG9mZnNldCA9IHJhd19idWZbMTBdICUgYnVmX2xlbjsKKyAgICBkaXJ0ID0gcmF3X2J1ZlsxMV0gPyByYXdfYnVmWzExXSA6IDE7CisgICAgcmF3X2J1ZltvZmZzZXRdIF49IGRpcnQ7CisgICAgLyogTm93IHJlYWQgdGhlIEJJR05VTXMgYmFjayBpbiBmcm9tIHJhd19idWYuICovCisgICAgaWYgKEJOX2JpbjJibihyYXdfYnVmLCBibl9sZW4sIGVjZHNhX3NpZy0+cikgPT0gTlVMTCB8fAorICAgICAgICBCTl9iaW4yYm4ocmF3X2J1ZiArIGJuX2xlbiwgYm5fbGVuLCBlY2RzYV9zaWctPnMpID09IE5VTEwpIHsKKyAgICAgIGdvdG8gYnVpbHRpbl9lcnI7CisgICAgfQorCisgICAgc2lnX3B0cjIgPSBzaWduYXR1cmU7CisgICAgc2lnX2xlbiA9IGkyZF9FQ0RTQV9TSUcoZWNkc2Ffc2lnLCAmc2lnX3B0cjIpOworICAgIGlmIChFQ0RTQV92ZXJpZnkoMCwgZGlnZXN0LCAyMCwgc2lnbmF0dXJlLCBzaWdfbGVuLCBlY2tleSkgPT0gMSkgeworICAgICAgQklPX3ByaW50ZihvdXQsICIgZmFpbGVkXG4iKTsKKyAgICAgIGdvdG8gYnVpbHRpbl9lcnI7CisgICAgfQorICAgIC8qIFNhbml0eSBjaGVjazogdW5kbyB0aGUgbW9kaWZpY2F0aW9uIGFuZCB2ZXJpZnkgc2lnbmF0dXJlLiAqLworICAgIHJhd19idWZbb2Zmc2V0XSBePSBkaXJ0OworICAgIGlmIChCTl9iaW4yYm4ocmF3X2J1ZiwgYm5fbGVuLCBlY2RzYV9zaWctPnIpID09IE5VTEwgfHwKKyAgICAgICAgQk5fYmluMmJuKHJhd19idWYgKyBibl9sZW4sIGJuX2xlbiwgZWNkc2Ffc2lnLT5zKSA9PSBOVUxMKSB7CisgICAgICBnb3RvIGJ1aWx0aW5fZXJyOworICAgIH0KKworICAgIHNpZ19wdHIyID0gc2lnbmF0dXJlOworICAgIHNpZ19sZW4gPSBpMmRfRUNEU0FfU0lHKGVjZHNhX3NpZywgJnNpZ19wdHIyKTsKKyAgICBpZiAoRUNEU0FfdmVyaWZ5KDAsIGRpZ2VzdCwgMjAsIHNpZ25hdHVyZSwgc2lnX2xlbiwgZWNrZXkpICE9IDEpIHsKKyAgICAgIEJJT19wcmludGYob3V0LCAiIGZhaWxlZFxuIik7CisgICAgICBnb3RvIGJ1aWx0aW5fZXJyOworICAgIH0KKyAgICBCSU9fcHJpbnRmKG91dCwgIi4iKTsKKyAgICAodm9pZClCSU9fZmx1c2gob3V0KTsKKworICAgIEJJT19wcmludGYob3V0LCAiIG9rXG4iKTsKKyAgICAvKiBjbGVhbnVwICovCisgICAgLyogY2xlYW4gYm9ndXMgZXJyb3JzICovCisgICAgRVJSX2NsZWFyX2Vycm9yKCk7CisgICAgT1BFTlNTTF9mcmVlKHNpZ25hdHVyZSk7CisgICAgc2lnbmF0dXJlID0gTlVMTDsKKyAgICBFQ19LRVlfZnJlZShlY2tleSk7CisgICAgZWNrZXkgPSBOVUxMOworICAgIEVDX0tFWV9mcmVlKHdyb25nX2Vja2V5KTsKKyAgICB3cm9uZ19lY2tleSA9IE5VTEw7CisgICAgRUNEU0FfU0lHX2ZyZWUoZWNkc2Ffc2lnKTsKKyAgICBlY2RzYV9zaWcgPSBOVUxMOworICAgIE9QRU5TU0xfZnJlZShyYXdfYnVmKTsKKyAgICByYXdfYnVmID0gTlVMTDsKKyAgfQorCisgIHJldCA9IDE7CitidWlsdGluX2VycjoKKyAgaWYgKGVja2V5KQorICAgIEVDX0tFWV9mcmVlKGVja2V5KTsKKyAgaWYgKHdyb25nX2Vja2V5KQorICAgIEVDX0tFWV9mcmVlKHdyb25nX2Vja2V5KTsKKyAgaWYgKGVjZHNhX3NpZykKKyAgICBFQ0RTQV9TSUdfZnJlZShlY2RzYV9zaWcpOworICBpZiAoc2lnbmF0dXJlKQorICAgIE9QRU5TU0xfZnJlZShzaWduYXR1cmUpOworICBpZiAocmF3X2J1ZikKKyAgICBPUEVOU1NMX2ZyZWUocmF3X2J1Zik7CisKKyAgcmV0dXJuIHJldDsKK30KKworaW50IG1haW4odm9pZCkgeworICBpbnQgcmV0ID0gMTsKKyAgQklPICpvdXQ7CisKKyAgb3V0ID0gQklPX25ld19mcChzdGRvdXQsIEJJT19OT0NMT1NFKTsKKworICBFUlJfbG9hZF9jcnlwdG9fc3RyaW5ncygpOworCisgIGlmICghdGVzdF9idWlsdGluKG91dCkpCisgICAgZ290byBlcnI7CisKKyAgcmV0ID0gMDsKKworZXJyOgorICBpZiAocmV0KQorICAgIEJJT19wcmludGYob3V0LCAiXG5FQ0RTQSB0ZXN0IGZhaWxlZFxuIik7CisgIGVsc2UKKyAgICBCSU9fcHJpbnRmKG91dCwgIlxuUEFTU1xuIik7CisgIGlmIChyZXQpCisgICAgQklPX3ByaW50X2Vycm9ycyhvdXQpOworCisgIGlmIChvdXQgIT0gTlVMTCkKKyAgICBCSU9fZnJlZShvdXQpOworCisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vZW5naW5lL0NNYWtlTGlzdHMudHh0IGIvY3J5cHRvL2VuZ2luZS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTI2ZTJhCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2VuZ2luZS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDkgQEAKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQorCithZGRfbGlicmFyeSgKKwllbmdpbmUKKworCU9CSkVDVAorCisJZW5naW5lLmMKKykKZGlmZiAtLWdpdCBhL2NyeXB0by9lbmdpbmUvZW5naW5lLmMgYi9jcnlwdG8vZW5naW5lL2VuZ2luZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMDg4NmUKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vZW5naW5lL2VuZ2luZS5jCkBAIC0wLDAgKzEsMTMzIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTQsIEdvb2dsZSBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2VuZ2luZS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9kaC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZHNhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lY19rZXkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC90aHJlYWQuaD4KKworCitzdHJ1Y3QgZW5naW5lX3N0IHsKKyAgREhfTUVUSE9EICpkaF9tZXRob2Q7CisgIERTQV9NRVRIT0QgKmRzYV9tZXRob2Q7CisgIFJTQV9NRVRIT0QgKnJzYV9tZXRob2Q7CisgIEVDRFNBX01FVEhPRCAqZWNkc2FfbWV0aG9kOworfTsKKworRU5HSU5FICpFTkdJTkVfbmV3KCkgeworICBFTkdJTkUgKmVuZ2luZSA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihFTkdJTkUpKTsKKyAgaWYgKGVuZ2luZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBtZW1zZXQoZW5naW5lLCAwLCBzaXplb2YoRU5HSU5FKSk7CisgIHJldHVybiBlbmdpbmU7Cit9CisKK3ZvaWQgRU5HSU5FX2ZyZWUoRU5HSU5FICplbmdpbmUpIHsKKyAgaWYgKGVuZ2luZS0+ZGhfbWV0aG9kICE9IE5VTEwpIHsKKyAgICBNRVRIT0RfdW5yZWYoZW5naW5lLT5kaF9tZXRob2QpOworICB9CisKKyAgT1BFTlNTTF9mcmVlKGVuZ2luZSk7Cit9CisKKy8qIHNldF9tZXRob2QgdGFrZXMgYSBwb2ludGVyIHRvIGEgbWV0aG9kIGFuZCBpdHMgZ2l2ZW4gc2l6ZSBhbmQgc2V0cworICogfCpvdXRfbWVtYmVyfCB0byBwb2ludCB0byBhIGNvcHkgb2YgaXQuIFRoZSBjb3B5IGlzIHxjb21waWxlZF9zaXplfCBieXRlcworICogbG9uZyBhbmQgaGFzIHplcm8gcGFkZGluZyBpZiBuZWVkZWQuICovCitzdGF0aWMgaW50IHNldF9tZXRob2Qodm9pZCAqKm91dF9tZW1iZXIsIGNvbnN0IHZvaWQgKm1ldGhvZCwgc2l6ZV90IG1ldGhvZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb21waWxlZF9zaXplKSB7CisgIHZvaWQgKmNvcHkgPSBPUEVOU1NMX21hbGxvYyhjb21waWxlZF9zaXplKTsKKyAgaWYgKGNvcHkgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgbWVtc2V0KGNvcHksIDAsIGNvbXBpbGVkX3NpemUpOworCisgIGlmIChtZXRob2Rfc2l6ZSA+IGNvbXBpbGVkX3NpemUpIHsKKyAgICBtZXRob2Rfc2l6ZSA9IGNvbXBpbGVkX3NpemU7CisgIH0KKyAgbWVtY3B5KGNvcHksIG1ldGhvZCwgbWV0aG9kX3NpemUpOworCisgIE1FVEhPRF91bnJlZigqb3V0X21lbWJlcik7CisgICpvdXRfbWVtYmVyID0gY29weTsKKworICByZXR1cm4gMTsKK30KKworaW50IEVOR0lORV9zZXRfREhfbWV0aG9kKEVOR0lORSAqZW5naW5lLCBjb25zdCBESF9NRVRIT0QgKm1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWV0aG9kX3NpemUpIHsKKyAgcmV0dXJuIHNldF9tZXRob2QoKHZvaWQgKiopJmVuZ2luZS0+ZGhfbWV0aG9kLCBtZXRob2QsIG1ldGhvZF9zaXplLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoREhfTUVUSE9EKSk7Cit9CisKK0RIX01FVEhPRCAqRU5HSU5FX2dldF9ESF9tZXRob2QoY29uc3QgRU5HSU5FICplbmdpbmUpIHsKKyAgcmV0dXJuIGVuZ2luZS0+ZGhfbWV0aG9kOworfQorCitpbnQgRU5HSU5FX3NldF9EU0FfbWV0aG9kKEVOR0lORSAqZW5naW5lLCBjb25zdCBEU0FfTUVUSE9EICptZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG1ldGhvZF9zaXplKSB7CisgIHJldHVybiBzZXRfbWV0aG9kKCh2b2lkICoqKSZlbmdpbmUtPmRzYV9tZXRob2QsIG1ldGhvZCwgbWV0aG9kX3NpemUsCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihEU0FfTUVUSE9EKSk7Cit9CisKK0RTQV9NRVRIT0QgKkVOR0lORV9nZXRfRFNBX21ldGhvZChjb25zdCBFTkdJTkUgKmVuZ2luZSkgeworICByZXR1cm4gZW5naW5lLT5kc2FfbWV0aG9kOworfQorCitpbnQgRU5HSU5FX3NldF9SU0FfbWV0aG9kKEVOR0lORSAqZW5naW5lLCBjb25zdCBSU0FfTUVUSE9EICptZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG1ldGhvZF9zaXplKSB7CisgIHJldHVybiBzZXRfbWV0aG9kKCh2b2lkICoqKSZlbmdpbmUtPnJzYV9tZXRob2QsIG1ldGhvZCwgbWV0aG9kX3NpemUsCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihSU0FfTUVUSE9EKSk7Cit9CisKK1JTQV9NRVRIT0QgKkVOR0lORV9nZXRfUlNBX21ldGhvZChjb25zdCBFTkdJTkUgKmVuZ2luZSkgeworICByZXR1cm4gZW5naW5lLT5yc2FfbWV0aG9kOworfQorCitpbnQgRU5HSU5FX3NldF9FQ0RTQV9tZXRob2QoRU5HSU5FICplbmdpbmUsIGNvbnN0IEVDRFNBX01FVEhPRCAqbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtZXRob2Rfc2l6ZSkgeworICByZXR1cm4gc2V0X21ldGhvZCgodm9pZCAqKikmZW5naW5lLT5lY2RzYV9tZXRob2QsIG1ldGhvZCwgbWV0aG9kX3NpemUsCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihFQ0RTQV9NRVRIT0QpKTsKK30KKworRUNEU0FfTUVUSE9EICpFTkdJTkVfZ2V0X0VDRFNBX21ldGhvZChjb25zdCBFTkdJTkUgKmVuZ2luZSkgeworICByZXR1cm4gZW5naW5lLT5lY2RzYV9tZXRob2Q7Cit9CisKK3ZvaWQgTUVUSE9EX3JlZih2b2lkICptZXRob2RfaW4pIHsKKyAgc3RydWN0IG9wZW5zc2xfbWV0aG9kX2NvbW1vbl9zdCAqbWV0aG9kID0gbWV0aG9kX2luOworCisgIGlmIChtZXRob2QtPmlzX3N0YXRpYykgeworICAgIHJldHVybjsKKyAgfQorCisgIENSWVBUT19hZGQoJm1ldGhvZC0+cmVmZXJlbmNlcywgMSwgQ1JZUFRPX0xPQ0tfRU5HSU5FKTsKK30KKwordm9pZCBNRVRIT0RfdW5yZWYodm9pZCAqbWV0aG9kX2luKSB7CisgIHN0cnVjdCBvcGVuc3NsX21ldGhvZF9jb21tb25fc3QgKm1ldGhvZCA9IG1ldGhvZF9pbjsKKworICBpZiAobWV0aG9kID09IE5VTEwgfHwgbWV0aG9kLT5pc19zdGF0aWMpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoQ1JZUFRPX2FkZCgmbWV0aG9kLT5yZWZlcmVuY2VzLCAtMSwgQ1JZUFRPX0xPQ0tfRU5HSU5FKSA9PSAwKSB7CisgICAgT1BFTlNTTF9mcmVlKG1ldGhvZCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NyeXB0by9lbmdpbmUvZW5naW5lLmggYi9jcnlwdG8vZW5naW5lL2VuZ2luZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NzE5NmUKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vZW5naW5lL2VuZ2luZS5oCkBAIC0wLDAgKzEsMTAwIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTQsIEdvb2dsZSBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuICovCisKKyNpZm5kZWYgT1BFTlNTTF9IRUFERVJfRU5HSU5FX0gKKyNkZWZpbmUgT1BFTlNTTF9IRUFERVJfRU5HSU5FX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvYmFzZS5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogRW5naW5lcyBhcmUgY29sbGVjdGlvbnMgb2YgbWV0aG9kcy4gTWV0aG9kcyBhcmUgdGFibGVzIG9mIGZ1bmN0aW9uIHBvaW50ZXJzLAorICogZGVmaW5lZCBmb3IgY2VydGFpbiBhbGdvcml0aG1zLCB0aGF0IGFsbG93IG9wZXJhdGlvbnMgb24gdGhvc2UgYWxnb3JpdGhtcyB0bworICogYmUgb3ZlcnJpZGRlbiB2aWEgYSBjYWxsYmFjay4gVGhpcyBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsIHRvIGltcGxlbWVudCBhbgorICogUlNBKiB0aGF0IGZvcndhcmRzIG9wZXJhdGlvbnMgdG8gYSBoYXJkd2FyZSBtb2R1bGUuCisgKgorICogTWV0aG9kcyBhcmUgcmVmZXJlbmNlIGNvdW50ZWQgYnV0IHxFTkdJTkV8cyBhcmUgbm90LiBXaGVuIGNyZWF0aW5nIGEgbWV0aG9kLAorICogeW91IHNob3VsZCB6ZXJvIHRoZSB3aG9sZSBzdHJ1Y3R1cmUgYW5kIGZpbGwgaW4gdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIHRoYXQKKyAqIHlvdSB3aXNoIGJlZm9yZSBzZXR0aW5nIGl0IG9uIGFuIHxFTkdJTkV8LiBBbnkgZnVuY3Rpb25zIHBvaW50ZXJzIHRoYXQKKyAqIGFyZSBOVUxMIGluZGljYXRlIHRoYXQgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIHNob3VsZCBiZSB1c2VkLiAqLworCisKKy8qIEFsbG9jYXRpb24gYW5kIGRlc3RydWN0aW9uLiAqLworCisvKiBFTkdJTkVfbmV3IHJldHVybnMgYW4gZW1wdHkgRU5HSU5FIHRoYXQgdXNlcyB0aGUgZGVmYXVsdCBtZXRob2QgZm9yIGFsbAorICogYWxnb3JpdGhtcy4gKi8KK0VOR0lORSAqRU5HSU5FX25ldygpOworCisvKiBFTkdJTkVfZnJlZSBkZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnRzIGZvciBhbGwgbWV0aG9kcyBsaW5rZWQgZnJvbQorICogfGVuZ2luZXwgYW5kIGZyZWVzIHxlbmdpbmV8IGl0c2VsZi4gKi8KK3ZvaWQgRU5HSU5FX2ZyZWUoRU5HSU5FICplbmdpbmUpOworCisKKy8qIE1ldGhvZCBhY2Nlc3NvcnMuCisgKgorICogTWV0aG9kIGFjY2Vzc29ycyB0YWtlIGEgbWV0aG9kIHBvaW50ZXIgYW5kIHRoZSBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUuIFRoZQorICogc2l6ZSBhbGxvd3MgZm9yIEFCSSBjb21wYXRpYmlsaXR5IGluIHRoZSBjYXNlIHRoYXQgdGhlIG1ldGhvZCBzdHJ1Y3R1cmUgaXMKKyAqIGV4dGVuZGVkIHdpdGggZXh0cmEgZWxlbWVudHMgYXQgdGhlIGVuZC4gTWV0aG9kcyBhcmUgYWx3YXlzIGNvcGllZCBieSB0aGUKKyAqIHNldCBmdW5jdGlvbnMuCisgKgorICogU2V0IGZ1bmN0aW9ucyByZXR1cm4gb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24gYWxsb2NhdGlvbiBmYWlsdXJlLiAqLworCitpbnQgRU5HSU5FX3NldF9ESF9tZXRob2QoRU5HSU5FICplbmdpbmUsIGNvbnN0IERIX01FVEhPRCAqbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtZXRob2Rfc2l6ZSk7CitESF9NRVRIT0QgKkVOR0lORV9nZXRfREhfbWV0aG9kKGNvbnN0IEVOR0lORSAqZW5naW5lKTsKKworaW50IEVOR0lORV9zZXRfRFNBX21ldGhvZChFTkdJTkUgKmVuZ2luZSwgY29uc3QgRFNBX01FVEhPRCAqbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWV0aG9kX3NpemUpOworRFNBX01FVEhPRCAqRU5HSU5FX2dldF9EU0FfbWV0aG9kKGNvbnN0IEVOR0lORSAqZW5naW5lKTsKKworaW50IEVOR0lORV9zZXRfUlNBX21ldGhvZChFTkdJTkUgKmVuZ2luZSwgY29uc3QgUlNBX01FVEhPRCAqbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWV0aG9kX3NpemUpOworUlNBX01FVEhPRCAqRU5HSU5FX2dldF9SU0FfbWV0aG9kKGNvbnN0IEVOR0lORSAqZW5naW5lKTsKKworaW50IEVOR0lORV9zZXRfRUNEU0FfbWV0aG9kKEVOR0lORSAqZW5naW5lLCBjb25zdCBFQ0RTQV9NRVRIT0QgKm1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWV0aG9kX3NpemUpOworRUNEU0FfTUVUSE9EICpFTkdJTkVfZ2V0X0VDRFNBX21ldGhvZChjb25zdCBFTkdJTkUgKmVuZ2luZSk7CisKKworLyogR2VuZXJpYyBtZXRob2QgZnVuY3Rpb25zLgorICoKKyAqIFRoZXNlIGZ1bmN0aW9ucyB0YWtlIGEgdm9pZCogdHlwZSBidXQgYWN0dWFsbHkgb3BlcmF0ZSBvbiBhbGwgbWV0aG9kCisgKiBzdHJ1Y3R1cmVzLiAqLworCisvKiBNRVRIT0RfcmVmIGluY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB8bWV0aG9kfC4gKi8KK3ZvaWQgTUVUSE9EX3JlZih2b2lkICptZXRob2QpOworCisvKiBNRVRIT0RfdW5yZWYgZGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHxtZXRob2R8IGFuZCBmcmVlcyBpdCBpZiB0aGUKKyAqIHJlZmVyZW5jZSBjb3VudCBkcm9wcyB0byB6ZXJvLiAqLwordm9pZCBNRVRIT0RfdW5yZWYodm9pZCAqbWV0aG9kKTsKKworCisvKiBQcml2YXRlIGZ1bmN0aW9ucy4gKi8KKworLyogb3BlbnNzbF9tZXRob2RfY29tbW9uX3N0IGNvbnRhaW5zIHRoZSBjb21tb24gcGFydCBvZiBhbGwgbWV0aG9kIHN0cnVjdHVyZXMuCisgKiBUaGlzIG11c3QgYmUgdGhlIGZpcnN0IG1lbWJlciBvZiBhbGwgbWV0aG9kIHN0cnVjdHVyZXMuICovCitzdHJ1Y3Qgb3BlbnNzbF9tZXRob2RfY29tbW9uX3N0IHsKKyAgaW50IHJlZmVyZW5jZXM7CisgIGNoYXIgaXNfc3RhdGljOworfTsKKworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30gIC8qIGV4dGVybiBDICovCisjZW5kaWYKKworI2VuZGlmICAvKiBPUEVOU1NMX0hFQURFUl9FTkdJTkVfSCAqLwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2Vyci9DTWFrZUxpc3RzLnR4dCBiL2NyeXB0by9lcnIvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFjNDk1MQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9lcnIvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxOCBAQAoraW5jbHVkZV9kaXJlY3RvcmllcyguIC4uIC4uLy4uL2luY2x1ZGUpCisKK2FkZF9saWJyYXJ5KAorCWVycgorCisJT0JKRUNUCisKKwllcnIuYworCWVycl9pbXBsLmMKKykKKworYWRkX2V4ZWN1dGFibGUoCisJZXJyX3Rlc3QKKworCWVycl90ZXN0LmMKKykKKwordGFyZ2V0X2xpbmtfbGlicmFyaWVzKGVycl90ZXN0IGNyeXB0bykKZGlmZiAtLWdpdCBhL2NyeXB0by9lcnIvZXJyLmMgYi9jcnlwdG8vZXJyL2Vyci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3OGVlNmIKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vZXJyL2Vyci5jCkBAIC0wLDAgKzEsNzM3IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9saGFzaC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC90aHJlYWQuaD4KKworCisvKiBlcnJfZm5zIGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBlcnJvciBpbXBsZW1lbnRhdGlvbi4gKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgRVJSX0ZOU19zdCAqZXJyX2ZucyA9IE5VTEw7CitleHRlcm4gY29uc3Qgc3RydWN0IEVSUl9GTlNfc3Qgb3BlbnNzbF9lcnJfZGVmYXVsdF9pbXBsOworCisjZGVmaW5lIEVSUkZOKGEpIGVycl9mbnMtPmEKKworLyogZXJyX2Zuc19jaGVjayBpcyBhbiBpbnRlcm5hbCBmdW5jdGlvbiB0aGF0IGNoZWNrcyB3aGV0aGVyICJlcnJfZm5zIiBpcyBzZXQKKyAqIGFuZCBpZiBub3QsIHNldHMgaXQgdG8gdGhlIGRlZmF1bHQuICovCitzdGF0aWMgdm9pZCBlcnJfZm5zX2NoZWNrKHZvaWQpIHsKKyAgLyogSW4gcHJhY3RpY2UsIHRoaXMgaXMgbm90IGEgcmFjZSBwcm9ibGVtIGJlY2F1c2UgbG9hZGluZyB0aGUgZXJyb3Igc3RyaW5ncworICAgKiBhdCBpbml0IHRpbWUgd2lsbCBjYXVzZSB0aGlzIHBvaW50ZXIgdG8gYmUgc2V0IGJlZm9yZSB0aGUgcHJvY2VzcyBnb2VzCisgICAqIG11bHRpdGhyZWFkZWQuICovCisgIGlmIChlcnJfZm5zKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19FUlIpOworICBpZiAoIWVycl9mbnMpIHsKKyAgICBlcnJfZm5zID0gJm9wZW5zc2xfZXJyX2RlZmF1bHRfaW1wbDsKKyAgfQorICBDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfRVJSKTsKK30KKworLyogZXJyX2NsZWFyX2RhdGEgZnJlZXMgdGhlIG9wdGlvbmFsIHxkYXRhfCBtZW1iZXIgb2YgdGhlIGdpdmVuIGVycm9yLiAqLworc3RhdGljIHZvaWQgZXJyX2NsZWFyX2RhdGEoc3RydWN0IGVycl9lcnJvcl9zdCAqZXJyb3IpIHsKKyAgaWYgKGVycm9yLT5kYXRhICE9IE5VTEwgJiYgKGVycm9yLT5mbGFncyAmIEVSUl9GTEFHX01BTExPQ0VEKSAhPSAwKSB7CisgICAgT1BFTlNTTF9mcmVlKGVycm9yLT5kYXRhKTsKKyAgfQorICBlcnJvci0+ZGF0YSA9IE5VTEw7CisgIGVycm9yLT5mbGFncyAmPSB+RVJSX0ZMQUdfTUFMTE9DRUQ7Cit9CisKKy8qIGVycl9jbGVhciBjbGVhcnMgdGhlIGdpdmVuIHF1ZXVlZCBlcnJvci4gKi8KK3N0YXRpYyB2b2lkIGVycl9jbGVhcihzdHJ1Y3QgZXJyX2Vycm9yX3N0ICplcnJvcikgeworICBlcnJfY2xlYXJfZGF0YShlcnJvcik7CisgIG1lbXNldChlcnJvciwgMCwgc2l6ZW9mKHN0cnVjdCBlcnJfZXJyb3Jfc3QpKTsKK30KKworLyogZXJyX2dldF9zdGF0ZSBnZXRzIHRoZSBFUlJfU1RBVEUgb2JqZWN0IGZvciB0aGUgY3VycmVudCB0aHJlYWQuICovCitzdGF0aWMgRVJSX1NUQVRFICplcnJfZ2V0X3N0YXRlKHZvaWQpIHsKKyAgZXJyX2Zuc19jaGVjaygpOworICByZXR1cm4gRVJSRk4oZ2V0X3N0YXRlKSgpOworfQorCitzdGF0aWMgdWludDMyX3QgZ2V0X2Vycm9yX3ZhbHVlcyhpbnQgaW5jLCBpbnQgdG9wLCBjb25zdCBjaGFyICoqZmlsZSwgaW50ICpsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKmRhdGEsIGludCAqZmxhZ3MpIHsKKyAgdW5zaWduZWQgaSA9IDA7CisgIEVSUl9TVEFURSAqc3RhdGU7CisgIHN0cnVjdCBlcnJfZXJyb3Jfc3QgKmVycm9yOworICB1aW50MzJfdCByZXQ7CisKKyAgc3RhdGUgPSBlcnJfZ2V0X3N0YXRlKCk7CisKKyAgaWYgKHN0YXRlLT5ib3R0b20gPT0gc3RhdGUtPnRvcCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKHRvcCkgeworICAgIC8qIGxhc3QgZXJyb3IgKi8KKyAgICBpID0gc3RhdGUtPnRvcDsKKyAgfSBlbHNlIHsKKyAgICBpID0gKHN0YXRlLT5ib3R0b20gKyAxKSAlIEVSUl9OVU1fRVJST1JTOworICB9CisKKyAgZXJyb3IgPSAmc3RhdGUtPmVycm9yc1tpXTsKKyAgcmV0ID0gZXJyb3ItPnBhY2tlZDsKKworICBpZiAoZmlsZSAhPSBOVUxMICYmIGxpbmUgIT0gTlVMTCkgeworICAgIGlmIChlcnJvci0+ZmlsZSA9PSBOVUxMKSB7CisgICAgICAqZmlsZSA9ICJOQSI7CisgICAgICAqbGluZSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICpmaWxlID0gZXJyb3ItPmZpbGU7CisgICAgICAqbGluZSA9IGVycm9yLT5saW5lOworICAgIH0KKyAgfQorCisgIGlmIChkYXRhICE9IE5VTEwpIHsKKyAgICBpZiAoZXJyb3ItPmRhdGEgPT0gTlVMTCkgeworICAgICAgKmRhdGEgPSAiIjsKKyAgICAgIGlmIChmbGFncyAhPSBOVUxMKSB7CisgICAgICAgICpmbGFncyA9IDA7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICpkYXRhID0gZXJyb3ItPmRhdGE7CisgICAgICBpZiAoZmxhZ3MgIT0gTlVMTCkgeworICAgICAgICAqZmxhZ3MgPSBlcnJvci0+ZmxhZ3MgJiBFUlJfRkxBR19QVUJMSUNfTUFTSzsKKyAgICAgIH0KKyAgICAgIGVycm9yLT5kYXRhID0gTlVMTDsKKyAgICAgIGVycm9yLT5mbGFncyA9IDA7CisgICAgfQorICB9CisKKyAgaWYgKGluYykgeworICAgIGFzc2VydCghdG9wKTsKKyAgICBlcnJfY2xlYXIoZXJyb3IpOworICAgIHN0YXRlLT5ib3R0b20gPSBpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKwordWludDMyX3QgRVJSX2dldF9lcnJvcih2b2lkKSB7CisgIHJldHVybiBnZXRfZXJyb3JfdmFsdWVzKDEsIDAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCit1aW50MzJfdCBFUlJfZ2V0X2Vycm9yX2xpbmUoY29uc3QgY2hhciAqKmZpbGUsIGludCAqbGluZSkgeworICByZXR1cm4gZ2V0X2Vycm9yX3ZhbHVlcygxLCAwLCBmaWxlLCBsaW5lLCBOVUxMLCBOVUxMKTsKK30KKwordWludDMyX3QgRVJSX2dldF9lcnJvcl9saW5lX2RhdGEoY29uc3QgY2hhciAqKmZpbGUsIGludCAqbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKipkYXRhLCBpbnQgKmZsYWdzKSB7CisgIHJldHVybiBnZXRfZXJyb3JfdmFsdWVzKDEsIDAsIGZpbGUsIGxpbmUsIGRhdGEsIGZsYWdzKTsKK30KKwordWludDMyX3QgRVJSX3BlZWtfZXJyb3Iodm9pZCkgeworICByZXR1cm4gZ2V0X2Vycm9yX3ZhbHVlcygwLCAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKK30KKwordWludDMyX3QgRVJSX3BlZWtfZXJyb3JfbGluZShjb25zdCBjaGFyICoqZmlsZSwgaW50ICpsaW5lKSB7CisgIHJldHVybiBnZXRfZXJyb3JfdmFsdWVzKDAsIDAsIGZpbGUsIGxpbmUsIE5VTEwsIE5VTEwpOworfQorCit1aW50MzJfdCBFUlJfcGVla19lcnJvcl9saW5lX2RhdGEoY29uc3QgY2hhciAqKmZpbGUsIGludCAqbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqZGF0YSwgaW50ICpmbGFncykgeworICByZXR1cm4gZ2V0X2Vycm9yX3ZhbHVlcygwLCAwLCBmaWxlLCBsaW5lLCAoY2hhciAqKikgZGF0YSwgZmxhZ3MpOworfQorCit1aW50MzJfdCBFUlJfcGVla19sYXN0X2Vycm9yKHZvaWQpIHsKKyAgcmV0dXJuIGdldF9lcnJvcl92YWx1ZXMoMCwgMSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKK3VpbnQzMl90IEVSUl9wZWVrX2xhc3RfZXJyb3JfbGluZShjb25zdCBjaGFyICoqZmlsZSwgaW50ICpsaW5lKSB7CisgIHJldHVybiBnZXRfZXJyb3JfdmFsdWVzKDAsIDEsIGZpbGUsIGxpbmUsIE5VTEwsIE5VTEwpOworfQorCit1aW50MzJfdCBFUlJfcGVla19sYXN0X2Vycm9yX2xpbmVfZGF0YShjb25zdCBjaGFyICoqZmlsZSwgaW50ICpsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKmRhdGEsIGludCAqZmxhZ3MpIHsKKyAgcmV0dXJuIGdldF9lcnJvcl92YWx1ZXMoMCwgMSwgZmlsZSwgbGluZSwgKGNoYXIgKiopIGRhdGEsIGZsYWdzKTsKK30KKwordm9pZCBFUlJfY2xlYXJfZXJyb3Iodm9pZCkgeworICBFUlJfU1RBVEUgKmNvbnN0IHN0YXRlID0gZXJyX2dldF9zdGF0ZSgpOworICB1bnNpZ25lZCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBFUlJfTlVNX0VSUk9SUzsgaSsrKSB7CisgICAgZXJyX2NsZWFyKCZzdGF0ZS0+ZXJyb3JzW2ldKTsKKyAgfQorCisgIHN0YXRlLT50b3AgPSBzdGF0ZS0+Ym90dG9tID0gMDsKK30KKwordm9pZCBFUlJfY2xlYXJfc3lzdGVtX2Vycm9yKHZvaWQpIHsKKyAgZXJybm8gPSAwOworfQorCitjaGFyICpFUlJfZXJyb3Jfc3RyaW5nKHVpbnQzMl90IHBhY2tlZF9lcnJvciwgY2hhciAqcmV0KSB7CisgIHN0YXRpYyBjaGFyIGJ1ZltFUlJfRVJST1JfU1RSSU5HX0JVRl9MRU5dOworCisgIGlmIChyZXQgPT0gTlVMTCkgeworICAgIC8qIFRPRE8oZm9yayk6IHJlbW92ZSB0aGlzLiAqLworICAgIHJldCA9IGJ1ZjsKKyAgfQorCisjaWYgIWRlZmluZWQoTkRFQlVHKQorICAvKiBUaGlzIGlzIGFpbWVkIHRvIGhlbHAgY2F0Y2ggY2FsbGVycyB3aG8gZG9uJ3QgcHJvdmlkZQorICAgKiB8RVJSX0VSUk9SX1NUUklOR19CVUZfTEVOfCBieXRlcyBvZiBzcGFjZS4gKi8KKyAgbWVtc2V0KHJldCwgMCwgRVJSX0VSUk9SX1NUUklOR19CVUZfTEVOKTsKKyNlbmRpZgorCisgIEVSUl9lcnJvcl9zdHJpbmdfbihwYWNrZWRfZXJyb3IsIHJldCwgRVJSX0VSUk9SX1NUUklOR19CVUZfTEVOKTsKKworICByZXR1cm4gcmV0OworfQorCit2b2lkIEVSUl9lcnJvcl9zdHJpbmdfbih1aW50MzJfdCBwYWNrZWRfZXJyb3IsIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikgeworICBjaGFyIGxpYl9idWZbNjRdLCBmdW5jX2J1Zls2NF0sIHJlYXNvbl9idWZbNjRdOworICBjb25zdCBjaGFyICpsaWJfc3RyLCAqZnVuY19zdHIsICpyZWFzb25fc3RyOworICB1bnNpZ25lZCBsaWIsIGZ1bmMsIHJlYXNvbjsKKworICBpZiAobGVuID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKworICBsaWIgPSBFUlJfR0VUX0xJQihwYWNrZWRfZXJyb3IpOworICBmdW5jID0gRVJSX0dFVF9GVU5DKHBhY2tlZF9lcnJvcik7CisgIHJlYXNvbiA9IEVSUl9HRVRfUkVBU09OKHBhY2tlZF9lcnJvcik7CisKKyAgbGliX3N0ciA9IEVSUl9saWJfZXJyb3Jfc3RyaW5nKHBhY2tlZF9lcnJvcik7CisgIGZ1bmNfc3RyID0gRVJSX2Z1bmNfZXJyb3Jfc3RyaW5nKHBhY2tlZF9lcnJvcik7CisgIHJlYXNvbl9zdHIgPSBFUlJfcmVhc29uX2Vycm9yX3N0cmluZyhwYWNrZWRfZXJyb3IpOworCisgIGlmIChsaWJfc3RyID09IE5VTEwpIHsKKyAgICBCSU9fc25wcmludGYobGliX2J1Ziwgc2l6ZW9mKGxpYl9idWYpLCAibGliKCV1KSIsIGxpYik7CisgICAgbGliX3N0ciA9IGxpYl9idWY7CisgIH0KKworICBpZiAoZnVuY19zdHIgPT0gTlVMTCkgeworICAgIEJJT19zbnByaW50ZihmdW5jX2J1Ziwgc2l6ZW9mKGZ1bmNfYnVmKSwgImZ1bmMoJXUpIiwgZnVuYyk7CisgICAgZnVuY19zdHIgPSBmdW5jX2J1ZjsKKyAgfQorCisgIGlmIChyZWFzb25fc3RyID09IE5VTEwpIHsKKyAgICBCSU9fc25wcmludGYocmVhc29uX2J1Ziwgc2l6ZW9mKHJlYXNvbl9idWYpLCAicmVhc29uKCV1KSIsIHJlYXNvbik7CisgICAgcmVhc29uX3N0ciA9IHJlYXNvbl9idWY7CisgIH0KKworICBCSU9fc25wcmludGYoYnVmLCBsZW4sICJlcnJvcjolMDgiIFBSSXgzMiAiOiVzOiVzOiVzIiwKKyAgICAgICAgICAgICAgIHBhY2tlZF9lcnJvciwgbGliX3N0ciwgZnVuY19zdHIsIHJlYXNvbl9zdHIpOworCisgIGlmIChzdHJsZW4oYnVmKSA9PSBsZW4gLSAxKSB7CisgICAgLyogb3V0cHV0IG1heSBiZSB0cnVuY2F0ZWQ7IG1ha2Ugc3VyZSB3ZSBhbHdheXMgaGF2ZSA1IGNvbG9uLXNlcGFyYXRlZAorICAgICAqIGZpZWxkcywgaS5lLiA0IGNvbG9ucy4gKi8KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbnVtX2NvbG9ucyA9IDQ7CisgICAgdW5zaWduZWQgaTsKKyAgICBjaGFyICpzID0gYnVmOworCisgICAgaWYgKGxlbiA8PSBudW1fY29sb25zKSB7CisgICAgICAvKiBJbiB0aGlzIHNpdHVhdGlvbiBpdCdzIG5vdCBwb3NzaWJsZSB0byBlbnN1cmUgdGhhdCB0aGUgY29ycmVjdCBudW1iZXIKKyAgICAgICAqIG9mIGNvbG9ucyBhcmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dC4gKi8KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbG9uczsgaSsrKSB7CisgICAgICBjaGFyICpjb2xvbiA9IHN0cmNocihzLCAnOicpOworICAgICAgY2hhciAqbGFzdF9wb3MgPSAmYnVmW2xlbiAtIDFdIC0gbnVtX2NvbG9ucyArIGk7CisKKyAgICAgIGlmIChjb2xvbiA9PSBOVUxMIHx8IGNvbG9uID4gbGFzdF9wb3MpIHsKKyAgICAgICAgLyogc2V0IGNvbG9uIHxpfCBhdCBsYXN0IHBvc3NpYmxlIHBvc2l0aW9uIChidWZbbGVuLTFdIGlzIHRoZQorICAgICAgICAgKiB0ZXJtaW5hdGluZyAwKS4gSWYgd2UncmUgc2V0dGluZyB0aGlzIGNvbG9uLCB0aGVuIGFsbCB3aG9sZSBvZiB0aGUKKyAgICAgICAgICogcmVzdCBvZiB0aGUgc3RyaW5nIG11c3QgYmUgY29sb25zIGluIG9yZGVyIHRvIGhhdmUgdGhlIGNvcnJlY3QKKyAgICAgICAgICogbnVtYmVyLiAqLworICAgICAgICBtZW1zZXQobGFzdF9wb3MsICc6JywgbnVtX2NvbG9ucyAtIGkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgcyA9IGNvbG9uICsgMTsKKyAgICB9CisgIH0KK30KKworLyogZXJyX2NvbXBvbmVudF9lcnJvcl9zdHJpbmcgcmV0dXJucyB0aGUgZXJyb3Igc3RyaW5nIGFzc29jaWF0ZWQgd2l0aAorICogfHBhY2tlZF9lcnJvcnwsIHdoaWNoIG11c3QgYmUgb2YgYSBzcGVjaWFsIGZvcm0gbWF0Y2hpbmcgdGhlIGtleXMgaW5zZXJ0ZWQKKyAqIGludG8gdGhlIGVycm9yIGhhc2ggdGFibGUuICovCitzdGF0aWMgY29uc3QgY2hhciAqZXJyX2NvbXBvbmVudF9lcnJvcl9zdHJpbmcodWludDMyX3QgcGFja2VkX2Vycm9yKSB7CisgIEVSUl9TVFJJTkdfREFUQSAqcDsKKworICBlcnJfZm5zX2NoZWNrKCk7CisgIHAgPSBFUlJGTihnZXRfaXRlbSkocGFja2VkX2Vycm9yKTsKKworICBpZiAocCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIHAtPnN0cmluZzsKK30KKworY29uc3QgY2hhciAqRVJSX2xpYl9lcnJvcl9zdHJpbmcodWludDMyX3QgcGFja2VkX2Vycm9yKSB7CisgIHJldHVybiBlcnJfY29tcG9uZW50X2Vycm9yX3N0cmluZyhFUlJfUEFDSyhFUlJfR0VUX0xJQihwYWNrZWRfZXJyb3IpLCAwLCAwKSk7Cit9CisKK2NvbnN0IGNoYXIgKkVSUl9mdW5jX2Vycm9yX3N0cmluZyh1aW50MzJfdCBwYWNrZWRfZXJyb3IpIHsKKyAgcmV0dXJuIGVycl9jb21wb25lbnRfZXJyb3Jfc3RyaW5nKAorICAgICAgRVJSX1BBQ0soRVJSX0dFVF9MSUIocGFja2VkX2Vycm9yKSwgRVJSX0dFVF9GVU5DKHBhY2tlZF9lcnJvciksIDApKTsKK30KKworY29uc3QgY2hhciAqRVJSX3JlYXNvbl9lcnJvcl9zdHJpbmcodWludDMyX3QgcGFja2VkX2Vycm9yKSB7CisgIGNvbnN0IGNoYXIgKnJlYXNvbl9zdHIgPSBlcnJfY29tcG9uZW50X2Vycm9yX3N0cmluZygKKyAgICAgIEVSUl9QQUNLKEVSUl9HRVRfTElCKHBhY2tlZF9lcnJvciksIDAsIEVSUl9HRVRfUkVBU09OKHBhY2tlZF9lcnJvcikpKTsKKworICBpZiAocmVhc29uX3N0ciAhPSBOVUxMKSB7CisgICAgcmV0dXJuIHJlYXNvbl9zdHI7CisgIH0KKworICByZXR1cm4gZXJyX2NvbXBvbmVudF9lcnJvcl9zdHJpbmcoCisgICAgICBFUlJfUEFDSygwLCAwLCBFUlJfR0VUX1JFQVNPTihwYWNrZWRfZXJyb3IpKSk7Cit9CisKK3ZvaWQgRVJSX3ByaW50X2Vycm9yc19jYihFUlJfcHJpbnRfZXJyb3JzX2NhbGxiYWNrX3QgY2FsbGJhY2ssIHZvaWQgKmN0eCkgeworICBDUllQVE9fVEhSRUFESUQgY3VycmVudF90aHJlYWQ7CisgIGNoYXIgYnVmW0VSUl9FUlJPUl9TVFJJTkdfQlVGX0xFTl07CisgIGNoYXIgYnVmMlsxMDI0XTsKKyAgdW5zaWduZWQgbG9uZyB0aHJlYWRfaGFzaDsKKyAgY29uc3QgY2hhciAqZmlsZTsKKyAgY2hhciAqZGF0YTsKKyAgaW50IGxpbmUsIGZsYWdzOworICB1aW50MzJfdCBwYWNrZWRfZXJyb3I7CisKKyAgQ1JZUFRPX1RIUkVBRElEX2N1cnJlbnQoJmN1cnJlbnRfdGhyZWFkKTsKKyAgdGhyZWFkX2hhc2ggPSBDUllQVE9fVEhSRUFESURfaGFzaCgmY3VycmVudF90aHJlYWQpOworCisgIGZvciAoOzspIHsKKyAgICBwYWNrZWRfZXJyb3IgPSBFUlJfZ2V0X2Vycm9yX2xpbmVfZGF0YSgmZmlsZSwgJmxpbmUsICZkYXRhLCAmZmxhZ3MpOworICAgIGlmIChwYWNrZWRfZXJyb3IgPT0gMCkgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgRVJSX2Vycm9yX3N0cmluZ19uKHBhY2tlZF9lcnJvciwgYnVmLCBzaXplb2YoYnVmKSk7CisgICAgQklPX3NucHJpbnRmKGJ1ZjIsIHNpemVvZihidWYyKSwgIiVsdTolczolczolZDolc1xuIiwgdGhyZWFkX2hhc2gsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgZmlsZSwgbGluZSwgKGZsYWdzICYgRVJSX0ZMQUdfU1RSSU5HKSA/IGRhdGEgOiAiIik7CisgICAgaWYgKGNhbGxiYWNrKGJ1ZjIsIHN0cmxlbihidWYyKSwgY3R4KSA8PSAwKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGZsYWdzICYgRVJSX0ZMQUdfTUFMTE9DRUQpIHsKKyAgICAgIE9QRU5TU0xfZnJlZShkYXRhKTsKKyAgICB9CisgIH0KK30KKworLyogZXJyX3NldF9lcnJvcl9kYXRhIHNldHMgdGhlIGRhdGEgb24gdGhlIG1vc3QgcmVjZW50IGVycm9yLiBUaGUgfGZsYWdzfAorICogYXJndW1lbnQgaXMgYSBjb21iaW5hdGlvbiBvZiB0aGUgfEVSUl9GTEFHXyp8IHZhbHVlcy4gKi8KK3N0YXRpYyB2b2lkIGVycl9zZXRfZXJyb3JfZGF0YShjaGFyICpkYXRhLCBpbnQgZmxhZ3MpIHsKKyAgRVJSX1NUQVRFICpjb25zdCBzdGF0ZSA9IGVycl9nZXRfc3RhdGUoKTsKKyAgc3RydWN0IGVycl9lcnJvcl9zdCAqZXJyb3I7CisKKyAgaWYgKHN0YXRlLT50b3AgPT0gc3RhdGUtPmJvdHRvbSkgeworICAgIHJldHVybjsKKyAgfQorCisgIGVycm9yID0gJnN0YXRlLT5lcnJvcnNbc3RhdGUtPnRvcF07CisKKyAgZXJyX2NsZWFyX2RhdGEoZXJyb3IpOworICBlcnJvci0+ZGF0YSA9IGRhdGE7CisgIGVycm9yLT5mbGFncyA9IGZsYWdzOworfQorCit2b2lkIEVSUl9wdXRfZXJyb3IoaW50IGxpYnJhcnksIGludCBmdW5jLCBpbnQgcmVhc29uLCBjb25zdCBjaGFyICpmaWxlLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxpbmUpIHsKKyAgRVJSX1NUQVRFICpjb25zdCBzdGF0ZSA9IGVycl9nZXRfc3RhdGUoKTsKKyAgc3RydWN0IGVycl9lcnJvcl9zdCAqZXJyb3I7CisKKyAgaWYgKGxpYnJhcnkgPT0gRVJSX0xJQl9TWVMgJiYgcmVhc29uID09IDApIHsKKyNpZiBkZWZpbmVkKFdJTjMyKQorICAgIHJlYXNvbiA9IEdldExhc3RFcnJvcigpOworI2Vsc2UKKyAgICByZWFzb24gPSBlcnJubzsKKyNlbmRpZgorICB9CisKKyAgc3RhdGUtPnRvcCA9IChzdGF0ZS0+dG9wICsgMSkgJSBFUlJfTlVNX0VSUk9SUzsKKyAgaWYgKHN0YXRlLT50b3AgPT0gc3RhdGUtPmJvdHRvbSkgeworICAgIHN0YXRlLT5ib3R0b20gPSAoc3RhdGUtPmJvdHRvbSArIDEpICUgRVJSX05VTV9FUlJPUlM7CisgIH0KKworICBlcnJvciA9ICZzdGF0ZS0+ZXJyb3JzW3N0YXRlLT50b3BdOworICBlcnJfY2xlYXIoZXJyb3IpOworICBlcnJvci0+ZmlsZSA9IGZpbGU7CisgIGVycm9yLT5saW5lID0gbGluZTsKKyAgZXJyb3ItPnBhY2tlZCA9IEVSUl9QQUNLKGxpYnJhcnksIGZ1bmMsIHJlYXNvbik7Cit9CisKKy8qIEVSUl9hZGRfZXJyb3JfZGF0YV92ZGF0YSB0YWtlcyBhIHZhcmlhYmxlIG51bWJlciBvZiBjb25zdCBjaGFyKiBwb2ludGVycywKKyAqIGNvbmNhdGVuYXRlcyB0aGVtIGFuZCBzZXRzIHRoZSByZXN1bHQgYXMgdGhlIGRhdGEgb24gdGhlIG1vc3QgcmVjZW50CisgKiBlcnJvci4gKi8KK3N0YXRpYyB2b2lkIGVycl9hZGRfZXJyb3JfdmRhdGEodW5zaWduZWQgbnVtLCB2YV9saXN0IGFyZ3MpIHsKKyAgc2l6ZV90IGFsbG9jZWQsIG5ld19sZW4sIGxlbiA9IDAsIHN1YnN0cl9sZW47CisgIGNoYXIgKmJ1ZjsKKyAgY29uc3QgY2hhciAqc3Vic3RyOworICB1bnNpZ25lZCBpOworCisgIGFsbG9jZWQgPSA4MDsKKyAgYnVmID0gT1BFTlNTTF9tYWxsb2MoYWxsb2NlZCArIDEpOworICBpZiAoYnVmID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKyAgICBzdWJzdHIgPSB2YV9hcmcoYXJncywgY29uc3QgY2hhciAqKTsKKyAgICBpZiAoc3Vic3RyID09IE5VTEwpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHN1YnN0cl9sZW4gPSBzdHJsZW4oc3Vic3RyKTsKKyAgICBuZXdfbGVuID0gbGVuICsgc3Vic3RyX2xlbjsKKyAgICBpZiAobmV3X2xlbiA+IGFsbG9jZWQpIHsKKyAgICAgIGNoYXIgKm5ld19idWY7CisKKyAgICAgIGlmIChhbGxvY2VkICsgMjAgKyAxIDwgYWxsb2NlZCkgeworICAgICAgICAvKiBvdmVyZmxvdy4gKi8KKyAgICAgICAgT1BFTlNTTF9mcmVlKGJ1Zik7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgYWxsb2NlZCA9IG5ld19sZW4gKyAyMDsKKyAgICAgIG5ld19idWYgPSBPUEVOU1NMX3JlYWxsb2MoYnVmLCBhbGxvY2VkICsgMSk7CisgICAgICBpZiAobmV3X2J1ZiA9PSBOVUxMKSB7CisgICAgICAgIE9QRU5TU0xfZnJlZShidWYpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBidWYgPSBuZXdfYnVmOworICAgIH0KKworICAgIG1lbWNweShidWYgKyBsZW4sIHN1YnN0ciwgc3Vic3RyX2xlbik7CisgICAgbGVuID0gbmV3X2xlbjsKKyAgfQorCisgIGJ1ZltsZW5dID0gMDsKKyAgZXJyX3NldF9lcnJvcl9kYXRhKGJ1ZiwgRVJSX0ZMQUdfTUFMTE9DRUQgfCBFUlJfRkxBR19TVFJJTkcpOworfQorCit2b2lkIEVSUl9hZGRfZXJyb3JfZGF0YSh1bnNpZ25lZCBjb3VudCwgLi4uKSB7CisgIHZhX2xpc3QgYXJnczsKKyAgdmFfc3RhcnQoYXJncywgY291bnQpOworICBlcnJfYWRkX2Vycm9yX3ZkYXRhKGNvdW50LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworfQorCit2b2lkIEVSUl9hZGRfZXJyb3JfZGF0YWYoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pIHsKKyAgdmFfbGlzdCBhcDsKKyAgY2hhciAqYnVmOworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgYnVmX2xlbiA9IDI1NjsKKworICAvKiBBIGZpeGVkLXNpemUgYnVmZmVyIGlzIHVzZWQgYmVjYXVzZSB2YV9jb3B5ICh3aGljaCB3b3VsZCBiZSBuZWVkZWQgaW4KKyAgICogb3JkZXIgdG8gY2FsbCB2c25wcmludGYgdHdpY2UgYW5kIG1lYXN1cmUgdGhlIGJ1ZmZlcikgd2Fzbid0IGRlZmluZWQgdW50aWwKKyAgICogQzk5LiAqLworICBidWYgPSBPUEVOU1NMX21hbGxvYyhidWZfbGVuICsgMSk7CisgIGlmIChidWYgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorCisgIHZhX3N0YXJ0KGFwLCBmb3JtYXQpOworICBCSU9fdnNucHJpbnRmKGJ1ZiwgYnVmX2xlbiwgZm9ybWF0LCBhcCk7CisgIGJ1ZltidWZfbGVuXSA9IDA7CisgIHZhX2VuZChhcCk7CisKKyAgZXJyX3NldF9lcnJvcl9kYXRhKGJ1ZiwgRVJSX0ZMQUdfTUFMTE9DRUQgfCBFUlJfRkxBR19TVFJJTkcpOworfQorCitpbnQgRVJSX3NldF9tYXJrKHZvaWQpIHsKKyAgRVJSX1NUQVRFICpjb25zdCBzdGF0ZSA9IGVycl9nZXRfc3RhdGUoKTsKKworICBpZiAoc3RhdGUtPmJvdHRvbSA9PSBzdGF0ZS0+dG9wKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgc3RhdGUtPmVycm9yc1tzdGF0ZS0+dG9wXS5mbGFncyB8PSBFUlJfRkxBR19NQVJLOworICByZXR1cm4gMTsKK30KKworaW50IEVSUl9wb3BfdG9fbWFyayh2b2lkKSB7CisgIEVSUl9TVEFURSAqY29uc3Qgc3RhdGUgPSBlcnJfZ2V0X3N0YXRlKCk7CisgIHN0cnVjdCBlcnJfZXJyb3Jfc3QgKmVycm9yOworCisgIHdoaWxlIChzdGF0ZS0+Ym90dG9tICE9IHN0YXRlLT50b3ApIHsKKyAgICBlcnJvciA9ICZzdGF0ZS0+ZXJyb3JzW3N0YXRlLT50b3BdOworCisgICAgaWYgKChlcnJvci0+ZmxhZ3MgJiBFUlJfRkxBR19NQVJLKSAhPSAwKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBlcnJfY2xlYXIoZXJyb3IpOworICAgIGlmIChzdGF0ZS0+dG9wID09IDApIHsKKyAgICAgIHN0YXRlLT50b3AgPSBFUlJfTlVNX0VSUk9SUyAtIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0YXRlLT50b3AtLTsKKyAgICB9CisgIH0KKworICBpZiAoc3RhdGUtPmJvdHRvbSA9PSBzdGF0ZS0+dG9wKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBlcnJvci0+ZmxhZ3MgJj0gfkVSUl9GTEFHX01BUks7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qga0xpYnJhcnlOYW1lc1tFUlJfTlVNX0xJQlNdID0geworICAgICJpbnZhbGlkIGxpYnJhcnkgKDApIiwKKyAgICAidW5rbm93biBsaWJyYXJ5IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRVJSX0xJQl9OT05FICovCisgICAgInN5c3RlbSBsaWJyYXJ5IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVSUl9MSUJfU1lTICovCisgICAgImJpZ251bSByb3V0aW5lcyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVSUl9MSUJfQk4gKi8KKyAgICAiUlNBIHJvdXRpbmVzIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRVJSX0xJQl9SU0EgKi8KKyAgICAiRGlmZmllLUhlbGxtYW4gcm91dGluZXMiLCAgICAgICAgICAgICAgICAgICAgLyogRVJSX0xJQl9ESCAqLworICAgICJwdWJsaWMga2V5IHJvdXRpbmVzIiwgICAgICAgICAgICAgICAgICAgICAgICAvKiBFUlJfTElCX0VWUCAqLworICAgICJtZW1vcnkgYnVmZmVyIHJvdXRpbmVzIiwgICAgICAgICAgICAgICAgICAgICAvKiBFUlJfTElCX0JVRiAqLworICAgICJvYmplY3QgaWRlbnRpZmllciByb3V0aW5lcyIsICAgICAgICAgICAgICAgICAvKiBFUlJfTElCX09CSiAqLworICAgICJQRU0gcm91dGluZXMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFUlJfTElCX1BFTSAqLworICAgICJEU0Egcm91dGluZXMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFUlJfTElCX0RTQSAqLworICAgICJYLjUwOSBjZXJ0aWZpY2F0ZSByb3V0aW5lcyIsICAgICAgICAgICAgICAgICAvKiBFUlJfTElCX1g1MDkgKi8KKyAgICAiQVNOLjEgZW5jb2Rpbmcgcm91dGluZXMiLCAgICAgICAgICAgICAgICAgICAgLyogRVJSX0xJQl9BU04xICovCisgICAgImNvbmZpZ3VyYXRpb24gZmlsZSByb3V0aW5lcyIsICAgICAgICAgICAgICAgIC8qIEVSUl9MSUJfQ09ORiAqLworICAgICJjb21tb24gbGliY3J5cHRvIHJvdXRpbmVzIiwgICAgICAgICAgICAgICAgICAvKiBFUlJfTElCX0NSWVBUTyAqLworICAgICJlbGxpcHRpYyBjdXJ2ZSByb3V0aW5lcyIsICAgICAgICAgICAgICAgICAgICAvKiBFUlJfTElCX0VDICovCisgICAgIlNTTCByb3V0aW5lcyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVSUl9MSUJfU1NMICovCisgICAgIkJJTyByb3V0aW5lcyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVSUl9MSUJfQklPICovCisgICAgIlBLQ1M3IHJvdXRpbmVzIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVSUl9MSUJfUEtDUzcgKi8KKyAgICAiUEtDUzggcm91dGluZXMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRVJSX0xJQl9QS0NTOCAqLworICAgICJYNTA5IFYzIHJvdXRpbmVzIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFUlJfTElCX1g1MDlWMyAqLworICAgICJQS0NTMTIgcm91dGluZXMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFUlJfTElCX1BLQ1MxMiAqLworICAgICJyYW5kb20gbnVtYmVyIGdlbmVyYXRvciIsICAgICAgICAgICAgICAgICAgICAvKiBFUlJfTElCX1JBTkQgKi8KKyAgICAiRU5HSU5FIHJvdXRpbmVzIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRVJSX0xJQl9FTkdJTkUgKi8KKyAgICAiT0NTUCByb3V0aW5lcyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRVJSX0xJQl9PQ1NQICovCisgICAgIlVJIHJvdXRpbmVzIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVSUl9MSUJfVUkgKi8KKyAgICAiQ09NUCByb3V0aW5lcyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRVJSX0xJQl9DT01QICovCisgICAgIkVDRFNBIHJvdXRpbmVzIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVSUl9MSUJfRUNEU0EgKi8KKyAgICAiRUNESCByb3V0aW5lcyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRVJSX0xJQl9FQ0RIICovCisgICAgIkhNQUMgcm91dGluZXMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVSUl9MSUJfSE1BQyAqLworICAgICJEaWdlc3QgZnVuY3Rpb25zIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFUlJfTElCX0RJR0VTVCAqLworICAgICJDaXBoZXIgZnVuY3Rpb25zIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFUlJfTElCX0NJUEhFUiAqLworICAgICJVc2VyIGRlZmluZWQgZnVuY3Rpb25zIiwgICAgICAgICAgICAgICAgICAgICAvKiBFUlJfTElCX1VTRVIgKi8KK307CisKKyNkZWZpbmUgTlVNX1NZU19FUlJOT1MgMTI3CisKKy8qIGtTdGF0aWNFcnJvcnMgcHJvdmlkZXMgc3RvcmFnZSBmb3IgRVJSX1NUUklOR19EQVRBIHZhbHVlcyB0aGF0IGFyZSBjcmVhdGVkCisgKiBhdCBpbml0IHRpbWUgYmVjYXVzZSB3ZSBhc3N1bWUgdGhhdCBFUlJfU1RSSU5HX0RBVEEgc3RydWN0dXJlcyBhcmVuJ3QKKyAqIGFsbG9jYXRlZCBvbiB0aGUgaGVhcC4gKi8KK3N0YXRpYyBFUlJfU1RSSU5HX0RBVEEga1N0YXRpY0Vycm9yc1tFUlJfTlVNX0xJQlMgKiAyICsgTlVNX1NZU19FUlJOT1NdOworCitzdGF0aWMgRVJSX1NUUklOR19EQVRBIGtHbG9iYWxFcnJvcnNbXSA9IHsKKyAgICB7RVJSX1JfTUFMTE9DX0ZBSUxVUkUsICJtYWxsb2MgZmFpbHVyZSJ9LAorICAgIHtFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQsICJmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZCJ9LAorICAgIHtFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIsICJwYXNzZWQgYSBudWxsIHBhcmFtZXRlciJ9LAorICAgIHtFUlJfUl9JTlRFUk5BTF9FUlJPUiwgImludGVybmFsIGVycm9yIn0sCisKKyAgICB7RVJSX1BBQ0soRVJSX0xJQl9TWVMsIFNZU19GX2ZvcGVuLCAwKSwgImZvcGVuIn0sCisgICAge0VSUl9QQUNLKEVSUl9MSUJfU1lTLCBTWVNfRl9mY2xvc2UsIDApLCAiZmNsb3NlIn0sCisgICAge0VSUl9QQUNLKEVSUl9MSUJfU1lTLCBTWVNfRl9mcmVhZCwgMCksICJmcmVhZCJ9LAorICAgIHtFUlJfUEFDSyhFUlJfTElCX1NZUywgU1lTX0ZfZndyaXRlLCAwKSwgImZ3cml0ZSJ9LAorICAgIHtFUlJfUEFDSyhFUlJfTElCX1NZUywgU1lTX0Zfc29ja2V0LCAwKSwgInNvY2tldCJ9LAorICAgIHtFUlJfUEFDSyhFUlJfTElCX1NZUywgU1lTX0Zfc2V0c29ja29wdCwgMCksICJzZXRzb2Nrb3B0In0sCisgICAge0VSUl9QQUNLKEVSUl9MSUJfU1lTLCBTWVNfRl9jb25uZWN0LCAwKSwgImNvbm5lY3QifSwKKyAgICB7RVJSX1BBQ0soRVJSX0xJQl9TWVMsIFNZU19GX2dldGFkZHJpbmZvLCAwKSwgImdldGFkZHJpbmZvIn0sCisKKyAgICB7MCwgTlVMTH0sCit9OworCisKK2V4dGVybiBjb25zdCBFUlJfU1RSSU5HX0RBVEEgQVNOMV9lcnJvcl9zdHJpbmdfZGF0YVtdOworZXh0ZXJuIGNvbnN0IEVSUl9TVFJJTkdfREFUQSBCSU9fZXJyb3Jfc3RyaW5nX2RhdGFbXTsKK2V4dGVybiBjb25zdCBFUlJfU1RSSU5HX0RBVEEgQk5fZXJyb3Jfc3RyaW5nX2RhdGFbXTsKK2V4dGVybiBjb25zdCBFUlJfU1RSSU5HX0RBVEEgQlVGX2Vycm9yX3N0cmluZ19kYXRhW107CitleHRlcm4gY29uc3QgRVJSX1NUUklOR19EQVRBIENJUEhFUl9lcnJvcl9zdHJpbmdfZGF0YVtdOworZXh0ZXJuIGNvbnN0IEVSUl9TVFJJTkdfREFUQSBDT05GX2Vycm9yX3N0cmluZ19kYXRhW107CitleHRlcm4gY29uc3QgRVJSX1NUUklOR19EQVRBIENSWVBUT19lcnJvcl9zdHJpbmdfZGF0YVtdOworZXh0ZXJuIGNvbnN0IEVSUl9TVFJJTkdfREFUQSBESF9lcnJvcl9zdHJpbmdfZGF0YVtdOworZXh0ZXJuIGNvbnN0IEVSUl9TVFJJTkdfREFUQSBESUdFU1RfZXJyb3Jfc3RyaW5nX2RhdGFbXTsKK2V4dGVybiBjb25zdCBFUlJfU1RSSU5HX0RBVEEgRFNBX2Vycm9yX3N0cmluZ19kYXRhW107CitleHRlcm4gY29uc3QgRVJSX1NUUklOR19EQVRBIEVDREhfZXJyb3Jfc3RyaW5nX2RhdGFbXTsKK2V4dGVybiBjb25zdCBFUlJfU1RSSU5HX0RBVEEgRUNEU0FfZXJyb3Jfc3RyaW5nX2RhdGFbXTsKK2V4dGVybiBjb25zdCBFUlJfU1RSSU5HX0RBVEEgRUNfZXJyb3Jfc3RyaW5nX2RhdGFbXTsKK2V4dGVybiBjb25zdCBFUlJfU1RSSU5HX0RBVEEgRVZQX2Vycm9yX3N0cmluZ19kYXRhW107CitleHRlcm4gY29uc3QgRVJSX1NUUklOR19EQVRBIE9CSl9lcnJvcl9zdHJpbmdfZGF0YVtdOworZXh0ZXJuIGNvbnN0IEVSUl9TVFJJTkdfREFUQSBQRU1fZXJyb3Jfc3RyaW5nX2RhdGFbXTsKK2V4dGVybiBjb25zdCBFUlJfU1RSSU5HX0RBVEEgUlNBX2Vycm9yX3N0cmluZ19kYXRhW107CitleHRlcm4gY29uc3QgRVJSX1NUUklOR19EQVRBIFg1MDlWM19lcnJvcl9zdHJpbmdfZGF0YVtdOworZXh0ZXJuIGNvbnN0IEVSUl9TVFJJTkdfREFUQSBYNTA5X2Vycm9yX3N0cmluZ19kYXRhW107CisKK3N0YXRpYyB2b2lkIGVycl9sb2FkX3N0cmluZ3Modm9pZCkgeworICB1bnNpZ25lZCBpLCBqID0gMDsKKworICBlcnJfZm5zX2NoZWNrKCk7CisKKyAgLyogVGhpcyBsb29wIGxvYWRzIHN0cmluZ3MgZm9yIHRoZSBsaWJyYXJpZXMgZm9yIHRoZSBFUlJfUl8qX0xJQgorICAgKiByZWFzb25zLiAqLworICBmb3IgKGkgPSBFUlJfTElCX05PTkU7IGkgPCBFUlJfTlVNX0xJQlM7IGkrKykgeworICAgIEVSUl9TVFJJTkdfREFUQSAqZGF0YSA9ICZrU3RhdGljRXJyb3JzW2orK107CisgICAgZGF0YS0+c3RyaW5nID0ga0xpYnJhcnlOYW1lc1tpXTsKKyAgICBkYXRhLT5lcnJvciA9IEVSUl9QQUNLKGksIDAsIDApOworICAgIEVSUkZOKHNldF9pdGVtKShkYXRhKTsKKworICAgIGRhdGEgPSAma1N0YXRpY0Vycm9yc1tqKytdOworICAgIGRhdGEtPnN0cmluZyA9IGtMaWJyYXJ5TmFtZXNbaV07CisgICAgZGF0YS0+ZXJyb3IgPSBFUlJfUEFDSygwLCAwLCBpKTsKKyAgICBFUlJGTihzZXRfaXRlbSkoZGF0YSk7CisgIH0KKworICBmb3IgKGkgPSAxOyBpIDwgMSArIE5VTV9TWVNfRVJSTk9TOyBpKyspIHsKKyAgICAvKiBUaGUgIlNZUyIgbGlicmFyeSBzZXRzIGVycm5vIHZhbHVlcyBhcyB0aGUgcmVhc29uIGZvciBpdHMgZXJyb3JzLgorICAgICAqIFRodXMgd2UgbG9hZCB0aGUgZmlyc3QgfE5VTV9TWVNfRVJSTk9TfCBlcnJubyBzdHJpbmdzIGFzIHRoZQorICAgICAqIHJlYXNvbiBzdHJpbmdzIGZvciB0aGF0IGxpYnJhcnkuICovCisKKyAgICBFUlJfU1RSSU5HX0RBVEEgKmRhdGEgPSAma1N0YXRpY0Vycm9yc1tqKytdOworICAgIGRhdGEtPnN0cmluZyA9IHN0cmVycm9yKGkpOworICAgIGRhdGEtPmVycm9yID0gRVJSX1BBQ0soRVJSX0xJQl9TWVMsIDAsIGkpOworICAgIEVSUkZOKHNldF9pdGVtKShkYXRhKTsKKyAgfQorCisgIEVSUl9sb2FkX3N0cmluZ3Moa0dsb2JhbEVycm9ycyk7CisKKyAgRVJSX2xvYWRfc3RyaW5ncyhBU04xX2Vycm9yX3N0cmluZ19kYXRhKTsKKyAgRVJSX2xvYWRfc3RyaW5ncyhCSU9fZXJyb3Jfc3RyaW5nX2RhdGEpOworICBFUlJfbG9hZF9zdHJpbmdzKEJOX2Vycm9yX3N0cmluZ19kYXRhKTsKKyAgRVJSX2xvYWRfc3RyaW5ncyhCVUZfZXJyb3Jfc3RyaW5nX2RhdGEpOworICBFUlJfbG9hZF9zdHJpbmdzKENJUEhFUl9lcnJvcl9zdHJpbmdfZGF0YSk7CisgIEVSUl9sb2FkX3N0cmluZ3MoQ09ORl9lcnJvcl9zdHJpbmdfZGF0YSk7CisgIEVSUl9sb2FkX3N0cmluZ3MoQ1JZUFRPX2Vycm9yX3N0cmluZ19kYXRhKTsKKyAgRVJSX2xvYWRfc3RyaW5ncyhESF9lcnJvcl9zdHJpbmdfZGF0YSk7CisgIEVSUl9sb2FkX3N0cmluZ3MoRElHRVNUX2Vycm9yX3N0cmluZ19kYXRhKTsKKyAgRVJSX2xvYWRfc3RyaW5ncyhEU0FfZXJyb3Jfc3RyaW5nX2RhdGEpOworICBFUlJfbG9hZF9zdHJpbmdzKEVDREhfZXJyb3Jfc3RyaW5nX2RhdGEpOworICBFUlJfbG9hZF9zdHJpbmdzKEVDRFNBX2Vycm9yX3N0cmluZ19kYXRhKTsKKyAgRVJSX2xvYWRfc3RyaW5ncyhFQ19lcnJvcl9zdHJpbmdfZGF0YSk7CisgIEVSUl9sb2FkX3N0cmluZ3MoRVZQX2Vycm9yX3N0cmluZ19kYXRhKTsKKyAgRVJSX2xvYWRfc3RyaW5ncyhPQkpfZXJyb3Jfc3RyaW5nX2RhdGEpOworICBFUlJfbG9hZF9zdHJpbmdzKFBFTV9lcnJvcl9zdHJpbmdfZGF0YSk7CisgIEVSUl9sb2FkX3N0cmluZ3MoUlNBX2Vycm9yX3N0cmluZ19kYXRhKTsKKyAgRVJSX2xvYWRfc3RyaW5ncyhYNTA5VjNfZXJyb3Jfc3RyaW5nX2RhdGEpOworICBFUlJfbG9hZF9zdHJpbmdzKFg1MDlfZXJyb3Jfc3RyaW5nX2RhdGEpOworfQorCit2b2lkIEVSUl9sb2FkX3N0cmluZ3MoY29uc3QgRVJSX1NUUklOR19EQVRBICpzdHIpIHsKKyAgZXJyX2Zuc19jaGVjaygpOworCisgIHdoaWxlIChzdHItPmVycm9yKSB7CisgICAgRVJSRk4oc2V0X2l0ZW0pKHN0cik7CisgICAgc3RyKys7CisgIH0KK30KKwordm9pZCBFUlJfbG9hZF9jcnlwdG9fc3RyaW5ncygpIHsgZXJyX2xvYWRfc3RyaW5ncygpOyB9CisKK3ZvaWQgRVJSX2ZyZWVfc3RyaW5ncygpIHsKKyAgZXJyX2Zuc19jaGVjaygpOworICBFUlJGTihzaHV0ZG93bikoKTsKK30KKwordm9pZCBFUlJfbG9hZF9CSU9fc3RyaW5ncygpIHt9CmRpZmYgLS1naXQgYS9jcnlwdG8vZXJyL2Vyci5oIGIvY3J5cHRvL2Vyci9lcnIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTFiYzliCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2Vyci9lcnIuaApAQCAtMCwwICsxLDQ5NiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4gKi8KKworI2lmbmRlZiBPUEVOU1NMX0hFQURFUl9FUlJfSAorI2RlZmluZSBPUEVOU1NMX0hFQURFUl9FUlJfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9iYXNlLmg+CisjaW5jbHVkZSA8b3BlbnNzbC90aHJlYWQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2xoYXNoLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBFcnJvciBxdWV1ZSBoYW5kbGluZyBmdW5jdGlvbnMuCisgKgorICogRXJyb3JzIGluIE9wZW5TU0wgYXJlIGdlbmVyYWxseSBzaWduYWxsZWQgYnkgdGhlIHJldHVybiB2YWx1ZSBvZiBhIGZ1bmN0aW9uLgorICogV2hlbiBhIGZ1bmN0aW9uIGZhaWxzIGl0IG1heSBhZGQgYW4gZW50cnkgdG8gYSBwZXItdGhyZWFkIGVycm9yIHF1ZXVlLAorICogd2hpY2ggaXMgbWFuYWdlZCBieSB0aGUgZnVuY3Rpb25zIGluIHRoaXMgaGVhZGVyLgorICoKKyAqIEVhY2ggZXJyb3IgY29udGFpbnM6CisgKiAgIDEpIFRoZSBsaWJyYXJ5IChpLmUuIGVjLCBwZW0sIHJzYSkgd2hpY2ggY3JlYXRlZCBpdC4KKyAqICAgMikgQSBmdW5jdGlvbiBpZGVudGlmaWVyIGFuZCByZWFzb24gY29kZS4KKyAqICAgMykgVGhlIGZpbGUgYW5kIGxpbmUgbnVtYmVyIG9mIHRoZSBjYWxsIHRoYXQgYWRkZWQgdGhlIGVycm9yLgorICogICA0KSBBIHBvaW50ZXIgdG8gc29tZSBlcnJvciBzcGVjaWZpYyBkYXRhLCB3aGljaCBtYXkgYmUgTlVMTC4KKyAqCisgKiBUaGUgbGlicmFyeSBpZGVudGlmaWVyLCBmdW5jdGlvbiBpZGVudGlmaWVyIGFuZCByZWFzb24gY29kZSBhcmUgcGFja2VkIGluIGEKKyAqIHVpbnQzMl90IGFuZCB0aGVyZSBleGlzdCB2YXJpb3VzIGZ1bmN0aW9ucyBmb3IgdW5wYWNraW5nIGl0LgorICoKKyAqIFRoZSB0eXBpY2FsIGJlaGF2aW91ciBpcyB0aGF0IGFuIGVycm9yIHdpbGwgb2NjdXIgZGVlcCBpbiBhIGNhbGwgcXVldWUgYW5kCisgKiB0aGF0IGNvZGUgd2lsbCBwdXNoIGFuIGVycm9yIG9udG8gdGhlIGVycm9yIHF1ZXVlLiBBcyB0aGUgZXJyb3IgcXVldWUKKyAqIHVud2luZHMsIG90aGVyIGZ1bmN0aW9ucyB3aWxsIHB1c2ggdGhlaXIgb3duIGVycm9ycy4gVGh1cywgdGhlICJsZWFzdAorICogcmVjZW50IiBlcnJvciBpcyB0aGUgbW9zdCBzcGVjaWZpYyBhbmQgdGhlIG90aGVyIGVycm9ycyB3aWxsIHByb3ZpZGUgYQorICogYmFja3RyYWNlIG9mIHNvcnRzLiAqLworCisKKy8qIFN0YXJ0dXAgYW5kIHNodXRkb3duLiAqLworCisvKiBFUlJfbG9hZF9jcnlwdG9fc3RyaW5ncyBpbml0aWFsaXNlcyB0aGUgZXJyb3Igc3RyaW5nIGhhc2ggd2l0aCBidWlsdGluCisgKiB2YWx1ZXMuIElmIHRoaXMgaXMgbm90IGNhbGxlZCB0aGVuIHRoZSBzdHJpbmcgZm9ybXMgb2YgZXJyb3JzIHByb2R1Y2VkIGJ5CisgKiB0aGUgZnVuY3Rpb25zIGJlbG93IHdpbGwgY29udGFpbiBudW1lcmljIGlkZW50aWZpZXJzIHJhdGhlciB0aGFuCisgKiBodW1hbi1yZWFkYWJsZSBzdHJpbmdzLiAqLwordm9pZCBFUlJfbG9hZF9jcnlwdG9fc3RyaW5ncygpOworCisvKiBFUlJfZnJlZV9zdHJpbmdzIGZyZWVzIGFueSBpbnRlcm5hbCBlcnJvciB2YWx1ZXMgdGhhdCBoYXZlIGJlZW4gbG9hZGVkLiBUaGlzCisgKiBzaG91bGQgb25seSBiZSBjYWxsZWQgYXQgcHJvY2VzcyBzaHV0ZG93bi4gKi8KK3ZvaWQgRVJSX2ZyZWVfc3RyaW5ncygpOworCisKKy8qIFJlYWRpbmcgYW5kIGZvcm1hdHRpbmcgZXJyb3JzLiAqLworCisvKiBFUlJfZ2V0X2Vycm9yIGdldHMgdGhlIHBhY2tlZCBlcnJvciBjb2RlIGZvciB0aGUgbGVhc3QgcmVjZW50IGVycm9yIGFuZAorICogcmVtb3ZlcyB0aGF0IGVycm9yIGZyb20gdGhlIHF1ZXVlLiBJZiB0aGVyZSBhcmUgbm8gZXJyb3JzIGluIHRoZSBxdWV1ZSB0aGVuCisgKiBpdCByZXR1cm5zIHplcm8uICovCit1aW50MzJfdCBFUlJfZ2V0X2Vycm9yKHZvaWQpOworCisvKiBFUlJfZ2V0X2Vycm9yX2xpbmUgYWN0cyBsaWtlIHxFUlJfZ2V0X2Vycm9yfCwgZXhjZXB0IHRoYXQgdGhlIGZpbGUgYW5kIGxpbmUKKyAqIG51bWJlciBvZiB0aGUgY2FsbCB0aGF0IGFkZGVkIHRoZSBlcnJvciBhcmUgYWxzbyByZXR1cm5lZC4gKi8KK3VpbnQzMl90IEVSUl9nZXRfZXJyb3JfbGluZShjb25zdCBjaGFyICoqZmlsZSwgaW50ICpsaW5lKTsKKworLyogRVJSX2dldF9lcnJvcl9saW5lX2RhdGEgYWN0cyBsaWtlIHxFUlJfZ2V0X2Vycm9yX2xpbmV8LCBidXQgYWxzbyByZXR1cm5zIHRoZQorICogZXJyb3Itc3BlY2lmaWMgZGF0YSBwb2ludGVyIGFuZCBmbGFncy4gVGhlIGZsYWdzIGFyZSBhIGJpdHdpc2UtT1Igb2YKKyAqIHxFUlJfRkxBR18qfCB2YWx1ZXMuICovCit1aW50MzJfdCBFUlJfZ2V0X2Vycm9yX2xpbmVfZGF0YShjb25zdCBjaGFyICoqZmlsZSwgaW50ICpsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKmRhdGEsIGludCAqZmxhZ3MpOworCisvKiBUaGUgInBlZWsiIGZ1bmN0aW9ucyBhY3QgbGlrZSB0aGUgfEVSUl9nZXRfZXJyb3J8IGZ1bmN0aW9ucywgYWJvdmUsIGJ1dCB0aGV5CisgKiBkbyBub3QgcmVtb3ZlIHRoZSBlcnJvciBmcm9tIHRoZSBxdWV1ZS4gKi8KK3VpbnQzMl90IEVSUl9wZWVrX2Vycm9yKHZvaWQpOwordWludDMyX3QgRVJSX3BlZWtfZXJyb3JfbGluZShjb25zdCBjaGFyICoqZmlsZSwgaW50ICpsaW5lKTsKK3VpbnQzMl90IEVSUl9wZWVrX2Vycm9yX2xpbmVfZGF0YShjb25zdCBjaGFyICoqZmlsZSwgaW50ICpsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipkYXRhLCBpbnQgKmZsYWdzKTsKKworLyogVGhlICJwZWVrIGxhc3QiIGZ1bmN0aW9ucyBhY3QgbGlrZSB0aGUgInBlZWsiIGZ1bmN0aW9ucywgYWJvdmUsIGV4Y2VwdCB0aGF0CisgKiB0aGV5IHJldHVybiB0aGUgbW9zdCByZWNlbnQgZXJyb3IuICovCit1aW50MzJfdCBFUlJfcGVla19sYXN0X2Vycm9yKHZvaWQpOwordWludDMyX3QgRVJSX3BlZWtfbGFzdF9lcnJvcl9saW5lKGNvbnN0IGNoYXIgKipmaWxlLCBpbnQgKmxpbmUpOwordWludDMyX3QgRVJSX3BlZWtfbGFzdF9lcnJvcl9saW5lX2RhdGEoY29uc3QgY2hhciAqKmZpbGUsIGludCAqbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipkYXRhLCBpbnQgKmZsYWdzKTsKKworLyogRVJSX2Vycm9yX3N0cmluZyBnZW5lcmF0ZXMgYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcgcmVwcmVzZW50aW5nCisgKiB8cGFja2VkX2Vycm9yfCwgcGxhY2VzIGl0IGF0IHxidWZ8ICh3aGljaCBtdXN0IGJlIGF0IGxlYXN0CisgKiBFUlJfRVJST1JfU1RSSU5HX0JVRl9MRU4gYnl0ZXMgbG9uZykgYW5kIHJldHVybnMgfGJ1ZnwuIElmIHxidWZ8IGlzIE5VTEwsCisgKiB0aGUgZXJyb3Igc3RyaW5nIGlzIHBsYWNlZCBpbiBhIHN0YXRpYyBidWZmZXIgd2hpY2ggaXMgcmV0dXJuZWQuIChUaGUgc3RhdGljCisgKiBidWZmZXIgbWF5IGJlIG92ZXJyaWRkZW4gYnkgY29uY3VycmVudCBjYWxscyBpbiBvdGhlciB0aHJlYWRzIHNvIHRoaXMgZm9ybQorICogaXMgZGVwcmVjYXRlZC4pCisgKgorICogVGhlIHN0cmluZyB3aWxsIGhhdmUgdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisgKgorICogICBlcnJvcjpbZXJyb3IgY29kZV06W2xpYnJhcnkgbmFtZV06W2Z1bmN0aW9uIG5hbWVdOltyZWFzb24gc3RyaW5nXQorICoKKyAqIGVycm9yIGNvZGUgaXMgYW4gOCBkaWdpdCBoZXhhZGVjaW1hbCBudW1iZXI7IGxpYnJhcnkgbmFtZSwgZnVuY3Rpb24gbmFtZQorICogYW5kIHJlYXNvbiBzdHJpbmcgYXJlIEFTQ0lJIHRleHQuCisgKgorICogVE9ETyhmb3JrKTogcmVtb3ZlIGluIGZhdm91ciBvZiB8RVJSX2Vycm9yX3N0cmluZ19ufC4gKi8KK2NoYXIgKkVSUl9lcnJvcl9zdHJpbmcodWludDMyX3QgcGFja2VkX2Vycm9yLCBjaGFyICpidWYpOworI2RlZmluZSBFUlJfRVJST1JfU1RSSU5HX0JVRl9MRU4gMjU2CisKKy8qIEVSUl9lcnJvcl9zdHJpbmdfbiBpcyBhIHZhcmlhbnQgb2YgfEVSUl9lcnJvcl9zdHJpbmd8IHRoYXQgd3JpdGVzIGF0IG1vc3QKKyAqIGxlbiBjaGFyYWN0ZXJzIChpbmNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nIE5VTCkgYW5kIHRydW5jYXRlcyB0aGUgc3RyaW5nIGlmCisgKiBuZWNlc3NhcnkuIElmIHxsZW58IGlzIGdyZWF0ZXIgdGhhbiB6ZXJvIHRoZW4gfGJ1ZnwgaXMgYWx3YXlzIE5VTAorICogdGVybWluYXRlZC4gKi8KK3ZvaWQgRVJSX2Vycm9yX3N0cmluZ19uKHVpbnQzMl90IHBhY2tlZF9lcnJvciwgY2hhciAqYnVmLCBzaXplX3QgbGVuKTsKKworLyogRVJSX2xpYl9lcnJvcl9zdHJpbmcgcmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGlicmFyeSB0aGF0CisgKiBnZW5lcmF0ZWQgfHBhY2tlZF9lcnJvcnwuICovCitjb25zdCBjaGFyICpFUlJfbGliX2Vycm9yX3N0cmluZyh1aW50MzJfdCBwYWNrZWRfZXJyb3IpOworCisvKiBFUlJfZnVuY19lcnJvcl9zdHJpbmcgcmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZnVuY3Rpb24gdGhhdAorICogZ2VuZXJhdGVkIHxwYWNrZWRfZXJyb3J8LiAqLworY29uc3QgY2hhciAqRVJSX2Z1bmNfZXJyb3Jfc3RyaW5nKHVpbnQzMl90IHBhY2tlZF9lcnJvcik7CisKKy8qIEVSUl9yZWFzb25fZXJyb3Jfc3RyaW5nIHJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlYXNvbiBmb3IKKyAqIHxwYWNrZWRfZXJyb3J8LiAqLworY29uc3QgY2hhciAqRVJSX3JlYXNvbl9lcnJvcl9zdHJpbmcodWludDMyX3QgcGFja2VkX2Vycm9yKTsKKworLyogRVJSX3ByaW50X2Vycm9yc19jYWxsYmFja190IGlzIHRoZSB0eXBlIG9mIGEgZnVuY3Rpb24gdXNlZCBieQorICogfEVSUl9wcmludF9lcnJvcnNfY2J8LiBJdCB0YWtlcyBhIHBvaW50ZXIgdG8gYSBodW1hbiByZWFkYWJsZSBzdHJpbmcgKGFuZAorICogaXRzIGxlbmd0aCkgdGhhdCBkZXNjcmliZXMgYW4gZW50cnkgaW4gdGhlIGVycm9yIHF1ZXVlLiBUaGUgfGN0eHwgYXJndW1lbnQKKyAqIGlzIGFuIG9wYXF1ZSBwb2ludGVyIGdpdmVuIHRvIHxFUlJfcHJpbnRfZXJyb3JzX2NifC4KKyAqCisgKiBJdCBzaG91bGQgcmV0dXJuIG9uZSBvbiBzdWNjZXNzIG9yIHplcm8gb24gZXJyb3IsIHdoaWNoIHdpbGwgc3RvcCB0aGUKKyAqIGl0ZXJhdGlvbiBvdmVyIHRoZSBlcnJvciBxdWV1ZS4gKi8KK3R5cGVkZWYgaW50ICgqRVJSX3ByaW50X2Vycm9yc19jYWxsYmFja190KShjb25zdCBjaGFyICpzdHIsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY3R4KTsKKworLyogRVJSX3ByaW50X2Vycm9yc19jYiBjYWxscyB8Y2FsbGJhY2t8IHdpdGggYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgZWFjaAorICogZXJyb3IgaW4gdGhlIGN1cnJlbnQgdGhyZWFkJ3MgZXJyb3IgcXVldWUsIGZyb20gdGhlIGxlYXN0IHJlY2VudCB0byB0aGUgbW9zdAorICogcmVjZW50IGVycm9yLgorICoKKyAqIFRoZSBzdHJpbmcgd2lsbCBoYXZlIHRoZSBmb2xsb3dpbmcgZm9ybWF0ICh3aGljaCBkaWZmZXJzIGZyb20KKyAqIHxFUlJfZXJyb3Jfc3RyaW5nfCk6CisgKgorICogICBbdGhyZWFkIGlkXTplcnJvcjpbZXJyb3IgY29kZV06W2xpYnJhcnkgbmFtZV06W2Z1bmN0aW9uIG5hbWVdOgorICogICBbcmVhc29uIHN0cmluZ106W2ZpbGVdOltsaW5lIG51bWJlcl06W29wdGlvbmFsIHN0cmluZyBkYXRhXQorICoKKyAqIChBbGwgaW4gb25lIGxpbmUuKQorICoKKyAqIFRoZSBjYWxsYmFjayBjYW4gcmV0dXJuIG9uZSB0byBjb250aW51ZSB0aGUgaXRlcmF0aW9uIG9yIHplcm8gdG8gc3RvcCBpdC4KKyAqIFRoZSB8Y3R4fCBhcmd1bWVudCBpcyBhbiBvcGFxdWUgdmFsdWUgdGhhdCBpcyBwYXNzZWQgdGhyb3VnaCB0byB0aGUKKyAqIGNhbGxiYWNrLiAqLwordm9pZCBFUlJfcHJpbnRfZXJyb3JzX2NiKEVSUl9wcmludF9lcnJvcnNfY2FsbGJhY2tfdCBjYWxsYmFjaywgdm9pZCAqY3R4KTsKKworCisvKiBDbGVhcmluZyBlcnJvcnMuICovCisKKy8qIEVSUl9jbGVhcl9lcnJvciBjbGVhcnMgdGhlIGVycm9yIHF1ZXVlIGZvciB0aGUgY3VycmVudCB0aHJlYWQuICovCit2b2lkIEVSUl9jbGVhcl9lcnJvcih2b2lkKTsKKworCisvKiBQcml2YXRlIGZ1bmN0aW9ucy4gKi8KKworLyogRVJSX2NsZWFyX3N5c3RlbV9lcnJvciBjbGVhcnMgdGhlIHN5c3RlbSdzIGVycm9yIHZhbHVlIChpLmUuIGVycm5vKS4gKi8KK3ZvaWQgRVJSX2NsZWFyX3N5c3RlbV9lcnJvcih2b2lkKTsKKworLyogT1BFTlNTTF9QVVRfRVJST1IgaXMgdXNlZCBieSBPcGVuU1NMIGNvZGUgdG8gYWRkIGFuIGVycm9yIHRvIHRoZSBlcnJvcgorICogcXVldWUuICovCisjZGVmaW5lIE9QRU5TU0xfUFVUX0VSUk9SKGxpYnJhcnksIGZ1bmMsIHJlYXNvbikgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFUlJfcHV0X2Vycm9yKEVSUl9MSUJfIyNsaWJyYXJ5LCBsaWJyYXJ5IyNfRl8jI2Z1bmMsIHJlYXNvbiwgX19GSUxFX18sIFwKKyAgICAgICAgICAgICAgICBfX0xJTkVfXykKKworLyogT1BFTlNTTF9QVVRfU1lTVEVNX0VSUk9SIGlzIHVzZWQgYnkgT3BlblNTTCBjb2RlIHRvIGFkZCBhbiBlcnJvciBmcm9tIHRoZQorICogb3BlcmF0aW5nIHN5c3RlbSB0byB0aGUgZXJyb3IgcXVldWUuICovCisvKiBUT0RPKGZvcmspOiBpbmNsdWRlIGVycm5vLiAqLworI2RlZmluZSBPUEVOU1NMX1BVVF9TWVNURU1fRVJST1IoZnVuYykgXAorICBFUlJfcHV0X2Vycm9yKEVSUl9MSUJfU1lTLCBTWVNfRl8jI2Z1bmMsIDAsIF9fRklMRV9fLCBfX0xJTkVfXyk7CisKKy8qIEVSUl9wdXRfZXJyb3IgYWRkcyBhbiBlcnJvciB0byB0aGUgZXJyb3IgcXVldWUsIGRyb3BwaW5nIHRoZSBsZWFzdCByZWNlbnQKKyAqIGVycm9yIGlmIG5lY2Nlc3NhcnkgZm9yIHNwYWNlIHJlYXNvbnMuICovCit2b2lkIEVSUl9wdXRfZXJyb3IoaW50IGxpYnJhcnksIGludCBmdW5jLCBpbnQgcmVhc29uLCBjb25zdCBjaGFyICpmaWxlLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxpbmUpOworCisvKiBFUlJfYWRkX2Vycm9yX2RhdGEgdGFrZXMgYSB2YXJpYWJsZSBudW1iZXIgKHxjb3VudHwpIG9mIGNvbnN0IGNoYXIqCisgKiBwb2ludGVycywgY29uY2F0ZW5hdGVzIHRoZW0gYW5kIHNldHMgdGhlIHJlc3VsdCBhcyB0aGUgZGF0YSBvbiB0aGUgbW9zdAorICogcmVjZW50IGVycm9yLiAqLwordm9pZCBFUlJfYWRkX2Vycm9yX2RhdGEodW5zaWduZWQgY291bnQsIC4uLik7CisKKy8qIEVSUl9hZGRfZXJyb3JfZGF0YWYgdGFrZXMgYSBwcmludGYtc3R5bGUgZm9ybWF0IGFuZCBhcmd1bWVudHMsIGFuZCBzZXRzIHRoZQorICogcmVzdWx0IGFzIHRoZSBkYXRhIG9uIHRoZSBtb3N0IHJlY2VudCBlcnJvci4gKi8KK3ZvaWQgRVJSX2FkZF9lcnJvcl9kYXRhZihjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CisKKy8qIEVSUl9zZXRfbWFyayAibWFya3MiIHRoZSBtb3N0IHJlY2VudCBlcnJvciBmb3IgdXNlIHdpdGggfEVSUl9wb3BfdG9fbWFya3wuCisgKiBJdCByZXR1cm5zIG9uZSBpZiBhbiBlcnJvciB3YXMgbWFya2VkIGFuZCB6ZXJvIGlmIHRoZXJlIGFyZSBubyBlcnJvcnMuICovCitpbnQgRVJSX3NldF9tYXJrKHZvaWQpOworCisvKiBFUlJfcG9wX3RvX21hcmsgcmVtb3ZlcyBlcnJvcnMgZnJvbSB0aGUgbW9zdCByZWNlbnQgdG8gdGhlIGxlYXN0IHJlY2VudAorICogdW50aWwgKGFuZCBub3QgaW5jbHVkaW5nKSBhICJtYXJrZWQiIGVycm9yLiBJdCByZXR1cm5zIHplcm8gaWYgbm8gbWFya2VkCisgKiBlcnJvciB3YXMgZm91bmQgKGFuZCB0aHVzIGFsbCBlcnJvcnMgd2VyZSByZW1vdmVkKSBhbmQgb25lIG90aGVyd2lzZS4gRXJyb3JzCisgKiBhcmUgbWFya2VkIHVzaW5nIHxFUlJfc2V0X21hcmt8LiAqLworaW50IEVSUl9wb3BfdG9fbWFyayh2b2lkKTsKKworc3RydWN0IGVycl9lcnJvcl9zdCB7CisgIC8qIGZpbGUgY29udGFpbnMgdGhlIGZpbGVuYW1lIHdoZXJlIHRoZSBlcnJvciBvY2N1cmVkLiAqLworICBjb25zdCBjaGFyICpmaWxlOworICAvKiBkYXRhIGNvbnRhaW5zIG9wdGlvbmFsIGRhdGEuIEl0IG11c3QgYmUgZnJlZWQgd2l0aCB8T1BFTlNTTF9mcmVlfCBpZgorICAgKiB8ZmxhZ3MmRVJSX0ZMQUdfTUFMTE9DRUR8LiAqLworICBjaGFyICpkYXRhOworICAvKiBwYWNrZWQgY29udGFpbnMgdGhlIGVycm9yIGxpYnJhcnksIGZ1bmN0aW9uIGFuZCByZWFzb24sIGFzIHBhY2tlZCBieQorICAgKiBFUlJfUEFDSy4gKi8KKyAgdWludDMyX3QgcGFja2VkOworICAvKiBsaW5lIGNvbnRhaW5zIHRoZSBsaW5lIG51bWJlciB3aGVyZSB0aGUgZXJyb3Igb2NjdXJlZC4gKi8KKyAgdWludDE2X3QgbGluZTsKKyAgLyogZmxhZ3MgY29udGFpbnMgYSBiaXR3aXNlLU9SIG9mIEVSUl9GTEFHXyogdmFsdWVzLiAqLworICB1aW50OF90IGZsYWdzOworfTsKKworLyogRVJSX0ZMQUdfTUFMTE9DRUQgbWVhbnMgdGhlIHRoZSB8ZGF0YXwgbWVtYmVyIG11c3QgYmUgZnJlZWQgd2hlbiBubyBsb25nZXIKKyAqIG5lZWRlZC4gKi8KKyNkZWZpbmUgRVJSX0ZMQUdfTUFMTE9DRUQgMQorLyogRVJSX0ZMQUdfU1RSSU5HIG1lYW5zIHRoYXQgdGhlIHxkYXRhfCBtZW1iZXIgaXMgYSBOVUwtdGVybWluYXRlZCBzdHJpbmcgdGhhdAorICogY2FuIGJlIHByaW50ZWQuICovCisjZGVmaW5lIEVSUl9GTEFHX1NUUklORyAyCisKKy8qIEVSUl9GTEFHX1BVQkxJQ19NQVNLIGlzIGFwcGxpZWQgdG8gdGhlIGZsYWdzIGZpZWxkIGJlZm9yZSBpdCBpcyByZXR1cm5lZAorICogZnJvbSBmdW5jdGlvbnMgbGlrZSB8RVJSX2dldF9lcnJvcl9saW5lX2RhdGF8LiAqLworI2RlZmluZSBFUlJfRkxBR19QVUJMSUNfTUFTSyAweGYKKworLyogVGhlIGZvbGxvd2luZyBmbGFnIHZhbHVlcyBhcmUgaW50ZXJuYWwgYW5kIGFyZSBtYXNrZWQgd2hlbiBmbGFncyBhcmUKKyAqIHJldHVybmVkIGZyb20gZnVuY3Rpb25zIGxpa2UgfEVSUl9nZXRfZXJyb3JfbGluZV9kYXRhfC4gKi8KKworLyogRVJSX0ZMQUdfTUFSSyBpcyB1c2VkIHRvIGluZGljYXRlIGEgcmV2ZXJzaW9uIHBvaW50IGluIHRoZSBxdWV1ZS4gU2VlCisgKiB8RVJSX3BvcF90b19tYXJrfC4gKi8KKyNkZWZpbmUgRVJSX0ZMQUdfTUFSSyAxNgorCisvKiBFUlJfTlVNX0VSUk9SUyBpcyB0aGUgbGltaXQgb2YgdGhlIG51bWJlciBvZiBlcnJvcnMgaW4gdGhlIHF1ZXVlLiAqLworI2RlZmluZSBFUlJfTlVNX0VSUk9SUyAxNgorCisvKiBFUlJfU1RBVEUgY29udGFpbnMgdGhlIHBlci10aHJlYWQsIGVycm9yIHF1ZXVlLiAqLwordHlwZWRlZiBzdHJ1Y3QgZXJyX3N0YXRlX3N0IHsKKyAgLyogdGlkIGlzIHRoZSBpZGVudGlmaWVyIG9mIHRoZSB0aHJlYWQgdGhhdCBvd25zIHRoaXMgcXVldWUuICovCisgIENSWVBUT19USFJFQURJRCB0aWQ7CisKKyAgLyogZXJyb3JzIGNvbnRhaW5zIHRoZSBFUlJfTlVNX0VSUk9SUyBtb3N0IHJlY2VudCBlcnJvcnMsIG9yZ2FuaXNlZCBhcyBhIHJpbmcKKyAgICogYnVmZmVyLiAqLworICBzdHJ1Y3QgZXJyX2Vycm9yX3N0IGVycm9yc1tFUlJfTlVNX0VSUk9SU107CisgIC8qIHRvcCBjb250YWlucyB0aGUgaW5kZXggb25lIHBhc3QgdGhlIG1vc3QgcmVjZW50IGVycm9yLiBJZiB8dG9wfCBlcXVhbHMKKyAgICogfGJvdHRvbXwgdGhlbiB0aGUgcXVldWUgaXMgZW1wdHkuICovCisgIHVuc2lnbmVkIHRvcDsKKyAgLyogYm90dG9tIGNvbnRhaW5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBlcnJvciBpbiB0aGUgcXVldWUuICovCisgIHVuc2lnbmVkIGJvdHRvbTsKK30gRVJSX1NUQVRFOworCitlbnVtIHsKKyAgRVJSX0xJQl9OT05FID0gMSwKKyAgRVJSX0xJQl9TWVMsCisgIEVSUl9MSUJfQk4sCisgIEVSUl9MSUJfUlNBLAorICBFUlJfTElCX0RILAorICBFUlJfTElCX0VWUCwKKyAgRVJSX0xJQl9CVUYsCisgIEVSUl9MSUJfT0JKLAorICBFUlJfTElCX1BFTSwKKyAgRVJSX0xJQl9EU0EsCisgIEVSUl9MSUJfWDUwOSwKKyAgRVJSX0xJQl9BU04xLAorICBFUlJfTElCX0NPTkYsCisgIEVSUl9MSUJfQ1JZUFRPLAorICBFUlJfTElCX0VDLAorICBFUlJfTElCX1NTTCwKKyAgRVJSX0xJQl9CSU8sCisgIEVSUl9MSUJfUEtDUzcsCisgIEVSUl9MSUJfUEtDUzgsCisgIEVSUl9MSUJfWDUwOVYzLAorICBFUlJfTElCX1BLQ1MxMiwKKyAgRVJSX0xJQl9SQU5ELAorICBFUlJfTElCX0VOR0lORSwKKyAgRVJSX0xJQl9PQ1NQLAorICBFUlJfTElCX1VJLAorICBFUlJfTElCX0NPTVAsCisgIEVSUl9MSUJfRUNEU0EsCisgIEVSUl9MSUJfRUNESCwKKyAgRVJSX0xJQl9ITUFDLAorICBFUlJfTElCX0RJR0VTVCwKKyAgRVJSX0xJQl9DSVBIRVIsCisgIEVSUl9MSUJfVVNFUiwKKyAgRVJSX05VTV9MSUJTCit9OworCisjZGVmaW5lIEVSUl9SX1NZU19MSUIgRVJSX0xJQl9TWVMKKyNkZWZpbmUgRVJSX1JfQk5fTElCIEVSUl9MSUJfQk4KKyNkZWZpbmUgRVJSX1JfUlNBX0xJQiBFUlJfTElCX1JTQQorI2RlZmluZSBFUlJfUl9ESF9MSUIgRVJSX0xJQl9ESAorI2RlZmluZSBFUlJfUl9FVlBfTElCIEVSUl9MSUJfRVZQCisjZGVmaW5lIEVSUl9SX0JVRl9MSUIgRVJSX0xJQl9CVUYKKyNkZWZpbmUgRVJSX1JfT0JKX0xJQiBFUlJfTElCX09CSgorI2RlZmluZSBFUlJfUl9QRU1fTElCIEVSUl9MSUJfUEVNCisjZGVmaW5lIEVSUl9SX0RTQV9MSUIgRVJSX0xJQl9EU0EKKyNkZWZpbmUgRVJSX1JfWDUwOV9MSUIgRVJSX0xJQl9YNTA5CisjZGVmaW5lIEVSUl9SX0FTTjFfTElCIEVSUl9MSUJfQVNOMQorI2RlZmluZSBFUlJfUl9DT05GX0xJQiBFUlJfTElCX0NPTkYKKyNkZWZpbmUgRVJSX1JfQ1JZUFRPX0xJQiBFUlJfTElCX0NSWVBUTworI2RlZmluZSBFUlJfUl9FQ19MSUIgRVJSX0xJQl9FQworI2RlZmluZSBFUlJfUl9TU0xfTElCIEVSUl9MSUJfU1NMCisjZGVmaW5lIEVSUl9SX0JJT19MSUIgRVJSX0xJQl9CSU8KKyNkZWZpbmUgRVJSX1JfUEtDUzdfTElCIEVSUl9MSUJfUEtDUzcKKyNkZWZpbmUgRVJSX1JfUEtDUzhfTElCIEVSUl9MSUJfUEtDUzgKKyNkZWZpbmUgRVJSX1JfWDUwOVYzX0xJQiBFUlJfTElCX1g1MDlWMworI2RlZmluZSBFUlJfUl9QS0NTMTJfTElCIEVSUl9MSUJfUEtDUzEyCisjZGVmaW5lIEVSUl9SX1JBTkRfTElCIEVSUl9MSUJfUkFORAorI2RlZmluZSBFUlJfUl9EU09fTElCIEVSUl9MSUJfRFNPCisjZGVmaW5lIEVSUl9SX0VOR0lORV9MSUIgRVJSX0xJQl9FTkdJTkUKKyNkZWZpbmUgRVJSX1JfT0NTUF9MSUIgRVJSX0xJQl9PQ1NQCisjZGVmaW5lIEVSUl9SX1VJX0xJQiBFUlJfTElCX1VJCisjZGVmaW5lIEVSUl9SX0NPTVBfTElCIEVSUl9MSUJfQ09NUAorI2RlZmluZSBFUlJfUl9FQ0RTQV9MSUIgRVJSX0xJQl9FQ0RTQQorI2RlZmluZSBFUlJfUl9FQ0RIX0xJQiBFUlJfTElCX0VDREgKKyNkZWZpbmUgRVJSX1JfU1RPUkVfTElCIEVSUl9MSUJfU1RPUkUKKyNkZWZpbmUgRVJSX1JfRklQU19MSUIgRVJSX0xJQl9GSVBTCisjZGVmaW5lIEVSUl9SX0NNU19MSUIgRVJSX0xJQl9DTVMKKyNkZWZpbmUgRVJSX1JfVFNfTElCIEVSUl9MSUJfVFMKKyNkZWZpbmUgRVJSX1JfSE1BQ19MSUIgRVJSX0xJQl9ITUFDCisjZGVmaW5lIEVSUl9SX0pQQUtFX0xJQiBFUlJfTElCX0pQQUtFCisjZGVmaW5lIEVSUl9SX1VTRVJfTElCIEVSUl9MSUJfVVNFUgorI2RlZmluZSBFUlJfUl9ESUdFU1RfTElCIEVSUl9MSUJfRElHRVNUCisjZGVmaW5lIEVSUl9SX0NJUEhFUl9MSUIgRVJSX0xJQl9DSVBIRVIKKworLyogR2xvYmFsIHJlYXNvbnMuICovCisjZGVmaW5lIEVSUl9SX0ZBVEFMIDY0CisjZGVmaW5lIEVSUl9SX01BTExPQ19GQUlMVVJFICgxIHwgRVJSX1JfRkFUQUwpCisjZGVmaW5lIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCAoMiB8IEVSUl9SX0ZBVEFMKQorI2RlZmluZSBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIgKDMgfCBFUlJfUl9GQVRBTCkKKyNkZWZpbmUgRVJSX1JfSU5URVJOQUxfRVJST1IgKDQgfCBFUlJfUl9GQVRBTCkKKworLyogU3lzdGVtIGVycm9yIGZ1bmN0aW9ucyAqLworI2RlZmluZSBTWVNfRl9mb3BlbiAxMDAKKyNkZWZpbmUgU1lTX0ZfZmNsb3NlIDEwMQorI2RlZmluZSBTWVNfRl9mcmVhZCAxMDIKKyNkZWZpbmUgU1lTX0ZfZndyaXRlIDEwMworI2RlZmluZSBTWVNfRl9zb2NrZXQgMTA0CisjZGVmaW5lIFNZU19GX3NldHNvY2tvcHQgMTA1CisjZGVmaW5lIFNZU19GX2Nvbm5lY3QgMTA2CisjZGVmaW5lIFNZU19GX2dldGFkZHJpbmZvIDEwNworCisjZGVmaW5lIEVSUl9QQUNLKGxpYiwgZnVuYywgcmVhc29uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKCgodWludDMyX3QpbGliKSAmIDB4ZmYpIDw8IDI0KSB8ICgoKCh1aW50MzJfdClmdW5jKSAmIDB4ZmZmKSA8PCAxMikgfCBcCisgICAoKCgodWludDMyX3QpcmVhc29uKSAmIDB4ZmZmKSkpCisKKyNkZWZpbmUgRVJSX0dFVF9MSUIocGFja2VkX2Vycm9yKSAoKChwYWNrZWRfZXJyb3IpID4+IDI0KSAmIDB4ZmYpCisjZGVmaW5lIEVSUl9HRVRfRlVOQyhwYWNrZWRfZXJyb3IpICgoKHBhY2tlZF9lcnJvcikgPj4gMTIpICYgMHhmZmYpCisjZGVmaW5lIEVSUl9HRVRfUkVBU09OKHBhY2tlZF9lcnJvcikgKChwYWNrZWRfZXJyb3IpICYgMHhmZmYpCisKKy8qIEVSUl9TVFJJTkdfREFUQSBpcyB0aGUgdHlwZSBvZiBhbiBsaGFzaCBub2RlIHRoYXQgY29udGFpbnMgYSBtYXBwaW5nIGZyb20gYQorICogbGlicmFyeSwgZnVuY3Rpb24gb3IgcmVhc29uIGNvZGUgdG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgaXQuICovCit0eXBlZGVmIHN0cnVjdCBlcnJfc3RyaW5nX2RhdGFfc3QgeworICB1aW50MzJfdCBlcnJvcjsKKyAgY29uc3QgY2hhciAqc3RyaW5nOworfSBFUlJfU1RSSU5HX0RBVEE7CisKKy8qIEVSUl9sb2FkX3N0cmluZ3MgbG9hZHMgYW4gYXJyYXkgb2YgRVJSX1NUUklOR19EQVRBIGludG8gdGhlIGhhc2ggdGFibGUuIFRoZQorICogYXJyYXkgbXVzdCBiZSB0ZXJtaW5hdGVkIGJ5IGFuIGVudHJ5IHdpdGggYSBOVUxMIHN0cmluZy4gKi8KK3ZvaWQgRVJSX2xvYWRfc3RyaW5ncyhjb25zdCBFUlJfU1RSSU5HX0RBVEEgKnN0cik7CisKKy8qIEVSUl9GTlNfc3QgaXMgYSBzdHJ1Y3R1cmUgb2YgZnVuY3Rpb24gcG9pbnRlcnMgdGhhdCBjb250YWlucyB0aGUgYWN0dWFsCisgKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZXJyb3IgcXVldWUgaGFuZGxpbmcgZnVuY3Rpb25zLiAqLworc3RydWN0IEVSUl9GTlNfc3QgeworICB2b2lkICgqc2h1dGRvd24pKHZvaWQpOworICBFUlJfU1RSSU5HX0RBVEEgKigqZ2V0X2l0ZW0pKHVpbnQzMl90IHBhY2tlZF9lcnJvcik7CisgIEVSUl9TVFJJTkdfREFUQSAqKCpzZXRfaXRlbSkoY29uc3QgRVJSX1NUUklOR19EQVRBICopOworICBFUlJfU1RSSU5HX0RBVEEgKigqZGVsX2l0ZW0pKHVpbnQzMl90IHBhY2tlZF9lcnJvcik7CisKKyAgLyogZ2V0X3N0YXRlIHJldHVybnMgdGhlIEVSUl9TVEFURSBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLiBUaGlzIGZ1bmN0aW9uCisgICAqIG5ldmVyIHJldHVybnMgTlVMTC4gKi8KKyAgRVJSX1NUQVRFICooKmdldF9zdGF0ZSkodm9pZCk7Cit9OworCisvKiBPUEVOU1NMX0RFQ0xBUkVfRVJST1JfUkVBU09OIGlzIHVzZWQgYnkgdXRpbC9tYWtlX2Vycm9ycy5oICh3aGljaCBnZW5lcmF0ZXMKKyAqIHRoZSBlcnJvciBkZWZpbmVzKSB0byByZWNvZ25pc2UgdGhhdCBhbiBhZGRpdGlvbmFsIHJlYXNvbiB2YWx1ZSBpcyBuZWVkZWQuCisgKiBUaGlzIGlzIG5lZWRlZCB3aGVuIHRoZSByZWFzb24gdmFsdWUgaXMgdXNlZCBvdXRzaWRlIG9mIGFuCisgKiB8T1BFTlNTTF9QVVRfRVJST1J8IG1hY3JvLiBUaGUgcmVzdWx0aW5nIGRlZmluZSB3aWxsIGJlCisgKiAke2xpYn1fUl8ke3JlYXNvbn0uICovCisjZGVmaW5lIE9QRU5TU0xfREVDTEFSRV9FUlJPUl9SRUFTT04obGliLCByZWFzb24pCisKKy8qIE9QRU5TU0xfREVDTEFSRV9FUlJPUl9GVU5DVElPTiBpcyB1c2VkIGJ5IHV0aWwvbWFrZV9lcnJvcnMuaCAod2hpY2gKKyAqIGdlbmVyYXRlcyB0aGUgZXJyb3IgKiBkZWZpbmVzIHRvIHJlY29nbmlzZSB0aGF0IGFuIGFkZGl0aW9uYWwgZnVuY3Rpb24gdmFsdWUKKyAqIGlzIG5lZWRlZC4gVGhpcyBpcyAqIG5lZWRlZCB3aGVuIHRoZSBmdW5jdGlvbiB2YWx1ZSBpcyB1c2VkIG91dHNpZGUgb2YgYW4KKyAqIHxPUEVOU1NMX1BVVF9FUlJPUnwgKiBtYWNyby4gVGhlIHJlc3VsdGluZyBkZWZpbmUgd2lsbCBiZQorICogJHtsaWJ9X0ZfJHtyZWFzb259LiAqLworI2RlZmluZSBPUEVOU1NMX0RFQ0xBUkVfRVJST1JfRlVOQ1RJT04obGliLCBmdW5jdGlvbl9uYW1lKQorCisvKiBFUlJfbG9hZF9CSU9fc3RyaW5ncyBkb2VzIG5vdGhpbmcuCisgKgorICogVE9ETyhmb3JrKTogcmVtb3ZlLiBsaWJqaW5nbGUgY2FsbHMgdGhpcy4gKi8KK3ZvaWQgRVJSX2xvYWRfQklPX3N0cmluZ3MoKTsKKworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30gLyogZXh0ZXJuIEMgKi8KKyNlbmRpZgorCisjZW5kaWYgLyogT1BFTlNTTF9IRUFERVJfRVJSX0ggKi8KZGlmZiAtLWdpdCBhL2NyeXB0by9lcnIvZXJyX2ltcGwuYyBiL2NyeXB0by9lcnIvZXJyX2ltcGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjI1MDlkCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2Vyci9lcnJfaW1wbC5jCkBAIC0wLDAgKzEsMjgwIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvbGhhc2guaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorCisKK0RFRklORV9MSEFTSF9PRihFUlJfU1RBVEUpOworREVGSU5FX0xIQVNIX09GKEVSUl9TVFJJTkdfREFUQSk7CisKKy8qIHN0YXRlX2hhc2ggaXMgYSBtYXAgZnJvbSB0aHJlYWQgSUQgdG8gRVJSX1NUQVRFLiBJdCB3b3JrcyBsaWtlIHRocmVhZC1sb2NhbAorICogc3RvcmFnZS4gKi8KK3N0YXRpYyBMSEFTSF9PRihFUlJfU1RBVEUpICpzdGF0ZV9oYXNoID0gTlVMTDsKKworLyogZXJyb3JfaGFzaCBtYXBzIGZyb20gYSBwYWNrZWQgZXJyb3IgdG8gdGhlIHN0cmluZyBmb3IgdGhhdCBsaWJyYXJ5IC8KKyAqIGZ1bmN0aW9uIC8gcmVhc29uLiAqLworc3RhdGljIExIQVNIX09GKEVSUl9TVFJJTkdfREFUQSkgKmVycm9yX2hhc2ggPSBOVUxMOworCisvKiBlcnJfc3RyaW5nX2RhdGFfaGFzaCBpcyBhbiBsaGFzaCBoYXNoIGZ1bmN0aW9uIGZvciBFUlJfU1RSSU5HX0RBVEEuICovCitzdGF0aWMgdWludDMyX3QgZXJyX3N0cmluZ19kYXRhX2hhc2goY29uc3QgRVJSX1NUUklOR19EQVRBICphKSB7CisgIHJldHVybiBPUEVOU1NMX2hhc2gzMigmYS0+ZXJyb3IsIHNpemVvZihhLT5lcnJvcikpOworfQorCisvKiBlcnJfc3RyaW5nX2RhdGFfY21wIGlzIGFuIGxoYXNoIGNvbXBhcmUgZnVuY3Rpb24gZm9yIEVSUl9TVFJJTkdfREFUQS4gKi8KK3N0YXRpYyBpbnQgZXJyX3N0cmluZ19kYXRhX2NtcChjb25zdCBFUlJfU1RSSU5HX0RBVEEgKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRVJSX1NUUklOR19EQVRBICpiKSB7CisgIHJldHVybiAoKGludClhLT5lcnJvcikgLSAoKGludCliLT5lcnJvcik7Cit9CisKKy8qIGVycm9yX2hhc2hfZ2V0X3dyaXRlX2xvY2tlZCByZXR1cm5zIHRoZSBoYXNoIHRoYXQgbWFwcyBmcm9tIHBhY2tlZCBlcnJvciB0bworICogZXJyb3Igc3RyaW5nIGFuZCBjcmVhdGVzIGl0IGlmIG5lZWQgYmUuIFRoZSBjYWxsZXIgbXVzdCBob2xkIGEgd3JpdGUgbG9jayBvbgorICogTE9DS19FUlIuICovCitzdGF0aWMgTEhBU0hfT0YoRVJSX1NUUklOR19EQVRBKSAqIGVycm9yX2hhc2hfZ2V0X3dyaXRlX2xvY2tlZCh2b2lkKSB7CisgIGlmICghZXJyb3JfaGFzaCkgeworICAgIGVycm9yX2hhc2ggPSBsaF9FUlJfU1RSSU5HX0RBVEFfbmV3KGVycl9zdHJpbmdfZGF0YV9oYXNoLCBlcnJfc3RyaW5nX2RhdGFfY21wKTsKKyAgfQorCisgIHJldHVybiBlcnJvcl9oYXNoOworfQorCisvKiBlcnJfZ2V0X2l0ZW0gcmV0dXJucyBhbiBFUlJfU1RSSU5HX0RBVEEgd2l0aCBhbiB8ZXJyb3J8IG1lbWJlciB0aGF0CisgKiBlcXVhbHMgfHBhY2tlZF9lcnJvcnwsIG9yIE5VTEwgaWYgbm9uZSBjYW4gYmUgZm91bmQuICovCitzdGF0aWMgRVJSX1NUUklOR19EQVRBICplcnJfZ2V0X2l0ZW0odWludDMyX3QgcGFja2VkX2Vycm9yKSB7CisgIEVSUl9TVFJJTkdfREFUQSAqcmV0ID0gTlVMTCwgcGF0dGVybjsKKworICBwYXR0ZXJuLmVycm9yID0gcGFja2VkX2Vycm9yOworCisgIENSWVBUT19yX2xvY2soQ1JZUFRPX0xPQ0tfRVJSKTsKKyAgaWYgKGVycm9yX2hhc2gpIHsKKyAgICByZXQgPSBsaF9FUlJfU1RSSU5HX0RBVEFfcmV0cmlldmUoZXJyb3JfaGFzaCwgJnBhdHRlcm4pOworICB9CisgIENSWVBUT19yX3VubG9jayhDUllQVE9fTE9DS19FUlIpOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qIGVycl9zZXRfaXRlbSBhZGRzIGFuIEVSUl9TVFJJTkdfREFUQSB0byB0aGUgZ2xvYmFsIGhhc2ggb2YgZXJyb3Igc3RyaW5ncyBhbmQKKyAqIHJldHVybnMgdGhlIHByZXZpb3VzIGVudHJ5IHdpdGggdGhlIHNhbWUgfGVyci0+ZXJyb3J8IHZhbHVlLCBpZiBhbnkuICovCitzdGF0aWMgRVJSX1NUUklOR19EQVRBICplcnJfc2V0X2l0ZW0oY29uc3QgRVJSX1NUUklOR19EQVRBICplcnIpIHsKKyAgRVJSX1NUUklOR19EQVRBICpvbGRfaXRlbSA9IE5VTEw7CisgIExIQVNIX09GKEVSUl9TVFJJTkdfREFUQSkgKmhhc2g7CisKKyAgQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19FUlIpOworICBoYXNoID0gZXJyb3JfaGFzaF9nZXRfd3JpdGVfbG9ja2VkKCk7CisgIGlmIChoYXNoKSB7CisgICAgbGhfRVJSX1NUUklOR19EQVRBX2luc2VydChoYXNoLCAmb2xkX2l0ZW0sIChFUlJfU1RSSU5HX0RBVEEqKSBlcnIpOworICB9CisgIENSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19FUlIpOworCisgIHJldHVybiBvbGRfaXRlbTsKK30KKworLyogZXJyX3NldF9pdGVtIHJlbW92ZXMgYW4gaXRlbSBmcm9tIHRoZSBnbG9iYWwgaGFzaCBvZiBlcnJvciBzdHJpbmdzIGZvcgorICogfHBhY2tlZF9lcnJvcnwgYW5kIHJldHVybnMgdGhlIHJlbW92ZWQgZW50cnksIGlmIGFueS4gKi8KK3N0YXRpYyBFUlJfU1RSSU5HX0RBVEEgKmVycl9kZWxfaXRlbSh1aW50MzJfdCBwYWNrZWRfZXJyb3IpIHsKKyAgRVJSX1NUUklOR19EQVRBICpvbGRfaXRlbSA9IE5VTEwsIHBhdHRlcm47CisKKyAgcGF0dGVybi5lcnJvciA9IHBhY2tlZF9lcnJvcjsKKworICBDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX0VSUik7CisgIGlmIChlcnJvcl9oYXNoKSB7CisgICAgb2xkX2l0ZW0gPSBsaF9FUlJfU1RSSU5HX0RBVEFfZGVsZXRlKGVycm9yX2hhc2gsICZwYXR0ZXJuKTsKKyAgfQorICBDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfRVJSKTsKKworICByZXR1cm4gb2xkX2l0ZW07Cit9CisKKworLyogZXJyX3N0YXRlX2hhc2ggaXMgYW4gbGhhc2ggaGFzaCBmdW5jdGlvbiBmb3IgRVJSX1NUQVRFLiAqLworc3RhdGljIHVpbnQzMl90IGVycl9zdGF0ZV9oYXNoKGNvbnN0IEVSUl9TVEFURSAqYSkgeworICByZXR1cm4gQ1JZUFRPX1RIUkVBRElEX2hhc2goJmEtPnRpZCk7Cit9CisKKy8qIGVycl9zdGF0ZV9jbXAgaXMgYW4gbGhhc2ggY29tcGFyZSBmdW5jdGlvbiBmb3IgRVJSX1NUQVRFLiAqLworc3RhdGljIGludCBlcnJfc3RhdGVfY21wKGNvbnN0IEVSUl9TVEFURSAqYSwgY29uc3QgRVJSX1NUQVRFICpiKSB7CisgIHJldHVybiBDUllQVE9fVEhSRUFESURfY21wKCZhLT50aWQsICZiLT50aWQpOworfQorCisKK3N0YXRpYyBFUlJfU1RBVEUgKmVycl9nZXRfc3RhdGUodm9pZCkgeworICBDUllQVE9fVEhSRUFESUQgdGlkOworICBFUlJfU1RBVEUgcGF0dGVybiwgKnN0YXRlLCAqcmFjZV9zdGF0ZTsKKyAgaW50IGluc2VydF9yZXN1bHQ7CisgIHN0YXRpYyBFUlJfU1RBVEUgZmFsbGJhY2s7CisKKyAgQ1JZUFRPX1RIUkVBRElEX2N1cnJlbnQoJnRpZCk7CisgIG1lbXNldCgmcGF0dGVybiwgMCwgc2l6ZW9mKHBhdHRlcm4pKTsKKyAgQ1JZUFRPX1RIUkVBRElEX2NweSgmcGF0dGVybi50aWQsICZ0aWQpOworCisgIENSWVBUT19yX2xvY2soQ1JZUFRPX0xPQ0tfRVJSKTsKKyAgaWYgKHN0YXRlX2hhc2ggPT0gTlVMTCkgeworICAgIENSWVBUT19yX3VubG9jayhDUllQVE9fTE9DS19FUlIpOworICAgIENSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfRVJSKTsKKyAgICBpZiAoc3RhdGVfaGFzaCA9PSBOVUxMKSB7CisgICAgICBzdGF0ZV9oYXNoID0gbGhfRVJSX1NUQVRFX25ldyhlcnJfc3RhdGVfaGFzaCwgZXJyX3N0YXRlX2NtcCk7CisgICAgfQorICAgIENSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19FUlIpOworICAgIENSWVBUT19yX2xvY2soQ1JZUFRPX0xPQ0tfRVJSKTsKKyAgfQorCisgIHN0YXRlID0gbGhfRVJSX1NUQVRFX3JldHJpZXZlKHN0YXRlX2hhc2gsICZwYXR0ZXJuKTsKKyAgQ1JZUFRPX3JfdW5sb2NrKENSWVBUT19MT0NLX0VSUik7CisgIGlmIChzdGF0ZSAhPSBOVUxMKSB7CisgICAgcmV0dXJuIHN0YXRlOworICB9CisKKyAgc3RhdGUgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoRVJSX1NUQVRFKSk7CisgIGlmIChzdGF0ZSA9PSBOVUxMKSB7CisgICAgQ1JZUFRPX3JfdW5sb2NrKENSWVBUT19MT0NLX0VSUik7CisgICAgLyogVGhlIG90aGVyIGVycm9yIGZ1bmN0aW9ucyBkb24ndCBjb3BlIHdpdGggYSBmYWlsdXJlIHRvIGdldCB0aGUgZXJyb3IKKyAgICAgKiBzdGF0ZSwgc28gd2UgcmV0dXJuIGEgZHVtbXkgdmFsdWUuICovCisgICAgcmV0dXJuICZmYWxsYmFjazsKKyAgfQorCisgIG1lbXNldChzdGF0ZSwgMCwgc2l6ZW9mKEVSUl9TVEFURSkpOworICBDUllQVE9fVEhSRUFESURfY3B5KCZzdGF0ZS0+dGlkLCAmdGlkKTsKKworICBDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX0VSUik7CisgIGluc2VydF9yZXN1bHQgPSBsaF9FUlJfU1RBVEVfaW5zZXJ0KHN0YXRlX2hhc2gsICZyYWNlX3N0YXRlLCBzdGF0ZSk7CisgIENSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19FUlIpOworCisgIGlmICghaW5zZXJ0X3Jlc3VsdCkgeworICAgIC8qIEluc2VydGlvbiBmYWlsZWQgYmVjYXVzZSBvZiBtYWxsb2MgZmFpbHVyZS4gKi8KKyAgICBPUEVOU1NMX2ZyZWUoc3RhdGUpOworICAgIHJldHVybiAmZmFsbGJhY2s7CisgIH0KKworICAvKiBXZSBjYW5ub3QgaGF2ZSByYWNlZCB3aXRoIGFub3RoZXIgdGhyZWFkIHRvIGluc2VydCBhbiBFUlJfU1RBVEUgYmVjYXVzZSBubworICAgKiBvdGhlciB0aHJlYWQgc2hvdWxkIGJlIGluc2VydGluZyB2YWx1ZXMgZm9yIHRoaXMgdGhyZWFkLiAqLworICBhc3NlcnQocmFjZV9zdGF0ZSA9PSBOVUxMKTsKKworICByZXR1cm4gc3RhdGU7Cit9CisKK3N0YXRpYyB2b2lkIGVycl9zaHV0ZG93bih2b2lkKSB7CisgIENSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfRVJSKTsKKyAgaWYgKGVycm9yX2hhc2gpIHsKKyAgICBsaF9FUlJfU1RSSU5HX0RBVEFfZnJlZShlcnJvcl9oYXNoKTsKKyAgICBlcnJvcl9oYXNoID0gTlVMTDsKKyAgfQorICBDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfRVJSKTsKK30KKworY29uc3Qgc3RydWN0IEVSUl9GTlNfc3Qgb3BlbnNzbF9lcnJfZGVmYXVsdF9pbXBsID0geworICBlcnJfc2h1dGRvd24sCisgIGVycl9nZXRfaXRlbSwKKyAgZXJyX3NldF9pdGVtLAorICBlcnJfZGVsX2l0ZW0sCisgIGVycl9nZXRfc3RhdGUsCit9OwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2Vyci9lcnJfdGVzdC5jIGIvY3J5cHRvL2Vyci9lcnJfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZmM5ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vZXJyL2Vycl90ZXN0LmMKQEAgLTAsMCArMSwxMTggQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNCwgR29vZ2xlIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4gKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisKKworc3RhdGljIGludCB0ZXN0X292ZXJmbG93KCkgeworICB1bnNpZ25lZCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBFUlJfTlVNX0VSUk9SUyoyOyBpKyspIHsKKyAgICBFUlJfcHV0X2Vycm9yKDEsIDIsIDMsICJ0ZXN0IiwgMSk7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgRVJSX05VTV9FUlJPUlMgLSAxOyBpKyspIHsKKyAgICBpZiAoRVJSX2dldF9lcnJvcigpID09IDApIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJSX2dldF9lcnJvciBmYWlsZWQgYXQgJXVcbiIsIGkpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgaWYgKEVSUl9nZXRfZXJyb3IoKSAhPSAwKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFUlJfZ2V0X2Vycm9yIG1vcmUgdGhhbiB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIHZhbHVlcy5cbiIpOworICAgIHJldHVybiAwOworICB9CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9wdXRfZXJyb3IoKSB7CisgIHVpbnQzMl90IHBhY2tlZF9lcnJvcjsKKyAgaW50IGxpbmUsIGZsYWdzOworICBjb25zdCBjaGFyICpmaWxlOworICBjaGFyICpkYXRhOworCisgIGlmIChFUlJfZ2V0X2Vycm9yKCkgIT0gMCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRVJSX2dldF9lcnJvciByZXR1cm5lZCB2YWx1ZSBiZWZvcmUgYW4gZXJyb3Igd2FzIGFkZGVkLlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBFUlJfcHV0X2Vycm9yKDEsIDIsIDMsICJ0ZXN0IiwgNCk7CisgIEVSUl9hZGRfZXJyb3JfZGF0YSgxLCAidGVzdGluZyIpOworCisgIHBhY2tlZF9lcnJvciA9IEVSUl9nZXRfZXJyb3JfbGluZV9kYXRhKCZmaWxlLCAmbGluZSwgJmRhdGEsICZmbGFncyk7CisgIGlmIChzdHJjbXAoZmlsZSwgInRlc3QiKSAhPSAwIHx8CisgICAgICBsaW5lICE9IDQgfHwKKyAgICAgIChmbGFncyAmIEVSUl9GTEFHX1NUUklORykgPT0gMCB8fAorICAgICAgKGZsYWdzICYgRVJSX0ZMQUdfTUFMTE9DRUQpID09IDAgfHwKKyAgICAgIEVSUl9HRVRfTElCKHBhY2tlZF9lcnJvcikgIT0gMSB8fAorICAgICAgRVJSX0dFVF9GVU5DKHBhY2tlZF9lcnJvcikgIT0gMiB8fAorICAgICAgRVJSX0dFVF9SRUFTT04ocGFja2VkX2Vycm9yKSAhPSAzIHx8CisgICAgICBzdHJjbXAoZGF0YSwgInRlc3RpbmciKSAhPSAwKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJCYWQgZXJyb3IgZGF0YSByZXR1cm5lZC5cbiIpOworICAgIHJldHVybiAwOworICB9CisKKyAgT1BFTlNTTF9mcmVlKGRhdGEpOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHRlc3RfY2xlYXJfZXJyb3IoKSB7CisgIGlmIChFUlJfZ2V0X2Vycm9yKCkgIT0gMCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRVJSX2dldF9lcnJvciByZXR1cm5lZCB2YWx1ZSBiZWZvcmUgYW4gZXJyb3Igd2FzIGFkZGVkLlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBFUlJfcHV0X2Vycm9yKDEsIDIsIDMsICJ0ZXN0IiwgNCk7CisgIEVSUl9jbGVhcl9lcnJvcigpOworCisgIGlmIChFUlJfZ2V0X2Vycm9yKCkgIT0gMCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgcmVtYWluZWQgYWZ0ZXIgY2xlYXJpbmcuXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHRlc3RfcHJpbnQoKSB7CisgIHNpemVfdCBpOworICBjaGFyIGJ1ZlsyNTZdOworICB1aW50MzJfdCBwYWNrZWRfZXJyb3I7CisKKyAgRVJSX3B1dF9lcnJvcigxLCAyLCAzLCAidGVzdCIsIDQpOworICBFUlJfYWRkX2Vycm9yX2RhdGEoMSwgInRlc3RpbmciKTsKKyAgcGFja2VkX2Vycm9yID0gRVJSX2dldF9lcnJvcigpOworCisgIGZvciAoaSA9IDA7IGkgPD0gc2l6ZW9mKGJ1Zik7IGkrKykgeworICAgIEVSUl9lcnJvcl9zdHJpbmdfbihwYWNrZWRfZXJyb3IsIGJ1ZiwgaSk7CisgIH0KKworICByZXR1cm4gMTsKK30KKworaW50IG1haW4oKSB7CisgIGlmICghdGVzdF9vdmVyZmxvdygpIHx8CisgICAgICAhdGVzdF9wdXRfZXJyb3IoKSB8fAorICAgICAgIXRlc3RfY2xlYXJfZXJyb3IoKSB8fAorICAgICAgIXRlc3RfcHJpbnQoKSkgeworICAgIHJldHVybiAxOworICB9CisKKyAgcHJpbnRmKCJQQVNTXG4iKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vZXZwL0NNYWtlTGlzdHMudHh0IGIvY3J5cHRvL2V2cC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2Q4ZDhhCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2V2cC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDMwIEBACitpbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKKworYWRkX2xpYnJhcnkoCisJZXZwCisKKwlPQkpFQ1QKKworCWFzbjEuYworCWRpZ2VzdHNpZ24uYworCWV2cC5jCisJZXZwX2N0eC5jCisJZXZwX2Vycm9yLmMKKwlwX2VjLmMKKwlwX2VjX2FzbjEuYworCXBfaG1hYy5jCisJcF9obWFjX2FzbjEuYworCXBfcnNhLmMKKwlwX3JzYV9hc24xLmMKKwlwYmtkZi5jCisJc2lnbi5jCispCisKKworYWRkX2V4ZWN1dGFibGUoCisJZXhhbXBsZV9zaWduCisKKwlleGFtcGxlX3NpZ24uYworKQorCit0YXJnZXRfbGlua19saWJyYXJpZXMoZXhhbXBsZV9zaWduIGNyeXB0bykKZGlmZiAtLWdpdCBhL2NyeXB0by9ldnAvYXNuMS5jIGIvY3J5cHRvL2V2cC9hc24xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBiZGIwNgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9ldnAvYXNuMS5jCkBAIC0wLDAgKzEsMTcwIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKworI2luY2x1ZGUgImludGVybmFsLmgiCisKKworRVZQX1BLRVkgKmQyaV9Qcml2YXRlS2V5KGludCB0eXBlLCBFVlBfUEtFWSAqKm91dCwgY29uc3QgdWludDhfdCAqKmlucCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGxlbikgeworICBFVlBfUEtFWSAqcmV0OworCisgIGlmIChvdXQgPT0gTlVMTCB8fCAqb3V0ID09IE5VTEwpIHsKKyAgICByZXQgPSBFVlBfUEtFWV9uZXcoKTsKKyAgICBpZiAocmV0ID09IE5VTEwpIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZDJpX1ByaXZhdGVLZXksIEVSUl9SX0VWUF9MSUIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9IGVsc2UgeworICAgIHJldCA9ICpvdXQ7CisgIH0KKworICBpZiAoIUVWUF9QS0VZX3NldF90eXBlKHJldCwgdHlwZSkpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGQyaV9Qcml2YXRlS2V5LCBFVlBfUl9VTktOT1dOX1BVQkxJQ19LRVlfVFlQRSk7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAoIXJldC0+YW1ldGgtPm9sZF9wcml2X2RlY29kZSB8fAorICAgICAgIXJldC0+YW1ldGgtPm9sZF9wcml2X2RlY29kZShyZXQsIGlucCwgbGVuKSkgeworICAgIGlmIChyZXQtPmFtZXRoLT5wcml2X2RlY29kZSkgeworICAgICAgUEtDUzhfUFJJVl9LRVlfSU5GTyAqcDggPSBkMmlfUEtDUzhfUFJJVl9LRVlfSU5GTyhOVUxMLCBpbnAsIGxlbik7CisgICAgICBpZiAoIXA4KSB7CisgICAgICAgIGdvdG8gZXJyOworICAgICAgfQorICAgICAgRVZQX1BLRVlfZnJlZShyZXQpOworICAgICAgcmV0ID0gRVZQX1BLQ1M4MlBLRVkocDgpOworICAgICAgUEtDUzhfUFJJVl9LRVlfSU5GT19mcmVlKHA4KTsKKyAgICB9IGVsc2UgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBkMmlfUHJpdmF0ZUtleSwgRVJSX1JfQVNOMV9MSUIpOworICAgICAgZ290byBlcnI7CisgICAgfQorICB9CisKKyAgaWYgKG91dCAhPSBOVUxMKSB7CisgICAgKm91dCA9IHJldDsKKyAgfQorICByZXR1cm4gcmV0OworCitlcnI6CisgIGlmIChyZXQgIT0gTlVMTCAmJiAob3V0ID09IE5VTEwgfHwgKm91dCAhPSByZXQpKSB7CisgICAgRVZQX1BLRVlfZnJlZShyZXQpOworICB9CisgIHJldHVybiBOVUxMOworfQorCitFVlBfUEtFWSAqZDJpX0F1dG9Qcml2YXRlS2V5KEVWUF9QS0VZICoqb3V0LCBjb25zdCB1aW50OF90ICoqaW5wLCBsb25nIGxlbikgeworICBTVEFDS19PRihBU04xX1RZUEUpICppbmtleTsKKyAgY29uc3QgdWludDhfdCAqcDsKKyAgaW50IGtleXR5cGU7CisgIHAgPSAqaW5wOworCisgIC8qIERpcnR5IHRyaWNrOiByZWFkIGluIHRoZSBBU04xIGRhdGEgaW50byBvdXQgU1RBQ0tfT0YoQVNOMV9UWVBFKToKKyAgICogYnkgYW5hbHl6aW5nIGl0IHdlIGNhbiBkZXRlcm1pbmUgdGhlIHBhc3NlZCBzdHJ1Y3R1cmU6IHRoaXMKKyAgICogYXNzdW1lcyB0aGUgaW5wdXQgaXMgc3Vycm91bmRlZCBieSBhbiBBU04xIFNFUVVFTkNFLiAqLworICBpbmtleSA9IGQyaV9BU04xX1NFUVVFTkNFX0FOWShOVUxMLCAmcCwgbGVuKTsKKyAgLyogU2luY2Ugd2Ugb25seSBuZWVkIHRvIGRpc2Nlcm4gInRyYWRpdGlvbmFsIGZvcm1hdCIgUlNBIGFuZCBEU0EKKyAgICoga2V5cyB3ZSBjYW4ganVzdCBjb3VudCB0aGUgZWxlbWVudHMuICovCisgIGlmIChza19BU04xX1RZUEVfbnVtKGlua2V5KSA9PSA2KSB7CisgICAga2V5dHlwZSA9IEVWUF9QS0VZX0RTQTsKKyAgfSBlbHNlIGlmIChza19BU04xX1RZUEVfbnVtKGlua2V5KSA9PSA0KSB7CisgICAga2V5dHlwZSA9IEVWUF9QS0VZX0VDOworICB9IGVsc2UgaWYgKHNrX0FTTjFfVFlQRV9udW0oaW5rZXkpID09IDMpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGQyaV9BdXRvUHJpdmF0ZUtleSwgRVZQX1JfVU5TVVBQT1JURURfUFVCTElDX0tFWV9UWVBFKTsKKyAgICByZXR1cm4gMDsKKworICAgIC8qIFRoaXMgc2VlbXMgdG8gYmUgUEtDUzgsIG5vdCB0cmFkaXRpb25hbCBmb3JtYXQgKi8KKyAgICBQS0NTOF9QUklWX0tFWV9JTkZPICpwOCA9IGQyaV9QS0NTOF9QUklWX0tFWV9JTkZPKE5VTEwsIGlucCwgbGVuKTsKKyAgICBFVlBfUEtFWSAqcmV0OworCisgICAgc2tfQVNOMV9UWVBFX3BvcF9mcmVlKGlua2V5LCBBU04xX1RZUEVfZnJlZSk7CisgICAgaWYgKCFwOCkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBkMmlfQXV0b1ByaXZhdGVLZXksCisgICAgICAgICAgICAgICAgICAgICAgICBFVlBfUl9VTlNVUFBPUlRFRF9QVUJMSUNfS0VZX1RZUEUpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldCA9IEVWUF9QS0NTODJQS0VZKHA4KTsKKyAgICBQS0NTOF9QUklWX0tFWV9JTkZPX2ZyZWUocDgpOworICAgIGlmIChvdXQpIHsKKyAgICAgICpvdXQgPSByZXQ7CisgICAgfQorICAgIHJldHVybiByZXQ7CisgIH0gZWxzZSB7CisgICAga2V5dHlwZSA9IEVWUF9QS0VZX1JTQTsKKyAgfQorCisgIHNrX0FTTjFfVFlQRV9wb3BfZnJlZShpbmtleSwgQVNOMV9UWVBFX2ZyZWUpOworICByZXR1cm4gZDJpX1ByaXZhdGVLZXkoa2V5dHlwZSwgb3V0LCBpbnAsIGxlbik7Cit9CisKK2ludCBpMmRfUHVibGljS2V5KEVWUF9QS0VZICprZXksIHVpbnQ4X3QgKipvdXRwKSB7CisgIHN3aXRjaCAoa2V5LT50eXBlKSB7CisgICAgY2FzZSBFVlBfUEtFWV9SU0E6CisgICAgICByZXR1cm4gaTJkX1JTQVB1YmxpY0tleShrZXktPnBrZXkucnNhLCBvdXRwKTsKKyAgICBjYXNlIEVWUF9QS0VZX0RTQToKKyAgICAgIHJldHVybiBpMmRfRFNBUHVibGljS2V5KGtleS0+cGtleS5kc2EsIG91dHApOworICAgIGNhc2UgRVZQX1BLRVlfRUM6CisgICAgICByZXR1cm4gaTJvX0VDUHVibGljS2V5KGtleS0+cGtleS5lYywgb3V0cCk7CisgICAgZGVmYXVsdDoKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgaTJkX1B1YmxpY0tleSwgRVZQX1JfVU5TVVBQT1JURURfUFVCTElDX0tFWV9UWVBFKTsKKyAgICAgIHJldHVybiAtMTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2V2cC9kaWdlc3RzaWduLmMgYi9jcnlwdG8vZXZwL2RpZ2VzdHNpZ24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODk2OGVkCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2V2cC9kaWdlc3RzaWduLmMKQEAgLTAsMCArMSwyMTIgQEAKKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDA2LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDA2LDIwMDcgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvZGlnZXN0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKworI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiLi4vZGlnZXN0L2ludGVybmFsLmgiCisKKworLyogbWRfYmVnaW5fZGlnc2V0IGlzIGEgY2FsbGJhY2sgZnJvbSB0aGUgfEVWUF9NRF9DVFh8IGNvZGUgdGhhdCBpcyBjYWxsZWQgd2hlbgorICogYSBuZXcgZGlnZXN0IGlzIGJlZ3VuLiAqLworc3RhdGljIGludCBtZF9iZWdpbl9kaWdlc3QoRVZQX01EX0NUWCAqY3R4KSB7CisgIGludCByID0gRVZQX1BLRVlfQ1RYX2N0cmwoY3R4LT5wY3R4LCAtMSwgRVZQX1BLRVlfT1BfVFlQRV9TSUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZQX1BLRVlfQ1RSTF9ESUdFU1RJTklULCAwLCBjdHgpOworICByZXR1cm4gciA+IDAgfHwgciA9PSAtMjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBldnBfbWRfcGN0eF9vcHMgbWRfcGN0eF9vcHMgPSB7CisgIEVWUF9QS0VZX0NUWF9mcmVlLAorICBFVlBfUEtFWV9DVFhfZHVwLAorICBtZF9iZWdpbl9kaWdlc3QsCit9OworCitzdGF0aWMgaW50IGRvX3NpZ3Zlcl9pbml0KEVWUF9NRF9DVFggKmN0eCwgRVZQX1BLRVlfQ1RYICoqcGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRVZQX01EICp0eXBlLCBFTkdJTkUgKmUsIEVWUF9QS0VZICpwa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfdmVyaWZ5KSB7CisgIGlmIChjdHgtPnBjdHggPT0gTlVMTCkgeworICAgIGN0eC0+cGN0eCA9IEVWUF9QS0VZX0NUWF9uZXcocGtleSwgZSk7CisgIH0KKyAgaWYgKGN0eC0+cGN0eCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgY3R4LT5wY3R4X29wcyA9ICZtZF9wY3R4X29wczsKKworICBpZiAodHlwZSA9PSBOVUxMKSB7CisgICAgdHlwZSA9IEVWUF9zaGExKCk7CisgIH0KKworICBpZiAodHlwZSA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBkb19zaWd2ZXJfaW5pdCwgRVZQX1JfTk9fREVGQVVMVF9ESUdFU1QpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKGlzX3ZlcmlmeSkgeworICAgIGlmIChjdHgtPnBjdHgtPnBtZXRoLT52ZXJpZnljdHhfaW5pdCkgeworICAgICAgaWYgKGN0eC0+cGN0eC0+cG1ldGgtPnZlcmlmeWN0eF9pbml0KGN0eC0+cGN0eCwgY3R4KSA8PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgY3R4LT5wY3R4LT5vcGVyYXRpb24gPSBFVlBfUEtFWV9PUF9WRVJJRllDVFg7CisgICAgfSBlbHNlIGlmIChFVlBfUEtFWV92ZXJpZnlfaW5pdChjdHgtPnBjdHgpIDw9IDApIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoY3R4LT5wY3R4LT5wbWV0aC0+c2lnbmN0eF9pbml0KSB7CisgICAgICBpZiAoY3R4LT5wY3R4LT5wbWV0aC0+c2lnbmN0eF9pbml0KGN0eC0+cGN0eCwgY3R4KSA8PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgY3R4LT5wY3R4LT5vcGVyYXRpb24gPSBFVlBfUEtFWV9PUF9TSUdOQ1RYOworICAgIH0gZWxzZSBpZiAoRVZQX1BLRVlfc2lnbl9pbml0KGN0eC0+cGN0eCkgPD0gMCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIGlmIChFVlBfUEtFWV9DVFhfc2V0X3NpZ25hdHVyZV9tZChjdHgtPnBjdHgsIHR5cGUpIDw9IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAocGN0eCkgeworICAgICpwY3R4ID0gY3R4LT5wY3R4OworICB9CisgIGlmICghRVZQX0RpZ2VzdEluaXRfZXgoY3R4LCB0eXBlLCBlKSkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAxOworfQorCitpbnQgRVZQX0RpZ2VzdFNpZ25Jbml0KEVWUF9NRF9DVFggKmN0eCwgRVZQX1BLRVlfQ1RYICoqcGN0eCwgY29uc3QgRVZQX01EICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICBFTkdJTkUgKmUsIEVWUF9QS0VZICpwa2V5KSB7CisgIHJldHVybiBkb19zaWd2ZXJfaW5pdChjdHgsIHBjdHgsIHR5cGUsIGUsIHBrZXksIDApOworfQorCitpbnQgRVZQX0RpZ2VzdFZlcmlmeUluaXQoRVZQX01EX0NUWCAqY3R4LCBFVlBfUEtFWV9DVFggKipwY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVWUF9NRCAqdHlwZSwgRU5HSU5FICplLCBFVlBfUEtFWSAqcGtleSkgeworICByZXR1cm4gZG9fc2lndmVyX2luaXQoY3R4LCBwY3R4LCB0eXBlLCBlLCBwa2V5LCAxKTsKK30KKworaW50IEVWUF9EaWdlc3RTaWduVXBkYXRlKEVWUF9NRF9DVFggKmN0eCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbikgeworICByZXR1cm4gRVZQX0RpZ2VzdFVwZGF0ZShjdHgsIGRhdGEsIGxlbik7Cit9CisKK2ludCBFVlBfRGlnZXN0VmVyaWZ5VXBkYXRlKEVWUF9NRF9DVFggKmN0eCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbikgeworICByZXR1cm4gRVZQX0RpZ2VzdFVwZGF0ZShjdHgsIGRhdGEsIGxlbik7Cit9CisKK2ludCBFVlBfRGlnZXN0U2lnbkZpbmFsKEVWUF9NRF9DVFggKmN0eCwgdWludDhfdCAqb3V0X3NpZywKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqb3V0X3NpZ19sZW4pIHsKKyAgaW50IHIgPSAwOworICBjb25zdCBpbnQgaGFzX3NpZ25jdHggPSBjdHgtPnBjdHgtPnBtZXRoLT5zaWduY3R4ICE9IE5VTEw7CisKKyAgaWYgKG91dF9zaWcpIHsKKyAgICBFVlBfTURfQ1RYIHRtcF9jdHg7CisgICAgdWludDhfdCBtZFtFVlBfTUFYX01EX1NJWkVdOworICAgIHVuc2lnbmVkIGludCBtZGxlbjsKKworICAgIEVWUF9NRF9DVFhfaW5pdCgmdG1wX2N0eCk7CisgICAgaWYgKCFFVlBfTURfQ1RYX2NvcHlfZXgoJnRtcF9jdHgsIGN0eCkpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoaGFzX3NpZ25jdHgpIHsKKyAgICAgIHIgPSB0bXBfY3R4LnBjdHgtPnBtZXRoLT5zaWduY3R4KHRtcF9jdHgucGN0eCwgb3V0X3NpZywgb3V0X3NpZ19sZW4sICZ0bXBfY3R4KTsKKyAgICB9IGVsc2UgeworICAgICAgciA9IEVWUF9EaWdlc3RGaW5hbF9leCgmdG1wX2N0eCwgbWQsICZtZGxlbik7CisgICAgfQorICAgIEVWUF9NRF9DVFhfY2xlYW51cCgmdG1wX2N0eCk7CisgICAgaWYgKGhhc19zaWduY3R4IHx8ICFyKSB7CisgICAgICByZXR1cm4gcjsKKyAgICB9CisgICAgaWYgKEVWUF9QS0VZX3NpZ24oY3R4LT5wY3R4LCBvdXRfc2lnLCBvdXRfc2lnX2xlbiwgbWQsIG1kbGVuKSA8PSAwKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGhhc19zaWduY3R4KSB7CisgICAgICBpZiAoY3R4LT5wY3R4LT5wbWV0aC0+c2lnbmN0eChjdHgtPnBjdHgsIG91dF9zaWcsIG91dF9zaWdfbGVuLCBjdHgpIDw9IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHNpemVfdCBzID0gRVZQX01EX3NpemUoY3R4LT5kaWdlc3QpOworICAgICAgaWYgKEVWUF9QS0VZX3NpZ24oY3R4LT5wY3R4LCBvdXRfc2lnLCBvdXRfc2lnX2xlbiwgTlVMTCwgcykgPD0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBFVlBfRGlnZXN0VmVyaWZ5RmluYWwoRVZQX01EX0NUWCAqY3R4LCBjb25zdCB1aW50OF90ICpzaWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaWdfbGVuKSB7CisgIEVWUF9NRF9DVFggdG1wX2N0eDsKKyAgdWludDhfdCBtZFtFVlBfTUFYX01EX1NJWkVdOworICBpbnQgcjsKKyAgdW5zaWduZWQgaW50IG1kbGVuOworICBjb25zdCBpbnQgaGFzX3ZlcmlmeWN0eCA9IGN0eC0+cGN0eC0+cG1ldGgtPnZlcmlmeWN0eCAhPSBOVUxMOworCisgIEVWUF9NRF9DVFhfaW5pdCgmdG1wX2N0eCk7CisgIGlmICghRVZQX01EX0NUWF9jb3B5X2V4KCZ0bXBfY3R4LCBjdHgpKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmIChoYXNfdmVyaWZ5Y3R4KSB7CisgICAgciA9IHRtcF9jdHgucGN0eC0+cG1ldGgtPnZlcmlmeWN0eCh0bXBfY3R4LnBjdHgsIHNpZywgc2lnX2xlbiwgJnRtcF9jdHgpOworICB9IGVsc2UgeworICAgIHIgPSBFVlBfRGlnZXN0RmluYWxfZXgoJnRtcF9jdHgsIG1kLCAmbWRsZW4pOworICB9CisKKyAgRVZQX01EX0NUWF9jbGVhbnVwKCZ0bXBfY3R4KTsKKyAgaWYgKGhhc192ZXJpZnljdHggfHwgIXIpIHsKKyAgICByZXR1cm4gcjsKKyAgfQorICByZXR1cm4gRVZQX1BLRVlfdmVyaWZ5KGN0eC0+cGN0eCwgc2lnLCBzaWdfbGVuLCBtZCwgbWRsZW4pOworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2V2cC9ldnAuYyBiL2NyeXB0by9ldnAvZXZwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ2ZmQ4YwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9ldnAvZXZwLmMKQEAgLTAsMCArMSw0MjUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZGguaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2RzYS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZWMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgorCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworCitleHRlcm4gY29uc3QgRVZQX1BLRVlfQVNOMV9NRVRIT0QgZWNfYXNuMV9tZXRoOworZXh0ZXJuIGNvbnN0IEVWUF9QS0VZX0FTTjFfTUVUSE9EIGhtYWNfYXNuMV9tZXRoOworZXh0ZXJuIGNvbnN0IEVWUF9QS0VZX0FTTjFfTUVUSE9EIHJzYV9hc24xX21ldGg7CisKK0VWUF9QS0VZICpFVlBfUEtFWV9uZXcoKSB7CisgIEVWUF9QS0VZICpyZXQ7CisKKyAgcmV0ID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEVWUF9QS0VZKSk7CisgIGlmIChyZXQgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1BLRVlfbmV3LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBtZW1zZXQocmV0LCAwLCBzaXplb2YoRVZQX1BLRVkpKTsKKyAgcmV0LT50eXBlID0gRVZQX1BLRVlfTk9ORTsKKyAgcmV0LT5yZWZlcmVuY2VzID0gMTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBmcmVlX2l0KEVWUF9QS0VZICpwa2V5KSB7CisgIGlmIChwa2V5LT5hbWV0aCAmJiBwa2V5LT5hbWV0aC0+cGtleV9mcmVlKSB7CisgICAgcGtleS0+YW1ldGgtPnBrZXlfZnJlZShwa2V5KTsKKyAgICBwa2V5LT5wa2V5LnB0ciA9IE5VTEw7CisgICAgcGtleS0+dHlwZSA9IEVWUF9QS0VZX05PTkU7CisgIH0KK30KKwordm9pZCBFVlBfUEtFWV9mcmVlKEVWUF9QS0VZICpwa2V5KSB7CisgIGlmIChwa2V5ID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoQ1JZUFRPX2FkZCgmcGtleS0+cmVmZXJlbmNlcywgLTEsIENSWVBUT19MT0NLX0VWUF9QS0VZKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIGZyZWVfaXQocGtleSk7CisgIGlmIChwa2V5LT5hdHRyaWJ1dGVzKSB7CisgICAgLyogVE9ETyhmb3JrKTogbGF5ZXJpbmc6IFg1MDlfQVRUUklCVVRFX2ZyZWUgaXMgYW4gWC41MDkgZnVuY3Rpb24uIEluCisgICAgICogcHJhY3RpY2UgdGhpcyBwYXRoIGlzbid0IGNhbGxlZCBidXQgc2hvdWxkIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4gKi8KKyAgICAvKnNrX1g1MDlfQVRUUklCVVRFX3BvcF9mcmVlKHBrZXktPmF0dHJpYnV0ZXMsIFg1MDlfQVRUUklCVVRFX2ZyZWUpOyovCisgICAgYXNzZXJ0KDApOworICB9CisgIE9QRU5TU0xfZnJlZShwa2V5KTsKK30KKworaW50IEVWUF9QS0VZX2NtcChjb25zdCBFVlBfUEtFWSAqYSwgY29uc3QgRVZQX1BLRVkgKmIpIHsKKyAgaWYgKGEtPnR5cGUgIT0gYi0+dHlwZSkgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmIChhLT5hbWV0aCkgeworICAgIGludCByZXQ7CisgICAgLyogQ29tcGFyZSBwYXJhbWV0ZXJzIGlmIHRoZSBhbGdvcml0aG0gaGFzIHRoZW0gKi8KKyAgICBpZiAoYS0+YW1ldGgtPnBhcmFtX2NtcCkgeworICAgICAgcmV0ID0gYS0+YW1ldGgtPnBhcmFtX2NtcChhLCBiKTsKKyAgICAgIGlmIChyZXQgPD0gMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoYS0+YW1ldGgtPnB1Yl9jbXApIHsKKyAgICAgIHJldHVybiBhLT5hbWV0aC0+cHViX2NtcChhLCBiKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gLTI7Cit9CisKK0VWUF9QS0VZICpFVlBfUEtFWV9kdXAoRVZQX1BLRVkgKnBrZXkpIHsKKyAgQ1JZUFRPX2FkZCgmcGtleS0+cmVmZXJlbmNlcywgMSwgQ1JZUFRPX0xPQ0tfRVZQX1BLRVkpOworICByZXR1cm4gcGtleTsKK30KKworaW50IEVWUF9QS0VZX2NvcHlfcGFyYW1ldGVycyhFVlBfUEtFWSAqdG8sIGNvbnN0IEVWUF9QS0VZICpmcm9tKSB7CisgIGlmICh0by0+dHlwZSAhPSBmcm9tLT50eXBlKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9jb3B5X3BhcmFtZXRlcnMsIEVWUF9SX0RJRkZFUkVOVF9LRVlfVFlQRVMpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKEVWUF9QS0VZX21pc3NpbmdfcGFyYW1ldGVycyhmcm9tKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1BLRVlfY29weV9wYXJhbWV0ZXJzLCBFVlBfUl9NSVNTSU5HX1BBUkFNRVRFUlMpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKGZyb20tPmFtZXRoICYmIGZyb20tPmFtZXRoLT5wYXJhbV9jb3B5KSB7CisgICAgcmV0dXJuIGZyb20tPmFtZXRoLT5wYXJhbV9jb3B5KHRvLCBmcm9tKTsKKyAgfQorCitlcnI6CisgIHJldHVybiAwOworfQorCitpbnQgRVZQX1BLRVlfbWlzc2luZ19wYXJhbWV0ZXJzKGNvbnN0IEVWUF9QS0VZICpwa2V5KSB7CisgIGlmIChwa2V5LT5hbWV0aCAmJiBwa2V5LT5hbWV0aC0+cGFyYW1fbWlzc2luZykgeworICAgIHJldHVybiBwa2V5LT5hbWV0aC0+cGFyYW1fbWlzc2luZyhwa2V5KTsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IEVWUF9QS0VZX3NpemUoY29uc3QgRVZQX1BLRVkgKnBrZXkpIHsKKyAgaWYgKHBrZXkgJiYgcGtleS0+YW1ldGggJiYgcGtleS0+YW1ldGgtPnBrZXlfc2l6ZSkgeworICAgIHJldHVybiBwa2V5LT5hbWV0aC0+cGtleV9zaXplKHBrZXkpOworICB9CisgIHJldHVybiAwOworfQorCitpbnQgRVZQX1BLRVlfYml0cyhFVlBfUEtFWSAqcGtleSkgeworICBpZiAocGtleSAmJiBwa2V5LT5hbWV0aCAmJiBwa2V5LT5hbWV0aC0+cGtleV9iaXRzKSB7CisgICAgcmV0dXJuIHBrZXktPmFtZXRoLT5wa2V5X2JpdHMocGtleSk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludCBFVlBfUEtFWV9pZChjb25zdCBFVlBfUEtFWSAqcGtleSkgeworICByZXR1cm4gcGtleS0+dHlwZTsKK30KKworLyogVE9ETyhmb3JrKTogcmVtb3ZlIHRoZSBmaXJzdCBhcmd1bWVudC4gKi8KK2NvbnN0IEVWUF9QS0VZX0FTTjFfTUVUSE9EICpFVlBfUEtFWV9hc24xX2ZpbmQoRU5HSU5FICoqcGVuZ2luZSwgaW50IG5pZCkgeworICBzd2l0Y2ggKG5pZCkgeworICAgIGNhc2UgRVZQX1BLRVlfUlNBOgorICAgIGNhc2UgRVZQX1BLRVlfUlNBMjoKKyAgICAgIHJldHVybiAmcnNhX2FzbjFfbWV0aDsKKyAgICBjYXNlIEVWUF9QS0VZX0hNQUM6CisgICAgICByZXR1cm4gJmhtYWNfYXNuMV9tZXRoOworICAgIGNhc2UgRVZQX1BLRVlfRUM6CisgICAgICByZXR1cm4gJmVjX2FzbjFfbWV0aDsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworaW50IEVWUF9QS0VZX3R5cGUoaW50IG5pZCkgeworICBjb25zdCBFVlBfUEtFWV9BU04xX01FVEhPRCAqbWV0aCA9IEVWUF9QS0VZX2FzbjFfZmluZChOVUxMLCBuaWQpOworICBpZiAobWV0aCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5JRF91bmRlZjsKKyAgfQorICByZXR1cm4gbWV0aC0+cGtleV9pZDsKK30KKworRVZQX1BLRVkgKkVWUF9QS0VZX25ld19tYWNfa2V5KGludCB0eXBlLCBFTkdJTkUgKmUsIGNvbnN0IHVpbnQ4X3QgKm1hY19rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG1hY19rZXlfbGVuKSB7CisgIEVWUF9QS0VZX0NUWCAqbWFjX2N0eCA9IE5VTEw7CisgIEVWUF9QS0VZICpyZXQgPSBOVUxMOworCisgIG1hY19jdHggPSBFVlBfUEtFWV9DVFhfbmV3X2lkKHR5cGUsIGUpOworICBpZiAoIW1hY19jdHgpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmIChFVlBfUEtFWV9rZXlnZW5faW5pdChtYWNfY3R4KSA8PSAwIHx8CisgICAgICBFVlBfUEtFWV9DVFhfY3RybChtYWNfY3R4LCAtMSwgRVZQX1BLRVlfT1BfS0VZR0VOLAorICAgICAgICAgICAgICAgICAgICAgICAgRVZQX1BLRVlfQ1RSTF9TRVRfTUFDX0tFWSwgbWFjX2tleV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCAqKW1hY19rZXkpIDw9IDAgfHwKKyAgICAgIEVWUF9QS0VZX2tleWdlbihtYWNfY3R4LCAmcmV0KSA8PSAwKSB7CisgICAgcmV0ID0gTlVMTDsKKyAgICBnb3RvIG1lcnI7CisgIH0KKworbWVycjoKKyAgaWYgKG1hY19jdHgpCisgICAgRVZQX1BLRVlfQ1RYX2ZyZWUobWFjX2N0eCk7CisgIHJldHVybiByZXQ7Cit9CisKK2ludCBFVlBfUEtFWV9zZXQxX1JTQShFVlBfUEtFWSAqcGtleSwgUlNBICprZXkpIHsKKyAgaWYgKEVWUF9QS0VZX2Fzc2lnbl9SU0EocGtleSwga2V5KSkgeworICAgIFJTQV91cF9yZWYoa2V5KTsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IEVWUF9QS0VZX2Fzc2lnbl9SU0EoRVZQX1BLRVkgKnBrZXksIFJTQSAqa2V5KSB7CisgIHJldHVybiBFVlBfUEtFWV9hc3NpZ24ocGtleSwgRVZQX1BLRVlfUlNBLCBrZXkpOworfQorCitSU0EgKkVWUF9QS0VZX2dldDFfUlNBKEVWUF9QS0VZICpwa2V5KSB7CisgIGlmIChwa2V5LT50eXBlICE9IEVWUF9QS0VZX1JTQSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1BLRVlfZ2V0MV9SU0EsIEVWUF9SX0VYUEVDVElOR19BTl9SU0FfS0VZKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBSU0FfdXBfcmVmKHBrZXktPnBrZXkucnNhKTsKKyAgcmV0dXJuIHBrZXktPnBrZXkucnNhOworfQorCitpbnQgRVZQX1BLRVlfc2V0MV9EU0EoRVZQX1BLRVkgKnBrZXksIERTQSAqa2V5KSB7CisgIGlmIChFVlBfUEtFWV9hc3NpZ25fRFNBKHBrZXksIGtleSkpIHsKKyAgICBEU0FfdXBfcmVmKGtleSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludCBFVlBfUEtFWV9hc3NpZ25fRFNBKEVWUF9QS0VZICpwa2V5LCBEU0EgKmtleSkgeworICByZXR1cm4gRVZQX1BLRVlfYXNzaWduKHBrZXksIEVWUF9QS0VZX0RTQSwga2V5KTsKK30KKworRFNBICpFVlBfUEtFWV9nZXQxX0RTQShFVlBfUEtFWSAqcGtleSkgeworICBpZiAocGtleS0+dHlwZSAhPSBFVlBfUEtFWV9EU0EpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX2dldDFfRFNBLCBFVlBfUl9FWFBFQ1RJTkdfQV9EU0FfS0VZKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBEU0FfdXBfcmVmKHBrZXktPnBrZXkuZHNhKTsKKyAgcmV0dXJuIHBrZXktPnBrZXkuZHNhOworfQorCitpbnQgRVZQX1BLRVlfc2V0MV9FQ19LRVkoRVZQX1BLRVkgKnBrZXksIEVDX0tFWSAqa2V5KSB7CisgIGlmIChFVlBfUEtFWV9hc3NpZ25fRUNfS0VZKHBrZXksIGtleSkpIHsKKyAgICBFQ19LRVlfdXBfcmVmKGtleSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludCBFVlBfUEtFWV9hc3NpZ25fRUNfS0VZKEVWUF9QS0VZICpwa2V5LCBFQ19LRVkgKmtleSkgeworICByZXR1cm4gRVZQX1BLRVlfYXNzaWduKHBrZXksIEVWUF9QS0VZX0VDLCBrZXkpOworfQorCitFQ19LRVkgKkVWUF9QS0VZX2dldDFfRUNfS0VZKEVWUF9QS0VZICpwa2V5KSB7CisgIGlmIChwa2V5LT50eXBlICE9IEVWUF9QS0VZX0VDKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9nZXQxX0VDX0tFWSwgRVZQX1JfRVhQRUNUSU5HX0FOX0VDX0tFWV9LRVkpOworICAgIHJldHVybiBOVUxMOworICB9CisgIEVDX0tFWV91cF9yZWYocGtleS0+cGtleS5lYyk7CisgIHJldHVybiBwa2V5LT5wa2V5LmVjOworfQorCitpbnQgRVZQX1BLRVlfc2V0MV9ESChFVlBfUEtFWSAqcGtleSwgREggKmtleSkgeworICBpZiAoRVZQX1BLRVlfYXNzaWduX0RIKHBrZXksIGtleSkpIHsKKyAgICBESF91cF9yZWYoa2V5KTsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IEVWUF9QS0VZX2Fzc2lnbl9ESChFVlBfUEtFWSAqcGtleSwgREggKmtleSkgeworICByZXR1cm4gRVZQX1BLRVlfYXNzaWduKHBrZXksIEVWUF9QS0VZX0VDLCBrZXkpOworfQorCitESCAqRVZQX1BLRVlfZ2V0MV9ESChFVlBfUEtFWSAqcGtleSkgeworICBpZiAocGtleS0+dHlwZSAhPSBFVlBfUEtFWV9ESCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1BLRVlfZ2V0MV9ESCwgRVZQX1JfRVhQRUNUSU5HX0FfREhfS0VZKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBESF91cF9yZWYocGtleS0+cGtleS5kaCk7CisgIHJldHVybiBwa2V5LT5wa2V5LmRoOworfQorCitpbnQgRVZQX1BLRVlfYXNzaWduKEVWUF9QS0VZICpwa2V5LCBpbnQgdHlwZSwgdm9pZCAqa2V5KSB7CisgIGlmICghRVZQX1BLRVlfc2V0X3R5cGUocGtleSwgdHlwZSkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBwa2V5LT5wa2V5LnB0ciA9IGtleTsKKyAgcmV0dXJuIGtleSAhPSBOVUxMOworfQorCitjb25zdCBFVlBfUEtFWV9BU04xX01FVEhPRCAqRVZQX1BLRVlfYXNuMV9maW5kX3N0cihFTkdJTkUgKipwZW5naW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4pIHsKKyAgaWYgKGxlbiA9PSAzICYmIG1lbWNtcChuYW1lLCAiUlNBIiwgMykgPT0gMCkgeworICAgIHJldHVybiAmcnNhX2FzbjFfbWV0aDsKKyAgfSBlbHNlIGlmIChsZW4gPT0gNCAmJiBtZW1jbXAobmFtZSwgIkhNQUMiLCA0KSA9PSAwKSB7CisgICAgcmV0dXJuICZobWFjX2FzbjFfbWV0aDsKKyAgfSBpZiAobGVuID09IDIgJiYgbWVtY21wKG5hbWUsICJFQyIsIDQpID09IDApIHsKKyAgICByZXR1cm4gJmVjX2FzbjFfbWV0aDsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworaW50IEVWUF9QS0VZX3NldF90eXBlKEVWUF9QS0VZICpwa2V5LCBpbnQgdHlwZSkgeworICBjb25zdCBFVlBfUEtFWV9BU04xX01FVEhPRCAqYW1ldGg7CisKKyAgaWYgKHBrZXkgJiYgcGtleS0+cGtleS5wdHIpIHsKKyAgICBmcmVlX2l0KHBrZXkpOworICB9CisKKyAgYW1ldGggPSBFVlBfUEtFWV9hc24xX2ZpbmQoTlVMTCwgdHlwZSk7CisgIGlmIChhbWV0aCA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9zZXRfdHlwZSwgRVZQX1JfVU5TVVBQT1JURURfQUxHT1JJVEhNKTsKKyAgICBFUlJfYWRkX2Vycm9yX2RhdGFmKCJhbGdvcml0aG0gJWQgKCVzKSIsIHR5cGUsIE9CSl9uaWQyc24odHlwZSkpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKHBrZXkpIHsKKyAgICBwa2V5LT5hbWV0aCA9IGFtZXRoOworICAgIHBrZXktPnR5cGUgPSBwa2V5LT5hbWV0aC0+cGtleV9pZDsKKyAgfQorCisgIHJldHVybiAxOworfQorCisKKworaW50IEVWUF9QS0VZX2NtcF9wYXJhbWV0ZXJzKGNvbnN0IEVWUF9QS0VZICphLCBjb25zdCBFVlBfUEtFWSAqYikgeworICBpZiAoYS0+dHlwZSAhPSBiLT50eXBlKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmIChhLT5hbWV0aCAmJiBhLT5hbWV0aC0+cGFyYW1fY21wKSB7CisgICAgcmV0dXJuIGEtPmFtZXRoLT5wYXJhbV9jbXAoYSwgYik7CisgIH0KKyAgcmV0dXJuIC0yOworfQorCitzdGF0aWMgaW50IHByaW50X3Vuc3VwcG9ydGVkKEJJTyAqb3V0LCBjb25zdCBFVlBfUEtFWSAqcGtleSwgaW50IGluZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa3N0cikgeworICBCSU9faW5kZW50KG91dCwgaW5kZW50LCAxMjgpOworICBCSU9fcHJpbnRmKG91dCwgIiVzIGFsZ29yaXRobSBcIiVzXCIgdW5zdXBwb3J0ZWRcbiIsIGtzdHIsCisgICAgICAgICAgICAgT0JKX25pZDJsbihwa2V5LT50eXBlKSk7CisgIHJldHVybiAxOworfQorCitpbnQgRVZQX1BLRVlfcHJpbnRfcHVibGljKEJJTyAqb3V0LCBjb25zdCBFVlBfUEtFWSAqcGtleSwgaW50IGluZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOMV9QQ1RYICpwY3R4KSB7CisgIGlmIChwa2V5LT5hbWV0aCAmJiBwa2V5LT5hbWV0aC0+cHViX3ByaW50KSB7CisgICAgcmV0dXJuIHBrZXktPmFtZXRoLT5wdWJfcHJpbnQob3V0LCBwa2V5LCBpbmRlbnQsIHBjdHgpOworICB9CisKKyAgcmV0dXJuIHByaW50X3Vuc3VwcG9ydGVkKG91dCwgcGtleSwgaW5kZW50LCAiUHVibGljIEtleSIpOworfQorCitpbnQgRVZQX1BLRVlfcHJpbnRfcHJpdmF0ZShCSU8gKm91dCwgY29uc3QgRVZQX1BLRVkgKnBrZXksIGludCBpbmRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBU04xX1BDVFggKnBjdHgpIHsKKyAgaWYgKHBrZXktPmFtZXRoICYmIHBrZXktPmFtZXRoLT5wcml2X3ByaW50KSB7CisgICAgcmV0dXJuIHBrZXktPmFtZXRoLT5wcml2X3ByaW50KG91dCwgcGtleSwgaW5kZW50LCBwY3R4KTsKKyAgfQorCisgIHJldHVybiBwcmludF91bnN1cHBvcnRlZChvdXQsIHBrZXksIGluZGVudCwgIlByaXZhdGUgS2V5Iik7Cit9CisKK2ludCBFVlBfUEtFWV9wcmludF9wYXJhbXMoQklPICpvdXQsIGNvbnN0IEVWUF9QS0VZICpwa2V5LCBpbnQgaW5kZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBU04xX1BDVFggKnBjdHgpIHsKKyAgaWYgKHBrZXktPmFtZXRoICYmIHBrZXktPmFtZXRoLT5wYXJhbV9wcmludCkgeworICAgIHJldHVybiBwa2V5LT5hbWV0aC0+cGFyYW1fcHJpbnQob3V0LCBwa2V5LCBpbmRlbnQsIHBjdHgpOworICB9CisKKyAgcmV0dXJuIHByaW50X3Vuc3VwcG9ydGVkKG91dCwgcGtleSwgaW5kZW50LCAiUGFyYW1ldGVycyIpOworfQorCitpbnQgRVZQX1BLRVlfQ1RYX3NldF9zaWduYXR1cmVfbWQoRVZQX1BLRVlfQ1RYICpjdHgsIGNvbnN0IEVWUF9NRCAqbWQpIHsKKyAgcmV0dXJuIEVWUF9QS0VZX0NUWF9jdHJsKGN0eCwgLTEsIEVWUF9QS0VZX09QX1RZUEVfU0lHLCBFVlBfUEtFWV9DVFJMX01ELCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltZCk7Cit9CisKK2ludCBFVlBfUEtFWV9DVFhfZ2V0X3NpZ25hdHVyZV9tZChFVlBfUEtFWV9DVFggKmN0eCwgY29uc3QgRVZQX01EICoqb3V0X21kKSB7CisgIHJldHVybiBFVlBfUEtFWV9DVFhfY3RybChjdHgsIC0xLCBFVlBfUEtFWV9PUF9UWVBFX1NJRywgRVZQX1BLRVlfQ1RSTF9HRVRfTUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAodm9pZCAqKW91dF9tZCk7Cit9CisKK3ZvaWQgT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXMoKSB7fQorCit2b2lkIEVWUF9jbGVhbnVwKCkge30KZGlmZiAtLWdpdCBhL2NyeXB0by9ldnAvZXZwLmggYi9jcnlwdG8vZXZwL2V2cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNDBhYTUKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vZXZwL2V2cC5oCkBAIC0wLDAgKzEsODE5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaWZuZGVmIE9QRU5TU0xfSEVBREVSX0VWUF9ICisjZGVmaW5lIE9QRU5TU0xfSEVBREVSX0VWUF9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jhc2UuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3N0YWNrLmg+CisKKy8qIE9wZW5TU0wgaW5jbHVkZWQgZGlnZXN0IGFuZCBjaXBoZXIgZnVuY3Rpb25zIGluIHRoaXMgaGVhZGVyIHNvIHdlIGluY2x1ZGUKKyAqIHRoZW0gZm9yIHVzZXJzIHRoYXQgc3RpbGwgZXhwZWN0IHRoYXQuICovCisjaW5jbHVkZSA8b3BlbnNzbC9jaXBoZXIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2RpZ2VzdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3RocmVhZC5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogRVZQIGFic3RyYWN0cyBvdmVyIHB1YmxpYy9wcml2YXRlIGtleSBhbGdvcml0aG1zLiAqLworCisKKy8qIFB1YmxpYyBrZXkgb2JqZWN0cy4gKi8KKworLyogRVZQX1BLRVlfbmV3IGNyZWF0ZXMgYSBuZXcsIGVtcHR5IHB1YmxpYy1rZXkgb2JqZWN0IGFuZCByZXR1cm5zIGl0IG9yIE5VTEwKKyAqIG9uIGFsbG9jYXRpb24gZmFpbHVyZS4gKi8KK0VWUF9QS0VZICpFVlBfUEtFWV9uZXcoKTsKKworLyogRVZQX1BLRVlfZnJlZSBmcmVlcyBhbGwgZGF0YSByZWZlcmVuY2VkIGJ5IHxwa2V5fCBhbmQgdGhlbiBmcmVlcyB8cGtleXwKKyAqIGl0c2VsZi4gKi8KK3ZvaWQgRVZQX1BLRVlfZnJlZShFVlBfUEtFWSAqcGtleSk7CisKKy8qIEVWUF9QS0VZX2NtcCBjb21wYXJlcyB8YXwgYW5kIHxifCBhbmQgcmV0dXJucyBvbmUgaWYgdGhleSBhcmUgZXF1YWwsIHplcm8gaWYKKyAqIG5vdCBhbmQgYSBuZWdhdGl2ZSBudW1iZXIgb24gZXJyb3IuCisgKgorICogV0FSTklORzogdGhpcyBkaWZmZXJzIGZyb20gdGhlIHRyYWRpdGlvbmFsIHJldHVybiB2YWx1ZSBvZiBhICJjbXAiCisgKiBmdW5jdGlvbi4gKi8KK2ludCBFVlBfUEtFWV9jbXAoY29uc3QgRVZQX1BLRVkgKmEsIGNvbnN0IEVWUF9QS0VZICpiKTsKKworLyogRVZQX1BLRVlfZHVwIGFkZHMgb25lIHRvIHRoZSByZWZlcmVuY2UgY291bnQgb2YgfHBrZXl8IGFuZCByZXR1cm5zCisgKiB8cGtleXwuICovCitFVlBfUEtFWSAqRVZQX1BLRVlfZHVwKEVWUF9QS0VZICpwa2V5KTsKKworLyogRVZQX1BLRVlfY29weV9wYXJhbWV0ZXJzIHNldHMgdGhlIHBhcmFtZXRlcnMgb2YgfHRvfCB0byBlcXVhbCB0aGUgcGFyYW1ldGVycworICogb2YgfGZyb218LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG9uIGVycm9yLiAqLworaW50IEVWUF9QS0VZX2NvcHlfcGFyYW1ldGVycyhFVlBfUEtFWSAqdG8sIGNvbnN0IEVWUF9QS0VZICpmcm9tKTsKKworLyogRVZQX1BLRVlfbWlzc2luZ19wYXJhbWV0ZXJzIHJldHVybnMgb25lIGlmIHxwa2V5fCBpcyBtaXNzaW5nIG5lZWRlZAorICogcGFyYW1ldGVycyBvciB6ZXJvIGlmIG5vdCwgb3IgaWYgdGhlIGFsZ29yaXRobSBkb2Vzbid0IHRha2UgcGFyYW1ldGVycy4gKi8KK2ludCBFVlBfUEtFWV9taXNzaW5nX3BhcmFtZXRlcnMoY29uc3QgRVZQX1BLRVkgKnBrZXkpOworCisvKiBFVlBfUEtFWV9zaXplIHJldHVybnMgdGhlICJzaXplIiwgaW4gYnl0ZXMsIG9mIHxwa2V5fC4gRm9yIGV4YW1wbGUsIGZvciBhbgorICogUlNBIGtleSB0aGlzIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gcmVwcmVzZW50IHRoZSBtb2R1bHVzLiAqLworaW50IEVWUF9QS0VZX3NpemUoY29uc3QgRVZQX1BLRVkgKnBrZXkpOworCisvKiBFVlBfUEtFWV9iaXRzIHJldHVybnMgdGhlICJzaXplIiwgaW4gYml0cywgb2YgfHBrZXl8LiBGb3IgZXhhbXBsZSwgZm9yIGFuCisgKiBSU0Ega2V5LCB0aGlzIHJldHVybnMgdGhlIGJpdCBsZW5ndGggb2YgdGhlIG1vZHVsdXMuICovCitpbnQgRVZQX1BLRVlfYml0cyhFVlBfUEtFWSAqcGtleSk7CisKKy8qIEVWUF9QS0VZX2lkIHJldHVybnMgdGhlIHR5cGUgb2YgfHBrZXl8LCB3aGljaCBpcyBvbmUgb2YgdGhlIHxFVlBfUEtFWV8qfAorICogdmFsdWVzLiAqLworaW50IEVWUF9QS0VZX2lkKGNvbnN0IEVWUF9QS0VZICpwa2V5KTsKKworLyogRVZQX1BLRVlfdHlwZSByZXR1cm5zIGEgY2Fub25pY2FsaXNlZCBmb3JtIG9mIHxOSUR8LiBGb3IgZXhhbXBsZSwKKyAqIHxFVlBfUEtFWV9SU0EyfCB3aWxsIGJlIHR1cm5lZCBpbnRvIHxFVlBfUEtFWV9SU0F8LiAqLworaW50IEVWUF9QS0VZX3R5cGUoaW50IG5pZCk7CisKKy8qIEVWUF9QS0VZX25ld19tYWNfa2V5IGFsbG9jYXRlcyBhIGZyZXNoIHxFVlBfUEtFWXwgb2YgdGhlIGdpdmVuIHR5cGUgKGUuZy4KKyAqIHxFVlBfUEtFWV9ITUFDfCksIHNldHMgfG1hY19rZXl8IGFzIHRoZSBNQUMga2V5IGFuZCAiZ2VuZXJhdGVzIiBhIG5ldyBrZXksCisgKiBzdWl0YWJsZSBmb3Igc2lnbmluZy4gSXQgcmV0dXJucyB0aGUgZnJlc2ggfEVWUF9QS0VZfCwgb3IgTlVMTCBvbiBlcnJvci4gKi8KK0VWUF9QS0VZICpFVlBfUEtFWV9uZXdfbWFjX2tleShpbnQgdHlwZSwgRU5HSU5FICplbmdpbmUsIGNvbnN0IHVpbnQ4X3QgKm1hY19rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG1hY19rZXlfbGVuKTsKKworCisvKiBHZXR0aW5nIGFuZCBzZXR0aW5nIGNvbmNyZXRlIHB1YmxpYyBrZXkgdHlwZXMuCisgKgorICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgZ2V0IGFuZCBzZXQgdGhlIHVuZGVybHlpbmcgcHVibGljIGtleSBpbiBhbgorICogfEVWUF9QS0VZfCBvYmplY3QuIFRoZSB8c2V0MXwgZnVuY3Rpb25zIHRha2UgYSBhZGRpdGlvbmFsIHJlZmVyZW5jZSB0byB0aGUKKyAqIHVuZGVybHlpbmcga2V5IGFuZCByZXR1cm4gb25lIG9uIHN1Y2Nlc3Mgb3IgemVybyBvbiBlcnJvci4gVGhlIHxhc3NpZ258CisgKiBmdW5jdGlvbnMgYWRvcHQgdGhlIGNhbGxlcidzIHJlZmVyZW5jZS4gVGhlIGdldHRlcnMgcmV0dXJuIGEgZnJlc2ggcmVmZXJlbmNlCisgKiB0byB0aGUgdW5kZXJseWluZyBvYmplY3QuICovCisKK2ludCBFVlBfUEtFWV9zZXQxX1JTQShFVlBfUEtFWSAqcGtleSwgUlNBICprZXkpOworaW50IEVWUF9QS0VZX2Fzc2lnbl9SU0EoRVZQX1BLRVkgKnBrZXksIFJTQSAqa2V5KTsKK1JTQSAqRVZQX1BLRVlfZ2V0MV9SU0EoRVZQX1BLRVkgKnBrZXkpOworCitpbnQgRVZQX1BLRVlfc2V0MV9EU0EoRVZQX1BLRVkgKnBrZXksIHN0cnVjdCBkc2Ffc3QgKmtleSk7CitpbnQgRVZQX1BLRVlfYXNzaWduX0RTQShFVlBfUEtFWSAqcGtleSwgRFNBICprZXkpOworc3RydWN0IGRzYV9zdCAqRVZQX1BLRVlfZ2V0MV9EU0EoRVZQX1BLRVkgKnBrZXkpOworCitpbnQgRVZQX1BLRVlfc2V0MV9FQ19LRVkoRVZQX1BLRVkgKnBrZXksIHN0cnVjdCBlY19rZXlfc3QgKmtleSk7CitpbnQgRVZQX1BLRVlfYXNzaWduX0VDX0tFWShFVlBfUEtFWSAqcGtleSwgRUNfS0VZICprZXkpOworc3RydWN0IGVjX2tleV9zdCAqRVZQX1BLRVlfZ2V0MV9FQ19LRVkoRVZQX1BLRVkgKnBrZXkpOworCitpbnQgRVZQX1BLRVlfc2V0MV9ESChFVlBfUEtFWSAqcGtleSwgc3RydWN0IGRoX3N0ICprZXkpOworaW50IEVWUF9QS0VZX2Fzc2lnbl9ESChFVlBfUEtFWSAqcGtleSwgREggKmtleSk7CitzdHJ1Y3QgZGhfc3QgKkVWUF9QS0VZX2dldDFfREgoRVZQX1BLRVkgKnBrZXkpOworCisjZGVmaW5lIEVWUF9QS0VZX05PTkUgTklEX3VuZGVmCisjZGVmaW5lIEVWUF9QS0VZX1JTQSBOSURfcnNhRW5jcnlwdGlvbgorI2RlZmluZSBFVlBfUEtFWV9SU0EyIE5JRF9yc2EKKyNkZWZpbmUgRVZQX1BLRVlfRFNBIE5JRF9kc2EKKyNkZWZpbmUgRVZQX1BLRVlfREggTklEX2RoS2V5QWdyZWVtZW50CisjZGVmaW5lIEVWUF9QS0VZX0RIWCBOSURfZGhwdWJsaWNudW1iZXIKKyNkZWZpbmUgRVZQX1BLRVlfRUMgTklEX1g5XzYyX2lkX2VjUHVibGljS2V5CisjZGVmaW5lIEVWUF9QS0VZX0hNQUMgTklEX2htYWMKKworLyogRVZQX1BLRVlfYXNzaWduIHNldHMgdGhlIHVuZGVybHlpbmcga2V5IG9mIHxwa2V5fCB0byB8a2V5fCwgd2hpY2ggbXVzdCBiZSBvZgorICogdGhlIGdpdmVuIHR5cGUuIFRoZSB8dHlwZXwgYXJndW1lbnQgc2hvdWxkIGJlIG9uZSBvZiB0aGUgfEVWUF9QS0VZXyp8CisgKiB2YWx1ZXMuICovCitpbnQgRVZQX1BLRVlfYXNzaWduKEVWUF9QS0VZICpwa2V5LCBpbnQgdHlwZSwgdm9pZCAqa2V5KTsKKworLyogRVZQX1BLRVlfc2V0X3R5cGUgc2V0cyB0aGUgdHlwZSBvZiB8cGtleXwgdG8gfHR5cGV8LCB3aGljaCBzaG91bGQgYmUgb25lIG9mCisgKiB0aGUgfEVWUF9QS0VZXyp8IHZhbHVlcy4gSXQgcmV0dXJucyBvbmUgaWYgc3VjZXNzZnVsIG9yIHplcm8gb3RoZXJ3aXNlLiBJZgorICogfHBrZXl8IGlzIE5VTEwsIGl0IHNpbXBseSByZXBvcnRzIHdoZXRoZXIgdGhlIHR5cGUgaXMga25vd24uICovCitpbnQgRVZQX1BLRVlfc2V0X3R5cGUoRVZQX1BLRVkgKnBrZXksIGludCB0eXBlKTsKKworLyogRVZQX1BLRVlfY21wX3BhcmFtZXRlcnMgY29tcGFyZXMgdGhlIHBhcmFtZXRlcnMgb2YgfGF8IGFuZCB8YnwuIEl0IHJldHVybnMKKyAqIG9uZSBpZiB0aGV5IG1hdGNoLCB6ZXJvIGlmIG5vdCwgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb2Ygb24gZXJyb3IuCisgKgorICogV0FSTklORzogdGhlIHJldHVybiB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIHVzdWFsIHJldHVybiB2YWx1ZSBjb252ZW50aW9uLiAqLworaW50IEVWUF9QS0VZX2NtcF9wYXJhbWV0ZXJzKGNvbnN0IEVWUF9QS0VZICphLCBjb25zdCBFVlBfUEtFWSAqYik7CisKKworLyogQVNOLjEgZnVuY3Rpb25zICovCisKKy8qIGQyaV9Qcml2YXRlS2V5IHBhcnNlcyBhbiBBU04uMSwgREVSLWVuY29kZWQsIHByaXZhdGUga2V5IGZyb20gfGxlbnwgYnl0ZXMgYXQKKyAqIHwqaW5wfC4gSWYgfG91dHwgaXMgbm90IE5VTEwgdGhlbiwgb24gZXhpdCwgYSBwb2ludGVyIHRvIHRoZSByZXN1bHQgaXMgaW4KKyAqIHwqb3V0fC4gSWYgfCpvdXR8IGlzIGFscmVhZHkgbm9uLU5VTEwgb24gZW50cnkgdGhlbiB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4KKyAqIGRpcmVjdGx5IGludG8gfCpvdXR8LCBvdGhlcndpc2UgYSBmcmVzaCB8RVZQX1BLRVl8IGlzIGFsbG9jYXRlZC4gT24KKyAqIHN1Y2Nlc3NmdWwgZXhpdCwgfCppbnB8IGlzIGFkdmFuY2VkIHBhc3QgdGhlIERFUiBzdHJ1Y3R1cmUuIEl0IHJldHVybnMgdGhlCisgKiByZXN1bHQgb3IgTlVMTCBvbiBlcnJvci4gKi8KK0VWUF9QS0VZICpkMmlfUHJpdmF0ZUtleShpbnQgdHlwZSwgRVZQX1BLRVkgKipvdXQsIGNvbnN0IHVpbnQ4X3QgKippbnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBsZW4pOworCisvKiBkMmlfQXV0b1ByaXZhdGVLZXkgYWN0cyB0aGUgc2FtZSBhcyB8ZDJpX1ByaXZhdGVLZXl8LCBidXQgZGV0ZWN0cyB0aGUgdHlwZQorICogb2YgdGhlIHByaXZhdGUga2V5LiAqLworRVZQX1BLRVkgKmQyaV9BdXRvUHJpdmF0ZUtleShFVlBfUEtFWSAqKm91dCwgY29uc3QgdWludDhfdCAqKmlucCwgbG9uZyBsZW4pOworCisvKiBpMmRfUHJpdmF0ZUtleSBtYXJzaGFscyBhIHByaXZhdGUga2V5IGZyb20gfGtleXwgdG8gYW4gQVNOLjEsIERFUgorICogc3RydWN0dXJlLiBJZiB8b3V0cHwgaXMgbm90IE5VTEwgdGhlbiB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8gfCpvdXRwfCBhbmQKKyAqIHwqb3V0cHwgaXMgYWR2YW5jZWQganVzdCBwYXN0IHRoZSBvdXRwdXQuIEl0IHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBpbgorICogdGhlIHJlc3VsdCwgd2hldGhlciB3cml0dGVuIG9yIG5vdCwgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvci4gKi8KK2ludCBpMmRfUHJpdmF0ZUtleShjb25zdCBFVlBfUEtFWSAqa2V5LCB1aW50OF90ICoqb3V0cCk7CisKKy8qIGkyZF9QdWJsaWNLZXkgbWFyc2hhbHMgYSBwdWJsaWMga2V5IGZyb20gfGtleXwgdG8gYW4gQVNOLjEsIERFUgorICogc3RydWN0dXJlLiBJZiB8b3V0cHwgaXMgbm90IE5VTEwgdGhlbiB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8gfCpvdXRwfCBhbmQKKyAqIHwqb3V0cHwgaXMgYWR2YW5jZWQganVzdCBwYXN0IHRoZSBvdXRwdXQuIEl0IHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBpbgorICogdGhlIHJlc3VsdCwgd2hldGhlciB3cml0dGVuIG9yIG5vdCwgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvci4gKi8KK2ludCBpMmRfUHVibGljS2V5KEVWUF9QS0VZICprZXksIHVpbnQ4X3QgKipvdXRwKTsKKworCisvKiBTaWduaW5nICovCisKKy8qIEVWUF9EaWdlc3RTaWduSW5pdCBzZXRzIHVwIHxjdHh8IGZvciBhIHNpZ25pbmcgb3BlcmF0aW9uIHdpdGggfHR5cGV8IGFuZAorICogfHBrZXl8LiBUaGUgfGN0eHwgYXJndW1lbnQgbXVzdCBoYXZlIGJlZW4gaW5pdGlhbGlzZWQgd2l0aAorICogfEVWUF9NRF9DVFhfaW5pdHwuIElmIHxwY3R4fCBpcyBub3QgTlVMTCwgdGhlIHxFVlBfUEtFWV9DVFh8IG9mIHRoZSBzaWduaW5nCisgKiBvcGVyYXRpb24gd2lsbCBiZSB3cml0dGVuIHRvIHwqcGN0eHw7IHRoaXMgY2FuIGJlIHVzZWQgdG8gc2V0IGFsdGVybmF0aXZlCisgKiBzaWduaW5nIG9wdGlvbnMuCisgKgorICogSXQgcmV0dXJucyBvbmUgb24gc3VjY2Vzcywgb3IgPD0gMCBvbiBlcnJvci4gV0FSTklORzogdGhpcyBkaWZmZXJzIGZyb20gdGhlCisgKiB1c3VhbCBPcGVuU1NMIHJldHVybiBjb252ZW50aW9uLiAqLworaW50IEVWUF9EaWdlc3RTaWduSW5pdChFVlBfTURfQ1RYICpjdHgsIEVWUF9QS0VZX0NUWCAqKnBjdHgsIGNvbnN0IEVWUF9NRCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgRU5HSU5FICplLCBFVlBfUEtFWSAqcGtleSk7CisKKy8qIEVWUF9EaWdlc3RTaWduVXBkYXRlIGFwcGVuZHMgfGxlbnwgYnl0ZXMgZnJvbSB8ZGF0YXwgdG8gdGhlIGRhdGEgd2hpY2ggd2lsbAorICogYmUgc2lnbmVkIGluIHxFVlBfRGlnZXN0U2lnbkZpbmFsfC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybworICogb3RoZXJ3aXNlLiAqLworaW50IEVWUF9EaWdlc3RTaWduVXBkYXRlKEVWUF9NRF9DVFggKmN0eCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbik7CisKKy8qIEVWUF9EaWdlc3RTaWduRmluYWwgc2lnbnMgdGhlIGRhdGEgdGhhdCBoYXMgYmVlbiBpbmNsdWRlZCBieSBvbmUgb3IgbW9yZQorICogY2FsbHMgdG8gfEVWUF9EaWdlc3RTaWduVXBkYXRlfC4gSWYgfG91dF9zaWd8IGlzIE5VTEwgdGhlbiB8Km91dF9zaWdfbGVufCBpcworICogc2V0IHRvIHRoZSBtYXhpbXVtIG51bWJlciBvZiBvdXRwdXQgYnl0ZXMuIE90aGVyd2lzZSwgb24gZW50cnksCisgKiB8Km91dF9zaWdfbGVufCBtdXN0IGNvbnRhaW4gdGhlIGxlbmd0aCBvZiB0aGUgfG91dF9zaWd8IGJ1ZmZlci4gSWYgdGhlIGNhbGwKKyAqIGlzIHN1Y2Nlc3NmdWwsIHRoZSBzaWduYXR1cmUgaXMgd3JpdHRlbiB0byB8b3V0X3NpZ3wgYW5kIHwqb3V0X3NpZ19sZW58IGlzCisgKiBzZXQgdG8gaXRzIGxlbmd0aC4KKyAqCisgKiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCA8PSAwIG9uIGVycm9yLiBXQVJOSU5HOiB0aGlzIGRpZmZlcnMgZnJvbSB0aGUKKyAqIHVzdWFsLCBPcGVuU1NMIHJldHVybiB2YWx1ZSBjb252ZW50aW9uLiAqLworaW50IEVWUF9EaWdlc3RTaWduRmluYWwoRVZQX01EX0NUWCAqY3R4LCB1aW50OF90ICpvdXRfc2lnLCBzaXplX3QgKm91dF9zaWdfbGVuKTsKKworCisvKiBWZXJpZnlpbmcgKi8KKworLyogRVZQX0RpZ2VzdFZlcmlmeUluaXQgc2V0cyB1cCB8Y3R4fCBmb3IgYSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIG9wZXJhdGlvbgorICogd2l0aCB8dHlwZXwgYW5kIHxwa2V5fC4gVGhlIHxjdHh8IGFyZ3VtZW50IG11c3QgaGF2ZSBiZWVuIGluaXRpYWxpc2VkIHdpdGgKKyAqIHxFVlBfTURfQ1RYX2luaXR8LiBJZiB8cGN0eHwgaXMgbm90IE5VTEwsIHRoZSB8RVZQX1BLRVlfQ1RYfCBvZiB0aGUgc2lnbmluZworICogb3BlcmF0aW9uIHdpbGwgYmUgd3JpdHRlbiB0byB8KnBjdHh8OyB0aGlzIGNhbiBiZSB1c2VkIHRvIHNldCBhbHRlcm5hdGl2ZQorICogc2lnbmluZyBvcHRpb25zLgorICoKKyAqIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MsIG9yIDw9IDAgb24gZXJyb3IuIFdBUk5JTkc6IHRoaXMgZGlmZmVycyBmcm9tIHRoZQorICogdXN1YWwgT3BlblNTTCByZXR1cm4gY29udmVudGlvbi4gKi8KK2ludCBFVlBfRGlnZXN0VmVyaWZ5SW5pdChFVlBfTURfQ1RYICpjdHgsIEVWUF9QS0VZX0NUWCAqKnBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRVZQX01EICp0eXBlLCBFTkdJTkUgKmUsIEVWUF9QS0VZICpwa2V5KTsKKworLyogRVZQX0RpZ2VzdFZlcmlmeVVwZGF0ZSBhcHBlbmRzIHxsZW58IGJ5dGVzIGZyb20gfGRhdGF8IHRvIHRoZSBkYXRhIHdoaWNoCisgKiB3aWxsIGJlIHZlcmlmaWVkIGJ5IHxFVlBfRGlnZXN0VmVyaWZ5RmluYWx8LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZAorICogemVybyBvdGhlcndpc2UuICovCitpbnQgRVZQX0RpZ2VzdFZlcmlmeVVwZGF0ZShFVlBfTURfQ1RYICpjdHgsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pOworCisvKiBFVlBfRGlnZXN0VmVyaWZ5RmluYWwgdmVyaWZpZXMgdGhhdCB8c2lnX2xlbnwgYnl0ZXMgb2YgfHNpZ3wgYXJlIGEgdmFsaWQKKyAqIHNpZ25hdHVyZSBmb3IgdGhlIGRhdGEgdGhhdCBoYXMgYmVlbiBpbmNsdWRlZCBieSBvbmUgb3IgbW9yZSBjYWxscyB0bworICogfEVWUF9EaWdlc3RWZXJpZnlVcGRhdGV8LgorICoKKyAqIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIDw9IDAgb24gZXJyb3IuIFdBUk5JTkc6IHRoaXMgZGlmZmVycyBmcm9tIHRoZQorICogdXN1YWwgcmV0dXJuIHZhbHVlIGNvbnZlbnRpb24uICovCitpbnQgRVZQX0RpZ2VzdFZlcmlmeUZpbmFsKEVWUF9NRF9DVFggKmN0eCwgY29uc3QgdWludDhfdCAqc2lnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2lnX2xlbik7CisKKworLyogU2lnbmluZyAob2xkIGZ1bmN0aW9ucykgKi8KKworLyogRVZQX1NpZ25Jbml0X2V4IGNvbmZpZ3VyZXMgfGN0eHwsIHdoaWNoIG11c3QgYWxyZWFkeSBoYXZlIGJlZW4gaW5pdGlhbGlzZWQsCisgKiBmb3IgYSBmcmVzaCBzaWduaW5nIG9wZXJhdGlvbiB1c2luZyB0aGUgaGFzaCBmdW5jdGlvbiB8dHlwZXwuIEl0IHJldHVybnMgb25lCisgKiBvbiBzdWNjZXNzIGFuZCB6ZXJvIG90aGVyd2lzZS4KKyAqCisgKiAoSW4gb3JkZXIgdG8gaW5pdGlhbGlzZSB8Y3R4fCwgZWl0aGVyIG9idGFpbiBpdCBpbml0aWFsaXNlZCB3aXRoCisgKiB8RVZQX01EX0NUWF9jcmVhdGV8LCBvciB1c2UgfEVWUF9NRF9DVFhfaW5pdHwuKSAqLworaW50IEVWUF9TaWduSW5pdF9leChFVlBfTURfQ1RYICpjdHgsIGNvbnN0IEVWUF9NRCAqdHlwZSwgRU5HSU5FICppbXBsKTsKKworLyogRVZQX1NpZ25Jbml0IGlzIGEgZGVwcmVjYXRlZCB2ZXJzaW9uIG9mIHxFVlBfU2lnbkluaXRfZXh8LgorICoKKyAqIFRPRE8oZm9yayk6IHJlbW92ZS4gKi8KK2ludCBFVlBfU2lnbkluaXQoRVZQX01EX0NUWCAqY3R4LCBjb25zdCBFVlBfTUQgKnR5cGUpOworCisvKiBFVlBfU2lnblVwZGF0ZSBhcHBlbmRzIHxsZW58IGJ5dGVzIGZyb20gfGRhdGF8IHRvIHRoZSBkYXRhIHdoaWNoIHdpbGwgYmUKKyAqIHNpZ25lZCBpbiB8RVZQX1NpZ25GaW5hbHwuICovCitpbnQgRVZQX1NpZ25VcGRhdGUoRVZQX01EX0NUWCAqY3R4LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKTsKKworLyogRVZQX1NpZ25GaW5hbCBzaWducyB0aGUgZGF0YSB0aGF0IGhhcyBiZWVuIGluY2x1ZGVkIGJ5IG9uZSBvciBtb3JlIGNhbGxzIHRvCisgKiB8RVZQX1NpZ25VcGRhdGV8LCB1c2luZyB0aGUga2V5IHxwa2V5fCwgYW5kIHdyaXRlcyBpdCB0byB8c2lnfC4gT24gZW50cnksCisgKiB8c2lnfCBtdXN0IHBvaW50IHRvIGF0IGxlYXN0IHxFVlBfUEtFWV9zaXplKHBrZXkpfCBieXRlcyBvZiBzcGFjZS4gVGhlCisgKiBhY3R1YWwgc2l6ZSBvZiB0aGUgc2lnbmF0dXJlIGlzIHdyaXR0ZW4gdG8gfCpvdXRfc2lnX2xlbnwuCisgKgorICogSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvdGhlcndpc2UuCisgKgorICogSXQgZG9lcyBub3QgbW9kaWZ5IHxjdHh8LCB0aHVzIGl0J3MgcG9zc2libGUgdG8gY29udGludWUgdG8gdXNlIHxjdHh8IGluCisgKiBvcmRlciB0byBzaWduIGEgbG9uZ2VyIG1lc3NhZ2UuICovCitpbnQgRVZQX1NpZ25GaW5hbChjb25zdCBFVlBfTURfQ1RYICpjdHgsIHVpbnQ4X3QgKnNpZywKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqb3V0X3NpZ19sZW4sIEVWUF9QS0VZICpwa2V5KTsKKworCisvKiBWZXJpZnlpbmcgKG9sZCBmdW5jdGlvbnMpICovCisKKy8qIEVWUF9WZXJpZnlJbml0X2V4IGNvbmZpZ3VyZXMgfGN0eHwsIHdoaWNoIG11c3QgYWxyZWFkeSBoYXZlIGJlZW4KKyAqIGluaXRpYWxpc2VkLCBmb3IgYSBmcmVzaCBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIG9wZXJhdGlvbiB1c2luZyB0aGUgaGFzaAorICogZnVuY3Rpb24gfHR5cGV8LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG90aGVyd2lzZS4KKyAqCisgKiAoSW4gb3JkZXIgdG8gaW5pdGlhbGlzZSB8Y3R4fCwgZWl0aGVyIG9idGFpbiBpdCBpbml0aWFsaXNlZCB3aXRoCisgKiB8RVZQX01EX0NUWF9jcmVhdGV8LCBvciB1c2UgfEVWUF9NRF9DVFhfaW5pdHwuKSAqLworaW50IEVWUF9WZXJpZnlJbml0X2V4KEVWUF9NRF9DVFggKmN0eCwgY29uc3QgRVZQX01EICp0eXBlLCBFTkdJTkUgKmltcGwpOworCisvKiBFVlBfVmVyaWZ5SW5pdCBpcyBhIGRlcHJlY2F0ZWQgdmVyc2lvbiBvZiB8RVZQX1ZlcmlmeUluaXRfZXh8LgorICoKKyAqIFRPRE8oZm9yayk6IHJlbW92ZS4gKi8KK2ludCBFVlBfVmVyaWZ5SW5pdChFVlBfTURfQ1RYICpjdHgsIGNvbnN0IEVWUF9NRCAqdHlwZSk7CisKKy8qIEVWUF9WZXJpZnlVcGRhdGUgYXBwZW5kcyB8bGVufCBieXRlcyBmcm9tIHxkYXRhfCB0byB0aGUgZGF0YSB3aGljaCB3aWxsIGJlCisgKiBzaWduZWQgaW4gfEVWUF9WZXJpZnlGaW5hbHwuICovCitpbnQgRVZQX1ZlcmlmeVVwZGF0ZShFVlBfTURfQ1RYICpjdHgsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pOworCisvKiBFVlBfVmVyaWZ5RmluYWwgdmVyaWZpZXMgdGhhdCB8c2lnX2xlbnwgYnl0ZXMgb2YgfHNpZ3wgYXJlIGEgdmFsaWQKKyAqIHNpZ25hdHVyZSwgYnkgfHBrZXl8LCBmb3IgdGhlIGRhdGEgdGhhdCBoYXMgYmVlbiBpbmNsdWRlZCBieSBvbmUgb3IgbW9yZQorICogY2FsbHMgdG8gfEVWUF9WZXJpZnlVcGRhdGV8LgorICoKKyAqIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb3RoZXJ3aXNlLgorICoKKyAqIEl0IGRvZXMgbm90IG1vZGlmeSB8Y3R4fCwgdGh1cyBpdCdzIHBvc3NpYmxlIHRvIGNvbnRpbnVlIHRvIHVzZSB8Y3R4fCBpbgorICogb3JkZXIgdG8gc2lnbiBhIGxvbmdlciBtZXNzYWdlLiAqLworaW50IEVWUF9WZXJpZnlGaW5hbChFVlBfTURfQ1RYICpjdHgsIGNvbnN0IHVpbnQ4X3QgKnNpZywgc2l6ZV90IHNpZ19sZW4sCisgICAgICAgICAgICAgICAgICAgIEVWUF9QS0VZICpwa2V5KTsKKworCisvKiBQcmludGluZyAqLworCisvKiBFVlBfUEtFWV9wcmludF9wdWJsaWMgcHJpbnRzIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHVibGljIGtleSBpbgorICogfHBrZXl8IHRvIHxvdXR8LiBSZXR1cm5zIG9uZSBvbiBzdWNjZXNzIG9yIHplcm8gb3RoZXJ3aXNlLiAqLworaW50IEVWUF9QS0VZX3ByaW50X3B1YmxpYyhCSU8gKm91dCwgY29uc3QgRVZQX1BLRVkgKnBrZXksIGludCBpbmRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFTTjFfUENUWCAqcGN0eCk7CisKKy8qIEVWUF9QS0VZX3ByaW50X3B1YmxpYyBwcmludHMgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcml2YXRlIGtleSBpbgorICogfHBrZXl8IHRvIHxvdXR8LiBSZXR1cm5zIG9uZSBvbiBzdWNjZXNzIG9yIHplcm8gb3RoZXJ3aXNlLiAqLworaW50IEVWUF9QS0VZX3ByaW50X3ByaXZhdGUoQklPICpvdXQsIGNvbnN0IEVWUF9QS0VZICpwa2V5LCBpbnQgaW5kZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOMV9QQ1RYICpwY3R4KTsKKworLyogRVZQX1BLRVlfcHJpbnRfcHVibGljIHByaW50cyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBhcmFtZXRlcnMgaW4KKyAqIHxwa2V5fCB0byB8b3V0fC4gUmV0dXJucyBvbmUgb24gc3VjY2VzcyBvciB6ZXJvIG90aGVyd2lzZS4gKi8KK2ludCBFVlBfUEtFWV9wcmludF9wYXJhbXMoQklPICpvdXQsIGNvbnN0IEVWUF9QS0VZICpwa2V5LCBpbnQgaW5kZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBU04xX1BDVFggKnBjdHgpOworCisKKy8qIFBhc3N3b3JkIHN0cmV0Y2hpbmcuCisgKgorICogUGFzc3dvcmQgc3RyZXRjaGluZyBmdW5jdGlvbnMgdGFrZSBhIGxvdy1lbnRyb3B5IHBhc3N3b3JkIGFuZCBhcHBseSBhIHNsb3cKKyAqIGZ1bmN0aW9uIHRoYXQgcmVzdWx0cyBpbiBhIGtleSBzdWl0YWJsZSBmb3IgdXNlIGluIHN5bW1ldHJpYworICogY3J5cHRvZ3JhcGh5LiAqLworCisvKiBQS0NTNV9QQktERjJfSE1BQyBjb21wdXRlcyB8aXRlcmF0aW9uc3wgaXRlcmF0aW9ucyBvZiBQQktERjIgb2YgfHBhc3N3b3JkfAorICogYW5kIHxzYWx0fCwgdXNpbmcgfGRpZ2VzdHwsIGFuZCBvdXRwdXRzIHxrZXlfbGVufCBieXRlcyB0byB8b3V0X2tleXwuIEl0CisgKiByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG9uIGVycm9yLiAqLworaW50IFBLQ1M1X1BCS0RGMl9ITUFDKGNvbnN0IGNoYXIgKnBhc3N3b3JkLCBpbnQgcGFzc3dvcmRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNhbHQsIHNpemVfdCBzYWx0X2xlbiwgdW5zaWduZWQgaXRlcmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFVlBfTUQgKmRpZ2VzdCwgc2l6ZV90IGtleV9sZW4sIHVpbnQ4X3QgKm91dF9rZXkpOworCisvKiBQS0NTNV9QQktERjJfSE1BQ19TSEExIGlzIHRoZSBzYW1lIGFzIFBLQ1M1X1BCS0RGMl9ITUFDLCBidXQgd2l0aCB8ZGlnZXN0fAorICogZml4ZWQgdG8gfEVWUF9zaGExfC4gKi8KK2ludCBQS0NTNV9QQktERjJfSE1BQ19TSEExKGNvbnN0IGNoYXIgKnBhc3N3b3JkLCBpbnQgcGFzc3dvcmRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc2FsdCwgc2l6ZV90IHNhbHRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaXRlcmF0aW9ucywgc2l6ZV90IGtleV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpvdXRfa2V5KTsKKworCisvKiBQdWJsaWMga2V5IGNvbnRleHRzLgorICoKKyAqIHxFVlBfUEtFWV9DVFh8IG9iamVjdHMgaG9sZCB0aGUgY29udGV4dCBvZiBhbiBvcGVyYXRpb24gKGUuZy4gc2lnbmluZyBvcgorICogZW5jcnlwdGluZykgdGhhdCB1c2VzIGEgcHVibGljIGtleS4gKi8KKworLyogRVZQX1BLRVlfQ1RYX25ldyBhbGxvY2F0ZXMgYSBmcmVzaCB8RVZQX1BLRVlfQ1RYfCBmb3IgdXNlIHdpdGggfHBrZXl8LiBJdAorICogcmV0dXJucyB0aGUgY29udGV4dCBvciBOVUxMIG9uIGVycm9yLiAqLworRVZQX1BLRVlfQ1RYICpFVlBfUEtFWV9DVFhfbmV3KEVWUF9QS0VZICpwa2V5LCBFTkdJTkUgKmUpOworCisvKiBFVlBfUEtFWV9DVFhfbmV3IGFsbG9jYXRlcyBhIGZyZXNoIHxFVlBfUEtFWV9DVFh8IGZvciBhIGtleSBvZiB0eXBlIHxpZHwKKyAqIChlLmcuIHxFVlBfUEtFWV9ITUFDfCkuIFRoaXMgY2FuIGJlIHVzZWQgZm9yIGtleSBnZW5lcmF0aW9uIHdoZXJlCisgKiB8RVZQX1BLRVlfQ1RYX25ld3wgY2FuJ3QgYmUgdXNlZCBiZWNhdXNlIHRoZXJlIGlzbid0IGFuIHxFVlBfUEtFWXwgdG8gcGFzcworICogaXQuIEl0IHJldHVybnMgdGhlIGNvbnRleHQgb3IgTlVMTCBvbiBlcnJvci4gKi8KK0VWUF9QS0VZX0NUWCAqRVZQX1BLRVlfQ1RYX25ld19pZChpbnQgaWQsIEVOR0lORSAqZSk7CisKKy8qIEVWUF9LRVlfQ1RYX2ZyZWUgZnJlZXMgfGN0eHwgYW5kIHRoZSBkYXRhIGl0IG93bnMuICovCit2b2lkIEVWUF9QS0VZX0NUWF9mcmVlKEVWUF9QS0VZX0NUWCAqY3R4KTsKKworLyogRVZQX1BLRVlfQ1RYX2R1cCBhbGxvY2F0ZXMgYSBmcmVzaCB8RVZQX1BLRVlfQ1RYfCBhbmQgc2V0cyBpdCBlcXVhbCB0byB0aGUKKyAqIHN0YXRlIG9mIHxjdHh8LiBJdCByZXR1cm5zIHRoZSBmcmVzaCB8RVZQX1BLRVlfQ1RYfCBvciBOVUxMIG9uIGVycm9yLiAqLworRVZQX1BLRVlfQ1RYICpFVlBfUEtFWV9DVFhfZHVwKEVWUF9QS0VZX0NUWCAqY3R4KTsKKworLyogRVZQX1BLRVlfQ1RYX2dldDBfcGtleSByZXR1cm5zIHRoZSB8RVZQX1BLRVl8IGFzc29jaWF0ZWQgd2l0aCB8Y3R4fC4gKi8KK0VWUF9QS0VZICpFVlBfUEtFWV9DVFhfZ2V0MF9wa2V5KEVWUF9QS0VZX0NUWCAqY3R4KTsKKworLyogRVZQX1BLRVlfQ1RYX3NldF9hcHBfZGF0YSBzZXRzIGFuIG9wYXF1ZSBwb2ludGVyIG9uIHxjdHh8LiAqLwordm9pZCBFVlBfUEtFWV9DVFhfc2V0X2FwcF9kYXRhKEVWUF9QS0VZX0NUWCAqY3R4LCB2b2lkICpkYXRhKTsKKworLyogRVZQX1BLRVlfQ1RYX2dldF9hcHBfZGF0YSByZXR1cm5zIHRoZSBvcGFxdWUgcG9pbnRlciBmcm9tIHxjdHh8IHRoYXQgd2FzCisgKiBwcmV2aW91c2x5IHNldCB3aXRoIHxFVlBfUEtFWV9DVFhfc2V0X2FwcF9kYXRhfCwgb3IgTlVMTCBpZiBub25lIGhhcyBiZWVuCisgKiBzZXQuICovCit2b2lkICpFVlBfUEtFWV9DVFhfZ2V0X2FwcF9kYXRhKEVWUF9QS0VZX0NUWCAqY3R4KTsKKworLyogRVZQX1BLRVlfQ1RYX2N0cmwgcGVyZm9ybXMgfGNtZHwgb24gfGN0eHwuIFRoZSB8a2V5dHlwZXwgYW5kIHxvcHR5cGV8CisgKiBhcmd1bWVudHMgY2FuIGJlIC0xIHRvIHNwZWNpZnkgdGhhdCBhbnkgdHlwZSBhbmQgb3BlcmF0aW9uIGFyZSBhY2NlcHRhYmxlLAorICogb3RoZXJ3aXNlIHxrZXl0eXBlfCBtdXN0IG1hdGNoIHRoZSB0eXBlIG9mIHxjdHh8IGFuZCB0aGUgYml0cyBvZiB8b3B0eXBlfAorICogbXVzdCBpbnRlcnNlY3QgdGhlIG9wZXJhdGlvbiBmbGFncyBzZXQgb24gfGN0eHwuCisgKgorICogVGhlIHxwMXwgYW5kIHxwMnwgYXJndW1lbnRzIGRlcGVuZCBvbiB0aGUgdmFsdWUgb2YgfGNtZHwuCisgKgorICogSXQgcmV0dXJucyAtMiBpZiB8Y21kfCBpcyBub3QgcmVjb2duaXNlZCwgLTEgb24gZXJyb3Igb3IgYSB8Y21kfCBzcGVjaWZpYworICogdmFsdWUgb3RoZXJ3aXNlLiAqLworaW50IEVWUF9QS0VZX0NUWF9jdHJsKEVWUF9QS0VZX0NUWCAqY3R4LCBpbnQga2V5dHlwZSwgaW50IG9wdHlwZSwgaW50IGNtZCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgcDEsIHZvaWQgKnAyKTsKKworLyogRVZQX1BLRVlfc2lnbl9pbml0IGluaXRpYWxpc2VzIGFuIHxFVlBfUEtFWV9DVFh8IGZvciBhIHNpZ25pbmcgb3BlcmF0aW9uLiBJdAorICogc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgfEVWUF9QS0VZX3NpZ258LgorICoKKyAqIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3Mgb3IgPD0gMCBvbiBlcnJvci4gV0FSTklORzogdGhpcyBkaWZmZXJzIGZyb20gdGhlCisgKiB1c3VhbCByZXR1cm4gdmFsdWUgY29udmVudGlvbi4gKi8KK2ludCBFVlBfUEtFWV9zaWduX2luaXQoRVZQX1BLRVlfQ1RYICpjdHgpOworCisvKiBFVlBfUEtFWV9zaWduIHNpZ25zIHxkYXRhX2xlbnwgYnl0ZXMgZnJvbSB8ZGF0YXwgdXNpbmcgfGN0eHwuIElmIHxzaWd8IGlzCisgKiBOVUxMLCB0aGUgc2l6ZSBvZiB0aGUgc2lnbmF0dXJlIGlzIHdyaXR0ZW4gdG8gfG91dF9zaWdfbGVufC4gT3RoZXJ3aXNlLAorICogfCpzaWdfbGVufCBtdXN0IGNvbnRhaW4gdGhlIG51bWJlciBvZiBieXRlcyBvZiBzcGFjZSBhdmFpbGFibGUgYXQgfHNpZ3wuIElmCisgKiBzdWZmaWNpZW50LCB0aGUgc2lnbmF0dXJlIHdpbGwgYmUgd3JpdHRlbiB0byB8c2lnfCBhbmQgfCpzaWdfbGVufCB1cGRhdGVkCisgKiB3aXRoIHRoZSB0cnVlIGxlbmd0aC4KKyAqCisgKiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIG9yIHplcm8gb24gZXJyb3IuIChOb3RlOiB0aGlzIGRpZmZlcnMgZnJvbQorICogT3BlblNTTCwgd2hpY2ggY2FuIGFsc28gcmV0dXJuIG5lZ2F0aXZlIHZhbHVlcyB0byBpbmRpY2F0ZSBhbiBlcnJvci4gKSAqLworaW50IEVWUF9QS0VZX3NpZ24oRVZQX1BLRVlfQ1RYICpjdHgsIHVpbnQ4X3QgKnNpZywgc2l6ZV90ICpzaWdfbGVuLAorICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuKTsKKworLyogRVZQX1BLRVlfdmVyaWZ5X2luaXQgaW5pdGlhbGlzZXMgYW4gfEVWUF9QS0VZX0NUWHwgZm9yIGEgc2lnbmF0dXJlCisgKiB2ZXJpZmljYXRpb24gb3BlcmF0aW9uLiBJdCBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSB8RVZQX1BLRVlfdmVyaWZ5fC4KKyAqCisgKiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIG9yIDw9IDAgb24gZXJyb3IuIFdBUk5JTkc6IHRoaXMgZGlmZmVycyBmcm9tIHRoZQorICogdXN1YWwgcmV0dXJuIHZhbHVlIGNvbnZlbnRpb24uICovCitpbnQgRVZQX1BLRVlfdmVyaWZ5X2luaXQoRVZQX1BLRVlfQ1RYICpjdHgpOworCisvKiBFVlBfUEtFWV92ZXJpZnkgdmVyaWZpZXMgdGhhdCB8c2lnX2xlbnwgYnl0ZXMgZnJvbSB8c2lnfCBhcmUgYSB2YWxpZCBzaWduYXR1cmUKKyAqIGZvciB8ZGF0YXwuCisgKgorICogSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBvciB6ZXJvIG9uIGVycm9yLiAoTm90ZTogdGhpcyBkaWZmZXJzIGZyb20KKyAqIE9wZW5TU0wsIHdoaWNoIGNhbiBhbHNvIHJldHVybiBuZWdhdGl2ZSB2YWx1ZXMgdG8gaW5kaWNhdGUgYW4gZXJyb3IuICkgKi8KK2ludCBFVlBfUEtFWV92ZXJpZnkoRVZQX1BLRVlfQ1RYICpjdHgsIGNvbnN0IHVpbnQ4X3QgKnNpZywgc2l6ZV90IHNpZ19sZW4sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBkYXRhX2xlbik7CisKKy8qIEVWUF9QS0VZX2VuY3J5cHRfaW5pdCBpbml0aWFsaXNlcyBhbiB8RVZQX1BLRVlfQ1RYfCBmb3IgYW4gZW5jcnlwdGlvbgorICogb3BlcmF0aW9uLiBJdCBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSB8RVZQX1BLRVlfZW5jcnlwdHwuCisgKgorICogSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBvciA8PSAwIG9uIGVycm9yLiBXQVJOSU5HOiB0aGlzIGRpZmZlcnMgZnJvbSB0aGUKKyAqIHVzdWFsIHJldHVybiB2YWx1ZSBjb252ZW50aW9uLiAqLworaW50IEVWUF9QS0VZX2VuY3J5cHRfaW5pdChFVlBfUEtFWV9DVFggKmN0eCk7CisKKy8qIEVWUF9QS0VZX2VuY3J5cHQgZW5jcnlwdHMgfGluX2xlbnwgYnl0ZXMgZnJvbSB8aW58IGFuZCB3cml0ZXMgaXQgdG8gfG91dHwuCisgKiBUT0RPKGZvcmspOiBuZWVkIG1vcmUgZGV0YWlscyBvbiB8b3V0X2xlbnwuCisgKgorICogSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBvciA8PSAwIG9uIGVycm9yLiAoTm90ZTogdGhpcyBkaWZmZXJzIGZyb20KKyAqIE9wZW5TU0wsIHdoaWNoIGNhbiBhbHNvIHJldHVybiBuZWdhdGl2ZSB2YWx1ZXMgdG8gaW5kaWNhdGUgYW4gZXJyb3IuICkgKi8KK2ludCBFVlBfUEtFWV9lbmNyeXB0KEVWUF9QS0VZX0NUWCAqY3R4LCB1aW50OF90ICpvdXQsIHNpemVfdCAqb3V0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5fbGVuKTsKKworLyogRVZQX1BLRVlfZGVjcnlwdF9pbml0IGluaXRpYWxpc2VzIGFuIHxFVlBfUEtFWV9DVFh8IGZvciBhIGRlY3J5cHRpb24KKyAqIG9wZXJhdGlvbi4gSXQgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgfEVWUF9QS0VZX2RlY3J5cHR8LgorICoKKyAqIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3Mgb3IgPD0gMCBvbiBlcnJvci4gV0FSTklORzogdGhpcyBkaWZmZXJzIGZyb20gdGhlCisgKiB1c3VhbCByZXR1cm4gdmFsdWUgY29udmVudGlvbi4gKi8KK2ludCBFVlBfUEtFWV9kZWNyeXB0X2luaXQoRVZQX1BLRVlfQ1RYICpjdHgpOworCisvKiBFVlBfUEtFWV9kZWNyeXB0IGRlY3J5cHRzIHxpbl9sZW58IGJ5dGVzIGZyb20gfGlufCwgd3JpdGVzIGl0IHRvIHxvdXR8IGFuZAorICogc2V0cyB8Km91dGxlbnwgdG8gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLgorICoKKyAqIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3Mgb3IgPD0gMCBvbiBlcnJvci4gKE5vdGU6IHRoaXMgZGlmZmVycyBmcm9tCisgKiBPcGVuU1NMLCB3aGljaCBjYW4gYWxzbyByZXR1cm4gbmVnYXRpdmUgdmFsdWVzIHRvIGluZGljYXRlIGFuIGVycm9yLiApICovCitpbnQgRVZQX1BLRVlfZGVjcnlwdChFVlBfUEtFWV9DVFggKmN0eCwgdWludDhfdCAqb3V0LCBzaXplX3QgKm91dF9sZW4sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluX2xlbik7CisKKy8qIEVWUF9QS0VZX2Rlcml2ZV9pbml0IGluaXRpYWxpc2VzIGFuIHxFVlBfUEtFWV9DVFh8IGZvciBhIGtleSBkZXJpdmF0aW9uCisgKiBvcGVyYXRpb24uIEl0IHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHxFVlBfUEtFWV9kZXJpdmVfc2V0X3BlZXJ8IGFuZAorICogfEVWUF9QS0VZX2Rlcml2ZXwuCisgKgorICogSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBvciA8PSAwIG9uIGVycm9yLiBXQVJOSU5HOiB0aGlzIGRpZmZlcnMgZnJvbSB0aGUKKyAqIHVzdWFsIHJldHVybiB2YWx1ZSBjb252ZW50aW9uLiAqLworaW50IEVWUF9QS0VZX2Rlcml2ZV9pbml0KEVWUF9QS0VZX0NUWCAqY3R4KTsKKworLyogRVZQX1BLRVlfZGVyaXZlX3NldF9wZWVyIHNldHMgdGhlIHBlZXIncyBrZXkgdG8gYmUgdXNlZCBmb3Iga2V5IGRlcml2YXRpb24KKyAqIGJ5IHxjdHh8IHRvIHxwZWVyfC4gSXQgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciB8RVZQX1BLRVlfZGVyaXZlX2luaXR8LiAoRm9yCisgKiBleGFtcGxlLCB0aGlzIGlzIHVzZWQgdG8gc2V0IHRoZSBwZWVyJ3Mga2V5IGluIChFQylESC4pIEl0IHJldHVybnMgb25lIG9uCisgKiBzdWNjZXNzIGFuZCA8PSAwIG9uIGVycm9yLiBXQVJOSU5HOiB0aGlzIGRpZmZlcnMgZnJvbSB0aGUgdXN1YWwgcmV0dXJuIHZhbHVlCisgKiBjb252ZW50aW9uLiAqLworaW50IEVWUF9QS0VZX2Rlcml2ZV9zZXRfcGVlcihFVlBfUEtFWV9DVFggKmN0eCwgRVZQX1BLRVkgKnBlZXIpOworCisvKiBFVlBfUEtFWV9kZXJpdmUgZGVyaXZlcyBhIHNoYXJlZCBrZXkgYmV0d2VlbiB0aGUgdHdvIGtleXMgY29uZmlndXJlZCBpbgorICogfGN0eHwuIElmIHxrZXl8IGlzIG5vbi1OVUxMIHRoZW4sIG9uIGVudHJ5LCB8b3V0X2tleV9sZW58IG11c3QgY29udGFpbiB0aGUKKyAqIGFtb3VudCBvZiBzcGFjZSBhdCB8a2V5fC4gSWYgc3VmZmljaWVudCB0aGVuIHRoZSBzaGFyZWQga2V5IHdpbGwgYmUgd3JpdHRlbgorICogdG8gfGtleXwgYW5kIHwqb3V0X2tleV9sZW58IHdpbGwgYmUgc2V0IHRvIHRoZSBsZW5ndGguIElmIHxrZXl8IGlzIE5VTEwgdGhlbgorICogfG91dF9rZXlfbGVufCB3aWxsIGJlIHNldCB0aGUgbGVuZ3RoLgorICoKKyAqIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIDw9IDAgb24gZXJyb3IuIFdBUk5JTkc6IHRoaXMgZGlmZmVycyBmcm9tIHRoZQorICogdXN1YWwgcmV0dXJuIGNvbnZlbnRpb24uICovCitpbnQgRVZQX1BLRVlfZGVyaXZlKEVWUF9QS0VZX0NUWCAqY3R4LCB1aW50OF90ICprZXksIHNpemVfdCAqb3V0X2tleV9sZW4pOworCisvKiBFVlBfUEtFWV9rZXlnZW5faW5pdCBpbml0aWFsaXNlcyBhbiB8RVZQX1BLRVlfQ1RYfCBmb3IgYSBrZXkgZ2VuZXJhdGlvbgorICogb3BlcmF0aW9uLiBJdCBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSB8RVZQX1BLRVlfa2V5Z2VufC4KKyAqCisgKiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIG9yIDw9IDAgb24gZXJyb3IuIFdBUk5JTkc6IHRoaXMgZGlmZmVycyBmcm9tIHRoZQorICogdXN1YWwgcmV0dXJuIHZhbHVlIGNvbnZlbnRpb24uICovCitpbnQgRVZQX1BLRVlfa2V5Z2VuX2luaXQoRVZQX1BLRVlfQ1RYICpjdHgpOworCisvKiBFVlBfUEtFWV9rZXlnZW4gcGVyZm9ybXMgYSBrZXkgZ2VuZXJhdGlvbiBvcGVyYXRpb24gdXNpbmcgdGhlIHZhbHVlcyBmcm9tCisgKiB8Y3R4fCBhbmQgc2V0cyB8KnBwa2V5fCB0byBhIGZyZXNoIHxFVlBfUEtFWXwgY29udGFpbmluZyB0aGUgcmVzdWx0aW5nIGtleS4KKyAqIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3Mgb3IgPD0gMCBvbiBlcnJvci4gV0FSTklORzogdGhpcyBkaWZmZXJzIGZyb20gdGhlCisgKiBub3JtYWwgcmV0dXJuIHZhbHVlIGNvbnZlbnRpb24uICovCitpbnQgRVZQX1BLRVlfa2V5Z2VuKEVWUF9QS0VZX0NUWCAqY3R4LCBFVlBfUEtFWSAqKnBwa2V5KTsKKworCisvKiBFVlBfUEtFWV9DVFhfY3RybCBvcGVyYXRpb25zLgorICoKKyAqIFRoZXNlIHZhbHVlcyBhcmUgcGFzc2VkIGFzIHRoZSB8Y21kfCBhcmd1bWVudCB0bworICogRVZQX1BLRVlfQ1RYX2N0cmwgKi8KKworLyogR2VuZXJpYy4gKi8KKworLyogRVZQX1BLRVlfQ1RYX3NldF9zaWduYXR1cmVfbWQgc2V0cyB8bWR8IGFzIHRoZSBkaWdlc3QgdG8gYmUgdXNlZCBpbiBhCisgKiBzaWduYXR1cmUgb3BlcmF0aW9uLiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIG9yIG90aGVyd2lzZSBvbiBlcnJvci4gU2VlCisgKiB0aGUgcmV0dXJuIHZhbHVlcyBvZiB8RVZQX1BLRVlfQ1RYX2N0cmx8IGZvciBkZXRhaWxzLiAqLworaW50IEVWUF9QS0VZX0NUWF9zZXRfc2lnbmF0dXJlX21kKEVWUF9QS0VZX0NUWCAqY3R4LCBjb25zdCBFVlBfTUQgKm1kKTsKKworLyogRVZQX1BLRVlfQ1RYX2dldF9zaWduYXR1cmVfbWQgc2V0cyB8Km91dF9tZHwgdG8gdGhlIGRpZ2VzdCB0byBiZSB1c2VkIGluIGEKKyAqIHNpZ25hdHVyZSBvcGVyYXRpb24uIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3Mgb3Igb3RoZXJ3aXNlIG9uIGVycm9yLiBTZWUKKyAqIHRoZSByZXR1cm4gdmFsdWVzIG9mIHxFVlBfUEtFWV9DVFhfY3RybHwgZm9yIGRldGFpbHMuICovCitpbnQgRVZQX1BLRVlfQ1RYX2dldF9zaWduYXR1cmVfbWQoRVZQX1BLRVlfQ1RYICpjdHgsIGNvbnN0IEVWUF9NRCAqKm91dF9tZCk7CisKKy8qIEVWUF9QS0VZX0NUUkxfRElHRVNUSU5JVCBpcyBhbiBpbnRlcm5hbCB2YWx1ZS4gSXQncyBjYWxsZWQgYnkKKyAqIEVWUF9EaWdlc3RJbml0X2V4IHRvIHNpZ25hbCB0aGUgfEVWUF9QS0VZfCB0aGF0IGEgZGlnZXN0IG9wZXJhdGlvbiBpcworICogc3RhcnRpbmcuICovCisjZGVmaW5lIEVWUF9QS0VZX0NUUkxfRElHRVNUSU5JVCAzCisKKy8qIEVWUF9QS0VZX0NUUkxfUEVFUl9LRVkgaXMgY2FsbGVkIHdpdGggZGlmZmVyZW50IHZhbHVlcyBvZiB8cDF8OgorICogICAwOiBJcyBjYWxsZWQgZnJvbSB8RVZQX1BLRVlfZGVyaXZlX3NldF9wZWVyfCBhbmQgfHAyfCBjb250YWlucyBhIHBlZXIga2V5LgorICogICAgICBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIDw9IDAsIHRoZSBrZXkgaXMgcmVqZWN0ZWQuCisgKiAgIDE6IElzIGNhbGxlZCBhdCB0aGUgZW5kIG9mIHxFVlBfUEtFWV9kZXJpdmVfc2V0X3BlZXJ8IGFuZCB8cDJ8IGNvbnRhaW5zIGEKKyAqICAgICAgcGVlciBrZXkuIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgPD0gMCwgdGhlIGtleSBpcyByZWplY3RlZC4KKyAqICAgMjogSXMgY2FsbGVkIHdpdGggfHAyfCA9PSBOVUxMIHRvIHRlc3Qgd2hldGhlciB0aGUgcGVlcidzIGtleSB3YXMgdXNlZC4KKyAqICAgICAgKEVDKURIIGFsd2F5cyByZXR1cm4gb25lIGluIHRoaXMgY2FzZS4KKyAqICAgMzogSXMgY2FsbGVkIHdpdGggfHAyfCA9PSBOVUxMIHRvIHNldCB3aGV0aGVyIHRoZSBwZWVyJ3Mga2V5IHdhcyB1c2VkLgorICogICAgICAoRUMpREggYWx3YXlzIHJldHVybiBvbmUgaW4gdGhpcyBjYXNlLiBUaGlzIHdhcyBvbmx5IHVzZWQgZm9yIEdPU1QuICovCisjZGVmaW5lIEVWUF9QS0VZX0NUUkxfUEVFUl9LRVkgNAorCisvKiBFVlBfUEtFWV9DVFJMX1NFVF9NQUNfS0VZIHNldHMgYSBNQUMga2V5LiBGb3IgZXhhbXBsZSwgdGhpcyBjYW4gYmUgZG9uZSBhbgorICogfEVWUF9QS0VZX0NUWHwgcHJpb3IgdG8gY2FsbGluZyB8RVZQX1BLRVlfa2V5Z2VufCBpbiBvcmRlciB0byBnZW5lcmF0ZSBhbgorICogSE1BQyB8RVZQX1BLRVl8IHdpdGggdGhlIGdpdmVuIGtleS4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvbgorICogZXJyb3IuICovCisjZGVmaW5lIEVWUF9QS0VZX0NUUkxfU0VUX01BQ19LRVkgNQorCisvKiBFVlBfUEtFWV9BTEdfQ1RSTCBpcyB0aGUgYmFzZSB2YWx1ZSBmcm9tIHdoaWNoIGtleS10eXBlIHNwZWNpZmljIGN0cmwKKyAqIGNvbW1hbmRzIGFyZSBudW1iZXJlZC4gKi8KKyNkZWZpbmUgRVZQX1BLRVlfQUxHX0NUUkwgMHgxMDAwCisKKworLyogUlNBIHNwZWNpZmljIGNvbnRyb2wgZnVuY3Rpb25zLiAqLworCisvKiBFVlBfUEtFWV9DVFhfc2V0X3JzYV9wYWRkaW5nIHNldHMgdGhlIHBhZGRpbmcgdHlwZSB0byB1c2UuIEl0IHNob3VsZCBiZSBvbmUKKyAqIG9mIHRoZSB8UlNBXypfUEFERElOR3wgdmFsdWVzLiBSZXR1cm5zIG9uZSBvbiBzdWNjZXNzIG9yIGFub3RoZXIgdmFsdWUgb24KKyAqIGVycm9yLiBTZWUgfEVWUF9QS0VZX0NUWF9jdHJsfCBmb3IgdGhlIG90aGVyIHJldHVybiB2YWx1ZXMsIHdoaWNoIGFyZQorICogbm9uLXN0YW5kYXJkLiAqLworaW50IEVWUF9QS0VZX0NUWF9zZXRfcnNhX3BhZGRpbmcoRVZQX1BLRVlfQ1RYICpjdHgsIGludCBwYWRkaW5nKTsKKworLyogRVZQX1BLRVlfQ1RYX2dldF9yc2FfcGFkZGluZyBzZXRzIHwqb3V0X3BhZGRpbmd8IHRvIHRoZSBjdXJyZW50IHBhZGRpbmcKKyAqIHZhbHVlLCB3aGljaCBpcyBvbmUgb2YgdGhlIHxSU0FfKl9QQURESU5HfCB2YWx1ZXMuIFJldHVybnMgb25lIG9uIHN1Y2Nlc3Mgb3IKKyAqIGFub3RoZXIgdmFsdWUgb24gZXJyb3IuIFNlZSB8RVZQX1BLRVlfQ1RYX2N0cmx8IGZvciB0aGUgb3RoZXIgcmV0dXJuIHZhbHVlcywKKyAqIHdoaWNoIGFyZSBub24tc3RhbmRhcmQuICovCitpbnQgRVZQX1BLRVlfQ1RYX2dldF9yc2FfcGFkZGluZyhFVlBfUEtFWV9DVFggKmN0eCwgaW50ICpvdXRfcGFkZGluZyk7CisKKy8qIEVWUF9QS0VZX0NUWF9zZXRfcnNhX3Bzc19zYWx0bGVuIHNldHMgdGhlIGxlbmd0aCBvZiB0aGUgc2FsdCBpbiBhIFBTUy1wYWRkZWQKKyAqIHNpZ25hdHVyZS4gQSB2YWx1ZSBvZiAtMSBjYXVzZSB0aGUgc2FsdCB0byBiZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIGRpZ2VzdAorICogaW4gdGhlIHNpZ25hdHVyZS4gQSB2YWx1ZSBvZiAtMiBjYXVzZXMgdGhlIHNhbHQgdG8gYmUgdGhlIG1heGltdW0gbGVuZ3RoCisgKiB0aGF0IHdpbGwgZml0LiBPdGhlcndpc2UgdGhlIHZhbHVlIGdpdmVzIHRoZSBzaXplIG9mIHRoZSBzYWx0IGluIGJ5dGVzLgorICoKKyAqIFJldHVybnMgb25lIG9uIHN1Y2Nlc3Mgb3IgYW5vdGhlciB2YWx1ZSBvbiBlcnJvci4gU2VlIHxFVlBfUEtFWV9DVFhfY3RybHwKKyAqIGZvciB0aGUgb3RoZXIgcmV0dXJuIHZhbHVlcywgd2hpY2ggYXJlIG5vbi1zdGFuZGFyZC4gKi8KK2ludCBFVlBfUEtFWV9DVFhfc2V0X3JzYV9wc3Nfc2FsdGxlbihFVlBfUEtFWV9DVFggKmN0eCwgaW50IHNhbHRfbGVuKTsKKworLyogRVZQX1BLRVlfQ1RYX2dldF9yc2FfcHNzX3NhbHRsZW4gc2V0cyB8Km91dF9zYWx0X2xlbnwgdG8gdGhlIHNhbHQgbGVuZ3RoIG9mCisgKiBhIFBTUy1wYWRkZWQgc2lnbmF0dXJlLiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yCisgKiB8RVZQX1BLRVlfQ1RYX3NldF9yc2FfcHNzX3NhbHRsZW58IGZvciBkZXRhaWxzIG9mIHRoZSBzcGVjaWFsIHZhbHVlcyB0aGF0IGl0CisgKiBjYW4gdGFrZS4KKyAqCisgKiBSZXR1cm5zIG9uZSBvbiBzdWNjZXNzIG9yIGFub3RoZXIgdmFsdWUgb24gZXJyb3IuIFNlZSB8RVZQX1BLRVlfQ1RYX2N0cmx8CisgKiBmb3IgdGhlIG90aGVyIHJldHVybiB2YWx1ZXMsIHdoaWNoIGFyZSBub24tc3RhbmRhcmQuICovCitpbnQgRVZQX1BLRVlfQ1RYX2dldF9yc2FfcHNzX3NhbHRsZW4oRVZQX1BLRVlfQ1RYICpjdHgsIGludCAqb3V0X3NhbHRfbGVuKTsKKworLyogRVZQX1BLRVlfQ1RYX3NldF9yc2Ffa2V5Z2VuX2JpdHMgc2V0cyB0aGUgc2l6ZSBvZiB0aGUgZGVzaXJlZCBSU0EgbW9kdWx1cywKKyAqIGluIGJpdHMsIGZvciBrZXkgZ2VuZXJhdGlvbi4gUmV0dXJucyBvbmUgb24gc3VjY2VzcyBvciBhbm90aGVyIHZhbHVlIG9uCisgKiBlcnJvci4gU2VlIHxFVlBfUEtFWV9DVFhfY3RybHwgZm9yIHRoZSBvdGhlciByZXR1cm4gdmFsdWVzLCB3aGljaCBhcmUKKyAqIG5vbi1zdGFuZGFyZC4gKi8KK2ludCBFVlBfUEtFWV9DVFhfc2V0X3JzYV9rZXlnZW5fYml0cyhFVlBfUEtFWV9DVFggKmN0eCwgaW50IGJpdHMpOworCisvKiBFVlBfUEtFWV9DVFhfc2V0X3JzYV9rZXlnZW5fcHViZXhwIHNldHMgfGV8IGFzIHRoZSBwdWJsaWMgZXhwb25lbnQgZm9yIGtleQorICogZ2VuZXJhdGlvbi4gUmV0dXJucyBvbmUgb24gc3VjY2VzcyBvciBhbm90aGVyIHZhbHVlIG9uIGVycm9yLiBTZWUKKyAqIHxFVlBfUEtFWV9DVFhfY3RybHwgZm9yIHRoZSBvdGhlciByZXR1cm4gdmFsdWVzLCB3aGljaCBhcmUgbm9uLXN0YW5kYXJkLiAqLworaW50IEVWUF9QS0VZX0NUWF9zZXRfcnNhX2tleWdlbl9wdWJleHAoRVZQX1BLRVlfQ1RYICpjdHgsIEJJR05VTSAqZSk7CisKKy8qIEVWUF9QS0VZX0NUWF9zZXRfcnNhX29hZXBfbWQgc2V0cyB8bWR8IGFzIHRoZSBkaWdlc3QgdXNlZCBpbiBPQUVQIHBhZGRpbmcuCisgKiBSZXR1cm5zIG9uZSBvbiBzdWNjZXNzIG9yIGFub3RoZXIgdmFsdWUgb24gZXJyb3IuIFNlZSB8RVZQX1BLRVlfQ1RYX2N0cmx8CisgKiBmb3IgdGhlIG90aGVyIHJldHVybiB2YWx1ZXMsIHdoaWNoIGFyZSBub24tc3RhbmRhcmQuICovCitpbnQgRVZQX1BLRVlfQ1RYX3NldF9yc2Ffb2FlcF9tZChFVlBfUEtFWV9DVFggKmN0eCwgY29uc3QgRVZQX01EICptZCk7CisKKy8qIEVWUF9QS0VZX0NUWF9nZXRfcnNhX29hZXBfbWQgc2V0cyB8Km91dF9tZHwgdG8gdGhlIGRpZ2VzdCBmdW5jdGlvbiB1c2VkIGluCisgKiBPQUVQIHBhZGRpbmcuIFJldHVybnMgb25lIG9uIHN1Y2Nlc3Mgb3IgYW5vdGhlciB2YWx1ZSBvbiBlcnJvci4gU2VlCisgKiB8RVZQX1BLRVlfQ1RYX2N0cmx8IGZvciB0aGUgb3RoZXIgcmV0dXJuIHZhbHVlcywgd2hpY2ggYXJlIG5vbi1zdGFuZGFyZC4gKi8KK2ludCBFVlBfUEtFWV9DVFhfZ2V0X3JzYV9vYWVwX21kKEVWUF9QS0VZX0NUWCAqY3R4LCBjb25zdCBFVlBfTUQgKipvdXRfbWQpOworCisvKiBFVlBfUEtFWV9DVFhfc2V0X3JzYV9tZ2YxX21kIHNldHMgfG1kfCBhcyB0aGUgZGlnZXN0IHVzZWQgaW4gTUdGMS4gUmV0dXJucworICogb25lIG9uIHN1Y2Nlc3Mgb3IgYW5vdGhlciB2YWx1ZSBvbiBlcnJvci4gU2VlIHxFVlBfUEtFWV9DVFhfY3RybHwgZm9yIHRoZQorICogb3RoZXIgcmV0dXJuIHZhbHVlcywgd2hpY2ggYXJlIG5vbi1zdGFuZGFyZC4gKi8KK2ludCBFVlBfUEtFWV9DVFhfc2V0X3JzYV9tZ2YxX21kKEVWUF9QS0VZX0NUWCAqY3R4LCBjb25zdCBFVlBfTUQgKm1kKTsKKworLyogRVZQX1BLRVlfQ1RYX2dldF9yc2FfbWdmMV9tZCBzZXRzIHwqb3V0X21kfCB0byB0aGUgZGlnZXN0IGZ1bmN0aW9uIHVzZWQgaW4KKyAqIE1HRjEuIFJldHVybnMgb25lIG9uIHN1Y2Nlc3Mgb3IgYW5vdGhlciB2YWx1ZSBvbiBlcnJvci4gU2VlCisgKiB8RVZQX1BLRVlfQ1RYX2N0cmx8IGZvciB0aGUgb3RoZXIgcmV0dXJuIHZhbHVlcywgd2hpY2ggYXJlIG5vbi1zdGFuZGFyZC4gKi8KK2ludCBFVlBfUEtFWV9DVFhfZ2V0X3JzYV9tZ2YxX21kKEVWUF9QS0VZX0NUWCAqY3R4LCBjb25zdCBFVlBfTUQgKipvdXRfbWQpOworCisvKiBFVlBfUEtFWV9DVFhfc2V0MF9yc2Ffb2FlcF9sYWJlbCBzZXRzIHxsYWJlbF9sZW58IGJ5dGVzIGZyb20gfGxhYmVsfCBhcyB0aGUKKyAqIGxhYmVsIHVzZWQgaW4gT0FFUC4gREFOR0VSOiB0aGlzIGNhbGwgdGFrZXMgb3duZXJzaGlwIG9mIHxsYWJlbHwgYW5kIHdpbGwKKyAqIGNhbGwgfGZyZWV8IG9uIGl0IHdoZW4gfGN0eHwgaXMgZGVzdHJveWVkLgorICoKKyAqIFJldHVybnMgb25lIG9uIHN1Y2Nlc3Mgb3IgYW5vdGhlciB2YWx1ZSBvbiBlcnJvci4gU2VlIHxFVlBfUEtFWV9DVFhfY3RybHwKKyAqIGZvciB0aGUgb3RoZXIgcmV0dXJuIHZhbHVlcywgd2hpY2ggYXJlIG5vbi1zdGFuZGFyZC4gKi8KK2ludCBFVlBfUEtFWV9DVFhfc2V0MF9yc2Ffb2FlcF9sYWJlbChFVlBfUEtFWV9DVFggKmN0eCwgY29uc3QgdWludDhfdCAqbGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxhYmVsX2xlbik7CisKKy8qIEVWUF9QS0VZX0NUWF9nZXQwX3JzYV9vYWVwX2xhYmVsIHNldHMgfCpvdXRfbGFiZWx8IHRvIHBvaW50IHRvIHRoZSBpbnRlcm5hbAorICogYnVmZmVyIGNvbnRhaW5pbmcgdGhlIE9BRVAgbGFiZWwgKHdoaWNoIG1heSBiZSBOVUxMKSBhbmQgcmV0dXJucyB0aGUgbGVuZ3RoCisgKiBvZiB0aGUgbGFiZWwgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvci4gKi8KK2ludCBFVlBfUEtFWV9DVFhfZ2V0MF9yc2Ffb2FlcF9sYWJlbChFVlBfUEtFWV9DVFggKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICoqb3V0X2xhYmVsKTsKKworCisvKiBFQyBzcGVjaWZpYyAqLworCisjZGVmaW5lIEVWUF9QS0VZX0NUUkxfRUNfUEFSQU1HRU5fQ1VSVkVfTklECQkoRVZQX1BLRVlfQUxHX0NUUkwgKyAxKQorI2RlZmluZSBFVlBfUEtFWV9DVFJMX0VDX1BBUkFNX0VOQwkJCShFVlBfUEtFWV9BTEdfQ1RSTCArIDIpCisjZGVmaW5lIEVWUF9QS0VZX0NUUkxfRUNfRUNESF9DT0ZBQ1RPUgkJCShFVlBfUEtFWV9BTEdfQ1RSTCArIDMpCisjZGVmaW5lIEVWUF9QS0VZX0NUUkxfRUNfS0RGX1RZUEUJCQkoRVZQX1BLRVlfQUxHX0NUUkwgKyA0KQorI2RlZmluZSBFVlBfUEtFWV9DVFJMX0VDX0tERl9NRAkJCQkoRVZQX1BLRVlfQUxHX0NUUkwgKyA1KQorI2RlZmluZSBFVlBfUEtFWV9DVFJMX0dFVF9FQ19LREZfTUQJCQkoRVZQX1BLRVlfQUxHX0NUUkwgKyA2KQorI2RlZmluZSBFVlBfUEtFWV9DVFJMX0VDX0tERl9PVVRMRU4JCQkoRVZQX1BLRVlfQUxHX0NUUkwgKyA3KQorI2RlZmluZSBFVlBfUEtFWV9DVFJMX0dFVF9FQ19LREZfT1VUTEVOCQkJKEVWUF9QS0VZX0FMR19DVFJMICsgOCkKKyNkZWZpbmUgRVZQX1BLRVlfQ1RSTF9FQ19LREZfVUtNCQkJKEVWUF9QS0VZX0FMR19DVFJMICsgOSkKKyNkZWZpbmUgRVZQX1BLRVlfQ1RSTF9HRVRfRUNfS0RGX1VLTQkJCShFVlBfUEtFWV9BTEdfQ1RSTCArIDEwKQorCisjZGVmaW5lIEVWUF9QS0VZX0VDREhfS0RGX05PTkUgMQorI2RlZmluZSBFVlBfUEtFWV9FQ0RIX0tERl9YOV82MiAyCisKKworLyogUEtFWSBjdHJsIGNvbW1hbmRzLgorICoKKyAqIFRoZXNlIHZhbHVlcyBhcmUgcGFzc2VkIGFzIHRoZSB8b3B8IGFyZ3VtZW50IHRvCisgKiBFVlBfUEtFWV9BU04xX01FVEhPRC5wa2V5X2N0cmwuICovCisKKy8qIEFTTjFfUEtFWV9DVFJMX0RFRkFVTFRfTURfTklEIGV4cGVjdHMgfGFyZzJ8IHRvIGJlIGFuIHxpbnQqfCBhbmQgc2V0cyB0aGUKKyAqIHBvaW50ZWQgYXQgaW50IHRvIGJlIHRoZSBOSUQgb2YgdGhlIGRlZmF1bHQgaGFzaCBmdW5jdGlvbiB1c2VkIGluCisgKiBzaWduaW5nLiAqLworI2RlZmluZSBBU04xX1BLRVlfQ1RSTF9ERUZBVUxUX01EX05JRCAweDMKKworCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAqLworCisvKiBPcGVuU1NMX2FkZF9hbGxfYWxnb3JpdGhtcyBkb2VzIG5vdGhpbmcuICovCit2b2lkIE9wZW5TU0xfYWRkX2FsbF9hbGdvcml0aG1zKCk7CisKKy8qIEVWUF9jbGVhbnVwIGRvZXMgbm90aGluZy4gKi8KK3ZvaWQgRVZQX2NsZWFudXAoKTsKKworLyogRVZQX1BLRVlfYXNuMV9maW5kIHJldHVybnMgdGhlIEFTTi4xIG1ldGhvZCB0YWJsZSBmb3IgdGhlIGdpdmVuIHxuaWR8LCB3aGljaAorICogc2hvdWxkIGJlIG9uZSBvZiB0aGUgfEVWUF9QS0VZXyp8IHZhbHVlcy4gSXQgcmV0dXJucyBOVUxMIGlmIHxuaWR8IGlzCisgKiB1bmtub3duLiAqLworY29uc3QgRVZQX1BLRVlfQVNOMV9NRVRIT0QgKkVWUF9QS0VZX2FzbjFfZmluZChFTkdJTkUgKipwZW5naW5lLCBpbnQgbmlkKTsKKworLyogVE9ETyhmb3JrKTogbW92ZSB0byBQRU0/ICovCitjb25zdCBFVlBfUEtFWV9BU04xX01FVEhPRCAqRVZQX1BLRVlfYXNuMV9maW5kX3N0cihFTkdJTkUgKipwZW5naW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4pOworCitzdHJ1Y3QgZXZwX3BrZXlfc3QgeworICBpbnQgcmVmZXJlbmNlczsKKworICAvKiB0eXBlIGNvbnRhaW5zIG9uZSBvZiB0aGUgRVZQX1BLRVlfKiB2YWx1ZXMgb3IgTklEX3VuZGVmIGFuZCBkZXRlcm1pbmVzCisgICAqIHdoaWNoIGVsZW1lbnQgKGlmIGFueSkgb2YgdGhlIHxwa2V5fCB1bmlvbiBpcyB2YWxpZC4gKi8KKyAgaW50IHR5cGU7CisKKyAgLyogVE9ETyhmb3JrKTogZG9jdW1lbnQgKi8KKyAgaW50IHNhdmVfdHlwZTsKKworICB1bmlvbiB7CisgICAgY2hhciAqcHRyOworICAgIHN0cnVjdCByc2Ffc3QgKnJzYTsgLyogUlNBICovCisgICAgc3RydWN0IGRzYV9zdCAqZHNhOyAvKiBEU0EgKi8KKyAgICBzdHJ1Y3QgZGhfc3QgKmRoOyAvKiBESCAqLworICAgIHN0cnVjdCBlY19rZXlfc3QgKmVjOyAvKiBFQ0MgKi8KKyAgfSBwa2V5OworCisgIEVOR0lORSAqZW5naW5lOworCisgIC8qIFRPRE8oZm9yayk6IGRvY3VtZW50ICovCisgIGludCBzYXZlX3BhcmFtZXRlcnM7CisgIC8qIGFtZXRoIGNvbnRhaW5zIGEgcG9pbnRlciB0byBhIG1ldGhvZCB0YWJsZSB0aGF0IGNvbnRhaW5zIG1hbnkgQVNOLjEKKyAgICogbWV0aG9kcyBmb3IgdGhlIGtleSB0eXBlLiAqLworICBjb25zdCBFVlBfUEtFWV9BU04xX01FVEhPRCAqYW1ldGg7CisKKyAgLyogVE9ETyhmb3JrKTogZG9jdW1lbnQ7ICovCisgIFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqIGF0dHJpYnV0ZXM7IC8qIFsgMCBdICovCit9IC8qIEVWUF9QS0VZICovOworCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfSAgLyogZXh0ZXJuIEMgKi8KKyNlbmRpZgorCisjZGVmaW5lIEVWUF9GX3JzYV9pdGVtX3ZlcmlmeSAxMDAKKyNkZWZpbmUgRVZQX0ZfZG9fc2lndmVyX2luaXQgMTAxCisjZGVmaW5lIEVWUF9GX2Vja2V5X3ByaXZfZGVjb2RlIDEwMgorI2RlZmluZSBFVlBfRl9wa2V5X2VjX3NpZ24gMTAzCisjZGVmaW5lIEVWUF9GX0VWUF9QS0VZX3NpZ25faW5pdCAxMDQKKyNkZWZpbmUgRVZQX0ZfZDJpX1ByaXZhdGVLZXkgMTA1CisjZGVmaW5lIEVWUF9GX3JzYV9wcml2X2VuY29kZSAxMDYKKyNkZWZpbmUgRVZQX0ZfcnNhX21nZjFfdG9fbWQgMTA3CisjZGVmaW5lIEVWUF9GX0VWUF9QS0VZX2dldDFfREggMTA4CisjZGVmaW5lIEVWUF9GX0VWUF9QS0VZX3NpZ24gMTA5CisjZGVmaW5lIEVWUF9GX29sZF9lY19wcml2X2RlY29kZSAxMTAKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfZ2V0MV9SU0EgMTExCisjZGVmaW5lIEVWUF9GX3BrZXlfZWNfY3RybCAxMTIKKyNkZWZpbmUgRVZQX0ZfZXZwX3BrZXlfY3R4X25ldyAxMTMKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfdmVyaWZ5IDExNAorI2RlZmluZSBFVlBfRl9FVlBfUEtFWV9lbmNyeXB0IDExNQorI2RlZmluZSBFVlBfRl9FVlBfUEtFWV9rZXlnZW4gMTE2CisjZGVmaW5lIEVWUF9GX2Vja2V5X3R5cGUycGFyYW0gMTE3CisjZGVmaW5lIEVWUF9GX2Vja2V5X3ByaXZfZW5jb2RlIDExOAorI2RlZmluZSBFVlBfRl9kb19FQ19LRVlfcHJpbnQgMTE5CisjZGVmaW5lIEVWUF9GX3BrZXlfZWNfa2V5Z2VuIDEyMAorI2RlZmluZSBFVlBfRl9FVlBfUEtFWV9lbmNyeXB0X2luaXQgMTIxCisjZGVmaW5lIEVWUF9GX3BrZXlfcnNhX2N0cmwgMTIyCisjZGVmaW5lIEVWUF9GX3JzYV9wcml2X2RlY29kZSAxMjMKKyNkZWZpbmUgRVZQX0ZfcnNhX3Bzc190b19jdHggMTI0CisjZGVmaW5lIEVWUF9GX0VWUF9QS0VZX2dldDFfRUNfS0VZIDEyNQorI2RlZmluZSBFVlBfRl9FVlBfUEtFWV92ZXJpZnlfaW5pdCAxMjYKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfZGVyaXZlX2luaXQgMTI3CisjZGVmaW5lIEVWUF9GX2Vja2V5X3BhcmFtMnR5cGUgMTI4CisjZGVmaW5lIEVWUF9GX2Vja2V5X3B1Yl9kZWNvZGUgMTI5CisjZGVmaW5lIEVWUF9GX2QyaV9BdXRvUHJpdmF0ZUtleSAxMzAKKyNkZWZpbmUgRVZQX0ZfZWNrZXlfcGFyYW1fZGVjb2RlIDEzMQorI2RlZmluZSBFVlBfRl9FVlBfUEtFWV9uZXcgMTMyCisjZGVmaW5lIEVWUF9GX3BrZXlfZWNfZGVyaXZlIDEzMworI2RlZmluZSBFVlBfRl9wa2V5X2VjX3BhcmFtZ2VuIDEzNAorI2RlZmluZSBFVlBfRl9FVlBfUEtFWV9DVFhfY3RybCAxMzUKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfZGVjcnlwdF9pbml0IDEzNgorI2RlZmluZSBFVlBfRl9FVlBfUEtFWV9kZWNyeXB0IDEzNworI2RlZmluZSBFVlBfRl9FVlBfUEtFWV9jb3B5X3BhcmFtZXRlcnMgMTM4CisjZGVmaW5lIEVWUF9GX0VWUF9QS0VZX3NldF90eXBlIDEzOQorI2RlZmluZSBFVlBfRl9FVlBfUEtFWV9kZXJpdmUgMTQwCisjZGVmaW5lIEVWUF9GX0VWUF9QS0VZX2tleWdlbl9pbml0IDE0MQorI2RlZmluZSBFVlBfRl9kb19yc2FfcHJpbnQgMTQyCisjZGVmaW5lIEVWUF9GX29sZF9yc2FfcHJpdl9kZWNvZGUgMTQzCisjZGVmaW5lIEVWUF9GX3JzYV9hbGdvcl90b19tZCAxNDQKKyNkZWZpbmUgRVZQX0ZfZWNrZXlfcHViX2VuY29kZSAxNDUKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfZGVyaXZlX3NldF9wZWVyIDE0NgorI2RlZmluZSBFVlBfRl9wa2V5X3JzYV9zaWduIDE0NworI2RlZmluZSBFVlBfRl9jaGVja19wYWRkaW5nX21kIDE0OAorI2RlZmluZSBFVlBfRl9pMmRfUHVibGljS2V5IDE0OQorI2RlZmluZSBFVlBfRl9yc2FfcHViX2RlY29kZSAxNTAKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfZ2V0MV9EU0EgMTUxCisjZGVmaW5lIEVWUF9SX1VOU1VQUE9SVEVEX1BVQkxJQ19LRVlfVFlQRSAxMDAKKyNkZWZpbmUgRVZQX1JfVU5TVVBQT1JURURfU0lHTkFUVVJFX1RZUEUgMTAxCisjZGVmaW5lIEVWUF9SX0lOVkFMSURfRElHRVNUX1RZUEUgMTAyCisjZGVmaW5lIEVWUF9SX0VYUEVDVElOR19BX0RIX0tFWSAxMDMKKyNkZWZpbmUgRVZQX1JfT1BFUkFUT05fTk9UX0lOSVRJQUxJWkVEIDEwNAorI2RlZmluZSBFVlBfUl9NSVNTSU5HX1BBUkFNRVRFUlMgMTA1CisjZGVmaW5lIEVWUF9SX05PX0RFRkFVTFRfRElHRVNUIDEwNgorI2RlZmluZSBFVlBfUl9VTktOT1dOX0RJR0VTVCAxMDcKKyNkZWZpbmUgRVZQX1JfS0VZU19OT1RfU0VUIDEwOAorI2RlZmluZSBFVlBfUl9YOTMxX1VOU1VQUE9SVEVEIDEwOQorI2RlZmluZSBFVlBfUl9ESUdFU1RfRE9FU19OT1RfTUFUQ0ggMTEwCisjZGVmaW5lIEVWUF9SX0RJRkZFUkVOVF9QQVJBTUVURVJTIDExMQorI2RlZmluZSBFVlBfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFIDExMgorI2RlZmluZSBFVlBfUl9ESUZGRVJFTlRfS0VZX1RZUEVTIDExMworI2RlZmluZSBFVlBfUl9OT19QQVJBTUVURVJTX1NFVCAxMTQKKyNkZWZpbmUgRVZQX1JfTk9fTklEX0ZPUl9DVVJWRSAxMTUKKyNkZWZpbmUgRVZQX1JfTk9fT1BFUkFUSU9OX1NFVCAxMTYKKyNkZWZpbmUgRVZQX1JfVU5TVVBQT1JURURfQUxHT1JJVEhNIDExNworI2RlZmluZSBFVlBfUl9FWFBFQ1RJTkdfQU5fRFNBX0tFWSAxMTgKKyNkZWZpbmUgRVZQX1JfVU5LTk9XTl9NQVNLX0RJR0VTVCAxMTkKKyNkZWZpbmUgRVZQX1JfSU5WQUxJRF9TQUxUX0xFTkdUSCAxMjAKKyNkZWZpbmUgRVZQX1JfQlVGRkVSX1RPT19TTUFMTCAxMjEKKyNkZWZpbmUgRVZQX1JfSU5WQUxJRF9QQURESU5HX01PREUgMTIyCisjZGVmaW5lIEVWUF9SX0lOVkFMSURfTUdGMV9NRCAxMjMKKyNkZWZpbmUgRVZQX1JfU0hBUkVEX0lORk9fRVJST1IgMTI0CisjZGVmaW5lIEVWUF9SX0lOVkFMSURfS0VZQklUUyAxMjUKKyNkZWZpbmUgRVZQX1JfUEVFUl9LRVlfRVJST1IgMTI2CisjZGVmaW5lIEVWUF9SX0VYUEVDVElOR19BX0RTQV9LRVkgMTI3CisjZGVmaW5lIEVWUF9SX1VOU1VQUE9SVEVEX01BU0tfQUxHT1JJVEhNIDEyOAorI2RlZmluZSBFVlBfUl9FWFBFQ1RJTkdfQU5fRUNfS0VZX0tFWSAxMjkKKyNkZWZpbmUgRVZQX1JfSU5WQUxJRF9UUkFJTEVSIDEzMAorI2RlZmluZSBFVlBfUl9JTlZBTElEX0RJR0VTVF9MRU5HVEggMTMxCisjZGVmaW5lIEVWUF9SX0NPTU1BTkRfTk9UX1NVUFBPUlRFRCAxMzIKKyNkZWZpbmUgRVZQX1JfRVhQTElDSVRfRUNfUEFSQU1FVEVSU19OT1RfU1VQUE9SVEVEIDEzMworI2RlZmluZSBFVlBfUl9JTExFR0FMX09SX1VOU1VQUE9SVEVEX1BBRERJTkdfTU9ERSAxMzQKKyNkZWZpbmUgRVZQX1JfTk9fTURDMl9TVVBQT1JUIDEzNQorI2RlZmluZSBFVlBfUl9JTlZBTElEX0NVUlZFIDEzNgorI2RlZmluZSBFVlBfUl9OT19LRVlfU0VUIDEzNworI2RlZmluZSBFVlBfUl9JTlZBTElEX1BTU19QQVJBTUVURVJTIDEzOAorI2RlZmluZSBFVlBfUl9LREZfUEFSQU1FVEVSX0VSUk9SIDEzOQorI2RlZmluZSBFVlBfUl9VTlNVUFBPUlRFRF9NQVNLX1BBUkFNRVRFUiAxNDAKKyNkZWZpbmUgRVZQX1JfRVhQRUNUSU5HX0FOX1JTQV9LRVkgMTQxCisjZGVmaW5lIEVWUF9SX0lOVkFMSURfT1BFUkFUSU9OIDE0MgorI2RlZmluZSBFVlBfUl9ERUNPREVfRVJST1IgMTQzCisjZGVmaW5lIEVWUF9SX0lOVkFMSURfUFNTX1NBTFRMRU4gMTQ0CisjZGVmaW5lIEVWUF9SX1VOS05PV05fUFVCTElDX0tFWV9UWVBFIDE0NQorCisjZW5kaWYgIC8qIE9QRU5TU0xfSEVBREVSX0VWUF9IICovCmRpZmYgLS1naXQgYS9jcnlwdG8vZXZwL2V2cF9jdHguYyBiL2NyeXB0by9ldnAvZXZwX2N0eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMzc1NWEKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vZXZwL2V2cF9jdHguYwpAQCAtMCwwICsxLDU0OCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqLmg+CisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisKK2V4dGVybiBjb25zdCBFVlBfUEtFWV9NRVRIT0QgcnNhX3BrZXlfbWV0aDsKK2V4dGVybiBjb25zdCBFVlBfUEtFWV9NRVRIT0QgaG1hY19wa2V5X21ldGg7CitleHRlcm4gY29uc3QgRVZQX1BLRVlfTUVUSE9EIGVjX3BrZXlfbWV0aDsKKworc3RhdGljIGNvbnN0IEVWUF9QS0VZX01FVEhPRCAqZXZwX21ldGhvZHNbXSA9IHsKKyAgJnJzYV9wa2V5X21ldGgsCisgICZobWFjX3BrZXlfbWV0aCwKKyAgJmVjX3BrZXlfbWV0aCwKK307CisKK3N0YXRpYyBjb25zdCBFVlBfUEtFWV9NRVRIT0QgKmV2cF9wa2V5X21ldGhfZmluZChpbnQgdHlwZSkgeworICB1bnNpZ25lZCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoZXZwX21ldGhvZHMpL3NpemVvZihFVlBfUEtFWV9NRVRIT0QqKTsgaSsrKSB7CisgICAgaWYgKGV2cF9tZXRob2RzW2ldLT5wa2V5X2lkID09IHR5cGUpIHsKKyAgICAgIHJldHVybiBldnBfbWV0aG9kc1tpXTsKKyAgICB9CisgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIEVWUF9QS0VZX0NUWCAqZXZwX3BrZXlfY3R4X25ldyhFVlBfUEtFWSAqcGtleSwgRU5HSU5FICplLCBpbnQgaWQpIHsKKyAgRVZQX1BLRVlfQ1RYICpyZXQ7CisgIGNvbnN0IEVWUF9QS0VZX01FVEhPRCAqcG1ldGg7CisKKyAgaWYgKGlkID09IC0xKSB7CisgICAgaWYgKCFwa2V5IHx8ICFwa2V5LT5hbWV0aCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlkID0gcGtleS0+YW1ldGgtPnBrZXlfaWQ7CisgIH0KKworICBwbWV0aCA9IGV2cF9wa2V5X21ldGhfZmluZChpZCk7CisKKyAgaWYgKHBtZXRoID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGV2cF9wa2V5X2N0eF9uZXcsIEVWUF9SX1VOU1VQUE9SVEVEX0FMR09SSVRITSk7CisgICAgY29uc3QgY2hhciAqbmFtZSA9IE9CSl9uaWQyc24oaWQpOworICAgIEVSUl9hZGRfZXJyb3JfZGF0YWYoImFsZ29yaXRobSAlZCAoJXMpIiwgaWQsIG5hbWUpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0ID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEVWUF9QS0VZX0NUWCkpOworICBpZiAoIXJldCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZXZwX3BrZXlfY3R4X25ldywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIHJldHVybiBOVUxMOworICB9CisgIG1lbXNldChyZXQsIDAsIHNpemVvZihFVlBfUEtFWV9DVFgpKTsKKworICByZXQtPmVuZ2luZSA9IGU7CisgIHJldC0+cG1ldGggPSBwbWV0aDsKKyAgcmV0LT5vcGVyYXRpb24gPSBFVlBfUEtFWV9PUF9VTkRFRklORUQ7CisKKyAgaWYgKHBrZXkpIHsKKyAgICByZXQtPnBrZXkgPSBwa2V5OworICAgIENSWVBUT19hZGQoJnBrZXktPnJlZmVyZW5jZXMsIDEsIENSWVBUT19MT0NLX0VWUF9QS0VZKTsKKyAgfQorCisgIGlmIChwbWV0aC0+aW5pdCkgeworICAgIGlmIChwbWV0aC0+aW5pdChyZXQpIDw9IDApIHsKKyAgICAgIEVWUF9QS0VZX0NUWF9mcmVlKHJldCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitFVlBfUEtFWV9DVFggKkVWUF9QS0VZX0NUWF9uZXcoRVZQX1BLRVkgKnBrZXksIEVOR0lORSAqZSkgeworICByZXR1cm4gZXZwX3BrZXlfY3R4X25ldyhwa2V5LCBlLCAtMSk7Cit9CisKK0VWUF9QS0VZX0NUWCAqRVZQX1BLRVlfQ1RYX25ld19pZChpbnQgaWQsIEVOR0lORSAqZSkgeworICByZXR1cm4gZXZwX3BrZXlfY3R4X25ldyhOVUxMLCBlLCBpZCk7Cit9CisKK3ZvaWQgRVZQX1BLRVlfQ1RYX2ZyZWUoRVZQX1BLRVlfQ1RYICpjdHgpIHsKKyAgaWYgKGN0eCA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmIChjdHgtPnBtZXRoICYmIGN0eC0+cG1ldGgtPmNsZWFudXApIHsKKyAgICBjdHgtPnBtZXRoLT5jbGVhbnVwKGN0eCk7CisgIH0KKyAgaWYgKGN0eC0+cGtleSkgeworICAgIEVWUF9QS0VZX2ZyZWUoY3R4LT5wa2V5KTsKKyAgfQorICBpZiAoY3R4LT5wZWVya2V5KSB7CisgICAgRVZQX1BLRVlfZnJlZShjdHgtPnBlZXJrZXkpOworICB9CisgIE9QRU5TU0xfZnJlZShjdHgpOworfQorCitFVlBfUEtFWV9DVFggKkVWUF9QS0VZX0NUWF9kdXAoRVZQX1BLRVlfQ1RYICpwY3R4KSB7CisgIEVWUF9QS0VZX0NUWCAqcmN0eDsKKworICBpZiAoIXBjdHgtPnBtZXRoIHx8ICFwY3R4LT5wbWV0aC0+Y29weSkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmN0eCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihFVlBfUEtFWV9DVFgpKTsKKyAgaWYgKCFyY3R4KSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBtZW1zZXQocmN0eCwgMCwgc2l6ZW9mKEVWUF9QS0VZX0NUWCkpOworCisgIHJjdHgtPnBtZXRoID0gcGN0eC0+cG1ldGg7CisgIHJjdHgtPmVuZ2luZSA9IHBjdHgtPmVuZ2luZTsKKyAgcmN0eC0+b3BlcmF0aW9uID0gcGN0eC0+b3BlcmF0aW9uOworCisgIGlmIChwY3R4LT5wa2V5KSB7CisgICAgQ1JZUFRPX2FkZCgmcGN0eC0+cGtleS0+cmVmZXJlbmNlcywgMSwgQ1JZUFRPX0xPQ0tfRVZQX1BLRVkpOworICB9CisgIHJjdHgtPnBrZXkgPSBwY3R4LT5wa2V5OworCisgIGlmIChwY3R4LT5wZWVya2V5KSB7CisgICAgQ1JZUFRPX2FkZCgmcGN0eC0+cGVlcmtleS0+cmVmZXJlbmNlcywgMSwgQ1JZUFRPX0xPQ0tfRVZQX1BLRVkpOworICB9CisgIHJjdHgtPnBlZXJrZXkgPSBwY3R4LT5wZWVya2V5OworCisgIGlmIChwY3R4LT5wbWV0aC0+Y29weShyY3R4LCBwY3R4KSA+IDApIHsKKyAgICByZXR1cm4gcmN0eDsKKyAgfQorCisgIEVWUF9QS0VZX0NUWF9mcmVlKHJjdHgpOworICByZXR1cm4gTlVMTDsKK30KKworRVZQX1BLRVkgKkVWUF9QS0VZX0NUWF9nZXQwX3BrZXkoRVZQX1BLRVlfQ1RYICpjdHgpIHsgcmV0dXJuIGN0eC0+cGtleTsgfQorCit2b2lkIEVWUF9QS0VZX0NUWF9zZXRfYXBwX2RhdGEoRVZQX1BLRVlfQ1RYICpjdHgsIHZvaWQgKmRhdGEpIHsKKyAgY3R4LT5hcHBfZGF0YSA9IGRhdGE7Cit9CisKK3ZvaWQgKkVWUF9QS0VZX0NUWF9nZXRfYXBwX2RhdGEoRVZQX1BLRVlfQ1RYICpjdHgpIHsgcmV0dXJuIGN0eC0+YXBwX2RhdGE7IH0KKworaW50IEVWUF9QS0VZX0NUWF9jdHJsKEVWUF9QS0VZX0NUWCAqY3R4LCBpbnQga2V5dHlwZSwgaW50IG9wdHlwZSwgaW50IGNtZCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgcDEsIHZvaWQgKnAyKSB7CisgIGludCByZXQ7CisgIGlmICghY3R4IHx8ICFjdHgtPnBtZXRoIHx8ICFjdHgtPnBtZXRoLT5jdHJsKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9DVFhfY3RybCwgRVZQX1JfQ09NTUFORF9OT1RfU1VQUE9SVEVEKTsKKyAgICByZXR1cm4gLTI7CisgIH0KKyAgaWYgKGtleXR5cGUgIT0gLTEgJiYgY3R4LT5wbWV0aC0+cGtleV9pZCAhPSBrZXl0eXBlKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKGN0eC0+b3BlcmF0aW9uID09IEVWUF9QS0VZX09QX1VOREVGSU5FRCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1BLRVlfQ1RYX2N0cmwsIEVWUF9SX05PX09QRVJBVElPTl9TRVQpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmIChvcHR5cGUgIT0gLTEgJiYgIShjdHgtPm9wZXJhdGlvbiAmIG9wdHlwZSkpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX0NUWF9jdHJsLCBFVlBfUl9JTlZBTElEX09QRVJBVElPTik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmV0ID0gY3R4LT5wbWV0aC0+Y3RybChjdHgsIGNtZCwgcDEsIHAyKTsKKworICBpZiAocmV0ID09IC0yKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9DVFhfY3RybCwgRVZQX1JfQ09NTUFORF9OT1RfU1VQUE9SVEVEKTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK2ludCBFVlBfUEtFWV9zaWduX2luaXQoRVZQX1BLRVlfQ1RYICpjdHgpIHsKKyAgaW50IHJldDsKKyAgaWYgKCFjdHggfHwgIWN0eC0+cG1ldGggfHwgIWN0eC0+cG1ldGgtPnNpZ24pIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX3NpZ25faW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICBFVlBfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGN0eC0+b3BlcmF0aW9uID0gRVZQX1BLRVlfT1BfU0lHTjsKKyAgaWYgKCFjdHgtPnBtZXRoLT5zaWduX2luaXQpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHJldCA9IGN0eC0+cG1ldGgtPnNpZ25faW5pdChjdHgpOworICAvKiBUT0RPKGZvcmspOiBub3JtYWxpc2UgdGhlIHJldHVybiB2YWx1ZSBjb252ZW50aW9uLiAqLworICBpZiAocmV0IDw9IDApIHsKKyAgICBjdHgtPm9wZXJhdGlvbiA9IEVWUF9QS0VZX09QX1VOREVGSU5FRDsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfYXV0b2FyZyhjb25zdCBFVlBfUEtFWV9DVFggKmN0eCwgY29uc3QgdWludDhfdCAqYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqYXJnX2xlbikgeworICBzaXplX3Qgc2l6ZTsKKworICBpZiAoMCA9PSAoY3R4LT5wbWV0aC0+ZmxhZ3MgJiBFVlBfUEtFWV9GTEFHX0FVVE9BUkdMRU4pKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBzaXplID0gRVZQX1BLRVlfc2l6ZShjdHgtPnBrZXkpOworICBpZiAoYXJnID09IE5VTEwpIHsKKyAgICAqYXJnX2xlbiA9IHNpemU7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpZiAoKmFyZ19sZW4gPCBzaXplKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICByZXR1cm4gMTsKK30KKworaW50IEVWUF9QS0VZX3NpZ24oRVZQX1BLRVlfQ1RYICpjdHgsIHVpbnQ4X3QgKnNpZywgc2l6ZV90ICpzaWdfbGVuLAorICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuKSB7CisgIGlmICghY3R4IHx8ICFjdHgtPnBtZXRoIHx8ICFjdHgtPnBtZXRoLT5zaWduKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9zaWduLAorICAgICAgICAgICAgICAgICAgICAgIEVWUF9SX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUpOworICAgIHJldHVybiAwOworICB9CisgIGlmIChjdHgtPm9wZXJhdGlvbiAhPSBFVlBfUEtFWV9PUF9TSUdOKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9zaWduLCBFVlBfUl9PUEVSQVRPTl9OT1RfSU5JVElBTElaRUQpOworICAgIHJldHVybiAwOworICB9CisgIGlmICghY2hlY2tfYXV0b2FyZyhjdHgsIHNpZywgc2lnX2xlbikpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX3NpZ24sCisgICAgICAgICAgICAgICAgICAgICAgRVZQX1JfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIGN0eC0+cG1ldGgtPnNpZ24oY3R4LCBzaWcsIHNpZ19sZW4sIGRhdGEsIGRhdGFfbGVuKTsKK30KKworaW50IEVWUF9QS0VZX3ZlcmlmeV9pbml0KEVWUF9QS0VZX0NUWCAqY3R4KSB7CisgIGludCByZXQ7CisKKyAgaWYgKCFjdHggfHwgIWN0eC0+cG1ldGggfHwgIWN0eC0+cG1ldGgtPnZlcmlmeSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1BLRVlfdmVyaWZ5X2luaXQsCisgICAgICAgICAgICAgICAgICAgICAgRVZQX1JfT1BFUkFUSU9OX05PVF9TVVBQT1JURURfRk9SX1RISVNfS0VZVFlQRSk7CisgICAgcmV0dXJuIC0yOworICB9CisgIGN0eC0+b3BlcmF0aW9uID0gRVZQX1BLRVlfT1BfVkVSSUZZOworICBpZiAoIWN0eC0+cG1ldGgtPnZlcmlmeV9pbml0KSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0ID0gY3R4LT5wbWV0aC0+dmVyaWZ5X2luaXQoY3R4KTsKKyAgaWYgKHJldCA8PSAwKSB7CisgICAgY3R4LT5vcGVyYXRpb24gPSBFVlBfUEtFWV9PUF9VTkRFRklORUQ7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworaW50IEVWUF9QS0VZX3ZlcmlmeShFVlBfUEtFWV9DVFggKmN0eCwgY29uc3QgdWludDhfdCAqc2lnLCBzaXplX3Qgc2lnX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuKSB7CisgIGlmICghY3R4IHx8ICFjdHgtPnBtZXRoIHx8ICFjdHgtPnBtZXRoLT52ZXJpZnkpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX3ZlcmlmeSwKKyAgICAgICAgICAgICAgICAgICAgICBFVlBfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFKTsKKyAgICByZXR1cm4gLTI7CisgIH0KKyAgaWYgKGN0eC0+b3BlcmF0aW9uICE9IEVWUF9QS0VZX09QX1ZFUklGWSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1BLRVlfdmVyaWZ5LCBFVlBfUl9PUEVSQVRPTl9OT1RfSU5JVElBTElaRUQpOworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gY3R4LT5wbWV0aC0+dmVyaWZ5KGN0eCwgc2lnLCBzaWdfbGVuLCBkYXRhLCBkYXRhX2xlbik7Cit9CisKK2ludCBFVlBfUEtFWV9lbmNyeXB0X2luaXQoRVZQX1BLRVlfQ1RYICpjdHgpIHsKKyAgaW50IHJldDsKKyAgaWYgKCFjdHggfHwgIWN0eC0+cG1ldGggfHwgIWN0eC0+cG1ldGgtPmVuY3J5cHQpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX2VuY3J5cHRfaW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICBFVlBfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFKTsKKyAgICByZXR1cm4gLTI7CisgIH0KKyAgY3R4LT5vcGVyYXRpb24gPSBFVlBfUEtFWV9PUF9FTkNSWVBUOworICBpZiAoIWN0eC0+cG1ldGgtPmVuY3J5cHRfaW5pdCkgeworICAgIHJldHVybiAxOworICB9CisgIHJldCA9IGN0eC0+cG1ldGgtPmVuY3J5cHRfaW5pdChjdHgpOworICBpZiAocmV0IDw9IDApIHsKKyAgICBjdHgtPm9wZXJhdGlvbiA9IEVWUF9QS0VZX09QX1VOREVGSU5FRDsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitpbnQgRVZQX1BLRVlfZW5jcnlwdChFVlBfUEtFWV9DVFggKmN0eCwgdWludDhfdCAqb3V0LCBzaXplX3QgKm91dGxlbiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5sZW4pIHsKKyAgaWYgKCFjdHggfHwgIWN0eC0+cG1ldGggfHwgIWN0eC0+cG1ldGgtPmVuY3J5cHQpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX2VuY3J5cHQsCisgICAgICAgICAgICAgICAgICAgICAgRVZQX1JfT1BFUkFUSU9OX05PVF9TVVBQT1JURURfRk9SX1RISVNfS0VZVFlQRSk7CisgICAgcmV0dXJuIC0yOworICB9CisgIGlmIChjdHgtPm9wZXJhdGlvbiAhPSBFVlBfUEtFWV9PUF9FTkNSWVBUKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9lbmNyeXB0LCBFVlBfUl9PUEVSQVRPTl9OT1RfSU5JVElBTElaRUQpOworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoIWNoZWNrX2F1dG9hcmcoY3R4LCBvdXQsIG91dGxlbikpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX2VuY3J5cHQsIEVWUF9SX0JVRkZFUl9UT09fU01BTEwpOworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBjdHgtPnBtZXRoLT5lbmNyeXB0KGN0eCwgb3V0LCBvdXRsZW4sIGluLCBpbmxlbik7Cit9CisKK2ludCBFVlBfUEtFWV9kZWNyeXB0X2luaXQoRVZQX1BLRVlfQ1RYICpjdHgpIHsKKyAgaW50IHJldDsKKworICBpZiAoIWN0eCB8fCAhY3R4LT5wbWV0aCB8fCAhY3R4LT5wbWV0aC0+ZGVjcnlwdCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1BLRVlfZGVjcnlwdF9pbml0LAorICAgICAgICAgICAgICAgICAgICAgIEVWUF9SX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUpOworICAgIHJldHVybiAtMjsKKyAgfQorICBjdHgtPm9wZXJhdGlvbiA9IEVWUF9QS0VZX09QX0RFQ1JZUFQ7CisgIGlmICghY3R4LT5wbWV0aC0+ZGVjcnlwdF9pbml0KSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0ID0gY3R4LT5wbWV0aC0+ZGVjcnlwdF9pbml0KGN0eCk7CisgIGlmIChyZXQgPD0gMCkgeworICAgIGN0eC0+b3BlcmF0aW9uID0gRVZQX1BLRVlfT1BfVU5ERUZJTkVEOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK2ludCBFVlBfUEtFWV9kZWNyeXB0KEVWUF9QS0VZX0NUWCAqY3R4LCB1aW50OF90ICpvdXQsIHNpemVfdCAqb3V0bGVuLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpbmxlbikgeworICBpZiAoIWN0eCB8fCAhY3R4LT5wbWV0aCB8fCAhY3R4LT5wbWV0aC0+ZGVjcnlwdCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1BLRVlfZGVjcnlwdCwKKyAgICAgICAgICAgICAgICAgICAgICBFVlBfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFKTsKKyAgICByZXR1cm4gLTI7CisgIH0KKyAgaWYgKGN0eC0+b3BlcmF0aW9uICE9IEVWUF9QS0VZX09QX0RFQ1JZUFQpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX2RlY3J5cHQsIEVWUF9SX09QRVJBVE9OX05PVF9JTklUSUFMSVpFRCk7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmICghY2hlY2tfYXV0b2FyZyhjdHgsIG91dCwgb3V0bGVuKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1BLRVlfZGVjcnlwdCwgRVZQX1JfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIGN0eC0+cG1ldGgtPmRlY3J5cHQoY3R4LCBvdXQsIG91dGxlbiwgaW4sIGlubGVuKTsKK30KKworaW50IEVWUF9QS0VZX2Rlcml2ZV9pbml0KEVWUF9QS0VZX0NUWCAqY3R4KSB7CisgIGludCByZXQ7CisgIGlmICghY3R4IHx8ICFjdHgtPnBtZXRoIHx8ICFjdHgtPnBtZXRoLT5kZXJpdmUpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX2Rlcml2ZV9pbml0LAorICAgICAgICAgICAgICAgICAgICAgIEVWUF9SX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUpOworICAgIHJldHVybiAtMjsKKyAgfQorICBjdHgtPm9wZXJhdGlvbiA9IEVWUF9QS0VZX09QX0RFUklWRTsKKyAgaWYgKCFjdHgtPnBtZXRoLT5kZXJpdmVfaW5pdCkgeworICAgIHJldHVybiAxOworICB9CisgIHJldCA9IGN0eC0+cG1ldGgtPmRlcml2ZV9pbml0KGN0eCk7CisgIGlmIChyZXQgPD0gMCkgeworICAgIGN0eC0+b3BlcmF0aW9uID0gRVZQX1BLRVlfT1BfVU5ERUZJTkVEOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK2ludCBFVlBfUEtFWV9kZXJpdmVfc2V0X3BlZXIoRVZQX1BLRVlfQ1RYICpjdHgsIEVWUF9QS0VZICpwZWVyKSB7CisgIGludCByZXQ7CisgIGlmICghY3R4IHx8ICFjdHgtPnBtZXRoIHx8CisgICAgICAhKGN0eC0+cG1ldGgtPmRlcml2ZSB8fCBjdHgtPnBtZXRoLT5lbmNyeXB0IHx8IGN0eC0+cG1ldGgtPmRlY3J5cHQpIHx8CisgICAgICAhY3R4LT5wbWV0aC0+Y3RybCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1BLRVlfZGVyaXZlX3NldF9wZWVyLAorICAgICAgICAgICAgICAgICAgICAgIEVWUF9SX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUpOworICAgIHJldHVybiAtMjsKKyAgfQorICBpZiAoY3R4LT5vcGVyYXRpb24gIT0gRVZQX1BLRVlfT1BfREVSSVZFICYmCisgICAgICBjdHgtPm9wZXJhdGlvbiAhPSBFVlBfUEtFWV9PUF9FTkNSWVBUICYmCisgICAgICBjdHgtPm9wZXJhdGlvbiAhPSBFVlBfUEtFWV9PUF9ERUNSWVBUKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9kZXJpdmVfc2V0X3BlZXIsCisgICAgICAgICAgICAgICAgICAgICAgRVZQX1JfT1BFUkFUT05fTk9UX0lOSVRJQUxJWkVEKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICByZXQgPSBjdHgtPnBtZXRoLT5jdHJsKGN0eCwgRVZQX1BLRVlfQ1RSTF9QRUVSX0tFWSwgMCwgcGVlcik7CisKKyAgaWYgKHJldCA8PSAwKSB7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIGlmIChyZXQgPT0gMikgeworICAgIHJldHVybiAxOworICB9CisKKyAgaWYgKCFjdHgtPnBrZXkpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX2Rlcml2ZV9zZXRfcGVlciwgRVZQX1JfTk9fS0VZX1NFVCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKGN0eC0+cGtleS0+dHlwZSAhPSBwZWVyLT50eXBlKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9kZXJpdmVfc2V0X3BlZXIsIEVWUF9SX0RJRkZFUkVOVF9LRVlfVFlQRVMpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8qIHJhbkBjcnlwdG9jb20ucnU6IEZvciBjbGFyaXR5LiAgVGhlIGVycm9yIGlzIGlmIHBhcmFtZXRlcnMgaW4gcGVlciBhcmUKKyAgICogcHJlc2VudCAoIW1pc3NpbmcpIGJ1dCBkb24ndCBtYXRjaC4gIEVWUF9QS0VZX2NtcF9wYXJhbWV0ZXJzIG1heSByZXR1cm4KKyAgICogMSAobWF0Y2gpLCAwIChkb24ndCBtYXRjaCkgYW5kIC0yIChjb21wYXJpc29uIGlzIG5vdCBkZWZpbmVkKS4gIC0xCisgICAqIChkaWZmZXJlbnQga2V5IHR5cGVzKSBpcyBpbXBvc3NpYmxlIGhlcmUgYmVjYXVzZSBpdCBpcyBjaGVja2VkIGVhcmxpZXIuCisgICAqIC0yIGlzIE9LIGZvciB1cyBoZXJlLCBhcyB3ZWxsIGFzIDEsIHNvIHdlIGNhbiBjaGVjayBmb3IgMCBvbmx5LiAqLworICBpZiAoIUVWUF9QS0VZX21pc3NpbmdfcGFyYW1ldGVycyhwZWVyKSAmJgorICAgICAgIUVWUF9QS0VZX2NtcF9wYXJhbWV0ZXJzKGN0eC0+cGtleSwgcGVlcikpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX2Rlcml2ZV9zZXRfcGVlciwKKyAgICAgICAgICAgICAgICAgICAgICBFVlBfUl9ESUZGRVJFTlRfUEFSQU1FVEVSUyk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKGN0eC0+cGVlcmtleSkgeworICAgIEVWUF9QS0VZX2ZyZWUoY3R4LT5wZWVya2V5KTsKKyAgfQorICBjdHgtPnBlZXJrZXkgPSBwZWVyOworCisgIHJldCA9IGN0eC0+cG1ldGgtPmN0cmwoY3R4LCBFVlBfUEtFWV9DVFJMX1BFRVJfS0VZLCAxLCBwZWVyKTsKKworICBpZiAocmV0IDw9IDApIHsKKyAgICBjdHgtPnBlZXJrZXkgPSBOVUxMOworICAgIHJldHVybiByZXQ7CisgIH0KKworICBDUllQVE9fYWRkKCZwZWVyLT5yZWZlcmVuY2VzLCAxLCBDUllQVE9fTE9DS19FVlBfUEtFWSk7CisgIHJldHVybiAxOworfQorCitpbnQgRVZQX1BLRVlfZGVyaXZlKEVWUF9QS0VZX0NUWCAqY3R4LCB1aW50OF90ICprZXksIHNpemVfdCAqb3V0X2tleV9sZW4pIHsKKyAgaWYgKCFjdHggfHwgIWN0eC0+cG1ldGggfHwgIWN0eC0+cG1ldGgtPmRlcml2ZSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1BLRVlfZGVyaXZlLAorICAgICAgICAgICAgICAgICAgICAgIEVWUF9SX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUpOworICAgIHJldHVybiAtMjsKKyAgfQorICBpZiAoY3R4LT5vcGVyYXRpb24gIT0gRVZQX1BLRVlfT1BfREVSSVZFKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9kZXJpdmUsIEVWUF9SX09QRVJBVE9OX05PVF9JTklUSUFMSVpFRCk7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmICghY2hlY2tfYXV0b2FyZyhjdHgsIGtleSwgb3V0X2tleV9sZW4pKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9kZXJpdmUsIEVWUF9SX0JVRkZFUl9UT09fU01BTEwpOworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBjdHgtPnBtZXRoLT5kZXJpdmUoY3R4LCBrZXksIG91dF9rZXlfbGVuKTsKK30KKworaW50IEVWUF9QS0VZX2tleWdlbl9pbml0KEVWUF9QS0VZX0NUWCAqY3R4KSB7CisgIGludCByZXQ7CisgIGlmICghY3R4IHx8ICFjdHgtPnBtZXRoIHx8ICFjdHgtPnBtZXRoLT5rZXlnZW4pIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX2tleWdlbl9pbml0LAorICAgICAgICAgICAgICAgICAgICAgIEVWUF9SX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUpOworICAgIHJldHVybiAtMjsKKyAgfQorICBjdHgtPm9wZXJhdGlvbiA9IEVWUF9QS0VZX09QX0tFWUdFTjsKKyAgaWYgKCFjdHgtPnBtZXRoLT5rZXlnZW5faW5pdCkgeworICAgIHJldHVybiAxOworICB9CisgIHJldCA9IGN0eC0+cG1ldGgtPmtleWdlbl9pbml0KGN0eCk7CisgIGlmIChyZXQgPD0gMCkgeworICAgIGN0eC0+b3BlcmF0aW9uID0gRVZQX1BLRVlfT1BfVU5ERUZJTkVEOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK2ludCBFVlBfUEtFWV9rZXlnZW4oRVZQX1BLRVlfQ1RYICpjdHgsIEVWUF9QS0VZICoqcHBrZXkpIHsKKyAgaW50IHJldDsKKworICBpZiAoIWN0eCB8fCAhY3R4LT5wbWV0aCB8fCAhY3R4LT5wbWV0aC0+a2V5Z2VuKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9rZXlnZW4sCisgICAgICAgICAgICAgICAgICAgICAgRVZQX1JfT1BFUkFUSU9OX05PVF9TVVBQT1JURURfRk9SX1RISVNfS0VZVFlQRSk7CisgICAgcmV0dXJuIC0yOworICB9CisgIGlmIChjdHgtPm9wZXJhdGlvbiAhPSBFVlBfUEtFWV9PUF9LRVlHRU4pIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX2tleWdlbiwgRVZQX1JfT1BFUkFUT05fTk9UX0lOSVRJQUxJWkVEKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpZiAoIXBwa2V5KSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKCEqcHBrZXkpIHsKKyAgICAqcHBrZXkgPSBFVlBfUEtFWV9uZXcoKTsKKyAgfQorCisgIHJldCA9IGN0eC0+cG1ldGgtPmtleWdlbihjdHgsICpwcGtleSk7CisgIGlmIChyZXQgPD0gMCkgeworICAgIEVWUF9QS0VZX2ZyZWUoKnBwa2V5KTsKKyAgICAqcHBrZXkgPSBOVUxMOworICB9CisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vZXZwL2V2cF9lcnJvci5jIGIvY3J5cHRvL2V2cC9ldnBfZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjRkMmYyCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2V2cC9ldnBfZXJyb3IuYwpAQCAtMCwwICsxLDExOSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE0LCBHb29nbGUgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQorICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLiAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKworI2luY2x1ZGUgImV2cC5oIgorCitjb25zdCBFUlJfU1RSSU5HX0RBVEEgRVZQX2Vycm9yX3N0cmluZ19kYXRhW10gPSB7CisgIHtFUlJfUEFDSyhFUlJfTElCX0VWUCwgRVZQX0ZfRVZQX1BLRVlfQ1RYX2N0cmwsIDApLCAiRVZQX1BLRVlfQ1RYX2N0cmwifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRVZQLCBFVlBfRl9FVlBfUEtFWV9jb3B5X3BhcmFtZXRlcnMsIDApLCAiRVZQX1BLRVlfY29weV9wYXJhbWV0ZXJzIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VWUCwgRVZQX0ZfRVZQX1BLRVlfZGVjcnlwdCwgMCksICJFVlBfUEtFWV9kZWNyeXB0In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VWUCwgRVZQX0ZfRVZQX1BLRVlfZGVjcnlwdF9pbml0LCAwKSwgIkVWUF9QS0VZX2RlY3J5cHRfaW5pdCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIEVWUF9GX0VWUF9QS0VZX2Rlcml2ZSwgMCksICJFVlBfUEtFWV9kZXJpdmUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRVZQLCBFVlBfRl9FVlBfUEtFWV9kZXJpdmVfaW5pdCwgMCksICJFVlBfUEtFWV9kZXJpdmVfaW5pdCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIEVWUF9GX0VWUF9QS0VZX2Rlcml2ZV9zZXRfcGVlciwgMCksICJFVlBfUEtFWV9kZXJpdmVfc2V0X3BlZXIifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRVZQLCBFVlBfRl9FVlBfUEtFWV9lbmNyeXB0LCAwKSwgIkVWUF9QS0VZX2VuY3J5cHQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRVZQLCBFVlBfRl9FVlBfUEtFWV9lbmNyeXB0X2luaXQsIDApLCAiRVZQX1BLRVlfZW5jcnlwdF9pbml0In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VWUCwgRVZQX0ZfRVZQX1BLRVlfZ2V0MV9ESCwgMCksICJFVlBfUEtFWV9nZXQxX0RIIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VWUCwgRVZQX0ZfRVZQX1BLRVlfZ2V0MV9EU0EsIDApLCAiRVZQX1BLRVlfZ2V0MV9EU0EifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRVZQLCBFVlBfRl9FVlBfUEtFWV9nZXQxX0VDX0tFWSwgMCksICJFVlBfUEtFWV9nZXQxX0VDX0tFWSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIEVWUF9GX0VWUF9QS0VZX2dldDFfUlNBLCAwKSwgIkVWUF9QS0VZX2dldDFfUlNBIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VWUCwgRVZQX0ZfRVZQX1BLRVlfa2V5Z2VuLCAwKSwgIkVWUF9QS0VZX2tleWdlbiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIEVWUF9GX0VWUF9QS0VZX2tleWdlbl9pbml0LCAwKSwgIkVWUF9QS0VZX2tleWdlbl9pbml0In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VWUCwgRVZQX0ZfRVZQX1BLRVlfbmV3LCAwKSwgIkVWUF9QS0VZX25ldyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIEVWUF9GX0VWUF9QS0VZX3NldF90eXBlLCAwKSwgIkVWUF9QS0VZX3NldF90eXBlIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VWUCwgRVZQX0ZfRVZQX1BLRVlfc2lnbiwgMCksICJFVlBfUEtFWV9zaWduIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VWUCwgRVZQX0ZfRVZQX1BLRVlfc2lnbl9pbml0LCAwKSwgIkVWUF9QS0VZX3NpZ25faW5pdCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIEVWUF9GX0VWUF9QS0VZX3ZlcmlmeSwgMCksICJFVlBfUEtFWV92ZXJpZnkifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRVZQLCBFVlBfRl9FVlBfUEtFWV92ZXJpZnlfaW5pdCwgMCksICJFVlBfUEtFWV92ZXJpZnlfaW5pdCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIEVWUF9GX2NoZWNrX3BhZGRpbmdfbWQsIDApLCAiY2hlY2tfcGFkZGluZ19tZCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIEVWUF9GX2QyaV9BdXRvUHJpdmF0ZUtleSwgMCksICJkMmlfQXV0b1ByaXZhdGVLZXkifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRVZQLCBFVlBfRl9kMmlfUHJpdmF0ZUtleSwgMCksICJkMmlfUHJpdmF0ZUtleSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIEVWUF9GX2RvX0VDX0tFWV9wcmludCwgMCksICJkb19FQ19LRVlfcHJpbnQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRVZQLCBFVlBfRl9kb19yc2FfcHJpbnQsIDApLCAiZG9fcnNhX3ByaW50In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VWUCwgRVZQX0ZfZG9fc2lndmVyX2luaXQsIDApLCAiZG9fc2lndmVyX2luaXQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRVZQLCBFVlBfRl9lY2tleV9wYXJhbTJ0eXBlLCAwKSwgImVja2V5X3BhcmFtMnR5cGUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRVZQLCBFVlBfRl9lY2tleV9wYXJhbV9kZWNvZGUsIDApLCAiZWNrZXlfcGFyYW1fZGVjb2RlIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VWUCwgRVZQX0ZfZWNrZXlfcHJpdl9kZWNvZGUsIDApLCAiZWNrZXlfcHJpdl9kZWNvZGUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRVZQLCBFVlBfRl9lY2tleV9wcml2X2VuY29kZSwgMCksICJlY2tleV9wcml2X2VuY29kZSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIEVWUF9GX2Vja2V5X3B1Yl9kZWNvZGUsIDApLCAiZWNrZXlfcHViX2RlY29kZSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIEVWUF9GX2Vja2V5X3B1Yl9lbmNvZGUsIDApLCAiZWNrZXlfcHViX2VuY29kZSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIEVWUF9GX2Vja2V5X3R5cGUycGFyYW0sIDApLCAiZWNrZXlfdHlwZTJwYXJhbSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIEVWUF9GX2V2cF9wa2V5X2N0eF9uZXcsIDApLCAiZXZwX3BrZXlfY3R4X25ldyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIEVWUF9GX2kyZF9QdWJsaWNLZXksIDApLCAiaTJkX1B1YmxpY0tleSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIEVWUF9GX29sZF9lY19wcml2X2RlY29kZSwgMCksICJvbGRfZWNfcHJpdl9kZWNvZGUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRVZQLCBFVlBfRl9vbGRfcnNhX3ByaXZfZGVjb2RlLCAwKSwgIm9sZF9yc2FfcHJpdl9kZWNvZGUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRVZQLCBFVlBfRl9wa2V5X2VjX2N0cmwsIDApLCAicGtleV9lY19jdHJsIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VWUCwgRVZQX0ZfcGtleV9lY19kZXJpdmUsIDApLCAicGtleV9lY19kZXJpdmUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRVZQLCBFVlBfRl9wa2V5X2VjX2tleWdlbiwgMCksICJwa2V5X2VjX2tleWdlbiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIEVWUF9GX3BrZXlfZWNfcGFyYW1nZW4sIDApLCAicGtleV9lY19wYXJhbWdlbiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIEVWUF9GX3BrZXlfZWNfc2lnbiwgMCksICJwa2V5X2VjX3NpZ24ifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRVZQLCBFVlBfRl9wa2V5X3JzYV9jdHJsLCAwKSwgInBrZXlfcnNhX2N0cmwifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRVZQLCBFVlBfRl9wa2V5X3JzYV9zaWduLCAwKSwgInBrZXlfcnNhX3NpZ24ifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRVZQLCBFVlBfRl9yc2FfYWxnb3JfdG9fbWQsIDApLCAicnNhX2FsZ29yX3RvX21kIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VWUCwgRVZQX0ZfcnNhX2l0ZW1fdmVyaWZ5LCAwKSwgInJzYV9pdGVtX3ZlcmlmeSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIEVWUF9GX3JzYV9tZ2YxX3RvX21kLCAwKSwgInJzYV9tZ2YxX3RvX21kIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VWUCwgRVZQX0ZfcnNhX3ByaXZfZGVjb2RlLCAwKSwgInJzYV9wcml2X2RlY29kZSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIEVWUF9GX3JzYV9wcml2X2VuY29kZSwgMCksICJyc2FfcHJpdl9lbmNvZGUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRVZQLCBFVlBfRl9yc2FfcHNzX3RvX2N0eCwgMCksICJyc2FfcHNzX3RvX2N0eCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIEVWUF9GX3JzYV9wdWJfZGVjb2RlLCAwKSwgInJzYV9wdWJfZGVjb2RlIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VWUCwgMCwgRVZQX1JfQlVGRkVSX1RPT19TTUFMTCksICJCVUZGRVJfVE9PX1NNQUxMIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VWUCwgMCwgRVZQX1JfQ09NTUFORF9OT1RfU1VQUE9SVEVEKSwgIkNPTU1BTkRfTk9UX1NVUFBPUlRFRCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIDAsIEVWUF9SX0RFQ09ERV9FUlJPUiksICJERUNPREVfRVJST1IifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRVZQLCAwLCBFVlBfUl9ESUZGRVJFTlRfS0VZX1RZUEVTKSwgIkRJRkZFUkVOVF9LRVlfVFlQRVMifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRVZQLCAwLCBFVlBfUl9ESUZGRVJFTlRfUEFSQU1FVEVSUyksICJESUZGRVJFTlRfUEFSQU1FVEVSUyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIDAsIEVWUF9SX0RJR0VTVF9ET0VTX05PVF9NQVRDSCksICJESUdFU1RfRE9FU19OT1RfTUFUQ0gifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRVZQLCAwLCBFVlBfUl9FWFBFQ1RJTkdfQU5fRFNBX0tFWSksICJFWFBFQ1RJTkdfQU5fRFNBX0tFWSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIDAsIEVWUF9SX0VYUEVDVElOR19BTl9FQ19LRVlfS0VZKSwgIkVYUEVDVElOR19BTl9FQ19LRVlfS0VZIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VWUCwgMCwgRVZQX1JfRVhQRUNUSU5HX0FOX1JTQV9LRVkpLCAiRVhQRUNUSU5HX0FOX1JTQV9LRVkifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRVZQLCAwLCBFVlBfUl9FWFBFQ1RJTkdfQV9ESF9LRVkpLCAiRVhQRUNUSU5HX0FfREhfS0VZIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VWUCwgMCwgRVZQX1JfRVhQRUNUSU5HX0FfRFNBX0tFWSksICJFWFBFQ1RJTkdfQV9EU0FfS0VZIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VWUCwgMCwgRVZQX1JfRVhQTElDSVRfRUNfUEFSQU1FVEVSU19OT1RfU1VQUE9SVEVEKSwgIkVYUExJQ0lUX0VDX1BBUkFNRVRFUlNfTk9UX1NVUFBPUlRFRCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIDAsIEVWUF9SX0lMTEVHQUxfT1JfVU5TVVBQT1JURURfUEFERElOR19NT0RFKSwgIklMTEVHQUxfT1JfVU5TVVBQT1JURURfUEFERElOR19NT0RFIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VWUCwgMCwgRVZQX1JfSU5WQUxJRF9DVVJWRSksICJJTlZBTElEX0NVUlZFIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VWUCwgMCwgRVZQX1JfSU5WQUxJRF9ESUdFU1RfTEVOR1RIKSwgIklOVkFMSURfRElHRVNUX0xFTkdUSCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIDAsIEVWUF9SX0lOVkFMSURfRElHRVNUX1RZUEUpLCAiSU5WQUxJRF9ESUdFU1RfVFlQRSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIDAsIEVWUF9SX0lOVkFMSURfS0VZQklUUyksICJJTlZBTElEX0tFWUJJVFMifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRVZQLCAwLCBFVlBfUl9JTlZBTElEX01HRjFfTUQpLCAiSU5WQUxJRF9NR0YxX01EIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VWUCwgMCwgRVZQX1JfSU5WQUxJRF9PUEVSQVRJT04pLCAiSU5WQUxJRF9PUEVSQVRJT04ifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRVZQLCAwLCBFVlBfUl9JTlZBTElEX1BBRERJTkdfTU9ERSksICJJTlZBTElEX1BBRERJTkdfTU9ERSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIDAsIEVWUF9SX0lOVkFMSURfUFNTX1BBUkFNRVRFUlMpLCAiSU5WQUxJRF9QU1NfUEFSQU1FVEVSUyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIDAsIEVWUF9SX0lOVkFMSURfUFNTX1NBTFRMRU4pLCAiSU5WQUxJRF9QU1NfU0FMVExFTiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIDAsIEVWUF9SX0lOVkFMSURfU0FMVF9MRU5HVEgpLCAiSU5WQUxJRF9TQUxUX0xFTkdUSCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIDAsIEVWUF9SX0lOVkFMSURfVFJBSUxFUiksICJJTlZBTElEX1RSQUlMRVIifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRVZQLCAwLCBFVlBfUl9LREZfUEFSQU1FVEVSX0VSUk9SKSwgIktERl9QQVJBTUVURVJfRVJST1IifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRVZQLCAwLCBFVlBfUl9LRVlTX05PVF9TRVQpLCAiS0VZU19OT1RfU0VUIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VWUCwgMCwgRVZQX1JfTUlTU0lOR19QQVJBTUVURVJTKSwgIk1JU1NJTkdfUEFSQU1FVEVSUyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIDAsIEVWUF9SX05PX0RFRkFVTFRfRElHRVNUKSwgIk5PX0RFRkFVTFRfRElHRVNUIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VWUCwgMCwgRVZQX1JfTk9fS0VZX1NFVCksICJOT19LRVlfU0VUIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VWUCwgMCwgRVZQX1JfTk9fTURDMl9TVVBQT1JUKSwgIk5PX01EQzJfU1VQUE9SVCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIDAsIEVWUF9SX05PX05JRF9GT1JfQ1VSVkUpLCAiTk9fTklEX0ZPUl9DVVJWRSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIDAsIEVWUF9SX05PX09QRVJBVElPTl9TRVQpLCAiTk9fT1BFUkFUSU9OX1NFVCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIDAsIEVWUF9SX05PX1BBUkFNRVRFUlNfU0VUKSwgIk5PX1BBUkFNRVRFUlNfU0VUIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VWUCwgMCwgRVZQX1JfT1BFUkFUSU9OX05PVF9TVVBQT1JURURfRk9SX1RISVNfS0VZVFlQRSksICJPUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VWUCwgMCwgRVZQX1JfT1BFUkFUT05fTk9UX0lOSVRJQUxJWkVEKSwgIk9QRVJBVE9OX05PVF9JTklUSUFMSVpFRCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIDAsIEVWUF9SX1BFRVJfS0VZX0VSUk9SKSwgIlBFRVJfS0VZX0VSUk9SIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VWUCwgMCwgRVZQX1JfU0hBUkVEX0lORk9fRVJST1IpLCAiU0hBUkVEX0lORk9fRVJST1IifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRVZQLCAwLCBFVlBfUl9VTktOT1dOX0RJR0VTVCksICJVTktOT1dOX0RJR0VTVCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIDAsIEVWUF9SX1VOS05PV05fTUFTS19ESUdFU1QpLCAiVU5LTk9XTl9NQVNLX0RJR0VTVCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIDAsIEVWUF9SX1VOS05PV05fUFVCTElDX0tFWV9UWVBFKSwgIlVOS05PV05fUFVCTElDX0tFWV9UWVBFIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VWUCwgMCwgRVZQX1JfVU5TVVBQT1JURURfQUxHT1JJVEhNKSwgIlVOU1VQUE9SVEVEX0FMR09SSVRITSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9FVlAsIDAsIEVWUF9SX1VOU1VQUE9SVEVEX01BU0tfQUxHT1JJVEhNKSwgIlVOU1VQUE9SVEVEX01BU0tfQUxHT1JJVEhNIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VWUCwgMCwgRVZQX1JfVU5TVVBQT1JURURfTUFTS19QQVJBTUVURVIpLCAiVU5TVVBQT1JURURfTUFTS19QQVJBTUVURVIifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRVZQLCAwLCBFVlBfUl9VTlNVUFBPUlRFRF9QVUJMSUNfS0VZX1RZUEUpLCAiVU5TVVBQT1JURURfUFVCTElDX0tFWV9UWVBFIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX0VWUCwgMCwgRVZQX1JfVU5TVVBQT1JURURfU0lHTkFUVVJFX1RZUEUpLCAiVU5TVVBQT1JURURfU0lHTkFUVVJFX1RZUEUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfRVZQLCAwLCBFVlBfUl9YOTMxX1VOU1VQUE9SVEVEKSwgIlg5MzFfVU5TVVBQT1JURUQifSwKKyAgezAsIE5VTEx9LAorfTsKZGlmZiAtLWdpdCBhL2NyeXB0by9ldnAvZXhhbXBsZV9zaWduLmMgYi9jcnlwdG8vZXZwL2V4YW1wbGVfc2lnbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYmUxOTQKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vZXZwL2V4YW1wbGVfc2lnbi5jCkBAIC0wLDAgKzEsMTk4IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTQsIEdvb2dsZSBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2RpZ2VzdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yc2EuaD4KKworCisvKiBrRXhhbXBsZVJTQUtleURFUiBpcyBhbiBSU0EgcHJpdmF0ZSBrZXkgaW4gQVNOLjEsIERFUiBmb3JtYXQuIE9mIGNvdXJzZSwgeW91CisgKiBzaG91bGQgbmV2ZXIgdXNlIHRoaXMga2V5IGFueXdoZXJlIGJ1dCBpbiBhbiBleGFtcGxlLiAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0V4YW1wbGVSU0FLZXlERVJbXSA9IHsKKyAgICAweDMwLCAweDgyLCAweDAyLCAweDVjLCAweDAyLCAweDAxLCAweDAwLCAweDAyLCAweDgxLCAweDgxLCAweDAwLCAweGY4LAorICAgIDB4YjgsIDB4NmMsIDB4ODMsIDB4YjQsIDB4YmMsIDB4ZDksIDB4YTgsIDB4NTcsIDB4YzAsIDB4YTUsIDB4YjQsIDB4NTksCisgICAgMHg3NiwgMHg4YywgMHg1NCwgMHgxZCwgMHg3OSwgMHhlYiwgMHgyMiwgMHg1MiwgMHgwNCwgMHg3ZSwgMHhkMywgMHgzNywKKyAgICAweGViLCAweDQxLCAweGZkLCAweDgzLCAweGY5LCAweGYwLCAweGE2LCAweDg1LCAweDE1LCAweDM0LCAweDc1LCAweDcxLAorICAgIDB4NWEsIDB4ODQsIDB4YTgsIDB4M2MsIDB4ZDIsIDB4ZWYsIDB4NWEsIDB4NGUsIDB4ZDMsIDB4ZGUsIDB4OTcsIDB4OGEsCisgICAgMHhkZCwgMHhmZiwgMHhiYiwgMHhjZiwgMHgwYSwgMHhhYSwgMHg4NiwgMHg5MiwgMHhiZSwgMHhiOCwgMHg1MCwgMHhlNCwKKyAgICAweGNkLCAweDZmLCAweDgwLCAweDMzLCAweDMwLCAweDc2LCAweDEzLCAweDhmLCAweGNhLCAweDdiLCAweGRjLCAweGVjLAorICAgIDB4NWEsIDB4Y2EsIDB4NjMsIDB4YzcsIDB4MDMsIDB4MjUsIDB4ZWYsIDB4YTgsIDB4OGEsIDB4ODMsIDB4NTgsIDB4NzYsCisgICAgMHgyMCwgMHhmYSwgMHgxNiwgMHg3NywgMHhkNywgMHg3OSwgMHg5MiwgMHg2MywgMHgwMSwgMHg0OCwgMHgxYSwgMHhkOCwKKyAgICAweDdiLCAweDY3LCAweGYxLCAweDUyLCAweDU1LCAweDQ5LCAweDRlLCAweGQ2LCAweDZlLCAweDRhLCAweDVjLCAweGQ3LAorICAgIDB4N2EsIDB4MzcsIDB4MzYsIDB4MGMsIDB4ZGUsIDB4ZGQsIDB4OGYsIDB4NDQsIDB4ZTgsIDB4YzIsIDB4YTcsIDB4MmMsCisgICAgMHgyYiwgMHhiNSwgMHhhZiwgMHg2NCwgMHg0YiwgMHg2MSwgMHgwNywgMHgwMiwgMHgwMywgMHgwMSwgMHgwMCwgMHgwMSwKKyAgICAweDAyLCAweDgxLCAweDgwLCAweDc0LCAweDg4LCAweDY0LCAweDNmLCAweDY5LCAweDQ1LCAweDNhLCAweDZkLCAweGM3LAorICAgIDB4N2YsIDB4YjksIDB4YTMsIDB4YzAsIDB4NmUsIDB4ZWMsIDB4ZGMsIDB4ZDQsIDB4NWEsIDB4YjUsIDB4MzIsIDB4ODUsCisgICAgMHg1ZiwgMHgxOSwgMHhkNCwgMHhmOCwgMHhkNCwgMHgzZiwgMHgzYywgMHhmYSwgMHhjMiwgMHhmNiwgMHg1ZiwgMHhlZSwKKyAgICAweGU2LCAweGJhLCAweDg3LCAweDc0LCAweDJlLCAweGM3LCAweDBjLCAweGQ0LCAweDQyLCAweGI4LCAweDY2LCAweDg1LAorICAgIDB4OWMsIDB4N2IsIDB4MjQsIDB4NjEsIDB4YWEsIDB4MTYsIDB4MTEsIDB4ZjYsIDB4YjUsIDB4YjYsIDB4YTQsIDB4MGEsCisgICAgMHhjOSwgMHg1NSwgMHgyZSwgMHg4MSwgMHhhNSwgMHg0NywgMHg2MSwgMHhjYiwgMHgyNSwgMHg4ZiwgMHhjMiwgMHgxNSwKKyAgICAweDdiLCAweDBlLCAweDdjLCAweDM2LCAweDlmLCAweDNhLCAweGRhLCAweDU4LCAweDg2LCAweDFjLCAweDViLCAweDgzLAorICAgIDB4NzksIDB4ZTYsIDB4MmIsIDB4Y2MsIDB4ZTYsIDB4ZmEsIDB4MmMsIDB4NjEsIDB4ZjIsIDB4NzgsIDB4ODAsIDB4MWIsCisgICAgMHhlMiwgMHhmMywgMHg5ZCwgMHgzOSwgMHgyYiwgMHg2NSwgMHg1NywgMHg5MSwgMHgzZCwgMHg3MSwgMHg5OSwgMHg3MywKKyAgICAweGE1LCAweGMyLCAweDc5LCAweDIwLCAweDhjLCAweDA3LCAweDRmLCAweGU1LCAweGI0LCAweDYwLCAweDFmLCAweDk5LAorICAgIDB4YTIsIDB4YjEsIDB4NGYsIDB4MGMsIDB4ZWYsIDB4YmMsIDB4NTksIDB4NTMsIDB4MDAsIDB4N2QsIDB4YjEsIDB4MDIsCisgICAgMHg0MSwgMHgwMCwgMHhmYywgMHg3ZSwgMHgyMywgMHg2NSwgMHg3MCwgMHhmOCwgMHhjZSwgMHhkMywgMHg0MCwgMHg0MSwKKyAgICAweDgwLCAweDZhLCAweDFkLCAweDAxLCAweGQ2LCAweDAxLCAweGZmLCAweGI2LCAweDFiLCAweDNkLCAweDNkLCAweDU5LAorICAgIDB4MDksIDB4MzMsIDB4NzksIDB4YzAsIDB4NGYsIDB4ZGUsIDB4OTYsIDB4MjcsIDB4NGIsIDB4MTgsIDB4YzYsIDB4ZDksCisgICAgMHg3OCwgMHhmMSwgMHhmNCwgMHgzNSwgMHg0NiwgMHhlOSwgMHg3YywgMHg0MiwgMHg3YSwgMHg1ZCwgMHg5ZiwgMHhlZiwKKyAgICAweDU0LCAweGI4LCAweGY3LCAweDlmLCAweGM0LCAweDMzLCAweDZjLCAweGYzLCAweDhjLCAweDMyLCAweDQ2LCAweDg3LAorICAgIDB4NjcsIDB4MzAsIDB4N2IsIDB4YTcsIDB4YWMsIDB4ZTMsIDB4MDIsIDB4NDEsIDB4MDAsIDB4ZmMsIDB4MmMsIDB4ZGYsCisgICAgMHgwYywgMHgwZCwgMHg4OCwgMHhmNSwgMHhiMSwgMHg5MiwgMHhhOCwgMHg5MywgMHg0NywgMHg2MywgMHg1NSwgMHhmNSwKKyAgICAweGNhLCAweDU4LCAweDQzLCAweGJhLCAweDFjLCAweGU1LCAweDllLCAweGI2LCAweDk1LCAweDA1LCAweGNkLCAweGI1LAorICAgIDB4ODIsIDB4ZGYsIDB4ZWIsIDB4MDQsIDB4NTMsIDB4OWQsIDB4YmQsIDB4YzIsIDB4MzgsIDB4MTYsIDB4YjMsIDB4NjIsCisgICAgMHhkZCwgMHhhMSwgMHg0NiwgMHhkYiwgMHg2ZCwgMHg5NywgMHg5MywgMHg5ZiwgMHg4YSwgMHhjMywgMHg5YiwgMHg2NCwKKyAgICAweDdlLCAweDQyLCAweGUzLCAweDMyLCAweDU3LCAweDE5LCAweDFiLCAweGQ1LCAweDZlLCAweDg1LCAweGZhLCAweGI4LAorICAgIDB4OGQsIDB4MDIsIDB4NDEsIDB4MDAsIDB4YmMsIDB4M2QsIDB4ZGUsIDB4NmQsIDB4ZDYsIDB4OTcsIDB4ZTgsIDB4YmEsCisgICAgMHg5ZSwgMHg4MSwgMHgzNywgMHgxNywgMHhlNSwgMHhhMCwgMHg2NCwgMHhjOSwgMHgwMCwgMHhiNywgMHhlNywgMHhmZSwKKyAgICAweGY0LCAweDI5LCAweGQ5LCAweDJlLCAweDQzLCAweDZiLCAweDE5LCAweDIwLCAweGJkLCAweDk5LCAweDc1LCAweGU3LAorICAgIDB4NzYsIDB4ZjgsIDB4ZDMsIDB4YWUsIDB4YWYsIDB4N2UsIDB4YjgsIDB4ZWIsIDB4ODEsIDB4ZjQsIDB4OWQsIDB4ZmUsCisgICAgMHgwNywgMHgyYiwgMHgwYiwgMHg2MywgMHgwYiwgMHg1YSwgMHg1NSwgMHg5MCwgMHg3MSwgMHg3ZCwgMHhmMSwgMHhkYiwKKyAgICAweGQ5LCAweGIxLCAweDQxLCAweDQxLCAweDY4LCAweDJmLCAweDRlLCAweDM5LCAweDAyLCAweDQwLCAweDVhLCAweDM0LAorICAgIDB4NjYsIDB4ZDgsIDB4ZjUsIDB4ZTIsIDB4N2YsIDB4MTgsIDB4YjUsIDB4MDAsIDB4NmUsIDB4MjYsIDB4ODQsIDB4MjcsCisgICAgMHgxNCwgMHg5MywgMHhmYiwgMHhmYywgMHhjNiwgMHgwZiwgMHg1ZSwgMHgyNywgMHhlNiwgMHhlMSwgMHhlOSwgMHhjMCwKKyAgICAweDhhLCAweGU0LCAweDM0LCAweGRhLCAweGU5LCAweGEyLCAweDRiLCAweDczLCAweGJjLCAweDhjLCAweGI5LCAweGJhLAorICAgIDB4MTMsIDB4NmMsIDB4N2EsIDB4MmIsIDB4NTEsIDB4ODQsIDB4YTMsIDB4NGEsIDB4ZTAsIDB4MzAsIDB4MTAsIDB4MDYsCisgICAgMHg3ZSwgMHhlZCwgMHgxNywgMHg1YSwgMHgxNCwgMHgwMCwgMHhjOSwgMHhlZiwgMHg4NSwgMHhlYSwgMHg1MiwgMHgyYywKKyAgICAweGJjLCAweDY1LCAweDAyLCAweDQwLCAweDUxLCAweGUzLCAweGYyLCAweDgzLCAweDE5LCAweDliLCAweGM0LCAweDFlLAorICAgIDB4MmYsIDB4NTAsIDB4M2QsIDB4ZGYsIDB4NWEsIDB4YTIsIDB4MTgsIDB4Y2EsIDB4NWYsIDB4MmUsIDB4NDksIDB4YWYsCisgICAgMHg2ZiwgMHhjYywgMHhmYSwgMHg2NSwgMHg3NywgMHg5NCwgMHhiNSwgMHhhMSwgMHgwYSwgMHhhOSwgMHhkMSwgMHg4YSwKKyAgICAweDM5LCAweDM3LCAweGY0LCAweDBiLCAweGEwLCAweGQ3LCAweDgyLCAweDI3LCAweDVlLCAweGFlLCAweDE3LCAweDE3LAorICAgIDB4YTEsIDB4MWUsIDB4NTQsIDB4MzQsIDB4YmYsIDB4NmUsIDB4YzQsIDB4OGUsIDB4OTksIDB4NWQsIDB4MDgsIDB4ZjEsCisgICAgMHgyZCwgMHg4NiwgMHg5ZCwgMHhhNSwgMHgyMCwgMHgxYiwgMHhlNSwgMHhkZiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGtNc2dbXSA9IHsxLCAyLCAzLCA0fTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1NpZ25hdHVyZVtdID0geworICAgIDB4YTUsIDB4ZjAsIDB4OGEsIDB4NDcsIDB4NWQsIDB4M2MsIDB4YjMsIDB4Y2MsIDB4YTksIDB4NzksIDB4YWYsIDB4NGQsCisgICAgMHg4YywgMHhhZSwgMHg0YywgMHgxNCwgMHhlZiwgMHhjMiwgMHgwYiwgMHgzNCwgMHgzNiwgMHhkZSwgMHhmNCwgMHgzZSwKKyAgICAweDNkLCAweGJiLCAweDRhLCAweDYwLCAweDVjLCAweGM4LCAweDkxLCAweDI4LCAweGRhLCAweGZiLCAweDdlLCAweDA0LAorICAgIDB4OTYsIDB4N2UsIDB4NjMsIDB4MTMsIDB4OTAsIDB4Y2UsIDB4YjksIDB4YjQsIDB4NjIsIDB4N2EsIDB4ZmQsIDB4MDksCisgICAgMHgzZCwgMHhjNywgMHg2NywgMHg3OCwgMHg1NCwgMHgwNCwgMHhlYiwgMHg1MiwgMHg2MiwgMHg2ZSwgMHgyNCwgMHg2NywKKyAgICAweGI0LCAweDQwLCAweGZjLCAweDU3LCAweDYyLCAweGM2LCAweGYxLCAweDY3LCAweGMxLCAweDk3LCAweDhmLCAweDZhLAorICAgIDB4YTgsIDB4YWUsIDB4NDQsIDB4NDYsIDB4NWUsIDB4YWIsIDB4NjcsIDB4MTcsIDB4NTMsIDB4MTksIDB4M2EsIDB4ZGEsCisgICAgMHg1YSwgMHhjOCwgMHgxNiwgMHgzZSwgMHg4NiwgMHhkNSwgMHhjNSwgMHg3MSwgMHgyZiwgMHhmYywgMHgyMywgMHg0OCwKKyAgICAweGQ5LCAweDBiLCAweDEzLCAweGRkLCAweDdiLCAweDVhLCAweDI1LCAweDc5LCAweGVmLCAweGE1LCAweDdiLCAweDA0LAorICAgIDB4ZWQsIDB4NDQsIDB4ZjYsIDB4MTgsIDB4NTUsIDB4ZTQsIDB4MGEsIDB4ZTksIDB4NTcsIDB4NzksIDB4NWQsIDB4ZDcsCisgICAgMHg1NSwgMHhhNywgMHhhYiwgMHg0NSwgMHgwMiwgMHg5NywgMHg2MCwgMHg0MiwKK307CisKKworaW50IGV4YW1wbGVfRVZQX0RpZ2VzdFNpZ25Jbml0KCkgeworICBpbnQgcmV0ID0gMDsKKyAgRVZQX1BLRVkgKnBrZXkgPSBOVUxMOworICBSU0EgKnJzYSA9IE5VTEw7CisgIGNvbnN0IHVpbnQ4X3QgKmRlcnAgPSBrRXhhbXBsZVJTQUtleURFUjsKKyAgdWludDhfdCAqc2lnID0gTlVMTDsKKyAgc2l6ZV90IHNpZ19sZW47CisgIEVWUF9NRF9DVFggbWRfY3R4OworCisgIEVWUF9NRF9DVFhfaW5pdCgmbWRfY3R4KTsKKworICBpZiAoIWQyaV9SU0FQcml2YXRlS2V5KCZyc2EsICZkZXJwLCBzaXplb2Yoa0V4YW1wbGVSU0FLZXlERVIpKSkgeworICAgIGdvdG8gb3V0OworICB9CisKKyAgc2lnX2xlbiA9IFJTQV9zaXplKHJzYSk7CisKKyAgcGtleSA9IEVWUF9QS0VZX25ldygpOworICBzaWcgPSBtYWxsb2Moc2lnX2xlbik7CisgIGlmIChwa2V5ID09IE5VTEwgfHwKKyAgICAgIHNpZyA9PSBOVUxMIHx8CisgICAgICAhRVZQX1BLRVlfc2V0MV9SU0EocGtleSwgcnNhKSB8fAorICAgICAgRVZQX0RpZ2VzdFNpZ25Jbml0KCZtZF9jdHgsIE5VTEwsIEVWUF9zaGEyNTYoKSwgTlVMTCwgcGtleSkgIT0gMSB8fAorICAgICAgRVZQX0RpZ2VzdFNpZ25VcGRhdGUoJm1kX2N0eCwga01zZywgc2l6ZW9mKGtNc2cpKSAhPSAxIHx8CisgICAgICBFVlBfRGlnZXN0U2lnbkZpbmFsKCZtZF9jdHgsIHNpZywgJnNpZ19sZW4pICE9IDEpIHsKKyAgICBnb3RvIG91dDsKKyAgfQorICByZXQgPSAxOworCitvdXQ6CisgIGlmICghcmV0KSB7CisgICAgQklPX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOworICB9CisKKyAgRVZQX01EX0NUWF9jbGVhbnVwKCZtZF9jdHgpOworICBpZiAocGtleSkgeworICAgIEVWUF9QS0VZX2ZyZWUocGtleSk7CisgIH0KKyAgaWYgKHJzYSkgeworICAgIFJTQV9mcmVlKHJzYSk7CisgIH0KKyAgaWYgKHNpZykgeworICAgIGZyZWUoc2lnKTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK2ludCBleGFtcGxlX0VWUF9EaWdlc3RWZXJpZnlJbml0KCkgeworICBpbnQgcmV0ID0gMDsKKyAgRVZQX1BLRVkgKnBrZXkgPSBOVUxMOworICBSU0EgKnJzYSA9IE5VTEw7CisgIGNvbnN0IHVpbnQ4X3QgKmRlcnAgPSBrRXhhbXBsZVJTQUtleURFUjsKKyAgRVZQX01EX0NUWCBtZF9jdHg7CisKKyAgRVZQX01EX0NUWF9pbml0KCZtZF9jdHgpOworCisgIGlmICghZDJpX1JTQVByaXZhdGVLZXkoJnJzYSwgJmRlcnAsIHNpemVvZihrRXhhbXBsZVJTQUtleURFUikpKSB7CisgICAgZ290byBvdXQ7CisgIH0KKworICBwa2V5ID0gRVZQX1BLRVlfbmV3KCk7CisgIGlmIChwa2V5ID09IE5VTEwgfHwKKyAgICAgICFFVlBfUEtFWV9zZXQxX1JTQShwa2V5LCByc2EpIHx8CisgICAgICBFVlBfRGlnZXN0VmVyaWZ5SW5pdCgmbWRfY3R4LCBOVUxMLCBFVlBfc2hhMjU2KCksIE5VTEwsIHBrZXkpICE9IDEgfHwKKyAgICAgIEVWUF9EaWdlc3RWZXJpZnlVcGRhdGUoJm1kX2N0eCwga01zZywgc2l6ZW9mKGtNc2cpKSAhPSAxIHx8CisgICAgICBFVlBfRGlnZXN0VmVyaWZ5RmluYWwoJm1kX2N0eCwga1NpZ25hdHVyZSwgc2l6ZW9mKGtTaWduYXR1cmUpKSAhPSAxKSB7CisgICAgZ290byBvdXQ7CisgIH0KKyAgcmV0ID0gMTsKKworb3V0OgorICBpZiAoIXJldCkgeworICAgIEJJT19wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKyAgfQorCisgIEVWUF9NRF9DVFhfY2xlYW51cCgmbWRfY3R4KTsKKyAgaWYgKHBrZXkpIHsKKyAgICBFVlBfUEtFWV9mcmVlKHBrZXkpOworICB9CisgIGlmIChyc2EpIHsKKyAgICBSU0FfZnJlZShyc2EpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworaW50IG1haW4oKSB7CisgIGlmICghZXhhbXBsZV9FVlBfRGlnZXN0U2lnbkluaXQoKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRVZQX0RpZ2VzdFNpZ25Jbml0IGZhaWxlZFxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpZiAoIWV4YW1wbGVfRVZQX0RpZ2VzdFZlcmlmeUluaXQoKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRVZQX0RpZ2VzdFZlcmlmeUluaXQgZmFpbGVkXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHByaW50ZigiUEFTU1xuIik7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2V2cC9pbnRlcm5hbC5oIGIvY3J5cHRvL2V2cC9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZjIwNmUKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vZXZwL2ludGVybmFsLmgKQEAgLTAsMCArMSwyMzMgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpZm5kZWYgT1BFTlNTTF9IRUFERVJfRVZQX0lOVEVSTkFMX0gKKyNkZWZpbmUgT1BFTlNTTF9IRUFERVJfRVZQX0lOVEVSTkFMX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvYmFzZS5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogVGhlc2UgdmFsdWVzIGFyZSBmbGFncyBmb3IgRVZQX1BLRVlfQVNOMV9NRVRIT0QuZmxhZ3MuICovCisjZGVmaW5lIEFTTjFfUEtFWV9BTElBUyAweDEKKyNkZWZpbmUgQVNOMV9QS0VZX0RZTkFNSUMgMHgyCisjZGVmaW5lIEFTTjFfUEtFWV9TSUdQQVJBTV9OVUxMIDB4NAorCitzdHJ1Y3QgZXZwX3BrZXlfYXNuMV9tZXRob2Rfc3QgeworICBpbnQgcGtleV9pZDsKKyAgaW50IHBrZXlfYmFzZV9pZDsKKyAgdW5zaWduZWQgbG9uZyBwa2V5X2ZsYWdzOworCisgIGNoYXIgKnBlbV9zdHI7CisgIGNoYXIgKmluZm87CisKKyAgaW50ICgqcHViX2RlY29kZSkoRVZQX1BLRVkgKnBrLCBYNTA5X1BVQktFWSAqcHViKTsKKyAgaW50ICgqcHViX2VuY29kZSkoWDUwOV9QVUJLRVkgKnB1YiwgY29uc3QgRVZQX1BLRVkgKnBrKTsKKyAgaW50ICgqcHViX2NtcCkoY29uc3QgRVZQX1BLRVkgKmEsIGNvbnN0IEVWUF9QS0VZICpiKTsKKyAgaW50ICgqcHViX3ByaW50KShCSU8gKm91dCwgY29uc3QgRVZQX1BLRVkgKnBrZXksIGludCBpbmRlbnQsIEFTTjFfUENUWCAqcGN0eCk7CisKKyAgaW50ICgqcHJpdl9kZWNvZGUpKEVWUF9QS0VZICpwaywgUEtDUzhfUFJJVl9LRVlfSU5GTyAqcDhpbmYpOworICBpbnQgKCpwcml2X2VuY29kZSkoUEtDUzhfUFJJVl9LRVlfSU5GTyAqcDgsIGNvbnN0IEVWUF9QS0VZICpwayk7CisgIGludCAoKnByaXZfcHJpbnQpKEJJTyAqb3V0LCBjb25zdCBFVlBfUEtFWSAqcGtleSwgaW50IGluZGVudCwKKyAgICAgICAgICAgICAgICAgICAgQVNOMV9QQ1RYICpwY3R4KTsKKworICBpbnQgKCpwa2V5X3NpemUpKGNvbnN0IEVWUF9QS0VZICpwayk7CisgIGludCAoKnBrZXlfYml0cykoY29uc3QgRVZQX1BLRVkgKnBrKTsKKworICBpbnQgKCpwYXJhbV9kZWNvZGUpKEVWUF9QS0VZICpwa2V5LCBjb25zdCB1bnNpZ25lZCBjaGFyICoqcGRlciwgaW50IGRlcmxlbik7CisgIGludCAoKnBhcmFtX2VuY29kZSkoY29uc3QgRVZQX1BLRVkgKnBrZXksIHVuc2lnbmVkIGNoYXIgKipwZGVyKTsKKyAgaW50ICgqcGFyYW1fbWlzc2luZykoY29uc3QgRVZQX1BLRVkgKnBrKTsKKyAgaW50ICgqcGFyYW1fY29weSkoRVZQX1BLRVkgKnRvLCBjb25zdCBFVlBfUEtFWSAqZnJvbSk7CisgIGludCAoKnBhcmFtX2NtcCkoY29uc3QgRVZQX1BLRVkgKmEsIGNvbnN0IEVWUF9QS0VZICpiKTsKKyAgaW50ICgqcGFyYW1fcHJpbnQpKEJJTyAqb3V0LCBjb25zdCBFVlBfUEtFWSAqcGtleSwgaW50IGluZGVudCwKKyAgICAgICAgICAgICAgICAgICAgIEFTTjFfUENUWCAqcGN0eCk7CisgIGludCAoKnNpZ19wcmludCkoQklPICpvdXQsIGNvbnN0IFg1MDlfQUxHT1IgKnNpZ2FsZywgY29uc3QgQVNOMV9TVFJJTkcgKnNpZywKKyAgICAgICAgICAgICAgICAgICBpbnQgaW5kZW50LCBBU04xX1BDVFggKnBjdHgpOworCisKKyAgdm9pZCAoKnBrZXlfZnJlZSkoRVZQX1BLRVkgKnBrZXkpOworICBpbnQgKCpwa2V5X2N0cmwpKEVWUF9QS0VZICpwa2V5LCBpbnQgb3AsIGxvbmcgYXJnMSwgdm9pZCAqYXJnMik7CisKKyAgLyogTGVnYWN5IGZ1bmN0aW9ucyBmb3Igb2xkIFBFTSAqLworCisgIGludCAoKm9sZF9wcml2X2RlY29kZSkoRVZQX1BLRVkgKnBrZXksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXJsZW4pOworICBpbnQgKCpvbGRfcHJpdl9lbmNvZGUpKGNvbnN0IEVWUF9QS0VZICpwa2V5LCB1bnNpZ25lZCBjaGFyICoqcGRlcik7CisgIC8qIEN1c3RvbSBBU04xIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gKi8KKyAgaW50ICgqaXRlbV92ZXJpZnkpKEVWUF9NRF9DVFggKmN0eCwgY29uc3QgQVNOMV9JVEVNICppdCwgdm9pZCAqYXNuLAorICAgICAgICAgICAgICAgICAgICAgWDUwOV9BTEdPUiAqYSwgQVNOMV9CSVRfU1RSSU5HICpzaWcsIEVWUF9QS0VZICpwa2V5KTsKKyAgaW50ICgqaXRlbV9zaWduKShFVlBfTURfQ1RYICpjdHgsIGNvbnN0IEFTTjFfSVRFTSAqaXQsIHZvaWQgKmFzbiwKKyAgICAgICAgICAgICAgICAgICBYNTA5X0FMR09SICphbGcxLCBYNTA5X0FMR09SICphbGcyLCBBU04xX0JJVF9TVFJJTkcgKnNpZyk7CisKK30gLyogRVZQX1BLRVlfQVNOMV9NRVRIT0QgKi87CisKKwordHlwZWRlZiBpbnQgRVZQX1BLRVlfZ2VuX2NiKEVWUF9QS0VZX0NUWCAqY3R4KTsKKworI2RlZmluZSBFVlBfUEtFWV9PUF9VTkRFRklORUQgMAorI2RlZmluZSBFVlBfUEtFWV9PUF9QQVJBTUdFTiAoMSA8PCAxKQorI2RlZmluZSBFVlBfUEtFWV9PUF9LRVlHRU4gKDEgPDwgMikKKyNkZWZpbmUgRVZQX1BLRVlfT1BfU0lHTiAoMSA8PCAzKQorI2RlZmluZSBFVlBfUEtFWV9PUF9WRVJJRlkgKDEgPDwgNCkKKyNkZWZpbmUgRVZQX1BLRVlfT1BfVkVSSUZZUkVDT1ZFUiAoMSA8PCA1KQorI2RlZmluZSBFVlBfUEtFWV9PUF9TSUdOQ1RYICgxIDw8IDYpCisjZGVmaW5lIEVWUF9QS0VZX09QX1ZFUklGWUNUWCAoMSA8PCA3KQorI2RlZmluZSBFVlBfUEtFWV9PUF9FTkNSWVBUICgxIDw8IDgpCisjZGVmaW5lIEVWUF9QS0VZX09QX0RFQ1JZUFQgKDEgPDwgOSkKKyNkZWZpbmUgRVZQX1BLRVlfT1BfREVSSVZFICgxIDw8IDEwKQorCisjZGVmaW5lIEVWUF9QS0VZX09QX1RZUEVfU0lHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEVWUF9QS0VZX09QX1NJR04gfCBFVlBfUEtFWV9PUF9WRVJJRlkgfCBFVlBfUEtFWV9PUF9WRVJJRllSRUNPVkVSIHwgXAorICAgRVZQX1BLRVlfT1BfU0lHTkNUWCB8IEVWUF9QS0VZX09QX1ZFUklGWUNUWCkKKworI2RlZmluZSBFVlBfUEtFWV9PUF9UWVBFX0NSWVBUIChFVlBfUEtFWV9PUF9FTkNSWVBUIHwgRVZQX1BLRVlfT1BfREVDUllQVCkKKworI2RlZmluZSBFVlBfUEtFWV9PUF9UWVBFX05PR0VOIFwKKyAgKEVWUF9QS0VZX09QX1NJRyB8IEVWUF9QS0VZX09QX0NSWVBUIHwgRVZQX1BLRVlfT1BfREVSSVZFKQorCisjZGVmaW5lIEVWUF9QS0VZX09QX1RZUEVfR0VOIChFVlBfUEtFWV9PUF9QQVJBTUdFTiB8IEVWUF9QS0VZX09QX0tFWUdFTikKKworI2RlZmluZSBFVlBfUEtFWV9DVFJMX01EIDEKKyNkZWZpbmUgRVZQX1BLRVlfQ1RSTF9HRVRfTUQgMgorI2RlZmluZSBFVlBfUEtFWV9DVFJMX1JTQV9QQURESU5HIChFVlBfUEtFWV9BTEdfQ1RSTCArIDEpCisjZGVmaW5lIEVWUF9QS0VZX0NUUkxfR0VUX1JTQV9QQURESU5HIChFVlBfUEtFWV9BTEdfQ1RSTCArIDIpCisjZGVmaW5lIEVWUF9QS0VZX0NUUkxfUlNBX1BTU19TQUxUTEVOIChFVlBfUEtFWV9BTEdfQ1RSTCArIDMpCisjZGVmaW5lIEVWUF9QS0VZX0NUUkxfR0VUX1JTQV9QU1NfU0FMVExFTiAoRVZQX1BLRVlfQUxHX0NUUkwgKyA0KQorI2RlZmluZSBFVlBfUEtFWV9DVFJMX1JTQV9LRVlHRU5fQklUUyAoRVZQX1BLRVlfQUxHX0NUUkwgKyA1KQorI2RlZmluZSBFVlBfUEtFWV9DVFJMX1JTQV9LRVlHRU5fUFVCRVhQCShFVlBfUEtFWV9BTEdfQ1RSTCArIDYpCisjZGVmaW5lIEVWUF9QS0VZX0NUUkxfUlNBX09BRVBfTUQgKEVWUF9QS0VZX0FMR19DVFJMICsgNykKKyNkZWZpbmUgRVZQX1BLRVlfQ1RSTF9HRVRfUlNBX09BRVBfTUQgKEVWUF9QS0VZX0FMR19DVFJMICsgOCkKKyNkZWZpbmUgRVZQX1BLRVlfQ1RSTF9SU0FfTUdGMV9NRCAoRVZQX1BLRVlfQUxHX0NUUkwgKyA5KQorI2RlZmluZSBFVlBfUEtFWV9DVFJMX0dFVF9SU0FfTUdGMV9NRCAoRVZQX1BLRVlfQUxHX0NUUkwgKyAxMCkKKyNkZWZpbmUgRVZQX1BLRVlfQ1RSTF9SU0FfT0FFUF9MQUJFTCAoRVZQX1BLRVlfQUxHX0NUUkwgKyAxMSkKKyNkZWZpbmUgRVZQX1BLRVlfQ1RSTF9HRVRfUlNBX09BRVBfTEFCRUwgKEVWUF9QS0VZX0FMR19DVFJMICsgMTIpCisKK3N0cnVjdCBldnBfcGtleV9jdHhfc3QgeworICAvKiBNZXRob2QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb3BlcmF0aW9uICovCisgIGNvbnN0IEVWUF9QS0VZX01FVEhPRCAqcG1ldGg7CisgIC8qIEVuZ2luZSB0aGF0IGltcGxlbWVudHMgdGhpcyBtZXRob2Qgb3IgTlVMTCBpZiBidWlsdGluICovCisgIEVOR0lORSAqZW5naW5lOworICAvKiBLZXk6IG1heSBiZSBOVUxMICovCisgIEVWUF9QS0VZICpwa2V5OworICAvKiBQZWVyIGtleSBmb3Iga2V5IGFncmVlbWVudCwgbWF5IGJlIE5VTEwgKi8KKyAgRVZQX1BLRVkgKnBlZXJrZXk7CisgIC8qIG9wZXJhdGlvbiBjb250YWlucyBvbmUgb2YgdGhlIHxFVlBfUEtFWV9PUF8qfCB2YWx1ZXMuICovCisgIGludCBvcGVyYXRpb247CisgIC8qIEFsZ29yaXRobSBzcGVjaWZpYyBkYXRhICovCisgIHZvaWQgKmRhdGE7CisgIC8qIEFwcGxpY2F0aW9uIHNwZWNpZmljIGRhdGEgKi8KKyAgdm9pZCAqYXBwX2RhdGE7Cit9IC8qIEVWUF9QS0VZX0NUWCAqLzsKKworLyogRVZQX1BLRVlfRkxBR19BVVRPQVJHTEVOIGNhdXNlcyB3cmFwcGVyIGZ1bmN0aW9ucyB0byBhdXRvbWF0aWNhbGx5IGNoZWNrIHRoZQorICogYXJndW1lbnQgbGVuZ3RoIHRvIHZhcmlvdXMgZnVuY3Rpb25zIChzaWduaW5nLCBkZWNyeXB0aW5nIGV0YykgaXMgZXF1YWwgdG8KKyAqIHRoZSB2YWx1ZSBvZiB8RVZQX1BLRVlfc2l6ZXwuICovCisjZGVmaW5lIEVWUF9QS0VZX0ZMQUdfQVVUT0FSR0xFTiAyCisKK3N0cnVjdCBldnBfcGtleV9tZXRob2Rfc3QgeworICBpbnQgcGtleV9pZDsKKyAgaW50IGZsYWdzOworCisgIGludCAoKmluaXQpKEVWUF9QS0VZX0NUWCAqY3R4KTsKKyAgaW50ICgqY29weSkoRVZQX1BLRVlfQ1RYICpkc3QsIEVWUF9QS0VZX0NUWCAqc3JjKTsKKyAgdm9pZCAoKmNsZWFudXApKEVWUF9QS0VZX0NUWCAqY3R4KTsKKworICBpbnQgKCpwYXJhbWdlbl9pbml0KShFVlBfUEtFWV9DVFggKmN0eCk7CisgIGludCAoKnBhcmFtZ2VuKShFVlBfUEtFWV9DVFggKmN0eCwgRVZQX1BLRVkgKnBrZXkpOworCisgIGludCAoKmtleWdlbl9pbml0KShFVlBfUEtFWV9DVFggKmN0eCk7CisgIGludCAoKmtleWdlbikoRVZQX1BLRVlfQ1RYICpjdHgsIEVWUF9QS0VZICpwa2V5KTsKKworICBpbnQgKCpzaWduX2luaXQpKEVWUF9QS0VZX0NUWCAqY3R4KTsKKyAgaW50ICgqc2lnbikoRVZQX1BLRVlfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKnNpZywgc2l6ZV90ICpzaWdsZW4sCisgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRicywgc2l6ZV90IHRic2xlbik7CisKKyAgaW50ICgqdmVyaWZ5X2luaXQpKEVWUF9QS0VZX0NUWCAqY3R4KTsKKyAgaW50ICgqdmVyaWZ5KShFVlBfUEtFWV9DVFggKmN0eCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2lnLCBzaXplX3Qgc2lnbGVuLAorICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRicywgc2l6ZV90IHRic2xlbik7CisKKyAgaW50ICgqc2lnbmN0eF9pbml0KShFVlBfUEtFWV9DVFggKmN0eCwgRVZQX01EX0NUWCAqbWN0eCk7CisgIGludCAoKnNpZ25jdHgpKEVWUF9QS0VZX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpzaWcsIHNpemVfdCAqc2lnbGVuLAorICAgICAgICAgICAgICAgICBFVlBfTURfQ1RYICptY3R4KTsKKworICBpbnQgKCp2ZXJpZnljdHhfaW5pdCkoRVZQX1BLRVlfQ1RYICpjdHgsIEVWUF9NRF9DVFggKm1jdHgpOworICBpbnQgKCp2ZXJpZnljdHgpKEVWUF9QS0VZX0NUWCAqY3R4LCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaWcsIGludCBzaWdsZW4sCisgICAgICAgICAgICAgICAgICAgRVZQX01EX0NUWCAqbWN0eCk7CisKKyAgaW50ICgqZW5jcnlwdF9pbml0KShFVlBfUEtFWV9DVFggKmN0eCk7CisgIGludCAoKmVuY3J5cHQpKEVWUF9QS0VZX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpvdXQsIHNpemVfdCAqb3V0bGVuLAorICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgc2l6ZV90IGlubGVuKTsKKworICBpbnQgKCpkZWNyeXB0X2luaXQpKEVWUF9QS0VZX0NUWCAqY3R4KTsKKyAgaW50ICgqZGVjcnlwdCkoRVZQX1BLRVlfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwgc2l6ZV90ICpvdXRsZW4sCisgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCBzaXplX3QgaW5sZW4pOworCisgIGludCAoKmRlcml2ZV9pbml0KShFVlBfUEtFWV9DVFggKmN0eCk7CisgIGludCAoKmRlcml2ZSkoRVZQX1BLRVlfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKmtleSwgc2l6ZV90ICprZXlsZW4pOworCisgIGludCAoKmN0cmwpKEVWUF9QS0VZX0NUWCAqY3R4LCBpbnQgdHlwZSwgaW50IHAxLCB2b2lkICpwMik7CisgIGludCAoKmN0cmxfc3RyKShFVlBfUEtFWV9DVFggKmN0eCwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqdmFsdWUpOworfSAvKiBFVlBfUEtFWV9NRVRIT0QgKi87CisKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9ICAvKiBleHRlcm4gQyAqLworI2VuZGlmCisKKyNlbmRpZiAgLyogT1BFTlNTTF9IRUFERVJfRVZQX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2NyeXB0by9ldnAvcF9lYy5jIGIvY3J5cHRvL2V2cC9wX2VjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMwNWU2ZQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9ldnAvcF9lYy5jCkBAIC0wLDAgKzEsNDIzIEBACisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwNi4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYnVmLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9kaWdlc3QuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2VjLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lY19rZXkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2VjZGguaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2VjZHNhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqLmg+CisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIi4uL2VjL2ludGVybmFsLmgiCisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAvKiBLZXkgYW5kIHBhcmFtZ2VuIGdyb3VwICovCisgIEVDX0dST1VQICpnZW5fZ3JvdXA7CisgIC8qIG1lc3NhZ2UgZGlnZXN0ICovCisgIGNvbnN0IEVWUF9NRCAqbWQ7CisgIC8qIER1cGxpY2F0ZSBrZXkgaWYgY3VzdG9tIGNvZmFjdG9yIG5lZWRlZCAqLworICBFQ19LRVkgKmNvX2tleTsKKyAgLyogQ29mYWN0b3IgbW9kZSAqLworICBzaWduZWQgY2hhciBjb2ZhY3Rvcl9tb2RlOworICAvKiBLREYgKGlmIGFueSkgdG8gdXNlIGZvciBFQ0RIICovCisgIGNoYXIga2RmX3R5cGU7CisgIC8qIE1lc3NhZ2UgZGlnZXN0IHRvIHVzZSBmb3Iga2V5IGRlcml2YXRpb24gKi8KKyAgY29uc3QgRVZQX01EICprZGZfbWQ7CisgIC8qIFVzZXIga2V5IG1hdGVyaWFsICovCisgIHVuc2lnbmVkIGNoYXIgKmtkZl91a207CisgIHNpemVfdCBrZGZfdWttbGVuOworICAvKiBLREYgb3V0cHV0IGxlbmd0aCAqLworICBzaXplX3Qga2RmX291dGxlbjsKK30gRUNfUEtFWV9DVFg7CisKKworc3RhdGljIGludCBwa2V5X2VjX2luaXQoRVZQX1BLRVlfQ1RYICpjdHgpIHsKKyAgRUNfUEtFWV9DVFggKmRjdHg7CisgIGRjdHggPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoRUNfUEtFWV9DVFgpKTsKKyAgaWYgKCFkY3R4KSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgbWVtc2V0KGRjdHgsIDAsIHNpemVvZihFQ19QS0VZX0NUWCkpOworICBkY3R4LT5jb2ZhY3Rvcl9tb2RlID0gLTE7CisgIGRjdHgtPmtkZl90eXBlID0gRVZQX1BLRVlfRUNESF9LREZfTk9ORTsKKworICBjdHgtPmRhdGEgPSBkY3R4OworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHBrZXlfZWNfY29weShFVlBfUEtFWV9DVFggKmRzdCwgRVZQX1BLRVlfQ1RYICpzcmMpIHsKKyAgRUNfUEtFWV9DVFggKmRjdHgsICpzY3R4OworICBpZiAoIXBrZXlfZWNfaW5pdChkc3QpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgc2N0eCA9IHNyYy0+ZGF0YTsKKyAgZGN0eCA9IGRzdC0+ZGF0YTsKKworICBpZiAoc2N0eC0+Z2VuX2dyb3VwKSB7CisgICAgZGN0eC0+Z2VuX2dyb3VwID0gRUNfR1JPVVBfZHVwKHNjdHgtPmdlbl9ncm91cCk7CisgICAgaWYgKCFkY3R4LT5nZW5fZ3JvdXApIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICBkY3R4LT5tZCA9IHNjdHgtPm1kOworCisgIGlmIChzY3R4LT5jb19rZXkpIHsKKyAgICBkY3R4LT5jb19rZXkgPSBFQ19LRVlfZHVwKHNjdHgtPmNvX2tleSk7CisgICAgaWYgKCFkY3R4LT5jb19rZXkpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICBkY3R4LT5rZGZfdHlwZSA9IHNjdHgtPmtkZl90eXBlOworICBkY3R4LT5rZGZfbWQgPSBzY3R4LT5rZGZfbWQ7CisgIGRjdHgtPmtkZl9vdXRsZW4gPSBzY3R4LT5rZGZfb3V0bGVuOworICBpZiAoc2N0eC0+a2RmX3VrbSkgeworICAgIGRjdHgtPmtkZl91a20gPSBCVUZfbWVtZHVwKHNjdHgtPmtkZl91a20sIHNjdHgtPmtkZl91a21sZW4pOworICAgIGlmICghZGN0eC0+a2RmX3VrbSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9IGVsc2UgeworICAgIGRjdHgtPmtkZl91a20gPSBOVUxMOworICB9CisgIGRjdHgtPmtkZl91a21sZW4gPSBzY3R4LT5rZGZfdWttbGVuOworICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgcGtleV9lY19jbGVhbnVwKEVWUF9QS0VZX0NUWCAqY3R4KSB7CisgIEVDX1BLRVlfQ1RYICpkY3R4ID0gY3R4LT5kYXRhOworICBpZiAoIWRjdHgpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoZGN0eC0+Z2VuX2dyb3VwKSB7CisgICAgRUNfR1JPVVBfZnJlZShkY3R4LT5nZW5fZ3JvdXApOworICB9CisgIGlmIChkY3R4LT5jb19rZXkpIHsKKyAgICBFQ19LRVlfZnJlZShkY3R4LT5jb19rZXkpOworICB9CisgIGlmIChkY3R4LT5rZGZfdWttKSB7CisgICAgT1BFTlNTTF9mcmVlKGRjdHgtPmtkZl91a20pOworICB9CisgIE9QRU5TU0xfZnJlZShkY3R4KTsKK30KKworc3RhdGljIGludCBwa2V5X2VjX3NpZ24oRVZQX1BLRVlfQ1RYICpjdHgsIHVpbnQ4X3QgKnNpZywgc2l6ZV90ICpzaWdsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICp0YnMsIHNpemVfdCB0YnNsZW4pIHsKKyAgaW50IHJldCwgdHlwZTsKKyAgdW5zaWduZWQgaW50IHNsdG1wOworICBFQ19QS0VZX0NUWCAqZGN0eCA9IGN0eC0+ZGF0YTsKKyAgRUNfS0VZICplYyA9IGN0eC0+cGtleS0+cGtleS5lYzsKKworICBpZiAoIXNpZykgeworICAgICpzaWdsZW4gPSBFQ0RTQV9zaXplKGVjKTsKKyAgICByZXR1cm4gMTsKKyAgfSBlbHNlIGlmICgqc2lnbGVuIDwgKHNpemVfdClFQ0RTQV9zaXplKGVjKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcGtleV9lY19zaWduLCBFVlBfUl9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHR5cGUgPSBOSURfc2hhMTsKKyAgaWYgKGRjdHgtPm1kKSB7CisgICAgdHlwZSA9IEVWUF9NRF90eXBlKGRjdHgtPm1kKTsKKyAgfQorCisgIHJldCA9IEVDRFNBX3NpZ24odHlwZSwgdGJzLCB0YnNsZW4sIHNpZywgJnNsdG1wLCBlYyk7CisKKyAgaWYgKHJldCA8PSAwKSB7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICAqc2lnbGVuID0gKHNpemVfdClzbHRtcDsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcGtleV9lY192ZXJpZnkoRVZQX1BLRVlfQ1RYICpjdHgsIGNvbnN0IHVpbnQ4X3QgKnNpZywgc2l6ZV90IHNpZ2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqdGJzLCBzaXplX3QgdGJzbGVuKSB7CisgIGludCB0eXBlOworICBFQ19QS0VZX0NUWCAqZGN0eCA9IGN0eC0+ZGF0YTsKKyAgRUNfS0VZICplYyA9IGN0eC0+cGtleS0+cGtleS5lYzsKKworICB0eXBlID0gTklEX3NoYTE7CisgIGlmIChkY3R4LT5tZCkgeworICAgIHR5cGUgPSBFVlBfTURfdHlwZShkY3R4LT5tZCk7CisgIH0KKworICByZXR1cm4gRUNEU0FfdmVyaWZ5KHR5cGUsIHRicywgdGJzbGVuLCBzaWcsIHNpZ2xlbiwgZWMpOworfQorCitzdGF0aWMgaW50IHBrZXlfZWNfZGVyaXZlKEVWUF9QS0VZX0NUWCAqY3R4LCB1aW50OF90ICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqa2V5bGVuKSB7CisgIGludCByZXQ7CisgIHNpemVfdCBvdXRsZW47CisgIGNvbnN0IEVDX1BPSU5UICpwdWJrZXkgPSBOVUxMOworICBFQ19LRVkgKmVja2V5OworICBFQ19QS0VZX0NUWCAqZGN0eCA9IGN0eC0+ZGF0YTsKKworICBpZiAoIWN0eC0+cGtleSB8fCAhY3R4LT5wZWVya2V5KSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBwa2V5X2VjX2Rlcml2ZSwgRVZQX1JfS0VZU19OT1RfU0VUKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGVja2V5ID0gZGN0eC0+Y29fa2V5ID8gZGN0eC0+Y29fa2V5IDogY3R4LT5wa2V5LT5wa2V5LmVjOworCisgIGlmICgha2V5KSB7CisgICAgY29uc3QgRUNfR1JPVVAgKmdyb3VwOworICAgIGdyb3VwID0gRUNfS0VZX2dldDBfZ3JvdXAoZWNrZXkpOworICAgICprZXlsZW4gPSAoRUNfR1JPVVBfZ2V0X2RlZ3JlZShncm91cCkgKyA3KSAvIDg7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcHVia2V5ID0gRUNfS0VZX2dldDBfcHVibGljX2tleShjdHgtPnBlZXJrZXktPnBrZXkuZWMpOworCisgIC8qIE5COiB1bmxpa2UgUEtDUyMzIERILCBpZiAqb3V0bGVuIGlzIGxlc3MgdGhhbiBtYXhpbXVtIHNpemUgdGhpcyBpcworICAgKiBub3QgYW4gZXJyb3IsIHRoZSByZXN1bHQgaXMgdHJ1bmNhdGVkLiAqLworCisgIG91dGxlbiA9ICprZXlsZW47CisKKyAgcmV0ID0gRUNESF9jb21wdXRlX2tleShrZXksIG91dGxlbiwgcHVia2V5LCBlY2tleSwgMCk7CisgIGlmIChyZXQgPCAwKSB7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICAqa2V5bGVuID0gcmV0OworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwa2V5X2VjX2tkZl9kZXJpdmUoRVZQX1BLRVlfQ1RYICpjdHgsIHVpbnQ4X3QgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqa2V5bGVuKSB7CisgIEVDX1BLRVlfQ1RYICpkY3R4ID0gY3R4LT5kYXRhOworICB1aW50OF90ICprdG1wID0gTlVMTDsKKyAgc2l6ZV90IGt0bXBsZW47CisgIGludCBydiA9IDA7CisKKyAgaWYgKGRjdHgtPmtkZl90eXBlID09IEVWUF9QS0VZX0VDREhfS0RGX05PTkUpIHsKKyAgICByZXR1cm4gcGtleV9lY19kZXJpdmUoY3R4LCBrZXksIGtleWxlbik7CisgIH0KKyAgaWYgKCFrZXkpIHsKKyAgICAqa2V5bGVuID0gZGN0eC0+a2RmX291dGxlbjsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoKmtleWxlbiAhPSBkY3R4LT5rZGZfb3V0bGVuIHx8CisgICAgICAhcGtleV9lY19kZXJpdmUoY3R4LCBOVUxMLCAma3RtcGxlbikpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBrdG1wID0gT1BFTlNTTF9tYWxsb2Moa3RtcGxlbik7CisgIGlmICgha3RtcCkgeworICAgIHJldHVybiAwOworICB9CisgIGlmICghcGtleV9lY19kZXJpdmUoY3R4LCBrdG1wLCAma3RtcGxlbikpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmICghRUNESF9LREZfWDlfNjIoa2V5LCAqa2V5bGVuLCBrdG1wLCBrdG1wbGVuLCBkY3R4LT5rZGZfdWttLAorICAgICAgICAgICAgICAgICAgICAgIGRjdHgtPmtkZl91a21sZW4sIGRjdHgtPmtkZl9tZCkpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorICBydiA9IDE7CisKK2VycjoKKyAgaWYgKGt0bXApIHsKKyAgICBPUEVOU1NMX2NsZWFuc2Uoa3RtcCwga3RtcGxlbik7CisgICAgT1BFTlNTTF9mcmVlKGt0bXApOworICB9CisgIHJldHVybiBydjsKK30KKworc3RhdGljIGludCBwa2V5X2VjX2N0cmwoRVZQX1BLRVlfQ1RYICpjdHgsIGludCB0eXBlLCBpbnQgcDEsIHZvaWQgKnAyKSB7CisgIEVDX1BLRVlfQ1RYICpkY3R4ID0gY3R4LT5kYXRhOworICBFQ19HUk9VUCAqZ3JvdXA7CisKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBFVlBfUEtFWV9DVFJMX0VDX1BBUkFNR0VOX0NVUlZFX05JRDoKKyAgICAgIGdyb3VwID0gRUNfR1JPVVBfbmV3X2J5X2N1cnZlX25hbWUocDEpOworICAgICAgaWYgKGdyb3VwID09IE5VTEwpIHsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBwa2V5X2VjX2N0cmwsIEVWUF9SX0lOVkFMSURfQ1VSVkUpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGlmIChkY3R4LT5nZW5fZ3JvdXApCisgICAgICAgIEVDX0dST1VQX2ZyZWUoZGN0eC0+Z2VuX2dyb3VwKTsKKyAgICAgIGRjdHgtPmdlbl9ncm91cCA9IGdyb3VwOworICAgICAgcmV0dXJuIDE7CisKKyAgICBjYXNlIEVWUF9QS0VZX0NUUkxfRUNfS0RGX1RZUEU6CisgICAgICBpZiAocDEgPT0gLTIpCisgICAgICAgIHJldHVybiBkY3R4LT5rZGZfdHlwZTsKKyAgICAgIGlmIChwMSAhPSBFVlBfUEtFWV9FQ0RIX0tERl9OT05FICYmIHAxICE9IEVWUF9QS0VZX0VDREhfS0RGX1g5XzYyKQorICAgICAgICByZXR1cm4gLTI7CisgICAgICBkY3R4LT5rZGZfdHlwZSA9IHAxOworICAgICAgcmV0dXJuIDE7CisKKyAgICBjYXNlIEVWUF9QS0VZX0NUUkxfRUNfS0RGX01EOgorICAgICAgZGN0eC0+a2RmX21kID0gcDI7CisgICAgICByZXR1cm4gMTsKKworICAgIGNhc2UgRVZQX1BLRVlfQ1RSTF9HRVRfRUNfS0RGX01EOgorICAgICAgKihjb25zdCBFVlBfTUQgKiopcDIgPSBkY3R4LT5rZGZfbWQ7CisgICAgICByZXR1cm4gMTsKKworICAgIGNhc2UgRVZQX1BLRVlfQ1RSTF9FQ19LREZfT1VUTEVOOgorICAgICAgaWYgKHAxIDw9IDApCisgICAgICAgIHJldHVybiAtMjsKKyAgICAgIGRjdHgtPmtkZl9vdXRsZW4gPSAoc2l6ZV90KXAxOworICAgICAgcmV0dXJuIDE7CisKKyAgICBjYXNlIEVWUF9QS0VZX0NUUkxfR0VUX0VDX0tERl9PVVRMRU46CisgICAgICAqKGludCAqKXAyID0gZGN0eC0+a2RmX291dGxlbjsKKyAgICAgIHJldHVybiAxOworCisgICAgY2FzZSBFVlBfUEtFWV9DVFJMX0VDX0tERl9VS006CisgICAgICBpZiAoZGN0eC0+a2RmX3VrbSkKKyAgICAgICAgT1BFTlNTTF9mcmVlKGRjdHgtPmtkZl91a20pOworICAgICAgZGN0eC0+a2RmX3VrbSA9IHAyOworICAgICAgaWYgKHAyKQorICAgICAgICBkY3R4LT5rZGZfdWttbGVuID0gcDE7CisgICAgICBlbHNlCisgICAgICAgIGRjdHgtPmtkZl91a21sZW4gPSAwOworICAgICAgcmV0dXJuIDE7CisKKyAgICBjYXNlIEVWUF9QS0VZX0NUUkxfR0VUX0VDX0tERl9VS006CisgICAgICAqKHVuc2lnbmVkIGNoYXIgKiopcDIgPSBkY3R4LT5rZGZfdWttOworICAgICAgcmV0dXJuIGRjdHgtPmtkZl91a21sZW47CisKKyAgICBjYXNlIEVWUF9QS0VZX0NUUkxfTUQ6CisgICAgICBpZiAoRVZQX01EX3R5cGUoKGNvbnN0IEVWUF9NRCAqKXAyKSAhPSBOSURfc2hhMSAmJgorICAgICAgICAgIEVWUF9NRF90eXBlKChjb25zdCBFVlBfTUQgKilwMikgIT0gTklEX2VjZHNhX3dpdGhfU0hBMSAmJgorICAgICAgICAgIEVWUF9NRF90eXBlKChjb25zdCBFVlBfTUQgKilwMikgIT0gTklEX3NoYTIyNCAmJgorICAgICAgICAgIEVWUF9NRF90eXBlKChjb25zdCBFVlBfTUQgKilwMikgIT0gTklEX3NoYTI1NiAmJgorICAgICAgICAgIEVWUF9NRF90eXBlKChjb25zdCBFVlBfTUQgKilwMikgIT0gTklEX3NoYTM4NCAmJgorICAgICAgICAgIEVWUF9NRF90eXBlKChjb25zdCBFVlBfTUQgKilwMikgIT0gTklEX3NoYTUxMikgeworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIHBrZXlfZWNfY3RybCwgRVZQX1JfSU5WQUxJRF9ESUdFU1RfVFlQRSk7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgZGN0eC0+bWQgPSBwMjsKKyAgICAgIHJldHVybiAxOworCisgICAgY2FzZSBFVlBfUEtFWV9DVFJMX0dFVF9NRDoKKyAgICAgICooY29uc3QgRVZQX01EICoqKXAyID0gZGN0eC0+bWQ7CisgICAgICByZXR1cm4gMTsKKworICAgIGNhc2UgRVZQX1BLRVlfQ1RSTF9QRUVSX0tFWToKKyAgICAvKiBEZWZhdWx0IGJlaGF2aW91ciBpcyBPSyAqLworICAgIGNhc2UgRVZQX1BLRVlfQ1RSTF9ESUdFU1RJTklUOgorICAgICAgcmV0dXJuIDE7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIC0yOworICB9Cit9CisKK3N0YXRpYyBpbnQgcGtleV9lY19wYXJhbWdlbihFVlBfUEtFWV9DVFggKmN0eCwgRVZQX1BLRVkgKnBrZXkpIHsKKyAgRUNfS0VZICplYyA9IE5VTEw7CisgIEVDX1BLRVlfQ1RYICpkY3R4ID0gY3R4LT5kYXRhOworICBpbnQgcmV0ID0gMDsKKworICBpZiAoZGN0eC0+Z2VuX2dyb3VwID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIHBrZXlfZWNfcGFyYW1nZW4sIEVWUF9SX05PX1BBUkFNRVRFUlNfU0VUKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBlYyA9IEVDX0tFWV9uZXcoKTsKKyAgaWYgKCFlYykgeworICAgIHJldHVybiAwOworICB9CisgIHJldCA9IEVDX0tFWV9zZXRfZ3JvdXAoZWMsIGRjdHgtPmdlbl9ncm91cCk7CisgIGlmIChyZXQpIHsKKyAgICBFVlBfUEtFWV9hc3NpZ25fRUNfS0VZKHBrZXksIGVjKTsKKyAgfSBlbHNlIHsKKyAgICBFQ19LRVlfZnJlZShlYyk7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwa2V5X2VjX2tleWdlbihFVlBfUEtFWV9DVFggKmN0eCwgRVZQX1BLRVkgKnBrZXkpIHsKKyAgRUNfS0VZICplYyA9IE5VTEw7CisgIEVDX1BLRVlfQ1RYICpkY3R4ID0gY3R4LT5kYXRhOworICBpZiAoY3R4LT5wa2V5ID09IE5VTEwgJiYgZGN0eC0+Z2VuX2dyb3VwID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIHBrZXlfZWNfa2V5Z2VuLCBFVlBfUl9OT19QQVJBTUVURVJTX1NFVCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZWMgPSBFQ19LRVlfbmV3KCk7CisgIGlmICghZWMpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBFVlBfUEtFWV9hc3NpZ25fRUNfS0VZKHBrZXksIGVjKTsKKyAgaWYgKGN0eC0+cGtleSkgeworICAgIC8qIE5vdGU6IGlmIGVycm9yIHJldHVybiwgcGtleSBpcyBmcmVlZCBieSBwYXJlbnQgcm91dGluZSAqLworICAgIGlmICghRVZQX1BLRVlfY29weV9wYXJhbWV0ZXJzKHBrZXksIGN0eC0+cGtleSkpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoIUVDX0tFWV9zZXRfZ3JvdXAoZWMsIGRjdHgtPmdlbl9ncm91cCkpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICByZXR1cm4gRUNfS0VZX2dlbmVyYXRlX2tleShwa2V5LT5wa2V5LmVjKTsKK30KKworY29uc3QgRVZQX1BLRVlfTUVUSE9EIGVjX3BrZXlfbWV0aCA9IHsKKyAgICBFVlBfUEtFWV9FQywgICAgICAgICAgICAwIC8qIGZsYWdzICovLCAgICAgICAgcGtleV9lY19pbml0LAorICAgIHBrZXlfZWNfY29weSwgICAgICAgICAgIHBrZXlfZWNfY2xlYW51cCwgICAgICAwIC8qIHBhcmFtZ2VuX2luaXQgKi8sCisgICAgcGtleV9lY19wYXJhbWdlbiwgICAgICAgMCAvKiBrZXlnZW5faW5pdCAqLywgIHBrZXlfZWNfa2V5Z2VuLAorICAgIDAgLyogc2lnbl9pbml0ICovLCAgICAgIHBrZXlfZWNfc2lnbiwgICAgICAgICAwIC8qIHZlcmlmeV9pbml0ICovLAorICAgIHBrZXlfZWNfdmVyaWZ5LCAgICAgICAgIDAgLyogc2lnbmN0eF9pbml0ICovLCAwIC8qIHNpZ25jdHggKi8sCisgICAgMCAvKiB2ZXJpZnljdHhfaW5pdCAqLywgMCAvKiB2ZXJpZnljdHggKi8sICAgIDAgLyogZW5jcnlwdF9pbml0ICovLAorICAgIDAgLyogZW5jcnlwdCAqLywgICAgICAgIDAgLyogZGVjcnlwdF9pbml0ICovLCAwIC8qIGRlY3J5cHQgKi8sCisgICAgMCAvKiBkZXJpdmVfaW5pdCAqLywgICAgcGtleV9lY19rZGZfZGVyaXZlLCAgIHBrZXlfZWNfY3RybCwKK307CmRpZmYgLS1naXQgYS9jcnlwdG8vZXZwL3BfZWNfYXNuMS5jIGIvY3J5cHRvL2V2cC9wX2VjX2FzbjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGVlYzEzCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2V2cC9wX2VjX2FzbjEuYwpAQCAtMCwwICsxLDU3NyBAQAorLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDYuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZWMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKworI2luY2x1ZGUgImludGVybmFsLmgiCisKKworc3RhdGljIGludCBlY2tleV9wYXJhbTJ0eXBlKGludCAqcHB0eXBlLCB2b2lkICoqcHB2YWwsIEVDX0tFWSAqZWNfa2V5KSB7CisgIGNvbnN0IEVDX0dST1VQICpncm91cDsKKyAgaW50IG5pZDsKKworICBpZiAoZWNfa2V5ID09IE5VTEwgfHwgKGdyb3VwID0gRUNfS0VZX2dldDBfZ3JvdXAoZWNfa2V5KSkgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZWNrZXlfcGFyYW0ydHlwZSwgRVZQX1JfTUlTU0lOR19QQVJBTUVURVJTKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIG5pZCA9IEVDX0dST1VQX2dldF9jdXJ2ZV9uYW1lKGdyb3VwKTsKKyAgaWYgKG5pZCA9PSBOSURfdW5kZWYpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGVja2V5X3BhcmFtMnR5cGUsIEVWUF9SX05PX05JRF9GT1JfQ1VSVkUpOworICAgIHJldHVybiAwOworICB9CisKKyAgKnBwdmFsID0gKHZvaWQqKSBPQkpfbmlkMm9iaihuaWQpOworICAqcHB0eXBlID0gVl9BU04xX09CSkVDVDsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZWNrZXlfcHViX2VuY29kZShYNTA5X1BVQktFWSAqcGssIGNvbnN0IEVWUF9QS0VZICpwa2V5KSB7CisgIEVDX0tFWSAqZWNfa2V5ID0gcGtleS0+cGtleS5lYzsKKyAgdm9pZCAqcHZhbCA9IE5VTEw7CisgIGludCBwdHlwZTsKKyAgdWludDhfdCAqcGVuYyA9IE5VTEwsICpwOworICBpbnQgcGVuY2xlbjsKKworICBpZiAoIWVja2V5X3BhcmFtMnR5cGUoJnB0eXBlLCAmcHZhbCwgZWNfa2V5KSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZWNrZXlfcHViX2VuY29kZSwgRVJSX1JfRUNfTElCKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBwZW5jbGVuID0gaTJvX0VDUHVibGljS2V5KGVjX2tleSwgTlVMTCk7CisgIGlmIChwZW5jbGVuIDw9IDApIHsKKyAgICBnb3RvIGVycjsKKyAgfQorICBwZW5jID0gT1BFTlNTTF9tYWxsb2MocGVuY2xlbik7CisgIGlmICghcGVuYykgeworICAgIGdvdG8gZXJyOworICB9CisgIHAgPSBwZW5jOworICBwZW5jbGVuID0gaTJvX0VDUHVibGljS2V5KGVjX2tleSwgJnApOworICBpZiAocGVuY2xlbiA8PSAwKSB7CisgICAgZ290byBlcnI7CisgIH0KKyAgaWYgKFg1MDlfUFVCS0VZX3NldDBfcGFyYW0ocGssIE9CSl9uaWQyb2JqKEVWUF9QS0VZX0VDKSwgcHR5cGUsIHB2YWwsIHBlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmNsZW4pKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKworZXJyOgorICBpZiAocHR5cGUgPT0gVl9BU04xX09CSkVDVCkgeworICAgIEFTTjFfT0JKRUNUX2ZyZWUocHZhbCk7CisgIH0gZWxzZSB7CisgICAgQVNOMV9TVFJJTkdfZnJlZShwdmFsKTsKKyAgfQorICBpZiAocGVuYykgeworICAgIE9QRU5TU0xfZnJlZShwZW5jKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIEVDX0tFWSAqZWNrZXlfdHlwZTJwYXJhbShpbnQgcHR5cGUsIHZvaWQgKnB2YWwpIHsKKyAgRUNfS0VZICplY2tleSA9IE5VTEw7CisKKyAgaWYgKHB0eXBlID09IFZfQVNOMV9TRVFVRU5DRSkgeworICAgIEFTTjFfU1RSSU5HICpwc3RyID0gcHZhbDsKKyAgICBjb25zdCB1aW50OF90ICpwbSA9IHBzdHItPmRhdGE7CisgICAgaW50IHBtbGVuID0gcHN0ci0+bGVuZ3RoOworCisgICAgZWNrZXkgPSBkMmlfRUNQYXJhbWV0ZXJzKE5VTEwsICZwbSwgcG1sZW4pOworICAgIGlmIChlY2tleSA9PSBOVUxMKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGVja2V5X3R5cGUycGFyYW0sIEVWUF9SX0RFQ09ERV9FUlJPUik7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0gZWxzZSBpZiAocHR5cGUgPT0gVl9BU04xX09CSkVDVCkgeworICAgIEFTTjFfT0JKRUNUICpwb2lkID0gcHZhbDsKKyAgICBFQ19HUk9VUCAqZ3JvdXA7CisKKyAgICAvKiB0eXBlID09IFZfQVNOMV9PQkpFQ1QgPT4gdGhlIHBhcmFtZXRlcnMgYXJlIGdpdmVuCisgICAgICogYnkgYW4gYXNuMSBPSUQgKi8KKyAgICBlY2tleSA9IEVDX0tFWV9uZXcoKTsKKyAgICBpZiAoZWNrZXkgPT0gTlVMTCkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBlY2tleV90eXBlMnBhcmFtLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgZ3JvdXAgPSBFQ19HUk9VUF9uZXdfYnlfY3VydmVfbmFtZShPQkpfb2JqMm5pZChwb2lkKSk7CisgICAgaWYgKGdyb3VwID09IE5VTEwpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBpZiAoRUNfS0VZX3NldF9ncm91cChlY2tleSwgZ3JvdXApID09IDApIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBFQ19HUk9VUF9mcmVlKGdyb3VwKTsKKyAgfSBlbHNlIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGVja2V5X3R5cGUycGFyYW0sIEVWUF9SX0RFQ09ERV9FUlJPUik7CisgICAgZ290byBlcnI7CisgIH0KKworICByZXR1cm4gZWNrZXk7CisKK2VycjoKKyAgaWYgKGVja2V5KSB7CisgICAgRUNfS0VZX2ZyZWUoZWNrZXkpOworICB9CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGVja2V5X3B1Yl9kZWNvZGUoRVZQX1BLRVkgKnBrZXksIFg1MDlfUFVCS0VZICpwdWJrZXkpIHsKKyAgY29uc3QgdWludDhfdCAqcCA9IE5VTEw7CisgIHZvaWQgKnB2YWw7CisgIGludCBwdHlwZSwgcGtsZW47CisgIEVDX0tFWSAqZWNrZXkgPSBOVUxMOworICBYNTA5X0FMR09SICpwYWxnOworCisgIGlmICghWDUwOV9QVUJLRVlfZ2V0MF9wYXJhbShOVUxMLCAmcCwgJnBrbGVuLCAmcGFsZywgcHVia2V5KSkgeworICAgIHJldHVybiAwOworICB9CisgIFg1MDlfQUxHT1JfZ2V0MChOVUxMLCAmcHR5cGUsICZwdmFsLCBwYWxnKTsKKworICBlY2tleSA9IGVja2V5X3R5cGUycGFyYW0ocHR5cGUsIHB2YWwpOworICBpZiAoIWVja2V5KSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBlY2tleV9wdWJfZGVjb2RlLCBFUlJfUl9FQ19MSUIpOworICAgIHJldHVybiAwOworICB9CisKKyAgLyogV2UgaGF2ZSBwYXJhbWV0ZXJzIG5vdyBzZXQgcHVibGljIGtleSAqLworICBpZiAoIW8yaV9FQ1B1YmxpY0tleSgmZWNrZXksICZwLCBwa2xlbikpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGVja2V5X3B1Yl9kZWNvZGUsIEVWUF9SX0RFQ09ERV9FUlJPUik7CisgICAgZ290byBlcnI7CisgIH0KKworICBFVlBfUEtFWV9hc3NpZ25fRUNfS0VZKHBrZXksIGVja2V5KTsKKyAgcmV0dXJuIDE7CisKK2VycjoKKyAgaWYgKGVja2V5KQorICAgIEVDX0tFWV9mcmVlKGVja2V5KTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZWNrZXlfcHViX2NtcChjb25zdCBFVlBfUEtFWSAqYSwgY29uc3QgRVZQX1BLRVkgKmIpIHsKKyAgaW50IHI7CisgIGNvbnN0IEVDX0dST1VQICpncm91cCA9IEVDX0tFWV9nZXQwX2dyb3VwKGItPnBrZXkuZWMpOworICBjb25zdCBFQ19QT0lOVCAqcGEgPSBFQ19LRVlfZ2V0MF9wdWJsaWNfa2V5KGEtPnBrZXkuZWMpLAorICAgICAgICAgICAgICAgICAqcGIgPSBFQ19LRVlfZ2V0MF9wdWJsaWNfa2V5KGItPnBrZXkuZWMpOworICByID0gRUNfUE9JTlRfY21wKGdyb3VwLCBwYSwgcGIsIE5VTEwpOworICBpZiAociA9PSAwKSB7CisgICAgcmV0dXJuIDE7CisgIH0gZWxzZSBpZiAociA9PSAxKSB7CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0yOworICB9Cit9CisKK3N0YXRpYyBpbnQgZWNrZXlfcHJpdl9kZWNvZGUoRVZQX1BLRVkgKnBrZXksIFBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4KSB7CisgIGNvbnN0IHVpbnQ4X3QgKnAgPSBOVUxMOworICB2b2lkICpwdmFsOworICBpbnQgcHR5cGUsIHBrbGVuOworICBFQ19LRVkgKmVja2V5ID0gTlVMTDsKKyAgWDUwOV9BTEdPUiAqcGFsZzsKKworICBpZiAoIVBLQ1M4X3BrZXlfZ2V0MChOVUxMLCAmcCwgJnBrbGVuLCAmcGFsZywgcDgpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgWDUwOV9BTEdPUl9nZXQwKE5VTEwsICZwdHlwZSwgJnB2YWwsIHBhbGcpOworCisgIGVja2V5ID0gZWNrZXlfdHlwZTJwYXJhbShwdHlwZSwgcHZhbCk7CisKKyAgaWYgKCFlY2tleSkKKyAgICBnb3RvIGVjbGliZXJyOworCisgIC8qIFdlIGhhdmUgcGFyYW1ldGVycyBub3cgc2V0IHByaXZhdGUga2V5ICovCisgIGlmICghZDJpX0VDUHJpdmF0ZUtleSgmZWNrZXksICZwLCBwa2xlbikpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGVja2V5X3ByaXZfZGVjb2RlLCBFVlBfUl9ERUNPREVfRVJST1IpOworICAgIGdvdG8gZWNlcnI7CisgIH0KKworICAvKiBjYWxjdWxhdGUgcHVibGljIGtleSAoaWYgbmVjZXNzYXJ5KSAqLworICBpZiAoRUNfS0VZX2dldDBfcHVibGljX2tleShlY2tleSkgPT0gTlVMTCkgeworICAgIGNvbnN0IEJJR05VTSAqcHJpdl9rZXk7CisgICAgY29uc3QgRUNfR1JPVVAgKmdyb3VwOworICAgIEVDX1BPSU5UICpwdWJfa2V5OworICAgIC8qIHRoZSBwdWJsaWMga2V5IHdhcyBub3QgaW5jbHVkZWQgaW4gdGhlIFNFQzEgcHJpdmF0ZQorICAgICAqIGtleSA9PiBjYWxjdWxhdGUgdGhlIHB1YmxpYyBrZXkgKi8KKyAgICBncm91cCA9IEVDX0tFWV9nZXQwX2dyb3VwKGVja2V5KTsKKyAgICBwdWJfa2V5ID0gRUNfUE9JTlRfbmV3KGdyb3VwKTsKKyAgICBpZiAocHViX2tleSA9PSBOVUxMKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGVja2V5X3ByaXZfZGVjb2RlLCBFUlJfUl9FQ19MSUIpOworICAgICAgZ290byBlY2xpYmVycjsKKyAgICB9CisgICAgaWYgKCFFQ19QT0lOVF9jb3B5KHB1Yl9rZXksIEVDX0dST1VQX2dldDBfZ2VuZXJhdG9yKGdyb3VwKSkpIHsKKyAgICAgIEVDX1BPSU5UX2ZyZWUocHViX2tleSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGVja2V5X3ByaXZfZGVjb2RlLCBFUlJfUl9FQ19MSUIpOworICAgICAgZ290byBlY2xpYmVycjsKKyAgICB9CisgICAgcHJpdl9rZXkgPSBFQ19LRVlfZ2V0MF9wcml2YXRlX2tleShlY2tleSk7CisgICAgaWYgKCFFQ19QT0lOVF9tdWwoZ3JvdXAsIHB1Yl9rZXksIHByaXZfa2V5LCBOVUxMLCBOVUxMLCBOVUxMKSkgeworICAgICAgRUNfUE9JTlRfZnJlZShwdWJfa2V5KTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZWNrZXlfcHJpdl9kZWNvZGUsIEVSUl9SX0VDX0xJQik7CisgICAgICBnb3RvIGVjbGliZXJyOworICAgIH0KKyAgICBpZiAoRUNfS0VZX3NldF9wdWJsaWNfa2V5KGVja2V5LCBwdWJfa2V5KSA9PSAwKSB7CisgICAgICBFQ19QT0lOVF9mcmVlKHB1Yl9rZXkpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBlY2tleV9wcml2X2RlY29kZSwgRVJSX1JfRUNfTElCKTsKKyAgICAgIGdvdG8gZWNsaWJlcnI7CisgICAgfQorICAgIEVDX1BPSU5UX2ZyZWUocHViX2tleSk7CisgIH0KKworICBFVlBfUEtFWV9hc3NpZ25fRUNfS0VZKHBrZXksIGVja2V5KTsKKyAgcmV0dXJuIDE7CisKK2VjbGliZXJyOgorICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGVja2V5X3ByaXZfZGVjb2RlLCBFUlJfUl9FQ19MSUIpOworZWNlcnI6CisgIGlmIChlY2tleSkKKyAgICBFQ19LRVlfZnJlZShlY2tleSk7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVja2V5X3ByaXZfZW5jb2RlKFBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4LCBjb25zdCBFVlBfUEtFWSAqcGtleSkgeworICBFQ19LRVkgKmVjX2tleTsKKyAgdWludDhfdCAqZXAsICpwOworICBpbnQgZXBsZW4sIHB0eXBlOworICB2b2lkICpwdmFsOworICB1bnNpZ25lZCBpbnQgdG1wX2ZsYWdzLCBvbGRfZmxhZ3M7CisKKyAgZWNfa2V5ID0gcGtleS0+cGtleS5lYzsKKworICBpZiAoIWVja2V5X3BhcmFtMnR5cGUoJnB0eXBlLCAmcHZhbCwgZWNfa2V5KSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZWNrZXlfcHJpdl9lbmNvZGUsIEVWUF9SX0RFQ09ERV9FUlJPUik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiBzZXQgdGhlIHByaXZhdGUga2V5ICovCisKKyAgLyogZG8gbm90IGluY2x1ZGUgdGhlIHBhcmFtZXRlcnMgaW4gdGhlIFNFQzEgcHJpdmF0ZSBrZXkKKyAgICogc2VlIFBLQ1MjMTEgMTIuMTEgKi8KKyAgb2xkX2ZsYWdzID0gRUNfS0VZX2dldF9lbmNfZmxhZ3MoZWNfa2V5KTsKKyAgdG1wX2ZsYWdzID0gb2xkX2ZsYWdzIHwgRUNfUEtFWV9OT19QQVJBTUVURVJTOworICBFQ19LRVlfc2V0X2VuY19mbGFncyhlY19rZXksIHRtcF9mbGFncyk7CisgIGVwbGVuID0gaTJkX0VDUHJpdmF0ZUtleShlY19rZXksIE5VTEwpOworICBpZiAoIWVwbGVuKSB7CisgICAgRUNfS0VZX3NldF9lbmNfZmxhZ3MoZWNfa2V5LCBvbGRfZmxhZ3MpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZWNrZXlfcHJpdl9lbmNvZGUsIEVSUl9SX0VDX0xJQik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZXAgPSAodWludDhfdCAqKU9QRU5TU0xfbWFsbG9jKGVwbGVuKTsKKyAgaWYgKCFlcCkgeworICAgIEVDX0tFWV9zZXRfZW5jX2ZsYWdzKGVjX2tleSwgb2xkX2ZsYWdzKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGVja2V5X3ByaXZfZW5jb2RlLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcCA9IGVwOworICBpZiAoIWkyZF9FQ1ByaXZhdGVLZXkoZWNfa2V5LCAmcCkpIHsKKyAgICBFQ19LRVlfc2V0X2VuY19mbGFncyhlY19rZXksIG9sZF9mbGFncyk7CisgICAgT1BFTlNTTF9mcmVlKGVwKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGVja2V5X3ByaXZfZW5jb2RlLCBFUlJfUl9FQ19MSUIpOworICAgIHJldHVybiAwOworICB9CisgIC8qIHJlc3RvcmUgb2xkIGVuY29kaW5nIGZsYWdzICovCisgIEVDX0tFWV9zZXRfZW5jX2ZsYWdzKGVjX2tleSwgb2xkX2ZsYWdzKTsKKworICBpZiAoIVBLQ1M4X3BrZXlfc2V0MChwOCwgKEFTTjFfT0JKRUNUICopT0JKX25pZDJvYmooTklEX1g5XzYyX2lkX2VjUHVibGljS2V5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgMCwgcHR5cGUsIHB2YWwsIGVwLCBlcGxlbikpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGludF9lY19zaXplKGNvbnN0IEVWUF9QS0VZICpwa2V5KSB7CisgIHJldHVybiBFQ0RTQV9zaXplKHBrZXktPnBrZXkuZWMpOworfQorCitzdGF0aWMgaW50IGVjX2JpdHMoY29uc3QgRVZQX1BLRVkgKnBrZXkpIHsKKyAgQklHTlVNICpvcmRlciA9IEJOX25ldygpOworICBjb25zdCBFQ19HUk9VUCAqZ3JvdXA7CisgIGludCByZXQ7CisKKyAgaWYgKCFvcmRlcikgeworICAgIEVSUl9jbGVhcl9lcnJvcigpOworICAgIHJldHVybiAwOworICB9CisgIGdyb3VwID0gRUNfS0VZX2dldDBfZ3JvdXAocGtleS0+cGtleS5lYyk7CisgIGlmICghRUNfR1JPVVBfZ2V0X29yZGVyKGdyb3VwLCBvcmRlciwgTlVMTCkpIHsKKyAgICBFUlJfY2xlYXJfZXJyb3IoKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldCA9IEJOX251bV9iaXRzKG9yZGVyKTsKKyAgQk5fZnJlZShvcmRlcik7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZWNfbWlzc2luZ19wYXJhbWV0ZXJzKGNvbnN0IEVWUF9QS0VZICpwa2V5KSB7CisgIHJldHVybiBFQ19LRVlfZ2V0MF9ncm91cChwa2V5LT5wa2V5LmVjKSA9PSBOVUxMOworfQorCitzdGF0aWMgaW50IGVjX2NvcHlfcGFyYW1ldGVycyhFVlBfUEtFWSAqdG8sIGNvbnN0IEVWUF9QS0VZICpmcm9tKSB7CisgIEVDX0dST1VQICpncm91cCA9IEVDX0dST1VQX2R1cChFQ19LRVlfZ2V0MF9ncm91cChmcm9tLT5wa2V5LmVjKSk7CisgIGlmIChncm91cCA9PSBOVUxMIHx8CisgICAgICBFQ19LRVlfc2V0X2dyb3VwKHRvLT5wa2V5LmVjLCBncm91cCkgPT0gMCkgeworICAgIHJldHVybiAwOworICB9CisgIEVDX0dST1VQX2ZyZWUoZ3JvdXApOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBlY19jbXBfcGFyYW1ldGVycyhjb25zdCBFVlBfUEtFWSAqYSwgY29uc3QgRVZQX1BLRVkgKmIpIHsKKyAgY29uc3QgRUNfR1JPVVAgKmdyb3VwX2EgPSBFQ19LRVlfZ2V0MF9ncm91cChhLT5wa2V5LmVjKSwKKyAgICAgICAgICAgICAgICAgKmdyb3VwX2IgPSBFQ19LRVlfZ2V0MF9ncm91cChiLT5wa2V5LmVjKTsKKyAgcmV0dXJuIEVDX0dST1VQX2NtcChncm91cF9hLCBncm91cF9iKTsKK30KKworc3RhdGljIHZvaWQgaW50X2VjX2ZyZWUoRVZQX1BLRVkgKnBrZXkpIHsgRUNfS0VZX2ZyZWUocGtleS0+cGtleS5lYyk7IH0KKworc3RhdGljIGludCBkb19FQ19LRVlfcHJpbnQoQklPICpicCwgY29uc3QgRUNfS0VZICp4LCBpbnQgb2ZmLCBpbnQga3R5cGUpIHsKKyAgdWludDhfdCAqYnVmZmVyID0gTlVMTDsKKyAgY29uc3QgY2hhciAqZWNzdHI7CisgIHNpemVfdCBidWZfbGVuID0gMCwgaTsKKyAgaW50IHJldCA9IDAsIHJlYXNvbiA9IEVSUl9SX0JJT19MSUI7CisgIEJJR05VTSAqb3JkZXIgPSBOVUxMOworICBCTl9DVFggKmN0eCA9IE5VTEw7CisgIGNvbnN0IEVDX0dST1VQICpncm91cDsKKyAgY29uc3QgRUNfUE9JTlQgKnB1YmxpY19rZXk7CisgIGNvbnN0IEJJR05VTSAqcHJpdl9rZXk7CisgIHVpbnQ4X3QgKnB1Yl9rZXlfYnl0ZXMgPSBOVUxMOworICBzaXplX3QgcHViX2tleV9ieXRlc19sZW4gPSAwOworCisgIGlmICh4ID09IE5VTEwgfHwgKGdyb3VwID0gRUNfS0VZX2dldDBfZ3JvdXAoeCkpID09IE5VTEwpIHsKKyAgICByZWFzb24gPSBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVI7CisgICAgZ290byBlcnI7CisgIH0KKworICBjdHggPSBCTl9DVFhfbmV3KCk7CisgIGlmIChjdHggPT0gTlVMTCkgeworICAgIHJlYXNvbiA9IEVSUl9SX01BTExPQ19GQUlMVVJFOworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKGt0eXBlID4gMCkgeworICAgIHB1YmxpY19rZXkgPSBFQ19LRVlfZ2V0MF9wdWJsaWNfa2V5KHgpOworICAgIHB1Yl9rZXlfYnl0ZXNfbGVuID0gRUNfUE9JTlRfcG9pbnQyb2N0KAorICAgICAgICBncm91cCwgcHVibGljX2tleSwgRUNfS0VZX2dldF9jb252X2Zvcm0oeCksIE5VTEwsIDAsIGN0eCk7CisgICAgaWYgKHB1Yl9rZXlfYnl0ZXNfbGVuID09IDApIHsKKyAgICAgIHJlYXNvbiA9IEVSUl9SX01BTExPQ19GQUlMVVJFOworICAgICAgZ290byBlcnI7CisgICAgfQorICAgIHB1Yl9rZXlfYnl0ZXMgPSBPUEVOU1NMX21hbGxvYyhwdWJfa2V5X2J5dGVzX2xlbik7CisgICAgaWYgKHB1Yl9rZXlfYnl0ZXMgPT0gTlVMTCkgeworICAgICAgcmVhc29uID0gRVJSX1JfTUFMTE9DX0ZBSUxVUkU7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgcHViX2tleV9ieXRlc19sZW4gPQorICAgICAgICBFQ19QT0lOVF9wb2ludDJvY3QoZ3JvdXAsIHB1YmxpY19rZXksIEVDX0tFWV9nZXRfY29udl9mb3JtKHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHViX2tleV9ieXRlcywgcHViX2tleV9ieXRlc19sZW4sIGN0eCk7CisgICAgaWYgKHB1Yl9rZXlfYnl0ZXNfbGVuID09IDApIHsKKyAgICAgIHJlYXNvbiA9IEVSUl9SX01BTExPQ19GQUlMVVJFOworICAgICAgZ290byBlcnI7CisgICAgfQorICAgIGJ1Zl9sZW4gPSBwdWJfa2V5X2J5dGVzX2xlbjsKKyAgfQorCisgIGlmIChrdHlwZSA9PSAyKSB7CisgICAgcHJpdl9rZXkgPSBFQ19LRVlfZ2V0MF9wcml2YXRlX2tleSh4KTsKKyAgICBpZiAocHJpdl9rZXkgJiYgKGkgPSAoc2l6ZV90KUJOX251bV9ieXRlcyhwcml2X2tleSkpID4gYnVmX2xlbikKKyAgICAgIGJ1Zl9sZW4gPSBpOworICB9IGVsc2UKKyAgICBwcml2X2tleSA9IE5VTEw7CisKKyAgaWYgKGt0eXBlID4gMCkgeworICAgIGJ1Zl9sZW4gKz0gMTA7CisgICAgaWYgKChidWZmZXIgPSBPUEVOU1NMX21hbGxvYyhidWZfbGVuKSkgPT0gTlVMTCkgeworICAgICAgcmVhc29uID0gRVJSX1JfTUFMTE9DX0ZBSUxVUkU7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0KKyAgaWYgKGt0eXBlID09IDIpCisgICAgZWNzdHIgPSAiUHJpdmF0ZS1LZXkiOworICBlbHNlIGlmIChrdHlwZSA9PSAxKQorICAgIGVjc3RyID0gIlB1YmxpYy1LZXkiOworICBlbHNlCisgICAgZWNzdHIgPSAiRUNEU0EtUGFyYW1ldGVycyI7CisKKyAgaWYgKCFCSU9faW5kZW50KGJwLCBvZmYsIDEyOCkpCisgICAgZ290byBlcnI7CisgIGlmICgob3JkZXIgPSBCTl9uZXcoKSkgPT0gTlVMTCkKKyAgICBnb3RvIGVycjsKKyAgaWYgKCFFQ19HUk9VUF9nZXRfb3JkZXIoZ3JvdXAsIG9yZGVyLCBOVUxMKSkKKyAgICBnb3RvIGVycjsKKyAgaWYgKEJJT19wcmludGYoYnAsICIlczogKCVkIGJpdClcbiIsIGVjc3RyLCBCTl9udW1fYml0cyhvcmRlcikpIDw9IDApCisgICAgZ290byBlcnI7CisKKyAgaWYgKChwcml2X2tleSAhPSBOVUxMKSAmJiAhQVNOMV9ibl9wcmludChicCwgInByaXY6IiwgcHJpdl9rZXksIGJ1ZmZlciwgb2ZmKSkKKyAgICBnb3RvIGVycjsKKyAgaWYgKHB1Yl9rZXlfYnl0ZXMgIT0gTlVMTCkgeworICAgIEJJT19oZXhkdW1wKGJwLCBwdWJfa2V5X2J5dGVzLCBwdWJfa2V5X2J5dGVzX2xlbiwgb2ZmKTsKKyAgfQorICAvKiBUT0RPKGZvcmspOiBpbXBsZW1lbnQgKi8KKyAgLyoKKyAgaWYgKCFFQ1BLUGFyYW1ldGVyc19wcmludChicCwgZ3JvdXAsIG9mZikpCisgICAgZ290byBlcnI7ICovCisgIHJldCA9IDE7CisKK2VycjoKKyAgaWYgKCFyZXQpCisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBkb19FQ19LRVlfcHJpbnQsIHJlYXNvbik7CisgIGlmIChwdWJfa2V5X2J5dGVzKQorICAgIE9QRU5TU0xfZnJlZShwdWJfa2V5X2J5dGVzKTsKKyAgaWYgKG9yZGVyKQorICAgIEJOX2ZyZWUob3JkZXIpOworICBpZiAoY3R4KQorICAgIEJOX0NUWF9mcmVlKGN0eCk7CisgIGlmIChidWZmZXIgIT0gTlVMTCkKKyAgICBPUEVOU1NMX2ZyZWUoYnVmZmVyKTsKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBlY2tleV9wYXJhbV9kZWNvZGUoRVZQX1BLRVkgKnBrZXksIGNvbnN0IHVpbnQ4X3QgKipwZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlcmxlbikgeworICBFQ19LRVkgKmVja2V5OworICBpZiAoIShlY2tleSA9IGQyaV9FQ1BhcmFtZXRlcnMoTlVMTCwgcGRlciwgZGVybGVuKSkpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGVja2V5X3BhcmFtX2RlY29kZSwgRVJSX1JfRUNfTElCKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBFVlBfUEtFWV9hc3NpZ25fRUNfS0VZKHBrZXksIGVja2V5KTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZWNrZXlfcGFyYW1fZW5jb2RlKGNvbnN0IEVWUF9QS0VZICpwa2V5LCB1aW50OF90ICoqcGRlcikgeworICByZXR1cm4gaTJkX0VDUGFyYW1ldGVycyhwa2V5LT5wa2V5LmVjLCBwZGVyKTsKK30KKworc3RhdGljIGludCBlY2tleV9wYXJhbV9wcmludChCSU8gKmJwLCBjb25zdCBFVlBfUEtFWSAqcGtleSwgaW50IGluZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOMV9QQ1RYICpjdHgpIHsKKyAgcmV0dXJuIGRvX0VDX0tFWV9wcmludChicCwgcGtleS0+cGtleS5lYywgaW5kZW50LCAwKTsKK30KKworc3RhdGljIGludCBlY2tleV9wdWJfcHJpbnQoQklPICpicCwgY29uc3QgRVZQX1BLRVkgKnBrZXksIGludCBpbmRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBU04xX1BDVFggKmN0eCkgeworICByZXR1cm4gZG9fRUNfS0VZX3ByaW50KGJwLCBwa2V5LT5wa2V5LmVjLCBpbmRlbnQsIDEpOworfQorCisKK3N0YXRpYyBpbnQgZWNrZXlfcHJpdl9wcmludChCSU8gKmJwLCBjb25zdCBFVlBfUEtFWSAqcGtleSwgaW50IGluZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU04xX1BDVFggKmN0eCkgeworICByZXR1cm4gZG9fRUNfS0VZX3ByaW50KGJwLCBwa2V5LT5wa2V5LmVjLCBpbmRlbnQsIDIpOworfQorCitzdGF0aWMgaW50IG9sZF9lY19wcml2X2RlY29kZShFVlBfUEtFWSAqcGtleSwgY29uc3QgdWludDhfdCAqKnBkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVybGVuKSB7CisgIEVDX0tFWSAqZWM7CisgIGlmICghKGVjID0gZDJpX0VDUHJpdmF0ZUtleShOVUxMLCBwZGVyLCBkZXJsZW4pKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgb2xkX2VjX3ByaXZfZGVjb2RlLCBFVlBfUl9ERUNPREVfRVJST1IpOworICAgIHJldHVybiAwOworICB9CisgIEVWUF9QS0VZX2Fzc2lnbl9FQ19LRVkocGtleSwgZWMpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBvbGRfZWNfcHJpdl9lbmNvZGUoY29uc3QgRVZQX1BLRVkgKnBrZXksIHVpbnQ4X3QgKipwZGVyKSB7CisgIHJldHVybiBpMmRfRUNQcml2YXRlS2V5KHBrZXktPnBrZXkuZWMsIHBkZXIpOworfQorCitzdGF0aWMgaW50IGVjX3BrZXlfY3RybChFVlBfUEtFWSAqcGtleSwgaW50IG9wLCBsb25nIGFyZzEsIHZvaWQgKmFyZzIpIHsKKyAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgQVNOMV9QS0VZX0NUUkxfREVGQVVMVF9NRF9OSUQ6CisgICAgICAqKGludCAqKWFyZzIgPSBOSURfc2hhMTsKKyAgICAgIHJldHVybiAyOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAtMjsKKyAgfQorfQorCitjb25zdCBFVlBfUEtFWV9BU04xX01FVEhPRCBlY19hc24xX21ldGggPSB7CisgIEVWUF9QS0VZX0VDLAorICBFVlBfUEtFWV9FQywKKyAgMCwKKyAgIkVDIiwKKyAgIk9wZW5TU0wgRUMgYWxnb3JpdGhtIiwKKworICBlY2tleV9wdWJfZGVjb2RlLAorICBlY2tleV9wdWJfZW5jb2RlLAorICBlY2tleV9wdWJfY21wLAorICBlY2tleV9wdWJfcHJpbnQsCisKKyAgZWNrZXlfcHJpdl9kZWNvZGUsCisgIGVja2V5X3ByaXZfZW5jb2RlLAorICBlY2tleV9wcml2X3ByaW50LAorCisgIGludF9lY19zaXplLAorICBlY19iaXRzLAorCisgIGVja2V5X3BhcmFtX2RlY29kZSwKKyAgZWNrZXlfcGFyYW1fZW5jb2RlLAorICBlY19taXNzaW5nX3BhcmFtZXRlcnMsCisgIGVjX2NvcHlfcGFyYW1ldGVycywKKyAgZWNfY21wX3BhcmFtZXRlcnMsCisgIGVja2V5X3BhcmFtX3ByaW50LAorICAwLAorCisgIGludF9lY19mcmVlLAorICBlY19wa2V5X2N0cmwsCisgIG9sZF9lY19wcml2X2RlY29kZSwKKyAgb2xkX2VjX3ByaXZfZW5jb2RlCit9OwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2V2cC9wX2htYWMuYyBiL2NyeXB0by9ldnAvcF9obWFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1ZGI3YQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9ldnAvcF9obWFjLmMKQEAgLTAsMCArMSwyMTUgQEAKKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDA3LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDA3IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2htYWMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqLmg+CisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgRVZQX01EICptZDsgICAgICAgLyogTUQgZm9yIEhNQUMgdXNlICovCisgIEFTTjFfT0NURVRfU1RSSU5HIGt0bXA7IC8qIFRlbXAgc3RvcmFnZSBmb3Iga2V5ICovCisgIEhNQUNfQ1RYIGN0eDsKK30gSE1BQ19QS0VZX0NUWDsKKworc3RhdGljIGludCBwa2V5X2htYWNfaW5pdChFVlBfUEtFWV9DVFggKmN0eCkgeworICBITUFDX1BLRVlfQ1RYICpoY3R4OworICBoY3R4ID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEhNQUNfUEtFWV9DVFgpKTsKKyAgaWYgKCFoY3R4KSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgbWVtc2V0KGhjdHgsIDAsIHNpemVvZihITUFDX1BLRVlfQ1RYKSk7CisgIGhjdHgtPmt0bXAudHlwZSA9IFZfQVNOMV9PQ1RFVF9TVFJJTkc7CisgIEhNQUNfQ1RYX2luaXQoJmhjdHgtPmN0eCk7CisKKyAgY3R4LT5kYXRhID0gaGN0eDsKKworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwa2V5X2htYWNfY29weShFVlBfUEtFWV9DVFggKmRzdCwgRVZQX1BLRVlfQ1RYICpzcmMpIHsKKyAgSE1BQ19QS0VZX0NUWCAqc2N0eCwgKmRjdHg7CisgIGlmICghcGtleV9obWFjX2luaXQoZHN0KSkgeworICAgIHJldHVybiAwOworICB9CisgIHNjdHggPSBzcmMtPmRhdGE7CisgIGRjdHggPSBkc3QtPmRhdGE7CisgIGRjdHgtPm1kID0gc2N0eC0+bWQ7CisgIEhNQUNfQ1RYX2luaXQoJmRjdHgtPmN0eCk7CisgIGlmICghSE1BQ19DVFhfY29weSgmZGN0eC0+Y3R4LCAmc2N0eC0+Y3R4KSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChzY3R4LT5rdG1wLmRhdGEpIHsKKyAgICBpZiAoIUFTTjFfT0NURVRfU1RSSU5HX3NldCgmZGN0eC0+a3RtcCwgc2N0eC0+a3RtcC5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjdHgtPmt0bXAubGVuZ3RoKSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBwa2V5X2htYWNfY2xlYW51cChFVlBfUEtFWV9DVFggKmN0eCkgeworICBITUFDX1BLRVlfQ1RYICpoY3R4ID0gY3R4LT5kYXRhOworCisgIEhNQUNfQ1RYX2NsZWFudXAoJmhjdHgtPmN0eCk7CisgIGlmIChoY3R4LT5rdG1wLmRhdGEpIHsKKyAgICBpZiAoaGN0eC0+a3RtcC5sZW5ndGgpIHsKKyAgICAgIE9QRU5TU0xfY2xlYW5zZShoY3R4LT5rdG1wLmRhdGEsIGhjdHgtPmt0bXAubGVuZ3RoKTsKKyAgICB9CisgICAgT1BFTlNTTF9mcmVlKGhjdHgtPmt0bXAuZGF0YSk7CisgICAgaGN0eC0+a3RtcC5kYXRhID0gTlVMTDsKKyAgfQorICBPUEVOU1NMX2ZyZWUoaGN0eCk7Cit9CisKK3N0YXRpYyBpbnQgcGtleV9obWFjX2tleWdlbihFVlBfUEtFWV9DVFggKmN0eCwgRVZQX1BLRVkgKnBrZXkpIHsKKyAgQVNOMV9PQ1RFVF9TVFJJTkcgKmhrZXkgPSBOVUxMOworICBITUFDX1BLRVlfQ1RYICpoY3R4ID0gY3R4LT5kYXRhOworCisgIGlmICghaGN0eC0+a3RtcC5kYXRhKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaGtleSA9IEFTTjFfT0NURVRfU1RSSU5HX2R1cCgmaGN0eC0+a3RtcCk7CisgIGlmICghaGtleSkgeworICAgIHJldHVybiAwOworICB9CisgIEVWUF9QS0VZX2Fzc2lnbihwa2V5LCBFVlBfUEtFWV9ITUFDLCBoa2V5KTsKKworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBpbnRfdXBkYXRlKEVWUF9NRF9DVFggKmN0eCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGNvdW50KSB7CisgIEhNQUNfUEtFWV9DVFggKmhjdHggPSBjdHgtPnBjdHgtPmRhdGE7CisgIHJldHVybiBITUFDX1VwZGF0ZSgmaGN0eC0+Y3R4LCBkYXRhLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbnQgaG1hY19zaWduY3R4X2luaXQoRVZQX1BLRVlfQ1RYICpjdHgsIEVWUF9NRF9DVFggKm1jdHgpIHsKKyAgSE1BQ19QS0VZX0NUWCAqaGN0eCA9IGN0eC0+ZGF0YTsKKworICBITUFDX0NUWF9zZXRfZmxhZ3MoJmhjdHgtPmN0eCwgbWN0eC0+ZmxhZ3MgJiB+RVZQX01EX0NUWF9GTEFHX05PX0lOSVQpOworICBFVlBfTURfQ1RYX3NldF9mbGFncyhtY3R4LCBFVlBfTURfQ1RYX0ZMQUdfTk9fSU5JVCk7CisgIG1jdHgtPnVwZGF0ZSA9IGludF91cGRhdGU7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGhtYWNfc2lnbmN0eChFVlBfUEtFWV9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqc2lnLCBzaXplX3QgKnNpZ2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVWUF9NRF9DVFggKm1jdHgpIHsKKyAgdW5zaWduZWQgaW50IGhsZW47CisgIEhNQUNfUEtFWV9DVFggKmhjdHggPSBjdHgtPmRhdGE7CisgIGludCBsID0gRVZQX01EX0NUWF9zaXplKG1jdHgpOworCisgIGlmIChsIDwgMCkgeworICAgIHJldHVybiAwOworICB9CisgICpzaWdsZW4gPSBsOworICBpZiAoIXNpZykgeworICAgIHJldHVybiAxOworICB9CisKKyAgaWYgKCFITUFDX0ZpbmFsKCZoY3R4LT5jdHgsIHNpZywgJmhsZW4pKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgKnNpZ2xlbiA9IChzaXplX3QpaGxlbjsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcGtleV9obWFjX2N0cmwoRVZQX1BLRVlfQ1RYICpjdHgsIGludCB0eXBlLCBpbnQgcDEsIHZvaWQgKnAyKSB7CisgIEhNQUNfUEtFWV9DVFggKmhjdHggPSBjdHgtPmRhdGE7CisgIEFTTjFfT0NURVRfU1RSSU5HICprZXk7CisKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBFVlBfUEtFWV9DVFJMX1NFVF9NQUNfS0VZOgorICAgICAgaWYgKCghcDIgJiYgcDEgPiAwKSB8fCAocDEgPCAtMSkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBpZiAoIUFTTjFfT0NURVRfU1RSSU5HX3NldCgmaGN0eC0+a3RtcCwgcDIsIHAxKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFVlBfUEtFWV9DVFJMX01EOgorICAgICAgaGN0eC0+bWQgPSBwMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFVlBfUEtFWV9DVFJMX0RJR0VTVElOSVQ6CisgICAgICBrZXkgPSAoQVNOMV9PQ1RFVF9TVFJJTkcgKiljdHgtPnBrZXktPnBrZXkucHRyOworICAgICAgaWYgKCFITUFDX0luaXRfZXgoJmhjdHgtPmN0eCwga2V5LT5kYXRhLCBrZXktPmxlbmd0aCwgaGN0eC0+bWQsCisgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmVuZ2luZSkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gLTI7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2NvbnN0IEVWUF9QS0VZX01FVEhPRCBobWFjX3BrZXlfbWV0aCA9IHsKKyAgICBFVlBfUEtFWV9ITUFDLCAgICAgICAgICAwIC8qIGZsYWdzICovLCAgICAgICAgcGtleV9obWFjX2luaXQsCisgICAgcGtleV9obWFjX2NvcHksICAgICAgICAgcGtleV9obWFjX2NsZWFudXAsICAgIDAgLyogcGFyYW1nZW5faW5pdCAqLywKKyAgICAwIC8qIHBhcmFtZ2VuICovLCAgICAgICAwIC8qIGtleWdlbl9pbml0ICovLCAgcGtleV9obWFjX2tleWdlbiwKKyAgICAwIC8qIHNpZ25faW5pdCAqLywgICAgICAwIC8qIHNpZ24gKi8sICAgICAgICAgMCAvKiB2ZXJpZnlfaW5pdCAqLywKKyAgICAwIC8qIHZlcmlmeSAqLywgICAgICAgICBobWFjX3NpZ25jdHhfaW5pdCwgICAgaG1hY19zaWduY3R4LAorICAgIDAgLyogdmVyaWZ5Y3R4X2luaXQgKi8sIDAgLyogdmVyaWZ5Y3R4ICovLCAgICAwIC8qIGVuY3J5cHRfaW5pdCAqLywKKyAgICAwIC8qIGVuY3J5cHQgKi8sICAgICAgICAwIC8qIGRlY3J5cHRfaW5pdCAqLywgMCAvKiBkZWNyeXB0ICovLAorICAgIDAgLyogZGVyaXZlX2luaXQgKi8sICAgIDAgLyogZGVyaXZlICovLCAgICAgICBwa2V5X2htYWNfY3RybCwKKyAgICAwLAorfTsKZGlmZiAtLWdpdCBhL2NyeXB0by9ldnAvcF9obWFjX2FzbjEuYyBiL2NyeXB0by9ldnAvcF9obWFjX2FzbjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWJkNzM3Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2V2cC9wX2htYWNfYXNuMS5jCkBAIC0wLDAgKzEsOTkgQEAKKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDA3LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDA3IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9kaWdlc3QuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqLmg+CisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisKK3N0YXRpYyBpbnQgaG1hY19zaXplKGNvbnN0IEVWUF9QS0VZICpwa2V5KSB7IHJldHVybiBFVlBfTUFYX01EX1NJWkU7IH0KKworc3RhdGljIHZvaWQgaG1hY19rZXlfZnJlZShFVlBfUEtFWSAqcGtleSkgeworICBBU04xX09DVEVUX1NUUklORyAqb3MgPSAoQVNOMV9PQ1RFVF9TVFJJTkcgKilwa2V5LT5wa2V5LnB0cjsKKyAgaWYgKG9zKSB7CisgICAgaWYgKG9zLT5kYXRhKSB7CisgICAgICBPUEVOU1NMX2NsZWFuc2Uob3MtPmRhdGEsIG9zLT5sZW5ndGgpOworICAgIH0KKyAgICBBU04xX09DVEVUX1NUUklOR19mcmVlKG9zKTsKKyAgfQorfQorCitzdGF0aWMgaW50IGhtYWNfcGtleV9jdHJsKEVWUF9QS0VZICpwa2V5LCBpbnQgb3AsIGxvbmcgYXJnMSwgdm9pZCAqYXJnMikgeworICBzd2l0Y2ggKG9wKSB7CisgICAgY2FzZSBBU04xX1BLRVlfQ1RSTF9ERUZBVUxUX01EX05JRDoKKyAgICAgICooaW50ICopYXJnMiA9IE5JRF9zaGExOworICAgICAgcmV0dXJuIDE7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIC0yOworICB9Cit9CisKK2NvbnN0IEVWUF9QS0VZX0FTTjFfTUVUSE9EIGhtYWNfYXNuMV9tZXRoID0geworICAgIEVWUF9QS0VZX0hNQUMsICAgICAgIEVWUF9QS0VZX0hNQUMsICAgICAgICAgMCAvKiBmbGFncyAqLywKKyAgICAiSE1BQyIsICAgICAgICAgICAgICAiT3BlblNTTCBITUFDIG1ldGhvZCIsIDAgLyogcHViX2RlY29kZSAqLywKKyAgICAwIC8qIHB1Yl9lbmNvZGUgKi8sICAwIC8qIHB1Yl9jbXAgKi8sICAgICAgIDAgLyogcHViX3ByaW50ICovLAorICAgIDAgLypwcml2X2RlY29kZSAqLywgIDAgLyogcHJpdl9lbmNvZGUgKi8sICAgMCAvKiBwcml2X3ByaW50ICovLAorICAgIGhtYWNfc2l6ZSwgICAgICAgICAgIDAgLyogcGtleV9iaXRzICovLCAgICAgMCAvKiBwYXJhbV9kZWNvZGUgKi8sCisgICAgMCAvKiBwYXJhbV9lbmNvZGUqLywgMCAvKiBwYXJhbV9taXNzaW5nKi8sICAwIC8qIHBhcmFtX2NvcHkqLywKKyAgICAwIC8qIHBhcmFtX2NtcCovLCAgICAwIC8qIHBhcmFtX3ByaW50Ki8sICAgIDAgLyogc2lnX3ByaW50Ki8sCisgICAgaG1hY19rZXlfZnJlZSwgICAgICAgaG1hY19wa2V5X2N0cmwsICAgICAgICAwIC8qIG9sZF9wcml2X2RlY29kZSAqLywKKyAgICAwIC8qIG9sZF9wcml2X2VuY29kZSAqLworfTsKZGlmZiAtLWdpdCBhL2NyeXB0by9ldnAvcF9yc2EuYyBiL2NyeXB0by9ldnAvcF9yc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmFiMzcxCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2V2cC9wX3JzYS5jCkBAIC0wLDAgKzEsNTk2IEBACisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwNi4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYnVmLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9kaWdlc3QuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgorCisjaW5jbHVkZSAiLi4vcnNhL2ludGVybmFsLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qIEtleSBnZW4gcGFyYW1ldGVycyAqLworICBpbnQgbmJpdHM7CisgIEJJR05VTSAqcHViX2V4cDsKKyAgLyogUlNBIHBhZGRpbmcgbW9kZSAqLworICBpbnQgcGFkX21vZGU7CisgIC8qIG1lc3NhZ2UgZGlnZXN0ICovCisgIGNvbnN0IEVWUF9NRCAqbWQ7CisgIC8qIG1lc3NhZ2UgZGlnZXN0IGZvciBNR0YxICovCisgIGNvbnN0IEVWUF9NRCAqbWdmMW1kOworICAvKiBQU1Mgc2FsdCBsZW5ndGggKi8KKyAgaW50IHNhbHRsZW47CisgIC8qIHRidWYgaXMgYSBidWZmZXIgd2hpY2ggaXMgZWl0aGVyIE5VTEwsIG9yIGlzIHRoZSBzaXplIG9mIHRoZSBSU0EgbW9kdWx1cy4KKyAgICogSXQncyB1c2VkIHRvIHN0b3JlIHRoZSBvdXRwdXQgb2YgUlNBIG9wZXJhdGlvbnMuICovCisgIHVpbnQ4X3QgKnRidWY7CisgIC8qIE9BRVAgbGFiZWwgKi8KKyAgdWludDhfdCAqb2FlcF9sYWJlbDsKKyAgc2l6ZV90IG9hZXBfbGFiZWxsZW47Cit9IFJTQV9QS0VZX0NUWDsKKworc3RhdGljIGludCBwa2V5X3JzYV9pbml0KEVWUF9QS0VZX0NUWCAqY3R4KSB7CisgIFJTQV9QS0VZX0NUWCAqcmN0eDsKKyAgcmN0eCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihSU0FfUEtFWV9DVFgpKTsKKyAgaWYgKCFyY3R4KSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgbWVtc2V0KHJjdHgsIDAsIHNpemVvZihSU0FfUEtFWV9DVFgpKTsKKworICByY3R4LT5uYml0cyA9IDIwNDg7CisgIHJjdHgtPnBhZF9tb2RlID0gUlNBX1BLQ1MxX1BBRERJTkc7CisgIHJjdHgtPnNhbHRsZW4gPSAtMjsKKworICBjdHgtPmRhdGEgPSByY3R4OworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHBrZXlfcnNhX2NvcHkoRVZQX1BLRVlfQ1RYICpkc3QsIEVWUF9QS0VZX0NUWCAqc3JjKSB7CisgIFJTQV9QS0VZX0NUWCAqZGN0eCwgKnNjdHg7CisgIGlmICghcGtleV9yc2FfaW5pdChkc3QpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgc2N0eCA9IHNyYy0+ZGF0YTsKKyAgZGN0eCA9IGRzdC0+ZGF0YTsKKyAgZGN0eC0+bmJpdHMgPSBzY3R4LT5uYml0czsKKyAgaWYgKHNjdHgtPnB1Yl9leHApIHsKKyAgICBkY3R4LT5wdWJfZXhwID0gQk5fZHVwKHNjdHgtPnB1Yl9leHApOworICAgIGlmICghZGN0eC0+cHViX2V4cCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgZGN0eC0+cGFkX21vZGUgPSBzY3R4LT5wYWRfbW9kZTsKKyAgZGN0eC0+bWQgPSBzY3R4LT5tZDsKKyAgZGN0eC0+bWdmMW1kID0gc2N0eC0+bWdmMW1kOworICBpZiAoc2N0eC0+b2FlcF9sYWJlbCkgeworICAgIGlmIChkY3R4LT5vYWVwX2xhYmVsKSB7CisgICAgICBPUEVOU1NMX2ZyZWUoZGN0eC0+b2FlcF9sYWJlbCk7CisgICAgfQorICAgIGRjdHgtPm9hZXBfbGFiZWwgPSBCVUZfbWVtZHVwKHNjdHgtPm9hZXBfbGFiZWwsIHNjdHgtPm9hZXBfbGFiZWxsZW4pOworICAgIGlmICghZGN0eC0+b2FlcF9sYWJlbCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGRjdHgtPm9hZXBfbGFiZWxsZW4gPSBzY3R4LT5vYWVwX2xhYmVsbGVuOworICB9CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHBrZXlfcnNhX2NsZWFudXAoRVZQX1BLRVlfQ1RYICpjdHgpIHsKKyAgUlNBX1BLRVlfQ1RYICpyY3R4ID0gY3R4LT5kYXRhOworCisgIGlmIChyY3R4ID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAocmN0eC0+cHViX2V4cCkgeworICAgIEJOX2ZyZWUocmN0eC0+cHViX2V4cCk7CisgIH0KKyAgaWYgKHJjdHgtPnRidWYpIHsKKyAgICBPUEVOU1NMX2ZyZWUocmN0eC0+dGJ1Zik7CisgIH0KKyAgaWYgKHJjdHgtPm9hZXBfbGFiZWwpIHsKKyAgICBPUEVOU1NMX2ZyZWUocmN0eC0+b2FlcF9sYWJlbCk7CisgIH0KKyAgT1BFTlNTTF9mcmVlKHJjdHgpOworfQorCitzdGF0aWMgaW50IHNldHVwX3RidWYoUlNBX1BLRVlfQ1RYICpjdHgsIEVWUF9QS0VZX0NUWCAqcGspIHsKKyAgaWYgKGN0eC0+dGJ1ZikgeworICAgIHJldHVybiAxOworICB9CisgIGN0eC0+dGJ1ZiA9IE9QRU5TU0xfbWFsbG9jKEVWUF9QS0VZX3NpemUocGstPnBrZXkpKTsKKyAgaWYgKCFjdHgtPnRidWYpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwa2V5X3JzYV9zaWduKEVWUF9QS0VZX0NUWCAqY3R4LCB1aW50OF90ICpzaWcsIHNpemVfdCAqc2lnbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnRicywgc2l6ZV90IHRic2xlbikgeworICBpbnQgcmV0OworICBSU0FfUEtFWV9DVFggKnJjdHggPSBjdHgtPmRhdGE7CisgIFJTQSAqcnNhID0gY3R4LT5wa2V5LT5wa2V5LnJzYTsKKworICBpZiAocmN0eC0+bWQpIHsKKyAgICBpZiAodGJzbGVuICE9IEVWUF9NRF9zaXplKHJjdHgtPm1kKSkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBwa2V5X3JzYV9zaWduLCBFVlBfUl9JTlZBTElEX0RJR0VTVF9MRU5HVEgpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChFVlBfTURfdHlwZShyY3R4LT5tZCkgPT0gTklEX21kYzIpIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcGtleV9yc2Ffc2lnbiwgRVZQX1JfTk9fTURDMl9TVVBQT1JUKTsKKyAgICAgIHJldCA9IC0xOworICAgIH0gZWxzZSBpZiAocmN0eC0+cGFkX21vZGUgPT0gUlNBX1BLQ1MxX1BBRERJTkcpIHsKKyAgICAgIHVuc2lnbmVkIGludCBzbHRtcDsKKyAgICAgIHJldCA9IFJTQV9zaWduKEVWUF9NRF90eXBlKHJjdHgtPm1kKSwgdGJzLCB0YnNsZW4sIHNpZywgJnNsdG1wLCByc2EpOworICAgICAgaWYgKHJldCA8PSAwKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgICB9CisgICAgICByZXQgPSBzbHRtcDsKKyAgICB9IGVsc2UgaWYgKHJjdHgtPnBhZF9tb2RlID09IFJTQV9QS0NTMV9QU1NfUEFERElORykgeworICAgICAgaWYgKCFzZXR1cF90YnVmKHJjdHgsIGN0eCkgfHwKKyAgICAgICAgICAhUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX1BTU19tZ2YxKHJzYSwgcmN0eC0+dGJ1ZiwgdGJzLCByY3R4LT5tZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjdHgtPm1nZjFtZCwgcmN0eC0+c2FsdGxlbikpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgLyogVE9ETyhmb3JrKTogZG9uJ3QgdXNlIHByaXZhdGVfZW5jcnlwdC4gKi8KKyAgICAgIHJldCA9IFJTQV9wcml2YXRlX2VuY3J5cHQoUlNBX3NpemUocnNhKSwgcmN0eC0+dGJ1Ziwgc2lnLCByc2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJTQV9OT19QQURESU5HKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBUT0RPKGZvcmspOiBkb24ndCB1c2UgcHJpdmF0ZV9lbmNyeXB0LiAqLworICAgIHJldCA9IFJTQV9wcml2YXRlX2VuY3J5cHQodGJzbGVuLCB0YnMsIHNpZywgY3R4LT5wa2V5LT5wa2V5LnJzYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjdHgtPnBhZF9tb2RlKTsKKyAgfQorCisgIGlmIChyZXQgPCAwKSB7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICAqc2lnbGVuID0gcmV0OworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHBrZXlfcnNhX3ZlcmlmeShFVlBfUEtFWV9DVFggKmN0eCwgY29uc3QgdWludDhfdCAqc2lnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpZ2xlbiwgY29uc3QgdWludDhfdCAqdGJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRic2xlbikgeworICBSU0FfUEtFWV9DVFggKnJjdHggPSBjdHgtPmRhdGE7CisgIFJTQSAqcnNhID0gY3R4LT5wa2V5LT5wa2V5LnJzYTsKKyAgc2l6ZV90IHJzbGVuOworCisgIGlmIChyY3R4LT5tZCkgeworICAgIGlmIChyY3R4LT5wYWRfbW9kZSA9PSBSU0FfUEtDUzFfUEFERElORykgeworICAgICAgcmV0dXJuIFJTQV92ZXJpZnkoRVZQX01EX3R5cGUocmN0eC0+bWQpLCB0YnMsIHRic2xlbiwgc2lnLCBzaWdsZW4sIHJzYSk7CisgICAgfQorCisgICAgaWYgKHJjdHgtPnBhZF9tb2RlID09IFJTQV9QS0NTMV9QU1NfUEFERElORykgeworICAgICAgaW50IHJldDsKKyAgICAgIGlmICghc2V0dXBfdGJ1ZihyY3R4LCBjdHgpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIC8qIFRPRE8oZm9yayk6IGRvbid0IHVzZSBwdWJsaWNfZGVjcnlwdC4gKi8KKyAgICAgIHJldCA9IFJTQV9wdWJsaWNfZGVjcnlwdChzaWdsZW4sIHNpZywgcmN0eC0+dGJ1ZiwgcnNhLCBSU0FfTk9fUEFERElORyk7CisgICAgICBpZiAocmV0IDw9IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICByZXQgPSBSU0FfdmVyaWZ5X1BLQ1MxX1BTU19tZ2YxKHJzYSwgdGJzLCByY3R4LT5tZCwgcmN0eC0+bWdmMW1kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY3R4LT50YnVmLCByY3R4LT5zYWx0bGVuKTsKKyAgICAgIGlmIChyZXQgPD0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmICghc2V0dXBfdGJ1ZihyY3R4LCBjdHgpKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJzbGVuID0gUlNBX3B1YmxpY19kZWNyeXB0KHNpZ2xlbiwgc2lnLCByY3R4LT50YnVmLCByc2EsIHJjdHgtPnBhZF9tb2RlKTsKKyAgICBpZiAocnNsZW4gPT0gMCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgaWYgKHJzbGVuICE9IHRic2xlbiB8fCBDUllQVE9fbWVtY21wKHRicywgcmN0eC0+dGJ1ZiwgcnNsZW4pICE9IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHBrZXlfcnNhX2VuY3J5cHQoRVZQX1BLRVlfQ1RYICpjdHgsIHVpbnQ4X3QgKm91dCwgc2l6ZV90ICpvdXRsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpbmxlbikgeworICBpbnQgcmV0OworICBSU0FfUEtFWV9DVFggKnJjdHggPSBjdHgtPmRhdGE7CisKKyAgaWYgKHJjdHgtPnBhZF9tb2RlID09IFJTQV9QS0NTMV9PQUVQX1BBRERJTkcpIHsKKyAgICBpbnQga2xlbiA9IFJTQV9zaXplKGN0eC0+cGtleS0+cGtleS5yc2EpOworICAgIGlmICghc2V0dXBfdGJ1ZihyY3R4LCBjdHgpKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX09BRVBfbWdmMShyY3R4LT50YnVmLCBrbGVuLCBpbiwgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjdHgtPm9hZXBfbGFiZWwsIHJjdHgtPm9hZXBfbGFiZWxsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjdHgtPm1kLCByY3R4LT5tZ2YxbWQpKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldCA9IFJTQV9wdWJsaWNfZW5jcnlwdChrbGVuLCByY3R4LT50YnVmLCBvdXQsIGN0eC0+cGtleS0+cGtleS5yc2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJTQV9OT19QQURESU5HKTsKKyAgfSBlbHNlIHsKKyAgICByZXQgPQorICAgICAgICBSU0FfcHVibGljX2VuY3J5cHQoaW5sZW4sIGluLCBvdXQsIGN0eC0+cGtleS0+cGtleS5yc2EsIHJjdHgtPnBhZF9tb2RlKTsKKyAgfQorCisgIGlmIChyZXQgPCAwKSB7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICAqb3V0bGVuID0gcmV0OworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHBrZXlfcnNhX2RlY3J5cHQoRVZQX1BLRVlfQ1RYICpjdHgsIHVpbnQ4X3QgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm91dGxlbiwgY29uc3QgdWludDhfdCAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGlubGVuKSB7CisgIGludCByZXQ7CisgIFJTQV9QS0VZX0NUWCAqcmN0eCA9IGN0eC0+ZGF0YTsKKworICBpZiAocmN0eC0+cGFkX21vZGUgPT0gUlNBX1BLQ1MxX09BRVBfUEFERElORykgeworICAgIGludCBpOworICAgIGlmICghc2V0dXBfdGJ1ZihyY3R4LCBjdHgpKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldCA9IFJTQV9wcml2YXRlX2RlY3J5cHQoaW5sZW4sIGluLCByY3R4LT50YnVmLCBjdHgtPnBrZXktPnBrZXkucnNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlNBX05PX1BBRERJTkcpOworICAgIGlmIChyZXQgPD0gMCkgeworICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IHJldDsgaSsrKSB7CisgICAgICBpZiAocmN0eC0+dGJ1ZltpXSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0ID0gUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfT0FFUF9tZ2YxKAorICAgICAgICBvdXQsIHJldCwgcmN0eC0+dGJ1ZiArIGksIHJldCAtIGksIHJldCwgcmN0eC0+b2FlcF9sYWJlbCwKKyAgICAgICAgcmN0eC0+b2FlcF9sYWJlbGxlbiwgcmN0eC0+bWQsIHJjdHgtPm1nZjFtZCk7CisgIH0gZWxzZSB7CisgICAgcmV0ID0gUlNBX3ByaXZhdGVfZGVjcnlwdChpbmxlbiwgaW4sIG91dCwgY3R4LT5wa2V5LT5wa2V5LnJzYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjdHgtPnBhZF9tb2RlKTsKKyAgfQorCisgIGlmIChyZXQgPCAwKSB7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICAqb3V0bGVuID0gcmV0OworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoZWNrX3BhZGRpbmdfbWQoY29uc3QgRVZQX01EICptZCwgaW50IHBhZGRpbmcpIHsKKyAgaWYgKCFtZCkgeworICAgIHJldHVybiAxOworICB9CisKKyAgaWYgKHBhZGRpbmcgPT0gUlNBX05PX1BBRERJTkcpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGNoZWNrX3BhZGRpbmdfbWQsIEVWUF9SX0lOVkFMSURfUEFERElOR19NT0RFKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGlzX2tub3duX3BhZGRpbmcoaW50IHBhZGRpbmdfbW9kZSkgeworICBzd2l0Y2ggKHBhZGRpbmdfbW9kZSkgeworICAgIGNhc2UgUlNBX1BLQ1MxX1BBRERJTkc6CisgICAgY2FzZSBSU0FfU1NMVjIzX1BBRERJTkc6CisgICAgY2FzZSBSU0FfTk9fUEFERElORzoKKyAgICBjYXNlIFJTQV9QS0NTMV9PQUVQX1BBRERJTkc6CisgICAgY2FzZSBSU0FfUEtDUzFfUFNTX1BBRERJTkc6CisgICAgICByZXR1cm4gMTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDA7CisgIH0KK30KKworc3RhdGljIGludCBwa2V5X3JzYV9jdHJsKEVWUF9QS0VZX0NUWCAqY3R4LCBpbnQgdHlwZSwgaW50IHAxLCB2b2lkICpwMikgeworICBSU0FfUEtFWV9DVFggKnJjdHggPSBjdHgtPmRhdGE7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgRVZQX1BLRVlfQ1RSTF9SU0FfUEFERElORzoKKyAgICAgIGlmICghaXNfa25vd25fcGFkZGluZyhwMSkgfHwgIWNoZWNrX3BhZGRpbmdfbWQocmN0eC0+bWQsIHAxKSB8fAorICAgICAgICAgIChwMSA9PSBSU0FfUEtDUzFfUFNTX1BBRERJTkcgJiYKKyAgICAgICAgICAgMCA9PSAoY3R4LT5vcGVyYXRpb24gJiAoRVZQX1BLRVlfT1BfU0lHTiB8IEVWUF9QS0VZX09QX1ZFUklGWSkpKSB8fAorICAgICAgICAgIChwMSA9PSBSU0FfUEtDUzFfT0FFUF9QQURESU5HICYmCisgICAgICAgICAgIDAgPT0gKGN0eC0+b3BlcmF0aW9uICYgRVZQX1BLRVlfT1BfVFlQRV9DUllQVCkpKSB7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcGtleV9yc2FfY3RybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRVZQX1JfSUxMRUdBTF9PUl9VTlNVUFBPUlRFRF9QQURESU5HX01PREUpOworICAgICAgICByZXR1cm4gLTI7CisgICAgICB9CisgICAgICBpZiAoKHAxID09IFJTQV9QS0NTMV9QU1NfUEFERElORyB8fCBwMSA9PSBSU0FfUEtDUzFfT0FFUF9QQURESU5HKSAmJgorICAgICAgICAgIHJjdHgtPm1kID09IE5VTEwpIHsKKyAgICAgICAgcmN0eC0+bWQgPSBFVlBfc2hhMSgpOworICAgICAgfQorICAgICAgcmN0eC0+cGFkX21vZGUgPSBwMTsKKyAgICAgIHJldHVybiAxOworCisgICAgY2FzZSBFVlBfUEtFWV9DVFJMX0dFVF9SU0FfUEFERElORzoKKyAgICAgICooaW50ICopcDIgPSByY3R4LT5wYWRfbW9kZTsKKyAgICAgIHJldHVybiAxOworCisgICAgY2FzZSBFVlBfUEtFWV9DVFJMX1JTQV9QU1NfU0FMVExFTjoKKyAgICBjYXNlIEVWUF9QS0VZX0NUUkxfR0VUX1JTQV9QU1NfU0FMVExFTjoKKyAgICAgIGlmIChyY3R4LT5wYWRfbW9kZSAhPSBSU0FfUEtDUzFfUFNTX1BBRERJTkcpIHsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBwa2V5X3JzYV9jdHJsLCBFVlBfUl9JTlZBTElEX1BTU19TQUxUTEVOKTsKKyAgICAgICAgcmV0dXJuIC0yOworICAgICAgfQorICAgICAgaWYgKHR5cGUgPT0gRVZQX1BLRVlfQ1RSTF9HRVRfUlNBX1BTU19TQUxUTEVOKSB7CisgICAgICAgICooaW50ICopcDIgPSByY3R4LT5zYWx0bGVuOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHAxIDwgLTIpIHsKKyAgICAgICAgICByZXR1cm4gLTI7CisgICAgICAgIH0KKyAgICAgICAgcmN0eC0+c2FsdGxlbiA9IHAxOworICAgICAgfQorICAgICAgcmV0dXJuIDE7CisKKyAgICBjYXNlIEVWUF9QS0VZX0NUUkxfUlNBX0tFWUdFTl9CSVRTOgorICAgICAgaWYgKHAxIDwgMjU2KSB7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcGtleV9yc2FfY3RybCwgRVZQX1JfSU5WQUxJRF9LRVlCSVRTKTsKKyAgICAgICAgcmV0dXJuIC0yOworICAgICAgfQorICAgICAgcmN0eC0+bmJpdHMgPSBwMTsKKyAgICAgIHJldHVybiAxOworCisgICAgY2FzZSBFVlBfUEtFWV9DVFJMX1JTQV9LRVlHRU5fUFVCRVhQOgorICAgICAgaWYgKCFwMikgeworICAgICAgICByZXR1cm4gLTI7CisgICAgICB9CisgICAgICBCTl9mcmVlKHJjdHgtPnB1Yl9leHApOworICAgICAgcmN0eC0+cHViX2V4cCA9IHAyOworICAgICAgcmV0dXJuIDE7CisKKyAgICBjYXNlIEVWUF9QS0VZX0NUUkxfUlNBX09BRVBfTUQ6CisgICAgY2FzZSBFVlBfUEtFWV9DVFJMX0dFVF9SU0FfT0FFUF9NRDoKKyAgICAgIGlmIChyY3R4LT5wYWRfbW9kZSAhPSBSU0FfUEtDUzFfT0FFUF9QQURESU5HKSB7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcGtleV9yc2FfY3RybCwgRVZQX1JfSU5WQUxJRF9QQURESU5HX01PREUpOworICAgICAgICByZXR1cm4gLTI7CisgICAgICB9CisgICAgICBpZiAodHlwZSA9PSBFVlBfUEtFWV9DVFJMX0dFVF9SU0FfT0FFUF9NRCkgeworICAgICAgICAqKGNvbnN0IEVWUF9NRCAqKilwMiA9IHJjdHgtPm1kOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmN0eC0+bWQgPSBwMjsKKyAgICAgIH0KKyAgICAgIHJldHVybiAxOworCisgICAgY2FzZSBFVlBfUEtFWV9DVFJMX01EOgorICAgICAgaWYgKCFjaGVja19wYWRkaW5nX21kKHAyLCByY3R4LT5wYWRfbW9kZSkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICByY3R4LT5tZCA9IHAyOworICAgICAgcmV0dXJuIDE7CisKKyAgICBjYXNlIEVWUF9QS0VZX0NUUkxfR0VUX01EOgorICAgICAgKihjb25zdCBFVlBfTUQgKiopcDIgPSByY3R4LT5tZDsKKyAgICAgIHJldHVybiAxOworCisgICAgY2FzZSBFVlBfUEtFWV9DVFJMX1JTQV9NR0YxX01EOgorICAgIGNhc2UgRVZQX1BLRVlfQ1RSTF9HRVRfUlNBX01HRjFfTUQ6CisgICAgICBpZiAocmN0eC0+cGFkX21vZGUgIT0gUlNBX1BLQ1MxX1BTU19QQURESU5HICYmCisgICAgICAgICAgcmN0eC0+cGFkX21vZGUgIT0gUlNBX1BLQ1MxX09BRVBfUEFERElORykgeworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIHBrZXlfcnNhX2N0cmwsIEVWUF9SX0lOVkFMSURfTUdGMV9NRCk7CisgICAgICAgIHJldHVybiAtMjsKKyAgICAgIH0KKyAgICAgIGlmICh0eXBlID09IEVWUF9QS0VZX0NUUkxfR0VUX1JTQV9NR0YxX01EKSB7CisgICAgICAgIGlmIChyY3R4LT5tZ2YxbWQpIHsKKyAgICAgICAgICAqKGNvbnN0IEVWUF9NRCAqKilwMiA9IHJjdHgtPm1nZjFtZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAqKGNvbnN0IEVWUF9NRCAqKilwMiA9IHJjdHgtPm1kOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICByY3R4LT5tZ2YxbWQgPSBwMjsKKyAgICAgIH0KKyAgICAgIHJldHVybiAxOworCisgICAgY2FzZSBFVlBfUEtFWV9DVFJMX1JTQV9PQUVQX0xBQkVMOgorICAgICAgaWYgKHJjdHgtPnBhZF9tb2RlICE9IFJTQV9QS0NTMV9PQUVQX1BBRERJTkcpIHsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBwa2V5X3JzYV9jdHJsLCBFVlBfUl9JTlZBTElEX1BBRERJTkdfTU9ERSk7CisgICAgICAgIHJldHVybiAtMjsKKyAgICAgIH0KKyAgICAgIGlmIChyY3R4LT5vYWVwX2xhYmVsKSB7CisgICAgICAgIE9QRU5TU0xfZnJlZShyY3R4LT5vYWVwX2xhYmVsKTsKKyAgICAgIH0KKyAgICAgIGlmIChwMiAmJiBwMSA+IDApIHsKKyAgICAgICAgLyogVE9ETyhmb3JrKTogdGhpcyBzZWVtcyB3cm9uZy4gU2hvdWxkbid0IGl0IHRha2UgYSBjb3B5IG9mIHRoZQorICAgICAgICAgKiBidWZmZXI/ICovCisgICAgICAgIHJjdHgtPm9hZXBfbGFiZWwgPSBwMjsKKyAgICAgICAgcmN0eC0+b2FlcF9sYWJlbGxlbiA9IHAxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmN0eC0+b2FlcF9sYWJlbCA9IE5VTEw7CisgICAgICAgIHJjdHgtPm9hZXBfbGFiZWxsZW4gPSAwOworICAgICAgfQorICAgICAgcmV0dXJuIDE7CisKKyAgICBjYXNlIEVWUF9QS0VZX0NUUkxfR0VUX1JTQV9PQUVQX0xBQkVMOgorICAgICAgaWYgKHJjdHgtPnBhZF9tb2RlICE9IFJTQV9QS0NTMV9PQUVQX1BBRERJTkcpIHsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBwa2V5X3JzYV9jdHJsLCBFVlBfUl9JTlZBTElEX1BBRERJTkdfTU9ERSk7CisgICAgICAgIHJldHVybiAtMjsKKyAgICAgIH0KKyAgICAgICoodWludDhfdCAqKilwMiA9IHJjdHgtPm9hZXBfbGFiZWw7CisgICAgICByZXR1cm4gcmN0eC0+b2FlcF9sYWJlbGxlbjsKKworICAgIGNhc2UgRVZQX1BLRVlfQ1RSTF9ESUdFU1RJTklUOgorICAgICAgcmV0dXJuIDE7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIC0yOworICB9Cit9CisKK3N0YXRpYyBpbnQgcGtleV9yc2Ffa2V5Z2VuKEVWUF9QS0VZX0NUWCAqY3R4LCBFVlBfUEtFWSAqcGtleSkgeworICBSU0EgKnJzYSA9IE5VTEw7CisgIFJTQV9QS0VZX0NUWCAqcmN0eCA9IGN0eC0+ZGF0YTsKKworICBpbnQgcmV0OworICBpZiAoIXJjdHgtPnB1Yl9leHApIHsKKyAgICByY3R4LT5wdWJfZXhwID0gQk5fbmV3KCk7CisgICAgaWYgKCFyY3R4LT5wdWJfZXhwIHx8ICFCTl9zZXRfd29yZChyY3R4LT5wdWJfZXhwLCBSU0FfRjQpKQorICAgICAgcmV0dXJuIDA7CisgIH0KKyAgcnNhID0gUlNBX25ldygpOworICBpZiAoIXJzYSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgcmV0ID0gUlNBX2dlbmVyYXRlX2tleV9leChyc2EsIHJjdHgtPm5iaXRzLCByY3R4LT5wdWJfZXhwLCBOVUxMKTsKKyAgaWYgKHJldCA+IDApIHsKKyAgICBFVlBfUEtFWV9hc3NpZ25fUlNBKHBrZXksIHJzYSk7CisgIH0gZWxzZSB7CisgICAgUlNBX2ZyZWUocnNhKTsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitjb25zdCBFVlBfUEtFWV9NRVRIT0QgcnNhX3BrZXlfbWV0aCA9IHsKKyAgICBFVlBfUEtFWV9SU0EsICAgICAgICBFVlBfUEtFWV9GTEFHX0FVVE9BUkdMRU4sIHBrZXlfcnNhX2luaXQsCisgICAgcGtleV9yc2FfY29weSwgICAgICAgcGtleV9yc2FfY2xlYW51cCwgICAgICAgICAwIC8qIHBhcmFtZ2VuX2luaXQgKi8sCisgICAgMCAvKiBwYXJhbWdlbiAqLywgICAgMCAvKiBrZXlnZW5faW5pdCAqLywgICAgICBwa2V5X3JzYV9rZXlnZW4sCisgICAgMCAvKiBzaWduX2luaXQgKi8sICAgcGtleV9yc2Ffc2lnbiwgICAgICAgICAgICAwIC8qIHZlcmlmeV9pbml0ICovLAorICAgIHBrZXlfcnNhX3ZlcmlmeSwgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAwLCAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogZW5jcnlwdF9pbml0ICovLAorICAgIHBrZXlfcnNhX2VuY3J5cHQsICAgIDAgLyogZGVjcnlwdF9pbml0ICovLCAgICAgcGtleV9yc2FfZGVjcnlwdCwKKyAgICAwIC8qIGRlcml2ZV9pbml0ICovLCAwIC8qIGRlcml2ZSAqLywgICAgICAgICAgIHBrZXlfcnNhX2N0cmwsCit9OworCitpbnQgRVZQX1BLRVlfQ1RYX3NldF9yc2FfcGFkZGluZyhFVlBfUEtFWV9DVFggKmN0eCwgaW50IHBhZGRpbmcpIHsKKyAgcmV0dXJuIEVWUF9QS0VZX0NUWF9jdHJsKGN0eCwgRVZQX1BLRVlfUlNBLCAtMSwgRVZQX1BLRVlfQ1RSTF9SU0FfUEFERElORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmcsIE5VTEwpOworfQorCitpbnQgRVZQX1BLRVlfQ1RYX2dldF9yc2FfcGFkZGluZyhFVlBfUEtFWV9DVFggKmN0eCwgaW50ICpvdXRfcGFkZGluZykgeworICByZXR1cm4gRVZQX1BLRVlfQ1RYX2N0cmwoY3R4LCBFVlBfUEtFWV9SU0EsIC0xLCBFVlBfUEtFWV9DVFJMX0dFVF9SU0FfUEFERElORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIG91dF9wYWRkaW5nKTsKK30KKworaW50IEVWUF9QS0VZX0NUWF9zZXRfcnNhX3Bzc19zYWx0bGVuKEVWUF9QS0VZX0NUWCAqY3R4LCBpbnQgc2FsdF9sZW4pIHsKKyAgcmV0dXJuIEVWUF9QS0VZX0NUWF9jdHJsKGN0eCwgRVZQX1BLRVlfUlNBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKEVWUF9QS0VZX09QX1NJR04gfCBFVlBfUEtFWV9PUF9WRVJJRlkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZQX1BLRVlfQ1RSTF9SU0FfUFNTX1NBTFRMRU4sIHNhbHRfbGVuLCBOVUxMKTsKK30KKworaW50IEVWUF9QS0VZX0NUWF9nZXRfcnNhX3Bzc19zYWx0bGVuKEVWUF9QS0VZX0NUWCAqY3R4LCBpbnQgKm91dF9zYWx0X2xlbikgeworICByZXR1cm4gRVZQX1BLRVlfQ1RYX2N0cmwoY3R4LCBFVlBfUEtFWV9SU0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoRVZQX1BLRVlfT1BfU0lHTiB8IEVWUF9QS0VZX09QX1ZFUklGWSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlBfUEtFWV9DVFJMX0dFVF9SU0FfUFNTX1NBTFRMRU4sIDAsIG91dF9zYWx0X2xlbik7Cit9CisKK2ludCBFVlBfUEtFWV9DVFhfc2V0X3JzYV9rZXlnZW5fYml0cyhFVlBfUEtFWV9DVFggKmN0eCwgaW50IGJpdHMpIHsKKyAgcmV0dXJuIEVWUF9QS0VZX0NUWF9jdHJsKGN0eCwgRVZQX1BLRVlfUlNBLCBFVlBfUEtFWV9PUF9LRVlHRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlBfUEtFWV9DVFJMX1JTQV9LRVlHRU5fQklUUywgYml0cywgTlVMTCk7Cit9CisKK2ludCBFVlBfUEtFWV9DVFhfc2V0X3JzYV9rZXlnZW5fcHViZXhwKEVWUF9QS0VZX0NUWCAqY3R4LCBCSUdOVU0gKmUpIHsKKyAgcmV0dXJuIEVWUF9QS0VZX0NUWF9jdHJsKGN0eCwgRVZQX1BLRVlfUlNBLCBFVlBfUEtFWV9PUF9LRVlHRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlBfUEtFWV9DVFJMX1JTQV9LRVlHRU5fUFVCRVhQLCAwLCBlKTsKK30KKworaW50IEVWUF9QS0VZX0NUWF9zZXRfcnNhX29hZXBfbWQoRVZQX1BLRVlfQ1RYICpjdHgsIGNvbnN0IEVWUF9NRCAqbWQpIHsKKyAgcmV0dXJuIEVWUF9QS0VZX0NUWF9jdHJsKGN0eCwgRVZQX1BLRVlfUlNBLCBFVlBfUEtFWV9PUF9UWVBFX0NSWVBULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZQX1BLRVlfQ1RSTF9SU0FfT0FFUF9NRCwgMCwgKHZvaWQgKiltZCk7Cit9CisKK2ludCBFVlBfUEtFWV9DVFhfZ2V0X3JzYV9vYWVwX21kKEVWUF9QS0VZX0NUWCAqY3R4LCBjb25zdCBFVlBfTUQgKipvdXRfbWQpIHsKKyAgcmV0dXJuIEVWUF9QS0VZX0NUWF9jdHJsKGN0eCwgRVZQX1BLRVlfUlNBLCBFVlBfUEtFWV9PUF9UWVBFX0NSWVBULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZQX1BLRVlfQ1RSTF9HRVRfUlNBX09BRVBfTUQsIDAsICh2b2lkKikgb3V0X21kKTsKK30KKworaW50IEVWUF9QS0VZX0NUWF9zZXRfcnNhX21nZjFfbWQoRVZQX1BLRVlfQ1RYICpjdHgsIGNvbnN0IEVWUF9NRCAqbWQpIHsKKyAgcmV0dXJuIEVWUF9QS0VZX0NUWF9jdHJsKGN0eCwgRVZQX1BLRVlfUlNBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZQX1BLRVlfT1BfVFlQRV9TSUcgfCBFVlBfUEtFWV9PUF9UWVBFX0NSWVBULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZQX1BLRVlfQ1RSTF9SU0FfTUdGMV9NRCwgMCwgKHZvaWQqKSBtZCk7Cit9CisKK2ludCBFVlBfUEtFWV9DVFhfZ2V0X3JzYV9tZ2YxX21kKEVWUF9QS0VZX0NUWCAqY3R4LCBjb25zdCBFVlBfTUQgKipvdXRfbWQpIHsKKyAgcmV0dXJuIEVWUF9QS0VZX0NUWF9jdHJsKGN0eCwgRVZQX1BLRVlfUlNBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZQX1BLRVlfT1BfVFlQRV9TSUcgfCBFVlBfUEtFWV9PUF9UWVBFX0NSWVBULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZQX1BLRVlfQ1RSTF9HRVRfUlNBX01HRjFfTUQsIDAsICh2b2lkKikgb3V0X21kKTsKK30KKworaW50IEVWUF9QS0VZX0NUWF9zZXQwX3JzYV9vYWVwX2xhYmVsKEVWUF9QS0VZX0NUWCAqY3R4LCBjb25zdCB1aW50OF90ICpsYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGFiZWxfbGVuKSB7CisgIGludCBsYWJlbF9sZW5faW50ID0gbGFiZWxfbGVuOworICBpZiAoKChzaXplX3QpIGxhYmVsX2xlbl9pbnQpICE9IGxhYmVsX2xlbikgeworICAgIHJldHVybiAtMjsKKyAgfQorCisgIHJldHVybiBFVlBfUEtFWV9DVFhfY3RybChjdHgsIEVWUF9QS0VZX1JTQSwgRVZQX1BLRVlfT1BfVFlQRV9DUllQVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWUF9QS0VZX0NUUkxfUlNBX09BRVBfTEFCRUwsIGxhYmVsX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbGFiZWwpOworfQorCitpbnQgRVZQX1BLRVlfQ1RYX2dldDBfcnNhX29hZXBfbGFiZWwoRVZQX1BLRVlfQ1RYICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKm91dF9sYWJlbCkgeworICByZXR1cm4gRVZQX1BLRVlfQ1RYX2N0cmwoY3R4LCBFVlBfUEtFWV9SU0EsIEVWUF9QS0VZX09QX1RZUEVfQ1JZUFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlBfUEtFWV9DVFJMX0dFVF9SU0FfT0FFUF9MQUJFTCwgMCwgKHZvaWQgKikgb3V0X2xhYmVsKTsKK30KZGlmZiAtLWdpdCBhL2NyeXB0by9ldnAvcF9yc2FfYXNuMS5jIGIvY3J5cHRvL2V2cC9wX3JzYV9hc24xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI5NGVkNwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9ldnAvcF9yc2FfYXNuMS5jCkBAIC0wLDAgKzEsNzUxIEBACisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwNi4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2RpZ2VzdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKKyNpbmNsdWRlICIuLi9yc2EvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisKK3N0YXRpYyBpbnQgcnNhX3B1Yl9lbmNvZGUoWDUwOV9QVUJLRVkgKnBrLCBjb25zdCBFVlBfUEtFWSAqcGtleSkgeworICB1aW50OF90ICplbmNvZGVkID0gTlVMTDsKKyAgaW50IGxlbjsKKyAgbGVuID0gaTJkX1JTQVB1YmxpY0tleShwa2V5LT5wa2V5LnJzYSwgJmVuY29kZWQpOworCisgIGlmIChsZW4gPD0gMCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKCFYNTA5X1BVQktFWV9zZXQwX3BhcmFtKHBrLCBPQkpfbmlkMm9iaihFVlBfUEtFWV9SU0EpLCBWX0FTTjFfTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWQsIGxlbikpIHsKKyAgICBPUEVOU1NMX2ZyZWUoZW5jb2RlZCk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCByc2FfcHViX2RlY29kZShFVlBfUEtFWSAqcGtleSwgWDUwOV9QVUJLRVkgKnB1YmtleSkgeworICBjb25zdCB1aW50OF90ICpwOworICBpbnQgcGtsZW47CisgIFJTQSAqcnNhOworCisgIGlmICghWDUwOV9QVUJLRVlfZ2V0MF9wYXJhbShOVUxMLCAmcCwgJnBrbGVuLCBOVUxMLCBwdWJrZXkpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcnNhID0gZDJpX1JTQVB1YmxpY0tleShOVUxMLCAmcCwgcGtsZW4pOworICBpZiAocnNhID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIHJzYV9wdWJfZGVjb2RlLCBFUlJfUl9SU0FfTElCKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBFVlBfUEtFWV9hc3NpZ25fUlNBKHBrZXksIHJzYSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHJzYV9wdWJfY21wKGNvbnN0IEVWUF9QS0VZICphLCBjb25zdCBFVlBfUEtFWSAqYikgeworICByZXR1cm4gQk5fY21wKGItPnBrZXkucnNhLT5uLCBhLT5wa2V5LnJzYS0+bikgPT0gMCAmJgorICAgICAgICAgQk5fY21wKGItPnBrZXkucnNhLT5lLCBhLT5wa2V5LnJzYS0+ZSkgPT0gMDsKK30KKworc3RhdGljIGludCByc2FfcHJpdl9lbmNvZGUoUEtDUzhfUFJJVl9LRVlfSU5GTyAqcDgsIGNvbnN0IEVWUF9QS0VZICpwa2V5KSB7CisgIHVpbnQ4X3QgKnJrID0gTlVMTDsKKyAgaW50IHJrbGVuOworCisgIHJrbGVuID0gaTJkX1JTQVByaXZhdGVLZXkocGtleS0+cGtleS5yc2EsICZyayk7CisKKyAgaWYgKHJrbGVuIDw9IDApIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIHJzYV9wcml2X2VuY29kZSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIHJldHVybiAwOworICB9CisKKyAgLyogVE9ETyhmb3JrKTogY29uc3QgY29ycmVjdG5lc3MgaW4gbmV4dCBsaW5lLiAqLworICBpZiAoIVBLQ1M4X3BrZXlfc2V0MChwOCwgKEFTTjFfT0JKRUNUICopT0JKX25pZDJvYmooTklEX3JzYUVuY3J5cHRpb24pLCAwLAorICAgICAgICAgICAgICAgICAgICAgICBWX0FTTjFfTlVMTCwgTlVMTCwgcmssIHJrbGVuKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcnNhX3ByaXZfZW5jb2RlLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCByc2FfcHJpdl9kZWNvZGUoRVZQX1BLRVkgKnBrZXksIFBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4KSB7CisgIGNvbnN0IHVpbnQ4X3QgKnA7CisgIGludCBwa2xlbjsKKyAgUlNBICpyc2E7CisKKyAgaWYgKCFQS0NTOF9wa2V5X2dldDAoTlVMTCwgJnAsICZwa2xlbiwgTlVMTCwgcDgpKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCByc2FfcHJpdl9kZWNvZGUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJzYSA9IGQyaV9SU0FQcml2YXRlS2V5KE5VTEwsICZwLCBwa2xlbik7CisgIGlmIChyc2EgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcnNhX3ByaXZfZGVjb2RlLCBFUlJfUl9SU0FfTElCKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIEVWUF9QS0VZX2Fzc2lnbl9SU0EocGtleSwgcnNhKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgaW50X3JzYV9zaXplKGNvbnN0IEVWUF9QS0VZICpwa2V5KSB7CisgIHJldHVybiBSU0Ffc2l6ZShwa2V5LT5wa2V5LnJzYSk7Cit9CisKK3N0YXRpYyBpbnQgcnNhX2JpdHMoY29uc3QgRVZQX1BLRVkgKnBrZXkpIHsKKyAgcmV0dXJuIEJOX251bV9iaXRzKHBrZXktPnBrZXkucnNhLT5uKTsKK30KKworc3RhdGljIHZvaWQgaW50X3JzYV9mcmVlKEVWUF9QS0VZICpwa2V5KSB7IFJTQV9mcmVlKHBrZXktPnBrZXkucnNhKTsgfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfYnVmbGVuKGNvbnN0IEJJR05VTSAqYiwgc2l6ZV90ICpwYnVmbGVuKSB7CisgIHNpemVfdCBpOworCisgIGlmICghYikgeworICAgIHJldHVybjsKKyAgfQorCisgIGkgPSBCTl9udW1fYnl0ZXMoYik7CisgIGlmICgqcGJ1ZmxlbiA8IGkpIHsKKyAgICAqcGJ1ZmxlbiA9IGk7CisgIH0KK30KKworc3RhdGljIGludCBkb19yc2FfcHJpbnQoQklPICpvdXQsIGNvbnN0IFJTQSAqcnNhLCBpbnQgb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluY2x1ZGVfcHJpdmF0ZSkgeworICBjaGFyICpzdHI7CisgIGNvbnN0IGNoYXIgKnM7CisgIHVpbnQ4X3QgKm0gPSBOVUxMOworICBpbnQgcmV0ID0gMCwgbW9kX2xlbiA9IDA7CisgIHNpemVfdCBidWZfbGVuID0gMDsKKworICB1cGRhdGVfYnVmbGVuKHJzYS0+biwgJmJ1Zl9sZW4pOworICB1cGRhdGVfYnVmbGVuKHJzYS0+ZSwgJmJ1Zl9sZW4pOworCisgIGlmIChpbmNsdWRlX3ByaXZhdGUpIHsKKyAgICB1cGRhdGVfYnVmbGVuKHJzYS0+ZCwgJmJ1Zl9sZW4pOworICAgIHVwZGF0ZV9idWZsZW4ocnNhLT5wLCAmYnVmX2xlbik7CisgICAgdXBkYXRlX2J1Zmxlbihyc2EtPnEsICZidWZfbGVuKTsKKyAgICB1cGRhdGVfYnVmbGVuKHJzYS0+ZG1wMSwgJmJ1Zl9sZW4pOworICAgIHVwZGF0ZV9idWZsZW4ocnNhLT5kbXExLCAmYnVmX2xlbik7CisgICAgdXBkYXRlX2J1Zmxlbihyc2EtPmlxbXAsICZidWZfbGVuKTsKKyAgfQorCisgIG0gPSAodWludDhfdCAqKU9QRU5TU0xfbWFsbG9jKGJ1Zl9sZW4gKyAxMCk7CisgIGlmIChtID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGRvX3JzYV9wcmludCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKHJzYS0+biAhPSBOVUxMKSB7CisgICAgbW9kX2xlbiA9IEJOX251bV9iaXRzKHJzYS0+bik7CisgIH0KKworICBpZiAoIUJJT19pbmRlbnQob3V0LCBvZmYsIDEyOCkpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmIChpbmNsdWRlX3ByaXZhdGUgJiYgcnNhLT5kKSB7CisgICAgaWYgKEJJT19wcmludGYob3V0LCAiUHJpdmF0ZS1LZXk6ICglZCBiaXQpXG4iLCBtb2RfbGVuKSA8PSAwKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgc3RyID0gIm1vZHVsdXM6IjsKKyAgICBzID0gInB1YmxpY0V4cG9uZW50OiI7CisgIH0gZWxzZSB7CisgICAgaWYgKEJJT19wcmludGYob3V0LCAiUHVibGljLUtleTogKCVkIGJpdClcbiIsIG1vZF9sZW4pIDw9IDApIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBzdHIgPSAiTW9kdWx1czoiOworICAgIHMgPSAiRXhwb25lbnQ6IjsKKyAgfQorICBpZiAoIUFTTjFfYm5fcHJpbnQob3V0LCBzdHIsIHJzYS0+biwgbSwgb2ZmKSB8fAorICAgICAgIUFTTjFfYm5fcHJpbnQob3V0LCBzLCByc2EtPmUsIG0sIG9mZikpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmIChpbmNsdWRlX3ByaXZhdGUpIHsKKyAgICBpZiAoIUFTTjFfYm5fcHJpbnQob3V0LCAicHJpdmF0ZUV4cG9uZW50OiIsIHJzYS0+ZCwgbSwgb2ZmKSB8fAorICAgICAgICAhQVNOMV9ibl9wcmludChvdXQsICJwcmltZTE6IiwgcnNhLT5wLCBtLCBvZmYpIHx8CisgICAgICAgICFBU04xX2JuX3ByaW50KG91dCwgInByaW1lMjoiLCByc2EtPnEsIG0sIG9mZikgfHwKKyAgICAgICAgIUFTTjFfYm5fcHJpbnQob3V0LCAiZXhwb25lbnQxOiIsIHJzYS0+ZG1wMSwgbSwgb2ZmKSB8fAorICAgICAgICAhQVNOMV9ibl9wcmludChvdXQsICJleHBvbmVudDI6IiwgcnNhLT5kbXExLCBtLCBvZmYpIHx8CisgICAgICAgICFBU04xX2JuX3ByaW50KG91dCwgImNvZWZmaWNpZW50OiIsIHJzYS0+aXFtcCwgbSwgb2ZmKSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICB9CisgIHJldCA9IDE7CisKK2VycjoKKyAgaWYgKG0gIT0gTlVMTCkgeworICAgIE9QRU5TU0xfZnJlZShtKTsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJzYV9wdWJfcHJpbnQoQklPICpicCwgY29uc3QgRVZQX1BLRVkgKnBrZXksIGludCBpbmRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQVNOMV9QQ1RYICpjdHgpIHsKKyAgcmV0dXJuIGRvX3JzYV9wcmludChicCwgcGtleS0+cGtleS5yc2EsIGluZGVudCwgMCk7Cit9CisKKworc3RhdGljIGludCByc2FfcHJpdl9wcmludChCSU8gKmJwLCBjb25zdCBFVlBfUEtFWSAqcGtleSwgaW50IGluZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOMV9QQ1RYICpjdHgpIHsKKyAgcmV0dXJuIGRvX3JzYV9wcmludChicCwgcGtleS0+cGtleS5yc2EsIGluZGVudCwgMSk7Cit9CisKKy8qIEdpdmVuIGFuIE1HRjEgQWxnb3JpdGhtIElEIGRlY29kZSB0byBhbiBBbGdvcml0aG0gSWRlbnRpZmllciAqLworc3RhdGljIFg1MDlfQUxHT1IgKnJzYV9tZ2YxX2RlY29kZShYNTA5X0FMR09SICphbGcpIHsKKyAgY29uc3QgdWludDhfdCAqcDsKKyAgaW50IHBsZW47CisKKyAgaWYgKGFsZyA9PSBOVUxMIHx8CisgICAgICBPQkpfb2JqMm5pZChhbGctPmFsZ29yaXRobSkgIT0gTklEX21nZjEgfHwKKyAgICAgIGFsZy0+cGFyYW1ldGVyLT50eXBlICE9IFZfQVNOMV9TRVFVRU5DRSkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcCA9IGFsZy0+cGFyYW1ldGVyLT52YWx1ZS5zZXF1ZW5jZS0+ZGF0YTsKKyAgcGxlbiA9IGFsZy0+cGFyYW1ldGVyLT52YWx1ZS5zZXF1ZW5jZS0+bGVuZ3RoOworICByZXR1cm4gZDJpX1g1MDlfQUxHT1IoTlVMTCwgJnAsIHBsZW4pOworfQorCitzdGF0aWMgUlNBX1BTU19QQVJBTVMgKnJzYV9wc3NfZGVjb2RlKGNvbnN0IFg1MDlfQUxHT1IgKmFsZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDUwOV9BTEdPUiAqKnBtYXNrSGFzaCkgeworICBjb25zdCB1aW50OF90ICpwOworICBpbnQgcGxlbjsKKyAgUlNBX1BTU19QQVJBTVMgKnBzczsKKworICAqcG1hc2tIYXNoID0gTlVMTDsKKworICBpZiAoIWFsZy0+cGFyYW1ldGVyIHx8IGFsZy0+cGFyYW1ldGVyLT50eXBlICE9IFZfQVNOMV9TRVFVRU5DRSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHAgPSBhbGctPnBhcmFtZXRlci0+dmFsdWUuc2VxdWVuY2UtPmRhdGE7CisgIHBsZW4gPSBhbGctPnBhcmFtZXRlci0+dmFsdWUuc2VxdWVuY2UtPmxlbmd0aDsKKyAgcHNzID0gZDJpX1JTQV9QU1NfUEFSQU1TKE5VTEwsICZwLCBwbGVuKTsKKworICBpZiAoIXBzcykgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgKnBtYXNrSGFzaCA9IHJzYV9tZ2YxX2RlY29kZShwc3MtPm1hc2tHZW5BbGdvcml0aG0pOworCisgIHJldHVybiBwc3M7Cit9CisKK3N0YXRpYyBpbnQgcnNhX3Bzc19wYXJhbV9wcmludChCSU8gKmJwLCBSU0FfUFNTX1BBUkFNUyAqcHNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlfQUxHT1IgKm1hc2tIYXNoLCBpbnQgaW5kZW50KSB7CisgIGludCBydiA9IDA7CisKKyAgaWYgKCFwc3MpIHsKKyAgICBpZiAoQklPX3B1dHMoYnAsICIgKElOVkFMSUQgUFNTIFBBUkFNRVRFUlMpXG4iKSA8PSAwKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpZiAoQklPX3B1dHMoYnAsICJcbiIpIDw9IDAgfHwKKyAgICAgICFCSU9faW5kZW50KGJwLCBpbmRlbnQsIDEyOCkgfHwKKyAgICAgIEJJT19wdXRzKGJwLCAiSGFzaCBBbGdvcml0aG06ICIpIDw9IDApIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmIChwc3MtPmhhc2hBbGdvcml0aG0pIHsKKyAgICBpZiAoaTJhX0FTTjFfT0JKRUNUKGJwLCBwc3MtPmhhc2hBbGdvcml0aG0tPmFsZ29yaXRobSkgPD0gMCkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICB9IGVsc2UgaWYgKEJJT19wdXRzKGJwLCAic2hhMSAoZGVmYXVsdCkiKSA8PSAwKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAoQklPX3B1dHMoYnAsICJcbiIpIDw9IDAgfHwKKyAgICAgICFCSU9faW5kZW50KGJwLCBpbmRlbnQsIDEyOCkgfHwKKyAgICAgIEJJT19wdXRzKGJwLCAiTWFzayBBbGdvcml0aG06ICIpIDw9IDApIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmIChwc3MtPm1hc2tHZW5BbGdvcml0aG0pIHsKKyAgICBpZiAoaTJhX0FTTjFfT0JKRUNUKGJwLCBwc3MtPm1hc2tHZW5BbGdvcml0aG0tPmFsZ29yaXRobSkgPD0gMCB8fAorICAgICAgICBCSU9fcHV0cyhicCwgIiB3aXRoICIpIDw9IDApIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGlmIChtYXNrSGFzaCkgeworICAgICAgaWYgKGkyYV9BU04xX09CSkVDVChicCwgbWFza0hhc2gtPmFsZ29yaXRobSkgPD0gMCkgeworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKEJJT19wdXRzKGJwLCAiSU5WQUxJRCIpIDw9IDApIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfSBlbHNlIGlmIChCSU9fcHV0cyhicCwgIm1nZjEgd2l0aCBzaGExIChkZWZhdWx0KSIpIDw9IDApIHsKKyAgICBnb3RvIGVycjsKKyAgfQorICBCSU9fcHV0cyhicCwgIlxuIik7CisKKyAgaWYgKCFCSU9faW5kZW50KGJwLCBpbmRlbnQsIDEyOCkgfHwKKyAgICAgIEJJT19wdXRzKGJwLCAiU2FsdCBMZW5ndGg6IDB4IikgPD0gMCkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKHBzcy0+c2FsdExlbmd0aCkgeworICAgIGlmIChpMmFfQVNOMV9JTlRFR0VSKGJwLCBwc3MtPnNhbHRMZW5ndGgpIDw9IDApIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfSBlbHNlIGlmIChCSU9fcHV0cyhicCwgIjB4MTQgKGRlZmF1bHQpIikgPD0gMCkgeworICAgIGdvdG8gZXJyOworICB9CisgIEJJT19wdXRzKGJwLCAiXG4iKTsKKworICBpZiAoIUJJT19pbmRlbnQoYnAsIGluZGVudCwgMTI4KSB8fAorICAgICAgQklPX3B1dHMoYnAsICJUcmFpbGVyIEZpZWxkOiAweCIpIDw9IDApIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmIChwc3MtPnRyYWlsZXJGaWVsZCkgeworICAgIGlmIChpMmFfQVNOMV9JTlRFR0VSKGJwLCBwc3MtPnRyYWlsZXJGaWVsZCkgPD0gMCkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICB9IGVsc2UgaWYgKEJJT19wdXRzKGJwLCAiQkMgKGRlZmF1bHQpIikgPD0gMCkgeworICAgIGdvdG8gZXJyOworICB9CisgIEJJT19wdXRzKGJwLCAiXG4iKTsKKworICBydiA9IDE7CisKK2VycjoKKyAgcmV0dXJuIHJ2OworfQorCitzdGF0aWMgaW50IHJzYV9zaWdfcHJpbnQoQklPICpicCwgY29uc3QgWDUwOV9BTEdPUiAqc2lnYWxnLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFTTjFfU1RSSU5HICpzaWcsIGludCBpbmRlbnQsIEFTTjFfUENUWCAqcGN0eCkgeworICBpZiAoT0JKX29iajJuaWQoc2lnYWxnLT5hbGdvcml0aG0pID09IE5JRF9yc2Fzc2FQc3MpIHsKKyAgICBpbnQgcnY7CisgICAgUlNBX1BTU19QQVJBTVMgKnBzczsKKyAgICBYNTA5X0FMR09SICptYXNrSGFzaDsKKworICAgIHBzcyA9IHJzYV9wc3NfZGVjb2RlKHNpZ2FsZywgJm1hc2tIYXNoKTsKKyAgICBydiA9IHJzYV9wc3NfcGFyYW1fcHJpbnQoYnAsIHBzcywgbWFza0hhc2gsIGluZGVudCk7CisgICAgaWYgKHBzcykgeworICAgICAgUlNBX1BTU19QQVJBTVNfZnJlZShwc3MpOworICAgIH0KKyAgICBpZiAobWFza0hhc2gpIHsKKyAgICAgIFg1MDlfQUxHT1JfZnJlZShtYXNrSGFzaCk7CisgICAgfQorICAgIGlmICghcnYpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfSBlbHNlIGlmICghc2lnICYmIEJJT19wdXRzKGJwLCAiXG4iKSA8PSAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoc2lnKSB7CisgICAgcmV0dXJuIFg1MDlfc2lnbmF0dXJlX2R1bXAoYnAsIHNpZywgaW5kZW50KTsKKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCByc2FfcGtleV9jdHJsKEVWUF9QS0VZICpwa2V5LCBpbnQgb3AsIGxvbmcgYXJnMSwgdm9pZCAqYXJnMikgeworICBYNTA5X0FMR09SICphbGcgPSBOVUxMOworICBzd2l0Y2ggKG9wKSB7CisgICAgY2FzZSBBU04xX1BLRVlfQ1RSTF9ERUZBVUxUX01EX05JRDoKKyAgICAgICooaW50ICopYXJnMiA9IE5JRF9zaGExOworICAgICAgcmV0dXJuIDE7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIC0yOworICB9CisKKyAgaWYgKGFsZykgeworICAgIFg1MDlfQUxHT1Jfc2V0MChhbGcsIE9CSl9uaWQyb2JqKE5JRF9yc2FFbmNyeXB0aW9uKSwgVl9BU04xX05VTEwsIDApOworICB9CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgb2xkX3JzYV9wcml2X2RlY29kZShFVlBfUEtFWSAqcGtleSwgY29uc3QgdW5zaWduZWQgY2hhciAqKnBkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlcmxlbikgeworICBSU0EgKnJzYSA9IGQyaV9SU0FQcml2YXRlS2V5KE5VTEwsIHBkZXIsIGRlcmxlbik7CisgIGlmIChyc2EgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgb2xkX3JzYV9wcml2X2RlY29kZSwgRVJSX1JfUlNBX0xJQik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgRVZQX1BLRVlfYXNzaWduX1JTQShwa2V5LCByc2EpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBvbGRfcnNhX3ByaXZfZW5jb2RlKGNvbnN0IEVWUF9QS0VZICpwa2V5LCB1bnNpZ25lZCBjaGFyICoqcGRlcikgeworICByZXR1cm4gaTJkX1JTQVByaXZhdGVLZXkocGtleS0+cGtleS5yc2EsIHBkZXIpOworfQorCisvKiBhbGxvY2F0ZSBhbmQgc2V0IGFsZ29yaXRobSBJRCBmcm9tIEVWUF9NRCwgZGVmYXVsdCBTSEExICovCitzdGF0aWMgaW50IHJzYV9tZF90b19hbGdvcihYNTA5X0FMR09SICoqcGFsZywgY29uc3QgRVZQX01EICptZCkgeworICBpZiAoRVZQX01EX3R5cGUobWQpID09IE5JRF9zaGExKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgKnBhbGcgPSBYNTA5X0FMR09SX25ldygpOworICBpZiAoISpwYWxnKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgWDUwOV9BTEdPUl9zZXRfbWQoKnBhbGcsIG1kKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qIEFsbG9jYXRlIGFuZCBzZXQgTUdGMSBhbGdvcml0aG0gSUQgZnJvbSBFVlBfTUQgKi8KK3N0YXRpYyBpbnQgcnNhX21kX3RvX21nZjEoWDUwOV9BTEdPUiAqKnBhbGcsIGNvbnN0IEVWUF9NRCAqbWdmMW1kKSB7CisgIFg1MDlfQUxHT1IgKmFsZ3RtcCA9IE5VTEw7CisgIEFTTjFfU1RSSU5HICpzdG1wID0gTlVMTDsKKyAgKnBhbGcgPSBOVUxMOworCisgIGlmIChFVlBfTURfdHlwZShtZ2YxbWQpID09IE5JRF9zaGExKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgLyogbmVlZCB0byBlbWJlZCBhbGdvcml0aG0gSUQgaW5zaWRlIGFub3RoZXIgKi8KKyAgaWYgKCFyc2FfbWRfdG9fYWxnb3IoJmFsZ3RtcCwgbWdmMW1kKSB8fAorICAgICAgIUFTTjFfaXRlbV9wYWNrKGFsZ3RtcCwgQVNOMV9JVEVNX3JwdHIoWDUwOV9BTEdPUiksICZzdG1wKSkgeworICAgIGdvdG8gZXJyOworICB9CisgICpwYWxnID0gWDUwOV9BTEdPUl9uZXcoKTsKKyAgaWYgKCEqcGFsZykgeworICAgIGdvdG8gZXJyOworICB9CisgIFg1MDlfQUxHT1Jfc2V0MCgqcGFsZywgT0JKX25pZDJvYmooTklEX21nZjEpLCBWX0FTTjFfU0VRVUVOQ0UsIHN0bXApOworICBzdG1wID0gTlVMTDsKKworZXJyOgorICBpZiAoc3RtcCkKKyAgICBBU04xX1NUUklOR19mcmVlKHN0bXApOworICBpZiAoYWxndG1wKQorICAgIFg1MDlfQUxHT1JfZnJlZShhbGd0bXApOworICBpZiAoKnBhbGcpCisgICAgcmV0dXJuIDE7CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIGNvbnZlcnQgYWxnb3JpdGhtIElEIHRvIEVWUF9NRCwgZGVmYXVsdCBTSEExICovCitzdGF0aWMgY29uc3QgRVZQX01EICpyc2FfYWxnb3JfdG9fbWQoWDUwOV9BTEdPUiAqYWxnKSB7CisgIGNvbnN0IEVWUF9NRCAqbWQ7CisgIGlmICghYWxnKSB7CisgICAgcmV0dXJuIEVWUF9zaGExKCk7CisgIH0KKyAgbWQgPSBFVlBfZ2V0X2RpZ2VzdGJ5b2JqKGFsZy0+YWxnb3JpdGhtKTsKKyAgaWYgKG1kID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIHJzYV9hbGdvcl90b19tZCwgRVZQX1JfVU5LTk9XTl9ESUdFU1QpOworICB9CisgIHJldHVybiBtZDsKK30KKworLyogY29udmVydCBNR0YxIGFsZ29yaXRobSBJRCB0byBFVlBfTUQsIGRlZmF1bHQgU0hBMSAqLworc3RhdGljIGNvbnN0IEVWUF9NRCAqcnNhX21nZjFfdG9fbWQoWDUwOV9BTEdPUiAqYWxnLCBYNTA5X0FMR09SICptYXNrSGFzaCkgeworICBjb25zdCBFVlBfTUQgKm1kOworICBpZiAoIWFsZykgeworICAgIHJldHVybiBFVlBfc2hhMSgpOworICB9CisgIC8qIENoZWNrIG1hc2sgYW5kIGxvb2t1cCBtYXNrIGhhc2ggYWxnb3JpdGhtICovCisgIGlmIChPQkpfb2JqMm5pZChhbGctPmFsZ29yaXRobSkgIT0gTklEX21nZjEpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIHJzYV9tZ2YxX3RvX21kLCBFVlBfUl9VTlNVUFBPUlRFRF9NQVNLX0FMR09SSVRITSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKCFtYXNrSGFzaCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcnNhX21nZjFfdG9fbWQsIEVWUF9SX1VOU1VQUE9SVEVEX01BU0tfUEFSQU1FVEVSKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBtZCA9IEVWUF9nZXRfZGlnZXN0YnlvYmoobWFza0hhc2gtPmFsZ29yaXRobSk7CisgIGlmIChtZCA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCByc2FfbWdmMV90b19tZCwgRVZQX1JfVU5LTk9XTl9NQVNLX0RJR0VTVCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIG1kOworfQorCisvKiByc2FfY3R4X3RvX3BzcyBjb252ZXJ0cyBFVlBfUEtFWV9DVFggaW4gUFNTIG1vZGUgaW50byBjb3JyZXNwb25kaW5nCisgKiBhbGdvcml0aG0gcGFyYW1ldGVyLCBzdWl0YWJsZSBmb3Igc2V0dGluZyBhcyBhbiBBbGdvcml0aG1JZGVudGlmaWVyLiAqLworc3RhdGljIEFTTjFfU1RSSU5HICpyc2FfY3R4X3RvX3BzcyhFVlBfUEtFWV9DVFggKnBrY3R4KSB7CisgIGNvbnN0IEVWUF9NRCAqc2lnbWQsICptZ2YxbWQ7CisgIFJTQV9QU1NfUEFSQU1TICpwc3MgPSBOVUxMOworICBBU04xX1NUUklORyAqb3MgPSBOVUxMOworICBFVlBfUEtFWSAqcGsgPSBFVlBfUEtFWV9DVFhfZ2V0MF9wa2V5KHBrY3R4KTsKKyAgaW50IHNhbHRsZW4sIHJ2ID0gMDsKKworICBpZiAoRVZQX1BLRVlfQ1RYX2dldF9zaWduYXR1cmVfbWQocGtjdHgsICZzaWdtZCkgPD0gMCB8fAorICAgICAgRVZQX1BLRVlfQ1RYX2dldF9yc2FfbWdmMV9tZChwa2N0eCwgJm1nZjFtZCkgPD0gMCB8fAorICAgICAgIUVWUF9QS0VZX0NUWF9nZXRfcnNhX3Bzc19zYWx0bGVuKHBrY3R4LCAmc2FsdGxlbikpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmIChzYWx0bGVuID09IC0xKSB7CisgICAgc2FsdGxlbiA9IEVWUF9NRF9zaXplKHNpZ21kKTsKKyAgfSBlbHNlIGlmIChzYWx0bGVuID09IC0yKSB7CisgICAgc2FsdGxlbiA9IEVWUF9QS0VZX3NpemUocGspIC0gRVZQX01EX3NpemUoc2lnbWQpIC0gMjsKKyAgICBpZiAoKChFVlBfUEtFWV9iaXRzKHBrKSAtIDEpICYgMHg3KSA9PSAwKSB7CisgICAgICBzYWx0bGVuLS07CisgICAgfQorICB9IGVsc2UgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgcHNzID0gUlNBX1BTU19QQVJBTVNfbmV3KCk7CisgIGlmICghcHNzKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAoc2FsdGxlbiAhPSAyMCkgeworICAgIHBzcy0+c2FsdExlbmd0aCA9IEFTTjFfSU5URUdFUl9uZXcoKTsKKyAgICBpZiAoIXBzcy0+c2FsdExlbmd0aCB8fAorICAgICAgICAhQVNOMV9JTlRFR0VSX3NldChwc3MtPnNhbHRMZW5ndGgsIHNhbHRsZW4pKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0KKworICBpZiAoIXJzYV9tZF90b19hbGdvcigmcHNzLT5oYXNoQWxnb3JpdGhtLCBzaWdtZCkgfHwKKyAgICAgICFyc2FfbWRfdG9fbWdmMSgmcHNzLT5tYXNrR2VuQWxnb3JpdGhtLCBtZ2YxbWQpKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICAvKiBGaW5hbGx5IGNyZWF0ZSBzdHJpbmcgd2l0aCBwc3MgcGFyYW1ldGVyIGVuY29kaW5nLiAqLworICBpZiAoIUFTTjFfaXRlbV9wYWNrKHBzcywgQVNOMV9JVEVNX3JwdHIoUlNBX1BTU19QQVJBTVMpLCAmb3MpKSB7CisgICAgZ290byBlcnI7CisgIH0KKyAgcnYgPSAxOworCitlcnI6CisgIGlmIChwc3MpCisgICAgUlNBX1BTU19QQVJBTVNfZnJlZShwc3MpOworICBpZiAocnYpCisgICAgcmV0dXJuIG9zOworICBpZiAob3MpCisgICAgQVNOMV9TVFJJTkdfZnJlZShvcyk7CisgIHJldHVybiBOVUxMOworfQorCisvKiBGcm9tIFBTUyBBbGdvcml0aG1JZGVudGlmaWVyIHNldCBwdWJsaWMga2V5IHBhcmFtZXRlcnMuIElmIHBrZXkKKyAqIGlzbid0IE5VTEwgdGhlbiB0aGUgRVZQX01EX0NUWCBpcyBzZXR1cCBhbmQgaW5pdGFsaXNlZC4gSWYgaXQKKyAqIGlzIE5VTEwgcGFyYW1ldGVycyBhcmUgcGFzc2VkIHRvIHBrY3R4IGluc3RlYWQuICovCitzdGF0aWMgaW50IHJzYV9wc3NfdG9fY3R4KEVWUF9NRF9DVFggKmN0eCwgRVZQX1BLRVlfQ1RYICpwa2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWDUwOV9BTEdPUiAqc2lnYWxnLCBFVlBfUEtFWSAqcGtleSkgeworICBpbnQgcmV0ID0gLTE7CisgIGludCBzYWx0bGVuOworICBjb25zdCBFVlBfTUQgKm1nZjFtZCA9IE5VTEwsICptZCA9IE5VTEw7CisgIFJTQV9QU1NfUEFSQU1TICpwc3M7CisgIFg1MDlfQUxHT1IgKm1hc2tIYXNoOworCisgIC8qIFNhbml0eSBjaGVjazogbWFrZSBzdXJlIGl0IGlzIFBTUyAqLworICBpZiAoT0JKX29iajJuaWQoc2lnYWxnLT5hbGdvcml0aG0pICE9IE5JRF9yc2Fzc2FQc3MpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIHJzYV9wc3NfdG9fY3R4LCBFVlBfUl9VTlNVUFBPUlRFRF9TSUdOQVRVUkVfVFlQRSk7CisgICAgcmV0dXJuIC0xOworICB9CisgIC8qIERlY29kZSBQU1MgcGFyYW1ldGVycyAqLworICBwc3MgPSByc2FfcHNzX2RlY29kZShzaWdhbGcsICZtYXNrSGFzaCk7CisgIGlmIChwc3MgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcnNhX3Bzc190b19jdHgsIEVWUF9SX0lOVkFMSURfUFNTX1BBUkFNRVRFUlMpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgbWdmMW1kID0gcnNhX21nZjFfdG9fbWQocHNzLT5tYXNrR2VuQWxnb3JpdGhtLCBtYXNrSGFzaCk7CisgIGlmICghbWdmMW1kKSB7CisgICAgZ290byBlcnI7CisgIH0KKyAgbWQgPSByc2FfYWxnb3JfdG9fbWQocHNzLT5oYXNoQWxnb3JpdGhtKTsKKyAgaWYgKCFtZCkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgc2FsdGxlbiA9IDIwOworICBpZiAocHNzLT5zYWx0TGVuZ3RoKSB7CisgICAgc2FsdGxlbiA9IEFTTjFfSU5URUdFUl9nZXQocHNzLT5zYWx0TGVuZ3RoKTsKKworICAgIC8qIENvdWxkIHBlcmZvcm0gbW9yZSBzYWx0IGxlbmd0aCBzYW5pdHkgY2hlY2tzIGJ1dCB0aGUgbWFpbgorICAgICAqIFJTQSByb3V0aW5lcyB3aWxsIHRyYXAgb3RoZXIgaW52YWxpZCB2YWx1ZXMgYW55d2F5LiAqLworICAgIGlmIChzYWx0bGVuIDwgMCkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCByc2FfcHNzX3RvX2N0eCwgRVZQX1JfSU5WQUxJRF9TQUxUX0xFTkdUSCk7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0KKworICAvKiBsb3ctbGV2ZWwgcm91dGluZXMgc3VwcG9ydCBvbmx5IHRyYWlsZXIgZmllbGQgMHhiYyAodmFsdWUgMSkKKyAgICogYW5kIFBLQ1MjMSBzYXlzIHdlIHNob3VsZCByZWplY3QgYW55IG90aGVyIHZhbHVlIGFueXdheS4gKi8KKyAgaWYgKHBzcy0+dHJhaWxlckZpZWxkICYmIEFTTjFfSU5URUdFUl9nZXQocHNzLT50cmFpbGVyRmllbGQpICE9IDEpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIHJzYV9wc3NfdG9fY3R4LCBFVlBfUl9JTlZBTElEX1RSQUlMRVIpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKHBrZXkpIHsKKyAgICBpZiAoIUVWUF9EaWdlc3RWZXJpZnlJbml0KGN0eCwgJnBrY3R4LCBtZCwgTlVMTCwgcGtleSkpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBjb25zdCBFVlBfTUQgKmNoZWNrbWQ7CisgICAgaWYgKEVWUF9QS0VZX0NUWF9nZXRfc2lnbmF0dXJlX21kKHBrY3R4LCAmY2hlY2ttZCkgPD0gMCkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICAgIGlmIChFVlBfTURfdHlwZShtZCkgIT0gRVZQX01EX3R5cGUoY2hlY2ttZCkpIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcnNhX3Bzc190b19jdHgsIEVWUF9SX0RJR0VTVF9ET0VTX05PVF9NQVRDSCk7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0KKworICBpZiAoRVZQX1BLRVlfQ1RYX3NldF9yc2FfcGFkZGluZyhwa2N0eCwgUlNBX1BLQ1MxX1BTU19QQURESU5HKSA8PSAwIHx8CisgICAgICBFVlBfUEtFWV9DVFhfc2V0X3JzYV9wc3Nfc2FsdGxlbihwa2N0eCwgc2FsdGxlbikgPD0gMCB8fAorICAgICAgRVZQX1BLRVlfQ1RYX3NldF9yc2FfbWdmMV9tZChwa2N0eCwgbWdmMW1kKSA8PSAwKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICByZXQgPSAxOworCitlcnI6CisgIFJTQV9QU1NfUEFSQU1TX2ZyZWUocHNzKTsKKyAgaWYgKG1hc2tIYXNoKSB7CisgICAgWDUwOV9BTEdPUl9mcmVlKG1hc2tIYXNoKTsKKyAgfQorICByZXR1cm4gcmV0OworfQorCisvKiBDdXN0b21pc2VkIFJTQSBpdGVtIHZlcmlmaWNhdGlvbiByb3V0aW5lLiBUaGlzIGlzIGNhbGxlZAorICogd2hlbiBhIHNpZ25hdHVyZSBpcyBlbmNvdW50ZXJlZCByZXF1aXJpbmcgc3BlY2lhbCBoYW5kbGluZy4gV2UKKyAqIGN1cnJlbnRseSBvbmx5IGhhbmRsZSBQU1MuICovCitzdGF0aWMgaW50IHJzYV9pdGVtX3ZlcmlmeShFVlBfTURfQ1RYICpjdHgsIGNvbnN0IEFTTjFfSVRFTSAqaXQsIHZvaWQgKmFzbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlfQUxHT1IgKnNpZ2FsZywgQVNOMV9CSVRfU1RSSU5HICpzaWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlBfUEtFWSAqcGtleSkgeworICAvKiBTYW5pdHkgY2hlY2s6IG1ha2Ugc3VyZSBpdCBpcyBQU1MgKi8KKyAgaWYgKE9CSl9vYmoybmlkKHNpZ2FsZy0+YWxnb3JpdGhtKSAhPSBOSURfcnNhc3NhUHNzKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCByc2FfaXRlbV92ZXJpZnksIEVWUF9SX1VOU1VQUE9SVEVEX1NJR05BVFVSRV9UWVBFKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaWYgKHJzYV9wc3NfdG9fY3R4KGN0eCwgTlVMTCwgc2lnYWxnLCBwa2V5KSkgeworICAgIC8qIENhcnJ5IG9uICovCisgICAgcmV0dXJuIDI7CisgIH0KKworICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgcnNhX2l0ZW1fc2lnbihFVlBfTURfQ1RYICpjdHgsIGNvbnN0IEFTTjFfSVRFTSAqaXQsIHZvaWQgKmFzbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBYNTA5X0FMR09SICphbGcxLCBYNTA5X0FMR09SICphbGcyLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFTTjFfQklUX1NUUklORyAqc2lnKSB7CisgIGludCBwYWRfbW9kZTsKKyAgRVZQX1BLRVlfQ1RYICpwa2N0eCA9IGN0eC0+cGN0eDsKKyAgaWYgKEVWUF9QS0VZX0NUWF9nZXRfcnNhX3BhZGRpbmcocGtjdHgsICZwYWRfbW9kZSkgPD0gMCkgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChwYWRfbW9kZSA9PSBSU0FfUEtDUzFfUEFERElORykgeworICAgIHJldHVybiAyOworICB9CisgIGlmIChwYWRfbW9kZSA9PSBSU0FfUEtDUzFfUFNTX1BBRERJTkcpIHsKKyAgICBBU04xX1NUUklORyAqb3MxID0gcnNhX2N0eF90b19wc3MocGtjdHgpOworICAgIGlmICghb3MxKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLyogRHVwbGljYXRlIHBhcmFtZXRlcnMgaWYgd2UgaGF2ZSB0byAqLworICAgIGlmIChhbGcyKSB7CisgICAgICBBU04xX1NUUklORyAqb3MyID0gQVNOMV9TVFJJTkdfZHVwKG9zMSk7CisgICAgICBpZiAoIW9zMikgeworICAgICAgICBBU04xX1NUUklOR19mcmVlKG9zMSk7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgWDUwOV9BTEdPUl9zZXQwKGFsZzIsIE9CSl9uaWQyb2JqKE5JRF9yc2Fzc2FQc3MpLCBWX0FTTjFfU0VRVUVOQ0UsIG9zMik7CisgICAgfQorICAgIFg1MDlfQUxHT1Jfc2V0MChhbGcxLCBPQkpfbmlkMm9iaihOSURfcnNhc3NhUHNzKSwgVl9BU04xX1NFUVVFTkNFLCBvczEpOworICAgIHJldHVybiAzOworICB9CisgIHJldHVybiAyOworfQorCitjb25zdCBFVlBfUEtFWV9BU04xX01FVEhPRCByc2FfYXNuMV9tZXRoID0geworICBFVlBfUEtFWV9SU0EsCisgIEVWUF9QS0VZX1JTQSwKKyAgQVNOMV9QS0VZX1NJR1BBUkFNX05VTEwsCisKKyAgIlJTQSIsCisgICJPcGVuU1NMIFJTQSBtZXRob2QiLAorCisgIHJzYV9wdWJfZGVjb2RlLAorICByc2FfcHViX2VuY29kZSwKKyAgcnNhX3B1Yl9jbXAsCisgIHJzYV9wdWJfcHJpbnQsCisKKyAgcnNhX3ByaXZfZGVjb2RlLAorICByc2FfcHJpdl9lbmNvZGUsCisgIHJzYV9wcml2X3ByaW50LAorCisgIGludF9yc2Ffc2l6ZSwKKyAgcnNhX2JpdHMsCisKKyAgMCwwLDAsMCwwLDAsCisKKyAgcnNhX3NpZ19wcmludCwKKyAgaW50X3JzYV9mcmVlLAorICByc2FfcGtleV9jdHJsLAorCisgIG9sZF9yc2FfcHJpdl9kZWNvZGUsCisgIG9sZF9yc2FfcHJpdl9lbmNvZGUsCisKKyAgcnNhX2l0ZW1fdmVyaWZ5LAorICByc2FfaXRlbV9zaWduLAorfTsKKworY29uc3QgRVZQX1BLRVlfQVNOMV9NRVRIT0QgcnNhX2FzbjFfbWV0aF8yID0geworICBFVlBfUEtFWV9SU0EyLAorICBFVlBfUEtFWV9SU0EsCisgIEFTTjFfUEtFWV9BTElBUywKK307CmRpZmYgLS1naXQgYS9jcnlwdG8vZXZwL3Bia2RmLmMgYi9jcnlwdG8vZXZwL3Bia2RmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFiMTBmNAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9ldnAvcGJrZGYuYwpAQCAtMCwwICsxLDE0MCBAQAorLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDE5OTkuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2htYWMuaD4KKworCitpbnQgUEtDUzVfUEJLREYyX0hNQUMoY29uc3QgY2hhciAqcGFzc3dvcmQsIGludCBwYXNzd29yZF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc2FsdCwgc2l6ZV90IHNhbHRfbGVuLCB1bnNpZ25lZCBpdGVyYXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVWUF9NRCAqZGlnZXN0LCBzaXplX3Qga2V5X2xlbiwgdWludDhfdCAqb3V0X2tleSkgeworICB1aW50OF90IGRpZ2VzdF90bXBbRVZQX01BWF9NRF9TSVpFXSwgKnAsIGl0bXBbNF07CisgIHNpemVfdCBjcGxlbiwgbWRsZW4sIHRrZXlsZW4sIGs7CisgIHVuc2lnbmVkIGo7CisgIHVpbnQzMl90IGkgPSAxOworICBITUFDX0NUWCBoY3R4X3RwbCwgaGN0eDsKKworICBtZGxlbiA9IEVWUF9NRF9zaXplKGRpZ2VzdCk7CisgIEhNQUNfQ1RYX2luaXQoJmhjdHhfdHBsKTsKKyAgcCA9IG91dF9rZXk7CisgIHRrZXlsZW4gPSBrZXlfbGVuOworICBpZiAocGFzc3dvcmQgPT0gTlVMTCkgeworICAgIHBhc3N3b3JkX2xlbiA9IDA7CisgIH0gZWxzZSBpZiAocGFzc3dvcmRfbGVuID09IC0xKSB7CisgICAgLyogVE9ETyhmb3JrKTogcmVtb3ZlIHRoaXMgaGFjay4gVGhlIE9wZW5TU0wgY29kZSB0b29rIHRoZSBzdHJsZW4gd2hlbiB0aGUKKyAgICAgKiBsZW5ndGggaXMgZ2l2ZW4gYXMgLTEuICovCisgICAgcGFzc3dvcmRfbGVuID0gc3RybGVuKHBhc3N3b3JkKTsKKyAgfQorICBpZiAoIUhNQUNfSW5pdF9leCgmaGN0eF90cGwsIHBhc3N3b3JkLCBwYXNzd29yZF9sZW4sIGRpZ2VzdCwgTlVMTCkpIHsKKyAgICBITUFDX0NUWF9jbGVhbnVwKCZoY3R4X3RwbCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgd2hpbGUgKHRrZXlsZW4pIHsKKyAgICBpZiAodGtleWxlbiA+IG1kbGVuKSB7CisgICAgICBjcGxlbiA9IG1kbGVuOworICAgIH0gZWxzZSB7CisgICAgICBjcGxlbiA9IHRrZXlsZW47CisgICAgfQorICAgIC8qIFdlIGFyZSB1bmxpa2VseSB0byBldmVyIHVzZSBtb3JlIHRoYW4gMjU2IGJsb2NrcyAoNTEyMCBiaXRzISkKKyAgICAgKiBidXQganVzdCBpbiBjYXNlLi4uICovCisgICAgaXRtcFswXSA9ICh1aW50OF90KSgoaSA+PiAyNCkgJiAweGZmKTsKKyAgICBpdG1wWzFdID0gKHVpbnQ4X3QpKChpID4+IDE2KSAmIDB4ZmYpOworICAgIGl0bXBbMl0gPSAodWludDhfdCkoKGkgPj4gOCkgJiAweGZmKTsKKyAgICBpdG1wWzNdID0gKHVpbnQ4X3QpKGkgJiAweGZmKTsKKyAgICBpZiAoIUhNQUNfQ1RYX2NvcHkoJmhjdHgsICZoY3R4X3RwbCkpIHsKKyAgICAgIEhNQUNfQ1RYX2NsZWFudXAoJmhjdHhfdHBsKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoIUhNQUNfVXBkYXRlKCZoY3R4LCBzYWx0LCBzYWx0X2xlbikgfHwKKyAgICAgICAgIUhNQUNfVXBkYXRlKCZoY3R4LCBpdG1wLCA0KSB8fAorICAgICAgICAhSE1BQ19GaW5hbCgmaGN0eCwgZGlnZXN0X3RtcCwgTlVMTCkpIHsKKyAgICAgIEhNQUNfQ1RYX2NsZWFudXAoJmhjdHhfdHBsKTsKKyAgICAgIEhNQUNfQ1RYX2NsZWFudXAoJmhjdHgpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIEhNQUNfQ1RYX2NsZWFudXAoJmhjdHgpOworICAgIG1lbWNweShwLCBkaWdlc3RfdG1wLCBjcGxlbik7CisgICAgZm9yIChqID0gMTsgaiA8IGl0ZXJhdGlvbnM7IGorKykgeworICAgICAgaWYgKCFITUFDX0NUWF9jb3B5KCZoY3R4LCAmaGN0eF90cGwpKSB7CisgICAgICAgIEhNQUNfQ1RYX2NsZWFudXAoJmhjdHhfdHBsKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBpZiAoIUhNQUNfVXBkYXRlKCZoY3R4LCBkaWdlc3RfdG1wLCBtZGxlbikgfHwKKyAgICAgICAgICAhSE1BQ19GaW5hbCgmaGN0eCwgZGlnZXN0X3RtcCwgTlVMTCkpIHsKKyAgICAgICAgSE1BQ19DVFhfY2xlYW51cCgmaGN0eF90cGwpOworICAgICAgICBITUFDX0NUWF9jbGVhbnVwKCZoY3R4KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBITUFDX0NUWF9jbGVhbnVwKCZoY3R4KTsKKyAgICAgIGZvciAoayA9IDA7IGsgPCBjcGxlbjsgaysrKSB7CisgICAgICAgIHBba10gXj0gZGlnZXN0X3RtcFtrXTsKKyAgICAgIH0KKyAgICB9CisgICAgdGtleWxlbiAtPSBjcGxlbjsKKyAgICBpKys7CisgICAgcCArPSBjcGxlbjsKKyAgfQorICBITUFDX0NUWF9jbGVhbnVwKCZoY3R4X3RwbCk7CisgIHJldHVybiAxOworfQorCitpbnQgUEtDUzVfUEJLREYyX0hNQUNfU0hBMShjb25zdCBjaGFyICpwYXNzd29yZCwgaW50IHBhc3N3b3JkX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNhbHQsIHNpemVfdCBzYWx0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGl0ZXJhdGlvbnMsIHNpemVfdCBrZXlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqb3V0X2tleSkgeworICByZXR1cm4gUEtDUzVfUEJLREYyX0hNQUMocGFzc3dvcmQsIHBhc3N3b3JkX2xlbiwgc2FsdCwgc2FsdF9sZW4sIGl0ZXJhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlBfc2hhMSgpLCBrZXlfbGVuLCBvdXRfa2V5KTsKK30KZGlmZiAtLWdpdCBhL2NyeXB0by9ldnAvc2lnbi5jIGIvY3J5cHRvL2V2cC9zaWduLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMyZTVjZQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9ldnAvc2lnbi5jCkBAIC0wLDAgKzEsMTYyIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvZGlnZXN0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKworI2luY2x1ZGUgImludGVybmFsLmgiCisKKworaW50IEVWUF9TaWduSW5pdF9leChFVlBfTURfQ1RYICpjdHgsIGNvbnN0IEVWUF9NRCAqdHlwZSwgRU5HSU5FICppbXBsKSB7CisgIHJldHVybiBFVlBfRGlnZXN0SW5pdF9leChjdHgsIHR5cGUsIGltcGwpOworfQorCitpbnQgRVZQX1NpZ25Jbml0KEVWUF9NRF9DVFggKmN0eCwgY29uc3QgRVZQX01EICp0eXBlKSB7CisgIHJldHVybiBFVlBfRGlnZXN0SW5pdChjdHgsIHR5cGUpOworfQorCitpbnQgRVZQX1NpZ25VcGRhdGUoRVZQX01EX0NUWCAqY3R4LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKSB7CisgIHJldHVybiBFVlBfRGlnZXN0VXBkYXRlKGN0eCwgZGF0YSwgbGVuKTsKK30KKworaW50IEVWUF9TaWduRmluYWwoY29uc3QgRVZQX01EX0NUWCAqY3R4LCB1aW50OF90ICpzaWcsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm91dF9zaWdfbGVuLCBFVlBfUEtFWSAqcGtleSkgeworICB1aW50OF90IG1bRVZQX01BWF9NRF9TSVpFXTsKKyAgdW5zaWduZWQgaW50IG1fbGVuOworICBpbnQgcmV0ID0gMDsKKyAgRVZQX01EX0NUWCB0bXBfY3R4OworICBFVlBfUEtFWV9DVFggKnBrY3R4ID0gTlVMTDsKKyAgc2l6ZV90IHNpZ19sZW4gPSBFVlBfUEtFWV9zaXplKHBrZXkpOworCisgICpvdXRfc2lnX2xlbiA9IDA7CisgIEVWUF9NRF9DVFhfaW5pdCgmdG1wX2N0eCk7CisgIGlmICghRVZQX01EX0NUWF9jb3B5X2V4KCZ0bXBfY3R4LCBjdHgpIHx8CisgICAgICAhRVZQX0RpZ2VzdEZpbmFsX2V4KCZ0bXBfY3R4LCBtLCAmbV9sZW4pKSB7CisgICAgZ290byBvdXQ7CisgIH0KKyAgRVZQX01EX0NUWF9jbGVhbnVwKCZ0bXBfY3R4KTsKKworLyogVE9ETyhmb3JrKTogdGhpcyB1c2VkIHRvIGJlIHVzZWQgb25seSB3aXRoIFNIQS1mYW1pbHkgaGFzaGVzLiBOb3cgd2UndmUKKyAqIHJlbW92ZWQgdGhlIGZsYWcgY29tcGxldGVseS4gV2h5IHdhcyBpdCBhZGRlZCBmb3IganVzdCB0aG9zZSBoYXNoZXM/ICovCisjaWYgMAorICAgIGlmIChjdHgtPmRpZ2VzdC0+ZmxhZ3MgJiBFVlBfTURfRkxBR19QS0VZX01FVEhPRF9TSUdOQVRVUkUpIHsKKyNlbmRpZgorCisgIHBrY3R4ID0gRVZQX1BLRVlfQ1RYX25ldyhwa2V5LCBOVUxMKTsKKyAgaWYgKCFwa2N0eCB8fCBFVlBfUEtFWV9zaWduX2luaXQocGtjdHgpIDw9IDAgfHwKKyAgICAgIEVWUF9QS0VZX0NUWF9zZXRfc2lnbmF0dXJlX21kKHBrY3R4LCBjdHgtPmRpZ2VzdCkgPD0gMCB8fAorICAgICAgRVZQX1BLRVlfc2lnbihwa2N0eCwgc2lnLCAmc2lnX2xlbiwgbSwgbV9sZW4pIDw9IDApIHsKKyAgICBnb3RvIG91dDsKKyAgfQorICAqb3V0X3NpZ19sZW4gPSBzaWdfbGVuOworICByZXQgPSAxOworCitvdXQ6CisgIGlmIChwa2N0eCkgeworICAgIEVWUF9QS0VZX0NUWF9mcmVlKHBrY3R4KTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK2ludCBFVlBfVmVyaWZ5SW5pdF9leChFVlBfTURfQ1RYICpjdHgsIGNvbnN0IEVWUF9NRCAqdHlwZSwgRU5HSU5FICppbXBsKSB7CisgIHJldHVybiBFVlBfRGlnZXN0SW5pdF9leChjdHgsIHR5cGUsIGltcGwpOworfQorCitpbnQgRVZQX1ZlcmlmeUluaXQoRVZQX01EX0NUWCAqY3R4LCBjb25zdCBFVlBfTUQgKnR5cGUpIHsKKyAgcmV0dXJuIEVWUF9EaWdlc3RJbml0KGN0eCwgdHlwZSk7Cit9CisKK2ludCBFVlBfVmVyaWZ5VXBkYXRlKEVWUF9NRF9DVFggKmN0eCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbikgeworICByZXR1cm4gRVZQX0RpZ2VzdFVwZGF0ZShjdHgsIGRhdGEsIGxlbik7Cit9CisKK2ludCBFVlBfVmVyaWZ5RmluYWwoRVZQX01EX0NUWCAqY3R4LCBjb25zdCB1aW50OF90ICpzaWcsIHNpemVfdCBzaWdfbGVuLAorICAgICAgICAgICAgICAgICAgICBFVlBfUEtFWSAqcGtleSkgeworICB1aW50OF90IG1bRVZQX01BWF9NRF9TSVpFXTsKKyAgdW5zaWduZWQgaW50IG1fbGVuOworICBpbnQgcmV0ID0gMDsKKyAgRVZQX01EX0NUWCB0bXBfY3R4OworICBFVlBfUEtFWV9DVFggKnBrY3R4ID0gTlVMTDsKKworICBFVlBfTURfQ1RYX2luaXQoJnRtcF9jdHgpOworICBpZiAoIUVWUF9NRF9DVFhfY29weV9leCgmdG1wX2N0eCwgY3R4KSB8fAorICAgICAgIUVWUF9EaWdlc3RGaW5hbF9leCgmdG1wX2N0eCwgbSwgJm1fbGVuKSkgeworICAgIEVWUF9NRF9DVFhfY2xlYW51cCgmdG1wX2N0eCk7CisgICAgZ290byBvdXQ7CisgIH0KKyAgRVZQX01EX0NUWF9jbGVhbnVwKCZ0bXBfY3R4KTsKKworLyogVE9ETyhmb3JrKTogdGhpcyB1c2VkIHRvIGJlIHVzZWQgb25seSB3aXRoIFNIQS1mYW1pbHkgaGFzaGVzLiBOb3cgd2UndmUKKyAqIHJlbW92ZWQgdGhlIGZsYWcgY29tcGxldGVseS4gV2h5IHdhcyBpdCBhZGRlZCBmb3IganVzdCB0aG9zZSBoYXNoZXM/ICovCisjaWYgMAorICAgIGlmIChjdHgtPmRpZ2VzdC0+ZmxhZ3MgJiBFVlBfTURfRkxBR19QS0VZX01FVEhPRF9TSUdOQVRVUkUpIHsKKyNlbmRpZgorICBwa2N0eCA9IEVWUF9QS0VZX0NUWF9uZXcocGtleSwgTlVMTCk7CisgIGlmICghcGtjdHggfHwKKyAgICAgIEVWUF9QS0VZX3ZlcmlmeV9pbml0KHBrY3R4KSA8PSAwIHx8CisgICAgICBFVlBfUEtFWV9DVFhfc2V0X3NpZ25hdHVyZV9tZChwa2N0eCwgY3R4LT5kaWdlc3QpIDw9IDApIHsKKyAgICBnb3RvIG91dDsKKyAgfQorICByZXQgPSBFVlBfUEtFWV92ZXJpZnkocGtjdHgsIHNpZywgc2lnX2xlbiwgbSwgbV9sZW4pOworCitvdXQ6CisgIEVWUF9QS0VZX0NUWF9mcmVlKHBrY3R4KTsKKyAgcmV0dXJuIHJldDsKK30KKwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2V4X2RhdGEuYyBiL2NyeXB0by9leF9kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBiOGZmMwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9leF9kYXRhLmMKQEAgLTAsMCArMSwyMjcgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2V4X2RhdGEuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC90aHJlYWQuaD4KKworI2luY2x1ZGUgImNyeXB0b19lcnJvci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKworLyogZ2xvYmFsX2ltcGwgaXMgdGhlIGltcGxlbWVudGF0aW9uIHRoYXQgd2UgdXNlIGF0IHJ1bnRpbWUuICovCitzdGF0aWMgY29uc3QgQ1JZUFRPX0VYX0RBVEFfSU1QTCAqZ2xvYmFsX2ltcGwgPSBOVUxMOworCisvKiBleF9kYXRhX2RlZmF1bHRfaW1wbCBpcyBhIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLCBkZWZpbmVkIGluCisgKiBleF9kYXRhX2ltcGwuYy4gKi8KK2V4dGVybiBjb25zdCBDUllQVE9fRVhfREFUQV9JTVBMIGV4X2RhdGFfZGVmYXVsdF9pbXBsOworCisvKiBnZXRfaW1wbCByZXR1cm5zIHRoZSBjdXJyZW50IGV4X2RhdGEgaW1wbGVtZW50YXRhdGlvbi4gKi8KK3N0YXRpYyBjb25zdCBDUllQVE9fRVhfREFUQV9JTVBMICpnZXRfaW1wbCgpIHsKKyAgY29uc3QgQ1JZUFRPX0VYX0RBVEFfSU1QTCAqaW1wbDsKKworICBDUllQVE9fcl9sb2NrKENSWVBUT19MT0NLX0VYX0RBVEEpOworICBpbXBsID0gZ2xvYmFsX2ltcGw7CisgIENSWVBUT19yX3VubG9jayhDUllQVE9fTE9DS19FWF9EQVRBKTsKKworICBpZiAoaW1wbCAhPSBOVUxMKSB7CisgICAgcmV0dXJuIGltcGw7CisgIH0KKworICBDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX0VYX0RBVEEpOworICBpZiAoZ2xvYmFsX2ltcGwgPT0gTlVMTCkgeworICAgIGdsb2JhbF9pbXBsID0gJmV4X2RhdGFfZGVmYXVsdF9pbXBsOworICB9CisgIGltcGwgPSBnbG9iYWxfaW1wbDsKKyAgQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX0VYX0RBVEEpOworICByZXR1cm4gaW1wbDsKK30KKworaW50IENSWVBUT19nZXRfZXhfbmV3X2luZGV4KGludCBjbGFzc192YWx1ZSwgbG9uZyBhcmdsLCB2b2lkICphcmdwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSWVBUT19FWF9uZXcgKm5ld19mdW5jLCBDUllQVE9fRVhfZHVwICpkdXBfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUllQVE9fRVhfZnJlZSAqZnJlZV9mdW5jKSB7CisgIGNvbnN0IENSWVBUT19FWF9EQVRBX0lNUEwgKmNvbnN0IGltcGwgPSBnZXRfaW1wbCgpOworICByZXR1cm4gaW1wbC0+Z2V0X25ld19pbmRleChjbGFzc192YWx1ZSwgYXJnbCwgYXJncCwgbmV3X2Z1bmMsIGR1cF9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX2Z1bmMpOworfQorCitpbnQgQ1JZUFRPX3NldF9leF9kYXRhKENSWVBUT19FWF9EQVRBICphZCwgaW50IGluZGV4LCB2b2lkICp2YWwpIHsKKyAgaW50IG4sIGk7CisKKyAgaWYgKGFkLT5zayA9PSBOVUxMKSB7CisgICAgYWQtPnNrID0gc2tfdm9pZF9uZXdfbnVsbCgpOworICAgIGlmIChhZC0+c2sgPT0gTlVMTCkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ1JZUFRPLCBDUllQVE9fc2V0X2V4X2RhdGEsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIG4gPSBza192b2lkX251bShhZC0+c2spOworCisgIC8qIEFkZCBOVUxMIHZhbHVlcyB1bnRpbCB0aGUgc3RhY2sgaXMgbG9uZyBlbm91Z2guICovCisgIGZvciAoaSA9IG47IGkgPD0gaW5kZXg7IGkrKykgeworICAgIGlmICghc2tfdm9pZF9wdXNoKGFkLT5zaywgTlVMTCkpIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENSWVBUTywgQ1JZUFRPX3NldF9leF9kYXRhLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICBza192b2lkX3NldChhZC0+c2ssIGluZGV4LCB2YWwpOworICByZXR1cm4gMTsKK30KKwordm9pZCAqQ1JZUFRPX2dldF9leF9kYXRhKGNvbnN0IENSWVBUT19FWF9EQVRBICphZCwgaW50IGlkeCkgeworICBpZiAoYWQtPnNrID09IE5VTEwgfHwgaWR4ID49IHNrX3ZvaWRfbnVtKGFkLT5zaykpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gc2tfdm9pZF92YWx1ZShhZC0+c2ssIGlkeCk7Cit9CisKK2ludCBDUllQVE9fZXhfZGF0YV9uZXdfY2xhc3Modm9pZCkgeworICBjb25zdCBDUllQVE9fRVhfREFUQV9JTVBMICpjb25zdCBpbXBsID0gZ2V0X2ltcGwoKTsKKyAgcmV0dXJuIGltcGwtPm5ld19jbGFzcygpOworfQorCitpbnQgQ1JZUFRPX25ld19leF9kYXRhKGludCBjbGFzc192YWx1ZSwgdm9pZCAqb2JqLCBDUllQVE9fRVhfREFUQSAqYWQpIHsKKyAgY29uc3QgQ1JZUFRPX0VYX0RBVEFfSU1QTCAqY29uc3QgaW1wbCA9IGdldF9pbXBsKCk7CisgIHJldHVybiBpbXBsLT5uZXdfZXhfZGF0YShjbGFzc192YWx1ZSwgb2JqLCBhZCk7Cit9CisKK2ludCBDUllQVE9fZHVwX2V4X2RhdGEoaW50IGNsYXNzX3ZhbHVlLCBDUllQVE9fRVhfREFUQSAqdG8sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENSWVBUT19FWF9EQVRBICpmcm9tKSB7CisgIGNvbnN0IENSWVBUT19FWF9EQVRBX0lNUEwgKmNvbnN0IGltcGwgPSBnZXRfaW1wbCgpOworICByZXR1cm4gaW1wbC0+ZHVwX2V4X2RhdGEoY2xhc3NfdmFsdWUsIHRvLCBmcm9tKTsKK30KKwordm9pZCBDUllQVE9fZnJlZV9leF9kYXRhKGludCBjbGFzc192YWx1ZSwgdm9pZCAqb2JqLCBDUllQVE9fRVhfREFUQSAqYWQpIHsKKyAgY29uc3QgQ1JZUFRPX0VYX0RBVEFfSU1QTCAqY29uc3QgaW1wbCA9IGdldF9pbXBsKCk7CisgIGltcGwtPmZyZWVfZXhfZGF0YShjbGFzc192YWx1ZSwgb2JqLCBhZCk7Cit9CisKK2NvbnN0IENSWVBUT19FWF9EQVRBX0lNUEwgKkNSWVBUT19nZXRfZXhfZGF0YV9pbXBsZW1lbnRhdGlvbih2b2lkKSB7CisgIHJldHVybiBnZXRfaW1wbCgpOworfQorCitpbnQgQ1JZUFRPX3NldF9leF9kYXRhX2ltcGxlbWVudGF0aW9uKGNvbnN0IENSWVBUT19FWF9EQVRBX0lNUEwgKmltcGwpIHsKKyAgaW50IHJldCA9IDA7CisKKyAgQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19FWF9EQVRBKTsKKyAgaWYgKGdsb2JhbF9pbXBsID09IE5VTEwpIHsKKyAgICByZXQgPSAxOworICAgIGdsb2JhbF9pbXBsID0gaW1wbDsKKyAgfQorICBDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfRVhfREFUQSk7CisKKyAgcmV0dXJuIHJldDsKK30KKwordm9pZCBDUllQVE9fY2xlYW51cF9hbGxfZXhfZGF0YSh2b2lkKSB7CisgIGNvbnN0IENSWVBUT19FWF9EQVRBX0lNUEwgKmNvbnN0IGltcGwgPSBnZXRfaW1wbCgpOworICBpbXBsLT5jbGVhbnVwKCk7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vZXhfZGF0YS5oIGIvY3J5cHRvL2V4X2RhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGZlNWNmCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2V4X2RhdGEuaApAQCAtMCwwICsxLDI5NSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAxIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4gKi8KKworI2lmbmRlZiBPUEVOU1NMX0hFQURFUl9FWF9EQVRBX0gKKyNkZWZpbmUgT1BFTlNTTF9IRUFERVJfRVhfREFUQV9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jhc2UuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvc3RhY2suaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIGV4X2RhdGEgaXMgYSBtZWNoYW5pc20gZm9yIGFzc29jaWF0aW5nIGFyYml0cmFyeSBleHRyYSBkYXRhIHdpdGggb2JqZWN0cy4KKyAqIFRoZSBkaWZmZXJlbnQgdHlwZXMgb2Ygb2JqZWN0cyB3aGljaCBjYW4gaGF2ZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGVtIGFyZQorICogY2FsbGVkICJjbGFzc2VzIiBhbmQgdGhlcmUgYXJlIHByZWRlZmluZWQgY2xhc3NlcyBmb3IgYWxsIHRoZSBPcGVuU1NMCisgKiBvYmplY3RzIHRoYXQgc3VwcG9ydCBleF9kYXRhLgorICoKKyAqIFdpdGhpbiBhIGdpdmVuIGNsYXNzLCBkaWZmZXJlbnQgdXNlcnMgY2FuIGJlIGFzc2lnbmVkIGluZGV4ZXMgaW4gd2hpY2ggdG8KKyAqIHN0b3JlIHRoZWlyIGRhdGEuIEVhY2ggaW5kZXggaGFzIGNhbGxiYWNrIGZ1bmN0aW9ucyB0aGF0IGFyZSBjYWxsZWQgd2hlbiBhCisgKiBuZXcgb2JqZWN0IG9mIHRoYXQgdHlwZSBpcyBjcmVhdGVkLCBmcmVlZCBhbmQgZHVwbGljYXRlZC4gKi8KKworCit0eXBlZGVmIHN0cnVjdCBjcnlwdG9fZXhfZGF0YV9zdCBDUllQVE9fRVhfREFUQTsKKworLyogQ1JZUFRPX0VYX25ldyBpcyB0aGUgdHlwZSBvZiBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW5ldmVyIGEKKyAqIG5ldyBvYmplY3Qgb2YgYSBnaXZlbiBjbGFzcyBpcyBjcmVhdGVkLiBGb3IgZXhhbXBsZSwgaWYgdGhpcyBjYWxsYmFjayBoYXMKKyAqIGJlZW4gcGFzc2VkIHRvIHxDUllQVE9fZ2V0X2V4X25ld19pbmRleHwgd2l0aCBhIHxjbGFzc3wgb2YKKyAqIHxDUllQVE9fRVhfSU5ERVhfU1NMfCB0aGVuIGl0J2xsIGJlIGNhbGxlZCBlYWNoIHRpbWUgYW4gU1NMKiBpcyBjcmVhdGVkLgorICoKKyAqIFRoZSBjYWxsYmFjayBpcyBwYXNzZWQgdGhlIG5ldyBvYmplY3QgKGkuZS4gdGhlIFNTTCopIGluIHxwYXJlbnR8LiBUaGUKKyAqIGFyZ3VtZW50cyB8YXJnbHwgYW5kIHxhcmdwfCBjb250YWluIG9wYXF1ZSB2YWx1ZXMgdGhhdCB3ZXJlIGdpdmVuIHRvCisgKiB8Q1JZUFRPX2dldF9leF9uZXdfaW5kZXh8LiBUaGUgY2FsbGJhY2sgc2hvdWxkIHJldHVybiBvbmUgb24gc3VjY2VzcywgYnV0CisgKiB0aGUgdmFsdWUgaXMgaWdub3JlZC4KKyAqCisgKiBUT0RPKGZvcmspOiB0aGUgfHB0cnwgYXJndW1lbnQgaXMgYWx3YXlzIE5VTEwsIG5vPyAqLwordHlwZWRlZiBpbnQgQ1JZUFRPX0VYX25ldyh2b2lkICpwYXJlbnQsIHZvaWQgKnB0ciwgQ1JZUFRPX0VYX0RBVEEgKmFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIGxvbmcgYXJnbCwgdm9pZCAqYXJncCk7CisKKy8qIENSWVBUT19FWF9mcmVlIGlzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiBhbiBvYmplY3Qgb2YgdGhlCisgKiBjbGFzcyBpcyBiZWluZyBkZXN0cm95ZWQuIFNlZSB8Q1JZUFRPX0VYX25ld3wgZm9yIGEgZGlzY3Vzc2lvbiBvZiB0aGUKKyAqIGFyZ3VtZW50cy4KKyAqCisgKiBJZiB8Q1JZUFRPX2dldF9leF9uZXdfaW5kZXh8IHdhcyBjYWxsZWQgYWZ0ZXIgdGhlIGNyZWF0aW9uIG9mIG9iamVjdHMgb2YgdGhlCisgKiBjbGFzcyB0aGF0IHRoaXMgYXBwbGllcyB0byB0aGVuLCB3aGVuIHRob3NlIHRob3NlIG9iamVjdHMgYXJlIGRlc3Ryb3llZCwKKyAqIHRoaXMgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2l0aCBhIE5VTEwgdmFsdWUgZm9yIHxwdHJ8LiAqLwordHlwZWRlZiB2b2lkIENSWVBUT19FWF9mcmVlKHZvaWQgKnBhcmVudCwgdm9pZCAqcHRyLCBDUllQVE9fRVhfREFUQSAqYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LCBsb25nIGFyZ2wsIHZvaWQgKmFyZ3ApOworCisvKiBDUllQVE9fRVhfZHVwIGlzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiBhbiBvYmplY3Qgb2YgdGhlCisgKiBjbGFzcyBpcyBiZWluZyBjb3BpZWQgYW5kIHRodXMgdGhlIGV4X2RhdGEgbGlua2VkIHRvIGl0IGFsc28gbmVlZHMgdG8gYmUKKyAqIGNvcGllZC4gT24gZW50cnksIHwqZnJvbV9kfCBwb2ludHMgdG8gdGhlIGRhdGEgZm9yIHRoaXMgaW5kZXggZnJvbSB0aGUKKyAqIG9yaWdpbmFsIG9iamVjdC4gV2hlbiB0aGUgY2FsbGJhY2sgcmV0dXJucywgfCpmcm9tX2R8IHdpbGwgYmUgc2V0IGFzIHRoZQorICogZGF0YSBmb3IgdGhpcyBpbmRleCBpbiB8dG98LgorICoKKyAqIElmIHxDUllQVE9fZ2V0X2V4X25ld19pbmRleHwgd2FzIGNhbGxlZCBhZnRlciB0aGUgY3JlYXRpb24gb2Ygb2JqZWN0cyBvZiB0aGUKKyAqIGNsYXNzIHRoYXQgdGhpcyBhcHBsaWVzIHRvIHRoZW4sIHdoZW4gdGhvc2UgdGhvc2Ugb2JqZWN0cyBhcmUgY29waWVzLCB0aGlzCisgKiBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB3aXRoIGEgTlVMTCB2YWx1ZSBmb3IgfCpmcm9tX2R8LiAqLwordHlwZWRlZiBpbnQgQ1JZUFRPX0VYX2R1cChDUllQVE9fRVhfREFUQSAqdG8sIGNvbnN0IENSWVBUT19FWF9EQVRBICpmcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqZnJvbV9kLCBpbnQgaW5kZXgsIGxvbmcgYXJnbCwgdm9pZCAqYXJncCk7CisKKy8qIENSWVBUT19nZXRfZXhfbmV3X2luZGV4IGFsbG9jYXRlcyBhIG5ldyBpbmRleCBmb3IgZXhfZGF0YSBsaW5rZWQgd2l0aAorICogb2JqZWN0cyBvZiB0aGUgZ2l2ZW4gfGNsYXNzfC4gVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseSwgcmF0aGVyCisgKiBlYWNoIGNsYXNzIG9mIG9iamVjdCBzaG91bGQgcHJvdmlkZSBhIHdyYXBwZXIgZnVuY3Rpb24gdGhhdCBzZXRzCisgKiB8Y2xhc3NfdmFsdWV8IGNvcnJlY3RseS4KKyAqCisgKiBUaGUgfGNsYXNzX3ZhbHVlfCBhcmd1bWVudCBzaG91bGQgYmUgb25lIG9mIHxDUllQVE9fRVhfSU5ERVhfKnwgb3IgYQorICogdXNlci1kZWZpbmVkIGNsYXNzIHZhbHVlIHJldHVybmVkIGZyb20gfENSWVBUT19leF9kYXRhX25ld19jbGFzc3wuCisgKgorICogU2VlIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIGNhbGxiYWNrIHR5cGVkZWZzIGZvciBkZXRhaWxzIG9mIHdoZW4gdGhleSBhcmUKKyAqIGNhbGxlZC4gQW55IG9mIHRoZSBjYWxsYmFjayBhcmd1bWVudHMgbWF5IGJlIE5VTEwuIFRoZSB8YXJnbHwgYW5kIHxhcmdwfAorICogYXJndW1lbnRzIGFyZSBvcGFxdWUgdmFsdWVzIHRoYXQgYXJlIHBhc3NlZCB0byB0aGUgY2FsbGJhY2tzLgorICoKKyAqIEl0IHJldHVybnMgdGhlIG5ldyBpbmRleCwgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZXJyb3IuCisgKgorICogVE9ETyhmb3JrKTogdGhpcyBzaG91bGQgZm9sbG93IHRoZSBzdGFuZGFyZCBjYWxsaW5nIGNvbnZlbnRpb24uCisgKgorICogVE9ETyhmb3JrKTogcmVwbGFjZSB0aGUgY2xhc3NfdmFsdWUgd2l0aCBhIHBvaW50ZXIgdG8gRVhfQ0xBU1NfSVRFTS4gU2F2ZXMKKyAqIGhhdmluZyB0aGF0IGhhc2ggdGFibGUgYW5kIHNvbWUgb2YgdGhlIGxvY2stYm91bmNpbmcuIE1heWJlIGhhdmUgZXZlcnkKKyAqIG1vZHVsZSBoYXZlIGEgcHJpdmF0ZSBnbG9iYWwgRVhfQ0xBU1NfSVRFTSBzb21ld2hlcmUgYW5kIGFueSBkaXJlY3QgY2FsbGVycworICogb2YgQ1JZUFRPX3tnZXQsc2V0fV9leF9kYXRheyxfaW5kZXh9IHdvdWxkIGhhdmUgdG8gYWx3YXlzIGNhbGwgdGhlCisgKiB3cmFwcGVycy4gKi8KK2ludCBDUllQVE9fZ2V0X2V4X25ld19pbmRleChpbnQgY2xhc3NfdmFsdWUsIGxvbmcgYXJnbCwgdm9pZCAqYXJncCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUllQVE9fRVhfbmV3ICpuZXdfZnVuYywgQ1JZUFRPX0VYX2R1cCAqZHVwX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JZUFRPX0VYX2ZyZWUgKmZyZWVfZnVuYyk7CisKKy8qIENSWVBUT19zZXRfZXhfZGF0YSBzZXRzIGFuIGV4dHJhIGRhdGEgcG9pbnRlciBvbiBhIGdpdmVuIG9iamVjdC4gVGhpcyBzaG91bGQKKyAqIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHksIHJhdGhlciBlYWNoIGNsYXNzIG9mIG9iamVjdCBzaG91bGQgcHJvdmlkZSBhIHdyYXBwZXIKKyAqIGZ1bmN0aW9uLgorICoKKyAqIFRoZSB8aW5kZXh8IGFyZ3VtZW50IHNob3VsZCBoYXZlIGJlZW4gcmV0dXJuZWQgZnJvbSBhIHByZXZpb3VzIGNhbGwgdG8KKyAqIHxDUllQVE9fZ2V0X2V4X25ld19pbmRleHwuICovCitpbnQgQ1JZUFRPX3NldF9leF9kYXRhKENSWVBUT19FWF9EQVRBICphZCwgaW50IGluZGV4LCB2b2lkICp2YWwpOworCisvKiBDUllQVE9fc2V0X2V4X2RhdGEgcmV0dXJuIGFuIGV4dHJhIGRhdGEgcG9pbnRlciBmb3IgYSBnaXZlbiBvYmplY3QsIG9yIE5VTEwKKyAqIGlmIG5vIHN1Y2ggaW5kZXggZXhpc3RzLiBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LCByYXRoZXIgZWFjaAorICogY2xhc3Mgb2Ygb2JqZWN0IHNob3VsZCBwcm92aWRlIGEgd3JhcHBlciBmdW5jdGlvbi4KKyAqCisgKiBUaGUgfGluZGV4fCBhcmd1bWVudCBzaG91bGQgaGF2ZSBiZWVuIHJldHVybmVkIGZyb20gYSBwcmV2aW91cyBjYWxsIHRvCisgKiB8Q1JZUFRPX2dldF9leF9uZXdfaW5kZXh8LiAqLwordm9pZCAqQ1JZUFRPX2dldF9leF9kYXRhKGNvbnN0IENSWVBUT19FWF9EQVRBICphZCwgaW50IGluZGV4KTsKKworLyogQ1JZUFRPX0VYX0lOREVYXyogYXJlIHRoZSBidWlsdC1pbiBjbGFzc2VzIG9mIG9iamVjdHMuCisgKgorICogVXNlciBkZWZpbmVkIGNsYXNzZXMgc3RhcnQgYXQgMTAwLgorICoKKyAqIFRPRE8oZm9yayk6IFdBUk5JTkc6IHRoZXNlIGFyZSBjYWxsZWQgIklOREVYIiwgYnV0IHRoZXkgYXJlbid0ISAqLworI2RlZmluZSBDUllQVE9fRVhfSU5ERVhfQklPIDAKKyNkZWZpbmUgQ1JZUFRPX0VYX0lOREVYX1NTTCAxCisjZGVmaW5lIENSWVBUT19FWF9JTkRFWF9TU0xfQ1RYIDIKKyNkZWZpbmUgQ1JZUFRPX0VYX0lOREVYX1NTTF9TRVNTSU9OIDMKKyNkZWZpbmUgQ1JZUFRPX0VYX0lOREVYX1g1MDlfU1RPUkUgNAorI2RlZmluZSBDUllQVE9fRVhfSU5ERVhfWDUwOV9TVE9SRV9DVFggNQorI2RlZmluZSBDUllQVE9fRVhfSU5ERVhfUlNBIDYKKyNkZWZpbmUgQ1JZUFRPX0VYX0lOREVYX0RTQSA3CisjZGVmaW5lIENSWVBUT19FWF9JTkRFWF9ESCA4CisjZGVmaW5lIENSWVBUT19FWF9JTkRFWF9FTkdJTkUgOQorI2RlZmluZSBDUllQVE9fRVhfSU5ERVhfWDUwOSAxMAorI2RlZmluZSBDUllQVE9fRVhfSU5ERVhfVUkgMTEKKyNkZWZpbmUgQ1JZUFRPX0VYX0lOREVYX0VDX0tFWSAxMgorI2RlZmluZSBDUllQVE9fRVhfSU5ERVhfRUNfR1JPVVAgMTMKKyNkZWZpbmUgQ1JZUFRPX0VYX0lOREVYX0NPTVAgMTQKKyNkZWZpbmUgQ1JZUFRPX0VYX0lOREVYX1NUT1JFIDE1CisKKworLyogVXNlci1kZWZpbmVkIGNsYXNzZXMgb2Ygb2JqZWN0cy4KKyAqCisgKiBDb3JlIE9wZW5TU0wgY29kZSBoYXMgcHJlZGVmaW5lZCBjbGFzcyB2YWx1ZXMgZ2l2ZW4gYWJvdmUgKHRoZQorICogfENSWVBUT19FWF9JTkRFWF8qfCB2YWx1ZXMpLiBJdCdzIHBvc3NpYmxlIHRvIGdldCBkeW5hbWljIGNsYXNzIHZhbHVlcworICogYXNzaWduZWQgZm9yIHVzZXItZGVmaW5lZCBvYmplY3RzLiAqLworCisvKiBDUllQVE9fZXhfZGF0YV9uZXdfY2xhc3MgcmV0dXJucyBhIGZyZXNoIGNsYXNzIHZhbHVlIGZvciBhIHVzZXItZGVmaW5lZCB0eXBlCisgKiB0aGF0IHdpc2hlcyB0byB1c2UgZXhfZGF0YS4KKyAqCisgKiBUT0RPKGZvcmspOiBob3BlZnVsbHkgcmVtb3ZlIHRoaXMuICovCitpbnQgQ1JZUFRPX2V4X2RhdGFfbmV3X2NsYXNzKHZvaWQpOworCisKKy8qIEVtYmVkZGluZywgYWxsb2NhdGluZyBhbmQgZnJlZWluZyB8Q1JZUFRPX0VYX0RBVEF8IHN0cnVjdHVyZXMgZm9yIG9iamVjdHMKKyAqIHRoYXQgZW1iZWQgdGhlbS4gKi8KKworLyogQ1JZUFRPX25ld19leF9kYXRhIGluaXRpYWxpc2VzIGEgbmV3bHkgYWxsb2NhdGVkIHxDUllQVE9fRVhfREFUQXwgd2hpY2ggaXMKKyAqIGVtYmVkZGVkIGluc2lkZSBvZiB8b2JqfCB3aGljaCBpcyBvZiBjbGFzcyB8Y2xhc3NfdmFsdWV8LiBSZXR1cm5zIG9uZSBvbgorICogc3VjY2VzcyBhbmQgemVybyBvdGhlcndpc2UuICovCitpbnQgQ1JZUFRPX25ld19leF9kYXRhKGludCBjbGFzc192YWx1ZSwgdm9pZCAqb2JqLCBDUllQVE9fRVhfREFUQSAqYWQpOworCisvKiBDUllQVE9fZHVwX2V4X2RhdGEgZHVwbGljYXRlcyB8ZnJvbXwgaW50byBhIGZyZXNobHkgYWxsb2NhdGVkCisgKiB8Q1JZUFRPX0VYX0RBVEF8LCB8dG98LiBCb3RoIG9mIHdoaWNoIGFyZSBpbnNpZGUgb2JqZWN0cyBvZiB0aGUgZ2l2ZW4KKyAqIGNsYXNzLiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG90aGVyd2lzZS4gKi8KK2ludCBDUllQVE9fZHVwX2V4X2RhdGEoaW50IGNsYXNzX3ZhbHVlLCBDUllQVE9fRVhfREFUQSAqdG8sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENSWVBUT19FWF9EQVRBICpmcm9tKTsKKworLyogQ1JZUFRPX2ZyZWVfZXhfZGF0YSBmcmVlcyB8YWR8LCB3aGljaCBpcyBlbWJlZGRlZCBpbnNpZGUgfG9ianwsIHdoaWNoIGlzIGFuCisgKiBvYmplY3Qgb2YgdGhlIGdpdmVuIGNsYXNzLiAqLwordm9pZCBDUllQVE9fZnJlZV9leF9kYXRhKGludCBjbGFzc192YWx1ZSwgdm9pZCAqb2JqLCBDUllQVE9fRVhfREFUQSAqYWQpOworCisKKy8qIEhhbmRsaW5nIGRpZmZlcmVudCBleF9kYXRhIGltcGxlbWVudGF0aW9ucy4gKi8KKworLyogQ1JZUFRPX0VYX0RBVEFfSU1QTCBpcyB0aGUgb3BhcXVlIHR5cGUgb2YgYW4gaW1wbGVtZW50YXRpb24gb2YgZXhfZGF0YS4gKi8KK3R5cGVkZWYgc3RydWN0IHN0X0NSWVBUT19FWF9EQVRBX0lNUEwgQ1JZUFRPX0VYX0RBVEFfSU1QTDsKKworLyogQ1JZUFRPX2dldF9leF9kYXRhX2ltcGxlbWVudGF0aW9uIHJldHVybnMgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YKKyAqIGV4X2RhdGEuICovCitjb25zdCBDUllQVE9fRVhfREFUQV9JTVBMICpDUllQVE9fZ2V0X2V4X2RhdGFfaW1wbGVtZW50YXRpb24odm9pZCk7CisKKy8qIENSWVBUT19zZXRfZXhfZGF0YV9pbXBsZW1lbnRhdGlvbiBzZXRzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBleF9kYXRhIHRvIHVzZSwKKyAqIHVubGVzcyBleF9kYXRhIGhhcyBhbHJlYWR5IGJlZW4gdXNlZCBhbmQgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KKyAqIGluc3RhbGxlZC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvdGhlcndpc2UuICovCitpbnQgQ1JZUFRPX3NldF9leF9kYXRhX2ltcGxlbWVudGF0aW9uKGNvbnN0IENSWVBUT19FWF9EQVRBX0lNUEwgKmltcGwpOworCisKKy8qIFByaXZhdGUgZnVuY3Rpb25zLiAqLworCisvKiBDUllQVE9fY2xlYW51cF9hbGxfZXhfZGF0YSBjbGVhbnMgdXAgYWxsIGV4X2RhdGEgc3RhdGUuIEl0IGFzc3VtZXMgdGhhdCBubworICogb3RoZXIgdGhyZWFkcyBhcmUgZXhlY3V0aW5nIGNvZGUgdGhhdCBtaWdodCBjYWxsIGV4X2RhdGEgZnVuY3Rpb25zLiAqLwordm9pZCBDUllQVE9fY2xlYW51cF9hbGxfZXhfZGF0YSh2b2lkKTsKKworc3RydWN0IGNyeXB0b19leF9kYXRhX3N0IHsKKyAgU1RBQ0tfT0Yodm9pZCkgKnNrOworfTsKKworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30gIC8qIGV4dGVybiBDICovCisjZW5kaWYKKworI2VuZGlmICAvKiBPUEVOU1NMX0hFQURFUl9FWF9EQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2NyeXB0by9leF9kYXRhX2ltcGwuYyBiL2NyeXB0by9leF9kYXRhX2ltcGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2QxZmFjCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2V4X2RhdGFfaW1wbC5jCkBAIC0wLDAgKzEsNDAwIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDEgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9leF9kYXRhLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9saGFzaC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zdGFjay5oPgorI2luY2x1ZGUgPG9wZW5zc2wvdGhyZWFkLmg+CisKKyNpbmNsdWRlICJjcnlwdG9fZXJyb3IuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCBjcnlwdG9fZXhfZGF0YV9mdW5jX3N0IHsKKyAgbG9uZyBhcmdsOyAgLyogQXJiaXRhcnkgbG9uZyAqLworICB2b2lkICphcmdwOyAvKiBBcmJpdGFyeSB2b2lkIHBvaW50ZXIgKi8KKyAgQ1JZUFRPX0VYX25ldyAqbmV3X2Z1bmM7CisgIENSWVBUT19FWF9mcmVlICpmcmVlX2Z1bmM7CisgIENSWVBUT19FWF9kdXAgKmR1cF9mdW5jOworfSBDUllQVE9fRVhfREFUQV9GVU5DUzsKKwordHlwZWRlZiBzdHJ1Y3Qgc3RfZXhfY2xhc3NfaXRlbSB7CisgIFNUQUNLX09GKENSWVBUT19FWF9EQVRBX0ZVTkNTKSAqbWV0aDsKKyAgaW50IGNsYXNzX3ZhbHVlOworICAvKiBUT0RPKGZvcmspOiBpc24ndCB8bWV0aF9udW18IGp1c3QgdGhlIGxlbmd0aCBvZiB8bWV0aHw/ICovCisgIGludCBtZXRoX251bTsKK30gRVhfQ0xBU1NfSVRFTTsKKworc3RhdGljIExIQVNIX09GKEVYX0NMQVNTX0lURU0pICpnbG9iYWxfY2xhc3NlcyA9IE5VTEw7CisKK3N0YXRpYyBpbnQgZ2xvYmFsX25leHRfY2xhc3MgPSAxMDA7CisKK3N0YXRpYyBpbnQgbmV3X2NsYXNzKHZvaWQpIHsKKyAgaW50IHJldDsKKyAgQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19FWF9EQVRBKTsKKyAgcmV0ID0gZ2xvYmFsX25leHRfY2xhc3MrKzsKKyAgQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX0VYX0RBVEEpOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qIGNsYXNzX2hhc2ggaXMgYSBoYXNoIGZ1bmN0aW9uIHVzZWQgYnkgYW4gTEhBU0ggb2YgfEVYX0NMQVNTX0lURU18CisgKiBzdHJ1Y3R1cmVzLiAqLworc3RhdGljIHVpbnQzMl90IGNsYXNzX2hhc2goY29uc3QgRVhfQ0xBU1NfSVRFTSAqYSkgeworICByZXR1cm4gYS0+Y2xhc3NfdmFsdWU7Cit9CisKKy8qIGNsYXNzX2NtcCBpcyBhIGNvbXBhcmlzaW9uIGZ1bmN0aW9uIGZvciBhbiBMSEFTSCBvZiB8RVhfQ0xBU1NfSVRFTXwKKyAqIHN0cnVjdHVyZXMuICovCitzdGF0aWMgaW50IGNsYXNzX2NtcChjb25zdCBFWF9DTEFTU19JVEVNICphLCBjb25zdCBFWF9DTEFTU19JVEVNICpiKSB7CisgIHJldHVybiBhLT5jbGFzc192YWx1ZSAtIGItPmNsYXNzX3ZhbHVlOworfQorCisvKiBkYXRhX2Z1bmNzX2ZyZWUgaXMgYSBjYWxsYmFjayBmdW5jdGlvbiBmcm9tIHxza19wb3BfZnJlZXwgdGhhdCBmcmVlcyBhCisgKiB8Q1JZUFRPX0VYX0RBVEFfRlVOQ1N8LiAqLworc3RhdGljIHZvaWQgZGF0YV9mdW5jc19mcmVlKENSWVBUT19FWF9EQVRBX0ZVTkNTICpmdW5jcykgeworICBPUEVOU1NMX2ZyZWUoZnVuY3MpOworfQorCisvKiBjbGFzc19mcmVlIGlzIGEgY2FsbGJhY2sgZnVuY3Rpb24gZnJvbSBsaF9kb2FsbCB0byBmcmVlIHRoZSBFWF9DTEFTU19JVEVNCisgKiBzdHJ1Y3R1cmVzLiAqLworc3RhdGljIHZvaWQgY2xhc3NfZnJlZShFWF9DTEFTU19JVEVNICppdGVtKSB7CisgIHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX3BvcF9mcmVlKGl0ZW0tPm1ldGgsIGRhdGFfZnVuY3NfZnJlZSk7Cit9CisKK3N0YXRpYyBMSEFTSF9PRihFWF9DTEFTU19JVEVNKSAqZ2V0X2NsYXNzZXMoKSB7CisgIExIQVNIX09GKEVYX0NMQVNTX0lURU0pICpyZXQ7CisKKyAgQ1JZUFRPX3JfbG9jayhDUllQVE9fTE9DS19FWF9EQVRBKTsKKyAgcmV0ID0gZ2xvYmFsX2NsYXNzZXM7CisgIENSWVBUT19yX3VubG9jayhDUllQVE9fTE9DS19FWF9EQVRBKTsKKworICBpZiAocmV0ICE9IE5VTEwpIHsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19FWF9EQVRBKTsKKyAgaWYgKGdsb2JhbF9jbGFzc2VzID09IE5VTEwpIHsKKyAgICBnbG9iYWxfY2xhc3NlcyA9IGxoX0VYX0NMQVNTX0lURU1fbmV3KGNsYXNzX2hhc2gsIGNsYXNzX2NtcCk7CisgIH0KKyAgcmV0ID0gZ2xvYmFsX2NsYXNzZXM7CisgIENSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19FWF9EQVRBKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBjbGVhbnVwKHZvaWQpIHsKKyAgTEhBU0hfT0YoRVhfQ0xBU1NfSVRFTSkgKmNsYXNzZXMgPSBnZXRfY2xhc3NlcygpOworCisgIGxoX0VYX0NMQVNTX0lURU1fZG9hbGwoY2xhc3NlcywgY2xhc3NfZnJlZSk7CisgIGxoX0VYX0NMQVNTX0lURU1fZnJlZShjbGFzc2VzKTsKKworICBnbG9iYWxfY2xhc3NlcyA9IE5VTEw7Cit9CisKK3N0YXRpYyBFWF9DTEFTU19JVEVNICpnZXRfY2xhc3MoaW50IGNsYXNzX3ZhbHVlKSB7CisgIExIQVNIX09GKEVYX0NMQVNTX0lURU0pICpjb25zdCBjbGFzc2VzID0gZ2V0X2NsYXNzZXMoKTsKKyAgRVhfQ0xBU1NfSVRFTSB0ZW1wbGF0ZSwgKmNsYXNzX2l0ZW07CisgIGludCBvayA9IDA7CisKKyAgQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19FWF9EQVRBKTsKKyAgdGVtcGxhdGUuY2xhc3NfdmFsdWUgPSBjbGFzc192YWx1ZTsKKyAgY2xhc3NfaXRlbSA9IGxoX0VYX0NMQVNTX0lURU1fcmV0cmlldmUoY2xhc3NlcywgJnRlbXBsYXRlKTsKKyAgaWYgKGNsYXNzX2l0ZW0gIT0gTlVMTCkgeworICAgIG9rID0gMTsKKyAgfSBlbHNlIHsKKyAgICBjbGFzc19pdGVtID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEVYX0NMQVNTX0lURU0pKTsKKyAgICBpZiAoY2xhc3NfaXRlbSkgeworICAgICAgY2xhc3NfaXRlbS0+Y2xhc3NfdmFsdWUgPSBjbGFzc192YWx1ZTsKKyAgICAgIGNsYXNzX2l0ZW0tPm1ldGhfbnVtID0gMDsKKyAgICAgIGNsYXNzX2l0ZW0tPm1ldGggPSBza19DUllQVE9fRVhfREFUQV9GVU5DU19uZXdfbnVsbCgpOworICAgICAgaWYgKGNsYXNzX2l0ZW0tPm1ldGggIT0gTlVMTCkgeworICAgICAgICBFWF9DTEFTU19JVEVNICpvbGRfZGF0YTsKKyAgICAgICAgb2sgPSBsaF9FWF9DTEFTU19JVEVNX2luc2VydChjbGFzc2VzLCAmb2xkX2RhdGEsIGNsYXNzX2l0ZW0pOworICAgICAgICBhc3NlcnQob2xkX2RhdGEgPT0gTlVMTCk7CisgICAgICB9CisgICAgfQorICB9CisgIENSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19FWF9EQVRBKTsKKworICBpZiAoIW9rKSB7CisgICAgaWYgKGNsYXNzX2l0ZW0pIHsKKyAgICAgIGlmIChjbGFzc19pdGVtLT5tZXRoKSB7CisgICAgICAgIHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX2ZyZWUoY2xhc3NfaXRlbS0+bWV0aCk7CisgICAgICB9CisgICAgICBPUEVOU1NMX2ZyZWUoY2xhc3NfaXRlbSk7CisgICAgICBjbGFzc19pdGVtID0gTlVMTDsKKyAgICB9CisKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDUllQVE8sIGdldF9jbGFzcywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICB9CisKKyAgcmV0dXJuIGNsYXNzX2l0ZW07Cit9CisKK3N0YXRpYyBpbnQgZ2V0X25ld19pbmRleChpbnQgY2xhc3NfdmFsdWUsIGxvbmcgYXJnbCwgdm9pZCAqYXJncCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDUllQVE9fRVhfbmV3ICpuZXdfZnVuYywgQ1JZUFRPX0VYX2R1cCAqZHVwX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1JZUFRPX0VYX2ZyZWUgKmZyZWVfZnVuYykgeworICBFWF9DTEFTU19JVEVNICpjb25zdCBpdGVtID0gZ2V0X2NsYXNzKGNsYXNzX3ZhbHVlKTsKKyAgQ1JZUFRPX0VYX0RBVEFfRlVOQ1MgKmZ1bmNzOworICBpbnQgcmV0ID0gLTE7CisKKyAgaWYgKCFpdGVtKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgZnVuY3MgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoQ1JZUFRPX0VYX0RBVEFfRlVOQ1MpKTsKKyAgaWYgKGZ1bmNzID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDUllQVE8sIGdldF9uZXdfaW5kZXgsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBmdW5jcy0+YXJnbCA9IGFyZ2w7CisgIGZ1bmNzLT5hcmdwID0gYXJncDsKKyAgZnVuY3MtPm5ld19mdW5jID0gbmV3X2Z1bmM7CisgIGZ1bmNzLT5kdXBfZnVuYyA9IGR1cF9mdW5jOworICBmdW5jcy0+ZnJlZV9mdW5jID0gZnJlZV9mdW5jOworCisgIENSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfRVhfREFUQSk7CisgIC8qIFRPRE8oZm9yayk6IHRoaXMgbG9vcCBhcHBlYXJzIHRvIG9ubHkgZXZlciBydW4gb25jZS4gKi8KKyAgd2hpbGUgKHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX251bShpdGVtLT5tZXRoKSA8PSBpdGVtLT5tZXRoX251bSkgeworICAgIGlmICghc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1NfcHVzaChpdGVtLT5tZXRoLCBOVUxMKSkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ1JZUFRPLCBnZXRfbmV3X2luZGV4LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBPUEVOU1NMX2ZyZWUoZnVuY3MpOworICAgICAgZ290byBlcnI7CisgICAgfQorICB9CisKKyAgcmV0ID0gaXRlbS0+bWV0aF9udW0rKzsKKyAgKHZvaWQpc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1Nfc2V0KGl0ZW0tPm1ldGgsIHJldCwgZnVuY3MpOworCitlcnI6CisgIENSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19FWF9EQVRBKTsKKyAgcmV0dXJuIHJldDsKK30KKworLyogZ2V0X2Z1bmNfcG9pbnRlcnMgdGFrZXMgYSBjb3B5IG9mIHRoZSBDUllQVE9fRVhfREFUQV9GVU5DUyBwb2ludGVycywgaWYgYW55LAorICogZm9yIHRoZSBnaXZlbiBjbGFzcy4gSWYgdGhlcmUgYXJlIHNvbWUgcG9pbnRlcnMsIGl0IHNldHMgfCpvdXR8IHRvIHBvaW50IHRvCisgKiBhIGZyZXNoIHN0YWNrIG9mIHRoZW0uIE90aGVyd2lzZSBpdCBzZXRzIHwqb3V0fCB0byBOVUxMLiBJdCByZXR1cm5zIG9uZSBvbgorICogc3VjY2VzcyBvciB6ZXJvIG9uIGVycm9yLiAqLworc3RhdGljIGludCBnZXRfZnVuY19wb2ludGVycyhTVEFDS19PRihDUllQVE9fRVhfREFUQV9GVU5DUykgKipvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGFzc192YWx1ZSkgeworICBFWF9DTEFTU19JVEVNICpjb25zdCBpdGVtID0gZ2V0X2NsYXNzKGNsYXNzX3ZhbHVlKTsKKyAgc2l6ZV90IG47CisKKyAgaWYgKCFpdGVtKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAqb3V0ID0gTlVMTDsKKworICAvKiBDUllQVE9fRVhfREFUQV9GVU5DUyBzdHJ1Y3R1cmVzIGFyZSBzdGF0aWMgb25jZSBzZXQsIHNvIHdlIGNhbiB0YWtlIGEKKyAgICogc2hhbGxvdyBjb3B5IG9mIHRoZSBsaXN0IHVuZGVyIGxvY2sgYW5kIHRoZW4gdXNlIHRoZSBzdHJ1Y3R1cmVzIHdpdGhvdXQKKyAgICogdGhlIGxvY2sgaGVsZC4gKi8KKyAgQ1JZUFRPX3JfbG9jayhDUllQVE9fTE9DS19FWF9EQVRBKTsKKyAgbiA9IHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX251bShpdGVtLT5tZXRoKTsKKyAgaWYgKG4gPiAwKSB7CisgICAgKm91dCA9IHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX2R1cChpdGVtLT5tZXRoKTsKKyAgfQorICBDUllQVE9fcl91bmxvY2soQ1JZUFRPX0xPQ0tfRVhfREFUQSk7CisKKyAgaWYgKG4gPiAwICYmICpvdXQgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENSWVBUTywgZ2V0X2Z1bmNfcG9pbnRlcnMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IG5ld19leF9kYXRhKGludCBjbGFzc192YWx1ZSwgdm9pZCAqb2JqLCBDUllQVE9fRVhfREFUQSAqYWQpIHsKKyAgU1RBQ0tfT0YoQ1JZUFRPX0VYX0RBVEFfRlVOQ1MpICpmdW5jX3BvaW50ZXJzOworICBzaXplX3QgaTsKKworICBhZC0+c2sgPSBOVUxMOworCisgIGlmICghZ2V0X2Z1bmNfcG9pbnRlcnMoJmZ1bmNfcG9pbnRlcnMsIGNsYXNzX3ZhbHVlKSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX251bShmdW5jX3BvaW50ZXJzKTsgaSsrKSB7CisgICAgQ1JZUFRPX0VYX0RBVEFfRlVOQ1MgKmZ1bmNfcG9pbnRlciA9CisgICAgICAgIHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX3ZhbHVlKGZ1bmNfcG9pbnRlcnMsIGkpOworICAgIGlmIChmdW5jX3BvaW50ZXItPm5ld19mdW5jKSB7CisgICAgICBmdW5jX3BvaW50ZXItPm5ld19mdW5jKG9iaiwgTlVMTCwgYWQsIGksIGZ1bmNfcG9pbnRlci0+YXJnbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY19wb2ludGVyLT5hcmdwKTsKKyAgICB9CisgIH0KKworICBza19DUllQVE9fRVhfREFUQV9GVU5DU19mcmVlKGZ1bmNfcG9pbnRlcnMpOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGR1cF9leF9kYXRhKGludCBjbGFzc192YWx1ZSwgQ1JZUFRPX0VYX0RBVEEgKnRvLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUllQVE9fRVhfREFUQSAqZnJvbSkgeworICBTVEFDS19PRihDUllQVE9fRVhfREFUQV9GVU5DUykgKmZ1bmNfcG9pbnRlcnM7CisgIHNpemVfdCBpOworCisgIGlmICghZnJvbS0+c2spIHsKKyAgICAvKiBJbiB0aGlzIGNhc2UsIHxmcm9tfCBpcyBibGFuaywgd2hpY2ggaXMgYWxzbyB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB8dG98LAorICAgICAqIHNvIHRoZXJlJ3Mgbm90aGluZyB0byBkby4gKi8KKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGlmICghZ2V0X2Z1bmNfcG9pbnRlcnMoJmZ1bmNfcG9pbnRlcnMsIGNsYXNzX3ZhbHVlKSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX251bShmdW5jX3BvaW50ZXJzKTsgaSsrKSB7CisgICAgQ1JZUFRPX0VYX0RBVEFfRlVOQ1MgKmZ1bmNfcG9pbnRlciA9CisgICAgICAgIHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX3ZhbHVlKGZ1bmNfcG9pbnRlcnMsIGkpOworICAgIHZvaWQgKnB0ciA9IENSWVBUT19nZXRfZXhfZGF0YShmcm9tLCBpKTsKKyAgICBpZiAoZnVuY19wb2ludGVyLT5kdXBfZnVuYykgeworICAgICAgZnVuY19wb2ludGVyLT5kdXBfZnVuYyh0bywgZnJvbSwgJnB0ciwgaSwgZnVuY19wb2ludGVyLT5hcmdsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jX3BvaW50ZXItPmFyZ3ApOworICAgIH0KKyAgICBDUllQVE9fc2V0X2V4X2RhdGEodG8sIGksIHB0cik7CisgIH0KKworICBza19DUllQVE9fRVhfREFUQV9GVU5DU19mcmVlKGZ1bmNfcG9pbnRlcnMpOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2V4X2RhdGEoaW50IGNsYXNzX3ZhbHVlLCB2b2lkICpvYmosIENSWVBUT19FWF9EQVRBICphZCkgeworICBTVEFDS19PRihDUllQVE9fRVhfREFUQV9GVU5DUykgKmZ1bmNfcG9pbnRlcnM7CisgIHNpemVfdCBpOworCisgIGlmICghZ2V0X2Z1bmNfcG9pbnRlcnMoJmZ1bmNfcG9pbnRlcnMsIGNsYXNzX3ZhbHVlKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBza19DUllQVE9fRVhfREFUQV9GVU5DU19udW0oZnVuY19wb2ludGVycyk7IGkrKykgeworICAgIENSWVBUT19FWF9EQVRBX0ZVTkNTICpmdW5jX3BvaW50ZXIgPQorICAgICAgICBza19DUllQVE9fRVhfREFUQV9GVU5DU192YWx1ZShmdW5jX3BvaW50ZXJzLCBpKTsKKyAgICBpZiAoZnVuY19wb2ludGVyLT5mcmVlX2Z1bmMpIHsKKyAgICAgIHZvaWQgKnB0ciA9IENSWVBUT19nZXRfZXhfZGF0YShhZCwgaSk7CisgICAgICBmdW5jX3BvaW50ZXItPmZyZWVfZnVuYyhvYmosIHB0ciwgYWQsIGksIGZ1bmNfcG9pbnRlci0+YXJnbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfcG9pbnRlci0+YXJncCk7CisgICAgfQorICB9CisKKyAgc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1NfZnJlZShmdW5jX3BvaW50ZXJzKTsKKworICBpZiAoYWQtPnNrKSB7CisgICAgc2tfdm9pZF9mcmVlKGFkLT5zayk7CisgICAgYWQtPnNrID0gTlVMTDsKKyAgfQorfQorCitjb25zdCBDUllQVE9fRVhfREFUQV9JTVBMIGV4X2RhdGFfZGVmYXVsdF9pbXBsID0geworICAgIG5ld19jbGFzcywgY2xlYW51cCwgZ2V0X25ld19pbmRleCwgbmV3X2V4X2RhdGEsIGR1cF9leF9kYXRhLCBmcmVlX2V4X2RhdGF9OwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2hlYWRlcl9yZW1vdmVkLmggYi9jcnlwdG8vaGVhZGVyX3JlbW92ZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDk3ZDhlCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2hlYWRlcl9yZW1vdmVkLmgKQEAgLTAsMCArMSwzIEBACisvKiBUaGlzIGhlYWRlciBpcyBsaW5rZWQgdG8gdW5kZXIgdGhlIG5hbWVzIG9mIHNldmVyYWwgaGVhZGVycyB0aGF0IGhhdmUgYmVlbgorICogcmVtb3ZlZC4gSXQncyBwb3NzaWJsZSB0byBwdXQgYSAjZXJyb3IgaW4gaGVyZSBpbiBvcmRlciB0byBjYXRjaCB0aGF0IGFuCisgKiBjbGVhbiB1cCBvbGRlciBjb2RlLiAqLwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2htYWMvQ01ha2VMaXN0cy50eHQgYi9jcnlwdG8vaG1hYy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjQ3YjBhCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2htYWMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxOCBAQAoraW5jbHVkZV9kaXJlY3RvcmllcyguIC4uIC4uLy4uL2luY2x1ZGUpCisKK2FkZF9saWJyYXJ5KAorCWhtYWMKKworCU9CSkVDVAorCisJaG1hYy5jCispCisKKworYWRkX2V4ZWN1dGFibGUoCisJaG1hY190ZXN0CisKKwlobWFjX3Rlc3QuYworKQorCit0YXJnZXRfbGlua19saWJyYXJpZXMoaG1hY190ZXN0IGNyeXB0bykKZGlmZiAtLWdpdCBhL2NyeXB0by9obWFjL2htYWMuYyBiL2NyeXB0by9obWFjL2htYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDM3YjllCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2htYWMvaG1hYy5jCkBAIC0wLDAgKzEsMjA4IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9obWFjLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisKKwordWludDhfdCAqSE1BQyhjb25zdCBFVlBfTUQgKmV2cF9tZCwgY29uc3Qgdm9pZCAqa2V5LCBzaXplX3Qga2V5X2xlbiwKKyAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuLCB1aW50OF90ICpvdXQsCisgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqb3V0X2xlbikgeworICBITUFDX0NUWCBjdHg7CisgIHN0YXRpYyB1aW50OF90IHN0YXRpY19vdXRfYnVmZmVyW0VWUF9NQVhfTURfU0laRV07CisKKyAgLyogT3BlblNTTCBoYXMgdHJhZGl0aW9uYWxseSBzdXBwb3J0ZWQgdXNpbmcgYSBzdGF0aWMgYnVmZmVyIGlmIHxvdXR8IGlzCisgICAqIE5VTEwuIFdlIG1haW50YWluIHRoYXQgYnV0IGRvbid0IGRvY3VtZW50IGl0LiBUaGlzIGJlaGF2aW91ciBzaG91bGQgYmUKKyAgICogY29uc2lkZXJlZCB0byBiZSBkZXByZWNhdGVkLiAqLworICBpZiAob3V0ID09IE5VTEwpIHsKKyAgICBvdXQgPSBzdGF0aWNfb3V0X2J1ZmZlcjsKKyAgfQorCisgIEhNQUNfQ1RYX2luaXQoJmN0eCk7CisgIGlmICghSE1BQ19Jbml0KCZjdHgsIGtleSwga2V5X2xlbiwgZXZwX21kKSB8fAorICAgICAgIUhNQUNfVXBkYXRlKCZjdHgsIGRhdGEsIGRhdGFfbGVuKSB8fAorICAgICAgIUhNQUNfRmluYWwoJmN0eCwgb3V0LCBvdXRfbGVuKSkgeworICAgIG91dCA9IE5VTEw7CisgIH0KKworICBITUFDX0NUWF9jbGVhbnVwKCZjdHgpOworICByZXR1cm4gb3V0OworfQorCit2b2lkIEhNQUNfQ1RYX2luaXQoSE1BQ19DVFggKmN0eCkgeworICBFVlBfTURfQ1RYX2luaXQoJmN0eC0+aV9jdHgpOworICBFVlBfTURfQ1RYX2luaXQoJmN0eC0+b19jdHgpOworICBFVlBfTURfQ1RYX2luaXQoJmN0eC0+bWRfY3R4KTsKK30KKwordm9pZCBITUFDX0NUWF9jbGVhbnVwKEhNQUNfQ1RYICpjdHgpIHsKKyAgRVZQX01EX0NUWF9jbGVhbnVwKCZjdHgtPmlfY3R4KTsKKyAgRVZQX01EX0NUWF9jbGVhbnVwKCZjdHgtPm9fY3R4KTsKKyAgRVZQX01EX0NUWF9jbGVhbnVwKCZjdHgtPm1kX2N0eCk7CisgIE9QRU5TU0xfY2xlYW5zZShjdHgsIHNpemVvZihjdHgpKTsKK30KKworaW50IEhNQUNfSW5pdF9leChITUFDX0NUWCAqY3R4LCBjb25zdCB2b2lkICprZXksIHNpemVfdCBrZXlfbGVuLAorICAgICAgICAgICAgICAgICBjb25zdCBFVlBfTUQgKm1kLCBFTkdJTkUgKmltcGwpIHsKKyAgdW5zaWduZWQgaSwgcmVzZXQgPSAwOworICB1aW50OF90IHBhZFtITUFDX01BWF9NRF9DQkxPQ0tdOworCisgIGlmIChtZCAhPSBOVUxMKSB7CisgICAgcmVzZXQgPSAxOworICAgIGN0eC0+bWQgPSBtZDsKKyAgfSBlbHNlIHsKKyAgICBtZCA9IGN0eC0+bWQ7CisgIH0KKworICBpZiAoa2V5ICE9IE5VTEwpIHsKKyAgICBzaXplX3QgYmxvY2tfc2l6ZSA9IEVWUF9NRF9ibG9ja19zaXplKG1kKTsKKyAgICByZXNldCA9IDE7CisgICAgYXNzZXJ0KGJsb2NrX3NpemUgPD0gc2l6ZW9mKGN0eC0+a2V5KSk7CisgICAgaWYgKGJsb2NrX3NpemUgPCBrZXlfbGVuKSB7CisgICAgICBpZiAoIUVWUF9EaWdlc3RJbml0X2V4KCZjdHgtPm1kX2N0eCwgbWQsIGltcGwpIHx8CisgICAgICAgICAgIUVWUF9EaWdlc3RVcGRhdGUoJmN0eC0+bWRfY3R4LCBrZXksIGtleV9sZW4pIHx8CisgICAgICAgICAgIUVWUF9EaWdlc3RGaW5hbF9leCgmKGN0eC0+bWRfY3R4KSwgY3R4LT5rZXksICZjdHgtPmtleV9sZW5ndGgpKSB7CisgICAgICAgIGdvdG8gZXJyOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBhc3NlcnQoa2V5X2xlbiA+PSAwICYmIGtleV9sZW4gPD0gc2l6ZW9mKGN0eC0+a2V5KSk7CisgICAgICBtZW1jcHkoY3R4LT5rZXksIGtleSwga2V5X2xlbik7CisgICAgICBjdHgtPmtleV9sZW5ndGggPSBrZXlfbGVuOworICAgIH0KKyAgICBpZiAoY3R4LT5rZXlfbGVuZ3RoICE9IEhNQUNfTUFYX01EX0NCTE9DSykgeworICAgICAgbWVtc2V0KCZjdHgtPmtleVtjdHgtPmtleV9sZW5ndGhdLCAwLCBzaXplb2YoY3R4LT5rZXkpIC0gY3R4LT5rZXlfbGVuZ3RoKTsKKyAgICB9CisgIH0KKworICBpZiAocmVzZXQpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgSE1BQ19NQVhfTURfQ0JMT0NLOyBpKyspIHsKKyAgICAgIHBhZFtpXSA9IDB4MzYgXiBjdHgtPmtleVtpXTsKKyAgICB9CisgICAgaWYgKCFFVlBfRGlnZXN0SW5pdF9leCgmY3R4LT5pX2N0eCwgbWQsIGltcGwpIHx8CisgICAgICAgICFFVlBfRGlnZXN0VXBkYXRlKCZjdHgtPmlfY3R4LCBwYWQsIEVWUF9NRF9ibG9ja19zaXplKG1kKSkpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBITUFDX01BWF9NRF9DQkxPQ0s7IGkrKykgeworICAgICAgcGFkW2ldID0gMHg1YyBeIGN0eC0+a2V5W2ldOworICAgIH0KKyAgICBpZiAoIUVWUF9EaWdlc3RJbml0X2V4KCZjdHgtPm9fY3R4LCBtZCwgaW1wbCkgfHwKKyAgICAgICAgIUVWUF9EaWdlc3RVcGRhdGUoJmN0eC0+b19jdHgsIHBhZCwgRVZQX01EX2Jsb2NrX3NpemUobWQpKSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICB9CisKKyAgaWYgKCFFVlBfTURfQ1RYX2NvcHlfZXgoJmN0eC0+bWRfY3R4LCAmY3R4LT5pX2N0eCkpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIHJldHVybiAxOworCitlcnI6CisgIHJldHVybiAwOworfQorCitpbnQgSE1BQ19VcGRhdGUoSE1BQ19DVFggKmN0eCwgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuKSB7CisgIHJldHVybiBFVlBfRGlnZXN0VXBkYXRlKCZjdHgtPm1kX2N0eCwgZGF0YSwgZGF0YV9sZW4pOworfQorCitpbnQgSE1BQ19GaW5hbChITUFDX0NUWCAqY3R4LCB1aW50OF90ICpvdXQsIHVuc2lnbmVkIGludCAqb3V0X2xlbikgeworICB1bnNpZ25lZCBpbnQgaTsKKyAgdWludDhfdCBidWZbRVZQX01BWF9NRF9TSVpFXTsKKworICBpZiAoIUVWUF9EaWdlc3RGaW5hbF9leCgmY3R4LT5tZF9jdHgsIGJ1ZiwgJmkpIHx8CisgICAgICAhRVZQX01EX0NUWF9jb3B5X2V4KCZjdHgtPm1kX2N0eCwgJmN0eC0+b19jdHgpIHx8CisgICAgICAhRVZQX0RpZ2VzdFVwZGF0ZSgmY3R4LT5tZF9jdHgsIGJ1ZiwgaSkgfHwKKyAgICAgICFFVlBfRGlnZXN0RmluYWxfZXgoJmN0eC0+bWRfY3R4LCBvdXQsIG91dF9sZW4pKSB7CisgICAgKm91dF9sZW4gPSAwOworICAgIHJldHVybiAwOworICB9CisKKyAgcmV0dXJuIDE7Cit9CisKK3NpemVfdCBITUFDX3NpemUoY29uc3QgSE1BQ19DVFggKmN0eCkgeworICByZXR1cm4gRVZQX01EX3NpemUoY3R4LT5tZCk7Cit9CisKK2ludCBITUFDX0NUWF9jb3B5KEhNQUNfQ1RYICpkZXN0LCBjb25zdCBITUFDX0NUWCAqc3JjKSB7CisgIGlmICghRVZQX01EX0NUWF9jb3B5KCZkZXN0LT5pX2N0eCwgJnNyYy0+aV9jdHgpIHx8CisgICAgICAhRVZQX01EX0NUWF9jb3B5KCZkZXN0LT5vX2N0eCwgJnNyYy0+b19jdHgpIHx8CisgICAgICAhRVZQX01EX0NUWF9jb3B5KCZkZXN0LT5tZF9jdHgsICZzcmMtPm1kX2N0eCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIG1lbWNweShkZXN0LT5rZXksIHNyYy0+a2V5LCBITUFDX01BWF9NRF9DQkxPQ0spOworICBkZXN0LT5rZXlfbGVuZ3RoID0gc3JjLT5rZXlfbGVuZ3RoOworICBkZXN0LT5tZCA9IHNyYy0+bWQ7CisgIHJldHVybiAxOworfQorCit2b2lkIEhNQUNfQ1RYX3NldF9mbGFncyhITUFDX0NUWCAqY3R4LCB1bnNpZ25lZCBsb25nIGZsYWdzKSB7CisgIEVWUF9NRF9DVFhfc2V0X2ZsYWdzKCZjdHgtPmlfY3R4LCBmbGFncyk7CisgIEVWUF9NRF9DVFhfc2V0X2ZsYWdzKCZjdHgtPm9fY3R4LCBmbGFncyk7CisgIEVWUF9NRF9DVFhfc2V0X2ZsYWdzKCZjdHgtPm1kX2N0eCwgZmxhZ3MpOworfQorCitpbnQgSE1BQ19Jbml0KEhNQUNfQ1RYICpjdHgsIGNvbnN0IHZvaWQgKmtleSwgaW50IGtleV9sZW4sIGNvbnN0IEVWUF9NRCAqbWQpIHsKKyAgaWYgKGtleSAmJiBtZCkgeworICAgIEhNQUNfQ1RYX2luaXQoY3R4KTsKKyAgfQorICByZXR1cm4gSE1BQ19Jbml0X2V4KGN0eCwga2V5LCBrZXlfbGVuLCBtZCwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vaG1hYy9obWFjLmggYi9jcnlwdG8vaG1hYy9obWFjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNjOTA2MQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9obWFjL2htYWMuaApAQCAtMCwwICsxLDE1NSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2lmbmRlZiBPUEVOU1NMX0hFQURFUl9ITUFDX0gKKyNkZWZpbmUgT1BFTlNTTF9IRUFERVJfSE1BQ19ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jhc2UuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvZGlnZXN0Lmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBITUFDIGNvbnRhaW5zIGZ1bmN0aW9ucyBmb3IgY29uc3RydWN0aW5nIFBSRnMgZnJvbSBNZXJrbGXigJNEYW1nw6VyZCBoYXNoCisgKiBmdW5jdGlvbnMgdXNpbmcgSE1BQy4gKi8KKworCisvKiBPbmUtc2hvdCBvcGVyYXRpb24uICovCisKKy8qIEhNQUMgY2FsY3VsYXRlcyB0aGUgSE1BQyBvZiB8ZGF0YV9sZW58IGJ5dGVzIG9mIHxkYXRhfCwgdXNpbmcgdGhlIGdpdmVuIGtleQorICogYW5kIGhhc2ggZnVuY3Rpb24sIGFuZCB3cml0ZXMgdGhlIHJlc3VsdCB0byB8b3V0fC4gT24gZW50cnksIHxvdXR8IG11c3QKKyAqIGNvbnRhaW4gfEVWUF9NQVhfTURfU0laRXwgYnl0ZXMgb2Ygc3BhY2UuIFRoZSBhY3R1YWwgbGVuZ3RoIG9mIHRoZSByZXN1bHQgaXMKKyAqIHdyaXR0ZW4gdG8gfCpvdXRfbGVufC4gSXQgcmV0dXJucyB8b3V0fCBvciBOVUxMIG9uIGVycm9yLiAqLwordWludDhfdCAqSE1BQyhjb25zdCBFVlBfTUQgKmV2cF9tZCwgY29uc3Qgdm9pZCAqa2V5LCBzaXplX3Qga2V5X2xlbiwKKyAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuLCB1aW50OF90ICpvdXQsCisgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqb3V0X2xlbik7CisKKworLyogSW5jcmVtZW50YWwgb3BlcmF0aW9uLiAqLworCisvKiBITUFDX0NUWF9pbml0IGluaXRpYWxpc2VzIHxjdHh8IGZvciB1c2UgaW4gYW4gSE1BQyBvcGVyYXRpb24uIEl0J3MgYXNzdW1lZAorICogdGhhdCBITUFDX0NUWCBvYmplY3RzIHdpbGwgYmUgYWxsb2NhdGVkIG9uIHRoZSBzdGFjayB0aHVzIG5vIGFsbG9jYXRpb24KKyAqIGZ1bmN0aW9uIGlzIHByb3ZpZGVkLiBJZiBuZWVkZWQsIGFsbG9jYXRlIHxzaXplb2YoSE1BQ19DVFgpfCBhbmQgY2FsbAorICogfEhNQUNfQ1RYX2luaXR8IG9uIGl0LiAqLwordm9pZCBITUFDX0NUWF9pbml0KEhNQUNfQ1RYICpjdHgpOworCisvKiBITUFDX0NUWF9jbGVhbnVwIGZyZWVzIGRhdGEgb3duZWQgYnkgfGN0eHwuICovCit2b2lkIEhNQUNfQ1RYX2NsZWFudXAoSE1BQ19DVFggKmN0eCk7CisKKy8qIEhNQUNfSW5pdF9leCBzZXRzIHVwIGFuIGluaXRpYWxpc2VkIHxITUFDX0NUWHwgdG8gdXNlIHxtZHwgYXMgdGhlIGhhc2gKKyAqIGZ1bmN0aW9uIGFuZCB8a2V5fCBhcyB0aGUga2V5LiBBbnkgb2YgfG1kfCBvciB8a2V5fCBjYW4gYmUgTlVMTCwgaW4gd2hpY2gKKyAqIGNhc2UgdGhlIHByZXZpb3VzIHZhbHVlIHdpbGwgYmUgdXNlZC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBvciB6ZXJvCisgKiBvdGhlcndpc2UuICovCitpbnQgSE1BQ19Jbml0X2V4KEhNQUNfQ1RYICpjdHgsIGNvbnN0IHZvaWQgKmtleSwgc2l6ZV90IGtleV9sZW4sCisgICAgICAgICAgICAgICAgIGNvbnN0IEVWUF9NRCAqbWQsIEVOR0lORSAqaW1wbCk7CisKKy8qIEhNQUNfVXBkYXRlIGhhc2hlcyB8ZGF0YV9sZW58IGJ5dGVzIGZyb20gfGRhdGF8IGludG8gdGhlIGN1cnJlbnQgSE1BQworICogb3BlcmF0aW9uIGluIHxjdHh8LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG9uIGVycm9yLiAqLworaW50IEhNQUNfVXBkYXRlKEhNQUNfQ1RYICpjdHgsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBkYXRhX2xlbik7CisKKy8qIEhNQUNfRmluYWwgY29tcGxldGVzIHRoZSBITUFDIG9wZXJhdGlvbiBpbiB8Y3R4fCBhbmQgd3JpdGVzIHRoZSByZXN1bHQgdG8KKyAqIHxvdXR8IGFuZCB0aGUgc2V0cyB8Km91dF9sZW58IHRvIHRoZSBsZW5ndGggb2YgdGhlIHJlc3VsdC4gT24gZW50cnksIHxvdXR8CisgKiBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgfEVWUF9NQVhfTURfU0laRXwgYnl0ZXMgb2Ygc3BhY2UuIEl0IHJldHVybnMgb25lIG9uCisgKiBzdWNjZXNzIG9yIHplcm8gb24gZXJyb3IuICovCitpbnQgSE1BQ19GaW5hbChITUFDX0NUWCAqY3R4LCB1aW50OF90ICpvdXQsIHVuc2lnbmVkIGludCAqb3V0X2xlbik7CisKKworLyogVXRpbGl0eSBmdW5jdGlvbnMuICovCisKKy8qIEhNQUNfc2l6ZSByZXR1cm5zIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIEhNQUMgdGhhdCB3aWxsIGJlIHByb2R1Y2VkIGJ5CisgKiB8Y3R4fC4gT24gZW50cnksIHxjdHh8IG11c3QgaGF2ZSBiZWVuIHNldHVwIHdpdGggfEhNQUNfSW5pdF9leHwuICovCitzaXplX3QgSE1BQ19zaXplKGNvbnN0IEhNQUNfQ1RYICpjdHgpOworCisvKiBITUFDX0NUWF9jb3B5IHNldHMgfGRlc3R8IGVxdWFsIHRvIHxzcmN8LiBPbiBlbnRyeSwgfGRlc3R8IG11c3QgaGF2ZSBiZWVuCisgKiBpbml0aWFsaXNlZCBieSBjYWxsaW5nIHxITUFDX0NUWF9pbml0fC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybworICogb24gZXJyb3IuICovCitpbnQgSE1BQ19DVFhfY29weShITUFDX0NUWCAqZGVzdCwgY29uc3QgSE1BQ19DVFggKnNyYyk7CisKKy8qIEhNQUNfQ1RYX3NldF9mbGFncyBPUnMgfGZsYWdzfCBpbnRvIHRoZSBmbGFncyBvZiB0aGUgdW5kZXJseWluZyBkaWdlc3RzIG9mCisgKiB8Y3R4fCwgd2hpY2ggbXVzdCBoYXZlIGJlZW4gc2V0dXAgYnkgYSBjYWxsIHRvIHxITUFDX0luaXRfZXh8LiBTZWUKKyAqIHxFVlBfTURfQ1RYX3NldF9mbGFnc3wuCisgKgorICogVE9ETyhmb3JrKTogcmVtb3ZlPyAqLwordm9pZCBITUFDX0NUWF9zZXRfZmxhZ3MoSE1BQ19DVFggKmN0eCwgdW5zaWduZWQgbG9uZyBmbGFncyk7CisKKworLyogRGVwcmVjYXRlZCBmdW5jdGlvbnMuICovCisKK2ludCBITUFDX0luaXQoSE1BQ19DVFggKmN0eCwgY29uc3Qgdm9pZCAqa2V5LCBpbnQga2V5X2xlbiwgY29uc3QgRVZQX01EICptZCk7CisKKworLyogUHJpdmF0ZSBmdW5jdGlvbnMgKi8KKworI2RlZmluZSBITUFDX01BWF9NRF9DQkxPQ0sgMTI4IC8qIGxhcmdlc3Qga25vd24gaXMgU0hBNTEyICovCisKK3N0cnVjdCBobWFjX2N0eF9zdCB7CisgIGNvbnN0IEVWUF9NRCAqbWQ7CisgIEVWUF9NRF9DVFggbWRfY3R4OworICBFVlBfTURfQ1RYIGlfY3R4OworICBFVlBfTURfQ1RYIG9fY3R4OworICB1bnNpZ25lZCBpbnQga2V5X2xlbmd0aDsKKyAgdW5zaWduZWQgY2hhciBrZXlbSE1BQ19NQVhfTURfQ0JMT0NLXTsKK30gLyogSE1BQ19DVFggKi87CisKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9ICAvKiBleHRlcm4gQyAqLworI2VuZGlmCisKKyNlbmRpZiAgLyogT1BFTlNTTF9IRUFERVJfSE1BQ19IICovCmRpZmYgLS1naXQgYS9jcnlwdG8vaG1hYy9obWFjX3Rlc3QuYyBiL2NyeXB0by9obWFjL2htYWNfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYWU0YTYKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vaG1hYy9obWFjX3Rlc3QuYwpAQCAtMCwwICsxLDE1MSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2RpZ2VzdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvaG1hYy5oPgorCisKK3N0cnVjdCB0ZXN0X3N0IHsKKyAgdW5zaWduZWQgY2hhciBrZXlbMTZdOworICB1bnNpZ25lZCBrZXlfbGVuOworICB1bnNpZ25lZCBjaGFyIGRhdGFbNjRdOworICB1bnNpZ25lZCBkYXRhX2xlbjsKKyAgY29uc3QgY2hhciAqaGV4X2RpZ2VzdDsKK307CisKKyNkZWZpbmUgTlVNX1RFU1RTIDQKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0ZXN0X3N0IGtUZXN0c1tOVU1fVEVTVFNdID0geworICB7CisgICAgIiIsIDAsICJNb3JlIHRleHQgdGVzdCB2ZWN0b3JzIHRvIHN0dWZmIHVwIEVCQ0RJQyBtYWNoaW5lcyA6LSkiLCA1NCwKKyAgICAiZTkxMzlkMWU2ZWUwNjRlZjhjZjUxNGZjN2RjODNlODYiLAorICB9LAorICB7CisgICAgeworICAgICAgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwKKyAgICAgIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsCisgICAgfSwKKyAgICAxNiwKKyAgICAiSGkgVGhlcmUiLAorICAgIDgsCisgICAgIjkyOTQ3MjdhMzYzOGJiMWMxM2Y0OGVmODE1OGJmYzlkIiwKKyAgfSwKKyAgeworICAgICJKZWZlIiwgNCwgIndoYXQgZG8geWEgd2FudCBmb3Igbm90aGluZz8iLCAyOCwKKyAgICAiNzUwYzc4M2U2YWIwYjUwM2VhYTg2ZTMxMGE1ZGI3MzgiLAorICB9LAorICB7CisgICAgeworICAgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKyAgICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisgICAgfSwKKyAgICAxNiwKKyAgICB7CisgICAgICAweGRkLCAweGRkLCAweGRkLCAweGRkLCAweGRkLCAweGRkLCAweGRkLCAweGRkLCAweGRkLCAweGRkLCAweGRkLCAweGRkLAorICAgICAgMHhkZCwgMHhkZCwgMHhkZCwgMHhkZCwgMHhkZCwgMHhkZCwgMHhkZCwgMHhkZCwgMHhkZCwgMHhkZCwgMHhkZCwgMHhkZCwKKyAgICAgIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGQsCisgICAgICAweGRkLCAweGRkLCAweGRkLCAweGRkLCAweGRkLCAweGRkLCAweGRkLCAweGRkLCAweGRkLCAweGRkLCAweGRkLCAweGRkLAorICAgICAgMHhkZCwgMHhkZCwKKyAgICB9LAorICAgIDUwLAorICAgICI1NmJlMzQ1MjFkMTQ0Yzg4ZGJiOGM3MzNmMGU4YjNmNiIsCisgIH0sCit9OworCitzdGF0aWMgY2hhciAqdG9faGV4KGNvbnN0IHVpbnQ4X3QgKm1kLCBzaXplX3QgbWRfbGVuKSB7CisgIHNpemVfdCBpOworICBzdGF0aWMgY2hhciBidWZbODBdOworCisgIGZvciAoaSA9IDA7IGkgPCBtZF9sZW47IGkrKykgeworICAgIHNwcmludGYoJihidWZbaSAqIDJdKSwgIiUwMngiLCBtZFtpXSk7CisgIH0KKyAgcmV0dXJuIGJ1ZjsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeworICB1bnNpZ25lZCBpOworICBjaGFyICpwOworICBpbnQgZXJyID0gMDsKKyAgdWludDhfdCBvdXRbRVZQX01BWF9NRF9TSVpFXTsKKyAgdW5zaWduZWQgb3V0X2xlbjsKKworICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RFU1RTOyBpKyspIHsKKyAgICBjb25zdCBzdHJ1Y3QgdGVzdF9zdCAqdGVzdCA9ICZrVGVzdHNbaV07CisKKyAgICBpZiAoTlVMTCA9PSBITUFDKEVWUF9tZDUoKSwgdGVzdC0+a2V5LCB0ZXN0LT5rZXlfbGVuLCB0ZXN0LT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgdGVzdC0+ZGF0YV9sZW4sIG91dCwgJm91dF9sZW4pKSB7CisgICAgICBwcmludGYoIiV1OiBITUFDIGZhaWxlZC5cbiIsIGkpOworICAgICAgZXJyKys7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBwID0gdG9faGV4KG91dCwgb3V0X2xlbik7CisKKyAgICBpZiAoc3RyY21wKHAsIHRlc3QtPmhleF9kaWdlc3QpICE9IDApIHsKKyAgICAgIHByaW50ZigiJXU6IGdvdCAlcyBpbnN0ZWFkIG9mICVzXG4iLCBpLCBwLCB0ZXN0LT5oZXhfZGlnZXN0KTsKKyAgICAgIGVycisrOworICAgIH0KKyAgfQorCisgIGlmIChlcnIpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHByaW50ZigiUEFTU1xuIik7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2ludGVybmFsLmggYi9jcnlwdG8vaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDY0MjM5Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2ludGVybmFsLmgKQEAgLTAsMCArMSwxMzUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuICovCisKKyNpZm5kZWYgT1BFTlNTTF9IRUFERVJfQ1JZUFRPX0lOVEVSTkFMX0gKKyNkZWZpbmUgT1BFTlNTTF9IRUFERVJfQ1JZUFRPX0lOVEVSTkFMX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvYmFzZS5oPgorCisKKy8qIHN0X0NSWVBUT19FWF9EQVRBX0lNUEwgY29udGFpbnMgYW4gZXhfZGF0YSBpbXBsZW1lbnRhdGlvbi4gU2VlIHRoZSBjb21tZW50cworICogaW4gZXhfZGF0YS5oIGZvciBkZXRhaWxzIG9mIHRoZSBiZWhhdmlvdXIgb2YgZWFjaCBvZiB0aGUgZnVuY3Rpb25zLiAqLworc3RydWN0IHN0X0NSWVBUT19FWF9EQVRBX0lNUEwgeworICBpbnQgKCpuZXdfY2xhc3MpKHZvaWQpOworICB2b2lkICgqY2xlYW51cCkodm9pZCk7CisKKyAgaW50ICgqZ2V0X25ld19pbmRleCkoaW50IGNsYXNzX3ZhbHVlLCBsb25nIGFyZ2wsIHZvaWQgKmFyZ3AsCisgICAgICAgICAgICAgICAgICAgICAgIENSWVBUT19FWF9uZXcgKm5ld19mdW5jLCBDUllQVE9fRVhfZHVwICpkdXBfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgQ1JZUFRPX0VYX2ZyZWUgKmZyZWVfZnVuYyk7CisgIGludCAoKm5ld19leF9kYXRhKShpbnQgY2xhc3NfdmFsdWUsIHZvaWQgKm9iaiwgQ1JZUFRPX0VYX0RBVEEgKmFkKTsKKyAgaW50ICgqZHVwX2V4X2RhdGEpKGludCBjbGFzc192YWx1ZSwgQ1JZUFRPX0VYX0RBVEEgKnRvLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1JZUFRPX0VYX0RBVEEgKmZyb20pOworICB2b2lkICgqZnJlZV9leF9kYXRhKShpbnQgY2xhc3NfdmFsdWUsIHZvaWQgKm9iaiwgQ1JZUFRPX0VYX0RBVEEgKmFkKTsKK307CisKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9ICAvKiBleHRlcm4gQyAqLworI2VuZGlmCisKKyNlbmRpZiAgLyogT1BFTlNTTF9IRUFERVJfQ1JZUFRPX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2NyeXB0by9saGFzaC9DTWFrZUxpc3RzLnR4dCBiL2NyeXB0by9saGFzaC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2JmMDhlCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2xoYXNoL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTcgQEAKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQorCithZGRfbGlicmFyeSgKKwlsaGFzaAorCisJT0JKRUNUCisKKwlsaGFzaC5jCispCisKK2FkZF9leGVjdXRhYmxlKAorCWxoYXNoX3Rlc3QKKworCWxoYXNoX3Rlc3QuYworKQorCit0YXJnZXRfbGlua19saWJyYXJpZXMobGhhc2hfdGVzdCBjcnlwdG8pCmRpZmYgLS1naXQgYS9jcnlwdG8vbGhhc2gvbGhhc2guYyBiL2NyeXB0by9saGFzaC9saGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MDE0ODAKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vbGhhc2gvbGhhc2guYwpAQCAtMCwwICsxLDM0NCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlICJsaGFzaC5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorCisvKiBrTWluTnVtQnVja2V0cyBpcyB0aGUgbWluaW11bSBzaXplIG9mIHRoZSBidWNrZXRzIGFycmF5IGluIGFuIHxfTEhBU0h8LiAqLworc3RhdGljIGNvbnN0IHNpemVfdCBrTWluTnVtQnVja2V0cyA9IDE2OworCisvKiBrTWF4QXZlcmFnZUNoYWluTGVuZ3RoIGNvbnRhaW5zIHRoZSBtYXhpbXVtLCBhdmVyYWdlIGNoYWluIGxlbmd0aC4gV2hlbiB0aGUKKyAqIGF2ZXJhZ2UgY2hhaW4gbGVuZ3RoIGV4Y2VlZHMgdGhpcyB2YWx1ZSwgdGhlIGhhc2ggdGFibGUgd2lsbCBiZSByZXNpemVkLiAqLworc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4QXZlcmFnZUNoYWluTGVuZ3RoID0gMjsKK3N0YXRpYyBjb25zdCBzaXplX3Qga01pbkF2ZXJhZ2VDaGFpbkxlbmd0aCA9IDE7CisKK19MSEFTSCAqbGhfbmV3KGxoYXNoX2hhc2hfZnVuYyBoYXNoLCBsaGFzaF9jbXBfZnVuYyBjb21wKSB7CisgIF9MSEFTSCAqcmV0OworCisgIHJldCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihfTEhBU0gpKTsKKyAgaWYgKHJldCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgbWVtc2V0KHJldCwgMCwgc2l6ZW9mKF9MSEFTSCkpOworCisgIHJldC0+bnVtX2J1Y2tldHMgPSBrTWluTnVtQnVja2V0czsKKyAgcmV0LT5idWNrZXRzID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKExIQVNIX0lURU0gKikgKiByZXQtPm51bV9idWNrZXRzKTsKKyAgaWYgKHJldC0+YnVja2V0cyA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9mcmVlKHJldCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgbWVtc2V0KHJldC0+YnVja2V0cywgMCwgc2l6ZW9mKExIQVNIX0lURU0gKikgKiByZXQtPm51bV9idWNrZXRzKTsKKworICByZXQtPmNvbXAgPSBjb21wOworICBpZiAocmV0LT5jb21wID09IE5VTEwpIHsKKyAgICByZXQtPmNvbXAgPSAobGhhc2hfY21wX2Z1bmMpIHN0cmNtcDsKKyAgfQorICByZXQtPmhhc2ggPSBoYXNoOworICBpZiAocmV0LT5oYXNoID09IE5VTEwpIHsKKyAgICByZXQtPmhhc2ggPSAobGhhc2hfaGFzaF9mdW5jKSBsaF9zdHJoYXNoOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKwordm9pZCBsaF9mcmVlKF9MSEFTSCAqbGgpIHsKKyAgc2l6ZV90IGk7CisgIExIQVNIX0lURU0gKm4sICpuZXh0OworCisgIGlmIChsaCA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IGxoLT5udW1fYnVja2V0czsgaSsrKSB7CisgICAgZm9yIChuID0gbGgtPmJ1Y2tldHNbaV07IG4gIT0gTlVMTDsgbiA9IG5leHQpIHsKKyAgICAgIG5leHQgPSBuLT5uZXh0OworICAgICAgT1BFTlNTTF9mcmVlKG4pOworICAgIH0KKyAgfQorCisgIE9QRU5TU0xfZnJlZShsaC0+YnVja2V0cyk7CisgIE9QRU5TU0xfZnJlZShsaCk7Cit9CisKK3NpemVfdCBsaF9udW1faXRlbXMoY29uc3QgX0xIQVNIICpsaCkgeyByZXR1cm4gbGgtPm51bV9pdGVtczsgfQorCisvKiBnZXRfbmV4dF9wdHJfYW5kX2hhc2ggcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdGhhdCBwb2ludHMgdG8gdGhlCisgKiBpdGVtIGVxdWFsIHRvIHxkYXRhfC4gSW4gb3RoZXIgd29yZHMsIGl0IHNlYXJjaGVzIGZvciBhbiBpdGVtIGVxdWFsIHRvIHxkYXRhfAorICogYW5kLCBpZiBpdCdzIGF0IHRoZSBzdGFydCBvZiBhIGNoYWluLCB0aGVuIGl0IHJldHVybnMgYSBwb2ludGVyIHRvIGFuCisgKiBlbGVtZW50IG9mIHxsaC0+YnVja2V0c3wsIG90aGVyd2lzZSBpdCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgfG5leHR8CisgKiBlbGVtZW50IG9mIHRoZSBwcmV2aW91cyBpdGVtIGluIHRoZSBjaGFpbi4gSWYgYW4gZWxlbWVudCBlcXVhbCB0byB8ZGF0YXwgaXMKKyAqIG5vdCBmb3VuZCwgaXQgcmV0dXJucyBhIHBvaW50ZXIgdGhhdCBwb2ludHMgdG8gYSBOVUxMIHBvaW50ZXIuIElmIHxvdXRfaGFzaHwKKyAqIGlzIG5vdCBOVUxMLCB0aGVuIGl0IGFsc28gcHV0cyB0aGUgaGFzaCB2YWx1ZSBvZiB8ZGF0YXwgaW4gfCpvdXRfaGFzaHwuICovCitzdGF0aWMgTEhBU0hfSVRFTSAqKmdldF9uZXh0X3B0cl9hbmRfaGFzaChjb25zdCBfTEhBU0ggKmxoLCB1aW50MzJfdCAqb3V0X2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhKSB7CisgIGNvbnN0IHVpbnQzMl90IGhhc2ggPSBsaC0+aGFzaChkYXRhKTsKKyAgTEhBU0hfSVRFTSAqY3VyLCAqKnJldDsKKworICBpZiAob3V0X2hhc2ggIT0gTlVMTCkgeworICAgICpvdXRfaGFzaCA9IGhhc2g7CisgIH0KKworICByZXQgPSAmbGgtPmJ1Y2tldHNbaGFzaCAlIGxoLT5udW1fYnVja2V0c107CisgIGZvciAoY3VyID0gKnJldDsgY3VyICE9IE5VTEw7IGN1ciA9ICpyZXQpIHsKKyAgICBpZiAobGgtPmNvbXAoY3VyLT5kYXRhLCBkYXRhKSA9PSAwKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0ID0gJmN1ci0+bmV4dDsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgKmxoX3JldHJpZXZlKGNvbnN0IF9MSEFTSCAqbGgsIGNvbnN0IHZvaWQgKmRhdGEpIHsKKyAgTEhBU0hfSVRFTSAqKm5leHRfcHRyOworCisgIG5leHRfcHRyID0gZ2V0X25leHRfcHRyX2FuZF9oYXNoKGxoLCBOVUxMLCBkYXRhKTsKKworICBpZiAoKm5leHRfcHRyID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJldHVybiAoKm5leHRfcHRyKS0+ZGF0YTsKK30KKworLyogbGhfcmVidWNrZXQgYWxsb2NhdGVzIGEgbmV3IGFycmF5IG9mIHxuZXdfbnVtX2J1Y2tldHN8IHBvaW50ZXJzIGFuZAorICogcmVkaXN0cmlidXRlcyB0aGUgZXhpc3RpbmcgaXRlbXMgaW50byBpdCBiZWZvcmUgbWFraW5nIGl0IHxsaC0+YnVja2V0c3wgYW5kCisgKiBmcmVlaW5nIHRoZSBvbGQgYXJyYXkuICovCitzdGF0aWMgdm9pZCBsaF9yZWJ1Y2tldChfTEhBU0ggKmxoLCBjb25zdCBzaXplX3QgbmV3X251bV9idWNrZXRzKSB7CisgIExIQVNIX0lURU0gKipuZXdfYnVja2V0cywgKmN1ciwgKm5leHQ7CisgIHNpemVfdCBpLCBhbGxvY19zaXplOworCisgIGFsbG9jX3NpemUgPSBzaXplb2YoTEhBU0hfSVRFTSAqKSAqIG5ld19udW1fYnVja2V0czsKKyAgaWYgKGFsbG9jX3NpemUgLyBzaXplb2YoTEhBU0hfSVRFTSopICE9IG5ld19udW1fYnVja2V0cykgeworICAgIHJldHVybjsKKyAgfQorCisgIG5ld19idWNrZXRzID0gT1BFTlNTTF9tYWxsb2MoYWxsb2Nfc2l6ZSk7CisgIGlmIChuZXdfYnVja2V0cyA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIG1lbXNldChuZXdfYnVja2V0cywgMCwgYWxsb2Nfc2l6ZSk7CisKKyAgZm9yIChpID0gMDsgaSA8IGxoLT5udW1fYnVja2V0czsgaSsrKSB7CisgICAgZm9yIChjdXIgPSBsaC0+YnVja2V0c1tpXTsgY3VyICE9IE5VTEw7IGN1ciA9IG5leHQpIHsKKyAgICAgIGNvbnN0IHNpemVfdCBuZXdfYnVja2V0ID0gY3VyLT5oYXNoICUgbmV3X251bV9idWNrZXRzOworICAgICAgbmV4dCA9IGN1ci0+bmV4dDsKKyAgICAgIGN1ci0+bmV4dCA9IG5ld19idWNrZXRzW25ld19idWNrZXRdOworICAgICAgbmV3X2J1Y2tldHNbbmV3X2J1Y2tldF0gPSBjdXI7CisgICAgfQorICB9CisKKyAgT1BFTlNTTF9mcmVlKGxoLT5idWNrZXRzKTsKKworICBsaC0+bnVtX2J1Y2tldHMgPSBuZXdfbnVtX2J1Y2tldHM7CisgIGxoLT5idWNrZXRzID0gbmV3X2J1Y2tldHM7Cit9CisKKy8qIGxoX21heWJlX3Jlc2l6ZSByZXNpemVzIHRoZSB8YnVja2V0c3wgYXJyYXkgaWYgbmVlZGVkLiAqLworc3RhdGljIHZvaWQgbGhfbWF5YmVfcmVzaXplKF9MSEFTSCAqbGgpIHsKKyAgc2l6ZV90IGF2Z19jaGFpbl9sZW5ndGg7CisKKyAgaWYgKGxoLT5jYWxsYmFja19kZXB0aCA+IDApIHsKKyAgICAvKiBEb24ndCByZXNpemUgdGhlIGhhc2ggaWYgd2UgYXJlIGN1cnJlbnRseSBpdGVyYXRpbmcgb3ZlciBpdC4gKi8KKyAgICByZXR1cm47CisgIH0KKworICBhc3NlcnQobGgtPm51bV9idWNrZXRzID49IGtNaW5OdW1CdWNrZXRzKTsKKyAgYXZnX2NoYWluX2xlbmd0aCA9IGxoLT5udW1faXRlbXMgLyBsaC0+bnVtX2J1Y2tldHM7CisKKyAgaWYgKGF2Z19jaGFpbl9sZW5ndGggPiBrTWF4QXZlcmFnZUNoYWluTGVuZ3RoKSB7CisgICAgY29uc3Qgc2l6ZV90IG5ld19udW1fYnVja2V0cyA9IGxoLT5udW1fYnVja2V0cyAqIDI7CisKKyAgICBpZiAobmV3X251bV9idWNrZXRzID4gbGgtPm51bV9idWNrZXRzKSB7CisgICAgICBsaF9yZWJ1Y2tldChsaCwgbmV3X251bV9idWNrZXRzKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoYXZnX2NoYWluX2xlbmd0aCA8IGtNaW5BdmVyYWdlQ2hhaW5MZW5ndGggJiYKKyAgICAgICAgICAgICBsaC0+bnVtX2J1Y2tldHMgPiBrTWluTnVtQnVja2V0cykgeworICAgIHNpemVfdCBuZXdfbnVtX2J1Y2tldHMgPSBsaC0+bnVtX2J1Y2tldHMgLyAyOworCisgICAgaWYgKG5ld19udW1fYnVja2V0cyA8IGtNaW5OdW1CdWNrZXRzKSB7CisgICAgICBuZXdfbnVtX2J1Y2tldHMgPSBrTWluTnVtQnVja2V0czsKKyAgICB9CisKKyAgICBsaF9yZWJ1Y2tldChsaCwgbmV3X251bV9idWNrZXRzKTsKKyAgfQorfQorCitpbnQgbGhfaW5zZXJ0KF9MSEFTSCAqbGgsIHZvaWQgKipvbGRfZGF0YSwgdm9pZCAqZGF0YSkgeworICB1aW50MzJfdCBoYXNoOworICBMSEFTSF9JVEVNICoqbmV4dF9wdHIsICppdGVtOworCisgICpvbGRfZGF0YSA9IE5VTEw7CisgIG5leHRfcHRyID0gZ2V0X25leHRfcHRyX2FuZF9oYXNoKGxoLCAmaGFzaCwgZGF0YSk7CisKKworICBpZiAoKm5leHRfcHRyICE9IE5VTEwpIHsKKyAgICAvKiBBbiBlbGVtZW50IGVxdWFsIHRvIHxkYXRhfCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgaGFzaCB0YWJsZS4gSXQgd2lsbCBiZQorICAgICAqIHJlcGxhY2VkLiAqLworICAgICpvbGRfZGF0YSA9ICgqbmV4dF9wdHIpLT5kYXRhOworICAgICgqbmV4dF9wdHIpLT5kYXRhID0gZGF0YTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIC8qIEFuIGVsZW1lbnQgZXF1YWwgdG8gfGRhdGF8IGRvZXNuJ3QgZXhpc3QgaW4gdGhlIGhhc2ggdGFibGUgeWV0LiAqLworICBpdGVtID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKExIQVNIX0lURU0pKTsKKyAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgaXRlbS0+ZGF0YSA9IGRhdGE7CisgIGl0ZW0tPmhhc2ggPSBoYXNoOworICBpdGVtLT5uZXh0ID0gTlVMTDsKKyAgKm5leHRfcHRyID0gaXRlbTsKKyAgbGgtPm51bV9pdGVtcysrOworICBsaF9tYXliZV9yZXNpemUobGgpOworCisgIHJldHVybiAxOworfQorCit2b2lkICpsaF9kZWxldGUoX0xIQVNIICpsaCwgY29uc3Qgdm9pZCAqZGF0YSkgeworICBMSEFTSF9JVEVNICoqbmV4dF9wdHIsICppdGVtLCAqcmV0OworCisgIG5leHRfcHRyID0gZ2V0X25leHRfcHRyX2FuZF9oYXNoKGxoLCBOVUxMLCBkYXRhKTsKKworICBpZiAoKm5leHRfcHRyID09IE5VTEwpIHsKKyAgICAvKiBObyBzdWNoIGVsZW1lbnQuICovCisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBpdGVtID0gKm5leHRfcHRyOworICAqbmV4dF9wdHIgPSBpdGVtLT5uZXh0OworICByZXQgPSBpdGVtLT5kYXRhOworICBPUEVOU1NMX2ZyZWUoaXRlbSk7CisKKyAgbGgtPm51bV9pdGVtcy0tOworICBsaF9tYXliZV9yZXNpemUobGgpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGxoX2RvYWxsX2ludGVybmFsKF9MSEFTSCAqbGgsIHZvaWQgKCpub19hcmdfZnVuYykodm9pZCAqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCphcmdfZnVuYykodm9pZCAqLCB2b2lkICopLCB2b2lkICphcmcpIHsKKyAgc2l6ZV90IGk7CisgIExIQVNIX0lURU0gKmN1ciwgKm5leHQ7CisKKyAgaWYgKGxoID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAobGgtPmNhbGxiYWNrX2RlcHRoIDwgVUlOVF9NQVgpIHsKKyAgICAvKiB8Y2FsbGJhY2tfZGVwdGh8IGlzIGEgc2F0dXJhdGluZyBjb3VudGVyLiAqLworICAgIGxoLT5jYWxsYmFja19kZXB0aCsrOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IGxoLT5udW1fYnVja2V0czsgaSsrKSB7CisgICAgZm9yIChjdXIgPSBsaC0+YnVja2V0c1tpXTsgY3VyICE9IE5VTEw7IGN1ciA9IG5leHQpIHsKKyAgICAgIG5leHQgPSBjdXItPm5leHQ7CisgICAgICBpZiAoYXJnX2Z1bmMpIHsKKyAgICAgICAgYXJnX2Z1bmMoY3VyLT5kYXRhLCBhcmcpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbm9fYXJnX2Z1bmMoY3VyLT5kYXRhKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAobGgtPmNhbGxiYWNrX2RlcHRoIDwgVUlOVF9NQVgpIHsKKyAgICBsaC0+Y2FsbGJhY2tfZGVwdGgtLTsKKyAgfQorCisgIC8qIFRoZSBjYWxsYmFjayBtYXkgaGF2ZSBhZGRlZCBvciByZW1vdmVkIGVsZW1lbnRzIGFuZCB0aGUgbm9uLXplcm8gdmFsdWUgb2YKKyAgICogfGNhbGxiYWNrX2RlcHRofCB3aWxsIGhhdmUgc3VwcHJlc3NlZCBhbnkgcmVzaXppbmcuIFRodXMgYW55IG5lZWRlZAorICAgKiByZXNpemluZyBpcyBkb25lIGhlcmUuICovCisgIGxoX21heWJlX3Jlc2l6ZShsaCk7Cit9CisKK3ZvaWQgbGhfZG9hbGwoX0xIQVNIICpsaCwgdm9pZCAoKmZ1bmMpKHZvaWQgKikpIHsKKyAgbGhfZG9hbGxfaW50ZXJuYWwobGgsIGZ1bmMsIE5VTEwsIE5VTEwpOworfQorCit2b2lkIGxoX2RvYWxsX2FyZyhfTEhBU0ggKmxoLCB2b2lkICgqZnVuYykodm9pZCAqLCB2b2lkICopLCB2b2lkICphcmcpIHsKKyAgbGhfZG9hbGxfaW50ZXJuYWwobGgsIE5VTEwsIGZ1bmMsIGFyZyk7Cit9CisKK3VpbnQzMl90IGxoX3N0cmhhc2goY29uc3QgY2hhciAqYykgeworICAvKiBUaGUgZm9sbG93aW5nIGhhc2ggc2VlbXMgdG8gd29yayB2ZXJ5IHdlbGwgb24gbm9ybWFsIHRleHQgc3RyaW5ncworICAgKiBubyBjb2xsaXNpb25zIG9uIC91c3IvZGljdC93b3JkcyBhbmQgaXQgZGlzdHJpYnV0ZXMgb24gJTJebiBxdWl0ZQorICAgKiB3ZWxsLCBub3QgYXMgZ29vZCBhcyBNRDUsIGJ1dCBzdGlsbCBnb29kLiAqLworICB1bnNpZ25lZCBsb25nIHJldCA9IDA7CisgIGxvbmcgbjsKKyAgdW5zaWduZWQgbG9uZyB2OworICBpbnQgcjsKKworICBpZiAoKGMgPT0gTlVMTCkgfHwgKCpjID09ICdcMCcpKSB7CisgICAgcmV0dXJuIChyZXQpOworICB9CisKKyAgbiA9IDB4MTAwOworICB3aGlsZSAoKmMpIHsKKyAgICB2ID0gbiB8ICgqYyk7CisgICAgbiArPSAweDEwMDsKKyAgICByID0gKGludCkoKHYgPj4gMikgXiB2KSAmIDB4MGY7CisgICAgcmV0ID0gKHJldCA8PCByKSB8IChyZXQgPj4gKDMyIC0gcikpOworICAgIHJldCAmPSAweEZGRkZGRkZGTDsKKyAgICByZXQgXj0gdiAqIHY7CisgICAgYysrOworICB9CisKKyAgcmV0dXJuICgocmV0ID4+IDE2KSBeIHJldCk7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vbGhhc2gvbGhhc2guaCBiL2NyeXB0by9saGFzaC9saGFzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyODQyZDcKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vbGhhc2gvbGhhc2guaApAQCAtMCwwICsxLDE5MyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpZm5kZWYgT1BFTlNTTF9IRUFERVJfTEhBU0hfSAorI2RlZmluZSBPUEVOU1NMX0hFQURFUl9MSEFTSF9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jhc2UuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3R5cGVfY2hlY2suaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIGxoYXNoIGlzIGEgdHJhZGl0aW9uYWwsIGNoYWluaW5nIGhhc2ggdGFibGUgdGhhdCBhdXRvbWF0aWNhbGx5IGV4cGFuZHMgYW5kCisgKiBjb250cmFjdHMgYXMgbmVlZGVkLiBPbmUgc2hvdWxkIG5vdCB1c2UgdGhlIGxoXyogZnVuY3Rpb25zIGRpcmVjdGx5LCByYXRoZXIKKyAqIHVzZSB0aGUgdHlwZS1zYWZlIG1hY3JvIHdyYXBwZXJzOgorICoKKyAqIEEgaGFzaCB0YWJsZSBvZiBhIHNwZWNpZmljIHR5cGUgb2Ygb2JqZWN0IGhhcyB0eXBlIHxMSEFTSF9PRih0eXBlKXwuIFRoaXMKKyAqIGNhbiBiZSBkZWZpbmVkIChvbmNlKSB3aXRoIHxERUZJTkVfTEhBU0hfT0YodHlwZSl8IGFuZCBkZWNsYXJlZCB3aGVyZSBuZWVkZWQKKyAqIHdpdGggfERFQ0xBUkVfTEhBU0hfT0YodHlwZSl8LiBGb3IgZXhhbXBsZToKKyAqCisgKiAgIHN0cnVjdCBmb28geworICogICAgIGludCBiYXI7CisgKiAgIH07CisgKgorICogICBERUZJTkVfTEhBU0hfT0Yoc3RydWN0IGZvbyk7CisgKgorICogQWx0aG91Z2ggbm90ZSB0aGF0IHRoZSBoYXNoIHRhYmxlIHdpbGwgY29udGFpbiAvcG9pbnRlcnMvIHRvIHxmb298LgorICoKKyAqIEEgbWFjcm8gd2lsbCBiZSBkZWZpbmVkIGZvciBlYWNoIG9mIHRoZSBsaF8qIGZ1bmN0aW9ucyBiZWxvdy4gRm9yCisgKiBMSEFTSF9PRihmb28pLCB0aGUgbWFjcm9zIHdvdWxkIGJlIGxoX2Zvb19uZXcsIGxoX2Zvb19udW1faXRlbXMgZXRjLiAqLworCisKKyNkZWZpbmUgTEhBU0hfT0YodHlwZSkgc3RydWN0IGxoYXNoX3N0XyMjdHlwZQorCisjZGVmaW5lIERFRklORV9MSEFTSF9PRih0eXBlKSBMSEFTSF9PRih0eXBlKSB7IGludCBkdW1teTsgfQorCisjZGVmaW5lIERFQ0xBUkVfTEhBU0hfT0YodHlwZSkgTEhBU0hfT0YodHlwZSk7CisKKy8qIFRoZSBtYWtlX21hY3Jvcy5zaCBzY3JpcHQgaW4gdGhpcyBkaXJlY3RvcnkgcGFyc2VzIHRoZSBmb2xsb3dpbmcgbGluZXMgYW5kCisgKiBnZW5lcmF0ZXMgdGhlIGxoYXNoX21hY3Jvcy5oIGZpbGUgdGhhdCBjb250YWlucyBtYWNyb3MgZm9yIHRoZSBmb2xsb3dpbmcKKyAqIHR5cGVzIG9mIHN0YWNrczoKKyAqCisgKiBMSEFTSF9PRjpBU04xX09CSkVDVAorICogTEhBU0hfT0Y6Q09ORl9WQUxVRQorICogTEhBU0hfT0Y6RVJSX1NUQVRFCisgKiBMSEFTSF9PRjpFUlJfU1RSSU5HX0RBVEEKKyAqIExIQVNIX09GOkVYX0NMQVNTX0lURU0KKyAqIExIQVNIX09GOlNTTF9TRVNTSU9OICovCisKKyNkZWZpbmUgSU5fTEhBU0hfSAorI2luY2x1ZGUgPG9wZW5zc2wvbGhhc2hfbWFjcm9zLmg+CisjdW5kZWYgSU5fTEhBU0hfSAorCisKKy8qIGxoYXNoX2l0ZW1fc3QgaXMgYW4gZWxlbWVudCBvZiBhIGhhc2ggY2hhaW4uIEl0IHBvaW50cyB0byB0aGUgb3BhcXVlIGRhdGEKKyAqIGZvciB0aGlzIGVsZW1lbnQgYW5kIHRvIHRoZSBuZXh0IGl0ZW0gaW4gdGhlIGNoYWluLiBUaGUgbGlua2VkLWxpc3QgaXMgTlVMTAorICogdGVybWluYXRlZC4gKi8KK3R5cGVkZWYgc3RydWN0IGxoYXNoX2l0ZW1fc3QgeworICB2b2lkICpkYXRhOworICBzdHJ1Y3QgbGhhc2hfaXRlbV9zdCAqbmV4dDsKKyAgLyogaGFzaCBjb250YWlucyB0aGUgY2FjaGVkLCBoYXNoIHZhbHVlIG9mIHxkYXRhfC4gKi8KKyAgdWludDMyX3QgaGFzaDsKK30gTEhBU0hfSVRFTTsKKworLyogbGhhc2hfY21wX2Z1bmMgaXMgYSBjb21wYXJpc2lvbiBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSB2YWx1ZSBlcXVhbCwgb3Igbm90CisgKiBlcXVhbCwgdG8gemVybyBkZXBlbmRpbmcgb24gd2hldGhlciB8KmF8IGlzIGVxdWFsLCBvciBub3QgZXF1YWwgdG8gfCpifCwKKyAqIHJlc3BlY3RpdmVseS4gTm90ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIHxzdGFja19jbXBfZnVuY3wgaW4gdGhhdAorICogdGhpcyB0YWtlcyBwb2ludGVycyB0byB0aGUgb2JqZWN0cyBkaXJlY3RseS4gKi8KK3R5cGVkZWYgaW50ICgqbGhhc2hfY21wX2Z1bmMpKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpOworCisvKiBsaGFzaF9oYXNoX2Z1bmMgaXMgYSBmdW5jdGlvbiB0aGF0IG1hcHMgYW4gb2JqZWN0IHRvIGEgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkCisgKiB1aW50MzJfdC4gKi8KK3R5cGVkZWYgdWludDMyX3QgKCpsaGFzaF9oYXNoX2Z1bmMpKGNvbnN0IHZvaWQgKmEpOworCit0eXBlZGVmIHN0cnVjdCBsaGFzaF9zdCB7CisgIC8qIG51bV9pdGVtcyBjb250YWlucyB0aGUgdG90YWwgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBoYXNoIHRhYmxlLiAqLworICBzaXplX3QgbnVtX2l0ZW1zOworICAvKiBidWNrZXRzIGlzIGFuIGFycmF5IG9mIHxudW1fYnVja2V0c3wgcG9pbnRlcnMuIEVhY2ggcG9pbnRzIHRvIHRoZSBoZWFkIG9mCisgICAqIGEgY2hhaW4gb2YgTEhBU0hfSVRFTSBvYmplY3RzIHRoYXQgaGF2ZSB0aGUgc2FtZSBoYXNoIHZhbHVlLCBtb2QKKyAgICogfG51bV9idWNrZXRzfC4gKi8KKyAgTEhBU0hfSVRFTSAqKmJ1Y2tldHM7CisgIC8qIG51bV9idWNrZXRzIGNvbnRhaW5zIHRoZSBsZW5ndGggb2YgfGJ1Y2tldHN8LiBUaGlzIHZhbHVlIGlzIGFsd2F5cyA+PQorICAgKiBrTWluTnVtQnVja2V0cy4gKi8KKyAgc2l6ZV90IG51bV9idWNrZXRzOworICAvKiBjYWxsYmFja19kZXB0aCBjb250YWlucyB0aGUgY3VycmVudCBkZXB0aCBvZiB8bGhfZG9hbGx8IG9yIHxsaF9kb2FsbF9hcmd8CisgICAqIGNhbGxzLiBJZiBub24temVybyB0aGVuIHRoaXMgc3VwcHJlc3NlcyByZXNpemluZyBvZiB0aGUgfGJ1Y2tldHN8IGFycmF5LAorICAgKiB3aGljaCB3b3VsZCBvdGhlcndpc2UgZGlzcnVwdCB0aGUgaXRlcmF0aW9uLiAqLworICB1bnNpZ25lZCBjYWxsYmFja19kZXB0aDsKKworICBsaGFzaF9jbXBfZnVuYyBjb21wOworICBsaGFzaF9oYXNoX2Z1bmMgaGFzaDsKK30gX0xIQVNIOworCisvKiBsaF9uZXcgcmV0dXJucyBhIG5ldywgZW1wdHkgaGFzaCB0YWJsZSBvciBOVUxMIG9uIGVycm9yLiBJZiB8Y29tcHwgaXMgTlVMTCwKKyAqIHxzdHJjbXB8IHdpbGwgYmUgdXNlZC4gSWYgfGhhc2h8IGlzIE5VTEwsIGEgZ2VuZXJpYyBoYXNoIGZ1bmN0aW9uIHdpbGwgYmUKKyAqIHVzZWQuICovCitfTEhBU0ggKmxoX25ldyhsaGFzaF9oYXNoX2Z1bmMgaGFzaCwgbGhhc2hfY21wX2Z1bmMgY29tcCk7CisKKy8qIGxoX2ZyZWUgZnJlZXMgdGhlIGhhc2ggdGFibGUgaXRzZWxmIGJ1dCBub25lIG9mIHRoZSBlbGVtZW50cy4gU2VlCisgKiB8bGhfZG9hbGx8LiAqLwordm9pZCBsaF9mcmVlKF9MSEFTSCAqbGgpOworCisvKiBsaF9udW1faXRlbXMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHxsaHwuICovCitzaXplX3QgbGhfbnVtX2l0ZW1zKGNvbnN0IF9MSEFTSCAqbGgpOworCisvKiBsaF9yZXRyaWV2ZSBmaW5kcyBhbiBlbGVtZW50IGVxdWFsIHRvIHxkYXRhfCBpbiB0aGUgaGFzaCB0YWJsZSBhbmQgcmV0dXJucworICogaXQuIElmIG5vIHN1Y2ggZWxlbWVudCBleGlzdHMsIGl0IHJldHVybnMgTlVMTC4gKi8KK3ZvaWQgKmxoX3JldHJpZXZlKGNvbnN0IF9MSEFTSCAqbGgsIGNvbnN0IHZvaWQgKmRhdGEpOworCisvKiBsaF9pbnNlcnQgaW5zZXJ0cyB8ZGF0YXwgaW50byB0aGUgaGFzaCB0YWJsZS4gSWYgYW4gZXhpc3RpbmcgZWxlbWVudCBpcworICogZXF1YWwgdG8gfGRhdGF8ICh3aXRoIHJlc3BlY3QgdG8gdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24pIHRoZW4gfCpvbGRfZGF0YXwKKyAqIHdpbGwgYmUgc2V0IHRvIHRoYXQgdmFsdWUgYW5kIGl0IHdpbGwgYmUgcmVwbGFjZWQuIE90aGVyd2lzZSwgb3IgaW4gdGhlCisgKiBldmVudCBvZiBhbiBlcnJvciwgfCpvbGRfZGF0YXwgd2lsbCBiZSBzZXQgdG8gTlVMTC4gSXQgcmV0dXJucyBvbmUgb24KKyAqIHN1Y2Nlc3Mgb3IgemVybyBpbiB0aGUgY2FzZSBvZiBhbiBhbGxvY2F0aW9uIGVycm9yLiAqLworaW50IGxoX2luc2VydChfTEhBU0ggKmxoLCB2b2lkICoqb2xkX2RhdGEsIHZvaWQgKmRhdGEpOworCisvKiBsaF9kZWxldGUgcmVtb3ZlcyBhbiBlbGVtZW50IGVxdWFsIHRvIHxkYXRhfCBmcm9tIHRoZSBoYXNoIHRhYmxlIGFuZCByZXR1cm5zCisgKiBpdC4gSWYgbm8gc3VjaCBlbGVtZW50IGlzIGZvdW5kLCBpdCByZXR1cm5zIE5VTEwuICovCit2b2lkICpsaF9kZWxldGUoX0xIQVNIICpsaCwgY29uc3Qgdm9pZCAqZGF0YSk7CisKKy8qIGxoX2RvYWxsIGNhbGxzIHxmdW5jfCBvbiBlYWNoIGVsZW1lbnQgb2YgdGhlIGhhc2ggdGFibGUuCisgKiBUT0RPKGZvcmspOiByZW5hbWUgdGhpcyAqLwordm9pZCBsaF9kb2FsbChfTEhBU0ggKmxoLCB2b2lkICgqZnVuYykodm9pZCAqKSk7CisKKy8qIGxoX2RvYWxsX2FyZyBjYWxscyB8ZnVuY3wgb24gZWFjaCBlbGVtZW50IG9mIHRoZSBoYXNoIHRhYmxlIGFuZCBhbHNvIHBhc3NlcworICogfGFyZ3wgYXMgdGhlIHNlY29uZCBhcmd1bWVudC4KKyAqIFRPRE8oZm9yayk6IHJlbmFtZSB0aGlzICovCit2b2lkIGxoX2RvYWxsX2FyZyhfTEhBU0ggKmxoLCB2b2lkICgqZnVuYykodm9pZCAqLCB2b2lkICopLCB2b2lkICphcmcpOworCisvKiBsaF9zdHJoYXNoIGlzIHRoZSBkZWZhdWx0IGhhc2ggZnVuY3Rpb24gd2hpY2ggcHJvY2Vzc2VzIE5VTC10ZXJtaW5hdGVkCisgKiBzdHJpbmdzLiAqLwordWludDMyX3QgbGhfc3RyaGFzaChjb25zdCBjaGFyICpjKTsKKworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30gLyogZXh0ZXJuIEMgKi8KKyNlbmRpZgorCisjZW5kaWYgLyogT1BFTlNTTF9IRUFERVJfU1RBQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2xoYXNoL2xoYXNoX21hY3Jvcy5oIGIvY3J5cHRvL2xoYXNoL2xoYXNoX21hY3Jvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NGI1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vbGhhc2gvbGhhc2hfbWFjcm9zLmgKQEAgLTAsMCArMSwyNDggQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNCwgR29vZ2xlIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4gKi8KKworI2lmICFkZWZpbmVkKElOX0xIQVNIX0gpCisjZXJyb3IgIkRvbid0IGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5LiBJbmNsdWRlIGxoYXNoLmgiCisjZW5kaWYKKworLyogQVNOMV9PQkpFQ1QgKi8KKyNkZWZpbmUgbGhfQVNOMV9PQkpFQ1RfbmV3KGhhc2gsIGNvbXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMSEFTSF9PRihBU04xX09CSkVDVCkgKilsaF9uZXcoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChsaGFzaF9oYXNoX2Z1bmMsIHVpbnQzMl90ICgqKShjb25zdCBBU04xX09CSkVDVCAqKSwgaGFzaCksIFwKKyAgICAgIENIRUNLRURfQ0FTVChsaGFzaF9jbXBfZnVuYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBpbnQgKCopKGNvbnN0IEFTTjFfT0JKRUNUICphLCBjb25zdCBBU04xX09CSkVDVCAqYiksICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBjb21wKSkpCisKKyNkZWZpbmUgbGhfQVNOMV9PQkpFQ1RfZnJlZShsaCkgXAorICBsaF9mcmVlKENIRUNLRURfQ0FTVChfTEhBU0ggKiwgTEhBU0hfT0YoQVNOMV9PQkpFQ1QpICosIGxoKSk7CisKKyNkZWZpbmUgbGhfQVNOMV9PQkpFQ1RfbnVtX2l0ZW1zKGxoKSBcCisgIGxoX251bV9pdGVtcyhDSEVDS0VEX0NBU1QoX0xIQVNIICosIExIQVNIX09GKEFTTjFfT0JKRUNUKSAqLCBsaCkpCisKKyNkZWZpbmUgbGhfQVNOMV9PQkpFQ1RfcmV0cmlldmUobGgsIGRhdGEpICAgICAgICAgICAgICAgICAgXAorICAoKEFTTjFfT0JKRUNUICopbGhfcmV0cmlldmUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX0xIQVNIICosIExIQVNIX09GKEFTTjFfT0JKRUNUKSAqLCBsaCksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIEFTTjFfT0JKRUNUICosIGRhdGEpKSkKKworI2RlZmluZSBsaF9BU04xX09CSkVDVF9pbnNlcnQobGgsIG9sZF9kYXRhLCBkYXRhKSAgICAgICAgICAgICAgICBcCisgIGxoX2luc2VydChDSEVDS0VEX0NBU1QoX0xIQVNIICosIExIQVNIX09GKEFTTjFfT0JKRUNUKSAqLCBsaCksIFwKKyAgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICoqLCBBU04xX09CSkVDVCAqKiwgb2xkX2RhdGEpLCAgICAgXAorICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgQVNOMV9PQkpFQ1QgKiwgZGF0YSkpCisKKyNkZWZpbmUgbGhfQVNOMV9PQkpFQ1RfZGVsZXRlKGxoLCBkYXRhKSAgICAgICAgICAgICAgICAgICAgXAorICAoKEFTTjFfT0JKRUNUICopbGhfZGVsZXRlKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX0xIQVNIICosIExIQVNIX09GKEFTTjFfT0JKRUNUKSAqLCBsaCksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIEFTTjFfT0JKRUNUICosIGRhdGEpKSkKKworI2RlZmluZSBsaF9BU04xX09CSkVDVF9kb2FsbChsaCwgZnVuYykgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbGhfZG9hbGwoQ0hFQ0tFRF9DQVNUKF9MSEFTSCAqLCBMSEFTSF9PRihBU04xX09CSkVDVCkgKiwgbGgpLCBcCisgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICgqKSh2b2lkICopLCB2b2lkICgqKShBU04xX09CSkVDVCAqKSwgZnVuYykpOworCisjZGVmaW5lIGxoX0FTTjFfT0JKRUNUX2RvYWxsX2FyZyhsaCwgZnVuYywgYXJnKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgbGhfZG9hbGxfYXJnKENIRUNLRURfQ0FTVChfTEhBU0ggKiwgTEhBU0hfT0YoQVNOMV9PQkpFQ1QpICosIGxoKSwgXAorICAgICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKCopKHZvaWQgKiwgdm9pZCAqKSwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKikoQVNOMV9PQkpFQ1QgKiwgdm9pZCAqKSwgZnVuYyksIFwKKyAgICAgICAgICAgICAgIGFyZyk7CisKKy8qIENPTkZfVkFMVUUgKi8KKyNkZWZpbmUgbGhfQ09ORl9WQUxVRV9uZXcoaGFzaCwgY29tcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKExIQVNIX09GKENPTkZfVkFMVUUpICopbGhfbmV3KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QobGhhc2hfaGFzaF9mdW5jLCB1aW50MzJfdCAoKikoY29uc3QgQ09ORl9WQUxVRSAqKSwgaGFzaCksIFwKKyAgICAgIENIRUNLRURfQ0FTVChsaGFzaF9jbXBfZnVuYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIGludCAoKikoY29uc3QgQ09ORl9WQUxVRSAqYSwgY29uc3QgQ09ORl9WQUxVRSAqYiksIGNvbXApKSkKKworI2RlZmluZSBsaF9DT05GX1ZBTFVFX2ZyZWUobGgpIFwKKyAgbGhfZnJlZShDSEVDS0VEX0NBU1QoX0xIQVNIICosIExIQVNIX09GKENPTkZfVkFMVUUpICosIGxoKSk7CisKKyNkZWZpbmUgbGhfQ09ORl9WQUxVRV9udW1faXRlbXMobGgpIFwKKyAgbGhfbnVtX2l0ZW1zKENIRUNLRURfQ0FTVChfTEhBU0ggKiwgTEhBU0hfT0YoQ09ORl9WQUxVRSkgKiwgbGgpKQorCisjZGVmaW5lIGxoX0NPTkZfVkFMVUVfcmV0cmlldmUobGgsIGRhdGEpICAgICAgICAgICAgICAgICAgXAorICAoKENPTkZfVkFMVUUgKilsaF9yZXRyaWV2ZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfTEhBU0ggKiwgTEhBU0hfT0YoQ09ORl9WQUxVRSkgKiwgbGgpLCBcCisgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBDT05GX1ZBTFVFICosIGRhdGEpKSkKKworI2RlZmluZSBsaF9DT05GX1ZBTFVFX2luc2VydChsaCwgb2xkX2RhdGEsIGRhdGEpICAgICAgICAgICAgICAgIFwKKyAgbGhfaW5zZXJ0KENIRUNLRURfQ0FTVChfTEhBU0ggKiwgTEhBU0hfT0YoQ09ORl9WQUxVRSkgKiwgbGgpLCBcCisgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqKiwgQ09ORl9WQUxVRSAqKiwgb2xkX2RhdGEpLCAgICAgXAorICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgQ09ORl9WQUxVRSAqLCBkYXRhKSkKKworI2RlZmluZSBsaF9DT05GX1ZBTFVFX2RlbGV0ZShsaCwgZGF0YSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChDT05GX1ZBTFVFICopbGhfZGVsZXRlKENIRUNLRURfQ0FTVChfTEhBU0ggKiwgTEhBU0hfT0YoQ09ORl9WQUxVRSkgKiwgbGgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBDT05GX1ZBTFVFICosIGRhdGEpKSkKKworI2RlZmluZSBsaF9DT05GX1ZBTFVFX2RvYWxsKGxoLCBmdW5jKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBsaF9kb2FsbChDSEVDS0VEX0NBU1QoX0xIQVNIICosIExIQVNIX09GKENPTkZfVkFMVUUpICosIGxoKSwgXAorICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAoKikodm9pZCAqKSwgdm9pZCAoKikoQ09ORl9WQUxVRSAqKSwgZnVuYykpOworCisjZGVmaW5lIGxoX0NPTkZfVkFMVUVfZG9hbGxfYXJnKGxoLCBmdW5jLCBhcmcpICAgICAgICAgICAgICAgICAgICAgXAorICBsaF9kb2FsbF9hcmcoQ0hFQ0tFRF9DQVNUKF9MSEFTSCAqLCBMSEFTSF9PRihDT05GX1ZBTFVFKSAqLCBsaCksIFwKKyAgICAgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICgqKSh2b2lkICosIHZvaWQgKiksICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKikoQ09ORl9WQUxVRSAqLCB2b2lkICopLCBmdW5jKSwgXAorICAgICAgICAgICAgICAgYXJnKTsKKworLyogRVJSX1NUQVRFICovCisjZGVmaW5lIGxoX0VSUl9TVEFURV9uZXcoaGFzaCwgY29tcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKExIQVNIX09GKEVSUl9TVEFURSkgKilsaF9uZXcoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChsaGFzaF9oYXNoX2Z1bmMsIHVpbnQzMl90ICgqKShjb25zdCBFUlJfU1RBVEUgKiksIGhhc2gpLCBcCisgICAgICBDSEVDS0VEX0NBU1QobGhhc2hfY21wX2Z1bmMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIGludCAoKikoY29uc3QgRVJSX1NUQVRFICphLCBjb25zdCBFUlJfU1RBVEUgKmIpLCBjb21wKSkpCisKKyNkZWZpbmUgbGhfRVJSX1NUQVRFX2ZyZWUobGgpIFwKKyAgbGhfZnJlZShDSEVDS0VEX0NBU1QoX0xIQVNIICosIExIQVNIX09GKEVSUl9TVEFURSkgKiwgbGgpKTsKKworI2RlZmluZSBsaF9FUlJfU1RBVEVfbnVtX2l0ZW1zKGxoKSBcCisgIGxoX251bV9pdGVtcyhDSEVDS0VEX0NBU1QoX0xIQVNIICosIExIQVNIX09GKEVSUl9TVEFURSkgKiwgbGgpKQorCisjZGVmaW5lIGxoX0VSUl9TVEFURV9yZXRyaWV2ZShsaCwgZGF0YSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKEVSUl9TVEFURSAqKWxoX3JldHJpZXZlKENIRUNLRURfQ0FTVChfTEhBU0ggKiwgTEhBU0hfT0YoRVJSX1NUQVRFKSAqLCBsaCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBFUlJfU1RBVEUgKiwgZGF0YSkpKQorCisjZGVmaW5lIGxoX0VSUl9TVEFURV9pbnNlcnQobGgsIG9sZF9kYXRhLCBkYXRhKSAgICAgICAgICAgICAgICBcCisgIGxoX2luc2VydChDSEVDS0VEX0NBU1QoX0xIQVNIICosIExIQVNIX09GKEVSUl9TVEFURSkgKiwgbGgpLCBcCisgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqKiwgRVJSX1NUQVRFICoqLCBvbGRfZGF0YSksICAgICBcCisgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBFUlJfU1RBVEUgKiwgZGF0YSkpCisKKyNkZWZpbmUgbGhfRVJSX1NUQVRFX2RlbGV0ZShsaCwgZGF0YSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKEVSUl9TVEFURSAqKWxoX2RlbGV0ZShDSEVDS0VEX0NBU1QoX0xIQVNIICosIExIQVNIX09GKEVSUl9TVEFURSkgKiwgbGgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIEVSUl9TVEFURSAqLCBkYXRhKSkpCisKKyNkZWZpbmUgbGhfRVJSX1NUQVRFX2RvYWxsKGxoLCBmdW5jKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBsaF9kb2FsbChDSEVDS0VEX0NBU1QoX0xIQVNIICosIExIQVNIX09GKEVSUl9TVEFURSkgKiwgbGgpLCBcCisgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICgqKSh2b2lkICopLCB2b2lkICgqKShFUlJfU1RBVEUgKiksIGZ1bmMpKTsKKworI2RlZmluZSBsaF9FUlJfU1RBVEVfZG9hbGxfYXJnKGxoLCBmdW5jLCBhcmcpICAgICAgICAgICAgICAgICAgICAgXAorICBsaF9kb2FsbF9hcmcoQ0hFQ0tFRF9DQVNUKF9MSEFTSCAqLCBMSEFTSF9PRihFUlJfU1RBVEUpICosIGxoKSwgXAorICAgICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKCopKHZvaWQgKiwgdm9pZCAqKSwgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCopKEVSUl9TVEFURSAqLCB2b2lkICopLCBmdW5jKSwgXAorICAgICAgICAgICAgICAgYXJnKTsKKworLyogRVJSX1NUUklOR19EQVRBICovCisjZGVmaW5lIGxoX0VSUl9TVFJJTkdfREFUQV9uZXcoaGFzaCwgY29tcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTEhBU0hfT0YoRVJSX1NUUklOR19EQVRBKSAqKWxoX25ldyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QobGhhc2hfaGFzaF9mdW5jLCB1aW50MzJfdCAoKikoY29uc3QgRVJSX1NUUklOR19EQVRBICopLCBcCisgICAgICAgICAgICAgICAgICAgaGFzaCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbGhhc2hfY21wX2Z1bmMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgaW50ICgqKShjb25zdCBFUlJfU1RSSU5HX0RBVEEgKmEsIGNvbnN0IEVSUl9TVFJJTkdfREFUQSAqYiksIGNvbXApKSkKKworI2RlZmluZSBsaF9FUlJfU1RSSU5HX0RBVEFfZnJlZShsaCkgXAorICBsaF9mcmVlKENIRUNLRURfQ0FTVChfTEhBU0ggKiwgTEhBU0hfT0YoRVJSX1NUUklOR19EQVRBKSAqLCBsaCkpOworCisjZGVmaW5lIGxoX0VSUl9TVFJJTkdfREFUQV9udW1faXRlbXMobGgpIFwKKyAgbGhfbnVtX2l0ZW1zKENIRUNLRURfQ0FTVChfTEhBU0ggKiwgTEhBU0hfT0YoRVJSX1NUUklOR19EQVRBKSAqLCBsaCkpCisKKyNkZWZpbmUgbGhfRVJSX1NUUklOR19EQVRBX3JldHJpZXZlKGxoLCBkYXRhKSAgICAgICAgICAgICAgICAgIFwKKyAgKChFUlJfU1RSSU5HX0RBVEEgKilsaF9yZXRyaWV2ZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfTEhBU0ggKiwgTEhBU0hfT0YoRVJSX1NUUklOR19EQVRBKSAqLCBsaCksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIEVSUl9TVFJJTkdfREFUQSAqLCBkYXRhKSkpCisKKyNkZWZpbmUgbGhfRVJSX1NUUklOR19EQVRBX2luc2VydChsaCwgb2xkX2RhdGEsIGRhdGEpICAgICAgICAgICAgICAgIFwKKyAgbGhfaW5zZXJ0KENIRUNLRURfQ0FTVChfTEhBU0ggKiwgTEhBU0hfT0YoRVJSX1NUUklOR19EQVRBKSAqLCBsaCksIFwKKyAgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICoqLCBFUlJfU1RSSU5HX0RBVEEgKiosIG9sZF9kYXRhKSwgICAgIFwKKyAgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIEVSUl9TVFJJTkdfREFUQSAqLCBkYXRhKSkKKworI2RlZmluZSBsaF9FUlJfU1RSSU5HX0RBVEFfZGVsZXRlKGxoLCBkYXRhKSAgICAgICAgICAgICAgICAgICAgXAorICAoKEVSUl9TVFJJTkdfREFUQSAqKWxoX2RlbGV0ZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9MSEFTSCAqLCBMSEFTSF9PRihFUlJfU1RSSU5HX0RBVEEpICosIGxoKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgRVJSX1NUUklOR19EQVRBICosIGRhdGEpKSkKKworI2RlZmluZSBsaF9FUlJfU1RSSU5HX0RBVEFfZG9hbGwobGgsIGZ1bmMpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGxoX2RvYWxsKENIRUNLRURfQ0FTVChfTEhBU0ggKiwgTEhBU0hfT0YoRVJSX1NUUklOR19EQVRBKSAqLCBsaCksIFwKKyAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKCopKHZvaWQgKiksIHZvaWQgKCopKEVSUl9TVFJJTkdfREFUQSAqKSwgZnVuYykpOworCisjZGVmaW5lIGxoX0VSUl9TVFJJTkdfREFUQV9kb2FsbF9hcmcobGgsIGZ1bmMsIGFyZykgICAgICAgICAgICAgICAgICAgICBcCisgIGxoX2RvYWxsX2FyZyhDSEVDS0VEX0NBU1QoX0xIQVNIICosIExIQVNIX09GKEVSUl9TVFJJTkdfREFUQSkgKiwgbGgpLCBcCisgICAgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAoKikodm9pZCAqLCB2b2lkICopLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKikoRVJSX1NUUklOR19EQVRBICosIHZvaWQgKiksIGZ1bmMpLCBcCisgICAgICAgICAgICAgICBhcmcpOworCisvKiBFWF9DTEFTU19JVEVNICovCisjZGVmaW5lIGxoX0VYX0NMQVNTX0lURU1fbmV3KGhhc2gsIGNvbXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKExIQVNIX09GKEVYX0NMQVNTX0lURU0pICopbGhfbmV3KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChsaGFzaF9oYXNoX2Z1bmMsIHVpbnQzMl90ICgqKShjb25zdCBFWF9DTEFTU19JVEVNICopLCAgICBcCisgICAgICAgICAgICAgICAgICAgaGFzaCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKGxoYXNoX2NtcF9mdW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBpbnQgKCopKGNvbnN0IEVYX0NMQVNTX0lURU0gKmEsIGNvbnN0IEVYX0NMQVNTX0lURU0gKmIpLCBcCisgICAgICAgICAgICAgICAgICAgY29tcCkpKQorCisjZGVmaW5lIGxoX0VYX0NMQVNTX0lURU1fZnJlZShsaCkgXAorICBsaF9mcmVlKENIRUNLRURfQ0FTVChfTEhBU0ggKiwgTEhBU0hfT0YoRVhfQ0xBU1NfSVRFTSkgKiwgbGgpKTsKKworI2RlZmluZSBsaF9FWF9DTEFTU19JVEVNX251bV9pdGVtcyhsaCkgXAorICBsaF9udW1faXRlbXMoQ0hFQ0tFRF9DQVNUKF9MSEFTSCAqLCBMSEFTSF9PRihFWF9DTEFTU19JVEVNKSAqLCBsaCkpCisKKyNkZWZpbmUgbGhfRVhfQ0xBU1NfSVRFTV9yZXRyaWV2ZShsaCwgZGF0YSkgICAgICAgICAgICAgICAgICBcCisgICgoRVhfQ0xBU1NfSVRFTSAqKWxoX3JldHJpZXZlKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9MSEFTSCAqLCBMSEFTSF9PRihFWF9DTEFTU19JVEVNKSAqLCBsaCksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIEVYX0NMQVNTX0lURU0gKiwgZGF0YSkpKQorCisjZGVmaW5lIGxoX0VYX0NMQVNTX0lURU1faW5zZXJ0KGxoLCBvbGRfZGF0YSwgZGF0YSkgICAgICAgICAgICAgICAgXAorICBsaF9pbnNlcnQoQ0hFQ0tFRF9DQVNUKF9MSEFTSCAqLCBMSEFTSF9PRihFWF9DTEFTU19JVEVNKSAqLCBsaCksIFwKKyAgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICoqLCBFWF9DTEFTU19JVEVNICoqLCBvbGRfZGF0YSksICAgICBcCisgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBFWF9DTEFTU19JVEVNICosIGRhdGEpKQorCisjZGVmaW5lIGxoX0VYX0NMQVNTX0lURU1fZGVsZXRlKGxoLCBkYXRhKSAgICAgICAgICAgICAgICAgICAgXAorICAoKEVYX0NMQVNTX0lURU0gKilsaF9kZWxldGUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfTEhBU0ggKiwgTEhBU0hfT0YoRVhfQ0xBU1NfSVRFTSkgKiwgbGgpLCBcCisgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBFWF9DTEFTU19JVEVNICosIGRhdGEpKSkKKworI2RlZmluZSBsaF9FWF9DTEFTU19JVEVNX2RvYWxsKGxoLCBmdW5jKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBsaF9kb2FsbChDSEVDS0VEX0NBU1QoX0xIQVNIICosIExIQVNIX09GKEVYX0NMQVNTX0lURU0pICosIGxoKSwgXAorICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAoKikodm9pZCAqKSwgdm9pZCAoKikoRVhfQ0xBU1NfSVRFTSAqKSwgZnVuYykpOworCisjZGVmaW5lIGxoX0VYX0NMQVNTX0lURU1fZG9hbGxfYXJnKGxoLCBmdW5jLCBhcmcpICAgICAgICAgICAgICAgICAgICAgXAorICBsaF9kb2FsbF9hcmcoQ0hFQ0tFRF9DQVNUKF9MSEFTSCAqLCBMSEFTSF9PRihFWF9DTEFTU19JVEVNKSAqLCBsaCksIFwKKyAgICAgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICgqKSh2b2lkICosIHZvaWQgKiksICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKikoRVhfQ0xBU1NfSVRFTSAqLCB2b2lkICopLCBmdW5jKSwgXAorICAgICAgICAgICAgICAgYXJnKTsKKworLyogU1NMX1NFU1NJT04gKi8KKyNkZWZpbmUgbGhfU1NMX1NFU1NJT05fbmV3KGhhc2gsIGNvbXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMSEFTSF9PRihTU0xfU0VTU0lPTikgKilsaF9uZXcoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChsaGFzaF9oYXNoX2Z1bmMsIHVpbnQzMl90ICgqKShjb25zdCBTU0xfU0VTU0lPTiAqKSwgaGFzaCksIFwKKyAgICAgIENIRUNLRURfQ0FTVChsaGFzaF9jbXBfZnVuYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBpbnQgKCopKGNvbnN0IFNTTF9TRVNTSU9OICphLCBjb25zdCBTU0xfU0VTU0lPTiAqYiksICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBjb21wKSkpCisKKyNkZWZpbmUgbGhfU1NMX1NFU1NJT05fZnJlZShsaCkgXAorICBsaF9mcmVlKENIRUNLRURfQ0FTVChfTEhBU0ggKiwgTEhBU0hfT0YoU1NMX1NFU1NJT04pICosIGxoKSk7CisKKyNkZWZpbmUgbGhfU1NMX1NFU1NJT05fbnVtX2l0ZW1zKGxoKSBcCisgIGxoX251bV9pdGVtcyhDSEVDS0VEX0NBU1QoX0xIQVNIICosIExIQVNIX09GKFNTTF9TRVNTSU9OKSAqLCBsaCkpCisKKyNkZWZpbmUgbGhfU1NMX1NFU1NJT05fcmV0cmlldmUobGgsIGRhdGEpICAgICAgICAgICAgICAgICAgXAorICAoKFNTTF9TRVNTSU9OICopbGhfcmV0cmlldmUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX0xIQVNIICosIExIQVNIX09GKFNTTF9TRVNTSU9OKSAqLCBsaCksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFNTTF9TRVNTSU9OICosIGRhdGEpKSkKKworI2RlZmluZSBsaF9TU0xfU0VTU0lPTl9pbnNlcnQobGgsIG9sZF9kYXRhLCBkYXRhKSAgICAgICAgICAgICAgICBcCisgIGxoX2luc2VydChDSEVDS0VEX0NBU1QoX0xIQVNIICosIExIQVNIX09GKFNTTF9TRVNTSU9OKSAqLCBsaCksIFwKKyAgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICoqLCBTU0xfU0VTU0lPTiAqKiwgb2xkX2RhdGEpLCAgICAgXAorICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgU1NMX1NFU1NJT04gKiwgZGF0YSkpCisKKyNkZWZpbmUgbGhfU1NMX1NFU1NJT05fZGVsZXRlKGxoLCBkYXRhKSAgICAgICAgICAgICAgICAgICAgXAorICAoKFNTTF9TRVNTSU9OICopbGhfZGVsZXRlKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX0xIQVNIICosIExIQVNIX09GKFNTTF9TRVNTSU9OKSAqLCBsaCksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFNTTF9TRVNTSU9OICosIGRhdGEpKSkKKworI2RlZmluZSBsaF9TU0xfU0VTU0lPTl9kb2FsbChsaCwgZnVuYykgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbGhfZG9hbGwoQ0hFQ0tFRF9DQVNUKF9MSEFTSCAqLCBMSEFTSF9PRihTU0xfU0VTU0lPTikgKiwgbGgpLCBcCisgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICgqKSh2b2lkICopLCB2b2lkICgqKShTU0xfU0VTU0lPTiAqKSwgZnVuYykpOworCisjZGVmaW5lIGxoX1NTTF9TRVNTSU9OX2RvYWxsX2FyZyhsaCwgZnVuYywgYXJnKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgbGhfZG9hbGxfYXJnKENIRUNLRURfQ0FTVChfTEhBU0ggKiwgTEhBU0hfT0YoU1NMX1NFU1NJT04pICosIGxoKSwgXAorICAgICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKCopKHZvaWQgKiwgdm9pZCAqKSwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKikoU1NMX1NFU1NJT04gKiwgdm9pZCAqKSwgZnVuYyksIFwKKyAgICAgICAgICAgICAgIGFyZyk7CmRpZmYgLS1naXQgYS9jcnlwdG8vbGhhc2gvbGhhc2hfdGVzdC5jIGIvY3J5cHRvL2xoYXNoL2xoYXNoX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTNhNmY2Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2xoYXNoL2xoYXNoX3Rlc3QuYwpAQCAtMCwwICsxLDE5MSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE0LCBHb29nbGUgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQorICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLiAqLworCisjZGVmaW5lIF9QT1NJWF9TT1VSQ0UKKyNkZWZpbmUgX0JTRF9TT1VSQ0UKKworI2luY2x1ZGUgPG9wZW5zc2wvbGhhc2guaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3N0cnVjdCBkdW1teV9saGFzaF9ub2RlIHsKKyAgY2hhciAqczsKKyAgc3RydWN0IGR1bW15X2xoYXNoX25vZGUgKm5leHQ7Cit9OworCitzdHJ1Y3QgZHVtbXlfbGhhc2ggeworICBzdHJ1Y3QgZHVtbXlfbGhhc2hfbm9kZSAqaGVhZDsKK307CisKK3N0YXRpYyB2b2lkIGR1bW15X2xoX2ZyZWUoc3RydWN0IGR1bW15X2xoYXNoICpsaCkgeworICBzdHJ1Y3QgZHVtbXlfbGhhc2hfbm9kZSAqY3VyLCAqbmV4dDsKKworICBmb3IgKGN1ciA9IGxoLT5oZWFkOyBjdXIgIT0gTlVMTDsgY3VyID0gbmV4dCkgeworICAgIG5leHQgPSBjdXItPm5leHQ7CisgICAgZnJlZShjdXItPnMpOworICAgIGZyZWUoY3VyKTsKKyAgfQorfQorCitzdGF0aWMgc2l6ZV90IGR1bW15X2xoX251bV9pdGVtcyhjb25zdCBzdHJ1Y3QgZHVtbXlfbGhhc2ggKmxoKSB7CisgIHNpemVfdCBjb3VudCA9IDA7CisgIHN0cnVjdCBkdW1teV9saGFzaF9ub2RlICpjdXI7CisKKyAgZm9yIChjdXIgPSBsaC0+aGVhZDsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgIGNvdW50Kys7CisgIH0KKworICByZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBjaGFyICpkdW1teV9saF9yZXRyaWV2ZShzdHJ1Y3QgZHVtbXlfbGhhc2ggKmxoLCBjb25zdCBjaGFyICpzKSB7CisgIHN0cnVjdCBkdW1teV9saGFzaF9ub2RlICpjdXI7CisKKyAgZm9yIChjdXIgPSBsaC0+aGVhZDsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgIGlmIChzdHJjbXAoY3VyLT5zLCBzKSA9PSAwKSB7CisgICAgICByZXR1cm4gY3VyLT5zOworICAgIH0KKyAgfQorCisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGR1bW15X2xoX2luc2VydChzdHJ1Y3QgZHVtbXlfbGhhc2ggKmxoLCBjaGFyICoqb2xkX2RhdGEsIGNoYXIgKnMpIHsKKyAgc3RydWN0IGR1bW15X2xoYXNoX25vZGUgKm5vZGUsICpjdXI7CisKKyAgZm9yIChjdXIgPSBsaC0+aGVhZDsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgIGlmIChzdHJjbXAoY3VyLT5zLCBzKSA9PSAwKSB7CisgICAgICAqb2xkX2RhdGEgPSBjdXItPnM7CisgICAgICBjdXItPnMgPSBzOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisKKyAgbm9kZSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGR1bW15X2xoYXNoX25vZGUpKTsKKyAgKm9sZF9kYXRhID0gTlVMTDsKKyAgbm9kZS0+cyA9IHM7CisgIG5vZGUtPm5leHQgPSBsaC0+aGVhZDsKKyAgbGgtPmhlYWQgPSBub2RlOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGNoYXIgKmR1bW15X2xoX2RlbGV0ZShzdHJ1Y3QgZHVtbXlfbGhhc2ggKmxoLCBjb25zdCB2b2lkICpzKSB7CisgIHN0cnVjdCBkdW1teV9saGFzaF9ub2RlICpjdXIsICoqbmV4dF9wdHI7CisgIGNoYXIgKnJldDsKKworICBuZXh0X3B0ciA9ICZsaC0+aGVhZDsKKyAgZm9yIChjdXIgPSBsaC0+aGVhZDsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgIGlmIChzdHJjbXAoY3VyLT5zLCBzKSA9PSAwKSB7CisgICAgICByZXQgPSBjdXItPnM7CisgICAgICAqbmV4dF9wdHIgPSBjdXItPm5leHQ7CisgICAgICBmcmVlKGN1cik7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBuZXh0X3B0ciA9ICZjdXItPm5leHQ7CisgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNoYXIgKnJhbmRfc3RyaW5nKHVuc2lnbmVkICpyYW5kX3N0YXRlKSB7CisgIHVuc2lnbmVkIGxlbiA9IDEgKyAocmFuZF9yKHJhbmRfc3RhdGUpICUgMyk7CisgIGNoYXIgKnJldCA9IG1hbGxvYyhsZW4gKyAxKTsKKyAgdW5zaWduZWQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICByZXRbaV0gPSAnMCcgKyAocmFuZF9yKHJhbmRfc3RhdGUpICYgNyk7CisgIH0KKyAgcmV0W2ldID0gMDsKKworICByZXR1cm4gcmV0OworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgX0xIQVNIICpsaCA9IGxoX25ldyhOVUxMLCBOVUxMKTsKKyAgc3RydWN0IGR1bW15X2xoYXNoIGR1bW15X2xoID0ge05VTEx9OworICB1bnNpZ25lZCByYW5kX3N0YXRlID0gMDsKKyAgdW5zaWduZWQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgMTAwMDAwOyBpKyspIHsKKyAgICB1bnNpZ25lZCBhY3Rpb247CisgICAgY2hhciAqcywgKnMxLCAqczI7CisKKyAgICBpZiAoZHVtbXlfbGhfbnVtX2l0ZW1zKCZkdW1teV9saCkgIT0gbGhfbnVtX2l0ZW1zKGxoKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJMZW5ndGggbWlzbWF0Y2hcbiIpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgYWN0aW9uID0gcmFuZF9yKCZyYW5kX3N0YXRlKSAlIDM7CisgICAgc3dpdGNoIChhY3Rpb24pIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgcyA9IHJhbmRfc3RyaW5nKCZyYW5kX3N0YXRlKTsKKyAgICAgICAgczEgPSAoY2hhciAqKWxoX3JldHJpZXZlKGxoLCBzKTsKKyAgICAgICAgczIgPSBkdW1teV9saF9yZXRyaWV2ZSgmZHVtbXlfbGgsIHMpOworICAgICAgICBpZiAoczEgIT0gTlVMTCAmJiAoczIgPT0gTlVMTCB8fCBzdHJjbXAoczEsIHMyKSAhPSAwKSkgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibGhfcmV0cmlldmUgZmFpbHVyZVxuIik7CisgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgfQorICAgICAgICBmcmVlKHMpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAxOgorICAgICAgICBzID0gcmFuZF9zdHJpbmcoJnJhbmRfc3RhdGUpOworICAgICAgICBsaF9pbnNlcnQobGgsICh2b2lkICoqKSZzMSwgcyk7CisgICAgICAgIGR1bW15X2xoX2luc2VydCgmZHVtbXlfbGgsICZzMiwgc3RyZHVwKHMpKTsKKworICAgICAgICBpZiAoczEgIT0gTlVMTCAmJiAoczIgPT0gTlVMTCB8fCBzdHJjbXAoczEsIHMyKSAhPSAwKSkgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibGhfaW5zZXJ0IGZhaWx1cmVcbiIpOworICAgICAgICAgIGFib3J0KCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoczEpIHsKKyAgICAgICAgICBmcmVlKHMxKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoczIpIHsKKyAgICAgICAgICBmcmVlKHMyKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAyOgorICAgICAgICBzID0gcmFuZF9zdHJpbmcoJnJhbmRfc3RhdGUpOworICAgICAgICBzMSA9IGxoX2RlbGV0ZShsaCwgcyk7CisgICAgICAgIHMyID0gZHVtbXlfbGhfZGVsZXRlKCZkdW1teV9saCwgcyk7CisKKyAgICAgICAgaWYgKHMxICE9IE5VTEwgJiYgKHMyID09IE5VTEwgfHwgc3RyY21wKHMxLCBzMikgIT0gMCkpIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImxoX2luc2VydCBmYWlsdXJlXG4iKTsKKyAgICAgICAgICBhYm9ydCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHMxKSB7CisgICAgICAgICAgZnJlZShzMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMyKSB7CisgICAgICAgICAgZnJlZShzMik7CisgICAgICAgIH0KKyAgICAgICAgZnJlZShzKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGFib3J0KCk7CisgICAgfQorICB9CisKKyAgbGhfZG9hbGwobGgsIGZyZWUpOworICBsaF9mcmVlKGxoKTsKKyAgZHVtbXlfbGhfZnJlZSgmZHVtbXlfbGgpOworICBwcmludGYoIlBBU1NcbiIpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NyeXB0by9saGFzaC9tYWtlX21hY3Jvcy5zaCBiL2NyeXB0by9saGFzaC9tYWtlX21hY3Jvcy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWQxZTU3Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2xoYXNoL21ha2VfbWFjcm9zLnNoCkBAIC0wLDAgKzEsNjQgQEAKKyMhL2Jpbi9zaAorCitjYXQgPiBsaGFzaF9tYWNyb3MuaCA8PCBFT0YKKy8qIENvcHlyaWdodCAoYykgMjAxNCwgR29vZ2xlIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4gKi8KKworI2lmICFkZWZpbmVkKElOX0xIQVNIX0gpCisjZXJyb3IgIkRvbid0IGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5LiBJbmNsdWRlIGxoYXNoLmgiCisjZW5kaWYKKworRU9GCisKK291dHB1dF9saGFzaCAoKSB7CisgIHR5cGU9JDEKKworICBjYXQgPj4gbGhhc2hfbWFjcm9zLmggPDwgRU9GCisvKiAke3R5cGV9ICovCisjZGVmaW5lIGxoXyR7dHlwZX1fbmV3KGhhc2gsIGNvbXApXFwKKygoTEhBU0hfT0YoJHt0eXBlfSkqKSBsaF9uZXcoQ0hFQ0tFRF9DQVNUKGxoYXNoX2hhc2hfZnVuYywgdWludDMyX3QgKCopIChjb25zdCAke3R5cGV9ICopLCBoYXNoKSwgQ0hFQ0tFRF9DQVNUKGxoYXNoX2NtcF9mdW5jLCBpbnQgKCopIChjb25zdCAke3R5cGV9ICphLCBjb25zdCAke3R5cGV9ICpiKSwgY29tcCkpKQorCisjZGVmaW5lIGxoXyR7dHlwZX1fZnJlZShsaClcXAorICBsaF9mcmVlKENIRUNLRURfQ0FTVChfTEhBU0gqLCBMSEFTSF9PRigke3R5cGV9KSosIGxoKSk7CisKKyNkZWZpbmUgbGhfJHt0eXBlfV9udW1faXRlbXMobGgpXFwKKyAgbGhfbnVtX2l0ZW1zKENIRUNLRURfQ0FTVChfTEhBU0gqLCBMSEFTSF9PRigke3R5cGV9KSosIGxoKSkKKworI2RlZmluZSBsaF8ke3R5cGV9X3JldHJpZXZlKGxoLCBkYXRhKVxcCisgICgoJHt0eXBlfSopIGxoX3JldHJpZXZlKENIRUNLRURfQ0FTVChfTEhBU0gqLCBMSEFTSF9PRigke3R5cGV9KSosIGxoKSwgQ0hFQ0tFRF9DQVNUKHZvaWQqLCAke3R5cGV9KiwgZGF0YSkpKQorCisjZGVmaW5lIGxoXyR7dHlwZX1faW5zZXJ0KGxoLCBvbGRfZGF0YSwgZGF0YSlcXAorICBsaF9pbnNlcnQoQ0hFQ0tFRF9DQVNUKF9MSEFTSCosIExIQVNIX09GKCR7dHlwZX0pKiwgbGgpLCBDSEVDS0VEX0NBU1Qodm9pZCoqLCAke3R5cGV9KiosIG9sZF9kYXRhKSwgQ0hFQ0tFRF9DQVNUKHZvaWQqLCAke3R5cGV9KiwgZGF0YSkpCisKKyNkZWZpbmUgbGhfJHt0eXBlfV9kZWxldGUobGgsIGRhdGEpXFwKKyAgKCgke3R5cGV9KikgbGhfZGVsZXRlKENIRUNLRURfQ0FTVChfTEhBU0gqLCBMSEFTSF9PRigke3R5cGV9KSosIGxoKSwgQ0hFQ0tFRF9DQVNUKHZvaWQqLCAke3R5cGV9KiwgZGF0YSkpKQorCisjZGVmaW5lIGxoXyR7dHlwZX1fZG9hbGwobGgsIGZ1bmMpXFwKKyAgbGhfZG9hbGwoQ0hFQ0tFRF9DQVNUKF9MSEFTSCosIExIQVNIX09GKCR7dHlwZX0pKiwgbGgpLCBDSEVDS0VEX0NBU1Qodm9pZCAoKikodm9pZCopLCB2b2lkICgqKSAoJHt0eXBlfSopLCBmdW5jKSk7CisKKyNkZWZpbmUgbGhfJHt0eXBlfV9kb2FsbF9hcmcobGgsIGZ1bmMsIGFyZylcXAorICBsaF9kb2FsbF9hcmcoQ0hFQ0tFRF9DQVNUKF9MSEFTSCosIExIQVNIX09GKCR7dHlwZX0pKiwgbGgpLCBDSEVDS0VEX0NBU1Qodm9pZCAoKikodm9pZCosIHZvaWQqKSwgdm9pZCAoKikgKCR7dHlwZX0qLCB2b2lkKiksIGZ1bmMpLCBhcmcpOworCisKK0VPRgorfQorCitsaGFzaF90eXBlcz0kKGNhdCBsaGFzaC5oIHwgZ3JlcCAnXiBcKiBMSEFTSF9PRjonIHwgc2VkIC1lICdzLy4qTEhBU0hfT0Y6Ly8nIC1lICdzLyAuKi8vJykKKworZm9yIHR5cGUgaW4gJGxoYXNoX3R5cGVzOyBkbworICBlY2hvIEhhc2ggb2YgJHt0eXBlfQorICBvdXRwdXRfbGhhc2ggIiR7dHlwZX0iCitkb25lCisKK2NsYW5nLWZvcm1hdCAtaSBsaGFzaF9tYWNyb3MuaApkaWZmIC0tZ2l0IGEvY3J5cHRvL21kNS9DTWFrZUxpc3RzLnR4dCBiL2NyeXB0by9tZDUvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UyZjhkYwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9tZDUvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwzOCBAQAoraW5jbHVkZV9kaXJlY3RvcmllcyguIC4uIC4uLy4uL2luY2x1ZGUpCisKK2lmICgke0FSQ0h9IFNUUkVRVUFMICJ4ODZfNjQiKQorCXNldCgKKwkJTUQ1X0FSQ0hfU09VUkNFUworCisJCW1kNS14ODZfNjQuJHtBU01fRVhUfQorCSkKK2VuZGlmKCkKKworaWYgKCR7QVJDSH0gU1RSRVFVQUwgIng4NiIpCisJc2V0KAorCQlNRDVfQVJDSF9TT1VSQ0VTCisKKwkJbWQ1LTU4Ni4ke0FTTV9FWFR9CisJKQorZW5kaWYoKQorCithZGRfbGlicmFyeSgKKwltZDUKKworCU9CSkVDVAorCisJbWQ1LmMKKworCSR7TUQ1X0FSQ0hfU09VUkNFU30KKykKKworcGVybGFzbShtZDUteDg2XzY0LiR7QVNNX0VYVH0gYXNtL21kNS14ODZfNjQucGwpCitwZXJsYXNtKG1kNS01ODYuJHtBU01fRVhUfSBhc20vbWQ1LTU4Ni5wbCkKKworYWRkX2V4ZWN1dGFibGUoCisJbWQ1X3Rlc3QKKworCW1kNV90ZXN0LmMKKykKKwordGFyZ2V0X2xpbmtfbGlicmFyaWVzKG1kNV90ZXN0IGNyeXB0bykKZGlmZiAtLWdpdCBhL2NyeXB0by9tZDUvYXNtL21kNS01ODYucGwgYi9jcnlwdG8vbWQ1L2FzbS9tZDUtNTg2LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYjY2YmIKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vbWQ1L2FzbS9tZDUtNTg2LnBsCkBAIC0wLDAgKzEsMzA3IEBACisjIS91c3IvbG9jYWwvYmluL3BlcmwKKworIyBOb3JtYWwgaXMgdGhlCisjIG1kNV9ibG9ja194ODYoTUQ1X0NUWCAqYywgVUxPTkcgKlgpOworIyB2ZXJzaW9uLCBub24tbm9ybWFsIGlzIHRoZQorIyBtZDVfYmxvY2tfeDg2KE1ENV9DVFggKmMsIFVMT05HICpYLGludCBibG9ja3MpOworCiskbm9ybWFsPTA7CisKKyQwID1+IG0vKC4qW1wvXFxdKVteXC9cXF0rJC87ICRkaXI9JDE7CitwdXNoKEBJTkMsIiR7ZGlyfSIsIiR7ZGlyfS4uLy4uL3Blcmxhc20iKTsKK3JlcXVpcmUgIng4NmFzbS5wbCI7CisKKyZhc21faW5pdCgkQVJHVlswXSwkMCk7CisKKyRBPSJlYXgiOworJEI9ImVieCI7CiskQz0iZWN4IjsKKyREPSJlZHgiOworJHRtcDE9ImVkaSI7CiskdG1wMj0iZWJwIjsKKyRYPSJlc2kiOworCisjIFdoYXQgd2UgbmVlZCB0byBsb2FkIGludG8gJHRtcCBmb3IgdGhlIG5leHQgcm91bmQKKyVMdG1wMT0oIlIwIiwmTnAoJEMpLCAiUjEiLCZOcCgkQyksICJSMiIsJk5wKCRDKSwgIlIzIiwmTnAoJEQpKTsKK0B4bz0oCisgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwJIyBSMAorIDEsIDYsIDExLCAwLCA1LCAxMCwgMTUsIDQsIDksIDE0LCAzLCA4LCAxMywgMiwgNywgMTIsCSMgUjEKKyA1LCA4LCAxMSwgMTQsIDEsIDQsIDcsIDEwLCAxMywgMCwgMywgNiwgOSwgMTIsIDE1LCAyLAkjIFIyCisgMCwgNywgMTQsIDUsIDEyLCAzLCAxMCwgMSwgOCwgMTUsIDYsIDEzLCA0LCAxMSwgMiwgOSwJIyBSMworICk7CisKKyZtZDVfYmxvY2soIm1kNV9ibG9ja19hc21fZGF0YV9vcmRlciIpOworJmFzbV9maW5pc2goKTsKKworc3ViIE5wCisJeworCWxvY2FsKCRwKT1AXzsKKwlsb2NhbCglbik9KCRBLCRELCRCLCRBLCRDLCRCLCRELCRDKTsKKwlyZXR1cm4oJG57JHB9KTsKKwl9CisKK3N1YiBSMAorCXsKKwlsb2NhbCgkcG9zLCRhLCRiLCRjLCRkLCRLLCRraSwkcywkdCk9QF87CisKKwkmbW92KCR0bXAxLCRDKSAgaWYgJHBvcyA8IDA7CisJJm1vdigkdG1wMiwmRFdQKCR4b1ska2ldKjQsJEssIiIsMCkpIGlmICRwb3MgPCAwOyAjIHZlcnkgZmlyc3Qgb25lIAorCisJIyBib2R5IHByb3BlcgorCisJJmNvbW1lbnQoIlIwICRraSIpOworCSZ4b3IoJHRtcDEsJGQpOyAjIEYgZnVuY3Rpb24gLSBwYXJ0IDIKKworCSZhbmQoJHRtcDEsJGIpOyAjIEYgZnVuY3Rpb24gLSBwYXJ0IDMKKwkmbGVhKCRhLCZEV1AoJHQsJGEsJHRtcDIsMSkpOworCisJJnhvcigkdG1wMSwkZCk7ICMgRiBmdW5jdGlvbiAtIHBhcnQgNAorCisJJmFkZCgkYSwkdG1wMSk7CisJJm1vdigkdG1wMSwmTnAoJGMpKSBpZiAkcG9zIDwgMTsJIyBuZXh0IHRtcDEgZm9yIFIwCisJJm1vdigkdG1wMSwmTnAoJGMpKSBpZiAkcG9zID09IDE7CSMgbmV4dCB0bXAxIGZvciBSMQorCisJJnJvdGwoJGEsJHMpOworCisJJm1vdigkdG1wMiwmRFdQKCR4b1ska2krMV0qNCwkSywiIiwwKSkgaWYgKCRwb3MgIT0gMik7CisKKwkmYWRkKCRhLCRiKTsKKwl9CisKK3N1YiBSMQorCXsKKwlsb2NhbCgkcG9zLCRhLCRiLCRjLCRkLCRLLCRraSwkcywkdCk9QF87CisKKwkmY29tbWVudCgiUjEgJGtpIik7CisKKwkmbGVhKCRhLCZEV1AoJHQsJGEsJHRtcDIsMSkpOworCisJJnhvcigkdG1wMSwkYik7ICMgRyBmdW5jdGlvbiAtIHBhcnQgMgorCSZhbmQoJHRtcDEsJGQpOyAjIEcgZnVuY3Rpb24gLSBwYXJ0IDMKKworCSZtb3YoJHRtcDIsJkRXUCgkeG9bJGtpKzFdKjQsJEssIiIsMCkpIGlmICgkcG9zICE9IDIpOworCSZ4b3IoJHRtcDEsJGMpOwkJCSMgRyBmdW5jdGlvbiAtIHBhcnQgNAorCisJJmFkZCgkYSwkdG1wMSk7CisJJm1vdigkdG1wMSwmTnAoJGMpKSBpZiAkcG9zIDwgMTsJIyBHIGZ1bmN0aW9uIC0gcGFydCAxCisJJm1vdigkdG1wMSwmTnAoJGMpKSBpZiAkcG9zID09IDE7CSMgRyBmdW5jdGlvbiAtIHBhcnQgMQorCisJJnJvdGwoJGEsJHMpOworCisJJmFkZCgkYSwkYik7CisJfQorCitzdWIgUjIKKwl7CisJbG9jYWwoJG4sJHBvcywkYSwkYiwkYywkZCwkSywka2ksJHMsJHQpPUBfOworCSMgVGhpcyBvbmUgaXMgZGlmZmVyZW50LCBvbmx5IDMgbG9naWNhbCBvcGVyYXRpb25zCisKK2lmICgoJG4gJiAxKSA9PSAwKQorCXsKKwkmY29tbWVudCgiUjIgJGtpIik7CisJIyBtYWtlIHN1cmUgdG8gZG8gJ0QnIGZpcnN0LCBub3QgJ0InLCBlbHNlIHdlIGNsYXNoIHdpdGgKKwkjIHRoZSBsYXN0IGFkZCBmcm9tIHRoZSBwcmV2aW91cyByb3VuZC4KKworCSZ4b3IoJHRtcDEsJGQpOyAjIEggZnVuY3Rpb24gLSBwYXJ0IDIKKworCSZ4b3IoJHRtcDEsJGIpOyAjIEggZnVuY3Rpb24gLSBwYXJ0IDMKKwkmbGVhKCRhLCZEV1AoJHQsJGEsJHRtcDIsMSkpOworCisJJmFkZCgkYSwkdG1wMSk7CisKKwkmcm90bCgkYSwkcyk7CisKKwkmbW92KCR0bXAyLCZEV1AoJHhvWyRraSsxXSo0LCRLLCIiLDApKTsKKwkmbW92KCR0bXAxLCZOcCgkYykpOworCX0KK2Vsc2UKKwl7CisJJmNvbW1lbnQoIlIyICRraSIpOworCSMgbWFrZSBzdXJlIHRvIGRvICdEJyBmaXJzdCwgbm90ICdCJywgZWxzZSB3ZSBjbGFzaCB3aXRoCisJIyB0aGUgbGFzdCBhZGQgZnJvbSB0aGUgcHJldmlvdXMgcm91bmQuCisKKwkmbGVhKCRhLCZEV1AoJHQsJGEsJHRtcDIsMSkpOworCisJJmFkZCgkYiwkYyk7CQkJIyBNT1ZFRCBGT1JXQVJECisJJnhvcigkdG1wMSwkZCk7ICMgSCBmdW5jdGlvbiAtIHBhcnQgMgorCisJJnhvcigkdG1wMSwkYik7ICMgSCBmdW5jdGlvbiAtIHBhcnQgMworCSZtb3YoJHRtcDIsJkRXUCgkeG9bJGtpKzFdKjQsJEssIiIsMCkpIGlmICgkcG9zICE9IDIpOworCisJJmFkZCgkYSwkdG1wMSk7CisJJm1vdigkdG1wMSwmTnAoJGMpKSBpZiAkcG9zIDwgMTsJIyBIIGZ1bmN0aW9uIC0gcGFydCAxCisJJm1vdigkdG1wMSwtMSkgaWYgJHBvcyA9PSAxOwkJIyBJIGZ1bmN0aW9uIC0gcGFydCAxCisKKwkmcm90bCgkYSwkcyk7CisKKwkmYWRkKCRhLCRiKTsKKwl9CisJfQorCitzdWIgUjMKKwl7CisJbG9jYWwoJHBvcywkYSwkYiwkYywkZCwkSywka2ksJHMsJHQpPUBfOworCisJJmNvbW1lbnQoIlIzICRraSIpOworCisJIyAmbm90KCR0bXAxKQorCSZ4b3IoJHRtcDEsJGQpIGlmICRwb3MgPCAwOyAJIyBJIGZ1bmN0aW9uIC0gcGFydCAyCisKKwkmb3IoJHRtcDEsJGIpOwkJCQkjIEkgZnVuY3Rpb24gLSBwYXJ0IDMKKwkmbGVhKCRhLCZEV1AoJHQsJGEsJHRtcDIsMSkpOworCisJJnhvcigkdG1wMSwkYyk7IAkJCSMgSSBmdW5jdGlvbiAtIHBhcnQgNAorCSZtb3YoJHRtcDIsJkRXUCgkeG9bJGtpKzFdKjQsJEssIiIsMCkpCWlmICRwb3MgIT0gMjsgIyBsb2FkIFgvayB2YWx1ZQorCSZtb3YoJHRtcDIsJndwYXJhbSgwKSkgaWYgJHBvcyA9PSAyOworCisJJmFkZCgkYSwkdG1wMSk7CisJJm1vdigkdG1wMSwtMSkgaWYgJHBvcyA8IDE7CSMgSCBmdW5jdGlvbiAtIHBhcnQgMQorCSZhZGQoJEssNjQpIGlmICRwb3MgPj0xICYmICEkbm9ybWFsOworCisJJnJvdGwoJGEsJHMpOworCisJJnhvcigkdG1wMSwmTnAoJGQpKSBpZiAkcG9zIDw9IDA7IAkjIEkgZnVuY3Rpb24gLSBwYXJ0ID0gZmlyc3QgdGltZQorCSZtb3YoJHRtcDEsJkRXUCggMCwkdG1wMiwiIiwwKSkgaWYgJHBvcyA+IDA7CisJJmFkZCgkYSwkYik7CisJfQorCisKK3N1YiBtZDVfYmxvY2sKKwl7CisJbG9jYWwoJG5hbWUpPUBfOworCisJJmZ1bmN0aW9uX2JlZ2luX0IoJG5hbWUsIiIsMyk7CisKKwkjIHBhcmFtZXRlciAxIGlzIHRoZSBNRDVfQ1RYIHN0cnVjdHVyZS4KKwkjIEEJMAorCSMgQgk0CisJIyBDCTgKKwkjIEQgCTEyCisKKwkmcHVzaCgiZXNpIik7CisJICZwdXNoKCJlZGkiKTsKKwkmbW92KCR0bXAxLAkmd3BhcmFtKDApKTsgIyBlZGkKKwkgJm1vdigkWCwJJndwYXJhbSgxKSk7ICMgZXNpCisJJm1vdigkQywJJndwYXJhbSgyKSk7CisJICZwdXNoKCJlYnAiKTsKKwkmc2hsKCRDLAk2KTsKKwkmcHVzaCgiZWJ4Iik7CisJICZhZGQoJEMsCSRYKTsgIyBvZmZzZXQgd2UgZW5kIGF0CisJJnN1YigkQywJNjQpOworCSAmbW92KCRBLAkmRFdQKCAwLCR0bXAxLCIiLDApKTsKKwkmcHVzaCgkQyk7CSMgUHV0IG9uIHRoZSBUT1MKKwkgJm1vdigkQiwJJkRXUCggNCwkdG1wMSwiIiwwKSk7CisJJm1vdigkQywJJkRXUCggOCwkdG1wMSwiIiwwKSk7CisJICZtb3YoJEQsCSZEV1AoMTIsJHRtcDEsIiIsMCkpOworCisJJnNldF9sYWJlbCgic3RhcnQiKSB1bmxlc3MgJG5vcm1hbDsKKwkmY29tbWVudCgiIik7CisJJmNvbW1lbnQoIlIwIHNlY3Rpb24iKTsKKworCSZSMCgtMiwkQSwkQiwkQywkRCwkWCwgMCwgNywweGQ3NmFhNDc4KTsKKwkmUjAoIDAsJEQsJEEsJEIsJEMsJFgsIDEsMTIsMHhlOGM3Yjc1Nik7CisJJlIwKCAwLCRDLCRELCRBLCRCLCRYLCAyLDE3LDB4MjQyMDcwZGIpOworCSZSMCggMCwkQiwkQywkRCwkQSwkWCwgMywyMiwweGMxYmRjZWVlKTsKKwkmUjAoIDAsJEEsJEIsJEMsJEQsJFgsIDQsIDcsMHhmNTdjMGZhZik7CisJJlIwKCAwLCRELCRBLCRCLCRDLCRYLCA1LDEyLDB4NDc4N2M2MmEpOworCSZSMCggMCwkQywkRCwkQSwkQiwkWCwgNiwxNywweGE4MzA0NjEzKTsKKwkmUjAoIDAsJEIsJEMsJEQsJEEsJFgsIDcsMjIsMHhmZDQ2OTUwMSk7CisJJlIwKCAwLCRBLCRCLCRDLCRELCRYLCA4LCA3LDB4Njk4MDk4ZDgpOworCSZSMCggMCwkRCwkQSwkQiwkQywkWCwgOSwxMiwweDhiNDRmN2FmKTsKKwkmUjAoIDAsJEMsJEQsJEEsJEIsJFgsMTAsMTcsMHhmZmZmNWJiMSk7CisJJlIwKCAwLCRCLCRDLCRELCRBLCRYLDExLDIyLDB4ODk1Y2Q3YmUpOworCSZSMCggMCwkQSwkQiwkQywkRCwkWCwxMiwgNywweDZiOTAxMTIyKTsKKwkmUjAoIDAsJEQsJEEsJEIsJEMsJFgsMTMsMTIsMHhmZDk4NzE5Myk7CisJJlIwKCAwLCRDLCRELCRBLCRCLCRYLDE0LDE3LDB4YTY3OTQzOGUpOworCSZSMCggMSwkQiwkQywkRCwkQSwkWCwxNSwyMiwweDQ5YjQwODIxKTsKKworCSZjb21tZW50KCIiKTsKKwkmY29tbWVudCgiUjEgc2VjdGlvbiIpOworCSZSMSgtMSwkQSwkQiwkQywkRCwkWCwxNiwgNSwweGY2MWUyNTYyKTsKKwkmUjEoIDAsJEQsJEEsJEIsJEMsJFgsMTcsIDksMHhjMDQwYjM0MCk7CisJJlIxKCAwLCRDLCRELCRBLCRCLCRYLDE4LDE0LDB4MjY1ZTVhNTEpOworCSZSMSggMCwkQiwkQywkRCwkQSwkWCwxOSwyMCwweGU5YjZjN2FhKTsKKwkmUjEoIDAsJEEsJEIsJEMsJEQsJFgsMjAsIDUsMHhkNjJmMTA1ZCk7CisJJlIxKCAwLCRELCRBLCRCLCRDLCRYLDIxLCA5LDB4MDI0NDE0NTMpOworCSZSMSggMCwkQywkRCwkQSwkQiwkWCwyMiwxNCwweGQ4YTFlNjgxKTsKKwkmUjEoIDAsJEIsJEMsJEQsJEEsJFgsMjMsMjAsMHhlN2QzZmJjOCk7CisJJlIxKCAwLCRBLCRCLCRDLCRELCRYLDI0LCA1LDB4MjFlMWNkZTYpOworCSZSMSggMCwkRCwkQSwkQiwkQywkWCwyNSwgOSwweGMzMzcwN2Q2KTsKKwkmUjEoIDAsJEMsJEQsJEEsJEIsJFgsMjYsMTQsMHhmNGQ1MGQ4Nyk7CisJJlIxKCAwLCRCLCRDLCRELCRBLCRYLDI3LDIwLDB4NDU1YTE0ZWQpOworCSZSMSggMCwkQSwkQiwkQywkRCwkWCwyOCwgNSwweGE5ZTNlOTA1KTsKKwkmUjEoIDAsJEQsJEEsJEIsJEMsJFgsMjksIDksMHhmY2VmYTNmOCk7CisJJlIxKCAwLCRDLCRELCRBLCRCLCRYLDMwLDE0LDB4Njc2ZjAyZDkpOworCSZSMSggMSwkQiwkQywkRCwkQSwkWCwzMSwyMCwweDhkMmE0YzhhKTsKKworCSZjb21tZW50KCIiKTsKKwkmY29tbWVudCgiUjIgc2VjdGlvbiIpOworCSZSMiggMCwtMSwkQSwkQiwkQywkRCwkWCwzMiwgNCwweGZmZmEzOTQyKTsKKwkmUjIoIDEsIDAsJEQsJEEsJEIsJEMsJFgsMzMsMTEsMHg4NzcxZjY4MSk7CisJJlIyKCAyLCAwLCRDLCRELCRBLCRCLCRYLDM0LDE2LDB4NmQ5ZDYxMjIpOworCSZSMiggMywgMCwkQiwkQywkRCwkQSwkWCwzNSwyMywweGZkZTUzODBjKTsKKwkmUjIoIDQsIDAsJEEsJEIsJEMsJEQsJFgsMzYsIDQsMHhhNGJlZWE0NCk7CisJJlIyKCA1LCAwLCRELCRBLCRCLCRDLCRYLDM3LDExLDB4NGJkZWNmYTkpOworCSZSMiggNiwgMCwkQywkRCwkQSwkQiwkWCwzOCwxNiwweGY2YmI0YjYwKTsKKwkmUjIoIDcsIDAsJEIsJEMsJEQsJEEsJFgsMzksMjMsMHhiZWJmYmM3MCk7CisJJlIyKCA4LCAwLCRBLCRCLCRDLCRELCRYLDQwLCA0LDB4Mjg5YjdlYzYpOworCSZSMiggOSwgMCwkRCwkQSwkQiwkQywkWCw0MSwxMSwweGVhYTEyN2ZhKTsKKwkmUjIoMTAsIDAsJEMsJEQsJEEsJEIsJFgsNDIsMTYsMHhkNGVmMzA4NSk7CisJJlIyKDExLCAwLCRCLCRDLCRELCRBLCRYLDQzLDIzLDB4MDQ4ODFkMDUpOworCSZSMigxMiwgMCwkQSwkQiwkQywkRCwkWCw0NCwgNCwweGQ5ZDRkMDM5KTsKKwkmUjIoMTMsIDAsJEQsJEEsJEIsJEMsJFgsNDUsMTEsMHhlNmRiOTllNSk7CisJJlIyKDE0LCAwLCRDLCRELCRBLCRCLCRYLDQ2LDE2LDB4MWZhMjdjZjgpOworCSZSMigxNSwgMSwkQiwkQywkRCwkQSwkWCw0NywyMywweGM0YWM1NjY1KTsKKworCSZjb21tZW50KCIiKTsKKwkmY29tbWVudCgiUjMgc2VjdGlvbiIpOworCSZSMygtMSwkQSwkQiwkQywkRCwkWCw0OCwgNiwweGY0MjkyMjQ0KTsKKwkmUjMoIDAsJEQsJEEsJEIsJEMsJFgsNDksMTAsMHg0MzJhZmY5Nyk7CisJJlIzKCAwLCRDLCRELCRBLCRCLCRYLDUwLDE1LDB4YWI5NDIzYTcpOworCSZSMyggMCwkQiwkQywkRCwkQSwkWCw1MSwyMSwweGZjOTNhMDM5KTsKKwkmUjMoIDAsJEEsJEIsJEMsJEQsJFgsNTIsIDYsMHg2NTViNTljMyk7CisJJlIzKCAwLCRELCRBLCRCLCRDLCRYLDUzLDEwLDB4OGYwY2NjOTIpOworCSZSMyggMCwkQywkRCwkQSwkQiwkWCw1NCwxNSwweGZmZWZmNDdkKTsKKwkmUjMoIDAsJEIsJEMsJEQsJEEsJFgsNTUsMjEsMHg4NTg0NWRkMSk7CisJJlIzKCAwLCRBLCRCLCRDLCRELCRYLDU2LCA2LDB4NmZhODdlNGYpOworCSZSMyggMCwkRCwkQSwkQiwkQywkWCw1NywxMCwweGZlMmNlNmUwKTsKKwkmUjMoIDAsJEMsJEQsJEEsJEIsJFgsNTgsMTUsMHhhMzAxNDMxNCk7CisJJlIzKCAwLCRCLCRDLCRELCRBLCRYLDU5LDIxLDB4NGUwODExYTEpOworCSZSMyggMCwkQSwkQiwkQywkRCwkWCw2MCwgNiwweGY3NTM3ZTgyKTsKKwkmUjMoIDAsJEQsJEEsJEIsJEMsJFgsNjEsMTAsMHhiZDNhZjIzNSk7CisJJlIzKCAwLCRDLCRELCRBLCRCLCRYLDYyLDE1LDB4MmFkN2QyYmIpOworCSZSMyggMiwkQiwkQywkRCwkQSwkWCw2MywyMSwweGViODZkMzkxKTsKKworCSMgJm1vdigkdG1wMiwmd3BhcmFtKDApKTsJIyBkb25lIGluIHRoZSBsYXN0IFIzCisJIyAmbW92KCR0bXAxLAkmRFdQKCAwLCR0bXAyLCIiLDApKTsgIyBkb25lIGlzIHRoZSBsYXN0IFIzCisKKwkmYWRkKCRBLCR0bXAxKTsKKwkgJm1vdigkdG1wMSwJJkRXUCggNCwkdG1wMiwiIiwwKSk7CisKKwkmYWRkKCRCLCR0bXAxKTsKKwkmbW92KCR0bXAxLAkmRFdQKCA4LCR0bXAyLCIiLDApKTsKKworCSZhZGQoJEMsJHRtcDEpOworCSZtb3YoJHRtcDEsCSZEV1AoMTIsJHRtcDIsIiIsMCkpOworCisJJmFkZCgkRCwkdG1wMSk7CisJJm1vdigmRFdQKCAwLCR0bXAyLCIiLDApLCRBKTsKKworCSZtb3YoJkRXUCggNCwkdG1wMiwiIiwwKSwkQik7CisJJm1vdigkdG1wMSwmc3d0bXAoMCkpIHVubGVzcyAkbm9ybWFsOworCisJJm1vdigmRFdQKCA4LCR0bXAyLCIiLDApLCRDKTsKKwkgJm1vdigmRFdQKDEyLCR0bXAyLCIiLDApLCREKTsKKworCSZjbXAoJHRtcDEsJFgpIHVubGVzcyAkbm9ybWFsOwkJCSMgY2hlY2sgY291bnQKKwkgJmphZSgmbGFiZWwoInN0YXJ0IikpIHVubGVzcyAkbm9ybWFsOworCisJJnBvcCgiZWF4Iik7ICMgcG9wIHRoZSB0ZW1wIHZhcmlhYmxlIG9mZiB0aGUgc3RhY2sKKwkgJnBvcCgiZWJ4Iik7CisJJnBvcCgiZWJwIik7CisJICZwb3AoImVkaSIpOworCSZwb3AoImVzaSIpOworCSAmcmV0KCk7CisJJmZ1bmN0aW9uX2VuZF9CKCRuYW1lKTsKKwl9CisKZGlmZiAtLWdpdCBhL2NyeXB0by9tZDUvYXNtL21kNS14ODZfNjQucGwgYi9jcnlwdG8vbWQ1L2FzbS9tZDUteDg2XzY0LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNjg0ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vbWQ1L2FzbS9tZDUteDg2XzY0LnBsCkBAIC0wLDAgKzEsMzcwIEBACisjIS91c3IvYmluL3BlcmwgLXcKKyMKKyMgTUQ1IG9wdGltaXplZCBmb3IgQU1ENjQuCisjCisjIEF1dGhvcjogTWFyYyBCZXZhbmQgPGJldmFuZF9tIChhdCkgZXBpdGEuZnI+CisjIExpY2VuY2U6IEkgaGVyZWJ5IGRpc2NsYWltIHRoZSBjb3B5cmlnaHQgb24gdGhpcyBjb2RlIGFuZCBwbGFjZSBpdAorIyBpbiB0aGUgcHVibGljIGRvbWFpbi4KKyMKKwordXNlIHN0cmljdDsKKworbXkgJGNvZGU7CisKKyMgcm91bmQxX3N0ZXAoKSBkb2VzOgorIyAgIGRzdCA9IHggKyAoKGRzdCArIEYoeCx5LHopICsgWFtrXSArIFRfaSkgPDw8IHMpCisjICAgJXIxMGQgPSBYW2tfbmV4dF0KKyMgICAlcjExZCA9IHonIChjb3B5IG9mIHogZm9yIHRoZSBuZXh0IHN0ZXApCisjIEVhY2ggcm91bmQxX3N0ZXAoKSB0YWtlcyBhYm91dCA1LjMgY2xvY2tzICg5IGluc3RydWN0aW9ucywgMS43IElQQykKK3N1YiByb3VuZDFfc3RlcAoreworICAgIG15ICgkcG9zLCAkZHN0LCAkeCwgJHksICR6LCAka19uZXh0LCAkVF9pLCAkcykgPSBAXzsKKyAgICAkY29kZSAuPSAiIG1vdgkwKjQoJXJzaSksCSVyMTBkCQkvKiAoTkVYVCBTVEVQKSBYWzBdICovXG4iIGlmICgkcG9zID09IC0xKTsKKyAgICAkY29kZSAuPSAiIG1vdgklZWR4LAkJJXIxMWQJCS8qIChORVhUIFNURVApIHonID0gJWVkeCAqL1xuIiBpZiAoJHBvcyA9PSAtMSk7CisgICAgJGNvZGUgLj0gPDxFT0Y7CisJeG9yCSR5LAkJJXIxMWQJCS8qIHkgXiAuLi4gKi8KKwlsZWEJJFRfaSgkZHN0LCVyMTBkKSwkZHN0CQkvKiBDb25zdCArIGRzdCArIC4uLiAqLworCWFuZAkkeCwJCSVyMTFkCQkvKiB4ICYgLi4uICovCisJeG9yCSR6LAkJJXIxMWQJCS8qIHogXiAuLi4gKi8KKwltb3YJJGtfbmV4dCo0KCVyc2kpLCVyMTBkCQkvKiAoTkVYVCBTVEVQKSBYWyRrX25leHRdICovCisJYWRkCSVyMTFkLAkJJGRzdAkJLyogZHN0ICs9IC4uLiAqLworCXJvbAlcJCRzLAkJJGRzdAkJLyogZHN0IDw8PCBzICovCisJbW92CSR5LAkJJXIxMWQJCS8qIChORVhUIFNURVApIHonID0gJHkgKi8KKwlhZGQJJHgsCQkkZHN0CQkvKiBkc3QgKz0geCAqLworRU9GCit9CisKKyMgcm91bmQyX3N0ZXAoKSBkb2VzOgorIyAgIGRzdCA9IHggKyAoKGRzdCArIEcoeCx5LHopICsgWFtrXSArIFRfaSkgPDw8IHMpCisjICAgJXIxMGQgPSBYW2tfbmV4dF0KKyMgICAlcjExZCA9IHonIChjb3B5IG9mIHogZm9yIHRoZSBuZXh0IHN0ZXApCisjICAgJXIxMmQgPSB6JyAoY29weSBvZiB6IGZvciB0aGUgbmV4dCBzdGVwKQorIyBFYWNoIHJvdW5kMl9zdGVwKCkgdGFrZXMgYWJvdXQgNS40IGNsb2NrcyAoMTEgaW5zdHJ1Y3Rpb25zLCAyLjAgSVBDKQorc3ViIHJvdW5kMl9zdGVwCit7CisgICAgbXkgKCRwb3MsICRkc3QsICR4LCAkeSwgJHosICRrX25leHQsICRUX2ksICRzKSA9IEBfOworICAgICRjb2RlIC49ICIgbW92CTEqNCglcnNpKSwJJXIxMGQJCS8qIChORVhUIFNURVApIFhbMV0gKi9cbiIgaWYgKCRwb3MgPT0gLTEpOworICAgICRjb2RlIC49ICIgbW92CSVlZHgsCQklcjExZAkJLyogKE5FWFQgU1RFUCkgeicgPSAlZWR4ICovXG4iIGlmICgkcG9zID09IC0xKTsKKyAgICAkY29kZSAuPSAiIG1vdgklZWR4LAkJJXIxMmQJCS8qIChORVhUIFNURVApIHonID0gJWVkeCAqL1xuIiBpZiAoJHBvcyA9PSAtMSk7CisgICAgJGNvZGUgLj0gPDxFT0Y7CisJbm90CSVyMTFkCQkJCS8qIG5vdCB6ICovCisJbGVhCSRUX2koJGRzdCwlcjEwZCksJGRzdAkJLyogQ29uc3QgKyBkc3QgKyAuLi4gKi8KKwlhbmQJJHgsCQklcjEyZAkJLyogeCAmIHogKi8KKwlhbmQJJHksCQklcjExZAkJLyogeSAmIChub3QgeikgKi8KKwltb3YJJGtfbmV4dCo0KCVyc2kpLCVyMTBkCQkvKiAoTkVYVCBTVEVQKSBYWyRrX25leHRdICovCisJb3IJJXIxMWQsCQklcjEyZAkJLyogKHkgJiAobm90IHopKSB8ICh4ICYgeikgKi8KKwltb3YJJHksCQklcjExZAkJLyogKE5FWFQgU1RFUCkgeicgPSAkeSAqLworCWFkZAklcjEyZCwJCSRkc3QJCS8qIGRzdCArPSAuLi4gKi8KKwltb3YJJHksCQklcjEyZAkJLyogKE5FWFQgU1RFUCkgeicgPSAkeSAqLworCXJvbAlcJCRzLAkJJGRzdAkJLyogZHN0IDw8PCBzICovCisJYWRkCSR4LAkJJGRzdAkJLyogZHN0ICs9IHggKi8KK0VPRgorfQorCisjIHJvdW5kM19zdGVwKCkgZG9lczoKKyMgICBkc3QgPSB4ICsgKChkc3QgKyBIKHgseSx6KSArIFhba10gKyBUX2kpIDw8PCBzKQorIyAgICVyMTBkID0gWFtrX25leHRdCisjICAgJXIxMWQgPSB5JyAoY29weSBvZiB5IGZvciB0aGUgbmV4dCBzdGVwKQorIyBFYWNoIHJvdW5kM19zdGVwKCkgdGFrZXMgYWJvdXQgNC4yIGNsb2NrcyAoOCBpbnN0cnVjdGlvbnMsIDEuOSBJUEMpCitzdWIgcm91bmQzX3N0ZXAKK3sKKyAgICBteSAoJHBvcywgJGRzdCwgJHgsICR5LCAkeiwgJGtfbmV4dCwgJFRfaSwgJHMpID0gQF87CisgICAgJGNvZGUgLj0gIiBtb3YJNSo0KCVyc2kpLAklcjEwZAkJLyogKE5FWFQgU1RFUCkgWFs1XSAqL1xuIiBpZiAoJHBvcyA9PSAtMSk7CisgICAgJGNvZGUgLj0gIiBtb3YJJWVjeCwJCSVyMTFkCQkvKiAoTkVYVCBTVEVQKSB5JyA9ICVlY3ggKi9cbiIgaWYgKCRwb3MgPT0gLTEpOworICAgICRjb2RlIC49IDw8RU9GOworCWxlYQkkVF9pKCRkc3QsJXIxMGQpLCRkc3QJCS8qIENvbnN0ICsgZHN0ICsgLi4uICovCisJbW92CSRrX25leHQqNCglcnNpKSwlcjEwZAkJLyogKE5FWFQgU1RFUCkgWFska19uZXh0XSAqLworCXhvcgkkeiwJCSVyMTFkCQkvKiB6IF4gLi4uICovCisJeG9yCSR4LAkJJXIxMWQJCS8qIHggXiAuLi4gKi8KKwlhZGQJJXIxMWQsCQkkZHN0CQkvKiBkc3QgKz0gLi4uICovCisJcm9sCVwkJHMsCQkkZHN0CQkvKiBkc3QgPDw8IHMgKi8KKwltb3YJJHgsCQklcjExZAkJLyogKE5FWFQgU1RFUCkgeScgPSAkeCAqLworCWFkZAkkeCwJCSRkc3QJCS8qIGRzdCArPSB4ICovCitFT0YKK30KKworIyByb3VuZDRfc3RlcCgpIGRvZXM6CisjICAgZHN0ID0geCArICgoZHN0ICsgSSh4LHkseikgKyBYW2tdICsgVF9pKSA8PDwgcykKKyMgICAlcjEwZCA9IFhba19uZXh0XQorIyAgICVyMTFkID0gbm90IHonIChjb3B5IG9mIG5vdCB6IGZvciB0aGUgbmV4dCBzdGVwKQorIyBFYWNoIHJvdW5kNF9zdGVwKCkgdGFrZXMgYWJvdXQgNS4yIGNsb2NrcyAoOSBpbnN0cnVjdGlvbnMsIDEuNyBJUEMpCitzdWIgcm91bmQ0X3N0ZXAKK3sKKyAgICBteSAoJHBvcywgJGRzdCwgJHgsICR5LCAkeiwgJGtfbmV4dCwgJFRfaSwgJHMpID0gQF87CisgICAgJGNvZGUgLj0gIiBtb3YJMCo0KCVyc2kpLAklcjEwZAkJLyogKE5FWFQgU1RFUCkgWFswXSAqL1xuIiBpZiAoJHBvcyA9PSAtMSk7CisgICAgJGNvZGUgLj0gIiBtb3YJXCQweGZmZmZmZmZmLAklcjExZFxuIiBpZiAoJHBvcyA9PSAtMSk7CisgICAgJGNvZGUgLj0gIiB4b3IJJWVkeCwJCSVyMTFkCQkvKiAoTkVYVCBTVEVQKSBub3QgeicgPSBub3QgJWVkeCovXG4iCisgICAgaWYgKCRwb3MgPT0gLTEpOworICAgICRjb2RlIC49IDw8RU9GOworCWxlYQkkVF9pKCRkc3QsJXIxMGQpLCRkc3QJCS8qIENvbnN0ICsgZHN0ICsgLi4uICovCisJb3IJJHgsCQklcjExZAkJLyogeCB8IC4uLiAqLworCXhvcgkkeSwJCSVyMTFkCQkvKiB5IF4gLi4uICovCisJYWRkCSVyMTFkLAkJJGRzdAkJLyogZHN0ICs9IC4uLiAqLworCW1vdgkka19uZXh0KjQoJXJzaSksJXIxMGQJCS8qIChORVhUIFNURVApIFhbJGtfbmV4dF0gKi8KKwltb3YJXCQweGZmZmZmZmZmLAklcjExZAorCXJvbAlcJCRzLAkJJGRzdAkJLyogZHN0IDw8PCBzICovCisJeG9yCSR5LAkJJXIxMWQJCS8qIChORVhUIFNURVApIG5vdCB6JyA9IG5vdCAkeSAqLworCWFkZAkkeCwJCSRkc3QJCS8qIGRzdCArPSB4ICovCitFT0YKK30KKworbXkgJGZsYXZvdXIgPSBzaGlmdDsKK215ICRvdXRwdXQgID0gc2hpZnQgfHwgIiI7CitpZiAoJGZsYXZvdXIgPX4gL1wuLykgeyAkb3V0cHV0ID0gJGZsYXZvdXI7IHVuZGVmICRmbGF2b3VyOyB9CisKK215ICR3aW42ND0wOyAkd2luNjQ9MSBpZiAoJGZsYXZvdXIgPX4gL1tubV1hc218bWluZ3c2NC8gfHwgJG91dHB1dCA9fiAvXC5hc20kLyk7CisKKyQwID1+IG0vKC4qW1wvXFxdKVteXC9cXF0rJC87IG15ICRkaXI9JDE7IG15ICR4bGF0ZTsKKyggJHhsYXRlPSIke2Rpcn14ODZfNjQteGxhdGUucGwiIGFuZCAtZiAkeGxhdGUgKSBvcgorKCAkeGxhdGU9IiR7ZGlyfS4uLy4uL3Blcmxhc20veDg2XzY0LXhsYXRlLnBsIiBhbmQgLWYgJHhsYXRlKSBvcgorZGllICJjYW4ndCBsb2NhdGUgeDg2XzY0LXhsYXRlLnBsIjsKKworbm8gd2FybmluZ3MgcXcodW5pbml0aWFsaXplZCk7CitvcGVuIE9VVCwifCBcIiReWFwiICR4bGF0ZSAkZmxhdm91ciAkb3V0cHV0IjsKKypTVERPVVQ9Kk9VVDsKKworJGNvZGUgLj0gPDxFT0Y7CisudGV4dAorLmFsaWduIDE2CisKKy5nbG9ibCBtZDVfYmxvY2tfYXNtX2RhdGFfb3JkZXIKKy50eXBlIG1kNV9ibG9ja19hc21fZGF0YV9vcmRlcixcQGZ1bmN0aW9uLDMKK21kNV9ibG9ja19hc21fZGF0YV9vcmRlcjoKKwlwdXNoCSVyYnAKKwlwdXNoCSVyYngKKwlwdXNoCSVyMTIKKwlwdXNoCSVyMTQKKwlwdXNoCSVyMTUKKy5McHJvbG9ndWU6CisKKwkjIHJkaSA9IGFyZyAjMSAoY3R4LCBNRDVfQ1RYIHBvaW50ZXIpCisJIyByc2kgPSBhcmcgIzIgKHB0ciwgZGF0YSBwb2ludGVyKQorCSMgcmR4ID0gYXJnICMzIChuYnIsIG51bWJlciBvZiAxNi13b3JkIGJsb2NrcyB0byBwcm9jZXNzKQorCW1vdgklcmRpLAkJJXJicAkjIHJicCA9IGN0eAorCXNobAlcJDYsCQklcmR4CSMgcmR4ID0gbmJyIGluIGJ5dGVzCisJbGVhCSglcnNpLCVyZHgpLAklcmRpCSMgcmRpID0gZW5kCisJbW92CTAqNCglcmJwKSwJJWVheAkjIGVheCA9IGN0eC0+QQorCW1vdgkxKjQoJXJicCksCSVlYngJIyBlYnggPSBjdHgtPkIKKwltb3YJMio0KCVyYnApLAklZWN4CSMgZWN4ID0gY3R4LT5DCisJbW92CTMqNCglcmJwKSwJJWVkeAkjIGVkeCA9IGN0eC0+RAorCSMgZW5kIGlzICdyZGknCisJIyBwdHIgaXMgJ3JzaScKKwkjIEEgaXMgJ2VheCcKKwkjIEIgaXMgJ2VieCcKKwkjIEMgaXMgJ2VjeCcKKwkjIEQgaXMgJ2VkeCcKKworCWNtcAklcmRpLAkJJXJzaQkJIyBjbXAgZW5kIHdpdGggcHRyCisJamUJLkxlbmQJCQkJIyBqbXAgaWYgcHRyID09IGVuZAorCisJIyBCRUdJTiBvZiBsb29wIG92ZXIgMTYtd29yZCBibG9ja3MKKy5MbG9vcDoJIyBzYXZlIG9sZCB2YWx1ZXMgb2YgQSwgQiwgQywgRAorCW1vdgklZWF4LAkJJXI4ZAorCW1vdgklZWJ4LAkJJXI5ZAorCW1vdgklZWN4LAkJJXIxNGQKKwltb3YJJWVkeCwJCSVyMTVkCitFT0YKK3JvdW5kMV9zdGVwKC0xLCclZWF4JywnJWVieCcsJyVlY3gnLCclZWR4JywgJzEnLCcweGQ3NmFhNDc4JywgJzcnKTsKK3JvdW5kMV9zdGVwKCAwLCclZWR4JywnJWVheCcsJyVlYngnLCclZWN4JywgJzInLCcweGU4YzdiNzU2JywnMTInKTsKK3JvdW5kMV9zdGVwKCAwLCclZWN4JywnJWVkeCcsJyVlYXgnLCclZWJ4JywgJzMnLCcweDI0MjA3MGRiJywnMTcnKTsKK3JvdW5kMV9zdGVwKCAwLCclZWJ4JywnJWVjeCcsJyVlZHgnLCclZWF4JywgJzQnLCcweGMxYmRjZWVlJywnMjInKTsKK3JvdW5kMV9zdGVwKCAwLCclZWF4JywnJWVieCcsJyVlY3gnLCclZWR4JywgJzUnLCcweGY1N2MwZmFmJywgJzcnKTsKK3JvdW5kMV9zdGVwKCAwLCclZWR4JywnJWVheCcsJyVlYngnLCclZWN4JywgJzYnLCcweDQ3ODdjNjJhJywnMTInKTsKK3JvdW5kMV9zdGVwKCAwLCclZWN4JywnJWVkeCcsJyVlYXgnLCclZWJ4JywgJzcnLCcweGE4MzA0NjEzJywnMTcnKTsKK3JvdW5kMV9zdGVwKCAwLCclZWJ4JywnJWVjeCcsJyVlZHgnLCclZWF4JywgJzgnLCcweGZkNDY5NTAxJywnMjInKTsKK3JvdW5kMV9zdGVwKCAwLCclZWF4JywnJWVieCcsJyVlY3gnLCclZWR4JywgJzknLCcweDY5ODA5OGQ4JywgJzcnKTsKK3JvdW5kMV9zdGVwKCAwLCclZWR4JywnJWVheCcsJyVlYngnLCclZWN4JywnMTAnLCcweDhiNDRmN2FmJywnMTInKTsKK3JvdW5kMV9zdGVwKCAwLCclZWN4JywnJWVkeCcsJyVlYXgnLCclZWJ4JywnMTEnLCcweGZmZmY1YmIxJywnMTcnKTsKK3JvdW5kMV9zdGVwKCAwLCclZWJ4JywnJWVjeCcsJyVlZHgnLCclZWF4JywnMTInLCcweDg5NWNkN2JlJywnMjInKTsKK3JvdW5kMV9zdGVwKCAwLCclZWF4JywnJWVieCcsJyVlY3gnLCclZWR4JywnMTMnLCcweDZiOTAxMTIyJywgJzcnKTsKK3JvdW5kMV9zdGVwKCAwLCclZWR4JywnJWVheCcsJyVlYngnLCclZWN4JywnMTQnLCcweGZkOTg3MTkzJywnMTInKTsKK3JvdW5kMV9zdGVwKCAwLCclZWN4JywnJWVkeCcsJyVlYXgnLCclZWJ4JywnMTUnLCcweGE2Nzk0MzhlJywnMTcnKTsKK3JvdW5kMV9zdGVwKCAxLCclZWJ4JywnJWVjeCcsJyVlZHgnLCclZWF4JywgJzAnLCcweDQ5YjQwODIxJywnMjInKTsKKworcm91bmQyX3N0ZXAoLTEsJyVlYXgnLCclZWJ4JywnJWVjeCcsJyVlZHgnLCAnNicsJzB4ZjYxZTI1NjInLCAnNScpOworcm91bmQyX3N0ZXAoIDAsJyVlZHgnLCclZWF4JywnJWVieCcsJyVlY3gnLCcxMScsJzB4YzA0MGIzNDAnLCAnOScpOworcm91bmQyX3N0ZXAoIDAsJyVlY3gnLCclZWR4JywnJWVheCcsJyVlYngnLCAnMCcsJzB4MjY1ZTVhNTEnLCcxNCcpOworcm91bmQyX3N0ZXAoIDAsJyVlYngnLCclZWN4JywnJWVkeCcsJyVlYXgnLCAnNScsJzB4ZTliNmM3YWEnLCcyMCcpOworcm91bmQyX3N0ZXAoIDAsJyVlYXgnLCclZWJ4JywnJWVjeCcsJyVlZHgnLCcxMCcsJzB4ZDYyZjEwNWQnLCAnNScpOworcm91bmQyX3N0ZXAoIDAsJyVlZHgnLCclZWF4JywnJWVieCcsJyVlY3gnLCcxNScsICcweDI0NDE0NTMnLCAnOScpOworcm91bmQyX3N0ZXAoIDAsJyVlY3gnLCclZWR4JywnJWVheCcsJyVlYngnLCAnNCcsJzB4ZDhhMWU2ODEnLCcxNCcpOworcm91bmQyX3N0ZXAoIDAsJyVlYngnLCclZWN4JywnJWVkeCcsJyVlYXgnLCAnOScsJzB4ZTdkM2ZiYzgnLCcyMCcpOworcm91bmQyX3N0ZXAoIDAsJyVlYXgnLCclZWJ4JywnJWVjeCcsJyVlZHgnLCcxNCcsJzB4MjFlMWNkZTYnLCAnNScpOworcm91bmQyX3N0ZXAoIDAsJyVlZHgnLCclZWF4JywnJWVieCcsJyVlY3gnLCAnMycsJzB4YzMzNzA3ZDYnLCAnOScpOworcm91bmQyX3N0ZXAoIDAsJyVlY3gnLCclZWR4JywnJWVheCcsJyVlYngnLCAnOCcsJzB4ZjRkNTBkODcnLCcxNCcpOworcm91bmQyX3N0ZXAoIDAsJyVlYngnLCclZWN4JywnJWVkeCcsJyVlYXgnLCcxMycsJzB4NDU1YTE0ZWQnLCcyMCcpOworcm91bmQyX3N0ZXAoIDAsJyVlYXgnLCclZWJ4JywnJWVjeCcsJyVlZHgnLCAnMicsJzB4YTllM2U5MDUnLCAnNScpOworcm91bmQyX3N0ZXAoIDAsJyVlZHgnLCclZWF4JywnJWVieCcsJyVlY3gnLCAnNycsJzB4ZmNlZmEzZjgnLCAnOScpOworcm91bmQyX3N0ZXAoIDAsJyVlY3gnLCclZWR4JywnJWVheCcsJyVlYngnLCcxMicsJzB4Njc2ZjAyZDknLCcxNCcpOworcm91bmQyX3N0ZXAoIDEsJyVlYngnLCclZWN4JywnJWVkeCcsJyVlYXgnLCAnMCcsJzB4OGQyYTRjOGEnLCcyMCcpOworCityb3VuZDNfc3RlcCgtMSwnJWVheCcsJyVlYngnLCclZWN4JywnJWVkeCcsICc4JywnMHhmZmZhMzk0MicsICc0Jyk7Cityb3VuZDNfc3RlcCggMCwnJWVkeCcsJyVlYXgnLCclZWJ4JywnJWVjeCcsJzExJywnMHg4NzcxZjY4MScsJzExJyk7Cityb3VuZDNfc3RlcCggMCwnJWVjeCcsJyVlZHgnLCclZWF4JywnJWVieCcsJzE0JywnMHg2ZDlkNjEyMicsJzE2Jyk7Cityb3VuZDNfc3RlcCggMCwnJWVieCcsJyVlY3gnLCclZWR4JywnJWVheCcsICcxJywnMHhmZGU1MzgwYycsJzIzJyk7Cityb3VuZDNfc3RlcCggMCwnJWVheCcsJyVlYngnLCclZWN4JywnJWVkeCcsICc0JywnMHhhNGJlZWE0NCcsICc0Jyk7Cityb3VuZDNfc3RlcCggMCwnJWVkeCcsJyVlYXgnLCclZWJ4JywnJWVjeCcsICc3JywnMHg0YmRlY2ZhOScsJzExJyk7Cityb3VuZDNfc3RlcCggMCwnJWVjeCcsJyVlZHgnLCclZWF4JywnJWVieCcsJzEwJywnMHhmNmJiNGI2MCcsJzE2Jyk7Cityb3VuZDNfc3RlcCggMCwnJWVieCcsJyVlY3gnLCclZWR4JywnJWVheCcsJzEzJywnMHhiZWJmYmM3MCcsJzIzJyk7Cityb3VuZDNfc3RlcCggMCwnJWVheCcsJyVlYngnLCclZWN4JywnJWVkeCcsICcwJywnMHgyODliN2VjNicsICc0Jyk7Cityb3VuZDNfc3RlcCggMCwnJWVkeCcsJyVlYXgnLCclZWJ4JywnJWVjeCcsICczJywnMHhlYWExMjdmYScsJzExJyk7Cityb3VuZDNfc3RlcCggMCwnJWVjeCcsJyVlZHgnLCclZWF4JywnJWVieCcsICc2JywnMHhkNGVmMzA4NScsJzE2Jyk7Cityb3VuZDNfc3RlcCggMCwnJWVieCcsJyVlY3gnLCclZWR4JywnJWVheCcsICc5JywgJzB4NDg4MWQwNScsJzIzJyk7Cityb3VuZDNfc3RlcCggMCwnJWVheCcsJyVlYngnLCclZWN4JywnJWVkeCcsJzEyJywnMHhkOWQ0ZDAzOScsICc0Jyk7Cityb3VuZDNfc3RlcCggMCwnJWVkeCcsJyVlYXgnLCclZWJ4JywnJWVjeCcsJzE1JywnMHhlNmRiOTllNScsJzExJyk7Cityb3VuZDNfc3RlcCggMCwnJWVjeCcsJyVlZHgnLCclZWF4JywnJWVieCcsICcyJywnMHgxZmEyN2NmOCcsJzE2Jyk7Cityb3VuZDNfc3RlcCggMSwnJWVieCcsJyVlY3gnLCclZWR4JywnJWVheCcsICcwJywnMHhjNGFjNTY2NScsJzIzJyk7CisKK3JvdW5kNF9zdGVwKC0xLCclZWF4JywnJWVieCcsJyVlY3gnLCclZWR4JywgJzcnLCcweGY0MjkyMjQ0JywgJzYnKTsKK3JvdW5kNF9zdGVwKCAwLCclZWR4JywnJWVheCcsJyVlYngnLCclZWN4JywnMTQnLCcweDQzMmFmZjk3JywnMTAnKTsKK3JvdW5kNF9zdGVwKCAwLCclZWN4JywnJWVkeCcsJyVlYXgnLCclZWJ4JywgJzUnLCcweGFiOTQyM2E3JywnMTUnKTsKK3JvdW5kNF9zdGVwKCAwLCclZWJ4JywnJWVjeCcsJyVlZHgnLCclZWF4JywnMTInLCcweGZjOTNhMDM5JywnMjEnKTsKK3JvdW5kNF9zdGVwKCAwLCclZWF4JywnJWVieCcsJyVlY3gnLCclZWR4JywgJzMnLCcweDY1NWI1OWMzJywgJzYnKTsKK3JvdW5kNF9zdGVwKCAwLCclZWR4JywnJWVheCcsJyVlYngnLCclZWN4JywnMTAnLCcweDhmMGNjYzkyJywnMTAnKTsKK3JvdW5kNF9zdGVwKCAwLCclZWN4JywnJWVkeCcsJyVlYXgnLCclZWJ4JywgJzEnLCcweGZmZWZmNDdkJywnMTUnKTsKK3JvdW5kNF9zdGVwKCAwLCclZWJ4JywnJWVjeCcsJyVlZHgnLCclZWF4JywgJzgnLCcweDg1ODQ1ZGQxJywnMjEnKTsKK3JvdW5kNF9zdGVwKCAwLCclZWF4JywnJWVieCcsJyVlY3gnLCclZWR4JywnMTUnLCcweDZmYTg3ZTRmJywgJzYnKTsKK3JvdW5kNF9zdGVwKCAwLCclZWR4JywnJWVheCcsJyVlYngnLCclZWN4JywgJzYnLCcweGZlMmNlNmUwJywnMTAnKTsKK3JvdW5kNF9zdGVwKCAwLCclZWN4JywnJWVkeCcsJyVlYXgnLCclZWJ4JywnMTMnLCcweGEzMDE0MzE0JywnMTUnKTsKK3JvdW5kNF9zdGVwKCAwLCclZWJ4JywnJWVjeCcsJyVlZHgnLCclZWF4JywgJzQnLCcweDRlMDgxMWExJywnMjEnKTsKK3JvdW5kNF9zdGVwKCAwLCclZWF4JywnJWVieCcsJyVlY3gnLCclZWR4JywnMTEnLCcweGY3NTM3ZTgyJywgJzYnKTsKK3JvdW5kNF9zdGVwKCAwLCclZWR4JywnJWVheCcsJyVlYngnLCclZWN4JywgJzInLCcweGJkM2FmMjM1JywnMTAnKTsKK3JvdW5kNF9zdGVwKCAwLCclZWN4JywnJWVkeCcsJyVlYXgnLCclZWJ4JywgJzknLCcweDJhZDdkMmJiJywnMTUnKTsKK3JvdW5kNF9zdGVwKCAxLCclZWJ4JywnJWVjeCcsJyVlZHgnLCclZWF4JywgJzAnLCcweGViODZkMzkxJywnMjEnKTsKKyRjb2RlIC49IDw8RU9GOworCSMgYWRkIG9sZCB2YWx1ZXMgb2YgQSwgQiwgQywgRAorCWFkZAklcjhkLAklZWF4CisJYWRkCSVyOWQsCSVlYngKKwlhZGQJJXIxNGQsCSVlY3gKKwlhZGQJJXIxNWQsCSVlZHgKKworCSMgbG9vcCBjb250cm9sCisJYWRkCVwkNjQsCQklcnNpCQkjIHB0ciArPSA2NAorCWNtcAklcmRpLAkJJXJzaQkJIyBjbXAgZW5kIHdpdGggcHRyCisJamIJLkxsb29wCQkJCSMgam1wIGlmIHB0ciA8IGVuZAorCSMgRU5EIG9mIGxvb3Agb3ZlciAxNi13b3JkIGJsb2NrcworCisuTGVuZDoKKwltb3YJJWVheCwJCTAqNCglcmJwKQkjIGN0eC0+QSA9IEEKKwltb3YJJWVieCwJCTEqNCglcmJwKQkjIGN0eC0+QiA9IEIKKwltb3YJJWVjeCwJCTIqNCglcmJwKQkjIGN0eC0+QyA9IEMKKwltb3YJJWVkeCwJCTMqNCglcmJwKQkjIGN0eC0+RCA9IEQKKworCW1vdgkoJXJzcCksJXIxNQorCW1vdgk4KCVyc3ApLCVyMTQKKwltb3YJMTYoJXJzcCksJXIxMgorCW1vdgkyNCglcnNwKSwlcmJ4CisJbW92CTMyKCVyc3ApLCVyYnAKKwlhZGQJXCQ0MCwlcnNwCisuTGVwaWxvZ3VlOgorCXJldAorLnNpemUgbWQ1X2Jsb2NrX2FzbV9kYXRhX29yZGVyLC4tbWQ1X2Jsb2NrX2FzbV9kYXRhX29yZGVyCitFT0YKKworIyBFWENFUFRJT05fRElTUE9TSVRJT04gaGFuZGxlciAoRVhDRVBUSU9OX1JFQ09SRCAqcmVjLFVMT05HNjQgZnJhbWUsCisjCQlDT05URVhUICpjb250ZXh0LERJU1BBVENIRVJfQ09OVEVYVCAqZGlzcCkKK2lmICgkd2luNjQpIHsKK215ICRyZWM9IiVyY3giOworbXkgJGZyYW1lPSIlcmR4IjsKK215ICRjb250ZXh0PSIlcjgiOworbXkgJGRpc3A9IiVyOSI7CisKKyRjb2RlLj08PF9fXzsKKy5leHRlcm4JX19pbXBfUnRsVmlydHVhbFVud2luZAorLnR5cGUJc2VfaGFuZGxlcixcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMTYKK3NlX2hhbmRsZXI6CisJcHVzaAklcnNpCisJcHVzaAklcmRpCisJcHVzaAklcmJ4CisJcHVzaAklcmJwCisJcHVzaAklcjEyCisJcHVzaAklcjEzCisJcHVzaAklcjE0CisJcHVzaAklcjE1CisJcHVzaGZxCisJc3ViCVwkNjQsJXJzcAorCisJbW92CTEyMCgkY29udGV4dCksJXJheAkjIHB1bGwgY29udGV4dC0+UmF4CisJbW92CTI0OCgkY29udGV4dCksJXJieAkjIHB1bGwgY29udGV4dC0+UmlwCisKKwlsZWEJLkxwcm9sb2d1ZSglcmlwKSwlcjEwCisJY21wCSVyMTAsJXJieAkJIyBjb250ZXh0LT5SaXA8Lkxwcm9sb2d1ZQorCWpiCS5MaW5fcHJvbG9ndWUKKworCW1vdgkxNTIoJGNvbnRleHQpLCVyYXgJIyBwdWxsIGNvbnRleHQtPlJzcAorCisJbGVhCS5MZXBpbG9ndWUoJXJpcCksJXIxMAorCWNtcAklcjEwLCVyYngJCSMgY29udGV4dC0+UmlwPj0uTGVwaWxvZ3VlCisJamFlCS5MaW5fcHJvbG9ndWUKKworCWxlYQk0MCglcmF4KSwlcmF4CisKKwltb3YJLTgoJXJheCksJXJicAorCW1vdgktMTYoJXJheCksJXJieAorCW1vdgktMjQoJXJheCksJXIxMgorCW1vdgktMzIoJXJheCksJXIxNAorCW1vdgktNDAoJXJheCksJXIxNQorCW1vdgklcmJ4LDE0NCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJieAorCW1vdgklcmJwLDE2MCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJicAorCW1vdgklcjEyLDIxNigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlIxMgorCW1vdgklcjE0LDIzMigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlIxNAorCW1vdgklcjE1LDI0MCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlIxNQorCisuTGluX3Byb2xvZ3VlOgorCW1vdgk4KCVyYXgpLCVyZGkKKwltb3YJMTYoJXJheCksJXJzaQorCW1vdgklcmF4LDE1MigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJzcAorCW1vdgklcnNpLDE2OCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJzaQorCW1vdgklcmRpLDE3NigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJkaQorCisJbW92CTQwKCRkaXNwKSwlcmRpCQkjIGRpc3AtPkNvbnRleHRSZWNvcmQKKwltb3YJJGNvbnRleHQsJXJzaQkJIyBjb250ZXh0CisJbW92CVwkMTU0LCVlY3gJCSMgc2l6ZW9mKENPTlRFWFQpCisJLmxvbmcJMHhhNTQ4ZjNmYwkJIyBjbGQ7IHJlcCBtb3ZzcQorCisJbW92CSRkaXNwLCVyc2kKKwl4b3IJJXJjeCwlcmN4CQkjIGFyZzEsIFVOV19GTEFHX05IQU5ETEVSCisJbW92CTgoJXJzaSksJXJkeAkJIyBhcmcyLCBkaXNwLT5JbWFnZUJhc2UKKwltb3YJMCglcnNpKSwlcjgJCSMgYXJnMywgZGlzcC0+Q29udHJvbFBjCisJbW92CTE2KCVyc2kpLCVyOQkJIyBhcmc0LCBkaXNwLT5GdW5jdGlvbkVudHJ5CisJbW92CTQwKCVyc2kpLCVyMTAJCSMgZGlzcC0+Q29udGV4dFJlY29yZAorCWxlYQk1NiglcnNpKSwlcjExCQkjICZkaXNwLT5IYW5kbGVyRGF0YQorCWxlYQkyNCglcnNpKSwlcjEyCQkjICZkaXNwLT5Fc3RhYmxpc2hlckZyYW1lCisJbW92CSVyMTAsMzIoJXJzcCkJCSMgYXJnNQorCW1vdgklcjExLDQwKCVyc3ApCQkjIGFyZzYKKwltb3YJJXIxMiw0OCglcnNwKQkJIyBhcmc3CisJbW92CSVyY3gsNTYoJXJzcCkJCSMgYXJnOCwgKE5VTEwpCisJY2FsbAkqX19pbXBfUnRsVmlydHVhbFVud2luZCglcmlwKQorCisJbW92CVwkMSwlZWF4CQkjIEV4Y2VwdGlvbkNvbnRpbnVlU2VhcmNoCisJYWRkCVwkNjQsJXJzcAorCXBvcGZxCisJcG9wCSVyMTUKKwlwb3AJJXIxNAorCXBvcAklcjEzCisJcG9wCSVyMTIKKwlwb3AJJXJicAorCXBvcAklcmJ4CisJcG9wCSVyZGkKKwlwb3AJJXJzaQorCXJldAorLnNpemUJc2VfaGFuZGxlciwuLXNlX2hhbmRsZXIKKworLnNlY3Rpb24JLnBkYXRhCisuYWxpZ24JNAorCS5ydmEJLkxTRUhfYmVnaW5fbWQ1X2Jsb2NrX2FzbV9kYXRhX29yZGVyCisJLnJ2YQkuTFNFSF9lbmRfbWQ1X2Jsb2NrX2FzbV9kYXRhX29yZGVyCisJLnJ2YQkuTFNFSF9pbmZvX21kNV9ibG9ja19hc21fZGF0YV9vcmRlcgorCisuc2VjdGlvbgkueGRhdGEKKy5hbGlnbgk4CisuTFNFSF9pbmZvX21kNV9ibG9ja19hc21fZGF0YV9vcmRlcjoKKwkuYnl0ZQk5LDAsMCwwCisJLnJ2YQlzZV9oYW5kbGVyCitfX18KK30KKworcHJpbnQgJGNvZGU7CisKK2Nsb3NlIFNURE9VVDsKZGlmZiAtLWdpdCBhL2NyeXB0by9tZDUvbWQ1LmMgYi9jcnlwdG8vbWQ1L21kNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMGI4NmIKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vbWQ1L21kNS5jCkBAIC0wLDAgKzEsMjc0IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisKKwordWludDhfdCAqTUQ1KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBsZW4sIHVpbnQ4X3QgKm91dCkgeworICBNRDVfQ1RYIGN0eDsKKyAgc3RhdGljIHVpbnQ4X3QgZGlnZXN0W01ENV9ESUdFU1RfTEVOR1RIXTsKKworICAvKiBUT0RPKGZvcmspOiByZW1vdmUgdGhpcyBzdGF0aWMgYnVmZmVyLiAqLworICBpZiAob3V0ID09IE5VTEwpIHsKKyAgICBvdXQgPSBkaWdlc3Q7CisgIH0KKworICBNRDVfSW5pdCgmY3R4KTsKKyAgTUQ1X1VwZGF0ZSgmY3R4LCBkYXRhLCBsZW4pOworICBNRDVfRmluYWwob3V0LCAmY3R4KTsKKworICByZXR1cm4gb3V0OworfQorCitpbnQgTUQ1X0luaXQoTUQ1X0NUWCAqbWQ1KSB7CisgIG1lbXNldChtZDUsIDAsIHNpemVvZihNRDVfQ1RYKSk7CisgIG1kNS0+QSA9IDB4Njc0NTIzMDFVTDsKKyAgbWQ1LT5CID0gMHhlZmNkYWI4OVVMOworICBtZDUtPkMgPSAweDk4YmFkY2ZlVUw7CisgIG1kNS0+RCA9IDB4MTAzMjU0NzZVTDsKKyAgcmV0dXJuIDE7Cit9CisKKyNpZiAhZGVmaW5lZChPUEVOU1NMX05PX0FTTSkgJiYgXAorICAgIChkZWZpbmVkKE9QRU5TU0xfWDg2XzY0KSB8fCBkZWZpbmVkKE9QRU5TU0xfWDg2KSkKKyNkZWZpbmUgTUQ1X0FTTQorI2RlZmluZSBtZDVfYmxvY2tfZGF0YV9vcmRlciBtZDVfYmxvY2tfYXNtX2RhdGFfb3JkZXIKKyNlbmRpZgorCisKK3ZvaWQgbWQ1X2Jsb2NrX2RhdGFfb3JkZXIoTUQ1X0NUWCAqbWQ1LCBjb25zdCB2b2lkICpwLCBzaXplX3QgbnVtKTsKKworI2RlZmluZSBEQVRBX09SREVSX0lTX0xJVFRMRV9FTkRJQU4KKworI2RlZmluZSBIQVNIX0xPTkcgdWludDMyX3QKKyNkZWZpbmUgSEFTSF9DVFggTUQ1X0NUWAorI2RlZmluZSBIQVNIX0NCTE9DSyA2NAorI2RlZmluZSBIQVNIX1VQREFURSBNRDVfVXBkYXRlCisjZGVmaW5lIEhBU0hfVFJBTlNGT1JNIE1ENV9UcmFuc2Zvcm0KKyNkZWZpbmUgSEFTSF9GSU5BTCBNRDVfRmluYWwKKyNkZWZpbmUgSEFTSF9NQUtFX1NUUklORyhjLCBzKSBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVuc2lnbmVkIGxvbmcgbGw7ICAgICAgICAgIFwKKyAgICBsbCA9IChjKS0+QTsgICAgICAgICAgICAgICBcCisgICAgKHZvaWQpIEhPU1RfbDJjKGxsLCAocykpOyAgXAorICAgIGxsID0gKGMpLT5COyAgICAgICAgICAgICAgIFwKKyAgICAodm9pZCkgSE9TVF9sMmMobGwsIChzKSk7ICBcCisgICAgbGwgPSAoYyktPkM7ICAgICAgICAgICAgICAgXAorICAgICh2b2lkKSBIT1NUX2wyYyhsbCwgKHMpKTsgIFwKKyAgICBsbCA9IChjKS0+RDsgICAgICAgICAgICAgICBcCisgICAgKHZvaWQpIEhPU1RfbDJjKGxsLCAocykpOyAgXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBIQVNIX0JMT0NLX0RBVEFfT1JERVIgbWQ1X2Jsb2NrX2RhdGFfb3JkZXIKKworI2luY2x1ZGUgIi4uL2RpZ2VzdC9tZDMyX2NvbW1vbi5oIgorCisvKiBBcyBwb2ludGVkIG91dCBieSBXZWkgRGFpIDx3ZWlkYWlAZXNraW1vLmNvbT4sIHRoZSBhYm92ZSBjYW4gYmUKKyAqIHNpbXBsaWZpZWQgdG8gdGhlIGNvZGUgYmVsb3cuICBXZWkgYXR0cmlidXRlcyB0aGVzZSBvcHRpbWl6YXRpb25zCisgKiB0byBQZXRlciBHdXRtYW5uJ3MgU0hTIGNvZGUsIGFuZCBoZSBhdHRyaWJ1dGVzIGl0IHRvIFJpY2ggU2Nocm9lcHBlbC4KKyAqLworI2RlZmluZQlGKGIsYyxkKQkoKCgoYykgXiAoZCkpICYgKGIpKSBeIChkKSkKKyNkZWZpbmUJRyhiLGMsZCkJKCgoKGIpIF4gKGMpKSAmIChkKSkgXiAoYykpCisjZGVmaW5lCUgoYixjLGQpCSgoYikgXiAoYykgXiAoZCkpCisjZGVmaW5lCUkoYixjLGQpCSgoKH4oZCkpIHwgKGIpKSBeIChjKSkKKworI2RlZmluZSBSMChhLGIsYyxkLGsscyx0KSB7IFwKKwlhKz0oKGspKyh0KStGKChiKSwoYyksKGQpKSk7IFwKKwlhPVJPVEFURShhLHMpOyBcCisJYSs9YjsgfTtcCisKKyNkZWZpbmUgUjEoYSxiLGMsZCxrLHMsdCkgeyBcCisJYSs9KChrKSsodCkrRygoYiksKGMpLChkKSkpOyBcCisJYT1ST1RBVEUoYSxzKTsgXAorCWErPWI7IH07CisKKyNkZWZpbmUgUjIoYSxiLGMsZCxrLHMsdCkgeyBcCisJYSs9KChrKSsodCkrSCgoYiksKGMpLChkKSkpOyBcCisJYT1ST1RBVEUoYSxzKTsgXAorCWErPWI7IH07CisKKyNkZWZpbmUgUjMoYSxiLGMsZCxrLHMsdCkgeyBcCisJYSs9KChrKSsodCkrSSgoYiksKGMpLChkKSkpOyBcCisJYT1ST1RBVEUoYSxzKTsgXAorCWErPWI7IH07CisKKyNpZm5kZWYgbWQ1X2Jsb2NrX2RhdGFfb3JkZXIKKyNpZmRlZiBYCisjdW5kZWYgWAorI2VuZGlmCit2b2lkIG1kNV9ibG9ja19kYXRhX29yZGVyKE1ENV9DVFggKm1kNSwgY29uc3Qgdm9pZCAqaW5fZGF0YSwgc2l6ZV90IG51bSkgeworICBjb25zdCB1aW50OF90ICpkYXRhID0gaW5fZGF0YTsKKyAgdWludDMyX3QgQSwgQiwgQywgRCwgbDsKKyAgdWludDMyX3QgWFgwLCBYWDEsIFhYMiwgWFgzLCBYWDQsIFhYNSwgWFg2LCBYWDcsIFhYOCwgWFg5LCBYWDEwLCBYWDExLCBYWDEyLAorICAgICAgWFgxMywgWFgxNCwgWFgxNTsKKyNkZWZpbmUgWChpKSBYWCMjaQorCisgIEEgPSBtZDUtPkE7CisgIEIgPSBtZDUtPkI7CisgIEMgPSBtZDUtPkM7CisgIEQgPSBtZDUtPkQ7CisKKyAgZm9yICg7IG51bS0tOykgeworICAgIEhPU1RfYzJsKGRhdGEsIGwpOworICAgIFgoMCkgPSBsOworICAgIEhPU1RfYzJsKGRhdGEsIGwpOworICAgIFgoMSkgPSBsOworICAgIC8qIFJvdW5kIDAgKi8KKyAgICBSMChBLCBCLCBDLCBELCBYKDApLCA3LCAweGQ3NmFhNDc4TCk7CisgICAgSE9TVF9jMmwoZGF0YSwgbCk7CisgICAgWCgyKSA9IGw7CisgICAgUjAoRCwgQSwgQiwgQywgWCgxKSwgMTIsIDB4ZThjN2I3NTZMKTsKKyAgICBIT1NUX2MybChkYXRhLCBsKTsKKyAgICBYKDMpID0gbDsKKyAgICBSMChDLCBELCBBLCBCLCBYKDIpLCAxNywgMHgyNDIwNzBkYkwpOworICAgIEhPU1RfYzJsKGRhdGEsIGwpOworICAgIFgoNCkgPSBsOworICAgIFIwKEIsIEMsIEQsIEEsIFgoMyksIDIyLCAweGMxYmRjZWVlTCk7CisgICAgSE9TVF9jMmwoZGF0YSwgbCk7CisgICAgWCg1KSA9IGw7CisgICAgUjAoQSwgQiwgQywgRCwgWCg0KSwgNywgMHhmNTdjMGZhZkwpOworICAgIEhPU1RfYzJsKGRhdGEsIGwpOworICAgIFgoNikgPSBsOworICAgIFIwKEQsIEEsIEIsIEMsIFgoNSksIDEyLCAweDQ3ODdjNjJhTCk7CisgICAgSE9TVF9jMmwoZGF0YSwgbCk7CisgICAgWCg3KSA9IGw7CisgICAgUjAoQywgRCwgQSwgQiwgWCg2KSwgMTcsIDB4YTgzMDQ2MTNMKTsKKyAgICBIT1NUX2MybChkYXRhLCBsKTsKKyAgICBYKDgpID0gbDsKKyAgICBSMChCLCBDLCBELCBBLCBYKDcpLCAyMiwgMHhmZDQ2OTUwMUwpOworICAgIEhPU1RfYzJsKGRhdGEsIGwpOworICAgIFgoOSkgPSBsOworICAgIFIwKEEsIEIsIEMsIEQsIFgoOCksIDcsIDB4Njk4MDk4ZDhMKTsKKyAgICBIT1NUX2MybChkYXRhLCBsKTsKKyAgICBYKDEwKSA9IGw7CisgICAgUjAoRCwgQSwgQiwgQywgWCg5KSwgMTIsIDB4OGI0NGY3YWZMKTsKKyAgICBIT1NUX2MybChkYXRhLCBsKTsKKyAgICBYKDExKSA9IGw7CisgICAgUjAoQywgRCwgQSwgQiwgWCgxMCksIDE3LCAweGZmZmY1YmIxTCk7CisgICAgSE9TVF9jMmwoZGF0YSwgbCk7CisgICAgWCgxMikgPSBsOworICAgIFIwKEIsIEMsIEQsIEEsIFgoMTEpLCAyMiwgMHg4OTVjZDdiZUwpOworICAgIEhPU1RfYzJsKGRhdGEsIGwpOworICAgIFgoMTMpID0gbDsKKyAgICBSMChBLCBCLCBDLCBELCBYKDEyKSwgNywgMHg2YjkwMTEyMkwpOworICAgIEhPU1RfYzJsKGRhdGEsIGwpOworICAgIFgoMTQpID0gbDsKKyAgICBSMChELCBBLCBCLCBDLCBYKDEzKSwgMTIsIDB4ZmQ5ODcxOTNMKTsKKyAgICBIT1NUX2MybChkYXRhLCBsKTsKKyAgICBYKDE1KSA9IGw7CisgICAgUjAoQywgRCwgQSwgQiwgWCgxNCksIDE3LCAweGE2Nzk0MzhlTCk7CisgICAgUjAoQiwgQywgRCwgQSwgWCgxNSksIDIyLCAweDQ5YjQwODIxTCk7CisgICAgLyogUm91bmQgMSAqLworICAgIFIxKEEsIEIsIEMsIEQsIFgoMSksIDUsIDB4ZjYxZTI1NjJMKTsKKyAgICBSMShELCBBLCBCLCBDLCBYKDYpLCA5LCAweGMwNDBiMzQwTCk7CisgICAgUjEoQywgRCwgQSwgQiwgWCgxMSksIDE0LCAweDI2NWU1YTUxTCk7CisgICAgUjEoQiwgQywgRCwgQSwgWCgwKSwgMjAsIDB4ZTliNmM3YWFMKTsKKyAgICBSMShBLCBCLCBDLCBELCBYKDUpLCA1LCAweGQ2MmYxMDVkTCk7CisgICAgUjEoRCwgQSwgQiwgQywgWCgxMCksIDksIDB4MDI0NDE0NTNMKTsKKyAgICBSMShDLCBELCBBLCBCLCBYKDE1KSwgMTQsIDB4ZDhhMWU2ODFMKTsKKyAgICBSMShCLCBDLCBELCBBLCBYKDQpLCAyMCwgMHhlN2QzZmJjOEwpOworICAgIFIxKEEsIEIsIEMsIEQsIFgoOSksIDUsIDB4MjFlMWNkZTZMKTsKKyAgICBSMShELCBBLCBCLCBDLCBYKDE0KSwgOSwgMHhjMzM3MDdkNkwpOworICAgIFIxKEMsIEQsIEEsIEIsIFgoMyksIDE0LCAweGY0ZDUwZDg3TCk7CisgICAgUjEoQiwgQywgRCwgQSwgWCg4KSwgMjAsIDB4NDU1YTE0ZWRMKTsKKyAgICBSMShBLCBCLCBDLCBELCBYKDEzKSwgNSwgMHhhOWUzZTkwNUwpOworICAgIFIxKEQsIEEsIEIsIEMsIFgoMiksIDksIDB4ZmNlZmEzZjhMKTsKKyAgICBSMShDLCBELCBBLCBCLCBYKDcpLCAxNCwgMHg2NzZmMDJkOUwpOworICAgIFIxKEIsIEMsIEQsIEEsIFgoMTIpLCAyMCwgMHg4ZDJhNGM4YUwpOworICAgIC8qIFJvdW5kIDIgKi8KKyAgICBSMihBLCBCLCBDLCBELCBYKDUpLCA0LCAweGZmZmEzOTQyTCk7CisgICAgUjIoRCwgQSwgQiwgQywgWCg4KSwgMTEsIDB4ODc3MWY2ODFMKTsKKyAgICBSMihDLCBELCBBLCBCLCBYKDExKSwgMTYsIDB4NmQ5ZDYxMjJMKTsKKyAgICBSMihCLCBDLCBELCBBLCBYKDE0KSwgMjMsIDB4ZmRlNTM4MGNMKTsKKyAgICBSMihBLCBCLCBDLCBELCBYKDEpLCA0LCAweGE0YmVlYTQ0TCk7CisgICAgUjIoRCwgQSwgQiwgQywgWCg0KSwgMTEsIDB4NGJkZWNmYTlMKTsKKyAgICBSMihDLCBELCBBLCBCLCBYKDcpLCAxNiwgMHhmNmJiNGI2MEwpOworICAgIFIyKEIsIEMsIEQsIEEsIFgoMTApLCAyMywgMHhiZWJmYmM3MEwpOworICAgIFIyKEEsIEIsIEMsIEQsIFgoMTMpLCA0LCAweDI4OWI3ZWM2TCk7CisgICAgUjIoRCwgQSwgQiwgQywgWCgwKSwgMTEsIDB4ZWFhMTI3ZmFMKTsKKyAgICBSMihDLCBELCBBLCBCLCBYKDMpLCAxNiwgMHhkNGVmMzA4NUwpOworICAgIFIyKEIsIEMsIEQsIEEsIFgoNiksIDIzLCAweDA0ODgxZDA1TCk7CisgICAgUjIoQSwgQiwgQywgRCwgWCg5KSwgNCwgMHhkOWQ0ZDAzOUwpOworICAgIFIyKEQsIEEsIEIsIEMsIFgoMTIpLCAxMSwgMHhlNmRiOTllNUwpOworICAgIFIyKEMsIEQsIEEsIEIsIFgoMTUpLCAxNiwgMHgxZmEyN2NmOEwpOworICAgIFIyKEIsIEMsIEQsIEEsIFgoMiksIDIzLCAweGM0YWM1NjY1TCk7CisgICAgLyogUm91bmQgMyAqLworICAgIFIzKEEsIEIsIEMsIEQsIFgoMCksIDYsIDB4ZjQyOTIyNDRMKTsKKyAgICBSMyhELCBBLCBCLCBDLCBYKDcpLCAxMCwgMHg0MzJhZmY5N0wpOworICAgIFIzKEMsIEQsIEEsIEIsIFgoMTQpLCAxNSwgMHhhYjk0MjNhN0wpOworICAgIFIzKEIsIEMsIEQsIEEsIFgoNSksIDIxLCAweGZjOTNhMDM5TCk7CisgICAgUjMoQSwgQiwgQywgRCwgWCgxMiksIDYsIDB4NjU1YjU5YzNMKTsKKyAgICBSMyhELCBBLCBCLCBDLCBYKDMpLCAxMCwgMHg4ZjBjY2M5MkwpOworICAgIFIzKEMsIEQsIEEsIEIsIFgoMTApLCAxNSwgMHhmZmVmZjQ3ZEwpOworICAgIFIzKEIsIEMsIEQsIEEsIFgoMSksIDIxLCAweDg1ODQ1ZGQxTCk7CisgICAgUjMoQSwgQiwgQywgRCwgWCg4KSwgNiwgMHg2ZmE4N2U0ZkwpOworICAgIFIzKEQsIEEsIEIsIEMsIFgoMTUpLCAxMCwgMHhmZTJjZTZlMEwpOworICAgIFIzKEMsIEQsIEEsIEIsIFgoNiksIDE1LCAweGEzMDE0MzE0TCk7CisgICAgUjMoQiwgQywgRCwgQSwgWCgxMyksIDIxLCAweDRlMDgxMWExTCk7CisgICAgUjMoQSwgQiwgQywgRCwgWCg0KSwgNiwgMHhmNzUzN2U4MkwpOworICAgIFIzKEQsIEEsIEIsIEMsIFgoMTEpLCAxMCwgMHhiZDNhZjIzNUwpOworICAgIFIzKEMsIEQsIEEsIEIsIFgoMiksIDE1LCAweDJhZDdkMmJiTCk7CisgICAgUjMoQiwgQywgRCwgQSwgWCg5KSwgMjEsIDB4ZWI4NmQzOTFMKTsKKworICAgIEEgPSBtZDUtPkEgKz0gQTsKKyAgICBCID0gbWQ1LT5CICs9IEI7CisgICAgQyA9IG1kNS0+QyArPSBDOworICAgIEQgPSBtZDUtPkQgKz0gRDsKKyAgfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jcnlwdG8vbWQ1L21kNS5oIGIvY3J5cHRvL21kNS9tZDUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTFhMDBmCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL21kNS9tZDUuaApAQCAtMCwwICsxLDEwNiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpZm5kZWYgT1BFTlNTTF9IRUFERVJfTUQ1X0gKKyNkZWZpbmUgT1BFTlNTTF9IRUFERVJfTUQ1X0gKKworI2luY2x1ZGUgPG9wZW5zc2wvYmFzZS5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogTUQ1LiAqLworCisKKy8qIE1ENV9DQkxPQ0sgaXMgdGhlIGJsb2NrIHNpemUgb2YgTUQ1LiAqLworI2RlZmluZSBNRDVfQ0JMT0NLIDY0CisKKy8qIE1ENV9ESUdFU1RfTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgYW4gTUQ1IGRpZ2VzdC4gKi8KKyNkZWZpbmUgTUQ1X0RJR0VTVF9MRU5HVEggMTYKKworLyogTUQ1MV9Jbml0IGluaXRpYWxpc2VzIHxtZDV8IGFuZCByZXR1cm5zIDEuICovCitpbnQgTUQ1X0luaXQoTUQ1X0NUWCAqbWQ1KTsKKworLyogTUQ1X1VwZGF0ZSBhZGRzIHxsZW58IGJ5dGVzIGZyb20gfGRhdGF8IHRvIHxtZDV8IGFuZCByZXR1cm5zIG9uZS4gKi8KK2ludCBNRDVfVXBkYXRlKE1ENV9DVFggKm1kNSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbik7CisKKy8qIE1ENV9GaW5hbCBhZGRzIHRoZSBmaW5hbCBwYWRkaW5nIHRvIHxtZDV8IGFuZCB3cml0ZXMgdGhlIHJlc3VsdGluZyBkaWdlc3QgdG8KKyAqIHxtZHwsIHdoaWNoIG11c3QgaGF2ZSBhdCBsZWFzdCB8TUQ1X0RJR0VTVF9MRU5HVEh8IGJ5dGVzIG9mIHNwYWNlLiBJdAorICogcmV0dXJucyBvbmUuICovCitpbnQgTUQ1X0ZpbmFsKHVpbnQ4X3QgKm1kLCBNRDVfQ1RYICptZDUpOworCisvKiBNRDUgd3JpdGVzIHRoZSBkaWdlc3Qgb2YgfGxlbnwgYnl0ZXMgZnJvbSB8ZGF0YXwgdG8gfG91dHwgYW5kIHJldHVybnMgfG91dHwuCisgKiBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IHxNRDVfRElHRVNUX0xFTkdUSHwgYnl0ZXMgb2Ygc3BhY2UgaW4gfG91dHwuICovCit1aW50OF90ICpNRDUoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGxlbiwgdWludDhfdCAqb3V0KTsKKworLyogTUQ1X1RyYW5zZm9ybSBpcyBhIGxvdy1sZXZlbCBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgc2luZ2xlLCBNRDUgYmxvY2sKKyAqIHRyYW5zZm9ybWF0aW9uIHVzaW5nIHRoZSBzdGF0ZSBmcm9tIHxtZDV8IGFuZCA2NCBieXRlcyBmcm9tIHxibG9ja3wuICovCit2b2lkIE1ENV9UcmFuc2Zvcm0oTUQ1X0NUWCAqbWQ1LCBjb25zdCB1aW50OF90ICpibG9jayk7CisKK3N0cnVjdCBtZDVfc3RhdGVfc3QgeworICB1aW50MzJfdCBBLCBCLCBDLCBEOworICB1aW50MzJfdCBObCwgTmg7CisgIHVpbnQzMl90IGRhdGFbMTZdOworICB1bnNpZ25lZCBpbnQgbnVtOworfTsKKworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30gIC8qIGV4dGVybiBDICovCisjZW5kaWYKKworI2VuZGlmICAvKiBPUEVOU1NMX0hFQURFUl9NRDVfSCAqLwpkaWZmIC0tZ2l0IGEvY3J5cHRvL21kNS9tZDVfdGVzdC5jIGIvY3J5cHRvL21kNS9tZDVfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNTk4NGMKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vbWQ1L21kNV90ZXN0LmMKQEAgLTAsMCArMSwxMDAgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9kaWdlc3QuaD4KKworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGVzdFtdID0geworICAgICIiLCAiYSIsICJhYmMiLCAibWVzc2FnZSBkaWdlc3QiLCAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLAorICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSIsCisgICAgIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0IgorICAgICI1Njc4OTAiLAorICAgIE5VTEwsIH07CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBleHBlY3RlZFtdID0geworICAgICJkNDFkOGNkOThmMDBiMjA0ZTk4MDA5OThlY2Y4NDI3ZSIsICIwY2MxNzViOWMwZjFiNmE4MzFjMzk5ZTI2OTc3MjY2MSIsCisgICAgIjkwMDE1MDk4M2NkMjRmYjBkNjk2M2Y3ZDI4ZTE3ZjcyIiwgImY5NmI2OTdkN2NiNzkzOGQ1MjVhMmYzMWFhZjE2MWQwIiwKKyAgICAiYzNmY2QzZDc2MTkyZTQwMDdkZmI0OTZjY2E2N2UxM2IiLCAiZDE3NGFiOThkMjc3ZDlmNWE1NjExYzJjOWY0MTlkOWYiLAorICAgICI1N2VkZjRhMjJiZTNjOTU1YWM0OWRhMmUyMTA3YjY3YSIsIH07CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICBzaXplX3QgaSwgajsKKyAgdWludDhfdCBtZFtNRDVfRElHRVNUX0xFTkdUSF07CisgIGNoYXIgbWRfaGV4W3NpemVvZihtZCkgKiAyICsgMV07CisgIGludCBvayA9IDE7CisKKyAgZm9yIChpID0gMDsgdGVzdFtpXSAhPSBOVUxMOyBpKyspIHsKKyAgICBFVlBfRGlnZXN0KHRlc3RbaV0sIHN0cmxlbih0ZXN0W2ldKSwgbWQsIE5VTEwsIEVWUF9tZDUoKSwgTlVMTCk7CisgICAgZm9yIChqID0gMDsgaiA8IHNpemVvZihtZCk7IGorKykgeworICAgICAgc3ByaW50ZigmbWRfaGV4W2ogKiAyXSwgIiUwMngiLCBtZFtqXSk7CisgICAgfQorICAgIG1kX2hleFtNRDVfRElHRVNUX0xFTkdUSCAqIDJdID0gMDsKKworICAgIGlmIChzdHJjbXAobWRfaGV4LCBleHBlY3RlZFtpXSkgIT0gMCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICIjJXU6IGdvdCAlcywgd2FudGVkICVzXG4iLCAodW5zaWduZWQpaSwgbWRfaGV4LAorICAgICAgICAgICAgICBleHBlY3RlZFtpXSk7CisgICAgICBvayA9IDA7CisgICAgfQorICB9CisKKyAgaWYgKG9rKSB7CisgICAgcHJpbnRmKCJQQVNTXG4iKTsKKyAgfQorCisgIHJldHVybiBvayA/IDAgOiAxOworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL21lbS5jIGIvY3J5cHRvL21lbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhODQ4MmMKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vbWVtLmMKQEAgLTAsMCArMSwxNDAgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjZGVmaW5lIF9CU0RfU09VUkNFIC8qIG5lZWRlZCBmb3Igc3RyZHVwLCBzbnByaW50ZiwgdnByaW50ZiBldGMgKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisKK3ZvaWQgKk9QRU5TU0xfcmVhbGxvY19jbGVhbih2b2lkICpwdHIsIHNpemVfdCBvbGRfc2l6ZSwgc2l6ZV90IG5ld19zaXplKSB7CisgIHZvaWQgKnJldCA9IE5VTEw7CisKKyAgaWYgKHB0ciA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE9QRU5TU0xfbWFsbG9jKG5ld19zaXplKTsKKyAgfQorCisgIGlmIChuZXdfc2l6ZSA9PSAwKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAvKiBXZSBkb24ndCBzdXBwb3J0IHNocmlua2luZyB0aGUgYnVmZmVyLiBOb3RlIHRoZSBtZW1jcHkgdGhhdCBjb3BpZXMKKyAgICogfG9sZF9zaXplfCBieXRlcyB0byB0aGUgbmV3IGJ1ZmZlciwgYmVsb3cuICovCisgIGlmIChuZXdfc2l6ZSA8IG9sZF9zaXplKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICByZXQgPSBPUEVOU1NMX21hbGxvYyhuZXdfc2l6ZSk7CisgIGlmIChyZXQgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgbWVtY3B5KHJldCwgcHRyLCBvbGRfc2l6ZSk7CisgIE9QRU5TU0xfY2xlYW5zZShwdHIsIG9sZF9zaXplKTsKKyAgT1BFTlNTTF9mcmVlKHB0cik7CisgIHJldHVybiByZXQ7Cit9CisKK2ludCBDUllQVE9fbWVtY21wKGNvbnN0IHZvaWQgKmluX2EsIGNvbnN0IHZvaWQgKmluX2IsIHNpemVfdCBsZW4pIHsKKyAgc2l6ZV90IGk7CisgIGNvbnN0IHVpbnQ4X3QgKmEgPSBpbl9hOworICBjb25zdCB1aW50OF90ICpiID0gaW5fYjsKKyAgdWludDhfdCB4ID0gMDsKKworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICB4IHw9IGFbaV0gXiBiW2ldOworICB9CisKKyAgcmV0dXJuIHg7Cit9CisKK3VpbnQzMl90IE9QRU5TU0xfaGFzaDMyKGNvbnN0IHZvaWQgKnB0ciwgc2l6ZV90IGxlbikgeworICAvKiBUaGVzZSBhcmUgdGhlIEZOVi0xYSBwYXJhbWV0ZXJzIGZvciAzMiBiaXRzLiAqLworICBzdGF0aWMgY29uc3QgdWludDMyX3Qga1ByaW1lID0gMTY3Nzc2MTl1OworICBzdGF0aWMgY29uc3QgdWludDMyX3Qga09mZnNldEJhc2lzID0gMjE2NjEzNjI2MXU7CisKKyAgY29uc3QgdWludDhfdCAqaW4gPSBwdHI7CisgIHNpemVfdCBpOworICB1aW50MzJfdCBoID0ga09mZnNldEJhc2lzOworCisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgIGggXj0gaW5baV07CisgICAgaCAqPSBrUHJpbWU7CisgIH0KKworICByZXR1cm4gaDsKK30KKworY2hhciAqT1BFTlNTTF9zdHJkdXAoY29uc3QgY2hhciAqcykgeyByZXR1cm4gc3RyZHVwKHMpOyB9CisKK2ludCBCSU9fc25wcmludGYoY2hhciAqYnVmLCBzaXplX3QgbiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pIHsKKyAgdmFfbGlzdCBhcmdzOworICBpbnQgcmV0OworCisgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisKKyAgcmV0ID0gQklPX3ZzbnByaW50ZihidWYsIG4sIGZvcm1hdCwgYXJncyk7CisKKyAgdmFfZW5kKGFyZ3MpOworICByZXR1cm4gcmV0OworfQorCitpbnQgQklPX3ZzbnByaW50ZihjaGFyICpidWYsIHNpemVfdCBuLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykgeworICByZXR1cm4gdnNucHJpbnRmKGJ1ZiwgbiwgZm9ybWF0LCBhcmdzKTsKK30KZGlmZiAtLWdpdCBhL2NyeXB0by9tZW0uaCBiL2NyeXB0by9tZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzRmZWY4Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL21lbS5oCkBAIC0wLDAgKzEsMTI2IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2lmbmRlZiBPUEVOU1NMX0hFQURFUl9NRU1fSAorI2RlZmluZSBPUEVOU1NMX0hFQURFUl9NRU1fSAorCisjaW5jbHVkZSA8b3BlbnNzbC9iYXNlLmg+CisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIE9wZW5TU0wgaGFzLCBoaXN0b3JpY2FsbHksIGhhZCBhIGNvbXBsZXggc2V0IG9mIG1hbGxvYyBkZWJ1Z2dpbmcgb3B0aW9ucy4KKyAqIEhvd2V2ZXIsIHRoYXQgd2FzIHdyaXR0ZW4gaW4gYSB0aW1lIGJlZm9yZSBWYWxncmluZCBhbmQgQVNBTi4gU2luY2Ugd2Ugbm93CisgKiBoYXZlIHRob3NlIHRvb2xzLCB0aGUgT3BlblNTTCBhbGxvY2F0aW9uIGZ1bmN0aW9ucyBhcmUgc2ltcGx5IG1hY3JvcyBhcm91bmQKKyAqIHRoZSBzdGFuZGFyZCBtZW1vcnkgZnVuY3Rpb25zLiAqLworCisKKyNkZWZpbmUgT1BFTlNTTF9tYWxsb2MgbWFsbG9jCisjZGVmaW5lIE9QRU5TU0xfcmVhbGxvYyByZWFsbG9jCisjZGVmaW5lIE9QRU5TU0xfZnJlZSBmcmVlCisKKy8qIE9QRU5TU0xfcmVhbGxvY19jbGVhbiBhY3RzIGxpa2UgfHJlYWxsb2N8LCBidXQgY2xlYXJzIHRoZSBwcmV2aW91cyBtZW1vcnkKKyAqIGJ1ZmZlci4gIEJlY2F1c2UgdGhpcyBpcyBpbXBsZW1lbnRlZCBhcyBhIHdyYXBwZXIgYXJvdW5kIHxtYWxsb2N8LCBpdCBuZWVkcworICogdG8gYmUgZ2l2ZW4gdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IHxwdHJ8LiAqLwordm9pZCAqT1BFTlNTTF9yZWFsbG9jX2NsZWFuKHZvaWQgKnB0ciwgc2l6ZV90IG9sZF9zaXplLCBzaXplX3QgbmV3X3NpemUpOworCisvKiBPUEVOU1NMX2NsZWFuc2UgemVyb3Mgb3V0IHxsZW58IGJ5dGVzIG9mIG1lbW9yeSBhdCB8cHRyfC4gVGhpcyBpcyBzaW1pbGFyIHRvCisgKiB8bWVtc2V0X3N8IGZyb20gQzExLiAqLwordm9pZCBPUEVOU1NMX2NsZWFuc2Uodm9pZCAqcHRyLCBzaXplX3QgbGVuKTsKKworLyogQ1JZUFRPX21lbWNtcCByZXR1cm5zIHplcm8gaWZmIHRoZSB8bGVufCBieXRlcyBhdCB8YXwgYW5kIHxifCBhcmUgZXF1YWwuIEl0CisgKiB0YWtlcyBhbiBhbW91bnQgb2YgdGltZSBkZXBlbmRlbnQgb24gfGxlbnwsIGJ1dCBpbmRlcGVuZGVudCBvZiB0aGUgY29udGVudHMKKyAqIG9mIHxhfCBhbmQgfGJ8LiBVbmxpa2UgbWVtY21wLCBpdCBjYW5ub3QgYmUgdXNlZCB0byBwdXQgZWxlbWVudHMgaW50byBhCisgKiBkZWZpbmVkIG9yZGVyIGFzIHRoZSByZXR1cm4gdmFsdWUgd2hlbiBhICE9IGIgaXMgdW5kZWZpbmVkLCBvdGhlciB0aGFuIHRvIGJlCisgKiBub24temVyby4gKi8KK2ludCBDUllQVE9fbWVtY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIsIHNpemVfdCBsZW4pOworCisvKiBPUEVOU1NMX2hhc2gzMiBpbXBsZW1lbnRzIHRoZSAzMiBiaXQsIEZOVi0xYSBoYXNoLiAqLwordWludDMyX3QgT1BFTlNTTF9oYXNoMzIoY29uc3Qgdm9pZCAqcHRyLCBzaXplX3QgbGVuKTsKKworLyogT1BFTlNTTF9zdHJkdXAgaGFzIHRoZSBzYW1lIGJlaGF2aW91ciBhcyBzdHJkdXAoMykuICovCitjaGFyICpPUEVOU1NMX3N0cmR1cChjb25zdCBjaGFyICpzKTsKKworLyogREVDSU1BTF9TSVpFIHJldHVybnMgYW4gdXBwZXIgYm91bmQgZm9yIHRoZSBsZW5ndGggb2YgdGhlIGRlY2ltYWwKKyAqIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiB0eXBlLiAqLworI2RlZmluZSBERUNJTUFMX1NJWkUodHlwZSkJKChzaXplb2YodHlwZSkqOCsyKS8zKzEpCisKKy8qIFByaW50ZiBmdW5jdGlvbnMuCisgKgorICogVGhlc2UgZnVuY3Rpb25zIGFyZSBlaXRoZXIgT3BlblNTTCB3cmFwcGVycyBmb3Igc3RhbmRhcmQgZnVuY3Rpb25zIChpLmUuCisgKiB8QklPX3NucHJpbnRmfCBhbmQgfEJJT192c25wcmludGZ8KSB3aGljaCBkb24ndCBleGlzdCBpbiBDODksIG9yIGFyZQorICogdmVyc2lvbnMgb2YgcHJpbnRmIGZ1bmN0aW9ucyB0aGF0IG91dHB1dCB0byBhIEJJTyByYXRoZXIgdGhhbiBhIEZJTEUuICovCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgX19iaW9faF9fYXR0cl9fIF9fYXR0cmlidXRlX18KKyNlbHNlCisjZGVmaW5lIF9fYmlvX2hfX2F0dHJfXyh4KQorI2VuZGlmCitpbnQgQklPX3NucHJpbnRmKGNoYXIgKmJ1Ziwgc2l6ZV90IG4sIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorICAgIF9fYmlvX2hfX2F0dHJfXygoX19mb3JtYXRfXyhfX3ByaW50Zl9fLCAzLCA0KSkpOworCitpbnQgQklPX3ZzbnByaW50ZihjaGFyICpidWYsIHNpemVfdCBuLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKKyAgICBfX2Jpb19oX19hdHRyX18oKF9fZm9ybWF0X18oX19wcmludGZfXywgMywgMCkpKTsKKyN1bmRlZiBfX2Jpb19oX19hdHRyX18KKworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30gIC8qIGV4dGVybiBDICovCisjZW5kaWYKKworI2VuZGlmICAvKiBPUEVOU1NMX0hFQURFUl9NRU1fSCAqLwpkaWZmIC0tZ2l0IGEvY3J5cHRvL21lbV9jbGVhci5jIGIvY3J5cHRvL21lbV9jbGVhci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxM2VjZDgKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vbWVtX2NsZWFyLmMKQEAgLTAsMCArMSw2OSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKworI2lmICFkZWZpbmVkKE9QRU5TU0xfWDg2KQorCisvKiBPUEVOU1NMX2NsZWFuc2UgaXMgZ2l2ZW4gaXRzIG93biBjb21waWxhdGlvbiB1bml0IGluIHRoZSBob3BlcyB0aGF0IHRoZQorICogY29tcGlsZXIgd29uJ3QgYmUgYWJsZSB0byBvcHRpbWlzZSBpdCBhd2F5LiAqLworLyogVE9ETyhmb3JrKTogdGhpcyBpcyBmcmFnaWxlLiBQcmVmZXJhYmx5IHdlIHdvdWxkIGJlIGFibGUgdG8gdXNlIG1lbXNldF9zCisgKiBvbiBwbGF0Zm9ybXMgd2l0aCBpdC4gKi8KK3ZvaWQgT1BFTlNTTF9jbGVhbnNlKHZvaWQgKnB0ciwgc2l6ZV90IGxlbikgeyBtZW1zZXQocHRyLCAwLCBsZW4pOyB9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3J5cHRvL21vZGVzL0NNYWtlTGlzdHMudHh0IGIvY3J5cHRvL21vZGVzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMThlM2EKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vbW9kZXMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw1MyBAQAoraW5jbHVkZV9kaXJlY3RvcmllcyguIC4uIC4uLy4uL2luY2x1ZGUpCisKK2lmICgke0FSQ0h9IFNUUkVRVUFMICJ4ODZfNjQiKQorCXNldCgKKwkJTU9ERVNfQVJDSF9TT1VSQ0VTCisKKwkJYWVzbmktZ2NtLXg4Nl82NC4ke0FTTV9FWFR9CisJCWdoYXNoLXg4Nl82NC4ke0FTTV9FWFR9CisJKQorZW5kaWYoKQorCitpZiAoJHtBUkNIfSBTVFJFUVVBTCAieDg2IikKKwlzZXQoCisJCU1PREVTX0FSQ0hfU09VUkNFUworCisJCWdoYXNoLXg4Ni4ke0FTTV9FWFR9CisJKQorZW5kaWYoKQorCitpZiAoJHtBUkNIfSBTVFJFUVVBTCAiYXJtIikKKwlzZXQoCisJCU1PREVTX0FSQ0hfU09VUkNFUworCisJCWdoYXNoLWFybXY0LiR7QVNNX0VYVH0KKwkpCitlbmRpZigpCisKK2FkZF9saWJyYXJ5KAorCW1vZGVzCisKKwlPQkpFQ1QKKworCWNiYy5jCisJY3RyLmMKKwlvZmIuYworCWNmYi5jCisJZ2NtLmMKKworCSR7TU9ERVNfQVJDSF9TT1VSQ0VTfQorKQorCitwZXJsYXNtKGFlc25pLWdjbS14ODZfNjQuJHtBU01fRVhUfSBhc20vYWVzbmktZ2NtLXg4Nl82NC5wbCkKK3Blcmxhc20oZ2hhc2gteDg2XzY0LiR7QVNNX0VYVH0gYXNtL2doYXNoLXg4Nl82NC5wbCkKK3Blcmxhc20oZ2hhc2gteDg2LiR7QVNNX0VYVH0gYXNtL2doYXNoLXg4Ni5wbCkKK3Blcmxhc20oZ2hhc2gtYXJtdjQuJHtBU01fRVhUfSBhc20vZ2hhc2gtYXJtdjQucGwpCisKK2FkZF9leGVjdXRhYmxlKAorCWdjbV90ZXN0CisKKwlnY21fdGVzdC5jCispCisKK3RhcmdldF9saW5rX2xpYnJhcmllcyhnY21fdGVzdCBjcnlwdG8pCmRpZmYgLS1naXQgYS9jcnlwdG8vbW9kZXMvYXNtL2Flc25pLWdjbS14ODZfNjQucGwgYi9jcnlwdG8vbW9kZXMvYXNtL2Flc25pLWdjbS14ODZfNjQucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk3YjZlNQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9tb2Rlcy9hc20vYWVzbmktZ2NtLXg4Nl82NC5wbApAQCAtMCwwICsxLDEwNTAgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKyMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgV3JpdHRlbiBieSBBbmR5IFBvbHlha292IDxhcHByb0BvcGVuc3NsLm9yZz4gZm9yIHRoZSBPcGVuU1NMCisjIHByb2plY3QuIFRoZSBtb2R1bGUgaXMsIGhvd2V2ZXIsIGR1YWwgbGljZW5zZWQgdW5kZXIgT3BlblNTTCBhbmQKKyMgQ1JZUFRPR0FNUyBsaWNlbnNlcyBkZXBlbmRpbmcgb24gd2hlcmUgeW91IG9idGFpbiBpdC4gRm9yIGZ1cnRoZXIKKyMgZGV0YWlscyBzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+YXBwcm8vY3J5cHRvZ2Ftcy8uCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjCisjIEFFUy1OSS1DVFIrR0hBU0ggc3RpdGNoLgorIworIyBGZWJydWFyeSAyMDEzCisjCisjIE9wZW5TU0wgR0NNIGltcGxlbWVudGF0aW9uIGlzIG9yZ2FuaXplZCBpbiBzdWNoIHdheSB0aGF0IGl0cworIyBwZXJmb3JtYW5jZSBpcyByYXRoZXIgY2xvc2UgdG8gdGhlIHN1bSBvZiBpdHMgc3RyZWFtZWQgY29tcG9uZW50cywKKyMgaW4gdGhlIGNvbnRleHQgcGFyYWxsZWxpemVkIEFFUy1OSSBDVFIgYW5kIG1vZHVsby1zY2hlZHVsZWQKKyMgUENMTVVMUURRLWVuYWJsZWQgR0hBU0guIFVuZm9ydHVuYXRlbHksIGFzIG5vIHN0aXRjaCBpbXBsZW1lbnRhdGlvbgorIyB3YXMgb2JzZXJ2ZWQgdG8gcGVyZm9ybSBzaWduaWZpY2FudGx5IGJldHRlciB0aGFuIHRoZSBzdW0gb2YgdGhlCisjIGNvbXBvbmVudHMgb24gY29udGVtcG9yYXJ5IENQVXMsIHRoZSBlZmZvcnQgd2FzIGRlZW1lZCBpbXBvc3NpYmxlIHRvCisjIGp1c3RpZnkuIFRoaXMgbW9kdWxlIGlzIGJhc2VkIG9uIGNvbWJpbmF0aW9uIG9mIEludGVsIHN1Ym1pc3Npb25zLAorIyBbMV0gYW5kIFsyXSwgd2l0aCBNT1ZCRSB0d2lzdCBzdWdnZXN0ZWQgYnkgSWx5YSBBbGJyZWtodCBhbmQgTWF4CisjIExvY2t0eXVraGluIG9mIEludGVsIENvcnAuIHdobyB2ZXJpZmllZCB0aGF0IGl0IHJlZHVjZXMgc2h1ZmZsZXMKKyMgcHJlc3N1cmUgd2l0aCBub3RhYmxlIHJlbGF0aXZlIGltcHJvdmVtZW50LCBhY2hpZXZpbmcgMS4wIGN5Y2xlIHBlcgorIyBieXRlIHByb2Nlc3NlZCB3aXRoIDEyOC1iaXQga2V5IG9uIEhhc3dlbGwgcHJvY2Vzc29yLgorIworIyBbMV0gaHR0cDovL3J0Lm9wZW5zc2wub3JnL1RpY2tldC9EaXNwbGF5Lmh0bWw/aWQ9MjkwMCZ1c2VyPWd1ZXN0JnBhc3M9Z3Vlc3QKKyMgWzJdIGh0dHA6Ly93d3cuaW50ZWwuY29tL2NvbnRlbnQvZGFtL3d3dy9wdWJsaWMvdXMvZW4vZG9jdW1lbnRzL3NvZnR3YXJlLXN1cHBvcnQvZW5hYmxpbmctaGlnaC1wZXJmb3JtYW5jZS1nY20ucGRmCisKKyRmbGF2b3VyID0gc2hpZnQ7Ciskb3V0cHV0ICA9IHNoaWZ0OworaWYgKCRmbGF2b3VyID1+IC9cLi8pIHsgJG91dHB1dCA9ICRmbGF2b3VyOyB1bmRlZiAkZmxhdm91cjsgfQorCiskd2luNjQ9MDsgJHdpbjY0PTEgaWYgKCRmbGF2b3VyID1+IC9bbm1dYXNtfG1pbmd3NjQvIHx8ICRvdXRwdXQgPX4gL1wuYXNtJC8pOworCiskMCA9fiBtLyguKltcL1xcXSlbXlwvXFxdKyQvOyAkZGlyPSQxOworKCAkeGxhdGU9IiR7ZGlyfXg4Nl82NC14bGF0ZS5wbCIgYW5kIC1mICR4bGF0ZSApIG9yCisoICR4bGF0ZT0iJHtkaXJ9Li4vLi4vcGVybGFzbS94ODZfNjQteGxhdGUucGwiIGFuZCAtZiAkeGxhdGUpIG9yCitkaWUgImNhbid0IGxvY2F0ZSB4ODZfNjQteGxhdGUucGwiOworCitpZiAoYCRFTlZ7Q0N9IC1XYSwtdiAtYyAtbyAvZGV2L251bGwgLXggYXNzZW1ibGVyIC9kZXYvbnVsbCAyPiYxYAorCQk9fiAvR05VIGFzc2VtYmxlciB2ZXJzaW9uIChbMi05XVwuWzAtOV0rKS8pIHsKKwkkYXZ4ID0gKCQxPj0yLjE5KSArICgkMT49Mi4yMik7Cit9CisKK2lmICghJGF2eCAmJiAkd2luNjQgJiYgKCRmbGF2b3VyID1+IC9uYXNtLyB8fCAkRU5We0FTTX0gPX4gL25hc20vKSAmJgorCSAgICBgbmFzbSAtdiAyPiYxYCA9fiAvTkFTTSB2ZXJzaW9uIChbMi05XVwuWzAtOV0rKS8pIHsKKwkkYXZ4ID0gKCQxPj0yLjA5KSArICgkMT49Mi4xMCk7Cit9CisKK2lmICghJGF2eCAmJiAkd2luNjQgJiYgKCRmbGF2b3VyID1+IC9tYXNtLyB8fCAkRU5We0FTTX0gPX4gL21sNjQvKSAmJgorCSAgICBgbWw2NCAyPiYxYCA9fiAvVmVyc2lvbiAoWzAtOV0rKVwuLykgeworCSRhdnggPSAoJDE+PTEwKSArICgkMT49MTEpOworfQorCitvcGVuIE9VVCwifCBcIiReWFwiICR4bGF0ZSAkZmxhdm91ciAkb3V0cHV0IjsKKypTVERPVVQ9Kk9VVDsKKworaWYgKCRhdng+MSkge3t7CisKKygkaW5wLCRvdXQsJGxlbiwka2V5LCRpdnAsJFhpcCk9KCIlcmRpIiwiJXJzaSIsIiVyZHgiLCIlcmN4IiwiJXI4IiwiJXI5Iik7CisKKygkSWksJFQxLCRUMiwkSGtleSwKKyAkWjAsJFoxLCRaMiwkWjMsJFhpKSA9IG1hcCgiJXhtbSRfIiwoMC4uOCkpOworCisoJGlub3V0MCwkaW5vdXQxLCRpbm91dDIsJGlub3V0MywkaW5vdXQ0LCRpbm91dDUsJHJuZGtleSkgPSBtYXAoIiV4bW0kXyIsKDkuLjE1KSk7CisKKygkY291bnRlciwkcm91bmRzLCRyZXQsJGNvbnN0LCRpbjAsJGVuZDApPSgiJWVieCIsIiVlYnAiLCIlcjEwIiwiJXIxMSIsIiVyMTQiLCIlcjE1Iik7CisKKyRjb2RlPTw8X19fOworLnRleHQKKworLnR5cGUJX2Flc25pX2N0cjMyX2doYXNoXzZ4LFxAYWJpLW9tbmlwb3RlbnQKKy5hbGlnbgkzMgorX2Flc25pX2N0cjMyX2doYXNoXzZ4OgorCXZtb3ZkcXUJCTB4MjAoJGNvbnN0KSwkVDIJIyBib3Jyb3cgJFQyLCAuTG9uZV9tc2IKKwlzdWIJCVwkNiwkbGVuCisJdnB4b3IJCSRaMCwkWjAsJFowCQkjICRaMCAgID0gMAorCXZtb3ZkcXUJCTB4MDAtMHg4MCgka2V5KSwkcm5ka2V5CisJdnBhZGRiCQkkVDIsJFQxLCRpbm91dDEKKwl2cGFkZGIJCSRUMiwkaW5vdXQxLCRpbm91dDIKKwl2cGFkZGIJCSRUMiwkaW5vdXQyLCRpbm91dDMKKwl2cGFkZGIJCSRUMiwkaW5vdXQzLCRpbm91dDQKKwl2cGFkZGIJCSRUMiwkaW5vdXQ0LCRpbm91dDUKKwl2cHhvcgkJJHJuZGtleSwkVDEsJGlub3V0MAorCXZtb3ZkcXUJCSRaMCwxNis4KCVyc3ApCQkjICIkWjMiID0gMAorCWptcAkJLkxvb3A2eAorCisuYWxpZ24JMzIKKy5Mb29wNng6CisJYWRkCQlcJDEwMDY2MzI5NiwkY291bnRlcgorCWpjCQkuTGhhbmRsZV9jdHIzMgkJIyBkaXNjYXJkICRpbm91dFsxLTVdPworCXZtb3ZkcXUJCTB4MDAtMHgyMCgkWGlwKSwkSGtleQkjICRIa2V5XjEKKwkgIHZwYWRkYgkkVDIsJGlub3V0NSwkVDEJCSMgbmV4dCBjb3VudGVyIHZhbHVlCisJICB2cHhvcgkJJHJuZGtleSwkaW5vdXQxLCRpbm91dDEKKwkgIHZweG9yCQkkcm5ka2V5LCRpbm91dDIsJGlub3V0MgorCisuTHJlc3VtZV9jdHIzMjoKKwl2bW92ZHF1CQkkVDEsKCRpdnApCQkjIHNhdmUgbmV4dCBjb3VudGVyIHZhbHVlCisJdnBjbG11bHFkcQlcJDB4MTAsJEhrZXksJFozLCRaMQorCSAgdnB4b3IJCSRybmRrZXksJGlub3V0MywkaW5vdXQzCisJICB2bW92dXBzCTB4MTAtMHg4MCgka2V5KSwkVDIJIyBib3Jyb3cgJFQyIGZvciAkcm5ka2V5CisJdnBjbG11bHFkcQlcJDB4MDEsJEhrZXksJFozLCRaMgorCXhvcgkJJXIxMiwlcjEyCisJY21wCQkkaW4wLCRlbmQwCisKKwkgIHZhZXNlbmMJJFQyLCRpbm91dDAsJGlub3V0MAorCXZtb3ZkcXUJCTB4MzArOCglcnNwKSwkSWkJIyBJWzRdCisJICB2cHhvcgkJJHJuZGtleSwkaW5vdXQ0LCRpbm91dDQKKwl2cGNsbXVscWRxCVwkMHgwMCwkSGtleSwkWjMsJFQxCisJICB2YWVzZW5jCSRUMiwkaW5vdXQxLCRpbm91dDEKKwkgIHZweG9yCQkkcm5ka2V5LCRpbm91dDUsJGlub3V0NQorCXNldG5jCQklcjEyYgorCXZwY2xtdWxxZHEJXCQweDExLCRIa2V5LCRaMywkWjMKKwkgIHZhZXNlbmMJJFQyLCRpbm91dDIsJGlub3V0MgorCXZtb3ZkcXUJCTB4MTAtMHgyMCgkWGlwKSwkSGtleQkjICRIa2V5XjIKKwluZWcJCSVyMTIKKwkgIHZhZXNlbmMJJFQyLCRpbm91dDMsJGlub3V0MworCSB2cHhvcgkJJFoxLCRaMiwkWjIKKwl2cGNsbXVscWRxCVwkMHgwMCwkSGtleSwkSWksJFoxCisJIHZweG9yCQkkWjAsJFhpLCRYaQkJIyBtb2R1bG8tc2NoZWR1bGVkCisJICB2YWVzZW5jCSRUMiwkaW5vdXQ0LCRpbm91dDQKKwkgdnB4b3IJCSRaMSwkVDEsJFowCisJYW5kCQlcJDB4NjAsJXIxMgorCSAgdm1vdnVwcwkweDIwLTB4ODAoJGtleSksJHJuZGtleQorCXZwY2xtdWxxZHEJXCQweDEwLCRIa2V5LCRJaSwkVDEKKwkgIHZhZXNlbmMJJFQyLCRpbm91dDUsJGlub3V0NQorCisJdnBjbG11bHFkcQlcJDB4MDEsJEhrZXksJElpLCRUMgorCWxlYQkJKCRpbjAsJXIxMiksJGluMAorCSAgdmFlc2VuYwkkcm5ka2V5LCRpbm91dDAsJGlub3V0MAorCSB2cHhvcgkJMTYrOCglcnNwKSwkWGksJFhpCSMgbW9kdWxvLXNjaGVkdWxlZCBbdnB4b3IgJFozLCRYaSwkWGldCisJdnBjbG11bHFkcQlcJDB4MTEsJEhrZXksJElpLCRIa2V5CisJIHZtb3ZkcXUJMHg0MCs4KCVyc3ApLCRJaQkjIElbM10KKwkgIHZhZXNlbmMJJHJuZGtleSwkaW5vdXQxLCRpbm91dDEKKwltb3ZiZQkJMHg1OCgkaW4wKSwlcjEzCisJICB2YWVzZW5jCSRybmRrZXksJGlub3V0MiwkaW5vdXQyCisJbW92YmUJCTB4NTAoJGluMCksJXIxMgorCSAgdmFlc2VuYwkkcm5ka2V5LCRpbm91dDMsJGlub3V0MworCW1vdgkJJXIxMywweDIwKzgoJXJzcCkKKwkgIHZhZXNlbmMJJHJuZGtleSwkaW5vdXQ0LCRpbm91dDQKKwltb3YJCSVyMTIsMHgyOCs4KCVyc3ApCisJdm1vdmRxdQkJMHgzMC0weDIwKCRYaXApLCRaMQkjIGJvcnJvdyAkWjEgZm9yICRIa2V5XjMKKwkgIHZhZXNlbmMJJHJuZGtleSwkaW5vdXQ1LCRpbm91dDUKKworCSAgdm1vdnVwcwkweDMwLTB4ODAoJGtleSksJHJuZGtleQorCSB2cHhvcgkJJFQxLCRaMiwkWjIKKwl2cGNsbXVscWRxCVwkMHgwMCwkWjEsJElpLCRUMQorCSAgdmFlc2VuYwkkcm5ka2V5LCRpbm91dDAsJGlub3V0MAorCSB2cHhvcgkJJFQyLCRaMiwkWjIKKwl2cGNsbXVscWRxCVwkMHgxMCwkWjEsJElpLCRUMgorCSAgdmFlc2VuYwkkcm5ka2V5LCRpbm91dDEsJGlub3V0MQorCSB2cHhvcgkJJEhrZXksJFozLCRaMworCXZwY2xtdWxxZHEJXCQweDAxLCRaMSwkSWksJEhrZXkKKwkgIHZhZXNlbmMJJHJuZGtleSwkaW5vdXQyLCRpbm91dDIKKwl2cGNsbXVscWRxCVwkMHgxMSwkWjEsJElpLCRaMQorCSB2bW92ZHF1CTB4NTArOCglcnNwKSwkSWkJIyBJWzJdCisJICB2YWVzZW5jCSRybmRrZXksJGlub3V0MywkaW5vdXQzCisJICB2YWVzZW5jCSRybmRrZXksJGlub3V0NCwkaW5vdXQ0CisJIHZweG9yCQkkVDEsJFowLCRaMAorCXZtb3ZkcXUJCTB4NDAtMHgyMCgkWGlwKSwkVDEJIyBib3Jyb3cgJFQxIGZvciAkSGtleV40CisJICB2YWVzZW5jCSRybmRrZXksJGlub3V0NSwkaW5vdXQ1CisKKwkgIHZtb3Z1cHMJMHg0MC0weDgwKCRrZXkpLCRybmRrZXkKKwkgdnB4b3IJCSRUMiwkWjIsJFoyCisJdnBjbG11bHFkcQlcJDB4MDAsJFQxLCRJaSwkVDIKKwkgIHZhZXNlbmMJJHJuZGtleSwkaW5vdXQwLCRpbm91dDAKKwkgdnB4b3IJCSRIa2V5LCRaMiwkWjIKKwl2cGNsbXVscWRxCVwkMHgxMCwkVDEsJElpLCRIa2V5CisJICB2YWVzZW5jCSRybmRrZXksJGlub3V0MSwkaW5vdXQxCisJbW92YmUJCTB4NDgoJGluMCksJXIxMworCSB2cHhvcgkJJFoxLCRaMywkWjMKKwl2cGNsbXVscWRxCVwkMHgwMSwkVDEsJElpLCRaMQorCSAgdmFlc2VuYwkkcm5ka2V5LCRpbm91dDIsJGlub3V0MgorCW1vdmJlCQkweDQwKCRpbjApLCVyMTIKKwl2cGNsbXVscWRxCVwkMHgxMSwkVDEsJElpLCRUMQorCSB2bW92ZHF1CTB4NjArOCglcnNwKSwkSWkJIyBJWzFdCisJICB2YWVzZW5jCSRybmRrZXksJGlub3V0MywkaW5vdXQzCisJbW92CQklcjEzLDB4MzArOCglcnNwKQorCSAgdmFlc2VuYwkkcm5ka2V5LCRpbm91dDQsJGlub3V0NAorCW1vdgkJJXIxMiwweDM4KzgoJXJzcCkKKwkgdnB4b3IJCSRUMiwkWjAsJFowCisJdm1vdmRxdQkJMHg2MC0weDIwKCRYaXApLCRUMgkjIGJvcnJvdyAkVDIgZm9yICRIa2V5XjUKKwkgIHZhZXNlbmMJJHJuZGtleSwkaW5vdXQ1LCRpbm91dDUKKworCSAgdm1vdnVwcwkweDUwLTB4ODAoJGtleSksJHJuZGtleQorCSB2cHhvcgkJJEhrZXksJFoyLCRaMgorCXZwY2xtdWxxZHEJXCQweDAwLCRUMiwkSWksJEhrZXkKKwkgIHZhZXNlbmMJJHJuZGtleSwkaW5vdXQwLCRpbm91dDAKKwkgdnB4b3IJCSRaMSwkWjIsJFoyCisJdnBjbG11bHFkcQlcJDB4MTAsJFQyLCRJaSwkWjEKKwkgIHZhZXNlbmMJJHJuZGtleSwkaW5vdXQxLCRpbm91dDEKKwltb3ZiZQkJMHgzOCgkaW4wKSwlcjEzCisJIHZweG9yCQkkVDEsJFozLCRaMworCXZwY2xtdWxxZHEJXCQweDAxLCRUMiwkSWksJFQxCisJIHZweG9yCQkweDcwKzgoJXJzcCksJFhpLCRYaQkjIGFjY3VtdWxhdGUgSVswXQorCSAgdmFlc2VuYwkkcm5ka2V5LCRpbm91dDIsJGlub3V0MgorCW1vdmJlCQkweDMwKCRpbjApLCVyMTIKKwl2cGNsbXVscWRxCVwkMHgxMSwkVDIsJElpLCRUMgorCSAgdmFlc2VuYwkkcm5ka2V5LCRpbm91dDMsJGlub3V0MworCW1vdgkJJXIxMywweDQwKzgoJXJzcCkKKwkgIHZhZXNlbmMJJHJuZGtleSwkaW5vdXQ0LCRpbm91dDQKKwltb3YJCSVyMTIsMHg0OCs4KCVyc3ApCisJIHZweG9yCQkkSGtleSwkWjAsJFowCisJIHZtb3ZkcXUJMHg3MC0weDIwKCRYaXApLCRIa2V5CSMgJEhrZXleNgorCSAgdmFlc2VuYwkkcm5ka2V5LCRpbm91dDUsJGlub3V0NQorCisJICB2bW92dXBzCTB4NjAtMHg4MCgka2V5KSwkcm5ka2V5CisJIHZweG9yCQkkWjEsJFoyLCRaMgorCXZwY2xtdWxxZHEJXCQweDEwLCRIa2V5LCRYaSwkWjEKKwkgIHZhZXNlbmMJJHJuZGtleSwkaW5vdXQwLCRpbm91dDAKKwkgdnB4b3IJCSRUMSwkWjIsJFoyCisJdnBjbG11bHFkcQlcJDB4MDEsJEhrZXksJFhpLCRUMQorCSAgdmFlc2VuYwkkcm5ka2V5LCRpbm91dDEsJGlub3V0MQorCW1vdmJlCQkweDI4KCRpbjApLCVyMTMKKwkgdnB4b3IJCSRUMiwkWjMsJFozCisJdnBjbG11bHFkcQlcJDB4MDAsJEhrZXksJFhpLCRUMgorCSAgdmFlc2VuYwkkcm5ka2V5LCRpbm91dDIsJGlub3V0MgorCW1vdmJlCQkweDIwKCRpbjApLCVyMTIKKwl2cGNsbXVscWRxCVwkMHgxMSwkSGtleSwkWGksJFhpCisJICB2YWVzZW5jCSRybmRrZXksJGlub3V0MywkaW5vdXQzCisJbW92CQklcjEzLDB4NTArOCglcnNwKQorCSAgdmFlc2VuYwkkcm5ka2V5LCRpbm91dDQsJGlub3V0NAorCW1vdgkJJXIxMiwweDU4KzgoJXJzcCkKKwl2cHhvcgkJJFoxLCRaMiwkWjIKKwkgIHZhZXNlbmMJJHJuZGtleSwkaW5vdXQ1LCRpbm91dDUKKwl2cHhvcgkJJFQxLCRaMiwkWjIKKworCSAgdm1vdnVwcwkweDcwLTB4ODAoJGtleSksJHJuZGtleQorCXZwc2xsZHEJCVwkOCwkWjIsJFoxCisJdnB4b3IJCSRUMiwkWjAsJFowCisJdm1vdmRxdQkJMHgxMCgkY29uc3QpLCRIa2V5CSMgLkxwb2x5CisKKwkgIHZhZXNlbmMJJHJuZGtleSwkaW5vdXQwLCRpbm91dDAKKwl2cHhvcgkJJFhpLCRaMywkWjMKKwkgIHZhZXNlbmMJJHJuZGtleSwkaW5vdXQxLCRpbm91dDEKKwl2cHhvcgkJJFoxLCRaMCwkWjAKKwltb3ZiZQkJMHgxOCgkaW4wKSwlcjEzCisJICB2YWVzZW5jCSRybmRrZXksJGlub3V0MiwkaW5vdXQyCisJbW92YmUJCTB4MTAoJGluMCksJXIxMgorCXZwYWxpZ25yCVwkOCwkWjAsJFowLCRJaQkJIyAxc3QgcGhhc2UKKwl2cGNsbXVscWRxCVwkMHgxMCwkSGtleSwkWjAsJFowCisJbW92CQklcjEzLDB4NjArOCglcnNwKQorCSAgdmFlc2VuYwkkcm5ka2V5LCRpbm91dDMsJGlub3V0MworCW1vdgkJJXIxMiwweDY4KzgoJXJzcCkKKwkgIHZhZXNlbmMJJHJuZGtleSwkaW5vdXQ0LCRpbm91dDQKKwkgIHZtb3Z1cHMJMHg4MC0weDgwKCRrZXkpLCRUMQkjIGJvcnJvdyAkVDEgZm9yICRybmRrZXkKKwkgIHZhZXNlbmMJJHJuZGtleSwkaW5vdXQ1LCRpbm91dDUKKworCSAgdmFlc2VuYwkkVDEsJGlub3V0MCwkaW5vdXQwCisJICB2bW92dXBzCTB4OTAtMHg4MCgka2V5KSwkcm5ka2V5CisJICB2YWVzZW5jCSRUMSwkaW5vdXQxLCRpbm91dDEKKwl2cHNybGRxCQlcJDgsJFoyLCRaMgorCSAgdmFlc2VuYwkkVDEsJGlub3V0MiwkaW5vdXQyCisJdnB4b3IJCSRaMiwkWjMsJFozCisJICB2YWVzZW5jCSRUMSwkaW5vdXQzLCRpbm91dDMKKwl2cHhvcgkJJElpLCRaMCwkWjAKKwltb3ZiZQkJMHgwOCgkaW4wKSwlcjEzCisJICB2YWVzZW5jCSRUMSwkaW5vdXQ0LCRpbm91dDQKKwltb3ZiZQkJMHgwMCgkaW4wKSwlcjEyCisJICB2YWVzZW5jCSRUMSwkaW5vdXQ1LCRpbm91dDUKKwkgIHZtb3Z1cHMJMHhhMC0weDgwKCRrZXkpLCRUMQorCSAgY21wCQlcJDExLCRyb3VuZHMKKwkgIGpiCQkuTGVuY190YWlsCQkjIDEyOC1iaXQga2V5CisKKwkgIHZhZXNlbmMJJHJuZGtleSwkaW5vdXQwLCRpbm91dDAKKwkgIHZhZXNlbmMJJHJuZGtleSwkaW5vdXQxLCRpbm91dDEKKwkgIHZhZXNlbmMJJHJuZGtleSwkaW5vdXQyLCRpbm91dDIKKwkgIHZhZXNlbmMJJHJuZGtleSwkaW5vdXQzLCRpbm91dDMKKwkgIHZhZXNlbmMJJHJuZGtleSwkaW5vdXQ0LCRpbm91dDQKKwkgIHZhZXNlbmMJJHJuZGtleSwkaW5vdXQ1LCRpbm91dDUKKworCSAgdmFlc2VuYwkkVDEsJGlub3V0MCwkaW5vdXQwCisJICB2YWVzZW5jCSRUMSwkaW5vdXQxLCRpbm91dDEKKwkgIHZhZXNlbmMJJFQxLCRpbm91dDIsJGlub3V0MgorCSAgdmFlc2VuYwkkVDEsJGlub3V0MywkaW5vdXQzCisJICB2YWVzZW5jCSRUMSwkaW5vdXQ0LCRpbm91dDQKKwkgIHZtb3Z1cHMJMHhiMC0weDgwKCRrZXkpLCRybmRrZXkKKwkgIHZhZXNlbmMJJFQxLCRpbm91dDUsJGlub3V0NQorCSAgdm1vdnVwcwkweGMwLTB4ODAoJGtleSksJFQxCisJICBqZQkJLkxlbmNfdGFpbAkJIyAxOTItYml0IGtleQorCisJICB2YWVzZW5jCSRybmRrZXksJGlub3V0MCwkaW5vdXQwCisJICB2YWVzZW5jCSRybmRrZXksJGlub3V0MSwkaW5vdXQxCisJICB2YWVzZW5jCSRybmRrZXksJGlub3V0MiwkaW5vdXQyCisJICB2YWVzZW5jCSRybmRrZXksJGlub3V0MywkaW5vdXQzCisJICB2YWVzZW5jCSRybmRrZXksJGlub3V0NCwkaW5vdXQ0CisJICB2YWVzZW5jCSRybmRrZXksJGlub3V0NSwkaW5vdXQ1CisKKwkgIHZhZXNlbmMJJFQxLCRpbm91dDAsJGlub3V0MAorCSAgdmFlc2VuYwkkVDEsJGlub3V0MSwkaW5vdXQxCisJICB2YWVzZW5jCSRUMSwkaW5vdXQyLCRpbm91dDIKKwkgIHZhZXNlbmMJJFQxLCRpbm91dDMsJGlub3V0MworCSAgdmFlc2VuYwkkVDEsJGlub3V0NCwkaW5vdXQ0CisJICB2bW92dXBzCTB4ZDAtMHg4MCgka2V5KSwkcm5ka2V5CisJICB2YWVzZW5jCSRUMSwkaW5vdXQ1LCRpbm91dDUKKwkgIHZtb3Z1cHMJMHhlMC0weDgwKCRrZXkpLCRUMQorCSAgam1wCQkuTGVuY190YWlsCQkjIDI1Ni1iaXQga2V5CisKKy5hbGlnbgkzMgorLkxoYW5kbGVfY3RyMzI6CisJdm1vdmRxdQkJKCRjb25zdCksJElpCQkjIGJvcnJvdyAkSWkgZm9yIC5MYnN3YXBfbWFzaworCSAgdnBzaHVmYgkkSWksJFQxLCRaMgkJIyBieXRlLXN3YXAgY291bnRlcgorCSAgdm1vdmRxdQkweDMwKCRjb25zdCksJFoxCSMgYm9ycm93ICRaMSwgLkx0d29fbHNiCisJICB2cGFkZGQJMHg0MCgkY29uc3QpLCRaMiwkaW5vdXQxCSMgLkxvbmVfbHNiCisJICB2cGFkZGQJJFoxLCRaMiwkaW5vdXQyCisJdm1vdmRxdQkJMHgwMC0weDIwKCRYaXApLCRIa2V5CSMgJEhrZXleMQorCSAgdnBhZGRkCSRaMSwkaW5vdXQxLCRpbm91dDMKKwkgIHZwc2h1ZmIJJElpLCRpbm91dDEsJGlub3V0MQorCSAgdnBhZGRkCSRaMSwkaW5vdXQyLCRpbm91dDQKKwkgIHZwc2h1ZmIJJElpLCRpbm91dDIsJGlub3V0MgorCSAgdnB4b3IJCSRybmRrZXksJGlub3V0MSwkaW5vdXQxCisJICB2cGFkZGQJJFoxLCRpbm91dDMsJGlub3V0NQorCSAgdnBzaHVmYgkkSWksJGlub3V0MywkaW5vdXQzCisJICB2cHhvcgkJJHJuZGtleSwkaW5vdXQyLCRpbm91dDIKKwkgIHZwYWRkZAkkWjEsJGlub3V0NCwkVDEJCSMgYnl0ZS1zd2FwcGVkIG5leHQgY291bnRlciB2YWx1ZQorCSAgdnBzaHVmYgkkSWksJGlub3V0NCwkaW5vdXQ0CisJICB2cHNodWZiCSRJaSwkaW5vdXQ1LCRpbm91dDUKKwkgIHZwc2h1ZmIJJElpLCRUMSwkVDEJCSMgbmV4dCBjb3VudGVyIHZhbHVlCisJam1wCQkuTHJlc3VtZV9jdHIzMgorCisuYWxpZ24JMzIKKy5MZW5jX3RhaWw6CisJICB2YWVzZW5jCSRybmRrZXksJGlub3V0MCwkaW5vdXQwCisJdm1vdmRxdQkJJFozLDE2KzgoJXJzcCkJCSMgcG9zdHBvbmUgdnB4b3IgJFozLCRYaSwkWGkKKwl2cGFsaWducglcJDgsJFowLCRaMCwkWGkJCSMgMm5kIHBoYXNlCisJICB2YWVzZW5jCSRybmRrZXksJGlub3V0MSwkaW5vdXQxCisJdnBjbG11bHFkcQlcJDB4MTAsJEhrZXksJFowLCRaMAorCSAgdnB4b3IJCTB4MDAoJGlucCksJFQxLCRUMgorCSAgdmFlc2VuYwkkcm5ka2V5LCRpbm91dDIsJGlub3V0MgorCSAgdnB4b3IJCTB4MTAoJGlucCksJFQxLCRJaQorCSAgdmFlc2VuYwkkcm5ka2V5LCRpbm91dDMsJGlub3V0MworCSAgdnB4b3IJCTB4MjAoJGlucCksJFQxLCRaMQorCSAgdmFlc2VuYwkkcm5ka2V5LCRpbm91dDQsJGlub3V0NAorCSAgdnB4b3IJCTB4MzAoJGlucCksJFQxLCRaMgorCSAgdmFlc2VuYwkkcm5ka2V5LCRpbm91dDUsJGlub3V0NQorCSAgdnB4b3IJCTB4NDAoJGlucCksJFQxLCRaMworCSAgdnB4b3IJCTB4NTAoJGlucCksJFQxLCRIa2V5CisJICB2bW92ZHF1CSgkaXZwKSwkVDEJCSMgbG9hZCBuZXh0IGNvdW50ZXIgdmFsdWUKKworCSAgdmFlc2VuY2xhc3QJJFQyLCRpbm91dDAsJGlub3V0MAorCSAgdm1vdmRxdQkweDIwKCRjb25zdCksJFQyCSMgYm9ycm93ICRUMiwgLkxvbmVfbXNiCisJICB2YWVzZW5jbGFzdAkkSWksJGlub3V0MSwkaW5vdXQxCisJIHZwYWRkYgkJJFQyLCRUMSwkSWkKKwltb3YJCSVyMTMsMHg3MCs4KCVyc3ApCisJbGVhCQkweDYwKCRpbnApLCRpbnAKKwkgIHZhZXNlbmNsYXN0CSRaMSwkaW5vdXQyLCRpbm91dDIKKwkgdnBhZGRiCQkkVDIsJElpLCRaMQorCW1vdgkJJXIxMiwweDc4KzgoJXJzcCkKKwlsZWEJCTB4NjAoJG91dCksJG91dAorCSAgdm1vdmRxdQkweDAwLTB4ODAoJGtleSksJHJuZGtleQorCSAgdmFlc2VuY2xhc3QJJFoyLCRpbm91dDMsJGlub3V0MworCSB2cGFkZGIJCSRUMiwkWjEsJFoyCisJICB2YWVzZW5jbGFzdAkkWjMsICRpbm91dDQsJGlub3V0NAorCSB2cGFkZGIJCSRUMiwkWjIsJFozCisJICB2YWVzZW5jbGFzdAkkSGtleSwkaW5vdXQ1LCRpbm91dDUKKwkgdnBhZGRiCQkkVDIsJFozLCRIa2V5CisKKwlhZGQJCVwkMHg2MCwkcmV0CisJc3ViCQlcJDB4NiwkbGVuCisJamMJCS5MNnhfZG9uZQorCisJICB2bW92dXBzCSRpbm91dDAsLTB4NjAoJG91dCkJIyBzYXZlIG91dHB1dAorCSB2cHhvcgkJJHJuZGtleSwkVDEsJGlub3V0MAorCSAgdm1vdnVwcwkkaW5vdXQxLC0weDUwKCRvdXQpCisJIHZtb3ZkcWEJJElpLCRpbm91dDEJCSMgMCBsYXRlbmN5CisJICB2bW92dXBzCSRpbm91dDIsLTB4NDAoJG91dCkKKwkgdm1vdmRxYQkkWjEsJGlub3V0MgkJIyAwIGxhdGVuY3kKKwkgIHZtb3Z1cHMJJGlub3V0MywtMHgzMCgkb3V0KQorCSB2bW92ZHFhCSRaMiwkaW5vdXQzCQkjIDAgbGF0ZW5jeQorCSAgdm1vdnVwcwkkaW5vdXQ0LC0weDIwKCRvdXQpCisJIHZtb3ZkcWEJJFozLCRpbm91dDQJCSMgMCBsYXRlbmN5CisJICB2bW92dXBzCSRpbm91dDUsLTB4MTAoJG91dCkKKwkgdm1vdmRxYQkkSGtleSwkaW5vdXQ1CQkjIDAgbGF0ZW5jeQorCXZtb3ZkcXUJCTB4MjArOCglcnNwKSwkWjMJIyBJWzVdCisJam1wCQkuTG9vcDZ4CisKKy5MNnhfZG9uZToKKwl2cHhvcgkJMTYrOCglcnNwKSwkWGksJFhpCSMgbW9kdWxvLXNjaGVkdWxlZAorCXZweG9yCQkkWjAsJFhpLCRYaQkJIyBtb2R1bG8tc2NoZWR1bGVkCisKKwlyZXQKKy5zaXplCV9hZXNuaV9jdHIzMl9naGFzaF82eCwuLV9hZXNuaV9jdHIzMl9naGFzaF82eAorX19fCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNpemVfdCBhZXNuaV9nY21fW2VufGRlXWNyeXB0KGNvbnN0IHZvaWQgKmlucCwgdm9pZCAqb3V0LCBzaXplX3QgbGVuLAorIwkJY29uc3QgQUVTX0tFWSAqa2V5LCB1bnNpZ25lZCBjaGFyIGl2WzE2XSwKKyMJCXN0cnVjdCB7IHUxMjggWGksSCxIdGJsWzldOyB9ICpYaXApOworJGNvZGUuPTw8X19fOworLmdsb2JsCWFlc25pX2djbV9kZWNyeXB0CisudHlwZQlhZXNuaV9nY21fZGVjcnlwdCxcQGZ1bmN0aW9uLDYKKy5hbGlnbgkzMgorYWVzbmlfZ2NtX2RlY3J5cHQ6CisJeG9yCSRyZXQsJHJldAorCWNtcAlcJDB4NjAsJGxlbgkJCSMgbWluaW1hbCBhY2NlcHRlZCBsZW5ndGgKKwlqYgkuTGdjbV9kZWNfYWJvcnQKKworCWxlYQkoJXJzcCksJXJheAkJCSMgc2F2ZSBzdGFjayBwb2ludGVyCisJcHVzaAklcmJ4CisJcHVzaAklcmJwCisJcHVzaAklcjEyCisJcHVzaAklcjEzCisJcHVzaAklcjE0CisJcHVzaAklcjE1CitfX18KKyRjb2RlLj08PF9fXyBpZiAoJHdpbjY0KTsKKwlsZWEJLTB4YTgoJXJzcCksJXJzcAorCW1vdmFwcwkleG1tNiwtMHhkOCglcmF4KQorCW1vdmFwcwkleG1tNywtMHhjOCglcmF4KQorCW1vdmFwcwkleG1tOCwtMHhiOCglcmF4KQorCW1vdmFwcwkleG1tOSwtMHhhOCglcmF4KQorCW1vdmFwcwkleG1tMTAsLTB4OTgoJXJheCkKKwltb3ZhcHMJJXhtbTExLC0weDg4KCVyYXgpCisJbW92YXBzCSV4bW0xMiwtMHg3OCglcmF4KQorCW1vdmFwcwkleG1tMTMsLTB4NjgoJXJheCkKKwltb3ZhcHMJJXhtbTE0LC0weDU4KCVyYXgpCisJbW92YXBzCSV4bW0xNSwtMHg0OCglcmF4KQorLkxnY21fZGVjX2JvZHk6CitfX18KKyRjb2RlLj08PF9fXzsKKwl2emVyb3VwcGVyCisKKwl2bW92ZHF1CQkoJGl2cCksJFQxCQkjIGlucHV0IGNvdW50ZXIgdmFsdWUKKwlhZGQJCVwkLTEyOCwlcnNwCisJbW92CQkxMigkaXZwKSwkY291bnRlcgorCWxlYQkJLkxic3dhcF9tYXNrKCVyaXApLCRjb25zdAorCWxlYQkJLTB4ODAoJGtleSksJGluMAkjIGJvcnJvdyAkaW4wCisJbW92CQlcJDB4ZjgwLCRlbmQwCQkjIGJvcnJvdyAkZW5kMAorCXZtb3ZkcXUJCSgkWGlwKSwkWGkJCSMgbG9hZCBYaQorCWFuZAkJXCQtMTI4LCVyc3AJCSMgZW5zdXJlIHN0YWNrIGFsaWdubWVudAorCXZtb3ZkcXUJCSgkY29uc3QpLCRJaQkJIyBib3Jyb3cgJElpIGZvciAuTGJzd2FwX21hc2sKKwlsZWEJCTB4ODAoJGtleSksJGtleQkJIyBzaXplIG9wdGltaXphdGlvbgorCWxlYQkJMHgyMCsweDIwKCRYaXApLCRYaXAJIyBzaXplIG9wdGltaXphdGlvbgorCW1vdgkJMHhmMC0weDgwKCRrZXkpLCRyb3VuZHMKKwl2cHNodWZiCQkkSWksJFhpLCRYaQorCisJYW5kCQkkZW5kMCwkaW4wCisJYW5kCQklcnNwLCRlbmQwCisJc3ViCQkkaW4wLCRlbmQwCisJamMJCS5MZGVjX25vX2tleV9hbGlhc2luZworCWNtcAkJXCQ3NjgsJGVuZDAKKwlqbmMJCS5MZGVjX25vX2tleV9hbGlhc2luZworCXN1YgkJJGVuZDAsJXJzcAkJIyBhdm9pZCBhbGlhc2luZyB3aXRoIGtleQorLkxkZWNfbm9fa2V5X2FsaWFzaW5nOgorCisJdm1vdmRxdQkJMHg1MCgkaW5wKSwkWjMJCSMgSVs1XQorCWxlYQkJKCRpbnApLCRpbjAKKwl2bW92ZHF1CQkweDQwKCRpbnApLCRaMAorCWxlYQkJLTB4YzAoJGlucCwkbGVuKSwkZW5kMAorCXZtb3ZkcXUJCTB4MzAoJGlucCksJFoxCisJc2hyCQlcJDQsJGxlbgorCXhvcgkJJHJldCwkcmV0CisJdm1vdmRxdQkJMHgyMCgkaW5wKSwkWjIKKwkgdnBzaHVmYgkkSWksJFozLCRaMwkJIyBwYXNzZWQgdG8gX2Flc25pX2N0cjMyX2doYXNoXzZ4CisJdm1vdmRxdQkJMHgxMCgkaW5wKSwkVDIKKwkgdnBzaHVmYgkkSWksJFowLCRaMAorCXZtb3ZkcXUJCSgkaW5wKSwkSGtleQorCSB2cHNodWZiCSRJaSwkWjEsJFoxCisJdm1vdmRxdQkJJFowLDB4MzAoJXJzcCkKKwkgdnBzaHVmYgkkSWksJFoyLCRaMgorCXZtb3ZkcXUJCSRaMSwweDQwKCVyc3ApCisJIHZwc2h1ZmIJJElpLCRUMiwkVDIKKwl2bW92ZHF1CQkkWjIsMHg1MCglcnNwKQorCSB2cHNodWZiCSRJaSwkSGtleSwkSGtleQorCXZtb3ZkcXUJCSRUMiwweDYwKCVyc3ApCisJdm1vdmRxdQkJJEhrZXksMHg3MCglcnNwKQorCisJY2FsbAkJX2Flc25pX2N0cjMyX2doYXNoXzZ4CisKKwl2bW92dXBzCQkkaW5vdXQwLC0weDYwKCRvdXQpCSMgc2F2ZSBvdXRwdXQKKwl2bW92dXBzCQkkaW5vdXQxLC0weDUwKCRvdXQpCisJdm1vdnVwcwkJJGlub3V0MiwtMHg0MCgkb3V0KQorCXZtb3Z1cHMJCSRpbm91dDMsLTB4MzAoJG91dCkKKwl2bW92dXBzCQkkaW5vdXQ0LC0weDIwKCRvdXQpCisJdm1vdnVwcwkJJGlub3V0NSwtMHgxMCgkb3V0KQorCisJdnBzaHVmYgkJKCRjb25zdCksJFhpLCRYaQkjIC5MYnN3YXBfbWFzaworCXZtb3ZkcXUJCSRYaSwtMHg0MCgkWGlwKQkJIyBvdXRwdXQgWGkKKworCXZ6ZXJvdXBwZXIKK19fXworJGNvZGUuPTw8X19fIGlmICgkd2luNjQpOworCW1vdmFwcwktMHhkOCglcmF4KSwleG1tNgorCW1vdmFwcwktMHhkOCglcmF4KSwleG1tNworCW1vdmFwcwktMHhiOCglcmF4KSwleG1tOAorCW1vdmFwcwktMHhhOCglcmF4KSwleG1tOQorCW1vdmFwcwktMHg5OCglcmF4KSwleG1tMTAKKwltb3ZhcHMJLTB4ODgoJXJheCksJXhtbTExCisJbW92YXBzCS0weDc4KCVyYXgpLCV4bW0xMgorCW1vdmFwcwktMHg2OCglcmF4KSwleG1tMTMKKwltb3ZhcHMJLTB4NTgoJXJheCksJXhtbTE0CisJbW92YXBzCS0weDQ4KCVyYXgpLCV4bW0xNQorX19fCiskY29kZS49PDxfX187CisJbW92CS00OCglcmF4KSwlcjE1CisJbW92CS00MCglcmF4KSwlcjE0CisJbW92CS0zMiglcmF4KSwlcjEzCisJbW92CS0yNCglcmF4KSwlcjEyCisJbW92CS0xNiglcmF4KSwlcmJwCisJbW92CS04KCVyYXgpLCVyYngKKwlsZWEJKCVyYXgpLCVyc3AJCSMgcmVzdG9yZSAlcnNwCisuTGdjbV9kZWNfYWJvcnQ6CisJbW92CSRyZXQsJXJheAkJIyByZXR1cm4gdmFsdWUKKwlyZXQKKy5zaXplCWFlc25pX2djbV9kZWNyeXB0LC4tYWVzbmlfZ2NtX2RlY3J5cHQKK19fXworCiskY29kZS49PDxfX187CisudHlwZQlfYWVzbmlfY3RyMzJfNngsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTMyCitfYWVzbmlfY3RyMzJfNng6CisJdm1vdmRxdQkJMHgwMC0weDgwKCRrZXkpLCRaMAkjIGJvcnJvdyAkWjAgZm9yICRybmRrZXkKKwl2bW92ZHF1CQkweDIwKCRjb25zdCksJFQyCSMgYm9ycm93ICRUMiwgLkxvbmVfbXNiCisJbGVhCQktMSgkcm91bmRzKSwlcjEzCisJdm1vdnVwcwkJMHgxMC0weDgwKCRrZXkpLCRybmRrZXkKKwlsZWEJCTB4MjAtMHg4MCgka2V5KSwlcjEyCisJdnB4b3IJCSRaMCwkVDEsJGlub3V0MAorCWFkZAkJXCQxMDA2NjMyOTYsJGNvdW50ZXIKKwlqYwkJLkxoYW5kbGVfY3RyMzJfMgorCXZwYWRkYgkJJFQyLCRUMSwkaW5vdXQxCisJdnBhZGRiCQkkVDIsJGlub3V0MSwkaW5vdXQyCisJdnB4b3IJCSRaMCwkaW5vdXQxLCRpbm91dDEKKwl2cGFkZGIJCSRUMiwkaW5vdXQyLCRpbm91dDMKKwl2cHhvcgkJJFowLCRpbm91dDIsJGlub3V0MgorCXZwYWRkYgkJJFQyLCRpbm91dDMsJGlub3V0NAorCXZweG9yCQkkWjAsJGlub3V0MywkaW5vdXQzCisJdnBhZGRiCQkkVDIsJGlub3V0NCwkaW5vdXQ1CisJdnB4b3IJCSRaMCwkaW5vdXQ0LCRpbm91dDQKKwl2cGFkZGIJCSRUMiwkaW5vdXQ1LCRUMQorCXZweG9yCQkkWjAsJGlub3V0NSwkaW5vdXQ1CisJam1wCQkuTG9vcF9jdHIzMgorCisuYWxpZ24JMTYKKy5Mb29wX2N0cjMyOgorCXZhZXNlbmMJCSRybmRrZXksJGlub3V0MCwkaW5vdXQwCisJdmFlc2VuYwkJJHJuZGtleSwkaW5vdXQxLCRpbm91dDEKKwl2YWVzZW5jCQkkcm5ka2V5LCRpbm91dDIsJGlub3V0MgorCXZhZXNlbmMJCSRybmRrZXksJGlub3V0MywkaW5vdXQzCisJdmFlc2VuYwkJJHJuZGtleSwkaW5vdXQ0LCRpbm91dDQKKwl2YWVzZW5jCQkkcm5ka2V5LCRpbm91dDUsJGlub3V0NQorCXZtb3Z1cHMJCSglcjEyKSwkcm5ka2V5CisJbGVhCQkweDEwKCVyMTIpLCVyMTIKKwlkZWMJCSVyMTNkCisJam56CQkuTG9vcF9jdHIzMgorCisJdm1vdmRxdQkJKCVyMTIpLCRIa2V5CQkjIGxhc3Qgcm91bmQga2V5CisJdmFlc2VuYwkJJHJuZGtleSwkaW5vdXQwLCRpbm91dDAKKwl2cHhvcgkJMHgwMCgkaW5wKSwkSGtleSwkWjAKKwl2YWVzZW5jCQkkcm5ka2V5LCRpbm91dDEsJGlub3V0MQorCXZweG9yCQkweDEwKCRpbnApLCRIa2V5LCRaMQorCXZhZXNlbmMJCSRybmRrZXksJGlub3V0MiwkaW5vdXQyCisJdnB4b3IJCTB4MjAoJGlucCksJEhrZXksJFoyCisJdmFlc2VuYwkJJHJuZGtleSwkaW5vdXQzLCRpbm91dDMKKwl2cHhvcgkJMHgzMCgkaW5wKSwkSGtleSwkWGkKKwl2YWVzZW5jCQkkcm5ka2V5LCRpbm91dDQsJGlub3V0NAorCXZweG9yCQkweDQwKCRpbnApLCRIa2V5LCRUMgorCXZhZXNlbmMJCSRybmRrZXksJGlub3V0NSwkaW5vdXQ1CisJdnB4b3IJCTB4NTAoJGlucCksJEhrZXksJEhrZXkKKwlsZWEJCTB4NjAoJGlucCksJGlucAorCisJdmFlc2VuY2xhc3QJJFowLCRpbm91dDAsJGlub3V0MAorCXZhZXNlbmNsYXN0CSRaMSwkaW5vdXQxLCRpbm91dDEKKwl2YWVzZW5jbGFzdAkkWjIsJGlub3V0MiwkaW5vdXQyCisJdmFlc2VuY2xhc3QJJFhpLCRpbm91dDMsJGlub3V0MworCXZhZXNlbmNsYXN0CSRUMiwkaW5vdXQ0LCRpbm91dDQKKwl2YWVzZW5jbGFzdAkkSGtleSwkaW5vdXQ1LCRpbm91dDUKKwl2bW92dXBzCQkkaW5vdXQwLDB4MDAoJG91dCkKKwl2bW92dXBzCQkkaW5vdXQxLDB4MTAoJG91dCkKKwl2bW92dXBzCQkkaW5vdXQyLDB4MjAoJG91dCkKKwl2bW92dXBzCQkkaW5vdXQzLDB4MzAoJG91dCkKKwl2bW92dXBzCQkkaW5vdXQ0LDB4NDAoJG91dCkKKwl2bW92dXBzCQkkaW5vdXQ1LDB4NTAoJG91dCkKKwlsZWEJCTB4NjAoJG91dCksJG91dAorCisJcmV0CisuYWxpZ24JMzIKKy5MaGFuZGxlX2N0cjMyXzI6CisJdnBzaHVmYgkJJElpLCRUMSwkWjIJCSMgYnl0ZS1zd2FwIGNvdW50ZXIKKwl2bW92ZHF1CQkweDMwKCRjb25zdCksJFoxCSMgYm9ycm93ICRaMSwgLkx0d29fbHNiCisJdnBhZGRkCQkweDQwKCRjb25zdCksJFoyLCRpbm91dDEJIyAuTG9uZV9sc2IKKwl2cGFkZGQJCSRaMSwkWjIsJGlub3V0MgorCXZwYWRkZAkJJFoxLCRpbm91dDEsJGlub3V0MworCXZwc2h1ZmIJCSRJaSwkaW5vdXQxLCRpbm91dDEKKwl2cGFkZGQJCSRaMSwkaW5vdXQyLCRpbm91dDQKKwl2cHNodWZiCQkkSWksJGlub3V0MiwkaW5vdXQyCisJdnB4b3IJCSRaMCwkaW5vdXQxLCRpbm91dDEKKwl2cGFkZGQJCSRaMSwkaW5vdXQzLCRpbm91dDUKKwl2cHNodWZiCQkkSWksJGlub3V0MywkaW5vdXQzCisJdnB4b3IJCSRaMCwkaW5vdXQyLCRpbm91dDIKKwl2cGFkZGQJCSRaMSwkaW5vdXQ0LCRUMQkJIyBieXRlLXN3YXBwZWQgbmV4dCBjb3VudGVyIHZhbHVlCisJdnBzaHVmYgkJJElpLCRpbm91dDQsJGlub3V0NAorCXZweG9yCQkkWjAsJGlub3V0MywkaW5vdXQzCisJdnBzaHVmYgkJJElpLCRpbm91dDUsJGlub3V0NQorCXZweG9yCQkkWjAsJGlub3V0NCwkaW5vdXQ0CisJdnBzaHVmYgkJJElpLCRUMSwkVDEJCSMgbmV4dCBjb3VudGVyIHZhbHVlCisJdnB4b3IJCSRaMCwkaW5vdXQ1LCRpbm91dDUKKwlqbXAJLkxvb3BfY3RyMzIKKy5zaXplCV9hZXNuaV9jdHIzMl82eCwuLV9hZXNuaV9jdHIzMl82eAorCisuZ2xvYmwJYWVzbmlfZ2NtX2VuY3J5cHQKKy50eXBlCWFlc25pX2djbV9lbmNyeXB0LFxAZnVuY3Rpb24sNgorLmFsaWduCTMyCithZXNuaV9nY21fZW5jcnlwdDoKKwl4b3IJJHJldCwkcmV0CisJY21wCVwkMHg2MCozLCRsZW4JCQkjIG1pbmltYWwgYWNjZXB0ZWQgbGVuZ3RoCisJamIJLkxnY21fZW5jX2Fib3J0CisKKwlsZWEJKCVyc3ApLCVyYXgJCQkjIHNhdmUgc3RhY2sgcG9pbnRlcgorCXB1c2gJJXJieAorCXB1c2gJJXJicAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCXB1c2gJJXIxNQorX19fCiskY29kZS49PDxfX18gaWYgKCR3aW42NCk7CisJbGVhCS0weGE4KCVyc3ApLCVyc3AKKwltb3ZhcHMJJXhtbTYsLTB4ZDgoJXJheCkKKwltb3ZhcHMJJXhtbTcsLTB4YzgoJXJheCkKKwltb3ZhcHMJJXhtbTgsLTB4YjgoJXJheCkKKwltb3ZhcHMJJXhtbTksLTB4YTgoJXJheCkKKwltb3ZhcHMJJXhtbTEwLC0weDk4KCVyYXgpCisJbW92YXBzCSV4bW0xMSwtMHg4OCglcmF4KQorCW1vdmFwcwkleG1tMTIsLTB4NzgoJXJheCkKKwltb3ZhcHMJJXhtbTEzLC0weDY4KCVyYXgpCisJbW92YXBzCSV4bW0xNCwtMHg1OCglcmF4KQorCW1vdmFwcwkleG1tMTUsLTB4NDgoJXJheCkKKy5MZ2NtX2VuY19ib2R5OgorX19fCiskY29kZS49PDxfX187CisJdnplcm91cHBlcgorCisJdm1vdmRxdQkJKCRpdnApLCRUMQkJIyBpbnB1dCBjb3VudGVyIHZhbHVlCisJYWRkCQlcJC0xMjgsJXJzcAorCW1vdgkJMTIoJGl2cCksJGNvdW50ZXIKKwlsZWEJCS5MYnN3YXBfbWFzayglcmlwKSwkY29uc3QKKwlsZWEJCS0weDgwKCRrZXkpLCRpbjAJIyBib3Jyb3cgJGluMAorCW1vdgkJXCQweGY4MCwkZW5kMAkJIyBib3Jyb3cgJGVuZDAKKwlsZWEJCTB4ODAoJGtleSksJGtleQkJIyBzaXplIG9wdGltaXphdGlvbgorCXZtb3ZkcXUJCSgkY29uc3QpLCRJaQkJIyBib3Jyb3cgJElpIGZvciAuTGJzd2FwX21hc2sKKwlhbmQJCVwkLTEyOCwlcnNwCQkjIGVuc3VyZSBzdGFjayBhbGlnbm1lbnQKKwltb3YJCTB4ZjAtMHg4MCgka2V5KSwkcm91bmRzCisKKwlhbmQJCSRlbmQwLCRpbjAKKwlhbmQJCSVyc3AsJGVuZDAKKwlzdWIJCSRpbjAsJGVuZDAKKwlqYwkJLkxlbmNfbm9fa2V5X2FsaWFzaW5nCisJY21wCQlcJDc2OCwkZW5kMAorCWpuYwkJLkxlbmNfbm9fa2V5X2FsaWFzaW5nCisJc3ViCQkkZW5kMCwlcnNwCQkjIGF2b2lkIGFsaWFzaW5nIHdpdGgga2V5CisuTGVuY19ub19rZXlfYWxpYXNpbmc6CisKKwlsZWEJCSgkb3V0KSwkaW4wCisJbGVhCQktMHhjMCgkb3V0LCRsZW4pLCRlbmQwCisJc2hyCQlcJDQsJGxlbgorCisJY2FsbAkJX2Flc25pX2N0cjMyXzZ4CisJdnBzaHVmYgkJJElpLCRpbm91dDAsJFhpCQkjIHNhdmUgYnN3YXBwZWQgb3V0cHV0IG9uIHN0YWNrCisJdnBzaHVmYgkJJElpLCRpbm91dDEsJFQyCisJdm1vdmRxdQkJJFhpLDB4NzAoJXJzcCkKKwl2cHNodWZiCQkkSWksJGlub3V0MiwkWjAKKwl2bW92ZHF1CQkkVDIsMHg2MCglcnNwKQorCXZwc2h1ZmIJCSRJaSwkaW5vdXQzLCRaMQorCXZtb3ZkcXUJCSRaMCwweDUwKCVyc3ApCisJdnBzaHVmYgkJJElpLCRpbm91dDQsJFoyCisJdm1vdmRxdQkJJFoxLDB4NDAoJXJzcCkKKwl2cHNodWZiCQkkSWksJGlub3V0NSwkWjMJCSMgcGFzc2VkIHRvIF9hZXNuaV9jdHIzMl9naGFzaF82eAorCXZtb3ZkcXUJCSRaMiwweDMwKCVyc3ApCisKKwljYWxsCQlfYWVzbmlfY3RyMzJfNngKKworCXZtb3ZkcXUJCSgkWGlwKSwkWGkJCSMgbG9hZCBYaQorCWxlYQkJMHgyMCsweDIwKCRYaXApLCRYaXAJIyBzaXplIG9wdGltaXphdGlvbgorCXN1YgkJXCQxMiwkbGVuCisJbW92CQlcJDB4NjAqMiwkcmV0CisJdnBzaHVmYgkJJElpLCRYaSwkWGkKKworCWNhbGwJCV9hZXNuaV9jdHIzMl9naGFzaF82eAorCXZtb3ZkcXUJCTB4MjAoJXJzcCksJFozCQkjIElbNV0KKwkgdm1vdmRxdQkoJGNvbnN0KSwkSWkJCSMgYm9ycm93ICRJaSBmb3IgLkxic3dhcF9tYXNrCisJdm1vdmRxdQkJMHgwMC0weDIwKCRYaXApLCRIa2V5CSMgJEhrZXleMQorCXZwdW5wY2tocWRxCSRaMywkWjMsJFQxCisJdm1vdmRxdQkJMHgyMC0weDIwKCRYaXApLCRybmRrZXkJIyBib3Jyb3cgJHJuZGtleSBmb3IgJEhLCisJIHZtb3Z1cHMJJGlub3V0MCwtMHg2MCgkb3V0KQkjIHNhdmUgb3V0cHV0CisJIHZwc2h1ZmIJJElpLCRpbm91dDAsJGlub3V0MAkjIGJ1dCBrZWVwIGJzd2FwcGVkIGNvcHkKKwl2cHhvcgkJJFozLCRUMSwkVDEKKwkgdm1vdnVwcwkkaW5vdXQxLC0weDUwKCRvdXQpCisJIHZwc2h1ZmIJJElpLCRpbm91dDEsJGlub3V0MQorCSB2bW92dXBzCSRpbm91dDIsLTB4NDAoJG91dCkKKwkgdnBzaHVmYgkkSWksJGlub3V0MiwkaW5vdXQyCisJIHZtb3Z1cHMJJGlub3V0MywtMHgzMCgkb3V0KQorCSB2cHNodWZiCSRJaSwkaW5vdXQzLCRpbm91dDMKKwkgdm1vdnVwcwkkaW5vdXQ0LC0weDIwKCRvdXQpCisJIHZwc2h1ZmIJJElpLCRpbm91dDQsJGlub3V0NAorCSB2bW92dXBzCSRpbm91dDUsLTB4MTAoJG91dCkKKwkgdnBzaHVmYgkkSWksJGlub3V0NSwkaW5vdXQ1CisJIHZtb3ZkcXUJJGlub3V0MCwweDEwKCVyc3ApCSMgZnJlZSAkaW5vdXQwCitfX18KK3sgbXkgKCRISywkVDMpPSgkcm5ka2V5LCRpbm91dDApOworCiskY29kZS49PDxfX187CisJIHZtb3ZkcXUJMHgzMCglcnNwKSwkWjIJCSMgSVs0XQorCSB2bW92ZHF1CTB4MTAtMHgyMCgkWGlwKSwkSWkJIyBib3Jyb3cgJElpIGZvciAkSGtleV4yCisJIHZwdW5wY2tocWRxCSRaMiwkWjIsJFQyCisJdnBjbG11bHFkcQlcJDB4MDAsJEhrZXksJFozLCRaMQorCSB2cHhvcgkJJFoyLCRUMiwkVDIKKwl2cGNsbXVscWRxCVwkMHgxMSwkSGtleSwkWjMsJFozCisJdnBjbG11bHFkcQlcJDB4MDAsJEhLLCRUMSwkVDEKKworCSB2bW92ZHF1CTB4NDAoJXJzcCksJFQzCQkjIElbM10KKwl2cGNsbXVscWRxCVwkMHgwMCwkSWksJFoyLCRaMAorCSB2bW92ZHF1CTB4MzAtMHgyMCgkWGlwKSwkSGtleQkjICRIa2V5XjMKKwl2cHhvcgkJJFoxLCRaMCwkWjAKKwkgdnB1bnBja2hxZHEJJFQzLCRUMywkWjEKKwl2cGNsbXVscWRxCVwkMHgxMSwkSWksJFoyLCRaMgorCSB2cHhvcgkJJFQzLCRaMSwkWjEKKwl2cHhvcgkJJFozLCRaMiwkWjIKKwl2cGNsbXVscWRxCVwkMHgxMCwkSEssJFQyLCRUMgorCSB2bW92ZHF1CTB4NTAtMHgyMCgkWGlwKSwkSEsKKwl2cHhvcgkJJFQxLCRUMiwkVDIKKworCSB2bW92ZHF1CTB4NTAoJXJzcCksJFQxCQkjIElbMl0KKwl2cGNsbXVscWRxCVwkMHgwMCwkSGtleSwkVDMsJFozCisJIHZtb3ZkcXUJMHg0MC0weDIwKCRYaXApLCRJaQkjIGJvcnJvdyAkSWkgZm9yICRIa2V5XjQKKwl2cHhvcgkJJFowLCRaMywkWjMKKwkgdnB1bnBja2hxZHEJJFQxLCRUMSwkWjAKKwl2cGNsbXVscWRxCVwkMHgxMSwkSGtleSwkVDMsJFQzCisJIHZweG9yCQkkVDEsJFowLCRaMAorCXZweG9yCQkkWjIsJFQzLCRUMworCXZwY2xtdWxxZHEJXCQweDAwLCRISywkWjEsJFoxCisJdnB4b3IJCSRUMiwkWjEsJFoxCisKKwkgdm1vdmRxdQkweDYwKCVyc3ApLCRUMgkJIyBJWzFdCisJdnBjbG11bHFkcQlcJDB4MDAsJElpLCRUMSwkWjIKKwkgdm1vdmRxdQkweDYwLTB4MjAoJFhpcCksJEhrZXkJIyAkSGtleV41CisJdnB4b3IJCSRaMywkWjIsJFoyCisJIHZwdW5wY2tocWRxCSRUMiwkVDIsJFozCisJdnBjbG11bHFkcQlcJDB4MTEsJElpLCRUMSwkVDEKKwkgdnB4b3IJCSRUMiwkWjMsJFozCisJdnB4b3IJCSRUMywkVDEsJFQxCisJdnBjbG11bHFkcQlcJDB4MTAsJEhLLCRaMCwkWjAKKwkgdm1vdmRxdQkweDgwLTB4MjAoJFhpcCksJEhLCisJdnB4b3IJCSRaMSwkWjAsJFowCisKKwkgdnB4b3IJCTB4NzAoJXJzcCksJFhpLCRYaQkjIGFjY3VtdWxhdGUgSVswXQorCXZwY2xtdWxxZHEJXCQweDAwLCRIa2V5LCRUMiwkWjEKKwkgdm1vdmRxdQkweDcwLTB4MjAoJFhpcCksJElpCSMgYm9ycm93ICRJaSBmb3IgJEhrZXleNgorCSB2cHVucGNraHFkcQkkWGksJFhpLCRUMworCXZweG9yCQkkWjIsJFoxLCRaMQorCXZwY2xtdWxxZHEJXCQweDExLCRIa2V5LCRUMiwkVDIKKwkgdnB4b3IJCSRYaSwkVDMsJFQzCisJdnB4b3IJCSRUMSwkVDIsJFQyCisJdnBjbG11bHFkcQlcJDB4MDAsJEhLLCRaMywkWjMKKwl2cHhvcgkJJFowLCRaMywkWjAKKworCXZwY2xtdWxxZHEJXCQweDAwLCRJaSwkWGksJFoyCisJIHZtb3ZkcXUJMHgwMC0weDIwKCRYaXApLCRIa2V5CSMgJEhrZXleMQorCSB2cHVucGNraHFkcQkkaW5vdXQ1LCRpbm91dDUsJFQxCisJdnBjbG11bHFkcQlcJDB4MTEsJElpLCRYaSwkWGkKKwkgdnB4b3IJCSRpbm91dDUsJFQxLCRUMQorCXZweG9yCQkkWjEsJFoyLCRaMQorCXZwY2xtdWxxZHEJXCQweDEwLCRISywkVDMsJFQzCisJIHZtb3ZkcXUJMHgyMC0weDIwKCRYaXApLCRISworCXZweG9yCQkkVDIsJFhpLCRaMworCXZweG9yCQkkWjAsJFQzLCRaMgorCisJIHZtb3ZkcXUJMHgxMC0weDIwKCRYaXApLCRJaQkjIGJvcnJvdyAkSWkgZm9yICRIa2V5XjIKKwkgIHZweG9yCQkkWjEsJFozLCRUMwkJIyBhZ2dyZWdhdGVkIEthcmF0c3ViYSBwb3N0LXByb2Nlc3NpbmcKKwl2cGNsbXVscWRxCVwkMHgwMCwkSGtleSwkaW5vdXQ1LCRaMAorCSAgdnB4b3IJCSRUMywkWjIsJFoyCisJIHZwdW5wY2tocWRxCSRpbm91dDQsJGlub3V0NCwkVDIKKwl2cGNsbXVscWRxCVwkMHgxMSwkSGtleSwkaW5vdXQ1LCRpbm91dDUKKwkgdnB4b3IJCSRpbm91dDQsJFQyLCRUMgorCSAgdnBzbGxkcQlcJDgsJFoyLCRUMworCXZwY2xtdWxxZHEJXCQweDAwLCRISywkVDEsJFQxCisJICB2cHhvcgkJJFQzLCRaMSwkWGkKKwkgIHZwc3JsZHEJXCQ4LCRaMiwkWjIKKwkgIHZweG9yCQkkWjIsJFozLCRaMworCisJdnBjbG11bHFkcQlcJDB4MDAsJElpLCRpbm91dDQsJFoxCisJIHZtb3ZkcXUJMHgzMC0weDIwKCRYaXApLCRIa2V5CSMgJEhrZXleMworCXZweG9yCQkkWjAsJFoxLCRaMQorCSB2cHVucGNraHFkcQkkaW5vdXQzLCRpbm91dDMsJFQzCisJdnBjbG11bHFkcQlcJDB4MTEsJElpLCRpbm91dDQsJGlub3V0NAorCSB2cHhvcgkJJGlub3V0MywkVDMsJFQzCisJdnB4b3IJCSRpbm91dDUsJGlub3V0NCwkaW5vdXQ0CisJICB2cGFsaWducglcJDgsJFhpLCRYaSwkaW5vdXQ1CSMgMXN0IHBoYXNlCisJdnBjbG11bHFkcQlcJDB4MTAsJEhLLCRUMiwkVDIKKwkgdm1vdmRxdQkweDUwLTB4MjAoJFhpcCksJEhLCisJdnB4b3IJCSRUMSwkVDIsJFQyCisKKwl2cGNsbXVscWRxCVwkMHgwMCwkSGtleSwkaW5vdXQzLCRaMAorCSB2bW92ZHF1CTB4NDAtMHgyMCgkWGlwKSwkSWkJIyBib3Jyb3cgJElpIGZvciAkSGtleV40CisJdnB4b3IJCSRaMSwkWjAsJFowCisJIHZwdW5wY2tocWRxCSRpbm91dDIsJGlub3V0MiwkVDEKKwl2cGNsbXVscWRxCVwkMHgxMSwkSGtleSwkaW5vdXQzLCRpbm91dDMKKwkgdnB4b3IJCSRpbm91dDIsJFQxLCRUMQorCXZweG9yCQkkaW5vdXQ0LCRpbm91dDMsJGlub3V0MworCSAgdnhvcnBzCTB4MTAoJXJzcCksJFozLCRaMwkjIGFjY3VtdWxhdGUgJGlub3V0MAorCXZwY2xtdWxxZHEJXCQweDAwLCRISywkVDMsJFQzCisJdnB4b3IJCSRUMiwkVDMsJFQzCisKKwkgIHZwY2xtdWxxZHEJXCQweDEwLDB4MTAoJGNvbnN0KSwkWGksJFhpCisJICB2eG9ycHMJJGlub3V0NSwkWGksJFhpCisKKwl2cGNsbXVscWRxCVwkMHgwMCwkSWksJGlub3V0MiwkWjEKKwkgdm1vdmRxdQkweDYwLTB4MjAoJFhpcCksJEhrZXkJIyAkSGtleV41CisJdnB4b3IJCSRaMCwkWjEsJFoxCisJIHZwdW5wY2tocWRxCSRpbm91dDEsJGlub3V0MSwkVDIKKwl2cGNsbXVscWRxCVwkMHgxMSwkSWksJGlub3V0MiwkaW5vdXQyCisJIHZweG9yCQkkaW5vdXQxLCRUMiwkVDIKKwkgIHZwYWxpZ25yCVwkOCwkWGksJFhpLCRpbm91dDUJIyAybmQgcGhhc2UKKwl2cHhvcgkJJGlub3V0MywkaW5vdXQyLCRpbm91dDIKKwl2cGNsbXVscWRxCVwkMHgxMCwkSEssJFQxLCRUMQorCSB2bW92ZHF1CTB4ODAtMHgyMCgkWGlwKSwkSEsKKwl2cHhvcgkJJFQzLCRUMSwkVDEKKworCSAgdnhvcnBzCSRaMywkaW5vdXQ1LCRpbm91dDUKKwkgIHZwY2xtdWxxZHEJXCQweDEwLDB4MTAoJGNvbnN0KSwkWGksJFhpCisJICB2eG9ycHMJJGlub3V0NSwkWGksJFhpCisKKwl2cGNsbXVscWRxCVwkMHgwMCwkSGtleSwkaW5vdXQxLCRaMAorCSB2bW92ZHF1CTB4NzAtMHgyMCgkWGlwKSwkSWkJIyBib3Jyb3cgJElpIGZvciAkSGtleV42CisJdnB4b3IJCSRaMSwkWjAsJFowCisJIHZwdW5wY2tocWRxCSRYaSwkWGksJFQzCisJdnBjbG11bHFkcQlcJDB4MTEsJEhrZXksJGlub3V0MSwkaW5vdXQxCisJIHZweG9yCQkkWGksJFQzLCRUMworCXZweG9yCQkkaW5vdXQyLCRpbm91dDEsJGlub3V0MQorCXZwY2xtdWxxZHEJXCQweDAwLCRISywkVDIsJFQyCisJdnB4b3IJCSRUMSwkVDIsJFQyCisKKwl2cGNsbXVscWRxCVwkMHgwMCwkSWksJFhpLCRaMQorCXZwY2xtdWxxZHEJXCQweDExLCRJaSwkWGksJFozCisJdnB4b3IJCSRaMCwkWjEsJFoxCisJdnBjbG11bHFkcQlcJDB4MTAsJEhLLCRUMywkWjIKKwl2cHhvcgkJJGlub3V0MSwkWjMsJFozCisJdnB4b3IJCSRUMiwkWjIsJFoyCisKKwl2cHhvcgkJJFoxLCRaMywkWjAJCSMgYWdncmVnYXRlZCBLYXJhdHN1YmEgcG9zdC1wcm9jZXNzaW5nCisJdnB4b3IJCSRaMCwkWjIsJFoyCisJdnBzbGxkcQkJXCQ4LCRaMiwkVDEKKwl2bW92ZHF1CQkweDEwKCRjb25zdCksJEhrZXkJIyAuTHBvbHkKKwl2cHNybGRxCQlcJDgsJFoyLCRaMgorCXZweG9yCQkkVDEsJFoxLCRYaQorCXZweG9yCQkkWjIsJFozLCRaMworCisJdnBhbGlnbnIJXCQ4LCRYaSwkWGksJFQyCQkjIDFzdCBwaGFzZQorCXZwY2xtdWxxZHEJXCQweDEwLCRIa2V5LCRYaSwkWGkKKwl2cHhvcgkJJFQyLCRYaSwkWGkKKworCXZwYWxpZ25yCVwkOCwkWGksJFhpLCRUMgkJIyAybmQgcGhhc2UKKwl2cGNsbXVscWRxCVwkMHgxMCwkSGtleSwkWGksJFhpCisJdnB4b3IJCSRaMywkVDIsJFQyCisJdnB4b3IJCSRUMiwkWGksJFhpCitfX18KK30KKyRjb2RlLj08PF9fXzsKKwl2cHNodWZiCQkoJGNvbnN0KSwkWGksJFhpCSMgLkxic3dhcF9tYXNrCisJdm1vdmRxdQkJJFhpLC0weDQwKCRYaXApCQkjIG91dHB1dCBYaQorCisJdnplcm91cHBlcgorX19fCiskY29kZS49PDxfX18gaWYgKCR3aW42NCk7CisJbW92YXBzCS0weGQ4KCVyYXgpLCV4bW02CisJbW92YXBzCS0weGM4KCVyYXgpLCV4bW03CisJbW92YXBzCS0weGI4KCVyYXgpLCV4bW04CisJbW92YXBzCS0weGE4KCVyYXgpLCV4bW05CisJbW92YXBzCS0weDk4KCVyYXgpLCV4bW0xMAorCW1vdmFwcwktMHg4OCglcmF4KSwleG1tMTEKKwltb3ZhcHMJLTB4NzgoJXJheCksJXhtbTEyCisJbW92YXBzCS0weDY4KCVyYXgpLCV4bW0xMworCW1vdmFwcwktMHg1OCglcmF4KSwleG1tMTQKKwltb3ZhcHMJLTB4NDgoJXJheCksJXhtbTE1CitfX18KKyRjb2RlLj08PF9fXzsKKwltb3YJLTQ4KCVyYXgpLCVyMTUKKwltb3YJLTQwKCVyYXgpLCVyMTQKKwltb3YJLTMyKCVyYXgpLCVyMTMKKwltb3YJLTI0KCVyYXgpLCVyMTIKKwltb3YJLTE2KCVyYXgpLCVyYnAKKwltb3YJLTgoJXJheCksJXJieAorCWxlYQkoJXJheCksJXJzcAkJIyByZXN0b3JlICVyc3AKKy5MZ2NtX2VuY19hYm9ydDoKKwltb3YJJHJldCwlcmF4CQkjIHJldHVybiB2YWx1ZQorCXJldAorLnNpemUJYWVzbmlfZ2NtX2VuY3J5cHQsLi1hZXNuaV9nY21fZW5jcnlwdAorX19fCisKKyRjb2RlLj08PF9fXzsKKy5hbGlnbgk2NAorLkxic3dhcF9tYXNrOgorCS5ieXRlCTE1LDE0LDEzLDEyLDExLDEwLDksOCw3LDYsNSw0LDMsMiwxLDAKKy5McG9seToKKwkuYnl0ZQkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwweGMyCisuTG9uZV9tc2I6CisJLmJ5dGUJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMQorLkx0d29fbHNiOgorCS5ieXRlCTIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAKKy5Mb25lX2xzYjoKKwkuYnl0ZQkxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwCisuYXNjaXoJIkFFUy1OSSBHQ00gbW9kdWxlIGZvciB4ODZfNjQsIENSWVBUT0dBTVMgYnkgPGFwcHJvXEBvcGVuc3NsLm9yZz4iCisuYWxpZ24JNjQKK19fXworaWYgKCR3aW42NCkgeworJHJlYz0iJXJjeCI7CiskZnJhbWU9IiVyZHgiOworJGNvbnRleHQ9IiVyOCI7CiskZGlzcD0iJXI5IjsKKworJGNvZGUuPTw8X19fCisuZXh0ZXJuCV9faW1wX1J0bFZpcnR1YWxVbndpbmQKKy50eXBlCWdjbV9zZV9oYW5kbGVyLFxAYWJpLW9tbmlwb3RlbnQKKy5hbGlnbgkxNgorZ2NtX3NlX2hhbmRsZXI6CisJcHVzaAklcnNpCisJcHVzaAklcmRpCisJcHVzaAklcmJ4CisJcHVzaAklcmJwCisJcHVzaAklcjEyCisJcHVzaAklcjEzCisJcHVzaAklcjE0CisJcHVzaAklcjE1CisJcHVzaGZxCisJc3ViCVwkNjQsJXJzcAorCisJbW92CTEyMCgkY29udGV4dCksJXJheAkjIHB1bGwgY29udGV4dC0+UmF4CisJbW92CTI0OCgkY29udGV4dCksJXJieAkjIHB1bGwgY29udGV4dC0+UmlwCisKKwltb3YJOCgkZGlzcCksJXJzaQkJIyBkaXNwLT5JbWFnZUJhc2UKKwltb3YJNTYoJGRpc3ApLCVyMTEJCSMgZGlzcC0+SGFuZGxlckRhdGEKKworCW1vdgkwKCVyMTEpLCVyMTBkCQkjIEhhbmRsZXJEYXRhWzBdCisJbGVhCSglcnNpLCVyMTApLCVyMTAJIyBwcm9sb2d1ZSBsYWJlbAorCWNtcAklcjEwLCVyYngJCSMgY29udGV4dC0+UmlwPHByb2xvZ3VlIGxhYmVsCisJamIJLkxjb21tb25fc2VoX3RhaWwKKworCW1vdgkxNTIoJGNvbnRleHQpLCVyYXgJIyBwdWxsIGNvbnRleHQtPlJzcAorCisJbW92CTQoJXIxMSksJXIxMGQJCSMgSGFuZGxlckRhdGFbMV0KKwlsZWEJKCVyc2ksJXIxMCksJXIxMAkjIGVwaWxvZ3VlIGxhYmVsCisJY21wCSVyMTAsJXJieAkJIyBjb250ZXh0LT5SaXA+PWVwaWxvZ3VlIGxhYmVsCisJamFlCS5MY29tbW9uX3NlaF90YWlsCisKKwltb3YJMTIwKCRjb250ZXh0KSwlcmF4CSMgcHVsbCBjb250ZXh0LT5SYXgKKworCW1vdgktNDgoJXJheCksJXIxNQorCW1vdgktNDAoJXJheCksJXIxNAorCW1vdgktMzIoJXJheCksJXIxMworCW1vdgktMjQoJXJheCksJXIxMgorCW1vdgktMTYoJXJheCksJXJicAorCW1vdgktOCglcmF4KSwlcmJ4CisJbW92CSVyMTUsMjQwKCRjb250ZXh0KQorCW1vdgklcjE0LDIzMigkY29udGV4dCkKKwltb3YJJXIxMywyMjQoJGNvbnRleHQpCisJbW92CSVyMTIsMjE2KCRjb250ZXh0KQorCW1vdgklcmJwLDE2MCgkY29udGV4dCkKKwltb3YJJXJieCwxNDQoJGNvbnRleHQpCisKKwlsZWEJLTB4ZDgoJXJheCksJXJzaQkjICV4bW0gc2F2ZSBhcmVhCisJbGVhCTUxMigkY29udGV4dCksJXJkaQkjICYgY29udGV4dC5YbW02CisJbW92CVwkMjAsJWVjeAkJIyAxMCpzaXplb2YoJXhtbTApL3NpemVvZiglcmF4KQorCS5sb25nCTB4YTU0OGYzZmMJCSMgY2xkOyByZXAgbW92c3EKKworLkxjb21tb25fc2VoX3RhaWw6CisJbW92CTgoJXJheCksJXJkaQorCW1vdgkxNiglcmF4KSwlcnNpCisJbW92CSVyYXgsMTUyKCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UnNwCisJbW92CSVyc2ksMTY4KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UnNpCisJbW92CSVyZGksMTc2KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UmRpCisKKwltb3YJNDAoJGRpc3ApLCVyZGkJCSMgZGlzcC0+Q29udGV4dFJlY29yZAorCW1vdgkkY29udGV4dCwlcnNpCQkjIGNvbnRleHQKKwltb3YJXCQxNTQsJWVjeAkJIyBzaXplb2YoQ09OVEVYVCkKKwkubG9uZwkweGE1NDhmM2ZjCQkjIGNsZDsgcmVwIG1vdnNxCisKKwltb3YJJGRpc3AsJXJzaQorCXhvcgklcmN4LCVyY3gJCSMgYXJnMSwgVU5XX0ZMQUdfTkhBTkRMRVIKKwltb3YJOCglcnNpKSwlcmR4CQkjIGFyZzIsIGRpc3AtPkltYWdlQmFzZQorCW1vdgkwKCVyc2kpLCVyOAkJIyBhcmczLCBkaXNwLT5Db250cm9sUGMKKwltb3YJMTYoJXJzaSksJXI5CQkjIGFyZzQsIGRpc3AtPkZ1bmN0aW9uRW50cnkKKwltb3YJNDAoJXJzaSksJXIxMAkJIyBkaXNwLT5Db250ZXh0UmVjb3JkCisJbGVhCTU2KCVyc2kpLCVyMTEJCSMgJmRpc3AtPkhhbmRsZXJEYXRhCisJbGVhCTI0KCVyc2kpLCVyMTIJCSMgJmRpc3AtPkVzdGFibGlzaGVyRnJhbWUKKwltb3YJJXIxMCwzMiglcnNwKQkJIyBhcmc1CisJbW92CSVyMTEsNDAoJXJzcCkJCSMgYXJnNgorCW1vdgklcjEyLDQ4KCVyc3ApCQkjIGFyZzcKKwltb3YJJXJjeCw1NiglcnNwKQkJIyBhcmc4LCAoTlVMTCkKKwljYWxsCSpfX2ltcF9SdGxWaXJ0dWFsVW53aW5kKCVyaXApCisKKwltb3YJXCQxLCVlYXgJCSMgRXhjZXB0aW9uQ29udGludWVTZWFyY2gKKwlhZGQJXCQ2NCwlcnNwCisJcG9wZnEKKwlwb3AJJXIxNQorCXBvcAklcjE0CisJcG9wCSVyMTMKKwlwb3AJJXIxMgorCXBvcAklcmJwCisJcG9wCSVyYngKKwlwb3AJJXJkaQorCXBvcAklcnNpCisJcmV0Cisuc2l6ZQlnY21fc2VfaGFuZGxlciwuLWdjbV9zZV9oYW5kbGVyCisKKy5zZWN0aW9uCS5wZGF0YQorLmFsaWduCTQKKwkucnZhCS5MU0VIX2JlZ2luX2Flc25pX2djbV9kZWNyeXB0CisJLnJ2YQkuTFNFSF9lbmRfYWVzbmlfZ2NtX2RlY3J5cHQKKwkucnZhCS5MU0VIX2djbV9kZWNfaW5mbworCisJLnJ2YQkuTFNFSF9iZWdpbl9hZXNuaV9nY21fZW5jcnlwdAorCS5ydmEJLkxTRUhfZW5kX2Flc25pX2djbV9lbmNyeXB0CisJLnJ2YQkuTFNFSF9nY21fZW5jX2luZm8KKy5zZWN0aW9uCS54ZGF0YQorLmFsaWduCTgKKy5MU0VIX2djbV9kZWNfaW5mbzoKKwkuYnl0ZQk5LDAsMCwwCisJLnJ2YQlnY21fc2VfaGFuZGxlcgorCS5ydmEJLkxnY21fZGVjX2JvZHksLkxnY21fZGVjX2Fib3J0CisuTFNFSF9nY21fZW5jX2luZm86CisJLmJ5dGUJOSwwLDAsMAorCS5ydmEJZ2NtX3NlX2hhbmRsZXIKKwkucnZhCS5MZ2NtX2VuY19ib2R5LC5MZ2NtX2VuY19hYm9ydAorX19fCit9Cit9fX0gZWxzZSB7e3sKKyRjb2RlPTw8X19fOwkjIGFzc2VtYmxlciBpcyB0b28gb2xkCisudGV4dAorCisuZ2xvYmwJYWVzbmlfZ2NtX2VuY3J5cHQKKy50eXBlCWFlc25pX2djbV9lbmNyeXB0LFxAYWJpLW9tbmlwb3RlbnQKK2Flc25pX2djbV9lbmNyeXB0OgorCXhvcgklZWF4LCVlYXgKKwlyZXQKKy5zaXplCWFlc25pX2djbV9lbmNyeXB0LC4tYWVzbmlfZ2NtX2VuY3J5cHQKKworLmdsb2JsCWFlc25pX2djbV9kZWNyeXB0CisudHlwZQlhZXNuaV9nY21fZGVjcnlwdCxcQGFiaS1vbW5pcG90ZW50CithZXNuaV9nY21fZGVjcnlwdDoKKwl4b3IJJWVheCwlZWF4CisJcmV0Cisuc2l6ZQlhZXNuaV9nY21fZGVjcnlwdCwuLWFlc25pX2djbV9kZWNyeXB0CitfX18KK319fQorCiskY29kZSA9fiBzL1xgKFteXGBdKilcYC9ldmFsKCQxKS9nZW07CisKK3ByaW50ICRjb2RlOworCitjbG9zZSBTVERPVVQ7CmRpZmYgLS1naXQgYS9jcnlwdG8vbW9kZXMvYXNtL2doYXNoLWFybXY0LnBsIGIvY3J5cHRvL21vZGVzL2FzbS9naGFzaC1hcm12NC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTRhNTJmCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL21vZGVzL2FzbS9naGFzaC1hcm12NC5wbApAQCAtMCwwICsxLDQzMiBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorIworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQG9wZW5zc2wub3JnPiBmb3IgdGhlIE9wZW5TU0wKKyMgcHJvamVjdC4gVGhlIG1vZHVsZSBpcywgaG93ZXZlciwgZHVhbCBsaWNlbnNlZCB1bmRlciBPcGVuU1NMIGFuZAorIyBDUllQVE9HQU1TIGxpY2Vuc2VzIGRlcGVuZGluZyBvbiB3aGVyZSB5b3Ugb2J0YWluIGl0LiBGb3IgZnVydGhlcgorIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgQXByaWwgMjAxMAorIworIyBUaGUgbW9kdWxlIGltcGxlbWVudHMgIjQtYml0IiBHQ00gR0hBU0ggZnVuY3Rpb24gYW5kIHVuZGVybHlpbmcKKyMgc2luZ2xlIG11bHRpcGxpY2F0aW9uIG9wZXJhdGlvbiBpbiBHRigyXjEyOCkuICI0LWJpdCIgbWVhbnMgdGhhdCBpdAorIyB1c2VzIDI1NiBieXRlcyBwZXIta2V5IHRhYmxlIFsrMzIgYnl0ZXMgc2hhcmVkIHRhYmxlXS4gVGhlcmUgaXMgbm8KKyMgZXhwZXJpbWVudGFsIHBlcmZvcm1hbmNlIGRhdGEgYXZhaWxhYmxlIHlldC4gVGhlIG9ubHkgYXBwcm94aW1hdGlvbgorIyB0aGF0IGNhbiBiZSBtYWRlIGF0IHRoaXMgcG9pbnQgaXMgYmFzZWQgb24gY29kZSBzaXplLiBJbm5lciBsb29wIGlzCisjIDMyIGluc3RydWN0aW9ucyBsb25nIGFuZCBvbiBzaW5nbGUtaXNzdWUgY29yZSBzaG91bGQgZXhlY3V0ZSBpbiA8NDAKKyMgY3ljbGVzLiBIYXZpbmcgdmVyaWZpZWQgdGhhdCBnY2MgMy40IGRpZG4ndCB1bnJvbGwgY29ycmVzcG9uZGluZworIyBsb29wLCB0aGlzIGFzc2VtYmxlciBsb29wIGJvZHkgd2FzIGZvdW5kIHRvIGJlIH4zeCBzbWFsbGVyIHRoYW4KKyMgY29tcGlsZXItZ2VuZXJhdGVkIG9uZS4uLgorIworIyBKdWx5IDIwMTAKKyMKKyMgUmVzY2hlZHVsaW5nIGZvciBkdWFsLWlzc3VlIHBpcGVsaW5lIHJlc3VsdGVkIGluIDguNSUgaW1wcm92ZW1lbnQgb24KKyMgQ29ydGV4IEE4IGNvcmUgYW5kIH4yNSBjeWNsZXMgcGVyIHByb2Nlc3NlZCBieXRlICh3aGljaCB3YXMgb2JzZXJ2ZWQKKyMgdG8gYmUgfjMgdGltZXMgZmFzdGVyIHRoYW4gZ2NjLWdlbmVyYXRlZCBjb2RlOi0pCisjCisjIEZlYnJ1YXJ5IDIwMTEKKyMKKyMgUHJvZmlsZXItYXNzaXN0ZWQgYW5kIHBsYXRmb3JtLXNwZWNpZmljIG9wdGltaXphdGlvbiByZXN1bHRlZCBpbiA3JQorIyBpbXByb3ZlbWVudCBvbiBDb3J0ZXggQTggY29yZSBhbmQgfjIzLjUgY3ljbGVzIHBlciBieXRlLgorIworIyBNYXJjaCAyMDExCisjCisjIEFkZCBORU9OIGltcGxlbWVudGF0aW9uIGZlYXR1cmluZyBwb2x5bm9taWFsIG11bHRpcGxpY2F0aW9uLCBpLmUuIG5vCisjIGxvb2t1cCB0YWJsZXMgaW52b2x2ZWQuIE9uIENvcnRleCBBOCBpdCB3YXMgbWVhc3VyZWQgdG8gcHJvY2VzcyBvbmUKKyMgYnl0ZSBpbiAxNSBjeWNsZXMgb3IgNTUlIGZhc3RlciB0aGFuIGludGVnZXItb25seSBjb2RlLgorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIE5vdGUgYWJvdXQgIjUyOEIiIHZhcmlhbnQuIEluIEFSTSBjYXNlIGl0IG1ha2VzIGxlc3NlciBzZW5zZSB0bworIyBpbXBsZW1lbnQgaXQgZm9yIGZvbGxvd2luZyByZWFzb25zOgorIworIyAtIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IHdvbid0IGJlIGFueXdoZXJlIG5lYXIgNTAlLCBiZWNhdXNlIDEyOC0KKyMgICBiaXQgc2hpZnQgb3BlcmF0aW9uIGlzIG5lYXRseSBmdXNlZCB3aXRoIDEyOC1iaXQgeG9yIGhlcmUsIGFuZAorIyAgICI1MzhCIiB2YXJpYW50IHdvdWxkIGVsaW1pbmF0ZSBvbmx5IDQtNSBpbnN0cnVjdGlvbnMgb3V0IG9mIDMyCisjICAgaW4gdGhlIGlubmVyIGxvb3AgKG1lYW5pbmcgdGhhdCBlc3RpbWF0ZWQgaW1wcm92ZW1lbnQgaXMgfjE1JSk7CisjIC0gQVJNLWJhc2VkIHN5c3RlbXMgYXJlIG9mdGVuIGVtYmVkZGVkIG9uZXMgYW5kIGV4dHJhIG1lbW9yeQorIyAgIGNvbnN1bXB0aW9uIG1pZ2h0IGJlIHVuYXBwcmVjaWF0ZWQgKGZvciBzbyBsaXR0bGUgaW1wcm92ZW1lbnQpOworIworIyBCeXRlIG9yZGVyIFtpbl1kZXBlbmRlbmNlLiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBDYWxsZXIgaXMgZXhwZWN0ZWQgdG8gbWFpbnRhaW4gc3BlY2lmaWMgKmR3b3JkKiBvcmRlciBpbiBIdGFibGUsCisjIG5hbWVseSB3aXRoICpsZWFzdCogc2lnbmlmaWNhbnQgZHdvcmQgb2YgMTI4LWJpdCB2YWx1ZSBhdCAqbG93ZXIqCisjIGFkZHJlc3MuIFRoaXMgZGlmZmVycyBjb21wbGV0ZWx5IGZyb20gQyBjb2RlIGFuZCBoYXMgZXZlcnl0aGluZyB0bworIyBkbyB3aXRoIGxkbSBpbnN0cnVjdGlvbiBhbmQgb3JkZXIgaW4gd2hpY2ggZHdvcmRzIGFyZSAiY29uc3VtZWQiIGJ5CisjIGFsZ29yaXRobS4gKkJ5dGUqIG9yZGVyIHdpdGhpbiB0aGVzZSBkd29yZHMgaW4gdHVybiBpcyB3aGF0ZXZlcgorIyAqbmF0aXZlKiBieXRlIG9yZGVyIG9uIGN1cnJlbnQgcGxhdGZvcm0uIFNlZSBnY20xMjguYyBmb3Igd29ya2luZworIyBleGFtcGxlLi4uCisKK3doaWxlICgoJG91dHB1dD1zaGlmdCkgJiYgKCRvdXRwdXQhfi9eXHdbXHdcLV0qXC5cdyskLykpIHt9CitvcGVuIFNURE9VVCwiPiRvdXRwdXQiOworCiskWGk9InIwIjsJIyBhcmd1bWVudCBibG9jaworJEh0Ymw9InIxIjsKKyRpbnA9InIyIjsKKyRsZW49InIzIjsKKworJFpsbD0icjQiOwkjIHZhcmlhYmxlcworJFpsaD0icjUiOworJFpobD0icjYiOworJFpoaD0icjciOworJFRsbD0icjgiOworJFRsaD0icjkiOworJFRobD0icjEwIjsKKyRUaGg9InIxMSI7CiskbmxvPSJyMTIiOworIyMjIyMjIyMjIyMjIyMjIyMgcjEzIGlzIHN0YWNrIHBvaW50ZXIKKyRuaGk9InIxNCI7CisjIyMjIyMjIyMjIyMjIyMjIyByMTUgaXMgcHJvZ3JhbSBjb3VudGVyCisKKyRyZW1fNGJpdD0kaW5wOwkjIHVzZWQgaW4gZ2NtX2dtdWx0XzRiaXQKKyRjbnQ9JGxlbjsKKworc3ViIFpzbWFzaCgpIHsKKyAgbXkgJGk9MTI7CisgIG15IEBhcmdzPUBfOworICBmb3IgKCRabGwsJFpsaCwkWmhsLCRaaGgpIHsKKyAgICAkY29kZS49PDxfX187CisjaWYgX19BUk1fQVJDSF9fPj03ICYmIGRlZmluZWQoX19BUk1FTF9fKQorCXJldgkkXywkXworCXN0cgkkXyxbJFhpLCMkaV0KKyNlbGlmIGRlZmluZWQoX19BUk1FQl9fKQorCXN0cgkkXyxbJFhpLCMkaV0KKyNlbHNlCisJbW92CSRUbGgsJF8sbHNyIzgKKwlzdHJiCSRfLFskWGksIyRpKzNdCisJbW92CSRUaGwsJF8sbHNyIzE2CisJc3RyYgkkVGxoLFskWGksIyRpKzJdCisJbW92CSRUaGgsJF8sbHNyIzI0CisJc3RyYgkkVGhsLFskWGksIyRpKzFdCisJc3RyYgkkVGhoLFskWGksIyRpXQorI2VuZGlmCitfX18KKyAgICAkY29kZS49Ilx0Ii5zaGlmdChAYXJncykuIlxuIjsKKyAgICAkaS09NDsKKyAgfQorfQorCiskY29kZT08PF9fXzsKKyNpZiBkZWZpbmVkKF9fYXJtX18pCisjaW5jbHVkZSAiYXJtX2FyY2guaCIKKworLnRleHQKKy5jb2RlCTMyCisKKy50eXBlCXJlbV80Yml0LCVvYmplY3QKKy5hbGlnbgk1CityZW1fNGJpdDoKKy5zaG9ydAkweDAwMDAsMHgxQzIwLDB4Mzg0MCwweDI0NjAKKy5zaG9ydAkweDcwODAsMHg2Q0EwLDB4NDhDMCwweDU0RTAKKy5zaG9ydAkweEUxMDAsMHhGRDIwLDB4RDk0MCwweEM1NjAKKy5zaG9ydAkweDkxODAsMHg4REEwLDB4QTlDMCwweEI1RTAKKy5zaXplCXJlbV80Yml0LC4tcmVtXzRiaXQKKworLnR5cGUJcmVtXzRiaXRfZ2V0LCVmdW5jdGlvbgorcmVtXzRiaXRfZ2V0OgorCXN1YgkkcmVtXzRiaXQscGMsIzgKKwlzdWIJJHJlbV80Yml0LCRyZW1fNGJpdCwjMzIJQCAmcmVtXzRiaXQKKwliCS5McmVtXzRiaXRfZ290CisJbm9wCisuc2l6ZQlyZW1fNGJpdF9nZXQsLi1yZW1fNGJpdF9nZXQKKworLmdsb2JhbAlnY21fZ2hhc2hfNGJpdAorLnR5cGUJZ2NtX2doYXNoXzRiaXQsJWZ1bmN0aW9uCitnY21fZ2hhc2hfNGJpdDoKKwlzdWIJcjEyLHBjLCM4CisJYWRkCSRsZW4sJGlucCwkbGVuCQlAICRsZW4gdG8gcG9pbnQgYXQgdGhlIGVuZAorCXN0bWRiCXNwISx7cjMtcjExLGxyfQkJQCBzYXZlICRsZW4vZW5kIHRvbworCXN1YglyMTIscjEyLCM0OAkJQCAmcmVtXzRiaXQKKworCWxkbWlhCXIxMix7cjQtcjExfQkJQCBjb3B5IHJlbV80Yml0IC4uLgorCXN0bWRiCXNwISx7cjQtcjExfQkJQCAuLi4gdG8gc3RhY2sKKworCWxkcmIJJG5sbyxbJGlucCwjMTVdCisJbGRyYgkkbmhpLFskWGksIzE1XQorLkxvdXRlcjoKKwllb3IJJG5sbywkbmxvLCRuaGkKKwlhbmQJJG5oaSwkbmxvLCMweGYwCisJYW5kCSRubG8sJG5sbywjMHgwZgorCW1vdgkkY250LCMxNAorCisJYWRkCSRaaGgsJEh0YmwsJG5sbyxsc2wjNAorCWxkbWlhCSRaaGgseyRabGwtJFpoaH0JQCBsb2FkIEh0YmxbbmxvXQorCWFkZAkkVGhoLCRIdGJsLCRuaGkKKwlsZHJiCSRubG8sWyRpbnAsIzE0XQorCisJYW5kCSRuaGksJFpsbCwjMHhmCQlAIHJlbQorCWxkbWlhCSRUaGgseyRUbGwtJFRoaH0JQCBsb2FkIEh0YmxbbmhpXQorCWFkZAkkbmhpLCRuaGksJG5oaQorCWVvcgkkWmxsLCRUbGwsJFpsbCxsc3IjNAorCWxkcmgJJFRsbCxbc3AsJG5oaV0JCUAgcmVtXzRiaXRbcmVtXQorCWVvcgkkWmxsLCRabGwsJFpsaCxsc2wjMjgKKwlsZHJiCSRuaGksWyRYaSwjMTRdCisJZW9yCSRabGgsJFRsaCwkWmxoLGxzciM0CisJZW9yCSRabGgsJFpsaCwkWmhsLGxzbCMyOAorCWVvcgkkWmhsLCRUaGwsJFpobCxsc3IjNAorCWVvcgkkWmhsLCRaaGwsJFpoaCxsc2wjMjgKKwllb3IJJFpoaCwkVGhoLCRaaGgsbHNyIzQKKwllb3IJJG5sbywkbmxvLCRuaGkKKwlhbmQJJG5oaSwkbmxvLCMweGYwCisJYW5kCSRubG8sJG5sbywjMHgwZgorCWVvcgkkWmhoLCRaaGgsJFRsbCxsc2wjMTYKKworLkxpbm5lcjoKKwlhZGQJJFRoaCwkSHRibCwkbmxvLGxzbCM0CisJYW5kCSRubG8sJFpsbCwjMHhmCQlAIHJlbQorCXN1YnMJJGNudCwkY250LCMxCisJYWRkCSRubG8sJG5sbywkbmxvCisJbGRtaWEJJFRoaCx7JFRsbC0kVGhofQlAIGxvYWQgSHRibFtubG9dCisJZW9yCSRabGwsJFRsbCwkWmxsLGxzciM0CisJZW9yCSRabGwsJFpsbCwkWmxoLGxzbCMyOAorCWVvcgkkWmxoLCRUbGgsJFpsaCxsc3IjNAorCWVvcgkkWmxoLCRabGgsJFpobCxsc2wjMjgKKwlsZHJoCSRUbGwsW3NwLCRubG9dCQlAIHJlbV80Yml0W3JlbV0KKwllb3IJJFpobCwkVGhsLCRaaGwsbHNyIzQKKwlsZHJwbGIJJG5sbyxbJGlucCwkY250XQorCWVvcgkkWmhsLCRaaGwsJFpoaCxsc2wjMjgKKwllb3IJJFpoaCwkVGhoLCRaaGgsbHNyIzQKKworCWFkZAkkVGhoLCRIdGJsLCRuaGkKKwlhbmQJJG5oaSwkWmxsLCMweGYJCUAgcmVtCisJZW9yCSRaaGgsJFpoaCwkVGxsLGxzbCMxNglAIF49IHJlbV80Yml0W3JlbV0KKwlhZGQJJG5oaSwkbmhpLCRuaGkKKwlsZG1pYQkkVGhoLHskVGxsLSRUaGh9CUAgbG9hZCBIdGJsW25oaV0KKwllb3IJJFpsbCwkVGxsLCRabGwsbHNyIzQKKwlsZHJwbGIJJFRsbCxbJFhpLCRjbnRdCisJZW9yCSRabGwsJFpsbCwkWmxoLGxzbCMyOAorCWVvcgkkWmxoLCRUbGgsJFpsaCxsc3IjNAorCWxkcmgJJFRsaCxbc3AsJG5oaV0KKwllb3IJJFpsaCwkWmxoLCRaaGwsbHNsIzI4CisJZW9yCSRaaGwsJFRobCwkWmhsLGxzciM0CisJZW9yCSRaaGwsJFpobCwkWmhoLGxzbCMyOAorCWVvcnBsCSRubG8sJG5sbywkVGxsCisJZW9yCSRaaGgsJFRoaCwkWmhoLGxzciM0CisJYW5kcGwJJG5oaSwkbmxvLCMweGYwCisJYW5kcGwJJG5sbywkbmxvLCMweDBmCisJZW9yCSRaaGgsJFpoaCwkVGxoLGxzbCMxNglAIF49IHJlbV80Yml0W3JlbV0KKwlicGwJLkxpbm5lcgorCisJbGRyCSRsZW4sW3NwLCMzMl0JCUAgcmUtbG9hZCAkbGVuL2VuZAorCWFkZAkkaW5wLCRpbnAsIzE2CisJbW92CSRuaGksJFpsbAorX19fCisJJlpzbWFzaCgiY21wXHQkaW5wLCRsZW4iLCJsZHJuZWJcdCRubG8sWyRpbnAsIzE1XSIpOworJGNvZGUuPTw8X19fOworCWJuZQkuTG91dGVyCisKKwlhZGQJc3Asc3AsIzM2CisjaWYgX19BUk1fQVJDSF9fPj01CisJbGRtaWEJc3AhLHtyNC1yMTEscGN9CisjZWxzZQorCWxkbWlhCXNwISx7cjQtcjExLGxyfQorCXRzdAlsciwjMQorCW1vdmVxCXBjLGxyCQkJQCBiZSBiaW5hcnkgY29tcGF0aWJsZSB3aXRoIFY0LCB5ZXQKKwlieAlscgkJCUAgaW50ZXJvcGVyYWJsZSB3aXRoIFRodW1iIElTQTotKQorI2VuZGlmCisuc2l6ZQlnY21fZ2hhc2hfNGJpdCwuLWdjbV9naGFzaF80Yml0CisKKy5nbG9iYWwJZ2NtX2dtdWx0XzRiaXQKKy50eXBlCWdjbV9nbXVsdF80Yml0LCVmdW5jdGlvbgorZ2NtX2dtdWx0XzRiaXQ6CisJc3RtZGIJc3AhLHtyNC1yMTEsbHJ9CisJbGRyYgkkbmxvLFskWGksIzE1XQorCWIJcmVtXzRiaXRfZ2V0CisuTHJlbV80Yml0X2dvdDoKKwlhbmQJJG5oaSwkbmxvLCMweGYwCisJYW5kCSRubG8sJG5sbywjMHgwZgorCW1vdgkkY250LCMxNAorCisJYWRkCSRaaGgsJEh0YmwsJG5sbyxsc2wjNAorCWxkbWlhCSRaaGgseyRabGwtJFpoaH0JQCBsb2FkIEh0YmxbbmxvXQorCWxkcmIJJG5sbyxbJFhpLCMxNF0KKworCWFkZAkkVGhoLCRIdGJsLCRuaGkKKwlhbmQJJG5oaSwkWmxsLCMweGYJCUAgcmVtCisJbGRtaWEJJFRoaCx7JFRsbC0kVGhofQlAIGxvYWQgSHRibFtuaGldCisJYWRkCSRuaGksJG5oaSwkbmhpCisJZW9yCSRabGwsJFRsbCwkWmxsLGxzciM0CisJbGRyaAkkVGxsLFskcmVtXzRiaXQsJG5oaV0JQCByZW1fNGJpdFtyZW1dCisJZW9yCSRabGwsJFpsbCwkWmxoLGxzbCMyOAorCWVvcgkkWmxoLCRUbGgsJFpsaCxsc3IjNAorCWVvcgkkWmxoLCRabGgsJFpobCxsc2wjMjgKKwllb3IJJFpobCwkVGhsLCRaaGwsbHNyIzQKKwllb3IJJFpobCwkWmhsLCRaaGgsbHNsIzI4CisJZW9yCSRaaGgsJFRoaCwkWmhoLGxzciM0CisJYW5kCSRuaGksJG5sbywjMHhmMAorCWVvcgkkWmhoLCRaaGgsJFRsbCxsc2wjMTYKKwlhbmQJJG5sbywkbmxvLCMweDBmCisKKy5Mb29wOgorCWFkZAkkVGhoLCRIdGJsLCRubG8sbHNsIzQKKwlhbmQJJG5sbywkWmxsLCMweGYJCUAgcmVtCisJc3VicwkkY250LCRjbnQsIzEKKwlhZGQJJG5sbywkbmxvLCRubG8KKwlsZG1pYQkkVGhoLHskVGxsLSRUaGh9CUAgbG9hZCBIdGJsW25sb10KKwllb3IJJFpsbCwkVGxsLCRabGwsbHNyIzQKKwllb3IJJFpsbCwkWmxsLCRabGgsbHNsIzI4CisJZW9yCSRabGgsJFRsaCwkWmxoLGxzciM0CisJZW9yCSRabGgsJFpsaCwkWmhsLGxzbCMyOAorCWxkcmgJJFRsbCxbJHJlbV80Yml0LCRubG9dCUAgcmVtXzRiaXRbcmVtXQorCWVvcgkkWmhsLCRUaGwsJFpobCxsc3IjNAorCWxkcnBsYgkkbmxvLFskWGksJGNudF0KKwllb3IJJFpobCwkWmhsLCRaaGgsbHNsIzI4CisJZW9yCSRaaGgsJFRoaCwkWmhoLGxzciM0CisKKwlhZGQJJFRoaCwkSHRibCwkbmhpCisJYW5kCSRuaGksJFpsbCwjMHhmCQlAIHJlbQorCWVvcgkkWmhoLCRaaGgsJFRsbCxsc2wjMTYJQCBePSByZW1fNGJpdFtyZW1dCisJYWRkCSRuaGksJG5oaSwkbmhpCisJbGRtaWEJJFRoaCx7JFRsbC0kVGhofQlAIGxvYWQgSHRibFtuaGldCisJZW9yCSRabGwsJFRsbCwkWmxsLGxzciM0CisJZW9yCSRabGwsJFpsbCwkWmxoLGxzbCMyOAorCWVvcgkkWmxoLCRUbGgsJFpsaCxsc3IjNAorCWxkcmgJJFRsbCxbJHJlbV80Yml0LCRuaGldCUAgcmVtXzRiaXRbcmVtXQorCWVvcgkkWmxoLCRabGgsJFpobCxsc2wjMjgKKwllb3IJJFpobCwkVGhsLCRaaGwsbHNyIzQKKwllb3IJJFpobCwkWmhsLCRaaGgsbHNsIzI4CisJZW9yCSRaaGgsJFRoaCwkWmhoLGxzciM0CisJYW5kcGwJJG5oaSwkbmxvLCMweGYwCisJYW5kcGwJJG5sbywkbmxvLCMweDBmCisJZW9yCSRaaGgsJFpoaCwkVGxsLGxzbCMxNglAIF49IHJlbV80Yml0W3JlbV0KKwlicGwJLkxvb3AKK19fXworCSZac21hc2goKTsKKyRjb2RlLj08PF9fXzsKKyNpZiBfX0FSTV9BUkNIX18+PTUKKwlsZG1pYQlzcCEse3I0LXIxMSxwY30KKyNlbHNlCisJbGRtaWEJc3AhLHtyNC1yMTEsbHJ9CisJdHN0CWxyLCMxCisJbW92ZXEJcGMsbHIJCQlAIGJlIGJpbmFyeSBjb21wYXRpYmxlIHdpdGggVjQsIHlldAorCWJ4CWxyCQkJQCBpbnRlcm9wZXJhYmxlIHdpdGggVGh1bWIgSVNBOi0pCisjZW5kaWYKKy5zaXplCWdjbV9nbXVsdF80Yml0LC4tZ2NtX2dtdWx0XzRiaXQKK19fXworeworbXkgJGNudD0kSHRibDsJIyAkSHRibCBpcyB1c2VkIG9uY2UgaW4gdGhlIHZlcnkgYmVnaW5uaW5nCisKK215ICgkSGhpLCAkSGxvLCAkWm8sICRULCAkeGksICRtb2QpID0gbWFwKCJkJF8iLCgwLi43KSk7CitteSAoJFFoaSwgJFFsbywgJFosICAkUiwgJHplcm8sICRRcG9zdCwgJElOKSA9IG1hcCgicSRfIiwoOC4uMTUpKTsKKworIyBaOlpvIGtlZXBzIDEyOC1iaXQgcmVzdWx0IHNoaWZ0ZWQgYnkgMSB0byB0aGUgcmlnaHQsIHdpdGggYm90dG9tIGJpdAorIyBpbiBaby4gT3Igc2hvdWxkIEkgc2F5ICJ0b3AgYml0IiwgYmVjYXVzZSBHSEFTSCBpcyBzcGVjaWZpZWQgaW4KKyMgcmV2ZXJzZSBiaXQgb3JkZXI/IE90aGVyd2lzZSBzdHJhaWdodGZvcndhcmQgMTI4LWJ0IEggYnkgb25lIGlucHV0CisjIGJ5dGUgbXVsdGlwbGljYXRpb24gYW5kIG1vZHVsby1yZWR1Y3Rpb24sIHRpbWVzIDE2LgorCitzdWIgRGxvKCkgICB7IHNoaWZ0PX5tfHEoWzFdP1swLTldKXw/ImQiLigkMSoyKToiIjsgICAgIH0KK3N1YiBEaGkoKSAgIHsgc2hpZnQ9fm18cShbMV0/WzAtOV0pfD8iZCIuKCQxKjIrMSk6IiI7ICAgfQorc3ViIFEoKSAgICAgeyBzaGlmdD1+bXxkKFsxLTNdP1swMjQ2OF0pfD8icSIuKCQxLzIpOiIiOyB9CisKKyRjb2RlLj08PF9fXzsKKyNpZiBfX0FSTV9BUkNIX18+PTcKKy5mcHUJbmVvbgorCisuZ2xvYmFsCWdjbV9nbXVsdF9uZW9uCisudHlwZQlnY21fZ211bHRfbmVvbiwlZnVuY3Rpb24KKy5hbGlnbgk0CitnY21fZ211bHRfbmVvbjoKKwlzdWIJCSRIdGJsLCMxNgkJQCBwb2ludCBhdCBIIGluIEdDTTEyOF9DVFgKKwl2bGQxLjY0CQlgJkRoaSgiJElOIilgLFskWGksOjY0XSFAIGxvYWQgWGkKKwl2bW92LmkzMgkkbW9kLCMweGUxCQlAIG91ciBpcnJlZHVjaWJsZSBwb2x5bm9taWFsCisJdmxkMS42NAkJYCZEbG8oIiRJTiIpYCxbJFhpLDo2NF0hCisJdnNoci51NjQJJG1vZCwjMzIKKwl2bGRtaWEJCSRIdGJsLHskSGhpLSRIbG99CUAgbG9hZCBICisJdmVvcgkJJHplcm8sJHplcm8KKyNpZmRlZiBfX0FSTUVMX18KKwl2cmV2NjQuOAkkSU4sJElOCisjZW5kaWYKKwl2ZW9yCQkkUXBvc3QsJFFwb3N0CisJdmVvcgkJJFIsJFIKKwltb3YJCSRjbnQsIzE2CisJdmVvcgkJJFosJFoKKwltb3YJCSRsZW4sIzE2CisJdmVvcgkJJFpvLCRabworCXZkdXAuOAkJJHhpLGAmRGxvKCIkSU4iKWBbMF0JQCBicm9hZGNhc3QgbG93ZXN0IGJ5dGUKKwliCQkuTGlubmVyX25lb24KKy5zaXplCWdjbV9nbXVsdF9uZW9uLC4tZ2NtX2dtdWx0X25lb24KKworLmdsb2JhbAlnY21fZ2hhc2hfbmVvbgorLnR5cGUJZ2NtX2doYXNoX25lb24sJWZ1bmN0aW9uCisuYWxpZ24JNAorZ2NtX2doYXNoX25lb246CisJdmxkMS42NAkJYCZEaGkoIiRaIilgLFskWGksOjY0XSEJQCBsb2FkIFhpCisJdm1vdi5pMzIJJG1vZCwjMHhlMQkJQCBvdXIgaXJyZWR1Y2libGUgcG9seW5vbWlhbAorCXZsZDEuNjQJCWAmRGxvKCIkWiIpYCxbJFhpLDo2NF0hCisJdnNoci51NjQJJG1vZCwjMzIKKwl2bGRtaWEJCSRYaSx7JEhoaS0kSGxvfQkJQCBsb2FkIEgKKwl2ZW9yCQkkemVybywkemVybworCW5vcAorI2lmZGVmIF9fQVJNRUxfXworCXZyZXY2NC44CSRaLCRaCisjZW5kaWYKKy5Mb3V0ZXJfbmVvbjoKKwl2bGQxLjY0CQlgJkRoaSgkSU4pYCxbJGlucF0hCUAgbG9hZCBpbnAKKwl2ZW9yCQkkUXBvc3QsJFFwb3N0CisJdmxkMS42NAkJYCZEbG8oJElOKWAsWyRpbnBdIQorCXZlb3IJCSRSLCRSCisJbW92CQkkY250LCMxNgorI2lmZGVmIF9fQVJNRUxfXworCXZyZXY2NC44CSRJTiwkSU4KKyNlbmRpZgorCXZlb3IJCSRabywkWm8KKwl2ZW9yCQkkSU4sJFoJCQlAIGlucF49WGkKKwl2ZW9yCQkkWiwkWgorCXZkdXAuOAkJJHhpLGAmRGxvKCIkSU4iKWBbMF0JQCBicm9hZGNhc3QgbG93ZXN0IGJ5dGUKKy5MaW5uZXJfbmVvbjoKKwlzdWJzCQkkY250LCRjbnQsIzEKKwl2bXVsbC5wOAkkUWxvLCRIbG8sJHhpCQlAIEgubG+3WGlbaV0KKwl2bXVsbC5wOAkkUWhpLCRIaGksJHhpCQlAIEguaGm3WGlbaV0KKwl2ZXh0LjgJCSRJTiwkemVybywjMQkJQCBJTj4+PTgKKworCXZlb3IJCSRaLCRRcG9zdAkJQCBtb2R1bG8tc2NoZWR1bGVkIHBhcnQKKwl2c2hsLmk2NAlgJkRsbygiJFIiKWAsIzQ4CisJdmR1cC44CQkkeGksYCZEbG8oIiRJTiIpYFswXQlAIGJyb2FkY2FzdCBsb3dlc3QgYnl0ZQorCXZlb3IJCSRULGAmRGxvKCIkUWxvIilgLGAmRGxvKCIkWiIpYAorCisJdmVvcgkJYCZEaGkoIiRaIilgLGAmRGxvKCIkUiIpYAorCXZ1enAuOAkJJFFsbywkUWhpCisJdnNsaS44CQkkWm8sJFQsIzEJCUAgY29tcG9zZSB0aGUgImNhcnJ5IiBieXRlCisJdmV4dC44CQkkWiwkemVybywjMQkJQCBaPj49OAorCisJdm11bGwucDgJJFIsJFpvLCRtb2QJCUAgImNhcnJ5IrcweGUxCisJdnNoci51OAkJJFpvLCRULCM3CQlAIHNhdmUgWidzIGJvdHRvbSBiaXQKKwl2ZXh0LjgJCSRRcG9zdCwkUWxvLCR6ZXJvLCMxCUAgUWxvPj49OAorCXZlb3IJCSRaLCRRaGkKKwlibmUJCS5MaW5uZXJfbmVvbgorCisJdmVvcgkJJFosJFFwb3N0CQlAIG1vZHVsby1zY2hlZHVsZWQgYXJ0ZWZhY3QKKwl2c2hsLmk2NAlgJkRsbygiJFIiKWAsIzQ4CisJdmVvcgkJYCZEaGkoIiRaIilgLGAmRGxvKCIkUiIpYAorCisJQCBmaW5hbGl6YXRpb24sIG5vcm1hbGl6ZSBaOlpvCisJdmFuZAkJJFpvLCRtb2QJCUAgc3VmZmljZXMgdG8gbWFzayB0aGUgYml0CisJdnNoci51NjQJYCZEaGkoJlEoIiRabyIpKWAsYCZEbG8oIiRaIilgLCM2MworCXZzaGwuaTY0CSRaLCMxCisJc3VicwkJJGxlbiwjMTYKKwl2b3JyCQkkWixgJlEoIiRabyIpYAkJQCBaPVo6Wm88PDEKKwlibmUJCS5Mb3V0ZXJfbmVvbgorCisjaWZkZWYgX19BUk1FTF9fCisJdnJldjY0LjgJJFosJFoKKyNlbmRpZgorCXN1YgkJJFhpLCMxNgkKKwl2c3QxLjY0CQlgJkRoaSgiJFoiKWAsWyRYaSw6NjRdIQlAIHdyaXRlIG91dCBYaQorCXZzdDEuNjQJCWAmRGxvKCIkWiIpYCxbJFhpLDo2NF0KKworCWJ4CWxyCisuc2l6ZQlnY21fZ2hhc2hfbmVvbiwuLWdjbV9naGFzaF9uZW9uCisjZW5kaWYKK19fXworfQorJGNvZGUuPTw8X19fOworLmFzY2l6ICAiR0hBU0ggZm9yIEFSTXY0L05FT04sIENSWVBUT0dBTVMgYnkgPGFwcHJvXEBvcGVuc3NsLm9yZz4iCisuYWxpZ24gIDIKKworI2VuZGlmCitfX18KKworJGNvZGUgPX4gcy9cYChbXlxgXSopXGAvZXZhbCAkMS9nZW07CiskY29kZSA9fiBzL1xiYnhccytsclxiLy53b3JkXHQweGUxMmZmZjFlL2dtOwkjIG1ha2UgaXQgcG9zc2libGUgdG8gY29tcGlsZSB3aXRoIC1tYXJjaD1hcm12NAorcHJpbnQgJGNvZGU7CitjbG9zZSBTVERPVVQ7ICMgZW5mb3JjZSBmbHVzaApkaWZmIC0tZ2l0IGEvY3J5cHRvL21vZGVzL2FzbS9naGFzaC14ODYucGwgYi9jcnlwdG8vbW9kZXMvYXNtL2doYXNoLXg4Ni5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDdlMzI1Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL21vZGVzL2FzbS9naGFzaC14ODYucGwKQEAgLTAsMCArMSwxMzkxIEBACisjIS91c3IvYmluL2VudiBwZXJsCisjCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFdyaXR0ZW4gYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9Ab3BlbnNzbC5vcmc+IGZvciB0aGUgT3BlblNTTAorIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCisjIENSWVBUT0dBTVMgbGljZW5zZXMgZGVwZW5kaW5nIG9uIHdoZXJlIHlvdSBvYnRhaW4gaXQuIEZvciBmdXJ0aGVyCisjIGRldGFpbHMgc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvfmFwcHJvL2NyeXB0b2dhbXMvLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBNYXJjaCwgTWF5LCBKdW5lIDIwMTAKKyMKKyMgVGhlIG1vZHVsZSBpbXBsZW1lbnRzICI0LWJpdCIgR0NNIEdIQVNIIGZ1bmN0aW9uIGFuZCB1bmRlcmx5aW5nCisjIHNpbmdsZSBtdWx0aXBsaWNhdGlvbiBvcGVyYXRpb24gaW4gR0YoMl4xMjgpLiAiNC1iaXQiIG1lYW5zIHRoYXQgaXQKKyMgdXNlcyAyNTYgYnl0ZXMgcGVyLWtleSB0YWJsZSBbKzY0LzEyOCBieXRlcyBmaXhlZCB0YWJsZV0uIEl0IGhhcyB0d28KKyMgY29kZSBwYXRoczogdmFuaWxsYSB4ODYgYW5kIHZhbmlsbGEgU1NFLiBGb3JtZXIgd2lsbCBiZSBleGVjdXRlZCBvbgorIyA0ODYgYW5kIFBlbnRpdW0sIGxhdHRlciBvbiBhbGwgb3RoZXJzLiBTU0UgR0hBU0ggZmVhdHVyZXMgc28gY2FsbGVkCisjICI1MjhCIiB2YXJpYW50IG9mICI0LWJpdCIgbWV0aG9kIHV0aWxpemluZyBhZGRpdGlvbmFsIDI1NisxNiBieXRlcworIyBvZiBwZXIta2V5IHN0b3JhZ2UgWys1MTIgYnl0ZXMgc2hhcmVkIHRhYmxlXS4gUGVyZm9ybWFuY2UgcmVzdWx0cworIyBhcmUgZm9yIHN0cmVhbWVkIEdIQVNIIHN1YnJvdXRpbmUgYW5kIGFyZSBleHByZXNzZWQgaW4gY3ljbGVzIHBlcgorIyBwcm9jZXNzZWQgYnl0ZSwgbGVzcyBpcyBiZXR0ZXI6CisjCisjCQlnY2MgMi45NS4zKCopCVNTRSBhc3NlbWJsZXIJeDg2IGFzc2VtYmxlcgorIworIyBQZW50aXVtCTEwNS8xMTEoKiopCS0JCTUwCisjIFBJSUkJCTY4IC83NQkJMTIuMgkJMjQKKyMgUDQJCTEyNS8xMjUJCTE3LjgJCTg0KCoqKikKKyMgT3B0ZXJvbgk2NiAvNzAJCTEwLjEJCTMwCisjIENvcmUyCQk1NCAvNjcJCTguNAkJMTgKKyMgQXRvbQkJMTA1LzEwNQkJMTYuOAkJNTMKKyMgVklBIE5hbm8JNjkgLzcxCQkxMy4wCQkyNworIworIyAoKikJZ2NjIDMuNC54IHdhcyBvYnNlcnZlZCB0byBnZW5lcmF0ZSBmZXcgcGVyY2VudCBzbG93ZXIgY29kZSwKKyMJd2hpY2ggaXMgb25lIG9mIHJlYXNvbnMgd2h5IDIuOTUuMyByZXN1bHRzIHdlcmUgY2hvc2VuLAorIwlhbm90aGVyIHJlYXNvbiBpcyBsYWNrIG9mIDMuNC54IHJlc3VsdHMgZm9yIG9sZGVyIENQVXM7CisjCWNvbXBhcmlzb24gd2l0aCBTU0UgcmVzdWx0cyBpcyBub3QgY29tcGxldGVseSBmYWlyLCBiZWNhdXNlIEMKKyMJcmVzdWx0cyBhcmUgZm9yIHZhbmlsbGEgIjI1NkIiIGltcGxlbWVudGF0aW9uLCB3aGlsZQorIwlhc3NlbWJsZXIgcmVzdWx0cyBhcmUgZm9yICI1MjhCIjstKQorIyAoKiopCXNlY29uZCBudW1iZXIgaXMgcmVzdWx0IGZvciBjb2RlIGNvbXBpbGVkIHdpdGggLWZQSUMgZmxhZywKKyMJd2hpY2ggaXMgYWN0dWFsbHkgbW9yZSByZWxldmFudCwgYmVjYXVzZSBhc3NlbWJsZXIgY29kZSBpcworIwlwb3NpdGlvbi1pbmRlcGVuZGVudDsKKyMgKCoqKikJc2VlIGNvbW1lbnQgaW4gbm9uLU1NWCByb3V0aW5lIGZvciBmdXJ0aGVyIGRldGFpbHM7CisjCisjIFRvIHN1bW1hcml6ZSwgaXQncyA+Mi01IHRpbWVzIGZhc3RlciB0aGFuIGdjYy1nZW5lcmF0ZWQgY29kZS4gVG8KKyMgYW5jaG9yIGl0IHRvIHNvbWV0aGluZyBlbHNlIFNIQTEgYXNzZW1ibGVyIHByb2Nlc3NlcyBvbmUgYnl0ZSBpbgorIyB+NyBjeWNsZXMgb24gY29udGVtcG9yYXJ5IHg4NiBjb3Jlcy4gQXMgZm9yIGNob2ljZSBvZiBNTVgvU1NFCisjIGluIHBhcnRpY3VsYXIsIHNlZSBjb21tZW50IGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuLi4KKworIyBNYXkgMjAxMAorIworIyBBZGQgUENMTVVMUURRIHZlcnNpb24gcGVyZm9ybWluZyBhdCAyLjEwIGN5Y2xlcyBwZXIgcHJvY2Vzc2VkIGJ5dGUuCisjIFRoZSBxdWVzdGlvbiBpcyBob3cgY2xvc2UgaXMgaXQgdG8gdGhlb3JldGljYWwgbGltaXQ/IFRoZSBwY2xtdWxxZHEKKyMgaW5zdHJ1Y3Rpb24gbGF0ZW5jeSBhcHBlYXJzIHRvIGJlIDE0IGN5Y2xlcyBhbmQgdGhlcmUgY2FuJ3QgYmUgbW9yZQorIyB0aGFuIDIgb2YgdGhlbSBleGVjdXRpbmcgYXQgYW55IGdpdmVuIHRpbWUuIFRoaXMgbWVhbnMgdGhhdCBzaW5nbGUKKyMgS2FyYXRzdWJhIG11bHRpcGxpY2F0aW9uIHdvdWxkIHRha2UgMjggY3ljbGVzICpwbHVzKiBmZXcgY3ljbGVzIGZvcgorIyBwcmUtIGFuZCBwb3N0LXByb2Nlc3NpbmcuIFRoZW4gbXVsdGlwbGljYXRpb24gaGFzIHRvIGJlIGZvbGxvd2VkIGJ5CisjIG1vZHVsby1yZWR1Y3Rpb24uIEdpdmVuIHRoYXQgYWdncmVnYXRlZCByZWR1Y3Rpb24gbWV0aG9kIFtzZWUKKyMgIkNhcnJ5LWxlc3MgTXVsdGlwbGljYXRpb24gYW5kIEl0cyBVc2FnZSBmb3IgQ29tcHV0aW5nIHRoZSBHQ00gTW9kZSIKKyMgd2hpdGUgcGFwZXIgYnkgSW50ZWxdIGFsbG93cyB5b3UgdG8gcGVyZm9ybSByZWR1Y3Rpb24gb25seSBvbmNlIGluCisjIGEgd2hpbGUgd2UgY2FuIGFzc3VtZSB0aGF0IGFzeW1wdG90aWMgcGVyZm9ybWFuY2UgY2FuIGJlIGVzdGltYXRlZAorIyBhcyAoMjgrVG1vZC9OYWdncikvMTYsIHdoZXJlIFRtb2QgaXMgdGltZSB0byBwZXJmb3JtIHJlZHVjdGlvbgorIyBhbmQgTmFnZ3IgaXMgdGhlIGFnZ3JlZ2F0aW9uIGZhY3Rvci4KKyMKKyMgQmVmb3JlIHdlIHByb2NlZWQgdG8gdGhpcyBpbXBsZW1lbnRhdGlvbiBsZXQncyBoYXZlIGNsb3NlciBsb29rIGF0CisjIHRoZSBiZXN0LXBlcmZvcm1pbmcgY29kZSBzdWdnZXN0ZWQgYnkgSW50ZWwgaW4gdGhlaXIgd2hpdGUgcGFwZXIuCisjIEJ5IHRyYWNpbmcgaW50ZXItcmVnaXN0ZXIgZGVwZW5kZW5jaWVzIFRtb2QgaXMgZXN0aW1hdGVkIGFzIH4xOQorIyBjeWNsZXMgYW5kIE5hZ2dyIGNob3NlbiBieSBJbnRlbCBpcyA0LCByZXN1bHRpbmcgaW4gMi4wNSBjeWNsZXMgcGVyCisjIHByb2Nlc3NlZCBieXRlLiBBcyBpbXBsaWVkLCB0aGlzIGlzIHF1aXRlIG9wdGltaXN0aWMgZXN0aW1hdGUsCisjIGJlY2F1c2UgaXQgZG9lcyBub3QgYWNjb3VudCBmb3IgS2FyYXRzdWJhIHByZS0gYW5kIHBvc3QtcHJvY2Vzc2luZywKKyMgd2hpY2ggZm9yIGEgc2luZ2xlIG11bHRpcGxpY2F0aW9uIGlzIH41IGN5Y2xlcy4gVW5mb3J0dW5hdGVseSBJbnRlbAorIyBkb2VzIG5vdCBwcm92aWRlIHBlcmZvcm1hbmNlIGRhdGEgZm9yIEdIQVNIIGFsb25lLiBCdXQgYmVuY2htYXJraW5nCisjIEFFU19HQ01fZW5jcnlwdCByaXBwZWQgb3V0IG9mIEZpZy4gMTUgb2YgdGhlIHdoaXRlIHBhcGVyIHdpdGggYWFkdAorIyBhbG9uZSByZXN1bHRlZCBpbiAyLjQ2IGN5Y2xlcyBwZXIgYnl0ZSBvZiBvdXQgMTZLQiBidWZmZXIuIE5vdGUgdGhhdAorIyB0aGUgcmVzdWx0IGFjY291bnRzIGV2ZW4gZm9yIHByZS1jb21wdXRpbmcgb2YgZGVncmVlcyBvZiB0aGUgaGFzaAorIyBrZXkgSCwgYnV0IGl0cyBwb3J0aW9uIGlzIG5lZ2xpZ2libGUgYXQgMTZLQiBidWZmZXIgc2l6ZS4KKyMKKyMgTW92aW5nIG9uIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpbiBxdWVzdGlvbi4gVG1vZCBpcyBlc3RpbWF0ZWQgYXMKKyMgfjEzIGN5Y2xlcyBhbmQgTmFnZ3IgaXMgMiwgZ2l2aW5nIGFzeW1wdG90aWMgcGVyZm9ybWFuY2Ugb2YgLi4uCisjIDIuMTYuIEhvdyBpcyBpdCBwb3NzaWJsZSB0aGF0IG1lYXN1cmVkIHBlcmZvcm1hbmNlIGlzIGJldHRlciB0aGFuCisjIG9wdGltaXN0aWMgdGhlb3JldGljYWwgZXN0aW1hdGU/IFRoZXJlIGlzIG9uZSB0aGluZyBJbnRlbCBmYWlsZWQKKyMgdG8gcmVjb2duaXplLiBCeSBzZXJpYWxpemluZyBHSEFTSCB3aXRoIENUUiBpbiBzYW1lIHN1YnJvdXRpbmUKKyMgZm9ybWVyJ3MgcGVyZm9ybWFuY2UgaXMgcmVhbGx5IGxpbWl0ZWQgdG8gYWJvdmUgKFRtdWwgKyBUbW9kL05hZ2dyKQorIyBlcXVhdGlvbi4gQnV0IGlmIEdIQVNIIHByb2NlZHVyZSBpcyBkZXRhY2hlZCwgdGhlIG1vZHVsby1yZWR1Y3Rpb24KKyMgY2FuIGJlIGludGVybGVhdmVkIHdpdGggTmFnZ3ItMSBtdWx0aXBsaWNhdGlvbnMgYXQgaW5zdHJ1Y3Rpb24gbGV2ZWwKKyMgYW5kIHVuZGVyIGlkZWFsIGNvbmRpdGlvbnMgZXZlbiBkaXNhcHBlYXIgZnJvbSB0aGUgZXF1YXRpb24uIFNvIHRoYXQKKyMgb3B0aW1pc3RpYyB0aGVvcmV0aWNhbCBlc3RpbWF0ZSBmb3IgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyAuLi4KKyMgMjgvMTY9MS43NSwgYW5kIG5vdCAyLjE2LiBXZWxsLCBpdCdzIHByb2JhYmx5IHdheSB0b28gb3B0aW1pc3RpYywKKyMgYXQgbGVhc3QgZm9yIHN1Y2ggc21hbGwgTmFnZ3IuIEknZCBhcmd1ZSB0aGF0ICgyOCtUcHJvYy9OYWdnciksCisjIHdoZXJlIFRwcm9jIGlzIHRpbWUgcmVxdWlyZWQgZm9yIEthcmF0c3ViYSBwcmUtIGFuZCBwb3N0LXByb2Nlc3NpbmcsCisjIGlzIG1vcmUgcmVhbGlzdGljIGVzdGltYXRlLiBJbiB0aGlzIGNhc2UgaXQgZ2l2ZXMgLi4uIDEuOTEgY3ljbGVzLgorIyBPciBpbiBvdGhlciB3b3JkcywgZGVwZW5kaW5nIG9uIGhvdyB3ZWxsIHdlIGNhbiBpbnRlcmxlYXZlIHJlZHVjdGlvbgorIyBhbmQgb25lIG9mIHRoZSB0d28gbXVsdGlwbGljYXRpb25zIHRoZSBwZXJmb3JtYW5jZSBzaG91bGQgYmUgYmV0d2VuCisjIDEuOTEgYW5kIDIuMTYuIEFzIGFscmVhZHkgbWVudGlvbmVkLCB0aGlzIGltcGxlbWVudGF0aW9uIHByb2Nlc3NlcworIyBvbmUgYnl0ZSBvdXQgb2YgOEtCIGJ1ZmZlciBpbiAyLjEwIGN5Y2xlcywgd2hpbGUgeDg2XzY0IGNvdW50ZXJwYXJ0CisjIC0gaW4gMi4wMi4geDg2XzY0IHBlcmZvcm1hbmNlIGlzIGJldHRlciwgYmVjYXVzZSBsYXJnZXIgcmVnaXN0ZXIKKyMgYmFuayBhbGxvd3MgdG8gaW50ZXJsZWF2ZSByZWR1Y3Rpb24gYW5kIG11bHRpcGxpY2F0aW9uIGJldHRlci4KKyMKKyMgRG9lcyBpdCBtYWtlIHNlbnNlIHRvIGluY3JlYXNlIE5hZ2dyPyBUbyBzdGFydCB3aXRoIGl0J3MgdmlydHVhbGx5CisjIGltcG9zc2libGUgaW4gMzItYml0IG1vZGUsIGJlY2F1c2Ugb2YgbGltaXRlZCByZWdpc3RlciBiYW5rCisjIGNhcGFjaXR5LiBPdGhlcndpc2UgaW1wcm92ZW1lbnQgaGFzIHRvIGJlIHdlaWdoZWQgYWdpYWluc3Qgc2xvd2VyCisjIHNldHVwLCBhcyB3ZWxsIGFzIGNvZGUgc2l6ZSBhbmQgY29tcGxleGl0eSBpbmNyZWFzZS4gQXMgZXZlbgorIyBvcHRpbWlzdGljIGVzdGltYXRlIGRvZXNuJ3QgcHJvbWlzZSAzMCUgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQsCisjIHRoZXJlIGFyZSBjdXJyZW50bHkgbm8gcGxhbnMgdG8gaW5jcmVhc2UgTmFnZ3IuCisjCisjIFNwZWNpYWwgdGhhbmtzIHRvIERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4gZm9yCisjIHByb3ZpZGluZyBhY2Nlc3MgdG8gYSBXZXN0bWVyZS1iYXNlZCBzeXN0ZW0gb24gYmVoYWxmIG9mIEludGVsCisjIE9wZW4gU291cmNlIFRlY2hub2xvZ3kgQ2VudHJlLgorCisjIEphbnVhcnkgMjAxMAorIworIyBUd2Vha2VkIHRvIG9wdGltaXplIHRyYW5zaXRpb25zIGJldHdlZW4gaW50ZWdlciBhbmQgRlAgb3BlcmF0aW9ucworIyBvbiBzYW1lIFhNTSByZWdpc3RlciwgUENMTVVMUURRIHN1YnJvdXRpbmUgd2FzIG1lYXN1cmVkIHRvIHByb2Nlc3MKKyMgb25lIGJ5dGUgaW4gMi4wNyBjeWNsZXMgb24gU2FuZHkgQnJpZGdlLCBhbmQgaW4gMi4xMiAtIG9uIFdlc3RtZXJlLgorIyBUaGUgbWlub3IgcmVncmVzc2lvbiBvbiBXZXN0bWVyZSBpcyBvdXR3ZWlnaGVkIGJ5IH4xNSUgaW1wcm92ZW1lbnQKKyMgb24gU2FuZHkgQnJpZGdlLiBTdHJhbmdlbHkgZW5vdWdoIGF0dGVtcHQgdG8gbW9kaWZ5IDY0LWJpdCBjb2RlIGluCisjIHNpbWlsYXIgbWFubmVyIHJlc3VsdGVkIGluIGFsbW9zdCAyMCUgZGVncmFkYXRpb24gb24gU2FuZHkgQnJpZGdlLAorIyB3aGVyZSBvcmlnaW5hbCA2NC1iaXQgY29kZSBwcm9jZXNzZXMgb25lIGJ5dGUgaW4gMS45NSBjeWNsZXMuCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBGb3IgcmVmZXJlbmNlLCBBTUQgQnVsbGRvemVyIHByb2Nlc3NlcyBvbmUgYnl0ZSBpbiAxLjk4IGN5Y2xlcyBpbgorIyAzMi1iaXQgbW9kZSBhbmQgMS44OSBpbiA2NC1iaXQuCisKKyMgRmVicnVhcnkgMjAxMworIworIyBPdmVyaGF1bDogYWdncmVnYXRlIEthcmF0c3ViYSBwb3N0LXByb2Nlc3NpbmcsIGltcHJvdmUgSUxQIGluCisjIHJlZHVjdGlvbl9hbGc5LiBSZXN1bHRpbmcgcGVyZm9ybWFuY2UgaXMgMS45NiBjeWNsZXMgcGVyIGJ5dGUgb24KKyMgV2VzdG1lcmUsIDEuOTUgLSBvbiBTYW5keS9JdnkgQnJpZGdlLCAxLjc2IC0gb24gQnVsbGRvemVyLgorCiskMCA9fiBtLyguKltcL1xcXSlbXlwvXFxdKyQvOyAkZGlyPSQxOworcHVzaChASU5DLCIke2Rpcn0iLCIke2Rpcn0uLi8uLi9wZXJsYXNtIik7CityZXF1aXJlICJ4ODZhc20ucGwiOworCismYXNtX2luaXQoJEFSR1ZbMF0sImdoYXNoLXg4Ni5wbCIsJHg4Nm9ubHkgPSAkQVJHVlskI0FSR1ZdIGVxICIzODYiKTsKKworJHNzZTI9MTsKKyNmb3IgKEBBUkdWKSB7ICRzc2UyPTEgaWYgKC8tRE9QRU5TU0xfSUEzMl9TU0UyLyk7IH0KKworKCRaaGgsJFpobCwkWmxoLCRabGwpID0gKCJlYnAiLCJlZHgiLCJlY3giLCJlYngiKTsKKyRpbnAgID0gImVkaSI7CiskSHRibCA9ICJlc2kiOworDAorJHVucm9sbCA9IDA7CSMgQWZmZWN0cyB4ODYgbG9vcC4gRm9sZGVkIGxvb3AgcGVyZm9ybXMgfjclIHdvcnNlCisJCSMgdGhhbiB1bnJvbGxlZCwgd2hpY2ggaGFzIHRvIGJlIHdlaWdodGVkIGFnYWluc3QKKwkJIyAyLjV4IHg4Ni1zcGVjaWZpYyBjb2RlIHNpemUgcmVkdWN0aW9uLgorCitzdWIgeDg2X2xvb3AgeworICAgIG15ICRvZmYgPSBzaGlmdDsKKyAgICBteSAkcmVtID0gImVheCI7CisKKwkmbW92CSgkWmhoLCZEV1AoNCwkSHRibCwkWmxsKSk7CisJJm1vdgkoJFpobCwmRFdQKDAsJEh0YmwsJFpsbCkpOworCSZtb3YJKCRabGgsJkRXUCgxMiwkSHRibCwkWmxsKSk7CisJJm1vdgkoJFpsbCwmRFdQKDgsJEh0YmwsJFpsbCkpOworCSZ4b3IJKCRyZW0sJHJlbSk7CSMgYXZvaWQgcGFydGlhbCByZWdpc3RlciBzdGFsbHMgb24gUElJSQorCisJIyBzaHJkIHByYWN0aWNhbGx5IGtpbGxzIFA0LCAyLjV4IGRldGVyaW9yYXRpb24sIGJ1dCBQNCBoYXMKKwkjIE1NWCBjb2RlLXBhdGggdG8gZXhlY3V0ZS4gc2hyZCBydW5zIHRhZCBmYXN0ZXIgW3RoYW4gdHdpY2UKKwkjIHRoZSBzaGlmdHMsIG1vdmUncyBhbmQgb3Inc10gb24gcHJlLU1NWCBQZW50aXVtIChhcyB3ZWxsIGFzCisJIyBQSUlJIGFuZCBDb3JlMiksICpidXQqIG1pbmltaXplcyBjb2RlIHNpemUsIHNwYXJlcyByZWdpc3RlcgorCSMgYW5kIHRodXMgYWxsb3dzIHRvIGZvbGQgdGhlIGxvb3AuLi4KKwlpZiAoISR1bnJvbGwpIHsKKwlteSAkY250ID0gJGlucDsKKwkmbW92CSgkY250LDE1KTsKKwkmam1wCSgmbGFiZWwoIng4Nl9sb29wIikpOworCSZzZXRfbGFiZWwoIng4Nl9sb29wIiwxNik7CisJICAgIGZvcigkaT0xOyRpPD0yOyRpKyspIHsKKwkJJm1vdgkoJkxCKCRyZW0pLCZMQigkWmxsKSk7CisJCSZzaHJkCSgkWmxsLCRabGgsNCk7CisJCSZhbmQJKCZMQigkcmVtKSwweGYpOworCQkmc2hyZAkoJFpsaCwkWmhsLDQpOworCQkmc2hyZAkoJFpobCwkWmhoLDQpOworCQkmc2hyCSgkWmhoLDQpOworCQkmeG9yCSgkWmhoLCZEV1AoJG9mZisxNiwiZXNwIiwkcmVtLDQpKTsKKworCQkmbW92CSgmTEIoJHJlbSksJkJQKCRvZmYsImVzcCIsJGNudCkpOworCQlpZiAoJGkmMSkgeworCQkJJmFuZAkoJkxCKCRyZW0pLDB4ZjApOworCQl9IGVsc2UgeworCQkJJnNobAkoJkxCKCRyZW0pLDQpOworCQl9CisKKwkJJnhvcgkoJFpsbCwmRFdQKDgsJEh0YmwsJHJlbSkpOworCQkmeG9yCSgkWmxoLCZEV1AoMTIsJEh0YmwsJHJlbSkpOworCQkmeG9yCSgkWmhsLCZEV1AoMCwkSHRibCwkcmVtKSk7CisJCSZ4b3IJKCRaaGgsJkRXUCg0LCRIdGJsLCRyZW0pKTsKKworCQlpZiAoJGkmMSkgeworCQkJJmRlYwkoJGNudCk7CisJCQkmanMJKCZsYWJlbCgieDg2X2JyZWFrIikpOworCQl9IGVsc2UgeworCQkJJmptcAkoJmxhYmVsKCJ4ODZfbG9vcCIpKTsKKwkJfQorCSAgICB9CisJJnNldF9sYWJlbCgieDg2X2JyZWFrIiwxNik7CisJfSBlbHNlIHsKKwkgICAgZm9yKCRpPTE7JGk8MzI7JGkrKykgeworCQkmY29tbWVudCgkaSk7CisJCSZtb3YJKCZMQigkcmVtKSwmTEIoJFpsbCkpOworCQkmc2hyZAkoJFpsbCwkWmxoLDQpOworCQkmYW5kCSgmTEIoJHJlbSksMHhmKTsKKwkJJnNocmQJKCRabGgsJFpobCw0KTsKKwkJJnNocmQJKCRaaGwsJFpoaCw0KTsKKwkJJnNocgkoJFpoaCw0KTsKKwkJJnhvcgkoJFpoaCwmRFdQKCRvZmYrMTYsImVzcCIsJHJlbSw0KSk7CisKKwkJaWYgKCRpJjEpIHsKKwkJCSZtb3YJKCZMQigkcmVtKSwmQlAoJG9mZisxNS0oJGk+PjEpLCJlc3AiKSk7CisJCQkmYW5kCSgmTEIoJHJlbSksMHhmMCk7CisJCX0gZWxzZSB7CisJCQkmbW92CSgmTEIoJHJlbSksJkJQKCRvZmYrMTUtKCRpPj4xKSwiZXNwIikpOworCQkJJnNobAkoJkxCKCRyZW0pLDQpOworCQl9CisKKwkJJnhvcgkoJFpsbCwmRFdQKDgsJEh0YmwsJHJlbSkpOworCQkmeG9yCSgkWmxoLCZEV1AoMTIsJEh0YmwsJHJlbSkpOworCQkmeG9yCSgkWmhsLCZEV1AoMCwkSHRibCwkcmVtKSk7CisJCSZ4b3IJKCRaaGgsJkRXUCg0LCRIdGJsLCRyZW0pKTsKKwkgICAgfQorCX0KKwkmYnN3YXAJKCRabGwpOworCSZic3dhcAkoJFpsaCk7CisJJmJzd2FwCSgkWmhsKTsKKwlpZiAoISR4ODZvbmx5KSB7CisJCSZic3dhcAkoJFpoaCk7CisJfSBlbHNlIHsKKwkJJm1vdgkoImVheCIsJFpoaCk7CisJCSZic3dhcAkoImVheCIpOworCQkmbW92CSgkWmhoLCJlYXgiKTsKKwl9Cit9CisKK2lmICgkdW5yb2xsKSB7CisgICAgJmZ1bmN0aW9uX2JlZ2luX0IoIl94ODZfZ211bHRfNGJpdF9pbm5lciIpOworCSZ4ODZfbG9vcCg0KTsKKwkmcmV0CSgpOworICAgICZmdW5jdGlvbl9lbmRfQigiX3g4Nl9nbXVsdF80Yml0X2lubmVyIik7Cit9CisKK3N1YiBkZXBvc2l0X3JlbV80Yml0IHsKKyAgICBteSAkYmlhcyA9IHNoaWZ0OworCisJJm1vdgkoJkRXUCgkYmlhcyswLCAiZXNwIiksMHgwMDAwPDwxNik7CisJJm1vdgkoJkRXUCgkYmlhcys0LCAiZXNwIiksMHgxQzIwPDwxNik7CisJJm1vdgkoJkRXUCgkYmlhcys4LCAiZXNwIiksMHgzODQwPDwxNik7CisJJm1vdgkoJkRXUCgkYmlhcysxMiwiZXNwIiksMHgyNDYwPDwxNik7CisJJm1vdgkoJkRXUCgkYmlhcysxNiwiZXNwIiksMHg3MDgwPDwxNik7CisJJm1vdgkoJkRXUCgkYmlhcysyMCwiZXNwIiksMHg2Q0EwPDwxNik7CisJJm1vdgkoJkRXUCgkYmlhcysyNCwiZXNwIiksMHg0OEMwPDwxNik7CisJJm1vdgkoJkRXUCgkYmlhcysyOCwiZXNwIiksMHg1NEUwPDwxNik7CisJJm1vdgkoJkRXUCgkYmlhcyszMiwiZXNwIiksMHhFMTAwPDwxNik7CisJJm1vdgkoJkRXUCgkYmlhcyszNiwiZXNwIiksMHhGRDIwPDwxNik7CisJJm1vdgkoJkRXUCgkYmlhcys0MCwiZXNwIiksMHhEOTQwPDwxNik7CisJJm1vdgkoJkRXUCgkYmlhcys0NCwiZXNwIiksMHhDNTYwPDwxNik7CisJJm1vdgkoJkRXUCgkYmlhcys0OCwiZXNwIiksMHg5MTgwPDwxNik7CisJJm1vdgkoJkRXUCgkYmlhcys1MiwiZXNwIiksMHg4REEwPDwxNik7CisJJm1vdgkoJkRXUCgkYmlhcys1NiwiZXNwIiksMHhBOUMwPDwxNik7CisJJm1vdgkoJkRXUCgkYmlhcys2MCwiZXNwIiksMHhCNUUwPDwxNik7Cit9CisMCiskc3VmZml4ID0gJHg4Nm9ubHkgPyAiIiA6ICJfeDg2IjsKKworJmZ1bmN0aW9uX2JlZ2luKCJnY21fZ211bHRfNGJpdCIuJHN1ZmZpeCk7CisJJnN0YWNrX3B1c2goMTYrNCsxKTsJCQkjICsxIGZvciBzdGFjayBhbGlnbm1lbnQKKwkmbW92CSgkaW5wLCZ3cGFyYW0oMCkpOwkJIyBsb2FkIFhpCisJJm1vdgkoJEh0YmwsJndwYXJhbSgxKSk7CQkjIGxvYWQgSHRhYmxlCisKKwkmbW92CSgkWmhoLCZEV1AoMCwkaW5wKSk7CQkjIGxvYWQgWGlbMTZdCisJJm1vdgkoJFpobCwmRFdQKDQsJGlucCkpOworCSZtb3YJKCRabGgsJkRXUCg4LCRpbnApKTsKKwkmbW92CSgkWmxsLCZEV1AoMTIsJGlucCkpOworCisJJmRlcG9zaXRfcmVtXzRiaXQoMTYpOworCisJJm1vdgkoJkRXUCgwLCJlc3AiKSwkWmhoKTsJCSMgY29weSBYaVsxNl0gb24gc3RhY2sKKwkmbW92CSgmRFdQKDQsImVzcCIpLCRaaGwpOworCSZtb3YJKCZEV1AoOCwiZXNwIiksJFpsaCk7CisJJm1vdgkoJkRXUCgxMiwiZXNwIiksJFpsbCk7CisJJnNocgkoJFpsbCwyMCk7CisJJmFuZAkoJFpsbCwweGYwKTsKKworCWlmICgkdW5yb2xsKSB7CisJCSZjYWxsCSgiX3g4Nl9nbXVsdF80Yml0X2lubmVyIik7CisJfSBlbHNlIHsKKwkJJng4Nl9sb29wKDApOworCQkmbW92CSgkaW5wLCZ3cGFyYW0oMCkpOworCX0KKworCSZtb3YJKCZEV1AoMTIsJGlucCksJFpsbCk7CisJJm1vdgkoJkRXUCg4LCRpbnApLCRabGgpOworCSZtb3YJKCZEV1AoNCwkaW5wKSwkWmhsKTsKKwkmbW92CSgmRFdQKDAsJGlucCksJFpoaCk7CisJJnN0YWNrX3BvcCgxNis0KzEpOworJmZ1bmN0aW9uX2VuZCgiZ2NtX2dtdWx0XzRiaXQiLiRzdWZmaXgpOworCismZnVuY3Rpb25fYmVnaW4oImdjbV9naGFzaF80Yml0Ii4kc3VmZml4KTsKKwkmc3RhY2tfcHVzaCgxNis0KzEpOwkJCSMgKzEgZm9yIDY0LWJpdCBhbGlnbm1lbnQKKwkmbW92CSgkWmxsLCZ3cGFyYW0oMCkpOwkJIyBsb2FkIFhpCisJJm1vdgkoJEh0YmwsJndwYXJhbSgxKSk7CQkjIGxvYWQgSHRhYmxlCisJJm1vdgkoJGlucCwmd3BhcmFtKDIpKTsJCSMgbG9hZCBpbgorCSZtb3YJKCJlY3giLCZ3cGFyYW0oMykpOwkJIyBsb2FkIGxlbgorCSZhZGQJKCJlY3giLCRpbnApOworCSZtb3YJKCZ3cGFyYW0oMyksImVjeCIpOworCisJJm1vdgkoJFpoaCwmRFdQKDAsJFpsbCkpOwkJIyBsb2FkIFhpWzE2XQorCSZtb3YJKCRaaGwsJkRXUCg0LCRabGwpKTsKKwkmbW92CSgkWmxoLCZEV1AoOCwkWmxsKSk7CisJJm1vdgkoJFpsbCwmRFdQKDEyLCRabGwpKTsKKworCSZkZXBvc2l0X3JlbV80Yml0KDE2KTsKKworICAgICZzZXRfbGFiZWwoIng4Nl9vdXRlcl9sb29wIiwxNik7CisJJnhvcgkoJFpsbCwmRFdQKDEyLCRpbnApKTsJCSMgeG9yIHdpdGggaW5wdXQKKwkmeG9yCSgkWmxoLCZEV1AoOCwkaW5wKSk7CisJJnhvcgkoJFpobCwmRFdQKDQsJGlucCkpOworCSZ4b3IJKCRaaGgsJkRXUCgwLCRpbnApKTsKKwkmbW92CSgmRFdQKDEyLCJlc3AiKSwkWmxsKTsJCSMgZHVtcCBpdCBvbiBzdGFjaworCSZtb3YJKCZEV1AoOCwiZXNwIiksJFpsaCk7CisJJm1vdgkoJkRXUCg0LCJlc3AiKSwkWmhsKTsKKwkmbW92CSgmRFdQKDAsImVzcCIpLCRaaGgpOworCisJJnNocgkoJFpsbCwyMCk7CisJJmFuZAkoJFpsbCwweGYwKTsKKworCWlmICgkdW5yb2xsKSB7CisJCSZjYWxsCSgiX3g4Nl9nbXVsdF80Yml0X2lubmVyIik7CisJfSBlbHNlIHsKKwkJJng4Nl9sb29wKDApOworCQkmbW92CSgkaW5wLCZ3cGFyYW0oMikpOworCX0KKwkmbGVhCSgkaW5wLCZEV1AoMTYsJGlucCkpOworCSZjbXAJKCRpbnAsJndwYXJhbSgzKSk7CisJJm1vdgkoJndwYXJhbSgyKSwkaW5wKQlpZiAoISR1bnJvbGwpOworCSZqYgkoJmxhYmVsKCJ4ODZfb3V0ZXJfbG9vcCIpKTsKKworCSZtb3YJKCRpbnAsJndwYXJhbSgwKSk7CSMgbG9hZCBYaQorCSZtb3YJKCZEV1AoMTIsJGlucCksJFpsbCk7CisJJm1vdgkoJkRXUCg4LCRpbnApLCRabGgpOworCSZtb3YJKCZEV1AoNCwkaW5wKSwkWmhsKTsKKwkmbW92CSgmRFdQKDAsJGlucCksJFpoaCk7CisJJnN0YWNrX3BvcCgxNis0KzEpOworJmZ1bmN0aW9uX2VuZCgiZ2NtX2doYXNoXzRiaXQiLiRzdWZmaXgpOworDAoraWYgKCEkeDg2b25seSkge3t7CisKKyZzdGF0aWNfbGFiZWwoInJlbV80Yml0Iik7CisKK2lmICghJHNzZTIpIHt7CSMgcHVyZS1NTVggIk1heSIgdmVyc2lvbi4uLgorCiskUz0xMjsJCSMgc2hpZnQgZmFjdG9yIGZvciByZW1fNGJpdAorCismZnVuY3Rpb25fYmVnaW5fQigiX21teF9nbXVsdF80Yml0X2lubmVyIik7CisjIE1NWCB2ZXJzaW9uIHBlcmZvcm1zIDMuNSB0aW1lcyBiZXR0ZXIgb24gUDQgKHNlZSBjb21tZW50IGluIG5vbi1NTVgKKyMgcm91dGluZSBmb3IgZnVydGhlciBkZXRhaWxzKSwgMTAwJSBiZXR0ZXIgb24gT3B0ZXJvbiwgfjcwJSBiZXR0ZXIKKyMgb24gQ29yZTIgYW5kIFBJSUkuLi4gSW4gb3RoZXIgd29yZHMgZWZmb3J0IGlzIGNvbnNpZGVyZWQgdG8gYmUgd2VsbAorIyBzcGVudC4uLiBTaW5jZSBpbml0aWFsIHJlbGVhc2UgdGhlIGxvb3Agd2FzIHVucm9sbGVkIGluIG9yZGVyIHRvCisjICJsaWJlcmF0ZSIgcmVnaXN0ZXIgcHJldmlvdXNseSB1c2VkIGFzIGxvb3AgY291bnRlci4gSW5zdGVhZCBpdCdzCisjIHVzZWQgdG8gb3B0aW1pemUgY3JpdGljYWwgcGF0aCBpbiAnWi5oaSBePSByZW1fNGJpdFtaLmxvJjB4Zl0nLgorIyBUaGUgcGF0aCBpbnZvbHZlcyBtb3ZlIG9mIFoubG8gZnJvbSBNTVggdG8gaW50ZWdlciByZWdpc3RlciwKKyMgZWZmZWN0aXZlIGFkZHJlc3MgY2FsY3VsYXRpb24gYW5kIGZpbmFsbHkgbWVyZ2Ugb2YgdmFsdWUgdG8gWi5oaS4KKyMgUmVmZXJlbmNlIHRvIHJlbV80Yml0IGlzIHNjaGVkdWxlZCBzbyBsYXRlIHRoYXQgSSBoYWQgdG8gPj40CisjIHJlbV80Yml0IGVsZW1lbnRzLiBUaGlzIHJlc3VsdGVkIGluIDIwLTQ1JSBwcm9jZW50IGltcHJvdmVtZW50CisjIG9uIGNvbnRlbXBvcmFyeSC1LWFyY2hzLgoreworICAgIG15ICRjbnQ7CisgICAgbXkgJHJlbV80Yml0ID0gImVheCI7CisgICAgbXkgQHJlbSA9ICgkWmhoLCRabGwpOworICAgIG15ICRuaGkgPSAkWmhsOworICAgIG15ICRubG8gPSAkWmxoOworCisgICAgbXkgKCRabG8sJFpoaSkgPSAoIm1tMCIsIm1tMSIpOworICAgIG15ICR0bXAgPSAibW0yIjsKKworCSZ4b3IJKCRubG8sJG5sbyk7CSMgYXZvaWQgcGFydGlhbCByZWdpc3RlciBzdGFsbHMgb24gUElJSQorCSZtb3YJKCRuaGksJFpsbCk7CisJJm1vdgkoJkxCKCRubG8pLCZMQigkbmhpKSk7CisJJnNobAkoJkxCKCRubG8pLDQpOworCSZhbmQJKCRuaGksMHhmMCk7CisJJm1vdnEJKCRabG8sJlFXUCg4LCRIdGJsLCRubG8pKTsKKwkmbW92cQkoJFpoaSwmUVdQKDAsJEh0YmwsJG5sbykpOworCSZtb3ZkCSgkcmVtWzBdLCRabG8pOworCisJZm9yICgkY250PTI4OyRjbnQ+PS0yOyRjbnQtLSkgeworCSAgICBteSAkb2RkID0gJGNudCYxOworCSAgICBteSAkbml4ID0gJG9kZCA/ICRubG8gOiAkbmhpOworCisJCSZzaGwJKCZMQigkbmxvKSw0KQkJCWlmICgkb2RkKTsKKwkJJnBzcmxxCSgkWmxvLDQpOworCQkmbW92cQkoJHRtcCwkWmhpKTsKKwkJJnBzcmxxCSgkWmhpLDQpOworCQkmcHhvcgkoJFpsbywmUVdQKDgsJEh0YmwsJG5peCkpOworCQkmbW92CSgmTEIoJG5sbyksJkJQKCRjbnQvMiwkaW5wKSkJaWYgKCEkb2RkICYmICRjbnQ+PTApOworCQkmcHNsbHEJKCR0bXAsNjApOworCQkmYW5kCSgkbmhpLDB4ZjApCQkJaWYgKCRvZGQpOworCQkmcHhvcgkoJFpoaSwmUVdQKDAsJHJlbV80Yml0LCRyZW1bMV0sOCkpIGlmICgkY250PDI4KTsKKwkJJmFuZAkoJHJlbVswXSwweGYpOworCQkmcHhvcgkoJFpoaSwmUVdQKDAsJEh0YmwsJG5peCkpOworCQkmbW92CSgkbmhpLCRubG8pCQkJaWYgKCEkb2RkICYmICRjbnQ+PTApOworCQkmbW92ZAkoJHJlbVsxXSwkWmxvKTsKKwkJJnB4b3IJKCRabG8sJHRtcCk7CisKKwkJcHVzaAkoQHJlbSxzaGlmdChAcmVtKSk7CQkjICJyb3RhdGUiIHJlZ2lzdGVycworCX0KKworCSZtb3YJKCRpbnAsJkRXUCg0LCRyZW1fNGJpdCwkcmVtWzFdLDgpKTsJIyBsYXN0IHJlbV80Yml0W3JlbV0KKworCSZwc3JscQkoJFpsbywzMik7CSMgbG93ZXIgcGFydCBvZiBabG8gaXMgYWxyZWFkeSB0aGVyZQorCSZtb3ZkCSgkWmhsLCRaaGkpOworCSZwc3JscQkoJFpoaSwzMik7CisJJm1vdmQJKCRabGgsJFpsbyk7CisJJm1vdmQJKCRaaGgsJFpoaSk7CisJJnNobAkoJGlucCw0KTsJIyBjb21wZW5zYXRlIGZvciByZW1fNGJpdFtpXSBiZWluZyA+PjQKKworCSZic3dhcAkoJFpsbCk7CisJJmJzd2FwCSgkWmhsKTsKKwkmYnN3YXAJKCRabGgpOworCSZ4b3IJKCRaaGgsJGlucCk7CisJJmJzd2FwCSgkWmhoKTsKKworCSZyZXQJKCk7Cit9CismZnVuY3Rpb25fZW5kX0IoIl9tbXhfZ211bHRfNGJpdF9pbm5lciIpOworCismZnVuY3Rpb25fYmVnaW4oImdjbV9nbXVsdF80Yml0X21teCIpOworCSZtb3YJKCRpbnAsJndwYXJhbSgwKSk7CSMgbG9hZCBYaQorCSZtb3YJKCRIdGJsLCZ3cGFyYW0oMSkpOwkjIGxvYWQgSHRhYmxlCisKKwkmY2FsbAkoJmxhYmVsKCJwaWNfcG9pbnQiKSk7CisJJnNldF9sYWJlbCgicGljX3BvaW50Iik7CisJJmJsaW5kcG9wKCJlYXgiKTsKKwkmbGVhCSgiZWF4IiwmRFdQKCZsYWJlbCgicmVtXzRiaXQiKS4iLSIuJmxhYmVsKCJwaWNfcG9pbnQiKSwiZWF4IikpOworCisJJm1vdnoJKCRabGwsJkJQKDE1LCRpbnApKTsKKworCSZjYWxsCSgiX21teF9nbXVsdF80Yml0X2lubmVyIik7CisKKwkmbW92CSgkaW5wLCZ3cGFyYW0oMCkpOwkjIGxvYWQgWGkKKwkmZW1tcwkoKTsKKwkmbW92CSgmRFdQKDEyLCRpbnApLCRabGwpOworCSZtb3YJKCZEV1AoNCwkaW5wKSwkWmhsKTsKKwkmbW92CSgmRFdQKDgsJGlucCksJFpsaCk7CisJJm1vdgkoJkRXUCgwLCRpbnApLCRaaGgpOworJmZ1bmN0aW9uX2VuZCgiZ2NtX2dtdWx0XzRiaXRfbW14Iik7CisMCisjIFN0cmVhbWVkIHZlcnNpb24gcGVyZm9ybXMgMjAlIGJldHRlciBvbiBQNCwgNyUgb24gT3B0ZXJvbiwKKyMgMTAlIG9uIENvcmUyIGFuZCBQSUlJLi4uCismZnVuY3Rpb25fYmVnaW4oImdjbV9naGFzaF80Yml0X21teCIpOworCSZtb3YJKCRaaGgsJndwYXJhbSgwKSk7CSMgbG9hZCBYaQorCSZtb3YJKCRIdGJsLCZ3cGFyYW0oMSkpOwkjIGxvYWQgSHRhYmxlCisJJm1vdgkoJGlucCwmd3BhcmFtKDIpKTsJIyBsb2FkIGluCisJJm1vdgkoJFpsaCwmd3BhcmFtKDMpKTsJIyBsb2FkIGxlbgorCisJJmNhbGwJKCZsYWJlbCgicGljX3BvaW50IikpOworCSZzZXRfbGFiZWwoInBpY19wb2ludCIpOworCSZibGluZHBvcCgiZWF4Iik7CisJJmxlYQkoImVheCIsJkRXUCgmbGFiZWwoInJlbV80Yml0IikuIi0iLiZsYWJlbCgicGljX3BvaW50IiksImVheCIpKTsKKworCSZhZGQJKCRabGgsJGlucCk7CisJJm1vdgkoJndwYXJhbSgzKSwkWmxoKTsJIyBsZW4gdG8gcG9pbnQgYXQgdGhlIGVuZCBvZiBpbnB1dAorCSZzdGFja19wdXNoKDQrMSk7CQkjICsxIGZvciBzdGFjayBhbGlnbm1lbnQKKworCSZtb3YJKCRabGwsJkRXUCgxMiwkWmhoKSk7CSMgbG9hZCBYaVsxNl0KKwkmbW92CSgkWmhsLCZEV1AoNCwkWmhoKSk7CisJJm1vdgkoJFpsaCwmRFdQKDgsJFpoaCkpOworCSZtb3YJKCRaaGgsJkRXUCgwLCRaaGgpKTsKKwkmam1wCSgmbGFiZWwoIm1teF9vdXRlcl9sb29wIikpOworCisgICAgJnNldF9sYWJlbCgibW14X291dGVyX2xvb3AiLDE2KTsKKwkmeG9yCSgkWmxsLCZEV1AoMTIsJGlucCkpOworCSZ4b3IJKCRaaGwsJkRXUCg0LCRpbnApKTsKKwkmeG9yCSgkWmxoLCZEV1AoOCwkaW5wKSk7CisJJnhvcgkoJFpoaCwmRFdQKDAsJGlucCkpOworCSZtb3YJKCZ3cGFyYW0oMiksJGlucCk7CisJJm1vdgkoJkRXUCgxMiwiZXNwIiksJFpsbCk7CisJJm1vdgkoJkRXUCg0LCJlc3AiKSwkWmhsKTsKKwkmbW92CSgmRFdQKDgsImVzcCIpLCRabGgpOworCSZtb3YJKCZEV1AoMCwiZXNwIiksJFpoaCk7CisKKwkmbW92CSgkaW5wLCJlc3AiKTsKKwkmc2hyCSgkWmxsLDI0KTsKKworCSZjYWxsCSgiX21teF9nbXVsdF80Yml0X2lubmVyIik7CisKKwkmbW92CSgkaW5wLCZ3cGFyYW0oMikpOworCSZsZWEJKCRpbnAsJkRXUCgxNiwkaW5wKSk7CisJJmNtcAkoJGlucCwmd3BhcmFtKDMpKTsKKwkmamIJKCZsYWJlbCgibW14X291dGVyX2xvb3AiKSk7CisKKwkmbW92CSgkaW5wLCZ3cGFyYW0oMCkpOwkjIGxvYWQgWGkKKwkmZW1tcwkoKTsKKwkmbW92CSgmRFdQKDEyLCRpbnApLCRabGwpOworCSZtb3YJKCZEV1AoNCwkaW5wKSwkWmhsKTsKKwkmbW92CSgmRFdQKDgsJGlucCksJFpsaCk7CisJJm1vdgkoJkRXUCgwLCRpbnApLCRaaGgpOworCisJJnN0YWNrX3BvcCg0KzEpOworJmZ1bmN0aW9uX2VuZCgiZ2NtX2doYXNoXzRiaXRfbW14Iik7CisMCit9fSBlbHNlIHt7CSMgIkp1bmUiIE1NWCB2ZXJzaW9uLi4uCisJCSMgLi4uIGhhcyBzbG93ZXIgIkFwcmlsIiBnY21fZ211bHRfNGJpdF9tbXggd2l0aCBmb2xkZWQKKwkJIyBsb29wLiBUaGlzIGlzIGRvbmUgdG8gY29uc2VydmUgY29kZSBzaXplLi4uCiskUz0xNjsJCSMgc2hpZnQgZmFjdG9yIGZvciByZW1fNGJpdAorCitzdWIgbW14X2xvb3AoKSB7CisjIE1NWCB2ZXJzaW9uIHBlcmZvcm1zIDIuOCB0aW1lcyBiZXR0ZXIgb24gUDQgKHNlZSBjb21tZW50IGluIG5vbi1NTVgKKyMgcm91dGluZSBmb3IgZnVydGhlciBkZXRhaWxzKSwgNDAlIGJldHRlciBvbiBPcHRlcm9uIGFuZCBDb3JlMiwgNTAlCisjIGJldHRlciBvbiBQSUlJLi4uIEluIG90aGVyIHdvcmRzIGVmZm9ydCBpcyBjb25zaWRlcmVkIHRvIGJlIHdlbGwKKyMgc3BlbnQuLi4KKyAgICBteSAkaW5wID0gc2hpZnQ7CisgICAgbXkgJHJlbV80Yml0ID0gc2hpZnQ7CisgICAgbXkgJGNudCA9ICRaaGg7CisgICAgbXkgJG5oaSA9ICRaaGw7CisgICAgbXkgJG5sbyA9ICRabGg7CisgICAgbXkgJHJlbSA9ICRabGw7CisKKyAgICBteSAoJFpsbywkWmhpKSA9ICgibW0wIiwibW0xIik7CisgICAgbXkgJHRtcCA9ICJtbTIiOworCisJJnhvcgkoJG5sbywkbmxvKTsJIyBhdm9pZCBwYXJ0aWFsIHJlZ2lzdGVyIHN0YWxscyBvbiBQSUlJCisJJm1vdgkoJG5oaSwkWmxsKTsKKwkmbW92CSgmTEIoJG5sbyksJkxCKCRuaGkpKTsKKwkmbW92CSgkY250LDE0KTsKKwkmc2hsCSgmTEIoJG5sbyksNCk7CisJJmFuZAkoJG5oaSwweGYwKTsKKwkmbW92cQkoJFpsbywmUVdQKDgsJEh0YmwsJG5sbykpOworCSZtb3ZxCSgkWmhpLCZRV1AoMCwkSHRibCwkbmxvKSk7CisJJm1vdmQJKCRyZW0sJFpsbyk7CisJJmptcAkoJmxhYmVsKCJtbXhfbG9vcCIpKTsKKworICAgICZzZXRfbGFiZWwoIm1teF9sb29wIiwxNik7CisJJnBzcmxxCSgkWmxvLDQpOworCSZhbmQJKCRyZW0sMHhmKTsKKwkmbW92cQkoJHRtcCwkWmhpKTsKKwkmcHNybHEJKCRaaGksNCk7CisJJnB4b3IJKCRabG8sJlFXUCg4LCRIdGJsLCRuaGkpKTsKKwkmbW92CSgmTEIoJG5sbyksJkJQKDAsJGlucCwkY250KSk7CisJJnBzbGxxCSgkdG1wLDYwKTsKKwkmcHhvcgkoJFpoaSwmUVdQKDAsJHJlbV80Yml0LCRyZW0sOCkpOworCSZkZWMJKCRjbnQpOworCSZtb3ZkCSgkcmVtLCRabG8pOworCSZweG9yCSgkWmhpLCZRV1AoMCwkSHRibCwkbmhpKSk7CisJJm1vdgkoJG5oaSwkbmxvKTsKKwkmcHhvcgkoJFpsbywkdG1wKTsKKwkmanMJKCZsYWJlbCgibW14X2JyZWFrIikpOworCisJJnNobAkoJkxCKCRubG8pLDQpOworCSZhbmQJKCRyZW0sMHhmKTsKKwkmcHNybHEJKCRabG8sNCk7CisJJmFuZAkoJG5oaSwweGYwKTsKKwkmbW92cQkoJHRtcCwkWmhpKTsKKwkmcHNybHEJKCRaaGksNCk7CisJJnB4b3IJKCRabG8sJlFXUCg4LCRIdGJsLCRubG8pKTsKKwkmcHNsbHEJKCR0bXAsNjApOworCSZweG9yCSgkWmhpLCZRV1AoMCwkcmVtXzRiaXQsJHJlbSw4KSk7CisJJm1vdmQJKCRyZW0sJFpsbyk7CisJJnB4b3IJKCRaaGksJlFXUCgwLCRIdGJsLCRubG8pKTsKKwkmcHhvcgkoJFpsbywkdG1wKTsKKwkmam1wCSgmbGFiZWwoIm1teF9sb29wIikpOworCisgICAgJnNldF9sYWJlbCgibW14X2JyZWFrIiwxNik7CisJJnNobAkoJkxCKCRubG8pLDQpOworCSZhbmQJKCRyZW0sMHhmKTsKKwkmcHNybHEJKCRabG8sNCk7CisJJmFuZAkoJG5oaSwweGYwKTsKKwkmbW92cQkoJHRtcCwkWmhpKTsKKwkmcHNybHEJKCRaaGksNCk7CisJJnB4b3IJKCRabG8sJlFXUCg4LCRIdGJsLCRubG8pKTsKKwkmcHNsbHEJKCR0bXAsNjApOworCSZweG9yCSgkWmhpLCZRV1AoMCwkcmVtXzRiaXQsJHJlbSw4KSk7CisJJm1vdmQJKCRyZW0sJFpsbyk7CisJJnB4b3IJKCRaaGksJlFXUCgwLCRIdGJsLCRubG8pKTsKKwkmcHhvcgkoJFpsbywkdG1wKTsKKworCSZwc3JscQkoJFpsbyw0KTsKKwkmYW5kCSgkcmVtLDB4Zik7CisJJm1vdnEJKCR0bXAsJFpoaSk7CisJJnBzcmxxCSgkWmhpLDQpOworCSZweG9yCSgkWmxvLCZRV1AoOCwkSHRibCwkbmhpKSk7CisJJnBzbGxxCSgkdG1wLDYwKTsKKwkmcHhvcgkoJFpoaSwmUVdQKDAsJHJlbV80Yml0LCRyZW0sOCkpOworCSZtb3ZkCSgkcmVtLCRabG8pOworCSZweG9yCSgkWmhpLCZRV1AoMCwkSHRibCwkbmhpKSk7CisJJnB4b3IJKCRabG8sJHRtcCk7CisKKwkmcHNybHEJKCRabG8sMzIpOwkjIGxvd2VyIHBhcnQgb2YgWmxvIGlzIGFscmVhZHkgdGhlcmUKKwkmbW92ZAkoJFpobCwkWmhpKTsKKwkmcHNybHEJKCRaaGksMzIpOworCSZtb3ZkCSgkWmxoLCRabG8pOworCSZtb3ZkCSgkWmhoLCRaaGkpOworCisJJmJzd2FwCSgkWmxsKTsKKwkmYnN3YXAJKCRaaGwpOworCSZic3dhcAkoJFpsaCk7CisJJmJzd2FwCSgkWmhoKTsKK30KKworJmZ1bmN0aW9uX2JlZ2luKCJnY21fZ211bHRfNGJpdF9tbXgiKTsKKwkmbW92CSgkaW5wLCZ3cGFyYW0oMCkpOwkjIGxvYWQgWGkKKwkmbW92CSgkSHRibCwmd3BhcmFtKDEpKTsJIyBsb2FkIEh0YWJsZQorCisJJmNhbGwJKCZsYWJlbCgicGljX3BvaW50IikpOworCSZzZXRfbGFiZWwoInBpY19wb2ludCIpOworCSZibGluZHBvcCgiZWF4Iik7CisJJmxlYQkoImVheCIsJkRXUCgmbGFiZWwoInJlbV80Yml0IikuIi0iLiZsYWJlbCgicGljX3BvaW50IiksImVheCIpKTsKKworCSZtb3Z6CSgkWmxsLCZCUCgxNSwkaW5wKSk7CisKKwkmbW14X2xvb3AoJGlucCwiZWF4Iik7CisKKwkmZW1tcwkoKTsKKwkmbW92CSgmRFdQKDEyLCRpbnApLCRabGwpOworCSZtb3YJKCZEV1AoNCwkaW5wKSwkWmhsKTsKKwkmbW92CSgmRFdQKDgsJGlucCksJFpsaCk7CisJJm1vdgkoJkRXUCgwLCRpbnApLCRaaGgpOworJmZ1bmN0aW9uX2VuZCgiZ2NtX2dtdWx0XzRiaXRfbW14Iik7CisMCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlbG93IHN1YnJvdXRpbmUgaXMgIjUyOEIiIHZhcmlhbnQgb2YgIjQtYml0IiBHQ00gR0hBU0ggZnVuY3Rpb24KKyMgKHNlZSBnY20xMjguYyBmb3IgZGV0YWlscykuIEl0IHByb3ZpZGVzIGZ1cnRoZXIgMjAtNDAlIHBlcmZvcm1hbmNlCisjIGltcHJvdmVtZW50IG92ZXIgYWJvdmUgbWVudGlvbmVkICJNYXkiIHZlcnNpb24uCisKKyZzdGF0aWNfbGFiZWwoInJlbV84Yml0Iik7CisKKyZmdW5jdGlvbl9iZWdpbigiZ2NtX2doYXNoXzRiaXRfbW14Iik7Cit7IG15ICgkWmxvLCRaaGkpID0gKCJtbTciLCJtbTYiKTsKKyAgbXkgJHJlbV84Yml0ID0gImVzaSI7CisgIG15ICRIdGJsID0gImVieCI7CisKKyAgICAjIHBhcmFtZXRlciBibG9jaworICAgICZtb3YJKCJlYXgiLCZ3cGFyYW0oMCkpOwkJIyBYaQorICAgICZtb3YJKCJlYngiLCZ3cGFyYW0oMSkpOwkJIyBIdGFibGUKKyAgICAmbW92CSgiZWN4Iiwmd3BhcmFtKDIpKTsJCSMgaW5wCisgICAgJm1vdgkoImVkeCIsJndwYXJhbSgzKSk7CQkjIGxlbgorICAgICZtb3YJKCJlYnAiLCJlc3AiKTsJCQkjIG9yaWdpbmFsICVlc3AKKyAgICAmY2FsbAkoJmxhYmVsKCJwaWNfcG9pbnQiKSk7CisgICAgJnNldF9sYWJlbAkoInBpY19wb2ludCIpOworICAgICZibGluZHBvcAkoJHJlbV84Yml0KTsKKyAgICAmbGVhCSgkcmVtXzhiaXQsJkRXUCgmbGFiZWwoInJlbV84Yml0IikuIi0iLiZsYWJlbCgicGljX3BvaW50IiksJHJlbV84Yml0KSk7CisKKyAgICAmc3ViCSgiZXNwIiw1MTIrMTYrMTYpOwkJIyBhbGxvY2F0ZSBzdGFjayBmcmFtZS4uLgorICAgICZhbmQJKCJlc3AiLC02NCk7CQkJIyAuLi5hbmQgYWxpZ24gaXQKKyAgICAmc3ViCSgiZXNwIiwxNik7CQkJIyBwbGFjZSBmb3IgKHU4KShIW108PDQpCisKKyAgICAmYWRkCSgiZWR4IiwiZWN4Iik7CQkJIyBwb2ludGVyIHRvIHRoZSBlbmQgb2YgaW5wdXQKKyAgICAmbW92CSgmRFdQKDUyOCsxNiswLCJlc3AiKSwiZWF4Iik7CSMgc2F2ZSBYaQorICAgICZtb3YJKCZEV1AoNTI4KzE2KzgsImVzcCIpLCJlZHgiKTsJIyBzYXZlIGlucCtsZW4KKyAgICAmbW92CSgmRFdQKDUyOCsxNisxMiwiZXNwIiksImVicCIpOwkjIHNhdmUgb3JpZ2luYWwgJWVzcAorCisgICAgeyBteSBAbG8gID0gKCJtbTAiLCJtbTEiLCJtbTIiKTsKKyAgICAgIG15IEBoaSAgPSAoIm1tMyIsIm1tNCIsIm1tNSIpOworICAgICAgbXkgQHRtcCA9ICgibW02IiwibW03Iik7CisgICAgICBteSAoJG9mZjEsJG9mZjIsJGkpID0gKDAsMCwpOworCisgICAgICAmYWRkCSgkSHRibCwxMjgpOwkJCSMgb3B0aW1pemUgZm9yIHNpemUKKyAgICAgICZsZWEJKCJlZGkiLCZEV1AoMTYrMTI4LCJlc3AiKSk7CisgICAgICAmbGVhCSgiZWJwIiwmRFdQKDE2KzI1NisxMjgsImVzcCIpKTsKKworICAgICAgIyBkZWNvbXBvc2UgSHRhYmxlIChsb3cgYW5kIGhpZ2ggcGFydHMgYXJlIGtlcHQgc2VwYXJhdGVseSksCisgICAgICAjIGdlbmVyYXRlIEh0YWJsZVtdPj40LCAodTgpKEh0YWJsZVtdPDw0KSwgc2F2ZSB0byBzdGFjay4uLgorICAgICAgZm9yICgkaT0wOyRpPDE4OyRpKyspIHsKKworCSZtb3YJKCJlZHgiLCZEV1AoMTYqJGkrOC0xMjgsJEh0YmwpKQkJaWYgKCRpPDE2KTsKKwkmbW92cQkoJGxvWzBdLCZRV1AoMTYqJGkrOC0xMjgsJEh0YmwpKQlpZiAoJGk8MTYpOworCSZwc2xscQkoJHRtcFsxXSw2MCkJCQkJaWYgKCRpPjEpOworCSZtb3ZxCSgkaGlbMF0sJlFXUCgxNiokaSswLTEyOCwkSHRibCkpCWlmICgkaTwxNik7CisJJnBvcgkoJGxvWzJdLCR0bXBbMV0pCQkJaWYgKCRpPjEpOworCSZtb3ZxCSgmUVdQKCRvZmYxLTEyOCwiZWRpIiksJGxvWzFdKQkJaWYgKCRpPjAgJiYgJGk8MTcpOworCSZwc3JscQkoJGxvWzFdLDQpCQkJCWlmICgkaT4wICYmICRpPDE3KTsKKwkmbW92cQkoJlFXUCgkb2ZmMSwiZWRpIiksJGhpWzFdKQkJaWYgKCRpPjAgJiYgJGk8MTcpOworCSZtb3ZxCSgkdG1wWzBdLCRoaVsxXSkJCQlpZiAoJGk+MCAmJiAkaTwxNyk7CisJJm1vdnEJKCZRV1AoJG9mZjItMTI4LCJlYnAiKSwkbG9bMl0pCQlpZiAoJGk+MSk7CisJJnBzcmxxCSgkaGlbMV0sNCkJCQkJaWYgKCRpPjAgJiYgJGk8MTcpOworCSZtb3ZxCSgmUVdQKCRvZmYyLCJlYnAiKSwkaGlbMl0pCQlpZiAoJGk+MSk7CisJJnNobAkoImVkeCIsNCkJCQkJaWYgKCRpPDE2KTsKKwkmbW92CSgmQlAoJGksImVzcCIpLCZMQigiZWR4IikpCQlpZiAoJGk8MTYpOworCisJdW5zaGlmdAkoQGxvLHBvcChAbG8pKTsJCQkjICJyb3RhdGUiIHJlZ2lzdGVycworCXVuc2hpZnQJKEBoaSxwb3AoQGhpKSk7CisJdW5zaGlmdAkoQHRtcCxwb3AoQHRtcCkpOworCSRvZmYxICs9IDgJaWYgKCRpPjApOworCSRvZmYyICs9IDgJaWYgKCRpPjEpOworICAgICAgfQorICAgIH0KKworICAgICZtb3ZxCSgkWmhpLCZRV1AoMCwiZWF4IikpOworICAgICZtb3YJKCJlYngiLCZEV1AoOCwiZWF4IikpOworICAgICZtb3YJKCJlZHgiLCZEV1AoMTIsImVheCIpKTsJCSMgbG9hZCBYaQorCismc2V0X2xhYmVsKCJvdXRlciIsMTYpOworICB7IG15ICRubG8gPSAiZWF4IjsKKyAgICBteSAkZGF0ID0gImVkeCI7CisgICAgbXkgQG5oaSA9ICgiZWRpIiwiZWJwIik7CisgICAgbXkgQHJlbSA9ICgiZWJ4IiwiZWN4Iik7CisgICAgbXkgQHJlZCA9ICgibW0wIiwibW0xIiwibW0yIik7CisgICAgbXkgJHRtcCA9ICJtbTMiOworCisgICAgJnhvcgkoJGRhdCwmRFdQKDEyLCJlY3giKSk7CQkjIG1lcmdlIGlucHV0IGRhdGEKKyAgICAmeG9yCSgiZWJ4IiwmRFdQKDgsImVjeCIpKTsKKyAgICAmcHhvcgkoJFpoaSwmUVdQKDAsImVjeCIpKTsKKyAgICAmbGVhCSgiZWN4IiwmRFdQKDE2LCJlY3giKSk7CQkjIGlucCs9MTYKKyAgICAjJm1vdgkoJkRXUCg1MjgrMTIsImVzcCIpLCRkYXQpOwkjIHNhdmUgaW5wXlhpCisgICAgJm1vdgkoJkRXUCg1MjgrOCwiZXNwIiksImVieCIpOworICAgICZtb3ZxCSgmUVdQKDUyOCswLCJlc3AiKSwkWmhpKTsKKyAgICAmbW92CSgmRFdQKDUyOCsxNis0LCJlc3AiKSwiZWN4Iik7CSMgc2F2ZSBpbnAKKworICAgICZ4b3IJKCRubG8sJG5sbyk7CisgICAgJnJvbAkoJGRhdCw4KTsKKyAgICAmbW92CSgmTEIoJG5sbyksJkxCKCRkYXQpKTsKKyAgICAmbW92CSgkbmhpWzFdLCRubG8pOworICAgICZhbmQJKCZMQigkbmxvKSwweDBmKTsKKyAgICAmc2hyCSgkbmhpWzFdLDQpOworICAgICZweG9yCSgkcmVkWzBdLCRyZWRbMF0pOworICAgICZyb2wJKCRkYXQsOCk7CQkJIyBuZXh0IGJ5dGUKKyAgICAmcHhvcgkoJHJlZFsxXSwkcmVkWzFdKTsKKyAgICAmcHhvcgkoJHJlZFsyXSwkcmVkWzJdKTsKKworICAgICMgSnVzdCBsaWtlIGluICJNYXkiIHZlcnNvbiBtb2R1bG8tc2NoZWR1bGUgZm9yIGNyaXRpY2FsIHBhdGggaW4KKyAgICAjICdaLmhpIF49IHJlbV84Yml0W1oubG8mMHhmZl4oKHU4KUhbbmhpXTw8NCldPDw0OCcuIEZpbmFsICdweG9yJworICAgICMgaXMgc2NoZWR1bGVkIHNvIGxhdGUgdGhhdCByZW1fOGJpdFtdIGhhcyB0byBiZSBzaGlmdGVkICpyaWdodCoKKyAgICAjIGJ5IDE2LCB3aGljaCBpcyB3aHkgbGFzdCBhcmd1bWVudCB0byBwaW5zcncgaXMgMiwgd2hpY2gKKyAgICAjIGNvcnJlc3BvbmRzIHRvIDw8MzI9PDw0OD4+MTYuLi4KKyAgICBmb3IgKCRqPTExLCRpPTA7JGk8MTU7JGkrKykgeworCisgICAgICBpZiAoJGk+MCkgeworCSZweG9yCSgkWmxvLCZRV1AoMTYsImVzcCIsJG5sbyw4KSk7CQkjIFpePUhbbmxvXQorCSZyb2wJKCRkYXQsOCk7CQkJCSMgbmV4dCBieXRlCisJJnB4b3IJKCRaaGksJlFXUCgxNisxMjgsImVzcCIsJG5sbyw4KSk7CisKKwkmcHhvcgkoJFpsbywkdG1wKTsKKwkmcHhvcgkoJFpoaSwmUVdQKDE2KzI1NisxMjgsImVzcCIsJG5oaVswXSw4KSk7CisJJnhvcgkoJkxCKCRyZW1bMV0pLCZCUCgwLCJlc3AiLCRuaGlbMF0pKTsJIyByZW1eKEhbbmhpXTw8NCkKKyAgICAgIH0gZWxzZSB7CisJJm1vdnEJKCRabG8sJlFXUCgxNiwiZXNwIiwkbmxvLDgpKTsKKwkmbW92cQkoJFpoaSwmUVdQKDE2KzEyOCwiZXNwIiwkbmxvLDgpKTsKKyAgICAgIH0KKworCSZtb3YJKCZMQigkbmxvKSwmTEIoJGRhdCkpOworCSZtb3YJKCRkYXQsJkRXUCg1MjgrJGosImVzcCIpKQkJaWYgKC0tJGolND09MCk7CisKKwkmbW92ZAkoJHJlbVswXSwkWmxvKTsKKwkmbW92egkoJHJlbVsxXSwmTEIoJHJlbVsxXSkpCQkJaWYgKCRpPjApOworCSZwc3JscQkoJFpsbyw4KTsJCQkJIyBaPj49OAorCisJJm1vdnEJKCR0bXAsJFpoaSk7CisJJm1vdgkoJG5oaVswXSwkbmxvKTsKKwkmcHNybHEJKCRaaGksOCk7CisKKwkmcHhvcgkoJFpsbywmUVdQKDE2KzI1NiswLCJlc3AiLCRuaGlbMV0sOCkpOwkjIFpePUhbbmhpXT4+NAorCSZhbmQJKCZMQigkbmxvKSwweDBmKTsKKwkmcHNsbHEJKCR0bXAsNTYpOworCisJJnB4b3IJKCRaaGksJHJlZFsxXSkJCQkJaWYgKCRpPjEpOworCSZzaHIJKCRuaGlbMF0sNCk7CisJJnBpbnNydwkoJHJlZFswXSwmV1AoMCwkcmVtXzhiaXQsJHJlbVsxXSwyKSwyKQlpZiAoJGk+MCk7CisKKwl1bnNoaWZ0CShAcmVkLHBvcChAcmVkKSk7CQkJIyAicm90YXRlIiByZWdpc3RlcnMKKwl1bnNoaWZ0CShAcmVtLHBvcChAcmVtKSk7CisJdW5zaGlmdAkoQG5oaSxwb3AoQG5oaSkpOworICAgIH0KKworICAgICZweG9yCSgkWmxvLCZRV1AoMTYsImVzcCIsJG5sbyw4KSk7CQkjIFpePUhbbmxvXQorICAgICZweG9yCSgkWmhpLCZRV1AoMTYrMTI4LCJlc3AiLCRubG8sOCkpOworICAgICZ4b3IJKCZMQigkcmVtWzFdKSwmQlAoMCwiZXNwIiwkbmhpWzBdKSk7CSMgcmVtXihIW25oaV08PDQpCisKKyAgICAmcHhvcgkoJFpsbywkdG1wKTsKKyAgICAmcHhvcgkoJFpoaSwmUVdQKDE2KzI1NisxMjgsImVzcCIsJG5oaVswXSw4KSk7CisgICAgJm1vdnoJKCRyZW1bMV0sJkxCKCRyZW1bMV0pKTsKKworICAgICZweG9yCSgkcmVkWzJdLCRyZWRbMl0pOwkJCSMgY2xlYXIgMm5kIHdvcmQKKyAgICAmcHNsbHEJKCRyZWRbMV0sNCk7CisKKyAgICAmbW92ZAkoJHJlbVswXSwkWmxvKTsKKyAgICAmcHNybHEJKCRabG8sNCk7CQkJCSMgWj4+PTQKKworICAgICZtb3ZxCSgkdG1wLCRaaGkpOworICAgICZwc3JscQkoJFpoaSw0KTsKKyAgICAmc2hsCSgkcmVtWzBdLDQpOwkJCQkjIHJlbTw8NAorCisgICAgJnB4b3IJKCRabG8sJlFXUCgxNiwiZXNwIiwkbmhpWzFdLDgpKTsJIyBaXj1IW25oaV0KKyAgICAmcHNsbHEJKCR0bXAsNjApOworICAgICZtb3Z6CSgkcmVtWzBdLCZMQigkcmVtWzBdKSk7CisKKyAgICAmcHhvcgkoJFpsbywkdG1wKTsKKyAgICAmcHhvcgkoJFpoaSwmUVdQKDE2KzEyOCwiZXNwIiwkbmhpWzFdLDgpKTsKKworICAgICZwaW5zcncJKCRyZWRbMF0sJldQKDAsJHJlbV84Yml0LCRyZW1bMV0sMiksMik7CisgICAgJnB4b3IJKCRaaGksJHJlZFsxXSk7CisKKyAgICAmbW92ZAkoJGRhdCwkWmxvKTsKKyAgICAmcGluc3J3CSgkcmVkWzJdLCZXUCgwLCRyZW1fOGJpdCwkcmVtWzBdLDIpLDMpOwkjIGxhc3QgaXMgPDw0OAorCisgICAgJnBzbGxxCSgkcmVkWzBdLDEyKTsJCQkJIyBjb3JyZWN0IGJ5IDw8MTY+PjQKKyAgICAmcHhvcgkoJFpoaSwkcmVkWzBdKTsKKyAgICAmcHNybHEJKCRabG8sMzIpOworICAgICZweG9yCSgkWmhpLCRyZWRbMl0pOworCisgICAgJm1vdgkoImVjeCIsJkRXUCg1MjgrMTYrNCwiZXNwIikpOwkjIHJlc3RvcmUgaW5wCisgICAgJm1vdmQJKCJlYngiLCRabG8pOworICAgICZtb3ZxCSgkdG1wLCRaaGkpOwkJCSMgMDEyMzQ1NjcKKyAgICAmcHNsbHcJKCRaaGksOCk7CQkJIyAxLjMuNS43LgorICAgICZwc3JsdwkoJHRtcCw4KTsJCQkjIC4wLjIuNC42CisgICAgJnBvcgkoJFpoaSwkdG1wKTsJCQkjIDEwMzI1NDc2CisgICAgJmJzd2FwCSgkZGF0KTsKKyAgICAmcHNodWZ3CSgkWmhpLCRaaGksMGIwMDAxMTAxMSk7CQkjIDc2NTQzMjEwCisgICAgJmJzd2FwCSgiZWJ4Iik7CisgICAgCisgICAgJmNtcAkoImVjeCIsJkRXUCg1MjgrMTYrOCwiZXNwIikpOwkjIGFyZSB3ZSBkb25lPworICAgICZqbmUJKCZsYWJlbCgib3V0ZXIiKSk7CisgIH0KKworICAgICZtb3YJKCJlYXgiLCZEV1AoNTI4KzE2KzAsImVzcCIpKTsJIyByZXN0b3JlIFhpCisgICAgJm1vdgkoJkRXUCgxMiwiZWF4IiksImVkeCIpOworICAgICZtb3YJKCZEV1AoOCwiZWF4IiksImVieCIpOworICAgICZtb3ZxCSgmUVdQKDAsImVheCIpLCRaaGkpOworCisgICAgJm1vdgkoImVzcCIsJkRXUCg1MjgrMTYrMTIsImVzcCIpKTsJIyByZXN0b3JlIG9yaWdpbmFsICVlc3AKKyAgICAmZW1tcwkoKTsKK30KKyZmdW5jdGlvbl9lbmQoImdjbV9naGFzaF80Yml0X21teCIpOworfX0KKwwKK2lmICgkc3NlMikge3sKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUENMTVVMUURRIHZlcnNpb24uCisKKyRYaXA9ImVheCI7CiskSHRibD0iZWR4IjsKKyRjb25zdD0iZWN4IjsKKyRpbnA9ImVzaSI7CiskbGVuPSJlYngiOworCisoJFhpLCRYaGkpPSgieG1tMCIsInhtbTEiKTsJJEhrZXk9InhtbTIiOworKCRUMSwkVDIsJFQzKT0oInhtbTMiLCJ4bW00IiwieG1tNSIpOworKCRYbiwkWGhuKT0oInhtbTYiLCJ4bW03Iik7CisKKyZzdGF0aWNfbGFiZWwoImJzd2FwIik7CisKK3N1YiBjbG11bDY0eDY0X1QyIHsJIyBtaW5pbWFsICJyZWdpc3RlciIgcHJlc3N1cmUKK215ICgkWGhpLCRYaSwkSGtleSwkSEspPUBfOworCisJJm1vdmRxYQkJKCRYaGksJFhpKTsJCSMKKwkmcHNodWZkCQkoJFQxLCRYaSwwYjAxMDAxMTEwKTsKKwkmcHNodWZkCQkoJFQyLCRIa2V5LDBiMDEwMDExMTApCWlmICghZGVmaW5lZCgkSEspKTsKKwkmcHhvcgkJKCRUMSwkWGkpOwkJIworCSZweG9yCQkoJFQyLCRIa2V5KQkJaWYgKCFkZWZpbmVkKCRISykpOworCQkJJEhLPSRUMgkJCWlmICghZGVmaW5lZCgkSEspKTsKKworCSZwY2xtdWxxZHEJKCRYaSwkSGtleSwweDAwKTsJIyMjIyMjIworCSZwY2xtdWxxZHEJKCRYaGksJEhrZXksMHgxMSk7CSMjIyMjIyMKKwkmcGNsbXVscWRxCSgkVDEsJEhLLDB4MDApOwkJIyMjIyMjIworCSZ4b3JwcwkJKCRUMSwkWGkpOwkJIworCSZ4b3JwcwkJKCRUMSwkWGhpKTsJCSMKKworCSZtb3ZkcWEJCSgkVDIsJFQxKTsJCSMKKwkmcHNybGRxCQkoJFQxLDgpOworCSZwc2xsZHEJCSgkVDIsOCk7CQkjCisJJnB4b3IJCSgkWGhpLCRUMSk7CisJJnB4b3IJCSgkWGksJFQyKTsJCSMKK30KKworc3ViIGNsbXVsNjR4NjRfVDMgeworIyBFdmVuIHRob3VnaCB0aGlzIHN1YnJvdXRpbmUgb2ZmZXJzIHZpc3VhbGx5IGJldHRlciBJTFAsIGl0CisjIHdhcyBlbXBpcmljYWxseSBmb3VuZCB0byBiZSBhIHRhZCBzbG93ZXIgdGhhbiBhYm92ZSB2ZXJzaW9uLgorIyBBdCBsZWFzdCBpbiBnY21fZ2hhc2hfY2xtdWwgY29udGV4dC4gQnV0IGl0J3MganVzdCBhcyB3ZWxsLAorIyBiZWNhdXNlIGxvb3AgbW9kdWxvLXNjaGVkdWxpbmcgaXMgcG9zc2libGUgb25seSB0aGFua3MgdG8KKyMgbWluaW1pemVkICJyZWdpc3RlciIgcHJlc3N1cmUuLi4KK215ICgkWGhpLCRYaSwkSGtleSk9QF87CisKKwkmbW92ZHFhCQkoJFQxLCRYaSk7CQkjCisJJm1vdmRxYQkJKCRYaGksJFhpKTsKKwkmcGNsbXVscWRxCSgkWGksJEhrZXksMHgwMCk7CSMjIyMjIyMKKwkmcGNsbXVscWRxCSgkWGhpLCRIa2V5LDB4MTEpOwkjIyMjIyMjCisJJnBzaHVmZAkJKCRUMiwkVDEsMGIwMTAwMTExMCk7CSMKKwkmcHNodWZkCQkoJFQzLCRIa2V5LDBiMDEwMDExMTApOworCSZweG9yCQkoJFQyLCRUMSk7CQkjCisJJnB4b3IJCSgkVDMsJEhrZXkpOworCSZwY2xtdWxxZHEJKCRUMiwkVDMsMHgwMCk7CQkjIyMjIyMjCisJJnB4b3IJCSgkVDIsJFhpKTsJCSMKKwkmcHhvcgkJKCRUMiwkWGhpKTsJCSMKKworCSZtb3ZkcWEJCSgkVDMsJFQyKTsJCSMKKwkmcHNybGRxCQkoJFQyLDgpOworCSZwc2xsZHEJCSgkVDMsOCk7CQkjCisJJnB4b3IJCSgkWGhpLCRUMik7CisJJnB4b3IJCSgkWGksJFQzKTsJCSMKK30KKwwKK2lmICgxKSB7CQkjIEFsZ29yaXRobSA5IHdpdGggPDwxIHR3aXN0LgorCQkJIyBSZWR1Y3Rpb24gaXMgc2hvcnRlciBhbmQgdXNlcyBvbmx5IHR3bworCQkJIyB0ZW1wb3JhcnkgcmVnaXN0ZXJzLCB3aGljaCBtYWtlcyBpdCBiZXR0ZXIKKwkJCSMgY2FuZGlkYXRlIGZvciBpbnRlcmxlYXZpbmcgd2l0aCA2NHg2NAorCQkJIyBtdWx0aXBsaWNhdGlvbi4gUHJlLW1vZHVsby1zY2hlZHVsZWQgbG9vcAorCQkJIyB3YXMgZm91bmQgdG8gYmUgfjIwJSBmYXN0ZXIgdGhhbiBBbGdvcml0aG0gNQorCQkJIyBiZWxvdy4gQWxnb3JpdGhtIDkgd2FzIHRoZXJlZm9yZSBjaG9zZW4gZm9yCisJCQkjIGZ1cnRoZXIgb3B0aW1pemF0aW9uLi4uCisKK3N1YiByZWR1Y3Rpb25fYWxnOSB7CSMgMTcvMTEgdGltZXMgZmFzdGVyIHRoYW4gSW50ZWwgdmVyc2lvbgorbXkgKCRYaGksJFhpKSA9IEBfOworCisJIyAxc3QgcGhhc2UKKwkmbW92ZHFhCQkoJFQyLCRYaSk7CQkjCisJJm1vdmRxYQkJKCRUMSwkWGkpOworCSZwc2xscQkJKCRYaSw1KTsKKwkmcHhvcgkJKCRUMSwkWGkpOwkJIworCSZwc2xscQkJKCRYaSwxKTsKKwkmcHhvcgkJKCRYaSwkVDEpOwkJIworCSZwc2xscQkJKCRYaSw1Nyk7CQkjCisJJm1vdmRxYQkJKCRUMSwkWGkpOwkJIworCSZwc2xsZHEJCSgkWGksOCk7CisJJnBzcmxkcQkJKCRUMSw4KTsJCSMJCisJJnB4b3IJCSgkWGksJFQyKTsKKwkmcHhvcgkJKCRYaGksJFQxKTsJCSMKKworCSMgMm5kIHBoYXNlCisJJm1vdmRxYQkJKCRUMiwkWGkpOworCSZwc3JscQkJKCRYaSwxKTsKKwkmcHhvcgkJKCRYaGksJFQyKTsJCSMKKwkmcHhvcgkJKCRUMiwkWGkpOworCSZwc3JscQkJKCRYaSw1KTsKKwkmcHhvcgkJKCRYaSwkVDIpOwkJIworCSZwc3JscQkJKCRYaSwxKTsJCSMKKwkmcHhvcgkJKCRYaSwkWGhpKQkJIworfQorCismZnVuY3Rpb25fYmVnaW5fQigiZ2NtX2luaXRfY2xtdWwiKTsKKwkmbW92CQkoJEh0YmwsJndwYXJhbSgwKSk7CisJJm1vdgkJKCRYaXAsJndwYXJhbSgxKSk7CisKKwkmY2FsbAkJKCZsYWJlbCgicGljIikpOworJnNldF9sYWJlbCgicGljIik7CisJJmJsaW5kcG9wCSgkY29uc3QpOworCSZsZWEJCSgkY29uc3QsJkRXUCgmbGFiZWwoImJzd2FwIikuIi0iLiZsYWJlbCgicGljIiksJGNvbnN0KSk7CisKKwkmbW92ZHF1CQkoJEhrZXksJlFXUCgwLCRYaXApKTsKKwkmcHNodWZkCQkoJEhrZXksJEhrZXksMGIwMTAwMTExMCk7IyBkd29yZCBzd2FwCisKKwkjIDw8MSB0d2lzdAorCSZwc2h1ZmQJCSgkVDIsJEhrZXksMGIxMTExMTExMSk7CSMgYnJvYWRjYXN0IHVwcGVybW9zdCBkd29yZAorCSZtb3ZkcWEJCSgkVDEsJEhrZXkpOworCSZwc2xscQkJKCRIa2V5LDEpOworCSZweG9yCQkoJFQzLCRUMyk7CQkjCisJJnBzcmxxCQkoJFQxLDYzKTsKKwkmcGNtcGd0ZAkoJFQzLCRUMik7CQkjIGJyb2FkY2FzdCBjYXJyeSBiaXQKKwkmcHNsbGRxCQkoJFQxLDgpOworCSZwb3IJCSgkSGtleSwkVDEpOwkJIyBIPDw9MQorCisJIyBtYWdpYyByZWR1Y3Rpb24KKwkmcGFuZAkJKCRUMywmUVdQKDE2LCRjb25zdCkpOwkjIDB4MWMyX3BvbHlub21pYWwKKwkmcHhvcgkJKCRIa2V5LCRUMyk7CQkjIGlmKGNhcnJ5KSBIXj0weDFjMl9wb2x5bm9taWFsCisKKwkjIGNhbGN1bGF0ZSBIXjIKKwkmbW92ZHFhCQkoJFhpLCRIa2V5KTsKKwkmY2xtdWw2NHg2NF9UMgkoJFhoaSwkWGksJEhrZXkpOworCSZyZWR1Y3Rpb25fYWxnOQkoJFhoaSwkWGkpOworCisJJnBzaHVmZAkJKCRUMSwkSGtleSwwYjAxMDAxMTEwKTsKKwkmcHNodWZkCQkoJFQyLCRYaSwwYjAxMDAxMTEwKTsKKwkmcHhvcgkJKCRUMSwkSGtleSk7CQkjIEthcmF0c3ViYSBwcmUtcHJvY2Vzc2luZworCSZtb3ZkcXUJCSgmUVdQKDAsJEh0YmwpLCRIa2V5KTsJIyBzYXZlIEgKKwkmcHhvcgkJKCRUMiwkWGkpOwkJIyBLYXJhdHN1YmEgcHJlLXByb2Nlc3NpbmcKKwkmbW92ZHF1CQkoJlFXUCgxNiwkSHRibCksJFhpKTsJIyBzYXZlIEheMgorCSZwYWxpZ25yCSgkVDIsJFQxLDgpOwkJIyBsb3cgcGFydCBpcyBILmxvXkguaGkKKwkmbW92ZHF1CQkoJlFXUCgzMiwkSHRibCksJFQyKTsJIyBzYXZlIEthcmF0c3ViYSAic2FsdCIKKworCSZyZXQJCSgpOworJmZ1bmN0aW9uX2VuZF9CKCJnY21faW5pdF9jbG11bCIpOworCismZnVuY3Rpb25fYmVnaW5fQigiZ2NtX2dtdWx0X2NsbXVsIik7CisJJm1vdgkJKCRYaXAsJndwYXJhbSgwKSk7CisJJm1vdgkJKCRIdGJsLCZ3cGFyYW0oMSkpOworCisJJmNhbGwJCSgmbGFiZWwoInBpYyIpKTsKKyZzZXRfbGFiZWwoInBpYyIpOworCSZibGluZHBvcAkoJGNvbnN0KTsKKwkmbGVhCQkoJGNvbnN0LCZEV1AoJmxhYmVsKCJic3dhcCIpLiItIi4mbGFiZWwoInBpYyIpLCRjb25zdCkpOworCisJJm1vdmRxdQkJKCRYaSwmUVdQKDAsJFhpcCkpOworCSZtb3ZkcWEJCSgkVDMsJlFXUCgwLCRjb25zdCkpOworCSZtb3Z1cHMJCSgkSGtleSwmUVdQKDAsJEh0YmwpKTsKKwkmcHNodWZiCQkoJFhpLCRUMyk7CisJJm1vdnVwcwkJKCRUMiwmUVdQKDMyLCRIdGJsKSk7CisKKwkmY2xtdWw2NHg2NF9UMgkoJFhoaSwkWGksJEhrZXksJFQyKTsKKwkmcmVkdWN0aW9uX2FsZzkJKCRYaGksJFhpKTsKKworCSZwc2h1ZmIJCSgkWGksJFQzKTsKKwkmbW92ZHF1CQkoJlFXUCgwLCRYaXApLCRYaSk7CisKKwkmcmV0CSgpOworJmZ1bmN0aW9uX2VuZF9CKCJnY21fZ211bHRfY2xtdWwiKTsKKworJmZ1bmN0aW9uX2JlZ2luKCJnY21fZ2hhc2hfY2xtdWwiKTsKKwkmbW92CQkoJFhpcCwmd3BhcmFtKDApKTsKKwkmbW92CQkoJEh0YmwsJndwYXJhbSgxKSk7CisJJm1vdgkJKCRpbnAsJndwYXJhbSgyKSk7CisJJm1vdgkJKCRsZW4sJndwYXJhbSgzKSk7CisKKwkmY2FsbAkJKCZsYWJlbCgicGljIikpOworJnNldF9sYWJlbCgicGljIik7CisJJmJsaW5kcG9wCSgkY29uc3QpOworCSZsZWEJCSgkY29uc3QsJkRXUCgmbGFiZWwoImJzd2FwIikuIi0iLiZsYWJlbCgicGljIiksJGNvbnN0KSk7CisKKwkmbW92ZHF1CQkoJFhpLCZRV1AoMCwkWGlwKSk7CisJJm1vdmRxYQkJKCRUMywmUVdQKDAsJGNvbnN0KSk7CisJJm1vdmRxdQkJKCRIa2V5LCZRV1AoMCwkSHRibCkpOworCSZwc2h1ZmIJCSgkWGksJFQzKTsKKworCSZzdWIJCSgkbGVuLDB4MTApOworCSZqegkJKCZsYWJlbCgib2RkX3RhaWwiKSk7CisKKwkjIyMjIyMjCisJIyBYaSsyID1bSCooSWkrMSArIFhpKzEpXSBtb2QgUCA9CisJIwlbKEgqSWkrMSkgKyAoSCpYaSsxKV0gbW9kIFAgPQorCSMJWyhIKklpKzEpICsgSF4yKihJaStYaSldIG1vZCBQCisJIworCSZtb3ZkcXUJCSgkVDEsJlFXUCgwLCRpbnApKTsJIyBJaQorCSZtb3ZkcXUJCSgkWG4sJlFXUCgxNiwkaW5wKSk7CSMgSWkrMQorCSZwc2h1ZmIJCSgkVDEsJFQzKTsKKwkmcHNodWZiCQkoJFhuLCRUMyk7CisJJm1vdmRxdQkJKCRUMywmUVdQKDMyLCRIdGJsKSk7CisJJnB4b3IJCSgkWGksJFQxKTsJCSMgSWkrWGkKKworCSZwc2h1ZmQJCSgkVDEsJFhuLDBiMDEwMDExMTApOwkjIEgqSWkrMQorCSZtb3ZkcWEJCSgkWGhuLCRYbik7CisJJnB4b3IJCSgkVDEsJFhuKTsJCSMKKworCSZwY2xtdWxxZHEJKCRYbiwkSGtleSwweDAwKTsJIyMjIyMjIworCSZwY2xtdWxxZHEJKCRYaG4sJEhrZXksMHgxMSk7CSMjIyMjIyMKKwkmbW92dXBzCQkoJEhrZXksJlFXUCgxNiwkSHRibCkpOwkjIGxvYWQgSF4yCisJJnBjbG11bHFkcQkoJFQxLCRUMywweDAwKTsJCSMjIyMjIyMKKworCSZsZWEJCSgkaW5wLCZEV1AoMzIsJGlucCkpOwkjIGkrPTIKKwkmc3ViCQkoJGxlbiwweDIwKTsKKwkmamJlCQkoJmxhYmVsKCJldmVuX3RhaWwiKSk7CisJJmptcAkJKCZsYWJlbCgibW9kX2xvb3AiKSk7CisKKyZzZXRfbGFiZWwoIm1vZF9sb29wIiwzMik7CisJJnBzaHVmZAkJKCRUMiwkWGksMGIwMTAwMTExMCk7CSMgSF4yKihJaStYaSkKKwkmbW92ZHFhCQkoJFhoaSwkWGkpOworCSZweG9yCQkoJFQyLCRYaSk7CQkjCisKKwkmcGNsbXVscWRxCSgkWGksJEhrZXksMHgwMCk7CSMjIyMjIyMKKwkmcGNsbXVscWRxCSgkWGhpLCRIa2V5LDB4MTEpOwkjIyMjIyMjCisJJm1vdnVwcwkJKCRIa2V5LCZRV1AoMCwkSHRibCkpOwkjIGxvYWQgSAorCSZwY2xtdWxxZHEJKCRUMiwkVDMsMHgxMCk7CQkjIyMjIyMjCisJJm1vdmRxYQkJKCRUMywmUVdQKDAsJGNvbnN0KSk7CisKKwkmeG9ycHMJCSgkWGksJFhuKTsJCSMgKEgqSWkrMSkgKyBIXjIqKElpK1hpKQorCSZ4b3JwcwkJKCRYaGksJFhobik7CisJICZtb3ZkcXUJKCRYaG4sJlFXUCgwLCRpbnApKTsJIyBJaQorCSZweG9yCQkoJFQxLCRYaSk7CQkjIGFnZ3JlZ2F0ZWQgS2FyYXRzdWJhIHBvc3QtcHJvY2Vzc2luZworCSAmbW92ZHF1CSgkWG4sJlFXUCgxNiwkaW5wKSk7CSMgSWkrMQorCSZweG9yCQkoJFQxLCRYaGkpOwkJIworCisJJnB4b3IJCSgkVDIsJFQxKTsJCSMKKwkgJnBzaHVmYgkoJFhobiwkVDMpOworCisJJm1vdmRxYQkJKCRUMSwkVDIpOwkJIworCSZwc3JsZHEJCSgkVDIsOCk7CisJJnBzbGxkcQkJKCRUMSw4KTsJCSMKKwkmcHhvcgkJKCRYaGksJFQyKTsKKwkmcHhvcgkJKCRYaSwkVDEpOwkJIworCSAmcHNodWZiCSgkWG4sJFQzKTsKKwkgJnB4b3IJCSgkWGhpLCRYaG4pOwkJIyAiSWkrWGkiLCBjb25zdW1lIGVhcmx5CisKKwkmbW92ZHFhCQkoJFhobiwkWG4pOwkJIyZjbG11bDY0eDY0X1RYCSgkWGhuLCRYbiwkSGtleSk7IEgqSWkrMQorCSAgJm1vdmRxYQkoJFQyLCRYaSk7CQkjJnJlZHVjdGlvbl9hbGc5KCRYaGksJFhpKTsgMXN0IHBoYXNlCisJICAmbW92ZHFhCSgkVDEsJFhpKTsKKwkgICZwc2xscQkoJFhpLDUpOworCSAgJnB4b3IJCSgkVDEsJFhpKTsJCSMKKwkgICZwc2xscQkoJFhpLDEpOworCSAgJnB4b3IJCSgkWGksJFQxKTsJCSMKKwkmbW92dXBzCQkoJFQzLCZRV1AoMzIsJEh0YmwpKTsKKwkmcGNsbXVscWRxCSgkWG4sJEhrZXksMHgwMCk7CSMjIyMjIyMKKwkgICZwc2xscQkoJFhpLDU3KTsJCSMKKwkgICZtb3ZkcWEJKCRUMSwkWGkpOwkJIworCSAgJnBzbGxkcQkoJFhpLDgpOworCSAgJnBzcmxkcQkoJFQxLDgpOwkJIwkKKwkgICZweG9yCQkoJFhpLCRUMik7CisJICAmcHhvcgkJKCRYaGksJFQxKTsJCSMKKwkmcHNodWZkCQkoJFQxLCRYaG4sMGIwMTAwMTExMCk7CisJICAmbW92ZHFhCSgkVDIsJFhpKTsJCSMgMm5kIHBoYXNlCisJICAmcHNybHEJKCRYaSwxKTsKKwkmcHhvcgkJKCRUMSwkWGhuKTsKKwkmcGNsbXVscWRxCSgkWGhuLCRIa2V5LDB4MTEpOwkjIyMjIyMjCisJJm1vdnVwcwkJKCRIa2V5LCZRV1AoMTYsJEh0YmwpKTsJIyBsb2FkIEheMgorCSAgJnB4b3IJCSgkWGhpLCRUMik7CQkjCisJICAmcHhvcgkJKCRUMiwkWGkpOworCSAgJnBzcmxxCSgkWGksNSk7CisJICAmcHhvcgkJKCRYaSwkVDIpOwkJIworCSAgJnBzcmxxCSgkWGksMSk7CQkjCisJICAmcHhvcgkJKCRYaSwkWGhpKQkJIworCSZwY2xtdWxxZHEJKCRUMSwkVDMsMHgwMCk7CQkjIyMjIyMjCisKKwkmbGVhCQkoJGlucCwmRFdQKDMyLCRpbnApKTsKKwkmc3ViCQkoJGxlbiwweDIwKTsKKwkmamEJCSgmbGFiZWwoIm1vZF9sb29wIikpOworCismc2V0X2xhYmVsKCJldmVuX3RhaWwiKTsKKwkmcHNodWZkCQkoJFQyLCRYaSwwYjAxMDAxMTEwKTsJIyBIXjIqKElpK1hpKQorCSZtb3ZkcWEJCSgkWGhpLCRYaSk7CisJJnB4b3IJCSgkVDIsJFhpKTsJCSMKKworCSZwY2xtdWxxZHEJKCRYaSwkSGtleSwweDAwKTsJIyMjIyMjIworCSZwY2xtdWxxZHEJKCRYaGksJEhrZXksMHgxMSk7CSMjIyMjIyMKKwkmcGNsbXVscWRxCSgkVDIsJFQzLDB4MTApOwkJIyMjIyMjIworCSZtb3ZkcWEJCSgkVDMsJlFXUCgwLCRjb25zdCkpOworCisJJnhvcnBzCQkoJFhpLCRYbik7CQkjIChIKklpKzEpICsgSF4yKihJaStYaSkKKwkmeG9ycHMJCSgkWGhpLCRYaG4pOworCSZweG9yCQkoJFQxLCRYaSk7CQkjIGFnZ3JlZ2F0ZWQgS2FyYXRzdWJhIHBvc3QtcHJvY2Vzc2luZworCSZweG9yCQkoJFQxLCRYaGkpOwkJIworCisJJnB4b3IJCSgkVDIsJFQxKTsJCSMKKworCSZtb3ZkcWEJCSgkVDEsJFQyKTsJCSMKKwkmcHNybGRxCQkoJFQyLDgpOworCSZwc2xsZHEJCSgkVDEsOCk7CQkjCisJJnB4b3IJCSgkWGhpLCRUMik7CisJJnB4b3IJCSgkWGksJFQxKTsJCSMKKworCSZyZWR1Y3Rpb25fYWxnOQkoJFhoaSwkWGkpOworCisJJnRlc3QJCSgkbGVuLCRsZW4pOworCSZqbnoJCSgmbGFiZWwoImRvbmUiKSk7CisKKwkmbW92dXBzCQkoJEhrZXksJlFXUCgwLCRIdGJsKSk7CSMgbG9hZCBICismc2V0X2xhYmVsKCJvZGRfdGFpbCIpOworCSZtb3ZkcXUJCSgkVDEsJlFXUCgwLCRpbnApKTsJIyBJaQorCSZwc2h1ZmIJCSgkVDEsJFQzKTsKKwkmcHhvcgkJKCRYaSwkVDEpOwkJIyBJaStYaQorCisJJmNsbXVsNjR4NjRfVDIJKCRYaGksJFhpLCRIa2V5KTsJIyBIKihJaStYaSkKKwkmcmVkdWN0aW9uX2FsZzkJKCRYaGksJFhpKTsKKworJnNldF9sYWJlbCgiZG9uZSIpOworCSZwc2h1ZmIJCSgkWGksJFQzKTsKKwkmbW92ZHF1CQkoJlFXUCgwLCRYaXApLCRYaSk7CismZnVuY3Rpb25fZW5kKCJnY21fZ2hhc2hfY2xtdWwiKTsKKwwKK30gZWxzZSB7CQkjIEFsZ29yaXRoIDUuIEtlcHQgZm9yIHJlZmVyZW5jZSBwdXJwb3Nlcy4KKworc3ViIHJlZHVjdGlvbl9hbGc1IHsJIyAxOS8xNiB0aW1lcyBmYXN0ZXIgdGhhbiBJbnRlbCB2ZXJzaW9uCitteSAoJFhoaSwkWGkpPUBfOworCisJIyA8PDEKKwkmbW92ZHFhCQkoJFQxLCRYaSk7CQkjCisJJm1vdmRxYQkJKCRUMiwkWGhpKTsKKwkmcHNsbGQJCSgkWGksMSk7CisJJnBzbGxkCQkoJFhoaSwxKTsJCSMKKwkmcHNybGQJCSgkVDEsMzEpOworCSZwc3JsZAkJKCRUMiwzMSk7CQkjCisJJm1vdmRxYQkJKCRUMywkVDEpOworCSZwc2xsZHEJCSgkVDEsNCk7CisJJnBzcmxkcQkJKCRUMywxMik7CQkjCisJJnBzbGxkcQkJKCRUMiw0KTsKKwkmcG9yCQkoJFhoaSwkVDMpOwkJIworCSZwb3IJCSgkWGksJFQxKTsKKwkmcG9yCQkoJFhoaSwkVDIpOwkJIworCisJIyAxc3QgcGhhc2UKKwkmbW92ZHFhCQkoJFQxLCRYaSk7CisJJm1vdmRxYQkJKCRUMiwkWGkpOworCSZtb3ZkcWEJCSgkVDMsJFhpKTsJCSMKKwkmcHNsbGQJCSgkVDEsMzEpOworCSZwc2xsZAkJKCRUMiwzMCk7CisJJnBzbGxkCQkoJFhpLDI1KTsJCSMKKwkmcHhvcgkJKCRUMSwkVDIpOworCSZweG9yCQkoJFQxLCRYaSk7CQkjCisJJm1vdmRxYQkJKCRUMiwkVDEpOwkJIworCSZwc2xsZHEJCSgkVDEsMTIpOworCSZwc3JsZHEJCSgkVDIsNCk7CQkjCisJJnB4b3IJCSgkVDMsJFQxKTsKKworCSMgMm5kIHBoYXNlCisJJnB4b3IJCSgkWGhpLCRUMyk7CQkjCisJJm1vdmRxYQkJKCRYaSwkVDMpOworCSZtb3ZkcWEJCSgkVDEsJFQzKTsKKwkmcHNybGQJCSgkWGksMSk7CQkjCisJJnBzcmxkCQkoJFQxLDIpOworCSZwc3JsZAkJKCRUMyw3KTsJCSMKKwkmcHhvcgkJKCRYaSwkVDEpOworCSZweG9yCQkoJFhoaSwkVDIpOworCSZweG9yCQkoJFhpLCRUMyk7CQkjCisJJnB4b3IJCSgkWGksJFhoaSk7CQkjCit9CisKKyZmdW5jdGlvbl9iZWdpbl9CKCJnY21faW5pdF9jbG11bCIpOworCSZtb3YJCSgkSHRibCwmd3BhcmFtKDApKTsKKwkmbW92CQkoJFhpcCwmd3BhcmFtKDEpKTsKKworCSZjYWxsCQkoJmxhYmVsKCJwaWMiKSk7Cismc2V0X2xhYmVsKCJwaWMiKTsKKwkmYmxpbmRwb3AJKCRjb25zdCk7CisJJmxlYQkJKCRjb25zdCwmRFdQKCZsYWJlbCgiYnN3YXAiKS4iLSIuJmxhYmVsKCJwaWMiKSwkY29uc3QpKTsKKworCSZtb3ZkcXUJCSgkSGtleSwmUVdQKDAsJFhpcCkpOworCSZwc2h1ZmQJCSgkSGtleSwkSGtleSwwYjAxMDAxMTEwKTsjIGR3b3JkIHN3YXAKKworCSMgY2FsY3VsYXRlIEheMgorCSZtb3ZkcWEJCSgkWGksJEhrZXkpOworCSZjbG11bDY0eDY0X1QzCSgkWGhpLCRYaSwkSGtleSk7CisJJnJlZHVjdGlvbl9hbGc1CSgkWGhpLCRYaSk7CisKKwkmbW92ZHF1CQkoJlFXUCgwLCRIdGJsKSwkSGtleSk7CSMgc2F2ZSBICisJJm1vdmRxdQkJKCZRV1AoMTYsJEh0YmwpLCRYaSk7CSMgc2F2ZSBIXjIKKworCSZyZXQJCSgpOworJmZ1bmN0aW9uX2VuZF9CKCJnY21faW5pdF9jbG11bCIpOworCismZnVuY3Rpb25fYmVnaW5fQigiZ2NtX2dtdWx0X2NsbXVsIik7CisJJm1vdgkJKCRYaXAsJndwYXJhbSgwKSk7CisJJm1vdgkJKCRIdGJsLCZ3cGFyYW0oMSkpOworCisJJmNhbGwJCSgmbGFiZWwoInBpYyIpKTsKKyZzZXRfbGFiZWwoInBpYyIpOworCSZibGluZHBvcAkoJGNvbnN0KTsKKwkmbGVhCQkoJGNvbnN0LCZEV1AoJmxhYmVsKCJic3dhcCIpLiItIi4mbGFiZWwoInBpYyIpLCRjb25zdCkpOworCisJJm1vdmRxdQkJKCRYaSwmUVdQKDAsJFhpcCkpOworCSZtb3ZkcWEJCSgkWG4sJlFXUCgwLCRjb25zdCkpOworCSZtb3ZkcXUJCSgkSGtleSwmUVdQKDAsJEh0YmwpKTsKKwkmcHNodWZiCQkoJFhpLCRYbik7CisKKwkmY2xtdWw2NHg2NF9UMwkoJFhoaSwkWGksJEhrZXkpOworCSZyZWR1Y3Rpb25fYWxnNQkoJFhoaSwkWGkpOworCisJJnBzaHVmYgkJKCRYaSwkWG4pOworCSZtb3ZkcXUJCSgmUVdQKDAsJFhpcCksJFhpKTsKKworCSZyZXQJKCk7CismZnVuY3Rpb25fZW5kX0IoImdjbV9nbXVsdF9jbG11bCIpOworCismZnVuY3Rpb25fYmVnaW4oImdjbV9naGFzaF9jbG11bCIpOworCSZtb3YJCSgkWGlwLCZ3cGFyYW0oMCkpOworCSZtb3YJCSgkSHRibCwmd3BhcmFtKDEpKTsKKwkmbW92CQkoJGlucCwmd3BhcmFtKDIpKTsKKwkmbW92CQkoJGxlbiwmd3BhcmFtKDMpKTsKKworCSZjYWxsCQkoJmxhYmVsKCJwaWMiKSk7Cismc2V0X2xhYmVsKCJwaWMiKTsKKwkmYmxpbmRwb3AJKCRjb25zdCk7CisJJmxlYQkJKCRjb25zdCwmRFdQKCZsYWJlbCgiYnN3YXAiKS4iLSIuJmxhYmVsKCJwaWMiKSwkY29uc3QpKTsKKworCSZtb3ZkcXUJCSgkWGksJlFXUCgwLCRYaXApKTsKKwkmbW92ZHFhCQkoJFQzLCZRV1AoMCwkY29uc3QpKTsKKwkmbW92ZHF1CQkoJEhrZXksJlFXUCgwLCRIdGJsKSk7CisJJnBzaHVmYgkJKCRYaSwkVDMpOworCisJJnN1YgkJKCRsZW4sMHgxMCk7CisJJmp6CQkoJmxhYmVsKCJvZGRfdGFpbCIpKTsKKworCSMjIyMjIyMKKwkjIFhpKzIgPVtIKihJaSsxICsgWGkrMSldIG1vZCBQID0KKwkjCVsoSCpJaSsxKSArIChIKlhpKzEpXSBtb2QgUCA9CisJIwlbKEgqSWkrMSkgKyBIXjIqKElpK1hpKV0gbW9kIFAKKwkjCisJJm1vdmRxdQkJKCRUMSwmUVdQKDAsJGlucCkpOwkjIElpCisJJm1vdmRxdQkJKCRYbiwmUVdQKDE2LCRpbnApKTsJIyBJaSsxCisJJnBzaHVmYgkJKCRUMSwkVDMpOworCSZwc2h1ZmIJCSgkWG4sJFQzKTsKKwkmcHhvcgkJKCRYaSwkVDEpOwkJIyBJaStYaQorCisJJmNsbXVsNjR4NjRfVDMJKCRYaG4sJFhuLCRIa2V5KTsJIyBIKklpKzEKKwkmbW92ZHF1CQkoJEhrZXksJlFXUCgxNiwkSHRibCkpOwkjIGxvYWQgSF4yCisKKwkmc3ViCQkoJGxlbiwweDIwKTsKKwkmbGVhCQkoJGlucCwmRFdQKDMyLCRpbnApKTsJIyBpKz0yCisJJmpiZQkJKCZsYWJlbCgiZXZlbl90YWlsIikpOworCismc2V0X2xhYmVsKCJtb2RfbG9vcCIpOworCSZjbG11bDY0eDY0X1QzCSgkWGhpLCRYaSwkSGtleSk7CSMgSF4yKihJaStYaSkKKwkmbW92ZHF1CQkoJEhrZXksJlFXUCgwLCRIdGJsKSk7CSMgbG9hZCBICisKKwkmcHhvcgkJKCRYaSwkWG4pOwkJIyAoSCpJaSsxKSArIEheMiooSWkrWGkpCisJJnB4b3IJCSgkWGhpLCRYaG4pOworCisJJnJlZHVjdGlvbl9hbGc1CSgkWGhpLCRYaSk7CisKKwkjIyMjIyMjCisJJm1vdmRxYQkJKCRUMywmUVdQKDAsJGNvbnN0KSk7CisJJm1vdmRxdQkJKCRUMSwmUVdQKDAsJGlucCkpOwkjIElpCisJJm1vdmRxdQkJKCRYbiwmUVdQKDE2LCRpbnApKTsJIyBJaSsxCisJJnBzaHVmYgkJKCRUMSwkVDMpOworCSZwc2h1ZmIJCSgkWG4sJFQzKTsKKwkmcHhvcgkJKCRYaSwkVDEpOwkJIyBJaStYaQorCisJJmNsbXVsNjR4NjRfVDMJKCRYaG4sJFhuLCRIa2V5KTsJIyBIKklpKzEKKwkmbW92ZHF1CQkoJEhrZXksJlFXUCgxNiwkSHRibCkpOwkjIGxvYWQgSF4yCisKKwkmc3ViCQkoJGxlbiwweDIwKTsKKwkmbGVhCQkoJGlucCwmRFdQKDMyLCRpbnApKTsKKwkmamEJCSgmbGFiZWwoIm1vZF9sb29wIikpOworCismc2V0X2xhYmVsKCJldmVuX3RhaWwiKTsKKwkmY2xtdWw2NHg2NF9UMwkoJFhoaSwkWGksJEhrZXkpOwkjIEheMiooSWkrWGkpCisKKwkmcHhvcgkJKCRYaSwkWG4pOwkJIyAoSCpJaSsxKSArIEheMiooSWkrWGkpCisJJnB4b3IJCSgkWGhpLCRYaG4pOworCisJJnJlZHVjdGlvbl9hbGc1CSgkWGhpLCRYaSk7CisKKwkmbW92ZHFhCQkoJFQzLCZRV1AoMCwkY29uc3QpKTsKKwkmdGVzdAkJKCRsZW4sJGxlbik7CisJJmpuegkJKCZsYWJlbCgiZG9uZSIpKTsKKworCSZtb3ZkcXUJCSgkSGtleSwmUVdQKDAsJEh0YmwpKTsJIyBsb2FkIEgKKyZzZXRfbGFiZWwoIm9kZF90YWlsIik7CisJJm1vdmRxdQkJKCRUMSwmUVdQKDAsJGlucCkpOwkjIElpCisJJnBzaHVmYgkJKCRUMSwkVDMpOworCSZweG9yCQkoJFhpLCRUMSk7CQkjIElpK1hpCisKKwkmY2xtdWw2NHg2NF9UMwkoJFhoaSwkWGksJEhrZXkpOwkjIEgqKElpK1hpKQorCSZyZWR1Y3Rpb25fYWxnNQkoJFhoaSwkWGkpOworCisJJm1vdmRxYQkJKCRUMywmUVdQKDAsJGNvbnN0KSk7Cismc2V0X2xhYmVsKCJkb25lIik7CisJJnBzaHVmYgkJKCRYaSwkVDMpOworCSZtb3ZkcXUJCSgmUVdQKDAsJFhpcCksJFhpKTsKKyZmdW5jdGlvbl9lbmQoImdjbV9naGFzaF9jbG11bCIpOworCit9CisMCismc2V0X2xhYmVsKCJic3dhcCIsNjQpOworCSZkYXRhX2J5dGUoMTUsMTQsMTMsMTIsMTEsMTAsOSw4LDcsNiw1LDQsMywyLDEsMCk7CisJJmRhdGFfYnl0ZSgxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwweGMyKTsJIyAweDFjMl9wb2x5bm9taWFsCismc2V0X2xhYmVsKCJyZW1fOGJpdCIsNjQpOworCSZkYXRhX3Nob3J0KDB4MDAwMCwweDAxQzIsMHgwMzg0LDB4MDI0NiwweDA3MDgsMHgwNkNBLDB4MDQ4QywweDA1NEUpOworCSZkYXRhX3Nob3J0KDB4MEUxMCwweDBGRDIsMHgwRDk0LDB4MEM1NiwweDA5MTgsMHgwOERBLDB4MEE5QywweDBCNUUpOworCSZkYXRhX3Nob3J0KDB4MUMyMCwweDFERTIsMHgxRkE0LDB4MUU2NiwweDFCMjgsMHgxQUVBLDB4MThBQywweDE5NkUpOworCSZkYXRhX3Nob3J0KDB4MTIzMCwweDEzRjIsMHgxMUI0LDB4MTA3NiwweDE1MzgsMHgxNEZBLDB4MTZCQywweDE3N0UpOworCSZkYXRhX3Nob3J0KDB4Mzg0MCwweDM5ODIsMHgzQkM0LDB4M0EwNiwweDNGNDgsMHgzRThBLDB4M0NDQywweDNEMEUpOworCSZkYXRhX3Nob3J0KDB4MzY1MCwweDM3OTIsMHgzNUQ0LDB4MzQxNiwweDMxNTgsMHgzMDlBLDB4MzJEQywweDMzMUUpOworCSZkYXRhX3Nob3J0KDB4MjQ2MCwweDI1QTIsMHgyN0U0LDB4MjYyNiwweDIzNjgsMHgyMkFBLDB4MjBFQywweDIxMkUpOworCSZkYXRhX3Nob3J0KDB4MkE3MCwweDJCQjIsMHgyOUY0LDB4MjgzNiwweDJENzgsMHgyQ0JBLDB4MkVGQywweDJGM0UpOworCSZkYXRhX3Nob3J0KDB4NzA4MCwweDcxNDIsMHg3MzA0LDB4NzJDNiwweDc3ODgsMHg3NjRBLDB4NzQwQywweDc1Q0UpOworCSZkYXRhX3Nob3J0KDB4N0U5MCwweDdGNTIsMHg3RDE0LDB4N0NENiwweDc5OTgsMHg3ODVBLDB4N0ExQywweDdCREUpOworCSZkYXRhX3Nob3J0KDB4NkNBMCwweDZENjIsMHg2RjI0LDB4NkVFNiwweDZCQTgsMHg2QTZBLDB4NjgyQywweDY5RUUpOworCSZkYXRhX3Nob3J0KDB4NjJCMCwweDYzNzIsMHg2MTM0LDB4NjBGNiwweDY1QjgsMHg2NDdBLDB4NjYzQywweDY3RkUpOworCSZkYXRhX3Nob3J0KDB4NDhDMCwweDQ5MDIsMHg0QjQ0LDB4NEE4NiwweDRGQzgsMHg0RTBBLDB4NEM0QywweDREOEUpOworCSZkYXRhX3Nob3J0KDB4NDZEMCwweDQ3MTIsMHg0NTU0LDB4NDQ5NiwweDQxRDgsMHg0MDFBLDB4NDI1QywweDQzOUUpOworCSZkYXRhX3Nob3J0KDB4NTRFMCwweDU1MjIsMHg1NzY0LDB4NTZBNiwweDUzRTgsMHg1MjJBLDB4NTA2QywweDUxQUUpOworCSZkYXRhX3Nob3J0KDB4NUFGMCwweDVCMzIsMHg1OTc0LDB4NThCNiwweDVERjgsMHg1QzNBLDB4NUU3QywweDVGQkUpOworCSZkYXRhX3Nob3J0KDB4RTEwMCwweEUwQzIsMHhFMjg0LDB4RTM0NiwweEU2MDgsMHhFN0NBLDB4RTU4QywweEU0NEUpOworCSZkYXRhX3Nob3J0KDB4RUYxMCwweEVFRDIsMHhFQzk0LDB4RUQ1NiwweEU4MTgsMHhFOURBLDB4RUI5QywweEVBNUUpOworCSZkYXRhX3Nob3J0KDB4RkQyMCwweEZDRTIsMHhGRUE0LDB4RkY2NiwweEZBMjgsMHhGQkVBLDB4RjlBQywweEY4NkUpOworCSZkYXRhX3Nob3J0KDB4RjMzMCwweEYyRjIsMHhGMEI0LDB4RjE3NiwweEY0MzgsMHhGNUZBLDB4RjdCQywweEY2N0UpOworCSZkYXRhX3Nob3J0KDB4RDk0MCwweEQ4ODIsMHhEQUM0LDB4REIwNiwweERFNDgsMHhERjhBLDB4RERDQywweERDMEUpOworCSZkYXRhX3Nob3J0KDB4RDc1MCwweEQ2OTIsMHhENEQ0LDB4RDUxNiwweEQwNTgsMHhEMTlBLDB4RDNEQywweEQyMUUpOworCSZkYXRhX3Nob3J0KDB4QzU2MCwweEM0QTIsMHhDNkU0LDB4QzcyNiwweEMyNjgsMHhDM0FBLDB4QzFFQywweEMwMkUpOworCSZkYXRhX3Nob3J0KDB4Q0I3MCwweENBQjIsMHhDOEY0LDB4QzkzNiwweENDNzgsMHhDREJBLDB4Q0ZGQywweENFM0UpOworCSZkYXRhX3Nob3J0KDB4OTE4MCwweDkwNDIsMHg5MjA0LDB4OTNDNiwweDk2ODgsMHg5NzRBLDB4OTUwQywweDk0Q0UpOworCSZkYXRhX3Nob3J0KDB4OUY5MCwweDlFNTIsMHg5QzE0LDB4OURENiwweDk4OTgsMHg5OTVBLDB4OUIxQywweDlBREUpOworCSZkYXRhX3Nob3J0KDB4OERBMCwweDhDNjIsMHg4RTI0LDB4OEZFNiwweDhBQTgsMHg4QjZBLDB4ODkyQywweDg4RUUpOworCSZkYXRhX3Nob3J0KDB4ODNCMCwweDgyNzIsMHg4MDM0LDB4ODFGNiwweDg0QjgsMHg4NTdBLDB4ODczQywweDg2RkUpOworCSZkYXRhX3Nob3J0KDB4QTlDMCwweEE4MDIsMHhBQTQ0LDB4QUI4NiwweEFFQzgsMHhBRjBBLDB4QUQ0QywweEFDOEUpOworCSZkYXRhX3Nob3J0KDB4QTdEMCwweEE2MTIsMHhBNDU0LDB4QTU5NiwweEEwRDgsMHhBMTFBLDB4QTM1QywweEEyOUUpOworCSZkYXRhX3Nob3J0KDB4QjVFMCwweEI0MjIsMHhCNjY0LDB4QjdBNiwweEIyRTgsMHhCMzJBLDB4QjE2QywweEIwQUUpOworCSZkYXRhX3Nob3J0KDB4QkJGMCwweEJBMzIsMHhCODc0LDB4QjlCNiwweEJDRjgsMHhCRDNBLDB4QkY3QywweEJFQkUpOworfX0JIyAkc3NlMgorCismc2V0X2xhYmVsKCJyZW1fNGJpdCIsNjQpOworCSZkYXRhX3dvcmQoMCwweDAwMDA8PCRTLDAsMHgxQzIwPDwkUywwLDB4Mzg0MDw8JFMsMCwweDI0NjA8PCRTKTsKKwkmZGF0YV93b3JkKDAsMHg3MDgwPDwkUywwLDB4NkNBMDw8JFMsMCwweDQ4QzA8PCRTLDAsMHg1NEUwPDwkUyk7CisJJmRhdGFfd29yZCgwLDB4RTEwMDw8JFMsMCwweEZEMjA8PCRTLDAsMHhEOTQwPDwkUywwLDB4QzU2MDw8JFMpOworCSZkYXRhX3dvcmQoMCwweDkxODA8PCRTLDAsMHg4REEwPDwkUywwLDB4QTlDMDw8JFMsMCwweEI1RTA8PCRTKTsKK319fQkjICEkeDg2b25seQorCismYXNjaXooIkdIQVNIIGZvciB4ODYsIENSWVBUT0dBTVMgYnkgPGFwcHJvXEBvcGVuc3NsLm9yZz4iKTsKKyZhc21fZmluaXNoKCk7CisKKyMgQSBxdWVzdGlvbiB3YXMgcmlzZW4gYWJvdXQgY2hvaWNlIG9mIHZhbmlsbGEgTU1YLiBPciByYXRoZXIgd2h5IHdhc24ndAorIyBTU0UyIGNob3NlbiBpbnN0ZWFkPyBJbiBhZGRpdGlvbiB0byB0aGUgZmFjdCB0aGF0IE1NWCBydW5zIG9uIGxlZ2FjeQorIyBDUFVzIHN1Y2ggYXMgUElJSSwgIjQtYml0IiBNTVggdmVyc2lvbiB3YXMgb2JzZXJ2ZWQgdG8gcHJvdmlkZSBiZXR0ZXIKKyMgcGVyZm9ybWFuY2UgdGhhbiAqY29ycmVzcG9uZGluZyogU1NFMiBvbmUgZXZlbiBvbiBjb250ZW1wb3JhcnkgQ1BVcy4KKyMgU1NFMiByZXN1bHRzIHdlcmUgcHJvdmlkZWQgYnkgUGV0ZXItTWljaGFlbCBIYWdlci4gSGUgbWFpbnRhaW5zIFNTRTIKKyMgaW1wbGVtZW50YXRpb24gZmVhdHVyaW5nIGZ1bGwgcmFuZ2Ugb2YgbG9va3VwLXRhYmxlIHNpemVzLCBidXQgd2l0aAorIyBwZXItaW52b2NhdGlvbiBsb29rdXAgdGFibGUgc2V0dXAuIExhdHRlciBtZWFucyB0aGF0IHRhYmxlIHNpemUgaXMKKyMgY2hvc2VuIGRlcGVuZGluZyBvbiBob3cgbXVjaCBkYXRhIGlzIHRvIGJlIGhhc2hlZCBpbiBldmVyeSBnaXZlbiBjYWxsLAorIyBtb3JlIGRhdGEgLSBsYXJnZXIgdGFibGUuIEJlc3QgcmVwb3J0ZWQgcmVzdWx0IGZvciBDb3JlMiBpcyB+NCBjeWNsZXMKKyMgcGVyIHByb2Nlc3NlZCBieXRlIG91dCBvZiA2NEtCIGJsb2NrLiBUaGlzIG51bWJlciBhY2NvdW50cyBldmVuIGZvcgorIyA2NEtCIHRhYmxlIHNldHVwIG92ZXJoZWFkLiBBcyBkaXNjdXNzZWQgaW4gZ2NtMTI4LmMgd2UgY2hvb3NlIHRvIGJlCisjIG1vcmUgY29uc2VydmF0aXZlIGluIHJlc3BlY3QgdG8gbG9va3VwIHRhYmxlIHNpemVzLCBidXQgaG93IGRvIHRoZQorIyByZXN1bHRzIGNvbXBhcmU/IE1pbmltYWxpc3RpYyAiMjU2QiIgTU1YIHZlcnNpb24gZGVsaXZlcnMgfjExIGN5Y2xlcworIyBvbiBzYW1lIHBsYXRmb3JtLiBBcyBhbHNvIGRpc2N1c3NlZCBpbiBnY20xMjguYywgbmV4dCBpbiBsaW5lICI4LWJpdAorIyBTaG91cCdzIiBvciAiNEtCIiBtZXRob2Qgc2hvdWxkIGRlbGl2ZXIgdHdpY2UgdGhlIHBlcmZvcm1hbmNlIG9mCisjICIyNTZCIiBvbmUsIGluIG90aGVyIHdvcmRzIG5vdCB3b3JzZSB0aGFuIH42IGN5Y2xlcyBwZXIgYnl0ZS4gSXQKKyMgc2hvdWxkIGJlIGFsc28gYmUgbm90ZWQgdGhhdCBpbiBTU0UyIGNhc2UgaW1wcm92ZW1lbnQgY2FuIGJlICJzdXBlci0KKyMgbGluZWFyLCIgaS5lLiBtb3JlIHRoYW4gdHdpY2UsIG1vc3RseSBiZWNhdXNlID4+OCBtYXBzIHRvIHNpbmdsZQorIyBpbnN0cnVjdGlvbiBvbiBTU0UyIHJlZ2lzdGVyLiBUaGlzIGlzIHVubGlrZSAiNC1iaXQiIGNhc2Ugd2hlbiA+PjQKKyMgbWFwcyB0byBzYW1lIGFtb3VudCBvZiBpbnN0cnVjdGlvbnMgaW4gYm90aCBNTVggYW5kIFNTRTIgY2FzZXMuCisjIEJvdHRvbSBsaW5lIGlzIHRoYXQgc3dpdGNoIHRvIFNTRTIgaXMgY29uc2lkZXJlZCB0byBiZSBqdXN0aWZpYWJsZQorIyBvbmx5IGluIGNhc2Ugd2UgY2hvb3NlIHRvIGltcGxlbWVudCAiOC1iaXQiIG1ldGhvZC4uLgpkaWZmIC0tZ2l0IGEvY3J5cHRvL21vZGVzL2FzbS9naGFzaC14ODZfNjQucGwgYi9jcnlwdG8vbW9kZXMvYXNtL2doYXNoLXg4Nl82NC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTA0MjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL21vZGVzL2FzbS9naGFzaC14ODZfNjQucGwKQEAgLTAsMCArMSwxNzM2IEBACisjIS91c3IvYmluL2VudiBwZXJsCisjCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFdyaXR0ZW4gYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9Ab3BlbnNzbC5vcmc+IGZvciB0aGUgT3BlblNTTAorIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCisjIENSWVBUT0dBTVMgbGljZW5zZXMgZGVwZW5kaW5nIG9uIHdoZXJlIHlvdSBvYnRhaW4gaXQuIEZvciBmdXJ0aGVyCisjIGRldGFpbHMgc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvfmFwcHJvL2NyeXB0b2dhbXMvLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBNYXJjaCwgSnVuZSAyMDEwCisjCisjIFRoZSBtb2R1bGUgaW1wbGVtZW50cyAiNC1iaXQiIEdDTSBHSEFTSCBmdW5jdGlvbiBhbmQgdW5kZXJseWluZworIyBzaW5nbGUgbXVsdGlwbGljYXRpb24gb3BlcmF0aW9uIGluIEdGKDJeMTI4KS4gIjQtYml0IiBtZWFucyB0aGF0CisjIGl0IHVzZXMgMjU2IGJ5dGVzIHBlci1rZXkgdGFibGUgWysxMjggYnl0ZXMgc2hhcmVkIHRhYmxlXS4gR0hBU0gKKyMgZnVuY3Rpb24gZmVhdHVyZXMgc28gY2FsbGVkICI1MjhCIiB2YXJpYW50IHV0aWxpemluZyBhZGRpdGlvbmFsCisjIDI1NisxNiBieXRlcyBvZiBwZXIta2V5IHN0b3JhZ2UgWys1MTIgYnl0ZXMgc2hhcmVkIHRhYmxlXS4KKyMgUGVyZm9ybWFuY2UgcmVzdWx0cyBhcmUgZm9yIHRoaXMgc3RyZWFtZWQgR0hBU0ggc3Vicm91dGluZSBhbmQgYXJlCisjIGV4cHJlc3NlZCBpbiBjeWNsZXMgcGVyIHByb2Nlc3NlZCBieXRlLCBsZXNzIGlzIGJldHRlcjoKKyMKKyMJCWdjYyAzLjQueCgqKQlhc3NlbWJsZXIKKyMKKyMgUDQJCTI4LjYJCTE0LjAJCSsxMDAlCisjIE9wdGVyb24JMTkuMwkJNy43CQkrMTUwJQorIyBDb3JlMgkJMTcuOAkJOC4xKCoqKQkJKzEyMCUKKyMgQXRvbQkJMzEuNgkJMTYuOAkJKzg4JQorIyBWSUEgTmFubwkyMS44CQkxMC4xCQkrMTE1JQorIworIyAoKikJY29tcGFyaXNvbiBpcyBub3QgY29tcGxldGVseSBmYWlyLCBiZWNhdXNlIEMgcmVzdWx0cyBhcmUKKyMJZm9yIHZhbmlsbGEgIjI1NkIiIGltcGxlbWVudGF0aW9uLCB3aGlsZSBhc3NlbWJsZXIgcmVzdWx0cworIwlhcmUgZm9yICI1MjhCIjstKQorIyAoKiopCWl0J3MgbXlzdGVyeSBbdG8gbWVdIHdoeSBDb3JlMiByZXN1bHQgaXMgbm90IHNhbWUgYXMgZm9yCisjCU9wdGVyb247CisKKyMgTWF5IDIwMTAKKyMKKyMgQWRkIFBDTE1VTFFEUSB2ZXJzaW9uIHBlcmZvcm1pbmcgYXQgMi4wMiBjeWNsZXMgcGVyIHByb2Nlc3NlZCBieXRlLgorIyBTZWUgZ2hhc2gteDg2LnBsIGZvciBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGFuZCBkZXRhaWxzIGFib3V0IGNvZGluZworIyB0ZWNobmlxdWVzLgorIworIyBTcGVjaWFsIHRoYW5rcyB0byBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+IGZvcgorIyBwcm92aWRpbmcgYWNjZXNzIHRvIGEgV2VzdG1lcmUtYmFzZWQgc3lzdGVtIG9uIGJlaGFsZiBvZiBJbnRlbAorIyBPcGVuIFNvdXJjZSBUZWNobm9sb2d5IENlbnRyZS4KKworIyBEZWNlbWJlciAyMDEyCisjCisjIE92ZXJoYXVsOiBhZ2dyZWdhdGUgS2FyYXRzdWJhIHBvc3QtcHJvY2Vzc2luZywgaW1wcm92ZSBJTFAgaW4KKyMgcmVkdWN0aW9uX2FsZzksIGluY3JlYXNlIHJlZHVjdGlvbiBhZ2dyZWdhdGUgZmFjdG9yIHRvIDR4LiBBcyBmb3IKKyMgdGhlIGxhdHRlci4gZ2hhc2gteDg2LnBsIGRpc2N1c3NlcyB0aGF0IGl0IG1ha2VzIGxlc3NlciBzZW5zZSB0bworIyBpbmNyZWFzZSBhZ2dyZWdhdGUgZmFjdG9yLiBUaGVuIHdoeSBpbmNyZWFzZSBoZXJlPyBDcml0aWNhbCBwYXRoCisjIGNvbnNpc3RzIG9mIDMgaW5kZXBlbmRlbnQgcGNsbXVscWRxIGluc3RydWN0aW9ucywgS2FyYXRzdWJhIHBvc3QtCisjIHByb2Nlc3NpbmcgYW5kIHJlZHVjdGlvbi4gIk9uIHRvcCIgb2YgdGhpcyB3ZSBsYXkgZG93biBhZ2dyZWdhdGVkCisjIG11bHRpcGxpY2F0aW9uIG9wZXJhdGlvbnMsIHRyaXBsZXRzIG9mIGluZGVwZW5kZW50IHBjbG11bHFkcSdzLiBBcworIyBpc3N1ZSByYXRlIGZvciBwY2xtdWxxZHEgaXMgbGltaXRlZCwgaXQgbWFrZXMgbGVzc2VyIHNlbnNlIHRvCisjIGFnZ3JlZ2F0ZSBtb3JlIG11bHRpcGxpY2F0aW9ucyB0aGFuIGl0IHRha2VzIHRvIHBlcmZvcm0gcmVtYWluaW5nCisjIG5vbi1tdWx0aXBsaWNhdGlvbiBvcGVyYXRpb25zLiAyeCBpcyBuZWFyLW9wdGltYWwgY29lZmZpY2llbnQgZm9yCisjIGNvbnRlbXBvcmFyeSBJbnRlbCBDUFVzICh0aGVyZWZvcmUgbW9kZXN0IGltcHJvdmVtZW50IGNvZWZmaWNpZW50KSwKKyMgYnV0IG5vdCBmb3IgQnVsbGRvemVyLiBMYXR0ZXIgaXMgYmVjYXVzZSBsb2dpY2FsIFNJTUQgb3BlcmF0aW9ucworIyBhcmUgdHdpY2UgYXMgc2xvdyBpbiBjb21wYXJpc29uIHRvIEludGVsLCBzbyB0aGF0IGNyaXRpY2FsIHBhdGggaXMKKyMgbG9uZ2VyLiBBIENQVSB3aXRoIGhpZ2hlciBwY2xtdWxxZHEgaXNzdWUgcmF0ZSB3b3VsZCBhbHNvIGJlbmVmaXQKKyMgZnJvbSBoaWdoZXIgYWdncmVnYXRlIGZhY3Rvci4uLgorIworIyBXZXN0bWVyZQkxLjc2KCsxNCUpCisjIFNhbmR5IEJyaWRnZQkxLjc5KCs5JSkKKyMgSXZ5IEJyaWRnZQkxLjc5KCs4JSkKKyMgSGFzd2VsbAkwLjU1KCs5MyUpIChpZiBzeXN0ZW0gZG9lc24ndCBzdXBwb3J0IEFWWCkKKyMgQnVsbGRvemVyCTEuNTIoKzI1JSkKKworIyBNYXJjaCAyMDEzCisjCisjIC4uLiA4eCBhZ2dyZWdhdGUgZmFjdG9yIEFWWCBjb2RlIHBhdGggaXMgdXNpbmcgcmVkdWN0aW9uIGFsZ29yaXRobQorIyBzdWdnZXN0ZWQgYnkgU2hheSBHdWVyb25bMV0uIEV2ZW4gdGhvdWdoIGNvbnRlbXBvcmFyeSBBVlgtY2FwYWJsZQorIyBDUFVzIHN1Y2ggYXMgU2FuZHkgYW5kIEl2eSBCcmlkZ2UgY2FuIGV4ZWN1dGUgaXQsIHRoZSBjb2RlIHBlcmZvcm1zCisjIHN1Yi1vcHRpbWFsbHkgaW4gY29tcGFyaXNvbiB0byBhYm92ZSBtZW50aW9uZWQgdmVyc2lvbi4gQnV0IHRoYW5rcworIyB0byBJbHlhIEFsYnJla2h0IGFuZCBNYXggTG9ja3R5dWtoaW4gb2YgSW50ZWwgQ29ycC4gd2Uga25ldyB0aGF0CisjIGl0IHBlcmZvcm1zIGluIDAuNDEgY3ljbGVzIHBlciBieXRlIG9uIEhhc3dlbGwgcHJvY2Vzc29yLgorIworIyBbMV0gaHR0cDovL3J0Lm9wZW5zc2wub3JnL1RpY2tldC9EaXNwbGF5Lmh0bWw/aWQ9MjkwMCZ1c2VyPWd1ZXN0JnBhc3M9Z3Vlc3QKKworJGZsYXZvdXIgPSBzaGlmdDsKKyRvdXRwdXQgID0gc2hpZnQ7CitpZiAoJGZsYXZvdXIgPX4gL1wuLykgeyAkb3V0cHV0ID0gJGZsYXZvdXI7IHVuZGVmICRmbGF2b3VyOyB9CisKKyR3aW42ND0wOyAkd2luNjQ9MSBpZiAoJGZsYXZvdXIgPX4gL1tubV1hc218bWluZ3c2NC8gfHwgJG91dHB1dCA9fiAvXC5hc20kLyk7CisKKyQwID1+IG0vKC4qW1wvXFxdKVteXC9cXF0rJC87ICRkaXI9JDE7CisoICR4bGF0ZT0iJHtkaXJ9eDg2XzY0LXhsYXRlLnBsIiBhbmQgLWYgJHhsYXRlICkgb3IKKyggJHhsYXRlPSIke2Rpcn0uLi8uLi9wZXJsYXNtL3g4Nl82NC14bGF0ZS5wbCIgYW5kIC1mICR4bGF0ZSkgb3IKK2RpZSAiY2FuJ3QgbG9jYXRlIHg4Nl82NC14bGF0ZS5wbCI7CisKK2lmIChgJEVOVntDQ30gLVdhLC12IC1jIC1vIC9kZXYvbnVsbCAteCBhc3NlbWJsZXIgL2Rldi9udWxsIDI+JjFgCisJCT1+IC9HTlUgYXNzZW1ibGVyIHZlcnNpb24gKFsyLTldXC5bMC05XSspLykgeworCSRhdnggPSAoJDE+PTIuMTkpICsgKCQxPj0yLjIyKTsKK30KKworaWYgKCEkYXZ4ICYmICR3aW42NCAmJiAoJGZsYXZvdXIgPX4gL25hc20vIHx8ICRFTlZ7QVNNfSA9fiAvbmFzbS8pICYmCisJICAgIGBuYXNtIC12IDI+JjFgID1+IC9OQVNNIHZlcnNpb24gKFsyLTldXC5bMC05XSspLykgeworCSRhdnggPSAoJDE+PTIuMDkpICsgKCQxPj0yLjEwKTsKK30KKworaWYgKCEkYXZ4ICYmICR3aW42NCAmJiAoJGZsYXZvdXIgPX4gL21hc20vIHx8ICRFTlZ7QVNNfSA9fiAvbWw2NC8pICYmCisJICAgIGBtbDY0IDI+JjFgID1+IC9WZXJzaW9uIChbMC05XSspXC4vKSB7CisJJGF2eCA9ICgkMT49MTApICsgKCQxPj0xMSk7Cit9CisKK29wZW4gT1VULCJ8IFwiJF5YXCIgJHhsYXRlICRmbGF2b3VyICRvdXRwdXQiOworKlNURE9VVD0qT1VUOworCiskZG80eGFnZ3I9MTsKKworIyBjb21tb24gcmVnaXN0ZXIgbGF5b3V0CiskbmxvPSIlcmF4IjsKKyRuaGk9IiVyYngiOworJFpsbz0iJXI4IjsKKyRaaGk9IiVyOSI7CiskdG1wPSIlcjEwIjsKKyRyZW1fNGJpdCA9ICIlcjExIjsKKworJFhpPSIlcmRpIjsKKyRIdGJsPSIlcnNpIjsKKworIyBwZXItZnVuY3Rpb24gcmVnaXN0ZXIgbGF5b3V0CiskY250PSIlcmN4IjsKKyRyZW09IiVyZHgiOworCitzdWIgTEIoKSB7IG15ICRyPXNoaWZ0OyAkciA9fiBzLyVbZXJdKFthLWRdKXgvJVwxbC8Jb3IKKwkJCSRyID1+IHMvJVtlcl0oW3NkXWkpLyVcMWwvCW9yCisJCQkkciA9fiBzLyVbZXJdKGJwKS8lXDFsLwkJb3IKKwkJCSRyID1+IHMvJShyWzAtOV0rKVtkXT8vJVwxYi87ICAgJHI7IH0KKworc3ViIEFVVE9MT0FEKCkJCSMgdGh1bmsgW3NpbXBsaWZpZWRdIDMyLWJpdCBzdHlsZSBwZXJsYXNtCit7IG15ICRvcGNvZGUgPSAkQVVUT0xPQUQ7ICRvcGNvZGUgPX4gcy8uKjo6Ly87CisgIG15ICRhcmcgPSBwb3A7CisgICAgJGFyZyA9ICJcJCRhcmciIGlmICgkYXJnKjEgZXEgJGFyZyk7CisgICAgJGNvZGUgLj0gIlx0JG9wY29kZVx0Ii5qb2luKCcsJywkYXJnLHJldmVyc2UgQF8pLiJcbiI7Cit9CisMCit7IG15ICROOworICBzdWIgbG9vcCgpIHsKKyAgbXkgJGlucCA9IHNoaWZ0OworCisJJE4rKzsKKyRjb2RlLj08PF9fXzsKKwl4b3IJJG5sbywkbmxvCisJeG9yCSRuaGksJG5oaQorCW1vdglgJkxCKCIkWmxvIilgLGAmTEIoIiRubG8iKWAKKwltb3YJYCZMQigiJFpsbyIpYCxgJkxCKCIkbmhpIilgCisJc2hsCVwkNCxgJkxCKCIkbmxvIilgCisJbW92CVwkMTQsJGNudAorCW1vdgk4KCRIdGJsLCRubG8pLCRabG8KKwltb3YJKCRIdGJsLCRubG8pLCRaaGkKKwlhbmQJXCQweGYwLGAmTEIoIiRuaGkiKWAKKwltb3YJJFpsbywkcmVtCisJam1wCS5Mb29wJE4KKworLmFsaWduCTE2CisuTG9vcCROOgorCXNocglcJDQsJFpsbworCWFuZAlcJDB4ZiwkcmVtCisJbW92CSRaaGksJHRtcAorCW1vdgkoJGlucCwkY250KSxgJkxCKCIkbmxvIilgCisJc2hyCVwkNCwkWmhpCisJeG9yCTgoJEh0YmwsJG5oaSksJFpsbworCXNobAlcJDYwLCR0bXAKKwl4b3IJKCRIdGJsLCRuaGkpLCRaaGkKKwltb3YJYCZMQigiJG5sbyIpYCxgJkxCKCIkbmhpIilgCisJeG9yCSgkcmVtXzRiaXQsJHJlbSw4KSwkWmhpCisJbW92CSRabG8sJHJlbQorCXNobAlcJDQsYCZMQigiJG5sbyIpYAorCXhvcgkkdG1wLCRabG8KKwlkZWMJJGNudAorCWpzCS5MYnJlYWskTgorCisJc2hyCVwkNCwkWmxvCisJYW5kCVwkMHhmLCRyZW0KKwltb3YJJFpoaSwkdG1wCisJc2hyCVwkNCwkWmhpCisJeG9yCTgoJEh0YmwsJG5sbyksJFpsbworCXNobAlcJDYwLCR0bXAKKwl4b3IJKCRIdGJsLCRubG8pLCRaaGkKKwlhbmQJXCQweGYwLGAmTEIoIiRuaGkiKWAKKwl4b3IJKCRyZW1fNGJpdCwkcmVtLDgpLCRaaGkKKwltb3YJJFpsbywkcmVtCisJeG9yCSR0bXAsJFpsbworCWptcAkuTG9vcCROCisKKy5hbGlnbgkxNgorLkxicmVhayROOgorCXNocglcJDQsJFpsbworCWFuZAlcJDB4ZiwkcmVtCisJbW92CSRaaGksJHRtcAorCXNocglcJDQsJFpoaQorCXhvcgk4KCRIdGJsLCRubG8pLCRabG8KKwlzaGwJXCQ2MCwkdG1wCisJeG9yCSgkSHRibCwkbmxvKSwkWmhpCisJYW5kCVwkMHhmMCxgJkxCKCIkbmhpIilgCisJeG9yCSgkcmVtXzRiaXQsJHJlbSw4KSwkWmhpCisJbW92CSRabG8sJHJlbQorCXhvcgkkdG1wLCRabG8KKworCXNocglcJDQsJFpsbworCWFuZAlcJDB4ZiwkcmVtCisJbW92CSRaaGksJHRtcAorCXNocglcJDQsJFpoaQorCXhvcgk4KCRIdGJsLCRuaGkpLCRabG8KKwlzaGwJXCQ2MCwkdG1wCisJeG9yCSgkSHRibCwkbmhpKSwkWmhpCisJeG9yCSR0bXAsJFpsbworCXhvcgkoJHJlbV80Yml0LCRyZW0sOCksJFpoaQorCisJYnN3YXAJJFpsbworCWJzd2FwCSRaaGkKK19fXworfX0KKworJGNvZGU9PDxfX187CisudGV4dAorCisuZ2xvYmwJZ2NtX2dtdWx0XzRiaXQKKy50eXBlCWdjbV9nbXVsdF80Yml0LFxAZnVuY3Rpb24sMgorLmFsaWduCTE2CitnY21fZ211bHRfNGJpdDoKKwlwdXNoCSVyYngKKwlwdXNoCSVyYnAJCSMgJXJicCBhbmQgJXIxMiBhcmUgcHVzaGVkIGV4Y2x1c2l2ZWx5IGluCisJcHVzaAklcjEyCQkjIG9yZGVyIHRvIHJldXNlIFdpbjY0IGV4Y2VwdGlvbiBoYW5kbGVyLi4uCisuTGdtdWx0X3Byb2xvZ3VlOgorCisJbW92emIJMTUoJFhpKSwkWmxvCisJbGVhCS5McmVtXzRiaXQoJXJpcCksJHJlbV80Yml0CitfX18KKwkmbG9vcAkoJFhpKTsKKyRjb2RlLj08PF9fXzsKKwltb3YJJFpsbyw4KCRYaSkKKwltb3YJJFpoaSwoJFhpKQorCisJbW92CTE2KCVyc3ApLCVyYngKKwlsZWEJMjQoJXJzcCksJXJzcAorLkxnbXVsdF9lcGlsb2d1ZToKKwlyZXQKKy5zaXplCWdjbV9nbXVsdF80Yml0LC4tZ2NtX2dtdWx0XzRiaXQKK19fXworDAorIyBwZXItZnVuY3Rpb24gcmVnaXN0ZXIgbGF5b3V0CiskaW5wPSIlcmR4IjsKKyRsZW49IiVyY3giOworJHJlbV84Yml0PSRyZW1fNGJpdDsKKworJGNvZGUuPTw8X19fOworLmdsb2JsCWdjbV9naGFzaF80Yml0CisudHlwZQlnY21fZ2hhc2hfNGJpdCxcQGZ1bmN0aW9uLDQKKy5hbGlnbgkxNgorZ2NtX2doYXNoXzRiaXQ6CisJcHVzaAklcmJ4CisJcHVzaAklcmJwCisJcHVzaAklcjEyCisJcHVzaAklcjEzCisJcHVzaAklcjE0CisJcHVzaAklcjE1CisJc3ViCVwkMjgwLCVyc3AKKy5MZ2hhc2hfcHJvbG9ndWU6CisJbW92CSRpbnAsJXIxNAkJIyByZWFzc2lnbiBjb3VwbGUgb2YgYXJncworCW1vdgkkbGVuLCVyMTUKK19fXworeyBteSAkaW5wPSIlcjE0IjsKKyAgbXkgJGRhdD0iJWVkeCI7CisgIG15ICRsZW49IiVyMTUiOworICBteSBAbmhpPSgiJWVieCIsIiVlY3giKTsKKyAgbXkgQHJlbT0oIiVyMTIiLCIlcjEzIik7CisgIG15ICRIc2hyND0iJXJicCI7CisKKwkmc3ViCSgkSHRibCwtMTI4KTsJCSMgc2l6ZSBvcHRpbWl6YXRpb24KKwkmbGVhCSgkSHNocjQsIjE2KzEyOCglcnNwKSIpOworCXsgbXkgQGxvID0oJG5sbywkbmhpKTsKKyAgICAgICAgICBteSBAaGkgPSgkWmxvLCRaaGkpOworCisJICAmeG9yCSgkZGF0LCRkYXQpOworCSAgZm9yICgkaT0wLCRqPS0yOyRpPDE4OyRpKyssJGorKykgeworCSAgICAmbW92CSgiJGooJXJzcCkiLCZMQigkZGF0KSkJCWlmICgkaT4xKTsKKwkgICAgJm9yCQkoJGxvWzBdLCR0bXApCQkJaWYgKCRpPjEpOworCSAgICAmbW92CSgmTEIoJGRhdCksJkxCKCRsb1sxXSkpCQlpZiAoJGk+MCAmJiAkaTwxNyk7CisJICAgICZzaHIJKCRsb1sxXSw0KQkJCWlmICgkaT4wICYmICRpPDE3KTsKKwkgICAgJm1vdgkoJHRtcCwkaGlbMV0pCQkJaWYgKCRpPjAgJiYgJGk8MTcpOworCSAgICAmc2hyCSgkaGlbMV0sNCkJCQlpZiAoJGk+MCAmJiAkaTwxNyk7CisJICAgICZtb3YJKCI4KiRqKCRIc2hyNCkiLCRoaVswXSkJCWlmICgkaT4xKTsKKwkgICAgJm1vdgkoJGhpWzBdLCIxNiokaSswLTEyOCgkSHRibCkiKQlpZiAoJGk8MTYpOworCSAgICAmc2hsCSgmTEIoJGRhdCksNCkJCQlpZiAoJGk+MCAmJiAkaTwxNyk7CisJICAgICZtb3YJKCI4KiRqLTEyOCgkSHNocjQpIiwkbG9bMF0pCWlmICgkaT4xKTsKKwkgICAgJm1vdgkoJGxvWzBdLCIxNiokaSs4LTEyOCgkSHRibCkiKQlpZiAoJGk8MTYpOworCSAgICAmc2hsCSgkdG1wLDYwKQkJCWlmICgkaT4wICYmICRpPDE3KTsKKworCSAgICBwdXNoCShAbG8sc2hpZnQoQGxvKSk7CisJICAgIHB1c2gJKEBoaSxzaGlmdChAaGkpKTsKKwkgIH0KKwl9CisJJmFkZAkoJEh0YmwsLTEyOCk7CisJJm1vdgkoJFpsbywiOCgkWGkpIik7CisJJm1vdgkoJFpoaSwiMCgkWGkpIik7CisJJmFkZAkoJGxlbiwkaW5wKTsJCSMgcG9pbnRlciB0byB0aGUgZW5kIG9mIGRhdGEKKwkmbGVhCSgkcmVtXzhiaXQsIi5McmVtXzhiaXQoJXJpcCkiKTsKKwkmam1wCSgiLkxvdXRlcl9sb29wIik7CisKKyRjb2RlLj0iLmFsaWduCTE2XG4uTG91dGVyX2xvb3A6XG4iOworCSZ4b3IJKCRaaGksIigkaW5wKSIpOworCSZtb3YJKCIlcmR4IiwiOCgkaW5wKSIpOworCSZsZWEJKCRpbnAsIjE2KCRpbnApIik7CisJJnhvcgkoIiVyZHgiLCRabG8pOworCSZtb3YJKCIoJFhpKSIsJFpoaSk7CisJJm1vdgkoIjgoJFhpKSIsIiVyZHgiKTsKKwkmc2hyCSgiJXJkeCIsMzIpOworCisJJnhvcgkoJG5sbywkbmxvKTsKKwkmcm9sCSgkZGF0LDgpOworCSZtb3YJKCZMQigkbmxvKSwmTEIoJGRhdCkpOworCSZtb3Z6CSgkbmhpWzBdLCZMQigkZGF0KSk7CisJJnNobAkoJkxCKCRubG8pLDQpOworCSZzaHIJKCRuaGlbMF0sNCk7CisKKwlmb3IgKCRqPTExLCRpPTA7JGk8MTU7JGkrKykgeworCSAgICAmcm9sCSgkZGF0LDgpOworCSAgICAmeG9yCSgkWmxvLCI4KCRIdGJsLCRubG8pIikJCQlpZiAoJGk+MCk7CisJICAgICZ4b3IJKCRaaGksIigkSHRibCwkbmxvKSIpCQkJaWYgKCRpPjApOworCSAgICAmbW92CSgkWmxvLCI4KCRIdGJsLCRubG8pIikJCQlpZiAoJGk9PTApOworCSAgICAmbW92CSgkWmhpLCIoJEh0YmwsJG5sbykiKQkJCWlmICgkaT09MCk7CisKKwkgICAgJm1vdgkoJkxCKCRubG8pLCZMQigkZGF0KSk7CisJICAgICZ4b3IJKCRabG8sJHRtcCkJCQkJaWYgKCRpPjApOworCSAgICAmbW92encJKCRyZW1bMV0sIigkcmVtXzhiaXQsJHJlbVsxXSwyKSIpCWlmICgkaT4wKTsKKworCSAgICAmbW92egkoJG5oaVsxXSwmTEIoJGRhdCkpOworCSAgICAmc2hsCSgmTEIoJG5sbyksNCk7CisJICAgICZtb3Z6YgkoJHJlbVswXSwiKCVyc3AsJG5oaVswXSkiKTsKKworCSAgICAmc2hyCSgkbmhpWzFdLDQpCQkJCWlmICgkaTwxNCk7CisJICAgICZhbmQJKCRuaGlbMV0sMHhmMCkJCQkJaWYgKCRpPT0xNCk7CisJICAgICZzaGwJKCRyZW1bMV0sNDgpCQkJCWlmICgkaT4wKTsKKwkgICAgJnhvcgkoJHJlbVswXSwkWmxvKTsKKworCSAgICAmbW92CSgkdG1wLCRaaGkpOworCSAgICAmeG9yCSgkWmhpLCRyZW1bMV0pCQkJCWlmICgkaT4wKTsKKwkgICAgJnNocgkoJFpsbyw4KTsKKworCSAgICAmbW92egkoJHJlbVswXSwmTEIoJHJlbVswXSkpOworCSAgICAmbW92CSgkZGF0LCIkaigkWGkpIikJCQlpZiAoLS0kaiU0PT0wKTsKKwkgICAgJnNocgkoJFpoaSw4KTsKKworCSAgICAmeG9yCSgkWmxvLCItMTI4KCRIc2hyNCwkbmhpWzBdLDgpIik7CisJICAgICZzaGwJKCR0bXAsNTYpOworCSAgICAmeG9yCSgkWmhpLCIoJEhzaHI0LCRuaGlbMF0sOCkiKTsKKworCSAgICB1bnNoaWZ0CShAbmhpLHBvcChAbmhpKSk7CQkjICJyb3RhdGUiIHJlZ2lzdGVycworCSAgICB1bnNoaWZ0CShAcmVtLHBvcChAcmVtKSk7CisJfQorCSZtb3Z6dwkoJHJlbVsxXSwiKCRyZW1fOGJpdCwkcmVtWzFdLDIpIik7CisJJnhvcgkoJFpsbywiOCgkSHRibCwkbmxvKSIpOworCSZ4b3IJKCRaaGksIigkSHRibCwkbmxvKSIpOworCisJJnNobAkoJHJlbVsxXSw0OCk7CisJJnhvcgkoJFpsbywkdG1wKTsKKworCSZ4b3IJKCRaaGksJHJlbVsxXSk7CisJJm1vdnoJKCRyZW1bMF0sJkxCKCRabG8pKTsKKwkmc2hyCSgkWmxvLDQpOworCisJJm1vdgkoJHRtcCwkWmhpKTsKKwkmc2hsCSgmTEIoJHJlbVswXSksNCk7CisJJnNocgkoJFpoaSw0KTsKKworCSZ4b3IJKCRabG8sIjgoJEh0YmwsJG5oaVswXSkiKTsKKwkmbW92encJKCRyZW1bMF0sIigkcmVtXzhiaXQsJHJlbVswXSwyKSIpOworCSZzaGwJKCR0bXAsNjApOworCisJJnhvcgkoJFpoaSwiKCRIdGJsLCRuaGlbMF0pIik7CisJJnhvcgkoJFpsbywkdG1wKTsKKwkmc2hsCSgkcmVtWzBdLDQ4KTsKKworCSZic3dhcAkoJFpsbyk7CisJJnhvcgkoJFpoaSwkcmVtWzBdKTsKKworCSZic3dhcAkoJFpoaSk7CisJJmNtcAkoJGlucCwkbGVuKTsKKwkmamIJKCIuTG91dGVyX2xvb3AiKTsKK30KKyRjb2RlLj08PF9fXzsKKwltb3YJJFpsbyw4KCRYaSkKKwltb3YJJFpoaSwoJFhpKQorCisJbGVhCTI4MCglcnNwKSwlcnNpCisJbW92CTAoJXJzaSksJXIxNQorCW1vdgk4KCVyc2kpLCVyMTQKKwltb3YJMTYoJXJzaSksJXIxMworCW1vdgkyNCglcnNpKSwlcjEyCisJbW92CTMyKCVyc2kpLCVyYnAKKwltb3YJNDAoJXJzaSksJXJieAorCWxlYQk0OCglcnNpKSwlcnNwCisuTGdoYXNoX2VwaWxvZ3VlOgorCXJldAorLnNpemUJZ2NtX2doYXNoXzRiaXQsLi1nY21fZ2hhc2hfNGJpdAorX19fCisMCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFBDTE1VTFFEUSB2ZXJzaW9uLgorCitAXzRhcmdzPSR3aW42ND8JKCIlcmN4IiwiJXJkeCIsIiVyOCIsICIlcjkiKSA6CSMgV2luNjQgb3JkZXIKKwkJKCIlcmRpIiwiJXJzaSIsIiVyZHgiLCIlcmN4Iik7CSMgVW5peCBvcmRlcgorCisoJFhpLCRYaGkpPSgiJXhtbTAiLCIleG1tMSIpOwkkSGtleT0iJXhtbTIiOworKCRUMSwkVDIsJFQzKT0oIiV4bW0zIiwiJXhtbTQiLCIleG1tNSIpOworCitzdWIgY2xtdWw2NHg2NF9UMiB7CSMgbWluaW1hbCByZWdpc3RlciBwcmVzc3VyZQorbXkgKCRYaGksJFhpLCRIa2V5LCRISyk9QF87CisKK2lmICghZGVmaW5lZCgkSEspKSB7CSRISyA9ICRUMjsKKyRjb2RlLj08PF9fXzsKKwltb3ZkcWEJCSRYaSwkWGhpCQkjCisJcHNodWZkCQlcJDBiMDEwMDExMTAsJFhpLCRUMQorCXBzaHVmZAkJXCQwYjAxMDAxMTEwLCRIa2V5LCRUMgorCXB4b3IJCSRYaSwkVDEJCQkjCisJcHhvcgkJJEhrZXksJFQyCitfX18KK30gZWxzZSB7CiskY29kZS49PDxfX187CisJbW92ZHFhCQkkWGksJFhoaQkJIworCXBzaHVmZAkJXCQwYjAxMDAxMTEwLCRYaSwkVDEKKwlweG9yCQkkWGksJFQxCQkJIworX19fCit9CiskY29kZS49PDxfX187CisJcGNsbXVscWRxCVwkMHgwMCwkSGtleSwkWGkJIyMjIyMjIworCXBjbG11bHFkcQlcJDB4MTEsJEhrZXksJFhoaQkjIyMjIyMjCisJcGNsbXVscWRxCVwkMHgwMCwkSEssJFQxCQkjIyMjIyMjCisJcHhvcgkJJFhpLCRUMQkJCSMKKwlweG9yCQkkWGhpLCRUMQkJIworCisJbW92ZHFhCQkkVDEsJFQyCQkJIworCXBzcmxkcQkJXCQ4LCRUMQorCXBzbGxkcQkJXCQ4LCRUMgkJCSMKKwlweG9yCQkkVDEsJFhoaQorCXB4b3IJCSRUMiwkWGkJCQkjCitfX18KK30KKworc3ViIHJlZHVjdGlvbl9hbGc5IHsJIyAxNy8xMSB0aW1lcyBmYXN0ZXIgdGhhbiBJbnRlbCB2ZXJzaW9uCitteSAoJFhoaSwkWGkpID0gQF87CisKKyRjb2RlLj08PF9fXzsKKwkjIDFzdCBwaGFzZQorCW1vdmRxYQkJJFhpLCRUMgkJCSMKKwltb3ZkcWEJCSRYaSwkVDEKKwlwc2xscQkJXCQ1LCRYaQorCXB4b3IJCSRYaSwkVDEJCQkjCisJcHNsbHEJCVwkMSwkWGkKKwlweG9yCQkkVDEsJFhpCQkJIworCXBzbGxxCQlcJDU3LCRYaQkJIworCW1vdmRxYQkJJFhpLCRUMQkJCSMKKwlwc2xsZHEJCVwkOCwkWGkKKwlwc3JsZHEJCVwkOCwkVDEJCQkjCQorCXB4b3IJCSRUMiwkWGkKKwlweG9yCQkkVDEsJFhoaQkJIworCisJIyAybmQgcGhhc2UKKwltb3ZkcWEJCSRYaSwkVDIKKwlwc3JscQkJXCQxLCRYaQorCXB4b3IJCSRUMiwkWGhpCQkjCisJcHhvcgkJJFhpLCRUMgorCXBzcmxxCQlcJDUsJFhpCisJcHhvcgkJJFQyLCRYaQkJCSMKKwlwc3JscQkJXCQxLCRYaQkJCSMKKwlweG9yCQkkWGhpLCRYaQkJIworX19fCit9CisMCit7IG15ICgkSHRibCwkWGlwKT1AXzRhcmdzOworICBteSAkSEs9IiV4bW02IjsKKworJGNvZGUuPTw8X19fOworLmdsb2JsCWdjbV9pbml0X2NsbXVsCisudHlwZQlnY21faW5pdF9jbG11bCxcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMTYKK2djbV9pbml0X2NsbXVsOgorLkxfaW5pdF9jbG11bDoKK19fXworJGNvZGUuPTw8X19fIGlmICgkd2luNjQpOworLkxTRUhfYmVnaW5fZ2NtX2luaXRfY2xtdWw6CisJIyBJIGNhbid0IHRydXN0IGFzc2VtYmxlciB0byB1c2Ugc3BlY2lmaWMgZW5jb2Rpbmc6LSgKKwkuYnl0ZQkweDQ4LDB4ODMsMHhlYywweDE4CQkjc3ViCSQweDE4LCVyc3AKKwkuYnl0ZQkweDBmLDB4MjksMHgzNCwweDI0CQkjbW92YXBzCSV4bW02LCglcnNwKQorX19fCiskY29kZS49PDxfX187CisJbW92ZHF1CQkoJFhpcCksJEhrZXkKKwlwc2h1ZmQJCVwkMGIwMTAwMTExMCwkSGtleSwkSGtleQkjIGR3b3JkIHN3YXAKKworCSMgPDwxIHR3aXN0CisJcHNodWZkCQlcJDBiMTExMTExMTEsJEhrZXksJFQyCSMgYnJvYWRjYXN0IHVwcGVybW9zdCBkd29yZAorCW1vdmRxYQkJJEhrZXksJFQxCisJcHNsbHEJCVwkMSwkSGtleQorCXB4b3IJCSRUMywkVDMJCQkjCisJcHNybHEJCVwkNjMsJFQxCisJcGNtcGd0ZAkJJFQyLCRUMwkJCSMgYnJvYWRjYXN0IGNhcnJ5IGJpdAorCXBzbGxkcQkJXCQ4LCRUMQorCXBvcgkJJFQxLCRIa2V5CQkjIEg8PD0xCisKKwkjIG1hZ2ljIHJlZHVjdGlvbgorCXBhbmQJCS5MMHgxYzJfcG9seW5vbWlhbCglcmlwKSwkVDMKKwlweG9yCQkkVDMsJEhrZXkJCSMgaWYoY2FycnkpIEhePTB4MWMyX3BvbHlub21pYWwKKworCSMgY2FsY3VsYXRlIEheMgorCXBzaHVmZAkJXCQwYjAxMDAxMTEwLCRIa2V5LCRISworCW1vdmRxYQkJJEhrZXksJFhpCisJcHhvcgkJJEhrZXksJEhLCitfX18KKwkmY2xtdWw2NHg2NF9UMgkoJFhoaSwkWGksJEhrZXksJEhLKTsKKwkmcmVkdWN0aW9uX2FsZzkJKCRYaGksJFhpKTsKKyRjb2RlLj08PF9fXzsKKwlwc2h1ZmQJCVwkMGIwMTAwMTExMCwkSGtleSwkVDEKKwlwc2h1ZmQJCVwkMGIwMTAwMTExMCwkWGksJFQyCisJcHhvcgkJJEhrZXksJFQxCQkjIEthcmF0c3ViYSBwcmUtcHJvY2Vzc2luZworCW1vdmRxdQkJJEhrZXksMHgwMCgkSHRibCkJIyBzYXZlIEgKKwlweG9yCQkkWGksJFQyCQkJIyBLYXJhdHN1YmEgcHJlLXByb2Nlc3NpbmcKKwltb3ZkcXUJCSRYaSwweDEwKCRIdGJsKQkJIyBzYXZlIEheMgorCXBhbGlnbnIJCVwkOCwkVDEsJFQyCQkjIGxvdyBwYXJ0IGlzIEgubG9eSC5oaS4uLgorCW1vdmRxdQkJJFQyLDB4MjAoJEh0YmwpCQkjIHNhdmUgS2FyYXRzdWJhICJzYWx0IgorX19fCitpZiAoJGRvNHhhZ2dyKSB7CisJJmNsbXVsNjR4NjRfVDIJKCRYaGksJFhpLCRIa2V5LCRISyk7CSMgSF4zCisJJnJlZHVjdGlvbl9hbGc5CSgkWGhpLCRYaSk7CiskY29kZS49PDxfX187CisJbW92ZHFhCQkkWGksJFQzCitfX18KKwkmY2xtdWw2NHg2NF9UMgkoJFhoaSwkWGksJEhrZXksJEhLKTsJIyBIXjQKKwkmcmVkdWN0aW9uX2FsZzkJKCRYaGksJFhpKTsKKyRjb2RlLj08PF9fXzsKKwlwc2h1ZmQJCVwkMGIwMTAwMTExMCwkVDMsJFQxCisJcHNodWZkCQlcJDBiMDEwMDExMTAsJFhpLCRUMgorCXB4b3IJCSRUMywkVDEJCQkjIEthcmF0c3ViYSBwcmUtcHJvY2Vzc2luZworCW1vdmRxdQkJJFQzLDB4MzAoJEh0YmwpCQkjIHNhdmUgSF4zCisJcHhvcgkJJFhpLCRUMgkJCSMgS2FyYXRzdWJhIHByZS1wcm9jZXNzaW5nCisJbW92ZHF1CQkkWGksMHg0MCgkSHRibCkJCSMgc2F2ZSBIXjQKKwlwYWxpZ25yCQlcJDgsJFQxLCRUMgkJIyBsb3cgcGFydCBpcyBIXjMubG9eSF4zLmhpLi4uCisJbW92ZHF1CQkkVDIsMHg1MCgkSHRibCkJCSMgc2F2ZSBLYXJhdHN1YmEgInNhbHQiCitfX18KK30KKyRjb2RlLj08PF9fXyBpZiAoJHdpbjY0KTsKKwltb3ZhcHMJKCVyc3ApLCV4bW02CisJbGVhCTB4MTgoJXJzcCksJXJzcAorLkxTRUhfZW5kX2djbV9pbml0X2NsbXVsOgorX19fCiskY29kZS49PDxfX187CisJcmV0Cisuc2l6ZQlnY21faW5pdF9jbG11bCwuLWdjbV9pbml0X2NsbXVsCitfX18KK30KKworeyBteSAoJFhpcCwkSHRibCk9QF80YXJnczsKKworJGNvZGUuPTw8X19fOworLmdsb2JsCWdjbV9nbXVsdF9jbG11bAorLnR5cGUJZ2NtX2dtdWx0X2NsbXVsLFxAYWJpLW9tbmlwb3RlbnQKKy5hbGlnbgkxNgorZ2NtX2dtdWx0X2NsbXVsOgorLkxfZ211bHRfY2xtdWw6CisJbW92ZHF1CQkoJFhpcCksJFhpCisJbW92ZHFhCQkuTGJzd2FwX21hc2soJXJpcCksJFQzCisJbW92ZHF1CQkoJEh0YmwpLCRIa2V5CisJbW92ZHF1CQkweDIwKCRIdGJsKSwkVDIKKwlwc2h1ZmIJCSRUMywkWGkKK19fXworCSZjbG11bDY0eDY0X1QyCSgkWGhpLCRYaSwkSGtleSwkVDIpOworJGNvZGUuPTw8X19fIGlmICgwIHx8ICgmcmVkdWN0aW9uX2FsZzkoJFhoaSwkWGkpJiYwKSk7CisJIyBleHBlcmltZW50YWwgYWx0ZXJuYXRpdmUuIHNwZWNpYWwgdGhpbmcgYWJvdXQgaXMgdGhhdCB0aGVyZQorCSMgbm8gZGVwZW5kZW5jeSBiZXR3ZWVuIHRoZSB0d28gbXVsdGlwbGljYXRpb25zLi4uIAorCW1vdgkJXCRgMHhFMTw8MWAsJWVheAorCW1vdgkJXCQweEEwNDA2MDgwMjBDMEUwMDAsJXIxMAkjICgoNy4uMCm3MHhFMCkmMHhmZgorCW1vdgkJXCQweDA3LCVyMTFkCisJbW92cQkJJXJheCwkVDEKKwltb3ZxCQklcjEwLCRUMgorCW1vdnEJCSVyMTEsJFQzCQkjIGJvcnJvdyAkVDMKKwlwYW5kCQkkWGksJFQzCisJcHNodWZiCQkkVDMsJFQyCQkJIyAoJFhpJjcptzB4RTAKKwltb3ZxCQklcmF4LCRUMworCXBjbG11bHFkcQlcJDB4MDAsJFhpLCRUMQkJIyC3KDB4RTE8PDEpCisJcHhvcgkJJFhpLCRUMgorCXBzbGxkcQkJXCQxNSwkVDIKKwlwYWRkZAkJJFQyLCRUMgkJCSMgPDwoNjQrNTYrMSkKKwlweG9yCQkkVDIsJFhpCisJcGNsbXVscWRxCVwkMHgwMSwkVDMsJFhpCisJbW92ZHFhCQkuTGJzd2FwX21hc2soJXJpcCksJFQzCSMgcmVsb2FkICRUMworCXBzcmxkcQkJXCQxLCRUMQorCXB4b3IJCSRUMSwkWGhpCisJcHNsbGRxCQlcJDcsJFhpCisJcHhvcgkJJFhoaSwkWGkKK19fXworJGNvZGUuPTw8X19fOworCXBzaHVmYgkJJFQzLCRYaQorCW1vdmRxdQkJJFhpLCgkWGlwKQorCXJldAorLnNpemUJZ2NtX2dtdWx0X2NsbXVsLC4tZ2NtX2dtdWx0X2NsbXVsCitfX18KK30KKwwKK3sgbXkgKCRYaXAsJEh0YmwsJGlucCwkbGVuKT1AXzRhcmdzOworICBteSAoJFhsbiwkWG1uLCRYaG4sJEhrZXkyLCRISykgPSBtYXAoIiV4bW0kXyIsKDYuLjEwKSk7CisKKyRjb2RlLj08PF9fXzsKKy5nbG9ibAlnY21fZ2hhc2hfY2xtdWwKKy50eXBlCWdjbV9naGFzaF9jbG11bCxcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMzIKK2djbV9naGFzaF9jbG11bDoKKy5MX2doYXNoX2NsbXVsOgorX19fCiskY29kZS49PDxfX18gaWYgKCR3aW42NCk7CisJbGVhCS0weDg4KCVyc3ApLCVyYXgKKy5MU0VIX2JlZ2luX2djbV9naGFzaF9jbG11bDoKKwkjIEkgY2FuJ3QgdHJ1c3QgYXNzZW1ibGVyIHRvIHVzZSBzcGVjaWZpYyBlbmNvZGluZzotKAorCS5ieXRlCTB4NDgsMHg4ZCwweDYwLDB4ZTAJCSNsZWEJLTB4MjAoJXJheCksJXJzcAorCS5ieXRlCTB4MGYsMHgyOSwweDcwLDB4ZTAJCSNtb3ZhcHMJJXhtbTYsLTB4MjAoJXJheCkKKwkuYnl0ZQkweDBmLDB4MjksMHg3OCwweGYwCQkjbW92YXBzCSV4bW03LC0weDEwKCVyYXgpCisJLmJ5dGUJMHg0NCwweDBmLDB4MjksMHgwMAkJI21vdmFwcwkleG1tOCwwKCVyYXgpCisJLmJ5dGUJMHg0NCwweDBmLDB4MjksMHg0OCwweDEwCSNtb3ZhcHMJJXhtbTksMHgxMCglcmF4KQorCS5ieXRlCTB4NDQsMHgwZiwweDI5LDB4NTAsMHgyMAkjbW92YXBzCSV4bW0xMCwweDIwKCVyYXgpCisJLmJ5dGUJMHg0NCwweDBmLDB4MjksMHg1OCwweDMwCSNtb3ZhcHMJJXhtbTExLDB4MzAoJXJheCkKKwkuYnl0ZQkweDQ0LDB4MGYsMHgyOSwweDYwLDB4NDAJI21vdmFwcwkleG1tMTIsMHg0MCglcmF4KQorCS5ieXRlCTB4NDQsMHgwZiwweDI5LDB4NjgsMHg1MAkjbW92YXBzCSV4bW0xMywweDUwKCVyYXgpCisJLmJ5dGUJMHg0NCwweDBmLDB4MjksMHg3MCwweDYwCSNtb3ZhcHMJJXhtbTE0LDB4NjAoJXJheCkKKwkuYnl0ZQkweDQ0LDB4MGYsMHgyOSwweDc4LDB4NzAJI21vdmFwcwkleG1tMTUsMHg3MCglcmF4KQorX19fCiskY29kZS49PDxfX187CisJbW92ZHFhCQkuTGJzd2FwX21hc2soJXJpcCksJFQzCisJbW92CQlcJDB4QTA0MDYwODAyMEMwRTAwMCwlcmF4CSMgKCg3Li4wKbcweEUwKSYweGZmCisKKwltb3ZkcXUJCSgkWGlwKSwkWGkKKwltb3ZkcXUJCSgkSHRibCksJEhrZXkKKwltb3ZkcXUJCTB4MjAoJEh0YmwpLCRISworCXBzaHVmYgkJJFQzLCRYaQorCisJc3ViCQlcJDB4MTAsJGxlbgorCWp6CQkuTG9kZF90YWlsCisKKwltb3ZkcXUJCTB4MTAoJEh0YmwpLCRIa2V5MgorX19fCitpZiAoJGRvNHhhZ2dyKSB7CitteSAoJFhsLCRYbSwkWGgsJEhrZXkzLCRIa2V5NCk9bWFwKCIleG1tJF8iLCgxMS4uMTUpKTsKKworJGNvZGUuPTw8X19fOworCWNtcAkJXCQweDMwLCRsZW4KKwlqYgkJLkxza2lwNHgKKworCXN1YgkJXCQweDMwLCRsZW4KKwltb3ZkcXUJCTB4MzAoJEh0YmwpLCRIa2V5MworCW1vdmRxdQkJMHg0MCgkSHRibCksJEhrZXk0CisKKwkjIyMjIyMjCisJIyBYaSs0ID1bKEgqSWkrMykgKyAoSF4yKklpKzIpICsgKEheMypJaSsxKSArIEheNCooSWkrWGkpXSBtb2QgUAorCSMKKwltb3ZkcXUJCTB4MzAoJGlucCksJFhsbgorCSBtb3ZkcXUJCTB4MjAoJGlucCksJFhsCisJcHNodWZiCQkkVDMsJFhsbgorCSBwc2h1ZmIJCSRUMywkWGwKKwltb3ZkcWEJCSRYbG4sJFhobgorCXBzaHVmZAkJXCQwYjAxMDAxMTEwLCRYbG4sJFhtbgorCXB4b3IJCSRYbG4sJFhtbgorCXBjbG11bHFkcQlcJDB4MDAsJEhrZXksJFhsbgorCXBjbG11bHFkcQlcJDB4MTEsJEhrZXksJFhobgorCXBjbG11bHFkcQlcJDB4MDAsJEhLLCRYbW4KKworCW1vdmRxYQkJJFhsLCRYaAorCXBzaHVmZAkJXCQwYjAxMDAxMTEwLCRYbCwkWG0KKwlweG9yCQkkWGwsJFhtCisJcGNsbXVscWRxCVwkMHgwMCwkSGtleTIsJFhsCisJcGNsbXVscWRxCVwkMHgxMSwkSGtleTIsJFhoCisJeG9ycHMJCSRYbCwkWGxuCisJcGNsbXVscWRxCVwkMHgxMCwkSEssJFhtCisJeG9ycHMJCSRYaCwkWGhuCisJbW92dXBzCQkweDUwKCRIdGJsKSwkSEsKKwl4b3JwcwkJJFhtLCRYbW4KKworCW1vdmRxdQkJMHgxMCgkaW5wKSwkWGwKKwkgbW92ZHF1CQkwKCRpbnApLCRUMQorCXBzaHVmYgkJJFQzLCRYbAorCSBwc2h1ZmIJCSRUMywkVDEKKwltb3ZkcWEJCSRYbCwkWGgKKwlwc2h1ZmQJCVwkMGIwMTAwMTExMCwkWGwsJFhtCisJIHB4b3IJCSRUMSwkWGkKKwlweG9yCQkkWGwsJFhtCisJcGNsbXVscWRxCVwkMHgwMCwkSGtleTMsJFhsCisJIG1vdmRxYQkJJFhpLCRYaGkKKwkgcHNodWZkCQlcJDBiMDEwMDExMTAsJFhpLCRUMQorCSBweG9yCQkkWGksJFQxCisJcGNsbXVscWRxCVwkMHgxMSwkSGtleTMsJFhoCisJeG9ycHMJCSRYbCwkWGxuCisJcGNsbXVscWRxCVwkMHgwMCwkSEssJFhtCisJeG9ycHMJCSRYaCwkWGhuCisKKwlsZWEJMHg0MCgkaW5wKSwkaW5wCisJc3ViCVwkMHg0MCwkbGVuCisJamMJLkx0YWlsNHgKKworCWptcAkuTG1vZDRfbG9vcAorLmFsaWduCTMyCisuTG1vZDRfbG9vcDoKKwlwY2xtdWxxZHEJXCQweDAwLCRIa2V5NCwkWGkKKwl4b3JwcwkJJFhtLCRYbW4KKwkgbW92ZHF1CQkweDMwKCRpbnApLCRYbAorCSBwc2h1ZmIJCSRUMywkWGwKKwlwY2xtdWxxZHEJXCQweDExLCRIa2V5NCwkWGhpCisJeG9ycHMJCSRYbG4sJFhpCisJIG1vdmRxdQkJMHgyMCgkaW5wKSwkWGxuCisJIG1vdmRxYQkJJFhsLCRYaAorCSBwc2h1ZmQJCVwkMGIwMTAwMTExMCwkWGwsJFhtCisJcGNsbXVscWRxCVwkMHgxMCwkSEssJFQxCisJeG9ycHMJCSRYaG4sJFhoaQorCSBweG9yCQkkWGwsJFhtCisJIHBzaHVmYgkJJFQzLCRYbG4KKwltb3Z1cHMJCTB4MjAoJEh0YmwpLCRISworCSBwY2xtdWxxZHEJXCQweDAwLCRIa2V5LCRYbAorCXhvcnBzCQkkWG1uLCRUMQorCSBtb3ZkcWEJCSRYbG4sJFhobgorCSBwc2h1ZmQJCVwkMGIwMTAwMTExMCwkWGxuLCRYbW4KKworCXB4b3IJCSRYaSwkVDEJCQkjIGFnZ3JlZ2F0ZWQgS2FyYXRzdWJhIHBvc3QtcHJvY2Vzc2luZworCSBweG9yCQkkWGxuLCRYbW4KKwlweG9yCQkkWGhpLCRUMQkJIworCW1vdmRxYQkJJFQxLCRUMgkJCSMKKwlwc2xsZHEJCVwkOCwkVDEKKwkgcGNsbXVscWRxCVwkMHgxMSwkSGtleSwkWGgKKwlwc3JsZHEJCVwkOCwkVDIJCQkjCisJcHhvcgkJJFQxLCRYaQorCW1vdmRxYQkJLkw3X21hc2soJXJpcCksJFQxCisJcHhvcgkJJFQyLCRYaGkJCSMKKwltb3ZxCQklcmF4LCRUMgorCisJcGFuZAkJJFhpLCRUMQkJCSMgMXN0IHBoYXNlCisJcHNodWZiCQkkVDEsJFQyCQkJIworCSBwY2xtdWxxZHEJXCQweDAwLCRISywkWG0KKwlweG9yCQkkWGksJFQyCQkJIworCXBzbGxxCQlcJDU3LCRUMgkJIworCW1vdmRxYQkJJFQyLCRUMQkJCSMKKwlwc2xsZHEJCVwkOCwkVDIKKwkgcGNsbXVscWRxCVwkMHgwMCwkSGtleTIsJFhsbgorCXBzcmxkcQkJXCQ4LCRUMQkJCSMJCisJcHhvcgkJJFQyLCRYaQorCXB4b3IJCSRUMSwkWGhpCQkjCisJbW92ZHF1CQkwKCRpbnApLCRUMQorCisJbW92ZHFhCQkkWGksJFQyCQkJIyAybmQgcGhhc2UKKwlwc3JscQkJXCQxLCRYaQorCSBwY2xtdWxxZHEJXCQweDExLCRIa2V5MiwkWGhuCisJIHhvcnBzCQkkWGwsJFhsbgorCSBtb3ZkcXUJCTB4MTAoJGlucCksJFhsCisJIHBzaHVmYgkJJFQzLCRYbAorCSBwY2xtdWxxZHEJXCQweDEwLCRISywkWG1uCisJIHhvcnBzCQkkWGgsJFhobgorCSBtb3Z1cHMJCTB4NTAoJEh0YmwpLCRISworCXBzaHVmYgkJJFQzLCRUMQorCXB4b3IJCSRUMiwkWGhpCQkjCisJcHhvcgkJJFhpLCRUMgorCXBzcmxxCQlcJDUsJFhpCisKKwkgbW92ZHFhCQkkWGwsJFhoCisJIHB4b3IJCSRYbSwkWG1uCisJIHBzaHVmZAkJXCQwYjAxMDAxMTEwLCRYbCwkWG0KKwkgcHhvcgkJJFhsLCRYbQorCSBwY2xtdWxxZHEJXCQweDAwLCRIa2V5MywkWGwKKwlweG9yCQkkVDIsJFhpCQkJIworCXB4b3IJCSRUMSwkWGhpCisJcHNybHEJCVwkMSwkWGkJCQkjCisJIHBjbG11bHFkcQlcJDB4MTEsJEhrZXkzLCRYaAorCSB4b3JwcwkJJFhsLCRYbG4KKwlweG9yCQkkWGhpLCRYaQkJIworCisJIHBjbG11bHFkcQlcJDB4MDAsJEhLLCRYbQorCSB4b3JwcwkJJFhoLCRYaG4KKworCW1vdmRxYQkJJFhpLCRYaGkKKwlwc2h1ZmQJCVwkMGIwMTAwMTExMCwkWGksJFQxCisJcHhvcgkJJFhpLCRUMQorCisJbGVhCTB4NDAoJGlucCksJGlucAorCXN1YglcJDB4NDAsJGxlbgorCWpuYwkuTG1vZDRfbG9vcAorCisuTHRhaWw0eDoKKwlwY2xtdWxxZHEJXCQweDAwLCRIa2V5NCwkWGkKKwl4b3JwcwkJJFhtLCRYbW4KKwlwY2xtdWxxZHEJXCQweDExLCRIa2V5NCwkWGhpCisJeG9ycHMJCSRYbG4sJFhpCisJcGNsbXVscWRxCVwkMHgxMCwkSEssJFQxCisJeG9ycHMJCSRYaG4sJFhoaQorCXB4b3IJCSRYaSwkWGhpCQkjIGFnZ3JlZ2F0ZWQgS2FyYXRzdWJhIHBvc3QtcHJvY2Vzc2luZworCXB4b3IJCSRYbW4sJFQxCisKKwlweG9yCQkkWGhpLCRUMQkJIworCXB4b3IJCSRYaSwkWGhpCisKKwltb3ZkcWEJCSRUMSwkVDIJCQkjCisJcHNybGRxCQlcJDgsJFQxCisJcHNsbGRxCQlcJDgsJFQyCQkJIworCXB4b3IJCSRUMSwkWGhpCisJcHhvcgkJJFQyLCRYaQkJCSMKK19fXworCSZyZWR1Y3Rpb25fYWxnOSgkWGhpLCRYaSk7CiskY29kZS49PDxfX187CisJYWRkCVwkMHg0MCwkbGVuCisJanoJLkxkb25lCisJbW92ZHF1CTB4MjAoJEh0YmwpLCRISworCXN1YglcJDB4MTAsJGxlbgorCWp6CS5Mb2RkX3RhaWwKKy5Mc2tpcDR4OgorX19fCit9CiskY29kZS49PDxfX187CisJIyMjIyMjIworCSMgWGkrMiA9W0gqKElpKzEgKyBYaSsxKV0gbW9kIFAgPQorCSMJWyhIKklpKzEpICsgKEgqWGkrMSldIG1vZCBQID0KKwkjCVsoSCpJaSsxKSArIEheMiooSWkrWGkpXSBtb2QgUAorCSMKKwltb3ZkcXUJCSgkaW5wKSwkVDEJCSMgSWkKKwltb3ZkcXUJCTE2KCRpbnApLCRYbG4JCSMgSWkrMQorCXBzaHVmYgkJJFQzLCRUMQorCXBzaHVmYgkJJFQzLCRYbG4KKwlweG9yCQkkVDEsJFhpCQkJIyBJaStYaQorCisJbW92ZHFhCQkkWGxuLCRYaG4KKwlwc2h1ZmQJCVwkMGIwMTAwMTExMCwkWGxuLCRUMQorCXB4b3IJCSRYbG4sJFQxCisJcGNsbXVscWRxCVwkMHgwMCwkSGtleSwkWGxuCisJcGNsbXVscWRxCVwkMHgxMSwkSGtleSwkWGhuCisJcGNsbXVscWRxCVwkMHgwMCwkSEssJFQxCisKKwlsZWEJCTMyKCRpbnApLCRpbnAJCSMgaSs9MgorCXN1YgkJXCQweDIwLCRsZW4KKwlqYmUJCS5MZXZlbl90YWlsCisJam1wCQkuTG1vZF9sb29wCisKKy5hbGlnbgkzMgorLkxtb2RfbG9vcDoKKwltb3ZkcWEJCSRYaSwkWGhpCisJcHNodWZkCQlcJDBiMDEwMDExMTAsJFhpLCRUMgkjCisJcHhvcgkJJFhpLCRUMgkJCSMKKworCXBjbG11bHFkcQlcJDB4MDAsJEhrZXkyLCRYaQorCXBjbG11bHFkcQlcJDB4MTEsJEhrZXkyLCRYaGkKKwlwY2xtdWxxZHEJXCQweDEwLCRISywkVDIKKworCXB4b3IJCSRYbG4sJFhpCQkjIChIKklpKzEpICsgSF4yKihJaStYaSkKKwlweG9yCQkkWGhuLCRYaGkKKwkgIG1vdmRxdQkoJGlucCksJFhobgkJIyBJaQorCSAgcHNodWZiCSRUMywkWGhuCisJICBtb3ZkcXUJMTYoJGlucCksJFhsbgkJIyBJaSsxCisKKwlweG9yCQkkWGksJFQxCQkJIyBhZ2dyZWdhdGVkIEthcmF0c3ViYSBwb3N0LXByb2Nlc3NpbmcKKwlweG9yCQkkWGhpLCRUMQorCSAgcHhvcgkJJFhobiwkWGhpCQkjICJJaStYaSIsIGNvbnN1bWUgZWFybHkKKwlweG9yCQkkVDEsJFQyCisJIHBzaHVmYgkJJFQzLCRYbG4KKwltb3ZkcWEJCSRUMiwkVDEJCQkjCisJcHNybGRxCQlcJDgsJFQxCisJcHNsbGRxCQlcJDgsJFQyCQkJIworCXB4b3IJCSRUMSwkWGhpCisJcHhvcgkJJFQyLCRYaQkJCSMKKworCW1vdmRxYQkJJFhsbiwkWGhuCQkjCisKKwkgIG1vdmRxYQkkWGksJFQyCQkJIyAxc3QgcGhhc2UKKwkgIG1vdmRxYQkkWGksJFQxCisJICBwc2xscQkJXCQ1LCRYaQorCXBjbG11bHFkcQlcJDB4MDAsJEhrZXksJFhsbgkjIyMjIyMjCisJICBweG9yCQkkWGksJFQxCQkJIworCSAgcHNsbHEJCVwkMSwkWGkKKwkgIHB4b3IJCSRUMSwkWGkJCQkjCisJICBwc2xscQkJXCQ1NywkWGkJCSMKKwkgIG1vdmRxYQkkWGksJFQxCQkJIworCSAgcHNsbGRxCVwkOCwkWGkKKwkgIHBzcmxkcQlcJDgsJFQxCQkJIwkKKwkgIHB4b3IJCSRUMiwkWGkKKwkgIHB4b3IJCSRUMSwkWGhpCQkjCisJcHNodWZkCQlcJDBiMDEwMDExMTAsJFhobiwkVDEKKwlweG9yCQkkWGhuLCRUMQkJIworCisJcGNsbXVscWRxCVwkMHgxMSwkSGtleSwkWGhuCSMjIyMjIyMKKwkgIG1vdmRxYQkkWGksJFQyCQkJIyAybmQgcGhhc2UKKwkgIHBzcmxxCQlcJDEsJFhpCisJICBweG9yCQkkVDIsJFhoaQkJIworCSAgcHhvcgkJJFhpLCRUMgorCSAgcHNybHEJCVwkNSwkWGkKKwkgIHB4b3IJCSRUMiwkWGkJCQkjCisJICBwc3JscQkJXCQxLCRYaQkJCSMKKwlwY2xtdWxxZHEJXCQweDAwLCRISywkVDEJCSMjIyMjIyMKKwkgIHB4b3IJCSRYaGksJFhpCQkjCisKKwlsZWEJCTMyKCRpbnApLCRpbnAKKwlzdWIJCVwkMHgyMCwkbGVuCisJamEJCS5MbW9kX2xvb3AKKworLkxldmVuX3RhaWw6CisJIG1vdmRxYQkJJFhpLCRYaGkKKwkgcHNodWZkCQlcJDBiMDEwMDExMTAsJFhpLCRUMgkjCisJIHB4b3IJCSRYaSwkVDIJCQkjCisKKwlwY2xtdWxxZHEJXCQweDAwLCRIa2V5MiwkWGkKKwlwY2xtdWxxZHEJXCQweDExLCRIa2V5MiwkWGhpCisJcGNsbXVscWRxCVwkMHgxMCwkSEssJFQyCisKKwlweG9yCQkkWGxuLCRYaQkJIyAoSCpJaSsxKSArIEheMiooSWkrWGkpCisJcHhvcgkJJFhobiwkWGhpCisJcHhvcgkJJFhpLCRUMQorCXB4b3IJCSRYaGksJFQxCisJcHhvcgkJJFQxLCRUMgorCW1vdmRxYQkJJFQyLCRUMQkJCSMKKwlwc3JsZHEJCVwkOCwkVDEKKwlwc2xsZHEJCVwkOCwkVDIJCQkjCisJcHhvcgkJJFQxLCRYaGkKKwlweG9yCQkkVDIsJFhpCQkJIworX19fCisJJnJlZHVjdGlvbl9hbGc5CSgkWGhpLCRYaSk7CiskY29kZS49PDxfX187CisJdGVzdAkJJGxlbiwkbGVuCisJam56CQkuTGRvbmUKKworLkxvZGRfdGFpbDoKKwltb3ZkcXUJCSgkaW5wKSwkVDEJCSMgSWkKKwlwc2h1ZmIJCSRUMywkVDEKKwlweG9yCQkkVDEsJFhpCQkJIyBJaStYaQorX19fCisJJmNsbXVsNjR4NjRfVDIJKCRYaGksJFhpLCRIa2V5LCRISyk7CSMgSCooSWkrWGkpCisJJnJlZHVjdGlvbl9hbGc5CSgkWGhpLCRYaSk7CiskY29kZS49PDxfX187CisuTGRvbmU6CisJcHNodWZiCQkkVDMsJFhpCisJbW92ZHF1CQkkWGksKCRYaXApCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJHdpbjY0KTsKKwltb3ZhcHMJKCVyc3ApLCV4bW02CisJbW92YXBzCTB4MTAoJXJzcCksJXhtbTcKKwltb3ZhcHMJMHgyMCglcnNwKSwleG1tOAorCW1vdmFwcwkweDMwKCVyc3ApLCV4bW05CisJbW92YXBzCTB4NDAoJXJzcCksJXhtbTEwCisJbW92YXBzCTB4NTAoJXJzcCksJXhtbTExCisJbW92YXBzCTB4NjAoJXJzcCksJXhtbTEyCisJbW92YXBzCTB4NzAoJXJzcCksJXhtbTEzCisJbW92YXBzCTB4ODAoJXJzcCksJXhtbTE0CisJbW92YXBzCTB4OTAoJXJzcCksJXhtbTE1CisJbGVhCTB4YTgoJXJzcCksJXJzcAorLkxTRUhfZW5kX2djbV9naGFzaF9jbG11bDoKK19fXworJGNvZGUuPTw8X19fOworCXJldAorLnNpemUJZ2NtX2doYXNoX2NsbXVsLC4tZ2NtX2doYXNoX2NsbXVsCitfX18KK30KKwwKKyRjb2RlLj08PF9fXzsKKy5nbG9ibAlnY21faW5pdF9hdngKKy50eXBlCWdjbV9pbml0X2F2eCxcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMzIKK2djbV9pbml0X2F2eDoKK19fXworaWYgKCRhdngpIHsKK215ICgkSHRibCwkWGlwKT1AXzRhcmdzOworbXkgJEhLPSIleG1tNiI7CisKKyRjb2RlLj08PF9fXyBpZiAoJHdpbjY0KTsKKy5MU0VIX2JlZ2luX2djbV9pbml0X2F2eDoKKwkjIEkgY2FuJ3QgdHJ1c3QgYXNzZW1ibGVyIHRvIHVzZSBzcGVjaWZpYyBlbmNvZGluZzotKAorCS5ieXRlCTB4NDgsMHg4MywweGVjLDB4MTgJCSNzdWIJJDB4MTgsJXJzcAorCS5ieXRlCTB4MGYsMHgyOSwweDM0LDB4MjQJCSNtb3ZhcHMJJXhtbTYsKCVyc3ApCitfX18KKyRjb2RlLj08PF9fXzsKKwl2emVyb3VwcGVyCisKKwl2bW92ZHF1CQkoJFhpcCksJEhrZXkKKwl2cHNodWZkCQlcJDBiMDEwMDExMTAsJEhrZXksJEhrZXkJIyBkd29yZCBzd2FwCisKKwkjIDw8MSB0d2lzdAorCXZwc2h1ZmQJCVwkMGIxMTExMTExMSwkSGtleSwkVDIJIyBicm9hZGNhc3QgdXBwZXJtb3N0IGR3b3JkCisJdnBzcmxxCQlcJDYzLCRIa2V5LCRUMQorCXZwc2xscQkJXCQxLCRIa2V5LCRIa2V5CisJdnB4b3IJCSRUMywkVDMsJFQzCQkjCisJdnBjbXBndGQJJFQyLCRUMywkVDMJCSMgYnJvYWRjYXN0IGNhcnJ5IGJpdAorCXZwc2xsZHEJCVwkOCwkVDEsJFQxCisJdnBvcgkJJFQxLCRIa2V5LCRIa2V5CQkjIEg8PD0xCisKKwkjIG1hZ2ljIHJlZHVjdGlvbgorCXZwYW5kCQkuTDB4MWMyX3BvbHlub21pYWwoJXJpcCksJFQzLCRUMworCXZweG9yCQkkVDMsJEhrZXksJEhrZXkJCSMgaWYoY2FycnkpIEhePTB4MWMyX3BvbHlub21pYWwKKworCXZwdW5wY2tocWRxCSRIa2V5LCRIa2V5LCRISworCXZtb3ZkcWEJCSRIa2V5LCRYaQorCXZweG9yCQkkSGtleSwkSEssJEhLCisJbW92CQlcJDQsJXIxMAkJIyB1cCB0byBIXjgKKwlqbXAJCS5MaW5pdF9zdGFydF9hdngKK19fXworCitzdWIgY2xtdWw2NHg2NF9hdnggeworbXkgKCRYaGksJFhpLCRIa2V5LCRISyk9QF87CisKK2lmICghZGVmaW5lZCgkSEspKSB7CSRISyA9ICRUMjsKKyRjb2RlLj08PF9fXzsKKwl2cHVucGNraHFkcQkkWGksJFhpLCRUMQorCXZwdW5wY2tocWRxCSRIa2V5LCRIa2V5LCRUMgorCXZweG9yCQkkWGksJFQxLCRUMQkJIworCXZweG9yCQkkSGtleSwkVDIsJFQyCitfX18KK30gZWxzZSB7CiskY29kZS49PDxfX187CisJdnB1bnBja2hxZHEJJFhpLCRYaSwkVDEKKwl2cHhvcgkJJFhpLCRUMSwkVDEJCSMKK19fXworfQorJGNvZGUuPTw8X19fOworCXZwY2xtdWxxZHEJXCQweDExLCRIa2V5LCRYaSwkWGhpCSMjIyMjIyMKKwl2cGNsbXVscWRxCVwkMHgwMCwkSGtleSwkWGksJFhpCSMjIyMjIyMKKwl2cGNsbXVscWRxCVwkMHgwMCwkSEssJFQxLCRUMQkjIyMjIyMjCisJdnB4b3IJCSRYaSwkWGhpLCRUMgkJIworCXZweG9yCQkkVDIsJFQxLCRUMQkJIworCisJdnBzbGxkcQkJXCQ4LCRUMSwkVDIJCSMKKwl2cHNybGRxCQlcJDgsJFQxLCRUMQorCXZweG9yCQkkVDIsJFhpLCRYaQkJIworCXZweG9yCQkkVDEsJFhoaSwkWGhpCitfX18KK30KKworc3ViIHJlZHVjdGlvbl9hdnggeworbXkgKCRYaGksJFhpKSA9IEBfOworCiskY29kZS49PDxfX187CisJdnBzbGxxCQlcJDU3LCRYaSwkVDEJCSMgMXN0IHBoYXNlCisJdnBzbGxxCQlcJDYyLCRYaSwkVDIKKwl2cHhvcgkJJFQxLCRUMiwkVDIJCSMKKwl2cHNsbHEJCVwkNjMsJFhpLCRUMQorCXZweG9yCQkkVDEsJFQyLCRUMgkJIworCXZwc2xsZHEJCVwkOCwkVDIsJFQxCQkjCisJdnBzcmxkcQkJXCQ4LCRUMiwkVDIKKwl2cHhvcgkJJFQxLCRYaSwkWGkJCSMKKwl2cHhvcgkJJFQyLCRYaGksJFhoaQorCisJdnBzcmxxCQlcJDEsJFhpLCRUMgkJIyAybmQgcGhhc2UKKwl2cHhvcgkJJFhpLCRYaGksJFhoaQorCXZweG9yCQkkVDIsJFhpLCRYaQkJIworCXZwc3JscQkJXCQ1LCRUMiwkVDIKKwl2cHhvcgkJJFQyLCRYaSwkWGkJCSMKKwl2cHNybHEJCVwkMSwkWGksJFhpCQkjCisJdnB4b3IJCSRYaGksJFhpLCRYaQkJIworX19fCit9CisKKyRjb2RlLj08PF9fXzsKKy5hbGlnbgkzMgorLkxpbml0X2xvb3BfYXZ4OgorCXZwYWxpZ25yCVwkOCwkVDEsJFQyLCRUMwkJIyBsb3cgcGFydCBpcyBILmxvXkguaGkuLi4KKwl2bW92ZHF1CQkkVDMsLTB4MTAoJEh0YmwpCSMgc2F2ZSBLYXJhdHN1YmEgInNhbHQiCitfX18KKwkmY2xtdWw2NHg2NF9hdngJKCRYaGksJFhpLCRIa2V5LCRISyk7CSMgY2FsY3VsYXRlIEheMyw1LDcKKwkmcmVkdWN0aW9uX2F2eAkoJFhoaSwkWGkpOworJGNvZGUuPTw8X19fOworLkxpbml0X3N0YXJ0X2F2eDoKKwl2bW92ZHFhCQkkWGksJFQzCitfX18KKwkmY2xtdWw2NHg2NF9hdngJKCRYaGksJFhpLCRIa2V5LCRISyk7CSMgY2FsY3VsYXRlIEheMiw0LDYsOAorCSZyZWR1Y3Rpb25fYXZ4CSgkWGhpLCRYaSk7CiskY29kZS49PDxfX187CisJdnBzaHVmZAkJXCQwYjAxMDAxMTEwLCRUMywkVDEKKwl2cHNodWZkCQlcJDBiMDEwMDExMTAsJFhpLCRUMgorCXZweG9yCQkkVDMsJFQxLCRUMQkJIyBLYXJhdHN1YmEgcHJlLXByb2Nlc3NpbmcKKwl2bW92ZHF1CQkkVDMsMHgwMCgkSHRibCkJCSMgc2F2ZSBIXjEsMyw1LDcKKwl2cHhvcgkJJFhpLCRUMiwkVDIJCSMgS2FyYXRzdWJhIHByZS1wcm9jZXNzaW5nCisJdm1vdmRxdQkJJFhpLDB4MTAoJEh0YmwpCQkjIHNhdmUgSF4yLDQsNiw4CisJbGVhCQkweDMwKCRIdGJsKSwkSHRibAorCXN1YgkJXCQxLCVyMTAKKwlqbnoJCS5MaW5pdF9sb29wX2F2eAorCisJdnBhbGlnbnIJXCQ4LCRUMiwkVDEsJFQzCQkjIGxhc3QgInNhbHQiIGlzIGZsaXBwZWQKKwl2bW92ZHF1CQkkVDMsLTB4MTAoJEh0YmwpCisKKwl2emVyb3VwcGVyCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJHdpbjY0KTsKKwltb3ZhcHMJKCVyc3ApLCV4bW02CisJbGVhCTB4MTgoJXJzcCksJXJzcAorLkxTRUhfZW5kX2djbV9pbml0X2F2eDoKK19fXworJGNvZGUuPTw8X19fOworCXJldAorLnNpemUJZ2NtX2luaXRfYXZ4LC4tZ2NtX2luaXRfYXZ4CitfX18KK30gZWxzZSB7CiskY29kZS49PDxfX187CisJam1wCS5MX2luaXRfY2xtdWwKKy5zaXplCWdjbV9pbml0X2F2eCwuLWdjbV9pbml0X2F2eAorX19fCit9CisKKyRjb2RlLj08PF9fXzsKKy5nbG9ibAlnY21fZ211bHRfYXZ4CisudHlwZQlnY21fZ211bHRfYXZ4LFxAYWJpLW9tbmlwb3RlbnQKKy5hbGlnbgkzMgorZ2NtX2dtdWx0X2F2eDoKKwlqbXAJLkxfZ211bHRfY2xtdWwKKy5zaXplCWdjbV9nbXVsdF9hdngsLi1nY21fZ211bHRfYXZ4CitfX18KKwwKKyRjb2RlLj08PF9fXzsKKy5nbG9ibAlnY21fZ2hhc2hfYXZ4CisudHlwZQlnY21fZ2hhc2hfYXZ4LFxAYWJpLW9tbmlwb3RlbnQKKy5hbGlnbgkzMgorZ2NtX2doYXNoX2F2eDoKK19fXworaWYgKCRhdngpIHsKK215ICgkWGlwLCRIdGJsLCRpbnAsJGxlbik9QF80YXJnczsKK215ICgkWGxvLCRYaGksJFhtaSwKKyAgICAkWmxvLCRaaGksJFptaSwKKyAgICAkSGtleSwkSEssJFQxLCRUMiwKKyAgICAkWGksJFhvLCRUcmVkLCRic3dhcCwkSWksJElqKSA9IG1hcCgiJXhtbSRfIiwoMC4uMTUpKTsKKworJGNvZGUuPTw8X19fIGlmICgkd2luNjQpOworCWxlYQktMHg4OCglcnNwKSwlcmF4CisuTFNFSF9iZWdpbl9nY21fZ2hhc2hfYXZ4OgorCSMgSSBjYW4ndCB0cnVzdCBhc3NlbWJsZXIgdG8gdXNlIHNwZWNpZmljIGVuY29kaW5nOi0oCisJLmJ5dGUJMHg0OCwweDhkLDB4NjAsMHhlMAkJI2xlYQktMHgyMCglcmF4KSwlcnNwCisJLmJ5dGUJMHgwZiwweDI5LDB4NzAsMHhlMAkJI21vdmFwcwkleG1tNiwtMHgyMCglcmF4KQorCS5ieXRlCTB4MGYsMHgyOSwweDc4LDB4ZjAJCSNtb3ZhcHMJJXhtbTcsLTB4MTAoJXJheCkKKwkuYnl0ZQkweDQ0LDB4MGYsMHgyOSwweDAwCQkjbW92YXBzCSV4bW04LDAoJXJheCkKKwkuYnl0ZQkweDQ0LDB4MGYsMHgyOSwweDQ4LDB4MTAJI21vdmFwcwkleG1tOSwweDEwKCVyYXgpCisJLmJ5dGUJMHg0NCwweDBmLDB4MjksMHg1MCwweDIwCSNtb3ZhcHMJJXhtbTEwLDB4MjAoJXJheCkKKwkuYnl0ZQkweDQ0LDB4MGYsMHgyOSwweDU4LDB4MzAJI21vdmFwcwkleG1tMTEsMHgzMCglcmF4KQorCS5ieXRlCTB4NDQsMHgwZiwweDI5LDB4NjAsMHg0MAkjbW92YXBzCSV4bW0xMiwweDQwKCVyYXgpCisJLmJ5dGUJMHg0NCwweDBmLDB4MjksMHg2OCwweDUwCSNtb3ZhcHMJJXhtbTEzLDB4NTAoJXJheCkKKwkuYnl0ZQkweDQ0LDB4MGYsMHgyOSwweDcwLDB4NjAJI21vdmFwcwkleG1tMTQsMHg2MCglcmF4KQorCS5ieXRlCTB4NDQsMHgwZiwweDI5LDB4NzgsMHg3MAkjbW92YXBzCSV4bW0xNSwweDcwKCVyYXgpCitfX18KKyRjb2RlLj08PF9fXzsKKwl2emVyb3VwcGVyCisKKwl2bW92ZHF1CQkoJFhpcCksJFhpCQkjIGxvYWQgJFhpCisJbGVhCQkuTDB4MWMyX3BvbHlub21pYWwoJXJpcCksJXIxMAorCWxlYQkJMHg0MCgkSHRibCksJEh0YmwJIyBzaXplIG9wdGltaXphdGlvbgorCXZtb3ZkcXUJCS5MYnN3YXBfbWFzayglcmlwKSwkYnN3YXAKKwl2cHNodWZiCQkkYnN3YXAsJFhpLCRYaQorCWNtcAkJXCQweDgwLCRsZW4KKwlqYgkJLkxzaG9ydF9hdngKKwlzdWIJCVwkMHg4MCwkbGVuCisKKwl2bW92ZHF1CQkweDcwKCRpbnApLCRJaQkJIyBJWzddCisJdm1vdmRxdQkJMHgwMC0weDQwKCRIdGJsKSwkSGtleQkjICRIa2V5XjEKKwl2cHNodWZiCQkkYnN3YXAsJElpLCRJaQorCXZtb3ZkcXUJCTB4MjAtMHg0MCgkSHRibCksJEhLCisKKwl2cHVucGNraHFkcQkkSWksJElpLCRUMgorCSB2bW92ZHF1CTB4NjAoJGlucCksJElqCQkjIElbNl0KKwl2cGNsbXVscWRxCVwkMHgwMCwkSGtleSwkSWksJFhsbworCXZweG9yCQkkSWksJFQyLCRUMgorCSB2cHNodWZiCSRic3dhcCwkSWosJElqCisJdnBjbG11bHFkcQlcJDB4MTEsJEhrZXksJElpLCRYaGkKKwkgdm1vdmRxdQkweDEwLTB4NDAoJEh0YmwpLCRIa2V5CSMgJEhrZXleMgorCSB2cHVucGNraHFkcQkkSWosJElqLCRUMQorCSB2bW92ZHF1CTB4NTAoJGlucCksJElpCQkjIElbNV0KKwl2cGNsbXVscWRxCVwkMHgwMCwkSEssJFQyLCRYbWkKKwkgdnB4b3IJCSRJaiwkVDEsJFQxCisKKwkgdnBzaHVmYgkkYnN3YXAsJElpLCRJaQorCXZwY2xtdWxxZHEJXCQweDAwLCRIa2V5LCRJaiwkWmxvCisJIHZwdW5wY2tocWRxCSRJaSwkSWksJFQyCisJdnBjbG11bHFkcQlcJDB4MTEsJEhrZXksJElqLCRaaGkKKwkgdm1vdmRxdQkweDMwLTB4NDAoJEh0YmwpLCRIa2V5CSMgJEhrZXleMworCSB2cHhvcgkJJElpLCRUMiwkVDIKKwkgdm1vdmRxdQkweDQwKCRpbnApLCRJagkJIyBJWzRdCisJdnBjbG11bHFkcQlcJDB4MTAsJEhLLCRUMSwkWm1pCisJIHZtb3ZkcXUJMHg1MC0weDQwKCRIdGJsKSwkSEsKKworCSB2cHNodWZiCSRic3dhcCwkSWosJElqCisJdnB4b3IJCSRYbG8sJFpsbywkWmxvCisJdnBjbG11bHFkcQlcJDB4MDAsJEhrZXksJElpLCRYbG8KKwl2cHhvcgkJJFhoaSwkWmhpLCRaaGkKKwkgdnB1bnBja2hxZHEJJElqLCRJaiwkVDEKKwl2cGNsbXVscWRxCVwkMHgxMSwkSGtleSwkSWksJFhoaQorCSB2bW92ZHF1CTB4NDAtMHg0MCgkSHRibCksJEhrZXkJIyAkSGtleV40CisJdnB4b3IJCSRYbWksJFptaSwkWm1pCisJdnBjbG11bHFkcQlcJDB4MDAsJEhLLCRUMiwkWG1pCisJIHZweG9yCQkkSWosJFQxLCRUMQorCisJIHZtb3ZkcXUJMHgzMCgkaW5wKSwkSWkJCSMgSVszXQorCXZweG9yCQkkWmxvLCRYbG8sJFhsbworCXZwY2xtdWxxZHEJXCQweDAwLCRIa2V5LCRJaiwkWmxvCisJdnB4b3IJCSRaaGksJFhoaSwkWGhpCisJIHZwc2h1ZmIJJGJzd2FwLCRJaSwkSWkKKwl2cGNsbXVscWRxCVwkMHgxMSwkSGtleSwkSWosJFpoaQorCSB2bW92ZHF1CTB4NjAtMHg0MCgkSHRibCksJEhrZXkJIyAkSGtleV41CisJdnB4b3IJCSRabWksJFhtaSwkWG1pCisJIHZwdW5wY2tocWRxCSRJaSwkSWksJFQyCisJdnBjbG11bHFkcQlcJDB4MTAsJEhLLCRUMSwkWm1pCisJIHZtb3ZkcXUJMHg4MC0weDQwKCRIdGJsKSwkSEsKKwkgdnB4b3IJCSRJaSwkVDIsJFQyCisKKwkgdm1vdmRxdQkweDIwKCRpbnApLCRJagkJIyBJWzJdCisJdnB4b3IJCSRYbG8sJFpsbywkWmxvCisJdnBjbG11bHFkcQlcJDB4MDAsJEhrZXksJElpLCRYbG8KKwl2cHhvcgkJJFhoaSwkWmhpLCRaaGkKKwkgdnBzaHVmYgkkYnN3YXAsJElqLCRJagorCXZwY2xtdWxxZHEJXCQweDExLCRIa2V5LCRJaSwkWGhpCisJIHZtb3ZkcXUJMHg3MC0weDQwKCRIdGJsKSwkSGtleQkjICRIa2V5XjYKKwl2cHhvcgkJJFhtaSwkWm1pLCRabWkKKwkgdnB1bnBja2hxZHEJJElqLCRJaiwkVDEKKwl2cGNsbXVscWRxCVwkMHgwMCwkSEssJFQyLCRYbWkKKwkgdnB4b3IJCSRJaiwkVDEsJFQxCisKKwkgdm1vdmRxdQkweDEwKCRpbnApLCRJaQkJIyBJWzFdCisJdnB4b3IJCSRabG8sJFhsbywkWGxvCisJdnBjbG11bHFkcQlcJDB4MDAsJEhrZXksJElqLCRabG8KKwl2cHhvcgkJJFpoaSwkWGhpLCRYaGkKKwkgdnBzaHVmYgkkYnN3YXAsJElpLCRJaQorCXZwY2xtdWxxZHEJXCQweDExLCRIa2V5LCRJaiwkWmhpCisJIHZtb3ZkcXUJMHg5MC0weDQwKCRIdGJsKSwkSGtleQkjICRIa2V5XjcKKwl2cHhvcgkJJFptaSwkWG1pLCRYbWkKKwkgdnB1bnBja2hxZHEJJElpLCRJaSwkVDIKKwl2cGNsbXVscWRxCVwkMHgxMCwkSEssJFQxLCRabWkKKwkgdm1vdmRxdQkweGIwLTB4NDAoJEh0YmwpLCRISworCSB2cHhvcgkJJElpLCRUMiwkVDIKKworCSB2bW92ZHF1CSgkaW5wKSwkSWoJCSMgSVswXQorCXZweG9yCQkkWGxvLCRabG8sJFpsbworCXZwY2xtdWxxZHEJXCQweDAwLCRIa2V5LCRJaSwkWGxvCisJdnB4b3IJCSRYaGksJFpoaSwkWmhpCisJIHZwc2h1ZmIJJGJzd2FwLCRJaiwkSWoKKwl2cGNsbXVscWRxCVwkMHgxMSwkSGtleSwkSWksJFhoaQorCSB2bW92ZHF1CTB4YTAtMHg0MCgkSHRibCksJEhrZXkJIyAkSGtleV44CisJdnB4b3IJCSRYbWksJFptaSwkWm1pCisJdnBjbG11bHFkcQlcJDB4MTAsJEhLLCRUMiwkWG1pCisKKwlsZWEJCTB4ODAoJGlucCksJGlucAorCWNtcAkJXCQweDgwLCRsZW4KKwlqYgkJLkx0YWlsX2F2eAorCisJdnB4b3IJCSRYaSwkSWosJElqCQkjIGFjY3VtdWxhdGUgJFhpCisJc3ViCQlcJDB4ODAsJGxlbgorCWptcAkJLkxvb3A4eF9hdngKKworLmFsaWduCTMyCisuTG9vcDh4X2F2eDoKKwl2cHVucGNraHFkcQkkSWosJElqLCRUMQorCSB2bW92ZHF1CTB4NzAoJGlucCksJElpCQkjIElbN10KKwl2cHhvcgkJJFhsbywkWmxvLCRabG8KKwl2cHhvcgkJJElqLCRUMSwkVDEKKwl2cGNsbXVscWRxCVwkMHgwMCwkSGtleSwkSWosJFhpCisJIHZwc2h1ZmIJJGJzd2FwLCRJaSwkSWkKKwl2cHhvcgkJJFhoaSwkWmhpLCRaaGkKKwl2cGNsbXVscWRxCVwkMHgxMSwkSGtleSwkSWosJFhvCisJIHZtb3ZkcXUJMHgwMC0weDQwKCRIdGJsKSwkSGtleQkjICRIa2V5XjEKKwkgdnB1bnBja2hxZHEJJElpLCRJaSwkVDIKKwl2cHhvcgkJJFhtaSwkWm1pLCRabWkKKwl2cGNsbXVscWRxCVwkMHgwMCwkSEssJFQxLCRUcmVkCisJIHZtb3ZkcXUJMHgyMC0weDQwKCRIdGJsKSwkSEsKKwkgdnB4b3IJCSRJaSwkVDIsJFQyCisKKwkgIHZtb3ZkcXUJMHg2MCgkaW5wKSwkSWoJCSMgSVs2XQorCSB2cGNsbXVscWRxCVwkMHgwMCwkSGtleSwkSWksJFhsbworCXZweG9yCQkkWmxvLCRYaSwkWGkJCSMgY29sbGVjdCByZXN1bHQKKwkgIHZwc2h1ZmIJJGJzd2FwLCRJaiwkSWoKKwkgdnBjbG11bHFkcQlcJDB4MTEsJEhrZXksJElpLCRYaGkKKwl2eG9ycHMJCSRaaGksJFhvLCRYbworCSAgdm1vdmRxdQkweDEwLTB4NDAoJEh0YmwpLCRIa2V5CSMgJEhrZXleMgorCSB2cHVucGNraHFkcQkkSWosJElqLCRUMQorCSB2cGNsbXVscWRxCVwkMHgwMCwkSEssICAkVDIsJFhtaQorCXZweG9yCQkkWm1pLCRUcmVkLCRUcmVkCisJIHZ4b3JwcwkJJElqLCRUMSwkVDEKKworCSAgdm1vdmRxdQkweDUwKCRpbnApLCRJaQkJIyBJWzVdCisJdnB4b3IJCSRYaSwkVHJlZCwkVHJlZAkJIyBhZ2dyZWdhdGVkIEthcmF0c3ViYSBwb3N0LXByb2Nlc3NpbmcKKwkgdnBjbG11bHFkcQlcJDB4MDAsJEhrZXksJElqLCRabG8KKwl2cHhvcgkJJFhvLCRUcmVkLCRUcmVkCisJdnBzbGxkcQkJXCQ4LCRUcmVkLCRUMgorCSB2cHhvcgkJJFhsbywkWmxvLCRabG8KKwkgdnBjbG11bHFkcQlcJDB4MTEsJEhrZXksJElqLCRaaGkKKwl2cHNybGRxCQlcJDgsJFRyZWQsJFRyZWQKKwl2cHhvcgkJJFQyLCAkWGksICRYaQorCSAgdm1vdmRxdQkweDMwLTB4NDAoJEh0YmwpLCRIa2V5CSMgJEhrZXleMworCSAgdnBzaHVmYgkkYnN3YXAsJElpLCRJaQorCXZ4b3JwcwkJJFRyZWQsJFhvLCAkWG8KKwkgdnB4b3IJCSRYaGksJFpoaSwkWmhpCisJIHZwdW5wY2tocWRxCSRJaSwkSWksJFQyCisJIHZwY2xtdWxxZHEJXCQweDEwLCRISywgICRUMSwkWm1pCisJICB2bW92ZHF1CTB4NTAtMHg0MCgkSHRibCksJEhLCisJIHZweG9yCQkkSWksJFQyLCRUMgorCSB2cHhvcgkJJFhtaSwkWm1pLCRabWkKKworCSAgdm1vdmRxdQkweDQwKCRpbnApLCRJagkJIyBJWzRdCisJdnBhbGlnbnIJXCQ4LCRYaSwkWGksJFRyZWQJIyAxc3QgcGhhc2UKKwkgdnBjbG11bHFkcQlcJDB4MDAsJEhrZXksJElpLCRYbG8KKwkgIHZwc2h1ZmIJJGJzd2FwLCRJaiwkSWoKKwkgdnB4b3IJCSRabG8sJFhsbywkWGxvCisJIHZwY2xtdWxxZHEJXCQweDExLCRIa2V5LCRJaSwkWGhpCisJICB2bW92ZHF1CTB4NDAtMHg0MCgkSHRibCksJEhrZXkJIyAkSGtleV40CisJIHZwdW5wY2tocWRxCSRJaiwkSWosJFQxCisJIHZweG9yCQkkWmhpLCRYaGksJFhoaQorCSB2cGNsbXVscWRxCVwkMHgwMCwkSEssICAkVDIsJFhtaQorCSB2eG9ycHMJCSRJaiwkVDEsJFQxCisJIHZweG9yCQkkWm1pLCRYbWksJFhtaQorCisJICB2bW92ZHF1CTB4MzAoJGlucCksJElpCQkjIElbM10KKwl2cGNsbXVscWRxCVwkMHgxMCwoJXIxMCksJFhpLCRYaQorCSB2cGNsbXVscWRxCVwkMHgwMCwkSGtleSwkSWosJFpsbworCSAgdnBzaHVmYgkkYnN3YXAsJElpLCRJaQorCSB2cHhvcgkJJFhsbywkWmxvLCRabG8KKwkgdnBjbG11bHFkcQlcJDB4MTEsJEhrZXksJElqLCRaaGkKKwkgIHZtb3ZkcXUJMHg2MC0weDQwKCRIdGJsKSwkSGtleQkjICRIa2V5XjUKKwkgdnB1bnBja2hxZHEJJElpLCRJaSwkVDIKKwkgdnB4b3IJCSRYaGksJFpoaSwkWmhpCisJIHZwY2xtdWxxZHEJXCQweDEwLCRISywgICRUMSwkWm1pCisJICB2bW92ZHF1CTB4ODAtMHg0MCgkSHRibCksJEhLCisJIHZweG9yCQkkSWksJFQyLCRUMgorCSB2cHhvcgkJJFhtaSwkWm1pLCRabWkKKworCSAgdm1vdmRxdQkweDIwKCRpbnApLCRJagkJIyBJWzJdCisJIHZwY2xtdWxxZHEJXCQweDAwLCRIa2V5LCRJaSwkWGxvCisJICB2cHNodWZiCSRic3dhcCwkSWosJElqCisJIHZweG9yCQkkWmxvLCRYbG8sJFhsbworCSB2cGNsbXVscWRxCVwkMHgxMSwkSGtleSwkSWksJFhoaQorCSAgdm1vdmRxdQkweDcwLTB4NDAoJEh0YmwpLCRIa2V5CSMgJEhrZXleNgorCSB2cHVucGNraHFkcQkkSWosJElqLCRUMQorCSB2cHhvcgkJJFpoaSwkWGhpLCRYaGkKKwkgdnBjbG11bHFkcQlcJDB4MDAsJEhLLCAgJFQyLCRYbWkKKwkgdnB4b3IJCSRJaiwkVDEsJFQxCisJIHZweG9yCQkkWm1pLCRYbWksJFhtaQorCXZ4b3JwcwkJJFRyZWQsJFhpLCRYaQorCisJICB2bW92ZHF1CTB4MTAoJGlucCksJElpCQkjIElbMV0KKwl2cGFsaWducglcJDgsJFhpLCRYaSwkVHJlZAkjIDJuZCBwaGFzZQorCSB2cGNsbXVscWRxCVwkMHgwMCwkSGtleSwkSWosJFpsbworCSAgdnBzaHVmYgkkYnN3YXAsJElpLCRJaQorCSB2cHhvcgkJJFhsbywkWmxvLCRabG8KKwkgdnBjbG11bHFkcQlcJDB4MTEsJEhrZXksJElqLCRaaGkKKwkgIHZtb3ZkcXUJMHg5MC0weDQwKCRIdGJsKSwkSGtleQkjICRIa2V5XjcKKwl2cGNsbXVscWRxCVwkMHgxMCwoJXIxMCksJFhpLCRYaQorCXZ4b3JwcwkJJFhvLCRUcmVkLCRUcmVkCisJIHZwdW5wY2tocWRxCSRJaSwkSWksJFQyCisJIHZweG9yCQkkWGhpLCRaaGksJFpoaQorCSB2cGNsbXVscWRxCVwkMHgxMCwkSEssICAkVDEsJFptaQorCSAgdm1vdmRxdQkweGIwLTB4NDAoJEh0YmwpLCRISworCSB2cHhvcgkJJElpLCRUMiwkVDIKKwkgdnB4b3IJCSRYbWksJFptaSwkWm1pCisKKwkgIHZtb3ZkcXUJKCRpbnApLCRJagkJIyBJWzBdCisJIHZwY2xtdWxxZHEJXCQweDAwLCRIa2V5LCRJaSwkWGxvCisJICB2cHNodWZiCSRic3dhcCwkSWosJElqCisJIHZwY2xtdWxxZHEJXCQweDExLCRIa2V5LCRJaSwkWGhpCisJICB2bW92ZHF1CTB4YTAtMHg0MCgkSHRibCksJEhrZXkJIyAkSGtleV44CisJdnB4b3IJCSRUcmVkLCRJaiwkSWoKKwkgdnBjbG11bHFkcQlcJDB4MTAsJEhLLCAgJFQyLCRYbWkKKwl2cHhvcgkJJFhpLCRJaiwkSWoJCSMgYWNjdW11bGF0ZSAkWGkKKworCWxlYQkJMHg4MCgkaW5wKSwkaW5wCisJc3ViCQlcJDB4ODAsJGxlbgorCWpuYwkJLkxvb3A4eF9hdngKKworCWFkZAkJXCQweDgwLCRsZW4KKwlqbXAJCS5MdGFpbF9ub194b3JfYXZ4CisKKy5hbGlnbgkzMgorLkxzaG9ydF9hdng6CisJdm1vdmRxdQkJLTB4MTAoJGlucCwkbGVuKSwkSWkJIyB2ZXJ5IGxhc3Qgd29yZAorCWxlYQkJKCRpbnAsJGxlbiksJGlucAorCXZtb3ZkcXUJCTB4MDAtMHg0MCgkSHRibCksJEhrZXkJIyAkSGtleV4xCisJdm1vdmRxdQkJMHgyMC0weDQwKCRIdGJsKSwkSEsKKwl2cHNodWZiCQkkYnN3YXAsJElpLCRJagorCisJdm1vdmRxYQkJJFhsbywkWmxvCQkjIHN1YnRsZSB3YXkgdG8gemVybyAkWmxvLAorCXZtb3ZkcWEJCSRYaGksJFpoaQkJIyAkWmhpIGFuZAorCXZtb3ZkcWEJCSRYbWksJFptaQkJIyAkWm1pCisJc3ViCQlcJDB4MTAsJGxlbgorCWp6CQkuTHRhaWxfYXZ4CisKKwl2cHVucGNraHFkcQkkSWosJElqLCRUMQorCXZweG9yCQkkWGxvLCRabG8sJFpsbworCXZwY2xtdWxxZHEJXCQweDAwLCRIa2V5LCRJaiwkWGxvCisJdnB4b3IJCSRJaiwkVDEsJFQxCisJIHZtb3ZkcXUJLTB4MjAoJGlucCksJElpCisJdnB4b3IJCSRYaGksJFpoaSwkWmhpCisJdnBjbG11bHFkcQlcJDB4MTEsJEhrZXksJElqLCRYaGkKKwl2bW92ZHF1CQkweDEwLTB4NDAoJEh0YmwpLCRIa2V5CSMgJEhrZXleMgorCSB2cHNodWZiCSRic3dhcCwkSWksJElqCisJdnB4b3IJCSRYbWksJFptaSwkWm1pCisJdnBjbG11bHFkcQlcJDB4MDAsJEhLLCRUMSwkWG1pCisJdnBzcmxkcQkJXCQ4LCRISywkSEsKKwlzdWIJCVwkMHgxMCwkbGVuCisJanoJCS5MdGFpbF9hdngKKworCXZwdW5wY2tocWRxCSRJaiwkSWosJFQxCisJdnB4b3IJCSRYbG8sJFpsbywkWmxvCisJdnBjbG11bHFkcQlcJDB4MDAsJEhrZXksJElqLCRYbG8KKwl2cHhvcgkJJElqLCRUMSwkVDEKKwkgdm1vdmRxdQktMHgzMCgkaW5wKSwkSWkKKwl2cHhvcgkJJFhoaSwkWmhpLCRaaGkKKwl2cGNsbXVscWRxCVwkMHgxMSwkSGtleSwkSWosJFhoaQorCXZtb3ZkcXUJCTB4MzAtMHg0MCgkSHRibCksJEhrZXkJIyAkSGtleV4zCisJIHZwc2h1ZmIJJGJzd2FwLCRJaSwkSWoKKwl2cHhvcgkJJFhtaSwkWm1pLCRabWkKKwl2cGNsbXVscWRxCVwkMHgwMCwkSEssJFQxLCRYbWkKKwl2bW92ZHF1CQkweDUwLTB4NDAoJEh0YmwpLCRISworCXN1YgkJXCQweDEwLCRsZW4KKwlqegkJLkx0YWlsX2F2eAorCisJdnB1bnBja2hxZHEJJElqLCRJaiwkVDEKKwl2cHhvcgkJJFhsbywkWmxvLCRabG8KKwl2cGNsbXVscWRxCVwkMHgwMCwkSGtleSwkSWosJFhsbworCXZweG9yCQkkSWosJFQxLCRUMQorCSB2bW92ZHF1CS0weDQwKCRpbnApLCRJaQorCXZweG9yCQkkWGhpLCRaaGksJFpoaQorCXZwY2xtdWxxZHEJXCQweDExLCRIa2V5LCRJaiwkWGhpCisJdm1vdmRxdQkJMHg0MC0weDQwKCRIdGJsKSwkSGtleQkjICRIa2V5XjQKKwkgdnBzaHVmYgkkYnN3YXAsJElpLCRJagorCXZweG9yCQkkWG1pLCRabWksJFptaQorCXZwY2xtdWxxZHEJXCQweDAwLCRISywkVDEsJFhtaQorCXZwc3JsZHEJCVwkOCwkSEssJEhLCisJc3ViCQlcJDB4MTAsJGxlbgorCWp6CQkuTHRhaWxfYXZ4CisKKwl2cHVucGNraHFkcQkkSWosJElqLCRUMQorCXZweG9yCQkkWGxvLCRabG8sJFpsbworCXZwY2xtdWxxZHEJXCQweDAwLCRIa2V5LCRJaiwkWGxvCisJdnB4b3IJCSRJaiwkVDEsJFQxCisJIHZtb3ZkcXUJLTB4NTAoJGlucCksJElpCisJdnB4b3IJCSRYaGksJFpoaSwkWmhpCisJdnBjbG11bHFkcQlcJDB4MTEsJEhrZXksJElqLCRYaGkKKwl2bW92ZHF1CQkweDYwLTB4NDAoJEh0YmwpLCRIa2V5CSMgJEhrZXleNQorCSB2cHNodWZiCSRic3dhcCwkSWksJElqCisJdnB4b3IJCSRYbWksJFptaSwkWm1pCisJdnBjbG11bHFkcQlcJDB4MDAsJEhLLCRUMSwkWG1pCisJdm1vdmRxdQkJMHg4MC0weDQwKCRIdGJsKSwkSEsKKwlzdWIJCVwkMHgxMCwkbGVuCisJanoJCS5MdGFpbF9hdngKKworCXZwdW5wY2tocWRxCSRJaiwkSWosJFQxCisJdnB4b3IJCSRYbG8sJFpsbywkWmxvCisJdnBjbG11bHFkcQlcJDB4MDAsJEhrZXksJElqLCRYbG8KKwl2cHhvcgkJJElqLCRUMSwkVDEKKwkgdm1vdmRxdQktMHg2MCgkaW5wKSwkSWkKKwl2cHhvcgkJJFhoaSwkWmhpLCRaaGkKKwl2cGNsbXVscWRxCVwkMHgxMSwkSGtleSwkSWosJFhoaQorCXZtb3ZkcXUJCTB4NzAtMHg0MCgkSHRibCksJEhrZXkJIyAkSGtleV42CisJIHZwc2h1ZmIJJGJzd2FwLCRJaSwkSWoKKwl2cHhvcgkJJFhtaSwkWm1pLCRabWkKKwl2cGNsbXVscWRxCVwkMHgwMCwkSEssJFQxLCRYbWkKKwl2cHNybGRxCQlcJDgsJEhLLCRISworCXN1YgkJXCQweDEwLCRsZW4KKwlqegkJLkx0YWlsX2F2eAorCisJdnB1bnBja2hxZHEJJElqLCRJaiwkVDEKKwl2cHhvcgkJJFhsbywkWmxvLCRabG8KKwl2cGNsbXVscWRxCVwkMHgwMCwkSGtleSwkSWosJFhsbworCXZweG9yCQkkSWosJFQxLCRUMQorCSB2bW92ZHF1CS0weDcwKCRpbnApLCRJaQorCXZweG9yCQkkWGhpLCRaaGksJFpoaQorCXZwY2xtdWxxZHEJXCQweDExLCRIa2V5LCRJaiwkWGhpCisJdm1vdmRxdQkJMHg5MC0weDQwKCRIdGJsKSwkSGtleQkjICRIa2V5XjcKKwkgdnBzaHVmYgkkYnN3YXAsJElpLCRJagorCXZweG9yCQkkWG1pLCRabWksJFptaQorCXZwY2xtdWxxZHEJXCQweDAwLCRISywkVDEsJFhtaQorCXZtb3ZxCQkweGI4LTB4NDAoJEh0YmwpLCRISworCXN1YgkJXCQweDEwLCRsZW4KKwlqbXAJCS5MdGFpbF9hdngKKworLmFsaWduCTMyCisuTHRhaWxfYXZ4OgorCXZweG9yCQkkWGksJElqLCRJagkJIyBhY2N1bXVsYXRlICRYaQorLkx0YWlsX25vX3hvcl9hdng6CisJdnB1bnBja2hxZHEJJElqLCRJaiwkVDEKKwl2cHhvcgkJJFhsbywkWmxvLCRabG8KKwl2cGNsbXVscWRxCVwkMHgwMCwkSGtleSwkSWosJFhsbworCXZweG9yCQkkSWosJFQxLCRUMQorCXZweG9yCQkkWGhpLCRaaGksJFpoaQorCXZwY2xtdWxxZHEJXCQweDExLCRIa2V5LCRJaiwkWGhpCisJdnB4b3IJCSRYbWksJFptaSwkWm1pCisJdnBjbG11bHFkcQlcJDB4MDAsJEhLLCRUMSwkWG1pCisKKwl2bW92ZHF1CQkoJXIxMCksJFRyZWQKKworCXZweG9yCQkkWGxvLCRabG8sJFhpCisJdnB4b3IJCSRYaGksJFpoaSwkWG8KKwl2cHhvcgkJJFhtaSwkWm1pLCRabWkKKworCXZweG9yCQkkWGksICRabWksJFptaQkJIyBhZ2dyZWdhdGVkIEthcmF0c3ViYSBwb3N0LXByb2Nlc3NpbmcKKwl2cHhvcgkJJFhvLCAkWm1pLCRabWkKKwl2cHNsbGRxCQlcJDgsICRabWksJFQyCisJdnBzcmxkcQkJXCQ4LCAkWm1pLCRabWkKKwl2cHhvcgkJJFQyLCAkWGksICRYaQorCXZweG9yCQkkWm1pLCRYbywgJFhvCisKKwl2cGNsbXVscWRxCVwkMHgxMCwkVHJlZCwkWGksJFQyCSMgMXN0IHBoYXNlCisJdnBhbGlnbnIJXCQ4LCRYaSwkWGksJFhpCisJdnB4b3IJCSRUMiwkWGksJFhpCisKKwl2cGNsbXVscWRxCVwkMHgxMCwkVHJlZCwkWGksJFQyCSMgMm5kIHBoYXNlCisJdnBhbGlnbnIJXCQ4LCRYaSwkWGksJFhpCisJdnB4b3IJCSRYbywkWGksJFhpCisJdnB4b3IJCSRUMiwkWGksJFhpCisKKwljbXAJCVwkMCwkbGVuCisJam5lCQkuTHNob3J0X2F2eAorCisJdnBzaHVmYgkJJGJzd2FwLCRYaSwkWGkKKwl2bW92ZHF1CQkkWGksKCRYaXApCisJdnplcm91cHBlcgorX19fCiskY29kZS49PDxfX18gaWYgKCR3aW42NCk7CisJbW92YXBzCSglcnNwKSwleG1tNgorCW1vdmFwcwkweDEwKCVyc3ApLCV4bW03CisJbW92YXBzCTB4MjAoJXJzcCksJXhtbTgKKwltb3ZhcHMJMHgzMCglcnNwKSwleG1tOQorCW1vdmFwcwkweDQwKCVyc3ApLCV4bW0xMAorCW1vdmFwcwkweDUwKCVyc3ApLCV4bW0xMQorCW1vdmFwcwkweDYwKCVyc3ApLCV4bW0xMgorCW1vdmFwcwkweDcwKCVyc3ApLCV4bW0xMworCW1vdmFwcwkweDgwKCVyc3ApLCV4bW0xNAorCW1vdmFwcwkweDkwKCVyc3ApLCV4bW0xNQorCWxlYQkweGE4KCVyc3ApLCVyc3AKKy5MU0VIX2VuZF9nY21fZ2hhc2hfYXZ4OgorX19fCiskY29kZS49PDxfX187CisJcmV0Cisuc2l6ZQlnY21fZ2hhc2hfYXZ4LC4tZ2NtX2doYXNoX2F2eAorX19fCit9IGVsc2UgeworJGNvZGUuPTw8X19fOworCWptcAkuTF9naGFzaF9jbG11bAorLnNpemUJZ2NtX2doYXNoX2F2eCwuLWdjbV9naGFzaF9hdngKK19fXworfQorDAorJGNvZGUuPTw8X19fOworLmFsaWduCTY0CisuTGJzd2FwX21hc2s6CisJLmJ5dGUJMTUsMTQsMTMsMTIsMTEsMTAsOSw4LDcsNiw1LDQsMywyLDEsMAorLkwweDFjMl9wb2x5bm9taWFsOgorCS5ieXRlCTEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB4YzIKKy5MN19tYXNrOgorCS5sb25nCTcsMCw3LDAKKy5MN19tYXNrX3BvbHk6CisJLmxvbmcJNywwLGAweEUxPDwxYCwwCisuYWxpZ24JNjQKKy50eXBlCS5McmVtXzRiaXQsXEBvYmplY3QKKy5McmVtXzRiaXQ6CisJLmxvbmcJMCxgMHgwMDAwPDwxNmAsMCxgMHgxQzIwPDwxNmAsMCxgMHgzODQwPDwxNmAsMCxgMHgyNDYwPDwxNmAKKwkubG9uZwkwLGAweDcwODA8PDE2YCwwLGAweDZDQTA8PDE2YCwwLGAweDQ4QzA8PDE2YCwwLGAweDU0RTA8PDE2YAorCS5sb25nCTAsYDB4RTEwMDw8MTZgLDAsYDB4RkQyMDw8MTZgLDAsYDB4RDk0MDw8MTZgLDAsYDB4QzU2MDw8MTZgCisJLmxvbmcJMCxgMHg5MTgwPDwxNmAsMCxgMHg4REEwPDwxNmAsMCxgMHhBOUMwPDwxNmAsMCxgMHhCNUUwPDwxNmAKKy50eXBlCS5McmVtXzhiaXQsXEBvYmplY3QKKy5McmVtXzhiaXQ6CisJLnZhbHVlCTB4MDAwMCwweDAxQzIsMHgwMzg0LDB4MDI0NiwweDA3MDgsMHgwNkNBLDB4MDQ4QywweDA1NEUKKwkudmFsdWUJMHgwRTEwLDB4MEZEMiwweDBEOTQsMHgwQzU2LDB4MDkxOCwweDA4REEsMHgwQTlDLDB4MEI1RQorCS52YWx1ZQkweDFDMjAsMHgxREUyLDB4MUZBNCwweDFFNjYsMHgxQjI4LDB4MUFFQSwweDE4QUMsMHgxOTZFCisJLnZhbHVlCTB4MTIzMCwweDEzRjIsMHgxMUI0LDB4MTA3NiwweDE1MzgsMHgxNEZBLDB4MTZCQywweDE3N0UKKwkudmFsdWUJMHgzODQwLDB4Mzk4MiwweDNCQzQsMHgzQTA2LDB4M0Y0OCwweDNFOEEsMHgzQ0NDLDB4M0QwRQorCS52YWx1ZQkweDM2NTAsMHgzNzkyLDB4MzVENCwweDM0MTYsMHgzMTU4LDB4MzA5QSwweDMyREMsMHgzMzFFCisJLnZhbHVlCTB4MjQ2MCwweDI1QTIsMHgyN0U0LDB4MjYyNiwweDIzNjgsMHgyMkFBLDB4MjBFQywweDIxMkUKKwkudmFsdWUJMHgyQTcwLDB4MkJCMiwweDI5RjQsMHgyODM2LDB4MkQ3OCwweDJDQkEsMHgyRUZDLDB4MkYzRQorCS52YWx1ZQkweDcwODAsMHg3MTQyLDB4NzMwNCwweDcyQzYsMHg3Nzg4LDB4NzY0QSwweDc0MEMsMHg3NUNFCisJLnZhbHVlCTB4N0U5MCwweDdGNTIsMHg3RDE0LDB4N0NENiwweDc5OTgsMHg3ODVBLDB4N0ExQywweDdCREUKKwkudmFsdWUJMHg2Q0EwLDB4NkQ2MiwweDZGMjQsMHg2RUU2LDB4NkJBOCwweDZBNkEsMHg2ODJDLDB4NjlFRQorCS52YWx1ZQkweDYyQjAsMHg2MzcyLDB4NjEzNCwweDYwRjYsMHg2NUI4LDB4NjQ3QSwweDY2M0MsMHg2N0ZFCisJLnZhbHVlCTB4NDhDMCwweDQ5MDIsMHg0QjQ0LDB4NEE4NiwweDRGQzgsMHg0RTBBLDB4NEM0QywweDREOEUKKwkudmFsdWUJMHg0NkQwLDB4NDcxMiwweDQ1NTQsMHg0NDk2LDB4NDFEOCwweDQwMUEsMHg0MjVDLDB4NDM5RQorCS52YWx1ZQkweDU0RTAsMHg1NTIyLDB4NTc2NCwweDU2QTYsMHg1M0U4LDB4NTIyQSwweDUwNkMsMHg1MUFFCisJLnZhbHVlCTB4NUFGMCwweDVCMzIsMHg1OTc0LDB4NThCNiwweDVERjgsMHg1QzNBLDB4NUU3QywweDVGQkUKKwkudmFsdWUJMHhFMTAwLDB4RTBDMiwweEUyODQsMHhFMzQ2LDB4RTYwOCwweEU3Q0EsMHhFNThDLDB4RTQ0RQorCS52YWx1ZQkweEVGMTAsMHhFRUQyLDB4RUM5NCwweEVENTYsMHhFODE4LDB4RTlEQSwweEVCOUMsMHhFQTVFCisJLnZhbHVlCTB4RkQyMCwweEZDRTIsMHhGRUE0LDB4RkY2NiwweEZBMjgsMHhGQkVBLDB4RjlBQywweEY4NkUKKwkudmFsdWUJMHhGMzMwLDB4RjJGMiwweEYwQjQsMHhGMTc2LDB4RjQzOCwweEY1RkEsMHhGN0JDLDB4RjY3RQorCS52YWx1ZQkweEQ5NDAsMHhEODgyLDB4REFDNCwweERCMDYsMHhERTQ4LDB4REY4QSwweEREQ0MsMHhEQzBFCisJLnZhbHVlCTB4RDc1MCwweEQ2OTIsMHhENEQ0LDB4RDUxNiwweEQwNTgsMHhEMTlBLDB4RDNEQywweEQyMUUKKwkudmFsdWUJMHhDNTYwLDB4QzRBMiwweEM2RTQsMHhDNzI2LDB4QzI2OCwweEMzQUEsMHhDMUVDLDB4QzAyRQorCS52YWx1ZQkweENCNzAsMHhDQUIyLDB4QzhGNCwweEM5MzYsMHhDQzc4LDB4Q0RCQSwweENGRkMsMHhDRTNFCisJLnZhbHVlCTB4OTE4MCwweDkwNDIsMHg5MjA0LDB4OTNDNiwweDk2ODgsMHg5NzRBLDB4OTUwQywweDk0Q0UKKwkudmFsdWUJMHg5RjkwLDB4OUU1MiwweDlDMTQsMHg5REQ2LDB4OTg5OCwweDk5NUEsMHg5QjFDLDB4OUFERQorCS52YWx1ZQkweDhEQTAsMHg4QzYyLDB4OEUyNCwweDhGRTYsMHg4QUE4LDB4OEI2QSwweDg5MkMsMHg4OEVFCisJLnZhbHVlCTB4ODNCMCwweDgyNzIsMHg4MDM0LDB4ODFGNiwweDg0QjgsMHg4NTdBLDB4ODczQywweDg2RkUKKwkudmFsdWUJMHhBOUMwLDB4QTgwMiwweEFBNDQsMHhBQjg2LDB4QUVDOCwweEFGMEEsMHhBRDRDLDB4QUM4RQorCS52YWx1ZQkweEE3RDAsMHhBNjEyLDB4QTQ1NCwweEE1OTYsMHhBMEQ4LDB4QTExQSwweEEzNUMsMHhBMjlFCisJLnZhbHVlCTB4QjVFMCwweEI0MjIsMHhCNjY0LDB4QjdBNiwweEIyRTgsMHhCMzJBLDB4QjE2QywweEIwQUUKKwkudmFsdWUJMHhCQkYwLDB4QkEzMiwweEI4NzQsMHhCOUI2LDB4QkNGOCwweEJEM0EsMHhCRjdDLDB4QkVCRQorCisuYXNjaXoJIkdIQVNIIGZvciB4ODZfNjQsIENSWVBUT0dBTVMgYnkgPGFwcHJvXEBvcGVuc3NsLm9yZz4iCisuYWxpZ24JNjQKK19fXworDAorIyBFWENFUFRJT05fRElTUE9TSVRJT04gaGFuZGxlciAoRVhDRVBUSU9OX1JFQ09SRCAqcmVjLFVMT05HNjQgZnJhbWUsCisjCQlDT05URVhUICpjb250ZXh0LERJU1BBVENIRVJfQ09OVEVYVCAqZGlzcCkKK2lmICgkd2luNjQpIHsKKyRyZWM9IiVyY3giOworJGZyYW1lPSIlcmR4IjsKKyRjb250ZXh0PSIlcjgiOworJGRpc3A9IiVyOSI7CisKKyRjb2RlLj08PF9fXzsKKy5leHRlcm4JX19pbXBfUnRsVmlydHVhbFVud2luZAorLnR5cGUJc2VfaGFuZGxlcixcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMTYKK3NlX2hhbmRsZXI6CisJcHVzaAklcnNpCisJcHVzaAklcmRpCisJcHVzaAklcmJ4CisJcHVzaAklcmJwCisJcHVzaAklcjEyCisJcHVzaAklcjEzCisJcHVzaAklcjE0CisJcHVzaAklcjE1CisJcHVzaGZxCisJc3ViCVwkNjQsJXJzcAorCisJbW92CTEyMCgkY29udGV4dCksJXJheAkjIHB1bGwgY29udGV4dC0+UmF4CisJbW92CTI0OCgkY29udGV4dCksJXJieAkjIHB1bGwgY29udGV4dC0+UmlwCisKKwltb3YJOCgkZGlzcCksJXJzaQkJIyBkaXNwLT5JbWFnZUJhc2UKKwltb3YJNTYoJGRpc3ApLCVyMTEJCSMgZGlzcC0+SGFuZGxlckRhdGEKKworCW1vdgkwKCVyMTEpLCVyMTBkCQkjIEhhbmRsZXJEYXRhWzBdCisJbGVhCSglcnNpLCVyMTApLCVyMTAJIyBwcm9sb2d1ZSBsYWJlbAorCWNtcAklcjEwLCVyYngJCSMgY29udGV4dC0+UmlwPHByb2xvZ3VlIGxhYmVsCisJamIJLkxpbl9wcm9sb2d1ZQorCisJbW92CTE1MigkY29udGV4dCksJXJheAkjIHB1bGwgY29udGV4dC0+UnNwCisKKwltb3YJNCglcjExKSwlcjEwZAkJIyBIYW5kbGVyRGF0YVsxXQorCWxlYQkoJXJzaSwlcjEwKSwlcjEwCSMgZXBpbG9ndWUgbGFiZWwKKwljbXAJJXIxMCwlcmJ4CQkjIGNvbnRleHQtPlJpcD49ZXBpbG9ndWUgbGFiZWwKKwlqYWUJLkxpbl9wcm9sb2d1ZQorCisJbGVhCTI0KCVyYXgpLCVyYXgJCSMgYWRqdXN0ICJyc3AiCisKKwltb3YJLTgoJXJheCksJXJieAorCW1vdgktMTYoJXJheCksJXJicAorCW1vdgktMjQoJXJheCksJXIxMgorCW1vdgklcmJ4LDE0NCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJieAorCW1vdgklcmJwLDE2MCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJicAorCW1vdgklcjEyLDIxNigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlIxMgorCisuTGluX3Byb2xvZ3VlOgorCW1vdgk4KCVyYXgpLCVyZGkKKwltb3YJMTYoJXJheCksJXJzaQorCW1vdgklcmF4LDE1MigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJzcAorCW1vdgklcnNpLDE2OCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJzaQorCW1vdgklcmRpLDE3NigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJkaQorCisJbW92CTQwKCRkaXNwKSwlcmRpCQkjIGRpc3AtPkNvbnRleHRSZWNvcmQKKwltb3YJJGNvbnRleHQsJXJzaQkJIyBjb250ZXh0CisJbW92CVwkYDEyMzIvOGAsJWVjeAkJIyBzaXplb2YoQ09OVEVYVCkKKwkubG9uZwkweGE1NDhmM2ZjCQkjIGNsZDsgcmVwIG1vdnNxCisKKwltb3YJJGRpc3AsJXJzaQorCXhvcgklcmN4LCVyY3gJCSMgYXJnMSwgVU5XX0ZMQUdfTkhBTkRMRVIKKwltb3YJOCglcnNpKSwlcmR4CQkjIGFyZzIsIGRpc3AtPkltYWdlQmFzZQorCW1vdgkwKCVyc2kpLCVyOAkJIyBhcmczLCBkaXNwLT5Db250cm9sUGMKKwltb3YJMTYoJXJzaSksJXI5CQkjIGFyZzQsIGRpc3AtPkZ1bmN0aW9uRW50cnkKKwltb3YJNDAoJXJzaSksJXIxMAkJIyBkaXNwLT5Db250ZXh0UmVjb3JkCisJbGVhCTU2KCVyc2kpLCVyMTEJCSMgJmRpc3AtPkhhbmRsZXJEYXRhCisJbGVhCTI0KCVyc2kpLCVyMTIJCSMgJmRpc3AtPkVzdGFibGlzaGVyRnJhbWUKKwltb3YJJXIxMCwzMiglcnNwKQkJIyBhcmc1CisJbW92CSVyMTEsNDAoJXJzcCkJCSMgYXJnNgorCW1vdgklcjEyLDQ4KCVyc3ApCQkjIGFyZzcKKwltb3YJJXJjeCw1NiglcnNwKQkJIyBhcmc4LCAoTlVMTCkKKwljYWxsCSpfX2ltcF9SdGxWaXJ0dWFsVW53aW5kKCVyaXApCisKKwltb3YJXCQxLCVlYXgJCSMgRXhjZXB0aW9uQ29udGludWVTZWFyY2gKKwlhZGQJXCQ2NCwlcnNwCisJcG9wZnEKKwlwb3AJJXIxNQorCXBvcAklcjE0CisJcG9wCSVyMTMKKwlwb3AJJXIxMgorCXBvcAklcmJwCisJcG9wCSVyYngKKwlwb3AJJXJkaQorCXBvcAklcnNpCisJcmV0Cisuc2l6ZQlzZV9oYW5kbGVyLC4tc2VfaGFuZGxlcgorCisuc2VjdGlvbgkucGRhdGEKKy5hbGlnbgk0CisJLnJ2YQkuTFNFSF9iZWdpbl9nY21fZ211bHRfNGJpdAorCS5ydmEJLkxTRUhfZW5kX2djbV9nbXVsdF80Yml0CisJLnJ2YQkuTFNFSF9pbmZvX2djbV9nbXVsdF80Yml0CisKKwkucnZhCS5MU0VIX2JlZ2luX2djbV9naGFzaF80Yml0CisJLnJ2YQkuTFNFSF9lbmRfZ2NtX2doYXNoXzRiaXQKKwkucnZhCS5MU0VIX2luZm9fZ2NtX2doYXNoXzRiaXQKKworCS5ydmEJLkxTRUhfYmVnaW5fZ2NtX2luaXRfY2xtdWwKKwkucnZhCS5MU0VIX2VuZF9nY21faW5pdF9jbG11bAorCS5ydmEJLkxTRUhfaW5mb19nY21faW5pdF9jbG11bAorCisJLnJ2YQkuTFNFSF9iZWdpbl9nY21fZ2hhc2hfY2xtdWwKKwkucnZhCS5MU0VIX2VuZF9nY21fZ2hhc2hfY2xtdWwKKwkucnZhCS5MU0VIX2luZm9fZ2NtX2doYXNoX2NsbXVsCitfX18KKyRjb2RlLj08PF9fXwlpZiAoJGF2eCk7CisJLnJ2YQkuTFNFSF9iZWdpbl9nY21faW5pdF9hdngKKwkucnZhCS5MU0VIX2VuZF9nY21faW5pdF9hdngKKwkucnZhCS5MU0VIX2luZm9fZ2NtX2luaXRfY2xtdWwKKworCS5ydmEJLkxTRUhfYmVnaW5fZ2NtX2doYXNoX2F2eAorCS5ydmEJLkxTRUhfZW5kX2djbV9naGFzaF9hdngKKwkucnZhCS5MU0VIX2luZm9fZ2NtX2doYXNoX2NsbXVsCitfX18KKyRjb2RlLj08PF9fXzsKKy5zZWN0aW9uCS54ZGF0YQorLmFsaWduCTgKKy5MU0VIX2luZm9fZ2NtX2dtdWx0XzRiaXQ6CisJLmJ5dGUJOSwwLDAsMAorCS5ydmEJc2VfaGFuZGxlcgorCS5ydmEJLkxnbXVsdF9wcm9sb2d1ZSwuTGdtdWx0X2VwaWxvZ3VlCSMgSGFuZGxlckRhdGEKKy5MU0VIX2luZm9fZ2NtX2doYXNoXzRiaXQ6CisJLmJ5dGUJOSwwLDAsMAorCS5ydmEJc2VfaGFuZGxlcgorCS5ydmEJLkxnaGFzaF9wcm9sb2d1ZSwuTGdoYXNoX2VwaWxvZ3VlCSMgSGFuZGxlckRhdGEKKy5MU0VIX2luZm9fZ2NtX2luaXRfY2xtdWw6CisJLmJ5dGUJMHgwMSwweDA4LDB4MDMsMHgwMAorCS5ieXRlCTB4MDgsMHg2OCwweDAwLDB4MDAJI21vdmFwcwkweDAwKHJzcCkseG1tNgorCS5ieXRlCTB4MDQsMHgyMiwweDAwLDB4MDAJI3N1Yglyc3AsMHgxOAorLkxTRUhfaW5mb19nY21fZ2hhc2hfY2xtdWw6CisJLmJ5dGUJMHgwMSwweDMzLDB4MTYsMHgwMAorCS5ieXRlCTB4MzMsMHhmOCwweDA5LDB4MDAJI21vdmFwcyAweDkwKHJzcCkseG1tMTUKKwkuYnl0ZQkweDJlLDB4ZTgsMHgwOCwweDAwCSNtb3ZhcHMgMHg4MChyc3ApLHhtbTE0CisJLmJ5dGUJMHgyOSwweGQ4LDB4MDcsMHgwMAkjbW92YXBzIDB4NzAocnNwKSx4bW0xMworCS5ieXRlCTB4MjQsMHhjOCwweDA2LDB4MDAJI21vdmFwcyAweDYwKHJzcCkseG1tMTIKKwkuYnl0ZQkweDFmLDB4YjgsMHgwNSwweDAwCSNtb3ZhcHMgMHg1MChyc3ApLHhtbTExCisJLmJ5dGUJMHgxYSwweGE4LDB4MDQsMHgwMAkjbW92YXBzIDB4NDAocnNwKSx4bW0xMAorCS5ieXRlCTB4MTUsMHg5OCwweDAzLDB4MDAJI21vdmFwcyAweDMwKHJzcCkseG1tOQorCS5ieXRlCTB4MTAsMHg4OCwweDAyLDB4MDAJI21vdmFwcyAweDIwKHJzcCkseG1tOAorCS5ieXRlCTB4MGMsMHg3OCwweDAxLDB4MDAJI21vdmFwcyAweDEwKHJzcCkseG1tNworCS5ieXRlCTB4MDgsMHg2OCwweDAwLDB4MDAJI21vdmFwcyAweDAwKHJzcCkseG1tNgorCS5ieXRlCTB4MDQsMHgwMSwweDE1LDB4MDAJI3N1Yglyc3AsMHhhOAorX19fCit9CisMCiskY29kZSA9fiBzL1xgKFteXGBdKilcYC9ldmFsKCQxKS9nZW07CisKK3ByaW50ICRjb2RlOworCitjbG9zZSBTVERPVVQ7CmRpZmYgLS1naXQgYS9jcnlwdG8vbW9kZXMvY2JjLmMgYi9jcnlwdG8vbW9kZXMvY2JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNkNThmMAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9tb2Rlcy9jYmMuYwpAQCAtMCwwICsxLDIwMiBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworI2luY2x1ZGUgPG9wZW5zc2wvbW9kZXMuaD4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworCisjaWZuZGVmIFNUUklDVF9BTElHTk1FTlQKKyMgIGRlZmluZSBTVFJJQ1RfQUxJR05NRU5UIDAKKyNlbmRpZgorCit2b2lkIENSWVBUT19jYmMxMjhfZW5jcnlwdChjb25zdCB1aW50OF90ICppbiwgdWludDhfdCAqb3V0LCBzaXplX3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqa2V5LCB1aW50OF90IGl2ZWNbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sxMjhfZiBibG9jaykgeworICBzaXplX3QgbjsKKyAgY29uc3QgdWludDhfdCAqaXYgPSBpdmVjOworCisgIGFzc2VydChpbiAmJiBvdXQgJiYga2V5ICYmIGl2ZWMpOworCisgIGlmIChTVFJJQ1RfQUxJR05NRU5UICYmCisgICAgICAoKHNpemVfdClpbiB8IChzaXplX3Qpb3V0IHwgKHNpemVfdClpdmVjKSAlIHNpemVvZihzaXplX3QpICE9IDApIHsKKyAgICB3aGlsZSAobGVuID49IDE2KSB7CisgICAgICBmb3IgKG4gPSAwOyBuIDwgMTY7ICsrbikgeworICAgICAgICBvdXRbbl0gPSBpbltuXSBeIGl2W25dOworICAgICAgfQorICAgICAgKCpibG9jaykob3V0LCBvdXQsIGtleSk7CisgICAgICBpdiA9IG91dDsKKyAgICAgIGxlbiAtPSAxNjsKKyAgICAgIGluICs9IDE2OworICAgICAgb3V0ICs9IDE2OworICAgIH0KKyAgfSBlbHNlIHsKKyAgICB3aGlsZSAobGVuID49IDE2KSB7CisgICAgICBmb3IgKG4gPSAwOyBuIDwgMTY7IG4gKz0gc2l6ZW9mKHNpemVfdCkpIHsKKyAgICAgICAgKihzaXplX3QgKikob3V0ICsgbikgPSAqKHNpemVfdCAqKShpbiArIG4pIF4gKihzaXplX3QgKikoaXYgKyBuKTsKKyAgICAgIH0KKyAgICAgICgqYmxvY2spKG91dCwgb3V0LCBrZXkpOworICAgICAgaXYgPSBvdXQ7CisgICAgICBsZW4gLT0gMTY7CisgICAgICBpbiArPSAxNjsKKyAgICAgIG91dCArPSAxNjsKKyAgICB9CisgIH0KKworICB3aGlsZSAobGVuKSB7CisgICAgZm9yIChuID0gMDsgbiA8IDE2ICYmIG4gPCBsZW47ICsrbikgeworICAgICAgb3V0W25dID0gaW5bbl0gXiBpdltuXTsKKyAgICB9CisgICAgZm9yICg7IG4gPCAxNjsgKytuKSB7CisgICAgICBvdXRbbl0gPSBpdltuXTsKKyAgICB9CisgICAgKCpibG9jaykob3V0LCBvdXQsIGtleSk7CisgICAgaXYgPSBvdXQ7CisgICAgaWYgKGxlbiA8PSAxNikgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGxlbiAtPSAxNjsKKyAgICBpbiArPSAxNjsKKyAgICBvdXQgKz0gMTY7CisgIH0KKworICBtZW1jcHkoaXZlYywgaXYsIDE2KTsKK30KKwordm9pZCBDUllQVE9fY2JjMTI4X2RlY3J5cHQoY29uc3QgdWludDhfdCAqaW4sIHVpbnQ4X3QgKm91dCwgc2l6ZV90IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmtleSwgdWludDhfdCBpdmVjWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrMTI4X2YgYmxvY2spIHsKKyAgc2l6ZV90IG47CisgIHVuaW9uIHsKKyAgICBzaXplX3QgdFsxNiAvIHNpemVvZihzaXplX3QpXTsKKyAgICB1aW50OF90IGNbMTZdOworICB9IHRtcDsKKworICBhc3NlcnQoaW4gJiYgb3V0ICYmIGtleSAmJiBpdmVjKTsKKworICBpZiAoaW4gIT0gb3V0KSB7CisgICAgY29uc3QgdWludDhfdCAqaXYgPSBpdmVjOworCisgICAgaWYgKFNUUklDVF9BTElHTk1FTlQgJiYKKyAgICAgICAgKChzaXplX3QpaW4gfCAoc2l6ZV90KW91dCB8IChzaXplX3QpaXZlYykgJSBzaXplb2Yoc2l6ZV90KSAhPSAwKSB7CisgICAgICB3aGlsZSAobGVuID49IDE2KSB7CisgICAgICAgICgqYmxvY2spKGluLCBvdXQsIGtleSk7CisgICAgICAgIGZvciAobiA9IDA7IG4gPCAxNjsgKytuKQorICAgICAgICAgIG91dFtuXSBePSBpdltuXTsKKyAgICAgICAgaXYgPSBpbjsKKyAgICAgICAgbGVuIC09IDE2OworICAgICAgICBpbiArPSAxNjsKKyAgICAgICAgb3V0ICs9IDE2OworICAgICAgfQorICAgIH0gZWxzZSBpZiAoMTYgJSBzaXplb2Yoc2l6ZV90KSA9PSAwKSB7IC8qIGFsd2F5cyB0cnVlICovCisgICAgICB3aGlsZSAobGVuID49IDE2KSB7CisgICAgICAgIHNpemVfdCAqb3V0X3QgPSAoc2l6ZV90ICopb3V0LCAqaXZfdCA9IChzaXplX3QgKilpdjsKKworICAgICAgICAoKmJsb2NrKShpbiwgb3V0LCBrZXkpOworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgMTYgLyBzaXplb2Yoc2l6ZV90KTsgbisrKQorICAgICAgICAgIG91dF90W25dIF49IGl2X3Rbbl07CisgICAgICAgIGl2ID0gaW47CisgICAgICAgIGxlbiAtPSAxNjsKKyAgICAgICAgaW4gKz0gMTY7CisgICAgICAgIG91dCArPSAxNjsKKyAgICAgIH0KKyAgICB9CisgICAgbWVtY3B5KGl2ZWMsIGl2LCAxNik7CisgIH0gZWxzZSB7CisgICAgaWYgKFNUUklDVF9BTElHTk1FTlQgJiYKKyAgICAgICAgKChzaXplX3QpaW4gfCAoc2l6ZV90KW91dCB8IChzaXplX3QpaXZlYykgJSBzaXplb2Yoc2l6ZV90KSAhPSAwKSB7CisgICAgICB1aW50OF90IGM7CisgICAgICB3aGlsZSAobGVuID49IDE2KSB7CisgICAgICAgICgqYmxvY2spKGluLCB0bXAuYywga2V5KTsKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IDE2OyArK24pIHsKKyAgICAgICAgICBjID0gaW5bbl07CisgICAgICAgICAgb3V0W25dID0gdG1wLmNbbl0gXiBpdmVjW25dOworICAgICAgICAgIGl2ZWNbbl0gPSBjOworICAgICAgICB9CisgICAgICAgIGxlbiAtPSAxNjsKKyAgICAgICAgaW4gKz0gMTY7CisgICAgICAgIG91dCArPSAxNjsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKDE2ICUgc2l6ZW9mKHNpemVfdCkgPT0gMCkgeyAvKiBhbHdheXMgdHJ1ZSAqLworICAgICAgd2hpbGUgKGxlbiA+PSAxNikgeworICAgICAgICBzaXplX3QgYywgKm91dF90ID0gKHNpemVfdCAqKW91dCwgKml2ZWNfdCA9IChzaXplX3QgKilpdmVjOworICAgICAgICBjb25zdCBzaXplX3QgKmluX3QgPSAoY29uc3Qgc2l6ZV90ICopaW47CisKKyAgICAgICAgKCpibG9jaykoaW4sIHRtcC5jLCBrZXkpOworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgMTYgLyBzaXplb2Yoc2l6ZV90KTsgbisrKSB7CisgICAgICAgICAgYyA9IGluX3Rbbl07CisgICAgICAgICAgb3V0X3Rbbl0gPSB0bXAudFtuXSBeIGl2ZWNfdFtuXTsKKyAgICAgICAgICBpdmVjX3Rbbl0gPSBjOworICAgICAgICB9CisgICAgICAgIGxlbiAtPSAxNjsKKyAgICAgICAgaW4gKz0gMTY7CisgICAgICAgIG91dCArPSAxNjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB3aGlsZSAobGVuKSB7CisgICAgdWludDhfdCBjOworICAgICgqYmxvY2spKGluLCB0bXAuYywga2V5KTsKKyAgICBmb3IgKG4gPSAwOyBuIDwgMTYgJiYgbiA8IGxlbjsgKytuKSB7CisgICAgICBjID0gaW5bbl07CisgICAgICBvdXRbbl0gPSB0bXAuY1tuXSBeIGl2ZWNbbl07CisgICAgICBpdmVjW25dID0gYzsKKyAgICB9CisgICAgaWYgKGxlbiA8PSAxNikgeworICAgICAgZm9yICg7IG4gPCAxNjsgKytuKSB7CisgICAgICAgIGl2ZWNbbl0gPSBpbltuXTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBsZW4gLT0gMTY7CisgICAgaW4gKz0gMTY7CisgICAgb3V0ICs9IDE2OworICB9Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vbW9kZXMvY2ZiLmMgYi9jcnlwdG8vbW9kZXMvY2ZiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFlNGY1ZQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9tb2Rlcy9jZmIuYwpAQCAtMCwwICsxLDIyNyBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9tb2Rlcy5oPgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisKK3ZvaWQgQ1JZUFRPX2NmYjEyOF9lbmNyeXB0KGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50OF90ICpvdXQsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICprZXksIHVpbnQ4X3QgaXZlY1sxNl0sIGludCAqbnVtLCBpbnQgZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sxMjhfZiBibG9jaykgeworICB1bnNpZ25lZCBpbnQgbjsKKyAgc2l6ZV90IGwgPSAwOworCisgIGFzc2VydChpbiAmJiBvdXQgJiYga2V5ICYmIGl2ZWMgJiYgbnVtKTsKKyAgYXNzZXJ0KCgxNiAlIHNpemVvZihzaXplX3QpKSA9PSAwKTsKKworICBuID0gKm51bTsKKworICBpZiAoZW5jKSB7CisgICAgd2hpbGUgKG4gJiYgbGVuKSB7CisgICAgICAqKG91dCsrKSA9IGl2ZWNbbl0gXj0gKihpbisrKTsKKyAgICAgIC0tbGVuOworICAgICAgbiA9IChuICsgMSkgJSAxNjsKKyAgICB9CisgICAgaWYgKFNUUklDVF9BTElHTk1FTlQgJiYgKChzaXplX3QpaW4gfCAoc2l6ZV90KW91dCB8IChzaXplX3QpaXZlYykgJSBzaXplb2Yoc2l6ZV90KSAhPSAwKSB7CisgICAgICB3aGlsZSAobCA8IGxlbikgeworICAgICAgICBpZiAobiA9PSAwKSB7CisgICAgICAgICAgKCpibG9jaykoaXZlYywgaXZlYywga2V5KTsKKyAgICAgICAgfQorICAgICAgICBvdXRbbF0gPSBpdmVjW25dIF49IGluW2xdOworICAgICAgICArK2w7CisgICAgICAgIG4gPSAobiArIDEpICUgMTY7CisgICAgICB9CisgICAgICAqbnVtID0gbjsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgd2hpbGUgKGxlbiA+PSAxNikgeworICAgICAgKCpibG9jaykoaXZlYywgaXZlYywga2V5KTsKKyAgICAgIGZvciAoOyBuIDwgMTY7IG4gKz0gc2l6ZW9mKHNpemVfdCkpIHsKKyAgICAgICAgKihzaXplX3QgKikob3V0ICsgbikgPSAqKHNpemVfdCAqKShpdmVjICsgbikgXj0gKihzaXplX3QgKikoaW4gKyBuKTsKKyAgICAgIH0KKyAgICAgIGxlbiAtPSAxNjsKKyAgICAgIG91dCArPSAxNjsKKyAgICAgIGluICs9IDE2OworICAgICAgbiA9IDA7CisgICAgfQorICAgIGlmIChsZW4pIHsKKyAgICAgICgqYmxvY2spKGl2ZWMsIGl2ZWMsIGtleSk7CisgICAgICB3aGlsZSAobGVuLS0pIHsKKyAgICAgICAgb3V0W25dID0gaXZlY1tuXSBePSBpbltuXTsKKyAgICAgICAgKytuOworICAgICAgfQorICAgIH0KKyAgICAqbnVtID0gbjsKKyAgICByZXR1cm47CisgIH0gZWxzZSB7CisgICAgd2hpbGUgKG4gJiYgbGVuKSB7CisgICAgICB1aW50OF90IGM7CisgICAgICAqKG91dCsrKSA9IGl2ZWNbbl0gXiAoYyA9ICooaW4rKykpOworICAgICAgaXZlY1tuXSA9IGM7CisgICAgICAtLWxlbjsKKyAgICAgIG4gPSAobiArIDEpICUgMTY7CisgICAgfQorICAgIGlmIChTVFJJQ1RfQUxJR05NRU5UICYmICgoc2l6ZV90KWluIHwgKHNpemVfdClvdXQgfCAoc2l6ZV90KWl2ZWMpICUgc2l6ZW9mKHNpemVfdCkgIT0gMCkgeworICAgICAgd2hpbGUgKGwgPCBsZW4pIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjOworICAgICAgICBpZiAobiA9PSAwKSB7CisgICAgICAgICAgKCpibG9jaykoaXZlYywgaXZlYywga2V5KTsKKyAgICAgICAgfQorICAgICAgICBvdXRbbF0gPSBpdmVjW25dIF4gKGMgPSBpbltsXSk7CisgICAgICAgIGl2ZWNbbl0gPSBjOworICAgICAgICArK2w7CisgICAgICAgIG4gPSAobiArIDEpICUgMTY7CisgICAgICB9CisgICAgICAqbnVtID0gbjsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgd2hpbGUgKGxlbiA+PSAxNikgeworICAgICAgKCpibG9jaykoaXZlYywgaXZlYywga2V5KTsKKyAgICAgIGZvciAoOyBuIDwgMTY7IG4gKz0gc2l6ZW9mKHNpemVfdCkpIHsKKyAgICAgICAgc2l6ZV90IHQgPSAqKHNpemVfdCAqKShpbiArIG4pOworICAgICAgICAqKHNpemVfdCAqKShvdXQgKyBuKSA9ICooc2l6ZV90ICopKGl2ZWMgKyBuKSBeIHQ7CisgICAgICAgICooc2l6ZV90ICopKGl2ZWMgKyBuKSA9IHQ7CisgICAgICB9CisgICAgICBsZW4gLT0gMTY7CisgICAgICBvdXQgKz0gMTY7CisgICAgICBpbiArPSAxNjsKKyAgICAgIG4gPSAwOworICAgIH0KKyAgICBpZiAobGVuKSB7CisgICAgICAoKmJsb2NrKShpdmVjLCBpdmVjLCBrZXkpOworICAgICAgd2hpbGUgKGxlbi0tKSB7CisgICAgICAgIHVpbnQ4X3QgYzsKKyAgICAgICAgb3V0W25dID0gaXZlY1tuXSBeIChjID0gaW5bbl0pOworICAgICAgICBpdmVjW25dID0gYzsKKyAgICAgICAgKytuOworICAgICAgfQorICAgIH0KKyAgICAqbnVtID0gbjsKKyAgICByZXR1cm47CisgIH0KK30KKworCisvKiBUaGlzIGV4cGVjdHMgYSBzaW5nbGUgYmxvY2sgb2Ygc2l6ZSBuYml0cyBmb3IgYm90aCBpbiBhbmQgb3V0LiBOb3RlIHRoYXQKKyAgIGl0IGNvcnJ1cHRzIGFueSBleHRyYSBiaXRzIGluIHRoZSBsYXN0IGJ5dGUgb2Ygb3V0ICovCitzdGF0aWMgdm9pZCBjZmJyX2VuY3J5cHRfYmxvY2soY29uc3QgdWludDhfdCAqaW4sIHVpbnQ4X3QgKm91dCwgdW5zaWduZWQgbmJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqa2V5LCB1aW50OF90IGl2ZWNbMTZdLCBpbnQgZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrMTI4X2YgYmxvY2spIHsKKyAgaW50IG4sIHJlbSwgbnVtOworICB1aW50OF90IG92ZWNbMTYgKiAyICsgMV07IC8qICsxIGJlY2F1c2Ugd2UgZGVyZXJlZmVuY2UgKGJ1dCBkb24ndCB1c2UpIG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgb2ZmIHRoZSBlbmQgKi8KKworICBpZiAobmJpdHMgPD0gMCB8fCBuYml0cyA+IDEyOCkgeworICAgIHJldHVybjsKKyAgfQorCisgIC8qIGZpbGwgaW4gdGhlIGZpcnN0IGhhbGYgb2YgdGhlIG5ldyBJViB3aXRoIHRoZSBjdXJyZW50IElWICovCisgIG1lbWNweShvdmVjLCBpdmVjLCAxNik7CisgIC8qIGNvbnN0cnVjdCB0aGUgbmV3IElWICovCisgICgqYmxvY2spKGl2ZWMsIGl2ZWMsIGtleSk7CisgIG51bSA9IChuYml0cyArIDcpIC8gODsKKyAgaWYgKGVuYykgeworICAgIC8qIGVuY3J5cHQgdGhlIGlucHV0ICovCisgICAgZm9yIChuID0gMDsgbiA8IG51bTsgKytuKSB7CisgICAgICBvdXRbbl0gPSAob3ZlY1sxNiArIG5dID0gaW5bbl0gXiBpdmVjW25dKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogZGVjcnlwdCB0aGUgaW5wdXQgKi8KKyAgICBmb3IgKG4gPSAwOyBuIDwgbnVtOyArK24pIHsKKyAgICAgIG91dFtuXSA9IChvdmVjWzE2ICsgbl0gPSBpbltuXSkgXiBpdmVjW25dOworICAgIH0KKyAgfQorICAvKiBzaGlmdCBvdmVjIGxlZnQuLi4gKi8KKyAgcmVtID0gbmJpdHMgJSA4OworICBudW0gPSBuYml0cyAvIDg7CisgIGlmIChyZW0gPT0gMCkgeworICAgIG1lbWNweShpdmVjLCBvdmVjICsgbnVtLCAxNik7CisgIH0gZWxzZSB7CisgICAgZm9yIChuID0gMDsgbiA8IDE2OyArK24pIHsKKyAgICAgIGl2ZWNbbl0gPSBvdmVjW24gKyBudW1dIDw8IHJlbSB8IG92ZWNbbiArIG51bSArIDFdID4+ICg4IC0gcmVtKTsKKyAgICB9CisgIH0KKworICAvKiBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNsZWFuc2Ugb3ZlYywgc2luY2UgdGhlIElWIGlzIG5vdCBzZWNyZXQgKi8KK30KKworLyogTi5CLiBUaGlzIGV4cGVjdHMgdGhlIGlucHV0IHRvIGJlIHBhY2tlZCwgTVMgYml0IGZpcnN0ICovCit2b2lkIENSWVBUT19jZmIxMjhfMV9lbmNyeXB0KGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50OF90ICpvdXQsIHNpemVfdCBiaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICprZXksIHVpbnQ4X3QgaXZlY1sxNl0sIGludCAqbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW5jLCBibG9jazEyOF9mIGJsb2NrKSB7CisgIHNpemVfdCBuOworICB1aW50OF90IGNbMV0sIGRbMV07CisKKyAgYXNzZXJ0KGluICYmIG91dCAmJiBrZXkgJiYgaXZlYyAmJiBudW0pOworICBhc3NlcnQoKm51bSA9PSAwKTsKKworICBmb3IgKG4gPSAwOyBuIDwgYml0czsgKytuKSB7CisgICAgY1swXSA9IChpbltuIC8gOF0gJiAoMSA8PCAoNyAtIG4gJSA4KSkpID8gMHg4MCA6IDA7CisgICAgY2Zicl9lbmNyeXB0X2Jsb2NrKGMsIGQsIDEsIGtleSwgaXZlYywgZW5jLCBibG9jayk7CisgICAgb3V0W24gLyA4XSA9IChvdXRbbiAvIDhdICYgfigxIDw8ICh1bnNpZ25lZCBpbnQpKDcgLSBuICUgOCkpKSB8CisgICAgICAgICAgICAgICAgICgoZFswXSAmIDB4ODApID4+ICh1bnNpZ25lZCBpbnQpKG4gJSA4KSk7CisgIH0KK30KKwordm9pZCBDUllQVE9fY2ZiMTI4XzhfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoLCBjb25zdCB2b2lkICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgaXZlY1sxNl0sIGludCAqbnVtLCBpbnQgZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jazEyOF9mIGJsb2NrKSB7CisgIHNpemVfdCBuOworCisgIGFzc2VydChpbiAmJiBvdXQgJiYga2V5ICYmIGl2ZWMgJiYgbnVtKTsKKyAgYXNzZXJ0KCpudW0gPT0gMCk7CisKKyAgZm9yIChuID0gMDsgbiA8IGxlbmd0aDsgKytuKSB7CisgICAgY2Zicl9lbmNyeXB0X2Jsb2NrKCZpbltuXSwgJm91dFtuXSwgOCwga2V5LCBpdmVjLCBlbmMsIGJsb2NrKTsKKyAgfQorfQorCmRpZmYgLS1naXQgYS9jcnlwdG8vbW9kZXMvY3RyLmMgYi9jcnlwdG8vbW9kZXMvY3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFjYTViNwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9tb2Rlcy9jdHIuYwpAQCAtMCwwICsxLDIxNyBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworI2luY2x1ZGUgPG9wZW5zc2wvbW9kZXMuaD4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworCisvKiBOT1RFOiB0aGUgSVYvY291bnRlciBDVFIgbW9kZSBpcyBiaWctZW5kaWFuLiAgVGhlIGNvZGUgaXRzZWxmCisgKiBpcyBlbmRpYW4tbmV1dHJhbC4gKi8KKworLyogaW5jcmVtZW50IGNvdW50ZXIgKDEyOC1iaXQgaW50KSBieSAxICovCitzdGF0aWMgdm9pZCBjdHIxMjhfaW5jKHVpbnQ4X3QgKmNvdW50ZXIpIHsKKyAgdWludDMyX3QgbiA9IDE2OworICB1aW50OF90IGM7CisKKyAgZG8geworICAgIC0tbjsKKyAgICBjID0gY291bnRlcltuXTsKKyAgICArK2M7CisgICAgY291bnRlcltuXSA9IGM7CisgICAgaWYgKGMpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0gd2hpbGUgKG4pOworfQorCisvKiBUaGUgaW5wdXQgZW5jcnlwdGVkIGFzIHRob3VnaCAxMjhiaXQgY291bnRlciBtb2RlIGlzIGJlaW5nIHVzZWQuICBUaGUgZXh0cmEKKyAqIHN0YXRlIGluZm9ybWF0aW9uIHRvIHJlY29yZCBob3cgbXVjaCBvZiB0aGUgMTI4Yml0IGJsb2NrIHdlIGhhdmUgdXNlZCBpcworICogY29udGFpbmVkIGluICpudW0sIGFuZCB0aGUgZW5jcnlwdGVkIGNvdW50ZXIgaXMga2VwdCBpbiBlY291bnRfYnVmLiAgQm90aAorICogKm51bSBhbmQgZWNvdW50X2J1ZiBtdXN0IGJlIGluaXRpYWxpc2VkIHdpdGggemVyb3MgYmVmb3JlIHRoZSBmaXJzdCBjYWxsIHRvCisgKiBDUllQVE9fY3RyMTI4X2VuY3J5cHQoKS4KKyAqCisgKiBUaGlzIGFsZ29yaXRobSBhc3N1bWVzIHRoYXQgdGhlIGNvdW50ZXIgaXMgaW4gdGhlIHggbG93ZXIgYml0cyBvZiB0aGUgSVYKKyAqIChpdmVjKSwgYW5kIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGhhcyBmdWxsIGNvbnRyb2wgb3ZlciBvdmVyZmxvdyBhbmQgdGhlIHJlc3QKKyAqIG9mIHRoZSBJVi4gIFRoaXMgaW1wbGVtZW50YXRpb24gdGFrZXMgTk8gcmVzcG9uc2liaWxpdHkgZm9yIGNoZWNraW5nIHRoYXQKKyAqIHRoZSBjb3VudGVyIGRvZXNuJ3Qgb3ZlcmZsb3cgaW50byB0aGUgcmVzdCBvZiB0aGUgSVYgd2hlbiBpbmNyZW1lbnRlZC4gKi8KK3ZvaWQgQ1JZUFRPX2N0cjEyOF9lbmNyeXB0KGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50OF90ICpvdXQsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICprZXksIHVpbnQ4X3QgaXZlY1sxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGVjb3VudF9idWZbMTZdLCB1bnNpZ25lZCBpbnQgKm51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrMTI4X2YgYmxvY2spIHsKKyAgdW5zaWduZWQgaW50IG47CisgIHNpemVfdCBsPTA7CisKKyAgYXNzZXJ0KGluICYmIG91dCAmJiBrZXkgJiYgZWNvdW50X2J1ZiAmJiBudW0pOworICBhc3NlcnQoKm51bSA8IDE2KTsKKyAgYXNzZXJ0KCgxNiAlIHNpemVvZihzaXplX3QpKSA9PSAwKTsKKworICBuID0gKm51bTsKKworICB3aGlsZSAobiAmJiBsZW4pIHsKKyAgICAqKG91dCsrKSA9ICooaW4rKykgXiBlY291bnRfYnVmW25dOworICAgIC0tbGVuOworICAgIG4gPSAobiArIDEpICUgMTY7CisgIH0KKworICBpZiAoU1RSSUNUX0FMSUdOTUVOVCAmJgorICAgICAgKChzaXplX3QpaW4gfCAoc2l6ZV90KW91dCB8IChzaXplX3QpaXZlYykgJSBzaXplb2Yoc2l6ZV90KSAhPSAwKSB7CisgICAgd2hpbGUgKGwgPCBsZW4pIHsKKyAgICAgIGlmIChuID09IDApIHsKKyAgICAgICAgKCpibG9jaykoaXZlYywgZWNvdW50X2J1Ziwga2V5KTsKKyAgICAgICAgY3RyMTI4X2luYyhpdmVjKTsKKyAgICAgIH0KKyAgICAgIG91dFtsXSA9IGluW2xdIF4gZWNvdW50X2J1ZltuXTsKKyAgICAgICsrbDsKKyAgICAgIG4gPSAobiArIDEpICUgMTY7CisgICAgfQorCisgICAgKm51bSA9IG47CisgICAgcmV0dXJuOworICB9CisKKyAgd2hpbGUgKGxlbiA+PSAxNikgeworICAgICgqYmxvY2spKGl2ZWMsIGVjb3VudF9idWYsIGtleSk7CisgICAgY3RyMTI4X2luYyhpdmVjKTsKKyAgICBmb3IgKDsgbiA8IDE2OyBuICs9IHNpemVvZihzaXplX3QpKQorICAgICAgKihzaXplX3QgKikob3V0ICsgbikgPSAqKHNpemVfdCAqKShpbiArIG4pIF4gKihzaXplX3QgKikoZWNvdW50X2J1ZiArIG4pOworICAgIGxlbiAtPSAxNjsKKyAgICBvdXQgKz0gMTY7CisgICAgaW4gKz0gMTY7CisgICAgbiA9IDA7CisgIH0KKyAgaWYgKGxlbikgeworICAgICgqYmxvY2spKGl2ZWMsIGVjb3VudF9idWYsIGtleSk7CisgICAgY3RyMTI4X2luYyhpdmVjKTsKKyAgICB3aGlsZSAobGVuLS0pIHsKKyAgICAgIG91dFtuXSA9IGluW25dIF4gZWNvdW50X2J1ZltuXTsKKyAgICAgICsrbjsKKyAgICB9CisgIH0KKyAgKm51bSA9IG47Cit9CisKKy8qIGluY3JlbWVudCB1cHBlciA5NiBiaXRzIG9mIDEyOC1iaXQgY291bnRlciBieSAxICovCitzdGF0aWMgdm9pZCBjdHI5Nl9pbmModWludDhfdCAqY291bnRlcikgeworICB1aW50MzJfdCBuID0gMTI7CisgIHVpbnQ4X3QgYzsKKworICBkbyB7CisgICAgLS1uOworICAgIGMgPSBjb3VudGVyW25dOworICAgICsrYzsKKyAgICBjb3VudGVyW25dID0gYzsKKyAgICBpZiAoYykgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgfSB3aGlsZSAobik7Cit9CisKK3ZvaWQgQ1JZUFRPX2N0cjEyOF9lbmNyeXB0X2N0cjMyKGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50OF90ICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuLCBjb25zdCB2b2lkICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGl2ZWNbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBlY291bnRfYnVmWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtLCBjdHIxMjhfZiBmdW5jKSB7CisgIHVuc2lnbmVkIGludCBuLCBjdHIzMjsKKworICBhc3NlcnQoaW4gJiYgb3V0ICYmIGtleSAmJiBlY291bnRfYnVmICYmIG51bSk7CisgIGFzc2VydCgqbnVtIDwgMTYpOworCisgIG4gPSAqbnVtOworCisgIHdoaWxlIChuICYmIGxlbikgeworICAgICoob3V0KyspID0gKihpbisrKSBeIGVjb3VudF9idWZbbl07CisgICAgLS1sZW47CisgICAgbiA9IChuICsgMSkgJSAxNjsKKyAgfQorCisgIGN0cjMyID0gR0VUVTMyKGl2ZWMgKyAxMik7CisgIHdoaWxlIChsZW4gPj0gMTYpIHsKKyAgICBzaXplX3QgYmxvY2tzID0gbGVuIC8gMTY7CisgICAgLyogMTw8MjggaXMganVzdCBhIG5vdC1zby1zbWFsbCB5ZXQgbm90LXNvLWxhcmdlIG51bWJlci4uLgorICAgICAqIEJlbG93IGNvbmRpdGlvbiBpcyBwcmFjdGljYWxseSBuZXZlciBtZXQsIGJ1dCBpdCBoYXMgdG8KKyAgICAgKiBiZSBjaGVja2VkIGZvciBjb2RlIGNvcnJlY3RuZXNzLiAqLworICAgIGlmIChzaXplb2Yoc2l6ZV90KSA+IHNpemVvZih1bnNpZ25lZCBpbnQpICYmIGJsb2NrcyA+ICgxVSA8PCAyOCkpCisgICAgICBibG9ja3MgPSAoMVUgPDwgMjgpOworICAgIC8qIEFzICgqZnVuYykgb3BlcmF0ZXMgb24gMzItYml0IGNvdW50ZXIsIGNhbGxlcgorICAgICAqIGhhcyB0byBoYW5kbGUgb3ZlcmZsb3cuICdpZicgYmVsb3cgZGV0ZWN0cyB0aGUKKyAgICAgKiBvdmVyZmxvdywgd2hpY2ggaXMgdGhlbiBoYW5kbGVkIGJ5IGxpbWl0aW5nIHRoZQorICAgICAqIGFtb3VudCBvZiBibG9ja3MgdG8gdGhlIGV4YWN0IG92ZXJmbG93IHBvaW50Li4uICovCisgICAgY3RyMzIgKz0gKHVpbnQzMl90KWJsb2NrczsKKyAgICBpZiAoY3RyMzIgPCBibG9ja3MpIHsKKyAgICAgIGJsb2NrcyAtPSBjdHIzMjsKKyAgICAgIGN0cjMyID0gMDsKKyAgICB9CisgICAgKCpmdW5jKShpbiwgb3V0LCBibG9ja3MsIGtleSwgaXZlYyk7CisgICAgLyogKCpmdW5jKSBkb2VzIG5vdCB1cGRhdGUgaXZlYywgY2FsbGVyIGRvZXM6ICovCisgICAgUFVUVTMyKGl2ZWMgKyAxMiwgY3RyMzIpOworICAgIC8qIC4uLiBvdmVyZmxvdyB3YXMgZGV0ZWN0ZWQsIHByb3BvZ2F0ZSBjYXJyeS4gKi8KKyAgICBpZiAoY3RyMzIgPT0gMCkKKyAgICAgIGN0cjk2X2luYyhpdmVjKTsKKyAgICBibG9ja3MgKj0gMTY7CisgICAgbGVuIC09IGJsb2NrczsKKyAgICBvdXQgKz0gYmxvY2tzOworICAgIGluICs9IGJsb2NrczsKKyAgfQorICBpZiAobGVuKSB7CisgICAgbWVtc2V0KGVjb3VudF9idWYsIDAsIDE2KTsKKyAgICAoKmZ1bmMpKGVjb3VudF9idWYsIGVjb3VudF9idWYsIDEsIGtleSwgaXZlYyk7CisgICAgKytjdHIzMjsKKyAgICBQVVRVMzIoaXZlYyArIDEyLCBjdHIzMik7CisgICAgaWYgKGN0cjMyID09IDApIHsKKyAgICAgIGN0cjk2X2luYyhpdmVjKTsKKyAgICB9CisgICAgd2hpbGUgKGxlbi0tKSB7CisgICAgICBvdXRbbl0gPSBpbltuXSBeIGVjb3VudF9idWZbbl07CisgICAgICArK247CisgICAgfQorICB9CisKKyAgKm51bSA9IG47Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vbW9kZXMvZ2NtLmMgYi9jcnlwdG8vbW9kZXMvZ2NtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk1MGQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9tb2Rlcy9nY20uYwpAQCAtMCwwICsxLDExODkgQEAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvbW9kZXMuaD4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NwdS5oPgorCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworCisjaWYgIWRlZmluZWQoT1BFTlNTTF9OT19BU00pICYmIFwKKyAgICAoZGVmaW5lZChPUEVOU1NMX1g4NikgfHwgZGVmaW5lZChPUEVOU1NMX1g4Nl82NCkgfHwgZGVmaW5lZChPUEVOU1NMX0FSTSkpCisjZGVmaW5lIEdIQVNIX0FTTQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJTV0FQNCkgJiYgU1RSSUNUX0FMSUdOTUVOVCA9PSAxCisvKiByZWRlZmluZSwgYmVjYXVzZSBhbGlnbm1lbnQgaXMgZW5zdXJlZCAqLworI3VuZGVmIEdFVFUzMgorI2RlZmluZSBHRVRVMzIocCkgQlNXQVA0KCooY29uc3QgdWludDMyX3QgKikocCkpCisjdW5kZWYgUFVUVTMyCisjZGVmaW5lIFBVVFUzMihwLCB2KSAqKHVpbnQzMl90ICopKHApID0gQlNXQVA0KHYpCisjZW5kaWYKKworI2RlZmluZSBQQUNLKHMpICgoc2l6ZV90KShzKSA8PCAoc2l6ZW9mKHNpemVfdCkgKiA4IC0gMTYpKQorI2RlZmluZSBSRURVQ0UxQklUKFYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHNpemVvZihzaXplX3QpID09IDgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdWludDY0X3QgVCA9IFU2NCgweGUxMDAwMDAwMDAwMDAwMDApICYgKDAgLSAoVi5sbyAmIDEpKTsgXAorICAgICAgVi5sbyA9IChWLmhpIDw8IDYzKSB8IChWLmxvID4+IDEpOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFYuaGkgPSAoVi5oaSA+PiAxKSBeIFQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdWludDMyX3QgVCA9IDB4ZTEwMDAwMDBVICYgKDAgLSAodWludDMyX3QpKFYubG8gJiAxKSk7ICAgICAgICBcCisgICAgICBWLmxvID0gKFYuaGkgPDwgNjMpIHwgKFYubG8gPj4gMSk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgVi5oaSA9IChWLmhpID4+IDEpIF4gKCh1aW50NjRfdClUIDw8IDMyKTsgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworCitzdGF0aWMgdm9pZCBnY21faW5pdF80Yml0KHUxMjggSHRhYmxlWzE2XSwgdWludDY0X3QgSFsyXSkgeworICB1MTI4IFY7CisKKyAgSHRhYmxlWzBdLmhpID0gMDsKKyAgSHRhYmxlWzBdLmxvID0gMDsKKyAgVi5oaSA9IEhbMF07CisgIFYubG8gPSBIWzFdOworCisgIEh0YWJsZVs4XSA9IFY7CisgIFJFRFVDRTFCSVQoVik7CisgIEh0YWJsZVs0XSA9IFY7CisgIFJFRFVDRTFCSVQoVik7CisgIEh0YWJsZVsyXSA9IFY7CisgIFJFRFVDRTFCSVQoVik7CisgIEh0YWJsZVsxXSA9IFY7CisgIEh0YWJsZVszXS5oaSA9IFYuaGkgXiBIdGFibGVbMl0uaGksIEh0YWJsZVszXS5sbyA9IFYubG8gXiBIdGFibGVbMl0ubG87CisgIFYgPSBIdGFibGVbNF07CisgIEh0YWJsZVs1XS5oaSA9IFYuaGkgXiBIdGFibGVbMV0uaGksIEh0YWJsZVs1XS5sbyA9IFYubG8gXiBIdGFibGVbMV0ubG87CisgIEh0YWJsZVs2XS5oaSA9IFYuaGkgXiBIdGFibGVbMl0uaGksIEh0YWJsZVs2XS5sbyA9IFYubG8gXiBIdGFibGVbMl0ubG87CisgIEh0YWJsZVs3XS5oaSA9IFYuaGkgXiBIdGFibGVbM10uaGksIEh0YWJsZVs3XS5sbyA9IFYubG8gXiBIdGFibGVbM10ubG87CisgIFYgPSBIdGFibGVbOF07CisgIEh0YWJsZVs5XS5oaSA9IFYuaGkgXiBIdGFibGVbMV0uaGksIEh0YWJsZVs5XS5sbyA9IFYubG8gXiBIdGFibGVbMV0ubG87CisgIEh0YWJsZVsxMF0uaGkgPSBWLmhpIF4gSHRhYmxlWzJdLmhpLCBIdGFibGVbMTBdLmxvID0gVi5sbyBeIEh0YWJsZVsyXS5sbzsKKyAgSHRhYmxlWzExXS5oaSA9IFYuaGkgXiBIdGFibGVbM10uaGksIEh0YWJsZVsxMV0ubG8gPSBWLmxvIF4gSHRhYmxlWzNdLmxvOworICBIdGFibGVbMTJdLmhpID0gVi5oaSBeIEh0YWJsZVs0XS5oaSwgSHRhYmxlWzEyXS5sbyA9IFYubG8gXiBIdGFibGVbNF0ubG87CisgIEh0YWJsZVsxM10uaGkgPSBWLmhpIF4gSHRhYmxlWzVdLmhpLCBIdGFibGVbMTNdLmxvID0gVi5sbyBeIEh0YWJsZVs1XS5sbzsKKyAgSHRhYmxlWzE0XS5oaSA9IFYuaGkgXiBIdGFibGVbNl0uaGksIEh0YWJsZVsxNF0ubG8gPSBWLmxvIF4gSHRhYmxlWzZdLmxvOworICBIdGFibGVbMTVdLmhpID0gVi5oaSBeIEh0YWJsZVs3XS5oaSwgSHRhYmxlWzE1XS5sbyA9IFYubG8gXiBIdGFibGVbN10ubG87CisKKyNpZiBkZWZpbmVkKEdIQVNIX0FTTSkKKyAgLyogQVJNIGFzc2VtYmxlciBleHBlY3RzIHNwZWNpZmljIGR3b3JkIG9yZGVyIGluIEh0YWJsZS4gKi8KKyAgeworICAgIGludCBqOworICAgIGNvbnN0IHVuaW9uIHsKKyAgICAgIGxvbmcgb25lOworICAgICAgY2hhciBsaXR0bGU7CisgICAgfSBpc19lbmRpYW4gPSB7MX07CisKKyAgICBpZiAoaXNfZW5kaWFuLmxpdHRsZSkgeworICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICAgICAgViA9IEh0YWJsZVtqXTsKKyAgICAgICAgSHRhYmxlW2pdLmhpID0gVi5sbzsKKyAgICAgICAgSHRhYmxlW2pdLmxvID0gVi5oaTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICAgICAgViA9IEh0YWJsZVtqXTsKKyAgICAgICAgSHRhYmxlW2pdLmhpID0gVi5sbyA8PCAzMiB8IFYubG8gPj4gMzI7CisgICAgICAgIEh0YWJsZVtqXS5sbyA9IFYuaGkgPDwgMzIgfCBWLmhpID4+IDMyOworICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmCit9CisKKyNpZiAhZGVmaW5lZChHSEFTSF9BU00pCitzdGF0aWMgY29uc3Qgc2l6ZV90IHJlbV80Yml0WzE2XSA9IHsKKyAgICBQQUNLKDB4MDAwMCksIFBBQ0soMHgxQzIwKSwgUEFDSygweDM4NDApLCBQQUNLKDB4MjQ2MCksCisgICAgUEFDSygweDcwODApLCBQQUNLKDB4NkNBMCksIFBBQ0soMHg0OEMwKSwgUEFDSygweDU0RTApLAorICAgIFBBQ0soMHhFMTAwKSwgUEFDSygweEZEMjApLCBQQUNLKDB4RDk0MCksIFBBQ0soMHhDNTYwKSwKKyAgICBQQUNLKDB4OTE4MCksIFBBQ0soMHg4REEwKSwgUEFDSygweEE5QzApLCBQQUNLKDB4QjVFMCl9OworCitzdGF0aWMgdm9pZCBnY21fZ211bHRfNGJpdCh1aW50NjRfdCBYaVsyXSwgY29uc3QgdTEyOCBIdGFibGVbMTZdKSB7CisgIHUxMjggWjsKKyAgaW50IGNudCA9IDE1OworICBzaXplX3QgcmVtLCBubG8sIG5oaTsKKyAgY29uc3QgdW5pb24geworICAgIGxvbmcgb25lOworICAgIGNoYXIgbGl0dGxlOworICB9IGlzX2VuZGlhbiA9IHsxfTsKKworICBubG8gPSAoKGNvbnN0IHVpbnQ4X3QgKilYaSlbMTVdOworICBuaGkgPSBubG8gPj4gNDsKKyAgbmxvICY9IDB4ZjsKKworICBaLmhpID0gSHRhYmxlW25sb10uaGk7CisgIFoubG8gPSBIdGFibGVbbmxvXS5sbzsKKworICB3aGlsZSAoMSkgeworICAgIHJlbSA9IChzaXplX3QpWi5sbyAmIDB4ZjsKKyAgICBaLmxvID0gKFouaGkgPDwgNjApIHwgKFoubG8gPj4gNCk7CisgICAgWi5oaSA9IChaLmhpID4+IDQpOworICAgIGlmIChzaXplb2Yoc2l6ZV90KSA9PSA4KSB7CisgICAgICBaLmhpIF49IHJlbV80Yml0W3JlbV07CisgICAgfSBlbHNlIHsKKyAgICAgIFouaGkgXj0gKHVpbnQ2NF90KXJlbV80Yml0W3JlbV0gPDwgMzI7CisgICAgfQorCisgICAgWi5oaSBePSBIdGFibGVbbmhpXS5oaTsKKyAgICBaLmxvIF49IEh0YWJsZVtuaGldLmxvOworCisgICAgaWYgKC0tY250IDwgMCkgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgbmxvID0gKChjb25zdCB1aW50OF90ICopWGkpW2NudF07CisgICAgbmhpID0gbmxvID4+IDQ7CisgICAgbmxvICY9IDB4ZjsKKworICAgIHJlbSA9IChzaXplX3QpWi5sbyAmIDB4ZjsKKyAgICBaLmxvID0gKFouaGkgPDwgNjApIHwgKFoubG8gPj4gNCk7CisgICAgWi5oaSA9IChaLmhpID4+IDQpOworICAgIGlmIChzaXplb2Yoc2l6ZV90KSA9PSA4KSB7CisgICAgICBaLmhpIF49IHJlbV80Yml0W3JlbV07CisgICAgfSBlbHNlIHsKKyAgICAgIFouaGkgXj0gKHVpbnQ2NF90KXJlbV80Yml0W3JlbV0gPDwgMzI7CisgICAgfQorCisgICAgWi5oaSBePSBIdGFibGVbbmxvXS5oaTsKKyAgICBaLmxvIF49IEh0YWJsZVtubG9dLmxvOworICB9CisKKyAgaWYgKGlzX2VuZGlhbi5saXR0bGUpIHsKKyNpZmRlZiBCU1dBUDgKKyAgICBYaVswXSA9IEJTV0FQOChaLmhpKTsKKyAgICBYaVsxXSA9IEJTV0FQOChaLmxvKTsKKyNlbHNlCisgICAgdWludDhfdCAqcCA9ICh1aW50OF90ICopWGk7CisgICAgdWludDMyX3QgdjsKKyAgICB2ID0gKHVpbnQzMl90KShaLmhpID4+IDMyKTsKKyAgICBQVVRVMzIocCwgdik7CisgICAgdiA9ICh1aW50MzJfdCkoWi5oaSk7CisgICAgUFVUVTMyKHAgKyA0LCB2KTsKKyAgICB2ID0gKHVpbnQzMl90KShaLmxvID4+IDMyKTsKKyAgICBQVVRVMzIocCArIDgsIHYpOworICAgIHYgPSAodWludDMyX3QpKFoubG8pOworICAgIFBVVFUzMihwICsgMTIsIHYpOworI2VuZGlmCisgIH0gZWxzZSB7CisgICAgWGlbMF0gPSBaLmhpOworICAgIFhpWzFdID0gWi5sbzsKKyAgfQorfQorCisvKiBTdHJlYW1lZCBnY21fbXVsdF80Yml0LCBzZWUgQ1JZUFRPX2djbTEyOF9bZW58ZGVdY3J5cHQgZm9yCisgKiBkZXRhaWxzLi4uIENvbXBpbGVyLWdlbmVyYXRlZCBjb2RlIGRvZXNuJ3Qgc2VlbSB0byBnaXZlIGFueQorICogcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQsIGF0IGxlYXN0IG5vdCBvbiB4ODZbXzY0XS4gSXQncyBoZXJlCisgKiBtb3N0bHkgYXMgcmVmZXJlbmNlIGFuZCBhIHBsYWNlaG9sZGVyIGZvciBwb3NzaWJsZSBmdXR1cmUKKyAqIG5vbi10cml2aWFsIG9wdGltaXphdGlvbltzXS4uLiAqLworc3RhdGljIHZvaWQgZ2NtX2doYXNoXzRiaXQodWludDY0X3QgWGlbMl0sIGNvbnN0IHUxMjggSHRhYmxlWzE2XSwgY29uc3QgdWludDhfdCAqaW5wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbikgeworICB1MTI4IFo7CisgIGludCBjbnQ7CisgIHNpemVfdCByZW0sIG5sbywgbmhpOworICBjb25zdCB1bmlvbiB7CisgICAgbG9uZyBvbmU7CisgICAgY2hhciBsaXR0bGU7CisgIH0gaXNfZW5kaWFuID0gezF9OworCisgIGRvIHsKKyAgICBjbnQgPSAxNTsKKyAgICBubG8gPSAoKGNvbnN0IHVpbnQ4X3QgKilYaSlbMTVdOworICAgIG5sbyBePSBpbnBbMTVdOworICAgIG5oaSA9IG5sbyA+PiA0OworICAgIG5sbyAmPSAweGY7CisKKyAgICBaLmhpID0gSHRhYmxlW25sb10uaGk7CisgICAgWi5sbyA9IEh0YWJsZVtubG9dLmxvOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgIHJlbSA9IChzaXplX3QpWi5sbyAmIDB4ZjsKKyAgICAgIFoubG8gPSAoWi5oaSA8PCA2MCkgfCAoWi5sbyA+PiA0KTsKKyAgICAgIFouaGkgPSAoWi5oaSA+PiA0KTsKKyAgICAgIGlmIChzaXplb2Yoc2l6ZV90KSA9PSA4KSB7CisgICAgICAgIFouaGkgXj0gcmVtXzRiaXRbcmVtXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFouaGkgXj0gKHVpbnQ2NF90KXJlbV80Yml0W3JlbV0gPDwgMzI7CisgICAgICB9CisKKyAgICAgIFouaGkgXj0gSHRhYmxlW25oaV0uaGk7CisgICAgICBaLmxvIF49IEh0YWJsZVtuaGldLmxvOworCisgICAgICBpZiAoLS1jbnQgPCAwKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBubG8gPSAoKGNvbnN0IHVpbnQ4X3QgKilYaSlbY250XTsKKyAgICAgIG5sbyBePSBpbnBbY250XTsKKyAgICAgIG5oaSA9IG5sbyA+PiA0OworICAgICAgbmxvICY9IDB4ZjsKKworICAgICAgcmVtID0gKHNpemVfdClaLmxvICYgMHhmOworICAgICAgWi5sbyA9IChaLmhpIDw8IDYwKSB8IChaLmxvID4+IDQpOworICAgICAgWi5oaSA9IChaLmhpID4+IDQpOworICAgICAgaWYgKHNpemVvZihzaXplX3QpID09IDgpIHsKKyAgICAgICAgWi5oaSBePSByZW1fNGJpdFtyZW1dOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgWi5oaSBePSAodWludDY0X3QpcmVtXzRiaXRbcmVtXSA8PCAzMjsKKyAgICAgIH0KKworICAgICAgWi5oaSBePSBIdGFibGVbbmxvXS5oaTsKKyAgICAgIFoubG8gXj0gSHRhYmxlW25sb10ubG87CisgICAgfQorCisgICAgaWYgKGlzX2VuZGlhbi5saXR0bGUpIHsKKyNpZmRlZiBCU1dBUDgKKyAgICAgIFhpWzBdID0gQlNXQVA4KFouaGkpOworICAgICAgWGlbMV0gPSBCU1dBUDgoWi5sbyk7CisjZWxzZQorICAgICAgdWludDhfdCAqcCA9ICh1aW50OF90ICopWGk7CisgICAgICB1aW50MzJfdCB2OworICAgICAgdiA9ICh1aW50MzJfdCkoWi5oaSA+PiAzMik7CisgICAgICBQVVRVMzIocCwgdik7CisgICAgICB2ID0gKHVpbnQzMl90KShaLmhpKTsKKyAgICAgIFBVVFUzMihwICsgNCwgdik7CisgICAgICB2ID0gKHVpbnQzMl90KShaLmxvID4+IDMyKTsKKyAgICAgIFBVVFUzMihwICsgOCwgdik7CisgICAgICB2ID0gKHVpbnQzMl90KShaLmxvKTsKKyAgICAgIFBVVFUzMihwICsgMTIsIHYpOworI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgIFhpWzBdID0gWi5oaTsKKyAgICAgIFhpWzFdID0gWi5sbzsKKyAgICB9CisgIH0gd2hpbGUgKGlucCArPSAxNiwgbGVuIC09IDE2KTsKK30KKyNlbHNlIC8qIEdIQVNIX0FTTSAqLwordm9pZCBnY21fZ211bHRfNGJpdCh1aW50NjRfdCBYaVsyXSwgY29uc3QgdTEyOCBIdGFibGVbMTZdKTsKK3ZvaWQgZ2NtX2doYXNoXzRiaXQodWludDY0X3QgWGlbMl0sIGNvbnN0IHUxMjggSHRhYmxlWzE2XSwgY29uc3QgdWludDhfdCAqaW5wLAorICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuKTsKKyNlbmRpZgorCisjZGVmaW5lIEdDTV9NVUwoY3R4LCBYaSkgZ2NtX2dtdWx0XzRiaXQoY3R4LT5YaS51LCBjdHgtPkh0YWJsZSkKKyNpZiBkZWZpbmVkKEdIQVNIX0FTTSkKKyNkZWZpbmUgR0hBU0goY3R4LCBpbiwgbGVuKSBnY21fZ2hhc2hfNGJpdCgoY3R4KS0+WGkudSwgKGN0eCktPkh0YWJsZSwgaW4sIGxlbikKKy8qIEdIQVNIX0NIVU5LIGlzICJzdHJpZGUgcGFyYW1ldGVyIiBtaXNzaW9uZWQgdG8gbWl0aWdhdGUgY2FjaGUKKyAqIHRyYXNoaW5nIGVmZmVjdC4gSW4gb3RoZXIgd29yZHMgaWRlYSBpcyB0byBoYXNoIGRhdGEgd2hpbGUgaXQncworICogc3RpbGwgaW4gTDEgY2FjaGUgYWZ0ZXIgZW5jcnlwdGlvbiBwYXNzLi4uICovCisjZGVmaW5lIEdIQVNIX0NIVU5LICgzICogMTAyNCkKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkKEdIQVNIX0FTTSkKKyNpZiBkZWZpbmVkKE9QRU5TU0xfWDg2KSB8fCBkZWZpbmVkKE9QRU5TU0xfWDg2XzY0KQorI2RlZmluZSBHSEFTSF9BU01fWDg2X09SXzY0CisjZGVmaW5lIEdDTV9GVU5DUkVGXzRCSVQKK3ZvaWQgZ2NtX2luaXRfY2xtdWwodTEyOCBIdGFibGVbMTZdLCBjb25zdCB1aW50NjRfdCBYaVsyXSk7Cit2b2lkIGdjbV9nbXVsdF9jbG11bCh1aW50NjRfdCBYaVsyXSwgY29uc3QgdTEyOCBIdGFibGVbMTZdKTsKK3ZvaWQgZ2NtX2doYXNoX2NsbXVsKHVpbnQ2NF90IFhpWzJdLCBjb25zdCB1MTI4IEh0YWJsZVsxNl0sIGNvbnN0IHVpbnQ4X3QgKmlucCwKKyAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4pOworCisjaWYgZGVmaW5lZChPUEVOU1NMX1g4NikKKyNkZWZpbmUgZ2NtX2luaXRfYXZ4IGdjbV9pbml0X2NsbXVsCisjZGVmaW5lIGdjbV9nbXVsdF9hdnggZ2NtX2dtdWx0X2NsbXVsCisjZGVmaW5lIGdjbV9naGFzaF9hdnggZ2NtX2doYXNoX2NsbXVsCisjZWxzZQordm9pZCBnY21faW5pdF9hdngodTEyOCBIdGFibGVbMTZdLCBjb25zdCB1aW50NjRfdCBYaVsyXSk7Cit2b2lkIGdjbV9nbXVsdF9hdngodWludDY0X3QgWGlbMl0sIGNvbnN0IHUxMjggSHRhYmxlWzE2XSk7Cit2b2lkIGdjbV9naGFzaF9hdngodWludDY0X3QgWGlbMl0sIGNvbnN0IHUxMjggSHRhYmxlWzE2XSwgY29uc3QgdWludDhfdCAqaW5wLCBzaXplX3QgbGVuKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChPUEVOU1NMX1g4NikKKyNkZWZpbmUgR0hBU0hfQVNNX1g4Ngordm9pZCBnY21fZ211bHRfNGJpdF9tbXgodWludDY0X3QgWGlbMl0sIGNvbnN0IHUxMjggSHRhYmxlWzE2XSk7Cit2b2lkIGdjbV9naGFzaF80Yml0X21teCh1aW50NjRfdCBYaVsyXSwgY29uc3QgdTEyOCBIdGFibGVbMTZdLCBjb25zdCB1aW50OF90ICppbnAsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuKTsKKwordm9pZCBnY21fZ211bHRfNGJpdF94ODYodWludDY0X3QgWGlbMl0sIGNvbnN0IHUxMjggSHRhYmxlWzE2XSk7Cit2b2lkIGdjbV9naGFzaF80Yml0X3g4Nih1aW50NjRfdCBYaVsyXSwgY29uc3QgdTEyOCBIdGFibGVbMTZdLCBjb25zdCB1aW50OF90ICppbnAsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuKTsKKyNlbmRpZgorI2VsaWYgZGVmaW5lZChPUEVOU1NMX0FSTSkKKyNpbmNsdWRlICIuLi9hcm1fYXJjaC5oIgorI2lmIF9fQVJNX0FSQ0hfXyA+PSA3CisjZGVmaW5lIEdIQVNIX0FTTV9BUk0KKyNkZWZpbmUgR0NNX0ZVTkNSRUZfNEJJVAordm9pZCBnY21fZ211bHRfbmVvbih1aW50NjRfdCBYaVsyXSwgY29uc3QgdTEyOCBIdGFibGVbMTZdKTsKK3ZvaWQgZ2NtX2doYXNoX25lb24odWludDY0X3QgWGlbMl0sIGNvbnN0IHUxMjggSHRhYmxlWzE2XSwgY29uc3QgdWludDhfdCAqaW5wLAorICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEdDTV9GVU5DUkVGXzRCSVQKKyN1bmRlZiBHQ01fTVVMCisjZGVmaW5lIEdDTV9NVUwoY3R4LCBYaSkgKCpnY21fZ211bHRfcCkoY3R4LT5YaS51LCBjdHgtPkh0YWJsZSkKKyNpZmRlZiBHSEFTSAorI3VuZGVmIEdIQVNICisjZGVmaW5lIEdIQVNIKGN0eCwgaW4sIGxlbikgKCpnY21fZ2hhc2hfcCkoY3R4LT5YaS51LCBjdHgtPkh0YWJsZSwgaW4sIGxlbikKKyNlbmRpZgorI2VuZGlmCisKK0dDTTEyOF9DT05URVhUICpDUllQVE9fZ2NtMTI4X25ldyh2b2lkICprZXksIGJsb2NrMTI4X2YgYmxvY2spIHsKKyAgR0NNMTI4X0NPTlRFWFQgKnJldDsKKworICByZXQgPSAoR0NNMTI4X0NPTlRFWFQgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoR0NNMTI4X0NPTlRFWFQpKTsKKyAgaWYgKHJldCAhPSBOVUxMKSB7CisgICAgQ1JZUFRPX2djbTEyOF9pbml0KHJldCwga2V5LCBibG9jayk7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCit2b2lkIENSWVBUT19nY20xMjhfaW5pdChHQ00xMjhfQ09OVEVYVCAqY3R4LCB2b2lkICprZXksIGJsb2NrMTI4X2YgYmxvY2spIHsKKyAgY29uc3QgdW5pb24geworICAgIGxvbmcgb25lOworICAgIGNoYXIgbGl0dGxlOworICB9IGlzX2VuZGlhbiA9IHsxfTsKKworICBtZW1zZXQoY3R4LCAwLCBzaXplb2YoKmN0eCkpOworICBjdHgtPmJsb2NrID0gYmxvY2s7CisgIGN0eC0+a2V5ID0ga2V5OworCisgICgqYmxvY2spKGN0eC0+SC5jLCBjdHgtPkguYywga2V5KTsKKworICBpZiAoaXNfZW5kaWFuLmxpdHRsZSkgeworLyogSCBpcyBzdG9yZWQgaW4gaG9zdCBieXRlIG9yZGVyICovCisjaWZkZWYgQlNXQVA4CisgICAgY3R4LT5ILnVbMF0gPSBCU1dBUDgoY3R4LT5ILnVbMF0pOworICAgIGN0eC0+SC51WzFdID0gQlNXQVA4KGN0eC0+SC51WzFdKTsKKyNlbHNlCisgICAgdWludDhfdCAqcCA9IGN0eC0+SC5jOworICAgIHVpbnQ2NF90IGhpLCBsbzsKKyAgICBoaSA9ICh1aW50NjRfdClHRVRVMzIocCkgPDwgMzIgfCBHRVRVMzIocCArIDQpOworICAgIGxvID0gKHVpbnQ2NF90KUdFVFUzMihwICsgOCkgPDwgMzIgfCBHRVRVMzIocCArIDEyKTsKKyAgICBjdHgtPkgudVswXSA9IGhpOworICAgIGN0eC0+SC51WzFdID0gbG87CisjZW5kaWYKKyAgfQorCisjaWYgZGVmaW5lZChHSEFTSF9BU01fWDg2X09SXzY0KQorICBpZiAoT1BFTlNTTF9pYTMyY2FwX1BbMF0gJiAoMSA8PCAyNCkgJiYgLyogY2hlY2sgRlhTUiBiaXQgKi8KKyAgICAgIE9QRU5TU0xfaWEzMmNhcF9QWzFdICYgKDEgPDwgMSkpIHsgIC8qIGNoZWNrIFBDTE1VTFFEUSBiaXQgKi8KKyAgICBpZiAoKChPUEVOU1NMX2lhMzJjYXBfUFsxXSA+PiAyMikgJiAweDQxKSA9PSAweDQxKSB7IC8qIEFWWCtNT1ZCRSAqLworICAgICAgZ2NtX2luaXRfYXZ4KGN0eC0+SHRhYmxlLCBjdHgtPkgudSk7CisgICAgICBjdHgtPmdtdWx0ID0gZ2NtX2dtdWx0X2F2eDsKKyAgICAgIGN0eC0+Z2hhc2ggPSBnY21fZ2hhc2hfYXZ4OworICAgIH0gZWxzZSB7CisgICAgICBnY21faW5pdF9jbG11bChjdHgtPkh0YWJsZSwgY3R4LT5ILnUpOworICAgICAgY3R4LT5nbXVsdCA9IGdjbV9nbXVsdF9jbG11bDsKKyAgICAgIGN0eC0+Z2hhc2ggPSBnY21fZ2hhc2hfY2xtdWw7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBnY21faW5pdF80Yml0KGN0eC0+SHRhYmxlLCBjdHgtPkgudSk7CisjaWYgZGVmaW5lZChHSEFTSF9BU01fWDg2KSAvKiB4ODYgb25seSAqLworICBpZiAoT1BFTlNTTF9pYTMyY2FwX1BbMF0gJiAoMSA8PCAyNSkpIHsgLyogY2hlY2sgU1NFIGJpdCAqLworICAgIGN0eC0+Z211bHQgPSBnY21fZ211bHRfNGJpdF9tbXg7CisgICAgY3R4LT5naGFzaCA9IGdjbV9naGFzaF80Yml0X21teDsKKyAgfSBlbHNlIHsKKyAgICBjdHgtPmdtdWx0ID0gZ2NtX2dtdWx0XzRiaXRfeDg2OworICAgIGN0eC0+Z2hhc2ggPSBnY21fZ2hhc2hfNGJpdF94ODY7CisgIH0KKyNlbHNlCisgIGN0eC0+Z211bHQgPSBnY21fZ211bHRfNGJpdDsKKyAgY3R4LT5naGFzaCA9IGdjbV9naGFzaF80Yml0OworI2VuZGlmCisjZWxpZiBkZWZpbmVkKEdIQVNIX0FTTV9BUk0pCisgIGlmIChDUllQVE9faXNfTkVPTl9jYXBhYmxlKCkpIHsKKyAgICBjdHgtPmdtdWx0ID0gZ2NtX2dtdWx0X25lb247CisgICAgY3R4LT5naGFzaCA9IGdjbV9naGFzaF9uZW9uOworICB9IGVsc2UgeworICAgIGdjbV9pbml0XzRiaXQoY3R4LT5IdGFibGUsIGN0eC0+SC51KTsKKyAgICBjdHgtPmdtdWx0ID0gZ2NtX2dtdWx0XzRiaXQ7CisgICAgY3R4LT5naGFzaCA9IGdjbV9naGFzaF80Yml0OworICB9CisjZWxzZQorICBjdHgtPmdtdWx0ID0gZ2NtX2dtdWx0XzRiaXQ7CisgIGN0eC0+Z2hhc2ggPSBnY21fZ2hhc2hfNGJpdDsKKyAgZ2NtX2luaXRfNGJpdChjdHgtPkh0YWJsZSwgY3R4LT5ILnUpOworI2VuZGlmCit9CisKK3ZvaWQgQ1JZUFRPX2djbTEyOF9zZXRpdihHQ00xMjhfQ09OVEVYVCAqY3R4LCBjb25zdCB1aW50OF90ICppdiwgc2l6ZV90IGxlbikgeworICBjb25zdCB1bmlvbiB7CisgICAgbG9uZyBvbmU7CisgICAgY2hhciBsaXR0bGU7CisgIH0gaXNfZW5kaWFuID0gezF9OworICB1bnNpZ25lZCBpbnQgY3RyOworI2lmZGVmIEdDTV9GVU5DUkVGXzRCSVQKKyAgdm9pZCAoKmdjbV9nbXVsdF9wKSh1aW50NjRfdCBYaVsyXSwgY29uc3QgdTEyOCBIdGFibGVbMTZdKSA9IGN0eC0+Z211bHQ7CisjZW5kaWYKKworICBjdHgtPllpLnVbMF0gPSAwOworICBjdHgtPllpLnVbMV0gPSAwOworICBjdHgtPlhpLnVbMF0gPSAwOworICBjdHgtPlhpLnVbMV0gPSAwOworICBjdHgtPmxlbi51WzBdID0gMDsgLyogQUFEIGxlbmd0aCAqLworICBjdHgtPmxlbi51WzFdID0gMDsgLyogbWVzc2FnZSBsZW5ndGggKi8KKyAgY3R4LT5hcmVzID0gMDsKKyAgY3R4LT5tcmVzID0gMDsKKworICBpZiAobGVuID09IDEyKSB7CisgICAgbWVtY3B5KGN0eC0+WWkuYywgaXYsIDEyKTsKKyAgICBjdHgtPllpLmNbMTVdID0gMTsKKyAgICBjdHIgPSAxOworICB9IGVsc2UgeworICAgIHNpemVfdCBpOworICAgIHVpbnQ2NF90IGxlbjAgPSBsZW47CisKKyAgICB3aGlsZSAobGVuID49IDE2KSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgICAgICBjdHgtPllpLmNbaV0gXj0gaXZbaV07CisgICAgICB9CisgICAgICBHQ01fTVVMKGN0eCwgWWkpOworICAgICAgaXYgKz0gMTY7CisgICAgICBsZW4gLT0gMTY7CisgICAgfQorICAgIGlmIChsZW4pIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgICAgICBjdHgtPllpLmNbaV0gXj0gaXZbaV07CisgICAgICB9CisgICAgICBHQ01fTVVMKGN0eCwgWWkpOworICAgIH0KKyAgICBsZW4wIDw8PSAzOworICAgIGlmIChpc19lbmRpYW4ubGl0dGxlKSB7CisjaWZkZWYgQlNXQVA4CisgICAgICBjdHgtPllpLnVbMV0gXj0gQlNXQVA4KGxlbjApOworI2Vsc2UKKyAgICAgIGN0eC0+WWkuY1s4XSBePSAodWludDhfdCkobGVuMCA+PiA1Nik7CisgICAgICBjdHgtPllpLmNbOV0gXj0gKHVpbnQ4X3QpKGxlbjAgPj4gNDgpOworICAgICAgY3R4LT5ZaS5jWzEwXSBePSAodWludDhfdCkobGVuMCA+PiA0MCk7CisgICAgICBjdHgtPllpLmNbMTFdIF49ICh1aW50OF90KShsZW4wID4+IDMyKTsKKyAgICAgIGN0eC0+WWkuY1sxMl0gXj0gKHVpbnQ4X3QpKGxlbjAgPj4gMjQpOworICAgICAgY3R4LT5ZaS5jWzEzXSBePSAodWludDhfdCkobGVuMCA+PiAxNik7CisgICAgICBjdHgtPllpLmNbMTRdIF49ICh1aW50OF90KShsZW4wID4+IDgpOworICAgICAgY3R4LT5ZaS5jWzE1XSBePSAodWludDhfdCkobGVuMCk7CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgY3R4LT5ZaS51WzFdIF49IGxlbjA7CisgICAgfQorCisgICAgR0NNX01VTChjdHgsIFlpKTsKKworICAgIGlmIChpc19lbmRpYW4ubGl0dGxlKSB7CisgICAgICBjdHIgPSBHRVRVMzIoY3R4LT5ZaS5jICsgMTIpOworICAgIH0gZWxzZSB7CisgICAgICBjdHIgPSBjdHgtPllpLmRbM107CisgICAgfQorICB9CisKKyAgKCpjdHgtPmJsb2NrKShjdHgtPllpLmMsIGN0eC0+RUswLmMsIGN0eC0+a2V5KTsKKyAgKytjdHI7CisgIGlmIChpc19lbmRpYW4ubGl0dGxlKSB7CisgICAgUFVUVTMyKGN0eC0+WWkuYyArIDEyLCBjdHIpOworICB9IGVsc2UgeworICAgIGN0eC0+WWkuZFszXSA9IGN0cjsKKyAgfQorfQorCitpbnQgQ1JZUFRPX2djbTEyOF9hYWQoR0NNMTI4X0NPTlRFWFQgKmN0eCwgY29uc3QgdWludDhfdCAqYWFkLCBzaXplX3QgbGVuKSB7CisgIHNpemVfdCBpOworICB1bnNpZ25lZCBpbnQgbjsKKyAgdWludDY0X3QgYWxlbiA9IGN0eC0+bGVuLnVbMF07CisjaWZkZWYgR0NNX0ZVTkNSRUZfNEJJVAorICB2b2lkICgqZ2NtX2dtdWx0X3ApKHVpbnQ2NF90IFhpWzJdLCBjb25zdCB1MTI4IEh0YWJsZVsxNl0pID0gY3R4LT5nbXVsdDsKKyNpZmRlZiBHSEFTSAorICB2b2lkICgqZ2NtX2doYXNoX3ApKHVpbnQ2NF90IFhpWzJdLCBjb25zdCB1MTI4IEh0YWJsZVsxNl0sIGNvbnN0IHVpbnQ4X3QgKmlucCwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuKSA9IGN0eC0+Z2hhc2g7CisjZW5kaWYKKyNlbmRpZgorCisgIGlmIChjdHgtPmxlbi51WzFdKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBhbGVuICs9IGxlbjsKKyAgaWYgKGFsZW4gPiAoVTY0KDEpIDw8IDYxKSB8fCAoc2l6ZW9mKGxlbikgPT0gOCAmJiBhbGVuIDwgbGVuKSkgeworICAgIHJldHVybiAwOworICB9CisgIGN0eC0+bGVuLnVbMF0gPSBhbGVuOworCisgIG4gPSBjdHgtPmFyZXM7CisgIGlmIChuKSB7CisgICAgd2hpbGUgKG4gJiYgbGVuKSB7CisgICAgICBjdHgtPlhpLmNbbl0gXj0gKihhYWQrKyk7CisgICAgICAtLWxlbjsKKyAgICAgIG4gPSAobiArIDEpICUgMTY7CisgICAgfQorICAgIGlmIChuID09IDApIHsKKyAgICAgIEdDTV9NVUwoY3R4LCBYaSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGN0eC0+YXJlcyA9IG47CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKworI2lmZGVmIEdIQVNICisgIGlmICgoaSA9IChsZW4gJiAoc2l6ZV90KSAtIDE2KSkpIHsKKyAgICBHSEFTSChjdHgsIGFhZCwgaSk7CisgICAgYWFkICs9IGk7CisgICAgbGVuIC09IGk7CisgIH0KKyNlbHNlCisgIHdoaWxlIChsZW4gPj0gMTYpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgICAgY3R4LT5YaS5jW2ldIF49IGFhZFtpXTsKKyAgICB9CisgICAgR0NNX01VTChjdHgsIFhpKTsKKyAgICBhYWQgKz0gMTY7CisgICAgbGVuIC09IDE2OworICB9CisjZW5kaWYKKyAgaWYgKGxlbikgeworICAgIG4gPSAodW5zaWduZWQgaW50KWxlbjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCisgICAgICBjdHgtPlhpLmNbaV0gXj0gYWFkW2ldOworICB9CisKKyAgY3R4LT5hcmVzID0gbjsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBDUllQVE9fZ2NtMTI4X2VuY3J5cHQoR0NNMTI4X0NPTlRFWFQgKmN0eCwgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgc2l6ZV90IGxlbikgeworICBjb25zdCB1bmlvbiB7CisgICAgbG9uZyBvbmU7CisgICAgY2hhciBsaXR0bGU7CisgIH0gaXNfZW5kaWFuID0gezF9OworICB1bnNpZ25lZCBpbnQgbiwgY3RyOworICBzaXplX3QgaTsKKyAgdWludDY0X3QgbWxlbiA9IGN0eC0+bGVuLnVbMV07CisgIGJsb2NrMTI4X2YgYmxvY2sgPSBjdHgtPmJsb2NrOworICB2b2lkICprZXkgPSBjdHgtPmtleTsKKyNpZmRlZiBHQ01fRlVOQ1JFRl80QklUCisgIHZvaWQgKCpnY21fZ211bHRfcCkodWludDY0X3QgWGlbMl0sIGNvbnN0IHUxMjggSHRhYmxlWzE2XSkgPSBjdHgtPmdtdWx0OworI2lmZGVmIEdIQVNICisgIHZvaWQgKCpnY21fZ2hhc2hfcCkodWludDY0X3QgWGlbMl0sIGNvbnN0IHUxMjggSHRhYmxlWzE2XSwgY29uc3QgdWludDhfdCAqaW5wLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4pID0gY3R4LT5naGFzaDsKKyNlbmRpZgorI2VuZGlmCisKKyAgbWxlbiArPSBsZW47CisgIGlmIChtbGVuID4gKChVNjQoMSkgPDwgMzYpIC0gMzIpIHx8IChzaXplb2YobGVuKSA9PSA4ICYmIG1sZW4gPCBsZW4pKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgY3R4LT5sZW4udVsxXSA9IG1sZW47CisKKyAgaWYgKGN0eC0+YXJlcykgeworICAgIC8qIEZpcnN0IGNhbGwgdG8gZW5jcnlwdCBmaW5hbGl6ZXMgR0hBU0goQUFEKSAqLworICAgIEdDTV9NVUwoY3R4LCBYaSk7CisgICAgY3R4LT5hcmVzID0gMDsKKyAgfQorCisgIGlmIChpc19lbmRpYW4ubGl0dGxlKSB7CisgICAgY3RyID0gR0VUVTMyKGN0eC0+WWkuYyArIDEyKTsKKyAgfSBlbHNlIHsKKyAgICBjdHIgPSBjdHgtPllpLmRbM107CisgIH0KKworICBuID0gY3R4LT5tcmVzOworICBpZiAobikgeworICAgIHdoaWxlIChuICYmIGxlbikgeworICAgICAgY3R4LT5YaS5jW25dIF49ICoob3V0KyspID0gKihpbisrKSBeIGN0eC0+RUtpLmNbbl07CisgICAgICAtLWxlbjsKKyAgICAgIG4gPSAobiArIDEpICUgMTY7CisgICAgfQorICAgIGlmIChuID09IDApIHsKKyAgICAgIEdDTV9NVUwoY3R4LCBYaSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGN0eC0+bXJlcyA9IG47CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKyAgaWYgKFNUUklDVF9BTElHTk1FTlQgJiYgKChzaXplX3QpaW4gfCAoc2l6ZV90KW91dCkgJSBzaXplb2Yoc2l6ZV90KSAhPSAwKSB7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgICBpZiAobiA9PSAwKSB7CisgICAgICAgICgqYmxvY2spKGN0eC0+WWkuYywgY3R4LT5FS2kuYywga2V5KTsKKyAgICAgICAgKytjdHI7CisgICAgICAgIGlmIChpc19lbmRpYW4ubGl0dGxlKSB7CisgICAgICAgICAgUFVUVTMyKGN0eC0+WWkuYyArIDEyLCBjdHIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGN0eC0+WWkuZFszXSA9IGN0cjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgY3R4LT5YaS5jW25dIF49IG91dFtpXSA9IGluW2ldIF4gY3R4LT5FS2kuY1tuXTsKKyAgICAgIG4gPSAobiArIDEpICUgMTY7CisgICAgICBpZiAobiA9PSAwKSB7CisgICAgICAgIEdDTV9NVUwoY3R4LCBYaSk7CisgICAgICB9CisgICAgfQorCisgICAgY3R4LT5tcmVzID0gbjsKKyAgICByZXR1cm4gMTsKKyAgfQorI2lmIGRlZmluZWQoR0hBU0gpICYmIGRlZmluZWQoR0hBU0hfQ0hVTkspCisgIHdoaWxlIChsZW4gPj0gR0hBU0hfQ0hVTkspIHsKKyAgICBzaXplX3QgaiA9IEdIQVNIX0NIVU5LOworCisgICAgd2hpbGUgKGopIHsKKyAgICAgIHNpemVfdCAqb3V0X3QgPSAoc2l6ZV90ICopb3V0OworICAgICAgY29uc3Qgc2l6ZV90ICppbl90ID0gKGNvbnN0IHNpemVfdCAqKWluOworCisgICAgICAoKmJsb2NrKShjdHgtPllpLmMsIGN0eC0+RUtpLmMsIGtleSk7CisgICAgICArK2N0cjsKKyAgICAgIGlmIChpc19lbmRpYW4ubGl0dGxlKSB7CisgICAgICAgIFBVVFUzMihjdHgtPllpLmMgKyAxMiwgY3RyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGN0eC0+WWkuZFszXSA9IGN0cjsKKyAgICAgIH0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCAxNiAvIHNpemVvZihzaXplX3QpOyArK2kpIHsKKyAgICAgICAgb3V0X3RbaV0gPSBpbl90W2ldIF4gY3R4LT5FS2kudFtpXTsKKyAgICAgIH0KKyAgICAgIG91dCArPSAxNjsKKyAgICAgIGluICs9IDE2OworICAgICAgaiAtPSAxNjsKKyAgICB9CisgICAgR0hBU0goY3R4LCBvdXQgLSBHSEFTSF9DSFVOSywgR0hBU0hfQ0hVTkspOworICAgIGxlbiAtPSBHSEFTSF9DSFVOSzsKKyAgfQorICBpZiAoKGkgPSAobGVuICYgKHNpemVfdCkgLSAxNikpKSB7CisgICAgc2l6ZV90IGogPSBpOworCisgICAgd2hpbGUgKGxlbiA+PSAxNikgeworICAgICAgc2l6ZV90ICpvdXRfdCA9IChzaXplX3QgKilvdXQ7CisgICAgICBjb25zdCBzaXplX3QgKmluX3QgPSAoY29uc3Qgc2l6ZV90ICopaW47CisKKyAgICAgICgqYmxvY2spKGN0eC0+WWkuYywgY3R4LT5FS2kuYywga2V5KTsKKyAgICAgICsrY3RyOworICAgICAgaWYgKGlzX2VuZGlhbi5saXR0bGUpIHsKKyAgICAgICAgUFVUVTMyKGN0eC0+WWkuYyArIDEyLCBjdHIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY3R4LT5ZaS5kWzNdID0gY3RyOworICAgICAgfQorICAgICAgZm9yIChpID0gMDsgaSA8IDE2IC8gc2l6ZW9mKHNpemVfdCk7ICsraSkgeworICAgICAgICBvdXRfdFtpXSA9IGluX3RbaV0gXiBjdHgtPkVLaS50W2ldOworICAgICAgfQorICAgICAgb3V0ICs9IDE2OworICAgICAgaW4gKz0gMTY7CisgICAgICBsZW4gLT0gMTY7CisgICAgfQorICAgIEdIQVNIKGN0eCwgb3V0IC0gaiwgaik7CisgIH0KKyNlbHNlCisgIHdoaWxlIChsZW4gPj0gMTYpIHsKKyAgICBzaXplX3QgKm91dF90ID0gKHNpemVfdCAqKW91dDsKKyAgICBjb25zdCBzaXplX3QgKmluX3QgPSAoY29uc3Qgc2l6ZV90ICopaW47CisKKyAgICAoKmJsb2NrKShjdHgtPllpLmMsIGN0eC0+RUtpLmMsIGtleSk7CisgICAgKytjdHI7CisgICAgaWYgKGlzX2VuZGlhbi5saXR0bGUpIHsKKyAgICAgIFBVVFUzMihjdHgtPllpLmMgKyAxMiwgY3RyKTsKKyAgICB9IGVsc2UgeworICAgICAgY3R4LT5ZaS5kWzNdID0gY3RyOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgMTYgLyBzaXplb2Yoc2l6ZV90KTsgKytpKSB7CisgICAgICBjdHgtPlhpLnRbaV0gXj0gb3V0X3RbaV0gPSBpbl90W2ldIF4gY3R4LT5FS2kudFtpXTsKKyAgICB9CisgICAgR0NNX01VTChjdHgsIFhpKTsKKyAgICBvdXQgKz0gMTY7CisgICAgaW4gKz0gMTY7CisgICAgbGVuIC09IDE2OworICB9CisjZW5kaWYKKyAgaWYgKGxlbikgeworICAgICgqYmxvY2spKGN0eC0+WWkuYywgY3R4LT5FS2kuYywga2V5KTsKKyAgICArK2N0cjsKKyAgICBpZiAoaXNfZW5kaWFuLmxpdHRsZSkgeworICAgICAgUFVUVTMyKGN0eC0+WWkuYyArIDEyLCBjdHIpOworICAgIH0gZWxzZSB7CisgICAgICBjdHgtPllpLmRbM10gPSBjdHI7CisgICAgfQorICAgIHdoaWxlIChsZW4tLSkgeworICAgICAgY3R4LT5YaS5jW25dIF49IG91dFtuXSA9IGluW25dIF4gY3R4LT5FS2kuY1tuXTsKKyAgICAgICsrbjsKKyAgICB9CisgIH0KKworICBjdHgtPm1yZXMgPSBuOworICByZXR1cm4gMTsKK30KKworaW50IENSWVBUT19nY20xMjhfZGVjcnlwdChHQ00xMjhfQ09OVEVYVCAqY3R4LCBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCBzaXplX3QgbGVuKSB7CisgIGNvbnN0IHVuaW9uIHsKKyAgICBsb25nIG9uZTsKKyAgICBjaGFyIGxpdHRsZTsKKyAgfSBpc19lbmRpYW4gPSB7MX07CisgIHVuc2lnbmVkIGludCBuLCBjdHI7CisgIHNpemVfdCBpOworICB1aW50NjRfdCBtbGVuID0gY3R4LT5sZW4udVsxXTsKKyAgYmxvY2sxMjhfZiBibG9jayA9IGN0eC0+YmxvY2s7CisgIHZvaWQgKmtleSA9IGN0eC0+a2V5OworI2lmZGVmIEdDTV9GVU5DUkVGXzRCSVQKKyAgdm9pZCAoKmdjbV9nbXVsdF9wKSh1aW50NjRfdCBYaVsyXSwgY29uc3QgdTEyOCBIdGFibGVbMTZdKSA9IGN0eC0+Z211bHQ7CisjaWZkZWYgR0hBU0gKKyAgdm9pZCAoKmdjbV9naGFzaF9wKSh1aW50NjRfdCBYaVsyXSwgY29uc3QgdTEyOCBIdGFibGVbMTZdLCBjb25zdCB1aW50OF90ICppbnAsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbikgPSBjdHgtPmdoYXNoOworI2VuZGlmCisjZW5kaWYKKworICBtbGVuICs9IGxlbjsKKyAgaWYgKG1sZW4gPiAoKFU2NCgxKSA8PCAzNikgLSAzMikgfHwgKHNpemVvZihsZW4pID09IDggJiYgbWxlbiA8IGxlbikpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBjdHgtPmxlbi51WzFdID0gbWxlbjsKKworICBpZiAoY3R4LT5hcmVzKSB7CisgICAgLyogRmlyc3QgY2FsbCB0byBkZWNyeXB0IGZpbmFsaXplcyBHSEFTSChBQUQpICovCisgICAgR0NNX01VTChjdHgsIFhpKTsKKyAgICBjdHgtPmFyZXMgPSAwOworICB9CisKKyAgaWYgKGlzX2VuZGlhbi5saXR0bGUpIHsKKyAgICBjdHIgPSBHRVRVMzIoY3R4LT5ZaS5jICsgMTIpOworICB9IGVsc2UgeworICAgIGN0ciA9IGN0eC0+WWkuZFszXTsKKyAgfQorCisgIG4gPSBjdHgtPm1yZXM7CisgIGlmIChuKSB7CisgICAgd2hpbGUgKG4gJiYgbGVuKSB7CisgICAgICB1aW50OF90IGMgPSAqKGluKyspOworICAgICAgKihvdXQrKykgPSBjIF4gY3R4LT5FS2kuY1tuXTsKKyAgICAgIGN0eC0+WGkuY1tuXSBePSBjOworICAgICAgLS1sZW47CisgICAgICBuID0gKG4gKyAxKSAlIDE2OworICAgIH0KKyAgICBpZiAobiA9PSAwKSB7CisgICAgICBHQ01fTVVMKGN0eCwgWGkpOworICAgIH0gZWxzZSB7CisgICAgICBjdHgtPm1yZXMgPSBuOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisgIGlmIChTVFJJQ1RfQUxJR05NRU5UICYmICgoc2l6ZV90KWluIHwgKHNpemVfdClvdXQpICUgc2l6ZW9mKHNpemVfdCkgIT0gMCkgeworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgICAgdWludDhfdCBjOworICAgICAgaWYgKG4gPT0gMCkgeworICAgICAgICAoKmJsb2NrKShjdHgtPllpLmMsIGN0eC0+RUtpLmMsIGtleSk7CisgICAgICAgICsrY3RyOworICAgICAgICBpZiAoaXNfZW5kaWFuLmxpdHRsZSkgeworICAgICAgICAgIFBVVFUzMihjdHgtPllpLmMgKyAxMiwgY3RyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjdHgtPllpLmRbM10gPSBjdHI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGMgPSBpbltpXTsKKyAgICAgIG91dFtpXSA9IGMgXiBjdHgtPkVLaS5jW25dOworICAgICAgY3R4LT5YaS5jW25dIF49IGM7CisgICAgICBuID0gKG4gKyAxKSAlIDE2OworICAgICAgaWYgKG4gPT0gMCkgeworICAgICAgICBHQ01fTVVMKGN0eCwgWGkpOworICAgICAgfQorICAgIH0KKworICAgIGN0eC0+bXJlcyA9IG47CisgICAgcmV0dXJuIDE7CisgIH0KKyNpZiBkZWZpbmVkKEdIQVNIKSAmJiBkZWZpbmVkKEdIQVNIX0NIVU5LKQorICB3aGlsZSAobGVuID49IEdIQVNIX0NIVU5LKSB7CisgICAgc2l6ZV90IGogPSBHSEFTSF9DSFVOSzsKKworICAgIEdIQVNIKGN0eCwgaW4sIEdIQVNIX0NIVU5LKTsKKyAgICB3aGlsZSAoaikgeworICAgICAgc2l6ZV90ICpvdXRfdCA9IChzaXplX3QgKilvdXQ7CisgICAgICBjb25zdCBzaXplX3QgKmluX3QgPSAoY29uc3Qgc2l6ZV90ICopaW47CisKKyAgICAgICgqYmxvY2spKGN0eC0+WWkuYywgY3R4LT5FS2kuYywga2V5KTsKKyAgICAgICsrY3RyOworICAgICAgaWYgKGlzX2VuZGlhbi5saXR0bGUpIHsKKyAgICAgICAgUFVUVTMyKGN0eC0+WWkuYyArIDEyLCBjdHIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY3R4LT5ZaS5kWzNdID0gY3RyOworICAgICAgfQorICAgICAgZm9yIChpID0gMDsgaSA8IDE2IC8gc2l6ZW9mKHNpemVfdCk7ICsraSkgeworICAgICAgICBvdXRfdFtpXSA9IGluX3RbaV0gXiBjdHgtPkVLaS50W2ldOworICAgICAgfQorICAgICAgb3V0ICs9IDE2OworICAgICAgaW4gKz0gMTY7CisgICAgICBqIC09IDE2OworICAgIH0KKyAgICBsZW4gLT0gR0hBU0hfQ0hVTks7CisgIH0KKyAgaWYgKChpID0gKGxlbiAmIChzaXplX3QpIC0gMTYpKSkgeworICAgIEdIQVNIKGN0eCwgaW4sIGkpOworICAgIHdoaWxlIChsZW4gPj0gMTYpIHsKKyAgICAgIHNpemVfdCAqb3V0X3QgPSAoc2l6ZV90ICopb3V0OworICAgICAgY29uc3Qgc2l6ZV90ICppbl90ID0gKGNvbnN0IHNpemVfdCAqKWluOworCisgICAgICAoKmJsb2NrKShjdHgtPllpLmMsIGN0eC0+RUtpLmMsIGtleSk7CisgICAgICArK2N0cjsKKyAgICAgIGlmIChpc19lbmRpYW4ubGl0dGxlKSB7CisgICAgICAgIFBVVFUzMihjdHgtPllpLmMgKyAxMiwgY3RyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGN0eC0+WWkuZFszXSA9IGN0cjsKKyAgICAgIH0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCAxNiAvIHNpemVvZihzaXplX3QpOyArK2kpIHsKKyAgICAgICAgb3V0X3RbaV0gPSBpbl90W2ldIF4gY3R4LT5FS2kudFtpXTsKKyAgICAgIH0KKyAgICAgIG91dCArPSAxNjsKKyAgICAgIGluICs9IDE2OworICAgICAgbGVuIC09IDE2OworICAgIH0KKyAgfQorI2Vsc2UKKyAgd2hpbGUgKGxlbiA+PSAxNikgeworICAgIHNpemVfdCAqb3V0X3QgPSAoc2l6ZV90ICopb3V0OworICAgIGNvbnN0IHNpemVfdCAqaW5fdCA9IChjb25zdCBzaXplX3QgKilpbjsKKworICAgICgqYmxvY2spKGN0eC0+WWkuYywgY3R4LT5FS2kuYywga2V5KTsKKyAgICArK2N0cjsKKyAgICBpZiAoaXNfZW5kaWFuLmxpdHRsZSkgeworICAgICAgUFVUVTMyKGN0eC0+WWkuYyArIDEyLCBjdHIpOworICAgIH0gZWxzZSB7CisgICAgICBjdHgtPllpLmRbM10gPSBjdHI7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCAxNiAvIHNpemVvZihzaXplX3QpOyArK2kpIHsKKyAgICAgIHNpemVfdCBjID0gaW5fdFtpXTsKKyAgICAgIG91dF90W2ldID0gYyBeIGN0eC0+RUtpLnRbaV07CisgICAgICBjdHgtPlhpLnRbaV0gXj0gYzsKKyAgICB9CisgICAgR0NNX01VTChjdHgsIFhpKTsKKyAgICBvdXQgKz0gMTY7CisgICAgaW4gKz0gMTY7CisgICAgbGVuIC09IDE2OworICB9CisjZW5kaWYKKyAgaWYgKGxlbikgeworICAgICgqYmxvY2spKGN0eC0+WWkuYywgY3R4LT5FS2kuYywga2V5KTsKKyAgICArK2N0cjsKKyAgICBpZiAoaXNfZW5kaWFuLmxpdHRsZSkgeworICAgICAgUFVUVTMyKGN0eC0+WWkuYyArIDEyLCBjdHIpOworICAgIH0gZWxzZSB7CisgICAgICBjdHgtPllpLmRbM10gPSBjdHI7CisgICAgfQorICAgIHdoaWxlIChsZW4tLSkgeworICAgICAgdWludDhfdCBjID0gaW5bbl07CisgICAgICBjdHgtPlhpLmNbbl0gXj0gYzsKKyAgICAgIG91dFtuXSA9IGMgXiBjdHgtPkVLaS5jW25dOworICAgICAgKytuOworICAgIH0KKyAgfQorCisgIGN0eC0+bXJlcyA9IG47CisgIHJldHVybiAxOworfQorCitpbnQgQ1JZUFRPX2djbTEyOF9lbmNyeXB0X2N0cjMyKEdDTTEyOF9DT05URVhUICpjdHgsIGNvbnN0IHVpbnQ4X3QgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpvdXQsIHNpemVfdCBsZW4sIGN0cjEyOF9mIHN0cmVhbSkgeworICBjb25zdCB1bmlvbiB7CisgICAgbG9uZyBvbmU7CisgICAgY2hhciBsaXR0bGU7CisgIH0gaXNfZW5kaWFuID0gezF9OworICB1bnNpZ25lZCBpbnQgbiwgY3RyOworICBzaXplX3QgaTsKKyAgdWludDY0X3QgbWxlbiA9IGN0eC0+bGVuLnVbMV07CisgIHZvaWQgKmtleSA9IGN0eC0+a2V5OworI2lmZGVmIEdDTV9GVU5DUkVGXzRCSVQKKyAgdm9pZCAoKmdjbV9nbXVsdF9wKSh1aW50NjRfdCBYaVsyXSwgY29uc3QgdTEyOCBIdGFibGVbMTZdKSA9IGN0eC0+Z211bHQ7CisjaWZkZWYgR0hBU0gKKyAgdm9pZCAoKmdjbV9naGFzaF9wKSh1aW50NjRfdCBYaVsyXSwgY29uc3QgdTEyOCBIdGFibGVbMTZdLCBjb25zdCB1aW50OF90ICppbnAsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbikgPSBjdHgtPmdoYXNoOworI2VuZGlmCisjZW5kaWYKKworICBtbGVuICs9IGxlbjsKKyAgaWYgKG1sZW4gPiAoKFU2NCgxKSA8PCAzNikgLSAzMikgfHwgKHNpemVvZihsZW4pID09IDggJiYgbWxlbiA8IGxlbikpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBjdHgtPmxlbi51WzFdID0gbWxlbjsKKworICBpZiAoY3R4LT5hcmVzKSB7CisgICAgLyogRmlyc3QgY2FsbCB0byBlbmNyeXB0IGZpbmFsaXplcyBHSEFTSChBQUQpICovCisgICAgR0NNX01VTChjdHgsIFhpKTsKKyAgICBjdHgtPmFyZXMgPSAwOworICB9CisKKyAgaWYgKGlzX2VuZGlhbi5saXR0bGUpIHsKKyAgICBjdHIgPSBHRVRVMzIoY3R4LT5ZaS5jICsgMTIpOworICB9IGVsc2UgeworICAgIGN0ciA9IGN0eC0+WWkuZFszXTsKKyAgfQorCisgIG4gPSBjdHgtPm1yZXM7CisgIGlmIChuKSB7CisgICAgd2hpbGUgKG4gJiYgbGVuKSB7CisgICAgICBjdHgtPlhpLmNbbl0gXj0gKihvdXQrKykgPSAqKGluKyspIF4gY3R4LT5FS2kuY1tuXTsKKyAgICAgIC0tbGVuOworICAgICAgbiA9IChuICsgMSkgJSAxNjsKKyAgICB9CisgICAgaWYgKG4gPT0gMCkgeworICAgICAgR0NNX01VTChjdHgsIFhpKTsKKyAgICB9IGVsc2UgeworICAgICAgY3R4LT5tcmVzID0gbjsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorI2lmIGRlZmluZWQoR0hBU0gpCisgIHdoaWxlIChsZW4gPj0gR0hBU0hfQ0hVTkspIHsKKyAgICAoKnN0cmVhbSkoaW4sIG91dCwgR0hBU0hfQ0hVTksgLyAxNiwga2V5LCBjdHgtPllpLmMpOworICAgIGN0ciArPSBHSEFTSF9DSFVOSyAvIDE2OworICAgIGlmIChpc19lbmRpYW4ubGl0dGxlKSB7CisgICAgICBQVVRVMzIoY3R4LT5ZaS5jICsgMTIsIGN0cik7CisgICAgfSBlbHNlIHsKKyAgICAgIGN0eC0+WWkuZFszXSA9IGN0cjsKKyAgICB9CisgICAgR0hBU0goY3R4LCBvdXQsIEdIQVNIX0NIVU5LKTsKKyAgICBvdXQgKz0gR0hBU0hfQ0hVTks7CisgICAgaW4gKz0gR0hBU0hfQ0hVTks7CisgICAgbGVuIC09IEdIQVNIX0NIVU5LOworICB9CisjZW5kaWYKKyAgaWYgKChpID0gKGxlbiAmIChzaXplX3QpIC0gMTYpKSkgeworICAgIHNpemVfdCBqID0gaSAvIDE2OworCisgICAgKCpzdHJlYW0pKGluLCBvdXQsIGosIGtleSwgY3R4LT5ZaS5jKTsKKyAgICBjdHIgKz0gKHVuc2lnbmVkIGludClqOworICAgIGlmIChpc19lbmRpYW4ubGl0dGxlKSB7CisgICAgICBQVVRVMzIoY3R4LT5ZaS5jICsgMTIsIGN0cik7CisgICAgfSBlbHNlIHsKKyAgICAgIGN0eC0+WWkuZFszXSA9IGN0cjsKKyAgICB9CisgICAgaW4gKz0gaTsKKyAgICBsZW4gLT0gaTsKKyNpZiBkZWZpbmVkKEdIQVNIKQorICAgIEdIQVNIKGN0eCwgb3V0LCBpKTsKKyAgICBvdXQgKz0gaTsKKyNlbHNlCisgICAgd2hpbGUgKGotLSkgeworICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsKKyAgICAgICAgY3R4LT5YaS5jW2ldIF49IG91dFtpXTsKKyAgICAgIH0KKyAgICAgIEdDTV9NVUwoY3R4LCBYaSk7CisgICAgICBvdXQgKz0gMTY7CisgICAgfQorI2VuZGlmCisgIH0KKyAgaWYgKGxlbikgeworICAgICgqY3R4LT5ibG9jaykoY3R4LT5ZaS5jLCBjdHgtPkVLaS5jLCBrZXkpOworICAgICsrY3RyOworICAgIGlmIChpc19lbmRpYW4ubGl0dGxlKSB7CisgICAgICBQVVRVMzIoY3R4LT5ZaS5jICsgMTIsIGN0cik7CisgICAgfSBlbHNlIHsKKyAgICAgIGN0eC0+WWkuZFszXSA9IGN0cjsKKyAgICB9CisgICAgd2hpbGUgKGxlbi0tKSB7CisgICAgICBjdHgtPlhpLmNbbl0gXj0gb3V0W25dID0gaW5bbl0gXiBjdHgtPkVLaS5jW25dOworICAgICAgKytuOworICAgIH0KKyAgfQorCisgIGN0eC0+bXJlcyA9IG47CisgIHJldHVybiAxOworfQorCitpbnQgQ1JZUFRPX2djbTEyOF9kZWNyeXB0X2N0cjMyKEdDTTEyOF9DT05URVhUICpjdHgsIGNvbnN0IHVpbnQ4X3QgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpvdXQsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0cjEyOF9mIHN0cmVhbSkgeworICBjb25zdCB1bmlvbiB7CisgICAgbG9uZyBvbmU7CisgICAgY2hhciBsaXR0bGU7CisgIH0gaXNfZW5kaWFuID0gezF9OworICB1bnNpZ25lZCBpbnQgbiwgY3RyOworICBzaXplX3QgaTsKKyAgdWludDY0X3QgbWxlbiA9IGN0eC0+bGVuLnVbMV07CisgIHZvaWQgKmtleSA9IGN0eC0+a2V5OworI2lmZGVmIEdDTV9GVU5DUkVGXzRCSVQKKyAgdm9pZCAoKmdjbV9nbXVsdF9wKSh1aW50NjRfdCBYaVsyXSwgY29uc3QgdTEyOCBIdGFibGVbMTZdKSA9IGN0eC0+Z211bHQ7CisjaWZkZWYgR0hBU0gKKyAgdm9pZCAoKmdjbV9naGFzaF9wKSh1aW50NjRfdCBYaVsyXSwgY29uc3QgdTEyOCBIdGFibGVbMTZdLCBjb25zdCB1aW50OF90ICppbnAsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbikgPSBjdHgtPmdoYXNoOworI2VuZGlmCisjZW5kaWYKKworICBtbGVuICs9IGxlbjsKKyAgaWYgKG1sZW4gPiAoKFU2NCgxKSA8PCAzNikgLSAzMikgfHwgKHNpemVvZihsZW4pID09IDggJiYgbWxlbiA8IGxlbikpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBjdHgtPmxlbi51WzFdID0gbWxlbjsKKworICBpZiAoY3R4LT5hcmVzKSB7CisgICAgLyogRmlyc3QgY2FsbCB0byBkZWNyeXB0IGZpbmFsaXplcyBHSEFTSChBQUQpICovCisgICAgR0NNX01VTChjdHgsIFhpKTsKKyAgICBjdHgtPmFyZXMgPSAwOworICB9CisKKyAgaWYgKGlzX2VuZGlhbi5saXR0bGUpIHsKKyAgICBjdHIgPSBHRVRVMzIoY3R4LT5ZaS5jICsgMTIpOworICB9IGVsc2UgeworICAgIGN0ciA9IGN0eC0+WWkuZFszXTsKKyAgfQorCisgIG4gPSBjdHgtPm1yZXM7CisgIGlmIChuKSB7CisgICAgd2hpbGUgKG4gJiYgbGVuKSB7CisgICAgICB1aW50OF90IGMgPSAqKGluKyspOworICAgICAgKihvdXQrKykgPSBjIF4gY3R4LT5FS2kuY1tuXTsKKyAgICAgIGN0eC0+WGkuY1tuXSBePSBjOworICAgICAgLS1sZW47CisgICAgICBuID0gKG4gKyAxKSAlIDE2OworICAgIH0KKyAgICBpZiAobiA9PSAwKSB7CisgICAgICBHQ01fTVVMKGN0eCwgWGkpOworICAgIH0gZWxzZSB7CisgICAgICBjdHgtPm1yZXMgPSBuOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisjaWYgZGVmaW5lZChHSEFTSCkKKyAgd2hpbGUgKGxlbiA+PSBHSEFTSF9DSFVOSykgeworICAgIEdIQVNIKGN0eCwgaW4sIEdIQVNIX0NIVU5LKTsKKyAgICAoKnN0cmVhbSkoaW4sIG91dCwgR0hBU0hfQ0hVTksgLyAxNiwga2V5LCBjdHgtPllpLmMpOworICAgIGN0ciArPSBHSEFTSF9DSFVOSyAvIDE2OworICAgIGlmIChpc19lbmRpYW4ubGl0dGxlKQorICAgICAgUFVUVTMyKGN0eC0+WWkuYyArIDEyLCBjdHIpOworICAgIGVsc2UKKyAgICAgIGN0eC0+WWkuZFszXSA9IGN0cjsKKyAgICBvdXQgKz0gR0hBU0hfQ0hVTks7CisgICAgaW4gKz0gR0hBU0hfQ0hVTks7CisgICAgbGVuIC09IEdIQVNIX0NIVU5LOworICB9CisjZW5kaWYKKyAgaWYgKChpID0gKGxlbiAmIChzaXplX3QpIC0gMTYpKSkgeworICAgIHNpemVfdCBqID0gaSAvIDE2OworCisjaWYgZGVmaW5lZChHSEFTSCkKKyAgICBHSEFTSChjdHgsIGluLCBpKTsKKyNlbHNlCisgICAgd2hpbGUgKGotLSkgeworICAgICAgc2l6ZV90IGs7CisgICAgICBmb3IgKGsgPSAwOyBrIDwgMTY7ICsraykKKyAgICAgICAgY3R4LT5YaS5jW2tdIF49IGluW2tdOworICAgICAgR0NNX01VTChjdHgsIFhpKTsKKyAgICAgIGluICs9IDE2OworICAgIH0KKyAgICBqID0gaSAvIDE2OworICAgIGluIC09IGk7CisjZW5kaWYKKyAgICAoKnN0cmVhbSkoaW4sIG91dCwgaiwga2V5LCBjdHgtPllpLmMpOworICAgIGN0ciArPSAodW5zaWduZWQgaW50KWo7CisgICAgaWYgKGlzX2VuZGlhbi5saXR0bGUpCisgICAgICBQVVRVMzIoY3R4LT5ZaS5jICsgMTIsIGN0cik7CisgICAgZWxzZQorICAgICAgY3R4LT5ZaS5kWzNdID0gY3RyOworICAgIG91dCArPSBpOworICAgIGluICs9IGk7CisgICAgbGVuIC09IGk7CisgIH0KKyAgaWYgKGxlbikgeworICAgICgqY3R4LT5ibG9jaykoY3R4LT5ZaS5jLCBjdHgtPkVLaS5jLCBrZXkpOworICAgICsrY3RyOworICAgIGlmIChpc19lbmRpYW4ubGl0dGxlKQorICAgICAgUFVUVTMyKGN0eC0+WWkuYyArIDEyLCBjdHIpOworICAgIGVsc2UKKyAgICAgIGN0eC0+WWkuZFszXSA9IGN0cjsKKyAgICB3aGlsZSAobGVuLS0pIHsKKyAgICAgIHVpbnQ4X3QgYyA9IGluW25dOworICAgICAgY3R4LT5YaS5jW25dIF49IGM7CisgICAgICBvdXRbbl0gPSBjIF4gY3R4LT5FS2kuY1tuXTsKKyAgICAgICsrbjsKKyAgICB9CisgIH0KKworICBjdHgtPm1yZXMgPSBuOworICByZXR1cm4gMTsKK30KKworaW50IENSWVBUT19nY20xMjhfZmluaXNoKEdDTTEyOF9DT05URVhUICpjdHgsIGNvbnN0IHVpbnQ4X3QgKnRhZywgc2l6ZV90IGxlbikgeworICBjb25zdCB1bmlvbiB7CisgICAgbG9uZyBvbmU7CisgICAgY2hhciBsaXR0bGU7CisgIH0gaXNfZW5kaWFuID0gezF9OworICB1aW50NjRfdCBhbGVuID0gY3R4LT5sZW4udVswXSA8PCAzOworICB1aW50NjRfdCBjbGVuID0gY3R4LT5sZW4udVsxXSA8PCAzOworI2lmZGVmIEdDTV9GVU5DUkVGXzRCSVQKKyAgdm9pZCAoKmdjbV9nbXVsdF9wKSh1aW50NjRfdCBYaVsyXSwgY29uc3QgdTEyOCBIdGFibGVbMTZdKSA9IGN0eC0+Z211bHQ7CisjZW5kaWYKKworICBpZiAoY3R4LT5tcmVzIHx8IGN0eC0+YXJlcykgeworICAgIEdDTV9NVUwoY3R4LCBYaSk7CisgIH0KKworICBpZiAoaXNfZW5kaWFuLmxpdHRsZSkgeworI2lmZGVmIEJTV0FQOAorICAgIGFsZW4gPSBCU1dBUDgoYWxlbik7CisgICAgY2xlbiA9IEJTV0FQOChjbGVuKTsKKyNlbHNlCisgICAgdWludDhfdCAqcCA9IGN0eC0+bGVuLmM7CisKKyAgICBjdHgtPmxlbi51WzBdID0gYWxlbjsKKyAgICBjdHgtPmxlbi51WzFdID0gY2xlbjsKKworICAgIGFsZW4gPSAodWludDY0X3QpR0VUVTMyKHApIDw8IDMyIHwgR0VUVTMyKHAgKyA0KTsKKyAgICBjbGVuID0gKHVpbnQ2NF90KUdFVFUzMihwICsgOCkgPDwgMzIgfCBHRVRVMzIocCArIDEyKTsKKyNlbmRpZgorICB9CisKKyAgY3R4LT5YaS51WzBdIF49IGFsZW47CisgIGN0eC0+WGkudVsxXSBePSBjbGVuOworICBHQ01fTVVMKGN0eCwgWGkpOworCisgIGN0eC0+WGkudVswXSBePSBjdHgtPkVLMC51WzBdOworICBjdHgtPlhpLnVbMV0gXj0gY3R4LT5FSzAudVsxXTsKKworICBpZiAodGFnICYmIGxlbiA8PSBzaXplb2YoY3R4LT5YaSkpIHsKKyAgICByZXR1cm4gQ1JZUFRPX21lbWNtcChjdHgtPlhpLmMsIHRhZywgbGVuKSA9PSAwOworICB9IGVsc2UgeworICAgIHJldHVybiAwOworICB9Cit9CisKK3ZvaWQgQ1JZUFRPX2djbTEyOF90YWcoR0NNMTI4X0NPTlRFWFQgKmN0eCwgdW5zaWduZWQgY2hhciAqdGFnLCBzaXplX3QgbGVuKSB7CisgIENSWVBUT19nY20xMjhfZmluaXNoKGN0eCwgTlVMTCwgMCk7CisgIG1lbWNweSh0YWcsIGN0eC0+WGkuYywgbGVuIDw9IHNpemVvZihjdHgtPlhpLmMpID8gbGVuIDogc2l6ZW9mKGN0eC0+WGkuYykpOworfQorCit2b2lkIENSWVBUT19nY20xMjhfcmVsZWFzZShHQ00xMjhfQ09OVEVYVCAqY3R4KSB7CisgIGlmIChjdHgpIHsKKyAgICBPUEVOU1NMX2NsZWFuc2UoY3R4LCBzaXplb2YoKmN0eCkpOworICAgIE9QRU5TU0xfZnJlZShjdHgpOworICB9Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vbW9kZXMvZ2NtX3Rlc3QuYyBiL2NyeXB0by9tb2Rlcy9nY21fdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNTJiODUKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vbW9kZXMvZ2NtX3Rlc3QuYwpAQCAtMCwwICsxLDQzMSBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYWVzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21vZGVzLmg+CisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisKK3N0cnVjdCB0ZXN0X2Nhc2UgeworICBjb25zdCBjaGFyICprZXk7CisgIGNvbnN0IGNoYXIgKnBsYWludGV4dDsKKyAgY29uc3QgY2hhciAqYWRkaXRpb25hbF9kYXRhOworICBjb25zdCBjaGFyICpub25jZTsKKyAgY29uc3QgY2hhciAqY2lwaGVydGV4dDsKKyAgY29uc3QgY2hhciAqdGFnOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0ZXN0X2Nhc2UgdGVzdF9jYXNlc1tdID0geworICB7CisgICAgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsCisgICAgTlVMTCwKKyAgICAiNThlMmZjY2VmYTdlMzA2MTM2N2YxZDU3YTRlNzQ1NWEiLAorICB9LAorICB7CisgICAgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwKKyAgICAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLAorICAgIE5VTEwsCisgICAgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsCisgICAgIjAzODhkYWNlNjBiNmEzOTJmMzI4YzJiOTcxYjJmZTc4IiwKKyAgICAiYWI2ZTQ3ZDQyY2VjMTNiZGY1M2E2N2IyMTI1N2JkZGYiLAorICB9LAorICB7CisgICAgImZlZmZlOTkyODY2NTczMWM2ZDZhOGY5NDY3MzA4MzA4IiwKKyAgICAiZDkzMTMyMjVmODg0MDZlNWE1NTkwOWM1YWZmNTI2OWE4NmE3YTk1MzE1MzRmN2RhMmU0YzMwM2Q4YTMxOGE3MjFjM2MwYzk1OTU2ODA5NTMyZmNmMGUyNDQ5YTZiNTI1YjE2YWVkZjVhYTBkZTY1N2JhNjM3YjM5MWFhZmQyNTUiLAorICAgIE5VTEwsCisgICAgImNhZmViYWJlZmFjZWRiYWRkZWNhZjg4OCIsCisgICAgIjQyODMxZWMyMjE3Nzc0MjQ0YjcyMjFiNzg0ZDBkNDljZTNhYTIxMmYyYzAyYTRlMDM1YzE3ZTIzMjlhY2ExMmUyMWQ1MTRiMjU0NjY5MzFjN2Q4ZjZhNWFhYzg0YWEwNTFiYTMwYjM5NmEwYWFjOTczZDU4ZTA5MTQ3M2Y1OTg1IiwKKyAgICAiNGQ1YzJhZjMyN2NkNjRhNjJjZjM1YWJkMmJhNmZhYjQiLAorICB9LAorICB7CisgICAgImZlZmZlOTkyODY2NTczMWM2ZDZhOGY5NDY3MzA4MzA4IiwKKyAgICAiZDkzMTMyMjVmODg0MDZlNWE1NTkwOWM1YWZmNTI2OWE4NmE3YTk1MzE1MzRmN2RhMmU0YzMwM2Q4YTMxOGE3MjFjM2MwYzk1OTU2ODA5NTMyZmNmMGUyNDQ5YTZiNTI1YjE2YWVkZjVhYTBkZTY1N2JhNjM3YjM5IiwKKyAgICAiZmVlZGZhY2VkZWFkYmVlZmZlZWRmYWNlZGVhZGJlZWZhYmFkZGFkMiIsCisgICAgImNhZmViYWJlZmFjZWRiYWRkZWNhZjg4OCIsCisgICAgIjQyODMxZWMyMjE3Nzc0MjQ0YjcyMjFiNzg0ZDBkNDljZTNhYTIxMmYyYzAyYTRlMDM1YzE3ZTIzMjlhY2ExMmUyMWQ1MTRiMjU0NjY5MzFjN2Q4ZjZhNWFhYzg0YWEwNTFiYTMwYjM5NmEwYWFjOTczZDU4ZTA5MSIsCisgICAgIjViYzk0ZmJjMzIyMWE1ZGI5NGZhZTk1YWU3MTIxYTQ3IiwKKyAgfSwKKyAgeworICAgICJmZWZmZTk5Mjg2NjU3MzFjNmQ2YThmOTQ2NzMwODMwOCIsCisgICAgImQ5MzEzMjI1Zjg4NDA2ZTVhNTU5MDljNWFmZjUyNjlhODZhN2E5NTMxNTM0ZjdkYTJlNGMzMDNkOGEzMThhNzIxYzNjMGM5NTk1NjgwOTUzMmZjZjBlMjQ0OWE2YjUyNWIxNmFlZGY1YWEwZGU2NTdiYTYzN2IzOSIsCisgICAgImZlZWRmYWNlZGVhZGJlZWZmZWVkZmFjZWRlYWRiZWVmYWJhZGRhZDIiLAorICAgICJjYWZlYmFiZWZhY2VkYmFkIiwKKyAgICAiNjEzNTNiNGMyODA2OTM0YTc3N2ZmNTFmYTIyYTQ3NTU2OTliMmE3MTRmY2RjNmY4Mzc2NmU1Zjk3YjZjNzQyMzczODA2OTAwZTQ5ZjI0YjIyYjA5NzU0NGQ0ODk2YjQyNDk4OWI1ZTFlYmFjMGYwN2MyM2Y0NTk4IiwKKyAgICAiMzYxMmQyZTc5ZTNiMDc4NTU2MWJlMTRhYWNhMmZjY2IiLAorICB9LAorICB7CisgICAgImZlZmZlOTkyODY2NTczMWM2ZDZhOGY5NDY3MzA4MzA4IiwKKyAgICAiZDkzMTMyMjVmODg0MDZlNWE1NTkwOWM1YWZmNTI2OWE4NmE3YTk1MzE1MzRmN2RhMmU0YzMwM2Q4YTMxOGE3MjFjM2MwYzk1OTU2ODA5NTMyZmNmMGUyNDQ5YTZiNTI1YjE2YWVkZjVhYTBkZTY1N2JhNjM3YjM5IiwKKyAgICAiZmVlZGZhY2VkZWFkYmVlZmZlZWRmYWNlZGVhZGJlZWZhYmFkZGFkMiIsCisgICAgIjkzMTMyMjVkZjg4NDA2ZTU1NTkwOWM1YWZmNTI2OWFhNmE3YTk1Mzg1MzRmN2RhMWU0YzMwM2QyYTMxOGE3MjhjM2MwYzk1MTU2ODA5NTM5ZmNmMGUyNDI5YTZiNTI1NDE2YWVkYmY1YTBkZTZhNTdhNjM3YjM5YiIsCisgICAgIjhjZTI0OTk4NjI1NjE1YjYwM2EwMzNhY2ExM2ZiODk0YmU5MTEyYTVjM2EyMTFhOGJhMjYyYTNjY2E3ZTJjYTcwMWU0YTlhNGZiYTQzYzkwY2NkY2IyODFkNDhjN2M2ZmQ2Mjg3NWQyYWNhNDE3MDM0YzM0YWVlNSIsCisgICAgIjYxOWNjNWFlZmZmZTBiZmE0NjJhZjQzYzE2OTlkMDUwIiwKKyAgfSwKKyAgeworICAgICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwKKyAgICBOVUxMLAorICAgICJjZDMzYjI4YWM3NzNmNzRiYTAwZWQxZjMxMjU3MjQzNSIsCisgIH0sCisgIHsKKyAgICAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwKKyAgICAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLAorICAgIE5VTEwsCisgICAgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsCisgICAgIjk4ZTcyNDdjMDdmMGZlNDExYzI2N2U0Mzg0YjBmNjAwIiwKKyAgICAiMmZmNThkODAwMzM5MjdhYjhlZjRkNDU4NzUxNGYwZmIiLAorICB9LAorICB7CisgICAgImZlZmZlOTkyODY2NTczMWM2ZDZhOGY5NDY3MzA4MzA4ZmVmZmU5OTI4NjY1NzMxYyIsCisgICAgImQ5MzEzMjI1Zjg4NDA2ZTVhNTU5MDljNWFmZjUyNjlhODZhN2E5NTMxNTM0ZjdkYTJlNGMzMDNkOGEzMThhNzIxYzNjMGM5NTk1NjgwOTUzMmZjZjBlMjQ0OWE2YjUyNWIxNmFlZGY1YWEwZGU2NTdiYTYzN2IzOTFhYWZkMjU1IiwKKyAgICBOVUxMLAorICAgICJjYWZlYmFiZWZhY2VkYmFkZGVjYWY4ODgiLAorICAgICIzOTgwY2EwYjNjMDBlODQxZWIwNmZhYzQ4NzJhMjc1Nzg1OWUxY2VhYTZlZmQ5ODQ2Mjg1OTNiNDBjYTFlMTljN2Q3NzNkMDBjMTQ0YzUyNWFjNjE5ZDE4Yzg0YTNmNDcxOGUyNDQ4YjJmZTMyNGQ5Y2NkYTI3MTBhY2FkZTI1NiIsCisgICAgIjk5MjRhN2M4NTg3MzM2YmZiMTE4MDI0ZGI4Njc0YTE0IiwKKyAgfSwKKyAgeworICAgICJmZWZmZTk5Mjg2NjU3MzFjNmQ2YThmOTQ2NzMwODMwOGZlZmZlOTkyODY2NTczMWMiLAorICAgICJkOTMxMzIyNWY4ODQwNmU1YTU1OTA5YzVhZmY1MjY5YTg2YTdhOTUzMTUzNGY3ZGEyZTRjMzAzZDhhMzE4YTcyMWMzYzBjOTU5NTY4MDk1MzJmY2YwZTI0NDlhNmI1MjViMTZhZWRmNWFhMGRlNjU3YmE2MzdiMzkiLAorICAgICJmZWVkZmFjZWRlYWRiZWVmZmVlZGZhY2VkZWFkYmVlZmFiYWRkYWQyIiwKKyAgICAiY2FmZWJhYmVmYWNlZGJhZGRlY2FmODg4IiwKKyAgICAiMzk4MGNhMGIzYzAwZTg0MWViMDZmYWM0ODcyYTI3NTc4NTllMWNlYWE2ZWZkOTg0NjI4NTkzYjQwY2ExZTE5YzdkNzczZDAwYzE0NGM1MjVhYzYxOWQxOGM4NGEzZjQ3MThlMjQ0OGIyZmUzMjRkOWNjZGEyNzEwIiwKKyAgICAiMjUxOTQ5OGU4MGYxNDc4ZjM3YmE1NWJkNmQyNzYxOGMiLAorICB9LAorICB7CisgICAgImZlZmZlOTkyODY2NTczMWM2ZDZhOGY5NDY3MzA4MzA4ZmVmZmU5OTI4NjY1NzMxYyIsCisgICAgImQ5MzEzMjI1Zjg4NDA2ZTVhNTU5MDljNWFmZjUyNjlhODZhN2E5NTMxNTM0ZjdkYTJlNGMzMDNkOGEzMThhNzIxYzNjMGM5NTk1NjgwOTUzMmZjZjBlMjQ0OWE2YjUyNWIxNmFlZGY1YWEwZGU2NTdiYTYzN2IzOSIsCisgICAgImZlZWRmYWNlZGVhZGJlZWZmZWVkZmFjZWRlYWRiZWVmYWJhZGRhZDIiLAorICAgICJjYWZlYmFiZWZhY2VkYmFkIiwKKyAgICAiMGYxMGY1OTlhZTE0YTE1NGVkMjRiMzZlMjUzMjRkYjhjNTY2NjMyZWYyYmJiMzRmODM0NzI4MGZjNDUwNzA1N2ZkZGMyOWRmOWE0NzFmNzVjNjY1NDFkNGQ0ZGFkMWM5ZTkzYTE5YTU4ZThiNDczZmEwZjA2MmY3IiwKKyAgICAiNjVkY2M1N2ZjZjYyM2EyNDA5NGZjY2E0MGQzNTMzZjgiLAorICB9LAorICB7CisgICAgImZlZmZlOTkyODY2NTczMWM2ZDZhOGY5NDY3MzA4MzA4ZmVmZmU5OTI4NjY1NzMxYyIsCisgICAgImQ5MzEzMjI1Zjg4NDA2ZTVhNTU5MDljNWFmZjUyNjlhODZhN2E5NTMxNTM0ZjdkYTJlNGMzMDNkOGEzMThhNzIxYzNjMGM5NTk1NjgwOTUzMmZjZjBlMjQ0OWE2YjUyNWIxNmFlZGY1YWEwZGU2NTdiYTYzN2IzOSIsCisgICAgImZlZWRmYWNlZGVhZGJlZWZmZWVkZmFjZWRlYWRiZWVmYWJhZGRhZDIiLAorICAgICJjYWZlYmFiZWZhY2VkYmFkIiwKKyAgICAiMGYxMGY1OTlhZTE0YTE1NGVkMjRiMzZlMjUzMjRkYjhjNTY2NjMyZWYyYmJiMzRmODM0NzI4MGZjNDUwNzA1N2ZkZGMyOWRmOWE0NzFmNzVjNjY1NDFkNGQ0ZGFkMWM5ZTkzYTE5YTU4ZThiNDczZmEwZjA2MmY3IiwKKyAgICAiNjVkY2M1N2ZjZjYyM2EyNDA5NGZjY2E0MGQzNTMzZjgiLAorICB9LAorICB7CisgICAgImZlZmZlOTkyODY2NTczMWM2ZDZhOGY5NDY3MzA4MzA4ZmVmZmU5OTI4NjY1NzMxYyIsCisgICAgImQ5MzEzMjI1Zjg4NDA2ZTVhNTU5MDljNWFmZjUyNjlhODZhN2E5NTMxNTM0ZjdkYTJlNGMzMDNkOGEzMThhNzIxYzNjMGM5NTk1NjgwOTUzMmZjZjBlMjQ0OWE2YjUyNWIxNmFlZGY1YWEwZGU2NTdiYTYzN2IzOSIsCisgICAgImZlZWRmYWNlZGVhZGJlZWZmZWVkZmFjZWRlYWRiZWVmYWJhZGRhZDIiLAorICAgICI5MzEzMjI1ZGY4ODQwNmU1NTU5MDljNWFmZjUyNjlhYTZhN2E5NTM4NTM0ZjdkYTFlNGMzMDNkMmEzMThhNzI4YzNjMGM5NTE1NjgwOTUzOWZjZjBlMjQyOWE2YjUyNTQxNmFlZGJmNWEwZGU2YTU3YTYzN2IzOWIiLAorICAgICJkMjdlODg2ODFjZTMyNDNjNDgzMDE2NWE4ZmRjZjlmZjFkZTlhMWQ4ZTZiNDQ3ZWY2ZWY3Yjc5ODI4NjY2ZTQ1ODFlNzkwMTJhZjM0ZGRkOWUyZjAzNzU4OWIyOTJkYjNlNjdjMDM2NzQ1ZmEyMmU3ZTliNzM3M2IiLAorICAgICJkY2Y1NjZmZjI5MWMyNWJiYjg1NjhmYzNkMzc2YTZkOSIsCisgIH0sCisgIHsKKyAgICAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLAorICAgIE5VTEwsCisgICAgIjUzMGY4YWZiYzc0NTM2YjlhOTYzYjRmMWM0Y2I3MzhiIiwKKyAgfSwKKyAgeworICAgICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwKKyAgICAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLAorICAgIE5VTEwsCisgICAgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsCisgICAgImNlYTc0MDNkNGQ2MDZiNmUwNzRlYzVkM2JhZjM5ZDE4IiwKKyAgICAiZDBkMWM4YTc5OTk5NmJmMDI2NWI5OGI1ZDQ4YWI5MTkiLAorICB9LAorICB7CisgICAgImZlZmZlOTkyODY2NTczMWM2ZDZhOGY5NDY3MzA4MzA4ZmVmZmU5OTI4NjY1NzMxYzZkNmE4Zjk0NjczMDgzMDgiLAorICAgICJkOTMxMzIyNWY4ODQwNmU1YTU1OTA5YzVhZmY1MjY5YTg2YTdhOTUzMTUzNGY3ZGEyZTRjMzAzZDhhMzE4YTcyMWMzYzBjOTU5NTY4MDk1MzJmY2YwZTI0NDlhNmI1MjViMTZhZWRmNWFhMGRlNjU3YmE2MzdiMzkxYWFmZDI1NSIsCisgICAgTlVMTCwKKyAgICAiY2FmZWJhYmVmYWNlZGJhZGRlY2FmODg4IiwKKyAgICAiNTIyZGMxZjA5OTU2N2QwN2Y0N2YzN2EzMmE4NDQyN2Q2NDNhOGNkY2JmZTVjMGM5NzU5OGEyYmQyNTU1ZDFhYThjYjA4ZTQ4NTkwZGJiM2RhN2IwOGIxMDU2ODI4ODM4YzVmNjFlNjM5M2JhN2EwYWJjYzlmNjYyODk4MDE1YWQiLAorICAgICJiMDk0ZGFjNWQ5MzQ3MWJkZWMxYTUwMjI3MGUzY2M2YyIsCisgIH0sCisgIHsKKyAgICAiZmVmZmU5OTI4NjY1NzMxYzZkNmE4Zjk0NjczMDgzMDhmZWZmZTk5Mjg2NjU3MzFjNmQ2YThmOTQ2NzMwODMwOCIsCisgICAgImQ5MzEzMjI1Zjg4NDA2ZTVhNTU5MDljNWFmZjUyNjlhODZhN2E5NTMxNTM0ZjdkYTJlNGMzMDNkOGEzMThhNzIxYzNjMGM5NTk1NjgwOTUzMmZjZjBlMjQ0OWE2YjUyNWIxNmFlZGY1YWEwZGU2NTdiYTYzN2IzOSIsCisgICAgImZlZWRmYWNlZGVhZGJlZWZmZWVkZmFjZWRlYWRiZWVmYWJhZGRhZDIiLAorICAgICJjYWZlYmFiZWZhY2VkYmFkZGVjYWY4ODgiLAorICAgICI1MjJkYzFmMDk5NTY3ZDA3ZjQ3ZjM3YTMyYTg0NDI3ZDY0M2E4Y2RjYmZlNWMwYzk3NTk4YTJiZDI1NTVkMWFhOGNiMDhlNDg1OTBkYmIzZGE3YjA4YjEwNTY4Mjg4MzhjNWY2MWU2MzkzYmE3YTBhYmNjOWY2NjIiLAorICAgICI3NmZjNmVjZTBmNGUxNzY4Y2RkZjg4NTNiYjJkNTUxYiIsCisgIH0sCisgIHsKKyAgICAiZmVmZmU5OTI4NjY1NzMxYzZkNmE4Zjk0NjczMDgzMDhmZWZmZTk5Mjg2NjU3MzFjNmQ2YThmOTQ2NzMwODMwOCIsCisgICAgImQ5MzEzMjI1Zjg4NDA2ZTVhNTU5MDljNWFmZjUyNjlhODZhN2E5NTMxNTM0ZjdkYTJlNGMzMDNkOGEzMThhNzIxYzNjMGM5NTk1NjgwOTUzMmZjZjBlMjQ0OWE2YjUyNWIxNmFlZGY1YWEwZGU2NTdiYTYzN2IzOSIsCisgICAgImZlZWRmYWNlZGVhZGJlZWZmZWVkZmFjZWRlYWRiZWVmYWJhZGRhZDIiLAorICAgICJjYWZlYmFiZWZhY2VkYmFkIiwKKyAgICAiYzM3NjJkZjFjYTc4N2QzMmFlNDdjMTNiZjE5ODQ0Y2JhZjFhZTE0ZDBiOTc2YWZhYzUyZmY3ZDc5YmJhOWRlMGZlYjU4MmQzMzkzNGE0ZjA5NTRjYzIzNjNiYzczZjc4NjJhYzQzMGU2NGFiZTQ5OWY0N2M5YjFmIiwKKyAgICAiM2EzMzdkYmY0NmE3OTJjNDVlNDU0OTEzZmUyZWE4ZjIiLAorICB9LAorICB7CisgICAgImZlZmZlOTkyODY2NTczMWM2ZDZhOGY5NDY3MzA4MzA4ZmVmZmU5OTI4NjY1NzMxYzZkNmE4Zjk0NjczMDgzMDgiLAorICAgICJkOTMxMzIyNWY4ODQwNmU1YTU1OTA5YzVhZmY1MjY5YTg2YTdhOTUzMTUzNGY3ZGEyZTRjMzAzZDhhMzE4YTcyMWMzYzBjOTU5NTY4MDk1MzJmY2YwZTI0NDlhNmI1MjViMTZhZWRmNWFhMGRlNjU3YmE2MzdiMzkiLAorICAgICJmZWVkZmFjZWRlYWRiZWVmZmVlZGZhY2VkZWFkYmVlZmFiYWRkYWQyIiwKKyAgICAiOTMxMzIyNWRmODg0MDZlNTU1OTA5YzVhZmY1MjY5YWE2YTdhOTUzODUzNGY3ZGExZTRjMzAzZDJhMzE4YTcyOGMzYzBjOTUxNTY4MDk1MzlmY2YwZTI0MjlhNmI1MjU0MTZhZWRiZjVhMGRlNmE1N2E2MzdiMzliIiwKKyAgICAiNWE4ZGVmMmYwYzllNTNmMWY3NWQ3ODUzNjU5ZTJhMjBlZWIyYjIyYWFmZGU2NDE5YTA1OGFiNGY2Zjc0NmJmNDBmYzBjM2I3ODBmMjQ0NDUyZGEzZWJmMWM1ZDgyY2RlYTI0MTg5OTcyMDBlZjgyZTQ0YWU3ZTNmIiwKKyAgICAiYTQ0YTgyNjZlZTFjOGViMGM4YjVkNGNmNWFlOWYxOWEiLAorICB9LAorICB7CisgICAgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwKKyAgICBOVUxMLAorICAgICJkOTMxMzIyNWY4ODQwNmU1YTU1OTA5YzVhZmY1MjY5YTg2YTdhOTUzMTUzNGY3ZGEyZTRjMzAzZDhhMzE4YTcyMWMzYzBjOTU5NTY4MDk1MzJmY2YwZTI0NDlhNmI1MjViMTZhZWRmNWFhMGRlNjU3YmE2MzdiMzkxYWFmZDI1NTUyMmRjMWYwOTk1NjdkMDdmNDdmMzdhMzJhODQ0MjdkNjQzYThjZGNiZmU1YzBjOTc1OThhMmJkMjU1NWQxYWE4Y2IwOGU0ODU5MGRiYjNkYTdiMDhiMTA1NjgyODgzOGM1ZjYxZTYzOTNiYTdhMGFiY2M5ZjY2Mjg5ODAxNWFkIiwKKyAgICAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwKKyAgICBOVUxMLAorICAgICI1ZmVhNzkzYTJkNmY5NzRkMzdlNjhlMGNiOGZmOTQ5MiIsCisgIH0sCisgIHsKKyAgICAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLAorICAgICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLAorICAgIE5VTEwsCisgICAgLyogVGhpcyBub25jZSByZXN1bHRzIGluIDB4ZmZmIGluIGNvdW50ZXIgTFNCLiAqLworICAgICJmZmZmZmZmZjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsCisgICAgIjU2YjMzNzNjYTllZjZlNGEyYjY0ZmUxZTlhMTdiNjE0MjVmMTBkNDdhNzVhNWZjZTEzZWZjNmJjNzg0YWYyNGY0MTQxYmRkNDhjZjdjNzcwODg3YWZkNTczY2NhNTQxOGE5YWVmZmNkN2M1Y2VkZGZjNmE3ODM5N2I5YTg1YjQ5OWRhNTU4MjU3MjY3Y2FhYjJhZDBiMjNjYTQ3NmE1M2NiMTdmYjQxYzRiOGI0NzVjYjRmM2Y3MTY1MDk0YzIyOWM5ZThjNGRjMGEyYTVmZjE5MDNlNTAxNTExMjIxMzc2YTFjZGI4MzY0YzUwNjFhMjBjYWU3NGJjNGFjZDc2Y2ViMGFiYzlmZDMyMTdlZjlmOGM5MGJlNDAyZGRmNmQ4Njk3ZjRmODgwZGZmMTViZmI3YTZiMjgyNDFlYzhmZTE4M2MyZDU5ZTNmOWRmZmY2NTNjNzEyNmYwYWNiOWU2NDIxMWY0MmJhZTEyYWY0NjJiMTA3MGJlZjFhYjVlMzYwNjg3MmNhMTBkZWUxNWIzMjQ5YjFhMWI5NThmMjMxMzRjNGJjY2I3ZDAzMjAwYmNlNDIwYTJmOGViNjZkY2YzNjQ0ZDE0MjNjMWI1Njk5MDAzYzEzZWNlZjRiZjM4YTNiNjBlZWRjMzQwMzNiYWMxOTAyNzgzZGM2ZDg5ZTJlNzc0MTg4YTQzOWM3ZWJjYzA2NzJkYmRhNGRkY2ZiMjc5NDYxM2IwYmU0MTMxNWVmNzc4NzA4YTcwZWU3ZDc1MTY1YyIsCisgICAgIjhiMzA3ZjZiMzMyODZkMGFiMDI2YTllZDNmZTFlODVmIiwKKyAgfSwKK307CisKK3N0YXRpYyBpbnQgZnJvbV9oZXgodWludDhfdCAqb3V0LCBjaGFyIGluKSB7CisgIGlmIChpbiA+PSAnMCcgJiYgaW4gPD0gJzknKSB7CisgICAgKm91dCA9IGluIC0gJzAnOworICAgIHJldHVybiAxOworICB9CisgIGlmIChpbiA+PSAnYScgJiYgaW4gPD0gJ2YnKSB7CisgICAgKm91dCA9IGluIC0gJ2EnICsgMTA7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKGluID49ICdBJyAmJiBpbiA8PSAnRicpIHsKKyAgICAqb3V0ID0gaW4gLSAnQScgKyAxMDsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9oZXgodWludDhfdCAqKm91dCwgc2l6ZV90ICpvdXRfbGVuLCBjb25zdCBjaGFyICppbiwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB0ZXN0X251bSwgY29uc3QgY2hhciAqZGVzY3JpcHRpb24pIHsKKyAgdWludDhfdCAqYnVmID0gTlVMTDsKKyAgc2l6ZV90IGk7CisKKyAgaWYgKGluID09IE5VTEwpIHsKKyAgICAqb3V0ID0gTlVMTDsKKyAgICAqb3V0X2xlbiA9IDA7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBzaXplX3QgbGVuID0gc3RybGVuKGluKTsKKyAgaWYgKGxlbiAmIDEpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiV1OiBPZGQtbGVuZ3RoICVzIGlucHV0LlxuIiwgdGVzdF9udW0sIGRlc2NyaXB0aW9uKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGJ1ZiA9IE9QRU5TU0xfbWFsbG9jKGxlbiAvIDIpOworICBpZiAoYnVmID09IE5VTEwpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiV1OiBtYWxsb2MgZmFpbHVyZS5cbiIsIHRlc3RfbnVtKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMikgeworICAgIHVpbnQ4X3QgdiwgdjI7CisgICAgaWYgKCFmcm9tX2hleCgmdiwgaW5baV0pIHx8CisgICAgICAgICFmcm9tX2hleCgmdjIsIGluW2krMV0pKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiV1OiBpbnZhbGlkIGhleCBkaWdpdCBpbiAlcyBhcm91bmQgb2Zmc2V0ICV1LlxuIiwKKyAgICAgICAgICAgICAgdGVzdF9udW0sIGRlc2NyaXB0aW9uLCAodW5zaWduZWQpaSk7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgYnVmW2kvMl0gPSAodiA8PCA0KSB8IHYyOworICB9CisKKyAgKm91dCA9IGJ1ZjsKKyAgKm91dF9sZW4gPSBsZW4vMjsKKyAgcmV0dXJuIDE7CisKK2VycjoKKyAgaWYgKGJ1ZikgeworICAgIE9QRU5TU0xfZnJlZShidWYpOworICB9CisgIHJldHVybiAwOworfQorCit2b2lkIGhleGR1bXAoY29uc3QgY2hhciAqbXNnLCBjb25zdCB2b2lkICppbiwgc2l6ZV90IGxlbikgeworICBjb25zdCB1aW50OF90ICpkYXRhID0gaW47CisgIHNpemVfdCBpOworCisgIGZwcmludGYoc3RkZXJyLCAiJXM6ICIsIG1zZyk7CisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgIGZwcmludGYoc3RkZXJyLCAiJTAyeCIsIGRhdGFbaV0pOworICB9CisgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKK30KKworc3RhdGljIGludCBydW5fdGVzdF9jYXNlKHVuc2lnbmVkIHRlc3RfbnVtLCBjb25zdCBzdHJ1Y3QgdGVzdF9jYXNlICp0ZXN0KSB7CisgIHNpemVfdCBrZXlfbGVuLCBwbGFpbnRleHRfbGVuLCBhZGRpdGlvbmFsX2RhdGFfbGVuLCBub25jZV9sZW4sIGNpcGhlcnRleHRfbGVuLAorICAgICAgdGFnX2xlbjsKKyAgdWludDhfdCAqa2V5ID0gTlVMTCwgKnBsYWludGV4dCA9IE5VTEwsICphZGRpdGlvbmFsX2RhdGEgPSBOVUxMLAorICAgICAgICAgICpub25jZSA9IE5VTEwsICpjaXBoZXJ0ZXh0ID0gTlVMTCwgKnRhZyA9IE5VTEwsICpvdXQgPSBOVUxMOworICBpbnQgcmV0ID0gMDsKKyAgQUVTX0tFWSBhZXNfa2V5OworICBHQ00xMjhfQ09OVEVYVCBjdHg7CisKKyAgaWYgKCFkZWNvZGVfaGV4KCZrZXksICZrZXlfbGVuLCB0ZXN0LT5rZXksIHRlc3RfbnVtLCAia2V5IikgfHwKKyAgICAgICFkZWNvZGVfaGV4KCZwbGFpbnRleHQsICZwbGFpbnRleHRfbGVuLCB0ZXN0LT5wbGFpbnRleHQsIHRlc3RfbnVtLAorICAgICAgICAgICAgICAgICAgInBsYWludGV4dCIpIHx8CisgICAgICAhZGVjb2RlX2hleCgmYWRkaXRpb25hbF9kYXRhLCAmYWRkaXRpb25hbF9kYXRhX2xlbiwgdGVzdC0+YWRkaXRpb25hbF9kYXRhLAorICAgICAgICAgICAgICAgICAgdGVzdF9udW0sICJhZGRpdGlvbmFsX2RhdGEiKSB8fAorICAgICAgIWRlY29kZV9oZXgoJm5vbmNlLCAmbm9uY2VfbGVuLCB0ZXN0LT5ub25jZSwgdGVzdF9udW0sICJub25jZSIpIHx8CisgICAgICAhZGVjb2RlX2hleCgmY2lwaGVydGV4dCwgJmNpcGhlcnRleHRfbGVuLCB0ZXN0LT5jaXBoZXJ0ZXh0LCB0ZXN0X251bSwKKyAgICAgICAgICAgICAgICAgICJjaXBoZXJ0ZXh0IikgfHwKKyAgICAgICFkZWNvZGVfaGV4KCZ0YWcsICZ0YWdfbGVuLCB0ZXN0LT50YWcsIHRlc3RfbnVtLCAidGFnIikpIHsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIGlmIChwbGFpbnRleHRfbGVuICE9IGNpcGhlcnRleHRfbGVuKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIldTogcGxhaW50ZXh0IGFuZCBjaXBoZXJ0ZXh0IGhhdmUgZGlmZmVyaW5nIGxlbmd0aHMuXG4iLAorICAgICAgICAgICAgdGVzdF9udW0pOworICAgIGdvdG8gb3V0OworICB9CisKKyAgaWYgKGtleV9sZW4gIT0gMTYgJiYga2V5X2xlbiAhPSAyNCAmJiBrZXlfbGVuICE9IDMyKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIldTogYmFkIGtleSBsZW5ndGguXG4iLCB0ZXN0X251bSk7CisgICAgZ290byBvdXQ7CisgIH0KKworICBpZiAodGFnX2xlbiAhPSAxNikgeworICAgIGZwcmludGYoc3RkZXJyLCAiJXU6IGJhZCB0YWcgbGVuZ3RoLlxuIiwgdGVzdF9udW0pOworICAgIGdvdG8gb3V0OworICB9CisKKyAgb3V0ID0gT1BFTlNTTF9tYWxsb2MocGxhaW50ZXh0X2xlbik7CisgIGlmIChBRVNfc2V0X2VuY3J5cHRfa2V5KGtleSwga2V5X2xlbio4LCAmYWVzX2tleSkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiV1OiBBRVNfc2V0X2VuY3J5cHRfa2V5IGZhaWxlZC5cbiIsIHRlc3RfbnVtKTsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIENSWVBUT19nY20xMjhfaW5pdCgmY3R4LCAmYWVzX2tleSwgKGJsb2NrMTI4X2YpIEFFU19lbmNyeXB0KTsKKyAgQ1JZUFRPX2djbTEyOF9zZXRpdigmY3R4LCBub25jZSwgbm9uY2VfbGVuKTsKKyAgbWVtc2V0KG91dCwgMCwgcGxhaW50ZXh0X2xlbik7CisgIGlmIChhZGRpdGlvbmFsX2RhdGEpIHsKKyAgICBDUllQVE9fZ2NtMTI4X2FhZCgmY3R4LCBhZGRpdGlvbmFsX2RhdGEsIGFkZGl0aW9uYWxfZGF0YV9sZW4pOworICB9CisgIGlmIChwbGFpbnRleHQpIHsKKyAgICBDUllQVE9fZ2NtMTI4X2VuY3J5cHQoJmN0eCwgcGxhaW50ZXh0LCBvdXQsIHBsYWludGV4dF9sZW4pOworICB9CisgIGlmICghQ1JZUFRPX2djbTEyOF9maW5pc2goJmN0eCwgdGFnLCB0YWdfbGVuKSB8fAorICAgICAgKGNpcGhlcnRleHQgJiYgbWVtY21wKG91dCwgY2lwaGVydGV4dCwgcGxhaW50ZXh0X2xlbikgIT0gMCkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiV1OiBlbmNyeXB0IGZhaWxlZC5cbiIsIHRlc3RfbnVtKTsKKyAgICBoZXhkdW1wKCJnb3QgIiwgb3V0LCBwbGFpbnRleHRfbGVuKTsKKyAgICBoZXhkdW1wKCJ3YW50IiwgY2lwaGVydGV4dCwgcGxhaW50ZXh0X2xlbik7CisgICAgZ290byBvdXQ7CisgIH0KKworICBDUllQVE9fZ2NtMTI4X3NldGl2KCZjdHgsIG5vbmNlLCBub25jZV9sZW4pOworICBtZW1zZXQob3V0LCAwLCBwbGFpbnRleHRfbGVuKTsKKyAgaWYgKGFkZGl0aW9uYWxfZGF0YSkgeworICAgIENSWVBUT19nY20xMjhfYWFkKCZjdHgsIGFkZGl0aW9uYWxfZGF0YSwgYWRkaXRpb25hbF9kYXRhX2xlbik7CisgIH0KKyAgaWYgKGNpcGhlcnRleHQpIHsKKyAgICBDUllQVE9fZ2NtMTI4X2RlY3J5cHQoJmN0eCwgY2lwaGVydGV4dCwgb3V0LCBwbGFpbnRleHRfbGVuKTsKKyAgfQorICBpZiAoIUNSWVBUT19nY20xMjhfZmluaXNoKCZjdHgsIHRhZywgdGFnX2xlbikpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiV1OiBkZWNyeXB0IGZhaWxlZC5cbiIsIHRlc3RfbnVtKTsKKyAgICBnb3RvIG91dDsKKyAgfQorICBpZiAocGxhaW50ZXh0ICYmIG1lbWNtcChvdXQsIHBsYWludGV4dCwgcGxhaW50ZXh0X2xlbikpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiV1OiBwbGFpbnRleHQgZG9lc24ndCBtYXRjaC5cbiIsIHRlc3RfbnVtKTsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIHJldCA9IDE7CisKK291dDoKKyAgaWYgKGtleSkgeworICAgIE9QRU5TU0xfZnJlZShrZXkpOworICB9CisgIGlmIChwbGFpbnRleHQpIHsKKyAgICBPUEVOU1NMX2ZyZWUocGxhaW50ZXh0KTsKKyAgfQorICBpZiAoYWRkaXRpb25hbF9kYXRhKSB7CisgICAgT1BFTlNTTF9mcmVlKGFkZGl0aW9uYWxfZGF0YSk7CisgIH0KKyAgaWYgKG5vbmNlKSB7CisgICAgT1BFTlNTTF9mcmVlKG5vbmNlKTsKKyAgfQorICBpZiAoY2lwaGVydGV4dCkgeworICAgIE9QRU5TU0xfZnJlZShjaXBoZXJ0ZXh0KTsKKyAgfQorICBpZiAodGFnKSB7CisgICAgT1BFTlNTTF9mcmVlKHRhZyk7CisgIH0KKyAgaWYgKG91dCkgeworICAgIE9QRU5TU0xfZnJlZShvdXQpOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK2ludCBtYWluKCkgeworICBpbnQgcmV0ID0gMDsKKyAgdW5zaWduZWQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHRlc3RfY2FzZXMpIC8gc2l6ZW9mKHN0cnVjdCB0ZXN0X2Nhc2UpOyBpKyspIHsKKyAgICBpZiAoIXJ1bl90ZXN0X2Nhc2UoaSwgJnRlc3RfY2FzZXNbaV0pKSB7CisgICAgICByZXQgPSAxOworICAgIH0KKyAgfQorCisgIGlmIChyZXQgPT0gMCkgeworICAgIHByaW50ZigiUEFTU1xuIik7CisgIH0KKworICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL21vZGVzL2ludGVybmFsLmggYi9jcnlwdG8vbW9kZXMvaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmEwZWM2Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL21vZGVzL2ludGVybmFsLmgKQEAgLTAsMCArMSwyMDEgQEAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworI2lmbmRlZiBPUEVOU1NMX0hFQURFUl9NT0RFU19JTlRFUk5BTF9ICisjZGVmaW5lIE9QRU5TU0xfSEVBREVSX01PREVTX0lOVEVSTkFMX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvYmFzZS5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworI2RlZmluZSBhc20gX19hc21fXworCisjZGVmaW5lIFNUUklDVF9BTElHTk1FTlQgMQorI2lmIGRlZmluZWQoT1BFTlNTTF9YODZfNjQpIHx8IGRlZmluZWQoT1BFTlNTTF9YODYpIHx8IGRlZmluZWQoT1BFTlNTTF9BQVJDSDY0KQorI3VuZGVmIFNUUklDVF9BTElHTk1FTlQKKyNkZWZpbmUgU1RSSUNUX0FMSUdOTUVOVCAwCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFBFREFOVElDKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX0FTTSkKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA+PSAyCisjaWYgZGVmaW5lZChPUEVOU1NMX1g4Nl82NCkKKyNkZWZpbmUgQlNXQVA4KHgpICAgICAgICAgICAgICAgICBcCisgICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQ2NF90IHJldCA9ICh4KTsgICAgICAgICAgIFwKKyAgICBhc20oImJzd2FwcSAlMCIgOiAiK3IiKHJldCkpOyBcCisgICAgcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9KQorI2RlZmluZSBCU1dBUDQoeCkgICAgICAgICAgICAgICAgIFwKKyAgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDMyX3QgcmV0ID0gKHgpOyAgICAgICAgICAgXAorICAgIGFzbSgiYnN3YXBsICUwIiA6ICIrciIocmV0KSk7IFwKKyAgICByZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0pCisjZWxpZiBkZWZpbmVkKE9QRU5TU0xfWDg2KQorI2RlZmluZSBCU1dBUDgoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQzMl90IGxvID0gKHVpbnQ2NF90KSh4KSA+PiAzMiwgaGkgPSAoeCk7ICAgICAgXAorICAgIGFzbSgiYnN3YXBsICUwOyBic3dhcGwgJTEiIDogIityIihoaSksICIrciIobG8pKTsgXAorICAgICh1aW50NjRfdCkgaGkgPDwgMzIgfCBsbzsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9KQorI2RlZmluZSBCU1dBUDQoeCkgICAgICAgICAgICAgICAgIFwKKyAgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDMyX3QgcmV0ID0gKHgpOyAgICAgICAgICAgXAorICAgIGFzbSgiYnN3YXBsICUwIiA6ICIrciIocmV0KSk7IFwKKyAgICByZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0pCisjZWxpZiBkZWZpbmVkKE9QRU5TU0xfQUFSQ0g2NCkKKyNkZWZpbmUgQlNXQVA4KHgpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQ2NF90IHJldDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc20oInJldiAlMCwlMSIgOiAiPXIiKHJldCkgOiAiciIoeCkpOyBcCisgICAgcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9KQorI2RlZmluZSBCU1dBUDQoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQzMl90IHJldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzbSgicmV2ICV3MCwldzEiIDogIj1yIihyZXQpIDogInIiKHgpKTsgXAorICAgIHJldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9KQorI2VsaWYgZGVmaW5lZChPUEVOU1NMX0FSTSkgJiYgIWRlZmluZWQoU1RSSUNUX0FMSUdOTUVOVCkKKyNkZWZpbmUgQlNXQVA4KHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MzJfdCBsbyA9ICh1aW50NjRfdCkoeCkgPj4gMzIsIGhpID0gKHgpOyAgICAgIFwKKyAgICBhc20oInJldiAlMCwlMDsgcmV2ICUxLCUxIiA6ICIrciIoaGkpLCAiK3IiKGxvKSk7IFwKKyAgICAodWludDY0X3QpIGhpIDw8IDMyIHwgbG87ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSkKKyNkZWZpbmUgQlNXQVA0KHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQzMl90IHJldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc20oInJldiAlMCwlMSIgOiAiPXIiKHJldCkgOiAiciIoKHVpbnQzMl90KSh4KSkpOyBcCisgICAgcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9KQorI2VuZGlmCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorI2lmIF9NU0NfVkVSID49IDEzMDAKKyNwcmFnbWEgaW50cmluc2ljKF9ieXRlc3dhcF91aW50NjQsIF9ieXRlc3dhcF91bG9uZykKKyNkZWZpbmUgQlNXQVA4KHgpIF9ieXRlc3dhcF91aW50NjQoKHVpbnQ2NF90KSh4KSkKKyNkZWZpbmUgQlNXQVA0KHgpIF9ieXRlc3dhcF91bG9uZygodWludDMyX3QpKHgpKQorI2VsaWYgZGVmaW5lZChPUEVOU1NMX1g4NikKK19faW5saW5lIHVpbnQzMl90IF9ic3dhcDQodWludDMyX3QgdmFsKSB7CisgIF9hc20gbW92IGVheCwgdmFsCisgIF9hc20gYnN3YXAgZWF4Cit9CisjZGVmaW5lIEJTV0FQNCh4KSBfYnN3YXA0KHgpCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJTV0FQNCkgJiYgIWRlZmluZWQoU1RSSUNUX0FMSUdOTUVOVCkKKyNkZWZpbmUgR0VUVTMyKHApIEJTV0FQNCgqKGNvbnN0IHVpbnQzMl90ICopKHApKQorI2RlZmluZSBQVVRVMzIocCwgdikgKih1aW50MzJfdCAqKShwKSA9IEJTV0FQNCh2KQorI2Vsc2UKKyNkZWZpbmUgR0VUVTMyKHApIFwKKyAgKCh1aW50MzJfdCkocClbMF0gPDwgMjQgfCAodWludDMyX3QpKHApWzFdIDw8IDE2IHwgKHVpbnQzMl90KShwKVsyXSA8PCA4IHwgKHVpbnQzMl90KShwKVszXSkKKyNkZWZpbmUgUFVUVTMyKHAsIHYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgocClbMF0gPSAodWludDhfdCkoKHYpID4+IDI0KSwgKHApWzFdID0gKHVpbnQ4X3QpKCh2KSA+PiAxNiksIFwKKyAgIChwKVsyXSA9ICh1aW50OF90KSgodikgPj4gOCksIChwKVszXSA9ICh1aW50OF90KSh2KSkKKyNlbmRpZgorCisKKy8qIEdDTSBkZWZpbml0aW9ucyAqLwordHlwZWRlZiBzdHJ1Y3QgeyB1aW50NjRfdCBoaSxsbzsgfSB1MTI4OworCitzdHJ1Y3QgZ2NtMTI4X2NvbnRleHQgeworICAvKiBGb2xsb3dpbmcgNiBuYW1lcyBmb2xsb3cgbmFtZXMgaW4gR0NNIHNwZWNpZmljYXRpb24gKi8KKyAgdW5pb24geworICAgIHVpbnQ2NF90IHVbMl07CisgICAgdWludDMyX3QgZFs0XTsKKyAgICB1aW50OF90IGNbMTZdOworICAgIHNpemVfdCB0WzE2IC8gc2l6ZW9mKHNpemVfdCldOworICB9IFlpLCBFS2ksIEVLMCwgbGVuLCBYaSwgSDsKKworICAvKiBSZWxhdGl2ZSBwb3NpdGlvbiBvZiBYaSwgSCBhbmQgcHJlLWNvbXB1dGVkIEh0YWJsZSBpcyB1c2VkIGluIHNvbWUKKyAgICogYXNzZW1ibGVyIG1vZHVsZXMsIGkuZS4gZG9uJ3QgY2hhbmdlIHRoZSBvcmRlciEgKi8KKyAgdTEyOCBIdGFibGVbMTZdOworICB2b2lkICgqZ211bHQpKHVpbnQ2NF90IFhpWzJdLCBjb25zdCB1MTI4IEh0YWJsZVsxNl0pOworICB2b2lkICgqZ2hhc2gpKHVpbnQ2NF90IFhpWzJdLCBjb25zdCB1MTI4IEh0YWJsZVsxNl0sIGNvbnN0IHVpbnQ4X3QgKmlucCwKKyAgICAgICAgICAgICAgICBzaXplX3QgbGVuKTsKKworICB1bnNpZ25lZCBpbnQgbXJlcywgYXJlczsKKyAgYmxvY2sxMjhfZiBibG9jazsKKyAgdm9pZCAqa2V5OworfTsKKworc3RydWN0IHh0czEyOF9jb250ZXh0IHsKKyAgdm9pZCAqa2V5MSwgKmtleTI7CisgIGJsb2NrMTI4X2YgYmxvY2sxLCBibG9jazI7Cit9OworCitzdHJ1Y3QgY2NtMTI4X2NvbnRleHQgeworICB1bmlvbiB7CisgICAgdWludDY0X3QgdVsyXTsKKyAgICB1aW50OF90IGNbMTZdOworICB9IG5vbmNlLCBjbWFjOworICB1aW50NjRfdCBibG9ja3M7CisgIGJsb2NrMTI4X2YgYmxvY2s7CisgIHZvaWQgKmtleTsKK307CisKKyNpZiAoZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjY0KSkgJiYgIWRlZmluZWQoX19NSU5HVzMyX18pCisjZGVmaW5lIFU2NChDKSBDIyNVSTY0CisjZWxpZiBkZWZpbmVkKF9fYXJjaDY0X18pCisjZGVmaW5lIFU2NChDKSBDIyNVTAorI2Vsc2UKKyNkZWZpbmUgVTY0KEMpIEMjI1VMTAorI2VuZGlmCisKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9IC8qIGV4dGVybiBDICovCisjZW5kaWYKKworI2VuZGlmIC8qIE9QRU5TU0xfSEVBREVSX01PREVTX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2NyeXB0by9tb2Rlcy9tb2Rlcy5oIGIvY3J5cHRvL21vZGVzL21vZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNhMTFiYQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9tb2Rlcy9tb2Rlcy5oCkBAIC0wLDAgKzEsMjE3IEBACisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyNpZm5kZWYgT1BFTlNTTF9IRUFERVJfTU9ERVNfSAorI2RlZmluZSBPUEVOU1NMX0hFQURFUl9NT0RFU19ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jhc2UuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIG1vZGVzLmggY29udGFpbnMgZnVuY3Rpb25zIHRoYXQgaW1wbGVtZW50IHZhcmlvdXMgYmxvY2stY2lwaGVyIG1vZGVzLiAqLworCisKKy8qIGJsb2NrMTI4X2YgaXMgdGhlIHR5cGUgb2YgYSAxMjgtYml0LCBibG9jayBjaXBoZXIuICovCit0eXBlZGVmIHZvaWQgKCpibG9jazEyOF9mKShjb25zdCB1aW50OF90IGluWzE2XSwgdWludDhfdCBvdXRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqa2V5KTsKKworCisvKiBDVFIuICovCisKKy8qIGN0cjEyOF9mIGlzIHRoZSB0eXBlIG9mIGEgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBDVFItbW9kZSBlbmNyeXB0aW9uLiAqLwordHlwZWRlZiB2b2lkICgqY3RyMTI4X2YpKGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50OF90ICpvdXQsIHNpemVfdCBibG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqa2V5LCBjb25zdCB1aW50OF90IGl2ZWNbMTZdKTsKKworLyogQ1JZUFRPX2N0cjEyOF9lbmNyeXB0IGVuY3J5cHRzIChvciBkZWNyeXB0cywgaXQncyB0aGUgc2FtZSBpbiBDVFIgbW9kZSkKKyAqIHxsZW58IGJ5dGVzIGZyb20gfGlufCB0byB8b3V0fCB1c2luZyB8YmxvY2t8IGluIGNvdW50ZXIgbW9kZS4gVGhlcmUncyBubworICogcmVxdWlyZW1lbnQgdGhhdCB8bGVufCBiZSBhIG11bHRpcGxlIG9mIGFueSB2YWx1ZSBhbmQgYW55IHBhcnRpYWwgYmxvY2tzIGFyZQorICogc3RvcmVkIGluIHxlY291bnRfYnVmfCBhbmQgfCpudW18LCB3aGljaCBtdXN0IGJlIHplcm9lZCBiZWZvcmUgdGhlIGluaXRpYWwKKyAqIGNhbGwuIFRoZSBjb3VudGVyIGlzIGEgMTI4LWJpdCwgYmlnLWVuZGlhbiB2YWx1ZSBpbiB8aXZlY3wgYW5kIGlzCisgKiBpbmNyZW1lbnRlZCBieSB0aGlzIGZ1bmN0aW9uLiAqLwordm9pZCBDUllQVE9fY3RyMTI4X2VuY3J5cHQoY29uc3QgdWludDhfdCAqaW4sIHVpbnQ4X3QgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4sIGNvbnN0IHZvaWQgKmtleSwgdWludDhfdCBpdmVjWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZWNvdW50X2J1ZlsxNl0sIHVuc2lnbmVkIGludCAqbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sxMjhfZiBibG9jayk7CisKKy8qIENSWVBUT19jdHIxMjhfZW5jcnlwdF9jdHIzMiBhY3RzIGxpa2UgfENSWVBUT19jdHIxMjhfZW5jcnlwdHwgYnV0IHRha2VzCisgKiB8Y3RyfCwgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIENUUiBtb2RlIGJ1dCBvbmx5IGRlYWxzIHdpdGggdGhlIGxvd2VyIDMyCisgKiBiaXRzIG9mIHRoZSBjb3VudGVyLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHxjdHJ8IGNhbiBiZSBhbiBvcHRpbWlzZWQKKyAqIGZ1bmN0aW9uLiAqLwordm9pZCBDUllQVE9fY3RyMTI4X2VuY3J5cHRfY3RyMzIoY29uc3QgdWludDhfdCAqaW4sIHVpbnQ4X3QgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4sIGNvbnN0IHZvaWQgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaXZlY1sxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGVjb3VudF9idWZbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW0sIGN0cjEyOF9mIGN0cik7CisKKworLyogR0NNLiAqLworCit0eXBlZGVmIHN0cnVjdCBnY20xMjhfY29udGV4dCBHQ00xMjhfQ09OVEVYVDsKKworLyogQ1JZUFRPX2djbTEyOF9uZXcgYWxsb2NhdGVzIGEgZnJlc2ggfEdDTTEyOF9DT05URVhUfCBhbmQgY2FsbHMKKyAqIHxDUllQVE9fZ2NtMTI4X2luaXR8LiBJdCByZXR1cm5zIHRoZSBuZXcgY29udGV4dCwgb3IgTlVMTCBvbiBlcnJvci4gKi8KK0dDTTEyOF9DT05URVhUICpDUllQVE9fZ2NtMTI4X25ldyh2b2lkICprZXksIGJsb2NrMTI4X2YgYmxvY2spOworCisvKiBDUllQVE9fZ2NtMTI4X2luaXQgaW5pdGlhbGlzZXMgfGN0eHwgdG8gdXNlIHxibG9ja3wgKHR5cGljYWxseSBBRVMpIHdpdGggdGhlCisgKiBnaXZlbiBrZXkuICovCit2b2lkIENSWVBUT19nY20xMjhfaW5pdChHQ00xMjhfQ09OVEVYVCAqY3R4LCB2b2lkICprZXksIGJsb2NrMTI4X2YgYmxvY2spOworCisvKiBDUllQVE9fZ2NtMTI4X3NldGl2IHNldHMgdGhlIElWIChub25jZSkgZm9yIHxjdHh8LiAqLwordm9pZCBDUllQVE9fZ2NtMTI4X3NldGl2KEdDTTEyOF9DT05URVhUICpjdHgsIGNvbnN0IHVpbnQ4X3QgKml2LCBzaXplX3QgbGVuKTsKKworLyogQ1JZUFRPX2djbTEyOF9hYWQgc2V0cyB0aGUgYXV0aGVudGljYXRlZCBkYXRhIGZvciBhbiBpbnN0YW5jZSBvZiBHQ00uIFRoaXMKKyAqIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbmQgZGF0YSBpcyBlbmNyeXB0ZWQuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kCisgKiB6ZXJvIG90aGVyd2lzZS4gKi8KK2ludCBDUllQVE9fZ2NtMTI4X2FhZChHQ00xMjhfQ09OVEVYVCAqY3R4LCBjb25zdCB1aW50OF90ICphYWQsIHNpemVfdCBsZW4pOworCisvKiBDUllQVE9fZ2NtMTI4X2VuY3J5cHQgZW5jcnlwdHMgfGxlbnwgYnl0ZXMgZnJvbSB8aW58IHRvIHxvdXR8LiBJdCByZXR1cm5zCisgKiBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvdGhlcndpc2UuICovCitpbnQgQ1JZUFRPX2djbTEyOF9lbmNyeXB0KEdDTTEyOF9DT05URVhUICpjdHgsIGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50OF90ICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4pOworCisvKiBDUllQVE9fZ2NtMTI4X2RlY3J5cHQgZGVjcnlwdHMgfGxlbnwgYnl0ZXMgZnJvbSB8aW58IHRvIHxvdXR8LiBJdCByZXR1cm5zCisgKiBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvdGhlcndpc2UuICovCitpbnQgQ1JZUFRPX2djbTEyOF9kZWNyeXB0KEdDTTEyOF9DT05URVhUICpjdHgsIGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50OF90ICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4pOworCisvKiBDUllQVE9fZ2NtMTI4X2VuY3J5cHRfY3RyMzIgZW5jcnlwdHMgfGxlbnwgYnl0ZXMgZnJvbSB8aW58IHRvIHxvdXR8IHVzaW5nIGEKKyAqIENUUiBmdW5jdGlvbiB0aGF0IG9ubHkgaGFuZGxlcyB0aGUgYm90dG9tIDMyIGJpdHMgb2YgdGhlIG5vbmNlLCBsaWtlCisgKiB8Q1JZUFRPX2N0cjEyOF9lbmNyeXB0X2N0cjMyfC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybworICogb3RoZXJ3aXNlLiAqLworaW50IENSWVBUT19nY20xMjhfZW5jcnlwdF9jdHIzMihHQ00xMjhfQ09OVEVYVCAqY3R4LCBjb25zdCB1aW50OF90ICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqb3V0LCBzaXplX3QgbGVuLCBjdHIxMjhfZiBzdHJlYW0pOworCisvKiBDUllQVE9fZ2NtMTI4X2RlY3J5cHRfY3RyMzIgZGVjcnlwdHMgfGxlbnwgYnl0ZXMgZnJvbSB8aW58IHRvIHxvdXR8IHVzaW5nIGEKKyAqIENUUiBmdW5jdGlvbiB0aGF0IG9ubHkgaGFuZGxlcyB0aGUgYm90dG9tIDMyIGJpdHMgb2YgdGhlIG5vbmNlLCBsaWtlCisgKiB8Q1JZUFRPX2N0cjEyOF9lbmNyeXB0X2N0cjMyfC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybworICogb3RoZXJ3aXNlLiAqLworaW50IENSWVBUT19nY20xMjhfZGVjcnlwdF9jdHIzMihHQ00xMjhfQ09OVEVYVCAqY3R4LCBjb25zdCB1aW50OF90ICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqb3V0LCBzaXplX3QgbGVuLCBjdHIxMjhfZiBzdHJlYW0pOworCisvKiBDUllQVE9fZ2NtMTI4X2ZpbmlzaCBjYWxjdWxhdGVzIHRoZSBhdXRoZW50aWNhdG9yIGFuZCBjb21wYXJlcyBpdCBhZ2FpbnN0CisgKiB8bGVufCBieXRlcyBvZiB8dGFnfC4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvdGhlcndpc2UuICovCitpbnQgQ1JZUFRPX2djbTEyOF9maW5pc2goR0NNMTI4X0NPTlRFWFQgKmN0eCwgY29uc3QgdWludDhfdCAqdGFnLCBzaXplX3QgbGVuKTsKKworLyogQ1JZUFRPX2djbTEyOF90YWcgY2FsY3VsYXRlcyB0aGUgYXV0aGVudGljYXRvciBhbmQgY29waWVzIGl0IGludG8gfHRhZ3wuIFRoZQorICogbWluaW11bSBvZiB8bGVufCBhbmQgMTYgYnl0ZXMgYXJlIGNvcGllZCBpbnRvIHx0YWd8LiAqLwordm9pZCBDUllQVE9fZ2NtMTI4X3RhZyhHQ00xMjhfQ09OVEVYVCAqY3R4LCB1aW50OF90ICp0YWcsIHNpemVfdCBsZW4pOworCisvKiBDUllQVE9fZ2NtMTI4X3JlbGVhc2UgY2xlYXJzIGFuZCBmcmVlcyB8Y3R4fC4gKi8KK3ZvaWQgQ1JZUFRPX2djbTEyOF9yZWxlYXNlKEdDTTEyOF9DT05URVhUICpjdHgpOworCisKKy8qIENCQy4gKi8KKworLyogY2JjMTI4X2YgaXMgdGhlIHR5cGUgb2YgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIENCQy1tb2RlIGVuY3J5cHRpb24uICovCit0eXBlZGVmIHZvaWQgKCpjYmMxMjhfZikoY29uc3QgdWludDhfdCAqaW4sIHVpbnQ4X3QgKm91dCwgc2l6ZV90IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICprZXksIHVpbnQ4X3QgaXZlY1sxNl0sIGludCBlbmMpOworCisvKiBDUllQVE9fY2JjMTI4X2VuY3J5cHQgZW5jcnlwdHMgfGxlbnwgYnl0ZXMgZnJvbSB8aW58IHRvIHxvdXR8IHVzaW5nIHRoZQorICogZ2l2ZW4gSVYgYW5kIGJsb2NrIGNpcGhlciBpbiBDQkMgbW9kZS4gVGhlIGlucHV0IG5lZWQgbm90IGJlIGEgbXVsdGlwbGUgb2YKKyAqIDEyOCBiaXRzIGxvbmcsIGJ1dCB0aGUgb3V0cHV0IHdpbGwgcm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgMTI4IGJpdCBtdWx0aXBsZSwKKyAqIHplcm8gcGFkZGluZyB0aGUgaW5wdXQgaWYgbmVlZGVkLiBUaGUgSVYgd2lsbCBiZSB1cGRhdGVkIG9uIHJldHVybi4gKi8KK3ZvaWQgQ1JZUFRPX2NiYzEyOF9lbmNyeXB0KGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50OF90ICpvdXQsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICprZXksIHVpbnQ4X3QgaXZlY1sxNl0sIGJsb2NrMTI4X2YgYmxvY2spOworCisvKiBDUllQVE9fY2JjMTI4X2RlY3J5cHQgZGVjcnlwdHMgfGxlbnwgYnl0ZXMgZnJvbSB8aW58IHRvIHxvdXR8IHVzaW5nIHRoZQorICogZ2l2ZW4gSVYgYW5kIGJsb2NrIGNpcGhlciBpbiBDQkMgbW9kZS4gSWYgfGxlbnwgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTI4CisgKiBiaXRzIHRoZW4gb25seSB0aGF0IG1hbnkgYnl0ZXMgd2lsbCBiZSB3cml0dGVuLCBidXQgYSBtdWx0aXBsZSBvZiAxMjggYml0cworICogaXMgYWx3YXlzIHJlYWQgZnJvbSB8aW58LiBUaGUgSVYgd2lsbCBiZSB1cGRhdGVkIG9uIHJldHVybi4gKi8KK3ZvaWQgQ1JZUFRPX2NiYzEyOF9kZWNyeXB0KGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50OF90ICpvdXQsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICprZXksIHVpbnQ4X3QgaXZlY1sxNl0sIGJsb2NrMTI4X2YgYmxvY2spOworCisKKy8qIE9GQi4gKi8KKworLyogQ1JZUFRPX29mYjEyOF9lbmNyeXB0IGVuY3J5cHRzIChvciBkZWNyeXB0cywgaXQncyB0aGUgc2FtZSB3aXRoIE9GQiBtb2RlKQorICogfGxlbnwgYnl0ZXMgZnJvbSB8aW58IHRvIHxvdXR8IHVzaW5nIHxibG9ja3wgaW4gT0ZCIG1vZGUuIFRoZXJlJ3Mgbm8KKyAqIHJlcXVpcmVtZW50IHRoYXQgfGxlbnwgYmUgYSBtdWx0aXBsZSBvZiBhbnkgdmFsdWUgYW5kIGFueSBwYXJ0aWFsIGJsb2NrcyBhcmUKKyAqIHN0b3JlZCBpbiB8aXZlY3wgYW5kIHwqbnVtfCwgdGhlIGxhdHRlciBtdXN0IGJlIHplcm8gYmVmb3JlIHRoZSBpbml0aWFsCisgKiBjYWxsLiAqLwordm9pZCBDUllQVE9fb2ZiMTI4X2VuY3J5cHQoY29uc3QgdWludDhfdCAqaW4sIHVpbnQ4X3QgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4sIGNvbnN0IHZvaWQgKmtleSwgdWludDhfdCBpdmVjWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbnVtLCBibG9jazEyOF9mIGJsb2NrKTsKKworCisvKiBDRkIuICovCisKKy8qIENSWVBUT19jZmIxMjhfZW5jcnlwdCBlbmNyeXB0cyAob3IgZGVjcnlwdHMsIGlmIHxlbmN8IGlzIHplcm8pIHxsZW58IGJ5dGVzCisgKiBmcm9tIHxpbnwgdG8gfG91dHwgdXNpbmcgfGJsb2NrfCBpbiBDRkIgbW9kZS4gVGhlcmUncyBubyByZXF1aXJlbWVudCB0aGF0CisgKiB8bGVufCBiZSBhIG11bHRpcGxlIG9mIGFueSB2YWx1ZSBhbmQgYW55IHBhcnRpYWwgYmxvY2tzIGFyZSBzdG9yZWQgaW4gfGl2ZWN8CisgKiBhbmQgfCpudW18LCB0aGUgbGF0dGVyIG11c3QgYmUgemVybyBiZWZvcmUgdGhlIGluaXRpYWwgY2FsbC4gKi8KK3ZvaWQgQ1JZUFRPX2NmYjEyOF9lbmNyeXB0KGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50OF90ICpvdXQsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICprZXksIHVpbnQ4X3QgaXZlY1sxNl0sIGludCAqbnVtLCBpbnQgZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sxMjhfZiBibG9jayk7CisKKy8qIENSWVBUT19jZmIxMjhfOF9lbmNyeXB0IGVuY3J5cHRzIChvciBkZWNyeXB0cywgaWYgfGVuY3wgaXMgemVybykgfGxlbnwgYnl0ZXMKKyAqIGZyb20gfGlufCB0byB8b3V0fCB1c2luZyB8YmxvY2t8IGluIENGQi04IG1vZGUuIFByaW9yIHRvIHRoZSBmaXJzdCBjYWxsCisgKiB8bnVtfCBzaG91bGQgYmUgc2V0IHRvIHplcm8uICovCit2b2lkIENSWVBUT19jZmIxMjhfOF9lbmNyeXB0KGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50OF90ICpvdXQsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmtleSwgdWludDhfdCBpdmVjWzE2XSwgaW50ICpudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmMsIGJsb2NrMTI4X2YgYmxvY2spOworCisvKiBDUllQVE9fY2ZiMTI4XzFfZW5jcnlwdCBlbmNyeXB0cyAob3IgZGVjcnlwdHMsIGlmIHxlbmN8IGlzIHplcm8pIHxsZW58IGJ5dGVzCisgKiBmcm9tIHxpbnwgdG8gfG91dHwgdXNpbmcgfGJsb2NrfCBpbiBDRkItMSBtb2RlLiBQcmlvciB0byB0aGUgZmlyc3QgY2FsbAorICogfG51bXwgc2hvdWxkIGJlIHNldCB0byB6ZXJvLiAqLwordm9pZCBDUllQVE9fY2ZiMTI4XzFfZW5jcnlwdChjb25zdCB1aW50OF90ICppbiwgdWludDhfdCAqb3V0LCBzaXplX3QgYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqa2V5LCB1aW50OF90IGl2ZWNbMTZdLCBpbnQgKm51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuYywgYmxvY2sxMjhfZiBibG9jayk7CisKK3NpemVfdCBDUllQVE9fY3RzMTI4X2VuY3J5cHRfYmxvY2soY29uc3QgdWludDhfdCAqaW4sIHVpbnQ4X3QgKm91dCwgc2l6ZV90IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqa2V5LCB1aW50OF90IGl2ZWNbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jazEyOF9mIGJsb2NrKTsKKworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30gIC8qIGV4dGVybiBDICovCisjZW5kaWYKKworI2VuZGlmICAvKiBPUEVOU1NMX0hFQURFUl9NT0RFU19IICovCmRpZmYgLS1naXQgYS9jcnlwdG8vbW9kZXMvb2ZiLmMgYi9jcnlwdG8vbW9kZXMvb2ZiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU1YzA2OQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9tb2Rlcy9vZmIuYwpAQCAtMCwwICsxLDEwNiBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9tb2Rlcy5oPgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisKK3ZvaWQgQ1JZUFRPX29mYjEyOF9lbmNyeXB0KGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50OF90ICpvdXQsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICprZXksIHVpbnQ4X3QgaXZlY1sxNl0sIGludCAqbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sxMjhfZiBibG9jaykgeworICB1bnNpZ25lZCBpbnQgbjsKKyAgc2l6ZV90IGw9MDsKKworICBhc3NlcnQoaW4gJiYgb3V0ICYmIGtleSAmJiBpdmVjICYmIG51bSk7CisgIGFzc2VydCgoMTYgJSBzaXplb2Yoc2l6ZV90KSkgPT0gMCk7CisKKyAgbiA9ICpudW07CisKKyAgd2hpbGUgKG4gJiYgbGVuKSB7CisgICAgKihvdXQrKykgPSAqKGluKyspIF4gaXZlY1tuXTsKKyAgICAtLWxlbjsKKyAgICBuID0gKG4gKyAxKSAlIDE2OworICB9CisKKyAgaWYgKFNUUklDVF9BTElHTk1FTlQgJiYKKyAgICAgICgoc2l6ZV90KWluIHwgKHNpemVfdClvdXQgfCAoc2l6ZV90KWl2ZWMpICUgc2l6ZW9mKHNpemVfdCkgIT0gMCkgeworICAgIHdoaWxlIChsIDwgbGVuKSB7CisgICAgICBpZiAobiA9PSAwKSB7CisgICAgICAgICgqYmxvY2spKGl2ZWMsIGl2ZWMsIGtleSk7CisgICAgICB9CisgICAgICBvdXRbbF0gPSBpbltsXSBeIGl2ZWNbbl07CisgICAgICArK2w7CisgICAgICBuID0gKG4gKyAxKSAlIDE2OworICAgIH0KKworICAgICpudW0gPSBuOworICAgIHJldHVybjsKKyAgfQorCisgIHdoaWxlIChsZW4gPj0gMTYpIHsKKyAgICAoKmJsb2NrKShpdmVjLCBpdmVjLCBrZXkpOworICAgIGZvciAoOyBuIDwgMTY7IG4gKz0gc2l6ZW9mKHNpemVfdCkpIHsKKyAgICAgICooc2l6ZV90ICopKG91dCArIG4pID0gKihzaXplX3QgKikoaW4gKyBuKSBeICooc2l6ZV90ICopKGl2ZWMgKyBuKTsKKyAgICB9CisgICAgbGVuIC09IDE2OworICAgIG91dCArPSAxNjsKKyAgICBpbiArPSAxNjsKKyAgICBuID0gMDsKKyAgfQorICBpZiAobGVuKSB7CisgICAgKCpibG9jaykoaXZlYywgaXZlYywga2V5KTsKKyAgICB3aGlsZSAobGVuLS0pIHsKKyAgICAgIG91dFtuXSA9IGluW25dIF4gaXZlY1tuXTsKKyAgICAgICsrbjsKKyAgICB9CisgIH0KKyAgKm51bSA9IG47Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vb2JqL0NNYWtlTGlzdHMudHh0IGIvY3J5cHRvL29iai9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODEyYjM3Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL29iai9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDExIEBACitpbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKKworYWRkX2xpYnJhcnkoCisJb2JqCisKKwlPQkpFQ1QKKworCW9iai5jCisJb2JqX3hyZWYuYworCW9ial9lcnJvci5jCispCmRpZmYgLS1naXQgYS9jcnlwdG8vb2JqL29iai5jIGIvY3J5cHRvL29iai9vYmouYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzAzNDZkCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL29iai9vYmouYwpAQCAtMCwwICsxLDY1OCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvb2JqLmg+CisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYnVmLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ieXRlc3RyaW5nLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2xoYXNoLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3RocmVhZC5oPgorCisjaW5jbHVkZSAib2JqX2RhdC5oIgorCisvKiBUaGVzZSBnbG9iYWxzIGFyZSBwcm90ZWN0ZWQgYnkgQ1JZUFRPX0xPQ0tfT0JKLiAqLworc3RhdGljIExIQVNIX09GKEFTTjFfT0JKRUNUKSAqZ2xvYmFsX2FkZGVkX2J5X2RhdGEgPSBOVUxMOworc3RhdGljIExIQVNIX09GKEFTTjFfT0JKRUNUKSAqZ2xvYmFsX2FkZGVkX2J5X25pZCA9IE5VTEw7CitzdGF0aWMgTEhBU0hfT0YoQVNOMV9PQkpFQ1QpICpnbG9iYWxfYWRkZWRfYnlfc2hvcnRfbmFtZSA9IE5VTEw7CitzdGF0aWMgTEhBU0hfT0YoQVNOMV9PQkpFQ1QpICpnbG9iYWxfYWRkZWRfYnlfbG9uZ19uYW1lID0gTlVMTDsKKworc3RhdGljIHVuc2lnbmVkIGdsb2JhbF9uZXh0X25pZCA9IE5VTV9OSUQ7CisKK3N0YXRpYyBpbnQgb2JqX25leHRfbmlkKCkgeworICBpbnQgcmV0OworCisgIENSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfT0JKKTsKKyAgcmV0ID0gZ2xvYmFsX25leHRfbmlkKys7CisgIENSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19PQkopOworCisgIHJldHVybiByZXQ7Cit9CisKK0FTTjFfT0JKRUNUICpPQkpfZHVwKGNvbnN0IEFTTjFfT0JKRUNUICpvKSB7CisgIEFTTjFfT0JKRUNUICpyOworICB1bnNpZ25lZCBjaGFyICpkYXRhID0gTlVMTDsKKyAgY2hhciAqc24gPSBOVUxMLCAqbG4gPSBOVUxMOworCisgIGlmIChvID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmICghKG8tPmZsYWdzICYgQVNOMV9PQkpFQ1RfRkxBR19EWU5BTUlDKSkgeworICAgIC8qIFRPRE8oZm9yayk6IHRoaXMgaXMgYSBsaXR0bGUgZGFuZ2Vyb3VzLiAqLworICAgIHJldHVybiAoQVNOMV9PQkpFQ1QgKilvOworICB9CisKKyAgciA9IEFTTjFfT0JKRUNUX25ldygpOworICBpZiAociA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoT0JKLCBPQkpfZHVwLCBFUlJfUl9BU04xX0xJQik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgci0+bG4gPSByLT5zbiA9IE5VTEw7CisKKyAgZGF0YSA9IE9QRU5TU0xfbWFsbG9jKG8tPmxlbmd0aCk7CisgIGlmIChkYXRhID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorICBpZiAoby0+ZGF0YSAhPSBOVUxMKSB7CisgICAgbWVtY3B5KGRhdGEsIG8tPmRhdGEsIG8tPmxlbmd0aCk7CisgIH0KKworICAvKiBvbmNlIGRhdGEgaXMgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LCBpdCByZW1haW5zIGNvbnN0ICovCisgIHItPmRhdGEgPSBkYXRhOworICByLT5sZW5ndGggPSBvLT5sZW5ndGg7CisgIHItPm5pZCA9IG8tPm5pZDsKKworICBpZiAoby0+bG4gIT0gTlVMTCkgeworICAgIGxuID0gT1BFTlNTTF9zdHJkdXAoby0+bG4pOworICAgIGlmIChsbiA9PSBOVUxMKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0KKworICBpZiAoby0+c24gIT0gTlVMTCkgeworICAgIHNuID0gT1BFTlNTTF9zdHJkdXAoby0+c24pOworICAgIGlmIChzbikgeworICAgICAgZ290byBlcnI7CisgICAgfQorICB9CisKKyAgci0+c24gPSBzbjsKKyAgci0+bG4gPSBsbjsKKworICByLT5mbGFncyA9CisgICAgICBvLT5mbGFncyB8IChBU04xX09CSkVDVF9GTEFHX0RZTkFNSUMgfCBBU04xX09CSkVDVF9GTEFHX0RZTkFNSUNfU1RSSU5HUyB8CisgICAgICAgICAgICAgICAgICBBU04xX09CSkVDVF9GTEFHX0RZTkFNSUNfREFUQSk7CisgIHJldHVybiByOworCitlcnI6CisgIE9QRU5TU0xfUFVUX0VSUk9SKE9CSiwgT0JKX2R1cCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICBpZiAobG4gIT0gTlVMTCkgeworICAgIE9QRU5TU0xfZnJlZShsbik7CisgIH0KKyAgaWYgKHNuICE9IE5VTEwpIHsKKyAgICBPUEVOU1NMX2ZyZWUoc24pOworICB9CisgIGlmIChkYXRhICE9IE5VTEwpIHsKKyAgICBPUEVOU1NMX2ZyZWUoZGF0YSk7CisgIH0KKyAgT1BFTlNTTF9mcmVlKHIpOworICByZXR1cm4gTlVMTDsKK30KKworaW50IE9CSl9jbXAoY29uc3QgQVNOMV9PQkpFQ1QgKmEsIGNvbnN0IEFTTjFfT0JKRUNUICpiKSB7CisgIGludCByZXQ7CisKKyAgcmV0ID0gYS0+bGVuZ3RoIC0gYi0+bGVuZ3RoOworICBpZiAocmV0KSB7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICByZXR1cm4gbWVtY21wKGEtPmRhdGEsIGItPmRhdGEsIGEtPmxlbmd0aCk7Cit9CisKKy8qIG5pZHNfY21wIGlzIGNhbGxlZCB0byBzZWFyY2ggdGhlIGtOSURzSW5PSURPcmRlciBhcnJheS4gVGhlIHxrZXl8IGFyZ3VtZW50CisgKiBpcyBhbiB8QVNOMV9PQkpFQ1R8KiB0aGF0IHdlJ3JlIGxvb2tpbmcgZm9yIGFuZCB8ZWxlbWVudHwgaXMgYSBwb2ludGVyIHRvIGFuCisgKiB1bnNpZ25lZCBpbnQgaW4gdGhlIGFycmF5LiAqLworc3RhdGljIGludCBvYmpfY21wKGNvbnN0IHZvaWQgKmtleSwgY29uc3Qgdm9pZCAqZWxlbWVudCkgeworICBpbnQgajsKKyAgdW5zaWduZWQgbmlkID0gKigodW5zaWduZWQqKSBlbGVtZW50KTsKKyAgY29uc3QgQVNOMV9PQkpFQ1QgKmEgPSBrZXk7CisgIGNvbnN0IEFTTjFfT0JKRUNUICpiID0gJmtPYmplY3RzW25pZF07CisKKyAgaiA9IGEtPmxlbmd0aCAtIGItPmxlbmd0aDsKKyAgaWYgKGopIHsKKyAgICByZXR1cm4gajsKKyAgfQorICByZXR1cm4gbWVtY21wKGEtPmRhdGEsIGItPmRhdGEsIGEtPmxlbmd0aCk7Cit9CisKK2ludCBPQkpfb2JqMm5pZChjb25zdCBBU04xX09CSkVDVCAqb2JqKSB7CisgIGNvbnN0IHVuc2lnbmVkIGludCAqbmlkX3B0cjsKKworICBpZiAob2JqID09IE5VTEwpIHsKKyAgICByZXR1cm4gTklEX3VuZGVmOworICB9CisKKyAgaWYgKG9iai0+bmlkICE9IDApIHsKKyAgICByZXR1cm4gb2JqLT5uaWQ7CisgIH0KKworICBDUllQVE9fcl9sb2NrKENSWVBUT19MT0NLX09CSik7CisgIGlmIChnbG9iYWxfYWRkZWRfYnlfZGF0YSAhPSBOVUxMKSB7CisgICAgQVNOMV9PQkpFQ1QgKm1hdGNoOworCisgICAgbWF0Y2ggPSBsaF9BU04xX09CSkVDVF9yZXRyaWV2ZShnbG9iYWxfYWRkZWRfYnlfZGF0YSwgb2JqKTsKKyAgICBpZiAobWF0Y2ggIT0gTlVMTCkgeworICAgICAgQ1JZUFRPX3JfdW5sb2NrKENSWVBUT19MT0NLX09CSik7CisgICAgICByZXR1cm4gbWF0Y2gtPm5pZDsKKyAgICB9CisgIH0KKyAgQ1JZUFRPX3JfdW5sb2NrKENSWVBUT19MT0NLX09CSik7CisKKyAgbmlkX3B0ciA9IGJzZWFyY2gob2JqLCBrTklEc0luT0lET3JkZXIsIE5VTV9PQkosIHNpemVvZih1bnNpZ25lZCksIG9ial9jbXApOworICBpZiAobmlkX3B0ciA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5JRF91bmRlZjsKKyAgfQorCisgIHJldHVybiBrT2JqZWN0c1sqbmlkX3B0cl0ubmlkOworfQorCitpbnQgT0JKX2NiczJuaWQoY29uc3QgQ0JTICpjYnMpIHsKKyAgQVNOMV9PQkpFQ1Qgb2JqOworICBtZW1zZXQoJm9iaiwgMCwgc2l6ZW9mKG9iaikpOworICBvYmouZGF0YSA9IENCU19kYXRhKGNicyk7CisgIG9iai5sZW5ndGggPSBDQlNfbGVuKGNicyk7CisKKyAgcmV0dXJuIE9CSl9vYmoybmlkKCZvYmopOworfQorCisvKiBzaG9ydF9uYW1lX2NtcCBpcyBjYWxsZWQgdG8gc2VhcmNoIHRoZSBrTklEc0luU2hvcnROYW1lT3JkZXIgYXJyYXkuIFRoZQorICogfGtleXwgYXJndW1lbnQgaXMgbmFtZSB0aGF0IHdlJ3JlIGxvb2tpbmcgZm9yIGFuZCB8ZWxlbWVudHwgaXMgYSBwb2ludGVyIHRvCisgKiBhbiB1bnNpZ25lZCBpbnQgaW4gdGhlIGFycmF5LiAqLworc3RhdGljIGludCBzaG9ydF9uYW1lX2NtcChjb25zdCB2b2lkICprZXksIGNvbnN0IHZvaWQgKmVsZW1lbnQpIHsKKyAgY29uc3QgY2hhciAqbmFtZSA9IChjb25zdCBjaGFyICopIGtleTsKKyAgdW5zaWduZWQgbmlkID0gKigodW5zaWduZWQqKSBlbGVtZW50KTsKKworICByZXR1cm4gc3RyY21wKG5hbWUsIGtPYmplY3RzW25pZF0uc24pOworfQorCitpbnQgT0JKX3NuMm5pZChjb25zdCBjaGFyICpzaG9ydF9uYW1lKSB7CisgIGNvbnN0IHVuc2lnbmVkIGludCAqbmlkX3B0cjsKKworICBDUllQVE9fcl9sb2NrKENSWVBUT19MT0NLX09CSik7CisgIGlmIChnbG9iYWxfYWRkZWRfYnlfc2hvcnRfbmFtZSAhPSBOVUxMKSB7CisgICAgQVNOMV9PQkpFQ1QgKm1hdGNoLCB0ZW1wbGF0ZTsKKworICAgIHRlbXBsYXRlLnNuID0gc2hvcnRfbmFtZTsKKyAgICBtYXRjaCA9IGxoX0FTTjFfT0JKRUNUX3JldHJpZXZlKGdsb2JhbF9hZGRlZF9ieV9zaG9ydF9uYW1lLCAmdGVtcGxhdGUpOworICAgIGlmIChtYXRjaCAhPSBOVUxMKSB7CisgICAgICBDUllQVE9fcl91bmxvY2soQ1JZUFRPX0xPQ0tfT0JKKTsKKyAgICAgIHJldHVybiBtYXRjaC0+bmlkOworICAgIH0KKyAgfQorICBDUllQVE9fcl91bmxvY2soQ1JZUFRPX0xPQ0tfT0JKKTsKKworICBuaWRfcHRyID0gYnNlYXJjaChzaG9ydF9uYW1lLCBrTklEc0luU2hvcnROYW1lT3JkZXIsIE5VTV9TTiwgc2l6ZW9mKHVuc2lnbmVkKSwgc2hvcnRfbmFtZV9jbXApOworICBpZiAobmlkX3B0ciA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5JRF91bmRlZjsKKyAgfQorCisgIHJldHVybiBrT2JqZWN0c1sqbmlkX3B0cl0ubmlkOworfQorCisvKiBsb25nX25hbWVfY21wIGlzIGNhbGxlZCB0byBzZWFyY2ggdGhlIGtOSURzSW5Mb25nTmFtZU9yZGVyIGFycmF5LiBUaGUKKyAqIHxrZXl8IGFyZ3VtZW50IGlzIG5hbWUgdGhhdCB3ZSdyZSBsb29raW5nIGZvciBhbmQgfGVsZW1lbnR8IGlzIGEgcG9pbnRlciB0bworICogYW4gdW5zaWduZWQgaW50IGluIHRoZSBhcnJheS4gKi8KK3N0YXRpYyBpbnQgbG9uZ19uYW1lX2NtcChjb25zdCB2b2lkICprZXksIGNvbnN0IHZvaWQgKmVsZW1lbnQpIHsKKyAgY29uc3QgY2hhciAqbmFtZSA9IChjb25zdCBjaGFyICopIGtleTsKKyAgdW5zaWduZWQgbmlkID0gKigodW5zaWduZWQqKSBlbGVtZW50KTsKKworICByZXR1cm4gc3RyY21wKG5hbWUsIGtPYmplY3RzW25pZF0ubG4pOworfQorCitpbnQgT0JKX2xuMm5pZChjb25zdCBjaGFyICpsb25nX25hbWUpIHsKKyAgY29uc3QgdW5zaWduZWQgaW50ICpuaWRfcHRyOworCisgIENSWVBUT19yX2xvY2soQ1JZUFRPX0xPQ0tfT0JKKTsKKyAgaWYgKGdsb2JhbF9hZGRlZF9ieV9sb25nX25hbWUgIT0gTlVMTCkgeworICAgIEFTTjFfT0JKRUNUICptYXRjaCwgdGVtcGxhdGU7CisKKyAgICB0ZW1wbGF0ZS5sbiA9IGxvbmdfbmFtZTsKKyAgICBtYXRjaCA9IGxoX0FTTjFfT0JKRUNUX3JldHJpZXZlKGdsb2JhbF9hZGRlZF9ieV9sb25nX25hbWUsICZ0ZW1wbGF0ZSk7CisgICAgaWYgKG1hdGNoICE9IE5VTEwpIHsKKyAgICAgIENSWVBUT19yX3VubG9jayhDUllQVE9fTE9DS19PQkopOworICAgICAgcmV0dXJuIG1hdGNoLT5uaWQ7CisgICAgfQorICB9CisgIENSWVBUT19yX3VubG9jayhDUllQVE9fTE9DS19PQkopOworCisgIG5pZF9wdHIgPSBic2VhcmNoKGxvbmdfbmFtZSwga05JRHNJbkxvbmdOYW1lT3JkZXIsIE5VTV9MTiwgc2l6ZW9mKHVuc2lnbmVkKSwgbG9uZ19uYW1lX2NtcCk7CisgIGlmIChuaWRfcHRyID09IE5VTEwpIHsKKyAgICByZXR1cm4gTklEX3VuZGVmOworICB9CisKKyAgcmV0dXJuIGtPYmplY3RzWypuaWRfcHRyXS5uaWQ7Cit9CisKK2ludCBPQkpfdHh0Mm5pZChjb25zdCBjaGFyICpzKSB7CisgIEFTTjFfT0JKRUNUICpvYmo7CisgIGludCBuaWQ7CisKKyAgb2JqID0gT0JKX3R4dDJvYmoocywgMCAvKiBzZWFyY2ggbmFtZXMgKi8pOworICBuaWQgPSBPQkpfb2JqMm5pZChvYmopOworICBBU04xX09CSkVDVF9mcmVlKG9iaik7CisgIHJldHVybiBuaWQ7Cit9CisKK2NvbnN0IEFTTjFfT0JKRUNUICpPQkpfbmlkMm9iaihpbnQgbmlkKSB7CisgIGlmIChuaWQgPj0gMCAmJiBuaWQgPCBOVU1fTklEKSB7CisgICAgaWYgKG5pZCAhPSBOSURfdW5kZWYgJiYga09iamVjdHNbbmlkXS5uaWQgPT0gTklEX3VuZGVmKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgcmV0dXJuICZrT2JqZWN0c1tuaWRdOworICB9CisKKyAgQ1JZUFRPX3JfbG9jayhDUllQVE9fTE9DS19PQkopOworICBpZiAoZ2xvYmFsX2FkZGVkX2J5X25pZCAhPSBOVUxMKSB7CisgICAgQVNOMV9PQkpFQ1QgKm1hdGNoLCB0ZW1wbGF0ZTsKKworICAgIHRlbXBsYXRlLm5pZCA9IG5pZDsKKyAgICBtYXRjaCA9IGxoX0FTTjFfT0JKRUNUX3JldHJpZXZlKGdsb2JhbF9hZGRlZF9ieV9uaWQsICZ0ZW1wbGF0ZSk7CisgICAgaWYgKG1hdGNoICE9IE5VTEwpIHsKKyAgICAgIENSWVBUT19yX3VubG9jayhDUllQVE9fTE9DS19PQkopOworICAgICAgcmV0dXJuIG1hdGNoOworICAgIH0KKyAgfQorICBDUllQVE9fcl91bmxvY2soQ1JZUFRPX0xPQ0tfT0JKKTsKKworZXJyOgorICBPUEVOU1NMX1BVVF9FUlJPUihPQkosIE9CSl9uaWQyb2JqLCBPQkpfUl9VTktOT1dOX05JRCk7CisgIHJldHVybiBOVUxMOworfQorCitjb25zdCBjaGFyICpPQkpfbmlkMnNuKGludCBuaWQpIHsKKyAgY29uc3QgQVNOMV9PQkpFQ1QgKm9iaiA9IE9CSl9uaWQyb2JqKG5pZCk7CisgIGlmIChvYmogPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIG9iai0+c247Cit9CisKK2NvbnN0IGNoYXIgKk9CSl9uaWQybG4oaW50IG5pZCkgeworICBjb25zdCBBU04xX09CSkVDVCAqb2JqID0gT0JKX25pZDJvYmoobmlkKTsKKyAgaWYgKG9iaiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICByZXR1cm4gb2JqLT5sbjsKK30KKworQVNOMV9PQkpFQ1QgKk9CSl90eHQyb2JqKGNvbnN0IGNoYXIgKnMsIGludCBkb250X3NlYXJjaF9uYW1lcykgeworICBpbnQgbmlkID0gTklEX3VuZGVmOworICBBU04xX09CSkVDVCAqb3AgPSBOVUxMOworICB1bnNpZ25lZCBjaGFyICpidWY7CisgIHVuc2lnbmVkIGNoYXIgKnA7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZnA7CisgIGludCBjb250ZW50c19sZW4sIHRvdGFsX2xlbjsKKworICBpZiAoIWRvbnRfc2VhcmNoX25hbWVzKSB7CisgICAgbmlkID0gT0JKX3NuMm5pZChzKTsKKyAgICBpZiAobmlkID09IE5JRF91bmRlZikgeworICAgICAgbmlkID0gT0JKX2xuMm5pZChzKTsKKyAgICB9CisKKyAgICBpZiAobmlkICE9IE5JRF91bmRlZikgeworICAgICAgcmV0dXJuIChBU04xX09CSkVDVCopIE9CSl9uaWQyb2JqKG5pZCk7CisgICAgfQorICB9CisKKyAgLyogV29yayBvdXQgc2l6ZSBvZiBjb250ZW50IG9jdGV0cyAqLworICBjb250ZW50c19sZW4gPSBhMmRfQVNOMV9PQkpFQ1QoTlVMTCwgMCwgcywgLTEpOworICBpZiAoY29udGVudHNfbGVuIDw9IDApIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICAvKiBXb3JrIG91dCB0b3RhbCBzaXplICovCisgIHRvdGFsX2xlbiA9IEFTTjFfb2JqZWN0X3NpemUoMCwgY29udGVudHNfbGVuLCBWX0FTTjFfT0JKRUNUKTsKKworICBidWYgPSBPUEVOU1NMX21hbGxvYyh0b3RhbF9sZW4pOworICBpZiAoYnVmID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihPQkosIE9CSl90eHQyb2JqLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBwID0gYnVmOworICAvKiBXcml0ZSBvdXQgdGFnK2xlbmd0aCAqLworICBBU04xX3B1dF9vYmplY3QoJnAsIDAsIGNvbnRlbnRzX2xlbiwgVl9BU04xX09CSkVDVCwgVl9BU04xX1VOSVZFUlNBTCk7CisgIC8qIFdyaXRlIG91dCBjb250ZW50cyAqLworICBhMmRfQVNOMV9PQkpFQ1QocCwgY29udGVudHNfbGVuLCBzLCAtMSk7CisKKyAgYnVmcCA9IGJ1ZjsKKyAgb3AgPSBkMmlfQVNOMV9PQkpFQ1QoTlVMTCwgJmJ1ZnAsIHRvdGFsX2xlbik7CisgIE9QRU5TU0xfZnJlZShidWYpOworCisgIHJldHVybiBvcDsKK30KKworaW50IE9CSl9vYmoydHh0KGNoYXIgKm91dCwgaW50IG91dF9sZW4sIGNvbnN0IEFTTjFfT0JKRUNUICpvYmosIGludCBkb250X3JldHVybl9uYW1lKSB7CisgIGludCBpLCBuID0gMCwgbGVuLCBuaWQsIGZpcnN0LCB1c2VfYm47CisgIEJJR05VTSAqYmw7CisgIHVuc2lnbmVkIGxvbmcgbDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKyAgY2hhciB0YnVmW0RFQ0lNQUxfU0laRShpKSArIERFQ0lNQUxfU0laRShsKSArIDJdOworCisgIGlmIChvdXQgJiYgb3V0X2xlbiA+IDApIHsKKyAgICBvdXRbMF0gPSAwOworICB9CisKKyAgaWYgKG9iaiA9PSBOVUxMIHx8IG9iai0+ZGF0YSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoIWRvbnRfcmV0dXJuX25hbWUgJiYgKG5pZCA9IE9CSl9vYmoybmlkKG9iaikpICE9IE5JRF91bmRlZikgeworICAgIGNvbnN0IGNoYXIgKnM7CisgICAgcyA9IE9CSl9uaWQybG4obmlkKTsKKyAgICBpZiAocyA9PSBOVUxMKSB7CisgICAgICBzID0gT0JKX25pZDJzbihuaWQpOworICAgIH0KKyAgICBpZiAocykgeworICAgICAgaWYgKG91dCkgeworICAgICAgICBCVUZfc3RybGNweShvdXQsIHMsIG91dF9sZW4pOworICAgICAgfQorICAgICAgcmV0dXJuIHN0cmxlbihzKTsKKyAgICB9CisgIH0KKworICBsZW4gPSBvYmotPmxlbmd0aDsKKyAgcCA9IG9iai0+ZGF0YTsKKworICBmaXJzdCA9IDE7CisgIGJsID0gTlVMTDsKKworICB3aGlsZSAobGVuID4gMCkgeworICAgIGwgPSAwOworICAgIHVzZV9ibiA9IDA7CisgICAgZm9yICg7OykgeworICAgICAgdW5zaWduZWQgY2hhciBjID0gKnArKzsKKyAgICAgIGxlbi0tOworICAgICAgaWYgKGxlbiA9PSAwICYmIChjICYgMHg4MCkpIHsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgICBpZiAodXNlX2JuKSB7CisgICAgICAgIGlmICghQk5fYWRkX3dvcmQoYmwsIGMgJiAweDdmKSkgeworICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBsIHw9IGMgJiAweDdmOworICAgICAgfQorICAgICAgaWYgKCEoYyAmIDB4ODApKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKCF1c2VfYm4gJiYgKGwgPiAoVUxPTkdfTUFYID4+IDdMKSkpIHsKKyAgICAgICAgaWYgKCFibCAmJiAhKGJsID0gQk5fbmV3KCkpKSB7CisgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFCTl9zZXRfd29yZChibCwgbCkpIHsKKyAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgICAgICB1c2VfYm4gPSAxOworICAgICAgfQorICAgICAgaWYgKHVzZV9ibikgeworICAgICAgICBpZiAoIUJOX2xzaGlmdChibCwgYmwsIDcpKSB7CisgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGwgPDw9IDdMOworICAgICAgfQorICAgIH0KKworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSAwOworICAgICAgaWYgKGwgPj0gODApIHsKKyAgICAgICAgaSA9IDI7CisgICAgICAgIGlmICh1c2VfYm4pIHsKKyAgICAgICAgICBpZiAoIUJOX3N1Yl93b3JkKGJsLCA4MCkpIHsKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBsIC09IDgwOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpID0gKGludCkobCAvIDQwKTsKKyAgICAgICAgbCAtPSAobG9uZykoaSAqIDQwKTsKKyAgICAgIH0KKyAgICAgIGlmIChvdXQgJiYgb3V0X2xlbiA+IDEpIHsKKyAgICAgICAgKm91dCsrID0gaSArICcwJzsKKyAgICAgICAgKm91dCA9ICcwJzsKKyAgICAgICAgb3V0X2xlbi0tOworICAgICAgfQorICAgICAgbisrOworICAgIH0KKworICAgIGlmICh1c2VfYm4pIHsKKyAgICAgIGNoYXIgKmJuZGVjOworICAgICAgYm5kZWMgPSBCTl9ibjJkZWMoYmwpOworICAgICAgaWYgKCFibmRlYykgeworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICAgIGkgPSBzdHJsZW4oYm5kZWMpOworICAgICAgaWYgKG91dCkgeworICAgICAgICBpZiAob3V0X2xlbiA+IDEpIHsKKyAgICAgICAgICAqb3V0KysgPSAnLic7CisgICAgICAgICAgKm91dCA9IDA7CisgICAgICAgICAgb3V0X2xlbi0tOworICAgICAgICB9CisgICAgICAgIEJVRl9zdHJsY3B5KG91dCwgYm5kZWMsIG91dF9sZW4pOworICAgICAgICBpZiAoaSA+IG91dF9sZW4pIHsKKyAgICAgICAgICBvdXQgKz0gb3V0X2xlbjsKKyAgICAgICAgICBvdXRfbGVuID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgKz0gaTsKKyAgICAgICAgICBvdXRfbGVuIC09IGk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIG4rKzsKKyAgICAgIG4gKz0gaTsKKyAgICAgIE9QRU5TU0xfZnJlZShibmRlYyk7CisgICAgfSBlbHNlIHsKKyAgICAgIEJJT19zbnByaW50Zih0YnVmLCBzaXplb2YodGJ1ZiksICIuJWx1IiwgbCk7CisgICAgICBpID0gc3RybGVuKHRidWYpOworICAgICAgaWYgKG91dCAmJiBvdXRfbGVuID4gMCkgeworICAgICAgICBCVUZfc3RybGNweShvdXQsIHRidWYsIG91dF9sZW4pOworICAgICAgICBpZiAoaSA+IG91dF9sZW4pIHsKKyAgICAgICAgICBvdXQgKz0gb3V0X2xlbjsKKyAgICAgICAgICBvdXRfbGVuID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgKz0gaTsKKyAgICAgICAgICBvdXRfbGVuIC09IGk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIG4gKz0gaTsKKyAgICB9CisgIH0KKworICBpZiAoYmwpIHsKKyAgICBCTl9mcmVlKGJsKTsKKyAgfQorICByZXR1cm4gbjsKKworZXJyOgorICBpZiAoYmwpIHsKKyAgICBCTl9mcmVlKGJsKTsKKyAgfQorICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBoYXNoX25pZChjb25zdCBBU04xX09CSkVDVCAqb2JqKSB7CisgIHJldHVybiBvYmotPm5pZDsKK30KKworc3RhdGljIGludCBjbXBfbmlkKGNvbnN0IEFTTjFfT0JKRUNUICphLCBjb25zdCBBU04xX09CSkVDVCAqYikgeworICByZXR1cm4gYS0+bmlkIC0gYi0+bmlkOworfQorCitzdGF0aWMgdWludDMyX3QgaGFzaF9kYXRhKGNvbnN0IEFTTjFfT0JKRUNUICpvYmopIHsKKyAgcmV0dXJuIE9QRU5TU0xfaGFzaDMyKG9iai0+ZGF0YSwgb2JqLT5sZW5ndGgpOworfQorCitzdGF0aWMgaW50IGNtcF9kYXRhKGNvbnN0IEFTTjFfT0JKRUNUICphLCBjb25zdCBBU04xX09CSkVDVCAqYikgeworICBpbnQgaSA9IGEtPmxlbmd0aCAtIGItPmxlbmd0aDsKKyAgaWYgKGkpIHsKKyAgICByZXR1cm4gaTsKKyAgfQorICByZXR1cm4gbWVtY21wKGEtPmRhdGEsIGItPmRhdGEsIGEtPmxlbmd0aCk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBoYXNoX3Nob3J0X25hbWUoY29uc3QgQVNOMV9PQkpFQ1QgKm9iaikgeworICByZXR1cm4gbGhfc3RyaGFzaChvYmotPnNuKTsKK30KKworc3RhdGljIGludCBjbXBfc2hvcnRfbmFtZShjb25zdCBBU04xX09CSkVDVCAqYSwgY29uc3QgQVNOMV9PQkpFQ1QgKmIpIHsKKyAgcmV0dXJuIHN0cmNtcChhLT5zbiwgYi0+c24pOworfQorCitzdGF0aWMgdWludDMyX3QgaGFzaF9sb25nX25hbWUoY29uc3QgQVNOMV9PQkpFQ1QgKm9iaikgeworICByZXR1cm4gbGhfc3RyaGFzaChvYmotPmxuKTsKK30KKworc3RhdGljIGludCBjbXBfbG9uZ19uYW1lKGNvbnN0IEFTTjFfT0JKRUNUICphLCBjb25zdCBBU04xX09CSkVDVCAqYikgeworICByZXR1cm4gc3RyY21wKGEtPmxuLCBiLT5sbik7Cit9CisKKy8qIG9ial9hZGRfb2JqZWN0IGluc2VydHMgfG9ianwgaW50byB0aGUgdmFyaW91cyBnbG9iYWwgaGFzaGVzIGZvciBydW4tdGltZQorICogYWRkZWQgb2JqZWN0cy4gSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBvciB6ZXJvIG90aGVyd2lzZS4gKi8KK3N0YXRpYyBpbnQgb2JqX2FkZF9vYmplY3QoQVNOMV9PQkpFQ1QgKm9iaikgeworICBpbnQgb2s7CisgIEFTTjFfT0JKRUNUICpvbGRfb2JqZWN0OworCisgIG9iai0+ZmxhZ3MgJj0gfihBU04xX09CSkVDVF9GTEFHX0RZTkFNSUMgfCBBU04xX09CSkVDVF9GTEFHX0RZTkFNSUNfU1RSSU5HUyB8CisgICAgICAgICAgICAgICAgICBBU04xX09CSkVDVF9GTEFHX0RZTkFNSUNfREFUQSk7CisKKyAgQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19PQkopOworICBpZiAoZ2xvYmFsX2FkZGVkX2J5X25pZCA9PSBOVUxMKSB7CisgICAgZ2xvYmFsX2FkZGVkX2J5X25pZCA9IGxoX0FTTjFfT0JKRUNUX25ldyhoYXNoX25pZCwgY21wX25pZCk7CisgICAgZ2xvYmFsX2FkZGVkX2J5X2RhdGEgPSBsaF9BU04xX09CSkVDVF9uZXcoaGFzaF9kYXRhLCBjbXBfZGF0YSk7CisgICAgZ2xvYmFsX2FkZGVkX2J5X3Nob3J0X25hbWUgPSBsaF9BU04xX09CSkVDVF9uZXcoaGFzaF9zaG9ydF9uYW1lLCBjbXBfc2hvcnRfbmFtZSk7CisgICAgZ2xvYmFsX2FkZGVkX2J5X2xvbmdfbmFtZSA9IGxoX0FTTjFfT0JKRUNUX25ldyhoYXNoX2xvbmdfbmFtZSwgY21wX2xvbmdfbmFtZSk7CisgIH0KKworICAvKiBXZSBkb24ndCBwYXkgYXR0ZW50aW9uIHRvIHxvbGRfb2JqZWN0fCAod2hpY2ggY29udGFpbnMgYW55IHByZXZpb3VzIG9iamVjdAorICAgKiB0aGF0IHdhcyBldmljdGVkIGZyb20gdGhlIGhhc2hlcykgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIGEgcmVmZXJlbmNlIGNvdW50CisgICAqIG9uIEFTTjFfT0JKRUNUIHZhbHVlcy4gQWxzbywgd2Ugc2hvdWxkIG5ldmVyIGhhdmUgZHVwbGljYXRlcyBuaWRzIGFuZCBzbworICAgKiBzaG91bGQgYWx3YXlzIGhhdmUgb2JqZWN0cyBpbiB8Z2xvYmFsX2FkZGVkX2J5X25pZHwuICovCisKKyAgb2sgPSBsaF9BU04xX09CSkVDVF9pbnNlcnQoZ2xvYmFsX2FkZGVkX2J5X25pZCwgJm9sZF9vYmplY3QsIG9iaik7CisgIGlmIChvYmotPmxlbmd0aCAhPSAwICYmIG9iai0+ZGF0YSAhPSBOVUxMKSB7CisgICAgb2sgJj0gbGhfQVNOMV9PQkpFQ1RfaW5zZXJ0KGdsb2JhbF9hZGRlZF9ieV9kYXRhLCAmb2xkX29iamVjdCwgb2JqKTsKKyAgfQorICBpZiAob2JqLT5zbiAhPSBOVUxMKSB7CisgICAgb2sgJj0gbGhfQVNOMV9PQkpFQ1RfaW5zZXJ0KGdsb2JhbF9hZGRlZF9ieV9zaG9ydF9uYW1lLCAmb2xkX29iamVjdCwgb2JqKTsKKyAgfQorICBpZiAob2JqLT5sbiAhPSBOVUxMKSB7CisgICAgb2sgJj0gbGhfQVNOMV9PQkpFQ1RfaW5zZXJ0KGdsb2JhbF9hZGRlZF9ieV9sb25nX25hbWUsICZvbGRfb2JqZWN0LCBvYmopOworICB9CisgIENSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19PQkopOworCisgIHJldHVybiBvazsKK30KKworaW50IE9CSl9jcmVhdGUoY29uc3QgY2hhciAqb2lkLCBjb25zdCBjaGFyICpzaG9ydF9uYW1lLCBjb25zdCBjaGFyICpsb25nX25hbWUpIHsKKyAgaW50IHJldCA9IE5JRF91bmRlZjsKKyAgQVNOMV9PQkpFQ1QgKm9wID0gTlVMTDsKKyAgdW5zaWduZWQgY2hhciAqYnVmID0gTlVMTDsKKyAgaW50IGxlbjsKKworICBsZW4gPSBhMmRfQVNOMV9PQkpFQ1QoTlVMTCwgMCwgb2lkLCAtMSk7CisgIGlmIChsZW4gPD0gMCkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgYnVmID0gT1BFTlNTTF9tYWxsb2MobGVuKTsKKyAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoT0JKLCBPQkpfY3JlYXRlLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgZ290byBlcnI7CisgIH0KKworICBsZW4gPSBhMmRfQVNOMV9PQkpFQ1QoYnVmLCBsZW4sIG9pZCwgLTEpOworICBpZiAobGVuID09IDApIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIG9wID0gKEFTTjFfT0JKRUNUICopQVNOMV9PQkpFQ1RfY3JlYXRlKG9ial9uZXh0X25pZCgpLCBidWYsIGxlbiwgc2hvcnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ19uYW1lKTsKKyAgaWYgKG9wID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmIChvYmpfYWRkX29iamVjdChvcCkpIHsKKyAgICByZXQgPSBvcC0+bmlkOworICB9CisgIG9wID0gTlVMTDsKKworZXJyOgorICBpZiAob3AgIT0gTlVMTCkgeworICAgIEFTTjFfT0JKRUNUX2ZyZWUob3ApOworICB9CisgIGlmIChidWYgIT0gTlVMTCkgeworICAgIE9QRU5TU0xfZnJlZShidWYpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2NyeXB0by9vYmovb2JqLmggYi9jcnlwdG8vb2JqL29iai5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOTc3MmEKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vb2JqL29iai5oCkBAIC0wLDAgKzEsMTkzIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaWZuZGVmIE9QRU5TU0xfSEVBREVSX09CSkVDVFNfSAorI2RlZmluZSBPUEVOU1NMX0hFQURFUl9PQkpFQ1RTX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvYmFzZS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9vYmpfbWFjLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBUaGUgb2JqZWN0cyBsaWJyYXJ5IGRlYWxzIHdpdGggdGhlIHJlZ2lzdHJhdGlvbiBhbmQgaW5kZXhpbmcgb2YgQVNOLjEgb2JqZWN0CisgKiBpZGVudGlmaWVycy4gVGhlc2UgdmFsdWVzIGFyZSBvZnRlbiB3cml0dGVuIGFzIGEgZG90dGVkIHNlcXVlbmNlIG9mIG51bWJlcnMsCisgKiBlLmcuIDEuMi44NDAuMTEzNTQ5LjEuOS4xNi4zLjkuCisgKgorICogSW50ZXJuYWxseSwgT3BlblNTTCBsaWtlcyB0byBkZWFsIHdpdGggdGhlc2UgdmFsdWVzIGJ5IG51bWJlcmluZyB0aGVtIHdpdGgKKyAqIG51bWJlcnMgY2FsbGVkICJuaWRzIi4gT3BlblNTTCBoYXMgYSBsYXJnZSwgYnVpbHQtaW4gZGF0YWJhc2Ugb2YgY29tbW9uCisgKiBvYmplY3QgaWRlbnRpZmllcnMgYW5kIGFsc28gaGFzIGJvdGggc2hvcnQgYW5kIGxvbmcgbmFtZXMgZm9yIHRoZW0uCisgKgorICogVGhpcyBsaWJyYXJ5IHByb3ZpZGVzIGZ1bmN0aW9ucyBmb3IgdHJhbnNsYXRpbmcgYmV0d2VlbiBvYmplY3QgaWRlbnRpZmllcnMsCisgKiBuaWRzLCBzaG9ydCBuYW1lcyBhbmQgbG9uZyBuYW1lcy4KKyAqCisgKiBUaGUgbmlkIHZhbHVlcyBzaG91bGQgbm90IGJlIHVzZWQgb3V0c2lkZSBvZiBhIHNpbmdsZSBwcm9jZXNzOiB0aGV5IGFyZSBub3QKKyAqIHN0YWJsZSBpZGVudGlmaWVycy4gKi8KKworCisvKiBCYXNpYyBvcGVyYXRpb25zLiAqLworCisvKiBPQkpfZHVwIHJldHVybnMgYSBkdXBsaWNhdGUgY29weSBvZiB8b2JqfCBvciBOVUxMIG9uIGFsbG9jYXRpb24gZmFpbHVyZS4gKi8KK0FTTjFfT0JKRUNUICpPQkpfZHVwKGNvbnN0IEFTTjFfT0JKRUNUICpvYmopOworCisvKiBPQkpfY21wIHJldHVybnMgYSB2YWx1ZSBsZXNzIHRoYW4sIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbiB6ZXJvIGlmIHxhfCBpcworICogbGVzcyB0aGFuLCBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4gfGJ8LCByZXNwZWN0aXZlbHkuICovCitpbnQgT0JKX2NtcChjb25zdCBBU04xX09CSkVDVCAqYSwgY29uc3QgQVNOMV9PQkpFQ1QgKmIpOworCisKKy8qIExvb2tpbmcgdXAgbmlkcy4gKi8KKworLyogT0JKX29iajJuaWQgcmV0dXJucyB0aGUgbmlkIGNvcnJlc3BvbmRpbmcgdG8gfG9ianwsIG9yIHxOSURfdW5kZWZ8IGlmIG5vCisgKiBzdWNoIG9iamVjdCBpcyBrbm93bi4gKi8KK2ludCBPQkpfb2JqMm5pZChjb25zdCBBU04xX09CSkVDVCAqb2JqKTsKKworLyogT0JKX2NiczJuaWQgcmV0dXJucyB0aGUgbmlkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIERFUiBkYXRhIGluIHxjYnN8LCBvcgorICogfE5JRF91bmRlZnwgaWYgbm8gc3VjaCBvYmplY3QgaXMga25vd24uICovCitpbnQgT0JKX2NiczJuaWQoY29uc3QgQ0JTICpjYnMpOworCisvKiBPQkpfc24ybmlkIHJldHVybnMgdGhlIG5pZCBjb3JyZXNwb25kaW5nIHRvIHxzaG9ydF9uYW1lfCwgb3IgfE5JRF91bmRlZnwgaWYKKyAqIG5vIHN1Y2ggc2hvcnQgbmFtZSBpcyBrbm93bi4gKi8KK2ludCBPQkpfc24ybmlkKGNvbnN0IGNoYXIgKnNob3J0X25hbWUpOworCisvKiBPQkpfbG4ybmlkIHJldHVybnMgdGhlIG5pZCBjb3JyZXNwb25kaW5nIHRvIHxsb25nX25hbWV8LCBvciB8TklEX3VuZGVmfCBpZgorICogbm8gc3VjaCBsb25nIG5hbWUgaXMga25vd24uICovCitpbnQgT0JKX2xuMm5pZChjb25zdCBjaGFyICpsb25nX25hbWUpOworCisvKiBPQkpfdHh0Mm5pZCByZXR1cm5zIHRoZSBuaWQgY29ycmVzcG9uZGluZyB0byB8c3wsIHdoaWNoIG1heSBiZSBhIHNob3J0IG5hbWUsCisgKiBsb25nIG5hbWUsIG9yIGFuIEFTQ0lJIHN0cmluZyBjb250YWluaW5nIGEgZG90dGVkIHNlcXVlbmNlIG9mIG51bWJlcnMuIEl0CisgKiByZXR1cm5zIHRoZSBuaWQgb3IgTklEX3VuZGVmIGlmIHVua25vd24uICovCitpbnQgT0JKX3R4dDJuaWQoY29uc3QgY2hhciAqcyk7CisKKworLyogR2V0dGluZyBpbmZvcm1hdGlvbiBhYm91dCBuaWRzLiAqLworCisvKiBPQkpfbmlkMm9iaiByZXR1cm5zIHRoZSBBU04xX09CSkVDVCBjb3JyZXNwb25kaW5nIHRvIHxuaWR8LCBvciBOVUxMIGlmIHxuaWR8CisgKiBpcyB1bmtub3duLiAqLworY29uc3QgQVNOMV9PQkpFQ1QgKk9CSl9uaWQyb2JqKGludCBuaWQpOworCisvKiBPQkpfbmlkMnNuIHJldHVybnMgdGhlIHNob3J0IG5hbWUgZm9yIHxuaWR8LCBvciBOVUxMIGlmIHxuaWR8IGlzIHVua25vd24uICovCitjb25zdCBjaGFyICpPQkpfbmlkMnNuKGludCBuaWQpOworCisvKiBPQkpfbmlkMnNuIHJldHVybnMgdGhlIGxvbmcgbmFtZSBmb3IgfG5pZHwsIG9yIE5VTEwgaWYgfG5pZHwgaXMgdW5rbm93bi4gKi8KK2NvbnN0IGNoYXIgKk9CSl9uaWQybG4oaW50IG5pZCk7CisKKworLyogRGVhbGluZyB3aXRoIHRleHR1YWwgcmVwcmVzZW50YXRpb25zIG9mIG9iamVjdCBpZGVudGlmaWVycy4gKi8KKworLyogT0JKX3R4dDJvYmogcmV0dXJucyBhbiBBU04xX09CSkVDVCBmb3IgdGhlIHRleHR1YWwgcmVzcHJlc2VudGF0aW9uIGluIHxzfC4KKyAqIElmIHxkb250X3NlYXJjaF9uYW1lc3wgaXMgemVybywgdGhlbiB8c3wgd2lsbCBiZSBtYXRjaGVkIGFnYWluc3QgdGhlIGxvbmcKKyAqIGFuZCBzaG9ydCBuYW1lcyBvZiBhIGtub3duIG9iamVjdHMgdG8gZmluZCBhIG1hdGNoLiBPdGhlcndpc2UgfHN8IG11c3QKKyAqIGNvbnRhaW4gYW4gQVNDSUkgc3RyaW5nIHdpdGggYSBkb3R0ZWQgc2VxdWVuY2Ugb2YgbnVtYmVycy4gVGhlIHJlc3VsdGluZworICogb2JqZWN0IG5lZWQgbm90IGJlIHByZXZpb3VzbHkga25vd24uIEl0IHJldHVybnMgTlVMTCBvbiBlcnJvci4gKi8KK0FTTjFfT0JKRUNUICpPQkpfdHh0Mm9iaihjb25zdCBjaGFyICpzLCBpbnQgZG9udF9zZWFyY2hfbmFtZXMpOworCisvKiBPQkpfb2JqMnR4dCBjb252ZXJ0cyB8b2JqfCB0byBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24uIElmCisgKiB8ZG9udF9yZXR1cm5fbmFtZXwgaXMgemVybyB0aGVuIHxvYmp8IHdpbGwgYmUgbWF0Y2hlZCBhZ2FpbnN0IGtub3duIG9iamVjdHMKKyAqIGFuZCB0aGUgbG9uZyAocHJlZmVyYWJseSkgb3Igc2hvcnQgbmFtZSB3aWxsIGJlIHVzZWQgaWYgZm91bmQuIE90aGVyd2lzZQorICogfG9ianwgd2lsbCBiZSBjb252ZXJ0ZWQgaW50byBhIGRvdHRlZCBzZXF1ZW5jZSBvZiBpbnRlZ2Vycy4gSWYgfG91dHwgaXMgbm90CisgKiBOVUxMLCB0aGVuIGF0IG1vc3QgfG91dF9sZW58IGJ5dGVzIG9mIHRoZSB0ZXh0dWFsIGZvcm0gd2lsbCBiZSB3cml0dGVuCisgKiB0aGVyZS4gSWYgfG91dF9sZW58IGlzIGF0IGxlYXN0IG9uZSwgdGhlbiBzdHJpbmcgd3JpdHRlbiB0byB8b3V0fCB3aWxsCisgKiBhbHdheXMgYmUgTlVMIHRlcm1pbmF0ZWQuIEl0IHJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgY291bGQKKyAqIGhhdmUgYmVlbiB3cml0dGVuLCBub3QgaW5jbHVkaW5nIHRoZSBmaW5hbCBOVUwsIG9yIC0xIG9uIGVycm9yLiAqLworaW50IE9CSl9vYmoydHh0KGNoYXIgKm91dCwgaW50IG91dF9sZW4sIGNvbnN0IEFTTjFfT0JKRUNUICpvYmosCisgICAgICAgICAgICAgICAgaW50IGRvbnRfcmV0dXJuX25hbWUpOworCisKKy8qIEFkZGluZyBvYmplY3RzIGF0IHJ1bnRpbWUuICovCisKKy8qIE9CSl9jcmVhdGUgYWRkcyBhIGtub3duIG9iamVjdCBhbmQgcmV0dXJucyB0aGUgbmlkIG9mIHRoZSBuZXcgb2JqZWN0LCBvcgorICogTklEX3VuZGVmIG9uIGVycm9yLiAqLworaW50IE9CSl9jcmVhdGUoY29uc3QgY2hhciAqb2lkLCBjb25zdCBjaGFyICpzaG9ydF9uYW1lLCBjb25zdCBjaGFyICpsb25nX25hbWUpOworCisKKy8qIEhhbmRsaW5nIHNpZ25hdHVyZSBhbGdvcml0aG0gaWRlbnRpZmllcnMuCisgKgorICogU29tZSBOSURzIChlLmcuIHNoYTI1NldpdGhSU0FFbmNyeXB0aW9uKSBzcGVjaWZ5IGJvdGggYSBkaWdlc3QgYWxnb3JpdGhtIGFuZAorICogYSBwdWJsaWMga2V5IGFsZ29yaXRobS4gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgbWFwIGJldHdlZW4gcGFpcnMgb2YgZGlnZXN0CisgKiBhbmQgcHVibGljLWtleSBhbGdvcml0aG1zIGFuZCB0aGUgTklEcyB0aGF0IHNwZWNpZnkgdGhlaXIgY29tYmluYXRpb24uCisgKgorICogU29tZXRpbWVzIHRoZSBjb21iaW5hdGlvbiBOSUQgbGVhdmVzIHRoZSBkaWdlc3QgdW5zcGVjaWZpZWQgKGUuZy4KKyAqIHJzYXNzYVBzcykuIEluIHRoZXNlIGNhc2VzLCB0aGUgZGlnZXN0IE5JRCBpcyB8TklEX3VuZGVmfC4gKi8KKworLyogT0JKX2ZpbmRfc2lnaWRfYWxncyBmaW5kcyB0aGUgZGlnZXN0IGFuZCBwdWJsaWMta2V5IE5JRHMgdGhhdCBjb3JyZXNwb25kIHRvCisgKiB0aGUgc2lnbmluZyBhbGdvcml0aG0gfHNpZ25fbmlkfC4gSWYgc3VjY2Vzc2Z1bCwgaXQgc2V0cyB8Km91dF9kaWdlc3RfbmlkfAorICogYW5kIHwqb3V0X3BrZXlfbmlkfCBhbmQgcmV0dXJucyBvbmUuIE90aGVyd2lzZSBpdCByZXR1cm5zIHplcm8uIEFueSBvZgorICogfG91dF9kaWdlc3RfbmlkfCBvciB8b3V0X3BrZXlfbmlkfCBjYW4gYmUgTlVMTCBpZiB0aGUgY2FsbGVyIGRvZXNuJ3QgbmVlZAorICogdGhhdCBvdXRwdXQgdmFsdWUuICovCitpbnQgT0JKX2ZpbmRfc2lnaWRfYWxncyhpbnQgc2lnbl9uaWQsIGludCAqb3V0X2RpZ2VzdF9uaWQsIGludCAqb3V0X3BrZXlfbmlkKTsKKworLyogT0JKX2ZpbmRfc2lnaWRfYnlfYWxncyBmaW5kcyB0aGUgc2lnbmF0dXJlIE5JRCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZQorICogY29tYmluYXRpb24gb2YgfGRpZ2VzdF9uaWR8IGFuZCB8cGtleV9uaWR8LiBJZiBzdWNjZXNzLCBpdCBzZXRzCisgKiB8Km91dF9zaWduX25pZHwgYW5kIHJldHVybnMgb25lLiBPdGhlcndpc2UgaXQgcmV0dXJucyB6ZXJvLiBUaGUKKyAqIHxvdXRfc2lnbl9uaWR8IGFyZ3VtZW50IGNhbiBiZSBOVUxMIGlmIHRoZSBjYWxsZXIgb25seSB3aXNoZXMgdG8gbGVhcm4KKyAqIHdoZXRoZXIgdGhlIGNvbWJpbmF0aW9uIGlzIHZhbGlkLiAqLworaW50IE9CSl9maW5kX3NpZ2lkX2J5X2FsZ3MoaW50ICpvdXRfc2lnbl9uaWQsIGludCBkaWdlc3RfbmlkLCBpbnQgcGtleV9uaWQpOworCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfSAgLyogZXh0ZXJuIEMgKi8KKyNlbmRpZgorCisjZGVmaW5lIE9CSl9GX09CSl90eHQyb2JqIDEwMAorI2RlZmluZSBPQkpfRl9PQkpfY3JlYXRlIDEwMQorI2RlZmluZSBPQkpfRl9PQkpfZHVwIDEwMgorI2RlZmluZSBPQkpfRl9PQkpfbmlkMm9iaiAxMDMKKyNkZWZpbmUgT0JKX1JfVU5LTk9XTl9OSUQgMTAwCisKKyNlbmRpZiAgLyogT1BFTlNTTF9IRUFERVJfT0JKRUNUU19IICovCmRpZmYgLS1naXQgYS9jcnlwdG8vb2JqL29ial9kYXQuaCBiL2NyeXB0by9vYmovb2JqX2RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NjNmNWQKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vb2JqL29ial9kYXQuaApAQCAtMCwwICsxLDUyNzUgQEAKKy8qIGNyeXB0by9vYmplY3RzL29ial9kYXQuaCAqLworCisvKiBUSElTIEZJTEUgSVMgR0VORVJBVEVEIEZST00gb2JqZWN0cy5oIGJ5IG9ial9kYXQucGwgdmlhIHRoZQorICogZm9sbG93aW5nIGNvbW1hbmQ6CisgKiBwZXJsIG9ial9kYXQucGwgb2JqX21hYy5oIG9ial9kYXQuaAorICovCisKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk3IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2RlZmluZSBOVU1fTklEIDk1MQorI2RlZmluZSBOVU1fU04gOTQxCisjZGVmaW5lIE5VTV9MTiA5NDEKKyNkZWZpbmUgTlVNX09CSiA4ODMKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbHZhbHVlc1s2MTg4XT17CisweDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbICAwXSBPQkpfdW5kZWYgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELCAgICAgICAgICAgICAgIC8qIFsgIDFdIE9CSl9yc2Fkc2kgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsICAgICAgICAgIC8qIFsgIDddIE9CSl9wa2NzICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAyLDB4MDIsICAgICAvKiBbIDE0XSBPQkpfbWQyICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAyLDB4MDUsICAgICAvKiBbIDIyXSBPQkpfbWQ1ICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAzLDB4MDQsICAgICAvKiBbIDMwXSBPQkpfcmM0ICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDEsMHgwMSwvKiBbIDM4XSBPQkpfcnNhRW5jcnlwdGlvbiAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDAxLDB4MDIsLyogWyA0N10gT0JKX21kMldpdGhSU0FFbmNyeXB0aW9uICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDEsMHgwNCwvKiBbIDU2XSBPQkpfbWQ1V2l0aFJTQUVuY3J5cHRpb24gKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwNSwweDAxLC8qIFsgNjVdIE9CSl9wYmVXaXRoTUQyQW5kREVTX0NCQyAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA1LDB4MDMsLyogWyA3NF0gT0JKX3BiZVdpdGhNRDVBbmRERVNfQ0JDICovCisweDU1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbIDgzXSBPQkpfWDUwMCAqLworMHg1NSwweDA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWyA4NF0gT0JKX1g1MDkgKi8KKzB4NTUsMHgwNCwweDAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFsgODZdIE9CSl9jb21tb25OYW1lICovCisweDU1LDB4MDQsMHgwNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbIDg5XSBPQkpfY291bnRyeU5hbWUgKi8KKzB4NTUsMHgwNCwweDA3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFsgOTJdIE9CSl9sb2NhbGl0eU5hbWUgKi8KKzB4NTUsMHgwNCwweDA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFsgOTVdIE9CSl9zdGF0ZU9yUHJvdmluY2VOYW1lICovCisweDU1LDB4MDQsMHgwQSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbIDk4XSBPQkpfb3JnYW5pemF0aW9uTmFtZSAqLworMHg1NSwweDA0LDB4MEIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzEwMV0gT0JKX29yZ2FuaXphdGlvbmFsVW5pdE5hbWUgKi8KKzB4NTUsMHgwOCwweDAxLDB4MDEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFsxMDRdIE9CSl9yc2EgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwNywgICAgIC8qIFsxMDhdIE9CSl9wa2NzNyAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA3LDB4MDEsLyogWzExNl0gT0JKX3BrY3M3X2RhdGEgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwNywweDAyLC8qIFsxMjVdIE9CSl9wa2NzN19zaWduZWQgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwNywweDAzLC8qIFsxMzRdIE9CSl9wa2NzN19lbnZlbG9wZWQgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwNywweDA0LC8qIFsxNDNdIE9CSl9wa2NzN19zaWduZWRBbmRFbnZlbG9wZWQgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwNywweDA1LC8qIFsxNTJdIE9CSl9wa2NzN19kaWdlc3QgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwNywweDA2LC8qIFsxNjFdIE9CSl9wa2NzN19lbmNyeXB0ZWQgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwMywgICAgIC8qIFsxNzBdIE9CSl9wa2NzMyAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDAzLDB4MDEsLyogWzE3OF0gT0JKX2RoS2V5QWdyZWVtZW50ICovCisweDJCLDB4MEUsMHgwMywweDAyLDB4MDYsICAgICAgICAgICAgICAgICAgICAvKiBbMTg3XSBPQkpfZGVzX2VjYiAqLworMHgyQiwweDBFLDB4MDMsMHgwMiwweDA5LCAgICAgICAgICAgICAgICAgICAgLyogWzE5Ml0gT0JKX2Rlc19jZmI2NCAqLworMHgyQiwweDBFLDB4MDMsMHgwMiwweDA3LCAgICAgICAgICAgICAgICAgICAgLyogWzE5N10gT0JKX2Rlc19jYmMgKi8KKzB4MkIsMHgwRSwweDAzLDB4MDIsMHgxMSwgICAgICAgICAgICAgICAgICAgIC8qIFsyMDJdIE9CSl9kZXNfZWRlX2VjYiAqLworMHgyQiwweDA2LDB4MDEsMHgwNCwweDAxLDB4ODEsMHgzQywweDA3LDB4MDEsMHgwMSwweDAyLC8qIFsyMDddIE9CSl9pZGVhX2NiYyAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMywweDAyLCAgICAgLyogWzIxOF0gT0JKX3JjMl9jYmMgKi8KKzB4MkIsMHgwRSwweDAzLDB4MDIsMHgxMiwgICAgICAgICAgICAgICAgICAgIC8qIFsyMjZdIE9CSl9zaGEgKi8KKzB4MkIsMHgwRSwweDAzLDB4MDIsMHgwRiwgICAgICAgICAgICAgICAgICAgIC8qIFsyMzFdIE9CSl9zaGFXaXRoUlNBRW5jcnlwdGlvbiAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMywweDA3LCAgICAgLyogWzIzNl0gT0JKX2Rlc19lZGUzX2NiYyAqLworMHgyQiwweDBFLDB4MDMsMHgwMiwweDA4LCAgICAgICAgICAgICAgICAgICAgLyogWzI0NF0gT0JKX2Rlc19vZmI2NCAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LCAgICAgLyogWzI0OV0gT0JKX3BrY3M5ICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgwMSwvKiBbMjU3XSBPQkpfcGtjczlfZW1haWxBZGRyZXNzICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgwMiwvKiBbMjY2XSBPQkpfcGtjczlfdW5zdHJ1Y3R1cmVkTmFtZSAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MDMsLyogWzI3NV0gT0JKX3BrY3M5X2NvbnRlbnRUeXBlICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgwNCwvKiBbMjg0XSBPQkpfcGtjczlfbWVzc2FnZURpZ2VzdCAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MDUsLyogWzI5M10gT0JKX3BrY3M5X3NpZ25pbmdUaW1lICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgwNiwvKiBbMzAyXSBPQkpfcGtjczlfY291bnRlcnNpZ25hdHVyZSAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MDcsLyogWzMxMV0gT0JKX3BrY3M5X2NoYWxsZW5nZVBhc3N3b3JkICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgwOCwvKiBbMzIwXSBPQkpfcGtjczlfdW5zdHJ1Y3R1cmVkQWRkcmVzcyAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MDksLyogWzMyOV0gT0JKX3BrY3M5X2V4dENlcnRBdHRyaWJ1dGVzICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4ODYsMHhGOCwweDQyLCAgICAgICAgICAvKiBbMzM4XSBPQkpfbmV0c2NhcGUgKi8KKzB4NjAsMHg4NiwweDQ4LDB4MDEsMHg4NiwweEY4LDB4NDIsMHgwMSwgICAgIC8qIFszNDVdIE9CSl9uZXRzY2FwZV9jZXJ0X2V4dGVuc2lvbiAqLworMHg2MCwweDg2LDB4NDgsMHgwMSwweDg2LDB4RjgsMHg0MiwweDAyLCAgICAgLyogWzM1M10gT0JKX25ldHNjYXBlX2RhdGFfdHlwZSAqLworMHgyQiwweDBFLDB4MDMsMHgwMiwweDFBLCAgICAgICAgICAgICAgICAgICAgLyogWzM2MV0gT0JKX3NoYTEgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwMSwweDA1LC8qIFszNjZdIE9CSl9zaGExV2l0aFJTQUVuY3J5cHRpb24gKi8KKzB4MkIsMHgwRSwweDAzLDB4MDIsMHgwRCwgICAgICAgICAgICAgICAgICAgIC8qIFszNzVdIE9CSl9kc2FXaXRoU0hBICovCisweDJCLDB4MEUsMHgwMywweDAyLDB4MEMsICAgICAgICAgICAgICAgICAgICAvKiBbMzgwXSBPQkpfZHNhXzIgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwNSwweDBCLC8qIFszODVdIE9CSl9wYmVXaXRoU0hBMUFuZFJDMl9DQkMgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwNSwweDBDLC8qIFszOTRdIE9CSl9pZF9wYmtkZjIgKi8KKzB4MkIsMHgwRSwweDAzLDB4MDIsMHgxQiwgICAgICAgICAgICAgICAgICAgIC8qIFs0MDNdIE9CSl9kc2FXaXRoU0hBMV8yICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4ODYsMHhGOCwweDQyLDB4MDEsMHgwMSwvKiBbNDA4XSBPQkpfbmV0c2NhcGVfY2VydF90eXBlICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4ODYsMHhGOCwweDQyLDB4MDEsMHgwMiwvKiBbNDE3XSBPQkpfbmV0c2NhcGVfYmFzZV91cmwgKi8KKzB4NjAsMHg4NiwweDQ4LDB4MDEsMHg4NiwweEY4LDB4NDIsMHgwMSwweDAzLC8qIFs0MjZdIE9CSl9uZXRzY2FwZV9yZXZvY2F0aW9uX3VybCAqLworMHg2MCwweDg2LDB4NDgsMHgwMSwweDg2LDB4RjgsMHg0MiwweDAxLDB4MDQsLyogWzQzNV0gT0JKX25ldHNjYXBlX2NhX3Jldm9jYXRpb25fdXJsICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4ODYsMHhGOCwweDQyLDB4MDEsMHgwNywvKiBbNDQ0XSBPQkpfbmV0c2NhcGVfcmVuZXdhbF91cmwgKi8KKzB4NjAsMHg4NiwweDQ4LDB4MDEsMHg4NiwweEY4LDB4NDIsMHgwMSwweDA4LC8qIFs0NTNdIE9CSl9uZXRzY2FwZV9jYV9wb2xpY3lfdXJsICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4ODYsMHhGOCwweDQyLDB4MDEsMHgwQywvKiBbNDYyXSBPQkpfbmV0c2NhcGVfc3NsX3NlcnZlcl9uYW1lICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4ODYsMHhGOCwweDQyLDB4MDEsMHgwRCwvKiBbNDcxXSBPQkpfbmV0c2NhcGVfY29tbWVudCAqLworMHg2MCwweDg2LDB4NDgsMHgwMSwweDg2LDB4RjgsMHg0MiwweDAyLDB4MDUsLyogWzQ4MF0gT0JKX25ldHNjYXBlX2NlcnRfc2VxdWVuY2UgKi8KKzB4NTUsMHgxRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0ODldIE9CSl9pZF9jZSAqLworMHg1NSwweDFELDB4MEUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQ5MV0gT0JKX3N1YmplY3Rfa2V5X2lkZW50aWZpZXIgKi8KKzB4NTUsMHgxRCwweDBGLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0OTRdIE9CSl9rZXlfdXNhZ2UgKi8KKzB4NTUsMHgxRCwweDEwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0OTddIE9CSl9wcml2YXRlX2tleV91c2FnZV9wZXJpb2QgKi8KKzB4NTUsMHgxRCwweDExLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1MDBdIE9CSl9zdWJqZWN0X2FsdF9uYW1lICovCisweDU1LDB4MUQsMHgxMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTAzXSBPQkpfaXNzdWVyX2FsdF9uYW1lICovCisweDU1LDB4MUQsMHgxMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTA2XSBPQkpfYmFzaWNfY29uc3RyYWludHMgKi8KKzB4NTUsMHgxRCwweDE0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1MDldIE9CSl9jcmxfbnVtYmVyICovCisweDU1LDB4MUQsMHgyMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTEyXSBPQkpfY2VydGlmaWNhdGVfcG9saWNpZXMgKi8KKzB4NTUsMHgxRCwweDIzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1MTVdIE9CSl9hdXRob3JpdHlfa2V5X2lkZW50aWZpZXIgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDQsMHgwMSwweDk3LDB4NTUsMHgwMSwweDAyLC8qIFs1MThdIE9CSl9iZl9jYmMgKi8KKzB4NTUsMHgwOCwweDAzLDB4NjUsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1MjddIE9CSl9tZGMyICovCisweDU1LDB4MDgsMHgwMywweDY0LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTMxXSBPQkpfbWRjMldpdGhSU0EgKi8KKzB4NTUsMHgwNCwweDJBLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1MzVdIE9CSl9naXZlbk5hbWUgKi8KKzB4NTUsMHgwNCwweDA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1MzhdIE9CSl9zdXJuYW1lICovCisweDU1LDB4MDQsMHgyQiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTQxXSBPQkpfaW5pdGlhbHMgKi8KKzB4NTUsMHgxRCwweDFGLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1NDRdIE9CSl9jcmxfZGlzdHJpYnV0aW9uX3BvaW50cyAqLworMHgyQiwweDBFLDB4MDMsMHgwMiwweDAzLCAgICAgICAgICAgICAgICAgICAgLyogWzU0N10gT0JKX21kNVdpdGhSU0EgKi8KKzB4NTUsMHgwNCwweDA1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1NTJdIE9CSl9zZXJpYWxOdW1iZXIgKi8KKzB4NTUsMHgwNCwweDBDLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1NTVdIE9CSl90aXRsZSAqLworMHg1NSwweDA0LDB4MEQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzU1OF0gT0JKX2Rlc2NyaXB0aW9uICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjYsMHg3RCwweDA3LDB4NDIsMHgwQSwvKiBbNTYxXSBPQkpfY2FzdDVfY2JjICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjYsMHg3RCwweDA3LDB4NDIsMHgwQywvKiBbNTcwXSBPQkpfcGJlV2l0aE1ENUFuZENhc3Q1X0NCQyAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDM4LDB4MDQsMHgwMywgICAgICAgICAgLyogWzU3OV0gT0JKX2RzYVdpdGhTSEExICovCisweDJCLDB4MEUsMHgwMywweDAyLDB4MUQsICAgICAgICAgICAgICAgICAgICAvKiBbNTg2XSBPQkpfc2hhMVdpdGhSU0EgKi8KKzB4MkEsMHg4NiwweDQ4LDB4Q0UsMHgzOCwweDA0LDB4MDEsICAgICAgICAgIC8qIFs1OTFdIE9CSl9kc2EgKi8KKzB4MkIsMHgyNCwweDAzLDB4MDIsMHgwMSwgICAgICAgICAgICAgICAgICAgIC8qIFs1OThdIE9CSl9yaXBlbWQxNjAgKi8KKzB4MkIsMHgyNCwweDAzLDB4MDMsMHgwMSwweDAyLCAgICAgICAgICAgICAgIC8qIFs2MDNdIE9CSl9yaXBlbWQxNjBXaXRoUlNBICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAzLDB4MDgsICAgICAvKiBbNjA5XSBPQkpfcmM1X2NiYyAqLworMHgyOSwweDAxLDB4MDEsMHg4NSwweDFBLDB4MDEsICAgICAgICAgICAgICAgLyogWzYxN10gT0JKX3JsZV9jb21wcmVzc2lvbiAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMywweDA4LC8qIFs2MjNdIE9CSl96bGliX2NvbXByZXNzaW9uICovCisweDU1LDB4MUQsMHgyNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNjM0XSBPQkpfZXh0X2tleV91c2FnZSAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsICAgICAgICAgICAgICAgLyogWzYzN10gT0JKX2lkX3BraXggKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDMsICAgICAgICAgIC8qIFs2NDNdIE9CSl9pZF9rcCAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwMywweDAxLCAgICAgLyogWzY1MF0gT0JKX3NlcnZlcl9hdXRoICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDAzLDB4MDIsICAgICAvKiBbNjU4XSBPQkpfY2xpZW50X2F1dGggKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDMsMHgwMywgICAgIC8qIFs2NjZdIE9CSl9jb2RlX3NpZ24gKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDMsMHgwNCwgICAgIC8qIFs2NzRdIE9CSl9lbWFpbF9wcm90ZWN0ICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDAzLDB4MDgsICAgICAvKiBbNjgyXSBPQkpfdGltZV9zdGFtcCAqLworMHgyQiwweDA2LDB4MDEsMHgwNCwweDAxLDB4ODIsMHgzNywweDAyLDB4MDEsMHgxNSwvKiBbNjkwXSBPQkpfbXNfY29kZV9pbmQgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDQsMHgwMSwweDgyLDB4MzcsMHgwMiwweDAxLDB4MTYsLyogWzcwMF0gT0JKX21zX2NvZGVfY29tICovCisweDJCLDB4MDYsMHgwMSwweDA0LDB4MDEsMHg4MiwweDM3LDB4MEEsMHgwMywweDAxLC8qIFs3MTBdIE9CSl9tc19jdGxfc2lnbiAqLworMHgyQiwweDA2LDB4MDEsMHgwNCwweDAxLDB4ODIsMHgzNywweDBBLDB4MDMsMHgwMywvKiBbNzIwXSBPQkpfbXNfc2djICovCisweDJCLDB4MDYsMHgwMSwweDA0LDB4MDEsMHg4MiwweDM3LDB4MEEsMHgwMywweDA0LC8qIFs3MzBdIE9CSl9tc19lZnMgKi8KKzB4NjAsMHg4NiwweDQ4LDB4MDEsMHg4NiwweEY4LDB4NDIsMHgwNCwweDAxLC8qIFs3NDBdIE9CSl9uc19zZ2MgKi8KKzB4NTUsMHgxRCwweDFCLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs3NDldIE9CSl9kZWx0YV9jcmwgKi8KKzB4NTUsMHgxRCwweDE1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs3NTJdIE9CSl9jcmxfcmVhc29uICovCisweDU1LDB4MUQsMHgxOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNzU1XSBPQkpfaW52YWxpZGl0eV9kYXRlICovCisweDJCLDB4NjUsMHgwMSwweDA0LDB4MDEsICAgICAgICAgICAgICAgICAgICAvKiBbNzU4XSBPQkpfc3huZXQgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwQywweDAxLDB4MDEsLyogWzc2M10gT0JKX3BiZV9XaXRoU0hBMUFuZDEyOEJpdFJDNCAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDBDLDB4MDEsMHgwMiwvKiBbNzczXSBPQkpfcGJlX1dpdGhTSEExQW5kNDBCaXRSQzQgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwQywweDAxLDB4MDMsLyogWzc4M10gT0JKX3BiZV9XaXRoU0hBMUFuZDNfS2V5X1RyaXBsZURFU19DQkMgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwQywweDAxLDB4MDQsLyogWzc5M10gT0JKX3BiZV9XaXRoU0hBMUFuZDJfS2V5X1RyaXBsZURFU19DQkMgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwQywweDAxLDB4MDUsLyogWzgwM10gT0JKX3BiZV9XaXRoU0hBMUFuZDEyOEJpdFJDMl9DQkMgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwQywweDAxLDB4MDYsLyogWzgxM10gT0JKX3BiZV9XaXRoU0hBMUFuZDQwQml0UkMyX0NCQyAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDBDLDB4MEEsMHgwMSwweDAxLC8qIFs4MjNdIE9CSl9rZXlCYWcgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwQywweDBBLDB4MDEsMHgwMiwvKiBbODM0XSBPQkpfcGtjczhTaHJvdWRlZEtleUJhZyAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDBDLDB4MEEsMHgwMSwweDAzLC8qIFs4NDVdIE9CSl9jZXJ0QmFnICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MEMsMHgwQSwweDAxLDB4MDQsLyogWzg1Nl0gT0JKX2NybEJhZyAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDBDLDB4MEEsMHgwMSwweDA1LC8qIFs4NjddIE9CSl9zZWNyZXRCYWcgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwQywweDBBLDB4MDEsMHgwNiwvKiBbODc4XSBPQkpfc2FmZUNvbnRlbnRzQmFnICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxNCwvKiBbODg5XSBPQkpfZnJpZW5kbHlOYW1lICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxNSwvKiBbODk4XSBPQkpfbG9jYWxLZXlJRCAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTYsMHgwMSwvKiBbOTA3XSBPQkpfeDUwOUNlcnRpZmljYXRlICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxNiwweDAyLC8qIFs5MTddIE9CSl9zZHNpQ2VydGlmaWNhdGUgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDE3LDB4MDEsLyogWzkyN10gT0JKX3g1MDlDcmwgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwNSwweDBELC8qIFs5MzddIE9CSl9wYmVzMiAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA1LDB4MEUsLyogWzk0Nl0gT0JKX3BibWFjMSAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMiwweDA3LCAgICAgLyogWzk1NV0gT0JKX2htYWNXaXRoU0hBMSAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwMiwweDAxLCAgICAgLyogWzk2M10gT0JKX2lkX3F0X2NwcyAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwMiwweDAyLCAgICAgLyogWzk3MV0gT0JKX2lkX3F0X3Vub3RpY2UgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDBGLC8qIFs5NzldIE9CSl9TTUlNRUNhcGFiaWxpdGllcyAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA1LDB4MDQsLyogWzk4OF0gT0JKX3BiZVdpdGhNRDJBbmRSQzJfQ0JDICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDUsMHgwNiwvKiBbOTk3XSBPQkpfcGJlV2l0aE1ENUFuZFJDMl9DQkMgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwNSwweDBBLC8qIFsxMDA2XSBPQkpfcGJlV2l0aFNIQTFBbmRERVNfQ0JDICovCisweDJCLDB4MDYsMHgwMSwweDA0LDB4MDEsMHg4MiwweDM3LDB4MDIsMHgwMSwweDBFLC8qIFsxMDE1XSBPQkpfbXNfZXh0X3JlcSAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MEUsLyogWzEwMjVdIE9CSl9leHRfcmVxICovCisweDU1LDB4MDQsMHgyOSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMTAzNF0gT0JKX25hbWUgKi8KKzB4NTUsMHgwNCwweDJFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFsxMDM3XSBPQkpfZG5RdWFsaWZpZXIgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDEsICAgICAgICAgIC8qIFsxMDQwXSBPQkpfaWRfcGUgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MzAsICAgICAgICAgIC8qIFsxMDQ3XSBPQkpfaWRfYWQgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDEsMHgwMSwgICAgIC8qIFsxMDU0XSBPQkpfaW5mb19hY2Nlc3MgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MzAsMHgwMSwgICAgIC8qIFsxMDYyXSBPQkpfYWRfT0NTUCAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgzMCwweDAyLCAgICAgLyogWzEwNzBdIE9CSl9hZF9jYV9pc3N1ZXJzICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDAzLDB4MDksICAgICAvKiBbMTA3OF0gT0JKX09DU1Bfc2lnbiAqLworMHgyOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzEwODZdIE9CSl9pc28gKi8KKzB4MkEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFsxMDg3XSBPQkpfbWVtYmVyX2JvZHkgKi8KKzB4MkEsMHg4NiwweDQ4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFsxMDg4XSBPQkpfSVNPX1VTICovCisweDJBLDB4ODYsMHg0OCwweENFLDB4MzgsICAgICAgICAgICAgICAgICAgICAvKiBbMTA5MV0gT0JKX1g5XzU3ICovCisweDJBLDB4ODYsMHg0OCwweENFLDB4MzgsMHgwNCwgICAgICAgICAgICAgICAvKiBbMTA5Nl0gT0JKX1g5Y20gKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwMSwgICAgIC8qIFsxMTAyXSBPQkpfcGtjczEgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwNSwgICAgIC8qIFsxMTEwXSBPQkpfcGtjczUgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLC8qIFsxMTE4XSBPQkpfU01JTUUgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDAsLyogWzExMjddIE9CSl9pZF9zbWltZV9tb2QgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDEsLyogWzExMzddIE9CSl9pZF9zbWltZV9jdCAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMiwvKiBbMTE0N10gT0JKX2lkX3NtaW1lX2FhICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAzLC8qIFsxMTU3XSBPQkpfaWRfc21pbWVfYWxnICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDA0LC8qIFsxMTY3XSBPQkpfaWRfc21pbWVfY2QgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDUsLyogWzExNzddIE9CSl9pZF9zbWltZV9zcHEgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDYsLyogWzExODddIE9CSl9pZF9zbWltZV9jdGkgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDAsMHgwMSwvKiBbMTE5N10gT0JKX2lkX3NtaW1lX21vZF9jbXMgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDAsMHgwMiwvKiBbMTIwOF0gT0JKX2lkX3NtaW1lX21vZF9lc3MgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDAsMHgwMywvKiBbMTIxOV0gT0JKX2lkX3NtaW1lX21vZF9vaWQgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDAsMHgwNCwvKiBbMTIzMF0gT0JKX2lkX3NtaW1lX21vZF9tc2dfdjMgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDAsMHgwNSwvKiBbMTI0MV0gT0JKX2lkX3NtaW1lX21vZF9ldHNfZVNpZ25hdHVyZV84OCAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMCwweDA2LC8qIFsxMjUyXSBPQkpfaWRfc21pbWVfbW9kX2V0c19lU2lnbmF0dXJlXzk3ICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAwLDB4MDcsLyogWzEyNjNdIE9CSl9pZF9zbWltZV9tb2RfZXRzX2VTaWdQb2xpY3lfODggKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDAsMHgwOCwvKiBbMTI3NF0gT0JKX2lkX3NtaW1lX21vZF9ldHNfZVNpZ1BvbGljeV85NyAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMSwweDAxLC8qIFsxMjg1XSBPQkpfaWRfc21pbWVfY3RfcmVjZWlwdCAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMSwweDAyLC8qIFsxMjk2XSBPQkpfaWRfc21pbWVfY3RfYXV0aERhdGEgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDEsMHgwMywvKiBbMTMwN10gT0JKX2lkX3NtaW1lX2N0X3B1Ymxpc2hDZXJ0ICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAxLDB4MDQsLyogWzEzMThdIE9CSl9pZF9zbWltZV9jdF9UU1RJbmZvICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAxLDB4MDUsLyogWzEzMjldIE9CSl9pZF9zbWltZV9jdF9URFRJbmZvICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAxLDB4MDYsLyogWzEzNDBdIE9CSl9pZF9zbWltZV9jdF9jb250ZW50SW5mbyAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMSwweDA3LC8qIFsxMzUxXSBPQkpfaWRfc21pbWVfY3RfRFZDU1JlcXVlc3REYXRhICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAxLDB4MDgsLyogWzEzNjJdIE9CSl9pZF9zbWltZV9jdF9EVkNTUmVzcG9uc2VEYXRhICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAyLDB4MDEsLyogWzEzNzNdIE9CSl9pZF9zbWltZV9hYV9yZWNlaXB0UmVxdWVzdCAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMiwweDAyLC8qIFsxMzg0XSBPQkpfaWRfc21pbWVfYWFfc2VjdXJpdHlMYWJlbCAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMiwweDAzLC8qIFsxMzk1XSBPQkpfaWRfc21pbWVfYWFfbWxFeHBhbmRIaXN0b3J5ICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAyLDB4MDQsLyogWzE0MDZdIE9CSl9pZF9zbWltZV9hYV9jb250ZW50SGludCAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMiwweDA1LC8qIFsxNDE3XSBPQkpfaWRfc21pbWVfYWFfbXNnU2lnRGlnZXN0ICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAyLDB4MDYsLyogWzE0MjhdIE9CSl9pZF9zbWltZV9hYV9lbmNhcENvbnRlbnRUeXBlICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAyLDB4MDcsLyogWzE0MzldIE9CSl9pZF9zbWltZV9hYV9jb250ZW50SWRlbnRpZmllciAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMiwweDA4LC8qIFsxNDUwXSBPQkpfaWRfc21pbWVfYWFfbWFjVmFsdWUgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDIsMHgwOSwvKiBbMTQ2MV0gT0JKX2lkX3NtaW1lX2FhX2VxdWl2YWxlbnRMYWJlbHMgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDIsMHgwQSwvKiBbMTQ3Ml0gT0JKX2lkX3NtaW1lX2FhX2NvbnRlbnRSZWZlcmVuY2UgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDIsMHgwQiwvKiBbMTQ4M10gT0JKX2lkX3NtaW1lX2FhX2VuY3J5cEtleVByZWYgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDIsMHgwQywvKiBbMTQ5NF0gT0JKX2lkX3NtaW1lX2FhX3NpZ25pbmdDZXJ0aWZpY2F0ZSAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMiwweDBELC8qIFsxNTA1XSBPQkpfaWRfc21pbWVfYWFfc21pbWVFbmNyeXB0Q2VydHMgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDIsMHgwRSwvKiBbMTUxNl0gT0JKX2lkX3NtaW1lX2FhX3RpbWVTdGFtcFRva2VuICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAyLDB4MEYsLyogWzE1MjddIE9CSl9pZF9zbWltZV9hYV9ldHNfc2lnUG9saWN5SWQgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDIsMHgxMCwvKiBbMTUzOF0gT0JKX2lkX3NtaW1lX2FhX2V0c19jb21taXRtZW50VHlwZSAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMiwweDExLC8qIFsxNTQ5XSBPQkpfaWRfc21pbWVfYWFfZXRzX3NpZ25lckxvY2F0aW9uICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAyLDB4MTIsLyogWzE1NjBdIE9CSl9pZF9zbWltZV9hYV9ldHNfc2lnbmVyQXR0ciAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMiwweDEzLC8qIFsxNTcxXSBPQkpfaWRfc21pbWVfYWFfZXRzX290aGVyU2lnQ2VydCAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMiwweDE0LC8qIFsxNTgyXSBPQkpfaWRfc21pbWVfYWFfZXRzX2NvbnRlbnRUaW1lc3RhbXAgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDIsMHgxNSwvKiBbMTU5M10gT0JKX2lkX3NtaW1lX2FhX2V0c19DZXJ0aWZpY2F0ZVJlZnMgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDIsMHgxNiwvKiBbMTYwNF0gT0JKX2lkX3NtaW1lX2FhX2V0c19SZXZvY2F0aW9uUmVmcyAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMiwweDE3LC8qIFsxNjE1XSBPQkpfaWRfc21pbWVfYWFfZXRzX2NlcnRWYWx1ZXMgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDIsMHgxOCwvKiBbMTYyNl0gT0JKX2lkX3NtaW1lX2FhX2V0c19yZXZvY2F0aW9uVmFsdWVzICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAyLDB4MTksLyogWzE2MzddIE9CSl9pZF9zbWltZV9hYV9ldHNfZXNjVGltZVN0YW1wICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAyLDB4MUEsLyogWzE2NDhdIE9CSl9pZF9zbWltZV9hYV9ldHNfY2VydENSTFRpbWVzdGFtcCAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMiwweDFCLC8qIFsxNjU5XSBPQkpfaWRfc21pbWVfYWFfZXRzX2FyY2hpdmVUaW1lU3RhbXAgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDIsMHgxQywvKiBbMTY3MF0gT0JKX2lkX3NtaW1lX2FhX3NpZ25hdHVyZVR5cGUgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDIsMHgxRCwvKiBbMTY4MV0gT0JKX2lkX3NtaW1lX2FhX2R2Y3NfZHZjICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAzLDB4MDEsLyogWzE2OTJdIE9CSl9pZF9zbWltZV9hbGdfRVNESHdpdGgzREVTICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAzLDB4MDIsLyogWzE3MDNdIE9CSl9pZF9zbWltZV9hbGdfRVNESHdpdGhSQzIgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDMsMHgwMywvKiBbMTcxNF0gT0JKX2lkX3NtaW1lX2FsZ18zREVTd3JhcCAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMywweDA0LC8qIFsxNzI1XSBPQkpfaWRfc21pbWVfYWxnX1JDMndyYXAgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDMsMHgwNSwvKiBbMTczNl0gT0JKX2lkX3NtaW1lX2FsZ19FU0RIICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAzLDB4MDYsLyogWzE3NDddIE9CSl9pZF9zbWltZV9hbGdfQ01TM0RFU3dyYXAgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDMsMHgwNywvKiBbMTc1OF0gT0JKX2lkX3NtaW1lX2FsZ19DTVNSQzJ3cmFwICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDA0LDB4MDEsLyogWzE3NjldIE9CSl9pZF9zbWltZV9jZF9sZGFwICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDA1LDB4MDEsLyogWzE3ODBdIE9CSl9pZF9zbWltZV9zcHFfZXRzX3NxdF91cmkgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDUsMHgwMiwvKiBbMTc5MV0gT0JKX2lkX3NtaW1lX3NwcV9ldHNfc3F0X3Vub3RpY2UgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDYsMHgwMSwvKiBbMTgwMl0gT0JKX2lkX3NtaW1lX2N0aV9ldHNfcHJvb2ZPZk9yaWdpbiAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwNiwweDAyLC8qIFsxODEzXSBPQkpfaWRfc21pbWVfY3RpX2V0c19wcm9vZk9mUmVjZWlwdCAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwNiwweDAzLC8qIFsxODI0XSBPQkpfaWRfc21pbWVfY3RpX2V0c19wcm9vZk9mRGVsaXZlcnkgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDYsMHgwNCwvKiBbMTgzNV0gT0JKX2lkX3NtaW1lX2N0aV9ldHNfcHJvb2ZPZlNlbmRlciAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwNiwweDA1LC8qIFsxODQ2XSBPQkpfaWRfc21pbWVfY3RpX2V0c19wcm9vZk9mQXBwcm92YWwgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDYsMHgwNiwvKiBbMTg1N10gT0JKX2lkX3NtaW1lX2N0aV9ldHNfcHJvb2ZPZkNyZWF0aW9uICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAyLDB4MDQsICAgICAvKiBbMTg2OF0gT0JKX21kNCAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwMCwgICAgICAgICAgLyogWzE4NzZdIE9CSl9pZF9wa2l4X21vZCAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwMiwgICAgICAgICAgLyogWzE4ODNdIE9CSl9pZF9xdCAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNCwgICAgICAgICAgLyogWzE4OTBdIE9CSl9pZF9pdCAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNSwgICAgICAgICAgLyogWzE4OTddIE9CSl9pZF9wa2lwICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA2LCAgICAgICAgICAvKiBbMTkwNF0gT0JKX2lkX2FsZyAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNywgICAgICAgICAgLyogWzE5MTFdIE9CSl9pZF9jbWMgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDgsICAgICAgICAgIC8qIFsxOTE4XSBPQkpfaWRfb24gKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDksICAgICAgICAgIC8qIFsxOTI1XSBPQkpfaWRfcGRhICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDBBLCAgICAgICAgICAvKiBbMTkzMl0gT0JKX2lkX2FjYSAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwQiwgICAgICAgICAgLyogWzE5MzldIE9CSl9pZF9xY3MgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MEMsICAgICAgICAgIC8qIFsxOTQ2XSBPQkpfaWRfY2N0ICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDAwLDB4MDEsICAgICAvKiBbMTk1M10gT0JKX2lkX3BraXgxX2V4cGxpY2l0Xzg4ICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDAwLDB4MDIsICAgICAvKiBbMTk2MV0gT0JKX2lkX3BraXgxX2ltcGxpY2l0Xzg4ICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDAwLDB4MDMsICAgICAvKiBbMTk2OV0gT0JKX2lkX3BraXgxX2V4cGxpY2l0XzkzICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDAwLDB4MDQsICAgICAvKiBbMTk3N10gT0JKX2lkX3BraXgxX2ltcGxpY2l0XzkzICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDAwLDB4MDUsICAgICAvKiBbMTk4NV0gT0JKX2lkX21vZF9jcm1mICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDAwLDB4MDYsICAgICAvKiBbMTk5M10gT0JKX2lkX21vZF9jbWMgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDAsMHgwNywgICAgIC8qIFsyMDAxXSBPQkpfaWRfbW9kX2tlYV9wcm9maWxlXzg4ICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDAwLDB4MDgsICAgICAvKiBbMjAwOV0gT0JKX2lkX21vZF9rZWFfcHJvZmlsZV85MyAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwMCwweDA5LCAgICAgLyogWzIwMTddIE9CSl9pZF9tb2RfY21wICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDAwLDB4MEEsICAgICAvKiBbMjAyNV0gT0JKX2lkX21vZF9xdWFsaWZpZWRfY2VydF84OCAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwMCwweDBCLCAgICAgLyogWzIwMzNdIE9CSl9pZF9tb2RfcXVhbGlmaWVkX2NlcnRfOTMgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDAsMHgwQywgICAgIC8qIFsyMDQxXSBPQkpfaWRfbW9kX2F0dHJpYnV0ZV9jZXJ0ICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDAwLDB4MEQsICAgICAvKiBbMjA0OV0gT0JKX2lkX21vZF90aW1lc3RhbXBfcHJvdG9jb2wgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDAsMHgwRSwgICAgIC8qIFsyMDU3XSBPQkpfaWRfbW9kX29jc3AgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDAsMHgwRiwgICAgIC8qIFsyMDY1XSBPQkpfaWRfbW9kX2R2Y3MgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDAsMHgxMCwgICAgIC8qIFsyMDczXSBPQkpfaWRfbW9kX2NtcDIwMDAgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDEsMHgwMiwgICAgIC8qIFsyMDgxXSBPQkpfYmlvbWV0cmljSW5mbyAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwMSwweDAzLCAgICAgLyogWzIwODldIE9CSl9xY1N0YXRlbWVudHMgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDEsMHgwNCwgICAgIC8qIFsyMDk3XSBPQkpfYWNfYXVkaXRFbnRpdHkgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDEsMHgwNSwgICAgIC8qIFsyMTA1XSBPQkpfYWNfdGFyZ2V0aW5nICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDAxLDB4MDYsICAgICAvKiBbMjExM10gT0JKX2FhQ29udHJvbHMgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDEsMHgwNywgICAgIC8qIFsyMTIxXSBPQkpfc2JncF9pcEFkZHJCbG9jayAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwMSwweDA4LCAgICAgLyogWzIxMjldIE9CSl9zYmdwX2F1dG9ub21vdXNTeXNOdW0gKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDEsMHgwOSwgICAgIC8qIFsyMTM3XSBPQkpfc2JncF9yb3V0ZXJJZGVudGlmaWVyICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDAyLDB4MDMsICAgICAvKiBbMjE0NV0gT0JKX3RleHROb3RpY2UgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDMsMHgwNSwgICAgIC8qIFsyMTUzXSBPQkpfaXBzZWNFbmRTeXN0ZW0gKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDMsMHgwNiwgICAgIC8qIFsyMTYxXSBPQkpfaXBzZWNUdW5uZWwgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDMsMHgwNywgICAgIC8qIFsyMTY5XSBPQkpfaXBzZWNVc2VyICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDAzLDB4MEEsICAgICAvKiBbMjE3N10gT0JKX2R2Y3MgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDQsMHgwMSwgICAgIC8qIFsyMTg1XSBPQkpfaWRfaXRfY2FQcm90RW5jQ2VydCAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNCwweDAyLCAgICAgLyogWzIxOTNdIE9CSl9pZF9pdF9zaWduS2V5UGFpclR5cGVzICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA0LDB4MDMsICAgICAvKiBbMjIwMV0gT0JKX2lkX2l0X2VuY0tleVBhaXJUeXBlcyAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNCwweDA0LCAgICAgLyogWzIyMDldIE9CSl9pZF9pdF9wcmVmZXJyZWRTeW1tQWxnICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA0LDB4MDUsICAgICAvKiBbMjIxN10gT0JKX2lkX2l0X2NhS2V5VXBkYXRlSW5mbyAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNCwweDA2LCAgICAgLyogWzIyMjVdIE9CSl9pZF9pdF9jdXJyZW50Q1JMICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA0LDB4MDcsICAgICAvKiBbMjIzM10gT0JKX2lkX2l0X3Vuc3VwcG9ydGVkT0lEcyAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNCwweDA4LCAgICAgLyogWzIyNDFdIE9CSl9pZF9pdF9zdWJzY3JpcHRpb25SZXF1ZXN0ICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA0LDB4MDksICAgICAvKiBbMjI0OV0gT0JKX2lkX2l0X3N1YnNjcmlwdGlvblJlc3BvbnNlICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA0LDB4MEEsICAgICAvKiBbMjI1N10gT0JKX2lkX2l0X2tleVBhaXJQYXJhbVJlcSAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNCwweDBCLCAgICAgLyogWzIyNjVdIE9CSl9pZF9pdF9rZXlQYWlyUGFyYW1SZXAgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDQsMHgwQywgICAgIC8qIFsyMjczXSBPQkpfaWRfaXRfcmV2UGFzc3BocmFzZSAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNCwweDBELCAgICAgLyogWzIyODFdIE9CSl9pZF9pdF9pbXBsaWNpdENvbmZpcm0gKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDQsMHgwRSwgICAgIC8qIFsyMjg5XSBPQkpfaWRfaXRfY29uZmlybVdhaXRUaW1lICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA0LDB4MEYsICAgICAvKiBbMjI5N10gT0JKX2lkX2l0X29yaWdQS0lNZXNzYWdlICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA1LDB4MDEsICAgICAvKiBbMjMwNV0gT0JKX2lkX3JlZ0N0cmwgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDUsMHgwMiwgICAgIC8qIFsyMzEzXSBPQkpfaWRfcmVnSW5mbyAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNSwweDAxLDB4MDEsLyogWzIzMjFdIE9CSl9pZF9yZWdDdHJsX3JlZ1Rva2VuICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA1LDB4MDEsMHgwMiwvKiBbMjMzMF0gT0JKX2lkX3JlZ0N0cmxfYXV0aGVudGljYXRvciAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNSwweDAxLDB4MDMsLyogWzIzMzldIE9CSl9pZF9yZWdDdHJsX3BraVB1YmxpY2F0aW9uSW5mbyAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNSwweDAxLDB4MDQsLyogWzIzNDhdIE9CSl9pZF9yZWdDdHJsX3BraUFyY2hpdmVPcHRpb25zICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA1LDB4MDEsMHgwNSwvKiBbMjM1N10gT0JKX2lkX3JlZ0N0cmxfb2xkQ2VydElEICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA1LDB4MDEsMHgwNiwvKiBbMjM2Nl0gT0JKX2lkX3JlZ0N0cmxfcHJvdG9jb2xFbmNyS2V5ICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA1LDB4MDIsMHgwMSwvKiBbMjM3NV0gT0JKX2lkX3JlZ0luZm9fdXRmOFBhaXJzICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA1LDB4MDIsMHgwMiwvKiBbMjM4NF0gT0JKX2lkX3JlZ0luZm9fY2VydFJlcSAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNiwweDAxLCAgICAgLyogWzIzOTNdIE9CSl9pZF9hbGdfZGVzNDAgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDYsMHgwMiwgICAgIC8qIFsyNDAxXSBPQkpfaWRfYWxnX25vU2lnbmF0dXJlICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA2LDB4MDMsICAgICAvKiBbMjQwOV0gT0JKX2lkX2FsZ19kaF9zaWdfaG1hY19zaGExICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA2LDB4MDQsICAgICAvKiBbMjQxN10gT0JKX2lkX2FsZ19kaF9wb3AgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDcsMHgwMSwgICAgIC8qIFsyNDI1XSBPQkpfaWRfY21jX3N0YXR1c0luZm8gKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDcsMHgwMiwgICAgIC8qIFsyNDMzXSBPQkpfaWRfY21jX2lkZW50aWZpY2F0aW9uICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA3LDB4MDMsICAgICAvKiBbMjQ0MV0gT0JKX2lkX2NtY19pZGVudGl0eVByb29mICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA3LDB4MDQsICAgICAvKiBbMjQ0OV0gT0JKX2lkX2NtY19kYXRhUmV0dXJuICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA3LDB4MDUsICAgICAvKiBbMjQ1N10gT0JKX2lkX2NtY190cmFuc2FjdGlvbklkICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA3LDB4MDYsICAgICAvKiBbMjQ2NV0gT0JKX2lkX2NtY19zZW5kZXJOb25jZSAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNywweDA3LCAgICAgLyogWzI0NzNdIE9CSl9pZF9jbWNfcmVjaXBpZW50Tm9uY2UgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDcsMHgwOCwgICAgIC8qIFsyNDgxXSBPQkpfaWRfY21jX2FkZEV4dGVuc2lvbnMgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDcsMHgwOSwgICAgIC8qIFsyNDg5XSBPQkpfaWRfY21jX2VuY3J5cHRlZFBPUCAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNywweDBBLCAgICAgLyogWzI0OTddIE9CSl9pZF9jbWNfZGVjcnlwdGVkUE9QICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA3LDB4MEIsICAgICAvKiBbMjUwNV0gT0JKX2lkX2NtY19scmFQT1BXaXRuZXNzICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA3LDB4MEYsICAgICAvKiBbMjUxM10gT0JKX2lkX2NtY19nZXRDZXJ0ICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA3LDB4MTAsICAgICAvKiBbMjUyMV0gT0JKX2lkX2NtY19nZXRDUkwgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDcsMHgxMSwgICAgIC8qIFsyNTI5XSBPQkpfaWRfY21jX3Jldm9rZVJlcXVlc3QgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDcsMHgxMiwgICAgIC8qIFsyNTM3XSBPQkpfaWRfY21jX3JlZ0luZm8gKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDcsMHgxMywgICAgIC8qIFsyNTQ1XSBPQkpfaWRfY21jX3Jlc3BvbnNlSW5mbyAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNywweDE1LCAgICAgLyogWzI1NTNdIE9CSl9pZF9jbWNfcXVlcnlQZW5kaW5nICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA3LDB4MTYsICAgICAvKiBbMjU2MV0gT0JKX2lkX2NtY19wb3BMaW5rUmFuZG9tICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA3LDB4MTcsICAgICAvKiBbMjU2OV0gT0JKX2lkX2NtY19wb3BMaW5rV2l0bmVzcyAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNywweDE4LCAgICAgLyogWzI1NzddIE9CSl9pZF9jbWNfY29uZmlybUNlcnRBY2NlcHRhbmNlICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA4LDB4MDEsICAgICAvKiBbMjU4NV0gT0JKX2lkX29uX3BlcnNvbmFsRGF0YSAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwOSwweDAxLCAgICAgLyogWzI1OTNdIE9CSl9pZF9wZGFfZGF0ZU9mQmlydGggKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDksMHgwMiwgICAgIC8qIFsyNjAxXSBPQkpfaWRfcGRhX3BsYWNlT2ZCaXJ0aCAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwOSwweDAzLCAgICAgLyogWzI2MDldIE9CSl9pZF9wZGFfZ2VuZGVyICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA5LDB4MDQsICAgICAvKiBbMjYxN10gT0JKX2lkX3BkYV9jb3VudHJ5T2ZDaXRpemVuc2hpcCAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwOSwweDA1LCAgICAgLyogWzI2MjVdIE9CSl9pZF9wZGFfY291bnRyeU9mUmVzaWRlbmNlICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDBBLDB4MDEsICAgICAvKiBbMjYzM10gT0JKX2lkX2FjYV9hdXRoZW50aWNhdGlvbkluZm8gKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MEEsMHgwMiwgICAgIC8qIFsyNjQxXSBPQkpfaWRfYWNhX2FjY2Vzc0lkZW50aXR5ICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDBBLDB4MDMsICAgICAvKiBbMjY0OV0gT0JKX2lkX2FjYV9jaGFyZ2luZ0lkZW50aXR5ICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDBBLDB4MDQsICAgICAvKiBbMjY1N10gT0JKX2lkX2FjYV9ncm91cCAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwQSwweDA1LCAgICAgLyogWzI2NjVdIE9CSl9pZF9hY2Ffcm9sZSAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwQiwweDAxLCAgICAgLyogWzI2NzNdIE9CSl9pZF9xY3NfcGtpeFFDU3ludGF4X3YxICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDBDLDB4MDEsICAgICAvKiBbMjY4MV0gT0JKX2lkX2NjdF9jcnMgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MEMsMHgwMiwgICAgIC8qIFsyNjg5XSBPQkpfaWRfY2N0X1BLSURhdGEgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MEMsMHgwMywgICAgIC8qIFsyNjk3XSBPQkpfaWRfY2N0X1BLSVJlc3BvbnNlICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDMwLDB4MDMsICAgICAvKiBbMjcwNV0gT0JKX2FkX3RpbWVTdGFtcGluZyAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgzMCwweDA0LCAgICAgLyogWzI3MTNdIE9CSl9hZF9kdmNzICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDMwLDB4MDEsMHgwMSwvKiBbMjcyMV0gT0JKX2lkX3BraXhfT0NTUF9iYXNpYyAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgzMCwweDAxLDB4MDIsLyogWzI3MzBdIE9CSl9pZF9wa2l4X09DU1BfTm9uY2UgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MzAsMHgwMSwweDAzLC8qIFsyNzM5XSBPQkpfaWRfcGtpeF9PQ1NQX0NybElEICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDMwLDB4MDEsMHgwNCwvKiBbMjc0OF0gT0JKX2lkX3BraXhfT0NTUF9hY2NlcHRhYmxlUmVzcG9uc2VzICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDMwLDB4MDEsMHgwNSwvKiBbMjc1N10gT0JKX2lkX3BraXhfT0NTUF9ub0NoZWNrICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDMwLDB4MDEsMHgwNiwvKiBbMjc2Nl0gT0JKX2lkX3BraXhfT0NTUF9hcmNoaXZlQ3V0b2ZmICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDMwLDB4MDEsMHgwNywvKiBbMjc3NV0gT0JKX2lkX3BraXhfT0NTUF9zZXJ2aWNlTG9jYXRvciAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgzMCwweDAxLDB4MDgsLyogWzI3ODRdIE9CSl9pZF9wa2l4X09DU1BfZXh0ZW5kZWRTdGF0dXMgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MzAsMHgwMSwweDA5LC8qIFsyNzkzXSBPQkpfaWRfcGtpeF9PQ1NQX3ZhbGlkICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDMwLDB4MDEsMHgwQSwvKiBbMjgwMl0gT0JKX2lkX3BraXhfT0NTUF9wYXRoICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDMwLDB4MDEsMHgwQiwvKiBbMjgxMV0gT0JKX2lkX3BraXhfT0NTUF90cnVzdFJvb3QgKi8KKzB4MkIsMHgwRSwweDAzLDB4MDIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFsyODIwXSBPQkpfYWxnb3JpdGhtICovCisweDJCLDB4MEUsMHgwMywweDAyLDB4MEIsICAgICAgICAgICAgICAgICAgICAvKiBbMjgyNF0gT0JKX3JzYVNpZ25hdHVyZSAqLworMHg1NSwweDA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzI4MjldIE9CSl9YNTAwYWxnb3JpdGhtcyAqLworMHgyQiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzI4MzFdIE9CSl9vcmcgKi8KKzB4MkIsMHgwNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFsyODMyXSBPQkpfZG9kICovCisweDJCLDB4MDYsMHgwMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMjgzNF0gT0JKX2lhbmEgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFsyODM3XSBPQkpfRGlyZWN0b3J5ICovCisweDJCLDB4MDYsMHgwMSwweDAyLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMjg0MV0gT0JKX01hbmFnZW1lbnQgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDMsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFsyODQ1XSBPQkpfRXhwZXJpbWVudGFsICovCisweDJCLDB4MDYsMHgwMSwweDA0LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMjg0OV0gT0JKX1ByaXZhdGUgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFsyODUzXSBPQkpfU2VjdXJpdHkgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDYsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFsyODU3XSBPQkpfU05NUHYyICovCisweDJCLDB4MDYsMHgwMSwweDA3LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMjg2MV0gT0JKX01haWwgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDQsMHgwMSwgICAgICAgICAgICAgICAgICAgIC8qIFsyODY1XSBPQkpfRW50ZXJwcmlzZXMgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDQsMHgwMSwweDhCLDB4M0EsMHg4MiwweDU4LC8qIFsyODcwXSBPQkpfZGNPYmplY3QgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDAxLDB4MTksLyogWzI4NzldIE9CSl9kb21haW5Db21wb25lbnQgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDA0LDB4MEQsLyogWzI4ODldIE9CSl9Eb21haW4gKi8KKzB4MDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFsyODk5XSBPQkpfam9pbnRfaXNvX2NjaXR0ICovCisweDU1LDB4MDEsMHgwNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMjkwMF0gT0JKX3NlbGVjdGVkX2F0dHJpYnV0ZV90eXBlcyAqLworMHg1NSwweDAxLDB4MDUsMHgzNywgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzI5MDNdIE9CSl9jbGVhcmFuY2UgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwMSwweDAzLC8qIFsyOTA3XSBPQkpfbWQ0V2l0aFJTQUVuY3J5cHRpb24gKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDEsMHgwQSwgICAgIC8qIFsyOTE2XSBPQkpfYWNfcHJveHlpbmcgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDEsMHgwQiwgICAgIC8qIFsyOTI0XSBPQkpfc2luZm9fYWNjZXNzICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDBBLDB4MDYsICAgICAvKiBbMjkzMl0gT0JKX2lkX2FjYV9lbmNBdHRycyAqLworMHg1NSwweDA0LDB4NDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzI5NDBdIE9CSl9yb2xlICovCisweDU1LDB4MUQsMHgyNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMjk0M10gT0JKX3BvbGljeV9jb25zdHJhaW50cyAqLworMHg1NSwweDFELDB4MzcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzI5NDZdIE9CSl90YXJnZXRfaW5mb3JtYXRpb24gKi8KKzB4NTUsMHgxRCwweDM4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFsyOTQ5XSBPQkpfbm9fcmV2X2F2YWlsICovCisweDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMjk1Ml0gT0JKX2NjaXR0ICovCisweDJBLDB4ODYsMHg0OCwweENFLDB4M0QsICAgICAgICAgICAgICAgICAgICAvKiBbMjk1M10gT0JKX2Fuc2lfWDlfNjIgKi8KKzB4MkEsMHg4NiwweDQ4LDB4Q0UsMHgzRCwweDAxLDB4MDEsICAgICAgICAgIC8qIFsyOTU4XSBPQkpfWDlfNjJfcHJpbWVfZmllbGQgKi8KKzB4MkEsMHg4NiwweDQ4LDB4Q0UsMHgzRCwweDAxLDB4MDIsICAgICAgICAgIC8qIFsyOTY1XSBPQkpfWDlfNjJfY2hhcmFjdGVyaXN0aWNfdHdvX2ZpZWxkICovCisweDJBLDB4ODYsMHg0OCwweENFLDB4M0QsMHgwMiwweDAxLCAgICAgICAgICAvKiBbMjk3Ml0gT0JKX1g5XzYyX2lkX2VjUHVibGljS2V5ICovCisweDJBLDB4ODYsMHg0OCwweENFLDB4M0QsMHgwMywweDAxLDB4MDEsICAgICAvKiBbMjk3OV0gT0JKX1g5XzYyX3ByaW1lMTkydjEgKi8KKzB4MkEsMHg4NiwweDQ4LDB4Q0UsMHgzRCwweDAzLDB4MDEsMHgwMiwgICAgIC8qIFsyOTg3XSBPQkpfWDlfNjJfcHJpbWUxOTJ2MiAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDNELDB4MDMsMHgwMSwweDAzLCAgICAgLyogWzI5OTVdIE9CSl9YOV82Ml9wcmltZTE5MnYzICovCisweDJBLDB4ODYsMHg0OCwweENFLDB4M0QsMHgwMywweDAxLDB4MDQsICAgICAvKiBbMzAwM10gT0JKX1g5XzYyX3ByaW1lMjM5djEgKi8KKzB4MkEsMHg4NiwweDQ4LDB4Q0UsMHgzRCwweDAzLDB4MDEsMHgwNSwgICAgIC8qIFszMDExXSBPQkpfWDlfNjJfcHJpbWUyMzl2MiAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDNELDB4MDMsMHgwMSwweDA2LCAgICAgLyogWzMwMTldIE9CSl9YOV82Ml9wcmltZTIzOXYzICovCisweDJBLDB4ODYsMHg0OCwweENFLDB4M0QsMHgwMywweDAxLDB4MDcsICAgICAvKiBbMzAyN10gT0JKX1g5XzYyX3ByaW1lMjU2djEgKi8KKzB4MkEsMHg4NiwweDQ4LDB4Q0UsMHgzRCwweDA0LDB4MDEsICAgICAgICAgIC8qIFszMDM1XSBPQkpfZWNkc2Ffd2l0aF9TSEExICovCisweDJCLDB4MDYsMHgwMSwweDA0LDB4MDEsMHg4MiwweDM3LDB4MTEsMHgwMSwvKiBbMzA0Ml0gT0JKX21zX2NzcF9uYW1lICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4NjUsMHgwMywweDA0LDB4MDEsMHgwMSwvKiBbMzA1MV0gT0JKX2Flc18xMjhfZWNiICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4NjUsMHgwMywweDA0LDB4MDEsMHgwMiwvKiBbMzA2MF0gT0JKX2Flc18xMjhfY2JjICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4NjUsMHgwMywweDA0LDB4MDEsMHgwMywvKiBbMzA2OV0gT0JKX2Flc18xMjhfb2ZiMTI4ICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4NjUsMHgwMywweDA0LDB4MDEsMHgwNCwvKiBbMzA3OF0gT0JKX2Flc18xMjhfY2ZiMTI4ICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4NjUsMHgwMywweDA0LDB4MDEsMHgxNSwvKiBbMzA4N10gT0JKX2Flc18xOTJfZWNiICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4NjUsMHgwMywweDA0LDB4MDEsMHgxNiwvKiBbMzA5Nl0gT0JKX2Flc18xOTJfY2JjICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4NjUsMHgwMywweDA0LDB4MDEsMHgxNywvKiBbMzEwNV0gT0JKX2Flc18xOTJfb2ZiMTI4ICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4NjUsMHgwMywweDA0LDB4MDEsMHgxOCwvKiBbMzExNF0gT0JKX2Flc18xOTJfY2ZiMTI4ICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4NjUsMHgwMywweDA0LDB4MDEsMHgyOSwvKiBbMzEyM10gT0JKX2Flc18yNTZfZWNiICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4NjUsMHgwMywweDA0LDB4MDEsMHgyQSwvKiBbMzEzMl0gT0JKX2Flc18yNTZfY2JjICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4NjUsMHgwMywweDA0LDB4MDEsMHgyQiwvKiBbMzE0MV0gT0JKX2Flc18yNTZfb2ZiMTI4ICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4NjUsMHgwMywweDA0LDB4MDEsMHgyQywvKiBbMzE1MF0gT0JKX2Flc18yNTZfY2ZiMTI4ICovCisweDU1LDB4MUQsMHgxNywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMzE1OV0gT0JKX2hvbGRfaW5zdHJ1Y3Rpb25fY29kZSAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDM4LDB4MDIsMHgwMSwgICAgICAgICAgLyogWzMxNjJdIE9CSl9ob2xkX2luc3RydWN0aW9uX25vbmUgKi8KKzB4MkEsMHg4NiwweDQ4LDB4Q0UsMHgzOCwweDAyLDB4MDIsICAgICAgICAgIC8qIFszMTY5XSBPQkpfaG9sZF9pbnN0cnVjdGlvbl9jYWxsX2lzc3VlciAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDM4LDB4MDIsMHgwMywgICAgICAgICAgLyogWzMxNzZdIE9CSl9ob2xkX2luc3RydWN0aW9uX3JlamVjdCAqLworMHgwOSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzMxODNdIE9CSl9kYXRhICovCisweDA5LDB4OTIsMHgyNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMzE4NF0gT0JKX3BzcyAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywgICAgICAgICAgLyogWzMxODddIE9CSl91Y2wgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwgICAgIC8qIFszMTk0XSBPQkpfcGlsb3QgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDAxLC8qIFszMjAyXSBPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMywvKiBbMzIxMV0gT0JKX3BpbG90QXR0cmlidXRlU3ludGF4ICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwNCwvKiBbMzIyMF0gT0JKX3BpbG90T2JqZWN0Q2xhc3MgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDBBLC8qIFszMjI5XSBPQkpfcGlsb3RHcm91cHMgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDAzLDB4MDQsLyogWzMyMzhdIE9CSl9pQTVTdHJpbmdTeW50YXggKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDAzLDB4MDUsLyogWzMyNDhdIE9CSl9jYXNlSWdub3JlSUE1U3RyaW5nU3ludGF4ICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwNCwweDAzLC8qIFszMjU4XSBPQkpfcGlsb3RPYmplY3QgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDA0LDB4MDQsLyogWzMyNjhdIE9CSl9waWxvdFBlcnNvbiAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDQsMHgwNSwvKiBbMzI3OF0gT0JKX2FjY291bnQgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDA0LDB4MDYsLyogWzMyODhdIE9CSl9kb2N1bWVudCAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDQsMHgwNywvKiBbMzI5OF0gT0JKX3Jvb20gKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDA0LDB4MDksLyogWzMzMDhdIE9CSl9kb2N1bWVudFNlcmllcyAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDQsMHgwRSwvKiBbMzMxOF0gT0JKX3JGQzgyMmxvY2FsUGFydCAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDQsMHgwRiwvKiBbMzMyOF0gT0JKX2ROU0RvbWFpbiAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDQsMHgxMSwvKiBbMzMzOF0gT0JKX2RvbWFpblJlbGF0ZWRPYmplY3QgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDA0LDB4MTIsLyogWzMzNDhdIE9CSl9mcmllbmRseUNvdW50cnkgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDA0LDB4MTMsLyogWzMzNThdIE9CSl9zaW1wbGVTZWN1cml0eU9iamVjdCAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDQsMHgxNCwvKiBbMzM2OF0gT0JKX3BpbG90T3JnYW5pemF0aW9uICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwNCwweDE1LC8qIFszMzc4XSBPQkpfcGlsb3REU0EgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDA0LDB4MTYsLyogWzMzODhdIE9CSl9xdWFsaXR5TGFiZWxsZWREYXRhICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDAxLC8qIFszMzk4XSBPQkpfdXNlcklkICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDAyLC8qIFszNDA4XSBPQkpfdGV4dEVuY29kZWRPUkFkZHJlc3MgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDAxLDB4MDMsLyogWzM0MThdIE9CSl9yZmM4MjJNYWlsYm94ICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDA0LC8qIFszNDI4XSBPQkpfaW5mbyAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDEsMHgwNSwvKiBbMzQzOF0gT0JKX2Zhdm91cml0ZURyaW5rICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDA2LC8qIFszNDQ4XSBPQkpfcm9vbU51bWJlciAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDEsMHgwNywvKiBbMzQ1OF0gT0JKX3Bob3RvICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDA4LC8qIFszNDY4XSBPQkpfdXNlckNsYXNzICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDA5LC8qIFszNDc4XSBPQkpfaG9zdCAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDEsMHgwQSwvKiBbMzQ4OF0gT0JKX21hbmFnZXIgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDAxLDB4MEIsLyogWzM0OThdIE9CSl9kb2N1bWVudElkZW50aWZpZXIgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDAxLDB4MEMsLyogWzM1MDhdIE9CSl9kb2N1bWVudFRpdGxlICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDBELC8qIFszNTE4XSBPQkpfZG9jdW1lbnRWZXJzaW9uICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDBFLC8qIFszNTI4XSBPQkpfZG9jdW1lbnRBdXRob3IgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDAxLDB4MEYsLyogWzM1MzhdIE9CSl9kb2N1bWVudExvY2F0aW9uICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDE0LC8qIFszNTQ4XSBPQkpfaG9tZVRlbGVwaG9uZU51bWJlciAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDEsMHgxNSwvKiBbMzU1OF0gT0JKX3NlY3JldGFyeSAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDEsMHgxNiwvKiBbMzU2OF0gT0JKX290aGVyTWFpbGJveCAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDEsMHgxNywvKiBbMzU3OF0gT0JKX2xhc3RNb2RpZmllZFRpbWUgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDAxLDB4MTgsLyogWzM1ODhdIE9CSl9sYXN0TW9kaWZpZWRCeSAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDEsMHgxQSwvKiBbMzU5OF0gT0JKX2FSZWNvcmQgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDAxLDB4MUIsLyogWzM2MDhdIE9CSl9waWxvdEF0dHJpYnV0ZVR5cGUyNyAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDEsMHgxQywvKiBbMzYxOF0gT0JKX21YUmVjb3JkICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDFELC8qIFszNjI4XSBPQkpfblNSZWNvcmQgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDAxLDB4MUUsLyogWzM2MzhdIE9CSl9zT0FSZWNvcmQgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDAxLDB4MUYsLyogWzM2NDhdIE9CSl9jTkFNRVJlY29yZCAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDEsMHgyNSwvKiBbMzY1OF0gT0JKX2Fzc29jaWF0ZWREb21haW4gKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDAxLDB4MjYsLyogWzM2NjhdIE9CSl9hc3NvY2lhdGVkTmFtZSAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDEsMHgyNywvKiBbMzY3OF0gT0JKX2hvbWVQb3N0YWxBZGRyZXNzICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDI4LC8qIFszNjg4XSBPQkpfcGVyc29uYWxUaXRsZSAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDEsMHgyOSwvKiBbMzY5OF0gT0JKX21vYmlsZVRlbGVwaG9uZU51bWJlciAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDEsMHgyQSwvKiBbMzcwOF0gT0JKX3BhZ2VyVGVsZXBob25lTnVtYmVyICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDJCLC8qIFszNzE4XSBPQkpfZnJpZW5kbHlDb3VudHJ5TmFtZSAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDEsMHgyRCwvKiBbMzcyOF0gT0JKX29yZ2FuaXphdGlvbmFsU3RhdHVzICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDJFLC8qIFszNzM4XSBPQkpfamFuZXRNYWlsYm94ICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDJGLC8qIFszNzQ4XSBPQkpfbWFpbFByZWZlcmVuY2VPcHRpb24gKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDAxLDB4MzAsLyogWzM3NThdIE9CSl9idWlsZGluZ05hbWUgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDAxLDB4MzEsLyogWzM3NjhdIE9CSl9kU0FRdWFsaXR5ICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDMyLC8qIFszNzc4XSBPQkpfc2luZ2xlTGV2ZWxRdWFsaXR5ICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDMzLC8qIFszNzg4XSBPQkpfc3VidHJlZU1pbmltdW1RdWFsaXR5ICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDM0LC8qIFszNzk4XSBPQkpfc3VidHJlZU1heGltdW1RdWFsaXR5ICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDM1LC8qIFszODA4XSBPQkpfcGVyc29uYWxTaWduYXR1cmUgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDAxLDB4MzYsLyogWzM4MThdIE9CSl9kSVRSZWRpcmVjdCAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDEsMHgzNywvKiBbMzgyOF0gT0JKX2F1ZGlvICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDM4LC8qIFszODM4XSBPQkpfZG9jdW1lbnRQdWJsaXNoZXIgKi8KKzB4NTUsMHgwNCwweDJELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFszODQ4XSBPQkpfeDUwMFVuaXF1ZUlkZW50aWZpZXIgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDcsMHgwMSwgICAgICAgICAgICAgICAgICAgIC8qIFszODUxXSBPQkpfbWltZV9taHMgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDcsMHgwMSwweDAxLCAgICAgICAgICAgICAgIC8qIFszODU2XSBPQkpfbWltZV9taHNfaGVhZGluZ3MgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDcsMHgwMSwweDAyLCAgICAgICAgICAgICAgIC8qIFszODYyXSBPQkpfbWltZV9taHNfYm9kaWVzICovCisweDJCLDB4MDYsMHgwMSwweDA3LDB4MDEsMHgwMSwweDAxLCAgICAgICAgICAvKiBbMzg2OF0gT0JKX2lkX2hleF9wYXJ0aWFsX21lc3NhZ2UgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDcsMHgwMSwweDAxLDB4MDIsICAgICAgICAgIC8qIFszODc1XSBPQkpfaWRfaGV4X211bHRpcGFydF9tZXNzYWdlICovCisweDU1LDB4MDQsMHgyQywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMzg4Ml0gT0JKX2dlbmVyYXRpb25RdWFsaWZpZXIgKi8KKzB4NTUsMHgwNCwweDQxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFszODg1XSBPQkpfcHNldWRvbnltICovCisweDY3LDB4MkEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMzg4OF0gT0JKX2lkX3NldCAqLworMHg2NywweDJBLDB4MDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzM4OTBdIE9CSl9zZXRfY3R5cGUgKi8KKzB4NjcsMHgyQSwweDAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFszODkzXSBPQkpfc2V0X21zZ0V4dCAqLworMHg2NywweDJBLDB4MDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzM4OTZdIE9CSl9zZXRfYXR0ciAqLworMHg2NywweDJBLDB4MDUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzM4OTldIE9CSl9zZXRfcG9saWN5ICovCisweDY3LDB4MkEsMHgwNywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMzkwMl0gT0JKX3NldF9jZXJ0RXh0ICovCisweDY3LDB4MkEsMHgwOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMzkwNV0gT0JKX3NldF9icmFuZCAqLworMHg2NywweDJBLDB4MDAsMHgwMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzM5MDhdIE9CSl9zZXRjdF9QQU5EYXRhICovCisweDY3LDB4MkEsMHgwMCwweDAxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMzkxMl0gT0JKX3NldGN0X1BBTlRva2VuICovCisweDY3LDB4MkEsMHgwMCwweDAyLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMzkxNl0gT0JKX3NldGN0X1BBTk9ubHkgKi8KKzB4NjcsMHgyQSwweDAwLDB4MDMsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFszOTIwXSBPQkpfc2V0Y3RfT0lEYXRhICovCisweDY3LDB4MkEsMHgwMCwweDA0LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMzkyNF0gT0JKX3NldGN0X1BJICovCisweDY3LDB4MkEsMHgwMCwweDA1LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMzkyOF0gT0JKX3NldGN0X1BJRGF0YSAqLworMHg2NywweDJBLDB4MDAsMHgwNiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzM5MzJdIE9CSl9zZXRjdF9QSURhdGFVbnNpZ25lZCAqLworMHg2NywweDJBLDB4MDAsMHgwNywgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzM5MzZdIE9CSl9zZXRjdF9IT0RJbnB1dCAqLworMHg2NywweDJBLDB4MDAsMHgwOCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzM5NDBdIE9CSl9zZXRjdF9BdXRoUmVzQmFnZ2FnZSAqLworMHg2NywweDJBLDB4MDAsMHgwOSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzM5NDRdIE9CSl9zZXRjdF9BdXRoUmV2UmVxQmFnZ2FnZSAqLworMHg2NywweDJBLDB4MDAsMHgwQSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzM5NDhdIE9CSl9zZXRjdF9BdXRoUmV2UmVzQmFnZ2FnZSAqLworMHg2NywweDJBLDB4MDAsMHgwQiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzM5NTJdIE9CSl9zZXRjdF9DYXBUb2tlblNlcSAqLworMHg2NywweDJBLDB4MDAsMHgwQywgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzM5NTZdIE9CSl9zZXRjdF9QSW5pdFJlc0RhdGEgKi8KKzB4NjcsMHgyQSwweDAwLDB4MEQsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFszOTYwXSBPQkpfc2V0Y3RfUElfVEJTICovCisweDY3LDB4MkEsMHgwMCwweDBFLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMzk2NF0gT0JKX3NldGN0X1BSZXNEYXRhICovCisweDY3LDB4MkEsMHgwMCwweDEwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMzk2OF0gT0JKX3NldGN0X0F1dGhSZXFUQlMgKi8KKzB4NjcsMHgyQSwweDAwLDB4MTEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFszOTcyXSBPQkpfc2V0Y3RfQXV0aFJlc1RCUyAqLworMHg2NywweDJBLDB4MDAsMHgxMiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzM5NzZdIE9CSl9zZXRjdF9BdXRoUmVzVEJTWCAqLworMHg2NywweDJBLDB4MDAsMHgxMywgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzM5ODBdIE9CSl9zZXRjdF9BdXRoVG9rZW5UQlMgKi8KKzB4NjcsMHgyQSwweDAwLDB4MTQsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFszOTg0XSBPQkpfc2V0Y3RfQ2FwVG9rZW5EYXRhICovCisweDY3LDB4MkEsMHgwMCwweDE1LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMzk4OF0gT0JKX3NldGN0X0NhcFRva2VuVEJTICovCisweDY3LDB4MkEsMHgwMCwweDE2LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMzk5Ml0gT0JKX3NldGN0X0FjcUNhcmRDb2RlTXNnICovCisweDY3LDB4MkEsMHgwMCwweDE3LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMzk5Nl0gT0JKX3NldGN0X0F1dGhSZXZSZXFUQlMgKi8KKzB4NjcsMHgyQSwweDAwLDB4MTgsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MDAwXSBPQkpfc2V0Y3RfQXV0aFJldlJlc0RhdGEgKi8KKzB4NjcsMHgyQSwweDAwLDB4MTksICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MDA0XSBPQkpfc2V0Y3RfQXV0aFJldlJlc1RCUyAqLworMHg2NywweDJBLDB4MDAsMHgxQSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQwMDhdIE9CSl9zZXRjdF9DYXBSZXFUQlMgKi8KKzB4NjcsMHgyQSwweDAwLDB4MUIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MDEyXSBPQkpfc2V0Y3RfQ2FwUmVxVEJTWCAqLworMHg2NywweDJBLDB4MDAsMHgxQywgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQwMTZdIE9CSl9zZXRjdF9DYXBSZXNEYXRhICovCisweDY3LDB4MkEsMHgwMCwweDFELCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDAyMF0gT0JKX3NldGN0X0NhcFJldlJlcVRCUyAqLworMHg2NywweDJBLDB4MDAsMHgxRSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQwMjRdIE9CSl9zZXRjdF9DYXBSZXZSZXFUQlNYICovCisweDY3LDB4MkEsMHgwMCwweDFGLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDAyOF0gT0JKX3NldGN0X0NhcFJldlJlc0RhdGEgKi8KKzB4NjcsMHgyQSwweDAwLDB4MjAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MDMyXSBPQkpfc2V0Y3RfQ3JlZFJlcVRCUyAqLworMHg2NywweDJBLDB4MDAsMHgyMSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQwMzZdIE9CSl9zZXRjdF9DcmVkUmVxVEJTWCAqLworMHg2NywweDJBLDB4MDAsMHgyMiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQwNDBdIE9CSl9zZXRjdF9DcmVkUmVzRGF0YSAqLworMHg2NywweDJBLDB4MDAsMHgyMywgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQwNDRdIE9CSl9zZXRjdF9DcmVkUmV2UmVxVEJTICovCisweDY3LDB4MkEsMHgwMCwweDI0LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDA0OF0gT0JKX3NldGN0X0NyZWRSZXZSZXFUQlNYICovCisweDY3LDB4MkEsMHgwMCwweDI1LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDA1Ml0gT0JKX3NldGN0X0NyZWRSZXZSZXNEYXRhICovCisweDY3LDB4MkEsMHgwMCwweDI2LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDA1Nl0gT0JKX3NldGN0X1BDZXJ0UmVxRGF0YSAqLworMHg2NywweDJBLDB4MDAsMHgyNywgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQwNjBdIE9CSl9zZXRjdF9QQ2VydFJlc1RCUyAqLworMHg2NywweDJBLDB4MDAsMHgyOCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQwNjRdIE9CSl9zZXRjdF9CYXRjaEFkbWluUmVxRGF0YSAqLworMHg2NywweDJBLDB4MDAsMHgyOSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQwNjhdIE9CSl9zZXRjdF9CYXRjaEFkbWluUmVzRGF0YSAqLworMHg2NywweDJBLDB4MDAsMHgyQSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQwNzJdIE9CSl9zZXRjdF9DYXJkQ0luaXRSZXNUQlMgKi8KKzB4NjcsMHgyQSwweDAwLDB4MkIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MDc2XSBPQkpfc2V0Y3RfTWVBcUNJbml0UmVzVEJTICovCisweDY3LDB4MkEsMHgwMCwweDJDLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDA4MF0gT0JKX3NldGN0X1JlZ0Zvcm1SZXNUQlMgKi8KKzB4NjcsMHgyQSwweDAwLDB4MkQsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MDg0XSBPQkpfc2V0Y3RfQ2VydFJlcURhdGEgKi8KKzB4NjcsMHgyQSwweDAwLDB4MkUsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MDg4XSBPQkpfc2V0Y3RfQ2VydFJlcVRCUyAqLworMHg2NywweDJBLDB4MDAsMHgyRiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQwOTJdIE9CSl9zZXRjdF9DZXJ0UmVzRGF0YSAqLworMHg2NywweDJBLDB4MDAsMHgzMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQwOTZdIE9CSl9zZXRjdF9DZXJ0SW5xUmVxVEJTICovCisweDY3LDB4MkEsMHgwMCwweDMxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDEwMF0gT0JKX3NldGN0X0Vycm9yVEJTICovCisweDY3LDB4MkEsMHgwMCwweDMyLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDEwNF0gT0JKX3NldGN0X1BJRHVhbFNpZ25lZFRCRSAqLworMHg2NywweDJBLDB4MDAsMHgzMywgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQxMDhdIE9CSl9zZXRjdF9QSVVuc2lnbmVkVEJFICovCisweDY3LDB4MkEsMHgwMCwweDM0LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDExMl0gT0JKX3NldGN0X0F1dGhSZXFUQkUgKi8KKzB4NjcsMHgyQSwweDAwLDB4MzUsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MTE2XSBPQkpfc2V0Y3RfQXV0aFJlc1RCRSAqLworMHg2NywweDJBLDB4MDAsMHgzNiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQxMjBdIE9CSl9zZXRjdF9BdXRoUmVzVEJFWCAqLworMHg2NywweDJBLDB4MDAsMHgzNywgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQxMjRdIE9CSl9zZXRjdF9BdXRoVG9rZW5UQkUgKi8KKzB4NjcsMHgyQSwweDAwLDB4MzgsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MTI4XSBPQkpfc2V0Y3RfQ2FwVG9rZW5UQkUgKi8KKzB4NjcsMHgyQSwweDAwLDB4MzksICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MTMyXSBPQkpfc2V0Y3RfQ2FwVG9rZW5UQkVYICovCisweDY3LDB4MkEsMHgwMCwweDNBLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDEzNl0gT0JKX3NldGN0X0FjcUNhcmRDb2RlTXNnVEJFICovCisweDY3LDB4MkEsMHgwMCwweDNCLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDE0MF0gT0JKX3NldGN0X0F1dGhSZXZSZXFUQkUgKi8KKzB4NjcsMHgyQSwweDAwLDB4M0MsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MTQ0XSBPQkpfc2V0Y3RfQXV0aFJldlJlc1RCRSAqLworMHg2NywweDJBLDB4MDAsMHgzRCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQxNDhdIE9CSl9zZXRjdF9BdXRoUmV2UmVzVEJFQiAqLworMHg2NywweDJBLDB4MDAsMHgzRSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQxNTJdIE9CSl9zZXRjdF9DYXBSZXFUQkUgKi8KKzB4NjcsMHgyQSwweDAwLDB4M0YsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MTU2XSBPQkpfc2V0Y3RfQ2FwUmVxVEJFWCAqLworMHg2NywweDJBLDB4MDAsMHg0MCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQxNjBdIE9CSl9zZXRjdF9DYXBSZXNUQkUgKi8KKzB4NjcsMHgyQSwweDAwLDB4NDEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MTY0XSBPQkpfc2V0Y3RfQ2FwUmV2UmVxVEJFICovCisweDY3LDB4MkEsMHgwMCwweDQyLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDE2OF0gT0JKX3NldGN0X0NhcFJldlJlcVRCRVggKi8KKzB4NjcsMHgyQSwweDAwLDB4NDMsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MTcyXSBPQkpfc2V0Y3RfQ2FwUmV2UmVzVEJFICovCisweDY3LDB4MkEsMHgwMCwweDQ0LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDE3Nl0gT0JKX3NldGN0X0NyZWRSZXFUQkUgKi8KKzB4NjcsMHgyQSwweDAwLDB4NDUsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MTgwXSBPQkpfc2V0Y3RfQ3JlZFJlcVRCRVggKi8KKzB4NjcsMHgyQSwweDAwLDB4NDYsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MTg0XSBPQkpfc2V0Y3RfQ3JlZFJlc1RCRSAqLworMHg2NywweDJBLDB4MDAsMHg0NywgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQxODhdIE9CSl9zZXRjdF9DcmVkUmV2UmVxVEJFICovCisweDY3LDB4MkEsMHgwMCwweDQ4LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDE5Ml0gT0JKX3NldGN0X0NyZWRSZXZSZXFUQkVYICovCisweDY3LDB4MkEsMHgwMCwweDQ5LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDE5Nl0gT0JKX3NldGN0X0NyZWRSZXZSZXNUQkUgKi8KKzB4NjcsMHgyQSwweDAwLDB4NEEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MjAwXSBPQkpfc2V0Y3RfQmF0Y2hBZG1pblJlcVRCRSAqLworMHg2NywweDJBLDB4MDAsMHg0QiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQyMDRdIE9CSl9zZXRjdF9CYXRjaEFkbWluUmVzVEJFICovCisweDY3LDB4MkEsMHgwMCwweDRDLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDIwOF0gT0JKX3NldGN0X1JlZ0Zvcm1SZXFUQkUgKi8KKzB4NjcsMHgyQSwweDAwLDB4NEQsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MjEyXSBPQkpfc2V0Y3RfQ2VydFJlcVRCRSAqLworMHg2NywweDJBLDB4MDAsMHg0RSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQyMTZdIE9CSl9zZXRjdF9DZXJ0UmVxVEJFWCAqLworMHg2NywweDJBLDB4MDAsMHg0RiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQyMjBdIE9CSl9zZXRjdF9DZXJ0UmVzVEJFICovCisweDY3LDB4MkEsMHgwMCwweDUwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDIyNF0gT0JKX3NldGN0X0NSTE5vdGlmaWNhdGlvblRCUyAqLworMHg2NywweDJBLDB4MDAsMHg1MSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQyMjhdIE9CSl9zZXRjdF9DUkxOb3RpZmljYXRpb25SZXNUQlMgKi8KKzB4NjcsMHgyQSwweDAwLDB4NTIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MjMyXSBPQkpfc2V0Y3RfQkNJRGlzdHJpYnV0aW9uVEJTICovCisweDY3LDB4MkEsMHgwMSwweDAxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDIzNl0gT0JKX3NldGV4dF9nZW5DcnlwdCAqLworMHg2NywweDJBLDB4MDEsMHgwMywgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQyNDBdIE9CSl9zZXRleHRfbWlBdXRoICovCisweDY3LDB4MkEsMHgwMSwweDA0LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDI0NF0gT0JKX3NldGV4dF9waW5TZWN1cmUgKi8KKzB4NjcsMHgyQSwweDAxLDB4MDUsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MjQ4XSBPQkpfc2V0ZXh0X3BpbkFueSAqLworMHg2NywweDJBLDB4MDEsMHgwNywgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQyNTJdIE9CSl9zZXRleHRfdHJhY2syICovCisweDY3LDB4MkEsMHgwMSwweDA4LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDI1Nl0gT0JKX3NldGV4dF9jdiAqLworMHg2NywweDJBLDB4MDUsMHgwMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQyNjBdIE9CSl9zZXRfcG9saWN5X3Jvb3QgKi8KKzB4NjcsMHgyQSwweDA3LDB4MDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MjY0XSBPQkpfc2V0Q2V4dF9oYXNoZWRSb290ICovCisweDY3LDB4MkEsMHgwNywweDAxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDI2OF0gT0JKX3NldENleHRfY2VydFR5cGUgKi8KKzB4NjcsMHgyQSwweDA3LDB4MDIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MjcyXSBPQkpfc2V0Q2V4dF9tZXJjaERhdGEgKi8KKzB4NjcsMHgyQSwweDA3LDB4MDMsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0Mjc2XSBPQkpfc2V0Q2V4dF9jQ2VydFJlcXVpcmVkICovCisweDY3LDB4MkEsMHgwNywweDA0LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDI4MF0gT0JKX3NldENleHRfdHVubmVsaW5nICovCisweDY3LDB4MkEsMHgwNywweDA1LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDI4NF0gT0JKX3NldENleHRfc2V0RXh0ICovCisweDY3LDB4MkEsMHgwNywweDA2LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDI4OF0gT0JKX3NldENleHRfc2V0UXVhbGYgKi8KKzB4NjcsMHgyQSwweDA3LDB4MDcsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MjkyXSBPQkpfc2V0Q2V4dF9QR1dZY2FwYWJpbGl0aWVzICovCisweDY3LDB4MkEsMHgwNywweDA4LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDI5Nl0gT0JKX3NldENleHRfVG9rZW5JZGVudGlmaWVyICovCisweDY3LDB4MkEsMHgwNywweDA5LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDMwMF0gT0JKX3NldENleHRfVHJhY2syRGF0YSAqLworMHg2NywweDJBLDB4MDcsMHgwQSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQzMDRdIE9CSl9zZXRDZXh0X1Rva2VuVHlwZSAqLworMHg2NywweDJBLDB4MDcsMHgwQiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQzMDhdIE9CSl9zZXRDZXh0X0lzc3VlckNhcGFiaWxpdGllcyAqLworMHg2NywweDJBLDB4MDMsMHgwMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQzMTJdIE9CSl9zZXRBdHRyX0NlcnQgKi8KKzB4NjcsMHgyQSwweDAzLDB4MDEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MzE2XSBPQkpfc2V0QXR0cl9QR1dZY2FwICovCisweDY3LDB4MkEsMHgwMywweDAyLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDMyMF0gT0JKX3NldEF0dHJfVG9rZW5UeXBlICovCisweDY3LDB4MkEsMHgwMywweDAzLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDMyNF0gT0JKX3NldEF0dHJfSXNzQ2FwICovCisweDY3LDB4MkEsMHgwMywweDAwLDB4MDAsICAgICAgICAgICAgICAgICAgICAvKiBbNDMyOF0gT0JKX3NldF9yb290S2V5VGh1bWIgKi8KKzB4NjcsMHgyQSwweDAzLDB4MDAsMHgwMSwgICAgICAgICAgICAgICAgICAgIC8qIFs0MzMzXSBPQkpfc2V0X2FkZFBvbGljeSAqLworMHg2NywweDJBLDB4MDMsMHgwMiwweDAxLCAgICAgICAgICAgICAgICAgICAgLyogWzQzMzhdIE9CSl9zZXRBdHRyX1Rva2VuX0VNViAqLworMHg2NywweDJBLDB4MDMsMHgwMiwweDAyLCAgICAgICAgICAgICAgICAgICAgLyogWzQzNDNdIE9CSl9zZXRBdHRyX1Rva2VuX0IwUHJpbWUgKi8KKzB4NjcsMHgyQSwweDAzLDB4MDMsMHgwMywgICAgICAgICAgICAgICAgICAgIC8qIFs0MzQ4XSBPQkpfc2V0QXR0cl9Jc3NDYXBfQ1ZNICovCisweDY3LDB4MkEsMHgwMywweDAzLDB4MDQsICAgICAgICAgICAgICAgICAgICAvKiBbNDM1M10gT0JKX3NldEF0dHJfSXNzQ2FwX1QyICovCisweDY3LDB4MkEsMHgwMywweDAzLDB4MDUsICAgICAgICAgICAgICAgICAgICAvKiBbNDM1OF0gT0JKX3NldEF0dHJfSXNzQ2FwX1NpZyAqLworMHg2NywweDJBLDB4MDMsMHgwMywweDAzLDB4MDEsICAgICAgICAgICAgICAgLyogWzQzNjNdIE9CSl9zZXRBdHRyX0dlbkNyeXB0Z3JtICovCisweDY3LDB4MkEsMHgwMywweDAzLDB4MDQsMHgwMSwgICAgICAgICAgICAgICAvKiBbNDM2OV0gT0JKX3NldEF0dHJfVDJFbmMgKi8KKzB4NjcsMHgyQSwweDAzLDB4MDMsMHgwNCwweDAyLCAgICAgICAgICAgICAgIC8qIFs0Mzc1XSBPQkpfc2V0QXR0cl9UMmNsZWFydHh0ICovCisweDY3LDB4MkEsMHgwMywweDAzLDB4MDUsMHgwMSwgICAgICAgICAgICAgICAvKiBbNDM4MV0gT0JKX3NldEF0dHJfVG9rSUNDc2lnICovCisweDY3LDB4MkEsMHgwMywweDAzLDB4MDUsMHgwMiwgICAgICAgICAgICAgICAvKiBbNDM4N10gT0JKX3NldEF0dHJfU2VjRGV2U2lnICovCisweDY3LDB4MkEsMHgwOCwweDAxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDM5M10gT0JKX3NldF9icmFuZF9JQVRBX0FUQSAqLworMHg2NywweDJBLDB4MDgsMHgxRSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQzOTddIE9CSl9zZXRfYnJhbmRfRGluZXJzICovCisweDY3LDB4MkEsMHgwOCwweDIyLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDQwMV0gT0JKX3NldF9icmFuZF9BbWVyaWNhbkV4cHJlc3MgKi8KKzB4NjcsMHgyQSwweDA4LDB4MjMsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0NDA1XSBPQkpfc2V0X2JyYW5kX0pDQiAqLworMHg2NywweDJBLDB4MDgsMHgwNCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQ0MDldIE9CSl9zZXRfYnJhbmRfVmlzYSAqLworMHg2NywweDJBLDB4MDgsMHgwNSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQ0MTNdIE9CSl9zZXRfYnJhbmRfTWFzdGVyQ2FyZCAqLworMHg2NywweDJBLDB4MDgsMHhBRSwweDdCLCAgICAgICAgICAgICAgICAgICAgLyogWzQ0MTddIE9CSl9zZXRfYnJhbmRfTm92dXMgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDMsMHgwQSwgICAgIC8qIFs0NDIyXSBPQkpfZGVzX2NkbWYgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwMSwweDA2LC8qIFs0NDMwXSBPQkpfcnNhT0FFUEVuY3J5cHRpb25TRVQgKi8KKzB4MDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0NDM5XSBPQkpfaXR1X3QgKi8KKzB4NTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0NDQwXSBPQkpfam9pbnRfaXNvX2l0dV90ICovCisweDY3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDQ0MV0gT0JKX2ludGVybmF0aW9uYWxfb3JnYW5pemF0aW9ucyAqLworMHgyQiwweDA2LDB4MDEsMHgwNCwweDAxLDB4ODIsMHgzNywweDE0LDB4MDIsMHgwMiwvKiBbNDQ0Ml0gT0JKX21zX3NtYXJ0Y2FyZF9sb2dpbiAqLworMHgyQiwweDA2LDB4MDEsMHgwNCwweDAxLDB4ODIsMHgzNywweDE0LDB4MDIsMHgwMywvKiBbNDQ1Ml0gT0JKX21zX3VwbiAqLworMHg1NSwweDA0LDB4MDksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQ0NjJdIE9CSl9zdHJlZXRBZGRyZXNzICovCisweDU1LDB4MDQsMHgxMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDQ2NV0gT0JKX3Bvc3RhbENvZGUgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MTUsICAgICAgICAgIC8qIFs0NDY4XSBPQkpfaWRfcHBsICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDAxLDB4MEUsICAgICAvKiBbNDQ3NV0gT0JKX3Byb3h5Q2VydEluZm8gKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MTUsMHgwMCwgICAgIC8qIFs0NDgzXSBPQkpfaWRfcHBsX2FueUxhbmd1YWdlICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDE1LDB4MDEsICAgICAvKiBbNDQ5MV0gT0JKX2lkX3BwbF9pbmhlcml0QWxsICovCisweDU1LDB4MUQsMHgxRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDQ5OV0gT0JKX25hbWVfY29uc3RyYWludHMgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MTUsMHgwMiwgICAgIC8qIFs0NTAyXSBPQkpfSW5kZXBlbmRlbnQgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwMSwweDBCLC8qIFs0NTEwXSBPQkpfc2hhMjU2V2l0aFJTQUVuY3J5cHRpb24gKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwMSwweDBDLC8qIFs0NTE5XSBPQkpfc2hhMzg0V2l0aFJTQUVuY3J5cHRpb24gKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwMSwweDBELC8qIFs0NTI4XSBPQkpfc2hhNTEyV2l0aFJTQUVuY3J5cHRpb24gKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwMSwweDBFLC8qIFs0NTM3XSBPQkpfc2hhMjI0V2l0aFJTQUVuY3J5cHRpb24gKi8KKzB4NjAsMHg4NiwweDQ4LDB4MDEsMHg2NSwweDAzLDB4MDQsMHgwMiwweDAxLC8qIFs0NTQ2XSBPQkpfc2hhMjU2ICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4NjUsMHgwMywweDA0LDB4MDIsMHgwMiwvKiBbNDU1NV0gT0JKX3NoYTM4NCAqLworMHg2MCwweDg2LDB4NDgsMHgwMSwweDY1LDB4MDMsMHgwNCwweDAyLDB4MDMsLyogWzQ1NjRdIE9CSl9zaGE1MTIgKi8KKzB4NjAsMHg4NiwweDQ4LDB4MDEsMHg2NSwweDAzLDB4MDQsMHgwMiwweDA0LC8qIFs0NTczXSBPQkpfc2hhMjI0ICovCisweDJCLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDU4Ml0gT0JKX2lkZW50aWZpZWRfb3JnYW5pemF0aW9uICovCisweDJCLDB4ODEsMHgwNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDU4M10gT0JKX2NlcnRpY29tX2FyYyAqLworMHg2NywweDJCLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQ1ODZdIE9CSl93YXAgKi8KKzB4NjcsMHgyQiwweDAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0NTg4XSBPQkpfd2FwX3dzZyAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDNELDB4MDEsMHgwMiwweDAzLCAgICAgLyogWzQ1OTFdIE9CSl9YOV82Ml9pZF9jaGFyYWN0ZXJpc3RpY190d29fYmFzaXMgKi8KKzB4MkEsMHg4NiwweDQ4LDB4Q0UsMHgzRCwweDAxLDB4MDIsMHgwMywweDAxLC8qIFs0NTk5XSBPQkpfWDlfNjJfb25CYXNpcyAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDNELDB4MDEsMHgwMiwweDAzLDB4MDIsLyogWzQ2MDhdIE9CSl9YOV82Ml90cEJhc2lzICovCisweDJBLDB4ODYsMHg0OCwweENFLDB4M0QsMHgwMSwweDAyLDB4MDMsMHgwMywvKiBbNDYxN10gT0JKX1g5XzYyX3BwQmFzaXMgKi8KKzB4MkEsMHg4NiwweDQ4LDB4Q0UsMHgzRCwweDAzLDB4MDAsMHgwMSwgICAgIC8qIFs0NjI2XSBPQkpfWDlfNjJfYzJwbmIxNjN2MSAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDNELDB4MDMsMHgwMCwweDAyLCAgICAgLyogWzQ2MzRdIE9CSl9YOV82Ml9jMnBuYjE2M3YyICovCisweDJBLDB4ODYsMHg0OCwweENFLDB4M0QsMHgwMywweDAwLDB4MDMsICAgICAvKiBbNDY0Ml0gT0JKX1g5XzYyX2MycG5iMTYzdjMgKi8KKzB4MkEsMHg4NiwweDQ4LDB4Q0UsMHgzRCwweDAzLDB4MDAsMHgwNCwgICAgIC8qIFs0NjUwXSBPQkpfWDlfNjJfYzJwbmIxNzZ2MSAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDNELDB4MDMsMHgwMCwweDA1LCAgICAgLyogWzQ2NThdIE9CSl9YOV82Ml9jMnRuYjE5MXYxICovCisweDJBLDB4ODYsMHg0OCwweENFLDB4M0QsMHgwMywweDAwLDB4MDYsICAgICAvKiBbNDY2Nl0gT0JKX1g5XzYyX2MydG5iMTkxdjIgKi8KKzB4MkEsMHg4NiwweDQ4LDB4Q0UsMHgzRCwweDAzLDB4MDAsMHgwNywgICAgIC8qIFs0Njc0XSBPQkpfWDlfNjJfYzJ0bmIxOTF2MyAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDNELDB4MDMsMHgwMCwweDA4LCAgICAgLyogWzQ2ODJdIE9CSl9YOV82Ml9jMm9uYjE5MXY0ICovCisweDJBLDB4ODYsMHg0OCwweENFLDB4M0QsMHgwMywweDAwLDB4MDksICAgICAvKiBbNDY5MF0gT0JKX1g5XzYyX2Myb25iMTkxdjUgKi8KKzB4MkEsMHg4NiwweDQ4LDB4Q0UsMHgzRCwweDAzLDB4MDAsMHgwQSwgICAgIC8qIFs0Njk4XSBPQkpfWDlfNjJfYzJwbmIyMDh3MSAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDNELDB4MDMsMHgwMCwweDBCLCAgICAgLyogWzQ3MDZdIE9CSl9YOV82Ml9jMnRuYjIzOXYxICovCisweDJBLDB4ODYsMHg0OCwweENFLDB4M0QsMHgwMywweDAwLDB4MEMsICAgICAvKiBbNDcxNF0gT0JKX1g5XzYyX2MydG5iMjM5djIgKi8KKzB4MkEsMHg4NiwweDQ4LDB4Q0UsMHgzRCwweDAzLDB4MDAsMHgwRCwgICAgIC8qIFs0NzIyXSBPQkpfWDlfNjJfYzJ0bmIyMzl2MyAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDNELDB4MDMsMHgwMCwweDBFLCAgICAgLyogWzQ3MzBdIE9CSl9YOV82Ml9jMm9uYjIzOXY0ICovCisweDJBLDB4ODYsMHg0OCwweENFLDB4M0QsMHgwMywweDAwLDB4MEYsICAgICAvKiBbNDczOF0gT0JKX1g5XzYyX2Myb25iMjM5djUgKi8KKzB4MkEsMHg4NiwweDQ4LDB4Q0UsMHgzRCwweDAzLDB4MDAsMHgxMCwgICAgIC8qIFs0NzQ2XSBPQkpfWDlfNjJfYzJwbmIyNzJ3MSAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDNELDB4MDMsMHgwMCwweDExLCAgICAgLyogWzQ3NTRdIE9CSl9YOV82Ml9jMnBuYjMwNHcxICovCisweDJBLDB4ODYsMHg0OCwweENFLDB4M0QsMHgwMywweDAwLDB4MTIsICAgICAvKiBbNDc2Ml0gT0JKX1g5XzYyX2MydG5iMzU5djEgKi8KKzB4MkEsMHg4NiwweDQ4LDB4Q0UsMHgzRCwweDAzLDB4MDAsMHgxMywgICAgIC8qIFs0NzcwXSBPQkpfWDlfNjJfYzJwbmIzNjh3MSAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDNELDB4MDMsMHgwMCwweDE0LCAgICAgLyogWzQ3NzhdIE9CSl9YOV82Ml9jMnRuYjQzMXIxICovCisweDJCLDB4ODEsMHgwNCwweDAwLDB4MDYsICAgICAgICAgICAgICAgICAgICAvKiBbNDc4Nl0gT0JKX3NlY3AxMTJyMSAqLworMHgyQiwweDgxLDB4MDQsMHgwMCwweDA3LCAgICAgICAgICAgICAgICAgICAgLyogWzQ3OTFdIE9CSl9zZWNwMTEycjIgKi8KKzB4MkIsMHg4MSwweDA0LDB4MDAsMHgxQywgICAgICAgICAgICAgICAgICAgIC8qIFs0Nzk2XSBPQkpfc2VjcDEyOHIxICovCisweDJCLDB4ODEsMHgwNCwweDAwLDB4MUQsICAgICAgICAgICAgICAgICAgICAvKiBbNDgwMV0gT0JKX3NlY3AxMjhyMiAqLworMHgyQiwweDgxLDB4MDQsMHgwMCwweDA5LCAgICAgICAgICAgICAgICAgICAgLyogWzQ4MDZdIE9CSl9zZWNwMTYwazEgKi8KKzB4MkIsMHg4MSwweDA0LDB4MDAsMHgwOCwgICAgICAgICAgICAgICAgICAgIC8qIFs0ODExXSBPQkpfc2VjcDE2MHIxICovCisweDJCLDB4ODEsMHgwNCwweDAwLDB4MUUsICAgICAgICAgICAgICAgICAgICAvKiBbNDgxNl0gT0JKX3NlY3AxNjByMiAqLworMHgyQiwweDgxLDB4MDQsMHgwMCwweDFGLCAgICAgICAgICAgICAgICAgICAgLyogWzQ4MjFdIE9CSl9zZWNwMTkyazEgKi8KKzB4MkIsMHg4MSwweDA0LDB4MDAsMHgyMCwgICAgICAgICAgICAgICAgICAgIC8qIFs0ODI2XSBPQkpfc2VjcDIyNGsxICovCisweDJCLDB4ODEsMHgwNCwweDAwLDB4MjEsICAgICAgICAgICAgICAgICAgICAvKiBbNDgzMV0gT0JKX3NlY3AyMjRyMSAqLworMHgyQiwweDgxLDB4MDQsMHgwMCwweDBBLCAgICAgICAgICAgICAgICAgICAgLyogWzQ4MzZdIE9CSl9zZWNwMjU2azEgKi8KKzB4MkIsMHg4MSwweDA0LDB4MDAsMHgyMiwgICAgICAgICAgICAgICAgICAgIC8qIFs0ODQxXSBPQkpfc2VjcDM4NHIxICovCisweDJCLDB4ODEsMHgwNCwweDAwLDB4MjMsICAgICAgICAgICAgICAgICAgICAvKiBbNDg0Nl0gT0JKX3NlY3A1MjFyMSAqLworMHgyQiwweDgxLDB4MDQsMHgwMCwweDA0LCAgICAgICAgICAgICAgICAgICAgLyogWzQ4NTFdIE9CSl9zZWN0MTEzcjEgKi8KKzB4MkIsMHg4MSwweDA0LDB4MDAsMHgwNSwgICAgICAgICAgICAgICAgICAgIC8qIFs0ODU2XSBPQkpfc2VjdDExM3IyICovCisweDJCLDB4ODEsMHgwNCwweDAwLDB4MTYsICAgICAgICAgICAgICAgICAgICAvKiBbNDg2MV0gT0JKX3NlY3QxMzFyMSAqLworMHgyQiwweDgxLDB4MDQsMHgwMCwweDE3LCAgICAgICAgICAgICAgICAgICAgLyogWzQ4NjZdIE9CSl9zZWN0MTMxcjIgKi8KKzB4MkIsMHg4MSwweDA0LDB4MDAsMHgwMSwgICAgICAgICAgICAgICAgICAgIC8qIFs0ODcxXSBPQkpfc2VjdDE2M2sxICovCisweDJCLDB4ODEsMHgwNCwweDAwLDB4MDIsICAgICAgICAgICAgICAgICAgICAvKiBbNDg3Nl0gT0JKX3NlY3QxNjNyMSAqLworMHgyQiwweDgxLDB4MDQsMHgwMCwweDBGLCAgICAgICAgICAgICAgICAgICAgLyogWzQ4ODFdIE9CSl9zZWN0MTYzcjIgKi8KKzB4MkIsMHg4MSwweDA0LDB4MDAsMHgxOCwgICAgICAgICAgICAgICAgICAgIC8qIFs0ODg2XSBPQkpfc2VjdDE5M3IxICovCisweDJCLDB4ODEsMHgwNCwweDAwLDB4MTksICAgICAgICAgICAgICAgICAgICAvKiBbNDg5MV0gT0JKX3NlY3QxOTNyMiAqLworMHgyQiwweDgxLDB4MDQsMHgwMCwweDFBLCAgICAgICAgICAgICAgICAgICAgLyogWzQ4OTZdIE9CSl9zZWN0MjMzazEgKi8KKzB4MkIsMHg4MSwweDA0LDB4MDAsMHgxQiwgICAgICAgICAgICAgICAgICAgIC8qIFs0OTAxXSBPQkpfc2VjdDIzM3IxICovCisweDJCLDB4ODEsMHgwNCwweDAwLDB4MDMsICAgICAgICAgICAgICAgICAgICAvKiBbNDkwNl0gT0JKX3NlY3QyMzlrMSAqLworMHgyQiwweDgxLDB4MDQsMHgwMCwweDEwLCAgICAgICAgICAgICAgICAgICAgLyogWzQ5MTFdIE9CSl9zZWN0MjgzazEgKi8KKzB4MkIsMHg4MSwweDA0LDB4MDAsMHgxMSwgICAgICAgICAgICAgICAgICAgIC8qIFs0OTE2XSBPQkpfc2VjdDI4M3IxICovCisweDJCLDB4ODEsMHgwNCwweDAwLDB4MjQsICAgICAgICAgICAgICAgICAgICAvKiBbNDkyMV0gT0JKX3NlY3Q0MDlrMSAqLworMHgyQiwweDgxLDB4MDQsMHgwMCwweDI1LCAgICAgICAgICAgICAgICAgICAgLyogWzQ5MjZdIE9CSl9zZWN0NDA5cjEgKi8KKzB4MkIsMHg4MSwweDA0LDB4MDAsMHgyNiwgICAgICAgICAgICAgICAgICAgIC8qIFs0OTMxXSBPQkpfc2VjdDU3MWsxICovCisweDJCLDB4ODEsMHgwNCwweDAwLDB4MjcsICAgICAgICAgICAgICAgICAgICAvKiBbNDkzNl0gT0JKX3NlY3Q1NzFyMSAqLworMHg2NywweDJCLDB4MDEsMHgwNCwweDAxLCAgICAgICAgICAgICAgICAgICAgLyogWzQ5NDFdIE9CSl93YXBfd3NnX2lkbV9lY2lkX3d0bHMxICovCisweDY3LDB4MkIsMHgwMSwweDA0LDB4MDMsICAgICAgICAgICAgICAgICAgICAvKiBbNDk0Nl0gT0JKX3dhcF93c2dfaWRtX2VjaWRfd3RsczMgKi8KKzB4NjcsMHgyQiwweDAxLDB4MDQsMHgwNCwgICAgICAgICAgICAgICAgICAgIC8qIFs0OTUxXSBPQkpfd2FwX3dzZ19pZG1fZWNpZF93dGxzNCAqLworMHg2NywweDJCLDB4MDEsMHgwNCwweDA1LCAgICAgICAgICAgICAgICAgICAgLyogWzQ5NTZdIE9CSl93YXBfd3NnX2lkbV9lY2lkX3d0bHM1ICovCisweDY3LDB4MkIsMHgwMSwweDA0LDB4MDYsICAgICAgICAgICAgICAgICAgICAvKiBbNDk2MV0gT0JKX3dhcF93c2dfaWRtX2VjaWRfd3RsczYgKi8KKzB4NjcsMHgyQiwweDAxLDB4MDQsMHgwNywgICAgICAgICAgICAgICAgICAgIC8qIFs0OTY2XSBPQkpfd2FwX3dzZ19pZG1fZWNpZF93dGxzNyAqLworMHg2NywweDJCLDB4MDEsMHgwNCwweDA4LCAgICAgICAgICAgICAgICAgICAgLyogWzQ5NzFdIE9CSl93YXBfd3NnX2lkbV9lY2lkX3d0bHM4ICovCisweDY3LDB4MkIsMHgwMSwweDA0LDB4MDksICAgICAgICAgICAgICAgICAgICAvKiBbNDk3Nl0gT0JKX3dhcF93c2dfaWRtX2VjaWRfd3RsczkgKi8KKzB4NjcsMHgyQiwweDAxLDB4MDQsMHgwQSwgICAgICAgICAgICAgICAgICAgIC8qIFs0OTgxXSBPQkpfd2FwX3dzZ19pZG1fZWNpZF93dGxzMTAgKi8KKzB4NjcsMHgyQiwweDAxLDB4MDQsMHgwQiwgICAgICAgICAgICAgICAgICAgIC8qIFs0OTg2XSBPQkpfd2FwX3dzZ19pZG1fZWNpZF93dGxzMTEgKi8KKzB4NjcsMHgyQiwweDAxLDB4MDQsMHgwQywgICAgICAgICAgICAgICAgICAgIC8qIFs0OTkxXSBPQkpfd2FwX3dzZ19pZG1fZWNpZF93dGxzMTIgKi8KKzB4NTUsMHgxRCwweDIwLDB4MDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0OTk2XSBPQkpfYW55X3BvbGljeSAqLworMHg1NSwweDFELDB4MjEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzUwMDBdIE9CSl9wb2xpY3lfbWFwcGluZ3MgKi8KKzB4NTUsMHgxRCwweDM2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1MDAzXSBPQkpfaW5oaWJpdF9hbnlfcG9saWN5ICovCisweDJBLDB4ODMsMHgwOCwweDhDLDB4OUEsMHg0QiwweDNELDB4MDEsMHgwMSwweDAxLDB4MDIsLyogWzUwMDZdIE9CSl9jYW1lbGxpYV8xMjhfY2JjICovCisweDJBLDB4ODMsMHgwOCwweDhDLDB4OUEsMHg0QiwweDNELDB4MDEsMHgwMSwweDAxLDB4MDMsLyogWzUwMTddIE9CSl9jYW1lbGxpYV8xOTJfY2JjICovCisweDJBLDB4ODMsMHgwOCwweDhDLDB4OUEsMHg0QiwweDNELDB4MDEsMHgwMSwweDAxLDB4MDQsLyogWzUwMjhdIE9CSl9jYW1lbGxpYV8yNTZfY2JjICovCisweDAzLDB4QTIsMHgzMSwweDA1LDB4MDMsMHgwMSwweDA5LDB4MDEsICAgICAvKiBbNTAzOV0gT0JKX2NhbWVsbGlhXzEyOF9lY2IgKi8KKzB4MDMsMHhBMiwweDMxLDB4MDUsMHgwMywweDAxLDB4MDksMHgxNSwgICAgIC8qIFs1MDQ3XSBPQkpfY2FtZWxsaWFfMTkyX2VjYiAqLworMHgwMywweEEyLDB4MzEsMHgwNSwweDAzLDB4MDEsMHgwOSwweDI5LCAgICAgLyogWzUwNTVdIE9CSl9jYW1lbGxpYV8yNTZfZWNiICovCisweDAzLDB4QTIsMHgzMSwweDA1LDB4MDMsMHgwMSwweDA5LDB4MDQsICAgICAvKiBbNTA2M10gT0JKX2NhbWVsbGlhXzEyOF9jZmIxMjggKi8KKzB4MDMsMHhBMiwweDMxLDB4MDUsMHgwMywweDAxLDB4MDksMHgxOCwgICAgIC8qIFs1MDcxXSBPQkpfY2FtZWxsaWFfMTkyX2NmYjEyOCAqLworMHgwMywweEEyLDB4MzEsMHgwNSwweDAzLDB4MDEsMHgwOSwweDJDLCAgICAgLyogWzUwNzldIE9CSl9jYW1lbGxpYV8yNTZfY2ZiMTI4ICovCisweDAzLDB4QTIsMHgzMSwweDA1LDB4MDMsMHgwMSwweDA5LDB4MDMsICAgICAvKiBbNTA4N10gT0JKX2NhbWVsbGlhXzEyOF9vZmIxMjggKi8KKzB4MDMsMHhBMiwweDMxLDB4MDUsMHgwMywweDAxLDB4MDksMHgxNywgICAgIC8qIFs1MDk1XSBPQkpfY2FtZWxsaWFfMTkyX29mYjEyOCAqLworMHgwMywweEEyLDB4MzEsMHgwNSwweDAzLDB4MDEsMHgwOSwweDJCLCAgICAgLyogWzUxMDNdIE9CSl9jYW1lbGxpYV8yNTZfb2ZiMTI4ICovCisweDU1LDB4MUQsMHgwOSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTExMV0gT0JKX3N1YmplY3RfZGlyZWN0b3J5X2F0dHJpYnV0ZXMgKi8KKzB4NTUsMHgxRCwweDFDLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1MTE0XSBPQkpfaXNzdWluZ19kaXN0cmlidXRpb25fcG9pbnQgKi8KKzB4NTUsMHgxRCwweDFELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1MTE3XSBPQkpfY2VydGlmaWNhdGVfaXNzdWVyICovCisweDJBLDB4ODMsMHgxQSwweDhDLDB4OUEsMHg0NCwgICAgICAgICAgICAgICAvKiBbNTEyMF0gT0JKX2tpc2EgKi8KKzB4MkEsMHg4MywweDFBLDB4OEMsMHg5QSwweDQ0LDB4MDEsMHgwMywgICAgIC8qIFs1MTI2XSBPQkpfc2VlZF9lY2IgKi8KKzB4MkEsMHg4MywweDFBLDB4OEMsMHg5QSwweDQ0LDB4MDEsMHgwNCwgICAgIC8qIFs1MTM0XSBPQkpfc2VlZF9jYmMgKi8KKzB4MkEsMHg4MywweDFBLDB4OEMsMHg5QSwweDQ0LDB4MDEsMHgwNiwgICAgIC8qIFs1MTQyXSBPQkpfc2VlZF9vZmIxMjggKi8KKzB4MkEsMHg4MywweDFBLDB4OEMsMHg5QSwweDQ0LDB4MDEsMHgwNSwgICAgIC8qIFs1MTUwXSBPQkpfc2VlZF9jZmIxMjggKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA4LDB4MDEsMHgwMSwgICAgIC8qIFs1MTU4XSBPQkpfaG1hY19tZDUgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA4LDB4MDEsMHgwMiwgICAgIC8qIFs1MTY2XSBPQkpfaG1hY19zaGExICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjYsMHg3RCwweDA3LDB4NDIsMHgwRCwvKiBbNTE3NF0gT0JKX2lkX1Bhc3N3b3JkQmFzZWRNQUMgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNiwweDdELDB4MDcsMHg0MiwweDFFLC8qIFs1MTgzXSBPQkpfaWRfREhCYXNlZE1hYyAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNCwweDEwLCAgICAgLyogWzUxOTJdIE9CSl9pZF9pdF9zdXBwTGFuZ1RhZ3MgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MzAsMHgwNSwgICAgIC8qIFs1MjAwXSBPQkpfY2FSZXBvc2l0b3J5ICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAxLDB4MDksLyogWzUyMDhdIE9CSl9pZF9zbWltZV9jdF9jb21wcmVzc2VkRGF0YSAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMSwweDFCLC8qIFs1MjE5XSBPQkpfaWRfY3RfYXNjaWlUZXh0V2l0aENSTEYgKi8KKzB4NjAsMHg4NiwweDQ4LDB4MDEsMHg2NSwweDAzLDB4MDQsMHgwMSwweDA1LC8qIFs1MjMwXSBPQkpfaWRfYWVzMTI4X3dyYXAgKi8KKzB4NjAsMHg4NiwweDQ4LDB4MDEsMHg2NSwweDAzLDB4MDQsMHgwMSwweDE5LC8qIFs1MjM5XSBPQkpfaWRfYWVzMTkyX3dyYXAgKi8KKzB4NjAsMHg4NiwweDQ4LDB4MDEsMHg2NSwweDAzLDB4MDQsMHgwMSwweDJELC8qIFs1MjQ4XSBPQkpfaWRfYWVzMjU2X3dyYXAgKi8KKzB4MkEsMHg4NiwweDQ4LDB4Q0UsMHgzRCwweDA0LDB4MDIsICAgICAgICAgIC8qIFs1MjU3XSBPQkpfZWNkc2Ffd2l0aF9SZWNvbW1lbmRlZCAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDNELDB4MDQsMHgwMywgICAgICAgICAgLyogWzUyNjRdIE9CSl9lY2RzYV93aXRoX1NwZWNpZmllZCAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDNELDB4MDQsMHgwMywweDAxLCAgICAgLyogWzUyNzFdIE9CSl9lY2RzYV93aXRoX1NIQTIyNCAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDNELDB4MDQsMHgwMywweDAyLCAgICAgLyogWzUyNzldIE9CSl9lY2RzYV93aXRoX1NIQTI1NiAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDNELDB4MDQsMHgwMywweDAzLCAgICAgLyogWzUyODddIE9CSl9lY2RzYV93aXRoX1NIQTM4NCAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDNELDB4MDQsMHgwMywweDA0LCAgICAgLyogWzUyOTVdIE9CSl9lY2RzYV93aXRoX1NIQTUxMiAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMiwweDA2LCAgICAgLyogWzUzMDNdIE9CSl9obWFjV2l0aE1ENSAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMiwweDA4LCAgICAgLyogWzUzMTFdIE9CSl9obWFjV2l0aFNIQTIyNCAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMiwweDA5LCAgICAgLyogWzUzMTldIE9CSl9obWFjV2l0aFNIQTI1NiAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMiwweDBBLCAgICAgLyogWzUzMjddIE9CSl9obWFjV2l0aFNIQTM4NCAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMiwweDBCLCAgICAgLyogWzUzMzVdIE9CSl9obWFjV2l0aFNIQTUxMiAqLworMHg2MCwweDg2LDB4NDgsMHgwMSwweDY1LDB4MDMsMHgwNCwweDAzLDB4MDEsLyogWzUzNDNdIE9CSl9kc2Ffd2l0aF9TSEEyMjQgKi8KKzB4NjAsMHg4NiwweDQ4LDB4MDEsMHg2NSwweDAzLDB4MDQsMHgwMywweDAyLC8qIFs1MzUyXSBPQkpfZHNhX3dpdGhfU0hBMjU2ICovCisweDI4LDB4Q0YsMHgwNiwweDAzLDB4MDAsMHgzNywgICAgICAgICAgICAgICAvKiBbNTM2MV0gT0JKX3doaXJscG9vbCAqLworMHgyQSwweDg1LDB4MDMsMHgwMiwweDAyLCAgICAgICAgICAgICAgICAgICAgLyogWzUzNjddIE9CSl9jcnlwdG9wcm8gKi8KKzB4MkEsMHg4NSwweDAzLDB4MDIsMHgwOSwgICAgICAgICAgICAgICAgICAgIC8qIFs1MzcyXSBPQkpfY3J5cHRvY29tICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgwMywgICAgICAgICAgICAgICAvKiBbNTM3N10gT0JKX2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF8yMDAxICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgwNCwgICAgICAgICAgICAgICAvKiBbNTM4M10gT0JKX2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF85NCAqLworMHgyQSwweDg1LDB4MDMsMHgwMiwweDAyLDB4MDksICAgICAgICAgICAgICAgLyogWzUzODldIE9CSl9pZF9Hb3N0UjM0MTFfOTQgKi8KKzB4MkEsMHg4NSwweDAzLDB4MDIsMHgwMiwweDBBLCAgICAgICAgICAgICAgIC8qIFs1Mzk1XSBPQkpfaWRfSE1BQ0dvc3RSMzQxMV85NCAqLworMHgyQSwweDg1LDB4MDMsMHgwMiwweDAyLDB4MTMsICAgICAgICAgICAgICAgLyogWzU0MDFdIE9CSl9pZF9Hb3N0UjM0MTBfMjAwMSAqLworMHgyQSwweDg1LDB4MDMsMHgwMiwweDAyLDB4MTQsICAgICAgICAgICAgICAgLyogWzU0MDddIE9CSl9pZF9Hb3N0UjM0MTBfOTQgKi8KKzB4MkEsMHg4NSwweDAzLDB4MDIsMHgwMiwweDE1LCAgICAgICAgICAgICAgIC8qIFs1NDEzXSBPQkpfaWRfR29zdDI4MTQ3Xzg5ICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgxNiwgICAgICAgICAgICAgICAvKiBbNTQxOV0gT0JKX2lkX0dvc3QyODE0N184OV9NQUMgKi8KKzB4MkEsMHg4NSwweDAzLDB4MDIsMHgwMiwweDE3LCAgICAgICAgICAgICAgIC8qIFs1NDI1XSBPQkpfaWRfR29zdFIzNDExXzk0X3ByZiAqLworMHgyQSwweDg1LDB4MDMsMHgwMiwweDAyLDB4NjIsICAgICAgICAgICAgICAgLyogWzU0MzFdIE9CSl9pZF9Hb3N0UjM0MTBfMjAwMURIICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHg2MywgICAgICAgICAgICAgICAvKiBbNTQzN10gT0JKX2lkX0dvc3RSMzQxMF85NERIICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgwRSwweDAxLCAgICAgICAgICAvKiBbNTQ0M10gT0JKX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fS2V5TWVzaGluZyAqLworMHgyQSwweDg1LDB4MDMsMHgwMiwweDAyLDB4MEUsMHgwMCwgICAgICAgICAgLyogWzU0NTBdIE9CSl9pZF9Hb3N0MjgxNDdfODlfTm9uZV9LZXlNZXNoaW5nICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgxRSwweDAwLCAgICAgICAgICAvKiBbNTQ1N10gT0JKX2lkX0dvc3RSMzQxMV85NF9UZXN0UGFyYW1TZXQgKi8KKzB4MkEsMHg4NSwweDAzLDB4MDIsMHgwMiwweDFFLDB4MDEsICAgICAgICAgIC8qIFs1NDY0XSBPQkpfaWRfR29zdFIzNDExXzk0X0NyeXB0b1Byb1BhcmFtU2V0ICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgxRiwweDAwLCAgICAgICAgICAvKiBbNTQ3MV0gT0JKX2lkX0dvc3QyODE0N184OV9UZXN0UGFyYW1TZXQgKi8KKzB4MkEsMHg4NSwweDAzLDB4MDIsMHgwMiwweDFGLDB4MDEsICAgICAgICAgIC8qIFs1NDc4XSBPQkpfaWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19BX1BhcmFtU2V0ICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgxRiwweDAyLCAgICAgICAgICAvKiBbNTQ4NV0gT0JKX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fQl9QYXJhbVNldCAqLworMHgyQSwweDg1LDB4MDMsMHgwMiwweDAyLDB4MUYsMHgwMywgICAgICAgICAgLyogWzU0OTJdIE9CSl9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX0NfUGFyYW1TZXQgKi8KKzB4MkEsMHg4NSwweDAzLDB4MDIsMHgwMiwweDFGLDB4MDQsICAgICAgICAgIC8qIFs1NDk5XSBPQkpfaWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19EX1BhcmFtU2V0ICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgxRiwweDA1LCAgICAgICAgICAvKiBbNTUwNl0gT0JKX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fT3NjYXJfMV8xX1BhcmFtU2V0ICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgxRiwweDA2LCAgICAgICAgICAvKiBbNTUxM10gT0JKX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fT3NjYXJfMV8wX1BhcmFtU2V0ICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgxRiwweDA3LCAgICAgICAgICAvKiBbNTUyMF0gT0JKX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fUklDXzFfUGFyYW1TZXQgKi8KKzB4MkEsMHg4NSwweDAzLDB4MDIsMHgwMiwweDIwLDB4MDAsICAgICAgICAgIC8qIFs1NTI3XSBPQkpfaWRfR29zdFIzNDEwXzk0X1Rlc3RQYXJhbVNldCAqLworMHgyQSwweDg1LDB4MDMsMHgwMiwweDAyLDB4MjAsMHgwMiwgICAgICAgICAgLyogWzU1MzRdIE9CSl9pZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX0FfUGFyYW1TZXQgKi8KKzB4MkEsMHg4NSwweDAzLDB4MDIsMHgwMiwweDIwLDB4MDMsICAgICAgICAgIC8qIFs1NTQxXSBPQkpfaWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19CX1BhcmFtU2V0ICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgyMCwweDA0LCAgICAgICAgICAvKiBbNTU0OF0gT0JKX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fQ19QYXJhbVNldCAqLworMHgyQSwweDg1LDB4MDMsMHgwMiwweDAyLDB4MjAsMHgwNSwgICAgICAgICAgLyogWzU1NTVdIE9CSl9pZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX0RfUGFyYW1TZXQgKi8KKzB4MkEsMHg4NSwweDAzLDB4MDIsMHgwMiwweDIxLDB4MDEsICAgICAgICAgIC8qIFs1NTYyXSBPQkpfaWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19YY2hBX1BhcmFtU2V0ICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgyMSwweDAyLCAgICAgICAgICAvKiBbNTU2OV0gT0JKX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fWGNoQl9QYXJhbVNldCAqLworMHgyQSwweDg1LDB4MDMsMHgwMiwweDAyLDB4MjEsMHgwMywgICAgICAgICAgLyogWzU1NzZdIE9CSl9pZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX1hjaENfUGFyYW1TZXQgKi8KKzB4MkEsMHg4NSwweDAzLDB4MDIsMHgwMiwweDIzLDB4MDAsICAgICAgICAgIC8qIFs1NTgzXSBPQkpfaWRfR29zdFIzNDEwXzIwMDFfVGVzdFBhcmFtU2V0ICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgyMywweDAxLCAgICAgICAgICAvKiBbNTU5MF0gT0JKX2lkX0dvc3RSMzQxMF8yMDAxX0NyeXB0b1Byb19BX1BhcmFtU2V0ICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgyMywweDAyLCAgICAgICAgICAvKiBbNTU5N10gT0JKX2lkX0dvc3RSMzQxMF8yMDAxX0NyeXB0b1Byb19CX1BhcmFtU2V0ICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgyMywweDAzLCAgICAgICAgICAvKiBbNTYwNF0gT0JKX2lkX0dvc3RSMzQxMF8yMDAxX0NyeXB0b1Byb19DX1BhcmFtU2V0ICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgyNCwweDAwLCAgICAgICAgICAvKiBbNTYxMV0gT0JKX2lkX0dvc3RSMzQxMF8yMDAxX0NyeXB0b1Byb19YY2hBX1BhcmFtU2V0ICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgyNCwweDAxLCAgICAgICAgICAvKiBbNTYxOF0gT0JKX2lkX0dvc3RSMzQxMF8yMDAxX0NyeXB0b1Byb19YY2hCX1BhcmFtU2V0ICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgxNCwweDAxLCAgICAgICAgICAvKiBbNTYyNV0gT0JKX2lkX0dvc3RSMzQxMF85NF9hICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgxNCwweDAyLCAgICAgICAgICAvKiBbNTYzMl0gT0JKX2lkX0dvc3RSMzQxMF85NF9hQmlzICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgxNCwweDAzLCAgICAgICAgICAvKiBbNTYzOV0gT0JKX2lkX0dvc3RSMzQxMF85NF9iICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgxNCwweDA0LCAgICAgICAgICAvKiBbNTY0Nl0gT0JKX2lkX0dvc3RSMzQxMF85NF9iQmlzICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDksMHgwMSwweDA2LDB4MDEsICAgICAvKiBbNTY1M10gT0JKX2lkX0dvc3QyODE0N184OV9jYyAqLworMHgyQSwweDg1LDB4MDMsMHgwMiwweDA5LDB4MDEsMHgwNSwweDAzLCAgICAgLyogWzU2NjFdIE9CSl9pZF9Hb3N0UjM0MTBfOTRfY2MgKi8KKzB4MkEsMHg4NSwweDAzLDB4MDIsMHgwOSwweDAxLDB4MDUsMHgwNCwgICAgIC8qIFs1NjY5XSBPQkpfaWRfR29zdFIzNDEwXzIwMDFfY2MgKi8KKzB4MkEsMHg4NSwweDAzLDB4MDIsMHgwOSwweDAxLDB4MDMsMHgwMywgICAgIC8qIFs1Njc3XSBPQkpfaWRfR29zdFIzNDExXzk0X3dpdGhfR29zdFIzNDEwXzk0X2NjICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDksMHgwMSwweDAzLDB4MDQsICAgICAvKiBbNTY4NV0gT0JKX2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF8yMDAxX2NjICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDksMHgwMSwweDA4LDB4MDEsICAgICAvKiBbNTY5M10gT0JKX2lkX0dvc3RSMzQxMF8yMDAxX1BhcmFtU2V0X2NjICovCisweDJCLDB4MDYsMHgwMSwweDA0LDB4MDEsMHg4MiwweDM3LDB4MTEsMHgwMiwvKiBbNTcwMV0gT0JKX0xvY2FsS2V5U2V0ICovCisweDU1LDB4MUQsMHgyRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTcxMF0gT0JKX2ZyZXNoZXN0X2NybCAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwOCwweDAzLCAgICAgLyogWzU3MTNdIE9CSl9pZF9vbl9wZXJtYW5lbnRJZGVudGlmaWVyICovCisweDU1LDB4MDQsMHgwRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTcyMV0gT0JKX3NlYXJjaEd1aWRlICovCisweDU1LDB4MDQsMHgwRiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTcyNF0gT0JKX2J1c2luZXNzQ2F0ZWdvcnkgKi8KKzB4NTUsMHgwNCwweDEwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1NzI3XSBPQkpfcG9zdGFsQWRkcmVzcyAqLworMHg1NSwweDA0LDB4MTIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzU3MzBdIE9CSl9wb3N0T2ZmaWNlQm94ICovCisweDU1LDB4MDQsMHgxMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTczM10gT0JKX3BoeXNpY2FsRGVsaXZlcnlPZmZpY2VOYW1lICovCisweDU1LDB4MDQsMHgxNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTczNl0gT0JKX3RlbGVwaG9uZU51bWJlciAqLworMHg1NSwweDA0LDB4MTUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzU3MzldIE9CSl90ZWxleE51bWJlciAqLworMHg1NSwweDA0LDB4MTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzU3NDJdIE9CSl90ZWxldGV4VGVybWluYWxJZGVudGlmaWVyICovCisweDU1LDB4MDQsMHgxNywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTc0NV0gT0JKX2ZhY3NpbWlsZVRlbGVwaG9uZU51bWJlciAqLworMHg1NSwweDA0LDB4MTgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzU3NDhdIE9CSl94MTIxQWRkcmVzcyAqLworMHg1NSwweDA0LDB4MTksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzU3NTFdIE9CSl9pbnRlcm5hdGlvbmFsaVNETk51bWJlciAqLworMHg1NSwweDA0LDB4MUEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzU3NTRdIE9CSl9yZWdpc3RlcmVkQWRkcmVzcyAqLworMHg1NSwweDA0LDB4MUIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzU3NTddIE9CSl9kZXN0aW5hdGlvbkluZGljYXRvciAqLworMHg1NSwweDA0LDB4MUMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzU3NjBdIE9CSl9wcmVmZXJyZWREZWxpdmVyeU1ldGhvZCAqLworMHg1NSwweDA0LDB4MUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzU3NjNdIE9CSl9wcmVzZW50YXRpb25BZGRyZXNzICovCisweDU1LDB4MDQsMHgxRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTc2Nl0gT0JKX3N1cHBvcnRlZEFwcGxpY2F0aW9uQ29udGV4dCAqLworMHg1NSwweDA0LDB4MUYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzU3NjldIE9CSl9tZW1iZXIgKi8KKzB4NTUsMHgwNCwweDIwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1NzcyXSBPQkpfb3duZXIgKi8KKzB4NTUsMHgwNCwweDIxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1Nzc1XSBPQkpfcm9sZU9jY3VwYW50ICovCisweDU1LDB4MDQsMHgyMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTc3OF0gT0JKX3NlZUFsc28gKi8KKzB4NTUsMHgwNCwweDIzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1NzgxXSBPQkpfdXNlclBhc3N3b3JkICovCisweDU1LDB4MDQsMHgyNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTc4NF0gT0JKX3VzZXJDZXJ0aWZpY2F0ZSAqLworMHg1NSwweDA0LDB4MjUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzU3ODddIE9CSl9jQUNlcnRpZmljYXRlICovCisweDU1LDB4MDQsMHgyNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTc5MF0gT0JKX2F1dGhvcml0eVJldm9jYXRpb25MaXN0ICovCisweDU1LDB4MDQsMHgyNywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTc5M10gT0JKX2NlcnRpZmljYXRlUmV2b2NhdGlvbkxpc3QgKi8KKzB4NTUsMHgwNCwweDI4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1Nzk2XSBPQkpfY3Jvc3NDZXJ0aWZpY2F0ZVBhaXIgKi8KKzB4NTUsMHgwNCwweDJGLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1Nzk5XSBPQkpfZW5oYW5jZWRTZWFyY2hHdWlkZSAqLworMHg1NSwweDA0LDB4MzAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzU4MDJdIE9CSl9wcm90b2NvbEluZm9ybWF0aW9uICovCisweDU1LDB4MDQsMHgzMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTgwNV0gT0JKX2Rpc3Rpbmd1aXNoZWROYW1lICovCisweDU1LDB4MDQsMHgzMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTgwOF0gT0JKX3VuaXF1ZU1lbWJlciAqLworMHg1NSwweDA0LDB4MzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzU4MTFdIE9CSl9ob3VzZUlkZW50aWZpZXIgKi8KKzB4NTUsMHgwNCwweDM0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1ODE0XSBPQkpfc3VwcG9ydGVkQWxnb3JpdGhtcyAqLworMHg1NSwweDA0LDB4MzUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzU4MTddIE9CSl9kZWx0YVJldm9jYXRpb25MaXN0ICovCisweDU1LDB4MDQsMHgzNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTgyMF0gT0JKX2RtZE5hbWUgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDMsMHgwOSwvKiBbNTgyM10gT0JKX2lkX2FsZ19QV1JJX0tFSyAqLworMHg2MCwweDg2LDB4NDgsMHgwMSwweDY1LDB4MDMsMHgwNCwweDAxLDB4MDYsLyogWzU4MzRdIE9CSl9hZXNfMTI4X2djbSAqLworMHg2MCwweDg2LDB4NDgsMHgwMSwweDY1LDB4MDMsMHgwNCwweDAxLDB4MDcsLyogWzU4NDNdIE9CSl9hZXNfMTI4X2NjbSAqLworMHg2MCwweDg2LDB4NDgsMHgwMSwweDY1LDB4MDMsMHgwNCwweDAxLDB4MDgsLyogWzU4NTJdIE9CSl9pZF9hZXMxMjhfd3JhcF9wYWQgKi8KKzB4NjAsMHg4NiwweDQ4LDB4MDEsMHg2NSwweDAzLDB4MDQsMHgwMSwweDFBLC8qIFs1ODYxXSBPQkpfYWVzXzE5Ml9nY20gKi8KKzB4NjAsMHg4NiwweDQ4LDB4MDEsMHg2NSwweDAzLDB4MDQsMHgwMSwweDFCLC8qIFs1ODcwXSBPQkpfYWVzXzE5Ml9jY20gKi8KKzB4NjAsMHg4NiwweDQ4LDB4MDEsMHg2NSwweDAzLDB4MDQsMHgwMSwweDFDLC8qIFs1ODc5XSBPQkpfaWRfYWVzMTkyX3dyYXBfcGFkICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4NjUsMHgwMywweDA0LDB4MDEsMHgyRSwvKiBbNTg4OF0gT0JKX2Flc18yNTZfZ2NtICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4NjUsMHgwMywweDA0LDB4MDEsMHgyRiwvKiBbNTg5N10gT0JKX2Flc18yNTZfY2NtICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4NjUsMHgwMywweDA0LDB4MDEsMHgzMCwvKiBbNTkwNl0gT0JKX2lkX2FlczI1Nl93cmFwX3BhZCAqLworMHgyQSwweDgzLDB4MDgsMHg4QywweDlBLDB4NEIsMHgzRCwweDAxLDB4MDEsMHgwMywweDAyLC8qIFs1OTE1XSBPQkpfaWRfY2FtZWxsaWExMjhfd3JhcCAqLworMHgyQSwweDgzLDB4MDgsMHg4QywweDlBLDB4NEIsMHgzRCwweDAxLDB4MDEsMHgwMywweDAzLC8qIFs1OTI2XSBPQkpfaWRfY2FtZWxsaWExOTJfd3JhcCAqLworMHgyQSwweDgzLDB4MDgsMHg4QywweDlBLDB4NEIsMHgzRCwweDAxLDB4MDEsMHgwMywweDA0LC8qIFs1OTM3XSBPQkpfaWRfY2FtZWxsaWEyNTZfd3JhcCAqLworMHg1NSwweDFELDB4MjUsMHgwMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzU5NDhdIE9CSl9hbnlFeHRlbmRlZEtleVVzYWdlICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDEsMHgwOCwvKiBbNTk1Ml0gT0JKX21nZjEgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwMSwweDBBLC8qIFs1OTYxXSBPQkpfcnNhc3NhUHNzICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDEsMHgwNywvKiBbNTk3MF0gT0JKX3JzYWVzT2FlcCAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDNFLDB4MDIsMHgwMSwgICAgICAgICAgLyogWzU5NzldIE9CSl9kaHB1YmxpY251bWJlciAqLworMHgyQiwweDI0LDB4MDMsMHgwMywweDAyLDB4MDgsMHgwMSwweDAxLDB4MDEsLyogWzU5ODZdIE9CSl9icmFpbnBvb2xQMTYwcjEgKi8KKzB4MkIsMHgyNCwweDAzLDB4MDMsMHgwMiwweDA4LDB4MDEsMHgwMSwweDAyLC8qIFs1OTk1XSBPQkpfYnJhaW5wb29sUDE2MHQxICovCisweDJCLDB4MjQsMHgwMywweDAzLDB4MDIsMHgwOCwweDAxLDB4MDEsMHgwMywvKiBbNjAwNF0gT0JKX2JyYWlucG9vbFAxOTJyMSAqLworMHgyQiwweDI0LDB4MDMsMHgwMywweDAyLDB4MDgsMHgwMSwweDAxLDB4MDQsLyogWzYwMTNdIE9CSl9icmFpbnBvb2xQMTkydDEgKi8KKzB4MkIsMHgyNCwweDAzLDB4MDMsMHgwMiwweDA4LDB4MDEsMHgwMSwweDA1LC8qIFs2MDIyXSBPQkpfYnJhaW5wb29sUDIyNHIxICovCisweDJCLDB4MjQsMHgwMywweDAzLDB4MDIsMHgwOCwweDAxLDB4MDEsMHgwNiwvKiBbNjAzMV0gT0JKX2JyYWlucG9vbFAyMjR0MSAqLworMHgyQiwweDI0LDB4MDMsMHgwMywweDAyLDB4MDgsMHgwMSwweDAxLDB4MDcsLyogWzYwNDBdIE9CSl9icmFpbnBvb2xQMjU2cjEgKi8KKzB4MkIsMHgyNCwweDAzLDB4MDMsMHgwMiwweDA4LDB4MDEsMHgwMSwweDA4LC8qIFs2MDQ5XSBPQkpfYnJhaW5wb29sUDI1NnQxICovCisweDJCLDB4MjQsMHgwMywweDAzLDB4MDIsMHgwOCwweDAxLDB4MDEsMHgwOSwvKiBbNjA1OF0gT0JKX2JyYWlucG9vbFAzMjByMSAqLworMHgyQiwweDI0LDB4MDMsMHgwMywweDAyLDB4MDgsMHgwMSwweDAxLDB4MEEsLyogWzYwNjddIE9CSl9icmFpbnBvb2xQMzIwdDEgKi8KKzB4MkIsMHgyNCwweDAzLDB4MDMsMHgwMiwweDA4LDB4MDEsMHgwMSwweDBCLC8qIFs2MDc2XSBPQkpfYnJhaW5wb29sUDM4NHIxICovCisweDJCLDB4MjQsMHgwMywweDAzLDB4MDIsMHgwOCwweDAxLDB4MDEsMHgwQywvKiBbNjA4NV0gT0JKX2JyYWlucG9vbFAzODR0MSAqLworMHgyQiwweDI0LDB4MDMsMHgwMywweDAyLDB4MDgsMHgwMSwweDAxLDB4MEQsLyogWzYwOTRdIE9CSl9icmFpbnBvb2xQNTEycjEgKi8KKzB4MkIsMHgyNCwweDAzLDB4MDMsMHgwMiwweDA4LDB4MDEsMHgwMSwweDBFLC8qIFs2MTAzXSBPQkpfYnJhaW5wb29sUDUxMnQxICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDEsMHgwOSwvKiBbNjExMl0gT0JKX3BTcGVjaWZpZWQgKi8KKzB4MkIsMHg4MSwweDA1LDB4MTAsMHg4NiwweDQ4LDB4M0YsMHgwMCwweDAyLC8qIFs2MTIxXSBPQkpfZGhTaW5nbGVQYXNzX3N0ZERIX3NoYTFrZGZfc2NoZW1lICovCisweDJCLDB4ODEsMHgwNCwweDAxLDB4MEIsMHgwMCwgICAgICAgICAgICAgICAvKiBbNjEzMF0gT0JKX2RoU2luZ2xlUGFzc19zdGRESF9zaGEyMjRrZGZfc2NoZW1lICovCisweDJCLDB4ODEsMHgwNCwweDAxLDB4MEIsMHgwMSwgICAgICAgICAgICAgICAvKiBbNjEzNl0gT0JKX2RoU2luZ2xlUGFzc19zdGRESF9zaGEyNTZrZGZfc2NoZW1lICovCisweDJCLDB4ODEsMHgwNCwweDAxLDB4MEIsMHgwMiwgICAgICAgICAgICAgICAvKiBbNjE0Ml0gT0JKX2RoU2luZ2xlUGFzc19zdGRESF9zaGEzODRrZGZfc2NoZW1lICovCisweDJCLDB4ODEsMHgwNCwweDAxLDB4MEIsMHgwMywgICAgICAgICAgICAgICAvKiBbNjE0OF0gT0JKX2RoU2luZ2xlUGFzc19zdGRESF9zaGE1MTJrZGZfc2NoZW1lICovCisweDJCLDB4ODEsMHgwNSwweDEwLDB4ODYsMHg0OCwweDNGLDB4MDAsMHgwMywvKiBbNjE1NF0gT0JKX2RoU2luZ2xlUGFzc19jb2ZhY3RvckRIX3NoYTFrZGZfc2NoZW1lICovCisweDJCLDB4ODEsMHgwNCwweDAxLDB4MEUsMHgwMCwgICAgICAgICAgICAgICAvKiBbNjE2M10gT0JKX2RoU2luZ2xlUGFzc19jb2ZhY3RvckRIX3NoYTIyNGtkZl9zY2hlbWUgKi8KKzB4MkIsMHg4MSwweDA0LDB4MDEsMHgwRSwweDAxLCAgICAgICAgICAgICAgIC8qIFs2MTY5XSBPQkpfZGhTaW5nbGVQYXNzX2NvZmFjdG9yREhfc2hhMjU2a2RmX3NjaGVtZSAqLworMHgyQiwweDgxLDB4MDQsMHgwMSwweDBFLDB4MDIsICAgICAgICAgICAgICAgLyogWzYxNzVdIE9CSl9kaFNpbmdsZVBhc3NfY29mYWN0b3JESF9zaGEzODRrZGZfc2NoZW1lICovCisweDJCLDB4ODEsMHgwNCwweDAxLDB4MEUsMHgwMywgICAgICAgICAgICAgICAvKiBbNjE4MV0gT0JKX2RoU2luZ2xlUGFzc19jb2ZhY3RvckRIX3NoYTUxMmtkZl9zY2hlbWUgKi8KK307CisKK3N0YXRpYyBjb25zdCBBU04xX09CSkVDVCBrT2JqZWN0c1tOVU1fTklEXT17Cit7IlVOREVGIiwidW5kZWZpbmVkIixOSURfdW5kZWYsMSwmKGx2YWx1ZXNbMF0pLDB9LAoreyJyc2Fkc2kiLCJSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiIsTklEX3JzYWRzaSw2LCYobHZhbHVlc1sxXSksMH0sCit7InBrY3MiLCJSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBQS0NTIixOSURfcGtjcyw3LCYobHZhbHVlc1s3XSksMH0sCit7Ik1EMiIsIm1kMiIsTklEX21kMiw4LCYobHZhbHVlc1sxNF0pLDB9LAoreyJNRDUiLCJtZDUiLE5JRF9tZDUsOCwmKGx2YWx1ZXNbMjJdKSwwfSwKK3siUkM0IiwicmM0IixOSURfcmM0LDgsJihsdmFsdWVzWzMwXSksMH0sCit7InJzYUVuY3J5cHRpb24iLCJyc2FFbmNyeXB0aW9uIixOSURfcnNhRW5jcnlwdGlvbiw5LCYobHZhbHVlc1szOF0pLDB9LAoreyJSU0EtTUQyIiwibWQyV2l0aFJTQUVuY3J5cHRpb24iLE5JRF9tZDJXaXRoUlNBRW5jcnlwdGlvbiw5LAorCSYobHZhbHVlc1s0N10pLDB9LAoreyJSU0EtTUQ1IiwibWQ1V2l0aFJTQUVuY3J5cHRpb24iLE5JRF9tZDVXaXRoUlNBRW5jcnlwdGlvbiw5LAorCSYobHZhbHVlc1s1Nl0pLDB9LAoreyJQQkUtTUQyLURFUyIsInBiZVdpdGhNRDJBbmRERVMtQ0JDIixOSURfcGJlV2l0aE1EMkFuZERFU19DQkMsOSwKKwkmKGx2YWx1ZXNbNjVdKSwwfSwKK3siUEJFLU1ENS1ERVMiLCJwYmVXaXRoTUQ1QW5kREVTLUNCQyIsTklEX3BiZVdpdGhNRDVBbmRERVNfQ0JDLDksCisJJihsdmFsdWVzWzc0XSksMH0sCit7Ilg1MDAiLCJkaXJlY3Rvcnkgc2VydmljZXMgKFguNTAwKSIsTklEX1g1MDAsMSwmKGx2YWx1ZXNbODNdKSwwfSwKK3siWDUwOSIsIlg1MDkiLE5JRF9YNTA5LDIsJihsdmFsdWVzWzg0XSksMH0sCit7IkNOIiwiY29tbW9uTmFtZSIsTklEX2NvbW1vbk5hbWUsMywmKGx2YWx1ZXNbODZdKSwwfSwKK3siQyIsImNvdW50cnlOYW1lIixOSURfY291bnRyeU5hbWUsMywmKGx2YWx1ZXNbODldKSwwfSwKK3siTCIsImxvY2FsaXR5TmFtZSIsTklEX2xvY2FsaXR5TmFtZSwzLCYobHZhbHVlc1s5Ml0pLDB9LAoreyJTVCIsInN0YXRlT3JQcm92aW5jZU5hbWUiLE5JRF9zdGF0ZU9yUHJvdmluY2VOYW1lLDMsJihsdmFsdWVzWzk1XSksMH0sCit7Ik8iLCJvcmdhbml6YXRpb25OYW1lIixOSURfb3JnYW5pemF0aW9uTmFtZSwzLCYobHZhbHVlc1s5OF0pLDB9LAoreyJPVSIsIm9yZ2FuaXphdGlvbmFsVW5pdE5hbWUiLE5JRF9vcmdhbml6YXRpb25hbFVuaXROYW1lLDMsCisJJihsdmFsdWVzWzEwMV0pLDB9LAoreyJSU0EiLCJyc2EiLE5JRF9yc2EsNCwmKGx2YWx1ZXNbMTA0XSksMH0sCit7InBrY3M3IiwicGtjczciLE5JRF9wa2NzNyw4LCYobHZhbHVlc1sxMDhdKSwwfSwKK3sicGtjczctZGF0YSIsInBrY3M3LWRhdGEiLE5JRF9wa2NzN19kYXRhLDksJihsdmFsdWVzWzExNl0pLDB9LAoreyJwa2NzNy1zaWduZWREYXRhIiwicGtjczctc2lnbmVkRGF0YSIsTklEX3BrY3M3X3NpZ25lZCw5LAorCSYobHZhbHVlc1sxMjVdKSwwfSwKK3sicGtjczctZW52ZWxvcGVkRGF0YSIsInBrY3M3LWVudmVsb3BlZERhdGEiLE5JRF9wa2NzN19lbnZlbG9wZWQsOSwKKwkmKGx2YWx1ZXNbMTM0XSksMH0sCit7InBrY3M3LXNpZ25lZEFuZEVudmVsb3BlZERhdGEiLCJwa2NzNy1zaWduZWRBbmRFbnZlbG9wZWREYXRhIiwKKwlOSURfcGtjczdfc2lnbmVkQW5kRW52ZWxvcGVkLDksJihsdmFsdWVzWzE0M10pLDB9LAoreyJwa2NzNy1kaWdlc3REYXRhIiwicGtjczctZGlnZXN0RGF0YSIsTklEX3BrY3M3X2RpZ2VzdCw5LAorCSYobHZhbHVlc1sxNTJdKSwwfSwKK3sicGtjczctZW5jcnlwdGVkRGF0YSIsInBrY3M3LWVuY3J5cHRlZERhdGEiLE5JRF9wa2NzN19lbmNyeXB0ZWQsOSwKKwkmKGx2YWx1ZXNbMTYxXSksMH0sCit7InBrY3MzIiwicGtjczMiLE5JRF9wa2NzMyw4LCYobHZhbHVlc1sxNzBdKSwwfSwKK3siZGhLZXlBZ3JlZW1lbnQiLCJkaEtleUFncmVlbWVudCIsTklEX2RoS2V5QWdyZWVtZW50LDksCisJJihsdmFsdWVzWzE3OF0pLDB9LAoreyJERVMtRUNCIiwiZGVzLWVjYiIsTklEX2Rlc19lY2IsNSwmKGx2YWx1ZXNbMTg3XSksMH0sCit7IkRFUy1DRkIiLCJkZXMtY2ZiIixOSURfZGVzX2NmYjY0LDUsJihsdmFsdWVzWzE5Ml0pLDB9LAoreyJERVMtQ0JDIiwiZGVzLWNiYyIsTklEX2Rlc19jYmMsNSwmKGx2YWx1ZXNbMTk3XSksMH0sCit7IkRFUy1FREUiLCJkZXMtZWRlIixOSURfZGVzX2VkZV9lY2IsNSwmKGx2YWx1ZXNbMjAyXSksMH0sCit7IkRFUy1FREUzIiwiZGVzLWVkZTMiLE5JRF9kZXNfZWRlM19lY2IsMCxOVUxMLDB9LAoreyJJREVBLUNCQyIsImlkZWEtY2JjIixOSURfaWRlYV9jYmMsMTEsJihsdmFsdWVzWzIwN10pLDB9LAoreyJJREVBLUNGQiIsImlkZWEtY2ZiIixOSURfaWRlYV9jZmI2NCwwLE5VTEwsMH0sCit7IklERUEtRUNCIiwiaWRlYS1lY2IiLE5JRF9pZGVhX2VjYiwwLE5VTEwsMH0sCit7IlJDMi1DQkMiLCJyYzItY2JjIixOSURfcmMyX2NiYyw4LCYobHZhbHVlc1syMThdKSwwfSwKK3siUkMyLUVDQiIsInJjMi1lY2IiLE5JRF9yYzJfZWNiLDAsTlVMTCwwfSwKK3siUkMyLUNGQiIsInJjMi1jZmIiLE5JRF9yYzJfY2ZiNjQsMCxOVUxMLDB9LAoreyJSQzItT0ZCIiwicmMyLW9mYiIsTklEX3JjMl9vZmI2NCwwLE5VTEwsMH0sCit7IlNIQSIsInNoYSIsTklEX3NoYSw1LCYobHZhbHVlc1syMjZdKSwwfSwKK3siUlNBLVNIQSIsInNoYVdpdGhSU0FFbmNyeXB0aW9uIixOSURfc2hhV2l0aFJTQUVuY3J5cHRpb24sNSwKKwkmKGx2YWx1ZXNbMjMxXSksMH0sCit7IkRFUy1FREUtQ0JDIiwiZGVzLWVkZS1jYmMiLE5JRF9kZXNfZWRlX2NiYywwLE5VTEwsMH0sCit7IkRFUy1FREUzLUNCQyIsImRlcy1lZGUzLWNiYyIsTklEX2Rlc19lZGUzX2NiYyw4LCYobHZhbHVlc1syMzZdKSwwfSwKK3siREVTLU9GQiIsImRlcy1vZmIiLE5JRF9kZXNfb2ZiNjQsNSwmKGx2YWx1ZXNbMjQ0XSksMH0sCit7IklERUEtT0ZCIiwiaWRlYS1vZmIiLE5JRF9pZGVhX29mYjY0LDAsTlVMTCwwfSwKK3sicGtjczkiLCJwa2NzOSIsTklEX3BrY3M5LDgsJihsdmFsdWVzWzI0OV0pLDB9LAoreyJlbWFpbEFkZHJlc3MiLCJlbWFpbEFkZHJlc3MiLE5JRF9wa2NzOV9lbWFpbEFkZHJlc3MsOSwKKwkmKGx2YWx1ZXNbMjU3XSksMH0sCit7InVuc3RydWN0dXJlZE5hbWUiLCJ1bnN0cnVjdHVyZWROYW1lIixOSURfcGtjczlfdW5zdHJ1Y3R1cmVkTmFtZSw5LAorCSYobHZhbHVlc1syNjZdKSwwfSwKK3siY29udGVudFR5cGUiLCJjb250ZW50VHlwZSIsTklEX3BrY3M5X2NvbnRlbnRUeXBlLDksJihsdmFsdWVzWzI3NV0pLDB9LAoreyJtZXNzYWdlRGlnZXN0IiwibWVzc2FnZURpZ2VzdCIsTklEX3BrY3M5X21lc3NhZ2VEaWdlc3QsOSwKKwkmKGx2YWx1ZXNbMjg0XSksMH0sCit7InNpZ25pbmdUaW1lIiwic2lnbmluZ1RpbWUiLE5JRF9wa2NzOV9zaWduaW5nVGltZSw5LCYobHZhbHVlc1syOTNdKSwwfSwKK3siY291bnRlcnNpZ25hdHVyZSIsImNvdW50ZXJzaWduYXR1cmUiLE5JRF9wa2NzOV9jb3VudGVyc2lnbmF0dXJlLDksCisJJihsdmFsdWVzWzMwMl0pLDB9LAoreyJjaGFsbGVuZ2VQYXNzd29yZCIsImNoYWxsZW5nZVBhc3N3b3JkIixOSURfcGtjczlfY2hhbGxlbmdlUGFzc3dvcmQsCisJOSwmKGx2YWx1ZXNbMzExXSksMH0sCit7InVuc3RydWN0dXJlZEFkZHJlc3MiLCJ1bnN0cnVjdHVyZWRBZGRyZXNzIiwKKwlOSURfcGtjczlfdW5zdHJ1Y3R1cmVkQWRkcmVzcyw5LCYobHZhbHVlc1szMjBdKSwwfSwKK3siZXh0ZW5kZWRDZXJ0aWZpY2F0ZUF0dHJpYnV0ZXMiLCJleHRlbmRlZENlcnRpZmljYXRlQXR0cmlidXRlcyIsCisJTklEX3BrY3M5X2V4dENlcnRBdHRyaWJ1dGVzLDksJihsdmFsdWVzWzMyOV0pLDB9LAoreyJOZXRzY2FwZSIsIk5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnAuIixOSURfbmV0c2NhcGUsNywKKwkmKGx2YWx1ZXNbMzM4XSksMH0sCit7Im5zQ2VydEV4dCIsIk5ldHNjYXBlIENlcnRpZmljYXRlIEV4dGVuc2lvbiIsCisJTklEX25ldHNjYXBlX2NlcnRfZXh0ZW5zaW9uLDgsJihsdmFsdWVzWzM0NV0pLDB9LAoreyJuc0RhdGFUeXBlIiwiTmV0c2NhcGUgRGF0YSBUeXBlIixOSURfbmV0c2NhcGVfZGF0YV90eXBlLDgsCisJJihsdmFsdWVzWzM1M10pLDB9LAoreyJERVMtRURFLUNGQiIsImRlcy1lZGUtY2ZiIixOSURfZGVzX2VkZV9jZmI2NCwwLE5VTEwsMH0sCit7IkRFUy1FREUzLUNGQiIsImRlcy1lZGUzLWNmYiIsTklEX2Rlc19lZGUzX2NmYjY0LDAsTlVMTCwwfSwKK3siREVTLUVERS1PRkIiLCJkZXMtZWRlLW9mYiIsTklEX2Rlc19lZGVfb2ZiNjQsMCxOVUxMLDB9LAoreyJERVMtRURFMy1PRkIiLCJkZXMtZWRlMy1vZmIiLE5JRF9kZXNfZWRlM19vZmI2NCwwLE5VTEwsMH0sCit7IlNIQTEiLCJzaGExIixOSURfc2hhMSw1LCYobHZhbHVlc1szNjFdKSwwfSwKK3siUlNBLVNIQTEiLCJzaGExV2l0aFJTQUVuY3J5cHRpb24iLE5JRF9zaGExV2l0aFJTQUVuY3J5cHRpb24sOSwKKwkmKGx2YWx1ZXNbMzY2XSksMH0sCit7IkRTQS1TSEEiLCJkc2FXaXRoU0hBIixOSURfZHNhV2l0aFNIQSw1LCYobHZhbHVlc1szNzVdKSwwfSwKK3siRFNBLW9sZCIsImRzYUVuY3J5cHRpb24tb2xkIixOSURfZHNhXzIsNSwmKGx2YWx1ZXNbMzgwXSksMH0sCit7IlBCRS1TSEExLVJDMi02NCIsInBiZVdpdGhTSEExQW5kUkMyLUNCQyIsTklEX3BiZVdpdGhTSEExQW5kUkMyX0NCQywKKwk5LCYobHZhbHVlc1szODVdKSwwfSwKK3siUEJLREYyIiwiUEJLREYyIixOSURfaWRfcGJrZGYyLDksJihsdmFsdWVzWzM5NF0pLDB9LAoreyJEU0EtU0hBMS1vbGQiLCJkc2FXaXRoU0hBMS1vbGQiLE5JRF9kc2FXaXRoU0hBMV8yLDUsJihsdmFsdWVzWzQwM10pLDB9LAoreyJuc0NlcnRUeXBlIiwiTmV0c2NhcGUgQ2VydCBUeXBlIixOSURfbmV0c2NhcGVfY2VydF90eXBlLDksCisJJihsdmFsdWVzWzQwOF0pLDB9LAoreyJuc0Jhc2VVcmwiLCJOZXRzY2FwZSBCYXNlIFVybCIsTklEX25ldHNjYXBlX2Jhc2VfdXJsLDksCisJJihsdmFsdWVzWzQxN10pLDB9LAoreyJuc1Jldm9jYXRpb25VcmwiLCJOZXRzY2FwZSBSZXZvY2F0aW9uIFVybCIsCisJTklEX25ldHNjYXBlX3Jldm9jYXRpb25fdXJsLDksJihsdmFsdWVzWzQyNl0pLDB9LAoreyJuc0NhUmV2b2NhdGlvblVybCIsIk5ldHNjYXBlIENBIFJldm9jYXRpb24gVXJsIiwKKwlOSURfbmV0c2NhcGVfY2FfcmV2b2NhdGlvbl91cmwsOSwmKGx2YWx1ZXNbNDM1XSksMH0sCit7Im5zUmVuZXdhbFVybCIsIk5ldHNjYXBlIFJlbmV3YWwgVXJsIixOSURfbmV0c2NhcGVfcmVuZXdhbF91cmwsOSwKKwkmKGx2YWx1ZXNbNDQ0XSksMH0sCit7Im5zQ2FQb2xpY3lVcmwiLCJOZXRzY2FwZSBDQSBQb2xpY3kgVXJsIixOSURfbmV0c2NhcGVfY2FfcG9saWN5X3VybCwKKwk5LCYobHZhbHVlc1s0NTNdKSwwfSwKK3sibnNTc2xTZXJ2ZXJOYW1lIiwiTmV0c2NhcGUgU1NMIFNlcnZlciBOYW1lIiwKKwlOSURfbmV0c2NhcGVfc3NsX3NlcnZlcl9uYW1lLDksJihsdmFsdWVzWzQ2Ml0pLDB9LAoreyJuc0NvbW1lbnQiLCJOZXRzY2FwZSBDb21tZW50IixOSURfbmV0c2NhcGVfY29tbWVudCw5LCYobHZhbHVlc1s0NzFdKSwwfSwKK3sibnNDZXJ0U2VxdWVuY2UiLCJOZXRzY2FwZSBDZXJ0aWZpY2F0ZSBTZXF1ZW5jZSIsCisJTklEX25ldHNjYXBlX2NlcnRfc2VxdWVuY2UsOSwmKGx2YWx1ZXNbNDgwXSksMH0sCit7IkRFU1gtQ0JDIiwiZGVzeC1jYmMiLE5JRF9kZXN4X2NiYywwLE5VTEwsMH0sCit7ImlkLWNlIiwiaWQtY2UiLE5JRF9pZF9jZSwyLCYobHZhbHVlc1s0ODldKSwwfSwKK3sic3ViamVjdEtleUlkZW50aWZpZXIiLCJYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllciIsCisJTklEX3N1YmplY3Rfa2V5X2lkZW50aWZpZXIsMywmKGx2YWx1ZXNbNDkxXSksMH0sCit7ImtleVVzYWdlIiwiWDUwOXYzIEtleSBVc2FnZSIsTklEX2tleV91c2FnZSwzLCYobHZhbHVlc1s0OTRdKSwwfSwKK3sicHJpdmF0ZUtleVVzYWdlUGVyaW9kIiwiWDUwOXYzIFByaXZhdGUgS2V5IFVzYWdlIFBlcmlvZCIsCisJTklEX3ByaXZhdGVfa2V5X3VzYWdlX3BlcmlvZCwzLCYobHZhbHVlc1s0OTddKSwwfSwKK3sic3ViamVjdEFsdE5hbWUiLCJYNTA5djMgU3ViamVjdCBBbHRlcm5hdGl2ZSBOYW1lIiwKKwlOSURfc3ViamVjdF9hbHRfbmFtZSwzLCYobHZhbHVlc1s1MDBdKSwwfSwKK3siaXNzdWVyQWx0TmFtZSIsIlg1MDl2MyBJc3N1ZXIgQWx0ZXJuYXRpdmUgTmFtZSIsTklEX2lzc3Vlcl9hbHRfbmFtZSwKKwkzLCYobHZhbHVlc1s1MDNdKSwwfSwKK3siYmFzaWNDb25zdHJhaW50cyIsIlg1MDl2MyBCYXNpYyBDb25zdHJhaW50cyIsTklEX2Jhc2ljX2NvbnN0cmFpbnRzLAorCTMsJihsdmFsdWVzWzUwNl0pLDB9LAoreyJjcmxOdW1iZXIiLCJYNTA5djMgQ1JMIE51bWJlciIsTklEX2NybF9udW1iZXIsMywmKGx2YWx1ZXNbNTA5XSksMH0sCit7ImNlcnRpZmljYXRlUG9saWNpZXMiLCJYNTA5djMgQ2VydGlmaWNhdGUgUG9saWNpZXMiLAorCU5JRF9jZXJ0aWZpY2F0ZV9wb2xpY2llcywzLCYobHZhbHVlc1s1MTJdKSwwfSwKK3siYXV0aG9yaXR5S2V5SWRlbnRpZmllciIsIlg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXIiLAorCU5JRF9hdXRob3JpdHlfa2V5X2lkZW50aWZpZXIsMywmKGx2YWx1ZXNbNTE1XSksMH0sCit7IkJGLUNCQyIsImJmLWNiYyIsTklEX2JmX2NiYyw5LCYobHZhbHVlc1s1MThdKSwwfSwKK3siQkYtRUNCIiwiYmYtZWNiIixOSURfYmZfZWNiLDAsTlVMTCwwfSwKK3siQkYtQ0ZCIiwiYmYtY2ZiIixOSURfYmZfY2ZiNjQsMCxOVUxMLDB9LAoreyJCRi1PRkIiLCJiZi1vZmIiLE5JRF9iZl9vZmI2NCwwLE5VTEwsMH0sCit7Ik1EQzIiLCJtZGMyIixOSURfbWRjMiw0LCYobHZhbHVlc1s1MjddKSwwfSwKK3siUlNBLU1EQzIiLCJtZGMyV2l0aFJTQSIsTklEX21kYzJXaXRoUlNBLDQsJihsdmFsdWVzWzUzMV0pLDB9LAoreyJSQzQtNDAiLCJyYzQtNDAiLE5JRF9yYzRfNDAsMCxOVUxMLDB9LAoreyJSQzItNDAtQ0JDIiwicmMyLTQwLWNiYyIsTklEX3JjMl80MF9jYmMsMCxOVUxMLDB9LAoreyJHTiIsImdpdmVuTmFtZSIsTklEX2dpdmVuTmFtZSwzLCYobHZhbHVlc1s1MzVdKSwwfSwKK3siU04iLCJzdXJuYW1lIixOSURfc3VybmFtZSwzLCYobHZhbHVlc1s1MzhdKSwwfSwKK3siaW5pdGlhbHMiLCJpbml0aWFscyIsTklEX2luaXRpYWxzLDMsJihsdmFsdWVzWzU0MV0pLDB9LAore05VTEwsTlVMTCxOSURfdW5kZWYsMCxOVUxMLDB9LAoreyJjcmxEaXN0cmlidXRpb25Qb2ludHMiLCJYNTA5djMgQ1JMIERpc3RyaWJ1dGlvbiBQb2ludHMiLAorCU5JRF9jcmxfZGlzdHJpYnV0aW9uX3BvaW50cywzLCYobHZhbHVlc1s1NDRdKSwwfSwKK3siUlNBLU5QLU1ENSIsIm1kNVdpdGhSU0EiLE5JRF9tZDVXaXRoUlNBLDUsJihsdmFsdWVzWzU0N10pLDB9LAoreyJzZXJpYWxOdW1iZXIiLCJzZXJpYWxOdW1iZXIiLE5JRF9zZXJpYWxOdW1iZXIsMywmKGx2YWx1ZXNbNTUyXSksMH0sCit7InRpdGxlIiwidGl0bGUiLE5JRF90aXRsZSwzLCYobHZhbHVlc1s1NTVdKSwwfSwKK3siZGVzY3JpcHRpb24iLCJkZXNjcmlwdGlvbiIsTklEX2Rlc2NyaXB0aW9uLDMsJihsdmFsdWVzWzU1OF0pLDB9LAoreyJDQVNUNS1DQkMiLCJjYXN0NS1jYmMiLE5JRF9jYXN0NV9jYmMsOSwmKGx2YWx1ZXNbNTYxXSksMH0sCit7IkNBU1Q1LUVDQiIsImNhc3Q1LWVjYiIsTklEX2Nhc3Q1X2VjYiwwLE5VTEwsMH0sCit7IkNBU1Q1LUNGQiIsImNhc3Q1LWNmYiIsTklEX2Nhc3Q1X2NmYjY0LDAsTlVMTCwwfSwKK3siQ0FTVDUtT0ZCIiwiY2FzdDUtb2ZiIixOSURfY2FzdDVfb2ZiNjQsMCxOVUxMLDB9LAoreyJwYmVXaXRoTUQ1QW5kQ2FzdDVDQkMiLCJwYmVXaXRoTUQ1QW5kQ2FzdDVDQkMiLAorCU5JRF9wYmVXaXRoTUQ1QW5kQ2FzdDVfQ0JDLDksJihsdmFsdWVzWzU3MF0pLDB9LAoreyJEU0EtU0hBMSIsImRzYVdpdGhTSEExIixOSURfZHNhV2l0aFNIQTEsNywmKGx2YWx1ZXNbNTc5XSksMH0sCit7Ik1ENS1TSEExIiwibWQ1LXNoYTEiLE5JRF9tZDVfc2hhMSwwLE5VTEwsMH0sCit7IlJTQS1TSEExLTIiLCJzaGExV2l0aFJTQSIsTklEX3NoYTFXaXRoUlNBLDUsJihsdmFsdWVzWzU4Nl0pLDB9LAoreyJEU0EiLCJkc2FFbmNyeXB0aW9uIixOSURfZHNhLDcsJihsdmFsdWVzWzU5MV0pLDB9LAoreyJSSVBFTUQxNjAiLCJyaXBlbWQxNjAiLE5JRF9yaXBlbWQxNjAsNSwmKGx2YWx1ZXNbNTk4XSksMH0sCit7TlVMTCxOVUxMLE5JRF91bmRlZiwwLE5VTEwsMH0sCit7IlJTQS1SSVBFTUQxNjAiLCJyaXBlbWQxNjBXaXRoUlNBIixOSURfcmlwZW1kMTYwV2l0aFJTQSw2LAorCSYobHZhbHVlc1s2MDNdKSwwfSwKK3siUkM1LUNCQyIsInJjNS1jYmMiLE5JRF9yYzVfY2JjLDgsJihsdmFsdWVzWzYwOV0pLDB9LAoreyJSQzUtRUNCIiwicmM1LWVjYiIsTklEX3JjNV9lY2IsMCxOVUxMLDB9LAoreyJSQzUtQ0ZCIiwicmM1LWNmYiIsTklEX3JjNV9jZmI2NCwwLE5VTEwsMH0sCit7IlJDNS1PRkIiLCJyYzUtb2ZiIixOSURfcmM1X29mYjY0LDAsTlVMTCwwfSwKK3siUkxFIiwicnVuIGxlbmd0aCBjb21wcmVzc2lvbiIsTklEX3JsZV9jb21wcmVzc2lvbiw2LCYobHZhbHVlc1s2MTddKSwwfSwKK3siWkxJQiIsInpsaWIgY29tcHJlc3Npb24iLE5JRF96bGliX2NvbXByZXNzaW9uLDExLCYobHZhbHVlc1s2MjNdKSwwfSwKK3siZXh0ZW5kZWRLZXlVc2FnZSIsIlg1MDl2MyBFeHRlbmRlZCBLZXkgVXNhZ2UiLE5JRF9leHRfa2V5X3VzYWdlLDMsCisJJihsdmFsdWVzWzYzNF0pLDB9LAoreyJQS0lYIiwiUEtJWCIsTklEX2lkX3BraXgsNiwmKGx2YWx1ZXNbNjM3XSksMH0sCit7ImlkLWtwIiwiaWQta3AiLE5JRF9pZF9rcCw3LCYobHZhbHVlc1s2NDNdKSwwfSwKK3sic2VydmVyQXV0aCIsIlRMUyBXZWIgU2VydmVyIEF1dGhlbnRpY2F0aW9uIixOSURfc2VydmVyX2F1dGgsOCwKKwkmKGx2YWx1ZXNbNjUwXSksMH0sCit7ImNsaWVudEF1dGgiLCJUTFMgV2ViIENsaWVudCBBdXRoZW50aWNhdGlvbiIsTklEX2NsaWVudF9hdXRoLDgsCisJJihsdmFsdWVzWzY1OF0pLDB9LAoreyJjb2RlU2lnbmluZyIsIkNvZGUgU2lnbmluZyIsTklEX2NvZGVfc2lnbiw4LCYobHZhbHVlc1s2NjZdKSwwfSwKK3siZW1haWxQcm90ZWN0aW9uIiwiRS1tYWlsIFByb3RlY3Rpb24iLE5JRF9lbWFpbF9wcm90ZWN0LDgsCisJJihsdmFsdWVzWzY3NF0pLDB9LAoreyJ0aW1lU3RhbXBpbmciLCJUaW1lIFN0YW1waW5nIixOSURfdGltZV9zdGFtcCw4LCYobHZhbHVlc1s2ODJdKSwwfSwKK3sibXNDb2RlSW5kIiwiTWljcm9zb2Z0IEluZGl2aWR1YWwgQ29kZSBTaWduaW5nIixOSURfbXNfY29kZV9pbmQsMTAsCisJJihsdmFsdWVzWzY5MF0pLDB9LAoreyJtc0NvZGVDb20iLCJNaWNyb3NvZnQgQ29tbWVyY2lhbCBDb2RlIFNpZ25pbmciLE5JRF9tc19jb2RlX2NvbSwxMCwKKwkmKGx2YWx1ZXNbNzAwXSksMH0sCit7Im1zQ1RMU2lnbiIsIk1pY3Jvc29mdCBUcnVzdCBMaXN0IFNpZ25pbmciLE5JRF9tc19jdGxfc2lnbiwxMCwKKwkmKGx2YWx1ZXNbNzEwXSksMH0sCit7Im1zU0dDIiwiTWljcm9zb2Z0IFNlcnZlciBHYXRlZCBDcnlwdG8iLE5JRF9tc19zZ2MsMTAsJihsdmFsdWVzWzcyMF0pLDB9LAoreyJtc0VGUyIsIk1pY3Jvc29mdCBFbmNyeXB0ZWQgRmlsZSBTeXN0ZW0iLE5JRF9tc19lZnMsMTAsCisJJihsdmFsdWVzWzczMF0pLDB9LAoreyJuc1NHQyIsIk5ldHNjYXBlIFNlcnZlciBHYXRlZCBDcnlwdG8iLE5JRF9uc19zZ2MsOSwmKGx2YWx1ZXNbNzQwXSksMH0sCit7ImRlbHRhQ1JMIiwiWDUwOXYzIERlbHRhIENSTCBJbmRpY2F0b3IiLE5JRF9kZWx0YV9jcmwsMywKKwkmKGx2YWx1ZXNbNzQ5XSksMH0sCit7IkNSTFJlYXNvbiIsIlg1MDl2MyBDUkwgUmVhc29uIENvZGUiLE5JRF9jcmxfcmVhc29uLDMsJihsdmFsdWVzWzc1Ml0pLDB9LAoreyJpbnZhbGlkaXR5RGF0ZSIsIkludmFsaWRpdHkgRGF0ZSIsTklEX2ludmFsaWRpdHlfZGF0ZSwzLAorCSYobHZhbHVlc1s3NTVdKSwwfSwKK3siU1hOZXRJRCIsIlN0cm9uZyBFeHRyYW5ldCBJRCIsTklEX3N4bmV0LDUsJihsdmFsdWVzWzc1OF0pLDB9LAoreyJQQkUtU0hBMS1SQzQtMTI4IiwicGJlV2l0aFNIQTFBbmQxMjhCaXRSQzQiLAorCU5JRF9wYmVfV2l0aFNIQTFBbmQxMjhCaXRSQzQsMTAsJihsdmFsdWVzWzc2M10pLDB9LAoreyJQQkUtU0hBMS1SQzQtNDAiLCJwYmVXaXRoU0hBMUFuZDQwQml0UkM0IiwKKwlOSURfcGJlX1dpdGhTSEExQW5kNDBCaXRSQzQsMTAsJihsdmFsdWVzWzc3M10pLDB9LAoreyJQQkUtU0hBMS0zREVTIiwicGJlV2l0aFNIQTFBbmQzLUtleVRyaXBsZURFUy1DQkMiLAorCU5JRF9wYmVfV2l0aFNIQTFBbmQzX0tleV9UcmlwbGVERVNfQ0JDLDEwLCYobHZhbHVlc1s3ODNdKSwwfSwKK3siUEJFLVNIQTEtMkRFUyIsInBiZVdpdGhTSEExQW5kMi1LZXlUcmlwbGVERVMtQ0JDIiwKKwlOSURfcGJlX1dpdGhTSEExQW5kMl9LZXlfVHJpcGxlREVTX0NCQywxMCwmKGx2YWx1ZXNbNzkzXSksMH0sCit7IlBCRS1TSEExLVJDMi0xMjgiLCJwYmVXaXRoU0hBMUFuZDEyOEJpdFJDMi1DQkMiLAorCU5JRF9wYmVfV2l0aFNIQTFBbmQxMjhCaXRSQzJfQ0JDLDEwLCYobHZhbHVlc1s4MDNdKSwwfSwKK3siUEJFLVNIQTEtUkMyLTQwIiwicGJlV2l0aFNIQTFBbmQ0MEJpdFJDMi1DQkMiLAorCU5JRF9wYmVfV2l0aFNIQTFBbmQ0MEJpdFJDMl9DQkMsMTAsJihsdmFsdWVzWzgxM10pLDB9LAoreyJrZXlCYWciLCJrZXlCYWciLE5JRF9rZXlCYWcsMTEsJihsdmFsdWVzWzgyM10pLDB9LAoreyJwa2NzOFNocm91ZGVkS2V5QmFnIiwicGtjczhTaHJvdWRlZEtleUJhZyIsTklEX3BrY3M4U2hyb3VkZWRLZXlCYWcsCisJMTEsJihsdmFsdWVzWzgzNF0pLDB9LAoreyJjZXJ0QmFnIiwiY2VydEJhZyIsTklEX2NlcnRCYWcsMTEsJihsdmFsdWVzWzg0NV0pLDB9LAoreyJjcmxCYWciLCJjcmxCYWciLE5JRF9jcmxCYWcsMTEsJihsdmFsdWVzWzg1Nl0pLDB9LAoreyJzZWNyZXRCYWciLCJzZWNyZXRCYWciLE5JRF9zZWNyZXRCYWcsMTEsJihsdmFsdWVzWzg2N10pLDB9LAoreyJzYWZlQ29udGVudHNCYWciLCJzYWZlQ29udGVudHNCYWciLE5JRF9zYWZlQ29udGVudHNCYWcsMTEsCisJJihsdmFsdWVzWzg3OF0pLDB9LAoreyJmcmllbmRseU5hbWUiLCJmcmllbmRseU5hbWUiLE5JRF9mcmllbmRseU5hbWUsOSwmKGx2YWx1ZXNbODg5XSksMH0sCit7ImxvY2FsS2V5SUQiLCJsb2NhbEtleUlEIixOSURfbG9jYWxLZXlJRCw5LCYobHZhbHVlc1s4OThdKSwwfSwKK3sieDUwOUNlcnRpZmljYXRlIiwieDUwOUNlcnRpZmljYXRlIixOSURfeDUwOUNlcnRpZmljYXRlLDEwLAorCSYobHZhbHVlc1s5MDddKSwwfSwKK3sic2RzaUNlcnRpZmljYXRlIiwic2RzaUNlcnRpZmljYXRlIixOSURfc2RzaUNlcnRpZmljYXRlLDEwLAorCSYobHZhbHVlc1s5MTddKSwwfSwKK3sieDUwOUNybCIsIng1MDlDcmwiLE5JRF94NTA5Q3JsLDEwLCYobHZhbHVlc1s5MjddKSwwfSwKK3siUEJFUzIiLCJQQkVTMiIsTklEX3BiZXMyLDksJihsdmFsdWVzWzkzN10pLDB9LAoreyJQQk1BQzEiLCJQQk1BQzEiLE5JRF9wYm1hYzEsOSwmKGx2YWx1ZXNbOTQ2XSksMH0sCit7ImhtYWNXaXRoU0hBMSIsImhtYWNXaXRoU0hBMSIsTklEX2htYWNXaXRoU0hBMSw4LCYobHZhbHVlc1s5NTVdKSwwfSwKK3siaWQtcXQtY3BzIiwiUG9saWN5IFF1YWxpZmllciBDUFMiLE5JRF9pZF9xdF9jcHMsOCwmKGx2YWx1ZXNbOTYzXSksMH0sCit7ImlkLXF0LXVub3RpY2UiLCJQb2xpY3kgUXVhbGlmaWVyIFVzZXIgTm90aWNlIixOSURfaWRfcXRfdW5vdGljZSw4LAorCSYobHZhbHVlc1s5NzFdKSwwfSwKK3siUkMyLTY0LUNCQyIsInJjMi02NC1jYmMiLE5JRF9yYzJfNjRfY2JjLDAsTlVMTCwwfSwKK3siU01JTUUtQ0FQUyIsIlMvTUlNRSBDYXBhYmlsaXRpZXMiLE5JRF9TTUlNRUNhcGFiaWxpdGllcyw5LAorCSYobHZhbHVlc1s5NzldKSwwfSwKK3siUEJFLU1EMi1SQzItNjQiLCJwYmVXaXRoTUQyQW5kUkMyLUNCQyIsTklEX3BiZVdpdGhNRDJBbmRSQzJfQ0JDLDksCisJJihsdmFsdWVzWzk4OF0pLDB9LAoreyJQQkUtTUQ1LVJDMi02NCIsInBiZVdpdGhNRDVBbmRSQzItQ0JDIixOSURfcGJlV2l0aE1ENUFuZFJDMl9DQkMsOSwKKwkmKGx2YWx1ZXNbOTk3XSksMH0sCit7IlBCRS1TSEExLURFUyIsInBiZVdpdGhTSEExQW5kREVTLUNCQyIsTklEX3BiZVdpdGhTSEExQW5kREVTX0NCQyw5LAorCSYobHZhbHVlc1sxMDA2XSksMH0sCit7Im1zRXh0UmVxIiwiTWljcm9zb2Z0IEV4dGVuc2lvbiBSZXF1ZXN0IixOSURfbXNfZXh0X3JlcSwxMCwKKwkmKGx2YWx1ZXNbMTAxNV0pLDB9LAoreyJleHRSZXEiLCJFeHRlbnNpb24gUmVxdWVzdCIsTklEX2V4dF9yZXEsOSwmKGx2YWx1ZXNbMTAyNV0pLDB9LAoreyJuYW1lIiwibmFtZSIsTklEX25hbWUsMywmKGx2YWx1ZXNbMTAzNF0pLDB9LAoreyJkblF1YWxpZmllciIsImRuUXVhbGlmaWVyIixOSURfZG5RdWFsaWZpZXIsMywmKGx2YWx1ZXNbMTAzN10pLDB9LAoreyJpZC1wZSIsImlkLXBlIixOSURfaWRfcGUsNywmKGx2YWx1ZXNbMTA0MF0pLDB9LAoreyJpZC1hZCIsImlkLWFkIixOSURfaWRfYWQsNywmKGx2YWx1ZXNbMTA0N10pLDB9LAoreyJhdXRob3JpdHlJbmZvQWNjZXNzIiwiQXV0aG9yaXR5IEluZm9ybWF0aW9uIEFjY2VzcyIsTklEX2luZm9fYWNjZXNzLAorCTgsJihsdmFsdWVzWzEwNTRdKSwwfSwKK3siT0NTUCIsIk9DU1AiLE5JRF9hZF9PQ1NQLDgsJihsdmFsdWVzWzEwNjJdKSwwfSwKK3siY2FJc3N1ZXJzIiwiQ0EgSXNzdWVycyIsTklEX2FkX2NhX2lzc3VlcnMsOCwmKGx2YWx1ZXNbMTA3MF0pLDB9LAoreyJPQ1NQU2lnbmluZyIsIk9DU1AgU2lnbmluZyIsTklEX09DU1Bfc2lnbiw4LCYobHZhbHVlc1sxMDc4XSksMH0sCit7IklTTyIsImlzbyIsTklEX2lzbywxLCYobHZhbHVlc1sxMDg2XSksMH0sCit7Im1lbWJlci1ib2R5IiwiSVNPIE1lbWJlciBCb2R5IixOSURfbWVtYmVyX2JvZHksMSwmKGx2YWx1ZXNbMTA4N10pLDB9LAoreyJJU08tVVMiLCJJU08gVVMgTWVtYmVyIEJvZHkiLE5JRF9JU09fVVMsMywmKGx2YWx1ZXNbMTA4OF0pLDB9LAoreyJYOS01NyIsIlg5LjU3IixOSURfWDlfNTcsNSwmKGx2YWx1ZXNbMTA5MV0pLDB9LAoreyJYOWNtIiwiWDkuNTcgQ00gPyIsTklEX1g5Y20sNiwmKGx2YWx1ZXNbMTA5Nl0pLDB9LAoreyJwa2NzMSIsInBrY3MxIixOSURfcGtjczEsOCwmKGx2YWx1ZXNbMTEwMl0pLDB9LAoreyJwa2NzNSIsInBrY3M1IixOSURfcGtjczUsOCwmKGx2YWx1ZXNbMTExMF0pLDB9LAoreyJTTUlNRSIsIlMvTUlNRSIsTklEX1NNSU1FLDksJihsdmFsdWVzWzExMThdKSwwfSwKK3siaWQtc21pbWUtbW9kIiwiaWQtc21pbWUtbW9kIixOSURfaWRfc21pbWVfbW9kLDEwLCYobHZhbHVlc1sxMTI3XSksMH0sCit7ImlkLXNtaW1lLWN0IiwiaWQtc21pbWUtY3QiLE5JRF9pZF9zbWltZV9jdCwxMCwmKGx2YWx1ZXNbMTEzN10pLDB9LAoreyJpZC1zbWltZS1hYSIsImlkLXNtaW1lLWFhIixOSURfaWRfc21pbWVfYWEsMTAsJihsdmFsdWVzWzExNDddKSwwfSwKK3siaWQtc21pbWUtYWxnIiwiaWQtc21pbWUtYWxnIixOSURfaWRfc21pbWVfYWxnLDEwLCYobHZhbHVlc1sxMTU3XSksMH0sCit7ImlkLXNtaW1lLWNkIiwiaWQtc21pbWUtY2QiLE5JRF9pZF9zbWltZV9jZCwxMCwmKGx2YWx1ZXNbMTE2N10pLDB9LAoreyJpZC1zbWltZS1zcHEiLCJpZC1zbWltZS1zcHEiLE5JRF9pZF9zbWltZV9zcHEsMTAsJihsdmFsdWVzWzExNzddKSwwfSwKK3siaWQtc21pbWUtY3RpIiwiaWQtc21pbWUtY3RpIixOSURfaWRfc21pbWVfY3RpLDEwLCYobHZhbHVlc1sxMTg3XSksMH0sCit7ImlkLXNtaW1lLW1vZC1jbXMiLCJpZC1zbWltZS1tb2QtY21zIixOSURfaWRfc21pbWVfbW9kX2NtcywxMSwKKwkmKGx2YWx1ZXNbMTE5N10pLDB9LAoreyJpZC1zbWltZS1tb2QtZXNzIiwiaWQtc21pbWUtbW9kLWVzcyIsTklEX2lkX3NtaW1lX21vZF9lc3MsMTEsCisJJihsdmFsdWVzWzEyMDhdKSwwfSwKK3siaWQtc21pbWUtbW9kLW9pZCIsImlkLXNtaW1lLW1vZC1vaWQiLE5JRF9pZF9zbWltZV9tb2Rfb2lkLDExLAorCSYobHZhbHVlc1sxMjE5XSksMH0sCit7ImlkLXNtaW1lLW1vZC1tc2ctdjMiLCJpZC1zbWltZS1tb2QtbXNnLXYzIixOSURfaWRfc21pbWVfbW9kX21zZ192MywKKwkxMSwmKGx2YWx1ZXNbMTIzMF0pLDB9LAoreyJpZC1zbWltZS1tb2QtZXRzLWVTaWduYXR1cmUtODgiLCJpZC1zbWltZS1tb2QtZXRzLWVTaWduYXR1cmUtODgiLAorCU5JRF9pZF9zbWltZV9tb2RfZXRzX2VTaWduYXR1cmVfODgsMTEsJihsdmFsdWVzWzEyNDFdKSwwfSwKK3siaWQtc21pbWUtbW9kLWV0cy1lU2lnbmF0dXJlLTk3IiwiaWQtc21pbWUtbW9kLWV0cy1lU2lnbmF0dXJlLTk3IiwKKwlOSURfaWRfc21pbWVfbW9kX2V0c19lU2lnbmF0dXJlXzk3LDExLCYobHZhbHVlc1sxMjUyXSksMH0sCit7ImlkLXNtaW1lLW1vZC1ldHMtZVNpZ1BvbGljeS04OCIsImlkLXNtaW1lLW1vZC1ldHMtZVNpZ1BvbGljeS04OCIsCisJTklEX2lkX3NtaW1lX21vZF9ldHNfZVNpZ1BvbGljeV84OCwxMSwmKGx2YWx1ZXNbMTI2M10pLDB9LAoreyJpZC1zbWltZS1tb2QtZXRzLWVTaWdQb2xpY3ktOTciLCJpZC1zbWltZS1tb2QtZXRzLWVTaWdQb2xpY3ktOTciLAorCU5JRF9pZF9zbWltZV9tb2RfZXRzX2VTaWdQb2xpY3lfOTcsMTEsJihsdmFsdWVzWzEyNzRdKSwwfSwKK3siaWQtc21pbWUtY3QtcmVjZWlwdCIsImlkLXNtaW1lLWN0LXJlY2VpcHQiLE5JRF9pZF9zbWltZV9jdF9yZWNlaXB0LAorCTExLCYobHZhbHVlc1sxMjg1XSksMH0sCit7ImlkLXNtaW1lLWN0LWF1dGhEYXRhIiwiaWQtc21pbWUtY3QtYXV0aERhdGEiLAorCU5JRF9pZF9zbWltZV9jdF9hdXRoRGF0YSwxMSwmKGx2YWx1ZXNbMTI5Nl0pLDB9LAoreyJpZC1zbWltZS1jdC1wdWJsaXNoQ2VydCIsImlkLXNtaW1lLWN0LXB1Ymxpc2hDZXJ0IiwKKwlOSURfaWRfc21pbWVfY3RfcHVibGlzaENlcnQsMTEsJihsdmFsdWVzWzEzMDddKSwwfSwKK3siaWQtc21pbWUtY3QtVFNUSW5mbyIsImlkLXNtaW1lLWN0LVRTVEluZm8iLE5JRF9pZF9zbWltZV9jdF9UU1RJbmZvLAorCTExLCYobHZhbHVlc1sxMzE4XSksMH0sCit7ImlkLXNtaW1lLWN0LVREVEluZm8iLCJpZC1zbWltZS1jdC1URFRJbmZvIixOSURfaWRfc21pbWVfY3RfVERUSW5mbywKKwkxMSwmKGx2YWx1ZXNbMTMyOV0pLDB9LAoreyJpZC1zbWltZS1jdC1jb250ZW50SW5mbyIsImlkLXNtaW1lLWN0LWNvbnRlbnRJbmZvIiwKKwlOSURfaWRfc21pbWVfY3RfY29udGVudEluZm8sMTEsJihsdmFsdWVzWzEzNDBdKSwwfSwKK3siaWQtc21pbWUtY3QtRFZDU1JlcXVlc3REYXRhIiwiaWQtc21pbWUtY3QtRFZDU1JlcXVlc3REYXRhIiwKKwlOSURfaWRfc21pbWVfY3RfRFZDU1JlcXVlc3REYXRhLDExLCYobHZhbHVlc1sxMzUxXSksMH0sCit7ImlkLXNtaW1lLWN0LURWQ1NSZXNwb25zZURhdGEiLCJpZC1zbWltZS1jdC1EVkNTUmVzcG9uc2VEYXRhIiwKKwlOSURfaWRfc21pbWVfY3RfRFZDU1Jlc3BvbnNlRGF0YSwxMSwmKGx2YWx1ZXNbMTM2Ml0pLDB9LAoreyJpZC1zbWltZS1hYS1yZWNlaXB0UmVxdWVzdCIsImlkLXNtaW1lLWFhLXJlY2VpcHRSZXF1ZXN0IiwKKwlOSURfaWRfc21pbWVfYWFfcmVjZWlwdFJlcXVlc3QsMTEsJihsdmFsdWVzWzEzNzNdKSwwfSwKK3siaWQtc21pbWUtYWEtc2VjdXJpdHlMYWJlbCIsImlkLXNtaW1lLWFhLXNlY3VyaXR5TGFiZWwiLAorCU5JRF9pZF9zbWltZV9hYV9zZWN1cml0eUxhYmVsLDExLCYobHZhbHVlc1sxMzg0XSksMH0sCit7ImlkLXNtaW1lLWFhLW1sRXhwYW5kSGlzdG9yeSIsImlkLXNtaW1lLWFhLW1sRXhwYW5kSGlzdG9yeSIsCisJTklEX2lkX3NtaW1lX2FhX21sRXhwYW5kSGlzdG9yeSwxMSwmKGx2YWx1ZXNbMTM5NV0pLDB9LAoreyJpZC1zbWltZS1hYS1jb250ZW50SGludCIsImlkLXNtaW1lLWFhLWNvbnRlbnRIaW50IiwKKwlOSURfaWRfc21pbWVfYWFfY29udGVudEhpbnQsMTEsJihsdmFsdWVzWzE0MDZdKSwwfSwKK3siaWQtc21pbWUtYWEtbXNnU2lnRGlnZXN0IiwiaWQtc21pbWUtYWEtbXNnU2lnRGlnZXN0IiwKKwlOSURfaWRfc21pbWVfYWFfbXNnU2lnRGlnZXN0LDExLCYobHZhbHVlc1sxNDE3XSksMH0sCit7ImlkLXNtaW1lLWFhLWVuY2FwQ29udGVudFR5cGUiLCJpZC1zbWltZS1hYS1lbmNhcENvbnRlbnRUeXBlIiwKKwlOSURfaWRfc21pbWVfYWFfZW5jYXBDb250ZW50VHlwZSwxMSwmKGx2YWx1ZXNbMTQyOF0pLDB9LAoreyJpZC1zbWltZS1hYS1jb250ZW50SWRlbnRpZmllciIsImlkLXNtaW1lLWFhLWNvbnRlbnRJZGVudGlmaWVyIiwKKwlOSURfaWRfc21pbWVfYWFfY29udGVudElkZW50aWZpZXIsMTEsJihsdmFsdWVzWzE0MzldKSwwfSwKK3siaWQtc21pbWUtYWEtbWFjVmFsdWUiLCJpZC1zbWltZS1hYS1tYWNWYWx1ZSIsCisJTklEX2lkX3NtaW1lX2FhX21hY1ZhbHVlLDExLCYobHZhbHVlc1sxNDUwXSksMH0sCit7ImlkLXNtaW1lLWFhLWVxdWl2YWxlbnRMYWJlbHMiLCJpZC1zbWltZS1hYS1lcXVpdmFsZW50TGFiZWxzIiwKKwlOSURfaWRfc21pbWVfYWFfZXF1aXZhbGVudExhYmVscywxMSwmKGx2YWx1ZXNbMTQ2MV0pLDB9LAoreyJpZC1zbWltZS1hYS1jb250ZW50UmVmZXJlbmNlIiwiaWQtc21pbWUtYWEtY29udGVudFJlZmVyZW5jZSIsCisJTklEX2lkX3NtaW1lX2FhX2NvbnRlbnRSZWZlcmVuY2UsMTEsJihsdmFsdWVzWzE0NzJdKSwwfSwKK3siaWQtc21pbWUtYWEtZW5jcnlwS2V5UHJlZiIsImlkLXNtaW1lLWFhLWVuY3J5cEtleVByZWYiLAorCU5JRF9pZF9zbWltZV9hYV9lbmNyeXBLZXlQcmVmLDExLCYobHZhbHVlc1sxNDgzXSksMH0sCit7ImlkLXNtaW1lLWFhLXNpZ25pbmdDZXJ0aWZpY2F0ZSIsImlkLXNtaW1lLWFhLXNpZ25pbmdDZXJ0aWZpY2F0ZSIsCisJTklEX2lkX3NtaW1lX2FhX3NpZ25pbmdDZXJ0aWZpY2F0ZSwxMSwmKGx2YWx1ZXNbMTQ5NF0pLDB9LAoreyJpZC1zbWltZS1hYS1zbWltZUVuY3J5cHRDZXJ0cyIsImlkLXNtaW1lLWFhLXNtaW1lRW5jcnlwdENlcnRzIiwKKwlOSURfaWRfc21pbWVfYWFfc21pbWVFbmNyeXB0Q2VydHMsMTEsJihsdmFsdWVzWzE1MDVdKSwwfSwKK3siaWQtc21pbWUtYWEtdGltZVN0YW1wVG9rZW4iLCJpZC1zbWltZS1hYS10aW1lU3RhbXBUb2tlbiIsCisJTklEX2lkX3NtaW1lX2FhX3RpbWVTdGFtcFRva2VuLDExLCYobHZhbHVlc1sxNTE2XSksMH0sCit7ImlkLXNtaW1lLWFhLWV0cy1zaWdQb2xpY3lJZCIsImlkLXNtaW1lLWFhLWV0cy1zaWdQb2xpY3lJZCIsCisJTklEX2lkX3NtaW1lX2FhX2V0c19zaWdQb2xpY3lJZCwxMSwmKGx2YWx1ZXNbMTUyN10pLDB9LAoreyJpZC1zbWltZS1hYS1ldHMtY29tbWl0bWVudFR5cGUiLCJpZC1zbWltZS1hYS1ldHMtY29tbWl0bWVudFR5cGUiLAorCU5JRF9pZF9zbWltZV9hYV9ldHNfY29tbWl0bWVudFR5cGUsMTEsJihsdmFsdWVzWzE1MzhdKSwwfSwKK3siaWQtc21pbWUtYWEtZXRzLXNpZ25lckxvY2F0aW9uIiwiaWQtc21pbWUtYWEtZXRzLXNpZ25lckxvY2F0aW9uIiwKKwlOSURfaWRfc21pbWVfYWFfZXRzX3NpZ25lckxvY2F0aW9uLDExLCYobHZhbHVlc1sxNTQ5XSksMH0sCit7ImlkLXNtaW1lLWFhLWV0cy1zaWduZXJBdHRyIiwiaWQtc21pbWUtYWEtZXRzLXNpZ25lckF0dHIiLAorCU5JRF9pZF9zbWltZV9hYV9ldHNfc2lnbmVyQXR0ciwxMSwmKGx2YWx1ZXNbMTU2MF0pLDB9LAoreyJpZC1zbWltZS1hYS1ldHMtb3RoZXJTaWdDZXJ0IiwiaWQtc21pbWUtYWEtZXRzLW90aGVyU2lnQ2VydCIsCisJTklEX2lkX3NtaW1lX2FhX2V0c19vdGhlclNpZ0NlcnQsMTEsJihsdmFsdWVzWzE1NzFdKSwwfSwKK3siaWQtc21pbWUtYWEtZXRzLWNvbnRlbnRUaW1lc3RhbXAiLAorCSJpZC1zbWltZS1hYS1ldHMtY29udGVudFRpbWVzdGFtcCIsCisJTklEX2lkX3NtaW1lX2FhX2V0c19jb250ZW50VGltZXN0YW1wLDExLCYobHZhbHVlc1sxNTgyXSksMH0sCit7ImlkLXNtaW1lLWFhLWV0cy1DZXJ0aWZpY2F0ZVJlZnMiLCJpZC1zbWltZS1hYS1ldHMtQ2VydGlmaWNhdGVSZWZzIiwKKwlOSURfaWRfc21pbWVfYWFfZXRzX0NlcnRpZmljYXRlUmVmcywxMSwmKGx2YWx1ZXNbMTU5M10pLDB9LAoreyJpZC1zbWltZS1hYS1ldHMtUmV2b2NhdGlvblJlZnMiLCJpZC1zbWltZS1hYS1ldHMtUmV2b2NhdGlvblJlZnMiLAorCU5JRF9pZF9zbWltZV9hYV9ldHNfUmV2b2NhdGlvblJlZnMsMTEsJihsdmFsdWVzWzE2MDRdKSwwfSwKK3siaWQtc21pbWUtYWEtZXRzLWNlcnRWYWx1ZXMiLCJpZC1zbWltZS1hYS1ldHMtY2VydFZhbHVlcyIsCisJTklEX2lkX3NtaW1lX2FhX2V0c19jZXJ0VmFsdWVzLDExLCYobHZhbHVlc1sxNjE1XSksMH0sCit7ImlkLXNtaW1lLWFhLWV0cy1yZXZvY2F0aW9uVmFsdWVzIiwKKwkiaWQtc21pbWUtYWEtZXRzLXJldm9jYXRpb25WYWx1ZXMiLAorCU5JRF9pZF9zbWltZV9hYV9ldHNfcmV2b2NhdGlvblZhbHVlcywxMSwmKGx2YWx1ZXNbMTYyNl0pLDB9LAoreyJpZC1zbWltZS1hYS1ldHMtZXNjVGltZVN0YW1wIiwiaWQtc21pbWUtYWEtZXRzLWVzY1RpbWVTdGFtcCIsCisJTklEX2lkX3NtaW1lX2FhX2V0c19lc2NUaW1lU3RhbXAsMTEsJihsdmFsdWVzWzE2MzddKSwwfSwKK3siaWQtc21pbWUtYWEtZXRzLWNlcnRDUkxUaW1lc3RhbXAiLAorCSJpZC1zbWltZS1hYS1ldHMtY2VydENSTFRpbWVzdGFtcCIsCisJTklEX2lkX3NtaW1lX2FhX2V0c19jZXJ0Q1JMVGltZXN0YW1wLDExLCYobHZhbHVlc1sxNjQ4XSksMH0sCit7ImlkLXNtaW1lLWFhLWV0cy1hcmNoaXZlVGltZVN0YW1wIiwKKwkiaWQtc21pbWUtYWEtZXRzLWFyY2hpdmVUaW1lU3RhbXAiLAorCU5JRF9pZF9zbWltZV9hYV9ldHNfYXJjaGl2ZVRpbWVTdGFtcCwxMSwmKGx2YWx1ZXNbMTY1OV0pLDB9LAoreyJpZC1zbWltZS1hYS1zaWduYXR1cmVUeXBlIiwiaWQtc21pbWUtYWEtc2lnbmF0dXJlVHlwZSIsCisJTklEX2lkX3NtaW1lX2FhX3NpZ25hdHVyZVR5cGUsMTEsJihsdmFsdWVzWzE2NzBdKSwwfSwKK3siaWQtc21pbWUtYWEtZHZjcy1kdmMiLCJpZC1zbWltZS1hYS1kdmNzLWR2YyIsCisJTklEX2lkX3NtaW1lX2FhX2R2Y3NfZHZjLDExLCYobHZhbHVlc1sxNjgxXSksMH0sCit7ImlkLXNtaW1lLWFsZy1FU0RId2l0aDNERVMiLCJpZC1zbWltZS1hbGctRVNESHdpdGgzREVTIiwKKwlOSURfaWRfc21pbWVfYWxnX0VTREh3aXRoM0RFUywxMSwmKGx2YWx1ZXNbMTY5Ml0pLDB9LAoreyJpZC1zbWltZS1hbGctRVNESHdpdGhSQzIiLCJpZC1zbWltZS1hbGctRVNESHdpdGhSQzIiLAorCU5JRF9pZF9zbWltZV9hbGdfRVNESHdpdGhSQzIsMTEsJihsdmFsdWVzWzE3MDNdKSwwfSwKK3siaWQtc21pbWUtYWxnLTNERVN3cmFwIiwiaWQtc21pbWUtYWxnLTNERVN3cmFwIiwKKwlOSURfaWRfc21pbWVfYWxnXzNERVN3cmFwLDExLCYobHZhbHVlc1sxNzE0XSksMH0sCit7ImlkLXNtaW1lLWFsZy1SQzJ3cmFwIiwiaWQtc21pbWUtYWxnLVJDMndyYXAiLAorCU5JRF9pZF9zbWltZV9hbGdfUkMyd3JhcCwxMSwmKGx2YWx1ZXNbMTcyNV0pLDB9LAoreyJpZC1zbWltZS1hbGctRVNESCIsImlkLXNtaW1lLWFsZy1FU0RIIixOSURfaWRfc21pbWVfYWxnX0VTREgsMTEsCisJJihsdmFsdWVzWzE3MzZdKSwwfSwKK3siaWQtc21pbWUtYWxnLUNNUzNERVN3cmFwIiwiaWQtc21pbWUtYWxnLUNNUzNERVN3cmFwIiwKKwlOSURfaWRfc21pbWVfYWxnX0NNUzNERVN3cmFwLDExLCYobHZhbHVlc1sxNzQ3XSksMH0sCit7ImlkLXNtaW1lLWFsZy1DTVNSQzJ3cmFwIiwiaWQtc21pbWUtYWxnLUNNU1JDMndyYXAiLAorCU5JRF9pZF9zbWltZV9hbGdfQ01TUkMyd3JhcCwxMSwmKGx2YWx1ZXNbMTc1OF0pLDB9LAoreyJpZC1zbWltZS1jZC1sZGFwIiwiaWQtc21pbWUtY2QtbGRhcCIsTklEX2lkX3NtaW1lX2NkX2xkYXAsMTEsCisJJihsdmFsdWVzWzE3NjldKSwwfSwKK3siaWQtc21pbWUtc3BxLWV0cy1zcXQtdXJpIiwiaWQtc21pbWUtc3BxLWV0cy1zcXQtdXJpIiwKKwlOSURfaWRfc21pbWVfc3BxX2V0c19zcXRfdXJpLDExLCYobHZhbHVlc1sxNzgwXSksMH0sCit7ImlkLXNtaW1lLXNwcS1ldHMtc3F0LXVub3RpY2UiLCJpZC1zbWltZS1zcHEtZXRzLXNxdC11bm90aWNlIiwKKwlOSURfaWRfc21pbWVfc3BxX2V0c19zcXRfdW5vdGljZSwxMSwmKGx2YWx1ZXNbMTc5MV0pLDB9LAoreyJpZC1zbWltZS1jdGktZXRzLXByb29mT2ZPcmlnaW4iLCJpZC1zbWltZS1jdGktZXRzLXByb29mT2ZPcmlnaW4iLAorCU5JRF9pZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZPcmlnaW4sMTEsJihsdmFsdWVzWzE4MDJdKSwwfSwKK3siaWQtc21pbWUtY3RpLWV0cy1wcm9vZk9mUmVjZWlwdCIsImlkLXNtaW1lLWN0aS1ldHMtcHJvb2ZPZlJlY2VpcHQiLAorCU5JRF9pZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZSZWNlaXB0LDExLCYobHZhbHVlc1sxODEzXSksMH0sCit7ImlkLXNtaW1lLWN0aS1ldHMtcHJvb2ZPZkRlbGl2ZXJ5IiwKKwkiaWQtc21pbWUtY3RpLWV0cy1wcm9vZk9mRGVsaXZlcnkiLAorCU5JRF9pZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZEZWxpdmVyeSwxMSwmKGx2YWx1ZXNbMTgyNF0pLDB9LAoreyJpZC1zbWltZS1jdGktZXRzLXByb29mT2ZTZW5kZXIiLCJpZC1zbWltZS1jdGktZXRzLXByb29mT2ZTZW5kZXIiLAorCU5JRF9pZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZTZW5kZXIsMTEsJihsdmFsdWVzWzE4MzVdKSwwfSwKK3siaWQtc21pbWUtY3RpLWV0cy1wcm9vZk9mQXBwcm92YWwiLAorCSJpZC1zbWltZS1jdGktZXRzLXByb29mT2ZBcHByb3ZhbCIsCisJTklEX2lkX3NtaW1lX2N0aV9ldHNfcHJvb2ZPZkFwcHJvdmFsLDExLCYobHZhbHVlc1sxODQ2XSksMH0sCit7ImlkLXNtaW1lLWN0aS1ldHMtcHJvb2ZPZkNyZWF0aW9uIiwKKwkiaWQtc21pbWUtY3RpLWV0cy1wcm9vZk9mQ3JlYXRpb24iLAorCU5JRF9pZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZDcmVhdGlvbiwxMSwmKGx2YWx1ZXNbMTg1N10pLDB9LAoreyJNRDQiLCJtZDQiLE5JRF9tZDQsOCwmKGx2YWx1ZXNbMTg2OF0pLDB9LAoreyJpZC1wa2l4LW1vZCIsImlkLXBraXgtbW9kIixOSURfaWRfcGtpeF9tb2QsNywmKGx2YWx1ZXNbMTg3Nl0pLDB9LAoreyJpZC1xdCIsImlkLXF0IixOSURfaWRfcXQsNywmKGx2YWx1ZXNbMTg4M10pLDB9LAoreyJpZC1pdCIsImlkLWl0IixOSURfaWRfaXQsNywmKGx2YWx1ZXNbMTg5MF0pLDB9LAoreyJpZC1wa2lwIiwiaWQtcGtpcCIsTklEX2lkX3BraXAsNywmKGx2YWx1ZXNbMTg5N10pLDB9LAoreyJpZC1hbGciLCJpZC1hbGciLE5JRF9pZF9hbGcsNywmKGx2YWx1ZXNbMTkwNF0pLDB9LAoreyJpZC1jbWMiLCJpZC1jbWMiLE5JRF9pZF9jbWMsNywmKGx2YWx1ZXNbMTkxMV0pLDB9LAoreyJpZC1vbiIsImlkLW9uIixOSURfaWRfb24sNywmKGx2YWx1ZXNbMTkxOF0pLDB9LAoreyJpZC1wZGEiLCJpZC1wZGEiLE5JRF9pZF9wZGEsNywmKGx2YWx1ZXNbMTkyNV0pLDB9LAoreyJpZC1hY2EiLCJpZC1hY2EiLE5JRF9pZF9hY2EsNywmKGx2YWx1ZXNbMTkzMl0pLDB9LAoreyJpZC1xY3MiLCJpZC1xY3MiLE5JRF9pZF9xY3MsNywmKGx2YWx1ZXNbMTkzOV0pLDB9LAoreyJpZC1jY3QiLCJpZC1jY3QiLE5JRF9pZF9jY3QsNywmKGx2YWx1ZXNbMTk0Nl0pLDB9LAoreyJpZC1wa2l4MS1leHBsaWNpdC04OCIsImlkLXBraXgxLWV4cGxpY2l0LTg4IiwKKwlOSURfaWRfcGtpeDFfZXhwbGljaXRfODgsOCwmKGx2YWx1ZXNbMTk1M10pLDB9LAoreyJpZC1wa2l4MS1pbXBsaWNpdC04OCIsImlkLXBraXgxLWltcGxpY2l0LTg4IiwKKwlOSURfaWRfcGtpeDFfaW1wbGljaXRfODgsOCwmKGx2YWx1ZXNbMTk2MV0pLDB9LAoreyJpZC1wa2l4MS1leHBsaWNpdC05MyIsImlkLXBraXgxLWV4cGxpY2l0LTkzIiwKKwlOSURfaWRfcGtpeDFfZXhwbGljaXRfOTMsOCwmKGx2YWx1ZXNbMTk2OV0pLDB9LAoreyJpZC1wa2l4MS1pbXBsaWNpdC05MyIsImlkLXBraXgxLWltcGxpY2l0LTkzIiwKKwlOSURfaWRfcGtpeDFfaW1wbGljaXRfOTMsOCwmKGx2YWx1ZXNbMTk3N10pLDB9LAoreyJpZC1tb2QtY3JtZiIsImlkLW1vZC1jcm1mIixOSURfaWRfbW9kX2NybWYsOCwmKGx2YWx1ZXNbMTk4NV0pLDB9LAoreyJpZC1tb2QtY21jIiwiaWQtbW9kLWNtYyIsTklEX2lkX21vZF9jbWMsOCwmKGx2YWx1ZXNbMTk5M10pLDB9LAoreyJpZC1tb2Qta2VhLXByb2ZpbGUtODgiLCJpZC1tb2Qta2VhLXByb2ZpbGUtODgiLAorCU5JRF9pZF9tb2Rfa2VhX3Byb2ZpbGVfODgsOCwmKGx2YWx1ZXNbMjAwMV0pLDB9LAoreyJpZC1tb2Qta2VhLXByb2ZpbGUtOTMiLCJpZC1tb2Qta2VhLXByb2ZpbGUtOTMiLAorCU5JRF9pZF9tb2Rfa2VhX3Byb2ZpbGVfOTMsOCwmKGx2YWx1ZXNbMjAwOV0pLDB9LAoreyJpZC1tb2QtY21wIiwiaWQtbW9kLWNtcCIsTklEX2lkX21vZF9jbXAsOCwmKGx2YWx1ZXNbMjAxN10pLDB9LAoreyJpZC1tb2QtcXVhbGlmaWVkLWNlcnQtODgiLCJpZC1tb2QtcXVhbGlmaWVkLWNlcnQtODgiLAorCU5JRF9pZF9tb2RfcXVhbGlmaWVkX2NlcnRfODgsOCwmKGx2YWx1ZXNbMjAyNV0pLDB9LAoreyJpZC1tb2QtcXVhbGlmaWVkLWNlcnQtOTMiLCJpZC1tb2QtcXVhbGlmaWVkLWNlcnQtOTMiLAorCU5JRF9pZF9tb2RfcXVhbGlmaWVkX2NlcnRfOTMsOCwmKGx2YWx1ZXNbMjAzM10pLDB9LAoreyJpZC1tb2QtYXR0cmlidXRlLWNlcnQiLCJpZC1tb2QtYXR0cmlidXRlLWNlcnQiLAorCU5JRF9pZF9tb2RfYXR0cmlidXRlX2NlcnQsOCwmKGx2YWx1ZXNbMjA0MV0pLDB9LAoreyJpZC1tb2QtdGltZXN0YW1wLXByb3RvY29sIiwiaWQtbW9kLXRpbWVzdGFtcC1wcm90b2NvbCIsCisJTklEX2lkX21vZF90aW1lc3RhbXBfcHJvdG9jb2wsOCwmKGx2YWx1ZXNbMjA0OV0pLDB9LAoreyJpZC1tb2Qtb2NzcCIsImlkLW1vZC1vY3NwIixOSURfaWRfbW9kX29jc3AsOCwmKGx2YWx1ZXNbMjA1N10pLDB9LAoreyJpZC1tb2QtZHZjcyIsImlkLW1vZC1kdmNzIixOSURfaWRfbW9kX2R2Y3MsOCwmKGx2YWx1ZXNbMjA2NV0pLDB9LAoreyJpZC1tb2QtY21wMjAwMCIsImlkLW1vZC1jbXAyMDAwIixOSURfaWRfbW9kX2NtcDIwMDAsOCwKKwkmKGx2YWx1ZXNbMjA3M10pLDB9LAoreyJiaW9tZXRyaWNJbmZvIiwiQmlvbWV0cmljIEluZm8iLE5JRF9iaW9tZXRyaWNJbmZvLDgsJihsdmFsdWVzWzIwODFdKSwwfSwKK3sicWNTdGF0ZW1lbnRzIiwicWNTdGF0ZW1lbnRzIixOSURfcWNTdGF0ZW1lbnRzLDgsJihsdmFsdWVzWzIwODldKSwwfSwKK3siYWMtYXVkaXRFbnRpdHkiLCJhYy1hdWRpdEVudGl0eSIsTklEX2FjX2F1ZGl0RW50aXR5LDgsCisJJihsdmFsdWVzWzIwOTddKSwwfSwKK3siYWMtdGFyZ2V0aW5nIiwiYWMtdGFyZ2V0aW5nIixOSURfYWNfdGFyZ2V0aW5nLDgsJihsdmFsdWVzWzIxMDVdKSwwfSwKK3siYWFDb250cm9scyIsImFhQ29udHJvbHMiLE5JRF9hYUNvbnRyb2xzLDgsJihsdmFsdWVzWzIxMTNdKSwwfSwKK3sic2JncC1pcEFkZHJCbG9jayIsInNiZ3AtaXBBZGRyQmxvY2siLE5JRF9zYmdwX2lwQWRkckJsb2NrLDgsCisJJihsdmFsdWVzWzIxMjFdKSwwfSwKK3sic2JncC1hdXRvbm9tb3VzU3lzTnVtIiwic2JncC1hdXRvbm9tb3VzU3lzTnVtIiwKKwlOSURfc2JncF9hdXRvbm9tb3VzU3lzTnVtLDgsJihsdmFsdWVzWzIxMjldKSwwfSwKK3sic2JncC1yb3V0ZXJJZGVudGlmaWVyIiwic2JncC1yb3V0ZXJJZGVudGlmaWVyIiwKKwlOSURfc2JncF9yb3V0ZXJJZGVudGlmaWVyLDgsJihsdmFsdWVzWzIxMzddKSwwfSwKK3sidGV4dE5vdGljZSIsInRleHROb3RpY2UiLE5JRF90ZXh0Tm90aWNlLDgsJihsdmFsdWVzWzIxNDVdKSwwfSwKK3siaXBzZWNFbmRTeXN0ZW0iLCJJUFNlYyBFbmQgU3lzdGVtIixOSURfaXBzZWNFbmRTeXN0ZW0sOCwKKwkmKGx2YWx1ZXNbMjE1M10pLDB9LAoreyJpcHNlY1R1bm5lbCIsIklQU2VjIFR1bm5lbCIsTklEX2lwc2VjVHVubmVsLDgsJihsdmFsdWVzWzIxNjFdKSwwfSwKK3siaXBzZWNVc2VyIiwiSVBTZWMgVXNlciIsTklEX2lwc2VjVXNlciw4LCYobHZhbHVlc1syMTY5XSksMH0sCit7IkRWQ1MiLCJkdmNzIixOSURfZHZjcyw4LCYobHZhbHVlc1syMTc3XSksMH0sCit7ImlkLWl0LWNhUHJvdEVuY0NlcnQiLCJpZC1pdC1jYVByb3RFbmNDZXJ0IixOSURfaWRfaXRfY2FQcm90RW5jQ2VydCwKKwk4LCYobHZhbHVlc1syMTg1XSksMH0sCit7ImlkLWl0LXNpZ25LZXlQYWlyVHlwZXMiLCJpZC1pdC1zaWduS2V5UGFpclR5cGVzIiwKKwlOSURfaWRfaXRfc2lnbktleVBhaXJUeXBlcyw4LCYobHZhbHVlc1syMTkzXSksMH0sCit7ImlkLWl0LWVuY0tleVBhaXJUeXBlcyIsImlkLWl0LWVuY0tleVBhaXJUeXBlcyIsCisJTklEX2lkX2l0X2VuY0tleVBhaXJUeXBlcyw4LCYobHZhbHVlc1syMjAxXSksMH0sCit7ImlkLWl0LXByZWZlcnJlZFN5bW1BbGciLCJpZC1pdC1wcmVmZXJyZWRTeW1tQWxnIiwKKwlOSURfaWRfaXRfcHJlZmVycmVkU3ltbUFsZyw4LCYobHZhbHVlc1syMjA5XSksMH0sCit7ImlkLWl0LWNhS2V5VXBkYXRlSW5mbyIsImlkLWl0LWNhS2V5VXBkYXRlSW5mbyIsCisJTklEX2lkX2l0X2NhS2V5VXBkYXRlSW5mbyw4LCYobHZhbHVlc1syMjE3XSksMH0sCit7ImlkLWl0LWN1cnJlbnRDUkwiLCJpZC1pdC1jdXJyZW50Q1JMIixOSURfaWRfaXRfY3VycmVudENSTCw4LAorCSYobHZhbHVlc1syMjI1XSksMH0sCit7ImlkLWl0LXVuc3VwcG9ydGVkT0lEcyIsImlkLWl0LXVuc3VwcG9ydGVkT0lEcyIsCisJTklEX2lkX2l0X3Vuc3VwcG9ydGVkT0lEcyw4LCYobHZhbHVlc1syMjMzXSksMH0sCit7ImlkLWl0LXN1YnNjcmlwdGlvblJlcXVlc3QiLCJpZC1pdC1zdWJzY3JpcHRpb25SZXF1ZXN0IiwKKwlOSURfaWRfaXRfc3Vic2NyaXB0aW9uUmVxdWVzdCw4LCYobHZhbHVlc1syMjQxXSksMH0sCit7ImlkLWl0LXN1YnNjcmlwdGlvblJlc3BvbnNlIiwiaWQtaXQtc3Vic2NyaXB0aW9uUmVzcG9uc2UiLAorCU5JRF9pZF9pdF9zdWJzY3JpcHRpb25SZXNwb25zZSw4LCYobHZhbHVlc1syMjQ5XSksMH0sCit7ImlkLWl0LWtleVBhaXJQYXJhbVJlcSIsImlkLWl0LWtleVBhaXJQYXJhbVJlcSIsCisJTklEX2lkX2l0X2tleVBhaXJQYXJhbVJlcSw4LCYobHZhbHVlc1syMjU3XSksMH0sCit7ImlkLWl0LWtleVBhaXJQYXJhbVJlcCIsImlkLWl0LWtleVBhaXJQYXJhbVJlcCIsCisJTklEX2lkX2l0X2tleVBhaXJQYXJhbVJlcCw4LCYobHZhbHVlc1syMjY1XSksMH0sCit7ImlkLWl0LXJldlBhc3NwaHJhc2UiLCJpZC1pdC1yZXZQYXNzcGhyYXNlIixOSURfaWRfaXRfcmV2UGFzc3BocmFzZSwKKwk4LCYobHZhbHVlc1syMjczXSksMH0sCit7ImlkLWl0LWltcGxpY2l0Q29uZmlybSIsImlkLWl0LWltcGxpY2l0Q29uZmlybSIsCisJTklEX2lkX2l0X2ltcGxpY2l0Q29uZmlybSw4LCYobHZhbHVlc1syMjgxXSksMH0sCit7ImlkLWl0LWNvbmZpcm1XYWl0VGltZSIsImlkLWl0LWNvbmZpcm1XYWl0VGltZSIsCisJTklEX2lkX2l0X2NvbmZpcm1XYWl0VGltZSw4LCYobHZhbHVlc1syMjg5XSksMH0sCit7ImlkLWl0LW9yaWdQS0lNZXNzYWdlIiwiaWQtaXQtb3JpZ1BLSU1lc3NhZ2UiLAorCU5JRF9pZF9pdF9vcmlnUEtJTWVzc2FnZSw4LCYobHZhbHVlc1syMjk3XSksMH0sCit7ImlkLXJlZ0N0cmwiLCJpZC1yZWdDdHJsIixOSURfaWRfcmVnQ3RybCw4LCYobHZhbHVlc1syMzA1XSksMH0sCit7ImlkLXJlZ0luZm8iLCJpZC1yZWdJbmZvIixOSURfaWRfcmVnSW5mbyw4LCYobHZhbHVlc1syMzEzXSksMH0sCit7ImlkLXJlZ0N0cmwtcmVnVG9rZW4iLCJpZC1yZWdDdHJsLXJlZ1Rva2VuIixOSURfaWRfcmVnQ3RybF9yZWdUb2tlbiwKKwk5LCYobHZhbHVlc1syMzIxXSksMH0sCit7ImlkLXJlZ0N0cmwtYXV0aGVudGljYXRvciIsImlkLXJlZ0N0cmwtYXV0aGVudGljYXRvciIsCisJTklEX2lkX3JlZ0N0cmxfYXV0aGVudGljYXRvciw5LCYobHZhbHVlc1syMzMwXSksMH0sCit7ImlkLXJlZ0N0cmwtcGtpUHVibGljYXRpb25JbmZvIiwiaWQtcmVnQ3RybC1wa2lQdWJsaWNhdGlvbkluZm8iLAorCU5JRF9pZF9yZWdDdHJsX3BraVB1YmxpY2F0aW9uSW5mbyw5LCYobHZhbHVlc1syMzM5XSksMH0sCit7ImlkLXJlZ0N0cmwtcGtpQXJjaGl2ZU9wdGlvbnMiLCJpZC1yZWdDdHJsLXBraUFyY2hpdmVPcHRpb25zIiwKKwlOSURfaWRfcmVnQ3RybF9wa2lBcmNoaXZlT3B0aW9ucyw5LCYobHZhbHVlc1syMzQ4XSksMH0sCit7ImlkLXJlZ0N0cmwtb2xkQ2VydElEIiwiaWQtcmVnQ3RybC1vbGRDZXJ0SUQiLAorCU5JRF9pZF9yZWdDdHJsX29sZENlcnRJRCw5LCYobHZhbHVlc1syMzU3XSksMH0sCit7ImlkLXJlZ0N0cmwtcHJvdG9jb2xFbmNyS2V5IiwiaWQtcmVnQ3RybC1wcm90b2NvbEVuY3JLZXkiLAorCU5JRF9pZF9yZWdDdHJsX3Byb3RvY29sRW5jcktleSw5LCYobHZhbHVlc1syMzY2XSksMH0sCit7ImlkLXJlZ0luZm8tdXRmOFBhaXJzIiwiaWQtcmVnSW5mby11dGY4UGFpcnMiLAorCU5JRF9pZF9yZWdJbmZvX3V0ZjhQYWlycyw5LCYobHZhbHVlc1syMzc1XSksMH0sCit7ImlkLXJlZ0luZm8tY2VydFJlcSIsImlkLXJlZ0luZm8tY2VydFJlcSIsTklEX2lkX3JlZ0luZm9fY2VydFJlcSw5LAorCSYobHZhbHVlc1syMzg0XSksMH0sCit7ImlkLWFsZy1kZXM0MCIsImlkLWFsZy1kZXM0MCIsTklEX2lkX2FsZ19kZXM0MCw4LCYobHZhbHVlc1syMzkzXSksMH0sCit7ImlkLWFsZy1ub1NpZ25hdHVyZSIsImlkLWFsZy1ub1NpZ25hdHVyZSIsTklEX2lkX2FsZ19ub1NpZ25hdHVyZSw4LAorCSYobHZhbHVlc1syNDAxXSksMH0sCit7ImlkLWFsZy1kaC1zaWctaG1hYy1zaGExIiwiaWQtYWxnLWRoLXNpZy1obWFjLXNoYTEiLAorCU5JRF9pZF9hbGdfZGhfc2lnX2htYWNfc2hhMSw4LCYobHZhbHVlc1syNDA5XSksMH0sCit7ImlkLWFsZy1kaC1wb3AiLCJpZC1hbGctZGgtcG9wIixOSURfaWRfYWxnX2RoX3BvcCw4LCYobHZhbHVlc1syNDE3XSksMH0sCit7ImlkLWNtYy1zdGF0dXNJbmZvIiwiaWQtY21jLXN0YXR1c0luZm8iLE5JRF9pZF9jbWNfc3RhdHVzSW5mbyw4LAorCSYobHZhbHVlc1syNDI1XSksMH0sCit7ImlkLWNtYy1pZGVudGlmaWNhdGlvbiIsImlkLWNtYy1pZGVudGlmaWNhdGlvbiIsCisJTklEX2lkX2NtY19pZGVudGlmaWNhdGlvbiw4LCYobHZhbHVlc1syNDMzXSksMH0sCit7ImlkLWNtYy1pZGVudGl0eVByb29mIiwiaWQtY21jLWlkZW50aXR5UHJvb2YiLAorCU5JRF9pZF9jbWNfaWRlbnRpdHlQcm9vZiw4LCYobHZhbHVlc1syNDQxXSksMH0sCit7ImlkLWNtYy1kYXRhUmV0dXJuIiwiaWQtY21jLWRhdGFSZXR1cm4iLE5JRF9pZF9jbWNfZGF0YVJldHVybiw4LAorCSYobHZhbHVlc1syNDQ5XSksMH0sCit7ImlkLWNtYy10cmFuc2FjdGlvbklkIiwiaWQtY21jLXRyYW5zYWN0aW9uSWQiLAorCU5JRF9pZF9jbWNfdHJhbnNhY3Rpb25JZCw4LCYobHZhbHVlc1syNDU3XSksMH0sCit7ImlkLWNtYy1zZW5kZXJOb25jZSIsImlkLWNtYy1zZW5kZXJOb25jZSIsTklEX2lkX2NtY19zZW5kZXJOb25jZSw4LAorCSYobHZhbHVlc1syNDY1XSksMH0sCit7ImlkLWNtYy1yZWNpcGllbnROb25jZSIsImlkLWNtYy1yZWNpcGllbnROb25jZSIsCisJTklEX2lkX2NtY19yZWNpcGllbnROb25jZSw4LCYobHZhbHVlc1syNDczXSksMH0sCit7ImlkLWNtYy1hZGRFeHRlbnNpb25zIiwiaWQtY21jLWFkZEV4dGVuc2lvbnMiLAorCU5JRF9pZF9jbWNfYWRkRXh0ZW5zaW9ucyw4LCYobHZhbHVlc1syNDgxXSksMH0sCit7ImlkLWNtYy1lbmNyeXB0ZWRQT1AiLCJpZC1jbWMtZW5jcnlwdGVkUE9QIixOSURfaWRfY21jX2VuY3J5cHRlZFBPUCwKKwk4LCYobHZhbHVlc1syNDg5XSksMH0sCit7ImlkLWNtYy1kZWNyeXB0ZWRQT1AiLCJpZC1jbWMtZGVjcnlwdGVkUE9QIixOSURfaWRfY21jX2RlY3J5cHRlZFBPUCwKKwk4LCYobHZhbHVlc1syNDk3XSksMH0sCit7ImlkLWNtYy1scmFQT1BXaXRuZXNzIiwiaWQtY21jLWxyYVBPUFdpdG5lc3MiLAorCU5JRF9pZF9jbWNfbHJhUE9QV2l0bmVzcyw4LCYobHZhbHVlc1syNTA1XSksMH0sCit7ImlkLWNtYy1nZXRDZXJ0IiwiaWQtY21jLWdldENlcnQiLE5JRF9pZF9jbWNfZ2V0Q2VydCw4LAorCSYobHZhbHVlc1syNTEzXSksMH0sCit7ImlkLWNtYy1nZXRDUkwiLCJpZC1jbWMtZ2V0Q1JMIixOSURfaWRfY21jX2dldENSTCw4LCYobHZhbHVlc1syNTIxXSksMH0sCit7ImlkLWNtYy1yZXZva2VSZXF1ZXN0IiwiaWQtY21jLXJldm9rZVJlcXVlc3QiLAorCU5JRF9pZF9jbWNfcmV2b2tlUmVxdWVzdCw4LCYobHZhbHVlc1syNTI5XSksMH0sCit7ImlkLWNtYy1yZWdJbmZvIiwiaWQtY21jLXJlZ0luZm8iLE5JRF9pZF9jbWNfcmVnSW5mbyw4LAorCSYobHZhbHVlc1syNTM3XSksMH0sCit7ImlkLWNtYy1yZXNwb25zZUluZm8iLCJpZC1jbWMtcmVzcG9uc2VJbmZvIixOSURfaWRfY21jX3Jlc3BvbnNlSW5mbywKKwk4LCYobHZhbHVlc1syNTQ1XSksMH0sCit7ImlkLWNtYy1xdWVyeVBlbmRpbmciLCJpZC1jbWMtcXVlcnlQZW5kaW5nIixOSURfaWRfY21jX3F1ZXJ5UGVuZGluZywKKwk4LCYobHZhbHVlc1syNTUzXSksMH0sCit7ImlkLWNtYy1wb3BMaW5rUmFuZG9tIiwiaWQtY21jLXBvcExpbmtSYW5kb20iLAorCU5JRF9pZF9jbWNfcG9wTGlua1JhbmRvbSw4LCYobHZhbHVlc1syNTYxXSksMH0sCit7ImlkLWNtYy1wb3BMaW5rV2l0bmVzcyIsImlkLWNtYy1wb3BMaW5rV2l0bmVzcyIsCisJTklEX2lkX2NtY19wb3BMaW5rV2l0bmVzcyw4LCYobHZhbHVlc1syNTY5XSksMH0sCit7ImlkLWNtYy1jb25maXJtQ2VydEFjY2VwdGFuY2UiLCJpZC1jbWMtY29uZmlybUNlcnRBY2NlcHRhbmNlIiwKKwlOSURfaWRfY21jX2NvbmZpcm1DZXJ0QWNjZXB0YW5jZSw4LCYobHZhbHVlc1syNTc3XSksMH0sCit7ImlkLW9uLXBlcnNvbmFsRGF0YSIsImlkLW9uLXBlcnNvbmFsRGF0YSIsTklEX2lkX29uX3BlcnNvbmFsRGF0YSw4LAorCSYobHZhbHVlc1syNTg1XSksMH0sCit7ImlkLXBkYS1kYXRlT2ZCaXJ0aCIsImlkLXBkYS1kYXRlT2ZCaXJ0aCIsTklEX2lkX3BkYV9kYXRlT2ZCaXJ0aCw4LAorCSYobHZhbHVlc1syNTkzXSksMH0sCit7ImlkLXBkYS1wbGFjZU9mQmlydGgiLCJpZC1wZGEtcGxhY2VPZkJpcnRoIixOSURfaWRfcGRhX3BsYWNlT2ZCaXJ0aCwKKwk4LCYobHZhbHVlc1syNjAxXSksMH0sCit7TlVMTCxOVUxMLE5JRF91bmRlZiwwLE5VTEwsMH0sCit7ImlkLXBkYS1nZW5kZXIiLCJpZC1wZGEtZ2VuZGVyIixOSURfaWRfcGRhX2dlbmRlciw4LCYobHZhbHVlc1syNjA5XSksMH0sCit7ImlkLXBkYS1jb3VudHJ5T2ZDaXRpemVuc2hpcCIsImlkLXBkYS1jb3VudHJ5T2ZDaXRpemVuc2hpcCIsCisJTklEX2lkX3BkYV9jb3VudHJ5T2ZDaXRpemVuc2hpcCw4LCYobHZhbHVlc1syNjE3XSksMH0sCit7ImlkLXBkYS1jb3VudHJ5T2ZSZXNpZGVuY2UiLCJpZC1wZGEtY291bnRyeU9mUmVzaWRlbmNlIiwKKwlOSURfaWRfcGRhX2NvdW50cnlPZlJlc2lkZW5jZSw4LCYobHZhbHVlc1syNjI1XSksMH0sCit7ImlkLWFjYS1hdXRoZW50aWNhdGlvbkluZm8iLCJpZC1hY2EtYXV0aGVudGljYXRpb25JbmZvIiwKKwlOSURfaWRfYWNhX2F1dGhlbnRpY2F0aW9uSW5mbyw4LCYobHZhbHVlc1syNjMzXSksMH0sCit7ImlkLWFjYS1hY2Nlc3NJZGVudGl0eSIsImlkLWFjYS1hY2Nlc3NJZGVudGl0eSIsCisJTklEX2lkX2FjYV9hY2Nlc3NJZGVudGl0eSw4LCYobHZhbHVlc1syNjQxXSksMH0sCit7ImlkLWFjYS1jaGFyZ2luZ0lkZW50aXR5IiwiaWQtYWNhLWNoYXJnaW5nSWRlbnRpdHkiLAorCU5JRF9pZF9hY2FfY2hhcmdpbmdJZGVudGl0eSw4LCYobHZhbHVlc1syNjQ5XSksMH0sCit7ImlkLWFjYS1ncm91cCIsImlkLWFjYS1ncm91cCIsTklEX2lkX2FjYV9ncm91cCw4LCYobHZhbHVlc1syNjU3XSksMH0sCit7ImlkLWFjYS1yb2xlIiwiaWQtYWNhLXJvbGUiLE5JRF9pZF9hY2Ffcm9sZSw4LCYobHZhbHVlc1syNjY1XSksMH0sCit7ImlkLXFjcy1wa2l4UUNTeW50YXgtdjEiLCJpZC1xY3MtcGtpeFFDU3ludGF4LXYxIiwKKwlOSURfaWRfcWNzX3BraXhRQ1N5bnRheF92MSw4LCYobHZhbHVlc1syNjczXSksMH0sCit7ImlkLWNjdC1jcnMiLCJpZC1jY3QtY3JzIixOSURfaWRfY2N0X2Nycyw4LCYobHZhbHVlc1syNjgxXSksMH0sCit7ImlkLWNjdC1QS0lEYXRhIiwiaWQtY2N0LVBLSURhdGEiLE5JRF9pZF9jY3RfUEtJRGF0YSw4LAorCSYobHZhbHVlc1syNjg5XSksMH0sCit7ImlkLWNjdC1QS0lSZXNwb25zZSIsImlkLWNjdC1QS0lSZXNwb25zZSIsTklEX2lkX2NjdF9QS0lSZXNwb25zZSw4LAorCSYobHZhbHVlc1syNjk3XSksMH0sCit7ImFkX3RpbWVzdGFtcGluZyIsIkFEIFRpbWUgU3RhbXBpbmciLE5JRF9hZF90aW1lU3RhbXBpbmcsOCwKKwkmKGx2YWx1ZXNbMjcwNV0pLDB9LAoreyJBRF9EVkNTIiwiYWQgZHZjcyIsTklEX2FkX2R2Y3MsOCwmKGx2YWx1ZXNbMjcxM10pLDB9LAoreyJiYXNpY09DU1BSZXNwb25zZSIsIkJhc2ljIE9DU1AgUmVzcG9uc2UiLE5JRF9pZF9wa2l4X09DU1BfYmFzaWMsOSwKKwkmKGx2YWx1ZXNbMjcyMV0pLDB9LAoreyJOb25jZSIsIk9DU1AgTm9uY2UiLE5JRF9pZF9wa2l4X09DU1BfTm9uY2UsOSwmKGx2YWx1ZXNbMjczMF0pLDB9LAoreyJDcmxJRCIsIk9DU1AgQ1JMIElEIixOSURfaWRfcGtpeF9PQ1NQX0NybElELDksJihsdmFsdWVzWzI3MzldKSwwfSwKK3siYWNjZXB0YWJsZVJlc3BvbnNlcyIsIkFjY2VwdGFibGUgT0NTUCBSZXNwb25zZXMiLAorCU5JRF9pZF9wa2l4X09DU1BfYWNjZXB0YWJsZVJlc3BvbnNlcyw5LCYobHZhbHVlc1syNzQ4XSksMH0sCit7Im5vQ2hlY2siLCJPQ1NQIE5vIENoZWNrIixOSURfaWRfcGtpeF9PQ1NQX25vQ2hlY2ssOSwmKGx2YWx1ZXNbMjc1N10pLDB9LAoreyJhcmNoaXZlQ3V0b2ZmIiwiT0NTUCBBcmNoaXZlIEN1dG9mZiIsTklEX2lkX3BraXhfT0NTUF9hcmNoaXZlQ3V0b2ZmLAorCTksJihsdmFsdWVzWzI3NjZdKSwwfSwKK3sic2VydmljZUxvY2F0b3IiLCJPQ1NQIFNlcnZpY2UgTG9jYXRvciIsCisJTklEX2lkX3BraXhfT0NTUF9zZXJ2aWNlTG9jYXRvciw5LCYobHZhbHVlc1syNzc1XSksMH0sCit7ImV4dGVuZGVkU3RhdHVzIiwiRXh0ZW5kZWQgT0NTUCBTdGF0dXMiLAorCU5JRF9pZF9wa2l4X09DU1BfZXh0ZW5kZWRTdGF0dXMsOSwmKGx2YWx1ZXNbMjc4NF0pLDB9LAoreyJ2YWxpZCIsInZhbGlkIixOSURfaWRfcGtpeF9PQ1NQX3ZhbGlkLDksJihsdmFsdWVzWzI3OTNdKSwwfSwKK3sicGF0aCIsInBhdGgiLE5JRF9pZF9wa2l4X09DU1BfcGF0aCw5LCYobHZhbHVlc1syODAyXSksMH0sCit7InRydXN0Um9vdCIsIlRydXN0IFJvb3QiLE5JRF9pZF9wa2l4X09DU1BfdHJ1c3RSb290LDksCisJJihsdmFsdWVzWzI4MTFdKSwwfSwKK3siYWxnb3JpdGhtIiwiYWxnb3JpdGhtIixOSURfYWxnb3JpdGhtLDQsJihsdmFsdWVzWzI4MjBdKSwwfSwKK3sicnNhU2lnbmF0dXJlIiwicnNhU2lnbmF0dXJlIixOSURfcnNhU2lnbmF0dXJlLDUsJihsdmFsdWVzWzI4MjRdKSwwfSwKK3siWDUwMGFsZ29yaXRobXMiLCJkaXJlY3Rvcnkgc2VydmljZXMgLSBhbGdvcml0aG1zIiwKKwlOSURfWDUwMGFsZ29yaXRobXMsMiwmKGx2YWx1ZXNbMjgyOV0pLDB9LAoreyJPUkciLCJvcmciLE5JRF9vcmcsMSwmKGx2YWx1ZXNbMjgzMV0pLDB9LAoreyJET0QiLCJkb2QiLE5JRF9kb2QsMiwmKGx2YWx1ZXNbMjgzMl0pLDB9LAoreyJJQU5BIiwiaWFuYSIsTklEX2lhbmEsMywmKGx2YWx1ZXNbMjgzNF0pLDB9LAoreyJkaXJlY3RvcnkiLCJEaXJlY3RvcnkiLE5JRF9EaXJlY3RvcnksNCwmKGx2YWx1ZXNbMjgzN10pLDB9LAoreyJtZ210IiwiTWFuYWdlbWVudCIsTklEX01hbmFnZW1lbnQsNCwmKGx2YWx1ZXNbMjg0MV0pLDB9LAoreyJleHBlcmltZW50YWwiLCJFeHBlcmltZW50YWwiLE5JRF9FeHBlcmltZW50YWwsNCwmKGx2YWx1ZXNbMjg0NV0pLDB9LAoreyJwcml2YXRlIiwiUHJpdmF0ZSIsTklEX1ByaXZhdGUsNCwmKGx2YWx1ZXNbMjg0OV0pLDB9LAoreyJzZWN1cml0eSIsIlNlY3VyaXR5IixOSURfU2VjdXJpdHksNCwmKGx2YWx1ZXNbMjg1M10pLDB9LAoreyJzbm1wdjIiLCJTTk1QdjIiLE5JRF9TTk1QdjIsNCwmKGx2YWx1ZXNbMjg1N10pLDB9LAoreyJNYWlsIiwiTWFpbCIsTklEX01haWwsNCwmKGx2YWx1ZXNbMjg2MV0pLDB9LAoreyJlbnRlcnByaXNlcyIsIkVudGVycHJpc2VzIixOSURfRW50ZXJwcmlzZXMsNSwmKGx2YWx1ZXNbMjg2NV0pLDB9LAoreyJkY29iamVjdCIsImRjT2JqZWN0IixOSURfZGNPYmplY3QsOSwmKGx2YWx1ZXNbMjg3MF0pLDB9LAoreyJEQyIsImRvbWFpbkNvbXBvbmVudCIsTklEX2RvbWFpbkNvbXBvbmVudCwxMCwmKGx2YWx1ZXNbMjg3OV0pLDB9LAoreyJkb21haW4iLCJEb21haW4iLE5JRF9Eb21haW4sMTAsJihsdmFsdWVzWzI4ODldKSwwfSwKK3siTlVMTCIsIk5VTEwiLE5JRF9qb2ludF9pc29fY2NpdHQsMSwmKGx2YWx1ZXNbMjg5OV0pLDB9LAoreyJzZWxlY3RlZC1hdHRyaWJ1dGUtdHlwZXMiLCJTZWxlY3RlZCBBdHRyaWJ1dGUgVHlwZXMiLAorCU5JRF9zZWxlY3RlZF9hdHRyaWJ1dGVfdHlwZXMsMywmKGx2YWx1ZXNbMjkwMF0pLDB9LAoreyJjbGVhcmFuY2UiLCJjbGVhcmFuY2UiLE5JRF9jbGVhcmFuY2UsNCwmKGx2YWx1ZXNbMjkwM10pLDB9LAoreyJSU0EtTUQ0IiwibWQ0V2l0aFJTQUVuY3J5cHRpb24iLE5JRF9tZDRXaXRoUlNBRW5jcnlwdGlvbiw5LAorCSYobHZhbHVlc1syOTA3XSksMH0sCit7ImFjLXByb3h5aW5nIiwiYWMtcHJveHlpbmciLE5JRF9hY19wcm94eWluZyw4LCYobHZhbHVlc1syOTE2XSksMH0sCit7InN1YmplY3RJbmZvQWNjZXNzIiwiU3ViamVjdCBJbmZvcm1hdGlvbiBBY2Nlc3MiLE5JRF9zaW5mb19hY2Nlc3MsOCwKKwkmKGx2YWx1ZXNbMjkyNF0pLDB9LAoreyJpZC1hY2EtZW5jQXR0cnMiLCJpZC1hY2EtZW5jQXR0cnMiLE5JRF9pZF9hY2FfZW5jQXR0cnMsOCwKKwkmKGx2YWx1ZXNbMjkzMl0pLDB9LAoreyJyb2xlIiwicm9sZSIsTklEX3JvbGUsMywmKGx2YWx1ZXNbMjk0MF0pLDB9LAoreyJwb2xpY3lDb25zdHJhaW50cyIsIlg1MDl2MyBQb2xpY3kgQ29uc3RyYWludHMiLAorCU5JRF9wb2xpY3lfY29uc3RyYWludHMsMywmKGx2YWx1ZXNbMjk0M10pLDB9LAoreyJ0YXJnZXRJbmZvcm1hdGlvbiIsIlg1MDl2MyBBQyBUYXJnZXRpbmciLE5JRF90YXJnZXRfaW5mb3JtYXRpb24sMywKKwkmKGx2YWx1ZXNbMjk0Nl0pLDB9LAoreyJub1JldkF2YWlsIiwiWDUwOXYzIE5vIFJldm9jYXRpb24gQXZhaWxhYmxlIixOSURfbm9fcmV2X2F2YWlsLDMsCisJJihsdmFsdWVzWzI5NDldKSwwfSwKK3siTlVMTCIsIk5VTEwiLE5JRF9jY2l0dCwxLCYobHZhbHVlc1syOTUyXSksMH0sCit7ImFuc2ktWDktNjIiLCJBTlNJIFg5LjYyIixOSURfYW5zaV9YOV82Miw1LCYobHZhbHVlc1syOTUzXSksMH0sCit7InByaW1lLWZpZWxkIiwicHJpbWUtZmllbGQiLE5JRF9YOV82Ml9wcmltZV9maWVsZCw3LCYobHZhbHVlc1syOTU4XSksMH0sCit7ImNoYXJhY3RlcmlzdGljLXR3by1maWVsZCIsImNoYXJhY3RlcmlzdGljLXR3by1maWVsZCIsCisJTklEX1g5XzYyX2NoYXJhY3RlcmlzdGljX3R3b19maWVsZCw3LCYobHZhbHVlc1syOTY1XSksMH0sCit7ImlkLWVjUHVibGljS2V5IiwiaWQtZWNQdWJsaWNLZXkiLE5JRF9YOV82Ml9pZF9lY1B1YmxpY0tleSw3LAorCSYobHZhbHVlc1syOTcyXSksMH0sCit7InByaW1lMTkydjEiLCJwcmltZTE5MnYxIixOSURfWDlfNjJfcHJpbWUxOTJ2MSw4LCYobHZhbHVlc1syOTc5XSksMH0sCit7InByaW1lMTkydjIiLCJwcmltZTE5MnYyIixOSURfWDlfNjJfcHJpbWUxOTJ2Miw4LCYobHZhbHVlc1syOTg3XSksMH0sCit7InByaW1lMTkydjMiLCJwcmltZTE5MnYzIixOSURfWDlfNjJfcHJpbWUxOTJ2Myw4LCYobHZhbHVlc1syOTk1XSksMH0sCit7InByaW1lMjM5djEiLCJwcmltZTIzOXYxIixOSURfWDlfNjJfcHJpbWUyMzl2MSw4LCYobHZhbHVlc1szMDAzXSksMH0sCit7InByaW1lMjM5djIiLCJwcmltZTIzOXYyIixOSURfWDlfNjJfcHJpbWUyMzl2Miw4LCYobHZhbHVlc1szMDExXSksMH0sCit7InByaW1lMjM5djMiLCJwcmltZTIzOXYzIixOSURfWDlfNjJfcHJpbWUyMzl2Myw4LCYobHZhbHVlc1szMDE5XSksMH0sCit7InByaW1lMjU2djEiLCJwcmltZTI1NnYxIixOSURfWDlfNjJfcHJpbWUyNTZ2MSw4LCYobHZhbHVlc1szMDI3XSksMH0sCit7ImVjZHNhLXdpdGgtU0hBMSIsImVjZHNhLXdpdGgtU0hBMSIsTklEX2VjZHNhX3dpdGhfU0hBMSw3LAorCSYobHZhbHVlc1szMDM1XSksMH0sCit7IkNTUE5hbWUiLCJNaWNyb3NvZnQgQ1NQIE5hbWUiLE5JRF9tc19jc3BfbmFtZSw5LCYobHZhbHVlc1szMDQyXSksMH0sCit7IkFFUy0xMjgtRUNCIiwiYWVzLTEyOC1lY2IiLE5JRF9hZXNfMTI4X2VjYiw5LCYobHZhbHVlc1szMDUxXSksMH0sCit7IkFFUy0xMjgtQ0JDIiwiYWVzLTEyOC1jYmMiLE5JRF9hZXNfMTI4X2NiYyw5LCYobHZhbHVlc1szMDYwXSksMH0sCit7IkFFUy0xMjgtT0ZCIiwiYWVzLTEyOC1vZmIiLE5JRF9hZXNfMTI4X29mYjEyOCw5LCYobHZhbHVlc1szMDY5XSksMH0sCit7IkFFUy0xMjgtQ0ZCIiwiYWVzLTEyOC1jZmIiLE5JRF9hZXNfMTI4X2NmYjEyOCw5LCYobHZhbHVlc1szMDc4XSksMH0sCit7IkFFUy0xOTItRUNCIiwiYWVzLTE5Mi1lY2IiLE5JRF9hZXNfMTkyX2VjYiw5LCYobHZhbHVlc1szMDg3XSksMH0sCit7IkFFUy0xOTItQ0JDIiwiYWVzLTE5Mi1jYmMiLE5JRF9hZXNfMTkyX2NiYyw5LCYobHZhbHVlc1szMDk2XSksMH0sCit7IkFFUy0xOTItT0ZCIiwiYWVzLTE5Mi1vZmIiLE5JRF9hZXNfMTkyX29mYjEyOCw5LCYobHZhbHVlc1szMTA1XSksMH0sCit7IkFFUy0xOTItQ0ZCIiwiYWVzLTE5Mi1jZmIiLE5JRF9hZXNfMTkyX2NmYjEyOCw5LCYobHZhbHVlc1szMTE0XSksMH0sCit7IkFFUy0yNTYtRUNCIiwiYWVzLTI1Ni1lY2IiLE5JRF9hZXNfMjU2X2VjYiw5LCYobHZhbHVlc1szMTIzXSksMH0sCit7IkFFUy0yNTYtQ0JDIiwiYWVzLTI1Ni1jYmMiLE5JRF9hZXNfMjU2X2NiYyw5LCYobHZhbHVlc1szMTMyXSksMH0sCit7IkFFUy0yNTYtT0ZCIiwiYWVzLTI1Ni1vZmIiLE5JRF9hZXNfMjU2X29mYjEyOCw5LCYobHZhbHVlc1szMTQxXSksMH0sCit7IkFFUy0yNTYtQ0ZCIiwiYWVzLTI1Ni1jZmIiLE5JRF9hZXNfMjU2X2NmYjEyOCw5LCYobHZhbHVlc1szMTUwXSksMH0sCit7ImhvbGRJbnN0cnVjdGlvbkNvZGUiLCJIb2xkIEluc3RydWN0aW9uIENvZGUiLAorCU5JRF9ob2xkX2luc3RydWN0aW9uX2NvZGUsMywmKGx2YWx1ZXNbMzE1OV0pLDB9LAoreyJob2xkSW5zdHJ1Y3Rpb25Ob25lIiwiSG9sZCBJbnN0cnVjdGlvbiBOb25lIiwKKwlOSURfaG9sZF9pbnN0cnVjdGlvbl9ub25lLDcsJihsdmFsdWVzWzMxNjJdKSwwfSwKK3siaG9sZEluc3RydWN0aW9uQ2FsbElzc3VlciIsIkhvbGQgSW5zdHJ1Y3Rpb24gQ2FsbCBJc3N1ZXIiLAorCU5JRF9ob2xkX2luc3RydWN0aW9uX2NhbGxfaXNzdWVyLDcsJihsdmFsdWVzWzMxNjldKSwwfSwKK3siaG9sZEluc3RydWN0aW9uUmVqZWN0IiwiSG9sZCBJbnN0cnVjdGlvbiBSZWplY3QiLAorCU5JRF9ob2xkX2luc3RydWN0aW9uX3JlamVjdCw3LCYobHZhbHVlc1szMTc2XSksMH0sCit7ImRhdGEiLCJkYXRhIixOSURfZGF0YSwxLCYobHZhbHVlc1szMTgzXSksMH0sCit7InBzcyIsInBzcyIsTklEX3BzcywzLCYobHZhbHVlc1szMTg0XSksMH0sCit7InVjbCIsInVjbCIsTklEX3VjbCw3LCYobHZhbHVlc1szMTg3XSksMH0sCit7InBpbG90IiwicGlsb3QiLE5JRF9waWxvdCw4LCYobHZhbHVlc1szMTk0XSksMH0sCit7InBpbG90QXR0cmlidXRlVHlwZSIsInBpbG90QXR0cmlidXRlVHlwZSIsTklEX3BpbG90QXR0cmlidXRlVHlwZSw5LAorCSYobHZhbHVlc1szMjAyXSksMH0sCit7InBpbG90QXR0cmlidXRlU3ludGF4IiwicGlsb3RBdHRyaWJ1dGVTeW50YXgiLAorCU5JRF9waWxvdEF0dHJpYnV0ZVN5bnRheCw5LCYobHZhbHVlc1szMjExXSksMH0sCit7InBpbG90T2JqZWN0Q2xhc3MiLCJwaWxvdE9iamVjdENsYXNzIixOSURfcGlsb3RPYmplY3RDbGFzcyw5LAorCSYobHZhbHVlc1szMjIwXSksMH0sCit7InBpbG90R3JvdXBzIiwicGlsb3RHcm91cHMiLE5JRF9waWxvdEdyb3Vwcyw5LCYobHZhbHVlc1szMjI5XSksMH0sCit7ImlBNVN0cmluZ1N5bnRheCIsImlBNVN0cmluZ1N5bnRheCIsTklEX2lBNVN0cmluZ1N5bnRheCwxMCwKKwkmKGx2YWx1ZXNbMzIzOF0pLDB9LAoreyJjYXNlSWdub3JlSUE1U3RyaW5nU3ludGF4IiwiY2FzZUlnbm9yZUlBNVN0cmluZ1N5bnRheCIsCisJTklEX2Nhc2VJZ25vcmVJQTVTdHJpbmdTeW50YXgsMTAsJihsdmFsdWVzWzMyNDhdKSwwfSwKK3sicGlsb3RPYmplY3QiLCJwaWxvdE9iamVjdCIsTklEX3BpbG90T2JqZWN0LDEwLCYobHZhbHVlc1szMjU4XSksMH0sCit7InBpbG90UGVyc29uIiwicGlsb3RQZXJzb24iLE5JRF9waWxvdFBlcnNvbiwxMCwmKGx2YWx1ZXNbMzI2OF0pLDB9LAoreyJhY2NvdW50IiwiYWNjb3VudCIsTklEX2FjY291bnQsMTAsJihsdmFsdWVzWzMyNzhdKSwwfSwKK3siZG9jdW1lbnQiLCJkb2N1bWVudCIsTklEX2RvY3VtZW50LDEwLCYobHZhbHVlc1szMjg4XSksMH0sCit7InJvb20iLCJyb29tIixOSURfcm9vbSwxMCwmKGx2YWx1ZXNbMzI5OF0pLDB9LAoreyJkb2N1bWVudFNlcmllcyIsImRvY3VtZW50U2VyaWVzIixOSURfZG9jdW1lbnRTZXJpZXMsMTAsCisJJihsdmFsdWVzWzMzMDhdKSwwfSwKK3sickZDODIybG9jYWxQYXJ0IiwickZDODIybG9jYWxQYXJ0IixOSURfckZDODIybG9jYWxQYXJ0LDEwLAorCSYobHZhbHVlc1szMzE4XSksMH0sCit7ImROU0RvbWFpbiIsImROU0RvbWFpbiIsTklEX2ROU0RvbWFpbiwxMCwmKGx2YWx1ZXNbMzMyOF0pLDB9LAoreyJkb21haW5SZWxhdGVkT2JqZWN0IiwiZG9tYWluUmVsYXRlZE9iamVjdCIsTklEX2RvbWFpblJlbGF0ZWRPYmplY3QsCisJMTAsJihsdmFsdWVzWzMzMzhdKSwwfSwKK3siZnJpZW5kbHlDb3VudHJ5IiwiZnJpZW5kbHlDb3VudHJ5IixOSURfZnJpZW5kbHlDb3VudHJ5LDEwLAorCSYobHZhbHVlc1szMzQ4XSksMH0sCit7InNpbXBsZVNlY3VyaXR5T2JqZWN0Iiwic2ltcGxlU2VjdXJpdHlPYmplY3QiLAorCU5JRF9zaW1wbGVTZWN1cml0eU9iamVjdCwxMCwmKGx2YWx1ZXNbMzM1OF0pLDB9LAoreyJwaWxvdE9yZ2FuaXphdGlvbiIsInBpbG90T3JnYW5pemF0aW9uIixOSURfcGlsb3RPcmdhbml6YXRpb24sMTAsCisJJihsdmFsdWVzWzMzNjhdKSwwfSwKK3sicGlsb3REU0EiLCJwaWxvdERTQSIsTklEX3BpbG90RFNBLDEwLCYobHZhbHVlc1szMzc4XSksMH0sCit7InF1YWxpdHlMYWJlbGxlZERhdGEiLCJxdWFsaXR5TGFiZWxsZWREYXRhIixOSURfcXVhbGl0eUxhYmVsbGVkRGF0YSwKKwkxMCwmKGx2YWx1ZXNbMzM4OF0pLDB9LAoreyJVSUQiLCJ1c2VySWQiLE5JRF91c2VySWQsMTAsJihsdmFsdWVzWzMzOThdKSwwfSwKK3sidGV4dEVuY29kZWRPUkFkZHJlc3MiLCJ0ZXh0RW5jb2RlZE9SQWRkcmVzcyIsCisJTklEX3RleHRFbmNvZGVkT1JBZGRyZXNzLDEwLCYobHZhbHVlc1szNDA4XSksMH0sCit7Im1haWwiLCJyZmM4MjJNYWlsYm94IixOSURfcmZjODIyTWFpbGJveCwxMCwmKGx2YWx1ZXNbMzQxOF0pLDB9LAoreyJpbmZvIiwiaW5mbyIsTklEX2luZm8sMTAsJihsdmFsdWVzWzM0MjhdKSwwfSwKK3siZmF2b3VyaXRlRHJpbmsiLCJmYXZvdXJpdGVEcmluayIsTklEX2Zhdm91cml0ZURyaW5rLDEwLAorCSYobHZhbHVlc1szNDM4XSksMH0sCit7InJvb21OdW1iZXIiLCJyb29tTnVtYmVyIixOSURfcm9vbU51bWJlciwxMCwmKGx2YWx1ZXNbMzQ0OF0pLDB9LAoreyJwaG90byIsInBob3RvIixOSURfcGhvdG8sMTAsJihsdmFsdWVzWzM0NThdKSwwfSwKK3sidXNlckNsYXNzIiwidXNlckNsYXNzIixOSURfdXNlckNsYXNzLDEwLCYobHZhbHVlc1szNDY4XSksMH0sCit7Imhvc3QiLCJob3N0IixOSURfaG9zdCwxMCwmKGx2YWx1ZXNbMzQ3OF0pLDB9LAoreyJtYW5hZ2VyIiwibWFuYWdlciIsTklEX21hbmFnZXIsMTAsJihsdmFsdWVzWzM0ODhdKSwwfSwKK3siZG9jdW1lbnRJZGVudGlmaWVyIiwiZG9jdW1lbnRJZGVudGlmaWVyIixOSURfZG9jdW1lbnRJZGVudGlmaWVyLDEwLAorCSYobHZhbHVlc1szNDk4XSksMH0sCit7ImRvY3VtZW50VGl0bGUiLCJkb2N1bWVudFRpdGxlIixOSURfZG9jdW1lbnRUaXRsZSwxMCwmKGx2YWx1ZXNbMzUwOF0pLDB9LAoreyJkb2N1bWVudFZlcnNpb24iLCJkb2N1bWVudFZlcnNpb24iLE5JRF9kb2N1bWVudFZlcnNpb24sMTAsCisJJihsdmFsdWVzWzM1MThdKSwwfSwKK3siZG9jdW1lbnRBdXRob3IiLCJkb2N1bWVudEF1dGhvciIsTklEX2RvY3VtZW50QXV0aG9yLDEwLAorCSYobHZhbHVlc1szNTI4XSksMH0sCit7ImRvY3VtZW50TG9jYXRpb24iLCJkb2N1bWVudExvY2F0aW9uIixOSURfZG9jdW1lbnRMb2NhdGlvbiwxMCwKKwkmKGx2YWx1ZXNbMzUzOF0pLDB9LAoreyJob21lVGVsZXBob25lTnVtYmVyIiwiaG9tZVRlbGVwaG9uZU51bWJlciIsTklEX2hvbWVUZWxlcGhvbmVOdW1iZXIsCisJMTAsJihsdmFsdWVzWzM1NDhdKSwwfSwKK3sic2VjcmV0YXJ5Iiwic2VjcmV0YXJ5IixOSURfc2VjcmV0YXJ5LDEwLCYobHZhbHVlc1szNTU4XSksMH0sCit7Im90aGVyTWFpbGJveCIsIm90aGVyTWFpbGJveCIsTklEX290aGVyTWFpbGJveCwxMCwmKGx2YWx1ZXNbMzU2OF0pLDB9LAoreyJsYXN0TW9kaWZpZWRUaW1lIiwibGFzdE1vZGlmaWVkVGltZSIsTklEX2xhc3RNb2RpZmllZFRpbWUsMTAsCisJJihsdmFsdWVzWzM1NzhdKSwwfSwKK3sibGFzdE1vZGlmaWVkQnkiLCJsYXN0TW9kaWZpZWRCeSIsTklEX2xhc3RNb2RpZmllZEJ5LDEwLAorCSYobHZhbHVlc1szNTg4XSksMH0sCit7ImFSZWNvcmQiLCJhUmVjb3JkIixOSURfYVJlY29yZCwxMCwmKGx2YWx1ZXNbMzU5OF0pLDB9LAoreyJwaWxvdEF0dHJpYnV0ZVR5cGUyNyIsInBpbG90QXR0cmlidXRlVHlwZTI3IiwKKwlOSURfcGlsb3RBdHRyaWJ1dGVUeXBlMjcsMTAsJihsdmFsdWVzWzM2MDhdKSwwfSwKK3sibVhSZWNvcmQiLCJtWFJlY29yZCIsTklEX21YUmVjb3JkLDEwLCYobHZhbHVlc1szNjE4XSksMH0sCit7Im5TUmVjb3JkIiwiblNSZWNvcmQiLE5JRF9uU1JlY29yZCwxMCwmKGx2YWx1ZXNbMzYyOF0pLDB9LAoreyJzT0FSZWNvcmQiLCJzT0FSZWNvcmQiLE5JRF9zT0FSZWNvcmQsMTAsJihsdmFsdWVzWzM2MzhdKSwwfSwKK3siY05BTUVSZWNvcmQiLCJjTkFNRVJlY29yZCIsTklEX2NOQU1FUmVjb3JkLDEwLCYobHZhbHVlc1szNjQ4XSksMH0sCit7ImFzc29jaWF0ZWREb21haW4iLCJhc3NvY2lhdGVkRG9tYWluIixOSURfYXNzb2NpYXRlZERvbWFpbiwxMCwKKwkmKGx2YWx1ZXNbMzY1OF0pLDB9LAoreyJhc3NvY2lhdGVkTmFtZSIsImFzc29jaWF0ZWROYW1lIixOSURfYXNzb2NpYXRlZE5hbWUsMTAsCisJJihsdmFsdWVzWzM2NjhdKSwwfSwKK3siaG9tZVBvc3RhbEFkZHJlc3MiLCJob21lUG9zdGFsQWRkcmVzcyIsTklEX2hvbWVQb3N0YWxBZGRyZXNzLDEwLAorCSYobHZhbHVlc1szNjc4XSksMH0sCit7InBlcnNvbmFsVGl0bGUiLCJwZXJzb25hbFRpdGxlIixOSURfcGVyc29uYWxUaXRsZSwxMCwmKGx2YWx1ZXNbMzY4OF0pLDB9LAoreyJtb2JpbGVUZWxlcGhvbmVOdW1iZXIiLCJtb2JpbGVUZWxlcGhvbmVOdW1iZXIiLAorCU5JRF9tb2JpbGVUZWxlcGhvbmVOdW1iZXIsMTAsJihsdmFsdWVzWzM2OThdKSwwfSwKK3sicGFnZXJUZWxlcGhvbmVOdW1iZXIiLCJwYWdlclRlbGVwaG9uZU51bWJlciIsCisJTklEX3BhZ2VyVGVsZXBob25lTnVtYmVyLDEwLCYobHZhbHVlc1szNzA4XSksMH0sCit7ImZyaWVuZGx5Q291bnRyeU5hbWUiLCJmcmllbmRseUNvdW50cnlOYW1lIixOSURfZnJpZW5kbHlDb3VudHJ5TmFtZSwKKwkxMCwmKGx2YWx1ZXNbMzcxOF0pLDB9LAoreyJvcmdhbml6YXRpb25hbFN0YXR1cyIsIm9yZ2FuaXphdGlvbmFsU3RhdHVzIiwKKwlOSURfb3JnYW5pemF0aW9uYWxTdGF0dXMsMTAsJihsdmFsdWVzWzM3MjhdKSwwfSwKK3siamFuZXRNYWlsYm94IiwiamFuZXRNYWlsYm94IixOSURfamFuZXRNYWlsYm94LDEwLCYobHZhbHVlc1szNzM4XSksMH0sCit7Im1haWxQcmVmZXJlbmNlT3B0aW9uIiwibWFpbFByZWZlcmVuY2VPcHRpb24iLAorCU5JRF9tYWlsUHJlZmVyZW5jZU9wdGlvbiwxMCwmKGx2YWx1ZXNbMzc0OF0pLDB9LAoreyJidWlsZGluZ05hbWUiLCJidWlsZGluZ05hbWUiLE5JRF9idWlsZGluZ05hbWUsMTAsJihsdmFsdWVzWzM3NThdKSwwfSwKK3siZFNBUXVhbGl0eSIsImRTQVF1YWxpdHkiLE5JRF9kU0FRdWFsaXR5LDEwLCYobHZhbHVlc1szNzY4XSksMH0sCit7InNpbmdsZUxldmVsUXVhbGl0eSIsInNpbmdsZUxldmVsUXVhbGl0eSIsTklEX3NpbmdsZUxldmVsUXVhbGl0eSwxMCwKKwkmKGx2YWx1ZXNbMzc3OF0pLDB9LAoreyJzdWJ0cmVlTWluaW11bVF1YWxpdHkiLCJzdWJ0cmVlTWluaW11bVF1YWxpdHkiLAorCU5JRF9zdWJ0cmVlTWluaW11bVF1YWxpdHksMTAsJihsdmFsdWVzWzM3ODhdKSwwfSwKK3sic3VidHJlZU1heGltdW1RdWFsaXR5Iiwic3VidHJlZU1heGltdW1RdWFsaXR5IiwKKwlOSURfc3VidHJlZU1heGltdW1RdWFsaXR5LDEwLCYobHZhbHVlc1szNzk4XSksMH0sCit7InBlcnNvbmFsU2lnbmF0dXJlIiwicGVyc29uYWxTaWduYXR1cmUiLE5JRF9wZXJzb25hbFNpZ25hdHVyZSwxMCwKKwkmKGx2YWx1ZXNbMzgwOF0pLDB9LAoreyJkSVRSZWRpcmVjdCIsImRJVFJlZGlyZWN0IixOSURfZElUUmVkaXJlY3QsMTAsJihsdmFsdWVzWzM4MThdKSwwfSwKK3siYXVkaW8iLCJhdWRpbyIsTklEX2F1ZGlvLDEwLCYobHZhbHVlc1szODI4XSksMH0sCit7ImRvY3VtZW50UHVibGlzaGVyIiwiZG9jdW1lbnRQdWJsaXNoZXIiLE5JRF9kb2N1bWVudFB1Ymxpc2hlciwxMCwKKwkmKGx2YWx1ZXNbMzgzOF0pLDB9LAoreyJ4NTAwVW5pcXVlSWRlbnRpZmllciIsIng1MDBVbmlxdWVJZGVudGlmaWVyIiwKKwlOSURfeDUwMFVuaXF1ZUlkZW50aWZpZXIsMywmKGx2YWx1ZXNbMzg0OF0pLDB9LAoreyJtaW1lLW1ocyIsIk1JTUUgTUhTIixOSURfbWltZV9taHMsNSwmKGx2YWx1ZXNbMzg1MV0pLDB9LAoreyJtaW1lLW1ocy1oZWFkaW5ncyIsIm1pbWUtbWhzLWhlYWRpbmdzIixOSURfbWltZV9taHNfaGVhZGluZ3MsNiwKKwkmKGx2YWx1ZXNbMzg1Nl0pLDB9LAoreyJtaW1lLW1ocy1ib2RpZXMiLCJtaW1lLW1ocy1ib2RpZXMiLE5JRF9taW1lX21oc19ib2RpZXMsNiwKKwkmKGx2YWx1ZXNbMzg2Ml0pLDB9LAoreyJpZC1oZXgtcGFydGlhbC1tZXNzYWdlIiwiaWQtaGV4LXBhcnRpYWwtbWVzc2FnZSIsCisJTklEX2lkX2hleF9wYXJ0aWFsX21lc3NhZ2UsNywmKGx2YWx1ZXNbMzg2OF0pLDB9LAoreyJpZC1oZXgtbXVsdGlwYXJ0LW1lc3NhZ2UiLCJpZC1oZXgtbXVsdGlwYXJ0LW1lc3NhZ2UiLAorCU5JRF9pZF9oZXhfbXVsdGlwYXJ0X21lc3NhZ2UsNywmKGx2YWx1ZXNbMzg3NV0pLDB9LAoreyJnZW5lcmF0aW9uUXVhbGlmaWVyIiwiZ2VuZXJhdGlvblF1YWxpZmllciIsTklEX2dlbmVyYXRpb25RdWFsaWZpZXIsCisJMywmKGx2YWx1ZXNbMzg4Ml0pLDB9LAoreyJwc2V1ZG9ueW0iLCJwc2V1ZG9ueW0iLE5JRF9wc2V1ZG9ueW0sMywmKGx2YWx1ZXNbMzg4NV0pLDB9LAore05VTEwsTlVMTCxOSURfdW5kZWYsMCxOVUxMLDB9LAoreyJpZC1zZXQiLCJTZWN1cmUgRWxlY3Ryb25pYyBUcmFuc2FjdGlvbnMiLE5JRF9pZF9zZXQsMiwKKwkmKGx2YWx1ZXNbMzg4OF0pLDB9LAoreyJzZXQtY3R5cGUiLCJjb250ZW50IHR5cGVzIixOSURfc2V0X2N0eXBlLDMsJihsdmFsdWVzWzM4OTBdKSwwfSwKK3sic2V0LW1zZ0V4dCIsIm1lc3NhZ2UgZXh0ZW5zaW9ucyIsTklEX3NldF9tc2dFeHQsMywmKGx2YWx1ZXNbMzg5M10pLDB9LAoreyJzZXQtYXR0ciIsInNldC1hdHRyIixOSURfc2V0X2F0dHIsMywmKGx2YWx1ZXNbMzg5Nl0pLDB9LAoreyJzZXQtcG9saWN5Iiwic2V0LXBvbGljeSIsTklEX3NldF9wb2xpY3ksMywmKGx2YWx1ZXNbMzg5OV0pLDB9LAoreyJzZXQtY2VydEV4dCIsImNlcnRpZmljYXRlIGV4dGVuc2lvbnMiLE5JRF9zZXRfY2VydEV4dCwzLAorCSYobHZhbHVlc1szOTAyXSksMH0sCit7InNldC1icmFuZCIsInNldC1icmFuZCIsTklEX3NldF9icmFuZCwzLCYobHZhbHVlc1szOTA1XSksMH0sCit7InNldGN0LVBBTkRhdGEiLCJzZXRjdC1QQU5EYXRhIixOSURfc2V0Y3RfUEFORGF0YSw0LCYobHZhbHVlc1szOTA4XSksMH0sCit7InNldGN0LVBBTlRva2VuIiwic2V0Y3QtUEFOVG9rZW4iLE5JRF9zZXRjdF9QQU5Ub2tlbiw0LAorCSYobHZhbHVlc1szOTEyXSksMH0sCit7InNldGN0LVBBTk9ubHkiLCJzZXRjdC1QQU5Pbmx5IixOSURfc2V0Y3RfUEFOT25seSw0LCYobHZhbHVlc1szOTE2XSksMH0sCit7InNldGN0LU9JRGF0YSIsInNldGN0LU9JRGF0YSIsTklEX3NldGN0X09JRGF0YSw0LCYobHZhbHVlc1szOTIwXSksMH0sCit7InNldGN0LVBJIiwic2V0Y3QtUEkiLE5JRF9zZXRjdF9QSSw0LCYobHZhbHVlc1szOTI0XSksMH0sCit7InNldGN0LVBJRGF0YSIsInNldGN0LVBJRGF0YSIsTklEX3NldGN0X1BJRGF0YSw0LCYobHZhbHVlc1szOTI4XSksMH0sCit7InNldGN0LVBJRGF0YVVuc2lnbmVkIiwic2V0Y3QtUElEYXRhVW5zaWduZWQiLAorCU5JRF9zZXRjdF9QSURhdGFVbnNpZ25lZCw0LCYobHZhbHVlc1szOTMyXSksMH0sCit7InNldGN0LUhPRElucHV0Iiwic2V0Y3QtSE9ESW5wdXQiLE5JRF9zZXRjdF9IT0RJbnB1dCw0LAorCSYobHZhbHVlc1szOTM2XSksMH0sCit7InNldGN0LUF1dGhSZXNCYWdnYWdlIiwic2V0Y3QtQXV0aFJlc0JhZ2dhZ2UiLAorCU5JRF9zZXRjdF9BdXRoUmVzQmFnZ2FnZSw0LCYobHZhbHVlc1szOTQwXSksMH0sCit7InNldGN0LUF1dGhSZXZSZXFCYWdnYWdlIiwic2V0Y3QtQXV0aFJldlJlcUJhZ2dhZ2UiLAorCU5JRF9zZXRjdF9BdXRoUmV2UmVxQmFnZ2FnZSw0LCYobHZhbHVlc1szOTQ0XSksMH0sCit7InNldGN0LUF1dGhSZXZSZXNCYWdnYWdlIiwic2V0Y3QtQXV0aFJldlJlc0JhZ2dhZ2UiLAorCU5JRF9zZXRjdF9BdXRoUmV2UmVzQmFnZ2FnZSw0LCYobHZhbHVlc1szOTQ4XSksMH0sCit7InNldGN0LUNhcFRva2VuU2VxIiwic2V0Y3QtQ2FwVG9rZW5TZXEiLE5JRF9zZXRjdF9DYXBUb2tlblNlcSw0LAorCSYobHZhbHVlc1szOTUyXSksMH0sCit7InNldGN0LVBJbml0UmVzRGF0YSIsInNldGN0LVBJbml0UmVzRGF0YSIsTklEX3NldGN0X1BJbml0UmVzRGF0YSw0LAorCSYobHZhbHVlc1szOTU2XSksMH0sCit7InNldGN0LVBJLVRCUyIsInNldGN0LVBJLVRCUyIsTklEX3NldGN0X1BJX1RCUyw0LCYobHZhbHVlc1szOTYwXSksMH0sCit7InNldGN0LVBSZXNEYXRhIiwic2V0Y3QtUFJlc0RhdGEiLE5JRF9zZXRjdF9QUmVzRGF0YSw0LAorCSYobHZhbHVlc1szOTY0XSksMH0sCit7InNldGN0LUF1dGhSZXFUQlMiLCJzZXRjdC1BdXRoUmVxVEJTIixOSURfc2V0Y3RfQXV0aFJlcVRCUyw0LAorCSYobHZhbHVlc1szOTY4XSksMH0sCit7InNldGN0LUF1dGhSZXNUQlMiLCJzZXRjdC1BdXRoUmVzVEJTIixOSURfc2V0Y3RfQXV0aFJlc1RCUyw0LAorCSYobHZhbHVlc1szOTcyXSksMH0sCit7InNldGN0LUF1dGhSZXNUQlNYIiwic2V0Y3QtQXV0aFJlc1RCU1giLE5JRF9zZXRjdF9BdXRoUmVzVEJTWCw0LAorCSYobHZhbHVlc1szOTc2XSksMH0sCit7InNldGN0LUF1dGhUb2tlblRCUyIsInNldGN0LUF1dGhUb2tlblRCUyIsTklEX3NldGN0X0F1dGhUb2tlblRCUyw0LAorCSYobHZhbHVlc1szOTgwXSksMH0sCit7InNldGN0LUNhcFRva2VuRGF0YSIsInNldGN0LUNhcFRva2VuRGF0YSIsTklEX3NldGN0X0NhcFRva2VuRGF0YSw0LAorCSYobHZhbHVlc1szOTg0XSksMH0sCit7InNldGN0LUNhcFRva2VuVEJTIiwic2V0Y3QtQ2FwVG9rZW5UQlMiLE5JRF9zZXRjdF9DYXBUb2tlblRCUyw0LAorCSYobHZhbHVlc1szOTg4XSksMH0sCit7InNldGN0LUFjcUNhcmRDb2RlTXNnIiwic2V0Y3QtQWNxQ2FyZENvZGVNc2ciLAorCU5JRF9zZXRjdF9BY3FDYXJkQ29kZU1zZyw0LCYobHZhbHVlc1szOTkyXSksMH0sCit7InNldGN0LUF1dGhSZXZSZXFUQlMiLCJzZXRjdC1BdXRoUmV2UmVxVEJTIixOSURfc2V0Y3RfQXV0aFJldlJlcVRCUywKKwk0LCYobHZhbHVlc1szOTk2XSksMH0sCit7InNldGN0LUF1dGhSZXZSZXNEYXRhIiwic2V0Y3QtQXV0aFJldlJlc0RhdGEiLAorCU5JRF9zZXRjdF9BdXRoUmV2UmVzRGF0YSw0LCYobHZhbHVlc1s0MDAwXSksMH0sCit7InNldGN0LUF1dGhSZXZSZXNUQlMiLCJzZXRjdC1BdXRoUmV2UmVzVEJTIixOSURfc2V0Y3RfQXV0aFJldlJlc1RCUywKKwk0LCYobHZhbHVlc1s0MDA0XSksMH0sCit7InNldGN0LUNhcFJlcVRCUyIsInNldGN0LUNhcFJlcVRCUyIsTklEX3NldGN0X0NhcFJlcVRCUyw0LAorCSYobHZhbHVlc1s0MDA4XSksMH0sCit7InNldGN0LUNhcFJlcVRCU1giLCJzZXRjdC1DYXBSZXFUQlNYIixOSURfc2V0Y3RfQ2FwUmVxVEJTWCw0LAorCSYobHZhbHVlc1s0MDEyXSksMH0sCit7InNldGN0LUNhcFJlc0RhdGEiLCJzZXRjdC1DYXBSZXNEYXRhIixOSURfc2V0Y3RfQ2FwUmVzRGF0YSw0LAorCSYobHZhbHVlc1s0MDE2XSksMH0sCit7InNldGN0LUNhcFJldlJlcVRCUyIsInNldGN0LUNhcFJldlJlcVRCUyIsTklEX3NldGN0X0NhcFJldlJlcVRCUyw0LAorCSYobHZhbHVlc1s0MDIwXSksMH0sCit7InNldGN0LUNhcFJldlJlcVRCU1giLCJzZXRjdC1DYXBSZXZSZXFUQlNYIixOSURfc2V0Y3RfQ2FwUmV2UmVxVEJTWCwKKwk0LCYobHZhbHVlc1s0MDI0XSksMH0sCit7InNldGN0LUNhcFJldlJlc0RhdGEiLCJzZXRjdC1DYXBSZXZSZXNEYXRhIixOSURfc2V0Y3RfQ2FwUmV2UmVzRGF0YSwKKwk0LCYobHZhbHVlc1s0MDI4XSksMH0sCit7InNldGN0LUNyZWRSZXFUQlMiLCJzZXRjdC1DcmVkUmVxVEJTIixOSURfc2V0Y3RfQ3JlZFJlcVRCUyw0LAorCSYobHZhbHVlc1s0MDMyXSksMH0sCit7InNldGN0LUNyZWRSZXFUQlNYIiwic2V0Y3QtQ3JlZFJlcVRCU1giLE5JRF9zZXRjdF9DcmVkUmVxVEJTWCw0LAorCSYobHZhbHVlc1s0MDM2XSksMH0sCit7InNldGN0LUNyZWRSZXNEYXRhIiwic2V0Y3QtQ3JlZFJlc0RhdGEiLE5JRF9zZXRjdF9DcmVkUmVzRGF0YSw0LAorCSYobHZhbHVlc1s0MDQwXSksMH0sCit7InNldGN0LUNyZWRSZXZSZXFUQlMiLCJzZXRjdC1DcmVkUmV2UmVxVEJTIixOSURfc2V0Y3RfQ3JlZFJldlJlcVRCUywKKwk0LCYobHZhbHVlc1s0MDQ0XSksMH0sCit7InNldGN0LUNyZWRSZXZSZXFUQlNYIiwic2V0Y3QtQ3JlZFJldlJlcVRCU1giLAorCU5JRF9zZXRjdF9DcmVkUmV2UmVxVEJTWCw0LCYobHZhbHVlc1s0MDQ4XSksMH0sCit7InNldGN0LUNyZWRSZXZSZXNEYXRhIiwic2V0Y3QtQ3JlZFJldlJlc0RhdGEiLAorCU5JRF9zZXRjdF9DcmVkUmV2UmVzRGF0YSw0LCYobHZhbHVlc1s0MDUyXSksMH0sCit7InNldGN0LVBDZXJ0UmVxRGF0YSIsInNldGN0LVBDZXJ0UmVxRGF0YSIsTklEX3NldGN0X1BDZXJ0UmVxRGF0YSw0LAorCSYobHZhbHVlc1s0MDU2XSksMH0sCit7InNldGN0LVBDZXJ0UmVzVEJTIiwic2V0Y3QtUENlcnRSZXNUQlMiLE5JRF9zZXRjdF9QQ2VydFJlc1RCUyw0LAorCSYobHZhbHVlc1s0MDYwXSksMH0sCit7InNldGN0LUJhdGNoQWRtaW5SZXFEYXRhIiwic2V0Y3QtQmF0Y2hBZG1pblJlcURhdGEiLAorCU5JRF9zZXRjdF9CYXRjaEFkbWluUmVxRGF0YSw0LCYobHZhbHVlc1s0MDY0XSksMH0sCit7InNldGN0LUJhdGNoQWRtaW5SZXNEYXRhIiwic2V0Y3QtQmF0Y2hBZG1pblJlc0RhdGEiLAorCU5JRF9zZXRjdF9CYXRjaEFkbWluUmVzRGF0YSw0LCYobHZhbHVlc1s0MDY4XSksMH0sCit7InNldGN0LUNhcmRDSW5pdFJlc1RCUyIsInNldGN0LUNhcmRDSW5pdFJlc1RCUyIsCisJTklEX3NldGN0X0NhcmRDSW5pdFJlc1RCUyw0LCYobHZhbHVlc1s0MDcyXSksMH0sCit7InNldGN0LU1lQXFDSW5pdFJlc1RCUyIsInNldGN0LU1lQXFDSW5pdFJlc1RCUyIsCisJTklEX3NldGN0X01lQXFDSW5pdFJlc1RCUyw0LCYobHZhbHVlc1s0MDc2XSksMH0sCit7InNldGN0LVJlZ0Zvcm1SZXNUQlMiLCJzZXRjdC1SZWdGb3JtUmVzVEJTIixOSURfc2V0Y3RfUmVnRm9ybVJlc1RCUywKKwk0LCYobHZhbHVlc1s0MDgwXSksMH0sCit7InNldGN0LUNlcnRSZXFEYXRhIiwic2V0Y3QtQ2VydFJlcURhdGEiLE5JRF9zZXRjdF9DZXJ0UmVxRGF0YSw0LAorCSYobHZhbHVlc1s0MDg0XSksMH0sCit7InNldGN0LUNlcnRSZXFUQlMiLCJzZXRjdC1DZXJ0UmVxVEJTIixOSURfc2V0Y3RfQ2VydFJlcVRCUyw0LAorCSYobHZhbHVlc1s0MDg4XSksMH0sCit7InNldGN0LUNlcnRSZXNEYXRhIiwic2V0Y3QtQ2VydFJlc0RhdGEiLE5JRF9zZXRjdF9DZXJ0UmVzRGF0YSw0LAorCSYobHZhbHVlc1s0MDkyXSksMH0sCit7InNldGN0LUNlcnRJbnFSZXFUQlMiLCJzZXRjdC1DZXJ0SW5xUmVxVEJTIixOSURfc2V0Y3RfQ2VydElucVJlcVRCUywKKwk0LCYobHZhbHVlc1s0MDk2XSksMH0sCit7InNldGN0LUVycm9yVEJTIiwic2V0Y3QtRXJyb3JUQlMiLE5JRF9zZXRjdF9FcnJvclRCUyw0LAorCSYobHZhbHVlc1s0MTAwXSksMH0sCit7InNldGN0LVBJRHVhbFNpZ25lZFRCRSIsInNldGN0LVBJRHVhbFNpZ25lZFRCRSIsCisJTklEX3NldGN0X1BJRHVhbFNpZ25lZFRCRSw0LCYobHZhbHVlc1s0MTA0XSksMH0sCit7InNldGN0LVBJVW5zaWduZWRUQkUiLCJzZXRjdC1QSVVuc2lnbmVkVEJFIixOSURfc2V0Y3RfUElVbnNpZ25lZFRCRSwKKwk0LCYobHZhbHVlc1s0MTA4XSksMH0sCit7InNldGN0LUF1dGhSZXFUQkUiLCJzZXRjdC1BdXRoUmVxVEJFIixOSURfc2V0Y3RfQXV0aFJlcVRCRSw0LAorCSYobHZhbHVlc1s0MTEyXSksMH0sCit7InNldGN0LUF1dGhSZXNUQkUiLCJzZXRjdC1BdXRoUmVzVEJFIixOSURfc2V0Y3RfQXV0aFJlc1RCRSw0LAorCSYobHZhbHVlc1s0MTE2XSksMH0sCit7InNldGN0LUF1dGhSZXNUQkVYIiwic2V0Y3QtQXV0aFJlc1RCRVgiLE5JRF9zZXRjdF9BdXRoUmVzVEJFWCw0LAorCSYobHZhbHVlc1s0MTIwXSksMH0sCit7InNldGN0LUF1dGhUb2tlblRCRSIsInNldGN0LUF1dGhUb2tlblRCRSIsTklEX3NldGN0X0F1dGhUb2tlblRCRSw0LAorCSYobHZhbHVlc1s0MTI0XSksMH0sCit7InNldGN0LUNhcFRva2VuVEJFIiwic2V0Y3QtQ2FwVG9rZW5UQkUiLE5JRF9zZXRjdF9DYXBUb2tlblRCRSw0LAorCSYobHZhbHVlc1s0MTI4XSksMH0sCit7InNldGN0LUNhcFRva2VuVEJFWCIsInNldGN0LUNhcFRva2VuVEJFWCIsTklEX3NldGN0X0NhcFRva2VuVEJFWCw0LAorCSYobHZhbHVlc1s0MTMyXSksMH0sCit7InNldGN0LUFjcUNhcmRDb2RlTXNnVEJFIiwic2V0Y3QtQWNxQ2FyZENvZGVNc2dUQkUiLAorCU5JRF9zZXRjdF9BY3FDYXJkQ29kZU1zZ1RCRSw0LCYobHZhbHVlc1s0MTM2XSksMH0sCit7InNldGN0LUF1dGhSZXZSZXFUQkUiLCJzZXRjdC1BdXRoUmV2UmVxVEJFIixOSURfc2V0Y3RfQXV0aFJldlJlcVRCRSwKKwk0LCYobHZhbHVlc1s0MTQwXSksMH0sCit7InNldGN0LUF1dGhSZXZSZXNUQkUiLCJzZXRjdC1BdXRoUmV2UmVzVEJFIixOSURfc2V0Y3RfQXV0aFJldlJlc1RCRSwKKwk0LCYobHZhbHVlc1s0MTQ0XSksMH0sCit7InNldGN0LUF1dGhSZXZSZXNUQkVCIiwic2V0Y3QtQXV0aFJldlJlc1RCRUIiLAorCU5JRF9zZXRjdF9BdXRoUmV2UmVzVEJFQiw0LCYobHZhbHVlc1s0MTQ4XSksMH0sCit7InNldGN0LUNhcFJlcVRCRSIsInNldGN0LUNhcFJlcVRCRSIsTklEX3NldGN0X0NhcFJlcVRCRSw0LAorCSYobHZhbHVlc1s0MTUyXSksMH0sCit7InNldGN0LUNhcFJlcVRCRVgiLCJzZXRjdC1DYXBSZXFUQkVYIixOSURfc2V0Y3RfQ2FwUmVxVEJFWCw0LAorCSYobHZhbHVlc1s0MTU2XSksMH0sCit7InNldGN0LUNhcFJlc1RCRSIsInNldGN0LUNhcFJlc1RCRSIsTklEX3NldGN0X0NhcFJlc1RCRSw0LAorCSYobHZhbHVlc1s0MTYwXSksMH0sCit7InNldGN0LUNhcFJldlJlcVRCRSIsInNldGN0LUNhcFJldlJlcVRCRSIsTklEX3NldGN0X0NhcFJldlJlcVRCRSw0LAorCSYobHZhbHVlc1s0MTY0XSksMH0sCit7InNldGN0LUNhcFJldlJlcVRCRVgiLCJzZXRjdC1DYXBSZXZSZXFUQkVYIixOSURfc2V0Y3RfQ2FwUmV2UmVxVEJFWCwKKwk0LCYobHZhbHVlc1s0MTY4XSksMH0sCit7InNldGN0LUNhcFJldlJlc1RCRSIsInNldGN0LUNhcFJldlJlc1RCRSIsTklEX3NldGN0X0NhcFJldlJlc1RCRSw0LAorCSYobHZhbHVlc1s0MTcyXSksMH0sCit7InNldGN0LUNyZWRSZXFUQkUiLCJzZXRjdC1DcmVkUmVxVEJFIixOSURfc2V0Y3RfQ3JlZFJlcVRCRSw0LAorCSYobHZhbHVlc1s0MTc2XSksMH0sCit7InNldGN0LUNyZWRSZXFUQkVYIiwic2V0Y3QtQ3JlZFJlcVRCRVgiLE5JRF9zZXRjdF9DcmVkUmVxVEJFWCw0LAorCSYobHZhbHVlc1s0MTgwXSksMH0sCit7InNldGN0LUNyZWRSZXNUQkUiLCJzZXRjdC1DcmVkUmVzVEJFIixOSURfc2V0Y3RfQ3JlZFJlc1RCRSw0LAorCSYobHZhbHVlc1s0MTg0XSksMH0sCit7InNldGN0LUNyZWRSZXZSZXFUQkUiLCJzZXRjdC1DcmVkUmV2UmVxVEJFIixOSURfc2V0Y3RfQ3JlZFJldlJlcVRCRSwKKwk0LCYobHZhbHVlc1s0MTg4XSksMH0sCit7InNldGN0LUNyZWRSZXZSZXFUQkVYIiwic2V0Y3QtQ3JlZFJldlJlcVRCRVgiLAorCU5JRF9zZXRjdF9DcmVkUmV2UmVxVEJFWCw0LCYobHZhbHVlc1s0MTkyXSksMH0sCit7InNldGN0LUNyZWRSZXZSZXNUQkUiLCJzZXRjdC1DcmVkUmV2UmVzVEJFIixOSURfc2V0Y3RfQ3JlZFJldlJlc1RCRSwKKwk0LCYobHZhbHVlc1s0MTk2XSksMH0sCit7InNldGN0LUJhdGNoQWRtaW5SZXFUQkUiLCJzZXRjdC1CYXRjaEFkbWluUmVxVEJFIiwKKwlOSURfc2V0Y3RfQmF0Y2hBZG1pblJlcVRCRSw0LCYobHZhbHVlc1s0MjAwXSksMH0sCit7InNldGN0LUJhdGNoQWRtaW5SZXNUQkUiLCJzZXRjdC1CYXRjaEFkbWluUmVzVEJFIiwKKwlOSURfc2V0Y3RfQmF0Y2hBZG1pblJlc1RCRSw0LCYobHZhbHVlc1s0MjA0XSksMH0sCit7InNldGN0LVJlZ0Zvcm1SZXFUQkUiLCJzZXRjdC1SZWdGb3JtUmVxVEJFIixOSURfc2V0Y3RfUmVnRm9ybVJlcVRCRSwKKwk0LCYobHZhbHVlc1s0MjA4XSksMH0sCit7InNldGN0LUNlcnRSZXFUQkUiLCJzZXRjdC1DZXJ0UmVxVEJFIixOSURfc2V0Y3RfQ2VydFJlcVRCRSw0LAorCSYobHZhbHVlc1s0MjEyXSksMH0sCit7InNldGN0LUNlcnRSZXFUQkVYIiwic2V0Y3QtQ2VydFJlcVRCRVgiLE5JRF9zZXRjdF9DZXJ0UmVxVEJFWCw0LAorCSYobHZhbHVlc1s0MjE2XSksMH0sCit7InNldGN0LUNlcnRSZXNUQkUiLCJzZXRjdC1DZXJ0UmVzVEJFIixOSURfc2V0Y3RfQ2VydFJlc1RCRSw0LAorCSYobHZhbHVlc1s0MjIwXSksMH0sCit7InNldGN0LUNSTE5vdGlmaWNhdGlvblRCUyIsInNldGN0LUNSTE5vdGlmaWNhdGlvblRCUyIsCisJTklEX3NldGN0X0NSTE5vdGlmaWNhdGlvblRCUyw0LCYobHZhbHVlc1s0MjI0XSksMH0sCit7InNldGN0LUNSTE5vdGlmaWNhdGlvblJlc1RCUyIsInNldGN0LUNSTE5vdGlmaWNhdGlvblJlc1RCUyIsCisJTklEX3NldGN0X0NSTE5vdGlmaWNhdGlvblJlc1RCUyw0LCYobHZhbHVlc1s0MjI4XSksMH0sCit7InNldGN0LUJDSURpc3RyaWJ1dGlvblRCUyIsInNldGN0LUJDSURpc3RyaWJ1dGlvblRCUyIsCisJTklEX3NldGN0X0JDSURpc3RyaWJ1dGlvblRCUyw0LCYobHZhbHVlc1s0MjMyXSksMH0sCit7InNldGV4dC1nZW5DcnlwdCIsImdlbmVyaWMgY3J5cHRvZ3JhbSIsTklEX3NldGV4dF9nZW5DcnlwdCw0LAorCSYobHZhbHVlc1s0MjM2XSksMH0sCit7InNldGV4dC1taUF1dGgiLCJtZXJjaGFudCBpbml0aWF0ZWQgYXV0aCIsTklEX3NldGV4dF9taUF1dGgsNCwKKwkmKGx2YWx1ZXNbNDI0MF0pLDB9LAoreyJzZXRleHQtcGluU2VjdXJlIiwic2V0ZXh0LXBpblNlY3VyZSIsTklEX3NldGV4dF9waW5TZWN1cmUsNCwKKwkmKGx2YWx1ZXNbNDI0NF0pLDB9LAoreyJzZXRleHQtcGluQW55Iiwic2V0ZXh0LXBpbkFueSIsTklEX3NldGV4dF9waW5BbnksNCwmKGx2YWx1ZXNbNDI0OF0pLDB9LAoreyJzZXRleHQtdHJhY2syIiwic2V0ZXh0LXRyYWNrMiIsTklEX3NldGV4dF90cmFjazIsNCwmKGx2YWx1ZXNbNDI1Ml0pLDB9LAoreyJzZXRleHQtY3YiLCJhZGRpdGlvbmFsIHZlcmlmaWNhdGlvbiIsTklEX3NldGV4dF9jdiw0LAorCSYobHZhbHVlc1s0MjU2XSksMH0sCit7InNldC1wb2xpY3ktcm9vdCIsInNldC1wb2xpY3ktcm9vdCIsTklEX3NldF9wb2xpY3lfcm9vdCw0LAorCSYobHZhbHVlc1s0MjYwXSksMH0sCit7InNldENleHQtaGFzaGVkUm9vdCIsInNldENleHQtaGFzaGVkUm9vdCIsTklEX3NldENleHRfaGFzaGVkUm9vdCw0LAorCSYobHZhbHVlc1s0MjY0XSksMH0sCit7InNldENleHQtY2VydFR5cGUiLCJzZXRDZXh0LWNlcnRUeXBlIixOSURfc2V0Q2V4dF9jZXJ0VHlwZSw0LAorCSYobHZhbHVlc1s0MjY4XSksMH0sCit7InNldENleHQtbWVyY2hEYXRhIiwic2V0Q2V4dC1tZXJjaERhdGEiLE5JRF9zZXRDZXh0X21lcmNoRGF0YSw0LAorCSYobHZhbHVlc1s0MjcyXSksMH0sCit7InNldENleHQtY0NlcnRSZXF1aXJlZCIsInNldENleHQtY0NlcnRSZXF1aXJlZCIsCisJTklEX3NldENleHRfY0NlcnRSZXF1aXJlZCw0LCYobHZhbHVlc1s0Mjc2XSksMH0sCit7InNldENleHQtdHVubmVsaW5nIiwic2V0Q2V4dC10dW5uZWxpbmciLE5JRF9zZXRDZXh0X3R1bm5lbGluZyw0LAorCSYobHZhbHVlc1s0MjgwXSksMH0sCit7InNldENleHQtc2V0RXh0Iiwic2V0Q2V4dC1zZXRFeHQiLE5JRF9zZXRDZXh0X3NldEV4dCw0LAorCSYobHZhbHVlc1s0Mjg0XSksMH0sCit7InNldENleHQtc2V0UXVhbGYiLCJzZXRDZXh0LXNldFF1YWxmIixOSURfc2V0Q2V4dF9zZXRRdWFsZiw0LAorCSYobHZhbHVlc1s0Mjg4XSksMH0sCit7InNldENleHQtUEdXWWNhcGFiaWxpdGllcyIsInNldENleHQtUEdXWWNhcGFiaWxpdGllcyIsCisJTklEX3NldENleHRfUEdXWWNhcGFiaWxpdGllcyw0LCYobHZhbHVlc1s0MjkyXSksMH0sCit7InNldENleHQtVG9rZW5JZGVudGlmaWVyIiwic2V0Q2V4dC1Ub2tlbklkZW50aWZpZXIiLAorCU5JRF9zZXRDZXh0X1Rva2VuSWRlbnRpZmllciw0LCYobHZhbHVlc1s0Mjk2XSksMH0sCit7InNldENleHQtVHJhY2syRGF0YSIsInNldENleHQtVHJhY2syRGF0YSIsTklEX3NldENleHRfVHJhY2syRGF0YSw0LAorCSYobHZhbHVlc1s0MzAwXSksMH0sCit7InNldENleHQtVG9rZW5UeXBlIiwic2V0Q2V4dC1Ub2tlblR5cGUiLE5JRF9zZXRDZXh0X1Rva2VuVHlwZSw0LAorCSYobHZhbHVlc1s0MzA0XSksMH0sCit7InNldENleHQtSXNzdWVyQ2FwYWJpbGl0aWVzIiwic2V0Q2V4dC1Jc3N1ZXJDYXBhYmlsaXRpZXMiLAorCU5JRF9zZXRDZXh0X0lzc3VlckNhcGFiaWxpdGllcyw0LCYobHZhbHVlc1s0MzA4XSksMH0sCit7InNldEF0dHItQ2VydCIsInNldEF0dHItQ2VydCIsTklEX3NldEF0dHJfQ2VydCw0LCYobHZhbHVlc1s0MzEyXSksMH0sCit7InNldEF0dHItUEdXWWNhcCIsInBheW1lbnQgZ2F0ZXdheSBjYXBhYmlsaXRpZXMiLE5JRF9zZXRBdHRyX1BHV1ljYXAsCisJNCwmKGx2YWx1ZXNbNDMxNl0pLDB9LAoreyJzZXRBdHRyLVRva2VuVHlwZSIsInNldEF0dHItVG9rZW5UeXBlIixOSURfc2V0QXR0cl9Ub2tlblR5cGUsNCwKKwkmKGx2YWx1ZXNbNDMyMF0pLDB9LAoreyJzZXRBdHRyLUlzc0NhcCIsImlzc3VlciBjYXBhYmlsaXRpZXMiLE5JRF9zZXRBdHRyX0lzc0NhcCw0LAorCSYobHZhbHVlc1s0MzI0XSksMH0sCit7InNldC1yb290S2V5VGh1bWIiLCJzZXQtcm9vdEtleVRodW1iIixOSURfc2V0X3Jvb3RLZXlUaHVtYiw1LAorCSYobHZhbHVlc1s0MzI4XSksMH0sCit7InNldC1hZGRQb2xpY3kiLCJzZXQtYWRkUG9saWN5IixOSURfc2V0X2FkZFBvbGljeSw1LCYobHZhbHVlc1s0MzMzXSksMH0sCit7InNldEF0dHItVG9rZW4tRU1WIiwic2V0QXR0ci1Ub2tlbi1FTVYiLE5JRF9zZXRBdHRyX1Rva2VuX0VNViw1LAorCSYobHZhbHVlc1s0MzM4XSksMH0sCit7InNldEF0dHItVG9rZW4tQjBQcmltZSIsInNldEF0dHItVG9rZW4tQjBQcmltZSIsCisJTklEX3NldEF0dHJfVG9rZW5fQjBQcmltZSw1LCYobHZhbHVlc1s0MzQzXSksMH0sCit7InNldEF0dHItSXNzQ2FwLUNWTSIsInNldEF0dHItSXNzQ2FwLUNWTSIsTklEX3NldEF0dHJfSXNzQ2FwX0NWTSw1LAorCSYobHZhbHVlc1s0MzQ4XSksMH0sCit7InNldEF0dHItSXNzQ2FwLVQyIiwic2V0QXR0ci1Jc3NDYXAtVDIiLE5JRF9zZXRBdHRyX0lzc0NhcF9UMiw1LAorCSYobHZhbHVlc1s0MzUzXSksMH0sCit7InNldEF0dHItSXNzQ2FwLVNpZyIsInNldEF0dHItSXNzQ2FwLVNpZyIsTklEX3NldEF0dHJfSXNzQ2FwX1NpZyw1LAorCSYobHZhbHVlc1s0MzU4XSksMH0sCit7InNldEF0dHItR2VuQ3J5cHRncm0iLCJnZW5lcmF0ZSBjcnlwdG9ncmFtIixOSURfc2V0QXR0cl9HZW5DcnlwdGdybSwKKwk2LCYobHZhbHVlc1s0MzYzXSksMH0sCit7InNldEF0dHItVDJFbmMiLCJlbmNyeXB0ZWQgdHJhY2sgMiIsTklEX3NldEF0dHJfVDJFbmMsNiwKKwkmKGx2YWx1ZXNbNDM2OV0pLDB9LAoreyJzZXRBdHRyLVQyY2xlYXJ0eHQiLCJjbGVhcnRleHQgdHJhY2sgMiIsTklEX3NldEF0dHJfVDJjbGVhcnR4dCw2LAorCSYobHZhbHVlc1s0Mzc1XSksMH0sCit7InNldEF0dHItVG9rSUNDc2lnIiwiSUNDIG9yIHRva2VuIHNpZ25hdHVyZSIsTklEX3NldEF0dHJfVG9rSUNDc2lnLDYsCisJJihsdmFsdWVzWzQzODFdKSwwfSwKK3sic2V0QXR0ci1TZWNEZXZTaWciLCJzZWN1cmUgZGV2aWNlIHNpZ25hdHVyZSIsTklEX3NldEF0dHJfU2VjRGV2U2lnLAorCTYsJihsdmFsdWVzWzQzODddKSwwfSwKK3sic2V0LWJyYW5kLUlBVEEtQVRBIiwic2V0LWJyYW5kLUlBVEEtQVRBIixOSURfc2V0X2JyYW5kX0lBVEFfQVRBLDQsCisJJihsdmFsdWVzWzQzOTNdKSwwfSwKK3sic2V0LWJyYW5kLURpbmVycyIsInNldC1icmFuZC1EaW5lcnMiLE5JRF9zZXRfYnJhbmRfRGluZXJzLDQsCisJJihsdmFsdWVzWzQzOTddKSwwfSwKK3sic2V0LWJyYW5kLUFtZXJpY2FuRXhwcmVzcyIsInNldC1icmFuZC1BbWVyaWNhbkV4cHJlc3MiLAorCU5JRF9zZXRfYnJhbmRfQW1lcmljYW5FeHByZXNzLDQsJihsdmFsdWVzWzQ0MDFdKSwwfSwKK3sic2V0LWJyYW5kLUpDQiIsInNldC1icmFuZC1KQ0IiLE5JRF9zZXRfYnJhbmRfSkNCLDQsJihsdmFsdWVzWzQ0MDVdKSwwfSwKK3sic2V0LWJyYW5kLVZpc2EiLCJzZXQtYnJhbmQtVmlzYSIsTklEX3NldF9icmFuZF9WaXNhLDQsCisJJihsdmFsdWVzWzQ0MDldKSwwfSwKK3sic2V0LWJyYW5kLU1hc3RlckNhcmQiLCJzZXQtYnJhbmQtTWFzdGVyQ2FyZCIsCisJTklEX3NldF9icmFuZF9NYXN0ZXJDYXJkLDQsJihsdmFsdWVzWzQ0MTNdKSwwfSwKK3sic2V0LWJyYW5kLU5vdnVzIiwic2V0LWJyYW5kLU5vdnVzIixOSURfc2V0X2JyYW5kX05vdnVzLDUsCisJJihsdmFsdWVzWzQ0MTddKSwwfSwKK3siREVTLUNETUYiLCJkZXMtY2RtZiIsTklEX2Rlc19jZG1mLDgsJihsdmFsdWVzWzQ0MjJdKSwwfSwKK3sicnNhT0FFUEVuY3J5cHRpb25TRVQiLCJyc2FPQUVQRW5jcnlwdGlvblNFVCIsCisJTklEX3JzYU9BRVBFbmNyeXB0aW9uU0VULDksJihsdmFsdWVzWzQ0MzBdKSwwfSwKK3siSVRVLVQiLCJpdHUtdCIsTklEX2l0dV90LDEsJihsdmFsdWVzWzQ0MzldKSwwfSwKK3siSk9JTlQtSVNPLUlUVS1UIiwiam9pbnQtaXNvLWl0dS10IixOSURfam9pbnRfaXNvX2l0dV90LDEsCisJJihsdmFsdWVzWzQ0NDBdKSwwfSwKK3siaW50ZXJuYXRpb25hbC1vcmdhbml6YXRpb25zIiwiSW50ZXJuYXRpb25hbCBPcmdhbml6YXRpb25zIiwKKwlOSURfaW50ZXJuYXRpb25hbF9vcmdhbml6YXRpb25zLDEsJihsdmFsdWVzWzQ0NDFdKSwwfSwKK3sibXNTbWFydGNhcmRMb2dpbiIsIk1pY3Jvc29mdCBTbWFydGNhcmRsb2dpbiIsTklEX21zX3NtYXJ0Y2FyZF9sb2dpbiwKKwkxMCwmKGx2YWx1ZXNbNDQ0Ml0pLDB9LAoreyJtc1VQTiIsIk1pY3Jvc29mdCBVbml2ZXJzYWwgUHJpbmNpcGFsIE5hbWUiLE5JRF9tc191cG4sMTAsCisJJihsdmFsdWVzWzQ0NTJdKSwwfSwKK3siQUVTLTEyOC1DRkIxIiwiYWVzLTEyOC1jZmIxIixOSURfYWVzXzEyOF9jZmIxLDAsTlVMTCwwfSwKK3siQUVTLTE5Mi1DRkIxIiwiYWVzLTE5Mi1jZmIxIixOSURfYWVzXzE5Ml9jZmIxLDAsTlVMTCwwfSwKK3siQUVTLTI1Ni1DRkIxIiwiYWVzLTI1Ni1jZmIxIixOSURfYWVzXzI1Nl9jZmIxLDAsTlVMTCwwfSwKK3siQUVTLTEyOC1DRkI4IiwiYWVzLTEyOC1jZmI4IixOSURfYWVzXzEyOF9jZmI4LDAsTlVMTCwwfSwKK3siQUVTLTE5Mi1DRkI4IiwiYWVzLTE5Mi1jZmI4IixOSURfYWVzXzE5Ml9jZmI4LDAsTlVMTCwwfSwKK3siQUVTLTI1Ni1DRkI4IiwiYWVzLTI1Ni1jZmI4IixOSURfYWVzXzI1Nl9jZmI4LDAsTlVMTCwwfSwKK3siREVTLUNGQjEiLCJkZXMtY2ZiMSIsTklEX2Rlc19jZmIxLDAsTlVMTCwwfSwKK3siREVTLUNGQjgiLCJkZXMtY2ZiOCIsTklEX2Rlc19jZmI4LDAsTlVMTCwwfSwKK3siREVTLUVERTMtQ0ZCMSIsImRlcy1lZGUzLWNmYjEiLE5JRF9kZXNfZWRlM19jZmIxLDAsTlVMTCwwfSwKK3siREVTLUVERTMtQ0ZCOCIsImRlcy1lZGUzLWNmYjgiLE5JRF9kZXNfZWRlM19jZmI4LDAsTlVMTCwwfSwKK3sic3RyZWV0Iiwic3RyZWV0QWRkcmVzcyIsTklEX3N0cmVldEFkZHJlc3MsMywmKGx2YWx1ZXNbNDQ2Ml0pLDB9LAoreyJwb3N0YWxDb2RlIiwicG9zdGFsQ29kZSIsTklEX3Bvc3RhbENvZGUsMywmKGx2YWx1ZXNbNDQ2NV0pLDB9LAoreyJpZC1wcGwiLCJpZC1wcGwiLE5JRF9pZF9wcGwsNywmKGx2YWx1ZXNbNDQ2OF0pLDB9LAoreyJwcm94eUNlcnRJbmZvIiwiUHJveHkgQ2VydGlmaWNhdGUgSW5mb3JtYXRpb24iLE5JRF9wcm94eUNlcnRJbmZvLDgsCisJJihsdmFsdWVzWzQ0NzVdKSwwfSwKK3siaWQtcHBsLWFueUxhbmd1YWdlIiwiQW55IGxhbmd1YWdlIixOSURfaWRfcHBsX2FueUxhbmd1YWdlLDgsCisJJihsdmFsdWVzWzQ0ODNdKSwwfSwKK3siaWQtcHBsLWluaGVyaXRBbGwiLCJJbmhlcml0IGFsbCIsTklEX2lkX3BwbF9pbmhlcml0QWxsLDgsCisJJihsdmFsdWVzWzQ0OTFdKSwwfSwKK3sibmFtZUNvbnN0cmFpbnRzIiwiWDUwOXYzIE5hbWUgQ29uc3RyYWludHMiLE5JRF9uYW1lX2NvbnN0cmFpbnRzLDMsCisJJihsdmFsdWVzWzQ0OTldKSwwfSwKK3siaWQtcHBsLWluZGVwZW5kZW50IiwiSW5kZXBlbmRlbnQiLE5JRF9JbmRlcGVuZGVudCw4LCYobHZhbHVlc1s0NTAyXSksMH0sCit7IlJTQS1TSEEyNTYiLCJzaGEyNTZXaXRoUlNBRW5jcnlwdGlvbiIsTklEX3NoYTI1NldpdGhSU0FFbmNyeXB0aW9uLDksCisJJihsdmFsdWVzWzQ1MTBdKSwwfSwKK3siUlNBLVNIQTM4NCIsInNoYTM4NFdpdGhSU0FFbmNyeXB0aW9uIixOSURfc2hhMzg0V2l0aFJTQUVuY3J5cHRpb24sOSwKKwkmKGx2YWx1ZXNbNDUxOV0pLDB9LAoreyJSU0EtU0hBNTEyIiwic2hhNTEyV2l0aFJTQUVuY3J5cHRpb24iLE5JRF9zaGE1MTJXaXRoUlNBRW5jcnlwdGlvbiw5LAorCSYobHZhbHVlc1s0NTI4XSksMH0sCit7IlJTQS1TSEEyMjQiLCJzaGEyMjRXaXRoUlNBRW5jcnlwdGlvbiIsTklEX3NoYTIyNFdpdGhSU0FFbmNyeXB0aW9uLDksCisJJihsdmFsdWVzWzQ1MzddKSwwfSwKK3siU0hBMjU2Iiwic2hhMjU2IixOSURfc2hhMjU2LDksJihsdmFsdWVzWzQ1NDZdKSwwfSwKK3siU0hBMzg0Iiwic2hhMzg0IixOSURfc2hhMzg0LDksJihsdmFsdWVzWzQ1NTVdKSwwfSwKK3siU0hBNTEyIiwic2hhNTEyIixOSURfc2hhNTEyLDksJihsdmFsdWVzWzQ1NjRdKSwwfSwKK3siU0hBMjI0Iiwic2hhMjI0IixOSURfc2hhMjI0LDksJihsdmFsdWVzWzQ1NzNdKSwwfSwKK3siaWRlbnRpZmllZC1vcmdhbml6YXRpb24iLCJpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiIsCisJTklEX2lkZW50aWZpZWRfb3JnYW5pemF0aW9uLDEsJihsdmFsdWVzWzQ1ODJdKSwwfSwKK3siY2VydGljb20tYXJjIiwiY2VydGljb20tYXJjIixOSURfY2VydGljb21fYXJjLDMsJihsdmFsdWVzWzQ1ODNdKSwwfSwKK3sid2FwIiwid2FwIixOSURfd2FwLDIsJihsdmFsdWVzWzQ1ODZdKSwwfSwKK3sid2FwLXdzZyIsIndhcC13c2ciLE5JRF93YXBfd3NnLDMsJihsdmFsdWVzWzQ1ODhdKSwwfSwKK3siaWQtY2hhcmFjdGVyaXN0aWMtdHdvLWJhc2lzIiwiaWQtY2hhcmFjdGVyaXN0aWMtdHdvLWJhc2lzIiwKKwlOSURfWDlfNjJfaWRfY2hhcmFjdGVyaXN0aWNfdHdvX2Jhc2lzLDgsJihsdmFsdWVzWzQ1OTFdKSwwfSwKK3sib25CYXNpcyIsIm9uQmFzaXMiLE5JRF9YOV82Ml9vbkJhc2lzLDksJihsdmFsdWVzWzQ1OTldKSwwfSwKK3sidHBCYXNpcyIsInRwQmFzaXMiLE5JRF9YOV82Ml90cEJhc2lzLDksJihsdmFsdWVzWzQ2MDhdKSwwfSwKK3sicHBCYXNpcyIsInBwQmFzaXMiLE5JRF9YOV82Ml9wcEJhc2lzLDksJihsdmFsdWVzWzQ2MTddKSwwfSwKK3siYzJwbmIxNjN2MSIsImMycG5iMTYzdjEiLE5JRF9YOV82Ml9jMnBuYjE2M3YxLDgsJihsdmFsdWVzWzQ2MjZdKSwwfSwKK3siYzJwbmIxNjN2MiIsImMycG5iMTYzdjIiLE5JRF9YOV82Ml9jMnBuYjE2M3YyLDgsJihsdmFsdWVzWzQ2MzRdKSwwfSwKK3siYzJwbmIxNjN2MyIsImMycG5iMTYzdjMiLE5JRF9YOV82Ml9jMnBuYjE2M3YzLDgsJihsdmFsdWVzWzQ2NDJdKSwwfSwKK3siYzJwbmIxNzZ2MSIsImMycG5iMTc2djEiLE5JRF9YOV82Ml9jMnBuYjE3NnYxLDgsJihsdmFsdWVzWzQ2NTBdKSwwfSwKK3siYzJ0bmIxOTF2MSIsImMydG5iMTkxdjEiLE5JRF9YOV82Ml9jMnRuYjE5MXYxLDgsJihsdmFsdWVzWzQ2NThdKSwwfSwKK3siYzJ0bmIxOTF2MiIsImMydG5iMTkxdjIiLE5JRF9YOV82Ml9jMnRuYjE5MXYyLDgsJihsdmFsdWVzWzQ2NjZdKSwwfSwKK3siYzJ0bmIxOTF2MyIsImMydG5iMTkxdjMiLE5JRF9YOV82Ml9jMnRuYjE5MXYzLDgsJihsdmFsdWVzWzQ2NzRdKSwwfSwKK3siYzJvbmIxOTF2NCIsImMyb25iMTkxdjQiLE5JRF9YOV82Ml9jMm9uYjE5MXY0LDgsJihsdmFsdWVzWzQ2ODJdKSwwfSwKK3siYzJvbmIxOTF2NSIsImMyb25iMTkxdjUiLE5JRF9YOV82Ml9jMm9uYjE5MXY1LDgsJihsdmFsdWVzWzQ2OTBdKSwwfSwKK3siYzJwbmIyMDh3MSIsImMycG5iMjA4dzEiLE5JRF9YOV82Ml9jMnBuYjIwOHcxLDgsJihsdmFsdWVzWzQ2OThdKSwwfSwKK3siYzJ0bmIyMzl2MSIsImMydG5iMjM5djEiLE5JRF9YOV82Ml9jMnRuYjIzOXYxLDgsJihsdmFsdWVzWzQ3MDZdKSwwfSwKK3siYzJ0bmIyMzl2MiIsImMydG5iMjM5djIiLE5JRF9YOV82Ml9jMnRuYjIzOXYyLDgsJihsdmFsdWVzWzQ3MTRdKSwwfSwKK3siYzJ0bmIyMzl2MyIsImMydG5iMjM5djMiLE5JRF9YOV82Ml9jMnRuYjIzOXYzLDgsJihsdmFsdWVzWzQ3MjJdKSwwfSwKK3siYzJvbmIyMzl2NCIsImMyb25iMjM5djQiLE5JRF9YOV82Ml9jMm9uYjIzOXY0LDgsJihsdmFsdWVzWzQ3MzBdKSwwfSwKK3siYzJvbmIyMzl2NSIsImMyb25iMjM5djUiLE5JRF9YOV82Ml9jMm9uYjIzOXY1LDgsJihsdmFsdWVzWzQ3MzhdKSwwfSwKK3siYzJwbmIyNzJ3MSIsImMycG5iMjcydzEiLE5JRF9YOV82Ml9jMnBuYjI3MncxLDgsJihsdmFsdWVzWzQ3NDZdKSwwfSwKK3siYzJwbmIzMDR3MSIsImMycG5iMzA0dzEiLE5JRF9YOV82Ml9jMnBuYjMwNHcxLDgsJihsdmFsdWVzWzQ3NTRdKSwwfSwKK3siYzJ0bmIzNTl2MSIsImMydG5iMzU5djEiLE5JRF9YOV82Ml9jMnRuYjM1OXYxLDgsJihsdmFsdWVzWzQ3NjJdKSwwfSwKK3siYzJwbmIzNjh3MSIsImMycG5iMzY4dzEiLE5JRF9YOV82Ml9jMnBuYjM2OHcxLDgsJihsdmFsdWVzWzQ3NzBdKSwwfSwKK3siYzJ0bmI0MzFyMSIsImMydG5iNDMxcjEiLE5JRF9YOV82Ml9jMnRuYjQzMXIxLDgsJihsdmFsdWVzWzQ3NzhdKSwwfSwKK3sic2VjcDExMnIxIiwic2VjcDExMnIxIixOSURfc2VjcDExMnIxLDUsJihsdmFsdWVzWzQ3ODZdKSwwfSwKK3sic2VjcDExMnIyIiwic2VjcDExMnIyIixOSURfc2VjcDExMnIyLDUsJihsdmFsdWVzWzQ3OTFdKSwwfSwKK3sic2VjcDEyOHIxIiwic2VjcDEyOHIxIixOSURfc2VjcDEyOHIxLDUsJihsdmFsdWVzWzQ3OTZdKSwwfSwKK3sic2VjcDEyOHIyIiwic2VjcDEyOHIyIixOSURfc2VjcDEyOHIyLDUsJihsdmFsdWVzWzQ4MDFdKSwwfSwKK3sic2VjcDE2MGsxIiwic2VjcDE2MGsxIixOSURfc2VjcDE2MGsxLDUsJihsdmFsdWVzWzQ4MDZdKSwwfSwKK3sic2VjcDE2MHIxIiwic2VjcDE2MHIxIixOSURfc2VjcDE2MHIxLDUsJihsdmFsdWVzWzQ4MTFdKSwwfSwKK3sic2VjcDE2MHIyIiwic2VjcDE2MHIyIixOSURfc2VjcDE2MHIyLDUsJihsdmFsdWVzWzQ4MTZdKSwwfSwKK3sic2VjcDE5MmsxIiwic2VjcDE5MmsxIixOSURfc2VjcDE5MmsxLDUsJihsdmFsdWVzWzQ4MjFdKSwwfSwKK3sic2VjcDIyNGsxIiwic2VjcDIyNGsxIixOSURfc2VjcDIyNGsxLDUsJihsdmFsdWVzWzQ4MjZdKSwwfSwKK3sic2VjcDIyNHIxIiwic2VjcDIyNHIxIixOSURfc2VjcDIyNHIxLDUsJihsdmFsdWVzWzQ4MzFdKSwwfSwKK3sic2VjcDI1NmsxIiwic2VjcDI1NmsxIixOSURfc2VjcDI1NmsxLDUsJihsdmFsdWVzWzQ4MzZdKSwwfSwKK3sic2VjcDM4NHIxIiwic2VjcDM4NHIxIixOSURfc2VjcDM4NHIxLDUsJihsdmFsdWVzWzQ4NDFdKSwwfSwKK3sic2VjcDUyMXIxIiwic2VjcDUyMXIxIixOSURfc2VjcDUyMXIxLDUsJihsdmFsdWVzWzQ4NDZdKSwwfSwKK3sic2VjdDExM3IxIiwic2VjdDExM3IxIixOSURfc2VjdDExM3IxLDUsJihsdmFsdWVzWzQ4NTFdKSwwfSwKK3sic2VjdDExM3IyIiwic2VjdDExM3IyIixOSURfc2VjdDExM3IyLDUsJihsdmFsdWVzWzQ4NTZdKSwwfSwKK3sic2VjdDEzMXIxIiwic2VjdDEzMXIxIixOSURfc2VjdDEzMXIxLDUsJihsdmFsdWVzWzQ4NjFdKSwwfSwKK3sic2VjdDEzMXIyIiwic2VjdDEzMXIyIixOSURfc2VjdDEzMXIyLDUsJihsdmFsdWVzWzQ4NjZdKSwwfSwKK3sic2VjdDE2M2sxIiwic2VjdDE2M2sxIixOSURfc2VjdDE2M2sxLDUsJihsdmFsdWVzWzQ4NzFdKSwwfSwKK3sic2VjdDE2M3IxIiwic2VjdDE2M3IxIixOSURfc2VjdDE2M3IxLDUsJihsdmFsdWVzWzQ4NzZdKSwwfSwKK3sic2VjdDE2M3IyIiwic2VjdDE2M3IyIixOSURfc2VjdDE2M3IyLDUsJihsdmFsdWVzWzQ4ODFdKSwwfSwKK3sic2VjdDE5M3IxIiwic2VjdDE5M3IxIixOSURfc2VjdDE5M3IxLDUsJihsdmFsdWVzWzQ4ODZdKSwwfSwKK3sic2VjdDE5M3IyIiwic2VjdDE5M3IyIixOSURfc2VjdDE5M3IyLDUsJihsdmFsdWVzWzQ4OTFdKSwwfSwKK3sic2VjdDIzM2sxIiwic2VjdDIzM2sxIixOSURfc2VjdDIzM2sxLDUsJihsdmFsdWVzWzQ4OTZdKSwwfSwKK3sic2VjdDIzM3IxIiwic2VjdDIzM3IxIixOSURfc2VjdDIzM3IxLDUsJihsdmFsdWVzWzQ5MDFdKSwwfSwKK3sic2VjdDIzOWsxIiwic2VjdDIzOWsxIixOSURfc2VjdDIzOWsxLDUsJihsdmFsdWVzWzQ5MDZdKSwwfSwKK3sic2VjdDI4M2sxIiwic2VjdDI4M2sxIixOSURfc2VjdDI4M2sxLDUsJihsdmFsdWVzWzQ5MTFdKSwwfSwKK3sic2VjdDI4M3IxIiwic2VjdDI4M3IxIixOSURfc2VjdDI4M3IxLDUsJihsdmFsdWVzWzQ5MTZdKSwwfSwKK3sic2VjdDQwOWsxIiwic2VjdDQwOWsxIixOSURfc2VjdDQwOWsxLDUsJihsdmFsdWVzWzQ5MjFdKSwwfSwKK3sic2VjdDQwOXIxIiwic2VjdDQwOXIxIixOSURfc2VjdDQwOXIxLDUsJihsdmFsdWVzWzQ5MjZdKSwwfSwKK3sic2VjdDU3MWsxIiwic2VjdDU3MWsxIixOSURfc2VjdDU3MWsxLDUsJihsdmFsdWVzWzQ5MzFdKSwwfSwKK3sic2VjdDU3MXIxIiwic2VjdDU3MXIxIixOSURfc2VjdDU3MXIxLDUsJihsdmFsdWVzWzQ5MzZdKSwwfSwKK3sid2FwLXdzZy1pZG0tZWNpZC13dGxzMSIsIndhcC13c2ctaWRtLWVjaWQtd3RsczEiLAorCU5JRF93YXBfd3NnX2lkbV9lY2lkX3d0bHMxLDUsJihsdmFsdWVzWzQ5NDFdKSwwfSwKK3sid2FwLXdzZy1pZG0tZWNpZC13dGxzMyIsIndhcC13c2ctaWRtLWVjaWQtd3RsczMiLAorCU5JRF93YXBfd3NnX2lkbV9lY2lkX3d0bHMzLDUsJihsdmFsdWVzWzQ5NDZdKSwwfSwKK3sid2FwLXdzZy1pZG0tZWNpZC13dGxzNCIsIndhcC13c2ctaWRtLWVjaWQtd3RsczQiLAorCU5JRF93YXBfd3NnX2lkbV9lY2lkX3d0bHM0LDUsJihsdmFsdWVzWzQ5NTFdKSwwfSwKK3sid2FwLXdzZy1pZG0tZWNpZC13dGxzNSIsIndhcC13c2ctaWRtLWVjaWQtd3RsczUiLAorCU5JRF93YXBfd3NnX2lkbV9lY2lkX3d0bHM1LDUsJihsdmFsdWVzWzQ5NTZdKSwwfSwKK3sid2FwLXdzZy1pZG0tZWNpZC13dGxzNiIsIndhcC13c2ctaWRtLWVjaWQtd3RsczYiLAorCU5JRF93YXBfd3NnX2lkbV9lY2lkX3d0bHM2LDUsJihsdmFsdWVzWzQ5NjFdKSwwfSwKK3sid2FwLXdzZy1pZG0tZWNpZC13dGxzNyIsIndhcC13c2ctaWRtLWVjaWQtd3RsczciLAorCU5JRF93YXBfd3NnX2lkbV9lY2lkX3d0bHM3LDUsJihsdmFsdWVzWzQ5NjZdKSwwfSwKK3sid2FwLXdzZy1pZG0tZWNpZC13dGxzOCIsIndhcC13c2ctaWRtLWVjaWQtd3RsczgiLAorCU5JRF93YXBfd3NnX2lkbV9lY2lkX3d0bHM4LDUsJihsdmFsdWVzWzQ5NzFdKSwwfSwKK3sid2FwLXdzZy1pZG0tZWNpZC13dGxzOSIsIndhcC13c2ctaWRtLWVjaWQtd3RsczkiLAorCU5JRF93YXBfd3NnX2lkbV9lY2lkX3d0bHM5LDUsJihsdmFsdWVzWzQ5NzZdKSwwfSwKK3sid2FwLXdzZy1pZG0tZWNpZC13dGxzMTAiLCJ3YXAtd3NnLWlkbS1lY2lkLXd0bHMxMCIsCisJTklEX3dhcF93c2dfaWRtX2VjaWRfd3RsczEwLDUsJihsdmFsdWVzWzQ5ODFdKSwwfSwKK3sid2FwLXdzZy1pZG0tZWNpZC13dGxzMTEiLCJ3YXAtd3NnLWlkbS1lY2lkLXd0bHMxMSIsCisJTklEX3dhcF93c2dfaWRtX2VjaWRfd3RsczExLDUsJihsdmFsdWVzWzQ5ODZdKSwwfSwKK3sid2FwLXdzZy1pZG0tZWNpZC13dGxzMTIiLCJ3YXAtd3NnLWlkbS1lY2lkLXd0bHMxMiIsCisJTklEX3dhcF93c2dfaWRtX2VjaWRfd3RsczEyLDUsJihsdmFsdWVzWzQ5OTFdKSwwfSwKK3siYW55UG9saWN5IiwiWDUwOXYzIEFueSBQb2xpY3kiLE5JRF9hbnlfcG9saWN5LDQsJihsdmFsdWVzWzQ5OTZdKSwwfSwKK3sicG9saWN5TWFwcGluZ3MiLCJYNTA5djMgUG9saWN5IE1hcHBpbmdzIixOSURfcG9saWN5X21hcHBpbmdzLDMsCisJJihsdmFsdWVzWzUwMDBdKSwwfSwKK3siaW5oaWJpdEFueVBvbGljeSIsIlg1MDl2MyBJbmhpYml0IEFueSBQb2xpY3kiLAorCU5JRF9pbmhpYml0X2FueV9wb2xpY3ksMywmKGx2YWx1ZXNbNTAwM10pLDB9LAoreyJPYWtsZXktRUMyTi0zIiwiaXBzZWMzIixOSURfaXBzZWMzLDAsTlVMTCwwfSwKK3siT2FrbGV5LUVDMk4tNCIsImlwc2VjNCIsTklEX2lwc2VjNCwwLE5VTEwsMH0sCit7IkNBTUVMTElBLTEyOC1DQkMiLCJjYW1lbGxpYS0xMjgtY2JjIixOSURfY2FtZWxsaWFfMTI4X2NiYywxMSwKKwkmKGx2YWx1ZXNbNTAwNl0pLDB9LAoreyJDQU1FTExJQS0xOTItQ0JDIiwiY2FtZWxsaWEtMTkyLWNiYyIsTklEX2NhbWVsbGlhXzE5Ml9jYmMsMTEsCisJJihsdmFsdWVzWzUwMTddKSwwfSwKK3siQ0FNRUxMSUEtMjU2LUNCQyIsImNhbWVsbGlhLTI1Ni1jYmMiLE5JRF9jYW1lbGxpYV8yNTZfY2JjLDExLAorCSYobHZhbHVlc1s1MDI4XSksMH0sCit7IkNBTUVMTElBLTEyOC1FQ0IiLCJjYW1lbGxpYS0xMjgtZWNiIixOSURfY2FtZWxsaWFfMTI4X2VjYiw4LAorCSYobHZhbHVlc1s1MDM5XSksMH0sCit7IkNBTUVMTElBLTE5Mi1FQ0IiLCJjYW1lbGxpYS0xOTItZWNiIixOSURfY2FtZWxsaWFfMTkyX2VjYiw4LAorCSYobHZhbHVlc1s1MDQ3XSksMH0sCit7IkNBTUVMTElBLTI1Ni1FQ0IiLCJjYW1lbGxpYS0yNTYtZWNiIixOSURfY2FtZWxsaWFfMjU2X2VjYiw4LAorCSYobHZhbHVlc1s1MDU1XSksMH0sCit7IkNBTUVMTElBLTEyOC1DRkIiLCJjYW1lbGxpYS0xMjgtY2ZiIixOSURfY2FtZWxsaWFfMTI4X2NmYjEyOCw4LAorCSYobHZhbHVlc1s1MDYzXSksMH0sCit7IkNBTUVMTElBLTE5Mi1DRkIiLCJjYW1lbGxpYS0xOTItY2ZiIixOSURfY2FtZWxsaWFfMTkyX2NmYjEyOCw4LAorCSYobHZhbHVlc1s1MDcxXSksMH0sCit7IkNBTUVMTElBLTI1Ni1DRkIiLCJjYW1lbGxpYS0yNTYtY2ZiIixOSURfY2FtZWxsaWFfMjU2X2NmYjEyOCw4LAorCSYobHZhbHVlc1s1MDc5XSksMH0sCit7IkNBTUVMTElBLTEyOC1DRkIxIiwiY2FtZWxsaWEtMTI4LWNmYjEiLE5JRF9jYW1lbGxpYV8xMjhfY2ZiMSwwLE5VTEwsMH0sCit7IkNBTUVMTElBLTE5Mi1DRkIxIiwiY2FtZWxsaWEtMTkyLWNmYjEiLE5JRF9jYW1lbGxpYV8xOTJfY2ZiMSwwLE5VTEwsMH0sCit7IkNBTUVMTElBLTI1Ni1DRkIxIiwiY2FtZWxsaWEtMjU2LWNmYjEiLE5JRF9jYW1lbGxpYV8yNTZfY2ZiMSwwLE5VTEwsMH0sCit7IkNBTUVMTElBLTEyOC1DRkI4IiwiY2FtZWxsaWEtMTI4LWNmYjgiLE5JRF9jYW1lbGxpYV8xMjhfY2ZiOCwwLE5VTEwsMH0sCit7IkNBTUVMTElBLTE5Mi1DRkI4IiwiY2FtZWxsaWEtMTkyLWNmYjgiLE5JRF9jYW1lbGxpYV8xOTJfY2ZiOCwwLE5VTEwsMH0sCit7IkNBTUVMTElBLTI1Ni1DRkI4IiwiY2FtZWxsaWEtMjU2LWNmYjgiLE5JRF9jYW1lbGxpYV8yNTZfY2ZiOCwwLE5VTEwsMH0sCit7IkNBTUVMTElBLTEyOC1PRkIiLCJjYW1lbGxpYS0xMjgtb2ZiIixOSURfY2FtZWxsaWFfMTI4X29mYjEyOCw4LAorCSYobHZhbHVlc1s1MDg3XSksMH0sCit7IkNBTUVMTElBLTE5Mi1PRkIiLCJjYW1lbGxpYS0xOTItb2ZiIixOSURfY2FtZWxsaWFfMTkyX29mYjEyOCw4LAorCSYobHZhbHVlc1s1MDk1XSksMH0sCit7IkNBTUVMTElBLTI1Ni1PRkIiLCJjYW1lbGxpYS0yNTYtb2ZiIixOSURfY2FtZWxsaWFfMjU2X29mYjEyOCw4LAorCSYobHZhbHVlc1s1MTAzXSksMH0sCit7InN1YmplY3REaXJlY3RvcnlBdHRyaWJ1dGVzIiwiWDUwOXYzIFN1YmplY3QgRGlyZWN0b3J5IEF0dHJpYnV0ZXMiLAorCU5JRF9zdWJqZWN0X2RpcmVjdG9yeV9hdHRyaWJ1dGVzLDMsJihsdmFsdWVzWzUxMTFdKSwwfSwKK3siaXNzdWluZ0Rpc3RyaWJ1dGlvblBvaW50IiwiWDUwOXYzIElzc3VpbmcgRGlzdHJ1YnV0aW9uIFBvaW50IiwKKwlOSURfaXNzdWluZ19kaXN0cmlidXRpb25fcG9pbnQsMywmKGx2YWx1ZXNbNTExNF0pLDB9LAoreyJjZXJ0aWZpY2F0ZUlzc3VlciIsIlg1MDl2MyBDZXJ0aWZpY2F0ZSBJc3N1ZXIiLAorCU5JRF9jZXJ0aWZpY2F0ZV9pc3N1ZXIsMywmKGx2YWx1ZXNbNTExN10pLDB9LAore05VTEwsTlVMTCxOSURfdW5kZWYsMCxOVUxMLDB9LAoreyJLSVNBIiwia2lzYSIsTklEX2tpc2EsNiwmKGx2YWx1ZXNbNTEyMF0pLDB9LAore05VTEwsTlVMTCxOSURfdW5kZWYsMCxOVUxMLDB9LAore05VTEwsTlVMTCxOSURfdW5kZWYsMCxOVUxMLDB9LAoreyJTRUVELUVDQiIsInNlZWQtZWNiIixOSURfc2VlZF9lY2IsOCwmKGx2YWx1ZXNbNTEyNl0pLDB9LAoreyJTRUVELUNCQyIsInNlZWQtY2JjIixOSURfc2VlZF9jYmMsOCwmKGx2YWx1ZXNbNTEzNF0pLDB9LAoreyJTRUVELU9GQiIsInNlZWQtb2ZiIixOSURfc2VlZF9vZmIxMjgsOCwmKGx2YWx1ZXNbNTE0Ml0pLDB9LAoreyJTRUVELUNGQiIsInNlZWQtY2ZiIixOSURfc2VlZF9jZmIxMjgsOCwmKGx2YWx1ZXNbNTE1MF0pLDB9LAoreyJITUFDLU1ENSIsImhtYWMtbWQ1IixOSURfaG1hY19tZDUsOCwmKGx2YWx1ZXNbNTE1OF0pLDB9LAoreyJITUFDLVNIQTEiLCJobWFjLXNoYTEiLE5JRF9obWFjX3NoYTEsOCwmKGx2YWx1ZXNbNTE2Nl0pLDB9LAoreyJpZC1QYXNzd29yZEJhc2VkTUFDIiwicGFzc3dvcmQgYmFzZWQgTUFDIixOSURfaWRfUGFzc3dvcmRCYXNlZE1BQyw5LAorCSYobHZhbHVlc1s1MTc0XSksMH0sCit7ImlkLURIQmFzZWRNYWMiLCJEaWZmaWUtSGVsbG1hbiBiYXNlZCBNQUMiLE5JRF9pZF9ESEJhc2VkTWFjLDksCisJJihsdmFsdWVzWzUxODNdKSwwfSwKK3siaWQtaXQtc3VwcExhbmdUYWdzIiwiaWQtaXQtc3VwcExhbmdUYWdzIixOSURfaWRfaXRfc3VwcExhbmdUYWdzLDgsCisJJihsdmFsdWVzWzUxOTJdKSwwfSwKK3siY2FSZXBvc2l0b3J5IiwiQ0EgUmVwb3NpdG9yeSIsTklEX2NhUmVwb3NpdG9yeSw4LCYobHZhbHVlc1s1MjAwXSksMH0sCit7ImlkLXNtaW1lLWN0LWNvbXByZXNzZWREYXRhIiwiaWQtc21pbWUtY3QtY29tcHJlc3NlZERhdGEiLAorCU5JRF9pZF9zbWltZV9jdF9jb21wcmVzc2VkRGF0YSwxMSwmKGx2YWx1ZXNbNTIwOF0pLDB9LAoreyJpZC1jdC1hc2NpaVRleHRXaXRoQ1JMRiIsImlkLWN0LWFzY2lpVGV4dFdpdGhDUkxGIiwKKwlOSURfaWRfY3RfYXNjaWlUZXh0V2l0aENSTEYsMTEsJihsdmFsdWVzWzUyMTldKSwwfSwKK3siaWQtYWVzMTI4LXdyYXAiLCJpZC1hZXMxMjgtd3JhcCIsTklEX2lkX2FlczEyOF93cmFwLDksCisJJihsdmFsdWVzWzUyMzBdKSwwfSwKK3siaWQtYWVzMTkyLXdyYXAiLCJpZC1hZXMxOTItd3JhcCIsTklEX2lkX2FlczE5Ml93cmFwLDksCisJJihsdmFsdWVzWzUyMzldKSwwfSwKK3siaWQtYWVzMjU2LXdyYXAiLCJpZC1hZXMyNTYtd3JhcCIsTklEX2lkX2FlczI1Nl93cmFwLDksCisJJihsdmFsdWVzWzUyNDhdKSwwfSwKK3siZWNkc2Etd2l0aC1SZWNvbW1lbmRlZCIsImVjZHNhLXdpdGgtUmVjb21tZW5kZWQiLAorCU5JRF9lY2RzYV93aXRoX1JlY29tbWVuZGVkLDcsJihsdmFsdWVzWzUyNTddKSwwfSwKK3siZWNkc2Etd2l0aC1TcGVjaWZpZWQiLCJlY2RzYS13aXRoLVNwZWNpZmllZCIsCisJTklEX2VjZHNhX3dpdGhfU3BlY2lmaWVkLDcsJihsdmFsdWVzWzUyNjRdKSwwfSwKK3siZWNkc2Etd2l0aC1TSEEyMjQiLCJlY2RzYS13aXRoLVNIQTIyNCIsTklEX2VjZHNhX3dpdGhfU0hBMjI0LDgsCisJJihsdmFsdWVzWzUyNzFdKSwwfSwKK3siZWNkc2Etd2l0aC1TSEEyNTYiLCJlY2RzYS13aXRoLVNIQTI1NiIsTklEX2VjZHNhX3dpdGhfU0hBMjU2LDgsCisJJihsdmFsdWVzWzUyNzldKSwwfSwKK3siZWNkc2Etd2l0aC1TSEEzODQiLCJlY2RzYS13aXRoLVNIQTM4NCIsTklEX2VjZHNhX3dpdGhfU0hBMzg0LDgsCisJJihsdmFsdWVzWzUyODddKSwwfSwKK3siZWNkc2Etd2l0aC1TSEE1MTIiLCJlY2RzYS13aXRoLVNIQTUxMiIsTklEX2VjZHNhX3dpdGhfU0hBNTEyLDgsCisJJihsdmFsdWVzWzUyOTVdKSwwfSwKK3siaG1hY1dpdGhNRDUiLCJobWFjV2l0aE1ENSIsTklEX2htYWNXaXRoTUQ1LDgsJihsdmFsdWVzWzUzMDNdKSwwfSwKK3siaG1hY1dpdGhTSEEyMjQiLCJobWFjV2l0aFNIQTIyNCIsTklEX2htYWNXaXRoU0hBMjI0LDgsCisJJihsdmFsdWVzWzUzMTFdKSwwfSwKK3siaG1hY1dpdGhTSEEyNTYiLCJobWFjV2l0aFNIQTI1NiIsTklEX2htYWNXaXRoU0hBMjU2LDgsCisJJihsdmFsdWVzWzUzMTldKSwwfSwKK3siaG1hY1dpdGhTSEEzODQiLCJobWFjV2l0aFNIQTM4NCIsTklEX2htYWNXaXRoU0hBMzg0LDgsCisJJihsdmFsdWVzWzUzMjddKSwwfSwKK3siaG1hY1dpdGhTSEE1MTIiLCJobWFjV2l0aFNIQTUxMiIsTklEX2htYWNXaXRoU0hBNTEyLDgsCisJJihsdmFsdWVzWzUzMzVdKSwwfSwKK3siZHNhX3dpdGhfU0hBMjI0IiwiZHNhX3dpdGhfU0hBMjI0IixOSURfZHNhX3dpdGhfU0hBMjI0LDksCisJJihsdmFsdWVzWzUzNDNdKSwwfSwKK3siZHNhX3dpdGhfU0hBMjU2IiwiZHNhX3dpdGhfU0hBMjU2IixOSURfZHNhX3dpdGhfU0hBMjU2LDksCisJJihsdmFsdWVzWzUzNTJdKSwwfSwKK3sid2hpcmxwb29sIiwid2hpcmxwb29sIixOSURfd2hpcmxwb29sLDYsJihsdmFsdWVzWzUzNjFdKSwwfSwKK3siY3J5cHRvcHJvIiwiY3J5cHRvcHJvIixOSURfY3J5cHRvcHJvLDUsJihsdmFsdWVzWzUzNjddKSwwfSwKK3siY3J5cHRvY29tIiwiY3J5cHRvY29tIixOSURfY3J5cHRvY29tLDUsJihsdmFsdWVzWzUzNzJdKSwwfSwKK3siaWQtR29zdFIzNDExLTk0LXdpdGgtR29zdFIzNDEwLTIwMDEiLAorCSJHT1NUIFIgMzQuMTEtOTQgd2l0aCBHT1NUIFIgMzQuMTAtMjAwMSIsCisJTklEX2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF8yMDAxLDYsJihsdmFsdWVzWzUzNzddKSwwfSwKK3siaWQtR29zdFIzNDExLTk0LXdpdGgtR29zdFIzNDEwLTk0IiwKKwkiR09TVCBSIDM0LjExLTk0IHdpdGggR09TVCBSIDM0LjEwLTk0IiwKKwlOSURfaWRfR29zdFIzNDExXzk0X3dpdGhfR29zdFIzNDEwXzk0LDYsJihsdmFsdWVzWzUzODNdKSwwfSwKK3sibWRfZ29zdDk0IiwiR09TVCBSIDM0LjExLTk0IixOSURfaWRfR29zdFIzNDExXzk0LDYsJihsdmFsdWVzWzUzODldKSwwfSwKK3siaWQtSE1BQ0dvc3RSMzQxMS05NCIsIkhNQUMgR09TVCAzNC4xMS05NCIsTklEX2lkX0hNQUNHb3N0UjM0MTFfOTQsNiwKKwkmKGx2YWx1ZXNbNTM5NV0pLDB9LAoreyJnb3N0MjAwMSIsIkdPU1QgUiAzNC4xMC0yMDAxIixOSURfaWRfR29zdFIzNDEwXzIwMDEsNiwKKwkmKGx2YWx1ZXNbNTQwMV0pLDB9LAoreyJnb3N0OTQiLCJHT1NUIFIgMzQuMTAtOTQiLE5JRF9pZF9Hb3N0UjM0MTBfOTQsNiwmKGx2YWx1ZXNbNTQwN10pLDB9LAoreyJnb3N0ODkiLCJHT1NUIDI4MTQ3LTg5IixOSURfaWRfR29zdDI4MTQ3Xzg5LDYsJihsdmFsdWVzWzU0MTNdKSwwfSwKK3siZ29zdDg5LWNudCIsImdvc3Q4OS1jbnQiLE5JRF9nb3N0ODlfY250LDAsTlVMTCwwfSwKK3siZ29zdC1tYWMiLCJHT1NUIDI4MTQ3LTg5IE1BQyIsTklEX2lkX0dvc3QyODE0N184OV9NQUMsNiwKKwkmKGx2YWx1ZXNbNTQxOV0pLDB9LAoreyJwcmYtZ29zdHIzNDExLTk0IiwiR09TVCBSIDM0LjExLTk0IFBSRiIsTklEX2lkX0dvc3RSMzQxMV85NF9wcmYsNiwKKwkmKGx2YWx1ZXNbNTQyNV0pLDB9LAoreyJpZC1Hb3N0UjM0MTAtMjAwMURIIiwiR09TVCBSIDM0LjEwLTIwMDEgREgiLE5JRF9pZF9Hb3N0UjM0MTBfMjAwMURILAorCTYsJihsdmFsdWVzWzU0MzFdKSwwfSwKK3siaWQtR29zdFIzNDEwLTk0REgiLCJHT1NUIFIgMzQuMTAtOTQgREgiLE5JRF9pZF9Hb3N0UjM0MTBfOTRESCw2LAorCSYobHZhbHVlc1s1NDM3XSksMH0sCit7ImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tS2V5TWVzaGluZyIsCisJImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tS2V5TWVzaGluZyIsCisJTklEX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fS2V5TWVzaGluZyw3LCYobHZhbHVlc1s1NDQzXSksMH0sCit7ImlkLUdvc3QyODE0Ny04OS1Ob25lLUtleU1lc2hpbmciLCJpZC1Hb3N0MjgxNDctODktTm9uZS1LZXlNZXNoaW5nIiwKKwlOSURfaWRfR29zdDI4MTQ3Xzg5X05vbmVfS2V5TWVzaGluZyw3LCYobHZhbHVlc1s1NDUwXSksMH0sCit7ImlkLUdvc3RSMzQxMS05NC1UZXN0UGFyYW1TZXQiLCJpZC1Hb3N0UjM0MTEtOTQtVGVzdFBhcmFtU2V0IiwKKwlOSURfaWRfR29zdFIzNDExXzk0X1Rlc3RQYXJhbVNldCw3LCYobHZhbHVlc1s1NDU3XSksMH0sCit7ImlkLUdvc3RSMzQxMS05NC1DcnlwdG9Qcm9QYXJhbVNldCIsCisJImlkLUdvc3RSMzQxMS05NC1DcnlwdG9Qcm9QYXJhbVNldCIsCisJTklEX2lkX0dvc3RSMzQxMV85NF9DcnlwdG9Qcm9QYXJhbVNldCw3LCYobHZhbHVlc1s1NDY0XSksMH0sCit7ImlkLUdvc3QyODE0Ny04OS1UZXN0UGFyYW1TZXQiLCJpZC1Hb3N0MjgxNDctODktVGVzdFBhcmFtU2V0IiwKKwlOSURfaWRfR29zdDI4MTQ3Xzg5X1Rlc3RQYXJhbVNldCw3LCYobHZhbHVlc1s1NDcxXSksMH0sCit7ImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tQS1QYXJhbVNldCIsCisJImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tQS1QYXJhbVNldCIsCisJTklEX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fQV9QYXJhbVNldCw3LCYobHZhbHVlc1s1NDc4XSksMH0sCit7ImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tQi1QYXJhbVNldCIsCisJImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tQi1QYXJhbVNldCIsCisJTklEX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fQl9QYXJhbVNldCw3LCYobHZhbHVlc1s1NDg1XSksMH0sCit7ImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tQy1QYXJhbVNldCIsCisJImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tQy1QYXJhbVNldCIsCisJTklEX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fQ19QYXJhbVNldCw3LCYobHZhbHVlc1s1NDkyXSksMH0sCit7ImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tRC1QYXJhbVNldCIsCisJImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tRC1QYXJhbVNldCIsCisJTklEX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fRF9QYXJhbVNldCw3LCYobHZhbHVlc1s1NDk5XSksMH0sCit7ImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tT3NjYXItMS0xLVBhcmFtU2V0IiwKKwkiaWQtR29zdDI4MTQ3LTg5LUNyeXB0b1Byby1Pc2Nhci0xLTEtUGFyYW1TZXQiLAorCU5JRF9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX09zY2FyXzFfMV9QYXJhbVNldCw3LCYobHZhbHVlc1s1NTA2XSksCisJMH0sCit7ImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tT3NjYXItMS0wLVBhcmFtU2V0IiwKKwkiaWQtR29zdDI4MTQ3LTg5LUNyeXB0b1Byby1Pc2Nhci0xLTAtUGFyYW1TZXQiLAorCU5JRF9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX09zY2FyXzFfMF9QYXJhbVNldCw3LCYobHZhbHVlc1s1NTEzXSksCisJMH0sCit7ImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tUklDLTEtUGFyYW1TZXQiLAorCSJpZC1Hb3N0MjgxNDctODktQ3J5cHRvUHJvLVJJQy0xLVBhcmFtU2V0IiwKKwlOSURfaWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19SSUNfMV9QYXJhbVNldCw3LCYobHZhbHVlc1s1NTIwXSksMH0sCit7ImlkLUdvc3RSMzQxMC05NC1UZXN0UGFyYW1TZXQiLCJpZC1Hb3N0UjM0MTAtOTQtVGVzdFBhcmFtU2V0IiwKKwlOSURfaWRfR29zdFIzNDEwXzk0X1Rlc3RQYXJhbVNldCw3LCYobHZhbHVlc1s1NTI3XSksMH0sCit7ImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tQS1QYXJhbVNldCIsCisJImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tQS1QYXJhbVNldCIsCisJTklEX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fQV9QYXJhbVNldCw3LCYobHZhbHVlc1s1NTM0XSksMH0sCit7ImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tQi1QYXJhbVNldCIsCisJImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tQi1QYXJhbVNldCIsCisJTklEX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fQl9QYXJhbVNldCw3LCYobHZhbHVlc1s1NTQxXSksMH0sCit7ImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tQy1QYXJhbVNldCIsCisJImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tQy1QYXJhbVNldCIsCisJTklEX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fQ19QYXJhbVNldCw3LCYobHZhbHVlc1s1NTQ4XSksMH0sCit7ImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tRC1QYXJhbVNldCIsCisJImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tRC1QYXJhbVNldCIsCisJTklEX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fRF9QYXJhbVNldCw3LCYobHZhbHVlc1s1NTU1XSksMH0sCit7ImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tWGNoQS1QYXJhbVNldCIsCisJImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tWGNoQS1QYXJhbVNldCIsCisJTklEX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fWGNoQV9QYXJhbVNldCw3LCYobHZhbHVlc1s1NTYyXSksMH0sCit7ImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tWGNoQi1QYXJhbVNldCIsCisJImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tWGNoQi1QYXJhbVNldCIsCisJTklEX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fWGNoQl9QYXJhbVNldCw3LCYobHZhbHVlc1s1NTY5XSksMH0sCit7ImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tWGNoQy1QYXJhbVNldCIsCisJImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tWGNoQy1QYXJhbVNldCIsCisJTklEX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fWGNoQ19QYXJhbVNldCw3LCYobHZhbHVlc1s1NTc2XSksMH0sCit7ImlkLUdvc3RSMzQxMC0yMDAxLVRlc3RQYXJhbVNldCIsImlkLUdvc3RSMzQxMC0yMDAxLVRlc3RQYXJhbVNldCIsCisJTklEX2lkX0dvc3RSMzQxMF8yMDAxX1Rlc3RQYXJhbVNldCw3LCYobHZhbHVlc1s1NTgzXSksMH0sCit7ImlkLUdvc3RSMzQxMC0yMDAxLUNyeXB0b1Byby1BLVBhcmFtU2V0IiwKKwkiaWQtR29zdFIzNDEwLTIwMDEtQ3J5cHRvUHJvLUEtUGFyYW1TZXQiLAorCU5JRF9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fQV9QYXJhbVNldCw3LCYobHZhbHVlc1s1NTkwXSksMH0sCit7ImlkLUdvc3RSMzQxMC0yMDAxLUNyeXB0b1Byby1CLVBhcmFtU2V0IiwKKwkiaWQtR29zdFIzNDEwLTIwMDEtQ3J5cHRvUHJvLUItUGFyYW1TZXQiLAorCU5JRF9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fQl9QYXJhbVNldCw3LCYobHZhbHVlc1s1NTk3XSksMH0sCit7ImlkLUdvc3RSMzQxMC0yMDAxLUNyeXB0b1Byby1DLVBhcmFtU2V0IiwKKwkiaWQtR29zdFIzNDEwLTIwMDEtQ3J5cHRvUHJvLUMtUGFyYW1TZXQiLAorCU5JRF9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fQ19QYXJhbVNldCw3LCYobHZhbHVlc1s1NjA0XSksMH0sCit7ImlkLUdvc3RSMzQxMC0yMDAxLUNyeXB0b1Byby1YY2hBLVBhcmFtU2V0IiwKKwkiaWQtR29zdFIzNDEwLTIwMDEtQ3J5cHRvUHJvLVhjaEEtUGFyYW1TZXQiLAorCU5JRF9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fWGNoQV9QYXJhbVNldCw3LCYobHZhbHVlc1s1NjExXSksMH0sCisJCit7ImlkLUdvc3RSMzQxMC0yMDAxLUNyeXB0b1Byby1YY2hCLVBhcmFtU2V0IiwKKwkiaWQtR29zdFIzNDEwLTIwMDEtQ3J5cHRvUHJvLVhjaEItUGFyYW1TZXQiLAorCU5JRF9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fWGNoQl9QYXJhbVNldCw3LCYobHZhbHVlc1s1NjE4XSksMH0sCisJCit7ImlkLUdvc3RSMzQxMC05NC1hIiwiaWQtR29zdFIzNDEwLTk0LWEiLE5JRF9pZF9Hb3N0UjM0MTBfOTRfYSw3LAorCSYobHZhbHVlc1s1NjI1XSksMH0sCit7ImlkLUdvc3RSMzQxMC05NC1hQmlzIiwiaWQtR29zdFIzNDEwLTk0LWFCaXMiLAorCU5JRF9pZF9Hb3N0UjM0MTBfOTRfYUJpcyw3LCYobHZhbHVlc1s1NjMyXSksMH0sCit7ImlkLUdvc3RSMzQxMC05NC1iIiwiaWQtR29zdFIzNDEwLTk0LWIiLE5JRF9pZF9Hb3N0UjM0MTBfOTRfYiw3LAorCSYobHZhbHVlc1s1NjM5XSksMH0sCit7ImlkLUdvc3RSMzQxMC05NC1iQmlzIiwiaWQtR29zdFIzNDEwLTk0LWJCaXMiLAorCU5JRF9pZF9Hb3N0UjM0MTBfOTRfYkJpcyw3LCYobHZhbHVlc1s1NjQ2XSksMH0sCit7ImlkLUdvc3QyODE0Ny04OS1jYyIsIkdPU1QgMjgxNDctODkgQ3J5cHRvY29tIFBhcmFtU2V0IiwKKwlOSURfaWRfR29zdDI4MTQ3Xzg5X2NjLDgsJihsdmFsdWVzWzU2NTNdKSwwfSwKK3siZ29zdDk0Y2MiLCJHT1NUIDM0LjEwLTk0IENyeXB0b2NvbSIsTklEX2lkX0dvc3RSMzQxMF85NF9jYyw4LAorCSYobHZhbHVlc1s1NjYxXSksMH0sCit7Imdvc3QyMDAxY2MiLCJHT1NUIDM0LjEwLTIwMDEgQ3J5cHRvY29tIixOSURfaWRfR29zdFIzNDEwXzIwMDFfY2MsOCwKKwkmKGx2YWx1ZXNbNTY2OV0pLDB9LAoreyJpZC1Hb3N0UjM0MTEtOTQtd2l0aC1Hb3N0UjM0MTAtOTQtY2MiLAorCSJHT1NUIFIgMzQuMTEtOTQgd2l0aCBHT1NUIFIgMzQuMTAtOTQgQ3J5cHRvY29tIiwKKwlOSURfaWRfR29zdFIzNDExXzk0X3dpdGhfR29zdFIzNDEwXzk0X2NjLDgsJihsdmFsdWVzWzU2NzddKSwwfSwKK3siaWQtR29zdFIzNDExLTk0LXdpdGgtR29zdFIzNDEwLTIwMDEtY2MiLAorCSJHT1NUIFIgMzQuMTEtOTQgd2l0aCBHT1NUIFIgMzQuMTAtMjAwMSBDcnlwdG9jb20iLAorCU5JRF9pZF9Hb3N0UjM0MTFfOTRfd2l0aF9Hb3N0UjM0MTBfMjAwMV9jYyw4LCYobHZhbHVlc1s1Njg1XSksMH0sCit7ImlkLUdvc3RSMzQxMC0yMDAxLVBhcmFtU2V0LWNjIiwKKwkiR09TVCBSIDM0MTAtMjAwMSBQYXJhbWV0ZXIgU2V0IENyeXB0b2NvbSIsCisJTklEX2lkX0dvc3RSMzQxMF8yMDAxX1BhcmFtU2V0X2NjLDgsJihsdmFsdWVzWzU2OTNdKSwwfSwKK3siSE1BQyIsImhtYWMiLE5JRF9obWFjLDAsTlVMTCwwfSwKK3siTG9jYWxLZXlTZXQiLCJNaWNyb3NvZnQgTG9jYWwgS2V5IHNldCIsTklEX0xvY2FsS2V5U2V0LDksCisJJihsdmFsdWVzWzU3MDFdKSwwfSwKK3siZnJlc2hlc3RDUkwiLCJYNTA5djMgRnJlc2hlc3QgQ1JMIixOSURfZnJlc2hlc3RfY3JsLDMsCisJJihsdmFsdWVzWzU3MTBdKSwwfSwKK3siaWQtb24tcGVybWFuZW50SWRlbnRpZmllciIsIlBlcm1hbmVudCBJZGVudGlmaWVyIiwKKwlOSURfaWRfb25fcGVybWFuZW50SWRlbnRpZmllciw4LCYobHZhbHVlc1s1NzEzXSksMH0sCit7InNlYXJjaEd1aWRlIiwic2VhcmNoR3VpZGUiLE5JRF9zZWFyY2hHdWlkZSwzLCYobHZhbHVlc1s1NzIxXSksMH0sCit7ImJ1c2luZXNzQ2F0ZWdvcnkiLCJidXNpbmVzc0NhdGVnb3J5IixOSURfYnVzaW5lc3NDYXRlZ29yeSwzLAorCSYobHZhbHVlc1s1NzI0XSksMH0sCit7InBvc3RhbEFkZHJlc3MiLCJwb3N0YWxBZGRyZXNzIixOSURfcG9zdGFsQWRkcmVzcywzLCYobHZhbHVlc1s1NzI3XSksMH0sCit7InBvc3RPZmZpY2VCb3giLCJwb3N0T2ZmaWNlQm94IixOSURfcG9zdE9mZmljZUJveCwzLCYobHZhbHVlc1s1NzMwXSksMH0sCit7InBoeXNpY2FsRGVsaXZlcnlPZmZpY2VOYW1lIiwicGh5c2ljYWxEZWxpdmVyeU9mZmljZU5hbWUiLAorCU5JRF9waHlzaWNhbERlbGl2ZXJ5T2ZmaWNlTmFtZSwzLCYobHZhbHVlc1s1NzMzXSksMH0sCit7InRlbGVwaG9uZU51bWJlciIsInRlbGVwaG9uZU51bWJlciIsTklEX3RlbGVwaG9uZU51bWJlciwzLAorCSYobHZhbHVlc1s1NzM2XSksMH0sCit7InRlbGV4TnVtYmVyIiwidGVsZXhOdW1iZXIiLE5JRF90ZWxleE51bWJlciwzLCYobHZhbHVlc1s1NzM5XSksMH0sCit7InRlbGV0ZXhUZXJtaW5hbElkZW50aWZpZXIiLCJ0ZWxldGV4VGVybWluYWxJZGVudGlmaWVyIiwKKwlOSURfdGVsZXRleFRlcm1pbmFsSWRlbnRpZmllciwzLCYobHZhbHVlc1s1NzQyXSksMH0sCit7ImZhY3NpbWlsZVRlbGVwaG9uZU51bWJlciIsImZhY3NpbWlsZVRlbGVwaG9uZU51bWJlciIsCisJTklEX2ZhY3NpbWlsZVRlbGVwaG9uZU51bWJlciwzLCYobHZhbHVlc1s1NzQ1XSksMH0sCit7IngxMjFBZGRyZXNzIiwieDEyMUFkZHJlc3MiLE5JRF94MTIxQWRkcmVzcywzLCYobHZhbHVlc1s1NzQ4XSksMH0sCit7ImludGVybmF0aW9uYWxpU0ROTnVtYmVyIiwiaW50ZXJuYXRpb25hbGlTRE5OdW1iZXIiLAorCU5JRF9pbnRlcm5hdGlvbmFsaVNETk51bWJlciwzLCYobHZhbHVlc1s1NzUxXSksMH0sCit7InJlZ2lzdGVyZWRBZGRyZXNzIiwicmVnaXN0ZXJlZEFkZHJlc3MiLE5JRF9yZWdpc3RlcmVkQWRkcmVzcywzLAorCSYobHZhbHVlc1s1NzU0XSksMH0sCit7ImRlc3RpbmF0aW9uSW5kaWNhdG9yIiwiZGVzdGluYXRpb25JbmRpY2F0b3IiLAorCU5JRF9kZXN0aW5hdGlvbkluZGljYXRvciwzLCYobHZhbHVlc1s1NzU3XSksMH0sCit7InByZWZlcnJlZERlbGl2ZXJ5TWV0aG9kIiwicHJlZmVycmVkRGVsaXZlcnlNZXRob2QiLAorCU5JRF9wcmVmZXJyZWREZWxpdmVyeU1ldGhvZCwzLCYobHZhbHVlc1s1NzYwXSksMH0sCit7InByZXNlbnRhdGlvbkFkZHJlc3MiLCJwcmVzZW50YXRpb25BZGRyZXNzIixOSURfcHJlc2VudGF0aW9uQWRkcmVzcywKKwkzLCYobHZhbHVlc1s1NzYzXSksMH0sCit7InN1cHBvcnRlZEFwcGxpY2F0aW9uQ29udGV4dCIsInN1cHBvcnRlZEFwcGxpY2F0aW9uQ29udGV4dCIsCisJTklEX3N1cHBvcnRlZEFwcGxpY2F0aW9uQ29udGV4dCwzLCYobHZhbHVlc1s1NzY2XSksMH0sCit7Im1lbWJlciIsIm1lbWJlciIsTklEX21lbWJlciwzLCYobHZhbHVlc1s1NzY5XSksMH0sCit7Im93bmVyIiwib3duZXIiLE5JRF9vd25lciwzLCYobHZhbHVlc1s1NzcyXSksMH0sCit7InJvbGVPY2N1cGFudCIsInJvbGVPY2N1cGFudCIsTklEX3JvbGVPY2N1cGFudCwzLCYobHZhbHVlc1s1Nzc1XSksMH0sCit7InNlZUFsc28iLCJzZWVBbHNvIixOSURfc2VlQWxzbywzLCYobHZhbHVlc1s1Nzc4XSksMH0sCit7InVzZXJQYXNzd29yZCIsInVzZXJQYXNzd29yZCIsTklEX3VzZXJQYXNzd29yZCwzLCYobHZhbHVlc1s1NzgxXSksMH0sCit7InVzZXJDZXJ0aWZpY2F0ZSIsInVzZXJDZXJ0aWZpY2F0ZSIsTklEX3VzZXJDZXJ0aWZpY2F0ZSwzLAorCSYobHZhbHVlc1s1Nzg0XSksMH0sCit7ImNBQ2VydGlmaWNhdGUiLCJjQUNlcnRpZmljYXRlIixOSURfY0FDZXJ0aWZpY2F0ZSwzLCYobHZhbHVlc1s1Nzg3XSksMH0sCit7ImF1dGhvcml0eVJldm9jYXRpb25MaXN0IiwiYXV0aG9yaXR5UmV2b2NhdGlvbkxpc3QiLAorCU5JRF9hdXRob3JpdHlSZXZvY2F0aW9uTGlzdCwzLCYobHZhbHVlc1s1NzkwXSksMH0sCit7ImNlcnRpZmljYXRlUmV2b2NhdGlvbkxpc3QiLCJjZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0IiwKKwlOSURfY2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdCwzLCYobHZhbHVlc1s1NzkzXSksMH0sCit7ImNyb3NzQ2VydGlmaWNhdGVQYWlyIiwiY3Jvc3NDZXJ0aWZpY2F0ZVBhaXIiLAorCU5JRF9jcm9zc0NlcnRpZmljYXRlUGFpciwzLCYobHZhbHVlc1s1Nzk2XSksMH0sCit7ImVuaGFuY2VkU2VhcmNoR3VpZGUiLCJlbmhhbmNlZFNlYXJjaEd1aWRlIixOSURfZW5oYW5jZWRTZWFyY2hHdWlkZSwKKwkzLCYobHZhbHVlc1s1Nzk5XSksMH0sCit7InByb3RvY29sSW5mb3JtYXRpb24iLCJwcm90b2NvbEluZm9ybWF0aW9uIixOSURfcHJvdG9jb2xJbmZvcm1hdGlvbiwKKwkzLCYobHZhbHVlc1s1ODAyXSksMH0sCit7ImRpc3Rpbmd1aXNoZWROYW1lIiwiZGlzdGluZ3Vpc2hlZE5hbWUiLE5JRF9kaXN0aW5ndWlzaGVkTmFtZSwzLAorCSYobHZhbHVlc1s1ODA1XSksMH0sCit7InVuaXF1ZU1lbWJlciIsInVuaXF1ZU1lbWJlciIsTklEX3VuaXF1ZU1lbWJlciwzLCYobHZhbHVlc1s1ODA4XSksMH0sCit7ImhvdXNlSWRlbnRpZmllciIsImhvdXNlSWRlbnRpZmllciIsTklEX2hvdXNlSWRlbnRpZmllciwzLAorCSYobHZhbHVlc1s1ODExXSksMH0sCit7InN1cHBvcnRlZEFsZ29yaXRobXMiLCJzdXBwb3J0ZWRBbGdvcml0aG1zIixOSURfc3VwcG9ydGVkQWxnb3JpdGhtcywKKwkzLCYobHZhbHVlc1s1ODE0XSksMH0sCit7ImRlbHRhUmV2b2NhdGlvbkxpc3QiLCJkZWx0YVJldm9jYXRpb25MaXN0IixOSURfZGVsdGFSZXZvY2F0aW9uTGlzdCwKKwkzLCYobHZhbHVlc1s1ODE3XSksMH0sCit7ImRtZE5hbWUiLCJkbWROYW1lIixOSURfZG1kTmFtZSwzLCYobHZhbHVlc1s1ODIwXSksMH0sCit7ImlkLWFsZy1QV1JJLUtFSyIsImlkLWFsZy1QV1JJLUtFSyIsTklEX2lkX2FsZ19QV1JJX0tFSywxMSwKKwkmKGx2YWx1ZXNbNTgyM10pLDB9LAoreyJDTUFDIiwiY21hYyIsTklEX2NtYWMsMCxOVUxMLDB9LAoreyJpZC1hZXMxMjgtR0NNIiwiYWVzLTEyOC1nY20iLE5JRF9hZXNfMTI4X2djbSw5LCYobHZhbHVlc1s1ODM0XSksMH0sCit7ImlkLWFlczEyOC1DQ00iLCJhZXMtMTI4LWNjbSIsTklEX2Flc18xMjhfY2NtLDksJihsdmFsdWVzWzU4NDNdKSwwfSwKK3siaWQtYWVzMTI4LXdyYXAtcGFkIiwiaWQtYWVzMTI4LXdyYXAtcGFkIixOSURfaWRfYWVzMTI4X3dyYXBfcGFkLDksCisJJihsdmFsdWVzWzU4NTJdKSwwfSwKK3siaWQtYWVzMTkyLUdDTSIsImFlcy0xOTItZ2NtIixOSURfYWVzXzE5Ml9nY20sOSwmKGx2YWx1ZXNbNTg2MV0pLDB9LAoreyJpZC1hZXMxOTItQ0NNIiwiYWVzLTE5Mi1jY20iLE5JRF9hZXNfMTkyX2NjbSw5LCYobHZhbHVlc1s1ODcwXSksMH0sCit7ImlkLWFlczE5Mi13cmFwLXBhZCIsImlkLWFlczE5Mi13cmFwLXBhZCIsTklEX2lkX2FlczE5Ml93cmFwX3BhZCw5LAorCSYobHZhbHVlc1s1ODc5XSksMH0sCit7ImlkLWFlczI1Ni1HQ00iLCJhZXMtMjU2LWdjbSIsTklEX2Flc18yNTZfZ2NtLDksJihsdmFsdWVzWzU4ODhdKSwwfSwKK3siaWQtYWVzMjU2LUNDTSIsImFlcy0yNTYtY2NtIixOSURfYWVzXzI1Nl9jY20sOSwmKGx2YWx1ZXNbNTg5N10pLDB9LAoreyJpZC1hZXMyNTYtd3JhcC1wYWQiLCJpZC1hZXMyNTYtd3JhcC1wYWQiLE5JRF9pZF9hZXMyNTZfd3JhcF9wYWQsOSwKKwkmKGx2YWx1ZXNbNTkwNl0pLDB9LAoreyJBRVMtMTI4LUNUUiIsImFlcy0xMjgtY3RyIixOSURfYWVzXzEyOF9jdHIsMCxOVUxMLDB9LAoreyJBRVMtMTkyLUNUUiIsImFlcy0xOTItY3RyIixOSURfYWVzXzE5Ml9jdHIsMCxOVUxMLDB9LAoreyJBRVMtMjU2LUNUUiIsImFlcy0yNTYtY3RyIixOSURfYWVzXzI1Nl9jdHIsMCxOVUxMLDB9LAoreyJpZC1jYW1lbGxpYTEyOC13cmFwIiwiaWQtY2FtZWxsaWExMjgtd3JhcCIsTklEX2lkX2NhbWVsbGlhMTI4X3dyYXAsCisJMTEsJihsdmFsdWVzWzU5MTVdKSwwfSwKK3siaWQtY2FtZWxsaWExOTItd3JhcCIsImlkLWNhbWVsbGlhMTkyLXdyYXAiLE5JRF9pZF9jYW1lbGxpYTE5Ml93cmFwLAorCTExLCYobHZhbHVlc1s1OTI2XSksMH0sCit7ImlkLWNhbWVsbGlhMjU2LXdyYXAiLCJpZC1jYW1lbGxpYTI1Ni13cmFwIixOSURfaWRfY2FtZWxsaWEyNTZfd3JhcCwKKwkxMSwmKGx2YWx1ZXNbNTkzN10pLDB9LAoreyJhbnlFeHRlbmRlZEtleVVzYWdlIiwiQW55IEV4dGVuZGVkIEtleSBVc2FnZSIsCisJTklEX2FueUV4dGVuZGVkS2V5VXNhZ2UsNCwmKGx2YWx1ZXNbNTk0OF0pLDB9LAoreyJNR0YxIiwibWdmMSIsTklEX21nZjEsOSwmKGx2YWx1ZXNbNTk1Ml0pLDB9LAoreyJSU0FTU0EtUFNTIiwicnNhc3NhUHNzIixOSURfcnNhc3NhUHNzLDksJihsdmFsdWVzWzU5NjFdKSwwfSwKK3siQUVTLTEyOC1YVFMiLCJhZXMtMTI4LXh0cyIsTklEX2Flc18xMjhfeHRzLDAsTlVMTCwwfSwKK3siQUVTLTI1Ni1YVFMiLCJhZXMtMjU2LXh0cyIsTklEX2Flc18yNTZfeHRzLDAsTlVMTCwwfSwKK3siUkM0LUhNQUMtTUQ1IiwicmM0LWhtYWMtbWQ1IixOSURfcmM0X2htYWNfbWQ1LDAsTlVMTCwwfSwKK3siQUVTLTEyOC1DQkMtSE1BQy1TSEExIiwiYWVzLTEyOC1jYmMtaG1hYy1zaGExIiwKKwlOSURfYWVzXzEyOF9jYmNfaG1hY19zaGExLDAsTlVMTCwwfSwKK3siQUVTLTE5Mi1DQkMtSE1BQy1TSEExIiwiYWVzLTE5Mi1jYmMtaG1hYy1zaGExIiwKKwlOSURfYWVzXzE5Ml9jYmNfaG1hY19zaGExLDAsTlVMTCwwfSwKK3siQUVTLTI1Ni1DQkMtSE1BQy1TSEExIiwiYWVzLTI1Ni1jYmMtaG1hYy1zaGExIiwKKwlOSURfYWVzXzI1Nl9jYmNfaG1hY19zaGExLDAsTlVMTCwwfSwKK3siUlNBRVMtT0FFUCIsInJzYWVzT2FlcCIsTklEX3JzYWVzT2FlcCw5LCYobHZhbHVlc1s1OTcwXSksMH0sCit7ImRocHVibGljbnVtYmVyIiwiWDkuNDIgREgiLE5JRF9kaHB1YmxpY251bWJlciw3LCYobHZhbHVlc1s1OTc5XSksMH0sCit7ImJyYWlucG9vbFAxNjByMSIsImJyYWlucG9vbFAxNjByMSIsTklEX2JyYWlucG9vbFAxNjByMSw5LAorCSYobHZhbHVlc1s1OTg2XSksMH0sCit7ImJyYWlucG9vbFAxNjB0MSIsImJyYWlucG9vbFAxNjB0MSIsTklEX2JyYWlucG9vbFAxNjB0MSw5LAorCSYobHZhbHVlc1s1OTk1XSksMH0sCit7ImJyYWlucG9vbFAxOTJyMSIsImJyYWlucG9vbFAxOTJyMSIsTklEX2JyYWlucG9vbFAxOTJyMSw5LAorCSYobHZhbHVlc1s2MDA0XSksMH0sCit7ImJyYWlucG9vbFAxOTJ0MSIsImJyYWlucG9vbFAxOTJ0MSIsTklEX2JyYWlucG9vbFAxOTJ0MSw5LAorCSYobHZhbHVlc1s2MDEzXSksMH0sCit7ImJyYWlucG9vbFAyMjRyMSIsImJyYWlucG9vbFAyMjRyMSIsTklEX2JyYWlucG9vbFAyMjRyMSw5LAorCSYobHZhbHVlc1s2MDIyXSksMH0sCit7ImJyYWlucG9vbFAyMjR0MSIsImJyYWlucG9vbFAyMjR0MSIsTklEX2JyYWlucG9vbFAyMjR0MSw5LAorCSYobHZhbHVlc1s2MDMxXSksMH0sCit7ImJyYWlucG9vbFAyNTZyMSIsImJyYWlucG9vbFAyNTZyMSIsTklEX2JyYWlucG9vbFAyNTZyMSw5LAorCSYobHZhbHVlc1s2MDQwXSksMH0sCit7ImJyYWlucG9vbFAyNTZ0MSIsImJyYWlucG9vbFAyNTZ0MSIsTklEX2JyYWlucG9vbFAyNTZ0MSw5LAorCSYobHZhbHVlc1s2MDQ5XSksMH0sCit7ImJyYWlucG9vbFAzMjByMSIsImJyYWlucG9vbFAzMjByMSIsTklEX2JyYWlucG9vbFAzMjByMSw5LAorCSYobHZhbHVlc1s2MDU4XSksMH0sCit7ImJyYWlucG9vbFAzMjB0MSIsImJyYWlucG9vbFAzMjB0MSIsTklEX2JyYWlucG9vbFAzMjB0MSw5LAorCSYobHZhbHVlc1s2MDY3XSksMH0sCit7ImJyYWlucG9vbFAzODRyMSIsImJyYWlucG9vbFAzODRyMSIsTklEX2JyYWlucG9vbFAzODRyMSw5LAorCSYobHZhbHVlc1s2MDc2XSksMH0sCit7ImJyYWlucG9vbFAzODR0MSIsImJyYWlucG9vbFAzODR0MSIsTklEX2JyYWlucG9vbFAzODR0MSw5LAorCSYobHZhbHVlc1s2MDg1XSksMH0sCit7ImJyYWlucG9vbFA1MTJyMSIsImJyYWlucG9vbFA1MTJyMSIsTklEX2JyYWlucG9vbFA1MTJyMSw5LAorCSYobHZhbHVlc1s2MDk0XSksMH0sCit7ImJyYWlucG9vbFA1MTJ0MSIsImJyYWlucG9vbFA1MTJ0MSIsTklEX2JyYWlucG9vbFA1MTJ0MSw5LAorCSYobHZhbHVlc1s2MTAzXSksMH0sCit7IlBTUEVDSUZJRUQiLCJwU3BlY2lmaWVkIixOSURfcFNwZWNpZmllZCw5LCYobHZhbHVlc1s2MTEyXSksMH0sCit7TlVMTCxOVUxMLE5JRF91bmRlZiwwLE5VTEwsMH0sCit7TlVMTCxOVUxMLE5JRF91bmRlZiwwLE5VTEwsMH0sCit7TlVMTCxOVUxMLE5JRF91bmRlZiwwLE5VTEwsMH0sCit7ImRoU2luZ2xlUGFzcy1zdGRESC1zaGExa2RmLXNjaGVtZSIsCisJImRoU2luZ2xlUGFzcy1zdGRESC1zaGExa2RmLXNjaGVtZSIsCisJTklEX2RoU2luZ2xlUGFzc19zdGRESF9zaGExa2RmX3NjaGVtZSw5LCYobHZhbHVlc1s2MTIxXSksMH0sCit7ImRoU2luZ2xlUGFzcy1zdGRESC1zaGEyMjRrZGYtc2NoZW1lIiwKKwkiZGhTaW5nbGVQYXNzLXN0ZERILXNoYTIyNGtkZi1zY2hlbWUiLAorCU5JRF9kaFNpbmdsZVBhc3Nfc3RkREhfc2hhMjI0a2RmX3NjaGVtZSw2LCYobHZhbHVlc1s2MTMwXSksMH0sCit7ImRoU2luZ2xlUGFzcy1zdGRESC1zaGEyNTZrZGYtc2NoZW1lIiwKKwkiZGhTaW5nbGVQYXNzLXN0ZERILXNoYTI1NmtkZi1zY2hlbWUiLAorCU5JRF9kaFNpbmdsZVBhc3Nfc3RkREhfc2hhMjU2a2RmX3NjaGVtZSw2LCYobHZhbHVlc1s2MTM2XSksMH0sCit7ImRoU2luZ2xlUGFzcy1zdGRESC1zaGEzODRrZGYtc2NoZW1lIiwKKwkiZGhTaW5nbGVQYXNzLXN0ZERILXNoYTM4NGtkZi1zY2hlbWUiLAorCU5JRF9kaFNpbmdsZVBhc3Nfc3RkREhfc2hhMzg0a2RmX3NjaGVtZSw2LCYobHZhbHVlc1s2MTQyXSksMH0sCit7ImRoU2luZ2xlUGFzcy1zdGRESC1zaGE1MTJrZGYtc2NoZW1lIiwKKwkiZGhTaW5nbGVQYXNzLXN0ZERILXNoYTUxMmtkZi1zY2hlbWUiLAorCU5JRF9kaFNpbmdsZVBhc3Nfc3RkREhfc2hhNTEya2RmX3NjaGVtZSw2LCYobHZhbHVlc1s2MTQ4XSksMH0sCit7ImRoU2luZ2xlUGFzcy1jb2ZhY3RvckRILXNoYTFrZGYtc2NoZW1lIiwKKwkiZGhTaW5nbGVQYXNzLWNvZmFjdG9yREgtc2hhMWtkZi1zY2hlbWUiLAorCU5JRF9kaFNpbmdsZVBhc3NfY29mYWN0b3JESF9zaGExa2RmX3NjaGVtZSw5LCYobHZhbHVlc1s2MTU0XSksMH0sCit7ImRoU2luZ2xlUGFzcy1jb2ZhY3RvckRILXNoYTIyNGtkZi1zY2hlbWUiLAorCSJkaFNpbmdsZVBhc3MtY29mYWN0b3JESC1zaGEyMjRrZGYtc2NoZW1lIiwKKwlOSURfZGhTaW5nbGVQYXNzX2NvZmFjdG9yREhfc2hhMjI0a2RmX3NjaGVtZSw2LCYobHZhbHVlc1s2MTYzXSksMH0sCit7ImRoU2luZ2xlUGFzcy1jb2ZhY3RvckRILXNoYTI1NmtkZi1zY2hlbWUiLAorCSJkaFNpbmdsZVBhc3MtY29mYWN0b3JESC1zaGEyNTZrZGYtc2NoZW1lIiwKKwlOSURfZGhTaW5nbGVQYXNzX2NvZmFjdG9yREhfc2hhMjU2a2RmX3NjaGVtZSw2LCYobHZhbHVlc1s2MTY5XSksMH0sCit7ImRoU2luZ2xlUGFzcy1jb2ZhY3RvckRILXNoYTM4NGtkZi1zY2hlbWUiLAorCSJkaFNpbmdsZVBhc3MtY29mYWN0b3JESC1zaGEzODRrZGYtc2NoZW1lIiwKKwlOSURfZGhTaW5nbGVQYXNzX2NvZmFjdG9yREhfc2hhMzg0a2RmX3NjaGVtZSw2LCYobHZhbHVlc1s2MTc1XSksMH0sCit7ImRoU2luZ2xlUGFzcy1jb2ZhY3RvckRILXNoYTUxMmtkZi1zY2hlbWUiLAorCSJkaFNpbmdsZVBhc3MtY29mYWN0b3JESC1zaGE1MTJrZGYtc2NoZW1lIiwKKwlOSURfZGhTaW5nbGVQYXNzX2NvZmFjdG9yREhfc2hhNTEya2RmX3NjaGVtZSw2LCYobHZhbHVlc1s2MTgxXSksMH0sCit7ImRoLXN0ZC1rZGYiLCJkaC1zdGQta2RmIixOSURfZGhfc3RkX2tkZiwwLE5VTEwsMH0sCit7ImRoLWNvZmFjdG9yLWtkZiIsImRoLWNvZmFjdG9yLWtkZiIsTklEX2RoX2NvZmFjdG9yX2tkZiwwLE5VTEwsMH0sCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGtOSURzSW5TaG9ydE5hbWVPcmRlcltOVU1fU05dPXsKKzM2NCwJLyogIkFEX0RWQ1MiICovCis0MTksCS8qICJBRVMtMTI4LUNCQyIgKi8KKzkxNiwJLyogIkFFUy0xMjgtQ0JDLUhNQUMtU0hBMSIgKi8KKzQyMSwJLyogIkFFUy0xMjgtQ0ZCIiAqLworNjUwLAkvKiAiQUVTLTEyOC1DRkIxIiAqLworNjUzLAkvKiAiQUVTLTEyOC1DRkI4IiAqLworOTA0LAkvKiAiQUVTLTEyOC1DVFIiICovCis0MTgsCS8qICJBRVMtMTI4LUVDQiIgKi8KKzQyMCwJLyogIkFFUy0xMjgtT0ZCIiAqLworOTEzLAkvKiAiQUVTLTEyOC1YVFMiICovCis0MjMsCS8qICJBRVMtMTkyLUNCQyIgKi8KKzkxNywJLyogIkFFUy0xOTItQ0JDLUhNQUMtU0hBMSIgKi8KKzQyNSwJLyogIkFFUy0xOTItQ0ZCIiAqLworNjUxLAkvKiAiQUVTLTE5Mi1DRkIxIiAqLworNjU0LAkvKiAiQUVTLTE5Mi1DRkI4IiAqLworOTA1LAkvKiAiQUVTLTE5Mi1DVFIiICovCis0MjIsCS8qICJBRVMtMTkyLUVDQiIgKi8KKzQyNCwJLyogIkFFUy0xOTItT0ZCIiAqLworNDI3LAkvKiAiQUVTLTI1Ni1DQkMiICovCis5MTgsCS8qICJBRVMtMjU2LUNCQy1ITUFDLVNIQTEiICovCis0MjksCS8qICJBRVMtMjU2LUNGQiIgKi8KKzY1MiwJLyogIkFFUy0yNTYtQ0ZCMSIgKi8KKzY1NSwJLyogIkFFUy0yNTYtQ0ZCOCIgKi8KKzkwNiwJLyogIkFFUy0yNTYtQ1RSIiAqLworNDI2LAkvKiAiQUVTLTI1Ni1FQ0IiICovCis0MjgsCS8qICJBRVMtMjU2LU9GQiIgKi8KKzkxNCwJLyogIkFFUy0yNTYtWFRTIiAqLworOTEsCS8qICJCRi1DQkMiICovCis5MywJLyogIkJGLUNGQiIgKi8KKzkyLAkvKiAiQkYtRUNCIiAqLworOTQsCS8qICJCRi1PRkIiICovCisxNCwJLyogIkMiICovCis3NTEsCS8qICJDQU1FTExJQS0xMjgtQ0JDIiAqLworNzU3LAkvKiAiQ0FNRUxMSUEtMTI4LUNGQiIgKi8KKzc2MCwJLyogIkNBTUVMTElBLTEyOC1DRkIxIiAqLworNzYzLAkvKiAiQ0FNRUxMSUEtMTI4LUNGQjgiICovCis3NTQsCS8qICJDQU1FTExJQS0xMjgtRUNCIiAqLworNzY2LAkvKiAiQ0FNRUxMSUEtMTI4LU9GQiIgKi8KKzc1MiwJLyogIkNBTUVMTElBLTE5Mi1DQkMiICovCis3NTgsCS8qICJDQU1FTExJQS0xOTItQ0ZCIiAqLworNzYxLAkvKiAiQ0FNRUxMSUEtMTkyLUNGQjEiICovCis3NjQsCS8qICJDQU1FTExJQS0xOTItQ0ZCOCIgKi8KKzc1NSwJLyogIkNBTUVMTElBLTE5Mi1FQ0IiICovCis3NjcsCS8qICJDQU1FTExJQS0xOTItT0ZCIiAqLworNzUzLAkvKiAiQ0FNRUxMSUEtMjU2LUNCQyIgKi8KKzc1OSwJLyogIkNBTUVMTElBLTI1Ni1DRkIiICovCis3NjIsCS8qICJDQU1FTExJQS0yNTYtQ0ZCMSIgKi8KKzc2NSwJLyogIkNBTUVMTElBLTI1Ni1DRkI4IiAqLworNzU2LAkvKiAiQ0FNRUxMSUEtMjU2LUVDQiIgKi8KKzc2OCwJLyogIkNBTUVMTElBLTI1Ni1PRkIiICovCisxMDgsCS8qICJDQVNUNS1DQkMiICovCisxMTAsCS8qICJDQVNUNS1DRkIiICovCisxMDksCS8qICJDQVNUNS1FQ0IiICovCisxMTEsCS8qICJDQVNUNS1PRkIiICovCis4OTQsCS8qICJDTUFDIiAqLworMTMsCS8qICJDTiIgKi8KKzE0MSwJLyogIkNSTFJlYXNvbiIgKi8KKzQxNywJLyogIkNTUE5hbWUiICovCiszNjcsCS8qICJDcmxJRCIgKi8KKzM5MSwJLyogIkRDIiAqLworMzEsCS8qICJERVMtQ0JDIiAqLworNjQzLAkvKiAiREVTLUNETUYiICovCiszMCwJLyogIkRFUy1DRkIiICovCis2NTYsCS8qICJERVMtQ0ZCMSIgKi8KKzY1NywJLyogIkRFUy1DRkI4IiAqLworMjksCS8qICJERVMtRUNCIiAqLworMzIsCS8qICJERVMtRURFIiAqLworNDMsCS8qICJERVMtRURFLUNCQyIgKi8KKzYwLAkvKiAiREVTLUVERS1DRkIiICovCis2MiwJLyogIkRFUy1FREUtT0ZCIiAqLworMzMsCS8qICJERVMtRURFMyIgKi8KKzQ0LAkvKiAiREVTLUVERTMtQ0JDIiAqLworNjEsCS8qICJERVMtRURFMy1DRkIiICovCis2NTgsCS8qICJERVMtRURFMy1DRkIxIiAqLworNjU5LAkvKiAiREVTLUVERTMtQ0ZCOCIgKi8KKzYzLAkvKiAiREVTLUVERTMtT0ZCIiAqLworNDUsCS8qICJERVMtT0ZCIiAqLworODAsCS8qICJERVNYLUNCQyIgKi8KKzM4MCwJLyogIkRPRCIgKi8KKzExNiwJLyogIkRTQSIgKi8KKzY2LAkvKiAiRFNBLVNIQSIgKi8KKzExMywJLyogIkRTQS1TSEExIiAqLworNzAsCS8qICJEU0EtU0hBMS1vbGQiICovCis2NywJLyogIkRTQS1vbGQiICovCisyOTcsCS8qICJEVkNTIiAqLworOTksCS8qICJHTiIgKi8KKzg1NSwJLyogIkhNQUMiICovCis3ODAsCS8qICJITUFDLU1ENSIgKi8KKzc4MSwJLyogIkhNQUMtU0hBMSIgKi8KKzM4MSwJLyogIklBTkEiICovCiszNCwJLyogIklERUEtQ0JDIiAqLworMzUsCS8qICJJREVBLUNGQiIgKi8KKzM2LAkvKiAiSURFQS1FQ0IiICovCis0NiwJLyogIklERUEtT0ZCIiAqLworMTgxLAkvKiAiSVNPIiAqLworMTgzLAkvKiAiSVNPLVVTIiAqLworNjQ1LAkvKiAiSVRVLVQiICovCis2NDYsCS8qICJKT0lOVC1JU08tSVRVLVQiICovCis3NzMsCS8qICJLSVNBIiAqLworMTUsCS8qICJMIiAqLworODU2LAkvKiAiTG9jYWxLZXlTZXQiICovCisgMywJLyogIk1EMiIgKi8KKzI1NywJLyogIk1ENCIgKi8KKyA0LAkvKiAiTUQ1IiAqLworMTE0LAkvKiAiTUQ1LVNIQTEiICovCis5NSwJLyogIk1EQzIiICovCis5MTEsCS8qICJNR0YxIiAqLworMzg4LAkvKiAiTWFpbCIgKi8KKzM5MywJLyogIk5VTEwiICovCis0MDQsCS8qICJOVUxMIiAqLworNTcsCS8qICJOZXRzY2FwZSIgKi8KKzM2NiwJLyogIk5vbmNlIiAqLworMTcsCS8qICJPIiAqLworMTc4LAkvKiAiT0NTUCIgKi8KKzE4MCwJLyogIk9DU1BTaWduaW5nIiAqLworMzc5LAkvKiAiT1JHIiAqLworMTgsCS8qICJPVSIgKi8KKzc0OSwJLyogIk9ha2xleS1FQzJOLTMiICovCis3NTAsCS8qICJPYWtsZXktRUMyTi00IiAqLworIDksCS8qICJQQkUtTUQyLURFUyIgKi8KKzE2OCwJLyogIlBCRS1NRDItUkMyLTY0IiAqLworMTAsCS8qICJQQkUtTUQ1LURFUyIgKi8KKzE2OSwJLyogIlBCRS1NRDUtUkMyLTY0IiAqLworMTQ3LAkvKiAiUEJFLVNIQTEtMkRFUyIgKi8KKzE0NiwJLyogIlBCRS1TSEExLTNERVMiICovCisxNzAsCS8qICJQQkUtU0hBMS1ERVMiICovCisxNDgsCS8qICJQQkUtU0hBMS1SQzItMTI4IiAqLworMTQ5LAkvKiAiUEJFLVNIQTEtUkMyLTQwIiAqLworNjgsCS8qICJQQkUtU0hBMS1SQzItNjQiICovCisxNDQsCS8qICJQQkUtU0hBMS1SQzQtMTI4IiAqLworMTQ1LAkvKiAiUEJFLVNIQTEtUkM0LTQwIiAqLworMTYxLAkvKiAiUEJFUzIiICovCis2OSwJLyogIlBCS0RGMiIgKi8KKzE2MiwJLyogIlBCTUFDMSIgKi8KKzEyNywJLyogIlBLSVgiICovCis5MzUsCS8qICJQU1BFQ0lGSUVEIiAqLworOTgsCS8qICJSQzItNDAtQ0JDIiAqLworMTY2LAkvKiAiUkMyLTY0LUNCQyIgKi8KKzM3LAkvKiAiUkMyLUNCQyIgKi8KKzM5LAkvKiAiUkMyLUNGQiIgKi8KKzM4LAkvKiAiUkMyLUVDQiIgKi8KKzQwLAkvKiAiUkMyLU9GQiIgKi8KKyA1LAkvKiAiUkM0IiAqLworOTcsCS8qICJSQzQtNDAiICovCis5MTUsCS8qICJSQzQtSE1BQy1NRDUiICovCisxMjAsCS8qICJSQzUtQ0JDIiAqLworMTIyLAkvKiAiUkM1LUNGQiIgKi8KKzEyMSwJLyogIlJDNS1FQ0IiICovCisxMjMsCS8qICJSQzUtT0ZCIiAqLworMTE3LAkvKiAiUklQRU1EMTYwIiAqLworMTI0LAkvKiAiUkxFIiAqLworMTksCS8qICJSU0EiICovCisgNywJLyogIlJTQS1NRDIiICovCiszOTYsCS8qICJSU0EtTUQ0IiAqLworIDgsCS8qICJSU0EtTUQ1IiAqLworOTYsCS8qICJSU0EtTURDMiIgKi8KKzEwNCwJLyogIlJTQS1OUC1NRDUiICovCisxMTksCS8qICJSU0EtUklQRU1EMTYwIiAqLworNDIsCS8qICJSU0EtU0hBIiAqLworNjUsCS8qICJSU0EtU0hBMSIgKi8KKzExNSwJLyogIlJTQS1TSEExLTIiICovCis2NzEsCS8qICJSU0EtU0hBMjI0IiAqLworNjY4LAkvKiAiUlNBLVNIQTI1NiIgKi8KKzY2OSwJLyogIlJTQS1TSEEzODQiICovCis2NzAsCS8qICJSU0EtU0hBNTEyIiAqLworOTE5LAkvKiAiUlNBRVMtT0FFUCIgKi8KKzkxMiwJLyogIlJTQVNTQS1QU1MiICovCis3NzcsCS8qICJTRUVELUNCQyIgKi8KKzc3OSwJLyogIlNFRUQtQ0ZCIiAqLworNzc2LAkvKiAiU0VFRC1FQ0IiICovCis3NzgsCS8qICJTRUVELU9GQiIgKi8KKzQxLAkvKiAiU0hBIiAqLworNjQsCS8qICJTSEExIiAqLworNjc1LAkvKiAiU0hBMjI0IiAqLworNjcyLAkvKiAiU0hBMjU2IiAqLworNjczLAkvKiAiU0hBMzg0IiAqLworNjc0LAkvKiAiU0hBNTEyIiAqLworMTg4LAkvKiAiU01JTUUiICovCisxNjcsCS8qICJTTUlNRS1DQVBTIiAqLworMTAwLAkvKiAiU04iICovCisxNiwJLyogIlNUIiAqLworMTQzLAkvKiAiU1hOZXRJRCIgKi8KKzQ1OCwJLyogIlVJRCIgKi8KKyAwLAkvKiAiVU5ERUYiICovCisxMSwJLyogIlg1MDAiICovCiszNzgsCS8qICJYNTAwYWxnb3JpdGhtcyIgKi8KKzEyLAkvKiAiWDUwOSIgKi8KKzE4NCwJLyogIlg5LTU3IiAqLworMTg1LAkvKiAiWDljbSIgKi8KKzEyNSwJLyogIlpMSUIiICovCis0NzgsCS8qICJhUmVjb3JkIiAqLworMjg5LAkvKiAiYWFDb250cm9scyIgKi8KKzI4NywJLyogImFjLWF1ZGl0RW50aXR5IiAqLworMzk3LAkvKiAiYWMtcHJveHlpbmciICovCisyODgsCS8qICJhYy10YXJnZXRpbmciICovCiszNjgsCS8qICJhY2NlcHRhYmxlUmVzcG9uc2VzIiAqLworNDQ2LAkvKiAiYWNjb3VudCIgKi8KKzM2MywJLyogImFkX3RpbWVzdGFtcGluZyIgKi8KKzM3NiwJLyogImFsZ29yaXRobSIgKi8KKzQwNSwJLyogImFuc2ktWDktNjIiICovCis5MTAsCS8qICJhbnlFeHRlbmRlZEtleVVzYWdlIiAqLworNzQ2LAkvKiAiYW55UG9saWN5IiAqLworMzcwLAkvKiAiYXJjaGl2ZUN1dG9mZiIgKi8KKzQ4NCwJLyogImFzc29jaWF0ZWREb21haW4iICovCis0ODUsCS8qICJhc3NvY2lhdGVkTmFtZSIgKi8KKzUwMSwJLyogImF1ZGlvIiAqLworMTc3LAkvKiAiYXV0aG9yaXR5SW5mb0FjY2VzcyIgKi8KKzkwLAkvKiAiYXV0aG9yaXR5S2V5SWRlbnRpZmllciIgKi8KKzg4MiwJLyogImF1dGhvcml0eVJldm9jYXRpb25MaXN0IiAqLworODcsCS8qICJiYXNpY0NvbnN0cmFpbnRzIiAqLworMzY1LAkvKiAiYmFzaWNPQ1NQUmVzcG9uc2UiICovCisyODUsCS8qICJiaW9tZXRyaWNJbmZvIiAqLworOTIxLAkvKiAiYnJhaW5wb29sUDE2MHIxIiAqLworOTIyLAkvKiAiYnJhaW5wb29sUDE2MHQxIiAqLworOTIzLAkvKiAiYnJhaW5wb29sUDE5MnIxIiAqLworOTI0LAkvKiAiYnJhaW5wb29sUDE5MnQxIiAqLworOTI1LAkvKiAiYnJhaW5wb29sUDIyNHIxIiAqLworOTI2LAkvKiAiYnJhaW5wb29sUDIyNHQxIiAqLworOTI3LAkvKiAiYnJhaW5wb29sUDI1NnIxIiAqLworOTI4LAkvKiAiYnJhaW5wb29sUDI1NnQxIiAqLworOTI5LAkvKiAiYnJhaW5wb29sUDMyMHIxIiAqLworOTMwLAkvKiAiYnJhaW5wb29sUDMyMHQxIiAqLworOTMxLAkvKiAiYnJhaW5wb29sUDM4NHIxIiAqLworOTMyLAkvKiAiYnJhaW5wb29sUDM4NHQxIiAqLworOTMzLAkvKiAiYnJhaW5wb29sUDUxMnIxIiAqLworOTM0LAkvKiAiYnJhaW5wb29sUDUxMnQxIiAqLworNDk0LAkvKiAiYnVpbGRpbmdOYW1lIiAqLworODYwLAkvKiAiYnVzaW5lc3NDYXRlZ29yeSIgKi8KKzY5MSwJLyogImMyb25iMTkxdjQiICovCis2OTIsCS8qICJjMm9uYjE5MXY1IiAqLworNjk3LAkvKiAiYzJvbmIyMzl2NCIgKi8KKzY5OCwJLyogImMyb25iMjM5djUiICovCis2ODQsCS8qICJjMnBuYjE2M3YxIiAqLworNjg1LAkvKiAiYzJwbmIxNjN2MiIgKi8KKzY4NiwJLyogImMycG5iMTYzdjMiICovCis2ODcsCS8qICJjMnBuYjE3NnYxIiAqLworNjkzLAkvKiAiYzJwbmIyMDh3MSIgKi8KKzY5OSwJLyogImMycG5iMjcydzEiICovCis3MDAsCS8qICJjMnBuYjMwNHcxIiAqLworNzAyLAkvKiAiYzJwbmIzNjh3MSIgKi8KKzY4OCwJLyogImMydG5iMTkxdjEiICovCis2ODksCS8qICJjMnRuYjE5MXYyIiAqLworNjkwLAkvKiAiYzJ0bmIxOTF2MyIgKi8KKzY5NCwJLyogImMydG5iMjM5djEiICovCis2OTUsCS8qICJjMnRuYjIzOXYyIiAqLworNjk2LAkvKiAiYzJ0bmIyMzl2MyIgKi8KKzcwMSwJLyogImMydG5iMzU5djEiICovCis3MDMsCS8qICJjMnRuYjQzMXIxIiAqLworODgxLAkvKiAiY0FDZXJ0aWZpY2F0ZSIgKi8KKzQ4MywJLyogImNOQU1FUmVjb3JkIiAqLworMTc5LAkvKiAiY2FJc3N1ZXJzIiAqLworNzg1LAkvKiAiY2FSZXBvc2l0b3J5IiAqLworNDQzLAkvKiAiY2FzZUlnbm9yZUlBNVN0cmluZ1N5bnRheCIgKi8KKzE1MiwJLyogImNlcnRCYWciICovCis2NzcsCS8qICJjZXJ0aWNvbS1hcmMiICovCis3NzEsCS8qICJjZXJ0aWZpY2F0ZUlzc3VlciIgKi8KKzg5LAkvKiAiY2VydGlmaWNhdGVQb2xpY2llcyIgKi8KKzg4MywJLyogImNlcnRpZmljYXRlUmV2b2NhdGlvbkxpc3QiICovCis1NCwJLyogImNoYWxsZW5nZVBhc3N3b3JkIiAqLworNDA3LAkvKiAiY2hhcmFjdGVyaXN0aWMtdHdvLWZpZWxkIiAqLworMzk1LAkvKiAiY2xlYXJhbmNlIiAqLworMTMwLAkvKiAiY2xpZW50QXV0aCIgKi8KKzEzMSwJLyogImNvZGVTaWduaW5nIiAqLworNTAsCS8qICJjb250ZW50VHlwZSIgKi8KKzUzLAkvKiAiY291bnRlcnNpZ25hdHVyZSIgKi8KKzE1MywJLyogImNybEJhZyIgKi8KKzEwMywJLyogImNybERpc3RyaWJ1dGlvblBvaW50cyIgKi8KKzg4LAkvKiAiY3JsTnVtYmVyIiAqLworODg0LAkvKiAiY3Jvc3NDZXJ0aWZpY2F0ZVBhaXIiICovCis4MDYsCS8qICJjcnlwdG9jb20iICovCis4MDUsCS8qICJjcnlwdG9wcm8iICovCis1MDAsCS8qICJkSVRSZWRpcmVjdCIgKi8KKzQ1MSwJLyogImROU0RvbWFpbiIgKi8KKzQ5NSwJLyogImRTQVF1YWxpdHkiICovCis0MzQsCS8qICJkYXRhIiAqLworMzkwLAkvKiAiZGNvYmplY3QiICovCisxNDAsCS8qICJkZWx0YUNSTCIgKi8KKzg5MSwJLyogImRlbHRhUmV2b2NhdGlvbkxpc3QiICovCisxMDcsCS8qICJkZXNjcmlwdGlvbiIgKi8KKzg3MSwJLyogImRlc3RpbmF0aW9uSW5kaWNhdG9yIiAqLworOTUwLAkvKiAiZGgtY29mYWN0b3Ita2RmIiAqLworOTQ5LAkvKiAiZGgtc3RkLWtkZiIgKi8KKzI4LAkvKiAiZGhLZXlBZ3JlZW1lbnQiICovCis5NDQsCS8qICJkaFNpbmdsZVBhc3MtY29mYWN0b3JESC1zaGExa2RmLXNjaGVtZSIgKi8KKzk0NSwJLyogImRoU2luZ2xlUGFzcy1jb2ZhY3RvckRILXNoYTIyNGtkZi1zY2hlbWUiICovCis5NDYsCS8qICJkaFNpbmdsZVBhc3MtY29mYWN0b3JESC1zaGEyNTZrZGYtc2NoZW1lIiAqLworOTQ3LAkvKiAiZGhTaW5nbGVQYXNzLWNvZmFjdG9yREgtc2hhMzg0a2RmLXNjaGVtZSIgKi8KKzk0OCwJLyogImRoU2luZ2xlUGFzcy1jb2ZhY3RvckRILXNoYTUxMmtkZi1zY2hlbWUiICovCis5MzksCS8qICJkaFNpbmdsZVBhc3Mtc3RkREgtc2hhMWtkZi1zY2hlbWUiICovCis5NDAsCS8qICJkaFNpbmdsZVBhc3Mtc3RkREgtc2hhMjI0a2RmLXNjaGVtZSIgKi8KKzk0MSwJLyogImRoU2luZ2xlUGFzcy1zdGRESC1zaGEyNTZrZGYtc2NoZW1lIiAqLworOTQyLAkvKiAiZGhTaW5nbGVQYXNzLXN0ZERILXNoYTM4NGtkZi1zY2hlbWUiICovCis5NDMsCS8qICJkaFNpbmdsZVBhc3Mtc3RkREgtc2hhNTEya2RmLXNjaGVtZSIgKi8KKzkyMCwJLyogImRocHVibGljbnVtYmVyIiAqLworMzgyLAkvKiAiZGlyZWN0b3J5IiAqLworODg3LAkvKiAiZGlzdGluZ3Vpc2hlZE5hbWUiICovCis4OTIsCS8qICJkbWROYW1lIiAqLworMTc0LAkvKiAiZG5RdWFsaWZpZXIiICovCis0NDcsCS8qICJkb2N1bWVudCIgKi8KKzQ3MSwJLyogImRvY3VtZW50QXV0aG9yIiAqLworNDY4LAkvKiAiZG9jdW1lbnRJZGVudGlmaWVyIiAqLworNDcyLAkvKiAiZG9jdW1lbnRMb2NhdGlvbiIgKi8KKzUwMiwJLyogImRvY3VtZW50UHVibGlzaGVyIiAqLworNDQ5LAkvKiAiZG9jdW1lbnRTZXJpZXMiICovCis0NjksCS8qICJkb2N1bWVudFRpdGxlIiAqLworNDcwLAkvKiAiZG9jdW1lbnRWZXJzaW9uIiAqLworMzkyLAkvKiAiZG9tYWluIiAqLworNDUyLAkvKiAiZG9tYWluUmVsYXRlZE9iamVjdCIgKi8KKzgwMiwJLyogImRzYV93aXRoX1NIQTIyNCIgKi8KKzgwMywJLyogImRzYV93aXRoX1NIQTI1NiIgKi8KKzc5MSwJLyogImVjZHNhLXdpdGgtUmVjb21tZW5kZWQiICovCis0MTYsCS8qICJlY2RzYS13aXRoLVNIQTEiICovCis3OTMsCS8qICJlY2RzYS13aXRoLVNIQTIyNCIgKi8KKzc5NCwJLyogImVjZHNhLXdpdGgtU0hBMjU2IiAqLworNzk1LAkvKiAiZWNkc2Etd2l0aC1TSEEzODQiICovCis3OTYsCS8qICJlY2RzYS13aXRoLVNIQTUxMiIgKi8KKzc5MiwJLyogImVjZHNhLXdpdGgtU3BlY2lmaWVkIiAqLworNDgsCS8qICJlbWFpbEFkZHJlc3MiICovCisxMzIsCS8qICJlbWFpbFByb3RlY3Rpb24iICovCis4ODUsCS8qICJlbmhhbmNlZFNlYXJjaEd1aWRlIiAqLworMzg5LAkvKiAiZW50ZXJwcmlzZXMiICovCiszODQsCS8qICJleHBlcmltZW50YWwiICovCisxNzIsCS8qICJleHRSZXEiICovCis1NiwJLyogImV4dGVuZGVkQ2VydGlmaWNhdGVBdHRyaWJ1dGVzIiAqLworMTI2LAkvKiAiZXh0ZW5kZWRLZXlVc2FnZSIgKi8KKzM3MiwJLyogImV4dGVuZGVkU3RhdHVzIiAqLworODY3LAkvKiAiZmFjc2ltaWxlVGVsZXBob25lTnVtYmVyIiAqLworNDYyLAkvKiAiZmF2b3VyaXRlRHJpbmsiICovCis4NTcsCS8qICJmcmVzaGVzdENSTCIgKi8KKzQ1MywJLyogImZyaWVuZGx5Q291bnRyeSIgKi8KKzQ5MCwJLyogImZyaWVuZGx5Q291bnRyeU5hbWUiICovCisxNTYsCS8qICJmcmllbmRseU5hbWUiICovCis1MDksCS8qICJnZW5lcmF0aW9uUXVhbGlmaWVyIiAqLworODE1LAkvKiAiZ29zdC1tYWMiICovCis4MTEsCS8qICJnb3N0MjAwMSIgKi8KKzg1MSwJLyogImdvc3QyMDAxY2MiICovCis4MTMsCS8qICJnb3N0ODkiICovCis4MTQsCS8qICJnb3N0ODktY250IiAqLworODEyLAkvKiAiZ29zdDk0IiAqLworODUwLAkvKiAiZ29zdDk0Y2MiICovCis3OTcsCS8qICJobWFjV2l0aE1ENSIgKi8KKzE2MywJLyogImhtYWNXaXRoU0hBMSIgKi8KKzc5OCwJLyogImhtYWNXaXRoU0hBMjI0IiAqLworNzk5LAkvKiAiaG1hY1dpdGhTSEEyNTYiICovCis4MDAsCS8qICJobWFjV2l0aFNIQTM4NCIgKi8KKzgwMSwJLyogImhtYWNXaXRoU0hBNTEyIiAqLworNDMyLAkvKiAiaG9sZEluc3RydWN0aW9uQ2FsbElzc3VlciIgKi8KKzQzMCwJLyogImhvbGRJbnN0cnVjdGlvbkNvZGUiICovCis0MzEsCS8qICJob2xkSW5zdHJ1Y3Rpb25Ob25lIiAqLworNDMzLAkvKiAiaG9sZEluc3RydWN0aW9uUmVqZWN0IiAqLworNDg2LAkvKiAiaG9tZVBvc3RhbEFkZHJlc3MiICovCis0NzMsCS8qICJob21lVGVsZXBob25lTnVtYmVyIiAqLworNDY2LAkvKiAiaG9zdCIgKi8KKzg4OSwJLyogImhvdXNlSWRlbnRpZmllciIgKi8KKzQ0MiwJLyogImlBNVN0cmluZ1N5bnRheCIgKi8KKzc4MywJLyogImlkLURIQmFzZWRNYWMiICovCis4MjQsCS8qICJpZC1Hb3N0MjgxNDctODktQ3J5cHRvUHJvLUEtUGFyYW1TZXQiICovCis4MjUsCS8qICJpZC1Hb3N0MjgxNDctODktQ3J5cHRvUHJvLUItUGFyYW1TZXQiICovCis4MjYsCS8qICJpZC1Hb3N0MjgxNDctODktQ3J5cHRvUHJvLUMtUGFyYW1TZXQiICovCis4MjcsCS8qICJpZC1Hb3N0MjgxNDctODktQ3J5cHRvUHJvLUQtUGFyYW1TZXQiICovCis4MTksCS8qICJpZC1Hb3N0MjgxNDctODktQ3J5cHRvUHJvLUtleU1lc2hpbmciICovCis4MjksCS8qICJpZC1Hb3N0MjgxNDctODktQ3J5cHRvUHJvLU9zY2FyLTEtMC1QYXJhbVNldCIgKi8KKzgyOCwJLyogImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tT3NjYXItMS0xLVBhcmFtU2V0IiAqLworODMwLAkvKiAiaWQtR29zdDI4MTQ3LTg5LUNyeXB0b1Byby1SSUMtMS1QYXJhbVNldCIgKi8KKzgyMCwJLyogImlkLUdvc3QyODE0Ny04OS1Ob25lLUtleU1lc2hpbmciICovCis4MjMsCS8qICJpZC1Hb3N0MjgxNDctODktVGVzdFBhcmFtU2V0IiAqLworODQ5LAkvKiAiaWQtR29zdDI4MTQ3LTg5LWNjIiAqLworODQwLAkvKiAiaWQtR29zdFIzNDEwLTIwMDEtQ3J5cHRvUHJvLUEtUGFyYW1TZXQiICovCis4NDEsCS8qICJpZC1Hb3N0UjM0MTAtMjAwMS1DcnlwdG9Qcm8tQi1QYXJhbVNldCIgKi8KKzg0MiwJLyogImlkLUdvc3RSMzQxMC0yMDAxLUNyeXB0b1Byby1DLVBhcmFtU2V0IiAqLworODQzLAkvKiAiaWQtR29zdFIzNDEwLTIwMDEtQ3J5cHRvUHJvLVhjaEEtUGFyYW1TZXQiICovCis4NDQsCS8qICJpZC1Hb3N0UjM0MTAtMjAwMS1DcnlwdG9Qcm8tWGNoQi1QYXJhbVNldCIgKi8KKzg1NCwJLyogImlkLUdvc3RSMzQxMC0yMDAxLVBhcmFtU2V0LWNjIiAqLworODM5LAkvKiAiaWQtR29zdFIzNDEwLTIwMDEtVGVzdFBhcmFtU2V0IiAqLworODE3LAkvKiAiaWQtR29zdFIzNDEwLTIwMDFESCIgKi8KKzgzMiwJLyogImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tQS1QYXJhbVNldCIgKi8KKzgzMywJLyogImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tQi1QYXJhbVNldCIgKi8KKzgzNCwJLyogImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tQy1QYXJhbVNldCIgKi8KKzgzNSwJLyogImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tRC1QYXJhbVNldCIgKi8KKzgzNiwJLyogImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tWGNoQS1QYXJhbVNldCIgKi8KKzgzNywJLyogImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tWGNoQi1QYXJhbVNldCIgKi8KKzgzOCwJLyogImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tWGNoQy1QYXJhbVNldCIgKi8KKzgzMSwJLyogImlkLUdvc3RSMzQxMC05NC1UZXN0UGFyYW1TZXQiICovCis4NDUsCS8qICJpZC1Hb3N0UjM0MTAtOTQtYSIgKi8KKzg0NiwJLyogImlkLUdvc3RSMzQxMC05NC1hQmlzIiAqLworODQ3LAkvKiAiaWQtR29zdFIzNDEwLTk0LWIiICovCis4NDgsCS8qICJpZC1Hb3N0UjM0MTAtOTQtYkJpcyIgKi8KKzgxOCwJLyogImlkLUdvc3RSMzQxMC05NERIIiAqLworODIyLAkvKiAiaWQtR29zdFIzNDExLTk0LUNyeXB0b1Byb1BhcmFtU2V0IiAqLworODIxLAkvKiAiaWQtR29zdFIzNDExLTk0LVRlc3RQYXJhbVNldCIgKi8KKzgwNywJLyogImlkLUdvc3RSMzQxMS05NC13aXRoLUdvc3RSMzQxMC0yMDAxIiAqLworODUzLAkvKiAiaWQtR29zdFIzNDExLTk0LXdpdGgtR29zdFIzNDEwLTIwMDEtY2MiICovCis4MDgsCS8qICJpZC1Hb3N0UjM0MTEtOTQtd2l0aC1Hb3N0UjM0MTAtOTQiICovCis4NTIsCS8qICJpZC1Hb3N0UjM0MTEtOTQtd2l0aC1Hb3N0UjM0MTAtOTQtY2MiICovCis4MTAsCS8qICJpZC1ITUFDR29zdFIzNDExLTk0IiAqLworNzgyLAkvKiAiaWQtUGFzc3dvcmRCYXNlZE1BQyIgKi8KKzI2NiwJLyogImlkLWFjYSIgKi8KKzM1NSwJLyogImlkLWFjYS1hY2Nlc3NJZGVudGl0eSIgKi8KKzM1NCwJLyogImlkLWFjYS1hdXRoZW50aWNhdGlvbkluZm8iICovCiszNTYsCS8qICJpZC1hY2EtY2hhcmdpbmdJZGVudGl0eSIgKi8KKzM5OSwJLyogImlkLWFjYS1lbmNBdHRycyIgKi8KKzM1NywJLyogImlkLWFjYS1ncm91cCIgKi8KKzM1OCwJLyogImlkLWFjYS1yb2xlIiAqLworMTc2LAkvKiAiaWQtYWQiICovCis4OTYsCS8qICJpZC1hZXMxMjgtQ0NNIiAqLworODk1LAkvKiAiaWQtYWVzMTI4LUdDTSIgKi8KKzc4OCwJLyogImlkLWFlczEyOC13cmFwIiAqLworODk3LAkvKiAiaWQtYWVzMTI4LXdyYXAtcGFkIiAqLworODk5LAkvKiAiaWQtYWVzMTkyLUNDTSIgKi8KKzg5OCwJLyogImlkLWFlczE5Mi1HQ00iICovCis3ODksCS8qICJpZC1hZXMxOTItd3JhcCIgKi8KKzkwMCwJLyogImlkLWFlczE5Mi13cmFwLXBhZCIgKi8KKzkwMiwJLyogImlkLWFlczI1Ni1DQ00iICovCis5MDEsCS8qICJpZC1hZXMyNTYtR0NNIiAqLworNzkwLAkvKiAiaWQtYWVzMjU2LXdyYXAiICovCis5MDMsCS8qICJpZC1hZXMyNTYtd3JhcC1wYWQiICovCisyNjIsCS8qICJpZC1hbGciICovCis4OTMsCS8qICJpZC1hbGctUFdSSS1LRUsiICovCiszMjMsCS8qICJpZC1hbGctZGVzNDAiICovCiszMjYsCS8qICJpZC1hbGctZGgtcG9wIiAqLworMzI1LAkvKiAiaWQtYWxnLWRoLXNpZy1obWFjLXNoYTEiICovCiszMjQsCS8qICJpZC1hbGctbm9TaWduYXR1cmUiICovCis5MDcsCS8qICJpZC1jYW1lbGxpYTEyOC13cmFwIiAqLworOTA4LAkvKiAiaWQtY2FtZWxsaWExOTItd3JhcCIgKi8KKzkwOSwJLyogImlkLWNhbWVsbGlhMjU2LXdyYXAiICovCisyNjgsCS8qICJpZC1jY3QiICovCiszNjEsCS8qICJpZC1jY3QtUEtJRGF0YSIgKi8KKzM2MiwJLyogImlkLWNjdC1QS0lSZXNwb25zZSIgKi8KKzM2MCwJLyogImlkLWNjdC1jcnMiICovCis4MSwJLyogImlkLWNlIiAqLworNjgwLAkvKiAiaWQtY2hhcmFjdGVyaXN0aWMtdHdvLWJhc2lzIiAqLworMjYzLAkvKiAiaWQtY21jIiAqLworMzM0LAkvKiAiaWQtY21jLWFkZEV4dGVuc2lvbnMiICovCiszNDYsCS8qICJpZC1jbWMtY29uZmlybUNlcnRBY2NlcHRhbmNlIiAqLworMzMwLAkvKiAiaWQtY21jLWRhdGFSZXR1cm4iICovCiszMzYsCS8qICJpZC1jbWMtZGVjcnlwdGVkUE9QIiAqLworMzM1LAkvKiAiaWQtY21jLWVuY3J5cHRlZFBPUCIgKi8KKzMzOSwJLyogImlkLWNtYy1nZXRDUkwiICovCiszMzgsCS8qICJpZC1jbWMtZ2V0Q2VydCIgKi8KKzMyOCwJLyogImlkLWNtYy1pZGVudGlmaWNhdGlvbiIgKi8KKzMyOSwJLyogImlkLWNtYy1pZGVudGl0eVByb29mIiAqLworMzM3LAkvKiAiaWQtY21jLWxyYVBPUFdpdG5lc3MiICovCiszNDQsCS8qICJpZC1jbWMtcG9wTGlua1JhbmRvbSIgKi8KKzM0NSwJLyogImlkLWNtYy1wb3BMaW5rV2l0bmVzcyIgKi8KKzM0MywJLyogImlkLWNtYy1xdWVyeVBlbmRpbmciICovCiszMzMsCS8qICJpZC1jbWMtcmVjaXBpZW50Tm9uY2UiICovCiszNDEsCS8qICJpZC1jbWMtcmVnSW5mbyIgKi8KKzM0MiwJLyogImlkLWNtYy1yZXNwb25zZUluZm8iICovCiszNDAsCS8qICJpZC1jbWMtcmV2b2tlUmVxdWVzdCIgKi8KKzMzMiwJLyogImlkLWNtYy1zZW5kZXJOb25jZSIgKi8KKzMyNywJLyogImlkLWNtYy1zdGF0dXNJbmZvIiAqLworMzMxLAkvKiAiaWQtY21jLXRyYW5zYWN0aW9uSWQiICovCis3ODcsCS8qICJpZC1jdC1hc2NpaVRleHRXaXRoQ1JMRiIgKi8KKzQwOCwJLyogImlkLWVjUHVibGljS2V5IiAqLworNTA4LAkvKiAiaWQtaGV4LW11bHRpcGFydC1tZXNzYWdlIiAqLworNTA3LAkvKiAiaWQtaGV4LXBhcnRpYWwtbWVzc2FnZSIgKi8KKzI2MCwJLyogImlkLWl0IiAqLworMzAyLAkvKiAiaWQtaXQtY2FLZXlVcGRhdGVJbmZvIiAqLworMjk4LAkvKiAiaWQtaXQtY2FQcm90RW5jQ2VydCIgKi8KKzMxMSwJLyogImlkLWl0LWNvbmZpcm1XYWl0VGltZSIgKi8KKzMwMywJLyogImlkLWl0LWN1cnJlbnRDUkwiICovCiszMDAsCS8qICJpZC1pdC1lbmNLZXlQYWlyVHlwZXMiICovCiszMTAsCS8qICJpZC1pdC1pbXBsaWNpdENvbmZpcm0iICovCiszMDgsCS8qICJpZC1pdC1rZXlQYWlyUGFyYW1SZXAiICovCiszMDcsCS8qICJpZC1pdC1rZXlQYWlyUGFyYW1SZXEiICovCiszMTIsCS8qICJpZC1pdC1vcmlnUEtJTWVzc2FnZSIgKi8KKzMwMSwJLyogImlkLWl0LXByZWZlcnJlZFN5bW1BbGciICovCiszMDksCS8qICJpZC1pdC1yZXZQYXNzcGhyYXNlIiAqLworMjk5LAkvKiAiaWQtaXQtc2lnbktleVBhaXJUeXBlcyIgKi8KKzMwNSwJLyogImlkLWl0LXN1YnNjcmlwdGlvblJlcXVlc3QiICovCiszMDYsCS8qICJpZC1pdC1zdWJzY3JpcHRpb25SZXNwb25zZSIgKi8KKzc4NCwJLyogImlkLWl0LXN1cHBMYW5nVGFncyIgKi8KKzMwNCwJLyogImlkLWl0LXVuc3VwcG9ydGVkT0lEcyIgKi8KKzEyOCwJLyogImlkLWtwIiAqLworMjgwLAkvKiAiaWQtbW9kLWF0dHJpYnV0ZS1jZXJ0IiAqLworMjc0LAkvKiAiaWQtbW9kLWNtYyIgKi8KKzI3NywJLyogImlkLW1vZC1jbXAiICovCisyODQsCS8qICJpZC1tb2QtY21wMjAwMCIgKi8KKzI3MywJLyogImlkLW1vZC1jcm1mIiAqLworMjgzLAkvKiAiaWQtbW9kLWR2Y3MiICovCisyNzUsCS8qICJpZC1tb2Qta2VhLXByb2ZpbGUtODgiICovCisyNzYsCS8qICJpZC1tb2Qta2VhLXByb2ZpbGUtOTMiICovCisyODIsCS8qICJpZC1tb2Qtb2NzcCIgKi8KKzI3OCwJLyogImlkLW1vZC1xdWFsaWZpZWQtY2VydC04OCIgKi8KKzI3OSwJLyogImlkLW1vZC1xdWFsaWZpZWQtY2VydC05MyIgKi8KKzI4MSwJLyogImlkLW1vZC10aW1lc3RhbXAtcHJvdG9jb2wiICovCisyNjQsCS8qICJpZC1vbiIgKi8KKzg1OCwJLyogImlkLW9uLXBlcm1hbmVudElkZW50aWZpZXIiICovCiszNDcsCS8qICJpZC1vbi1wZXJzb25hbERhdGEiICovCisyNjUsCS8qICJpZC1wZGEiICovCiszNTIsCS8qICJpZC1wZGEtY291bnRyeU9mQ2l0aXplbnNoaXAiICovCiszNTMsCS8qICJpZC1wZGEtY291bnRyeU9mUmVzaWRlbmNlIiAqLworMzQ4LAkvKiAiaWQtcGRhLWRhdGVPZkJpcnRoIiAqLworMzUxLAkvKiAiaWQtcGRhLWdlbmRlciIgKi8KKzM0OSwJLyogImlkLXBkYS1wbGFjZU9mQmlydGgiICovCisxNzUsCS8qICJpZC1wZSIgKi8KKzI2MSwJLyogImlkLXBraXAiICovCisyNTgsCS8qICJpZC1wa2l4LW1vZCIgKi8KKzI2OSwJLyogImlkLXBraXgxLWV4cGxpY2l0LTg4IiAqLworMjcxLAkvKiAiaWQtcGtpeDEtZXhwbGljaXQtOTMiICovCisyNzAsCS8qICJpZC1wa2l4MS1pbXBsaWNpdC04OCIgKi8KKzI3MiwJLyogImlkLXBraXgxLWltcGxpY2l0LTkzIiAqLworNjYyLAkvKiAiaWQtcHBsIiAqLworNjY0LAkvKiAiaWQtcHBsLWFueUxhbmd1YWdlIiAqLworNjY3LAkvKiAiaWQtcHBsLWluZGVwZW5kZW50IiAqLworNjY1LAkvKiAiaWQtcHBsLWluaGVyaXRBbGwiICovCisyNjcsCS8qICJpZC1xY3MiICovCiszNTksCS8qICJpZC1xY3MtcGtpeFFDU3ludGF4LXYxIiAqLworMjU5LAkvKiAiaWQtcXQiICovCisxNjQsCS8qICJpZC1xdC1jcHMiICovCisxNjUsCS8qICJpZC1xdC11bm90aWNlIiAqLworMzEzLAkvKiAiaWQtcmVnQ3RybCIgKi8KKzMxNiwJLyogImlkLXJlZ0N0cmwtYXV0aGVudGljYXRvciIgKi8KKzMxOSwJLyogImlkLXJlZ0N0cmwtb2xkQ2VydElEIiAqLworMzE4LAkvKiAiaWQtcmVnQ3RybC1wa2lBcmNoaXZlT3B0aW9ucyIgKi8KKzMxNywJLyogImlkLXJlZ0N0cmwtcGtpUHVibGljYXRpb25JbmZvIiAqLworMzIwLAkvKiAiaWQtcmVnQ3RybC1wcm90b2NvbEVuY3JLZXkiICovCiszMTUsCS8qICJpZC1yZWdDdHJsLXJlZ1Rva2VuIiAqLworMzE0LAkvKiAiaWQtcmVnSW5mbyIgKi8KKzMyMiwJLyogImlkLXJlZ0luZm8tY2VydFJlcSIgKi8KKzMyMSwJLyogImlkLXJlZ0luZm8tdXRmOFBhaXJzIiAqLworNTEyLAkvKiAiaWQtc2V0IiAqLworMTkxLAkvKiAiaWQtc21pbWUtYWEiICovCisyMTUsCS8qICJpZC1zbWltZS1hYS1jb250ZW50SGludCIgKi8KKzIxOCwJLyogImlkLXNtaW1lLWFhLWNvbnRlbnRJZGVudGlmaWVyIiAqLworMjIxLAkvKiAiaWQtc21pbWUtYWEtY29udGVudFJlZmVyZW5jZSIgKi8KKzI0MCwJLyogImlkLXNtaW1lLWFhLWR2Y3MtZHZjIiAqLworMjE3LAkvKiAiaWQtc21pbWUtYWEtZW5jYXBDb250ZW50VHlwZSIgKi8KKzIyMiwJLyogImlkLXNtaW1lLWFhLWVuY3J5cEtleVByZWYiICovCisyMjAsCS8qICJpZC1zbWltZS1hYS1lcXVpdmFsZW50TGFiZWxzIiAqLworMjMyLAkvKiAiaWQtc21pbWUtYWEtZXRzLUNlcnRpZmljYXRlUmVmcyIgKi8KKzIzMywJLyogImlkLXNtaW1lLWFhLWV0cy1SZXZvY2F0aW9uUmVmcyIgKi8KKzIzOCwJLyogImlkLXNtaW1lLWFhLWV0cy1hcmNoaXZlVGltZVN0YW1wIiAqLworMjM3LAkvKiAiaWQtc21pbWUtYWEtZXRzLWNlcnRDUkxUaW1lc3RhbXAiICovCisyMzQsCS8qICJpZC1zbWltZS1hYS1ldHMtY2VydFZhbHVlcyIgKi8KKzIyNywJLyogImlkLXNtaW1lLWFhLWV0cy1jb21taXRtZW50VHlwZSIgKi8KKzIzMSwJLyogImlkLXNtaW1lLWFhLWV0cy1jb250ZW50VGltZXN0YW1wIiAqLworMjM2LAkvKiAiaWQtc21pbWUtYWEtZXRzLWVzY1RpbWVTdGFtcCIgKi8KKzIzMCwJLyogImlkLXNtaW1lLWFhLWV0cy1vdGhlclNpZ0NlcnQiICovCisyMzUsCS8qICJpZC1zbWltZS1hYS1ldHMtcmV2b2NhdGlvblZhbHVlcyIgKi8KKzIyNiwJLyogImlkLXNtaW1lLWFhLWV0cy1zaWdQb2xpY3lJZCIgKi8KKzIyOSwJLyogImlkLXNtaW1lLWFhLWV0cy1zaWduZXJBdHRyIiAqLworMjI4LAkvKiAiaWQtc21pbWUtYWEtZXRzLXNpZ25lckxvY2F0aW9uIiAqLworMjE5LAkvKiAiaWQtc21pbWUtYWEtbWFjVmFsdWUiICovCisyMTQsCS8qICJpZC1zbWltZS1hYS1tbEV4cGFuZEhpc3RvcnkiICovCisyMTYsCS8qICJpZC1zbWltZS1hYS1tc2dTaWdEaWdlc3QiICovCisyMTIsCS8qICJpZC1zbWltZS1hYS1yZWNlaXB0UmVxdWVzdCIgKi8KKzIxMywJLyogImlkLXNtaW1lLWFhLXNlY3VyaXR5TGFiZWwiICovCisyMzksCS8qICJpZC1zbWltZS1hYS1zaWduYXR1cmVUeXBlIiAqLworMjIzLAkvKiAiaWQtc21pbWUtYWEtc2lnbmluZ0NlcnRpZmljYXRlIiAqLworMjI0LAkvKiAiaWQtc21pbWUtYWEtc21pbWVFbmNyeXB0Q2VydHMiICovCisyMjUsCS8qICJpZC1zbWltZS1hYS10aW1lU3RhbXBUb2tlbiIgKi8KKzE5MiwJLyogImlkLXNtaW1lLWFsZyIgKi8KKzI0MywJLyogImlkLXNtaW1lLWFsZy0zREVTd3JhcCIgKi8KKzI0NiwJLyogImlkLXNtaW1lLWFsZy1DTVMzREVTd3JhcCIgKi8KKzI0NywJLyogImlkLXNtaW1lLWFsZy1DTVNSQzJ3cmFwIiAqLworMjQ1LAkvKiAiaWQtc21pbWUtYWxnLUVTREgiICovCisyNDEsCS8qICJpZC1zbWltZS1hbGctRVNESHdpdGgzREVTIiAqLworMjQyLAkvKiAiaWQtc21pbWUtYWxnLUVTREh3aXRoUkMyIiAqLworMjQ0LAkvKiAiaWQtc21pbWUtYWxnLVJDMndyYXAiICovCisxOTMsCS8qICJpZC1zbWltZS1jZCIgKi8KKzI0OCwJLyogImlkLXNtaW1lLWNkLWxkYXAiICovCisxOTAsCS8qICJpZC1zbWltZS1jdCIgKi8KKzIxMCwJLyogImlkLXNtaW1lLWN0LURWQ1NSZXF1ZXN0RGF0YSIgKi8KKzIxMSwJLyogImlkLXNtaW1lLWN0LURWQ1NSZXNwb25zZURhdGEiICovCisyMDgsCS8qICJpZC1zbWltZS1jdC1URFRJbmZvIiAqLworMjA3LAkvKiAiaWQtc21pbWUtY3QtVFNUSW5mbyIgKi8KKzIwNSwJLyogImlkLXNtaW1lLWN0LWF1dGhEYXRhIiAqLworNzg2LAkvKiAiaWQtc21pbWUtY3QtY29tcHJlc3NlZERhdGEiICovCisyMDksCS8qICJpZC1zbWltZS1jdC1jb250ZW50SW5mbyIgKi8KKzIwNiwJLyogImlkLXNtaW1lLWN0LXB1Ymxpc2hDZXJ0IiAqLworMjA0LAkvKiAiaWQtc21pbWUtY3QtcmVjZWlwdCIgKi8KKzE5NSwJLyogImlkLXNtaW1lLWN0aSIgKi8KKzI1NSwJLyogImlkLXNtaW1lLWN0aS1ldHMtcHJvb2ZPZkFwcHJvdmFsIiAqLworMjU2LAkvKiAiaWQtc21pbWUtY3RpLWV0cy1wcm9vZk9mQ3JlYXRpb24iICovCisyNTMsCS8qICJpZC1zbWltZS1jdGktZXRzLXByb29mT2ZEZWxpdmVyeSIgKi8KKzI1MSwJLyogImlkLXNtaW1lLWN0aS1ldHMtcHJvb2ZPZk9yaWdpbiIgKi8KKzI1MiwJLyogImlkLXNtaW1lLWN0aS1ldHMtcHJvb2ZPZlJlY2VpcHQiICovCisyNTQsCS8qICJpZC1zbWltZS1jdGktZXRzLXByb29mT2ZTZW5kZXIiICovCisxODksCS8qICJpZC1zbWltZS1tb2QiICovCisxOTYsCS8qICJpZC1zbWltZS1tb2QtY21zIiAqLworMTk3LAkvKiAiaWQtc21pbWUtbW9kLWVzcyIgKi8KKzIwMiwJLyogImlkLXNtaW1lLW1vZC1ldHMtZVNpZ1BvbGljeS04OCIgKi8KKzIwMywJLyogImlkLXNtaW1lLW1vZC1ldHMtZVNpZ1BvbGljeS05NyIgKi8KKzIwMCwJLyogImlkLXNtaW1lLW1vZC1ldHMtZVNpZ25hdHVyZS04OCIgKi8KKzIwMSwJLyogImlkLXNtaW1lLW1vZC1ldHMtZVNpZ25hdHVyZS05NyIgKi8KKzE5OSwJLyogImlkLXNtaW1lLW1vZC1tc2ctdjMiICovCisxOTgsCS8qICJpZC1zbWltZS1tb2Qtb2lkIiAqLworMTk0LAkvKiAiaWQtc21pbWUtc3BxIiAqLworMjUwLAkvKiAiaWQtc21pbWUtc3BxLWV0cy1zcXQtdW5vdGljZSIgKi8KKzI0OSwJLyogImlkLXNtaW1lLXNwcS1ldHMtc3F0LXVyaSIgKi8KKzY3NiwJLyogImlkZW50aWZpZWQtb3JnYW5pemF0aW9uIiAqLworNDYxLAkvKiAiaW5mbyIgKi8KKzc0OCwJLyogImluaGliaXRBbnlQb2xpY3kiICovCisxMDEsCS8qICJpbml0aWFscyIgKi8KKzY0NywJLyogImludGVybmF0aW9uYWwtb3JnYW5pemF0aW9ucyIgKi8KKzg2OSwJLyogImludGVybmF0aW9uYWxpU0ROTnVtYmVyIiAqLworMTQyLAkvKiAiaW52YWxpZGl0eURhdGUiICovCisyOTQsCS8qICJpcHNlY0VuZFN5c3RlbSIgKi8KKzI5NSwJLyogImlwc2VjVHVubmVsIiAqLworMjk2LAkvKiAiaXBzZWNVc2VyIiAqLworODYsCS8qICJpc3N1ZXJBbHROYW1lIiAqLworNzcwLAkvKiAiaXNzdWluZ0Rpc3RyaWJ1dGlvblBvaW50IiAqLworNDkyLAkvKiAiamFuZXRNYWlsYm94IiAqLworMTUwLAkvKiAia2V5QmFnIiAqLworODMsCS8qICJrZXlVc2FnZSIgKi8KKzQ3NywJLyogImxhc3RNb2RpZmllZEJ5IiAqLworNDc2LAkvKiAibGFzdE1vZGlmaWVkVGltZSIgKi8KKzE1NywJLyogImxvY2FsS2V5SUQiICovCis0ODAsCS8qICJtWFJlY29yZCIgKi8KKzQ2MCwJLyogIm1haWwiICovCis0OTMsCS8qICJtYWlsUHJlZmVyZW5jZU9wdGlvbiIgKi8KKzQ2NywJLyogIm1hbmFnZXIiICovCis4MDksCS8qICJtZF9nb3N0OTQiICovCis4NzUsCS8qICJtZW1iZXIiICovCisxODIsCS8qICJtZW1iZXItYm9keSIgKi8KKzUxLAkvKiAibWVzc2FnZURpZ2VzdCIgKi8KKzM4MywJLyogIm1nbXQiICovCis1MDQsCS8qICJtaW1lLW1ocyIgKi8KKzUwNiwJLyogIm1pbWUtbWhzLWJvZGllcyIgKi8KKzUwNSwJLyogIm1pbWUtbWhzLWhlYWRpbmdzIiAqLworNDg4LAkvKiAibW9iaWxlVGVsZXBob25lTnVtYmVyIiAqLworMTM2LAkvKiAibXNDVExTaWduIiAqLworMTM1LAkvKiAibXNDb2RlQ29tIiAqLworMTM0LAkvKiAibXNDb2RlSW5kIiAqLworMTM4LAkvKiAibXNFRlMiICovCisxNzEsCS8qICJtc0V4dFJlcSIgKi8KKzEzNywJLyogIm1zU0dDIiAqLworNjQ4LAkvKiAibXNTbWFydGNhcmRMb2dpbiIgKi8KKzY0OSwJLyogIm1zVVBOIiAqLworNDgxLAkvKiAiblNSZWNvcmQiICovCisxNzMsCS8qICJuYW1lIiAqLworNjY2LAkvKiAibmFtZUNvbnN0cmFpbnRzIiAqLworMzY5LAkvKiAibm9DaGVjayIgKi8KKzQwMywJLyogIm5vUmV2QXZhaWwiICovCis3MiwJLyogIm5zQmFzZVVybCIgKi8KKzc2LAkvKiAibnNDYVBvbGljeVVybCIgKi8KKzc0LAkvKiAibnNDYVJldm9jYXRpb25VcmwiICovCis1OCwJLyogIm5zQ2VydEV4dCIgKi8KKzc5LAkvKiAibnNDZXJ0U2VxdWVuY2UiICovCis3MSwJLyogIm5zQ2VydFR5cGUiICovCis3OCwJLyogIm5zQ29tbWVudCIgKi8KKzU5LAkvKiAibnNEYXRhVHlwZSIgKi8KKzc1LAkvKiAibnNSZW5ld2FsVXJsIiAqLworNzMsCS8qICJuc1Jldm9jYXRpb25VcmwiICovCisxMzksCS8qICJuc1NHQyIgKi8KKzc3LAkvKiAibnNTc2xTZXJ2ZXJOYW1lIiAqLworNjgxLAkvKiAib25CYXNpcyIgKi8KKzQ5MSwJLyogIm9yZ2FuaXphdGlvbmFsU3RhdHVzIiAqLworNDc1LAkvKiAib3RoZXJNYWlsYm94IiAqLworODc2LAkvKiAib3duZXIiICovCis0ODksCS8qICJwYWdlclRlbGVwaG9uZU51bWJlciIgKi8KKzM3NCwJLyogInBhdGgiICovCisxMTIsCS8qICJwYmVXaXRoTUQ1QW5kQ2FzdDVDQkMiICovCis0OTksCS8qICJwZXJzb25hbFNpZ25hdHVyZSIgKi8KKzQ4NywJLyogInBlcnNvbmFsVGl0bGUiICovCis0NjQsCS8qICJwaG90byIgKi8KKzg2MywJLyogInBoeXNpY2FsRGVsaXZlcnlPZmZpY2VOYW1lIiAqLworNDM3LAkvKiAicGlsb3QiICovCis0MzksCS8qICJwaWxvdEF0dHJpYnV0ZVN5bnRheCIgKi8KKzQzOCwJLyogInBpbG90QXR0cmlidXRlVHlwZSIgKi8KKzQ3OSwJLyogInBpbG90QXR0cmlidXRlVHlwZTI3IiAqLworNDU2LAkvKiAicGlsb3REU0EiICovCis0NDEsCS8qICJwaWxvdEdyb3VwcyIgKi8KKzQ0NCwJLyogInBpbG90T2JqZWN0IiAqLworNDQwLAkvKiAicGlsb3RPYmplY3RDbGFzcyIgKi8KKzQ1NSwJLyogInBpbG90T3JnYW5pemF0aW9uIiAqLworNDQ1LAkvKiAicGlsb3RQZXJzb24iICovCisgMiwJLyogInBrY3MiICovCisxODYsCS8qICJwa2NzMSIgKi8KKzI3LAkvKiAicGtjczMiICovCisxODcsCS8qICJwa2NzNSIgKi8KKzIwLAkvKiAicGtjczciICovCisyMSwJLyogInBrY3M3LWRhdGEiICovCisyNSwJLyogInBrY3M3LWRpZ2VzdERhdGEiICovCisyNiwJLyogInBrY3M3LWVuY3J5cHRlZERhdGEiICovCisyMywJLyogInBrY3M3LWVudmVsb3BlZERhdGEiICovCisyNCwJLyogInBrY3M3LXNpZ25lZEFuZEVudmVsb3BlZERhdGEiICovCisyMiwJLyogInBrY3M3LXNpZ25lZERhdGEiICovCisxNTEsCS8qICJwa2NzOFNocm91ZGVkS2V5QmFnIiAqLworNDcsCS8qICJwa2NzOSIgKi8KKzQwMSwJLyogInBvbGljeUNvbnN0cmFpbnRzIiAqLworNzQ3LAkvKiAicG9saWN5TWFwcGluZ3MiICovCis4NjIsCS8qICJwb3N0T2ZmaWNlQm94IiAqLworODYxLAkvKiAicG9zdGFsQWRkcmVzcyIgKi8KKzY2MSwJLyogInBvc3RhbENvZGUiICovCis2ODMsCS8qICJwcEJhc2lzIiAqLworODcyLAkvKiAicHJlZmVycmVkRGVsaXZlcnlNZXRob2QiICovCis4NzMsCS8qICJwcmVzZW50YXRpb25BZGRyZXNzIiAqLworODE2LAkvKiAicHJmLWdvc3RyMzQxMS05NCIgKi8KKzQwNiwJLyogInByaW1lLWZpZWxkIiAqLworNDA5LAkvKiAicHJpbWUxOTJ2MSIgKi8KKzQxMCwJLyogInByaW1lMTkydjIiICovCis0MTEsCS8qICJwcmltZTE5MnYzIiAqLworNDEyLAkvKiAicHJpbWUyMzl2MSIgKi8KKzQxMywJLyogInByaW1lMjM5djIiICovCis0MTQsCS8qICJwcmltZTIzOXYzIiAqLworNDE1LAkvKiAicHJpbWUyNTZ2MSIgKi8KKzM4NSwJLyogInByaXZhdGUiICovCis4NCwJLyogInByaXZhdGVLZXlVc2FnZVBlcmlvZCIgKi8KKzg4NiwJLyogInByb3RvY29sSW5mb3JtYXRpb24iICovCis2NjMsCS8qICJwcm94eUNlcnRJbmZvIiAqLworNTEwLAkvKiAicHNldWRvbnltIiAqLworNDM1LAkvKiAicHNzIiAqLworMjg2LAkvKiAicWNTdGF0ZW1lbnRzIiAqLworNDU3LAkvKiAicXVhbGl0eUxhYmVsbGVkRGF0YSIgKi8KKzQ1MCwJLyogInJGQzgyMmxvY2FsUGFydCIgKi8KKzg3MCwJLyogInJlZ2lzdGVyZWRBZGRyZXNzIiAqLworNDAwLAkvKiAicm9sZSIgKi8KKzg3NywJLyogInJvbGVPY2N1cGFudCIgKi8KKzQ0OCwJLyogInJvb20iICovCis0NjMsCS8qICJyb29tTnVtYmVyIiAqLworIDYsCS8qICJyc2FFbmNyeXB0aW9uIiAqLworNjQ0LAkvKiAicnNhT0FFUEVuY3J5cHRpb25TRVQiICovCiszNzcsCS8qICJyc2FTaWduYXR1cmUiICovCisgMSwJLyogInJzYWRzaSIgKi8KKzQ4MiwJLyogInNPQVJlY29yZCIgKi8KKzE1NSwJLyogInNhZmVDb250ZW50c0JhZyIgKi8KKzI5MSwJLyogInNiZ3AtYXV0b25vbW91c1N5c051bSIgKi8KKzI5MCwJLyogInNiZ3AtaXBBZGRyQmxvY2siICovCisyOTIsCS8qICJzYmdwLXJvdXRlcklkZW50aWZpZXIiICovCisxNTksCS8qICJzZHNpQ2VydGlmaWNhdGUiICovCis4NTksCS8qICJzZWFyY2hHdWlkZSIgKi8KKzcwNCwJLyogInNlY3AxMTJyMSIgKi8KKzcwNSwJLyogInNlY3AxMTJyMiIgKi8KKzcwNiwJLyogInNlY3AxMjhyMSIgKi8KKzcwNywJLyogInNlY3AxMjhyMiIgKi8KKzcwOCwJLyogInNlY3AxNjBrMSIgKi8KKzcwOSwJLyogInNlY3AxNjByMSIgKi8KKzcxMCwJLyogInNlY3AxNjByMiIgKi8KKzcxMSwJLyogInNlY3AxOTJrMSIgKi8KKzcxMiwJLyogInNlY3AyMjRrMSIgKi8KKzcxMywJLyogInNlY3AyMjRyMSIgKi8KKzcxNCwJLyogInNlY3AyNTZrMSIgKi8KKzcxNSwJLyogInNlY3AzODRyMSIgKi8KKzcxNiwJLyogInNlY3A1MjFyMSIgKi8KKzE1NCwJLyogInNlY3JldEJhZyIgKi8KKzQ3NCwJLyogInNlY3JldGFyeSIgKi8KKzcxNywJLyogInNlY3QxMTNyMSIgKi8KKzcxOCwJLyogInNlY3QxMTNyMiIgKi8KKzcxOSwJLyogInNlY3QxMzFyMSIgKi8KKzcyMCwJLyogInNlY3QxMzFyMiIgKi8KKzcyMSwJLyogInNlY3QxNjNrMSIgKi8KKzcyMiwJLyogInNlY3QxNjNyMSIgKi8KKzcyMywJLyogInNlY3QxNjNyMiIgKi8KKzcyNCwJLyogInNlY3QxOTNyMSIgKi8KKzcyNSwJLyogInNlY3QxOTNyMiIgKi8KKzcyNiwJLyogInNlY3QyMzNrMSIgKi8KKzcyNywJLyogInNlY3QyMzNyMSIgKi8KKzcyOCwJLyogInNlY3QyMzlrMSIgKi8KKzcyOSwJLyogInNlY3QyODNrMSIgKi8KKzczMCwJLyogInNlY3QyODNyMSIgKi8KKzczMSwJLyogInNlY3Q0MDlrMSIgKi8KKzczMiwJLyogInNlY3Q0MDlyMSIgKi8KKzczMywJLyogInNlY3Q1NzFrMSIgKi8KKzczNCwJLyogInNlY3Q1NzFyMSIgKi8KKzM4NiwJLyogInNlY3VyaXR5IiAqLworODc4LAkvKiAic2VlQWxzbyIgKi8KKzM5NCwJLyogInNlbGVjdGVkLWF0dHJpYnV0ZS10eXBlcyIgKi8KKzEwNSwJLyogInNlcmlhbE51bWJlciIgKi8KKzEyOSwJLyogInNlcnZlckF1dGgiICovCiszNzEsCS8qICJzZXJ2aWNlTG9jYXRvciIgKi8KKzYyNSwJLyogInNldC1hZGRQb2xpY3kiICovCis1MTUsCS8qICJzZXQtYXR0ciIgKi8KKzUxOCwJLyogInNldC1icmFuZCIgKi8KKzYzOCwJLyogInNldC1icmFuZC1BbWVyaWNhbkV4cHJlc3MiICovCis2MzcsCS8qICJzZXQtYnJhbmQtRGluZXJzIiAqLworNjM2LAkvKiAic2V0LWJyYW5kLUlBVEEtQVRBIiAqLworNjM5LAkvKiAic2V0LWJyYW5kLUpDQiIgKi8KKzY0MSwJLyogInNldC1icmFuZC1NYXN0ZXJDYXJkIiAqLworNjQyLAkvKiAic2V0LWJyYW5kLU5vdnVzIiAqLworNjQwLAkvKiAic2V0LWJyYW5kLVZpc2EiICovCis1MTcsCS8qICJzZXQtY2VydEV4dCIgKi8KKzUxMywJLyogInNldC1jdHlwZSIgKi8KKzUxNCwJLyogInNldC1tc2dFeHQiICovCis1MTYsCS8qICJzZXQtcG9saWN5IiAqLworNjA3LAkvKiAic2V0LXBvbGljeS1yb290IiAqLworNjI0LAkvKiAic2V0LXJvb3RLZXlUaHVtYiIgKi8KKzYyMCwJLyogInNldEF0dHItQ2VydCIgKi8KKzYzMSwJLyogInNldEF0dHItR2VuQ3J5cHRncm0iICovCis2MjMsCS8qICJzZXRBdHRyLUlzc0NhcCIgKi8KKzYyOCwJLyogInNldEF0dHItSXNzQ2FwLUNWTSIgKi8KKzYzMCwJLyogInNldEF0dHItSXNzQ2FwLVNpZyIgKi8KKzYyOSwJLyogInNldEF0dHItSXNzQ2FwLVQyIiAqLworNjIxLAkvKiAic2V0QXR0ci1QR1dZY2FwIiAqLworNjM1LAkvKiAic2V0QXR0ci1TZWNEZXZTaWciICovCis2MzIsCS8qICJzZXRBdHRyLVQyRW5jIiAqLworNjMzLAkvKiAic2V0QXR0ci1UMmNsZWFydHh0IiAqLworNjM0LAkvKiAic2V0QXR0ci1Ub2tJQ0NzaWciICovCis2MjcsCS8qICJzZXRBdHRyLVRva2VuLUIwUHJpbWUiICovCis2MjYsCS8qICJzZXRBdHRyLVRva2VuLUVNViIgKi8KKzYyMiwJLyogInNldEF0dHItVG9rZW5UeXBlIiAqLworNjE5LAkvKiAic2V0Q2V4dC1Jc3N1ZXJDYXBhYmlsaXRpZXMiICovCis2MTUsCS8qICJzZXRDZXh0LVBHV1ljYXBhYmlsaXRpZXMiICovCis2MTYsCS8qICJzZXRDZXh0LVRva2VuSWRlbnRpZmllciIgKi8KKzYxOCwJLyogInNldENleHQtVG9rZW5UeXBlIiAqLworNjE3LAkvKiAic2V0Q2V4dC1UcmFjazJEYXRhIiAqLworNjExLAkvKiAic2V0Q2V4dC1jQ2VydFJlcXVpcmVkIiAqLworNjA5LAkvKiAic2V0Q2V4dC1jZXJ0VHlwZSIgKi8KKzYwOCwJLyogInNldENleHQtaGFzaGVkUm9vdCIgKi8KKzYxMCwJLyogInNldENleHQtbWVyY2hEYXRhIiAqLworNjEzLAkvKiAic2V0Q2V4dC1zZXRFeHQiICovCis2MTQsCS8qICJzZXRDZXh0LXNldFF1YWxmIiAqLworNjEyLAkvKiAic2V0Q2V4dC10dW5uZWxpbmciICovCis1NDAsCS8qICJzZXRjdC1BY3FDYXJkQ29kZU1zZyIgKi8KKzU3NiwJLyogInNldGN0LUFjcUNhcmRDb2RlTXNnVEJFIiAqLworNTcwLAkvKiAic2V0Y3QtQXV0aFJlcVRCRSIgKi8KKzUzNCwJLyogInNldGN0LUF1dGhSZXFUQlMiICovCis1MjcsCS8qICJzZXRjdC1BdXRoUmVzQmFnZ2FnZSIgKi8KKzU3MSwJLyogInNldGN0LUF1dGhSZXNUQkUiICovCis1NzIsCS8qICJzZXRjdC1BdXRoUmVzVEJFWCIgKi8KKzUzNSwJLyogInNldGN0LUF1dGhSZXNUQlMiICovCis1MzYsCS8qICJzZXRjdC1BdXRoUmVzVEJTWCIgKi8KKzUyOCwJLyogInNldGN0LUF1dGhSZXZSZXFCYWdnYWdlIiAqLworNTc3LAkvKiAic2V0Y3QtQXV0aFJldlJlcVRCRSIgKi8KKzU0MSwJLyogInNldGN0LUF1dGhSZXZSZXFUQlMiICovCis1MjksCS8qICJzZXRjdC1BdXRoUmV2UmVzQmFnZ2FnZSIgKi8KKzU0MiwJLyogInNldGN0LUF1dGhSZXZSZXNEYXRhIiAqLworNTc4LAkvKiAic2V0Y3QtQXV0aFJldlJlc1RCRSIgKi8KKzU3OSwJLyogInNldGN0LUF1dGhSZXZSZXNUQkVCIiAqLworNTQzLAkvKiAic2V0Y3QtQXV0aFJldlJlc1RCUyIgKi8KKzU3MywJLyogInNldGN0LUF1dGhUb2tlblRCRSIgKi8KKzUzNywJLyogInNldGN0LUF1dGhUb2tlblRCUyIgKi8KKzYwMCwJLyogInNldGN0LUJDSURpc3RyaWJ1dGlvblRCUyIgKi8KKzU1OCwJLyogInNldGN0LUJhdGNoQWRtaW5SZXFEYXRhIiAqLworNTkyLAkvKiAic2V0Y3QtQmF0Y2hBZG1pblJlcVRCRSIgKi8KKzU1OSwJLyogInNldGN0LUJhdGNoQWRtaW5SZXNEYXRhIiAqLworNTkzLAkvKiAic2V0Y3QtQmF0Y2hBZG1pblJlc1RCRSIgKi8KKzU5OSwJLyogInNldGN0LUNSTE5vdGlmaWNhdGlvblJlc1RCUyIgKi8KKzU5OCwJLyogInNldGN0LUNSTE5vdGlmaWNhdGlvblRCUyIgKi8KKzU4MCwJLyogInNldGN0LUNhcFJlcVRCRSIgKi8KKzU4MSwJLyogInNldGN0LUNhcFJlcVRCRVgiICovCis1NDQsCS8qICJzZXRjdC1DYXBSZXFUQlMiICovCis1NDUsCS8qICJzZXRjdC1DYXBSZXFUQlNYIiAqLworNTQ2LAkvKiAic2V0Y3QtQ2FwUmVzRGF0YSIgKi8KKzU4MiwJLyogInNldGN0LUNhcFJlc1RCRSIgKi8KKzU4MywJLyogInNldGN0LUNhcFJldlJlcVRCRSIgKi8KKzU4NCwJLyogInNldGN0LUNhcFJldlJlcVRCRVgiICovCis1NDcsCS8qICJzZXRjdC1DYXBSZXZSZXFUQlMiICovCis1NDgsCS8qICJzZXRjdC1DYXBSZXZSZXFUQlNYIiAqLworNTQ5LAkvKiAic2V0Y3QtQ2FwUmV2UmVzRGF0YSIgKi8KKzU4NSwJLyogInNldGN0LUNhcFJldlJlc1RCRSIgKi8KKzUzOCwJLyogInNldGN0LUNhcFRva2VuRGF0YSIgKi8KKzUzMCwJLyogInNldGN0LUNhcFRva2VuU2VxIiAqLworNTc0LAkvKiAic2V0Y3QtQ2FwVG9rZW5UQkUiICovCis1NzUsCS8qICJzZXRjdC1DYXBUb2tlblRCRVgiICovCis1MzksCS8qICJzZXRjdC1DYXBUb2tlblRCUyIgKi8KKzU2MCwJLyogInNldGN0LUNhcmRDSW5pdFJlc1RCUyIgKi8KKzU2NiwJLyogInNldGN0LUNlcnRJbnFSZXFUQlMiICovCis1NjMsCS8qICJzZXRjdC1DZXJ0UmVxRGF0YSIgKi8KKzU5NSwJLyogInNldGN0LUNlcnRSZXFUQkUiICovCis1OTYsCS8qICJzZXRjdC1DZXJ0UmVxVEJFWCIgKi8KKzU2NCwJLyogInNldGN0LUNlcnRSZXFUQlMiICovCis1NjUsCS8qICJzZXRjdC1DZXJ0UmVzRGF0YSIgKi8KKzU5NywJLyogInNldGN0LUNlcnRSZXNUQkUiICovCis1ODYsCS8qICJzZXRjdC1DcmVkUmVxVEJFIiAqLworNTg3LAkvKiAic2V0Y3QtQ3JlZFJlcVRCRVgiICovCis1NTAsCS8qICJzZXRjdC1DcmVkUmVxVEJTIiAqLworNTUxLAkvKiAic2V0Y3QtQ3JlZFJlcVRCU1giICovCis1NTIsCS8qICJzZXRjdC1DcmVkUmVzRGF0YSIgKi8KKzU4OCwJLyogInNldGN0LUNyZWRSZXNUQkUiICovCis1ODksCS8qICJzZXRjdC1DcmVkUmV2UmVxVEJFIiAqLworNTkwLAkvKiAic2V0Y3QtQ3JlZFJldlJlcVRCRVgiICovCis1NTMsCS8qICJzZXRjdC1DcmVkUmV2UmVxVEJTIiAqLworNTU0LAkvKiAic2V0Y3QtQ3JlZFJldlJlcVRCU1giICovCis1NTUsCS8qICJzZXRjdC1DcmVkUmV2UmVzRGF0YSIgKi8KKzU5MSwJLyogInNldGN0LUNyZWRSZXZSZXNUQkUiICovCis1NjcsCS8qICJzZXRjdC1FcnJvclRCUyIgKi8KKzUyNiwJLyogInNldGN0LUhPRElucHV0IiAqLworNTYxLAkvKiAic2V0Y3QtTWVBcUNJbml0UmVzVEJTIiAqLworNTIyLAkvKiAic2V0Y3QtT0lEYXRhIiAqLworNTE5LAkvKiAic2V0Y3QtUEFORGF0YSIgKi8KKzUyMSwJLyogInNldGN0LVBBTk9ubHkiICovCis1MjAsCS8qICJzZXRjdC1QQU5Ub2tlbiIgKi8KKzU1NiwJLyogInNldGN0LVBDZXJ0UmVxRGF0YSIgKi8KKzU1NywJLyogInNldGN0LVBDZXJ0UmVzVEJTIiAqLworNTIzLAkvKiAic2V0Y3QtUEkiICovCis1MzIsCS8qICJzZXRjdC1QSS1UQlMiICovCis1MjQsCS8qICJzZXRjdC1QSURhdGEiICovCis1MjUsCS8qICJzZXRjdC1QSURhdGFVbnNpZ25lZCIgKi8KKzU2OCwJLyogInNldGN0LVBJRHVhbFNpZ25lZFRCRSIgKi8KKzU2OSwJLyogInNldGN0LVBJVW5zaWduZWRUQkUiICovCis1MzEsCS8qICJzZXRjdC1QSW5pdFJlc0RhdGEiICovCis1MzMsCS8qICJzZXRjdC1QUmVzRGF0YSIgKi8KKzU5NCwJLyogInNldGN0LVJlZ0Zvcm1SZXFUQkUiICovCis1NjIsCS8qICJzZXRjdC1SZWdGb3JtUmVzVEJTIiAqLworNjA2LAkvKiAic2V0ZXh0LWN2IiAqLworNjAxLAkvKiAic2V0ZXh0LWdlbkNyeXB0IiAqLworNjAyLAkvKiAic2V0ZXh0LW1pQXV0aCIgKi8KKzYwNCwJLyogInNldGV4dC1waW5BbnkiICovCis2MDMsCS8qICJzZXRleHQtcGluU2VjdXJlIiAqLworNjA1LAkvKiAic2V0ZXh0LXRyYWNrMiIgKi8KKzUyLAkvKiAic2lnbmluZ1RpbWUiICovCis0NTQsCS8qICJzaW1wbGVTZWN1cml0eU9iamVjdCIgKi8KKzQ5NiwJLyogInNpbmdsZUxldmVsUXVhbGl0eSIgKi8KKzM4NywJLyogInNubXB2MiIgKi8KKzY2MCwJLyogInN0cmVldCIgKi8KKzg1LAkvKiAic3ViamVjdEFsdE5hbWUiICovCis3NjksCS8qICJzdWJqZWN0RGlyZWN0b3J5QXR0cmlidXRlcyIgKi8KKzM5OCwJLyogInN1YmplY3RJbmZvQWNjZXNzIiAqLworODIsCS8qICJzdWJqZWN0S2V5SWRlbnRpZmllciIgKi8KKzQ5OCwJLyogInN1YnRyZWVNYXhpbXVtUXVhbGl0eSIgKi8KKzQ5NywJLyogInN1YnRyZWVNaW5pbXVtUXVhbGl0eSIgKi8KKzg5MCwJLyogInN1cHBvcnRlZEFsZ29yaXRobXMiICovCis4NzQsCS8qICJzdXBwb3J0ZWRBcHBsaWNhdGlvbkNvbnRleHQiICovCis0MDIsCS8qICJ0YXJnZXRJbmZvcm1hdGlvbiIgKi8KKzg2NCwJLyogInRlbGVwaG9uZU51bWJlciIgKi8KKzg2NiwJLyogInRlbGV0ZXhUZXJtaW5hbElkZW50aWZpZXIiICovCis4NjUsCS8qICJ0ZWxleE51bWJlciIgKi8KKzQ1OSwJLyogInRleHRFbmNvZGVkT1JBZGRyZXNzIiAqLworMjkzLAkvKiAidGV4dE5vdGljZSIgKi8KKzEzMywJLyogInRpbWVTdGFtcGluZyIgKi8KKzEwNiwJLyogInRpdGxlIiAqLworNjgyLAkvKiAidHBCYXNpcyIgKi8KKzM3NSwJLyogInRydXN0Um9vdCIgKi8KKzQzNiwJLyogInVjbCIgKi8KKzg4OCwJLyogInVuaXF1ZU1lbWJlciIgKi8KKzU1LAkvKiAidW5zdHJ1Y3R1cmVkQWRkcmVzcyIgKi8KKzQ5LAkvKiAidW5zdHJ1Y3R1cmVkTmFtZSIgKi8KKzg4MCwJLyogInVzZXJDZXJ0aWZpY2F0ZSIgKi8KKzQ2NSwJLyogInVzZXJDbGFzcyIgKi8KKzg3OSwJLyogInVzZXJQYXNzd29yZCIgKi8KKzM3MywJLyogInZhbGlkIiAqLworNjc4LAkvKiAid2FwIiAqLworNjc5LAkvKiAid2FwLXdzZyIgKi8KKzczNSwJLyogIndhcC13c2ctaWRtLWVjaWQtd3RsczEiICovCis3NDMsCS8qICJ3YXAtd3NnLWlkbS1lY2lkLXd0bHMxMCIgKi8KKzc0NCwJLyogIndhcC13c2ctaWRtLWVjaWQtd3RsczExIiAqLworNzQ1LAkvKiAid2FwLXdzZy1pZG0tZWNpZC13dGxzMTIiICovCis3MzYsCS8qICJ3YXAtd3NnLWlkbS1lY2lkLXd0bHMzIiAqLworNzM3LAkvKiAid2FwLXdzZy1pZG0tZWNpZC13dGxzNCIgKi8KKzczOCwJLyogIndhcC13c2ctaWRtLWVjaWQtd3RsczUiICovCis3MzksCS8qICJ3YXAtd3NnLWlkbS1lY2lkLXd0bHM2IiAqLworNzQwLAkvKiAid2FwLXdzZy1pZG0tZWNpZC13dGxzNyIgKi8KKzc0MSwJLyogIndhcC13c2ctaWRtLWVjaWQtd3RsczgiICovCis3NDIsCS8qICJ3YXAtd3NnLWlkbS1lY2lkLXd0bHM5IiAqLworODA0LAkvKiAid2hpcmxwb29sIiAqLworODY4LAkvKiAieDEyMUFkZHJlc3MiICovCis1MDMsCS8qICJ4NTAwVW5pcXVlSWRlbnRpZmllciIgKi8KKzE1OCwJLyogIng1MDlDZXJ0aWZpY2F0ZSIgKi8KKzE2MCwJLyogIng1MDlDcmwiICovCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGtOSURzSW5Mb25nTmFtZU9yZGVyW05VTV9MTl09eworMzYzLAkvKiAiQUQgVGltZSBTdGFtcGluZyIgKi8KKzQwNSwJLyogIkFOU0kgWDkuNjIiICovCiszNjgsCS8qICJBY2NlcHRhYmxlIE9DU1AgUmVzcG9uc2VzIiAqLworOTEwLAkvKiAiQW55IEV4dGVuZGVkIEtleSBVc2FnZSIgKi8KKzY2NCwJLyogIkFueSBsYW5ndWFnZSIgKi8KKzE3NywJLyogIkF1dGhvcml0eSBJbmZvcm1hdGlvbiBBY2Nlc3MiICovCiszNjUsCS8qICJCYXNpYyBPQ1NQIFJlc3BvbnNlIiAqLworMjg1LAkvKiAiQmlvbWV0cmljIEluZm8iICovCisxNzksCS8qICJDQSBJc3N1ZXJzIiAqLworNzg1LAkvKiAiQ0EgUmVwb3NpdG9yeSIgKi8KKzEzMSwJLyogIkNvZGUgU2lnbmluZyIgKi8KKzc4MywJLyogIkRpZmZpZS1IZWxsbWFuIGJhc2VkIE1BQyIgKi8KKzM4MiwJLyogIkRpcmVjdG9yeSIgKi8KKzM5MiwJLyogIkRvbWFpbiIgKi8KKzEzMiwJLyogIkUtbWFpbCBQcm90ZWN0aW9uIiAqLworMzg5LAkvKiAiRW50ZXJwcmlzZXMiICovCiszODQsCS8qICJFeHBlcmltZW50YWwiICovCiszNzIsCS8qICJFeHRlbmRlZCBPQ1NQIFN0YXR1cyIgKi8KKzE3MiwJLyogIkV4dGVuc2lvbiBSZXF1ZXN0IiAqLworODEzLAkvKiAiR09TVCAyODE0Ny04OSIgKi8KKzg0OSwJLyogIkdPU1QgMjgxNDctODkgQ3J5cHRvY29tIFBhcmFtU2V0IiAqLworODE1LAkvKiAiR09TVCAyODE0Ny04OSBNQUMiICovCis4NTEsCS8qICJHT1NUIDM0LjEwLTIwMDEgQ3J5cHRvY29tIiAqLworODUwLAkvKiAiR09TVCAzNC4xMC05NCBDcnlwdG9jb20iICovCis4MTEsCS8qICJHT1NUIFIgMzQuMTAtMjAwMSIgKi8KKzgxNywJLyogIkdPU1QgUiAzNC4xMC0yMDAxIERIIiAqLworODEyLAkvKiAiR09TVCBSIDM0LjEwLTk0IiAqLworODE4LAkvKiAiR09TVCBSIDM0LjEwLTk0IERIIiAqLworODA5LAkvKiAiR09TVCBSIDM0LjExLTk0IiAqLworODE2LAkvKiAiR09TVCBSIDM0LjExLTk0IFBSRiIgKi8KKzgwNywJLyogIkdPU1QgUiAzNC4xMS05NCB3aXRoIEdPU1QgUiAzNC4xMC0yMDAxIiAqLworODUzLAkvKiAiR09TVCBSIDM0LjExLTk0IHdpdGggR09TVCBSIDM0LjEwLTIwMDEgQ3J5cHRvY29tIiAqLworODA4LAkvKiAiR09TVCBSIDM0LjExLTk0IHdpdGggR09TVCBSIDM0LjEwLTk0IiAqLworODUyLAkvKiAiR09TVCBSIDM0LjExLTk0IHdpdGggR09TVCBSIDM0LjEwLTk0IENyeXB0b2NvbSIgKi8KKzg1NCwJLyogIkdPU1QgUiAzNDEwLTIwMDEgUGFyYW1ldGVyIFNldCBDcnlwdG9jb20iICovCis4MTAsCS8qICJITUFDIEdPU1QgMzQuMTEtOTQiICovCis0MzIsCS8qICJIb2xkIEluc3RydWN0aW9uIENhbGwgSXNzdWVyIiAqLworNDMwLAkvKiAiSG9sZCBJbnN0cnVjdGlvbiBDb2RlIiAqLworNDMxLAkvKiAiSG9sZCBJbnN0cnVjdGlvbiBOb25lIiAqLworNDMzLAkvKiAiSG9sZCBJbnN0cnVjdGlvbiBSZWplY3QiICovCis2MzQsCS8qICJJQ0Mgb3IgdG9rZW4gc2lnbmF0dXJlIiAqLworMjk0LAkvKiAiSVBTZWMgRW5kIFN5c3RlbSIgKi8KKzI5NSwJLyogIklQU2VjIFR1bm5lbCIgKi8KKzI5NiwJLyogIklQU2VjIFVzZXIiICovCisxODIsCS8qICJJU08gTWVtYmVyIEJvZHkiICovCisxODMsCS8qICJJU08gVVMgTWVtYmVyIEJvZHkiICovCis2NjcsCS8qICJJbmRlcGVuZGVudCIgKi8KKzY2NSwJLyogIkluaGVyaXQgYWxsIiAqLworNjQ3LAkvKiAiSW50ZXJuYXRpb25hbCBPcmdhbml6YXRpb25zIiAqLworMTQyLAkvKiAiSW52YWxpZGl0eSBEYXRlIiAqLworNTA0LAkvKiAiTUlNRSBNSFMiICovCiszODgsCS8qICJNYWlsIiAqLworMzgzLAkvKiAiTWFuYWdlbWVudCIgKi8KKzQxNywJLyogIk1pY3Jvc29mdCBDU1AgTmFtZSIgKi8KKzEzNSwJLyogIk1pY3Jvc29mdCBDb21tZXJjaWFsIENvZGUgU2lnbmluZyIgKi8KKzEzOCwJLyogIk1pY3Jvc29mdCBFbmNyeXB0ZWQgRmlsZSBTeXN0ZW0iICovCisxNzEsCS8qICJNaWNyb3NvZnQgRXh0ZW5zaW9uIFJlcXVlc3QiICovCisxMzQsCS8qICJNaWNyb3NvZnQgSW5kaXZpZHVhbCBDb2RlIFNpZ25pbmciICovCis4NTYsCS8qICJNaWNyb3NvZnQgTG9jYWwgS2V5IHNldCIgKi8KKzEzNywJLyogIk1pY3Jvc29mdCBTZXJ2ZXIgR2F0ZWQgQ3J5cHRvIiAqLworNjQ4LAkvKiAiTWljcm9zb2Z0IFNtYXJ0Y2FyZGxvZ2luIiAqLworMTM2LAkvKiAiTWljcm9zb2Z0IFRydXN0IExpc3QgU2lnbmluZyIgKi8KKzY0OSwJLyogIk1pY3Jvc29mdCBVbml2ZXJzYWwgUHJpbmNpcGFsIE5hbWUiICovCiszOTMsCS8qICJOVUxMIiAqLworNDA0LAkvKiAiTlVMTCIgKi8KKzcyLAkvKiAiTmV0c2NhcGUgQmFzZSBVcmwiICovCis3NiwJLyogIk5ldHNjYXBlIENBIFBvbGljeSBVcmwiICovCis3NCwJLyogIk5ldHNjYXBlIENBIFJldm9jYXRpb24gVXJsIiAqLworNzEsCS8qICJOZXRzY2FwZSBDZXJ0IFR5cGUiICovCis1OCwJLyogIk5ldHNjYXBlIENlcnRpZmljYXRlIEV4dGVuc2lvbiIgKi8KKzc5LAkvKiAiTmV0c2NhcGUgQ2VydGlmaWNhdGUgU2VxdWVuY2UiICovCis3OCwJLyogIk5ldHNjYXBlIENvbW1lbnQiICovCis1NywJLyogIk5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnAuIiAqLworNTksCS8qICJOZXRzY2FwZSBEYXRhIFR5cGUiICovCis3NSwJLyogIk5ldHNjYXBlIFJlbmV3YWwgVXJsIiAqLworNzMsCS8qICJOZXRzY2FwZSBSZXZvY2F0aW9uIFVybCIgKi8KKzc3LAkvKiAiTmV0c2NhcGUgU1NMIFNlcnZlciBOYW1lIiAqLworMTM5LAkvKiAiTmV0c2NhcGUgU2VydmVyIEdhdGVkIENyeXB0byIgKi8KKzE3OCwJLyogIk9DU1AiICovCiszNzAsCS8qICJPQ1NQIEFyY2hpdmUgQ3V0b2ZmIiAqLworMzY3LAkvKiAiT0NTUCBDUkwgSUQiICovCiszNjksCS8qICJPQ1NQIE5vIENoZWNrIiAqLworMzY2LAkvKiAiT0NTUCBOb25jZSIgKi8KKzM3MSwJLyogIk9DU1AgU2VydmljZSBMb2NhdG9yIiAqLworMTgwLAkvKiAiT0NTUCBTaWduaW5nIiAqLworMTYxLAkvKiAiUEJFUzIiICovCis2OSwJLyogIlBCS0RGMiIgKi8KKzE2MiwJLyogIlBCTUFDMSIgKi8KKzEyNywJLyogIlBLSVgiICovCis4NTgsCS8qICJQZXJtYW5lbnQgSWRlbnRpZmllciIgKi8KKzE2NCwJLyogIlBvbGljeSBRdWFsaWZpZXIgQ1BTIiAqLworMTY1LAkvKiAiUG9saWN5IFF1YWxpZmllciBVc2VyIE5vdGljZSIgKi8KKzM4NSwJLyogIlByaXZhdGUiICovCis2NjMsCS8qICJQcm94eSBDZXJ0aWZpY2F0ZSBJbmZvcm1hdGlvbiIgKi8KKyAxLAkvKiAiUlNBIERhdGEgU2VjdXJpdHksIEluYy4iICovCisgMiwJLyogIlJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIFBLQ1MiICovCisxODgsCS8qICJTL01JTUUiICovCisxNjcsCS8qICJTL01JTUUgQ2FwYWJpbGl0aWVzIiAqLworMzg3LAkvKiAiU05NUHYyIiAqLworNTEyLAkvKiAiU2VjdXJlIEVsZWN0cm9uaWMgVHJhbnNhY3Rpb25zIiAqLworMzg2LAkvKiAiU2VjdXJpdHkiICovCiszOTQsCS8qICJTZWxlY3RlZCBBdHRyaWJ1dGUgVHlwZXMiICovCisxNDMsCS8qICJTdHJvbmcgRXh0cmFuZXQgSUQiICovCiszOTgsCS8qICJTdWJqZWN0IEluZm9ybWF0aW9uIEFjY2VzcyIgKi8KKzEzMCwJLyogIlRMUyBXZWIgQ2xpZW50IEF1dGhlbnRpY2F0aW9uIiAqLworMTI5LAkvKiAiVExTIFdlYiBTZXJ2ZXIgQXV0aGVudGljYXRpb24iICovCisxMzMsCS8qICJUaW1lIFN0YW1waW5nIiAqLworMzc1LAkvKiAiVHJ1c3QgUm9vdCIgKi8KKzEyLAkvKiAiWDUwOSIgKi8KKzQwMiwJLyogIlg1MDl2MyBBQyBUYXJnZXRpbmciICovCis3NDYsCS8qICJYNTA5djMgQW55IFBvbGljeSIgKi8KKzkwLAkvKiAiWDUwOXYzIEF1dGhvcml0eSBLZXkgSWRlbnRpZmllciIgKi8KKzg3LAkvKiAiWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzIiAqLworMTAzLAkvKiAiWDUwOXYzIENSTCBEaXN0cmlidXRpb24gUG9pbnRzIiAqLworODgsCS8qICJYNTA5djMgQ1JMIE51bWJlciIgKi8KKzE0MSwJLyogIlg1MDl2MyBDUkwgUmVhc29uIENvZGUiICovCis3NzEsCS8qICJYNTA5djMgQ2VydGlmaWNhdGUgSXNzdWVyIiAqLworODksCS8qICJYNTA5djMgQ2VydGlmaWNhdGUgUG9saWNpZXMiICovCisxNDAsCS8qICJYNTA5djMgRGVsdGEgQ1JMIEluZGljYXRvciIgKi8KKzEyNiwJLyogIlg1MDl2MyBFeHRlbmRlZCBLZXkgVXNhZ2UiICovCis4NTcsCS8qICJYNTA5djMgRnJlc2hlc3QgQ1JMIiAqLworNzQ4LAkvKiAiWDUwOXYzIEluaGliaXQgQW55IFBvbGljeSIgKi8KKzg2LAkvKiAiWDUwOXYzIElzc3VlciBBbHRlcm5hdGl2ZSBOYW1lIiAqLworNzcwLAkvKiAiWDUwOXYzIElzc3VpbmcgRGlzdHJ1YnV0aW9uIFBvaW50IiAqLworODMsCS8qICJYNTA5djMgS2V5IFVzYWdlIiAqLworNjY2LAkvKiAiWDUwOXYzIE5hbWUgQ29uc3RyYWludHMiICovCis0MDMsCS8qICJYNTA5djMgTm8gUmV2b2NhdGlvbiBBdmFpbGFibGUiICovCis0MDEsCS8qICJYNTA5djMgUG9saWN5IENvbnN0cmFpbnRzIiAqLworNzQ3LAkvKiAiWDUwOXYzIFBvbGljeSBNYXBwaW5ncyIgKi8KKzg0LAkvKiAiWDUwOXYzIFByaXZhdGUgS2V5IFVzYWdlIFBlcmlvZCIgKi8KKzg1LAkvKiAiWDUwOXYzIFN1YmplY3QgQWx0ZXJuYXRpdmUgTmFtZSIgKi8KKzc2OSwJLyogIlg1MDl2MyBTdWJqZWN0IERpcmVjdG9yeSBBdHRyaWJ1dGVzIiAqLworODIsCS8qICJYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllciIgKi8KKzkyMCwJLyogIlg5LjQyIERIIiAqLworMTg0LAkvKiAiWDkuNTciICovCisxODUsCS8qICJYOS41NyBDTSA/IiAqLworNDc4LAkvKiAiYVJlY29yZCIgKi8KKzI4OSwJLyogImFhQ29udHJvbHMiICovCisyODcsCS8qICJhYy1hdWRpdEVudGl0eSIgKi8KKzM5NywJLyogImFjLXByb3h5aW5nIiAqLworMjg4LAkvKiAiYWMtdGFyZ2V0aW5nIiAqLworNDQ2LAkvKiAiYWNjb3VudCIgKi8KKzM2NCwJLyogImFkIGR2Y3MiICovCis2MDYsCS8qICJhZGRpdGlvbmFsIHZlcmlmaWNhdGlvbiIgKi8KKzQxOSwJLyogImFlcy0xMjgtY2JjIiAqLworOTE2LAkvKiAiYWVzLTEyOC1jYmMtaG1hYy1zaGExIiAqLworODk2LAkvKiAiYWVzLTEyOC1jY20iICovCis0MjEsCS8qICJhZXMtMTI4LWNmYiIgKi8KKzY1MCwJLyogImFlcy0xMjgtY2ZiMSIgKi8KKzY1MywJLyogImFlcy0xMjgtY2ZiOCIgKi8KKzkwNCwJLyogImFlcy0xMjgtY3RyIiAqLworNDE4LAkvKiAiYWVzLTEyOC1lY2IiICovCis4OTUsCS8qICJhZXMtMTI4LWdjbSIgKi8KKzQyMCwJLyogImFlcy0xMjgtb2ZiIiAqLworOTEzLAkvKiAiYWVzLTEyOC14dHMiICovCis0MjMsCS8qICJhZXMtMTkyLWNiYyIgKi8KKzkxNywJLyogImFlcy0xOTItY2JjLWhtYWMtc2hhMSIgKi8KKzg5OSwJLyogImFlcy0xOTItY2NtIiAqLworNDI1LAkvKiAiYWVzLTE5Mi1jZmIiICovCis2NTEsCS8qICJhZXMtMTkyLWNmYjEiICovCis2NTQsCS8qICJhZXMtMTkyLWNmYjgiICovCis5MDUsCS8qICJhZXMtMTkyLWN0ciIgKi8KKzQyMiwJLyogImFlcy0xOTItZWNiIiAqLworODk4LAkvKiAiYWVzLTE5Mi1nY20iICovCis0MjQsCS8qICJhZXMtMTkyLW9mYiIgKi8KKzQyNywJLyogImFlcy0yNTYtY2JjIiAqLworOTE4LAkvKiAiYWVzLTI1Ni1jYmMtaG1hYy1zaGExIiAqLworOTAyLAkvKiAiYWVzLTI1Ni1jY20iICovCis0MjksCS8qICJhZXMtMjU2LWNmYiIgKi8KKzY1MiwJLyogImFlcy0yNTYtY2ZiMSIgKi8KKzY1NSwJLyogImFlcy0yNTYtY2ZiOCIgKi8KKzkwNiwJLyogImFlcy0yNTYtY3RyIiAqLworNDI2LAkvKiAiYWVzLTI1Ni1lY2IiICovCis5MDEsCS8qICJhZXMtMjU2LWdjbSIgKi8KKzQyOCwJLyogImFlcy0yNTYtb2ZiIiAqLworOTE0LAkvKiAiYWVzLTI1Ni14dHMiICovCiszNzYsCS8qICJhbGdvcml0aG0iICovCis0ODQsCS8qICJhc3NvY2lhdGVkRG9tYWluIiAqLworNDg1LAkvKiAiYXNzb2NpYXRlZE5hbWUiICovCis1MDEsCS8qICJhdWRpbyIgKi8KKzg4MiwJLyogImF1dGhvcml0eVJldm9jYXRpb25MaXN0IiAqLworOTEsCS8qICJiZi1jYmMiICovCis5MywJLyogImJmLWNmYiIgKi8KKzkyLAkvKiAiYmYtZWNiIiAqLworOTQsCS8qICJiZi1vZmIiICovCis5MjEsCS8qICJicmFpbnBvb2xQMTYwcjEiICovCis5MjIsCS8qICJicmFpbnBvb2xQMTYwdDEiICovCis5MjMsCS8qICJicmFpbnBvb2xQMTkycjEiICovCis5MjQsCS8qICJicmFpbnBvb2xQMTkydDEiICovCis5MjUsCS8qICJicmFpbnBvb2xQMjI0cjEiICovCis5MjYsCS8qICJicmFpbnBvb2xQMjI0dDEiICovCis5MjcsCS8qICJicmFpbnBvb2xQMjU2cjEiICovCis5MjgsCS8qICJicmFpbnBvb2xQMjU2dDEiICovCis5MjksCS8qICJicmFpbnBvb2xQMzIwcjEiICovCis5MzAsCS8qICJicmFpbnBvb2xQMzIwdDEiICovCis5MzEsCS8qICJicmFpbnBvb2xQMzg0cjEiICovCis5MzIsCS8qICJicmFpbnBvb2xQMzg0dDEiICovCis5MzMsCS8qICJicmFpbnBvb2xQNTEycjEiICovCis5MzQsCS8qICJicmFpbnBvb2xQNTEydDEiICovCis0OTQsCS8qICJidWlsZGluZ05hbWUiICovCis4NjAsCS8qICJidXNpbmVzc0NhdGVnb3J5IiAqLworNjkxLAkvKiAiYzJvbmIxOTF2NCIgKi8KKzY5MiwJLyogImMyb25iMTkxdjUiICovCis2OTcsCS8qICJjMm9uYjIzOXY0IiAqLworNjk4LAkvKiAiYzJvbmIyMzl2NSIgKi8KKzY4NCwJLyogImMycG5iMTYzdjEiICovCis2ODUsCS8qICJjMnBuYjE2M3YyIiAqLworNjg2LAkvKiAiYzJwbmIxNjN2MyIgKi8KKzY4NywJLyogImMycG5iMTc2djEiICovCis2OTMsCS8qICJjMnBuYjIwOHcxIiAqLworNjk5LAkvKiAiYzJwbmIyNzJ3MSIgKi8KKzcwMCwJLyogImMycG5iMzA0dzEiICovCis3MDIsCS8qICJjMnBuYjM2OHcxIiAqLworNjg4LAkvKiAiYzJ0bmIxOTF2MSIgKi8KKzY4OSwJLyogImMydG5iMTkxdjIiICovCis2OTAsCS8qICJjMnRuYjE5MXYzIiAqLworNjk0LAkvKiAiYzJ0bmIyMzl2MSIgKi8KKzY5NSwJLyogImMydG5iMjM5djIiICovCis2OTYsCS8qICJjMnRuYjIzOXYzIiAqLworNzAxLAkvKiAiYzJ0bmIzNTl2MSIgKi8KKzcwMywJLyogImMydG5iNDMxcjEiICovCis4ODEsCS8qICJjQUNlcnRpZmljYXRlIiAqLworNDgzLAkvKiAiY05BTUVSZWNvcmQiICovCis3NTEsCS8qICJjYW1lbGxpYS0xMjgtY2JjIiAqLworNzU3LAkvKiAiY2FtZWxsaWEtMTI4LWNmYiIgKi8KKzc2MCwJLyogImNhbWVsbGlhLTEyOC1jZmIxIiAqLworNzYzLAkvKiAiY2FtZWxsaWEtMTI4LWNmYjgiICovCis3NTQsCS8qICJjYW1lbGxpYS0xMjgtZWNiIiAqLworNzY2LAkvKiAiY2FtZWxsaWEtMTI4LW9mYiIgKi8KKzc1MiwJLyogImNhbWVsbGlhLTE5Mi1jYmMiICovCis3NTgsCS8qICJjYW1lbGxpYS0xOTItY2ZiIiAqLworNzYxLAkvKiAiY2FtZWxsaWEtMTkyLWNmYjEiICovCis3NjQsCS8qICJjYW1lbGxpYS0xOTItY2ZiOCIgKi8KKzc1NSwJLyogImNhbWVsbGlhLTE5Mi1lY2IiICovCis3NjcsCS8qICJjYW1lbGxpYS0xOTItb2ZiIiAqLworNzUzLAkvKiAiY2FtZWxsaWEtMjU2LWNiYyIgKi8KKzc1OSwJLyogImNhbWVsbGlhLTI1Ni1jZmIiICovCis3NjIsCS8qICJjYW1lbGxpYS0yNTYtY2ZiMSIgKi8KKzc2NSwJLyogImNhbWVsbGlhLTI1Ni1jZmI4IiAqLworNzU2LAkvKiAiY2FtZWxsaWEtMjU2LWVjYiIgKi8KKzc2OCwJLyogImNhbWVsbGlhLTI1Ni1vZmIiICovCis0NDMsCS8qICJjYXNlSWdub3JlSUE1U3RyaW5nU3ludGF4IiAqLworMTA4LAkvKiAiY2FzdDUtY2JjIiAqLworMTEwLAkvKiAiY2FzdDUtY2ZiIiAqLworMTA5LAkvKiAiY2FzdDUtZWNiIiAqLworMTExLAkvKiAiY2FzdDUtb2ZiIiAqLworMTUyLAkvKiAiY2VydEJhZyIgKi8KKzY3NywJLyogImNlcnRpY29tLWFyYyIgKi8KKzUxNywJLyogImNlcnRpZmljYXRlIGV4dGVuc2lvbnMiICovCis4ODMsCS8qICJjZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0IiAqLworNTQsCS8qICJjaGFsbGVuZ2VQYXNzd29yZCIgKi8KKzQwNywJLyogImNoYXJhY3RlcmlzdGljLXR3by1maWVsZCIgKi8KKzM5NSwJLyogImNsZWFyYW5jZSIgKi8KKzYzMywJLyogImNsZWFydGV4dCB0cmFjayAyIiAqLworODk0LAkvKiAiY21hYyIgKi8KKzEzLAkvKiAiY29tbW9uTmFtZSIgKi8KKzUxMywJLyogImNvbnRlbnQgdHlwZXMiICovCis1MCwJLyogImNvbnRlbnRUeXBlIiAqLworNTMsCS8qICJjb3VudGVyc2lnbmF0dXJlIiAqLworMTQsCS8qICJjb3VudHJ5TmFtZSIgKi8KKzE1MywJLyogImNybEJhZyIgKi8KKzg4NCwJLyogImNyb3NzQ2VydGlmaWNhdGVQYWlyIiAqLworODA2LAkvKiAiY3J5cHRvY29tIiAqLworODA1LAkvKiAiY3J5cHRvcHJvIiAqLworNTAwLAkvKiAiZElUUmVkaXJlY3QiICovCis0NTEsCS8qICJkTlNEb21haW4iICovCis0OTUsCS8qICJkU0FRdWFsaXR5IiAqLworNDM0LAkvKiAiZGF0YSIgKi8KKzM5MCwJLyogImRjT2JqZWN0IiAqLworODkxLAkvKiAiZGVsdGFSZXZvY2F0aW9uTGlzdCIgKi8KKzMxLAkvKiAiZGVzLWNiYyIgKi8KKzY0MywJLyogImRlcy1jZG1mIiAqLworMzAsCS8qICJkZXMtY2ZiIiAqLworNjU2LAkvKiAiZGVzLWNmYjEiICovCis2NTcsCS8qICJkZXMtY2ZiOCIgKi8KKzI5LAkvKiAiZGVzLWVjYiIgKi8KKzMyLAkvKiAiZGVzLWVkZSIgKi8KKzQzLAkvKiAiZGVzLWVkZS1jYmMiICovCis2MCwJLyogImRlcy1lZGUtY2ZiIiAqLworNjIsCS8qICJkZXMtZWRlLW9mYiIgKi8KKzMzLAkvKiAiZGVzLWVkZTMiICovCis0NCwJLyogImRlcy1lZGUzLWNiYyIgKi8KKzYxLAkvKiAiZGVzLWVkZTMtY2ZiIiAqLworNjU4LAkvKiAiZGVzLWVkZTMtY2ZiMSIgKi8KKzY1OSwJLyogImRlcy1lZGUzLWNmYjgiICovCis2MywJLyogImRlcy1lZGUzLW9mYiIgKi8KKzQ1LAkvKiAiZGVzLW9mYiIgKi8KKzEwNywJLyogImRlc2NyaXB0aW9uIiAqLworODcxLAkvKiAiZGVzdGluYXRpb25JbmRpY2F0b3IiICovCis4MCwJLyogImRlc3gtY2JjIiAqLworOTUwLAkvKiAiZGgtY29mYWN0b3Ita2RmIiAqLworOTQ5LAkvKiAiZGgtc3RkLWtkZiIgKi8KKzI4LAkvKiAiZGhLZXlBZ3JlZW1lbnQiICovCis5NDQsCS8qICJkaFNpbmdsZVBhc3MtY29mYWN0b3JESC1zaGExa2RmLXNjaGVtZSIgKi8KKzk0NSwJLyogImRoU2luZ2xlUGFzcy1jb2ZhY3RvckRILXNoYTIyNGtkZi1zY2hlbWUiICovCis5NDYsCS8qICJkaFNpbmdsZVBhc3MtY29mYWN0b3JESC1zaGEyNTZrZGYtc2NoZW1lIiAqLworOTQ3LAkvKiAiZGhTaW5nbGVQYXNzLWNvZmFjdG9yREgtc2hhMzg0a2RmLXNjaGVtZSIgKi8KKzk0OCwJLyogImRoU2luZ2xlUGFzcy1jb2ZhY3RvckRILXNoYTUxMmtkZi1zY2hlbWUiICovCis5MzksCS8qICJkaFNpbmdsZVBhc3Mtc3RkREgtc2hhMWtkZi1zY2hlbWUiICovCis5NDAsCS8qICJkaFNpbmdsZVBhc3Mtc3RkREgtc2hhMjI0a2RmLXNjaGVtZSIgKi8KKzk0MSwJLyogImRoU2luZ2xlUGFzcy1zdGRESC1zaGEyNTZrZGYtc2NoZW1lIiAqLworOTQyLAkvKiAiZGhTaW5nbGVQYXNzLXN0ZERILXNoYTM4NGtkZi1zY2hlbWUiICovCis5NDMsCS8qICJkaFNpbmdsZVBhc3Mtc3RkREgtc2hhNTEya2RmLXNjaGVtZSIgKi8KKzExLAkvKiAiZGlyZWN0b3J5IHNlcnZpY2VzIChYLjUwMCkiICovCiszNzgsCS8qICJkaXJlY3Rvcnkgc2VydmljZXMgLSBhbGdvcml0aG1zIiAqLworODg3LAkvKiAiZGlzdGluZ3Vpc2hlZE5hbWUiICovCis4OTIsCS8qICJkbWROYW1lIiAqLworMTc0LAkvKiAiZG5RdWFsaWZpZXIiICovCis0NDcsCS8qICJkb2N1bWVudCIgKi8KKzQ3MSwJLyogImRvY3VtZW50QXV0aG9yIiAqLworNDY4LAkvKiAiZG9jdW1lbnRJZGVudGlmaWVyIiAqLworNDcyLAkvKiAiZG9jdW1lbnRMb2NhdGlvbiIgKi8KKzUwMiwJLyogImRvY3VtZW50UHVibGlzaGVyIiAqLworNDQ5LAkvKiAiZG9jdW1lbnRTZXJpZXMiICovCis0NjksCS8qICJkb2N1bWVudFRpdGxlIiAqLworNDcwLAkvKiAiZG9jdW1lbnRWZXJzaW9uIiAqLworMzgwLAkvKiAiZG9kIiAqLworMzkxLAkvKiAiZG9tYWluQ29tcG9uZW50IiAqLworNDUyLAkvKiAiZG9tYWluUmVsYXRlZE9iamVjdCIgKi8KKzExNiwJLyogImRzYUVuY3J5cHRpb24iICovCis2NywJLyogImRzYUVuY3J5cHRpb24tb2xkIiAqLworNjYsCS8qICJkc2FXaXRoU0hBIiAqLworMTEzLAkvKiAiZHNhV2l0aFNIQTEiICovCis3MCwJLyogImRzYVdpdGhTSEExLW9sZCIgKi8KKzgwMiwJLyogImRzYV93aXRoX1NIQTIyNCIgKi8KKzgwMywJLyogImRzYV93aXRoX1NIQTI1NiIgKi8KKzI5NywJLyogImR2Y3MiICovCis3OTEsCS8qICJlY2RzYS13aXRoLVJlY29tbWVuZGVkIiAqLworNDE2LAkvKiAiZWNkc2Etd2l0aC1TSEExIiAqLworNzkzLAkvKiAiZWNkc2Etd2l0aC1TSEEyMjQiICovCis3OTQsCS8qICJlY2RzYS13aXRoLVNIQTI1NiIgKi8KKzc5NSwJLyogImVjZHNhLXdpdGgtU0hBMzg0IiAqLworNzk2LAkvKiAiZWNkc2Etd2l0aC1TSEE1MTIiICovCis3OTIsCS8qICJlY2RzYS13aXRoLVNwZWNpZmllZCIgKi8KKzQ4LAkvKiAiZW1haWxBZGRyZXNzIiAqLworNjMyLAkvKiAiZW5jcnlwdGVkIHRyYWNrIDIiICovCis4ODUsCS8qICJlbmhhbmNlZFNlYXJjaEd1aWRlIiAqLworNTYsCS8qICJleHRlbmRlZENlcnRpZmljYXRlQXR0cmlidXRlcyIgKi8KKzg2NywJLyogImZhY3NpbWlsZVRlbGVwaG9uZU51bWJlciIgKi8KKzQ2MiwJLyogImZhdm91cml0ZURyaW5rIiAqLworNDUzLAkvKiAiZnJpZW5kbHlDb3VudHJ5IiAqLworNDkwLAkvKiAiZnJpZW5kbHlDb3VudHJ5TmFtZSIgKi8KKzE1NiwJLyogImZyaWVuZGx5TmFtZSIgKi8KKzYzMSwJLyogImdlbmVyYXRlIGNyeXB0b2dyYW0iICovCis1MDksCS8qICJnZW5lcmF0aW9uUXVhbGlmaWVyIiAqLworNjAxLAkvKiAiZ2VuZXJpYyBjcnlwdG9ncmFtIiAqLworOTksCS8qICJnaXZlbk5hbWUiICovCis4MTQsCS8qICJnb3N0ODktY250IiAqLworODU1LAkvKiAiaG1hYyIgKi8KKzc4MCwJLyogImhtYWMtbWQ1IiAqLworNzgxLAkvKiAiaG1hYy1zaGExIiAqLworNzk3LAkvKiAiaG1hY1dpdGhNRDUiICovCisxNjMsCS8qICJobWFjV2l0aFNIQTEiICovCis3OTgsCS8qICJobWFjV2l0aFNIQTIyNCIgKi8KKzc5OSwJLyogImhtYWNXaXRoU0hBMjU2IiAqLworODAwLAkvKiAiaG1hY1dpdGhTSEEzODQiICovCis4MDEsCS8qICJobWFjV2l0aFNIQTUxMiIgKi8KKzQ4NiwJLyogImhvbWVQb3N0YWxBZGRyZXNzIiAqLworNDczLAkvKiAiaG9tZVRlbGVwaG9uZU51bWJlciIgKi8KKzQ2NiwJLyogImhvc3QiICovCis4ODksCS8qICJob3VzZUlkZW50aWZpZXIiICovCis0NDIsCS8qICJpQTVTdHJpbmdTeW50YXgiICovCiszODEsCS8qICJpYW5hIiAqLworODI0LAkvKiAiaWQtR29zdDI4MTQ3LTg5LUNyeXB0b1Byby1BLVBhcmFtU2V0IiAqLworODI1LAkvKiAiaWQtR29zdDI4MTQ3LTg5LUNyeXB0b1Byby1CLVBhcmFtU2V0IiAqLworODI2LAkvKiAiaWQtR29zdDI4MTQ3LTg5LUNyeXB0b1Byby1DLVBhcmFtU2V0IiAqLworODI3LAkvKiAiaWQtR29zdDI4MTQ3LTg5LUNyeXB0b1Byby1ELVBhcmFtU2V0IiAqLworODE5LAkvKiAiaWQtR29zdDI4MTQ3LTg5LUNyeXB0b1Byby1LZXlNZXNoaW5nIiAqLworODI5LAkvKiAiaWQtR29zdDI4MTQ3LTg5LUNyeXB0b1Byby1Pc2Nhci0xLTAtUGFyYW1TZXQiICovCis4MjgsCS8qICJpZC1Hb3N0MjgxNDctODktQ3J5cHRvUHJvLU9zY2FyLTEtMS1QYXJhbVNldCIgKi8KKzgzMCwJLyogImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tUklDLTEtUGFyYW1TZXQiICovCis4MjAsCS8qICJpZC1Hb3N0MjgxNDctODktTm9uZS1LZXlNZXNoaW5nIiAqLworODIzLAkvKiAiaWQtR29zdDI4MTQ3LTg5LVRlc3RQYXJhbVNldCIgKi8KKzg0MCwJLyogImlkLUdvc3RSMzQxMC0yMDAxLUNyeXB0b1Byby1BLVBhcmFtU2V0IiAqLworODQxLAkvKiAiaWQtR29zdFIzNDEwLTIwMDEtQ3J5cHRvUHJvLUItUGFyYW1TZXQiICovCis4NDIsCS8qICJpZC1Hb3N0UjM0MTAtMjAwMS1DcnlwdG9Qcm8tQy1QYXJhbVNldCIgKi8KKzg0MywJLyogImlkLUdvc3RSMzQxMC0yMDAxLUNyeXB0b1Byby1YY2hBLVBhcmFtU2V0IiAqLworODQ0LAkvKiAiaWQtR29zdFIzNDEwLTIwMDEtQ3J5cHRvUHJvLVhjaEItUGFyYW1TZXQiICovCis4MzksCS8qICJpZC1Hb3N0UjM0MTAtMjAwMS1UZXN0UGFyYW1TZXQiICovCis4MzIsCS8qICJpZC1Hb3N0UjM0MTAtOTQtQ3J5cHRvUHJvLUEtUGFyYW1TZXQiICovCis4MzMsCS8qICJpZC1Hb3N0UjM0MTAtOTQtQ3J5cHRvUHJvLUItUGFyYW1TZXQiICovCis4MzQsCS8qICJpZC1Hb3N0UjM0MTAtOTQtQ3J5cHRvUHJvLUMtUGFyYW1TZXQiICovCis4MzUsCS8qICJpZC1Hb3N0UjM0MTAtOTQtQ3J5cHRvUHJvLUQtUGFyYW1TZXQiICovCis4MzYsCS8qICJpZC1Hb3N0UjM0MTAtOTQtQ3J5cHRvUHJvLVhjaEEtUGFyYW1TZXQiICovCis4MzcsCS8qICJpZC1Hb3N0UjM0MTAtOTQtQ3J5cHRvUHJvLVhjaEItUGFyYW1TZXQiICovCis4MzgsCS8qICJpZC1Hb3N0UjM0MTAtOTQtQ3J5cHRvUHJvLVhjaEMtUGFyYW1TZXQiICovCis4MzEsCS8qICJpZC1Hb3N0UjM0MTAtOTQtVGVzdFBhcmFtU2V0IiAqLworODQ1LAkvKiAiaWQtR29zdFIzNDEwLTk0LWEiICovCis4NDYsCS8qICJpZC1Hb3N0UjM0MTAtOTQtYUJpcyIgKi8KKzg0NywJLyogImlkLUdvc3RSMzQxMC05NC1iIiAqLworODQ4LAkvKiAiaWQtR29zdFIzNDEwLTk0LWJCaXMiICovCis4MjIsCS8qICJpZC1Hb3N0UjM0MTEtOTQtQ3J5cHRvUHJvUGFyYW1TZXQiICovCis4MjEsCS8qICJpZC1Hb3N0UjM0MTEtOTQtVGVzdFBhcmFtU2V0IiAqLworMjY2LAkvKiAiaWQtYWNhIiAqLworMzU1LAkvKiAiaWQtYWNhLWFjY2Vzc0lkZW50aXR5IiAqLworMzU0LAkvKiAiaWQtYWNhLWF1dGhlbnRpY2F0aW9uSW5mbyIgKi8KKzM1NiwJLyogImlkLWFjYS1jaGFyZ2luZ0lkZW50aXR5IiAqLworMzk5LAkvKiAiaWQtYWNhLWVuY0F0dHJzIiAqLworMzU3LAkvKiAiaWQtYWNhLWdyb3VwIiAqLworMzU4LAkvKiAiaWQtYWNhLXJvbGUiICovCisxNzYsCS8qICJpZC1hZCIgKi8KKzc4OCwJLyogImlkLWFlczEyOC13cmFwIiAqLworODk3LAkvKiAiaWQtYWVzMTI4LXdyYXAtcGFkIiAqLworNzg5LAkvKiAiaWQtYWVzMTkyLXdyYXAiICovCis5MDAsCS8qICJpZC1hZXMxOTItd3JhcC1wYWQiICovCis3OTAsCS8qICJpZC1hZXMyNTYtd3JhcCIgKi8KKzkwMywJLyogImlkLWFlczI1Ni13cmFwLXBhZCIgKi8KKzI2MiwJLyogImlkLWFsZyIgKi8KKzg5MywJLyogImlkLWFsZy1QV1JJLUtFSyIgKi8KKzMyMywJLyogImlkLWFsZy1kZXM0MCIgKi8KKzMyNiwJLyogImlkLWFsZy1kaC1wb3AiICovCiszMjUsCS8qICJpZC1hbGctZGgtc2lnLWhtYWMtc2hhMSIgKi8KKzMyNCwJLyogImlkLWFsZy1ub1NpZ25hdHVyZSIgKi8KKzkwNywJLyogImlkLWNhbWVsbGlhMTI4LXdyYXAiICovCis5MDgsCS8qICJpZC1jYW1lbGxpYTE5Mi13cmFwIiAqLworOTA5LAkvKiAiaWQtY2FtZWxsaWEyNTYtd3JhcCIgKi8KKzI2OCwJLyogImlkLWNjdCIgKi8KKzM2MSwJLyogImlkLWNjdC1QS0lEYXRhIiAqLworMzYyLAkvKiAiaWQtY2N0LVBLSVJlc3BvbnNlIiAqLworMzYwLAkvKiAiaWQtY2N0LWNycyIgKi8KKzgxLAkvKiAiaWQtY2UiICovCis2ODAsCS8qICJpZC1jaGFyYWN0ZXJpc3RpYy10d28tYmFzaXMiICovCisyNjMsCS8qICJpZC1jbWMiICovCiszMzQsCS8qICJpZC1jbWMtYWRkRXh0ZW5zaW9ucyIgKi8KKzM0NiwJLyogImlkLWNtYy1jb25maXJtQ2VydEFjY2VwdGFuY2UiICovCiszMzAsCS8qICJpZC1jbWMtZGF0YVJldHVybiIgKi8KKzMzNiwJLyogImlkLWNtYy1kZWNyeXB0ZWRQT1AiICovCiszMzUsCS8qICJpZC1jbWMtZW5jcnlwdGVkUE9QIiAqLworMzM5LAkvKiAiaWQtY21jLWdldENSTCIgKi8KKzMzOCwJLyogImlkLWNtYy1nZXRDZXJ0IiAqLworMzI4LAkvKiAiaWQtY21jLWlkZW50aWZpY2F0aW9uIiAqLworMzI5LAkvKiAiaWQtY21jLWlkZW50aXR5UHJvb2YiICovCiszMzcsCS8qICJpZC1jbWMtbHJhUE9QV2l0bmVzcyIgKi8KKzM0NCwJLyogImlkLWNtYy1wb3BMaW5rUmFuZG9tIiAqLworMzQ1LAkvKiAiaWQtY21jLXBvcExpbmtXaXRuZXNzIiAqLworMzQzLAkvKiAiaWQtY21jLXF1ZXJ5UGVuZGluZyIgKi8KKzMzMywJLyogImlkLWNtYy1yZWNpcGllbnROb25jZSIgKi8KKzM0MSwJLyogImlkLWNtYy1yZWdJbmZvIiAqLworMzQyLAkvKiAiaWQtY21jLXJlc3BvbnNlSW5mbyIgKi8KKzM0MCwJLyogImlkLWNtYy1yZXZva2VSZXF1ZXN0IiAqLworMzMyLAkvKiAiaWQtY21jLXNlbmRlck5vbmNlIiAqLworMzI3LAkvKiAiaWQtY21jLXN0YXR1c0luZm8iICovCiszMzEsCS8qICJpZC1jbWMtdHJhbnNhY3Rpb25JZCIgKi8KKzc4NywJLyogImlkLWN0LWFzY2lpVGV4dFdpdGhDUkxGIiAqLworNDA4LAkvKiAiaWQtZWNQdWJsaWNLZXkiICovCis1MDgsCS8qICJpZC1oZXgtbXVsdGlwYXJ0LW1lc3NhZ2UiICovCis1MDcsCS8qICJpZC1oZXgtcGFydGlhbC1tZXNzYWdlIiAqLworMjYwLAkvKiAiaWQtaXQiICovCiszMDIsCS8qICJpZC1pdC1jYUtleVVwZGF0ZUluZm8iICovCisyOTgsCS8qICJpZC1pdC1jYVByb3RFbmNDZXJ0IiAqLworMzExLAkvKiAiaWQtaXQtY29uZmlybVdhaXRUaW1lIiAqLworMzAzLAkvKiAiaWQtaXQtY3VycmVudENSTCIgKi8KKzMwMCwJLyogImlkLWl0LWVuY0tleVBhaXJUeXBlcyIgKi8KKzMxMCwJLyogImlkLWl0LWltcGxpY2l0Q29uZmlybSIgKi8KKzMwOCwJLyogImlkLWl0LWtleVBhaXJQYXJhbVJlcCIgKi8KKzMwNywJLyogImlkLWl0LWtleVBhaXJQYXJhbVJlcSIgKi8KKzMxMiwJLyogImlkLWl0LW9yaWdQS0lNZXNzYWdlIiAqLworMzAxLAkvKiAiaWQtaXQtcHJlZmVycmVkU3ltbUFsZyIgKi8KKzMwOSwJLyogImlkLWl0LXJldlBhc3NwaHJhc2UiICovCisyOTksCS8qICJpZC1pdC1zaWduS2V5UGFpclR5cGVzIiAqLworMzA1LAkvKiAiaWQtaXQtc3Vic2NyaXB0aW9uUmVxdWVzdCIgKi8KKzMwNiwJLyogImlkLWl0LXN1YnNjcmlwdGlvblJlc3BvbnNlIiAqLworNzg0LAkvKiAiaWQtaXQtc3VwcExhbmdUYWdzIiAqLworMzA0LAkvKiAiaWQtaXQtdW5zdXBwb3J0ZWRPSURzIiAqLworMTI4LAkvKiAiaWQta3AiICovCisyODAsCS8qICJpZC1tb2QtYXR0cmlidXRlLWNlcnQiICovCisyNzQsCS8qICJpZC1tb2QtY21jIiAqLworMjc3LAkvKiAiaWQtbW9kLWNtcCIgKi8KKzI4NCwJLyogImlkLW1vZC1jbXAyMDAwIiAqLworMjczLAkvKiAiaWQtbW9kLWNybWYiICovCisyODMsCS8qICJpZC1tb2QtZHZjcyIgKi8KKzI3NSwJLyogImlkLW1vZC1rZWEtcHJvZmlsZS04OCIgKi8KKzI3NiwJLyogImlkLW1vZC1rZWEtcHJvZmlsZS05MyIgKi8KKzI4MiwJLyogImlkLW1vZC1vY3NwIiAqLworMjc4LAkvKiAiaWQtbW9kLXF1YWxpZmllZC1jZXJ0LTg4IiAqLworMjc5LAkvKiAiaWQtbW9kLXF1YWxpZmllZC1jZXJ0LTkzIiAqLworMjgxLAkvKiAiaWQtbW9kLXRpbWVzdGFtcC1wcm90b2NvbCIgKi8KKzI2NCwJLyogImlkLW9uIiAqLworMzQ3LAkvKiAiaWQtb24tcGVyc29uYWxEYXRhIiAqLworMjY1LAkvKiAiaWQtcGRhIiAqLworMzUyLAkvKiAiaWQtcGRhLWNvdW50cnlPZkNpdGl6ZW5zaGlwIiAqLworMzUzLAkvKiAiaWQtcGRhLWNvdW50cnlPZlJlc2lkZW5jZSIgKi8KKzM0OCwJLyogImlkLXBkYS1kYXRlT2ZCaXJ0aCIgKi8KKzM1MSwJLyogImlkLXBkYS1nZW5kZXIiICovCiszNDksCS8qICJpZC1wZGEtcGxhY2VPZkJpcnRoIiAqLworMTc1LAkvKiAiaWQtcGUiICovCisyNjEsCS8qICJpZC1wa2lwIiAqLworMjU4LAkvKiAiaWQtcGtpeC1tb2QiICovCisyNjksCS8qICJpZC1wa2l4MS1leHBsaWNpdC04OCIgKi8KKzI3MSwJLyogImlkLXBraXgxLWV4cGxpY2l0LTkzIiAqLworMjcwLAkvKiAiaWQtcGtpeDEtaW1wbGljaXQtODgiICovCisyNzIsCS8qICJpZC1wa2l4MS1pbXBsaWNpdC05MyIgKi8KKzY2MiwJLyogImlkLXBwbCIgKi8KKzI2NywJLyogImlkLXFjcyIgKi8KKzM1OSwJLyogImlkLXFjcy1wa2l4UUNTeW50YXgtdjEiICovCisyNTksCS8qICJpZC1xdCIgKi8KKzMxMywJLyogImlkLXJlZ0N0cmwiICovCiszMTYsCS8qICJpZC1yZWdDdHJsLWF1dGhlbnRpY2F0b3IiICovCiszMTksCS8qICJpZC1yZWdDdHJsLW9sZENlcnRJRCIgKi8KKzMxOCwJLyogImlkLXJlZ0N0cmwtcGtpQXJjaGl2ZU9wdGlvbnMiICovCiszMTcsCS8qICJpZC1yZWdDdHJsLXBraVB1YmxpY2F0aW9uSW5mbyIgKi8KKzMyMCwJLyogImlkLXJlZ0N0cmwtcHJvdG9jb2xFbmNyS2V5IiAqLworMzE1LAkvKiAiaWQtcmVnQ3RybC1yZWdUb2tlbiIgKi8KKzMxNCwJLyogImlkLXJlZ0luZm8iICovCiszMjIsCS8qICJpZC1yZWdJbmZvLWNlcnRSZXEiICovCiszMjEsCS8qICJpZC1yZWdJbmZvLXV0ZjhQYWlycyIgKi8KKzE5MSwJLyogImlkLXNtaW1lLWFhIiAqLworMjE1LAkvKiAiaWQtc21pbWUtYWEtY29udGVudEhpbnQiICovCisyMTgsCS8qICJpZC1zbWltZS1hYS1jb250ZW50SWRlbnRpZmllciIgKi8KKzIyMSwJLyogImlkLXNtaW1lLWFhLWNvbnRlbnRSZWZlcmVuY2UiICovCisyNDAsCS8qICJpZC1zbWltZS1hYS1kdmNzLWR2YyIgKi8KKzIxNywJLyogImlkLXNtaW1lLWFhLWVuY2FwQ29udGVudFR5cGUiICovCisyMjIsCS8qICJpZC1zbWltZS1hYS1lbmNyeXBLZXlQcmVmIiAqLworMjIwLAkvKiAiaWQtc21pbWUtYWEtZXF1aXZhbGVudExhYmVscyIgKi8KKzIzMiwJLyogImlkLXNtaW1lLWFhLWV0cy1DZXJ0aWZpY2F0ZVJlZnMiICovCisyMzMsCS8qICJpZC1zbWltZS1hYS1ldHMtUmV2b2NhdGlvblJlZnMiICovCisyMzgsCS8qICJpZC1zbWltZS1hYS1ldHMtYXJjaGl2ZVRpbWVTdGFtcCIgKi8KKzIzNywJLyogImlkLXNtaW1lLWFhLWV0cy1jZXJ0Q1JMVGltZXN0YW1wIiAqLworMjM0LAkvKiAiaWQtc21pbWUtYWEtZXRzLWNlcnRWYWx1ZXMiICovCisyMjcsCS8qICJpZC1zbWltZS1hYS1ldHMtY29tbWl0bWVudFR5cGUiICovCisyMzEsCS8qICJpZC1zbWltZS1hYS1ldHMtY29udGVudFRpbWVzdGFtcCIgKi8KKzIzNiwJLyogImlkLXNtaW1lLWFhLWV0cy1lc2NUaW1lU3RhbXAiICovCisyMzAsCS8qICJpZC1zbWltZS1hYS1ldHMtb3RoZXJTaWdDZXJ0IiAqLworMjM1LAkvKiAiaWQtc21pbWUtYWEtZXRzLXJldm9jYXRpb25WYWx1ZXMiICovCisyMjYsCS8qICJpZC1zbWltZS1hYS1ldHMtc2lnUG9saWN5SWQiICovCisyMjksCS8qICJpZC1zbWltZS1hYS1ldHMtc2lnbmVyQXR0ciIgKi8KKzIyOCwJLyogImlkLXNtaW1lLWFhLWV0cy1zaWduZXJMb2NhdGlvbiIgKi8KKzIxOSwJLyogImlkLXNtaW1lLWFhLW1hY1ZhbHVlIiAqLworMjE0LAkvKiAiaWQtc21pbWUtYWEtbWxFeHBhbmRIaXN0b3J5IiAqLworMjE2LAkvKiAiaWQtc21pbWUtYWEtbXNnU2lnRGlnZXN0IiAqLworMjEyLAkvKiAiaWQtc21pbWUtYWEtcmVjZWlwdFJlcXVlc3QiICovCisyMTMsCS8qICJpZC1zbWltZS1hYS1zZWN1cml0eUxhYmVsIiAqLworMjM5LAkvKiAiaWQtc21pbWUtYWEtc2lnbmF0dXJlVHlwZSIgKi8KKzIyMywJLyogImlkLXNtaW1lLWFhLXNpZ25pbmdDZXJ0aWZpY2F0ZSIgKi8KKzIyNCwJLyogImlkLXNtaW1lLWFhLXNtaW1lRW5jcnlwdENlcnRzIiAqLworMjI1LAkvKiAiaWQtc21pbWUtYWEtdGltZVN0YW1wVG9rZW4iICovCisxOTIsCS8qICJpZC1zbWltZS1hbGciICovCisyNDMsCS8qICJpZC1zbWltZS1hbGctM0RFU3dyYXAiICovCisyNDYsCS8qICJpZC1zbWltZS1hbGctQ01TM0RFU3dyYXAiICovCisyNDcsCS8qICJpZC1zbWltZS1hbGctQ01TUkMyd3JhcCIgKi8KKzI0NSwJLyogImlkLXNtaW1lLWFsZy1FU0RIIiAqLworMjQxLAkvKiAiaWQtc21pbWUtYWxnLUVTREh3aXRoM0RFUyIgKi8KKzI0MiwJLyogImlkLXNtaW1lLWFsZy1FU0RId2l0aFJDMiIgKi8KKzI0NCwJLyogImlkLXNtaW1lLWFsZy1SQzJ3cmFwIiAqLworMTkzLAkvKiAiaWQtc21pbWUtY2QiICovCisyNDgsCS8qICJpZC1zbWltZS1jZC1sZGFwIiAqLworMTkwLAkvKiAiaWQtc21pbWUtY3QiICovCisyMTAsCS8qICJpZC1zbWltZS1jdC1EVkNTUmVxdWVzdERhdGEiICovCisyMTEsCS8qICJpZC1zbWltZS1jdC1EVkNTUmVzcG9uc2VEYXRhIiAqLworMjA4LAkvKiAiaWQtc21pbWUtY3QtVERUSW5mbyIgKi8KKzIwNywJLyogImlkLXNtaW1lLWN0LVRTVEluZm8iICovCisyMDUsCS8qICJpZC1zbWltZS1jdC1hdXRoRGF0YSIgKi8KKzc4NiwJLyogImlkLXNtaW1lLWN0LWNvbXByZXNzZWREYXRhIiAqLworMjA5LAkvKiAiaWQtc21pbWUtY3QtY29udGVudEluZm8iICovCisyMDYsCS8qICJpZC1zbWltZS1jdC1wdWJsaXNoQ2VydCIgKi8KKzIwNCwJLyogImlkLXNtaW1lLWN0LXJlY2VpcHQiICovCisxOTUsCS8qICJpZC1zbWltZS1jdGkiICovCisyNTUsCS8qICJpZC1zbWltZS1jdGktZXRzLXByb29mT2ZBcHByb3ZhbCIgKi8KKzI1NiwJLyogImlkLXNtaW1lLWN0aS1ldHMtcHJvb2ZPZkNyZWF0aW9uIiAqLworMjUzLAkvKiAiaWQtc21pbWUtY3RpLWV0cy1wcm9vZk9mRGVsaXZlcnkiICovCisyNTEsCS8qICJpZC1zbWltZS1jdGktZXRzLXByb29mT2ZPcmlnaW4iICovCisyNTIsCS8qICJpZC1zbWltZS1jdGktZXRzLXByb29mT2ZSZWNlaXB0IiAqLworMjU0LAkvKiAiaWQtc21pbWUtY3RpLWV0cy1wcm9vZk9mU2VuZGVyIiAqLworMTg5LAkvKiAiaWQtc21pbWUtbW9kIiAqLworMTk2LAkvKiAiaWQtc21pbWUtbW9kLWNtcyIgKi8KKzE5NywJLyogImlkLXNtaW1lLW1vZC1lc3MiICovCisyMDIsCS8qICJpZC1zbWltZS1tb2QtZXRzLWVTaWdQb2xpY3ktODgiICovCisyMDMsCS8qICJpZC1zbWltZS1tb2QtZXRzLWVTaWdQb2xpY3ktOTciICovCisyMDAsCS8qICJpZC1zbWltZS1tb2QtZXRzLWVTaWduYXR1cmUtODgiICovCisyMDEsCS8qICJpZC1zbWltZS1tb2QtZXRzLWVTaWduYXR1cmUtOTciICovCisxOTksCS8qICJpZC1zbWltZS1tb2QtbXNnLXYzIiAqLworMTk4LAkvKiAiaWQtc21pbWUtbW9kLW9pZCIgKi8KKzE5NCwJLyogImlkLXNtaW1lLXNwcSIgKi8KKzI1MCwJLyogImlkLXNtaW1lLXNwcS1ldHMtc3F0LXVub3RpY2UiICovCisyNDksCS8qICJpZC1zbWltZS1zcHEtZXRzLXNxdC11cmkiICovCiszNCwJLyogImlkZWEtY2JjIiAqLworMzUsCS8qICJpZGVhLWNmYiIgKi8KKzM2LAkvKiAiaWRlYS1lY2IiICovCis0NiwJLyogImlkZWEtb2ZiIiAqLworNjc2LAkvKiAiaWRlbnRpZmllZC1vcmdhbml6YXRpb24iICovCis0NjEsCS8qICJpbmZvIiAqLworMTAxLAkvKiAiaW5pdGlhbHMiICovCis4NjksCS8qICJpbnRlcm5hdGlvbmFsaVNETk51bWJlciIgKi8KKzc0OSwJLyogImlwc2VjMyIgKi8KKzc1MCwJLyogImlwc2VjNCIgKi8KKzE4MSwJLyogImlzbyIgKi8KKzYyMywJLyogImlzc3VlciBjYXBhYmlsaXRpZXMiICovCis2NDUsCS8qICJpdHUtdCIgKi8KKzQ5MiwJLyogImphbmV0TWFpbGJveCIgKi8KKzY0NiwJLyogImpvaW50LWlzby1pdHUtdCIgKi8KKzE1MCwJLyogImtleUJhZyIgKi8KKzc3MywJLyogImtpc2EiICovCis0NzcsCS8qICJsYXN0TW9kaWZpZWRCeSIgKi8KKzQ3NiwJLyogImxhc3RNb2RpZmllZFRpbWUiICovCisxNTcsCS8qICJsb2NhbEtleUlEIiAqLworMTUsCS8qICJsb2NhbGl0eU5hbWUiICovCis0ODAsCS8qICJtWFJlY29yZCIgKi8KKzQ5MywJLyogIm1haWxQcmVmZXJlbmNlT3B0aW9uIiAqLworNDY3LAkvKiAibWFuYWdlciIgKi8KKyAzLAkvKiAibWQyIiAqLworIDcsCS8qICJtZDJXaXRoUlNBRW5jcnlwdGlvbiIgKi8KKzI1NywJLyogIm1kNCIgKi8KKzM5NiwJLyogIm1kNFdpdGhSU0FFbmNyeXB0aW9uIiAqLworIDQsCS8qICJtZDUiICovCisxMTQsCS8qICJtZDUtc2hhMSIgKi8KKzEwNCwJLyogIm1kNVdpdGhSU0EiICovCisgOCwJLyogIm1kNVdpdGhSU0FFbmNyeXB0aW9uIiAqLworOTUsCS8qICJtZGMyIiAqLworOTYsCS8qICJtZGMyV2l0aFJTQSIgKi8KKzg3NSwJLyogIm1lbWJlciIgKi8KKzYwMiwJLyogIm1lcmNoYW50IGluaXRpYXRlZCBhdXRoIiAqLworNTE0LAkvKiAibWVzc2FnZSBleHRlbnNpb25zIiAqLworNTEsCS8qICJtZXNzYWdlRGlnZXN0IiAqLworOTExLAkvKiAibWdmMSIgKi8KKzUwNiwJLyogIm1pbWUtbWhzLWJvZGllcyIgKi8KKzUwNSwJLyogIm1pbWUtbWhzLWhlYWRpbmdzIiAqLworNDg4LAkvKiAibW9iaWxlVGVsZXBob25lTnVtYmVyIiAqLworNDgxLAkvKiAiblNSZWNvcmQiICovCisxNzMsCS8qICJuYW1lIiAqLworNjgxLAkvKiAib25CYXNpcyIgKi8KKzM3OSwJLyogIm9yZyIgKi8KKzE3LAkvKiAib3JnYW5pemF0aW9uTmFtZSIgKi8KKzQ5MSwJLyogIm9yZ2FuaXphdGlvbmFsU3RhdHVzIiAqLworMTgsCS8qICJvcmdhbml6YXRpb25hbFVuaXROYW1lIiAqLworNDc1LAkvKiAib3RoZXJNYWlsYm94IiAqLworODc2LAkvKiAib3duZXIiICovCis5MzUsCS8qICJwU3BlY2lmaWVkIiAqLworNDg5LAkvKiAicGFnZXJUZWxlcGhvbmVOdW1iZXIiICovCis3ODIsCS8qICJwYXNzd29yZCBiYXNlZCBNQUMiICovCiszNzQsCS8qICJwYXRoIiAqLworNjIxLAkvKiAicGF5bWVudCBnYXRld2F5IGNhcGFiaWxpdGllcyIgKi8KKyA5LAkvKiAicGJlV2l0aE1EMkFuZERFUy1DQkMiICovCisxNjgsCS8qICJwYmVXaXRoTUQyQW5kUkMyLUNCQyIgKi8KKzExMiwJLyogInBiZVdpdGhNRDVBbmRDYXN0NUNCQyIgKi8KKzEwLAkvKiAicGJlV2l0aE1ENUFuZERFUy1DQkMiICovCisxNjksCS8qICJwYmVXaXRoTUQ1QW5kUkMyLUNCQyIgKi8KKzE0OCwJLyogInBiZVdpdGhTSEExQW5kMTI4Qml0UkMyLUNCQyIgKi8KKzE0NCwJLyogInBiZVdpdGhTSEExQW5kMTI4Qml0UkM0IiAqLworMTQ3LAkvKiAicGJlV2l0aFNIQTFBbmQyLUtleVRyaXBsZURFUy1DQkMiICovCisxNDYsCS8qICJwYmVXaXRoU0hBMUFuZDMtS2V5VHJpcGxlREVTLUNCQyIgKi8KKzE0OSwJLyogInBiZVdpdGhTSEExQW5kNDBCaXRSQzItQ0JDIiAqLworMTQ1LAkvKiAicGJlV2l0aFNIQTFBbmQ0MEJpdFJDNCIgKi8KKzE3MCwJLyogInBiZVdpdGhTSEExQW5kREVTLUNCQyIgKi8KKzY4LAkvKiAicGJlV2l0aFNIQTFBbmRSQzItQ0JDIiAqLworNDk5LAkvKiAicGVyc29uYWxTaWduYXR1cmUiICovCis0ODcsCS8qICJwZXJzb25hbFRpdGxlIiAqLworNDY0LAkvKiAicGhvdG8iICovCis4NjMsCS8qICJwaHlzaWNhbERlbGl2ZXJ5T2ZmaWNlTmFtZSIgKi8KKzQzNywJLyogInBpbG90IiAqLworNDM5LAkvKiAicGlsb3RBdHRyaWJ1dGVTeW50YXgiICovCis0MzgsCS8qICJwaWxvdEF0dHJpYnV0ZVR5cGUiICovCis0NzksCS8qICJwaWxvdEF0dHJpYnV0ZVR5cGUyNyIgKi8KKzQ1NiwJLyogInBpbG90RFNBIiAqLworNDQxLAkvKiAicGlsb3RHcm91cHMiICovCis0NDQsCS8qICJwaWxvdE9iamVjdCIgKi8KKzQ0MCwJLyogInBpbG90T2JqZWN0Q2xhc3MiICovCis0NTUsCS8qICJwaWxvdE9yZ2FuaXphdGlvbiIgKi8KKzQ0NSwJLyogInBpbG90UGVyc29uIiAqLworMTg2LAkvKiAicGtjczEiICovCisyNywJLyogInBrY3MzIiAqLworMTg3LAkvKiAicGtjczUiICovCisyMCwJLyogInBrY3M3IiAqLworMjEsCS8qICJwa2NzNy1kYXRhIiAqLworMjUsCS8qICJwa2NzNy1kaWdlc3REYXRhIiAqLworMjYsCS8qICJwa2NzNy1lbmNyeXB0ZWREYXRhIiAqLworMjMsCS8qICJwa2NzNy1lbnZlbG9wZWREYXRhIiAqLworMjQsCS8qICJwa2NzNy1zaWduZWRBbmRFbnZlbG9wZWREYXRhIiAqLworMjIsCS8qICJwa2NzNy1zaWduZWREYXRhIiAqLworMTUxLAkvKiAicGtjczhTaHJvdWRlZEtleUJhZyIgKi8KKzQ3LAkvKiAicGtjczkiICovCis4NjIsCS8qICJwb3N0T2ZmaWNlQm94IiAqLworODYxLAkvKiAicG9zdGFsQWRkcmVzcyIgKi8KKzY2MSwJLyogInBvc3RhbENvZGUiICovCis2ODMsCS8qICJwcEJhc2lzIiAqLworODcyLAkvKiAicHJlZmVycmVkRGVsaXZlcnlNZXRob2QiICovCis4NzMsCS8qICJwcmVzZW50YXRpb25BZGRyZXNzIiAqLworNDA2LAkvKiAicHJpbWUtZmllbGQiICovCis0MDksCS8qICJwcmltZTE5MnYxIiAqLworNDEwLAkvKiAicHJpbWUxOTJ2MiIgKi8KKzQxMSwJLyogInByaW1lMTkydjMiICovCis0MTIsCS8qICJwcmltZTIzOXYxIiAqLworNDEzLAkvKiAicHJpbWUyMzl2MiIgKi8KKzQxNCwJLyogInByaW1lMjM5djMiICovCis0MTUsCS8qICJwcmltZTI1NnYxIiAqLworODg2LAkvKiAicHJvdG9jb2xJbmZvcm1hdGlvbiIgKi8KKzUxMCwJLyogInBzZXVkb255bSIgKi8KKzQzNSwJLyogInBzcyIgKi8KKzI4NiwJLyogInFjU3RhdGVtZW50cyIgKi8KKzQ1NywJLyogInF1YWxpdHlMYWJlbGxlZERhdGEiICovCis0NTAsCS8qICJyRkM4MjJsb2NhbFBhcnQiICovCis5OCwJLyogInJjMi00MC1jYmMiICovCisxNjYsCS8qICJyYzItNjQtY2JjIiAqLworMzcsCS8qICJyYzItY2JjIiAqLworMzksCS8qICJyYzItY2ZiIiAqLworMzgsCS8qICJyYzItZWNiIiAqLworNDAsCS8qICJyYzItb2ZiIiAqLworIDUsCS8qICJyYzQiICovCis5NywJLyogInJjNC00MCIgKi8KKzkxNSwJLyogInJjNC1obWFjLW1kNSIgKi8KKzEyMCwJLyogInJjNS1jYmMiICovCisxMjIsCS8qICJyYzUtY2ZiIiAqLworMTIxLAkvKiAicmM1LWVjYiIgKi8KKzEyMywJLyogInJjNS1vZmIiICovCis4NzAsCS8qICJyZWdpc3RlcmVkQWRkcmVzcyIgKi8KKzQ2MCwJLyogInJmYzgyMk1haWxib3giICovCisxMTcsCS8qICJyaXBlbWQxNjAiICovCisxMTksCS8qICJyaXBlbWQxNjBXaXRoUlNBIiAqLworNDAwLAkvKiAicm9sZSIgKi8KKzg3NywJLyogInJvbGVPY2N1cGFudCIgKi8KKzQ0OCwJLyogInJvb20iICovCis0NjMsCS8qICJyb29tTnVtYmVyIiAqLworMTksCS8qICJyc2EiICovCisgNiwJLyogInJzYUVuY3J5cHRpb24iICovCis2NDQsCS8qICJyc2FPQUVQRW5jcnlwdGlvblNFVCIgKi8KKzM3NywJLyogInJzYVNpZ25hdHVyZSIgKi8KKzkxOSwJLyogInJzYWVzT2FlcCIgKi8KKzkxMiwJLyogInJzYXNzYVBzcyIgKi8KKzEyNCwJLyogInJ1biBsZW5ndGggY29tcHJlc3Npb24iICovCis0ODIsCS8qICJzT0FSZWNvcmQiICovCisxNTUsCS8qICJzYWZlQ29udGVudHNCYWciICovCisyOTEsCS8qICJzYmdwLWF1dG9ub21vdXNTeXNOdW0iICovCisyOTAsCS8qICJzYmdwLWlwQWRkckJsb2NrIiAqLworMjkyLAkvKiAic2JncC1yb3V0ZXJJZGVudGlmaWVyIiAqLworMTU5LAkvKiAic2RzaUNlcnRpZmljYXRlIiAqLworODU5LAkvKiAic2VhcmNoR3VpZGUiICovCis3MDQsCS8qICJzZWNwMTEycjEiICovCis3MDUsCS8qICJzZWNwMTEycjIiICovCis3MDYsCS8qICJzZWNwMTI4cjEiICovCis3MDcsCS8qICJzZWNwMTI4cjIiICovCis3MDgsCS8qICJzZWNwMTYwazEiICovCis3MDksCS8qICJzZWNwMTYwcjEiICovCis3MTAsCS8qICJzZWNwMTYwcjIiICovCis3MTEsCS8qICJzZWNwMTkyazEiICovCis3MTIsCS8qICJzZWNwMjI0azEiICovCis3MTMsCS8qICJzZWNwMjI0cjEiICovCis3MTQsCS8qICJzZWNwMjU2azEiICovCis3MTUsCS8qICJzZWNwMzg0cjEiICovCis3MTYsCS8qICJzZWNwNTIxcjEiICovCisxNTQsCS8qICJzZWNyZXRCYWciICovCis0NzQsCS8qICJzZWNyZXRhcnkiICovCis3MTcsCS8qICJzZWN0MTEzcjEiICovCis3MTgsCS8qICJzZWN0MTEzcjIiICovCis3MTksCS8qICJzZWN0MTMxcjEiICovCis3MjAsCS8qICJzZWN0MTMxcjIiICovCis3MjEsCS8qICJzZWN0MTYzazEiICovCis3MjIsCS8qICJzZWN0MTYzcjEiICovCis3MjMsCS8qICJzZWN0MTYzcjIiICovCis3MjQsCS8qICJzZWN0MTkzcjEiICovCis3MjUsCS8qICJzZWN0MTkzcjIiICovCis3MjYsCS8qICJzZWN0MjMzazEiICovCis3MjcsCS8qICJzZWN0MjMzcjEiICovCis3MjgsCS8qICJzZWN0MjM5azEiICovCis3MjksCS8qICJzZWN0MjgzazEiICovCis3MzAsCS8qICJzZWN0MjgzcjEiICovCis3MzEsCS8qICJzZWN0NDA5azEiICovCis3MzIsCS8qICJzZWN0NDA5cjEiICovCis3MzMsCS8qICJzZWN0NTcxazEiICovCis3MzQsCS8qICJzZWN0NTcxcjEiICovCis2MzUsCS8qICJzZWN1cmUgZGV2aWNlIHNpZ25hdHVyZSIgKi8KKzg3OCwJLyogInNlZUFsc28iICovCis3NzcsCS8qICJzZWVkLWNiYyIgKi8KKzc3OSwJLyogInNlZWQtY2ZiIiAqLworNzc2LAkvKiAic2VlZC1lY2IiICovCis3NzgsCS8qICJzZWVkLW9mYiIgKi8KKzEwNSwJLyogInNlcmlhbE51bWJlciIgKi8KKzYyNSwJLyogInNldC1hZGRQb2xpY3kiICovCis1MTUsCS8qICJzZXQtYXR0ciIgKi8KKzUxOCwJLyogInNldC1icmFuZCIgKi8KKzYzOCwJLyogInNldC1icmFuZC1BbWVyaWNhbkV4cHJlc3MiICovCis2MzcsCS8qICJzZXQtYnJhbmQtRGluZXJzIiAqLworNjM2LAkvKiAic2V0LWJyYW5kLUlBVEEtQVRBIiAqLworNjM5LAkvKiAic2V0LWJyYW5kLUpDQiIgKi8KKzY0MSwJLyogInNldC1icmFuZC1NYXN0ZXJDYXJkIiAqLworNjQyLAkvKiAic2V0LWJyYW5kLU5vdnVzIiAqLworNjQwLAkvKiAic2V0LWJyYW5kLVZpc2EiICovCis1MTYsCS8qICJzZXQtcG9saWN5IiAqLworNjA3LAkvKiAic2V0LXBvbGljeS1yb290IiAqLworNjI0LAkvKiAic2V0LXJvb3RLZXlUaHVtYiIgKi8KKzYyMCwJLyogInNldEF0dHItQ2VydCIgKi8KKzYyOCwJLyogInNldEF0dHItSXNzQ2FwLUNWTSIgKi8KKzYzMCwJLyogInNldEF0dHItSXNzQ2FwLVNpZyIgKi8KKzYyOSwJLyogInNldEF0dHItSXNzQ2FwLVQyIiAqLworNjI3LAkvKiAic2V0QXR0ci1Ub2tlbi1CMFByaW1lIiAqLworNjI2LAkvKiAic2V0QXR0ci1Ub2tlbi1FTVYiICovCis2MjIsCS8qICJzZXRBdHRyLVRva2VuVHlwZSIgKi8KKzYxOSwJLyogInNldENleHQtSXNzdWVyQ2FwYWJpbGl0aWVzIiAqLworNjE1LAkvKiAic2V0Q2V4dC1QR1dZY2FwYWJpbGl0aWVzIiAqLworNjE2LAkvKiAic2V0Q2V4dC1Ub2tlbklkZW50aWZpZXIiICovCis2MTgsCS8qICJzZXRDZXh0LVRva2VuVHlwZSIgKi8KKzYxNywJLyogInNldENleHQtVHJhY2syRGF0YSIgKi8KKzYxMSwJLyogInNldENleHQtY0NlcnRSZXF1aXJlZCIgKi8KKzYwOSwJLyogInNldENleHQtY2VydFR5cGUiICovCis2MDgsCS8qICJzZXRDZXh0LWhhc2hlZFJvb3QiICovCis2MTAsCS8qICJzZXRDZXh0LW1lcmNoRGF0YSIgKi8KKzYxMywJLyogInNldENleHQtc2V0RXh0IiAqLworNjE0LAkvKiAic2V0Q2V4dC1zZXRRdWFsZiIgKi8KKzYxMiwJLyogInNldENleHQtdHVubmVsaW5nIiAqLworNTQwLAkvKiAic2V0Y3QtQWNxQ2FyZENvZGVNc2ciICovCis1NzYsCS8qICJzZXRjdC1BY3FDYXJkQ29kZU1zZ1RCRSIgKi8KKzU3MCwJLyogInNldGN0LUF1dGhSZXFUQkUiICovCis1MzQsCS8qICJzZXRjdC1BdXRoUmVxVEJTIiAqLworNTI3LAkvKiAic2V0Y3QtQXV0aFJlc0JhZ2dhZ2UiICovCis1NzEsCS8qICJzZXRjdC1BdXRoUmVzVEJFIiAqLworNTcyLAkvKiAic2V0Y3QtQXV0aFJlc1RCRVgiICovCis1MzUsCS8qICJzZXRjdC1BdXRoUmVzVEJTIiAqLworNTM2LAkvKiAic2V0Y3QtQXV0aFJlc1RCU1giICovCis1MjgsCS8qICJzZXRjdC1BdXRoUmV2UmVxQmFnZ2FnZSIgKi8KKzU3NywJLyogInNldGN0LUF1dGhSZXZSZXFUQkUiICovCis1NDEsCS8qICJzZXRjdC1BdXRoUmV2UmVxVEJTIiAqLworNTI5LAkvKiAic2V0Y3QtQXV0aFJldlJlc0JhZ2dhZ2UiICovCis1NDIsCS8qICJzZXRjdC1BdXRoUmV2UmVzRGF0YSIgKi8KKzU3OCwJLyogInNldGN0LUF1dGhSZXZSZXNUQkUiICovCis1NzksCS8qICJzZXRjdC1BdXRoUmV2UmVzVEJFQiIgKi8KKzU0MywJLyogInNldGN0LUF1dGhSZXZSZXNUQlMiICovCis1NzMsCS8qICJzZXRjdC1BdXRoVG9rZW5UQkUiICovCis1MzcsCS8qICJzZXRjdC1BdXRoVG9rZW5UQlMiICovCis2MDAsCS8qICJzZXRjdC1CQ0lEaXN0cmlidXRpb25UQlMiICovCis1NTgsCS8qICJzZXRjdC1CYXRjaEFkbWluUmVxRGF0YSIgKi8KKzU5MiwJLyogInNldGN0LUJhdGNoQWRtaW5SZXFUQkUiICovCis1NTksCS8qICJzZXRjdC1CYXRjaEFkbWluUmVzRGF0YSIgKi8KKzU5MywJLyogInNldGN0LUJhdGNoQWRtaW5SZXNUQkUiICovCis1OTksCS8qICJzZXRjdC1DUkxOb3RpZmljYXRpb25SZXNUQlMiICovCis1OTgsCS8qICJzZXRjdC1DUkxOb3RpZmljYXRpb25UQlMiICovCis1ODAsCS8qICJzZXRjdC1DYXBSZXFUQkUiICovCis1ODEsCS8qICJzZXRjdC1DYXBSZXFUQkVYIiAqLworNTQ0LAkvKiAic2V0Y3QtQ2FwUmVxVEJTIiAqLworNTQ1LAkvKiAic2V0Y3QtQ2FwUmVxVEJTWCIgKi8KKzU0NiwJLyogInNldGN0LUNhcFJlc0RhdGEiICovCis1ODIsCS8qICJzZXRjdC1DYXBSZXNUQkUiICovCis1ODMsCS8qICJzZXRjdC1DYXBSZXZSZXFUQkUiICovCis1ODQsCS8qICJzZXRjdC1DYXBSZXZSZXFUQkVYIiAqLworNTQ3LAkvKiAic2V0Y3QtQ2FwUmV2UmVxVEJTIiAqLworNTQ4LAkvKiAic2V0Y3QtQ2FwUmV2UmVxVEJTWCIgKi8KKzU0OSwJLyogInNldGN0LUNhcFJldlJlc0RhdGEiICovCis1ODUsCS8qICJzZXRjdC1DYXBSZXZSZXNUQkUiICovCis1MzgsCS8qICJzZXRjdC1DYXBUb2tlbkRhdGEiICovCis1MzAsCS8qICJzZXRjdC1DYXBUb2tlblNlcSIgKi8KKzU3NCwJLyogInNldGN0LUNhcFRva2VuVEJFIiAqLworNTc1LAkvKiAic2V0Y3QtQ2FwVG9rZW5UQkVYIiAqLworNTM5LAkvKiAic2V0Y3QtQ2FwVG9rZW5UQlMiICovCis1NjAsCS8qICJzZXRjdC1DYXJkQ0luaXRSZXNUQlMiICovCis1NjYsCS8qICJzZXRjdC1DZXJ0SW5xUmVxVEJTIiAqLworNTYzLAkvKiAic2V0Y3QtQ2VydFJlcURhdGEiICovCis1OTUsCS8qICJzZXRjdC1DZXJ0UmVxVEJFIiAqLworNTk2LAkvKiAic2V0Y3QtQ2VydFJlcVRCRVgiICovCis1NjQsCS8qICJzZXRjdC1DZXJ0UmVxVEJTIiAqLworNTY1LAkvKiAic2V0Y3QtQ2VydFJlc0RhdGEiICovCis1OTcsCS8qICJzZXRjdC1DZXJ0UmVzVEJFIiAqLworNTg2LAkvKiAic2V0Y3QtQ3JlZFJlcVRCRSIgKi8KKzU4NywJLyogInNldGN0LUNyZWRSZXFUQkVYIiAqLworNTUwLAkvKiAic2V0Y3QtQ3JlZFJlcVRCUyIgKi8KKzU1MSwJLyogInNldGN0LUNyZWRSZXFUQlNYIiAqLworNTUyLAkvKiAic2V0Y3QtQ3JlZFJlc0RhdGEiICovCis1ODgsCS8qICJzZXRjdC1DcmVkUmVzVEJFIiAqLworNTg5LAkvKiAic2V0Y3QtQ3JlZFJldlJlcVRCRSIgKi8KKzU5MCwJLyogInNldGN0LUNyZWRSZXZSZXFUQkVYIiAqLworNTUzLAkvKiAic2V0Y3QtQ3JlZFJldlJlcVRCUyIgKi8KKzU1NCwJLyogInNldGN0LUNyZWRSZXZSZXFUQlNYIiAqLworNTU1LAkvKiAic2V0Y3QtQ3JlZFJldlJlc0RhdGEiICovCis1OTEsCS8qICJzZXRjdC1DcmVkUmV2UmVzVEJFIiAqLworNTY3LAkvKiAic2V0Y3QtRXJyb3JUQlMiICovCis1MjYsCS8qICJzZXRjdC1IT0RJbnB1dCIgKi8KKzU2MSwJLyogInNldGN0LU1lQXFDSW5pdFJlc1RCUyIgKi8KKzUyMiwJLyogInNldGN0LU9JRGF0YSIgKi8KKzUxOSwJLyogInNldGN0LVBBTkRhdGEiICovCis1MjEsCS8qICJzZXRjdC1QQU5Pbmx5IiAqLworNTIwLAkvKiAic2V0Y3QtUEFOVG9rZW4iICovCis1NTYsCS8qICJzZXRjdC1QQ2VydFJlcURhdGEiICovCis1NTcsCS8qICJzZXRjdC1QQ2VydFJlc1RCUyIgKi8KKzUyMywJLyogInNldGN0LVBJIiAqLworNTMyLAkvKiAic2V0Y3QtUEktVEJTIiAqLworNTI0LAkvKiAic2V0Y3QtUElEYXRhIiAqLworNTI1LAkvKiAic2V0Y3QtUElEYXRhVW5zaWduZWQiICovCis1NjgsCS8qICJzZXRjdC1QSUR1YWxTaWduZWRUQkUiICovCis1NjksCS8qICJzZXRjdC1QSVVuc2lnbmVkVEJFIiAqLworNTMxLAkvKiAic2V0Y3QtUEluaXRSZXNEYXRhIiAqLworNTMzLAkvKiAic2V0Y3QtUFJlc0RhdGEiICovCis1OTQsCS8qICJzZXRjdC1SZWdGb3JtUmVxVEJFIiAqLworNTYyLAkvKiAic2V0Y3QtUmVnRm9ybVJlc1RCUyIgKi8KKzYwNCwJLyogInNldGV4dC1waW5BbnkiICovCis2MDMsCS8qICJzZXRleHQtcGluU2VjdXJlIiAqLworNjA1LAkvKiAic2V0ZXh0LXRyYWNrMiIgKi8KKzQxLAkvKiAic2hhIiAqLworNjQsCS8qICJzaGExIiAqLworMTE1LAkvKiAic2hhMVdpdGhSU0EiICovCis2NSwJLyogInNoYTFXaXRoUlNBRW5jcnlwdGlvbiIgKi8KKzY3NSwJLyogInNoYTIyNCIgKi8KKzY3MSwJLyogInNoYTIyNFdpdGhSU0FFbmNyeXB0aW9uIiAqLworNjcyLAkvKiAic2hhMjU2IiAqLworNjY4LAkvKiAic2hhMjU2V2l0aFJTQUVuY3J5cHRpb24iICovCis2NzMsCS8qICJzaGEzODQiICovCis2NjksCS8qICJzaGEzODRXaXRoUlNBRW5jcnlwdGlvbiIgKi8KKzY3NCwJLyogInNoYTUxMiIgKi8KKzY3MCwJLyogInNoYTUxMldpdGhSU0FFbmNyeXB0aW9uIiAqLworNDIsCS8qICJzaGFXaXRoUlNBRW5jcnlwdGlvbiIgKi8KKzUyLAkvKiAic2lnbmluZ1RpbWUiICovCis0NTQsCS8qICJzaW1wbGVTZWN1cml0eU9iamVjdCIgKi8KKzQ5NiwJLyogInNpbmdsZUxldmVsUXVhbGl0eSIgKi8KKzE2LAkvKiAic3RhdGVPclByb3ZpbmNlTmFtZSIgKi8KKzY2MCwJLyogInN0cmVldEFkZHJlc3MiICovCis0OTgsCS8qICJzdWJ0cmVlTWF4aW11bVF1YWxpdHkiICovCis0OTcsCS8qICJzdWJ0cmVlTWluaW11bVF1YWxpdHkiICovCis4OTAsCS8qICJzdXBwb3J0ZWRBbGdvcml0aG1zIiAqLworODc0LAkvKiAic3VwcG9ydGVkQXBwbGljYXRpb25Db250ZXh0IiAqLworMTAwLAkvKiAic3VybmFtZSIgKi8KKzg2NCwJLyogInRlbGVwaG9uZU51bWJlciIgKi8KKzg2NiwJLyogInRlbGV0ZXhUZXJtaW5hbElkZW50aWZpZXIiICovCis4NjUsCS8qICJ0ZWxleE51bWJlciIgKi8KKzQ1OSwJLyogInRleHRFbmNvZGVkT1JBZGRyZXNzIiAqLworMjkzLAkvKiAidGV4dE5vdGljZSIgKi8KKzEwNiwJLyogInRpdGxlIiAqLworNjgyLAkvKiAidHBCYXNpcyIgKi8KKzQzNiwJLyogInVjbCIgKi8KKyAwLAkvKiAidW5kZWZpbmVkIiAqLworODg4LAkvKiAidW5pcXVlTWVtYmVyIiAqLworNTUsCS8qICJ1bnN0cnVjdHVyZWRBZGRyZXNzIiAqLworNDksCS8qICJ1bnN0cnVjdHVyZWROYW1lIiAqLworODgwLAkvKiAidXNlckNlcnRpZmljYXRlIiAqLworNDY1LAkvKiAidXNlckNsYXNzIiAqLworNDU4LAkvKiAidXNlcklkIiAqLworODc5LAkvKiAidXNlclBhc3N3b3JkIiAqLworMzczLAkvKiAidmFsaWQiICovCis2NzgsCS8qICJ3YXAiICovCis2NzksCS8qICJ3YXAtd3NnIiAqLworNzM1LAkvKiAid2FwLXdzZy1pZG0tZWNpZC13dGxzMSIgKi8KKzc0MywJLyogIndhcC13c2ctaWRtLWVjaWQtd3RsczEwIiAqLworNzQ0LAkvKiAid2FwLXdzZy1pZG0tZWNpZC13dGxzMTEiICovCis3NDUsCS8qICJ3YXAtd3NnLWlkbS1lY2lkLXd0bHMxMiIgKi8KKzczNiwJLyogIndhcC13c2ctaWRtLWVjaWQtd3RsczMiICovCis3MzcsCS8qICJ3YXAtd3NnLWlkbS1lY2lkLXd0bHM0IiAqLworNzM4LAkvKiAid2FwLXdzZy1pZG0tZWNpZC13dGxzNSIgKi8KKzczOSwJLyogIndhcC13c2ctaWRtLWVjaWQtd3RsczYiICovCis3NDAsCS8qICJ3YXAtd3NnLWlkbS1lY2lkLXd0bHM3IiAqLworNzQxLAkvKiAid2FwLXdzZy1pZG0tZWNpZC13dGxzOCIgKi8KKzc0MiwJLyogIndhcC13c2ctaWRtLWVjaWQtd3RsczkiICovCis4MDQsCS8qICJ3aGlybHBvb2wiICovCis4NjgsCS8qICJ4MTIxQWRkcmVzcyIgKi8KKzUwMywJLyogIng1MDBVbmlxdWVJZGVudGlmaWVyIiAqLworMTU4LAkvKiAieDUwOUNlcnRpZmljYXRlIiAqLworMTYwLAkvKiAieDUwOUNybCIgKi8KKzEyNSwJLyogInpsaWIgY29tcHJlc3Npb24iICovCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGtOSURzSW5PSURPcmRlcltOVU1fT0JKXT17CisgMCwJLyogT0JKX3VuZGVmICAgICAgICAgICAgICAgICAgICAgICAgMCAqLworMzkzLAkvKiBPQkpfam9pbnRfaXNvX2NjaXR0ICAgICAgICAgICAgICBPQkpfam9pbnRfaXNvX2l0dV90ICovCis0MDQsCS8qIE9CSl9jY2l0dCAgICAgICAgICAgICAgICAgICAgICAgIE9CSl9pdHVfdCAqLworNjQ1LAkvKiBPQkpfaXR1X3QgICAgICAgICAgICAgICAgICAgICAgICAwICovCis0MzQsCS8qIE9CSl9kYXRhICAgICAgICAgICAgICAgICAgICAgICAgIDAgOSAqLworMTgxLAkvKiBPQkpfaXNvICAgICAgICAgICAgICAgICAgICAgICAgICAxICovCisxODIsCS8qIE9CSl9tZW1iZXJfYm9keSAgICAgICAgICAgICAgICAgIDEgMiAqLworMzc5LAkvKiBPQkpfb3JnICAgICAgICAgICAgICAgICAgICAgICAgICAxIDMgKi8KKzY3NiwJLyogT0JKX2lkZW50aWZpZWRfb3JnYW5pemF0aW9uICAgICAgMSAzICovCis2NDYsCS8qIE9CSl9qb2ludF9pc29faXR1X3QgICAgICAgICAgICAgIDIgKi8KKzExLAkvKiBPQkpfWDUwMCAgICAgICAgICAgICAgICAgICAgICAgICAyIDUgKi8KKzY0NywJLyogT0JKX2ludGVybmF0aW9uYWxfb3JnYW5pemF0aW9ucyAgMiAyMyAqLworMzgwLAkvKiBPQkpfZG9kICAgICAgICAgICAgICAgICAgICAgICAgICAxIDMgNiAqLworMTIsCS8qIE9CSl9YNTA5ICAgICAgICAgICAgICAgICAgICAgICAgIDIgNSA0ICovCiszNzgsCS8qIE9CSl9YNTAwYWxnb3JpdGhtcyAgICAgICAgICAgICAgIDIgNSA4ICovCis4MSwJLyogT0JKX2lkX2NlICAgICAgICAgICAgICAgICAgICAgICAgMiA1IDI5ICovCis1MTIsCS8qIE9CSl9pZF9zZXQgICAgICAgICAgICAgICAgICAgICAgIDIgMjMgNDIgKi8KKzY3OCwJLyogT0JKX3dhcCAgICAgICAgICAgICAgICAgICAgICAgICAgMiAyMyA0MyAqLworNDM1LAkvKiBPQkpfcHNzICAgICAgICAgICAgICAgICAgICAgICAgICAwIDkgMjM0MiAqLworMTgzLAkvKiBPQkpfSVNPX1VTICAgICAgICAgICAgICAgICAgICAgICAxIDIgODQwICovCiszODEsCS8qIE9CSl9pYW5hICAgICAgICAgICAgICAgICAgICAgICAgIDEgMyA2IDEgKi8KKzY3NywJLyogT0JKX2NlcnRpY29tX2FyYyAgICAgICAgICAgICAgICAgMSAzIDEzMiAqLworMzk0LAkvKiBPQkpfc2VsZWN0ZWRfYXR0cmlidXRlX3R5cGVzICAgICAyIDUgMSA1ICovCisxMywJLyogT0JKX2NvbW1vbk5hbWUgICAgICAgICAgICAgICAgICAgMiA1IDQgMyAqLworMTAwLAkvKiBPQkpfc3VybmFtZSAgICAgICAgICAgICAgICAgICAgICAyIDUgNCA0ICovCisxMDUsCS8qIE9CSl9zZXJpYWxOdW1iZXIgICAgICAgICAgICAgICAgIDIgNSA0IDUgKi8KKzE0LAkvKiBPQkpfY291bnRyeU5hbWUgICAgICAgICAgICAgICAgICAyIDUgNCA2ICovCisxNSwJLyogT0JKX2xvY2FsaXR5TmFtZSAgICAgICAgICAgICAgICAgMiA1IDQgNyAqLworMTYsCS8qIE9CSl9zdGF0ZU9yUHJvdmluY2VOYW1lICAgICAgICAgIDIgNSA0IDggKi8KKzY2MCwJLyogT0JKX3N0cmVldEFkZHJlc3MgICAgICAgICAgICAgICAgMiA1IDQgOSAqLworMTcsCS8qIE9CSl9vcmdhbml6YXRpb25OYW1lICAgICAgICAgICAgIDIgNSA0IDEwICovCisxOCwJLyogT0JKX29yZ2FuaXphdGlvbmFsVW5pdE5hbWUgICAgICAgMiA1IDQgMTEgKi8KKzEwNiwJLyogT0JKX3RpdGxlICAgICAgICAgICAgICAgICAgICAgICAgMiA1IDQgMTIgKi8KKzEwNywJLyogT0JKX2Rlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgMiA1IDQgMTMgKi8KKzg1OSwJLyogT0JKX3NlYXJjaEd1aWRlICAgICAgICAgICAgICAgICAgMiA1IDQgMTQgKi8KKzg2MCwJLyogT0JKX2J1c2luZXNzQ2F0ZWdvcnkgICAgICAgICAgICAgMiA1IDQgMTUgKi8KKzg2MSwJLyogT0JKX3Bvc3RhbEFkZHJlc3MgICAgICAgICAgICAgICAgMiA1IDQgMTYgKi8KKzY2MSwJLyogT0JKX3Bvc3RhbENvZGUgICAgICAgICAgICAgICAgICAgMiA1IDQgMTcgKi8KKzg2MiwJLyogT0JKX3Bvc3RPZmZpY2VCb3ggICAgICAgICAgICAgICAgMiA1IDQgMTggKi8KKzg2MywJLyogT0JKX3BoeXNpY2FsRGVsaXZlcnlPZmZpY2VOYW1lICAgMiA1IDQgMTkgKi8KKzg2NCwJLyogT0JKX3RlbGVwaG9uZU51bWJlciAgICAgICAgICAgICAgMiA1IDQgMjAgKi8KKzg2NSwJLyogT0JKX3RlbGV4TnVtYmVyICAgICAgICAgICAgICAgICAgMiA1IDQgMjEgKi8KKzg2NiwJLyogT0JKX3RlbGV0ZXhUZXJtaW5hbElkZW50aWZpZXIgICAgMiA1IDQgMjIgKi8KKzg2NywJLyogT0JKX2ZhY3NpbWlsZVRlbGVwaG9uZU51bWJlciAgICAgMiA1IDQgMjMgKi8KKzg2OCwJLyogT0JKX3gxMjFBZGRyZXNzICAgICAgICAgICAgICAgICAgMiA1IDQgMjQgKi8KKzg2OSwJLyogT0JKX2ludGVybmF0aW9uYWxpU0ROTnVtYmVyICAgICAgMiA1IDQgMjUgKi8KKzg3MCwJLyogT0JKX3JlZ2lzdGVyZWRBZGRyZXNzICAgICAgICAgICAgMiA1IDQgMjYgKi8KKzg3MSwJLyogT0JKX2Rlc3RpbmF0aW9uSW5kaWNhdG9yICAgICAgICAgMiA1IDQgMjcgKi8KKzg3MiwJLyogT0JKX3ByZWZlcnJlZERlbGl2ZXJ5TWV0aG9kICAgICAgMiA1IDQgMjggKi8KKzg3MywJLyogT0JKX3ByZXNlbnRhdGlvbkFkZHJlc3MgICAgICAgICAgMiA1IDQgMjkgKi8KKzg3NCwJLyogT0JKX3N1cHBvcnRlZEFwcGxpY2F0aW9uQ29udGV4dCAgMiA1IDQgMzAgKi8KKzg3NSwJLyogT0JKX21lbWJlciAgICAgICAgICAgICAgICAgICAgICAgMiA1IDQgMzEgKi8KKzg3NiwJLyogT0JKX293bmVyICAgICAgICAgICAgICAgICAgICAgICAgMiA1IDQgMzIgKi8KKzg3NywJLyogT0JKX3JvbGVPY2N1cGFudCAgICAgICAgICAgICAgICAgMiA1IDQgMzMgKi8KKzg3OCwJLyogT0JKX3NlZUFsc28gICAgICAgICAgICAgICAgICAgICAgMiA1IDQgMzQgKi8KKzg3OSwJLyogT0JKX3VzZXJQYXNzd29yZCAgICAgICAgICAgICAgICAgMiA1IDQgMzUgKi8KKzg4MCwJLyogT0JKX3VzZXJDZXJ0aWZpY2F0ZSAgICAgICAgICAgICAgMiA1IDQgMzYgKi8KKzg4MSwJLyogT0JKX2NBQ2VydGlmaWNhdGUgICAgICAgICAgICAgICAgMiA1IDQgMzcgKi8KKzg4MiwJLyogT0JKX2F1dGhvcml0eVJldm9jYXRpb25MaXN0ICAgICAgMiA1IDQgMzggKi8KKzg4MywJLyogT0JKX2NlcnRpZmljYXRlUmV2b2NhdGlvbkxpc3QgICAgMiA1IDQgMzkgKi8KKzg4NCwJLyogT0JKX2Nyb3NzQ2VydGlmaWNhdGVQYWlyICAgICAgICAgMiA1IDQgNDAgKi8KKzE3MywJLyogT0JKX25hbWUgICAgICAgICAgICAgICAgICAgICAgICAgMiA1IDQgNDEgKi8KKzk5LAkvKiBPQkpfZ2l2ZW5OYW1lICAgICAgICAgICAgICAgICAgICAyIDUgNCA0MiAqLworMTAxLAkvKiBPQkpfaW5pdGlhbHMgICAgICAgICAgICAgICAgICAgICAyIDUgNCA0MyAqLworNTA5LAkvKiBPQkpfZ2VuZXJhdGlvblF1YWxpZmllciAgICAgICAgICAyIDUgNCA0NCAqLworNTAzLAkvKiBPQkpfeDUwMFVuaXF1ZUlkZW50aWZpZXIgICAgICAgICAyIDUgNCA0NSAqLworMTc0LAkvKiBPQkpfZG5RdWFsaWZpZXIgICAgICAgICAgICAgICAgICAyIDUgNCA0NiAqLworODg1LAkvKiBPQkpfZW5oYW5jZWRTZWFyY2hHdWlkZSAgICAgICAgICAyIDUgNCA0NyAqLworODg2LAkvKiBPQkpfcHJvdG9jb2xJbmZvcm1hdGlvbiAgICAgICAgICAyIDUgNCA0OCAqLworODg3LAkvKiBPQkpfZGlzdGluZ3Vpc2hlZE5hbWUgICAgICAgICAgICAyIDUgNCA0OSAqLworODg4LAkvKiBPQkpfdW5pcXVlTWVtYmVyICAgICAgICAgICAgICAgICAyIDUgNCA1MCAqLworODg5LAkvKiBPQkpfaG91c2VJZGVudGlmaWVyICAgICAgICAgICAgICAyIDUgNCA1MSAqLworODkwLAkvKiBPQkpfc3VwcG9ydGVkQWxnb3JpdGhtcyAgICAgICAgICAyIDUgNCA1MiAqLworODkxLAkvKiBPQkpfZGVsdGFSZXZvY2F0aW9uTGlzdCAgICAgICAgICAyIDUgNCA1MyAqLworODkyLAkvKiBPQkpfZG1kTmFtZSAgICAgICAgICAgICAgICAgICAgICAyIDUgNCA1NCAqLworNTEwLAkvKiBPQkpfcHNldWRvbnltICAgICAgICAgICAgICAgICAgICAyIDUgNCA2NSAqLworNDAwLAkvKiBPQkpfcm9sZSAgICAgICAgICAgICAgICAgICAgICAgICAyIDUgNCA3MiAqLworNzY5LAkvKiBPQkpfc3ViamVjdF9kaXJlY3RvcnlfYXR0cmlidXRlcyAyIDUgMjkgOSAqLworODIsCS8qIE9CSl9zdWJqZWN0X2tleV9pZGVudGlmaWVyICAgICAgIDIgNSAyOSAxNCAqLworODMsCS8qIE9CSl9rZXlfdXNhZ2UgICAgICAgICAgICAgICAgICAgIDIgNSAyOSAxNSAqLworODQsCS8qIE9CSl9wcml2YXRlX2tleV91c2FnZV9wZXJpb2QgICAgIDIgNSAyOSAxNiAqLworODUsCS8qIE9CSl9zdWJqZWN0X2FsdF9uYW1lICAgICAgICAgICAgIDIgNSAyOSAxNyAqLworODYsCS8qIE9CSl9pc3N1ZXJfYWx0X25hbWUgICAgICAgICAgICAgIDIgNSAyOSAxOCAqLworODcsCS8qIE9CSl9iYXNpY19jb25zdHJhaW50cyAgICAgICAgICAgIDIgNSAyOSAxOSAqLworODgsCS8qIE9CSl9jcmxfbnVtYmVyICAgICAgICAgICAgICAgICAgIDIgNSAyOSAyMCAqLworMTQxLAkvKiBPQkpfY3JsX3JlYXNvbiAgICAgICAgICAgICAgICAgICAyIDUgMjkgMjEgKi8KKzQzMCwJLyogT0JKX2hvbGRfaW5zdHJ1Y3Rpb25fY29kZSAgICAgICAgMiA1IDI5IDIzICovCisxNDIsCS8qIE9CSl9pbnZhbGlkaXR5X2RhdGUgICAgICAgICAgICAgIDIgNSAyOSAyNCAqLworMTQwLAkvKiBPQkpfZGVsdGFfY3JsICAgICAgICAgICAgICAgICAgICAyIDUgMjkgMjcgKi8KKzc3MCwJLyogT0JKX2lzc3VpbmdfZGlzdHJpYnV0aW9uX3BvaW50ICAgMiA1IDI5IDI4ICovCis3NzEsCS8qIE9CSl9jZXJ0aWZpY2F0ZV9pc3N1ZXIgICAgICAgICAgIDIgNSAyOSAyOSAqLworNjY2LAkvKiBPQkpfbmFtZV9jb25zdHJhaW50cyAgICAgICAgICAgICAyIDUgMjkgMzAgKi8KKzEwMywJLyogT0JKX2NybF9kaXN0cmlidXRpb25fcG9pbnRzICAgICAgMiA1IDI5IDMxICovCis4OSwJLyogT0JKX2NlcnRpZmljYXRlX3BvbGljaWVzICAgICAgICAgMiA1IDI5IDMyICovCis3NDcsCS8qIE9CSl9wb2xpY3lfbWFwcGluZ3MgICAgICAgICAgICAgIDIgNSAyOSAzMyAqLworOTAsCS8qIE9CSl9hdXRob3JpdHlfa2V5X2lkZW50aWZpZXIgICAgIDIgNSAyOSAzNSAqLworNDAxLAkvKiBPQkpfcG9saWN5X2NvbnN0cmFpbnRzICAgICAgICAgICAyIDUgMjkgMzYgKi8KKzEyNiwJLyogT0JKX2V4dF9rZXlfdXNhZ2UgICAgICAgICAgICAgICAgMiA1IDI5IDM3ICovCis4NTcsCS8qIE9CSl9mcmVzaGVzdF9jcmwgICAgICAgICAgICAgICAgIDIgNSAyOSA0NiAqLworNzQ4LAkvKiBPQkpfaW5oaWJpdF9hbnlfcG9saWN5ICAgICAgICAgICAyIDUgMjkgNTQgKi8KKzQwMiwJLyogT0JKX3RhcmdldF9pbmZvcm1hdGlvbiAgICAgICAgICAgMiA1IDI5IDU1ICovCis0MDMsCS8qIE9CSl9ub19yZXZfYXZhaWwgICAgICAgICAgICAgICAgIDIgNSAyOSA1NiAqLworNTEzLAkvKiBPQkpfc2V0X2N0eXBlICAgICAgICAgICAgICAgICAgICAyIDIzIDQyIDAgKi8KKzUxNCwJLyogT0JKX3NldF9tc2dFeHQgICAgICAgICAgICAgICAgICAgMiAyMyA0MiAxICovCis1MTUsCS8qIE9CSl9zZXRfYXR0ciAgICAgICAgICAgICAgICAgICAgIDIgMjMgNDIgMyAqLworNTE2LAkvKiBPQkpfc2V0X3BvbGljeSAgICAgICAgICAgICAgICAgICAyIDIzIDQyIDUgKi8KKzUxNywJLyogT0JKX3NldF9jZXJ0RXh0ICAgICAgICAgICAgICAgICAgMiAyMyA0MiA3ICovCis1MTgsCS8qIE9CSl9zZXRfYnJhbmQgICAgICAgICAgICAgICAgICAgIDIgMjMgNDIgOCAqLworNjc5LAkvKiBPQkpfd2FwX3dzZyAgICAgICAgICAgICAgICAgICAgICAyIDIzIDQzIDEgKi8KKzM4MiwJLyogT0JKX0RpcmVjdG9yeSAgICAgICAgICAgICAgICAgICAgMSAzIDYgMSAxICovCiszODMsCS8qIE9CSl9NYW5hZ2VtZW50ICAgICAgICAgICAgICAgICAgIDEgMyA2IDEgMiAqLworMzg0LAkvKiBPQkpfRXhwZXJpbWVudGFsICAgICAgICAgICAgICAgICAxIDMgNiAxIDMgKi8KKzM4NSwJLyogT0JKX1ByaXZhdGUgICAgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA0ICovCiszODYsCS8qIE9CSl9TZWN1cml0eSAgICAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNSAqLworMzg3LAkvKiBPQkpfU05NUHYyICAgICAgICAgICAgICAgICAgICAgICAxIDMgNiAxIDYgKi8KKzM4OCwJLyogT0JKX01haWwgICAgICAgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA3ICovCiszNzYsCS8qIE9CSl9hbGdvcml0aG0gICAgICAgICAgICAgICAgICAgIDEgMyAxNCAzIDIgKi8KKzM5NSwJLyogT0JKX2NsZWFyYW5jZSAgICAgICAgICAgICAgICAgICAgMiA1IDEgNSA1NSAqLworMTksCS8qIE9CSl9yc2EgICAgICAgICAgICAgICAgICAgICAgICAgIDIgNSA4IDEgMSAqLworOTYsCS8qIE9CSl9tZGMyV2l0aFJTQSAgICAgICAgICAgICAgICAgIDIgNSA4IDMgMTAwICovCis5NSwJLyogT0JKX21kYzIgICAgICAgICAgICAgICAgICAgICAgICAgMiA1IDggMyAxMDEgKi8KKzc0NiwJLyogT0JKX2FueV9wb2xpY3kgICAgICAgICAgICAgICAgICAgMiA1IDI5IDMyIDAgKi8KKzkxMCwJLyogT0JKX2FueUV4dGVuZGVkS2V5VXNhZ2UgICAgICAgICAgMiA1IDI5IDM3IDAgKi8KKzUxOSwJLyogT0JKX3NldGN0X1BBTkRhdGEgICAgICAgICAgICAgICAgMiAyMyA0MiAwIDAgKi8KKzUyMCwJLyogT0JKX3NldGN0X1BBTlRva2VuICAgICAgICAgICAgICAgMiAyMyA0MiAwIDEgKi8KKzUyMSwJLyogT0JKX3NldGN0X1BBTk9ubHkgICAgICAgICAgICAgICAgMiAyMyA0MiAwIDIgKi8KKzUyMiwJLyogT0JKX3NldGN0X09JRGF0YSAgICAgICAgICAgICAgICAgMiAyMyA0MiAwIDMgKi8KKzUyMywJLyogT0JKX3NldGN0X1BJICAgICAgICAgICAgICAgICAgICAgMiAyMyA0MiAwIDQgKi8KKzUyNCwJLyogT0JKX3NldGN0X1BJRGF0YSAgICAgICAgICAgICAgICAgMiAyMyA0MiAwIDUgKi8KKzUyNSwJLyogT0JKX3NldGN0X1BJRGF0YVVuc2lnbmVkICAgICAgICAgMiAyMyA0MiAwIDYgKi8KKzUyNiwJLyogT0JKX3NldGN0X0hPRElucHV0ICAgICAgICAgICAgICAgMiAyMyA0MiAwIDcgKi8KKzUyNywJLyogT0JKX3NldGN0X0F1dGhSZXNCYWdnYWdlICAgICAgICAgMiAyMyA0MiAwIDggKi8KKzUyOCwJLyogT0JKX3NldGN0X0F1dGhSZXZSZXFCYWdnYWdlICAgICAgMiAyMyA0MiAwIDkgKi8KKzUyOSwJLyogT0JKX3NldGN0X0F1dGhSZXZSZXNCYWdnYWdlICAgICAgMiAyMyA0MiAwIDEwICovCis1MzAsCS8qIE9CSl9zZXRjdF9DYXBUb2tlblNlcSAgICAgICAgICAgIDIgMjMgNDIgMCAxMSAqLworNTMxLAkvKiBPQkpfc2V0Y3RfUEluaXRSZXNEYXRhICAgICAgICAgICAyIDIzIDQyIDAgMTIgKi8KKzUzMiwJLyogT0JKX3NldGN0X1BJX1RCUyAgICAgICAgICAgICAgICAgMiAyMyA0MiAwIDEzICovCis1MzMsCS8qIE9CSl9zZXRjdF9QUmVzRGF0YSAgICAgICAgICAgICAgIDIgMjMgNDIgMCAxNCAqLworNTM0LAkvKiBPQkpfc2V0Y3RfQXV0aFJlcVRCUyAgICAgICAgICAgICAyIDIzIDQyIDAgMTYgKi8KKzUzNSwJLyogT0JKX3NldGN0X0F1dGhSZXNUQlMgICAgICAgICAgICAgMiAyMyA0MiAwIDE3ICovCis1MzYsCS8qIE9CSl9zZXRjdF9BdXRoUmVzVEJTWCAgICAgICAgICAgIDIgMjMgNDIgMCAxOCAqLworNTM3LAkvKiBPQkpfc2V0Y3RfQXV0aFRva2VuVEJTICAgICAgICAgICAyIDIzIDQyIDAgMTkgKi8KKzUzOCwJLyogT0JKX3NldGN0X0NhcFRva2VuRGF0YSAgICAgICAgICAgMiAyMyA0MiAwIDIwICovCis1MzksCS8qIE9CSl9zZXRjdF9DYXBUb2tlblRCUyAgICAgICAgICAgIDIgMjMgNDIgMCAyMSAqLworNTQwLAkvKiBPQkpfc2V0Y3RfQWNxQ2FyZENvZGVNc2cgICAgICAgICAyIDIzIDQyIDAgMjIgKi8KKzU0MSwJLyogT0JKX3NldGN0X0F1dGhSZXZSZXFUQlMgICAgICAgICAgMiAyMyA0MiAwIDIzICovCis1NDIsCS8qIE9CSl9zZXRjdF9BdXRoUmV2UmVzRGF0YSAgICAgICAgIDIgMjMgNDIgMCAyNCAqLworNTQzLAkvKiBPQkpfc2V0Y3RfQXV0aFJldlJlc1RCUyAgICAgICAgICAyIDIzIDQyIDAgMjUgKi8KKzU0NCwJLyogT0JKX3NldGN0X0NhcFJlcVRCUyAgICAgICAgICAgICAgMiAyMyA0MiAwIDI2ICovCis1NDUsCS8qIE9CSl9zZXRjdF9DYXBSZXFUQlNYICAgICAgICAgICAgIDIgMjMgNDIgMCAyNyAqLworNTQ2LAkvKiBPQkpfc2V0Y3RfQ2FwUmVzRGF0YSAgICAgICAgICAgICAyIDIzIDQyIDAgMjggKi8KKzU0NywJLyogT0JKX3NldGN0X0NhcFJldlJlcVRCUyAgICAgICAgICAgMiAyMyA0MiAwIDI5ICovCis1NDgsCS8qIE9CSl9zZXRjdF9DYXBSZXZSZXFUQlNYICAgICAgICAgIDIgMjMgNDIgMCAzMCAqLworNTQ5LAkvKiBPQkpfc2V0Y3RfQ2FwUmV2UmVzRGF0YSAgICAgICAgICAyIDIzIDQyIDAgMzEgKi8KKzU1MCwJLyogT0JKX3NldGN0X0NyZWRSZXFUQlMgICAgICAgICAgICAgMiAyMyA0MiAwIDMyICovCis1NTEsCS8qIE9CSl9zZXRjdF9DcmVkUmVxVEJTWCAgICAgICAgICAgIDIgMjMgNDIgMCAzMyAqLworNTUyLAkvKiBPQkpfc2V0Y3RfQ3JlZFJlc0RhdGEgICAgICAgICAgICAyIDIzIDQyIDAgMzQgKi8KKzU1MywJLyogT0JKX3NldGN0X0NyZWRSZXZSZXFUQlMgICAgICAgICAgMiAyMyA0MiAwIDM1ICovCis1NTQsCS8qIE9CSl9zZXRjdF9DcmVkUmV2UmVxVEJTWCAgICAgICAgIDIgMjMgNDIgMCAzNiAqLworNTU1LAkvKiBPQkpfc2V0Y3RfQ3JlZFJldlJlc0RhdGEgICAgICAgICAyIDIzIDQyIDAgMzcgKi8KKzU1NiwJLyogT0JKX3NldGN0X1BDZXJ0UmVxRGF0YSAgICAgICAgICAgMiAyMyA0MiAwIDM4ICovCis1NTcsCS8qIE9CSl9zZXRjdF9QQ2VydFJlc1RCUyAgICAgICAgICAgIDIgMjMgNDIgMCAzOSAqLworNTU4LAkvKiBPQkpfc2V0Y3RfQmF0Y2hBZG1pblJlcURhdGEgICAgICAyIDIzIDQyIDAgNDAgKi8KKzU1OSwJLyogT0JKX3NldGN0X0JhdGNoQWRtaW5SZXNEYXRhICAgICAgMiAyMyA0MiAwIDQxICovCis1NjAsCS8qIE9CSl9zZXRjdF9DYXJkQ0luaXRSZXNUQlMgICAgICAgIDIgMjMgNDIgMCA0MiAqLworNTYxLAkvKiBPQkpfc2V0Y3RfTWVBcUNJbml0UmVzVEJTICAgICAgICAyIDIzIDQyIDAgNDMgKi8KKzU2MiwJLyogT0JKX3NldGN0X1JlZ0Zvcm1SZXNUQlMgICAgICAgICAgMiAyMyA0MiAwIDQ0ICovCis1NjMsCS8qIE9CSl9zZXRjdF9DZXJ0UmVxRGF0YSAgICAgICAgICAgIDIgMjMgNDIgMCA0NSAqLworNTY0LAkvKiBPQkpfc2V0Y3RfQ2VydFJlcVRCUyAgICAgICAgICAgICAyIDIzIDQyIDAgNDYgKi8KKzU2NSwJLyogT0JKX3NldGN0X0NlcnRSZXNEYXRhICAgICAgICAgICAgMiAyMyA0MiAwIDQ3ICovCis1NjYsCS8qIE9CSl9zZXRjdF9DZXJ0SW5xUmVxVEJTICAgICAgICAgIDIgMjMgNDIgMCA0OCAqLworNTY3LAkvKiBPQkpfc2V0Y3RfRXJyb3JUQlMgICAgICAgICAgICAgICAyIDIzIDQyIDAgNDkgKi8KKzU2OCwJLyogT0JKX3NldGN0X1BJRHVhbFNpZ25lZFRCRSAgICAgICAgMiAyMyA0MiAwIDUwICovCis1NjksCS8qIE9CSl9zZXRjdF9QSVVuc2lnbmVkVEJFICAgICAgICAgIDIgMjMgNDIgMCA1MSAqLworNTcwLAkvKiBPQkpfc2V0Y3RfQXV0aFJlcVRCRSAgICAgICAgICAgICAyIDIzIDQyIDAgNTIgKi8KKzU3MSwJLyogT0JKX3NldGN0X0F1dGhSZXNUQkUgICAgICAgICAgICAgMiAyMyA0MiAwIDUzICovCis1NzIsCS8qIE9CSl9zZXRjdF9BdXRoUmVzVEJFWCAgICAgICAgICAgIDIgMjMgNDIgMCA1NCAqLworNTczLAkvKiBPQkpfc2V0Y3RfQXV0aFRva2VuVEJFICAgICAgICAgICAyIDIzIDQyIDAgNTUgKi8KKzU3NCwJLyogT0JKX3NldGN0X0NhcFRva2VuVEJFICAgICAgICAgICAgMiAyMyA0MiAwIDU2ICovCis1NzUsCS8qIE9CSl9zZXRjdF9DYXBUb2tlblRCRVggICAgICAgICAgIDIgMjMgNDIgMCA1NyAqLworNTc2LAkvKiBPQkpfc2V0Y3RfQWNxQ2FyZENvZGVNc2dUQkUgICAgICAyIDIzIDQyIDAgNTggKi8KKzU3NywJLyogT0JKX3NldGN0X0F1dGhSZXZSZXFUQkUgICAgICAgICAgMiAyMyA0MiAwIDU5ICovCis1NzgsCS8qIE9CSl9zZXRjdF9BdXRoUmV2UmVzVEJFICAgICAgICAgIDIgMjMgNDIgMCA2MCAqLworNTc5LAkvKiBPQkpfc2V0Y3RfQXV0aFJldlJlc1RCRUIgICAgICAgICAyIDIzIDQyIDAgNjEgKi8KKzU4MCwJLyogT0JKX3NldGN0X0NhcFJlcVRCRSAgICAgICAgICAgICAgMiAyMyA0MiAwIDYyICovCis1ODEsCS8qIE9CSl9zZXRjdF9DYXBSZXFUQkVYICAgICAgICAgICAgIDIgMjMgNDIgMCA2MyAqLworNTgyLAkvKiBPQkpfc2V0Y3RfQ2FwUmVzVEJFICAgICAgICAgICAgICAyIDIzIDQyIDAgNjQgKi8KKzU4MywJLyogT0JKX3NldGN0X0NhcFJldlJlcVRCRSAgICAgICAgICAgMiAyMyA0MiAwIDY1ICovCis1ODQsCS8qIE9CSl9zZXRjdF9DYXBSZXZSZXFUQkVYICAgICAgICAgIDIgMjMgNDIgMCA2NiAqLworNTg1LAkvKiBPQkpfc2V0Y3RfQ2FwUmV2UmVzVEJFICAgICAgICAgICAyIDIzIDQyIDAgNjcgKi8KKzU4NiwJLyogT0JKX3NldGN0X0NyZWRSZXFUQkUgICAgICAgICAgICAgMiAyMyA0MiAwIDY4ICovCis1ODcsCS8qIE9CSl9zZXRjdF9DcmVkUmVxVEJFWCAgICAgICAgICAgIDIgMjMgNDIgMCA2OSAqLworNTg4LAkvKiBPQkpfc2V0Y3RfQ3JlZFJlc1RCRSAgICAgICAgICAgICAyIDIzIDQyIDAgNzAgKi8KKzU4OSwJLyogT0JKX3NldGN0X0NyZWRSZXZSZXFUQkUgICAgICAgICAgMiAyMyA0MiAwIDcxICovCis1OTAsCS8qIE9CSl9zZXRjdF9DcmVkUmV2UmVxVEJFWCAgICAgICAgIDIgMjMgNDIgMCA3MiAqLworNTkxLAkvKiBPQkpfc2V0Y3RfQ3JlZFJldlJlc1RCRSAgICAgICAgICAyIDIzIDQyIDAgNzMgKi8KKzU5MiwJLyogT0JKX3NldGN0X0JhdGNoQWRtaW5SZXFUQkUgICAgICAgMiAyMyA0MiAwIDc0ICovCis1OTMsCS8qIE9CSl9zZXRjdF9CYXRjaEFkbWluUmVzVEJFICAgICAgIDIgMjMgNDIgMCA3NSAqLworNTk0LAkvKiBPQkpfc2V0Y3RfUmVnRm9ybVJlcVRCRSAgICAgICAgICAyIDIzIDQyIDAgNzYgKi8KKzU5NSwJLyogT0JKX3NldGN0X0NlcnRSZXFUQkUgICAgICAgICAgICAgMiAyMyA0MiAwIDc3ICovCis1OTYsCS8qIE9CSl9zZXRjdF9DZXJ0UmVxVEJFWCAgICAgICAgICAgIDIgMjMgNDIgMCA3OCAqLworNTk3LAkvKiBPQkpfc2V0Y3RfQ2VydFJlc1RCRSAgICAgICAgICAgICAyIDIzIDQyIDAgNzkgKi8KKzU5OCwJLyogT0JKX3NldGN0X0NSTE5vdGlmaWNhdGlvblRCUyAgICAgMiAyMyA0MiAwIDgwICovCis1OTksCS8qIE9CSl9zZXRjdF9DUkxOb3RpZmljYXRpb25SZXNUQlMgIDIgMjMgNDIgMCA4MSAqLworNjAwLAkvKiBPQkpfc2V0Y3RfQkNJRGlzdHJpYnV0aW9uVEJTICAgICAyIDIzIDQyIDAgODIgKi8KKzYwMSwJLyogT0JKX3NldGV4dF9nZW5DcnlwdCAgICAgICAgICAgICAgMiAyMyA0MiAxIDEgKi8KKzYwMiwJLyogT0JKX3NldGV4dF9taUF1dGggICAgICAgICAgICAgICAgMiAyMyA0MiAxIDMgKi8KKzYwMywJLyogT0JKX3NldGV4dF9waW5TZWN1cmUgICAgICAgICAgICAgMiAyMyA0MiAxIDQgKi8KKzYwNCwJLyogT0JKX3NldGV4dF9waW5BbnkgICAgICAgICAgICAgICAgMiAyMyA0MiAxIDUgKi8KKzYwNSwJLyogT0JKX3NldGV4dF90cmFjazIgICAgICAgICAgICAgICAgMiAyMyA0MiAxIDcgKi8KKzYwNiwJLyogT0JKX3NldGV4dF9jdiAgICAgICAgICAgICAgICAgICAgMiAyMyA0MiAxIDggKi8KKzYyMCwJLyogT0JKX3NldEF0dHJfQ2VydCAgICAgICAgICAgICAgICAgMiAyMyA0MiAzIDAgKi8KKzYyMSwJLyogT0JKX3NldEF0dHJfUEdXWWNhcCAgICAgICAgICAgICAgMiAyMyA0MiAzIDEgKi8KKzYyMiwJLyogT0JKX3NldEF0dHJfVG9rZW5UeXBlICAgICAgICAgICAgMiAyMyA0MiAzIDIgKi8KKzYyMywJLyogT0JKX3NldEF0dHJfSXNzQ2FwICAgICAgICAgICAgICAgMiAyMyA0MiAzIDMgKi8KKzYwNywJLyogT0JKX3NldF9wb2xpY3lfcm9vdCAgICAgICAgICAgICAgMiAyMyA0MiA1IDAgKi8KKzYwOCwJLyogT0JKX3NldENleHRfaGFzaGVkUm9vdCAgICAgICAgICAgMiAyMyA0MiA3IDAgKi8KKzYwOSwJLyogT0JKX3NldENleHRfY2VydFR5cGUgICAgICAgICAgICAgMiAyMyA0MiA3IDEgKi8KKzYxMCwJLyogT0JKX3NldENleHRfbWVyY2hEYXRhICAgICAgICAgICAgMiAyMyA0MiA3IDIgKi8KKzYxMSwJLyogT0JKX3NldENleHRfY0NlcnRSZXF1aXJlZCAgICAgICAgMiAyMyA0MiA3IDMgKi8KKzYxMiwJLyogT0JKX3NldENleHRfdHVubmVsaW5nICAgICAgICAgICAgMiAyMyA0MiA3IDQgKi8KKzYxMywJLyogT0JKX3NldENleHRfc2V0RXh0ICAgICAgICAgICAgICAgMiAyMyA0MiA3IDUgKi8KKzYxNCwJLyogT0JKX3NldENleHRfc2V0UXVhbGYgICAgICAgICAgICAgMiAyMyA0MiA3IDYgKi8KKzYxNSwJLyogT0JKX3NldENleHRfUEdXWWNhcGFiaWxpdGllcyAgICAgMiAyMyA0MiA3IDcgKi8KKzYxNiwJLyogT0JKX3NldENleHRfVG9rZW5JZGVudGlmaWVyICAgICAgMiAyMyA0MiA3IDggKi8KKzYxNywJLyogT0JKX3NldENleHRfVHJhY2syRGF0YSAgICAgICAgICAgMiAyMyA0MiA3IDkgKi8KKzYxOCwJLyogT0JKX3NldENleHRfVG9rZW5UeXBlICAgICAgICAgICAgMiAyMyA0MiA3IDEwICovCis2MTksCS8qIE9CSl9zZXRDZXh0X0lzc3VlckNhcGFiaWxpdGllcyAgIDIgMjMgNDIgNyAxMSAqLworNjM2LAkvKiBPQkpfc2V0X2JyYW5kX0lBVEFfQVRBICAgICAgICAgICAyIDIzIDQyIDggMSAqLworNjQwLAkvKiBPQkpfc2V0X2JyYW5kX1Zpc2EgICAgICAgICAgICAgICAyIDIzIDQyIDggNCAqLworNjQxLAkvKiBPQkpfc2V0X2JyYW5kX01hc3RlckNhcmQgICAgICAgICAyIDIzIDQyIDggNSAqLworNjM3LAkvKiBPQkpfc2V0X2JyYW5kX0RpbmVycyAgICAgICAgICAgICAyIDIzIDQyIDggMzAgKi8KKzYzOCwJLyogT0JKX3NldF9icmFuZF9BbWVyaWNhbkV4cHJlc3MgICAgMiAyMyA0MiA4IDM0ICovCis2MzksCS8qIE9CSl9zZXRfYnJhbmRfSkNCICAgICAgICAgICAgICAgIDIgMjMgNDIgOCAzNSAqLworODA1LAkvKiBPQkpfY3J5cHRvcHJvICAgICAgICAgICAgICAgICAgICAxIDIgNjQzIDIgMiAqLworODA2LAkvKiBPQkpfY3J5cHRvY29tICAgICAgICAgICAgICAgICAgICAxIDIgNjQzIDIgOSAqLworMTg0LAkvKiBPQkpfWDlfNTcgICAgICAgICAgICAgICAgICAgICAgICAxIDIgODQwIDEwMDQwICovCis0MDUsCS8qIE9CSl9hbnNpX1g5XzYyICAgICAgICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgKi8KKzM4OSwJLyogT0JKX0VudGVycHJpc2VzICAgICAgICAgICAgICAgICAgMSAzIDYgMSA0IDEgKi8KKzUwNCwJLyogT0JKX21pbWVfbWhzICAgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA3IDEgKi8KKzEwNCwJLyogT0JKX21kNVdpdGhSU0EgICAgICAgICAgICAgICAgICAgMSAzIDE0IDMgMiAzICovCisyOSwJLyogT0JKX2Rlc19lY2IgICAgICAgICAgICAgICAgICAgICAgMSAzIDE0IDMgMiA2ICovCiszMSwJLyogT0JKX2Rlc19jYmMgICAgICAgICAgICAgICAgICAgICAgMSAzIDE0IDMgMiA3ICovCis0NSwJLyogT0JKX2Rlc19vZmI2NCAgICAgICAgICAgICAgICAgICAgMSAzIDE0IDMgMiA4ICovCiszMCwJLyogT0JKX2Rlc19jZmI2NCAgICAgICAgICAgICAgICAgICAgMSAzIDE0IDMgMiA5ICovCiszNzcsCS8qIE9CSl9yc2FTaWduYXR1cmUgICAgICAgICAgICAgICAgIDEgMyAxNCAzIDIgMTEgKi8KKzY3LAkvKiBPQkpfZHNhXzIgICAgICAgICAgICAgICAgICAgICAgICAxIDMgMTQgMyAyIDEyICovCis2NiwJLyogT0JKX2RzYVdpdGhTSEEgICAgICAgICAgICAgICAgICAgMSAzIDE0IDMgMiAxMyAqLworNDIsCS8qIE9CSl9zaGFXaXRoUlNBRW5jcnlwdGlvbiAgICAgICAgIDEgMyAxNCAzIDIgMTUgKi8KKzMyLAkvKiBPQkpfZGVzX2VkZV9lY2IgICAgICAgICAgICAgICAgICAxIDMgMTQgMyAyIDE3ICovCis0MSwJLyogT0JKX3NoYSAgICAgICAgICAgICAgICAgICAgICAgICAgMSAzIDE0IDMgMiAxOCAqLworNjQsCS8qIE9CSl9zaGExICAgICAgICAgICAgICAgICAgICAgICAgIDEgMyAxNCAzIDIgMjYgKi8KKzcwLAkvKiBPQkpfZHNhV2l0aFNIQTFfMiAgICAgICAgICAgICAgICAxIDMgMTQgMyAyIDI3ICovCisxMTUsCS8qIE9CSl9zaGExV2l0aFJTQSAgICAgICAgICAgICAgICAgIDEgMyAxNCAzIDIgMjkgKi8KKzExNywJLyogT0JKX3JpcGVtZDE2MCAgICAgICAgICAgICAgICAgICAgMSAzIDM2IDMgMiAxICovCisxNDMsCS8qIE9CSl9zeG5ldCAgICAgICAgICAgICAgICAgICAgICAgIDEgMyAxMDEgMSA0IDEgKi8KKzcyMSwJLyogT0JKX3NlY3QxNjNrMSAgICAgICAgICAgICAgICAgICAgMSAzIDEzMiAwIDEgKi8KKzcyMiwJLyogT0JKX3NlY3QxNjNyMSAgICAgICAgICAgICAgICAgICAgMSAzIDEzMiAwIDIgKi8KKzcyOCwJLyogT0JKX3NlY3QyMzlrMSAgICAgICAgICAgICAgICAgICAgMSAzIDEzMiAwIDMgKi8KKzcxNywJLyogT0JKX3NlY3QxMTNyMSAgICAgICAgICAgICAgICAgICAgMSAzIDEzMiAwIDQgKi8KKzcxOCwJLyogT0JKX3NlY3QxMTNyMiAgICAgICAgICAgICAgICAgICAgMSAzIDEzMiAwIDUgKi8KKzcwNCwJLyogT0JKX3NlY3AxMTJyMSAgICAgICAgICAgICAgICAgICAgMSAzIDEzMiAwIDYgKi8KKzcwNSwJLyogT0JKX3NlY3AxMTJyMiAgICAgICAgICAgICAgICAgICAgMSAzIDEzMiAwIDcgKi8KKzcwOSwJLyogT0JKX3NlY3AxNjByMSAgICAgICAgICAgICAgICAgICAgMSAzIDEzMiAwIDggKi8KKzcwOCwJLyogT0JKX3NlY3AxNjBrMSAgICAgICAgICAgICAgICAgICAgMSAzIDEzMiAwIDkgKi8KKzcxNCwJLyogT0JKX3NlY3AyNTZrMSAgICAgICAgICAgICAgICAgICAgMSAzIDEzMiAwIDEwICovCis3MjMsCS8qIE9CSl9zZWN0MTYzcjIgICAgICAgICAgICAgICAgICAgIDEgMyAxMzIgMCAxNSAqLworNzI5LAkvKiBPQkpfc2VjdDI4M2sxICAgICAgICAgICAgICAgICAgICAxIDMgMTMyIDAgMTYgKi8KKzczMCwJLyogT0JKX3NlY3QyODNyMSAgICAgICAgICAgICAgICAgICAgMSAzIDEzMiAwIDE3ICovCis3MTksCS8qIE9CSl9zZWN0MTMxcjEgICAgICAgICAgICAgICAgICAgIDEgMyAxMzIgMCAyMiAqLworNzIwLAkvKiBPQkpfc2VjdDEzMXIyICAgICAgICAgICAgICAgICAgICAxIDMgMTMyIDAgMjMgKi8KKzcyNCwJLyogT0JKX3NlY3QxOTNyMSAgICAgICAgICAgICAgICAgICAgMSAzIDEzMiAwIDI0ICovCis3MjUsCS8qIE9CSl9zZWN0MTkzcjIgICAgICAgICAgICAgICAgICAgIDEgMyAxMzIgMCAyNSAqLworNzI2LAkvKiBPQkpfc2VjdDIzM2sxICAgICAgICAgICAgICAgICAgICAxIDMgMTMyIDAgMjYgKi8KKzcyNywJLyogT0JKX3NlY3QyMzNyMSAgICAgICAgICAgICAgICAgICAgMSAzIDEzMiAwIDI3ICovCis3MDYsCS8qIE9CSl9zZWNwMTI4cjEgICAgICAgICAgICAgICAgICAgIDEgMyAxMzIgMCAyOCAqLworNzA3LAkvKiBPQkpfc2VjcDEyOHIyICAgICAgICAgICAgICAgICAgICAxIDMgMTMyIDAgMjkgKi8KKzcxMCwJLyogT0JKX3NlY3AxNjByMiAgICAgICAgICAgICAgICAgICAgMSAzIDEzMiAwIDMwICovCis3MTEsCS8qIE9CSl9zZWNwMTkyazEgICAgICAgICAgICAgICAgICAgIDEgMyAxMzIgMCAzMSAqLworNzEyLAkvKiBPQkpfc2VjcDIyNGsxICAgICAgICAgICAgICAgICAgICAxIDMgMTMyIDAgMzIgKi8KKzcxMywJLyogT0JKX3NlY3AyMjRyMSAgICAgICAgICAgICAgICAgICAgMSAzIDEzMiAwIDMzICovCis3MTUsCS8qIE9CSl9zZWNwMzg0cjEgICAgICAgICAgICAgICAgICAgIDEgMyAxMzIgMCAzNCAqLworNzE2LAkvKiBPQkpfc2VjcDUyMXIxICAgICAgICAgICAgICAgICAgICAxIDMgMTMyIDAgMzUgKi8KKzczMSwJLyogT0JKX3NlY3Q0MDlrMSAgICAgICAgICAgICAgICAgICAgMSAzIDEzMiAwIDM2ICovCis3MzIsCS8qIE9CSl9zZWN0NDA5cjEgICAgICAgICAgICAgICAgICAgIDEgMyAxMzIgMCAzNyAqLworNzMzLAkvKiBPQkpfc2VjdDU3MWsxICAgICAgICAgICAgICAgICAgICAxIDMgMTMyIDAgMzggKi8KKzczNCwJLyogT0JKX3NlY3Q1NzFyMSAgICAgICAgICAgICAgICAgICAgMSAzIDEzMiAwIDM5ICovCis2MjQsCS8qIE9CSl9zZXRfcm9vdEtleVRodW1iICAgICAgICAgICAgIDIgMjMgNDIgMyAwIDAgKi8KKzYyNSwJLyogT0JKX3NldF9hZGRQb2xpY3kgICAgICAgICAgICAgICAgMiAyMyA0MiAzIDAgMSAqLworNjI2LAkvKiBPQkpfc2V0QXR0cl9Ub2tlbl9FTVYgICAgICAgICAgICAyIDIzIDQyIDMgMiAxICovCis2MjcsCS8qIE9CSl9zZXRBdHRyX1Rva2VuX0IwUHJpbWUgICAgICAgIDIgMjMgNDIgMyAyIDIgKi8KKzYyOCwJLyogT0JKX3NldEF0dHJfSXNzQ2FwX0NWTSAgICAgICAgICAgMiAyMyA0MiAzIDMgMyAqLworNjI5LAkvKiBPQkpfc2V0QXR0cl9Jc3NDYXBfVDIgICAgICAgICAgICAyIDIzIDQyIDMgMyA0ICovCis2MzAsCS8qIE9CSl9zZXRBdHRyX0lzc0NhcF9TaWcgICAgICAgICAgIDIgMjMgNDIgMyAzIDUgKi8KKzY0MiwJLyogT0JKX3NldF9icmFuZF9Ob3Z1cyAgICAgICAgICAgICAgMiAyMyA0MiA4IDYwMTEgKi8KKzczNSwJLyogT0JKX3dhcF93c2dfaWRtX2VjaWRfd3RsczEgICAgICAgMiAyMyA0MyAxIDQgMSAqLworNzM2LAkvKiBPQkpfd2FwX3dzZ19pZG1fZWNpZF93dGxzMyAgICAgICAyIDIzIDQzIDEgNCAzICovCis3MzcsCS8qIE9CSl93YXBfd3NnX2lkbV9lY2lkX3d0bHM0ICAgICAgIDIgMjMgNDMgMSA0IDQgKi8KKzczOCwJLyogT0JKX3dhcF93c2dfaWRtX2VjaWRfd3RsczUgICAgICAgMiAyMyA0MyAxIDQgNSAqLworNzM5LAkvKiBPQkpfd2FwX3dzZ19pZG1fZWNpZF93dGxzNiAgICAgICAyIDIzIDQzIDEgNCA2ICovCis3NDAsCS8qIE9CSl93YXBfd3NnX2lkbV9lY2lkX3d0bHM3ICAgICAgIDIgMjMgNDMgMSA0IDcgKi8KKzc0MSwJLyogT0JKX3dhcF93c2dfaWRtX2VjaWRfd3RsczggICAgICAgMiAyMyA0MyAxIDQgOCAqLworNzQyLAkvKiBPQkpfd2FwX3dzZ19pZG1fZWNpZF93dGxzOSAgICAgICAyIDIzIDQzIDEgNCA5ICovCis3NDMsCS8qIE9CSl93YXBfd3NnX2lkbV9lY2lkX3d0bHMxMCAgICAgIDIgMjMgNDMgMSA0IDEwICovCis3NDQsCS8qIE9CSl93YXBfd3NnX2lkbV9lY2lkX3d0bHMxMSAgICAgIDIgMjMgNDMgMSA0IDExICovCis3NDUsCS8qIE9CSl93YXBfd3NnX2lkbV9lY2lkX3d0bHMxMiAgICAgIDIgMjMgNDMgMSA0IDEyICovCis4MDQsCS8qIE9CSl93aGlybHBvb2wgICAgICAgICAgICAgICAgICAgIDEgMCAxMDExOCAzIDAgNTUgKi8KKzEyNCwJLyogT0JKX3JsZV9jb21wcmVzc2lvbiAgICAgICAgICAgICAgMSAxIDEgMSA2NjYgMSAqLworNzczLAkvKiBPQkpfa2lzYSAgICAgICAgICAgICAgICAgICAgICAgICAxIDIgNDEwIDIwMDAwNCAqLworODA3LAkvKiBPQkpfaWRfR29zdFIzNDExXzk0X3dpdGhfR29zdFIzNDEwXzIwMDEgMSAyIDY0MyAyIDIgMyAqLworODA4LAkvKiBPQkpfaWRfR29zdFIzNDExXzk0X3dpdGhfR29zdFIzNDEwXzk0IDEgMiA2NDMgMiAyIDQgKi8KKzgwOSwJLyogT0JKX2lkX0dvc3RSMzQxMV85NCAgICAgICAgICAgICAgMSAyIDY0MyAyIDIgOSAqLworODEwLAkvKiBPQkpfaWRfSE1BQ0dvc3RSMzQxMV85NCAgICAgICAgICAxIDIgNjQzIDIgMiAxMCAqLworODExLAkvKiBPQkpfaWRfR29zdFIzNDEwXzIwMDEgICAgICAgICAgICAxIDIgNjQzIDIgMiAxOSAqLworODEyLAkvKiBPQkpfaWRfR29zdFIzNDEwXzk0ICAgICAgICAgICAgICAxIDIgNjQzIDIgMiAyMCAqLworODEzLAkvKiBPQkpfaWRfR29zdDI4MTQ3Xzg5ICAgICAgICAgICAgICAxIDIgNjQzIDIgMiAyMSAqLworODE1LAkvKiBPQkpfaWRfR29zdDI4MTQ3Xzg5X01BQyAgICAgICAgICAxIDIgNjQzIDIgMiAyMiAqLworODE2LAkvKiBPQkpfaWRfR29zdFIzNDExXzk0X3ByZiAgICAgICAgICAxIDIgNjQzIDIgMiAyMyAqLworODE3LAkvKiBPQkpfaWRfR29zdFIzNDEwXzIwMDFESCAgICAgICAgICAxIDIgNjQzIDIgMiA5OCAqLworODE4LAkvKiBPQkpfaWRfR29zdFIzNDEwXzk0REggICAgICAgICAgICAxIDIgNjQzIDIgMiA5OSAqLworIDEsCS8qIE9CSl9yc2Fkc2kgICAgICAgICAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5ICovCisxODUsCS8qIE9CSl9YOWNtICAgICAgICAgICAgICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDAgNCAqLworMTI3LAkvKiBPQkpfaWRfcGtpeCAgICAgICAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3ICovCis1MDUsCS8qIE9CSl9taW1lX21oc19oZWFkaW5ncyAgICAgICAgICAgIDEgMyA2IDEgNyAxIDEgKi8KKzUwNiwJLyogT0JKX21pbWVfbWhzX2JvZGllcyAgICAgICAgICAgICAgMSAzIDYgMSA3IDEgMiAqLworMTE5LAkvKiBPQkpfcmlwZW1kMTYwV2l0aFJTQSAgICAgICAgICAgICAxIDMgMzYgMyAzIDEgMiAqLworOTQwLAkvKiBPQkpfZGhTaW5nbGVQYXNzX3N0ZERIX3NoYTIyNGtkZl9zY2hlbWUgMSAzIDEzMiAxIDExIDAgKi8KKzk0MSwJLyogT0JKX2RoU2luZ2xlUGFzc19zdGRESF9zaGEyNTZrZGZfc2NoZW1lIDEgMyAxMzIgMSAxMSAxICovCis5NDIsCS8qIE9CSl9kaFNpbmdsZVBhc3Nfc3RkREhfc2hhMzg0a2RmX3NjaGVtZSAxIDMgMTMyIDEgMTEgMiAqLworOTQzLAkvKiBPQkpfZGhTaW5nbGVQYXNzX3N0ZERIX3NoYTUxMmtkZl9zY2hlbWUgMSAzIDEzMiAxIDExIDMgKi8KKzk0NSwJLyogT0JKX2RoU2luZ2xlUGFzc19jb2ZhY3RvckRIX3NoYTIyNGtkZl9zY2hlbWUgMSAzIDEzMiAxIDE0IDAgKi8KKzk0NiwJLyogT0JKX2RoU2luZ2xlUGFzc19jb2ZhY3RvckRIX3NoYTI1NmtkZl9zY2hlbWUgMSAzIDEzMiAxIDE0IDEgKi8KKzk0NywJLyogT0JKX2RoU2luZ2xlUGFzc19jb2ZhY3RvckRIX3NoYTM4NGtkZl9zY2hlbWUgMSAzIDEzMiAxIDE0IDIgKi8KKzk0OCwJLyogT0JKX2RoU2luZ2xlUGFzc19jb2ZhY3RvckRIX3NoYTUxMmtkZl9zY2hlbWUgMSAzIDEzMiAxIDE0IDMgKi8KKzYzMSwJLyogT0JKX3NldEF0dHJfR2VuQ3J5cHRncm0gICAgICAgICAgMiAyMyA0MiAzIDMgMyAxICovCis2MzIsCS8qIE9CSl9zZXRBdHRyX1QyRW5jICAgICAgICAgICAgICAgIDIgMjMgNDIgMyAzIDQgMSAqLworNjMzLAkvKiBPQkpfc2V0QXR0cl9UMmNsZWFydHh0ICAgICAgICAgICAyIDIzIDQyIDMgMyA0IDIgKi8KKzYzNCwJLyogT0JKX3NldEF0dHJfVG9rSUNDc2lnICAgICAgICAgICAgMiAyMyA0MiAzIDMgNSAxICovCis2MzUsCS8qIE9CSl9zZXRBdHRyX1NlY0RldlNpZyAgICAgICAgICAgIDIgMjMgNDIgMyAzIDUgMiAqLworNDM2LAkvKiBPQkpfdWNsICAgICAgICAgICAgICAgICAgICAgICAgICAwIDkgMjM0MiAxOTIwMDMwMCAqLworODIwLAkvKiBPQkpfaWRfR29zdDI4MTQ3Xzg5X05vbmVfS2V5TWVzaGluZyAxIDIgNjQzIDIgMiAxNCAwICovCis4MTksCS8qIE9CSl9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX0tleU1lc2hpbmcgMSAyIDY0MyAyIDIgMTQgMSAqLworODQ1LAkvKiBPQkpfaWRfR29zdFIzNDEwXzk0X2EgICAgICAgICAgICAxIDIgNjQzIDIgMiAyMCAxICovCis4NDYsCS8qIE9CSl9pZF9Hb3N0UjM0MTBfOTRfYUJpcyAgICAgICAgIDEgMiA2NDMgMiAyIDIwIDIgKi8KKzg0NywJLyogT0JKX2lkX0dvc3RSMzQxMF85NF9iICAgICAgICAgICAgMSAyIDY0MyAyIDIgMjAgMyAqLworODQ4LAkvKiBPQkpfaWRfR29zdFIzNDEwXzk0X2JCaXMgICAgICAgICAxIDIgNjQzIDIgMiAyMCA0ICovCis4MjEsCS8qIE9CSl9pZF9Hb3N0UjM0MTFfOTRfVGVzdFBhcmFtU2V0IDEgMiA2NDMgMiAyIDMwIDAgKi8KKzgyMiwJLyogT0JKX2lkX0dvc3RSMzQxMV85NF9DcnlwdG9Qcm9QYXJhbVNldCAxIDIgNjQzIDIgMiAzMCAxICovCis4MjMsCS8qIE9CSl9pZF9Hb3N0MjgxNDdfODlfVGVzdFBhcmFtU2V0IDEgMiA2NDMgMiAyIDMxIDAgKi8KKzgyNCwJLyogT0JKX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fQV9QYXJhbVNldCAxIDIgNjQzIDIgMiAzMSAxICovCis4MjUsCS8qIE9CSl9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX0JfUGFyYW1TZXQgMSAyIDY0MyAyIDIgMzEgMiAqLworODI2LAkvKiBPQkpfaWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19DX1BhcmFtU2V0IDEgMiA2NDMgMiAyIDMxIDMgKi8KKzgyNywJLyogT0JKX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fRF9QYXJhbVNldCAxIDIgNjQzIDIgMiAzMSA0ICovCis4MjgsCS8qIE9CSl9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX09zY2FyXzFfMV9QYXJhbVNldCAxIDIgNjQzIDIgMiAzMSA1ICovCis4MjksCS8qIE9CSl9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX09zY2FyXzFfMF9QYXJhbVNldCAxIDIgNjQzIDIgMiAzMSA2ICovCis4MzAsCS8qIE9CSl9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX1JJQ18xX1BhcmFtU2V0IDEgMiA2NDMgMiAyIDMxIDcgKi8KKzgzMSwJLyogT0JKX2lkX0dvc3RSMzQxMF85NF9UZXN0UGFyYW1TZXQgMSAyIDY0MyAyIDIgMzIgMCAqLworODMyLAkvKiBPQkpfaWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19BX1BhcmFtU2V0IDEgMiA2NDMgMiAyIDMyIDIgKi8KKzgzMywJLyogT0JKX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fQl9QYXJhbVNldCAxIDIgNjQzIDIgMiAzMiAzICovCis4MzQsCS8qIE9CSl9pZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX0NfUGFyYW1TZXQgMSAyIDY0MyAyIDIgMzIgNCAqLworODM1LAkvKiBPQkpfaWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19EX1BhcmFtU2V0IDEgMiA2NDMgMiAyIDMyIDUgKi8KKzgzNiwJLyogT0JKX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fWGNoQV9QYXJhbVNldCAxIDIgNjQzIDIgMiAzMyAxICovCis4MzcsCS8qIE9CSl9pZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX1hjaEJfUGFyYW1TZXQgMSAyIDY0MyAyIDIgMzMgMiAqLworODM4LAkvKiBPQkpfaWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19YY2hDX1BhcmFtU2V0IDEgMiA2NDMgMiAyIDMzIDMgKi8KKzgzOSwJLyogT0JKX2lkX0dvc3RSMzQxMF8yMDAxX1Rlc3RQYXJhbVNldCAxIDIgNjQzIDIgMiAzNSAwICovCis4NDAsCS8qIE9CSl9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fQV9QYXJhbVNldCAxIDIgNjQzIDIgMiAzNSAxICovCis4NDEsCS8qIE9CSl9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fQl9QYXJhbVNldCAxIDIgNjQzIDIgMiAzNSAyICovCis4NDIsCS8qIE9CSl9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fQ19QYXJhbVNldCAxIDIgNjQzIDIgMiAzNSAzICovCis4NDMsCS8qIE9CSl9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fWGNoQV9QYXJhbVNldCAxIDIgNjQzIDIgMiAzNiAwICovCis4NDQsCS8qIE9CSl9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fWGNoQl9QYXJhbVNldCAxIDIgNjQzIDIgMiAzNiAxICovCisgMiwJLyogT0JKX3BrY3MgICAgICAgICAgICAgICAgICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMSAqLworNDMxLAkvKiBPQkpfaG9sZF9pbnN0cnVjdGlvbl9ub25lICAgICAgICAxIDIgODQwIDEwMDQwIDIgMSAqLworNDMyLAkvKiBPQkpfaG9sZF9pbnN0cnVjdGlvbl9jYWxsX2lzc3VlciAxIDIgODQwIDEwMDQwIDIgMiAqLworNDMzLAkvKiBPQkpfaG9sZF9pbnN0cnVjdGlvbl9yZWplY3QgICAgICAxIDIgODQwIDEwMDQwIDIgMyAqLworMTE2LAkvKiBPQkpfZHNhICAgICAgICAgICAgICAgICAgICAgICAgICAxIDIgODQwIDEwMDQwIDQgMSAqLworMTEzLAkvKiBPQkpfZHNhV2l0aFNIQTEgICAgICAgICAgICAgICAgICAxIDIgODQwIDEwMDQwIDQgMyAqLworNDA2LAkvKiBPQkpfWDlfNjJfcHJpbWVfZmllbGQgICAgICAgICAgICAxIDIgODQwIDEwMDQ1IDEgMSAqLworNDA3LAkvKiBPQkpfWDlfNjJfY2hhcmFjdGVyaXN0aWNfdHdvX2ZpZWxkIDEgMiA4NDAgMTAwNDUgMSAyICovCis0MDgsCS8qIE9CSl9YOV82Ml9pZF9lY1B1YmxpY0tleSAgICAgICAgIDEgMiA4NDAgMTAwNDUgMiAxICovCis0MTYsCS8qIE9CSl9lY2RzYV93aXRoX1NIQTEgICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgNCAxICovCis3OTEsCS8qIE9CSl9lY2RzYV93aXRoX1JlY29tbWVuZGVkICAgICAgIDEgMiA4NDAgMTAwNDUgNCAyICovCis3OTIsCS8qIE9CSl9lY2RzYV93aXRoX1NwZWNpZmllZCAgICAgICAgIDEgMiA4NDAgMTAwNDUgNCAzICovCis5MjAsCS8qIE9CSl9kaHB1YmxpY251bWJlciAgICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDYgMiAxICovCisyNTgsCS8qIE9CSl9pZF9wa2l4X21vZCAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgMCAqLworMTc1LAkvKiBPQkpfaWRfcGUgICAgICAgICAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDEgKi8KKzI1OSwJLyogT0JKX2lkX3F0ICAgICAgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAyICovCisxMjgsCS8qIE9CSl9pZF9rcCAgICAgICAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgMyAqLworMjYwLAkvKiBPQkpfaWRfaXQgICAgICAgICAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDQgKi8KKzI2MSwJLyogT0JKX2lkX3BraXAgICAgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyA1ICovCisyNjIsCS8qIE9CSl9pZF9hbGcgICAgICAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgNiAqLworMjYzLAkvKiBPQkpfaWRfY21jICAgICAgICAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDcgKi8KKzI2NCwJLyogT0JKX2lkX29uICAgICAgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyA4ICovCisyNjUsCS8qIE9CSl9pZF9wZGEgICAgICAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgOSAqLworMjY2LAkvKiBPQkpfaWRfYWNhICAgICAgICAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDEwICovCisyNjcsCS8qIE9CSl9pZF9xY3MgICAgICAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgMTEgKi8KKzI2OCwJLyogT0JKX2lkX2NjdCAgICAgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAxMiAqLworNjYyLAkvKiBPQkpfaWRfcHBsICAgICAgICAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDIxICovCisxNzYsCS8qIE9CSl9pZF9hZCAgICAgICAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgNDggKi8KKzUwNywJLyogT0JKX2lkX2hleF9wYXJ0aWFsX21lc3NhZ2UgICAgICAgMSAzIDYgMSA3IDEgMSAxICovCis1MDgsCS8qIE9CSl9pZF9oZXhfbXVsdGlwYXJ0X21lc3NhZ2UgICAgIDEgMyA2IDEgNyAxIDEgMiAqLworNTcsCS8qIE9CSl9uZXRzY2FwZSAgICAgICAgICAgICAgICAgICAgIDIgMTYgODQwIDEgMTEzNzMwICovCis3NTQsCS8qIE9CSl9jYW1lbGxpYV8xMjhfZWNiICAgICAgICAgICAgIDAgMyA0NDAxIDUgMyAxIDkgMSAqLworNzY2LAkvKiBPQkpfY2FtZWxsaWFfMTI4X29mYjEyOCAgICAgICAgICAwIDMgNDQwMSA1IDMgMSA5IDMgKi8KKzc1NywJLyogT0JKX2NhbWVsbGlhXzEyOF9jZmIxMjggICAgICAgICAgMCAzIDQ0MDEgNSAzIDEgOSA0ICovCis3NTUsCS8qIE9CSl9jYW1lbGxpYV8xOTJfZWNiICAgICAgICAgICAgIDAgMyA0NDAxIDUgMyAxIDkgMjEgKi8KKzc2NywJLyogT0JKX2NhbWVsbGlhXzE5Ml9vZmIxMjggICAgICAgICAgMCAzIDQ0MDEgNSAzIDEgOSAyMyAqLworNzU4LAkvKiBPQkpfY2FtZWxsaWFfMTkyX2NmYjEyOCAgICAgICAgICAwIDMgNDQwMSA1IDMgMSA5IDI0ICovCis3NTYsCS8qIE9CSl9jYW1lbGxpYV8yNTZfZWNiICAgICAgICAgICAgIDAgMyA0NDAxIDUgMyAxIDkgNDEgKi8KKzc2OCwJLyogT0JKX2NhbWVsbGlhXzI1Nl9vZmIxMjggICAgICAgICAgMCAzIDQ0MDEgNSAzIDEgOSA0MyAqLworNzU5LAkvKiBPQkpfY2FtZWxsaWFfMjU2X2NmYjEyOCAgICAgICAgICAwIDMgNDQwMSA1IDMgMSA5IDQ0ICovCis0MzcsCS8qIE9CSl9waWxvdCAgICAgICAgICAgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAqLworNzc2LAkvKiBPQkpfc2VlZF9lY2IgICAgICAgICAgICAgICAgICAgICAxIDIgNDEwIDIwMDAwNCAxIDMgKi8KKzc3NywJLyogT0JKX3NlZWRfY2JjICAgICAgICAgICAgICAgICAgICAgMSAyIDQxMCAyMDAwMDQgMSA0ICovCis3NzksCS8qIE9CSl9zZWVkX2NmYjEyOCAgICAgICAgICAgICAgICAgIDEgMiA0MTAgMjAwMDA0IDEgNSAqLworNzc4LAkvKiBPQkpfc2VlZF9vZmIxMjggICAgICAgICAgICAgICAgICAxIDIgNDEwIDIwMDAwNCAxIDYgKi8KKzg1MiwJLyogT0JKX2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF85NF9jYyAxIDIgNjQzIDIgOSAxIDMgMyAqLworODUzLAkvKiBPQkpfaWRfR29zdFIzNDExXzk0X3dpdGhfR29zdFIzNDEwXzIwMDFfY2MgMSAyIDY0MyAyIDkgMSAzIDQgKi8KKzg1MCwJLyogT0JKX2lkX0dvc3RSMzQxMF85NF9jYyAgICAgICAgICAgMSAyIDY0MyAyIDkgMSA1IDMgKi8KKzg1MSwJLyogT0JKX2lkX0dvc3RSMzQxMF8yMDAxX2NjICAgICAgICAgMSAyIDY0MyAyIDkgMSA1IDQgKi8KKzg0OSwJLyogT0JKX2lkX0dvc3QyODE0N184OV9jYyAgICAgICAgICAgMSAyIDY0MyAyIDkgMSA2IDEgKi8KKzg1NCwJLyogT0JKX2lkX0dvc3RSMzQxMF8yMDAxX1BhcmFtU2V0X2NjIDEgMiA2NDMgMiA5IDEgOCAxICovCisxODYsCS8qIE9CSl9wa2NzMSAgICAgICAgICAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgMSAqLworMjcsCS8qIE9CSl9wa2NzMyAgICAgICAgICAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgMyAqLworMTg3LAkvKiBPQkpfcGtjczUgICAgICAgICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDUgKi8KKzIwLAkvKiBPQkpfcGtjczcgICAgICAgICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDcgKi8KKzQ3LAkvKiBPQkpfcGtjczkgICAgICAgICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDkgKi8KKyAzLAkvKiBPQkpfbWQyICAgICAgICAgICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAyIDIgKi8KKzI1NywJLyogT0JKX21kNCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMiA0ICovCisgNCwJLyogT0JKX21kNSAgICAgICAgICAgICAgICAgICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMiA1ICovCis3OTcsCS8qIE9CSl9obWFjV2l0aE1ENSAgICAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDIgNiAqLworMTYzLAkvKiBPQkpfaG1hY1dpdGhTSEExICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAyIDcgKi8KKzc5OCwJLyogT0JKX2htYWNXaXRoU0hBMjI0ICAgICAgICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMiA4ICovCis3OTksCS8qIE9CSl9obWFjV2l0aFNIQTI1NiAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDIgOSAqLworODAwLAkvKiBPQkpfaG1hY1dpdGhTSEEzODQgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAyIDEwICovCis4MDEsCS8qIE9CSl9obWFjV2l0aFNIQTUxMiAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDIgMTEgKi8KKzM3LAkvKiBPQkpfcmMyX2NiYyAgICAgICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAzIDIgKi8KKyA1LAkvKiBPQkpfcmM0ICAgICAgICAgICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAzIDQgKi8KKzQ0LAkvKiBPQkpfZGVzX2VkZTNfY2JjICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAzIDcgKi8KKzEyMCwJLyogT0JKX3JjNV9jYmMgICAgICAgICAgICAgICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMyA4ICovCis2NDMsCS8qIE9CSl9kZXNfY2RtZiAgICAgICAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDMgMTAgKi8KKzY4MCwJLyogT0JKX1g5XzYyX2lkX2NoYXJhY3RlcmlzdGljX3R3b19iYXNpcyAxIDIgODQwIDEwMDQ1IDEgMiAzICovCis2ODQsCS8qIE9CSl9YOV82Ml9jMnBuYjE2M3YxICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAwIDEgKi8KKzY4NSwJLyogT0JKX1g5XzYyX2MycG5iMTYzdjIgICAgICAgICAgICAgMSAyIDg0MCAxMDA0NSAzIDAgMiAqLworNjg2LAkvKiBPQkpfWDlfNjJfYzJwbmIxNjN2MyAgICAgICAgICAgICAxIDIgODQwIDEwMDQ1IDMgMCAzICovCis2ODcsCS8qIE9CSl9YOV82Ml9jMnBuYjE3NnYxICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAwIDQgKi8KKzY4OCwJLyogT0JKX1g5XzYyX2MydG5iMTkxdjEgICAgICAgICAgICAgMSAyIDg0MCAxMDA0NSAzIDAgNSAqLworNjg5LAkvKiBPQkpfWDlfNjJfYzJ0bmIxOTF2MiAgICAgICAgICAgICAxIDIgODQwIDEwMDQ1IDMgMCA2ICovCis2OTAsCS8qIE9CSl9YOV82Ml9jMnRuYjE5MXYzICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAwIDcgKi8KKzY5MSwJLyogT0JKX1g5XzYyX2Myb25iMTkxdjQgICAgICAgICAgICAgMSAyIDg0MCAxMDA0NSAzIDAgOCAqLworNjkyLAkvKiBPQkpfWDlfNjJfYzJvbmIxOTF2NSAgICAgICAgICAgICAxIDIgODQwIDEwMDQ1IDMgMCA5ICovCis2OTMsCS8qIE9CSl9YOV82Ml9jMnBuYjIwOHcxICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAwIDEwICovCis2OTQsCS8qIE9CSl9YOV82Ml9jMnRuYjIzOXYxICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAwIDExICovCis2OTUsCS8qIE9CSl9YOV82Ml9jMnRuYjIzOXYyICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAwIDEyICovCis2OTYsCS8qIE9CSl9YOV82Ml9jMnRuYjIzOXYzICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAwIDEzICovCis2OTcsCS8qIE9CSl9YOV82Ml9jMm9uYjIzOXY0ICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAwIDE0ICovCis2OTgsCS8qIE9CSl9YOV82Ml9jMm9uYjIzOXY1ICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAwIDE1ICovCis2OTksCS8qIE9CSl9YOV82Ml9jMnBuYjI3MncxICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAwIDE2ICovCis3MDAsCS8qIE9CSl9YOV82Ml9jMnBuYjMwNHcxICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAwIDE3ICovCis3MDEsCS8qIE9CSl9YOV82Ml9jMnRuYjM1OXYxICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAwIDE4ICovCis3MDIsCS8qIE9CSl9YOV82Ml9jMnBuYjM2OHcxICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAwIDE5ICovCis3MDMsCS8qIE9CSl9YOV82Ml9jMnRuYjQzMXIxICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAwIDIwICovCis0MDksCS8qIE9CSl9YOV82Ml9wcmltZTE5MnYxICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAxIDEgKi8KKzQxMCwJLyogT0JKX1g5XzYyX3ByaW1lMTkydjIgICAgICAgICAgICAgMSAyIDg0MCAxMDA0NSAzIDEgMiAqLworNDExLAkvKiBPQkpfWDlfNjJfcHJpbWUxOTJ2MyAgICAgICAgICAgICAxIDIgODQwIDEwMDQ1IDMgMSAzICovCis0MTIsCS8qIE9CSl9YOV82Ml9wcmltZTIzOXYxICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAxIDQgKi8KKzQxMywJLyogT0JKX1g5XzYyX3ByaW1lMjM5djIgICAgICAgICAgICAgMSAyIDg0MCAxMDA0NSAzIDEgNSAqLworNDE0LAkvKiBPQkpfWDlfNjJfcHJpbWUyMzl2MyAgICAgICAgICAgICAxIDIgODQwIDEwMDQ1IDMgMSA2ICovCis0MTUsCS8qIE9CSl9YOV82Ml9wcmltZTI1NnYxICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAxIDcgKi8KKzc5MywJLyogT0JKX2VjZHNhX3dpdGhfU0hBMjI0ICAgICAgICAgICAgMSAyIDg0MCAxMDA0NSA0IDMgMSAqLworNzk0LAkvKiBPQkpfZWNkc2Ffd2l0aF9TSEEyNTYgICAgICAgICAgICAxIDIgODQwIDEwMDQ1IDQgMyAyICovCis3OTUsCS8qIE9CSl9lY2RzYV93aXRoX1NIQTM4NCAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgNCAzIDMgKi8KKzc5NiwJLyogT0JKX2VjZHNhX3dpdGhfU0hBNTEyICAgICAgICAgICAgMSAyIDg0MCAxMDA0NSA0IDMgNCAqLworMjY5LAkvKiBPQkpfaWRfcGtpeDFfZXhwbGljaXRfODggICAgICAgICAxIDMgNiAxIDUgNSA3IDAgMSAqLworMjcwLAkvKiBPQkpfaWRfcGtpeDFfaW1wbGljaXRfODggICAgICAgICAxIDMgNiAxIDUgNSA3IDAgMiAqLworMjcxLAkvKiBPQkpfaWRfcGtpeDFfZXhwbGljaXRfOTMgICAgICAgICAxIDMgNiAxIDUgNSA3IDAgMyAqLworMjcyLAkvKiBPQkpfaWRfcGtpeDFfaW1wbGljaXRfOTMgICAgICAgICAxIDMgNiAxIDUgNSA3IDAgNCAqLworMjczLAkvKiBPQkpfaWRfbW9kX2NybWYgICAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDAgNSAqLworMjc0LAkvKiBPQkpfaWRfbW9kX2NtYyAgICAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDAgNiAqLworMjc1LAkvKiBPQkpfaWRfbW9kX2tlYV9wcm9maWxlXzg4ICAgICAgICAxIDMgNiAxIDUgNSA3IDAgNyAqLworMjc2LAkvKiBPQkpfaWRfbW9kX2tlYV9wcm9maWxlXzkzICAgICAgICAxIDMgNiAxIDUgNSA3IDAgOCAqLworMjc3LAkvKiBPQkpfaWRfbW9kX2NtcCAgICAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDAgOSAqLworMjc4LAkvKiBPQkpfaWRfbW9kX3F1YWxpZmllZF9jZXJ0Xzg4ICAgICAxIDMgNiAxIDUgNSA3IDAgMTAgKi8KKzI3OSwJLyogT0JKX2lkX21vZF9xdWFsaWZpZWRfY2VydF85MyAgICAgMSAzIDYgMSA1IDUgNyAwIDExICovCisyODAsCS8qIE9CSl9pZF9tb2RfYXR0cmlidXRlX2NlcnQgICAgICAgIDEgMyA2IDEgNSA1IDcgMCAxMiAqLworMjgxLAkvKiBPQkpfaWRfbW9kX3RpbWVzdGFtcF9wcm90b2NvbCAgICAxIDMgNiAxIDUgNSA3IDAgMTMgKi8KKzI4MiwJLyogT0JKX2lkX21vZF9vY3NwICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAwIDE0ICovCisyODMsCS8qIE9CSl9pZF9tb2RfZHZjcyAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgMCAxNSAqLworMjg0LAkvKiBPQkpfaWRfbW9kX2NtcDIwMDAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDAgMTYgKi8KKzE3NywJLyogT0JKX2luZm9fYWNjZXNzICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAxIDEgKi8KKzI4NSwJLyogT0JKX2Jpb21ldHJpY0luZm8gICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAxIDIgKi8KKzI4NiwJLyogT0JKX3FjU3RhdGVtZW50cyAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAxIDMgKi8KKzI4NywJLyogT0JKX2FjX2F1ZGl0RW50aXR5ICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAxIDQgKi8KKzI4OCwJLyogT0JKX2FjX3RhcmdldGluZyAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAxIDUgKi8KKzI4OSwJLyogT0JKX2FhQ29udHJvbHMgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAxIDYgKi8KKzI5MCwJLyogT0JKX3NiZ3BfaXBBZGRyQmxvY2sgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAxIDcgKi8KKzI5MSwJLyogT0JKX3NiZ3BfYXV0b25vbW91c1N5c051bSAgICAgICAgMSAzIDYgMSA1IDUgNyAxIDggKi8KKzI5MiwJLyogT0JKX3NiZ3Bfcm91dGVySWRlbnRpZmllciAgICAgICAgMSAzIDYgMSA1IDUgNyAxIDkgKi8KKzM5NywJLyogT0JKX2FjX3Byb3h5aW5nICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAxIDEwICovCiszOTgsCS8qIE9CSl9zaW5mb19hY2Nlc3MgICAgICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgMSAxMSAqLworNjYzLAkvKiBPQkpfcHJveHlDZXJ0SW5mbyAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDEgMTQgKi8KKzE2NCwJLyogT0JKX2lkX3F0X2NwcyAgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAyIDEgKi8KKzE2NSwJLyogT0JKX2lkX3F0X3Vub3RpY2UgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAyIDIgKi8KKzI5MywJLyogT0JKX3RleHROb3RpY2UgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAyIDMgKi8KKzEyOSwJLyogT0JKX3NlcnZlcl9hdXRoICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAzIDEgKi8KKzEzMCwJLyogT0JKX2NsaWVudF9hdXRoICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAzIDIgKi8KKzEzMSwJLyogT0JKX2NvZGVfc2lnbiAgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAzIDMgKi8KKzEzMiwJLyogT0JKX2VtYWlsX3Byb3RlY3QgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAzIDQgKi8KKzI5NCwJLyogT0JKX2lwc2VjRW5kU3lzdGVtICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAzIDUgKi8KKzI5NSwJLyogT0JKX2lwc2VjVHVubmVsICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAzIDYgKi8KKzI5NiwJLyogT0JKX2lwc2VjVXNlciAgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAzIDcgKi8KKzEzMywJLyogT0JKX3RpbWVfc3RhbXAgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAzIDggKi8KKzE4MCwJLyogT0JKX09DU1Bfc2lnbiAgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAzIDkgKi8KKzI5NywJLyogT0JKX2R2Y3MgICAgICAgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAzIDEwICovCisyOTgsCS8qIE9CSl9pZF9pdF9jYVByb3RFbmNDZXJ0ICAgICAgICAgIDEgMyA2IDEgNSA1IDcgNCAxICovCisyOTksCS8qIE9CSl9pZF9pdF9zaWduS2V5UGFpclR5cGVzICAgICAgIDEgMyA2IDEgNSA1IDcgNCAyICovCiszMDAsCS8qIE9CSl9pZF9pdF9lbmNLZXlQYWlyVHlwZXMgICAgICAgIDEgMyA2IDEgNSA1IDcgNCAzICovCiszMDEsCS8qIE9CSl9pZF9pdF9wcmVmZXJyZWRTeW1tQWxnICAgICAgIDEgMyA2IDEgNSA1IDcgNCA0ICovCiszMDIsCS8qIE9CSl9pZF9pdF9jYUtleVVwZGF0ZUluZm8gICAgICAgIDEgMyA2IDEgNSA1IDcgNCA1ICovCiszMDMsCS8qIE9CSl9pZF9pdF9jdXJyZW50Q1JMICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgNCA2ICovCiszMDQsCS8qIE9CSl9pZF9pdF91bnN1cHBvcnRlZE9JRHMgICAgICAgIDEgMyA2IDEgNSA1IDcgNCA3ICovCiszMDUsCS8qIE9CSl9pZF9pdF9zdWJzY3JpcHRpb25SZXF1ZXN0ICAgIDEgMyA2IDEgNSA1IDcgNCA4ICovCiszMDYsCS8qIE9CSl9pZF9pdF9zdWJzY3JpcHRpb25SZXNwb25zZSAgIDEgMyA2IDEgNSA1IDcgNCA5ICovCiszMDcsCS8qIE9CSl9pZF9pdF9rZXlQYWlyUGFyYW1SZXEgICAgICAgIDEgMyA2IDEgNSA1IDcgNCAxMCAqLworMzA4LAkvKiBPQkpfaWRfaXRfa2V5UGFpclBhcmFtUmVwICAgICAgICAxIDMgNiAxIDUgNSA3IDQgMTEgKi8KKzMwOSwJLyogT0JKX2lkX2l0X3JldlBhc3NwaHJhc2UgICAgICAgICAgMSAzIDYgMSA1IDUgNyA0IDEyICovCiszMTAsCS8qIE9CSl9pZF9pdF9pbXBsaWNpdENvbmZpcm0gICAgICAgIDEgMyA2IDEgNSA1IDcgNCAxMyAqLworMzExLAkvKiBPQkpfaWRfaXRfY29uZmlybVdhaXRUaW1lICAgICAgICAxIDMgNiAxIDUgNSA3IDQgMTQgKi8KKzMxMiwJLyogT0JKX2lkX2l0X29yaWdQS0lNZXNzYWdlICAgICAgICAgMSAzIDYgMSA1IDUgNyA0IDE1ICovCis3ODQsCS8qIE9CSl9pZF9pdF9zdXBwTGFuZ1RhZ3MgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgNCAxNiAqLworMzEzLAkvKiBPQkpfaWRfcmVnQ3RybCAgICAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDUgMSAqLworMzE0LAkvKiBPQkpfaWRfcmVnSW5mbyAgICAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDUgMiAqLworMzIzLAkvKiBPQkpfaWRfYWxnX2RlczQwICAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDYgMSAqLworMzI0LAkvKiBPQkpfaWRfYWxnX25vU2lnbmF0dXJlICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDYgMiAqLworMzI1LAkvKiBPQkpfaWRfYWxnX2RoX3NpZ19obWFjX3NoYTEgICAgICAxIDMgNiAxIDUgNSA3IDYgMyAqLworMzI2LAkvKiBPQkpfaWRfYWxnX2RoX3BvcCAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDYgNCAqLworMzI3LAkvKiBPQkpfaWRfY21jX3N0YXR1c0luZm8gICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDcgMSAqLworMzI4LAkvKiBPQkpfaWRfY21jX2lkZW50aWZpY2F0aW9uICAgICAgICAxIDMgNiAxIDUgNSA3IDcgMiAqLworMzI5LAkvKiBPQkpfaWRfY21jX2lkZW50aXR5UHJvb2YgICAgICAgICAxIDMgNiAxIDUgNSA3IDcgMyAqLworMzMwLAkvKiBPQkpfaWRfY21jX2RhdGFSZXR1cm4gICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDcgNCAqLworMzMxLAkvKiBPQkpfaWRfY21jX3RyYW5zYWN0aW9uSWQgICAgICAgICAxIDMgNiAxIDUgNSA3IDcgNSAqLworMzMyLAkvKiBPQkpfaWRfY21jX3NlbmRlck5vbmNlICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDcgNiAqLworMzMzLAkvKiBPQkpfaWRfY21jX3JlY2lwaWVudE5vbmNlICAgICAgICAxIDMgNiAxIDUgNSA3IDcgNyAqLworMzM0LAkvKiBPQkpfaWRfY21jX2FkZEV4dGVuc2lvbnMgICAgICAgICAxIDMgNiAxIDUgNSA3IDcgOCAqLworMzM1LAkvKiBPQkpfaWRfY21jX2VuY3J5cHRlZFBPUCAgICAgICAgICAxIDMgNiAxIDUgNSA3IDcgOSAqLworMzM2LAkvKiBPQkpfaWRfY21jX2RlY3J5cHRlZFBPUCAgICAgICAgICAxIDMgNiAxIDUgNSA3IDcgMTAgKi8KKzMzNywJLyogT0JKX2lkX2NtY19scmFQT1BXaXRuZXNzICAgICAgICAgMSAzIDYgMSA1IDUgNyA3IDExICovCiszMzgsCS8qIE9CSl9pZF9jbWNfZ2V0Q2VydCAgICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgNyAxNSAqLworMzM5LAkvKiBPQkpfaWRfY21jX2dldENSTCAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDcgMTYgKi8KKzM0MCwJLyogT0JKX2lkX2NtY19yZXZva2VSZXF1ZXN0ICAgICAgICAgMSAzIDYgMSA1IDUgNyA3IDE3ICovCiszNDEsCS8qIE9CSl9pZF9jbWNfcmVnSW5mbyAgICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgNyAxOCAqLworMzQyLAkvKiBPQkpfaWRfY21jX3Jlc3BvbnNlSW5mbyAgICAgICAgICAxIDMgNiAxIDUgNSA3IDcgMTkgKi8KKzM0MywJLyogT0JKX2lkX2NtY19xdWVyeVBlbmRpbmcgICAgICAgICAgMSAzIDYgMSA1IDUgNyA3IDIxICovCiszNDQsCS8qIE9CSl9pZF9jbWNfcG9wTGlua1JhbmRvbSAgICAgICAgIDEgMyA2IDEgNSA1IDcgNyAyMiAqLworMzQ1LAkvKiBPQkpfaWRfY21jX3BvcExpbmtXaXRuZXNzICAgICAgICAxIDMgNiAxIDUgNSA3IDcgMjMgKi8KKzM0NiwJLyogT0JKX2lkX2NtY19jb25maXJtQ2VydEFjY2VwdGFuY2UgMSAzIDYgMSA1IDUgNyA3IDI0ICovCiszNDcsCS8qIE9CSl9pZF9vbl9wZXJzb25hbERhdGEgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgOCAxICovCis4NTgsCS8qIE9CSl9pZF9vbl9wZXJtYW5lbnRJZGVudGlmaWVyICAgIDEgMyA2IDEgNSA1IDcgOCAzICovCiszNDgsCS8qIE9CSl9pZF9wZGFfZGF0ZU9mQmlydGggICAgICAgICAgIDEgMyA2IDEgNSA1IDcgOSAxICovCiszNDksCS8qIE9CSl9pZF9wZGFfcGxhY2VPZkJpcnRoICAgICAgICAgIDEgMyA2IDEgNSA1IDcgOSAyICovCiszNTEsCS8qIE9CSl9pZF9wZGFfZ2VuZGVyICAgICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgOSAzICovCiszNTIsCS8qIE9CSl9pZF9wZGFfY291bnRyeU9mQ2l0aXplbnNoaXAgIDEgMyA2IDEgNSA1IDcgOSA0ICovCiszNTMsCS8qIE9CSl9pZF9wZGFfY291bnRyeU9mUmVzaWRlbmNlICAgIDEgMyA2IDEgNSA1IDcgOSA1ICovCiszNTQsCS8qIE9CSl9pZF9hY2FfYXV0aGVudGljYXRpb25JbmZvICAgIDEgMyA2IDEgNSA1IDcgMTAgMSAqLworMzU1LAkvKiBPQkpfaWRfYWNhX2FjY2Vzc0lkZW50aXR5ICAgICAgICAxIDMgNiAxIDUgNSA3IDEwIDIgKi8KKzM1NiwJLyogT0JKX2lkX2FjYV9jaGFyZ2luZ0lkZW50aXR5ICAgICAgMSAzIDYgMSA1IDUgNyAxMCAzICovCiszNTcsCS8qIE9CSl9pZF9hY2FfZ3JvdXAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgMTAgNCAqLworMzU4LAkvKiBPQkpfaWRfYWNhX3JvbGUgICAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDEwIDUgKi8KKzM5OSwJLyogT0JKX2lkX2FjYV9lbmNBdHRycyAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAxMCA2ICovCiszNTksCS8qIE9CSl9pZF9xY3NfcGtpeFFDU3ludGF4X3YxICAgICAgIDEgMyA2IDEgNSA1IDcgMTEgMSAqLworMzYwLAkvKiBPQkpfaWRfY2N0X2NycyAgICAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDEyIDEgKi8KKzM2MSwJLyogT0JKX2lkX2NjdF9QS0lEYXRhICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAxMiAyICovCiszNjIsCS8qIE9CSl9pZF9jY3RfUEtJUmVzcG9uc2UgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgMTIgMyAqLworNjY0LAkvKiBPQkpfaWRfcHBsX2FueUxhbmd1YWdlICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDIxIDAgKi8KKzY2NSwJLyogT0JKX2lkX3BwbF9pbmhlcml0QWxsICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAyMSAxICovCis2NjcsCS8qIE9CSl9JbmRlcGVuZGVudCAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgMjEgMiAqLworMTc4LAkvKiBPQkpfYWRfT0NTUCAgICAgICAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDQ4IDEgKi8KKzE3OSwJLyogT0JKX2FkX2NhX2lzc3VlcnMgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyA0OCAyICovCiszNjMsCS8qIE9CSl9hZF90aW1lU3RhbXBpbmcgICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgNDggMyAqLworMzY0LAkvKiBPQkpfYWRfZHZjcyAgICAgICAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDQ4IDQgKi8KKzc4NSwJLyogT0JKX2NhUmVwb3NpdG9yeSAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyA0OCA1ICovCis3ODAsCS8qIE9CSl9obWFjX21kNSAgICAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDggMSAxICovCis3ODEsCS8qIE9CSl9obWFjX3NoYTEgICAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDggMSAyICovCis1OCwJLyogT0JKX25ldHNjYXBlX2NlcnRfZXh0ZW5zaW9uICAgICAgMiAxNiA4NDAgMSAxMTM3MzAgMSAqLworNTksCS8qIE9CSl9uZXRzY2FwZV9kYXRhX3R5cGUgICAgICAgICAgIDIgMTYgODQwIDEgMTEzNzMwIDIgKi8KKzQzOCwJLyogT0JKX3BpbG90QXR0cmlidXRlVHlwZSAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgKi8KKzQzOSwJLyogT0JKX3BpbG90QXR0cmlidXRlU3ludGF4ICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDMgKi8KKzQ0MCwJLyogT0JKX3BpbG90T2JqZWN0Q2xhc3MgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDQgKi8KKzQ0MSwJLyogT0JKX3BpbG90R3JvdXBzICAgICAgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEwICovCisxMDgsCS8qIE9CSl9jYXN0NV9jYmMgICAgICAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTMzIDcgNjYgMTAgKi8KKzExMiwJLyogT0JKX3BiZVdpdGhNRDVBbmRDYXN0NV9DQkMgICAgICAgMSAyIDg0MCAxMTM1MzMgNyA2NiAxMiAqLworNzgyLAkvKiBPQkpfaWRfUGFzc3dvcmRCYXNlZE1BQyAgICAgICAgICAxIDIgODQwIDExMzUzMyA3IDY2IDEzICovCis3ODMsCS8qIE9CSl9pZF9ESEJhc2VkTWFjICAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTMzIDcgNjYgMzAgKi8KKyA2LAkvKiBPQkpfcnNhRW5jcnlwdGlvbiAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDEgMSAqLworIDcsCS8qIE9CSl9tZDJXaXRoUlNBRW5jcnlwdGlvbiAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgMSAyICovCiszOTYsCS8qIE9CSl9tZDRXaXRoUlNBRW5jcnlwdGlvbiAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgMSAzICovCisgOCwJLyogT0JKX21kNVdpdGhSU0FFbmNyeXB0aW9uICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMSAxIDQgKi8KKzY1LAkvKiBPQkpfc2hhMVdpdGhSU0FFbmNyeXB0aW9uICAgICAgICAxIDIgODQwIDExMzU0OSAxIDEgNSAqLworNjQ0LAkvKiBPQkpfcnNhT0FFUEVuY3J5cHRpb25TRVQgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDEgNiAqLworOTE5LAkvKiBPQkpfcnNhZXNPYWVwICAgICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDEgNyAqLworOTExLAkvKiBPQkpfbWdmMSAgICAgICAgICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDEgOCAqLworOTM1LAkvKiBPQkpfcFNwZWNpZmllZCAgICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDEgOSAqLworOTEyLAkvKiBPQkpfcnNhc3NhUHNzICAgICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDEgMTAgKi8KKzY2OCwJLyogT0JKX3NoYTI1NldpdGhSU0FFbmNyeXB0aW9uICAgICAgMSAyIDg0MCAxMTM1NDkgMSAxIDExICovCis2NjksCS8qIE9CSl9zaGEzODRXaXRoUlNBRW5jcnlwdGlvbiAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgMSAxMiAqLworNjcwLAkvKiBPQkpfc2hhNTEyV2l0aFJTQUVuY3J5cHRpb24gICAgICAxIDIgODQwIDExMzU0OSAxIDEgMTMgKi8KKzY3MSwJLyogT0JKX3NoYTIyNFdpdGhSU0FFbmNyeXB0aW9uICAgICAgMSAyIDg0MCAxMTM1NDkgMSAxIDE0ICovCisyOCwJLyogT0JKX2RoS2V5QWdyZWVtZW50ICAgICAgICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMSAzIDEgKi8KKyA5LAkvKiBPQkpfcGJlV2l0aE1EMkFuZERFU19DQkMgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDUgMSAqLworMTAsCS8qIE9CSl9wYmVXaXRoTUQ1QW5kREVTX0NCQyAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgNSAzICovCisxNjgsCS8qIE9CSl9wYmVXaXRoTUQyQW5kUkMyX0NCQyAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgNSA0ICovCisxNjksCS8qIE9CSl9wYmVXaXRoTUQ1QW5kUkMyX0NCQyAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgNSA2ICovCisxNzAsCS8qIE9CSl9wYmVXaXRoU0hBMUFuZERFU19DQkMgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgNSAxMCAqLworNjgsCS8qIE9CSl9wYmVXaXRoU0hBMUFuZFJDMl9DQkMgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgNSAxMSAqLworNjksCS8qIE9CSl9pZF9wYmtkZjIgICAgICAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgNSAxMiAqLworMTYxLAkvKiBPQkpfcGJlczIgICAgICAgICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDUgMTMgKi8KKzE2MiwJLyogT0JKX3BibWFjMSAgICAgICAgICAgICAgICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMSA1IDE0ICovCisyMSwJLyogT0JKX3BrY3M3X2RhdGEgICAgICAgICAgICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMSA3IDEgKi8KKzIyLAkvKiBPQkpfcGtjczdfc2lnbmVkICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDcgMiAqLworMjMsCS8qIE9CSl9wa2NzN19lbnZlbG9wZWQgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgNyAzICovCisyNCwJLyogT0JKX3BrY3M3X3NpZ25lZEFuZEVudmVsb3BlZCAgICAgMSAyIDg0MCAxMTM1NDkgMSA3IDQgKi8KKzI1LAkvKiBPQkpfcGtjczdfZGlnZXN0ICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDcgNSAqLworMjYsCS8qIE9CSl9wa2NzN19lbmNyeXB0ZWQgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgNyA2ICovCis0OCwJLyogT0JKX3BrY3M5X2VtYWlsQWRkcmVzcyAgICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMSA5IDEgKi8KKzQ5LAkvKiBPQkpfcGtjczlfdW5zdHJ1Y3R1cmVkTmFtZSAgICAgICAxIDIgODQwIDExMzU0OSAxIDkgMiAqLworNTAsCS8qIE9CSl9wa2NzOV9jb250ZW50VHlwZSAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAzICovCis1MSwJLyogT0JKX3BrY3M5X21lc3NhZ2VEaWdlc3QgICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMSA5IDQgKi8KKzUyLAkvKiBPQkpfcGtjczlfc2lnbmluZ1RpbWUgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDkgNSAqLworNTMsCS8qIE9CSl9wa2NzOV9jb3VudGVyc2lnbmF0dXJlICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSA2ICovCis1NCwJLyogT0JKX3BrY3M5X2NoYWxsZW5nZVBhc3N3b3JkICAgICAgMSAyIDg0MCAxMTM1NDkgMSA5IDcgKi8KKzU1LAkvKiBPQkpfcGtjczlfdW5zdHJ1Y3R1cmVkQWRkcmVzcyAgICAxIDIgODQwIDExMzU0OSAxIDkgOCAqLworNTYsCS8qIE9CSl9wa2NzOV9leHRDZXJ0QXR0cmlidXRlcyAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSA5ICovCisxNzIsCS8qIE9CSl9leHRfcmVxICAgICAgICAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNCAqLworMTY3LAkvKiBPQkpfU01JTUVDYXBhYmlsaXRpZXMgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDkgMTUgKi8KKzE4OCwJLyogT0JKX1NNSU1FICAgICAgICAgICAgICAgICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMSA5IDE2ICovCisxNTYsCS8qIE9CSl9mcmllbmRseU5hbWUgICAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAyMCAqLworMTU3LAkvKiBPQkpfbG9jYWxLZXlJRCAgICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDkgMjEgKi8KKzY4MSwJLyogT0JKX1g5XzYyX29uQmFzaXMgICAgICAgICAgICAgICAgMSAyIDg0MCAxMDA0NSAxIDIgMyAxICovCis2ODIsCS8qIE9CSl9YOV82Ml90cEJhc2lzICAgICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMSAyIDMgMiAqLworNjgzLAkvKiBPQkpfWDlfNjJfcHBCYXNpcyAgICAgICAgICAgICAgICAxIDIgODQwIDEwMDQ1IDEgMiAzIDMgKi8KKzQxNywJLyogT0JKX21zX2NzcF9uYW1lICAgICAgICAgICAgICAgICAgMSAzIDYgMSA0IDEgMzExIDE3IDEgKi8KKzg1NiwJLyogT0JKX0xvY2FsS2V5U2V0ICAgICAgICAgICAgICAgICAgMSAzIDYgMSA0IDEgMzExIDE3IDIgKi8KKzM5MCwJLyogT0JKX2RjT2JqZWN0ICAgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA0IDEgMTQ2NiAzNDQgKi8KKzkxLAkvKiBPQkpfYmZfY2JjICAgICAgICAgICAgICAgICAgICAgICAxIDMgNiAxIDQgMSAzMDI5IDEgMiAqLworMzE1LAkvKiBPQkpfaWRfcmVnQ3RybF9yZWdUb2tlbiAgICAgICAgICAxIDMgNiAxIDUgNSA3IDUgMSAxICovCiszMTYsCS8qIE9CSl9pZF9yZWdDdHJsX2F1dGhlbnRpY2F0b3IgICAgIDEgMyA2IDEgNSA1IDcgNSAxIDIgKi8KKzMxNywJLyogT0JKX2lkX3JlZ0N0cmxfcGtpUHVibGljYXRpb25JbmZvIDEgMyA2IDEgNSA1IDcgNSAxIDMgKi8KKzMxOCwJLyogT0JKX2lkX3JlZ0N0cmxfcGtpQXJjaGl2ZU9wdGlvbnMgMSAzIDYgMSA1IDUgNyA1IDEgNCAqLworMzE5LAkvKiBPQkpfaWRfcmVnQ3RybF9vbGRDZXJ0SUQgICAgICAgICAxIDMgNiAxIDUgNSA3IDUgMSA1ICovCiszMjAsCS8qIE9CSl9pZF9yZWdDdHJsX3Byb3RvY29sRW5jcktleSAgIDEgMyA2IDEgNSA1IDcgNSAxIDYgKi8KKzMyMSwJLyogT0JKX2lkX3JlZ0luZm9fdXRmOFBhaXJzICAgICAgICAgMSAzIDYgMSA1IDUgNyA1IDIgMSAqLworMzIyLAkvKiBPQkpfaWRfcmVnSW5mb19jZXJ0UmVxICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDUgMiAyICovCiszNjUsCS8qIE9CSl9pZF9wa2l4X09DU1BfYmFzaWMgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgNDggMSAxICovCiszNjYsCS8qIE9CSl9pZF9wa2l4X09DU1BfTm9uY2UgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgNDggMSAyICovCiszNjcsCS8qIE9CSl9pZF9wa2l4X09DU1BfQ3JsSUQgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgNDggMSAzICovCiszNjgsCS8qIE9CSl9pZF9wa2l4X09DU1BfYWNjZXB0YWJsZVJlc3BvbnNlcyAxIDMgNiAxIDUgNSA3IDQ4IDEgNCAqLworMzY5LAkvKiBPQkpfaWRfcGtpeF9PQ1NQX25vQ2hlY2sgICAgICAgICAxIDMgNiAxIDUgNSA3IDQ4IDEgNSAqLworMzcwLAkvKiBPQkpfaWRfcGtpeF9PQ1NQX2FyY2hpdmVDdXRvZmYgICAxIDMgNiAxIDUgNSA3IDQ4IDEgNiAqLworMzcxLAkvKiBPQkpfaWRfcGtpeF9PQ1NQX3NlcnZpY2VMb2NhdG9yICAxIDMgNiAxIDUgNSA3IDQ4IDEgNyAqLworMzcyLAkvKiBPQkpfaWRfcGtpeF9PQ1NQX2V4dGVuZGVkU3RhdHVzICAxIDMgNiAxIDUgNSA3IDQ4IDEgOCAqLworMzczLAkvKiBPQkpfaWRfcGtpeF9PQ1NQX3ZhbGlkICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDQ4IDEgOSAqLworMzc0LAkvKiBPQkpfaWRfcGtpeF9PQ1NQX3BhdGggICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDQ4IDEgMTAgKi8KKzM3NSwJLyogT0JKX2lkX3BraXhfT0NTUF90cnVzdFJvb3QgICAgICAgMSAzIDYgMSA1IDUgNyA0OCAxIDExICovCis5MjEsCS8qIE9CSl9icmFpbnBvb2xQMTYwcjEgICAgICAgICAgICAgIDEgMyAzNiAzIDMgMiA4IDEgMSAxICovCis5MjIsCS8qIE9CSl9icmFpbnBvb2xQMTYwdDEgICAgICAgICAgICAgIDEgMyAzNiAzIDMgMiA4IDEgMSAyICovCis5MjMsCS8qIE9CSl9icmFpbnBvb2xQMTkycjEgICAgICAgICAgICAgIDEgMyAzNiAzIDMgMiA4IDEgMSAzICovCis5MjQsCS8qIE9CSl9icmFpbnBvb2xQMTkydDEgICAgICAgICAgICAgIDEgMyAzNiAzIDMgMiA4IDEgMSA0ICovCis5MjUsCS8qIE9CSl9icmFpbnBvb2xQMjI0cjEgICAgICAgICAgICAgIDEgMyAzNiAzIDMgMiA4IDEgMSA1ICovCis5MjYsCS8qIE9CSl9icmFpbnBvb2xQMjI0dDEgICAgICAgICAgICAgIDEgMyAzNiAzIDMgMiA4IDEgMSA2ICovCis5MjcsCS8qIE9CSl9icmFpbnBvb2xQMjU2cjEgICAgICAgICAgICAgIDEgMyAzNiAzIDMgMiA4IDEgMSA3ICovCis5MjgsCS8qIE9CSl9icmFpbnBvb2xQMjU2dDEgICAgICAgICAgICAgIDEgMyAzNiAzIDMgMiA4IDEgMSA4ICovCis5MjksCS8qIE9CSl9icmFpbnBvb2xQMzIwcjEgICAgICAgICAgICAgIDEgMyAzNiAzIDMgMiA4IDEgMSA5ICovCis5MzAsCS8qIE9CSl9icmFpbnBvb2xQMzIwdDEgICAgICAgICAgICAgIDEgMyAzNiAzIDMgMiA4IDEgMSAxMCAqLworOTMxLAkvKiBPQkpfYnJhaW5wb29sUDM4NHIxICAgICAgICAgICAgICAxIDMgMzYgMyAzIDIgOCAxIDEgMTEgKi8KKzkzMiwJLyogT0JKX2JyYWlucG9vbFAzODR0MSAgICAgICAgICAgICAgMSAzIDM2IDMgMyAyIDggMSAxIDEyICovCis5MzMsCS8qIE9CSl9icmFpbnBvb2xQNTEycjEgICAgICAgICAgICAgIDEgMyAzNiAzIDMgMiA4IDEgMSAxMyAqLworOTM0LAkvKiBPQkpfYnJhaW5wb29sUDUxMnQxICAgICAgICAgICAgICAxIDMgMzYgMyAzIDIgOCAxIDEgMTQgKi8KKzkzOSwJLyogT0JKX2RoU2luZ2xlUGFzc19zdGRESF9zaGExa2RmX3NjaGVtZSAxIDMgMTMzIDE2IDg0MCA2MyAwIDIgKi8KKzk0NCwJLyogT0JKX2RoU2luZ2xlUGFzc19jb2ZhY3RvckRIX3NoYTFrZGZfc2NoZW1lIDEgMyAxMzMgMTYgODQwIDYzIDAgMyAqLworNDE4LAkvKiBPQkpfYWVzXzEyOF9lY2IgICAgICAgICAgICAgICAgICAyIDE2IDg0MCAxIDEwMSAzIDQgMSAxICovCis0MTksCS8qIE9CSl9hZXNfMTI4X2NiYyAgICAgICAgICAgICAgICAgIDIgMTYgODQwIDEgMTAxIDMgNCAxIDIgKi8KKzQyMCwJLyogT0JKX2Flc18xMjhfb2ZiMTI4ICAgICAgICAgICAgICAgMiAxNiA4NDAgMSAxMDEgMyA0IDEgMyAqLworNDIxLAkvKiBPQkpfYWVzXzEyOF9jZmIxMjggICAgICAgICAgICAgICAyIDE2IDg0MCAxIDEwMSAzIDQgMSA0ICovCis3ODgsCS8qIE9CSl9pZF9hZXMxMjhfd3JhcCAgICAgICAgICAgICAgIDIgMTYgODQwIDEgMTAxIDMgNCAxIDUgKi8KKzg5NSwJLyogT0JKX2Flc18xMjhfZ2NtICAgICAgICAgICAgICAgICAgMiAxNiA4NDAgMSAxMDEgMyA0IDEgNiAqLworODk2LAkvKiBPQkpfYWVzXzEyOF9jY20gICAgICAgICAgICAgICAgICAyIDE2IDg0MCAxIDEwMSAzIDQgMSA3ICovCis4OTcsCS8qIE9CSl9pZF9hZXMxMjhfd3JhcF9wYWQgICAgICAgICAgIDIgMTYgODQwIDEgMTAxIDMgNCAxIDggKi8KKzQyMiwJLyogT0JKX2Flc18xOTJfZWNiICAgICAgICAgICAgICAgICAgMiAxNiA4NDAgMSAxMDEgMyA0IDEgMjEgKi8KKzQyMywJLyogT0JKX2Flc18xOTJfY2JjICAgICAgICAgICAgICAgICAgMiAxNiA4NDAgMSAxMDEgMyA0IDEgMjIgKi8KKzQyNCwJLyogT0JKX2Flc18xOTJfb2ZiMTI4ICAgICAgICAgICAgICAgMiAxNiA4NDAgMSAxMDEgMyA0IDEgMjMgKi8KKzQyNSwJLyogT0JKX2Flc18xOTJfY2ZiMTI4ICAgICAgICAgICAgICAgMiAxNiA4NDAgMSAxMDEgMyA0IDEgMjQgKi8KKzc4OSwJLyogT0JKX2lkX2FlczE5Ml93cmFwICAgICAgICAgICAgICAgMiAxNiA4NDAgMSAxMDEgMyA0IDEgMjUgKi8KKzg5OCwJLyogT0JKX2Flc18xOTJfZ2NtICAgICAgICAgICAgICAgICAgMiAxNiA4NDAgMSAxMDEgMyA0IDEgMjYgKi8KKzg5OSwJLyogT0JKX2Flc18xOTJfY2NtICAgICAgICAgICAgICAgICAgMiAxNiA4NDAgMSAxMDEgMyA0IDEgMjcgKi8KKzkwMCwJLyogT0JKX2lkX2FlczE5Ml93cmFwX3BhZCAgICAgICAgICAgMiAxNiA4NDAgMSAxMDEgMyA0IDEgMjggKi8KKzQyNiwJLyogT0JKX2Flc18yNTZfZWNiICAgICAgICAgICAgICAgICAgMiAxNiA4NDAgMSAxMDEgMyA0IDEgNDEgKi8KKzQyNywJLyogT0JKX2Flc18yNTZfY2JjICAgICAgICAgICAgICAgICAgMiAxNiA4NDAgMSAxMDEgMyA0IDEgNDIgKi8KKzQyOCwJLyogT0JKX2Flc18yNTZfb2ZiMTI4ICAgICAgICAgICAgICAgMiAxNiA4NDAgMSAxMDEgMyA0IDEgNDMgKi8KKzQyOSwJLyogT0JKX2Flc18yNTZfY2ZiMTI4ICAgICAgICAgICAgICAgMiAxNiA4NDAgMSAxMDEgMyA0IDEgNDQgKi8KKzc5MCwJLyogT0JKX2lkX2FlczI1Nl93cmFwICAgICAgICAgICAgICAgMiAxNiA4NDAgMSAxMDEgMyA0IDEgNDUgKi8KKzkwMSwJLyogT0JKX2Flc18yNTZfZ2NtICAgICAgICAgICAgICAgICAgMiAxNiA4NDAgMSAxMDEgMyA0IDEgNDYgKi8KKzkwMiwJLyogT0JKX2Flc18yNTZfY2NtICAgICAgICAgICAgICAgICAgMiAxNiA4NDAgMSAxMDEgMyA0IDEgNDcgKi8KKzkwMywJLyogT0JKX2lkX2FlczI1Nl93cmFwX3BhZCAgICAgICAgICAgMiAxNiA4NDAgMSAxMDEgMyA0IDEgNDggKi8KKzY3MiwJLyogT0JKX3NoYTI1NiAgICAgICAgICAgICAgICAgICAgICAgMiAxNiA4NDAgMSAxMDEgMyA0IDIgMSAqLworNjczLAkvKiBPQkpfc2hhMzg0ICAgICAgICAgICAgICAgICAgICAgICAyIDE2IDg0MCAxIDEwMSAzIDQgMiAyICovCis2NzQsCS8qIE9CSl9zaGE1MTIgICAgICAgICAgICAgICAgICAgICAgIDIgMTYgODQwIDEgMTAxIDMgNCAyIDMgKi8KKzY3NSwJLyogT0JKX3NoYTIyNCAgICAgICAgICAgICAgICAgICAgICAgMiAxNiA4NDAgMSAxMDEgMyA0IDIgNCAqLworODAyLAkvKiBPQkpfZHNhX3dpdGhfU0hBMjI0ICAgICAgICAgICAgICAyIDE2IDg0MCAxIDEwMSAzIDQgMyAxICovCis4MDMsCS8qIE9CSl9kc2Ffd2l0aF9TSEEyNTYgICAgICAgICAgICAgIDIgMTYgODQwIDEgMTAxIDMgNCAzIDIgKi8KKzcxLAkvKiBPQkpfbmV0c2NhcGVfY2VydF90eXBlICAgICAgICAgICAyIDE2IDg0MCAxIDExMzczMCAxIDEgKi8KKzcyLAkvKiBPQkpfbmV0c2NhcGVfYmFzZV91cmwgICAgICAgICAgICAyIDE2IDg0MCAxIDExMzczMCAxIDIgKi8KKzczLAkvKiBPQkpfbmV0c2NhcGVfcmV2b2NhdGlvbl91cmwgICAgICAyIDE2IDg0MCAxIDExMzczMCAxIDMgKi8KKzc0LAkvKiBPQkpfbmV0c2NhcGVfY2FfcmV2b2NhdGlvbl91cmwgICAyIDE2IDg0MCAxIDExMzczMCAxIDQgKi8KKzc1LAkvKiBPQkpfbmV0c2NhcGVfcmVuZXdhbF91cmwgICAgICAgICAyIDE2IDg0MCAxIDExMzczMCAxIDcgKi8KKzc2LAkvKiBPQkpfbmV0c2NhcGVfY2FfcG9saWN5X3VybCAgICAgICAyIDE2IDg0MCAxIDExMzczMCAxIDggKi8KKzc3LAkvKiBPQkpfbmV0c2NhcGVfc3NsX3NlcnZlcl9uYW1lICAgICAyIDE2IDg0MCAxIDExMzczMCAxIDEyICovCis3OCwJLyogT0JKX25ldHNjYXBlX2NvbW1lbnQgICAgICAgICAgICAgMiAxNiA4NDAgMSAxMTM3MzAgMSAxMyAqLworNzksCS8qIE9CSl9uZXRzY2FwZV9jZXJ0X3NlcXVlbmNlICAgICAgIDIgMTYgODQwIDEgMTEzNzMwIDIgNSAqLworMTM5LAkvKiBPQkpfbnNfc2djICAgICAgICAgICAgICAgICAgICAgICAyIDE2IDg0MCAxIDExMzczMCA0IDEgKi8KKzQ1OCwJLyogT0JKX3VzZXJJZCAgICAgICAgICAgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgMSAqLworNDU5LAkvKiBPQkpfdGV4dEVuY29kZWRPUkFkZHJlc3MgICAgICAgICAwIDkgMjM0MiAxOTIwMDMwMCAxMDAgMSAyICovCis0NjAsCS8qIE9CSl9yZmM4MjJNYWlsYm94ICAgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDMgKi8KKzQ2MSwJLyogT0JKX2luZm8gICAgICAgICAgICAgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgNCAqLworNDYyLAkvKiBPQkpfZmF2b3VyaXRlRHJpbmsgICAgICAgICAgICAgICAwIDkgMjM0MiAxOTIwMDMwMCAxMDAgMSA1ICovCis0NjMsCS8qIE9CSl9yb29tTnVtYmVyICAgICAgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDYgKi8KKzQ2NCwJLyogT0JKX3Bob3RvICAgICAgICAgICAgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgNyAqLworNDY1LAkvKiBPQkpfdXNlckNsYXNzICAgICAgICAgICAgICAgICAgICAwIDkgMjM0MiAxOTIwMDMwMCAxMDAgMSA4ICovCis0NjYsCS8qIE9CSl9ob3N0ICAgICAgICAgICAgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDkgKi8KKzQ2NywJLyogT0JKX21hbmFnZXIgICAgICAgICAgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgMTAgKi8KKzQ2OCwJLyogT0JKX2RvY3VtZW50SWRlbnRpZmllciAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgMTEgKi8KKzQ2OSwJLyogT0JKX2RvY3VtZW50VGl0bGUgICAgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgMTIgKi8KKzQ3MCwJLyogT0JKX2RvY3VtZW50VmVyc2lvbiAgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgMTMgKi8KKzQ3MSwJLyogT0JKX2RvY3VtZW50QXV0aG9yICAgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgMTQgKi8KKzQ3MiwJLyogT0JKX2RvY3VtZW50TG9jYXRpb24gICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgMTUgKi8KKzQ3MywJLyogT0JKX2hvbWVUZWxlcGhvbmVOdW1iZXIgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgMjAgKi8KKzQ3NCwJLyogT0JKX3NlY3JldGFyeSAgICAgICAgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgMjEgKi8KKzQ3NSwJLyogT0JKX290aGVyTWFpbGJveCAgICAgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgMjIgKi8KKzQ3NiwJLyogT0JKX2xhc3RNb2RpZmllZFRpbWUgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgMjMgKi8KKzQ3NywJLyogT0JKX2xhc3RNb2RpZmllZEJ5ICAgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgMjQgKi8KKzM5MSwJLyogT0JKX2RvbWFpbkNvbXBvbmVudCAgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgMjUgKi8KKzQ3OCwJLyogT0JKX2FSZWNvcmQgICAgICAgICAgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgMjYgKi8KKzQ3OSwJLyogT0JKX3BpbG90QXR0cmlidXRlVHlwZTI3ICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgMjcgKi8KKzQ4MCwJLyogT0JKX21YUmVjb3JkICAgICAgICAgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgMjggKi8KKzQ4MSwJLyogT0JKX25TUmVjb3JkICAgICAgICAgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgMjkgKi8KKzQ4MiwJLyogT0JKX3NPQVJlY29yZCAgICAgICAgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgMzAgKi8KKzQ4MywJLyogT0JKX2NOQU1FUmVjb3JkICAgICAgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgMzEgKi8KKzQ4NCwJLyogT0JKX2Fzc29jaWF0ZWREb21haW4gICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgMzcgKi8KKzQ4NSwJLyogT0JKX2Fzc29jaWF0ZWROYW1lICAgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgMzggKi8KKzQ4NiwJLyogT0JKX2hvbWVQb3N0YWxBZGRyZXNzICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgMzkgKi8KKzQ4NywJLyogT0JKX3BlcnNvbmFsVGl0bGUgICAgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgNDAgKi8KKzQ4OCwJLyogT0JKX21vYmlsZVRlbGVwaG9uZU51bWJlciAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgNDEgKi8KKzQ4OSwJLyogT0JKX3BhZ2VyVGVsZXBob25lTnVtYmVyICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgNDIgKi8KKzQ5MCwJLyogT0JKX2ZyaWVuZGx5Q291bnRyeU5hbWUgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgNDMgKi8KKzQ5MSwJLyogT0JKX29yZ2FuaXphdGlvbmFsU3RhdHVzICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgNDUgKi8KKzQ5MiwJLyogT0JKX2phbmV0TWFpbGJveCAgICAgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgNDYgKi8KKzQ5MywJLyogT0JKX21haWxQcmVmZXJlbmNlT3B0aW9uICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgNDcgKi8KKzQ5NCwJLyogT0JKX2J1aWxkaW5nTmFtZSAgICAgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgNDggKi8KKzQ5NSwJLyogT0JKX2RTQVF1YWxpdHkgICAgICAgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgNDkgKi8KKzQ5NiwJLyogT0JKX3NpbmdsZUxldmVsUXVhbGl0eSAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgNTAgKi8KKzQ5NywJLyogT0JKX3N1YnRyZWVNaW5pbXVtUXVhbGl0eSAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgNTEgKi8KKzQ5OCwJLyogT0JKX3N1YnRyZWVNYXhpbXVtUXVhbGl0eSAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgNTIgKi8KKzQ5OSwJLyogT0JKX3BlcnNvbmFsU2lnbmF0dXJlICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgNTMgKi8KKzUwMCwJLyogT0JKX2RJVFJlZGlyZWN0ICAgICAgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgNTQgKi8KKzUwMSwJLyogT0JKX2F1ZGlvICAgICAgICAgICAgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgNTUgKi8KKzUwMiwJLyogT0JKX2RvY3VtZW50UHVibGlzaGVyICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgNTYgKi8KKzQ0MiwJLyogT0JKX2lBNVN0cmluZ1N5bnRheCAgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDMgNCAqLworNDQzLAkvKiBPQkpfY2FzZUlnbm9yZUlBNVN0cmluZ1N5bnRheCAgICAwIDkgMjM0MiAxOTIwMDMwMCAxMDAgMyA1ICovCis0NDQsCS8qIE9CSl9waWxvdE9iamVjdCAgICAgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCA0IDMgKi8KKzQ0NSwJLyogT0JKX3BpbG90UGVyc29uICAgICAgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDQgNCAqLworNDQ2LAkvKiBPQkpfYWNjb3VudCAgICAgICAgICAgICAgICAgICAgICAwIDkgMjM0MiAxOTIwMDMwMCAxMDAgNCA1ICovCis0NDcsCS8qIE9CSl9kb2N1bWVudCAgICAgICAgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCA0IDYgKi8KKzQ0OCwJLyogT0JKX3Jvb20gICAgICAgICAgICAgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDQgNyAqLworNDQ5LAkvKiBPQkpfZG9jdW1lbnRTZXJpZXMgICAgICAgICAgICAgICAwIDkgMjM0MiAxOTIwMDMwMCAxMDAgNCA5ICovCiszOTIsCS8qIE9CSl9Eb21haW4gICAgICAgICAgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCA0IDEzICovCis0NTAsCS8qIE9CSl9yRkM4MjJsb2NhbFBhcnQgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCA0IDE0ICovCis0NTEsCS8qIE9CSl9kTlNEb21haW4gICAgICAgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCA0IDE1ICovCis0NTIsCS8qIE9CSl9kb21haW5SZWxhdGVkT2JqZWN0ICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCA0IDE3ICovCis0NTMsCS8qIE9CSl9mcmllbmRseUNvdW50cnkgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCA0IDE4ICovCis0NTQsCS8qIE9CSl9zaW1wbGVTZWN1cml0eU9iamVjdCAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCA0IDE5ICovCis0NTUsCS8qIE9CSl9waWxvdE9yZ2FuaXphdGlvbiAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCA0IDIwICovCis0NTYsCS8qIE9CSl9waWxvdERTQSAgICAgICAgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCA0IDIxICovCis0NTcsCS8qIE9CSl9xdWFsaXR5TGFiZWxsZWREYXRhICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCA0IDIyICovCisxODksCS8qIE9CSl9pZF9zbWltZV9tb2QgICAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAwICovCisxOTAsCS8qIE9CSl9pZF9zbWltZV9jdCAgICAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAxICovCisxOTEsCS8qIE9CSl9pZF9zbWltZV9hYSAgICAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAyICovCisxOTIsCS8qIE9CSl9pZF9zbWltZV9hbGcgICAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAzICovCisxOTMsCS8qIE9CSl9pZF9zbWltZV9jZCAgICAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiA0ICovCisxOTQsCS8qIE9CSl9pZF9zbWltZV9zcHEgICAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiA1ICovCisxOTUsCS8qIE9CSl9pZF9zbWltZV9jdGkgICAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiA2ICovCisxNTgsCS8qIE9CSl94NTA5Q2VydGlmaWNhdGUgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAyMiAxICovCisxNTksCS8qIE9CSl9zZHNpQ2VydGlmaWNhdGUgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAyMiAyICovCisxNjAsCS8qIE9CSl94NTA5Q3JsICAgICAgICAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAyMyAxICovCisxNDQsCS8qIE9CSl9wYmVfV2l0aFNIQTFBbmQxMjhCaXRSQzQgICAgIDEgMiA4NDAgMTEzNTQ5IDEgMTIgMSAxICovCisxNDUsCS8qIE9CSl9wYmVfV2l0aFNIQTFBbmQ0MEJpdFJDNCAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgMTIgMSAyICovCisxNDYsCS8qIE9CSl9wYmVfV2l0aFNIQTFBbmQzX0tleV9UcmlwbGVERVNfQ0JDIDEgMiA4NDAgMTEzNTQ5IDEgMTIgMSAzICovCisxNDcsCS8qIE9CSl9wYmVfV2l0aFNIQTFBbmQyX0tleV9UcmlwbGVERVNfQ0JDIDEgMiA4NDAgMTEzNTQ5IDEgMTIgMSA0ICovCisxNDgsCS8qIE9CSl9wYmVfV2l0aFNIQTFBbmQxMjhCaXRSQzJfQ0JDIDEgMiA4NDAgMTEzNTQ5IDEgMTIgMSA1ICovCisxNDksCS8qIE9CSl9wYmVfV2l0aFNIQTFBbmQ0MEJpdFJDMl9DQkMgIDEgMiA4NDAgMTEzNTQ5IDEgMTIgMSA2ICovCisxNzEsCS8qIE9CSl9tc19leHRfcmVxICAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNCAxIDMxMSAyIDEgMTQgKi8KKzEzNCwJLyogT0JKX21zX2NvZGVfaW5kICAgICAgICAgICAgICAgICAgMSAzIDYgMSA0IDEgMzExIDIgMSAyMSAqLworMTM1LAkvKiBPQkpfbXNfY29kZV9jb20gICAgICAgICAgICAgICAgICAxIDMgNiAxIDQgMSAzMTEgMiAxIDIyICovCisxMzYsCS8qIE9CSl9tc19jdGxfc2lnbiAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNCAxIDMxMSAxMCAzIDEgKi8KKzEzNywJLyogT0JKX21zX3NnYyAgICAgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA0IDEgMzExIDEwIDMgMyAqLworMTM4LAkvKiBPQkpfbXNfZWZzICAgICAgICAgICAgICAgICAgICAgICAxIDMgNiAxIDQgMSAzMTEgMTAgMyA0ICovCis2NDgsCS8qIE9CSl9tc19zbWFydGNhcmRfbG9naW4gICAgICAgICAgIDEgMyA2IDEgNCAxIDMxMSAyMCAyIDIgKi8KKzY0OSwJLyogT0JKX21zX3VwbiAgICAgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA0IDEgMzExIDIwIDIgMyAqLworNzUxLAkvKiBPQkpfY2FtZWxsaWFfMTI4X2NiYyAgICAgICAgICAgICAxIDIgMzkyIDIwMDAxMSA2MSAxIDEgMSAyICovCis3NTIsCS8qIE9CSl9jYW1lbGxpYV8xOTJfY2JjICAgICAgICAgICAgIDEgMiAzOTIgMjAwMDExIDYxIDEgMSAxIDMgKi8KKzc1MywJLyogT0JKX2NhbWVsbGlhXzI1Nl9jYmMgICAgICAgICAgICAgMSAyIDM5MiAyMDAwMTEgNjEgMSAxIDEgNCAqLworOTA3LAkvKiBPQkpfaWRfY2FtZWxsaWExMjhfd3JhcCAgICAgICAgICAxIDIgMzkyIDIwMDAxMSA2MSAxIDEgMyAyICovCis5MDgsCS8qIE9CSl9pZF9jYW1lbGxpYTE5Ml93cmFwICAgICAgICAgIDEgMiAzOTIgMjAwMDExIDYxIDEgMSAzIDMgKi8KKzkwOSwJLyogT0JKX2lkX2NhbWVsbGlhMjU2X3dyYXAgICAgICAgICAgMSAyIDM5MiAyMDAwMTEgNjEgMSAxIDMgNCAqLworMTk2LAkvKiBPQkpfaWRfc21pbWVfbW9kX2NtcyAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDkgMTYgMCAxICovCisxOTcsCS8qIE9CSl9pZF9zbWltZV9tb2RfZXNzICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAwIDIgKi8KKzE5OCwJLyogT0JKX2lkX3NtaW1lX21vZF9vaWQgICAgICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDAgMyAqLworMTk5LAkvKiBPQkpfaWRfc21pbWVfbW9kX21zZ192MyAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDkgMTYgMCA0ICovCisyMDAsCS8qIE9CSl9pZF9zbWltZV9tb2RfZXRzX2VTaWduYXR1cmVfODggMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDAgNSAqLworMjAxLAkvKiBPQkpfaWRfc21pbWVfbW9kX2V0c19lU2lnbmF0dXJlXzk3IDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAwIDYgKi8KKzIwMiwJLyogT0JKX2lkX3NtaW1lX21vZF9ldHNfZVNpZ1BvbGljeV84OCAxIDIgODQwIDExMzU0OSAxIDkgMTYgMCA3ICovCisyMDMsCS8qIE9CSl9pZF9zbWltZV9tb2RfZXRzX2VTaWdQb2xpY3lfOTcgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDAgOCAqLworMjA0LAkvKiBPQkpfaWRfc21pbWVfY3RfcmVjZWlwdCAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDkgMTYgMSAxICovCisyMDUsCS8qIE9CSl9pZF9zbWltZV9jdF9hdXRoRGF0YSAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAxIDIgKi8KKzIwNiwJLyogT0JKX2lkX3NtaW1lX2N0X3B1Ymxpc2hDZXJ0ICAgICAgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDEgMyAqLworMjA3LAkvKiBPQkpfaWRfc21pbWVfY3RfVFNUSW5mbyAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDkgMTYgMSA0ICovCisyMDgsCS8qIE9CSl9pZF9zbWltZV9jdF9URFRJbmZvICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAxIDUgKi8KKzIwOSwJLyogT0JKX2lkX3NtaW1lX2N0X2NvbnRlbnRJbmZvICAgICAgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDEgNiAqLworMjEwLAkvKiBPQkpfaWRfc21pbWVfY3RfRFZDU1JlcXVlc3REYXRhICAxIDIgODQwIDExMzU0OSAxIDkgMTYgMSA3ICovCisyMTEsCS8qIE9CSl9pZF9zbWltZV9jdF9EVkNTUmVzcG9uc2VEYXRhIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAxIDggKi8KKzc4NiwJLyogT0JKX2lkX3NtaW1lX2N0X2NvbXByZXNzZWREYXRhICAgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDEgOSAqLworNzg3LAkvKiBPQkpfaWRfY3RfYXNjaWlUZXh0V2l0aENSTEYgICAgICAxIDIgODQwIDExMzU0OSAxIDkgMTYgMSAyNyAqLworMjEyLAkvKiBPQkpfaWRfc21pbWVfYWFfcmVjZWlwdFJlcXVlc3QgICAxIDIgODQwIDExMzU0OSAxIDkgMTYgMiAxICovCisyMTMsCS8qIE9CSl9pZF9zbWltZV9hYV9zZWN1cml0eUxhYmVsICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAyIDIgKi8KKzIxNCwJLyogT0JKX2lkX3NtaW1lX2FhX21sRXhwYW5kSGlzdG9yeSAgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDIgMyAqLworMjE1LAkvKiBPQkpfaWRfc21pbWVfYWFfY29udGVudEhpbnQgICAgICAxIDIgODQwIDExMzU0OSAxIDkgMTYgMiA0ICovCisyMTYsCS8qIE9CSl9pZF9zbWltZV9hYV9tc2dTaWdEaWdlc3QgICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAyIDUgKi8KKzIxNywJLyogT0JKX2lkX3NtaW1lX2FhX2VuY2FwQ29udGVudFR5cGUgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDIgNiAqLworMjE4LAkvKiBPQkpfaWRfc21pbWVfYWFfY29udGVudElkZW50aWZpZXIgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDIgNyAqLworMjE5LAkvKiBPQkpfaWRfc21pbWVfYWFfbWFjVmFsdWUgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDkgMTYgMiA4ICovCisyMjAsCS8qIE9CSl9pZF9zbWltZV9hYV9lcXVpdmFsZW50TGFiZWxzIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAyIDkgKi8KKzIyMSwJLyogT0JKX2lkX3NtaW1lX2FhX2NvbnRlbnRSZWZlcmVuY2UgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDIgMTAgKi8KKzIyMiwJLyogT0JKX2lkX3NtaW1lX2FhX2VuY3J5cEtleVByZWYgICAgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDIgMTEgKi8KKzIyMywJLyogT0JKX2lkX3NtaW1lX2FhX3NpZ25pbmdDZXJ0aWZpY2F0ZSAxIDIgODQwIDExMzU0OSAxIDkgMTYgMiAxMiAqLworMjI0LAkvKiBPQkpfaWRfc21pbWVfYWFfc21pbWVFbmNyeXB0Q2VydHMgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDIgMTMgKi8KKzIyNSwJLyogT0JKX2lkX3NtaW1lX2FhX3RpbWVTdGFtcFRva2VuICAgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDIgMTQgKi8KKzIyNiwJLyogT0JKX2lkX3NtaW1lX2FhX2V0c19zaWdQb2xpY3lJZCAgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDIgMTUgKi8KKzIyNywJLyogT0JKX2lkX3NtaW1lX2FhX2V0c19jb21taXRtZW50VHlwZSAxIDIgODQwIDExMzU0OSAxIDkgMTYgMiAxNiAqLworMjI4LAkvKiBPQkpfaWRfc21pbWVfYWFfZXRzX3NpZ25lckxvY2F0aW9uIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAyIDE3ICovCisyMjksCS8qIE9CSl9pZF9zbWltZV9hYV9ldHNfc2lnbmVyQXR0ciAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAyIDE4ICovCisyMzAsCS8qIE9CSl9pZF9zbWltZV9hYV9ldHNfb3RoZXJTaWdDZXJ0IDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAyIDE5ICovCisyMzEsCS8qIE9CSl9pZF9zbWltZV9hYV9ldHNfY29udGVudFRpbWVzdGFtcCAxIDIgODQwIDExMzU0OSAxIDkgMTYgMiAyMCAqLworMjMyLAkvKiBPQkpfaWRfc21pbWVfYWFfZXRzX0NlcnRpZmljYXRlUmVmcyAxIDIgODQwIDExMzU0OSAxIDkgMTYgMiAyMSAqLworMjMzLAkvKiBPQkpfaWRfc21pbWVfYWFfZXRzX1Jldm9jYXRpb25SZWZzIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAyIDIyICovCisyMzQsCS8qIE9CSl9pZF9zbWltZV9hYV9ldHNfY2VydFZhbHVlcyAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAyIDIzICovCisyMzUsCS8qIE9CSl9pZF9zbWltZV9hYV9ldHNfcmV2b2NhdGlvblZhbHVlcyAxIDIgODQwIDExMzU0OSAxIDkgMTYgMiAyNCAqLworMjM2LAkvKiBPQkpfaWRfc21pbWVfYWFfZXRzX2VzY1RpbWVTdGFtcCAxIDIgODQwIDExMzU0OSAxIDkgMTYgMiAyNSAqLworMjM3LAkvKiBPQkpfaWRfc21pbWVfYWFfZXRzX2NlcnRDUkxUaW1lc3RhbXAgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDIgMjYgKi8KKzIzOCwJLyogT0JKX2lkX3NtaW1lX2FhX2V0c19hcmNoaXZlVGltZVN0YW1wIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAyIDI3ICovCisyMzksCS8qIE9CSl9pZF9zbWltZV9hYV9zaWduYXR1cmVUeXBlICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAyIDI4ICovCisyNDAsCS8qIE9CSl9pZF9zbWltZV9hYV9kdmNzX2R2YyAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAyIDI5ICovCisyNDEsCS8qIE9CSl9pZF9zbWltZV9hbGdfRVNESHdpdGgzREVTICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAzIDEgKi8KKzI0MiwJLyogT0JKX2lkX3NtaW1lX2FsZ19FU0RId2l0aFJDMiAgICAgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDMgMiAqLworMjQzLAkvKiBPQkpfaWRfc21pbWVfYWxnXzNERVN3cmFwICAgICAgICAxIDIgODQwIDExMzU0OSAxIDkgMTYgMyAzICovCisyNDQsCS8qIE9CSl9pZF9zbWltZV9hbGdfUkMyd3JhcCAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAzIDQgKi8KKzI0NSwJLyogT0JKX2lkX3NtaW1lX2FsZ19FU0RIICAgICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDMgNSAqLworMjQ2LAkvKiBPQkpfaWRfc21pbWVfYWxnX0NNUzNERVN3cmFwICAgICAxIDIgODQwIDExMzU0OSAxIDkgMTYgMyA2ICovCisyNDcsCS8qIE9CSl9pZF9zbWltZV9hbGdfQ01TUkMyd3JhcCAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAzIDcgKi8KKzEyNSwJLyogT0JKX3psaWJfY29tcHJlc3Npb24gICAgICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDMgOCAqLworODkzLAkvKiBPQkpfaWRfYWxnX1BXUklfS0VLICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDkgMTYgMyA5ICovCisyNDgsCS8qIE9CSl9pZF9zbWltZV9jZF9sZGFwICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiA0IDEgKi8KKzI0OSwJLyogT0JKX2lkX3NtaW1lX3NwcV9ldHNfc3F0X3VyaSAgICAgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDUgMSAqLworMjUwLAkvKiBPQkpfaWRfc21pbWVfc3BxX2V0c19zcXRfdW5vdGljZSAxIDIgODQwIDExMzU0OSAxIDkgMTYgNSAyICovCisyNTEsCS8qIE9CSl9pZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZPcmlnaW4gMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDYgMSAqLworMjUyLAkvKiBPQkpfaWRfc21pbWVfY3RpX2V0c19wcm9vZk9mUmVjZWlwdCAxIDIgODQwIDExMzU0OSAxIDkgMTYgNiAyICovCisyNTMsCS8qIE9CSl9pZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZEZWxpdmVyeSAxIDIgODQwIDExMzU0OSAxIDkgMTYgNiAzICovCisyNTQsCS8qIE9CSl9pZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZTZW5kZXIgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDYgNCAqLworMjU1LAkvKiBPQkpfaWRfc21pbWVfY3RpX2V0c19wcm9vZk9mQXBwcm92YWwgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDYgNSAqLworMjU2LAkvKiBPQkpfaWRfc21pbWVfY3RpX2V0c19wcm9vZk9mQ3JlYXRpb24gMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDYgNiAqLworMTUwLAkvKiBPQkpfa2V5QmFnICAgICAgICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDEyIDEwIDEgMSAqLworMTUxLAkvKiBPQkpfcGtjczhTaHJvdWRlZEtleUJhZyAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDEyIDEwIDEgMiAqLworMTUyLAkvKiBPQkpfY2VydEJhZyAgICAgICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDEyIDEwIDEgMyAqLworMTUzLAkvKiBPQkpfY3JsQmFnICAgICAgICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDEyIDEwIDEgNCAqLworMTU0LAkvKiBPQkpfc2VjcmV0QmFnICAgICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDEyIDEwIDEgNSAqLworMTU1LAkvKiBPQkpfc2FmZUNvbnRlbnRzQmFnICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDEyIDEwIDEgNiAqLworMzQsCS8qIE9CSl9pZGVhX2NiYyAgICAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNCAxIDE4OCA3IDEgMSAyICovCit9OworCmRpZmYgLS1naXQgYS9jcnlwdG8vb2JqL29ial9kYXQucGwgYi9jcnlwdG8vb2JqL29ial9kYXQucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI3YmZiMQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9vYmovb2JqX2RhdC5wbApAQCAtMCwwICsxLDMwMyBAQAorIyEvdXNyL2xvY2FsL2Jpbi9wZXJsCisKKyMgZml4ZXMgYnVnIGluIGZsb2F0aW5nIHBvaW50IGVtdWxhdGlvbiBvbiBzcGFyYzY0IHdoZW4KKyMgdGhpcyBzY3JpcHQgcHJvZHVjZXMgb2ZmLWJ5LW9uZSBvdXRwdXQgb24gc3BhcmM2NAordXNlIGludGVnZXI7CisKK3N1YiBvYmpfY21wCisJeworCWxvY2FsKEBhLEBiLCRfLCRyKTsKKworCSRBPSRvYmpfbGVueyRvYmp7JG5pZHskYX19fTsKKwkkQj0kb2JqX2xlbnskb2JqeyRuaWR7JGJ9fX07CisKKwkkcj0oJEEtJEIpOworCXJldHVybigkcikgaWYgJHIgIT0gMDsKKworCSRBPSRvYmpfZGVyeyRvYmp7JG5pZHskYX19fTsKKwkkQj0kb2JqX2Rlcnskb2JqeyRuaWR7JGJ9fX07CisKKwlyZXR1cm4oJEEgY21wICRCKTsKKwl9CisKK3N1YiBleHBhbmRfb2JqCisJeworCWxvY2FsKCp2KT1AXzsKKwlsb2NhbCgkaywkZCk7CisJbG9jYWwoJGkpOworCisJZG8JeworCQkkaT0wOworCQlmb3JlYWNoICRrIChrZXlzICV2KQorCQkJeworCQkJaWYgKCgkdnska30gPX4gcy8oT0JKX1teLF0rKSwvJHZ7JDF9LC8pKQorCQkJCXsgJGkrKzsgfQorCQkJfQorCQl9IHdoaWxlKCRpKTsKKwlmb3JlYWNoICRrIChrZXlzICV2KQorCQl7CisJCUBhPXNwbGl0KC8sLywkdnska30pOworCQkkb2Jqbnska309JCNhKzE7CisJCX0KKwlyZXR1cm4oJW9iam4pOworCX0KKworb3BlbiAoSU4sIiRBUkdWWzBdIikgfHwgZGllICJDYW4ndCBvcGVuIGlucHV0IGZpbGUgJEFSR1ZbMF0iOworb3BlbiAoT1VULCI+JEFSR1ZbMV0iKSB8fCBkaWUgIkNhbid0IG9wZW4gb3V0cHV0IGZpbGUgJEFSR1ZbMV0iOworCit3aGlsZSAoPElOPikKKwl7CisJbmV4dCB1bmxlc3MgL15cI2RlZmluZVxzKyhcUyspXHMrKC4qKSQvOworCSR2PSQxOworCSRkPSQyOworCSRkID1+IHMvXlwiLy87CisJJGQgPX4gcy9cIiQvLzsKKwlpZiAoJHYgPX4gL15TTl8oLiopJC8pCisJCXsKKwkJaWYoZGVmaW5lZCAkc25hbWVzeyRkfSkKKwkJCXsKKwkJCXByaW50ICJXQVJOSU5HOiBEdXBsaWNhdGUgc2hvcnQgbmFtZSBcIiRkXCJcbiI7CisJCQl9CisJCWVsc2UgCisJCQl7ICRzbmFtZXN7JGR9ID0gIlgiOyB9CisJCSRzbnskMX09JGQ7CisJCX0KKwllbHNpZiAoJHYgPX4gL15MTl8oLiopJC8pCisJCXsKKwkJaWYoZGVmaW5lZCAkbG5hbWVzeyRkfSkKKwkJCXsKKwkJCXByaW50ICJXQVJOSU5HOiBEdXBsaWNhdGUgbG9uZyBuYW1lIFwiJGRcIlxuIjsKKwkJCX0KKwkJZWxzZSAKKwkJCXsgJGxuYW1lc3skZH0gPSAiWCI7IH0KKwkJJGxueyQxfT0kZDsKKwkJfQorCWVsc2lmICgkdiA9fiAvXk5JRF8oLiopJC8pCisJCXsgJG5pZHskZH09JDE7IH0KKwllbHNpZiAoJHYgPX4gL15PQkpfKC4qKSQvKQorCQl7CisJCSRvYmp7JDF9PSR2OworCQkkb2JqZHskdn09JGQ7CisJCX0KKwl9CitjbG9zZSBJTjsKKworJW9iPSZleHBhbmRfb2JqKCpvYmpkKTsKKworQGE9c29ydCB7ICRhIDw9PiAkYiB9IGtleXMgJW5pZDsKKyRuPSRhWyQjYV0rMTsKKworQGx2YWx1ZXM9KCk7CiskbHZhbHVlcz0wOworCitmb3IgKCRpPTA7ICRpPCRuOyAkaSsrKQorCXsKKwlpZiAoIWRlZmluZWQoJG5pZHskaX0pKQorCQl7CisJCXB1c2goQG91dCwie05VTEwsTlVMTCxOSURfdW5kZWYsMCxOVUxMLDB9LFxuIik7CisJCX0KKwllbHNlCisJCXsKKwkJJHNuPWRlZmluZWQoJHNueyRuaWR7JGl9fSk/IiRzbnskbmlkeyRpfX0iOiJOVUxMIjsKKwkJJGxuPWRlZmluZWQoJGxueyRuaWR7JGl9fSk/IiRsbnskbmlkeyRpfX0iOiJOVUxMIjsKKworCQlpZiAoJHNuIGVxICJOVUxMIikgeworCQkJJHNuPSRsbjsKKwkJCSRzbnskbmlkeyRpfX0gPSAkbG47CisJCX0KKworCQlpZiAoJGxuIGVxICJOVUxMIikgeworCQkJJGxuPSRzbjsKKwkJCSRsbnskbmlkeyRpfX0gPSAkc247CisJCX0KKwkJCQorCQkkb3V0ID0ieyI7CisJCSRvdXQuPSJcIiRzblwiIjsKKwkJJG91dC49IiwiLiJcIiRsblwiIjsKKwkJJG91dC49IixOSURfJG5pZHskaX0sIjsKKwkJaWYgKGRlZmluZWQoJG9ianskbmlkeyRpfX0pKQorCQkJeworCQkJJHY9JG9iamR7JG9ianskbmlkeyRpfX19OworCQkJJHYgPX4gcy9MLy9nOworCQkJJHYgPX4gcy8sLyAvZzsKKwkJCSRyPSZkZXJfaXQoJHYpOworCQkJJHo9IiI7CisJCQkkbGVuZ3RoPTA7CisJCQlmb3JlYWNoICh1bnBhY2soIkMqIiwkcikpCisJCQkJeworCQkJCSR6Lj1zcHJpbnRmKCIweCUwMlgsIiwkXyk7CisJCQkJJGxlbmd0aCsrOworCQkJCX0KKwkJCSRvYmpfZGVyeyRvYmp7JG5pZHskaX19fT0kejsKKwkJCSRvYmpfbGVueyRvYmp7JG5pZHskaX19fT0kbGVuZ3RoOworCisJCQlwdXNoKEBsdmFsdWVzLHNwcmludGYoIiUtNDVzLyogWyUzZF0gJXMgKi9cbiIsCisJCQkJJHosJGx2YWx1ZXMsJG9ianskbmlkeyRpfX0pKTsKKwkJCSRvdXQuPSIkbGVuZ3RoLCYobHZhbHVlc1skbHZhbHVlc10pLDAiOworCQkJJGx2YWx1ZXMrPSRsZW5ndGg7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCSRvdXQuPSIwLE5VTEwsMCI7CisJCQl9CisJCSRvdXQuPSJ9LFxuIjsKKwkJcHVzaChAb3V0LCRvdXQpOworCQl9CisJfQorCitAYT1ncmVwKGRlZmluZWQoJHNueyRuaWR7JF99fSksMCAuLiAkbik7Citmb3JlYWNoIChzb3J0IHsgJHNueyRuaWR7JGF9fSBjbXAgJHNueyRuaWR7JGJ9fSB9IEBhKQorCXsKKwlwdXNoKEBzbixzcHJpbnRmKCIlMmQsXHQvKiBcIiRzbnskbmlkeyRffX1cIiAqL1xuIiwkXykpOworCX0KKworQGE9Z3JlcChkZWZpbmVkKCRsbnskbmlkeyRffX0pLDAgLi4gJG4pOworZm9yZWFjaCAoc29ydCB7ICRsbnskbmlkeyRhfX0gY21wICRsbnskbmlkeyRifX0gfSBAYSkKKwl7CisJcHVzaChAbG4sc3ByaW50ZigiJTJkLFx0LyogXCIkbG57JG5pZHskX319XCIgKi9cbiIsJF8pKTsKKwl9CisKK0BhPWdyZXAoZGVmaW5lZCgkb2JqeyRuaWR7JF99fSksMCAuLiAkbik7Citmb3JlYWNoIChzb3J0IG9ial9jbXAgQGEpCisJeworCSRtPSRvYmp7JG5pZHskX319OworCSR2PSRvYmpkeyRtfTsKKwkkdiA9fiBzL0wvL2c7CisJJHYgPX4gcy8sLyAvZzsKKwlwdXNoKEBvYixzcHJpbnRmKCIlMmQsXHQvKiAlLTMycyAlcyAqL1xuIiwkXywkbSwkdikpOworCX0KKworcHJpbnQgT1VUIDw8J0VPRic7CisvKiBUSElTIEZJTEUgSVMgR0VORVJBVEVEIEZST00gb2JqZWN0cy5oIGJ5IG9ial9kYXQucGwgdmlhIHRoZQorICogZm9sbG93aW5nIGNvbW1hbmQ6CisgKiBwZXJsIG9ial9kYXQucGwgb2JqX21hYy5oIG9ial9kYXQuaCAqLworCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NyBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCitFT0YKKworcHJpbnRmIE9VVCAiI2RlZmluZSBOVU1fTklEICVkXG4iLCRuOworcHJpbnRmIE9VVCAiI2RlZmluZSBOVU1fU04gJWRcbiIsJCNzbisxOworcHJpbnRmIE9VVCAiI2RlZmluZSBOVU1fTE4gJWRcbiIsJCNsbisxOworcHJpbnRmIE9VVCAiI2RlZmluZSBOVU1fT0JKICVkXG5cbiIsJCNvYisxOworCitwcmludGYgT1VUICJzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBsdmFsdWVzWyVkXT17XG4iLCRsdmFsdWVzKzE7CitwcmludCBPVVQgQGx2YWx1ZXM7CitwcmludCBPVVQgIn07XG5cbiI7CisKK3ByaW50ZiBPVVQgInN0YXRpYyBjb25zdCBBU04xX09CSkVDVCBrT2JqZWN0c1tOVU1fTklEXT17XG4iOworZm9yZWFjaCAoQG91dCkKKwl7CisJaWYgKGxlbmd0aCgkXykgPiA3NSkKKwkJeworCQkkb3V0PSIiOworCQlmb3JlYWNoIChzcGxpdCgvLC8pKQorCQkJeworCQkJJHQ9JG91dC4kXy4iLCI7CisJCQlpZiAobGVuZ3RoKCR0KSA+IDcwKQorCQkJCXsKKwkJCQlwcmludCBPVVQgIiRvdXRcbiI7CisJCQkJJHQ9Ilx0JF8sIjsKKwkJCQl9CisJCQkkb3V0PSR0OworCQkJfQorCQljaG9wICRvdXQ7CisJCXByaW50IE9VVCAiJG91dCI7CisJCX0KKwllbHNlCisJCXsgcHJpbnQgT1VUICRfOyB9CisJfQorcHJpbnQgIE9VVCAifTtcblxuIjsKKworcHJpbnRmIE9VVCAic3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBrTklEc0luU2hvcnROYW1lT3JkZXJbTlVNX1NOXT17XG4iOworcHJpbnQgIE9VVCBAc247CitwcmludCAgT1VUICJ9O1xuXG4iOworCitwcmludGYgT1VUICJzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGtOSURzSW5Mb25nTmFtZU9yZGVyW05VTV9MTl09e1xuIjsKK3ByaW50ICBPVVQgQGxuOworcHJpbnQgIE9VVCAifTtcblxuIjsKKworcHJpbnRmIE9VVCAic3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBrTklEc0luT0lET3JkZXJbTlVNX09CSl09e1xuIjsKK3ByaW50ICBPVVQgQG9iOworcHJpbnQgIE9VVCAifTtcblxuIjsKKworY2xvc2UgT1VUOworCitzdWIgZGVyX2l0CisJeworCWxvY2FsKCR2KT1AXzsKKwlsb2NhbChAYSwkaSwkcmV0LEByKTsKKworCUBhPXNwbGl0KC9ccysvLCR2KTsKKwkkcmV0Lj1wYWNrKCJDKiIsJGFbMF0qNDArJGFbMV0pOworCXNoaWZ0IEBhOworCXNoaWZ0IEBhOworCWZvcmVhY2ggKEBhKQorCQl7CisJCUByPSgpOworCQkkdD0wOworCQl3aGlsZSAoJF8gPj0gMTI4KQorCQkJeworCQkJJHg9JF8lMTI4OworCQkJJF8vPTEyODsKKwkJCXB1c2goQHIsKCgoJHQrKyk/MHg4MDowKXwkeCkpOworCQkJfQorCQlwdXNoKEByLCgoKCR0KyspPzB4ODA6MCl8JF8pKTsKKwkJJHJldC49cGFjaygiQyoiLHJldmVyc2UoQHIpKTsKKwkJfQorCXJldHVybigkcmV0KTsKKwl9CmRpZmYgLS1naXQgYS9jcnlwdG8vb2JqL29ial9lcnJvci5jIGIvY3J5cHRvL29iai9vYmpfZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOThmMTBmCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL29iai9vYmpfZXJyb3IuYwpAQCAtMCwwICsxLDI2IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTQsIEdvb2dsZSBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorCisjaW5jbHVkZSAib2JqLmgiCisKK2NvbnN0IEVSUl9TVFJJTkdfREFUQSBPQkpfZXJyb3Jfc3RyaW5nX2RhdGFbXSA9IHsKKyAge0VSUl9QQUNLKEVSUl9MSUJfT0JKLCBPQkpfRl9PQkpfY3JlYXRlLCAwKSwgIk9CSl9jcmVhdGUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfT0JKLCBPQkpfRl9PQkpfZHVwLCAwKSwgIk9CSl9kdXAifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfT0JKLCBPQkpfRl9PQkpfbmlkMm9iaiwgMCksICJPQkpfbmlkMm9iaiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9PQkosIE9CSl9GX09CSl90eHQyb2JqLCAwKSwgIk9CSl90eHQyb2JqIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX09CSiwgMCwgT0JKX1JfVU5LTk9XTl9OSUQpLCAiVU5LTk9XTl9OSUQifSwKKyAgezAsIE5VTEx9LAorfTsKZGlmZiAtLWdpdCBhL2NyeXB0by9vYmovb2JqX21hYy5oIGIvY3J5cHRvL29iai9vYmpfbWFjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhZDU2ZAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9vYmovb2JqX21hYy5oCkBAIC0wLDAgKzEsNDE0OCBAQAorLyogY3J5cHRvL29iamVjdHMvb2JqX21hYy5oICovCisKKy8qIFRISVMgRklMRSBJUyBHRU5FUkFURUQgRlJPTSBvYmplY3RzLnR4dCBieSBvYmplY3RzLnBsIHZpYSB0aGUKKyAqIGZvbGxvd2luZyBjb21tYW5kOgorICogcGVybCBvYmplY3RzLnBsIG9iamVjdHMudHh0IG9ial9tYWMubnVtIG9ial9tYWMuaAorICovCisKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk3IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2RlZmluZSBTTl91bmRlZgkJCSJVTkRFRiIKKyNkZWZpbmUgTE5fdW5kZWYJCQkidW5kZWZpbmVkIgorI2RlZmluZSBOSURfdW5kZWYJCQkwCisjZGVmaW5lIE9CSl91bmRlZgkJCTBMCisKKyNkZWZpbmUgU05faXR1X3QJCSJJVFUtVCIKKyNkZWZpbmUgTE5faXR1X3QJCSJpdHUtdCIKKyNkZWZpbmUgTklEX2l0dV90CQk2NDUKKyNkZWZpbmUgT0JKX2l0dV90CQkwTAorCisjZGVmaW5lIE5JRF9jY2l0dAkJNDA0CisjZGVmaW5lIE9CSl9jY2l0dAkJT0JKX2l0dV90CisKKyNkZWZpbmUgU05faXNvCQkiSVNPIgorI2RlZmluZSBMTl9pc28JCSJpc28iCisjZGVmaW5lIE5JRF9pc28JCTE4MQorI2RlZmluZSBPQkpfaXNvCQkxTAorCisjZGVmaW5lIFNOX2pvaW50X2lzb19pdHVfdAkJIkpPSU5ULUlTTy1JVFUtVCIKKyNkZWZpbmUgTE5fam9pbnRfaXNvX2l0dV90CQkiam9pbnQtaXNvLWl0dS10IgorI2RlZmluZSBOSURfam9pbnRfaXNvX2l0dV90CQk2NDYKKyNkZWZpbmUgT0JKX2pvaW50X2lzb19pdHVfdAkJMkwKKworI2RlZmluZSBOSURfam9pbnRfaXNvX2NjaXR0CQkzOTMKKyNkZWZpbmUgT0JKX2pvaW50X2lzb19jY2l0dAkJT0JKX2pvaW50X2lzb19pdHVfdAorCisjZGVmaW5lIFNOX21lbWJlcl9ib2R5CQkibWVtYmVyLWJvZHkiCisjZGVmaW5lIExOX21lbWJlcl9ib2R5CQkiSVNPIE1lbWJlciBCb2R5IgorI2RlZmluZSBOSURfbWVtYmVyX2JvZHkJCTE4MgorI2RlZmluZSBPQkpfbWVtYmVyX2JvZHkJCU9CSl9pc28sMkwKKworI2RlZmluZSBTTl9pZGVudGlmaWVkX29yZ2FuaXphdGlvbgkJImlkZW50aWZpZWQtb3JnYW5pemF0aW9uIgorI2RlZmluZSBOSURfaWRlbnRpZmllZF9vcmdhbml6YXRpb24JCTY3NgorI2RlZmluZSBPQkpfaWRlbnRpZmllZF9vcmdhbml6YXRpb24JCU9CSl9pc28sM0wKKworI2RlZmluZSBTTl9obWFjX21kNQkJIkhNQUMtTUQ1IgorI2RlZmluZSBMTl9obWFjX21kNQkJImhtYWMtbWQ1IgorI2RlZmluZSBOSURfaG1hY19tZDUJCTc4MAorI2RlZmluZSBPQkpfaG1hY19tZDUJCU9CSl9pZGVudGlmaWVkX29yZ2FuaXphdGlvbiw2TCwxTCw1TCw1TCw4TCwxTCwxTAorCisjZGVmaW5lIFNOX2htYWNfc2hhMQkJIkhNQUMtU0hBMSIKKyNkZWZpbmUgTE5faG1hY19zaGExCQkiaG1hYy1zaGExIgorI2RlZmluZSBOSURfaG1hY19zaGExCQk3ODEKKyNkZWZpbmUgT0JKX2htYWNfc2hhMQkJT0JKX2lkZW50aWZpZWRfb3JnYW5pemF0aW9uLDZMLDFMLDVMLDVMLDhMLDFMLDJMCisKKyNkZWZpbmUgU05fY2VydGljb21fYXJjCQkiY2VydGljb20tYXJjIgorI2RlZmluZSBOSURfY2VydGljb21fYXJjCQk2NzcKKyNkZWZpbmUgT0JKX2NlcnRpY29tX2FyYwkJT0JKX2lkZW50aWZpZWRfb3JnYW5pemF0aW9uLDEzMkwKKworI2RlZmluZSBTTl9pbnRlcm5hdGlvbmFsX29yZ2FuaXphdGlvbnMJCSJpbnRlcm5hdGlvbmFsLW9yZ2FuaXphdGlvbnMiCisjZGVmaW5lIExOX2ludGVybmF0aW9uYWxfb3JnYW5pemF0aW9ucwkJIkludGVybmF0aW9uYWwgT3JnYW5pemF0aW9ucyIKKyNkZWZpbmUgTklEX2ludGVybmF0aW9uYWxfb3JnYW5pemF0aW9ucwkJNjQ3CisjZGVmaW5lIE9CSl9pbnRlcm5hdGlvbmFsX29yZ2FuaXphdGlvbnMJCU9CSl9qb2ludF9pc29faXR1X3QsMjNMCisKKyNkZWZpbmUgU05fd2FwCQkid2FwIgorI2RlZmluZSBOSURfd2FwCQk2NzgKKyNkZWZpbmUgT0JKX3dhcAkJT0JKX2ludGVybmF0aW9uYWxfb3JnYW5pemF0aW9ucyw0M0wKKworI2RlZmluZSBTTl93YXBfd3NnCQkid2FwLXdzZyIKKyNkZWZpbmUgTklEX3dhcF93c2cJCTY3OQorI2RlZmluZSBPQkpfd2FwX3dzZwkJT0JKX3dhcCwxTAorCisjZGVmaW5lIFNOX3NlbGVjdGVkX2F0dHJpYnV0ZV90eXBlcwkJInNlbGVjdGVkLWF0dHJpYnV0ZS10eXBlcyIKKyNkZWZpbmUgTE5fc2VsZWN0ZWRfYXR0cmlidXRlX3R5cGVzCQkiU2VsZWN0ZWQgQXR0cmlidXRlIFR5cGVzIgorI2RlZmluZSBOSURfc2VsZWN0ZWRfYXR0cmlidXRlX3R5cGVzCQkzOTQKKyNkZWZpbmUgT0JKX3NlbGVjdGVkX2F0dHJpYnV0ZV90eXBlcwkJT0JKX2pvaW50X2lzb19pdHVfdCw1TCwxTCw1TAorCisjZGVmaW5lIFNOX2NsZWFyYW5jZQkJImNsZWFyYW5jZSIKKyNkZWZpbmUgTklEX2NsZWFyYW5jZQkJMzk1CisjZGVmaW5lIE9CSl9jbGVhcmFuY2UJCU9CSl9zZWxlY3RlZF9hdHRyaWJ1dGVfdHlwZXMsNTVMCisKKyNkZWZpbmUgU05fSVNPX1VTCQkiSVNPLVVTIgorI2RlZmluZSBMTl9JU09fVVMJCSJJU08gVVMgTWVtYmVyIEJvZHkiCisjZGVmaW5lIE5JRF9JU09fVVMJCTE4MworI2RlZmluZSBPQkpfSVNPX1VTCQlPQkpfbWVtYmVyX2JvZHksODQwTAorCisjZGVmaW5lIFNOX1g5XzU3CQkiWDktNTciCisjZGVmaW5lIExOX1g5XzU3CQkiWDkuNTciCisjZGVmaW5lIE5JRF9YOV81NwkJMTg0CisjZGVmaW5lIE9CSl9YOV81NwkJT0JKX0lTT19VUywxMDA0MEwKKworI2RlZmluZSBTTl9YOWNtCQkiWDljbSIKKyNkZWZpbmUgTE5fWDljbQkJIlg5LjU3IENNID8iCisjZGVmaW5lIE5JRF9YOWNtCQkxODUKKyNkZWZpbmUgT0JKX1g5Y20JCU9CSl9YOV81Nyw0TAorCisjZGVmaW5lIFNOX2RzYQkJIkRTQSIKKyNkZWZpbmUgTE5fZHNhCQkiZHNhRW5jcnlwdGlvbiIKKyNkZWZpbmUgTklEX2RzYQkJMTE2CisjZGVmaW5lIE9CSl9kc2EJCU9CSl9YOWNtLDFMCisKKyNkZWZpbmUgU05fZHNhV2l0aFNIQTEJCSJEU0EtU0hBMSIKKyNkZWZpbmUgTE5fZHNhV2l0aFNIQTEJCSJkc2FXaXRoU0hBMSIKKyNkZWZpbmUgTklEX2RzYVdpdGhTSEExCQkxMTMKKyNkZWZpbmUgT0JKX2RzYVdpdGhTSEExCQlPQkpfWDljbSwzTAorCisjZGVmaW5lIFNOX2Fuc2lfWDlfNjIJCSJhbnNpLVg5LTYyIgorI2RlZmluZSBMTl9hbnNpX1g5XzYyCQkiQU5TSSBYOS42MiIKKyNkZWZpbmUgTklEX2Fuc2lfWDlfNjIJCTQwNQorI2RlZmluZSBPQkpfYW5zaV9YOV82MgkJT0JKX0lTT19VUywxMDA0NUwKKworI2RlZmluZSBPQkpfWDlfNjJfaWRfZmllbGRUeXBlCQlPQkpfYW5zaV9YOV82MiwxTAorCisjZGVmaW5lIFNOX1g5XzYyX3ByaW1lX2ZpZWxkCQkicHJpbWUtZmllbGQiCisjZGVmaW5lIE5JRF9YOV82Ml9wcmltZV9maWVsZAkJNDA2CisjZGVmaW5lIE9CSl9YOV82Ml9wcmltZV9maWVsZAkJT0JKX1g5XzYyX2lkX2ZpZWxkVHlwZSwxTAorCisjZGVmaW5lIFNOX1g5XzYyX2NoYXJhY3RlcmlzdGljX3R3b19maWVsZAkJImNoYXJhY3RlcmlzdGljLXR3by1maWVsZCIKKyNkZWZpbmUgTklEX1g5XzYyX2NoYXJhY3RlcmlzdGljX3R3b19maWVsZAkJNDA3CisjZGVmaW5lIE9CSl9YOV82Ml9jaGFyYWN0ZXJpc3RpY190d29fZmllbGQJCU9CSl9YOV82Ml9pZF9maWVsZFR5cGUsMkwKKworI2RlZmluZSBTTl9YOV82Ml9pZF9jaGFyYWN0ZXJpc3RpY190d29fYmFzaXMJCSJpZC1jaGFyYWN0ZXJpc3RpYy10d28tYmFzaXMiCisjZGVmaW5lIE5JRF9YOV82Ml9pZF9jaGFyYWN0ZXJpc3RpY190d29fYmFzaXMJCTY4MAorI2RlZmluZSBPQkpfWDlfNjJfaWRfY2hhcmFjdGVyaXN0aWNfdHdvX2Jhc2lzCQlPQkpfWDlfNjJfY2hhcmFjdGVyaXN0aWNfdHdvX2ZpZWxkLDNMCisKKyNkZWZpbmUgU05fWDlfNjJfb25CYXNpcwkJIm9uQmFzaXMiCisjZGVmaW5lIE5JRF9YOV82Ml9vbkJhc2lzCQk2ODEKKyNkZWZpbmUgT0JKX1g5XzYyX29uQmFzaXMJCU9CSl9YOV82Ml9pZF9jaGFyYWN0ZXJpc3RpY190d29fYmFzaXMsMUwKKworI2RlZmluZSBTTl9YOV82Ml90cEJhc2lzCQkidHBCYXNpcyIKKyNkZWZpbmUgTklEX1g5XzYyX3RwQmFzaXMJCTY4MgorI2RlZmluZSBPQkpfWDlfNjJfdHBCYXNpcwkJT0JKX1g5XzYyX2lkX2NoYXJhY3RlcmlzdGljX3R3b19iYXNpcywyTAorCisjZGVmaW5lIFNOX1g5XzYyX3BwQmFzaXMJCSJwcEJhc2lzIgorI2RlZmluZSBOSURfWDlfNjJfcHBCYXNpcwkJNjgzCisjZGVmaW5lIE9CSl9YOV82Ml9wcEJhc2lzCQlPQkpfWDlfNjJfaWRfY2hhcmFjdGVyaXN0aWNfdHdvX2Jhc2lzLDNMCisKKyNkZWZpbmUgT0JKX1g5XzYyX2lkX3B1YmxpY0tleVR5cGUJCU9CSl9hbnNpX1g5XzYyLDJMCisKKyNkZWZpbmUgU05fWDlfNjJfaWRfZWNQdWJsaWNLZXkJCSJpZC1lY1B1YmxpY0tleSIKKyNkZWZpbmUgTklEX1g5XzYyX2lkX2VjUHVibGljS2V5CQk0MDgKKyNkZWZpbmUgT0JKX1g5XzYyX2lkX2VjUHVibGljS2V5CQlPQkpfWDlfNjJfaWRfcHVibGljS2V5VHlwZSwxTAorCisjZGVmaW5lIE9CSl9YOV82Ml9lbGxpcHRpY0N1cnZlCQlPQkpfYW5zaV9YOV82MiwzTAorCisjZGVmaW5lIE9CSl9YOV82Ml9jX1R3b0N1cnZlCQlPQkpfWDlfNjJfZWxsaXB0aWNDdXJ2ZSwwTAorCisjZGVmaW5lIFNOX1g5XzYyX2MycG5iMTYzdjEJCSJjMnBuYjE2M3YxIgorI2RlZmluZSBOSURfWDlfNjJfYzJwbmIxNjN2MQkJNjg0CisjZGVmaW5lIE9CSl9YOV82Ml9jMnBuYjE2M3YxCQlPQkpfWDlfNjJfY19Ud29DdXJ2ZSwxTAorCisjZGVmaW5lIFNOX1g5XzYyX2MycG5iMTYzdjIJCSJjMnBuYjE2M3YyIgorI2RlZmluZSBOSURfWDlfNjJfYzJwbmIxNjN2MgkJNjg1CisjZGVmaW5lIE9CSl9YOV82Ml9jMnBuYjE2M3YyCQlPQkpfWDlfNjJfY19Ud29DdXJ2ZSwyTAorCisjZGVmaW5lIFNOX1g5XzYyX2MycG5iMTYzdjMJCSJjMnBuYjE2M3YzIgorI2RlZmluZSBOSURfWDlfNjJfYzJwbmIxNjN2MwkJNjg2CisjZGVmaW5lIE9CSl9YOV82Ml9jMnBuYjE2M3YzCQlPQkpfWDlfNjJfY19Ud29DdXJ2ZSwzTAorCisjZGVmaW5lIFNOX1g5XzYyX2MycG5iMTc2djEJCSJjMnBuYjE3NnYxIgorI2RlZmluZSBOSURfWDlfNjJfYzJwbmIxNzZ2MQkJNjg3CisjZGVmaW5lIE9CSl9YOV82Ml9jMnBuYjE3NnYxCQlPQkpfWDlfNjJfY19Ud29DdXJ2ZSw0TAorCisjZGVmaW5lIFNOX1g5XzYyX2MydG5iMTkxdjEJCSJjMnRuYjE5MXYxIgorI2RlZmluZSBOSURfWDlfNjJfYzJ0bmIxOTF2MQkJNjg4CisjZGVmaW5lIE9CSl9YOV82Ml9jMnRuYjE5MXYxCQlPQkpfWDlfNjJfY19Ud29DdXJ2ZSw1TAorCisjZGVmaW5lIFNOX1g5XzYyX2MydG5iMTkxdjIJCSJjMnRuYjE5MXYyIgorI2RlZmluZSBOSURfWDlfNjJfYzJ0bmIxOTF2MgkJNjg5CisjZGVmaW5lIE9CSl9YOV82Ml9jMnRuYjE5MXYyCQlPQkpfWDlfNjJfY19Ud29DdXJ2ZSw2TAorCisjZGVmaW5lIFNOX1g5XzYyX2MydG5iMTkxdjMJCSJjMnRuYjE5MXYzIgorI2RlZmluZSBOSURfWDlfNjJfYzJ0bmIxOTF2MwkJNjkwCisjZGVmaW5lIE9CSl9YOV82Ml9jMnRuYjE5MXYzCQlPQkpfWDlfNjJfY19Ud29DdXJ2ZSw3TAorCisjZGVmaW5lIFNOX1g5XzYyX2Myb25iMTkxdjQJCSJjMm9uYjE5MXY0IgorI2RlZmluZSBOSURfWDlfNjJfYzJvbmIxOTF2NAkJNjkxCisjZGVmaW5lIE9CSl9YOV82Ml9jMm9uYjE5MXY0CQlPQkpfWDlfNjJfY19Ud29DdXJ2ZSw4TAorCisjZGVmaW5lIFNOX1g5XzYyX2Myb25iMTkxdjUJCSJjMm9uYjE5MXY1IgorI2RlZmluZSBOSURfWDlfNjJfYzJvbmIxOTF2NQkJNjkyCisjZGVmaW5lIE9CSl9YOV82Ml9jMm9uYjE5MXY1CQlPQkpfWDlfNjJfY19Ud29DdXJ2ZSw5TAorCisjZGVmaW5lIFNOX1g5XzYyX2MycG5iMjA4dzEJCSJjMnBuYjIwOHcxIgorI2RlZmluZSBOSURfWDlfNjJfYzJwbmIyMDh3MQkJNjkzCisjZGVmaW5lIE9CSl9YOV82Ml9jMnBuYjIwOHcxCQlPQkpfWDlfNjJfY19Ud29DdXJ2ZSwxMEwKKworI2RlZmluZSBTTl9YOV82Ml9jMnRuYjIzOXYxCQkiYzJ0bmIyMzl2MSIKKyNkZWZpbmUgTklEX1g5XzYyX2MydG5iMjM5djEJCTY5NAorI2RlZmluZSBPQkpfWDlfNjJfYzJ0bmIyMzl2MQkJT0JKX1g5XzYyX2NfVHdvQ3VydmUsMTFMCisKKyNkZWZpbmUgU05fWDlfNjJfYzJ0bmIyMzl2MgkJImMydG5iMjM5djIiCisjZGVmaW5lIE5JRF9YOV82Ml9jMnRuYjIzOXYyCQk2OTUKKyNkZWZpbmUgT0JKX1g5XzYyX2MydG5iMjM5djIJCU9CSl9YOV82Ml9jX1R3b0N1cnZlLDEyTAorCisjZGVmaW5lIFNOX1g5XzYyX2MydG5iMjM5djMJCSJjMnRuYjIzOXYzIgorI2RlZmluZSBOSURfWDlfNjJfYzJ0bmIyMzl2MwkJNjk2CisjZGVmaW5lIE9CSl9YOV82Ml9jMnRuYjIzOXYzCQlPQkpfWDlfNjJfY19Ud29DdXJ2ZSwxM0wKKworI2RlZmluZSBTTl9YOV82Ml9jMm9uYjIzOXY0CQkiYzJvbmIyMzl2NCIKKyNkZWZpbmUgTklEX1g5XzYyX2Myb25iMjM5djQJCTY5NworI2RlZmluZSBPQkpfWDlfNjJfYzJvbmIyMzl2NAkJT0JKX1g5XzYyX2NfVHdvQ3VydmUsMTRMCisKKyNkZWZpbmUgU05fWDlfNjJfYzJvbmIyMzl2NQkJImMyb25iMjM5djUiCisjZGVmaW5lIE5JRF9YOV82Ml9jMm9uYjIzOXY1CQk2OTgKKyNkZWZpbmUgT0JKX1g5XzYyX2Myb25iMjM5djUJCU9CSl9YOV82Ml9jX1R3b0N1cnZlLDE1TAorCisjZGVmaW5lIFNOX1g5XzYyX2MycG5iMjcydzEJCSJjMnBuYjI3MncxIgorI2RlZmluZSBOSURfWDlfNjJfYzJwbmIyNzJ3MQkJNjk5CisjZGVmaW5lIE9CSl9YOV82Ml9jMnBuYjI3MncxCQlPQkpfWDlfNjJfY19Ud29DdXJ2ZSwxNkwKKworI2RlZmluZSBTTl9YOV82Ml9jMnBuYjMwNHcxCQkiYzJwbmIzMDR3MSIKKyNkZWZpbmUgTklEX1g5XzYyX2MycG5iMzA0dzEJCTcwMAorI2RlZmluZSBPQkpfWDlfNjJfYzJwbmIzMDR3MQkJT0JKX1g5XzYyX2NfVHdvQ3VydmUsMTdMCisKKyNkZWZpbmUgU05fWDlfNjJfYzJ0bmIzNTl2MQkJImMydG5iMzU5djEiCisjZGVmaW5lIE5JRF9YOV82Ml9jMnRuYjM1OXYxCQk3MDEKKyNkZWZpbmUgT0JKX1g5XzYyX2MydG5iMzU5djEJCU9CSl9YOV82Ml9jX1R3b0N1cnZlLDE4TAorCisjZGVmaW5lIFNOX1g5XzYyX2MycG5iMzY4dzEJCSJjMnBuYjM2OHcxIgorI2RlZmluZSBOSURfWDlfNjJfYzJwbmIzNjh3MQkJNzAyCisjZGVmaW5lIE9CSl9YOV82Ml9jMnBuYjM2OHcxCQlPQkpfWDlfNjJfY19Ud29DdXJ2ZSwxOUwKKworI2RlZmluZSBTTl9YOV82Ml9jMnRuYjQzMXIxCQkiYzJ0bmI0MzFyMSIKKyNkZWZpbmUgTklEX1g5XzYyX2MydG5iNDMxcjEJCTcwMworI2RlZmluZSBPQkpfWDlfNjJfYzJ0bmI0MzFyMQkJT0JKX1g5XzYyX2NfVHdvQ3VydmUsMjBMCisKKyNkZWZpbmUgT0JKX1g5XzYyX3ByaW1lQ3VydmUJCU9CSl9YOV82Ml9lbGxpcHRpY0N1cnZlLDFMCisKKyNkZWZpbmUgU05fWDlfNjJfcHJpbWUxOTJ2MQkJInByaW1lMTkydjEiCisjZGVmaW5lIE5JRF9YOV82Ml9wcmltZTE5MnYxCQk0MDkKKyNkZWZpbmUgT0JKX1g5XzYyX3ByaW1lMTkydjEJCU9CSl9YOV82Ml9wcmltZUN1cnZlLDFMCisKKyNkZWZpbmUgU05fWDlfNjJfcHJpbWUxOTJ2MgkJInByaW1lMTkydjIiCisjZGVmaW5lIE5JRF9YOV82Ml9wcmltZTE5MnYyCQk0MTAKKyNkZWZpbmUgT0JKX1g5XzYyX3ByaW1lMTkydjIJCU9CSl9YOV82Ml9wcmltZUN1cnZlLDJMCisKKyNkZWZpbmUgU05fWDlfNjJfcHJpbWUxOTJ2MwkJInByaW1lMTkydjMiCisjZGVmaW5lIE5JRF9YOV82Ml9wcmltZTE5MnYzCQk0MTEKKyNkZWZpbmUgT0JKX1g5XzYyX3ByaW1lMTkydjMJCU9CSl9YOV82Ml9wcmltZUN1cnZlLDNMCisKKyNkZWZpbmUgU05fWDlfNjJfcHJpbWUyMzl2MQkJInByaW1lMjM5djEiCisjZGVmaW5lIE5JRF9YOV82Ml9wcmltZTIzOXYxCQk0MTIKKyNkZWZpbmUgT0JKX1g5XzYyX3ByaW1lMjM5djEJCU9CSl9YOV82Ml9wcmltZUN1cnZlLDRMCisKKyNkZWZpbmUgU05fWDlfNjJfcHJpbWUyMzl2MgkJInByaW1lMjM5djIiCisjZGVmaW5lIE5JRF9YOV82Ml9wcmltZTIzOXYyCQk0MTMKKyNkZWZpbmUgT0JKX1g5XzYyX3ByaW1lMjM5djIJCU9CSl9YOV82Ml9wcmltZUN1cnZlLDVMCisKKyNkZWZpbmUgU05fWDlfNjJfcHJpbWUyMzl2MwkJInByaW1lMjM5djMiCisjZGVmaW5lIE5JRF9YOV82Ml9wcmltZTIzOXYzCQk0MTQKKyNkZWZpbmUgT0JKX1g5XzYyX3ByaW1lMjM5djMJCU9CSl9YOV82Ml9wcmltZUN1cnZlLDZMCisKKyNkZWZpbmUgU05fWDlfNjJfcHJpbWUyNTZ2MQkJInByaW1lMjU2djEiCisjZGVmaW5lIE5JRF9YOV82Ml9wcmltZTI1NnYxCQk0MTUKKyNkZWZpbmUgT0JKX1g5XzYyX3ByaW1lMjU2djEJCU9CSl9YOV82Ml9wcmltZUN1cnZlLDdMCisKKyNkZWZpbmUgT0JKX1g5XzYyX2lkX2VjU2lnVHlwZQkJT0JKX2Fuc2lfWDlfNjIsNEwKKworI2RlZmluZSBTTl9lY2RzYV93aXRoX1NIQTEJCSJlY2RzYS13aXRoLVNIQTEiCisjZGVmaW5lIE5JRF9lY2RzYV93aXRoX1NIQTEJCTQxNgorI2RlZmluZSBPQkpfZWNkc2Ffd2l0aF9TSEExCQlPQkpfWDlfNjJfaWRfZWNTaWdUeXBlLDFMCisKKyNkZWZpbmUgU05fZWNkc2Ffd2l0aF9SZWNvbW1lbmRlZAkJImVjZHNhLXdpdGgtUmVjb21tZW5kZWQiCisjZGVmaW5lIE5JRF9lY2RzYV93aXRoX1JlY29tbWVuZGVkCQk3OTEKKyNkZWZpbmUgT0JKX2VjZHNhX3dpdGhfUmVjb21tZW5kZWQJCU9CSl9YOV82Ml9pZF9lY1NpZ1R5cGUsMkwKKworI2RlZmluZSBTTl9lY2RzYV93aXRoX1NwZWNpZmllZAkJImVjZHNhLXdpdGgtU3BlY2lmaWVkIgorI2RlZmluZSBOSURfZWNkc2Ffd2l0aF9TcGVjaWZpZWQJCTc5MgorI2RlZmluZSBPQkpfZWNkc2Ffd2l0aF9TcGVjaWZpZWQJCU9CSl9YOV82Ml9pZF9lY1NpZ1R5cGUsM0wKKworI2RlZmluZSBTTl9lY2RzYV93aXRoX1NIQTIyNAkJImVjZHNhLXdpdGgtU0hBMjI0IgorI2RlZmluZSBOSURfZWNkc2Ffd2l0aF9TSEEyMjQJCTc5MworI2RlZmluZSBPQkpfZWNkc2Ffd2l0aF9TSEEyMjQJCU9CSl9lY2RzYV93aXRoX1NwZWNpZmllZCwxTAorCisjZGVmaW5lIFNOX2VjZHNhX3dpdGhfU0hBMjU2CQkiZWNkc2Etd2l0aC1TSEEyNTYiCisjZGVmaW5lIE5JRF9lY2RzYV93aXRoX1NIQTI1NgkJNzk0CisjZGVmaW5lIE9CSl9lY2RzYV93aXRoX1NIQTI1NgkJT0JKX2VjZHNhX3dpdGhfU3BlY2lmaWVkLDJMCisKKyNkZWZpbmUgU05fZWNkc2Ffd2l0aF9TSEEzODQJCSJlY2RzYS13aXRoLVNIQTM4NCIKKyNkZWZpbmUgTklEX2VjZHNhX3dpdGhfU0hBMzg0CQk3OTUKKyNkZWZpbmUgT0JKX2VjZHNhX3dpdGhfU0hBMzg0CQlPQkpfZWNkc2Ffd2l0aF9TcGVjaWZpZWQsM0wKKworI2RlZmluZSBTTl9lY2RzYV93aXRoX1NIQTUxMgkJImVjZHNhLXdpdGgtU0hBNTEyIgorI2RlZmluZSBOSURfZWNkc2Ffd2l0aF9TSEE1MTIJCTc5NgorI2RlZmluZSBPQkpfZWNkc2Ffd2l0aF9TSEE1MTIJCU9CSl9lY2RzYV93aXRoX1NwZWNpZmllZCw0TAorCisjZGVmaW5lIE9CSl9zZWNnX2VsbGlwdGljQ3VydmUJCU9CSl9jZXJ0aWNvbV9hcmMsMEwKKworI2RlZmluZSBTTl9zZWNwMTEycjEJCSJzZWNwMTEycjEiCisjZGVmaW5lIE5JRF9zZWNwMTEycjEJCTcwNAorI2RlZmluZSBPQkpfc2VjcDExMnIxCQlPQkpfc2VjZ19lbGxpcHRpY0N1cnZlLDZMCisKKyNkZWZpbmUgU05fc2VjcDExMnIyCQkic2VjcDExMnIyIgorI2RlZmluZSBOSURfc2VjcDExMnIyCQk3MDUKKyNkZWZpbmUgT0JKX3NlY3AxMTJyMgkJT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZSw3TAorCisjZGVmaW5lIFNOX3NlY3AxMjhyMQkJInNlY3AxMjhyMSIKKyNkZWZpbmUgTklEX3NlY3AxMjhyMQkJNzA2CisjZGVmaW5lIE9CSl9zZWNwMTI4cjEJCU9CSl9zZWNnX2VsbGlwdGljQ3VydmUsMjhMCisKKyNkZWZpbmUgU05fc2VjcDEyOHIyCQkic2VjcDEyOHIyIgorI2RlZmluZSBOSURfc2VjcDEyOHIyCQk3MDcKKyNkZWZpbmUgT0JKX3NlY3AxMjhyMgkJT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZSwyOUwKKworI2RlZmluZSBTTl9zZWNwMTYwazEJCSJzZWNwMTYwazEiCisjZGVmaW5lIE5JRF9zZWNwMTYwazEJCTcwOAorI2RlZmluZSBPQkpfc2VjcDE2MGsxCQlPQkpfc2VjZ19lbGxpcHRpY0N1cnZlLDlMCisKKyNkZWZpbmUgU05fc2VjcDE2MHIxCQkic2VjcDE2MHIxIgorI2RlZmluZSBOSURfc2VjcDE2MHIxCQk3MDkKKyNkZWZpbmUgT0JKX3NlY3AxNjByMQkJT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZSw4TAorCisjZGVmaW5lIFNOX3NlY3AxNjByMgkJInNlY3AxNjByMiIKKyNkZWZpbmUgTklEX3NlY3AxNjByMgkJNzEwCisjZGVmaW5lIE9CSl9zZWNwMTYwcjIJCU9CSl9zZWNnX2VsbGlwdGljQ3VydmUsMzBMCisKKyNkZWZpbmUgU05fc2VjcDE5MmsxCQkic2VjcDE5MmsxIgorI2RlZmluZSBOSURfc2VjcDE5MmsxCQk3MTEKKyNkZWZpbmUgT0JKX3NlY3AxOTJrMQkJT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZSwzMUwKKworI2RlZmluZSBTTl9zZWNwMjI0azEJCSJzZWNwMjI0azEiCisjZGVmaW5lIE5JRF9zZWNwMjI0azEJCTcxMgorI2RlZmluZSBPQkpfc2VjcDIyNGsxCQlPQkpfc2VjZ19lbGxpcHRpY0N1cnZlLDMyTAorCisjZGVmaW5lIFNOX3NlY3AyMjRyMQkJInNlY3AyMjRyMSIKKyNkZWZpbmUgTklEX3NlY3AyMjRyMQkJNzEzCisjZGVmaW5lIE9CSl9zZWNwMjI0cjEJCU9CSl9zZWNnX2VsbGlwdGljQ3VydmUsMzNMCisKKyNkZWZpbmUgU05fc2VjcDI1NmsxCQkic2VjcDI1NmsxIgorI2RlZmluZSBOSURfc2VjcDI1NmsxCQk3MTQKKyNkZWZpbmUgT0JKX3NlY3AyNTZrMQkJT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZSwxMEwKKworI2RlZmluZSBTTl9zZWNwMzg0cjEJCSJzZWNwMzg0cjEiCisjZGVmaW5lIE5JRF9zZWNwMzg0cjEJCTcxNQorI2RlZmluZSBPQkpfc2VjcDM4NHIxCQlPQkpfc2VjZ19lbGxpcHRpY0N1cnZlLDM0TAorCisjZGVmaW5lIFNOX3NlY3A1MjFyMQkJInNlY3A1MjFyMSIKKyNkZWZpbmUgTklEX3NlY3A1MjFyMQkJNzE2CisjZGVmaW5lIE9CSl9zZWNwNTIxcjEJCU9CSl9zZWNnX2VsbGlwdGljQ3VydmUsMzVMCisKKyNkZWZpbmUgU05fc2VjdDExM3IxCQkic2VjdDExM3IxIgorI2RlZmluZSBOSURfc2VjdDExM3IxCQk3MTcKKyNkZWZpbmUgT0JKX3NlY3QxMTNyMQkJT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZSw0TAorCisjZGVmaW5lIFNOX3NlY3QxMTNyMgkJInNlY3QxMTNyMiIKKyNkZWZpbmUgTklEX3NlY3QxMTNyMgkJNzE4CisjZGVmaW5lIE9CSl9zZWN0MTEzcjIJCU9CSl9zZWNnX2VsbGlwdGljQ3VydmUsNUwKKworI2RlZmluZSBTTl9zZWN0MTMxcjEJCSJzZWN0MTMxcjEiCisjZGVmaW5lIE5JRF9zZWN0MTMxcjEJCTcxOQorI2RlZmluZSBPQkpfc2VjdDEzMXIxCQlPQkpfc2VjZ19lbGxpcHRpY0N1cnZlLDIyTAorCisjZGVmaW5lIFNOX3NlY3QxMzFyMgkJInNlY3QxMzFyMiIKKyNkZWZpbmUgTklEX3NlY3QxMzFyMgkJNzIwCisjZGVmaW5lIE9CSl9zZWN0MTMxcjIJCU9CSl9zZWNnX2VsbGlwdGljQ3VydmUsMjNMCisKKyNkZWZpbmUgU05fc2VjdDE2M2sxCQkic2VjdDE2M2sxIgorI2RlZmluZSBOSURfc2VjdDE2M2sxCQk3MjEKKyNkZWZpbmUgT0JKX3NlY3QxNjNrMQkJT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZSwxTAorCisjZGVmaW5lIFNOX3NlY3QxNjNyMQkJInNlY3QxNjNyMSIKKyNkZWZpbmUgTklEX3NlY3QxNjNyMQkJNzIyCisjZGVmaW5lIE9CSl9zZWN0MTYzcjEJCU9CSl9zZWNnX2VsbGlwdGljQ3VydmUsMkwKKworI2RlZmluZSBTTl9zZWN0MTYzcjIJCSJzZWN0MTYzcjIiCisjZGVmaW5lIE5JRF9zZWN0MTYzcjIJCTcyMworI2RlZmluZSBPQkpfc2VjdDE2M3IyCQlPQkpfc2VjZ19lbGxpcHRpY0N1cnZlLDE1TAorCisjZGVmaW5lIFNOX3NlY3QxOTNyMQkJInNlY3QxOTNyMSIKKyNkZWZpbmUgTklEX3NlY3QxOTNyMQkJNzI0CisjZGVmaW5lIE9CSl9zZWN0MTkzcjEJCU9CSl9zZWNnX2VsbGlwdGljQ3VydmUsMjRMCisKKyNkZWZpbmUgU05fc2VjdDE5M3IyCQkic2VjdDE5M3IyIgorI2RlZmluZSBOSURfc2VjdDE5M3IyCQk3MjUKKyNkZWZpbmUgT0JKX3NlY3QxOTNyMgkJT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZSwyNUwKKworI2RlZmluZSBTTl9zZWN0MjMzazEJCSJzZWN0MjMzazEiCisjZGVmaW5lIE5JRF9zZWN0MjMzazEJCTcyNgorI2RlZmluZSBPQkpfc2VjdDIzM2sxCQlPQkpfc2VjZ19lbGxpcHRpY0N1cnZlLDI2TAorCisjZGVmaW5lIFNOX3NlY3QyMzNyMQkJInNlY3QyMzNyMSIKKyNkZWZpbmUgTklEX3NlY3QyMzNyMQkJNzI3CisjZGVmaW5lIE9CSl9zZWN0MjMzcjEJCU9CSl9zZWNnX2VsbGlwdGljQ3VydmUsMjdMCisKKyNkZWZpbmUgU05fc2VjdDIzOWsxCQkic2VjdDIzOWsxIgorI2RlZmluZSBOSURfc2VjdDIzOWsxCQk3MjgKKyNkZWZpbmUgT0JKX3NlY3QyMzlrMQkJT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZSwzTAorCisjZGVmaW5lIFNOX3NlY3QyODNrMQkJInNlY3QyODNrMSIKKyNkZWZpbmUgTklEX3NlY3QyODNrMQkJNzI5CisjZGVmaW5lIE9CSl9zZWN0MjgzazEJCU9CSl9zZWNnX2VsbGlwdGljQ3VydmUsMTZMCisKKyNkZWZpbmUgU05fc2VjdDI4M3IxCQkic2VjdDI4M3IxIgorI2RlZmluZSBOSURfc2VjdDI4M3IxCQk3MzAKKyNkZWZpbmUgT0JKX3NlY3QyODNyMQkJT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZSwxN0wKKworI2RlZmluZSBTTl9zZWN0NDA5azEJCSJzZWN0NDA5azEiCisjZGVmaW5lIE5JRF9zZWN0NDA5azEJCTczMQorI2RlZmluZSBPQkpfc2VjdDQwOWsxCQlPQkpfc2VjZ19lbGxpcHRpY0N1cnZlLDM2TAorCisjZGVmaW5lIFNOX3NlY3Q0MDlyMQkJInNlY3Q0MDlyMSIKKyNkZWZpbmUgTklEX3NlY3Q0MDlyMQkJNzMyCisjZGVmaW5lIE9CSl9zZWN0NDA5cjEJCU9CSl9zZWNnX2VsbGlwdGljQ3VydmUsMzdMCisKKyNkZWZpbmUgU05fc2VjdDU3MWsxCQkic2VjdDU3MWsxIgorI2RlZmluZSBOSURfc2VjdDU3MWsxCQk3MzMKKyNkZWZpbmUgT0JKX3NlY3Q1NzFrMQkJT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZSwzOEwKKworI2RlZmluZSBTTl9zZWN0NTcxcjEJCSJzZWN0NTcxcjEiCisjZGVmaW5lIE5JRF9zZWN0NTcxcjEJCTczNAorI2RlZmluZSBPQkpfc2VjdDU3MXIxCQlPQkpfc2VjZ19lbGxpcHRpY0N1cnZlLDM5TAorCisjZGVmaW5lIE9CSl93YXBfd3NnX2lkbV9lY2lkCQlPQkpfd2FwX3dzZyw0TAorCisjZGVmaW5lIFNOX3dhcF93c2dfaWRtX2VjaWRfd3RsczEJCSJ3YXAtd3NnLWlkbS1lY2lkLXd0bHMxIgorI2RlZmluZSBOSURfd2FwX3dzZ19pZG1fZWNpZF93dGxzMQkJNzM1CisjZGVmaW5lIE9CSl93YXBfd3NnX2lkbV9lY2lkX3d0bHMxCQlPQkpfd2FwX3dzZ19pZG1fZWNpZCwxTAorCisjZGVmaW5lIFNOX3dhcF93c2dfaWRtX2VjaWRfd3RsczMJCSJ3YXAtd3NnLWlkbS1lY2lkLXd0bHMzIgorI2RlZmluZSBOSURfd2FwX3dzZ19pZG1fZWNpZF93dGxzMwkJNzM2CisjZGVmaW5lIE9CSl93YXBfd3NnX2lkbV9lY2lkX3d0bHMzCQlPQkpfd2FwX3dzZ19pZG1fZWNpZCwzTAorCisjZGVmaW5lIFNOX3dhcF93c2dfaWRtX2VjaWRfd3RsczQJCSJ3YXAtd3NnLWlkbS1lY2lkLXd0bHM0IgorI2RlZmluZSBOSURfd2FwX3dzZ19pZG1fZWNpZF93dGxzNAkJNzM3CisjZGVmaW5lIE9CSl93YXBfd3NnX2lkbV9lY2lkX3d0bHM0CQlPQkpfd2FwX3dzZ19pZG1fZWNpZCw0TAorCisjZGVmaW5lIFNOX3dhcF93c2dfaWRtX2VjaWRfd3RsczUJCSJ3YXAtd3NnLWlkbS1lY2lkLXd0bHM1IgorI2RlZmluZSBOSURfd2FwX3dzZ19pZG1fZWNpZF93dGxzNQkJNzM4CisjZGVmaW5lIE9CSl93YXBfd3NnX2lkbV9lY2lkX3d0bHM1CQlPQkpfd2FwX3dzZ19pZG1fZWNpZCw1TAorCisjZGVmaW5lIFNOX3dhcF93c2dfaWRtX2VjaWRfd3RsczYJCSJ3YXAtd3NnLWlkbS1lY2lkLXd0bHM2IgorI2RlZmluZSBOSURfd2FwX3dzZ19pZG1fZWNpZF93dGxzNgkJNzM5CisjZGVmaW5lIE9CSl93YXBfd3NnX2lkbV9lY2lkX3d0bHM2CQlPQkpfd2FwX3dzZ19pZG1fZWNpZCw2TAorCisjZGVmaW5lIFNOX3dhcF93c2dfaWRtX2VjaWRfd3RsczcJCSJ3YXAtd3NnLWlkbS1lY2lkLXd0bHM3IgorI2RlZmluZSBOSURfd2FwX3dzZ19pZG1fZWNpZF93dGxzNwkJNzQwCisjZGVmaW5lIE9CSl93YXBfd3NnX2lkbV9lY2lkX3d0bHM3CQlPQkpfd2FwX3dzZ19pZG1fZWNpZCw3TAorCisjZGVmaW5lIFNOX3dhcF93c2dfaWRtX2VjaWRfd3RsczgJCSJ3YXAtd3NnLWlkbS1lY2lkLXd0bHM4IgorI2RlZmluZSBOSURfd2FwX3dzZ19pZG1fZWNpZF93dGxzOAkJNzQxCisjZGVmaW5lIE9CSl93YXBfd3NnX2lkbV9lY2lkX3d0bHM4CQlPQkpfd2FwX3dzZ19pZG1fZWNpZCw4TAorCisjZGVmaW5lIFNOX3dhcF93c2dfaWRtX2VjaWRfd3RsczkJCSJ3YXAtd3NnLWlkbS1lY2lkLXd0bHM5IgorI2RlZmluZSBOSURfd2FwX3dzZ19pZG1fZWNpZF93dGxzOQkJNzQyCisjZGVmaW5lIE9CSl93YXBfd3NnX2lkbV9lY2lkX3d0bHM5CQlPQkpfd2FwX3dzZ19pZG1fZWNpZCw5TAorCisjZGVmaW5lIFNOX3dhcF93c2dfaWRtX2VjaWRfd3RsczEwCQkid2FwLXdzZy1pZG0tZWNpZC13dGxzMTAiCisjZGVmaW5lIE5JRF93YXBfd3NnX2lkbV9lY2lkX3d0bHMxMAkJNzQzCisjZGVmaW5lIE9CSl93YXBfd3NnX2lkbV9lY2lkX3d0bHMxMAkJT0JKX3dhcF93c2dfaWRtX2VjaWQsMTBMCisKKyNkZWZpbmUgU05fd2FwX3dzZ19pZG1fZWNpZF93dGxzMTEJCSJ3YXAtd3NnLWlkbS1lY2lkLXd0bHMxMSIKKyNkZWZpbmUgTklEX3dhcF93c2dfaWRtX2VjaWRfd3RsczExCQk3NDQKKyNkZWZpbmUgT0JKX3dhcF93c2dfaWRtX2VjaWRfd3RsczExCQlPQkpfd2FwX3dzZ19pZG1fZWNpZCwxMUwKKworI2RlZmluZSBTTl93YXBfd3NnX2lkbV9lY2lkX3d0bHMxMgkJIndhcC13c2ctaWRtLWVjaWQtd3RsczEyIgorI2RlZmluZSBOSURfd2FwX3dzZ19pZG1fZWNpZF93dGxzMTIJCTc0NQorI2RlZmluZSBPQkpfd2FwX3dzZ19pZG1fZWNpZF93dGxzMTIJCU9CSl93YXBfd3NnX2lkbV9lY2lkLDEyTAorCisjZGVmaW5lIFNOX2Nhc3Q1X2NiYwkJIkNBU1Q1LUNCQyIKKyNkZWZpbmUgTE5fY2FzdDVfY2JjCQkiY2FzdDUtY2JjIgorI2RlZmluZSBOSURfY2FzdDVfY2JjCQkxMDgKKyNkZWZpbmUgT0JKX2Nhc3Q1X2NiYwkJT0JKX0lTT19VUywxMTM1MzNMLDdMLDY2TCwxMEwKKworI2RlZmluZSBTTl9jYXN0NV9lY2IJCSJDQVNUNS1FQ0IiCisjZGVmaW5lIExOX2Nhc3Q1X2VjYgkJImNhc3Q1LWVjYiIKKyNkZWZpbmUgTklEX2Nhc3Q1X2VjYgkJMTA5CisKKyNkZWZpbmUgU05fY2FzdDVfY2ZiNjQJCSJDQVNUNS1DRkIiCisjZGVmaW5lIExOX2Nhc3Q1X2NmYjY0CQkiY2FzdDUtY2ZiIgorI2RlZmluZSBOSURfY2FzdDVfY2ZiNjQJCTExMAorCisjZGVmaW5lIFNOX2Nhc3Q1X29mYjY0CQkiQ0FTVDUtT0ZCIgorI2RlZmluZSBMTl9jYXN0NV9vZmI2NAkJImNhc3Q1LW9mYiIKKyNkZWZpbmUgTklEX2Nhc3Q1X29mYjY0CQkxMTEKKworI2RlZmluZSBMTl9wYmVXaXRoTUQ1QW5kQ2FzdDVfQ0JDCQkicGJlV2l0aE1ENUFuZENhc3Q1Q0JDIgorI2RlZmluZSBOSURfcGJlV2l0aE1ENUFuZENhc3Q1X0NCQwkJMTEyCisjZGVmaW5lIE9CSl9wYmVXaXRoTUQ1QW5kQ2FzdDVfQ0JDCQlPQkpfSVNPX1VTLDExMzUzM0wsN0wsNjZMLDEyTAorCisjZGVmaW5lIFNOX2lkX1Bhc3N3b3JkQmFzZWRNQUMJCSJpZC1QYXNzd29yZEJhc2VkTUFDIgorI2RlZmluZSBMTl9pZF9QYXNzd29yZEJhc2VkTUFDCQkicGFzc3dvcmQgYmFzZWQgTUFDIgorI2RlZmluZSBOSURfaWRfUGFzc3dvcmRCYXNlZE1BQwkJNzgyCisjZGVmaW5lIE9CSl9pZF9QYXNzd29yZEJhc2VkTUFDCQlPQkpfSVNPX1VTLDExMzUzM0wsN0wsNjZMLDEzTAorCisjZGVmaW5lIFNOX2lkX0RIQmFzZWRNYWMJCSJpZC1ESEJhc2VkTWFjIgorI2RlZmluZSBMTl9pZF9ESEJhc2VkTWFjCQkiRGlmZmllLUhlbGxtYW4gYmFzZWQgTUFDIgorI2RlZmluZSBOSURfaWRfREhCYXNlZE1hYwkJNzgzCisjZGVmaW5lIE9CSl9pZF9ESEJhc2VkTWFjCQlPQkpfSVNPX1VTLDExMzUzM0wsN0wsNjZMLDMwTAorCisjZGVmaW5lIFNOX3JzYWRzaQkJInJzYWRzaSIKKyNkZWZpbmUgTE5fcnNhZHNpCQkiUlNBIERhdGEgU2VjdXJpdHksIEluYy4iCisjZGVmaW5lIE5JRF9yc2Fkc2kJCTEKKyNkZWZpbmUgT0JKX3JzYWRzaQkJT0JKX0lTT19VUywxMTM1NDlMCisKKyNkZWZpbmUgU05fcGtjcwkJInBrY3MiCisjZGVmaW5lIExOX3BrY3MJCSJSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBQS0NTIgorI2RlZmluZSBOSURfcGtjcwkJMgorI2RlZmluZSBPQkpfcGtjcwkJT0JKX3JzYWRzaSwxTAorCisjZGVmaW5lIFNOX3BrY3MxCQkicGtjczEiCisjZGVmaW5lIE5JRF9wa2NzMQkJMTg2CisjZGVmaW5lIE9CSl9wa2NzMQkJT0JKX3BrY3MsMUwKKworI2RlZmluZSBMTl9yc2FFbmNyeXB0aW9uCQkicnNhRW5jcnlwdGlvbiIKKyNkZWZpbmUgTklEX3JzYUVuY3J5cHRpb24JCTYKKyNkZWZpbmUgT0JKX3JzYUVuY3J5cHRpb24JCU9CSl9wa2NzMSwxTAorCisjZGVmaW5lIFNOX21kMldpdGhSU0FFbmNyeXB0aW9uCQkiUlNBLU1EMiIKKyNkZWZpbmUgTE5fbWQyV2l0aFJTQUVuY3J5cHRpb24JCSJtZDJXaXRoUlNBRW5jcnlwdGlvbiIKKyNkZWZpbmUgTklEX21kMldpdGhSU0FFbmNyeXB0aW9uCQk3CisjZGVmaW5lIE9CSl9tZDJXaXRoUlNBRW5jcnlwdGlvbgkJT0JKX3BrY3MxLDJMCisKKyNkZWZpbmUgU05fbWQ0V2l0aFJTQUVuY3J5cHRpb24JCSJSU0EtTUQ0IgorI2RlZmluZSBMTl9tZDRXaXRoUlNBRW5jcnlwdGlvbgkJIm1kNFdpdGhSU0FFbmNyeXB0aW9uIgorI2RlZmluZSBOSURfbWQ0V2l0aFJTQUVuY3J5cHRpb24JCTM5NgorI2RlZmluZSBPQkpfbWQ0V2l0aFJTQUVuY3J5cHRpb24JCU9CSl9wa2NzMSwzTAorCisjZGVmaW5lIFNOX21kNVdpdGhSU0FFbmNyeXB0aW9uCQkiUlNBLU1ENSIKKyNkZWZpbmUgTE5fbWQ1V2l0aFJTQUVuY3J5cHRpb24JCSJtZDVXaXRoUlNBRW5jcnlwdGlvbiIKKyNkZWZpbmUgTklEX21kNVdpdGhSU0FFbmNyeXB0aW9uCQk4CisjZGVmaW5lIE9CSl9tZDVXaXRoUlNBRW5jcnlwdGlvbgkJT0JKX3BrY3MxLDRMCisKKyNkZWZpbmUgU05fc2hhMVdpdGhSU0FFbmNyeXB0aW9uCQkiUlNBLVNIQTEiCisjZGVmaW5lIExOX3NoYTFXaXRoUlNBRW5jcnlwdGlvbgkJInNoYTFXaXRoUlNBRW5jcnlwdGlvbiIKKyNkZWZpbmUgTklEX3NoYTFXaXRoUlNBRW5jcnlwdGlvbgkJNjUKKyNkZWZpbmUgT0JKX3NoYTFXaXRoUlNBRW5jcnlwdGlvbgkJT0JKX3BrY3MxLDVMCisKKyNkZWZpbmUgU05fcnNhZXNPYWVwCQkiUlNBRVMtT0FFUCIKKyNkZWZpbmUgTE5fcnNhZXNPYWVwCQkicnNhZXNPYWVwIgorI2RlZmluZSBOSURfcnNhZXNPYWVwCQk5MTkKKyNkZWZpbmUgT0JKX3JzYWVzT2FlcAkJT0JKX3BrY3MxLDdMCisKKyNkZWZpbmUgU05fbWdmMQkJIk1HRjEiCisjZGVmaW5lIExOX21nZjEJCSJtZ2YxIgorI2RlZmluZSBOSURfbWdmMQkJOTExCisjZGVmaW5lIE9CSl9tZ2YxCQlPQkpfcGtjczEsOEwKKworI2RlZmluZSBTTl9wU3BlY2lmaWVkCQkiUFNQRUNJRklFRCIKKyNkZWZpbmUgTE5fcFNwZWNpZmllZAkJInBTcGVjaWZpZWQiCisjZGVmaW5lIE5JRF9wU3BlY2lmaWVkCQk5MzUKKyNkZWZpbmUgT0JKX3BTcGVjaWZpZWQJCU9CSl9wa2NzMSw5TAorCisjZGVmaW5lIFNOX3JzYXNzYVBzcwkJIlJTQVNTQS1QU1MiCisjZGVmaW5lIExOX3JzYXNzYVBzcwkJInJzYXNzYVBzcyIKKyNkZWZpbmUgTklEX3JzYXNzYVBzcwkJOTEyCisjZGVmaW5lIE9CSl9yc2Fzc2FQc3MJCU9CSl9wa2NzMSwxMEwKKworI2RlZmluZSBTTl9zaGEyNTZXaXRoUlNBRW5jcnlwdGlvbgkJIlJTQS1TSEEyNTYiCisjZGVmaW5lIExOX3NoYTI1NldpdGhSU0FFbmNyeXB0aW9uCQkic2hhMjU2V2l0aFJTQUVuY3J5cHRpb24iCisjZGVmaW5lIE5JRF9zaGEyNTZXaXRoUlNBRW5jcnlwdGlvbgkJNjY4CisjZGVmaW5lIE9CSl9zaGEyNTZXaXRoUlNBRW5jcnlwdGlvbgkJT0JKX3BrY3MxLDExTAorCisjZGVmaW5lIFNOX3NoYTM4NFdpdGhSU0FFbmNyeXB0aW9uCQkiUlNBLVNIQTM4NCIKKyNkZWZpbmUgTE5fc2hhMzg0V2l0aFJTQUVuY3J5cHRpb24JCSJzaGEzODRXaXRoUlNBRW5jcnlwdGlvbiIKKyNkZWZpbmUgTklEX3NoYTM4NFdpdGhSU0FFbmNyeXB0aW9uCQk2NjkKKyNkZWZpbmUgT0JKX3NoYTM4NFdpdGhSU0FFbmNyeXB0aW9uCQlPQkpfcGtjczEsMTJMCisKKyNkZWZpbmUgU05fc2hhNTEyV2l0aFJTQUVuY3J5cHRpb24JCSJSU0EtU0hBNTEyIgorI2RlZmluZSBMTl9zaGE1MTJXaXRoUlNBRW5jcnlwdGlvbgkJInNoYTUxMldpdGhSU0FFbmNyeXB0aW9uIgorI2RlZmluZSBOSURfc2hhNTEyV2l0aFJTQUVuY3J5cHRpb24JCTY3MAorI2RlZmluZSBPQkpfc2hhNTEyV2l0aFJTQUVuY3J5cHRpb24JCU9CSl9wa2NzMSwxM0wKKworI2RlZmluZSBTTl9zaGEyMjRXaXRoUlNBRW5jcnlwdGlvbgkJIlJTQS1TSEEyMjQiCisjZGVmaW5lIExOX3NoYTIyNFdpdGhSU0FFbmNyeXB0aW9uCQkic2hhMjI0V2l0aFJTQUVuY3J5cHRpb24iCisjZGVmaW5lIE5JRF9zaGEyMjRXaXRoUlNBRW5jcnlwdGlvbgkJNjcxCisjZGVmaW5lIE9CSl9zaGEyMjRXaXRoUlNBRW5jcnlwdGlvbgkJT0JKX3BrY3MxLDE0TAorCisjZGVmaW5lIFNOX3BrY3MzCQkicGtjczMiCisjZGVmaW5lIE5JRF9wa2NzMwkJMjcKKyNkZWZpbmUgT0JKX3BrY3MzCQlPQkpfcGtjcywzTAorCisjZGVmaW5lIExOX2RoS2V5QWdyZWVtZW50CQkiZGhLZXlBZ3JlZW1lbnQiCisjZGVmaW5lIE5JRF9kaEtleUFncmVlbWVudAkJMjgKKyNkZWZpbmUgT0JKX2RoS2V5QWdyZWVtZW50CQlPQkpfcGtjczMsMUwKKworI2RlZmluZSBTTl9wa2NzNQkJInBrY3M1IgorI2RlZmluZSBOSURfcGtjczUJCTE4NworI2RlZmluZSBPQkpfcGtjczUJCU9CSl9wa2NzLDVMCisKKyNkZWZpbmUgU05fcGJlV2l0aE1EMkFuZERFU19DQkMJCSJQQkUtTUQyLURFUyIKKyNkZWZpbmUgTE5fcGJlV2l0aE1EMkFuZERFU19DQkMJCSJwYmVXaXRoTUQyQW5kREVTLUNCQyIKKyNkZWZpbmUgTklEX3BiZVdpdGhNRDJBbmRERVNfQ0JDCQk5CisjZGVmaW5lIE9CSl9wYmVXaXRoTUQyQW5kREVTX0NCQwkJT0JKX3BrY3M1LDFMCisKKyNkZWZpbmUgU05fcGJlV2l0aE1ENUFuZERFU19DQkMJCSJQQkUtTUQ1LURFUyIKKyNkZWZpbmUgTE5fcGJlV2l0aE1ENUFuZERFU19DQkMJCSJwYmVXaXRoTUQ1QW5kREVTLUNCQyIKKyNkZWZpbmUgTklEX3BiZVdpdGhNRDVBbmRERVNfQ0JDCQkxMAorI2RlZmluZSBPQkpfcGJlV2l0aE1ENUFuZERFU19DQkMJCU9CSl9wa2NzNSwzTAorCisjZGVmaW5lIFNOX3BiZVdpdGhNRDJBbmRSQzJfQ0JDCQkiUEJFLU1EMi1SQzItNjQiCisjZGVmaW5lIExOX3BiZVdpdGhNRDJBbmRSQzJfQ0JDCQkicGJlV2l0aE1EMkFuZFJDMi1DQkMiCisjZGVmaW5lIE5JRF9wYmVXaXRoTUQyQW5kUkMyX0NCQwkJMTY4CisjZGVmaW5lIE9CSl9wYmVXaXRoTUQyQW5kUkMyX0NCQwkJT0JKX3BrY3M1LDRMCisKKyNkZWZpbmUgU05fcGJlV2l0aE1ENUFuZFJDMl9DQkMJCSJQQkUtTUQ1LVJDMi02NCIKKyNkZWZpbmUgTE5fcGJlV2l0aE1ENUFuZFJDMl9DQkMJCSJwYmVXaXRoTUQ1QW5kUkMyLUNCQyIKKyNkZWZpbmUgTklEX3BiZVdpdGhNRDVBbmRSQzJfQ0JDCQkxNjkKKyNkZWZpbmUgT0JKX3BiZVdpdGhNRDVBbmRSQzJfQ0JDCQlPQkpfcGtjczUsNkwKKworI2RlZmluZSBTTl9wYmVXaXRoU0hBMUFuZERFU19DQkMJCSJQQkUtU0hBMS1ERVMiCisjZGVmaW5lIExOX3BiZVdpdGhTSEExQW5kREVTX0NCQwkJInBiZVdpdGhTSEExQW5kREVTLUNCQyIKKyNkZWZpbmUgTklEX3BiZVdpdGhTSEExQW5kREVTX0NCQwkJMTcwCisjZGVmaW5lIE9CSl9wYmVXaXRoU0hBMUFuZERFU19DQkMJCU9CSl9wa2NzNSwxMEwKKworI2RlZmluZSBTTl9wYmVXaXRoU0hBMUFuZFJDMl9DQkMJCSJQQkUtU0hBMS1SQzItNjQiCisjZGVmaW5lIExOX3BiZVdpdGhTSEExQW5kUkMyX0NCQwkJInBiZVdpdGhTSEExQW5kUkMyLUNCQyIKKyNkZWZpbmUgTklEX3BiZVdpdGhTSEExQW5kUkMyX0NCQwkJNjgKKyNkZWZpbmUgT0JKX3BiZVdpdGhTSEExQW5kUkMyX0NCQwkJT0JKX3BrY3M1LDExTAorCisjZGVmaW5lIExOX2lkX3Bia2RmMgkJIlBCS0RGMiIKKyNkZWZpbmUgTklEX2lkX3Bia2RmMgkJNjkKKyNkZWZpbmUgT0JKX2lkX3Bia2RmMgkJT0JKX3BrY3M1LDEyTAorCisjZGVmaW5lIExOX3BiZXMyCQkiUEJFUzIiCisjZGVmaW5lIE5JRF9wYmVzMgkJMTYxCisjZGVmaW5lIE9CSl9wYmVzMgkJT0JKX3BrY3M1LDEzTAorCisjZGVmaW5lIExOX3BibWFjMQkJIlBCTUFDMSIKKyNkZWZpbmUgTklEX3BibWFjMQkJMTYyCisjZGVmaW5lIE9CSl9wYm1hYzEJCU9CSl9wa2NzNSwxNEwKKworI2RlZmluZSBTTl9wa2NzNwkJInBrY3M3IgorI2RlZmluZSBOSURfcGtjczcJCTIwCisjZGVmaW5lIE9CSl9wa2NzNwkJT0JKX3BrY3MsN0wKKworI2RlZmluZSBMTl9wa2NzN19kYXRhCQkicGtjczctZGF0YSIKKyNkZWZpbmUgTklEX3BrY3M3X2RhdGEJCTIxCisjZGVmaW5lIE9CSl9wa2NzN19kYXRhCQlPQkpfcGtjczcsMUwKKworI2RlZmluZSBMTl9wa2NzN19zaWduZWQJCSJwa2NzNy1zaWduZWREYXRhIgorI2RlZmluZSBOSURfcGtjczdfc2lnbmVkCQkyMgorI2RlZmluZSBPQkpfcGtjczdfc2lnbmVkCQlPQkpfcGtjczcsMkwKKworI2RlZmluZSBMTl9wa2NzN19lbnZlbG9wZWQJCSJwa2NzNy1lbnZlbG9wZWREYXRhIgorI2RlZmluZSBOSURfcGtjczdfZW52ZWxvcGVkCQkyMworI2RlZmluZSBPQkpfcGtjczdfZW52ZWxvcGVkCQlPQkpfcGtjczcsM0wKKworI2RlZmluZSBMTl9wa2NzN19zaWduZWRBbmRFbnZlbG9wZWQJCSJwa2NzNy1zaWduZWRBbmRFbnZlbG9wZWREYXRhIgorI2RlZmluZSBOSURfcGtjczdfc2lnbmVkQW5kRW52ZWxvcGVkCQkyNAorI2RlZmluZSBPQkpfcGtjczdfc2lnbmVkQW5kRW52ZWxvcGVkCQlPQkpfcGtjczcsNEwKKworI2RlZmluZSBMTl9wa2NzN19kaWdlc3QJCSJwa2NzNy1kaWdlc3REYXRhIgorI2RlZmluZSBOSURfcGtjczdfZGlnZXN0CQkyNQorI2RlZmluZSBPQkpfcGtjczdfZGlnZXN0CQlPQkpfcGtjczcsNUwKKworI2RlZmluZSBMTl9wa2NzN19lbmNyeXB0ZWQJCSJwa2NzNy1lbmNyeXB0ZWREYXRhIgorI2RlZmluZSBOSURfcGtjczdfZW5jcnlwdGVkCQkyNgorI2RlZmluZSBPQkpfcGtjczdfZW5jcnlwdGVkCQlPQkpfcGtjczcsNkwKKworI2RlZmluZSBTTl9wa2NzOQkJInBrY3M5IgorI2RlZmluZSBOSURfcGtjczkJCTQ3CisjZGVmaW5lIE9CSl9wa2NzOQkJT0JKX3BrY3MsOUwKKworI2RlZmluZSBMTl9wa2NzOV9lbWFpbEFkZHJlc3MJCSJlbWFpbEFkZHJlc3MiCisjZGVmaW5lIE5JRF9wa2NzOV9lbWFpbEFkZHJlc3MJCTQ4CisjZGVmaW5lIE9CSl9wa2NzOV9lbWFpbEFkZHJlc3MJCU9CSl9wa2NzOSwxTAorCisjZGVmaW5lIExOX3BrY3M5X3Vuc3RydWN0dXJlZE5hbWUJCSJ1bnN0cnVjdHVyZWROYW1lIgorI2RlZmluZSBOSURfcGtjczlfdW5zdHJ1Y3R1cmVkTmFtZQkJNDkKKyNkZWZpbmUgT0JKX3BrY3M5X3Vuc3RydWN0dXJlZE5hbWUJCU9CSl9wa2NzOSwyTAorCisjZGVmaW5lIExOX3BrY3M5X2NvbnRlbnRUeXBlCQkiY29udGVudFR5cGUiCisjZGVmaW5lIE5JRF9wa2NzOV9jb250ZW50VHlwZQkJNTAKKyNkZWZpbmUgT0JKX3BrY3M5X2NvbnRlbnRUeXBlCQlPQkpfcGtjczksM0wKKworI2RlZmluZSBMTl9wa2NzOV9tZXNzYWdlRGlnZXN0CQkibWVzc2FnZURpZ2VzdCIKKyNkZWZpbmUgTklEX3BrY3M5X21lc3NhZ2VEaWdlc3QJCTUxCisjZGVmaW5lIE9CSl9wa2NzOV9tZXNzYWdlRGlnZXN0CQlPQkpfcGtjczksNEwKKworI2RlZmluZSBMTl9wa2NzOV9zaWduaW5nVGltZQkJInNpZ25pbmdUaW1lIgorI2RlZmluZSBOSURfcGtjczlfc2lnbmluZ1RpbWUJCTUyCisjZGVmaW5lIE9CSl9wa2NzOV9zaWduaW5nVGltZQkJT0JKX3BrY3M5LDVMCisKKyNkZWZpbmUgTE5fcGtjczlfY291bnRlcnNpZ25hdHVyZQkJImNvdW50ZXJzaWduYXR1cmUiCisjZGVmaW5lIE5JRF9wa2NzOV9jb3VudGVyc2lnbmF0dXJlCQk1MworI2RlZmluZSBPQkpfcGtjczlfY291bnRlcnNpZ25hdHVyZQkJT0JKX3BrY3M5LDZMCisKKyNkZWZpbmUgTE5fcGtjczlfY2hhbGxlbmdlUGFzc3dvcmQJCSJjaGFsbGVuZ2VQYXNzd29yZCIKKyNkZWZpbmUgTklEX3BrY3M5X2NoYWxsZW5nZVBhc3N3b3JkCQk1NAorI2RlZmluZSBPQkpfcGtjczlfY2hhbGxlbmdlUGFzc3dvcmQJCU9CSl9wa2NzOSw3TAorCisjZGVmaW5lIExOX3BrY3M5X3Vuc3RydWN0dXJlZEFkZHJlc3MJCSJ1bnN0cnVjdHVyZWRBZGRyZXNzIgorI2RlZmluZSBOSURfcGtjczlfdW5zdHJ1Y3R1cmVkQWRkcmVzcwkJNTUKKyNkZWZpbmUgT0JKX3BrY3M5X3Vuc3RydWN0dXJlZEFkZHJlc3MJCU9CSl9wa2NzOSw4TAorCisjZGVmaW5lIExOX3BrY3M5X2V4dENlcnRBdHRyaWJ1dGVzCQkiZXh0ZW5kZWRDZXJ0aWZpY2F0ZUF0dHJpYnV0ZXMiCisjZGVmaW5lIE5JRF9wa2NzOV9leHRDZXJ0QXR0cmlidXRlcwkJNTYKKyNkZWZpbmUgT0JKX3BrY3M5X2V4dENlcnRBdHRyaWJ1dGVzCQlPQkpfcGtjczksOUwKKworI2RlZmluZSBTTl9leHRfcmVxCQkiZXh0UmVxIgorI2RlZmluZSBMTl9leHRfcmVxCQkiRXh0ZW5zaW9uIFJlcXVlc3QiCisjZGVmaW5lIE5JRF9leHRfcmVxCQkxNzIKKyNkZWZpbmUgT0JKX2V4dF9yZXEJCU9CSl9wa2NzOSwxNEwKKworI2RlZmluZSBTTl9TTUlNRUNhcGFiaWxpdGllcwkJIlNNSU1FLUNBUFMiCisjZGVmaW5lIExOX1NNSU1FQ2FwYWJpbGl0aWVzCQkiUy9NSU1FIENhcGFiaWxpdGllcyIKKyNkZWZpbmUgTklEX1NNSU1FQ2FwYWJpbGl0aWVzCQkxNjcKKyNkZWZpbmUgT0JKX1NNSU1FQ2FwYWJpbGl0aWVzCQlPQkpfcGtjczksMTVMCisKKyNkZWZpbmUgU05fU01JTUUJCSJTTUlNRSIKKyNkZWZpbmUgTE5fU01JTUUJCSJTL01JTUUiCisjZGVmaW5lIE5JRF9TTUlNRQkJMTg4CisjZGVmaW5lIE9CSl9TTUlNRQkJT0JKX3BrY3M5LDE2TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX21vZAkJImlkLXNtaW1lLW1vZCIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX21vZAkJMTg5CisjZGVmaW5lIE9CSl9pZF9zbWltZV9tb2QJCU9CSl9TTUlNRSwwTAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2N0CQkiaWQtc21pbWUtY3QiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9jdAkJMTkwCisjZGVmaW5lIE9CSl9pZF9zbWltZV9jdAkJT0JKX1NNSU1FLDFMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWEJCSJpZC1zbWltZS1hYSIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FhCQkxOTEKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FhCQlPQkpfU01JTUUsMkwKKworI2RlZmluZSBTTl9pZF9zbWltZV9hbGcJCSJpZC1zbWltZS1hbGciCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hbGcJCTE5MgorI2RlZmluZSBPQkpfaWRfc21pbWVfYWxnCQlPQkpfU01JTUUsM0wKKworI2RlZmluZSBTTl9pZF9zbWltZV9jZAkJImlkLXNtaW1lLWNkIgorI2RlZmluZSBOSURfaWRfc21pbWVfY2QJCTE5MworI2RlZmluZSBPQkpfaWRfc21pbWVfY2QJCU9CSl9TTUlNRSw0TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX3NwcQkJImlkLXNtaW1lLXNwcSIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX3NwcQkJMTk0CisjZGVmaW5lIE9CSl9pZF9zbWltZV9zcHEJCU9CSl9TTUlNRSw1TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2N0aQkJImlkLXNtaW1lLWN0aSIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2N0aQkJMTk1CisjZGVmaW5lIE9CSl9pZF9zbWltZV9jdGkJCU9CSl9TTUlNRSw2TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX21vZF9jbXMJCSJpZC1zbWltZS1tb2QtY21zIgorI2RlZmluZSBOSURfaWRfc21pbWVfbW9kX2NtcwkJMTk2CisjZGVmaW5lIE9CSl9pZF9zbWltZV9tb2RfY21zCQlPQkpfaWRfc21pbWVfbW9kLDFMCisKKyNkZWZpbmUgU05faWRfc21pbWVfbW9kX2VzcwkJImlkLXNtaW1lLW1vZC1lc3MiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9tb2RfZXNzCQkxOTcKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX21vZF9lc3MJCU9CSl9pZF9zbWltZV9tb2QsMkwKKworI2RlZmluZSBTTl9pZF9zbWltZV9tb2Rfb2lkCQkiaWQtc21pbWUtbW9kLW9pZCIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX21vZF9vaWQJCTE5OAorI2RlZmluZSBPQkpfaWRfc21pbWVfbW9kX29pZAkJT0JKX2lkX3NtaW1lX21vZCwzTAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX21vZF9tc2dfdjMJCSJpZC1zbWltZS1tb2QtbXNnLXYzIgorI2RlZmluZSBOSURfaWRfc21pbWVfbW9kX21zZ192MwkJMTk5CisjZGVmaW5lIE9CSl9pZF9zbWltZV9tb2RfbXNnX3YzCQlPQkpfaWRfc21pbWVfbW9kLDRMCisKKyNkZWZpbmUgU05faWRfc21pbWVfbW9kX2V0c19lU2lnbmF0dXJlXzg4CQkiaWQtc21pbWUtbW9kLWV0cy1lU2lnbmF0dXJlLTg4IgorI2RlZmluZSBOSURfaWRfc21pbWVfbW9kX2V0c19lU2lnbmF0dXJlXzg4CQkyMDAKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX21vZF9ldHNfZVNpZ25hdHVyZV84OAkJT0JKX2lkX3NtaW1lX21vZCw1TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX21vZF9ldHNfZVNpZ25hdHVyZV85NwkJImlkLXNtaW1lLW1vZC1ldHMtZVNpZ25hdHVyZS05NyIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX21vZF9ldHNfZVNpZ25hdHVyZV85NwkJMjAxCisjZGVmaW5lIE9CSl9pZF9zbWltZV9tb2RfZXRzX2VTaWduYXR1cmVfOTcJCU9CSl9pZF9zbWltZV9tb2QsNkwKKworI2RlZmluZSBTTl9pZF9zbWltZV9tb2RfZXRzX2VTaWdQb2xpY3lfODgJCSJpZC1zbWltZS1tb2QtZXRzLWVTaWdQb2xpY3ktODgiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9tb2RfZXRzX2VTaWdQb2xpY3lfODgJCTIwMgorI2RlZmluZSBPQkpfaWRfc21pbWVfbW9kX2V0c19lU2lnUG9saWN5Xzg4CQlPQkpfaWRfc21pbWVfbW9kLDdMCisKKyNkZWZpbmUgU05faWRfc21pbWVfbW9kX2V0c19lU2lnUG9saWN5Xzk3CQkiaWQtc21pbWUtbW9kLWV0cy1lU2lnUG9saWN5LTk3IgorI2RlZmluZSBOSURfaWRfc21pbWVfbW9kX2V0c19lU2lnUG9saWN5Xzk3CQkyMDMKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX21vZF9ldHNfZVNpZ1BvbGljeV85NwkJT0JKX2lkX3NtaW1lX21vZCw4TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2N0X3JlY2VpcHQJCSJpZC1zbWltZS1jdC1yZWNlaXB0IgorI2RlZmluZSBOSURfaWRfc21pbWVfY3RfcmVjZWlwdAkJMjA0CisjZGVmaW5lIE9CSl9pZF9zbWltZV9jdF9yZWNlaXB0CQlPQkpfaWRfc21pbWVfY3QsMUwKKworI2RlZmluZSBTTl9pZF9zbWltZV9jdF9hdXRoRGF0YQkJImlkLXNtaW1lLWN0LWF1dGhEYXRhIgorI2RlZmluZSBOSURfaWRfc21pbWVfY3RfYXV0aERhdGEJCTIwNQorI2RlZmluZSBPQkpfaWRfc21pbWVfY3RfYXV0aERhdGEJCU9CSl9pZF9zbWltZV9jdCwyTAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2N0X3B1Ymxpc2hDZXJ0CQkiaWQtc21pbWUtY3QtcHVibGlzaENlcnQiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9jdF9wdWJsaXNoQ2VydAkJMjA2CisjZGVmaW5lIE9CSl9pZF9zbWltZV9jdF9wdWJsaXNoQ2VydAkJT0JKX2lkX3NtaW1lX2N0LDNMCisKKyNkZWZpbmUgU05faWRfc21pbWVfY3RfVFNUSW5mbwkJImlkLXNtaW1lLWN0LVRTVEluZm8iCisjZGVmaW5lIE5JRF9pZF9zbWltZV9jdF9UU1RJbmZvCQkyMDcKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2N0X1RTVEluZm8JCU9CSl9pZF9zbWltZV9jdCw0TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2N0X1REVEluZm8JCSJpZC1zbWltZS1jdC1URFRJbmZvIgorI2RlZmluZSBOSURfaWRfc21pbWVfY3RfVERUSW5mbwkJMjA4CisjZGVmaW5lIE9CSl9pZF9zbWltZV9jdF9URFRJbmZvCQlPQkpfaWRfc21pbWVfY3QsNUwKKworI2RlZmluZSBTTl9pZF9zbWltZV9jdF9jb250ZW50SW5mbwkJImlkLXNtaW1lLWN0LWNvbnRlbnRJbmZvIgorI2RlZmluZSBOSURfaWRfc21pbWVfY3RfY29udGVudEluZm8JCTIwOQorI2RlZmluZSBPQkpfaWRfc21pbWVfY3RfY29udGVudEluZm8JCU9CSl9pZF9zbWltZV9jdCw2TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2N0X0RWQ1NSZXF1ZXN0RGF0YQkJImlkLXNtaW1lLWN0LURWQ1NSZXF1ZXN0RGF0YSIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2N0X0RWQ1NSZXF1ZXN0RGF0YQkJMjEwCisjZGVmaW5lIE9CSl9pZF9zbWltZV9jdF9EVkNTUmVxdWVzdERhdGEJCU9CSl9pZF9zbWltZV9jdCw3TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2N0X0RWQ1NSZXNwb25zZURhdGEJCSJpZC1zbWltZS1jdC1EVkNTUmVzcG9uc2VEYXRhIgorI2RlZmluZSBOSURfaWRfc21pbWVfY3RfRFZDU1Jlc3BvbnNlRGF0YQkJMjExCisjZGVmaW5lIE9CSl9pZF9zbWltZV9jdF9EVkNTUmVzcG9uc2VEYXRhCQlPQkpfaWRfc21pbWVfY3QsOEwKKworI2RlZmluZSBTTl9pZF9zbWltZV9jdF9jb21wcmVzc2VkRGF0YQkJImlkLXNtaW1lLWN0LWNvbXByZXNzZWREYXRhIgorI2RlZmluZSBOSURfaWRfc21pbWVfY3RfY29tcHJlc3NlZERhdGEJCTc4NgorI2RlZmluZSBPQkpfaWRfc21pbWVfY3RfY29tcHJlc3NlZERhdGEJCU9CSl9pZF9zbWltZV9jdCw5TAorCisjZGVmaW5lIFNOX2lkX2N0X2FzY2lpVGV4dFdpdGhDUkxGCQkiaWQtY3QtYXNjaWlUZXh0V2l0aENSTEYiCisjZGVmaW5lIE5JRF9pZF9jdF9hc2NpaVRleHRXaXRoQ1JMRgkJNzg3CisjZGVmaW5lIE9CSl9pZF9jdF9hc2NpaVRleHRXaXRoQ1JMRgkJT0JKX2lkX3NtaW1lX2N0LDI3TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FhX3JlY2VpcHRSZXF1ZXN0CQkiaWQtc21pbWUtYWEtcmVjZWlwdFJlcXVlc3QiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hYV9yZWNlaXB0UmVxdWVzdAkJMjEyCisjZGVmaW5lIE9CSl9pZF9zbWltZV9hYV9yZWNlaXB0UmVxdWVzdAkJT0JKX2lkX3NtaW1lX2FhLDFMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWFfc2VjdXJpdHlMYWJlbAkJImlkLXNtaW1lLWFhLXNlY3VyaXR5TGFiZWwiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hYV9zZWN1cml0eUxhYmVsCQkyMTMKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FhX3NlY3VyaXR5TGFiZWwJCU9CSl9pZF9zbWltZV9hYSwyTAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FhX21sRXhwYW5kSGlzdG9yeQkJImlkLXNtaW1lLWFhLW1sRXhwYW5kSGlzdG9yeSIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FhX21sRXhwYW5kSGlzdG9yeQkJMjE0CisjZGVmaW5lIE9CSl9pZF9zbWltZV9hYV9tbEV4cGFuZEhpc3RvcnkJCU9CSl9pZF9zbWltZV9hYSwzTAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FhX2NvbnRlbnRIaW50CQkiaWQtc21pbWUtYWEtY29udGVudEhpbnQiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hYV9jb250ZW50SGludAkJMjE1CisjZGVmaW5lIE9CSl9pZF9zbWltZV9hYV9jb250ZW50SGludAkJT0JKX2lkX3NtaW1lX2FhLDRMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWFfbXNnU2lnRGlnZXN0CQkiaWQtc21pbWUtYWEtbXNnU2lnRGlnZXN0IgorI2RlZmluZSBOSURfaWRfc21pbWVfYWFfbXNnU2lnRGlnZXN0CQkyMTYKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FhX21zZ1NpZ0RpZ2VzdAkJT0JKX2lkX3NtaW1lX2FhLDVMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWFfZW5jYXBDb250ZW50VHlwZQkJImlkLXNtaW1lLWFhLWVuY2FwQ29udGVudFR5cGUiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hYV9lbmNhcENvbnRlbnRUeXBlCQkyMTcKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FhX2VuY2FwQ29udGVudFR5cGUJCU9CSl9pZF9zbWltZV9hYSw2TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FhX2NvbnRlbnRJZGVudGlmaWVyCQkiaWQtc21pbWUtYWEtY29udGVudElkZW50aWZpZXIiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hYV9jb250ZW50SWRlbnRpZmllcgkJMjE4CisjZGVmaW5lIE9CSl9pZF9zbWltZV9hYV9jb250ZW50SWRlbnRpZmllcgkJT0JKX2lkX3NtaW1lX2FhLDdMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWFfbWFjVmFsdWUJCSJpZC1zbWltZS1hYS1tYWNWYWx1ZSIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FhX21hY1ZhbHVlCQkyMTkKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FhX21hY1ZhbHVlCQlPQkpfaWRfc21pbWVfYWEsOEwKKworI2RlZmluZSBTTl9pZF9zbWltZV9hYV9lcXVpdmFsZW50TGFiZWxzCQkiaWQtc21pbWUtYWEtZXF1aXZhbGVudExhYmVscyIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FhX2VxdWl2YWxlbnRMYWJlbHMJCTIyMAorI2RlZmluZSBPQkpfaWRfc21pbWVfYWFfZXF1aXZhbGVudExhYmVscwkJT0JKX2lkX3NtaW1lX2FhLDlMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWFfY29udGVudFJlZmVyZW5jZQkJImlkLXNtaW1lLWFhLWNvbnRlbnRSZWZlcmVuY2UiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hYV9jb250ZW50UmVmZXJlbmNlCQkyMjEKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FhX2NvbnRlbnRSZWZlcmVuY2UJCU9CSl9pZF9zbWltZV9hYSwxMEwKKworI2RlZmluZSBTTl9pZF9zbWltZV9hYV9lbmNyeXBLZXlQcmVmCQkiaWQtc21pbWUtYWEtZW5jcnlwS2V5UHJlZiIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FhX2VuY3J5cEtleVByZWYJCTIyMgorI2RlZmluZSBPQkpfaWRfc21pbWVfYWFfZW5jcnlwS2V5UHJlZgkJT0JKX2lkX3NtaW1lX2FhLDExTAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FhX3NpZ25pbmdDZXJ0aWZpY2F0ZQkJImlkLXNtaW1lLWFhLXNpZ25pbmdDZXJ0aWZpY2F0ZSIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FhX3NpZ25pbmdDZXJ0aWZpY2F0ZQkJMjIzCisjZGVmaW5lIE9CSl9pZF9zbWltZV9hYV9zaWduaW5nQ2VydGlmaWNhdGUJCU9CSl9pZF9zbWltZV9hYSwxMkwKKworI2RlZmluZSBTTl9pZF9zbWltZV9hYV9zbWltZUVuY3J5cHRDZXJ0cwkJImlkLXNtaW1lLWFhLXNtaW1lRW5jcnlwdENlcnRzIgorI2RlZmluZSBOSURfaWRfc21pbWVfYWFfc21pbWVFbmNyeXB0Q2VydHMJCTIyNAorI2RlZmluZSBPQkpfaWRfc21pbWVfYWFfc21pbWVFbmNyeXB0Q2VydHMJCU9CSl9pZF9zbWltZV9hYSwxM0wKKworI2RlZmluZSBTTl9pZF9zbWltZV9hYV90aW1lU3RhbXBUb2tlbgkJImlkLXNtaW1lLWFhLXRpbWVTdGFtcFRva2VuIgorI2RlZmluZSBOSURfaWRfc21pbWVfYWFfdGltZVN0YW1wVG9rZW4JCTIyNQorI2RlZmluZSBPQkpfaWRfc21pbWVfYWFfdGltZVN0YW1wVG9rZW4JCU9CSl9pZF9zbWltZV9hYSwxNEwKKworI2RlZmluZSBTTl9pZF9zbWltZV9hYV9ldHNfc2lnUG9saWN5SWQJCSJpZC1zbWltZS1hYS1ldHMtc2lnUG9saWN5SWQiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hYV9ldHNfc2lnUG9saWN5SWQJCTIyNgorI2RlZmluZSBPQkpfaWRfc21pbWVfYWFfZXRzX3NpZ1BvbGljeUlkCQlPQkpfaWRfc21pbWVfYWEsMTVMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWFfZXRzX2NvbW1pdG1lbnRUeXBlCQkiaWQtc21pbWUtYWEtZXRzLWNvbW1pdG1lbnRUeXBlIgorI2RlZmluZSBOSURfaWRfc21pbWVfYWFfZXRzX2NvbW1pdG1lbnRUeXBlCQkyMjcKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FhX2V0c19jb21taXRtZW50VHlwZQkJT0JKX2lkX3NtaW1lX2FhLDE2TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FhX2V0c19zaWduZXJMb2NhdGlvbgkJImlkLXNtaW1lLWFhLWV0cy1zaWduZXJMb2NhdGlvbiIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FhX2V0c19zaWduZXJMb2NhdGlvbgkJMjI4CisjZGVmaW5lIE9CSl9pZF9zbWltZV9hYV9ldHNfc2lnbmVyTG9jYXRpb24JCU9CSl9pZF9zbWltZV9hYSwxN0wKKworI2RlZmluZSBTTl9pZF9zbWltZV9hYV9ldHNfc2lnbmVyQXR0cgkJImlkLXNtaW1lLWFhLWV0cy1zaWduZXJBdHRyIgorI2RlZmluZSBOSURfaWRfc21pbWVfYWFfZXRzX3NpZ25lckF0dHIJCTIyOQorI2RlZmluZSBPQkpfaWRfc21pbWVfYWFfZXRzX3NpZ25lckF0dHIJCU9CSl9pZF9zbWltZV9hYSwxOEwKKworI2RlZmluZSBTTl9pZF9zbWltZV9hYV9ldHNfb3RoZXJTaWdDZXJ0CQkiaWQtc21pbWUtYWEtZXRzLW90aGVyU2lnQ2VydCIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FhX2V0c19vdGhlclNpZ0NlcnQJCTIzMAorI2RlZmluZSBPQkpfaWRfc21pbWVfYWFfZXRzX290aGVyU2lnQ2VydAkJT0JKX2lkX3NtaW1lX2FhLDE5TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FhX2V0c19jb250ZW50VGltZXN0YW1wCQkiaWQtc21pbWUtYWEtZXRzLWNvbnRlbnRUaW1lc3RhbXAiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hYV9ldHNfY29udGVudFRpbWVzdGFtcAkJMjMxCisjZGVmaW5lIE9CSl9pZF9zbWltZV9hYV9ldHNfY29udGVudFRpbWVzdGFtcAkJT0JKX2lkX3NtaW1lX2FhLDIwTAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FhX2V0c19DZXJ0aWZpY2F0ZVJlZnMJCSJpZC1zbWltZS1hYS1ldHMtQ2VydGlmaWNhdGVSZWZzIgorI2RlZmluZSBOSURfaWRfc21pbWVfYWFfZXRzX0NlcnRpZmljYXRlUmVmcwkJMjMyCisjZGVmaW5lIE9CSl9pZF9zbWltZV9hYV9ldHNfQ2VydGlmaWNhdGVSZWZzCQlPQkpfaWRfc21pbWVfYWEsMjFMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWFfZXRzX1Jldm9jYXRpb25SZWZzCQkiaWQtc21pbWUtYWEtZXRzLVJldm9jYXRpb25SZWZzIgorI2RlZmluZSBOSURfaWRfc21pbWVfYWFfZXRzX1Jldm9jYXRpb25SZWZzCQkyMzMKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FhX2V0c19SZXZvY2F0aW9uUmVmcwkJT0JKX2lkX3NtaW1lX2FhLDIyTAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FhX2V0c19jZXJ0VmFsdWVzCQkiaWQtc21pbWUtYWEtZXRzLWNlcnRWYWx1ZXMiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hYV9ldHNfY2VydFZhbHVlcwkJMjM0CisjZGVmaW5lIE9CSl9pZF9zbWltZV9hYV9ldHNfY2VydFZhbHVlcwkJT0JKX2lkX3NtaW1lX2FhLDIzTAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FhX2V0c19yZXZvY2F0aW9uVmFsdWVzCQkiaWQtc21pbWUtYWEtZXRzLXJldm9jYXRpb25WYWx1ZXMiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hYV9ldHNfcmV2b2NhdGlvblZhbHVlcwkJMjM1CisjZGVmaW5lIE9CSl9pZF9zbWltZV9hYV9ldHNfcmV2b2NhdGlvblZhbHVlcwkJT0JKX2lkX3NtaW1lX2FhLDI0TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FhX2V0c19lc2NUaW1lU3RhbXAJCSJpZC1zbWltZS1hYS1ldHMtZXNjVGltZVN0YW1wIgorI2RlZmluZSBOSURfaWRfc21pbWVfYWFfZXRzX2VzY1RpbWVTdGFtcAkJMjM2CisjZGVmaW5lIE9CSl9pZF9zbWltZV9hYV9ldHNfZXNjVGltZVN0YW1wCQlPQkpfaWRfc21pbWVfYWEsMjVMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWFfZXRzX2NlcnRDUkxUaW1lc3RhbXAJCSJpZC1zbWltZS1hYS1ldHMtY2VydENSTFRpbWVzdGFtcCIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FhX2V0c19jZXJ0Q1JMVGltZXN0YW1wCQkyMzcKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FhX2V0c19jZXJ0Q1JMVGltZXN0YW1wCQlPQkpfaWRfc21pbWVfYWEsMjZMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWFfZXRzX2FyY2hpdmVUaW1lU3RhbXAJCSJpZC1zbWltZS1hYS1ldHMtYXJjaGl2ZVRpbWVTdGFtcCIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FhX2V0c19hcmNoaXZlVGltZVN0YW1wCQkyMzgKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FhX2V0c19hcmNoaXZlVGltZVN0YW1wCQlPQkpfaWRfc21pbWVfYWEsMjdMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWFfc2lnbmF0dXJlVHlwZQkJImlkLXNtaW1lLWFhLXNpZ25hdHVyZVR5cGUiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hYV9zaWduYXR1cmVUeXBlCQkyMzkKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FhX3NpZ25hdHVyZVR5cGUJCU9CSl9pZF9zbWltZV9hYSwyOEwKKworI2RlZmluZSBTTl9pZF9zbWltZV9hYV9kdmNzX2R2YwkJImlkLXNtaW1lLWFhLWR2Y3MtZHZjIgorI2RlZmluZSBOSURfaWRfc21pbWVfYWFfZHZjc19kdmMJCTI0MAorI2RlZmluZSBPQkpfaWRfc21pbWVfYWFfZHZjc19kdmMJCU9CSl9pZF9zbWltZV9hYSwyOUwKKworI2RlZmluZSBTTl9pZF9zbWltZV9hbGdfRVNESHdpdGgzREVTCQkiaWQtc21pbWUtYWxnLUVTREh3aXRoM0RFUyIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FsZ19FU0RId2l0aDNERVMJCTI0MQorI2RlZmluZSBPQkpfaWRfc21pbWVfYWxnX0VTREh3aXRoM0RFUwkJT0JKX2lkX3NtaW1lX2FsZywxTAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FsZ19FU0RId2l0aFJDMgkJImlkLXNtaW1lLWFsZy1FU0RId2l0aFJDMiIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FsZ19FU0RId2l0aFJDMgkJMjQyCisjZGVmaW5lIE9CSl9pZF9zbWltZV9hbGdfRVNESHdpdGhSQzIJCU9CSl9pZF9zbWltZV9hbGcsMkwKKworI2RlZmluZSBTTl9pZF9zbWltZV9hbGdfM0RFU3dyYXAJCSJpZC1zbWltZS1hbGctM0RFU3dyYXAiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hbGdfM0RFU3dyYXAJCTI0MworI2RlZmluZSBPQkpfaWRfc21pbWVfYWxnXzNERVN3cmFwCQlPQkpfaWRfc21pbWVfYWxnLDNMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWxnX1JDMndyYXAJCSJpZC1zbWltZS1hbGctUkMyd3JhcCIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FsZ19SQzJ3cmFwCQkyNDQKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FsZ19SQzJ3cmFwCQlPQkpfaWRfc21pbWVfYWxnLDRMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWxnX0VTREgJCSJpZC1zbWltZS1hbGctRVNESCIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FsZ19FU0RICQkyNDUKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FsZ19FU0RICQlPQkpfaWRfc21pbWVfYWxnLDVMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWxnX0NNUzNERVN3cmFwCQkiaWQtc21pbWUtYWxnLUNNUzNERVN3cmFwIgorI2RlZmluZSBOSURfaWRfc21pbWVfYWxnX0NNUzNERVN3cmFwCQkyNDYKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FsZ19DTVMzREVTd3JhcAkJT0JKX2lkX3NtaW1lX2FsZyw2TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FsZ19DTVNSQzJ3cmFwCQkiaWQtc21pbWUtYWxnLUNNU1JDMndyYXAiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hbGdfQ01TUkMyd3JhcAkJMjQ3CisjZGVmaW5lIE9CSl9pZF9zbWltZV9hbGdfQ01TUkMyd3JhcAkJT0JKX2lkX3NtaW1lX2FsZyw3TAorCisjZGVmaW5lIFNOX2lkX2FsZ19QV1JJX0tFSwkJImlkLWFsZy1QV1JJLUtFSyIKKyNkZWZpbmUgTklEX2lkX2FsZ19QV1JJX0tFSwkJODkzCisjZGVmaW5lIE9CSl9pZF9hbGdfUFdSSV9LRUsJCU9CSl9pZF9zbWltZV9hbGcsOUwKKworI2RlZmluZSBTTl9pZF9zbWltZV9jZF9sZGFwCQkiaWQtc21pbWUtY2QtbGRhcCIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2NkX2xkYXAJCTI0OAorI2RlZmluZSBPQkpfaWRfc21pbWVfY2RfbGRhcAkJT0JKX2lkX3NtaW1lX2NkLDFMCisKKyNkZWZpbmUgU05faWRfc21pbWVfc3BxX2V0c19zcXRfdXJpCQkiaWQtc21pbWUtc3BxLWV0cy1zcXQtdXJpIgorI2RlZmluZSBOSURfaWRfc21pbWVfc3BxX2V0c19zcXRfdXJpCQkyNDkKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX3NwcV9ldHNfc3F0X3VyaQkJT0JKX2lkX3NtaW1lX3NwcSwxTAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX3NwcV9ldHNfc3F0X3Vub3RpY2UJCSJpZC1zbWltZS1zcHEtZXRzLXNxdC11bm90aWNlIgorI2RlZmluZSBOSURfaWRfc21pbWVfc3BxX2V0c19zcXRfdW5vdGljZQkJMjUwCisjZGVmaW5lIE9CSl9pZF9zbWltZV9zcHFfZXRzX3NxdF91bm90aWNlCQlPQkpfaWRfc21pbWVfc3BxLDJMCisKKyNkZWZpbmUgU05faWRfc21pbWVfY3RpX2V0c19wcm9vZk9mT3JpZ2luCQkiaWQtc21pbWUtY3RpLWV0cy1wcm9vZk9mT3JpZ2luIgorI2RlZmluZSBOSURfaWRfc21pbWVfY3RpX2V0c19wcm9vZk9mT3JpZ2luCQkyNTEKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2N0aV9ldHNfcHJvb2ZPZk9yaWdpbgkJT0JKX2lkX3NtaW1lX2N0aSwxTAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2N0aV9ldHNfcHJvb2ZPZlJlY2VpcHQJCSJpZC1zbWltZS1jdGktZXRzLXByb29mT2ZSZWNlaXB0IgorI2RlZmluZSBOSURfaWRfc21pbWVfY3RpX2V0c19wcm9vZk9mUmVjZWlwdAkJMjUyCisjZGVmaW5lIE9CSl9pZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZSZWNlaXB0CQlPQkpfaWRfc21pbWVfY3RpLDJMCisKKyNkZWZpbmUgU05faWRfc21pbWVfY3RpX2V0c19wcm9vZk9mRGVsaXZlcnkJCSJpZC1zbWltZS1jdGktZXRzLXByb29mT2ZEZWxpdmVyeSIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2N0aV9ldHNfcHJvb2ZPZkRlbGl2ZXJ5CQkyNTMKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2N0aV9ldHNfcHJvb2ZPZkRlbGl2ZXJ5CQlPQkpfaWRfc21pbWVfY3RpLDNMCisKKyNkZWZpbmUgU05faWRfc21pbWVfY3RpX2V0c19wcm9vZk9mU2VuZGVyCQkiaWQtc21pbWUtY3RpLWV0cy1wcm9vZk9mU2VuZGVyIgorI2RlZmluZSBOSURfaWRfc21pbWVfY3RpX2V0c19wcm9vZk9mU2VuZGVyCQkyNTQKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2N0aV9ldHNfcHJvb2ZPZlNlbmRlcgkJT0JKX2lkX3NtaW1lX2N0aSw0TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2N0aV9ldHNfcHJvb2ZPZkFwcHJvdmFsCQkiaWQtc21pbWUtY3RpLWV0cy1wcm9vZk9mQXBwcm92YWwiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZBcHByb3ZhbAkJMjU1CisjZGVmaW5lIE9CSl9pZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZBcHByb3ZhbAkJT0JKX2lkX3NtaW1lX2N0aSw1TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2N0aV9ldHNfcHJvb2ZPZkNyZWF0aW9uCQkiaWQtc21pbWUtY3RpLWV0cy1wcm9vZk9mQ3JlYXRpb24iCisjZGVmaW5lIE5JRF9pZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZDcmVhdGlvbgkJMjU2CisjZGVmaW5lIE9CSl9pZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZDcmVhdGlvbgkJT0JKX2lkX3NtaW1lX2N0aSw2TAorCisjZGVmaW5lIExOX2ZyaWVuZGx5TmFtZQkJImZyaWVuZGx5TmFtZSIKKyNkZWZpbmUgTklEX2ZyaWVuZGx5TmFtZQkJMTU2CisjZGVmaW5lIE9CSl9mcmllbmRseU5hbWUJCU9CSl9wa2NzOSwyMEwKKworI2RlZmluZSBMTl9sb2NhbEtleUlECQkibG9jYWxLZXlJRCIKKyNkZWZpbmUgTklEX2xvY2FsS2V5SUQJCTE1NworI2RlZmluZSBPQkpfbG9jYWxLZXlJRAkJT0JKX3BrY3M5LDIxTAorCisjZGVmaW5lIFNOX21zX2NzcF9uYW1lCQkiQ1NQTmFtZSIKKyNkZWZpbmUgTE5fbXNfY3NwX25hbWUJCSJNaWNyb3NvZnQgQ1NQIE5hbWUiCisjZGVmaW5lIE5JRF9tc19jc3BfbmFtZQkJNDE3CisjZGVmaW5lIE9CSl9tc19jc3BfbmFtZQkJMUwsM0wsNkwsMUwsNEwsMUwsMzExTCwxN0wsMUwKKworI2RlZmluZSBTTl9Mb2NhbEtleVNldAkJIkxvY2FsS2V5U2V0IgorI2RlZmluZSBMTl9Mb2NhbEtleVNldAkJIk1pY3Jvc29mdCBMb2NhbCBLZXkgc2V0IgorI2RlZmluZSBOSURfTG9jYWxLZXlTZXQJCTg1NgorI2RlZmluZSBPQkpfTG9jYWxLZXlTZXQJCTFMLDNMLDZMLDFMLDRMLDFMLDMxMUwsMTdMLDJMCisKKyNkZWZpbmUgT0JKX2NlcnRUeXBlcwkJT0JKX3BrY3M5LDIyTAorCisjZGVmaW5lIExOX3g1MDlDZXJ0aWZpY2F0ZQkJIng1MDlDZXJ0aWZpY2F0ZSIKKyNkZWZpbmUgTklEX3g1MDlDZXJ0aWZpY2F0ZQkJMTU4CisjZGVmaW5lIE9CSl94NTA5Q2VydGlmaWNhdGUJCU9CSl9jZXJ0VHlwZXMsMUwKKworI2RlZmluZSBMTl9zZHNpQ2VydGlmaWNhdGUJCSJzZHNpQ2VydGlmaWNhdGUiCisjZGVmaW5lIE5JRF9zZHNpQ2VydGlmaWNhdGUJCTE1OQorI2RlZmluZSBPQkpfc2RzaUNlcnRpZmljYXRlCQlPQkpfY2VydFR5cGVzLDJMCisKKyNkZWZpbmUgT0JKX2NybFR5cGVzCQlPQkpfcGtjczksMjNMCisKKyNkZWZpbmUgTE5feDUwOUNybAkJIng1MDlDcmwiCisjZGVmaW5lIE5JRF94NTA5Q3JsCQkxNjAKKyNkZWZpbmUgT0JKX3g1MDlDcmwJCU9CSl9jcmxUeXBlcywxTAorCisjZGVmaW5lIE9CSl9wa2NzMTIJCU9CSl9wa2NzLDEyTAorCisjZGVmaW5lIE9CSl9wa2NzMTJfcGJlaWRzCQlPQkpfcGtjczEyLDFMCisKKyNkZWZpbmUgU05fcGJlX1dpdGhTSEExQW5kMTI4Qml0UkM0CQkiUEJFLVNIQTEtUkM0LTEyOCIKKyNkZWZpbmUgTE5fcGJlX1dpdGhTSEExQW5kMTI4Qml0UkM0CQkicGJlV2l0aFNIQTFBbmQxMjhCaXRSQzQiCisjZGVmaW5lIE5JRF9wYmVfV2l0aFNIQTFBbmQxMjhCaXRSQzQJCTE0NAorI2RlZmluZSBPQkpfcGJlX1dpdGhTSEExQW5kMTI4Qml0UkM0CQlPQkpfcGtjczEyX3BiZWlkcywxTAorCisjZGVmaW5lIFNOX3BiZV9XaXRoU0hBMUFuZDQwQml0UkM0CQkiUEJFLVNIQTEtUkM0LTQwIgorI2RlZmluZSBMTl9wYmVfV2l0aFNIQTFBbmQ0MEJpdFJDNAkJInBiZVdpdGhTSEExQW5kNDBCaXRSQzQiCisjZGVmaW5lIE5JRF9wYmVfV2l0aFNIQTFBbmQ0MEJpdFJDNAkJMTQ1CisjZGVmaW5lIE9CSl9wYmVfV2l0aFNIQTFBbmQ0MEJpdFJDNAkJT0JKX3BrY3MxMl9wYmVpZHMsMkwKKworI2RlZmluZSBTTl9wYmVfV2l0aFNIQTFBbmQzX0tleV9UcmlwbGVERVNfQ0JDCQkiUEJFLVNIQTEtM0RFUyIKKyNkZWZpbmUgTE5fcGJlX1dpdGhTSEExQW5kM19LZXlfVHJpcGxlREVTX0NCQwkJInBiZVdpdGhTSEExQW5kMy1LZXlUcmlwbGVERVMtQ0JDIgorI2RlZmluZSBOSURfcGJlX1dpdGhTSEExQW5kM19LZXlfVHJpcGxlREVTX0NCQwkJMTQ2CisjZGVmaW5lIE9CSl9wYmVfV2l0aFNIQTFBbmQzX0tleV9UcmlwbGVERVNfQ0JDCQlPQkpfcGtjczEyX3BiZWlkcywzTAorCisjZGVmaW5lIFNOX3BiZV9XaXRoU0hBMUFuZDJfS2V5X1RyaXBsZURFU19DQkMJCSJQQkUtU0hBMS0yREVTIgorI2RlZmluZSBMTl9wYmVfV2l0aFNIQTFBbmQyX0tleV9UcmlwbGVERVNfQ0JDCQkicGJlV2l0aFNIQTFBbmQyLUtleVRyaXBsZURFUy1DQkMiCisjZGVmaW5lIE5JRF9wYmVfV2l0aFNIQTFBbmQyX0tleV9UcmlwbGVERVNfQ0JDCQkxNDcKKyNkZWZpbmUgT0JKX3BiZV9XaXRoU0hBMUFuZDJfS2V5X1RyaXBsZURFU19DQkMJCU9CSl9wa2NzMTJfcGJlaWRzLDRMCisKKyNkZWZpbmUgU05fcGJlX1dpdGhTSEExQW5kMTI4Qml0UkMyX0NCQwkJIlBCRS1TSEExLVJDMi0xMjgiCisjZGVmaW5lIExOX3BiZV9XaXRoU0hBMUFuZDEyOEJpdFJDMl9DQkMJCSJwYmVXaXRoU0hBMUFuZDEyOEJpdFJDMi1DQkMiCisjZGVmaW5lIE5JRF9wYmVfV2l0aFNIQTFBbmQxMjhCaXRSQzJfQ0JDCQkxNDgKKyNkZWZpbmUgT0JKX3BiZV9XaXRoU0hBMUFuZDEyOEJpdFJDMl9DQkMJCU9CSl9wa2NzMTJfcGJlaWRzLDVMCisKKyNkZWZpbmUgU05fcGJlX1dpdGhTSEExQW5kNDBCaXRSQzJfQ0JDCQkiUEJFLVNIQTEtUkMyLTQwIgorI2RlZmluZSBMTl9wYmVfV2l0aFNIQTFBbmQ0MEJpdFJDMl9DQkMJCSJwYmVXaXRoU0hBMUFuZDQwQml0UkMyLUNCQyIKKyNkZWZpbmUgTklEX3BiZV9XaXRoU0hBMUFuZDQwQml0UkMyX0NCQwkJMTQ5CisjZGVmaW5lIE9CSl9wYmVfV2l0aFNIQTFBbmQ0MEJpdFJDMl9DQkMJCU9CSl9wa2NzMTJfcGJlaWRzLDZMCisKKyNkZWZpbmUgT0JKX3BrY3MxMl9WZXJzaW9uMQkJT0JKX3BrY3MxMiwxMEwKKworI2RlZmluZSBPQkpfcGtjczEyX0JhZ0lkcwkJT0JKX3BrY3MxMl9WZXJzaW9uMSwxTAorCisjZGVmaW5lIExOX2tleUJhZwkJImtleUJhZyIKKyNkZWZpbmUgTklEX2tleUJhZwkJMTUwCisjZGVmaW5lIE9CSl9rZXlCYWcJCU9CSl9wa2NzMTJfQmFnSWRzLDFMCisKKyNkZWZpbmUgTE5fcGtjczhTaHJvdWRlZEtleUJhZwkJInBrY3M4U2hyb3VkZWRLZXlCYWciCisjZGVmaW5lIE5JRF9wa2NzOFNocm91ZGVkS2V5QmFnCQkxNTEKKyNkZWZpbmUgT0JKX3BrY3M4U2hyb3VkZWRLZXlCYWcJCU9CSl9wa2NzMTJfQmFnSWRzLDJMCisKKyNkZWZpbmUgTE5fY2VydEJhZwkJImNlcnRCYWciCisjZGVmaW5lIE5JRF9jZXJ0QmFnCQkxNTIKKyNkZWZpbmUgT0JKX2NlcnRCYWcJCU9CSl9wa2NzMTJfQmFnSWRzLDNMCisKKyNkZWZpbmUgTE5fY3JsQmFnCQkiY3JsQmFnIgorI2RlZmluZSBOSURfY3JsQmFnCQkxNTMKKyNkZWZpbmUgT0JKX2NybEJhZwkJT0JKX3BrY3MxMl9CYWdJZHMsNEwKKworI2RlZmluZSBMTl9zZWNyZXRCYWcJCSJzZWNyZXRCYWciCisjZGVmaW5lIE5JRF9zZWNyZXRCYWcJCTE1NAorI2RlZmluZSBPQkpfc2VjcmV0QmFnCQlPQkpfcGtjczEyX0JhZ0lkcyw1TAorCisjZGVmaW5lIExOX3NhZmVDb250ZW50c0JhZwkJInNhZmVDb250ZW50c0JhZyIKKyNkZWZpbmUgTklEX3NhZmVDb250ZW50c0JhZwkJMTU1CisjZGVmaW5lIE9CSl9zYWZlQ29udGVudHNCYWcJCU9CSl9wa2NzMTJfQmFnSWRzLDZMCisKKyNkZWZpbmUgU05fbWQyCQkiTUQyIgorI2RlZmluZSBMTl9tZDIJCSJtZDIiCisjZGVmaW5lIE5JRF9tZDIJCTMKKyNkZWZpbmUgT0JKX21kMgkJT0JKX3JzYWRzaSwyTCwyTAorCisjZGVmaW5lIFNOX21kNAkJIk1ENCIKKyNkZWZpbmUgTE5fbWQ0CQkibWQ0IgorI2RlZmluZSBOSURfbWQ0CQkyNTcKKyNkZWZpbmUgT0JKX21kNAkJT0JKX3JzYWRzaSwyTCw0TAorCisjZGVmaW5lIFNOX21kNQkJIk1ENSIKKyNkZWZpbmUgTE5fbWQ1CQkibWQ1IgorI2RlZmluZSBOSURfbWQ1CQk0CisjZGVmaW5lIE9CSl9tZDUJCU9CSl9yc2Fkc2ksMkwsNUwKKworI2RlZmluZSBTTl9tZDVfc2hhMQkJIk1ENS1TSEExIgorI2RlZmluZSBMTl9tZDVfc2hhMQkJIm1kNS1zaGExIgorI2RlZmluZSBOSURfbWQ1X3NoYTEJCTExNAorCisjZGVmaW5lIExOX2htYWNXaXRoTUQ1CQkiaG1hY1dpdGhNRDUiCisjZGVmaW5lIE5JRF9obWFjV2l0aE1ENQkJNzk3CisjZGVmaW5lIE9CSl9obWFjV2l0aE1ENQkJT0JKX3JzYWRzaSwyTCw2TAorCisjZGVmaW5lIExOX2htYWNXaXRoU0hBMQkJImhtYWNXaXRoU0hBMSIKKyNkZWZpbmUgTklEX2htYWNXaXRoU0hBMQkJMTYzCisjZGVmaW5lIE9CSl9obWFjV2l0aFNIQTEJCU9CSl9yc2Fkc2ksMkwsN0wKKworI2RlZmluZSBMTl9obWFjV2l0aFNIQTIyNAkJImhtYWNXaXRoU0hBMjI0IgorI2RlZmluZSBOSURfaG1hY1dpdGhTSEEyMjQJCTc5OAorI2RlZmluZSBPQkpfaG1hY1dpdGhTSEEyMjQJCU9CSl9yc2Fkc2ksMkwsOEwKKworI2RlZmluZSBMTl9obWFjV2l0aFNIQTI1NgkJImhtYWNXaXRoU0hBMjU2IgorI2RlZmluZSBOSURfaG1hY1dpdGhTSEEyNTYJCTc5OQorI2RlZmluZSBPQkpfaG1hY1dpdGhTSEEyNTYJCU9CSl9yc2Fkc2ksMkwsOUwKKworI2RlZmluZSBMTl9obWFjV2l0aFNIQTM4NAkJImhtYWNXaXRoU0hBMzg0IgorI2RlZmluZSBOSURfaG1hY1dpdGhTSEEzODQJCTgwMAorI2RlZmluZSBPQkpfaG1hY1dpdGhTSEEzODQJCU9CSl9yc2Fkc2ksMkwsMTBMCisKKyNkZWZpbmUgTE5faG1hY1dpdGhTSEE1MTIJCSJobWFjV2l0aFNIQTUxMiIKKyNkZWZpbmUgTklEX2htYWNXaXRoU0hBNTEyCQk4MDEKKyNkZWZpbmUgT0JKX2htYWNXaXRoU0hBNTEyCQlPQkpfcnNhZHNpLDJMLDExTAorCisjZGVmaW5lIFNOX3JjMl9jYmMJCSJSQzItQ0JDIgorI2RlZmluZSBMTl9yYzJfY2JjCQkicmMyLWNiYyIKKyNkZWZpbmUgTklEX3JjMl9jYmMJCTM3CisjZGVmaW5lIE9CSl9yYzJfY2JjCQlPQkpfcnNhZHNpLDNMLDJMCisKKyNkZWZpbmUgU05fcmMyX2VjYgkJIlJDMi1FQ0IiCisjZGVmaW5lIExOX3JjMl9lY2IJCSJyYzItZWNiIgorI2RlZmluZSBOSURfcmMyX2VjYgkJMzgKKworI2RlZmluZSBTTl9yYzJfY2ZiNjQJCSJSQzItQ0ZCIgorI2RlZmluZSBMTl9yYzJfY2ZiNjQJCSJyYzItY2ZiIgorI2RlZmluZSBOSURfcmMyX2NmYjY0CQkzOQorCisjZGVmaW5lIFNOX3JjMl9vZmI2NAkJIlJDMi1PRkIiCisjZGVmaW5lIExOX3JjMl9vZmI2NAkJInJjMi1vZmIiCisjZGVmaW5lIE5JRF9yYzJfb2ZiNjQJCTQwCisKKyNkZWZpbmUgU05fcmMyXzQwX2NiYwkJIlJDMi00MC1DQkMiCisjZGVmaW5lIExOX3JjMl80MF9jYmMJCSJyYzItNDAtY2JjIgorI2RlZmluZSBOSURfcmMyXzQwX2NiYwkJOTgKKworI2RlZmluZSBTTl9yYzJfNjRfY2JjCQkiUkMyLTY0LUNCQyIKKyNkZWZpbmUgTE5fcmMyXzY0X2NiYwkJInJjMi02NC1jYmMiCisjZGVmaW5lIE5JRF9yYzJfNjRfY2JjCQkxNjYKKworI2RlZmluZSBTTl9yYzQJCSJSQzQiCisjZGVmaW5lIExOX3JjNAkJInJjNCIKKyNkZWZpbmUgTklEX3JjNAkJNQorI2RlZmluZSBPQkpfcmM0CQlPQkpfcnNhZHNpLDNMLDRMCisKKyNkZWZpbmUgU05fcmM0XzQwCQkiUkM0LTQwIgorI2RlZmluZSBMTl9yYzRfNDAJCSJyYzQtNDAiCisjZGVmaW5lIE5JRF9yYzRfNDAJCTk3CisKKyNkZWZpbmUgU05fZGVzX2VkZTNfY2JjCQkiREVTLUVERTMtQ0JDIgorI2RlZmluZSBMTl9kZXNfZWRlM19jYmMJCSJkZXMtZWRlMy1jYmMiCisjZGVmaW5lIE5JRF9kZXNfZWRlM19jYmMJCTQ0CisjZGVmaW5lIE9CSl9kZXNfZWRlM19jYmMJCU9CSl9yc2Fkc2ksM0wsN0wKKworI2RlZmluZSBTTl9yYzVfY2JjCQkiUkM1LUNCQyIKKyNkZWZpbmUgTE5fcmM1X2NiYwkJInJjNS1jYmMiCisjZGVmaW5lIE5JRF9yYzVfY2JjCQkxMjAKKyNkZWZpbmUgT0JKX3JjNV9jYmMJCU9CSl9yc2Fkc2ksM0wsOEwKKworI2RlZmluZSBTTl9yYzVfZWNiCQkiUkM1LUVDQiIKKyNkZWZpbmUgTE5fcmM1X2VjYgkJInJjNS1lY2IiCisjZGVmaW5lIE5JRF9yYzVfZWNiCQkxMjEKKworI2RlZmluZSBTTl9yYzVfY2ZiNjQJCSJSQzUtQ0ZCIgorI2RlZmluZSBMTl9yYzVfY2ZiNjQJCSJyYzUtY2ZiIgorI2RlZmluZSBOSURfcmM1X2NmYjY0CQkxMjIKKworI2RlZmluZSBTTl9yYzVfb2ZiNjQJCSJSQzUtT0ZCIgorI2RlZmluZSBMTl9yYzVfb2ZiNjQJCSJyYzUtb2ZiIgorI2RlZmluZSBOSURfcmM1X29mYjY0CQkxMjMKKworI2RlZmluZSBTTl9tc19leHRfcmVxCQkibXNFeHRSZXEiCisjZGVmaW5lIExOX21zX2V4dF9yZXEJCSJNaWNyb3NvZnQgRXh0ZW5zaW9uIFJlcXVlc3QiCisjZGVmaW5lIE5JRF9tc19leHRfcmVxCQkxNzEKKyNkZWZpbmUgT0JKX21zX2V4dF9yZXEJCTFMLDNMLDZMLDFMLDRMLDFMLDMxMUwsMkwsMUwsMTRMCisKKyNkZWZpbmUgU05fbXNfY29kZV9pbmQJCSJtc0NvZGVJbmQiCisjZGVmaW5lIExOX21zX2NvZGVfaW5kCQkiTWljcm9zb2Z0IEluZGl2aWR1YWwgQ29kZSBTaWduaW5nIgorI2RlZmluZSBOSURfbXNfY29kZV9pbmQJCTEzNAorI2RlZmluZSBPQkpfbXNfY29kZV9pbmQJCTFMLDNMLDZMLDFMLDRMLDFMLDMxMUwsMkwsMUwsMjFMCisKKyNkZWZpbmUgU05fbXNfY29kZV9jb20JCSJtc0NvZGVDb20iCisjZGVmaW5lIExOX21zX2NvZGVfY29tCQkiTWljcm9zb2Z0IENvbW1lcmNpYWwgQ29kZSBTaWduaW5nIgorI2RlZmluZSBOSURfbXNfY29kZV9jb20JCTEzNQorI2RlZmluZSBPQkpfbXNfY29kZV9jb20JCTFMLDNMLDZMLDFMLDRMLDFMLDMxMUwsMkwsMUwsMjJMCisKKyNkZWZpbmUgU05fbXNfY3RsX3NpZ24JCSJtc0NUTFNpZ24iCisjZGVmaW5lIExOX21zX2N0bF9zaWduCQkiTWljcm9zb2Z0IFRydXN0IExpc3QgU2lnbmluZyIKKyNkZWZpbmUgTklEX21zX2N0bF9zaWduCQkxMzYKKyNkZWZpbmUgT0JKX21zX2N0bF9zaWduCQkxTCwzTCw2TCwxTCw0TCwxTCwzMTFMLDEwTCwzTCwxTAorCisjZGVmaW5lIFNOX21zX3NnYwkJIm1zU0dDIgorI2RlZmluZSBMTl9tc19zZ2MJCSJNaWNyb3NvZnQgU2VydmVyIEdhdGVkIENyeXB0byIKKyNkZWZpbmUgTklEX21zX3NnYwkJMTM3CisjZGVmaW5lIE9CSl9tc19zZ2MJCTFMLDNMLDZMLDFMLDRMLDFMLDMxMUwsMTBMLDNMLDNMCisKKyNkZWZpbmUgU05fbXNfZWZzCQkibXNFRlMiCisjZGVmaW5lIExOX21zX2VmcwkJIk1pY3Jvc29mdCBFbmNyeXB0ZWQgRmlsZSBTeXN0ZW0iCisjZGVmaW5lIE5JRF9tc19lZnMJCTEzOAorI2RlZmluZSBPQkpfbXNfZWZzCQkxTCwzTCw2TCwxTCw0TCwxTCwzMTFMLDEwTCwzTCw0TAorCisjZGVmaW5lIFNOX21zX3NtYXJ0Y2FyZF9sb2dpbgkJIm1zU21hcnRjYXJkTG9naW4iCisjZGVmaW5lIExOX21zX3NtYXJ0Y2FyZF9sb2dpbgkJIk1pY3Jvc29mdCBTbWFydGNhcmRsb2dpbiIKKyNkZWZpbmUgTklEX21zX3NtYXJ0Y2FyZF9sb2dpbgkJNjQ4CisjZGVmaW5lIE9CSl9tc19zbWFydGNhcmRfbG9naW4JCTFMLDNMLDZMLDFMLDRMLDFMLDMxMUwsMjBMLDJMLDJMCisKKyNkZWZpbmUgU05fbXNfdXBuCQkibXNVUE4iCisjZGVmaW5lIExOX21zX3VwbgkJIk1pY3Jvc29mdCBVbml2ZXJzYWwgUHJpbmNpcGFsIE5hbWUiCisjZGVmaW5lIE5JRF9tc191cG4JCTY0OQorI2RlZmluZSBPQkpfbXNfdXBuCQkxTCwzTCw2TCwxTCw0TCwxTCwzMTFMLDIwTCwyTCwzTAorCisjZGVmaW5lIFNOX2lkZWFfY2JjCQkiSURFQS1DQkMiCisjZGVmaW5lIExOX2lkZWFfY2JjCQkiaWRlYS1jYmMiCisjZGVmaW5lIE5JRF9pZGVhX2NiYwkJMzQKKyNkZWZpbmUgT0JKX2lkZWFfY2JjCQkxTCwzTCw2TCwxTCw0TCwxTCwxODhMLDdMLDFMLDFMLDJMCisKKyNkZWZpbmUgU05faWRlYV9lY2IJCSJJREVBLUVDQiIKKyNkZWZpbmUgTE5faWRlYV9lY2IJCSJpZGVhLWVjYiIKKyNkZWZpbmUgTklEX2lkZWFfZWNiCQkzNgorCisjZGVmaW5lIFNOX2lkZWFfY2ZiNjQJCSJJREVBLUNGQiIKKyNkZWZpbmUgTE5faWRlYV9jZmI2NAkJImlkZWEtY2ZiIgorI2RlZmluZSBOSURfaWRlYV9jZmI2NAkJMzUKKworI2RlZmluZSBTTl9pZGVhX29mYjY0CQkiSURFQS1PRkIiCisjZGVmaW5lIExOX2lkZWFfb2ZiNjQJCSJpZGVhLW9mYiIKKyNkZWZpbmUgTklEX2lkZWFfb2ZiNjQJCTQ2CisKKyNkZWZpbmUgU05fYmZfY2JjCQkiQkYtQ0JDIgorI2RlZmluZSBMTl9iZl9jYmMJCSJiZi1jYmMiCisjZGVmaW5lIE5JRF9iZl9jYmMJCTkxCisjZGVmaW5lIE9CSl9iZl9jYmMJCTFMLDNMLDZMLDFMLDRMLDFMLDMwMjlMLDFMLDJMCisKKyNkZWZpbmUgU05fYmZfZWNiCQkiQkYtRUNCIgorI2RlZmluZSBMTl9iZl9lY2IJCSJiZi1lY2IiCisjZGVmaW5lIE5JRF9iZl9lY2IJCTkyCisKKyNkZWZpbmUgU05fYmZfY2ZiNjQJCSJCRi1DRkIiCisjZGVmaW5lIExOX2JmX2NmYjY0CQkiYmYtY2ZiIgorI2RlZmluZSBOSURfYmZfY2ZiNjQJCTkzCisKKyNkZWZpbmUgU05fYmZfb2ZiNjQJCSJCRi1PRkIiCisjZGVmaW5lIExOX2JmX29mYjY0CQkiYmYtb2ZiIgorI2RlZmluZSBOSURfYmZfb2ZiNjQJCTk0CisKKyNkZWZpbmUgU05faWRfcGtpeAkJIlBLSVgiCisjZGVmaW5lIE5JRF9pZF9wa2l4CQkxMjcKKyNkZWZpbmUgT0JKX2lkX3BraXgJCTFMLDNMLDZMLDFMLDVMLDVMLDdMCisKKyNkZWZpbmUgU05faWRfcGtpeF9tb2QJCSJpZC1wa2l4LW1vZCIKKyNkZWZpbmUgTklEX2lkX3BraXhfbW9kCQkyNTgKKyNkZWZpbmUgT0JKX2lkX3BraXhfbW9kCQlPQkpfaWRfcGtpeCwwTAorCisjZGVmaW5lIFNOX2lkX3BlCQkiaWQtcGUiCisjZGVmaW5lIE5JRF9pZF9wZQkJMTc1CisjZGVmaW5lIE9CSl9pZF9wZQkJT0JKX2lkX3BraXgsMUwKKworI2RlZmluZSBTTl9pZF9xdAkJImlkLXF0IgorI2RlZmluZSBOSURfaWRfcXQJCTI1OQorI2RlZmluZSBPQkpfaWRfcXQJCU9CSl9pZF9wa2l4LDJMCisKKyNkZWZpbmUgU05faWRfa3AJCSJpZC1rcCIKKyNkZWZpbmUgTklEX2lkX2twCQkxMjgKKyNkZWZpbmUgT0JKX2lkX2twCQlPQkpfaWRfcGtpeCwzTAorCisjZGVmaW5lIFNOX2lkX2l0CQkiaWQtaXQiCisjZGVmaW5lIE5JRF9pZF9pdAkJMjYwCisjZGVmaW5lIE9CSl9pZF9pdAkJT0JKX2lkX3BraXgsNEwKKworI2RlZmluZSBTTl9pZF9wa2lwCQkiaWQtcGtpcCIKKyNkZWZpbmUgTklEX2lkX3BraXAJCTI2MQorI2RlZmluZSBPQkpfaWRfcGtpcAkJT0JKX2lkX3BraXgsNUwKKworI2RlZmluZSBTTl9pZF9hbGcJCSJpZC1hbGciCisjZGVmaW5lIE5JRF9pZF9hbGcJCTI2MgorI2RlZmluZSBPQkpfaWRfYWxnCQlPQkpfaWRfcGtpeCw2TAorCisjZGVmaW5lIFNOX2lkX2NtYwkJImlkLWNtYyIKKyNkZWZpbmUgTklEX2lkX2NtYwkJMjYzCisjZGVmaW5lIE9CSl9pZF9jbWMJCU9CSl9pZF9wa2l4LDdMCisKKyNkZWZpbmUgU05faWRfb24JCSJpZC1vbiIKKyNkZWZpbmUgTklEX2lkX29uCQkyNjQKKyNkZWZpbmUgT0JKX2lkX29uCQlPQkpfaWRfcGtpeCw4TAorCisjZGVmaW5lIFNOX2lkX3BkYQkJImlkLXBkYSIKKyNkZWZpbmUgTklEX2lkX3BkYQkJMjY1CisjZGVmaW5lIE9CSl9pZF9wZGEJCU9CSl9pZF9wa2l4LDlMCisKKyNkZWZpbmUgU05faWRfYWNhCQkiaWQtYWNhIgorI2RlZmluZSBOSURfaWRfYWNhCQkyNjYKKyNkZWZpbmUgT0JKX2lkX2FjYQkJT0JKX2lkX3BraXgsMTBMCisKKyNkZWZpbmUgU05faWRfcWNzCQkiaWQtcWNzIgorI2RlZmluZSBOSURfaWRfcWNzCQkyNjcKKyNkZWZpbmUgT0JKX2lkX3FjcwkJT0JKX2lkX3BraXgsMTFMCisKKyNkZWZpbmUgU05faWRfY2N0CQkiaWQtY2N0IgorI2RlZmluZSBOSURfaWRfY2N0CQkyNjgKKyNkZWZpbmUgT0JKX2lkX2NjdAkJT0JKX2lkX3BraXgsMTJMCisKKyNkZWZpbmUgU05faWRfcHBsCQkiaWQtcHBsIgorI2RlZmluZSBOSURfaWRfcHBsCQk2NjIKKyNkZWZpbmUgT0JKX2lkX3BwbAkJT0JKX2lkX3BraXgsMjFMCisKKyNkZWZpbmUgU05faWRfYWQJCSJpZC1hZCIKKyNkZWZpbmUgTklEX2lkX2FkCQkxNzYKKyNkZWZpbmUgT0JKX2lkX2FkCQlPQkpfaWRfcGtpeCw0OEwKKworI2RlZmluZSBTTl9pZF9wa2l4MV9leHBsaWNpdF84OAkJImlkLXBraXgxLWV4cGxpY2l0LTg4IgorI2RlZmluZSBOSURfaWRfcGtpeDFfZXhwbGljaXRfODgJCTI2OQorI2RlZmluZSBPQkpfaWRfcGtpeDFfZXhwbGljaXRfODgJCU9CSl9pZF9wa2l4X21vZCwxTAorCisjZGVmaW5lIFNOX2lkX3BraXgxX2ltcGxpY2l0Xzg4CQkiaWQtcGtpeDEtaW1wbGljaXQtODgiCisjZGVmaW5lIE5JRF9pZF9wa2l4MV9pbXBsaWNpdF84OAkJMjcwCisjZGVmaW5lIE9CSl9pZF9wa2l4MV9pbXBsaWNpdF84OAkJT0JKX2lkX3BraXhfbW9kLDJMCisKKyNkZWZpbmUgU05faWRfcGtpeDFfZXhwbGljaXRfOTMJCSJpZC1wa2l4MS1leHBsaWNpdC05MyIKKyNkZWZpbmUgTklEX2lkX3BraXgxX2V4cGxpY2l0XzkzCQkyNzEKKyNkZWZpbmUgT0JKX2lkX3BraXgxX2V4cGxpY2l0XzkzCQlPQkpfaWRfcGtpeF9tb2QsM0wKKworI2RlZmluZSBTTl9pZF9wa2l4MV9pbXBsaWNpdF85MwkJImlkLXBraXgxLWltcGxpY2l0LTkzIgorI2RlZmluZSBOSURfaWRfcGtpeDFfaW1wbGljaXRfOTMJCTI3MgorI2RlZmluZSBPQkpfaWRfcGtpeDFfaW1wbGljaXRfOTMJCU9CSl9pZF9wa2l4X21vZCw0TAorCisjZGVmaW5lIFNOX2lkX21vZF9jcm1mCQkiaWQtbW9kLWNybWYiCisjZGVmaW5lIE5JRF9pZF9tb2RfY3JtZgkJMjczCisjZGVmaW5lIE9CSl9pZF9tb2RfY3JtZgkJT0JKX2lkX3BraXhfbW9kLDVMCisKKyNkZWZpbmUgU05faWRfbW9kX2NtYwkJImlkLW1vZC1jbWMiCisjZGVmaW5lIE5JRF9pZF9tb2RfY21jCQkyNzQKKyNkZWZpbmUgT0JKX2lkX21vZF9jbWMJCU9CSl9pZF9wa2l4X21vZCw2TAorCisjZGVmaW5lIFNOX2lkX21vZF9rZWFfcHJvZmlsZV84OAkJImlkLW1vZC1rZWEtcHJvZmlsZS04OCIKKyNkZWZpbmUgTklEX2lkX21vZF9rZWFfcHJvZmlsZV84OAkJMjc1CisjZGVmaW5lIE9CSl9pZF9tb2Rfa2VhX3Byb2ZpbGVfODgJCU9CSl9pZF9wa2l4X21vZCw3TAorCisjZGVmaW5lIFNOX2lkX21vZF9rZWFfcHJvZmlsZV85MwkJImlkLW1vZC1rZWEtcHJvZmlsZS05MyIKKyNkZWZpbmUgTklEX2lkX21vZF9rZWFfcHJvZmlsZV85MwkJMjc2CisjZGVmaW5lIE9CSl9pZF9tb2Rfa2VhX3Byb2ZpbGVfOTMJCU9CSl9pZF9wa2l4X21vZCw4TAorCisjZGVmaW5lIFNOX2lkX21vZF9jbXAJCSJpZC1tb2QtY21wIgorI2RlZmluZSBOSURfaWRfbW9kX2NtcAkJMjc3CisjZGVmaW5lIE9CSl9pZF9tb2RfY21wCQlPQkpfaWRfcGtpeF9tb2QsOUwKKworI2RlZmluZSBTTl9pZF9tb2RfcXVhbGlmaWVkX2NlcnRfODgJCSJpZC1tb2QtcXVhbGlmaWVkLWNlcnQtODgiCisjZGVmaW5lIE5JRF9pZF9tb2RfcXVhbGlmaWVkX2NlcnRfODgJCTI3OAorI2RlZmluZSBPQkpfaWRfbW9kX3F1YWxpZmllZF9jZXJ0Xzg4CQlPQkpfaWRfcGtpeF9tb2QsMTBMCisKKyNkZWZpbmUgU05faWRfbW9kX3F1YWxpZmllZF9jZXJ0XzkzCQkiaWQtbW9kLXF1YWxpZmllZC1jZXJ0LTkzIgorI2RlZmluZSBOSURfaWRfbW9kX3F1YWxpZmllZF9jZXJ0XzkzCQkyNzkKKyNkZWZpbmUgT0JKX2lkX21vZF9xdWFsaWZpZWRfY2VydF85MwkJT0JKX2lkX3BraXhfbW9kLDExTAorCisjZGVmaW5lIFNOX2lkX21vZF9hdHRyaWJ1dGVfY2VydAkJImlkLW1vZC1hdHRyaWJ1dGUtY2VydCIKKyNkZWZpbmUgTklEX2lkX21vZF9hdHRyaWJ1dGVfY2VydAkJMjgwCisjZGVmaW5lIE9CSl9pZF9tb2RfYXR0cmlidXRlX2NlcnQJCU9CSl9pZF9wa2l4X21vZCwxMkwKKworI2RlZmluZSBTTl9pZF9tb2RfdGltZXN0YW1wX3Byb3RvY29sCQkiaWQtbW9kLXRpbWVzdGFtcC1wcm90b2NvbCIKKyNkZWZpbmUgTklEX2lkX21vZF90aW1lc3RhbXBfcHJvdG9jb2wJCTI4MQorI2RlZmluZSBPQkpfaWRfbW9kX3RpbWVzdGFtcF9wcm90b2NvbAkJT0JKX2lkX3BraXhfbW9kLDEzTAorCisjZGVmaW5lIFNOX2lkX21vZF9vY3NwCQkiaWQtbW9kLW9jc3AiCisjZGVmaW5lIE5JRF9pZF9tb2Rfb2NzcAkJMjgyCisjZGVmaW5lIE9CSl9pZF9tb2Rfb2NzcAkJT0JKX2lkX3BraXhfbW9kLDE0TAorCisjZGVmaW5lIFNOX2lkX21vZF9kdmNzCQkiaWQtbW9kLWR2Y3MiCisjZGVmaW5lIE5JRF9pZF9tb2RfZHZjcwkJMjgzCisjZGVmaW5lIE9CSl9pZF9tb2RfZHZjcwkJT0JKX2lkX3BraXhfbW9kLDE1TAorCisjZGVmaW5lIFNOX2lkX21vZF9jbXAyMDAwCQkiaWQtbW9kLWNtcDIwMDAiCisjZGVmaW5lIE5JRF9pZF9tb2RfY21wMjAwMAkJMjg0CisjZGVmaW5lIE9CSl9pZF9tb2RfY21wMjAwMAkJT0JKX2lkX3BraXhfbW9kLDE2TAorCisjZGVmaW5lIFNOX2luZm9fYWNjZXNzCQkiYXV0aG9yaXR5SW5mb0FjY2VzcyIKKyNkZWZpbmUgTE5faW5mb19hY2Nlc3MJCSJBdXRob3JpdHkgSW5mb3JtYXRpb24gQWNjZXNzIgorI2RlZmluZSBOSURfaW5mb19hY2Nlc3MJCTE3NworI2RlZmluZSBPQkpfaW5mb19hY2Nlc3MJCU9CSl9pZF9wZSwxTAorCisjZGVmaW5lIFNOX2Jpb21ldHJpY0luZm8JCSJiaW9tZXRyaWNJbmZvIgorI2RlZmluZSBMTl9iaW9tZXRyaWNJbmZvCQkiQmlvbWV0cmljIEluZm8iCisjZGVmaW5lIE5JRF9iaW9tZXRyaWNJbmZvCQkyODUKKyNkZWZpbmUgT0JKX2Jpb21ldHJpY0luZm8JCU9CSl9pZF9wZSwyTAorCisjZGVmaW5lIFNOX3FjU3RhdGVtZW50cwkJInFjU3RhdGVtZW50cyIKKyNkZWZpbmUgTklEX3FjU3RhdGVtZW50cwkJMjg2CisjZGVmaW5lIE9CSl9xY1N0YXRlbWVudHMJCU9CSl9pZF9wZSwzTAorCisjZGVmaW5lIFNOX2FjX2F1ZGl0RW50aXR5CQkiYWMtYXVkaXRFbnRpdHkiCisjZGVmaW5lIE5JRF9hY19hdWRpdEVudGl0eQkJMjg3CisjZGVmaW5lIE9CSl9hY19hdWRpdEVudGl0eQkJT0JKX2lkX3BlLDRMCisKKyNkZWZpbmUgU05fYWNfdGFyZ2V0aW5nCQkiYWMtdGFyZ2V0aW5nIgorI2RlZmluZSBOSURfYWNfdGFyZ2V0aW5nCQkyODgKKyNkZWZpbmUgT0JKX2FjX3RhcmdldGluZwkJT0JKX2lkX3BlLDVMCisKKyNkZWZpbmUgU05fYWFDb250cm9scwkJImFhQ29udHJvbHMiCisjZGVmaW5lIE5JRF9hYUNvbnRyb2xzCQkyODkKKyNkZWZpbmUgT0JKX2FhQ29udHJvbHMJCU9CSl9pZF9wZSw2TAorCisjZGVmaW5lIFNOX3NiZ3BfaXBBZGRyQmxvY2sJCSJzYmdwLWlwQWRkckJsb2NrIgorI2RlZmluZSBOSURfc2JncF9pcEFkZHJCbG9jawkJMjkwCisjZGVmaW5lIE9CSl9zYmdwX2lwQWRkckJsb2NrCQlPQkpfaWRfcGUsN0wKKworI2RlZmluZSBTTl9zYmdwX2F1dG9ub21vdXNTeXNOdW0JCSJzYmdwLWF1dG9ub21vdXNTeXNOdW0iCisjZGVmaW5lIE5JRF9zYmdwX2F1dG9ub21vdXNTeXNOdW0JCTI5MQorI2RlZmluZSBPQkpfc2JncF9hdXRvbm9tb3VzU3lzTnVtCQlPQkpfaWRfcGUsOEwKKworI2RlZmluZSBTTl9zYmdwX3JvdXRlcklkZW50aWZpZXIJCSJzYmdwLXJvdXRlcklkZW50aWZpZXIiCisjZGVmaW5lIE5JRF9zYmdwX3JvdXRlcklkZW50aWZpZXIJCTI5MgorI2RlZmluZSBPQkpfc2JncF9yb3V0ZXJJZGVudGlmaWVyCQlPQkpfaWRfcGUsOUwKKworI2RlZmluZSBTTl9hY19wcm94eWluZwkJImFjLXByb3h5aW5nIgorI2RlZmluZSBOSURfYWNfcHJveHlpbmcJCTM5NworI2RlZmluZSBPQkpfYWNfcHJveHlpbmcJCU9CSl9pZF9wZSwxMEwKKworI2RlZmluZSBTTl9zaW5mb19hY2Nlc3MJCSJzdWJqZWN0SW5mb0FjY2VzcyIKKyNkZWZpbmUgTE5fc2luZm9fYWNjZXNzCQkiU3ViamVjdCBJbmZvcm1hdGlvbiBBY2Nlc3MiCisjZGVmaW5lIE5JRF9zaW5mb19hY2Nlc3MJCTM5OAorI2RlZmluZSBPQkpfc2luZm9fYWNjZXNzCQlPQkpfaWRfcGUsMTFMCisKKyNkZWZpbmUgU05fcHJveHlDZXJ0SW5mbwkJInByb3h5Q2VydEluZm8iCisjZGVmaW5lIExOX3Byb3h5Q2VydEluZm8JCSJQcm94eSBDZXJ0aWZpY2F0ZSBJbmZvcm1hdGlvbiIKKyNkZWZpbmUgTklEX3Byb3h5Q2VydEluZm8JCTY2MworI2RlZmluZSBPQkpfcHJveHlDZXJ0SW5mbwkJT0JKX2lkX3BlLDE0TAorCisjZGVmaW5lIFNOX2lkX3F0X2NwcwkJImlkLXF0LWNwcyIKKyNkZWZpbmUgTE5faWRfcXRfY3BzCQkiUG9saWN5IFF1YWxpZmllciBDUFMiCisjZGVmaW5lIE5JRF9pZF9xdF9jcHMJCTE2NAorI2RlZmluZSBPQkpfaWRfcXRfY3BzCQlPQkpfaWRfcXQsMUwKKworI2RlZmluZSBTTl9pZF9xdF91bm90aWNlCQkiaWQtcXQtdW5vdGljZSIKKyNkZWZpbmUgTE5faWRfcXRfdW5vdGljZQkJIlBvbGljeSBRdWFsaWZpZXIgVXNlciBOb3RpY2UiCisjZGVmaW5lIE5JRF9pZF9xdF91bm90aWNlCQkxNjUKKyNkZWZpbmUgT0JKX2lkX3F0X3Vub3RpY2UJCU9CSl9pZF9xdCwyTAorCisjZGVmaW5lIFNOX3RleHROb3RpY2UJCSJ0ZXh0Tm90aWNlIgorI2RlZmluZSBOSURfdGV4dE5vdGljZQkJMjkzCisjZGVmaW5lIE9CSl90ZXh0Tm90aWNlCQlPQkpfaWRfcXQsM0wKKworI2RlZmluZSBTTl9zZXJ2ZXJfYXV0aAkJInNlcnZlckF1dGgiCisjZGVmaW5lIExOX3NlcnZlcl9hdXRoCQkiVExTIFdlYiBTZXJ2ZXIgQXV0aGVudGljYXRpb24iCisjZGVmaW5lIE5JRF9zZXJ2ZXJfYXV0aAkJMTI5CisjZGVmaW5lIE9CSl9zZXJ2ZXJfYXV0aAkJT0JKX2lkX2twLDFMCisKKyNkZWZpbmUgU05fY2xpZW50X2F1dGgJCSJjbGllbnRBdXRoIgorI2RlZmluZSBMTl9jbGllbnRfYXV0aAkJIlRMUyBXZWIgQ2xpZW50IEF1dGhlbnRpY2F0aW9uIgorI2RlZmluZSBOSURfY2xpZW50X2F1dGgJCTEzMAorI2RlZmluZSBPQkpfY2xpZW50X2F1dGgJCU9CSl9pZF9rcCwyTAorCisjZGVmaW5lIFNOX2NvZGVfc2lnbgkJImNvZGVTaWduaW5nIgorI2RlZmluZSBMTl9jb2RlX3NpZ24JCSJDb2RlIFNpZ25pbmciCisjZGVmaW5lIE5JRF9jb2RlX3NpZ24JCTEzMQorI2RlZmluZSBPQkpfY29kZV9zaWduCQlPQkpfaWRfa3AsM0wKKworI2RlZmluZSBTTl9lbWFpbF9wcm90ZWN0CQkiZW1haWxQcm90ZWN0aW9uIgorI2RlZmluZSBMTl9lbWFpbF9wcm90ZWN0CQkiRS1tYWlsIFByb3RlY3Rpb24iCisjZGVmaW5lIE5JRF9lbWFpbF9wcm90ZWN0CQkxMzIKKyNkZWZpbmUgT0JKX2VtYWlsX3Byb3RlY3QJCU9CSl9pZF9rcCw0TAorCisjZGVmaW5lIFNOX2lwc2VjRW5kU3lzdGVtCQkiaXBzZWNFbmRTeXN0ZW0iCisjZGVmaW5lIExOX2lwc2VjRW5kU3lzdGVtCQkiSVBTZWMgRW5kIFN5c3RlbSIKKyNkZWZpbmUgTklEX2lwc2VjRW5kU3lzdGVtCQkyOTQKKyNkZWZpbmUgT0JKX2lwc2VjRW5kU3lzdGVtCQlPQkpfaWRfa3AsNUwKKworI2RlZmluZSBTTl9pcHNlY1R1bm5lbAkJImlwc2VjVHVubmVsIgorI2RlZmluZSBMTl9pcHNlY1R1bm5lbAkJIklQU2VjIFR1bm5lbCIKKyNkZWZpbmUgTklEX2lwc2VjVHVubmVsCQkyOTUKKyNkZWZpbmUgT0JKX2lwc2VjVHVubmVsCQlPQkpfaWRfa3AsNkwKKworI2RlZmluZSBTTl9pcHNlY1VzZXIJCSJpcHNlY1VzZXIiCisjZGVmaW5lIExOX2lwc2VjVXNlcgkJIklQU2VjIFVzZXIiCisjZGVmaW5lIE5JRF9pcHNlY1VzZXIJCTI5NgorI2RlZmluZSBPQkpfaXBzZWNVc2VyCQlPQkpfaWRfa3AsN0wKKworI2RlZmluZSBTTl90aW1lX3N0YW1wCQkidGltZVN0YW1waW5nIgorI2RlZmluZSBMTl90aW1lX3N0YW1wCQkiVGltZSBTdGFtcGluZyIKKyNkZWZpbmUgTklEX3RpbWVfc3RhbXAJCTEzMworI2RlZmluZSBPQkpfdGltZV9zdGFtcAkJT0JKX2lkX2twLDhMCisKKyNkZWZpbmUgU05fT0NTUF9zaWduCQkiT0NTUFNpZ25pbmciCisjZGVmaW5lIExOX09DU1Bfc2lnbgkJIk9DU1AgU2lnbmluZyIKKyNkZWZpbmUgTklEX09DU1Bfc2lnbgkJMTgwCisjZGVmaW5lIE9CSl9PQ1NQX3NpZ24JCU9CSl9pZF9rcCw5TAorCisjZGVmaW5lIFNOX2R2Y3MJCSJEVkNTIgorI2RlZmluZSBMTl9kdmNzCQkiZHZjcyIKKyNkZWZpbmUgTklEX2R2Y3MJCTI5NworI2RlZmluZSBPQkpfZHZjcwkJT0JKX2lkX2twLDEwTAorCisjZGVmaW5lIFNOX2lkX2l0X2NhUHJvdEVuY0NlcnQJCSJpZC1pdC1jYVByb3RFbmNDZXJ0IgorI2RlZmluZSBOSURfaWRfaXRfY2FQcm90RW5jQ2VydAkJMjk4CisjZGVmaW5lIE9CSl9pZF9pdF9jYVByb3RFbmNDZXJ0CQlPQkpfaWRfaXQsMUwKKworI2RlZmluZSBTTl9pZF9pdF9zaWduS2V5UGFpclR5cGVzCQkiaWQtaXQtc2lnbktleVBhaXJUeXBlcyIKKyNkZWZpbmUgTklEX2lkX2l0X3NpZ25LZXlQYWlyVHlwZXMJCTI5OQorI2RlZmluZSBPQkpfaWRfaXRfc2lnbktleVBhaXJUeXBlcwkJT0JKX2lkX2l0LDJMCisKKyNkZWZpbmUgU05faWRfaXRfZW5jS2V5UGFpclR5cGVzCQkiaWQtaXQtZW5jS2V5UGFpclR5cGVzIgorI2RlZmluZSBOSURfaWRfaXRfZW5jS2V5UGFpclR5cGVzCQkzMDAKKyNkZWZpbmUgT0JKX2lkX2l0X2VuY0tleVBhaXJUeXBlcwkJT0JKX2lkX2l0LDNMCisKKyNkZWZpbmUgU05faWRfaXRfcHJlZmVycmVkU3ltbUFsZwkJImlkLWl0LXByZWZlcnJlZFN5bW1BbGciCisjZGVmaW5lIE5JRF9pZF9pdF9wcmVmZXJyZWRTeW1tQWxnCQkzMDEKKyNkZWZpbmUgT0JKX2lkX2l0X3ByZWZlcnJlZFN5bW1BbGcJCU9CSl9pZF9pdCw0TAorCisjZGVmaW5lIFNOX2lkX2l0X2NhS2V5VXBkYXRlSW5mbwkJImlkLWl0LWNhS2V5VXBkYXRlSW5mbyIKKyNkZWZpbmUgTklEX2lkX2l0X2NhS2V5VXBkYXRlSW5mbwkJMzAyCisjZGVmaW5lIE9CSl9pZF9pdF9jYUtleVVwZGF0ZUluZm8JCU9CSl9pZF9pdCw1TAorCisjZGVmaW5lIFNOX2lkX2l0X2N1cnJlbnRDUkwJCSJpZC1pdC1jdXJyZW50Q1JMIgorI2RlZmluZSBOSURfaWRfaXRfY3VycmVudENSTAkJMzAzCisjZGVmaW5lIE9CSl9pZF9pdF9jdXJyZW50Q1JMCQlPQkpfaWRfaXQsNkwKKworI2RlZmluZSBTTl9pZF9pdF91bnN1cHBvcnRlZE9JRHMJCSJpZC1pdC11bnN1cHBvcnRlZE9JRHMiCisjZGVmaW5lIE5JRF9pZF9pdF91bnN1cHBvcnRlZE9JRHMJCTMwNAorI2RlZmluZSBPQkpfaWRfaXRfdW5zdXBwb3J0ZWRPSURzCQlPQkpfaWRfaXQsN0wKKworI2RlZmluZSBTTl9pZF9pdF9zdWJzY3JpcHRpb25SZXF1ZXN0CQkiaWQtaXQtc3Vic2NyaXB0aW9uUmVxdWVzdCIKKyNkZWZpbmUgTklEX2lkX2l0X3N1YnNjcmlwdGlvblJlcXVlc3QJCTMwNQorI2RlZmluZSBPQkpfaWRfaXRfc3Vic2NyaXB0aW9uUmVxdWVzdAkJT0JKX2lkX2l0LDhMCisKKyNkZWZpbmUgU05faWRfaXRfc3Vic2NyaXB0aW9uUmVzcG9uc2UJCSJpZC1pdC1zdWJzY3JpcHRpb25SZXNwb25zZSIKKyNkZWZpbmUgTklEX2lkX2l0X3N1YnNjcmlwdGlvblJlc3BvbnNlCQkzMDYKKyNkZWZpbmUgT0JKX2lkX2l0X3N1YnNjcmlwdGlvblJlc3BvbnNlCQlPQkpfaWRfaXQsOUwKKworI2RlZmluZSBTTl9pZF9pdF9rZXlQYWlyUGFyYW1SZXEJCSJpZC1pdC1rZXlQYWlyUGFyYW1SZXEiCisjZGVmaW5lIE5JRF9pZF9pdF9rZXlQYWlyUGFyYW1SZXEJCTMwNworI2RlZmluZSBPQkpfaWRfaXRfa2V5UGFpclBhcmFtUmVxCQlPQkpfaWRfaXQsMTBMCisKKyNkZWZpbmUgU05faWRfaXRfa2V5UGFpclBhcmFtUmVwCQkiaWQtaXQta2V5UGFpclBhcmFtUmVwIgorI2RlZmluZSBOSURfaWRfaXRfa2V5UGFpclBhcmFtUmVwCQkzMDgKKyNkZWZpbmUgT0JKX2lkX2l0X2tleVBhaXJQYXJhbVJlcAkJT0JKX2lkX2l0LDExTAorCisjZGVmaW5lIFNOX2lkX2l0X3JldlBhc3NwaHJhc2UJCSJpZC1pdC1yZXZQYXNzcGhyYXNlIgorI2RlZmluZSBOSURfaWRfaXRfcmV2UGFzc3BocmFzZQkJMzA5CisjZGVmaW5lIE9CSl9pZF9pdF9yZXZQYXNzcGhyYXNlCQlPQkpfaWRfaXQsMTJMCisKKyNkZWZpbmUgU05faWRfaXRfaW1wbGljaXRDb25maXJtCQkiaWQtaXQtaW1wbGljaXRDb25maXJtIgorI2RlZmluZSBOSURfaWRfaXRfaW1wbGljaXRDb25maXJtCQkzMTAKKyNkZWZpbmUgT0JKX2lkX2l0X2ltcGxpY2l0Q29uZmlybQkJT0JKX2lkX2l0LDEzTAorCisjZGVmaW5lIFNOX2lkX2l0X2NvbmZpcm1XYWl0VGltZQkJImlkLWl0LWNvbmZpcm1XYWl0VGltZSIKKyNkZWZpbmUgTklEX2lkX2l0X2NvbmZpcm1XYWl0VGltZQkJMzExCisjZGVmaW5lIE9CSl9pZF9pdF9jb25maXJtV2FpdFRpbWUJCU9CSl9pZF9pdCwxNEwKKworI2RlZmluZSBTTl9pZF9pdF9vcmlnUEtJTWVzc2FnZQkJImlkLWl0LW9yaWdQS0lNZXNzYWdlIgorI2RlZmluZSBOSURfaWRfaXRfb3JpZ1BLSU1lc3NhZ2UJCTMxMgorI2RlZmluZSBPQkpfaWRfaXRfb3JpZ1BLSU1lc3NhZ2UJCU9CSl9pZF9pdCwxNUwKKworI2RlZmluZSBTTl9pZF9pdF9zdXBwTGFuZ1RhZ3MJCSJpZC1pdC1zdXBwTGFuZ1RhZ3MiCisjZGVmaW5lIE5JRF9pZF9pdF9zdXBwTGFuZ1RhZ3MJCTc4NAorI2RlZmluZSBPQkpfaWRfaXRfc3VwcExhbmdUYWdzCQlPQkpfaWRfaXQsMTZMCisKKyNkZWZpbmUgU05faWRfcmVnQ3RybAkJImlkLXJlZ0N0cmwiCisjZGVmaW5lIE5JRF9pZF9yZWdDdHJsCQkzMTMKKyNkZWZpbmUgT0JKX2lkX3JlZ0N0cmwJCU9CSl9pZF9wa2lwLDFMCisKKyNkZWZpbmUgU05faWRfcmVnSW5mbwkJImlkLXJlZ0luZm8iCisjZGVmaW5lIE5JRF9pZF9yZWdJbmZvCQkzMTQKKyNkZWZpbmUgT0JKX2lkX3JlZ0luZm8JCU9CSl9pZF9wa2lwLDJMCisKKyNkZWZpbmUgU05faWRfcmVnQ3RybF9yZWdUb2tlbgkJImlkLXJlZ0N0cmwtcmVnVG9rZW4iCisjZGVmaW5lIE5JRF9pZF9yZWdDdHJsX3JlZ1Rva2VuCQkzMTUKKyNkZWZpbmUgT0JKX2lkX3JlZ0N0cmxfcmVnVG9rZW4JCU9CSl9pZF9yZWdDdHJsLDFMCisKKyNkZWZpbmUgU05faWRfcmVnQ3RybF9hdXRoZW50aWNhdG9yCQkiaWQtcmVnQ3RybC1hdXRoZW50aWNhdG9yIgorI2RlZmluZSBOSURfaWRfcmVnQ3RybF9hdXRoZW50aWNhdG9yCQkzMTYKKyNkZWZpbmUgT0JKX2lkX3JlZ0N0cmxfYXV0aGVudGljYXRvcgkJT0JKX2lkX3JlZ0N0cmwsMkwKKworI2RlZmluZSBTTl9pZF9yZWdDdHJsX3BraVB1YmxpY2F0aW9uSW5mbwkJImlkLXJlZ0N0cmwtcGtpUHVibGljYXRpb25JbmZvIgorI2RlZmluZSBOSURfaWRfcmVnQ3RybF9wa2lQdWJsaWNhdGlvbkluZm8JCTMxNworI2RlZmluZSBPQkpfaWRfcmVnQ3RybF9wa2lQdWJsaWNhdGlvbkluZm8JCU9CSl9pZF9yZWdDdHJsLDNMCisKKyNkZWZpbmUgU05faWRfcmVnQ3RybF9wa2lBcmNoaXZlT3B0aW9ucwkJImlkLXJlZ0N0cmwtcGtpQXJjaGl2ZU9wdGlvbnMiCisjZGVmaW5lIE5JRF9pZF9yZWdDdHJsX3BraUFyY2hpdmVPcHRpb25zCQkzMTgKKyNkZWZpbmUgT0JKX2lkX3JlZ0N0cmxfcGtpQXJjaGl2ZU9wdGlvbnMJCU9CSl9pZF9yZWdDdHJsLDRMCisKKyNkZWZpbmUgU05faWRfcmVnQ3RybF9vbGRDZXJ0SUQJCSJpZC1yZWdDdHJsLW9sZENlcnRJRCIKKyNkZWZpbmUgTklEX2lkX3JlZ0N0cmxfb2xkQ2VydElECQkzMTkKKyNkZWZpbmUgT0JKX2lkX3JlZ0N0cmxfb2xkQ2VydElECQlPQkpfaWRfcmVnQ3RybCw1TAorCisjZGVmaW5lIFNOX2lkX3JlZ0N0cmxfcHJvdG9jb2xFbmNyS2V5CQkiaWQtcmVnQ3RybC1wcm90b2NvbEVuY3JLZXkiCisjZGVmaW5lIE5JRF9pZF9yZWdDdHJsX3Byb3RvY29sRW5jcktleQkJMzIwCisjZGVmaW5lIE9CSl9pZF9yZWdDdHJsX3Byb3RvY29sRW5jcktleQkJT0JKX2lkX3JlZ0N0cmwsNkwKKworI2RlZmluZSBTTl9pZF9yZWdJbmZvX3V0ZjhQYWlycwkJImlkLXJlZ0luZm8tdXRmOFBhaXJzIgorI2RlZmluZSBOSURfaWRfcmVnSW5mb191dGY4UGFpcnMJCTMyMQorI2RlZmluZSBPQkpfaWRfcmVnSW5mb191dGY4UGFpcnMJCU9CSl9pZF9yZWdJbmZvLDFMCisKKyNkZWZpbmUgU05faWRfcmVnSW5mb19jZXJ0UmVxCQkiaWQtcmVnSW5mby1jZXJ0UmVxIgorI2RlZmluZSBOSURfaWRfcmVnSW5mb19jZXJ0UmVxCQkzMjIKKyNkZWZpbmUgT0JKX2lkX3JlZ0luZm9fY2VydFJlcQkJT0JKX2lkX3JlZ0luZm8sMkwKKworI2RlZmluZSBTTl9pZF9hbGdfZGVzNDAJCSJpZC1hbGctZGVzNDAiCisjZGVmaW5lIE5JRF9pZF9hbGdfZGVzNDAJCTMyMworI2RlZmluZSBPQkpfaWRfYWxnX2RlczQwCQlPQkpfaWRfYWxnLDFMCisKKyNkZWZpbmUgU05faWRfYWxnX25vU2lnbmF0dXJlCQkiaWQtYWxnLW5vU2lnbmF0dXJlIgorI2RlZmluZSBOSURfaWRfYWxnX25vU2lnbmF0dXJlCQkzMjQKKyNkZWZpbmUgT0JKX2lkX2FsZ19ub1NpZ25hdHVyZQkJT0JKX2lkX2FsZywyTAorCisjZGVmaW5lIFNOX2lkX2FsZ19kaF9zaWdfaG1hY19zaGExCQkiaWQtYWxnLWRoLXNpZy1obWFjLXNoYTEiCisjZGVmaW5lIE5JRF9pZF9hbGdfZGhfc2lnX2htYWNfc2hhMQkJMzI1CisjZGVmaW5lIE9CSl9pZF9hbGdfZGhfc2lnX2htYWNfc2hhMQkJT0JKX2lkX2FsZywzTAorCisjZGVmaW5lIFNOX2lkX2FsZ19kaF9wb3AJCSJpZC1hbGctZGgtcG9wIgorI2RlZmluZSBOSURfaWRfYWxnX2RoX3BvcAkJMzI2CisjZGVmaW5lIE9CSl9pZF9hbGdfZGhfcG9wCQlPQkpfaWRfYWxnLDRMCisKKyNkZWZpbmUgU05faWRfY21jX3N0YXR1c0luZm8JCSJpZC1jbWMtc3RhdHVzSW5mbyIKKyNkZWZpbmUgTklEX2lkX2NtY19zdGF0dXNJbmZvCQkzMjcKKyNkZWZpbmUgT0JKX2lkX2NtY19zdGF0dXNJbmZvCQlPQkpfaWRfY21jLDFMCisKKyNkZWZpbmUgU05faWRfY21jX2lkZW50aWZpY2F0aW9uCQkiaWQtY21jLWlkZW50aWZpY2F0aW9uIgorI2RlZmluZSBOSURfaWRfY21jX2lkZW50aWZpY2F0aW9uCQkzMjgKKyNkZWZpbmUgT0JKX2lkX2NtY19pZGVudGlmaWNhdGlvbgkJT0JKX2lkX2NtYywyTAorCisjZGVmaW5lIFNOX2lkX2NtY19pZGVudGl0eVByb29mCQkiaWQtY21jLWlkZW50aXR5UHJvb2YiCisjZGVmaW5lIE5JRF9pZF9jbWNfaWRlbnRpdHlQcm9vZgkJMzI5CisjZGVmaW5lIE9CSl9pZF9jbWNfaWRlbnRpdHlQcm9vZgkJT0JKX2lkX2NtYywzTAorCisjZGVmaW5lIFNOX2lkX2NtY19kYXRhUmV0dXJuCQkiaWQtY21jLWRhdGFSZXR1cm4iCisjZGVmaW5lIE5JRF9pZF9jbWNfZGF0YVJldHVybgkJMzMwCisjZGVmaW5lIE9CSl9pZF9jbWNfZGF0YVJldHVybgkJT0JKX2lkX2NtYyw0TAorCisjZGVmaW5lIFNOX2lkX2NtY190cmFuc2FjdGlvbklkCQkiaWQtY21jLXRyYW5zYWN0aW9uSWQiCisjZGVmaW5lIE5JRF9pZF9jbWNfdHJhbnNhY3Rpb25JZAkJMzMxCisjZGVmaW5lIE9CSl9pZF9jbWNfdHJhbnNhY3Rpb25JZAkJT0JKX2lkX2NtYyw1TAorCisjZGVmaW5lIFNOX2lkX2NtY19zZW5kZXJOb25jZQkJImlkLWNtYy1zZW5kZXJOb25jZSIKKyNkZWZpbmUgTklEX2lkX2NtY19zZW5kZXJOb25jZQkJMzMyCisjZGVmaW5lIE9CSl9pZF9jbWNfc2VuZGVyTm9uY2UJCU9CSl9pZF9jbWMsNkwKKworI2RlZmluZSBTTl9pZF9jbWNfcmVjaXBpZW50Tm9uY2UJCSJpZC1jbWMtcmVjaXBpZW50Tm9uY2UiCisjZGVmaW5lIE5JRF9pZF9jbWNfcmVjaXBpZW50Tm9uY2UJCTMzMworI2RlZmluZSBPQkpfaWRfY21jX3JlY2lwaWVudE5vbmNlCQlPQkpfaWRfY21jLDdMCisKKyNkZWZpbmUgU05faWRfY21jX2FkZEV4dGVuc2lvbnMJCSJpZC1jbWMtYWRkRXh0ZW5zaW9ucyIKKyNkZWZpbmUgTklEX2lkX2NtY19hZGRFeHRlbnNpb25zCQkzMzQKKyNkZWZpbmUgT0JKX2lkX2NtY19hZGRFeHRlbnNpb25zCQlPQkpfaWRfY21jLDhMCisKKyNkZWZpbmUgU05faWRfY21jX2VuY3J5cHRlZFBPUAkJImlkLWNtYy1lbmNyeXB0ZWRQT1AiCisjZGVmaW5lIE5JRF9pZF9jbWNfZW5jcnlwdGVkUE9QCQkzMzUKKyNkZWZpbmUgT0JKX2lkX2NtY19lbmNyeXB0ZWRQT1AJCU9CSl9pZF9jbWMsOUwKKworI2RlZmluZSBTTl9pZF9jbWNfZGVjcnlwdGVkUE9QCQkiaWQtY21jLWRlY3J5cHRlZFBPUCIKKyNkZWZpbmUgTklEX2lkX2NtY19kZWNyeXB0ZWRQT1AJCTMzNgorI2RlZmluZSBPQkpfaWRfY21jX2RlY3J5cHRlZFBPUAkJT0JKX2lkX2NtYywxMEwKKworI2RlZmluZSBTTl9pZF9jbWNfbHJhUE9QV2l0bmVzcwkJImlkLWNtYy1scmFQT1BXaXRuZXNzIgorI2RlZmluZSBOSURfaWRfY21jX2xyYVBPUFdpdG5lc3MJCTMzNworI2RlZmluZSBPQkpfaWRfY21jX2xyYVBPUFdpdG5lc3MJCU9CSl9pZF9jbWMsMTFMCisKKyNkZWZpbmUgU05faWRfY21jX2dldENlcnQJCSJpZC1jbWMtZ2V0Q2VydCIKKyNkZWZpbmUgTklEX2lkX2NtY19nZXRDZXJ0CQkzMzgKKyNkZWZpbmUgT0JKX2lkX2NtY19nZXRDZXJ0CQlPQkpfaWRfY21jLDE1TAorCisjZGVmaW5lIFNOX2lkX2NtY19nZXRDUkwJCSJpZC1jbWMtZ2V0Q1JMIgorI2RlZmluZSBOSURfaWRfY21jX2dldENSTAkJMzM5CisjZGVmaW5lIE9CSl9pZF9jbWNfZ2V0Q1JMCQlPQkpfaWRfY21jLDE2TAorCisjZGVmaW5lIFNOX2lkX2NtY19yZXZva2VSZXF1ZXN0CQkiaWQtY21jLXJldm9rZVJlcXVlc3QiCisjZGVmaW5lIE5JRF9pZF9jbWNfcmV2b2tlUmVxdWVzdAkJMzQwCisjZGVmaW5lIE9CSl9pZF9jbWNfcmV2b2tlUmVxdWVzdAkJT0JKX2lkX2NtYywxN0wKKworI2RlZmluZSBTTl9pZF9jbWNfcmVnSW5mbwkJImlkLWNtYy1yZWdJbmZvIgorI2RlZmluZSBOSURfaWRfY21jX3JlZ0luZm8JCTM0MQorI2RlZmluZSBPQkpfaWRfY21jX3JlZ0luZm8JCU9CSl9pZF9jbWMsMThMCisKKyNkZWZpbmUgU05faWRfY21jX3Jlc3BvbnNlSW5mbwkJImlkLWNtYy1yZXNwb25zZUluZm8iCisjZGVmaW5lIE5JRF9pZF9jbWNfcmVzcG9uc2VJbmZvCQkzNDIKKyNkZWZpbmUgT0JKX2lkX2NtY19yZXNwb25zZUluZm8JCU9CSl9pZF9jbWMsMTlMCisKKyNkZWZpbmUgU05faWRfY21jX3F1ZXJ5UGVuZGluZwkJImlkLWNtYy1xdWVyeVBlbmRpbmciCisjZGVmaW5lIE5JRF9pZF9jbWNfcXVlcnlQZW5kaW5nCQkzNDMKKyNkZWZpbmUgT0JKX2lkX2NtY19xdWVyeVBlbmRpbmcJCU9CSl9pZF9jbWMsMjFMCisKKyNkZWZpbmUgU05faWRfY21jX3BvcExpbmtSYW5kb20JCSJpZC1jbWMtcG9wTGlua1JhbmRvbSIKKyNkZWZpbmUgTklEX2lkX2NtY19wb3BMaW5rUmFuZG9tCQkzNDQKKyNkZWZpbmUgT0JKX2lkX2NtY19wb3BMaW5rUmFuZG9tCQlPQkpfaWRfY21jLDIyTAorCisjZGVmaW5lIFNOX2lkX2NtY19wb3BMaW5rV2l0bmVzcwkJImlkLWNtYy1wb3BMaW5rV2l0bmVzcyIKKyNkZWZpbmUgTklEX2lkX2NtY19wb3BMaW5rV2l0bmVzcwkJMzQ1CisjZGVmaW5lIE9CSl9pZF9jbWNfcG9wTGlua1dpdG5lc3MJCU9CSl9pZF9jbWMsMjNMCisKKyNkZWZpbmUgU05faWRfY21jX2NvbmZpcm1DZXJ0QWNjZXB0YW5jZQkJImlkLWNtYy1jb25maXJtQ2VydEFjY2VwdGFuY2UiCisjZGVmaW5lIE5JRF9pZF9jbWNfY29uZmlybUNlcnRBY2NlcHRhbmNlCQkzNDYKKyNkZWZpbmUgT0JKX2lkX2NtY19jb25maXJtQ2VydEFjY2VwdGFuY2UJCU9CSl9pZF9jbWMsMjRMCisKKyNkZWZpbmUgU05faWRfb25fcGVyc29uYWxEYXRhCQkiaWQtb24tcGVyc29uYWxEYXRhIgorI2RlZmluZSBOSURfaWRfb25fcGVyc29uYWxEYXRhCQkzNDcKKyNkZWZpbmUgT0JKX2lkX29uX3BlcnNvbmFsRGF0YQkJT0JKX2lkX29uLDFMCisKKyNkZWZpbmUgU05faWRfb25fcGVybWFuZW50SWRlbnRpZmllcgkJImlkLW9uLXBlcm1hbmVudElkZW50aWZpZXIiCisjZGVmaW5lIExOX2lkX29uX3Blcm1hbmVudElkZW50aWZpZXIJCSJQZXJtYW5lbnQgSWRlbnRpZmllciIKKyNkZWZpbmUgTklEX2lkX29uX3Blcm1hbmVudElkZW50aWZpZXIJCTg1OAorI2RlZmluZSBPQkpfaWRfb25fcGVybWFuZW50SWRlbnRpZmllcgkJT0JKX2lkX29uLDNMCisKKyNkZWZpbmUgU05faWRfcGRhX2RhdGVPZkJpcnRoCQkiaWQtcGRhLWRhdGVPZkJpcnRoIgorI2RlZmluZSBOSURfaWRfcGRhX2RhdGVPZkJpcnRoCQkzNDgKKyNkZWZpbmUgT0JKX2lkX3BkYV9kYXRlT2ZCaXJ0aAkJT0JKX2lkX3BkYSwxTAorCisjZGVmaW5lIFNOX2lkX3BkYV9wbGFjZU9mQmlydGgJCSJpZC1wZGEtcGxhY2VPZkJpcnRoIgorI2RlZmluZSBOSURfaWRfcGRhX3BsYWNlT2ZCaXJ0aAkJMzQ5CisjZGVmaW5lIE9CSl9pZF9wZGFfcGxhY2VPZkJpcnRoCQlPQkpfaWRfcGRhLDJMCisKKyNkZWZpbmUgU05faWRfcGRhX2dlbmRlcgkJImlkLXBkYS1nZW5kZXIiCisjZGVmaW5lIE5JRF9pZF9wZGFfZ2VuZGVyCQkzNTEKKyNkZWZpbmUgT0JKX2lkX3BkYV9nZW5kZXIJCU9CSl9pZF9wZGEsM0wKKworI2RlZmluZSBTTl9pZF9wZGFfY291bnRyeU9mQ2l0aXplbnNoaXAJCSJpZC1wZGEtY291bnRyeU9mQ2l0aXplbnNoaXAiCisjZGVmaW5lIE5JRF9pZF9wZGFfY291bnRyeU9mQ2l0aXplbnNoaXAJCTM1MgorI2RlZmluZSBPQkpfaWRfcGRhX2NvdW50cnlPZkNpdGl6ZW5zaGlwCQlPQkpfaWRfcGRhLDRMCisKKyNkZWZpbmUgU05faWRfcGRhX2NvdW50cnlPZlJlc2lkZW5jZQkJImlkLXBkYS1jb3VudHJ5T2ZSZXNpZGVuY2UiCisjZGVmaW5lIE5JRF9pZF9wZGFfY291bnRyeU9mUmVzaWRlbmNlCQkzNTMKKyNkZWZpbmUgT0JKX2lkX3BkYV9jb3VudHJ5T2ZSZXNpZGVuY2UJCU9CSl9pZF9wZGEsNUwKKworI2RlZmluZSBTTl9pZF9hY2FfYXV0aGVudGljYXRpb25JbmZvCQkiaWQtYWNhLWF1dGhlbnRpY2F0aW9uSW5mbyIKKyNkZWZpbmUgTklEX2lkX2FjYV9hdXRoZW50aWNhdGlvbkluZm8JCTM1NAorI2RlZmluZSBPQkpfaWRfYWNhX2F1dGhlbnRpY2F0aW9uSW5mbwkJT0JKX2lkX2FjYSwxTAorCisjZGVmaW5lIFNOX2lkX2FjYV9hY2Nlc3NJZGVudGl0eQkJImlkLWFjYS1hY2Nlc3NJZGVudGl0eSIKKyNkZWZpbmUgTklEX2lkX2FjYV9hY2Nlc3NJZGVudGl0eQkJMzU1CisjZGVmaW5lIE9CSl9pZF9hY2FfYWNjZXNzSWRlbnRpdHkJCU9CSl9pZF9hY2EsMkwKKworI2RlZmluZSBTTl9pZF9hY2FfY2hhcmdpbmdJZGVudGl0eQkJImlkLWFjYS1jaGFyZ2luZ0lkZW50aXR5IgorI2RlZmluZSBOSURfaWRfYWNhX2NoYXJnaW5nSWRlbnRpdHkJCTM1NgorI2RlZmluZSBPQkpfaWRfYWNhX2NoYXJnaW5nSWRlbnRpdHkJCU9CSl9pZF9hY2EsM0wKKworI2RlZmluZSBTTl9pZF9hY2FfZ3JvdXAJCSJpZC1hY2EtZ3JvdXAiCisjZGVmaW5lIE5JRF9pZF9hY2FfZ3JvdXAJCTM1NworI2RlZmluZSBPQkpfaWRfYWNhX2dyb3VwCQlPQkpfaWRfYWNhLDRMCisKKyNkZWZpbmUgU05faWRfYWNhX3JvbGUJCSJpZC1hY2Etcm9sZSIKKyNkZWZpbmUgTklEX2lkX2FjYV9yb2xlCQkzNTgKKyNkZWZpbmUgT0JKX2lkX2FjYV9yb2xlCQlPQkpfaWRfYWNhLDVMCisKKyNkZWZpbmUgU05faWRfYWNhX2VuY0F0dHJzCQkiaWQtYWNhLWVuY0F0dHJzIgorI2RlZmluZSBOSURfaWRfYWNhX2VuY0F0dHJzCQkzOTkKKyNkZWZpbmUgT0JKX2lkX2FjYV9lbmNBdHRycwkJT0JKX2lkX2FjYSw2TAorCisjZGVmaW5lIFNOX2lkX3Fjc19wa2l4UUNTeW50YXhfdjEJCSJpZC1xY3MtcGtpeFFDU3ludGF4LXYxIgorI2RlZmluZSBOSURfaWRfcWNzX3BraXhRQ1N5bnRheF92MQkJMzU5CisjZGVmaW5lIE9CSl9pZF9xY3NfcGtpeFFDU3ludGF4X3YxCQlPQkpfaWRfcWNzLDFMCisKKyNkZWZpbmUgU05faWRfY2N0X2NycwkJImlkLWNjdC1jcnMiCisjZGVmaW5lIE5JRF9pZF9jY3RfY3JzCQkzNjAKKyNkZWZpbmUgT0JKX2lkX2NjdF9jcnMJCU9CSl9pZF9jY3QsMUwKKworI2RlZmluZSBTTl9pZF9jY3RfUEtJRGF0YQkJImlkLWNjdC1QS0lEYXRhIgorI2RlZmluZSBOSURfaWRfY2N0X1BLSURhdGEJCTM2MQorI2RlZmluZSBPQkpfaWRfY2N0X1BLSURhdGEJCU9CSl9pZF9jY3QsMkwKKworI2RlZmluZSBTTl9pZF9jY3RfUEtJUmVzcG9uc2UJCSJpZC1jY3QtUEtJUmVzcG9uc2UiCisjZGVmaW5lIE5JRF9pZF9jY3RfUEtJUmVzcG9uc2UJCTM2MgorI2RlZmluZSBPQkpfaWRfY2N0X1BLSVJlc3BvbnNlCQlPQkpfaWRfY2N0LDNMCisKKyNkZWZpbmUgU05faWRfcHBsX2FueUxhbmd1YWdlCQkiaWQtcHBsLWFueUxhbmd1YWdlIgorI2RlZmluZSBMTl9pZF9wcGxfYW55TGFuZ3VhZ2UJCSJBbnkgbGFuZ3VhZ2UiCisjZGVmaW5lIE5JRF9pZF9wcGxfYW55TGFuZ3VhZ2UJCTY2NAorI2RlZmluZSBPQkpfaWRfcHBsX2FueUxhbmd1YWdlCQlPQkpfaWRfcHBsLDBMCisKKyNkZWZpbmUgU05faWRfcHBsX2luaGVyaXRBbGwJCSJpZC1wcGwtaW5oZXJpdEFsbCIKKyNkZWZpbmUgTE5faWRfcHBsX2luaGVyaXRBbGwJCSJJbmhlcml0IGFsbCIKKyNkZWZpbmUgTklEX2lkX3BwbF9pbmhlcml0QWxsCQk2NjUKKyNkZWZpbmUgT0JKX2lkX3BwbF9pbmhlcml0QWxsCQlPQkpfaWRfcHBsLDFMCisKKyNkZWZpbmUgU05fSW5kZXBlbmRlbnQJCSJpZC1wcGwtaW5kZXBlbmRlbnQiCisjZGVmaW5lIExOX0luZGVwZW5kZW50CQkiSW5kZXBlbmRlbnQiCisjZGVmaW5lIE5JRF9JbmRlcGVuZGVudAkJNjY3CisjZGVmaW5lIE9CSl9JbmRlcGVuZGVudAkJT0JKX2lkX3BwbCwyTAorCisjZGVmaW5lIFNOX2FkX09DU1AJCSJPQ1NQIgorI2RlZmluZSBMTl9hZF9PQ1NQCQkiT0NTUCIKKyNkZWZpbmUgTklEX2FkX09DU1AJCTE3OAorI2RlZmluZSBPQkpfYWRfT0NTUAkJT0JKX2lkX2FkLDFMCisKKyNkZWZpbmUgU05fYWRfY2FfaXNzdWVycwkJImNhSXNzdWVycyIKKyNkZWZpbmUgTE5fYWRfY2FfaXNzdWVycwkJIkNBIElzc3VlcnMiCisjZGVmaW5lIE5JRF9hZF9jYV9pc3N1ZXJzCQkxNzkKKyNkZWZpbmUgT0JKX2FkX2NhX2lzc3VlcnMJCU9CSl9pZF9hZCwyTAorCisjZGVmaW5lIFNOX2FkX3RpbWVTdGFtcGluZwkJImFkX3RpbWVzdGFtcGluZyIKKyNkZWZpbmUgTE5fYWRfdGltZVN0YW1waW5nCQkiQUQgVGltZSBTdGFtcGluZyIKKyNkZWZpbmUgTklEX2FkX3RpbWVTdGFtcGluZwkJMzYzCisjZGVmaW5lIE9CSl9hZF90aW1lU3RhbXBpbmcJCU9CSl9pZF9hZCwzTAorCisjZGVmaW5lIFNOX2FkX2R2Y3MJCSJBRF9EVkNTIgorI2RlZmluZSBMTl9hZF9kdmNzCQkiYWQgZHZjcyIKKyNkZWZpbmUgTklEX2FkX2R2Y3MJCTM2NAorI2RlZmluZSBPQkpfYWRfZHZjcwkJT0JKX2lkX2FkLDRMCisKKyNkZWZpbmUgU05fY2FSZXBvc2l0b3J5CQkiY2FSZXBvc2l0b3J5IgorI2RlZmluZSBMTl9jYVJlcG9zaXRvcnkJCSJDQSBSZXBvc2l0b3J5IgorI2RlZmluZSBOSURfY2FSZXBvc2l0b3J5CQk3ODUKKyNkZWZpbmUgT0JKX2NhUmVwb3NpdG9yeQkJT0JKX2lkX2FkLDVMCisKKyNkZWZpbmUgT0JKX2lkX3BraXhfT0NTUAkJT0JKX2FkX09DU1AKKworI2RlZmluZSBTTl9pZF9wa2l4X09DU1BfYmFzaWMJCSJiYXNpY09DU1BSZXNwb25zZSIKKyNkZWZpbmUgTE5faWRfcGtpeF9PQ1NQX2Jhc2ljCQkiQmFzaWMgT0NTUCBSZXNwb25zZSIKKyNkZWZpbmUgTklEX2lkX3BraXhfT0NTUF9iYXNpYwkJMzY1CisjZGVmaW5lIE9CSl9pZF9wa2l4X09DU1BfYmFzaWMJCU9CSl9pZF9wa2l4X09DU1AsMUwKKworI2RlZmluZSBTTl9pZF9wa2l4X09DU1BfTm9uY2UJCSJOb25jZSIKKyNkZWZpbmUgTE5faWRfcGtpeF9PQ1NQX05vbmNlCQkiT0NTUCBOb25jZSIKKyNkZWZpbmUgTklEX2lkX3BraXhfT0NTUF9Ob25jZQkJMzY2CisjZGVmaW5lIE9CSl9pZF9wa2l4X09DU1BfTm9uY2UJCU9CSl9pZF9wa2l4X09DU1AsMkwKKworI2RlZmluZSBTTl9pZF9wa2l4X09DU1BfQ3JsSUQJCSJDcmxJRCIKKyNkZWZpbmUgTE5faWRfcGtpeF9PQ1NQX0NybElECQkiT0NTUCBDUkwgSUQiCisjZGVmaW5lIE5JRF9pZF9wa2l4X09DU1BfQ3JsSUQJCTM2NworI2RlZmluZSBPQkpfaWRfcGtpeF9PQ1NQX0NybElECQlPQkpfaWRfcGtpeF9PQ1NQLDNMCisKKyNkZWZpbmUgU05faWRfcGtpeF9PQ1NQX2FjY2VwdGFibGVSZXNwb25zZXMJCSJhY2NlcHRhYmxlUmVzcG9uc2VzIgorI2RlZmluZSBMTl9pZF9wa2l4X09DU1BfYWNjZXB0YWJsZVJlc3BvbnNlcwkJIkFjY2VwdGFibGUgT0NTUCBSZXNwb25zZXMiCisjZGVmaW5lIE5JRF9pZF9wa2l4X09DU1BfYWNjZXB0YWJsZVJlc3BvbnNlcwkJMzY4CisjZGVmaW5lIE9CSl9pZF9wa2l4X09DU1BfYWNjZXB0YWJsZVJlc3BvbnNlcwkJT0JKX2lkX3BraXhfT0NTUCw0TAorCisjZGVmaW5lIFNOX2lkX3BraXhfT0NTUF9ub0NoZWNrCQkibm9DaGVjayIKKyNkZWZpbmUgTE5faWRfcGtpeF9PQ1NQX25vQ2hlY2sJCSJPQ1NQIE5vIENoZWNrIgorI2RlZmluZSBOSURfaWRfcGtpeF9PQ1NQX25vQ2hlY2sJCTM2OQorI2RlZmluZSBPQkpfaWRfcGtpeF9PQ1NQX25vQ2hlY2sJCU9CSl9pZF9wa2l4X09DU1AsNUwKKworI2RlZmluZSBTTl9pZF9wa2l4X09DU1BfYXJjaGl2ZUN1dG9mZgkJImFyY2hpdmVDdXRvZmYiCisjZGVmaW5lIExOX2lkX3BraXhfT0NTUF9hcmNoaXZlQ3V0b2ZmCQkiT0NTUCBBcmNoaXZlIEN1dG9mZiIKKyNkZWZpbmUgTklEX2lkX3BraXhfT0NTUF9hcmNoaXZlQ3V0b2ZmCQkzNzAKKyNkZWZpbmUgT0JKX2lkX3BraXhfT0NTUF9hcmNoaXZlQ3V0b2ZmCQlPQkpfaWRfcGtpeF9PQ1NQLDZMCisKKyNkZWZpbmUgU05faWRfcGtpeF9PQ1NQX3NlcnZpY2VMb2NhdG9yCQkic2VydmljZUxvY2F0b3IiCisjZGVmaW5lIExOX2lkX3BraXhfT0NTUF9zZXJ2aWNlTG9jYXRvcgkJIk9DU1AgU2VydmljZSBMb2NhdG9yIgorI2RlZmluZSBOSURfaWRfcGtpeF9PQ1NQX3NlcnZpY2VMb2NhdG9yCQkzNzEKKyNkZWZpbmUgT0JKX2lkX3BraXhfT0NTUF9zZXJ2aWNlTG9jYXRvcgkJT0JKX2lkX3BraXhfT0NTUCw3TAorCisjZGVmaW5lIFNOX2lkX3BraXhfT0NTUF9leHRlbmRlZFN0YXR1cwkJImV4dGVuZGVkU3RhdHVzIgorI2RlZmluZSBMTl9pZF9wa2l4X09DU1BfZXh0ZW5kZWRTdGF0dXMJCSJFeHRlbmRlZCBPQ1NQIFN0YXR1cyIKKyNkZWZpbmUgTklEX2lkX3BraXhfT0NTUF9leHRlbmRlZFN0YXR1cwkJMzcyCisjZGVmaW5lIE9CSl9pZF9wa2l4X09DU1BfZXh0ZW5kZWRTdGF0dXMJCU9CSl9pZF9wa2l4X09DU1AsOEwKKworI2RlZmluZSBTTl9pZF9wa2l4X09DU1BfdmFsaWQJCSJ2YWxpZCIKKyNkZWZpbmUgTklEX2lkX3BraXhfT0NTUF92YWxpZAkJMzczCisjZGVmaW5lIE9CSl9pZF9wa2l4X09DU1BfdmFsaWQJCU9CSl9pZF9wa2l4X09DU1AsOUwKKworI2RlZmluZSBTTl9pZF9wa2l4X09DU1BfcGF0aAkJInBhdGgiCisjZGVmaW5lIE5JRF9pZF9wa2l4X09DU1BfcGF0aAkJMzc0CisjZGVmaW5lIE9CSl9pZF9wa2l4X09DU1BfcGF0aAkJT0JKX2lkX3BraXhfT0NTUCwxMEwKKworI2RlZmluZSBTTl9pZF9wa2l4X09DU1BfdHJ1c3RSb290CQkidHJ1c3RSb290IgorI2RlZmluZSBMTl9pZF9wa2l4X09DU1BfdHJ1c3RSb290CQkiVHJ1c3QgUm9vdCIKKyNkZWZpbmUgTklEX2lkX3BraXhfT0NTUF90cnVzdFJvb3QJCTM3NQorI2RlZmluZSBPQkpfaWRfcGtpeF9PQ1NQX3RydXN0Um9vdAkJT0JKX2lkX3BraXhfT0NTUCwxMUwKKworI2RlZmluZSBTTl9hbGdvcml0aG0JCSJhbGdvcml0aG0iCisjZGVmaW5lIExOX2FsZ29yaXRobQkJImFsZ29yaXRobSIKKyNkZWZpbmUgTklEX2FsZ29yaXRobQkJMzc2CisjZGVmaW5lIE9CSl9hbGdvcml0aG0JCTFMLDNMLDE0TCwzTCwyTAorCisjZGVmaW5lIFNOX21kNVdpdGhSU0EJCSJSU0EtTlAtTUQ1IgorI2RlZmluZSBMTl9tZDVXaXRoUlNBCQkibWQ1V2l0aFJTQSIKKyNkZWZpbmUgTklEX21kNVdpdGhSU0EJCTEwNAorI2RlZmluZSBPQkpfbWQ1V2l0aFJTQQkJT0JKX2FsZ29yaXRobSwzTAorCisjZGVmaW5lIFNOX2Rlc19lY2IJCSJERVMtRUNCIgorI2RlZmluZSBMTl9kZXNfZWNiCQkiZGVzLWVjYiIKKyNkZWZpbmUgTklEX2Rlc19lY2IJCTI5CisjZGVmaW5lIE9CSl9kZXNfZWNiCQlPQkpfYWxnb3JpdGhtLDZMCisKKyNkZWZpbmUgU05fZGVzX2NiYwkJIkRFUy1DQkMiCisjZGVmaW5lIExOX2Rlc19jYmMJCSJkZXMtY2JjIgorI2RlZmluZSBOSURfZGVzX2NiYwkJMzEKKyNkZWZpbmUgT0JKX2Rlc19jYmMJCU9CSl9hbGdvcml0aG0sN0wKKworI2RlZmluZSBTTl9kZXNfb2ZiNjQJCSJERVMtT0ZCIgorI2RlZmluZSBMTl9kZXNfb2ZiNjQJCSJkZXMtb2ZiIgorI2RlZmluZSBOSURfZGVzX29mYjY0CQk0NQorI2RlZmluZSBPQkpfZGVzX29mYjY0CQlPQkpfYWxnb3JpdGhtLDhMCisKKyNkZWZpbmUgU05fZGVzX2NmYjY0CQkiREVTLUNGQiIKKyNkZWZpbmUgTE5fZGVzX2NmYjY0CQkiZGVzLWNmYiIKKyNkZWZpbmUgTklEX2Rlc19jZmI2NAkJMzAKKyNkZWZpbmUgT0JKX2Rlc19jZmI2NAkJT0JKX2FsZ29yaXRobSw5TAorCisjZGVmaW5lIFNOX3JzYVNpZ25hdHVyZQkJInJzYVNpZ25hdHVyZSIKKyNkZWZpbmUgTklEX3JzYVNpZ25hdHVyZQkJMzc3CisjZGVmaW5lIE9CSl9yc2FTaWduYXR1cmUJCU9CSl9hbGdvcml0aG0sMTFMCisKKyNkZWZpbmUgU05fZHNhXzIJCSJEU0Etb2xkIgorI2RlZmluZSBMTl9kc2FfMgkJImRzYUVuY3J5cHRpb24tb2xkIgorI2RlZmluZSBOSURfZHNhXzIJCTY3CisjZGVmaW5lIE9CSl9kc2FfMgkJT0JKX2FsZ29yaXRobSwxMkwKKworI2RlZmluZSBTTl9kc2FXaXRoU0hBCQkiRFNBLVNIQSIKKyNkZWZpbmUgTE5fZHNhV2l0aFNIQQkJImRzYVdpdGhTSEEiCisjZGVmaW5lIE5JRF9kc2FXaXRoU0hBCQk2NgorI2RlZmluZSBPQkpfZHNhV2l0aFNIQQkJT0JKX2FsZ29yaXRobSwxM0wKKworI2RlZmluZSBTTl9zaGFXaXRoUlNBRW5jcnlwdGlvbgkJIlJTQS1TSEEiCisjZGVmaW5lIExOX3NoYVdpdGhSU0FFbmNyeXB0aW9uCQkic2hhV2l0aFJTQUVuY3J5cHRpb24iCisjZGVmaW5lIE5JRF9zaGFXaXRoUlNBRW5jcnlwdGlvbgkJNDIKKyNkZWZpbmUgT0JKX3NoYVdpdGhSU0FFbmNyeXB0aW9uCQlPQkpfYWxnb3JpdGhtLDE1TAorCisjZGVmaW5lIFNOX2Rlc19lZGVfZWNiCQkiREVTLUVERSIKKyNkZWZpbmUgTE5fZGVzX2VkZV9lY2IJCSJkZXMtZWRlIgorI2RlZmluZSBOSURfZGVzX2VkZV9lY2IJCTMyCisjZGVmaW5lIE9CSl9kZXNfZWRlX2VjYgkJT0JKX2FsZ29yaXRobSwxN0wKKworI2RlZmluZSBTTl9kZXNfZWRlM19lY2IJCSJERVMtRURFMyIKKyNkZWZpbmUgTE5fZGVzX2VkZTNfZWNiCQkiZGVzLWVkZTMiCisjZGVmaW5lIE5JRF9kZXNfZWRlM19lY2IJCTMzCisKKyNkZWZpbmUgU05fZGVzX2VkZV9jYmMJCSJERVMtRURFLUNCQyIKKyNkZWZpbmUgTE5fZGVzX2VkZV9jYmMJCSJkZXMtZWRlLWNiYyIKKyNkZWZpbmUgTklEX2Rlc19lZGVfY2JjCQk0MworCisjZGVmaW5lIFNOX2Rlc19lZGVfY2ZiNjQJCSJERVMtRURFLUNGQiIKKyNkZWZpbmUgTE5fZGVzX2VkZV9jZmI2NAkJImRlcy1lZGUtY2ZiIgorI2RlZmluZSBOSURfZGVzX2VkZV9jZmI2NAkJNjAKKworI2RlZmluZSBTTl9kZXNfZWRlM19jZmI2NAkJIkRFUy1FREUzLUNGQiIKKyNkZWZpbmUgTE5fZGVzX2VkZTNfY2ZiNjQJCSJkZXMtZWRlMy1jZmIiCisjZGVmaW5lIE5JRF9kZXNfZWRlM19jZmI2NAkJNjEKKworI2RlZmluZSBTTl9kZXNfZWRlX29mYjY0CQkiREVTLUVERS1PRkIiCisjZGVmaW5lIExOX2Rlc19lZGVfb2ZiNjQJCSJkZXMtZWRlLW9mYiIKKyNkZWZpbmUgTklEX2Rlc19lZGVfb2ZiNjQJCTYyCisKKyNkZWZpbmUgU05fZGVzX2VkZTNfb2ZiNjQJCSJERVMtRURFMy1PRkIiCisjZGVmaW5lIExOX2Rlc19lZGUzX29mYjY0CQkiZGVzLWVkZTMtb2ZiIgorI2RlZmluZSBOSURfZGVzX2VkZTNfb2ZiNjQJCTYzCisKKyNkZWZpbmUgU05fZGVzeF9jYmMJCSJERVNYLUNCQyIKKyNkZWZpbmUgTE5fZGVzeF9jYmMJCSJkZXN4LWNiYyIKKyNkZWZpbmUgTklEX2Rlc3hfY2JjCQk4MAorCisjZGVmaW5lIFNOX3NoYQkJIlNIQSIKKyNkZWZpbmUgTE5fc2hhCQkic2hhIgorI2RlZmluZSBOSURfc2hhCQk0MQorI2RlZmluZSBPQkpfc2hhCQlPQkpfYWxnb3JpdGhtLDE4TAorCisjZGVmaW5lIFNOX3NoYTEJCSJTSEExIgorI2RlZmluZSBMTl9zaGExCQkic2hhMSIKKyNkZWZpbmUgTklEX3NoYTEJCTY0CisjZGVmaW5lIE9CSl9zaGExCQlPQkpfYWxnb3JpdGhtLDI2TAorCisjZGVmaW5lIFNOX2RzYVdpdGhTSEExXzIJCSJEU0EtU0hBMS1vbGQiCisjZGVmaW5lIExOX2RzYVdpdGhTSEExXzIJCSJkc2FXaXRoU0hBMS1vbGQiCisjZGVmaW5lIE5JRF9kc2FXaXRoU0hBMV8yCQk3MAorI2RlZmluZSBPQkpfZHNhV2l0aFNIQTFfMgkJT0JKX2FsZ29yaXRobSwyN0wKKworI2RlZmluZSBTTl9zaGExV2l0aFJTQQkJIlJTQS1TSEExLTIiCisjZGVmaW5lIExOX3NoYTFXaXRoUlNBCQkic2hhMVdpdGhSU0EiCisjZGVmaW5lIE5JRF9zaGExV2l0aFJTQQkJMTE1CisjZGVmaW5lIE9CSl9zaGExV2l0aFJTQQkJT0JKX2FsZ29yaXRobSwyOUwKKworI2RlZmluZSBTTl9yaXBlbWQxNjAJCSJSSVBFTUQxNjAiCisjZGVmaW5lIExOX3JpcGVtZDE2MAkJInJpcGVtZDE2MCIKKyNkZWZpbmUgTklEX3JpcGVtZDE2MAkJMTE3CisjZGVmaW5lIE9CSl9yaXBlbWQxNjAJCTFMLDNMLDM2TCwzTCwyTCwxTAorCisjZGVmaW5lIFNOX3JpcGVtZDE2MFdpdGhSU0EJCSJSU0EtUklQRU1EMTYwIgorI2RlZmluZSBMTl9yaXBlbWQxNjBXaXRoUlNBCQkicmlwZW1kMTYwV2l0aFJTQSIKKyNkZWZpbmUgTklEX3JpcGVtZDE2MFdpdGhSU0EJCTExOQorI2RlZmluZSBPQkpfcmlwZW1kMTYwV2l0aFJTQQkJMUwsM0wsMzZMLDNMLDNMLDFMLDJMCisKKyNkZWZpbmUgU05fc3huZXQJCSJTWE5ldElEIgorI2RlZmluZSBMTl9zeG5ldAkJIlN0cm9uZyBFeHRyYW5ldCBJRCIKKyNkZWZpbmUgTklEX3N4bmV0CQkxNDMKKyNkZWZpbmUgT0JKX3N4bmV0CQkxTCwzTCwxMDFMLDFMLDRMLDFMCisKKyNkZWZpbmUgU05fWDUwMAkJIlg1MDAiCisjZGVmaW5lIExOX1g1MDAJCSJkaXJlY3Rvcnkgc2VydmljZXMgKFguNTAwKSIKKyNkZWZpbmUgTklEX1g1MDAJCTExCisjZGVmaW5lIE9CSl9YNTAwCQkyTCw1TAorCisjZGVmaW5lIFNOX1g1MDkJCSJYNTA5IgorI2RlZmluZSBOSURfWDUwOQkJMTIKKyNkZWZpbmUgT0JKX1g1MDkJCU9CSl9YNTAwLDRMCisKKyNkZWZpbmUgU05fY29tbW9uTmFtZQkJIkNOIgorI2RlZmluZSBMTl9jb21tb25OYW1lCQkiY29tbW9uTmFtZSIKKyNkZWZpbmUgTklEX2NvbW1vbk5hbWUJCTEzCisjZGVmaW5lIE9CSl9jb21tb25OYW1lCQlPQkpfWDUwOSwzTAorCisjZGVmaW5lIFNOX3N1cm5hbWUJCSJTTiIKKyNkZWZpbmUgTE5fc3VybmFtZQkJInN1cm5hbWUiCisjZGVmaW5lIE5JRF9zdXJuYW1lCQkxMDAKKyNkZWZpbmUgT0JKX3N1cm5hbWUJCU9CSl9YNTA5LDRMCisKKyNkZWZpbmUgTE5fc2VyaWFsTnVtYmVyCQkic2VyaWFsTnVtYmVyIgorI2RlZmluZSBOSURfc2VyaWFsTnVtYmVyCQkxMDUKKyNkZWZpbmUgT0JKX3NlcmlhbE51bWJlcgkJT0JKX1g1MDksNUwKKworI2RlZmluZSBTTl9jb3VudHJ5TmFtZQkJIkMiCisjZGVmaW5lIExOX2NvdW50cnlOYW1lCQkiY291bnRyeU5hbWUiCisjZGVmaW5lIE5JRF9jb3VudHJ5TmFtZQkJMTQKKyNkZWZpbmUgT0JKX2NvdW50cnlOYW1lCQlPQkpfWDUwOSw2TAorCisjZGVmaW5lIFNOX2xvY2FsaXR5TmFtZQkJIkwiCisjZGVmaW5lIExOX2xvY2FsaXR5TmFtZQkJImxvY2FsaXR5TmFtZSIKKyNkZWZpbmUgTklEX2xvY2FsaXR5TmFtZQkJMTUKKyNkZWZpbmUgT0JKX2xvY2FsaXR5TmFtZQkJT0JKX1g1MDksN0wKKworI2RlZmluZSBTTl9zdGF0ZU9yUHJvdmluY2VOYW1lCQkiU1QiCisjZGVmaW5lIExOX3N0YXRlT3JQcm92aW5jZU5hbWUJCSJzdGF0ZU9yUHJvdmluY2VOYW1lIgorI2RlZmluZSBOSURfc3RhdGVPclByb3ZpbmNlTmFtZQkJMTYKKyNkZWZpbmUgT0JKX3N0YXRlT3JQcm92aW5jZU5hbWUJCU9CSl9YNTA5LDhMCisKKyNkZWZpbmUgU05fc3RyZWV0QWRkcmVzcwkJInN0cmVldCIKKyNkZWZpbmUgTE5fc3RyZWV0QWRkcmVzcwkJInN0cmVldEFkZHJlc3MiCisjZGVmaW5lIE5JRF9zdHJlZXRBZGRyZXNzCQk2NjAKKyNkZWZpbmUgT0JKX3N0cmVldEFkZHJlc3MJCU9CSl9YNTA5LDlMCisKKyNkZWZpbmUgU05fb3JnYW5pemF0aW9uTmFtZQkJIk8iCisjZGVmaW5lIExOX29yZ2FuaXphdGlvbk5hbWUJCSJvcmdhbml6YXRpb25OYW1lIgorI2RlZmluZSBOSURfb3JnYW5pemF0aW9uTmFtZQkJMTcKKyNkZWZpbmUgT0JKX29yZ2FuaXphdGlvbk5hbWUJCU9CSl9YNTA5LDEwTAorCisjZGVmaW5lIFNOX29yZ2FuaXphdGlvbmFsVW5pdE5hbWUJCSJPVSIKKyNkZWZpbmUgTE5fb3JnYW5pemF0aW9uYWxVbml0TmFtZQkJIm9yZ2FuaXphdGlvbmFsVW5pdE5hbWUiCisjZGVmaW5lIE5JRF9vcmdhbml6YXRpb25hbFVuaXROYW1lCQkxOAorI2RlZmluZSBPQkpfb3JnYW5pemF0aW9uYWxVbml0TmFtZQkJT0JKX1g1MDksMTFMCisKKyNkZWZpbmUgU05fdGl0bGUJCSJ0aXRsZSIKKyNkZWZpbmUgTE5fdGl0bGUJCSJ0aXRsZSIKKyNkZWZpbmUgTklEX3RpdGxlCQkxMDYKKyNkZWZpbmUgT0JKX3RpdGxlCQlPQkpfWDUwOSwxMkwKKworI2RlZmluZSBMTl9kZXNjcmlwdGlvbgkJImRlc2NyaXB0aW9uIgorI2RlZmluZSBOSURfZGVzY3JpcHRpb24JCTEwNworI2RlZmluZSBPQkpfZGVzY3JpcHRpb24JCU9CSl9YNTA5LDEzTAorCisjZGVmaW5lIExOX3NlYXJjaEd1aWRlCQkic2VhcmNoR3VpZGUiCisjZGVmaW5lIE5JRF9zZWFyY2hHdWlkZQkJODU5CisjZGVmaW5lIE9CSl9zZWFyY2hHdWlkZQkJT0JKX1g1MDksMTRMCisKKyNkZWZpbmUgTE5fYnVzaW5lc3NDYXRlZ29yeQkJImJ1c2luZXNzQ2F0ZWdvcnkiCisjZGVmaW5lIE5JRF9idXNpbmVzc0NhdGVnb3J5CQk4NjAKKyNkZWZpbmUgT0JKX2J1c2luZXNzQ2F0ZWdvcnkJCU9CSl9YNTA5LDE1TAorCisjZGVmaW5lIExOX3Bvc3RhbEFkZHJlc3MJCSJwb3N0YWxBZGRyZXNzIgorI2RlZmluZSBOSURfcG9zdGFsQWRkcmVzcwkJODYxCisjZGVmaW5lIE9CSl9wb3N0YWxBZGRyZXNzCQlPQkpfWDUwOSwxNkwKKworI2RlZmluZSBMTl9wb3N0YWxDb2RlCQkicG9zdGFsQ29kZSIKKyNkZWZpbmUgTklEX3Bvc3RhbENvZGUJCTY2MQorI2RlZmluZSBPQkpfcG9zdGFsQ29kZQkJT0JKX1g1MDksMTdMCisKKyNkZWZpbmUgTE5fcG9zdE9mZmljZUJveAkJInBvc3RPZmZpY2VCb3giCisjZGVmaW5lIE5JRF9wb3N0T2ZmaWNlQm94CQk4NjIKKyNkZWZpbmUgT0JKX3Bvc3RPZmZpY2VCb3gJCU9CSl9YNTA5LDE4TAorCisjZGVmaW5lIExOX3BoeXNpY2FsRGVsaXZlcnlPZmZpY2VOYW1lCQkicGh5c2ljYWxEZWxpdmVyeU9mZmljZU5hbWUiCisjZGVmaW5lIE5JRF9waHlzaWNhbERlbGl2ZXJ5T2ZmaWNlTmFtZQkJODYzCisjZGVmaW5lIE9CSl9waHlzaWNhbERlbGl2ZXJ5T2ZmaWNlTmFtZQkJT0JKX1g1MDksMTlMCisKKyNkZWZpbmUgTE5fdGVsZXBob25lTnVtYmVyCQkidGVsZXBob25lTnVtYmVyIgorI2RlZmluZSBOSURfdGVsZXBob25lTnVtYmVyCQk4NjQKKyNkZWZpbmUgT0JKX3RlbGVwaG9uZU51bWJlcgkJT0JKX1g1MDksMjBMCisKKyNkZWZpbmUgTE5fdGVsZXhOdW1iZXIJCSJ0ZWxleE51bWJlciIKKyNkZWZpbmUgTklEX3RlbGV4TnVtYmVyCQk4NjUKKyNkZWZpbmUgT0JKX3RlbGV4TnVtYmVyCQlPQkpfWDUwOSwyMUwKKworI2RlZmluZSBMTl90ZWxldGV4VGVybWluYWxJZGVudGlmaWVyCQkidGVsZXRleFRlcm1pbmFsSWRlbnRpZmllciIKKyNkZWZpbmUgTklEX3RlbGV0ZXhUZXJtaW5hbElkZW50aWZpZXIJCTg2NgorI2RlZmluZSBPQkpfdGVsZXRleFRlcm1pbmFsSWRlbnRpZmllcgkJT0JKX1g1MDksMjJMCisKKyNkZWZpbmUgTE5fZmFjc2ltaWxlVGVsZXBob25lTnVtYmVyCQkiZmFjc2ltaWxlVGVsZXBob25lTnVtYmVyIgorI2RlZmluZSBOSURfZmFjc2ltaWxlVGVsZXBob25lTnVtYmVyCQk4NjcKKyNkZWZpbmUgT0JKX2ZhY3NpbWlsZVRlbGVwaG9uZU51bWJlcgkJT0JKX1g1MDksMjNMCisKKyNkZWZpbmUgTE5feDEyMUFkZHJlc3MJCSJ4MTIxQWRkcmVzcyIKKyNkZWZpbmUgTklEX3gxMjFBZGRyZXNzCQk4NjgKKyNkZWZpbmUgT0JKX3gxMjFBZGRyZXNzCQlPQkpfWDUwOSwyNEwKKworI2RlZmluZSBMTl9pbnRlcm5hdGlvbmFsaVNETk51bWJlcgkJImludGVybmF0aW9uYWxpU0ROTnVtYmVyIgorI2RlZmluZSBOSURfaW50ZXJuYXRpb25hbGlTRE5OdW1iZXIJCTg2OQorI2RlZmluZSBPQkpfaW50ZXJuYXRpb25hbGlTRE5OdW1iZXIJCU9CSl9YNTA5LDI1TAorCisjZGVmaW5lIExOX3JlZ2lzdGVyZWRBZGRyZXNzCQkicmVnaXN0ZXJlZEFkZHJlc3MiCisjZGVmaW5lIE5JRF9yZWdpc3RlcmVkQWRkcmVzcwkJODcwCisjZGVmaW5lIE9CSl9yZWdpc3RlcmVkQWRkcmVzcwkJT0JKX1g1MDksMjZMCisKKyNkZWZpbmUgTE5fZGVzdGluYXRpb25JbmRpY2F0b3IJCSJkZXN0aW5hdGlvbkluZGljYXRvciIKKyNkZWZpbmUgTklEX2Rlc3RpbmF0aW9uSW5kaWNhdG9yCQk4NzEKKyNkZWZpbmUgT0JKX2Rlc3RpbmF0aW9uSW5kaWNhdG9yCQlPQkpfWDUwOSwyN0wKKworI2RlZmluZSBMTl9wcmVmZXJyZWREZWxpdmVyeU1ldGhvZAkJInByZWZlcnJlZERlbGl2ZXJ5TWV0aG9kIgorI2RlZmluZSBOSURfcHJlZmVycmVkRGVsaXZlcnlNZXRob2QJCTg3MgorI2RlZmluZSBPQkpfcHJlZmVycmVkRGVsaXZlcnlNZXRob2QJCU9CSl9YNTA5LDI4TAorCisjZGVmaW5lIExOX3ByZXNlbnRhdGlvbkFkZHJlc3MJCSJwcmVzZW50YXRpb25BZGRyZXNzIgorI2RlZmluZSBOSURfcHJlc2VudGF0aW9uQWRkcmVzcwkJODczCisjZGVmaW5lIE9CSl9wcmVzZW50YXRpb25BZGRyZXNzCQlPQkpfWDUwOSwyOUwKKworI2RlZmluZSBMTl9zdXBwb3J0ZWRBcHBsaWNhdGlvbkNvbnRleHQJCSJzdXBwb3J0ZWRBcHBsaWNhdGlvbkNvbnRleHQiCisjZGVmaW5lIE5JRF9zdXBwb3J0ZWRBcHBsaWNhdGlvbkNvbnRleHQJCTg3NAorI2RlZmluZSBPQkpfc3VwcG9ydGVkQXBwbGljYXRpb25Db250ZXh0CQlPQkpfWDUwOSwzMEwKKworI2RlZmluZSBTTl9tZW1iZXIJCSJtZW1iZXIiCisjZGVmaW5lIE5JRF9tZW1iZXIJCTg3NQorI2RlZmluZSBPQkpfbWVtYmVyCQlPQkpfWDUwOSwzMUwKKworI2RlZmluZSBTTl9vd25lcgkJIm93bmVyIgorI2RlZmluZSBOSURfb3duZXIJCTg3NgorI2RlZmluZSBPQkpfb3duZXIJCU9CSl9YNTA5LDMyTAorCisjZGVmaW5lIExOX3JvbGVPY2N1cGFudAkJInJvbGVPY2N1cGFudCIKKyNkZWZpbmUgTklEX3JvbGVPY2N1cGFudAkJODc3CisjZGVmaW5lIE9CSl9yb2xlT2NjdXBhbnQJCU9CSl9YNTA5LDMzTAorCisjZGVmaW5lIFNOX3NlZUFsc28JCSJzZWVBbHNvIgorI2RlZmluZSBOSURfc2VlQWxzbwkJODc4CisjZGVmaW5lIE9CSl9zZWVBbHNvCQlPQkpfWDUwOSwzNEwKKworI2RlZmluZSBMTl91c2VyUGFzc3dvcmQJCSJ1c2VyUGFzc3dvcmQiCisjZGVmaW5lIE5JRF91c2VyUGFzc3dvcmQJCTg3OQorI2RlZmluZSBPQkpfdXNlclBhc3N3b3JkCQlPQkpfWDUwOSwzNUwKKworI2RlZmluZSBMTl91c2VyQ2VydGlmaWNhdGUJCSJ1c2VyQ2VydGlmaWNhdGUiCisjZGVmaW5lIE5JRF91c2VyQ2VydGlmaWNhdGUJCTg4MAorI2RlZmluZSBPQkpfdXNlckNlcnRpZmljYXRlCQlPQkpfWDUwOSwzNkwKKworI2RlZmluZSBMTl9jQUNlcnRpZmljYXRlCQkiY0FDZXJ0aWZpY2F0ZSIKKyNkZWZpbmUgTklEX2NBQ2VydGlmaWNhdGUJCTg4MQorI2RlZmluZSBPQkpfY0FDZXJ0aWZpY2F0ZQkJT0JKX1g1MDksMzdMCisKKyNkZWZpbmUgTE5fYXV0aG9yaXR5UmV2b2NhdGlvbkxpc3QJCSJhdXRob3JpdHlSZXZvY2F0aW9uTGlzdCIKKyNkZWZpbmUgTklEX2F1dGhvcml0eVJldm9jYXRpb25MaXN0CQk4ODIKKyNkZWZpbmUgT0JKX2F1dGhvcml0eVJldm9jYXRpb25MaXN0CQlPQkpfWDUwOSwzOEwKKworI2RlZmluZSBMTl9jZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0CQkiY2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdCIKKyNkZWZpbmUgTklEX2NlcnRpZmljYXRlUmV2b2NhdGlvbkxpc3QJCTg4MworI2RlZmluZSBPQkpfY2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdAkJT0JKX1g1MDksMzlMCisKKyNkZWZpbmUgTE5fY3Jvc3NDZXJ0aWZpY2F0ZVBhaXIJCSJjcm9zc0NlcnRpZmljYXRlUGFpciIKKyNkZWZpbmUgTklEX2Nyb3NzQ2VydGlmaWNhdGVQYWlyCQk4ODQKKyNkZWZpbmUgT0JKX2Nyb3NzQ2VydGlmaWNhdGVQYWlyCQlPQkpfWDUwOSw0MEwKKworI2RlZmluZSBTTl9uYW1lCQkibmFtZSIKKyNkZWZpbmUgTE5fbmFtZQkJIm5hbWUiCisjZGVmaW5lIE5JRF9uYW1lCQkxNzMKKyNkZWZpbmUgT0JKX25hbWUJCU9CSl9YNTA5LDQxTAorCisjZGVmaW5lIFNOX2dpdmVuTmFtZQkJIkdOIgorI2RlZmluZSBMTl9naXZlbk5hbWUJCSJnaXZlbk5hbWUiCisjZGVmaW5lIE5JRF9naXZlbk5hbWUJCTk5CisjZGVmaW5lIE9CSl9naXZlbk5hbWUJCU9CSl9YNTA5LDQyTAorCisjZGVmaW5lIFNOX2luaXRpYWxzCQkiaW5pdGlhbHMiCisjZGVmaW5lIExOX2luaXRpYWxzCQkiaW5pdGlhbHMiCisjZGVmaW5lIE5JRF9pbml0aWFscwkJMTAxCisjZGVmaW5lIE9CSl9pbml0aWFscwkJT0JKX1g1MDksNDNMCisKKyNkZWZpbmUgTE5fZ2VuZXJhdGlvblF1YWxpZmllcgkJImdlbmVyYXRpb25RdWFsaWZpZXIiCisjZGVmaW5lIE5JRF9nZW5lcmF0aW9uUXVhbGlmaWVyCQk1MDkKKyNkZWZpbmUgT0JKX2dlbmVyYXRpb25RdWFsaWZpZXIJCU9CSl9YNTA5LDQ0TAorCisjZGVmaW5lIExOX3g1MDBVbmlxdWVJZGVudGlmaWVyCQkieDUwMFVuaXF1ZUlkZW50aWZpZXIiCisjZGVmaW5lIE5JRF94NTAwVW5pcXVlSWRlbnRpZmllcgkJNTAzCisjZGVmaW5lIE9CSl94NTAwVW5pcXVlSWRlbnRpZmllcgkJT0JKX1g1MDksNDVMCisKKyNkZWZpbmUgU05fZG5RdWFsaWZpZXIJCSJkblF1YWxpZmllciIKKyNkZWZpbmUgTE5fZG5RdWFsaWZpZXIJCSJkblF1YWxpZmllciIKKyNkZWZpbmUgTklEX2RuUXVhbGlmaWVyCQkxNzQKKyNkZWZpbmUgT0JKX2RuUXVhbGlmaWVyCQlPQkpfWDUwOSw0NkwKKworI2RlZmluZSBMTl9lbmhhbmNlZFNlYXJjaEd1aWRlCQkiZW5oYW5jZWRTZWFyY2hHdWlkZSIKKyNkZWZpbmUgTklEX2VuaGFuY2VkU2VhcmNoR3VpZGUJCTg4NQorI2RlZmluZSBPQkpfZW5oYW5jZWRTZWFyY2hHdWlkZQkJT0JKX1g1MDksNDdMCisKKyNkZWZpbmUgTE5fcHJvdG9jb2xJbmZvcm1hdGlvbgkJInByb3RvY29sSW5mb3JtYXRpb24iCisjZGVmaW5lIE5JRF9wcm90b2NvbEluZm9ybWF0aW9uCQk4ODYKKyNkZWZpbmUgT0JKX3Byb3RvY29sSW5mb3JtYXRpb24JCU9CSl9YNTA5LDQ4TAorCisjZGVmaW5lIExOX2Rpc3Rpbmd1aXNoZWROYW1lCQkiZGlzdGluZ3Vpc2hlZE5hbWUiCisjZGVmaW5lIE5JRF9kaXN0aW5ndWlzaGVkTmFtZQkJODg3CisjZGVmaW5lIE9CSl9kaXN0aW5ndWlzaGVkTmFtZQkJT0JKX1g1MDksNDlMCisKKyNkZWZpbmUgTE5fdW5pcXVlTWVtYmVyCQkidW5pcXVlTWVtYmVyIgorI2RlZmluZSBOSURfdW5pcXVlTWVtYmVyCQk4ODgKKyNkZWZpbmUgT0JKX3VuaXF1ZU1lbWJlcgkJT0JKX1g1MDksNTBMCisKKyNkZWZpbmUgTE5faG91c2VJZGVudGlmaWVyCQkiaG91c2VJZGVudGlmaWVyIgorI2RlZmluZSBOSURfaG91c2VJZGVudGlmaWVyCQk4ODkKKyNkZWZpbmUgT0JKX2hvdXNlSWRlbnRpZmllcgkJT0JKX1g1MDksNTFMCisKKyNkZWZpbmUgTE5fc3VwcG9ydGVkQWxnb3JpdGhtcwkJInN1cHBvcnRlZEFsZ29yaXRobXMiCisjZGVmaW5lIE5JRF9zdXBwb3J0ZWRBbGdvcml0aG1zCQk4OTAKKyNkZWZpbmUgT0JKX3N1cHBvcnRlZEFsZ29yaXRobXMJCU9CSl9YNTA5LDUyTAorCisjZGVmaW5lIExOX2RlbHRhUmV2b2NhdGlvbkxpc3QJCSJkZWx0YVJldm9jYXRpb25MaXN0IgorI2RlZmluZSBOSURfZGVsdGFSZXZvY2F0aW9uTGlzdAkJODkxCisjZGVmaW5lIE9CSl9kZWx0YVJldm9jYXRpb25MaXN0CQlPQkpfWDUwOSw1M0wKKworI2RlZmluZSBTTl9kbWROYW1lCQkiZG1kTmFtZSIKKyNkZWZpbmUgTklEX2RtZE5hbWUJCTg5MgorI2RlZmluZSBPQkpfZG1kTmFtZQkJT0JKX1g1MDksNTRMCisKKyNkZWZpbmUgTE5fcHNldWRvbnltCQkicHNldWRvbnltIgorI2RlZmluZSBOSURfcHNldWRvbnltCQk1MTAKKyNkZWZpbmUgT0JKX3BzZXVkb255bQkJT0JKX1g1MDksNjVMCisKKyNkZWZpbmUgU05fcm9sZQkJInJvbGUiCisjZGVmaW5lIExOX3JvbGUJCSJyb2xlIgorI2RlZmluZSBOSURfcm9sZQkJNDAwCisjZGVmaW5lIE9CSl9yb2xlCQlPQkpfWDUwOSw3MkwKKworI2RlZmluZSBTTl9YNTAwYWxnb3JpdGhtcwkJIlg1MDBhbGdvcml0aG1zIgorI2RlZmluZSBMTl9YNTAwYWxnb3JpdGhtcwkJImRpcmVjdG9yeSBzZXJ2aWNlcyAtIGFsZ29yaXRobXMiCisjZGVmaW5lIE5JRF9YNTAwYWxnb3JpdGhtcwkJMzc4CisjZGVmaW5lIE9CSl9YNTAwYWxnb3JpdGhtcwkJT0JKX1g1MDAsOEwKKworI2RlZmluZSBTTl9yc2EJCSJSU0EiCisjZGVmaW5lIExOX3JzYQkJInJzYSIKKyNkZWZpbmUgTklEX3JzYQkJMTkKKyNkZWZpbmUgT0JKX3JzYQkJT0JKX1g1MDBhbGdvcml0aG1zLDFMLDFMCisKKyNkZWZpbmUgU05fbWRjMldpdGhSU0EJCSJSU0EtTURDMiIKKyNkZWZpbmUgTE5fbWRjMldpdGhSU0EJCSJtZGMyV2l0aFJTQSIKKyNkZWZpbmUgTklEX21kYzJXaXRoUlNBCQk5NgorI2RlZmluZSBPQkpfbWRjMldpdGhSU0EJCU9CSl9YNTAwYWxnb3JpdGhtcywzTCwxMDBMCisKKyNkZWZpbmUgU05fbWRjMgkJIk1EQzIiCisjZGVmaW5lIExOX21kYzIJCSJtZGMyIgorI2RlZmluZSBOSURfbWRjMgkJOTUKKyNkZWZpbmUgT0JKX21kYzIJCU9CSl9YNTAwYWxnb3JpdGhtcywzTCwxMDFMCisKKyNkZWZpbmUgU05faWRfY2UJCSJpZC1jZSIKKyNkZWZpbmUgTklEX2lkX2NlCQk4MQorI2RlZmluZSBPQkpfaWRfY2UJCU9CSl9YNTAwLDI5TAorCisjZGVmaW5lIFNOX3N1YmplY3RfZGlyZWN0b3J5X2F0dHJpYnV0ZXMJCSJzdWJqZWN0RGlyZWN0b3J5QXR0cmlidXRlcyIKKyNkZWZpbmUgTE5fc3ViamVjdF9kaXJlY3RvcnlfYXR0cmlidXRlcwkJIlg1MDl2MyBTdWJqZWN0IERpcmVjdG9yeSBBdHRyaWJ1dGVzIgorI2RlZmluZSBOSURfc3ViamVjdF9kaXJlY3RvcnlfYXR0cmlidXRlcwkJNzY5CisjZGVmaW5lIE9CSl9zdWJqZWN0X2RpcmVjdG9yeV9hdHRyaWJ1dGVzCQlPQkpfaWRfY2UsOUwKKworI2RlZmluZSBTTl9zdWJqZWN0X2tleV9pZGVudGlmaWVyCQkic3ViamVjdEtleUlkZW50aWZpZXIiCisjZGVmaW5lIExOX3N1YmplY3Rfa2V5X2lkZW50aWZpZXIJCSJYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllciIKKyNkZWZpbmUgTklEX3N1YmplY3Rfa2V5X2lkZW50aWZpZXIJCTgyCisjZGVmaW5lIE9CSl9zdWJqZWN0X2tleV9pZGVudGlmaWVyCQlPQkpfaWRfY2UsMTRMCisKKyNkZWZpbmUgU05fa2V5X3VzYWdlCQkia2V5VXNhZ2UiCisjZGVmaW5lIExOX2tleV91c2FnZQkJIlg1MDl2MyBLZXkgVXNhZ2UiCisjZGVmaW5lIE5JRF9rZXlfdXNhZ2UJCTgzCisjZGVmaW5lIE9CSl9rZXlfdXNhZ2UJCU9CSl9pZF9jZSwxNUwKKworI2RlZmluZSBTTl9wcml2YXRlX2tleV91c2FnZV9wZXJpb2QJCSJwcml2YXRlS2V5VXNhZ2VQZXJpb2QiCisjZGVmaW5lIExOX3ByaXZhdGVfa2V5X3VzYWdlX3BlcmlvZAkJIlg1MDl2MyBQcml2YXRlIEtleSBVc2FnZSBQZXJpb2QiCisjZGVmaW5lIE5JRF9wcml2YXRlX2tleV91c2FnZV9wZXJpb2QJCTg0CisjZGVmaW5lIE9CSl9wcml2YXRlX2tleV91c2FnZV9wZXJpb2QJCU9CSl9pZF9jZSwxNkwKKworI2RlZmluZSBTTl9zdWJqZWN0X2FsdF9uYW1lCQkic3ViamVjdEFsdE5hbWUiCisjZGVmaW5lIExOX3N1YmplY3RfYWx0X25hbWUJCSJYNTA5djMgU3ViamVjdCBBbHRlcm5hdGl2ZSBOYW1lIgorI2RlZmluZSBOSURfc3ViamVjdF9hbHRfbmFtZQkJODUKKyNkZWZpbmUgT0JKX3N1YmplY3RfYWx0X25hbWUJCU9CSl9pZF9jZSwxN0wKKworI2RlZmluZSBTTl9pc3N1ZXJfYWx0X25hbWUJCSJpc3N1ZXJBbHROYW1lIgorI2RlZmluZSBMTl9pc3N1ZXJfYWx0X25hbWUJCSJYNTA5djMgSXNzdWVyIEFsdGVybmF0aXZlIE5hbWUiCisjZGVmaW5lIE5JRF9pc3N1ZXJfYWx0X25hbWUJCTg2CisjZGVmaW5lIE9CSl9pc3N1ZXJfYWx0X25hbWUJCU9CSl9pZF9jZSwxOEwKKworI2RlZmluZSBTTl9iYXNpY19jb25zdHJhaW50cwkJImJhc2ljQ29uc3RyYWludHMiCisjZGVmaW5lIExOX2Jhc2ljX2NvbnN0cmFpbnRzCQkiWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzIgorI2RlZmluZSBOSURfYmFzaWNfY29uc3RyYWludHMJCTg3CisjZGVmaW5lIE9CSl9iYXNpY19jb25zdHJhaW50cwkJT0JKX2lkX2NlLDE5TAorCisjZGVmaW5lIFNOX2NybF9udW1iZXIJCSJjcmxOdW1iZXIiCisjZGVmaW5lIExOX2NybF9udW1iZXIJCSJYNTA5djMgQ1JMIE51bWJlciIKKyNkZWZpbmUgTklEX2NybF9udW1iZXIJCTg4CisjZGVmaW5lIE9CSl9jcmxfbnVtYmVyCQlPQkpfaWRfY2UsMjBMCisKKyNkZWZpbmUgU05fY3JsX3JlYXNvbgkJIkNSTFJlYXNvbiIKKyNkZWZpbmUgTE5fY3JsX3JlYXNvbgkJIlg1MDl2MyBDUkwgUmVhc29uIENvZGUiCisjZGVmaW5lIE5JRF9jcmxfcmVhc29uCQkxNDEKKyNkZWZpbmUgT0JKX2NybF9yZWFzb24JCU9CSl9pZF9jZSwyMUwKKworI2RlZmluZSBTTl9pbnZhbGlkaXR5X2RhdGUJCSJpbnZhbGlkaXR5RGF0ZSIKKyNkZWZpbmUgTE5faW52YWxpZGl0eV9kYXRlCQkiSW52YWxpZGl0eSBEYXRlIgorI2RlZmluZSBOSURfaW52YWxpZGl0eV9kYXRlCQkxNDIKKyNkZWZpbmUgT0JKX2ludmFsaWRpdHlfZGF0ZQkJT0JKX2lkX2NlLDI0TAorCisjZGVmaW5lIFNOX2RlbHRhX2NybAkJImRlbHRhQ1JMIgorI2RlZmluZSBMTl9kZWx0YV9jcmwJCSJYNTA5djMgRGVsdGEgQ1JMIEluZGljYXRvciIKKyNkZWZpbmUgTklEX2RlbHRhX2NybAkJMTQwCisjZGVmaW5lIE9CSl9kZWx0YV9jcmwJCU9CSl9pZF9jZSwyN0wKKworI2RlZmluZSBTTl9pc3N1aW5nX2Rpc3RyaWJ1dGlvbl9wb2ludAkJImlzc3VpbmdEaXN0cmlidXRpb25Qb2ludCIKKyNkZWZpbmUgTE5faXNzdWluZ19kaXN0cmlidXRpb25fcG9pbnQJCSJYNTA5djMgSXNzdWluZyBEaXN0cnVidXRpb24gUG9pbnQiCisjZGVmaW5lIE5JRF9pc3N1aW5nX2Rpc3RyaWJ1dGlvbl9wb2ludAkJNzcwCisjZGVmaW5lIE9CSl9pc3N1aW5nX2Rpc3RyaWJ1dGlvbl9wb2ludAkJT0JKX2lkX2NlLDI4TAorCisjZGVmaW5lIFNOX2NlcnRpZmljYXRlX2lzc3VlcgkJImNlcnRpZmljYXRlSXNzdWVyIgorI2RlZmluZSBMTl9jZXJ0aWZpY2F0ZV9pc3N1ZXIJCSJYNTA5djMgQ2VydGlmaWNhdGUgSXNzdWVyIgorI2RlZmluZSBOSURfY2VydGlmaWNhdGVfaXNzdWVyCQk3NzEKKyNkZWZpbmUgT0JKX2NlcnRpZmljYXRlX2lzc3VlcgkJT0JKX2lkX2NlLDI5TAorCisjZGVmaW5lIFNOX25hbWVfY29uc3RyYWludHMJCSJuYW1lQ29uc3RyYWludHMiCisjZGVmaW5lIExOX25hbWVfY29uc3RyYWludHMJCSJYNTA5djMgTmFtZSBDb25zdHJhaW50cyIKKyNkZWZpbmUgTklEX25hbWVfY29uc3RyYWludHMJCTY2NgorI2RlZmluZSBPQkpfbmFtZV9jb25zdHJhaW50cwkJT0JKX2lkX2NlLDMwTAorCisjZGVmaW5lIFNOX2NybF9kaXN0cmlidXRpb25fcG9pbnRzCQkiY3JsRGlzdHJpYnV0aW9uUG9pbnRzIgorI2RlZmluZSBMTl9jcmxfZGlzdHJpYnV0aW9uX3BvaW50cwkJIlg1MDl2MyBDUkwgRGlzdHJpYnV0aW9uIFBvaW50cyIKKyNkZWZpbmUgTklEX2NybF9kaXN0cmlidXRpb25fcG9pbnRzCQkxMDMKKyNkZWZpbmUgT0JKX2NybF9kaXN0cmlidXRpb25fcG9pbnRzCQlPQkpfaWRfY2UsMzFMCisKKyNkZWZpbmUgU05fY2VydGlmaWNhdGVfcG9saWNpZXMJCSJjZXJ0aWZpY2F0ZVBvbGljaWVzIgorI2RlZmluZSBMTl9jZXJ0aWZpY2F0ZV9wb2xpY2llcwkJIlg1MDl2MyBDZXJ0aWZpY2F0ZSBQb2xpY2llcyIKKyNkZWZpbmUgTklEX2NlcnRpZmljYXRlX3BvbGljaWVzCQk4OQorI2RlZmluZSBPQkpfY2VydGlmaWNhdGVfcG9saWNpZXMJCU9CSl9pZF9jZSwzMkwKKworI2RlZmluZSBTTl9hbnlfcG9saWN5CQkiYW55UG9saWN5IgorI2RlZmluZSBMTl9hbnlfcG9saWN5CQkiWDUwOXYzIEFueSBQb2xpY3kiCisjZGVmaW5lIE5JRF9hbnlfcG9saWN5CQk3NDYKKyNkZWZpbmUgT0JKX2FueV9wb2xpY3kJCU9CSl9jZXJ0aWZpY2F0ZV9wb2xpY2llcywwTAorCisjZGVmaW5lIFNOX3BvbGljeV9tYXBwaW5ncwkJInBvbGljeU1hcHBpbmdzIgorI2RlZmluZSBMTl9wb2xpY3lfbWFwcGluZ3MJCSJYNTA5djMgUG9saWN5IE1hcHBpbmdzIgorI2RlZmluZSBOSURfcG9saWN5X21hcHBpbmdzCQk3NDcKKyNkZWZpbmUgT0JKX3BvbGljeV9tYXBwaW5ncwkJT0JKX2lkX2NlLDMzTAorCisjZGVmaW5lIFNOX2F1dGhvcml0eV9rZXlfaWRlbnRpZmllcgkJImF1dGhvcml0eUtleUlkZW50aWZpZXIiCisjZGVmaW5lIExOX2F1dGhvcml0eV9rZXlfaWRlbnRpZmllcgkJIlg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXIiCisjZGVmaW5lIE5JRF9hdXRob3JpdHlfa2V5X2lkZW50aWZpZXIJCTkwCisjZGVmaW5lIE9CSl9hdXRob3JpdHlfa2V5X2lkZW50aWZpZXIJCU9CSl9pZF9jZSwzNUwKKworI2RlZmluZSBTTl9wb2xpY3lfY29uc3RyYWludHMJCSJwb2xpY3lDb25zdHJhaW50cyIKKyNkZWZpbmUgTE5fcG9saWN5X2NvbnN0cmFpbnRzCQkiWDUwOXYzIFBvbGljeSBDb25zdHJhaW50cyIKKyNkZWZpbmUgTklEX3BvbGljeV9jb25zdHJhaW50cwkJNDAxCisjZGVmaW5lIE9CSl9wb2xpY3lfY29uc3RyYWludHMJCU9CSl9pZF9jZSwzNkwKKworI2RlZmluZSBTTl9leHRfa2V5X3VzYWdlCQkiZXh0ZW5kZWRLZXlVc2FnZSIKKyNkZWZpbmUgTE5fZXh0X2tleV91c2FnZQkJIlg1MDl2MyBFeHRlbmRlZCBLZXkgVXNhZ2UiCisjZGVmaW5lIE5JRF9leHRfa2V5X3VzYWdlCQkxMjYKKyNkZWZpbmUgT0JKX2V4dF9rZXlfdXNhZ2UJCU9CSl9pZF9jZSwzN0wKKworI2RlZmluZSBTTl9mcmVzaGVzdF9jcmwJCSJmcmVzaGVzdENSTCIKKyNkZWZpbmUgTE5fZnJlc2hlc3RfY3JsCQkiWDUwOXYzIEZyZXNoZXN0IENSTCIKKyNkZWZpbmUgTklEX2ZyZXNoZXN0X2NybAkJODU3CisjZGVmaW5lIE9CSl9mcmVzaGVzdF9jcmwJCU9CSl9pZF9jZSw0NkwKKworI2RlZmluZSBTTl9pbmhpYml0X2FueV9wb2xpY3kJCSJpbmhpYml0QW55UG9saWN5IgorI2RlZmluZSBMTl9pbmhpYml0X2FueV9wb2xpY3kJCSJYNTA5djMgSW5oaWJpdCBBbnkgUG9saWN5IgorI2RlZmluZSBOSURfaW5oaWJpdF9hbnlfcG9saWN5CQk3NDgKKyNkZWZpbmUgT0JKX2luaGliaXRfYW55X3BvbGljeQkJT0JKX2lkX2NlLDU0TAorCisjZGVmaW5lIFNOX3RhcmdldF9pbmZvcm1hdGlvbgkJInRhcmdldEluZm9ybWF0aW9uIgorI2RlZmluZSBMTl90YXJnZXRfaW5mb3JtYXRpb24JCSJYNTA5djMgQUMgVGFyZ2V0aW5nIgorI2RlZmluZSBOSURfdGFyZ2V0X2luZm9ybWF0aW9uCQk0MDIKKyNkZWZpbmUgT0JKX3RhcmdldF9pbmZvcm1hdGlvbgkJT0JKX2lkX2NlLDU1TAorCisjZGVmaW5lIFNOX25vX3Jldl9hdmFpbAkJIm5vUmV2QXZhaWwiCisjZGVmaW5lIExOX25vX3Jldl9hdmFpbAkJIlg1MDl2MyBObyBSZXZvY2F0aW9uIEF2YWlsYWJsZSIKKyNkZWZpbmUgTklEX25vX3Jldl9hdmFpbAkJNDAzCisjZGVmaW5lIE9CSl9ub19yZXZfYXZhaWwJCU9CSl9pZF9jZSw1NkwKKworI2RlZmluZSBTTl9hbnlFeHRlbmRlZEtleVVzYWdlCQkiYW55RXh0ZW5kZWRLZXlVc2FnZSIKKyNkZWZpbmUgTE5fYW55RXh0ZW5kZWRLZXlVc2FnZQkJIkFueSBFeHRlbmRlZCBLZXkgVXNhZ2UiCisjZGVmaW5lIE5JRF9hbnlFeHRlbmRlZEtleVVzYWdlCQk5MTAKKyNkZWZpbmUgT0JKX2FueUV4dGVuZGVkS2V5VXNhZ2UJCU9CSl9leHRfa2V5X3VzYWdlLDBMCisKKyNkZWZpbmUgU05fbmV0c2NhcGUJCSJOZXRzY2FwZSIKKyNkZWZpbmUgTE5fbmV0c2NhcGUJCSJOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3JwLiIKKyNkZWZpbmUgTklEX25ldHNjYXBlCQk1NworI2RlZmluZSBPQkpfbmV0c2NhcGUJCTJMLDE2TCw4NDBMLDFMLDExMzczMEwKKworI2RlZmluZSBTTl9uZXRzY2FwZV9jZXJ0X2V4dGVuc2lvbgkJIm5zQ2VydEV4dCIKKyNkZWZpbmUgTE5fbmV0c2NhcGVfY2VydF9leHRlbnNpb24JCSJOZXRzY2FwZSBDZXJ0aWZpY2F0ZSBFeHRlbnNpb24iCisjZGVmaW5lIE5JRF9uZXRzY2FwZV9jZXJ0X2V4dGVuc2lvbgkJNTgKKyNkZWZpbmUgT0JKX25ldHNjYXBlX2NlcnRfZXh0ZW5zaW9uCQlPQkpfbmV0c2NhcGUsMUwKKworI2RlZmluZSBTTl9uZXRzY2FwZV9kYXRhX3R5cGUJCSJuc0RhdGFUeXBlIgorI2RlZmluZSBMTl9uZXRzY2FwZV9kYXRhX3R5cGUJCSJOZXRzY2FwZSBEYXRhIFR5cGUiCisjZGVmaW5lIE5JRF9uZXRzY2FwZV9kYXRhX3R5cGUJCTU5CisjZGVmaW5lIE9CSl9uZXRzY2FwZV9kYXRhX3R5cGUJCU9CSl9uZXRzY2FwZSwyTAorCisjZGVmaW5lIFNOX25ldHNjYXBlX2NlcnRfdHlwZQkJIm5zQ2VydFR5cGUiCisjZGVmaW5lIExOX25ldHNjYXBlX2NlcnRfdHlwZQkJIk5ldHNjYXBlIENlcnQgVHlwZSIKKyNkZWZpbmUgTklEX25ldHNjYXBlX2NlcnRfdHlwZQkJNzEKKyNkZWZpbmUgT0JKX25ldHNjYXBlX2NlcnRfdHlwZQkJT0JKX25ldHNjYXBlX2NlcnRfZXh0ZW5zaW9uLDFMCisKKyNkZWZpbmUgU05fbmV0c2NhcGVfYmFzZV91cmwJCSJuc0Jhc2VVcmwiCisjZGVmaW5lIExOX25ldHNjYXBlX2Jhc2VfdXJsCQkiTmV0c2NhcGUgQmFzZSBVcmwiCisjZGVmaW5lIE5JRF9uZXRzY2FwZV9iYXNlX3VybAkJNzIKKyNkZWZpbmUgT0JKX25ldHNjYXBlX2Jhc2VfdXJsCQlPQkpfbmV0c2NhcGVfY2VydF9leHRlbnNpb24sMkwKKworI2RlZmluZSBTTl9uZXRzY2FwZV9yZXZvY2F0aW9uX3VybAkJIm5zUmV2b2NhdGlvblVybCIKKyNkZWZpbmUgTE5fbmV0c2NhcGVfcmV2b2NhdGlvbl91cmwJCSJOZXRzY2FwZSBSZXZvY2F0aW9uIFVybCIKKyNkZWZpbmUgTklEX25ldHNjYXBlX3Jldm9jYXRpb25fdXJsCQk3MworI2RlZmluZSBPQkpfbmV0c2NhcGVfcmV2b2NhdGlvbl91cmwJCU9CSl9uZXRzY2FwZV9jZXJ0X2V4dGVuc2lvbiwzTAorCisjZGVmaW5lIFNOX25ldHNjYXBlX2NhX3Jldm9jYXRpb25fdXJsCQkibnNDYVJldm9jYXRpb25VcmwiCisjZGVmaW5lIExOX25ldHNjYXBlX2NhX3Jldm9jYXRpb25fdXJsCQkiTmV0c2NhcGUgQ0EgUmV2b2NhdGlvbiBVcmwiCisjZGVmaW5lIE5JRF9uZXRzY2FwZV9jYV9yZXZvY2F0aW9uX3VybAkJNzQKKyNkZWZpbmUgT0JKX25ldHNjYXBlX2NhX3Jldm9jYXRpb25fdXJsCQlPQkpfbmV0c2NhcGVfY2VydF9leHRlbnNpb24sNEwKKworI2RlZmluZSBTTl9uZXRzY2FwZV9yZW5ld2FsX3VybAkJIm5zUmVuZXdhbFVybCIKKyNkZWZpbmUgTE5fbmV0c2NhcGVfcmVuZXdhbF91cmwJCSJOZXRzY2FwZSBSZW5ld2FsIFVybCIKKyNkZWZpbmUgTklEX25ldHNjYXBlX3JlbmV3YWxfdXJsCQk3NQorI2RlZmluZSBPQkpfbmV0c2NhcGVfcmVuZXdhbF91cmwJCU9CSl9uZXRzY2FwZV9jZXJ0X2V4dGVuc2lvbiw3TAorCisjZGVmaW5lIFNOX25ldHNjYXBlX2NhX3BvbGljeV91cmwJCSJuc0NhUG9saWN5VXJsIgorI2RlZmluZSBMTl9uZXRzY2FwZV9jYV9wb2xpY3lfdXJsCQkiTmV0c2NhcGUgQ0EgUG9saWN5IFVybCIKKyNkZWZpbmUgTklEX25ldHNjYXBlX2NhX3BvbGljeV91cmwJCTc2CisjZGVmaW5lIE9CSl9uZXRzY2FwZV9jYV9wb2xpY3lfdXJsCQlPQkpfbmV0c2NhcGVfY2VydF9leHRlbnNpb24sOEwKKworI2RlZmluZSBTTl9uZXRzY2FwZV9zc2xfc2VydmVyX25hbWUJCSJuc1NzbFNlcnZlck5hbWUiCisjZGVmaW5lIExOX25ldHNjYXBlX3NzbF9zZXJ2ZXJfbmFtZQkJIk5ldHNjYXBlIFNTTCBTZXJ2ZXIgTmFtZSIKKyNkZWZpbmUgTklEX25ldHNjYXBlX3NzbF9zZXJ2ZXJfbmFtZQkJNzcKKyNkZWZpbmUgT0JKX25ldHNjYXBlX3NzbF9zZXJ2ZXJfbmFtZQkJT0JKX25ldHNjYXBlX2NlcnRfZXh0ZW5zaW9uLDEyTAorCisjZGVmaW5lIFNOX25ldHNjYXBlX2NvbW1lbnQJCSJuc0NvbW1lbnQiCisjZGVmaW5lIExOX25ldHNjYXBlX2NvbW1lbnQJCSJOZXRzY2FwZSBDb21tZW50IgorI2RlZmluZSBOSURfbmV0c2NhcGVfY29tbWVudAkJNzgKKyNkZWZpbmUgT0JKX25ldHNjYXBlX2NvbW1lbnQJCU9CSl9uZXRzY2FwZV9jZXJ0X2V4dGVuc2lvbiwxM0wKKworI2RlZmluZSBTTl9uZXRzY2FwZV9jZXJ0X3NlcXVlbmNlCQkibnNDZXJ0U2VxdWVuY2UiCisjZGVmaW5lIExOX25ldHNjYXBlX2NlcnRfc2VxdWVuY2UJCSJOZXRzY2FwZSBDZXJ0aWZpY2F0ZSBTZXF1ZW5jZSIKKyNkZWZpbmUgTklEX25ldHNjYXBlX2NlcnRfc2VxdWVuY2UJCTc5CisjZGVmaW5lIE9CSl9uZXRzY2FwZV9jZXJ0X3NlcXVlbmNlCQlPQkpfbmV0c2NhcGVfZGF0YV90eXBlLDVMCisKKyNkZWZpbmUgU05fbnNfc2djCQkibnNTR0MiCisjZGVmaW5lIExOX25zX3NnYwkJIk5ldHNjYXBlIFNlcnZlciBHYXRlZCBDcnlwdG8iCisjZGVmaW5lIE5JRF9uc19zZ2MJCTEzOQorI2RlZmluZSBPQkpfbnNfc2djCQlPQkpfbmV0c2NhcGUsNEwsMUwKKworI2RlZmluZSBTTl9vcmcJCSJPUkciCisjZGVmaW5lIExOX29yZwkJIm9yZyIKKyNkZWZpbmUgTklEX29yZwkJMzc5CisjZGVmaW5lIE9CSl9vcmcJCU9CSl9pc28sM0wKKworI2RlZmluZSBTTl9kb2QJCSJET0QiCisjZGVmaW5lIExOX2RvZAkJImRvZCIKKyNkZWZpbmUgTklEX2RvZAkJMzgwCisjZGVmaW5lIE9CSl9kb2QJCU9CSl9vcmcsNkwKKworI2RlZmluZSBTTl9pYW5hCQkiSUFOQSIKKyNkZWZpbmUgTE5faWFuYQkJImlhbmEiCisjZGVmaW5lIE5JRF9pYW5hCQkzODEKKyNkZWZpbmUgT0JKX2lhbmEJCU9CSl9kb2QsMUwKKworI2RlZmluZSBPQkpfaW50ZXJuZXQJCU9CSl9pYW5hCisKKyNkZWZpbmUgU05fRGlyZWN0b3J5CQkiZGlyZWN0b3J5IgorI2RlZmluZSBMTl9EaXJlY3RvcnkJCSJEaXJlY3RvcnkiCisjZGVmaW5lIE5JRF9EaXJlY3RvcnkJCTM4MgorI2RlZmluZSBPQkpfRGlyZWN0b3J5CQlPQkpfaW50ZXJuZXQsMUwKKworI2RlZmluZSBTTl9NYW5hZ2VtZW50CQkibWdtdCIKKyNkZWZpbmUgTE5fTWFuYWdlbWVudAkJIk1hbmFnZW1lbnQiCisjZGVmaW5lIE5JRF9NYW5hZ2VtZW50CQkzODMKKyNkZWZpbmUgT0JKX01hbmFnZW1lbnQJCU9CSl9pbnRlcm5ldCwyTAorCisjZGVmaW5lIFNOX0V4cGVyaW1lbnRhbAkJImV4cGVyaW1lbnRhbCIKKyNkZWZpbmUgTE5fRXhwZXJpbWVudGFsCQkiRXhwZXJpbWVudGFsIgorI2RlZmluZSBOSURfRXhwZXJpbWVudGFsCQkzODQKKyNkZWZpbmUgT0JKX0V4cGVyaW1lbnRhbAkJT0JKX2ludGVybmV0LDNMCisKKyNkZWZpbmUgU05fUHJpdmF0ZQkJInByaXZhdGUiCisjZGVmaW5lIExOX1ByaXZhdGUJCSJQcml2YXRlIgorI2RlZmluZSBOSURfUHJpdmF0ZQkJMzg1CisjZGVmaW5lIE9CSl9Qcml2YXRlCQlPQkpfaW50ZXJuZXQsNEwKKworI2RlZmluZSBTTl9TZWN1cml0eQkJInNlY3VyaXR5IgorI2RlZmluZSBMTl9TZWN1cml0eQkJIlNlY3VyaXR5IgorI2RlZmluZSBOSURfU2VjdXJpdHkJCTM4NgorI2RlZmluZSBPQkpfU2VjdXJpdHkJCU9CSl9pbnRlcm5ldCw1TAorCisjZGVmaW5lIFNOX1NOTVB2MgkJInNubXB2MiIKKyNkZWZpbmUgTE5fU05NUHYyCQkiU05NUHYyIgorI2RlZmluZSBOSURfU05NUHYyCQkzODcKKyNkZWZpbmUgT0JKX1NOTVB2MgkJT0JKX2ludGVybmV0LDZMCisKKyNkZWZpbmUgTE5fTWFpbAkJIk1haWwiCisjZGVmaW5lIE5JRF9NYWlsCQkzODgKKyNkZWZpbmUgT0JKX01haWwJCU9CSl9pbnRlcm5ldCw3TAorCisjZGVmaW5lIFNOX0VudGVycHJpc2VzCQkiZW50ZXJwcmlzZXMiCisjZGVmaW5lIExOX0VudGVycHJpc2VzCQkiRW50ZXJwcmlzZXMiCisjZGVmaW5lIE5JRF9FbnRlcnByaXNlcwkJMzg5CisjZGVmaW5lIE9CSl9FbnRlcnByaXNlcwkJT0JKX1ByaXZhdGUsMUwKKworI2RlZmluZSBTTl9kY09iamVjdAkJImRjb2JqZWN0IgorI2RlZmluZSBMTl9kY09iamVjdAkJImRjT2JqZWN0IgorI2RlZmluZSBOSURfZGNPYmplY3QJCTM5MAorI2RlZmluZSBPQkpfZGNPYmplY3QJCU9CSl9FbnRlcnByaXNlcywxNDY2TCwzNDRMCisKKyNkZWZpbmUgU05fbWltZV9taHMJCSJtaW1lLW1ocyIKKyNkZWZpbmUgTE5fbWltZV9taHMJCSJNSU1FIE1IUyIKKyNkZWZpbmUgTklEX21pbWVfbWhzCQk1MDQKKyNkZWZpbmUgT0JKX21pbWVfbWhzCQlPQkpfTWFpbCwxTAorCisjZGVmaW5lIFNOX21pbWVfbWhzX2hlYWRpbmdzCQkibWltZS1taHMtaGVhZGluZ3MiCisjZGVmaW5lIExOX21pbWVfbWhzX2hlYWRpbmdzCQkibWltZS1taHMtaGVhZGluZ3MiCisjZGVmaW5lIE5JRF9taW1lX21oc19oZWFkaW5ncwkJNTA1CisjZGVmaW5lIE9CSl9taW1lX21oc19oZWFkaW5ncwkJT0JKX21pbWVfbWhzLDFMCisKKyNkZWZpbmUgU05fbWltZV9taHNfYm9kaWVzCQkibWltZS1taHMtYm9kaWVzIgorI2RlZmluZSBMTl9taW1lX21oc19ib2RpZXMJCSJtaW1lLW1ocy1ib2RpZXMiCisjZGVmaW5lIE5JRF9taW1lX21oc19ib2RpZXMJCTUwNgorI2RlZmluZSBPQkpfbWltZV9taHNfYm9kaWVzCQlPQkpfbWltZV9taHMsMkwKKworI2RlZmluZSBTTl9pZF9oZXhfcGFydGlhbF9tZXNzYWdlCQkiaWQtaGV4LXBhcnRpYWwtbWVzc2FnZSIKKyNkZWZpbmUgTE5faWRfaGV4X3BhcnRpYWxfbWVzc2FnZQkJImlkLWhleC1wYXJ0aWFsLW1lc3NhZ2UiCisjZGVmaW5lIE5JRF9pZF9oZXhfcGFydGlhbF9tZXNzYWdlCQk1MDcKKyNkZWZpbmUgT0JKX2lkX2hleF9wYXJ0aWFsX21lc3NhZ2UJCU9CSl9taW1lX21oc19oZWFkaW5ncywxTAorCisjZGVmaW5lIFNOX2lkX2hleF9tdWx0aXBhcnRfbWVzc2FnZQkJImlkLWhleC1tdWx0aXBhcnQtbWVzc2FnZSIKKyNkZWZpbmUgTE5faWRfaGV4X211bHRpcGFydF9tZXNzYWdlCQkiaWQtaGV4LW11bHRpcGFydC1tZXNzYWdlIgorI2RlZmluZSBOSURfaWRfaGV4X211bHRpcGFydF9tZXNzYWdlCQk1MDgKKyNkZWZpbmUgT0JKX2lkX2hleF9tdWx0aXBhcnRfbWVzc2FnZQkJT0JKX21pbWVfbWhzX2hlYWRpbmdzLDJMCisKKyNkZWZpbmUgU05fcmxlX2NvbXByZXNzaW9uCQkiUkxFIgorI2RlZmluZSBMTl9ybGVfY29tcHJlc3Npb24JCSJydW4gbGVuZ3RoIGNvbXByZXNzaW9uIgorI2RlZmluZSBOSURfcmxlX2NvbXByZXNzaW9uCQkxMjQKKyNkZWZpbmUgT0JKX3JsZV9jb21wcmVzc2lvbgkJMUwsMUwsMUwsMUwsNjY2TCwxTAorCisjZGVmaW5lIFNOX3psaWJfY29tcHJlc3Npb24JCSJaTElCIgorI2RlZmluZSBMTl96bGliX2NvbXByZXNzaW9uCQkiemxpYiBjb21wcmVzc2lvbiIKKyNkZWZpbmUgTklEX3psaWJfY29tcHJlc3Npb24JCTEyNQorI2RlZmluZSBPQkpfemxpYl9jb21wcmVzc2lvbgkJT0JKX2lkX3NtaW1lX2FsZyw4TAorCisjZGVmaW5lIE9CSl9jc29yCQkyTCwxNkwsODQwTCwxTCwxMDFMLDNMCisKKyNkZWZpbmUgT0JKX25pc3RBbGdvcml0aG1zCQlPQkpfY3Nvciw0TAorCisjZGVmaW5lIE9CSl9hZXMJCU9CSl9uaXN0QWxnb3JpdGhtcywxTAorCisjZGVmaW5lIFNOX2Flc18xMjhfZWNiCQkiQUVTLTEyOC1FQ0IiCisjZGVmaW5lIExOX2Flc18xMjhfZWNiCQkiYWVzLTEyOC1lY2IiCisjZGVmaW5lIE5JRF9hZXNfMTI4X2VjYgkJNDE4CisjZGVmaW5lIE9CSl9hZXNfMTI4X2VjYgkJT0JKX2FlcywxTAorCisjZGVmaW5lIFNOX2Flc18xMjhfY2JjCQkiQUVTLTEyOC1DQkMiCisjZGVmaW5lIExOX2Flc18xMjhfY2JjCQkiYWVzLTEyOC1jYmMiCisjZGVmaW5lIE5JRF9hZXNfMTI4X2NiYwkJNDE5CisjZGVmaW5lIE9CSl9hZXNfMTI4X2NiYwkJT0JKX2FlcywyTAorCisjZGVmaW5lIFNOX2Flc18xMjhfb2ZiMTI4CQkiQUVTLTEyOC1PRkIiCisjZGVmaW5lIExOX2Flc18xMjhfb2ZiMTI4CQkiYWVzLTEyOC1vZmIiCisjZGVmaW5lIE5JRF9hZXNfMTI4X29mYjEyOAkJNDIwCisjZGVmaW5lIE9CSl9hZXNfMTI4X29mYjEyOAkJT0JKX2FlcywzTAorCisjZGVmaW5lIFNOX2Flc18xMjhfY2ZiMTI4CQkiQUVTLTEyOC1DRkIiCisjZGVmaW5lIExOX2Flc18xMjhfY2ZiMTI4CQkiYWVzLTEyOC1jZmIiCisjZGVmaW5lIE5JRF9hZXNfMTI4X2NmYjEyOAkJNDIxCisjZGVmaW5lIE9CSl9hZXNfMTI4X2NmYjEyOAkJT0JKX2Flcyw0TAorCisjZGVmaW5lIFNOX2lkX2FlczEyOF93cmFwCQkiaWQtYWVzMTI4LXdyYXAiCisjZGVmaW5lIE5JRF9pZF9hZXMxMjhfd3JhcAkJNzg4CisjZGVmaW5lIE9CSl9pZF9hZXMxMjhfd3JhcAkJT0JKX2Flcyw1TAorCisjZGVmaW5lIFNOX2Flc18xMjhfZ2NtCQkiaWQtYWVzMTI4LUdDTSIKKyNkZWZpbmUgTE5fYWVzXzEyOF9nY20JCSJhZXMtMTI4LWdjbSIKKyNkZWZpbmUgTklEX2Flc18xMjhfZ2NtCQk4OTUKKyNkZWZpbmUgT0JKX2Flc18xMjhfZ2NtCQlPQkpfYWVzLDZMCisKKyNkZWZpbmUgU05fYWVzXzEyOF9jY20JCSJpZC1hZXMxMjgtQ0NNIgorI2RlZmluZSBMTl9hZXNfMTI4X2NjbQkJImFlcy0xMjgtY2NtIgorI2RlZmluZSBOSURfYWVzXzEyOF9jY20JCTg5NgorI2RlZmluZSBPQkpfYWVzXzEyOF9jY20JCU9CSl9hZXMsN0wKKworI2RlZmluZSBTTl9pZF9hZXMxMjhfd3JhcF9wYWQJCSJpZC1hZXMxMjgtd3JhcC1wYWQiCisjZGVmaW5lIE5JRF9pZF9hZXMxMjhfd3JhcF9wYWQJCTg5NworI2RlZmluZSBPQkpfaWRfYWVzMTI4X3dyYXBfcGFkCQlPQkpfYWVzLDhMCisKKyNkZWZpbmUgU05fYWVzXzE5Ml9lY2IJCSJBRVMtMTkyLUVDQiIKKyNkZWZpbmUgTE5fYWVzXzE5Ml9lY2IJCSJhZXMtMTkyLWVjYiIKKyNkZWZpbmUgTklEX2Flc18xOTJfZWNiCQk0MjIKKyNkZWZpbmUgT0JKX2Flc18xOTJfZWNiCQlPQkpfYWVzLDIxTAorCisjZGVmaW5lIFNOX2Flc18xOTJfY2JjCQkiQUVTLTE5Mi1DQkMiCisjZGVmaW5lIExOX2Flc18xOTJfY2JjCQkiYWVzLTE5Mi1jYmMiCisjZGVmaW5lIE5JRF9hZXNfMTkyX2NiYwkJNDIzCisjZGVmaW5lIE9CSl9hZXNfMTkyX2NiYwkJT0JKX2FlcywyMkwKKworI2RlZmluZSBTTl9hZXNfMTkyX29mYjEyOAkJIkFFUy0xOTItT0ZCIgorI2RlZmluZSBMTl9hZXNfMTkyX29mYjEyOAkJImFlcy0xOTItb2ZiIgorI2RlZmluZSBOSURfYWVzXzE5Ml9vZmIxMjgJCTQyNAorI2RlZmluZSBPQkpfYWVzXzE5Ml9vZmIxMjgJCU9CSl9hZXMsMjNMCisKKyNkZWZpbmUgU05fYWVzXzE5Ml9jZmIxMjgJCSJBRVMtMTkyLUNGQiIKKyNkZWZpbmUgTE5fYWVzXzE5Ml9jZmIxMjgJCSJhZXMtMTkyLWNmYiIKKyNkZWZpbmUgTklEX2Flc18xOTJfY2ZiMTI4CQk0MjUKKyNkZWZpbmUgT0JKX2Flc18xOTJfY2ZiMTI4CQlPQkpfYWVzLDI0TAorCisjZGVmaW5lIFNOX2lkX2FlczE5Ml93cmFwCQkiaWQtYWVzMTkyLXdyYXAiCisjZGVmaW5lIE5JRF9pZF9hZXMxOTJfd3JhcAkJNzg5CisjZGVmaW5lIE9CSl9pZF9hZXMxOTJfd3JhcAkJT0JKX2FlcywyNUwKKworI2RlZmluZSBTTl9hZXNfMTkyX2djbQkJImlkLWFlczE5Mi1HQ00iCisjZGVmaW5lIExOX2Flc18xOTJfZ2NtCQkiYWVzLTE5Mi1nY20iCisjZGVmaW5lIE5JRF9hZXNfMTkyX2djbQkJODk4CisjZGVmaW5lIE9CSl9hZXNfMTkyX2djbQkJT0JKX2FlcywyNkwKKworI2RlZmluZSBTTl9hZXNfMTkyX2NjbQkJImlkLWFlczE5Mi1DQ00iCisjZGVmaW5lIExOX2Flc18xOTJfY2NtCQkiYWVzLTE5Mi1jY20iCisjZGVmaW5lIE5JRF9hZXNfMTkyX2NjbQkJODk5CisjZGVmaW5lIE9CSl9hZXNfMTkyX2NjbQkJT0JKX2FlcywyN0wKKworI2RlZmluZSBTTl9pZF9hZXMxOTJfd3JhcF9wYWQJCSJpZC1hZXMxOTItd3JhcC1wYWQiCisjZGVmaW5lIE5JRF9pZF9hZXMxOTJfd3JhcF9wYWQJCTkwMAorI2RlZmluZSBPQkpfaWRfYWVzMTkyX3dyYXBfcGFkCQlPQkpfYWVzLDI4TAorCisjZGVmaW5lIFNOX2Flc18yNTZfZWNiCQkiQUVTLTI1Ni1FQ0IiCisjZGVmaW5lIExOX2Flc18yNTZfZWNiCQkiYWVzLTI1Ni1lY2IiCisjZGVmaW5lIE5JRF9hZXNfMjU2X2VjYgkJNDI2CisjZGVmaW5lIE9CSl9hZXNfMjU2X2VjYgkJT0JKX2Flcyw0MUwKKworI2RlZmluZSBTTl9hZXNfMjU2X2NiYwkJIkFFUy0yNTYtQ0JDIgorI2RlZmluZSBMTl9hZXNfMjU2X2NiYwkJImFlcy0yNTYtY2JjIgorI2RlZmluZSBOSURfYWVzXzI1Nl9jYmMJCTQyNworI2RlZmluZSBPQkpfYWVzXzI1Nl9jYmMJCU9CSl9hZXMsNDJMCisKKyNkZWZpbmUgU05fYWVzXzI1Nl9vZmIxMjgJCSJBRVMtMjU2LU9GQiIKKyNkZWZpbmUgTE5fYWVzXzI1Nl9vZmIxMjgJCSJhZXMtMjU2LW9mYiIKKyNkZWZpbmUgTklEX2Flc18yNTZfb2ZiMTI4CQk0MjgKKyNkZWZpbmUgT0JKX2Flc18yNTZfb2ZiMTI4CQlPQkpfYWVzLDQzTAorCisjZGVmaW5lIFNOX2Flc18yNTZfY2ZiMTI4CQkiQUVTLTI1Ni1DRkIiCisjZGVmaW5lIExOX2Flc18yNTZfY2ZiMTI4CQkiYWVzLTI1Ni1jZmIiCisjZGVmaW5lIE5JRF9hZXNfMjU2X2NmYjEyOAkJNDI5CisjZGVmaW5lIE9CSl9hZXNfMjU2X2NmYjEyOAkJT0JKX2Flcyw0NEwKKworI2RlZmluZSBTTl9pZF9hZXMyNTZfd3JhcAkJImlkLWFlczI1Ni13cmFwIgorI2RlZmluZSBOSURfaWRfYWVzMjU2X3dyYXAJCTc5MAorI2RlZmluZSBPQkpfaWRfYWVzMjU2X3dyYXAJCU9CSl9hZXMsNDVMCisKKyNkZWZpbmUgU05fYWVzXzI1Nl9nY20JCSJpZC1hZXMyNTYtR0NNIgorI2RlZmluZSBMTl9hZXNfMjU2X2djbQkJImFlcy0yNTYtZ2NtIgorI2RlZmluZSBOSURfYWVzXzI1Nl9nY20JCTkwMQorI2RlZmluZSBPQkpfYWVzXzI1Nl9nY20JCU9CSl9hZXMsNDZMCisKKyNkZWZpbmUgU05fYWVzXzI1Nl9jY20JCSJpZC1hZXMyNTYtQ0NNIgorI2RlZmluZSBMTl9hZXNfMjU2X2NjbQkJImFlcy0yNTYtY2NtIgorI2RlZmluZSBOSURfYWVzXzI1Nl9jY20JCTkwMgorI2RlZmluZSBPQkpfYWVzXzI1Nl9jY20JCU9CSl9hZXMsNDdMCisKKyNkZWZpbmUgU05faWRfYWVzMjU2X3dyYXBfcGFkCQkiaWQtYWVzMjU2LXdyYXAtcGFkIgorI2RlZmluZSBOSURfaWRfYWVzMjU2X3dyYXBfcGFkCQk5MDMKKyNkZWZpbmUgT0JKX2lkX2FlczI1Nl93cmFwX3BhZAkJT0JKX2Flcyw0OEwKKworI2RlZmluZSBTTl9hZXNfMTI4X2NmYjEJCSJBRVMtMTI4LUNGQjEiCisjZGVmaW5lIExOX2Flc18xMjhfY2ZiMQkJImFlcy0xMjgtY2ZiMSIKKyNkZWZpbmUgTklEX2Flc18xMjhfY2ZiMQkJNjUwCisKKyNkZWZpbmUgU05fYWVzXzE5Ml9jZmIxCQkiQUVTLTE5Mi1DRkIxIgorI2RlZmluZSBMTl9hZXNfMTkyX2NmYjEJCSJhZXMtMTkyLWNmYjEiCisjZGVmaW5lIE5JRF9hZXNfMTkyX2NmYjEJCTY1MQorCisjZGVmaW5lIFNOX2Flc18yNTZfY2ZiMQkJIkFFUy0yNTYtQ0ZCMSIKKyNkZWZpbmUgTE5fYWVzXzI1Nl9jZmIxCQkiYWVzLTI1Ni1jZmIxIgorI2RlZmluZSBOSURfYWVzXzI1Nl9jZmIxCQk2NTIKKworI2RlZmluZSBTTl9hZXNfMTI4X2NmYjgJCSJBRVMtMTI4LUNGQjgiCisjZGVmaW5lIExOX2Flc18xMjhfY2ZiOAkJImFlcy0xMjgtY2ZiOCIKKyNkZWZpbmUgTklEX2Flc18xMjhfY2ZiOAkJNjUzCisKKyNkZWZpbmUgU05fYWVzXzE5Ml9jZmI4CQkiQUVTLTE5Mi1DRkI4IgorI2RlZmluZSBMTl9hZXNfMTkyX2NmYjgJCSJhZXMtMTkyLWNmYjgiCisjZGVmaW5lIE5JRF9hZXNfMTkyX2NmYjgJCTY1NAorCisjZGVmaW5lIFNOX2Flc18yNTZfY2ZiOAkJIkFFUy0yNTYtQ0ZCOCIKKyNkZWZpbmUgTE5fYWVzXzI1Nl9jZmI4CQkiYWVzLTI1Ni1jZmI4IgorI2RlZmluZSBOSURfYWVzXzI1Nl9jZmI4CQk2NTUKKworI2RlZmluZSBTTl9hZXNfMTI4X2N0cgkJIkFFUy0xMjgtQ1RSIgorI2RlZmluZSBMTl9hZXNfMTI4X2N0cgkJImFlcy0xMjgtY3RyIgorI2RlZmluZSBOSURfYWVzXzEyOF9jdHIJCTkwNAorCisjZGVmaW5lIFNOX2Flc18xOTJfY3RyCQkiQUVTLTE5Mi1DVFIiCisjZGVmaW5lIExOX2Flc18xOTJfY3RyCQkiYWVzLTE5Mi1jdHIiCisjZGVmaW5lIE5JRF9hZXNfMTkyX2N0cgkJOTA1CisKKyNkZWZpbmUgU05fYWVzXzI1Nl9jdHIJCSJBRVMtMjU2LUNUUiIKKyNkZWZpbmUgTE5fYWVzXzI1Nl9jdHIJCSJhZXMtMjU2LWN0ciIKKyNkZWZpbmUgTklEX2Flc18yNTZfY3RyCQk5MDYKKworI2RlZmluZSBTTl9hZXNfMTI4X3h0cwkJIkFFUy0xMjgtWFRTIgorI2RlZmluZSBMTl9hZXNfMTI4X3h0cwkJImFlcy0xMjgteHRzIgorI2RlZmluZSBOSURfYWVzXzEyOF94dHMJCTkxMworCisjZGVmaW5lIFNOX2Flc18yNTZfeHRzCQkiQUVTLTI1Ni1YVFMiCisjZGVmaW5lIExOX2Flc18yNTZfeHRzCQkiYWVzLTI1Ni14dHMiCisjZGVmaW5lIE5JRF9hZXNfMjU2X3h0cwkJOTE0CisKKyNkZWZpbmUgU05fZGVzX2NmYjEJCSJERVMtQ0ZCMSIKKyNkZWZpbmUgTE5fZGVzX2NmYjEJCSJkZXMtY2ZiMSIKKyNkZWZpbmUgTklEX2Rlc19jZmIxCQk2NTYKKworI2RlZmluZSBTTl9kZXNfY2ZiOAkJIkRFUy1DRkI4IgorI2RlZmluZSBMTl9kZXNfY2ZiOAkJImRlcy1jZmI4IgorI2RlZmluZSBOSURfZGVzX2NmYjgJCTY1NworCisjZGVmaW5lIFNOX2Rlc19lZGUzX2NmYjEJCSJERVMtRURFMy1DRkIxIgorI2RlZmluZSBMTl9kZXNfZWRlM19jZmIxCQkiZGVzLWVkZTMtY2ZiMSIKKyNkZWZpbmUgTklEX2Rlc19lZGUzX2NmYjEJCTY1OAorCisjZGVmaW5lIFNOX2Rlc19lZGUzX2NmYjgJCSJERVMtRURFMy1DRkI4IgorI2RlZmluZSBMTl9kZXNfZWRlM19jZmI4CQkiZGVzLWVkZTMtY2ZiOCIKKyNkZWZpbmUgTklEX2Rlc19lZGUzX2NmYjgJCTY1OQorCisjZGVmaW5lIE9CSl9uaXN0X2hhc2hhbGdzCQlPQkpfbmlzdEFsZ29yaXRobXMsMkwKKworI2RlZmluZSBTTl9zaGEyNTYJCSJTSEEyNTYiCisjZGVmaW5lIExOX3NoYTI1NgkJInNoYTI1NiIKKyNkZWZpbmUgTklEX3NoYTI1NgkJNjcyCisjZGVmaW5lIE9CSl9zaGEyNTYJCU9CSl9uaXN0X2hhc2hhbGdzLDFMCisKKyNkZWZpbmUgU05fc2hhMzg0CQkiU0hBMzg0IgorI2RlZmluZSBMTl9zaGEzODQJCSJzaGEzODQiCisjZGVmaW5lIE5JRF9zaGEzODQJCTY3MworI2RlZmluZSBPQkpfc2hhMzg0CQlPQkpfbmlzdF9oYXNoYWxncywyTAorCisjZGVmaW5lIFNOX3NoYTUxMgkJIlNIQTUxMiIKKyNkZWZpbmUgTE5fc2hhNTEyCQkic2hhNTEyIgorI2RlZmluZSBOSURfc2hhNTEyCQk2NzQKKyNkZWZpbmUgT0JKX3NoYTUxMgkJT0JKX25pc3RfaGFzaGFsZ3MsM0wKKworI2RlZmluZSBTTl9zaGEyMjQJCSJTSEEyMjQiCisjZGVmaW5lIExOX3NoYTIyNAkJInNoYTIyNCIKKyNkZWZpbmUgTklEX3NoYTIyNAkJNjc1CisjZGVmaW5lIE9CSl9zaGEyMjQJCU9CSl9uaXN0X2hhc2hhbGdzLDRMCisKKyNkZWZpbmUgT0JKX2RzYV93aXRoX3NoYTIJCU9CSl9uaXN0QWxnb3JpdGhtcywzTAorCisjZGVmaW5lIFNOX2RzYV93aXRoX1NIQTIyNAkJImRzYV93aXRoX1NIQTIyNCIKKyNkZWZpbmUgTklEX2RzYV93aXRoX1NIQTIyNAkJODAyCisjZGVmaW5lIE9CSl9kc2Ffd2l0aF9TSEEyMjQJCU9CSl9kc2Ffd2l0aF9zaGEyLDFMCisKKyNkZWZpbmUgU05fZHNhX3dpdGhfU0hBMjU2CQkiZHNhX3dpdGhfU0hBMjU2IgorI2RlZmluZSBOSURfZHNhX3dpdGhfU0hBMjU2CQk4MDMKKyNkZWZpbmUgT0JKX2RzYV93aXRoX1NIQTI1NgkJT0JKX2RzYV93aXRoX3NoYTIsMkwKKworI2RlZmluZSBTTl9ob2xkX2luc3RydWN0aW9uX2NvZGUJCSJob2xkSW5zdHJ1Y3Rpb25Db2RlIgorI2RlZmluZSBMTl9ob2xkX2luc3RydWN0aW9uX2NvZGUJCSJIb2xkIEluc3RydWN0aW9uIENvZGUiCisjZGVmaW5lIE5JRF9ob2xkX2luc3RydWN0aW9uX2NvZGUJCTQzMAorI2RlZmluZSBPQkpfaG9sZF9pbnN0cnVjdGlvbl9jb2RlCQlPQkpfaWRfY2UsMjNMCisKKyNkZWZpbmUgT0JKX2hvbGRJbnN0cnVjdGlvbgkJT0JKX1g5XzU3LDJMCisKKyNkZWZpbmUgU05faG9sZF9pbnN0cnVjdGlvbl9ub25lCQkiaG9sZEluc3RydWN0aW9uTm9uZSIKKyNkZWZpbmUgTE5faG9sZF9pbnN0cnVjdGlvbl9ub25lCQkiSG9sZCBJbnN0cnVjdGlvbiBOb25lIgorI2RlZmluZSBOSURfaG9sZF9pbnN0cnVjdGlvbl9ub25lCQk0MzEKKyNkZWZpbmUgT0JKX2hvbGRfaW5zdHJ1Y3Rpb25fbm9uZQkJT0JKX2hvbGRJbnN0cnVjdGlvbiwxTAorCisjZGVmaW5lIFNOX2hvbGRfaW5zdHJ1Y3Rpb25fY2FsbF9pc3N1ZXIJCSJob2xkSW5zdHJ1Y3Rpb25DYWxsSXNzdWVyIgorI2RlZmluZSBMTl9ob2xkX2luc3RydWN0aW9uX2NhbGxfaXNzdWVyCQkiSG9sZCBJbnN0cnVjdGlvbiBDYWxsIElzc3VlciIKKyNkZWZpbmUgTklEX2hvbGRfaW5zdHJ1Y3Rpb25fY2FsbF9pc3N1ZXIJCTQzMgorI2RlZmluZSBPQkpfaG9sZF9pbnN0cnVjdGlvbl9jYWxsX2lzc3VlcgkJT0JKX2hvbGRJbnN0cnVjdGlvbiwyTAorCisjZGVmaW5lIFNOX2hvbGRfaW5zdHJ1Y3Rpb25fcmVqZWN0CQkiaG9sZEluc3RydWN0aW9uUmVqZWN0IgorI2RlZmluZSBMTl9ob2xkX2luc3RydWN0aW9uX3JlamVjdAkJIkhvbGQgSW5zdHJ1Y3Rpb24gUmVqZWN0IgorI2RlZmluZSBOSURfaG9sZF9pbnN0cnVjdGlvbl9yZWplY3QJCTQzMworI2RlZmluZSBPQkpfaG9sZF9pbnN0cnVjdGlvbl9yZWplY3QJCU9CSl9ob2xkSW5zdHJ1Y3Rpb24sM0wKKworI2RlZmluZSBTTl9kYXRhCQkiZGF0YSIKKyNkZWZpbmUgTklEX2RhdGEJCTQzNAorI2RlZmluZSBPQkpfZGF0YQkJT0JKX2l0dV90LDlMCisKKyNkZWZpbmUgU05fcHNzCQkicHNzIgorI2RlZmluZSBOSURfcHNzCQk0MzUKKyNkZWZpbmUgT0JKX3BzcwkJT0JKX2RhdGEsMjM0MkwKKworI2RlZmluZSBTTl91Y2wJCSJ1Y2wiCisjZGVmaW5lIE5JRF91Y2wJCTQzNgorI2RlZmluZSBPQkpfdWNsCQlPQkpfcHNzLDE5MjAwMzAwTAorCisjZGVmaW5lIFNOX3BpbG90CQkicGlsb3QiCisjZGVmaW5lIE5JRF9waWxvdAkJNDM3CisjZGVmaW5lIE9CSl9waWxvdAkJT0JKX3VjbCwxMDBMCisKKyNkZWZpbmUgTE5fcGlsb3RBdHRyaWJ1dGVUeXBlCQkicGlsb3RBdHRyaWJ1dGVUeXBlIgorI2RlZmluZSBOSURfcGlsb3RBdHRyaWJ1dGVUeXBlCQk0MzgKKyNkZWZpbmUgT0JKX3BpbG90QXR0cmlidXRlVHlwZQkJT0JKX3BpbG90LDFMCisKKyNkZWZpbmUgTE5fcGlsb3RBdHRyaWJ1dGVTeW50YXgJCSJwaWxvdEF0dHJpYnV0ZVN5bnRheCIKKyNkZWZpbmUgTklEX3BpbG90QXR0cmlidXRlU3ludGF4CQk0MzkKKyNkZWZpbmUgT0JKX3BpbG90QXR0cmlidXRlU3ludGF4CQlPQkpfcGlsb3QsM0wKKworI2RlZmluZSBMTl9waWxvdE9iamVjdENsYXNzCQkicGlsb3RPYmplY3RDbGFzcyIKKyNkZWZpbmUgTklEX3BpbG90T2JqZWN0Q2xhc3MJCTQ0MAorI2RlZmluZSBPQkpfcGlsb3RPYmplY3RDbGFzcwkJT0JKX3BpbG90LDRMCisKKyNkZWZpbmUgTE5fcGlsb3RHcm91cHMJCSJwaWxvdEdyb3VwcyIKKyNkZWZpbmUgTklEX3BpbG90R3JvdXBzCQk0NDEKKyNkZWZpbmUgT0JKX3BpbG90R3JvdXBzCQlPQkpfcGlsb3QsMTBMCisKKyNkZWZpbmUgTE5faUE1U3RyaW5nU3ludGF4CQkiaUE1U3RyaW5nU3ludGF4IgorI2RlZmluZSBOSURfaUE1U3RyaW5nU3ludGF4CQk0NDIKKyNkZWZpbmUgT0JKX2lBNVN0cmluZ1N5bnRheAkJT0JKX3BpbG90QXR0cmlidXRlU3ludGF4LDRMCisKKyNkZWZpbmUgTE5fY2FzZUlnbm9yZUlBNVN0cmluZ1N5bnRheAkJImNhc2VJZ25vcmVJQTVTdHJpbmdTeW50YXgiCisjZGVmaW5lIE5JRF9jYXNlSWdub3JlSUE1U3RyaW5nU3ludGF4CQk0NDMKKyNkZWZpbmUgT0JKX2Nhc2VJZ25vcmVJQTVTdHJpbmdTeW50YXgJCU9CSl9waWxvdEF0dHJpYnV0ZVN5bnRheCw1TAorCisjZGVmaW5lIExOX3BpbG90T2JqZWN0CQkicGlsb3RPYmplY3QiCisjZGVmaW5lIE5JRF9waWxvdE9iamVjdAkJNDQ0CisjZGVmaW5lIE9CSl9waWxvdE9iamVjdAkJT0JKX3BpbG90T2JqZWN0Q2xhc3MsM0wKKworI2RlZmluZSBMTl9waWxvdFBlcnNvbgkJInBpbG90UGVyc29uIgorI2RlZmluZSBOSURfcGlsb3RQZXJzb24JCTQ0NQorI2RlZmluZSBPQkpfcGlsb3RQZXJzb24JCU9CSl9waWxvdE9iamVjdENsYXNzLDRMCisKKyNkZWZpbmUgU05fYWNjb3VudAkJImFjY291bnQiCisjZGVmaW5lIE5JRF9hY2NvdW50CQk0NDYKKyNkZWZpbmUgT0JKX2FjY291bnQJCU9CSl9waWxvdE9iamVjdENsYXNzLDVMCisKKyNkZWZpbmUgU05fZG9jdW1lbnQJCSJkb2N1bWVudCIKKyNkZWZpbmUgTklEX2RvY3VtZW50CQk0NDcKKyNkZWZpbmUgT0JKX2RvY3VtZW50CQlPQkpfcGlsb3RPYmplY3RDbGFzcyw2TAorCisjZGVmaW5lIFNOX3Jvb20JCSJyb29tIgorI2RlZmluZSBOSURfcm9vbQkJNDQ4CisjZGVmaW5lIE9CSl9yb29tCQlPQkpfcGlsb3RPYmplY3RDbGFzcyw3TAorCisjZGVmaW5lIExOX2RvY3VtZW50U2VyaWVzCQkiZG9jdW1lbnRTZXJpZXMiCisjZGVmaW5lIE5JRF9kb2N1bWVudFNlcmllcwkJNDQ5CisjZGVmaW5lIE9CSl9kb2N1bWVudFNlcmllcwkJT0JKX3BpbG90T2JqZWN0Q2xhc3MsOUwKKworI2RlZmluZSBTTl9Eb21haW4JCSJkb21haW4iCisjZGVmaW5lIExOX0RvbWFpbgkJIkRvbWFpbiIKKyNkZWZpbmUgTklEX0RvbWFpbgkJMzkyCisjZGVmaW5lIE9CSl9Eb21haW4JCU9CSl9waWxvdE9iamVjdENsYXNzLDEzTAorCisjZGVmaW5lIExOX3JGQzgyMmxvY2FsUGFydAkJInJGQzgyMmxvY2FsUGFydCIKKyNkZWZpbmUgTklEX3JGQzgyMmxvY2FsUGFydAkJNDUwCisjZGVmaW5lIE9CSl9yRkM4MjJsb2NhbFBhcnQJCU9CSl9waWxvdE9iamVjdENsYXNzLDE0TAorCisjZGVmaW5lIExOX2ROU0RvbWFpbgkJImROU0RvbWFpbiIKKyNkZWZpbmUgTklEX2ROU0RvbWFpbgkJNDUxCisjZGVmaW5lIE9CSl9kTlNEb21haW4JCU9CSl9waWxvdE9iamVjdENsYXNzLDE1TAorCisjZGVmaW5lIExOX2RvbWFpblJlbGF0ZWRPYmplY3QJCSJkb21haW5SZWxhdGVkT2JqZWN0IgorI2RlZmluZSBOSURfZG9tYWluUmVsYXRlZE9iamVjdAkJNDUyCisjZGVmaW5lIE9CSl9kb21haW5SZWxhdGVkT2JqZWN0CQlPQkpfcGlsb3RPYmplY3RDbGFzcywxN0wKKworI2RlZmluZSBMTl9mcmllbmRseUNvdW50cnkJCSJmcmllbmRseUNvdW50cnkiCisjZGVmaW5lIE5JRF9mcmllbmRseUNvdW50cnkJCTQ1MworI2RlZmluZSBPQkpfZnJpZW5kbHlDb3VudHJ5CQlPQkpfcGlsb3RPYmplY3RDbGFzcywxOEwKKworI2RlZmluZSBMTl9zaW1wbGVTZWN1cml0eU9iamVjdAkJInNpbXBsZVNlY3VyaXR5T2JqZWN0IgorI2RlZmluZSBOSURfc2ltcGxlU2VjdXJpdHlPYmplY3QJCTQ1NAorI2RlZmluZSBPQkpfc2ltcGxlU2VjdXJpdHlPYmplY3QJCU9CSl9waWxvdE9iamVjdENsYXNzLDE5TAorCisjZGVmaW5lIExOX3BpbG90T3JnYW5pemF0aW9uCQkicGlsb3RPcmdhbml6YXRpb24iCisjZGVmaW5lIE5JRF9waWxvdE9yZ2FuaXphdGlvbgkJNDU1CisjZGVmaW5lIE9CSl9waWxvdE9yZ2FuaXphdGlvbgkJT0JKX3BpbG90T2JqZWN0Q2xhc3MsMjBMCisKKyNkZWZpbmUgTE5fcGlsb3REU0EJCSJwaWxvdERTQSIKKyNkZWZpbmUgTklEX3BpbG90RFNBCQk0NTYKKyNkZWZpbmUgT0JKX3BpbG90RFNBCQlPQkpfcGlsb3RPYmplY3RDbGFzcywyMUwKKworI2RlZmluZSBMTl9xdWFsaXR5TGFiZWxsZWREYXRhCQkicXVhbGl0eUxhYmVsbGVkRGF0YSIKKyNkZWZpbmUgTklEX3F1YWxpdHlMYWJlbGxlZERhdGEJCTQ1NworI2RlZmluZSBPQkpfcXVhbGl0eUxhYmVsbGVkRGF0YQkJT0JKX3BpbG90T2JqZWN0Q2xhc3MsMjJMCisKKyNkZWZpbmUgU05fdXNlcklkCQkiVUlEIgorI2RlZmluZSBMTl91c2VySWQJCSJ1c2VySWQiCisjZGVmaW5lIE5JRF91c2VySWQJCTQ1OAorI2RlZmluZSBPQkpfdXNlcklkCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDFMCisKKyNkZWZpbmUgTE5fdGV4dEVuY29kZWRPUkFkZHJlc3MJCSJ0ZXh0RW5jb2RlZE9SQWRkcmVzcyIKKyNkZWZpbmUgTklEX3RleHRFbmNvZGVkT1JBZGRyZXNzCQk0NTkKKyNkZWZpbmUgT0JKX3RleHRFbmNvZGVkT1JBZGRyZXNzCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDJMCisKKyNkZWZpbmUgU05fcmZjODIyTWFpbGJveAkJIm1haWwiCisjZGVmaW5lIExOX3JmYzgyMk1haWxib3gJCSJyZmM4MjJNYWlsYm94IgorI2RlZmluZSBOSURfcmZjODIyTWFpbGJveAkJNDYwCisjZGVmaW5lIE9CSl9yZmM4MjJNYWlsYm94CQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDNMCisKKyNkZWZpbmUgU05faW5mbwkJImluZm8iCisjZGVmaW5lIE5JRF9pbmZvCQk0NjEKKyNkZWZpbmUgT0JKX2luZm8JCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsNEwKKworI2RlZmluZSBMTl9mYXZvdXJpdGVEcmluawkJImZhdm91cml0ZURyaW5rIgorI2RlZmluZSBOSURfZmF2b3VyaXRlRHJpbmsJCTQ2MgorI2RlZmluZSBPQkpfZmF2b3VyaXRlRHJpbmsJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsNUwKKworI2RlZmluZSBMTl9yb29tTnVtYmVyCQkicm9vbU51bWJlciIKKyNkZWZpbmUgTklEX3Jvb21OdW1iZXIJCTQ2MworI2RlZmluZSBPQkpfcm9vbU51bWJlcgkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSw2TAorCisjZGVmaW5lIFNOX3Bob3RvCQkicGhvdG8iCisjZGVmaW5lIE5JRF9waG90bwkJNDY0CisjZGVmaW5lIE9CSl9waG90bwkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSw3TAorCisjZGVmaW5lIExOX3VzZXJDbGFzcwkJInVzZXJDbGFzcyIKKyNkZWZpbmUgTklEX3VzZXJDbGFzcwkJNDY1CisjZGVmaW5lIE9CSl91c2VyQ2xhc3MJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsOEwKKworI2RlZmluZSBTTl9ob3N0CQkiaG9zdCIKKyNkZWZpbmUgTklEX2hvc3QJCTQ2NgorI2RlZmluZSBPQkpfaG9zdAkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSw5TAorCisjZGVmaW5lIFNOX21hbmFnZXIJCSJtYW5hZ2VyIgorI2RlZmluZSBOSURfbWFuYWdlcgkJNDY3CisjZGVmaW5lIE9CSl9tYW5hZ2VyCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDEwTAorCisjZGVmaW5lIExOX2RvY3VtZW50SWRlbnRpZmllcgkJImRvY3VtZW50SWRlbnRpZmllciIKKyNkZWZpbmUgTklEX2RvY3VtZW50SWRlbnRpZmllcgkJNDY4CisjZGVmaW5lIE9CSl9kb2N1bWVudElkZW50aWZpZXIJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsMTFMCisKKyNkZWZpbmUgTE5fZG9jdW1lbnRUaXRsZQkJImRvY3VtZW50VGl0bGUiCisjZGVmaW5lIE5JRF9kb2N1bWVudFRpdGxlCQk0NjkKKyNkZWZpbmUgT0JKX2RvY3VtZW50VGl0bGUJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsMTJMCisKKyNkZWZpbmUgTE5fZG9jdW1lbnRWZXJzaW9uCQkiZG9jdW1lbnRWZXJzaW9uIgorI2RlZmluZSBOSURfZG9jdW1lbnRWZXJzaW9uCQk0NzAKKyNkZWZpbmUgT0JKX2RvY3VtZW50VmVyc2lvbgkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSwxM0wKKworI2RlZmluZSBMTl9kb2N1bWVudEF1dGhvcgkJImRvY3VtZW50QXV0aG9yIgorI2RlZmluZSBOSURfZG9jdW1lbnRBdXRob3IJCTQ3MQorI2RlZmluZSBPQkpfZG9jdW1lbnRBdXRob3IJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsMTRMCisKKyNkZWZpbmUgTE5fZG9jdW1lbnRMb2NhdGlvbgkJImRvY3VtZW50TG9jYXRpb24iCisjZGVmaW5lIE5JRF9kb2N1bWVudExvY2F0aW9uCQk0NzIKKyNkZWZpbmUgT0JKX2RvY3VtZW50TG9jYXRpb24JCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsMTVMCisKKyNkZWZpbmUgTE5faG9tZVRlbGVwaG9uZU51bWJlcgkJImhvbWVUZWxlcGhvbmVOdW1iZXIiCisjZGVmaW5lIE5JRF9ob21lVGVsZXBob25lTnVtYmVyCQk0NzMKKyNkZWZpbmUgT0JKX2hvbWVUZWxlcGhvbmVOdW1iZXIJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsMjBMCisKKyNkZWZpbmUgU05fc2VjcmV0YXJ5CQkic2VjcmV0YXJ5IgorI2RlZmluZSBOSURfc2VjcmV0YXJ5CQk0NzQKKyNkZWZpbmUgT0JKX3NlY3JldGFyeQkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSwyMUwKKworI2RlZmluZSBMTl9vdGhlck1haWxib3gJCSJvdGhlck1haWxib3giCisjZGVmaW5lIE5JRF9vdGhlck1haWxib3gJCTQ3NQorI2RlZmluZSBPQkpfb3RoZXJNYWlsYm94CQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDIyTAorCisjZGVmaW5lIExOX2xhc3RNb2RpZmllZFRpbWUJCSJsYXN0TW9kaWZpZWRUaW1lIgorI2RlZmluZSBOSURfbGFzdE1vZGlmaWVkVGltZQkJNDc2CisjZGVmaW5lIE9CSl9sYXN0TW9kaWZpZWRUaW1lCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDIzTAorCisjZGVmaW5lIExOX2xhc3RNb2RpZmllZEJ5CQkibGFzdE1vZGlmaWVkQnkiCisjZGVmaW5lIE5JRF9sYXN0TW9kaWZpZWRCeQkJNDc3CisjZGVmaW5lIE9CSl9sYXN0TW9kaWZpZWRCeQkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSwyNEwKKworI2RlZmluZSBTTl9kb21haW5Db21wb25lbnQJCSJEQyIKKyNkZWZpbmUgTE5fZG9tYWluQ29tcG9uZW50CQkiZG9tYWluQ29tcG9uZW50IgorI2RlZmluZSBOSURfZG9tYWluQ29tcG9uZW50CQkzOTEKKyNkZWZpbmUgT0JKX2RvbWFpbkNvbXBvbmVudAkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSwyNUwKKworI2RlZmluZSBMTl9hUmVjb3JkCQkiYVJlY29yZCIKKyNkZWZpbmUgTklEX2FSZWNvcmQJCTQ3OAorI2RlZmluZSBPQkpfYVJlY29yZAkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSwyNkwKKworI2RlZmluZSBMTl9waWxvdEF0dHJpYnV0ZVR5cGUyNwkJInBpbG90QXR0cmlidXRlVHlwZTI3IgorI2RlZmluZSBOSURfcGlsb3RBdHRyaWJ1dGVUeXBlMjcJCTQ3OQorI2RlZmluZSBPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlMjcJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsMjdMCisKKyNkZWZpbmUgTE5fbVhSZWNvcmQJCSJtWFJlY29yZCIKKyNkZWZpbmUgTklEX21YUmVjb3JkCQk0ODAKKyNkZWZpbmUgT0JKX21YUmVjb3JkCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDI4TAorCisjZGVmaW5lIExOX25TUmVjb3JkCQkiblNSZWNvcmQiCisjZGVmaW5lIE5JRF9uU1JlY29yZAkJNDgxCisjZGVmaW5lIE9CSl9uU1JlY29yZAkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSwyOUwKKworI2RlZmluZSBMTl9zT0FSZWNvcmQJCSJzT0FSZWNvcmQiCisjZGVmaW5lIE5JRF9zT0FSZWNvcmQJCTQ4MgorI2RlZmluZSBPQkpfc09BUmVjb3JkCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDMwTAorCisjZGVmaW5lIExOX2NOQU1FUmVjb3JkCQkiY05BTUVSZWNvcmQiCisjZGVmaW5lIE5JRF9jTkFNRVJlY29yZAkJNDgzCisjZGVmaW5lIE9CSl9jTkFNRVJlY29yZAkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSwzMUwKKworI2RlZmluZSBMTl9hc3NvY2lhdGVkRG9tYWluCQkiYXNzb2NpYXRlZERvbWFpbiIKKyNkZWZpbmUgTklEX2Fzc29jaWF0ZWREb21haW4JCTQ4NAorI2RlZmluZSBPQkpfYXNzb2NpYXRlZERvbWFpbgkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSwzN0wKKworI2RlZmluZSBMTl9hc3NvY2lhdGVkTmFtZQkJImFzc29jaWF0ZWROYW1lIgorI2RlZmluZSBOSURfYXNzb2NpYXRlZE5hbWUJCTQ4NQorI2RlZmluZSBPQkpfYXNzb2NpYXRlZE5hbWUJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsMzhMCisKKyNkZWZpbmUgTE5faG9tZVBvc3RhbEFkZHJlc3MJCSJob21lUG9zdGFsQWRkcmVzcyIKKyNkZWZpbmUgTklEX2hvbWVQb3N0YWxBZGRyZXNzCQk0ODYKKyNkZWZpbmUgT0JKX2hvbWVQb3N0YWxBZGRyZXNzCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDM5TAorCisjZGVmaW5lIExOX3BlcnNvbmFsVGl0bGUJCSJwZXJzb25hbFRpdGxlIgorI2RlZmluZSBOSURfcGVyc29uYWxUaXRsZQkJNDg3CisjZGVmaW5lIE9CSl9wZXJzb25hbFRpdGxlCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDQwTAorCisjZGVmaW5lIExOX21vYmlsZVRlbGVwaG9uZU51bWJlcgkJIm1vYmlsZVRlbGVwaG9uZU51bWJlciIKKyNkZWZpbmUgTklEX21vYmlsZVRlbGVwaG9uZU51bWJlcgkJNDg4CisjZGVmaW5lIE9CSl9tb2JpbGVUZWxlcGhvbmVOdW1iZXIJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsNDFMCisKKyNkZWZpbmUgTE5fcGFnZXJUZWxlcGhvbmVOdW1iZXIJCSJwYWdlclRlbGVwaG9uZU51bWJlciIKKyNkZWZpbmUgTklEX3BhZ2VyVGVsZXBob25lTnVtYmVyCQk0ODkKKyNkZWZpbmUgT0JKX3BhZ2VyVGVsZXBob25lTnVtYmVyCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDQyTAorCisjZGVmaW5lIExOX2ZyaWVuZGx5Q291bnRyeU5hbWUJCSJmcmllbmRseUNvdW50cnlOYW1lIgorI2RlZmluZSBOSURfZnJpZW5kbHlDb3VudHJ5TmFtZQkJNDkwCisjZGVmaW5lIE9CSl9mcmllbmRseUNvdW50cnlOYW1lCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDQzTAorCisjZGVmaW5lIExOX29yZ2FuaXphdGlvbmFsU3RhdHVzCQkib3JnYW5pemF0aW9uYWxTdGF0dXMiCisjZGVmaW5lIE5JRF9vcmdhbml6YXRpb25hbFN0YXR1cwkJNDkxCisjZGVmaW5lIE9CSl9vcmdhbml6YXRpb25hbFN0YXR1cwkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSw0NUwKKworI2RlZmluZSBMTl9qYW5ldE1haWxib3gJCSJqYW5ldE1haWxib3giCisjZGVmaW5lIE5JRF9qYW5ldE1haWxib3gJCTQ5MgorI2RlZmluZSBPQkpfamFuZXRNYWlsYm94CQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDQ2TAorCisjZGVmaW5lIExOX21haWxQcmVmZXJlbmNlT3B0aW9uCQkibWFpbFByZWZlcmVuY2VPcHRpb24iCisjZGVmaW5lIE5JRF9tYWlsUHJlZmVyZW5jZU9wdGlvbgkJNDkzCisjZGVmaW5lIE9CSl9tYWlsUHJlZmVyZW5jZU9wdGlvbgkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSw0N0wKKworI2RlZmluZSBMTl9idWlsZGluZ05hbWUJCSJidWlsZGluZ05hbWUiCisjZGVmaW5lIE5JRF9idWlsZGluZ05hbWUJCTQ5NAorI2RlZmluZSBPQkpfYnVpbGRpbmdOYW1lCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDQ4TAorCisjZGVmaW5lIExOX2RTQVF1YWxpdHkJCSJkU0FRdWFsaXR5IgorI2RlZmluZSBOSURfZFNBUXVhbGl0eQkJNDk1CisjZGVmaW5lIE9CSl9kU0FRdWFsaXR5CQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDQ5TAorCisjZGVmaW5lIExOX3NpbmdsZUxldmVsUXVhbGl0eQkJInNpbmdsZUxldmVsUXVhbGl0eSIKKyNkZWZpbmUgTklEX3NpbmdsZUxldmVsUXVhbGl0eQkJNDk2CisjZGVmaW5lIE9CSl9zaW5nbGVMZXZlbFF1YWxpdHkJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsNTBMCisKKyNkZWZpbmUgTE5fc3VidHJlZU1pbmltdW1RdWFsaXR5CQkic3VidHJlZU1pbmltdW1RdWFsaXR5IgorI2RlZmluZSBOSURfc3VidHJlZU1pbmltdW1RdWFsaXR5CQk0OTcKKyNkZWZpbmUgT0JKX3N1YnRyZWVNaW5pbXVtUXVhbGl0eQkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSw1MUwKKworI2RlZmluZSBMTl9zdWJ0cmVlTWF4aW11bVF1YWxpdHkJCSJzdWJ0cmVlTWF4aW11bVF1YWxpdHkiCisjZGVmaW5lIE5JRF9zdWJ0cmVlTWF4aW11bVF1YWxpdHkJCTQ5OAorI2RlZmluZSBPQkpfc3VidHJlZU1heGltdW1RdWFsaXR5CQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDUyTAorCisjZGVmaW5lIExOX3BlcnNvbmFsU2lnbmF0dXJlCQkicGVyc29uYWxTaWduYXR1cmUiCisjZGVmaW5lIE5JRF9wZXJzb25hbFNpZ25hdHVyZQkJNDk5CisjZGVmaW5lIE9CSl9wZXJzb25hbFNpZ25hdHVyZQkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSw1M0wKKworI2RlZmluZSBMTl9kSVRSZWRpcmVjdAkJImRJVFJlZGlyZWN0IgorI2RlZmluZSBOSURfZElUUmVkaXJlY3QJCTUwMAorI2RlZmluZSBPQkpfZElUUmVkaXJlY3QJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsNTRMCisKKyNkZWZpbmUgU05fYXVkaW8JCSJhdWRpbyIKKyNkZWZpbmUgTklEX2F1ZGlvCQk1MDEKKyNkZWZpbmUgT0JKX2F1ZGlvCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDU1TAorCisjZGVmaW5lIExOX2RvY3VtZW50UHVibGlzaGVyCQkiZG9jdW1lbnRQdWJsaXNoZXIiCisjZGVmaW5lIE5JRF9kb2N1bWVudFB1Ymxpc2hlcgkJNTAyCisjZGVmaW5lIE9CSl9kb2N1bWVudFB1Ymxpc2hlcgkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSw1NkwKKworI2RlZmluZSBTTl9pZF9zZXQJCSJpZC1zZXQiCisjZGVmaW5lIExOX2lkX3NldAkJIlNlY3VyZSBFbGVjdHJvbmljIFRyYW5zYWN0aW9ucyIKKyNkZWZpbmUgTklEX2lkX3NldAkJNTEyCisjZGVmaW5lIE9CSl9pZF9zZXQJCU9CSl9pbnRlcm5hdGlvbmFsX29yZ2FuaXphdGlvbnMsNDJMCisKKyNkZWZpbmUgU05fc2V0X2N0eXBlCQkic2V0LWN0eXBlIgorI2RlZmluZSBMTl9zZXRfY3R5cGUJCSJjb250ZW50IHR5cGVzIgorI2RlZmluZSBOSURfc2V0X2N0eXBlCQk1MTMKKyNkZWZpbmUgT0JKX3NldF9jdHlwZQkJT0JKX2lkX3NldCwwTAorCisjZGVmaW5lIFNOX3NldF9tc2dFeHQJCSJzZXQtbXNnRXh0IgorI2RlZmluZSBMTl9zZXRfbXNnRXh0CQkibWVzc2FnZSBleHRlbnNpb25zIgorI2RlZmluZSBOSURfc2V0X21zZ0V4dAkJNTE0CisjZGVmaW5lIE9CSl9zZXRfbXNnRXh0CQlPQkpfaWRfc2V0LDFMCisKKyNkZWZpbmUgU05fc2V0X2F0dHIJCSJzZXQtYXR0ciIKKyNkZWZpbmUgTklEX3NldF9hdHRyCQk1MTUKKyNkZWZpbmUgT0JKX3NldF9hdHRyCQlPQkpfaWRfc2V0LDNMCisKKyNkZWZpbmUgU05fc2V0X3BvbGljeQkJInNldC1wb2xpY3kiCisjZGVmaW5lIE5JRF9zZXRfcG9saWN5CQk1MTYKKyNkZWZpbmUgT0JKX3NldF9wb2xpY3kJCU9CSl9pZF9zZXQsNUwKKworI2RlZmluZSBTTl9zZXRfY2VydEV4dAkJInNldC1jZXJ0RXh0IgorI2RlZmluZSBMTl9zZXRfY2VydEV4dAkJImNlcnRpZmljYXRlIGV4dGVuc2lvbnMiCisjZGVmaW5lIE5JRF9zZXRfY2VydEV4dAkJNTE3CisjZGVmaW5lIE9CSl9zZXRfY2VydEV4dAkJT0JKX2lkX3NldCw3TAorCisjZGVmaW5lIFNOX3NldF9icmFuZAkJInNldC1icmFuZCIKKyNkZWZpbmUgTklEX3NldF9icmFuZAkJNTE4CisjZGVmaW5lIE9CSl9zZXRfYnJhbmQJCU9CSl9pZF9zZXQsOEwKKworI2RlZmluZSBTTl9zZXRjdF9QQU5EYXRhCQkic2V0Y3QtUEFORGF0YSIKKyNkZWZpbmUgTklEX3NldGN0X1BBTkRhdGEJCTUxOQorI2RlZmluZSBPQkpfc2V0Y3RfUEFORGF0YQkJT0JKX3NldF9jdHlwZSwwTAorCisjZGVmaW5lIFNOX3NldGN0X1BBTlRva2VuCQkic2V0Y3QtUEFOVG9rZW4iCisjZGVmaW5lIE5JRF9zZXRjdF9QQU5Ub2tlbgkJNTIwCisjZGVmaW5lIE9CSl9zZXRjdF9QQU5Ub2tlbgkJT0JKX3NldF9jdHlwZSwxTAorCisjZGVmaW5lIFNOX3NldGN0X1BBTk9ubHkJCSJzZXRjdC1QQU5Pbmx5IgorI2RlZmluZSBOSURfc2V0Y3RfUEFOT25seQkJNTIxCisjZGVmaW5lIE9CSl9zZXRjdF9QQU5Pbmx5CQlPQkpfc2V0X2N0eXBlLDJMCisKKyNkZWZpbmUgU05fc2V0Y3RfT0lEYXRhCQkic2V0Y3QtT0lEYXRhIgorI2RlZmluZSBOSURfc2V0Y3RfT0lEYXRhCQk1MjIKKyNkZWZpbmUgT0JKX3NldGN0X09JRGF0YQkJT0JKX3NldF9jdHlwZSwzTAorCisjZGVmaW5lIFNOX3NldGN0X1BJCQkic2V0Y3QtUEkiCisjZGVmaW5lIE5JRF9zZXRjdF9QSQkJNTIzCisjZGVmaW5lIE9CSl9zZXRjdF9QSQkJT0JKX3NldF9jdHlwZSw0TAorCisjZGVmaW5lIFNOX3NldGN0X1BJRGF0YQkJInNldGN0LVBJRGF0YSIKKyNkZWZpbmUgTklEX3NldGN0X1BJRGF0YQkJNTI0CisjZGVmaW5lIE9CSl9zZXRjdF9QSURhdGEJCU9CSl9zZXRfY3R5cGUsNUwKKworI2RlZmluZSBTTl9zZXRjdF9QSURhdGFVbnNpZ25lZAkJInNldGN0LVBJRGF0YVVuc2lnbmVkIgorI2RlZmluZSBOSURfc2V0Y3RfUElEYXRhVW5zaWduZWQJCTUyNQorI2RlZmluZSBPQkpfc2V0Y3RfUElEYXRhVW5zaWduZWQJCU9CSl9zZXRfY3R5cGUsNkwKKworI2RlZmluZSBTTl9zZXRjdF9IT0RJbnB1dAkJInNldGN0LUhPRElucHV0IgorI2RlZmluZSBOSURfc2V0Y3RfSE9ESW5wdXQJCTUyNgorI2RlZmluZSBPQkpfc2V0Y3RfSE9ESW5wdXQJCU9CSl9zZXRfY3R5cGUsN0wKKworI2RlZmluZSBTTl9zZXRjdF9BdXRoUmVzQmFnZ2FnZQkJInNldGN0LUF1dGhSZXNCYWdnYWdlIgorI2RlZmluZSBOSURfc2V0Y3RfQXV0aFJlc0JhZ2dhZ2UJCTUyNworI2RlZmluZSBPQkpfc2V0Y3RfQXV0aFJlc0JhZ2dhZ2UJCU9CSl9zZXRfY3R5cGUsOEwKKworI2RlZmluZSBTTl9zZXRjdF9BdXRoUmV2UmVxQmFnZ2FnZQkJInNldGN0LUF1dGhSZXZSZXFCYWdnYWdlIgorI2RlZmluZSBOSURfc2V0Y3RfQXV0aFJldlJlcUJhZ2dhZ2UJCTUyOAorI2RlZmluZSBPQkpfc2V0Y3RfQXV0aFJldlJlcUJhZ2dhZ2UJCU9CSl9zZXRfY3R5cGUsOUwKKworI2RlZmluZSBTTl9zZXRjdF9BdXRoUmV2UmVzQmFnZ2FnZQkJInNldGN0LUF1dGhSZXZSZXNCYWdnYWdlIgorI2RlZmluZSBOSURfc2V0Y3RfQXV0aFJldlJlc0JhZ2dhZ2UJCTUyOQorI2RlZmluZSBPQkpfc2V0Y3RfQXV0aFJldlJlc0JhZ2dhZ2UJCU9CSl9zZXRfY3R5cGUsMTBMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ2FwVG9rZW5TZXEJCSJzZXRjdC1DYXBUb2tlblNlcSIKKyNkZWZpbmUgTklEX3NldGN0X0NhcFRva2VuU2VxCQk1MzAKKyNkZWZpbmUgT0JKX3NldGN0X0NhcFRva2VuU2VxCQlPQkpfc2V0X2N0eXBlLDExTAorCisjZGVmaW5lIFNOX3NldGN0X1BJbml0UmVzRGF0YQkJInNldGN0LVBJbml0UmVzRGF0YSIKKyNkZWZpbmUgTklEX3NldGN0X1BJbml0UmVzRGF0YQkJNTMxCisjZGVmaW5lIE9CSl9zZXRjdF9QSW5pdFJlc0RhdGEJCU9CSl9zZXRfY3R5cGUsMTJMCisKKyNkZWZpbmUgU05fc2V0Y3RfUElfVEJTCQkic2V0Y3QtUEktVEJTIgorI2RlZmluZSBOSURfc2V0Y3RfUElfVEJTCQk1MzIKKyNkZWZpbmUgT0JKX3NldGN0X1BJX1RCUwkJT0JKX3NldF9jdHlwZSwxM0wKKworI2RlZmluZSBTTl9zZXRjdF9QUmVzRGF0YQkJInNldGN0LVBSZXNEYXRhIgorI2RlZmluZSBOSURfc2V0Y3RfUFJlc0RhdGEJCTUzMworI2RlZmluZSBPQkpfc2V0Y3RfUFJlc0RhdGEJCU9CSl9zZXRfY3R5cGUsMTRMCisKKyNkZWZpbmUgU05fc2V0Y3RfQXV0aFJlcVRCUwkJInNldGN0LUF1dGhSZXFUQlMiCisjZGVmaW5lIE5JRF9zZXRjdF9BdXRoUmVxVEJTCQk1MzQKKyNkZWZpbmUgT0JKX3NldGN0X0F1dGhSZXFUQlMJCU9CSl9zZXRfY3R5cGUsMTZMCisKKyNkZWZpbmUgU05fc2V0Y3RfQXV0aFJlc1RCUwkJInNldGN0LUF1dGhSZXNUQlMiCisjZGVmaW5lIE5JRF9zZXRjdF9BdXRoUmVzVEJTCQk1MzUKKyNkZWZpbmUgT0JKX3NldGN0X0F1dGhSZXNUQlMJCU9CSl9zZXRfY3R5cGUsMTdMCisKKyNkZWZpbmUgU05fc2V0Y3RfQXV0aFJlc1RCU1gJCSJzZXRjdC1BdXRoUmVzVEJTWCIKKyNkZWZpbmUgTklEX3NldGN0X0F1dGhSZXNUQlNYCQk1MzYKKyNkZWZpbmUgT0JKX3NldGN0X0F1dGhSZXNUQlNYCQlPQkpfc2V0X2N0eXBlLDE4TAorCisjZGVmaW5lIFNOX3NldGN0X0F1dGhUb2tlblRCUwkJInNldGN0LUF1dGhUb2tlblRCUyIKKyNkZWZpbmUgTklEX3NldGN0X0F1dGhUb2tlblRCUwkJNTM3CisjZGVmaW5lIE9CSl9zZXRjdF9BdXRoVG9rZW5UQlMJCU9CSl9zZXRfY3R5cGUsMTlMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ2FwVG9rZW5EYXRhCQkic2V0Y3QtQ2FwVG9rZW5EYXRhIgorI2RlZmluZSBOSURfc2V0Y3RfQ2FwVG9rZW5EYXRhCQk1MzgKKyNkZWZpbmUgT0JKX3NldGN0X0NhcFRva2VuRGF0YQkJT0JKX3NldF9jdHlwZSwyMEwKKworI2RlZmluZSBTTl9zZXRjdF9DYXBUb2tlblRCUwkJInNldGN0LUNhcFRva2VuVEJTIgorI2RlZmluZSBOSURfc2V0Y3RfQ2FwVG9rZW5UQlMJCTUzOQorI2RlZmluZSBPQkpfc2V0Y3RfQ2FwVG9rZW5UQlMJCU9CSl9zZXRfY3R5cGUsMjFMCisKKyNkZWZpbmUgU05fc2V0Y3RfQWNxQ2FyZENvZGVNc2cJCSJzZXRjdC1BY3FDYXJkQ29kZU1zZyIKKyNkZWZpbmUgTklEX3NldGN0X0FjcUNhcmRDb2RlTXNnCQk1NDAKKyNkZWZpbmUgT0JKX3NldGN0X0FjcUNhcmRDb2RlTXNnCQlPQkpfc2V0X2N0eXBlLDIyTAorCisjZGVmaW5lIFNOX3NldGN0X0F1dGhSZXZSZXFUQlMJCSJzZXRjdC1BdXRoUmV2UmVxVEJTIgorI2RlZmluZSBOSURfc2V0Y3RfQXV0aFJldlJlcVRCUwkJNTQxCisjZGVmaW5lIE9CSl9zZXRjdF9BdXRoUmV2UmVxVEJTCQlPQkpfc2V0X2N0eXBlLDIzTAorCisjZGVmaW5lIFNOX3NldGN0X0F1dGhSZXZSZXNEYXRhCQkic2V0Y3QtQXV0aFJldlJlc0RhdGEiCisjZGVmaW5lIE5JRF9zZXRjdF9BdXRoUmV2UmVzRGF0YQkJNTQyCisjZGVmaW5lIE9CSl9zZXRjdF9BdXRoUmV2UmVzRGF0YQkJT0JKX3NldF9jdHlwZSwyNEwKKworI2RlZmluZSBTTl9zZXRjdF9BdXRoUmV2UmVzVEJTCQkic2V0Y3QtQXV0aFJldlJlc1RCUyIKKyNkZWZpbmUgTklEX3NldGN0X0F1dGhSZXZSZXNUQlMJCTU0MworI2RlZmluZSBPQkpfc2V0Y3RfQXV0aFJldlJlc1RCUwkJT0JKX3NldF9jdHlwZSwyNUwKKworI2RlZmluZSBTTl9zZXRjdF9DYXBSZXFUQlMJCSJzZXRjdC1DYXBSZXFUQlMiCisjZGVmaW5lIE5JRF9zZXRjdF9DYXBSZXFUQlMJCTU0NAorI2RlZmluZSBPQkpfc2V0Y3RfQ2FwUmVxVEJTCQlPQkpfc2V0X2N0eXBlLDI2TAorCisjZGVmaW5lIFNOX3NldGN0X0NhcFJlcVRCU1gJCSJzZXRjdC1DYXBSZXFUQlNYIgorI2RlZmluZSBOSURfc2V0Y3RfQ2FwUmVxVEJTWAkJNTQ1CisjZGVmaW5lIE9CSl9zZXRjdF9DYXBSZXFUQlNYCQlPQkpfc2V0X2N0eXBlLDI3TAorCisjZGVmaW5lIFNOX3NldGN0X0NhcFJlc0RhdGEJCSJzZXRjdC1DYXBSZXNEYXRhIgorI2RlZmluZSBOSURfc2V0Y3RfQ2FwUmVzRGF0YQkJNTQ2CisjZGVmaW5lIE9CSl9zZXRjdF9DYXBSZXNEYXRhCQlPQkpfc2V0X2N0eXBlLDI4TAorCisjZGVmaW5lIFNOX3NldGN0X0NhcFJldlJlcVRCUwkJInNldGN0LUNhcFJldlJlcVRCUyIKKyNkZWZpbmUgTklEX3NldGN0X0NhcFJldlJlcVRCUwkJNTQ3CisjZGVmaW5lIE9CSl9zZXRjdF9DYXBSZXZSZXFUQlMJCU9CSl9zZXRfY3R5cGUsMjlMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ2FwUmV2UmVxVEJTWAkJInNldGN0LUNhcFJldlJlcVRCU1giCisjZGVmaW5lIE5JRF9zZXRjdF9DYXBSZXZSZXFUQlNYCQk1NDgKKyNkZWZpbmUgT0JKX3NldGN0X0NhcFJldlJlcVRCU1gJCU9CSl9zZXRfY3R5cGUsMzBMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ2FwUmV2UmVzRGF0YQkJInNldGN0LUNhcFJldlJlc0RhdGEiCisjZGVmaW5lIE5JRF9zZXRjdF9DYXBSZXZSZXNEYXRhCQk1NDkKKyNkZWZpbmUgT0JKX3NldGN0X0NhcFJldlJlc0RhdGEJCU9CSl9zZXRfY3R5cGUsMzFMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ3JlZFJlcVRCUwkJInNldGN0LUNyZWRSZXFUQlMiCisjZGVmaW5lIE5JRF9zZXRjdF9DcmVkUmVxVEJTCQk1NTAKKyNkZWZpbmUgT0JKX3NldGN0X0NyZWRSZXFUQlMJCU9CSl9zZXRfY3R5cGUsMzJMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ3JlZFJlcVRCU1gJCSJzZXRjdC1DcmVkUmVxVEJTWCIKKyNkZWZpbmUgTklEX3NldGN0X0NyZWRSZXFUQlNYCQk1NTEKKyNkZWZpbmUgT0JKX3NldGN0X0NyZWRSZXFUQlNYCQlPQkpfc2V0X2N0eXBlLDMzTAorCisjZGVmaW5lIFNOX3NldGN0X0NyZWRSZXNEYXRhCQkic2V0Y3QtQ3JlZFJlc0RhdGEiCisjZGVmaW5lIE5JRF9zZXRjdF9DcmVkUmVzRGF0YQkJNTUyCisjZGVmaW5lIE9CSl9zZXRjdF9DcmVkUmVzRGF0YQkJT0JKX3NldF9jdHlwZSwzNEwKKworI2RlZmluZSBTTl9zZXRjdF9DcmVkUmV2UmVxVEJTCQkic2V0Y3QtQ3JlZFJldlJlcVRCUyIKKyNkZWZpbmUgTklEX3NldGN0X0NyZWRSZXZSZXFUQlMJCTU1MworI2RlZmluZSBPQkpfc2V0Y3RfQ3JlZFJldlJlcVRCUwkJT0JKX3NldF9jdHlwZSwzNUwKKworI2RlZmluZSBTTl9zZXRjdF9DcmVkUmV2UmVxVEJTWAkJInNldGN0LUNyZWRSZXZSZXFUQlNYIgorI2RlZmluZSBOSURfc2V0Y3RfQ3JlZFJldlJlcVRCU1gJCTU1NAorI2RlZmluZSBPQkpfc2V0Y3RfQ3JlZFJldlJlcVRCU1gJCU9CSl9zZXRfY3R5cGUsMzZMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ3JlZFJldlJlc0RhdGEJCSJzZXRjdC1DcmVkUmV2UmVzRGF0YSIKKyNkZWZpbmUgTklEX3NldGN0X0NyZWRSZXZSZXNEYXRhCQk1NTUKKyNkZWZpbmUgT0JKX3NldGN0X0NyZWRSZXZSZXNEYXRhCQlPQkpfc2V0X2N0eXBlLDM3TAorCisjZGVmaW5lIFNOX3NldGN0X1BDZXJ0UmVxRGF0YQkJInNldGN0LVBDZXJ0UmVxRGF0YSIKKyNkZWZpbmUgTklEX3NldGN0X1BDZXJ0UmVxRGF0YQkJNTU2CisjZGVmaW5lIE9CSl9zZXRjdF9QQ2VydFJlcURhdGEJCU9CSl9zZXRfY3R5cGUsMzhMCisKKyNkZWZpbmUgU05fc2V0Y3RfUENlcnRSZXNUQlMJCSJzZXRjdC1QQ2VydFJlc1RCUyIKKyNkZWZpbmUgTklEX3NldGN0X1BDZXJ0UmVzVEJTCQk1NTcKKyNkZWZpbmUgT0JKX3NldGN0X1BDZXJ0UmVzVEJTCQlPQkpfc2V0X2N0eXBlLDM5TAorCisjZGVmaW5lIFNOX3NldGN0X0JhdGNoQWRtaW5SZXFEYXRhCQkic2V0Y3QtQmF0Y2hBZG1pblJlcURhdGEiCisjZGVmaW5lIE5JRF9zZXRjdF9CYXRjaEFkbWluUmVxRGF0YQkJNTU4CisjZGVmaW5lIE9CSl9zZXRjdF9CYXRjaEFkbWluUmVxRGF0YQkJT0JKX3NldF9jdHlwZSw0MEwKKworI2RlZmluZSBTTl9zZXRjdF9CYXRjaEFkbWluUmVzRGF0YQkJInNldGN0LUJhdGNoQWRtaW5SZXNEYXRhIgorI2RlZmluZSBOSURfc2V0Y3RfQmF0Y2hBZG1pblJlc0RhdGEJCTU1OQorI2RlZmluZSBPQkpfc2V0Y3RfQmF0Y2hBZG1pblJlc0RhdGEJCU9CSl9zZXRfY3R5cGUsNDFMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ2FyZENJbml0UmVzVEJTCQkic2V0Y3QtQ2FyZENJbml0UmVzVEJTIgorI2RlZmluZSBOSURfc2V0Y3RfQ2FyZENJbml0UmVzVEJTCQk1NjAKKyNkZWZpbmUgT0JKX3NldGN0X0NhcmRDSW5pdFJlc1RCUwkJT0JKX3NldF9jdHlwZSw0MkwKKworI2RlZmluZSBTTl9zZXRjdF9NZUFxQ0luaXRSZXNUQlMJCSJzZXRjdC1NZUFxQ0luaXRSZXNUQlMiCisjZGVmaW5lIE5JRF9zZXRjdF9NZUFxQ0luaXRSZXNUQlMJCTU2MQorI2RlZmluZSBPQkpfc2V0Y3RfTWVBcUNJbml0UmVzVEJTCQlPQkpfc2V0X2N0eXBlLDQzTAorCisjZGVmaW5lIFNOX3NldGN0X1JlZ0Zvcm1SZXNUQlMJCSJzZXRjdC1SZWdGb3JtUmVzVEJTIgorI2RlZmluZSBOSURfc2V0Y3RfUmVnRm9ybVJlc1RCUwkJNTYyCisjZGVmaW5lIE9CSl9zZXRjdF9SZWdGb3JtUmVzVEJTCQlPQkpfc2V0X2N0eXBlLDQ0TAorCisjZGVmaW5lIFNOX3NldGN0X0NlcnRSZXFEYXRhCQkic2V0Y3QtQ2VydFJlcURhdGEiCisjZGVmaW5lIE5JRF9zZXRjdF9DZXJ0UmVxRGF0YQkJNTYzCisjZGVmaW5lIE9CSl9zZXRjdF9DZXJ0UmVxRGF0YQkJT0JKX3NldF9jdHlwZSw0NUwKKworI2RlZmluZSBTTl9zZXRjdF9DZXJ0UmVxVEJTCQkic2V0Y3QtQ2VydFJlcVRCUyIKKyNkZWZpbmUgTklEX3NldGN0X0NlcnRSZXFUQlMJCTU2NAorI2RlZmluZSBPQkpfc2V0Y3RfQ2VydFJlcVRCUwkJT0JKX3NldF9jdHlwZSw0NkwKKworI2RlZmluZSBTTl9zZXRjdF9DZXJ0UmVzRGF0YQkJInNldGN0LUNlcnRSZXNEYXRhIgorI2RlZmluZSBOSURfc2V0Y3RfQ2VydFJlc0RhdGEJCTU2NQorI2RlZmluZSBPQkpfc2V0Y3RfQ2VydFJlc0RhdGEJCU9CSl9zZXRfY3R5cGUsNDdMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ2VydElucVJlcVRCUwkJInNldGN0LUNlcnRJbnFSZXFUQlMiCisjZGVmaW5lIE5JRF9zZXRjdF9DZXJ0SW5xUmVxVEJTCQk1NjYKKyNkZWZpbmUgT0JKX3NldGN0X0NlcnRJbnFSZXFUQlMJCU9CSl9zZXRfY3R5cGUsNDhMCisKKyNkZWZpbmUgU05fc2V0Y3RfRXJyb3JUQlMJCSJzZXRjdC1FcnJvclRCUyIKKyNkZWZpbmUgTklEX3NldGN0X0Vycm9yVEJTCQk1NjcKKyNkZWZpbmUgT0JKX3NldGN0X0Vycm9yVEJTCQlPQkpfc2V0X2N0eXBlLDQ5TAorCisjZGVmaW5lIFNOX3NldGN0X1BJRHVhbFNpZ25lZFRCRQkJInNldGN0LVBJRHVhbFNpZ25lZFRCRSIKKyNkZWZpbmUgTklEX3NldGN0X1BJRHVhbFNpZ25lZFRCRQkJNTY4CisjZGVmaW5lIE9CSl9zZXRjdF9QSUR1YWxTaWduZWRUQkUJCU9CSl9zZXRfY3R5cGUsNTBMCisKKyNkZWZpbmUgU05fc2V0Y3RfUElVbnNpZ25lZFRCRQkJInNldGN0LVBJVW5zaWduZWRUQkUiCisjZGVmaW5lIE5JRF9zZXRjdF9QSVVuc2lnbmVkVEJFCQk1NjkKKyNkZWZpbmUgT0JKX3NldGN0X1BJVW5zaWduZWRUQkUJCU9CSl9zZXRfY3R5cGUsNTFMCisKKyNkZWZpbmUgU05fc2V0Y3RfQXV0aFJlcVRCRQkJInNldGN0LUF1dGhSZXFUQkUiCisjZGVmaW5lIE5JRF9zZXRjdF9BdXRoUmVxVEJFCQk1NzAKKyNkZWZpbmUgT0JKX3NldGN0X0F1dGhSZXFUQkUJCU9CSl9zZXRfY3R5cGUsNTJMCisKKyNkZWZpbmUgU05fc2V0Y3RfQXV0aFJlc1RCRQkJInNldGN0LUF1dGhSZXNUQkUiCisjZGVmaW5lIE5JRF9zZXRjdF9BdXRoUmVzVEJFCQk1NzEKKyNkZWZpbmUgT0JKX3NldGN0X0F1dGhSZXNUQkUJCU9CSl9zZXRfY3R5cGUsNTNMCisKKyNkZWZpbmUgU05fc2V0Y3RfQXV0aFJlc1RCRVgJCSJzZXRjdC1BdXRoUmVzVEJFWCIKKyNkZWZpbmUgTklEX3NldGN0X0F1dGhSZXNUQkVYCQk1NzIKKyNkZWZpbmUgT0JKX3NldGN0X0F1dGhSZXNUQkVYCQlPQkpfc2V0X2N0eXBlLDU0TAorCisjZGVmaW5lIFNOX3NldGN0X0F1dGhUb2tlblRCRQkJInNldGN0LUF1dGhUb2tlblRCRSIKKyNkZWZpbmUgTklEX3NldGN0X0F1dGhUb2tlblRCRQkJNTczCisjZGVmaW5lIE9CSl9zZXRjdF9BdXRoVG9rZW5UQkUJCU9CSl9zZXRfY3R5cGUsNTVMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ2FwVG9rZW5UQkUJCSJzZXRjdC1DYXBUb2tlblRCRSIKKyNkZWZpbmUgTklEX3NldGN0X0NhcFRva2VuVEJFCQk1NzQKKyNkZWZpbmUgT0JKX3NldGN0X0NhcFRva2VuVEJFCQlPQkpfc2V0X2N0eXBlLDU2TAorCisjZGVmaW5lIFNOX3NldGN0X0NhcFRva2VuVEJFWAkJInNldGN0LUNhcFRva2VuVEJFWCIKKyNkZWZpbmUgTklEX3NldGN0X0NhcFRva2VuVEJFWAkJNTc1CisjZGVmaW5lIE9CSl9zZXRjdF9DYXBUb2tlblRCRVgJCU9CSl9zZXRfY3R5cGUsNTdMCisKKyNkZWZpbmUgU05fc2V0Y3RfQWNxQ2FyZENvZGVNc2dUQkUJCSJzZXRjdC1BY3FDYXJkQ29kZU1zZ1RCRSIKKyNkZWZpbmUgTklEX3NldGN0X0FjcUNhcmRDb2RlTXNnVEJFCQk1NzYKKyNkZWZpbmUgT0JKX3NldGN0X0FjcUNhcmRDb2RlTXNnVEJFCQlPQkpfc2V0X2N0eXBlLDU4TAorCisjZGVmaW5lIFNOX3NldGN0X0F1dGhSZXZSZXFUQkUJCSJzZXRjdC1BdXRoUmV2UmVxVEJFIgorI2RlZmluZSBOSURfc2V0Y3RfQXV0aFJldlJlcVRCRQkJNTc3CisjZGVmaW5lIE9CSl9zZXRjdF9BdXRoUmV2UmVxVEJFCQlPQkpfc2V0X2N0eXBlLDU5TAorCisjZGVmaW5lIFNOX3NldGN0X0F1dGhSZXZSZXNUQkUJCSJzZXRjdC1BdXRoUmV2UmVzVEJFIgorI2RlZmluZSBOSURfc2V0Y3RfQXV0aFJldlJlc1RCRQkJNTc4CisjZGVmaW5lIE9CSl9zZXRjdF9BdXRoUmV2UmVzVEJFCQlPQkpfc2V0X2N0eXBlLDYwTAorCisjZGVmaW5lIFNOX3NldGN0X0F1dGhSZXZSZXNUQkVCCQkic2V0Y3QtQXV0aFJldlJlc1RCRUIiCisjZGVmaW5lIE5JRF9zZXRjdF9BdXRoUmV2UmVzVEJFQgkJNTc5CisjZGVmaW5lIE9CSl9zZXRjdF9BdXRoUmV2UmVzVEJFQgkJT0JKX3NldF9jdHlwZSw2MUwKKworI2RlZmluZSBTTl9zZXRjdF9DYXBSZXFUQkUJCSJzZXRjdC1DYXBSZXFUQkUiCisjZGVmaW5lIE5JRF9zZXRjdF9DYXBSZXFUQkUJCTU4MAorI2RlZmluZSBPQkpfc2V0Y3RfQ2FwUmVxVEJFCQlPQkpfc2V0X2N0eXBlLDYyTAorCisjZGVmaW5lIFNOX3NldGN0X0NhcFJlcVRCRVgJCSJzZXRjdC1DYXBSZXFUQkVYIgorI2RlZmluZSBOSURfc2V0Y3RfQ2FwUmVxVEJFWAkJNTgxCisjZGVmaW5lIE9CSl9zZXRjdF9DYXBSZXFUQkVYCQlPQkpfc2V0X2N0eXBlLDYzTAorCisjZGVmaW5lIFNOX3NldGN0X0NhcFJlc1RCRQkJInNldGN0LUNhcFJlc1RCRSIKKyNkZWZpbmUgTklEX3NldGN0X0NhcFJlc1RCRQkJNTgyCisjZGVmaW5lIE9CSl9zZXRjdF9DYXBSZXNUQkUJCU9CSl9zZXRfY3R5cGUsNjRMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ2FwUmV2UmVxVEJFCQkic2V0Y3QtQ2FwUmV2UmVxVEJFIgorI2RlZmluZSBOSURfc2V0Y3RfQ2FwUmV2UmVxVEJFCQk1ODMKKyNkZWZpbmUgT0JKX3NldGN0X0NhcFJldlJlcVRCRQkJT0JKX3NldF9jdHlwZSw2NUwKKworI2RlZmluZSBTTl9zZXRjdF9DYXBSZXZSZXFUQkVYCQkic2V0Y3QtQ2FwUmV2UmVxVEJFWCIKKyNkZWZpbmUgTklEX3NldGN0X0NhcFJldlJlcVRCRVgJCTU4NAorI2RlZmluZSBPQkpfc2V0Y3RfQ2FwUmV2UmVxVEJFWAkJT0JKX3NldF9jdHlwZSw2NkwKKworI2RlZmluZSBTTl9zZXRjdF9DYXBSZXZSZXNUQkUJCSJzZXRjdC1DYXBSZXZSZXNUQkUiCisjZGVmaW5lIE5JRF9zZXRjdF9DYXBSZXZSZXNUQkUJCTU4NQorI2RlZmluZSBPQkpfc2V0Y3RfQ2FwUmV2UmVzVEJFCQlPQkpfc2V0X2N0eXBlLDY3TAorCisjZGVmaW5lIFNOX3NldGN0X0NyZWRSZXFUQkUJCSJzZXRjdC1DcmVkUmVxVEJFIgorI2RlZmluZSBOSURfc2V0Y3RfQ3JlZFJlcVRCRQkJNTg2CisjZGVmaW5lIE9CSl9zZXRjdF9DcmVkUmVxVEJFCQlPQkpfc2V0X2N0eXBlLDY4TAorCisjZGVmaW5lIFNOX3NldGN0X0NyZWRSZXFUQkVYCQkic2V0Y3QtQ3JlZFJlcVRCRVgiCisjZGVmaW5lIE5JRF9zZXRjdF9DcmVkUmVxVEJFWAkJNTg3CisjZGVmaW5lIE9CSl9zZXRjdF9DcmVkUmVxVEJFWAkJT0JKX3NldF9jdHlwZSw2OUwKKworI2RlZmluZSBTTl9zZXRjdF9DcmVkUmVzVEJFCQkic2V0Y3QtQ3JlZFJlc1RCRSIKKyNkZWZpbmUgTklEX3NldGN0X0NyZWRSZXNUQkUJCTU4OAorI2RlZmluZSBPQkpfc2V0Y3RfQ3JlZFJlc1RCRQkJT0JKX3NldF9jdHlwZSw3MEwKKworI2RlZmluZSBTTl9zZXRjdF9DcmVkUmV2UmVxVEJFCQkic2V0Y3QtQ3JlZFJldlJlcVRCRSIKKyNkZWZpbmUgTklEX3NldGN0X0NyZWRSZXZSZXFUQkUJCTU4OQorI2RlZmluZSBPQkpfc2V0Y3RfQ3JlZFJldlJlcVRCRQkJT0JKX3NldF9jdHlwZSw3MUwKKworI2RlZmluZSBTTl9zZXRjdF9DcmVkUmV2UmVxVEJFWAkJInNldGN0LUNyZWRSZXZSZXFUQkVYIgorI2RlZmluZSBOSURfc2V0Y3RfQ3JlZFJldlJlcVRCRVgJCTU5MAorI2RlZmluZSBPQkpfc2V0Y3RfQ3JlZFJldlJlcVRCRVgJCU9CSl9zZXRfY3R5cGUsNzJMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ3JlZFJldlJlc1RCRQkJInNldGN0LUNyZWRSZXZSZXNUQkUiCisjZGVmaW5lIE5JRF9zZXRjdF9DcmVkUmV2UmVzVEJFCQk1OTEKKyNkZWZpbmUgT0JKX3NldGN0X0NyZWRSZXZSZXNUQkUJCU9CSl9zZXRfY3R5cGUsNzNMCisKKyNkZWZpbmUgU05fc2V0Y3RfQmF0Y2hBZG1pblJlcVRCRQkJInNldGN0LUJhdGNoQWRtaW5SZXFUQkUiCisjZGVmaW5lIE5JRF9zZXRjdF9CYXRjaEFkbWluUmVxVEJFCQk1OTIKKyNkZWZpbmUgT0JKX3NldGN0X0JhdGNoQWRtaW5SZXFUQkUJCU9CSl9zZXRfY3R5cGUsNzRMCisKKyNkZWZpbmUgU05fc2V0Y3RfQmF0Y2hBZG1pblJlc1RCRQkJInNldGN0LUJhdGNoQWRtaW5SZXNUQkUiCisjZGVmaW5lIE5JRF9zZXRjdF9CYXRjaEFkbWluUmVzVEJFCQk1OTMKKyNkZWZpbmUgT0JKX3NldGN0X0JhdGNoQWRtaW5SZXNUQkUJCU9CSl9zZXRfY3R5cGUsNzVMCisKKyNkZWZpbmUgU05fc2V0Y3RfUmVnRm9ybVJlcVRCRQkJInNldGN0LVJlZ0Zvcm1SZXFUQkUiCisjZGVmaW5lIE5JRF9zZXRjdF9SZWdGb3JtUmVxVEJFCQk1OTQKKyNkZWZpbmUgT0JKX3NldGN0X1JlZ0Zvcm1SZXFUQkUJCU9CSl9zZXRfY3R5cGUsNzZMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ2VydFJlcVRCRQkJInNldGN0LUNlcnRSZXFUQkUiCisjZGVmaW5lIE5JRF9zZXRjdF9DZXJ0UmVxVEJFCQk1OTUKKyNkZWZpbmUgT0JKX3NldGN0X0NlcnRSZXFUQkUJCU9CSl9zZXRfY3R5cGUsNzdMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ2VydFJlcVRCRVgJCSJzZXRjdC1DZXJ0UmVxVEJFWCIKKyNkZWZpbmUgTklEX3NldGN0X0NlcnRSZXFUQkVYCQk1OTYKKyNkZWZpbmUgT0JKX3NldGN0X0NlcnRSZXFUQkVYCQlPQkpfc2V0X2N0eXBlLDc4TAorCisjZGVmaW5lIFNOX3NldGN0X0NlcnRSZXNUQkUJCSJzZXRjdC1DZXJ0UmVzVEJFIgorI2RlZmluZSBOSURfc2V0Y3RfQ2VydFJlc1RCRQkJNTk3CisjZGVmaW5lIE9CSl9zZXRjdF9DZXJ0UmVzVEJFCQlPQkpfc2V0X2N0eXBlLDc5TAorCisjZGVmaW5lIFNOX3NldGN0X0NSTE5vdGlmaWNhdGlvblRCUwkJInNldGN0LUNSTE5vdGlmaWNhdGlvblRCUyIKKyNkZWZpbmUgTklEX3NldGN0X0NSTE5vdGlmaWNhdGlvblRCUwkJNTk4CisjZGVmaW5lIE9CSl9zZXRjdF9DUkxOb3RpZmljYXRpb25UQlMJCU9CSl9zZXRfY3R5cGUsODBMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ1JMTm90aWZpY2F0aW9uUmVzVEJTCQkic2V0Y3QtQ1JMTm90aWZpY2F0aW9uUmVzVEJTIgorI2RlZmluZSBOSURfc2V0Y3RfQ1JMTm90aWZpY2F0aW9uUmVzVEJTCQk1OTkKKyNkZWZpbmUgT0JKX3NldGN0X0NSTE5vdGlmaWNhdGlvblJlc1RCUwkJT0JKX3NldF9jdHlwZSw4MUwKKworI2RlZmluZSBTTl9zZXRjdF9CQ0lEaXN0cmlidXRpb25UQlMJCSJzZXRjdC1CQ0lEaXN0cmlidXRpb25UQlMiCisjZGVmaW5lIE5JRF9zZXRjdF9CQ0lEaXN0cmlidXRpb25UQlMJCTYwMAorI2RlZmluZSBPQkpfc2V0Y3RfQkNJRGlzdHJpYnV0aW9uVEJTCQlPQkpfc2V0X2N0eXBlLDgyTAorCisjZGVmaW5lIFNOX3NldGV4dF9nZW5DcnlwdAkJInNldGV4dC1nZW5DcnlwdCIKKyNkZWZpbmUgTE5fc2V0ZXh0X2dlbkNyeXB0CQkiZ2VuZXJpYyBjcnlwdG9ncmFtIgorI2RlZmluZSBOSURfc2V0ZXh0X2dlbkNyeXB0CQk2MDEKKyNkZWZpbmUgT0JKX3NldGV4dF9nZW5DcnlwdAkJT0JKX3NldF9tc2dFeHQsMUwKKworI2RlZmluZSBTTl9zZXRleHRfbWlBdXRoCQkic2V0ZXh0LW1pQXV0aCIKKyNkZWZpbmUgTE5fc2V0ZXh0X21pQXV0aAkJIm1lcmNoYW50IGluaXRpYXRlZCBhdXRoIgorI2RlZmluZSBOSURfc2V0ZXh0X21pQXV0aAkJNjAyCisjZGVmaW5lIE9CSl9zZXRleHRfbWlBdXRoCQlPQkpfc2V0X21zZ0V4dCwzTAorCisjZGVmaW5lIFNOX3NldGV4dF9waW5TZWN1cmUJCSJzZXRleHQtcGluU2VjdXJlIgorI2RlZmluZSBOSURfc2V0ZXh0X3BpblNlY3VyZQkJNjAzCisjZGVmaW5lIE9CSl9zZXRleHRfcGluU2VjdXJlCQlPQkpfc2V0X21zZ0V4dCw0TAorCisjZGVmaW5lIFNOX3NldGV4dF9waW5BbnkJCSJzZXRleHQtcGluQW55IgorI2RlZmluZSBOSURfc2V0ZXh0X3BpbkFueQkJNjA0CisjZGVmaW5lIE9CSl9zZXRleHRfcGluQW55CQlPQkpfc2V0X21zZ0V4dCw1TAorCisjZGVmaW5lIFNOX3NldGV4dF90cmFjazIJCSJzZXRleHQtdHJhY2syIgorI2RlZmluZSBOSURfc2V0ZXh0X3RyYWNrMgkJNjA1CisjZGVmaW5lIE9CSl9zZXRleHRfdHJhY2syCQlPQkpfc2V0X21zZ0V4dCw3TAorCisjZGVmaW5lIFNOX3NldGV4dF9jdgkJInNldGV4dC1jdiIKKyNkZWZpbmUgTE5fc2V0ZXh0X2N2CQkiYWRkaXRpb25hbCB2ZXJpZmljYXRpb24iCisjZGVmaW5lIE5JRF9zZXRleHRfY3YJCTYwNgorI2RlZmluZSBPQkpfc2V0ZXh0X2N2CQlPQkpfc2V0X21zZ0V4dCw4TAorCisjZGVmaW5lIFNOX3NldF9wb2xpY3lfcm9vdAkJInNldC1wb2xpY3ktcm9vdCIKKyNkZWZpbmUgTklEX3NldF9wb2xpY3lfcm9vdAkJNjA3CisjZGVmaW5lIE9CSl9zZXRfcG9saWN5X3Jvb3QJCU9CSl9zZXRfcG9saWN5LDBMCisKKyNkZWZpbmUgU05fc2V0Q2V4dF9oYXNoZWRSb290CQkic2V0Q2V4dC1oYXNoZWRSb290IgorI2RlZmluZSBOSURfc2V0Q2V4dF9oYXNoZWRSb290CQk2MDgKKyNkZWZpbmUgT0JKX3NldENleHRfaGFzaGVkUm9vdAkJT0JKX3NldF9jZXJ0RXh0LDBMCisKKyNkZWZpbmUgU05fc2V0Q2V4dF9jZXJ0VHlwZQkJInNldENleHQtY2VydFR5cGUiCisjZGVmaW5lIE5JRF9zZXRDZXh0X2NlcnRUeXBlCQk2MDkKKyNkZWZpbmUgT0JKX3NldENleHRfY2VydFR5cGUJCU9CSl9zZXRfY2VydEV4dCwxTAorCisjZGVmaW5lIFNOX3NldENleHRfbWVyY2hEYXRhCQkic2V0Q2V4dC1tZXJjaERhdGEiCisjZGVmaW5lIE5JRF9zZXRDZXh0X21lcmNoRGF0YQkJNjEwCisjZGVmaW5lIE9CSl9zZXRDZXh0X21lcmNoRGF0YQkJT0JKX3NldF9jZXJ0RXh0LDJMCisKKyNkZWZpbmUgU05fc2V0Q2V4dF9jQ2VydFJlcXVpcmVkCQkic2V0Q2V4dC1jQ2VydFJlcXVpcmVkIgorI2RlZmluZSBOSURfc2V0Q2V4dF9jQ2VydFJlcXVpcmVkCQk2MTEKKyNkZWZpbmUgT0JKX3NldENleHRfY0NlcnRSZXF1aXJlZAkJT0JKX3NldF9jZXJ0RXh0LDNMCisKKyNkZWZpbmUgU05fc2V0Q2V4dF90dW5uZWxpbmcJCSJzZXRDZXh0LXR1bm5lbGluZyIKKyNkZWZpbmUgTklEX3NldENleHRfdHVubmVsaW5nCQk2MTIKKyNkZWZpbmUgT0JKX3NldENleHRfdHVubmVsaW5nCQlPQkpfc2V0X2NlcnRFeHQsNEwKKworI2RlZmluZSBTTl9zZXRDZXh0X3NldEV4dAkJInNldENleHQtc2V0RXh0IgorI2RlZmluZSBOSURfc2V0Q2V4dF9zZXRFeHQJCTYxMworI2RlZmluZSBPQkpfc2V0Q2V4dF9zZXRFeHQJCU9CSl9zZXRfY2VydEV4dCw1TAorCisjZGVmaW5lIFNOX3NldENleHRfc2V0UXVhbGYJCSJzZXRDZXh0LXNldFF1YWxmIgorI2RlZmluZSBOSURfc2V0Q2V4dF9zZXRRdWFsZgkJNjE0CisjZGVmaW5lIE9CSl9zZXRDZXh0X3NldFF1YWxmCQlPQkpfc2V0X2NlcnRFeHQsNkwKKworI2RlZmluZSBTTl9zZXRDZXh0X1BHV1ljYXBhYmlsaXRpZXMJCSJzZXRDZXh0LVBHV1ljYXBhYmlsaXRpZXMiCisjZGVmaW5lIE5JRF9zZXRDZXh0X1BHV1ljYXBhYmlsaXRpZXMJCTYxNQorI2RlZmluZSBPQkpfc2V0Q2V4dF9QR1dZY2FwYWJpbGl0aWVzCQlPQkpfc2V0X2NlcnRFeHQsN0wKKworI2RlZmluZSBTTl9zZXRDZXh0X1Rva2VuSWRlbnRpZmllcgkJInNldENleHQtVG9rZW5JZGVudGlmaWVyIgorI2RlZmluZSBOSURfc2V0Q2V4dF9Ub2tlbklkZW50aWZpZXIJCTYxNgorI2RlZmluZSBPQkpfc2V0Q2V4dF9Ub2tlbklkZW50aWZpZXIJCU9CSl9zZXRfY2VydEV4dCw4TAorCisjZGVmaW5lIFNOX3NldENleHRfVHJhY2syRGF0YQkJInNldENleHQtVHJhY2syRGF0YSIKKyNkZWZpbmUgTklEX3NldENleHRfVHJhY2syRGF0YQkJNjE3CisjZGVmaW5lIE9CSl9zZXRDZXh0X1RyYWNrMkRhdGEJCU9CSl9zZXRfY2VydEV4dCw5TAorCisjZGVmaW5lIFNOX3NldENleHRfVG9rZW5UeXBlCQkic2V0Q2V4dC1Ub2tlblR5cGUiCisjZGVmaW5lIE5JRF9zZXRDZXh0X1Rva2VuVHlwZQkJNjE4CisjZGVmaW5lIE9CSl9zZXRDZXh0X1Rva2VuVHlwZQkJT0JKX3NldF9jZXJ0RXh0LDEwTAorCisjZGVmaW5lIFNOX3NldENleHRfSXNzdWVyQ2FwYWJpbGl0aWVzCQkic2V0Q2V4dC1Jc3N1ZXJDYXBhYmlsaXRpZXMiCisjZGVmaW5lIE5JRF9zZXRDZXh0X0lzc3VlckNhcGFiaWxpdGllcwkJNjE5CisjZGVmaW5lIE9CSl9zZXRDZXh0X0lzc3VlckNhcGFiaWxpdGllcwkJT0JKX3NldF9jZXJ0RXh0LDExTAorCisjZGVmaW5lIFNOX3NldEF0dHJfQ2VydAkJInNldEF0dHItQ2VydCIKKyNkZWZpbmUgTklEX3NldEF0dHJfQ2VydAkJNjIwCisjZGVmaW5lIE9CSl9zZXRBdHRyX0NlcnQJCU9CSl9zZXRfYXR0ciwwTAorCisjZGVmaW5lIFNOX3NldEF0dHJfUEdXWWNhcAkJInNldEF0dHItUEdXWWNhcCIKKyNkZWZpbmUgTE5fc2V0QXR0cl9QR1dZY2FwCQkicGF5bWVudCBnYXRld2F5IGNhcGFiaWxpdGllcyIKKyNkZWZpbmUgTklEX3NldEF0dHJfUEdXWWNhcAkJNjIxCisjZGVmaW5lIE9CSl9zZXRBdHRyX1BHV1ljYXAJCU9CSl9zZXRfYXR0ciwxTAorCisjZGVmaW5lIFNOX3NldEF0dHJfVG9rZW5UeXBlCQkic2V0QXR0ci1Ub2tlblR5cGUiCisjZGVmaW5lIE5JRF9zZXRBdHRyX1Rva2VuVHlwZQkJNjIyCisjZGVmaW5lIE9CSl9zZXRBdHRyX1Rva2VuVHlwZQkJT0JKX3NldF9hdHRyLDJMCisKKyNkZWZpbmUgU05fc2V0QXR0cl9Jc3NDYXAJCSJzZXRBdHRyLUlzc0NhcCIKKyNkZWZpbmUgTE5fc2V0QXR0cl9Jc3NDYXAJCSJpc3N1ZXIgY2FwYWJpbGl0aWVzIgorI2RlZmluZSBOSURfc2V0QXR0cl9Jc3NDYXAJCTYyMworI2RlZmluZSBPQkpfc2V0QXR0cl9Jc3NDYXAJCU9CSl9zZXRfYXR0ciwzTAorCisjZGVmaW5lIFNOX3NldF9yb290S2V5VGh1bWIJCSJzZXQtcm9vdEtleVRodW1iIgorI2RlZmluZSBOSURfc2V0X3Jvb3RLZXlUaHVtYgkJNjI0CisjZGVmaW5lIE9CSl9zZXRfcm9vdEtleVRodW1iCQlPQkpfc2V0QXR0cl9DZXJ0LDBMCisKKyNkZWZpbmUgU05fc2V0X2FkZFBvbGljeQkJInNldC1hZGRQb2xpY3kiCisjZGVmaW5lIE5JRF9zZXRfYWRkUG9saWN5CQk2MjUKKyNkZWZpbmUgT0JKX3NldF9hZGRQb2xpY3kJCU9CSl9zZXRBdHRyX0NlcnQsMUwKKworI2RlZmluZSBTTl9zZXRBdHRyX1Rva2VuX0VNVgkJInNldEF0dHItVG9rZW4tRU1WIgorI2RlZmluZSBOSURfc2V0QXR0cl9Ub2tlbl9FTVYJCTYyNgorI2RlZmluZSBPQkpfc2V0QXR0cl9Ub2tlbl9FTVYJCU9CSl9zZXRBdHRyX1Rva2VuVHlwZSwxTAorCisjZGVmaW5lIFNOX3NldEF0dHJfVG9rZW5fQjBQcmltZQkJInNldEF0dHItVG9rZW4tQjBQcmltZSIKKyNkZWZpbmUgTklEX3NldEF0dHJfVG9rZW5fQjBQcmltZQkJNjI3CisjZGVmaW5lIE9CSl9zZXRBdHRyX1Rva2VuX0IwUHJpbWUJCU9CSl9zZXRBdHRyX1Rva2VuVHlwZSwyTAorCisjZGVmaW5lIFNOX3NldEF0dHJfSXNzQ2FwX0NWTQkJInNldEF0dHItSXNzQ2FwLUNWTSIKKyNkZWZpbmUgTklEX3NldEF0dHJfSXNzQ2FwX0NWTQkJNjI4CisjZGVmaW5lIE9CSl9zZXRBdHRyX0lzc0NhcF9DVk0JCU9CSl9zZXRBdHRyX0lzc0NhcCwzTAorCisjZGVmaW5lIFNOX3NldEF0dHJfSXNzQ2FwX1QyCQkic2V0QXR0ci1Jc3NDYXAtVDIiCisjZGVmaW5lIE5JRF9zZXRBdHRyX0lzc0NhcF9UMgkJNjI5CisjZGVmaW5lIE9CSl9zZXRBdHRyX0lzc0NhcF9UMgkJT0JKX3NldEF0dHJfSXNzQ2FwLDRMCisKKyNkZWZpbmUgU05fc2V0QXR0cl9Jc3NDYXBfU2lnCQkic2V0QXR0ci1Jc3NDYXAtU2lnIgorI2RlZmluZSBOSURfc2V0QXR0cl9Jc3NDYXBfU2lnCQk2MzAKKyNkZWZpbmUgT0JKX3NldEF0dHJfSXNzQ2FwX1NpZwkJT0JKX3NldEF0dHJfSXNzQ2FwLDVMCisKKyNkZWZpbmUgU05fc2V0QXR0cl9HZW5DcnlwdGdybQkJInNldEF0dHItR2VuQ3J5cHRncm0iCisjZGVmaW5lIExOX3NldEF0dHJfR2VuQ3J5cHRncm0JCSJnZW5lcmF0ZSBjcnlwdG9ncmFtIgorI2RlZmluZSBOSURfc2V0QXR0cl9HZW5DcnlwdGdybQkJNjMxCisjZGVmaW5lIE9CSl9zZXRBdHRyX0dlbkNyeXB0Z3JtCQlPQkpfc2V0QXR0cl9Jc3NDYXBfQ1ZNLDFMCisKKyNkZWZpbmUgU05fc2V0QXR0cl9UMkVuYwkJInNldEF0dHItVDJFbmMiCisjZGVmaW5lIExOX3NldEF0dHJfVDJFbmMJCSJlbmNyeXB0ZWQgdHJhY2sgMiIKKyNkZWZpbmUgTklEX3NldEF0dHJfVDJFbmMJCTYzMgorI2RlZmluZSBPQkpfc2V0QXR0cl9UMkVuYwkJT0JKX3NldEF0dHJfSXNzQ2FwX1QyLDFMCisKKyNkZWZpbmUgU05fc2V0QXR0cl9UMmNsZWFydHh0CQkic2V0QXR0ci1UMmNsZWFydHh0IgorI2RlZmluZSBMTl9zZXRBdHRyX1QyY2xlYXJ0eHQJCSJjbGVhcnRleHQgdHJhY2sgMiIKKyNkZWZpbmUgTklEX3NldEF0dHJfVDJjbGVhcnR4dAkJNjMzCisjZGVmaW5lIE9CSl9zZXRBdHRyX1QyY2xlYXJ0eHQJCU9CSl9zZXRBdHRyX0lzc0NhcF9UMiwyTAorCisjZGVmaW5lIFNOX3NldEF0dHJfVG9rSUNDc2lnCQkic2V0QXR0ci1Ub2tJQ0NzaWciCisjZGVmaW5lIExOX3NldEF0dHJfVG9rSUNDc2lnCQkiSUNDIG9yIHRva2VuIHNpZ25hdHVyZSIKKyNkZWZpbmUgTklEX3NldEF0dHJfVG9rSUNDc2lnCQk2MzQKKyNkZWZpbmUgT0JKX3NldEF0dHJfVG9rSUNDc2lnCQlPQkpfc2V0QXR0cl9Jc3NDYXBfU2lnLDFMCisKKyNkZWZpbmUgU05fc2V0QXR0cl9TZWNEZXZTaWcJCSJzZXRBdHRyLVNlY0RldlNpZyIKKyNkZWZpbmUgTE5fc2V0QXR0cl9TZWNEZXZTaWcJCSJzZWN1cmUgZGV2aWNlIHNpZ25hdHVyZSIKKyNkZWZpbmUgTklEX3NldEF0dHJfU2VjRGV2U2lnCQk2MzUKKyNkZWZpbmUgT0JKX3NldEF0dHJfU2VjRGV2U2lnCQlPQkpfc2V0QXR0cl9Jc3NDYXBfU2lnLDJMCisKKyNkZWZpbmUgU05fc2V0X2JyYW5kX0lBVEFfQVRBCQkic2V0LWJyYW5kLUlBVEEtQVRBIgorI2RlZmluZSBOSURfc2V0X2JyYW5kX0lBVEFfQVRBCQk2MzYKKyNkZWZpbmUgT0JKX3NldF9icmFuZF9JQVRBX0FUQQkJT0JKX3NldF9icmFuZCwxTAorCisjZGVmaW5lIFNOX3NldF9icmFuZF9EaW5lcnMJCSJzZXQtYnJhbmQtRGluZXJzIgorI2RlZmluZSBOSURfc2V0X2JyYW5kX0RpbmVycwkJNjM3CisjZGVmaW5lIE9CSl9zZXRfYnJhbmRfRGluZXJzCQlPQkpfc2V0X2JyYW5kLDMwTAorCisjZGVmaW5lIFNOX3NldF9icmFuZF9BbWVyaWNhbkV4cHJlc3MJCSJzZXQtYnJhbmQtQW1lcmljYW5FeHByZXNzIgorI2RlZmluZSBOSURfc2V0X2JyYW5kX0FtZXJpY2FuRXhwcmVzcwkJNjM4CisjZGVmaW5lIE9CSl9zZXRfYnJhbmRfQW1lcmljYW5FeHByZXNzCQlPQkpfc2V0X2JyYW5kLDM0TAorCisjZGVmaW5lIFNOX3NldF9icmFuZF9KQ0IJCSJzZXQtYnJhbmQtSkNCIgorI2RlZmluZSBOSURfc2V0X2JyYW5kX0pDQgkJNjM5CisjZGVmaW5lIE9CSl9zZXRfYnJhbmRfSkNCCQlPQkpfc2V0X2JyYW5kLDM1TAorCisjZGVmaW5lIFNOX3NldF9icmFuZF9WaXNhCQkic2V0LWJyYW5kLVZpc2EiCisjZGVmaW5lIE5JRF9zZXRfYnJhbmRfVmlzYQkJNjQwCisjZGVmaW5lIE9CSl9zZXRfYnJhbmRfVmlzYQkJT0JKX3NldF9icmFuZCw0TAorCisjZGVmaW5lIFNOX3NldF9icmFuZF9NYXN0ZXJDYXJkCQkic2V0LWJyYW5kLU1hc3RlckNhcmQiCisjZGVmaW5lIE5JRF9zZXRfYnJhbmRfTWFzdGVyQ2FyZAkJNjQxCisjZGVmaW5lIE9CSl9zZXRfYnJhbmRfTWFzdGVyQ2FyZAkJT0JKX3NldF9icmFuZCw1TAorCisjZGVmaW5lIFNOX3NldF9icmFuZF9Ob3Z1cwkJInNldC1icmFuZC1Ob3Z1cyIKKyNkZWZpbmUgTklEX3NldF9icmFuZF9Ob3Z1cwkJNjQyCisjZGVmaW5lIE9CSl9zZXRfYnJhbmRfTm92dXMJCU9CSl9zZXRfYnJhbmQsNjAxMUwKKworI2RlZmluZSBTTl9kZXNfY2RtZgkJIkRFUy1DRE1GIgorI2RlZmluZSBMTl9kZXNfY2RtZgkJImRlcy1jZG1mIgorI2RlZmluZSBOSURfZGVzX2NkbWYJCTY0MworI2RlZmluZSBPQkpfZGVzX2NkbWYJCU9CSl9yc2Fkc2ksM0wsMTBMCisKKyNkZWZpbmUgU05fcnNhT0FFUEVuY3J5cHRpb25TRVQJCSJyc2FPQUVQRW5jcnlwdGlvblNFVCIKKyNkZWZpbmUgTklEX3JzYU9BRVBFbmNyeXB0aW9uU0VUCQk2NDQKKyNkZWZpbmUgT0JKX3JzYU9BRVBFbmNyeXB0aW9uU0VUCQlPQkpfcnNhZHNpLDFMLDFMLDZMCisKKyNkZWZpbmUgU05faXBzZWMzCQkiT2FrbGV5LUVDMk4tMyIKKyNkZWZpbmUgTE5faXBzZWMzCQkiaXBzZWMzIgorI2RlZmluZSBOSURfaXBzZWMzCQk3NDkKKworI2RlZmluZSBTTl9pcHNlYzQJCSJPYWtsZXktRUMyTi00IgorI2RlZmluZSBMTl9pcHNlYzQJCSJpcHNlYzQiCisjZGVmaW5lIE5JRF9pcHNlYzQJCTc1MAorCisjZGVmaW5lIFNOX3doaXJscG9vbAkJIndoaXJscG9vbCIKKyNkZWZpbmUgTklEX3doaXJscG9vbAkJODA0CisjZGVmaW5lIE9CSl93aGlybHBvb2wJCU9CSl9pc28sMEwsMTAxMThMLDNMLDBMLDU1TAorCisjZGVmaW5lIFNOX2NyeXB0b3BybwkJImNyeXB0b3BybyIKKyNkZWZpbmUgTklEX2NyeXB0b3BybwkJODA1CisjZGVmaW5lIE9CSl9jcnlwdG9wcm8JCU9CSl9tZW1iZXJfYm9keSw2NDNMLDJMLDJMCisKKyNkZWZpbmUgU05fY3J5cHRvY29tCQkiY3J5cHRvY29tIgorI2RlZmluZSBOSURfY3J5cHRvY29tCQk4MDYKKyNkZWZpbmUgT0JKX2NyeXB0b2NvbQkJT0JKX21lbWJlcl9ib2R5LDY0M0wsMkwsOUwKKworI2RlZmluZSBTTl9pZF9Hb3N0UjM0MTFfOTRfd2l0aF9Hb3N0UjM0MTBfMjAwMQkJImlkLUdvc3RSMzQxMS05NC13aXRoLUdvc3RSMzQxMC0yMDAxIgorI2RlZmluZSBMTl9pZF9Hb3N0UjM0MTFfOTRfd2l0aF9Hb3N0UjM0MTBfMjAwMQkJIkdPU1QgUiAzNC4xMS05NCB3aXRoIEdPU1QgUiAzNC4xMC0yMDAxIgorI2RlZmluZSBOSURfaWRfR29zdFIzNDExXzk0X3dpdGhfR29zdFIzNDEwXzIwMDEJCTgwNworI2RlZmluZSBPQkpfaWRfR29zdFIzNDExXzk0X3dpdGhfR29zdFIzNDEwXzIwMDEJCU9CSl9jcnlwdG9wcm8sM0wKKworI2RlZmluZSBTTl9pZF9Hb3N0UjM0MTFfOTRfd2l0aF9Hb3N0UjM0MTBfOTQJCSJpZC1Hb3N0UjM0MTEtOTQtd2l0aC1Hb3N0UjM0MTAtOTQiCisjZGVmaW5lIExOX2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF85NAkJIkdPU1QgUiAzNC4xMS05NCB3aXRoIEdPU1QgUiAzNC4xMC05NCIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF85NAkJODA4CisjZGVmaW5lIE9CSl9pZF9Hb3N0UjM0MTFfOTRfd2l0aF9Hb3N0UjM0MTBfOTQJCU9CSl9jcnlwdG9wcm8sNEwKKworI2RlZmluZSBTTl9pZF9Hb3N0UjM0MTFfOTQJCSJtZF9nb3N0OTQiCisjZGVmaW5lIExOX2lkX0dvc3RSMzQxMV85NAkJIkdPU1QgUiAzNC4xMS05NCIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMV85NAkJODA5CisjZGVmaW5lIE9CSl9pZF9Hb3N0UjM0MTFfOTQJCU9CSl9jcnlwdG9wcm8sOUwKKworI2RlZmluZSBTTl9pZF9ITUFDR29zdFIzNDExXzk0CQkiaWQtSE1BQ0dvc3RSMzQxMS05NCIKKyNkZWZpbmUgTE5faWRfSE1BQ0dvc3RSMzQxMV85NAkJIkhNQUMgR09TVCAzNC4xMS05NCIKKyNkZWZpbmUgTklEX2lkX0hNQUNHb3N0UjM0MTFfOTQJCTgxMAorI2RlZmluZSBPQkpfaWRfSE1BQ0dvc3RSMzQxMV85NAkJT0JKX2NyeXB0b3BybywxMEwKKworI2RlZmluZSBTTl9pZF9Hb3N0UjM0MTBfMjAwMQkJImdvc3QyMDAxIgorI2RlZmluZSBMTl9pZF9Hb3N0UjM0MTBfMjAwMQkJIkdPU1QgUiAzNC4xMC0yMDAxIgorI2RlZmluZSBOSURfaWRfR29zdFIzNDEwXzIwMDEJCTgxMQorI2RlZmluZSBPQkpfaWRfR29zdFIzNDEwXzIwMDEJCU9CSl9jcnlwdG9wcm8sMTlMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzk0CQkiZ29zdDk0IgorI2RlZmluZSBMTl9pZF9Hb3N0UjM0MTBfOTQJCSJHT1NUIFIgMzQuMTAtOTQiCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTBfOTQJCTgxMgorI2RlZmluZSBPQkpfaWRfR29zdFIzNDEwXzk0CQlPQkpfY3J5cHRvcHJvLDIwTAorCisjZGVmaW5lIFNOX2lkX0dvc3QyODE0N184OQkJImdvc3Q4OSIKKyNkZWZpbmUgTE5faWRfR29zdDI4MTQ3Xzg5CQkiR09TVCAyODE0Ny04OSIKKyNkZWZpbmUgTklEX2lkX0dvc3QyODE0N184OQkJODEzCisjZGVmaW5lIE9CSl9pZF9Hb3N0MjgxNDdfODkJCU9CSl9jcnlwdG9wcm8sMjFMCisKKyNkZWZpbmUgU05fZ29zdDg5X2NudAkJImdvc3Q4OS1jbnQiCisjZGVmaW5lIE5JRF9nb3N0ODlfY250CQk4MTQKKworI2RlZmluZSBTTl9pZF9Hb3N0MjgxNDdfODlfTUFDCQkiZ29zdC1tYWMiCisjZGVmaW5lIExOX2lkX0dvc3QyODE0N184OV9NQUMJCSJHT1NUIDI4MTQ3LTg5IE1BQyIKKyNkZWZpbmUgTklEX2lkX0dvc3QyODE0N184OV9NQUMJCTgxNQorI2RlZmluZSBPQkpfaWRfR29zdDI4MTQ3Xzg5X01BQwkJT0JKX2NyeXB0b3BybywyMkwKKworI2RlZmluZSBTTl9pZF9Hb3N0UjM0MTFfOTRfcHJmCQkicHJmLWdvc3RyMzQxMS05NCIKKyNkZWZpbmUgTE5faWRfR29zdFIzNDExXzk0X3ByZgkJIkdPU1QgUiAzNC4xMS05NCBQUkYiCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTFfOTRfcHJmCQk4MTYKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMV85NF9wcmYJCU9CSl9jcnlwdG9wcm8sMjNMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzIwMDFESAkJImlkLUdvc3RSMzQxMC0yMDAxREgiCisjZGVmaW5lIExOX2lkX0dvc3RSMzQxMF8yMDAxREgJCSJHT1NUIFIgMzQuMTAtMjAwMSBESCIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMF8yMDAxREgJCTgxNworI2RlZmluZSBPQkpfaWRfR29zdFIzNDEwXzIwMDFESAkJT0JKX2NyeXB0b3Bybyw5OEwKKworI2RlZmluZSBTTl9pZF9Hb3N0UjM0MTBfOTRESAkJImlkLUdvc3RSMzQxMC05NERIIgorI2RlZmluZSBMTl9pZF9Hb3N0UjM0MTBfOTRESAkJIkdPU1QgUiAzNC4xMC05NCBESCIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMF85NERICQk4MTgKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMF85NERICQlPQkpfY3J5cHRvcHJvLDk5TAorCisjZGVmaW5lIFNOX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fS2V5TWVzaGluZwkJImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tS2V5TWVzaGluZyIKKyNkZWZpbmUgTklEX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fS2V5TWVzaGluZwkJODE5CisjZGVmaW5lIE9CSl9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX0tleU1lc2hpbmcJCU9CSl9jcnlwdG9wcm8sMTRMLDFMCisKKyNkZWZpbmUgU05faWRfR29zdDI4MTQ3Xzg5X05vbmVfS2V5TWVzaGluZwkJImlkLUdvc3QyODE0Ny04OS1Ob25lLUtleU1lc2hpbmciCisjZGVmaW5lIE5JRF9pZF9Hb3N0MjgxNDdfODlfTm9uZV9LZXlNZXNoaW5nCQk4MjAKKyNkZWZpbmUgT0JKX2lkX0dvc3QyODE0N184OV9Ob25lX0tleU1lc2hpbmcJCU9CSl9jcnlwdG9wcm8sMTRMLDBMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDExXzk0X1Rlc3RQYXJhbVNldAkJImlkLUdvc3RSMzQxMS05NC1UZXN0UGFyYW1TZXQiCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTFfOTRfVGVzdFBhcmFtU2V0CQk4MjEKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMV85NF9UZXN0UGFyYW1TZXQJCU9CSl9jcnlwdG9wcm8sMzBMLDBMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDExXzk0X0NyeXB0b1Byb1BhcmFtU2V0CQkiaWQtR29zdFIzNDExLTk0LUNyeXB0b1Byb1BhcmFtU2V0IgorI2RlZmluZSBOSURfaWRfR29zdFIzNDExXzk0X0NyeXB0b1Byb1BhcmFtU2V0CQk4MjIKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMV85NF9DcnlwdG9Qcm9QYXJhbVNldAkJT0JKX2NyeXB0b3BybywzMEwsMUwKKworI2RlZmluZSBTTl9pZF9Hb3N0MjgxNDdfODlfVGVzdFBhcmFtU2V0CQkiaWQtR29zdDI4MTQ3LTg5LVRlc3RQYXJhbVNldCIKKyNkZWZpbmUgTklEX2lkX0dvc3QyODE0N184OV9UZXN0UGFyYW1TZXQJCTgyMworI2RlZmluZSBPQkpfaWRfR29zdDI4MTQ3Xzg5X1Rlc3RQYXJhbVNldAkJT0JKX2NyeXB0b3BybywzMUwsMEwKKworI2RlZmluZSBTTl9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX0FfUGFyYW1TZXQJCSJpZC1Hb3N0MjgxNDctODktQ3J5cHRvUHJvLUEtUGFyYW1TZXQiCisjZGVmaW5lIE5JRF9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX0FfUGFyYW1TZXQJCTgyNAorI2RlZmluZSBPQkpfaWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19BX1BhcmFtU2V0CQlPQkpfY3J5cHRvcHJvLDMxTCwxTAorCisjZGVmaW5lIFNOX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fQl9QYXJhbVNldAkJImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tQi1QYXJhbVNldCIKKyNkZWZpbmUgTklEX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fQl9QYXJhbVNldAkJODI1CisjZGVmaW5lIE9CSl9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX0JfUGFyYW1TZXQJCU9CSl9jcnlwdG9wcm8sMzFMLDJMCisKKyNkZWZpbmUgU05faWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19DX1BhcmFtU2V0CQkiaWQtR29zdDI4MTQ3LTg5LUNyeXB0b1Byby1DLVBhcmFtU2V0IgorI2RlZmluZSBOSURfaWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19DX1BhcmFtU2V0CQk4MjYKKyNkZWZpbmUgT0JKX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fQ19QYXJhbVNldAkJT0JKX2NyeXB0b3BybywzMUwsM0wKKworI2RlZmluZSBTTl9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX0RfUGFyYW1TZXQJCSJpZC1Hb3N0MjgxNDctODktQ3J5cHRvUHJvLUQtUGFyYW1TZXQiCisjZGVmaW5lIE5JRF9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX0RfUGFyYW1TZXQJCTgyNworI2RlZmluZSBPQkpfaWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19EX1BhcmFtU2V0CQlPQkpfY3J5cHRvcHJvLDMxTCw0TAorCisjZGVmaW5lIFNOX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fT3NjYXJfMV8xX1BhcmFtU2V0CQkiaWQtR29zdDI4MTQ3LTg5LUNyeXB0b1Byby1Pc2Nhci0xLTEtUGFyYW1TZXQiCisjZGVmaW5lIE5JRF9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX09zY2FyXzFfMV9QYXJhbVNldAkJODI4CisjZGVmaW5lIE9CSl9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX09zY2FyXzFfMV9QYXJhbVNldAkJT0JKX2NyeXB0b3BybywzMUwsNUwKKworI2RlZmluZSBTTl9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX09zY2FyXzFfMF9QYXJhbVNldAkJImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tT3NjYXItMS0wLVBhcmFtU2V0IgorI2RlZmluZSBOSURfaWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19Pc2Nhcl8xXzBfUGFyYW1TZXQJCTgyOQorI2RlZmluZSBPQkpfaWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19Pc2Nhcl8xXzBfUGFyYW1TZXQJCU9CSl9jcnlwdG9wcm8sMzFMLDZMCisKKyNkZWZpbmUgU05faWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19SSUNfMV9QYXJhbVNldAkJImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tUklDLTEtUGFyYW1TZXQiCisjZGVmaW5lIE5JRF9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX1JJQ18xX1BhcmFtU2V0CQk4MzAKKyNkZWZpbmUgT0JKX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fUklDXzFfUGFyYW1TZXQJCU9CSl9jcnlwdG9wcm8sMzFMLDdMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzk0X1Rlc3RQYXJhbVNldAkJImlkLUdvc3RSMzQxMC05NC1UZXN0UGFyYW1TZXQiCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTBfOTRfVGVzdFBhcmFtU2V0CQk4MzEKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMF85NF9UZXN0UGFyYW1TZXQJCU9CSl9jcnlwdG9wcm8sMzJMLDBMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19BX1BhcmFtU2V0CQkiaWQtR29zdFIzNDEwLTk0LUNyeXB0b1Byby1BLVBhcmFtU2V0IgorI2RlZmluZSBOSURfaWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19BX1BhcmFtU2V0CQk4MzIKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fQV9QYXJhbVNldAkJT0JKX2NyeXB0b3BybywzMkwsMkwKKworI2RlZmluZSBTTl9pZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX0JfUGFyYW1TZXQJCSJpZC1Hb3N0UjM0MTAtOTQtQ3J5cHRvUHJvLUItUGFyYW1TZXQiCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX0JfUGFyYW1TZXQJCTgzMworI2RlZmluZSBPQkpfaWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19CX1BhcmFtU2V0CQlPQkpfY3J5cHRvcHJvLDMyTCwzTAorCisjZGVmaW5lIFNOX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fQ19QYXJhbVNldAkJImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tQy1QYXJhbVNldCIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fQ19QYXJhbVNldAkJODM0CisjZGVmaW5lIE9CSl9pZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX0NfUGFyYW1TZXQJCU9CSl9jcnlwdG9wcm8sMzJMLDRMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19EX1BhcmFtU2V0CQkiaWQtR29zdFIzNDEwLTk0LUNyeXB0b1Byby1ELVBhcmFtU2V0IgorI2RlZmluZSBOSURfaWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19EX1BhcmFtU2V0CQk4MzUKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fRF9QYXJhbVNldAkJT0JKX2NyeXB0b3BybywzMkwsNUwKKworI2RlZmluZSBTTl9pZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX1hjaEFfUGFyYW1TZXQJCSJpZC1Hb3N0UjM0MTAtOTQtQ3J5cHRvUHJvLVhjaEEtUGFyYW1TZXQiCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX1hjaEFfUGFyYW1TZXQJCTgzNgorI2RlZmluZSBPQkpfaWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19YY2hBX1BhcmFtU2V0CQlPQkpfY3J5cHRvcHJvLDMzTCwxTAorCisjZGVmaW5lIFNOX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fWGNoQl9QYXJhbVNldAkJImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tWGNoQi1QYXJhbVNldCIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fWGNoQl9QYXJhbVNldAkJODM3CisjZGVmaW5lIE9CSl9pZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX1hjaEJfUGFyYW1TZXQJCU9CSl9jcnlwdG9wcm8sMzNMLDJMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19YY2hDX1BhcmFtU2V0CQkiaWQtR29zdFIzNDEwLTk0LUNyeXB0b1Byby1YY2hDLVBhcmFtU2V0IgorI2RlZmluZSBOSURfaWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19YY2hDX1BhcmFtU2V0CQk4MzgKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fWGNoQ19QYXJhbVNldAkJT0JKX2NyeXB0b3BybywzM0wsM0wKKworI2RlZmluZSBTTl9pZF9Hb3N0UjM0MTBfMjAwMV9UZXN0UGFyYW1TZXQJCSJpZC1Hb3N0UjM0MTAtMjAwMS1UZXN0UGFyYW1TZXQiCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTBfMjAwMV9UZXN0UGFyYW1TZXQJCTgzOQorI2RlZmluZSBPQkpfaWRfR29zdFIzNDEwXzIwMDFfVGVzdFBhcmFtU2V0CQlPQkpfY3J5cHRvcHJvLDM1TCwwTAorCisjZGVmaW5lIFNOX2lkX0dvc3RSMzQxMF8yMDAxX0NyeXB0b1Byb19BX1BhcmFtU2V0CQkiaWQtR29zdFIzNDEwLTIwMDEtQ3J5cHRvUHJvLUEtUGFyYW1TZXQiCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fQV9QYXJhbVNldAkJODQwCisjZGVmaW5lIE9CSl9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fQV9QYXJhbVNldAkJT0JKX2NyeXB0b3BybywzNUwsMUwKKworI2RlZmluZSBTTl9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fQl9QYXJhbVNldAkJImlkLUdvc3RSMzQxMC0yMDAxLUNyeXB0b1Byby1CLVBhcmFtU2V0IgorI2RlZmluZSBOSURfaWRfR29zdFIzNDEwXzIwMDFfQ3J5cHRvUHJvX0JfUGFyYW1TZXQJCTg0MQorI2RlZmluZSBPQkpfaWRfR29zdFIzNDEwXzIwMDFfQ3J5cHRvUHJvX0JfUGFyYW1TZXQJCU9CSl9jcnlwdG9wcm8sMzVMLDJMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzIwMDFfQ3J5cHRvUHJvX0NfUGFyYW1TZXQJCSJpZC1Hb3N0UjM0MTAtMjAwMS1DcnlwdG9Qcm8tQy1QYXJhbVNldCIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMF8yMDAxX0NyeXB0b1Byb19DX1BhcmFtU2V0CQk4NDIKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMF8yMDAxX0NyeXB0b1Byb19DX1BhcmFtU2V0CQlPQkpfY3J5cHRvcHJvLDM1TCwzTAorCisjZGVmaW5lIFNOX2lkX0dvc3RSMzQxMF8yMDAxX0NyeXB0b1Byb19YY2hBX1BhcmFtU2V0CQkiaWQtR29zdFIzNDEwLTIwMDEtQ3J5cHRvUHJvLVhjaEEtUGFyYW1TZXQiCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fWGNoQV9QYXJhbVNldAkJODQzCisjZGVmaW5lIE9CSl9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fWGNoQV9QYXJhbVNldAkJT0JKX2NyeXB0b3BybywzNkwsMEwKKworI2RlZmluZSBTTl9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fWGNoQl9QYXJhbVNldAkJImlkLUdvc3RSMzQxMC0yMDAxLUNyeXB0b1Byby1YY2hCLVBhcmFtU2V0IgorI2RlZmluZSBOSURfaWRfR29zdFIzNDEwXzIwMDFfQ3J5cHRvUHJvX1hjaEJfUGFyYW1TZXQJCTg0NAorI2RlZmluZSBPQkpfaWRfR29zdFIzNDEwXzIwMDFfQ3J5cHRvUHJvX1hjaEJfUGFyYW1TZXQJCU9CSl9jcnlwdG9wcm8sMzZMLDFMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzk0X2EJCSJpZC1Hb3N0UjM0MTAtOTQtYSIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMF85NF9hCQk4NDUKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMF85NF9hCQlPQkpfaWRfR29zdFIzNDEwXzk0LDFMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzk0X2FCaXMJCSJpZC1Hb3N0UjM0MTAtOTQtYUJpcyIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMF85NF9hQmlzCQk4NDYKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMF85NF9hQmlzCQlPQkpfaWRfR29zdFIzNDEwXzk0LDJMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzk0X2IJCSJpZC1Hb3N0UjM0MTAtOTQtYiIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMF85NF9iCQk4NDcKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMF85NF9iCQlPQkpfaWRfR29zdFIzNDEwXzk0LDNMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzk0X2JCaXMJCSJpZC1Hb3N0UjM0MTAtOTQtYkJpcyIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMF85NF9iQmlzCQk4NDgKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMF85NF9iQmlzCQlPQkpfaWRfR29zdFIzNDEwXzk0LDRMCisKKyNkZWZpbmUgU05faWRfR29zdDI4MTQ3Xzg5X2NjCQkiaWQtR29zdDI4MTQ3LTg5LWNjIgorI2RlZmluZSBMTl9pZF9Hb3N0MjgxNDdfODlfY2MJCSJHT1NUIDI4MTQ3LTg5IENyeXB0b2NvbSBQYXJhbVNldCIKKyNkZWZpbmUgTklEX2lkX0dvc3QyODE0N184OV9jYwkJODQ5CisjZGVmaW5lIE9CSl9pZF9Hb3N0MjgxNDdfODlfY2MJCU9CSl9jcnlwdG9jb20sMUwsNkwsMUwKKworI2RlZmluZSBTTl9pZF9Hb3N0UjM0MTBfOTRfY2MJCSJnb3N0OTRjYyIKKyNkZWZpbmUgTE5faWRfR29zdFIzNDEwXzk0X2NjCQkiR09TVCAzNC4xMC05NCBDcnlwdG9jb20iCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTBfOTRfY2MJCTg1MAorI2RlZmluZSBPQkpfaWRfR29zdFIzNDEwXzk0X2NjCQlPQkpfY3J5cHRvY29tLDFMLDVMLDNMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzIwMDFfY2MJCSJnb3N0MjAwMWNjIgorI2RlZmluZSBMTl9pZF9Hb3N0UjM0MTBfMjAwMV9jYwkJIkdPU1QgMzQuMTAtMjAwMSBDcnlwdG9jb20iCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTBfMjAwMV9jYwkJODUxCisjZGVmaW5lIE9CSl9pZF9Hb3N0UjM0MTBfMjAwMV9jYwkJT0JKX2NyeXB0b2NvbSwxTCw1TCw0TAorCisjZGVmaW5lIFNOX2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF85NF9jYwkJImlkLUdvc3RSMzQxMS05NC13aXRoLUdvc3RSMzQxMC05NC1jYyIKKyNkZWZpbmUgTE5faWRfR29zdFIzNDExXzk0X3dpdGhfR29zdFIzNDEwXzk0X2NjCQkiR09TVCBSIDM0LjExLTk0IHdpdGggR09TVCBSIDM0LjEwLTk0IENyeXB0b2NvbSIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF85NF9jYwkJODUyCisjZGVmaW5lIE9CSl9pZF9Hb3N0UjM0MTFfOTRfd2l0aF9Hb3N0UjM0MTBfOTRfY2MJCU9CSl9jcnlwdG9jb20sMUwsM0wsM0wKKworI2RlZmluZSBTTl9pZF9Hb3N0UjM0MTFfOTRfd2l0aF9Hb3N0UjM0MTBfMjAwMV9jYwkJImlkLUdvc3RSMzQxMS05NC13aXRoLUdvc3RSMzQxMC0yMDAxLWNjIgorI2RlZmluZSBMTl9pZF9Hb3N0UjM0MTFfOTRfd2l0aF9Hb3N0UjM0MTBfMjAwMV9jYwkJIkdPU1QgUiAzNC4xMS05NCB3aXRoIEdPU1QgUiAzNC4xMC0yMDAxIENyeXB0b2NvbSIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF8yMDAxX2NjCQk4NTMKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF8yMDAxX2NjCQlPQkpfY3J5cHRvY29tLDFMLDNMLDRMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzIwMDFfUGFyYW1TZXRfY2MJCSJpZC1Hb3N0UjM0MTAtMjAwMS1QYXJhbVNldC1jYyIKKyNkZWZpbmUgTE5faWRfR29zdFIzNDEwXzIwMDFfUGFyYW1TZXRfY2MJCSJHT1NUIFIgMzQxMC0yMDAxIFBhcmFtZXRlciBTZXQgQ3J5cHRvY29tIgorI2RlZmluZSBOSURfaWRfR29zdFIzNDEwXzIwMDFfUGFyYW1TZXRfY2MJCTg1NAorI2RlZmluZSBPQkpfaWRfR29zdFIzNDEwXzIwMDFfUGFyYW1TZXRfY2MJCU9CSl9jcnlwdG9jb20sMUwsOEwsMUwKKworI2RlZmluZSBTTl9jYW1lbGxpYV8xMjhfY2JjCQkiQ0FNRUxMSUEtMTI4LUNCQyIKKyNkZWZpbmUgTE5fY2FtZWxsaWFfMTI4X2NiYwkJImNhbWVsbGlhLTEyOC1jYmMiCisjZGVmaW5lIE5JRF9jYW1lbGxpYV8xMjhfY2JjCQk3NTEKKyNkZWZpbmUgT0JKX2NhbWVsbGlhXzEyOF9jYmMJCTFMLDJMLDM5MkwsMjAwMDExTCw2MUwsMUwsMUwsMUwsMkwKKworI2RlZmluZSBTTl9jYW1lbGxpYV8xOTJfY2JjCQkiQ0FNRUxMSUEtMTkyLUNCQyIKKyNkZWZpbmUgTE5fY2FtZWxsaWFfMTkyX2NiYwkJImNhbWVsbGlhLTE5Mi1jYmMiCisjZGVmaW5lIE5JRF9jYW1lbGxpYV8xOTJfY2JjCQk3NTIKKyNkZWZpbmUgT0JKX2NhbWVsbGlhXzE5Ml9jYmMJCTFMLDJMLDM5MkwsMjAwMDExTCw2MUwsMUwsMUwsMUwsM0wKKworI2RlZmluZSBTTl9jYW1lbGxpYV8yNTZfY2JjCQkiQ0FNRUxMSUEtMjU2LUNCQyIKKyNkZWZpbmUgTE5fY2FtZWxsaWFfMjU2X2NiYwkJImNhbWVsbGlhLTI1Ni1jYmMiCisjZGVmaW5lIE5JRF9jYW1lbGxpYV8yNTZfY2JjCQk3NTMKKyNkZWZpbmUgT0JKX2NhbWVsbGlhXzI1Nl9jYmMJCTFMLDJMLDM5MkwsMjAwMDExTCw2MUwsMUwsMUwsMUwsNEwKKworI2RlZmluZSBTTl9pZF9jYW1lbGxpYTEyOF93cmFwCQkiaWQtY2FtZWxsaWExMjgtd3JhcCIKKyNkZWZpbmUgTklEX2lkX2NhbWVsbGlhMTI4X3dyYXAJCTkwNworI2RlZmluZSBPQkpfaWRfY2FtZWxsaWExMjhfd3JhcAkJMUwsMkwsMzkyTCwyMDAwMTFMLDYxTCwxTCwxTCwzTCwyTAorCisjZGVmaW5lIFNOX2lkX2NhbWVsbGlhMTkyX3dyYXAJCSJpZC1jYW1lbGxpYTE5Mi13cmFwIgorI2RlZmluZSBOSURfaWRfY2FtZWxsaWExOTJfd3JhcAkJOTA4CisjZGVmaW5lIE9CSl9pZF9jYW1lbGxpYTE5Ml93cmFwCQkxTCwyTCwzOTJMLDIwMDAxMUwsNjFMLDFMLDFMLDNMLDNMCisKKyNkZWZpbmUgU05faWRfY2FtZWxsaWEyNTZfd3JhcAkJImlkLWNhbWVsbGlhMjU2LXdyYXAiCisjZGVmaW5lIE5JRF9pZF9jYW1lbGxpYTI1Nl93cmFwCQk5MDkKKyNkZWZpbmUgT0JKX2lkX2NhbWVsbGlhMjU2X3dyYXAJCTFMLDJMLDM5MkwsMjAwMDExTCw2MUwsMUwsMUwsM0wsNEwKKworI2RlZmluZSBPQkpfbnR0X2RzCQkwTCwzTCw0NDAxTCw1TAorCisjZGVmaW5lIE9CSl9jYW1lbGxpYQkJT0JKX250dF9kcywzTCwxTCw5TAorCisjZGVmaW5lIFNOX2NhbWVsbGlhXzEyOF9lY2IJCSJDQU1FTExJQS0xMjgtRUNCIgorI2RlZmluZSBMTl9jYW1lbGxpYV8xMjhfZWNiCQkiY2FtZWxsaWEtMTI4LWVjYiIKKyNkZWZpbmUgTklEX2NhbWVsbGlhXzEyOF9lY2IJCTc1NAorI2RlZmluZSBPQkpfY2FtZWxsaWFfMTI4X2VjYgkJT0JKX2NhbWVsbGlhLDFMCisKKyNkZWZpbmUgU05fY2FtZWxsaWFfMTI4X29mYjEyOAkJIkNBTUVMTElBLTEyOC1PRkIiCisjZGVmaW5lIExOX2NhbWVsbGlhXzEyOF9vZmIxMjgJCSJjYW1lbGxpYS0xMjgtb2ZiIgorI2RlZmluZSBOSURfY2FtZWxsaWFfMTI4X29mYjEyOAkJNzY2CisjZGVmaW5lIE9CSl9jYW1lbGxpYV8xMjhfb2ZiMTI4CQlPQkpfY2FtZWxsaWEsM0wKKworI2RlZmluZSBTTl9jYW1lbGxpYV8xMjhfY2ZiMTI4CQkiQ0FNRUxMSUEtMTI4LUNGQiIKKyNkZWZpbmUgTE5fY2FtZWxsaWFfMTI4X2NmYjEyOAkJImNhbWVsbGlhLTEyOC1jZmIiCisjZGVmaW5lIE5JRF9jYW1lbGxpYV8xMjhfY2ZiMTI4CQk3NTcKKyNkZWZpbmUgT0JKX2NhbWVsbGlhXzEyOF9jZmIxMjgJCU9CSl9jYW1lbGxpYSw0TAorCisjZGVmaW5lIFNOX2NhbWVsbGlhXzE5Ml9lY2IJCSJDQU1FTExJQS0xOTItRUNCIgorI2RlZmluZSBMTl9jYW1lbGxpYV8xOTJfZWNiCQkiY2FtZWxsaWEtMTkyLWVjYiIKKyNkZWZpbmUgTklEX2NhbWVsbGlhXzE5Ml9lY2IJCTc1NQorI2RlZmluZSBPQkpfY2FtZWxsaWFfMTkyX2VjYgkJT0JKX2NhbWVsbGlhLDIxTAorCisjZGVmaW5lIFNOX2NhbWVsbGlhXzE5Ml9vZmIxMjgJCSJDQU1FTExJQS0xOTItT0ZCIgorI2RlZmluZSBMTl9jYW1lbGxpYV8xOTJfb2ZiMTI4CQkiY2FtZWxsaWEtMTkyLW9mYiIKKyNkZWZpbmUgTklEX2NhbWVsbGlhXzE5Ml9vZmIxMjgJCTc2NworI2RlZmluZSBPQkpfY2FtZWxsaWFfMTkyX29mYjEyOAkJT0JKX2NhbWVsbGlhLDIzTAorCisjZGVmaW5lIFNOX2NhbWVsbGlhXzE5Ml9jZmIxMjgJCSJDQU1FTExJQS0xOTItQ0ZCIgorI2RlZmluZSBMTl9jYW1lbGxpYV8xOTJfY2ZiMTI4CQkiY2FtZWxsaWEtMTkyLWNmYiIKKyNkZWZpbmUgTklEX2NhbWVsbGlhXzE5Ml9jZmIxMjgJCTc1OAorI2RlZmluZSBPQkpfY2FtZWxsaWFfMTkyX2NmYjEyOAkJT0JKX2NhbWVsbGlhLDI0TAorCisjZGVmaW5lIFNOX2NhbWVsbGlhXzI1Nl9lY2IJCSJDQU1FTExJQS0yNTYtRUNCIgorI2RlZmluZSBMTl9jYW1lbGxpYV8yNTZfZWNiCQkiY2FtZWxsaWEtMjU2LWVjYiIKKyNkZWZpbmUgTklEX2NhbWVsbGlhXzI1Nl9lY2IJCTc1NgorI2RlZmluZSBPQkpfY2FtZWxsaWFfMjU2X2VjYgkJT0JKX2NhbWVsbGlhLDQxTAorCisjZGVmaW5lIFNOX2NhbWVsbGlhXzI1Nl9vZmIxMjgJCSJDQU1FTExJQS0yNTYtT0ZCIgorI2RlZmluZSBMTl9jYW1lbGxpYV8yNTZfb2ZiMTI4CQkiY2FtZWxsaWEtMjU2LW9mYiIKKyNkZWZpbmUgTklEX2NhbWVsbGlhXzI1Nl9vZmIxMjgJCTc2OAorI2RlZmluZSBPQkpfY2FtZWxsaWFfMjU2X29mYjEyOAkJT0JKX2NhbWVsbGlhLDQzTAorCisjZGVmaW5lIFNOX2NhbWVsbGlhXzI1Nl9jZmIxMjgJCSJDQU1FTExJQS0yNTYtQ0ZCIgorI2RlZmluZSBMTl9jYW1lbGxpYV8yNTZfY2ZiMTI4CQkiY2FtZWxsaWEtMjU2LWNmYiIKKyNkZWZpbmUgTklEX2NhbWVsbGlhXzI1Nl9jZmIxMjgJCTc1OQorI2RlZmluZSBPQkpfY2FtZWxsaWFfMjU2X2NmYjEyOAkJT0JKX2NhbWVsbGlhLDQ0TAorCisjZGVmaW5lIFNOX2NhbWVsbGlhXzEyOF9jZmIxCQkiQ0FNRUxMSUEtMTI4LUNGQjEiCisjZGVmaW5lIExOX2NhbWVsbGlhXzEyOF9jZmIxCQkiY2FtZWxsaWEtMTI4LWNmYjEiCisjZGVmaW5lIE5JRF9jYW1lbGxpYV8xMjhfY2ZiMQkJNzYwCisKKyNkZWZpbmUgU05fY2FtZWxsaWFfMTkyX2NmYjEJCSJDQU1FTExJQS0xOTItQ0ZCMSIKKyNkZWZpbmUgTE5fY2FtZWxsaWFfMTkyX2NmYjEJCSJjYW1lbGxpYS0xOTItY2ZiMSIKKyNkZWZpbmUgTklEX2NhbWVsbGlhXzE5Ml9jZmIxCQk3NjEKKworI2RlZmluZSBTTl9jYW1lbGxpYV8yNTZfY2ZiMQkJIkNBTUVMTElBLTI1Ni1DRkIxIgorI2RlZmluZSBMTl9jYW1lbGxpYV8yNTZfY2ZiMQkJImNhbWVsbGlhLTI1Ni1jZmIxIgorI2RlZmluZSBOSURfY2FtZWxsaWFfMjU2X2NmYjEJCTc2MgorCisjZGVmaW5lIFNOX2NhbWVsbGlhXzEyOF9jZmI4CQkiQ0FNRUxMSUEtMTI4LUNGQjgiCisjZGVmaW5lIExOX2NhbWVsbGlhXzEyOF9jZmI4CQkiY2FtZWxsaWEtMTI4LWNmYjgiCisjZGVmaW5lIE5JRF9jYW1lbGxpYV8xMjhfY2ZiOAkJNzYzCisKKyNkZWZpbmUgU05fY2FtZWxsaWFfMTkyX2NmYjgJCSJDQU1FTExJQS0xOTItQ0ZCOCIKKyNkZWZpbmUgTE5fY2FtZWxsaWFfMTkyX2NmYjgJCSJjYW1lbGxpYS0xOTItY2ZiOCIKKyNkZWZpbmUgTklEX2NhbWVsbGlhXzE5Ml9jZmI4CQk3NjQKKworI2RlZmluZSBTTl9jYW1lbGxpYV8yNTZfY2ZiOAkJIkNBTUVMTElBLTI1Ni1DRkI4IgorI2RlZmluZSBMTl9jYW1lbGxpYV8yNTZfY2ZiOAkJImNhbWVsbGlhLTI1Ni1jZmI4IgorI2RlZmluZSBOSURfY2FtZWxsaWFfMjU2X2NmYjgJCTc2NQorCisjZGVmaW5lIFNOX2tpc2EJCSJLSVNBIgorI2RlZmluZSBMTl9raXNhCQkia2lzYSIKKyNkZWZpbmUgTklEX2tpc2EJCTc3MworI2RlZmluZSBPQkpfa2lzYQkJT0JKX21lbWJlcl9ib2R5LDQxMEwsMjAwMDA0TAorCisjZGVmaW5lIFNOX3NlZWRfZWNiCQkiU0VFRC1FQ0IiCisjZGVmaW5lIExOX3NlZWRfZWNiCQkic2VlZC1lY2IiCisjZGVmaW5lIE5JRF9zZWVkX2VjYgkJNzc2CisjZGVmaW5lIE9CSl9zZWVkX2VjYgkJT0JKX2tpc2EsMUwsM0wKKworI2RlZmluZSBTTl9zZWVkX2NiYwkJIlNFRUQtQ0JDIgorI2RlZmluZSBMTl9zZWVkX2NiYwkJInNlZWQtY2JjIgorI2RlZmluZSBOSURfc2VlZF9jYmMJCTc3NworI2RlZmluZSBPQkpfc2VlZF9jYmMJCU9CSl9raXNhLDFMLDRMCisKKyNkZWZpbmUgU05fc2VlZF9jZmIxMjgJCSJTRUVELUNGQiIKKyNkZWZpbmUgTE5fc2VlZF9jZmIxMjgJCSJzZWVkLWNmYiIKKyNkZWZpbmUgTklEX3NlZWRfY2ZiMTI4CQk3NzkKKyNkZWZpbmUgT0JKX3NlZWRfY2ZiMTI4CQlPQkpfa2lzYSwxTCw1TAorCisjZGVmaW5lIFNOX3NlZWRfb2ZiMTI4CQkiU0VFRC1PRkIiCisjZGVmaW5lIExOX3NlZWRfb2ZiMTI4CQkic2VlZC1vZmIiCisjZGVmaW5lIE5JRF9zZWVkX29mYjEyOAkJNzc4CisjZGVmaW5lIE9CSl9zZWVkX29mYjEyOAkJT0JKX2tpc2EsMUwsNkwKKworI2RlZmluZSBTTl9obWFjCQkiSE1BQyIKKyNkZWZpbmUgTE5faG1hYwkJImhtYWMiCisjZGVmaW5lIE5JRF9obWFjCQk4NTUKKworI2RlZmluZSBTTl9jbWFjCQkiQ01BQyIKKyNkZWZpbmUgTE5fY21hYwkJImNtYWMiCisjZGVmaW5lIE5JRF9jbWFjCQk4OTQKKworI2RlZmluZSBTTl9yYzRfaG1hY19tZDUJCSJSQzQtSE1BQy1NRDUiCisjZGVmaW5lIExOX3JjNF9obWFjX21kNQkJInJjNC1obWFjLW1kNSIKKyNkZWZpbmUgTklEX3JjNF9obWFjX21kNQkJOTE1CisKKyNkZWZpbmUgU05fYWVzXzEyOF9jYmNfaG1hY19zaGExCQkiQUVTLTEyOC1DQkMtSE1BQy1TSEExIgorI2RlZmluZSBMTl9hZXNfMTI4X2NiY19obWFjX3NoYTEJCSJhZXMtMTI4LWNiYy1obWFjLXNoYTEiCisjZGVmaW5lIE5JRF9hZXNfMTI4X2NiY19obWFjX3NoYTEJCTkxNgorCisjZGVmaW5lIFNOX2Flc18xOTJfY2JjX2htYWNfc2hhMQkJIkFFUy0xOTItQ0JDLUhNQUMtU0hBMSIKKyNkZWZpbmUgTE5fYWVzXzE5Ml9jYmNfaG1hY19zaGExCQkiYWVzLTE5Mi1jYmMtaG1hYy1zaGExIgorI2RlZmluZSBOSURfYWVzXzE5Ml9jYmNfaG1hY19zaGExCQk5MTcKKworI2RlZmluZSBTTl9hZXNfMjU2X2NiY19obWFjX3NoYTEJCSJBRVMtMjU2LUNCQy1ITUFDLVNIQTEiCisjZGVmaW5lIExOX2Flc18yNTZfY2JjX2htYWNfc2hhMQkJImFlcy0yNTYtY2JjLWhtYWMtc2hhMSIKKyNkZWZpbmUgTklEX2Flc18yNTZfY2JjX2htYWNfc2hhMQkJOTE4CisKKyNkZWZpbmUgU05fZGhwdWJsaWNudW1iZXIJCSJkaHB1YmxpY251bWJlciIKKyNkZWZpbmUgTE5fZGhwdWJsaWNudW1iZXIJCSJYOS40MiBESCIKKyNkZWZpbmUgTklEX2RocHVibGljbnVtYmVyCQk5MjAKKyNkZWZpbmUgT0JKX2RocHVibGljbnVtYmVyCQlPQkpfSVNPX1VTLDEwMDQ2TCwyTCwxTAorCisjZGVmaW5lIFNOX2JyYWlucG9vbFAxNjByMQkJImJyYWlucG9vbFAxNjByMSIKKyNkZWZpbmUgTklEX2JyYWlucG9vbFAxNjByMQkJOTIxCisjZGVmaW5lIE9CSl9icmFpbnBvb2xQMTYwcjEJCTFMLDNMLDM2TCwzTCwzTCwyTCw4TCwxTCwxTCwxTAorCisjZGVmaW5lIFNOX2JyYWlucG9vbFAxNjB0MQkJImJyYWlucG9vbFAxNjB0MSIKKyNkZWZpbmUgTklEX2JyYWlucG9vbFAxNjB0MQkJOTIyCisjZGVmaW5lIE9CSl9icmFpbnBvb2xQMTYwdDEJCTFMLDNMLDM2TCwzTCwzTCwyTCw4TCwxTCwxTCwyTAorCisjZGVmaW5lIFNOX2JyYWlucG9vbFAxOTJyMQkJImJyYWlucG9vbFAxOTJyMSIKKyNkZWZpbmUgTklEX2JyYWlucG9vbFAxOTJyMQkJOTIzCisjZGVmaW5lIE9CSl9icmFpbnBvb2xQMTkycjEJCTFMLDNMLDM2TCwzTCwzTCwyTCw4TCwxTCwxTCwzTAorCisjZGVmaW5lIFNOX2JyYWlucG9vbFAxOTJ0MQkJImJyYWlucG9vbFAxOTJ0MSIKKyNkZWZpbmUgTklEX2JyYWlucG9vbFAxOTJ0MQkJOTI0CisjZGVmaW5lIE9CSl9icmFpbnBvb2xQMTkydDEJCTFMLDNMLDM2TCwzTCwzTCwyTCw4TCwxTCwxTCw0TAorCisjZGVmaW5lIFNOX2JyYWlucG9vbFAyMjRyMQkJImJyYWlucG9vbFAyMjRyMSIKKyNkZWZpbmUgTklEX2JyYWlucG9vbFAyMjRyMQkJOTI1CisjZGVmaW5lIE9CSl9icmFpbnBvb2xQMjI0cjEJCTFMLDNMLDM2TCwzTCwzTCwyTCw4TCwxTCwxTCw1TAorCisjZGVmaW5lIFNOX2JyYWlucG9vbFAyMjR0MQkJImJyYWlucG9vbFAyMjR0MSIKKyNkZWZpbmUgTklEX2JyYWlucG9vbFAyMjR0MQkJOTI2CisjZGVmaW5lIE9CSl9icmFpbnBvb2xQMjI0dDEJCTFMLDNMLDM2TCwzTCwzTCwyTCw4TCwxTCwxTCw2TAorCisjZGVmaW5lIFNOX2JyYWlucG9vbFAyNTZyMQkJImJyYWlucG9vbFAyNTZyMSIKKyNkZWZpbmUgTklEX2JyYWlucG9vbFAyNTZyMQkJOTI3CisjZGVmaW5lIE9CSl9icmFpbnBvb2xQMjU2cjEJCTFMLDNMLDM2TCwzTCwzTCwyTCw4TCwxTCwxTCw3TAorCisjZGVmaW5lIFNOX2JyYWlucG9vbFAyNTZ0MQkJImJyYWlucG9vbFAyNTZ0MSIKKyNkZWZpbmUgTklEX2JyYWlucG9vbFAyNTZ0MQkJOTI4CisjZGVmaW5lIE9CSl9icmFpbnBvb2xQMjU2dDEJCTFMLDNMLDM2TCwzTCwzTCwyTCw4TCwxTCwxTCw4TAorCisjZGVmaW5lIFNOX2JyYWlucG9vbFAzMjByMQkJImJyYWlucG9vbFAzMjByMSIKKyNkZWZpbmUgTklEX2JyYWlucG9vbFAzMjByMQkJOTI5CisjZGVmaW5lIE9CSl9icmFpbnBvb2xQMzIwcjEJCTFMLDNMLDM2TCwzTCwzTCwyTCw4TCwxTCwxTCw5TAorCisjZGVmaW5lIFNOX2JyYWlucG9vbFAzMjB0MQkJImJyYWlucG9vbFAzMjB0MSIKKyNkZWZpbmUgTklEX2JyYWlucG9vbFAzMjB0MQkJOTMwCisjZGVmaW5lIE9CSl9icmFpbnBvb2xQMzIwdDEJCTFMLDNMLDM2TCwzTCwzTCwyTCw4TCwxTCwxTCwxMEwKKworI2RlZmluZSBTTl9icmFpbnBvb2xQMzg0cjEJCSJicmFpbnBvb2xQMzg0cjEiCisjZGVmaW5lIE5JRF9icmFpbnBvb2xQMzg0cjEJCTkzMQorI2RlZmluZSBPQkpfYnJhaW5wb29sUDM4NHIxCQkxTCwzTCwzNkwsM0wsM0wsMkwsOEwsMUwsMUwsMTFMCisKKyNkZWZpbmUgU05fYnJhaW5wb29sUDM4NHQxCQkiYnJhaW5wb29sUDM4NHQxIgorI2RlZmluZSBOSURfYnJhaW5wb29sUDM4NHQxCQk5MzIKKyNkZWZpbmUgT0JKX2JyYWlucG9vbFAzODR0MQkJMUwsM0wsMzZMLDNMLDNMLDJMLDhMLDFMLDFMLDEyTAorCisjZGVmaW5lIFNOX2JyYWlucG9vbFA1MTJyMQkJImJyYWlucG9vbFA1MTJyMSIKKyNkZWZpbmUgTklEX2JyYWlucG9vbFA1MTJyMQkJOTMzCisjZGVmaW5lIE9CSl9icmFpbnBvb2xQNTEycjEJCTFMLDNMLDM2TCwzTCwzTCwyTCw4TCwxTCwxTCwxM0wKKworI2RlZmluZSBTTl9icmFpbnBvb2xQNTEydDEJCSJicmFpbnBvb2xQNTEydDEiCisjZGVmaW5lIE5JRF9icmFpbnBvb2xQNTEydDEJCTkzNAorI2RlZmluZSBPQkpfYnJhaW5wb29sUDUxMnQxCQkxTCwzTCwzNkwsM0wsM0wsMkwsOEwsMUwsMUwsMTRMCisKKyNkZWZpbmUgT0JKX3g5XzYzX3NjaGVtZQkJMUwsM0wsMTMzTCwxNkwsODQwTCw2M0wsMEwKKworI2RlZmluZSBPQkpfc2VjZ19zY2hlbWUJCU9CSl9jZXJ0aWNvbV9hcmMsMUwKKworI2RlZmluZSBTTl9kaFNpbmdsZVBhc3Nfc3RkREhfc2hhMWtkZl9zY2hlbWUJCSJkaFNpbmdsZVBhc3Mtc3RkREgtc2hhMWtkZi1zY2hlbWUiCisjZGVmaW5lIE5JRF9kaFNpbmdsZVBhc3Nfc3RkREhfc2hhMWtkZl9zY2hlbWUJCTkzOQorI2RlZmluZSBPQkpfZGhTaW5nbGVQYXNzX3N0ZERIX3NoYTFrZGZfc2NoZW1lCQlPQkpfeDlfNjNfc2NoZW1lLDJMCisKKyNkZWZpbmUgU05fZGhTaW5nbGVQYXNzX3N0ZERIX3NoYTIyNGtkZl9zY2hlbWUJCSJkaFNpbmdsZVBhc3Mtc3RkREgtc2hhMjI0a2RmLXNjaGVtZSIKKyNkZWZpbmUgTklEX2RoU2luZ2xlUGFzc19zdGRESF9zaGEyMjRrZGZfc2NoZW1lCQk5NDAKKyNkZWZpbmUgT0JKX2RoU2luZ2xlUGFzc19zdGRESF9zaGEyMjRrZGZfc2NoZW1lCQlPQkpfc2VjZ19zY2hlbWUsMTFMLDBMCisKKyNkZWZpbmUgU05fZGhTaW5nbGVQYXNzX3N0ZERIX3NoYTI1NmtkZl9zY2hlbWUJCSJkaFNpbmdsZVBhc3Mtc3RkREgtc2hhMjU2a2RmLXNjaGVtZSIKKyNkZWZpbmUgTklEX2RoU2luZ2xlUGFzc19zdGRESF9zaGEyNTZrZGZfc2NoZW1lCQk5NDEKKyNkZWZpbmUgT0JKX2RoU2luZ2xlUGFzc19zdGRESF9zaGEyNTZrZGZfc2NoZW1lCQlPQkpfc2VjZ19zY2hlbWUsMTFMLDFMCisKKyNkZWZpbmUgU05fZGhTaW5nbGVQYXNzX3N0ZERIX3NoYTM4NGtkZl9zY2hlbWUJCSJkaFNpbmdsZVBhc3Mtc3RkREgtc2hhMzg0a2RmLXNjaGVtZSIKKyNkZWZpbmUgTklEX2RoU2luZ2xlUGFzc19zdGRESF9zaGEzODRrZGZfc2NoZW1lCQk5NDIKKyNkZWZpbmUgT0JKX2RoU2luZ2xlUGFzc19zdGRESF9zaGEzODRrZGZfc2NoZW1lCQlPQkpfc2VjZ19zY2hlbWUsMTFMLDJMCisKKyNkZWZpbmUgU05fZGhTaW5nbGVQYXNzX3N0ZERIX3NoYTUxMmtkZl9zY2hlbWUJCSJkaFNpbmdsZVBhc3Mtc3RkREgtc2hhNTEya2RmLXNjaGVtZSIKKyNkZWZpbmUgTklEX2RoU2luZ2xlUGFzc19zdGRESF9zaGE1MTJrZGZfc2NoZW1lCQk5NDMKKyNkZWZpbmUgT0JKX2RoU2luZ2xlUGFzc19zdGRESF9zaGE1MTJrZGZfc2NoZW1lCQlPQkpfc2VjZ19zY2hlbWUsMTFMLDNMCisKKyNkZWZpbmUgU05fZGhTaW5nbGVQYXNzX2NvZmFjdG9yREhfc2hhMWtkZl9zY2hlbWUJCSJkaFNpbmdsZVBhc3MtY29mYWN0b3JESC1zaGExa2RmLXNjaGVtZSIKKyNkZWZpbmUgTklEX2RoU2luZ2xlUGFzc19jb2ZhY3RvckRIX3NoYTFrZGZfc2NoZW1lCQk5NDQKKyNkZWZpbmUgT0JKX2RoU2luZ2xlUGFzc19jb2ZhY3RvckRIX3NoYTFrZGZfc2NoZW1lCQlPQkpfeDlfNjNfc2NoZW1lLDNMCisKKyNkZWZpbmUgU05fZGhTaW5nbGVQYXNzX2NvZmFjdG9yREhfc2hhMjI0a2RmX3NjaGVtZQkJImRoU2luZ2xlUGFzcy1jb2ZhY3RvckRILXNoYTIyNGtkZi1zY2hlbWUiCisjZGVmaW5lIE5JRF9kaFNpbmdsZVBhc3NfY29mYWN0b3JESF9zaGEyMjRrZGZfc2NoZW1lCQk5NDUKKyNkZWZpbmUgT0JKX2RoU2luZ2xlUGFzc19jb2ZhY3RvckRIX3NoYTIyNGtkZl9zY2hlbWUJCU9CSl9zZWNnX3NjaGVtZSwxNEwsMEwKKworI2RlZmluZSBTTl9kaFNpbmdsZVBhc3NfY29mYWN0b3JESF9zaGEyNTZrZGZfc2NoZW1lCQkiZGhTaW5nbGVQYXNzLWNvZmFjdG9yREgtc2hhMjU2a2RmLXNjaGVtZSIKKyNkZWZpbmUgTklEX2RoU2luZ2xlUGFzc19jb2ZhY3RvckRIX3NoYTI1NmtkZl9zY2hlbWUJCTk0NgorI2RlZmluZSBPQkpfZGhTaW5nbGVQYXNzX2NvZmFjdG9yREhfc2hhMjU2a2RmX3NjaGVtZQkJT0JKX3NlY2dfc2NoZW1lLDE0TCwxTAorCisjZGVmaW5lIFNOX2RoU2luZ2xlUGFzc19jb2ZhY3RvckRIX3NoYTM4NGtkZl9zY2hlbWUJCSJkaFNpbmdsZVBhc3MtY29mYWN0b3JESC1zaGEzODRrZGYtc2NoZW1lIgorI2RlZmluZSBOSURfZGhTaW5nbGVQYXNzX2NvZmFjdG9yREhfc2hhMzg0a2RmX3NjaGVtZQkJOTQ3CisjZGVmaW5lIE9CSl9kaFNpbmdsZVBhc3NfY29mYWN0b3JESF9zaGEzODRrZGZfc2NoZW1lCQlPQkpfc2VjZ19zY2hlbWUsMTRMLDJMCisKKyNkZWZpbmUgU05fZGhTaW5nbGVQYXNzX2NvZmFjdG9yREhfc2hhNTEya2RmX3NjaGVtZQkJImRoU2luZ2xlUGFzcy1jb2ZhY3RvckRILXNoYTUxMmtkZi1zY2hlbWUiCisjZGVmaW5lIE5JRF9kaFNpbmdsZVBhc3NfY29mYWN0b3JESF9zaGE1MTJrZGZfc2NoZW1lCQk5NDgKKyNkZWZpbmUgT0JKX2RoU2luZ2xlUGFzc19jb2ZhY3RvckRIX3NoYTUxMmtkZl9zY2hlbWUJCU9CSl9zZWNnX3NjaGVtZSwxNEwsM0wKKworI2RlZmluZSBTTl9kaF9zdGRfa2RmCQkiZGgtc3RkLWtkZiIKKyNkZWZpbmUgTklEX2RoX3N0ZF9rZGYJCTk0OQorCisjZGVmaW5lIFNOX2RoX2NvZmFjdG9yX2tkZgkJImRoLWNvZmFjdG9yLWtkZiIKKyNkZWZpbmUgTklEX2RoX2NvZmFjdG9yX2tkZgkJOTUwCisKZGlmZiAtLWdpdCBhL2NyeXB0by9vYmovb2JqX21hYy5udW0gYi9jcnlwdG8vb2JqL29ial9tYWMubnVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiY2E1NmEKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vb2JqL29ial9tYWMubnVtCkBAIC0wLDAgKzEsOTM4IEBACitpdHVfdAkJMQoraXNvCQkyCitqb2ludF9pc29faXR1X3QJCTMKK21lbWJlcl9ib2R5CQk0CitpZGVudGlmaWVkX29yZ2FuaXphdGlvbgkJNQoraG1hY19tZDUJCTYKK2htYWNfc2hhMQkJNworY2VydGljb21fYXJjCQk4CitpbnRlcm5hdGlvbmFsX29yZ2FuaXphdGlvbnMJCTkKK3dhcAkJMTAKK3dhcF93c2cJCTExCitzZWxlY3RlZF9hdHRyaWJ1dGVfdHlwZXMJCTEyCitjbGVhcmFuY2UJCTEzCitJU09fVVMJCTE0CitYOV81NwkJMTUKK1g5Y20JCTE2Citkc2EJCTE3Citkc2FXaXRoU0hBMQkJMTgKK2Fuc2lfWDlfNjIJCTE5CitYOV82Ml9wcmltZV9maWVsZAkJMjAKK1g5XzYyX2NoYXJhY3RlcmlzdGljX3R3b19maWVsZAkJMjEKK1g5XzYyX2lkX2NoYXJhY3RlcmlzdGljX3R3b19iYXNpcwkJMjIKK1g5XzYyX29uQmFzaXMJCTIzCitYOV82Ml90cEJhc2lzCQkyNAorWDlfNjJfcHBCYXNpcwkJMjUKK1g5XzYyX2lkX2VjUHVibGljS2V5CQkyNgorWDlfNjJfYzJwbmIxNjN2MQkJMjcKK1g5XzYyX2MycG5iMTYzdjIJCTI4CitYOV82Ml9jMnBuYjE2M3YzCQkyOQorWDlfNjJfYzJwbmIxNzZ2MQkJMzAKK1g5XzYyX2MydG5iMTkxdjEJCTMxCitYOV82Ml9jMnRuYjE5MXYyCQkzMgorWDlfNjJfYzJ0bmIxOTF2MwkJMzMKK1g5XzYyX2Myb25iMTkxdjQJCTM0CitYOV82Ml9jMm9uYjE5MXY1CQkzNQorWDlfNjJfYzJwbmIyMDh3MQkJMzYKK1g5XzYyX2MydG5iMjM5djEJCTM3CitYOV82Ml9jMnRuYjIzOXYyCQkzOAorWDlfNjJfYzJ0bmIyMzl2MwkJMzkKK1g5XzYyX2Myb25iMjM5djQJCTQwCitYOV82Ml9jMm9uYjIzOXY1CQk0MQorWDlfNjJfYzJwbmIyNzJ3MQkJNDIKK1g5XzYyX2MycG5iMzA0dzEJCTQzCitYOV82Ml9jMnRuYjM1OXYxCQk0NAorWDlfNjJfYzJwbmIzNjh3MQkJNDUKK1g5XzYyX2MydG5iNDMxcjEJCTQ2CitYOV82Ml9wcmltZTE5MnYxCQk0NworWDlfNjJfcHJpbWUxOTJ2MgkJNDgKK1g5XzYyX3ByaW1lMTkydjMJCTQ5CitYOV82Ml9wcmltZTIzOXYxCQk1MAorWDlfNjJfcHJpbWUyMzl2MgkJNTEKK1g5XzYyX3ByaW1lMjM5djMJCTUyCitYOV82Ml9wcmltZTI1NnYxCQk1MworZWNkc2Ffd2l0aF9TSEExCQk1NAorZWNkc2Ffd2l0aF9SZWNvbW1lbmRlZAkJNTUKK2VjZHNhX3dpdGhfU3BlY2lmaWVkCQk1NgorZWNkc2Ffd2l0aF9TSEEyMjQJCTU3CitlY2RzYV93aXRoX1NIQTI1NgkJNTgKK2VjZHNhX3dpdGhfU0hBMzg0CQk1OQorZWNkc2Ffd2l0aF9TSEE1MTIJCTYwCitzZWNwMTEycjEJCTYxCitzZWNwMTEycjIJCTYyCitzZWNwMTI4cjEJCTYzCitzZWNwMTI4cjIJCTY0CitzZWNwMTYwazEJCTY1CitzZWNwMTYwcjEJCTY2CitzZWNwMTYwcjIJCTY3CitzZWNwMTkyazEJCTY4CitzZWNwMjI0azEJCTY5CitzZWNwMjI0cjEJCTcwCitzZWNwMjU2azEJCTcxCitzZWNwMzg0cjEJCTcyCitzZWNwNTIxcjEJCTczCitzZWN0MTEzcjEJCTc0CitzZWN0MTEzcjIJCTc1CitzZWN0MTMxcjEJCTc2CitzZWN0MTMxcjIJCTc3CitzZWN0MTYzazEJCTc4CitzZWN0MTYzcjEJCTc5CitzZWN0MTYzcjIJCTgwCitzZWN0MTkzcjEJCTgxCitzZWN0MTkzcjIJCTgyCitzZWN0MjMzazEJCTgzCitzZWN0MjMzcjEJCTg0CitzZWN0MjM5azEJCTg1CitzZWN0MjgzazEJCTg2CitzZWN0MjgzcjEJCTg3CitzZWN0NDA5azEJCTg4CitzZWN0NDA5cjEJCTg5CitzZWN0NTcxazEJCTkwCitzZWN0NTcxcjEJCTkxCit3YXBfd3NnX2lkbV9lY2lkX3d0bHMxCQk5Mgord2FwX3dzZ19pZG1fZWNpZF93dGxzMwkJOTMKK3dhcF93c2dfaWRtX2VjaWRfd3RsczQJCTk0Cit3YXBfd3NnX2lkbV9lY2lkX3d0bHM1CQk5NQord2FwX3dzZ19pZG1fZWNpZF93dGxzNgkJOTYKK3dhcF93c2dfaWRtX2VjaWRfd3RsczcJCTk3Cit3YXBfd3NnX2lkbV9lY2lkX3d0bHM4CQk5OAord2FwX3dzZ19pZG1fZWNpZF93dGxzOQkJOTkKK3dhcF93c2dfaWRtX2VjaWRfd3RsczEwCQkxMDAKK3dhcF93c2dfaWRtX2VjaWRfd3RsczExCQkxMDEKK3dhcF93c2dfaWRtX2VjaWRfd3RsczEyCQkxMDIKK2Nhc3Q1X2NiYwkJMTAzCitjYXN0NV9lY2IJCTEwNAorY2FzdDVfY2ZiNjQJCTEwNQorY2FzdDVfb2ZiNjQJCTEwNgorcGJlV2l0aE1ENUFuZENhc3Q1X0NCQwkJMTA3CitpZF9QYXNzd29yZEJhc2VkTUFDCQkxMDgKK2lkX0RIQmFzZWRNYWMJCTEwOQorcnNhZHNpCQkxMTAKK3BrY3MJCTExMQorcGtjczEJCTExMgorcnNhRW5jcnlwdGlvbgkJMTEzCittZDJXaXRoUlNBRW5jcnlwdGlvbgkJMTE0CittZDRXaXRoUlNBRW5jcnlwdGlvbgkJMTE1CittZDVXaXRoUlNBRW5jcnlwdGlvbgkJMTE2CitzaGExV2l0aFJTQUVuY3J5cHRpb24JCTExNworcnNhZXNPYWVwCQkxMTgKK21nZjEJCTExOQorcFNwZWNpZmllZAkJMTIwCityc2Fzc2FQc3MJCTEyMQorc2hhMjU2V2l0aFJTQUVuY3J5cHRpb24JCTEyMgorc2hhMzg0V2l0aFJTQUVuY3J5cHRpb24JCTEyMworc2hhNTEyV2l0aFJTQUVuY3J5cHRpb24JCTEyNAorc2hhMjI0V2l0aFJTQUVuY3J5cHRpb24JCTEyNQorcGtjczMJCTEyNgorZGhLZXlBZ3JlZW1lbnQJCTEyNworcGtjczUJCTEyOAorcGJlV2l0aE1EMkFuZERFU19DQkMJCTEyOQorcGJlV2l0aE1ENUFuZERFU19DQkMJCTEzMAorcGJlV2l0aE1EMkFuZFJDMl9DQkMJCTEzMQorcGJlV2l0aE1ENUFuZFJDMl9DQkMJCTEzMgorcGJlV2l0aFNIQTFBbmRERVNfQ0JDCQkxMzMKK3BiZVdpdGhTSEExQW5kUkMyX0NCQwkJMTM0CitpZF9wYmtkZjIJCTEzNQorcGJlczIJCTEzNgorcGJtYWMxCQkxMzcKK3BrY3M3CQkxMzgKK3BrY3M3X2RhdGEJCTEzOQorcGtjczdfc2lnbmVkCQkxNDAKK3BrY3M3X2VudmVsb3BlZAkJMTQxCitwa2NzN19zaWduZWRBbmRFbnZlbG9wZWQJCTE0MgorcGtjczdfZGlnZXN0CQkxNDMKK3BrY3M3X2VuY3J5cHRlZAkJMTQ0Citwa2NzOQkJMTQ1Citwa2NzOV9lbWFpbEFkZHJlc3MJCTE0NgorcGtjczlfdW5zdHJ1Y3R1cmVkTmFtZQkJMTQ3Citwa2NzOV9jb250ZW50VHlwZQkJMTQ4Citwa2NzOV9tZXNzYWdlRGlnZXN0CQkxNDkKK3BrY3M5X3NpZ25pbmdUaW1lCQkxNTAKK3BrY3M5X2NvdW50ZXJzaWduYXR1cmUJCTE1MQorcGtjczlfY2hhbGxlbmdlUGFzc3dvcmQJCTE1MgorcGtjczlfdW5zdHJ1Y3R1cmVkQWRkcmVzcwkJMTUzCitwa2NzOV9leHRDZXJ0QXR0cmlidXRlcwkJMTU0CitleHRfcmVxCQkxNTUKK1NNSU1FQ2FwYWJpbGl0aWVzCQkxNTYKK1NNSU1FCQkxNTcKK2lkX3NtaW1lX21vZAkJMTU4CitpZF9zbWltZV9jdAkJMTU5CitpZF9zbWltZV9hYQkJMTYwCitpZF9zbWltZV9hbGcJCTE2MQoraWRfc21pbWVfY2QJCTE2MgoraWRfc21pbWVfc3BxCQkxNjMKK2lkX3NtaW1lX2N0aQkJMTY0CitpZF9zbWltZV9tb2RfY21zCQkxNjUKK2lkX3NtaW1lX21vZF9lc3MJCTE2NgoraWRfc21pbWVfbW9kX29pZAkJMTY3CitpZF9zbWltZV9tb2RfbXNnX3YzCQkxNjgKK2lkX3NtaW1lX21vZF9ldHNfZVNpZ25hdHVyZV84OAkJMTY5CitpZF9zbWltZV9tb2RfZXRzX2VTaWduYXR1cmVfOTcJCTE3MAoraWRfc21pbWVfbW9kX2V0c19lU2lnUG9saWN5Xzg4CQkxNzEKK2lkX3NtaW1lX21vZF9ldHNfZVNpZ1BvbGljeV85NwkJMTcyCitpZF9zbWltZV9jdF9yZWNlaXB0CQkxNzMKK2lkX3NtaW1lX2N0X2F1dGhEYXRhCQkxNzQKK2lkX3NtaW1lX2N0X3B1Ymxpc2hDZXJ0CQkxNzUKK2lkX3NtaW1lX2N0X1RTVEluZm8JCTE3NgoraWRfc21pbWVfY3RfVERUSW5mbwkJMTc3CitpZF9zbWltZV9jdF9jb250ZW50SW5mbwkJMTc4CitpZF9zbWltZV9jdF9EVkNTUmVxdWVzdERhdGEJCTE3OQoraWRfc21pbWVfY3RfRFZDU1Jlc3BvbnNlRGF0YQkJMTgwCitpZF9zbWltZV9jdF9jb21wcmVzc2VkRGF0YQkJMTgxCitpZF9jdF9hc2NpaVRleHRXaXRoQ1JMRgkJMTgyCitpZF9zbWltZV9hYV9yZWNlaXB0UmVxdWVzdAkJMTgzCitpZF9zbWltZV9hYV9zZWN1cml0eUxhYmVsCQkxODQKK2lkX3NtaW1lX2FhX21sRXhwYW5kSGlzdG9yeQkJMTg1CitpZF9zbWltZV9hYV9jb250ZW50SGludAkJMTg2CitpZF9zbWltZV9hYV9tc2dTaWdEaWdlc3QJCTE4NworaWRfc21pbWVfYWFfZW5jYXBDb250ZW50VHlwZQkJMTg4CitpZF9zbWltZV9hYV9jb250ZW50SWRlbnRpZmllcgkJMTg5CitpZF9zbWltZV9hYV9tYWNWYWx1ZQkJMTkwCitpZF9zbWltZV9hYV9lcXVpdmFsZW50TGFiZWxzCQkxOTEKK2lkX3NtaW1lX2FhX2NvbnRlbnRSZWZlcmVuY2UJCTE5MgoraWRfc21pbWVfYWFfZW5jcnlwS2V5UHJlZgkJMTkzCitpZF9zbWltZV9hYV9zaWduaW5nQ2VydGlmaWNhdGUJCTE5NAoraWRfc21pbWVfYWFfc21pbWVFbmNyeXB0Q2VydHMJCTE5NQoraWRfc21pbWVfYWFfdGltZVN0YW1wVG9rZW4JCTE5NgoraWRfc21pbWVfYWFfZXRzX3NpZ1BvbGljeUlkCQkxOTcKK2lkX3NtaW1lX2FhX2V0c19jb21taXRtZW50VHlwZQkJMTk4CitpZF9zbWltZV9hYV9ldHNfc2lnbmVyTG9jYXRpb24JCTE5OQoraWRfc21pbWVfYWFfZXRzX3NpZ25lckF0dHIJCTIwMAoraWRfc21pbWVfYWFfZXRzX290aGVyU2lnQ2VydAkJMjAxCitpZF9zbWltZV9hYV9ldHNfY29udGVudFRpbWVzdGFtcAkJMjAyCitpZF9zbWltZV9hYV9ldHNfQ2VydGlmaWNhdGVSZWZzCQkyMDMKK2lkX3NtaW1lX2FhX2V0c19SZXZvY2F0aW9uUmVmcwkJMjA0CitpZF9zbWltZV9hYV9ldHNfY2VydFZhbHVlcwkJMjA1CitpZF9zbWltZV9hYV9ldHNfcmV2b2NhdGlvblZhbHVlcwkJMjA2CitpZF9zbWltZV9hYV9ldHNfZXNjVGltZVN0YW1wCQkyMDcKK2lkX3NtaW1lX2FhX2V0c19jZXJ0Q1JMVGltZXN0YW1wCQkyMDgKK2lkX3NtaW1lX2FhX2V0c19hcmNoaXZlVGltZVN0YW1wCQkyMDkKK2lkX3NtaW1lX2FhX3NpZ25hdHVyZVR5cGUJCTIxMAoraWRfc21pbWVfYWFfZHZjc19kdmMJCTIxMQoraWRfc21pbWVfYWxnX0VTREh3aXRoM0RFUwkJMjEyCitpZF9zbWltZV9hbGdfRVNESHdpdGhSQzIJCTIxMworaWRfc21pbWVfYWxnXzNERVN3cmFwCQkyMTQKK2lkX3NtaW1lX2FsZ19SQzJ3cmFwCQkyMTUKK2lkX3NtaW1lX2FsZ19FU0RICQkyMTYKK2lkX3NtaW1lX2FsZ19DTVMzREVTd3JhcAkJMjE3CitpZF9zbWltZV9hbGdfQ01TUkMyd3JhcAkJMjE4CitpZF9hbGdfUFdSSV9LRUsJCTIxOQoraWRfc21pbWVfY2RfbGRhcAkJMjIwCitpZF9zbWltZV9zcHFfZXRzX3NxdF91cmkJCTIyMQoraWRfc21pbWVfc3BxX2V0c19zcXRfdW5vdGljZQkJMjIyCitpZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZPcmlnaW4JCTIyMworaWRfc21pbWVfY3RpX2V0c19wcm9vZk9mUmVjZWlwdAkJMjI0CitpZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZEZWxpdmVyeQkJMjI1CitpZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZTZW5kZXIJCTIyNgoraWRfc21pbWVfY3RpX2V0c19wcm9vZk9mQXBwcm92YWwJCTIyNworaWRfc21pbWVfY3RpX2V0c19wcm9vZk9mQ3JlYXRpb24JCTIyOAorZnJpZW5kbHlOYW1lCQkyMjkKK2xvY2FsS2V5SUQJCTIzMAorbXNfY3NwX25hbWUJCTIzMQorTG9jYWxLZXlTZXQJCTIzMgoreDUwOUNlcnRpZmljYXRlCQkyMzMKK3Nkc2lDZXJ0aWZpY2F0ZQkJMjM0Cit4NTA5Q3JsCQkyMzUKK3BiZV9XaXRoU0hBMUFuZDEyOEJpdFJDNAkJMjM2CitwYmVfV2l0aFNIQTFBbmQ0MEJpdFJDNAkJMjM3CitwYmVfV2l0aFNIQTFBbmQzX0tleV9UcmlwbGVERVNfQ0JDCQkyMzgKK3BiZV9XaXRoU0hBMUFuZDJfS2V5X1RyaXBsZURFU19DQkMJCTIzOQorcGJlX1dpdGhTSEExQW5kMTI4Qml0UkMyX0NCQwkJMjQwCitwYmVfV2l0aFNIQTFBbmQ0MEJpdFJDMl9DQkMJCTI0MQora2V5QmFnCQkyNDIKK3BrY3M4U2hyb3VkZWRLZXlCYWcJCTI0MworY2VydEJhZwkJMjQ0CitjcmxCYWcJCTI0NQorc2VjcmV0QmFnCQkyNDYKK3NhZmVDb250ZW50c0JhZwkJMjQ3CittZDIJCTI0OAorbWQ0CQkyNDkKK21kNQkJMjUwCittZDVfc2hhMQkJMjUxCitobWFjV2l0aE1ENQkJMjUyCitobWFjV2l0aFNIQTEJCTI1MworaG1hY1dpdGhTSEEyMjQJCTI1NAoraG1hY1dpdGhTSEEyNTYJCTI1NQoraG1hY1dpdGhTSEEzODQJCTI1NgoraG1hY1dpdGhTSEE1MTIJCTI1NworcmMyX2NiYwkJMjU4CityYzJfZWNiCQkyNTkKK3JjMl9jZmI2NAkJMjYwCityYzJfb2ZiNjQJCTI2MQorcmMyXzQwX2NiYwkJMjYyCityYzJfNjRfY2JjCQkyNjMKK3JjNAkJMjY0CityYzRfNDAJCTI2NQorZGVzX2VkZTNfY2JjCQkyNjYKK3JjNV9jYmMJCTI2NworcmM1X2VjYgkJMjY4CityYzVfY2ZiNjQJCTI2OQorcmM1X29mYjY0CQkyNzAKK21zX2V4dF9yZXEJCTI3MQorbXNfY29kZV9pbmQJCTI3MgorbXNfY29kZV9jb20JCTI3MworbXNfY3RsX3NpZ24JCTI3NAorbXNfc2djCQkyNzUKK21zX2VmcwkJMjc2Cittc19zbWFydGNhcmRfbG9naW4JCTI3NworbXNfdXBuCQkyNzgKK2lkZWFfY2JjCQkyNzkKK2lkZWFfZWNiCQkyODAKK2lkZWFfY2ZiNjQJCTI4MQoraWRlYV9vZmI2NAkJMjgyCitiZl9jYmMJCTI4MworYmZfZWNiCQkyODQKK2JmX2NmYjY0CQkyODUKK2JmX29mYjY0CQkyODYKK2lkX3BraXgJCTI4NworaWRfcGtpeF9tb2QJCTI4OAoraWRfcGUJCTI4OQoraWRfcXQJCTI5MAoraWRfa3AJCTI5MQoraWRfaXQJCTI5MgoraWRfcGtpcAkJMjkzCitpZF9hbGcJCTI5NAoraWRfY21jCQkyOTUKK2lkX29uCQkyOTYKK2lkX3BkYQkJMjk3CitpZF9hY2EJCTI5OAoraWRfcWNzCQkyOTkKK2lkX2NjdAkJMzAwCitpZF9wcGwJCTMwMQoraWRfYWQJCTMwMgoraWRfcGtpeDFfZXhwbGljaXRfODgJCTMwMworaWRfcGtpeDFfaW1wbGljaXRfODgJCTMwNAoraWRfcGtpeDFfZXhwbGljaXRfOTMJCTMwNQoraWRfcGtpeDFfaW1wbGljaXRfOTMJCTMwNgoraWRfbW9kX2NybWYJCTMwNworaWRfbW9kX2NtYwkJMzA4CitpZF9tb2Rfa2VhX3Byb2ZpbGVfODgJCTMwOQoraWRfbW9kX2tlYV9wcm9maWxlXzkzCQkzMTAKK2lkX21vZF9jbXAJCTMxMQoraWRfbW9kX3F1YWxpZmllZF9jZXJ0Xzg4CQkzMTIKK2lkX21vZF9xdWFsaWZpZWRfY2VydF85MwkJMzEzCitpZF9tb2RfYXR0cmlidXRlX2NlcnQJCTMxNAoraWRfbW9kX3RpbWVzdGFtcF9wcm90b2NvbAkJMzE1CitpZF9tb2Rfb2NzcAkJMzE2CitpZF9tb2RfZHZjcwkJMzE3CitpZF9tb2RfY21wMjAwMAkJMzE4CitpbmZvX2FjY2VzcwkJMzE5CitiaW9tZXRyaWNJbmZvCQkzMjAKK3FjU3RhdGVtZW50cwkJMzIxCithY19hdWRpdEVudGl0eQkJMzIyCithY190YXJnZXRpbmcJCTMyMworYWFDb250cm9scwkJMzI0CitzYmdwX2lwQWRkckJsb2NrCQkzMjUKK3NiZ3BfYXV0b25vbW91c1N5c051bQkJMzI2CitzYmdwX3JvdXRlcklkZW50aWZpZXIJCTMyNworYWNfcHJveHlpbmcJCTMyOAorc2luZm9fYWNjZXNzCQkzMjkKK3Byb3h5Q2VydEluZm8JCTMzMAoraWRfcXRfY3BzCQkzMzEKK2lkX3F0X3Vub3RpY2UJCTMzMgordGV4dE5vdGljZQkJMzMzCitzZXJ2ZXJfYXV0aAkJMzM0CitjbGllbnRfYXV0aAkJMzM1Citjb2RlX3NpZ24JCTMzNgorZW1haWxfcHJvdGVjdAkJMzM3CitpcHNlY0VuZFN5c3RlbQkJMzM4CitpcHNlY1R1bm5lbAkJMzM5CitpcHNlY1VzZXIJCTM0MAordGltZV9zdGFtcAkJMzQxCitPQ1NQX3NpZ24JCTM0MgorZHZjcwkJMzQzCitpZF9pdF9jYVByb3RFbmNDZXJ0CQkzNDQKK2lkX2l0X3NpZ25LZXlQYWlyVHlwZXMJCTM0NQoraWRfaXRfZW5jS2V5UGFpclR5cGVzCQkzNDYKK2lkX2l0X3ByZWZlcnJlZFN5bW1BbGcJCTM0NworaWRfaXRfY2FLZXlVcGRhdGVJbmZvCQkzNDgKK2lkX2l0X2N1cnJlbnRDUkwJCTM0OQoraWRfaXRfdW5zdXBwb3J0ZWRPSURzCQkzNTAKK2lkX2l0X3N1YnNjcmlwdGlvblJlcXVlc3QJCTM1MQoraWRfaXRfc3Vic2NyaXB0aW9uUmVzcG9uc2UJCTM1MgoraWRfaXRfa2V5UGFpclBhcmFtUmVxCQkzNTMKK2lkX2l0X2tleVBhaXJQYXJhbVJlcAkJMzU0CitpZF9pdF9yZXZQYXNzcGhyYXNlCQkzNTUKK2lkX2l0X2ltcGxpY2l0Q29uZmlybQkJMzU2CitpZF9pdF9jb25maXJtV2FpdFRpbWUJCTM1NworaWRfaXRfb3JpZ1BLSU1lc3NhZ2UJCTM1OAoraWRfaXRfc3VwcExhbmdUYWdzCQkzNTkKK2lkX3JlZ0N0cmwJCTM2MAoraWRfcmVnSW5mbwkJMzYxCitpZF9yZWdDdHJsX3JlZ1Rva2VuCQkzNjIKK2lkX3JlZ0N0cmxfYXV0aGVudGljYXRvcgkJMzYzCitpZF9yZWdDdHJsX3BraVB1YmxpY2F0aW9uSW5mbwkJMzY0CitpZF9yZWdDdHJsX3BraUFyY2hpdmVPcHRpb25zCQkzNjUKK2lkX3JlZ0N0cmxfb2xkQ2VydElECQkzNjYKK2lkX3JlZ0N0cmxfcHJvdG9jb2xFbmNyS2V5CQkzNjcKK2lkX3JlZ0luZm9fdXRmOFBhaXJzCQkzNjgKK2lkX3JlZ0luZm9fY2VydFJlcQkJMzY5CitpZF9hbGdfZGVzNDAJCTM3MAoraWRfYWxnX25vU2lnbmF0dXJlCQkzNzEKK2lkX2FsZ19kaF9zaWdfaG1hY19zaGExCQkzNzIKK2lkX2FsZ19kaF9wb3AJCTM3MworaWRfY21jX3N0YXR1c0luZm8JCTM3NAoraWRfY21jX2lkZW50aWZpY2F0aW9uCQkzNzUKK2lkX2NtY19pZGVudGl0eVByb29mCQkzNzYKK2lkX2NtY19kYXRhUmV0dXJuCQkzNzcKK2lkX2NtY190cmFuc2FjdGlvbklkCQkzNzgKK2lkX2NtY19zZW5kZXJOb25jZQkJMzc5CitpZF9jbWNfcmVjaXBpZW50Tm9uY2UJCTM4MAoraWRfY21jX2FkZEV4dGVuc2lvbnMJCTM4MQoraWRfY21jX2VuY3J5cHRlZFBPUAkJMzgyCitpZF9jbWNfZGVjcnlwdGVkUE9QCQkzODMKK2lkX2NtY19scmFQT1BXaXRuZXNzCQkzODQKK2lkX2NtY19nZXRDZXJ0CQkzODUKK2lkX2NtY19nZXRDUkwJCTM4NgoraWRfY21jX3Jldm9rZVJlcXVlc3QJCTM4NworaWRfY21jX3JlZ0luZm8JCTM4OAoraWRfY21jX3Jlc3BvbnNlSW5mbwkJMzg5CitpZF9jbWNfcXVlcnlQZW5kaW5nCQkzOTAKK2lkX2NtY19wb3BMaW5rUmFuZG9tCQkzOTEKK2lkX2NtY19wb3BMaW5rV2l0bmVzcwkJMzkyCitpZF9jbWNfY29uZmlybUNlcnRBY2NlcHRhbmNlCQkzOTMKK2lkX29uX3BlcnNvbmFsRGF0YQkJMzk0CitpZF9vbl9wZXJtYW5lbnRJZGVudGlmaWVyCQkzOTUKK2lkX3BkYV9kYXRlT2ZCaXJ0aAkJMzk2CitpZF9wZGFfcGxhY2VPZkJpcnRoCQkzOTcKK2lkX3BkYV9nZW5kZXIJCTM5OAoraWRfcGRhX2NvdW50cnlPZkNpdGl6ZW5zaGlwCQkzOTkKK2lkX3BkYV9jb3VudHJ5T2ZSZXNpZGVuY2UJCTQwMAoraWRfYWNhX2F1dGhlbnRpY2F0aW9uSW5mbwkJNDAxCitpZF9hY2FfYWNjZXNzSWRlbnRpdHkJCTQwMgoraWRfYWNhX2NoYXJnaW5nSWRlbnRpdHkJCTQwMworaWRfYWNhX2dyb3VwCQk0MDQKK2lkX2FjYV9yb2xlCQk0MDUKK2lkX2FjYV9lbmNBdHRycwkJNDA2CitpZF9xY3NfcGtpeFFDU3ludGF4X3YxCQk0MDcKK2lkX2NjdF9jcnMJCTQwOAoraWRfY2N0X1BLSURhdGEJCTQwOQoraWRfY2N0X1BLSVJlc3BvbnNlCQk0MTAKK2lkX3BwbF9hbnlMYW5ndWFnZQkJNDExCitpZF9wcGxfaW5oZXJpdEFsbAkJNDEyCitJbmRlcGVuZGVudAkJNDEzCithZF9PQ1NQCQk0MTQKK2FkX2NhX2lzc3VlcnMJCTQxNQorYWRfdGltZVN0YW1waW5nCQk0MTYKK2FkX2R2Y3MJCTQxNworY2FSZXBvc2l0b3J5CQk0MTgKK2lkX3BraXhfT0NTUF9iYXNpYwkJNDE5CitpZF9wa2l4X09DU1BfTm9uY2UJCTQyMAoraWRfcGtpeF9PQ1NQX0NybElECQk0MjEKK2lkX3BraXhfT0NTUF9hY2NlcHRhYmxlUmVzcG9uc2VzCQk0MjIKK2lkX3BraXhfT0NTUF9ub0NoZWNrCQk0MjMKK2lkX3BraXhfT0NTUF9hcmNoaXZlQ3V0b2ZmCQk0MjQKK2lkX3BraXhfT0NTUF9zZXJ2aWNlTG9jYXRvcgkJNDI1CitpZF9wa2l4X09DU1BfZXh0ZW5kZWRTdGF0dXMJCTQyNgoraWRfcGtpeF9PQ1NQX3ZhbGlkCQk0MjcKK2lkX3BraXhfT0NTUF9wYXRoCQk0MjgKK2lkX3BraXhfT0NTUF90cnVzdFJvb3QJCTQyOQorYWxnb3JpdGhtCQk0MzAKK21kNVdpdGhSU0EJCTQzMQorZGVzX2VjYgkJNDMyCitkZXNfY2JjCQk0MzMKK2Rlc19vZmI2NAkJNDM0CitkZXNfY2ZiNjQJCTQzNQorcnNhU2lnbmF0dXJlCQk0MzYKK2RzYV8yCQk0MzcKK2RzYVdpdGhTSEEJCTQzOAorc2hhV2l0aFJTQUVuY3J5cHRpb24JCTQzOQorZGVzX2VkZV9lY2IJCTQ0MAorZGVzX2VkZTNfZWNiCQk0NDEKK2Rlc19lZGVfY2JjCQk0NDIKK2Rlc19lZGVfY2ZiNjQJCTQ0MworZGVzX2VkZTNfY2ZiNjQJCTQ0NAorZGVzX2VkZV9vZmI2NAkJNDQ1CitkZXNfZWRlM19vZmI2NAkJNDQ2CitkZXN4X2NiYwkJNDQ3CitzaGEJCTQ0OAorc2hhMQkJNDQ5Citkc2FXaXRoU0hBMV8yCQk0NTAKK3NoYTFXaXRoUlNBCQk0NTEKK3JpcGVtZDE2MAkJNDUyCityaXBlbWQxNjBXaXRoUlNBCQk0NTMKK3N4bmV0CQk0NTQKK1g1MDAJCTQ1NQorWDUwOQkJNDU2Citjb21tb25OYW1lCQk0NTcKK3N1cm5hbWUJCTQ1OAorc2VyaWFsTnVtYmVyCQk0NTkKK2NvdW50cnlOYW1lCQk0NjAKK2xvY2FsaXR5TmFtZQkJNDYxCitzdGF0ZU9yUHJvdmluY2VOYW1lCQk0NjIKK3N0cmVldEFkZHJlc3MJCTQ2Mworb3JnYW5pemF0aW9uTmFtZQkJNDY0Citvcmdhbml6YXRpb25hbFVuaXROYW1lCQk0NjUKK3RpdGxlCQk0NjYKK2Rlc2NyaXB0aW9uCQk0NjcKK3NlYXJjaEd1aWRlCQk0NjgKK2J1c2luZXNzQ2F0ZWdvcnkJCTQ2OQorcG9zdGFsQWRkcmVzcwkJNDcwCitwb3N0YWxDb2RlCQk0NzEKK3Bvc3RPZmZpY2VCb3gJCTQ3MgorcGh5c2ljYWxEZWxpdmVyeU9mZmljZU5hbWUJCTQ3MwordGVsZXBob25lTnVtYmVyCQk0NzQKK3RlbGV4TnVtYmVyCQk0NzUKK3RlbGV0ZXhUZXJtaW5hbElkZW50aWZpZXIJCTQ3NgorZmFjc2ltaWxlVGVsZXBob25lTnVtYmVyCQk0NzcKK3gxMjFBZGRyZXNzCQk0NzgKK2ludGVybmF0aW9uYWxpU0ROTnVtYmVyCQk0NzkKK3JlZ2lzdGVyZWRBZGRyZXNzCQk0ODAKK2Rlc3RpbmF0aW9uSW5kaWNhdG9yCQk0ODEKK3ByZWZlcnJlZERlbGl2ZXJ5TWV0aG9kCQk0ODIKK3ByZXNlbnRhdGlvbkFkZHJlc3MJCTQ4Mworc3VwcG9ydGVkQXBwbGljYXRpb25Db250ZXh0CQk0ODQKK21lbWJlcgkJNDg1Citvd25lcgkJNDg2Cityb2xlT2NjdXBhbnQJCTQ4Nworc2VlQWxzbwkJNDg4Cit1c2VyUGFzc3dvcmQJCTQ4OQordXNlckNlcnRpZmljYXRlCQk0OTAKK2NBQ2VydGlmaWNhdGUJCTQ5MQorYXV0aG9yaXR5UmV2b2NhdGlvbkxpc3QJCTQ5MgorY2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdAkJNDkzCitjcm9zc0NlcnRpZmljYXRlUGFpcgkJNDk0CituYW1lCQk0OTUKK2dpdmVuTmFtZQkJNDk2Citpbml0aWFscwkJNDk3CitnZW5lcmF0aW9uUXVhbGlmaWVyCQk0OTgKK3g1MDBVbmlxdWVJZGVudGlmaWVyCQk0OTkKK2RuUXVhbGlmaWVyCQk1MDAKK2VuaGFuY2VkU2VhcmNoR3VpZGUJCTUwMQorcHJvdG9jb2xJbmZvcm1hdGlvbgkJNTAyCitkaXN0aW5ndWlzaGVkTmFtZQkJNTAzCit1bmlxdWVNZW1iZXIJCTUwNAoraG91c2VJZGVudGlmaWVyCQk1MDUKK3N1cHBvcnRlZEFsZ29yaXRobXMJCTUwNgorZGVsdGFSZXZvY2F0aW9uTGlzdAkJNTA3CitkbWROYW1lCQk1MDgKK3BzZXVkb255bQkJNTA5Cityb2xlCQk1MTAKK1g1MDBhbGdvcml0aG1zCQk1MTEKK3JzYQkJNTEyCittZGMyV2l0aFJTQQkJNTEzCittZGMyCQk1MTQKK2lkX2NlCQk1MTUKK3N1YmplY3RfZGlyZWN0b3J5X2F0dHJpYnV0ZXMJCTUxNgorc3ViamVjdF9rZXlfaWRlbnRpZmllcgkJNTE3CitrZXlfdXNhZ2UJCTUxOAorcHJpdmF0ZV9rZXlfdXNhZ2VfcGVyaW9kCQk1MTkKK3N1YmplY3RfYWx0X25hbWUJCTUyMAoraXNzdWVyX2FsdF9uYW1lCQk1MjEKK2Jhc2ljX2NvbnN0cmFpbnRzCQk1MjIKK2NybF9udW1iZXIJCTUyMworY3JsX3JlYXNvbgkJNTI0CitpbnZhbGlkaXR5X2RhdGUJCTUyNQorZGVsdGFfY3JsCQk1MjYKK2lzc3VpbmdfZGlzdHJpYnV0aW9uX3BvaW50CQk1MjcKK2NlcnRpZmljYXRlX2lzc3VlcgkJNTI4CituYW1lX2NvbnN0cmFpbnRzCQk1MjkKK2NybF9kaXN0cmlidXRpb25fcG9pbnRzCQk1MzAKK2NlcnRpZmljYXRlX3BvbGljaWVzCQk1MzEKK2FueV9wb2xpY3kJCTUzMgorcG9saWN5X21hcHBpbmdzCQk1MzMKK2F1dGhvcml0eV9rZXlfaWRlbnRpZmllcgkJNTM0Citwb2xpY3lfY29uc3RyYWludHMJCTUzNQorZXh0X2tleV91c2FnZQkJNTM2CitmcmVzaGVzdF9jcmwJCTUzNworaW5oaWJpdF9hbnlfcG9saWN5CQk1MzgKK3RhcmdldF9pbmZvcm1hdGlvbgkJNTM5Citub19yZXZfYXZhaWwJCTU0MAorYW55RXh0ZW5kZWRLZXlVc2FnZQkJNTQxCituZXRzY2FwZQkJNTQyCituZXRzY2FwZV9jZXJ0X2V4dGVuc2lvbgkJNTQzCituZXRzY2FwZV9kYXRhX3R5cGUJCTU0NAorbmV0c2NhcGVfY2VydF90eXBlCQk1NDUKK25ldHNjYXBlX2Jhc2VfdXJsCQk1NDYKK25ldHNjYXBlX3Jldm9jYXRpb25fdXJsCQk1NDcKK25ldHNjYXBlX2NhX3Jldm9jYXRpb25fdXJsCQk1NDgKK25ldHNjYXBlX3JlbmV3YWxfdXJsCQk1NDkKK25ldHNjYXBlX2NhX3BvbGljeV91cmwJCTU1MAorbmV0c2NhcGVfc3NsX3NlcnZlcl9uYW1lCQk1NTEKK25ldHNjYXBlX2NvbW1lbnQJCTU1MgorbmV0c2NhcGVfY2VydF9zZXF1ZW5jZQkJNTUzCituc19zZ2MJCTU1NAorb3JnCQk1NTUKK2RvZAkJNTU2CitpYW5hCQk1NTcKK0RpcmVjdG9yeQkJNTU4CitNYW5hZ2VtZW50CQk1NTkKK0V4cGVyaW1lbnRhbAkJNTYwCitQcml2YXRlCQk1NjEKK1NlY3VyaXR5CQk1NjIKK1NOTVB2MgkJNTYzCitNYWlsCQk1NjQKK0VudGVycHJpc2VzCQk1NjUKK2RjT2JqZWN0CQk1NjYKK21pbWVfbWhzCQk1NjcKK21pbWVfbWhzX2hlYWRpbmdzCQk1NjgKK21pbWVfbWhzX2JvZGllcwkJNTY5CitpZF9oZXhfcGFydGlhbF9tZXNzYWdlCQk1NzAKK2lkX2hleF9tdWx0aXBhcnRfbWVzc2FnZQkJNTcxCitybGVfY29tcHJlc3Npb24JCTU3MgoremxpYl9jb21wcmVzc2lvbgkJNTczCithZXNfMTI4X2VjYgkJNTc0CithZXNfMTI4X2NiYwkJNTc1CithZXNfMTI4X29mYjEyOAkJNTc2CithZXNfMTI4X2NmYjEyOAkJNTc3CitpZF9hZXMxMjhfd3JhcAkJNTc4CithZXNfMTI4X2djbQkJNTc5CithZXNfMTI4X2NjbQkJNTgwCitpZF9hZXMxMjhfd3JhcF9wYWQJCTU4MQorYWVzXzE5Ml9lY2IJCTU4MgorYWVzXzE5Ml9jYmMJCTU4MworYWVzXzE5Ml9vZmIxMjgJCTU4NAorYWVzXzE5Ml9jZmIxMjgJCTU4NQoraWRfYWVzMTkyX3dyYXAJCTU4NgorYWVzXzE5Ml9nY20JCTU4NworYWVzXzE5Ml9jY20JCTU4OAoraWRfYWVzMTkyX3dyYXBfcGFkCQk1ODkKK2Flc18yNTZfZWNiCQk1OTAKK2Flc18yNTZfY2JjCQk1OTEKK2Flc18yNTZfb2ZiMTI4CQk1OTIKK2Flc18yNTZfY2ZiMTI4CQk1OTMKK2lkX2FlczI1Nl93cmFwCQk1OTQKK2Flc18yNTZfZ2NtCQk1OTUKK2Flc18yNTZfY2NtCQk1OTYKK2lkX2FlczI1Nl93cmFwX3BhZAkJNTk3CithZXNfMTI4X2NmYjEJCTU5OAorYWVzXzE5Ml9jZmIxCQk1OTkKK2Flc18yNTZfY2ZiMQkJNjAwCithZXNfMTI4X2NmYjgJCTYwMQorYWVzXzE5Ml9jZmI4CQk2MDIKK2Flc18yNTZfY2ZiOAkJNjAzCithZXNfMTI4X2N0cgkJNjA0CithZXNfMTkyX2N0cgkJNjA1CithZXNfMjU2X2N0cgkJNjA2CithZXNfMTI4X3h0cwkJNjA3CithZXNfMjU2X3h0cwkJNjA4CitkZXNfY2ZiMQkJNjA5CitkZXNfY2ZiOAkJNjEwCitkZXNfZWRlM19jZmIxCQk2MTEKK2Rlc19lZGUzX2NmYjgJCTYxMgorc2hhMjU2CQk2MTMKK3NoYTM4NAkJNjE0CitzaGE1MTIJCTYxNQorc2hhMjI0CQk2MTYKK2RzYV93aXRoX1NIQTIyNAkJNjE3Citkc2Ffd2l0aF9TSEEyNTYJCTYxOAoraG9sZF9pbnN0cnVjdGlvbl9jb2RlCQk2MTkKK2hvbGRfaW5zdHJ1Y3Rpb25fbm9uZQkJNjIwCitob2xkX2luc3RydWN0aW9uX2NhbGxfaXNzdWVyCQk2MjEKK2hvbGRfaW5zdHJ1Y3Rpb25fcmVqZWN0CQk2MjIKK2RhdGEJCTYyMworcHNzCQk2MjQKK3VjbAkJNjI1CitwaWxvdAkJNjI2CitwaWxvdEF0dHJpYnV0ZVR5cGUJCTYyNworcGlsb3RBdHRyaWJ1dGVTeW50YXgJCTYyOAorcGlsb3RPYmplY3RDbGFzcwkJNjI5CitwaWxvdEdyb3VwcwkJNjMwCitpQTVTdHJpbmdTeW50YXgJCTYzMQorY2FzZUlnbm9yZUlBNVN0cmluZ1N5bnRheAkJNjMyCitwaWxvdE9iamVjdAkJNjMzCitwaWxvdFBlcnNvbgkJNjM0CithY2NvdW50CQk2MzUKK2RvY3VtZW50CQk2MzYKK3Jvb20JCTYzNworZG9jdW1lbnRTZXJpZXMJCTYzOAorRG9tYWluCQk2MzkKK3JGQzgyMmxvY2FsUGFydAkJNjQwCitkTlNEb21haW4JCTY0MQorZG9tYWluUmVsYXRlZE9iamVjdAkJNjQyCitmcmllbmRseUNvdW50cnkJCTY0Mworc2ltcGxlU2VjdXJpdHlPYmplY3QJCTY0NAorcGlsb3RPcmdhbml6YXRpb24JCTY0NQorcGlsb3REU0EJCTY0NgorcXVhbGl0eUxhYmVsbGVkRGF0YQkJNjQ3Cit1c2VySWQJCTY0OAordGV4dEVuY29kZWRPUkFkZHJlc3MJCTY0OQorcmZjODIyTWFpbGJveAkJNjUwCitpbmZvCQk2NTEKK2Zhdm91cml0ZURyaW5rCQk2NTIKK3Jvb21OdW1iZXIJCTY1MworcGhvdG8JCTY1NAordXNlckNsYXNzCQk2NTUKK2hvc3QJCTY1NgorbWFuYWdlcgkJNjU3Citkb2N1bWVudElkZW50aWZpZXIJCTY1OAorZG9jdW1lbnRUaXRsZQkJNjU5Citkb2N1bWVudFZlcnNpb24JCTY2MAorZG9jdW1lbnRBdXRob3IJCTY2MQorZG9jdW1lbnRMb2NhdGlvbgkJNjYyCitob21lVGVsZXBob25lTnVtYmVyCQk2NjMKK3NlY3JldGFyeQkJNjY0CitvdGhlck1haWxib3gJCTY2NQorbGFzdE1vZGlmaWVkVGltZQkJNjY2CitsYXN0TW9kaWZpZWRCeQkJNjY3Citkb21haW5Db21wb25lbnQJCTY2OAorYVJlY29yZAkJNjY5CitwaWxvdEF0dHJpYnV0ZVR5cGUyNwkJNjcwCittWFJlY29yZAkJNjcxCituU1JlY29yZAkJNjcyCitzT0FSZWNvcmQJCTY3MworY05BTUVSZWNvcmQJCTY3NAorYXNzb2NpYXRlZERvbWFpbgkJNjc1Cithc3NvY2lhdGVkTmFtZQkJNjc2Citob21lUG9zdGFsQWRkcmVzcwkJNjc3CitwZXJzb25hbFRpdGxlCQk2NzgKK21vYmlsZVRlbGVwaG9uZU51bWJlcgkJNjc5CitwYWdlclRlbGVwaG9uZU51bWJlcgkJNjgwCitmcmllbmRseUNvdW50cnlOYW1lCQk2ODEKK29yZ2FuaXphdGlvbmFsU3RhdHVzCQk2ODIKK2phbmV0TWFpbGJveAkJNjgzCittYWlsUHJlZmVyZW5jZU9wdGlvbgkJNjg0CitidWlsZGluZ05hbWUJCTY4NQorZFNBUXVhbGl0eQkJNjg2CitzaW5nbGVMZXZlbFF1YWxpdHkJCTY4Nworc3VidHJlZU1pbmltdW1RdWFsaXR5CQk2ODgKK3N1YnRyZWVNYXhpbXVtUXVhbGl0eQkJNjg5CitwZXJzb25hbFNpZ25hdHVyZQkJNjkwCitkSVRSZWRpcmVjdAkJNjkxCithdWRpbwkJNjkyCitkb2N1bWVudFB1Ymxpc2hlcgkJNjkzCitpZF9zZXQJCTY5NAorc2V0X2N0eXBlCQk2OTUKK3NldF9tc2dFeHQJCTY5Ngorc2V0X2F0dHIJCTY5Nworc2V0X3BvbGljeQkJNjk4CitzZXRfY2VydEV4dAkJNjk5CitzZXRfYnJhbmQJCTcwMAorc2V0Y3RfUEFORGF0YQkJNzAxCitzZXRjdF9QQU5Ub2tlbgkJNzAyCitzZXRjdF9QQU5Pbmx5CQk3MDMKK3NldGN0X09JRGF0YQkJNzA0CitzZXRjdF9QSQkJNzA1CitzZXRjdF9QSURhdGEJCTcwNgorc2V0Y3RfUElEYXRhVW5zaWduZWQJCTcwNworc2V0Y3RfSE9ESW5wdXQJCTcwOAorc2V0Y3RfQXV0aFJlc0JhZ2dhZ2UJCTcwOQorc2V0Y3RfQXV0aFJldlJlcUJhZ2dhZ2UJCTcxMAorc2V0Y3RfQXV0aFJldlJlc0JhZ2dhZ2UJCTcxMQorc2V0Y3RfQ2FwVG9rZW5TZXEJCTcxMgorc2V0Y3RfUEluaXRSZXNEYXRhCQk3MTMKK3NldGN0X1BJX1RCUwkJNzE0CitzZXRjdF9QUmVzRGF0YQkJNzE1CitzZXRjdF9BdXRoUmVxVEJTCQk3MTYKK3NldGN0X0F1dGhSZXNUQlMJCTcxNworc2V0Y3RfQXV0aFJlc1RCU1gJCTcxOAorc2V0Y3RfQXV0aFRva2VuVEJTCQk3MTkKK3NldGN0X0NhcFRva2VuRGF0YQkJNzIwCitzZXRjdF9DYXBUb2tlblRCUwkJNzIxCitzZXRjdF9BY3FDYXJkQ29kZU1zZwkJNzIyCitzZXRjdF9BdXRoUmV2UmVxVEJTCQk3MjMKK3NldGN0X0F1dGhSZXZSZXNEYXRhCQk3MjQKK3NldGN0X0F1dGhSZXZSZXNUQlMJCTcyNQorc2V0Y3RfQ2FwUmVxVEJTCQk3MjYKK3NldGN0X0NhcFJlcVRCU1gJCTcyNworc2V0Y3RfQ2FwUmVzRGF0YQkJNzI4CitzZXRjdF9DYXBSZXZSZXFUQlMJCTcyOQorc2V0Y3RfQ2FwUmV2UmVxVEJTWAkJNzMwCitzZXRjdF9DYXBSZXZSZXNEYXRhCQk3MzEKK3NldGN0X0NyZWRSZXFUQlMJCTczMgorc2V0Y3RfQ3JlZFJlcVRCU1gJCTczMworc2V0Y3RfQ3JlZFJlc0RhdGEJCTczNAorc2V0Y3RfQ3JlZFJldlJlcVRCUwkJNzM1CitzZXRjdF9DcmVkUmV2UmVxVEJTWAkJNzM2CitzZXRjdF9DcmVkUmV2UmVzRGF0YQkJNzM3CitzZXRjdF9QQ2VydFJlcURhdGEJCTczOAorc2V0Y3RfUENlcnRSZXNUQlMJCTczOQorc2V0Y3RfQmF0Y2hBZG1pblJlcURhdGEJCTc0MAorc2V0Y3RfQmF0Y2hBZG1pblJlc0RhdGEJCTc0MQorc2V0Y3RfQ2FyZENJbml0UmVzVEJTCQk3NDIKK3NldGN0X01lQXFDSW5pdFJlc1RCUwkJNzQzCitzZXRjdF9SZWdGb3JtUmVzVEJTCQk3NDQKK3NldGN0X0NlcnRSZXFEYXRhCQk3NDUKK3NldGN0X0NlcnRSZXFUQlMJCTc0Ngorc2V0Y3RfQ2VydFJlc0RhdGEJCTc0Nworc2V0Y3RfQ2VydElucVJlcVRCUwkJNzQ4CitzZXRjdF9FcnJvclRCUwkJNzQ5CitzZXRjdF9QSUR1YWxTaWduZWRUQkUJCTc1MAorc2V0Y3RfUElVbnNpZ25lZFRCRQkJNzUxCitzZXRjdF9BdXRoUmVxVEJFCQk3NTIKK3NldGN0X0F1dGhSZXNUQkUJCTc1Mworc2V0Y3RfQXV0aFJlc1RCRVgJCTc1NAorc2V0Y3RfQXV0aFRva2VuVEJFCQk3NTUKK3NldGN0X0NhcFRva2VuVEJFCQk3NTYKK3NldGN0X0NhcFRva2VuVEJFWAkJNzU3CitzZXRjdF9BY3FDYXJkQ29kZU1zZ1RCRQkJNzU4CitzZXRjdF9BdXRoUmV2UmVxVEJFCQk3NTkKK3NldGN0X0F1dGhSZXZSZXNUQkUJCTc2MAorc2V0Y3RfQXV0aFJldlJlc1RCRUIJCTc2MQorc2V0Y3RfQ2FwUmVxVEJFCQk3NjIKK3NldGN0X0NhcFJlcVRCRVgJCTc2Mworc2V0Y3RfQ2FwUmVzVEJFCQk3NjQKK3NldGN0X0NhcFJldlJlcVRCRQkJNzY1CitzZXRjdF9DYXBSZXZSZXFUQkVYCQk3NjYKK3NldGN0X0NhcFJldlJlc1RCRQkJNzY3CitzZXRjdF9DcmVkUmVxVEJFCQk3NjgKK3NldGN0X0NyZWRSZXFUQkVYCQk3NjkKK3NldGN0X0NyZWRSZXNUQkUJCTc3MAorc2V0Y3RfQ3JlZFJldlJlcVRCRQkJNzcxCitzZXRjdF9DcmVkUmV2UmVxVEJFWAkJNzcyCitzZXRjdF9DcmVkUmV2UmVzVEJFCQk3NzMKK3NldGN0X0JhdGNoQWRtaW5SZXFUQkUJCTc3NAorc2V0Y3RfQmF0Y2hBZG1pblJlc1RCRQkJNzc1CitzZXRjdF9SZWdGb3JtUmVxVEJFCQk3NzYKK3NldGN0X0NlcnRSZXFUQkUJCTc3Nworc2V0Y3RfQ2VydFJlcVRCRVgJCTc3OAorc2V0Y3RfQ2VydFJlc1RCRQkJNzc5CitzZXRjdF9DUkxOb3RpZmljYXRpb25UQlMJCTc4MAorc2V0Y3RfQ1JMTm90aWZpY2F0aW9uUmVzVEJTCQk3ODEKK3NldGN0X0JDSURpc3RyaWJ1dGlvblRCUwkJNzgyCitzZXRleHRfZ2VuQ3J5cHQJCTc4Mworc2V0ZXh0X21pQXV0aAkJNzg0CitzZXRleHRfcGluU2VjdXJlCQk3ODUKK3NldGV4dF9waW5BbnkJCTc4Ngorc2V0ZXh0X3RyYWNrMgkJNzg3CitzZXRleHRfY3YJCTc4OAorc2V0X3BvbGljeV9yb290CQk3ODkKK3NldENleHRfaGFzaGVkUm9vdAkJNzkwCitzZXRDZXh0X2NlcnRUeXBlCQk3OTEKK3NldENleHRfbWVyY2hEYXRhCQk3OTIKK3NldENleHRfY0NlcnRSZXF1aXJlZAkJNzkzCitzZXRDZXh0X3R1bm5lbGluZwkJNzk0CitzZXRDZXh0X3NldEV4dAkJNzk1CitzZXRDZXh0X3NldFF1YWxmCQk3OTYKK3NldENleHRfUEdXWWNhcGFiaWxpdGllcwkJNzk3CitzZXRDZXh0X1Rva2VuSWRlbnRpZmllcgkJNzk4CitzZXRDZXh0X1RyYWNrMkRhdGEJCTc5OQorc2V0Q2V4dF9Ub2tlblR5cGUJCTgwMAorc2V0Q2V4dF9Jc3N1ZXJDYXBhYmlsaXRpZXMJCTgwMQorc2V0QXR0cl9DZXJ0CQk4MDIKK3NldEF0dHJfUEdXWWNhcAkJODAzCitzZXRBdHRyX1Rva2VuVHlwZQkJODA0CitzZXRBdHRyX0lzc0NhcAkJODA1CitzZXRfcm9vdEtleVRodW1iCQk4MDYKK3NldF9hZGRQb2xpY3kJCTgwNworc2V0QXR0cl9Ub2tlbl9FTVYJCTgwOAorc2V0QXR0cl9Ub2tlbl9CMFByaW1lCQk4MDkKK3NldEF0dHJfSXNzQ2FwX0NWTQkJODEwCitzZXRBdHRyX0lzc0NhcF9UMgkJODExCitzZXRBdHRyX0lzc0NhcF9TaWcJCTgxMgorc2V0QXR0cl9HZW5DcnlwdGdybQkJODEzCitzZXRBdHRyX1QyRW5jCQk4MTQKK3NldEF0dHJfVDJjbGVhcnR4dAkJODE1CitzZXRBdHRyX1Rva0lDQ3NpZwkJODE2CitzZXRBdHRyX1NlY0RldlNpZwkJODE3CitzZXRfYnJhbmRfSUFUQV9BVEEJCTgxOAorc2V0X2JyYW5kX0RpbmVycwkJODE5CitzZXRfYnJhbmRfQW1lcmljYW5FeHByZXNzCQk4MjAKK3NldF9icmFuZF9KQ0IJCTgyMQorc2V0X2JyYW5kX1Zpc2EJCTgyMgorc2V0X2JyYW5kX01hc3RlckNhcmQJCTgyMworc2V0X2JyYW5kX05vdnVzCQk4MjQKK2Rlc19jZG1mCQk4MjUKK3JzYU9BRVBFbmNyeXB0aW9uU0VUCQk4MjYKK2lwc2VjMwkJODI3CitpcHNlYzQJCTgyOAord2hpcmxwb29sCQk4MjkKK2NyeXB0b3BybwkJODMwCitjcnlwdG9jb20JCTgzMQoraWRfR29zdFIzNDExXzk0X3dpdGhfR29zdFIzNDEwXzIwMDEJCTgzMgoraWRfR29zdFIzNDExXzk0X3dpdGhfR29zdFIzNDEwXzk0CQk4MzMKK2lkX0dvc3RSMzQxMV85NAkJODM0CitpZF9ITUFDR29zdFIzNDExXzk0CQk4MzUKK2lkX0dvc3RSMzQxMF8yMDAxCQk4MzYKK2lkX0dvc3RSMzQxMF85NAkJODM3CitpZF9Hb3N0MjgxNDdfODkJCTgzOAorZ29zdDg5X2NudAkJODM5CitpZF9Hb3N0MjgxNDdfODlfTUFDCQk4NDAKK2lkX0dvc3RSMzQxMV85NF9wcmYJCTg0MQoraWRfR29zdFIzNDEwXzIwMDFESAkJODQyCitpZF9Hb3N0UjM0MTBfOTRESAkJODQzCitpZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX0tleU1lc2hpbmcJCTg0NAoraWRfR29zdDI4MTQ3Xzg5X05vbmVfS2V5TWVzaGluZwkJODQ1CitpZF9Hb3N0UjM0MTFfOTRfVGVzdFBhcmFtU2V0CQk4NDYKK2lkX0dvc3RSMzQxMV85NF9DcnlwdG9Qcm9QYXJhbVNldAkJODQ3CitpZF9Hb3N0MjgxNDdfODlfVGVzdFBhcmFtU2V0CQk4NDgKK2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fQV9QYXJhbVNldAkJODQ5CitpZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX0JfUGFyYW1TZXQJCTg1MAoraWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19DX1BhcmFtU2V0CQk4NTEKK2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fRF9QYXJhbVNldAkJODUyCitpZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX09zY2FyXzFfMV9QYXJhbVNldAkJODUzCitpZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX09zY2FyXzFfMF9QYXJhbVNldAkJODU0CitpZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX1JJQ18xX1BhcmFtU2V0CQk4NTUKK2lkX0dvc3RSMzQxMF85NF9UZXN0UGFyYW1TZXQJCTg1NgoraWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19BX1BhcmFtU2V0CQk4NTcKK2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fQl9QYXJhbVNldAkJODU4CitpZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX0NfUGFyYW1TZXQJCTg1OQoraWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19EX1BhcmFtU2V0CQk4NjAKK2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fWGNoQV9QYXJhbVNldAkJODYxCitpZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX1hjaEJfUGFyYW1TZXQJCTg2MgoraWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19YY2hDX1BhcmFtU2V0CQk4NjMKK2lkX0dvc3RSMzQxMF8yMDAxX1Rlc3RQYXJhbVNldAkJODY0CitpZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fQV9QYXJhbVNldAkJODY1CitpZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fQl9QYXJhbVNldAkJODY2CitpZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fQ19QYXJhbVNldAkJODY3CitpZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fWGNoQV9QYXJhbVNldAkJODY4CitpZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fWGNoQl9QYXJhbVNldAkJODY5CitpZF9Hb3N0UjM0MTBfOTRfYQkJODcwCitpZF9Hb3N0UjM0MTBfOTRfYUJpcwkJODcxCitpZF9Hb3N0UjM0MTBfOTRfYgkJODcyCitpZF9Hb3N0UjM0MTBfOTRfYkJpcwkJODczCitpZF9Hb3N0MjgxNDdfODlfY2MJCTg3NAoraWRfR29zdFIzNDEwXzk0X2NjCQk4NzUKK2lkX0dvc3RSMzQxMF8yMDAxX2NjCQk4NzYKK2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF85NF9jYwkJODc3CitpZF9Hb3N0UjM0MTFfOTRfd2l0aF9Hb3N0UjM0MTBfMjAwMV9jYwkJODc4CitpZF9Hb3N0UjM0MTBfMjAwMV9QYXJhbVNldF9jYwkJODc5CitjYW1lbGxpYV8xMjhfY2JjCQk4ODAKK2NhbWVsbGlhXzE5Ml9jYmMJCTg4MQorY2FtZWxsaWFfMjU2X2NiYwkJODgyCitpZF9jYW1lbGxpYTEyOF93cmFwCQk4ODMKK2lkX2NhbWVsbGlhMTkyX3dyYXAJCTg4NAoraWRfY2FtZWxsaWEyNTZfd3JhcAkJODg1CitjYW1lbGxpYV8xMjhfZWNiCQk4ODYKK2NhbWVsbGlhXzEyOF9vZmIxMjgJCTg4NworY2FtZWxsaWFfMTI4X2NmYjEyOAkJODg4CitjYW1lbGxpYV8xOTJfZWNiCQk4ODkKK2NhbWVsbGlhXzE5Ml9vZmIxMjgJCTg5MAorY2FtZWxsaWFfMTkyX2NmYjEyOAkJODkxCitjYW1lbGxpYV8yNTZfZWNiCQk4OTIKK2NhbWVsbGlhXzI1Nl9vZmIxMjgJCTg5MworY2FtZWxsaWFfMjU2X2NmYjEyOAkJODk0CitjYW1lbGxpYV8xMjhfY2ZiMQkJODk1CitjYW1lbGxpYV8xOTJfY2ZiMQkJODk2CitjYW1lbGxpYV8yNTZfY2ZiMQkJODk3CitjYW1lbGxpYV8xMjhfY2ZiOAkJODk4CitjYW1lbGxpYV8xOTJfY2ZiOAkJODk5CitjYW1lbGxpYV8yNTZfY2ZiOAkJOTAwCitraXNhCQk5MDEKK3NlZWRfZWNiCQk5MDIKK3NlZWRfY2JjCQk5MDMKK3NlZWRfY2ZiMTI4CQk5MDQKK3NlZWRfb2ZiMTI4CQk5MDUKK2htYWMJCTkwNgorY21hYwkJOTA3CityYzRfaG1hY19tZDUJCTkwOAorYWVzXzEyOF9jYmNfaG1hY19zaGExCQk5MDkKK2Flc18xOTJfY2JjX2htYWNfc2hhMQkJOTEwCithZXNfMjU2X2NiY19obWFjX3NoYTEJCTkxMQorZGhwdWJsaWNudW1iZXIJCTkxMgorYnJhaW5wb29sUDE2MHIxCQk5MTMKK2JyYWlucG9vbFAxNjB0MQkJOTE0CiticmFpbnBvb2xQMTkycjEJCTkxNQorYnJhaW5wb29sUDE5MnQxCQk5MTYKK2JyYWlucG9vbFAyMjRyMQkJOTE3CiticmFpbnBvb2xQMjI0dDEJCTkxOAorYnJhaW5wb29sUDI1NnIxCQk5MTkKK2JyYWlucG9vbFAyNTZ0MQkJOTIwCiticmFpbnBvb2xQMzIwcjEJCTkyMQorYnJhaW5wb29sUDMyMHQxCQk5MjIKK2JyYWlucG9vbFAzODRyMQkJOTIzCiticmFpbnBvb2xQMzg0dDEJCTkyNAorYnJhaW5wb29sUDUxMnIxCQk5MjUKK2JyYWlucG9vbFA1MTJ0MQkJOTI2CitkaFNpbmdsZVBhc3Nfc3RkREhfc2hhMWtkZl9zY2hlbWUJCTkyNworZGhTaW5nbGVQYXNzX3N0ZERIX3NoYTIyNGtkZl9zY2hlbWUJCTkyOAorZGhTaW5nbGVQYXNzX3N0ZERIX3NoYTI1NmtkZl9zY2hlbWUJCTkyOQorZGhTaW5nbGVQYXNzX3N0ZERIX3NoYTM4NGtkZl9zY2hlbWUJCTkzMAorZGhTaW5nbGVQYXNzX3N0ZERIX3NoYTUxMmtkZl9zY2hlbWUJCTkzMQorZGhTaW5nbGVQYXNzX2NvZmFjdG9yREhfc2hhMWtkZl9zY2hlbWUJCTkzMgorZGhTaW5nbGVQYXNzX2NvZmFjdG9yREhfc2hhMjI0a2RmX3NjaGVtZQkJOTMzCitkaFNpbmdsZVBhc3NfY29mYWN0b3JESF9zaGEyNTZrZGZfc2NoZW1lCQk5MzQKK2RoU2luZ2xlUGFzc19jb2ZhY3RvckRIX3NoYTM4NGtkZl9zY2hlbWUJCTkzNQorZGhTaW5nbGVQYXNzX2NvZmFjdG9yREhfc2hhNTEya2RmX3NjaGVtZQkJOTM2CitkaF9zdGRfa2RmCQk5MzcKK2RoX2NvZmFjdG9yX2tkZgkJOTM4CmRpZmYgLS1naXQgYS9jcnlwdG8vb2JqL29ial94cmVmLmMgYi9jcnlwdG8vb2JqL29ial94cmVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBiYWJlYQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9vYmovb2JqX3hyZWYuYwpAQCAtMCwwICsxLDEyNCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvb2JqLmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgIm9ial94cmVmLmgiCisKKworc3RhdGljIGludCBuaWRfdHJpcGxlX2NtcF9ieV9zaWduX2lkKGNvbnN0IHZvaWQgKmluX2EsIGNvbnN0IHZvaWQgKmluX2IpIHsKKyAgY29uc3QgbmlkX3RyaXBsZSAqYSA9IGluX2E7CisgIGNvbnN0IG5pZF90cmlwbGUgKmIgPSBpbl9iOworCisgIHJldHVybiBhLT5zaWduX2lkIC0gYi0+c2lnbl9pZDsKK30KKworaW50IE9CSl9maW5kX3NpZ2lkX2FsZ3MoaW50IHNpZ25fbmlkLCBpbnQgKm91dF9kaWdlc3RfbmlkLCBpbnQgKm91dF9wa2V5X25pZCkgeworICBuaWRfdHJpcGxlIGtleTsKKyAgY29uc3QgbmlkX3RyaXBsZSAqdHJpcGxlOworCisgIGtleS5zaWduX2lkID0gc2lnbl9uaWQ7CisKKyAgdHJpcGxlID0gYnNlYXJjaCgma2V5LCBzaWdvaWRfc3J0LCBzaXplb2Yoc2lnb2lkX3NydCkgLyBzaXplb2YobmlkX3RyaXBsZSksCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5pZF90cmlwbGUpLCBuaWRfdHJpcGxlX2NtcF9ieV9zaWduX2lkKTsKKworICBpZiAodHJpcGxlID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAob3V0X2RpZ2VzdF9uaWQpIHsKKyAgICAqb3V0X2RpZ2VzdF9uaWQgPSB0cmlwbGUtPmhhc2hfaWQ7CisgIH0KKyAgaWYgKG91dF9wa2V5X25pZCkgeworICAgICpvdXRfcGtleV9uaWQgPSB0cmlwbGUtPnBrZXlfaWQ7CisgIH0KKworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBuaWRfdHJpcGxlX2NtcF9ieV9kaWdlc3RfYW5kX2hhc2goY29uc3Qgdm9pZCAqaW5fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmluX2IpIHsKKyAgY29uc3QgbmlkX3RyaXBsZSAqYSA9ICooKG5pZF90cmlwbGUqKikgaW5fYSk7CisgIGNvbnN0IG5pZF90cmlwbGUgKmIgPSAqKChuaWRfdHJpcGxlKiopIGluX2IpOworCisgIGludCByZXQgPSBhLT5oYXNoX2lkIC0gYi0+aGFzaF9pZDsKKyAgaWYgKHJldCkgeworICAgIHJldHVybiByZXQ7CisgIH0KKyAgcmV0dXJuIGEtPnBrZXlfaWQgLSBiLT5wa2V5X2lkOworfQorCitpbnQgT0JKX2ZpbmRfc2lnaWRfYnlfYWxncyhpbnQgKm91dF9zaWduX25pZCwgaW50IGRpZ2VzdF9uaWQsIGludCBwa2V5X25pZCkgeworICBuaWRfdHJpcGxlIGtleSwgKnBrZXk7CisgIGNvbnN0IG5pZF90cmlwbGUgKip0cmlwbGU7CisKKyAga2V5Lmhhc2hfaWQgPSBkaWdlc3RfbmlkOworICBrZXkucGtleV9pZCA9IHBrZXlfbmlkOworICBwa2V5ID0gJmtleTsKKworICB0cmlwbGUgPSBic2VhcmNoKCZwa2V5LCBzaWdvaWRfc3J0X3hyZWYsCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNpZ29pZF9zcnRfeHJlZikgLyBzaXplb2YobmlkX3RyaXBsZSAqKSwKKyAgICAgICAgICAgICAgICAgICBzaXplb2YobmlkX3RyaXBsZSAqKSwgbmlkX3RyaXBsZV9jbXBfYnlfZGlnZXN0X2FuZF9oYXNoKTsKKworICBpZiAodHJpcGxlID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAob3V0X3NpZ25fbmlkKSB7CisgICAgKm91dF9zaWduX25pZCA9ICgqdHJpcGxlKS0+c2lnbl9pZDsKKyAgfQorICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2NyeXB0by9vYmovb2JqX3hyZWYuaCBiL2NyeXB0by9vYmovb2JqX3hyZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmQ2MjhhCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL29iai9vYmpfeHJlZi5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qIEFVVE9HRU5FUkFURUQgQlkgb2JqeHJlZi5wbCwgRE8gTk9UIEVESVQgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJaW50IHNpZ25faWQ7CisJaW50IGhhc2hfaWQ7CisJaW50IHBrZXlfaWQ7CisJfSBuaWRfdHJpcGxlOworCitzdGF0aWMgY29uc3QgbmlkX3RyaXBsZSBzaWdvaWRfc3J0W10gPQorCXsKKwl7TklEX21kMldpdGhSU0FFbmNyeXB0aW9uLCBOSURfbWQyLCBOSURfcnNhRW5jcnlwdGlvbn0sCisJe05JRF9tZDVXaXRoUlNBRW5jcnlwdGlvbiwgTklEX21kNSwgTklEX3JzYUVuY3J5cHRpb259LAorCXtOSURfc2hhV2l0aFJTQUVuY3J5cHRpb24sIE5JRF9zaGEsIE5JRF9yc2FFbmNyeXB0aW9ufSwKKwl7TklEX3NoYTFXaXRoUlNBRW5jcnlwdGlvbiwgTklEX3NoYTEsIE5JRF9yc2FFbmNyeXB0aW9ufSwKKwl7TklEX2RzYVdpdGhTSEEsIE5JRF9zaGEsIE5JRF9kc2F9LAorCXtOSURfZHNhV2l0aFNIQTFfMiwgTklEX3NoYTEsIE5JRF9kc2FfMn0sCisJe05JRF9tZGMyV2l0aFJTQSwgTklEX21kYzIsIE5JRF9yc2FFbmNyeXB0aW9ufSwKKwl7TklEX21kNVdpdGhSU0EsIE5JRF9tZDUsIE5JRF9yc2F9LAorCXtOSURfZHNhV2l0aFNIQTEsIE5JRF9zaGExLCBOSURfZHNhfSwKKwl7TklEX3NoYTFXaXRoUlNBLCBOSURfc2hhMSwgTklEX3JzYX0sCisJe05JRF9yaXBlbWQxNjBXaXRoUlNBLCBOSURfcmlwZW1kMTYwLCBOSURfcnNhRW5jcnlwdGlvbn0sCisJe05JRF9tZDRXaXRoUlNBRW5jcnlwdGlvbiwgTklEX21kNCwgTklEX3JzYUVuY3J5cHRpb259LAorCXtOSURfZWNkc2Ffd2l0aF9TSEExLCBOSURfc2hhMSwgTklEX1g5XzYyX2lkX2VjUHVibGljS2V5fSwKKwl7TklEX3NoYTI1NldpdGhSU0FFbmNyeXB0aW9uLCBOSURfc2hhMjU2LCBOSURfcnNhRW5jcnlwdGlvbn0sCisJe05JRF9zaGEzODRXaXRoUlNBRW5jcnlwdGlvbiwgTklEX3NoYTM4NCwgTklEX3JzYUVuY3J5cHRpb259LAorCXtOSURfc2hhNTEyV2l0aFJTQUVuY3J5cHRpb24sIE5JRF9zaGE1MTIsIE5JRF9yc2FFbmNyeXB0aW9ufSwKKwl7TklEX3NoYTIyNFdpdGhSU0FFbmNyeXB0aW9uLCBOSURfc2hhMjI0LCBOSURfcnNhRW5jcnlwdGlvbn0sCisJe05JRF9lY2RzYV93aXRoX1JlY29tbWVuZGVkLCBOSURfdW5kZWYsIE5JRF9YOV82Ml9pZF9lY1B1YmxpY0tleX0sCisJe05JRF9lY2RzYV93aXRoX1NwZWNpZmllZCwgTklEX3VuZGVmLCBOSURfWDlfNjJfaWRfZWNQdWJsaWNLZXl9LAorCXtOSURfZWNkc2Ffd2l0aF9TSEEyMjQsIE5JRF9zaGEyMjQsIE5JRF9YOV82Ml9pZF9lY1B1YmxpY0tleX0sCisJe05JRF9lY2RzYV93aXRoX1NIQTI1NiwgTklEX3NoYTI1NiwgTklEX1g5XzYyX2lkX2VjUHVibGljS2V5fSwKKwl7TklEX2VjZHNhX3dpdGhfU0hBMzg0LCBOSURfc2hhMzg0LCBOSURfWDlfNjJfaWRfZWNQdWJsaWNLZXl9LAorCXtOSURfZWNkc2Ffd2l0aF9TSEE1MTIsIE5JRF9zaGE1MTIsIE5JRF9YOV82Ml9pZF9lY1B1YmxpY0tleX0sCisJe05JRF9kc2Ffd2l0aF9TSEEyMjQsIE5JRF9zaGEyMjQsIE5JRF9kc2F9LAorCXtOSURfZHNhX3dpdGhfU0hBMjU2LCBOSURfc2hhMjU2LCBOSURfZHNhfSwKKwl7TklEX2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF8yMDAxLCBOSURfaWRfR29zdFIzNDExXzk0LCBOSURfaWRfR29zdFIzNDEwXzIwMDF9LAorCXtOSURfaWRfR29zdFIzNDExXzk0X3dpdGhfR29zdFIzNDEwXzk0LCBOSURfaWRfR29zdFIzNDExXzk0LCBOSURfaWRfR29zdFIzNDEwXzk0fSwKKwl7TklEX2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF85NF9jYywgTklEX2lkX0dvc3RSMzQxMV85NCwgTklEX2lkX0dvc3RSMzQxMF85NF9jY30sCisJe05JRF9pZF9Hb3N0UjM0MTFfOTRfd2l0aF9Hb3N0UjM0MTBfMjAwMV9jYywgTklEX2lkX0dvc3RSMzQxMV85NCwgTklEX2lkX0dvc3RSMzQxMF8yMDAxX2NjfSwKKwl7TklEX3JzYXNzYVBzcywgTklEX3VuZGVmLCBOSURfcnNhRW5jcnlwdGlvbn0sCisJe05JRF9kaFNpbmdsZVBhc3Nfc3RkREhfc2hhMWtkZl9zY2hlbWUsIE5JRF9zaGExLCBOSURfZGhfc3RkX2tkZn0sCisJe05JRF9kaFNpbmdsZVBhc3Nfc3RkREhfc2hhMjI0a2RmX3NjaGVtZSwgTklEX3NoYTIyNCwgTklEX2RoX3N0ZF9rZGZ9LAorCXtOSURfZGhTaW5nbGVQYXNzX3N0ZERIX3NoYTI1NmtkZl9zY2hlbWUsIE5JRF9zaGEyNTYsIE5JRF9kaF9zdGRfa2RmfSwKKwl7TklEX2RoU2luZ2xlUGFzc19zdGRESF9zaGEzODRrZGZfc2NoZW1lLCBOSURfc2hhMzg0LCBOSURfZGhfc3RkX2tkZn0sCisJe05JRF9kaFNpbmdsZVBhc3Nfc3RkREhfc2hhNTEya2RmX3NjaGVtZSwgTklEX3NoYTUxMiwgTklEX2RoX3N0ZF9rZGZ9LAorCXtOSURfZGhTaW5nbGVQYXNzX2NvZmFjdG9yREhfc2hhMWtkZl9zY2hlbWUsIE5JRF9zaGExLCBOSURfZGhfY29mYWN0b3Jfa2RmfSwKKwl7TklEX2RoU2luZ2xlUGFzc19jb2ZhY3RvckRIX3NoYTIyNGtkZl9zY2hlbWUsIE5JRF9zaGEyMjQsIE5JRF9kaF9jb2ZhY3Rvcl9rZGZ9LAorCXtOSURfZGhTaW5nbGVQYXNzX2NvZmFjdG9yREhfc2hhMjU2a2RmX3NjaGVtZSwgTklEX3NoYTI1NiwgTklEX2RoX2NvZmFjdG9yX2tkZn0sCisJe05JRF9kaFNpbmdsZVBhc3NfY29mYWN0b3JESF9zaGEzODRrZGZfc2NoZW1lLCBOSURfc2hhMzg0LCBOSURfZGhfY29mYWN0b3Jfa2RmfSwKKwl7TklEX2RoU2luZ2xlUGFzc19jb2ZhY3RvckRIX3NoYTUxMmtkZl9zY2hlbWUsIE5JRF9zaGE1MTIsIE5JRF9kaF9jb2ZhY3Rvcl9rZGZ9LAorCX07CisKK3N0YXRpYyBjb25zdCBuaWRfdHJpcGxlICogY29uc3Qgc2lnb2lkX3NydF94cmVmW10gPQorCXsKKwkmc2lnb2lkX3NydFsyOV0sCisJJnNpZ29pZF9zcnRbMTddLAorCSZzaWdvaWRfc3J0WzE4XSwKKwkmc2lnb2lkX3NydFswXSwKKwkmc2lnb2lkX3NydFsxXSwKKwkmc2lnb2lkX3NydFs3XSwKKwkmc2lnb2lkX3NydFsyXSwKKwkmc2lnb2lkX3NydFs0XSwKKwkmc2lnb2lkX3NydFszXSwKKwkmc2lnb2lkX3NydFs5XSwKKwkmc2lnb2lkX3NydFs1XSwKKwkmc2lnb2lkX3NydFs4XSwKKwkmc2lnb2lkX3NydFsxMl0sCisJJnNpZ29pZF9zcnRbMzBdLAorCSZzaWdvaWRfc3J0WzM1XSwKKwkmc2lnb2lkX3NydFs2XSwKKwkmc2lnb2lkX3NydFsxMF0sCisJJnNpZ29pZF9zcnRbMTFdLAorCSZzaWdvaWRfc3J0WzEzXSwKKwkmc2lnb2lkX3NydFsyNF0sCisJJnNpZ29pZF9zcnRbMjBdLAorCSZzaWdvaWRfc3J0WzMyXSwKKwkmc2lnb2lkX3NydFszN10sCisJJnNpZ29pZF9zcnRbMTRdLAorCSZzaWdvaWRfc3J0WzIxXSwKKwkmc2lnb2lkX3NydFszM10sCisJJnNpZ29pZF9zcnRbMzhdLAorCSZzaWdvaWRfc3J0WzE1XSwKKwkmc2lnb2lkX3NydFsyMl0sCisJJnNpZ29pZF9zcnRbMzRdLAorCSZzaWdvaWRfc3J0WzM5XSwKKwkmc2lnb2lkX3NydFsxNl0sCisJJnNpZ29pZF9zcnRbMjNdLAorCSZzaWdvaWRfc3J0WzE5XSwKKwkmc2lnb2lkX3NydFszMV0sCisJJnNpZ29pZF9zcnRbMzZdLAorCSZzaWdvaWRfc3J0WzI1XSwKKwkmc2lnb2lkX3NydFsyNl0sCisJJnNpZ29pZF9zcnRbMjddLAorCSZzaWdvaWRfc3J0WzI4XSwKKwl9OworCmRpZmYgLS1naXQgYS9jcnlwdG8vb2JqL29ial94cmVmLnBsIGIvY3J5cHRvL29iai9vYmpfeHJlZi5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzFkM2FlCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL29iai9vYmpfeHJlZi5wbApAQCAtMCwwICsxLDEwNyBAQAorIyEvdXNyL2xvY2FsL2Jpbi9wZXJsCisKK3VzZSBzdHJpY3Q7CisKK215ICV4cmVmX3RibDsKK215ICVvaWRfdGJsOworCitteSAoJG1hY19maWxlLCAkeHJlZl9maWxlKSA9IEBBUkdWOworCitvcGVuKElOLCAkbWFjX2ZpbGUpIHx8IGRpZSAiQ2FuJ3Qgb3BlbiAkbWFjX2ZpbGUiOworCisjIFJlYWQgaW4gT0lEIG5pZCB2YWx1ZXMgZm9yIGEgbG9va3VwIHRhYmxlLgorCit3aGlsZSAoPElOPikKKwl7CisJY2hvbXA7CisJbXkgKCRuYW1lLCAkbnVtKSA9IC9eKFxTKylccysoXFMrKSQvOworCSRvaWRfdGJseyRuYW1lfSA9ICRudW07CisJfQorY2xvc2UgSU47CisKK29wZW4oSU4sICR4cmVmX2ZpbGUpIHx8IGRpZSAiQ2FuJ3Qgb3BlbiAkeHJlZl9maWxlIjsKKworbXkgJGxuID0gMTsKKword2hpbGUgKDxJTj4pCisJeworCWNob21wOworCXMvIy4qJC8vOworCW5leHQgaWYgKC9eXFMqJC8pOworCW15ICgkeHIsICRwMSwgJHAyKSA9IC9eKFxTKylccysoXFMrKVxzKyhcUyspLzsKKwljaGVja19vaWQoJHhyKTsKKwljaGVja19vaWQoJHAxKTsKKwljaGVja19vaWQoJHAyKTsKKwkkeHJlZl90Ymx7JHhyfSA9IFskcDEsICRwMiwgJGxuXTsKKwl9CisKK215IEB4cmtleXMgPSBrZXlzICV4cmVmX3RibDsKKworbXkgQHNydDEgPSBzb3J0IHsgJG9pZF90Ymx7JGF9IDw9PiAkb2lkX3RibHskYn19IEB4cmtleXM7CisKK2ZvcihteSAkaSA9IDA7ICRpIDw9ICQjc3J0MTsgJGkrKykKKwl7CisJJHhyZWZfdGJseyRzcnQxWyRpXX1bMl0gPSAkaTsKKwl9CisKK215IEBzcnQyID0gc29ydAorCXsKKwlteSRhcDEgPSAkb2lkX3RibHskeHJlZl90Ymx7JGF9WzBdfTsKKwlteSRicDEgPSAkb2lkX3RibHskeHJlZl90Ymx7JGJ9WzBdfTsKKwlyZXR1cm4gJGFwMSAtICRicDEgaWYgKCRhcDEgIT0gJGJwMSk7CisJbXkkYXAyID0gJG9pZF90Ymx7JHhyZWZfdGJseyRhfVsxXX07CisJbXkkYnAyID0gJG9pZF90Ymx7JHhyZWZfdGJseyRifVsxXX07CisKKwlyZXR1cm4gJGFwMiAtICRicDI7CisJfSBAeHJrZXlzOworCitteSAkcG5hbWUgPSAkMDsKKworJHBuYW1lID1+IHN8Xi5bXi9dL3x8OworCitwcmludCA8PEVPRjsKKy8qIEFVVE9HRU5FUkFURUQgQlkgJHBuYW1lLCBETyBOT1QgRURJVCAqLworCit0eXBlZGVmIHN0cnVjdAorCXsKKwlpbnQgc2lnbl9pZDsKKwlpbnQgaGFzaF9pZDsKKwlpbnQgcGtleV9pZDsKKwl9IG5pZF90cmlwbGU7CisKK3N0YXRpYyBjb25zdCBuaWRfdHJpcGxlIHNpZ29pZF9zcnRbXSA9CisJeworRU9GCisKK2ZvcmVhY2ggKEBzcnQxKQorCXsKKwlteSAkeHIgPSAkXzsKKwlteSAoJHAxLCAkcDIpID0gQHskeHJlZl90Ymx7JF99fTsKKwlwcmludCAiXHR7TklEXyR4ciwgTklEXyRwMSwgTklEXyRwMn0sXG4iOworCX0KKworcHJpbnQgIlx0fTsiOworcHJpbnQgPDxFT0Y7CisKKworc3RhdGljIGNvbnN0IG5pZF90cmlwbGUgKiBjb25zdCBzaWdvaWRfc3J0X3hyZWZbXSA9CisJeworRU9GCisKK2ZvcmVhY2ggKEBzcnQyKQorCXsKKwlteSAkeCA9ICR4cmVmX3RibHskX31bMl07CisJcHJpbnQgIlx0XCZzaWdvaWRfc3J0XFskeFxdLFxuIjsKKwl9CisKK3ByaW50ICJcdH07XG5cbiI7CisKK3N1YiBjaGVja19vaWQKKwl7CisJbXkgKCRjaGspID0gQF87CisJaWYgKCFleGlzdHMgJG9pZF90Ymx7JGNoa30pCisJCXsKKwkJZGllICJOb3QgRm91bmQgXCIkY2hrXCJcbiI7CisJCX0KKwl9CisKZGlmZiAtLWdpdCBhL2NyeXB0by9vYmovb2JqX3hyZWYudHh0IGIvY3J5cHRvL29iai9vYmpfeHJlZi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTljOTQyMgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9vYmovb2JqX3hyZWYudHh0CkBAIC0wLDAgKzEsNTggQEAKKyMgT0lEIGNyb3NzIHJlZmVyZW5jZSB0YWJsZS4KKyMgTGlua3Mgc2lnbmF0dXJlcyBPSURzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgcHVibGljIGtleSBhbGdvcml0aG1zCisjIGFuZCBkaWdlc3RzLgorCittZDJXaXRoUlNBRW5jcnlwdGlvbgltZDIJcnNhRW5jcnlwdGlvbgorbWQ1V2l0aFJTQUVuY3J5cHRpb24JbWQ1CXJzYUVuY3J5cHRpb24KK3NoYVdpdGhSU0FFbmNyeXB0aW9uCXNoYQlyc2FFbmNyeXB0aW9uCitzaGExV2l0aFJTQUVuY3J5cHRpb24Jc2hhMQlyc2FFbmNyeXB0aW9uCittZDRXaXRoUlNBRW5jcnlwdGlvbgltZDQJcnNhRW5jcnlwdGlvbgorc2hhMjU2V2l0aFJTQUVuY3J5cHRpb24gc2hhMjU2CXJzYUVuY3J5cHRpb24KK3NoYTM4NFdpdGhSU0FFbmNyeXB0aW9uCXNoYTM4NAlyc2FFbmNyeXB0aW9uCitzaGE1MTJXaXRoUlNBRW5jcnlwdGlvbglzaGE1MTIJcnNhRW5jcnlwdGlvbgorc2hhMjI0V2l0aFJTQUVuY3J5cHRpb24Jc2hhMjI0CXJzYUVuY3J5cHRpb24KK21kYzJXaXRoUlNBCQltZGMyCXJzYUVuY3J5cHRpb24KK3JpcGVtZDE2MFdpdGhSU0EJcmlwZW1kMTYwIHJzYUVuY3J5cHRpb24KKyMgRm9yIFBTUyB0aGUgZGlnZXN0IGFsZ29yaXRobSBjYW4gdmFyeSBhbmQgZGVwZW5kcyBvbiB0aGUgaW5jbHVkZWQKKyMgQWxnb3JpdGhtSWRlbnRpZmllci4gVGhlIGRpZ2VzdCAidW5kZWYiIGluZGljYXRlcyB0aGUgcHVibGljIGtleQorIyBtZXRob2Qgc2hvdWxkIGhhbmRsZSB0aGlzIGV4cGxpY2l0bHkuCityc2Fzc2FQc3MJCXVuZGVmCXJzYUVuY3J5cHRpb24KKworIyBBbHRlcm5hdGl2ZSBkZXByZWNhdGVkIE9JRHMuIEJ5IHVzaW5nIHRoZSBvbGRlciAicnNhIiBPSUQgdGhpcworIyB0eXBlIHdpbGwgYmUgcmVjb2duaXplZCBieSBub3Qgbm9ybWFsbHkgdXNlZC4KKworbWQ1V2l0aFJTQQkJbWQ1CXJzYQorc2hhMVdpdGhSU0EJCXNoYTEJcnNhCisKK2RzYVdpdGhTSEEJCXNoYQlkc2EKK2RzYVdpdGhTSEExCQlzaGExCWRzYQorCitkc2FXaXRoU0hBMV8yCQlzaGExCWRzYV8yCisKK2VjZHNhX3dpdGhfU0hBMQkJc2hhMQlYOV82Ml9pZF9lY1B1YmxpY0tleQorZWNkc2Ffd2l0aF9TSEEyMjQJc2hhMjI0CVg5XzYyX2lkX2VjUHVibGljS2V5CitlY2RzYV93aXRoX1NIQTI1NglzaGEyNTYJWDlfNjJfaWRfZWNQdWJsaWNLZXkKK2VjZHNhX3dpdGhfU0hBMzg0CXNoYTM4NAlYOV82Ml9pZF9lY1B1YmxpY0tleQorZWNkc2Ffd2l0aF9TSEE1MTIJc2hhNTEyCVg5XzYyX2lkX2VjUHVibGljS2V5CitlY2RzYV93aXRoX1JlY29tbWVuZGVkCXVuZGVmCVg5XzYyX2lkX2VjUHVibGljS2V5CitlY2RzYV93aXRoX1NwZWNpZmllZAl1bmRlZglYOV82Ml9pZF9lY1B1YmxpY0tleQorCitkc2Ffd2l0aF9TSEEyMjQJCXNoYTIyNAlkc2EKK2RzYV93aXRoX1NIQTI1NgkJc2hhMjU2CWRzYQorCitpZF9Hb3N0UjM0MTFfOTRfd2l0aF9Hb3N0UjM0MTBfMjAwMQlpZF9Hb3N0UjM0MTFfOTQgaWRfR29zdFIzNDEwXzIwMDEKK2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF85NAlpZF9Hb3N0UjM0MTFfOTQgaWRfR29zdFIzNDEwXzk0CitpZF9Hb3N0UjM0MTFfOTRfd2l0aF9Hb3N0UjM0MTBfOTRfY2MJaWRfR29zdFIzNDExXzk0IGlkX0dvc3RSMzQxMF85NF9jYworaWRfR29zdFIzNDExXzk0X3dpdGhfR29zdFIzNDEwXzIwMDFfY2MJaWRfR29zdFIzNDExXzk0IGlkX0dvc3RSMzQxMF8yMDAxX2NjCisjIEVDREggS0RGcyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBtZXNzYWdlIGRpZ2VzdHMgYW5kIHNjaGVtZXMKK2RoU2luZ2xlUGFzc19zdGRESF9zaGExa2RmX3NjaGVtZQkJc2hhMQlkaF9zdGRfa2RmCitkaFNpbmdsZVBhc3Nfc3RkREhfc2hhMjI0a2RmX3NjaGVtZQkJc2hhMjI0CWRoX3N0ZF9rZGYKK2RoU2luZ2xlUGFzc19zdGRESF9zaGEyNTZrZGZfc2NoZW1lCQlzaGEyNTYJZGhfc3RkX2tkZgorZGhTaW5nbGVQYXNzX3N0ZERIX3NoYTM4NGtkZl9zY2hlbWUJCXNoYTM4NAlkaF9zdGRfa2RmCitkaFNpbmdsZVBhc3Nfc3RkREhfc2hhNTEya2RmX3NjaGVtZQkJc2hhNTEyCWRoX3N0ZF9rZGYKKworZGhTaW5nbGVQYXNzX2NvZmFjdG9yREhfc2hhMWtkZl9zY2hlbWUJCXNoYTEJZGhfY29mYWN0b3Jfa2RmCitkaFNpbmdsZVBhc3NfY29mYWN0b3JESF9zaGEyMjRrZGZfc2NoZW1lCXNoYTIyNAlkaF9jb2ZhY3Rvcl9rZGYKK2RoU2luZ2xlUGFzc19jb2ZhY3RvckRIX3NoYTI1NmtkZl9zY2hlbWUJc2hhMjU2CWRoX2NvZmFjdG9yX2tkZgorZGhTaW5nbGVQYXNzX2NvZmFjdG9yREhfc2hhMzg0a2RmX3NjaGVtZQlzaGEzODQJZGhfY29mYWN0b3Jfa2RmCitkaFNpbmdsZVBhc3NfY29mYWN0b3JESF9zaGE1MTJrZGZfc2NoZW1lCXNoYTUxMglkaF9jb2ZhY3Rvcl9rZGYKZGlmZiAtLWdpdCBhL2NyeXB0by9vYmovb2JqZWN0cy5wbCBiL2NyeXB0by9vYmovb2JqZWN0cy5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjhiMzk0Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL29iai9vYmplY3RzLnBsCkBAIC0wLDAgKzEsMjI4IEBACisjIS91c3IvbG9jYWwvYmluL3BlcmwKKworb3BlbiAoTlVNSU4sIiRBUkdWWzFdIikgfHwgZGllICJDYW4ndCBvcGVuIG51bWJlciBmaWxlICRBUkdWWzFdIjsKKyRtYXhfbmlkPTA7Ciskbz0wOword2hpbGUoPE5VTUlOPikKKwl7CisJY2hvcDsKKwkkbysrOworCXMvIy4qJC8vOworCW5leHQgaWYgL15ccyokLzsKKwkkXyA9ICdYJy4kXzsKKwkoJENuYW1lLCRteW51bSkgPSBzcGxpdDsKKwkkQ25hbWUgPX4gcy9eWC8vOworCWlmIChkZWZpbmVkKCRuaWRueyRteW51bX0pKQorCQl7IGRpZSAiJEFSR1ZbMV06JG86VGhlcmUncyBhbHJlYWR5IGFuIG9iamVjdCB3aXRoIE5JRCAiLCRteW51bSwiIG9uIGxpbmUgIiwkb3JkZXJ7JG15bnVtfSwiXG4iOyB9CisJaWYgKGRlZmluZWQoJG5pZHskQ25hbWV9KSkKKwkJeyBkaWUgIiRBUkdWWzFdOiRvOlRoZXJlJ3MgYWxyZWFkeSBhbiBvYmplY3Qgd2l0aCBuYW1lICIsJENuYW1lLCIgb24gbGluZSAiLCRvcmRlcnskbmlkeyRDbmFtZX19LCJcbiI7IH0KKwkkbmlkeyRDbmFtZX0gPSAkbXludW07CisJJG5pZG57JG15bnVtfSA9ICRDbmFtZTsKKwkkb3JkZXJ7JG15bnVtfSA9ICRvOworCSRtYXhfbmlkID0gJG15bnVtIGlmICRteW51bSA+ICRtYXhfbmlkOworCX0KK2Nsb3NlIE5VTUlOOworCitvcGVuIChJTiwiJEFSR1ZbMF0iKSB8fCBkaWUgIkNhbid0IG9wZW4gaW5wdXQgZmlsZSAkQVJHVlswXSI7CiskQ25hbWU9IiI7Ciskbz0wOword2hpbGUgKDxJTj4pCisJeworCWNob3A7CisJJG8rKzsKKyAgICAgICAgaWYgKC9eIW1vZHVsZVxzKyguKikkLykKKwkJeworCQkkbW9kdWxlID0gJDEuIi0iOworCQkkbW9kdWxlID1+IHMvXC4vXy9nOworCQkkbW9kdWxlID1+IHMvLS9fL2c7CisJCX0KKyAgICAgICAgaWYgKC9eIWdsb2JhbCQvKQorCQl7ICRtb2R1bGUgPSAiIjsgfQorCWlmICgvXiFDbmFtZVxzKyguKikkLykKKwkJeyAkQ25hbWUgPSAkMTsgfQorCWlmICgvXiFBbGlhc1xzKyguKz8pXHMrKC4qKSQvKQorCQl7CisJCSRDbmFtZSA9ICRtb2R1bGUuJDE7CisJCSRteW9pZCA9ICQyOworCQkkbXlvaWQgPSAmcHJvY2Vzc19vaWQoJG15b2lkKTsKKwkJJENuYW1lID1+IHMvLS9fL2c7CisJCSRvcmRlcm57JG99ID0gJENuYW1lOworCQkkb3JkZXJ7JENuYW1lfSA9ICRvOworCQkkb2JqeyRDbmFtZX0gPSAkbXlvaWQ7CisJCSRfID0gIiI7CisJCSRDbmFtZSA9ICIiOworCQl9CisJcy8hLiokLy87CisJcy8jLiokLy87CisJbmV4dCBpZiAvXlxzKiQvOworCSgkbXlvaWQsJG15c24sJG15bG4pID0gc3BsaXQgJzonOworCSRteXNuID1+IHMvXlxzKi8vOworCSRteXNuID1+IHMvXHMqJC8vOworCSRteWxuID1+IHMvXlxzKi8vOworCSRteWxuID1+IHMvXHMqJC8vOworCSRteW9pZCA9fiBzL15ccyovLzsKKwkkbXlvaWQgPX4gcy9ccyokLy87CisJaWYgKCRteW9pZCBuZSAiIikKKwkJeworCQkkbXlvaWQgPSAmcHJvY2Vzc19vaWQoJG15b2lkKTsKKwkJfQorCisJaWYgKCRDbmFtZSBlcSAiIiAmJiAhKCRteWxuID1+IC8gLykpCisJCXsKKwkJJENuYW1lID0gJG15bG47CisJCSRDbmFtZSA9fiBzL1wuL18vZzsKKwkJJENuYW1lID1+IHMvLS9fL2c7CisJCWlmICgkQ25hbWUgbmUgIiIgJiYgZGVmaW5lZCgkbG57JG1vZHVsZS4kQ25hbWV9KSkKKwkJCXsgZGllICJvYmplY3RzLnR4dDokbzpUaGVyZSdzIGFscmVhZHkgYW4gb2JqZWN0IHdpdGggbG9uZyBuYW1lICIsJGxueyRtb2R1bGUuJENuYW1lfSwiIG9uIGxpbmUgIiwkb3JkZXJ7JG1vZHVsZS4kQ25hbWV9LCJcbiI7IH0KKwkJfQorCWlmICgkQ25hbWUgZXEgIiIpCisJCXsKKwkJJENuYW1lID0gJG15c247CisJCSRDbmFtZSA9fiBzLy0vXy9nOworCQlpZiAoJENuYW1lIG5lICIiICYmIGRlZmluZWQoJHNueyRtb2R1bGUuJENuYW1lfSkpCisJCQl7IGRpZSAib2JqZWN0cy50eHQ6JG86VGhlcmUncyBhbHJlYWR5IGFuIG9iamVjdCB3aXRoIHNob3J0IG5hbWUgIiwkc257JG1vZHVsZS4kQ25hbWV9LCIgb24gbGluZSAiLCRvcmRlcnskbW9kdWxlLiRDbmFtZX0sIlxuIjsgfQorCQl9CisJaWYgKCRDbmFtZSBlcSAiIikKKwkJeworCQkkQ25hbWUgPSAkbXlsbjsKKwkJJENuYW1lID1+IHMvLS9fL2c7CisJCSRDbmFtZSA9fiBzL1wuL18vZzsKKwkJJENuYW1lID1+IHMvIC9fL2c7CisJCWlmICgkQ25hbWUgbmUgIiIgJiYgZGVmaW5lZCgkbG57JG1vZHVsZS4kQ25hbWV9KSkKKwkJCXsgZGllICJvYmplY3RzLnR4dDokbzpUaGVyZSdzIGFscmVhZHkgYW4gb2JqZWN0IHdpdGggbG9uZyBuYW1lICIsJGxueyRtb2R1bGUuJENuYW1lfSwiIG9uIGxpbmUgIiwkb3JkZXJ7JG1vZHVsZS4kQ25hbWV9LCJcbiI7IH0KKwkJfQorCSRDbmFtZSA9fiBzL1wuL18vZzsKKwkkQ25hbWUgPX4gcy8tL18vZzsKKwkkQ25hbWUgPSAkbW9kdWxlLiRDbmFtZTsKKwkkb3JkZXJueyRvfSA9ICRDbmFtZTsKKwkkb3JkZXJ7JENuYW1lfSA9ICRvOworCSRzbnskQ25hbWV9ID0gJG15c247CisJJGxueyRDbmFtZX0gPSAkbXlsbjsKKwkkb2JqeyRDbmFtZX0gPSAkbXlvaWQ7CisJaWYgKCFkZWZpbmVkKCRuaWR7JENuYW1lfSkpCisJCXsKKwkJJG1heF9uaWQrKzsKKwkJJG5pZHskQ25hbWV9ID0gJG1heF9uaWQ7CisJCSRuaWRueyRtYXhfbmlkfSA9ICRDbmFtZTsKK3ByaW50IFNUREVSUiAiQWRkZWQgT0lEICRDbmFtZVxuIjsKKwkJfQorCSRDbmFtZT0iIjsKKwl9CitjbG9zZSBJTjsKKworb3BlbiAoTlVNT1VULCI+JEFSR1ZbMV0iKSB8fCBkaWUgIkNhbid0IG9wZW4gb3V0cHV0IGZpbGUgJEFSR1ZbMV0iOworZm9yZWFjaCAoc29ydCB7ICRhIDw9PiAkYiB9IGtleXMgJW5pZG4pCisJeworCXByaW50IE5VTU9VVCAkbmlkbnskX30sIlx0XHQiLCRfLCJcbiI7CisJfQorY2xvc2UgTlVNT1VUOworCitvcGVuIChPVVQsIj4kQVJHVlsyXSIpIHx8IGRpZSAiQ2FuJ3Qgb3BlbiBvdXRwdXQgZmlsZSAkQVJHVlsyXSI7CitwcmludCBPVVQgPDwnRU9GJzsKKy8qIFRISVMgRklMRSBJUyBHRU5FUkFURUQgRlJPTSBvYmplY3RzLnR4dCBieSBvYmplY3RzLnBsIHZpYSB0aGUKKyAqIGZvbGxvd2luZyBjb21tYW5kOgorICogcGVybCBvYmplY3RzLnBsIG9iamVjdHMudHh0IG9ial9tYWMubnVtIG9ial9tYWMuaCAqLworCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NyBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjZGVmaW5lIFNOX3VuZGVmCQkJIlVOREVGIgorI2RlZmluZSBMTl91bmRlZgkJCSJ1bmRlZmluZWQiCisjZGVmaW5lIE5JRF91bmRlZgkJCTAKKyNkZWZpbmUgT0JKX3VuZGVmCQkJMEwKKworRU9GCisKK2ZvcmVhY2ggKHNvcnQgeyAkYSA8PT4gJGIgfSBrZXlzICVvcmRlcm4pCisJeworCSRDbmFtZT0kb3JkZXJueyRffTsKKwlwcmludCBPVVQgIiNkZWZpbmUgU05fIiwkQ25hbWUsIlx0XHRcIiIsJHNueyRDbmFtZX0sIlwiXG4iIGlmICRzbnskQ25hbWV9IG5lICIiOworCXByaW50IE9VVCAiI2RlZmluZSBMTl8iLCRDbmFtZSwiXHRcdFwiIiwkbG57JENuYW1lfSwiXCJcbiIgaWYgJGxueyRDbmFtZX0gbmUgIiI7CisJcHJpbnQgT1VUICIjZGVmaW5lIE5JRF8iLCRDbmFtZSwiXHRcdCIsJG5pZHskQ25hbWV9LCJcbiIgaWYgJG5pZHskQ25hbWV9IG5lICIiOworCXByaW50IE9VVCAiI2RlZmluZSBPQkpfIiwkQ25hbWUsIlx0XHQiLCRvYmp7JENuYW1lfSwiXG4iIGlmICRvYmp7JENuYW1lfSBuZSAiIjsKKwlwcmludCBPVVQgIlxuIjsKKwl9CisKK2Nsb3NlIE9VVDsKKworc3ViIHByb2Nlc3Nfb2lkCisJeworCWxvY2FsKCRvaWQpPUBfOworCWxvY2FsKEBhLCRvaWRfcHJlZik7CisKKwlAYSA9IHNwbGl0KC9ccysvLCRteW9pZCk7CisJJHByZWZfb2lkID0gIiI7CisJJHByZWZfc2VwID0gIiI7CisJaWYgKCEoJGFbMF0gPX4gL15bMC05XSskLykpCisJCXsKKwkJJGFbMF0gPX4gcy8tL18vZzsKKwkJaWYgKCFkZWZpbmVkKCRvYmp7JGFbMF19KSkKKwkJCXsgZGllICIkQVJHVlswXTokbzpVbmRlZmluZWQgaWRlbnRpZmllciAiLCRhWzBdLCJcbiI7IH0KKwkJJHByZWZfb2lkID0gIk9CSl8iIC4gJGFbMF07CisJCSRwcmVmX3NlcCA9ICIsIjsKKwkJc2hpZnQgQGE7CisJCX0KKwkkb2lkcyA9IGpvaW4oJ0wsJyxAYSkgLiAiTCI7CisJaWYgKCRvaWRzIG5lICJMIikKKwkJeworCQkkb2lkcyA9ICRwcmVmX29pZCAuICRwcmVmX3NlcCAuICRvaWRzOworCQl9CisJZWxzZQorCQl7CisJCSRvaWRzID0gJHByZWZfb2lkOworCQl9CisJcmV0dXJuKCRvaWRzKTsKKwl9CmRpZmYgLS1naXQgYS9jcnlwdG8vb2JqL29iamVjdHMudHh0IGIvY3J5cHRvL29iai9vYmplY3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWZmYzZjCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL29iai9vYmplY3RzLnR4dApAQCAtMCwwICsxLDEzMzQgQEAKKyMgQ0NJVFQgd2FzIHJlbmFtZWQgdG8gSVRVLVQgcXVpdGUgc29tZSB0aW1lIGFnbworMAkJCTogSVRVLVQJCQk6IGl0dS10CishQWxpYXMgY2NpdHQgaXR1LXQKKworMQkJCTogSVNPCQkJOiBpc28KKworMgkJCTogSk9JTlQtSVNPLUlUVS1UCTogam9pbnQtaXNvLWl0dS10CishQWxpYXMgam9pbnQtaXNvLWNjaXR0IGpvaW50LWlzby1pdHUtdAorCitpc28gMgkJCTogbWVtYmVyLWJvZHkJCTogSVNPIE1lbWJlciBCb2R5CisKK2lzbyAzCQkJOiBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbgorCisjIEhNQUMgT0lEcworaWRlbnRpZmllZC1vcmdhbml6YXRpb24gNiAxIDUgNSA4IDEgMQk6IEhNQUMtTUQ1CTogaG1hYy1tZDUKK2lkZW50aWZpZWQtb3JnYW5pemF0aW9uIDYgMSA1IDUgOCAxIDIJOiBITUFDLVNIQTEJOiBobWFjLXNoYTEKKworaWRlbnRpZmllZC1vcmdhbml6YXRpb24gMTMyCTogY2VydGljb20tYXJjCisKK2pvaW50LWlzby1pdHUtdCAyMwk6IGludGVybmF0aW9uYWwtb3JnYW5pemF0aW9ucwk6IEludGVybmF0aW9uYWwgT3JnYW5pemF0aW9ucworCitpbnRlcm5hdGlvbmFsLW9yZ2FuaXphdGlvbnMgNDMJOiB3YXAKK3dhcCAxCQkJOiB3YXAtd3NnCisKK2pvaW50LWlzby1pdHUtdCA1IDEgNQk6IHNlbGVjdGVkLWF0dHJpYnV0ZS10eXBlcwk6IFNlbGVjdGVkIEF0dHJpYnV0ZSBUeXBlcworCitzZWxlY3RlZC1hdHRyaWJ1dGUtdHlwZXMgNTUJOiBjbGVhcmFuY2UKKworbWVtYmVyLWJvZHkgODQwCQk6IElTTy1VUwkJOiBJU08gVVMgTWVtYmVyIEJvZHkKK0lTTy1VUyAxMDA0MAkJOiBYOS01NwkJCTogWDkuNTcKK1g5LTU3IDQJCQk6IFg5Y20JCQk6IFg5LjU3IENNID8KKworIUNuYW1lIGRzYQorWDljbSAxCQkJOiBEU0EJCQk6IGRzYUVuY3J5cHRpb24KK1g5Y20gMwkJCTogRFNBLVNIQTEJCTogZHNhV2l0aFNIQTEKKworCitJU08tVVMgMTAwNDUJCTogYW5zaS1YOS02MgkJOiBBTlNJIFg5LjYyCishbW9kdWxlIFg5LTYyCishQWxpYXMgaWQtZmllbGRUeXBlIGFuc2ktWDktNjIgMQorWDktNjJfaWQtZmllbGRUeXBlIDEJCTogcHJpbWUtZmllbGQKK1g5LTYyX2lkLWZpZWxkVHlwZSAyCQk6IGNoYXJhY3RlcmlzdGljLXR3by1maWVsZAorWDktNjJfY2hhcmFjdGVyaXN0aWMtdHdvLWZpZWxkIDMgOiBpZC1jaGFyYWN0ZXJpc3RpYy10d28tYmFzaXMKK1g5LTYyX2lkLWNoYXJhY3RlcmlzdGljLXR3by1iYXNpcyAxIDogb25CYXNpcworWDktNjJfaWQtY2hhcmFjdGVyaXN0aWMtdHdvLWJhc2lzIDIgOiB0cEJhc2lzCitYOS02Ml9pZC1jaGFyYWN0ZXJpc3RpYy10d28tYmFzaXMgMyA6IHBwQmFzaXMKKyFBbGlhcyBpZC1wdWJsaWNLZXlUeXBlIGFuc2ktWDktNjIgMgorWDktNjJfaWQtcHVibGljS2V5VHlwZSAxCTogaWQtZWNQdWJsaWNLZXkKKyFBbGlhcyBlbGxpcHRpY0N1cnZlIGFuc2ktWDktNjIgMworIUFsaWFzIGMtVHdvQ3VydmUgWDktNjJfZWxsaXB0aWNDdXJ2ZSAwCitYOS02Ml9jLVR3b0N1cnZlIDEJCTogYzJwbmIxNjN2MQorWDktNjJfYy1Ud29DdXJ2ZSAyCQk6IGMycG5iMTYzdjIKK1g5LTYyX2MtVHdvQ3VydmUgMwkJOiBjMnBuYjE2M3YzCitYOS02Ml9jLVR3b0N1cnZlIDQJCTogYzJwbmIxNzZ2MQorWDktNjJfYy1Ud29DdXJ2ZSA1CQk6IGMydG5iMTkxdjEKK1g5LTYyX2MtVHdvQ3VydmUgNgkJOiBjMnRuYjE5MXYyCitYOS02Ml9jLVR3b0N1cnZlIDcJCTogYzJ0bmIxOTF2MworWDktNjJfYy1Ud29DdXJ2ZSA4CQk6IGMyb25iMTkxdjQKK1g5LTYyX2MtVHdvQ3VydmUgOQkJOiBjMm9uYjE5MXY1CitYOS02Ml9jLVR3b0N1cnZlIDEwCQk6IGMycG5iMjA4dzEKK1g5LTYyX2MtVHdvQ3VydmUgMTEJCTogYzJ0bmIyMzl2MQorWDktNjJfYy1Ud29DdXJ2ZSAxMgkJOiBjMnRuYjIzOXYyCitYOS02Ml9jLVR3b0N1cnZlIDEzCQk6IGMydG5iMjM5djMKK1g5LTYyX2MtVHdvQ3VydmUgMTQJCTogYzJvbmIyMzl2NAorWDktNjJfYy1Ud29DdXJ2ZSAxNQkJOiBjMm9uYjIzOXY1CitYOS02Ml9jLVR3b0N1cnZlIDE2CQk6IGMycG5iMjcydzEKK1g5LTYyX2MtVHdvQ3VydmUgMTcJCTogYzJwbmIzMDR3MQorWDktNjJfYy1Ud29DdXJ2ZSAxOAkJOiBjMnRuYjM1OXYxCitYOS02Ml9jLVR3b0N1cnZlIDE5CQk6IGMycG5iMzY4dzEKK1g5LTYyX2MtVHdvQ3VydmUgMjAJCTogYzJ0bmI0MzFyMQorIUFsaWFzIHByaW1lQ3VydmUgWDktNjJfZWxsaXB0aWNDdXJ2ZSAxCitYOS02Ml9wcmltZUN1cnZlIDEJIAk6IHByaW1lMTkydjEKK1g5LTYyX3ByaW1lQ3VydmUgMgkgCTogcHJpbWUxOTJ2MgorWDktNjJfcHJpbWVDdXJ2ZSAzCSAJOiBwcmltZTE5MnYzCitYOS02Ml9wcmltZUN1cnZlIDQJIAk6IHByaW1lMjM5djEKK1g5LTYyX3ByaW1lQ3VydmUgNQkgCTogcHJpbWUyMzl2MgorWDktNjJfcHJpbWVDdXJ2ZSA2CSAJOiBwcmltZTIzOXYzCitYOS02Ml9wcmltZUN1cnZlIDcJIAk6IHByaW1lMjU2djEKKyFBbGlhcyBpZC1lY1NpZ1R5cGUgYW5zaS1YOS02MiA0CishZ2xvYmFsCitYOS02Ml9pZC1lY1NpZ1R5cGUgMQkJOiBlY2RzYS13aXRoLVNIQTEKK1g5LTYyX2lkLWVjU2lnVHlwZSAyCQk6IGVjZHNhLXdpdGgtUmVjb21tZW5kZWQKK1g5LTYyX2lkLWVjU2lnVHlwZSAzCQk6IGVjZHNhLXdpdGgtU3BlY2lmaWVkCitlY2RzYS13aXRoLVNwZWNpZmllZCAxCQk6IGVjZHNhLXdpdGgtU0hBMjI0CitlY2RzYS13aXRoLVNwZWNpZmllZCAyCQk6IGVjZHNhLXdpdGgtU0hBMjU2CitlY2RzYS13aXRoLVNwZWNpZmllZCAzCQk6IGVjZHNhLXdpdGgtU0hBMzg0CitlY2RzYS13aXRoLVNwZWNpZmllZCA0CQk6IGVjZHNhLXdpdGgtU0hBNTEyCisKKyMgU0VDRyBjdXJ2ZSBPSURzIGZyb20gIlNFQyAyOiBSZWNvbW1lbmRlZCBFbGxpcHRpYyBDdXJ2ZSBEb21haW4gUGFyYW1ldGVycyIKKyMgKGh0dHA6Ly93d3cuc2VjZy5vcmcvKQorIUFsaWFzIHNlY2dfZWxsaXB0aWNDdXJ2ZSBjZXJ0aWNvbS1hcmMgMAorIyBTRUNHIHByaW1lIGN1cnZlcyBPSURzCitzZWNnLWVsbGlwdGljQ3VydmUgNgkJOiBzZWNwMTEycjEKK3NlY2ctZWxsaXB0aWNDdXJ2ZSA3CQk6IHNlY3AxMTJyMgorc2VjZy1lbGxpcHRpY0N1cnZlIDI4CQk6IHNlY3AxMjhyMQorc2VjZy1lbGxpcHRpY0N1cnZlIDI5CQk6IHNlY3AxMjhyMgorc2VjZy1lbGxpcHRpY0N1cnZlIDkJCTogc2VjcDE2MGsxCitzZWNnLWVsbGlwdGljQ3VydmUgOAkJOiBzZWNwMTYwcjEKK3NlY2ctZWxsaXB0aWNDdXJ2ZSAzMAkJOiBzZWNwMTYwcjIKK3NlY2ctZWxsaXB0aWNDdXJ2ZSAzMQkJOiBzZWNwMTkyazEKKyMgTk9URTogdGhlIGN1cnZlIHNlY3AxOTJyMSBpcyB0aGUgc2FtZSBhcyBwcmltZTE5MnYxIGRlZmluZWQgYWJvdmUKKyMgICAgICAgYW5kIGlzIHRoZXJlZm9yZSBvbWl0dGVkCitzZWNnLWVsbGlwdGljQ3VydmUgMzIJCTogc2VjcDIyNGsxCitzZWNnLWVsbGlwdGljQ3VydmUgMzMJCTogc2VjcDIyNHIxCitzZWNnLWVsbGlwdGljQ3VydmUgMTAJCTogc2VjcDI1NmsxCisjIE5PVEU6IHRoZSBjdXJ2ZSBzZWNwMjU2cjEgaXMgdGhlIHNhbWUgYXMgcHJpbWUyNTZ2MSBkZWZpbmVkIGFib3ZlCisjICAgICAgIGFuZCBpcyB0aGVyZWZvcmUgb21pdHRlZAorc2VjZy1lbGxpcHRpY0N1cnZlIDM0CQk6IHNlY3AzODRyMQorc2VjZy1lbGxpcHRpY0N1cnZlIDM1CQk6IHNlY3A1MjFyMQorIyBTRUNHIGNoYXJhY3RlcmlzdGljIHR3byBjdXJ2ZXMgT0lEcworc2VjZy1lbGxpcHRpY0N1cnZlIDQJCTogc2VjdDExM3IxCitzZWNnLWVsbGlwdGljQ3VydmUgNQkJOiBzZWN0MTEzcjIKK3NlY2ctZWxsaXB0aWNDdXJ2ZSAyMgkJOiBzZWN0MTMxcjEKK3NlY2ctZWxsaXB0aWNDdXJ2ZSAyMwkJOiBzZWN0MTMxcjIKK3NlY2ctZWxsaXB0aWNDdXJ2ZSAxCQk6IHNlY3QxNjNrMQorc2VjZy1lbGxpcHRpY0N1cnZlIDIJCTogc2VjdDE2M3IxCitzZWNnLWVsbGlwdGljQ3VydmUgMTUJCTogc2VjdDE2M3IyCitzZWNnLWVsbGlwdGljQ3VydmUgMjQJCTogc2VjdDE5M3IxCitzZWNnLWVsbGlwdGljQ3VydmUgMjUJCTogc2VjdDE5M3IyCitzZWNnLWVsbGlwdGljQ3VydmUgMjYJCTogc2VjdDIzM2sxCitzZWNnLWVsbGlwdGljQ3VydmUgMjcJCTogc2VjdDIzM3IxCitzZWNnLWVsbGlwdGljQ3VydmUgMwkJOiBzZWN0MjM5azEKK3NlY2ctZWxsaXB0aWNDdXJ2ZSAxNgkJOiBzZWN0MjgzazEKK3NlY2ctZWxsaXB0aWNDdXJ2ZSAxNwkJOiBzZWN0MjgzcjEKK3NlY2ctZWxsaXB0aWNDdXJ2ZSAzNgkJOiBzZWN0NDA5azEKK3NlY2ctZWxsaXB0aWNDdXJ2ZSAzNwkJOiBzZWN0NDA5cjEKK3NlY2ctZWxsaXB0aWNDdXJ2ZSAzOAkJOiBzZWN0NTcxazEKK3NlY2ctZWxsaXB0aWNDdXJ2ZSAzOQkJOiBzZWN0NTcxcjEKKworIyBXQVAvVExTIGN1cnZlIE9JRHMgKGh0dHA6Ly93d3cud2FwZm9ydW0ub3JnLykKKyFBbGlhcyB3YXAtd3NnLWlkbS1lY2lkIHdhcC13c2cgNAord2FwLXdzZy1pZG0tZWNpZCAxCTogd2FwLXdzZy1pZG0tZWNpZC13dGxzMQord2FwLXdzZy1pZG0tZWNpZCAzCTogd2FwLXdzZy1pZG0tZWNpZC13dGxzMword2FwLXdzZy1pZG0tZWNpZCA0CTogd2FwLXdzZy1pZG0tZWNpZC13dGxzNAord2FwLXdzZy1pZG0tZWNpZCA1CTogd2FwLXdzZy1pZG0tZWNpZC13dGxzNQord2FwLXdzZy1pZG0tZWNpZCA2CTogd2FwLXdzZy1pZG0tZWNpZC13dGxzNgord2FwLXdzZy1pZG0tZWNpZCA3CTogd2FwLXdzZy1pZG0tZWNpZC13dGxzNword2FwLXdzZy1pZG0tZWNpZCA4CTogd2FwLXdzZy1pZG0tZWNpZC13dGxzOAord2FwLXdzZy1pZG0tZWNpZCA5CTogd2FwLXdzZy1pZG0tZWNpZC13dGxzOQord2FwLXdzZy1pZG0tZWNpZCAxMAk6IHdhcC13c2ctaWRtLWVjaWQtd3RsczEwCit3YXAtd3NnLWlkbS1lY2lkIDExCTogd2FwLXdzZy1pZG0tZWNpZC13dGxzMTEKK3dhcC13c2ctaWRtLWVjaWQgMTIJOiB3YXAtd3NnLWlkbS1lY2lkLXd0bHMxMgorCisKK0lTTy1VUyAxMTM1MzMgNyA2NiAxMAk6IENBU1Q1LUNCQwkJOiBjYXN0NS1jYmMKKwkJCTogQ0FTVDUtRUNCCQk6IGNhc3Q1LWVjYgorIUNuYW1lIGNhc3Q1LWNmYjY0CisJCQk6IENBU1Q1LUNGQgkJOiBjYXN0NS1jZmIKKyFDbmFtZSBjYXN0NS1vZmI2NAorCQkJOiBDQVNUNS1PRkIJCTogY2FzdDUtb2ZiCishQ25hbWUgcGJlV2l0aE1ENUFuZENhc3Q1LUNCQworSVNPLVVTIDExMzUzMyA3IDY2IDEyCToJCQk6IHBiZVdpdGhNRDVBbmRDYXN0NUNCQworCisjIE1hY3MgZm9yIENNUCBhbmQgQ1JNRgorSVNPLVVTIDExMzUzMyA3IDY2IDEzCTogaWQtUGFzc3dvcmRCYXNlZE1BQwk6IHBhc3N3b3JkIGJhc2VkIE1BQworSVNPLVVTIDExMzUzMyA3IDY2IDMwCTogaWQtREhCYXNlZE1hYwkJOiBEaWZmaWUtSGVsbG1hbiBiYXNlZCBNQUMKKworSVNPLVVTIDExMzU0OQkJOiByc2Fkc2kJCTogUlNBIERhdGEgU2VjdXJpdHksIEluYy4KKworcnNhZHNpIDEJCTogcGtjcwkJCTogUlNBIERhdGEgU2VjdXJpdHksIEluYy4gUEtDUworCitwa2NzIDEJCQk6IHBrY3MxCitwa2NzMSAxCQkJOgkJCTogcnNhRW5jcnlwdGlvbgorcGtjczEgMgkJCTogUlNBLU1EMgkJOiBtZDJXaXRoUlNBRW5jcnlwdGlvbgorcGtjczEgMwkJCTogUlNBLU1ENAkJOiBtZDRXaXRoUlNBRW5jcnlwdGlvbgorcGtjczEgNAkJCTogUlNBLU1ENQkJOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorcGtjczEgNQkJCTogUlNBLVNIQTEJCTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisjIEFjY29yZGluZyB0byBQS0NTICMxIHZlcnNpb24gMi4xCitwa2NzMSA3CQkJOiBSU0FFUy1PQUVQCQk6IHJzYWVzT2FlcAorcGtjczEgOAkJCTogTUdGMQkJCTogbWdmMQorcGtjczEgOQkJCTogUFNQRUNJRklFRAkJOiBwU3BlY2lmaWVkCitwa2NzMSAxMAkJOiBSU0FTU0EtUFNTCQk6IHJzYXNzYVBzcworCitwa2NzMSAxMQkJOiBSU0EtU0hBMjU2CQk6IHNoYTI1NldpdGhSU0FFbmNyeXB0aW9uCitwa2NzMSAxMgkJOiBSU0EtU0hBMzg0CQk6IHNoYTM4NFdpdGhSU0FFbmNyeXB0aW9uCitwa2NzMSAxMwkJOiBSU0EtU0hBNTEyCQk6IHNoYTUxMldpdGhSU0FFbmNyeXB0aW9uCitwa2NzMSAxNAkJOiBSU0EtU0hBMjI0CQk6IHNoYTIyNFdpdGhSU0FFbmNyeXB0aW9uCisKK3BrY3MgMwkJCTogcGtjczMKK3BrY3MzIDEJCQk6CQkJOiBkaEtleUFncmVlbWVudAorCitwa2NzIDUJCQk6IHBrY3M1Citwa2NzNSAxCQkJOiBQQkUtTUQyLURFUwkJOiBwYmVXaXRoTUQyQW5kREVTLUNCQworcGtjczUgMwkJCTogUEJFLU1ENS1ERVMJCTogcGJlV2l0aE1ENUFuZERFUy1DQkMKK3BrY3M1IDQJCQk6IFBCRS1NRDItUkMyLTY0CTogcGJlV2l0aE1EMkFuZFJDMi1DQkMKK3BrY3M1IDYJCQk6IFBCRS1NRDUtUkMyLTY0CTogcGJlV2l0aE1ENUFuZFJDMi1DQkMKK3BrY3M1IDEwCQk6IFBCRS1TSEExLURFUwkJOiBwYmVXaXRoU0hBMUFuZERFUy1DQkMKK3BrY3M1IDExCQk6IFBCRS1TSEExLVJDMi02NAk6IHBiZVdpdGhTSEExQW5kUkMyLUNCQworIUNuYW1lIGlkX3Bia2RmMgorcGtjczUgMTIJCToJCQk6IFBCS0RGMgorIUNuYW1lIHBiZXMyCitwa2NzNSAxMwkJOgkJCTogUEJFUzIKKyFDbmFtZSBwYm1hYzEKK3BrY3M1IDE0CQk6CQkJOiBQQk1BQzEKKworcGtjcyA3CQkJOiBwa2NzNworcGtjczcgMQkJCToJCQk6IHBrY3M3LWRhdGEKKyFDbmFtZSBwa2NzNy1zaWduZWQKK3BrY3M3IDIJCQk6CQkJOiBwa2NzNy1zaWduZWREYXRhCishQ25hbWUgcGtjczctZW52ZWxvcGVkCitwa2NzNyAzCQkJOgkJCTogcGtjczctZW52ZWxvcGVkRGF0YQorIUNuYW1lIHBrY3M3LXNpZ25lZEFuZEVudmVsb3BlZAorcGtjczcgNAkJCToJCQk6IHBrY3M3LXNpZ25lZEFuZEVudmVsb3BlZERhdGEKKyFDbmFtZSBwa2NzNy1kaWdlc3QKK3BrY3M3IDUJCQk6CQkJOiBwa2NzNy1kaWdlc3REYXRhCishQ25hbWUgcGtjczctZW5jcnlwdGVkCitwa2NzNyA2CQkJOgkJCTogcGtjczctZW5jcnlwdGVkRGF0YQorCitwa2NzIDkJCQk6IHBrY3M5CishbW9kdWxlIHBrY3M5Citwa2NzOSAxCQkJOiAJCQk6IGVtYWlsQWRkcmVzcworcGtjczkgMgkJCToJCQk6IHVuc3RydWN0dXJlZE5hbWUKK3BrY3M5IDMJCQk6CQkJOiBjb250ZW50VHlwZQorcGtjczkgNAkJCToJCQk6IG1lc3NhZ2VEaWdlc3QKK3BrY3M5IDUJCQk6CQkJOiBzaWduaW5nVGltZQorcGtjczkgNgkJCToJCQk6IGNvdW50ZXJzaWduYXR1cmUKK3BrY3M5IDcJCQk6CQkJOiBjaGFsbGVuZ2VQYXNzd29yZAorcGtjczkgOAkJCToJCQk6IHVuc3RydWN0dXJlZEFkZHJlc3MKKyFDbmFtZSBleHRDZXJ0QXR0cmlidXRlcworcGtjczkgOQkJCToJCQk6IGV4dGVuZGVkQ2VydGlmaWNhdGVBdHRyaWJ1dGVzCishZ2xvYmFsCisKKyFDbmFtZSBleHQtcmVxCitwa2NzOSAxNAkJOiBleHRSZXEJCTogRXh0ZW5zaW9uIFJlcXVlc3QKKworIUNuYW1lIFNNSU1FQ2FwYWJpbGl0aWVzCitwa2NzOSAxNQkJOiBTTUlNRS1DQVBTCQk6IFMvTUlNRSBDYXBhYmlsaXRpZXMKKworIyBTL01JTUUKKyFDbmFtZSBTTUlNRQorcGtjczkgMTYJCTogU01JTUUJCQk6IFMvTUlNRQorU01JTUUgMAkJCTogaWQtc21pbWUtbW9kCitTTUlNRSAxCQkJOiBpZC1zbWltZS1jdAorU01JTUUgMgkJCTogaWQtc21pbWUtYWEKK1NNSU1FIDMJCQk6IGlkLXNtaW1lLWFsZworU01JTUUgNAkJCTogaWQtc21pbWUtY2QKK1NNSU1FIDUJCQk6IGlkLXNtaW1lLXNwcQorU01JTUUgNgkJCTogaWQtc21pbWUtY3RpCisKKyMgUy9NSU1FIE1vZHVsZXMKK2lkLXNtaW1lLW1vZCAxCQk6IGlkLXNtaW1lLW1vZC1jbXMKK2lkLXNtaW1lLW1vZCAyCQk6IGlkLXNtaW1lLW1vZC1lc3MKK2lkLXNtaW1lLW1vZCAzCQk6IGlkLXNtaW1lLW1vZC1vaWQKK2lkLXNtaW1lLW1vZCA0CQk6IGlkLXNtaW1lLW1vZC1tc2ctdjMKK2lkLXNtaW1lLW1vZCA1CQk6IGlkLXNtaW1lLW1vZC1ldHMtZVNpZ25hdHVyZS04OAoraWQtc21pbWUtbW9kIDYJCTogaWQtc21pbWUtbW9kLWV0cy1lU2lnbmF0dXJlLTk3CitpZC1zbWltZS1tb2QgNwkJOiBpZC1zbWltZS1tb2QtZXRzLWVTaWdQb2xpY3ktODgKK2lkLXNtaW1lLW1vZCA4CQk6IGlkLXNtaW1lLW1vZC1ldHMtZVNpZ1BvbGljeS05NworCisjIFMvTUlNRSBDb250ZW50IFR5cGVzCitpZC1zbWltZS1jdCAxCQk6IGlkLXNtaW1lLWN0LXJlY2VpcHQKK2lkLXNtaW1lLWN0IDIJCTogaWQtc21pbWUtY3QtYXV0aERhdGEKK2lkLXNtaW1lLWN0IDMJCTogaWQtc21pbWUtY3QtcHVibGlzaENlcnQKK2lkLXNtaW1lLWN0IDQJCTogaWQtc21pbWUtY3QtVFNUSW5mbworaWQtc21pbWUtY3QgNQkJOiBpZC1zbWltZS1jdC1URFRJbmZvCitpZC1zbWltZS1jdCA2CQk6IGlkLXNtaW1lLWN0LWNvbnRlbnRJbmZvCitpZC1zbWltZS1jdCA3CQk6IGlkLXNtaW1lLWN0LURWQ1NSZXF1ZXN0RGF0YQoraWQtc21pbWUtY3QgOAkJOiBpZC1zbWltZS1jdC1EVkNTUmVzcG9uc2VEYXRhCitpZC1zbWltZS1jdCA5CQk6IGlkLXNtaW1lLWN0LWNvbXByZXNzZWREYXRhCitpZC1zbWltZS1jdCAyNwkJOiBpZC1jdC1hc2NpaVRleHRXaXRoQ1JMRgorCisjIFMvTUlNRSBBdHRyaWJ1dGVzCitpZC1zbWltZS1hYSAxCQk6IGlkLXNtaW1lLWFhLXJlY2VpcHRSZXF1ZXN0CitpZC1zbWltZS1hYSAyCQk6IGlkLXNtaW1lLWFhLXNlY3VyaXR5TGFiZWwKK2lkLXNtaW1lLWFhIDMJCTogaWQtc21pbWUtYWEtbWxFeHBhbmRIaXN0b3J5CitpZC1zbWltZS1hYSA0CQk6IGlkLXNtaW1lLWFhLWNvbnRlbnRIaW50CitpZC1zbWltZS1hYSA1CQk6IGlkLXNtaW1lLWFhLW1zZ1NpZ0RpZ2VzdAorIyBvYnNvbGV0ZQoraWQtc21pbWUtYWEgNgkJOiBpZC1zbWltZS1hYS1lbmNhcENvbnRlbnRUeXBlCitpZC1zbWltZS1hYSA3CQk6IGlkLXNtaW1lLWFhLWNvbnRlbnRJZGVudGlmaWVyCisjIG9ic29sZXRlCitpZC1zbWltZS1hYSA4CQk6IGlkLXNtaW1lLWFhLW1hY1ZhbHVlCitpZC1zbWltZS1hYSA5CQk6IGlkLXNtaW1lLWFhLWVxdWl2YWxlbnRMYWJlbHMKK2lkLXNtaW1lLWFhIDEwCQk6IGlkLXNtaW1lLWFhLWNvbnRlbnRSZWZlcmVuY2UKK2lkLXNtaW1lLWFhIDExCQk6IGlkLXNtaW1lLWFhLWVuY3J5cEtleVByZWYKK2lkLXNtaW1lLWFhIDEyCQk6IGlkLXNtaW1lLWFhLXNpZ25pbmdDZXJ0aWZpY2F0ZQoraWQtc21pbWUtYWEgMTMJCTogaWQtc21pbWUtYWEtc21pbWVFbmNyeXB0Q2VydHMKK2lkLXNtaW1lLWFhIDE0CQk6IGlkLXNtaW1lLWFhLXRpbWVTdGFtcFRva2VuCitpZC1zbWltZS1hYSAxNQkJOiBpZC1zbWltZS1hYS1ldHMtc2lnUG9saWN5SWQKK2lkLXNtaW1lLWFhIDE2CQk6IGlkLXNtaW1lLWFhLWV0cy1jb21taXRtZW50VHlwZQoraWQtc21pbWUtYWEgMTcJCTogaWQtc21pbWUtYWEtZXRzLXNpZ25lckxvY2F0aW9uCitpZC1zbWltZS1hYSAxOAkJOiBpZC1zbWltZS1hYS1ldHMtc2lnbmVyQXR0cgoraWQtc21pbWUtYWEgMTkJCTogaWQtc21pbWUtYWEtZXRzLW90aGVyU2lnQ2VydAoraWQtc21pbWUtYWEgMjAJCTogaWQtc21pbWUtYWEtZXRzLWNvbnRlbnRUaW1lc3RhbXAKK2lkLXNtaW1lLWFhIDIxCQk6IGlkLXNtaW1lLWFhLWV0cy1DZXJ0aWZpY2F0ZVJlZnMKK2lkLXNtaW1lLWFhIDIyCQk6IGlkLXNtaW1lLWFhLWV0cy1SZXZvY2F0aW9uUmVmcworaWQtc21pbWUtYWEgMjMJCTogaWQtc21pbWUtYWEtZXRzLWNlcnRWYWx1ZXMKK2lkLXNtaW1lLWFhIDI0CQk6IGlkLXNtaW1lLWFhLWV0cy1yZXZvY2F0aW9uVmFsdWVzCitpZC1zbWltZS1hYSAyNQkJOiBpZC1zbWltZS1hYS1ldHMtZXNjVGltZVN0YW1wCitpZC1zbWltZS1hYSAyNgkJOiBpZC1zbWltZS1hYS1ldHMtY2VydENSTFRpbWVzdGFtcAoraWQtc21pbWUtYWEgMjcJCTogaWQtc21pbWUtYWEtZXRzLWFyY2hpdmVUaW1lU3RhbXAKK2lkLXNtaW1lLWFhIDI4CQk6IGlkLXNtaW1lLWFhLXNpZ25hdHVyZVR5cGUKK2lkLXNtaW1lLWFhIDI5CQk6IGlkLXNtaW1lLWFhLWR2Y3MtZHZjCisKKyMgUy9NSU1FIEFsZ29yaXRobSBJZGVudGlmaWVycworIyBvYnNvbGV0ZQoraWQtc21pbWUtYWxnIDEJCTogaWQtc21pbWUtYWxnLUVTREh3aXRoM0RFUworIyBvYnNvbGV0ZQoraWQtc21pbWUtYWxnIDIJCTogaWQtc21pbWUtYWxnLUVTREh3aXRoUkMyCisjIG9ic29sZXRlCitpZC1zbWltZS1hbGcgMwkJOiBpZC1zbWltZS1hbGctM0RFU3dyYXAKKyMgb2Jzb2xldGUKK2lkLXNtaW1lLWFsZyA0CQk6IGlkLXNtaW1lLWFsZy1SQzJ3cmFwCitpZC1zbWltZS1hbGcgNQkJOiBpZC1zbWltZS1hbGctRVNESAoraWQtc21pbWUtYWxnIDYJCTogaWQtc21pbWUtYWxnLUNNUzNERVN3cmFwCitpZC1zbWltZS1hbGcgNwkJOiBpZC1zbWltZS1hbGctQ01TUkMyd3JhcAoraWQtc21pbWUtYWxnIDkJCTogaWQtYWxnLVBXUkktS0VLCisKKyMgUy9NSU1FIENlcnRpZmljYXRlIERpc3RyaWJ1dGlvbgoraWQtc21pbWUtY2QgMQkJOiBpZC1zbWltZS1jZC1sZGFwCisKKyMgUy9NSU1FIFNpZ25hdHVyZSBQb2xpY3kgUXVhbGlmaWVyCitpZC1zbWltZS1zcHEgMQkJOiBpZC1zbWltZS1zcHEtZXRzLXNxdC11cmkKK2lkLXNtaW1lLXNwcSAyCQk6IGlkLXNtaW1lLXNwcS1ldHMtc3F0LXVub3RpY2UKKworIyBTL01JTUUgQ29tbWl0bWVudCBUeXBlIElkZW50aWZpZXIKK2lkLXNtaW1lLWN0aSAxCQk6IGlkLXNtaW1lLWN0aS1ldHMtcHJvb2ZPZk9yaWdpbgoraWQtc21pbWUtY3RpIDIJCTogaWQtc21pbWUtY3RpLWV0cy1wcm9vZk9mUmVjZWlwdAoraWQtc21pbWUtY3RpIDMJCTogaWQtc21pbWUtY3RpLWV0cy1wcm9vZk9mRGVsaXZlcnkKK2lkLXNtaW1lLWN0aSA0CQk6IGlkLXNtaW1lLWN0aS1ldHMtcHJvb2ZPZlNlbmRlcgoraWQtc21pbWUtY3RpIDUJCTogaWQtc21pbWUtY3RpLWV0cy1wcm9vZk9mQXBwcm92YWwKK2lkLXNtaW1lLWN0aSA2CQk6IGlkLXNtaW1lLWN0aS1ldHMtcHJvb2ZPZkNyZWF0aW9uCisKK3BrY3M5IDIwCQk6CQkJOiBmcmllbmRseU5hbWUKK3BrY3M5IDIxCQk6CQkJOiBsb2NhbEtleUlECishQ25hbWUgbXMtY3NwLW5hbWUKKzEgMyA2IDEgNCAxIDMxMSAxNyAxCTogQ1NQTmFtZQkJOiBNaWNyb3NvZnQgQ1NQIE5hbWUKKzEgMyA2IDEgNCAxIDMxMSAxNyAyCTogTG9jYWxLZXlTZXQJCTogTWljcm9zb2Z0IExvY2FsIEtleSBzZXQKKyFBbGlhcyBjZXJ0VHlwZXMgcGtjczkgMjIKK2NlcnRUeXBlcyAxCQk6CQkJOiB4NTA5Q2VydGlmaWNhdGUKK2NlcnRUeXBlcyAyCQk6CQkJOiBzZHNpQ2VydGlmaWNhdGUKKyFBbGlhcyBjcmxUeXBlcyBwa2NzOSAyMworY3JsVHlwZXMgMQkJOgkJCTogeDUwOUNybAorCishQWxpYXMgcGtjczEyIHBrY3MgMTIKKyFBbGlhcyBwa2NzMTItcGJlaWRzIHBrY3MxMiAxCisKKyFDbmFtZSBwYmUtV2l0aFNIQTFBbmQxMjhCaXRSQzQKK3BrY3MxMi1wYmVpZHMgMQkJOiBQQkUtU0hBMS1SQzQtMTI4CTogcGJlV2l0aFNIQTFBbmQxMjhCaXRSQzQKKyFDbmFtZSBwYmUtV2l0aFNIQTFBbmQ0MEJpdFJDNAorcGtjczEyLXBiZWlkcyAyCQk6IFBCRS1TSEExLVJDNC00MAk6IHBiZVdpdGhTSEExQW5kNDBCaXRSQzQKKyFDbmFtZSBwYmUtV2l0aFNIQTFBbmQzX0tleV9UcmlwbGVERVMtQ0JDCitwa2NzMTItcGJlaWRzIDMJCTogUEJFLVNIQTEtM0RFUwkJOiBwYmVXaXRoU0hBMUFuZDMtS2V5VHJpcGxlREVTLUNCQworIUNuYW1lIHBiZS1XaXRoU0hBMUFuZDJfS2V5X1RyaXBsZURFUy1DQkMKK3BrY3MxMi1wYmVpZHMgNAkJOiBQQkUtU0hBMS0yREVTCQk6IHBiZVdpdGhTSEExQW5kMi1LZXlUcmlwbGVERVMtQ0JDCishQ25hbWUgcGJlLVdpdGhTSEExQW5kMTI4Qml0UkMyLUNCQworcGtjczEyLXBiZWlkcyA1CQk6IFBCRS1TSEExLVJDMi0xMjgJOiBwYmVXaXRoU0hBMUFuZDEyOEJpdFJDMi1DQkMKKyFDbmFtZSBwYmUtV2l0aFNIQTFBbmQ0MEJpdFJDMi1DQkMKK3BrY3MxMi1wYmVpZHMgNgkJOiBQQkUtU0hBMS1SQzItNDAJOiBwYmVXaXRoU0hBMUFuZDQwQml0UkMyLUNCQworCishQWxpYXMgcGtjczEyLVZlcnNpb24xIHBrY3MxMiAxMAorIUFsaWFzIHBrY3MxMi1CYWdJZHMgcGtjczEyLVZlcnNpb24xIDEKK3BrY3MxMi1CYWdJZHMgMQkJOgkJCToga2V5QmFnCitwa2NzMTItQmFnSWRzIDIJCToJCQk6IHBrY3M4U2hyb3VkZWRLZXlCYWcKK3BrY3MxMi1CYWdJZHMgMwkJOgkJCTogY2VydEJhZworcGtjczEyLUJhZ0lkcyA0CQk6CQkJOiBjcmxCYWcKK3BrY3MxMi1CYWdJZHMgNQkJOgkJCTogc2VjcmV0QmFnCitwa2NzMTItQmFnSWRzIDYJCToJCQk6IHNhZmVDb250ZW50c0JhZworCityc2Fkc2kgMiAyCQk6IE1EMgkJCTogbWQyCityc2Fkc2kgMiA0CQk6IE1ENAkJCTogbWQ0Cityc2Fkc2kgMiA1CQk6IE1ENQkJCTogbWQ1CisJCQk6IE1ENS1TSEExCQk6IG1kNS1zaGExCityc2Fkc2kgMiA2CQk6CQkJOiBobWFjV2l0aE1ENQorcnNhZHNpIDIgNwkJOgkJCTogaG1hY1dpdGhTSEExCisKKyMgRnJvbSBSRkM0MjMxCityc2Fkc2kgMiA4CQk6CQkJOiBobWFjV2l0aFNIQTIyNAorcnNhZHNpIDIgOQkJOgkJCTogaG1hY1dpdGhTSEEyNTYKK3JzYWRzaSAyIDEwCQk6CQkJOiBobWFjV2l0aFNIQTM4NAorcnNhZHNpIDIgMTEJCToJCQk6IGhtYWNXaXRoU0hBNTEyCisKK3JzYWRzaSAzIDIJCTogUkMyLUNCQwkJOiByYzItY2JjCisJCQk6IFJDMi1FQ0IJCTogcmMyLWVjYgorIUNuYW1lIHJjMi1jZmI2NAorCQkJOiBSQzItQ0ZCCQk6IHJjMi1jZmIKKyFDbmFtZSByYzItb2ZiNjQKKwkJCTogUkMyLU9GQgkJOiByYzItb2ZiCisJCQk6IFJDMi00MC1DQkMJCTogcmMyLTQwLWNiYworCQkJOiBSQzItNjQtQ0JDCQk6IHJjMi02NC1jYmMKK3JzYWRzaSAzIDQJCTogUkM0CQkJOiByYzQKKwkJCTogUkM0LTQwCQk6IHJjNC00MAorcnNhZHNpIDMgNwkJOiBERVMtRURFMy1DQkMJCTogZGVzLWVkZTMtY2JjCityc2Fkc2kgMyA4CQk6IFJDNS1DQkMJCTogcmM1LWNiYworCQkJOiBSQzUtRUNCCQk6IHJjNS1lY2IKKyFDbmFtZSByYzUtY2ZiNjQKKwkJCTogUkM1LUNGQgkJOiByYzUtY2ZiCishQ25hbWUgcmM1LW9mYjY0CisJCQk6IFJDNS1PRkIJCTogcmM1LW9mYgorCishQ25hbWUgbXMtZXh0LXJlcQorMSAzIDYgMSA0IDEgMzExIDIgMSAxNAk6IG1zRXh0UmVxCQk6IE1pY3Jvc29mdCBFeHRlbnNpb24gUmVxdWVzdAorIUNuYW1lIG1zLWNvZGUtaW5kCisxIDMgNiAxIDQgMSAzMTEgMiAxIDIxCTogbXNDb2RlSW5kCQk6IE1pY3Jvc29mdCBJbmRpdmlkdWFsIENvZGUgU2lnbmluZworIUNuYW1lIG1zLWNvZGUtY29tCisxIDMgNiAxIDQgMSAzMTEgMiAxIDIyCTogbXNDb2RlQ29tCQk6IE1pY3Jvc29mdCBDb21tZXJjaWFsIENvZGUgU2lnbmluZworIUNuYW1lIG1zLWN0bC1zaWduCisxIDMgNiAxIDQgMSAzMTEgMTAgMyAxCTogbXNDVExTaWduCQk6IE1pY3Jvc29mdCBUcnVzdCBMaXN0IFNpZ25pbmcKKyFDbmFtZSBtcy1zZ2MKKzEgMyA2IDEgNCAxIDMxMSAxMCAzIDMJOiBtc1NHQwkJCTogTWljcm9zb2Z0IFNlcnZlciBHYXRlZCBDcnlwdG8KKyFDbmFtZSBtcy1lZnMKKzEgMyA2IDEgNCAxIDMxMSAxMCAzIDQJOiBtc0VGUwkJCTogTWljcm9zb2Z0IEVuY3J5cHRlZCBGaWxlIFN5c3RlbQorIUNuYW1lIG1zLXNtYXJ0Y2FyZC1sb2dpbgorMSAzIDYgMSA0IDEgMzExIDIwIDIgMgk6IG1zU21hcnRjYXJkTG9naW4JOiBNaWNyb3NvZnQgU21hcnRjYXJkbG9naW4KKyFDbmFtZSBtcy11cG4KKzEgMyA2IDEgNCAxIDMxMSAyMCAyIDMJOiBtc1VQTgkJCTogTWljcm9zb2Z0IFVuaXZlcnNhbCBQcmluY2lwYWwgTmFtZQorCisxIDMgNiAxIDQgMSAxODggNyAxIDEgMgk6IElERUEtQ0JDCQk6IGlkZWEtY2JjCisJCQk6IElERUEtRUNCCQk6IGlkZWEtZWNiCishQ25hbWUgaWRlYS1jZmI2NAorCQkJOiBJREVBLUNGQgkJOiBpZGVhLWNmYgorIUNuYW1lIGlkZWEtb2ZiNjQKKwkJCTogSURFQS1PRkIJCTogaWRlYS1vZmIKKworMSAzIDYgMSA0IDEgMzAyOSAxIDIJOiBCRi1DQkMJCTogYmYtY2JjCisJCQk6IEJGLUVDQgkJOiBiZi1lY2IKKyFDbmFtZSBiZi1jZmI2NAorCQkJOiBCRi1DRkIJCTogYmYtY2ZiCishQ25hbWUgYmYtb2ZiNjQKKwkJCTogQkYtT0ZCCQk6IGJmLW9mYgorCishQ25hbWUgaWQtcGtpeAorMSAzIDYgMSA1IDUgNwkJOiBQS0lYCisKKyMgUEtJWCBBcmNzCitpZC1wa2l4IDAJCTogaWQtcGtpeC1tb2QKK2lkLXBraXggMQkJOiBpZC1wZQoraWQtcGtpeCAyCQk6IGlkLXF0CitpZC1wa2l4IDMJCTogaWQta3AKK2lkLXBraXggNAkJOiBpZC1pdAoraWQtcGtpeCA1CQk6IGlkLXBraXAKK2lkLXBraXggNgkJOiBpZC1hbGcKK2lkLXBraXggNwkJOiBpZC1jbWMKK2lkLXBraXggOAkJOiBpZC1vbgoraWQtcGtpeCA5CQk6IGlkLXBkYQoraWQtcGtpeCAxMAkJOiBpZC1hY2EKK2lkLXBraXggMTEJCTogaWQtcWNzCitpZC1wa2l4IDEyCQk6IGlkLWNjdAoraWQtcGtpeCAyMQkJOiBpZC1wcGwKK2lkLXBraXggNDgJCTogaWQtYWQKKworIyBQS0lYIE1vZHVsZXMKK2lkLXBraXgtbW9kIDEJCTogaWQtcGtpeDEtZXhwbGljaXQtODgKK2lkLXBraXgtbW9kIDIJCTogaWQtcGtpeDEtaW1wbGljaXQtODgKK2lkLXBraXgtbW9kIDMJCTogaWQtcGtpeDEtZXhwbGljaXQtOTMKK2lkLXBraXgtbW9kIDQJCTogaWQtcGtpeDEtaW1wbGljaXQtOTMKK2lkLXBraXgtbW9kIDUJCTogaWQtbW9kLWNybWYKK2lkLXBraXgtbW9kIDYJCTogaWQtbW9kLWNtYworaWQtcGtpeC1tb2QgNwkJOiBpZC1tb2Qta2VhLXByb2ZpbGUtODgKK2lkLXBraXgtbW9kIDgJCTogaWQtbW9kLWtlYS1wcm9maWxlLTkzCitpZC1wa2l4LW1vZCA5CQk6IGlkLW1vZC1jbXAKK2lkLXBraXgtbW9kIDEwCQk6IGlkLW1vZC1xdWFsaWZpZWQtY2VydC04OAoraWQtcGtpeC1tb2QgMTEJCTogaWQtbW9kLXF1YWxpZmllZC1jZXJ0LTkzCitpZC1wa2l4LW1vZCAxMgkJOiBpZC1tb2QtYXR0cmlidXRlLWNlcnQKK2lkLXBraXgtbW9kIDEzCQk6IGlkLW1vZC10aW1lc3RhbXAtcHJvdG9jb2wKK2lkLXBraXgtbW9kIDE0CQk6IGlkLW1vZC1vY3NwCitpZC1wa2l4LW1vZCAxNQkJOiBpZC1tb2QtZHZjcworaWQtcGtpeC1tb2QgMTYJCTogaWQtbW9kLWNtcDIwMDAKKworIyBQS0lYIFByaXZhdGUgRXh0ZW5zaW9ucworIUNuYW1lIGluZm8tYWNjZXNzCitpZC1wZSAxCQkJOiBhdXRob3JpdHlJbmZvQWNjZXNzCTogQXV0aG9yaXR5IEluZm9ybWF0aW9uIEFjY2VzcworaWQtcGUgMgkJCTogYmlvbWV0cmljSW5mbwkJOiBCaW9tZXRyaWMgSW5mbworaWQtcGUgMwkJCTogcWNTdGF0ZW1lbnRzCitpZC1wZSA0CQkJOiBhYy1hdWRpdEVudGl0eQoraWQtcGUgNQkJCTogYWMtdGFyZ2V0aW5nCitpZC1wZSA2CQkJOiBhYUNvbnRyb2xzCitpZC1wZSA3CQkJOiBzYmdwLWlwQWRkckJsb2NrCitpZC1wZSA4CQkJOiBzYmdwLWF1dG9ub21vdXNTeXNOdW0KK2lkLXBlIDkJCQk6IHNiZ3Atcm91dGVySWRlbnRpZmllcgoraWQtcGUgMTAJCTogYWMtcHJveHlpbmcKKyFDbmFtZSBzaW5mby1hY2Nlc3MKK2lkLXBlIDExCQk6IHN1YmplY3RJbmZvQWNjZXNzCTogU3ViamVjdCBJbmZvcm1hdGlvbiBBY2Nlc3MKK2lkLXBlIDE0CQk6IHByb3h5Q2VydEluZm8JCTogUHJveHkgQ2VydGlmaWNhdGUgSW5mb3JtYXRpb24KKworIyBQS0lYIHBvbGljeVF1YWxpZmllcnMgZm9yIEludGVybmV0IHBvbGljeSBxdWFsaWZpZXJzCitpZC1xdCAxCQkJOiBpZC1xdC1jcHMJCTogUG9saWN5IFF1YWxpZmllciBDUFMKK2lkLXF0IDIJCQk6IGlkLXF0LXVub3RpY2UJCTogUG9saWN5IFF1YWxpZmllciBVc2VyIE5vdGljZQoraWQtcXQgMwkJCTogdGV4dE5vdGljZQorCisjIFBLSVgga2V5IHB1cnBvc2UgaWRlbnRpZmllcnMKKyFDbmFtZSBzZXJ2ZXItYXV0aAoraWQta3AgMQkJCTogc2VydmVyQXV0aAkJOiBUTFMgV2ViIFNlcnZlciBBdXRoZW50aWNhdGlvbgorIUNuYW1lIGNsaWVudC1hdXRoCitpZC1rcCAyCQkJOiBjbGllbnRBdXRoCQk6IFRMUyBXZWIgQ2xpZW50IEF1dGhlbnRpY2F0aW9uCishQ25hbWUgY29kZS1zaWduCitpZC1rcCAzCQkJOiBjb2RlU2lnbmluZwkJOiBDb2RlIFNpZ25pbmcKKyFDbmFtZSBlbWFpbC1wcm90ZWN0CitpZC1rcCA0CQkJOiBlbWFpbFByb3RlY3Rpb24JOiBFLW1haWwgUHJvdGVjdGlvbgoraWQta3AgNQkJCTogaXBzZWNFbmRTeXN0ZW0JOiBJUFNlYyBFbmQgU3lzdGVtCitpZC1rcCA2CQkJOiBpcHNlY1R1bm5lbAkJOiBJUFNlYyBUdW5uZWwKK2lkLWtwIDcJCQk6IGlwc2VjVXNlcgkJOiBJUFNlYyBVc2VyCishQ25hbWUgdGltZS1zdGFtcAoraWQta3AgOAkJCTogdGltZVN0YW1waW5nCQk6IFRpbWUgU3RhbXBpbmcKKyMgRnJvbSBPQ1NQIHNwZWMgUkZDMjU2MAorIUNuYW1lIE9DU1Atc2lnbgoraWQta3AgOQkJCTogT0NTUFNpZ25pbmcJCTogT0NTUCBTaWduaW5nCitpZC1rcCAxMAkJOiBEVkNTCQkJOiBkdmNzCisKKyMgQ01QIGluZm9ybWF0aW9uIHR5cGVzCitpZC1pdCAxCQkJOiBpZC1pdC1jYVByb3RFbmNDZXJ0CitpZC1pdCAyCQkJOiBpZC1pdC1zaWduS2V5UGFpclR5cGVzCitpZC1pdCAzCQkJOiBpZC1pdC1lbmNLZXlQYWlyVHlwZXMKK2lkLWl0IDQJCQk6IGlkLWl0LXByZWZlcnJlZFN5bW1BbGcKK2lkLWl0IDUJCQk6IGlkLWl0LWNhS2V5VXBkYXRlSW5mbworaWQtaXQgNgkJCTogaWQtaXQtY3VycmVudENSTAoraWQtaXQgNwkJCTogaWQtaXQtdW5zdXBwb3J0ZWRPSURzCisjIG9ic29sZXRlCitpZC1pdCA4CQkJOiBpZC1pdC1zdWJzY3JpcHRpb25SZXF1ZXN0CisjIG9ic29sZXRlCitpZC1pdCA5CQkJOiBpZC1pdC1zdWJzY3JpcHRpb25SZXNwb25zZQoraWQtaXQgMTAJCTogaWQtaXQta2V5UGFpclBhcmFtUmVxCitpZC1pdCAxMQkJOiBpZC1pdC1rZXlQYWlyUGFyYW1SZXAKK2lkLWl0IDEyCQk6IGlkLWl0LXJldlBhc3NwaHJhc2UKK2lkLWl0IDEzCQk6IGlkLWl0LWltcGxpY2l0Q29uZmlybQoraWQtaXQgMTQJCTogaWQtaXQtY29uZmlybVdhaXRUaW1lCitpZC1pdCAxNQkJOiBpZC1pdC1vcmlnUEtJTWVzc2FnZQoraWQtaXQgMTYJCTogaWQtaXQtc3VwcExhbmdUYWdzCisKKyMgQ1JNRiByZWdpc3RyYXRpb24KK2lkLXBraXAgMQkJOiBpZC1yZWdDdHJsCitpZC1wa2lwIDIJCTogaWQtcmVnSW5mbworCisjIENSTUYgcmVnaXN0cmF0aW9uIGNvbnRyb2xzCitpZC1yZWdDdHJsIDEJCTogaWQtcmVnQ3RybC1yZWdUb2tlbgoraWQtcmVnQ3RybCAyCQk6IGlkLXJlZ0N0cmwtYXV0aGVudGljYXRvcgoraWQtcmVnQ3RybCAzCQk6IGlkLXJlZ0N0cmwtcGtpUHVibGljYXRpb25JbmZvCitpZC1yZWdDdHJsIDQJCTogaWQtcmVnQ3RybC1wa2lBcmNoaXZlT3B0aW9ucworaWQtcmVnQ3RybCA1CQk6IGlkLXJlZ0N0cmwtb2xkQ2VydElECitpZC1yZWdDdHJsIDYJCTogaWQtcmVnQ3RybC1wcm90b2NvbEVuY3JLZXkKKworIyBDUk1GIHJlZ2lzdHJhdGlvbiBpbmZvcm1hdGlvbgoraWQtcmVnSW5mbyAxCQk6IGlkLXJlZ0luZm8tdXRmOFBhaXJzCitpZC1yZWdJbmZvIDIJCTogaWQtcmVnSW5mby1jZXJ0UmVxCisKKyMgYWxnb3JpdGhtcworaWQtYWxnIDEJCTogaWQtYWxnLWRlczQwCitpZC1hbGcgMgkJOiBpZC1hbGctbm9TaWduYXR1cmUKK2lkLWFsZyAzCQk6IGlkLWFsZy1kaC1zaWctaG1hYy1zaGExCitpZC1hbGcgNAkJOiBpZC1hbGctZGgtcG9wCisKKyMgQ01DIGNvbnRyb2xzCitpZC1jbWMgMQkJOiBpZC1jbWMtc3RhdHVzSW5mbworaWQtY21jIDIJCTogaWQtY21jLWlkZW50aWZpY2F0aW9uCitpZC1jbWMgMwkJOiBpZC1jbWMtaWRlbnRpdHlQcm9vZgoraWQtY21jIDQJCTogaWQtY21jLWRhdGFSZXR1cm4KK2lkLWNtYyA1CQk6IGlkLWNtYy10cmFuc2FjdGlvbklkCitpZC1jbWMgNgkJOiBpZC1jbWMtc2VuZGVyTm9uY2UKK2lkLWNtYyA3CQk6IGlkLWNtYy1yZWNpcGllbnROb25jZQoraWQtY21jIDgJCTogaWQtY21jLWFkZEV4dGVuc2lvbnMKK2lkLWNtYyA5CQk6IGlkLWNtYy1lbmNyeXB0ZWRQT1AKK2lkLWNtYyAxMAkJOiBpZC1jbWMtZGVjcnlwdGVkUE9QCitpZC1jbWMgMTEJCTogaWQtY21jLWxyYVBPUFdpdG5lc3MKK2lkLWNtYyAxNQkJOiBpZC1jbWMtZ2V0Q2VydAoraWQtY21jIDE2CQk6IGlkLWNtYy1nZXRDUkwKK2lkLWNtYyAxNwkJOiBpZC1jbWMtcmV2b2tlUmVxdWVzdAoraWQtY21jIDE4CQk6IGlkLWNtYy1yZWdJbmZvCitpZC1jbWMgMTkJCTogaWQtY21jLXJlc3BvbnNlSW5mbworaWQtY21jIDIxCQk6IGlkLWNtYy1xdWVyeVBlbmRpbmcKK2lkLWNtYyAyMgkJOiBpZC1jbWMtcG9wTGlua1JhbmRvbQoraWQtY21jIDIzCQk6IGlkLWNtYy1wb3BMaW5rV2l0bmVzcworaWQtY21jIDI0CQk6IGlkLWNtYy1jb25maXJtQ2VydEFjY2VwdGFuY2UgCisKKyMgb3RoZXIgbmFtZXMKK2lkLW9uIDEJCQk6IGlkLW9uLXBlcnNvbmFsRGF0YQoraWQtb24gMwkJCTogaWQtb24tcGVybWFuZW50SWRlbnRpZmllciA6IFBlcm1hbmVudCBJZGVudGlmaWVyCisKKyMgcGVyc29uYWwgZGF0YSBhdHRyaWJ1dGVzCitpZC1wZGEgMQkJOiBpZC1wZGEtZGF0ZU9mQmlydGgKK2lkLXBkYSAyCQk6IGlkLXBkYS1wbGFjZU9mQmlydGgKK2lkLXBkYSAzCQk6IGlkLXBkYS1nZW5kZXIKK2lkLXBkYSA0CQk6IGlkLXBkYS1jb3VudHJ5T2ZDaXRpemVuc2hpcAoraWQtcGRhIDUJCTogaWQtcGRhLWNvdW50cnlPZlJlc2lkZW5jZQorCisjIGF0dHJpYnV0ZSBjZXJ0aWZpY2F0ZSBhdHRyaWJ1dGVzCitpZC1hY2EgMQkJOiBpZC1hY2EtYXV0aGVudGljYXRpb25JbmZvCitpZC1hY2EgMgkJOiBpZC1hY2EtYWNjZXNzSWRlbnRpdHkKK2lkLWFjYSAzCQk6IGlkLWFjYS1jaGFyZ2luZ0lkZW50aXR5CitpZC1hY2EgNAkJOiBpZC1hY2EtZ3JvdXAKKyMgYXR0ZW50aW9uIDogdGhlIGZvbGxvd2luZyBzZWVtcyB0byBiZSBvYnNvbGV0ZSwgcmVwbGFjZSBieSAncm9sZScKK2lkLWFjYSA1CQk6IGlkLWFjYS1yb2xlCitpZC1hY2EgNgkJOiBpZC1hY2EtZW5jQXR0cnMKKworIyBxdWFsaWZpZWQgY2VydGlmaWNhdGUgc3RhdGVtZW50cworaWQtcWNzIDEJCTogaWQtcWNzLXBraXhRQ1N5bnRheC12MQorCisjIENNQyBjb250ZW50IHR5cGVzCitpZC1jY3QgMQkJOiBpZC1jY3QtY3JzCitpZC1jY3QgMgkJOiBpZC1jY3QtUEtJRGF0YQoraWQtY2N0IDMJCTogaWQtY2N0LVBLSVJlc3BvbnNlCisKKyMgUHJlZGVmaW5lZCBQcm94eSBDZXJ0aWZpY2F0ZSBwb2xpY3kgbGFuZ3VhZ2VzCitpZC1wcGwgMAkJOiBpZC1wcGwtYW55TGFuZ3VhZ2UJOiBBbnkgbGFuZ3VhZ2UKK2lkLXBwbCAxCQk6IGlkLXBwbC1pbmhlcml0QWxsCTogSW5oZXJpdCBhbGwKK2lkLXBwbCAyCQk6IGlkLXBwbC1pbmRlcGVuZGVudAk6IEluZGVwZW5kZW50CisKKyMgYWNjZXNzIGRlc2NyaXB0b3JzIGZvciBhdXRob3JpdHkgaW5mbyBhY2Nlc3MgZXh0ZW5zaW9uCishQ25hbWUgYWQtT0NTUAoraWQtYWQgMQkJCTogT0NTUAkJCTogT0NTUAorIUNuYW1lIGFkLWNhLWlzc3VlcnMKK2lkLWFkIDIJCQk6IGNhSXNzdWVycwkJOiBDQSBJc3N1ZXJzCishQ25hbWUgYWQtdGltZVN0YW1waW5nCitpZC1hZCAzCQkJOiBhZF90aW1lc3RhbXBpbmcJOiBBRCBUaW1lIFN0YW1waW5nCishQ25hbWUgYWQtZHZjcworaWQtYWQgNAkJCTogQURfRFZDUwkJOiBhZCBkdmNzCitpZC1hZCA1CQkJOiBjYVJlcG9zaXRvcnkJCTogQ0EgUmVwb3NpdG9yeQorCisKKyFBbGlhcyBpZC1wa2l4LU9DU1AgYWQtT0NTUAorIW1vZHVsZSBpZC1wa2l4LU9DU1AKKyFDbmFtZSBiYXNpYworaWQtcGtpeC1PQ1NQIDEJCTogYmFzaWNPQ1NQUmVzcG9uc2UJOiBCYXNpYyBPQ1NQIFJlc3BvbnNlCitpZC1wa2l4LU9DU1AgMgkJOiBOb25jZQkJCTogT0NTUCBOb25jZQoraWQtcGtpeC1PQ1NQIDMJCTogQ3JsSUQJCQk6IE9DU1AgQ1JMIElECitpZC1wa2l4LU9DU1AgNAkJOiBhY2NlcHRhYmxlUmVzcG9uc2VzCTogQWNjZXB0YWJsZSBPQ1NQIFJlc3BvbnNlcworaWQtcGtpeC1PQ1NQIDUJCTogbm9DaGVjawkJOiBPQ1NQIE5vIENoZWNrCitpZC1wa2l4LU9DU1AgNgkJOiBhcmNoaXZlQ3V0b2ZmCQk6IE9DU1AgQXJjaGl2ZSBDdXRvZmYKK2lkLXBraXgtT0NTUCA3CQk6IHNlcnZpY2VMb2NhdG9yCTogT0NTUCBTZXJ2aWNlIExvY2F0b3IKK2lkLXBraXgtT0NTUCA4CQk6IGV4dGVuZGVkU3RhdHVzCTogRXh0ZW5kZWQgT0NTUCBTdGF0dXMKK2lkLXBraXgtT0NTUCA5CQk6IHZhbGlkCitpZC1wa2l4LU9DU1AgMTAJCTogcGF0aAoraWQtcGtpeC1PQ1NQIDExCQk6IHRydXN0Um9vdAkJOiBUcnVzdCBSb290CishZ2xvYmFsCisKKzEgMyAxNCAzIDIJCTogYWxnb3JpdGhtCQk6IGFsZ29yaXRobQorYWxnb3JpdGhtIDMJCTogUlNBLU5QLU1ENQkJOiBtZDVXaXRoUlNBCithbGdvcml0aG0gNgkJOiBERVMtRUNCCQk6IGRlcy1lY2IKK2FsZ29yaXRobSA3CQk6IERFUy1DQkMJCTogZGVzLWNiYworIUNuYW1lIGRlcy1vZmI2NAorYWxnb3JpdGhtIDgJCTogREVTLU9GQgkJOiBkZXMtb2ZiCishQ25hbWUgZGVzLWNmYjY0CithbGdvcml0aG0gOQkJOiBERVMtQ0ZCCQk6IGRlcy1jZmIKK2FsZ29yaXRobSAxMQkJOiByc2FTaWduYXR1cmUKKyFDbmFtZSBkc2EtMgorYWxnb3JpdGhtIDEyCQk6IERTQS1vbGQJCTogZHNhRW5jcnlwdGlvbi1vbGQKK2FsZ29yaXRobSAxMwkJOiBEU0EtU0hBCQk6IGRzYVdpdGhTSEEKK2FsZ29yaXRobSAxNQkJOiBSU0EtU0hBCQk6IHNoYVdpdGhSU0FFbmNyeXB0aW9uCishQ25hbWUgZGVzLWVkZS1lY2IKK2FsZ29yaXRobSAxNwkJOiBERVMtRURFCQk6IGRlcy1lZGUKKyFDbmFtZSBkZXMtZWRlMy1lY2IKKwkJCTogREVTLUVERTMJCTogZGVzLWVkZTMKKwkJCTogREVTLUVERS1DQkMJCTogZGVzLWVkZS1jYmMKKyFDbmFtZSBkZXMtZWRlLWNmYjY0CisJCQk6IERFUy1FREUtQ0ZCCQk6IGRlcy1lZGUtY2ZiCishQ25hbWUgZGVzLWVkZTMtY2ZiNjQKKwkJCTogREVTLUVERTMtQ0ZCCQk6IGRlcy1lZGUzLWNmYgorIUNuYW1lIGRlcy1lZGUtb2ZiNjQKKwkJCTogREVTLUVERS1PRkIJCTogZGVzLWVkZS1vZmIKKyFDbmFtZSBkZXMtZWRlMy1vZmI2NAorCQkJOiBERVMtRURFMy1PRkIJCTogZGVzLWVkZTMtb2ZiCisJCQk6IERFU1gtQ0JDCQk6IGRlc3gtY2JjCithbGdvcml0aG0gMTgJCTogU0hBCQkJOiBzaGEKK2FsZ29yaXRobSAyNgkJOiBTSEExCQkJOiBzaGExCishQ25hbWUgZHNhV2l0aFNIQTEtMgorYWxnb3JpdGhtIDI3CQk6IERTQS1TSEExLW9sZAkJOiBkc2FXaXRoU0hBMS1vbGQKK2FsZ29yaXRobSAyOQkJOiBSU0EtU0hBMS0yCQk6IHNoYTFXaXRoUlNBCisKKzEgMyAzNiAzIDIgMQkJOiBSSVBFTUQxNjAJCTogcmlwZW1kMTYwCisxIDMgMzYgMyAzIDEgMgkJOiBSU0EtUklQRU1EMTYwCQk6IHJpcGVtZDE2MFdpdGhSU0EKKworIUNuYW1lIHN4bmV0CisxIDMgMTAxIDEgNCAxCQk6IFNYTmV0SUQJCTogU3Ryb25nIEV4dHJhbmV0IElECisKKzIgNQkJCTogWDUwMAkJCTogZGlyZWN0b3J5IHNlcnZpY2VzIChYLjUwMCkKKworWDUwMCA0CQkJOiBYNTA5CitYNTA5IDMJCQk6IENOCQkJOiBjb21tb25OYW1lCitYNTA5IDQJCQk6IFNOCQkJOiBzdXJuYW1lCitYNTA5IDUJCQk6IAkJCTogc2VyaWFsTnVtYmVyCitYNTA5IDYJCQk6IEMJCQk6IGNvdW50cnlOYW1lCitYNTA5IDcJCQk6IEwJCQk6IGxvY2FsaXR5TmFtZQorWDUwOSA4CQkJOiBTVAkJCTogc3RhdGVPclByb3ZpbmNlTmFtZQorWDUwOSA5CQkJOiBzdHJlZXQJCTogc3RyZWV0QWRkcmVzcworWDUwOSAxMAkJCTogTwkJCTogb3JnYW5pemF0aW9uTmFtZQorWDUwOSAxMQkJCTogT1UJCQk6IG9yZ2FuaXphdGlvbmFsVW5pdE5hbWUKK1g1MDkgMTIJCQk6IHRpdGxlCQkJOiB0aXRsZQorWDUwOSAxMwkJCTogCQkJOiBkZXNjcmlwdGlvbgorWDUwOSAxNAkJCTogCQkJOiBzZWFyY2hHdWlkZQorWDUwOSAxNQkJCTogCQkJOiBidXNpbmVzc0NhdGVnb3J5CitYNTA5IDE2CQkJOiAJCQk6IHBvc3RhbEFkZHJlc3MKK1g1MDkgMTcJCQk6IAkJCTogcG9zdGFsQ29kZQorWDUwOSAxOAkJCTogCQkJOiBwb3N0T2ZmaWNlQm94CitYNTA5IDE5CQkJOiAJCQk6IHBoeXNpY2FsRGVsaXZlcnlPZmZpY2VOYW1lCitYNTA5IDIwCQkJOiAJCQk6IHRlbGVwaG9uZU51bWJlcgorWDUwOSAyMQkJCTogCQkJOiB0ZWxleE51bWJlcgorWDUwOSAyMgkJCTogCQkJOiB0ZWxldGV4VGVybWluYWxJZGVudGlmaWVyCitYNTA5IDIzCQkJOiAJCQk6IGZhY3NpbWlsZVRlbGVwaG9uZU51bWJlcgorWDUwOSAyNAkJCTogCQkJOiB4MTIxQWRkcmVzcworWDUwOSAyNQkJCTogCQkJOiBpbnRlcm5hdGlvbmFsaVNETk51bWJlcgorWDUwOSAyNgkJCTogCQkJOiByZWdpc3RlcmVkQWRkcmVzcworWDUwOSAyNwkJCTogCQkJOiBkZXN0aW5hdGlvbkluZGljYXRvcgorWDUwOSAyOAkJCTogCQkJOiBwcmVmZXJyZWREZWxpdmVyeU1ldGhvZAorWDUwOSAyOQkJCTogCQkJOiBwcmVzZW50YXRpb25BZGRyZXNzCitYNTA5IDMwCQkJOiAJCQk6IHN1cHBvcnRlZEFwcGxpY2F0aW9uQ29udGV4dAorWDUwOSAzMQkJCTogbWVtYmVyCQk6CitYNTA5IDMyCQkJOiBvd25lcgkJCToKK1g1MDkgMzMJCQk6IAkJCTogcm9sZU9jY3VwYW50CitYNTA5IDM0CQkJOiBzZWVBbHNvCQk6CitYNTA5IDM1CQkJOiAJCQk6IHVzZXJQYXNzd29yZAorWDUwOSAzNgkJCTogCQkJOiB1c2VyQ2VydGlmaWNhdGUKK1g1MDkgMzcJCQk6IAkJCTogY0FDZXJ0aWZpY2F0ZQorWDUwOSAzOAkJCTogCQkJOiBhdXRob3JpdHlSZXZvY2F0aW9uTGlzdAorWDUwOSAzOQkJCTogCQkJOiBjZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0CitYNTA5IDQwCQkJOiAJCQk6IGNyb3NzQ2VydGlmaWNhdGVQYWlyCitYNTA5IDQxCQkJOiBuYW1lCQkJOiBuYW1lCitYNTA5IDQyCQkJOiBHTgkJCTogZ2l2ZW5OYW1lCitYNTA5IDQzCQkJOiBpbml0aWFscwkJOiBpbml0aWFscworWDUwOSA0NAkJCTogCQkJOiBnZW5lcmF0aW9uUXVhbGlmaWVyCitYNTA5IDQ1CQkJOiAJCQk6IHg1MDBVbmlxdWVJZGVudGlmaWVyCitYNTA5IDQ2CQkJOiBkblF1YWxpZmllcgkJOiBkblF1YWxpZmllcgorWDUwOSA0NwkJCTogCQkJOiBlbmhhbmNlZFNlYXJjaEd1aWRlCitYNTA5IDQ4CQkJOiAJCQk6IHByb3RvY29sSW5mb3JtYXRpb24KK1g1MDkgNDkJCQk6IAkJCTogZGlzdGluZ3Vpc2hlZE5hbWUKK1g1MDkgNTAJCQk6IAkJCTogdW5pcXVlTWVtYmVyCitYNTA5IDUxCQkJOiAJCQk6IGhvdXNlSWRlbnRpZmllcgorWDUwOSA1MgkJCTogCQkJOiBzdXBwb3J0ZWRBbGdvcml0aG1zCitYNTA5IDUzCQkJOiAJCQk6IGRlbHRhUmV2b2NhdGlvbkxpc3QKK1g1MDkgNTQJCQk6IGRtZE5hbWUJCToKK1g1MDkgNjUJCQk6CQkJOiBwc2V1ZG9ueW0KK1g1MDkgNzIJCQk6IHJvbGUJCQk6IHJvbGUKKworWDUwMCA4CQkJOiBYNTAwYWxnb3JpdGhtcwk6IGRpcmVjdG9yeSBzZXJ2aWNlcyAtIGFsZ29yaXRobXMKK1g1MDBhbGdvcml0aG1zIDEgMQk6IFJTQQkJCTogcnNhCitYNTAwYWxnb3JpdGhtcyAzIDEwMAk6IFJTQS1NREMyCQk6IG1kYzJXaXRoUlNBCitYNTAwYWxnb3JpdGhtcyAzIDEwMQk6IE1EQzIJCQk6IG1kYzIKKworWDUwMCAyOQkJCTogaWQtY2UKKyFDbmFtZSBzdWJqZWN0LWRpcmVjdG9yeS1hdHRyaWJ1dGVzCitpZC1jZSA5CQkJOiBzdWJqZWN0RGlyZWN0b3J5QXR0cmlidXRlcyA6IFg1MDl2MyBTdWJqZWN0IERpcmVjdG9yeSBBdHRyaWJ1dGVzCishQ25hbWUgc3ViamVjdC1rZXktaWRlbnRpZmllcgoraWQtY2UgMTQJCTogc3ViamVjdEtleUlkZW50aWZpZXIJOiBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcgorIUNuYW1lIGtleS11c2FnZQoraWQtY2UgMTUJCToga2V5VXNhZ2UJCTogWDUwOXYzIEtleSBVc2FnZQorIUNuYW1lIHByaXZhdGUta2V5LXVzYWdlLXBlcmlvZAoraWQtY2UgMTYJCTogcHJpdmF0ZUtleVVzYWdlUGVyaW9kCTogWDUwOXYzIFByaXZhdGUgS2V5IFVzYWdlIFBlcmlvZAorIUNuYW1lIHN1YmplY3QtYWx0LW5hbWUKK2lkLWNlIDE3CQk6IHN1YmplY3RBbHROYW1lCTogWDUwOXYzIFN1YmplY3QgQWx0ZXJuYXRpdmUgTmFtZQorIUNuYW1lIGlzc3Vlci1hbHQtbmFtZQoraWQtY2UgMTgJCTogaXNzdWVyQWx0TmFtZQkJOiBYNTA5djMgSXNzdWVyIEFsdGVybmF0aXZlIE5hbWUKKyFDbmFtZSBiYXNpYy1jb25zdHJhaW50cworaWQtY2UgMTkJCTogYmFzaWNDb25zdHJhaW50cwk6IFg1MDl2MyBCYXNpYyBDb25zdHJhaW50cworIUNuYW1lIGNybC1udW1iZXIKK2lkLWNlIDIwCQk6IGNybE51bWJlcgkJOiBYNTA5djMgQ1JMIE51bWJlcgorIUNuYW1lIGNybC1yZWFzb24KK2lkLWNlIDIxCQk6IENSTFJlYXNvbgkJOiBYNTA5djMgQ1JMIFJlYXNvbiBDb2RlCishQ25hbWUgaW52YWxpZGl0eS1kYXRlCitpZC1jZSAyNAkJOiBpbnZhbGlkaXR5RGF0ZQk6IEludmFsaWRpdHkgRGF0ZQorIUNuYW1lIGRlbHRhLWNybAoraWQtY2UgMjcJCTogZGVsdGFDUkwJCTogWDUwOXYzIERlbHRhIENSTCBJbmRpY2F0b3IKKyFDbmFtZSBpc3N1aW5nLWRpc3RyaWJ1dGlvbi1wb2ludAoraWQtY2UgMjgJCTogaXNzdWluZ0Rpc3RyaWJ1dGlvblBvaW50IDogWDUwOXYzIElzc3VpbmcgRGlzdHJ1YnV0aW9uIFBvaW50CishQ25hbWUgY2VydGlmaWNhdGUtaXNzdWVyCitpZC1jZSAyOQkJOiBjZXJ0aWZpY2F0ZUlzc3Vlcgk6IFg1MDl2MyBDZXJ0aWZpY2F0ZSBJc3N1ZXIKKyFDbmFtZSBuYW1lLWNvbnN0cmFpbnRzCitpZC1jZSAzMAkJOiBuYW1lQ29uc3RyYWludHMJOiBYNTA5djMgTmFtZSBDb25zdHJhaW50cworIUNuYW1lIGNybC1kaXN0cmlidXRpb24tcG9pbnRzCitpZC1jZSAzMQkJOiBjcmxEaXN0cmlidXRpb25Qb2ludHMJOiBYNTA5djMgQ1JMIERpc3RyaWJ1dGlvbiBQb2ludHMKKyFDbmFtZSBjZXJ0aWZpY2F0ZS1wb2xpY2llcworaWQtY2UgMzIJCTogY2VydGlmaWNhdGVQb2xpY2llcwk6IFg1MDl2MyBDZXJ0aWZpY2F0ZSBQb2xpY2llcworIUNuYW1lIGFueS1wb2xpY3kKK2NlcnRpZmljYXRlLXBvbGljaWVzIDAJOiBhbnlQb2xpY3kJCTogWDUwOXYzIEFueSBQb2xpY3kKKyFDbmFtZSBwb2xpY3ktbWFwcGluZ3MKK2lkLWNlIDMzCQk6IHBvbGljeU1hcHBpbmdzCTogWDUwOXYzIFBvbGljeSBNYXBwaW5ncworIUNuYW1lIGF1dGhvcml0eS1rZXktaWRlbnRpZmllcgoraWQtY2UgMzUJCTogYXV0aG9yaXR5S2V5SWRlbnRpZmllciA6IFg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXIKKyFDbmFtZSBwb2xpY3ktY29uc3RyYWludHMKK2lkLWNlIDM2CQk6IHBvbGljeUNvbnN0cmFpbnRzCTogWDUwOXYzIFBvbGljeSBDb25zdHJhaW50cworIUNuYW1lIGV4dC1rZXktdXNhZ2UKK2lkLWNlIDM3CQk6IGV4dGVuZGVkS2V5VXNhZ2UJOiBYNTA5djMgRXh0ZW5kZWQgS2V5IFVzYWdlCishQ25hbWUgZnJlc2hlc3QtY3JsCitpZC1jZSA0NgkJOiBmcmVzaGVzdENSTAkJOiBYNTA5djMgRnJlc2hlc3QgQ1JMCishQ25hbWUgaW5oaWJpdC1hbnktcG9saWN5CitpZC1jZSA1NAkJOiBpbmhpYml0QW55UG9saWN5CTogWDUwOXYzIEluaGliaXQgQW55IFBvbGljeQorIUNuYW1lIHRhcmdldC1pbmZvcm1hdGlvbgoraWQtY2UgNTUJCTogdGFyZ2V0SW5mb3JtYXRpb24JOiBYNTA5djMgQUMgVGFyZ2V0aW5nCishQ25hbWUgbm8tcmV2LWF2YWlsCitpZC1jZSA1NgkJOiBub1JldkF2YWlsCQk6IFg1MDl2MyBObyBSZXZvY2F0aW9uIEF2YWlsYWJsZQorCisjIEZyb20gUkZDNTI4MAorZXh0LWtleS11c2FnZSAwCQk6IGFueUV4dGVuZGVkS2V5VXNhZ2UJOiBBbnkgRXh0ZW5kZWQgS2V5IFVzYWdlCisKKworIUNuYW1lIG5ldHNjYXBlCisyIDE2IDg0MCAxIDExMzczMAk6IE5ldHNjYXBlCQk6IE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnAuCishQ25hbWUgbmV0c2NhcGUtY2VydC1leHRlbnNpb24KK25ldHNjYXBlIDEJCTogbnNDZXJ0RXh0CQk6IE5ldHNjYXBlIENlcnRpZmljYXRlIEV4dGVuc2lvbgorIUNuYW1lIG5ldHNjYXBlLWRhdGEtdHlwZQorbmV0c2NhcGUgMgkJOiBuc0RhdGFUeXBlCQk6IE5ldHNjYXBlIERhdGEgVHlwZQorIUNuYW1lIG5ldHNjYXBlLWNlcnQtdHlwZQorbmV0c2NhcGUtY2VydC1leHRlbnNpb24gMSA6IG5zQ2VydFR5cGUJCTogTmV0c2NhcGUgQ2VydCBUeXBlCishQ25hbWUgbmV0c2NhcGUtYmFzZS11cmwKK25ldHNjYXBlLWNlcnQtZXh0ZW5zaW9uIDIgOiBuc0Jhc2VVcmwJCTogTmV0c2NhcGUgQmFzZSBVcmwKKyFDbmFtZSBuZXRzY2FwZS1yZXZvY2F0aW9uLXVybAorbmV0c2NhcGUtY2VydC1leHRlbnNpb24gMyA6IG5zUmV2b2NhdGlvblVybAk6IE5ldHNjYXBlIFJldm9jYXRpb24gVXJsCishQ25hbWUgbmV0c2NhcGUtY2EtcmV2b2NhdGlvbi11cmwKK25ldHNjYXBlLWNlcnQtZXh0ZW5zaW9uIDQgOiBuc0NhUmV2b2NhdGlvblVybAk6IE5ldHNjYXBlIENBIFJldm9jYXRpb24gVXJsCishQ25hbWUgbmV0c2NhcGUtcmVuZXdhbC11cmwKK25ldHNjYXBlLWNlcnQtZXh0ZW5zaW9uIDcgOiBuc1JlbmV3YWxVcmwJOiBOZXRzY2FwZSBSZW5ld2FsIFVybAorIUNuYW1lIG5ldHNjYXBlLWNhLXBvbGljeS11cmwKK25ldHNjYXBlLWNlcnQtZXh0ZW5zaW9uIDggOiBuc0NhUG9saWN5VXJsCTogTmV0c2NhcGUgQ0EgUG9saWN5IFVybAorIUNuYW1lIG5ldHNjYXBlLXNzbC1zZXJ2ZXItbmFtZQorbmV0c2NhcGUtY2VydC1leHRlbnNpb24gMTIgOiBuc1NzbFNlcnZlck5hbWUJOiBOZXRzY2FwZSBTU0wgU2VydmVyIE5hbWUKKyFDbmFtZSBuZXRzY2FwZS1jb21tZW50CituZXRzY2FwZS1jZXJ0LWV4dGVuc2lvbiAxMyA6IG5zQ29tbWVudAkJOiBOZXRzY2FwZSBDb21tZW50CishQ25hbWUgbmV0c2NhcGUtY2VydC1zZXF1ZW5jZQorbmV0c2NhcGUtZGF0YS10eXBlIDUJOiBuc0NlcnRTZXF1ZW5jZQk6IE5ldHNjYXBlIENlcnRpZmljYXRlIFNlcXVlbmNlCishQ25hbWUgbnMtc2djCituZXRzY2FwZSA0IDEJCTogbnNTR0MJCQk6IE5ldHNjYXBlIFNlcnZlciBHYXRlZCBDcnlwdG8KKworIyBpc28oMSkKK2lzbyAzCQkJOiBPUkcJCQk6IG9yZworb3JnIDYJCQk6IERPRAkJCTogZG9kCitkb2QgMQkJCTogSUFOQQkJCTogaWFuYQorIUFsaWFzIGludGVybmV0IGlhbmEKKworaW50ZXJuZXQgMQkJOiBkaXJlY3RvcnkJCTogRGlyZWN0b3J5CitpbnRlcm5ldCAyCQk6IG1nbXQJCQk6IE1hbmFnZW1lbnQKK2ludGVybmV0IDMJCTogZXhwZXJpbWVudGFsCQk6IEV4cGVyaW1lbnRhbAoraW50ZXJuZXQgNAkJOiBwcml2YXRlCQk6IFByaXZhdGUKK2ludGVybmV0IDUJCTogc2VjdXJpdHkJCTogU2VjdXJpdHkKK2ludGVybmV0IDYJCTogc25tcHYyCQk6IFNOTVB2MgorIyBEb2N1bWVudHMgcmVmZXIgdG8gImludGVybmV0IDciIGFzICJtYWlsIi4gVGhpcyBob3dldmVyIGxlYWRzIHRvIGFtYmlndWl0aWVzCisjIHdpdGggUkZDMjc5OCwgU2VjdGlvbiA5LjEuMywgd2hlcmUgIm1haWwiIGlzIGRlZmluZWQgYXMgdGhlIHNob3J0IG5hbWUgZm9yCisjIHJmYzgyMk1haWxib3guIFRoZSBzaG9ydCBuYW1lIGlzIHRoZXJlZm9yZSBoZXJlIGxlZnQgb3V0IGZvciBhIHJlYXNvbi4KKyMgU3ViY2xhc3NlcyBvZiAibWFpbCIsIGUuZy4gIk1JTUUgTUhTIiBkb24ndCBjb25zaXR1dGUgYSBwcm9ibGVtLCBhcworIyByZWZlcmVuY2VzIGFyZSByZWFsaXplZCB2aWEgbG9uZyBuYW1lICJNYWlsIiAod2l0aCBjYXBpdGFsIE0pLgoraW50ZXJuZXQgNwkJOgkJCTogTWFpbAorCitQcml2YXRlIDEJCTogZW50ZXJwcmlzZXMJCTogRW50ZXJwcmlzZXMKKworIyBSRkMgMjI0NworRW50ZXJwcmlzZXMgMTQ2NiAzNDQJOiBkY29iamVjdAkJOiBkY09iamVjdAorCisjIFJGQyAxNDk1CitNYWlsIDEJCQk6IG1pbWUtbWhzCQk6IE1JTUUgTUhTCittaW1lLW1ocyAxCQk6IG1pbWUtbWhzLWhlYWRpbmdzCTogbWltZS1taHMtaGVhZGluZ3MKK21pbWUtbWhzIDIJCTogbWltZS1taHMtYm9kaWVzCTogbWltZS1taHMtYm9kaWVzCittaW1lLW1ocy1oZWFkaW5ncyAxCTogaWQtaGV4LXBhcnRpYWwtbWVzc2FnZSA6IGlkLWhleC1wYXJ0aWFsLW1lc3NhZ2UKK21pbWUtbWhzLWhlYWRpbmdzIDIJOiBpZC1oZXgtbXVsdGlwYXJ0LW1lc3NhZ2UgOiBpZC1oZXgtbXVsdGlwYXJ0LW1lc3NhZ2UKKworIyBXaGF0IHRoZSBoZWxsIGFyZSB0aGVzZSBPSURzLCByZWFsbHk/CishQ25hbWUgcmxlLWNvbXByZXNzaW9uCisxIDEgMSAxIDY2NiAxCQk6IFJMRQkJCTogcnVuIGxlbmd0aCBjb21wcmVzc2lvbgorIUNuYW1lIHpsaWItY29tcHJlc3Npb24KK2lkLXNtaW1lLWFsZyA4CQk6IFpMSUIJCQk6IHpsaWIgY29tcHJlc3Npb24KKworIyBBRVMgYWthIFJpam5kYWVsCisKKyFBbGlhcyBjc29yIDIgMTYgODQwIDEgMTAxIDMKKyFBbGlhcyBuaXN0QWxnb3JpdGhtcyBjc29yIDQKKyFBbGlhcyBhZXMgbmlzdEFsZ29yaXRobXMgMQorCithZXMgMQkJCTogQUVTLTEyOC1FQ0IJCTogYWVzLTEyOC1lY2IKK2FlcyAyCQkJOiBBRVMtMTI4LUNCQwkJOiBhZXMtMTI4LWNiYworIUNuYW1lIGFlcy0xMjgtb2ZiMTI4CithZXMgMwkJCTogQUVTLTEyOC1PRkIJCTogYWVzLTEyOC1vZmIKKyFDbmFtZSBhZXMtMTI4LWNmYjEyOAorYWVzIDQJCQk6IEFFUy0xMjgtQ0ZCCQk6IGFlcy0xMjgtY2ZiCithZXMgNQkJCTogaWQtYWVzMTI4LXdyYXAKK2FlcyA2CQkJOiBpZC1hZXMxMjgtR0NNCQk6IGFlcy0xMjgtZ2NtCithZXMgNwkJCTogaWQtYWVzMTI4LUNDTQkJOiBhZXMtMTI4LWNjbQorYWVzIDgJCQk6IGlkLWFlczEyOC13cmFwLXBhZAorCithZXMgMjEJCQk6IEFFUy0xOTItRUNCCQk6IGFlcy0xOTItZWNiCithZXMgMjIJCQk6IEFFUy0xOTItQ0JDCQk6IGFlcy0xOTItY2JjCishQ25hbWUgYWVzLTE5Mi1vZmIxMjgKK2FlcyAyMwkJCTogQUVTLTE5Mi1PRkIJCTogYWVzLTE5Mi1vZmIKKyFDbmFtZSBhZXMtMTkyLWNmYjEyOAorYWVzIDI0CQkJOiBBRVMtMTkyLUNGQgkJOiBhZXMtMTkyLWNmYgorYWVzIDI1CQkJOiBpZC1hZXMxOTItd3JhcAorYWVzIDI2CQkJOiBpZC1hZXMxOTItR0NNCQk6IGFlcy0xOTItZ2NtCithZXMgMjcJCQk6IGlkLWFlczE5Mi1DQ00JCTogYWVzLTE5Mi1jY20KK2FlcyAyOAkJCTogaWQtYWVzMTkyLXdyYXAtcGFkCisKK2FlcyA0MQkJCTogQUVTLTI1Ni1FQ0IJCTogYWVzLTI1Ni1lY2IKK2FlcyA0MgkJCTogQUVTLTI1Ni1DQkMJCTogYWVzLTI1Ni1jYmMKKyFDbmFtZSBhZXMtMjU2LW9mYjEyOAorYWVzIDQzCQkJOiBBRVMtMjU2LU9GQgkJOiBhZXMtMjU2LW9mYgorIUNuYW1lIGFlcy0yNTYtY2ZiMTI4CithZXMgNDQJCQk6IEFFUy0yNTYtQ0ZCCQk6IGFlcy0yNTYtY2ZiCithZXMgNDUJCQk6IGlkLWFlczI1Ni13cmFwCithZXMgNDYJCQk6IGlkLWFlczI1Ni1HQ00JCTogYWVzLTI1Ni1nY20KK2FlcyA0NwkJCTogaWQtYWVzMjU2LUNDTQkJOiBhZXMtMjU2LWNjbQorYWVzIDQ4CQkJOiBpZC1hZXMyNTYtd3JhcC1wYWQKKworIyBUaGVyZSBhcmUgbm8gT0lEcyBmb3IgdGhlc2UgbW9kZXMuLi4KKworCQkJOiBBRVMtMTI4LUNGQjEJCTogYWVzLTEyOC1jZmIxCisJCQk6IEFFUy0xOTItQ0ZCMQkJOiBhZXMtMTkyLWNmYjEKKwkJCTogQUVTLTI1Ni1DRkIxCQk6IGFlcy0yNTYtY2ZiMQorCQkJOiBBRVMtMTI4LUNGQjgJCTogYWVzLTEyOC1jZmI4CisJCQk6IEFFUy0xOTItQ0ZCOAkJOiBhZXMtMTkyLWNmYjgKKwkJCTogQUVTLTI1Ni1DRkI4CQk6IGFlcy0yNTYtY2ZiOAorCQkJOiBBRVMtMTI4LUNUUgkJOiBhZXMtMTI4LWN0cgorCQkJOiBBRVMtMTkyLUNUUgkJOiBhZXMtMTkyLWN0cgorCQkJOiBBRVMtMjU2LUNUUgkJOiBhZXMtMjU2LWN0cgorCQkJOiBBRVMtMTI4LVhUUwkJOiBhZXMtMTI4LXh0cworCQkJOiBBRVMtMjU2LVhUUwkJOiBhZXMtMjU2LXh0cworCQkJOiBERVMtQ0ZCMQkJOiBkZXMtY2ZiMQorCQkJOiBERVMtQ0ZCOAkJOiBkZXMtY2ZiOAorCQkJOiBERVMtRURFMy1DRkIxCQk6IGRlcy1lZGUzLWNmYjEKKwkJCTogREVTLUVERTMtQ0ZCOAkJOiBkZXMtZWRlMy1jZmI4CisKKyMgT0lEcyBmb3IgU0hBMjI0LCBTSEEyNTYsIFNIQTM4NSBhbmQgU0hBNTEyLCBhY2NvcmRpbmcgdG8geDkuODQuCishQWxpYXMgbmlzdF9oYXNoYWxncyBuaXN0QWxnb3JpdGhtcyAyCituaXN0X2hhc2hhbGdzIDEJCTogU0hBMjU2CQk6IHNoYTI1NgorbmlzdF9oYXNoYWxncyAyCQk6IFNIQTM4NAkJOiBzaGEzODQKK25pc3RfaGFzaGFsZ3MgMwkJOiBTSEE1MTIJCTogc2hhNTEyCituaXN0X2hhc2hhbGdzIDQJCTogU0hBMjI0CQk6IHNoYTIyNAorCisjIE9JRHMgZm9yIGRzYS13aXRoLXNoYTIyNCBhbmQgZHNhLXdpdGgtc2hhMjU2CishQWxpYXMgZHNhX3dpdGhfc2hhMiBuaXN0QWxnb3JpdGhtcyAzCitkc2Ffd2l0aF9zaGEyIDEJCTogZHNhX3dpdGhfU0hBMjI0Citkc2Ffd2l0aF9zaGEyIDIJCTogZHNhX3dpdGhfU0hBMjU2CisKKyMgSG9sZCBpbnN0cnVjdGlvbiBDUkwgZW50cnkgZXh0ZW5zaW9uCishQ25hbWUgaG9sZC1pbnN0cnVjdGlvbi1jb2RlCitpZC1jZSAyMwkJOiBob2xkSW5zdHJ1Y3Rpb25Db2RlCTogSG9sZCBJbnN0cnVjdGlvbiBDb2RlCishQWxpYXMgaG9sZEluc3RydWN0aW9uCVg5LTU3IDIKKyFDbmFtZSBob2xkLWluc3RydWN0aW9uLW5vbmUKK2hvbGRJbnN0cnVjdGlvbiAxCTogaG9sZEluc3RydWN0aW9uTm9uZQk6IEhvbGQgSW5zdHJ1Y3Rpb24gTm9uZQorIUNuYW1lIGhvbGQtaW5zdHJ1Y3Rpb24tY2FsbC1pc3N1ZXIKK2hvbGRJbnN0cnVjdGlvbiAyCTogaG9sZEluc3RydWN0aW9uQ2FsbElzc3VlciA6IEhvbGQgSW5zdHJ1Y3Rpb24gQ2FsbCBJc3N1ZXIKKyFDbmFtZSBob2xkLWluc3RydWN0aW9uLXJlamVjdAoraG9sZEluc3RydWN0aW9uIDMJOiBob2xkSW5zdHJ1Y3Rpb25SZWplY3QJOiBIb2xkIEluc3RydWN0aW9uIFJlamVjdAorCisjIE9JRCdzIGZyb20gSVRVLVQuICBNb3N0IG9mIHRoaXMgaXMgZGVmaW5lZCBpbiBSRkMgMTI3NC4gIEEgY291cGxlIG9mCisjIHRoZW0gYXJlIGFsc28gbWVudGlvbmVkIGluIFJGQyAyMjQ3CitpdHUtdCA5CQkJOiBkYXRhCitkYXRhIDIzNDIJCTogcHNzCitwc3MgMTkyMDAzMDAJCTogdWNsCit1Y2wgMTAwCQkJOiBwaWxvdAorcGlsb3QgMQkJCToJCQk6IHBpbG90QXR0cmlidXRlVHlwZQorcGlsb3QgMwkJCToJCQk6IHBpbG90QXR0cmlidXRlU3ludGF4CitwaWxvdCA0CQkJOgkJCTogcGlsb3RPYmplY3RDbGFzcworcGlsb3QgMTAJCToJCQk6IHBpbG90R3JvdXBzCitwaWxvdEF0dHJpYnV0ZVN5bnRheCA0CToJCQk6IGlBNVN0cmluZ1N5bnRheAorcGlsb3RBdHRyaWJ1dGVTeW50YXggNQk6CQkJOiBjYXNlSWdub3JlSUE1U3RyaW5nU3ludGF4CitwaWxvdE9iamVjdENsYXNzIDMJOgkJCTogcGlsb3RPYmplY3QKK3BpbG90T2JqZWN0Q2xhc3MgNAk6CQkJOiBwaWxvdFBlcnNvbgorcGlsb3RPYmplY3RDbGFzcyA1CTogYWNjb3VudAorcGlsb3RPYmplY3RDbGFzcyA2CTogZG9jdW1lbnQKK3BpbG90T2JqZWN0Q2xhc3MgNwk6IHJvb20KK3BpbG90T2JqZWN0Q2xhc3MgOQk6CQkJOiBkb2N1bWVudFNlcmllcworcGlsb3RPYmplY3RDbGFzcyAxMwk6IGRvbWFpbgkJOiBEb21haW4KK3BpbG90T2JqZWN0Q2xhc3MgMTQJOgkJCTogckZDODIybG9jYWxQYXJ0CitwaWxvdE9iamVjdENsYXNzIDE1CToJCQk6IGROU0RvbWFpbgorcGlsb3RPYmplY3RDbGFzcyAxNwk6CQkJOiBkb21haW5SZWxhdGVkT2JqZWN0CitwaWxvdE9iamVjdENsYXNzIDE4CToJCQk6IGZyaWVuZGx5Q291bnRyeQorcGlsb3RPYmplY3RDbGFzcyAxOQk6CQkJOiBzaW1wbGVTZWN1cml0eU9iamVjdAorcGlsb3RPYmplY3RDbGFzcyAyMAk6CQkJOiBwaWxvdE9yZ2FuaXphdGlvbgorcGlsb3RPYmplY3RDbGFzcyAyMQk6CQkJOiBwaWxvdERTQQorcGlsb3RPYmplY3RDbGFzcyAyMgk6CQkJOiBxdWFsaXR5TGFiZWxsZWREYXRhCitwaWxvdEF0dHJpYnV0ZVR5cGUgMQk6IFVJRAkJCTogdXNlcklkCitwaWxvdEF0dHJpYnV0ZVR5cGUgMgk6CQkJOiB0ZXh0RW5jb2RlZE9SQWRkcmVzcworcGlsb3RBdHRyaWJ1dGVUeXBlIDMJOiBtYWlsCQkJOiByZmM4MjJNYWlsYm94CitwaWxvdEF0dHJpYnV0ZVR5cGUgNAk6IGluZm8KK3BpbG90QXR0cmlidXRlVHlwZSA1CToJCQk6IGZhdm91cml0ZURyaW5rCitwaWxvdEF0dHJpYnV0ZVR5cGUgNgk6CQkJOiByb29tTnVtYmVyCitwaWxvdEF0dHJpYnV0ZVR5cGUgNwk6IHBob3RvCitwaWxvdEF0dHJpYnV0ZVR5cGUgOAk6CQkJOiB1c2VyQ2xhc3MKK3BpbG90QXR0cmlidXRlVHlwZSA5CTogaG9zdAorcGlsb3RBdHRyaWJ1dGVUeXBlIDEwCTogbWFuYWdlcgorcGlsb3RBdHRyaWJ1dGVUeXBlIDExCToJCQk6IGRvY3VtZW50SWRlbnRpZmllcgorcGlsb3RBdHRyaWJ1dGVUeXBlIDEyCToJCQk6IGRvY3VtZW50VGl0bGUKK3BpbG90QXR0cmlidXRlVHlwZSAxMwk6CQkJOiBkb2N1bWVudFZlcnNpb24KK3BpbG90QXR0cmlidXRlVHlwZSAxNAk6CQkJOiBkb2N1bWVudEF1dGhvcgorcGlsb3RBdHRyaWJ1dGVUeXBlIDE1CToJCQk6IGRvY3VtZW50TG9jYXRpb24KK3BpbG90QXR0cmlidXRlVHlwZSAyMAk6CQkJOiBob21lVGVsZXBob25lTnVtYmVyCitwaWxvdEF0dHJpYnV0ZVR5cGUgMjEJOiBzZWNyZXRhcnkKK3BpbG90QXR0cmlidXRlVHlwZSAyMgk6CQkJOiBvdGhlck1haWxib3gKK3BpbG90QXR0cmlidXRlVHlwZSAyMwk6CQkJOiBsYXN0TW9kaWZpZWRUaW1lCitwaWxvdEF0dHJpYnV0ZVR5cGUgMjQJOgkJCTogbGFzdE1vZGlmaWVkQnkKK3BpbG90QXR0cmlidXRlVHlwZSAyNQk6IERDCQkJOiBkb21haW5Db21wb25lbnQKK3BpbG90QXR0cmlidXRlVHlwZSAyNgk6CQkJOiBhUmVjb3JkCitwaWxvdEF0dHJpYnV0ZVR5cGUgMjcJOgkJCTogcGlsb3RBdHRyaWJ1dGVUeXBlMjcKK3BpbG90QXR0cmlidXRlVHlwZSAyOAk6CQkJOiBtWFJlY29yZAorcGlsb3RBdHRyaWJ1dGVUeXBlIDI5CToJCQk6IG5TUmVjb3JkCitwaWxvdEF0dHJpYnV0ZVR5cGUgMzAJOgkJCTogc09BUmVjb3JkCitwaWxvdEF0dHJpYnV0ZVR5cGUgMzEJOgkJCTogY05BTUVSZWNvcmQKK3BpbG90QXR0cmlidXRlVHlwZSAzNwk6CQkJOiBhc3NvY2lhdGVkRG9tYWluCitwaWxvdEF0dHJpYnV0ZVR5cGUgMzgJOgkJCTogYXNzb2NpYXRlZE5hbWUKK3BpbG90QXR0cmlidXRlVHlwZSAzOQk6CQkJOiBob21lUG9zdGFsQWRkcmVzcworcGlsb3RBdHRyaWJ1dGVUeXBlIDQwCToJCQk6IHBlcnNvbmFsVGl0bGUKK3BpbG90QXR0cmlidXRlVHlwZSA0MQk6CQkJOiBtb2JpbGVUZWxlcGhvbmVOdW1iZXIKK3BpbG90QXR0cmlidXRlVHlwZSA0Mgk6CQkJOiBwYWdlclRlbGVwaG9uZU51bWJlcgorcGlsb3RBdHRyaWJ1dGVUeXBlIDQzCToJCQk6IGZyaWVuZGx5Q291bnRyeU5hbWUKKyMgVGhlIGZvbGxvd2luZyBjbGFzaGVzIHdpdGggMi41LjQuNDUsIHNvIGNvbW1lbnRlZCBhd2F5CisjcGlsb3RBdHRyaWJ1dGVUeXBlIDQ0CTogdWlkCQkJOiB1bmlxdWVJZGVudGlmaWVyCitwaWxvdEF0dHJpYnV0ZVR5cGUgNDUJOgkJCTogb3JnYW5pemF0aW9uYWxTdGF0dXMKK3BpbG90QXR0cmlidXRlVHlwZSA0Ngk6CQkJOiBqYW5ldE1haWxib3gKK3BpbG90QXR0cmlidXRlVHlwZSA0Nwk6CQkJOiBtYWlsUHJlZmVyZW5jZU9wdGlvbgorcGlsb3RBdHRyaWJ1dGVUeXBlIDQ4CToJCQk6IGJ1aWxkaW5nTmFtZQorcGlsb3RBdHRyaWJ1dGVUeXBlIDQ5CToJCQk6IGRTQVF1YWxpdHkKK3BpbG90QXR0cmlidXRlVHlwZSA1MAk6CQkJOiBzaW5nbGVMZXZlbFF1YWxpdHkKK3BpbG90QXR0cmlidXRlVHlwZSA1MQk6CQkJOiBzdWJ0cmVlTWluaW11bVF1YWxpdHkKK3BpbG90QXR0cmlidXRlVHlwZSA1Mgk6CQkJOiBzdWJ0cmVlTWF4aW11bVF1YWxpdHkKK3BpbG90QXR0cmlidXRlVHlwZSA1Mwk6CQkJOiBwZXJzb25hbFNpZ25hdHVyZQorcGlsb3RBdHRyaWJ1dGVUeXBlIDU0CToJCQk6IGRJVFJlZGlyZWN0CitwaWxvdEF0dHJpYnV0ZVR5cGUgNTUJOiBhdWRpbworcGlsb3RBdHRyaWJ1dGVUeXBlIDU2CToJCQk6IGRvY3VtZW50UHVibGlzaGVyCisKK2ludGVybmF0aW9uYWwtb3JnYW5pemF0aW9ucyA0Mgk6IGlkLXNldAk6IFNlY3VyZSBFbGVjdHJvbmljIFRyYW5zYWN0aW9ucworCitpZC1zZXQgMAkJOiBzZXQtY3R5cGUJCTogY29udGVudCB0eXBlcworaWQtc2V0IDEJCTogc2V0LW1zZ0V4dAkJOiBtZXNzYWdlIGV4dGVuc2lvbnMKK2lkLXNldCAzCQk6IHNldC1hdHRyCitpZC1zZXQgNQkJOiBzZXQtcG9saWN5CitpZC1zZXQgNwkJOiBzZXQtY2VydEV4dAkJOiBjZXJ0aWZpY2F0ZSBleHRlbnNpb25zCitpZC1zZXQgOAkJOiBzZXQtYnJhbmQKKworc2V0LWN0eXBlIDAJCTogc2V0Y3QtUEFORGF0YQorc2V0LWN0eXBlIDEJCTogc2V0Y3QtUEFOVG9rZW4KK3NldC1jdHlwZSAyCQk6IHNldGN0LVBBTk9ubHkKK3NldC1jdHlwZSAzCQk6IHNldGN0LU9JRGF0YQorc2V0LWN0eXBlIDQJCTogc2V0Y3QtUEkKK3NldC1jdHlwZSA1CQk6IHNldGN0LVBJRGF0YQorc2V0LWN0eXBlIDYJCTogc2V0Y3QtUElEYXRhVW5zaWduZWQKK3NldC1jdHlwZSA3CQk6IHNldGN0LUhPRElucHV0CitzZXQtY3R5cGUgOAkJOiBzZXRjdC1BdXRoUmVzQmFnZ2FnZQorc2V0LWN0eXBlIDkJCTogc2V0Y3QtQXV0aFJldlJlcUJhZ2dhZ2UKK3NldC1jdHlwZSAxMAkJOiBzZXRjdC1BdXRoUmV2UmVzQmFnZ2FnZQorc2V0LWN0eXBlIDExCQk6IHNldGN0LUNhcFRva2VuU2VxCitzZXQtY3R5cGUgMTIJCTogc2V0Y3QtUEluaXRSZXNEYXRhCitzZXQtY3R5cGUgMTMJCTogc2V0Y3QtUEktVEJTCitzZXQtY3R5cGUgMTQJCTogc2V0Y3QtUFJlc0RhdGEKK3NldC1jdHlwZSAxNgkJOiBzZXRjdC1BdXRoUmVxVEJTCitzZXQtY3R5cGUgMTcJCTogc2V0Y3QtQXV0aFJlc1RCUworc2V0LWN0eXBlIDE4CQk6IHNldGN0LUF1dGhSZXNUQlNYCitzZXQtY3R5cGUgMTkJCTogc2V0Y3QtQXV0aFRva2VuVEJTCitzZXQtY3R5cGUgMjAJCTogc2V0Y3QtQ2FwVG9rZW5EYXRhCitzZXQtY3R5cGUgMjEJCTogc2V0Y3QtQ2FwVG9rZW5UQlMKK3NldC1jdHlwZSAyMgkJOiBzZXRjdC1BY3FDYXJkQ29kZU1zZworc2V0LWN0eXBlIDIzCQk6IHNldGN0LUF1dGhSZXZSZXFUQlMKK3NldC1jdHlwZSAyNAkJOiBzZXRjdC1BdXRoUmV2UmVzRGF0YQorc2V0LWN0eXBlIDI1CQk6IHNldGN0LUF1dGhSZXZSZXNUQlMKK3NldC1jdHlwZSAyNgkJOiBzZXRjdC1DYXBSZXFUQlMKK3NldC1jdHlwZSAyNwkJOiBzZXRjdC1DYXBSZXFUQlNYCitzZXQtY3R5cGUgMjgJCTogc2V0Y3QtQ2FwUmVzRGF0YQorc2V0LWN0eXBlIDI5CQk6IHNldGN0LUNhcFJldlJlcVRCUworc2V0LWN0eXBlIDMwCQk6IHNldGN0LUNhcFJldlJlcVRCU1gKK3NldC1jdHlwZSAzMQkJOiBzZXRjdC1DYXBSZXZSZXNEYXRhCitzZXQtY3R5cGUgMzIJCTogc2V0Y3QtQ3JlZFJlcVRCUworc2V0LWN0eXBlIDMzCQk6IHNldGN0LUNyZWRSZXFUQlNYCitzZXQtY3R5cGUgMzQJCTogc2V0Y3QtQ3JlZFJlc0RhdGEKK3NldC1jdHlwZSAzNQkJOiBzZXRjdC1DcmVkUmV2UmVxVEJTCitzZXQtY3R5cGUgMzYJCTogc2V0Y3QtQ3JlZFJldlJlcVRCU1gKK3NldC1jdHlwZSAzNwkJOiBzZXRjdC1DcmVkUmV2UmVzRGF0YQorc2V0LWN0eXBlIDM4CQk6IHNldGN0LVBDZXJ0UmVxRGF0YQorc2V0LWN0eXBlIDM5CQk6IHNldGN0LVBDZXJ0UmVzVEJTCitzZXQtY3R5cGUgNDAJCTogc2V0Y3QtQmF0Y2hBZG1pblJlcURhdGEKK3NldC1jdHlwZSA0MQkJOiBzZXRjdC1CYXRjaEFkbWluUmVzRGF0YQorc2V0LWN0eXBlIDQyCQk6IHNldGN0LUNhcmRDSW5pdFJlc1RCUworc2V0LWN0eXBlIDQzCQk6IHNldGN0LU1lQXFDSW5pdFJlc1RCUworc2V0LWN0eXBlIDQ0CQk6IHNldGN0LVJlZ0Zvcm1SZXNUQlMKK3NldC1jdHlwZSA0NQkJOiBzZXRjdC1DZXJ0UmVxRGF0YQorc2V0LWN0eXBlIDQ2CQk6IHNldGN0LUNlcnRSZXFUQlMKK3NldC1jdHlwZSA0NwkJOiBzZXRjdC1DZXJ0UmVzRGF0YQorc2V0LWN0eXBlIDQ4CQk6IHNldGN0LUNlcnRJbnFSZXFUQlMKK3NldC1jdHlwZSA0OQkJOiBzZXRjdC1FcnJvclRCUworc2V0LWN0eXBlIDUwCQk6IHNldGN0LVBJRHVhbFNpZ25lZFRCRQorc2V0LWN0eXBlIDUxCQk6IHNldGN0LVBJVW5zaWduZWRUQkUKK3NldC1jdHlwZSA1MgkJOiBzZXRjdC1BdXRoUmVxVEJFCitzZXQtY3R5cGUgNTMJCTogc2V0Y3QtQXV0aFJlc1RCRQorc2V0LWN0eXBlIDU0CQk6IHNldGN0LUF1dGhSZXNUQkVYCitzZXQtY3R5cGUgNTUJCTogc2V0Y3QtQXV0aFRva2VuVEJFCitzZXQtY3R5cGUgNTYJCTogc2V0Y3QtQ2FwVG9rZW5UQkUKK3NldC1jdHlwZSA1NwkJOiBzZXRjdC1DYXBUb2tlblRCRVgKK3NldC1jdHlwZSA1OAkJOiBzZXRjdC1BY3FDYXJkQ29kZU1zZ1RCRQorc2V0LWN0eXBlIDU5CQk6IHNldGN0LUF1dGhSZXZSZXFUQkUKK3NldC1jdHlwZSA2MAkJOiBzZXRjdC1BdXRoUmV2UmVzVEJFCitzZXQtY3R5cGUgNjEJCTogc2V0Y3QtQXV0aFJldlJlc1RCRUIKK3NldC1jdHlwZSA2MgkJOiBzZXRjdC1DYXBSZXFUQkUKK3NldC1jdHlwZSA2MwkJOiBzZXRjdC1DYXBSZXFUQkVYCitzZXQtY3R5cGUgNjQJCTogc2V0Y3QtQ2FwUmVzVEJFCitzZXQtY3R5cGUgNjUJCTogc2V0Y3QtQ2FwUmV2UmVxVEJFCitzZXQtY3R5cGUgNjYJCTogc2V0Y3QtQ2FwUmV2UmVxVEJFWAorc2V0LWN0eXBlIDY3CQk6IHNldGN0LUNhcFJldlJlc1RCRQorc2V0LWN0eXBlIDY4CQk6IHNldGN0LUNyZWRSZXFUQkUKK3NldC1jdHlwZSA2OQkJOiBzZXRjdC1DcmVkUmVxVEJFWAorc2V0LWN0eXBlIDcwCQk6IHNldGN0LUNyZWRSZXNUQkUKK3NldC1jdHlwZSA3MQkJOiBzZXRjdC1DcmVkUmV2UmVxVEJFCitzZXQtY3R5cGUgNzIJCTogc2V0Y3QtQ3JlZFJldlJlcVRCRVgKK3NldC1jdHlwZSA3MwkJOiBzZXRjdC1DcmVkUmV2UmVzVEJFCitzZXQtY3R5cGUgNzQJCTogc2V0Y3QtQmF0Y2hBZG1pblJlcVRCRQorc2V0LWN0eXBlIDc1CQk6IHNldGN0LUJhdGNoQWRtaW5SZXNUQkUKK3NldC1jdHlwZSA3NgkJOiBzZXRjdC1SZWdGb3JtUmVxVEJFCitzZXQtY3R5cGUgNzcJCTogc2V0Y3QtQ2VydFJlcVRCRQorc2V0LWN0eXBlIDc4CQk6IHNldGN0LUNlcnRSZXFUQkVYCitzZXQtY3R5cGUgNzkJCTogc2V0Y3QtQ2VydFJlc1RCRQorc2V0LWN0eXBlIDgwCQk6IHNldGN0LUNSTE5vdGlmaWNhdGlvblRCUworc2V0LWN0eXBlIDgxCQk6IHNldGN0LUNSTE5vdGlmaWNhdGlvblJlc1RCUworc2V0LWN0eXBlIDgyCQk6IHNldGN0LUJDSURpc3RyaWJ1dGlvblRCUworCitzZXQtbXNnRXh0IDEJCTogc2V0ZXh0LWdlbkNyeXB0CTogZ2VuZXJpYyBjcnlwdG9ncmFtCitzZXQtbXNnRXh0IDMJCTogc2V0ZXh0LW1pQXV0aAkJOiBtZXJjaGFudCBpbml0aWF0ZWQgYXV0aAorc2V0LW1zZ0V4dCA0CQk6IHNldGV4dC1waW5TZWN1cmUKK3NldC1tc2dFeHQgNQkJOiBzZXRleHQtcGluQW55CitzZXQtbXNnRXh0IDcJCTogc2V0ZXh0LXRyYWNrMgorc2V0LW1zZ0V4dCA4CQk6IHNldGV4dC1jdgkJOiBhZGRpdGlvbmFsIHZlcmlmaWNhdGlvbgorCitzZXQtcG9saWN5IDAJCTogc2V0LXBvbGljeS1yb290CisKK3NldC1jZXJ0RXh0IDAJCTogc2V0Q2V4dC1oYXNoZWRSb290CitzZXQtY2VydEV4dCAxCQk6IHNldENleHQtY2VydFR5cGUKK3NldC1jZXJ0RXh0IDIJCTogc2V0Q2V4dC1tZXJjaERhdGEKK3NldC1jZXJ0RXh0IDMJCTogc2V0Q2V4dC1jQ2VydFJlcXVpcmVkCitzZXQtY2VydEV4dCA0CQk6IHNldENleHQtdHVubmVsaW5nCitzZXQtY2VydEV4dCA1CQk6IHNldENleHQtc2V0RXh0CitzZXQtY2VydEV4dCA2CQk6IHNldENleHQtc2V0UXVhbGYKK3NldC1jZXJ0RXh0IDcJCTogc2V0Q2V4dC1QR1dZY2FwYWJpbGl0aWVzCitzZXQtY2VydEV4dCA4CQk6IHNldENleHQtVG9rZW5JZGVudGlmaWVyCitzZXQtY2VydEV4dCA5CQk6IHNldENleHQtVHJhY2syRGF0YQorc2V0LWNlcnRFeHQgMTAJCTogc2V0Q2V4dC1Ub2tlblR5cGUKK3NldC1jZXJ0RXh0IDExCQk6IHNldENleHQtSXNzdWVyQ2FwYWJpbGl0aWVzCisKK3NldC1hdHRyIDAJCTogc2V0QXR0ci1DZXJ0CitzZXQtYXR0ciAxCQk6IHNldEF0dHItUEdXWWNhcAk6IHBheW1lbnQgZ2F0ZXdheSBjYXBhYmlsaXRpZXMKK3NldC1hdHRyIDIJCTogc2V0QXR0ci1Ub2tlblR5cGUKK3NldC1hdHRyIDMJCTogc2V0QXR0ci1Jc3NDYXAJOiBpc3N1ZXIgY2FwYWJpbGl0aWVzCisKK3NldEF0dHItQ2VydCAwCQk6IHNldC1yb290S2V5VGh1bWIKK3NldEF0dHItQ2VydCAxCQk6IHNldC1hZGRQb2xpY3kKKworc2V0QXR0ci1Ub2tlblR5cGUgMQk6IHNldEF0dHItVG9rZW4tRU1WCitzZXRBdHRyLVRva2VuVHlwZSAyCTogc2V0QXR0ci1Ub2tlbi1CMFByaW1lCisKK3NldEF0dHItSXNzQ2FwIDMJOiBzZXRBdHRyLUlzc0NhcC1DVk0KK3NldEF0dHItSXNzQ2FwIDQJOiBzZXRBdHRyLUlzc0NhcC1UMgorc2V0QXR0ci1Jc3NDYXAgNQk6IHNldEF0dHItSXNzQ2FwLVNpZworCitzZXRBdHRyLUlzc0NhcC1DVk0gMQk6IHNldEF0dHItR2VuQ3J5cHRncm0JOiBnZW5lcmF0ZSBjcnlwdG9ncmFtCitzZXRBdHRyLUlzc0NhcC1UMiAxCTogc2V0QXR0ci1UMkVuYwkJOiBlbmNyeXB0ZWQgdHJhY2sgMgorc2V0QXR0ci1Jc3NDYXAtVDIgMgk6IHNldEF0dHItVDJjbGVhcnR4dAk6IGNsZWFydGV4dCB0cmFjayAyCisKK3NldEF0dHItSXNzQ2FwLVNpZyAxCTogc2V0QXR0ci1Ub2tJQ0NzaWcJOiBJQ0Mgb3IgdG9rZW4gc2lnbmF0dXJlCitzZXRBdHRyLUlzc0NhcC1TaWcgMgk6IHNldEF0dHItU2VjRGV2U2lnCTogc2VjdXJlIGRldmljZSBzaWduYXR1cmUKKworc2V0LWJyYW5kIDEJCTogc2V0LWJyYW5kLUlBVEEtQVRBCitzZXQtYnJhbmQgMzAJCTogc2V0LWJyYW5kLURpbmVycworc2V0LWJyYW5kIDM0CQk6IHNldC1icmFuZC1BbWVyaWNhbkV4cHJlc3MKK3NldC1icmFuZCAzNQkJOiBzZXQtYnJhbmQtSkNCCitzZXQtYnJhbmQgNAkJOiBzZXQtYnJhbmQtVmlzYQorc2V0LWJyYW5kIDUJCTogc2V0LWJyYW5kLU1hc3RlckNhcmQKK3NldC1icmFuZCA2MDExCQk6IHNldC1icmFuZC1Ob3Z1cworCityc2Fkc2kgMyAxMAkJOiBERVMtQ0RNRgkJOiBkZXMtY2RtZgorcnNhZHNpIDEgMSA2CQk6IHJzYU9BRVBFbmNyeXB0aW9uU0VUCisKKwkJCTogT2FrbGV5LUVDMk4tMwkJOiBpcHNlYzMKKwkJCTogT2FrbGV5LUVDMk4tNAkJOiBpcHNlYzQKKworaXNvIDAgMTAxMTggMyAwIDU1CTogd2hpcmxwb29sCisKKyMgR09TVCBPSURzCisKK21lbWJlci1ib2R5IDY0MyAyIDIJOiBjcnlwdG9wcm8KK21lbWJlci1ib2R5IDY0MyAyIDkJOiBjcnlwdG9jb20KKworY3J5cHRvcHJvIDMJCTogaWQtR29zdFIzNDExLTk0LXdpdGgtR29zdFIzNDEwLTIwMDEgOiBHT1NUIFIgMzQuMTEtOTQgd2l0aCBHT1NUIFIgMzQuMTAtMjAwMQorY3J5cHRvcHJvIDQJCTogaWQtR29zdFIzNDExLTk0LXdpdGgtR29zdFIzNDEwLTk0IDogR09TVCBSIDM0LjExLTk0IHdpdGggR09TVCBSIDM0LjEwLTk0CishQ25hbWUgaWQtR29zdFIzNDExLTk0CitjcnlwdG9wcm8gOQkJOiBtZF9nb3N0OTQJCTogR09TVCBSIDM0LjExLTk0CitjcnlwdG9wcm8gMTAJCTogaWQtSE1BQ0dvc3RSMzQxMS05NAk6IEhNQUMgR09TVCAzNC4xMS05NAorIUNuYW1lIGlkLUdvc3RSMzQxMC0yMDAxCitjcnlwdG9wcm8gMTkJCTogZ29zdDIwMDEJOiBHT1NUIFIgMzQuMTAtMjAwMQorIUNuYW1lIGlkLUdvc3RSMzQxMC05NAorY3J5cHRvcHJvIDIwCQk6IGdvc3Q5NAk6IEdPU1QgUiAzNC4xMC05NAorIUNuYW1lIGlkLUdvc3QyODE0Ny04OQorY3J5cHRvcHJvIDIxCQk6IGdvc3Q4OSAJCTogR09TVCAyODE0Ny04OQorCQkJOiBnb3N0ODktY250CishQ25hbWUgaWQtR29zdDI4MTQ3LTg5LU1BQworY3J5cHRvcHJvIDIyCQk6IGdvc3QtbWFjCTogR09TVCAyODE0Ny04OSBNQUMKKyFDbmFtZSBpZC1Hb3N0UjM0MTEtOTQtcHJmCitjcnlwdG9wcm8gMjMJCTogcHJmLWdvc3RyMzQxMS05NAk6IEdPU1QgUiAzNC4xMS05NCBQUkYKK2NyeXB0b3BybyA5OAkJOiBpZC1Hb3N0UjM0MTAtMjAwMURICTogR09TVCBSIDM0LjEwLTIwMDEgREgKK2NyeXB0b3BybyA5OQkJOiBpZC1Hb3N0UjM0MTAtOTRESAk6IEdPU1QgUiAzNC4xMC05NCBESAorCitjcnlwdG9wcm8gMTQgMQkJOiBpZC1Hb3N0MjgxNDctODktQ3J5cHRvUHJvLUtleU1lc2hpbmcKK2NyeXB0b3BybyAxNCAwCQk6IGlkLUdvc3QyODE0Ny04OS1Ob25lLUtleU1lc2hpbmcKKworIyBHT1NUIHBhcmFtZXRlciBzZXQgT0lEcworCitjcnlwdG9wcm8gMzAgMAkJOiBpZC1Hb3N0UjM0MTEtOTQtVGVzdFBhcmFtU2V0CitjcnlwdG9wcm8gMzAgMQkJOiBpZC1Hb3N0UjM0MTEtOTQtQ3J5cHRvUHJvUGFyYW1TZXQKKworY3J5cHRvcHJvIDMxIDAJCTogaWQtR29zdDI4MTQ3LTg5LVRlc3RQYXJhbVNldAorY3J5cHRvcHJvIDMxIDEJCTogaWQtR29zdDI4MTQ3LTg5LUNyeXB0b1Byby1BLVBhcmFtU2V0CitjcnlwdG9wcm8gMzEgMgkJOiBpZC1Hb3N0MjgxNDctODktQ3J5cHRvUHJvLUItUGFyYW1TZXQKK2NyeXB0b3BybyAzMSAzCQk6IGlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tQy1QYXJhbVNldAorY3J5cHRvcHJvIDMxIDQJCTogaWQtR29zdDI4MTQ3LTg5LUNyeXB0b1Byby1ELVBhcmFtU2V0CitjcnlwdG9wcm8gMzEgNQkJOiBpZC1Hb3N0MjgxNDctODktQ3J5cHRvUHJvLU9zY2FyLTEtMS1QYXJhbVNldAorY3J5cHRvcHJvIDMxIDYJCTogaWQtR29zdDI4MTQ3LTg5LUNyeXB0b1Byby1Pc2Nhci0xLTAtUGFyYW1TZXQKK2NyeXB0b3BybyAzMSA3CQk6IGlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tUklDLTEtUGFyYW1TZXQKKworY3J5cHRvcHJvIDMyIDAJCTogaWQtR29zdFIzNDEwLTk0LVRlc3RQYXJhbVNldAorY3J5cHRvcHJvIDMyIDIJCTogaWQtR29zdFIzNDEwLTk0LUNyeXB0b1Byby1BLVBhcmFtU2V0CitjcnlwdG9wcm8gMzIgMwkJOiBpZC1Hb3N0UjM0MTAtOTQtQ3J5cHRvUHJvLUItUGFyYW1TZXQKK2NyeXB0b3BybyAzMiA0CQk6IGlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tQy1QYXJhbVNldAorY3J5cHRvcHJvIDMyIDUJCTogaWQtR29zdFIzNDEwLTk0LUNyeXB0b1Byby1ELVBhcmFtU2V0CisKK2NyeXB0b3BybyAzMyAxCQk6IGlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tWGNoQS1QYXJhbVNldAorY3J5cHRvcHJvIDMzIDIJCTogaWQtR29zdFIzNDEwLTk0LUNyeXB0b1Byby1YY2hCLVBhcmFtU2V0CitjcnlwdG9wcm8gMzMgMwkJOiBpZC1Hb3N0UjM0MTAtOTQtQ3J5cHRvUHJvLVhjaEMtUGFyYW1TZXQKKworY3J5cHRvcHJvIDM1IDAJCTogaWQtR29zdFIzNDEwLTIwMDEtVGVzdFBhcmFtU2V0CitjcnlwdG9wcm8gMzUgMQkJOiBpZC1Hb3N0UjM0MTAtMjAwMS1DcnlwdG9Qcm8tQS1QYXJhbVNldAorY3J5cHRvcHJvIDM1IDIJCTogaWQtR29zdFIzNDEwLTIwMDEtQ3J5cHRvUHJvLUItUGFyYW1TZXQKK2NyeXB0b3BybyAzNSAzCQk6IGlkLUdvc3RSMzQxMC0yMDAxLUNyeXB0b1Byby1DLVBhcmFtU2V0CisKK2NyeXB0b3BybyAzNiAwCQk6IGlkLUdvc3RSMzQxMC0yMDAxLUNyeXB0b1Byby1YY2hBLVBhcmFtU2V0CitjcnlwdG9wcm8gMzYgMQkJOiBpZC1Hb3N0UjM0MTAtMjAwMS1DcnlwdG9Qcm8tWGNoQi1QYXJhbVNldAorCitpZC1Hb3N0UjM0MTAtOTQgMQk6IGlkLUdvc3RSMzQxMC05NC1hCitpZC1Hb3N0UjM0MTAtOTQgMgk6IGlkLUdvc3RSMzQxMC05NC1hQmlzCitpZC1Hb3N0UjM0MTAtOTQgMwk6IGlkLUdvc3RSMzQxMC05NC1iCitpZC1Hb3N0UjM0MTAtOTQgNAk6IGlkLUdvc3RSMzQxMC05NC1iQmlzCisKKyMgQ3J5cHRvY29tIExURCBHT1NUIE9JRHMKKworY3J5cHRvY29tIDEgNiAxCQk6IGlkLUdvc3QyODE0Ny04OS1jYwk6IEdPU1QgMjgxNDctODkgQ3J5cHRvY29tIFBhcmFtU2V0CishQ25hbWUgaWQtR29zdFIzNDEwLTk0LWNjCitjcnlwdG9jb20gMSA1IDMJCTogZ29zdDk0Y2MJOiBHT1NUIDM0LjEwLTk0IENyeXB0b2NvbQorIUNuYW1lIGlkLUdvc3RSMzQxMC0yMDAxLWNjCitjcnlwdG9jb20gMSA1IDQJCTogZ29zdDIwMDFjYwk6IEdPU1QgMzQuMTAtMjAwMSBDcnlwdG9jb20KKworY3J5cHRvY29tIDEgMyAzCQk6IGlkLUdvc3RSMzQxMS05NC13aXRoLUdvc3RSMzQxMC05NC1jYyA6IEdPU1QgUiAzNC4xMS05NCB3aXRoIEdPU1QgUiAzNC4xMC05NCBDcnlwdG9jb20KK2NyeXB0b2NvbSAxIDMgNAkJOiBpZC1Hb3N0UjM0MTEtOTQtd2l0aC1Hb3N0UjM0MTAtMjAwMS1jYyA6IEdPU1QgUiAzNC4xMS05NCB3aXRoIEdPU1QgUiAzNC4xMC0yMDAxIENyeXB0b2NvbQorCitjcnlwdG9jb20gMSA4IDEJCTogaWQtR29zdFIzNDEwLTIwMDEtUGFyYW1TZXQtY2MgOiBHT1NUIFIgMzQxMC0yMDAxIFBhcmFtZXRlciBTZXQgQ3J5cHRvY29tCisKKyMgRGVmaW5pdGlvbnMgZm9yIENhbWVsbGlhIGNpcGhlciAtIENCQyBNT0RFCisKKzEgMiAzOTIgMjAwMDExIDYxIDEgMSAxIDIgOiBDQU1FTExJQS0xMjgtQ0JDCQk6IGNhbWVsbGlhLTEyOC1jYmMKKzEgMiAzOTIgMjAwMDExIDYxIDEgMSAxIDMgOiBDQU1FTExJQS0xOTItQ0JDCQk6IGNhbWVsbGlhLTE5Mi1jYmMKKzEgMiAzOTIgMjAwMDExIDYxIDEgMSAxIDQgOiBDQU1FTExJQS0yNTYtQ0JDCQk6IGNhbWVsbGlhLTI1Ni1jYmMKKzEgMiAzOTIgMjAwMDExIDYxIDEgMSAzIDIgOiBpZC1jYW1lbGxpYTEyOC13cmFwCisxIDIgMzkyIDIwMDAxMSA2MSAxIDEgMyAzIDogaWQtY2FtZWxsaWExOTItd3JhcAorMSAyIDM5MiAyMDAwMTEgNjEgMSAxIDMgNCA6IGlkLWNhbWVsbGlhMjU2LXdyYXAKKworIyBEZWZpbml0aW9ucyBmb3IgQ2FtZWxsaWEgY2lwaGVyIC0gRUNCLCBDRkIsIE9GQiBNT0RFCisKKyFBbGlhcyBudHQtZHMgMCAzIDQ0MDEgNQorIUFsaWFzIGNhbWVsbGlhIG50dC1kcyAzIDEgOSAKKworY2FtZWxsaWEgMQkJOiBDQU1FTExJQS0xMjgtRUNCCQk6IGNhbWVsbGlhLTEyOC1lY2IKKyFDbmFtZSBjYW1lbGxpYS0xMjgtb2ZiMTI4CitjYW1lbGxpYSAzCQk6IENBTUVMTElBLTEyOC1PRkIJCTogY2FtZWxsaWEtMTI4LW9mYgorIUNuYW1lIGNhbWVsbGlhLTEyOC1jZmIxMjgKK2NhbWVsbGlhIDQJCTogQ0FNRUxMSUEtMTI4LUNGQgkJOiBjYW1lbGxpYS0xMjgtY2ZiCisKK2NhbWVsbGlhIDIxCQk6IENBTUVMTElBLTE5Mi1FQ0IJCTogY2FtZWxsaWEtMTkyLWVjYgorIUNuYW1lIGNhbWVsbGlhLTE5Mi1vZmIxMjgKK2NhbWVsbGlhIDIzCQk6IENBTUVMTElBLTE5Mi1PRkIJCTogY2FtZWxsaWEtMTkyLW9mYgorIUNuYW1lIGNhbWVsbGlhLTE5Mi1jZmIxMjgKK2NhbWVsbGlhIDI0CQk6IENBTUVMTElBLTE5Mi1DRkIJCTogY2FtZWxsaWEtMTkyLWNmYgorCitjYW1lbGxpYSA0MQkJOiBDQU1FTExJQS0yNTYtRUNCCQk6IGNhbWVsbGlhLTI1Ni1lY2IKKyFDbmFtZSBjYW1lbGxpYS0yNTYtb2ZiMTI4CitjYW1lbGxpYSA0MwkJOiBDQU1FTExJQS0yNTYtT0ZCCQk6IGNhbWVsbGlhLTI1Ni1vZmIKKyFDbmFtZSBjYW1lbGxpYS0yNTYtY2ZiMTI4CitjYW1lbGxpYSA0NAkJOiBDQU1FTExJQS0yNTYtQ0ZCCQk6IGNhbWVsbGlhLTI1Ni1jZmIKKworIyBUaGVyZSBhcmUgbm8gT0lEcyBmb3IgdGhlc2UgbW9kZXMuLi4KKworCQkJOiBDQU1FTExJQS0xMjgtQ0ZCMQkJOiBjYW1lbGxpYS0xMjgtY2ZiMQorCQkJOiBDQU1FTExJQS0xOTItQ0ZCMQkJOiBjYW1lbGxpYS0xOTItY2ZiMQorCQkJOiBDQU1FTExJQS0yNTYtQ0ZCMQkJOiBjYW1lbGxpYS0yNTYtY2ZiMQorCQkJOiBDQU1FTExJQS0xMjgtQ0ZCOAkJOiBjYW1lbGxpYS0xMjgtY2ZiOAorCQkJOiBDQU1FTExJQS0xOTItQ0ZCOAkJOiBjYW1lbGxpYS0xOTItY2ZiOAorCQkJOiBDQU1FTExJQS0yNTYtQ0ZCOAkJOiBjYW1lbGxpYS0yNTYtY2ZiOAorCisjIERlZmluaXRpb25zIGZvciBTRUVEIGNpcGhlciAtIEVDQiwgQ0JDLCBPRkIgbW9kZQorCittZW1iZXItYm9keSA0MTAgMjAwMDA0ICA6IEtJU0EgICAgICAgICAgOiBraXNhCitraXNhIDEgMyAgICAgICAgICAgICAgICA6IFNFRUQtRUNCICAgICAgOiBzZWVkLWVjYgora2lzYSAxIDQgICAgICAgICAgICAgICAgOiBTRUVELUNCQyAgICAgIDogc2VlZC1jYmMKKyFDbmFtZSBzZWVkLWNmYjEyOAora2lzYSAxIDUgICAgICAgICAgICAgICAgOiBTRUVELUNGQiAgICAgIDogc2VlZC1jZmIKKyFDbmFtZSBzZWVkLW9mYjEyOAora2lzYSAxIDYgICAgICAgICAgICAgICAgOiBTRUVELU9GQiAgICAgIDogc2VlZC1vZmIKKworIyBUaGVyZSBpcyBubyBPSUQgdGhhdCBqdXN0IGRlbm90ZXMgIkhNQUMiIG9kZGx5IGVub3VnaC4uLgorCisJCQk6IEhNQUMJCQkJOiBobWFjCisjIE5vciBDTUFDIGVpdGhlcgorCQkJOiBDTUFDCQkJCTogY21hYworCisjIFN5bnRoZXRpYyBjb21wb3NpdGUgY2lwaGVyc3VpdGVzCisJCQk6IFJDNC1ITUFDLU1ENQkJCTogcmM0LWhtYWMtbWQ1CisJCQk6IEFFUy0xMjgtQ0JDLUhNQUMtU0hBMQkJOiBhZXMtMTI4LWNiYy1obWFjLXNoYTEKKwkJCTogQUVTLTE5Mi1DQkMtSE1BQy1TSEExCQk6IGFlcy0xOTItY2JjLWhtYWMtc2hhMQorCQkJOiBBRVMtMjU2LUNCQy1ITUFDLVNIQTEJCTogYWVzLTI1Ni1jYmMtaG1hYy1zaGExCisKK0lTTy1VUyAxMDA0NiAyIDEJOiBkaHB1YmxpY251bWJlcgkJOiBYOS40MiBESAorCisjIFJGQyA1NjM5IGN1cnZlIE9JRHMgKHNlZSBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmM1NjM5LnR4dCkKKyMgdmVyc2lvbk9uZSBPQkpFQ1QgSURFTlRJRklFUiA6Oj0geworIyBpc28oMSkgaWRlbnRpZmlmaWVkLW9yZ2FuaXphdGlvbigzKSB0ZWxldHJ1c3QoMzYpIGFsZ29yaXRobSgzKQorIyBzaWduYXR1cmUtYWxnb3JpdGhtKDMpIGVjU2lnbigyKSBlY1N0ZEN1cnZlc0FuZEdlbmVyYXRpb24oOCkKKyMgZWxsaXB0aWNDdXJ2ZSgxKSAxIH0KKzEgMyAzNiAzIDMgMiA4IDEgMSAxIDogYnJhaW5wb29sUDE2MHIxCisxIDMgMzYgMyAzIDIgOCAxIDEgMiA6IGJyYWlucG9vbFAxNjB0MQorMSAzIDM2IDMgMyAyIDggMSAxIDMgOiBicmFpbnBvb2xQMTkycjEKKzEgMyAzNiAzIDMgMiA4IDEgMSA0IDogYnJhaW5wb29sUDE5MnQxCisxIDMgMzYgMyAzIDIgOCAxIDEgNSA6IGJyYWlucG9vbFAyMjRyMQorMSAzIDM2IDMgMyAyIDggMSAxIDYgOiBicmFpbnBvb2xQMjI0dDEKKzEgMyAzNiAzIDMgMiA4IDEgMSA3IDogYnJhaW5wb29sUDI1NnIxCisxIDMgMzYgMyAzIDIgOCAxIDEgOCA6IGJyYWlucG9vbFAyNTZ0MQorMSAzIDM2IDMgMyAyIDggMSAxIDkgOiBicmFpbnBvb2xQMzIwcjEKKzEgMyAzNiAzIDMgMiA4IDEgMSAxMCA6IGJyYWlucG9vbFAzMjB0MQorMSAzIDM2IDMgMyAyIDggMSAxIDExIDogYnJhaW5wb29sUDM4NHIxCisxIDMgMzYgMyAzIDIgOCAxIDEgMTIgOiBicmFpbnBvb2xQMzg0dDEKKzEgMyAzNiAzIDMgMiA4IDEgMSAxMyA6IGJyYWlucG9vbFA1MTJyMQorMSAzIDM2IDMgMyAyIDggMSAxIDE0IDogYnJhaW5wb29sUDUxMnQxICAgICAgICAgICAgCisKKyMgRUNESCBzY2hlbWVzIGZyb20gUkZDNTc1MworIUFsaWFzIHg5LTYzLXNjaGVtZSAxIDMgMTMzIDE2IDg0MCA2MyAwCishQWxpYXMgc2VjZy1zY2hlbWUgY2VydGljb20tYXJjIDEKKworeDktNjMtc2NoZW1lIDIgICA6IGRoU2luZ2xlUGFzcy1zdGRESC1zaGExa2RmLXNjaGVtZQorc2VjZy1zY2hlbWUgMTEgMCA6IGRoU2luZ2xlUGFzcy1zdGRESC1zaGEyMjRrZGYtc2NoZW1lCitzZWNnLXNjaGVtZSAxMSAxIDogZGhTaW5nbGVQYXNzLXN0ZERILXNoYTI1NmtkZi1zY2hlbWUKK3NlY2ctc2NoZW1lIDExIDIgOiBkaFNpbmdsZVBhc3Mtc3RkREgtc2hhMzg0a2RmLXNjaGVtZQorc2VjZy1zY2hlbWUgMTEgMyA6IGRoU2luZ2xlUGFzcy1zdGRESC1zaGE1MTJrZGYtc2NoZW1lCisKK3g5LTYzLXNjaGVtZSAzICAgOiBkaFNpbmdsZVBhc3MtY29mYWN0b3JESC1zaGExa2RmLXNjaGVtZQorc2VjZy1zY2hlbWUgMTQgMCA6IGRoU2luZ2xlUGFzcy1jb2ZhY3RvckRILXNoYTIyNGtkZi1zY2hlbWUKK3NlY2ctc2NoZW1lIDE0IDEgOiBkaFNpbmdsZVBhc3MtY29mYWN0b3JESC1zaGEyNTZrZGYtc2NoZW1lCitzZWNnLXNjaGVtZSAxNCAyIDogZGhTaW5nbGVQYXNzLWNvZmFjdG9yREgtc2hhMzg0a2RmLXNjaGVtZQorc2VjZy1zY2hlbWUgMTQgMyA6IGRoU2luZ2xlUGFzcy1jb2ZhY3RvckRILXNoYTUxMmtkZi1zY2hlbWUKKyMgTklEcyBmb3IgdXNlIHdpdGggbG9va3VwIHRhYmxlcy4KKyAgICAgICAgICAgICAgICAgOiBkaC1zdGQta2RmCisgICAgICAgICAgICAgICAgIDogZGgtY29mYWN0b3Ita2RmCmRpZmYgLS1naXQgYS9jcnlwdG8vcGVtL0NNYWtlTGlzdHMudHh0IGIvY3J5cHRvL3BlbS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjRkMzMwCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3BlbS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDE3IEBACitpbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKKworYWRkX2xpYnJhcnkoCisJcGVtCisKKwlPQkpFQ1QKKworCXBlbV9hbGwuYworCXBlbV9lcnJvci5jCisJcGVtX2luZm8uYworCXBlbV9saWIuYworCXBlbV9vdGguYworCXBlbV9wazguYworCXBlbV9wa2V5LmMKKwlwZW1feDUwOS5jCisJcGVtX3hhdXguYworKQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3BlbS9wZW0uaCBiL2NyeXB0by9wZW0vcGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY5ZmJkMgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9wZW0vcGVtLmgKQEAgLTAsMCArMSw2MTUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk3IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpZm5kZWYgT1BFTlNTTF9IRUFERVJfUEVNX0gKKyNkZWZpbmUgT1BFTlNTTF9IRUFERVJfUEVNX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvYmFzZTY0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NpcGhlci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZGlnZXN0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3N0YWNrLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworI2RlZmluZSBQRU1fQlVGU0laRQkJMTAyNAorCisjZGVmaW5lIFBFTV9PQkpfVU5ERUYJCTAKKyNkZWZpbmUgUEVNX09CSl9YNTA5CQkxCisjZGVmaW5lIFBFTV9PQkpfWDUwOV9SRVEJMgorI2RlZmluZSBQRU1fT0JKX0NSTAkJMworI2RlZmluZSBQRU1fT0JKX1NTTF9TRVNTSU9OCTQKKyNkZWZpbmUgUEVNX09CSl9QUklWX0tFWQkxMAorI2RlZmluZSBQRU1fT0JKX1BSSVZfUlNBCTExCisjZGVmaW5lIFBFTV9PQkpfUFJJVl9EU0EJMTIKKyNkZWZpbmUgUEVNX09CSl9QUklWX0RICQkxMworI2RlZmluZSBQRU1fT0JKX1BVQl9SU0EJCTE0CisjZGVmaW5lIFBFTV9PQkpfUFVCX0RTQQkJMTUKKyNkZWZpbmUgUEVNX09CSl9QVUJfREgJCTE2CisjZGVmaW5lIFBFTV9PQkpfREhQQVJBTVMJMTcKKyNkZWZpbmUgUEVNX09CSl9EU0FQQVJBTVMJMTgKKyNkZWZpbmUgUEVNX09CSl9QUklWX1JTQV9QVUJMSUMJMTkKKyNkZWZpbmUgUEVNX09CSl9QUklWX0VDRFNBCTIwCisjZGVmaW5lIFBFTV9PQkpfUFVCX0VDRFNBCTIxCisjZGVmaW5lIFBFTV9PQkpfRUNQQVJBTUVURVJTCTIyCisKKyNkZWZpbmUgUEVNX0VSUk9SCQkzMAorI2RlZmluZSBQRU1fREVLX0RFU19DQkMgICAgICAgICA0MAorI2RlZmluZSBQRU1fREVLX0lERUFfQ0JDICAgICAgICA0NQorI2RlZmluZSBQRU1fREVLX0RFU19FREUgICAgICAgICA1MAorI2RlZmluZSBQRU1fREVLX0RFU19FQ0IgICAgICAgICA2MAorI2RlZmluZSBQRU1fREVLX1JTQSAgICAgICAgICAgICA3MAorI2RlZmluZSBQRU1fREVLX1JTQV9NRDIgICAgICAgICA4MAorI2RlZmluZSBQRU1fREVLX1JTQV9NRDUgICAgICAgICA5MAorCisjZGVmaW5lIFBFTV9NRF9NRDIJCU5JRF9tZDIKKyNkZWZpbmUgUEVNX01EX01ENQkJTklEX21kNQorI2RlZmluZSBQRU1fTURfU0hBCQlOSURfc2hhCisjZGVmaW5lIFBFTV9NRF9NRDJfUlNBCQlOSURfbWQyV2l0aFJTQUVuY3J5cHRpb24KKyNkZWZpbmUgUEVNX01EX01ENV9SU0EJCU5JRF9tZDVXaXRoUlNBRW5jcnlwdGlvbgorI2RlZmluZSBQRU1fTURfU0hBX1JTQQkJTklEX3NoYTFXaXRoUlNBRW5jcnlwdGlvbgorCisjZGVmaW5lIFBFTV9TVFJJTkdfWDUwOV9PTEQJIlg1MDkgQ0VSVElGSUNBVEUiCisjZGVmaW5lIFBFTV9TVFJJTkdfWDUwOQkJIkNFUlRJRklDQVRFIgorI2RlZmluZSBQRU1fU1RSSU5HX1g1MDlfUEFJUgkiQ0VSVElGSUNBVEUgUEFJUiIKKyNkZWZpbmUgUEVNX1NUUklOR19YNTA5X1RSVVNURUQJIlRSVVNURUQgQ0VSVElGSUNBVEUiCisjZGVmaW5lIFBFTV9TVFJJTkdfWDUwOV9SRVFfT0xECSJORVcgQ0VSVElGSUNBVEUgUkVRVUVTVCIKKyNkZWZpbmUgUEVNX1NUUklOR19YNTA5X1JFUQkiQ0VSVElGSUNBVEUgUkVRVUVTVCIKKyNkZWZpbmUgUEVNX1NUUklOR19YNTA5X0NSTAkiWDUwOSBDUkwiCisjZGVmaW5lIFBFTV9TVFJJTkdfRVZQX1BLRVkJIkFOWSBQUklWQVRFIEtFWSIKKyNkZWZpbmUgUEVNX1NUUklOR19QVUJMSUMJIlBVQkxJQyBLRVkiCisjZGVmaW5lIFBFTV9TVFJJTkdfUlNBCQkiUlNBIFBSSVZBVEUgS0VZIgorI2RlZmluZSBQRU1fU1RSSU5HX1JTQV9QVUJMSUMJIlJTQSBQVUJMSUMgS0VZIgorI2RlZmluZSBQRU1fU1RSSU5HX0RTQQkJIkRTQSBQUklWQVRFIEtFWSIKKyNkZWZpbmUgUEVNX1NUUklOR19EU0FfUFVCTElDCSJEU0EgUFVCTElDIEtFWSIKKyNkZWZpbmUgUEVNX1NUUklOR19QS0NTNwkiUEtDUzciCisjZGVmaW5lIFBFTV9TVFJJTkdfUEtDUzdfU0lHTkVECSJQS0NTICM3IFNJR05FRCBEQVRBIgorI2RlZmluZSBQRU1fU1RSSU5HX1BLQ1M4CSJFTkNSWVBURUQgUFJJVkFURSBLRVkiCisjZGVmaW5lIFBFTV9TVFJJTkdfUEtDUzhJTkYJIlBSSVZBVEUgS0VZIgorI2RlZmluZSBQRU1fU1RSSU5HX0RIUEFSQU1TCSJESCBQQVJBTUVURVJTIgorI2RlZmluZSBQRU1fU1RSSU5HX0RIWFBBUkFNUwkiWDkuNDIgREggUEFSQU1FVEVSUyIKKyNkZWZpbmUgUEVNX1NUUklOR19TU0xfU0VTU0lPTgkiU1NMIFNFU1NJT04gUEFSQU1FVEVSUyIKKyNkZWZpbmUgUEVNX1NUUklOR19EU0FQQVJBTVMJIkRTQSBQQVJBTUVURVJTIgorI2RlZmluZSBQRU1fU1RSSU5HX0VDRFNBX1BVQkxJQyAiRUNEU0EgUFVCTElDIEtFWSIKKyNkZWZpbmUgUEVNX1NUUklOR19FQ1BBUkFNRVRFUlMgIkVDIFBBUkFNRVRFUlMiCisjZGVmaW5lIFBFTV9TVFJJTkdfRUNQUklWQVRFS0VZCSJFQyBQUklWQVRFIEtFWSIKKyNkZWZpbmUgUEVNX1NUUklOR19QQVJBTUVURVJTCSJQQVJBTUVURVJTIgorI2RlZmluZSBQRU1fU1RSSU5HX0NNUwkJIkNNUyIKKworICAvKiBOb3RlIHRoYXQgdGhpcyBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGlzZWQgYnkgUEVNX1NlYWxJbml0IGFuZCBjbGVhbmVkIHVwCisgICAgIGJ5IFBFTV9TZWFsRmluYWwgKGF0IGxlYXN0IGZvciBub3cpICovCit0eXBlZGVmIHN0cnVjdCBQRU1fRW5jb2RlX1NlYWxfc3QKKwl7CisJRVZQX0VOQ09ERV9DVFggZW5jb2RlOworCUVWUF9NRF9DVFggbWQ7CisJRVZQX0NJUEhFUl9DVFggY2lwaGVyOworCX0gUEVNX0VOQ09ERV9TRUFMX0NUWDsKKworLyogZW5jX3R5cGUgaXMgb25lIG9mZiAqLworI2RlZmluZSBQRU1fVFlQRV9FTkNSWVBURUQgICAgICAxMAorI2RlZmluZSBQRU1fVFlQRV9NSUNfT05MWSAgICAgICAyMAorI2RlZmluZSBQRU1fVFlQRV9NSUNfQ0xFQVIgICAgICAzMAorI2RlZmluZSBQRU1fVFlQRV9DTEVBUgkJNDAKKwordHlwZWRlZiBzdHJ1Y3QgcGVtX3JlY2lwX3N0CisJeworCWNoYXIgKm5hbWU7CisJWDUwOV9OQU1FICpkbjsKKworCWludCBjaXBoZXI7CisJaW50IGtleV9lbmM7CisJLyoJY2hhciBpdls4XTsgdW51c2VkIGFuZCB3cm9uZyBzaXplICovCisJfSBQRU1fVVNFUjsKKwordHlwZWRlZiBzdHJ1Y3QgcGVtX2N0eF9zdAorCXsKKwlpbnQgdHlwZTsJCS8qIHdoYXQgdHlwZSBvZiBvYmplY3QgKi8KKworCXN0cnVjdAl7CisJCWludCB2ZXJzaW9uOwkKKwkJaW50IG1vZGU7CQkKKwkJfSBwcm9jX3R5cGU7CisKKwljaGFyICpkb21haW47CisKKwlzdHJ1Y3QJeworCQlpbnQgY2lwaGVyOworCS8qIHVudXNlZCwgYW5kIHdyb25nIHNpemUKKwkgICB1bnNpZ25lZCBjaGFyIGl2WzhdOyAqLworCQl9IERFS19pbmZvOworCQkKKwlQRU1fVVNFUiAqb3JpZ2luYXRvcjsKKworCWludCBudW1fcmVjaXBpZW50OworCVBFTV9VU0VSICoqcmVjaXBpZW50OworCisJLyogWFhYKGJlbik6IGRvbiN0IHRoaW5rIHRoaXMgaXMgdXNlZCEgCisJCVNUQUNLICp4NTA5X2NoYWluOwkvICogY2VydGlmaWNhdGUgY2hhaW4gKi8KKwlFVlBfTUQgKm1kOwkJLyogc2lnbmF0dXJlIHR5cGUgKi8KKworCWludCBtZF9lbmM7CQkvKiBpcyB0aGUgbWQgZW5jcnlwdGVkIG9yIG5vdD8gKi8KKwlpbnQgbWRfbGVuOwkJLyogbGVuZ3RoIG9mIG1kX2RhdGEgKi8KKwljaGFyICptZF9kYXRhOwkJLyogbWVzc2FnZSBkaWdlc3QsIGNvdWxkIGJlIHBrZXkgZW5jcnlwdGVkICovCisKKwlFVlBfQ0lQSEVSICpkZWM7CS8qIGRhdGUgZW5jcnlwdGlvbiBjaXBoZXIgKi8KKwlpbnQga2V5X2xlbjsJCS8qIGtleSBsZW5ndGggKi8KKwl1bnNpZ25lZCBjaGFyICprZXk7CS8qIGtleSAqLworCS8qIHVudXNlZCwgYW5kIHdyb25nIHNpemUKKwkgICB1bnNpZ25lZCBjaGFyIGl2WzhdOyAqLworCisJCisJaW50ICBkYXRhX2VuYzsJCS8qIGlzIHRoZSBkYXRhIGVuY3J5cHRlZCAqLworCWludCBkYXRhX2xlbjsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCX0gUEVNX0NUWDsKKworLyogVGhlc2UgbWFjcm9zIG1ha2UgdGhlIFBFTV9yZWFkL1BFTV93cml0ZSBmdW5jdGlvbnMgZWFzaWVyIHRvIG1haW50YWluIGFuZAorICogd3JpdGUuIE5vdyB0aGV5IGFyZSBhbGwgaW1wbGVtZW50ZWQgd2l0aCBlaXRoZXI6CisgKiBJTVBMRU1FTlRfUEVNX3J3KC4uLikgb3IgSU1QTEVNRU5UX1BFTV9yd19jYiguLi4pCisgKi8KKworI2lmZGVmIE9QRU5TU0xfTk9fRlBfQVBJCisKKyNkZWZpbmUgSU1QTEVNRU5UX1BFTV9yZWFkX2ZwKG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgLyoqLworI2RlZmluZSBJTVBMRU1FTlRfUEVNX3dyaXRlX2ZwKG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgLyoqLworI2RlZmluZSBJTVBMRU1FTlRfUEVNX3dyaXRlX2ZwX2NvbnN0KG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgLyoqLworI2RlZmluZSBJTVBMRU1FTlRfUEVNX3dyaXRlX2NiX2ZwKG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgLyoqLworI2RlZmluZSBJTVBMRU1FTlRfUEVNX3dyaXRlX2NiX2ZwX2NvbnN0KG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgLyoqLworCisjZWxzZQorCisjZGVmaW5lIElNUExFTUVOVF9QRU1fcmVhZF9mcChuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIFwKK3R5cGUgKlBFTV9yZWFkXyMjbmFtZShGSUxFICpmcCwgdHlwZSAqKngsIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpXAoreyBcCityZXR1cm4gUEVNX0FTTjFfcmVhZCgoZDJpX29mX3ZvaWQgKilkMmlfIyNhc24xLCBzdHIsZnAsKHZvaWQgKiopeCxjYix1KTsgXAorfSAKKworI2RlZmluZSBJTVBMRU1FTlRfUEVNX3dyaXRlX2ZwKG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgXAoraW50IFBFTV93cml0ZV8jI25hbWUoRklMRSAqZnAsIHR5cGUgKngpIFwKK3sgXAorcmV0dXJuIFBFTV9BU04xX3dyaXRlKChpMmRfb2Zfdm9pZCAqKWkyZF8jI2FzbjEsc3RyLGZwLHgsTlVMTCxOVUxMLDAsTlVMTCxOVUxMKTsgXAorfQorCisjZGVmaW5lIElNUExFTUVOVF9QRU1fd3JpdGVfZnBfY29uc3QobmFtZSwgdHlwZSwgc3RyLCBhc24xKSBcCitpbnQgUEVNX3dyaXRlXyMjbmFtZShGSUxFICpmcCwgY29uc3QgdHlwZSAqeCkgXAoreyBcCityZXR1cm4gUEVNX0FTTjFfd3JpdGUoKGkyZF9vZl92b2lkICopaTJkXyMjYXNuMSxzdHIsZnAsKHZvaWQgKil4LE5VTEwsTlVMTCwwLE5VTEwsTlVMTCk7IFwKK30KKworI2RlZmluZSBJTVBMRU1FTlRfUEVNX3dyaXRlX2NiX2ZwKG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgXAoraW50IFBFTV93cml0ZV8jI25hbWUoRklMRSAqZnAsIHR5cGUgKngsIGNvbnN0IEVWUF9DSVBIRVIgKmVuYywgXAorCSAgICAgdW5zaWduZWQgY2hhciAqa3N0ciwgaW50IGtsZW4sIHBlbV9wYXNzd29yZF9jYiAqY2IsIFwKKwkJICB2b2lkICp1KSBcCisJeyBcCisJcmV0dXJuIFBFTV9BU04xX3dyaXRlKChpMmRfb2Zfdm9pZCAqKWkyZF8jI2FzbjEsc3RyLGZwLHgsZW5jLGtzdHIsa2xlbixjYix1KTsgXAorCX0KKworI2RlZmluZSBJTVBMRU1FTlRfUEVNX3dyaXRlX2NiX2ZwX2NvbnN0KG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgXAoraW50IFBFTV93cml0ZV8jI25hbWUoRklMRSAqZnAsIHR5cGUgKngsIGNvbnN0IEVWUF9DSVBIRVIgKmVuYywgXAorCSAgICAgdW5zaWduZWQgY2hhciAqa3N0ciwgaW50IGtsZW4sIHBlbV9wYXNzd29yZF9jYiAqY2IsIFwKKwkJICB2b2lkICp1KSBcCisJeyBcCisJcmV0dXJuIFBFTV9BU04xX3dyaXRlKChpMmRfb2Zfdm9pZCAqKWkyZF8jI2FzbjEsc3RyLGZwLHgsZW5jLGtzdHIsa2xlbixjYix1KTsgXAorCX0KKworI2VuZGlmCisKKyNkZWZpbmUgSU1QTEVNRU5UX1BFTV9yZWFkX2JpbyhuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIFwKK3R5cGUgKlBFTV9yZWFkX2Jpb18jI25hbWUoQklPICpicCwgdHlwZSAqKngsIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpXAoreyBcCityZXR1cm4gUEVNX0FTTjFfcmVhZF9iaW8oKGQyaV9vZl92b2lkICopZDJpXyMjYXNuMSwgc3RyLGJwLCh2b2lkICoqKXgsY2IsdSk7IFwKK30KKworI2RlZmluZSBJTVBMRU1FTlRfUEVNX3dyaXRlX2JpbyhuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIFwKK2ludCBQRU1fd3JpdGVfYmlvXyMjbmFtZShCSU8gKmJwLCB0eXBlICp4KSBcCit7IFwKK3JldHVybiBQRU1fQVNOMV93cml0ZV9iaW8oKGkyZF9vZl92b2lkICopaTJkXyMjYXNuMSxzdHIsYnAseCxOVUxMLE5VTEwsMCxOVUxMLE5VTEwpOyBcCit9CisKKyNkZWZpbmUgSU1QTEVNRU5UX1BFTV93cml0ZV9iaW9fY29uc3QobmFtZSwgdHlwZSwgc3RyLCBhc24xKSBcCitpbnQgUEVNX3dyaXRlX2Jpb18jI25hbWUoQklPICpicCwgY29uc3QgdHlwZSAqeCkgXAoreyBcCityZXR1cm4gUEVNX0FTTjFfd3JpdGVfYmlvKChpMmRfb2Zfdm9pZCAqKWkyZF8jI2FzbjEsc3RyLGJwLCh2b2lkICopeCxOVUxMLE5VTEwsMCxOVUxMLE5VTEwpOyBcCit9CisKKyNkZWZpbmUgSU1QTEVNRU5UX1BFTV93cml0ZV9jYl9iaW8obmFtZSwgdHlwZSwgc3RyLCBhc24xKSBcCitpbnQgUEVNX3dyaXRlX2Jpb18jI25hbWUoQklPICpicCwgdHlwZSAqeCwgY29uc3QgRVZQX0NJUEhFUiAqZW5jLCBcCisJICAgICB1bnNpZ25lZCBjaGFyICprc3RyLCBpbnQga2xlbiwgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSkgXAorCXsgXAorCXJldHVybiBQRU1fQVNOMV93cml0ZV9iaW8oKGkyZF9vZl92b2lkICopaTJkXyMjYXNuMSxzdHIsYnAseCxlbmMsa3N0cixrbGVuLGNiLHUpOyBcCisJfQorCisjZGVmaW5lIElNUExFTUVOVF9QRU1fd3JpdGVfY2JfYmlvX2NvbnN0KG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgXAoraW50IFBFTV93cml0ZV9iaW9fIyNuYW1lKEJJTyAqYnAsIHR5cGUgKngsIGNvbnN0IEVWUF9DSVBIRVIgKmVuYywgXAorCSAgICAgdW5zaWduZWQgY2hhciAqa3N0ciwgaW50IGtsZW4sIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpIFwKKwl7IFwKKwlyZXR1cm4gUEVNX0FTTjFfd3JpdGVfYmlvKChpMmRfb2Zfdm9pZCAqKWkyZF8jI2FzbjEsc3RyLGJwLCh2b2lkICopeCxlbmMsa3N0cixrbGVuLGNiLHUpOyBcCisJfQorCisjZGVmaW5lIElNUExFTUVOVF9QRU1fd3JpdGUobmFtZSwgdHlwZSwgc3RyLCBhc24xKSBcCisJSU1QTEVNRU5UX1BFTV93cml0ZV9iaW8obmFtZSwgdHlwZSwgc3RyLCBhc24xKSBcCisJSU1QTEVNRU5UX1BFTV93cml0ZV9mcChuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIAorCisjZGVmaW5lIElNUExFTUVOVF9QRU1fd3JpdGVfY29uc3QobmFtZSwgdHlwZSwgc3RyLCBhc24xKSBcCisJSU1QTEVNRU5UX1BFTV93cml0ZV9iaW9fY29uc3QobmFtZSwgdHlwZSwgc3RyLCBhc24xKSBcCisJSU1QTEVNRU5UX1BFTV93cml0ZV9mcF9jb25zdChuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIAorCisjZGVmaW5lIElNUExFTUVOVF9QRU1fd3JpdGVfY2IobmFtZSwgdHlwZSwgc3RyLCBhc24xKSBcCisJSU1QTEVNRU5UX1BFTV93cml0ZV9jYl9iaW8obmFtZSwgdHlwZSwgc3RyLCBhc24xKSBcCisJSU1QTEVNRU5UX1BFTV93cml0ZV9jYl9mcChuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIAorCisjZGVmaW5lIElNUExFTUVOVF9QRU1fd3JpdGVfY2JfY29uc3QobmFtZSwgdHlwZSwgc3RyLCBhc24xKSBcCisJSU1QTEVNRU5UX1BFTV93cml0ZV9jYl9iaW9fY29uc3QobmFtZSwgdHlwZSwgc3RyLCBhc24xKSBcCisJSU1QTEVNRU5UX1BFTV93cml0ZV9jYl9mcF9jb25zdChuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIAorCisjZGVmaW5lIElNUExFTUVOVF9QRU1fcmVhZChuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIFwKKwlJTVBMRU1FTlRfUEVNX3JlYWRfYmlvKG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgXAorCUlNUExFTUVOVF9QRU1fcmVhZF9mcChuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIAorCisjZGVmaW5lIElNUExFTUVOVF9QRU1fcncobmFtZSwgdHlwZSwgc3RyLCBhc24xKSBcCisJSU1QTEVNRU5UX1BFTV9yZWFkKG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgXAorCUlNUExFTUVOVF9QRU1fd3JpdGUobmFtZSwgdHlwZSwgc3RyLCBhc24xKQorCisjZGVmaW5lIElNUExFTUVOVF9QRU1fcndfY29uc3QobmFtZSwgdHlwZSwgc3RyLCBhc24xKSBcCisJSU1QTEVNRU5UX1BFTV9yZWFkKG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgXAorCUlNUExFTUVOVF9QRU1fd3JpdGVfY29uc3QobmFtZSwgdHlwZSwgc3RyLCBhc24xKQorCisjZGVmaW5lIElNUExFTUVOVF9QRU1fcndfY2IobmFtZSwgdHlwZSwgc3RyLCBhc24xKSBcCisJSU1QTEVNRU5UX1BFTV9yZWFkKG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgXAorCUlNUExFTUVOVF9QRU1fd3JpdGVfY2IobmFtZSwgdHlwZSwgc3RyLCBhc24xKQorCisvKiBUaGVzZSBhcmUgdGhlIHNhbWUgZXhjZXB0IHRoZXkgYXJlIGZvciB0aGUgZGVjbGFyYXRpb25zICovCisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfTk9fRlBfQVBJKQorCisjZGVmaW5lIERFQ0xBUkVfUEVNX3JlYWRfZnAobmFtZSwgdHlwZSkgLyoqLworI2RlZmluZSBERUNMQVJFX1BFTV93cml0ZV9mcChuYW1lLCB0eXBlKSAvKiovCisjZGVmaW5lIERFQ0xBUkVfUEVNX3dyaXRlX2NiX2ZwKG5hbWUsIHR5cGUpIC8qKi8KKworI2Vsc2UKKworI2RlZmluZSBERUNMQVJFX1BFTV9yZWFkX2ZwKG5hbWUsIHR5cGUpIFwKKwl0eXBlICpQRU1fcmVhZF8jI25hbWUoRklMRSAqZnAsIHR5cGUgKip4LCBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KTsKKworI2RlZmluZSBERUNMQVJFX1BFTV93cml0ZV9mcChuYW1lLCB0eXBlKSBcCisJaW50IFBFTV93cml0ZV8jI25hbWUoRklMRSAqZnAsIHR5cGUgKngpOworCisjZGVmaW5lIERFQ0xBUkVfUEVNX3dyaXRlX2ZwX2NvbnN0KG5hbWUsIHR5cGUpIFwKKwlpbnQgUEVNX3dyaXRlXyMjbmFtZShGSUxFICpmcCwgY29uc3QgdHlwZSAqeCk7CisKKyNkZWZpbmUgREVDTEFSRV9QRU1fd3JpdGVfY2JfZnAobmFtZSwgdHlwZSkgXAorCWludCBQRU1fd3JpdGVfIyNuYW1lKEZJTEUgKmZwLCB0eXBlICp4LCBjb25zdCBFVlBfQ0lQSEVSICplbmMsIFwKKwkgICAgIHVuc2lnbmVkIGNoYXIgKmtzdHIsIGludCBrbGVuLCBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KTsKKworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19CSU8KKyNkZWZpbmUgREVDTEFSRV9QRU1fcmVhZF9iaW8obmFtZSwgdHlwZSkgXAorCXR5cGUgKlBFTV9yZWFkX2Jpb18jI25hbWUoQklPICpicCwgdHlwZSAqKngsIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpOworCisjZGVmaW5lIERFQ0xBUkVfUEVNX3dyaXRlX2JpbyhuYW1lLCB0eXBlKSBcCisJaW50IFBFTV93cml0ZV9iaW9fIyNuYW1lKEJJTyAqYnAsIHR5cGUgKngpOworCisjZGVmaW5lIERFQ0xBUkVfUEVNX3dyaXRlX2Jpb19jb25zdChuYW1lLCB0eXBlKSBcCisJaW50IFBFTV93cml0ZV9iaW9fIyNuYW1lKEJJTyAqYnAsIGNvbnN0IHR5cGUgKngpOworCisjZGVmaW5lIERFQ0xBUkVfUEVNX3dyaXRlX2NiX2JpbyhuYW1lLCB0eXBlKSBcCisJaW50IFBFTV93cml0ZV9iaW9fIyNuYW1lKEJJTyAqYnAsIHR5cGUgKngsIGNvbnN0IEVWUF9DSVBIRVIgKmVuYywgXAorCSAgICAgdW5zaWduZWQgY2hhciAqa3N0ciwgaW50IGtsZW4sIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpOworCisjZWxzZQorCisjZGVmaW5lIERFQ0xBUkVfUEVNX3JlYWRfYmlvKG5hbWUsIHR5cGUpIC8qKi8KKyNkZWZpbmUgREVDTEFSRV9QRU1fd3JpdGVfYmlvKG5hbWUsIHR5cGUpIC8qKi8KKyNkZWZpbmUgREVDTEFSRV9QRU1fd3JpdGVfYmlvX2NvbnN0KG5hbWUsIHR5cGUpIC8qKi8KKyNkZWZpbmUgREVDTEFSRV9QRU1fd3JpdGVfY2JfYmlvKG5hbWUsIHR5cGUpIC8qKi8KKworI2VuZGlmCisKKyNkZWZpbmUgREVDTEFSRV9QRU1fd3JpdGUobmFtZSwgdHlwZSkgXAorCURFQ0xBUkVfUEVNX3dyaXRlX2JpbyhuYW1lLCB0eXBlKSBcCisJREVDTEFSRV9QRU1fd3JpdGVfZnAobmFtZSwgdHlwZSkgCisKKyNkZWZpbmUgREVDTEFSRV9QRU1fd3JpdGVfY29uc3QobmFtZSwgdHlwZSkgXAorCURFQ0xBUkVfUEVNX3dyaXRlX2Jpb19jb25zdChuYW1lLCB0eXBlKSBcCisJREVDTEFSRV9QRU1fd3JpdGVfZnBfY29uc3QobmFtZSwgdHlwZSkKKworI2RlZmluZSBERUNMQVJFX1BFTV93cml0ZV9jYihuYW1lLCB0eXBlKSBcCisJREVDTEFSRV9QRU1fd3JpdGVfY2JfYmlvKG5hbWUsIHR5cGUpIFwKKwlERUNMQVJFX1BFTV93cml0ZV9jYl9mcChuYW1lLCB0eXBlKSAKKworI2RlZmluZSBERUNMQVJFX1BFTV9yZWFkKG5hbWUsIHR5cGUpIFwKKwlERUNMQVJFX1BFTV9yZWFkX2JpbyhuYW1lLCB0eXBlKSBcCisJREVDTEFSRV9QRU1fcmVhZF9mcChuYW1lLCB0eXBlKQorCisjZGVmaW5lIERFQ0xBUkVfUEVNX3J3KG5hbWUsIHR5cGUpIFwKKwlERUNMQVJFX1BFTV9yZWFkKG5hbWUsIHR5cGUpIFwKKwlERUNMQVJFX1BFTV93cml0ZShuYW1lLCB0eXBlKQorCisjZGVmaW5lIERFQ0xBUkVfUEVNX3J3X2NvbnN0KG5hbWUsIHR5cGUpIFwKKwlERUNMQVJFX1BFTV9yZWFkKG5hbWUsIHR5cGUpIFwKKwlERUNMQVJFX1BFTV93cml0ZV9jb25zdChuYW1lLCB0eXBlKQorCisjZGVmaW5lIERFQ0xBUkVfUEVNX3J3X2NiKG5hbWUsIHR5cGUpIFwKKwlERUNMQVJFX1BFTV9yZWFkKG5hbWUsIHR5cGUpIFwKKwlERUNMQVJFX1BFTV93cml0ZV9jYihuYW1lLCB0eXBlKQorCisjaWYgMQorLyogInVzZXJkYXRhIjogbmV3IHdpdGggT3BlblNTTCAwLjkuNCAqLwordHlwZWRlZiBpbnQgcGVtX3Bhc3N3b3JkX2NiKGNoYXIgKmJ1ZiwgaW50IHNpemUsIGludCByd2ZsYWcsIHZvaWQgKnVzZXJkYXRhKTsKKyNlbHNlCisvKiBPcGVuU1NMIDAuOS4zLCAwLjkuM2EgKi8KK3R5cGVkZWYgaW50IHBlbV9wYXNzd29yZF9jYihjaGFyICpidWYsIGludCBzaXplLCBpbnQgcndmbGFnKTsKKyNlbmRpZgorCitpbnQJUEVNX2dldF9FVlBfQ0lQSEVSX0lORk8oY2hhciAqaGVhZGVyLCBFVlBfQ0lQSEVSX0lORk8gKmNpcGhlcik7CitpbnQJUEVNX2RvX2hlYWRlciAoRVZQX0NJUEhFUl9JTkZPICpjaXBoZXIsIHVuc2lnbmVkIGNoYXIgKmRhdGEsbG9uZyAqbGVuLAorCXBlbV9wYXNzd29yZF9jYiAqY2FsbGJhY2ssdm9pZCAqdSk7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19CSU8KK2ludAlQRU1fcmVhZF9iaW8oQklPICpicCwgY2hhciAqKm5hbWUsIGNoYXIgKipoZWFkZXIsCisJCXVuc2lnbmVkIGNoYXIgKipkYXRhLGxvbmcgKmxlbik7CitpbnQJUEVNX3dyaXRlX2JpbyhCSU8gKmJwLGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmhkciwKKwkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgbG9uZyBsZW4pOworaW50IFBFTV9ieXRlc19yZWFkX2Jpbyh1bnNpZ25lZCBjaGFyICoqcGRhdGEsIGxvbmcgKnBsZW4sIGNoYXIgKipwbm0sIGNvbnN0IGNoYXIgKm5hbWUsIEJJTyAqYnAsCisJICAgICBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KTsKK3ZvaWQgKglQRU1fQVNOMV9yZWFkX2JpbyhkMmlfb2Zfdm9pZCAqZDJpLCBjb25zdCBjaGFyICpuYW1lLCBCSU8gKmJwLAorCQkJICB2b2lkICoqeCwgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSk7CitpbnQJUEVNX0FTTjFfd3JpdGVfYmlvKGkyZF9vZl92b2lkICppMmQsY29uc3QgY2hhciAqbmFtZSxCSU8gKmJwLCB2b2lkICp4LAorCQkJICAgY29uc3QgRVZQX0NJUEhFUiAqZW5jLHVuc2lnbmVkIGNoYXIgKmtzdHIsaW50IGtsZW4sCisJCQkgICBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KTsKKworU1RBQ0tfT0YoWDUwOV9JTkZPKSAqCVBFTV9YNTA5X0lORk9fcmVhZF9iaW8oQklPICpicCwgU1RBQ0tfT0YoWDUwOV9JTkZPKSAqc2ssIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpOworaW50CVBFTV9YNTA5X0lORk9fd3JpdGVfYmlvKEJJTyAqYnAsWDUwOV9JTkZPICp4aSwgRVZQX0NJUEhFUiAqZW5jLAorCQl1bnNpZ25lZCBjaGFyICprc3RyLCBpbnQga2xlbiwgcGVtX3Bhc3N3b3JkX2NiICpjZCwgdm9pZCAqdSk7CisjZW5kaWYKKworaW50CVBFTV9yZWFkKEZJTEUgKmZwLCBjaGFyICoqbmFtZSwgY2hhciAqKmhlYWRlciwKKwkJdW5zaWduZWQgY2hhciAqKmRhdGEsbG9uZyAqbGVuKTsKK2ludAlQRU1fd3JpdGUoRklMRSAqZnAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmhkciwKKwkJICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCBsb25nIGxlbik7Cit2b2lkICogIFBFTV9BU04xX3JlYWQoZDJpX29mX3ZvaWQgKmQyaSwgY29uc3QgY2hhciAqbmFtZSwgRklMRSAqZnAsIHZvaWQgKip4LAorCQkgICAgICBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KTsKK2ludAlQRU1fQVNOMV93cml0ZShpMmRfb2Zfdm9pZCAqaTJkLGNvbnN0IGNoYXIgKm5hbWUsRklMRSAqZnAsCisJCSAgICAgICB2b2lkICp4LGNvbnN0IEVWUF9DSVBIRVIgKmVuYyx1bnNpZ25lZCBjaGFyICprc3RyLAorCQkgICAgICAgaW50IGtsZW4scGVtX3Bhc3N3b3JkX2NiICpjYWxsYmFjaywgdm9pZCAqdSk7CitTVEFDS19PRihYNTA5X0lORk8pICoJUEVNX1g1MDlfSU5GT19yZWFkKEZJTEUgKmZwLCBTVEFDS19PRihYNTA5X0lORk8pICpzaywKKwlwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KTsKKworaW50CVBFTV9TZWFsSW5pdChQRU1fRU5DT0RFX1NFQUxfQ1RYICpjdHgsIEVWUF9DSVBIRVIgKnR5cGUsCisJCUVWUF9NRCAqbWRfdHlwZSwgdW5zaWduZWQgY2hhciAqKmVrLCBpbnQgKmVrbCwKKwkJdW5zaWduZWQgY2hhciAqaXYsIEVWUF9QS0VZICoqcHViaywgaW50IG5wdWJrKTsKK3ZvaWQJUEVNX1NlYWxVcGRhdGUoUEVNX0VOQ09ERV9TRUFMX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCAqb3V0bCwKKwkJdW5zaWduZWQgY2hhciAqaW4sIGludCBpbmwpOworaW50CVBFTV9TZWFsRmluYWwoUEVNX0VOQ09ERV9TRUFMX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpzaWcsaW50ICpzaWdsLAorCQl1bnNpZ25lZCBjaGFyICpvdXQsIGludCAqb3V0bCwgRVZQX1BLRVkgKnByaXYpOworCit2b2lkICAgIFBFTV9TaWduSW5pdChFVlBfTURfQ1RYICpjdHgsIEVWUF9NRCAqdHlwZSk7Cit2b2lkICAgIFBFTV9TaWduVXBkYXRlKEVWUF9NRF9DVFggKmN0eCx1bnNpZ25lZCBjaGFyICpkLHVuc2lnbmVkIGludCBjbnQpOworaW50CVBFTV9TaWduRmluYWwoRVZQX01EX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpzaWdyZXQsCisJCXVuc2lnbmVkIGludCAqc2lnbGVuLCBFVlBfUEtFWSAqcGtleSk7CisKK2ludAlQRU1fZGVmX2NhbGxiYWNrKGNoYXIgKmJ1ZiwgaW50IG51bSwgaW50IHcsIHZvaWQgKmtleSk7Cit2b2lkCVBFTV9wcm9jX3R5cGUoY2hhciAqYnVmLCBpbnQgdHlwZSk7Cit2b2lkCVBFTV9kZWtfaW5mbyhjaGFyICpidWYsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBsZW4sIGNoYXIgKnN0cik7CisKKworREVDTEFSRV9QRU1fcncoWDUwOSwgWDUwOSkKKworREVDTEFSRV9QRU1fcncoWDUwOV9BVVgsIFg1MDkpCisKK0RFQ0xBUkVfUEVNX3J3KFg1MDlfQ0VSVF9QQUlSLCBYNTA5X0NFUlRfUEFJUikKKworREVDTEFSRV9QRU1fcncoWDUwOV9SRVEsIFg1MDlfUkVRKQorREVDTEFSRV9QRU1fd3JpdGUoWDUwOV9SRVFfTkVXLCBYNTA5X1JFUSkKKworREVDTEFSRV9QRU1fcncoWDUwOV9DUkwsIFg1MDlfQ1JMKQorCisvKiBERUNMQVJFX1BFTV9ydyhQS0NTNywgUEtDUzcpICovCisKK0RFQ0xBUkVfUEVNX3J3KE5FVFNDQVBFX0NFUlRfU0VRVUVOQ0UsIE5FVFNDQVBFX0NFUlRfU0VRVUVOQ0UpCisKK0RFQ0xBUkVfUEVNX3J3KFBLQ1M4LCBYNTA5X1NJRykKKworREVDTEFSRV9QRU1fcncoUEtDUzhfUFJJVl9LRVlfSU5GTywgUEtDUzhfUFJJVl9LRVlfSU5GTykKKworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCitERUNMQVJFX1BFTV9yd19jYihSU0FQcml2YXRlS2V5LCBSU0EpCisKK0RFQ0xBUkVfUEVNX3J3X2NvbnN0KFJTQVB1YmxpY0tleSwgUlNBKQorREVDTEFSRV9QRU1fcncoUlNBX1BVQktFWSwgUlNBKQorCisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorCitERUNMQVJFX1BFTV9yd19jYihEU0FQcml2YXRlS2V5LCBEU0EpCisKK0RFQ0xBUkVfUEVNX3J3KERTQV9QVUJLRVksIERTQSkKKworREVDTEFSRV9QRU1fcndfY29uc3QoRFNBcGFyYW1zLCBEU0EpCisKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fRUMKK0RFQ0xBUkVfUEVNX3J3X2NvbnN0KEVDUEtQYXJhbWV0ZXJzLCBFQ19HUk9VUCkKK0RFQ0xBUkVfUEVNX3J3X2NiKEVDUHJpdmF0ZUtleSwgRUNfS0VZKQorREVDTEFSRV9QRU1fcncoRUNfUFVCS0VZLCBFQ19LRVkpCisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0RICisKK0RFQ0xBUkVfUEVNX3J3X2NvbnN0KERIcGFyYW1zLCBESCkKK0RFQ0xBUkVfUEVNX3dyaXRlX2NvbnN0KERIeHBhcmFtcywgREgpCisKKyNlbmRpZgorCitERUNMQVJFX1BFTV9yd19jYihQcml2YXRlS2V5LCBFVlBfUEtFWSkKKworREVDTEFSRV9QRU1fcncoUFVCS0VZLCBFVlBfUEtFWSkKKworaW50IFBFTV93cml0ZV9iaW9fUEtDUzhQcml2YXRlS2V5X25pZChCSU8gKmJwLCBFVlBfUEtFWSAqeCwgaW50IG5pZCwKKwkJCQkgIGNoYXIgKmtzdHIsIGludCBrbGVuLAorCQkJCSAgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSk7CitpbnQgUEVNX3dyaXRlX2Jpb19QS0NTOFByaXZhdGVLZXkoQklPICosIEVWUF9QS0VZICosIGNvbnN0IEVWUF9DSVBIRVIgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICosIGludCwgcGVtX3Bhc3N3b3JkX2NiICosIHZvaWQgKik7CitpbnQgaTJkX1BLQ1M4UHJpdmF0ZUtleV9iaW8oQklPICpicCwgRVZQX1BLRVkgKngsIGNvbnN0IEVWUF9DSVBIRVIgKmVuYywKKwkJCQkgIGNoYXIgKmtzdHIsIGludCBrbGVuLAorCQkJCSAgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSk7CitpbnQgaTJkX1BLQ1M4UHJpdmF0ZUtleV9uaWRfYmlvKEJJTyAqYnAsIEVWUF9QS0VZICp4LCBpbnQgbmlkLAorCQkJCSAgY2hhciAqa3N0ciwgaW50IGtsZW4sCisJCQkJICBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KTsKK0VWUF9QS0VZICpkMmlfUEtDUzhQcml2YXRlS2V5X2JpbyhCSU8gKmJwLCBFVlBfUEtFWSAqKngsIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpOworCitpbnQgaTJkX1BLQ1M4UHJpdmF0ZUtleV9mcChGSUxFICpmcCwgRVZQX1BLRVkgKngsIGNvbnN0IEVWUF9DSVBIRVIgKmVuYywKKwkJCQkgIGNoYXIgKmtzdHIsIGludCBrbGVuLAorCQkJCSAgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSk7CitpbnQgaTJkX1BLQ1M4UHJpdmF0ZUtleV9uaWRfZnAoRklMRSAqZnAsIEVWUF9QS0VZICp4LCBpbnQgbmlkLAorCQkJCSAgY2hhciAqa3N0ciwgaW50IGtsZW4sCisJCQkJICBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KTsKK2ludCBQRU1fd3JpdGVfUEtDUzhQcml2YXRlS2V5X25pZChGSUxFICpmcCwgRVZQX1BLRVkgKngsIGludCBuaWQsCisJCQkJICBjaGFyICprc3RyLCBpbnQga2xlbiwKKwkJCQkgIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpOworCitFVlBfUEtFWSAqZDJpX1BLQ1M4UHJpdmF0ZUtleV9mcChGSUxFICpmcCwgRVZQX1BLRVkgKip4LCBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KTsKKworaW50IFBFTV93cml0ZV9QS0NTOFByaXZhdGVLZXkoRklMRSAqZnAsRVZQX1BLRVkgKngsY29uc3QgRVZQX0NJUEhFUiAqZW5jLAorCQkJICAgICAgY2hhciAqa3N0cixpbnQga2xlbiwgcGVtX3Bhc3N3b3JkX2NiICpjZCwgdm9pZCAqdSk7CisKK0VWUF9QS0VZICpQRU1fcmVhZF9iaW9fUGFyYW1ldGVycyhCSU8gKmJwLCBFVlBfUEtFWSAqKngpOworaW50IFBFTV93cml0ZV9iaW9fUGFyYW1ldGVycyhCSU8gKmJwLCBFVlBfUEtFWSAqeCk7CisKKworRVZQX1BLRVkgKmIyaV9Qcml2YXRlS2V5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbiwgbG9uZyBsZW5ndGgpOworRVZQX1BLRVkgKmIyaV9QdWJsaWNLZXkoY29uc3QgdW5zaWduZWQgY2hhciAqKmluLCBsb25nIGxlbmd0aCk7CitFVlBfUEtFWSAqYjJpX1ByaXZhdGVLZXlfYmlvKEJJTyAqaW4pOworRVZQX1BLRVkgKmIyaV9QdWJsaWNLZXlfYmlvKEJJTyAqaW4pOworaW50IGkyYl9Qcml2YXRlS2V5X2JpbyhCSU8gKm91dCwgRVZQX1BLRVkgKnBrKTsKK2ludCBpMmJfUHVibGljS2V5X2JpbyhCSU8gKm91dCwgRVZQX1BLRVkgKnBrKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19SQzQKK0VWUF9QS0VZICpiMmlfUFZLX2JpbyhCSU8gKmluLCBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KTsKK2ludCBpMmJfUFZLX2JpbyhCSU8gKm91dCwgRVZQX1BLRVkgKnBrLCBpbnQgZW5jbGV2ZWwsCisJCXBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpOworI2VuZGlmCisKKwordm9pZCBFUlJfbG9hZF9QRU1fc3RyaW5ncyh2b2lkKTsKKworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2RlZmluZSBQRU1fRl9QRU1fcmVhZF9iaW9fREhwYXJhbXMgMTAwCisjZGVmaW5lIFBFTV9GX2xvYWRfaXYgMTAxCisjZGVmaW5lIFBFTV9GX1BFTV93cml0ZSAxMDIKKyNkZWZpbmUgUEVNX0ZfZG9fcGs4cGtleV9mcCAxMDMKKyNkZWZpbmUgUEVNX0ZfUEVNX3JlYWRfUHJpdmF0ZUtleSAxMDQKKyNkZWZpbmUgUEVNX0ZfUEVNX3JlYWRfREhwYXJhbXMgMTA1CisjZGVmaW5lIFBFTV9GX1BFTV9BU04xX3JlYWRfYmlvIDEwNgorI2RlZmluZSBQRU1fRl9QRU1fQVNOMV9yZWFkIDEwNworI2RlZmluZSBQRU1fRl9QRU1fZ2V0X0VWUF9DSVBIRVJfSU5GTyAxMDgKKyNkZWZpbmUgUEVNX0ZfUEVNX1g1MDlfSU5GT19yZWFkIDEwOQorI2RlZmluZSBQRU1fRl9QRU1fcmVhZF9iaW9fUGFyYW1ldGVycyAxMTAKKyNkZWZpbmUgUEVNX0ZfUEVNX3JlYWQgMTExCisjZGVmaW5lIFBFTV9GX1BFTV9YNTA5X0lORk9fcmVhZF9iaW8gMTEyCisjZGVmaW5lIFBFTV9GX1BFTV9YNTA5X0lORk9fd3JpdGVfYmlvIDExMworI2RlZmluZSBQRU1fRl9QRU1fQVNOMV93cml0ZSAxMTQKKyNkZWZpbmUgUEVNX0ZfZDJpX1BLQ1M4UHJpdmF0ZUtleV9iaW8gMTE1CisjZGVmaW5lIFBFTV9GX2QyaV9QS0NTOFByaXZhdGVLZXlfZnAgMTE2CisjZGVmaW5lIFBFTV9GX1BFTV9yZWFkX2Jpb19Qcml2YXRlS2V5IDExNworI2RlZmluZSBQRU1fRl9QRU1fd3JpdGVfUHJpdmF0ZUtleSAxMTgKKyNkZWZpbmUgUEVNX0ZfUEVNX0FTTjFfd3JpdGVfYmlvIDExOQorI2RlZmluZSBQRU1fRl9QRU1fZG9faGVhZGVyIDEyMAorI2RlZmluZSBQRU1fRl9QRU1fd3JpdGVfYmlvIDEyMQorI2RlZmluZSBQRU1fRl9kb19wazhwa2V5IDEyMgorI2RlZmluZSBQRU1fRl9QRU1fcmVhZF9iaW8gMTIzCisjZGVmaW5lIFBFTV9SX05PX1NUQVJUX0xJTkUgMTAwCisjZGVmaW5lIFBFTV9SX05PVF9QUk9DX1RZUEUgMTAxCisjZGVmaW5lIFBFTV9SX1NIT1JUX0hFQURFUiAxMDIKKyNkZWZpbmUgUEVNX1JfQkFEX0lWX0NIQVJTIDEwMworI2RlZmluZSBQRU1fUl9FUlJPUl9DT05WRVJUSU5HX1BSSVZBVEVfS0VZIDEwNAorI2RlZmluZSBQRU1fUl9CQURfRU5EX0xJTkUgMTA1CisjZGVmaW5lIFBFTV9SX0NJUEhFUl9JU19OVUxMIDEwNgorI2RlZmluZSBQRU1fUl9CQURfTUFHSUNfTlVNQkVSIDEwNworI2RlZmluZSBQRU1fUl9CQURfREVDUllQVCAxMDgKKyNkZWZpbmUgUEVNX1JfVU5TVVBQT1JURURfRU5DUllQVElPTiAxMDkKKyNkZWZpbmUgUEVNX1JfUFZLX0RBVEFfVE9PX1NIT1JUIDExMAorI2RlZmluZSBQRU1fUl9QUk9CTEVNU19HRVRUSU5HX1BBU1NXT1JEIDExMQorI2RlZmluZSBQRU1fUl9LRVlCTE9CX0hFQURFUl9QQVJTRV9FUlJPUiAxMTIKKyNkZWZpbmUgUEVNX1JfQklPX1dSSVRFX0ZBSUxVUkUgMTEzCisjZGVmaW5lIFBFTV9SX0lOQ09OU0lTVEVOVF9IRUFERVIgMTE0CisjZGVmaW5lIFBFTV9SX1BVQkxJQ19LRVlfTk9fUlNBIDExNQorI2RlZmluZSBQRU1fUl9FWFBFQ1RJTkdfUFVCTElDX0tFWV9CTE9CIDExNgorI2RlZmluZSBQRU1fUl9LRVlCTE9CX1RPT19TSE9SVCAxMTcKKyNkZWZpbmUgUEVNX1JfQkFEX0JBU0U2NF9ERUNPREUgMTE4CisjZGVmaW5lIFBFTV9SX1JFQURfS0VZIDExOQorI2RlZmluZSBQRU1fUl9CQURfUEFTU1dPUkRfUkVBRCAxMjAKKyNkZWZpbmUgUEVNX1JfVU5TVVBQT1JURURfS0VZX0NPTVBPTkVOVFMgMTIxCisjZGVmaW5lIFBFTV9SX1VOU1VQUE9SVEVEX0NJUEhFUiAxMjIKKyNkZWZpbmUgUEVNX1JfTk9UX0VOQ1JZUFRFRCAxMjMKKyNkZWZpbmUgUEVNX1JfTk9UX0RFS19JTkZPIDEyNAorI2RlZmluZSBQRU1fUl9CQURfVkVSU0lPTl9OVU1CRVIgMTI1CisjZGVmaW5lIFBFTV9SX0VYUEVDVElOR19QUklWQVRFX0tFWV9CTE9CIDEyNgorI2RlZmluZSBQRU1fUl9QVktfVE9PX1NIT1JUIDEyNworCisjZW5kaWYgIC8qIE9QRU5TU0xfSEVBREVSX1BFTV9IICovCmRpZmYgLS1naXQgYS9jcnlwdG8vcGVtL3BlbV9hbGwuYyBiL2NyeXB0by9wZW0vcGVtX2FsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZGMyZTgKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vcGVtL3BlbV9hbGwuYwpAQCAtMCwwICsxLDQ0MiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAyIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4gKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZGguaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2RzYS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wZW0uaD4KKy8qI2luY2x1ZGUgPG9wZW5zc2wvcGtjczcuaD4gKi8KKyNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorCisKK3N0YXRpYyBSU0EgKnBrZXlfZ2V0X3JzYShFVlBfUEtFWSAqa2V5LCBSU0EgKipyc2EpOworc3RhdGljIERTQSAqcGtleV9nZXRfZHNhKEVWUF9QS0VZICprZXksIERTQSAqKmRzYSk7CitzdGF0aWMgRUNfS0VZICpwa2V5X2dldF9lY2tleShFVlBfUEtFWSAqa2V5LCBFQ19LRVkgKiplY2tleSk7CisKKworSU1QTEVNRU5UX1BFTV9ydyhYNTA5X1JFUSwgWDUwOV9SRVEsIFBFTV9TVFJJTkdfWDUwOV9SRVEsIFg1MDlfUkVRKQorCitJTVBMRU1FTlRfUEVNX3dyaXRlKFg1MDlfUkVRX05FVywgWDUwOV9SRVEsIFBFTV9TVFJJTkdfWDUwOV9SRVFfT0xELCBYNTA5X1JFUSkKKworSU1QTEVNRU5UX1BFTV9ydyhYNTA5X0NSTCwgWDUwOV9DUkwsIFBFTV9TVFJJTkdfWDUwOV9DUkwsIFg1MDlfQ1JMKQorCisKKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKworLyogV2UgdHJlYXQgUlNBIG9yIERTQSBwcml2YXRlIGtleXMgYXMgYSBzcGVjaWFsIGNhc2UuCisgKgorICogRm9yIHByaXZhdGUga2V5cyB3ZSByZWFkIGluIGFuIEVWUF9QS0VZIHN0cnVjdHVyZSB3aXRoCisgKiBQRU1fcmVhZF9iaW9fUHJpdmF0ZUtleSgpIGFuZCBleHRyYWN0IHRoZSByZWxldmFudCBwcml2YXRlCisgKiBrZXk6IHRoaXMgbWVhbnMgY2FuIGhhbmRsZSAidHJhZGl0aW9uYWwiIGFuZCBQS0NTIzggZm9ybWF0cworICogdHJhbnNwYXJlbnRseS4KKyAqLworCitzdGF0aWMgUlNBICpwa2V5X2dldF9yc2EoRVZQX1BLRVkgKmtleSwgUlNBICoqcnNhKQoreworCVJTQSAqcnRtcDsKKwlpZigha2V5KSByZXR1cm4gTlVMTDsKKwlydG1wID0gRVZQX1BLRVlfZ2V0MV9SU0Eoa2V5KTsKKwlFVlBfUEtFWV9mcmVlKGtleSk7CisJaWYoIXJ0bXApIHJldHVybiBOVUxMOworCWlmKHJzYSkgeworCQlSU0FfZnJlZSgqcnNhKTsKKwkJKnJzYSA9IHJ0bXA7CisJfQorCXJldHVybiBydG1wOworfQorCitSU0EgKlBFTV9yZWFkX2Jpb19SU0FQcml2YXRlS2V5KEJJTyAqYnAsIFJTQSAqKnJzYSwgcGVtX3Bhc3N3b3JkX2NiICpjYiwKKwkJCQkJCQkJdm9pZCAqdSkKK3sKKwlFVlBfUEtFWSAqcGt0bXA7CisJcGt0bXAgPSBQRU1fcmVhZF9iaW9fUHJpdmF0ZUtleShicCwgTlVMTCwgY2IsIHUpOworCXJldHVybiBwa2V5X2dldF9yc2EocGt0bXAsIHJzYSk7Cit9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKKworUlNBICpQRU1fcmVhZF9SU0FQcml2YXRlS2V5KEZJTEUgKmZwLCBSU0EgKipyc2EsIHBlbV9wYXNzd29yZF9jYiAqY2IsCisJCQkJCQkJCXZvaWQgKnUpCit7CisJRVZQX1BLRVkgKnBrdG1wOworCXBrdG1wID0gUEVNX3JlYWRfUHJpdmF0ZUtleShmcCwgTlVMTCwgY2IsIHUpOworCXJldHVybiBwa2V5X2dldF9yc2EocGt0bXAsIHJzYSk7Cit9CisKKyNlbmRpZgorCisjaWZkZWYgT1BFTlNTTF9GSVBTCisKK2ludCBQRU1fd3JpdGVfYmlvX1JTQVByaXZhdGVLZXkoQklPICpicCwgUlNBICp4LCBjb25zdCBFVlBfQ0lQSEVSICplbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmtzdHIsIGludCBrbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KQoreworCWlmIChGSVBTX21vZGUoKSkKKwkJeworCQlFVlBfUEtFWSAqazsKKwkJaW50IHJldDsKKwkJayA9IEVWUF9QS0VZX25ldygpOworCQlpZiAoIWspCisJCQlyZXR1cm4gMDsKKwkJRVZQX1BLRVlfc2V0MV9SU0EoaywgeCk7CisKKwkJcmV0ID0gUEVNX3dyaXRlX2Jpb19Qcml2YXRlS2V5KGJwLCBrLCBlbmMsIGtzdHIsIGtsZW4sIGNiLCB1KTsKKwkJRVZQX1BLRVlfZnJlZShrKTsKKwkJcmV0dXJuIHJldDsKKwkJfQorCWVsc2UKKwkJcmV0dXJuIFBFTV9BU04xX3dyaXRlX2JpbygoaTJkX29mX3ZvaWQgKilpMmRfUlNBUHJpdmF0ZUtleSwKKwkJCQkJUEVNX1NUUklOR19SU0EsYnAseCxlbmMsa3N0cixrbGVuLGNiLHUpOworfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitpbnQgUEVNX3dyaXRlX1JTQVByaXZhdGVLZXkoRklMRSAqZnAsIFJTQSAqeCwgY29uc3QgRVZQX0NJUEhFUiAqZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICprc3RyLCBpbnQga2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSkKK3sKKwlpZiAoRklQU19tb2RlKCkpCisJCXsKKwkJRVZQX1BLRVkgKms7CisJCWludCByZXQ7CisJCWsgPSBFVlBfUEtFWV9uZXcoKTsKKwkJaWYgKCFrKQorCQkJcmV0dXJuIDA7CisKKwkJRVZQX1BLRVlfc2V0MV9SU0EoaywgeCk7CisKKwkJcmV0ID0gUEVNX3dyaXRlX1ByaXZhdGVLZXkoZnAsIGssIGVuYywga3N0ciwga2xlbiwgY2IsIHUpOworCQlFVlBfUEtFWV9mcmVlKGspOworCQlyZXR1cm4gcmV0OworCQl9CisJZWxzZQorCQlyZXR1cm4gUEVNX0FTTjFfd3JpdGUoKGkyZF9vZl92b2lkICopaTJkX1JTQVByaXZhdGVLZXksCisJCQkJCVBFTV9TVFJJTkdfUlNBLGZwLHgsZW5jLGtzdHIsa2xlbixjYix1KTsKK30KKyNlbmRpZgorCisjZWxzZQorCitJTVBMRU1FTlRfUEVNX3dyaXRlX2NiX2NvbnN0KFJTQVByaXZhdGVLZXksIFJTQSwgUEVNX1NUUklOR19SU0EsIFJTQVByaXZhdGVLZXkpCisKKyNlbmRpZgorCitJTVBMRU1FTlRfUEVNX3J3X2NvbnN0KFJTQVB1YmxpY0tleSwgUlNBLCBQRU1fU1RSSU5HX1JTQV9QVUJMSUMsIFJTQVB1YmxpY0tleSkKK0lNUExFTUVOVF9QRU1fcncoUlNBX1BVQktFWSwgUlNBLCBQRU1fU1RSSU5HX1BVQkxJQywgUlNBX1BVQktFWSkKKworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKKworc3RhdGljIERTQSAqcGtleV9nZXRfZHNhKEVWUF9QS0VZICprZXksIERTQSAqKmRzYSkKK3sKKwlEU0EgKmR0bXA7CisJaWYoIWtleSkgcmV0dXJuIE5VTEw7CisJZHRtcCA9IEVWUF9QS0VZX2dldDFfRFNBKGtleSk7CisJRVZQX1BLRVlfZnJlZShrZXkpOworCWlmKCFkdG1wKSByZXR1cm4gTlVMTDsKKwlpZihkc2EpIHsKKwkJRFNBX2ZyZWUoKmRzYSk7CisJCSpkc2EgPSBkdG1wOworCX0KKwlyZXR1cm4gZHRtcDsKK30KKworRFNBICpQRU1fcmVhZF9iaW9fRFNBUHJpdmF0ZUtleShCSU8gKmJwLCBEU0EgKipkc2EsIHBlbV9wYXNzd29yZF9jYiAqY2IsCisJCQkJCQkJCXZvaWQgKnUpCit7CisJRVZQX1BLRVkgKnBrdG1wOworCXBrdG1wID0gUEVNX3JlYWRfYmlvX1ByaXZhdGVLZXkoYnAsIE5VTEwsIGNiLCB1KTsKKwlyZXR1cm4gcGtleV9nZXRfZHNhKHBrdG1wLCBkc2EpOwkvKiB3aWxsIGZyZWUgcGt0bXAgKi8KK30KKworI2lmZGVmIE9QRU5TU0xfRklQUworCitpbnQgUEVNX3dyaXRlX2Jpb19EU0FQcml2YXRlS2V5KEJJTyAqYnAsIERTQSAqeCwgY29uc3QgRVZQX0NJUEhFUiAqZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICprc3RyLCBpbnQga2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSkKK3sKKwlpZiAoRklQU19tb2RlKCkpCisJCXsKKwkJRVZQX1BLRVkgKms7CisJCWludCByZXQ7CisJCWsgPSBFVlBfUEtFWV9uZXcoKTsKKwkJaWYgKCFrKQorCQkJcmV0dXJuIDA7CisJCUVWUF9QS0VZX3NldDFfRFNBKGssIHgpOworCisJCXJldCA9IFBFTV93cml0ZV9iaW9fUHJpdmF0ZUtleShicCwgaywgZW5jLCBrc3RyLCBrbGVuLCBjYiwgdSk7CisJCUVWUF9QS0VZX2ZyZWUoayk7CisJCXJldHVybiByZXQ7CisJCX0KKwllbHNlCisJCXJldHVybiBQRU1fQVNOMV93cml0ZV9iaW8oKGkyZF9vZl92b2lkICopaTJkX0RTQVByaXZhdGVLZXksCisJCQkJCVBFTV9TVFJJTkdfRFNBLGJwLHgsZW5jLGtzdHIsa2xlbixjYix1KTsKK30KKworI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQoraW50IFBFTV93cml0ZV9EU0FQcml2YXRlS2V5KEZJTEUgKmZwLCBEU0EgKngsIGNvbnN0IEVWUF9DSVBIRVIgKmVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqa3N0ciwgaW50IGtsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpCit7CisJaWYgKEZJUFNfbW9kZSgpKQorCQl7CisJCUVWUF9QS0VZICprOworCQlpbnQgcmV0OworCQlrID0gRVZQX1BLRVlfbmV3KCk7CisJCWlmICghaykKKwkJCXJldHVybiAwOworCQlFVlBfUEtFWV9zZXQxX0RTQShrLCB4KTsKKwkJcmV0ID0gUEVNX3dyaXRlX1ByaXZhdGVLZXkoZnAsIGssIGVuYywga3N0ciwga2xlbiwgY2IsIHUpOworCQlFVlBfUEtFWV9mcmVlKGspOworCQlyZXR1cm4gcmV0OworCQl9CisJZWxzZQorCQlyZXR1cm4gUEVNX0FTTjFfd3JpdGUoKGkyZF9vZl92b2lkICopaTJkX0RTQVByaXZhdGVLZXksCisJCQkJCVBFTV9TVFJJTkdfRFNBLGZwLHgsZW5jLGtzdHIsa2xlbixjYix1KTsKK30KKyNlbmRpZgorCisjZWxzZQorCitJTVBMRU1FTlRfUEVNX3dyaXRlX2NiX2NvbnN0KERTQVByaXZhdGVLZXksIERTQSwgUEVNX1NUUklOR19EU0EsIERTQVByaXZhdGVLZXkpCisKKyNlbmRpZgorCitJTVBMRU1FTlRfUEVNX3J3KERTQV9QVUJLRVksIERTQSwgUEVNX1NUUklOR19QVUJMSUMsIERTQV9QVUJLRVkpCisKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKKworRFNBICpQRU1fcmVhZF9EU0FQcml2YXRlS2V5KEZJTEUgKmZwLCBEU0EgKipkc2EsIHBlbV9wYXNzd29yZF9jYiAqY2IsCisJCQkJCQkJCXZvaWQgKnUpCit7CisJRVZQX1BLRVkgKnBrdG1wOworCXBrdG1wID0gUEVNX3JlYWRfUHJpdmF0ZUtleShmcCwgTlVMTCwgY2IsIHUpOworCXJldHVybiBwa2V5X2dldF9kc2EocGt0bXAsIGRzYSk7CS8qIHdpbGwgZnJlZSBwa3RtcCAqLworfQorCisjZW5kaWYKKworSU1QTEVNRU5UX1BFTV9yd19jb25zdChEU0FwYXJhbXMsIERTQSwgUEVNX1NUUklOR19EU0FQQVJBTVMsIERTQXBhcmFtcykKKworI2VuZGlmCisKKworI2lmbmRlZiBPUEVOU1NMX05PX0VDCitzdGF0aWMgRUNfS0VZICpwa2V5X2dldF9lY2tleShFVlBfUEtFWSAqa2V5LCBFQ19LRVkgKiplY2tleSkKK3sKKwlFQ19LRVkgKmR0bXA7CisJaWYoIWtleSkgcmV0dXJuIE5VTEw7CisJZHRtcCA9IEVWUF9QS0VZX2dldDFfRUNfS0VZKGtleSk7CisJRVZQX1BLRVlfZnJlZShrZXkpOworCWlmKCFkdG1wKSByZXR1cm4gTlVMTDsKKwlpZihlY2tleSkgCisJeworIAkJRUNfS0VZX2ZyZWUoKmVja2V5KTsKKwkJKmVja2V5ID0gZHRtcDsKKwl9CisJcmV0dXJuIGR0bXA7Cit9CisKK0VDX0tFWSAqUEVNX3JlYWRfYmlvX0VDUHJpdmF0ZUtleShCSU8gKmJwLCBFQ19LRVkgKiprZXksIHBlbV9wYXNzd29yZF9jYiAqY2IsCisJCQkJCQkJdm9pZCAqdSkKK3sKKwlFVlBfUEtFWSAqcGt0bXA7CisJcGt0bXAgPSBQRU1fcmVhZF9iaW9fUHJpdmF0ZUtleShicCwgTlVMTCwgY2IsIHUpOworCXJldHVybiBwa2V5X2dldF9lY2tleShwa3RtcCwga2V5KTsJLyogd2lsbCBmcmVlIHBrdG1wICovCit9CisKKy8qIFRPRE8oZm9yayk6IHJlbW92ZSB0aGlzIGNvZGU/ICovCisvKiBJTVBMRU1FTlRfUEVNX3J3X2NvbnN0KEVDUEtQYXJhbWV0ZXJzLCBFQ19HUk9VUCwgUEVNX1NUUklOR19FQ1BBUkFNRVRFUlMsIEVDUEtQYXJhbWV0ZXJzKSAqLworCisKKworI2lmZGVmIE9QRU5TU0xfRklQUworCitpbnQgUEVNX3dyaXRlX2Jpb19FQ1ByaXZhdGVLZXkoQklPICpicCwgRUNfS0VZICp4LCBjb25zdCBFVlBfQ0lQSEVSICplbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmtzdHIsIGludCBrbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KQoreworCWlmIChGSVBTX21vZGUoKSkKKwkJeworCQlFVlBfUEtFWSAqazsKKwkJaW50IHJldDsKKwkJayA9IEVWUF9QS0VZX25ldygpOworCQlpZiAoIWspCisJCQlyZXR1cm4gMDsKKwkJRVZQX1BLRVlfc2V0MV9FQ19LRVkoaywgeCk7CisKKwkJcmV0ID0gUEVNX3dyaXRlX2Jpb19Qcml2YXRlS2V5KGJwLCBrLCBlbmMsIGtzdHIsIGtsZW4sIGNiLCB1KTsKKwkJRVZQX1BLRVlfZnJlZShrKTsKKwkJcmV0dXJuIHJldDsKKwkJfQorCWVsc2UKKwkJcmV0dXJuIFBFTV9BU04xX3dyaXRlX2JpbygoaTJkX29mX3ZvaWQgKilpMmRfRUNQcml2YXRlS2V5LAorCQkJCQkJUEVNX1NUUklOR19FQ1BSSVZBVEVLRVksCisJCQkJCQlicCx4LGVuYyxrc3RyLGtsZW4sY2IsdSk7Cit9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKK2ludCBQRU1fd3JpdGVfRUNQcml2YXRlS2V5KEZJTEUgKmZwLCBFQ19LRVkgKngsIGNvbnN0IEVWUF9DSVBIRVIgKmVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqa3N0ciwgaW50IGtsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpCit7CisJaWYgKEZJUFNfbW9kZSgpKQorCQl7CisJCUVWUF9QS0VZICprOworCQlpbnQgcmV0OworCQlrID0gRVZQX1BLRVlfbmV3KCk7CisJCWlmICghaykKKwkJCXJldHVybiAwOworCQlFVlBfUEtFWV9zZXQxX0VDX0tFWShrLCB4KTsKKwkJcmV0ID0gUEVNX3dyaXRlX1ByaXZhdGVLZXkoZnAsIGssIGVuYywga3N0ciwga2xlbiwgY2IsIHUpOworCQlFVlBfUEtFWV9mcmVlKGspOworCQlyZXR1cm4gcmV0OworCQl9CisJZWxzZQorCQlyZXR1cm4gUEVNX0FTTjFfd3JpdGUoKGkyZF9vZl92b2lkICopaTJkX0VDUHJpdmF0ZUtleSwKKwkJCQkJCVBFTV9TVFJJTkdfRUNQUklWQVRFS0VZLAorCQkJCQkJZnAseCxlbmMsa3N0cixrbGVuLGNiLHUpOworfQorI2VuZGlmCisKKyNlbHNlCisKK0lNUExFTUVOVF9QRU1fd3JpdGVfY2IoRUNQcml2YXRlS2V5LCBFQ19LRVksIFBFTV9TVFJJTkdfRUNQUklWQVRFS0VZLCBFQ1ByaXZhdGVLZXkpCisKKyNlbmRpZgorCitJTVBMRU1FTlRfUEVNX3J3KEVDX1BVQktFWSwgRUNfS0VZLCBQRU1fU1RSSU5HX1BVQkxJQywgRUNfUFVCS0VZKQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCisgCitFQ19LRVkgKlBFTV9yZWFkX0VDUHJpdmF0ZUtleShGSUxFICpmcCwgRUNfS0VZICoqZWNrZXksIHBlbV9wYXNzd29yZF9jYiAqY2IsCisgCQkJCQkJCQl2b2lkICp1KQoreworCUVWUF9QS0VZICpwa3RtcDsKKwlwa3RtcCA9IFBFTV9yZWFkX1ByaXZhdGVLZXkoZnAsIE5VTEwsIGNiLCB1KTsKKwlyZXR1cm4gcGtleV9nZXRfZWNrZXkocGt0bXAsIGVja2V5KTsJLyogd2lsbCBmcmVlIHBrdG1wICovCit9CisKKyNlbmRpZgorCisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0RICisKK0lNUExFTUVOVF9QRU1fd3JpdGVfY29uc3QoREhwYXJhbXMsIERILCBQRU1fU1RSSU5HX0RIUEFSQU1TLCBESHBhcmFtcykKKworLyogVE9ETyhmb3JrKTogcmVtb3ZlIHRoaXMgY29kZT8gKi8KKy8qIElNUExFTUVOVF9QRU1fd3JpdGVfY29uc3QoREh4cGFyYW1zLCBESCwgUEVNX1NUUklOR19ESFhQQVJBTVMsIERIeHBhcmFtcykgKi8KKworI2VuZGlmCisKK0lNUExFTUVOVF9QRU1fcncoUFVCS0VZLCBFVlBfUEtFWSwgUEVNX1NUUklOR19QVUJMSUMsIFBVQktFWSkKZGlmZiAtLWdpdCBhL2NyeXB0by9wZW0vcGVtX2Vycm9yLmMgYi9jcnlwdG8vcGVtL3BlbV9lcnJvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YzliMzIKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vcGVtL3BlbV9lcnJvci5jCkBAIC0wLDAgKzEsNzMgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNCwgR29vZ2xlIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisKKyNpbmNsdWRlICJwZW0uaCIKKworY29uc3QgRVJSX1NUUklOR19EQVRBIFBFTV9lcnJvcl9zdHJpbmdfZGF0YVtdID0geworICB7RVJSX1BBQ0soRVJSX0xJQl9QRU0sIFBFTV9GX1BFTV9BU04xX3JlYWQsIDApLCAiUEVNX0FTTjFfcmVhZCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9QRU0sIFBFTV9GX1BFTV9BU04xX3JlYWRfYmlvLCAwKSwgIlBFTV9BU04xX3JlYWRfYmlvIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1BFTSwgUEVNX0ZfUEVNX0FTTjFfd3JpdGUsIDApLCAiUEVNX0FTTjFfd3JpdGUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUEVNLCBQRU1fRl9QRU1fQVNOMV93cml0ZV9iaW8sIDApLCAiUEVNX0FTTjFfd3JpdGVfYmlvIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1BFTSwgUEVNX0ZfUEVNX1g1MDlfSU5GT19yZWFkLCAwKSwgIlBFTV9YNTA5X0lORk9fcmVhZCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9QRU0sIFBFTV9GX1BFTV9YNTA5X0lORk9fcmVhZF9iaW8sIDApLCAiUEVNX1g1MDlfSU5GT19yZWFkX2JpbyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9QRU0sIFBFTV9GX1BFTV9YNTA5X0lORk9fd3JpdGVfYmlvLCAwKSwgIlBFTV9YNTA5X0lORk9fd3JpdGVfYmlvIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1BFTSwgUEVNX0ZfUEVNX2RvX2hlYWRlciwgMCksICJQRU1fZG9faGVhZGVyIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1BFTSwgUEVNX0ZfUEVNX2dldF9FVlBfQ0lQSEVSX0lORk8sIDApLCAiUEVNX2dldF9FVlBfQ0lQSEVSX0lORk8ifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUEVNLCBQRU1fRl9QRU1fcmVhZCwgMCksICJQRU1fcmVhZCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9QRU0sIFBFTV9GX1BFTV9yZWFkX0RIcGFyYW1zLCAwKSwgIlBFTV9yZWFkX0RIcGFyYW1zIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1BFTSwgUEVNX0ZfUEVNX3JlYWRfUHJpdmF0ZUtleSwgMCksICJQRU1fcmVhZF9Qcml2YXRlS2V5In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1BFTSwgUEVNX0ZfUEVNX3JlYWRfYmlvLCAwKSwgIlBFTV9yZWFkX2JpbyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9QRU0sIFBFTV9GX1BFTV9yZWFkX2Jpb19ESHBhcmFtcywgMCksICJQRU1fcmVhZF9iaW9fREhwYXJhbXMifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUEVNLCBQRU1fRl9QRU1fcmVhZF9iaW9fUGFyYW1ldGVycywgMCksICJQRU1fcmVhZF9iaW9fUGFyYW1ldGVycyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9QRU0sIFBFTV9GX1BFTV9yZWFkX2Jpb19Qcml2YXRlS2V5LCAwKSwgIlBFTV9yZWFkX2Jpb19Qcml2YXRlS2V5In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1BFTSwgUEVNX0ZfUEVNX3dyaXRlLCAwKSwgIlBFTV93cml0ZSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9QRU0sIFBFTV9GX1BFTV93cml0ZV9Qcml2YXRlS2V5LCAwKSwgIlBFTV93cml0ZV9Qcml2YXRlS2V5In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1BFTSwgUEVNX0ZfUEVNX3dyaXRlX2JpbywgMCksICJQRU1fd3JpdGVfYmlvIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1BFTSwgUEVNX0ZfZDJpX1BLQ1M4UHJpdmF0ZUtleV9iaW8sIDApLCAiZDJpX1BLQ1M4UHJpdmF0ZUtleV9iaW8ifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUEVNLCBQRU1fRl9kMmlfUEtDUzhQcml2YXRlS2V5X2ZwLCAwKSwgImQyaV9QS0NTOFByaXZhdGVLZXlfZnAifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUEVNLCBQRU1fRl9kb19wazhwa2V5LCAwKSwgImRvX3BrOHBrZXkifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUEVNLCBQRU1fRl9kb19wazhwa2V5X2ZwLCAwKSwgImRvX3BrOHBrZXlfZnAifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUEVNLCBQRU1fRl9sb2FkX2l2LCAwKSwgImxvYWRfaXYifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUEVNLCAwLCBQRU1fUl9CQURfQkFTRTY0X0RFQ09ERSksICJCQURfQkFTRTY0X0RFQ09ERSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9QRU0sIDAsIFBFTV9SX0JBRF9ERUNSWVBUKSwgIkJBRF9ERUNSWVBUIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1BFTSwgMCwgUEVNX1JfQkFEX0VORF9MSU5FKSwgIkJBRF9FTkRfTElORSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9QRU0sIDAsIFBFTV9SX0JBRF9JVl9DSEFSUyksICJCQURfSVZfQ0hBUlMifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUEVNLCAwLCBQRU1fUl9CQURfTUFHSUNfTlVNQkVSKSwgIkJBRF9NQUdJQ19OVU1CRVIifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUEVNLCAwLCBQRU1fUl9CQURfUEFTU1dPUkRfUkVBRCksICJCQURfUEFTU1dPUkRfUkVBRCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9QRU0sIDAsIFBFTV9SX0JBRF9WRVJTSU9OX05VTUJFUiksICJCQURfVkVSU0lPTl9OVU1CRVIifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUEVNLCAwLCBQRU1fUl9CSU9fV1JJVEVfRkFJTFVSRSksICJCSU9fV1JJVEVfRkFJTFVSRSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9QRU0sIDAsIFBFTV9SX0NJUEhFUl9JU19OVUxMKSwgIkNJUEhFUl9JU19OVUxMIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1BFTSwgMCwgUEVNX1JfRVJST1JfQ09OVkVSVElOR19QUklWQVRFX0tFWSksICJFUlJPUl9DT05WRVJUSU5HX1BSSVZBVEVfS0VZIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1BFTSwgMCwgUEVNX1JfRVhQRUNUSU5HX1BSSVZBVEVfS0VZX0JMT0IpLCAiRVhQRUNUSU5HX1BSSVZBVEVfS0VZX0JMT0IifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUEVNLCAwLCBQRU1fUl9FWFBFQ1RJTkdfUFVCTElDX0tFWV9CTE9CKSwgIkVYUEVDVElOR19QVUJMSUNfS0VZX0JMT0IifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUEVNLCAwLCBQRU1fUl9JTkNPTlNJU1RFTlRfSEVBREVSKSwgIklOQ09OU0lTVEVOVF9IRUFERVIifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUEVNLCAwLCBQRU1fUl9LRVlCTE9CX0hFQURFUl9QQVJTRV9FUlJPUiksICJLRVlCTE9CX0hFQURFUl9QQVJTRV9FUlJPUiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9QRU0sIDAsIFBFTV9SX0tFWUJMT0JfVE9PX1NIT1JUKSwgIktFWUJMT0JfVE9PX1NIT1JUIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1BFTSwgMCwgUEVNX1JfTk9UX0RFS19JTkZPKSwgIk5PVF9ERUtfSU5GTyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9QRU0sIDAsIFBFTV9SX05PVF9FTkNSWVBURUQpLCAiTk9UX0VOQ1JZUFRFRCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9QRU0sIDAsIFBFTV9SX05PVF9QUk9DX1RZUEUpLCAiTk9UX1BST0NfVFlQRSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9QRU0sIDAsIFBFTV9SX05PX1NUQVJUX0xJTkUpLCAiTk9fU1RBUlRfTElORSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9QRU0sIDAsIFBFTV9SX1BST0JMRU1TX0dFVFRJTkdfUEFTU1dPUkQpLCAiUFJPQkxFTVNfR0VUVElOR19QQVNTV09SRCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9QRU0sIDAsIFBFTV9SX1BVQkxJQ19LRVlfTk9fUlNBKSwgIlBVQkxJQ19LRVlfTk9fUlNBIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1BFTSwgMCwgUEVNX1JfUFZLX0RBVEFfVE9PX1NIT1JUKSwgIlBWS19EQVRBX1RPT19TSE9SVCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9QRU0sIDAsIFBFTV9SX1BWS19UT09fU0hPUlQpLCAiUFZLX1RPT19TSE9SVCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9QRU0sIDAsIFBFTV9SX1JFQURfS0VZKSwgIlJFQURfS0VZIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1BFTSwgMCwgUEVNX1JfU0hPUlRfSEVBREVSKSwgIlNIT1JUX0hFQURFUiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9QRU0sIDAsIFBFTV9SX1VOU1VQUE9SVEVEX0NJUEhFUiksICJVTlNVUFBPUlRFRF9DSVBIRVIifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUEVNLCAwLCBQRU1fUl9VTlNVUFBPUlRFRF9FTkNSWVBUSU9OKSwgIlVOU1VQUE9SVEVEX0VOQ1JZUFRJT04ifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUEVNLCAwLCBQRU1fUl9VTlNVUFBPUlRFRF9LRVlfQ09NUE9ORU5UUyksICJVTlNVUFBPUlRFRF9LRVlfQ09NUE9ORU5UUyJ9LAorICB7MCwgTlVMTH0sCit9OwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3BlbS9wZW1faW5mby5jIGIvY3J5cHRvL3BlbS9wZW1faW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MzZlNDkKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vcGVtL3BlbV9pbmZvLmMKQEAgLTAsMCArMSw0MDkgQEAKKy8qIGNyeXB0by9wZW0vcGVtX2luZm8uYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9wZW0uaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2J1Zi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZHNhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorCisKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKK1NUQUNLX09GKFg1MDlfSU5GTykgKlBFTV9YNTA5X0lORk9fcmVhZChGSUxFICpmcCwgU1RBQ0tfT0YoWDUwOV9JTkZPKSAqc2ssIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpCisJeworICAgICAgICBCSU8gKmI7CisgICAgICAgIFNUQUNLX09GKFg1MDlfSU5GTykgKnJldDsKKworICAgICAgICBpZiAoKGI9QklPX25ldyhCSU9fc19maWxlKCkpKSA9PSBOVUxMKQorCQl7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX1g1MDlfSU5GT19yZWFkLCBFUlJfUl9CVUZfTElCKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisJCX0KKyAgICAgICAgQklPX3NldF9mcChiLGZwLEJJT19OT0NMT1NFKTsKKyAgICAgICAgcmV0PVBFTV9YNTA5X0lORk9fcmVhZF9iaW8oYixzayxjYix1KTsKKyAgICAgICAgQklPX2ZyZWUoYik7CisgICAgICAgIHJldHVybihyZXQpOworCX0KKyNlbmRpZgorCitTVEFDS19PRihYNTA5X0lORk8pICpQRU1fWDUwOV9JTkZPX3JlYWRfYmlvKEJJTyAqYnAsIFNUQUNLX09GKFg1MDlfSU5GTykgKnNrLCBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KQorCXsKKwlYNTA5X0lORk8gKnhpPU5VTEw7CisJY2hhciAqbmFtZT1OVUxMLCpoZWFkZXI9TlVMTDsKKwl2b2lkICpwcDsKKwl1bnNpZ25lZCBjaGFyICpkYXRhPU5VTEw7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKwlsb25nIGxlbixlcnJvcj0wOworCWludCBvaz0wOworCVNUQUNLX09GKFg1MDlfSU5GTykgKnJldD1OVUxMOworCXVuc2lnbmVkIGludCBpLHJhdyxwdHlwZTsKKwlkMmlfb2Zfdm9pZCAqZDJpID0gMDsKKworCWlmIChzayA9PSBOVUxMKQorCQl7CisJCWlmICgocmV0PXNrX1g1MDlfSU5GT19uZXdfbnVsbCgpKSA9PSBOVUxMKQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fWDUwOV9JTkZPX3JlYWRfYmlvLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCWVsc2UKKwkJcmV0PXNrOworCisJaWYgKCh4aT1YNTA5X0lORk9fbmV3KCkpID09IE5VTEwpIGdvdG8gZXJyOworCWZvciAoOzspCisJCXsKKwkJcmF3PTA7CisJCXB0eXBlID0gMDsKKwkJaT1QRU1fcmVhZF9iaW8oYnAsJm5hbWUsJmhlYWRlciwmZGF0YSwmbGVuKTsKKwkJaWYgKGkgPT0gMCkKKwkJCXsKKwkJCWVycm9yPUVSUl9HRVRfUkVBU09OKEVSUl9wZWVrX2xhc3RfZXJyb3IoKSk7CisJCQlpZiAoZXJyb3IgPT0gUEVNX1JfTk9fU1RBUlRfTElORSkKKwkJCQl7CisJCQkJRVJSX2NsZWFyX2Vycm9yKCk7CisJCQkJYnJlYWs7CisJCQkJfQorCQkJZ290byBlcnI7CisJCQl9CitzdGFydDoKKwkJaWYgKAkoc3RyY21wKG5hbWUsUEVNX1NUUklOR19YNTA5KSA9PSAwKSB8fAorCQkJKHN0cmNtcChuYW1lLFBFTV9TVFJJTkdfWDUwOV9PTEQpID09IDApKQorCQkJeworCQkJZDJpPShEMklfT0Yodm9pZCkpZDJpX1g1MDk7CisJCQlpZiAoeGktPng1MDkgIT0gTlVMTCkKKwkJCQl7CisJCQkJaWYgKCFza19YNTA5X0lORk9fcHVzaChyZXQseGkpKSBnb3RvIGVycjsKKwkJCQlpZiAoKHhpPVg1MDlfSU5GT19uZXcoKSkgPT0gTlVMTCkgZ290byBlcnI7CisJCQkJZ290byBzdGFydDsKKwkJCQl9CisJCQlwcD0mKHhpLT54NTA5KTsKKwkJCX0KKwkJZWxzZSBpZiAoKHN0cmNtcChuYW1lLFBFTV9TVFJJTkdfWDUwOV9UUlVTVEVEKSA9PSAwKSkKKwkJCXsKKwkJCWQyaT0oRDJJX09GKHZvaWQpKWQyaV9YNTA5X0FVWDsKKwkJCWlmICh4aS0+eDUwOSAhPSBOVUxMKQorCQkJCXsKKwkJCQlpZiAoIXNrX1g1MDlfSU5GT19wdXNoKHJldCx4aSkpIGdvdG8gZXJyOworCQkJCWlmICgoeGk9WDUwOV9JTkZPX25ldygpKSA9PSBOVUxMKSBnb3RvIGVycjsKKwkJCQlnb3RvIHN0YXJ0OworCQkJCX0KKwkJCXBwPSYoeGktPng1MDkpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAobmFtZSxQRU1fU1RSSU5HX1g1MDlfQ1JMKSA9PSAwKQorCQkJeworCQkJZDJpPShEMklfT0Yodm9pZCkpZDJpX1g1MDlfQ1JMOworCQkJaWYgKHhpLT5jcmwgIT0gTlVMTCkKKwkJCQl7CisJCQkJaWYgKCFza19YNTA5X0lORk9fcHVzaChyZXQseGkpKSBnb3RvIGVycjsKKwkJCQlpZiAoKHhpPVg1MDlfSU5GT19uZXcoKSkgPT0gTlVMTCkgZ290byBlcnI7CisJCQkJZ290byBzdGFydDsKKwkJCQl9CisJCQlwcD0mKHhpLT5jcmwpOworCQkJfQorCQllbHNlCisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisJCQlpZiAoc3RyY21wKG5hbWUsUEVNX1NUUklOR19SU0EpID09IDApCisJCQl7CisJCQlkMmk9KEQySV9PRih2b2lkKSlkMmlfUlNBUHJpdmF0ZUtleTsKKwkJCWlmICh4aS0+eF9wa2V5ICE9IE5VTEwpIAorCQkJCXsKKwkJCQlpZiAoIXNrX1g1MDlfSU5GT19wdXNoKHJldCx4aSkpIGdvdG8gZXJyOworCQkJCWlmICgoeGk9WDUwOV9JTkZPX25ldygpKSA9PSBOVUxMKSBnb3RvIGVycjsKKwkJCQlnb3RvIHN0YXJ0OworCQkJCX0KKworCQkJeGktPmVuY19kYXRhPU5VTEw7CisJCQl4aS0+ZW5jX2xlbj0wOworCisJCQl4aS0+eF9wa2V5PVg1MDlfUEtFWV9uZXcoKTsKKwkJCXB0eXBlPUVWUF9QS0VZX1JTQTsKKwkJCXBwPSZ4aS0+eF9wa2V5LT5kZWNfcGtleTsKKwkJCWlmICgoaW50KXN0cmxlbihoZWFkZXIpID4gMTApIC8qIGFzc3VtZSBlbmNyeXB0ZWQgKi8KKwkJCQlyYXc9MTsKKwkJCX0KKwkJZWxzZQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRFNBCisJCQlpZiAoc3RyY21wKG5hbWUsUEVNX1NUUklOR19EU0EpID09IDApCisJCQl7CisJCQlkMmk9KEQySV9PRih2b2lkKSlkMmlfRFNBUHJpdmF0ZUtleTsKKwkJCWlmICh4aS0+eF9wa2V5ICE9IE5VTEwpIAorCQkJCXsKKwkJCQlpZiAoIXNrX1g1MDlfSU5GT19wdXNoKHJldCx4aSkpIGdvdG8gZXJyOworCQkJCWlmICgoeGk9WDUwOV9JTkZPX25ldygpKSA9PSBOVUxMKSBnb3RvIGVycjsKKwkJCQlnb3RvIHN0YXJ0OworCQkJCX0KKworCQkJeGktPmVuY19kYXRhPU5VTEw7CisJCQl4aS0+ZW5jX2xlbj0wOworCisJCQl4aS0+eF9wa2V5PVg1MDlfUEtFWV9uZXcoKTsKKwkJCXB0eXBlID0gRVZQX1BLRVlfRFNBOworCQkJcHA9JnhpLT54X3BrZXktPmRlY19wa2V5OworCQkJaWYgKChpbnQpc3RybGVuKGhlYWRlcikgPiAxMCkgLyogYXNzdW1lIGVuY3J5cHRlZCAqLworCQkJCXJhdz0xOworCQkJfQorCQllbHNlCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQworIAkJCWlmIChzdHJjbXAobmFtZSxQRU1fU1RSSU5HX0VDUFJJVkFURUtFWSkgPT0gMCkKKyAJCQl7CisgCQkJCWQyaT0oRDJJX09GKHZvaWQpKWQyaV9FQ1ByaXZhdGVLZXk7CisgCQkJCWlmICh4aS0+eF9wa2V5ICE9IE5VTEwpIAorIAkJCQl7CisgCQkJCQlpZiAoIXNrX1g1MDlfSU5GT19wdXNoKHJldCx4aSkpIGdvdG8gZXJyOworIAkJCQkJaWYgKCh4aT1YNTA5X0lORk9fbmV3KCkpID09IE5VTEwpIGdvdG8gZXJyOworIAkJCQkJCWdvdG8gc3RhcnQ7CisgCQkJCX0KKyAKKyAJCQl4aS0+ZW5jX2RhdGE9TlVMTDsKKyAJCQl4aS0+ZW5jX2xlbj0wOworIAorIAkJCXhpLT54X3BrZXk9WDUwOV9QS0VZX25ldygpOworCQkJcHR5cGUgPSBFVlBfUEtFWV9FQzsKKyAJCQlwcD0meGktPnhfcGtleS0+ZGVjX3BrZXk7CisgCQkJaWYgKChpbnQpc3RybGVuKGhlYWRlcikgPiAxMCkgLyogYXNzdW1lIGVuY3J5cHRlZCAqLworIAkJCQlyYXc9MTsKKwkJCX0KKwkJZWxzZQorI2VuZGlmCisJCQl7CisJCQlkMmk9TlVMTDsKKwkJCXBwPU5VTEw7CisJCQl9CisKKwkJaWYgKGQyaSAhPSBOVUxMKQorCQkJeworCQkJaWYgKCFyYXcpCisJCQkJeworCQkJCUVWUF9DSVBIRVJfSU5GTyBjaXBoZXI7CisKKwkJCQlpZiAoIVBFTV9nZXRfRVZQX0NJUEhFUl9JTkZPKGhlYWRlciwmY2lwaGVyKSkKKwkJCQkJZ290byBlcnI7CisJCQkJaWYgKCFQRU1fZG9faGVhZGVyKCZjaXBoZXIsZGF0YSwmbGVuLGNiLHUpKQorCQkJCQlnb3RvIGVycjsKKwkJCQlwPWRhdGE7CisJCQkJaWYgKHB0eXBlKQorCQkJCQl7CisJCQkJCWlmICghZDJpX1ByaXZhdGVLZXkocHR5cGUsIHBwLCAmcCwgbGVuKSkKKwkJCQkJCXsKKwkJCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX1g1MDlfSU5GT19yZWFkX2JpbywgRVJSX1JfQVNOMV9MSUIpOworCQkJCQkJZ290byBlcnI7CisJCQkJCQl9CisJCQkJCX0KKwkJCQllbHNlIGlmIChkMmkocHAsJnAsbGVuKSA9PSBOVUxMKQorCQkJCQl7CisJCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX1g1MDlfSU5GT19yZWFkX2JpbywgRVJSX1JfQVNOMV9MSUIpOworCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCX0KKwkJCWVsc2UKKwkJCQl7IC8qIGVuY3J5cHRlZCBSU0EgZGF0YSAqLworCQkJCWlmICghUEVNX2dldF9FVlBfQ0lQSEVSX0lORk8oaGVhZGVyLAorCQkJCQkmeGktPmVuY19jaXBoZXIpKSBnb3RvIGVycjsKKwkJCQl4aS0+ZW5jX2RhdGE9KGNoYXIgKilkYXRhOworCQkJCXhpLT5lbmNfbGVuPShpbnQpbGVuOworCQkJCWRhdGE9TlVMTDsKKwkJCQl9CisJCQl9CisJCWVsc2UJeworCQkJLyogdW5rbm93biAqLworCQkJfQorCQlpZiAobmFtZSAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUobmFtZSk7CisJCWlmIChoZWFkZXIgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKGhlYWRlcik7CisJCWlmIChkYXRhICE9IE5VTEwpIE9QRU5TU0xfZnJlZShkYXRhKTsKKwkJbmFtZT1OVUxMOworCQloZWFkZXI9TlVMTDsKKwkJZGF0YT1OVUxMOworCQl9CisKKwkvKiBpZiB0aGUgbGFzdCBvbmUgaGFzbid0IGJlZW4gcHVzaGVkIHlldCBhbmQgdGhlcmUgaXMgYW55dGhpbmcKKwkgKiBpbiBpdCB0aGVuIGFkZCBpdCB0byB0aGUgc3RhY2sgLi4uIAorCSAqLworCWlmICgoeGktPng1MDkgIT0gTlVMTCkgfHwgKHhpLT5jcmwgIT0gTlVMTCkgfHwKKwkJKHhpLT54X3BrZXkgIT0gTlVMTCkgfHwgKHhpLT5lbmNfZGF0YSAhPSBOVUxMKSkKKwkJeworCQlpZiAoIXNrX1g1MDlfSU5GT19wdXNoKHJldCx4aSkpIGdvdG8gZXJyOworCQl4aT1OVUxMOworCQl9CisJb2s9MTsKK2VycjoKKwlpZiAoeGkgIT0gTlVMTCkgWDUwOV9JTkZPX2ZyZWUoeGkpOworCWlmICghb2spCisJCXsKKwkJZm9yIChpPTA7ICgoaW50KWkpPHNrX1g1MDlfSU5GT19udW0ocmV0KTsgaSsrKQorCQkJeworCQkJeGk9c2tfWDUwOV9JTkZPX3ZhbHVlKHJldCxpKTsKKwkJCVg1MDlfSU5GT19mcmVlKHhpKTsKKwkJCX0KKwkJaWYgKHJldCAhPSBzaykgc2tfWDUwOV9JTkZPX2ZyZWUocmV0KTsKKwkJcmV0PU5VTEw7CisJCX0KKwkJCisJaWYgKG5hbWUgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKG5hbWUpOworCWlmIChoZWFkZXIgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKGhlYWRlcik7CisJaWYgKGRhdGEgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKGRhdGEpOworCXJldHVybihyZXQpOworCX0KKworCisvKiBBIFRKSCBhZGRpdGlvbiAqLworaW50IFBFTV9YNTA5X0lORk9fd3JpdGVfYmlvKEJJTyAqYnAsIFg1MDlfSU5GTyAqeGksIEVWUF9DSVBIRVIgKmVuYywKKwkgICAgIHVuc2lnbmVkIGNoYXIgKmtzdHIsIGludCBrbGVuLCBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KQorCXsKKwlFVlBfQ0lQSEVSX0NUWCBjdHg7CisJaW50IGkscmV0PTA7CisJdW5zaWduZWQgY2hhciAqZGF0YT1OVUxMOworCWNvbnN0IGNoYXIgKm9ianN0cj1OVUxMOworCWNoYXIgYnVmW1BFTV9CVUZTSVpFXTsKKwl1bnNpZ25lZCBjaGFyICppdj1OVUxMOworCXVuc2lnbmVkIGl2X2xlbiA9IDA7CisJCisJaWYgKGVuYyAhPSBOVUxMKQorCQl7CisJCWl2X2xlbiA9IEVWUF9DSVBIRVJfaXZfbGVuZ3RoKGVuYyk7CisJCW9ianN0cj1PQkpfbmlkMnNuKEVWUF9DSVBIRVJfbmlkKGVuYykpOworCQlpZiAob2Jqc3RyID09IE5VTEwpCisJCQl7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9YNTA5X0lORk9fd3JpdGVfYmlvLCBQRU1fUl9VTlNVUFBPUlRFRF9DSVBIRVIpOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKworCS8qIG5vdyBmb3IgdGhlIGZ1biBwYXJ0IC4uLiBpZiB3ZSBoYXZlIGEgcHJpdmF0ZSBrZXkgdGhlbiAKKwkgKiB3ZSBoYXZlIHRvIGJlIGFibGUgdG8gaGFuZGxlIGEgbm90LXlldC1kZWNyeXB0ZWQga2V5CisJICogYmVpbmcgd3JpdHRlbiBvdXQgY29ycmVjdGx5IC4uLiBpZiBpdCBpcyBkZWNyeXB0ZWQgb3IKKwkgKiBpdCBpcyBub24tZW5jcnlwdGVkIHRoZW4gd2UgdXNlIHRoZSBiYXNlIGNvZGUKKwkgKi8KKwlpZiAoeGktPnhfcGtleSE9TlVMTCkKKwkJeworCQlpZiAoICh4aS0+ZW5jX2RhdGEhPU5VTEwpICYmICh4aS0+ZW5jX2xlbj4wKSApCisJCQl7CisJCQlpZiAoZW5jID09IE5VTEwpCisJCQkJeworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX1g1MDlfSU5GT193cml0ZV9iaW8sIFBFTV9SX0NJUEhFUl9JU19OVUxMKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisKKwkJCS8qIGNvcHkgZnJvbSB3ZWlyZG8gbmFtZXMgaW50byBtb3JlIG5vcm1hbCB0aGluZ3MgKi8KKwkJCWl2PXhpLT5lbmNfY2lwaGVyLml2OworCQkJZGF0YT0odW5zaWduZWQgY2hhciAqKXhpLT5lbmNfZGF0YTsKKwkJCWk9eGktPmVuY19sZW47CisKKwkJCS8qIHdlIHRha2UgdGhlIGVuY3J5cHRpb24gZGF0YSBmcm9tIHRoZQorCQkJICogaW50ZXJuYWwgc3R1ZmYgcmF0aGVyIHRoYW4gd2hhdCB0aGUKKwkJCSAqIHVzZXIgaGFzIHBhc3NlZCB1cyAuLi4gYXMgd2UgaGF2ZSB0byAKKwkJCSAqIG1hdGNoIGV4YWN0bHkgZm9yIHNvbWUgc3RyYW5nZSByZWFzb24KKwkJCSAqLworCQkJb2Jqc3RyPU9CSl9uaWQyc24oCisJCQkJRVZQX0NJUEhFUl9uaWQoeGktPmVuY19jaXBoZXIuY2lwaGVyKSk7CisJCQlpZiAob2Jqc3RyID09IE5VTEwpCisJCQkJeworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX1g1MDlfSU5GT193cml0ZV9iaW8sIFBFTV9SX1VOU1VQUE9SVEVEX0NJUEhFUik7CisJCQkJZ290byBlcnI7CisJCQkJfQorCisJCQkvKiBjcmVhdGUgdGhlIHJpZ2h0IG1hZ2ljIGhlYWRlciBzdHVmZiAqLworCQkJYXNzZXJ0KHN0cmxlbihvYmpzdHIpKzIzKzIqaXZfbGVuKzEzIDw9IHNpemVvZiBidWYpOworCQkJYnVmWzBdPSdcMCc7CisJCQlQRU1fcHJvY190eXBlKGJ1ZixQRU1fVFlQRV9FTkNSWVBURUQpOworCQkJUEVNX2Rla19pbmZvKGJ1ZixvYmpzdHIsaXZfbGVuLChjaGFyICopaXYpOworCisJCQkvKiB1c2UgdGhlIG5vcm1hbCBjb2RlIHRvIHdyaXRlIHRoaW5ncyBvdXQgKi8KKwkJCWk9UEVNX3dyaXRlX2JpbyhicCxQRU1fU1RSSU5HX1JTQSxidWYsZGF0YSxpKTsKKwkJCWlmIChpIDw9IDApIGdvdG8gZXJyOworCQkJfQorCQllbHNlCisJCQl7CisJCQkvKiBBZGQgRFNBL0RIICovCisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisJCQkvKiBub3JtYWwgb3B0aW9uYWxseSBlbmNyeXB0ZWQgc3R1ZmYgKi8KKwkJCWlmIChQRU1fd3JpdGVfYmlvX1JTQVByaXZhdGVLZXkoYnAsCisJCQkJeGktPnhfcGtleS0+ZGVjX3BrZXktPnBrZXkucnNhLAorCQkJCWVuYyxrc3RyLGtsZW4sY2IsdSk8PTApCisJCQkJZ290byBlcnI7CisjZW5kaWYKKwkJCX0KKwkJfQorCisJLyogaWYgd2UgaGF2ZSBhIGNlcnRpZmljYXRlIHRoZW4gd3JpdGUgaXQgb3V0IG5vdyAqLworCWlmICgoeGktPng1MDkgIT0gTlVMTCkgJiYgKFBFTV93cml0ZV9iaW9fWDUwOShicCx4aS0+eDUwOSkgPD0gMCkpCisJCWdvdG8gZXJyOworCisJLyogd2UgYXJlIGlnbm9yaW5nIGFueXRoaW5nIGVsc2UgdGhhdCBpcyBsb2FkZWQgaW50byB0aGUgWDUwOV9JTkZPCisJICogc3RydWN0dXJlIGZvciB0aGUgbW9tZW50IC4uLiBhcyBJIGRvbid0IG5lZWQgaXQgc28gSSdtIG5vdAorCSAqIGNvZGluZyBpdCBoZXJlIGFuZCBFcmljIGNhbiBkbyBpdCB3aGVuIHRoaXMgbWFrZXMgaXQgaW50byB0aGUKKwkgKiBiYXNlIGxpYnJhcnkgLS10amgKKwkgKi8KKworCXJldD0xOworCitlcnI6CisJT1BFTlNTTF9jbGVhbnNlKChjaGFyICopJmN0eCxzaXplb2YoY3R4KSk7CisJT1BFTlNTTF9jbGVhbnNlKGJ1ZixQRU1fQlVGU0laRSk7CisJcmV0dXJuKHJldCk7CisJfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3BlbS9wZW1fbGliLmMgYi9jcnlwdG8vcGVtL3BlbV9saWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2VmZDBhCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3BlbS9wZW1fbGliLmMKQEAgLTAsMCArMSw4MjUgQEAKKy8qIGNyeXB0by9wZW0vcGVtX2xpYi5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9iYXNlNjQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2J1Zi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZGVzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorCisjaW5jbHVkZSAiLi4vZXZwL2ludGVybmFsLmgiCisKKworI2RlZmluZSBNSU5fTEVOR1RICTQKKworc3RhdGljIGludCBsb2FkX2l2KGNoYXIgKipmcm9tcCx1bnNpZ25lZCBjaGFyICp0bywgaW50IG51bSk7CitzdGF0aWMgaW50IGNoZWNrX3BlbShjb25zdCBjaGFyICpubSwgY29uc3QgY2hhciAqbmFtZSk7CitpbnQgcGVtX2NoZWNrX3N1ZmZpeChjb25zdCBjaGFyICpwZW1fc3RyLCBjb25zdCBjaGFyICpzdWZmaXgpOworCit2b2lkIFBFTV9wcm9jX3R5cGUoY2hhciAqYnVmLCBpbnQgdHlwZSkKKwl7CisJY29uc3QgY2hhciAqc3RyOworCisJaWYgKHR5cGUgPT0gUEVNX1RZUEVfRU5DUllQVEVEKQorCQlzdHI9IkVOQ1JZUFRFRCI7CisJZWxzZSBpZiAodHlwZSA9PSBQRU1fVFlQRV9NSUNfQ0xFQVIpCisJCXN0cj0iTUlDLUNMRUFSIjsKKwllbHNlIGlmICh0eXBlID09IFBFTV9UWVBFX01JQ19PTkxZKQorCQlzdHI9Ik1JQy1PTkxZIjsKKwllbHNlCisJCXN0cj0iQkFELVRZUEUiOworCQkKKwlCVUZfc3RybGNhdChidWYsIlByb2MtVHlwZTogNCwiLFBFTV9CVUZTSVpFKTsKKwlCVUZfc3RybGNhdChidWYsc3RyLFBFTV9CVUZTSVpFKTsKKwlCVUZfc3RybGNhdChidWYsIlxuIixQRU1fQlVGU0laRSk7CisJfQorCit2b2lkIFBFTV9kZWtfaW5mbyhjaGFyICpidWYsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBsZW4sIGNoYXIgKnN0cikKKwl7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbWFwWzE3XT0iMDEyMzQ1Njc4OUFCQ0RFRiI7CisJbG9uZyBpOworCWludCBqOworCisJQlVGX3N0cmxjYXQoYnVmLCJERUstSW5mbzogIixQRU1fQlVGU0laRSk7CisJQlVGX3N0cmxjYXQoYnVmLHR5cGUsUEVNX0JVRlNJWkUpOworCUJVRl9zdHJsY2F0KGJ1ZiwiLCIsUEVNX0JVRlNJWkUpOworCWo9c3RybGVuKGJ1Zik7CisJaWYgKGogKyAobGVuICogMikgKyAxID4gUEVNX0JVRlNJWkUpCisgICAgICAgIAlyZXR1cm47CisJZm9yIChpPTA7IGk8bGVuOyBpKyspCisJCXsKKwkJYnVmW2oraSoyXSAgPW1hcFsoc3RyW2ldPj40KSYweDBmXTsKKwkJYnVmW2oraSoyKzFdPW1hcFsoc3RyW2ldICAgKSYweDBmXTsKKwkJfQorCWJ1ZltqK2kqMl09J1xuJzsKKwlidWZbaitpKjIrMV09J1wwJzsKKwl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKK3ZvaWQgKlBFTV9BU04xX3JlYWQoZDJpX29mX3ZvaWQgKmQyaSwgY29uc3QgY2hhciAqbmFtZSwgRklMRSAqZnAsIHZvaWQgKip4LAorCQkgICAgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSkKKwl7CisgICAgICAgIEJJTyAqYjsKKyAgICAgICAgdm9pZCAqcmV0OworCisgICAgICAgIGlmICgoYj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpID09IE5VTEwpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fQVNOMV9yZWFkLCBFUlJfUl9CVUZfTElCKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisJCX0KKyAgICAgICAgQklPX3NldF9mcChiLGZwLEJJT19OT0NMT1NFKTsKKyAgICAgICAgcmV0PVBFTV9BU04xX3JlYWRfYmlvKGQyaSxuYW1lLGIseCxjYix1KTsKKyAgICAgICAgQklPX2ZyZWUoYik7CisgICAgICAgIHJldHVybihyZXQpOworCX0KKyNlbmRpZgorCitzdGF0aWMgaW50IGNoZWNrX3BlbShjb25zdCBjaGFyICpubSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwkvKiBOb3JtYWwgbWF0Y2hpbmcgbm0gYW5kIG5hbWUgKi8KKwlpZiAoIXN0cmNtcChubSxuYW1lKSkgcmV0dXJuIDE7CisKKwkvKiBNYWtlIFBFTV9TVFJJTkdfRVZQX1BLRVkgbWF0Y2ggYW55IHByaXZhdGUga2V5ICovCisKKwlpZighc3RyY21wKG5hbWUsUEVNX1NUUklOR19FVlBfUEtFWSkpCisJCXsKKwkJaW50IHNsZW47CisJCWNvbnN0IEVWUF9QS0VZX0FTTjFfTUVUSE9EICphbWV0aDsKKwkJaWYoIXN0cmNtcChubSxQRU1fU1RSSU5HX1BLQ1M4KSkKKwkJCXJldHVybiAxOworCQlpZighc3RyY21wKG5tLFBFTV9TVFJJTkdfUEtDUzhJTkYpKQorCQkJcmV0dXJuIDE7CisJCXNsZW4gPSBwZW1fY2hlY2tfc3VmZml4KG5tLCAiUFJJVkFURSBLRVkiKTsgCisJCWlmIChzbGVuID4gMCkKKwkJCXsKKwkJCS8qIE5COiBFTkdJTkUgaW1wbGVtZW50YXRpb25zIHdvbnQgY29udGFpbgorCQkJICogYSBkZXByZWNhdGVkIG9sZCBwcml2YXRlIGtleSBkZWNvZGUgZnVuY3Rpb24KKwkJCSAqIHNvIGRvbid0IGxvb2sgZm9yIHRoZW0uCisJCQkgKi8KKwkJCWFtZXRoID0gRVZQX1BLRVlfYXNuMV9maW5kX3N0cihOVUxMLCBubSwgc2xlbik7CisJCQlpZiAoYW1ldGggJiYgYW1ldGgtPm9sZF9wcml2X2RlY29kZSkKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJcmV0dXJuIDA7CisJCX0KKworCWlmKCFzdHJjbXAobmFtZSxQRU1fU1RSSU5HX1BBUkFNRVRFUlMpKQorCQl7CisJCWludCBzbGVuOworCQljb25zdCBFVlBfUEtFWV9BU04xX01FVEhPRCAqYW1ldGg7CisJCXNsZW4gPSBwZW1fY2hlY2tfc3VmZml4KG5tLCAiUEFSQU1FVEVSUyIpOyAKKwkJaWYgKHNsZW4gPiAwKQorCQkJeworCQkJRU5HSU5FICplOworCQkJYW1ldGggPSBFVlBfUEtFWV9hc24xX2ZpbmRfc3RyKCZlLCBubSwgc2xlbik7CisJCQlpZiAoYW1ldGgpCisJCQkJeworCQkJCWludCByOworCQkJCWlmIChhbWV0aC0+cGFyYW1fZGVjb2RlKQorCQkJCQlyID0gMTsKKwkJCQllbHNlCisJCQkJCXIgPSAwOworCQkJCXJldHVybiByOworCQkJCX0KKwkJCX0KKwkJcmV0dXJuIDA7CisJCX0KKwkvKiBJZiByZWFkaW5nIERIIHBhcmFtZXRlcnMgaGFuZGxlIFg5LjQyIERIIGZvcm1hdCB0b28gKi8KKwlpZighc3RyY21wKG5tLFBFTV9TVFJJTkdfREhYUEFSQU1TKSAmJgorCQkhc3RyY21wKG5hbWUsUEVNX1NUUklOR19ESFBBUkFNUykpIHJldHVybiAxOworCisJLyogUGVybWl0IG9sZGVyIHN0cmluZ3MgKi8KKworCWlmKCFzdHJjbXAobm0sUEVNX1NUUklOR19YNTA5X09MRCkgJiYKKwkJIXN0cmNtcChuYW1lLFBFTV9TVFJJTkdfWDUwOSkpIHJldHVybiAxOworCisJaWYoIXN0cmNtcChubSxQRU1fU1RSSU5HX1g1MDlfUkVRX09MRCkgJiYKKwkJIXN0cmNtcChuYW1lLFBFTV9TVFJJTkdfWDUwOV9SRVEpKSByZXR1cm4gMTsKKworCS8qIEFsbG93IG5vcm1hbCBjZXJ0cyB0byBiZSByZWFkIGFzIHRydXN0ZWQgY2VydHMgKi8KKwlpZighc3RyY21wKG5tLFBFTV9TVFJJTkdfWDUwOSkgJiYKKwkJIXN0cmNtcChuYW1lLFBFTV9TVFJJTkdfWDUwOV9UUlVTVEVEKSkgcmV0dXJuIDE7CisKKwlpZighc3RyY21wKG5tLFBFTV9TVFJJTkdfWDUwOV9PTEQpICYmCisJCSFzdHJjbXAobmFtZSxQRU1fU1RSSU5HX1g1MDlfVFJVU1RFRCkpIHJldHVybiAxOworCisJLyogU29tZSBDQXMgdXNlIFBLQ1MjNyB3aXRoIENFUlRJRklDQVRFIGhlYWRlcnMgKi8KKwlpZighc3RyY21wKG5tLCBQRU1fU1RSSU5HX1g1MDkpICYmCisJCSFzdHJjbXAobmFtZSwgUEVNX1NUUklOR19QS0NTNykpIHJldHVybiAxOworCisJaWYoIXN0cmNtcChubSwgUEVNX1NUUklOR19QS0NTN19TSUdORUQpICYmCisJCSFzdHJjbXAobmFtZSwgUEVNX1NUUklOR19QS0NTNykpIHJldHVybiAxOworCisjaWZuZGVmIE9QRU5TU0xfTk9fQ01TCisJaWYoIXN0cmNtcChubSwgUEVNX1NUUklOR19YNTA5KSAmJgorCQkhc3RyY21wKG5hbWUsIFBFTV9TVFJJTkdfQ01TKSkgcmV0dXJuIDE7CisJLyogQWxsb3cgQ01TIHRvIGJlIHJlYWQgZnJvbSBQS0NTIzcgaGVhZGVycyAqLworCWlmKCFzdHJjbXAobm0sIFBFTV9TVFJJTkdfUEtDUzcpICYmCisJCSFzdHJjbXAobmFtZSwgUEVNX1NUUklOR19DTVMpKSByZXR1cm4gMTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK2ludCBQRU1fYnl0ZXNfcmVhZF9iaW8odW5zaWduZWQgY2hhciAqKnBkYXRhLCBsb25nICpwbGVuLCBjaGFyICoqcG5tLCBjb25zdCBjaGFyICpuYW1lLCBCSU8gKmJwLAorCSAgICAgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSkKKwl7CisJRVZQX0NJUEhFUl9JTkZPIGNpcGhlcjsKKwljaGFyICpubT1OVUxMLCpoZWFkZXI9TlVMTDsKKwl1bnNpZ25lZCBjaGFyICpkYXRhPU5VTEw7CisJbG9uZyBsZW47CisJaW50IHJldCA9IDA7CisKKwlmb3IgKDs7KQorCQl7CisJCWlmICghUEVNX3JlYWRfYmlvKGJwLCZubSwmaGVhZGVyLCZkYXRhLCZsZW4pKSB7CisJCQlpZihFUlJfR0VUX1JFQVNPTihFUlJfcGVla19lcnJvcigpKSA9PQorCQkJCVBFTV9SX05PX1NUQVJUX0xJTkUpCisJCQkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJFeHBlY3Rpbmc6ICIsIG5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYoY2hlY2tfcGVtKG5tLCBuYW1lKSkgYnJlYWs7CisJCU9QRU5TU0xfZnJlZShubSk7CisJCU9QRU5TU0xfZnJlZShoZWFkZXIpOworCQlPUEVOU1NMX2ZyZWUoZGF0YSk7CisJCX0KKwlpZiAoIVBFTV9nZXRfRVZQX0NJUEhFUl9JTkZPKGhlYWRlciwmY2lwaGVyKSkgZ290byBlcnI7CisJaWYgKCFQRU1fZG9faGVhZGVyKCZjaXBoZXIsZGF0YSwmbGVuLGNiLHUpKSBnb3RvIGVycjsKKworCSpwZGF0YSA9IGRhdGE7CisJKnBsZW4gPSBsZW47CisKKwlpZiAocG5tKQorCQkqcG5tID0gbm07CisKKwlyZXQgPSAxOworCitlcnI6CisJaWYgKCFyZXQgfHwgIXBubSkgT1BFTlNTTF9mcmVlKG5tKTsKKwlPUEVOU1NMX2ZyZWUoaGVhZGVyKTsKKwlpZiAoIXJldCkgT1BFTlNTTF9mcmVlKGRhdGEpOworCXJldHVybiByZXQ7CisJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitpbnQgUEVNX0FTTjFfd3JpdGUoaTJkX29mX3ZvaWQgKmkyZCwgY29uc3QgY2hhciAqbmFtZSwgRklMRSAqZnAsCisJCSAgIHZvaWQgKngsIGNvbnN0IEVWUF9DSVBIRVIgKmVuYywgdW5zaWduZWQgY2hhciAqa3N0ciwKKwkJICAgaW50IGtsZW4sIHBlbV9wYXNzd29yZF9jYiAqY2FsbGJhY2ssIHZvaWQgKnUpCisgICAgICAgIHsKKyAgICAgICAgQklPICpiOworICAgICAgICBpbnQgcmV0OworCisgICAgICAgIGlmICgoYj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpID09IE5VTEwpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fQVNOMV93cml0ZSwgRVJSX1JfQlVGX0xJQik7CisgICAgICAgICAgICAgICAgcmV0dXJuKDApOworCQl9CisgICAgICAgIEJJT19zZXRfZnAoYixmcCxCSU9fTk9DTE9TRSk7CisgICAgICAgIHJldD1QRU1fQVNOMV93cml0ZV9iaW8oaTJkLG5hbWUsYix4LGVuYyxrc3RyLGtsZW4sY2FsbGJhY2ssdSk7CisgICAgICAgIEJJT19mcmVlKGIpOworICAgICAgICByZXR1cm4ocmV0KTsKKyAgICAgICAgfQorI2VuZGlmCisKK2ludCBQRU1fQVNOMV93cml0ZV9iaW8oaTJkX29mX3ZvaWQgKmkyZCwgY29uc3QgY2hhciAqbmFtZSwgQklPICpicCwKKwkJICAgICAgIHZvaWQgKngsIGNvbnN0IEVWUF9DSVBIRVIgKmVuYywgdW5zaWduZWQgY2hhciAqa3N0ciwKKwkJICAgICAgIGludCBrbGVuLCBwZW1fcGFzc3dvcmRfY2IgKmNhbGxiYWNrLCB2b2lkICp1KQorCXsKKwlFVlBfQ0lQSEVSX0NUWCBjdHg7CisJaW50IGRzaXplPTAsaSxqLHJldD0wOworCXVuc2lnbmVkIGNoYXIgKnAsKmRhdGE9TlVMTDsKKwljb25zdCBjaGFyICpvYmpzdHI9TlVMTDsKKwljaGFyIGJ1ZltQRU1fQlVGU0laRV07CisJdW5zaWduZWQgY2hhciBrZXlbRVZQX01BWF9LRVlfTEVOR1RIXTsKKwl1bnNpZ25lZCBjaGFyIGl2W0VWUF9NQVhfSVZfTEVOR1RIXTsKKwkKKwlpZiAoZW5jICE9IE5VTEwpCisJCXsKKwkJb2Jqc3RyPU9CSl9uaWQyc24oRVZQX0NJUEhFUl9uaWQoZW5jKSk7CisJCWlmIChvYmpzdHIgPT0gTlVMTCkKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX0FTTjFfd3JpdGVfYmlvLCBQRU1fUl9VTlNVUFBPUlRFRF9DSVBIRVIpOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKworCWlmICgoZHNpemU9aTJkKHgsTlVMTCkpIDwgMCkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9BU04xX3dyaXRlX2JpbywgRVJSX1JfQVNOMV9MSUIpOworCQlkc2l6ZT0wOworCQlnb3RvIGVycjsKKwkJfQorCS8qIGR6aXNlICsgOCBieXRlcyBhcmUgbmVlZGVkICovCisJLyogYWN0dWFsbHkgaXQgbmVlZHMgdGhlIGNpcGhlciBibG9jayBzaXplIGV4dHJhLi4uICovCisJZGF0YT0odW5zaWduZWQgY2hhciAqKU9QRU5TU0xfbWFsbG9jKCh1bnNpZ25lZCBpbnQpZHNpemUrMjApOworCWlmIChkYXRhID09IE5VTEwpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fQVNOMV93cml0ZV9iaW8sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJZ290byBlcnI7CisJCX0KKwlwPWRhdGE7CisJaT1pMmQoeCwmcCk7CisKKwlpZiAoZW5jICE9IE5VTEwpCisJCXsKKwkJY29uc3QgdW5zaWduZWQgaXZfbGVuID0gRVZQX0NJUEhFUl9pdl9sZW5ndGgoZW5jKTsKKworCQlpZiAoa3N0ciA9PSBOVUxMKQorCQkJeworCQkJa2xlbiA9IDA7CisJCQlpZiAoY2FsbGJhY2spCisJCQkJa2xlbj0oKmNhbGxiYWNrKShidWYsUEVNX0JVRlNJWkUsMSx1KTsKKwkJCWlmIChrbGVuIDw9IDApCisJCQkJeworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX0FTTjFfd3JpdGVfYmlvLCBQRU1fUl9SRUFEX0tFWSk7CisJCQkJZ290byBlcnI7CisJCQkJfQorI2lmZGVmIENIQVJTRVRfRUJDRElDCisJCQkvKiBDb252ZXJ0IHRoZSBwYXNzIHBocmFzZSBmcm9tIEVCQ0RJQyAqLworCQkJZWJjZGljMmFzY2lpKGJ1ZiwgYnVmLCBrbGVuKTsKKyNlbmRpZgorCQkJa3N0cj0odW5zaWduZWQgY2hhciAqKWJ1ZjsKKwkJCX0KKwkJYXNzZXJ0KGl2X2xlbiA8PSAoaW50KXNpemVvZihpdikpOworCQlpZiAoUkFORF9wc2V1ZG9fYnl0ZXMoaXYsaXZfbGVuKSA8IDApIC8qIEdlbmVyYXRlIGEgc2FsdCAqLworCQkJZ290byBlcnI7CisJCS8qIFRoZSAnaXYnIGlzIHVzZWQgYXMgdGhlIGl2IGFuZCBhcyBhIHNhbHQuICBJdCBpcworCQkgKiBOT1QgdGFrZW4gZnJvbSB0aGUgQnl0ZXNUb0tleSBmdW5jdGlvbiAqLworCQlpZiAoIUVWUF9CeXRlc1RvS2V5KGVuYyxFVlBfbWQ1KCksaXYsa3N0cixrbGVuLDEsa2V5LE5VTEwpKQorCQkJZ290byBlcnI7CisKKwkJaWYgKGtzdHIgPT0gKHVuc2lnbmVkIGNoYXIgKilidWYpIE9QRU5TU0xfY2xlYW5zZShidWYsUEVNX0JVRlNJWkUpOworCisJCWFzc2VydChzdHJsZW4ob2Jqc3RyKSsyMysyKml2X2xlbisxMyA8PSBzaXplb2YgYnVmKTsKKworCQlidWZbMF09J1wwJzsKKwkJUEVNX3Byb2NfdHlwZShidWYsUEVNX1RZUEVfRU5DUllQVEVEKTsKKwkJUEVNX2Rla19pbmZvKGJ1ZixvYmpzdHIsaXZfbGVuLChjaGFyICopaXYpOworCQkvKiBrPXN0cmxlbihidWYpOyAqLworCisJCUVWUF9DSVBIRVJfQ1RYX2luaXQoJmN0eCk7CisJCXJldCA9IDE7CisJCWlmICghRVZQX0VuY3J5cHRJbml0X2V4KCZjdHgsZW5jLE5VTEwsa2V5LGl2KQorCQkJfHwgIUVWUF9FbmNyeXB0VXBkYXRlKCZjdHgsZGF0YSwmaixkYXRhLGkpCisJCQl8fCAhRVZQX0VuY3J5cHRGaW5hbF9leCgmY3R4LCYoZGF0YVtqXSksJmkpKQorCQkJcmV0ID0gMDsKKwkJRVZQX0NJUEhFUl9DVFhfY2xlYW51cCgmY3R4KTsKKwkJaWYgKHJldCA9PSAwKQorCQkJZ290byBlcnI7CisJCWkrPWo7CisJCX0KKwllbHNlCisJCXsKKwkJcmV0PTE7CisJCWJ1ZlswXT0nXDAnOworCQl9CisJaT1QRU1fd3JpdGVfYmlvKGJwLG5hbWUsYnVmLGRhdGEsaSk7CisJaWYgKGkgPD0gMCkgcmV0PTA7CitlcnI6CisJT1BFTlNTTF9jbGVhbnNlKGtleSxzaXplb2Yoa2V5KSk7CisJT1BFTlNTTF9jbGVhbnNlKGl2LHNpemVvZihpdikpOworCU9QRU5TU0xfY2xlYW5zZSgoY2hhciAqKSZjdHgsc2l6ZW9mKGN0eCkpOworCU9QRU5TU0xfY2xlYW5zZShidWYsUEVNX0JVRlNJWkUpOworCWlmIChkYXRhICE9IE5VTEwpCisJCXsKKwkJT1BFTlNTTF9jbGVhbnNlKGRhdGEsKHVuc2lnbmVkIGludClkc2l6ZSk7CisJCU9QRU5TU0xfZnJlZShkYXRhKTsKKwkJfQorCXJldHVybihyZXQpOworCX0KKworaW50IFBFTV9kb19oZWFkZXIoRVZQX0NJUEhFUl9JTkZPICpjaXBoZXIsIHVuc2lnbmVkIGNoYXIgKmRhdGEsIGxvbmcgKnBsZW4sCisJICAgICBwZW1fcGFzc3dvcmRfY2IgKmNhbGxiYWNrLHZvaWQgKnUpCisJeworCWludCBpLGosbyxrbGVuOworCWxvbmcgbGVuOworCUVWUF9DSVBIRVJfQ1RYIGN0eDsKKwl1bnNpZ25lZCBjaGFyIGtleVtFVlBfTUFYX0tFWV9MRU5HVEhdOworCWNoYXIgYnVmW1BFTV9CVUZTSVpFXTsKKworCWxlbj0gKnBsZW47CisKKwlpZiAoY2lwaGVyLT5jaXBoZXIgPT0gTlVMTCkgcmV0dXJuKDEpOworCisJa2xlbiA9IDA7CisJaWYgKGNhbGxiYWNrKQorCQlrbGVuPWNhbGxiYWNrKGJ1ZixQRU1fQlVGU0laRSwwLHUpOworCWlmIChrbGVuIDw9IDApCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fZG9faGVhZGVyLCBQRU1fUl9CQURfUEFTU1dPUkRfUkVBRCk7CisJCXJldHVybigwKTsKKwkJfQorI2lmZGVmIENIQVJTRVRfRUJDRElDCisJLyogQ29udmVydCB0aGUgcGFzcyBwaHJhc2UgZnJvbSBFQkNESUMgKi8KKwllYmNkaWMyYXNjaWkoYnVmLCBidWYsIGtsZW4pOworI2VuZGlmCisKKwlpZiAoIUVWUF9CeXRlc1RvS2V5KGNpcGhlci0+Y2lwaGVyLEVWUF9tZDUoKSwmKGNpcGhlci0+aXZbMF0pLAorCQkodW5zaWduZWQgY2hhciAqKWJ1ZixrbGVuLDEsa2V5LE5VTEwpKQorCQlyZXR1cm4gMDsKKworCWo9KGludClsZW47CisJRVZQX0NJUEhFUl9DVFhfaW5pdCgmY3R4KTsKKwlvID0gRVZQX0RlY3J5cHRJbml0X2V4KCZjdHgsY2lwaGVyLT5jaXBoZXIsTlVMTCwga2V5LCYoY2lwaGVyLT5pdlswXSkpOworCWlmIChvKQorCQlvID0gRVZQX0RlY3J5cHRVcGRhdGUoJmN0eCxkYXRhLCZpLGRhdGEsaik7CisJaWYgKG8pCisJCW8gPSBFVlBfRGVjcnlwdEZpbmFsX2V4KCZjdHgsJihkYXRhW2ldKSwmaik7CisJRVZQX0NJUEhFUl9DVFhfY2xlYW51cCgmY3R4KTsKKwlPUEVOU1NMX2NsZWFuc2UoKGNoYXIgKilidWYsc2l6ZW9mKGJ1ZikpOworCU9QRU5TU0xfY2xlYW5zZSgoY2hhciAqKWtleSxzaXplb2Yoa2V5KSk7CisJaWYgKCFvKQorCQl7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX2RvX2hlYWRlciwgUEVNX1JfQkFEX0RFQ1JZUFQpOworCQlyZXR1cm4oMCk7CisJCX0KKwlqKz1pOworCSpwbGVuPWo7CisJcmV0dXJuKDEpOworCX0KKworc3RhdGljIGNvbnN0IEVWUF9DSVBIRVIqIGNpcGhlcl9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgaWYgKHN0cmNtcChuYW1lLCAiREVTLUNCQyIpID09IDApIHsKKyAgICByZXR1cm4gRVZQX2Rlc19jYmMoKTsKKyAgfSBlbHNlIGlmIChzdHJjbXAobmFtZSwgIkFFUy0xMjgtQ0JDIikgPT0gMCkgeworICAgIHJldHVybiBFVlBfYWVzXzEyOF9jYmMoKTsKKyAgfSBlbHNlIGlmIChzdHJjbXAobmFtZSwgICJBRVMtMjU2LUNCQyIpID09IDApIHsKKyAgICByZXR1cm4gRVZQX2Flc18yNTZfY2JjKCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworaW50IFBFTV9nZXRfRVZQX0NJUEhFUl9JTkZPKGNoYXIgKmhlYWRlciwgRVZQX0NJUEhFUl9JTkZPICpjaXBoZXIpCisJeworCWNvbnN0IEVWUF9DSVBIRVIgKmVuYz1OVUxMOworCWNoYXIgKnAsYzsKKwljaGFyICoqaGVhZGVyX3BwID0gJmhlYWRlcjsKKworCWNpcGhlci0+Y2lwaGVyPU5VTEw7CisJaWYgKChoZWFkZXIgPT0gTlVMTCkgfHwgKCpoZWFkZXIgPT0gJ1wwJykgfHwgKCpoZWFkZXIgPT0gJ1xuJykpCisJCXJldHVybigxKTsKKwlpZiAoc3RybmNtcChoZWFkZXIsIlByb2MtVHlwZTogIiwxMSkgIT0gMCkKKwkJeyBPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9nZXRfRVZQX0NJUEhFUl9JTkZPLCBQRU1fUl9OT1RfUFJPQ19UWVBFKTsgcmV0dXJuKDApOyB9CisJaGVhZGVyKz0xMTsKKwlpZiAoKmhlYWRlciAhPSAnNCcpIHJldHVybigwKTsgaGVhZGVyKys7CisJaWYgKCpoZWFkZXIgIT0gJywnKSByZXR1cm4oMCk7IGhlYWRlcisrOworCWlmIChzdHJuY21wKGhlYWRlciwiRU5DUllQVEVEIiw5KSAhPSAwKQorCQl7IE9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX2dldF9FVlBfQ0lQSEVSX0lORk8sIFBFTV9SX05PVF9FTkNSWVBURUQpOyByZXR1cm4oMCk7IH0KKwlmb3IgKDsgKCpoZWFkZXIgIT0gJ1xuJykgJiYgKCpoZWFkZXIgIT0gJ1wwJyk7IGhlYWRlcisrKQorCQk7CisJaWYgKCpoZWFkZXIgPT0gJ1wwJykKKwkJeyBPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9nZXRfRVZQX0NJUEhFUl9JTkZPLCBQRU1fUl9TSE9SVF9IRUFERVIpOyByZXR1cm4oMCk7IH0KKwloZWFkZXIrKzsKKwlpZiAoc3RybmNtcChoZWFkZXIsIkRFSy1JbmZvOiAiLDEwKSAhPSAwKQorCQl7IE9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX2dldF9FVlBfQ0lQSEVSX0lORk8sIFBFTV9SX05PVF9ERUtfSU5GTyk7IHJldHVybigwKTsgfQorCWhlYWRlcis9MTA7CisKKwlwPWhlYWRlcjsKKwlmb3IgKDs7KQorCQl7CisJCWM9ICpoZWFkZXI7CisjaWZuZGVmIENIQVJTRVRfRUJDRElDCisJCWlmICghKAkoKGMgPj0gJ0EnKSAmJiAoYyA8PSAnWicpKSB8fCAoYyA9PSAnLScpIHx8CisJCQkoKGMgPj0gJzAnKSAmJiAoYyA8PSAnOScpKSkpCisJCQlicmVhazsKKyNlbHNlCisJCWlmICghKAlpc3VwcGVyKGMpIHx8IChjID09ICctJykgfHwKKwkJCWlzZGlnaXQoYykpKQorCQkJYnJlYWs7CisjZW5kaWYKKwkJaGVhZGVyKys7CisJCX0KKwkqaGVhZGVyPSdcMCc7CisJY2lwaGVyLT5jaXBoZXI9ZW5jPWNpcGhlcl9ieV9uYW1lKHApOworCSpoZWFkZXI9YzsKKwloZWFkZXIrKzsKKworCWlmIChlbmMgPT0gTlVMTCkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9nZXRfRVZQX0NJUEhFUl9JTkZPLCBQRU1fUl9VTlNVUFBPUlRFRF9FTkNSWVBUSU9OKTsKKwkJcmV0dXJuKDApOworCQl9CisJaWYgKCFsb2FkX2l2KGhlYWRlcl9wcCwmKGNpcGhlci0+aXZbMF0pLEVWUF9DSVBIRVJfaXZfbGVuZ3RoKGVuYykpKQorCQlyZXR1cm4oMCk7CisKKwlyZXR1cm4oMSk7CisJfQorCitzdGF0aWMgaW50IGxvYWRfaXYoY2hhciAqKmZyb21wLCB1bnNpZ25lZCBjaGFyICp0bywgaW50IG51bSkKKwl7CisJaW50IHYsaTsKKwljaGFyICpmcm9tOworCisJZnJvbT0gKmZyb21wOworCWZvciAoaT0wOyBpPG51bTsgaSsrKSB0b1tpXT0wOworCW51bSo9MjsKKwlmb3IgKGk9MDsgaTxudW07IGkrKykKKwkJeworCQlpZiAoKCpmcm9tID49ICcwJykgJiYgKCpmcm9tIDw9ICc5JykpCisJCQl2PSAqZnJvbS0nMCc7CisJCWVsc2UgaWYgKCgqZnJvbSA+PSAnQScpICYmICgqZnJvbSA8PSAnRicpKQorCQkJdj0gKmZyb20tJ0EnKzEwOworCQllbHNlIGlmICgoKmZyb20gPj0gJ2EnKSAmJiAoKmZyb20gPD0gJ2YnKSkKKwkJCXY9ICpmcm9tLSdhJysxMDsKKwkJZWxzZQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBsb2FkX2l2LCBQRU1fUl9CQURfSVZfQ0hBUlMpOworCQkJcmV0dXJuKDApOworCQkJfQorCQlmcm9tKys7CisJCXRvW2kvMl18PXY8PChsb25nKSgoIShpJjEpKSo0KTsKKwkJfQorCisJKmZyb21wPWZyb207CisJcmV0dXJuKDEpOworCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQoraW50IFBFTV93cml0ZShGSUxFICpmcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqaGVhZGVyLAorCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIGxvbmcgbGVuKQorICAgICAgICB7CisgICAgICAgIEJJTyAqYjsKKyAgICAgICAgaW50IHJldDsKKworICAgICAgICBpZiAoKGI9QklPX25ldyhCSU9fc19maWxlKCkpKSA9PSBOVUxMKQorCQl7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX3dyaXRlLCBFUlJfUl9CVUZfTElCKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisJCX0KKyAgICAgICAgQklPX3NldF9mcChiLGZwLEJJT19OT0NMT1NFKTsKKyAgICAgICAgcmV0PVBFTV93cml0ZV9iaW8oYiwgbmFtZSwgaGVhZGVyLCBkYXRhLGxlbik7CisgICAgICAgIEJJT19mcmVlKGIpOworICAgICAgICByZXR1cm4ocmV0KTsKKyAgICAgICAgfQorI2VuZGlmCisKK2ludCBQRU1fd3JpdGVfYmlvKEJJTyAqYnAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmhlYWRlciwKKwkJICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCBsb25nIGxlbikKKwl7CisJaW50IG5sZW4sbixpLGosb3V0bDsKKwl1bnNpZ25lZCBjaGFyICpidWYgPSBOVUxMOworCUVWUF9FTkNPREVfQ1RYIGN0eDsKKwlpbnQgcmVhc29uPUVSUl9SX0JVRl9MSUI7CisJCisJRVZQX0VuY29kZUluaXQoJmN0eCk7CisJbmxlbj1zdHJsZW4obmFtZSk7CisKKwlpZiAoCShCSU9fd3JpdGUoYnAsIi0tLS0tQkVHSU4gIiwxMSkgIT0gMTEpIHx8CisJCShCSU9fd3JpdGUoYnAsbmFtZSxubGVuKSAhPSBubGVuKSB8fAorCQkoQklPX3dyaXRlKGJwLCItLS0tLVxuIiw2KSAhPSA2KSkKKwkJZ290byBlcnI7CisJCQorCWk9c3RybGVuKGhlYWRlcik7CisJaWYgKGkgPiAwKQorCQl7CisJCWlmICgJKEJJT193cml0ZShicCxoZWFkZXIsaSkgIT0gaSkgfHwKKwkJCShCSU9fd3JpdGUoYnAsIlxuIiwxKSAhPSAxKSkKKwkJCWdvdG8gZXJyOworCQl9CisKKwlidWYgPSBPUEVOU1NMX21hbGxvYyhQRU1fQlVGU0laRSo4KTsKKwlpZiAoYnVmID09IE5VTEwpCisJCXsKKwkJcmVhc29uPUVSUl9SX01BTExPQ19GQUlMVVJFOworCQlnb3RvIGVycjsKKwkJfQorCisJaT1qPTA7CisJd2hpbGUgKGxlbiA+IDApCisJCXsKKwkJbj0oaW50KSgobGVuPihQRU1fQlVGU0laRSo1KSk/KFBFTV9CVUZTSVpFKjUpOmxlbik7CisJCUVWUF9FbmNvZGVVcGRhdGUoJmN0eCxidWYsJm91dGwsJihkYXRhW2pdKSxuKTsKKwkJaWYgKChvdXRsKSAmJiAoQklPX3dyaXRlKGJwLChjaGFyICopYnVmLG91dGwpICE9IG91dGwpKQorCQkJZ290byBlcnI7CisJCWkrPW91dGw7CisJCWxlbi09bjsKKwkJais9bjsKKwkJfQorCUVWUF9FbmNvZGVGaW5hbCgmY3R4LGJ1Ziwmb3V0bCk7CisJaWYgKChvdXRsID4gMCkgJiYgKEJJT193cml0ZShicCwoY2hhciAqKWJ1ZixvdXRsKSAhPSBvdXRsKSkgZ290byBlcnI7CisJT1BFTlNTTF9jbGVhbnNlKGJ1ZiwgUEVNX0JVRlNJWkUqOCk7CisJT1BFTlNTTF9mcmVlKGJ1Zik7CisJYnVmID0gTlVMTDsKKwlpZiAoCShCSU9fd3JpdGUoYnAsIi0tLS0tRU5EICIsOSkgIT0gOSkgfHwKKwkJKEJJT193cml0ZShicCxuYW1lLG5sZW4pICE9IG5sZW4pIHx8CisJCShCSU9fd3JpdGUoYnAsIi0tLS0tXG4iLDYpICE9IDYpKQorCQlnb3RvIGVycjsKKwlyZXR1cm4oaStvdXRsKTsKK2VycjoKKwlpZiAoYnVmKSB7CisJCU9QRU5TU0xfY2xlYW5zZShidWYsIFBFTV9CVUZTSVpFKjgpOworCQlPUEVOU1NMX2ZyZWUoYnVmKTsKKwl9CisJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fd3JpdGVfYmlvLCByZWFzb24pOworCXJldHVybigwKTsKKwl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKK2ludCBQRU1fcmVhZChGSUxFICpmcCwgY2hhciAqKm5hbWUsIGNoYXIgKipoZWFkZXIsIHVuc2lnbmVkIGNoYXIgKipkYXRhLAorCSAgICAgbG9uZyAqbGVuKQorICAgICAgICB7CisgICAgICAgIEJJTyAqYjsKKyAgICAgICAgaW50IHJldDsKKworICAgICAgICBpZiAoKGI9QklPX25ldyhCSU9fc19maWxlKCkpKSA9PSBOVUxMKQorCQl7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX3JlYWQsIEVSUl9SX0JVRl9MSUIpOworICAgICAgICAgICAgICAgIHJldHVybigwKTsKKwkJfQorICAgICAgICBCSU9fc2V0X2ZwKGIsZnAsQklPX05PQ0xPU0UpOworICAgICAgICByZXQ9UEVNX3JlYWRfYmlvKGIsIG5hbWUsIGhlYWRlciwgZGF0YSxsZW4pOworICAgICAgICBCSU9fZnJlZShiKTsKKyAgICAgICAgcmV0dXJuKHJldCk7CisgICAgICAgIH0KKyNlbmRpZgorCitpbnQgUEVNX3JlYWRfYmlvKEJJTyAqYnAsIGNoYXIgKipuYW1lLCBjaGFyICoqaGVhZGVyLCB1bnNpZ25lZCBjaGFyICoqZGF0YSwKKwkgICAgIGxvbmcgKmxlbikKKwl7CisJRVZQX0VOQ09ERV9DVFggY3R4OworCWludCBlbmQ9MCxpLGssYmw9MCxobD0wLG5vaGVhZD0wOworCWNoYXIgYnVmWzI1Nl07CisJQlVGX01FTSAqbmFtZUI7CisJQlVGX01FTSAqaGVhZGVyQjsKKwlCVUZfTUVNICpkYXRhQiwqdG1wQjsKKwkKKwluYW1lQj1CVUZfTUVNX25ldygpOworCWhlYWRlckI9QlVGX01FTV9uZXcoKTsKKwlkYXRhQj1CVUZfTUVNX25ldygpOworCWlmICgobmFtZUIgPT0gTlVMTCkgfHwgKGhlYWRlckIgPT0gTlVMTCkgfHwgKGRhdGFCID09IE5VTEwpKQorCQl7CisJCUJVRl9NRU1fZnJlZShuYW1lQik7CisJCUJVRl9NRU1fZnJlZShoZWFkZXJCKTsKKwkJQlVGX01FTV9mcmVlKGRhdGFCKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fcmVhZF9iaW8sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuKDApOworCQl9CisKKwlidWZbMjU0XT0nXDAnOworCWZvciAoOzspCisJCXsKKwkJaT1CSU9fZ2V0cyhicCxidWYsMjU0KTsKKworCQlpZiAoaSA8PSAwKQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fcmVhZF9iaW8sIFBFTV9SX05PX1NUQVJUX0xJTkUpOworCQkJZ290byBlcnI7CisJCQl9CisKKwkJd2hpbGUgKChpID49IDApICYmIChidWZbaV0gPD0gJyAnKSkgaS0tOworCQlidWZbKytpXT0nXG4nOyBidWZbKytpXT0nXDAnOworCisJCWlmIChzdHJuY21wKGJ1ZiwiLS0tLS1CRUdJTiAiLDExKSA9PSAwKQorCQkJeworCQkJaT1zdHJsZW4oJihidWZbMTFdKSk7CisKKwkJCWlmIChzdHJuY21wKCYoYnVmWzExK2ktNl0pLCItLS0tLVxuIiw2KSAhPSAwKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCFCVUZfTUVNX2dyb3cobmFtZUIsaSs5KSkKKwkJCQl7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fcmVhZF9iaW8sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQltZW1jcHkobmFtZUItPmRhdGEsJihidWZbMTFdKSxpLTYpOworCQkJbmFtZUItPmRhdGFbaS02XT0nXDAnOworCQkJYnJlYWs7CisJCQl9CisJCX0KKwlobD0wOworCWlmICghQlVGX01FTV9ncm93KGhlYWRlckIsMjU2KSkKKwkJeyBPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9yZWFkX2JpbywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOyBnb3RvIGVycjsgfQorCWhlYWRlckItPmRhdGFbMF09J1wwJzsKKwlmb3IgKDs7KQorCQl7CisJCWk9QklPX2dldHMoYnAsYnVmLDI1NCk7CisJCWlmIChpIDw9IDApIGJyZWFrOworCisJCXdoaWxlICgoaSA+PSAwKSAmJiAoYnVmW2ldIDw9ICcgJykpIGktLTsKKwkJYnVmWysraV09J1xuJzsgYnVmWysraV09J1wwJzsKKworCQlpZiAoYnVmWzBdID09ICdcbicpIGJyZWFrOworCQlpZiAoIUJVRl9NRU1fZ3JvdyhoZWFkZXJCLGhsK2krOSkpCisJCQl7IE9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX3JlYWRfYmlvLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7IGdvdG8gZXJyOyB9CisJCWlmIChzdHJuY21wKGJ1ZiwiLS0tLS1FTkQgIiw5KSA9PSAwKQorCQkJeworCQkJbm9oZWFkPTE7CisJCQlicmVhazsKKwkJCX0KKwkJbWVtY3B5KCYoaGVhZGVyQi0+ZGF0YVtobF0pLGJ1ZixpKTsKKwkJaGVhZGVyQi0+ZGF0YVtobCtpXT0nXDAnOworCQlobCs9aTsKKwkJfQorCisJYmw9MDsKKwlpZiAoIUJVRl9NRU1fZ3JvdyhkYXRhQiwxMDI0KSkKKwkJeyBPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9yZWFkX2JpbywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOyBnb3RvIGVycjsgfQorCWRhdGFCLT5kYXRhWzBdPSdcMCc7CisJaWYgKCFub2hlYWQpCisJCXsKKwkJZm9yICg7OykKKwkJCXsKKwkJCWk9QklPX2dldHMoYnAsYnVmLDI1NCk7CisJCQlpZiAoaSA8PSAwKSBicmVhazsKKworCQkJd2hpbGUgKChpID49IDApICYmIChidWZbaV0gPD0gJyAnKSkgaS0tOworCQkJYnVmWysraV09J1xuJzsgYnVmWysraV09J1wwJzsKKworCQkJaWYgKGkgIT0gNjUpIGVuZD0xOworCQkJaWYgKHN0cm5jbXAoYnVmLCItLS0tLUVORCAiLDkpID09IDApCisJCQkJYnJlYWs7CisJCQlpZiAoaSA+IDY1KSBicmVhazsKKwkJCWlmICghQlVGX01FTV9ncm93X2NsZWFuKGRhdGFCLGkrYmwrOSkpCisJCQkJeworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX3JlYWRfYmlvLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJbWVtY3B5KCYoZGF0YUItPmRhdGFbYmxdKSxidWYsaSk7CisJCQlkYXRhQi0+ZGF0YVtibCtpXT0nXDAnOworCQkJYmwrPWk7CisJCQlpZiAoZW5kKQorCQkJCXsKKwkJCQlidWZbMF09J1wwJzsKKwkJCQlpPUJJT19nZXRzKGJwLGJ1ZiwyNTQpOworCQkJCWlmIChpIDw9IDApIGJyZWFrOworCisJCQkJd2hpbGUgKChpID49IDApICYmIChidWZbaV0gPD0gJyAnKSkgaS0tOworCQkJCWJ1ZlsrK2ldPSdcbic7IGJ1ZlsrK2ldPSdcMCc7CisKKwkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwllbHNlCisJCXsKKwkJdG1wQj1oZWFkZXJCOworCQloZWFkZXJCPWRhdGFCOworCQlkYXRhQj10bXBCOworCQlibD1obDsKKwkJfQorCWk9c3RybGVuKG5hbWVCLT5kYXRhKTsKKwlpZiAoCShzdHJuY21wKGJ1ZiwiLS0tLS1FTkQgIiw5KSAhPSAwKSB8fAorCQkoc3RybmNtcChuYW1lQi0+ZGF0YSwmKGJ1Zls5XSksaSkgIT0gMCkgfHwKKwkJKHN0cm5jbXAoJihidWZbOStpXSksIi0tLS0tXG4iLDYpICE9IDApKQorCQl7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX3JlYWRfYmlvLCBQRU1fUl9CQURfRU5EX0xJTkUpOworCQlnb3RvIGVycjsKKwkJfQorCisJRVZQX0RlY29kZUluaXQoJmN0eCk7CisJaT1FVlBfRGVjb2RlVXBkYXRlKCZjdHgsCisJCSh1bnNpZ25lZCBjaGFyICopZGF0YUItPmRhdGEsJmJsLAorCQkodW5zaWduZWQgY2hhciAqKWRhdGFCLT5kYXRhLGJsKTsKKwlpZiAoaSA8IDApCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fcmVhZF9iaW8sIFBFTV9SX0JBRF9CQVNFNjRfREVDT0RFKTsKKwkJZ290byBlcnI7CisJCX0KKwlpPUVWUF9EZWNvZGVGaW5hbCgmY3R4LCh1bnNpZ25lZCBjaGFyICopJihkYXRhQi0+ZGF0YVtibF0pLCZrKTsKKwlpZiAoaSA8IDApCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fcmVhZF9iaW8sIFBFTV9SX0JBRF9CQVNFNjRfREVDT0RFKTsKKwkJZ290byBlcnI7CisJCX0KKwlibCs9azsKKworCWlmIChibCA9PSAwKSBnb3RvIGVycjsKKwkqbmFtZT1uYW1lQi0+ZGF0YTsKKwkqaGVhZGVyPWhlYWRlckItPmRhdGE7CisJKmRhdGE9KHVuc2lnbmVkIGNoYXIgKilkYXRhQi0+ZGF0YTsKKwkqbGVuPWJsOworCU9QRU5TU0xfZnJlZShuYW1lQik7CisJT1BFTlNTTF9mcmVlKGhlYWRlckIpOworCU9QRU5TU0xfZnJlZShkYXRhQik7CisJcmV0dXJuKDEpOworZXJyOgorCUJVRl9NRU1fZnJlZShuYW1lQik7CisJQlVGX01FTV9mcmVlKGhlYWRlckIpOworCUJVRl9NRU1fZnJlZShkYXRhQik7CisJcmV0dXJuKDApOworCX0KKworLyogQ2hlY2sgcGVtIHN0cmluZyBhbmQgcmV0dXJuIHByZWZpeCBsZW5ndGguCisgKiBJZiBmb3IgZXhhbXBsZSB0aGUgcGVtX3N0ciA9PSAiUlNBIFBSSVZBVEUgS0VZIiBhbmQgc3VmZml4ID0gIlBSSVZBVEUgS0VZIgorICogdGhlIHJldHVybiB2YWx1ZSBpcyAzIGZvciB0aGUgc3RyaW5nICJSU0EiLgorICovCisKK2ludCBwZW1fY2hlY2tfc3VmZml4KGNvbnN0IGNoYXIgKnBlbV9zdHIsIGNvbnN0IGNoYXIgKnN1ZmZpeCkKKwl7CisJaW50IHBlbV9sZW4gPSBzdHJsZW4ocGVtX3N0cik7CisJaW50IHN1ZmZpeF9sZW4gPSBzdHJsZW4oc3VmZml4KTsKKwljb25zdCBjaGFyICpwOworCWlmIChzdWZmaXhfbGVuICsgMSA+PSBwZW1fbGVuKQorCQlyZXR1cm4gMDsKKwlwID0gcGVtX3N0ciArIHBlbV9sZW4gLSBzdWZmaXhfbGVuOworCWlmIChzdHJjbXAocCwgc3VmZml4KSkKKwkJcmV0dXJuIDA7CisJcC0tOworCWlmICgqcCAhPSAnICcpCisJCXJldHVybiAwOworCXJldHVybiBwIC0gcGVtX3N0cjsKKwl9CisKZGlmZiAtLWdpdCBhL2NyeXB0by9wZW0vcGVtX290aC5jIGIvY3J5cHRvL3BlbS9wZW1fb3RoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBkMTJiNgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9wZW0vcGVtX290aC5jCkBAIC0wLDAgKzEsODkgQEAKKy8qIGNyeXB0by9wZW0vcGVtX290aC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9wZW0uaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2J1Zi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKKworLyogSGFuZGxlICdvdGhlcicgUEVNczogbm90IHByaXZhdGUga2V5cyAqLworCit2b2lkICpQRU1fQVNOMV9yZWFkX2JpbyhkMmlfb2Zfdm9pZCAqZDJpLCBjb25zdCBjaGFyICpuYW1lLCBCSU8gKmJwLCB2b2lkICoqeCwKKwkJCXBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpCisJeworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnA9TlVMTDsKKwl1bnNpZ25lZCBjaGFyICpkYXRhPU5VTEw7CisJbG9uZyBsZW47CisJY2hhciAqcmV0PU5VTEw7CisKKwlpZiAoIVBFTV9ieXRlc19yZWFkX2JpbygmZGF0YSwgJmxlbiwgTlVMTCwgbmFtZSwgYnAsIGNiLCB1KSkKKwkJcmV0dXJuIE5VTEw7CisJcCA9IGRhdGE7CisJcmV0PWQyaSh4LCZwLGxlbik7CisJaWYgKHJldCA9PSBOVUxMKQorCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9BU04xX3JlYWRfYmlvLCBFUlJfUl9BU04xX0xJQik7CisJT1BFTlNTTF9mcmVlKGRhdGEpOworCXJldHVybiByZXQ7CisJfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3BlbS9wZW1fcGs4LmMgYi9jcnlwdG8vcGVtL3BlbV9wazguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGNmYjkyCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3BlbS9wZW1fcGs4LmMKQEAgLTAsMCArMSwyNDMgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9idWYuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BrY3M4Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKKworc3RhdGljIGludCBkb19wazhwa2V5KEJJTyAqYnAsIEVWUF9QS0VZICp4LCBpbnQgaXNkZXIsCisJCQkJaW50IG5pZCwgY29uc3QgRVZQX0NJUEhFUiAqZW5jLAorCQkJCWNoYXIgKmtzdHIsIGludCBrbGVuLAorCQkJCXBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpOworc3RhdGljIGludCBkb19wazhwa2V5X2ZwKEZJTEUgKmJwLCBFVlBfUEtFWSAqeCwgaW50IGlzZGVyLAorCQkJCWludCBuaWQsIGNvbnN0IEVWUF9DSVBIRVIgKmVuYywKKwkJCQljaGFyICprc3RyLCBpbnQga2xlbiwKKwkJCQlwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KTsKKworLyogVGhlc2UgZnVuY3Rpb25zIHdyaXRlIGEgcHJpdmF0ZSBrZXkgaW4gUEtDUyM4IGZvcm1hdDogaXQgaXMgYSAiZHJvcCBpbiIKKyAqIHJlcGxhY2VtZW50IGZvciBQRU1fd3JpdGVfYmlvX1ByaXZhdGVLZXkoKSBhbmQgZnJpZW5kcy4gQXMgdXN1YWwgaWYgJ2VuYycKKyAqIGlzIE5VTEwgdGhlbiBpdCB1c2VzIHRoZSB1bmVuY3J5cHRlZCBwcml2YXRlIGtleSBmb3JtLiBUaGUgJ25pZCcgdmVyc2lvbnMKKyAqIHVzZXMgUEtDUyM1IHYxLjUgUEJFIGFsZ29yaXRobXMgd2hlcmVhcyB0aGUgb3RoZXJzIHVzZSBQS0NTIzUgdjIuMC4KKyAqLworCitpbnQgUEVNX3dyaXRlX2Jpb19QS0NTOFByaXZhdGVLZXlfbmlkKEJJTyAqYnAsIEVWUF9QS0VZICp4LCBpbnQgbmlkLAorCQkJCSAgY2hhciAqa3N0ciwgaW50IGtsZW4sCisJCQkJICBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KQoreworCXJldHVybiBkb19wazhwa2V5KGJwLCB4LCAwLCBuaWQsIE5VTEwsIGtzdHIsIGtsZW4sIGNiLCB1KTsKK30KKworaW50IFBFTV93cml0ZV9iaW9fUEtDUzhQcml2YXRlS2V5KEJJTyAqYnAsIEVWUF9QS0VZICp4LCBjb25zdCBFVlBfQ0lQSEVSICplbmMsCisJCQkJICBjaGFyICprc3RyLCBpbnQga2xlbiwKKwkJCQkgIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpCit7CisJcmV0dXJuIGRvX3BrOHBrZXkoYnAsIHgsIDAsIC0xLCBlbmMsIGtzdHIsIGtsZW4sIGNiLCB1KTsKK30KKworaW50IGkyZF9QS0NTOFByaXZhdGVLZXlfYmlvKEJJTyAqYnAsIEVWUF9QS0VZICp4LCBjb25zdCBFVlBfQ0lQSEVSICplbmMsCisJCQkJICBjaGFyICprc3RyLCBpbnQga2xlbiwKKwkJCQkgIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpCit7CisJcmV0dXJuIGRvX3BrOHBrZXkoYnAsIHgsIDEsIC0xLCBlbmMsIGtzdHIsIGtsZW4sIGNiLCB1KTsKK30KKworaW50IGkyZF9QS0NTOFByaXZhdGVLZXlfbmlkX2JpbyhCSU8gKmJwLCBFVlBfUEtFWSAqeCwgaW50IG5pZCwKKwkJCQkgIGNoYXIgKmtzdHIsIGludCBrbGVuLAorCQkJCSAgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSkKK3sKKwlyZXR1cm4gZG9fcGs4cGtleShicCwgeCwgMSwgbmlkLCBOVUxMLCBrc3RyLCBrbGVuLCBjYiwgdSk7Cit9CisKK3N0YXRpYyBpbnQgZG9fcGs4cGtleShCSU8gKmJwLCBFVlBfUEtFWSAqeCwgaW50IGlzZGVyLCBpbnQgbmlkLCBjb25zdCBFVlBfQ0lQSEVSICplbmMsCisJCQkJICBjaGFyICprc3RyLCBpbnQga2xlbiwKKwkJCQkgIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpCit7CisJWDUwOV9TSUcgKnA4OworCVBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4aW5mOworCWNoYXIgYnVmW1BFTV9CVUZTSVpFXTsKKwlpbnQgcmV0OworCWlmKCEocDhpbmYgPSBFVlBfUEtFWTJQS0NTOCh4KSkpIHsKKwkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBkb19wazhwa2V5LCBQRU1fUl9FUlJPUl9DT05WRVJUSU5HX1BSSVZBVEVfS0VZKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmKGVuYyB8fCAobmlkICE9IC0xKSkgeworCQlpZigha3N0cikgeworCQkJa2xlbiA9IDA7CisJCQlpZiAoY2IpCisJCQkJa2xlbiA9IGNiKGJ1ZiwgUEVNX0JVRlNJWkUsIDEsIHUpOworCQkJaWYoa2xlbiA8PSAwKSB7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBkb19wazhwa2V5LCBQRU1fUl9SRUFEX0tFWSk7CisJCQkJUEtDUzhfUFJJVl9LRVlfSU5GT19mcmVlKHA4aW5mKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCQkKKwkJCWtzdHIgPSBidWY7CisJCX0KKwkJcDggPSBQS0NTOF9lbmNyeXB0KG5pZCwgZW5jLCBrc3RyLCBrbGVuLCBOVUxMLCAwLCAwLCBwOGluZik7CisJCWlmKGtzdHIgPT0gYnVmKSBPUEVOU1NMX2NsZWFuc2UoYnVmLCBrbGVuKTsKKwkJUEtDUzhfUFJJVl9LRVlfSU5GT19mcmVlKHA4aW5mKTsKKwkJaWYoaXNkZXIpIHJldCA9IGkyZF9QS0NTOF9iaW8oYnAsIHA4KTsKKwkJZWxzZSByZXQgPSBQRU1fd3JpdGVfYmlvX1BLQ1M4KGJwLCBwOCk7CisJCVg1MDlfU0lHX2ZyZWUocDgpOworCQlyZXR1cm4gcmV0OworCX0gZWxzZSB7CisJCWlmKGlzZGVyKSByZXQgPSBpMmRfUEtDUzhfUFJJVl9LRVlfSU5GT19iaW8oYnAsIHA4aW5mKTsKKwkJZWxzZSByZXQgPSBQRU1fd3JpdGVfYmlvX1BLQ1M4X1BSSVZfS0VZX0lORk8oYnAsIHA4aW5mKTsKKwkJUEtDUzhfUFJJVl9LRVlfSU5GT19mcmVlKHA4aW5mKTsKKwkJcmV0dXJuIHJldDsKKwl9Cit9CisKK0VWUF9QS0VZICpkMmlfUEtDUzhQcml2YXRlS2V5X2JpbyhCSU8gKmJwLCBFVlBfUEtFWSAqKngsIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpCit7CisJUEtDUzhfUFJJVl9LRVlfSU5GTyAqcDhpbmYgPSBOVUxMOworCVg1MDlfU0lHICpwOCA9IE5VTEw7CisJaW50IGtsZW47CisJRVZQX1BLRVkgKnJldDsKKwljaGFyIHBzYnVmW1BFTV9CVUZTSVpFXTsKKwlwOCA9IGQyaV9QS0NTOF9iaW8oYnAsIE5VTEwpOworCWlmKCFwOCkgcmV0dXJuIE5VTEw7CisKKwlrbGVuID0gMDsKKwlpZiAoY2IpCisJCWtsZW49Y2IocHNidWYsUEVNX0JVRlNJWkUsMCx1KTsKKwlpZiAoa2xlbiA8PSAwKSB7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgZDJpX1BLQ1M4UHJpdmF0ZUtleV9iaW8sIFBFTV9SX0JBRF9QQVNTV09SRF9SRUFEKTsKKwkJWDUwOV9TSUdfZnJlZShwOCk7CisJCXJldHVybiBOVUxMOwkKKwl9CisJcDhpbmYgPSBQS0NTOF9kZWNyeXB0KHA4LCBwc2J1Ziwga2xlbik7CisJWDUwOV9TSUdfZnJlZShwOCk7CisJaWYoIXA4aW5mKSByZXR1cm4gTlVMTDsKKwlyZXQgPSBFVlBfUEtDUzgyUEtFWShwOGluZik7CisJUEtDUzhfUFJJVl9LRVlfSU5GT19mcmVlKHA4aW5mKTsKKwlpZighcmV0KSByZXR1cm4gTlVMTDsKKwlpZih4KSB7CisJCWlmKCp4KSBFVlBfUEtFWV9mcmVlKCp4KTsKKwkJKnggPSByZXQ7CisJfQorCXJldHVybiByZXQ7Cit9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKKworaW50IGkyZF9QS0NTOFByaXZhdGVLZXlfZnAoRklMRSAqZnAsIEVWUF9QS0VZICp4LCBjb25zdCBFVlBfQ0lQSEVSICplbmMsCisJCQkJICBjaGFyICprc3RyLCBpbnQga2xlbiwKKwkJCQkgIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpCit7CisJcmV0dXJuIGRvX3BrOHBrZXlfZnAoZnAsIHgsIDEsIC0xLCBlbmMsIGtzdHIsIGtsZW4sIGNiLCB1KTsKK30KKworaW50IGkyZF9QS0NTOFByaXZhdGVLZXlfbmlkX2ZwKEZJTEUgKmZwLCBFVlBfUEtFWSAqeCwgaW50IG5pZCwKKwkJCQkgIGNoYXIgKmtzdHIsIGludCBrbGVuLAorCQkJCSAgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSkKK3sKKwlyZXR1cm4gZG9fcGs4cGtleV9mcChmcCwgeCwgMSwgbmlkLCBOVUxMLCBrc3RyLCBrbGVuLCBjYiwgdSk7Cit9CisKK2ludCBQRU1fd3JpdGVfUEtDUzhQcml2YXRlS2V5X25pZChGSUxFICpmcCwgRVZQX1BLRVkgKngsIGludCBuaWQsCisJCQkJICBjaGFyICprc3RyLCBpbnQga2xlbiwKKwkJCQkgIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpCit7CisJcmV0dXJuIGRvX3BrOHBrZXlfZnAoZnAsIHgsIDAsIG5pZCwgTlVMTCwga3N0ciwga2xlbiwgY2IsIHUpOworfQorCitpbnQgUEVNX3dyaXRlX1BLQ1M4UHJpdmF0ZUtleShGSUxFICpmcCwgRVZQX1BLRVkgKngsIGNvbnN0IEVWUF9DSVBIRVIgKmVuYywKKwkJCSAgICAgIGNoYXIgKmtzdHIsIGludCBrbGVuLCBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KQoreworCXJldHVybiBkb19wazhwa2V5X2ZwKGZwLCB4LCAwLCAtMSwgZW5jLCBrc3RyLCBrbGVuLCBjYiwgdSk7Cit9CisKK3N0YXRpYyBpbnQgZG9fcGs4cGtleV9mcChGSUxFICpmcCwgRVZQX1BLRVkgKngsIGludCBpc2RlciwgaW50IG5pZCwgY29uc3QgRVZQX0NJUEhFUiAqZW5jLAorCQkJCSAgY2hhciAqa3N0ciwgaW50IGtsZW4sCisJCQkJICBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KQoreworCUJJTyAqYnA7CisJaW50IHJldDsKKwlpZighKGJwID0gQklPX25ld19mcChmcCwgQklPX05PQ0xPU0UpKSkgeworCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIGRvX3BrOHBrZXlfZnAsIEVSUl9SX0JVRl9MSUIpOworICAgICAgICAgICAgICAgIHJldHVybigwKTsKKwl9CisJcmV0ID0gZG9fcGs4cGtleShicCwgeCwgaXNkZXIsIG5pZCwgZW5jLCBrc3RyLCBrbGVuLCBjYiwgdSk7CisJQklPX2ZyZWUoYnApOworCXJldHVybiByZXQ7Cit9CisKK0VWUF9QS0VZICpkMmlfUEtDUzhQcml2YXRlS2V5X2ZwKEZJTEUgKmZwLCBFVlBfUEtFWSAqKngsIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpCit7CisJQklPICpicDsKKwlFVlBfUEtFWSAqcmV0OworCWlmKCEoYnAgPSBCSU9fbmV3X2ZwKGZwLCBCSU9fTk9DTE9TRSkpKSB7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgZDJpX1BLQ1M4UHJpdmF0ZUtleV9mcCwgRVJSX1JfQlVGX0xJQik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisJfQorCXJldCA9IGQyaV9QS0NTOFByaXZhdGVLZXlfYmlvKGJwLCB4LCBjYiwgdSk7CisJQklPX2ZyZWUoYnApOworCXJldHVybiByZXQ7Cit9CisKKyNlbmRpZgorCitJTVBMRU1FTlRfUEVNX3J3KFBLQ1M4LCBYNTA5X1NJRywgUEVNX1NUUklOR19QS0NTOCwgWDUwOV9TSUcpCitJTVBMRU1FTlRfUEVNX3J3KFBLQ1M4X1BSSVZfS0VZX0lORk8sIFBLQ1M4X1BSSVZfS0VZX0lORk8sIFBFTV9TVFJJTkdfUEtDUzhJTkYsCisJCQkJCQkJIFBLQ1M4X1BSSVZfS0VZX0lORk8pCmRpZmYgLS1naXQgYS9jcnlwdG8vcGVtL3BlbV9wa2V5LmMgYi9jcnlwdG8vcGVtL3BlbV9wa2V5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkwMGY0YgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9wZW0vcGVtX3BrZXkuYwpAQCAtMCwwICsxLDMxMyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvcGVtLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9idWYuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2RoLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BrY3M4Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKKyNpbmNsdWRlICIuLi9ldnAvaW50ZXJuYWwuaCIKKworCitpbnQgcGVtX2NoZWNrX3N1ZmZpeChjb25zdCBjaGFyICpwZW1fc3RyLCBjb25zdCBjaGFyICpzdWZmaXgpOworCitFVlBfUEtFWSAqUEVNX3JlYWRfYmlvX1ByaXZhdGVLZXkoQklPICpicCwgRVZQX1BLRVkgKip4LCBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KQorCXsKKwljaGFyICpubT1OVUxMOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnA9TlVMTDsKKwl1bnNpZ25lZCBjaGFyICpkYXRhPU5VTEw7CisJbG9uZyBsZW47CisJaW50IHNsZW47CisJRVZQX1BLRVkgKnJldD1OVUxMOworCisJaWYgKCFQRU1fYnl0ZXNfcmVhZF9iaW8oJmRhdGEsICZsZW4sICZubSwgUEVNX1NUUklOR19FVlBfUEtFWSwgYnAsIGNiLCB1KSkKKwkJcmV0dXJuIE5VTEw7CisJcCA9IGRhdGE7CisKKwlpZiAoc3RyY21wKG5tLFBFTV9TVFJJTkdfUEtDUzhJTkYpID09IDApIHsKKwkJUEtDUzhfUFJJVl9LRVlfSU5GTyAqcDhpbmY7CisJCXA4aW5mPWQyaV9QS0NTOF9QUklWX0tFWV9JTkZPKE5VTEwsICZwLCBsZW4pOworCQlpZighcDhpbmYpIGdvdG8gcDhlcnI7CisJCXJldCA9IEVWUF9QS0NTODJQS0VZKHA4aW5mKTsKKwkJaWYoeCkgeworCQkJaWYoKngpIEVWUF9QS0VZX2ZyZWUoKEVWUF9QS0VZICopKngpOworCQkJKnggPSByZXQ7CisJCX0KKwkJUEtDUzhfUFJJVl9LRVlfSU5GT19mcmVlKHA4aW5mKTsKKwl9IGVsc2UgaWYgKHN0cmNtcChubSxQRU1fU1RSSU5HX1BLQ1M4KSA9PSAwKSB7CisJCVBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4aW5mOworCQlYNTA5X1NJRyAqcDg7CisJCWludCBrbGVuOworCQljaGFyIHBzYnVmW1BFTV9CVUZTSVpFXTsKKwkJcDggPSBkMmlfWDUwOV9TSUcoTlVMTCwgJnAsIGxlbik7CisJCWlmKCFwOCkgZ290byBwOGVycjsKKworCQlrbGVuID0gMDsKKwkJaWYgKGNiKSBrbGVuPWNiKHBzYnVmLFBFTV9CVUZTSVpFLDAsdSk7CisJCWlmIChrbGVuIDw9IDApIHsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX3JlYWRfYmlvX1ByaXZhdGVLZXksIFBFTV9SX0JBRF9QQVNTV09SRF9SRUFEKTsKKwkJCVg1MDlfU0lHX2ZyZWUocDgpOworCQkJZ290byBlcnI7CisJCX0KKwkJcDhpbmYgPSBQS0NTOF9kZWNyeXB0KHA4LCBwc2J1Ziwga2xlbik7CisJCVg1MDlfU0lHX2ZyZWUocDgpOworCQlpZighcDhpbmYpIGdvdG8gcDhlcnI7CisJCXJldCA9IEVWUF9QS0NTODJQS0VZKHA4aW5mKTsKKwkJaWYoeCkgeworCQkJaWYoKngpIEVWUF9QS0VZX2ZyZWUoKEVWUF9QS0VZICopKngpOworCQkJKnggPSByZXQ7CisJCX0KKwkJUEtDUzhfUFJJVl9LRVlfSU5GT19mcmVlKHA4aW5mKTsKKwl9IGVsc2UgaWYgKChzbGVuID0gcGVtX2NoZWNrX3N1ZmZpeChubSwgIlBSSVZBVEUgS0VZIikpID4gMCkKKwkJeworCQljb25zdCBFVlBfUEtFWV9BU04xX01FVEhPRCAqYW1ldGg7CisJCWFtZXRoID0gRVZQX1BLRVlfYXNuMV9maW5kX3N0cihOVUxMLCBubSwgc2xlbik7CisJCWlmICghYW1ldGggfHwgIWFtZXRoLT5vbGRfcHJpdl9kZWNvZGUpCisJCQlnb3RvIHA4ZXJyOworCQlyZXQ9ZDJpX1ByaXZhdGVLZXkoYW1ldGgtPnBrZXlfaWQseCwmcCxsZW4pOworCQl9CitwOGVycjoKKwlpZiAocmV0ID09IE5VTEwpCisJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX3JlYWRfYmlvX1ByaXZhdGVLZXksIEVSUl9SX0FTTjFfTElCKTsKKworZXJyOgorCU9QRU5TU0xfZnJlZShubSk7CisJT1BFTlNTTF9jbGVhbnNlKGRhdGEsIGxlbik7CisJT1BFTlNTTF9mcmVlKGRhdGEpOworCXJldHVybihyZXQpOworCX0KKworaW50IFBFTV93cml0ZV9iaW9fUHJpdmF0ZUtleShCSU8gKmJwLCBFVlBfUEtFWSAqeCwgY29uc3QgRVZQX0NJUEhFUiAqZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICprc3RyLCBpbnQga2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSkKKwl7CisJY2hhciBwZW1fc3RyWzgwXTsKKwlpZiAoIXgtPmFtZXRoIHx8IHgtPmFtZXRoLT5wcml2X2VuY29kZSkKKwkJcmV0dXJuIFBFTV93cml0ZV9iaW9fUEtDUzhQcml2YXRlS2V5KGJwLCB4LCBlbmMsCisJCQkJCQkJKGNoYXIgKilrc3RyLCBrbGVuLAorCQkJCQkJCWNiLCB1KTsKKworCUJJT19zbnByaW50ZihwZW1fc3RyLCA4MCwgIiVzIFBSSVZBVEUgS0VZIiwgeC0+YW1ldGgtPnBlbV9zdHIpOworCXJldHVybiBQRU1fQVNOMV93cml0ZV9iaW8oKGkyZF9vZl92b2lkICopaTJkX1ByaXZhdGVLZXksCisJCQkJcGVtX3N0cixicCx4LGVuYyxrc3RyLGtsZW4sY2IsdSk7CisJfQorCitzdGF0aWMgY29uc3QgaW50IHB1YmxpY19rZXlfdHlwZV9mcm9tX3N0cihjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbGVuKSB7CisgIGlmIChsZW4gPT0gMyAmJiBtZW1jbXAobmFtZSwgIlJTQSIsIDMpID09IDApIHsKKyAgICByZXR1cm4gRVZQX1BLRVlfUlNBOworICB9IGVsc2UgaWYgKGxlbiA9PSAyICYmIG1lbWNtcChuYW1lLCAiREgiLCAyKSA9PSAwKSB7CisgICAgcmV0dXJuIEVWUF9QS0VZX0RIOworICB9IGVsc2UgaWYgKGxlbiA9PSAyICYmIG1lbWNtcChuYW1lLCAiRUMiLCAyKSA9PSAwKSB7CisgICAgcmV0dXJuIEVWUF9QS0VZX0VDOworICB9CisgIHJldHVybiBOSURfdW5kZWY7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3BrZXlfdHlwZV9mcm9tX3N0cihFVlBfUEtFWSAqcGtleSwgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGxlbikgeworICBpbnQgbmlkID0gcHVibGljX2tleV90eXBlX2Zyb21fc3RyKG5hbWUsIGxlbik7CisgIGlmIChuaWQgPT0gTklEX3VuZGVmKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIEVWUF9QS0VZX3NldF90eXBlKHBrZXksIG5pZCk7Cit9CisKK0VWUF9QS0VZICpQRU1fcmVhZF9iaW9fUGFyYW1ldGVycyhCSU8gKmJwLCBFVlBfUEtFWSAqKngpCisJeworCWNoYXIgKm5tPU5VTEw7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcD1OVUxMOworCXVuc2lnbmVkIGNoYXIgKmRhdGE9TlVMTDsKKwlsb25nIGxlbjsKKwlpbnQgc2xlbjsKKwlFVlBfUEtFWSAqcmV0PU5VTEw7CisKKwlpZiAoIVBFTV9ieXRlc19yZWFkX2JpbygmZGF0YSwgJmxlbiwgJm5tLCBQRU1fU1RSSU5HX1BBUkFNRVRFUlMsCisJCQkJCQkJCWJwLCAwLCBOVUxMKSkKKwkJcmV0dXJuIE5VTEw7CisJcCA9IGRhdGE7CisKKwlpZiAoKHNsZW4gPSBwZW1fY2hlY2tfc3VmZml4KG5tLCAiUEFSQU1FVEVSUyIpKSA+IDApCisJCXsKKwkJcmV0ID0gRVZQX1BLRVlfbmV3KCk7CisJCWlmICghcmV0KQorCQkJZ290byBlcnI7CisJCWlmICghc2V0X3BrZXlfdHlwZV9mcm9tX3N0cihyZXQsIG5tLCBzbGVuKQorCQkJfHwgIXJldC0+YW1ldGgtPnBhcmFtX2RlY29kZQorCQkJfHwgIXJldC0+YW1ldGgtPnBhcmFtX2RlY29kZShyZXQsICZwLCBsZW4pKQorCQkJeworCQkJRVZQX1BLRVlfZnJlZShyZXQpOworCQkJcmV0ID0gTlVMTDsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlpZih4KQorCQkJeworCQkJaWYoKngpIEVWUF9QS0VZX2ZyZWUoKEVWUF9QS0VZICopKngpOworCQkJKnggPSByZXQ7CisJCQl9CisJCX0KK2VycjoKKwlpZiAocmV0ID09IE5VTEwpCisJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX3JlYWRfYmlvX1BhcmFtZXRlcnMsIEVSUl9SX0FTTjFfTElCKTsKKwlPUEVOU1NMX2ZyZWUobm0pOworCU9QRU5TU0xfZnJlZShkYXRhKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK2ludCBQRU1fd3JpdGVfYmlvX1BhcmFtZXRlcnMoQklPICpicCwgRVZQX1BLRVkgKngpCisJeworCWNoYXIgcGVtX3N0cls4MF07CisJaWYgKCF4LT5hbWV0aCB8fCAheC0+YW1ldGgtPnBhcmFtX2VuY29kZSkKKwkJcmV0dXJuIDA7CisKKwlCSU9fc25wcmludGYocGVtX3N0ciwgODAsICIlcyBQQVJBTUVURVJTIiwgeC0+YW1ldGgtPnBlbV9zdHIpOworCXJldHVybiBQRU1fQVNOMV93cml0ZV9iaW8oCisJCShpMmRfb2Zfdm9pZCAqKXgtPmFtZXRoLT5wYXJhbV9lbmNvZGUsCisJCQkJcGVtX3N0cixicCx4LE5VTEwsTlVMTCwwLDAsTlVMTCk7CisJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitFVlBfUEtFWSAqUEVNX3JlYWRfUHJpdmF0ZUtleShGSUxFICpmcCwgRVZQX1BLRVkgKip4LCBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KQorCXsKKyAgICAgICAgQklPICpiOworICAgICAgICBFVlBfUEtFWSAqcmV0OworCisgICAgICAgIGlmICgoYj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpID09IE5VTEwpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fcmVhZF9Qcml2YXRlS2V5LCBFUlJfUl9CVUZfTElCKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisJCX0KKyAgICAgICAgQklPX3NldF9mcChiLGZwLEJJT19OT0NMT1NFKTsKKyAgICAgICAgcmV0PVBFTV9yZWFkX2Jpb19Qcml2YXRlS2V5KGIseCxjYix1KTsKKyAgICAgICAgQklPX2ZyZWUoYik7CisgICAgICAgIHJldHVybihyZXQpOworCX0KKworaW50IFBFTV93cml0ZV9Qcml2YXRlS2V5KEZJTEUgKmZwLCBFVlBfUEtFWSAqeCwgY29uc3QgRVZQX0NJUEhFUiAqZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICprc3RyLCBpbnQga2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSkKKwl7CisgICAgICAgIEJJTyAqYjsKKyAgICAgICAgaW50IHJldDsKKworICAgICAgICBpZiAoKGI9QklPX25ld19mcChmcCwgQklPX05PQ0xPU0UpKSA9PSBOVUxMKQorCQl7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX3dyaXRlX1ByaXZhdGVLZXksIEVSUl9SX0JVRl9MSUIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworCQl9CisgICAgICAgIHJldD1QRU1fd3JpdGVfYmlvX1ByaXZhdGVLZXkoYiwgeCwgZW5jLCBrc3RyLCBrbGVuLCBjYiwgdSk7CisgICAgICAgIEJJT19mcmVlKGIpOworICAgICAgICByZXR1cm4gcmV0OworCX0KKworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19ESAorCisvKiBUcmFuc3BhcmVudGx5IHJlYWQgaW4gUEtDUyMzIG9yIFg5LjQyIERIIHBhcmFtZXRlcnMgKi8KKworREggKlBFTV9yZWFkX2Jpb19ESHBhcmFtcyhCSU8gKmJwLCBESCAqKngsIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpCisJeworCWNoYXIgKm5tPU5VTEw7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcD1OVUxMOworCXVuc2lnbmVkIGNoYXIgKmRhdGE9TlVMTDsKKwlsb25nIGxlbjsKKwlESCAqcmV0PU5VTEw7CisKKwlpZiAoIVBFTV9ieXRlc19yZWFkX2JpbygmZGF0YSwgJmxlbiwgJm5tLCBQRU1fU1RSSU5HX0RIUEFSQU1TLAorCQkJCQkJCQlicCwgY2IsIHUpKQorCQlyZXR1cm4gTlVMTDsKKwlwID0gZGF0YTsKKworICAgICAgICAvKiBUT0RPKGZvcmspOiByZW1vdmU/ICovCisJLyppZiAoIXN0cmNtcChubSwgUEVNX1NUUklOR19ESFhQQVJBTVMpKQorCQlyZXQgPSBkMmlfREh4cGFyYW1zKHgsICZwLCBsZW4pOworCWVsc2UgKi8KKwkJcmV0ID0gZDJpX0RIcGFyYW1zKHgsICZwLCBsZW4pOworCisJaWYgKHJldCA9PSBOVUxMKQorCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9yZWFkX2Jpb19ESHBhcmFtcywgRVJSX1JfQVNOMV9MSUIpOworCU9QRU5TU0xfZnJlZShubSk7CisJT1BFTlNTTF9mcmVlKGRhdGEpOworCXJldHVybiByZXQ7CisJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitESCAqUEVNX3JlYWRfREhwYXJhbXMoRklMRSAqZnAsIERIICoqeCwgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSkKKwl7CisgICAgICAgIEJJTyAqYjsKKyAgICAgICAgREggKnJldDsKKworICAgICAgICBpZiAoKGI9QklPX25ldyhCSU9fc19maWxlKCkpKSA9PSBOVUxMKQorCQl7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX3JlYWRfREhwYXJhbXMsIEVSUl9SX0JVRl9MSUIpOworICAgICAgICAgICAgICAgIHJldHVybigwKTsKKwkJfQorICAgICAgICBCSU9fc2V0X2ZwKGIsZnAsQklPX05PQ0xPU0UpOworICAgICAgICByZXQ9UEVNX3JlYWRfYmlvX0RIcGFyYW1zKGIseCxjYix1KTsKKyAgICAgICAgQklPX2ZyZWUoYik7CisgICAgICAgIHJldHVybihyZXQpOworCX0KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NyeXB0by9wZW0vcGVtX3g1MDkuYyBiL2NyeXB0by9wZW0vcGVtX3g1MDkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDYzMDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3BlbS9wZW1feDUwOS5jCkBAIC0wLDAgKzEsNjUgQEAKKy8qIHBlbV94NTA5LmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDAxLgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4gKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKworCitJTVBMRU1FTlRfUEVNX3J3KFg1MDksIFg1MDksIFBFTV9TVFJJTkdfWDUwOSwgWDUwOSkKZGlmZiAtLWdpdCBhL2NyeXB0by9wZW0vcGVtX3hhdXguYyBiL2NyeXB0by9wZW0vcGVtX3hhdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGFiZDQxCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3BlbS9wZW1feGF1eC5jCkBAIC0wLDAgKzEsNjYgQEAKKy8qIHBlbV94YXV4LmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDAxLgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4gKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKworCitJTVBMRU1FTlRfUEVNX3J3KFg1MDlfQVVYLCBYNTA5LCBQRU1fU1RSSU5HX1g1MDlfVFJVU1RFRCwgWDUwOV9BVVgpCitJTVBMRU1FTlRfUEVNX3J3KFg1MDlfQ0VSVF9QQUlSLCBYNTA5X0NFUlRfUEFJUiwgUEVNX1NUUklOR19YNTA5X1BBSVIsIFg1MDlfQ0VSVF9QQUlSKQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3Blcmxhc20vY2JjLnBsIGIvY3J5cHRvL3Blcmxhc20vY2JjLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NTYxZTcKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vcGVybGFzbS9jYmMucGwKQEAgLTAsMCArMSwzNDkgQEAKKyMhL3Vzci9sb2NhbC9iaW4vcGVybAorCisjIHZvaWQgZGVzX25jYmNfZW5jcnlwdChpbnB1dCwgb3V0cHV0LCBsZW5ndGgsIHNjaGVkdWxlLCBpdmVjLCBlbmMpCisjIGRlc19jYmxvY2sgKCppbnB1dCk7CisjIGRlc19jYmxvY2sgKCpvdXRwdXQpOworIyBsb25nIGxlbmd0aDsKKyMgZGVzX2tleV9zY2hlZHVsZSBzY2hlZHVsZTsKKyMgZGVzX2NibG9jayAoKml2ZWMpOworIyBpbnQgZW5jOworIworIyBjYWxscyAKKyMgZGVzX2VuY3J5cHQoKERFU19MT05HICopdGluLHNjaGVkdWxlLERFU19FTkNSWVBUKTsKKyMKKworIyZjYmMoImRlc19uY2JjX2VuY3J5cHQiLCJkZXNfZW5jcnlwdCIsMCk7CisjJmNiYygiQkZfY2JjX2VuY3J5cHQiLCJCRl9lbmNyeXB0IiwiQkZfZW5jcnlwdCIsCisjCTEsNCw1LDMsNSwtMSk7CisjJmNiYygiZGVzX25jYmNfZW5jcnlwdCIsImRlc19lbmNyeXB0IiwiZGVzX2VuY3J5cHQiLAorIwkwLDQsNSwzLDUsLTEpOworIyZjYmMoImRlc19lZGUzX2NiY19lbmNyeXB0IiwiZGVzX2VuY3J5cHQzIiwiZGVzX2RlY3J5cHQzIiwKKyMJMCw2LDcsMyw0LDUpOworIworIyBXaGVuIGRvaW5nIGEgY2lwaGVyIHRoYXQgbmVlZHMgYmlnZW5kaWFuIG9yZGVyLAorIyBmb3IgZW5jcnlwdCwgdGhlIGl2IGlzIGtlcHQgaW4gYmlnZW5kaWFuIGZvcm0sCisjIHdoaWxlIGZvciBkZWNyeXB0LCBpdCBpcyBrZXB0IGluIGxpdHRsZSBlbmRpYW4uCitzdWIgY2JjCisJeworCWxvY2FsKCRuYW1lLCRlbmNfZnVuYywkZGVjX2Z1bmMsJHN3YXAsJGl2X29mZiwkZW5jX29mZiwkcDEsJHAyLCRwMyk9QF87CisJIyBuYW1lIGlzIHRoZSBmdW5jdGlvbiBuYW1lCisJIyBlbmNfZnVuYyBhbmQgZGVjX2Z1bmMgYW5kIHRoZSBmdW5jdGlvbnMgdG8gY2FsbCBmb3IgZW5jcnlwdC9kZWNyeXB0CisJIyBzd2FwIGlzIHRydWUgaWYgYnl0ZSBvcmRlciBuZWVkcyB0byBiZSByZXZlcnNlZAorCSMgaXZfb2ZmIGlzIHBhcmFtZXRlciBudW1iZXIgZm9yIHRoZSBpdiAKKwkjIGVuY19vZmYgaXMgcGFyYW1ldGVyIG51bWJlciBmb3IgdGhlIGVuY3J5cHQvZGVjcnlwdCBmbGFnCisJIyBwMSxwMixwMyBhcmUgdGhlIG9mZnNldHMgZm9yIHBhcmFtZXRlcnMgdG8gYmUgcGFzc2VkIHRvIHRoZQorCSMgdW5kZXJseWluZyBjYWxscy4KKworCSZmdW5jdGlvbl9iZWdpbl9CKCRuYW1lLCIiKTsKKwkmY29tbWVudCgiIik7CisKKwkkaW49ImVzaSI7CisJJG91dD0iZWRpIjsKKwkkY291bnQ9ImVicCI7CisKKwkmcHVzaCgiZWJwIik7CisJJnB1c2goImVieCIpOworCSZwdXNoKCJlc2kiKTsKKwkmcHVzaCgiZWRpIik7CisKKwkkZGF0YV9vZmY9NDsKKwkkZGF0YV9vZmYrPTQgaWYgKCRwMSA+IDApOworCSRkYXRhX29mZis9NCBpZiAoJHAyID4gMCk7CisJJGRhdGFfb2ZmKz00IGlmICgkcDMgPiAwKTsKKworCSZtb3YoJGNvdW50LAkmd3BhcmFtKDIpKTsJIyBsZW5ndGgKKworCSZjb21tZW50KCJnZXR0aW5nIGl2IHB0ciBmcm9tIHBhcmFtZXRlciAkaXZfb2ZmIik7CisJJm1vdigiZWJ4IiwJJndwYXJhbSgkaXZfb2ZmKSk7CSMgR2V0IGl2IHB0cgorCisJJm1vdigkaW4sCSZEV1AoMCwiZWJ4IiwiIiwwKSk7IwlpdlswXQorCSZtb3YoJG91dCwJJkRXUCg0LCJlYngiLCIiLDApKTsjCWl2WzFdCisKKwkmcHVzaCgkb3V0KTsKKwkmcHVzaCgkaW4pOworCSZwdXNoKCRvdXQpOwkjIHVzZWQgaW4gZGVjcnlwdCBmb3IgaXZbMV0KKwkmcHVzaCgkaW4pOwkjIHVzZWQgaW4gZGVjcnlwdCBmb3IgaXZbMF0KKworCSZtb3YoImVieCIsCSJlc3AiKTsJCSMgVGhpcyBpcyB0aGUgYWRkcmVzcyBvZiB0aW5bMl0KKworCSZtb3YoJGluLAkmd3BhcmFtKDApKTsJIyBpbgorCSZtb3YoJG91dCwJJndwYXJhbSgxKSk7CSMgb3V0CisKKwkjIFdlIGhhdmUgbG9hZGVkIHRoZW0gYWxsLCBob3cgbGV0cyBwdXNoIHRoaW5ncworCSZjb21tZW50KCJnZXR0aW5nIGVuY3J5cHQgZmxhZyBmcm9tIHBhcmFtZXRlciAkZW5jX29mZiIpOworCSZtb3YoImVjeCIsCSZ3cGFyYW0oJGVuY19vZmYpKTsJIyBHZXQgZW5jIGZsYWcKKwlpZiAoJHAzID4gMCkKKwkJeworCQkmY29tbWVudCgiZ2V0IGFuZCBwdXNoIHBhcmFtZXRlciAkcDMiKTsKKwkJaWYgKCRlbmNfb2ZmICE9ICRwMykKKwkJCXsgJm1vdigiZWF4IiwJJndwYXJhbSgkcDMpKTsgJnB1c2goImVheCIpOyB9CisJCWVsc2UJeyAmcHVzaCgiZWN4Iik7IH0KKwkJfQorCWlmICgkcDIgPiAwKQorCQl7CisJCSZjb21tZW50KCJnZXQgYW5kIHB1c2ggcGFyYW1ldGVyICRwMiIpOworCQlpZiAoJGVuY19vZmYgIT0gJHAyKQorCQkJeyAmbW92KCJlYXgiLAkmd3BhcmFtKCRwMikpOyAmcHVzaCgiZWF4Iik7IH0KKwkJZWxzZQl7ICZwdXNoKCJlY3giKTsgfQorCQl9CisJaWYgKCRwMSA+IDApCisJCXsKKwkJJmNvbW1lbnQoImdldCBhbmQgcHVzaCBwYXJhbWV0ZXIgJHAxIik7CisJCWlmICgkZW5jX29mZiAhPSAkcDEpCisJCQl7ICZtb3YoImVheCIsCSZ3cGFyYW0oJHAxKSk7ICZwdXNoKCJlYXgiKTsgfQorCQllbHNlCXsgJnB1c2goImVjeCIpOyB9CisJCX0KKwkmcHVzaCgiZWJ4Iik7CQkjIHB1c2ggZGF0YS9pdgorCisJJmNtcCgiZWN4IiwwKTsKKwkmanooJmxhYmVsKCJkZWNyeXB0IikpOworCisJJmFuZCgkY291bnQsMHhmZmZmZmZmOCk7CisJJm1vdigiZWF4IiwJJkRXUCgkZGF0YV9vZmYsImVzcCIsIiIsMCkpOwkjIGxvYWQgaXZbMF0KKwkmbW92KCJlYngiLAkmRFdQKCRkYXRhX29mZis0LCJlc3AiLCIiLDApKTsJIyBsb2FkIGl2WzFdCisKKwkmanooJmxhYmVsKCJlbmNyeXB0X2ZpbmlzaCIpKTsKKworCSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworCSZzZXRfbGFiZWwoImVuY3J5cHRfbG9vcCIpOworCSMgZW5jcnlwdCBzdGFydCAKKwkjICJlYXgiIGFuZCAiZWJ4IiBob2xkIGl2IChvciB0aGUgbGFzdCBjaXBoZXIgdGV4dCkKKworCSZtb3YoImVjeCIsCSZEV1AoMCwkaW4sIiIsMCkpOwkjIGxvYWQgZmlyc3QgNCBieXRlcworCSZtb3YoImVkeCIsCSZEV1AoNCwkaW4sIiIsMCkpOwkjIHNlY29uZCA0IGJ5dGVzCisKKwkmeG9yKCJlYXgiLAkiZWN4Iik7CisJJnhvcigiZWJ4IiwJImVkeCIpOworCisJJmJzd2FwKCJlYXgiKQlpZiAkc3dhcDsKKwkmYnN3YXAoImVieCIpCWlmICRzd2FwOworCisJJm1vdigmRFdQKCRkYXRhX29mZiwiZXNwIiwiIiwwKSwJImVheCIpOwkjIHB1dCBpbiBhcnJheSBmb3IgY2FsbAorCSZtb3YoJkRXUCgkZGF0YV9vZmYrNCwiZXNwIiwiIiwwKSwJImVieCIpOwkjCisKKwkmY2FsbCgkZW5jX2Z1bmMpOworCisJJm1vdigiZWF4IiwJJkRXUCgkZGF0YV9vZmYsImVzcCIsIiIsMCkpOworCSZtb3YoImVieCIsCSZEV1AoJGRhdGFfb2ZmKzQsImVzcCIsIiIsMCkpOworCisJJmJzd2FwKCJlYXgiKQlpZiAkc3dhcDsKKwkmYnN3YXAoImVieCIpCWlmICRzd2FwOworCisJJm1vdigmRFdQKDAsJG91dCwiIiwwKSwiZWF4Iik7CisJJm1vdigmRFdQKDQsJG91dCwiIiwwKSwiZWJ4Iik7CisKKwkjIGVheCBhbmQgZWJ4IGFyZSB0aGUgbmV4dCBpdi4KKworCSZhZGQoJGluLAk4KTsKKwkmYWRkKCRvdXQsCTgpOworCisJJnN1YigkY291bnQsCTgpOworCSZqbnooJmxhYmVsKCJlbmNyeXB0X2xvb3AiKSk7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMzCisJJnNldF9sYWJlbCgiZW5jcnlwdF9maW5pc2giKTsKKwkmbW92KCRjb3VudCwJJndwYXJhbSgyKSk7CSMgbGVuZ3RoCisJJmFuZCgkY291bnQsCTcpOworCSZqeigmbGFiZWwoImZpbmlzaCIpKTsKKwkmY2FsbCgmbGFiZWwoIlBJQ19wb2ludCIpKTsKKyZzZXRfbGFiZWwoIlBJQ19wb2ludCIpOworCSZibGluZHBvcCgiZWR4Iik7CisJJmxlYSgiZWN4IiwmRFdQKCZsYWJlbCgiY2JjX2VuY19qbXBfdGFibGUiKS4iLSIuJmxhYmVsKCJQSUNfcG9pbnQiKSwiZWR4IikpOworCSZtb3YoJGNvdW50LCZEV1AoMCwiZWN4IiwkY291bnQsNCkpOworCSZhZGQoJGNvdW50LCJlZHgiKTsKKwkmeG9yKCJlY3giLCJlY3giKTsKKwkmeG9yKCJlZHgiLCJlZHgiKTsKKwkjJm1vdigkY291bnQsJkRXUCgmbGFiZWwoImNiY19lbmNfam1wX3RhYmxlIiksIiIsJGNvdW50LDQpKTsKKwkmam1wX3B0cigkY291bnQpOworCismc2V0X2xhYmVsKCJlajciKTsKKwkmbW92YigmSEIoImVkeCIpLAkmQlAoNiwkaW4sIiIsMCkpOworCSZzaGwoImVkeCIsOCk7Cismc2V0X2xhYmVsKCJlajYiKTsKKwkmbW92YigmSEIoImVkeCIpLAkmQlAoNSwkaW4sIiIsMCkpOworJnNldF9sYWJlbCgiZWo1Iik7CisJJm1vdmIoJkxCKCJlZHgiKSwJJkJQKDQsJGluLCIiLDApKTsKKyZzZXRfbGFiZWwoImVqNCIpOworCSZtb3YoImVjeCIsCQkmRFdQKDAsJGluLCIiLDApKTsKKwkmam1wKCZsYWJlbCgiZWplbmQiKSk7Cismc2V0X2xhYmVsKCJlajMiKTsKKwkmbW92YigmSEIoImVjeCIpLAkmQlAoMiwkaW4sIiIsMCkpOworCSZzaGwoImVjeCIsOCk7Cismc2V0X2xhYmVsKCJlajIiKTsKKwkmbW92YigmSEIoImVjeCIpLAkmQlAoMSwkaW4sIiIsMCkpOworJnNldF9sYWJlbCgiZWoxIik7CisJJm1vdmIoJkxCKCJlY3giKSwJJkJQKDAsJGluLCIiLDApKTsKKyZzZXRfbGFiZWwoImVqZW5kIik7CisKKwkmeG9yKCJlYXgiLAkiZWN4Iik7CisJJnhvcigiZWJ4IiwJImVkeCIpOworCisJJmJzd2FwKCJlYXgiKQlpZiAkc3dhcDsKKwkmYnN3YXAoImVieCIpCWlmICRzd2FwOworCisJJm1vdigmRFdQKCRkYXRhX29mZiwiZXNwIiwiIiwwKSwJImVheCIpOwkjIHB1dCBpbiBhcnJheSBmb3IgY2FsbAorCSZtb3YoJkRXUCgkZGF0YV9vZmYrNCwiZXNwIiwiIiwwKSwJImVieCIpOwkjCisKKwkmY2FsbCgkZW5jX2Z1bmMpOworCisJJm1vdigiZWF4IiwJJkRXUCgkZGF0YV9vZmYsImVzcCIsIiIsMCkpOworCSZtb3YoImVieCIsCSZEV1AoJGRhdGFfb2ZmKzQsImVzcCIsIiIsMCkpOworCisJJmJzd2FwKCJlYXgiKQlpZiAkc3dhcDsKKwkmYnN3YXAoImVieCIpCWlmICRzd2FwOworCisJJm1vdigmRFdQKDAsJG91dCwiIiwwKSwiZWF4Iik7CisJJm1vdigmRFdQKDQsJG91dCwiIiwwKSwiZWJ4Iik7CisKKwkmam1wKCZsYWJlbCgiZmluaXNoIikpOworCisJIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwkmc2V0X2xhYmVsKCJkZWNyeXB0IiwxKTsKKwkjIGRlY3J5cHQgc3RhcnQgCisJJmFuZCgkY291bnQsMHhmZmZmZmZmOCk7CisJIyBUaGUgbmV4dCAyIGluc3RydWN0aW9ucyBhcmUgb25seSBmb3IgaWYgdGhlIGp6IGlzIHRha2VuCisJJm1vdigiZWF4IiwJJkRXUCgkZGF0YV9vZmYrOCwiZXNwIiwiIiwwKSk7CSMgZ2V0IGl2WzBdCisJJm1vdigiZWJ4IiwJJkRXUCgkZGF0YV9vZmYrMTIsImVzcCIsIiIsMCkpOwkjIGdldCBpdlsxXQorCSZqeigmbGFiZWwoImRlY3J5cHRfZmluaXNoIikpOworCisJJnNldF9sYWJlbCgiZGVjcnlwdF9sb29wIik7CisJJm1vdigiZWF4IiwJJkRXUCgwLCRpbiwiIiwwKSk7CSMgbG9hZCBmaXJzdCA0IGJ5dGVzCisJJm1vdigiZWJ4IiwJJkRXUCg0LCRpbiwiIiwwKSk7CSMgc2Vjb25kIDQgYnl0ZXMKKworCSZic3dhcCgiZWF4IikJaWYgJHN3YXA7CisJJmJzd2FwKCJlYngiKQlpZiAkc3dhcDsKKworCSZtb3YoJkRXUCgkZGF0YV9vZmYsImVzcCIsIiIsMCksCSJlYXgiKTsJIyBwdXQgYmFjaworCSZtb3YoJkRXUCgkZGF0YV9vZmYrNCwiZXNwIiwiIiwwKSwJImVieCIpOwkjCisKKwkmY2FsbCgkZGVjX2Z1bmMpOworCisJJm1vdigiZWF4IiwJJkRXUCgkZGF0YV9vZmYsImVzcCIsIiIsMCkpOwkjIGdldCByZXR1cm4KKwkmbW92KCJlYngiLAkmRFdQKCRkYXRhX29mZis0LCJlc3AiLCIiLDApKTsJIworCisJJmJzd2FwKCJlYXgiKQlpZiAkc3dhcDsKKwkmYnN3YXAoImVieCIpCWlmICRzd2FwOworCisJJm1vdigiZWN4IiwJJkRXUCgkZGF0YV9vZmYrOCwiZXNwIiwiIiwwKSk7CSMgZ2V0IGl2WzBdCisJJm1vdigiZWR4IiwJJkRXUCgkZGF0YV9vZmYrMTIsImVzcCIsIiIsMCkpOwkjIGdldCBpdlsxXQorCisJJnhvcigiZWN4IiwJImVheCIpOworCSZ4b3IoImVkeCIsCSJlYngiKTsKKworCSZtb3YoImVheCIsCSZEV1AoMCwkaW4sIiIsMCkpOwkjIGdldCBvbGQgY2lwaGVyIHRleHQsCisJJm1vdigiZWJ4IiwJJkRXUCg0LCRpbiwiIiwwKSk7CSMgbmV4dCBpdiBhY3R1YWxseQorCisJJm1vdigmRFdQKDAsJG91dCwiIiwwKSwiZWN4Iik7CisJJm1vdigmRFdQKDQsJG91dCwiIiwwKSwiZWR4Iik7CisKKwkmbW92KCZEV1AoJGRhdGFfb2ZmKzgsImVzcCIsIiIsMCksCSJlYXgiKTsJIyBzYXZlIGl2CisJJm1vdigmRFdQKCRkYXRhX29mZisxMiwiZXNwIiwiIiwwKSwJImVieCIpOwkjCisKKwkmYWRkKCRpbiwJOCk7CisJJmFkZCgkb3V0LAk4KTsKKworCSZzdWIoJGNvdW50LAk4KTsKKwkmam56KCZsYWJlbCgiZGVjcnlwdF9sb29wIikpOworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkRJVCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIzMKKwkmc2V0X2xhYmVsKCJkZWNyeXB0X2ZpbmlzaCIpOworCSZtb3YoJGNvdW50LAkmd3BhcmFtKDIpKTsJIyBsZW5ndGgKKwkmYW5kKCRjb3VudCwJNyk7CisJJmp6KCZsYWJlbCgiZmluaXNoIikpOworCisJJm1vdigiZWF4IiwJJkRXUCgwLCRpbiwiIiwwKSk7CSMgbG9hZCBmaXJzdCA0IGJ5dGVzCisJJm1vdigiZWJ4IiwJJkRXUCg0LCRpbiwiIiwwKSk7CSMgc2Vjb25kIDQgYnl0ZXMKKworCSZic3dhcCgiZWF4IikJaWYgJHN3YXA7CisJJmJzd2FwKCJlYngiKQlpZiAkc3dhcDsKKworCSZtb3YoJkRXUCgkZGF0YV9vZmYsImVzcCIsIiIsMCksCSJlYXgiKTsJIyBwdXQgYmFjaworCSZtb3YoJkRXUCgkZGF0YV9vZmYrNCwiZXNwIiwiIiwwKSwJImVieCIpOwkjCisKKwkmY2FsbCgkZGVjX2Z1bmMpOworCisJJm1vdigiZWF4IiwJJkRXUCgkZGF0YV9vZmYsImVzcCIsIiIsMCkpOwkjIGdldCByZXR1cm4KKwkmbW92KCJlYngiLAkmRFdQKCRkYXRhX29mZis0LCJlc3AiLCIiLDApKTsJIworCisJJmJzd2FwKCJlYXgiKQlpZiAkc3dhcDsKKwkmYnN3YXAoImVieCIpCWlmICRzd2FwOworCisJJm1vdigiZWN4IiwJJkRXUCgkZGF0YV9vZmYrOCwiZXNwIiwiIiwwKSk7CSMgZ2V0IGl2WzBdCisJJm1vdigiZWR4IiwJJkRXUCgkZGF0YV9vZmYrMTIsImVzcCIsIiIsMCkpOwkjIGdldCBpdlsxXQorCisJJnhvcigiZWN4IiwJImVheCIpOworCSZ4b3IoImVkeCIsCSJlYngiKTsKKworCSMgdGhpcyBpcyBmb3Igd2hlbiB3ZSBleGl0CisJJm1vdigiZWF4IiwJJkRXUCgwLCRpbiwiIiwwKSk7CSMgZ2V0IG9sZCBjaXBoZXIgdGV4dCwKKwkmbW92KCJlYngiLAkmRFdQKDQsJGluLCIiLDApKTsJIyBuZXh0IGl2IGFjdHVhbGx5CisKKyZzZXRfbGFiZWwoImRqNyIpOworCSZyb3RyKCJlZHgiLAkxNik7CisJJm1vdmIoJkJQKDYsJG91dCwiIiwwKSwJJkxCKCJlZHgiKSk7CisJJnNocigiZWR4IiwxNik7Cismc2V0X2xhYmVsKCJkajYiKTsKKwkmbW92YigmQlAoNSwkb3V0LCIiLDApLAkmSEIoImVkeCIpKTsKKyZzZXRfbGFiZWwoImRqNSIpOworCSZtb3ZiKCZCUCg0LCRvdXQsIiIsMCksCSZMQigiZWR4IikpOworJnNldF9sYWJlbCgiZGo0Iik7CisJJm1vdigmRFdQKDAsJG91dCwiIiwwKSwJImVjeCIpOworCSZqbXAoJmxhYmVsKCJkamVuZCIpKTsKKyZzZXRfbGFiZWwoImRqMyIpOworCSZyb3RyKCJlY3giLAkxNik7CisJJm1vdmIoJkJQKDIsJG91dCwiIiwwKSwJJkxCKCJlY3giKSk7CisJJnNobCgiZWN4IiwxNik7Cismc2V0X2xhYmVsKCJkajIiKTsKKwkmbW92YigmQlAoMSwkaW4sIiIsMCksCSZIQigiZWN4IikpOworJnNldF9sYWJlbCgiZGoxIik7CisJJm1vdmIoJkJQKDAsJGluLCIiLDApLAkmTEIoImVjeCIpKTsKKyZzZXRfbGFiZWwoImRqZW5kIik7CisKKwkjIGZpbmFsIGl2IGlzIHN0aWxsIGluIGVheDplYngKKwkmam1wKCZsYWJlbCgiZmluaXNoIikpOworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRklOSVNIICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjMworCSZzZXRfbGFiZWwoImZpbmlzaCIsMSk7CisJJm1vdigiZWN4IiwJJndwYXJhbSgkaXZfb2ZmKSk7CSMgR2V0IGl2IHB0cgorCisJIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCSR0b3RhbD0xNis0OworCSR0b3RhbCs9NCBpZiAoJHAxID4gMCk7CisJJHRvdGFsKz00IGlmICgkcDIgPiAwKTsKKwkkdG90YWwrPTQgaWYgKCRwMyA+IDApOworCSZhZGQoImVzcCIsJHRvdGFsKTsKKworCSZtb3YoJkRXUCgwLCJlY3giLCIiLDApLAkiZWF4Iik7CSMgc2F2ZSBpdgorCSZtb3YoJkRXUCg0LCJlY3giLCIiLDApLAkiZWJ4Iik7CSMgc2F2ZSBpdgorCisJJmZ1bmN0aW9uX2VuZF9BKCRuYW1lKTsKKworCSZhbGlnbig2NCk7CisJJnNldF9sYWJlbCgiY2JjX2VuY19qbXBfdGFibGUiKTsKKwkmZGF0YV93b3JkKCIwIik7CisJJmRhdGFfd29yZCgmbGFiZWwoImVqMSIpLiItIi4mbGFiZWwoIlBJQ19wb2ludCIpKTsKKwkmZGF0YV93b3JkKCZsYWJlbCgiZWoyIikuIi0iLiZsYWJlbCgiUElDX3BvaW50IikpOworCSZkYXRhX3dvcmQoJmxhYmVsKCJlajMiKS4iLSIuJmxhYmVsKCJQSUNfcG9pbnQiKSk7CisJJmRhdGFfd29yZCgmbGFiZWwoImVqNCIpLiItIi4mbGFiZWwoIlBJQ19wb2ludCIpKTsKKwkmZGF0YV93b3JkKCZsYWJlbCgiZWo1IikuIi0iLiZsYWJlbCgiUElDX3BvaW50IikpOworCSZkYXRhX3dvcmQoJmxhYmVsKCJlajYiKS4iLSIuJmxhYmVsKCJQSUNfcG9pbnQiKSk7CisJJmRhdGFfd29yZCgmbGFiZWwoImVqNyIpLiItIi4mbGFiZWwoIlBJQ19wb2ludCIpKTsKKwkjIG5vdCB1c2VkCisJIyZzZXRfbGFiZWwoImNiY19kZWNfam1wX3RhYmxlIiwxKTsKKwkjJmRhdGFfd29yZCgiMCIpOworCSMmZGF0YV93b3JkKCZsYWJlbCgiZGoxIikuIi0iLiZsYWJlbCgiUElDX3BvaW50IikpOworCSMmZGF0YV93b3JkKCZsYWJlbCgiZGoyIikuIi0iLiZsYWJlbCgiUElDX3BvaW50IikpOworCSMmZGF0YV93b3JkKCZsYWJlbCgiZGozIikuIi0iLiZsYWJlbCgiUElDX3BvaW50IikpOworCSMmZGF0YV93b3JkKCZsYWJlbCgiZGo0IikuIi0iLiZsYWJlbCgiUElDX3BvaW50IikpOworCSMmZGF0YV93b3JkKCZsYWJlbCgiZGo1IikuIi0iLiZsYWJlbCgiUElDX3BvaW50IikpOworCSMmZGF0YV93b3JkKCZsYWJlbCgiZGo2IikuIi0iLiZsYWJlbCgiUElDX3BvaW50IikpOworCSMmZGF0YV93b3JkKCZsYWJlbCgiZGo3IikuIi0iLiZsYWJlbCgiUElDX3BvaW50IikpOworCSZhbGlnbig2NCk7CisKKwkmZnVuY3Rpb25fZW5kX0IoJG5hbWUpOworCQorCX0KKworMTsKZGlmZiAtLWdpdCBhL2NyeXB0by9wZXJsYXNtL3BwYy14bGF0ZS5wbCBiL2NyeXB0by9wZXJsYXNtL3BwYy14bGF0ZS5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZWQ3YmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3Blcmxhc20vcHBjLXhsYXRlLnBsCkBAIC0wLDAgKzEsMTYxIEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMgUG93ZXJQQyBhc3NlbWJsZXIgZGlzdGlsbGVyIGJ5IDxhcHBybz4uCisKK215ICRmbGF2b3VyID0gc2hpZnQ7CitteSAkb3V0cHV0ID0gc2hpZnQ7CitvcGVuIFNURE9VVCwiPiRvdXRwdXQiIHx8IGRpZSAiY2FuJ3Qgb3BlbiAkb3V0cHV0OiAkISI7CisKK215ICVHTE9CQUxTOworbXkgJGRvdGlubG9jYWxsYWJlbHM9KCRmbGF2b3VyPX4vbGludXgvKT8xOjA7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgZGlyZWN0aXZlcyB3aGljaCBuZWVkIHNwZWNpYWwgdHJlYXRtZW50IG9uIGRpZmZlcmVudCBwbGF0Zm9ybXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK215ICRnbG9ibCA9IHN1YiB7CisgICAgbXkgJGp1bmsgPSBzaGlmdDsKKyAgICBteSAkbmFtZSA9IHNoaWZ0OworICAgIG15ICRnbG9iYWwgPSBcJEdMT0JBTFN7JG5hbWV9OworICAgIG15ICRyZXQ7CisKKyAgICAkbmFtZSA9fiBzfF5bXC5cX118fDsKKyAKKyAgICBTV0lUQ0g6IGZvciAoJGZsYXZvdXIpIHsKKwkvYWl4LwkJJiYgZG8geyAkbmFtZSA9ICIuJG5hbWUiOworCQkJCWxhc3Q7CisJCQkgICAgICB9OworCS9vc3gvCQkmJiBkbyB7ICRuYW1lID0gIl8kbmFtZSI7CisJCQkJbGFzdDsKKwkJCSAgICAgIH07CisJL2xpbnV4LiozMi8JJiYgZG8gewkkcmV0IC49ICIuZ2xvYmwJJG5hbWVcbiI7CisJCQkJJHJldCAuPSAiLnR5cGUJJG5hbWUsXEBmdW5jdGlvbiI7CisJCQkJbGFzdDsKKwkJCSAgICAgIH07CisJL2xpbnV4Lio2NC8JJiYgZG8gewkkcmV0IC49ICIuZ2xvYmwJJG5hbWVcbiI7CisJCQkJJHJldCAuPSAiLnR5cGUJJG5hbWUsXEBmdW5jdGlvblxuIjsKKwkJCQkkcmV0IC49ICIuc2VjdGlvbglcIi5vcGRcIixcImF3XCJcbiI7CisJCQkJJHJldCAuPSAiLmFsaWduCTNcbiI7CisJCQkJJHJldCAuPSAiJG5hbWU6XG4iOworCQkJCSRyZXQgLj0gIi5xdWFkCS4kbmFtZSwuVE9DLlxAdG9jYmFzZSwwXG4iOworCQkJCSRyZXQgLj0gIi5wcmV2aW91c1xuIjsKKworCQkJCSRuYW1lID0gIi4kbmFtZSI7CisJCQkJbGFzdDsKKwkJCSAgICAgIH07CisgICAgfQorCisgICAgJHJldCA9ICIuZ2xvYmwJJG5hbWUiIGlmICghJHJldCk7CisgICAgJCRnbG9iYWwgPSAkbmFtZTsKKyAgICAkcmV0OworfTsKK215ICR0ZXh0ID0gc3ViIHsKKyAgICAoJGZsYXZvdXIgPX4gL2FpeC8pID8gIi5jc2VjdCIgOiAiLnRleHQiOworfTsKK215ICRtYWNoaW5lID0gc3ViIHsKKyAgICBteSAkanVuayA9IHNoaWZ0OworICAgIG15ICRhcmNoID0gc2hpZnQ7CisgICAgaWYgKCRmbGF2b3VyID1+IC9vc3gvKQorICAgIHsJJGFyY2ggPX4gcy9cIi8vZzsKKwkkYXJjaCA9ICgkZmxhdm91cj1+LzY0LykgPyAicHBjOTcwLTY0IiA6ICJwcGM5NzAiIGlmICgkYXJjaCBlcSAiYW55Iik7CisgICAgfQorICAgICIubWFjaGluZQkkYXJjaCI7Cit9OworbXkgJHNpemUgPSBzdWIgeworICAgIGlmICgkZmxhdm91ciA9fiAvbGludXgvKQorICAgIHsJc2hpZnQ7CisJbXkgJG5hbWUgPSBzaGlmdDsgJG5hbWUgPX4gc3xeW1wuXF9dfHw7CisJbXkgJHJldCAgPSAiLnNpemUJJG5hbWUsLi0iLigkZmxhdm91cj1+LzY0Lz8iLiI6IiIpLiRuYW1lOworCSRyZXQgLj0gIlxuLnNpemUJLiRuYW1lLC4tLiRuYW1lIiBpZiAoJGZsYXZvdXI9fi82NC8pOworCSRyZXQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CSIiOwl9Cit9OworbXkgJGFzY2l6ID0gc3ViIHsKKyAgICBzaGlmdDsKKyAgICBteSAkbGluZSA9IGpvaW4oIiwiLEBfKTsKKyAgICBpZiAoJGxpbmUgPX4gL14iKC4qKSIkLykKKyAgICB7CSIuYnl0ZQkiIC4gam9pbigiLCIsdW5wYWNrKCJDKiIsJDEpLDApIC4gIlxuLmFsaWduCTIiOwl9CisgICAgZWxzZQorICAgIHsJIiI7CX0KK307CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgc2ltcGxpZmllZCBtbmVtb25pY3Mgbm90IGhhbmRsZWQgYnkgYXQgbGVhc3Qgb25lIGFzc2VtYmxlcgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworbXkgJGNtcGx3ID0gc3ViIHsKKyAgICBteSAkZiA9IHNoaWZ0OworICAgIG15ICRjciA9IDA7ICRjciA9IHNoaWZ0IGlmICgkI18+MSk7CisgICAgIyBTb21lIG91dC1vZi1kYXRlIDMyLWJpdCBHTlUgYXNzZW1ibGVyIGp1c3QgY2FuJ3QgaGFuZGxlIGNtcGx3Li4uCisgICAgKCRmbGF2b3VyID1+IC9saW51eC4qMzIvKSA/CisJIgkubG9uZwkiLnNwcmludGYgIjB4JXgiLDMxPDwyNnwkY3I8PDIzfCRfWzBdPDwxNnwkX1sxXTw8MTF8NjQgOgorCSIJY21wbHcJIi5qb2luKCcsJywkY3IsQF8pOworfTsKK215ICRiZG56ID0gc3ViIHsKKyAgICBteSAkZiA9IHNoaWZ0OworICAgIG15ICRibyA9ICRmPX4vW1wrXC1dLyA/IDE2KzkgOiAxNjsJIyBvcHRpb25hbCAidG8gYmUgdGFrZW4iIGhpbnQKKyAgICAiCWJjCSRibywwLCIuc2hpZnQ7Cit9IGlmICgkZmxhdm91ciF+L2xpbnV4Lyk7CitteSAkYmx0bHIgPSBzdWIgeworICAgIG15ICRmID0gc2hpZnQ7CisgICAgbXkgJGJvID0gJGY9fi9cLS8gPyAxMisyIDogMTI7CSMgb3B0aW9uYWwgIm5vdCB0byBiZSB0YWtlbiIgaGludAorICAgICgkZmxhdm91ciA9fiAvbGludXgvKSA/CQkjIEdOVSBhcyBkb2Vzbid0IGFsbG93IG1vc3QgcmVjZW50IGhpbnRzCisJIgkubG9uZwkiLnNwcmludGYgIjB4JXgiLDE5PDwyNnwkYm88PDIxfDE2PDwxIDoKKwkiCWJjbHIJJGJvLDAiOworfTsKK215ICRibmVsciA9IHN1YiB7CisgICAgbXkgJGYgPSBzaGlmdDsKKyAgICBteSAkYm8gPSAkZj1+L1wtLyA/IDQrMiA6IDQ7CSMgb3B0aW9uYWwgIm5vdCB0byBiZSB0YWtlbiIgaGludAorICAgICgkZmxhdm91ciA9fiAvbGludXgvKSA/CQkjIEdOVSBhcyBkb2Vzbid0IGFsbG93IG1vc3QgcmVjZW50IGhpbnRzCisJIgkubG9uZwkiLnNwcmludGYgIjB4JXgiLDE5PDwyNnwkYm88PDIxfDI8PDE2fDE2PDwxIDoKKwkiCWJjbHIJJGJvLDIiOworfTsKK215ICRiZXFsciA9IHN1YiB7CisgICAgbXkgJGYgPSBzaGlmdDsKKyAgICBteSAkYm8gPSAkZj1+Ly0vID8gMTIrMiA6IDEyOwkjIG9wdGlvbmFsICJub3QgdG8gYmUgdGFrZW4iIGhpbnQKKyAgICAoJGZsYXZvdXIgPX4gL2xpbnV4LykgPwkJIyBHTlUgYXMgZG9lc24ndCBhbGxvdyBtb3N0IHJlY2VudCBoaW50cworCSIJLmxvbmcJIi5zcHJpbnRmICIweCVYIiwxOTw8MjZ8JGJvPDwyMXwyPDwxNnwxNjw8MSA6CisJIgliY2xyCSRibywyIjsKK307CisjIEdOVSBhc3NlbWJsZXIgY2FuJ3QgaGFuZGxlIGV4dHJkaSByQSxyUywxNiw0OCwgb3Igd2hlbiBzdW0gb2YgbGFzdCB0d28KKyMgYXJndW1lbnRzIGlzIDY0LCB3aXRoICJvcGVyYW5kIG91dCBvZiByYW5nZSIgZXJyb3IuCitteSAkZXh0cmRpID0gc3ViIHsKKyAgICBteSAoJGYsJHJhLCRycywkbiwkYikgPSBAXzsKKyAgICAkYiA9ICgkYiskbikmNjM7ICRuID0gNjQtJG47CisgICAgIglybGRpY2wJJHJhLCRycywkYiwkbiI7Cit9OworCit3aGlsZSgkbGluZT08PikgeworCisgICAgJGxpbmUgPX4gc3xbIyE7XS4qJHx8OwkjIGdldCByaWQgb2YgYXNtLXN0eWxlIGNvbW1lbnRzLi4uCisgICAgJGxpbmUgPX4gc3wvXCouKlwqL3x8OwkjIC4uLiBhbmQgQy1zdHlsZSBjb21tZW50cy4uLgorICAgICRsaW5lID1+IHN8XlxzK3x8OwkJIyAuLi4gYW5kIHNraXAgd2hpdGUgc3BhY2VzIGluIGJlZ2lubmluZy4uLgorICAgICRsaW5lID1+IHN8XHMrJHx8OwkJIyAuLi4gYW5kIGF0IHRoZSBlbmQKKworICAgIHsKKwkkbGluZSA9fiBzfFxiXC5MKFx3Kyl8TCQxfGc7CSMgY29tbW9uIGRlbm9taW5hdG9yIGZvciBMb2NhbGxhYmVsCisJJGxpbmUgPX4gc3xcYkwoXHcrKXxcLkwkMXxnCWlmICgkZG90aW5sb2NhbGxhYmVscyk7CisgICAgfQorCisgICAgeworCSRsaW5lID1+IHN8KF5bXC5cd10rKVw6XHMqfHw7CisJbXkgJGxhYmVsID0gJDE7CisJcHJpbnRmICIlczoiLCgkR0xPQkFMU3skbGFiZWx9IG9yICRsYWJlbCkgaWYgKCRsYWJlbCk7CisgICAgfQorCisgICAgeworCSRsaW5lID1+IHN8XlxzKihcLj8pKFx3KykoW1wuXCtcLV0/KVxzKnx8OworCW15ICRjID0gJDE7ICRjID0gIlx0IiBpZiAoJGMgZXEgIiIpOworCW15ICRtbmVtb25pYyA9ICQyOworCW15ICRmID0gJDM7CisJbXkgJG9wY29kZSA9IGV2YWwoIlwkJG1uZW1vbmljIik7CisJJGxpbmUgPX4gc3xcYmM/W3JmXShbMC05XSspXGJ8JDF8ZyBpZiAoJGMgbmUgIi4iIGFuZCAkZmxhdm91ciAhfiAvb3N4Lyk7CisJaWYgKHJlZigkb3Bjb2RlKSBlcSAnQ09ERScpIHsgJGxpbmUgPSAmJG9wY29kZSgkZixzcGxpdCgnLCcsJGxpbmUpKTsgfQorCWVsc2lmICgkbW5lbW9uaWMpICAgICAgICAgICB7ICRsaW5lID0gJGMuJG1uZW1vbmljLiRmLiJcdCIuJGxpbmU7IH0KKyAgICB9CisKKyAgICBwcmludCAkbGluZSBpZiAoJGxpbmUpOworICAgIHByaW50ICJcbiI7Cit9CisKK2Nsb3NlIFNURE9VVDsKZGlmZiAtLWdpdCBhL2NyeXB0by9wZXJsYXNtL3JlYWRtZSBiL2NyeXB0by9wZXJsYXNtL3JlYWRtZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDJiYmVlCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3Blcmxhc20vcmVhZG1lCkBAIC0wLDAgKzEsMTI0IEBACitUaGUgcGVybCBzY3JpcHRzIGluIHRoaXMgZGlyZWN0b3J5IGFyZSBteSAnaGFjaycgdG8gZ2VuZXJhdGUKK211bHRpcGxlIGRpZmZlcmVudCBhc3NlbWJsZXIgZm9ybWF0cyB2aWEgdGhlIG9uZSBvcmlnaW9uYWwgc2NyaXB0LgorCitUaGUgd2F5IHRvIHVzZSB0aGlzIGxpYnJhcnkgaXMgdG8gc3RhcnQgd2l0aCBhZGRpbmcgdGhlIHBhdGggdG8gdGhpcyBkaXJlY3RvcnkKK2FuZCB0aGVuIGluY2x1ZGUgaXQuCisKK3B1c2goQElOQywicGVybGFzbSIsIi4uLy4uL3Blcmxhc20iKTsKK3JlcXVpcmUgIng4NmFzbS5wbCI7CisKK1RoZSBmaXJzdCB0aGluZyB3ZSBkbyBpcyBzZXR1cCB0aGUgZmlsZSBhbmQgdHlwZSBvZiBhc3NlbWJlcgorCismYXNtX2luaXQoJEFSR1ZbMF0sJDApOworCitUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlICd0eXBlJy4gIEN1cnJlbnRseQorJ2NwcCcsICdzb2wnLCAnYS5vdXQnLCAnZWxmJyBvciAnd2luMzInLgorQXJndW1lbnQgMiBpcyB0aGUgZmlsZSBuYW1lLgorCitUaGUgcmVjaXByb2NhbCBmdW5jdGlvbiBpcworJmFzbV9maW5pc2goKSB3aGljaCBzaG91bGQgYmUgY2FsbGVkIGF0IHRoZSBlbmQuCisKK1RoZXJlIGFyZSAyIG1haW4gJ3BhY2thZ2VzJy4geDg2bXMucGwsIHdoaWNoIGlzIHRoZSBtaWNyb3NvZnQgYXNzZW1ibGVyLAorYW5kIHg4NnVuaXgucGwgd2hpY2ggaXMgdGhlIHVuaXggKGdhcykgdmVyc2lvbi4KKworRnVuY3Rpb25zIG9mIGludGVyZXN0IGFyZToKKyZleHRlcm5hbF9sYWJlbCgiZGVzX1NQdHJhbnMiKTsJZGVjbGFyZSBhbmQgZXh0ZXJuYWwgdmFyaWFibGUKKyZMQihyZWcpOwkJCUxvdyBieXRlIGZvciBhIHJlZ2lzdGVyCismSEIocmVnKTsJCQlIaWdoIGJ5dGUgZm9yIGEgcmVnaXN0ZXIKKyZCUChvZmYsYmFzZSxpbmRleCxzY2FsZSkJQnl0ZSBwb2ludGVyIGFkZHJlc3NpbmcKKyZEV1Aob2ZmLGJhc2UsaW5kZXgsc2NhbGUpCVdvcmQgcG9pbnRlciBhZGRyZXNzaW5nCismc3RhY2tfcHVzaChudW0pCQlCYXNpY2FsbHkgYSAnc3ViIGVzcCwgbnVtKjQnIHdpdGggZXh0cmEKKyZzdGFja19wb3AobnVtKQkJCWludmVyc2Ugb2Ygc3RhY2tfcHVzaAorJmZ1bmN0aW9uX2JlZ2luKG5hbWUsZXh0cmEpCVN0YXJ0IGEgZnVuY3Rpb24gd2l0aCBwdXNoaW5nIG9mCisJCQkJZWRpLCBlc2ksIGVieCBhbmQgZWJwLiAgZXh0cmEgaXMgZXh0cmEgd2luMzIKKwkJCQlleHRlcm5hbCBpbmZvIHRoYXQgbWF5IGJlIHJlcXVpcmVkLgorJmZ1bmN0aW9uX2JlZ2luX0IobmFtZSxleHRyYSkJU2FtZSBhcyBub3JtYSBmdW5jdGlvbl9iZWdpbiBidXQgbm8gcHVzaGluZy4KKyZmdW5jdGlvbl9lbmQobmFtZSkJCUNhbGwgYXQgZW5kIG9mIGZ1bmN0aW9uLgorJmZ1bmN0aW9uX2VuZF9BKG5hbWUpCQlTdGFuZGFyZCBwb3AgYW5kIHJldCwgZm9yIHVzZSBpbnNpZGUgZnVuY3Rpb25zCismZnVuY3Rpb25fZW5kX0IobmFtZSkJCUNhbGwgYXQgZW5kIGJ1dCB3aXRoIHBvcGluZyBvciAncmV0Jy4KKyZzd3RtcChudW0pCQkJQWRkcmVzcyBvbiBzdGFjayB0ZW1wIHdvcmQuCismd3BhcmFtKG51bSkJCQlQYXJhbWV0ZXIgbnVtYmVyIG51bSwgdGhhdCB3YXMgcHVzaAorCQkJCWluIEMgY29udmVudGlvbi4gIFRoaXMgYWxsIHdvcmtzIG92ZXIgcHVzaGVzCisJCQkJYW5kIHBvcHMuCismY29tbWVudCgiaGVsbG8gdGhlcmUiKQkJUHV0IGluIGEgY29tbWVudC4KKyZsYWJlbCgibG9vcCIpCQkJUmVmZXIgdG8gYSBsYWJlbCwgbm9ybWFsbHkgYSBqbXAgdGFyZ2V0LgorJnNldF9sYWJlbCgibG9vcCIpCQlTZXQgYSBsYWJlbCBhdCB0aGlzIHBvaW50LgorJmRhdGFfd29yZCh3b3JkKQkJUHV0IGluIGEgd29yZCBvZiBkYXRhLgorCitTbyBob3cgZG9lcyB0aGlzIGFsbCBob2xkIHRvZ2V0aGVyPyAgR2l2ZW4KKworaW50IGNhbGMoaW50IGxlbiwgaW50ICpkYXRhKQorCXsKKwlpbnQgaSxqPTA7CisKKwlmb3IgKGk9MDsgaTxsZW47IGkrKykKKwkJeworCQlqKz1vdGhlcihkYXRhW2ldKTsKKwkJfQorCX0KKworU28gYSB2ZXJ5IHNpbXBsZSB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24gY291bGQgYmUgY29kZWQgYXMKKworCXB1c2goQElOQywicGVybGFzbSIsIi4uLy4uL3Blcmxhc20iKTsKKwlyZXF1aXJlICJ4ODZhc20ucGwiOworCQorCSZhc21faW5pdCgkQVJHVlswXSwiY2FjbC5wbCIpOworCisJJmV4dGVybmFsX2xhYmVsKCJvdGhlciIpOworCisJJHRtcDE9CSJlYXgiOworCSRqPQkiZWRpIjsKKwkkZGF0YT0JImVzaSI7CisJJGk9CSJlYnAiOworCisJJmNvbW1lbnQoImEgc2ltcGxlIGZ1bmN0aW9uIik7CisJJmZ1bmN0aW9uX2JlZ2luKCJjYWxjIik7CisJJm1vdigJJGRhdGEsCQkmd3BhcmFtKDEpKTsgIyBkYXRhCisJJnhvcigJJGosCQkkaik7CisJJnhvcigJJGksCQkkaSk7CisKKwkmc2V0X2xhYmVsKCJsb29wIik7CisJJmNtcCgJJGksCQkmd3BhcmFtKDApKTsKKwkmamdlKAkmbGFiZWwoImVuZCIpKTsKKworCSZtb3YoCSR0bXAxLAkJJkRXUCgwLCRkYXRhLCRpLDQpKTsKKwkmcHVzaCgJJHRtcDEpOworCSZjYWxsKAkib3RoZXIiKTsKKwkmYWRkKAkkaiwJCSJlYXgiKTsKKwkmcG9wKAkkdG1wMSk7CisJJmluYygJJGkpOworCSZqbXAoCSZsYWJlbCgibG9vcCIpKTsKKworCSZzZXRfbGFiZWwoImVuZCIpOworCSZtb3YoCSJlYXgiLAkJJGopOworCisJJmZ1bmN0aW9uX2VuZCgiY2FsYyIpOworCisJJmFzbV9maW5pc2goKTsKKworVGhlIGFib3ZlIGV4YW1wbGUgaXMgdmVyeSB2ZXJ5IHVub3B0aW1pc2VkIGJ1dCBnaXZlcyBhbiBpZGVhIG9mIGhvdwordGhpbmdzIHdvcmsuCisKK1RoZXJlIGlzIGFsc28gYSBjYmMgbW9kZSBmdW5jdGlvbiBnZW5lcmF0b3IgaW4gY2JjLnBsCisKKyZjYmMoCSRuYW1lLAorCSRlbmNyeXB0X2Z1bmN0aW9uX25hbWUsCisJJGRlY3J5cHRfZnVuY3Rpb25fbmFtZSwKKwkkdHJ1ZV9pZl9ieXRlX3N3YXBfbmVlZGVkLAorCSRwYXJhbWV0ZXJfbnVtYmVyX2Zvcl9pdiwKKwkkcGFyYW1ldGVyX251bWJlcl9mb3JfZW5jcnlwdF9mbGFnLAorCSRmaXJzdF9wYXJhbWV0ZXJfdG9fcGFzcywKKwkkc2Vjb25kX3BhcmFtZXRlcl90b19wYXNzLAorCSR0aGlyZF9wYXJhbWV0ZXJfdG9fcGFzcyk7CisKK1NvIGZvciBleGFtcGxlLCBnaXZlbgordm9pZCBCRl9lbmNyeXB0KEJGX0xPTkcgKmRhdGEsQkZfS0VZICprZXkpOwordm9pZCBCRl9kZWNyeXB0KEJGX0xPTkcgKmRhdGEsQkZfS0VZICprZXkpOwordm9pZCBCRl9jYmNfZW5jcnlwdCh1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LCBsb25nIGxlbmd0aCwKKyAgICAgICAgQkZfS0VZICprcywgdW5zaWduZWQgY2hhciAqaXYsIGludCBlbmMpOworCismY2JjKCJCRl9jYmNfZW5jcnlwdCIsIkJGX2VuY3J5cHQiLCJCRl9lbmNyeXB0IiwxLDQsNSwzLC0xLC0xKTsKKworJmNiYygiZGVzX25jYmNfZW5jcnlwdCIsImRlc19lbmNyeXB0IiwiZGVzX2VuY3J5cHQiLDAsNCw1LDMsNSwtMSk7CismY2JjKCJkZXNfZWRlM19jYmNfZW5jcnlwdCIsImRlc19lbmNyeXB0MyIsImRlc19kZWNyeXB0MyIsMCw2LDcsMyw0LDUpOworCmRpZmYgLS1naXQgYS9jcnlwdG8vcGVybGFzbS9zcGFyY3Y5X21vZGVzLnBsIGIvY3J5cHRvL3Blcmxhc20vc3BhcmN2OV9tb2Rlcy5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjQ3YmIxCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3Blcmxhc20vc3BhcmN2OV9tb2Rlcy5wbApAQCAtMCwwICsxLDE2ODAgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIyBTcGVjaWZpYyBtb2RlcyBpbXBsZW1lbnRhdGlvbnMgZm9yIFNQQVJDIEFyY2hpdGVjdHVyZSAyMDExLiBUaGVyZQorIyBpcyBUNCBkZXBlbmRlbmN5IHRob3VnaCwgYW4gQVNJIHZhbHVlIHRoYXQgaXMgbm90IHNwZWNpZmllZCBpbiB0aGUKKyMgQXJjaGl0ZWN0dXJlIE1hbnVhbC4gQnV0IGFzIFNQQVJDIHVuaXZlcnNlIGlzIHJhdGhlciBtb25vY3VsdHVyYWwsCisjIHdlIGltcGx5IHRoYXQgcHJvY2Vzc29yIGNhcGFibGUgb2YgZXhlY3V0aW5nIGNyeXB0byBpbnN0cnVjdGlvbnMKKyMgY2FuIGhhbmRsZSB0aGUgQVNJIGluIHF1ZXN0aW9uIGFzIHdlbGwuIFRoaXMgbWVhbnMgdGhhdCB3ZSBvdWdodCB0bworIyBrZWVwIGV5ZXMgb3BlbiB3aGVuIG5ldyBwcm9jZXNzb3JzIGVtZXJnZS4uLgorIworIyBBcyBmb3IgYWJvdmUgbWVudGlvbmVkIEFTSS4gSXQncyBzbyBjYWxsZWQgImJsb2NrIGluaXRpYWxpemluZworIyBzdG9yZSIgd2hpY2ggY2FuY2VscyAicmVhZCIgaW4gInJlYWQtdXBkYXRlLXdyaXRlIiBvbiBjYWNoZSBsaW5lcy4KKyMgVGhpcyBpcyAiY29vcGVyYXRpdmUiIG9wdGltaXphdGlvbiwgYXMgaXQgcmVkdWNlcyBvdmVyYWxsIHByZXNzdXJlCisjIG9uIG1lbW9yeSBpbnRlcmZhY2UuIEJlbmVmaXRzIGNhbid0IGJlIG9ic2VydmVkL3F1YW50aWZpZWQgd2l0aAorIyB1c3VhbCBiZW5jaG1hcmtzLCBvbiB0aGUgY29udHJhcnkgeW91IGNhbiBub3RpY2UgdGhhdCBzaW5nbGUtdGhyZWFkCisjIHBlcmZvcm1hbmNlIGZvciBwYXJhbGxlbGl6YWJsZSBtb2RlcyBpcyB+MS41JSB3b3JzZSBmb3IgbGFyZ2VzdAorIyBibG9jayBzaXplcyBbdGhvdWdoIGZldyBwZXJjZW50IGJldHRlciBmb3Igbm90IHNvIGxvbmcgb25lc10uIEFsbAorIyB0aGlzIGJhc2VkIG9uIHN1Z2dlc3Rpb25zIGZyb20gRGF2aWQgTWlsbGVyLgorCitzdWIgYXNtX2luaXQgewkJIyB0byBiZSBjYWxsZWQgd2l0aCBAQVJHViBhcyBhcmd1bWVudAorICAgIGZvciAoQF8pCQl7ICQ6OmFiaWJpdHM9NjQgaWYgKC9cLW02NC8gfHwgL1wteGFyY2hcPXY5Lyk7IH0KKyAgICBpZiAoJDo6YWJpYml0cz09NjQpCXsgJDo6Ymlhcz0yMDQ3OyAkOjpmcmFtZT0xOTI7ICQ6OnNpemVfdF9jYz0iJXhjYyI7IH0KKyAgICBlbHNlCQl7ICQ6OmJpYXM9MDsgICAgJDo6ZnJhbWU9MTEyOyAkOjpzaXplX3RfY2M9IiVpY2MiOyB9Cit9CisKKyMgdW5pZmllZCBpbnRlcmZhY2UKK215ICgkaW5wLCRvdXQsJGxlbiwka2V5LCRpdmVjKT1tYXAoIiVpJF8iLCgwLi41KSk7CisjIGxvY2FsIHZhcmlhYmxlcworbXkgKCRpbGVmdCwkaXJpZ2h0LCRvb2ZmLCRvbWFzaywkaXZvZmYsJGJsa19pbml0KT1tYXAoIiVsJF8iLCgwLi43KSk7CisKK3N1YiBhbGdfY2JjX2VuY3J5cHRfaW1wbGVtZW50IHsKK215ICgkYWxnLCRiaXRzKSA9IEBfOworCiskOjpjb2RlLj08PF9fXzsKKy5nbG9ibAkke2FsZ30ke2JpdHN9X3Q0X2NiY19lbmNyeXB0CisuYWxpZ24JMzIKKyR7YWxnfSR7Yml0c31fdDRfY2JjX2VuY3J5cHQ6CisJc2F2ZQkJJXNwLCAtJDo6ZnJhbWUsICVzcAorCXN1YgkJJGlucCwgJG91dCwgJGJsa19pbml0CSEgJGlucCE9JG91dAorX19fCiskOjpjb2RlLj08PF9fXyBpZiAoISQ6OmV2cCk7CisJYW5kY2MJCSRpdmVjLCA3LCAkaXZvZmYKKwlhbGlnbmFkZHIJJGl2ZWMsICVnMCwgJGl2ZWMKKworCWxkZAkJWyRpdmVjICsgMF0sICVmMAkhIGxvYWQgaXZlYworCWJ6LHB0CQklaWNjLCAxZgorCWxkZAkJWyRpdmVjICsgOF0sICVmMgorCWxkZAkJWyRpdmVjICsgMTZdLCAlZjQKKwlmYWxpZ25kYXRhCSVmMCwgJWYyLCAlZjAKKwlmYWxpZ25kYXRhCSVmMiwgJWY0LCAlZjIKKzE6CitfX18KKyQ6OmNvZGUuPTw8X19fIGlmICgkOjpldnApOworCWxkCQlbJGl2ZWMgKyAwXSwgJWYwCisJbGQJCVskaXZlYyArIDRdLCAlZjEKKwlsZAkJWyRpdmVjICsgOF0sICVmMgorCWxkCQlbJGl2ZWMgKyAxMl0sICVmMworX19fCiskOjpjb2RlLj08PF9fXzsKKwlwcmVmZXRjaAlbJGlucF0sIDIwCisJcHJlZmV0Y2gJWyRpbnAgKyA2M10sIDIwCisJY2FsbAkJXyR7YWxnfSR7Yml0c31fbG9hZF9lbmNrZXkKKwlhbmQJCSRpbnAsIDcsICRpbGVmdAorCWFuZG4JCSRpbnAsIDcsICRpbnAKKwlzbGwJCSRpbGVmdCwgMywgJGlsZWZ0CisJbW92CQk2NCwgJGlyaWdodAorCW1vdgkJMHhmZiwgJG9tYXNrCisJc3ViCQkkaXJpZ2h0LCAkaWxlZnQsICRpcmlnaHQKKwlhbmQJCSRvdXQsIDcsICRvb2ZmCisJY21wCQkkbGVuLCAxMjcKKwltb3ZybnoJCSRvb2ZmLCAwLCAkYmxrX2luaXQJCSEgaWYgKAkkb3V0JjcgfHwKKwltb3ZsZXUJCSQ6OnNpemVfdF9jYywgMCwgJGJsa19pbml0CSEJJGxlbjwxMjggfHwKKwlicm56LHBuCQkkYmxrX2luaXQsIC5MJHtiaXRzfWNiY19lbmNfYmxrCSEJJGlucD09JG91dCkKKwlzcmwJCSRvbWFzaywgJG9vZmYsICRvbWFzaworCisJYWxpZ25hZGRybAkkb3V0LCAlZzAsICRvdXQKKwlzcmx4CQkkbGVuLCA0LCAkbGVuCisJcHJlZmV0Y2gJWyRvdXRdLCAyMgorCisuTCR7Yml0c31fY2JjX2VuY19sb29wOgorCWxkeAkJWyRpbnAgKyAwXSwgJW8wCisJYnJ6LHB0CQkkaWxlZnQsIDRmCisJbGR4CQlbJGlucCArIDhdLCAlbzEKKworCWxkeAkJWyRpbnAgKyAxNl0sICVvMgorCXNsbHgJCSVvMCwgJGlsZWZ0LCAlbzAKKwlzcmx4CQklbzEsICRpcmlnaHQsICVnMQorCXNsbHgJCSVvMSwgJGlsZWZ0LCAlbzEKKwlvcgkJJWcxLCAlbzAsICVvMAorCXNybHgJCSVvMiwgJGlyaWdodCwgJW8yCisJb3IJCSVvMiwgJW8xLCAlbzEKKzQ6CisJeG9yCQklZzQsICVvMCwgJW8wCQkhIF49IHJrWzBdCisJeG9yCQklZzUsICVvMSwgJW8xCisJbW92eHRvZAkJJW8wLCAlZjEyCisJbW92eHRvZAkJJW8xLCAlZjE0CisKKwlmeG9yCQklZjEyLCAlZjAsICVmMAkJISBePSBpdmVjCisJZnhvcgkJJWYxNCwgJWYyLCAlZjIKKwlwcmVmZXRjaAlbJG91dCArIDYzXSwgMjIKKwlwcmVmZXRjaAlbJGlucCArIDE2KzYzXSwgMjAKKwljYWxsCQlfJHthbGd9JHtiaXRzfV9lbmNyeXB0XzF4CisJYWRkCQkkaW5wLCAxNiwgJGlucAorCisJYnJueixwbgkJJG9vZmYsIDJmCisJc3ViCQkkbGVuLCAxLCAkbGVuCisJCQorCXN0ZAkJJWYwLCBbJG91dCArIDBdCisJc3RkCQklZjIsIFskb3V0ICsgOF0KKwlicm56LHB0CQkkbGVuLCAuTCR7Yml0c31fY2JjX2VuY19sb29wCisJYWRkCQkkb3V0LCAxNiwgJG91dAorX19fCiskOjpjb2RlLj08PF9fXyBpZiAoJDo6ZXZwKTsKKwlzdAkJJWYwLCBbJGl2ZWMgKyAwXQorCXN0CQklZjEsIFskaXZlYyArIDRdCisJc3QJCSVmMiwgWyRpdmVjICsgOF0KKwlzdAkJJWYzLCBbJGl2ZWMgKyAxMl0KK19fXworJDo6Y29kZS49PDxfX18gaWYgKCEkOjpldnApOworCWJybnoscG4JCSRpdm9mZiwgM2YKKwlub3AKKworCXN0ZAkJJWYwLCBbJGl2ZWMgKyAwXQkhIHdyaXRlIG91dCBpdmVjCisJc3RkCQklZjIsIFskaXZlYyArIDhdCitfX18KKyQ6OmNvZGUuPTw8X19fOworCXJldAorCXJlc3RvcmUKKworLmFsaWduCTE2CisyOglsZHhhCQlbJGlucF0weDgyLCAlbzAJCSEgYXZvaWQgcmVhZC1hZnRlci13cml0ZSBoYXphcmQKKwkJCQkJCSEgYW5kIH4zeCBkZXRlcmlvcmF0aW9uCisJCQkJCQkhIGluIGlucD09b3V0IGNhc2UKKwlmYWxpZ25kYXRhCSVmMCwgJWYwLCAlZjQJCSEgaGFuZGxlIHVuYWxpZ25lZCBvdXRwdXQKKwlmYWxpZ25kYXRhCSVmMCwgJWYyLCAlZjYKKwlmYWxpZ25kYXRhCSVmMiwgJWYyLCAlZjgKKworCXN0ZGEJCSVmNCwgWyRvdXQgKyAkb21hc2tdMHhjMAkhIHBhcnRpYWwgc3RvcmUKKwlzdGQJCSVmNiwgWyRvdXQgKyA4XQorCWFkZAkJJG91dCwgMTYsICRvdXQKKwlvcm4JCSVnMCwgJG9tYXNrLCAkb21hc2sKKwlzdGRhCQklZjgsIFskb3V0ICsgJG9tYXNrXTB4YzAJISBwYXJ0aWFsIHN0b3JlCisKKwlicm56LHB0CQkkbGVuLCAuTCR7Yml0c31fY2JjX2VuY19sb29wKzQKKwlvcm4JCSVnMCwgJG9tYXNrLCAkb21hc2sKK19fXworJDo6Y29kZS49PDxfX18gaWYgKCQ6OmV2cCk7CisJc3QJCSVmMCwgWyRpdmVjICsgMF0KKwlzdAkJJWYxLCBbJGl2ZWMgKyA0XQorCXN0CQklZjIsIFskaXZlYyArIDhdCisJc3QJCSVmMywgWyRpdmVjICsgMTJdCitfX18KKyQ6OmNvZGUuPTw8X19fIGlmICghJDo6ZXZwKTsKKwlicm56LHBuCQkkaXZvZmYsIDNmCisJbm9wCisKKwlzdGQJCSVmMCwgWyRpdmVjICsgMF0JISB3cml0ZSBvdXQgaXZlYworCXN0ZAkJJWYyLCBbJGl2ZWMgKyA4XQorCXJldAorCXJlc3RvcmUKKworLmFsaWduCTE2CiszOglhbGlnbmFkZHJsCSRpdmVjLCAkaXZvZmYsICVnMAkhIGhhbmRsZSB1bmFsaWduZWQgaXZlYworCW1vdgkJMHhmZiwgJG9tYXNrCisJc3JsCQkkb21hc2ssICRpdm9mZiwgJG9tYXNrCisJZmFsaWduZGF0YQklZjAsICVmMCwgJWY0CisJZmFsaWduZGF0YQklZjAsICVmMiwgJWY2CisJZmFsaWduZGF0YQklZjIsICVmMiwgJWY4CisJc3RkYQkJJWY0LCBbJGl2ZWMgKyAkb21hc2tdMHhjMAorCXN0ZAkJJWY2LCBbJGl2ZWMgKyA4XQorCWFkZAkJJGl2ZWMsIDE2LCAkaXZlYworCW9ybgkJJWcwLCAkb21hc2ssICRvbWFzaworCXN0ZGEJCSVmOCwgWyRpdmVjICsgJG9tYXNrXTB4YzAKK19fXworJDo6Y29kZS49PDxfX187CisJcmV0CisJcmVzdG9yZQorCishISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisuYWxpZ24JMzIKKy5MJHtiaXRzfWNiY19lbmNfYmxrOgorCWFkZAkkb3V0LCAkbGVuLCAkYmxrX2luaXQKKwlhbmQJJGJsa19pbml0LCA2MywgJGJsa19pbml0CSEgdGFpbAorCXN1YgkkbGVuLCAkYmxrX2luaXQsICRsZW4KKwlhZGQJJGJsa19pbml0LCAxNSwgJGJsa19pbml0CSEgcm91bmQgdXAgdG8gMTZuCisJc3JseAkkbGVuLCA0LCAkbGVuCisJc3JsCSRibGtfaW5pdCwgNCwgJGJsa19pbml0CisKKy5MJHtiaXRzfV9jYmNfZW5jX2Jsa19sb29wOgorCWxkeAkJWyRpbnAgKyAwXSwgJW8wCisJYnJ6LHB0CQkkaWxlZnQsIDVmCisJbGR4CQlbJGlucCArIDhdLCAlbzEKKworCWxkeAkJWyRpbnAgKyAxNl0sICVvMgorCXNsbHgJCSVvMCwgJGlsZWZ0LCAlbzAKKwlzcmx4CQklbzEsICRpcmlnaHQsICVnMQorCXNsbHgJCSVvMSwgJGlsZWZ0LCAlbzEKKwlvcgkJJWcxLCAlbzAsICVvMAorCXNybHgJCSVvMiwgJGlyaWdodCwgJW8yCisJb3IJCSVvMiwgJW8xLCAlbzEKKzU6CisJeG9yCQklZzQsICVvMCwgJW8wCQkhIF49IHJrWzBdCisJeG9yCQklZzUsICVvMSwgJW8xCisJbW92eHRvZAkJJW8wLCAlZjEyCisJbW92eHRvZAkJJW8xLCAlZjE0CisKKwlmeG9yCQklZjEyLCAlZjAsICVmMAkJISBePSBpdmVjCisJZnhvcgkJJWYxNCwgJWYyLCAlZjIKKwlwcmVmZXRjaAlbJGlucCArIDE2KzYzXSwgMjAKKwljYWxsCQlfJHthbGd9JHtiaXRzfV9lbmNyeXB0XzF4CisJYWRkCQkkaW5wLCAxNiwgJGlucAorCXN1YgkJJGxlbiwgMSwgJGxlbgorCQkKKwlzdGRhCQklZjAsIFskb3V0XTB4ZTIJCSEgQVNJX0JMS19JTklULCBUNC1zcGVjaWZpYworCWFkZAkJJG91dCwgOCwgJG91dAorCXN0ZGEJCSVmMiwgWyRvdXRdMHhlMgkJISBBU0lfQkxLX0lOSVQsIFQ0LXNwZWNpZmljCisJYnJueixwdAkJJGxlbiwgLkwke2JpdHN9X2NiY19lbmNfYmxrX2xvb3AKKwlhZGQJCSRvdXQsIDgsICRvdXQKKworCW1lbWJhcgkJI1N0b3JlTG9hZHwjU3RvcmVTdG9yZQorCWJybnoscHQJCSRibGtfaW5pdCwgLkwke2JpdHN9X2NiY19lbmNfbG9vcAorCW1vdgkJJGJsa19pbml0LCAkbGVuCitfX18KKyQ6OmNvZGUuPTw8X19fIGlmICgkOjpldnApOworCXN0CQklZjAsIFskaXZlYyArIDBdCisJc3QJCSVmMSwgWyRpdmVjICsgNF0KKwlzdAkJJWYyLCBbJGl2ZWMgKyA4XQorCXN0CQklZjMsIFskaXZlYyArIDEyXQorX19fCiskOjpjb2RlLj08PF9fXyBpZiAoISQ6OmV2cCk7CisJYnJueixwbgkJJGl2b2ZmLCAzYgorCW5vcAorCisJc3RkCQklZjAsIFskaXZlYyArIDBdCSEgd3JpdGUgb3V0IGl2ZWMKKwlzdGQJCSVmMiwgWyRpdmVjICsgOF0KK19fXworJDo6Y29kZS49PDxfX187CisJcmV0CisJcmVzdG9yZQorLnR5cGUJJHthbGd9JHtiaXRzfV90NF9jYmNfZW5jcnlwdCwjZnVuY3Rpb24KKy5zaXplCSR7YWxnfSR7Yml0c31fdDRfY2JjX2VuY3J5cHQsLi0ke2FsZ30ke2JpdHN9X3Q0X2NiY19lbmNyeXB0CitfX18KK30KKworc3ViIGFsZ19jYmNfZGVjcnlwdF9pbXBsZW1lbnQgeworbXkgKCRhbGcsJGJpdHMpID0gQF87CisKKyQ6OmNvZGUuPTw8X19fOworLmdsb2JsCSR7YWxnfSR7Yml0c31fdDRfY2JjX2RlY3J5cHQKKy5hbGlnbgkzMgorJHthbGd9JHtiaXRzfV90NF9jYmNfZGVjcnlwdDoKKwlzYXZlCQklc3AsIC0kOjpmcmFtZSwgJXNwCisJc3ViCQkkaW5wLCAkb3V0LCAkYmxrX2luaXQJISAkaW5wIT0kb3V0CitfX18KKyQ6OmNvZGUuPTw8X19fIGlmICghJDo6ZXZwKTsKKwlhbmRjYwkJJGl2ZWMsIDcsICRpdm9mZgorCWFsaWduYWRkcgkkaXZlYywgJWcwLCAkaXZlYworCisJbGRkCQlbJGl2ZWMgKyAwXSwgJWYxMgkhIGxvYWQgaXZlYworCWJ6LHB0CQklaWNjLCAxZgorCWxkZAkJWyRpdmVjICsgOF0sICVmMTQKKwlsZGQJCVskaXZlYyArIDE2XSwgJWYwCisJZmFsaWduZGF0YQklZjEyLCAlZjE0LCAlZjEyCisJZmFsaWduZGF0YQklZjE0LCAlZjAsICVmMTQKKzE6CitfX18KKyQ6OmNvZGUuPTw8X19fIGlmICgkOjpldnApOworCWxkCQlbJGl2ZWMgKyAwXSwgJWYxMgkhIGxvYWQgaXZlYworCWxkCQlbJGl2ZWMgKyA0XSwgJWYxMworCWxkCQlbJGl2ZWMgKyA4XSwgJWYxNAorCWxkCQlbJGl2ZWMgKyAxMl0sICVmMTUKK19fXworJDo6Y29kZS49PDxfX187CisJcHJlZmV0Y2gJWyRpbnBdLCAyMAorCXByZWZldGNoCVskaW5wICsgNjNdLCAyMAorCWNhbGwJCV8ke2FsZ30ke2JpdHN9X2xvYWRfZGVja2V5CisJYW5kCQkkaW5wLCA3LCAkaWxlZnQKKwlhbmRuCQkkaW5wLCA3LCAkaW5wCisJc2xsCQkkaWxlZnQsIDMsICRpbGVmdAorCW1vdgkJNjQsICRpcmlnaHQKKwltb3YJCTB4ZmYsICRvbWFzaworCXN1YgkJJGlyaWdodCwgJGlsZWZ0LCAkaXJpZ2h0CisJYW5kCQkkb3V0LCA3LCAkb29mZgorCWNtcAkJJGxlbiwgMjU1CisJbW92cm56CQkkb29mZiwgMCwgJGJsa19pbml0CQkhIGlmICgJJG91dCY3IHx8CisJbW92bGV1CQkkOjpzaXplX3RfY2MsIDAsICRibGtfaW5pdAkhCSRsZW48MjU2IHx8CisJYnJueixwbgkJJGJsa19pbml0LCAuTCR7Yml0c31jYmNfZGVjX2JsawkhCSRpbnA9PSRvdXQpCisJc3JsCQkkb21hc2ssICRvb2ZmLCAkb21hc2sKKworCWFuZGNjCQkkbGVuLCAxNiwgJWcwCQkhIGlzIG51bWJlciBvZiBibG9ja3MgZXZlbj8KKwlzcmx4CQkkbGVuLCA0LCAkbGVuCisJYWxpZ25hZGRybAkkb3V0LCAlZzAsICRvdXQKKwliegkJJWljYywgLkwke2JpdHN9X2NiY19kZWNfbG9vcDJ4CisJcHJlZmV0Y2gJWyRvdXRdLCAyMgorLkwke2JpdHN9X2NiY19kZWNfbG9vcDoKKwlsZHgJCVskaW5wICsgMF0sICVvMAorCWJyeixwdAkJJGlsZWZ0LCA0ZgorCWxkeAkJWyRpbnAgKyA4XSwgJW8xCisKKwlsZHgJCVskaW5wICsgMTZdLCAlbzIKKwlzbGx4CQklbzAsICRpbGVmdCwgJW8wCisJc3JseAkJJW8xLCAkaXJpZ2h0LCAlZzEKKwlzbGx4CQklbzEsICRpbGVmdCwgJW8xCisJb3IJCSVnMSwgJW8wLCAlbzAKKwlzcmx4CQklbzIsICRpcmlnaHQsICVvMgorCW9yCQklbzIsICVvMSwgJW8xCis0OgorCXhvcgkJJWc0LCAlbzAsICVvMgkJISBePSBya1swXQorCXhvcgkJJWc1LCAlbzEsICVvMworCW1vdnh0b2QJCSVvMiwgJWYwCisJbW92eHRvZAkJJW8zLCAlZjIKKworCXByZWZldGNoCVskb3V0ICsgNjNdLCAyMgorCXByZWZldGNoCVskaW5wICsgMTYrNjNdLCAyMAorCWNhbGwJCV8ke2FsZ30ke2JpdHN9X2RlY3J5cHRfMXgKKwlhZGQJCSRpbnAsIDE2LCAkaW5wCisKKwlmeG9yCQklZjEyLCAlZjAsICVmMAkJISBePSBpdmVjCisJZnhvcgkJJWYxNCwgJWYyLCAlZjIKKwltb3Z4dG9kCQklbzAsICVmMTIKKwltb3Z4dG9kCQklbzEsICVmMTQKKworCWJybnoscG4JCSRvb2ZmLCAyZgorCXN1YgkJJGxlbiwgMSwgJGxlbgorCQkKKwlzdGQJCSVmMCwgWyRvdXQgKyAwXQorCXN0ZAkJJWYyLCBbJG91dCArIDhdCisJYnJueixwdAkJJGxlbiwgLkwke2JpdHN9X2NiY19kZWNfbG9vcDJ4CisJYWRkCQkkb3V0LCAxNiwgJG91dAorX19fCiskOjpjb2RlLj08PF9fXyBpZiAoJDo6ZXZwKTsKKwlzdAkJJWYxMiwgWyRpdmVjICsgMF0KKwlzdAkJJWYxMywgWyRpdmVjICsgNF0KKwlzdAkJJWYxNCwgWyRpdmVjICsgOF0KKwlzdAkJJWYxNSwgWyRpdmVjICsgMTJdCitfX18KKyQ6OmNvZGUuPTw8X19fIGlmICghJDo6ZXZwKTsKKwlicm56LHBuCQkkaXZvZmYsIC5MJHtiaXRzfV9jYmNfZGVjX3VuYWxpZ25lZF9pdmVjCisJbm9wCisKKwlzdGQJCSVmMTIsIFskaXZlYyArIDBdCSEgd3JpdGUgb3V0IGl2ZWMKKwlzdGQJCSVmMTQsIFskaXZlYyArIDhdCitfX18KKyQ6OmNvZGUuPTw8X19fOworCXJldAorCXJlc3RvcmUKKworLmFsaWduCTE2CisyOglsZHhhCQlbJGlucF0weDgyLCAlbzAJCSEgYXZvaWQgcmVhZC1hZnRlci13cml0ZSBoYXphcmQKKwkJCQkJCSEgYW5kIH4zeCBkZXRlcmlvcmF0aW9uCisJCQkJCQkhIGluIGlucD09b3V0IGNhc2UKKwlmYWxpZ25kYXRhCSVmMCwgJWYwLCAlZjQJCSEgaGFuZGxlIHVuYWxpZ25lZCBvdXRwdXQKKwlmYWxpZ25kYXRhCSVmMCwgJWYyLCAlZjYKKwlmYWxpZ25kYXRhCSVmMiwgJWYyLCAlZjgKKworCXN0ZGEJCSVmNCwgWyRvdXQgKyAkb21hc2tdMHhjMAkhIHBhcnRpYWwgc3RvcmUKKwlzdGQJCSVmNiwgWyRvdXQgKyA4XQorCWFkZAkJJG91dCwgMTYsICRvdXQKKwlvcm4JCSVnMCwgJG9tYXNrLCAkb21hc2sKKwlzdGRhCQklZjgsIFskb3V0ICsgJG9tYXNrXTB4YzAJISBwYXJ0aWFsIHN0b3JlCisKKwlicm56LHB0CQkkbGVuLCAuTCR7Yml0c31fY2JjX2RlY19sb29wMngrNAorCW9ybgkJJWcwLCAkb21hc2ssICRvbWFzaworX19fCiskOjpjb2RlLj08PF9fXyBpZiAoJDo6ZXZwKTsKKwlzdAkJJWYxMiwgWyRpdmVjICsgMF0KKwlzdAkJJWYxMywgWyRpdmVjICsgNF0KKwlzdAkJJWYxNCwgWyRpdmVjICsgOF0KKwlzdAkJJWYxNSwgWyRpdmVjICsgMTJdCitfX18KKyQ6OmNvZGUuPTw8X19fIGlmICghJDo6ZXZwKTsKKwlicm56LHBuCQkkaXZvZmYsIC5MJHtiaXRzfV9jYmNfZGVjX3VuYWxpZ25lZF9pdmVjCisJbm9wCisKKwlzdGQJCSVmMTIsIFskaXZlYyArIDBdCSEgd3JpdGUgb3V0IGl2ZWMKKwlzdGQJCSVmMTQsIFskaXZlYyArIDhdCitfX18KKyQ6OmNvZGUuPTw8X19fOworCXJldAorCXJlc3RvcmUKKworISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorLmFsaWduCTMyCisuTCR7Yml0c31fY2JjX2RlY19sb29wMng6CisJbGR4CQlbJGlucCArIDBdLCAlbzAKKwlsZHgJCVskaW5wICsgOF0sICVvMQorCWxkeAkJWyRpbnAgKyAxNl0sICVvMgorCWJyeixwdAkJJGlsZWZ0LCA0ZgorCWxkeAkJWyRpbnAgKyAyNF0sICVvMworCisJbGR4CQlbJGlucCArIDMyXSwgJW80CisJc2xseAkJJW8wLCAkaWxlZnQsICVvMAorCXNybHgJCSVvMSwgJGlyaWdodCwgJWcxCisJb3IJCSVnMSwgJW8wLCAlbzAKKwlzbGx4CQklbzEsICRpbGVmdCwgJW8xCisJc3JseAkJJW8yLCAkaXJpZ2h0LCAlZzEKKwlvcgkJJWcxLCAlbzEsICVvMQorCXNsbHgJCSVvMiwgJGlsZWZ0LCAlbzIKKwlzcmx4CQklbzMsICRpcmlnaHQsICVnMQorCW9yCQklZzEsICVvMiwgJW8yCisJc2xseAkJJW8zLCAkaWxlZnQsICVvMworCXNybHgJCSVvNCwgJGlyaWdodCwgJW80CisJb3IJCSVvNCwgJW8zLCAlbzMKKzQ6CisJeG9yCQklZzQsICVvMCwgJW80CQkhIF49IHJrWzBdCisJeG9yCQklZzUsICVvMSwgJW81CisJbW92eHRvZAkJJW80LCAlZjAKKwltb3Z4dG9kCQklbzUsICVmMgorCXhvcgkJJWc0LCAlbzIsICVvNAorCXhvcgkJJWc1LCAlbzMsICVvNQorCW1vdnh0b2QJCSVvNCwgJWY0CisJbW92eHRvZAkJJW81LCAlZjYKKworCXByZWZldGNoCVskb3V0ICsgNjNdLCAyMgorCXByZWZldGNoCVskaW5wICsgMzIrNjNdLCAyMAorCWNhbGwJCV8ke2FsZ30ke2JpdHN9X2RlY3J5cHRfMngKKwlhZGQJCSRpbnAsIDMyLCAkaW5wCisKKwltb3Z4dG9kCQklbzAsICVmOAorCW1vdnh0b2QJCSVvMSwgJWYxMAorCWZ4b3IJCSVmMTIsICVmMCwgJWYwCQkhIF49IGl2ZWMKKwlmeG9yCQklZjE0LCAlZjIsICVmMgorCW1vdnh0b2QJCSVvMiwgJWYxMgorCW1vdnh0b2QJCSVvMywgJWYxNAorCWZ4b3IJCSVmOCwgJWY0LCAlZjQKKwlmeG9yCQklZjEwLCAlZjYsICVmNgorCisJYnJueixwbgkJJG9vZmYsIDJmCisJc3ViCQkkbGVuLCAyLCAkbGVuCisJCQorCXN0ZAkJJWYwLCBbJG91dCArIDBdCisJc3RkCQklZjIsIFskb3V0ICsgOF0KKwlzdGQJCSVmNCwgWyRvdXQgKyAxNl0KKwlzdGQJCSVmNiwgWyRvdXQgKyAyNF0KKwlicm56LHB0CQkkbGVuLCAuTCR7Yml0c31fY2JjX2RlY19sb29wMngKKwlhZGQJCSRvdXQsIDMyLCAkb3V0CitfX18KKyQ6OmNvZGUuPTw8X19fIGlmICgkOjpldnApOworCXN0CQklZjEyLCBbJGl2ZWMgKyAwXQorCXN0CQklZjEzLCBbJGl2ZWMgKyA0XQorCXN0CQklZjE0LCBbJGl2ZWMgKyA4XQorCXN0CQklZjE1LCBbJGl2ZWMgKyAxMl0KK19fXworJDo6Y29kZS49PDxfX18gaWYgKCEkOjpldnApOworCWJybnoscG4JCSRpdm9mZiwgLkwke2JpdHN9X2NiY19kZWNfdW5hbGlnbmVkX2l2ZWMKKwlub3AKKworCXN0ZAkJJWYxMiwgWyRpdmVjICsgMF0JISB3cml0ZSBvdXQgaXZlYworCXN0ZAkJJWYxNCwgWyRpdmVjICsgOF0KK19fXworJDo6Y29kZS49PDxfX187CisJcmV0CisJcmVzdG9yZQorCisuYWxpZ24JMTYKKzI6CWxkeGEJCVskaW5wXTB4ODIsICVvMAkJISBhdm9pZCByZWFkLWFmdGVyLXdyaXRlIGhhemFyZAorCQkJCQkJISBhbmQgfjN4IGRldGVyaW9yYXRpb24KKwkJCQkJCSEgaW4gaW5wPT1vdXQgY2FzZQorCWZhbGlnbmRhdGEJJWYwLCAlZjAsICVmOAkJISBoYW5kbGUgdW5hbGlnbmVkIG91dHB1dAorCWZhbGlnbmRhdGEJJWYwLCAlZjIsICVmMAorCWZhbGlnbmRhdGEJJWYyLCAlZjQsICVmMgorCWZhbGlnbmRhdGEJJWY0LCAlZjYsICVmNAorCWZhbGlnbmRhdGEJJWY2LCAlZjYsICVmNgorCXN0ZGEJCSVmOCwgWyRvdXQgKyAkb21hc2tdMHhjMAkhIHBhcnRpYWwgc3RvcmUKKwlzdGQJCSVmMCwgWyRvdXQgKyA4XQorCXN0ZAkJJWYyLCBbJG91dCArIDE2XQorCXN0ZAkJJWY0LCBbJG91dCArIDI0XQorCWFkZAkJJG91dCwgMzIsICRvdXQKKwlvcm4JCSVnMCwgJG9tYXNrLCAkb21hc2sKKwlzdGRhCQklZjYsIFskb3V0ICsgJG9tYXNrXTB4YzAJISBwYXJ0aWFsIHN0b3JlCisKKwlicm56LHB0CQkkbGVuLCAuTCR7Yml0c31fY2JjX2RlY19sb29wMngrNAorCW9ybgkJJWcwLCAkb21hc2ssICRvbWFzaworX19fCiskOjpjb2RlLj08PF9fXyBpZiAoJDo6ZXZwKTsKKwlzdAkJJWYxMiwgWyRpdmVjICsgMF0KKwlzdAkJJWYxMywgWyRpdmVjICsgNF0KKwlzdAkJJWYxNCwgWyRpdmVjICsgOF0KKwlzdAkJJWYxNSwgWyRpdmVjICsgMTJdCitfX18KKyQ6OmNvZGUuPTw8X19fIGlmICghJDo6ZXZwKTsKKwlicm56LHBuCQkkaXZvZmYsIC5MJHtiaXRzfV9jYmNfZGVjX3VuYWxpZ25lZF9pdmVjCisJbm9wCisKKwlzdGQJCSVmMTIsIFskaXZlYyArIDBdCSEgd3JpdGUgb3V0IGl2ZWMKKwlzdGQJCSVmMTQsIFskaXZlYyArIDhdCisJcmV0CisJcmVzdG9yZQorCisuYWxpZ24JMTYKKy5MJHtiaXRzfV9jYmNfZGVjX3VuYWxpZ25lZF9pdmVjOgorCWFsaWduYWRkcmwJJGl2ZWMsICRpdm9mZiwgJWcwCSEgaGFuZGxlIHVuYWxpZ25lZCBpdmVjCisJbW92CQkweGZmLCAkb21hc2sKKwlzcmwJCSRvbWFzaywgJGl2b2ZmLCAkb21hc2sKKwlmYWxpZ25kYXRhCSVmMTIsICVmMTIsICVmMAorCWZhbGlnbmRhdGEJJWYxMiwgJWYxNCwgJWYyCisJZmFsaWduZGF0YQklZjE0LCAlZjE0LCAlZjQKKwlzdGRhCQklZjAsIFskaXZlYyArICRvbWFza10weGMwCisJc3RkCQklZjIsIFskaXZlYyArIDhdCisJYWRkCQkkaXZlYywgMTYsICRpdmVjCisJb3JuCQklZzAsICRvbWFzaywgJG9tYXNrCisJc3RkYQkJJWY0LCBbJGl2ZWMgKyAkb21hc2tdMHhjMAorX19fCiskOjpjb2RlLj08PF9fXzsKKwlyZXQKKwlyZXN0b3JlCisKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKy5hbGlnbgkzMgorLkwke2JpdHN9Y2JjX2RlY19ibGs6CisJYWRkCSRvdXQsICRsZW4sICRibGtfaW5pdAorCWFuZAkkYmxrX2luaXQsIDYzLCAkYmxrX2luaXQJISB0YWlsCisJc3ViCSRsZW4sICRibGtfaW5pdCwgJGxlbgorCWFkZAkkYmxrX2luaXQsIDE1LCAkYmxrX2luaXQJISByb3VuZCB1cCB0byAxNm4KKwlzcmx4CSRsZW4sIDQsICRsZW4KKwlzcmwJJGJsa19pbml0LCA0LCAkYmxrX2luaXQKKwlzdWIJJGxlbiwgMSwgJGxlbgorCWFkZAkkYmxrX2luaXQsIDEsICRibGtfaW5pdAorCisuTCR7Yml0c31fY2JjX2RlY19ibGtfbG9vcDJ4OgorCWxkeAkJWyRpbnAgKyAwXSwgJW8wCisJbGR4CQlbJGlucCArIDhdLCAlbzEKKwlsZHgJCVskaW5wICsgMTZdLCAlbzIKKwlicnoscHQJCSRpbGVmdCwgNWYKKwlsZHgJCVskaW5wICsgMjRdLCAlbzMKKworCWxkeAkJWyRpbnAgKyAzMl0sICVvNAorCXNsbHgJCSVvMCwgJGlsZWZ0LCAlbzAKKwlzcmx4CQklbzEsICRpcmlnaHQsICVnMQorCW9yCQklZzEsICVvMCwgJW8wCisJc2xseAkJJW8xLCAkaWxlZnQsICVvMQorCXNybHgJCSVvMiwgJGlyaWdodCwgJWcxCisJb3IJCSVnMSwgJW8xLCAlbzEKKwlzbGx4CQklbzIsICRpbGVmdCwgJW8yCisJc3JseAkJJW8zLCAkaXJpZ2h0LCAlZzEKKwlvcgkJJWcxLCAlbzIsICVvMgorCXNsbHgJCSVvMywgJGlsZWZ0LCAlbzMKKwlzcmx4CQklbzQsICRpcmlnaHQsICVvNAorCW9yCQklbzQsICVvMywgJW8zCis1OgorCXhvcgkJJWc0LCAlbzAsICVvNAkJISBePSBya1swXQorCXhvcgkJJWc1LCAlbzEsICVvNQorCW1vdnh0b2QJCSVvNCwgJWYwCisJbW92eHRvZAkJJW81LCAlZjIKKwl4b3IJCSVnNCwgJW8yLCAlbzQKKwl4b3IJCSVnNSwgJW8zLCAlbzUKKwltb3Z4dG9kCQklbzQsICVmNAorCW1vdnh0b2QJCSVvNSwgJWY2CisKKwlwcmVmZXRjaAlbJGlucCArIDMyKzYzXSwgMjAKKwljYWxsCQlfJHthbGd9JHtiaXRzfV9kZWNyeXB0XzJ4CisJYWRkCQkkaW5wLCAzMiwgJGlucAorCXN1YmNjCQkkbGVuLCAyLCAkbGVuCisKKwltb3Z4dG9kCQklbzAsICVmOAorCW1vdnh0b2QJCSVvMSwgJWYxMAorCWZ4b3IJCSVmMTIsICVmMCwgJWYwCQkhIF49IGl2ZWMKKwlmeG9yCQklZjE0LCAlZjIsICVmMgorCW1vdnh0b2QJCSVvMiwgJWYxMgorCW1vdnh0b2QJCSVvMywgJWYxNAorCWZ4b3IJCSVmOCwgJWY0LCAlZjQKKwlmeG9yCQklZjEwLCAlZjYsICVmNgorCisJc3RkYQkJJWYwLCBbJG91dF0weGUyCQkhIEFTSV9CTEtfSU5JVCwgVDQtc3BlY2lmaWMKKwlhZGQJCSRvdXQsIDgsICRvdXQKKwlzdGRhCQklZjIsIFskb3V0XTB4ZTIJCSEgQVNJX0JMS19JTklULCBUNC1zcGVjaWZpYworCWFkZAkJJG91dCwgOCwgJG91dAorCXN0ZGEJCSVmNCwgWyRvdXRdMHhlMgkJISBBU0lfQkxLX0lOSVQsIFQ0LXNwZWNpZmljCisJYWRkCQkkb3V0LCA4LCAkb3V0CisJc3RkYQkJJWY2LCBbJG91dF0weGUyCQkhIEFTSV9CTEtfSU5JVCwgVDQtc3BlY2lmaWMKKwliZ3UscHQJCSQ6OnNpemVfdF9jYywgLkwke2JpdHN9X2NiY19kZWNfYmxrX2xvb3AyeAorCWFkZAkJJG91dCwgOCwgJG91dAorCisJYWRkCQkkYmxrX2luaXQsICRsZW4sICRsZW4KKwlhbmRjYwkJJGxlbiwgMSwgJWcwCQkhIGlzIG51bWJlciBvZiBibG9ja3MgZXZlbj8KKwltZW1iYXIJCSNTdG9yZUxvYWR8I1N0b3JlU3RvcmUKKwlibnoscHQJCSVpY2MsIC5MJHtiaXRzfV9jYmNfZGVjX2xvb3AKKwlzcmwJCSRsZW4sIDAsICRsZW4KKwlicm56LHBuCQkkbGVuLCAuTCR7Yml0c31fY2JjX2RlY19sb29wMngKKwlub3AKK19fXworJDo6Y29kZS49PDxfX18gaWYgKCQ6OmV2cCk7CisJc3QJCSVmMTIsIFskaXZlYyArIDBdCSEgd3JpdGUgb3V0IGl2ZWMKKwlzdAkJJWYxMywgWyRpdmVjICsgNF0KKwlzdAkJJWYxNCwgWyRpdmVjICsgOF0KKwlzdAkJJWYxNSwgWyRpdmVjICsgMTJdCitfX18KKyQ6OmNvZGUuPTw8X19fIGlmICghJDo6ZXZwKTsKKwlicm56LHBuCQkkaXZvZmYsIDNiCisJbm9wCisKKwlzdGQJCSVmMTIsIFskaXZlYyArIDBdCSEgd3JpdGUgb3V0IGl2ZWMKKwlzdGQJCSVmMTQsIFskaXZlYyArIDhdCitfX18KKyQ6OmNvZGUuPTw8X19fOworCXJldAorCXJlc3RvcmUKKy50eXBlCSR7YWxnfSR7Yml0c31fdDRfY2JjX2RlY3J5cHQsI2Z1bmN0aW9uCisuc2l6ZQkke2FsZ30ke2JpdHN9X3Q0X2NiY19kZWNyeXB0LC4tJHthbGd9JHtiaXRzfV90NF9jYmNfZGVjcnlwdAorX19fCit9CisKK3N1YiBhbGdfY3RyMzJfaW1wbGVtZW50IHsKK215ICgkYWxnLCRiaXRzKSA9IEBfOworCiskOjpjb2RlLj08PF9fXzsKKy5nbG9ibAkke2FsZ30ke2JpdHN9X3Q0X2N0cjMyX2VuY3J5cHQKKy5hbGlnbgkzMgorJHthbGd9JHtiaXRzfV90NF9jdHIzMl9lbmNyeXB0OgorCXNhdmUJCSVzcCwgLSQ6OmZyYW1lLCAlc3AKKworCXByZWZldGNoCVskaW5wXSwgMjAKKwlwcmVmZXRjaAlbJGlucCArIDYzXSwgMjAKKwljYWxsCQlfJHthbGd9JHtiaXRzfV9sb2FkX2VuY2tleQorCXNsbHgJCSRsZW4sIDQsICRsZW4KKworCWxkCQlbJGl2ZWMgKyAwXSwgJWw0CSEgY291bnRlcgorCWxkCQlbJGl2ZWMgKyA0XSwgJWw1CisJbGQJCVskaXZlYyArIDhdLCAlbDYKKwlsZAkJWyRpdmVjICsgMTJdLCAlbDcKKworCXNsbHgJCSVsNCwgMzIsICVvNQorCW9yCQklbDUsICVvNSwgJW81CisJc2xseAkJJWw2LCAzMiwgJWcxCisJeG9yCQklbzUsICVnNCwgJWc0CQkhIF49IHJrWzBdCisJeG9yCQklZzEsICVnNSwgJWc1CisJbW92eHRvZAkJJWc0LCAlZjE0CQkhIG1vc3Qgc2lnbmlmaWNhbnQgNjQgYml0cworCisJc3ViCQkkaW5wLCAkb3V0LCAkYmxrX2luaXQJISAkaW5wIT0kb3V0CisJYW5kCQkkaW5wLCA3LCAkaWxlZnQKKwlhbmRuCQkkaW5wLCA3LCAkaW5wCisJc2xsCQkkaWxlZnQsIDMsICRpbGVmdAorCW1vdgkJNjQsICRpcmlnaHQKKwltb3YJCTB4ZmYsICRvbWFzaworCXN1YgkJJGlyaWdodCwgJGlsZWZ0LCAkaXJpZ2h0CisJYW5kCQkkb3V0LCA3LCAkb29mZgorCWNtcAkJJGxlbiwgMjU1CisJbW92cm56CQkkb29mZiwgMCwgJGJsa19pbml0CQkhIGlmICgJJG91dCY3IHx8CisJbW92bGV1CQkkOjpzaXplX3RfY2MsIDAsICRibGtfaW5pdAkhCSRsZW48MjU2IHx8CisJYnJueixwbgkJJGJsa19pbml0LCAuTCR7Yml0c31fY3RyMzJfYmxrCSEJJGlucD09JG91dCkKKwlzcmwJCSRvbWFzaywgJG9vZmYsICRvbWFzaworCisJYW5kY2MJCSRsZW4sIDE2LCAlZzAJCSEgaXMgbnVtYmVyIG9mIGJsb2NrcyBldmVuPworCWFsaWduYWRkcmwJJG91dCwgJWcwLCAkb3V0CisJYnoJCSVpY2MsIC5MJHtiaXRzfV9jdHIzMl9sb29wMngKKwlzcmx4CQkkbGVuLCA0LCAkbGVuCisuTCR7Yml0c31fY3RyMzJfbG9vcDoKKwlsZHgJCVskaW5wICsgMF0sICVvMAorCWJyeixwdAkJJGlsZWZ0LCA0ZgorCWxkeAkJWyRpbnAgKyA4XSwgJW8xCisKKwlsZHgJCVskaW5wICsgMTZdLCAlbzIKKwlzbGx4CQklbzAsICRpbGVmdCwgJW8wCisJc3JseAkJJW8xLCAkaXJpZ2h0LCAlZzEKKwlzbGx4CQklbzEsICRpbGVmdCwgJW8xCisJb3IJCSVnMSwgJW8wLCAlbzAKKwlzcmx4CQklbzIsICRpcmlnaHQsICVvMgorCW9yCQklbzIsICVvMSwgJW8xCis0OgorCXhvcgkJJWc1LCAlbDcsICVnMQkJISBePSBya1swXQorCWFkZAkJJWw3LCAxLCAlbDcKKwltb3Z4dG9kCQklZzEsICVmMgorCXNybAkJJWw3LCAwLCAlbDcJCSEgY2xydXcKKwlwcmVmZXRjaAlbJG91dCArIDYzXSwgMjIKKwlwcmVmZXRjaAlbJGlucCArIDE2KzYzXSwgMjAKK19fXworJDo6Y29kZS49PDxfX18gaWYgKCRhbGcgZXEgImFlcyIpOworCWFlc19lcm91bmQwMQklZjE2LCAlZjE0LCAlZjIsICVmNAorCWFlc19lcm91bmQyMwklZjE4LCAlZjE0LCAlZjIsICVmMgorX19fCiskOjpjb2RlLj08PF9fXyBpZiAoJGFsZyBlcSAiY21sbCIpOworCWNhbWVsbGlhX2YJJWYxNiwgJWYyLCAlZjE0LCAlZjIKKwljYW1lbGxpYV9mCSVmMTgsICVmMTQsICVmMiwgJWYwCitfX18KKyQ6OmNvZGUuPTw8X19fOworCWNhbGwJCV8ke2FsZ30ke2JpdHN9X2VuY3J5cHRfMXgrOAorCWFkZAkJJGlucCwgMTYsICRpbnAKKworCW1vdnh0b2QJCSVvMCwgJWYxMAorCW1vdnh0b2QJCSVvMSwgJWYxMgorCWZ4b3IJCSVmMTAsICVmMCwgJWYwCQkhIF49IGlucAorCWZ4b3IJCSVmMTIsICVmMiwgJWYyCisKKwlicm56LHBuCQkkb29mZiwgMmYKKwlzdWIJCSRsZW4sIDEsICRsZW4KKwkJCisJc3RkCQklZjAsIFskb3V0ICsgMF0KKwlzdGQJCSVmMiwgWyRvdXQgKyA4XQorCWJybnoscHQJCSRsZW4sIC5MJHtiaXRzfV9jdHIzMl9sb29wMngKKwlhZGQJCSRvdXQsIDE2LCAkb3V0CisKKwlyZXQKKwlyZXN0b3JlCisKKy5hbGlnbgkxNgorMjoJbGR4YQkJWyRpbnBdMHg4MiwgJW8wCQkhIGF2b2lkIHJlYWQtYWZ0ZXItd3JpdGUgaGF6YXJkCisJCQkJCQkhIGFuZCB+M3ggZGV0ZXJpb3JhdGlvbgorCQkJCQkJISBpbiBpbnA9PW91dCBjYXNlCisJZmFsaWduZGF0YQklZjAsICVmMCwgJWY0CQkhIGhhbmRsZSB1bmFsaWduZWQgb3V0cHV0CisJZmFsaWduZGF0YQklZjAsICVmMiwgJWY2CisJZmFsaWduZGF0YQklZjIsICVmMiwgJWY4CisJc3RkYQkJJWY0LCBbJG91dCArICRvbWFza10weGMwCSEgcGFydGlhbCBzdG9yZQorCXN0ZAkJJWY2LCBbJG91dCArIDhdCisJYWRkCQkkb3V0LCAxNiwgJG91dAorCW9ybgkJJWcwLCAkb21hc2ssICRvbWFzaworCXN0ZGEJCSVmOCwgWyRvdXQgKyAkb21hc2tdMHhjMAkhIHBhcnRpYWwgc3RvcmUKKworCWJybnoscHQJCSRsZW4sIC5MJHtiaXRzfV9jdHIzMl9sb29wMngrNAorCW9ybgkJJWcwLCAkb21hc2ssICRvbWFzaworCisJcmV0CisJcmVzdG9yZQorCishISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisuYWxpZ24JMzIKKy5MJHtiaXRzfV9jdHIzMl9sb29wMng6CisJbGR4CQlbJGlucCArIDBdLCAlbzAKKwlsZHgJCVskaW5wICsgOF0sICVvMQorCWxkeAkJWyRpbnAgKyAxNl0sICVvMgorCWJyeixwdAkJJGlsZWZ0LCA0ZgorCWxkeAkJWyRpbnAgKyAyNF0sICVvMworCisJbGR4CQlbJGlucCArIDMyXSwgJW80CisJc2xseAkJJW8wLCAkaWxlZnQsICVvMAorCXNybHgJCSVvMSwgJGlyaWdodCwgJWcxCisJb3IJCSVnMSwgJW8wLCAlbzAKKwlzbGx4CQklbzEsICRpbGVmdCwgJW8xCisJc3JseAkJJW8yLCAkaXJpZ2h0LCAlZzEKKwlvcgkJJWcxLCAlbzEsICVvMQorCXNsbHgJCSVvMiwgJGlsZWZ0LCAlbzIKKwlzcmx4CQklbzMsICRpcmlnaHQsICVnMQorCW9yCQklZzEsICVvMiwgJW8yCisJc2xseAkJJW8zLCAkaWxlZnQsICVvMworCXNybHgJCSVvNCwgJGlyaWdodCwgJW80CisJb3IJCSVvNCwgJW8zLCAlbzMKKzQ6CisJeG9yCQklZzUsICVsNywgJWcxCQkhIF49IHJrWzBdCisJYWRkCQklbDcsIDEsICVsNworCW1vdnh0b2QJCSVnMSwgJWYyCisJc3JsCQklbDcsIDAsICVsNwkJISBjbHJ1dworCXhvcgkJJWc1LCAlbDcsICVnMQorCWFkZAkJJWw3LCAxLCAlbDcKKwltb3Z4dG9kCQklZzEsICVmNgorCXNybAkJJWw3LCAwLCAlbDcJCSEgY2xydXcKKwlwcmVmZXRjaAlbJG91dCArIDYzXSwgMjIKKwlwcmVmZXRjaAlbJGlucCArIDMyKzYzXSwgMjAKK19fXworJDo6Y29kZS49PDxfX18gaWYgKCRhbGcgZXEgImFlcyIpOworCWFlc19lcm91bmQwMQklZjE2LCAlZjE0LCAlZjIsICVmOAorCWFlc19lcm91bmQyMwklZjE4LCAlZjE0LCAlZjIsICVmMgorCWFlc19lcm91bmQwMQklZjE2LCAlZjE0LCAlZjYsICVmMTAKKwlhZXNfZXJvdW5kMjMJJWYxOCwgJWYxNCwgJWY2LCAlZjYKK19fXworJDo6Y29kZS49PDxfX18gaWYgKCRhbGcgZXEgImNtbGwiKTsKKwljYW1lbGxpYV9mCSVmMTYsICVmMiwgJWYxNCwgJWYyCisJY2FtZWxsaWFfZgklZjE2LCAlZjYsICVmMTQsICVmNgorCWNhbWVsbGlhX2YJJWYxOCwgJWYxNCwgJWYyLCAlZjAKKwljYW1lbGxpYV9mCSVmMTgsICVmMTQsICVmNiwgJWY0CitfX18KKyQ6OmNvZGUuPTw8X19fOworCWNhbGwJCV8ke2FsZ30ke2JpdHN9X2VuY3J5cHRfMngrMTYKKwlhZGQJCSRpbnAsIDMyLCAkaW5wCisKKwltb3Z4dG9kCQklbzAsICVmOAorCW1vdnh0b2QJCSVvMSwgJWYxMAorCW1vdnh0b2QJCSVvMiwgJWYxMgorCWZ4b3IJCSVmOCwgJWYwLCAlZjAJCSEgXj0gaW5wCisJbW92eHRvZAkJJW8zLCAlZjgKKwlmeG9yCQklZjEwLCAlZjIsICVmMgorCWZ4b3IJCSVmMTIsICVmNCwgJWY0CisJZnhvcgkJJWY4LCAlZjYsICVmNgorCisJYnJueixwbgkJJG9vZmYsIDJmCisJc3ViCQkkbGVuLCAyLCAkbGVuCisJCQorCXN0ZAkJJWYwLCBbJG91dCArIDBdCisJc3RkCQklZjIsIFskb3V0ICsgOF0KKwlzdGQJCSVmNCwgWyRvdXQgKyAxNl0KKwlzdGQJCSVmNiwgWyRvdXQgKyAyNF0KKwlicm56LHB0CQkkbGVuLCAuTCR7Yml0c31fY3RyMzJfbG9vcDJ4CisJYWRkCQkkb3V0LCAzMiwgJG91dAorCisJcmV0CisJcmVzdG9yZQorCisuYWxpZ24JMTYKKzI6CWxkeGEJCVskaW5wXTB4ODIsICVvMAkJISBhdm9pZCByZWFkLWFmdGVyLXdyaXRlIGhhemFyZAorCQkJCQkJISBhbmQgfjN4IGRldGVyaW9yYXRpb24KKwkJCQkJCSEgaW4gaW5wPT1vdXQgY2FzZQorCWZhbGlnbmRhdGEJJWYwLCAlZjAsICVmOAkJISBoYW5kbGUgdW5hbGlnbmVkIG91dHB1dAorCWZhbGlnbmRhdGEJJWYwLCAlZjIsICVmMAorCWZhbGlnbmRhdGEJJWYyLCAlZjQsICVmMgorCWZhbGlnbmRhdGEJJWY0LCAlZjYsICVmNAorCWZhbGlnbmRhdGEJJWY2LCAlZjYsICVmNgorCisJc3RkYQkJJWY4LCBbJG91dCArICRvbWFza10weGMwCSEgcGFydGlhbCBzdG9yZQorCXN0ZAkJJWYwLCBbJG91dCArIDhdCisJc3RkCQklZjIsIFskb3V0ICsgMTZdCisJc3RkCQklZjQsIFskb3V0ICsgMjRdCisJYWRkCQkkb3V0LCAzMiwgJG91dAorCW9ybgkJJWcwLCAkb21hc2ssICRvbWFzaworCXN0ZGEJCSVmNiwgWyRvdXQgKyAkb21hc2tdMHhjMAkhIHBhcnRpYWwgc3RvcmUKKworCWJybnoscHQJCSRsZW4sIC5MJHtiaXRzfV9jdHIzMl9sb29wMngrNAorCW9ybgkJJWcwLCAkb21hc2ssICRvbWFzaworCisJcmV0CisJcmVzdG9yZQorCishISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisuYWxpZ24JMzIKKy5MJHtiaXRzfV9jdHIzMl9ibGs6CisJYWRkCSRvdXQsICRsZW4sICRibGtfaW5pdAorCWFuZAkkYmxrX2luaXQsIDYzLCAkYmxrX2luaXQJISB0YWlsCisJc3ViCSRsZW4sICRibGtfaW5pdCwgJGxlbgorCWFkZAkkYmxrX2luaXQsIDE1LCAkYmxrX2luaXQJISByb3VuZCB1cCB0byAxNm4KKwlzcmx4CSRsZW4sIDQsICRsZW4KKwlzcmwJJGJsa19pbml0LCA0LCAkYmxrX2luaXQKKwlzdWIJJGxlbiwgMSwgJGxlbgorCWFkZAkkYmxrX2luaXQsIDEsICRibGtfaW5pdAorCisuTCR7Yml0c31fY3RyMzJfYmxrX2xvb3AyeDoKKwlsZHgJCVskaW5wICsgMF0sICVvMAorCWxkeAkJWyRpbnAgKyA4XSwgJW8xCisJbGR4CQlbJGlucCArIDE2XSwgJW8yCisJYnJ6LHB0CQkkaWxlZnQsIDVmCisJbGR4CQlbJGlucCArIDI0XSwgJW8zCisKKwlsZHgJCVskaW5wICsgMzJdLCAlbzQKKwlzbGx4CQklbzAsICRpbGVmdCwgJW8wCisJc3JseAkJJW8xLCAkaXJpZ2h0LCAlZzEKKwlvcgkJJWcxLCAlbzAsICVvMAorCXNsbHgJCSVvMSwgJGlsZWZ0LCAlbzEKKwlzcmx4CQklbzIsICRpcmlnaHQsICVnMQorCW9yCQklZzEsICVvMSwgJW8xCisJc2xseAkJJW8yLCAkaWxlZnQsICVvMgorCXNybHgJCSVvMywgJGlyaWdodCwgJWcxCisJb3IJCSVnMSwgJW8yLCAlbzIKKwlzbGx4CQklbzMsICRpbGVmdCwgJW8zCisJc3JseAkJJW80LCAkaXJpZ2h0LCAlbzQKKwlvcgkJJW80LCAlbzMsICVvMworNToKKwl4b3IJCSVnNSwgJWw3LCAlZzEJCSEgXj0gcmtbMF0KKwlhZGQJCSVsNywgMSwgJWw3CisJbW92eHRvZAkJJWcxLCAlZjIKKwlzcmwJCSVsNywgMCwgJWw3CQkhIGNscnV3CisJeG9yCQklZzUsICVsNywgJWcxCisJYWRkCQklbDcsIDEsICVsNworCW1vdnh0b2QJCSVnMSwgJWY2CisJc3JsCQklbDcsIDAsICVsNwkJISBjbHJ1dworCXByZWZldGNoCVskaW5wICsgMzIrNjNdLCAyMAorX19fCiskOjpjb2RlLj08PF9fXyBpZiAoJGFsZyBlcSAiYWVzIik7CisJYWVzX2Vyb3VuZDAxCSVmMTYsICVmMTQsICVmMiwgJWY4CisJYWVzX2Vyb3VuZDIzCSVmMTgsICVmMTQsICVmMiwgJWYyCisJYWVzX2Vyb3VuZDAxCSVmMTYsICVmMTQsICVmNiwgJWYxMAorCWFlc19lcm91bmQyMwklZjE4LCAlZjE0LCAlZjYsICVmNgorX19fCiskOjpjb2RlLj08PF9fXyBpZiAoJGFsZyBlcSAiY21sbCIpOworCWNhbWVsbGlhX2YJJWYxNiwgJWYyLCAlZjE0LCAlZjIKKwljYW1lbGxpYV9mCSVmMTYsICVmNiwgJWYxNCwgJWY2CisJY2FtZWxsaWFfZgklZjE4LCAlZjE0LCAlZjIsICVmMAorCWNhbWVsbGlhX2YJJWYxOCwgJWYxNCwgJWY2LCAlZjQKK19fXworJDo6Y29kZS49PDxfX187CisJY2FsbAkJXyR7YWxnfSR7Yml0c31fZW5jcnlwdF8yeCsxNgorCWFkZAkJJGlucCwgMzIsICRpbnAKKwlzdWJjYwkJJGxlbiwgMiwgJGxlbgorCisJbW92eHRvZAkJJW8wLCAlZjgKKwltb3Z4dG9kCQklbzEsICVmMTAKKwltb3Z4dG9kCQklbzIsICVmMTIKKwlmeG9yCQklZjgsICVmMCwgJWYwCQkhIF49IGlucAorCW1vdnh0b2QJCSVvMywgJWY4CisJZnhvcgkJJWYxMCwgJWYyLCAlZjIKKwlmeG9yCQklZjEyLCAlZjQsICVmNAorCWZ4b3IJCSVmOCwgJWY2LCAlZjYKKworCXN0ZGEJCSVmMCwgWyRvdXRdMHhlMgkJISBBU0lfQkxLX0lOSVQsIFQ0LXNwZWNpZmljCisJYWRkCQkkb3V0LCA4LCAkb3V0CisJc3RkYQkJJWYyLCBbJG91dF0weGUyCQkhIEFTSV9CTEtfSU5JVCwgVDQtc3BlY2lmaWMKKwlhZGQJCSRvdXQsIDgsICRvdXQKKwlzdGRhCQklZjQsIFskb3V0XTB4ZTIJCSEgQVNJX0JMS19JTklULCBUNC1zcGVjaWZpYworCWFkZAkJJG91dCwgOCwgJG91dAorCXN0ZGEJCSVmNiwgWyRvdXRdMHhlMgkJISBBU0lfQkxLX0lOSVQsIFQ0LXNwZWNpZmljCisJYmd1LHB0CQkkOjpzaXplX3RfY2MsIC5MJHtiaXRzfV9jdHIzMl9ibGtfbG9vcDJ4CisJYWRkCQkkb3V0LCA4LCAkb3V0CisKKwlhZGQJCSRibGtfaW5pdCwgJGxlbiwgJGxlbgorCWFuZGNjCQkkbGVuLCAxLCAlZzAJCSEgaXMgbnVtYmVyIG9mIGJsb2NrcyBldmVuPworCW1lbWJhcgkJI1N0b3JlTG9hZHwjU3RvcmVTdG9yZQorCWJueixwdAkJJWljYywgLkwke2JpdHN9X2N0cjMyX2xvb3AKKwlzcmwJCSRsZW4sIDAsICRsZW4KKwlicm56LHBuCQkkbGVuLCAuTCR7Yml0c31fY3RyMzJfbG9vcDJ4CisJbm9wCisKKwlyZXQKKwlyZXN0b3JlCisudHlwZQkke2FsZ30ke2JpdHN9X3Q0X2N0cjMyX2VuY3J5cHQsI2Z1bmN0aW9uCisuc2l6ZQkke2FsZ30ke2JpdHN9X3Q0X2N0cjMyX2VuY3J5cHQsLi0ke2FsZ30ke2JpdHN9X3Q0X2N0cjMyX2VuY3J5cHQKK19fXworfQorCitzdWIgYWxnX3h0c19pbXBsZW1lbnQgeworbXkgKCRhbGcsJGJpdHMsJGRpcikgPSBAXzsKK215ICgkaW5wLCRvdXQsJGxlbiwka2V5MSwka2V5MiwkaXZlYyk9bWFwKCIlaSRfIiwoMC4uNSkpOworbXkgJHJlbT0kaXZlYzsKKworJDo6Y29kZS49PDxfX187CisuZ2xvYmwJJHthbGd9JHtiaXRzfV90NF94dHNfJHtkaXJ9Y3J5cHQKKy5hbGlnbgkzMgorJHthbGd9JHtiaXRzfV90NF94dHNfJHtkaXJ9Y3J5cHQ6CisJc2F2ZQkJJXNwLCAtJDo6ZnJhbWUtMTYsICVzcAorCisJbW92CQkkaXZlYywgJW8wCisJYWRkCQklZnAsICQ6OmJpYXMtMTYsICVvMQorCWNhbGwJCSR7YWxnfV90NF9lbmNyeXB0CisJbW92CQkka2V5MiwgJW8yCisKKwlhZGQJCSVmcCwgJDo6Ymlhcy0xNiwgJWw3CisJbGR4YQkJWyVsN10weDg4LCAlZzIKKwlhZGQJCSVmcCwgJDo6Ymlhcy04LCAlbDcKKwlsZHhhCQlbJWw3XTB4ODgsICVnMwkJISAlZzM6JWcyIGlzIHR3ZWFrCisKKwlzZXRoaQkJJWhpKDB4NzY1NDMyMTApLCAlbDcKKwlvcgkJJWw3LCAlbG8oMHg3NjU0MzIxMCksICVsNworCWJtYXNrCQklbDcsICVnMCwgJWcwCQkhIGJ5dGUgc3dhcCBtYXNrCisKKwlwcmVmZXRjaAlbJGlucF0sIDIwCisJcHJlZmV0Y2gJWyRpbnAgKyA2M10sIDIwCisJY2FsbAkJXyR7YWxnfSR7Yml0c31fbG9hZF8ke2Rpcn1ja2V5CisJYW5kCQkkbGVuLCAxNSwgICRyZW0KKwlhbmQJCSRsZW4sIC0xNiwgJGxlbgorX19fCiskY29kZS49PDxfX18gaWYgKCRkaXIgZXEgImRlIik7CisJbW92CQkwLCAlbDcKKwltb3ZybnoJCSRyZW0sIDE2LCAgJWw3CisJc3ViCQkkbGVuLCAlbDcsICRsZW4KK19fXworJGNvZGUuPTw8X19fOworCisJc3ViCQkkaW5wLCAkb3V0LCAkYmxrX2luaXQJISAkaW5wIT0kb3V0CisJYW5kCQkkaW5wLCA3LCAkaWxlZnQKKwlhbmRuCQkkaW5wLCA3LCAkaW5wCisJc2xsCQkkaWxlZnQsIDMsICRpbGVmdAorCW1vdgkJNjQsICRpcmlnaHQKKwltb3YJCTB4ZmYsICRvbWFzaworCXN1YgkJJGlyaWdodCwgJGlsZWZ0LCAkaXJpZ2h0CisJYW5kCQkkb3V0LCA3LCAkb29mZgorCWNtcAkJJGxlbiwgMjU1CisJbW92cm56CQkkb29mZiwgMCwgJGJsa19pbml0CQkhIGlmICgJJG91dCY3IHx8CisJbW92bGV1CQkkOjpzaXplX3RfY2MsIDAsICRibGtfaW5pdAkhCSRsZW48MjU2IHx8CisJYnJueixwbgkJJGJsa19pbml0LCAuTCR7Yml0c31feHRzXyR7ZGlyfWJsayAhCSRpbnA9PSRvdXQpCisJc3JsCQkkb21hc2ssICRvb2ZmLCAkb21hc2sKKworCWFuZGNjCQkkbGVuLCAxNiwgJWcwCQkhIGlzIG51bWJlciBvZiBibG9ja3MgZXZlbj8KK19fXworJGNvZGUuPTw8X19fIGlmICgkZGlyIGVxICJkZSIpOworCWJyeixwbgkJJGxlbiwgLkwke2JpdHN9X3h0c18ke2Rpcn1zdGVhbAorX19fCiskY29kZS49PDxfX187CisJYWxpZ25hZGRybAkkb3V0LCAlZzAsICRvdXQKKwliegkJJWljYywgLkwke2JpdHN9X3h0c18ke2Rpcn1sb29wMngKKwlzcmx4CQkkbGVuLCA0LCAkbGVuCisuTCR7Yml0c31feHRzXyR7ZGlyfWxvb3A6CisJbGR4CQlbJGlucCArIDBdLCAlbzAKKwlicnoscHQJCSRpbGVmdCwgNGYKKwlsZHgJCVskaW5wICsgOF0sICVvMQorCisJbGR4CQlbJGlucCArIDE2XSwgJW8yCisJc2xseAkJJW8wLCAkaWxlZnQsICVvMAorCXNybHgJCSVvMSwgJGlyaWdodCwgJWcxCisJc2xseAkJJW8xLCAkaWxlZnQsICVvMQorCW9yCQklZzEsICVvMCwgJW8wCisJc3JseAkJJW8yLCAkaXJpZ2h0LCAlbzIKKwlvcgkJJW8yLCAlbzEsICVvMQorNDoKKwltb3Z4dG9kCQklZzIsICVmMTIKKwltb3Z4dG9kCQklZzMsICVmMTQKKwlic2h1ZmZsZQklZjEyLCAlZjEyLCAlZjEyCisJYnNodWZmbGUJJWYxNCwgJWYxNCwgJWYxNAorCisJeG9yCQklZzQsICVvMCwgJW8wCQkhIF49IHJrWzBdCisJeG9yCQklZzUsICVvMSwgJW8xCisJbW92eHRvZAkJJW8wLCAlZjAKKwltb3Z4dG9kCQklbzEsICVmMgorCisJZnhvcgkJJWYxMiwgJWYwLCAlZjAJCSEgXj0gdHdlYWtbMF0KKwlmeG9yCQklZjE0LCAlZjIsICVmMgorCisJcHJlZmV0Y2gJWyRvdXQgKyA2M10sIDIyCisJcHJlZmV0Y2gJWyRpbnAgKyAxNis2M10sIDIwCisJY2FsbAkJXyR7YWxnfSR7Yml0c31fJHtkaXJ9Y3J5cHRfMXgKKwlhZGQJCSRpbnAsIDE2LCAkaW5wCisKKwlmeG9yCQklZjEyLCAlZjAsICVmMAkJISBePSB0d2Vha1swXQorCWZ4b3IJCSVmMTQsICVmMiwgJWYyCisKKwlzcmF4CQklZzMsIDYzLCAlbDcJCSEgbmV4dCB0d2VhayB2YWx1ZQorCWFkZGNjCQklZzIsICVnMiwgJWcyCisJYW5kCQklbDcsIDB4ODcsICVsNworCWFkZHhjCQklZzMsICVnMywgJWczCisJeG9yCQklbDcsICVnMiwgJWcyCisKKwlicm56LHBuCQkkb29mZiwgMmYKKwlzdWIJCSRsZW4sIDEsICRsZW4KKwkJCisJc3RkCQklZjAsIFskb3V0ICsgMF0KKwlzdGQJCSVmMiwgWyRvdXQgKyA4XQorCWJybnoscHQJCSRsZW4sIC5MJHtiaXRzfV94dHNfJHtkaXJ9bG9vcDJ4CisJYWRkCQkkb3V0LCAxNiwgJG91dAorCisJYnJueixwbgkJJHJlbSwgLkwke2JpdHN9X3h0c18ke2Rpcn1zdGVhbAorCW5vcAorCisJcmV0CisJcmVzdG9yZQorCisuYWxpZ24JMTYKKzI6CWxkeGEJCVskaW5wXTB4ODIsICVvMAkJISBhdm9pZCByZWFkLWFmdGVyLXdyaXRlIGhhemFyZAorCQkJCQkJISBhbmQgfjN4IGRldGVyaW9yYXRpb24KKwkJCQkJCSEgaW4gaW5wPT1vdXQgY2FzZQorCWZhbGlnbmRhdGEJJWYwLCAlZjAsICVmNAkJISBoYW5kbGUgdW5hbGlnbmVkIG91dHB1dAorCWZhbGlnbmRhdGEJJWYwLCAlZjIsICVmNgorCWZhbGlnbmRhdGEJJWYyLCAlZjIsICVmOAorCXN0ZGEJCSVmNCwgWyRvdXQgKyAkb21hc2tdMHhjMAkhIHBhcnRpYWwgc3RvcmUKKwlzdGQJCSVmNiwgWyRvdXQgKyA4XQorCWFkZAkJJG91dCwgMTYsICRvdXQKKwlvcm4JCSVnMCwgJG9tYXNrLCAkb21hc2sKKwlzdGRhCQklZjgsIFskb3V0ICsgJG9tYXNrXTB4YzAJISBwYXJ0aWFsIHN0b3JlCisKKwlicm56LHB0CQkkbGVuLCAuTCR7Yml0c31feHRzXyR7ZGlyfWxvb3AyeCs0CisJb3JuCQklZzAsICRvbWFzaywgJG9tYXNrCisKKwlicm56LHBuCQkkcmVtLCAuTCR7Yml0c31feHRzXyR7ZGlyfXN0ZWFsCisJbm9wCisKKwlyZXQKKwlyZXN0b3JlCisKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKy5hbGlnbgkzMgorLkwke2JpdHN9X3h0c18ke2Rpcn1sb29wMng6CisJbGR4CQlbJGlucCArIDBdLCAlbzAKKwlsZHgJCVskaW5wICsgOF0sICVvMQorCWxkeAkJWyRpbnAgKyAxNl0sICVvMgorCWJyeixwdAkJJGlsZWZ0LCA0ZgorCWxkeAkJWyRpbnAgKyAyNF0sICVvMworCisJbGR4CQlbJGlucCArIDMyXSwgJW80CisJc2xseAkJJW8wLCAkaWxlZnQsICVvMAorCXNybHgJCSVvMSwgJGlyaWdodCwgJWcxCisJb3IJCSVnMSwgJW8wLCAlbzAKKwlzbGx4CQklbzEsICRpbGVmdCwgJW8xCisJc3JseAkJJW8yLCAkaXJpZ2h0LCAlZzEKKwlvcgkJJWcxLCAlbzEsICVvMQorCXNsbHgJCSVvMiwgJGlsZWZ0LCAlbzIKKwlzcmx4CQklbzMsICRpcmlnaHQsICVnMQorCW9yCQklZzEsICVvMiwgJW8yCisJc2xseAkJJW8zLCAkaWxlZnQsICVvMworCXNybHgJCSVvNCwgJGlyaWdodCwgJW80CisJb3IJCSVvNCwgJW8zLCAlbzMKKzQ6CisJbW92eHRvZAkJJWcyLCAlZjEyCisJbW92eHRvZAkJJWczLCAlZjE0CisJYnNodWZmbGUJJWYxMiwgJWYxMiwgJWYxMgorCWJzaHVmZmxlCSVmMTQsICVmMTQsICVmMTQKKworCXNyYXgJCSVnMywgNjMsICVsNwkJISBuZXh0IHR3ZWFrIHZhbHVlCisJYWRkY2MJCSVnMiwgJWcyLCAlZzIKKwlhbmQJCSVsNywgMHg4NywgJWw3CisJYWRkeGMJCSVnMywgJWczLCAlZzMKKwl4b3IJCSVsNywgJWcyLCAlZzIKKworCW1vdnh0b2QJCSVnMiwgJWY4CisJbW92eHRvZAkJJWczLCAlZjEwCisJYnNodWZmbGUJJWY4LCAgJWY4LCAgJWY4CisJYnNodWZmbGUJJWYxMCwgJWYxMCwgJWYxMAorCisJeG9yCQklZzQsICVvMCwgJW8wCQkhIF49IHJrWzBdCisJeG9yCQklZzUsICVvMSwgJW8xCisJeG9yCQklZzQsICVvMiwgJW8yCQkhIF49IHJrWzBdCisJeG9yCQklZzUsICVvMywgJW8zCisJbW92eHRvZAkJJW8wLCAlZjAKKwltb3Z4dG9kCQklbzEsICVmMgorCW1vdnh0b2QJCSVvMiwgJWY0CisJbW92eHRvZAkJJW8zLCAlZjYKKworCWZ4b3IJCSVmMTIsICVmMCwgJWYwCQkhIF49IHR3ZWFrWzBdCisJZnhvcgkJJWYxNCwgJWYyLCAlZjIKKwlmeG9yCQklZjgsICAlZjQsICVmNAkJISBePSB0d2Vha1swXQorCWZ4b3IJCSVmMTAsICVmNiwgJWY2CisKKwlwcmVmZXRjaAlbJG91dCArIDYzXSwgMjIKKwlwcmVmZXRjaAlbJGlucCArIDMyKzYzXSwgMjAKKwljYWxsCQlfJHthbGd9JHtiaXRzfV8ke2Rpcn1jcnlwdF8yeAorCWFkZAkJJGlucCwgMzIsICRpbnAKKworCW1vdnh0b2QJCSVnMiwgJWY4CisJbW92eHRvZAkJJWczLCAlZjEwCisKKwlzcmF4CQklZzMsIDYzLCAlbDcJCSEgbmV4dCB0d2VhayB2YWx1ZQorCWFkZGNjCQklZzIsICVnMiwgJWcyCisJYW5kCQklbDcsIDB4ODcsICVsNworCWFkZHhjCQklZzMsICVnMywgJWczCisJeG9yCQklbDcsICVnMiwgJWcyCisKKwlic2h1ZmZsZQklZjgsICAlZjgsICAlZjgKKwlic2h1ZmZsZQklZjEwLCAlZjEwLCAlZjEwCisKKwlmeG9yCQklZjEyLCAlZjAsICVmMAkJISBePSB0d2Vha1swXQorCWZ4b3IJCSVmMTQsICVmMiwgJWYyCisJZnhvcgkJJWY4LCAgJWY0LCAlZjQKKwlmeG9yCQklZjEwLCAlZjYsICVmNgorCisJYnJueixwbgkJJG9vZmYsIDJmCisJc3ViCQkkbGVuLCAyLCAkbGVuCisJCQorCXN0ZAkJJWYwLCBbJG91dCArIDBdCisJc3RkCQklZjIsIFskb3V0ICsgOF0KKwlzdGQJCSVmNCwgWyRvdXQgKyAxNl0KKwlzdGQJCSVmNiwgWyRvdXQgKyAyNF0KKwlicm56LHB0CQkkbGVuLCAuTCR7Yml0c31feHRzXyR7ZGlyfWxvb3AyeAorCWFkZAkJJG91dCwgMzIsICRvdXQKKworCWZzcmMyCQklZjQsICVmMAorCWZzcmMyCQklZjYsICVmMgorCWJybnoscG4JCSRyZW0sIC5MJHtiaXRzfV94dHNfJHtkaXJ9c3RlYWwKKwlub3AKKworCXJldAorCXJlc3RvcmUKKworLmFsaWduCTE2CisyOglsZHhhCQlbJGlucF0weDgyLCAlbzAJCSEgYXZvaWQgcmVhZC1hZnRlci13cml0ZSBoYXphcmQKKwkJCQkJCSEgYW5kIH4zeCBkZXRlcmlvcmF0aW9uCisJCQkJCQkhIGluIGlucD09b3V0IGNhc2UKKwlmYWxpZ25kYXRhCSVmMCwgJWYwLCAlZjgJCSEgaGFuZGxlIHVuYWxpZ25lZCBvdXRwdXQKKwlmYWxpZ25kYXRhCSVmMCwgJWYyLCAlZjEwCisJZmFsaWduZGF0YQklZjIsICVmNCwgJWYxMgorCWZhbGlnbmRhdGEJJWY0LCAlZjYsICVmMTQKKwlmYWxpZ25kYXRhCSVmNiwgJWY2LCAlZjAKKworCXN0ZGEJCSVmOCwgWyRvdXQgKyAkb21hc2tdMHhjMAkhIHBhcnRpYWwgc3RvcmUKKwlzdGQJCSVmMTAsIFskb3V0ICsgOF0KKwlzdGQJCSVmMTIsIFskb3V0ICsgMTZdCisJc3RkCQklZjE0LCBbJG91dCArIDI0XQorCWFkZAkJJG91dCwgMzIsICRvdXQKKwlvcm4JCSVnMCwgJG9tYXNrLCAkb21hc2sKKwlzdGRhCQklZjAsIFskb3V0ICsgJG9tYXNrXTB4YzAJISBwYXJ0aWFsIHN0b3JlCisKKwlicm56LHB0CQkkbGVuLCAuTCR7Yml0c31feHRzXyR7ZGlyfWxvb3AyeCs0CisJb3JuCQklZzAsICRvbWFzaywgJG9tYXNrCisKKwlmc3JjMgkJJWY0LCAlZjAKKwlmc3JjMgkJJWY2LCAlZjIKKwlicm56LHBuCQkkcmVtLCAuTCR7Yml0c31feHRzXyR7ZGlyfXN0ZWFsCisJbm9wCisKKwlyZXQKKwlyZXN0b3JlCisKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKy5hbGlnbgkzMgorLkwke2JpdHN9X3h0c18ke2Rpcn1ibGs6CisJYWRkCSRvdXQsICRsZW4sICRibGtfaW5pdAorCWFuZAkkYmxrX2luaXQsIDYzLCAkYmxrX2luaXQJISB0YWlsCisJc3ViCSRsZW4sICRibGtfaW5pdCwgJGxlbgorCWFkZAkkYmxrX2luaXQsIDE1LCAkYmxrX2luaXQJISByb3VuZCB1cCB0byAxNm4KKwlzcmx4CSRsZW4sIDQsICRsZW4KKwlzcmwJJGJsa19pbml0LCA0LCAkYmxrX2luaXQKKwlzdWIJJGxlbiwgMSwgJGxlbgorCWFkZAkkYmxrX2luaXQsIDEsICRibGtfaW5pdAorCisuTCR7Yml0c31feHRzXyR7ZGlyfWJsazJ4OgorCWxkeAkJWyRpbnAgKyAwXSwgJW8wCisJbGR4CQlbJGlucCArIDhdLCAlbzEKKwlsZHgJCVskaW5wICsgMTZdLCAlbzIKKwlicnoscHQJCSRpbGVmdCwgNWYKKwlsZHgJCVskaW5wICsgMjRdLCAlbzMKKworCWxkeAkJWyRpbnAgKyAzMl0sICVvNAorCXNsbHgJCSVvMCwgJGlsZWZ0LCAlbzAKKwlzcmx4CQklbzEsICRpcmlnaHQsICVnMQorCW9yCQklZzEsICVvMCwgJW8wCisJc2xseAkJJW8xLCAkaWxlZnQsICVvMQorCXNybHgJCSVvMiwgJGlyaWdodCwgJWcxCisJb3IJCSVnMSwgJW8xLCAlbzEKKwlzbGx4CQklbzIsICRpbGVmdCwgJW8yCisJc3JseAkJJW8zLCAkaXJpZ2h0LCAlZzEKKwlvcgkJJWcxLCAlbzIsICVvMgorCXNsbHgJCSVvMywgJGlsZWZ0LCAlbzMKKwlzcmx4CQklbzQsICRpcmlnaHQsICVvNAorCW9yCQklbzQsICVvMywgJW8zCis1OgorCW1vdnh0b2QJCSVnMiwgJWYxMgorCW1vdnh0b2QJCSVnMywgJWYxNAorCWJzaHVmZmxlCSVmMTIsICVmMTIsICVmMTIKKwlic2h1ZmZsZQklZjE0LCAlZjE0LCAlZjE0CisKKwlzcmF4CQklZzMsIDYzLCAlbDcJCSEgbmV4dCB0d2VhayB2YWx1ZQorCWFkZGNjCQklZzIsICVnMiwgJWcyCisJYW5kCQklbDcsIDB4ODcsICVsNworCWFkZHhjCQklZzMsICVnMywgJWczCisJeG9yCQklbDcsICVnMiwgJWcyCisKKwltb3Z4dG9kCQklZzIsICVmOAorCW1vdnh0b2QJCSVnMywgJWYxMAorCWJzaHVmZmxlCSVmOCwgICVmOCwgICVmOAorCWJzaHVmZmxlCSVmMTAsICVmMTAsICVmMTAKKworCXhvcgkJJWc0LCAlbzAsICVvMAkJISBePSBya1swXQorCXhvcgkJJWc1LCAlbzEsICVvMQorCXhvcgkJJWc0LCAlbzIsICVvMgkJISBePSBya1swXQorCXhvcgkJJWc1LCAlbzMsICVvMworCW1vdnh0b2QJCSVvMCwgJWYwCisJbW92eHRvZAkJJW8xLCAlZjIKKwltb3Z4dG9kCQklbzIsICVmNAorCW1vdnh0b2QJCSVvMywgJWY2CisKKwlmeG9yCQklZjEyLCAlZjAsICVmMAkJISBePSB0d2Vha1swXQorCWZ4b3IJCSVmMTQsICVmMiwgJWYyCisJZnhvcgkJJWY4LCAgJWY0LCAlZjQJCSEgXj0gdHdlYWtbMF0KKwlmeG9yCQklZjEwLCAlZjYsICVmNgorCisJcHJlZmV0Y2gJWyRpbnAgKyAzMis2M10sIDIwCisJY2FsbAkJXyR7YWxnfSR7Yml0c31fJHtkaXJ9Y3J5cHRfMngKKwlhZGQJCSRpbnAsIDMyLCAkaW5wCisKKwltb3Z4dG9kCQklZzIsICVmOAorCW1vdnh0b2QJCSVnMywgJWYxMAorCisJc3JheAkJJWczLCA2MywgJWw3CQkhIG5leHQgdHdlYWsgdmFsdWUKKwlhZGRjYwkJJWcyLCAlZzIsICVnMgorCWFuZAkJJWw3LCAweDg3LCAlbDcKKwlhZGR4YwkJJWczLCAlZzMsICVnMworCXhvcgkJJWw3LCAlZzIsICVnMgorCisJYnNodWZmbGUJJWY4LCAgJWY4LCAgJWY4CisJYnNodWZmbGUJJWYxMCwgJWYxMCwgJWYxMAorCisJZnhvcgkJJWYxMiwgJWYwLCAlZjAJCSEgXj0gdHdlYWtbMF0KKwlmeG9yCQklZjE0LCAlZjIsICVmMgorCWZ4b3IJCSVmOCwgICVmNCwgJWY0CisJZnhvcgkJJWYxMCwgJWY2LCAlZjYKKworCXN0ZGEJCSVmMCwgWyRvdXRdMHhlMgkJISBBU0lfQkxLX0lOSVQsIFQ0LXNwZWNpZmljCisJYWRkCQkkb3V0LCA4LCAkb3V0CisJc3RkYQkJJWYyLCBbJG91dF0weGUyCQkhIEFTSV9CTEtfSU5JVCwgVDQtc3BlY2lmaWMKKwlhZGQJCSRvdXQsIDgsICRvdXQKKwlzdGRhCQklZjQsIFskb3V0XTB4ZTIJCSEgQVNJX0JMS19JTklULCBUNC1zcGVjaWZpYworCWFkZAkJJG91dCwgOCwgJG91dAorCXN0ZGEJCSVmNiwgWyRvdXRdMHhlMgkJISBBU0lfQkxLX0lOSVQsIFQ0LXNwZWNpZmljCisJYmd1LHB0CQkkOjpzaXplX3RfY2MsIC5MJHtiaXRzfV94dHNfJHtkaXJ9YmxrMngKKwlhZGQJCSRvdXQsIDgsICRvdXQKKworCWFkZAkJJGJsa19pbml0LCAkbGVuLCAkbGVuCisJYW5kY2MJCSRsZW4sIDEsICVnMAkJISBpcyBudW1iZXIgb2YgYmxvY2tzIGV2ZW4/CisJbWVtYmFyCQkjU3RvcmVMb2FkfCNTdG9yZVN0b3JlCisJYm56LHB0CQklaWNjLCAuTCR7Yml0c31feHRzXyR7ZGlyfWxvb3AKKwlzcmwJCSRsZW4sIDAsICRsZW4KKwlicm56LHBuCQkkbGVuLCAuTCR7Yml0c31feHRzXyR7ZGlyfWxvb3AyeAorCW5vcAorCisJZnNyYzIJCSVmNCwgJWYwCisJZnNyYzIJCSVmNiwgJWYyCisJYnJueixwbgkJJHJlbSwgLkwke2JpdHN9X3h0c18ke2Rpcn1zdGVhbAorCW5vcAorCisJcmV0CisJcmVzdG9yZQorISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorX19fCiskY29kZS49PDxfX18gaWYgKCRkaXIgZXEgImVuIik7CisuYWxpZ24JMzIKKy5MJHtiaXRzfV94dHNfJHtkaXJ9c3RlYWw6CisJc3RkCQklZjAsIFslZnAgKyAkOjpiaWFzLTE2XQkhIGNvcHkgb2Ygb3V0cHV0CisJc3RkCQklZjIsIFslZnAgKyAkOjpiaWFzLThdCisKKwlzcmwJCSRpbGVmdCwgMywgJGlsZWZ0CisJYWRkCQklZnAsICQ6OmJpYXMtMTYsICVsNworCWFkZAkJJGlucCwgJGlsZWZ0LCAkaW5wCSEgb3JpZ2luYWwgJGlucCskbGVuJi0xNQorCWFkZAkJJG91dCwgJG9vZmYsICRvdXQJISBvcmlnaW5hbCAkb3V0KyRsZW4mLTE1CisJbW92CQkwLCAkaWxlZnQKKwlub3AJCQkJCSEgYWxpZ24KKworLkwke2JpdHN9X3h0c18ke2Rpcn1zdGVhbGluZzoKKwlsZHViCQlbJGlucCArICRpbGVmdF0sICVvMAorCWxkdWIJCVslbDcgICsgJGlsZWZ0XSwgJW8xCisJZGVjCQkkcmVtCisJc3RiCQklbzAsIFslbDcgICsgJGlsZWZ0XQorCXN0YgkJJW8xLCBbJG91dCArICRpbGVmdF0KKwlicm56CQkkcmVtLCAuTCR7Yml0c31feHRzXyR7ZGlyfXN0ZWFsaW5nCisJaW5jCQkkaWxlZnQKKworCW1vdgkJJWw3LCAkaW5wCisJc3ViCQkkb3V0LCAxNiwgJG91dAorCW1vdgkJMCwgJGlsZWZ0CisJc3ViCQkkb3V0LCAkb29mZiwgJG91dAorCWJhCQkuTCR7Yml0c31feHRzXyR7ZGlyfWxvb3AJISBvbmUgbW9yZSB0aW1lCisJbW92CQkxLCAkbGVuCQkJCSEgJHJlbSBpcyAwCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJGRpciBlcSAiZGUiKTsKKy5hbGlnbgkzMgorLkwke2JpdHN9X3h0c18ke2Rpcn1zdGVhbDoKKwlsZHgJCVskaW5wICsgMF0sICVvMAorCWJyeixwdAkJJGlsZWZ0LCA4ZgorCWxkeAkJWyRpbnAgKyA4XSwgJW8xCisKKwlsZHgJCVskaW5wICsgMTZdLCAlbzIKKwlzbGx4CQklbzAsICRpbGVmdCwgJW8wCisJc3JseAkJJW8xLCAkaXJpZ2h0LCAlZzEKKwlzbGx4CQklbzEsICRpbGVmdCwgJW8xCisJb3IJCSVnMSwgJW8wLCAlbzAKKwlzcmx4CQklbzIsICRpcmlnaHQsICVvMgorCW9yCQklbzIsICVvMSwgJW8xCis4OgorCXNyYXgJCSVnMywgNjMsICVsNwkJISBuZXh0IHR3ZWFrIHZhbHVlCisJYWRkY2MJCSVnMiwgJWcyLCAlbzIKKwlhbmQJCSVsNywgMHg4NywgJWw3CisJYWRkeGMJCSVnMywgJWczLCAlbzMKKwl4b3IJCSVsNywgJW8yLCAlbzIKKworCW1vdnh0b2QJCSVvMiwgJWYxMgorCW1vdnh0b2QJCSVvMywgJWYxNAorCWJzaHVmZmxlCSVmMTIsICVmMTIsICVmMTIKKwlic2h1ZmZsZQklZjE0LCAlZjE0LCAlZjE0CisKKwl4b3IJCSVnNCwgJW8wLCAlbzAJCSEgXj0gcmtbMF0KKwl4b3IJCSVnNSwgJW8xLCAlbzEKKwltb3Z4dG9kCQklbzAsICVmMAorCW1vdnh0b2QJCSVvMSwgJWYyCisKKwlmeG9yCQklZjEyLCAlZjAsICVmMAkJISBePSB0d2Vha1swXQorCWZ4b3IJCSVmMTQsICVmMiwgJWYyCisKKwljYWxsCQlfJHthbGd9JHtiaXRzfV8ke2Rpcn1jcnlwdF8xeAorCWFkZAkJJGlucCwgMTYsICRpbnAKKworCWZ4b3IJCSVmMTIsICVmMCwgJWYwCQkhIF49IHR3ZWFrWzBdCisJZnhvcgkJJWYxNCwgJWYyLCAlZjIKKworCXN0ZAkJJWYwLCBbJWZwICsgJDo6Ymlhcy0xNl0KKwlzdGQJCSVmMiwgWyVmcCArICQ6OmJpYXMtOF0KKworCXNybAkJJGlsZWZ0LCAzLCAkaWxlZnQKKwlhZGQJCSVmcCwgJDo6Ymlhcy0xNiwgJWw3CisJYWRkCQkkaW5wLCAkaWxlZnQsICRpbnAJISBvcmlnaW5hbCAkaW5wKyRsZW4mLTE1CisJYWRkCQkkb3V0LCAkb29mZiwgJG91dAkhIG9yaWdpbmFsICRvdXQrJGxlbiYtMTUKKwltb3YJCTAsICRpbGVmdAorCWFkZAkJJG91dCwgMTYsICRvdXQKKwlub3AJCQkJCSEgYWxpZ24KKworLkwke2JpdHN9X3h0c18ke2Rpcn1zdGVhbGluZzoKKwlsZHViCQlbJGlucCArICRpbGVmdF0sICVvMAorCWxkdWIJCVslbDcgICsgJGlsZWZ0XSwgJW8xCisJZGVjCQkkcmVtCisJc3RiCQklbzAsIFslbDcgICsgJGlsZWZ0XQorCXN0YgkJJW8xLCBbJG91dCArICRpbGVmdF0KKwlicm56CQkkcmVtLCAuTCR7Yml0c31feHRzXyR7ZGlyfXN0ZWFsaW5nCisJaW5jCQkkaWxlZnQKKworCW1vdgkJJWw3LCAkaW5wCisJc3ViCQkkb3V0LCAxNiwgJG91dAorCW1vdgkJMCwgJGlsZWZ0CisJc3ViCQkkb3V0LCAkb29mZiwgJG91dAorCWJhCQkuTCR7Yml0c31feHRzXyR7ZGlyfWxvb3AJISBvbmUgbW9yZSB0aW1lCisJbW92CQkxLCAkbGVuCQkJCSEgJHJlbSBpcyAwCitfX18KKyRjb2RlLj08PF9fXzsKKwlyZXQKKwlyZXN0b3JlCisudHlwZQkke2FsZ30ke2JpdHN9X3Q0X3h0c18ke2Rpcn1jcnlwdCwjZnVuY3Rpb24KKy5zaXplCSR7YWxnfSR7Yml0c31fdDRfeHRzXyR7ZGlyfWNyeXB0LC4tJHthbGd9JHtiaXRzfV90NF94dHNfJHtkaXJ9Y3J5cHQKK19fXworfQorCisjIFB1cnBvc2Ugb2YgdGhlc2Ugc3Vicm91dGluZXMgaXMgdG8gZXhwbGljaXRseSBlbmNvZGUgVklTIGluc3RydWN0aW9ucywKKyMgc28gdGhhdCBvbmUgY2FuIGNvbXBpbGUgdGhlIG1vZHVsZSB3aXRob3V0IGhhdmluZyB0byBzcGVjaWZ5IFZJUworIyBleHRlbnRpb25zIG9uIGNvbXBpbGVyIGNvbW1hbmQgbGluZSwgZS5nLiAteGFyY2g9djkgdnMuIC14YXJjaD12OWEuCisjIElkZWEgaXMgdG8gcmVzZXJ2ZSBmb3Igb3B0aW9uIHRvIHByb2R1Y2UgInVuaXZlcnNhbCIgYmluYXJ5IGFuZCBsZXQKKyMgcHJvZ3JhbW1lciBkZXRlY3QgaWYgY3VycmVudCBDUFUgaXMgVklTIGNhcGFibGUgYXQgcnVuLXRpbWUuCitzdWIgdW52aXMgeworbXkgKCRtbmVtb25pYywkcnMxLCRyczIsJHJkKT1AXzsKK215ICgkcmVmLCRvcGYpOworbXkgJXZpc29wZiA9ICgJImZhbGlnbmRhdGEiCT0+IDB4MDQ4LAorCQkiYnNodWZmbGUiCT0+IDB4MDRjLAorCQkiZm5vdDIiCQk9PiAweDA2NiwKKwkJImZ4b3IiCQk9PiAweDA2YywKKwkJImZzcmMyIgkJPT4gMHgwNzgJKTsKKworICAgICRyZWYgPSAiJG1uZW1vbmljXHQkcnMxLCRyczIsJHJkIjsKKworICAgIGlmICgkb3BmPSR2aXNvcGZ7JG1uZW1vbmljfSkgeworCWZvcmVhY2ggKCRyczEsJHJzMiwkcmQpIHsKKwkgICAgcmV0dXJuICRyZWYgaWYgKCEvJWYoWzAtOV17MSwyfSkvKTsKKwkgICAgJF89JDE7CisJICAgIGlmICgkMT49MzIpIHsKKwkJcmV0dXJuICRyZWYgaWYgKCQxJjEpOworCQkjIHJlLWVuY29kZSBmb3IgdXBwZXIgZG91YmxlIHJlZ2lzdGVyIGFkZHJlc3NpbmcKKwkJJF89KCQxfCQxPj41KSYzMTsKKwkgICAgfQorCX0KKworCXJldHVybglzcHJpbnRmICIud29yZFx0MHglMDh4ICElcyIsCisJCQkweDgxYjAwMDAwfCRyZDw8MjV8JHJzMTw8MTR8JG9wZjw8NXwkcnMyLAorCQkJJHJlZjsKKyAgICB9IGVsc2UgeworCXJldHVybiAkcmVmOworICAgIH0KK30KKworc3ViIHVudmlzMyB7CitteSAoJG1uZW1vbmljLCRyczEsJHJzMiwkcmQpPUBfOworbXkgJWJpYXMgPSAoICJnIiA9PiAwLCAibyIgPT4gOCwgImwiID0+IDE2LCAiaSIgPT4gMjQgKTsKK215ICgkcmVmLCRvcGYpOworbXkgJXZpc29wZiA9ICgJImFkZHhjIgkJPT4gMHgwMTEsCisJCSJhZGR4Y2NjIgk9PiAweDAxMywKKwkJInVtdWx4aGkiCT0+IDB4MDE2LAorCQkiYWxpZ25hZGRyIgk9PiAweDAxOCwKKwkJImJtYXNrIgkJPT4gMHgwMTksCisJCSJhbGlnbmFkZHJsIgk9PiAweDAxYQkpOworCisgICAgJHJlZiA9ICIkbW5lbW9uaWNcdCRyczEsJHJzMiwkcmQiOworCisgICAgaWYgKCRvcGY9JHZpc29wZnskbW5lbW9uaWN9KSB7CisJZm9yZWFjaCAoJHJzMSwkcnMyLCRyZCkgeworCSAgICByZXR1cm4gJHJlZiBpZiAoIS8lKFtnb2xpXSkoWzAtOV0pLyk7CisJICAgICRfPSRiaWFzeyQxfSskMjsKKwl9CisKKwlyZXR1cm4Jc3ByaW50ZiAiLndvcmRcdDB4JTA4eCAhJXMiLAorCQkJMHg4MWIwMDAwMHwkcmQ8PDI1fCRyczE8PDE0fCRvcGY8PDV8JHJzMiwKKwkJCSRyZWY7CisgICAgfSBlbHNlIHsKKwlyZXR1cm4gJHJlZjsKKyAgICB9Cit9CisKK3N1YiB1bmFlc19yb3VuZCB7CSMgNC1hcmd1bWVudCBpbnN0cnVjdGlvbnMKK215ICgkbW5lbW9uaWMsJHJzMSwkcnMyLCRyczMsJHJkKT1AXzsKK215ICgkcmVmLCRvcGYpOworbXkgJWFlc29wZiA9ICgJImFlc19lcm91bmQwMSIJPT4gMCwKKwkJImFlc19lcm91bmQyMyIJPT4gMSwKKwkJImFlc19kcm91bmQwMSIJPT4gMiwKKwkJImFlc19kcm91bmQyMyIJPT4gMywKKwkJImFlc19lcm91bmQwMV9sIj0+IDQsCisJCSJhZXNfZXJvdW5kMjNfbCI9PiA1LAorCQkiYWVzX2Ryb3VuZDAxX2wiPT4gNiwKKwkJImFlc19kcm91bmQyM19sIj0+IDcsCisJCSJhZXNfa2V4cGFuZDEiCT0+IDgJKTsKKworICAgICRyZWYgPSAiJG1uZW1vbmljXHQkcnMxLCRyczIsJHJzMywkcmQiOworCisgICAgaWYgKGRlZmluZWQoJG9wZj0kYWVzb3BmeyRtbmVtb25pY30pKSB7CisJJHJzMyA9ICgkcnMzID1+IC8lZihbMC02XSpbMDI0NjhdKS8pID8gKCgkMXwkMT4+NSkmMzEpIDogJHJzMzsKKwlmb3JlYWNoICgkcnMxLCRyczIsJHJkKSB7CisJICAgIHJldHVybiAkcmVmIGlmICghLyVmKFswLTldezEsMn0pLyk7CisJICAgICRfPSQxOworCSAgICBpZiAoJDE+PTMyKSB7CisJCXJldHVybiAkcmVmIGlmICgkMSYxKTsKKwkJIyByZS1lbmNvZGUgZm9yIHVwcGVyIGRvdWJsZSByZWdpc3RlciBhZGRyZXNzaW5nCisJCSRfPSgkMXwkMT4+NSkmMzE7CisJICAgIH0KKwl9CisKKwlyZXR1cm4Jc3ByaW50ZiAiLndvcmRcdDB4JTA4eCAhJXMiLAorCQkJMjw8MzB8JHJkPDwyNXwweDE5PDwxOXwkcnMxPDwxNHwkcnMzPDw5fCRvcGY8PDV8JHJzMiwKKwkJCSRyZWY7CisgICAgfSBlbHNlIHsKKwlyZXR1cm4gJHJlZjsKKyAgICB9Cit9CisKK3N1YiB1bmFlc19rZXhwYW5kIHsJIyAzLWFyZ3VtZW50IGluc3RydWN0aW9ucworbXkgKCRtbmVtb25pYywkcnMxLCRyczIsJHJkKT1AXzsKK215ICgkcmVmLCRvcGYpOworbXkgJWFlc29wZiA9ICgJImFlc19rZXhwYW5kMCIJPT4gMHgxMzAsCisJCSJhZXNfa2V4cGFuZDIiCT0+IDB4MTMxCSk7CisKKyAgICAkcmVmID0gIiRtbmVtb25pY1x0JHJzMSwkcnMyLCRyZCI7CisKKyAgICBpZiAoZGVmaW5lZCgkb3BmPSRhZXNvcGZ7JG1uZW1vbmljfSkpIHsKKwlmb3JlYWNoICgkcnMxLCRyczIsJHJkKSB7CisJICAgIHJldHVybiAkcmVmIGlmICghLyVmKFswLTldezEsMn0pLyk7CisJICAgICRfPSQxOworCSAgICBpZiAoJDE+PTMyKSB7CisJCXJldHVybiAkcmVmIGlmICgkMSYxKTsKKwkJIyByZS1lbmNvZGUgZm9yIHVwcGVyIGRvdWJsZSByZWdpc3RlciBhZGRyZXNzaW5nCisJCSRfPSgkMXwkMT4+NSkmMzE7CisJICAgIH0KKwl9CisKKwlyZXR1cm4Jc3ByaW50ZiAiLndvcmRcdDB4JTA4eCAhJXMiLAorCQkJMjw8MzB8JHJkPDwyNXwweDM2PDwxOXwkcnMxPDwxNHwkb3BmPDw1fCRyczIsCisJCQkkcmVmOworICAgIH0gZWxzZSB7CisJcmV0dXJuICRyZWY7CisgICAgfQorfQorCitzdWIgdW5jYW1lbGxpYV9mIHsJIyA0LWFyZ3VtZW50IGluc3RydWN0aW9ucworbXkgKCRtbmVtb25pYywkcnMxLCRyczIsJHJzMywkcmQpPUBfOworbXkgKCRyZWYsJG9wZik7CisKKyAgICAkcmVmID0gIiRtbmVtb25pY1x0JHJzMSwkcnMyLCRyczMsJHJkIjsKKworICAgIGlmICgxKSB7CisJJHJzMyA9ICgkcnMzID1+IC8lZihbMC02XSpbMDI0NjhdKS8pID8gKCgkMXwkMT4+NSkmMzEpIDogJHJzMzsKKwlmb3JlYWNoICgkcnMxLCRyczIsJHJkKSB7CisJICAgIHJldHVybiAkcmVmIGlmICghLyVmKFswLTldezEsMn0pLyk7CisJICAgICRfPSQxOworCSAgICBpZiAoJDE+PTMyKSB7CisJCXJldHVybiAkcmVmIGlmICgkMSYxKTsKKwkJIyByZS1lbmNvZGUgZm9yIHVwcGVyIGRvdWJsZSByZWdpc3RlciBhZGRyZXNzaW5nCisJCSRfPSgkMXwkMT4+NSkmMzE7CisJICAgIH0KKwl9CisKKwlyZXR1cm4Jc3ByaW50ZiAiLndvcmRcdDB4JTA4eCAhJXMiLAorCQkJMjw8MzB8JHJkPDwyNXwweDE5PDwxOXwkcnMxPDwxNHwkcnMzPDw5fDB4Yzw8NXwkcnMyLAorCQkJJHJlZjsKKyAgICB9IGVsc2UgeworCXJldHVybiAkcmVmOworICAgIH0KK30KKworc3ViIHVuY2FtZWxsaWEzIHsJIyAzLWFyZ3VtZW50IGluc3RydWN0aW9ucworbXkgKCRtbmVtb25pYywkcnMxLCRyczIsJHJkKT1AXzsKK215ICgkcmVmLCRvcGYpOworbXkgJWNtbGxvcGYgPSAoCSJjYW1lbGxpYV9mbCIJPT4gMHgxM2MsCisJCSJjYW1lbGxpYV9mbGkiCT0+IDB4MTNkCSk7CisKKyAgICAkcmVmID0gIiRtbmVtb25pY1x0JHJzMSwkcnMyLCRyZCI7CisKKyAgICBpZiAoZGVmaW5lZCgkb3BmPSRjbWxsb3BmeyRtbmVtb25pY30pKSB7CisJZm9yZWFjaCAoJHJzMSwkcnMyLCRyZCkgeworCSAgICByZXR1cm4gJHJlZiBpZiAoIS8lZihbMC05XXsxLDJ9KS8pOworCSAgICAkXz0kMTsKKwkgICAgaWYgKCQxPj0zMikgeworCQlyZXR1cm4gJHJlZiBpZiAoJDEmMSk7CisJCSMgcmUtZW5jb2RlIGZvciB1cHBlciBkb3VibGUgcmVnaXN0ZXIgYWRkcmVzc2luZworCQkkXz0oJDF8JDE+PjUpJjMxOworCSAgICB9CisJfQorCisJcmV0dXJuCXNwcmludGYgIi53b3JkXHQweCUwOHggISVzIiwKKwkJCTI8PDMwfCRyZDw8MjV8MHgzNjw8MTl8JHJzMTw8MTR8JG9wZjw8NXwkcnMyLAorCQkJJHJlZjsKKyAgICB9IGVsc2UgeworCXJldHVybiAkcmVmOworICAgIH0KK30KKworc3ViIHVubW92eHRveCB7CQkjIDItYXJndW1lbnQgaW5zdHJ1Y3Rpb25zCitteSAoJG1uZW1vbmljLCRycywkcmQpPUBfOworbXkgJWJpYXMgPSAoICJnIiA9PiAwLCAibyIgPT4gOCwgImwiID0+IDE2LCAiaSIgPT4gMjQsICJmIiA9PiAwICk7CitteSAoJHJlZiwkb3BmKTsKK215ICVtb3Z4b3BmID0gKAkibW92ZHRveCIJPT4gMHgxMTAsCisJCSJtb3ZzdG91dyIJPT4gMHgxMTEsCisJCSJtb3ZzdG9zdyIJPT4gMHgxMTMsCisJCSJtb3Z4dG9kIgk9PiAweDExOCwKKwkJIm1vdnd0b3MiCT0+IDB4MTE5CSk7CisKKyAgICAkcmVmID0gIiRtbmVtb25pY1x0JHJzLCRyZCI7CisKKyAgICBpZiAoZGVmaW5lZCgkb3BmPSRtb3Z4b3BmeyRtbmVtb25pY30pKSB7CisJZm9yZWFjaCAoJHJzLCRyZCkgeworCSAgICByZXR1cm4gJHJlZiBpZiAoIS8lKFtmZ29saV0pKFswLTldezEsMn0pLyk7CisJICAgICRfPSRiaWFzeyQxfSskMjsKKwkgICAgaWYgKCQyPj0zMikgeworCQlyZXR1cm4gJHJlZiBpZiAoJDImMSk7CisJCSMgcmUtZW5jb2RlIGZvciB1cHBlciBkb3VibGUgcmVnaXN0ZXIgYWRkcmVzc2luZworCQkkXz0oJDJ8JDI+PjUpJjMxOworCSAgICB9CisJfQorCisJcmV0dXJuCXNwcmludGYgIi53b3JkXHQweCUwOHggISVzIiwKKwkJCTI8PDMwfCRyZDw8MjV8MHgzNjw8MTl8JG9wZjw8NXwkcnMsCisJCQkkcmVmOworICAgIH0gZWxzZSB7CisJcmV0dXJuICRyZWY7CisgICAgfQorfQorCitzdWIgdW5kZXMgeworbXkgKCRtbmVtb25pYyk9c2hpZnQ7CitteSBAYXJncz1AXzsKK215ICgkcmVmLCRvcGYpOworbXkgJWRlc29wZiA9ICgJImRlc19yb3VuZCIJPT4gMGIxMDAxLAorCQkiZGVzX2lwIgk9PiAwYjEwMDExMDEwMCwKKwkJImRlc19paXAiCT0+IDBiMTAwMTEwMTAxLAorCQkiZGVzX2tleHBhbmQiCT0+IDBiMTAwMTEwMTEwCSk7CisKKyAgICAkcmVmID0gIiRtbmVtb25pY1x0Ii5qb2luKCIsIixAXyk7CisKKyAgICBpZiAoZGVmaW5lZCgkb3BmPSRkZXNvcGZ7JG1uZW1vbmljfSkpIHsJIyA0LWFyZworCWlmICgkbW5lbW9uaWMgZXEgImRlc19yb3VuZCIpIHsKKwkgICAgZm9yZWFjaCAoQGFyZ3NbMC4uM10pIHsKKwkJcmV0dXJuICRyZWYgaWYgKCEvJWYoWzAtOV17MSwyfSkvKTsKKwkJJF89JDE7CisJCWlmICgkMT49MzIpIHsKKwkJICAgIHJldHVybiAkcmVmIGlmICgkMSYxKTsKKwkJICAgICMgcmUtZW5jb2RlIGZvciB1cHBlciBkb3VibGUgcmVnaXN0ZXIgYWRkcmVzc2luZworCQkgICAgJF89KCQxfCQxPj41KSYzMTsKKwkJfQorCSAgICB9CisJICAgIHJldHVybiAgc3ByaW50ZiAiLndvcmRcdDB4JTA4eCAhJXMiLAorCQkJICAgIDI8PDMwfDBiMDExMDAxPDwxOXwkb3BmPDw1fCRhcmdzWzBdPDwxNHwkYXJnc1sxXXwkYXJnc1syXTw8OXwkYXJnc1szXTw8MjUsCisJCQkgICAgJHJlZjsKKwl9IGVsc2lmICgkbW5lbW9uaWMgZXEgImRlc19rZXhwYW5kIikgewkjIDMtYXJnCisJICAgIGZvcmVhY2ggKEBhcmdzWzAuLjJdKSB7CisJCXJldHVybiAkcmVmIGlmICghLyglZik/KFswLTldezEsMn0pLyk7CisJCSRfPSQyOworCQlpZiAoJDI+PTMyKSB7CisJCSAgICByZXR1cm4gJHJlZiBpZiAoJDImMSk7CisJCSAgICAjIHJlLWVuY29kZSBmb3IgdXBwZXIgZG91YmxlIHJlZ2lzdGVyIGFkZHJlc3NpbmcKKwkJICAgICRfPSgkMnwkMj4+NSkmMzE7CisJCX0KKwkgICAgfQorCSAgICByZXR1cm4gIHNwcmludGYgIi53b3JkXHQweCUwOHggISVzIiwKKwkJCSAgICAyPDwzMHwwYjExMDExMDw8MTl8JG9wZjw8NXwkYXJnc1swXTw8MTR8JGFyZ3NbMV18JGFyZ3NbMl08PDI1LAorCQkJICAgICRyZWY7CisJfSBlbHNlIHsJCQkJIyAyLWFyZworCSAgICBmb3JlYWNoIChAYXJnc1swLi4xXSkgeworCQlyZXR1cm4gJHJlZiBpZiAoIS8lZihbMC05XXsxLDJ9KS8pOworCQkkXz0kMTsKKwkJaWYgKCQxPj0zMikgeworCQkgICAgcmV0dXJuICRyZWYgaWYgKCQyJjEpOworCQkgICAgIyByZS1lbmNvZGUgZm9yIHVwcGVyIGRvdWJsZSByZWdpc3RlciBhZGRyZXNzaW5nCisJCSAgICAkXz0oJDF8JDE+PjUpJjMxOworCQl9CisJICAgIH0KKwkgICAgcmV0dXJuICBzcHJpbnRmICIud29yZFx0MHglMDh4ICElcyIsCisJCQkgICAgMjw8MzB8MGIxMTAxMTA8PDE5fCRvcGY8PDV8JGFyZ3NbMF08PDE0fCRhcmdzWzFdPDwyNSwKKwkJCSAgICAkcmVmOworCX0KKyAgICB9IGVsc2UgeworCXJldHVybiAkcmVmOworICAgIH0KK30KKworc3ViIGVtaXRfYXNzZW1ibGVyIHsKKyAgICBmb3JlYWNoIChzcGxpdCgiXG4iLCQ6OmNvZGUpKSB7CisJcy9cYChbXlxgXSopXGAvZXZhbCAkMS9nZTsKKworCXMvXGIoZlthLXpdKzJbc2RdKilccysoJWZbMC05XXsxLDJ9KSxccyooJWZbMC05XXsxLDJ9KVxzKiQvJDFcdCVmMCwkMiwkMy9nbzsKKworCXMvXGIoYWVzX1tlZGtdW15cc10qKVxzKyglZlswLTldezEsMn0pLFxzKiglZlswLTldezEsMn0pLFxzKihbJWZ4MC05XSspLFxzKiglZlswLTldezEsMn0pLworCQkmdW5hZXNfcm91bmQoJDEsJDIsJDMsJDQsJDUpCisJIC9nZW8gb3IKKwlzL1xiKGFlc19rZXhwYW5kWzAyXSlccysoJWZbMC05XXsxLDJ9KSxccyooJWZbMC05XXsxLDJ9KSxccyooJWZbMC05XXsxLDJ9KS8KKwkJJnVuYWVzX2tleHBhbmQoJDEsJDIsJDMsJDQpCisJIC9nZW8gb3IKKwlzL1xiKGNhbWVsbGlhX2YpXHMrKCVmWzAtOV17MSwyfSksXHMqKCVmWzAtOV17MSwyfSksXHMqKFslZngwLTldKyksXHMqKCVmWzAtOV17MSwyfSkvCisJCSZ1bmNhbWVsbGlhX2YoJDEsJDIsJDMsJDQsJDUpCisJIC9nZW8gb3IKKwlzL1xiKGNhbWVsbGlhX1tec10rKVxzKyglZlswLTldezEsMn0pLFxzKiglZlswLTldezEsMn0pLFxzKiglZlswLTldezEsMn0pLworCQkmdW5jYW1lbGxpYTMoJDEsJDIsJDMsJDQpCisJIC9nZW8gb3IKKwlzL1xiKGRlc19cdyspXHMrKCVmWzAtOV17MSwyfSksXHMqKFslZngwLTldKykoPzosXHMqKCVmWzAtOV17MSwyfSkoPzosXHMqKCVmWzAtOV17MSwyfSkpPyk/LworCQkmdW5kZXMoJDEsJDIsJDMsJDQsJDUpCisJIC9nZW8gb3IKKwlzL1xiKG1vdltkc110b1x3KylccysoJWZbMC05XXsxLDJ9KSxccyooJVtnb2xpXVswLTddKS8KKwkJJnVubW92eHRveCgkMSwkMiwkMykKKwkgL2dlbyBvcgorCXMvXGIobW92W3h3XXRvW2RzXSlccysoJVtnb2xpXVswLTddKSxccyooJWZbMC05XXsxLDJ9KS8KKwkJJnVubW92eHRveCgkMSwkMiwkMykKKwkgL2dlbyBvcgorCXMvXGIoW2ZiXVteXHNdKilccysoJWZbMC05XXsxLDJ9KSxccyooJWZbMC05XXsxLDJ9KSxccyooJWZbMC05XXsxLDJ9KS8KKwkJJnVudmlzKCQxLCQyLCQzLCQ0KQorCSAvZ2VvIG9yCisJcy9cYih1bXVseGhpfGJtYXNrfGFkZHhjW2NdezAsMn18YWxpZ25hZGRyW2xdKilccysoJVtnb2xpXVswLTddKSxccyooJVtnb2xpXVswLTddKSxccyooJVtnb2xpXVswLTddKS8KKwkJJnVudmlzMygkMSwkMiwkMywkNCkKKwkgL2dlbzsKKworCXByaW50ICRfLCJcbiI7CisgICAgfQorfQorCisxOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3Blcmxhc20veDg2XzY0LXhsYXRlLnBsIGIvY3J5cHRvL3Blcmxhc20veDg2XzY0LXhsYXRlLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI0ZmYxYjQKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vcGVybGFzbS94ODZfNjQteGxhdGUucGwKQEAgLTAsMCArMSwxMTUxIEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMgQXNjZXRpYyB4ODZfNjQgQVQmVCB0byBNQVNNL05BU00gYXNzZW1ibGVyIHRyYW5zbGF0b3IgYnkgPGFwcHJvPi4KKyMKKyMgV2h5IEFUJlQgdG8gTUFTTSBhbmQgbm90IHZpY2UgdmVyc2E/IFNldmVyYWwgcmVhc29ucy4gQmVjYXVzZSBBVCZUCisjIGZvcm1hdCBpcyB3YXkgZWFzaWVyIHRvIHBhcnNlLiBCZWNhdXNlIGl0J3Mgc2ltcGxlciB0byAiZ2VhciIgZnJvbQorIyBVbml4IEFCSSB0byBXaW5kb3dzIG9uZSBbc2VlIGNyb3NzLXJlZmVyZW5jZSAiY2FyZCIgYXQgdGhlIGVuZCBvZgorIyBmaWxlXS4gQmVjYXVzZSBMaW51eCB0YXJnZXRzIHdlcmUgYXZhaWxhYmxlIGZpcnN0Li4uCisjCisjIEluIGFkZGl0aW9uIHRoZSBzY3JpcHQgYWxzbyAiZGlzdGlsbHMiIGNvZGUgc3VpdGFibGUgZm9yIEdOVQorIyBhc3NlbWJsZXIsIHNvIHRoYXQgaXQgY2FuIGJlIGNvbXBpbGVkIHdpdGggbW9yZSByaWdpZCBhc3NlbWJsZXJzLAorIyBzdWNoIGFzIFNvbGFyaXMgL3Vzci9jY3MvYmluL2FzLgorIworIyBUaGlzIHRyYW5zbGF0b3IgaXMgbm90IGRlc2lnbmVkIHRvIGNvbnZlcnQgKmFyYml0cmFyeSogYXNzZW1ibGVyCisjIGNvZGUgZnJvbSBBVCZUIGZvcm1hdCB0byBNQVNNIG9uZS4gSXQncyBkZXNpZ25lZCB0byBjb252ZXJ0IGp1c3QKKyMgZW5vdWdoIHRvIHByb3ZpZGUgZm9yIGR1YWwtQUJJIE9wZW5TU0wgbW9kdWxlcyBkZXZlbG9wbWVudC4uLgorIyBUaGVyZSAqYXJlKiBsaW1pdGF0aW9ucyBhbmQgeW91IG1pZ2h0IGhhdmUgdG8gbW9kaWZ5IHlvdXIgYXNzZW1ibGVyCisjIGNvZGUgb3IgdGhpcyBzY3JpcHQgdG8gYWNoaWV2ZSB0aGUgZGVzaXJlZCByZXN1bHQuLi4KKyMKKyMgQ3VycmVudGx5IHJlY29nbml6ZWQgbGltaXRhdGlvbnM6CisjCisjIC0gY2FuJ3QgdXNlIG11bHRpcGxlIG9wcyBwZXIgbGluZTsKKyMKKyMgRHVhbC1BQkkgc3R5bGluZyBydWxlcy4KKyMKKyMgMS4gQWRoZXJlIHRvIFVuaXggcmVnaXN0ZXIgYW5kIHN0YWNrIGxheW91dCBbc2VlIGNyb3NzLXJlZmVyZW5jZQorIyAgICBBQkkgImNhcmQiIGF0IHRoZSBlbmQgZm9yIGV4cGxhbmF0aW9uXS4KKyMgMi4gRm9yZ2V0IGFib3V0ICJyZWQgem9uZSwiIHN0aWNrIHRvIG1vcmUgdHJhZGl0aW9uYWwgYmxlbmRlZAorIyAgICBzdGFjayBmcmFtZSBhbGxvY2F0aW9uLiBJZiB2b2xhdGlsZSBzdG9yYWdlIGlzIGFjdHVhbGx5IHJlcXVpcmVkCisjICAgIHRoYXQgaXMuIElmIG5vdCwganVzdCBsZWF2ZSB0aGUgc3RhY2sgYXMgaXMuCisjIDMuIEZ1bmN0aW9ucyB0YWdnZWQgd2l0aCAiLnR5cGUgbmFtZSxAZnVuY3Rpb24iIGdldCBjcmFmdGVkIHdpdGgKKyMgICAgdW5pZmllZCBXaW42NCBwcm9sb2d1ZSBhbmQgZXBpbG9ndWUgYXV0b21hdGljYWxseS4gSWYgeW91IHdhbnQKKyMgICAgdG8gdGFrZSBjYXJlIG9mIEFCSSBkaWZmZXJlbmNlcyB5b3Vyc2VsZiwgdGFnIGZ1bmN0aW9ucyBhcworIyAgICAiLnR5cGUgbmFtZSxAYWJpLW9tbmlwb3RlbnQiIGluc3RlYWQuCisjIDQuIFRvIG9wdGltaXplIHRoZSBXaW42NCBwcm9sb2d1ZSB5b3UgY2FuIHNwZWNpZnkgbnVtYmVyIG9mIGlucHV0CisjICAgIGFyZ3VtZW50cyBhcyAiLnR5cGUgbmFtZSxAZnVuY3Rpb24sTi4iIEtlZXAgaW4gbWluZCB0aGF0IGlmIE4gaXMKKyMgICAgbGFyZ2VyIHRoYW4gNiwgdGhlbiB5b3UgKmhhdmUgdG8qIHdyaXRlICJhYmktb21uaXBvdGVudCIgY29kZSwKKyMgICAgYmVjYXVzZSA+NiBjYXNlcyBjYW4ndCBiZSBhZGRyZXNzZWQgd2l0aCB1bmlmaWVkIHByb2xvZ3VlLgorIyA1LiBOYW1lIGxvY2FsIGxhYmVscyBhcyAuTCosIGRvICpub3QqIHVzZSBkeW5hbWljIGxhYmVscyBzdWNoIGFzIDE6CisjICAgIChzb3JyeSBhYm91dCBsYXR0ZXIpLgorIyA2LiBEb24ndCB1c2UgW29yIGhhbmQtY29kZSB3aXRoIC5ieXRlXSAicmVwIHJldC4iICJyZXQiIG1uZW1vbmljIGlzCisjICAgIHJlcXVpcmVkIHRvIGlkZW50aWZ5IHRoZSBzcG90cywgd2hlcmUgdG8gaW5qZWN0IFdpbjY0IGVwaWxvZ3VlIQorIyAgICBCdXQgb24gdGhlIHByb3MsIGl0J3MgdGhlbiBwcmVmaXhlZCB3aXRoIHJlcCBhdXRvbWF0aWNhbGx5Oi0pCisjIDcuIFN0aWNrIHRvIGV4cGxpY2l0IGlwLXJlbGF0aXZlIGFkZHJlc3NpbmcuIElmIHlvdSBoYXZlIHRvIHVzZQorIyAgICBHT1RQQ1JFTCBhZGRyZXNzaW5nLCBzdGljayB0byBtb3Ygc3ltYm9sQEdPVFBDUkVMKCVyaXApLCVyPz8uCisjICAgIEJvdGggYXJlIHJlY29nbml6ZWQgYW5kIHRyYW5zbGF0ZWQgdG8gcHJvcGVyIFdpbjY0IGFkZHJlc3NpbmcKKyMgICAgbW9kZXMuIFRvIHN1cHBvcnQgbGVnYWN5IGNvZGUgYSBzeW50aGV0aWMgZGlyZWN0aXZlLCAucGljbWV1cCwKKyMgICAgaXMgaW1wbGVtZW50ZWQuIEl0IHB1dHMgYWRkcmVzcyBvZiB0aGUgKm5leHQqIGluc3RydWN0aW9uIGludG8KKyMgICAgdGFyZ2V0IHJlZ2lzdGVyLCBlLmcuOgorIworIwkJLnBpY21ldXAJJXJheAorIwkJbGVhCQkuTGFiZWwtLiglcmF4KSwlcmF4CisjCisjIDguIEluIG9yZGVyIHRvIHByb3ZpZGUgZm9yIHN0cnVjdHVyZWQgZXhjZXB0aW9uIGhhbmRsaW5nIHVuaWZpZWQKKyMgICAgV2luNjQgcHJvbG9ndWUgY29waWVzICVyc3AgdmFsdWUgdG8gJXJheC4gRm9yIGZ1cnRoZXIgZGV0YWlscworIyAgICBzZWUgU0VIIHBhcmFncmFwaCBhdCB0aGUgZW5kLgorIyA5LiAuaW5pdCBzZWdtZW50IGlzIGFsbG93ZWQgdG8gY29udGFpbiBjYWxscyB0byBmdW5jdGlvbnMgb25seS4KKyMgYS4gSWYgZnVuY3Rpb24gYWNjZXB0cyBtb3JlIHRoYW4gNCBhcmd1bWVudHMgKmFuZCogPjR0aCBhcmd1bWVudAorIyAgICBpcyBkZWNsYXJlZCBhcyBub24gNjQtYml0IHZhbHVlLCBkbyBjbGVhciBpdHMgdXBwZXIgcGFydC4KKwwKK215ICRmbGF2b3VyID0gc2hpZnQ7CitteSAkb3V0cHV0ICA9IHNoaWZ0OworaWYgKCRmbGF2b3VyID1+IC9cLi8pIHsgJG91dHB1dCA9ICRmbGF2b3VyOyB1bmRlZiAkZmxhdm91cjsgfQorCitvcGVuIFNURE9VVCwiPiRvdXRwdXQiIHx8IGRpZSAiY2FuJ3Qgb3BlbiAkb3V0cHV0OiAkISIKKwlpZiAoZGVmaW5lZCgkb3V0cHV0KSk7CisKK215ICRnYXM9MTsJJGdhcz0wIGlmICgkb3V0cHV0ID1+IC9cLmFzbSQvKTsKK215ICRlbGY9MTsJJGVsZj0wIGlmICghJGdhcyk7CitteSAkd2luNjQ9MDsKK215ICRwcmVmaXg9IiI7CitteSAkZGVjb3I9Ii5MIjsKKworbXkgJG1hc21yZWY9OCArIDUwNzI3KjIqKi0zMjsJIyA4LjAwLjUwNzI3IHNoaXBwZWQgd2l0aCBWUzIwMDUKK215ICRtYXNtPTA7CitteSAkUFRSPSIgUFRSIjsKKworbXkgJG5hc21yZWY9Mi4wMzsKK215ICRuYXNtPTA7CisKK2lmICAgICgkZmxhdm91ciBlcSAibWluZ3c2NCIpCXsgJGdhcz0xOyAkZWxmPTA7ICR3aW42ND0xOworCQkJCSAgJHByZWZpeD1gZWNobyBfX1VTRVJfTEFCRUxfUFJFRklYX18gfCAkRU5We0NDfSAtRSAtUCAtYDsKKwkJCQkgIGNob21wKCRwcmVmaXgpOworCQkJCX0KK2Vsc2lmICgkZmxhdm91ciBlcSAibWFjb3N4IikJeyAkZ2FzPTE7ICRlbGY9MDsgJHByZWZpeD0iXyI7ICRkZWNvcj0iTFwkIjsgfQorZWxzaWYgKCRmbGF2b3VyIGVxICJtYXNtIikJeyAkZ2FzPTA7ICRlbGY9MDsgJG1hc209JG1hc21yZWY7ICR3aW42ND0xOyAkZGVjb3I9IlwkTFwkIjsgfQorZWxzaWYgKCRmbGF2b3VyIGVxICJuYXNtIikJeyAkZ2FzPTA7ICRlbGY9MDsgJG5hc209JG5hc21yZWY7ICR3aW42ND0xOyAkZGVjb3I9IlwkTFwkIjsgJFBUUj0iIjsgfQorZWxzaWYgKCEkZ2FzKQoreyAgIGlmICgkRU5We0FTTX0gPX4gbS9uYXNtLyAmJiBgbmFzbSAtdmAgPX4gbS92ZXJzaW9uIChbMC05XSspXC4oWzAtOV0rKS9pKQorICAgIHsJJG5hc20gPSAkMSArICQyKjAuMDE7ICRQVFI9IiI7ICB9CisgICAgZWxzaWYgKGBtbDY0IDI+JjFgID1+IG0vVmVyc2lvbiAoWzAtOV0rKVwuKFswLTldKykoXC4oWzAtOV0rKSk/LykKKyAgICB7CSRtYXNtID0gJDEgKyAkMioyKiotMTYgKyAkNCoyKiotMzI7ICAgfQorICAgIGRpZSAibm8gYXNzZW1ibGVyIGZvdW5kIG9uICVQQVRIIiBpZiAoISgkbmFzbSB8fCAkbWFzbSkpOworICAgICR3aW42ND0xOworICAgICRlbGY9MDsKKyAgICAkZGVjb3I9IlwkTFwkIjsKK30KKworbXkgJGN1cnJlbnRfc2VnbWVudDsKK215ICRjdXJyZW50X2Z1bmN0aW9uOworbXkgJWdsb2JhbHM7CisKK3sgcGFja2FnZSBvcGNvZGU7CSMgcGljayB1cCBvcGNvZGVzCisgICAgc3ViIHJlIHsKKwlteQkkc2VsZiA9IHNoaWZ0OwkjIHNpbmdsZSBpbnN0YW5jZSBpbiBlbm91Z2guLi4KKwlsb2NhbAkqbGluZSA9IHNoaWZ0OworCXVuZGVmCSRyZXQ7CisKKwlpZiAoJGxpbmUgPX4gL14oW2Etel1bYS16MC05XSopL2kpIHsKKwkgICAgJHNlbGYtPntvcH0gPSAkMTsKKwkgICAgJHJldCA9ICRzZWxmOworCSAgICAkbGluZSA9IHN1YnN0cigkbGluZSxAK1swXSk7ICRsaW5lID1+IHMvXlxzKy8vOworCisJICAgIHVuZGVmICRzZWxmLT57c3p9OworCSAgICB1bmRlZiAkc2VsZi0+e2FyZ19zen07CisJICAgIGlmICgkc2VsZi0+e29wfSA9fiAvXihtb3Z6KXg/KFtid10pLiovKSB7CSMgbW92eiBpcyBwYWluLi4uCisJCSRzZWxmLT57b3B9ID0gJDE7CisJCSRzZWxmLT57c3p9ID0gJDI7CisJICAgIH0gZWxzaWYgKCRzZWxmLT57b3B9ID1+IC9jYWxsfGptcC8pIHsKKwkJJHNlbGYtPntzen0gPSAiIjsKKwkgICAgfSBlbHNpZiAoJHNlbGYtPntvcH0gPX4gL15wLyAmJiAkJyAhfiAvXih1c2h8b3B8aW5zcncpLykgeyAjIFNTRW4KKwkJJHNlbGYtPntzen0gPSAiIjsKKwkgICAgfSBlbHNpZiAoJHNlbGYtPntvcH0gZXEgInZwYnJvYWRjYXN0cSIpIHsKKwkJJHNlbGYtPnthcmdfc3p9ID0gInEiOworCSAgICB9IGVsc2lmICgkc2VsZi0+e29wfSBlcSAidnBicm9hZGNhc3RiIikgeworCQkkc2VsZi0+e2FyZ19zen0gPSAiYiI7CisJICAgIH0gZWxzaWYgKCRzZWxmLT57b3B9ID1+IC9edmluc2VydGkxMjgvKSB7CisJCSRzZWxmLT57YXJnX3N6fSA9ICJ4IjsKKwkgICAgfSBlbHNpZiAoJHNlbGYtPntvcH0gPX4gL152LykgeyAjIFZFWAorCQkkc2VsZi0+e3N6fSA9ICIiOworCSAgICB9IGVsc2lmICgkc2VsZi0+e29wfSA9fiAvbW92cS8gJiYgJGxpbmUgPX4gLyV4bW0vKSB7CisJCSRzZWxmLT57c3p9ID0gIiI7CisJICAgIH0gZWxzaWYgKCRzZWxmLT57b3B9ID1+IC8oW2Etel17Myx9KShbcWx3Yl0pJC8pIHsKKwkJJHNlbGYtPntvcH0gPSAkMTsKKwkJJHNlbGYtPntzen0gPSAkMjsKKwkgICAgfQorCX0KKwkkcmV0OworICAgIH0KKyAgICBzdWIgc2l6ZSB7CisJbXkgJHNlbGYgPSBzaGlmdDsKKwlteSAkc3ogICA9IHNoaWZ0OworCSRzZWxmLT57c3p9ID0gJHN6IGlmIChkZWZpbmVkKCRzeikgJiYgIWRlZmluZWQoJHNlbGYtPntzen0pKTsKKwkkc2VsZi0+e3N6fTsKKyAgICB9CisgICAgc3ViIGFyZ19zaXplIHsKKwlteSAkc2VsZiA9IHNoaWZ0OworCSRzZWxmLT57YXJnX3N6fTsKKyAgICB9CisgICAgc3ViIG91dCB7CisJbXkgJHNlbGYgPSBzaGlmdDsKKwlpZiAoJGdhcykgeworCSAgICBpZiAoJHNlbGYtPntvcH0gZXEgIm1vdnoiKSB7CSMgbW92eiBpcyBwYWluLi4uCisJCXNwcmludGYgIiVzJXMlcyIsJHNlbGYtPntvcH0sJHNlbGYtPntzen0sc2hpZnQ7CisJICAgIH0gZWxzaWYgKCRzZWxmLT57b3B9ID1+IC9ec2V0LykgeyAKKwkJIiRzZWxmLT57b3B9IjsKKwkgICAgfSBlbHNpZiAoJHNlbGYtPntvcH0gZXEgInJldCIpIHsKKwkJbXkgJGVwaWxvZ3VlID0gIiI7CisJCWlmICgkd2luNjQgJiYgJGN1cnJlbnRfZnVuY3Rpb24tPnthYml9IGVxICJzdnI0IikgeworCQkgICAgJGVwaWxvZ3VlID0gIm1vdnEJOCglcnNwKSwlcmRpXG5cdCIgLgorCQkJCSJtb3ZxCTE2KCVyc3ApLCVyc2lcblx0IjsKKwkJfQorCSAgICAJJGVwaWxvZ3VlIC4gIi5ieXRlCTB4ZjMsMHhjMyI7CisJICAgIH0gZWxzaWYgKCRzZWxmLT57b3B9IGVxICJjYWxsIiAmJiAhJGVsZiAmJiAkY3VycmVudF9zZWdtZW50IGVxICIuaW5pdCIpIHsKKwkJIi5wMmFsaWduXHQzXG5cdC5xdWFkIjsKKwkgICAgfSBlbHNlIHsKKwkJIiRzZWxmLT57b3B9JHNlbGYtPntzen0iOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgJHNlbGYtPntvcH0gPX4gcy9ebW92ei9tb3Z6eC87CisJICAgIGlmICgkc2VsZi0+e29wfSBlcSAicmV0IikgeworCQkkc2VsZi0+e29wfSA9ICIiOworCQlpZiAoJHdpbjY0ICYmICRjdXJyZW50X2Z1bmN0aW9uLT57YWJpfSBlcSAic3ZyNCIpIHsKKwkJICAgICRzZWxmLT57b3B9ID0gIm1vdglyZGksUVdPUkQke1BUUn1bOCtyc3BdXHQ7V0lONjQgZXBpbG9ndWVcblx0Ii4KKwkJCQkgICJtb3YJcnNpLFFXT1JEJHtQVFJ9WzE2K3JzcF1cblx0IjsKKwkgICAgCX0KKwkJJHNlbGYtPntvcH0gLj0gIkRCXHQwRjNoLDBDM2hcdFx0O3JlcHJldCI7CisJICAgIH0gZWxzaWYgKCRzZWxmLT57b3B9ID1+IC9eKHBvcHxwdXNoKWYvKSB7CisJCSRzZWxmLT57b3B9IC49ICRzZWxmLT57c3p9OworCSAgICB9IGVsc2lmICgkc2VsZi0+e29wfSBlcSAiY2FsbCIgJiYgJGN1cnJlbnRfc2VnbWVudCBlcSAiLkNSVFwkWENVIikgeworCQkkc2VsZi0+e29wfSA9ICJcdERRIjsKKwkgICAgfSAKKwkgICAgJHNlbGYtPntvcH07CisJfQorICAgIH0KKyAgICBzdWIgbW5lbW9uaWMgeworCW15ICRzZWxmPXNoaWZ0OworCW15ICRvcD1zaGlmdDsKKwkkc2VsZi0+e29wfT0kb3AgaWYgKGRlZmluZWQoJG9wKSk7CisJJHNlbGYtPntvcH07CisgICAgfQorfQoreyBwYWNrYWdlIGNvbnN0OwkjIHBpY2sgdXAgY29uc3RhbnRzLCB3aGljaCBzdGFydCB3aXRoICQKKyAgICBzdWIgcmUgeworCW15CSRzZWxmID0gc2hpZnQ7CSMgc2luZ2xlIGluc3RhbmNlIGluIGVub3VnaC4uLgorCWxvY2FsCSpsaW5lID0gc2hpZnQ7CisJdW5kZWYJJHJldDsKKworCWlmICgkbGluZSA9fiAvXlwkKFteLF0rKS8pIHsKKwkgICAgJHNlbGYtPnt2YWx1ZX0gPSAkMTsKKwkgICAgJHJldCA9ICRzZWxmOworCSAgICAkbGluZSA9IHN1YnN0cigkbGluZSxAK1swXSk7ICRsaW5lID1+IHMvXlxzKy8vOworCX0KKwkkcmV0OworICAgIH0KKyAgICBzdWIgb3V0IHsKKyAgICAJbXkgJHNlbGYgPSBzaGlmdDsKKworCWlmICgkZ2FzKSB7CisJICAgICMgU29sYXJpcyAvdXNyL2Njcy9iaW4vYXMgY2FuJ3QgaGFuZGxlIG11bHRpcGxpY2F0aW9ucworCSAgICAjIGluICRzZWxmLT57dmFsdWV9CisJICAgICRzZWxmLT57dmFsdWV9ID1+IHMvKD88IVtcd1wkXC5dKSgweD9bMC05YS1mXSspL29jdCgkMSkvZWdpOworCSAgICAkc2VsZi0+e3ZhbHVlfSA9fiBzLyhbMC05XStccypbXCpcL1wlXVxzKlswLTldKykvZXZhbCgkMSkvZWc7CisJICAgIHNwcmludGYgIlwkJXMiLCRzZWxmLT57dmFsdWV9OworCX0gZWxzZSB7CisJICAgICRzZWxmLT57dmFsdWV9ID1+IHMvKDBiWzAtMV0rKS9vY3QoJDEpL2VpZzsKKwkgICAgJHNlbGYtPnt2YWx1ZX0gPX4gcy8weChbMC05YS1mXSspLzAkMWgvaWcgaWYgKCRtYXNtKTsKKwkgICAgc3ByaW50ZiAiJXMiLCRzZWxmLT57dmFsdWV9OworCX0KKyAgICB9Cit9Cit7IHBhY2thZ2UgZWE7CQkjIHBpY2sgdXAgZWZmZWN0aXZlIGFkZHJlc3NlczogZXhwciglcmVnLCVyZWcsc2NhbGUpCisgICAgc3ViIHJlIHsKKwlteQkkc2VsZiA9IHNoaWZ0OwkjIHNpbmdsZSBpbnN0YW5jZSBpbiBlbm91Z2guLi4KKwlsb2NhbAkqbGluZSA9IHNoaWZ0OworCXVuZGVmCSRyZXQ7CisKKwkjIG9wdGlvbmFsICogLS0tdnZ2LS0tIGFwcGVhcnMgaW4gaW5kaXJlY3Qgam1wL2NhbGwKKwlpZiAoJGxpbmUgPX4gL14oXCo/KShbXlwoLF0qKVwoKFslXHcsXSspXCkvKSB7CisJICAgICRzZWxmLT57YXN0ZXJpc2t9ID0gJDE7CisJICAgICRzZWxmLT57bGFiZWx9ID0gJDI7CisJICAgICgkc2VsZi0+e2Jhc2V9LCRzZWxmLT57aW5kZXh9LCRzZWxmLT57c2NhbGV9KT1zcGxpdCgvLC8sJDMpOworCSAgICAkc2VsZi0+e3NjYWxlfSA9IDEgaWYgKCFkZWZpbmVkKCRzZWxmLT57c2NhbGV9KSk7CisJICAgICRyZXQgPSAkc2VsZjsKKwkgICAgJGxpbmUgPSBzdWJzdHIoJGxpbmUsQCtbMF0pOyAkbGluZSA9fiBzL15ccysvLzsKKworCSAgICBpZiAoJHdpbjY0ICYmICRzZWxmLT57bGFiZWx9ID1+IHMvXEBHT1RQQ1JFTC8vKSB7CisJCWRpZSBpZiAob3Bjb2RlLT5tbmVtb25pYygpIG5lICJtb3YiKTsKKwkJb3Bjb2RlLT5tbmVtb25pYygibGVhIik7CisJICAgIH0KKwkgICAgJHNlbGYtPntiYXNlfSAgPX4gcy9eJS8vOworCSAgICAkc2VsZi0+e2luZGV4fSA9fiBzL14lLy8gaWYgKGRlZmluZWQoJHNlbGYtPntpbmRleH0pKTsKKwl9CisJJHJldDsKKyAgICB9CisgICAgc3ViIHNpemUge30KKyAgICBzdWIgb3V0IHsKKyAgICAJbXkgJHNlbGYgPSBzaGlmdDsKKwlteSAkc3ogPSBzaGlmdDsKKworCSRzZWxmLT57bGFiZWx9ID1+IHMvKFtfYS16XVtfYS16MC05XSopLyRnbG9iYWxzeyQxfSBvciAkMS9nZWk7CisJJHNlbGYtPntsYWJlbH0gPX4gcy9cLkwvJGRlY29yL2c7CisKKwkjIFNpbGVudGx5IGNvbnZlcnQgYWxsIEVBcyB0byA2NC1iaXQuIFRoaXMgaXMgcmVxdWlyZWQgZm9yCisJIyBlbGRlciBHTlUgYXNzZW1ibGVyIGFuZCByZXN1bHRzIGluIG1vcmUgY29tcGFjdCBjb2RlLAorCSMgKmJ1dCogbW9zdCBpbXBvcnRhbnRseSBBRVMgbW9kdWxlIGRlcGVuZHMgb24gdGhpcyBmZWF0dXJlIQorCSRzZWxmLT57aW5kZXh9ID1+IHMvXltlcl0oLj9bMC05eHBpXSlbZF0/JC9yXDEvOworCSRzZWxmLT57YmFzZX0gID1+IHMvXltlcl0oLj9bMC05eHBpXSlbZF0/JC9yXDEvOworCisJIyBTb2xhcmlzIC91c3IvY2NzL2Jpbi9hcyBjYW4ndCBoYW5kbGUgbXVsdGlwbGljYXRpb25zCisJIyBpbiAkc2VsZi0+e2xhYmVsfSwgbmV3IGdhcyByZXF1aXJlcyBzaWduIGV4dGVuc2lvbi4uLgorCXVzZSBpbnRlZ2VyOworCSRzZWxmLT57bGFiZWx9ID1+IHMvKD88IVtcd1wkXC5dKSgweD9bMC05YS1mXSspL29jdCgkMSkvZWdpOworCSRzZWxmLT57bGFiZWx9ID1+IHMvXGIoWzAtOV0rXHMqW1wqXC9cJV1ccypbMC05XSspXGIvZXZhbCgkMSkvZWc7CisJJHNlbGYtPntsYWJlbH0gPX4gcy9cYihbMC05XSspXGIvJDE8PDMyPj4zMi9lZzsKKworCWlmICghJHNlbGYtPntsYWJlbH0gJiYgJHNlbGYtPntpbmRleH0gJiYgJHNlbGYtPntzY2FsZX09PTEgJiYKKwkgICAgJHNlbGYtPntiYXNlfSA9fiAvKHJicHxyMTMpLykgeworCQkkc2VsZi0+e2Jhc2V9ID0gJHNlbGYtPntpbmRleH07ICRzZWxmLT57aW5kZXh9ID0gJDE7CisJfQorCisJaWYgKCRnYXMpIHsKKwkgICAgJHNlbGYtPntsYWJlbH0gPX4gcy9eX19faW1wXy9fX2ltcF9fLyAgIGlmICgkZmxhdm91ciBlcSAibWluZ3c2NCIpOworCisJICAgIGlmIChkZWZpbmVkKCRzZWxmLT57aW5kZXh9KSkgeworCQlzcHJpbnRmICIlcyVzKCVzLCUlJXMsJWQpIiwkc2VsZi0+e2FzdGVyaXNrfSwKKwkJCQkJJHNlbGYtPntsYWJlbH0sCisJCQkJCSRzZWxmLT57YmFzZX0/IiUkc2VsZi0+e2Jhc2V9IjoiIiwKKwkJCQkJJHNlbGYtPntpbmRleH0sJHNlbGYtPntzY2FsZX07CisJICAgIH0gZWxzZSB7CisJCXNwcmludGYgIiVzJXMoJSUlcykiLAkkc2VsZi0+e2FzdGVyaXNrfSwkc2VsZi0+e2xhYmVsfSwkc2VsZi0+e2Jhc2V9OworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgJXN6bWFwID0gKAliPT4iQllURSRQVFIiLCB3PT4iV09SRCRQVFIiLCBsPT4iRFdPUkQkUFRSIiwKKwkgICAgCQlxPT4iUVdPUkQkUFRSIixvPT4iT1dPUkQkUFRSIix4PT4iWE1NV09SRCRQVFIiLAorCQkJeT0+IllNTVdPUkQkUFRSIiApOworCisJICAgICRzZWxmLT57bGFiZWx9ID1+IHMvXC4vXCQvZzsKKwkgICAgJHNlbGYtPntsYWJlbH0gPX4gcy8oPzwhW1x3XCRcLl0pMHgoWzAtOWEtZl0rKS8wJDFoL2lnOworCSAgICAkc2VsZi0+e2xhYmVsfSA9ICIoJHNlbGYtPntsYWJlbH0pIiBpZiAoJHNlbGYtPntsYWJlbH0gPX4gL1tcKlwrXC1cL10vKTsKKwkgICAgJHN6PSJxIiBpZiAoJHNlbGYtPnthc3Rlcmlza30gfHwgb3Bjb2RlLT5tbmVtb25pYygpID1+IC9edj9tb3ZxJC8pOworCSAgICAkc3o9ImwiIGlmIChvcGNvZGUtPm1uZW1vbmljKCkgPX4gL152P21vdmQkLyk7CisKKwkgICAgaWYgKGRlZmluZWQoJHNlbGYtPntpbmRleH0pKSB7CisJCXNwcmludGYgIiVzWyVzJXMqJWQlc10iLCRzem1hcHskc3p9LAorCQkJCQkkc2VsZi0+e2xhYmVsfT8iJHNlbGYtPntsYWJlbH0rIjoiIiwKKwkJCQkJJHNlbGYtPntpbmRleH0sJHNlbGYtPntzY2FsZX0sCisJCQkJCSRzZWxmLT57YmFzZX0/Iiskc2VsZi0+e2Jhc2V9IjoiIjsKKwkgICAgfSBlbHNpZiAoJHNlbGYtPntiYXNlfSBlcSAicmlwIikgeworCQlzcHJpbnRmICIlc1slc10iLCRzem1hcHskc3p9LCRzZWxmLT57bGFiZWx9OworCSAgICB9IGVsc2UgeworCQlzcHJpbnRmICIlc1slcyVzXSIsJHN6bWFweyRzen0sCisJCQkJCSRzZWxmLT57bGFiZWx9PyIkc2VsZi0+e2xhYmVsfSsiOiIiLAorCQkJCQkkc2VsZi0+e2Jhc2V9OworCSAgICB9CisJfQorICAgIH0KK30KK3sgcGFja2FnZSByZWdpc3RlcjsJIyBwaWNrIHVwIHJlZ2lzdGVycywgd2hpY2ggc3RhcnQgd2l0aCAlLgorICAgIHN1YiByZSB7CisJbXkJJGNsYXNzID0gc2hpZnQ7CSMgbXVsaXBsZSBpbnN0YW5jZXMuLi4KKwlteQkkc2VsZiA9IHt9OworCWxvY2FsCSpsaW5lID0gc2hpZnQ7CisJdW5kZWYJJHJldDsKKworCSMgb3B0aW9uYWwgKiAtLS12dnYtLS0gYXBwZWFycyBpbiBpbmRpcmVjdCBqbXAvY2FsbAorCWlmICgkbGluZSA9fiAvXihcKj8pJShcdyspLykgeworCSAgICBibGVzcyAkc2VsZiwkY2xhc3M7CisJICAgICRzZWxmLT57YXN0ZXJpc2t9ID0gJDE7CisJICAgICRzZWxmLT57dmFsdWV9ID0gJDI7CisJICAgICRyZXQgPSAkc2VsZjsKKwkgICAgJGxpbmUgPSBzdWJzdHIoJGxpbmUsQCtbMF0pOyAkbGluZSA9fiBzL15ccysvLzsKKwl9CisJJHJldDsKKyAgICB9CisgICAgc3ViIHNpemUgeworCW15CSRzZWxmID0gc2hpZnQ7CisJdW5kZWYJJHJldDsKKworCWlmICAgICgkc2VsZi0+e3ZhbHVlfSA9fiAvXnJbXGRdK2IkL2kpCXsgJHJldD0iYiI7IH0KKwllbHNpZiAoJHNlbGYtPnt2YWx1ZX0gPX4gL15yW1xkXSt3JC9pKQl7ICRyZXQ9InciOyB9CisJZWxzaWYgKCRzZWxmLT57dmFsdWV9ID1+IC9ecltcZF0rZCQvaSkJeyAkcmV0PSJsIjsgfQorCWVsc2lmICgkc2VsZi0+e3ZhbHVlfSA9fiAvXnJbXHddKyQvaSkJeyAkcmV0PSJxIjsgfQorCWVsc2lmICgkc2VsZi0+e3ZhbHVlfSA9fiAvXlthLWRdW2hsXSQvaSl7ICRyZXQ9ImIiOyB9CisJZWxzaWYgKCRzZWxmLT57dmFsdWV9ID1+IC9eW1x3XXsyfWwkL2kpCXsgJHJldD0iYiI7IH0KKwllbHNpZiAoJHNlbGYtPnt2YWx1ZX0gPX4gL15bXHddezJ9JC9pKQl7ICRyZXQ9InciOyB9CisJZWxzaWYgKCRzZWxmLT57dmFsdWV9ID1+IC9eZVthLXpdezJ9JC9pKXsgJHJldD0ibCI7IH0KKworCSRyZXQ7CisgICAgfQorICAgIHN1YiBvdXQgeworICAgIAlteSAkc2VsZiA9IHNoaWZ0OworCWlmICgkZ2FzKQl7IHNwcmludGYgIiVzJSUlcyIsJHNlbGYtPnthc3Rlcmlza30sJHNlbGYtPnt2YWx1ZX07IH0KKwllbHNlCQl7ICRzZWxmLT57dmFsdWV9OyB9CisgICAgfQorfQoreyBwYWNrYWdlIGxhYmVsOwkjIHBpY2sgdXAgbGFiZWxzLCB3aGljaCBlbmQgd2l0aCA6CisgICAgc3ViIHJlIHsKKwlteQkkc2VsZiA9IHNoaWZ0OwkjIHNpbmdsZSBpbnN0YW5jZSBpcyBlbm91Z2guLi4KKwlsb2NhbAkqbGluZSA9IHNoaWZ0OworCXVuZGVmCSRyZXQ7CisKKwlpZiAoJGxpbmUgPX4gLyheW1wuXHddKylcOi8pIHsKKwkgICAgJHNlbGYtPnt2YWx1ZX0gPSAkMTsKKwkgICAgJHJldCA9ICRzZWxmOworCSAgICAkbGluZSA9IHN1YnN0cigkbGluZSxAK1swXSk7ICRsaW5lID1+IHMvXlxzKy8vOworCisJICAgICRzZWxmLT57dmFsdWV9ID1+IHMvXlwuTC8kZGVjb3IvOworCX0KKwkkcmV0OworICAgIH0KKyAgICBzdWIgb3V0IHsKKwlteSAkc2VsZiA9IHNoaWZ0OworCisJaWYgKCRnYXMpIHsKKwkgICAgbXkgJGZ1bmMgPSAoJGdsb2JhbHN7JHNlbGYtPnt2YWx1ZX19IG9yICRzZWxmLT57dmFsdWV9KSAuICI6IjsKKwkgICAgaWYgKCR3aW42NAkmJgorCQkJJGN1cnJlbnRfZnVuY3Rpb24tPntuYW1lfSBlcSAkc2VsZi0+e3ZhbHVlfSAmJgorCQkJJGN1cnJlbnRfZnVuY3Rpb24tPnthYml9IGVxICJzdnI0IikgeworCQkkZnVuYyAuPSAiXG4iOworCQkkZnVuYyAuPSAiCW1vdnEJJXJkaSw4KCVyc3ApXG4iOworCQkkZnVuYyAuPSAiCW1vdnEJJXJzaSwxNiglcnNwKVxuIjsKKwkJJGZ1bmMgLj0gIgltb3ZxCSVyc3AsJXJheFxuIjsKKwkJJGZ1bmMgLj0gIiR7ZGVjb3J9U0VIX2JlZ2luXyRjdXJyZW50X2Z1bmN0aW9uLT57bmFtZX06XG4iOworCQlteSAkbmFyZyA9ICRjdXJyZW50X2Z1bmN0aW9uLT57bmFyZ307CisJCSRuYXJnPTYgaWYgKCFkZWZpbmVkKCRuYXJnKSk7CisJCSRmdW5jIC49ICIJbW92cQklcmN4LCVyZGlcbiIgaWYgKCRuYXJnPjApOworCQkkZnVuYyAuPSAiCW1vdnEJJXJkeCwlcnNpXG4iIGlmICgkbmFyZz4xKTsKKwkJJGZ1bmMgLj0gIgltb3ZxCSVyOCwlcmR4XG4iICBpZiAoJG5hcmc+Mik7CisJCSRmdW5jIC49ICIJbW92cQklcjksJXJjeFxuIiAgaWYgKCRuYXJnPjMpOworCQkkZnVuYyAuPSAiCW1vdnEJNDAoJXJzcCksJXI4XG4iIGlmICgkbmFyZz40KTsKKwkJJGZ1bmMgLj0gIgltb3ZxCTQ4KCVyc3ApLCVyOVxuIiBpZiAoJG5hcmc+NSk7CisJICAgIH0KKwkgICAgJGZ1bmM7CisJfSBlbHNpZiAoJHNlbGYtPnt2YWx1ZX0gbmUgIiRjdXJyZW50X2Z1bmN0aW9uLT57bmFtZX0iKSB7CisJICAgICRzZWxmLT57dmFsdWV9IC49ICI6IiBpZiAoJG1hc20gJiYgJHJldCF+bS9eXCQvKTsKKwkgICAgJHNlbGYtPnt2YWx1ZX0gLiAiOiI7CisJfSBlbHNpZiAoJHdpbjY0ICYmICRjdXJyZW50X2Z1bmN0aW9uLT57YWJpfSBlcSAic3ZyNCIpIHsKKwkgICAgbXkgJGZ1bmMgPQkiJGN1cnJlbnRfZnVuY3Rpb24tPntuYW1lfSIgLgorCQkJKCRuYXNtID8gIjoiIDogIlx0UFJPQyAkY3VycmVudF9mdW5jdGlvbi0+e3Njb3BlfSIpIC4KKwkJCSJcbiI7CisJICAgICRmdW5jIC49ICIJbW92CVFXT1JEJHtQVFJ9WzgrcnNwXSxyZGlcdDtXSU42NCBwcm9sb2d1ZVxuIjsKKwkgICAgJGZ1bmMgLj0gIgltb3YJUVdPUkQke1BUUn1bMTYrcnNwXSxyc2lcbiI7CisJICAgICRmdW5jIC49ICIJbW92CXJheCxyc3BcbiI7CisJICAgICRmdW5jIC49ICIke2RlY29yfVNFSF9iZWdpbl8kY3VycmVudF9mdW5jdGlvbi0+e25hbWV9OiI7CisJICAgICRmdW5jIC49ICI6IiBpZiAoJG1hc20pOworCSAgICAkZnVuYyAuPSAiXG4iOworCSAgICBteSAkbmFyZyA9ICRjdXJyZW50X2Z1bmN0aW9uLT57bmFyZ307CisJICAgICRuYXJnPTYgaWYgKCFkZWZpbmVkKCRuYXJnKSk7CisJICAgICRmdW5jIC49ICIJbW92CXJkaSxyY3hcbiIgaWYgKCRuYXJnPjApOworCSAgICAkZnVuYyAuPSAiCW1vdglyc2kscmR4XG4iIGlmICgkbmFyZz4xKTsKKwkgICAgJGZ1bmMgLj0gIgltb3YJcmR4LHI4XG4iICBpZiAoJG5hcmc+Mik7CisJICAgICRmdW5jIC49ICIJbW92CXJjeCxyOVxuIiAgaWYgKCRuYXJnPjMpOworCSAgICAkZnVuYyAuPSAiCW1vdglyOCxRV09SRCR7UFRSfVs0MCtyc3BdXG4iIGlmICgkbmFyZz40KTsKKwkgICAgJGZ1bmMgLj0gIgltb3YJcjksUVdPUkQke1BUUn1bNDgrcnNwXVxuIiBpZiAoJG5hcmc+NSk7CisJICAgICRmdW5jIC49ICJcbiI7CisJfSBlbHNlIHsKKwkgICAiJGN1cnJlbnRfZnVuY3Rpb24tPntuYW1lfSIuCisJCQkoJG5hc20gPyAiOiIgOiAiXHRQUk9DICRjdXJyZW50X2Z1bmN0aW9uLT57c2NvcGV9Iik7CisJfQorICAgIH0KK30KK3sgcGFja2FnZSBleHByOwkJIyBwaWNrIHVwIGV4cHJlc3Npb2lucworICAgIHN1YiByZSB7CisJbXkJJHNlbGYgPSBzaGlmdDsJIyBzaW5nbGUgaW5zdGFuY2UgaXMgZW5vdWdoLi4uCisJbG9jYWwJKmxpbmUgPSBzaGlmdDsKKwl1bmRlZgkkcmV0OworCisJaWYgKCRsaW5lID1+IC8oXlteLF0rKS8pIHsKKwkgICAgJHNlbGYtPnt2YWx1ZX0gPSAkMTsKKwkgICAgJHJldCA9ICRzZWxmOworCSAgICAkbGluZSA9IHN1YnN0cigkbGluZSxAK1swXSk7ICRsaW5lID1+IHMvXlxzKy8vOworCisJICAgICRzZWxmLT57dmFsdWV9ID1+IHMvXEBQTFQvLyBpZiAoISRlbGYpOworCSAgICAkc2VsZi0+e3ZhbHVlfSA9fiBzLyhbX2Etel1bX2EtejAtOV0qKS8kZ2xvYmFsc3skMX0gb3IgJDEvZ2VpOworCSAgICAkc2VsZi0+e3ZhbHVlfSA9fiBzL1wuTC8kZGVjb3IvZzsKKwl9CisJJHJldDsKKyAgICB9CisgICAgc3ViIG91dCB7CisJbXkgJHNlbGYgPSBzaGlmdDsKKwlpZiAoJG5hc20gJiYgb3Bjb2RlLT5tbmVtb25pYygpPX5tL15qKD8hW3JlXWN4eikvKSB7CisJICAgICJORUFSICIuJHNlbGYtPnt2YWx1ZX07CisJfSBlbHNlIHsKKwkgICAgJHNlbGYtPnt2YWx1ZX07CisJfQorICAgIH0KK30KK3sgcGFja2FnZSBkaXJlY3RpdmU7CSMgcGljayB1cCBkaXJlY3RpdmVzLCB3aGljaCBzdGFydCB3aXRoIC4KKyAgICBzdWIgcmUgeworCW15CSRzZWxmID0gc2hpZnQ7CSMgc2luZ2xlIGluc3RhbmNlIGlzIGVub3VnaC4uLgorCWxvY2FsCSpsaW5lID0gc2hpZnQ7CisJdW5kZWYJJHJldDsKKwlteQkkZGlyOworCW15CSVvcGNvZGUgPQkjIGxlYSAyZi0xZiglcmlwKSwlZHN0OyAxOiBub3A7IDI6CisJCSgJIiVyYXgiPT4weDAxMDU4ZDQ4LAkiJXJjeCI9PjB4MDEwZDhkNDgsCisJCQkiJXJkeCI9PjB4MDExNThkNDgsCSIlcmJ4Ij0+MHgwMTFkOGQ0OCwKKwkJCSIlcnNwIj0+MHgwMTI1OGQ0OCwJIiVyYnAiPT4weDAxMmQ4ZDQ4LAorCQkJIiVyc2kiPT4weDAxMzU4ZDQ4LAkiJXJkaSI9PjB4MDEzZDhkNDgsCisJCQkiJXI4IiA9PjB4MDEwNThkNGMsCSIlcjkiID0+MHgwMTBkOGQ0YywKKwkJCSIlcjEwIj0+MHgwMTE1OGQ0YywJIiVyMTEiPT4weDAxMWQ4ZDRjLAorCQkJIiVyMTIiPT4weDAxMjU4ZDRjLAkiJXIxMyI9PjB4MDEyZDhkNGMsCisJCQkiJXIxNCI9PjB4MDEzNThkNGMsCSIlcjE1Ij0+MHgwMTNkOGQ0YwkpOworCisJaWYgKCRsaW5lID1+IC9eXHMqKFwuXHcrKS8pIHsKKwkgICAgJGRpciA9ICQxOworCSAgICAkcmV0ID0gJHNlbGY7CisJICAgIHVuZGVmICRzZWxmLT57dmFsdWV9OworCSAgICAkbGluZSA9IHN1YnN0cigkbGluZSxAK1swXSk7ICRsaW5lID1+IHMvXlxzKy8vOworCisJICAgIFNXSVRDSDogZm9yICgkZGlyKSB7CisJCS9cLnBpY21ldXAvICYmIGRvIHsgaWYgKCRsaW5lID1+IC8oJXJbXHddKykvaSkgeworCQkJICAgIAkJJGRpcj0iXHQubG9uZyI7CisJCQkJCSRsaW5lPXNwcmludGYgIjB4JXgsMHg5MDAwMDAwMCIsJG9wY29kZXskMX07CisJCQkJICAgIH0KKwkJCQkgICAgbGFzdDsKKwkJCQkgIH07CisJCS9cLmdsb2JhbHxcLmdsb2JsfFwuZXh0ZXJuLworCQkJICAgICYmIGRvIHsgJGdsb2JhbHN7JGxpbmV9ID0gJHByZWZpeCAuICRsaW5lOworCQkJCSAgICAkbGluZSA9ICRnbG9iYWxzeyRsaW5lfSBpZiAoJHByZWZpeCk7CisJCQkJICAgIGxhc3Q7CisJCQkJICB9OworCQkvXC50eXBlLyAgICAmJiBkbyB7ICgkc3ltLCR0eXBlLCRuYXJnKSA9IHNwbGl0KCcsJywkbGluZSk7CisJCQkJICAgIGlmICgkdHlwZSBlcSAiXEBmdW5jdGlvbiIpIHsKKwkJCQkJdW5kZWYgJGN1cnJlbnRfZnVuY3Rpb247CisJCQkJCSRjdXJyZW50X2Z1bmN0aW9uLT57bmFtZX0gPSAkc3ltOworCQkJCQkkY3VycmVudF9mdW5jdGlvbi0+e2FiaX0gID0gInN2cjQiOworCQkJCQkkY3VycmVudF9mdW5jdGlvbi0+e25hcmd9ID0gJG5hcmc7CisJCQkJCSRjdXJyZW50X2Z1bmN0aW9uLT57c2NvcGV9ID0gZGVmaW5lZCgkZ2xvYmFsc3skc3ltfSk/IlBVQkxJQyI6IlBSSVZBVEUiOworCQkJCSAgICB9IGVsc2lmICgkdHlwZSBlcSAiXEBhYmktb21uaXBvdGVudCIpIHsKKwkJCQkJdW5kZWYgJGN1cnJlbnRfZnVuY3Rpb247CisJCQkJCSRjdXJyZW50X2Z1bmN0aW9uLT57bmFtZX0gPSAkc3ltOworCQkJCQkkY3VycmVudF9mdW5jdGlvbi0+e3Njb3BlfSA9IGRlZmluZWQoJGdsb2JhbHN7JHN5bX0pPyJQVUJMSUMiOiJQUklWQVRFIjsKKwkJCQkgICAgfQorCQkJCSAgICAkbGluZSA9fiBzL1xAYWJpXC1vbW5pcG90ZW50L1xAZnVuY3Rpb24vOworCQkJCSAgICAkbGluZSA9fiBzL1xAZnVuY3Rpb24uKi9cQGZ1bmN0aW9uLzsKKwkJCQkgICAgbGFzdDsKKwkJCQkgIH07CisJCS9cLmFzY2l6LyAgICYmIGRvIHsgaWYgKCRsaW5lID1+IC9eIiguKikiJC8pIHsKKwkJCQkJJGRpciAgPSAiLmJ5dGUiOworCQkJCQkkbGluZSA9IGpvaW4oIiwiLHVucGFjaygiQyoiLCQxKSwwKTsKKwkJCQkgICAgfQorCQkJCSAgICBsYXN0OworCQkJCSAgfTsKKwkJL1wucnZhfFwubG9uZ3xcLnF1YWQvCisJCQkgICAgJiYgZG8geyAkbGluZSA9fiBzLyhbX2Etel1bX2EtejAtOV0qKS8kZ2xvYmFsc3skMX0gb3IgJDEvZ2VpOworCQkJCSAgICAkbGluZSA9fiBzL1wuTC8kZGVjb3IvZzsKKwkJCQkgICAgbGFzdDsKKwkJCQkgIH07CisJICAgIH0KKworCSAgICBpZiAoJGdhcykgeworCQkkc2VsZi0+e3ZhbHVlfSA9ICRkaXIgLiAiXHQiIC4gJGxpbmU7CisKKwkJaWYgKCRkaXIgPX4gL1wuZXh0ZXJuLykgeworCQkgICAgJHNlbGYtPnt2YWx1ZX0gPSAiIjsgIyBzd2FsbG93IGV4dGVybgorCQl9IGVsc2lmICghJGVsZiAmJiAkZGlyID1+IC9cLnR5cGUvKSB7CisJCSAgICAkc2VsZi0+e3ZhbHVlfSA9ICIiOworCQkgICAgJHNlbGYtPnt2YWx1ZX0gPSAiLmRlZlx0IiAuICgkZ2xvYmFsc3skMX0gb3IgJDEpIC4gIjtcdCIgLgorCQkJCShkZWZpbmVkKCRnbG9iYWxzeyQxfSk/Ii5zY2wgMjsiOiIuc2NsIDM7IikgLgorCQkJCSJcdC50eXBlIDMyO1x0LmVuZGVmIgorCQkJCWlmICgkd2luNjQgJiYgJGxpbmUgPX4gLyhbXixdKyksXEBmdW5jdGlvbi8pOworCQl9IGVsc2lmICghJGVsZiAmJiAkZGlyID1+IC9cLnNpemUvKSB7CisJCSAgICAkc2VsZi0+e3ZhbHVlfSA9ICIiOworCQkgICAgaWYgKGRlZmluZWQoJGN1cnJlbnRfZnVuY3Rpb24pKSB7CisJCQkkc2VsZi0+e3ZhbHVlfSAuPSAiJHtkZWNvcn1TRUhfZW5kXyRjdXJyZW50X2Z1bmN0aW9uLT57bmFtZX06IgorCQkJCWlmICgkd2luNjQgJiYgJGN1cnJlbnRfZnVuY3Rpb24tPnthYml9IGVxICJzdnI0Iik7CisJCQl1bmRlZiAkY3VycmVudF9mdW5jdGlvbjsKKwkJICAgIH0KKwkJfSBlbHNpZiAoISRlbGYgJiYgJGRpciA9fiAvXC5hbGlnbi8pIHsKKwkJICAgICRzZWxmLT57dmFsdWV9ID0gIi5wMmFsaWduXHQiIC4gKGxvZygkbGluZSkvbG9nKDIpKTsKKwkJfSBlbHNpZiAoJGRpciBlcSAiLnNlY3Rpb24iKSB7CisJCSAgICAkY3VycmVudF9zZWdtZW50PSRsaW5lOworCQkgICAgaWYgKCEkZWxmICYmICRjdXJyZW50X3NlZ21lbnQgZXEgIi5pbml0IikgeworCQkJaWYJKCRmbGF2b3VyIGVxICJtYWNvc3giKQl7ICRzZWxmLT57dmFsdWV9ID0gIi5tb2RfaW5pdF9mdW5jIjsgfQorCQkJZWxzaWYJKCRmbGF2b3VyIGVxICJtaW5ndzY0IikJeyAkc2VsZi0+e3ZhbHVlfSA9ICIuc2VjdGlvblx0LmN0b3JzIjsgfQorCQkgICAgfQorCQl9IGVsc2lmICgkZGlyID1+IC9cLih0ZXh0fGRhdGEpLykgeworCQkgICAgJGN1cnJlbnRfc2VnbWVudD0iLiQxIjsKKwkJfSBlbHNpZiAoJGRpciA9fiAvXC5oaWRkZW4vKSB7CisJCSAgICBpZiAgICAoJGZsYXZvdXIgZXEgIm1hY29zeCIpICB7ICRzZWxmLT57dmFsdWV9ID0gIi5wcml2YXRlX2V4dGVyblx0JHByZWZpeCRsaW5lIjsgfQorCQkgICAgZWxzaWYgKCRmbGF2b3VyIGVxICJtaW5ndzY0IikgeyAkc2VsZi0+e3ZhbHVlfSA9ICIiOyB9CisJCX0gZWxzaWYgKCRkaXIgPX4gL1wuY29tbS8pIHsKKwkJICAgICRzZWxmLT57dmFsdWV9ID0gIiRkaXJcdCRwcmVmaXgkbGluZSI7CisJCSAgICAkc2VsZi0+e3ZhbHVlfSA9fiBzfCwoWzAtOV0rKSwoWzAtOV0rKSR8IiwkMSwiLmxvZygkMikvbG9nKDIpfGUgaWYgKCRmbGF2b3VyIGVxICJtYWNvc3giKTsKKwkJfQorCQkkbGluZSA9ICIiOworCQlyZXR1cm4gJHNlbGY7CisJICAgIH0KKworCSAgICAjIG5vbi1nYXMgY2FzZSBvciBuYXNtL21hc20KKwkgICAgU1dJVENIOiBmb3IgKCRkaXIpIHsKKwkJL1wudGV4dC8gICAgJiYgZG8geyBteSAkdj11bmRlZjsKKwkJCQkgICAgaWYgKCRuYXNtKSB7CisJCQkJCSR2PSJzZWN0aW9uCS50ZXh0IGNvZGUgYWxpZ249NjRcbiI7CisJCQkJICAgIH0gZWxzZSB7CisJCQkJCSR2PSIkY3VycmVudF9zZWdtZW50XHRFTkRTXG4iIGlmICgkY3VycmVudF9zZWdtZW50KTsKKwkJCQkJJGN1cnJlbnRfc2VnbWVudCA9ICIudGV4dFwkIjsKKwkJCQkJJHYuPSIkY3VycmVudF9zZWdtZW50XHRTRUdNRU5UICI7CisJCQkJCSR2Lj0kbWFzbT49JG1hc21yZWYgPyAiQUxJR04oNjQpIiA6ICJQQUdFIjsKKwkJCQkJJHYuPSIgJ0NPREUnIjsKKwkJCQkgICAgfQorCQkJCSAgICAkc2VsZi0+e3ZhbHVlfSA9ICR2OworCQkJCSAgICBsYXN0OworCQkJCSAgfTsKKwkJL1wuZGF0YS8gICAgJiYgZG8geyBteSAkdj11bmRlZjsKKwkJCQkgICAgaWYgKCRuYXNtKSB7CisJCQkJCSR2PSJzZWN0aW9uCS5kYXRhIGRhdGEgYWxpZ249OFxuIjsKKwkJCQkgICAgfSBlbHNlIHsKKwkJCQkJJHY9IiRjdXJyZW50X3NlZ21lbnRcdEVORFNcbiIgaWYgKCRjdXJyZW50X3NlZ21lbnQpOworCQkJCQkkY3VycmVudF9zZWdtZW50ID0gIl9EQVRBIjsKKwkJCQkJJHYuPSIkY3VycmVudF9zZWdtZW50XHRTRUdNRU5UIjsKKwkJCQkgICAgfQorCQkJCSAgICAkc2VsZi0+e3ZhbHVlfSA9ICR2OworCQkJCSAgICBsYXN0OworCQkJCSAgfTsKKwkJL1wuc2VjdGlvbi8gJiYgZG8geyBteSAkdj11bmRlZjsKKwkJCQkgICAgJGxpbmUgPX4gcy8oW14sXSopLiovJDEvOworCQkJCSAgICAkbGluZSA9ICIuQ1JUXCRYQ1UiIGlmICgkbGluZSBlcSAiLmluaXQiKTsKKwkJCQkgICAgaWYgKCRuYXNtKSB7CisJCQkJCSR2PSJzZWN0aW9uCSRsaW5lIjsKKwkJCQkJaWYgKCRsaW5lPX4vXC4oW3B4XSlkYXRhLykgeworCQkJCQkgICAgJHYuPSIgcmRhdGEgYWxpZ249IjsKKwkJCQkJICAgICR2Lj0kMSBlcSAicCI/IDQgOiA4OworCQkJCQl9IGVsc2lmICgkbGluZT1+L1wuQ1JUXCQvaSkgeworCQkJCQkgICAgJHYuPSIgcmRhdGEgYWxpZ249OCI7CisJCQkJCX0KKwkJCQkgICAgfSBlbHNlIHsKKwkJCQkJJHY9IiRjdXJyZW50X3NlZ21lbnRcdEVORFNcbiIgaWYgKCRjdXJyZW50X3NlZ21lbnQpOworCQkJCQkkdi49IiRsaW5lXHRTRUdNRU5UIjsKKwkJCQkJaWYgKCRsaW5lPX4vXC4oW3B4XSlkYXRhLykgeworCQkJCQkgICAgJHYuPSIgUkVBRE9OTFkiOworCQkJCQkgICAgJHYuPSIgQUxJR04oIi4oJDEgZXEgInAiID8gNCA6IDgpLiIpIiBpZiAoJG1hc20+PSRtYXNtcmVmKTsKKwkJCQkJfSBlbHNpZiAoJGxpbmU9fi9cLkNSVFwkL2kpIHsKKwkJCQkJICAgICR2Lj0iIFJFQURPTkxZICI7CisJCQkJCSAgICAkdi49JG1hc20+PSRtYXNtcmVmID8gIkFMSUdOKDgpIiA6ICJEV09SRCI7CisJCQkJCX0KKwkJCQkgICAgfQorCQkJCSAgICAkY3VycmVudF9zZWdtZW50ID0gJGxpbmU7CisJCQkJICAgICRzZWxmLT57dmFsdWV9ID0gJHY7CisJCQkJICAgIGxhc3Q7CisJCQkJICB9OworCQkvXC5leHRlcm4vICAmJiBkbyB7ICRzZWxmLT57dmFsdWV9ICA9ICJFWFRFUk5cdCIuJGxpbmU7CisJCQkJICAgICRzZWxmLT57dmFsdWV9IC49ICI6TkVBUiIgaWYgKCRtYXNtKTsKKwkJCQkgICAgbGFzdDsKKwkJCQkgIH07CisJCS9cLmdsb2JsfC5nbG9iYWwvCisJCQkgICAgJiYgZG8geyAkc2VsZi0+e3ZhbHVlfSAgPSAkbWFzbT8iUFVCTElDIjoiZ2xvYmFsIjsKKwkJCQkgICAgJHNlbGYtPnt2YWx1ZX0gLj0gIlx0Ii4kbGluZTsKKwkJCQkgICAgbGFzdDsKKwkJCQkgIH07CisJCS9cLnNpemUvICAgICYmIGRvIHsgaWYgKGRlZmluZWQoJGN1cnJlbnRfZnVuY3Rpb24pKSB7CisJCQkJCXVuZGVmICRzZWxmLT57dmFsdWV9OworCQkJCQlpZiAoJGN1cnJlbnRfZnVuY3Rpb24tPnthYml9IGVxICJzdnI0IikgeworCQkJCQkgICAgJHNlbGYtPnt2YWx1ZX09IiR7ZGVjb3J9U0VIX2VuZF8kY3VycmVudF9mdW5jdGlvbi0+e25hbWV9OiI7CisJCQkJCSAgICAkc2VsZi0+e3ZhbHVlfS49IjpcbiIgaWYoJG1hc20pOworCQkJCQl9CisJCQkJCSRzZWxmLT57dmFsdWV9Lj0iJGN1cnJlbnRfZnVuY3Rpb24tPntuYW1lfVx0RU5EUCIgaWYoJG1hc20gJiYgJGN1cnJlbnRfZnVuY3Rpb24tPntuYW1lfSk7CisJCQkJCXVuZGVmICRjdXJyZW50X2Z1bmN0aW9uOworCQkJCSAgICB9CisJCQkJICAgIGxhc3Q7CisJCQkJICB9OworCQkvXC5hbGlnbi8gICAmJiBkbyB7ICRzZWxmLT57dmFsdWV9ID0gIkFMSUdOXHQiLiRsaW5lOyBsYXN0OyB9OworCQkvXC4odmFsdWV8bG9uZ3xydmF8cXVhZCkvCisJCQkgICAgJiYgZG8geyBteSAkc3ogID0gc3Vic3RyKCQxLDAsMSk7CisJCQkJICAgIG15IEBhcnIgPSBzcGxpdCgvLFxzKi8sJGxpbmUpOworCQkJCSAgICBteSAkbGFzdCA9IHBvcChAYXJyKTsKKwkJCQkgICAgbXkgJGNvbnYgPSBzdWIgIHsJbXkgJHZhcj1zaGlmdDsKKwkJCQkJCQkkdmFyPX5zL14oMGJbMC0xXSspL29jdCgkMSkvZWlnOworCQkJCQkJCSR2YXI9fnMvXjB4KFswLTlhLWZdKykvMCQxaC9pZyBpZiAoJG1hc20pOworCQkJCQkJCWlmICgkc3ogZXEgIkQiICYmICgkY3VycmVudF9zZWdtZW50PX4vLltweF1kYXRhLyB8fCAkZGlyIGVxICIucnZhIikpCisJCQkJCQkJeyAkdmFyPX5zLyhbX2EtelwkXEBdW19hLXowLTlcJFxAXSopLyRuYXNtPyIkMSB3cnQgLi5pbWFnZWJhc2UiOiJpbWFnZXJlbCAkMSIvZWdpOyB9CisJCQkJCQkJJHZhcjsKKwkJCQkJCSAgICB9OyAgCisKKwkJCQkgICAgJHN6ID1+IHRyL2J2bHJxL0JXRERRLzsKKwkJCQkgICAgJHNlbGYtPnt2YWx1ZX0gPSAiXHREJHN6XHQiOworCQkJCSAgICBmb3IgKEBhcnIpIHsgJHNlbGYtPnt2YWx1ZX0gLj0gJiRjb252KCRfKS4iLCI7IH0KKwkJCQkgICAgJHNlbGYtPnt2YWx1ZX0gLj0gJiRjb252KCRsYXN0KTsKKwkJCQkgICAgbGFzdDsKKwkJCQkgIH07CisJCS9cLmJ5dGUvICAgICYmIGRvIHsgbXkgQHN0cj1zcGxpdCgvLFxzKi8sJGxpbmUpOworCQkJCSAgICBtYXAocy8oMGJbMC0xXSspL29jdCgkMSkvZWlnLEBzdHIpOworCQkJCSAgICBtYXAocy8weChbMC05YS1mXSspLzAkMWgvaWcsQHN0cikgaWYgKCRtYXNtKTsJCisJCQkJICAgIHdoaWxlICgkI3N0cj4xNSkgeworCQkJCQkkc2VsZi0+e3ZhbHVlfS49IkRCXHQiCisJCQkJCQkuam9pbigiLCIsQHN0clswLi4xNV0pLiJcbiI7CisJCQkJCWZvcmVhY2ggKDAuLjE1KSB7IHNoaWZ0IEBzdHI7IH0KKwkJCQkgICAgfQorCQkJCSAgICAkc2VsZi0+e3ZhbHVlfS49IkRCXHQiCisJCQkJCQkuam9pbigiLCIsQHN0cikgaWYgKEBzdHIpOworCQkJCSAgICBsYXN0OworCQkJCSAgfTsKKwkJL1wuY29tbS8gICAgJiYgZG8geyBteSBAc3RyPXNwbGl0KC8sXHMqLywkbGluZSk7CisJCQkJICAgIG15ICR2PXVuZGVmOworCQkJCSAgICBpZiAoJG5hc20pIHsKKwkJCQkJJHYuPSJjb21tb24JJHByZWZpeEBzdHJbMF0gQHN0clsxXSI7CisJCQkJICAgIH0gZWxzZSB7CisJCQkJCSR2PSIkY3VycmVudF9zZWdtZW50XHRFTkRTXG4iIGlmICgkY3VycmVudF9zZWdtZW50KTsKKwkJCQkJJGN1cnJlbnRfc2VnbWVudCA9ICJfREFUQSI7CisJCQkJCSR2Lj0iJGN1cnJlbnRfc2VnbWVudFx0U0VHTUVOVFxuIjsKKwkJCQkJJHYuPSJDT01NCUBzdHJbMF06RFdPUkQ6Ii5Ac3RyWzFdLzQ7CisJCQkJICAgIH0KKwkJCQkgICAgJHNlbGYtPnt2YWx1ZX0gPSAkdjsKKwkJCQkgICAgbGFzdDsKKwkJCQkgIH07CisJICAgIH0KKwkgICAgJGxpbmUgPSAiIjsKKwl9CisKKwkkcmV0OworICAgIH0KKyAgICBzdWIgb3V0IHsKKwlteSAkc2VsZiA9IHNoaWZ0OworCSRzZWxmLT57dmFsdWV9OworICAgIH0KK30KKworc3ViIHJleCB7CisgbG9jYWwgKm9wY29kZT1zaGlmdDsKKyBteSAoJGRzdCwkc3JjLCRyZXgpPUBfOworCisgICAkcmV4fD0weDA0IGlmKCRkc3Q+PTgpOworICAgJHJleHw9MHgwMSBpZigkc3JjPj04KTsKKyAgIHB1c2ggQG9wY29kZSwoJHJleHwweDQwKSBpZiAoJHJleCk7Cit9CisKKyMgb2xkZXIgZ2FzIGFuZCBtbDY0IGRvbid0IGhhbmRsZSBTU0U+MiBpbnN0cnVjdGlvbnMKK215ICVyZWdybSA9ICgJIiVlYXgiPT4wLCAiJWVjeCI9PjEsICIlZWR4Ij0+MiwgIiVlYngiPT4zLAorCQkiJWVzcCI9PjQsICIlZWJwIj0+NSwgIiVlc2kiPT42LCAiJWVkaSI9PjcJKTsKKworbXkgJG1vdnEgPSBzdWIgewkjIGVsZGVybHkgZ2FzIGNhbid0IGhhbmRsZSBpbnRlci1yZWdpc3RlciBtb3ZxCisgIG15ICRhcmcgPSBzaGlmdDsKKyAgbXkgQG9wY29kZT0oMHg2Nik7CisgICAgaWYgKCRhcmcgPX4gLyV4bW0oWzAtOV0rKSxccyolcihcdyspLykgeworCW15ICgkc3JjLCRkc3QpPSgkMSwkMik7CisJaWYgKCRkc3QgIX4gL1swLTldKy8pCXsgJGRzdCA9ICRyZWdybXsiJWUkZHN0In07IH0KKwlyZXgoXEBvcGNvZGUsJHNyYywkZHN0LDB4OCk7CisJcHVzaCBAb3Bjb2RlLDB4MGYsMHg3ZTsKKwlwdXNoIEBvcGNvZGUsMHhjMHwoKCRzcmMmNyk8PDMpfCgkZHN0JjcpOwkjIE1vZFIvTQorCUBvcGNvZGU7CisgICAgfSBlbHNpZiAoJGFyZyA9fiAvJXIoXHcrKSxccyoleG1tKFswLTldKykvKSB7CisJbXkgKCRzcmMsJGRzdCk9KCQyLCQxKTsKKwlpZiAoJGRzdCAhfiAvWzAtOV0rLykJeyAkZHN0ID0gJHJlZ3JteyIlZSRkc3QifTsgfQorCXJleChcQG9wY29kZSwkc3JjLCRkc3QsMHg4KTsKKwlwdXNoIEBvcGNvZGUsMHgwZiwweDZlOworCXB1c2ggQG9wY29kZSwweGMwfCgoJHNyYyY3KTw8Myl8KCRkc3QmNyk7CSMgTW9kUi9NCisJQG9wY29kZTsKKyAgICB9IGVsc2UgeworCSgpOworICAgIH0KK307CisKK215ICRwZXh0cmQgPSBzdWIgeworICAgIGlmIChzaGlmdCA9fiAvXCQoWzAtOV0rKSxccyoleG1tKFswLTldKyksXHMqKCVcdyspLykgeworICAgICAgbXkgQG9wY29kZT0oMHg2Nik7CisJJGltbT0kMTsKKwkkc3JjPSQyOworCSRkc3Q9JDM7CisJaWYgKCRkc3QgPX4gLyVyKFswLTldKylkLykJeyAkZHN0ID0gJDE7IH0KKwllbHNpZiAoJGRzdCA9fiAvJWUvKQkJeyAkZHN0ID0gJHJlZ3JteyRkc3R9OyB9CisJcmV4KFxAb3Bjb2RlLCRzcmMsJGRzdCk7CisJcHVzaCBAb3Bjb2RlLDB4MGYsMHgzYSwweDE2OworCXB1c2ggQG9wY29kZSwweGMwfCgoJHNyYyY3KTw8Myl8KCRkc3QmNyk7CSMgTW9kUi9NCisJcHVzaCBAb3Bjb2RlLCRpbW07CisJQG9wY29kZTsKKyAgICB9IGVsc2UgeworCSgpOworICAgIH0KK307CisKK215ICRwaW5zcmQgPSBzdWIgeworICAgIGlmIChzaGlmdCA9fiAvXCQoWzAtOV0rKSxccyooJVx3KyksXHMqJXhtbShbMC05XSspLykgeworICAgICAgbXkgQG9wY29kZT0oMHg2Nik7CisJJGltbT0kMTsKKwkkc3JjPSQyOworCSRkc3Q9JDM7CisJaWYgKCRzcmMgPX4gLyVyKFswLTldKykvKQl7ICRzcmMgPSAkMTsgfQorCWVsc2lmICgkc3JjID1+IC8lZS8pCQl7ICRzcmMgPSAkcmVncm17JHNyY307IH0KKwlyZXgoXEBvcGNvZGUsJGRzdCwkc3JjKTsKKwlwdXNoIEBvcGNvZGUsMHgwZiwweDNhLDB4MjI7CisJcHVzaCBAb3Bjb2RlLDB4YzB8KCgkZHN0JjcpPDwzKXwoJHNyYyY3KTsJIyBNb2RSL00KKwlwdXNoIEBvcGNvZGUsJGltbTsKKwlAb3Bjb2RlOworICAgIH0gZWxzZSB7CisJKCk7CisgICAgfQorfTsKKworbXkgJHBzaHVmYiA9IHN1YiB7CisgICAgaWYgKHNoaWZ0ID1+IC8leG1tKFswLTldKyksXHMqJXhtbShbMC05XSspLykgeworICAgICAgbXkgQG9wY29kZT0oMHg2Nik7CisJcmV4KFxAb3Bjb2RlLCQyLCQxKTsKKwlwdXNoIEBvcGNvZGUsMHgwZiwweDM4LDB4MDA7CisJcHVzaCBAb3Bjb2RlLDB4YzB8KCQxJjcpfCgoJDImNyk8PDMpOwkJIyBNb2RSL00KKwlAb3Bjb2RlOworICAgIH0gZWxzZSB7CisJKCk7CisgICAgfQorfTsKKworbXkgJHBhbGlnbnIgPSBzdWIgeworICAgIGlmIChzaGlmdCA9fiAvXCQoWzAtOV0rKSxccyoleG1tKFswLTldKyksXHMqJXhtbShbMC05XSspLykgeworICAgICAgbXkgQG9wY29kZT0oMHg2Nik7CisJcmV4KFxAb3Bjb2RlLCQzLCQyKTsKKwlwdXNoIEBvcGNvZGUsMHgwZiwweDNhLDB4MGY7CisJcHVzaCBAb3Bjb2RlLDB4YzB8KCQyJjcpfCgoJDMmNyk8PDMpOwkJIyBNb2RSL00KKwlwdXNoIEBvcGNvZGUsJDE7CisJQG9wY29kZTsKKyAgICB9IGVsc2UgeworCSgpOworICAgIH0KK307CisKK215ICRwY2xtdWxxZHEgPSBzdWIgeworICAgIGlmIChzaGlmdCA9fiAvXCQoW3gwLTlhLWZdKyksXHMqJXhtbShbMC05XSspLFxzKiV4bW0oWzAtOV0rKS8pIHsKKyAgICAgIG15IEBvcGNvZGU9KDB4NjYpOworCXJleChcQG9wY29kZSwkMywkMik7CisJcHVzaCBAb3Bjb2RlLDB4MGYsMHgzYSwweDQ0OworCXB1c2ggQG9wY29kZSwweGMwfCgkMiY3KXwoKCQzJjcpPDwzKTsJCSMgTW9kUi9NCisJbXkgJGM9JDE7CisJcHVzaCBAb3Bjb2RlLCRjPX4vXjAvP29jdCgkYyk6JGM7CisJQG9wY29kZTsKKyAgICB9IGVsc2UgeworCSgpOworICAgIH0KK307CisKK215ICRyZHJhbmQgPSBzdWIgeworICAgIGlmIChzaGlmdCA9fiAvJVtlcl0oXHcrKS8pIHsKKyAgICAgIG15IEBvcGNvZGU9KCk7CisgICAgICBteSAkZHN0PSQxOworCWlmICgkZHN0ICF+IC9bMC05XSsvKSB7ICRkc3QgPSAkcmVncm17IiVlJGRzdCJ9OyB9CisJcmV4KFxAb3Bjb2RlLDAsJDEsOCk7CisJcHVzaCBAb3Bjb2RlLDB4MGYsMHhjNywweGYwfCgkZHN0JjcpOworCUBvcGNvZGU7CisgICAgfSBlbHNlIHsKKwkoKTsKKyAgICB9Cit9OworCitzdWIgcnhiIHsKKyBsb2NhbCAqb3Bjb2RlPXNoaWZ0OworIG15ICgkZHN0LCRzcmMxLCRzcmMyLCRyeGIpPUBfOworCisgICAkcnhifD0weDc8PDU7CisgICAkcnhiJj1+KDB4MDQ8PDUpIGlmKCRkc3Q+PTgpOworICAgJHJ4YiY9figweDAxPDw1KSBpZigkc3JjMT49OCk7CisgICAkcnhiJj1+KDB4MDI8PDUpIGlmKCRzcmMyPj04KTsKKyAgIHB1c2ggQG9wY29kZSwkcnhiOworfQorCitteSAkdnByb3RkID0gc3ViIHsKKyAgICBpZiAoc2hpZnQgPX4gL1wkKFt4MC05YS1mXSspLFxzKiV4bW0oWzAtOV0rKSxccyoleG1tKFswLTldKykvKSB7CisgICAgICBteSBAb3Bjb2RlPSgweDhmKTsKKwlyeGIoXEBvcGNvZGUsJDMsJDIsLTEsMHgwOCk7CisJcHVzaCBAb3Bjb2RlLDB4NzgsMHhjMjsKKwlwdXNoIEBvcGNvZGUsMHhjMHwoJDImNyl8KCgkMyY3KTw8Myk7CQkjIE1vZFIvTQorCW15ICRjPSQxOworCXB1c2ggQG9wY29kZSwkYz1+L14wLz9vY3QoJGMpOiRjOworCUBvcGNvZGU7CisgICAgfSBlbHNlIHsKKwkoKTsKKyAgICB9Cit9OworCitteSAkdnByb3RxID0gc3ViIHsKKyAgICBpZiAoc2hpZnQgPX4gL1wkKFt4MC05YS1mXSspLFxzKiV4bW0oWzAtOV0rKSxccyoleG1tKFswLTldKykvKSB7CisgICAgICBteSBAb3Bjb2RlPSgweDhmKTsKKwlyeGIoXEBvcGNvZGUsJDMsJDIsLTEsMHgwOCk7CisJcHVzaCBAb3Bjb2RlLDB4NzgsMHhjMzsKKwlwdXNoIEBvcGNvZGUsMHhjMHwoJDImNyl8KCgkMyY3KTw8Myk7CQkjIE1vZFIvTQorCW15ICRjPSQxOworCXB1c2ggQG9wY29kZSwkYz1+L14wLz9vY3QoJGMpOiRjOworCUBvcGNvZGU7CisgICAgfSBlbHNlIHsKKwkoKTsKKyAgICB9Cit9OworCitpZiAoJG5hc20pIHsKKyAgICBwcmludCA8PF9fXzsKK2RlZmF1bHQJcmVsCislZGVmaW5lIFhNTVdPUkQKK19fXworfSBlbHNpZiAoJG1hc20pIHsKKyAgICBwcmludCA8PF9fXzsKK09QVElPTglET1ROQU1FCitfX18KK30KKworcHJpbnQgU1RET1VUICIjaWYgZGVmaW5lZChfX3g4Nl82NF9fKVxuIiBpZiAoJGdhcyk7CisKK3doaWxlKCRsaW5lPTw+KSB7CisKKyAgICBjaG9tcCgkbGluZSk7CisKKyAgICAkbGluZSA9fiBzfFsjIV0uKiR8fDsJIyBnZXQgcmlkIG9mIGFzbS1zdHlsZSBjb21tZW50cy4uLgorICAgICRsaW5lID1+IHN8L1wqLipcKi98fDsJIyAuLi4gYW5kIEMtc3R5bGUgY29tbWVudHMuLi4KKyAgICAkbGluZSA9fiBzfF5ccyt8fDsJCSMgLi4uIGFuZCBza2lwIHdoaXRlIHNwYWNlcyBpbiBiZWdpbm5pbmcKKyAgICAkbGluZSA9fiBzfFxzKyR8fDsJCSMgLi4uIGFuZCBhdCB0aGUgZW5kCisKKyAgICB1bmRlZiAkbGFiZWw7CisgICAgdW5kZWYgJG9wY29kZTsKKyAgICB1bmRlZiBAYXJnczsKKworICAgIGlmICgkbGFiZWw9bGFiZWwtPnJlKFwkbGluZSkpCXsgcHJpbnQgJGxhYmVsLT5vdXQoKTsgfQorCisgICAgaWYgKGRpcmVjdGl2ZS0+cmUoXCRsaW5lKSkgeworCXByaW50ZiAiJXMiLGRpcmVjdGl2ZS0+b3V0KCk7CisgICAgfSBlbHNpZiAoJG9wY29kZT1vcGNvZGUtPnJlKFwkbGluZSkpIHsKKwlteSAkYXNtID0gZXZhbCgiXCQiLiRvcGNvZGUtPm1uZW1vbmljKCkpOworCXVuZGVmIEBieXRlczsKKwkKKwlpZiAoKHJlZigkYXNtKSBlcSAnQ09ERScpICYmIHNjYWxhcihAYnl0ZXM9JiRhc20oJGxpbmUpKSkgeworCSAgICBwcmludCAkZ2FzPyIuYnl0ZVx0IjoiREJcdCIsam9pbignLCcsQGJ5dGVzKSwiXG4iOworCSAgICBuZXh0OworCX0KKworCUFSR1VNRU5UOiB3aGlsZSAoMSkgeworCW15ICRhcmc7CisKKwlpZiAoJGFyZz1yZWdpc3Rlci0+cmUoXCRsaW5lKSkJeyBvcGNvZGUtPnNpemUoJGFyZy0+c2l6ZSgpKTsgfQorCWVsc2lmICgkYXJnPWNvbnN0LT5yZShcJGxpbmUpKQl7IH0KKwllbHNpZiAoJGFyZz1lYS0+cmUoXCRsaW5lKSkJeyB9CisJZWxzaWYgKCRhcmc9ZXhwci0+cmUoXCRsaW5lKSkJeyB9CisJZWxzZQkJCQl7IGxhc3QgQVJHVU1FTlQ7IH0KKworCXB1c2ggQGFyZ3MsJGFyZzsKKworCWxhc3QgQVJHVU1FTlQgaWYgKCRsaW5lICF+IC9eLC8pOworCisJJGxpbmUgPX4gcy9eLFxzKi8vOworCX0gIyBBUkdVTUVOVDoKKworCWlmICgkI2FyZ3M+PTApIHsKKwkgICAgbXkgJGluc247CisJICAgIG15ICRzej1vcGNvZGUtPnNpemUoKTsKKwkgICAgbXkgJGFyZ19zej1vcGNvZGUtPmFyZ19zaXplKCk7CisKKwkgICAgaWYgKCRnYXMpIHsKKwkJJGluc24gPSAkb3Bjb2RlLT5vdXQoJCNhcmdzPj0xPyRhcmdzWyQjYXJnc10tPnNpemUoKTokc3opOworCQlAYXJncyA9IG1hcCgkXy0+b3V0KCRzeiksQGFyZ3MpOworCQlwcmludGYgIlx0JXNcdCVzIiwkaW5zbixqb2luKCIsIixAYXJncyk7CisJICAgIH0gZWxzZSB7CisJCSRpbnNuID0gJG9wY29kZS0+b3V0KCk7CisJCWZvcmVhY2ggKEBhcmdzKSB7CisJCSAgICBteSAkYXJnID0gJF8tPm91dCgpOworCQkgICAgIyAkaW5zbi49JHN6IGNvbXBlbnNhdGVzIGZvciBtb3ZxLCBwaW5zcncsIC4uLgorCQkgICAgaWYgKCRhcmcgPX4gL154bW1bMC05XSskLykgeyAkaW5zbi49JHN6OyAkc3o9IngiIGlmKCEkc3opOyBsYXN0OyB9CisJCSAgICBpZiAoJGFyZyA9fiAvXnltbVswLTldKyQvKSB7ICRpbnNuLj0kc3o7ICRzej0ieSIgaWYoISRzeik7IGxhc3Q7IH0KKwkJICAgIGlmICgkYXJnID1+IC9ebW1bMC05XSskLykgIHsgJGluc24uPSRzejsgJHN6PSJxIiBpZighJHN6KTsgbGFzdDsgfQorCQl9CisJCSRzej0kYXJnX3N6IGlmKCRhcmdfc3opOworCQlAYXJncyA9IHJldmVyc2UoQGFyZ3MpOworCQl1bmRlZiAkc3ogaWYgKCRuYXNtICYmICRvcGNvZGUtPm1uZW1vbmljKCkgZXEgImxlYSIpOworCisJCWlmICgkaW5zbiBlcSAibW92cSIgJiYgJCNhcmdzID09IDEgJiYgJGFyZ3NbMF0tPm91dCgkc3opIGVxICJ4bW0wIiAmJiAkYXJnc1sxXS0+b3V0KCRzeikgZXEgInJheCIpIHsKKwkJICAgICMgSSBoYXZlIG5vIGNsdWUgd2h5IE1BU00gY2FuJ3QgcGFyc2UgdGhpcyBpbnN0cnVjdGlvbi4KKwkJICAgIHByaW50ZiAiREIgNjZoLCA0OGgsIDBmaCwgNmVoLCAwYzBoIjsKKwkJfSBlbHNlIHsKKwkJICAgIHByaW50ZiAiXHQlc1x0JXMiLCRpbnNuLGpvaW4oIiwiLG1hcCgkXy0+b3V0KCRzeiksQGFyZ3MpKTsKKwkJfQorCSAgICB9CisJfSBlbHNlIHsKKwkgICAgcHJpbnRmICJcdCVzIiwkb3Bjb2RlLT5vdXQoKTsKKwl9CisgICAgfQorCisgICAgcHJpbnQgJGxpbmUsIlxuIjsKK30KKworcHJpbnQgIlxuJGN1cnJlbnRfc2VnbWVudFx0RU5EU1xuIglpZiAoJGN1cnJlbnRfc2VnbWVudCAmJiAkbWFzbSk7CitwcmludCAiRU5EXG4iCQkJCWlmICgkbWFzbSk7CitwcmludCAiI2VuZGlmIgkJCQlpZiAoJGdhcyk7CisKKworY2xvc2UgU1RET1VUOworCisMIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDcm9zcy1yZWZlcmVuY2UgeDg2XzY0IEFCSSAiY2FyZCIKKyMKKyMgCQlVbml4CQlXaW42NAorIyAlcmF4CQkqCQkqCisjICVyYngJCS0JCS0KKyMgJXJjeAkJIzQJCSMxCisjICVyZHgJCSMzCQkjMgorIyAlcnNpCQkjMgkJLQorIyAlcmRpCQkjMQkJLQorIyAlcmJwCQktCQktCisjICVyc3AJCS0JCS0KKyMgJXI4CQkjNQkJIzMKKyMgJXI5CQkjNgkJIzQKKyMgJXIxMAkJKgkJKgorIyAlcjExCQkqCQkqCisjICVyMTIJCS0JCS0KKyMgJXIxMwkJLQkJLQorIyAlcjE0CQktCQktCisjICVyMTUJCS0JCS0KKyMgCisjICgqKQl2b2xhdGlsZSByZWdpc3RlcgorIyAoLSkJcHJlc2VydmVkIGJ5IGNhbGxlZQorIyAoIykJTnRoIGFyZ3VtZW50LCB2b2xhdGlsZQorIworIyBJbiBVbml4IHRlcm1zIHRvcCBvZiBzdGFjayBpcyBhcmd1bWVudCB0cmFuc2ZlciBhcmVhIGZvciBhcmd1bWVudHMKKyMgd2hpY2ggY291bGQgbm90IGJlIGFjY29tb2RhdGVkIGluIHJlZ2lzdGVycy4gT3IgaW4gb3RoZXIgd29yZHMgN3RoCisjIFtpbnRlZ2VyXSBhcmd1bWVudCByZXNpZGVzIGF0IDgoJXJzcCkgdXBvbiBmdW5jdGlvbiBlbnRyeSBwb2ludC4KKyMgMTI4IGJ5dGVzIGFib3ZlICVyc3AgY29uc3RpdHV0ZSBhICJyZWQgem9uZSIgd2hpY2ggaXMgbm90IHRvdWNoZWQKKyMgYnkgc2lnbmFsIGhhbmRsZXJzIGFuZCBjYW4gYmUgdXNlZCBhcyB0ZW1wb3JhbCBzdG9yYWdlIHdpdGhvdXQKKyMgYWxsb2NhdGluZyBhIGZyYW1lLgorIworIyBJbiBXaW42NCB0ZXJtcyBOKjggYnl0ZXMgb24gdG9wIG9mIHN0YWNrIGlzIGFyZ3VtZW50IHRyYW5zZmVyIGFyZWEsCisjIHdoaWNoIGJlbG9uZ3MgdG8vY2FuIGJlIG92ZXJ3cml0dGVuIGJ5IGNhbGxlZS4gTiBpcyB0aGUgbnVtYmVyIG9mCisjIGFyZ3VtZW50cyBwYXNzZWQgdG8gY2FsbGVlLCAqYnV0KiBub3QgbGVzcyB0aGFuIDQhIFRoaXMgbWVhbnMgdGhhdAorIyB1cG9uIGZ1bmN0aW9uIGVudHJ5IHBvaW50IDV0aCBhcmd1bWVudCByZXNpZGVzIGF0IDQwKCVyc3ApLCBhcyB3ZWxsCisjIGFzIHRoYXQgMzIgYnl0ZXMgZnJvbSA4KCVyc3ApIGNhbiBhbHdheXMgYmUgdXNlZCBhcyB0ZW1wb3JhbAorIyBzdG9yYWdlIFt3aXRob3V0IGFsbG9jYXRpbmcgYSBmcmFtZV0uIE9uZSBjYW4gYWN0dWFsbHkgYXJndWUgdGhhdAorIyBvbmUgY2FuIGFzc3VtZSBhICJyZWQgem9uZSIgYWJvdmUgc3RhY2sgcG9pbnRlciB1bmRlciBXaW42NCBhcyB3ZWxsLgorIyBQb2ludCBpcyB0aGF0IGF0IGFwcGFyZW50bHkgbm8gb2NjYXNpb24gV2luZG93cyBrZXJuZWwgd291bGQgYWx0ZXIKKyMgdGhlIGFyZWEgYWJvdmUgdXNlciBzdGFjayBwb2ludGVyIGluIHRydWUgYXN5bmNocm9ub3VzIG1hbm5lci4uLgorIworIyBBbGwgdGhlIGFib3ZlIG1lYW5zIHRoYXQgaWYgYXNzZW1ibGVyIHByb2dyYW1tZXIgYWRoZXJlcyB0byBVbml4CisjIHJlZ2lzdGVyIGFuZCBzdGFjayBsYXlvdXQsIGJ1dCBkaXNyZWdhcmRzIHRoZSAicmVkIHpvbmUiIGV4aXN0ZW5zZSwKKyMgaXQncyBwb3NzaWJsZSB0byB1c2UgZm9sbG93aW5nIHByb2xvZ3VlIGFuZCBlcGlsb2d1ZSB0byAiZ2VhciIgZnJvbQorIyBVbml4IHRvIFdpbjY0IEFCSSBpbiBsZWFmIGZ1bmN0aW9ucyB3aXRoIG5vdCBtb3JlIHRoYW4gNiBhcmd1bWVudHMuCisjCisjIG9tbmlwb3RlbnRfZnVuY3Rpb246CisjIGlmZGVmIFdJTjY0CisjCW1vdnEJJXJkaSw4KCVyc3ApCisjCW1vdnEJJXJzaSwxNiglcnNwKQorIwltb3ZxCSVyY3gsJXJkaQk7IGlmIDFzdCBhcmd1bWVudCBpcyBhY3R1YWxseSBwcmVzZW50CisjCW1vdnEJJXJkeCwlcnNpCTsgaWYgMm5kIGFyZ3VtZW50IGlzIGFjdHVhbGx5IC4uLgorIwltb3ZxCSVyOCwlcmR4CTsgaWYgM3JkIGFyZ3VtZW50IGlzIC4uLgorIwltb3ZxCSVyOSwlcmN4CTsgaWYgNHRoIGFyZ3VtZW50IC4uLgorIwltb3ZxCTQwKCVyc3ApLCVyOAk7IGlmIDV0aCAuLi4KKyMJbW92cQk0OCglcnNwKSwlcjkJOyBpZiA2dGggLi4uCisjIGVuZGlmCisjCS4uLgorIyBpZmRlZiBXSU42NAorIwltb3ZxCTgoJXJzcCksJXJkaQorIwltb3ZxCTE2KCVyc3ApLCVyc2kKKyMgZW5kaWYKKyMJcmV0CisjCisMIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBXaW42NCBTRUgsIFN0cnVjdHVyZWQgRXhjZXB0aW9uIEhhbmRsaW5nLgorIworIyBVbmxpa2Ugb24gVW5peCBzeXN0ZW1zKCopIGxhY2sgb2YgV2luNjQgc3RhY2sgdW53aW5kaW5nIGluZm9ybWF0aW9uCisjIGhhcyB1bmRlc2lyZWQgc2lkZS1lZmZlY3QgYXQgcnVuLXRpbWU6IGlmIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQgaW4KKyMgYXNzZW1ibGVyIHN1YnJvdXRpbmUgc3VjaCBhcyB0aG9zZSBpbiBxdWVzdGlvbiAoYmFzaWNhbGx5IHdlJ3JlCisjIHJlZmVycmluZyB0byBzZWdtZW50YXRpb24gdmlvbGF0aW9ucyBjYXVzZWQgYnkgbWFsZm9ybWVkIGlucHV0CisjIHBhcmFtZXRlcnMpLCB0aGUgYXBwbGljYXRpb24gaXMgYnJpc2tseSB0ZXJtaW5hdGVkIHdpdGhvdXQgaW52b2tpbmcKKyMgYW55IGV4Y2VwdGlvbiBoYW5kbGVycywgbW9zdCBub3RhYmx5IHdpdGhvdXQgZ2VuZXJhdGluZyBtZW1vcnkgZHVtcAorIyBvciBhbnkgdXNlciBub3RpZmljYXRpb24gd2hhdHNvZXZlci4gVGhpcyBwb3NlcyBhIHByb2JsZW0uIEl0J3MKKyMgcG9zc2libGUgdG8gYWRkcmVzcyBpdCBieSByZWdpc3RlcmluZyBjdXN0b20gbGFuZ3VhZ2Utc3BlY2lmaWMKKyMgaGFuZGxlciB0aGF0IHdvdWxkIHJlc3RvcmUgcHJvY2Vzc29yIGNvbnRleHQgdG8gdGhlIHN0YXRlIGF0CisjIHN1YnJvdXRpbmUgZW50cnkgcG9pbnQgYW5kIHJldHVybiAiZXhjZXB0aW9uIGlzIG5vdCBoYW5kbGVkLCBrZWVwCisjIHVud2luZGluZyIgY29kZS4gV3JpdGluZyBzdWNoIGhhbmRsZXIgY2FuIGJlIGEgY2hhbGxlbmdlLi4uIEJ1dCBpdCdzCisjIGRvYWJsZSwgdGhvdWdoIHJlcXVpcmVzIGNlcnRhaW4gY29kaW5nIGNvbnZlbnRpb24uIENvbnNpZGVyIGZvbGxvd2luZworIyBzbmlwcGV0OgorIworIyAudHlwZQlmdW5jdGlvbixAZnVuY3Rpb24KKyMgZnVuY3Rpb246CisjCW1vdnEJJXJzcCwlcmF4CSMgY29weSByc3AgdG8gdm9sYXRpbGUgcmVnaXN0ZXIKKyMJcHVzaHEJJXIxNQkJIyBzYXZlIG5vbi12b2xhdGlsZSByZWdpc3RlcnMKKyMJcHVzaHEJJXJieAorIwlwdXNocQklcmJwCisjCW1vdnEJJXJzcCwlcjExCisjCXN1YnEJJXJkaSwlcjExCSMgcHJlcGFyZSBbdmFyaWFibGVdIHN0YWNrIGZyYW1lCisjCWFuZHEJJC02NCwlcjExCisjCW1vdnEJJXJheCwwKCVyMTEpCSMgY2hlY2sgZm9yIGV4Y2VwdGlvbnMKKyMJbW92cQklcjExLCVyc3AJIyBhbGxvY2F0ZSBbdmFyaWFibGVdIHN0YWNrIGZyYW1lCisjCW1vdnEJJXJheCwwKCVyc3ApCSMgc2F2ZSBvcmlnaW5hbCByc3AgdmFsdWUKKyMgbWFnaWNfcG9pbnQ6CisjCS4uLgorIwltb3ZxCTAoJXJzcCksJXJjeAkjIHB1bGwgb3JpZ2luYWwgcnNwIHZhbHVlCisjCW1vdnEJLTI0KCVyY3gpLCVyYnAJIyByZXN0b3JlIG5vbi12b2xhdGlsZSByZWdpc3RlcnMKKyMJbW92cQktMTYoJXJjeCksJXJieAorIwltb3ZxCS04KCVyY3gpLCVyMTUKKyMJbW92cQklcmN4LCVyc3AJIyByZXN0b3JlIG9yaWdpbmFsIHJzcAorIwlyZXQKKyMgLnNpemUgZnVuY3Rpb24sLi1mdW5jdGlvbgorIworIyBUaGUga2V5IGlzIHRoYXQgdXAgdG8gbWFnaWNfcG9pbnQgY29weSBvZiBvcmlnaW5hbCByc3AgdmFsdWUgcmVtYWlucworIyBpbiBjaG9zZW4gdm9sYXRpbGUgcmVnaXN0ZXIgYW5kIG5vIG5vbi12b2xhdGlsZSByZWdpc3RlciwgZXhjZXB0IGZvcgorIyByc3AsIGlzIG1vZGlmaWVkLiBXaGlsZSBwYXN0IG1hZ2ljX3BvaW50IHJzcCByZW1haW5zIGNvbnN0YW50IHRpbGwKKyMgdGhlIHZlcnkgZW5kIG9mIHRoZSBmdW5jdGlvbi4gSW4gdGhpcyBjYXNlIGN1c3RvbSBsYW5ndWFnZS1zcGVjaWZpYworIyBleGNlcHRpb24gaGFuZGxlciB3b3VsZCBsb29rIGxpa2UgdGhpczoKKyMKKyMgRVhDRVBUSU9OX0RJU1BPU0lUSU9OIGhhbmRsZXIgKEVYQ0VQVElPTl9SRUNPUkQgKnJlYyxVTE9ORzY0IGZyYW1lLAorIwkJQ09OVEVYVCAqY29udGV4dCxESVNQQVRDSEVSX0NPTlRFWFQgKmRpc3ApCisjIHsJVUxPTkc2NCAqcnNwID0gKFVMT05HNjQgKiljb250ZXh0LT5SYXg7CisjCWlmIChjb250ZXh0LT5SaXAgPj0gbWFnaWNfcG9pbnQpCisjCXsgICByc3AgPSAoKFVMT05HNjQgKiopY29udGV4dC0+UnNwKVswXTsKKyMJICAgIGNvbnRleHQtPlJicCA9IHJzcFstM107CisjCSAgICBjb250ZXh0LT5SYnggPSByc3BbLTJdOworIwkgICAgY29udGV4dC0+UjE1ID0gcnNwWy0xXTsKKyMJfQorIwljb250ZXh0LT5Sc3AgPSAoVUxPTkc2NClyc3A7CisjCWNvbnRleHQtPlJkaSA9IHJzcFsxXTsKKyMJY29udGV4dC0+UnNpID0gcnNwWzJdOworIworIwltZW1jcHkgKGRpc3AtPkNvbnRleHRSZWNvcmQsY29udGV4dCxzaXplb2YoQ09OVEVYVCkpOworIwlSdGxWaXJ0dWFsVW53aW5kKFVOV19GTEFHX05IQU5ETEVSLGRpc3AtPkltYWdlQmFzZSwKKyMJCWRpcHMtPkNvbnRyb2xQYyxkaXNwLT5GdW5jdGlvbkVudHJ5LGRpc3AtPkNvbnRleHRSZWNvcmQsCisjCQkmZGlzcC0+SGFuZGxlckRhdGEsJmRpc3AtPkVzdGFibGlzaGVyRnJhbWUsTlVMTCk7CisjCXJldHVybiBFeGNlcHRpb25Db250aW51ZVNlYXJjaDsKKyMgfQorIworIyBJdCdzIGFwcHJvcHJpYXRlIHRvIGltcGxlbWVudCB0aGlzIGhhbmRsZXIgaW4gYXNzZW1ibGVyLCBkaXJlY3RseSBpbgorIyBmdW5jdGlvbidzIG1vZHVsZS4gSW4gb3JkZXIgdG8gZG8gdGhhdCBvbmUgaGFzIHRvIGtub3cgbWVtYmVycycKKyMgb2Zmc2V0cyBpbiBDT05URVhUIGFuZCBESVNQQVRDSEVSX0NPTlRFWFQgc3RydWN0dXJlcyBhbmQgc29tZSBjb25zdGFudAorIyB2YWx1ZXMuIEhlcmUgdGhleSBhcmU6CisjCisjCUNPTlRFWFQuUmF4CQkJCTEyMAorIwlDT05URVhULlJjeAkJCQkxMjgKKyMJQ09OVEVYVC5SZHgJCQkJMTM2CisjCUNPTlRFWFQuUmJ4CQkJCTE0NAorIwlDT05URVhULlJzcAkJCQkxNTIKKyMJQ09OVEVYVC5SYnAJCQkJMTYwCisjCUNPTlRFWFQuUnNpCQkJCTE2OAorIwlDT05URVhULlJkaQkJCQkxNzYKKyMJQ09OVEVYVC5SOAkJCQkxODQKKyMJQ09OVEVYVC5SOQkJCQkxOTIKKyMJQ09OVEVYVC5SMTAJCQkJMjAwCisjCUNPTlRFWFQuUjExCQkJCTIwOAorIwlDT05URVhULlIxMgkJCQkyMTYKKyMJQ09OVEVYVC5SMTMJCQkJMjI0CisjCUNPTlRFWFQuUjE0CQkJCTIzMgorIwlDT05URVhULlIxNQkJCQkyNDAKKyMJQ09OVEVYVC5SaXAJCQkJMjQ4CisjCUNPTlRFWFQuWG1tNgkJCQk1MTIKKyMJc2l6ZW9mKENPTlRFWFQpCQkJCTEyMzIKKyMJRElTUEFUQ0hFUl9DT05URVhULkNvbnRyb2xQYwkJMAorIwlESVNQQVRDSEVSX0NPTlRFWFQuSW1hZ2VCYXNlCQk4CisjCURJU1BBVENIRVJfQ09OVEVYVC5GdW5jdGlvbkVudHJ5CTE2CisjCURJU1BBVENIRVJfQ09OVEVYVC5Fc3RhYmxpc2hlckZyYW1lCTI0CisjCURJU1BBVENIRVJfQ09OVEVYVC5UYXJnZXRJcAkJMzIKKyMJRElTUEFUQ0hFUl9DT05URVhULkNvbnRleHRSZWNvcmQJNDAKKyMJRElTUEFUQ0hFUl9DT05URVhULkxhbmd1YWdlSGFuZGxlcgk0OAorIwlESVNQQVRDSEVSX0NPTlRFWFQuSGFuZGxlckRhdGEJCTU2CisjCVVOV19GTEFHX05IQU5ETEVSCQkJMAorIwlFeGNlcHRpb25Db250aW51ZVNlYXJjaAkJCTEKKyMKKyMgSW4gb3JkZXIgdG8gdGllIHRoZSBoYW5kbGVyIHRvIHRoZSBmdW5jdGlvbiBvbmUgaGFzIHRvIGNvbXBvc2UKKyMgY291cGxlIG9mIHN0cnVjdHVyZXM6IG9uZSBmb3IgLnhkYXRhIHNlZ21lbnQgYW5kIG9uZSBmb3IgLnBkYXRhLgorIworIyBVTldJTkRfSU5GTyBzdHJ1Y3R1cmUgZm9yIC54ZGF0YSBzZWdtZW50IHdvdWxkIGJlCisjCisjIGZ1bmN0aW9uX3Vud2luZF9pbmZvOgorIwkuYnl0ZQk5LDAsMCwwCisjCS5ydmEJaGFuZGxlcgorIworIyBUaGlzIHN0cnVjdHVyZSBkZXNpZ25hdGVzIGV4Y2VwdGlvbiBoYW5kbGVyIGZvciBhIGZ1bmN0aW9uIHdpdGgKKyMgemVyby1sZW5ndGggcHJvbG9ndWUsIG5vIHN0YWNrIGZyYW1lIG9yIGZyYW1lIHJlZ2lzdGVyLgorIworIyBUbyBmYWNpbGl0YXRlIGNvbXBvc2luZyBvZiAucGRhdGEgc3RydWN0dXJlcywgYXV0by1nZW5lcmF0ZWQgImdlYXIiCisjIHByb2xvZ3VlIGNvcGllcyByc3AgdmFsdWUgdG8gcmF4IGFuZCBkZW5vdGVzIG5leHQgaW5zdHJ1Y3Rpb24gd2l0aAorIyAuTFNFSF9iZWdpbl97ZnVuY3Rpb25fbmFtZX0gbGFiZWwuIFRoaXMgZXNzZW50aWFsbHkgZGVmaW5lcyB0aGUgU0VICisjIHN0eWxpbmcgcnVsZSBtZW50aW9uZWQgaW4gdGhlIGJlZ2lubmluZy4gUG9zaXRpb24gb2YgdGhpcyBsYWJlbCBpcworIyBjaG9zZW4gaW4gc3VjaCBtYW5uZXIgdGhhdCBwb3NzaWJsZSBleGNlcHRpb25zIHJhaXNlZCBpbiB0aGUgImdlYXIiCisjIHByb2xvZ3VlIHdvdWxkIGJlIGFjY291bnRlZCB0byBjYWxsZXIgYW5kIHVud291bmQgZnJvbSBsYXR0ZXIncyBmcmFtZS4KKyMgRW5kIG9mIGZ1bmN0aW9uIGlzIG1hcmtlZCB3aXRoIHJlc3BlY3RpdmUgLkxTRUhfZW5kX3tmdW5jdGlvbl9uYW1lfQorIyBsYWJlbC4gVG8gc3VtbWFyaXplLCAucGRhdGEgc2VnbWVudCB3b3VsZCBjb250YWluCisjCisjCS5ydmEJLkxTRUhfYmVnaW5fZnVuY3Rpb24KKyMJLnJ2YQkuTFNFSF9lbmRfZnVuY3Rpb24KKyMJLnJ2YQlmdW5jdGlvbl91bndpbmRfaW5mbworIworIyBSZWZlcmVuY2UgdG8gZnVuY3Rvbl91bndpbmRfaW5mbyBmcm9tIC54ZGF0YSBzZWdtZW50IGlzIHRoZSBhbmNob3IuCisjIEluIGNhc2UgeW91IHdvbmRlciB3aHkgcmVmZXJlbmNlcyBhcmUgMzItYml0IC5ydmFzIGFuZCBub3QgNjQtYml0CisjIC5xdWFkcy4gUmVmZXJlbmNlcyBwdXQgaW50byB0aGVzZSB0d28gc2VnbWVudHMgYXJlIHJlcXVpcmVkIHRvIGJlCisjICpyZWxhdGl2ZSogdG8gdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgY3VycmVudCBiaW5hcnkgbW9kdWxlLCBhLmsuYS4KKyMgaW1hZ2UgYmFzZS4gTm8gV2luNjQgbW9kdWxlLCBiZSBpdCAuZXhlIG9yIC5kbGwsIGNhbiBiZSBsYXJnZXIgdGhhbgorIyAyR0IgYW5kIHRodXMgc3VjaCByZWxhdGl2ZSByZWZlcmVuY2VzIGNhbiBiZSBhbmQgYXJlIGFjY29tbW9kYXRlZCBpbgorIyAzMiBiaXRzLgorIworIyBIYXZpbmcgcmV2aWV3ZWQgdGhlIGV4YW1wbGUgZnVuY3Rpb24gY29kZSwgb25lIGNhbiBhcmd1ZSB0aGF0ICJtb3ZxCisjICVyc3AsJXJheCIgYWJvdmUgaXMgcmVkdW5kYW50LiBJdCBpcyBub3QhIEtlZXAgaW4gbWluZCB0aGF0IG9uIFVuaXgKKyMgcmF4IHdvdWxkIGNvbnRhaW4gYW4gdW5kZWZpbmVkIHZhbHVlLiBJZiB0aGlzICJvZmZlbmRzIiB5b3UsIHVzZQorIyBhbm90aGVyIHJlZ2lzdGVyIGFuZCByZWZyYWluIGZyb20gbW9kaWZ5aW5nIHJheCB0aWxsIG1hZ2ljX3BvaW50IGlzCisjIHJlYWNoZWQsIGkuZS4gYXMgaWYgaXQgd2FzIGEgbm9uLXZvbGF0aWxlIHJlZ2lzdGVyLiBJZiBtb3JlIHJlZ2lzdGVycworIyBhcmUgcmVxdWlyZWQgcHJpb3IgW3ZhcmlhYmxlXSBmcmFtZSBzZXR1cCBpcyBjb21wbGV0ZWQsIG5vdGUgdGhhdAorIyBub2JvZHkgc2F5cyB0aGF0IHlvdSBjYW4gaGF2ZSBvbmx5IG9uZSAibWFnaWMgcG9pbnQuIiBZb3UgY2FuCisjICJsaWJlcmF0ZSIgbm9uLXZvbGF0aWxlIHJlZ2lzdGVycyBieSBkZW5vdGluZyBsYXN0IHN0YWNrIG9mZi1sb2FkCisjIGluc3RydWN0aW9uIGFuZCByZWZsZWN0aW5nIGl0IGluIGZpbmVyIGdyYWRlIHVud2luZCBsb2dpYyBpbiBoYW5kbGVyLgorIyBBZnRlciBhbGwsIGlzbid0IGl0IHdoeSBpdCdzIGNhbGxlZCAqbGFuZ3VhZ2Utc3BlY2lmaWMqIGhhbmRsZXIuLi4KKyMKKyMgQXR0ZW50aXZlIHJlYWRlciBjYW4gbm90aWNlIHRoYXQgZXhjZXB0aW9ucyB3b3VsZCBiZSBtaXNoYW5kbGVkIGluCisjIGF1dG8tZ2VuZXJhdGVkICJnZWFyIiBlcGlsb2d1ZS4gV2VsbCwgZXhjZXB0aW9uIGVmZmVjdGl2ZWx5IGNhbid0CisjIG9jY3VyIHRoZXJlLCBiZWNhdXNlIGlmIG1lbW9yeSBhcmVhIHVzZWQgYnkgaXQgd2FzIHN1YmplY3QgdG8KKyMgc2VnbWVudGF0aW9uIHZpb2xhdGlvbiwgdGhlbiBpdCB3b3VsZCBiZSByYWlzZWQgdXBvbiBjYWxsIHRvIHRoZQorIyBmdW5jdGlvbiAoYW5kIGFzIGFscmVhZHkgbWVudGlvbmVkIGJlIGFjY291bnRlZCB0byBjYWxsZXIsIHdoaWNoIGlzCisjIG5vdCBhIHByb2JsZW0pLiBJZiB5b3UncmUgc3RpbGwgbm90IGNvbWZvcnRhYmxlLCB0aGVuIGRlZmluZSB0YWlsCisjICJtYWdpYyBwb2ludCIganVzdCBwcmlvciByZXQgaW5zdHJ1Y3Rpb24gYW5kIGhhdmUgaGFuZGxlciB0cmVhdCBpdC4uLgorIworIyAoKikJTm90ZSB0aGF0IHdlJ3JlIHRhbGtpbmcgYWJvdXQgcnVuLXRpbWUsIG5vdCBkZWJ1Zy10aW1lLiBMYWNrIG9mCisjCXVud2luZCBpbmZvcm1hdGlvbiBtYWtlcyBkZWJ1Z2dpbmcgaGFyZCBvbiBib3RoIFdpbmRvd3MgYW5kCisjCVVuaXguICJVbmxpa2UiIHJlZmVyZXMgdG8gdGhlIGZhY3QgdGhhdCBvbiBVbml4IHNpZ25hbCBoYW5kbGVyCisjCXdpbGwgYWx3YXlzIGJlIGludm9rZWQsIGNvcmUgZHVtcGVkIGFuZCBhcHByb3ByaWF0ZSBleGl0IGNvZGUKKyMJcmV0dXJuZWQgdG8gcGFyZW50IChmb3IgdXNlciBub3RpZmljYXRpb24pLgpkaWZmIC0tZ2l0IGEvY3J5cHRvL3Blcmxhc20veDg2YXNtLnBsIGIvY3J5cHRvL3Blcmxhc20veDg2YXNtLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMzZiZWEKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vcGVybGFzbS94ODZhc20ucGwKQEAgLTAsMCArMSwyOTAgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIyByZXF1aXJlICd4ODZhc20ucGwnOworIyAmYXNtX2luaXQoPGZsYXZvcj4sImRlcy01ODYucGwiWywkaTM4Nm9ubHldKTsKKyMgJmZ1bmN0aW9uX2JlZ2luKCJmb28iKTsKKyMgLi4uCisjICZmdW5jdGlvbl9lbmQoImZvbyIpOworIyAmYXNtX2ZpbmlzaAorCiskb3V0PSgpOworJGkzODY9MDsKKworIyBBVVRPTE9BRCBpcyB0aGlzIGNvbnRleHQgaGFzIHF1aXRlIHVucGxlYXNhbnQgc2lkZSBlZmZlY3QsIG5hbWVseQorIyB0aGF0IHR5cG9zIGluIGZ1bmN0aW9uIGNhbGxzIGVmZmVjdGl2ZWx5IGdvIHRvIGFzc2VtYmxlciBvdXRwdXQsCisjIGJ1dCBvbiB0aGUgcHJvcyBzaWRlIHdlIGRvbid0IGhhdmUgdG8gaW1wbGVtZW50IG9uZSBzdWJyb3V0aW5lIHBlcgorIyBlYWNoIG9wY29kZS4uLgorc3ViIDo6QVVUT0xPQUQKK3sgbXkgJG9wY29kZSA9ICRBVVRPTE9BRDsKKworICAgIGRpZSAibW9yZSB0aGFuIDQgYXJndW1lbnRzIHBhc3NlZCB0byAkb3Bjb2RlIiBpZiAoJCNfPjMpOworCisgICAgJG9wY29kZSA9fiBzLy4qOjovLzsKKyAgICBpZiAgICAoJG9wY29kZSA9fiAvXnB1c2gvKSB7ICRzdGFjays9NDsgfQorICAgIGVsc2lmICgkb3Bjb2RlID1+IC9ecG9wLykgIHsgJHN0YWNrLT00OyB9CisKKyAgICAmZ2VuZXJpYygkb3Bjb2RlLEBfKSBvciBkaWUgInVuZGVmaW5lZCBzdWJyb3V0aW5lIFwmJEFVVE9MT0FEIjsKK30KKworc3ViIDo6ZW1pdAoreyBteSAkb3Bjb2RlPXNoaWZ0OworCisgICAgaWYgKCQjXz09LTEpICAgIHsgcHVzaChAb3V0LCJcdCRvcGNvZGVcbiIpOwkJCQl9CisgICAgZWxzZSAgICAgICAgICAgIHsgcHVzaChAb3V0LCJcdCRvcGNvZGVcdCIuam9pbignLCcsQF8pLiJcbiIpOwl9Cit9CisKK3N1YiA6OkxCCit7ICAgJF9bMF0gPX4gbS9eZT8oW2EtZF0peCQvbyBvciBkaWUgIiRfWzBdIGRvZXMgbm90IGhhdmUgYSAnbG93IGJ5dGUnIjsKKyAgJDEuImwiOworfQorc3ViIDo6SEIKK3sgICAkX1swXSA9fiBtL15lPyhbYS1kXSl4JC9vIG9yIGRpZSAiJF9bMF0gZG9lcyBub3QgaGF2ZSBhICdoaWdoIGJ5dGUnIjsKKyAgJDEuImgiOworfQorc3ViIDo6c3RhY2tfcHVzaHsgbXkgJG51bT0kX1swXSo0OyAkc3RhY2srPSRudW07ICZzdWIoImVzcCIsJG51bSk7CX0KK3N1YiA6OnN0YWNrX3BvcAl7IG15ICRudW09JF9bMF0qNDsgJHN0YWNrLT0kbnVtOyAmYWRkKCJlc3AiLCRudW0pOwl9CitzdWIgOjpibGluZHBvcAl7ICZwb3AoJF9bMF0pOyAkc3RhY2srPTQ7CQkJCX0KK3N1YiA6OndwYXJhbQl7ICZEV1AoJHN0YWNrKzQqJF9bMF0sImVzcCIpOwkJCQl9CitzdWIgOjpzd3RtcAl7ICZEV1AoNCokX1swXSwiZXNwIik7CQkJCQl9CisKK3N1YiA6OmJzd2FwCit7ICAgaWYgKCRpMzg2KQkjIGVtdWxhdGUgYnN3YXAgZm9yIGkzODYKKyAgICB7CSZjb21tZW50KCJic3dhcCBAXyIpOworCSZ4Y2hnKCZIQihAXyksJkxCKEBfKSk7CisJJnJvciAoQF8sMTYpOworCSZ4Y2hnKCZIQihAXyksJkxCKEBfKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CSZnZW5lcmljKCJic3dhcCIsQF8pOwl9Cit9CisjIFRoZXNlIGFyZSBtYWRlLXVwIG9wY29kZXMgaW50cm9kdWNlZCBvdmVyIHRoZSB5ZWFycyBlc3NlbnRpYWxseQorIyBieSBpZ25vcmFuY2UsIGp1c3QgYWxpYXMgdGhlbSB0byByZWFsIG9uZXMuLi4KK3N1YiA6Om1vdmIJeyAmbW92KEBfKTsJfQorc3ViIDo6eG9yYgl7ICZ4b3IoQF8pOwl9CitzdWIgOjpyb3RsCXsgJnJvbChAXyk7CX0KK3N1YiA6OnJvdHIJeyAmcm9yKEBfKTsJfQorc3ViIDo6ZXhjaAl7ICZ4Y2hnKEBfKTsJfQorc3ViIDo6aGFsdAl7ICZobHQ7CQl9CitzdWIgOjptb3Z6CXsgJm1vdnp4KEBfKTsJfQorc3ViIDo6cHVzaGYJeyAmcHVzaGZkOwl9CitzdWIgOjpwb3BmCXsgJnBvcGZkOwl9CisKKyMgMyBhcmd1bWVudCBpbnN0cnVjdGlvbnMKK3N1YiA6Om1vdnEKK3sgbXkoJHAxLCRwMiwkb3B0aW1pemUpPUBfOworCisgICAgaWYgKCRvcHRpbWl6ZSAmJiAkcDE9fi9ebW1bMC03XSQvICYmICRwMj1+L15tbVswLTddJC8pCisgICAgIyBtb3ZxIGJldHdlZW4gbW14IHJlZ2lzdGVycyBjYW4gc2luayBJbnRlbCBDUFVzCisgICAgewkmOjpwc2h1ZncoJHAxLCRwMiwweGU0KTsJCX0KKyAgICBlbHNlCisgICAgewkmOjpnZW5lcmljKCJtb3ZxIixAXyk7CQkJfQorfQorCisjIFNTRT4yIGluc3RydWN0aW9ucworbXkgJXJlZ3JtID0gKAkiZWF4Ij0+MCwgImVjeCI9PjEsICJlZHgiPT4yLCAiZWJ4Ij0+MywKKwkJImVzcCI9PjQsICJlYnAiPT41LCAiZXNpIj0+NiwgImVkaSI9PjcJKTsKK3N1YiA6OnBleHRyZAoreyBteSgkZHN0LCRzcmMsJGltbSk9QF87CisgICAgaWYgKCIkZHN0OiRzcmMiID1+IC8oZVthLWRzZF1baXhwXSk6eG1tKFswLTddKS8pCisgICAgewkmOjpkYXRhX2J5dGUoMHg2NiwweDBmLDB4M2EsMHgxNiwweGMwfCgkMjw8Myl8JHJlZ3JteyQxfSwkaW1tKTsJfQorICAgIGVsc2UKKyAgICB7CSY6OmdlbmVyaWMoInBleHRyZCIsQF8pOwkJfQorfQorCitzdWIgOjpwaW5zcmQKK3sgbXkoJGRzdCwkc3JjLCRpbW0pPUBfOworICAgIGlmICgiJGRzdDokc3JjIiA9fiAveG1tKFswLTddKTooZVthLWRzZF1baXhwXSkvKQorICAgIHsJJjo6ZGF0YV9ieXRlKDB4NjYsMHgwZiwweDNhLDB4MjIsMHhjMHwoJDE8PDMpfCRyZWdybXskMn0sJGltbSk7CX0KKyAgICBlbHNlCisgICAgewkmOjpnZW5lcmljKCJwaW5zcmQiLEBfKTsJCX0KK30KKworc3ViIDo6cHNodWZiCit7IG15KCRkc3QsJHNyYyk9QF87CisgICAgaWYgKCIkZHN0OiRzcmMiID1+IC94bW0oWzAtN10pOnhtbShbMC03XSkvKQorICAgIHsJJmRhdGFfYnl0ZSgweDY2LDB4MGYsMHgzOCwweDAwLDB4YzB8KCQxPDwzKXwkMik7CX0KKyAgICBlbHNlCisgICAgewkmOjpnZW5lcmljKCJwc2h1ZmIiLEBfKTsJCX0KK30KKworc3ViIDo6cGFsaWducgoreyBteSgkZHN0LCRzcmMsJGltbSk9QF87CisgICAgaWYgKCIkZHN0OiRzcmMiID1+IC94bW0oWzAtN10pOnhtbShbMC03XSkvKQorICAgIHsJJjo6ZGF0YV9ieXRlKDB4NjYsMHgwZiwweDNhLDB4MGYsMHhjMHwoJDE8PDMpfCQyLCRpbW0pOwl9CisgICAgZWxzZQorICAgIHsJJjo6Z2VuZXJpYygicGFsaWduciIsQF8pOwkJfQorfQorCitzdWIgOjpwY2xtdWxxZHEKK3sgbXkoJGRzdCwkc3JjLCRpbW0pPUBfOworICAgIGlmICgiJGRzdDokc3JjIiA9fiAveG1tKFswLTddKTp4bW0oWzAtN10pLykKKyAgICB7CSY6OmRhdGFfYnl0ZSgweDY2LDB4MGYsMHgzYSwweDQ0LDB4YzB8KCQxPDwzKXwkMiwkaW1tKTsJfQorICAgIGVsc2UKKyAgICB7CSY6OmdlbmVyaWMoInBjbG11bHFkcSIsQF8pOwkJfQorfQorCitzdWIgOjpyZHJhbmQKK3sgbXkgKCRkc3QpPUBfOworICAgIGlmICgkZHN0ID1+IC8oZVthLWRzZF1baXhwXSkvKQorICAgIHsJJjo6ZGF0YV9ieXRlKDB4MGYsMHhjNywweGYwfCRyZWdybXskZHN0fSk7CX0KKyAgICBlbHNlCisgICAgewkmOjpnZW5lcmljKCJyZHJhbmQiLEBfKTsJfQorfQorCitzdWIgcnhiIHsKKyBsb2NhbCAqb3Bjb2RlPXNoaWZ0OworIG15ICgkZHN0LCRzcmMxLCRzcmMyLCRyeGIpPUBfOworCisgICAkcnhifD0weDc8PDU7CisgICAkcnhiJj1+KDB4MDQ8PDUpIGlmKCRkc3Q+PTgpOworICAgJHJ4YiY9figweDAxPDw1KSBpZigkc3JjMT49OCk7CisgICAkcnhiJj1+KDB4MDI8PDUpIGlmKCRzcmMyPj04KTsKKyAgIHB1c2ggQG9wY29kZSwkcnhiOworfQorCitzdWIgOjp2cHJvdGQKK3sgbXkgJGFyZ3M9am9pbignLCcsQF8pOworICAgIGlmICgkYXJncyA9fiAveG1tKFswLTddKSx4bW0oWzAtN10pLChbeDAtOWEtZl0rKS8pCisgICAgeyBteSBAb3Bjb2RlPSgweDhmKTsKKwlyeGIoXEBvcGNvZGUsJDEsJDIsLTEsMHgwOCk7CisJcHVzaCBAb3Bjb2RlLDB4NzgsMHhjMjsKKwlwdXNoIEBvcGNvZGUsMHhjMHwoJDImNyl8KCgkMSY3KTw8Myk7CQkjIE1vZFIvTQorCW15ICRjPSQzOworCXB1c2ggQG9wY29kZSwkYz1+L14wLz9vY3QoJGMpOiRjOworCSY6OmRhdGFfYnl0ZShAb3Bjb2RlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsJJjo6Z2VuZXJpYygidnByb3RkIixAXyk7CX0KK30KKworIyBsYWJlbCBtYW5hZ2VtZW50CiskbGJkZWNvcj0iTCI7CQkjIGxvY2FsIGxhYmVsIGRlY29yYXRpb24sIHNldCBieSBwYWNrYWdlCiskbGFiZWw9IjAwMCI7CisKK3N1YiA6OmlzbGFiZWwJCSMgc2VlIGlzIGFyZ3VtZW50IGlzIGEga25vd24gbGFiZWwKK3sgbXkgJGk7CisgICAgZm9yZWFjaCAkaSAodmFsdWVzICVsYWJlbCkgeyByZXR1cm4gJGkgaWYgKCRpIGVxICRfWzBdKTsgfQorICAkbGFiZWx7JF9bMF19OwkjIGNhbiBiZSB1bmRlZgorfQorCitzdWIgOjpsYWJlbAkJIyBpbnN0YW50aWF0ZSBhIGZ1bmN0aW9uLXNjb3BlIGxhYmVsCit7ICAgaWYgKCFkZWZpbmVkKCRsYWJlbHskX1swXX0pKQorICAgIHsJJGxhYmVseyRfWzBdfT0iJHtsYmRlY29yfSR7bGFiZWx9JHtfWzBdfSI7ICRsYWJlbCsrOyAgIH0KKyAgJGxhYmVseyRfWzBdfTsKK30KKworc3ViIDo6TEFCRUwJCSMgaW5zdGFudGlhdGUgYSBmaWxlLXNjb3BlIGxhYmVsCit7ICAgJGxhYmVseyRfWzBdfT0kX1sxXSBpZiAoIWRlZmluZWQoJGxhYmVseyRfWzBdfSkpOworICAkbGFiZWx7JF9bMF19OworfQorCitzdWIgOjpzdGF0aWNfbGFiZWwJeyAmOjpMQUJFTCgkX1swXSwkbGJkZWNvci4kX1swXSk7IH0KKworc3ViIDo6c2V0X2xhYmVsX0IJeyBwdXNoKEBvdXQsIkBfOlxuIik7IH0KK3N1YiA6OnNldF9sYWJlbAoreyBteSAkbGFiZWw9Jjo6bGFiZWwoJF9bMF0pOworICAgICY6OmFsaWduKCRfWzFdKSBpZiAoJF9bMV0+MSk7CisgICAgJjo6c2V0X2xhYmVsX0IoJGxhYmVsKTsKKyAgJGxhYmVsOworfQorCitzdWIgOjp3aXBlX2xhYmVscwkjIHdpcGVzIGZ1bmN0aW9uLXNjb3BlIGxhYmVscworeyAgIGZvcmVhY2ggJGkgKGtleXMgJWxhYmVsKQorICAgIHsJZGVsZXRlICRsYWJlbHskaX0gaWYgKCRsYWJlbHskaX0gPX4gL15cUSR7bGJkZWNvcn1cRVswLTldezN9Lyk7CX0KK30KKworIyBzdWJyb3V0aW5lIG1hbmFnZW1lbnQKK3N1YiA6OmZ1bmN0aW9uX2JlZ2luCit7ICAgJmZ1bmN0aW9uX2JlZ2luX0IoQF8pOworICAgICRzdGFjaz00OworICAgICZwdXNoKCJlYnAiKTsKKyAgICAmcHVzaCgiZWJ4Iik7CisgICAgJnB1c2goImVzaSIpOworICAgICZwdXNoKCJlZGkiKTsKK30KKworc3ViIDo6ZnVuY3Rpb25fZW5kCit7ICAgJnBvcCgiZWRpIik7CisgICAgJnBvcCgiZXNpIik7CisgICAgJnBvcCgiZWJ4Iik7CisgICAgJnBvcCgiZWJwIik7CisgICAgJnJldCgpOworICAgICZmdW5jdGlvbl9lbmRfQihAXyk7CisgICAgJHN0YWNrPTA7CisgICAgJndpcGVfbGFiZWxzKCk7Cit9CisKK3N1YiA6OmZ1bmN0aW9uX2VuZF9BCit7ICAgJnBvcCgiZWRpIik7CisgICAgJnBvcCgiZXNpIik7CisgICAgJnBvcCgiZWJ4Iik7CisgICAgJnBvcCgiZWJwIik7CisgICAgJnJldCgpOworICAgICRzdGFjays9MTY7CSMgcmVhZGp1c3QgZXNwIGFzIGlmIHdlIGRpZG4ndCBwb3AgYW55dGhpbmcKK30KKworc3ViIDo6YXNjaXoKK3sgbXkgQHN0cj11bnBhY2soIkMqIixzaGlmdCk7CisgICAgcHVzaCBAc3RyLDA7CisgICAgd2hpbGUgKCQjc3RyPjE1KSB7CisJJmRhdGFfYnl0ZShAc3RyWzAuLjE1XSk7CisJZm9yZWFjaCAoMC4uMTUpIHsgc2hpZnQgQHN0cjsgfQorICAgIH0KKyAgICAmZGF0YV9ieXRlKEBzdHIpIGlmIChAc3RyKTsKK30KKworc3ViIDo6YXNtX2ZpbmlzaAoreyAgICZmaWxlX2VuZCgpOworICAgIHByaW50ICIjaWYgZGVmaW5lZChfX2kzODZfXylcbiI7CisgICAgcHJpbnQgQG91dDsKKyAgICBwcmludCAiI2VuZGlmIjsKK30KKworc3ViIDo6YXNtX2luaXQKK3sgbXkgKCR0eXBlLCRmbiwkY3B1KT1AXzsKKworICAgICRmaWxlbmFtZT0kZm47CisgICAgJGkzODY9JGNwdTsKKworICAgICRlbGY9JGNwcD0kY29mZj0kYW91dD0kbWFjb3N4PSR3aW4zMj0kbmV0d2FyZT0kbXdlcmtzPSRhbmRyb2lkPTA7CisgICAgaWYgICAgKCgkdHlwZSBlcSAiZWxmIikpCisgICAgewkkZWxmPTE7CQkJcmVxdWlyZSAieDg2Z2FzLnBsIjsJfQorICAgIGVsc2lmICgoJHR5cGUgZXEgImFcLm91dCIpKQorICAgIHsJJGFvdXQ9MTsJCXJlcXVpcmUgIng4Nmdhcy5wbCI7CX0KKyAgICBlbHNpZiAoKCR0eXBlIGVxICJjb2ZmIiBvciAkdHlwZSBlcSAiZ2Fzd2luIikpCisgICAgewkkY29mZj0xOwkJcmVxdWlyZSAieDg2Z2FzLnBsIjsJfQorICAgIGVsc2lmICgoJHR5cGUgZXEgIndpbjMybiIpKQorICAgIHsJJHdpbjMyPTE7CQlyZXF1aXJlICJ4ODZuYXNtLnBsIjsJfQorICAgIGVsc2lmICgoJHR5cGUgZXEgIm53LW5hc20iKSkKKyAgICB7CSRuZXR3YXJlPTE7CQlyZXF1aXJlICJ4ODZuYXNtLnBsIjsJfQorICAgICNlbHNpZiAoKCR0eXBlIGVxICJudy1td2FzbSIpKQorICAgICN7CSRuZXR3YXJlPTE7ICRtd2Vya3M9MTsJcmVxdWlyZSAieDg2bmFzbS5wbCI7CX0KKyAgICBlbHNpZiAoKCR0eXBlIGVxICJ3aW4zMiIpKQorICAgIHsJJHdpbjMyPTE7CQlyZXF1aXJlICJ4ODZtYXNtLnBsIjsJfQorICAgIGVsc2lmICgoJHR5cGUgZXEgIm1hY29zeCIpKQorICAgIHsJJGFvdXQ9MTsgJG1hY29zeD0xOwlyZXF1aXJlICJ4ODZnYXMucGwiOwl9CisgICAgZWxzaWYgKCgkdHlwZSBlcSAiYW5kcm9pZCIpKQorICAgIHsJJGVsZj0xOyAkYW5kcm9pZD0xOwlyZXF1aXJlICJ4ODZnYXMucGwiOwl9CisgICAgZWxzZQorICAgIHsJcHJpbnQgU1RERVJSIDw8IkVPRiI7CitQaWNrIG9uZSB0YXJnZXQgdHlwZSBmcm9tCisJZWxmCS0gTGludXgsIEZyZWVCU0QsIFNvbGFyaXMgeDg2LCBldGMuCisJYS5vdXQJLSBESkdQUCwgZWxkZXIgT3BlbkJTRCwgZXRjLgorCWNvZmYJLSBHQVMvQ09GRiBzdWNoIGFzIFdpbjMyIHRhcmdldHMKKwl3aW4zMm4JLSBXaW5kb3dzIDk1L1dpbmRvd3MgTlQgTkFTTSBmb3JtYXQKKwludy1uYXNtIC0gTmV0V2FyZSBOQVNNIGZvcm1hdAorCW1hY29zeAktIE1hYyBPUyBYCitFT0YKKwlleGl0KDEpOworICAgIH0KKworICAgICRwaWM9MDsKKyAgICBmb3IgKEBBUkdWKSB7ICRwaWM9MSBpZiAoL1wtW2ZLXVBJQy9pKTsgfQorCisgICAgJGZpbGVuYW1lID1+IHMvXC5wbCQvLzsKKyAgICAmZmlsZSgkZmlsZW5hbWUpOworfQorCitzdWIgOjpoaWRkZW4ge30KKworMTsKZGlmZiAtLWdpdCBhL2NyeXB0by9wZXJsYXNtL3g4Nmdhcy5wbCBiL2NyeXB0by9wZXJsYXNtL3g4Nmdhcy5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmY2Y2VmCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3Blcmxhc20veDg2Z2FzLnBsCkBAIC0wLDAgKzEsMjU4IEBACisjIS91c3IvYmluL2VudiBwZXJsCisKK3BhY2thZ2UgeDg2Z2FzOworCisqb3V0PVxAOjpvdXQ7CisKKyQ6OmxiZGVjb3I9JDo6YW91dD8iTCI6Ii5MIjsJCSMgbG9jYWwgbGFiZWwgZGVjb3JhdGlvbgorJG5tZGVjb3I9KCQ6OmFvdXQgb3IgJDo6Y29mZik/Il8iOiIiOwkjIGV4dGVybmFsIG5hbWUgZGVjb3JhdGlvbgorCiskaW5pdHNlZz0iIjsKKworJGFsaWduPTE2OworJGFsaWduPWxvZygkYWxpZ24pL2xvZygyKSBpZiAoJDo6YW91dCk7CiskY29tX3N0YXJ0PSIjIiBpZiAoJDo6YW91dCBvciAkOjpjb2ZmKTsKKworc3ViIG9wc2l6ZSgpCit7IG15ICRyZWc9c2hpZnQ7CisgICAgaWYgICAgKCRyZWcgPX4gbS9eJWUvbykJCXsgImwiOyB9CisgICAgZWxzaWYgKCRyZWcgPX4gbS9eJVthLWRdW2hsXSQvbykJeyAiYiI7IH0KKyAgICBlbHNpZiAoJHJlZyA9fiBtL14lW3htXS9vKQkJeyB1bmRlZjsgfQorICAgIGVsc2UJCQkJeyAidyI7IH0KK30KKworIyBzd2FwIGFyZ3VtZW50czsKKyMgZXhwYW5kIG9wY29kZSB3aXRoIHNpemUgc3VmZml4OworIyBwcmVmaXggbnVtZXJpYyBjb25zdGFudHMgd2l0aCAkOworc3ViIDo6Z2VuZXJpYworeyBteSgkb3Bjb2RlLEBhcmcpPUBfOworICBteSgkc3VmZml4LCRkc3QsJHNyYyk7CisKKyAgICBAYXJnPXJldmVyc2UoQGFyZyk7CisKKyAgICBmb3IgKEBhcmcpCisgICAgewlzL14oXCo/KShlP1thLWRzaXhwaGxdezJ9KSQvJDElJDIvbzsJIyBncCByZWdpc3RlcnMKKwlzL14oW3h5XT9tbVswLTddKSQvJSQxL287CQkjIHhtbS9tbXggcmVnaXN0ZXJzCisJcy9eKFwtP1swLTldKykkL1wkJDEvbzsJCQkjIGNvbnN0YW50cworCXMvXihcLT8weFswLTlhLWZdKykkL1wkJDEvbzsJCSMgY29uc3RhbnRzCisgICAgfQorCisgICAgJGRzdCA9ICRhcmdbJCNhcmddCQlpZiAoJCNhcmc+PTApOworICAgICRzcmMgPSAkYXJnWyQjYXJnLTFdCWlmICgkI2FyZz49MSk7CisgICAgaWYgICAgKCRkc3QgPX4gbS9eJS9vKQl7ICRzdWZmaXg9Jm9wc2l6ZSgkZHN0KTsgfQorICAgIGVsc2lmICgkc3JjID1+IG0vXiUvbykJeyAkc3VmZml4PSZvcHNpemUoJHNyYyk7IH0KKyAgICBlbHNlCQkJeyAkc3VmZml4PSJsIjsgICAgICAgICAgIH0KKyAgICB1bmRlZiAkc3VmZml4IGlmICgkZHN0ID1+IG0vXiVbeG1dL28gfHwgJHNyYyA9fiBtL14lW3htXS9vKTsKKworICAgIGlmICgkI189PTApCQkJCXsgJjo6ZW1pdCgkb3Bjb2RlKTsJCX0KKyAgICBlbHNpZiAoJCNfPT0xICYmICRvcGNvZGUgPX4gbS9eKGNhbGx8Y2xmbHVzaHxqfGxvb3B8c2V0KS9vKQorCQkJCQl7ICY6OmVtaXQoJG9wY29kZSxAYXJnKTsJfQorICAgIGVsc2UJCQkJeyAmOjplbWl0KCRvcGNvZGUuJHN1ZmZpeCxAYXJnKTt9CisKKyAgMTsKK30KKyMKKyMgb3Bjb2RlcyBub3QgY292ZXJlZCBieSA6OmdlbmVyaWMgYWJvdmUsIG1vc3RseSBpbmNvbnNpc3RlbnQgbmFtaW5ncy4uLgorIworc3ViIDo6bW92engJeyAmOjptb3Z6YihAXyk7CQkJfQorc3ViIDo6cHVzaGZkCXsgJjo6cHVzaGZsOwkJCX0KK3N1YiA6OnBvcGZkCXsgJjo6cG9wZmw7CQkJfQorc3ViIDo6Y3B1aWQJeyAmOjplbWl0KCIuYnl0ZVx0MHgwZiwweGEyIik7CX0KK3N1YiA6OnJkdHNjCXsgJjo6ZW1pdCgiLmJ5dGVcdDB4MGYsMHgzMSIpOwl9CisKK3N1YiA6OmNhbGwJeyAmOjplbWl0KCJjYWxsIiwoJjo6aXNsYWJlbCgkX1swXSkgb3IgIiRubWRlY29yJF9bMF0iKSk7IH0KK3N1YiA6OmNhbGxfcHRyCXsgJjo6Z2VuZXJpYygiY2FsbCIsIiokX1swXSIpOwl9CitzdWIgOjpqbXBfcHRyCXsgJjo6Z2VuZXJpYygiam1wIiwiKiRfWzBdIik7CX0KKworKjo6YnN3YXAgPSBzdWIJeyAmOjplbWl0KCJic3dhcCIsIiUkX1swXSIpOwl9IGlmICghJDo6aTM4Nik7CisKK3N1YiA6OkRXUAoreyBteSgkYWRkciwkcmVnMSwkcmVnMiwkaWR4KT1AXzsKKyAgbXkgJHJldD0iIjsKKworICAgIGlmICghZGVmaW5lZCgkaWR4KSAmJiAxKiRyZWcyKSB7ICRpZHg9JHJlZzI7ICRyZWcyPSRyZWcxOyB1bmRlZiAkcmVnMTsgfQorCisgICAgJGFkZHIgPX4gcy9eXHMrLy87CisgICAgIyBwcmVwZW5kIGdsb2JhbCByZWZlcmVuY2VzIHdpdGggb3B0aW9uYWwgdW5kZXJzY29yZQorICAgICRhZGRyID1+IHMvXihbXlwrXC0wLTldW15cK1wtXSopLyY6OmlzbGFiZWwoJDEpIG9yICIkbm1kZWNvciQxIi9pZ2U7CisKKyAgICAkcmVnMSA9ICIlJHJlZzEiIGlmICgkcmVnMSk7CisgICAgJHJlZzIgPSAiJSRyZWcyIiBpZiAoJHJlZzIpOworCisgICAgJHJldCAuPSAkYWRkciBpZiAoKCRhZGRyIG5lICIiKSAmJiAoJGFkZHIgbmUgMCkpOworCisgICAgaWYgKCRyZWcyKQorICAgIHsJJGlkeCE9IDAgb3IgJGlkeD0xOworCSRyZXQgLj0gIigkcmVnMSwkcmVnMiwkaWR4KSI7CisgICAgfQorICAgIGVsc2lmICgkcmVnMSkKKyAgICB7CSRyZXQgLj0gIigkcmVnMSkiOwl9CisKKyAgJHJldDsKK30KK3N1YiA6OlFXUAl7ICY6OkRXUChAXyk7CX0KK3N1YiA6OkJQCXsgJjo6RFdQKEBfKTsJfQorc3ViIDo6V1AJeyAmOjpEV1AoQF8pOwl9CitzdWIgOjpCQwl7IEBfOwkJfQorc3ViIDo6RFdDCXsgQF87CQl9CisKK3N1YiA6OmZpbGUKK3sgICBwdXNoKEBvdXQsIi5maWxlXHRcIiRfWzBdLlNcIlxuLnRleHRcbiIpOwl9CisKK3N1YiA6OmZ1bmN0aW9uX2JlZ2luX0IKK3sgbXkgJGZ1bmM9c2hpZnQ7CisgIG15ICRnbG9iYWw9KCRmdW5jICF+IC9eXy8pOworICBteSAkYmVnaW49IiR7OjpsYmRlY29yfV8ke2Z1bmN9X2JlZ2luIjsKKworICAgICY6OkxBQkVMKCRmdW5jLCRnbG9iYWw/IiRiZWdpbiI6IiRubWRlY29yJGZ1bmMiKTsKKyAgICAkZnVuYz0kbm1kZWNvci4kZnVuYzsKKworICAgIHB1c2goQG91dCwiLmdsb2JsXHQkZnVuY1xuIikJaWYgKCRnbG9iYWwpOworICAgIGlmICgkOjpjb2ZmKQorICAgIHsJcHVzaChAb3V0LCIuZGVmXHQkZnVuYztcdC5zY2xcdCIuKDMtJGdsb2JhbCkuIjtcdC50eXBlXHQzMjtcdC5lbmRlZlxuIik7IH0KKyAgICBlbHNpZiAoKCQ6OmFvdXQgYW5kICEkOjpwaWMpIG9yICQ6Om1hY29zeCkKKyAgICB7IH0KKyAgICBlbHNlCisgICAgewlwdXNoKEBvdXQsIi50eXBlCSRmdW5jLFxAZnVuY3Rpb25cbiIpOyB9CisgICAgcHVzaChAb3V0LCIuYWxpZ25cdCRhbGlnblxuIik7CisgICAgcHVzaChAb3V0LCIkZnVuYzpcbiIpOworICAgIHB1c2goQG91dCwiJGJlZ2luOlxuIikJCWlmICgkZ2xvYmFsKTsKKyAgICAkOjpzdGFjaz00OworfQorCitzdWIgOjpmdW5jdGlvbl9lbmRfQgoreyBteSAkZnVuYz1zaGlmdDsKKyAgICBwdXNoKEBvdXQsIi5zaXplXHQkbm1kZWNvciRmdW5jLC4tIi4mOjpMQUJFTCgkZnVuYykuIlxuIikgaWYgKCQ6OmVsZik7CisgICAgJDo6c3RhY2s9MDsKKyAgICAmOjp3aXBlX2xhYmVscygpOworfQorCitzdWIgOjpjb21tZW50CisJeworCWlmICghZGVmaW5lZCgkY29tX3N0YXJ0KSBvciAkOjplbGYpCisJCXsJIyBSZWdhcmRpbmcgJDo6ZWxmIGFib3ZlLi4uCisJCQkjIEdOVSBhbmQgU1ZSNCBhcydlcyB1c2UgZGlmZmVyZW50IGNvbW1lbnQgZGVsaW1pdGVycywKKwkJcHVzaChAb3V0LCJcbiIpOwkjIHNvIHdlIGp1c3Qgc2tpcCBFTEYgY29tbWVudHMuLi4KKwkJcmV0dXJuOworCQl9CisJZm9yZWFjaCAoQF8pCisJCXsKKwkJaWYgKC9eXHMqJC8pCisJCQl7IHB1c2goQG91dCwiXG4iKTsgfQorCQllbHNlCisJCQl7IHB1c2goQG91dCwiXHQkY29tX3N0YXJ0ICRfICRjb21fZW5kXG4iKTsgfQorCQl9CisJfQorCitzdWIgOjpleHRlcm5hbF9sYWJlbAoreyAgIGZvcmVhY2goQF8pIHsgJjo6TEFCRUwoJF8sJG5tZGVjb3IuJF8pOyB9ICAgfQorCitzdWIgOjpwdWJsaWNfbGFiZWwKK3sgICBwdXNoKEBvdXQsIi5nbG9ibFx0Ii4mOjpMQUJFTCgkX1swXSwkbm1kZWNvci4kX1swXSkuIlxuIik7ICAgfQorCitzdWIgOjpmaWxlX2VuZAoreyAgIGlmICgkOjptYWNvc3gpCisgICAgewlpZiAoJW5vbl9sYXp5X3B0cikKKyAgICAJeyAgIHB1c2goQG91dCwiLnNlY3Rpb24gX19JTVBPUlQsX19wb2ludGVycyxub25fbGF6eV9zeW1ib2xfcG9pbnRlcnNcbiIpOworCSAgICBmb3JlYWNoICRpIChrZXlzICVub25fbGF6eV9wdHIpCisJICAgIHsJcHVzaChAb3V0LCIkbm9uX2xhenlfcHRyeyRpfTpcbi5pbmRpcmVjdF9zeW1ib2xcdCRpXG4ubG9uZ1x0MFxuIik7ICAgfQorCX0KKyAgICB9CisgICAgaWYgKDAgJiYgZ3JlcCB7L1xiJHtubWRlY29yfU9QRU5TU0xfaWEzMmNhcF9QXGIvaX0gQG91dCkgeworCW15ICR0bXA9Ii5jb21tXHQke25tZGVjb3J9T1BFTlNTTF9pYTMyY2FwX1AsMTYiOworCWlmICgkOjptYWNvc3gpCXsgcHVzaCAoQG91dCwiJHRtcCwyXG4iKTsgfQorCWVsc2lmICgkOjplbGYpCXsgcHVzaCAoQG91dCwiJHRtcCw0XG4iKTsgfQorCWVsc2UJCXsgcHVzaCAoQG91dCwiJHRtcFxuIik7IH0KKyAgICB9CisgICAgcHVzaChAb3V0LCRpbml0c2VnKSBpZiAoJGluaXRzZWcpOworfQorCitzdWIgOjpkYXRhX2J5dGUJeyAgIHB1c2goQG91dCwiLmJ5dGVcdCIuam9pbignLCcsQF8pLiJcbiIpOyAgIH0KK3N1YiA6OmRhdGFfc2hvcnR7ICAgcHVzaChAb3V0LCIudmFsdWVcdCIuam9pbignLCcsQF8pLiJcbiIpOyAgfQorc3ViIDo6ZGF0YV93b3JkIHsgICBwdXNoKEBvdXQsIi5sb25nXHQiLmpvaW4oJywnLEBfKS4iXG4iKTsgICB9CisKK3N1YiA6OmFsaWduCit7IG15ICR2YWw9JF9bMF07CisgICAgaWYgKCQ6OmFvdXQpCisgICAgewkkdmFsPWludChsb2coJHZhbCkvbG9nKDIpKTsKKwkkdmFsLj0iLDB4OTAiOworICAgIH0KKyAgICBwdXNoKEBvdXQsIi5hbGlnblx0JHZhbFxuIik7Cit9CisKK3N1YiA6OnBpY21ldXAKK3sgbXkoJGRzdCwkc3ltLCRiYXNlLCRyZWZsYWJlbCk9QF87CisKKyAgICBpZiAoZGVmaW5lZCgkYmFzZSkgJiYgJHN5bSBlcSAiT1BFTlNTTF9pYTMyY2FwX1AiICYmICEkOjptYWNvc3gpCisgICAgewkmOjpsZWEoJGRzdCwmOjpEV1AoIiRzeW0tJHJlZmxhYmVsIiwkYmFzZSkpOwl9CisgICAgZWxzaWYgKCgkOjpwaWMgJiYgKCQ6OmVsZiB8fCAkOjphb3V0KSkgfHwgJDo6bWFjb3N4KQorICAgIHsJaWYgKCFkZWZpbmVkKCRiYXNlKSkKKwl7ICAgJjo6Y2FsbCgmOjpsYWJlbCgiUElDX21lX3VwIikpOworCSAgICAmOjpzZXRfbGFiZWwoIlBJQ19tZV91cCIpOworCSAgICAmOjpibGluZHBvcCgkZHN0KTsKKwkgICAgJGJhc2U9JGRzdDsKKwkgICAgJHJlZmxhYmVsPSY6OmxhYmVsKCJQSUNfbWVfdXAiKTsKKwl9CisJaWYgKCQ6Om1hY29zeCkKKwl7ICAgbXkgJGluZGlyZWN0PSY6OnN0YXRpY19sYWJlbCgiJG5tZGVjb3Ikc3ltXCRub25fbGF6eV9wdHIiKTsKKwkgICAgJjo6bW92KCRkc3QsJjo6RFdQKCIkaW5kaXJlY3QtJHJlZmxhYmVsIiwkYmFzZSkpOworCSAgICAkbm9uX2xhenlfcHRyeyIkbm1kZWNvciRzeW0ifT0kaW5kaXJlY3Q7CisJfQorCWVsc2UKKwl7ICAgJjo6bGVhKCRkc3QsJjo6RFdQKCJfR0xPQkFMX09GRlNFVF9UQUJMRV8rWy4tJHJlZmxhYmVsXSIsCisJCQkgICAgJGJhc2UpKTsKKwkgICAgJjo6bW92KCRkc3QsJjo6RFdQKCIkc3ltXEBHT1QiLCRkc3QpKTsKKwl9CisgICAgfQorICAgIGVsc2UKKyAgICB7CSY6OmxlYSgkZHN0LCY6OkRXUCgkc3ltKSk7CX0KK30KKworc3ViIDo6aW5pdHNlZworeyBteSAkZj0kbm1kZWNvci5zaGlmdDsKKworICAgIGlmICgkOjphbmRyb2lkKQorICAgIHsJJGluaXRzZWcuPTw8X19fOworLnNlY3Rpb24JLmluaXRfYXJyYXkKKy5hbGlnbgk0CisubG9uZwkkZgorX19fCisgICAgfQorICAgIGVsc2lmICgkOjplbGYpCisgICAgewkkaW5pdHNlZy49PDxfX187Cisuc2VjdGlvbgkuaW5pdAorCWNhbGwJJGYKK19fXworICAgIH0KKyAgICBlbHNpZiAoJDo6Y29mZikKKyAgICB7ICAgJGluaXRzZWcuPTw8X19fOwkjIGFwcGxpZXMgdG8gYm90aCBDeWd3aW4gYW5kIE1pbmd3Cisuc2VjdGlvbgkuY3RvcnMKKy5sb25nCSRmCitfX18KKyAgICB9CisgICAgZWxzaWYgKCQ6Om1hY29zeCkKKyAgICB7CSRpbml0c2VnLj08PF9fXzsKKy5tb2RfaW5pdF9mdW5jCisuYWxpZ24gMgorLmxvbmcgICAkZgorX19fCisgICAgfQorICAgIGVsc2lmICgkOjphb3V0KQorICAgIHsJbXkgJGN0b3I9IiR7bm1kZWNvcn1fR0xPQkFMX1wkSVwkJGYiOworCSRpbml0c2VnLj0iLnRleHRcbiI7CisJJGluaXRzZWcuPSIudHlwZQkkY3RvcixcQGZ1bmN0aW9uXG4iIGlmICgkOjpwaWMpOworCSRpbml0c2VnLj08PF9fXzsJIyBPcGVuQlNEIHdheS4uLgorLmdsb2JsCSRjdG9yCisuYWxpZ24JMgorJGN0b3I6CisJam1wCSRmCitfX18KKyAgICB9Cit9CisKK3N1YiA6OmRhdGFzZWcKK3sgICBwdXNoKEBvdXQsIi5kYXRhXG4iKTsgICB9CisKKyo6OmhpZGRlbiA9IHN1YiB7IHB1c2goQG91dCwiLmhpZGRlblx0JG5tZGVjb3IkX1swXVxuIik7IH0gaWYgKCQ6OmVsZik7CisKKzE7CmRpZmYgLS1naXQgYS9jcnlwdG8vcGVybGFzbS94ODZtYXNtLnBsIGIvY3J5cHRvL3Blcmxhc20veDg2bWFzbS5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzQxMzQyCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3Blcmxhc20veDg2bWFzbS5wbApAQCAtMCwwICsxLDIwMCBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCitwYWNrYWdlIHg4Nm1hc207CisKKypvdXQ9XEA6Om91dDsKKworJDo6bGJkZWNvcj0iXCRMIjsJIyBsb2NhbCBsYWJlbCBkZWNvcmF0aW9uCiskbm1kZWNvcj0iXyI7CQkjIGV4dGVybmFsIG5hbWUgZGVjb3JhdGlvbgorCiskaW5pdHNlZz0iIjsKKyRzZWdtZW50PSIiOworCitzdWIgOjpnZW5lcmljCit7IG15ICgkb3Bjb2RlLEBhcmcpPUBfOworCisgICAgIyBmaXggaGV4YWRlY2ltYWwgY29uc3RhbnRzCisgICAgZm9yIChAYXJnKSB7IHMvKD88IVtcd1wkXC5dKTB4KFswLTlhLWZdKykvMCQxaC9vaTsgfQorCisgICAgaWYgKCRvcGNvZGUgPX4gL2xlYS8gJiYgQGFyZ1sxXSA9fiBzLy4qUFRSXHMrKFwoLipcKSkkL09GRlNFVCAkMS8pCSMgbm8gW10KKyAgICB7CSRvcGNvZGU9Im1vdiI7CX0KKyAgICBlbHNpZiAoJG9wY29kZSAhfiAvbW92cS8pCisgICAgewkjIGZpeCB4bW0gcmVmZXJlbmNlcworCSRhcmdbMF0gPX4gcy9cYltBLVpdK1dPUkRccytQVFIvWE1NV09SRCBQVFIvaSBpZiAoJGFyZ1sxXT1+L1xieG1tWzAtN11cYi9pKTsKKwkkYXJnWzFdID1+IHMvXGJbQS1aXStXT1JEXHMrUFRSL1hNTVdPUkQgUFRSL2kgaWYgKCRhcmdbMF09fi9cYnhtbVswLTddXGIvaSk7CisgICAgfQorCisgICAgJjo6ZW1pdCgkb3Bjb2RlLEBhcmcpOworICAxOworfQorIworIyBvcGNvZGVzIG5vdCBjb3ZlcmVkIGJ5IDo6Z2VuZXJpYyBhYm92ZSwgbW9zdGx5IGluY29uc2lzdGVudCBuYW1pbmdzLi4uCisjCitzdWIgOjpjYWxsCXsgJjo6ZW1pdCgiY2FsbCIsKCY6OmlzbGFiZWwoJF9bMF0pIG9yICIkbm1kZWNvciRfWzBdIikpOyB9CitzdWIgOjpjYWxsX3B0cgl7ICY6OmVtaXQoImNhbGwiLEBfKTsJfQorc3ViIDo6am1wX3B0cgl7ICY6OmVtaXQoImptcCIsQF8pOwl9CitzdWIgOjpsb2NrCXsgJjo6ZGF0YV9ieXRlKDB4ZjApOwl9CisKK3N1YiBnZXRfbWVtCit7IG15KCRzaXplLCRhZGRyLCRyZWcxLCRyZWcyLCRpZHgpPUBfOworICBteSgkcG9zdCwkcmV0KTsKKworICAgIGlmICghZGVmaW5lZCgkaWR4KSAmJiAxKiRyZWcyKSB7ICRpZHg9JHJlZzI7ICRyZWcyPSRyZWcxOyB1bmRlZiAkcmVnMTsgfQorCisgICAgJHJldCAuPSAiJHNpemUgUFRSICIgaWYgKCRzaXplIG5lICIiKTsKKworICAgICRhZGRyID1+IHMvXlxzKy8vOworICAgICMgcHJlcGVuZCBnbG9iYWwgcmVmZXJlbmNlcyB3aXRoIG9wdGlvbmFsIHVuZGVyc2NvcmUKKyAgICAkYWRkciA9fiBzL14oW15cK1wtMC05XVteXCtcLV0qKS8mOjppc2xhYmVsKCQxKSBvciAiJG5tZGVjb3IkMSIvaWdlOworICAgICMgcHV0IGFkZHJlc3MgYXJpdGhtZXRpYyBleHByZXNzaW9uIGluIHBhcmVudGhlc2lzCisgICAgJGFkZHI9IigkYWRkcikiIGlmICgkYWRkciA9fiAvXi4rW1wtXCtdLiskLyk7CisKKyAgICBpZiAoKCRhZGRyIG5lICIiKSAmJiAoJGFkZHIgbmUgMCkpCisgICAgewlpZiAoJGFkZHIgIX4gL14tLykJeyAkcmV0IC49ICIkYWRkciI7ICB9CisJZWxzZQkJCXsgJHBvc3Q9JGFkZHI7ICAgICAgfQorICAgIH0KKyAgICAkcmV0IC49ICJbIjsKKworICAgIGlmICgkcmVnMiBuZSAiIikKKyAgICB7CSRpZHghPTAgb3IgJGlkeD0xOworCSRyZXQgLj0gIiRyZWcyKiRpZHgiOworCSRyZXQgLj0gIiskcmVnMSIgaWYgKCRyZWcxIG5lICIiKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsJJHJldCAuPSAiJHJlZzEiOyAgIH0KKworICAgICRyZXQgLj0gIiRwb3N0XSI7CisgICAgJHJldCA9fiBzL1wrXF0vXS87ICMgaW4gY2FzZSAkYWRkciB3YXMgdGhlIG9ubHkgYXJndW1lbnQKKyAgICAkcmV0ID1+IHMvXFtccypcXS8vOworCisgICRyZXQ7Cit9CitzdWIgOjpCUAl7ICZnZXRfbWVtKCJCWVRFIixAXyk7ICB9CitzdWIgOjpXUAl7ICZnZXRfbWVtKCJXT1JEIixAXyk7CX0KK3N1YiA6OkRXUAl7ICZnZXRfbWVtKCJEV09SRCIsQF8pOyB9CitzdWIgOjpRV1AJeyAmZ2V0X21lbSgiUVdPUkQiLEBfKTsgfQorc3ViIDo6QkMJeyAiQF8iOyAgfQorc3ViIDo6RFdDCXsgIkBfIjsgfQorCitzdWIgOjpmaWxlCit7IG15ICR0bXA9PDxfX187CitUSVRMRQkkX1swXS5hc20KK0lGIFxAVmVyc2lvbiBMVCA4MDAKK0VDSE8gTUFTTSB2ZXJzaW9uIDguMDAgb3IgbGF0ZXIgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQuCitFTkRJRgorLjQ4NgorLk1PREVMCUZMQVQKK09QVElPTglET1ROQU1FCitJRiBcQFZlcnNpb24gTFQgODAwCisudGV4dFwkCVNFR01FTlQgUEFHRSAnQ09ERScKK0VMU0UKKy50ZXh0XCQJU0VHTUVOVCBBTElHTig2NCkgJ0NPREUnCitFTkRJRgorX19fCisgICAgcHVzaChAb3V0LCR0bXApOworICAgICRzZWdtZW50ID0gIi50ZXh0XCQiOworfQorCitzdWIgOjpmdW5jdGlvbl9iZWdpbl9CCit7IG15ICRmdW5jPXNoaWZ0OworICBteSAkZ2xvYmFsPSgkZnVuYyAhfiAvXl8vKTsKKyAgbXkgJGJlZ2luPSIkezo6bGJkZWNvcn1fJHtmdW5jfV9iZWdpbiI7CisKKyAgICAmOjpMQUJFTCgkZnVuYywkZ2xvYmFsPyIkYmVnaW4iOiIkbm1kZWNvciRmdW5jIik7CisgICAgJGZ1bmM9IkFMSUdOXHQxNlxuIi4kbm1kZWNvci4kZnVuYy4iXHRQUk9DIjsKKworICAgIGlmICgkZ2xvYmFsKSAgICB7ICRmdW5jLj0iIFBVQkxJQ1xuJHtiZWdpbn06OlxuIjsgfQorICAgIGVsc2UJICAgIHsgJGZ1bmMuPSIgUFJJVkFURVxuIjsgICAgICAgICAgICB9CisgICAgcHVzaChAb3V0LCRmdW5jKTsKKyAgICAkOjpzdGFjaz00OworfQorc3ViIDo6ZnVuY3Rpb25fZW5kX0IKK3sgbXkgJGZ1bmM9c2hpZnQ7CisKKyAgICBwdXNoKEBvdXQsIiRubWRlY29yJGZ1bmMgRU5EUFxuIik7CisgICAgJDo6c3RhY2s9MDsKKyAgICAmOjp3aXBlX2xhYmVscygpOworfQorCitzdWIgOjpmaWxlX2VuZAoreyBteSAkeG1taGVhZGVyPTw8X19fOworLjY4NgorLlhNTQorSUYgXEBWZXJzaW9uIExUIDgwMAorWE1NV09SRCBTVFJVQ1QgMTYKK0RRCTIgZHVwICg/KQorWE1NV09SRAlFTkRTCitFTkRJRgorX19fCisgICAgaWYgKGdyZXAgey9cYlt4XT9tbVswLTddXGIvaX0gQG91dCkgeworCWdyZXAge3MvXC5bMy03XTg2LyR4bW1oZWFkZXIvfSBAb3V0OworICAgIH0KKworICAgIHB1c2goQG91dCwiJHNlZ21lbnQJRU5EU1xuIik7CisKKyAgICBpZiAoZ3JlcCB7L1xiJHtubWRlY29yfU9QRU5TU0xfaWEzMmNhcF9QXGIvaX0gQG91dCkKKyAgICB7CW15ICRjb21tPTw8X19fOworLmJzcwlTRUdNRU5UICdCU1MnCitDT01NCSR7bm1kZWNvcn1PUEVOU1NMX2lhMzJjYXBfUDpEV09SRDo0CisuYnNzCUVORFMKK19fXworCSMgY29tbWVudCBvdXQgT1BFTlNTTF9pYTMyY2FwX1AgZGVjbGFyYXRpb25zCisJZ3JlcCB7cy8oXkVYVEVSTlxzKyR7bm1kZWNvcn1PUEVOU1NMX2lhMzJjYXBfUCkvXDskMS99IEBvdXQ7CisJcHVzaCAoQG91dCwkY29tbSk7CisgICAgfQorICAgIHB1c2ggKEBvdXQsJGluaXRzZWcpIGlmICgkaW5pdHNlZyk7CisgICAgcHVzaCAoQG91dCwiRU5EXG4iKTsKK30KKworc3ViIDo6Y29tbWVudCB7ICAgZm9yZWFjaCAoQF8pIHsgcHVzaChAb3V0LCJcdDsgJF9cbiIpOyB9ICAgfQorCisqOjpzZXRfbGFiZWxfQiA9IHN1YgoreyBteSAkbD1zaGlmdDsgcHVzaChAb3V0LCRsLigkbD1+L15cUSR7OjpsYmRlY29yfVxFWzAtOV17M30vPyI6XG4iOiI6OlxuIikpOyB9OworCitzdWIgOjpleHRlcm5hbF9sYWJlbAoreyAgIGZvcmVhY2goQF8pCisgICAgewlwdXNoKEBvdXQsICJFWFRFUk5cdCIuJjo6TEFCRUwoJF8sJG5tZGVjb3IuJF8pLiI6TkVBUlxuIik7ICAgfQorfQorCitzdWIgOjpwdWJsaWNfbGFiZWwKK3sgICBwdXNoKEBvdXQsIlBVQkxJQ1x0Ii4mOjpMQUJFTCgkX1swXSwkbm1kZWNvci4kX1swXSkuIlxuIik7ICAgfQorCitzdWIgOjpkYXRhX2J5dGUKK3sgICBwdXNoKEBvdXQsKCJEQlx0Iikuam9pbignLCcsQF8pLiJcbiIpOwl9CisKK3N1YiA6OmRhdGFfc2hvcnQKK3sgICBwdXNoKEBvdXQsKCJEV1x0Iikuam9pbignLCcsQF8pLiJcbiIpOwl9CisKK3N1YiA6OmRhdGFfd29yZAoreyAgIHB1c2goQG91dCwoIkREXHQiKS5qb2luKCcsJyxAXykuIlxuIik7CX0KKworc3ViIDo6YWxpZ24KK3sgICBwdXNoKEBvdXQsIkFMSUdOXHQkX1swXVxuIik7CX0KKworc3ViIDo6cGljbWV1cAoreyBteSgkZHN0LCRzeW0pPUBfOworICAgICY6OmxlYSgkZHN0LCY6OkRXUCgkc3ltKSk7Cit9CisKK3N1YiA6OmluaXRzZWcKK3sgbXkgJGY9JG5tZGVjb3Iuc2hpZnQ7CisKKyAgICAkaW5pdHNlZy49PDxfX187CisuQ1JUXCRYQ1UJU0VHTUVOVCBEV09SRCBQVUJMSUMgJ0RBVEEnCitFWFRFUk4JJGY6TkVBUgorREQJJGYKKy5DUlRcJFhDVQlFTkRTCitfX18KK30KKworc3ViIDo6ZGF0YXNlZworeyAgIHB1c2goQG91dCwiJHNlZ21lbnRcdEVORFNcbl9EQVRBXHRTRUdNRU5UXG4iKTsgJHNlZ21lbnQ9Il9EQVRBIjsgICB9CisKK3N1YiA6OnNhZmVzZWgKK3sgbXkgJG5tPXNoaWZ0OworICAgIHB1c2goQG91dCwiSUYgXEBWZXJzaW9uIEdFIDcxMFxuIik7CisgICAgcHVzaChAb3V0LCIuU0FGRVNFSAkiLiY6OkxBQkVMKCRubSwkbm1kZWNvci4kbm0pLiJcbiIpOworICAgIHB1c2goQG91dCwiRU5ESUZcbiIpOworfQorCisxOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3Blcmxhc20veDg2bmFzbS5wbCBiL2NyeXB0by9wZXJsYXNtL3g4Nm5hc20ucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ5MmY2MAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9wZXJsYXNtL3g4Nm5hc20ucGwKQEAgLTAsMCArMSwxNzkgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworcGFja2FnZSB4ODZuYXNtOworCisqb3V0PVxAOjpvdXQ7CisKKyQ6OmxiZGVjb3I9IkxcJCI7CQkjIGxvY2FsIGxhYmVsIGRlY29yYXRpb24KKyRubWRlY29yPSQ6Om5ldHdhcmU/IiI6Il8iOwkjIGV4dGVybmFsIG5hbWUgZGVjb3JhdGlvbgorJGRyZGVjb3I9JDo6bXdlcmtzPyIuIjoiIjsJIyBkaXJlY3RpdmUgZGVjb3JhdGlvbgorCiskaW5pdHNlZz0iIjsKKworc3ViIDo6Z2VuZXJpYworeyBteSAkb3Bjb2RlPXNoaWZ0OworICBteSAkdG1wOworCisgICAgaWYgKCEkOjptd2Vya3MpCisgICAgeyAgIGlmICAgICgkb3Bjb2RlID1+IG0vXmovbyAmJiAkI189PTApICMgb3B0aW1pemUganVtcHMKKwl7ICAgJF9bMF0gPSAiTkVBUiAkX1swXSI7ICAgCX0KKwllbHNpZiAoJG9wY29kZSBlcSAibGVhIiAmJiAkI189PTEpICAjIHdpcGUgc3RvcmFnZSBxdWFsaWZpZXIgZnJvbSBsZWEKKwl7ICAgJF9bMV0gPX4gcy9eW15cW10qXFsvXFsvbzsJfQorCWVsc2lmICgkb3Bjb2RlIGVxICJjbGZsdXNoIiAmJiAkI189PTApCisJeyAgICRfWzBdID1+IHMvXlteXFtdKlxbL1xbL287CX0KKyAgICB9CisgICAgJjo6ZW1pdCgkb3Bjb2RlLEBfKTsKKyAgMTsKK30KKyMKKyMgb3Bjb2RlcyBub3QgY292ZXJlZCBieSA6OmdlbmVyaWMgYWJvdmUsIG1vc3RseSBpbmNvbnNpc3RlbnQgbmFtaW5ncy4uLgorIworc3ViIDo6Y2FsbAl7ICY6OmVtaXQoImNhbGwiLCgmOjppc2xhYmVsKCRfWzBdKSBvciAiJG5tZGVjb3IkX1swXSIpKTsgfQorc3ViIDo6Y2FsbF9wdHIJeyAmOjplbWl0KCJjYWxsIixAXyk7CX0KK3N1YiA6OmptcF9wdHIJeyAmOjplbWl0KCJqbXAiLEBfKTsJfQorCitzdWIgZ2V0X21lbQoreyBteSgkc2l6ZSwkYWRkciwkcmVnMSwkcmVnMiwkaWR4KT1AXzsKKyAgbXkoJHBvc3QsJHJldCk7CisKKyAgICBpZiAoIWRlZmluZWQoJGlkeCkgJiYgMSokcmVnMikgeyAkaWR4PSRyZWcyOyAkcmVnMj0kcmVnMTsgdW5kZWYgJHJlZzE7IH0KKworICAgIGlmICgkc2l6ZSBuZSAiIikKKyAgICB7CSRyZXQgLj0gIiRzaXplIjsKKwkkcmV0IC49ICIgUFRSIiBpZiAoJDo6bXdlcmtzKTsKKwkkcmV0IC49ICIgIjsKKyAgICB9CisgICAgJHJldCAuPSAiWyI7CisKKyAgICAkYWRkciA9fiBzL15ccysvLzsKKyAgICAjIHByZXBlbmQgZ2xvYmFsIHJlZmVyZW5jZXMgd2l0aCBvcHRpb25hbCB1bmRlcnNjb3JlCisgICAgJGFkZHIgPX4gcy9eKFteXCtcLTAtOV1bXlwrXC1dKikvOjppc2xhYmVsKCQxKSBvciAiJG5tZGVjb3IkMSIvaWdlOworICAgICMgcHV0IGFkZHJlc3MgYXJpdGhtZXRpYyBleHByZXNzaW9uIGluIHBhcmVudGhlc2lzCisgICAgJGFkZHI9IigkYWRkcikiIGlmICgkYWRkciA9fiAvXi4rW1wtXCtdLiskLyk7CisKKyAgICBpZiAoKCRhZGRyIG5lICIiKSAmJiAoJGFkZHIgbmUgMCkpCisgICAgewlpZiAoJGFkZHIgIX4gL14tLykJeyAkcmV0IC49ICIkYWRkcisiOyB9CisJZWxzZQkJCXsgJHBvc3Q9JGFkZHI7ICAgICAgfQorICAgIH0KKworICAgIGlmICgkcmVnMiBuZSAiIikKKyAgICB7CSRpZHghPTAgb3IgJGlkeD0xOworCSRyZXQgLj0gIiRyZWcyKiRpZHgiOworCSRyZXQgLj0gIiskcmVnMSIgaWYgKCRyZWcxIG5lICIiKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsJJHJldCAuPSAiJHJlZzEiOyAgIH0KKworICAgICRyZXQgLj0gIiRwb3N0XSI7CisgICAgJHJldCA9fiBzL1wrXF0vXS87ICMgaW4gY2FzZSAkYWRkciB3YXMgdGhlIG9ubHkgYXJndW1lbnQKKworICAkcmV0OworfQorc3ViIDo6QlAJeyAmZ2V0X21lbSgiQllURSIsQF8pOyAgfQorc3ViIDo6RFdQCXsgJmdldF9tZW0oIkRXT1JEIixAXyk7IH0KK3N1YiA6OldQCXsgJmdldF9tZW0oIldPUkQiLEBfKTsJfQorc3ViIDo6UVdQCXsgJmdldF9tZW0oIiIsQF8pOyAgICAgIH0KK3N1YiA6OkJDCXsgKCgkOjptd2Vya3MpPyIiOiJCWVRFICIpLiJAXyI7ICB9CitzdWIgOjpEV0MJeyAoKCQ6Om13ZXJrcyk/IiI6IkRXT1JEICIpLiJAXyI7IH0KKworc3ViIDo6ZmlsZQoreyAgIGlmICgkOjptd2Vya3MpCXsgcHVzaChAb3V0LCIuc2VjdGlvblx0LnRleHQsNjRcbiIpOyB9CisgICAgZWxzZQorICAgIHsgbXkgJHRtcD08PF9fXzsKKyVpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyxvYmoKK3NlY3Rpb24JY29kZQl1c2UzMiBjbGFzcz1jb2RlIGFsaWduPTY0CislZWxpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyx3aW4zMgorXCRcQGZlYXQuMDAgZXF1IDEKK3NlY3Rpb24JLnRleHQJY29kZSBhbGlnbj02NAorJWVsc2UKK3NlY3Rpb24JLnRleHQJY29kZQorJWVuZGlmCitfX18KKwlwdXNoKEBvdXQsJHRtcCk7CisgICAgfQorfQorCitzdWIgOjpmdW5jdGlvbl9iZWdpbl9CCit7IG15ICRmdW5jPXNoaWZ0OworICBteSAkZ2xvYmFsPSgkZnVuYyAhfiAvXl8vKTsKKyAgbXkgJGJlZ2luPSIkezo6bGJkZWNvcn1fJHtmdW5jfV9iZWdpbiI7CisKKyAgICAkYmVnaW4gPX4gcy9eXEAvLi8gaWYgKCQ6Om13ZXJrcyk7CSMgdGhlIHRvcnR1cmUgbmV2ZXIgc3RvcHMKKworICAgICY6OkxBQkVMKCRmdW5jLCRnbG9iYWw/IiRiZWdpbiI6IiRubWRlY29yJGZ1bmMiKTsKKyAgICAkZnVuYz0kbm1kZWNvci4kZnVuYzsKKworICAgIHB1c2goQG91dCwiJHtkcmRlY29yfWdsb2JhbAkkZnVuY1xuIikJaWYgKCRnbG9iYWwpOworICAgIHB1c2goQG91dCwiJHtkcmRlY29yfWFsaWduCTE2XG4iKTsKKyAgICBwdXNoKEBvdXQsIiRmdW5jOlxuIik7CisgICAgcHVzaChAb3V0LCIkYmVnaW46XG4iKQkJCWlmICgkZ2xvYmFsKTsKKyAgICAkOjpzdGFjaz00OworfQorCitzdWIgOjpmdW5jdGlvbl9lbmRfQgoreyAgICQ6OnN0YWNrPTA7CisgICAgJjo6d2lwZV9sYWJlbHMoKTsKK30KKworc3ViIDo6ZmlsZV9lbmQKK3sgICBpZiAoZ3JlcCB7L1xiJHtubWRlY29yfU9QRU5TU0xfaWEzMmNhcF9QXGIvaX0gQG91dCkKKyAgICB7CW15ICRjb21tPTw8X19fOworJHtkcmRlY29yfXNlZ21lbnQJLmJzcworJHtkcmRlY29yfWNvbW1vbgkke25tZGVjb3J9T1BFTlNTTF9pYTMyY2FwX1AgMTYKK19fXworCSMgY29tbWVudCBvdXQgT1BFTlNTTF9pYTMyY2FwX1AgZGVjbGFyYXRpb25zCisJZ3JlcCB7cy8oXmV4dGVyblxzKyR7bm1kZWNvcn1PUEVOU1NMX2lhMzJjYXBfUCkvXDskMS99IEBvdXQ7CisJcHVzaCAoQG91dCwkY29tbSkKKyAgICB9CisgICAgcHVzaCAoQG91dCwkaW5pdHNlZykgaWYgKCRpbml0c2VnKTsJCQorfQorCitzdWIgOjpjb21tZW50IHsgICBmb3JlYWNoIChAXykgeyBwdXNoKEBvdXQsIlx0OyAkX1xuIik7IH0gICB9CisKK3N1YiA6OmV4dGVybmFsX2xhYmVsCit7ICAgZm9yZWFjaChAXykKKyAgICB7CXB1c2goQG91dCwiJHtkcmRlY29yfWV4dGVyblx0Ii4mOjpMQUJFTCgkXywkbm1kZWNvci4kXykuIlxuIik7ICAgfQorfQorCitzdWIgOjpwdWJsaWNfbGFiZWwKK3sgICBwdXNoKEBvdXQsIiR7ZHJkZWNvcn1nbG9iYWxcdCIuJjo6TEFCRUwoJF9bMF0sJG5tZGVjb3IuJF9bMF0pLiJcbiIpOyAgfQorCitzdWIgOjpkYXRhX2J5dGUKK3sgICBwdXNoKEBvdXQsKCgkOjptd2Vya3MpPyIuYnl0ZVx0IjoiZGJcdCIpLmpvaW4oJywnLEBfKS4iXG4iKTsJfQorc3ViIDo6ZGF0YV9zaG9ydAoreyAgIHB1c2goQG91dCwoKCQ6Om13ZXJrcyk/Ii53b3JkXHQiOiJkd1x0Iikuam9pbignLCcsQF8pLiJcbiIpOwl9CitzdWIgOjpkYXRhX3dvcmQKK3sgICBwdXNoKEBvdXQsKCgkOjptd2Vya3MpPyIubG9uZ1x0IjoiZGRcdCIpLmpvaW4oJywnLEBfKS4iXG4iKTsJfQorCitzdWIgOjphbGlnbgoreyAgIHB1c2goQG91dCwiJHtkcmRlY29yfWFsaWduXHQkX1swXVxuIik7CX0KKworc3ViIDo6cGljbWV1cAoreyBteSgkZHN0LCRzeW0pPUBfOworICAgICY6OmxlYSgkZHN0LCY6OkRXUCgkc3ltKSk7Cit9CisKK3N1YiA6OmluaXRzZWcKK3sgbXkgJGY9JG5tZGVjb3Iuc2hpZnQ7CisgICAgaWYgKCQ6OndpbjMyKQorICAgIHsJJGluaXRzZWc9PDxfX187CitzZWdtZW50CS5DUlRcJFhDVSBkYXRhIGFsaWduPTQKK2V4dGVybgkkZgorZGQJJGYKK19fXworICAgIH0KK30KKworc3ViIDo6ZGF0YXNlZworeyAgIGlmICgkbXdlcmtzKQl7IHB1c2goQG91dCwiLnNlY3Rpb25cdC5kYXRhLDRcbiIpOyAgIH0KKyAgICBlbHNlCQl7IHB1c2goQG91dCwic2VjdGlvblx0LmRhdGEgYWxpZ249NFxuIik7IH0KK30KKworc3ViIDo6c2FmZXNlaAoreyBteSAkbm09c2hpZnQ7CisgICAgcHVzaChAb3V0LCIlaWYJX19OQVNNX1ZFUlNJT05fSURfXyA+PSAweDAyMDMwMDAwXG4iKTsKKyAgICBwdXNoKEBvdXQsInNhZmVzZWgJIi4mOjpMQUJFTCgkbm0sJG5tZGVjb3IuJG5tKS4iXG4iKTsKKyAgICBwdXNoKEBvdXQsIiVlbmRpZlxuIik7Cit9CisKKzE7CmRpZmYgLS1naXQgYS9jcnlwdG8vcGtjczgvQ01ha2VMaXN0cy50eHQgYi9jcnlwdG8vcGtjczgvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg5YWY4NQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9wa2NzOC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDEzIEBACitpbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKKworYWRkX2xpYnJhcnkoCisJcGtjczgKKworCU9CSkVDVAorCisJcGtjczguYworCXA4X3BrZXkuYworCXA1X3BiZS5jCisJcDVfcGJldjIuYworCXBrY3M4X2Vycm9yLmMKKykKZGlmZiAtLWdpdCBhL2NyeXB0by9wa2NzOC9pbnRlcm5hbC5oIGIvY3J5cHRvL3BrY3M4L2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRjYTRmNwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9wa2NzOC9pbnRlcm5hbC5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAxOTk5LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4gKi8KKworI2lmbmRlZiBPUEVOU1NMX0hFQURFUl9QS0NTOF9JTlRFUk5BTF9ICisjZGVmaW5lIE9QRU5TU0xfSEVBREVSX1BLQ1M4X0lOVEVSTkFMX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvYmFzZS5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworI2RlZmluZSBQS0NTNV9ERUZBVUxUX0lURVJBVElPTlMgMjA0OAorI2RlZmluZSBQS0NTNV9TQUxUX0xFTiA4CisKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9ICAvKiBleHRlcm4gQyAqLworI2VuZGlmCisKKyNlbmRpZiAgLyogT1BFTlNTTF9IRUFERVJfUEtDUzhfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3BrY3M4L3A1X3BiZS5jIGIvY3J5cHRvL3BrY3M4L3A1X3BiZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZGZmNGMKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vcGtjczgvcDVfcGJlLmMKQEAgLTAsMCArMSwxNDggQEAKKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAxOTk5LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGtjczguaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKworI2luY2x1ZGUgImludGVybmFsLmgiCisKKworLyogUEtDUyM1IHBhc3N3b3JkIGJhc2VkIGVuY3J5cHRpb24gc3RydWN0dXJlICovCisKK0FTTjFfU0VRVUVOQ0UoUEJFUEFSQU0pID0geworCUFTTjFfU0lNUExFKFBCRVBBUkFNLCBzYWx0LCBBU04xX09DVEVUX1NUUklORyksCisJQVNOMV9TSU1QTEUoUEJFUEFSQU0sIGl0ZXIsIEFTTjFfSU5URUdFUikKK30gQVNOMV9TRVFVRU5DRV9FTkQoUEJFUEFSQU0pCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhQQkVQQVJBTSkKKworCisvKiBTZXQgYW4gYWxnb3JpdGhtIGlkZW50aWZpZXIgZm9yIGEgUEtDUyM1IFBCRSBhbGdvcml0aG0gKi8KKworaW50IFBLQ1M1X3BiZV9zZXQwX2FsZ29yKFg1MDlfQUxHT1IgKmFsZ29yLCBpbnQgYWxnLCBpbnQgaXRlciwKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpzYWx0LCBpbnQgc2FsdGxlbikKKwl7CisJUEJFUEFSQU0gKnBiZT1OVUxMOworCUFTTjFfU1RSSU5HICpwYmVfc3RyPU5VTEw7CisJdW5zaWduZWQgY2hhciAqc3N0cjsKKworCXBiZSA9IFBCRVBBUkFNX25ldygpOworCWlmICghcGJlKQorCQl7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTNV9wYmVfc2V0MF9hbGdvciwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCWlmKGl0ZXIgPD0gMCkKKwkJaXRlciA9IFBLQ1M1X0RFRkFVTFRfSVRFUkFUSU9OUzsKKwlpZiAoIUFTTjFfSU5URUdFUl9zZXQocGJlLT5pdGVyLCBpdGVyKSkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzVfcGJlX3NldDBfYWxnb3IsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJZ290byBlcnI7CisJCX0KKwlpZiAoIXNhbHRsZW4pCisJCXNhbHRsZW4gPSBQS0NTNV9TQUxUX0xFTjsKKwlpZiAoIUFTTjFfU1RSSU5HX3NldChwYmUtPnNhbHQsIE5VTEwsIHNhbHRsZW4pKQorCQl7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTNV9wYmVfc2V0MF9hbGdvciwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCXNzdHIgPSBBU04xX1NUUklOR19kYXRhKHBiZS0+c2FsdCk7CisJaWYgKHNhbHQpCisJCW1lbWNweShzc3RyLCBzYWx0LCBzYWx0bGVuKTsKKwllbHNlIGlmIChSQU5EX3BzZXVkb19ieXRlcyhzc3RyLCBzYWx0bGVuKSA8IDApCisJCWdvdG8gZXJyOworCisJaWYoIUFTTjFfaXRlbV9wYWNrKHBiZSwgQVNOMV9JVEVNX3JwdHIoUEJFUEFSQU0pLCAmcGJlX3N0cikpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M1X3BiZV9zZXQwX2FsZ29yLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCWdvdG8gZXJyOworCQl9CisKKwlQQkVQQVJBTV9mcmVlKHBiZSk7CisJcGJlID0gTlVMTDsKKworCWlmIChYNTA5X0FMR09SX3NldDAoYWxnb3IsIE9CSl9uaWQyb2JqKGFsZyksIFZfQVNOMV9TRVFVRU5DRSwgcGJlX3N0cikpCisJCXJldHVybiAxOworCitlcnI6CisJaWYgKHBiZSAhPSBOVUxMKQorCQlQQkVQQVJBTV9mcmVlKHBiZSk7CisJaWYgKHBiZV9zdHIgIT0gTlVMTCkKKwkJQVNOMV9TVFJJTkdfZnJlZShwYmVfc3RyKTsKKwlyZXR1cm4gMDsKKwl9CisKKy8qIFJldHVybiBhbiBhbGdvcml0aG0gaWRlbnRpZmllciBmb3IgYSBQS0NTIzUgUEJFIGFsZ29yaXRobSAqLworCitYNTA5X0FMR09SICpQS0NTNV9wYmVfc2V0KGludCBhbGcsIGludCBpdGVyLAorCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNhbHQsIGludCBzYWx0bGVuKQorCXsKKwlYNTA5X0FMR09SICpyZXQ7CisJcmV0ID0gWDUwOV9BTEdPUl9uZXcoKTsKKwlpZiAoIXJldCkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzVfcGJlX3NldCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJaWYgKFBLQ1M1X3BiZV9zZXQwX2FsZ29yKHJldCwgYWxnLCBpdGVyLCBzYWx0LCBzYWx0bGVuKSkgCisJCXJldHVybiByZXQ7CisKKwlYNTA5X0FMR09SX2ZyZWUocmV0KTsKKwlyZXR1cm4gTlVMTDsKKwl9CmRpZmYgLS1naXQgYS9jcnlwdG8vcGtjczgvcDVfcGJldjIuYyBiL2NyeXB0by9wa2NzOC9wNV9wYmV2Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NzQ2ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vcGtjczgvcDVfcGJldjIuYwpAQCAtMCwwICsxLDI5OCBAQAorLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDE5OTktMjAwNC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuICovCisKKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NpcGhlci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BrY3M4Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisKKy8qIFBLQ1MjNSB2Mi4wIHBhc3N3b3JkIGJhc2VkIGVuY3J5cHRpb24gc3RydWN0dXJlcyAqLworCitBU04xX1NFUVVFTkNFKFBCRTJQQVJBTSkgPSB7CisJQVNOMV9TSU1QTEUoUEJFMlBBUkFNLCBrZXlmdW5jLCBYNTA5X0FMR09SKSwKKwlBU04xX1NJTVBMRShQQkUyUEFSQU0sIGVuY3J5cHRpb24sIFg1MDlfQUxHT1IpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKFBCRTJQQVJBTSkKKworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKFBCRTJQQVJBTSkKKworQVNOMV9TRVFVRU5DRShQQktERjJQQVJBTSkgPSB7CisJQVNOMV9TSU1QTEUoUEJLREYyUEFSQU0sIHNhbHQsIEFTTjFfQU5ZKSwKKwlBU04xX1NJTVBMRShQQktERjJQQVJBTSwgaXRlciwgQVNOMV9JTlRFR0VSKSwKKwlBU04xX09QVChQQktERjJQQVJBTSwga2V5bGVuZ3RoLCBBU04xX0lOVEVHRVIpLAorCUFTTjFfT1BUKFBCS0RGMlBBUkFNLCBwcmYsIFg1MDlfQUxHT1IpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKFBCS0RGMlBBUkFNKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoUEJLREYyUEFSQU0pOworCitzdGF0aWMgaW50IEFTTjFfVFlQRV9zZXRfb2N0ZXRzdHJpbmcoQVNOMV9UWVBFICphLCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuKQorCXsKKwlBU04xX1NUUklORyAqb3M7CisKKwlpZiAoKG9zPU1fQVNOMV9PQ1RFVF9TVFJJTkdfbmV3KCkpID09IE5VTEwpIHJldHVybigwKTsKKwlpZiAoIU1fQVNOMV9PQ1RFVF9TVFJJTkdfc2V0KG9zLGRhdGEsbGVuKSkgcmV0dXJuKDApOworCUFTTjFfVFlQRV9zZXQoYSxWX0FTTjFfT0NURVRfU1RSSU5HLG9zKTsKKwlyZXR1cm4oMSk7CisJfQorCitzdGF0aWMgaW50IHBhcmFtX3RvX2FzbjEoRVZQX0NJUEhFUl9DVFggKmMsIEFTTjFfVFlQRSAqdHlwZSkKKwl7CisJdW5zaWduZWQgaXZfbGVuOworCisJaXZfbGVuID0gRVZQX0NJUEhFUl9DVFhfaXZfbGVuZ3RoKGMpOworCXJldHVybiBBU04xX1RZUEVfc2V0X29jdGV0c3RyaW5nKHR5cGUsIGMtPm9pdiwgaXZfbGVuKTsKKwl9CisKKy8qIFJldHVybiBhbiBhbGdvcml0aG0gaWRlbnRpZmllciBmb3IgYSBQS0NTIzUgdjIuMCBQQkUgYWxnb3JpdGhtOgorICogeWVzIEkga25vdyB0aGlzIGlzIGhvcnJpYmxlIQorICoKKyAqIEV4dGVuZGVkIHZlcnNpb24gdG8gYWxsb3cgYXBwbGljYXRpb24gc3VwcGxpZWQgUFJGIE5JRCBhbmQgSVYuICovCisKK1g1MDlfQUxHT1IgKlBLQ1M1X3BiZTJfc2V0X2l2KGNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlciwgaW50IGl0ZXIsCisJCQkJIHVuc2lnbmVkIGNoYXIgKnNhbHQsIGludCBzYWx0bGVuLAorCQkJCSB1bnNpZ25lZCBjaGFyICphaXYsIGludCBwcmZfbmlkKQoreworCVg1MDlfQUxHT1IgKnNjaGVtZSA9IE5VTEwsICprYWxnID0gTlVMTCwgKnJldCA9IE5VTEw7CisJaW50IGFsZ19uaWQsIGtleWxlbjsKKwlFVlBfQ0lQSEVSX0NUWCBjdHg7CisJdW5zaWduZWQgY2hhciBpdltFVlBfTUFYX0lWX0xFTkdUSF07CisJUEJFMlBBUkFNICpwYmUyID0gTlVMTDsKKwljb25zdCBBU04xX09CSkVDVCAqb2JqOworCisJYWxnX25pZCA9IEVWUF9DSVBIRVJfbmlkKGNpcGhlcik7CisJaWYoYWxnX25pZCA9PSBOSURfdW5kZWYpIHsKKwkJT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M1X3BiZTJfc2V0X2l2LCBQS0NTOF9SX0NJUEhFUl9IQVNfTk9fT0JKRUNUX0lERU5USUZJRVIpOworCQlnb3RvIGVycjsKKwl9CisJb2JqID0gT0JKX25pZDJvYmooYWxnX25pZCk7CisKKwlpZighKHBiZTIgPSBQQkUyUEFSQU1fbmV3KCkpKSBnb3RvIG1lcnI7CisKKwkvKiBTZXR1cCB0aGUgQWxnb3JpdGhtSWRlbnRpZmllciBmb3IgdGhlIGVuY3J5cHRpb24gc2NoZW1lICovCisJc2NoZW1lID0gcGJlMi0+ZW5jcnlwdGlvbjsKKworCXNjaGVtZS0+YWxnb3JpdGhtID0gKEFTTjFfT0JKRUNUKikgb2JqOworCWlmKCEoc2NoZW1lLT5wYXJhbWV0ZXIgPSBBU04xX1RZUEVfbmV3KCkpKSBnb3RvIG1lcnI7CisKKwkvKiBDcmVhdGUgcmFuZG9tIElWICovCisJaWYgKEVWUF9DSVBIRVJfaXZfbGVuZ3RoKGNpcGhlcikpCisJCXsKKwkJaWYgKGFpdikKKwkJCW1lbWNweShpdiwgYWl2LCBFVlBfQ0lQSEVSX2l2X2xlbmd0aChjaXBoZXIpKTsKKwkJZWxzZSBpZiAoUkFORF9wc2V1ZG9fYnl0ZXMoaXYsIEVWUF9DSVBIRVJfaXZfbGVuZ3RoKGNpcGhlcikpIDwgMCkKKyAgCQkJZ290byBlcnI7CisJCX0KKworCUVWUF9DSVBIRVJfQ1RYX2luaXQoJmN0eCk7CisKKwkvKiBEdW1teSBjaXBoZXJpbml0IHRvIGp1c3Qgc2V0dXAgdGhlIElWLCBhbmQgUFJGICovCisJaWYgKCFFVlBfQ2lwaGVySW5pdF9leCgmY3R4LCBjaXBoZXIsIE5VTEwsIE5VTEwsIGl2LCAwKSkKKwkJZ290byBlcnI7CisJaWYocGFyYW1fdG9fYXNuMSgmY3R4LCBzY2hlbWUtPnBhcmFtZXRlcikgPCAwKSB7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTNV9wYmUyX3NldF9pdiwgUEtDUzhfUl9FUlJPUl9TRVRUSU5HX0NJUEhFUl9QQVJBTVMpOworCQlFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKCZjdHgpOworCQlnb3RvIGVycjsKKwl9CisJLyogSWYgcHJmIE5JRCB1bnNwZWNpZmllZCBzZWUgaWYgY2lwaGVyIGhhcyBhIHByZWZlcmVuY2UuCisJICogQW4gZXJyb3IgaXMgT0sgaGVyZToganVzdCBtZWFucyB1c2UgZGVmYXVsdCBQUkYuCisJICovCisJaWYgKChwcmZfbmlkID09IC0xKSAmJiAKKwlFVlBfQ0lQSEVSX0NUWF9jdHJsKCZjdHgsIEVWUF9DVFJMX1BCRV9QUkZfTklELCAwLCAmcHJmX25pZCkgPD0gMCkKKwkJeworCQlFUlJfY2xlYXJfZXJyb3IoKTsKKwkJcHJmX25pZCA9IE5JRF9obWFjV2l0aFNIQTE7CisJCX0KKwlFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKCZjdHgpOworCisJLyogSWYgaXRzIFJDMiB0aGVuIHdlJ2QgYmV0dGVyIHNldHVwIHRoZSBrZXkgbGVuZ3RoICovCisKKwlpZihhbGdfbmlkID09IE5JRF9yYzJfY2JjKQorCQlrZXlsZW4gPSBFVlBfQ0lQSEVSX2tleV9sZW5ndGgoY2lwaGVyKTsKKwllbHNlCisJCWtleWxlbiA9IC0xOworCisJLyogU2V0dXAga2V5ZnVuYyAqLworCisJWDUwOV9BTEdPUl9mcmVlKHBiZTItPmtleWZ1bmMpOworCisJcGJlMi0+a2V5ZnVuYyA9IFBLQ1M1X3Bia2RmMl9zZXQoaXRlciwgc2FsdCwgc2FsdGxlbiwgcHJmX25pZCwga2V5bGVuKTsKKworCWlmICghcGJlMi0+a2V5ZnVuYykKKwkJZ290byBtZXJyOworCisJLyogTm93IHNldCB1cCB0b3AgbGV2ZWwgQWxnb3JpdGhtSWRlbnRpZmllciAqLworCisJaWYoIShyZXQgPSBYNTA5X0FMR09SX25ldygpKSkgZ290byBtZXJyOworCWlmKCEocmV0LT5wYXJhbWV0ZXIgPSBBU04xX1RZUEVfbmV3KCkpKSBnb3RvIG1lcnI7CisKKwlyZXQtPmFsZ29yaXRobSA9IChBU04xX09CSkVDVCopIE9CSl9uaWQyb2JqKE5JRF9wYmVzMik7CisKKwkvKiBFbmNvZGUgUEJFMlBBUkFNIGludG8gcGFyYW1ldGVyICovCisKKwlpZighQVNOMV9pdGVtX3BhY2socGJlMiwgQVNOMV9JVEVNX3JwdHIoUEJFMlBBUkFNKSwKKwkJCQkgJnJldC0+cGFyYW1ldGVyLT52YWx1ZS5zZXF1ZW5jZSkpIGdvdG8gbWVycjsKKwlyZXQtPnBhcmFtZXRlci0+dHlwZSA9IFZfQVNOMV9TRVFVRU5DRTsKKworCVBCRTJQQVJBTV9mcmVlKHBiZTIpOworCXBiZTIgPSBOVUxMOworCisJcmV0dXJuIHJldDsKKworCW1lcnI6CisJT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M1X3BiZTJfc2V0X2l2LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisKKwllcnI6CisJUEJFMlBBUkFNX2ZyZWUocGJlMik7CisJLyogTm90ZSAnc2NoZW1lJyBpcyBmcmVlZCBhcyBwYXJ0IG9mIHBiZTIgKi8KKwlYNTA5X0FMR09SX2ZyZWUoa2FsZyk7CisJWDUwOV9BTEdPUl9mcmVlKHJldCk7CisKKwlyZXR1cm4gTlVMTDsKKworfQorCitYNTA5X0FMR09SICpQS0NTNV9wYmUyX3NldChjb25zdCBFVlBfQ0lQSEVSICpjaXBoZXIsIGludCBpdGVyLAorCQkJCSB1bnNpZ25lZCBjaGFyICpzYWx0LCBpbnQgc2FsdGxlbikKKwl7CisJcmV0dXJuIFBLQ1M1X3BiZTJfc2V0X2l2KGNpcGhlciwgaXRlciwgc2FsdCwgc2FsdGxlbiwgTlVMTCwgLTEpOworCX0KKworWDUwOV9BTEdPUiAqUEtDUzVfcGJrZGYyX3NldChpbnQgaXRlciwgdW5zaWduZWQgY2hhciAqc2FsdCwgaW50IHNhbHRsZW4sCisJCQkJaW50IHByZl9uaWQsIGludCBrZXlsZW4pCisJeworCVg1MDlfQUxHT1IgKmtleWZ1bmMgPSBOVUxMOworCVBCS0RGMlBBUkFNICprZGYgPSBOVUxMOworCUFTTjFfT0NURVRfU1RSSU5HICpvc2FsdCA9IE5VTEw7CisKKwlpZighKGtkZiA9IFBCS0RGMlBBUkFNX25ldygpKSkKKwkJZ290byBtZXJyOworCWlmKCEob3NhbHQgPSBNX0FTTjFfT0NURVRfU1RSSU5HX25ldygpKSkKKwkJZ290byBtZXJyOworCisJa2RmLT5zYWx0LT52YWx1ZS5vY3RldF9zdHJpbmcgPSBvc2FsdDsKKwlrZGYtPnNhbHQtPnR5cGUgPSBWX0FTTjFfT0NURVRfU1RSSU5HOworCisJaWYgKCFzYWx0bGVuKQorCQlzYWx0bGVuID0gUEtDUzVfU0FMVF9MRU47CisJaWYgKCEob3NhbHQtPmRhdGEgPSBPUEVOU1NMX21hbGxvYyAoc2FsdGxlbikpKQorCQlnb3RvIG1lcnI7CisKKwlvc2FsdC0+bGVuZ3RoID0gc2FsdGxlbjsKKworCWlmIChzYWx0KQorCQltZW1jcHkgKG9zYWx0LT5kYXRhLCBzYWx0LCBzYWx0bGVuKTsKKwllbHNlIGlmIChSQU5EX3BzZXVkb19ieXRlcyAob3NhbHQtPmRhdGEsIHNhbHRsZW4pIDwgMCkKKwkJZ290byBtZXJyOworCisJaWYoaXRlciA8PSAwKQorCQlpdGVyID0gUEtDUzVfREVGQVVMVF9JVEVSQVRJT05TOworCisJaWYoIUFTTjFfSU5URUdFUl9zZXQoa2RmLT5pdGVyLCBpdGVyKSkKKwkJZ290byBtZXJyOworCisJLyogSWYgaGF2ZSBhIGtleSBsZW4gc2V0IGl0IHVwICovCisKKwlpZihrZXlsZW4gPiAwKSAKKwkJeworCQlpZighKGtkZi0+a2V5bGVuZ3RoID0gTV9BU04xX0lOVEVHRVJfbmV3KCkpKQorCQkJZ290byBtZXJyOworCQlpZighQVNOMV9JTlRFR0VSX3NldCAoa2RmLT5rZXlsZW5ndGgsIGtleWxlbikpCisJCQlnb3RvIG1lcnI7CisJCX0KKworCS8qIHByZiBjYW4gc3RheSBOVUxMIGlmIHdlIGFyZSB1c2luZyBobWFjV2l0aFNIQTEgKi8KKwlpZiAocHJmX25pZCA+IDAgJiYgcHJmX25pZCAhPSBOSURfaG1hY1dpdGhTSEExKQorCQl7CisJCWtkZi0+cHJmID0gWDUwOV9BTEdPUl9uZXcoKTsKKwkJaWYgKCFrZGYtPnByZikKKwkJCWdvdG8gbWVycjsKKwkJWDUwOV9BTEdPUl9zZXQwKGtkZi0+cHJmLCBPQkpfbmlkMm9iaihwcmZfbmlkKSwKKwkJCQkJVl9BU04xX05VTEwsIE5VTEwpOworCQl9CisKKwkvKiBGaW5hbGx5IHNldHVwIHRoZSBrZXlmdW5jIHN0cnVjdHVyZSAqLworCisJa2V5ZnVuYyA9IFg1MDlfQUxHT1JfbmV3KCk7CisJaWYgKCFrZXlmdW5jKQorCQlnb3RvIG1lcnI7CisKKwlrZXlmdW5jLT5hbGdvcml0aG0gPSAoQVNOMV9PQkpFQ1QqKSBPQkpfbmlkMm9iaihOSURfaWRfcGJrZGYyKTsKKworCS8qIEVuY29kZSBQQktERjJQQVJBTSBpbnRvIHBhcmFtZXRlciBvZiBwYmUyICovCisKKwlpZighKGtleWZ1bmMtPnBhcmFtZXRlciA9IEFTTjFfVFlQRV9uZXcoKSkpCisJCWdvdG8gbWVycjsKKworCWlmKCFBU04xX2l0ZW1fcGFjayhrZGYsIEFTTjFfSVRFTV9ycHRyKFBCS0RGMlBBUkFNKSwKKwkJCSAma2V5ZnVuYy0+cGFyYW1ldGVyLT52YWx1ZS5zZXF1ZW5jZSkpCisJCWdvdG8gbWVycjsKKwlrZXlmdW5jLT5wYXJhbWV0ZXItPnR5cGUgPSBWX0FTTjFfU0VRVUVOQ0U7CisKKwlQQktERjJQQVJBTV9mcmVlKGtkZik7CisJcmV0dXJuIGtleWZ1bmM7CisKKwltZXJyOgorCU9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTNV9wYmtkZjJfc2V0LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJUEJLREYyUEFSQU1fZnJlZShrZGYpOworCVg1MDlfQUxHT1JfZnJlZShrZXlmdW5jKTsKKwlyZXR1cm4gTlVMTDsKKwl9CisKZGlmZiAtLWdpdCBhL2NyeXB0by9wa2NzOC9wOF9wa2V5LmMgYi9jcnlwdG8vcGtjczgvcDhfcGtleS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwOTVmZmQKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vcGtjczgvcDhfcGtleS5jCkBAIC0wLDAgKzEsODQgQEAKKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAxOTk5LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDUgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKKy8qIE1pbm9yIHR3ZWFrIHRvIG9wZXJhdGlvbjogemVybyBwcml2YXRlIGtleSBkYXRhICovCitzdGF0aWMgaW50IHBrZXlfY2IoaW50IG9wZXJhdGlvbiwgQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQsCisJCQkJCQkJdm9pZCAqZXhhcmcpCit7CisJLyogU2luY2UgdGhlIHN0cnVjdHVyZSBtdXN0IHN0aWxsIGJlIHZhbGlkIHVzZSBBU04xX09QX0ZSRUVfUFJFICovCisJaWYob3BlcmF0aW9uID09IEFTTjFfT1BfRlJFRV9QUkUpIHsKKwkJUEtDUzhfUFJJVl9LRVlfSU5GTyAqa2V5ID0gKFBLQ1M4X1BSSVZfS0VZX0lORk8gKikqcHZhbDsKKwkJaWYgKGtleS0+cGtleS0+dmFsdWUub2N0ZXRfc3RyaW5nKQorCQlPUEVOU1NMX2NsZWFuc2Uoa2V5LT5wa2V5LT52YWx1ZS5vY3RldF9zdHJpbmctPmRhdGEsCisJCQlrZXktPnBrZXktPnZhbHVlLm9jdGV0X3N0cmluZy0+bGVuZ3RoKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKK0FTTjFfU0VRVUVOQ0VfY2IoUEtDUzhfUFJJVl9LRVlfSU5GTywgcGtleV9jYikgPSB7CisJQVNOMV9TSU1QTEUoUEtDUzhfUFJJVl9LRVlfSU5GTywgdmVyc2lvbiwgQVNOMV9JTlRFR0VSKSwKKwlBU04xX1NJTVBMRShQS0NTOF9QUklWX0tFWV9JTkZPLCBwa2V5YWxnLCBYNTA5X0FMR09SKSwKKwlBU04xX1NJTVBMRShQS0NTOF9QUklWX0tFWV9JTkZPLCBwa2V5LCBBU04xX0FOWSksCisJQVNOMV9JTVBfU0VUX09GX09QVChQS0NTOF9QUklWX0tFWV9JTkZPLCBhdHRyaWJ1dGVzLCBYNTA5X0FUVFJJQlVURSwgMCkKK30gQVNOMV9TRVFVRU5DRV9FTkRfY2IoUEtDUzhfUFJJVl9LRVlfSU5GTywgUEtDUzhfUFJJVl9LRVlfSU5GTykKKworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKFBLQ1M4X1BSSVZfS0VZX0lORk8pCmRpZmYgLS1naXQgYS9jcnlwdG8vcGtjczgvcGtjczguYyBiL2NyeXB0by9wa2NzOC9wa2NzOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMGFmODMKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vcGtjczgvcGtjczguYwpAQCAtMCwwICsxLDU4MCBAQAorLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDE5OTkuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9wa2NzOC5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY2lwaGVyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9kaWdlc3QuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKKyNpbmNsdWRlICIuLi9ldnAvaW50ZXJuYWwuaCIKKworCisjZGVmaW5lIFBLQ1MxMl9LRVlfSUQgMQorI2RlZmluZSBQS0NTMTJfSVZfSUQgMgorCitzdGF0aWMgaW50IGFzY2lpX3RvX3VjczIoY29uc3QgY2hhciAqYXNjaWksIHNpemVfdCBhc2NpaV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqb3V0LCBzaXplX3QgKm91dF9sZW4pIHsKKyAgdWludDhfdCAqdW5pdG1wOworICBzaXplX3QgdWxlbiwgaTsKKworICB1bGVuID0gYXNjaWlfbGVuICogMiArIDI7CisgIGlmICh1bGVuIDwgYXNjaWlfbGVuKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgdW5pdG1wID0gT1BFTlNTTF9tYWxsb2ModWxlbik7CisgIGlmICh1bml0bXAgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIGZvciAoaSA9IDA7IGkgPCB1bGVuIC0gMjsgaSArPSAyKSB7CisgICAgdW5pdG1wW2ldID0gMDsKKyAgICB1bml0bXBbaSArIDFdID0gYXNjaWlbaSA+PiAxXTsKKyAgfQorCisgIC8qIE1ha2UgcmVzdWx0IGRvdWJsZSBudWxsIHRlcm1pbmF0ZWQgKi8KKyAgdW5pdG1wW3VsZW4gLSAyXSA9IDA7CisgIHVuaXRtcFt1bGVuIC0gMV0gPSAwOworICAqb3V0X2xlbiA9IHVsZW47CisgICpvdXQgPSB1bml0bXA7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHBrY3MxMl9rZXlfZ2VuX3VuaSh1aW50OF90ICpwYXNzLCBzaXplX3QgcGFzc19sZW4sIHVpbnQ4X3QgKnNhbHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2FsdF9sZW4sIGludCBpZCwgaW50IGl0ZXJhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb3V0X2xlbiwgdWludDhfdCAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRVZQX01EICptZF90eXBlKSB7CisgIHVpbnQ4X3QgKkIsICpELCAqSSwgKnAsICpBaTsKKyAgaW50IFNsZW4sIFBsZW4sIElsZW4sIElqbGVuOworICBpbnQgaSwgaiwgdjsKKyAgc2l6ZV90IHU7CisgIGludCByZXQgPSAwOworICBCSUdOVU0gKklqLCAqQnBsMTsgLyogVGhlc2UgaG9sZCBJaiBhbmQgQiArIDEgKi8KKyAgRVZQX01EX0NUWCBjdHg7CisKKyAgRVZQX01EX0NUWF9pbml0KCZjdHgpOworICB2ID0gRVZQX01EX2Jsb2NrX3NpemUobWRfdHlwZSk7CisgIHUgPSBFVlBfTURfc2l6ZShtZF90eXBlKTsKKyAgRCA9IE9QRU5TU0xfbWFsbG9jKHYpOworICBBaSA9IE9QRU5TU0xfbWFsbG9jKHUpOworICBCID0gT1BFTlNTTF9tYWxsb2ModiArIDEpOworICBTbGVuID0gdiAqICgoc2FsdF9sZW4gKyB2IC0gMSkgLyB2KTsKKyAgaWYgKHBhc3NfbGVuKQorICAgIFBsZW4gPSB2ICogKChwYXNzX2xlbiArIHYgLSAxKSAvIHYpOworICBlbHNlCisgICAgUGxlbiA9IDA7CisgIElsZW4gPSBTbGVuICsgUGxlbjsKKyAgSSA9IE9QRU5TU0xfbWFsbG9jKElsZW4pOworICBJaiA9IEJOX25ldygpOworICBCcGwxID0gQk5fbmV3KCk7CisgIGlmICghRCB8fCAhQWkgfHwgIUIgfHwgIUkgfHwgIUlqIHx8ICFCcGwxKQorICAgIGdvdG8gZXJyOworICBmb3IgKGkgPSAwOyBpIDwgdjsgaSsrKQorICAgIERbaV0gPSBpZDsKKyAgcCA9IEk7CisgIGZvciAoaSA9IDA7IGkgPCBTbGVuOyBpKyspCisgICAgKnArKyA9IHNhbHRbaSAlIHNhbHRfbGVuXTsKKyAgZm9yIChpID0gMDsgaSA8IFBsZW47IGkrKykKKyAgICAqcCsrID0gcGFzc1tpICUgcGFzc19sZW5dOworICBmb3IgKDs7KSB7CisgICAgaWYgKCFFVlBfRGlnZXN0SW5pdF9leCgmY3R4LCBtZF90eXBlLCBOVUxMKSB8fAorICAgICAgICAhRVZQX0RpZ2VzdFVwZGF0ZSgmY3R4LCBELCB2KSB8fAorICAgICAgICAhRVZQX0RpZ2VzdFVwZGF0ZSgmY3R4LCBJLCBJbGVuKSB8fAorICAgICAgICAhRVZQX0RpZ2VzdEZpbmFsX2V4KCZjdHgsIEFpLCBOVUxMKSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICAgIGZvciAoaiA9IDE7IGogPCBpdGVyYXRpb25zOyBqKyspIHsKKyAgICAgIGlmICghRVZQX0RpZ2VzdEluaXRfZXgoJmN0eCwgbWRfdHlwZSwgTlVMTCkgfHwKKyAgICAgICAgICAhRVZQX0RpZ2VzdFVwZGF0ZSgmY3R4LCBBaSwgdSkgfHwKKyAgICAgICAgICAhRVZQX0RpZ2VzdEZpbmFsX2V4KCZjdHgsIEFpLCBOVUxMKSkgeworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICB9CisgICAgbWVtY3B5KG91dCwgQWksIG91dF9sZW4gPCB1ID8gb3V0X2xlbiA6IHUpOworICAgIGlmICh1ID49IG91dF9sZW4pIHsKKyAgICAgIHJldCA9IDE7CisgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgb3V0X2xlbiAtPSB1OworICAgIG91dCArPSB1OworICAgIGZvciAoaiA9IDA7IGogPCB2OyBqKyspCisgICAgICBCW2pdID0gQWlbaiAlIHVdOworICAgIC8qIFdvcmsgb3V0IEIgKyAxIGZpcnN0IHRoZW4gY2FuIHVzZSBCIGFzIHRtcCBzcGFjZSAqLworICAgIGlmICghQk5fYmluMmJuKEIsIHYsIEJwbDEpKQorICAgICAgZ290byBlcnI7CisgICAgaWYgKCFCTl9hZGRfd29yZChCcGwxLCAxKSkKKyAgICAgIGdvdG8gZXJyOworICAgIGZvciAoaiA9IDA7IGogPCBJbGVuOyBqICs9IHYpIHsKKyAgICAgIGlmICghQk5fYmluMmJuKEkgKyBqLCB2LCBJaikpCisgICAgICAgIGdvdG8gZXJyOworICAgICAgaWYgKCFCTl9hZGQoSWosIElqLCBCcGwxKSkKKyAgICAgICAgZ290byBlcnI7CisgICAgICBpZiAoIUJOX2JuMmJpbihJaiwgQikpCisgICAgICAgIGdvdG8gZXJyOworICAgICAgSWpsZW4gPSBCTl9udW1fYnl0ZXMoSWopOworICAgICAgLyogSWYgbW9yZSB0aGFuIDJeKHYqOCkgLSAxIGN1dCBvZmYgTVNCICovCisgICAgICBpZiAoSWpsZW4gPiB2KSB7CisgICAgICAgIGlmICghQk5fYm4yYmluKElqLCBCKSkKKyAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgbWVtY3B5KEkgKyBqLCBCICsgMSwgdik7CisgICAgICAgIC8qIElmIGxlc3MgdGhhbiB2IGJ5dGVzIHBhZCB3aXRoIHplcm9lcyAqLworICAgICAgfSBlbHNlIGlmIChJamxlbiA8IHYpIHsKKyAgICAgICAgbWVtc2V0KEkgKyBqLCAwLCB2IC0gSWpsZW4pOworICAgICAgICBpZiAoIUJOX2JuMmJpbihJaiwgSSArIGogKyB2IC0gSWpsZW4pKQorICAgICAgICAgIGdvdG8gZXJyOworICAgICAgfSBlbHNlIGlmICghQk5fYm4yYmluKElqLCBJICsgaikpIHsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgfQorICB9CisKK2VycjoKKyAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIHBrY3MxMl9rZXlfZ2VuX3VuaSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCitlbmQ6CisgIE9QRU5TU0xfZnJlZShBaSk7CisgIE9QRU5TU0xfZnJlZShCKTsKKyAgT1BFTlNTTF9mcmVlKEQpOworICBPUEVOU1NMX2ZyZWUoSSk7CisgIEJOX2ZyZWUoSWopOworICBCTl9mcmVlKEJwbDEpOworICBFVlBfTURfQ1RYX2NsZWFudXAoJmN0eCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwa2NzMTJfa2V5X2dlbl9hc2MoY29uc3QgY2hhciAqcGFzcywgc2l6ZV90IHBhc3NfbGVuLCB1aW50OF90ICpzYWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNhbHRfbGVuLCBpbnQgaWQsIGludCBpdGVyYXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dF9sZW4sIHVpbnQ4X3QgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVWUF9NRCAqbWRfdHlwZSkgeworICBpbnQgcmV0OworICB1aW50OF90ICp1Y3MyX3Bhc3MgPSBOVUxMOworICBzaXplX3QgdWNzMl9wYXNzX2xlbiA9IDA7CisKKyAgaWYgKHBhc3MgJiYgIWFzY2lpX3RvX3VjczIocGFzcywgcGFzc19sZW4sICZ1Y3MyX3Bhc3MsICZ1Y3MyX3Bhc3NfbGVuKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBwa2NzMTJfa2V5X2dlbl9hc2MsIFBLQ1M4X1JfREVDT0RFX0VSUk9SKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXQgPSBwa2NzMTJfa2V5X2dlbl91bmkodWNzMl9wYXNzLCB1Y3MyX3Bhc3NfbGVuLCBzYWx0LCBzYWx0X2xlbiwgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRpb25zLCBvdXRfbGVuLCBvdXQsIG1kX3R5cGUpOworCisgIGlmICh1Y3MyX3Bhc3MpIHsKKyAgICBPUEVOU1NMX2NsZWFuc2UodWNzMl9wYXNzLCB1Y3MyX3Bhc3NfbGVuKTsKKyAgICBPUEVOU1NMX2ZyZWUodWNzMl9wYXNzKTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcGtjczEyX3BiZV9rZXlpdmdlbihFVlBfQ0lQSEVSX0NUWCAqY3R4LCBjb25zdCBjaGFyICpwYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwYXNzX2xlbiwgQVNOMV9UWVBFICpwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFVlBfQ0lQSEVSICpjaXBoZXIsIGNvbnN0IEVWUF9NRCAqbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX2VuY3J5cHQpIHsKKyAgUEJFUEFSQU0gKnBiZTsKKyAgaW50IHNhbHRfbGVuLCBpdGVyYXRpb25zLCByZXQ7CisgIHVpbnQ4X3QgKnNhbHQ7CisgIGNvbnN0IHVpbnQ4X3QgKnBidWY7CisgIHVpbnQ4X3Qga2V5W0VWUF9NQVhfS0VZX0xFTkdUSF0sIGl2W0VWUF9NQVhfSVZfTEVOR1RIXTsKKworICAvKiBFeHRyYWN0IHVzZWZ1bCBpbmZvIGZyb20gcGFyYW1ldGVyICovCisgIGlmIChwYXJhbSA9PSBOVUxMIHx8IHBhcmFtLT50eXBlICE9IFZfQVNOMV9TRVFVRU5DRSB8fAorICAgICAgcGFyYW0tPnZhbHVlLnNlcXVlbmNlID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgcGtjczEyX3BiZV9rZXlpdmdlbiwgUEtDUzhfUl9ERUNPREVfRVJST1IpOworICAgIHJldHVybiAwOworICB9CisKKyAgcGJ1ZiA9IHBhcmFtLT52YWx1ZS5zZXF1ZW5jZS0+ZGF0YTsKKyAgcGJlID0gZDJpX1BCRVBBUkFNKE5VTEwsICZwYnVmLCBwYXJhbS0+dmFsdWUuc2VxdWVuY2UtPmxlbmd0aCk7CisgIGlmIChwYmUgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBwa2NzMTJfcGJlX2tleWl2Z2VuLCBQS0NTOF9SX0RFQ09ERV9FUlJPUik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoIXBiZS0+aXRlcikgeworICAgIGl0ZXJhdGlvbnMgPSAxOworICB9IGVsc2UgeworICAgIGl0ZXJhdGlvbnMgPSBBU04xX0lOVEVHRVJfZ2V0KHBiZS0+aXRlcik7CisgIH0KKyAgc2FsdCA9IHBiZS0+c2FsdC0+ZGF0YTsKKyAgc2FsdF9sZW4gPSBwYmUtPnNhbHQtPmxlbmd0aDsKKyAgaWYgKCFwa2NzMTJfa2V5X2dlbl9hc2MocGFzcywgcGFzc19sZW4sIHNhbHQsIHNhbHRfbGVuLCBQS0NTMTJfS0VZX0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRpb25zLCBFVlBfQ0lQSEVSX2tleV9sZW5ndGgoY2lwaGVyKSwga2V5LCBtZCkpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgcGtjczEyX3BiZV9rZXlpdmdlbiwgUEtDUzhfUl9LRVlfR0VOX0VSUk9SKTsKKyAgICBQQkVQQVJBTV9mcmVlKHBiZSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCFwa2NzMTJfa2V5X2dlbl9hc2MocGFzcywgcGFzc19sZW4sIHNhbHQsIHNhbHRfbGVuLCBQS0NTMTJfSVZfSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdGlvbnMsIEVWUF9DSVBIRVJfaXZfbGVuZ3RoKGNpcGhlciksIGl2LCBtZCkpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgcGtjczEyX3BiZV9rZXlpdmdlbiwgUEtDUzhfUl9LRVlfR0VOX0VSUk9SKTsKKyAgICBQQkVQQVJBTV9mcmVlKHBiZSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgUEJFUEFSQU1fZnJlZShwYmUpOworICByZXQgPSBFVlBfQ2lwaGVySW5pdF9leChjdHgsIGNpcGhlciwgTlVMTCwga2V5LCBpdiwgaXNfZW5jcnlwdCk7CisgIE9QRU5TU0xfY2xlYW5zZShrZXksIEVWUF9NQVhfS0VZX0xFTkdUSCk7CisgIE9QRU5TU0xfY2xlYW5zZShpdiwgRVZQX01BWF9JVl9MRU5HVEgpOworICByZXR1cm4gcmV0OworfQorCit0eXBlZGVmIGludCAoKmtleWdlbl9mdW5jKShFVlBfQ0lQSEVSX0NUWCAqY3R4LCBjb25zdCBjaGFyICpwYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHBhc3NfbGVuLCBBU04xX1RZUEUgKnBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyLCBjb25zdCBFVlBfTUQgKm1kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX2VuY3J5cHQpOworCitzdHJ1Y3QgcGJlX3N1aXRlIHsKKyAgaW50IHBiZV9uaWQ7CisgIGludCBjaXBoZXJfbmlkOworICBpbnQgbWRfbmlkOworICBrZXlnZW5fZnVuYyBrZXlnZW47Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBiZV9zdWl0ZSBrQnVpbHRpblBCRVtdID0geworICAgIHsKKyAgICAgTklEX3BiZV9XaXRoU0hBMUFuZDEyOEJpdFJDNCwgTklEX3JjNCwgTklEX3NoYTEsIHBrY3MxMl9wYmVfa2V5aXZnZW4sCisgICAgfSwKKyAgICB7CisgICAgIE5JRF9wYmVfV2l0aFNIQTFBbmQzX0tleV9UcmlwbGVERVNfQ0JDLCBOSURfZGVzX2VkZTNfY2JjLCBOSURfc2hhMSwKKyAgICAgcGtjczEyX3BiZV9rZXlpdmdlbiwKKyAgICB9LAorfTsKKworc3RhdGljIGludCBwYmVfY2lwaGVyX2luaXQoQVNOMV9PQkpFQ1QgKnBiZV9vYmosIGNvbnN0IGNoYXIgKnBhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcGFzc19sZW4sIEFTTjFfVFlQRSAqcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlBfQ0lQSEVSX0NUWCAqY3R4LCBpbnQgaXNfZW5jcnlwdCkgeworICBjb25zdCBFVlBfQ0lQSEVSICpjaXBoZXI7CisgIGNvbnN0IEVWUF9NRCAqbWQ7CisgIHVuc2lnbmVkIGk7CisKKyAgY29uc3Qgc3RydWN0IHBiZV9zdWl0ZSAqc3VpdGUgPSBOVUxMOworICBjb25zdCBpbnQgcGJlX25pZCA9IE9CSl9vYmoybmlkKHBiZV9vYmopOworCisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2Yoa0J1aWx0aW5QQkUpIC8gc2l6ZW9mKHN0cnVjdCBwYmVfc3VpdGUpOyBpKyspIHsKKyAgICBzdWl0ZSA9ICZrQnVpbHRpblBCRVtpXTsKKyAgICBpZiAoc3VpdGUtPnBiZV9uaWQgPT0gcGJlX25pZCkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKHN1aXRlID09IE5VTEwpIHsKKyAgICBjaGFyIG9ial9zdHJbODBdOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBwYmVfY2lwaGVyX2luaXQsIFBLQ1M4X1JfVU5LTk9XTl9BTEdPUklUSE0pOworICAgIGlmICghcGJlX29iaikgeworICAgICAgc3RybmNweShvYmpfc3RyLCAiTlVMTCIsIHNpemVvZihvYmpfc3RyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGkydF9BU04xX09CSkVDVChvYmpfc3RyLCBzaXplb2Yob2JqX3N0ciksIHBiZV9vYmopOworICAgIH0KKyAgICBFUlJfYWRkX2Vycm9yX2RhdGEoMiwgIlRZUEU9Iiwgb2JqX3N0cik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoc3VpdGUtPmNpcGhlcl9uaWQgPT0gLTEpIHsKKyAgICBjaXBoZXIgPSBOVUxMOworICB9IGVsc2UgeworICAgIGNpcGhlciA9IEVWUF9nZXRfY2lwaGVyYnluaWQoc3VpdGUtPmNpcGhlcl9uaWQpOworICAgIGlmICghY2lwaGVyKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgcGJlX2NpcGhlcl9pbml0LCBQS0NTOF9SX1VOS05PV05fQ0lQSEVSKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIGlmIChzdWl0ZS0+bWRfbmlkID09IC0xKSB7CisgICAgbWQgPSBOVUxMOworICB9IGVsc2UgeworICAgIG1kID0gRVZQX2dldF9kaWdlc3RieW5pZChzdWl0ZS0+bWRfbmlkKTsKKyAgICBpZiAoIW1kKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgcGJlX2NpcGhlcl9pbml0LCBQS0NTOF9SX1VOS05PV05fRElHRVNUKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIGlmICghc3VpdGUtPmtleWdlbihjdHgsIHBhc3MsIHBhc3NfbGVuLCBwYXJhbSwgY2lwaGVyLCBtZCwgaXNfZW5jcnlwdCkpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgcGJlX2NpcGhlcl9pbml0LCBQS0NTOF9SX0tFWUdFTl9GQUlMVVJFKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHBiZV9jcnlwdChjb25zdCBYNTA5X0FMR09SICphbGdvciwgY29uc3QgY2hhciAqcGFzcywgc2l6ZV90IHBhc3NfbGVuLAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqaW4sIHNpemVfdCBpbl9sZW4sIHVpbnQ4X3QgKipvdXQsIHNpemVfdCAqb3V0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgIGludCBpc19lbmNyeXB0KSB7CisgIHVpbnQ4X3QgKmJ1ZjsKKyAgaW50IG4sIHJldCA9IDA7CisgIEVWUF9DSVBIRVJfQ1RYIGN0eDsKKyAgdW5zaWduZWQgYmxvY2tfc2l6ZTsKKworICBFVlBfQ0lQSEVSX0NUWF9pbml0KCZjdHgpOworCisgIGlmICghcGJlX2NpcGhlcl9pbml0KGFsZ29yLT5hbGdvcml0aG0sIHBhc3MsIHBhc3NfbGVuLCBhbGdvci0+cGFyYW1ldGVyLCAmY3R4LAorICAgICAgICAgICAgICAgICAgICAgICBpc19lbmNyeXB0KSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBwYmVfY3J5cHQsIFBLQ1M4X1JfVU5LTk9XTl9DSVBIRVJfQUxHT1JJVEhNKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBibG9ja19zaXplID0gRVZQX0NJUEhFUl9DVFhfYmxvY2tfc2l6ZSgmY3R4KTsKKworICBpZiAoaW5fbGVuICsgYmxvY2tfc2l6ZSA8IGluX2xlbikgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBwYmVfY3J5cHQsIFBLQ1M4X1JfVE9PX0xPTkcpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgYnVmID0gT1BFTlNTTF9tYWxsb2MoaW5fbGVuICsgYmxvY2tfc2l6ZSk7CisgIGlmIChidWYgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBwYmVfY3J5cHQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmICghRVZQX0NpcGhlclVwZGF0ZSgmY3R4LCBidWYsICZuLCBpbiwgaW5fbGVuKSkgeworICAgIE9QRU5TU0xfZnJlZShidWYpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBwYmVfY3J5cHQsIEVSUl9SX0VWUF9MSUIpOworICAgIGdvdG8gZXJyOworICB9CisgICpvdXRfbGVuID0gbjsKKworICBpZiAoIUVWUF9DaXBoZXJGaW5hbF9leCgmY3R4LCBidWYgKyBuLCAmbikpIHsKKyAgICBPUEVOU1NMX2ZyZWUoYnVmKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgcGJlX2NyeXB0LCBFUlJfUl9FVlBfTElCKTsKKyAgICBnb3RvIGVycjsKKyAgfQorICAqb3V0X2xlbiArPSBuOworICAqb3V0ID0gYnVmOworICByZXQgPSAxOworCitlcnI6CisgIEVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoJmN0eCk7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkICpwa2NzMTJfaXRlbV9kZWNyeXB0X2QyaShYNTA5X0FMR09SICphbGdvciwgY29uc3QgQVNOMV9JVEVNICppdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXNzLCBzaXplX3QgcGFzc19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOMV9PQ1RFVF9TVFJJTkcgKm9jdCkgeworICB1aW50OF90ICpvdXQ7CisgIGNvbnN0IHVpbnQ4X3QgKnA7CisgIHZvaWQgKnJldDsKKyAgc2l6ZV90IG91dF9sZW47CisKKyAgaWYgKCFwYmVfY3J5cHQoYWxnb3IsIHBhc3MsIHBhc3NfbGVuLCBvY3QtPmRhdGEsIG9jdC0+bGVuZ3RoLCAmb3V0LCAmb3V0X2xlbiwKKyAgICAgICAgICAgICAgICAgMCAvKiBkZWNyeXB0ICovKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBwa2NzMTJfaXRlbV9kZWNyeXB0X2QyaSwgUEtDUzhfUl9DUllQVF9FUlJPUik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcCA9IG91dDsKKyAgcmV0ID0gQVNOMV9pdGVtX2QyaShOVUxMLCAmcCwgb3V0X2xlbiwgaXQpOworICBPUEVOU1NMX2NsZWFuc2Uob3V0LCBvdXRfbGVuKTsKKyAgaWYgKCFyZXQpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgcGtjczEyX2l0ZW1fZGVjcnlwdF9kMmksIFBLQ1M4X1JfREVDT0RFX0VSUk9SKTsKKyAgfQorICBPUEVOU1NMX2ZyZWUob3V0KTsKKyAgcmV0dXJuIHJldDsKK30KKworUEtDUzhfUFJJVl9LRVlfSU5GTyAqUEtDUzhfZGVjcnlwdChYNTA5X1NJRyAqcGtjczgsIGNvbnN0IGNoYXIgKnBhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXNzX2xlbikgeworICBpZiAocGFzcyAmJiBwYXNzX2xlbiA9PSAtMSkgeworICAgIHBhc3NfbGVuID0gc3RybGVuKHBhc3MpOworICB9CisgIHJldHVybiBwa2NzMTJfaXRlbV9kZWNyeXB0X2QyaShwa2NzOC0+YWxnb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU04xX0lURU1fcnB0cihQS0NTOF9QUklWX0tFWV9JTkZPKSwgcGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NfbGVuLCBwa2NzOC0+ZGlnZXN0KTsKK30KKworc3RhdGljIEFTTjFfT0NURVRfU1RSSU5HICpwa2NzMTJfaXRlbV9pMmRfZW5jcnlwdChYNTA5X0FMR09SICphbGdvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVNOMV9JVEVNICppdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHBhc3NsZW4sIHZvaWQgKm9iaikgeworICBBU04xX09DVEVUX1NUUklORyAqb2N0OworICB1aW50OF90ICppbiA9IE5VTEw7CisgIGludCBpbl9sZW47CisgIHNpemVfdCBjcnlwdF9sZW47CisKKyAgb2N0ID0gTV9BU04xX09DVEVUX1NUUklOR19uZXcoKTsKKyAgaWYgKG9jdCA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIHBrY3MxMl9pdGVtX2kyZF9lbmNyeXB0LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaW5fbGVuID0gQVNOMV9pdGVtX2kyZChvYmosICZpbiwgaXQpOworICBpZiAoIWluKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIHBrY3MxMl9pdGVtX2kyZF9lbmNyeXB0LCBQS0NTOF9SX0VOQ09ERV9FUlJPUik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKCFwYmVfY3J5cHQoYWxnb3IsIHBhc3MsIHBhc3NsZW4sIGluLCBpbl9sZW4sICZvY3QtPmRhdGEsICZjcnlwdF9sZW4sCisgICAgICAgICAgICAgICAgIDEgLyogZW5jcnlwdCAqLykpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgcGtjczEyX2l0ZW1faTJkX2VuY3J5cHQsIFBLQ1M4X1JfRU5DUllQVF9FUlJPUik7CisgICAgT1BFTlNTTF9mcmVlKGluKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBvY3QtPmxlbmd0aCA9IGNyeXB0X2xlbjsKKyAgT1BFTlNTTF9jbGVhbnNlKGluLCBpbl9sZW4pOworICBPUEVOU1NMX2ZyZWUoaW4pOworICByZXR1cm4gb2N0OworfQorCitYNTA5X1NJRyAqUEtDUzhfZW5jcnlwdChpbnQgcGJlX25pZCwgY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyLCBjb25zdCBjaGFyICpwYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhc3NfbGVuLCB1aW50OF90ICpzYWx0LCBzaXplX3Qgc2FsdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRlcmF0aW9ucywgUEtDUzhfUFJJVl9LRVlfSU5GTyAqcDhpbmYpIHsKKyAgWDUwOV9TSUcgKnBrY3M4ID0gTlVMTDsKKyAgWDUwOV9BTEdPUiAqcGJlOworCisgIGlmIChwYXNzICYmIHBhc3NfbGVuID09IC0xKSB7CisgICAgcGFzc19sZW4gPSBzdHJsZW4ocGFzcyk7CisgIH0KKworICBwa2NzOCA9IFg1MDlfU0lHX25ldygpOworICBpZiAocGtjczggPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9lbmNyeXB0LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAocGJlX25pZCA9PSAtMSkgeworICAgIHBiZSA9IFBLQ1M1X3BiZTJfc2V0KGNpcGhlciwgaXRlcmF0aW9ucywgc2FsdCwgc2FsdF9sZW4pOworICB9IGVsc2UgeworICAgIHBiZSA9IFBLQ1M1X3BiZV9zZXQocGJlX25pZCwgaXRlcmF0aW9ucywgc2FsdCwgc2FsdF9sZW4pOworICB9CisKKyAgaWYgKCFwYmUpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfZW5jcnlwdCwgRVJSX1JfQVNOMV9MSUIpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgWDUwOV9BTEdPUl9mcmVlKHBrY3M4LT5hbGdvcik7CisgIHBrY3M4LT5hbGdvciA9IHBiZTsKKyAgTV9BU04xX09DVEVUX1NUUklOR19mcmVlKHBrY3M4LT5kaWdlc3QpOworICBwa2NzOC0+ZGlnZXN0ID0gcGtjczEyX2l0ZW1faTJkX2VuY3J5cHQoCisgICAgICBwYmUsIEFTTjFfSVRFTV9ycHRyKFBLQ1M4X1BSSVZfS0VZX0lORk8pLCBwYXNzLCBwYXNzX2xlbiwgcDhpbmYpOworICBpZiAoIXBrY3M4LT5kaWdlc3QpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfZW5jcnlwdCwgUEtDUzhfUl9FTkNSWVBUX0VSUk9SKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIHJldHVybiBwa2NzODsKKworZXJyOgorICBYNTA5X1NJR19mcmVlKHBrY3M4KTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK0VWUF9QS0VZICpFVlBfUEtDUzgyUEtFWShQS0NTOF9QUklWX0tFWV9JTkZPICpwOCkgeworICBFVlBfUEtFWSAqcGtleSA9IE5VTEw7CisgIEFTTjFfT0JKRUNUICphbGdvaWQ7CisgIGNoYXIgb2JqX3RtcFs4MF07CisKKyAgaWYgKCFQS0NTOF9wa2V5X2dldDAoJmFsZ29pZCwgTlVMTCwgTlVMTCwgTlVMTCwgcDgpKQorICAgIHJldHVybiBOVUxMOworCisgIHBrZXkgPSBFVlBfUEtFWV9uZXcoKTsKKyAgaWYgKHBrZXkgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBFVlBfUEtDUzgyUEtFWSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYgKCFFVlBfUEtFWV9zZXRfdHlwZShwa2V5LCBPQkpfb2JqMm5pZChhbGdvaWQpKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBFVlBfUEtDUzgyUEtFWSwKKyAgICAgICAgICAgICAgICAgICAgICBQS0NTOF9SX1VOU1VQUE9SVEVEX1BSSVZBVEVfS0VZX0FMR09SSVRITSk7CisgICAgaTJ0X0FTTjFfT0JKRUNUKG9ial90bXAsIDgwLCBhbGdvaWQpOworICAgIEVSUl9hZGRfZXJyb3JfZGF0YSgyLCAiVFlQRT0iLCBvYmpfdG1wKTsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgaWYgKHBrZXktPmFtZXRoLT5wcml2X2RlY29kZSkgeworICAgIGlmICghcGtleS0+YW1ldGgtPnByaXZfZGVjb2RlKHBrZXksIHA4KSkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIEVWUF9QS0NTODJQS0VZLCBQS0NTOF9SX1BSSVZBVEVfS0VZX0RFQ09ERV9FUlJPUik7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgRVZQX1BLQ1M4MlBLRVksIFBLQ1M4X1JfTUVUSE9EX05PVF9TVVBQT1JURUQpOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICByZXR1cm4gcGtleTsKKworZXJyb3I6CisgIEVWUF9QS0VZX2ZyZWUocGtleSk7CisgIHJldHVybiBOVUxMOworfQorCitQS0NTOF9QUklWX0tFWV9JTkZPICpFVlBfUEtFWTJQS0NTOChFVlBfUEtFWSAqcGtleSkgeworICBQS0NTOF9QUklWX0tFWV9JTkZPICpwODsKKworICBwOCA9IFBLQ1M4X1BSSVZfS0VZX0lORk9fbmV3KCk7CisgIGlmIChwOCA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIEVWUF9QS0VZMlBLQ1M4LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcDgtPmJyb2tlbiA9IFBLQ1M4X09LOworCisgIGlmIChwa2V5LT5hbWV0aCkgeworICAgIGlmIChwa2V5LT5hbWV0aC0+cHJpdl9lbmNvZGUpIHsKKyAgICAgIGlmICghcGtleS0+YW1ldGgtPnByaXZfZW5jb2RlKHA4LCBwa2V5KSkgeworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgRVZQX1BLRVkyUEtDUzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFBLQ1M4X1JfUFJJVkFURV9LRVlfRU5DT0RFX0VSUk9SKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIEVWUF9QS0VZMlBLQ1M4LCBQS0NTOF9SX01FVEhPRF9OT1RfU1VQUE9SVEVEKTsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICB9IGVsc2UgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBFVlBfUEtFWTJQS0NTOCwKKyAgICAgICAgICAgICAgICAgICAgICBQS0NTOF9SX1VOU1VQUE9SVEVEX1BSSVZBVEVfS0VZX0FMR09SSVRITSk7CisgICAgZ290byBlcnJvcjsKKyAgfQorICByZXR1cm4gcDg7CisKK2Vycm9yOgorICBQS0NTOF9QUklWX0tFWV9JTkZPX2ZyZWUocDgpOworICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2NyeXB0by9wa2NzOC9wa2NzOC5oIGIvY3J5cHRvL3BrY3M4L3BrY3M4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM0ZjYwYwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9wa2NzOC9wa2NzOC5oCkBAIC0wLDAgKzEsMTEyIEBACisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuICovCisKKworI2lmbmRlZiBPUEVOU1NMX0hFQURFUl9QS0NTOF9ICisjZGVmaW5lIE9QRU5TU0xfSEVBREVSX1BLQ1M4X0gKKworI2luY2x1ZGUgPG9wZW5zc2wvYmFzZS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworWDUwOV9TSUcgKlBLQ1M4X2VuY3J5cHQoaW50IHBiZV9uaWQsIGNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlciwgY29uc3QgY2hhciAqcGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXNzX2xlbiwgdWludDhfdCAqc2FsdCwgc2l6ZV90IHNhbHRfbGVuLCBpbnQgaXRlcmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIFBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4aW5mKTsKKworUEtDUzhfUFJJVl9LRVlfSU5GTyAqUEtDUzhfZGVjcnlwdChYNTA5X1NJRyAqcGtjczgsIGNvbnN0IGNoYXIgKnBhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXNzX2xlbik7CisKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9ICAvKiBleHRlcm4gQyAqLworI2VuZGlmCisKKyNkZWZpbmUgUEtDUzhfRl9QS0NTOF9lbmNyeXB0IDEwMAorI2RlZmluZSBQS0NTOF9GX0VWUF9QS0VZMlBLQ1M4IDEwMQorI2RlZmluZSBQS0NTOF9GX0VWUF9QS0NTODJQS0VZIDEwMgorI2RlZmluZSBQS0NTOF9GX1BLQ1M1X3BiZV9zZXQwX2FsZ29yIDEwMworI2RlZmluZSBQS0NTOF9GX3BiZV9jcnlwdCAxMDQKKyNkZWZpbmUgUEtDUzhfRl9wa2NzMTJfaXRlbV9kZWNyeXB0X2QyaSAxMDUKKyNkZWZpbmUgUEtDUzhfRl9QS0NTNV9wYmVfc2V0IDEwNgorI2RlZmluZSBQS0NTOF9GX3BrY3MxMl9rZXlfZ2VuX3VuaSAxMDcKKyNkZWZpbmUgUEtDUzhfRl9wa2NzMTJfa2V5X2dlbl9hc2MgMTA4CisjZGVmaW5lIFBLQ1M4X0ZfcGtjczEyX3BiZV9rZXlpdmdlbiAxMDkKKyNkZWZpbmUgUEtDUzhfRl9wYmVfY2lwaGVyX2luaXQgMTEwCisjZGVmaW5lIFBLQ1M4X0ZfcGtjczEyX2l0ZW1faTJkX2VuY3J5cHQgMTExCisjZGVmaW5lIFBLQ1M4X0ZfUEtDUzVfcGJlMl9zZXRfaXYgMTEyCisjZGVmaW5lIFBLQ1M4X0ZfUEtDUzVfcGJrZGYyX3NldCAxMTMKKyNkZWZpbmUgUEtDUzhfUl9FUlJPUl9TRVRUSU5HX0NJUEhFUl9QQVJBTVMgMTAwCisjZGVmaW5lIFBLQ1M4X1JfUFJJVkFURV9LRVlfRU5DT0RFX0VSUk9SIDEwMQorI2RlZmluZSBQS0NTOF9SX1VOS05PV05fQUxHT1JJVEhNIDEwMgorI2RlZmluZSBQS0NTOF9SX1VOS05PV05fQ0lQSEVSIDEwMworI2RlZmluZSBQS0NTOF9SX1VOS05PV05fRElHRVNUIDEwNAorI2RlZmluZSBQS0NTOF9SX0VOQ09ERV9FUlJPUiAxMDUKKyNkZWZpbmUgUEtDUzhfUl9ERUNPREVfRVJST1IgMTA2CisjZGVmaW5lIFBLQ1M4X1JfRU5DUllQVF9FUlJPUiAxMDcKKyNkZWZpbmUgUEtDUzhfUl9VTlNVUFBPUlRFRF9QUklWQVRFX0tFWV9BTEdPUklUSE0gMTA4CisjZGVmaW5lIFBLQ1M4X1JfUFJJVkFURV9LRVlfREVDT0RFX0VSUk9SIDEwOQorI2RlZmluZSBQS0NTOF9SX1VOS05PV05fQ0lQSEVSX0FMR09SSVRITSAxMTAKKyNkZWZpbmUgUEtDUzhfUl9LRVlHRU5fRkFJTFVSRSAxMTEKKyNkZWZpbmUgUEtDUzhfUl9UT09fTE9ORyAxMTIKKyNkZWZpbmUgUEtDUzhfUl9DUllQVF9FUlJPUiAxMTMKKyNkZWZpbmUgUEtDUzhfUl9NRVRIT0RfTk9UX1NVUFBPUlRFRCAxMTQKKyNkZWZpbmUgUEtDUzhfUl9DSVBIRVJfSEFTX05PX09CSkVDVF9JREVOVElGSUVSIDExNQorI2RlZmluZSBQS0NTOF9SX0tFWV9HRU5fRVJST1IgMTE2CisKKyNlbmRpZiAgLyogT1BFTlNTTF9IRUFERVJfUEtDUzhfSCAqLwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3BrY3M4L3BrY3M4X2Vycm9yLmMgYi9jcnlwdG8vcGtjczgvcGtjczhfZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjEyOWYwCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3BrY3M4L3BrY3M4X2Vycm9yLmMKQEAgLTAsMCArMSw1MiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE0LCBHb29nbGUgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQorICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLiAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKworI2luY2x1ZGUgInBrY3M4LmgiCisKK2NvbnN0IEVSUl9TVFJJTkdfREFUQSBQS0NTOF9lcnJvcl9zdHJpbmdfZGF0YVtdID0geworICB7RVJSX1BBQ0soRVJSX0xJQl9QS0NTOCwgUEtDUzhfRl9FVlBfUEtDUzgyUEtFWSwgMCksICJFVlBfUEtDUzgyUEtFWSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9QS0NTOCwgUEtDUzhfRl9FVlBfUEtFWTJQS0NTOCwgMCksICJFVlBfUEtFWTJQS0NTOCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9QS0NTOCwgUEtDUzhfRl9QS0NTNV9wYmUyX3NldF9pdiwgMCksICJQS0NTNV9wYmUyX3NldF9pdiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9QS0NTOCwgUEtDUzhfRl9QS0NTNV9wYmVfc2V0LCAwKSwgIlBLQ1M1X3BiZV9zZXQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUEtDUzgsIFBLQ1M4X0ZfUEtDUzVfcGJlX3NldDBfYWxnb3IsIDApLCAiUEtDUzVfcGJlX3NldDBfYWxnb3IifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUEtDUzgsIFBLQ1M4X0ZfUEtDUzVfcGJrZGYyX3NldCwgMCksICJQS0NTNV9wYmtkZjJfc2V0In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1BLQ1M4LCBQS0NTOF9GX1BLQ1M4X2VuY3J5cHQsIDApLCAiUEtDUzhfZW5jcnlwdCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9QS0NTOCwgUEtDUzhfRl9wYmVfY2lwaGVyX2luaXQsIDApLCAicGJlX2NpcGhlcl9pbml0In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1BLQ1M4LCBQS0NTOF9GX3BiZV9jcnlwdCwgMCksICJwYmVfY3J5cHQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUEtDUzgsIFBLQ1M4X0ZfcGtjczEyX2l0ZW1fZGVjcnlwdF9kMmksIDApLCAicGtjczEyX2l0ZW1fZGVjcnlwdF9kMmkifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUEtDUzgsIFBLQ1M4X0ZfcGtjczEyX2l0ZW1faTJkX2VuY3J5cHQsIDApLCAicGtjczEyX2l0ZW1faTJkX2VuY3J5cHQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUEtDUzgsIFBLQ1M4X0ZfcGtjczEyX2tleV9nZW5fYXNjLCAwKSwgInBrY3MxMl9rZXlfZ2VuX2FzYyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9QS0NTOCwgUEtDUzhfRl9wa2NzMTJfa2V5X2dlbl91bmksIDApLCAicGtjczEyX2tleV9nZW5fdW5pIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1BLQ1M4LCBQS0NTOF9GX3BrY3MxMl9wYmVfa2V5aXZnZW4sIDApLCAicGtjczEyX3BiZV9rZXlpdmdlbiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9QS0NTOCwgMCwgUEtDUzhfUl9DSVBIRVJfSEFTX05PX09CSkVDVF9JREVOVElGSUVSKSwgIkNJUEhFUl9IQVNfTk9fT0JKRUNUX0lERU5USUZJRVIifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUEtDUzgsIDAsIFBLQ1M4X1JfQ1JZUFRfRVJST1IpLCAiQ1JZUFRfRVJST1IifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUEtDUzgsIDAsIFBLQ1M4X1JfREVDT0RFX0VSUk9SKSwgIkRFQ09ERV9FUlJPUiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9QS0NTOCwgMCwgUEtDUzhfUl9FTkNPREVfRVJST1IpLCAiRU5DT0RFX0VSUk9SIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1BLQ1M4LCAwLCBQS0NTOF9SX0VOQ1JZUFRfRVJST1IpLCAiRU5DUllQVF9FUlJPUiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9QS0NTOCwgMCwgUEtDUzhfUl9FUlJPUl9TRVRUSU5HX0NJUEhFUl9QQVJBTVMpLCAiRVJST1JfU0VUVElOR19DSVBIRVJfUEFSQU1TIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1BLQ1M4LCAwLCBQS0NTOF9SX0tFWUdFTl9GQUlMVVJFKSwgIktFWUdFTl9GQUlMVVJFIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1BLQ1M4LCAwLCBQS0NTOF9SX0tFWV9HRU5fRVJST1IpLCAiS0VZX0dFTl9FUlJPUiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9QS0NTOCwgMCwgUEtDUzhfUl9NRVRIT0RfTk9UX1NVUFBPUlRFRCksICJNRVRIT0RfTk9UX1NVUFBPUlRFRCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9QS0NTOCwgMCwgUEtDUzhfUl9QUklWQVRFX0tFWV9ERUNPREVfRVJST1IpLCAiUFJJVkFURV9LRVlfREVDT0RFX0VSUk9SIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1BLQ1M4LCAwLCBQS0NTOF9SX1BSSVZBVEVfS0VZX0VOQ09ERV9FUlJPUiksICJQUklWQVRFX0tFWV9FTkNPREVfRVJST1IifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUEtDUzgsIDAsIFBLQ1M4X1JfVE9PX0xPTkcpLCAiVE9PX0xPTkcifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUEtDUzgsIDAsIFBLQ1M4X1JfVU5LTk9XTl9BTEdPUklUSE0pLCAiVU5LTk9XTl9BTEdPUklUSE0ifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUEtDUzgsIDAsIFBLQ1M4X1JfVU5LTk9XTl9DSVBIRVIpLCAiVU5LTk9XTl9DSVBIRVIifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUEtDUzgsIDAsIFBLQ1M4X1JfVU5LTk9XTl9DSVBIRVJfQUxHT1JJVEhNKSwgIlVOS05PV05fQ0lQSEVSX0FMR09SSVRITSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9QS0NTOCwgMCwgUEtDUzhfUl9VTktOT1dOX0RJR0VTVCksICJVTktOT1dOX0RJR0VTVCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9QS0NTOCwgMCwgUEtDUzhfUl9VTlNVUFBPUlRFRF9QUklWQVRFX0tFWV9BTEdPUklUSE0pLCAiVU5TVVBQT1JURURfUFJJVkFURV9LRVlfQUxHT1JJVEhNIn0sCisgIHswLCBOVUxMfSwKK307CmRpZmYgLS1naXQgYS9jcnlwdG8vcmFuZC9DTWFrZUxpc3RzLnR4dCBiL2NyeXB0by9yYW5kL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMjQ2MTMKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vcmFuZC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDExIEBACitpbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKKworYWRkX2xpYnJhcnkoCisJcmFuZAorCisJT0JKRUNUCisKKwlyYW5kLmMKKwl1cmFuZG9tLmMKKwl3aW5kb3dzLmMKKykKZGlmZiAtLWdpdCBhL2NyeXB0by9yYW5kL3JhbmQuYyBiL2NyeXB0by9yYW5kL3JhbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzgwYjZjCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3JhbmQvcmFuZC5jCkBAIC0wLDAgKzEsMjggQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNCwgR29vZ2xlIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorCisKK2ludCBSQU5EX3BzZXVkb19ieXRlcyh1aW50OF90ICpidWYsIHNpemVfdCBsZW4pIHsKKyAgcmV0dXJuIFJBTkRfYnl0ZXMoYnVmLCBsZW4pOworfQorCit2b2lkIFJBTkRfc2VlZChjb25zdCB2b2lkICpidWYsIGludCBudW0pIHt9CisKK3ZvaWQgUkFORF9hZGQoY29uc3Qgdm9pZCAqYnVmLCBpbnQgbnVtLCBkb3VibGUgZW50cm9weSkge30KKworaW50IFJBTkRfcG9sbCh2b2lkKSB7CisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3JhbmQvcmFuZC5oIGIvY3J5cHRvL3JhbmQvcmFuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZTEwMzcKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vcmFuZC9yYW5kLmgKQEAgLTAsMCArMSw1MyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE0LCBHb29nbGUgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQorICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLiAqLworCisjaWZuZGVmIE9QRU5TU0xfSEVBREVSX1JBTkRfSAorI2RlZmluZSBPUEVOU1NMX0hFQURFUl9SQU5EX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvYmFzZS5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogUkFORF9ieXRlcyB3cml0ZXMgfGxlbnwgYnl0ZXMgb2YgcmFuZG9tIGRhdGEgdG8gfGJ1ZnwuIEl0IHJldHVybnMgb25lIG9uCisgKiBzdWNjZXNzIGFuZCB6ZXJvIG9uIG90aGVyd2lzZS4gKi8KK2ludCBSQU5EX2J5dGVzKHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IGxlbik7CisKKy8qIFJBTkRfY2xlYW51cCBmcmVlcyBhbnkgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIFJORy4gVGhpcyBpcyBub3Qgc2FmZSBpZiBvdGhlcgorICogdGhyZWFkcyBtaWdodCBzdGlsbCBiZSBjYWxsaW5nIHxSQU5EX2J5dGVzfC4gKi8KK3ZvaWQgUkFORF9jbGVhbnVwKCk7CisKKworLyogRGVwcmVjYXRlZCBmdW5jdGlvbnMgKi8KKworLyogUkFORF9wc2V1ZG9fYnl0ZXMgaXMgYSB3cmFwcGVyIGFyb3VuZCB8UkFORF9ieXRlc3wuICovCitpbnQgUkFORF9wc2V1ZG9fYnl0ZXModWludDhfdCAqYnVmLCBzaXplX3QgbGVuKTsKKworLyogUkFORF9zZWVkIGRvZXMgbm90aGluZy4gKi8KK3ZvaWQgUkFORF9zZWVkKGNvbnN0IHZvaWQgKmJ1ZiwgaW50IG51bSk7CisKKy8qIFJBTkRfYWRkIGRvZXMgbm90aGluZy4gKi8KK3ZvaWQgUkFORF9hZGQoY29uc3Qgdm9pZCAqYnVmLCBpbnQgbnVtLCBkb3VibGUgZW50cm9weSk7CisKKy8qIFJBTkRfcG9sbCByZXR1cm5zIG9uZS4gKi8KK2ludCBSQU5EX3BvbGwodm9pZCk7CisKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9ICAvKiBleHRlcm4gQyAqLworI2VuZGlmCisKKyNlbmRpZiAgLyogT1BFTlNTTF9IRUFERVJfUkFORF9IICovCmRpZmYgLS1naXQgYS9jcnlwdG8vcmFuZC91cmFuZG9tLmMgYi9jcnlwdG8vcmFuZC91cmFuZG9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRmZTFkNgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9yYW5kL3VyYW5kb20uYwpAQCAtMCwwICsxLDI0MSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE0LCBHb29nbGUgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQorICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLiAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisKKyNpZiAhZGVmaW5lZChPUEVOU1NMX1dJTkRPV1MpCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL3RocmVhZC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisKKworLyogVGhpcyBmaWxlIGltcGxlbWVudHMgYSBQUk5HIGJ5IHJlYWRpbmcgZnJvbSAvZGV2L3VyYW5kb20sIG9wdGlvbmFsbHkgd2l0aCBhCisgKiBmb3JrLXNhZmUgYnVmZmVyLgorICoKKyAqIElmIGJ1ZmZlcmluZyBpcyBlbmFibGVkIHRoZW4gaXQgbWFpbnRhaW5zIGEgZ2xvYmFsLCBsaW5rZWQgbGlzdCBvZiBidWZmZXJzLgorICogVGhyZWFkcyB3aGljaCBuZWVkIHJhbmRvbSBieXRlcyBncmFiIGEgYnVmZmVyIGZyb20gdGhlIGxpc3QgdW5kZXIgYSBsb2NrIGFuZAorICogY29weSBvdXQgdGhlIGJ5dGVzIHRoYXQgdGhleSBuZWVkLiBJbiB0aGUgcmFyZSBjYXNlIHRoYXQgdGhlIGJ1ZmZlciBpcworICogZW1wdHksIGl0J3MgcmVmaWxsZWQgZnJvbSAvZGV2L3VyYW5kb20gb3V0c2lkZSBvZiB0aGUgbG9jay4KKyAqCisgKiBMYXJnZSByZXF1ZXN0cyBhcmUgYWx3YXlzIHNlcnZpY2VkIGZyb20gL2Rldi91cmFuZG9tIGRpcmVjdGx5LgorICoKKyAqIEVhY2ggYnVmZmVyIGNvbnRhaW5zIHRoZSBQSUQgb2YgdGhlIHByb2Nlc3MgdGhhdCBjcmVhdGVkIGl0IGFuZCBpdCdzIHRlc3RlZAorICogYWdhaW5zdCB0aGUgY3VycmVudCBQSUQgZWFjaCB0aW1lLiBUaHVzIHByb2Nlc3NlcyB0aGF0IGZvcmsgd2lsbCBkaXNjYXJkIGFsbAorICogdGhlIGJ1ZmZlcnMgZmlsbGVkIGJ5IHRoZSBwYXJlbnQgcHJvY2Vzcy4gVGhlcmUgYXJlIHR3byBwcm9ibGVtcyB3aXRoIHRoaXM6CisgKgorICogMSkgZ2xpYmMgbWFpbnRhaW5zIGEgY2FjaGUgb2YgdGhlIGN1cnJlbnQgUElEK1BQSUQgYW5kLCBpZiB0aGlzIGNhY2hlIGlzbid0CisgKiAgICBjb3JyZWN0bHkgaW52YWxpZGF0ZWQsIHRoZSBnZXRwaWQoKSB3aWxsIGNvbnRpbnVlIHRvIGJlbGlldmUgdGhhdAorICogICAgaXQncyB0aGUgb2xkIHByb2Nlc3MuIEdsaWJjIGRlcGVuZHMgb24gdGhlIGdsaWJjIHdyYXBwZXJzIGZvciBmb3JrLAorICogICAgdmZvcmsgYW5kIGNsb25lIGJlaW5nIHVzZWQgaW4gb3JkZXIgdG8gaW52YWxpZGF0ZSB0aGUgZ2V0cGlkKCkgY2FjaGUuCisgKgorICogMikgSWYgYSBwcm9jZXNzIGZvcmtzLCBkaWVzIGFuZCB0aGVuIGl0cyBjaGlsZCBmb3JrcywgaXQncyBwb3NzaWJsZSB0aGF0CisgKiAgICB0aGUgdGhpcmQgcHJvY2VzcyB3aWxsIGVuZCB1cCB3aXRoIHRoZSBzYW1lIFBJRCBhcyB0aGUgb3JpZ2luYWwgcHJvY2Vzcy4KKyAqICAgIElmIHRoZSBzZWNvbmQgcHJvY2VzcyBuZXZlciB1c2VkIGFueSByYW5kb20gdmFsdWVzIHRoZW4gdGhpcyB3aWxsIG1lYW4KKyAqICAgIHRoYXQgdGhlIHRoaXJkIHByb2Nlc3MgaGFzIHN0YWxlLCBjYWNoZWQgdmFsdWVzIGFuZCB3b24ndCBub3RpY2UuCisgKi8KKworLyogQlVGX1NJWkUgaXMgaW50ZW5kZWQgdG8gYmUgYSA0SyBhbGxvY2F0aW9uIHdpdGggbWFsbG9jIG92ZXJoZWFkLiBzdHJ1Y3QKKyAqIHJhbmRfYnVmZmVyIGFsc28gZml0cyBpbiB0aGlzIHNwYWNlIGFuZCB0aGUgcmVtYWluZGVyIGlzIGVudHJvcHkuICovCisjZGVmaW5lIEJVRl9TSVpFICg0MDk2IC0gMTYpCisKKy8qIHJhbmRfYnVmZmVyIGNvbnRhaW5zIHVudXNlZCwgcmFuZG9tIGJ5dGVzLiBUaGVzZSBzdHJ1Y3R1cmVzIGZvcm0gYSBsaW5rZWQKKyAqIGxpc3QgdmlhIHRoZSB8bmV4dHwgcG9pbnRlciwgd2hpY2ggaXMgTlVMTCBpbiB0aGUgZmluYWwgZWxlbWVudC4gKi8KK3N0cnVjdCByYW5kX2J1ZmZlciB7CisgIHNpemVfdCB1c2VkOyAvKiB1c2VkIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgfHJhbmR8IHRoYXQgaGF2ZQorICAgICAgICAgICAgICAgICAgYmVlbiBjb25zdW1lZC4gKi8KKyAgc3RydWN0IHJhbmRfYnVmZmVyICpuZXh0OworICBwaWRfdCBwaWQ7IC8qIHBpZCBjb250YWlucyB0aGUgcGlkIGF0IHRoZSB0aW1lIHRoYXQgdGhlIGJ1ZmZlciB3YXMKKyAgICAgICAgICAgICAgICBjcmVhdGVkIHNvIHRoYXQgZGF0YSBpcyBub3QgZHVwbGljYXRlZCBhZnRlciBhIGZvcmsuICovCisgIHBpZF90IHBwaWQ7IC8qIHBwaWQgY29udGFpbnMgdGhlIHBhcmVudCBwaWQgaW4gb3JkZXIgdG8gdHJ5IGFuZCByZWR1Y2UKKyAgICAgICAgICAgICAgICAgdGhlIHBvc3NpYmlsaXR5IG9mIGR1cGxpY2F0ZWQgUElEIGNvbmZ1c2luZyB0aGUKKyAgICAgICAgICAgICAgICAgZGV0ZWN0aW9uIG9mIGEgZm9yay4gKi8KKyAgdWludDhfdCByYW5kW107Cit9OworCisvKiByYW5kX2J5dGVzX3Blcl9idWYgaXMgdGhlIG51bWJlciBvZiBhY3R1YWwgZW50cm9weSBieXRlcyBpbiBhIGJ1ZmZlci4gKi8KK3N0YXRpYyBjb25zdCBzaXplX3QgcmFuZF9ieXRlc19wZXJfYnVmID0gQlVGX1NJWkUgLSBzaXplb2Yoc3RydWN0IHJhbmRfYnVmZmVyKTsKKworLyogbGlzdF9oZWFkIGlzIHRoZSBzdGFydCBvZiBhIGdsb2JhbCwgbGlua2VkLWxpc3Qgb2YgcmFuZF9idWZmZXIgb2JqZWN0cy4gSXQncworICogcHJvdGVjdGVkIGJ5IENSWVBUT19MT0NLX1JBTkQuICovCitzdGF0aWMgc3RydWN0IHJhbmRfYnVmZmVyICpsaXN0X2hlYWQ7CisKKy8qIHVyYW5kb21fZmQgaXMgYSBmaWxlIGRlc2NyaXB0b3IgdG8gL2Rldi91cmFuZG9tLiBJdCdzIHByb3RlY3RlZCBieQorICogQ1JZUFRPX0xPQ0tfUkFORC4gKi8KK3N0YXRpYyBpbnQgdXJhbmRvbV9mZCA9IC0yOworCisvKiB1cmFuZG9tX2J1ZmZlcmluZyBjb250cm9scyB3aGV0aGVyIGJ1ZmZlcmluZyBpcyBlbmFibGVkICgxKSBvciBub3QgKDApLiBUaGlzCisgKiBpcyBwcm90ZWN0ZWQgYnkgQ1JZUFRPX0xPQ0tfUkFORC4gKi8KK3N0YXRpYyBpbnQgdXJhbmRvbV9idWZmZXJpbmcgPSAwOworCisvKiB1cmFuZG9tX2dldF9mZF9sb2NrZWQgcmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciB0byAvZGV2L3VyYW5kb20uIFRoZSBjYWxsZXIKKyAqIG9mIHRoaXMgZnVuY3Rpb24gbXVzdCBob2xkIENSWVBUT19MT0NLX1JBTkQuICovCitzdGF0aWMgaW50IHVyYW5kb21fZ2V0X2ZkX2xvY2tlZCgpIHsKKyAgaWYgKHVyYW5kb21fZmQgIT0gLTIpCisgICAgcmV0dXJuIHVyYW5kb21fZmQ7CisKKyAgdXJhbmRvbV9mZCA9IG9wZW4oIi9kZXYvdXJhbmRvbSIsIE9fUkRPTkxZIHwgT19OT0NUVFkpOworICByZXR1cm4gdXJhbmRvbV9mZDsKK30KKworLyogUkFORF9jbGVhbnVwIGZyZWVzIGFsbCBidWZmZXJzLCBjbG9zZXMgYW55IGNhY2hlZCBmaWxlIGRlc2NyaXB0b3IKKyAqIGFuZCByZXNldHMgdGhlIGdsb2JhbCBzdGF0ZS4gKi8KK3ZvaWQgUkFORF9jbGVhbnVwKHZvaWQpIHsKKyAgc3RydWN0IHJhbmRfYnVmZmVyICpjdXI7CisKKyAgQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19SQU5EKTsKKyAgd2hpbGUgKChjdXIgPSBsaXN0X2hlYWQpKSB7CisgICAgbGlzdF9oZWFkID0gY3VyLT5uZXh0OworICAgIE9QRU5TU0xfZnJlZShjdXIpOworICB9CisgIGlmICh1cmFuZG9tX2ZkID49IDApIHsKKyAgICBjbG9zZSh1cmFuZG9tX2ZkKTsKKyAgfQorICB1cmFuZG9tX2ZkID0gLTI7CisgIGxpc3RfaGVhZCA9IE5VTEw7CisgIENSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19SQU5EKTsKK30KKworLyogcmVhZF9mdWxsIHJlYWRzIGV4YWN0bHkgfGxlbnwgYnl0ZXMgZnJvbSB8ZmR8IGludG8gfG91dHwgYW5kIHJldHVybnMgMS4gSW4KKyAqIHRoZSBjYXNlIG9mIGFuIGVycm9yIGl0IHJldHVybnMgMC4gKi8KK3N0YXRpYyBjaGFyIHJlYWRfZnVsbChpbnQgZmQsIHVpbnQ4X3QgKm91dCwgc2l6ZV90IGxlbikgeworICBzc2l6ZV90IHI7CisKKyAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICBkbyB7CisgICAgICByID0gcmVhZChmZCwgb3V0LCBsZW4pOworICAgIH0gd2hpbGUgKHIgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOworCisgICAgaWYgKHIgPD0gMCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIG91dCArPSByOworICAgIGxlbiAtPSByOworICB9CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qIHVyYW5kb21fcmFuZF9wc2V1ZG9fYnl0ZXMgcHV0cyB8bnVtfCByYW5kb20gYnl0ZXMgaW50byB8b3V0fC4gSXQgcmV0dXJucworICogb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb3RoZXJ3aXNlLiAqLworaW50IFJBTkRfYnl0ZXModWludDhfdCAqb3V0LCBzaXplX3QgcmVxdWVzdGVkKSB7CisgIGludCBmZDsKKyAgc3RydWN0IHJhbmRfYnVmZmVyICpidWY7CisgIHNpemVfdCB0b2RvOworICBwaWRfdCBwaWQsIHBwaWQ7CisKKyAgaWYgKHJlcXVlc3RlZCA9PSAwKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX1JBTkQpOworICBmZCA9IHVyYW5kb21fZ2V0X2ZkX2xvY2tlZCgpOworCisgIGlmIChmZCA8IDApIHsKKyAgICBDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfUkFORCk7CisgICAgYWJvcnQoKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8qIElmIGJ1ZmZlcmluZyBpcyBub3QgZW5hYmxlZCwgb3IgaWYgdGhlIHJlcXVlc3QgaXMgbGFyZ2UsIHRoZW4gdGhlCisgICAqIHJlc3VsdCBjb21lcyBkaXJlY3RseSBmcm9tIHVyYW5kb20uICovCisgIGlmICghdXJhbmRvbV9idWZmZXJpbmcgfHwgcmVxdWVzdGVkID4gQlVGX1NJWkUgLyAyKSB7CisgICAgQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1JBTkQpOworICAgIGlmICghcmVhZF9mdWxsKGZkLCBvdXQsIHJlcXVlc3RlZCkpIHsKKyAgICAgIGFib3J0KCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7CisgIH0KKworICBwaWQgPSBnZXRwaWQoKTsKKyAgcHBpZCA9IGdldHBwaWQoKTsKKworICBmb3IgKDs7KSB7CisgICAgYnVmID0gbGlzdF9oZWFkOworICAgIGlmIChidWYgJiYgYnVmLT5waWQgPT0gcGlkICYmIGJ1Zi0+cHBpZCA9PSBwcGlkICYmCisgICAgICAgIHJhbmRfYnl0ZXNfcGVyX2J1ZiAtIGJ1Zi0+dXNlZCA+PSByZXF1ZXN0ZWQpIHsKKyAgICAgIG1lbWNweShvdXQsICZidWYtPnJhbmRbYnVmLT51c2VkXSwgcmVxdWVzdGVkKTsKKyAgICAgIGJ1Zi0+dXNlZCArPSByZXF1ZXN0ZWQ7CisgICAgICBDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfUkFORCk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKiBJZiB3ZSBkb24ndCBpbW1lZGlhdGVseSBoYXZlIGVub3VnaCBlbnRyb3B5IHdpdGggdGhlIGNvcnJlY3QKKyAgICAgKiBQSUQsIHJlbW92ZSB0aGUgYnVmZmVyIGZyb20gdGhlIGxpc3QgaW4gb3JkZXIgdG8gZ2FpbgorICAgICAqIGV4Y2x1c2l2ZSBhY2Nlc3MgYW5kIHVubG9jay4gKi8KKyAgICBpZiAoYnVmKSB7CisgICAgICBsaXN0X2hlYWQgPSBidWYtPm5leHQ7CisgICAgfQorICAgIENSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19SQU5EKTsKKworICAgIGlmICghYnVmKSB7CisgICAgICBidWYgPSAoc3RydWN0IHJhbmRfYnVmZmVyICopT1BFTlNTTF9tYWxsb2MoQlVGX1NJWkUpOworICAgICAgLyogVGhlIGJ1ZmZlciBkb2Vzbid0IGNvbnRhaW4gYW55IHJhbmRvbSBieXRlcyB5ZXQKKyAgICAgICAqIHNvIHdlIG1hcmsgaXQgYXMgZnVsbHkgdXNlZCBzbyB0aGF0IGl0IHdpbGwgYmUKKyAgICAgICAqIGZpbGxlZCBiZWxvdy4gKi8KKyAgICAgIGJ1Zi0+dXNlZCA9IHJhbmRfYnl0ZXNfcGVyX2J1ZjsKKyAgICAgIGJ1Zi0+bmV4dCA9IE5VTEw7CisgICAgICBidWYtPnBpZCA9IHBpZDsKKyAgICAgIGJ1Zi0+cHBpZCA9IHBwaWQ7CisgICAgfQorCisgICAgaWYgKGJ1Zi0+cGlkID09IHBpZCAmJiBidWYtPnBwaWQgPT0gcHBpZCkgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogV2UgaGF2ZSBmb3JrZWQgYW5kIHNvIGNhbm5vdCB1c2UgdGhlc2UgYnl0ZXMgYXMgdGhleQorICAgICAqIG1heSBoYXZlIGJlZW4gdXNlZCBpbiBhbm90aGVyIHByb2Nlc3MuICovCisgICAgT1BFTlNTTF9mcmVlKGJ1Zik7CisgICAgQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19SQU5EKTsKKyAgfQorCisgIHdoaWxlIChyZXF1ZXN0ZWQgPiAwKSB7CisgICAgdG9kbyA9IHJhbmRfYnl0ZXNfcGVyX2J1ZiAtIGJ1Zi0+dXNlZDsKKyAgICBpZiAodG9kbyA+IHJlcXVlc3RlZCkgeworICAgICAgdG9kbyA9IHJlcXVlc3RlZDsKKyAgICB9CisgICAgbWVtY3B5KG91dCwgJmJ1Zi0+cmFuZFtidWYtPnVzZWRdLCB0b2RvKTsKKyAgICByZXF1ZXN0ZWQgLT0gdG9kbzsKKyAgICBvdXQgKz0gdG9kbzsKKyAgICBidWYtPnVzZWQgKz0gdG9kbzsKKworICAgIGlmIChidWYtPnVzZWQgPCByYW5kX2J5dGVzX3Blcl9idWYpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghcmVhZF9mdWxsKGZkLCBidWYtPnJhbmQsIHJhbmRfYnl0ZXNfcGVyX2J1ZikpIHsKKyAgICAgIE9QRU5TU0xfZnJlZShidWYpOworICAgICAgYWJvcnQoKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGJ1Zi0+dXNlZCA9IDA7CisgIH0KKworICBDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX1JBTkQpOworICBhc3NlcnQobGlzdF9oZWFkICE9IGJ1Zik7CisgIGJ1Zi0+bmV4dCA9IGxpc3RfaGVhZDsKKyAgbGlzdF9oZWFkID0gYnVmOworICBDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfUkFORCk7CisgIHJldHVybiAxOworfQorCisjZW5kaWYgIC8qICFPUEVOU1NMX1dJTkRPV1MgKi8KZGlmZiAtLWdpdCBhL2NyeXB0by9yYW5kL3dpbmRvd3MuYyBiL2NyeXB0by9yYW5kL3dpbmRvd3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjdkZDliCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3JhbmQvd2luZG93cy5jCkBAIC0wLDAgKzEsNzEgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNCwgR29vZ2xlIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC90aHJlYWQuaD4KKworCisjaWYgZGVmaW5lZChPUEVOU1NMX1dJTkRPV1MpCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxXaW5kb3dzLmg+CisjaW5jbHVkZSA8V2luY3J5cHQuaD4KKworc3RhdGljIGNoYXIgZ2xvYmFsX3Byb3ZpZGVyX2luaXQ7CitzdGF0aWMgSENSWVBUUFJPViBnbG9iYWxfcHJvdmlkZXI7CisKK3ZvaWQgUkFORF9jbGVhbnVwKHZvaWQpIHsKKyAgQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19SQU5EKTsKKyAgQ3J5cHRSZWxlYXNlQ29udGV4dChnbG9iYWxfcHJvdmlkZXIsIDApOworICBnbG9iYWxfcHJvdmlkZXJfaW5pdCA9IDA7CisgIENSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19SQU5EKTsKK30KKworaW50IFJBTkRfYnl0ZXModWludDhfdCAqb3V0LCBzaXplX3QgcmVxdWVzdGVkKSB7CisgIEhDUllQVFBST1YgcHJvdmlkZXIgPSAwOworICBpbnQgb2s7CisKKyAgQ1JZUFRPX3JfbG9jayhDUllQVE9fTE9DS19SQU5EKTsKKyAgaWYgKCFnbG9iYWxfcHJvdmlkZXJfaW5pdCkgeworICAgIENSWVBUT19yX3VubG9jayhDUllQVE9fTE9DS19SQU5EKTsKKyAgICBDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX1JBTkQpOworICAgIGlmICghZ2xvYmFsX3Byb3ZpZGVyX2luaXQpIHsKKyAgICAgIGlmIChDcnlwdEFjcXVpcmVDb250ZXh0KCZnbG9iYWxfcHJvdmlkZXIsIE5VTEwsIE5VTEwsIFBST1ZfUlNBX0ZVTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUllQVF9WRVJJRllDT05URVhUIHwgQ1JZUFRfU0lMRU5UKSkgeworICAgICAgICBnbG9iYWxfcHJvdmlkZXJfaW5pdCA9IDE7CisgICAgICB9CisgICAgfQorICAgIENSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19SQU5EKTsKKyAgICBDUllQVE9fcl9sb2NrKENSWVBUT19MT0NLX1JBTkQpOworICB9CisKKyAgb2sgPSBnbG9iYWxfcHJvdmlkZXJfaW5pdDsKKyAgcHJvdmlkZXIgPSBnbG9iYWxfcHJvdmlkZXI7CisgIENSWVBUT19yX3VubG9jayhDUllQVE9fTE9DS19SQU5EKTsKKworICBpZiAoIW9rKSB7CisgICAgYWJvcnQoKTsKKyAgICByZXR1cm4gb2s7CisgIH0KKworICBpZiAoVFJVRSAhPSBDcnlwdEdlblJhbmRvbShwcm92aWRlciwgcmVxdWVzdGVkLCBvdXQpKSB7CisgICAgYWJvcnQoKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiAxOworfQorCisjZW5kaWYgIC8qIE9QRU5TU0xfV0lORE9XUyAqLwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3JjNC9DTWFrZUxpc3RzLnR4dCBiL2NyeXB0by9yYzQvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA3MjgzMgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9yYzQvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwyOSBAQAoraW5jbHVkZV9kaXJlY3RvcmllcyguIC4uIC4uLy4uL2luY2x1ZGUpCisKK2lmICgke0FSQ0h9IFNUUkVRVUFMICJ4ODZfNjQiKQorCXNldCgKKwkJUkM0X0FSQ0hfU09VUkNFUworCisJCXJjNC14ODZfNjQuJHtBU01fRVhUfQorCSkKK2VuZGlmKCkKKworaWYgKCR7QVJDSH0gU1RSRVFVQUwgIng4NiIpCisJc2V0KAorCQlSQzRfQVJDSF9TT1VSQ0VTCisKKwkJcmM0LTU4Ni4ke0FTTV9FWFR9CisJKQorZW5kaWYoKQorCithZGRfbGlicmFyeSgKKwlyYzQKKworCU9CSkVDVAorCisJcmM0LmMKKwkke1JDNF9BUkNIX1NPVVJDRVN9CispCisKK3Blcmxhc20ocmM0LXg4Nl82NC4ke0FTTV9FWFR9IGFzbS9yYzQteDg2XzY0LnBsKQorcGVybGFzbShyYzQtNTg2LiR7QVNNX0VYVH0gYXNtL3JjNC01ODYucGwpCmRpZmYgLS1naXQgYS9jcnlwdG8vcmM0L2FzbS9yYzQtNTg2LnBsIGIvY3J5cHRvL3JjNC9hc20vcmM0LTU4Ni5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGYxYTc5Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3JjNC9hc20vcmM0LTU4Ni5wbApAQCAtMCwwICsxLDQxMCBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFtSZV13cml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiBmb3IgdGhlIE9wZW5TU0wKKyMgcHJvamVjdC4gVGhlIG1vZHVsZSBpcywgaG93ZXZlciwgZHVhbCBsaWNlbnNlZCB1bmRlciBPcGVuU1NMIGFuZAorIyBDUllQVE9HQU1TIGxpY2Vuc2VzIGRlcGVuZGluZyBvbiB3aGVyZSB5b3Ugb2J0YWluIGl0LiBGb3IgZnVydGhlcgorIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyBBdCBzb21lIHBvaW50IGl0IGJlY2FtZSBhcHBhcmVudCB0aGF0IHRoZSBvcmlnaW5hbCBTU0xlYXkgUkM0CisjIGFzc2VtYmxlciBpbXBsZW1lbnRhdGlvbiBwZXJmb3JtcyBzdWJvcHRpbWFsbHkgb24gbGF0ZXN0IElBLTMyCisjIG1pY3JvYXJjaGl0ZWN0dXJlcy4gQWZ0ZXIgcmUtdHVuaW5nIHBlcmZvcm1hbmNlIGhhcyBjaGFuZ2VkIGFzCisjIGZvbGxvd2luZzoKKyMKKyMgUGVudGl1bQktMTAlCisjIFBlbnRpdW0gSUlJCSsxMiUKKyMgQU1ECQkrNTAlKCopCisjIFA0CQkrMjUwJSgqKikKKyMKKyMgKCopCVRoaXMgbnVtYmVyIGlzIGFjdHVhbGx5IGEgdHJhZGUtb2ZmOi0pIEl0J3MgcG9zc2libGUgdG8KKyMJYWNoaWV2ZQkrNzIlLCBidXQgYXQgdGhlIGNvc3Qgb2YgLTQ4JSBvZmYgUElJSSBwZXJmb3JtYW5jZS4KKyMJSW4gb3RoZXIgd29yZHMgY29kZSBwZXJmb3JtaW5nIGZ1cnRoZXIgMTMlIGZhc3RlciBvbiBBTUQKKyMJd291bGQgcGVyZm9ybSBhbG1vc3QgMiB0aW1lcyBzbG93ZXIgb24gSW50ZWwgUElJSS4uLgorIwlGb3IgcmVmZXJlbmNlISBUaGlzIGNvZGUgZGVsaXZlcnMgfjgwJSBvZiByYzQtYW1kNjQucGwKKyMJcGVyZm9ybWFuY2Ugb24gdGhlIHNhbWUgT3B0ZXJvbiBtYWNoaW5lLgorIyAoKiopCVRoaXMgbnVtYmVyIHJlcXVpcmVzIGNvbXByZXNzZWQga2V5IHNjaGVkdWxlIHNldCB1cCBieQorIwlSQzRfc2V0X2tleSBbc2VlIGNvbW1lbnRhcnkgYmVsb3cgZm9yIGZ1cnRoZXIgZGV0YWlsc10uCisjCisjCQkJCQk8YXBwcm9AZnkuY2hhbG1lcnMuc2U+CisKKyMgTWF5IDIwMTEKKyMKKyMgT3B0aW1pemUgZm9yIENvcmUyIGFuZCBXZXN0bWVyZSBbYW5kIGluY2lkZW50YWxseSBPcHRlcm9uXS4gQ3VycmVudAorIyBwZXJmb3JtYW5jZSBpbiBjeWNsZXMgcGVyIHByb2Nlc3NlZCBieXRlIChsZXNzIGlzIGJldHRlcikgYW5kCisjIGltcHJvdmVtZW50IHJlbGF0aXZlIHRvIHByZXZpb3VzIHZlcnNpb24gb2YgdGhpcyBtb2R1bGUgaXM6CisjCisjIFBlbnRpdW0JMTAuMgkJCSMgb3JpZ2luYWwgbnVtYmVycworIyBQZW50aXVtIElJSQk3LjgoKikKKyMgSW50ZWwgUDQJNy41CisjCisjIE9wdGVyb24JNi4xLysyMCUJCSMgbmV3IE1NWCBudW1iZXJzCisjIENvcmUyCQk1LjMvKzY3JSgqKikKKyMgV2VzdG1lcmUJNS4xLys5NCUoKiopCisjIFNhbmR5IEJyaWRnZQk1LjAvKzglCisjIEF0b20JCTEyLjYvKzYlCisjCisjICgqKQlQSUlJIGNhbiBhY3R1YWxseSBkZWxpdmVyIDYuNiBjeWNsZXMgcGVyIGJ5dGUgd2l0aCBNTVggY29kZSwKKyMJYnV0IHRoaXMgc3BlY2lmaWMgY29kZSBwZXJmb3JtcyBwb29ybHkgb24gQ29yZTIuIEFuZCB2aWNlCisjCXZlcnNhLCBiZWxvdyBNTVgvU1NFIGNvZGUgZGVsaXZlcmluZyA1LjgvNy4xIG9uIENvcmUyIHBlcmZvcm1zCisjCXBvb3JseSBvbiBQSUlJLCBhdCA4LjAvMTQuNTotKCBBcyBQSUlJIGlzIG5vdCBhICJob3QiIENQVQorIwlbYW55bW9yZV0sIEkgY2hvc2UgdG8gZGlzY2FyZCBQSUlJLXNwZWNpZmljIGNvZGUgcGF0aCBhbmQgb3B0CisjCWZvciBvcmlnaW5hbCBJQUxVLW9ubHkgY29kZSwgd2hpY2ggaXMgd2h5IE1NWC9TU0UgY29kZSBwYXRoCisjCWlzIGd1YXJkZWQgYnkgU1NFMiBiaXQgKHNlZSBiZWxvdyksIG5vdCBNTVgvU1NFLgorIyAoKiopCVBlcmZvcm1hbmNlIHZzLiBibG9jayBzaXplIG9uIENvcmUyIGFuZCBXZXN0bWVyZSBoYWQgYSBtYXhpbXVtCisjCWF0IC4uLiA2NCBieXRlcyBibG9jayBzaXplLiBBbmQgaXQgd2FzIHF1aXRlIGEgbWF4aW11bSwgNDAtNjAlCisjCWluIGNvbXBhcmlzb24gdG8gbGFyZ2VzdCA4S0IgYmxvY2sgc2l6ZS4gQWJvdmUgaW1wcm92ZW1lbnQKKyMJY29lZmZpY2llbnRzIGFyZSBmb3IgdGhlIGxhcmdlc3QgYmxvY2sgc2l6ZS4KKworJDAgPX4gbS8oLipbXC9cXF0pW15cL1xcXSskLzsgJGRpcj0kMTsKK3B1c2goQElOQywiJHtkaXJ9IiwiJHtkaXJ9Li4vLi4vcGVybGFzbSIpOworcmVxdWlyZSAieDg2YXNtLnBsIjsKKworJmFzbV9pbml0KCRBUkdWWzBdLCJyYzQtNTg2LnBsIik7CisKKyR4eD0iZWF4IjsKKyR5eT0iZWJ4IjsKKyR0eD0iZWN4IjsKKyR0eT0iZWR4IjsKKyRpbnA9ImVzaSI7Ciskb3V0PSJlYnAiOworJGRhdD0iZWRpIjsKKworc3ViIFJDNF9sb29wIHsKKyAgbXkgJGk9c2hpZnQ7CisgIG15ICRmdW5jID0gKCRpPT0wKT8qbW92OipvcjsKKworCSZhZGQJKCZMQigkeXkpLCZMQigkdHgpKTsKKwkmbW92CSgkdHksJkRXUCgwLCRkYXQsJHl5LDQpKTsKKwkmbW92CSgmRFdQKDAsJGRhdCwkeXksNCksJHR4KTsKKwkmbW92CSgmRFdQKDAsJGRhdCwkeHgsNCksJHR5KTsKKwkmYWRkCSgkdHksJHR4KTsKKwkmaW5jCSgmTEIoJHh4KSk7CisJJmFuZAkoJHR5LDB4ZmYpOworCSZyb3IJKCRvdXQsOCkJaWYgKCRpIT0wKTsKKwlpZiAoJGk8MykgeworCSAgJm1vdgkoJHR4LCZEV1AoMCwkZGF0LCR4eCw0KSk7CisJfSBlbHNlIHsKKwkgICZtb3YJKCR0eCwmd3BhcmFtKDMpKTsJIyByZWxvYWQgW3JlLWJpYXNlZF0gb3V0CisJfQorCSYkZnVuYwkoJG91dCwmRFdQKDAsJGRhdCwkdHksNCkpOworfQorCitpZiAoJGFsdD0wKSB7CisgICMgPjIwJSBmYXN0ZXIgb24gQXRvbSBhbmQgU2FuZHkgQnJpZGdlWyFdLCA4JSBmYXN0ZXIgb24gT3B0ZXJvbiwKKyAgIyBidXQgfjQwJSBzbG93ZXIgb24gQ29yZTIgYW5kIFdlc3RtZXJlLi4uIEF0dGVtcHQgdG8gYWRkIG1vdnoKKyAgIyBicmluZ3MgZG93biBPcHRlcm9uIGJ5IDI1JSwgQXRvbSBhbmQgU2FuZHkgQnJpZGdlIGJ5IDE1JSwgeWV0CisgICMgb24gQ29yZTIgd2l0aCBtb3Z6IGl0J3MgYWxtb3N0IDIwJSBzbG93ZXIgdGhhbiBiZWxvdyBhbHRlcm5hdGl2ZQorICAjIGNvZGUuLi4gWWVzLCBpdCdzIGEgdG90YWwgbWVzcy4uLgorICBteSBAWFg9KCR4eCwkb3V0KTsKKyAgJFJDNF9sb29wX21teCA9IHN1YiB7CQkjIFNTRSBhY3R1YWxseS4uLgorICAgIG15ICRpPXNoaWZ0OworICAgIG15ICRqPSRpPD0wPzA6JGk+PjE7CisgICAgbXkgJG1tPSRpPD0wPyJtbTAiOiJtbSIuKCRpJjEpOworCisJJmFkZAkoJkxCKCR5eSksJkxCKCR0eCkpOworCSZsZWEJKEBYWFsxXSwmRFdQKDEsQFhYWzBdKSk7CisJJnB4b3IJKCJtbTIiLCJtbTAiKQkJCQlpZiAoJGk9PTApOworCSZwc2xscQkoIm1tMSIsOCkJCQkJaWYgKCRpPT0wKTsKKwkmYW5kCShAWFhbMV0sMHhmZik7CisJJnB4b3IJKCJtbTAiLCJtbTAiKQkJCQlpZiAoJGk8PTApOworCSZtb3YJKCR0eSwmRFdQKDAsJGRhdCwkeXksNCkpOworCSZtb3YJKCZEV1AoMCwkZGF0LCR5eSw0KSwkdHgpOworCSZweG9yCSgibW0xIiwibW0yIikJCQkJaWYgKCRpPT0wKTsKKwkmbW92CSgmRFdQKDAsJGRhdCwkWFhbMF0sNCksJHR5KTsKKwkmYWRkCSgmTEIoJHR5KSwmTEIoJHR4KSk7CisJJm1vdmQJKEBYWFswXSwibW03IikJCQkJaWYgKCRpPT0wKTsKKwkmbW92CSgkdHgsJkRXUCgwLCRkYXQsQFhYWzFdLDQpKTsKKwkmcHhvcgkoIm1tMSIsIm1tMSIpCQkJCWlmICgkaT09MSk7CisJJm1vdnEJKCJtbTIiLCZRV1AoMCwkaW5wKSkJCQlpZiAoJGk9PTEpOworCSZtb3ZxCSgmUVdQKC04LChAWFhbMF0sJGlucCkpLCJtbTEiKQkJaWYgKCRpPT0wKTsKKwkmcGluc3J3CSgkbW0sJkRXUCgwLCRkYXQsJHR5LDQpLCRqKTsKKworCXB1c2gJKEBYWCxzaGlmdChAWFgpKQkJCWlmICgkaT49MCk7CisgIH0KK30gZWxzZSB7CisgICMgVXNpbmcgcGluc3J3IGhlcmUgaW1wcm92ZXMgcGVyZm9ybWFuZSBvbiBJbnRlbCBDUFVzIGJ5IDItMyUsIGJ1dAorICAjIGJyaW5ncyBkb3duIEFNRCBieSA3JS4uLgorICAkUkM0X2xvb3BfbW14ID0gc3ViIHsKKyAgICBteSAkaT1zaGlmdDsKKworCSZhZGQJKCZMQigkeXkpLCZMQigkdHgpKTsKKwkmcHNsbHEJKCJtbTEiLDgqKCgkaS0xKSY3KSkJCQlpZiAoYWJzKCRpKSE9MSk7CisJJm1vdgkoJHR5LCZEV1AoMCwkZGF0LCR5eSw0KSk7CisJJm1vdgkoJkRXUCgwLCRkYXQsJHl5LDQpLCR0eCk7CisJJm1vdgkoJkRXUCgwLCRkYXQsJHh4LDQpLCR0eSk7CisJJmluYwkoJHh4KTsKKwkmYWRkCSgkdHksJHR4KTsKKwkmbW92egkoJHh4LCZMQigkeHgpKTsJCQkJIyAoKikKKwkmbW92egkoJHR5LCZMQigkdHkpKTsJCQkJIyAoKikKKwkmcHhvcgkoIm1tMiIsJGk9PTE/Im1tMCI6Im1tMSIpCQlpZiAoJGk+PTApOworCSZtb3ZxCSgibW0wIiwmUVdQKDAsJGlucCkpCQkJaWYgKCRpPD0wKTsKKwkmbW92cQkoJlFXUCgtOCwoJG91dCwkaW5wKSksIm1tMiIpCQlpZiAoJGk9PTApOworCSZtb3YJKCR0eCwmRFdQKDAsJGRhdCwkeHgsNCkpOworCSZtb3ZkCSgkaT4wPyJtbTEiOiJtbTIiLCZEV1AoMCwkZGF0LCR0eSw0KSk7CisKKwkjICgqKQlUaGlzIGlzIHRoZSBrZXkgdG8gQ29yZTIgYW5kIFdlc3RtZXJlIHBlcmZvcm1hbmNlLgorCSMJV2hpdGhvdXQgbW92eiBvdXQtb2Ytb3JkZXIgZXhlY3V0aW9uIGxvZ2ljIGNvbmZ1c2VzCisJIwlpdHNlbGYgYW5kIGZhaWxzIHRvIHJlb3JkZXIgbG9hZHMgYW5kIHN0b3Jlcy4gUHJvYmxlbQorCSMJYXBwZWFycyB0byBiZSBmaXhlZCBpbiBTYW5keSBCcmlkZ2UuLi4KKyAgfQorfQorCismZXh0ZXJuYWxfbGFiZWwoIk9QRU5TU0xfaWEzMmNhcF9QIik7CisKKyMgdm9pZCBSQzQoUkM0X0tFWSAqa2V5LHNpemVfdCBsZW4sY29uc3QgdW5zaWduZWQgY2hhciAqaW5wLHVuc2lnbmVkIGNoYXIgKm91dCk7CismZnVuY3Rpb25fYmVnaW4oIlJDNCIpOworCSZtb3YJKCRkYXQsJndwYXJhbSgwKSk7CSMgbG9hZCBrZXkgc2NoZWR1bGUgcG9pbnRlcgorCSZtb3YJKCR0eSwgJndwYXJhbSgxKSk7CSMgbG9hZCBsZW4KKwkmbW92CSgkaW5wLCZ3cGFyYW0oMikpOwkjIGxvYWQgaW5wCisJJm1vdgkoJG91dCwmd3BhcmFtKDMpKTsJIyBsb2FkIG91dAorCisJJnhvcgkoJHh4LCR4eCk7CQkjIGF2b2lkIHBhcnRpYWwgcmVnaXN0ZXIgc3RhbGxzCisJJnhvcgkoJHl5LCR5eSk7CisKKwkmY21wCSgkdHksMCk7CQkjIHNhZmV0eSBuZXQKKwkmamUJKCZsYWJlbCgiYWJvcnQiKSk7CisKKwkmbW92CSgmTEIoJHh4KSwmQlAoMCwkZGF0KSk7CSMgbG9hZCBrZXktPngKKwkmbW92CSgmTEIoJHl5KSwmQlAoNCwkZGF0KSk7CSMgbG9hZCBrZXktPnkKKwkmYWRkCSgkZGF0LDgpOworCisJJmxlYQkoJHR4LCZEV1AoMCwkaW5wLCR0eSkpOworCSZzdWIJKCRvdXQsJGlucCk7CQkjIHJlLWJpYXMgb3V0CisJJm1vdgkoJndwYXJhbSgxKSwkdHgpOwkjIHNhdmUgaW5wdXQrbGVuCisKKwkmaW5jCSgmTEIoJHh4KSk7CisKKwkjIGRldGVjdCBjb21wcmVzc2VkIGtleSBzY2hlZHVsZS4uLgorCSZjbXAJKCZEV1AoMjU2LCRkYXQpLC0xKTsKKwkmamUJKCZsYWJlbCgiUkM0X0NIQVIiKSk7CisKKwkmbW92CSgkdHgsJkRXUCgwLCRkYXQsJHh4LDQpKTsKKworCSZhbmQJKCR0eSwtNCk7CQkjIGhvdyBtYW55IDQtYnl0ZSBjaHVua3M/CisJJmp6CSgmbGFiZWwoImxvb3AxIikpOworCisJJnRlc3QJKCR0eSwtOCk7CisJJm1vdgkoJndwYXJhbSgzKSwkb3V0KTsJIyAkb3V0IGFzIGFjY3VtdWxhdG9yIGluIHRoZXNlIGxvb3BzCisJJmp6CSgmbGFiZWwoImdvNGxvb3A0IikpOworCisJJnBpY21ldXAoJG91dCwiT1BFTlNTTF9pYTMyY2FwX1AiKTsKKwkmYnQJKCZEV1AoMCwkb3V0KSwyNik7CSMgY2hlY2sgU1NFMiBiaXQgW2NvdWxkIGhhdmUgYmVlbiBNTVhdCisJJmpuYwkoJmxhYmVsKCJnbzRsb29wNCIpKTsKKworCSZtb3YJKCRvdXQsJndwYXJhbSgzKSkJaWYgKCEkYWx0KTsKKwkmbW92ZAkoIm1tNyIsJndwYXJhbSgzKSkJaWYgKCRhbHQpOworCSZhbmQJKCR0eSwtOCk7CisJJmxlYQkoJHR5LCZEV1AoLTgsJGlucCwkdHkpKTsKKwkmbW92CSgmRFdQKC00LCRkYXQpLCR0eSk7CSMgc2F2ZSBpbnB1dCsobGVuLzgpKjgtOAorCisJJiRSQzRfbG9vcF9tbXgoLTEpOworCSZqbXAoJmxhYmVsKCJsb29wX21teF9lbnRlciIpKTsKKworCSZzZXRfbGFiZWwoImxvb3BfbW14IiwxNik7CisJCSYkUkM0X2xvb3BfbW14KDApOworCSZzZXRfbGFiZWwoImxvb3BfbW14X2VudGVyIik7CisJCWZvciAJKCRpPTE7JGk8ODskaSsrKSB7ICYkUkM0X2xvb3BfbW14KCRpKTsgfQorCQkmbW92CSgkdHksJHl5KTsKKwkJJnhvcgkoJHl5LCR5eSk7CQkjIHRoaXMgaXMgc2Vjb25kIGtleSB0byBDb3JlMgorCQkmbW92CSgmTEIoJHl5KSwmTEIoJHR5KSk7CSMgYW5kIFdlc3RtZXJlIHBlcmZvcm1hbmNlLi4uCisJCSZjbXAJKCRpbnAsJkRXUCgtNCwkZGF0KSk7CisJCSZsZWEJKCRpbnAsJkRXUCg4LCRpbnApKTsKKwkmamIJKCZsYWJlbCgibG9vcF9tbXgiKSk7CisKKyAgICBpZiAoJGFsdCkgeworCSZtb3ZkCSgkb3V0LCJtbTciKTsKKwkmcHhvcgkoIm1tMiIsIm1tMCIpOworCSZwc2xscQkoIm1tMSIsOCk7CisJJnB4b3IJKCJtbTEiLCJtbTIiKTsKKwkmbW92cQkoJlFXUCgtOCwkb3V0LCRpbnApLCJtbTEiKTsKKyAgICB9IGVsc2UgeworCSZwc2xscQkoIm1tMSIsNTYpOworCSZweG9yCSgibW0yIiwibW0xIik7CisJJm1vdnEJKCZRV1AoLTgsJG91dCwkaW5wKSwibW0yIik7CisgICAgfQorCSZlbW1zCSgpOworCisJJmNtcAkoJGlucCwmd3BhcmFtKDEpKTsJIyBjb21wYXJlIHRvIGlucHV0K2xlbgorCSZqZQkoJmxhYmVsKCJkb25lIikpOworCSZqbXAJKCZsYWJlbCgibG9vcDEiKSk7CisKKyZzZXRfbGFiZWwoImdvNGxvb3A0IiwxNik7CisJJmxlYQkoJHR5LCZEV1AoLTQsJGlucCwkdHkpKTsKKwkmbW92CSgmd3BhcmFtKDIpLCR0eSk7CSMgc2F2ZSBpbnB1dCsobGVuLzQpKjQtNAorCisJJnNldF9sYWJlbCgibG9vcDQiKTsKKwkJZm9yICgkaT0wOyRpPDQ7JGkrKykgeyBSQzRfbG9vcCgkaSk7IH0KKwkJJnJvcgkoJG91dCw4KTsKKwkJJnhvcgkoJG91dCwmRFdQKDAsJGlucCkpOworCQkmY21wCSgkaW5wLCZ3cGFyYW0oMikpOwkjIGNvbXBhcmUgdG8gaW5wdXQrKGxlbi80KSo0LTQKKwkJJm1vdgkoJkRXUCgwLCR0eCwkaW5wKSwkb3V0KTsjICR0eCBob2xkcyByZS1iaWFzZWQgb3V0IGhlcmUKKwkJJmxlYQkoJGlucCwmRFdQKDQsJGlucCkpOworCQkmbW92CSgkdHgsJkRXUCgwLCRkYXQsJHh4LDQpKTsKKwkmamIJKCZsYWJlbCgibG9vcDQiKSk7CisKKwkmY21wCSgkaW5wLCZ3cGFyYW0oMSkpOwkjIGNvbXBhcmUgdG8gaW5wdXQrbGVuCisJJmplCSgmbGFiZWwoImRvbmUiKSk7CisJJm1vdgkoJG91dCwmd3BhcmFtKDMpKTsJIyByZXN0b3JlICRvdXQKKworCSZzZXRfbGFiZWwoImxvb3AxIiwxNik7CisJCSZhZGQJKCZMQigkeXkpLCZMQigkdHgpKTsKKwkJJm1vdgkoJHR5LCZEV1AoMCwkZGF0LCR5eSw0KSk7CisJCSZtb3YJKCZEV1AoMCwkZGF0LCR5eSw0KSwkdHgpOworCQkmbW92CSgmRFdQKDAsJGRhdCwkeHgsNCksJHR5KTsKKwkJJmFkZAkoJHR5LCR0eCk7CisJCSZpbmMJKCZMQigkeHgpKTsKKwkJJmFuZAkoJHR5LDB4ZmYpOworCQkmbW92CSgkdHksJkRXUCgwLCRkYXQsJHR5LDQpKTsKKwkJJnhvcgkoJkxCKCR0eSksJkJQKDAsJGlucCkpOworCQkmbGVhCSgkaW5wLCZEV1AoMSwkaW5wKSk7CisJCSZtb3YJKCR0eCwmRFdQKDAsJGRhdCwkeHgsNCkpOworCQkmY21wCSgkaW5wLCZ3cGFyYW0oMSkpOwkjIGNvbXBhcmUgdG8gaW5wdXQrbGVuCisJCSZtb3YJKCZCUCgtMSwkb3V0LCRpbnApLCZMQigkdHkpKTsKKwkmamIJKCZsYWJlbCgibG9vcDEiKSk7CisKKwkmam1wCSgmbGFiZWwoImRvbmUiKSk7CisKKyMgdGhpcyBpcyBlc3NlbnRpYWxseSBJbnRlbCBQNCBzcGVjaWZpYyBjb2RlcGF0aC4uLgorJnNldF9sYWJlbCgiUkM0X0NIQVIiLDE2KTsKKwkmbW92egkoJHR4LCZCUCgwLCRkYXQsJHh4KSk7CisJIyBzdHJhbmdlbHkgZW5vdWdoIHVucm9sbGVkIGxvb3AgcGVyZm9ybXMgb3ZlciAyMCUgc2xvd2VyLi4uCisJJnNldF9sYWJlbCgiY2xvb3AxIik7CisJCSZhZGQJKCZMQigkeXkpLCZMQigkdHgpKTsKKwkJJm1vdnoJKCR0eSwmQlAoMCwkZGF0LCR5eSkpOworCQkmbW92CSgmQlAoMCwkZGF0LCR5eSksJkxCKCR0eCkpOworCQkmbW92CSgmQlAoMCwkZGF0LCR4eCksJkxCKCR0eSkpOworCQkmYWRkCSgmTEIoJHR5KSwmTEIoJHR4KSk7CisJCSZtb3Z6CSgkdHksJkJQKDAsJGRhdCwkdHkpKTsKKwkJJmFkZAkoJkxCKCR4eCksMSk7CisJCSZ4b3IJKCZMQigkdHkpLCZCUCgwLCRpbnApKTsKKwkJJmxlYQkoJGlucCwmRFdQKDEsJGlucCkpOworCQkmbW92egkoJHR4LCZCUCgwLCRkYXQsJHh4KSk7CisJCSZjbXAJKCRpbnAsJndwYXJhbSgxKSk7CisJCSZtb3YJKCZCUCgtMSwkb3V0LCRpbnApLCZMQigkdHkpKTsKKwkmamIJKCZsYWJlbCgiY2xvb3AxIikpOworCismc2V0X2xhYmVsKCJkb25lIik7CisJJmRlYwkoJkxCKCR4eCkpOworCSZtb3YJKCZEV1AoLTQsJGRhdCksJHl5KTsJCSMgc2F2ZSBrZXktPnkKKwkmbW92CSgmQlAoLTgsJGRhdCksJkxCKCR4eCkpOwkjIHNhdmUga2V5LT54Cismc2V0X2xhYmVsKCJhYm9ydCIpOworJmZ1bmN0aW9uX2VuZCgiUkM0Iik7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCiskaW5wPSJlc2kiOworJG91dD0iZWRpIjsKKyRpZGk9ImVicCI7CiskaWRvPSJlY3giOworJGlkeD0iZWR4IjsKKworIyB2b2lkIFJDNF9zZXRfa2V5KFJDNF9LRVkgKmtleSxpbnQgbGVuLGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEpOworJmZ1bmN0aW9uX2JlZ2luKCJSQzRfc2V0X2tleSIpOworCSZtb3YJKCRvdXQsJndwYXJhbSgwKSk7CQkjIGxvYWQga2V5CisJJm1vdgkoJGlkaSwmd3BhcmFtKDEpKTsJCSMgbG9hZCBsZW4KKwkmbW92CSgkaW5wLCZ3cGFyYW0oMikpOwkJIyBsb2FkIGRhdGEKKwkmcGljbWV1cCgkaWR4LCJPUEVOU1NMX2lhMzJjYXBfUCIpOworCisJJmxlYQkoJG91dCwmRFdQKDIqNCwkb3V0KSk7CQkjICZrZXktPmRhdGEKKwkmbGVhCSgkaW5wLCZEV1AoMCwkaW5wLCRpZGkpKTsJIyAkaW5wIHRvIHBvaW50IGF0IHRoZSBlbmQKKwkmbmVnCSgkaWRpKTsKKwkmeG9yCSgiZWF4IiwiZWF4Iik7CisJJm1vdgkoJkRXUCgtNCwkb3V0KSwkaWRpKTsJCSMgYm9ycm93IGtleS0+eQorCisJJmJ0CSgmRFdQKDAsJGlkeCksMjApOwkJIyBjaGVjayBmb3IgYml0IzIwCisJJmpjCSgmbGFiZWwoImMxc3Rsb29wIikpOworCismc2V0X2xhYmVsKCJ3MXN0bG9vcCIsMTYpOworCSZtb3YJKCZEV1AoMCwkb3V0LCJlYXgiLDQpLCJlYXgiKTsJIyBrZXktPmRhdGFbaV09aTsKKwkmYWRkCSgmTEIoImVheCIpLDEpOwkJCSMgaSsrOworCSZqbmMJKCZsYWJlbCgidzFzdGxvb3AiKSk7CisKKwkmeG9yCSgkaWRvLCRpZG8pOworCSZ4b3IJKCRpZHgsJGlkeCk7CisKKyZzZXRfbGFiZWwoIncybmRsb29wIiwxNik7CisJJm1vdgkoImVheCIsJkRXUCgwLCRvdXQsJGlkbyw0KSk7CisJJmFkZAkoJkxCKCRpZHgpLCZCUCgwLCRpbnAsJGlkaSkpOworCSZhZGQJKCZMQigkaWR4KSwmTEIoImVheCIpKTsKKwkmYWRkCSgkaWRpLDEpOworCSZtb3YJKCJlYngiLCZEV1AoMCwkb3V0LCRpZHgsNCkpOworCSZqbnoJKCZsYWJlbCgid25vd3JhcCIpKTsKKwkgICZtb3YJKCRpZGksJkRXUCgtNCwkb3V0KSk7CisJJnNldF9sYWJlbCgid25vd3JhcCIpOworCSZtb3YJKCZEV1AoMCwkb3V0LCRpZHgsNCksImVheCIpOworCSZtb3YJKCZEV1AoMCwkb3V0LCRpZG8sNCksImVieCIpOworCSZhZGQJKCZMQigkaWRvKSwxKTsKKwkmam5jCSgmbGFiZWwoIncybmRsb29wIikpOworJmptcAkoJmxhYmVsKCJleGl0IikpOworCisjIFVubGlrZSBhbGwgb3RoZXIgeDg2IFthbmQgeDg2XzY0XSBpbXBsZW1lbnRhdGlvbnMsIEludGVsIFA0IGNvcmUKKyMgW2luY2x1ZGluZyBFTTY0VF0gd2FzIGZvdW5kIHRvIHBlcmZvcm0gcG9vcmx5IHdpdGggYWJvdmUgIjMyLWJpdCIga2V5CisjIHNjaGVkdWxlLCBhLmsuYS4gUkM0X0lOVC4gUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgZm9yIElBLTMyIGhhbmQtY29kZWQKKyMgYXNzZW1ibGVyIHR1cm5lZCBvdXQgdG8gYmUgMy41eCBpZiByZS1jb2RlZCBmb3IgY29tcHJlc3NlZCA4LWJpdCBvbmUsCisjIGEuay5hLiBSQzRfQ0hBUiEgSXQncyBob3dldmVyIGluYXBwcm9wcmlhdGUgdG8ganVzdCBzd2l0Y2ggdG8gOC1iaXQKKyMgc2NoZWR1bGUgZm9yIHg4NltfNjRdLCBiZWNhdXNlIG5vbi1QNCBpbXBsZW1lbnRhdGlvbnMgc3VmZmVyIGZyb20KKyMgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgbG9zc2VzIHRoZW4sIGUuZy4gUElJSSBleGhpYml0cyA+MngKKyMgZGV0ZXJpb3JhdGlvbiwgYW5kIHNvIGRvZXMgT3B0ZXJvbi4gSW4gb3JkZXIgdG8gYXNzdXJlIG9wdGltYWwKKyMgYWxsLXJvdW5kIHBlcmZvcm1hbmNlLCB3ZSBkZXRlY3QgUDQgYXQgcnVuLXRpbWUgYW5kIHNldCB1cCBjb21wcmVzc2VkCisjIGtleSBzY2hlZHVsZSwgd2hpY2ggaXMgcmVjb2duaXplZCBieSBSQzQgcHJvY2VkdXJlLgorCismc2V0X2xhYmVsKCJjMXN0bG9vcCIsMTYpOworCSZtb3YJKCZCUCgwLCRvdXQsImVheCIpLCZMQigiZWF4IikpOwkjIGtleS0+ZGF0YVtpXT1pOworCSZhZGQJKCZMQigiZWF4IiksMSk7CQkJIyBpKys7CisJJmpuYwkoJmxhYmVsKCJjMXN0bG9vcCIpKTsKKworCSZ4b3IJKCRpZG8sJGlkbyk7CisJJnhvcgkoJGlkeCwkaWR4KTsKKwkmeG9yCSgiZWJ4IiwiZWJ4Iik7CisKKyZzZXRfbGFiZWwoImMybmRsb29wIiwxNik7CisJJm1vdgkoJkxCKCJlYXgiKSwmQlAoMCwkb3V0LCRpZG8pKTsKKwkmYWRkCSgmTEIoJGlkeCksJkJQKDAsJGlucCwkaWRpKSk7CisJJmFkZAkoJkxCKCRpZHgpLCZMQigiZWF4IikpOworCSZhZGQJKCRpZGksMSk7CisJJm1vdgkoJkxCKCJlYngiKSwmQlAoMCwkb3V0LCRpZHgpKTsKKwkmam56CSgmbGFiZWwoImNub3dyYXAiKSk7CisJICAmbW92CSgkaWRpLCZEV1AoLTQsJG91dCkpOworCSZzZXRfbGFiZWwoImNub3dyYXAiKTsKKwkmbW92CSgmQlAoMCwkb3V0LCRpZHgpLCZMQigiZWF4IikpOworCSZtb3YJKCZCUCgwLCRvdXQsJGlkbyksJkxCKCJlYngiKSk7CisJJmFkZAkoJkxCKCRpZG8pLDEpOworCSZqbmMJKCZsYWJlbCgiYzJuZGxvb3AiKSk7CisKKwkmbW92CSgmRFdQKDI1Niwkb3V0KSwtMSk7CQkjIG1hcmsgc2NoZWR1bGUgYXMgY29tcHJlc3NlZAorCismc2V0X2xhYmVsKCJleGl0Iik7CisJJnhvcgkoImVheCIsImVheCIpOworCSZtb3YJKCZEV1AoLTgsJG91dCksImVheCIpOwkJIyBrZXktPng9MDsKKwkmbW92CSgmRFdQKC00LCRvdXQpLCJlYXgiKTsJCSMga2V5LT55PTA7CismZnVuY3Rpb25fZW5kKCJSQzRfc2V0X2tleSIpOworCisjIGNvbnN0IGNoYXIgKlJDNF9vcHRpb25zKHZvaWQpOworJmZ1bmN0aW9uX2JlZ2luX0IoIlJDNF9vcHRpb25zIik7CisJJmNhbGwJKCZsYWJlbCgicGljX3BvaW50IikpOworJnNldF9sYWJlbCgicGljX3BvaW50Iik7CisJJmJsaW5kcG9wKCJlYXgiKTsKKwkmbGVhCSgiZWF4IiwmRFdQKCZsYWJlbCgib3B0cyIpLiItIi4mbGFiZWwoInBpY19wb2ludCIpLCJlYXgiKSk7CisJJnBpY21ldXAoImVkeCIsIk9QRU5TU0xfaWEzMmNhcF9QIik7CisJJm1vdgkoImVkeCIsJkRXUCgwLCJlZHgiKSk7CisJJmJ0CSgiZWR4IiwyMCk7CisJJmpjCSgmbGFiZWwoIjF4Y2hhciIpKTsKKwkmYnQJKCJlZHgiLDI2KTsKKwkmam5jCSgmbGFiZWwoInJldCIpKTsKKwkmYWRkCSgiZWF4IiwyNSk7CisJJnJldAkoKTsKKyZzZXRfbGFiZWwoIjF4Y2hhciIpOworCSZhZGQJKCJlYXgiLDEyKTsKKyZzZXRfbGFiZWwoInJldCIpOworCSZyZXQJKCk7Cismc2V0X2xhYmVsKCJvcHRzIiw2NCk7CismYXNjaXoJKCJyYzQoNHgsaW50KSIpOworJmFzY2l6CSgicmM0KDF4LGNoYXIpIik7CismYXNjaXoJKCJyYzQoOHgsbW14KSIpOworJmFzY2l6CSgiUkM0IGZvciB4ODYsIENSWVBUT0dBTVMgYnkgPGFwcHJvXEBvcGVuc3NsLm9yZz4iKTsKKyZhbGlnbgkoNjQpOworJmZ1bmN0aW9uX2VuZF9CKCJSQzRfb3B0aW9ucyIpOworCismYXNtX2ZpbmlzaCgpOworCmRpZmYgLS1naXQgYS9jcnlwdG8vcmM0L2FzbS9yYzQteDg2XzY0LnBsIGIvY3J5cHRvL3JjNC9hc20vcmM0LXg4Nl82NC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2RhOGZhCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3JjNC9hc20vcmM0LXg4Nl82NC5wbApAQCAtMCwwICsxLDY3NyBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorIworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiBmb3IgdGhlIE9wZW5TU0wKKyMgcHJvamVjdC4gVGhlIG1vZHVsZSBpcywgaG93ZXZlciwgZHVhbCBsaWNlbnNlZCB1bmRlciBPcGVuU1NMIGFuZAorIyBDUllQVE9HQU1TIGxpY2Vuc2VzIGRlcGVuZGluZyBvbiB3aGVyZSB5b3Ugb2J0YWluIGl0LiBGb3IgZnVydGhlcgorIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgSnVseSAyMDA0CisjCisjIDIuMjJ4IFJDNCB0dW5lLXVwOi0pIEl0IHNob3VsZCBiZSBub3RlZCB0aG91Z2ggdGhhdCBteSBoYW5kIFthcyBpbgorIyAiaGFuZC1jb2RlZCBhc3NlbWJsZXIiXSBkb2Vzbid0IHN0YW5kIGZvciB0aGUgd2hvbGUgaW1wcm92ZW1lbnQKKyMgY29lZmZpY2llbnQuIEl0IHR1cm5lZCBvdXQgdGhhdCBlbGltaW5hdGluZyBSQzRfQ0hBUiBmcm9tIGNvbmZpZworIyBsaW5lIHJlc3VsdHMgaW4gfjQwJSBpbXByb3ZlbWVudCAoeWVzLCBldmVuIGZvciBDIGltcGxlbWVudGF0aW9uKS4KKyMgUHJlc3VtYWJseSBpdCBoYXMgZXZlcnl0aGluZyB0byBkbyB3aXRoIEFNRCBjYWNoZSBhcmNoaXRlY3R1cmUgYW5kCisjIFJBVyBvciB3aGF0ZXZlciBwZW5hbHRpZXMuIE9uY2UgYWdhaW4hIFRoZSBtb2R1bGUgKnJlcXVpcmVzKiBjb25maWcKKyMgbGluZSAqd2l0aG91dCogUkM0X0NIQVIhIEFzIGZvciBjb2RpbmcgInNlY3JldCwiIEkgYmV0IG9uIHBhcnRpYWwKKyMgcmVnaXN0ZXIgYXJpdGhtZXRpY3MuIEZvciBleGFtcGxlIGluc3RlYWQgb2YgJ2luYyAlcjg7IGFuZCAkMjU1LCVyOCcKKyMgSSBzaW1wbHkgJ2luYyAlcjhiJy4gRXZlbiB0aG91Z2ggb3B0aW1pemF0aW9uIG1hbnVhbCBkaXNjb3VyYWdlcworIyB0byBvcGVyYXRlIG9uIHBhcnRpYWwgcmVnaXN0ZXJzLCBpdCB0dXJuZWQgb3V0IHRvIGJlIHRoZSBiZXN0IGJldC4KKyMgQXQgbGVhc3QgZm9yIEFNRC4uLiBIb3cgSUEzMkUgd291bGQgcGVyZm9ybSByZW1haW5zIHRvIGJlIHNlZW4uLi4KKworIyBOb3ZlbWJlciAyMDA0CisjCisjIEFzIHdhcyBzaG93biBieSBNYXJjIEJldmFuZCByZW9yZGVyaW5nIG9mIGNvdXBsZSBvZiBsb2FkIG9wZXJhdGlvbnMKKyMgcmVzdWx0cyBpbiBldmVuIGhpZ2hlciBwZXJmb3JtYW5jZSBnYWluIG9mIDMuM3g6LSkgQXQgbGVhc3Qgb24KKyMgT3B0ZXJvbi4uLiBGb3IgcmVmZXJlbmNlLCAxeCBpbiB0aGlzIGNhc2UgaXMgUkM0X0NIQVIgQy1jb2RlCisjIGNvbXBpbGVkIHdpdGggZ2NjIDMuMy4yLCB3aGljaCBwZXJmb3JtcyBhdCB+NTRNQnBzIHBlciAxR0h6IGNsb2NrLgorIyBMYXR0ZXIgbWVhbnMgdGhhdCBpZiB5b3Ugd2FudCB0byAqZXN0aW1hdGUqIHdoYXQgdG8gZXhwZWN0IGZyb20KKyMgKnlvdXIqIE9wdGVyb24sIHRoZW4gbXVsdGlwbHkgNTQgYnkgMy4zIGFuZCBjbG9jayBmcmVxdWVuY3kgaW4gR0h6LgorCisjIE5vdmVtYmVyIDIwMDQKKyMKKyMgSW50ZWwgUDQgRU02NFQgY29yZSB3YXMgZm91bmQgdG8gcnVuIHRoZSBBTUQ2NCBjb2RlIHJlYWxseSBzbG93Li4uCisjIFRoZSBvbmx5IHdheSB0byBhY2hpZXZlIGNvbXBhcmFibGUgcGVyZm9ybWFuY2Ugb24gUDQgd2FzIHRvIGtlZXAKKyMgUkM0X0NIQVIuIEtpbmQgb2YgaXJvbmljLCBodWg/IEFzIGl0J3MgYXBwYXJlbnRseSBpbXBvc3NpYmxlIHRvCisjIGNvbXBvc2UgYmxlbmRlZCBjb2RlLCB3aGljaCB3b3VsZCBwZXJmb3JtIGV2ZW4gd2l0aGluIDMwJSBtYXJnaW5hbAorIyBvbiBlaXRoZXIgQU1EIGFuZCBJbnRlbCBwbGF0Zm9ybXMsIEkgaW1wbGVtZW50IGJvdGggY2FzZXMuIFNlZQorIyByYzRfc2tleS5jIGZvciBmdXJ0aGVyIGRldGFpbHMuLi4KKworIyBBcHJpbCAyMDA1CisjCisjIFA0IEVNNjRUIGNvcmUgYXBwZWFycyB0byBiZSAiYWxsZXJnaWMiIHRvIDY0LWJpdCBpbmMvZGVjLiBSZXBsYWNpbmcgCisjIHRob3NlIHdpdGggYWRkL3N1YiByZXN1bHRzIGluIDUwJSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBvZiBmb2xkZWQKKyMgbG9vcC4uLgorCisjIE1heSAyMDA1CisjCisjIEFzIHdhcyBzaG93biBieSBab3UgTmFuaGFpIGxvb3AgdW5yb2xsaW5nIGNhbiBpbXByb3ZlIEludGVsIEVNNjRUCisjIHBlcmZvcm1hbmNlIGJ5ID4zMCUgW3VubGlrZSBQNCAzMi1iaXQgY2FzZSB0aGF0IGlzXS4gQnV0IHRoaXMgaXMKKyMgcHJvdmlkZWQgdGhhdCBsb2FkcyBhcmUgcmVvcmRlcmVkIGV2ZW4gbW9yZSBhZ2dyZXNzaXZlbHkhIEJvdGggY29kZQorIyBwYXRoZXMsIEFNRDY0IGFuZCBFTTY0VCwgcmVvcmRlciBsb2FkcyBpbiBlc3NlbnRpYWxseSBzYW1lIG1hbm5lcgorIyBhcyBteSBJQS02NCBpbXBsZW1lbnRhdGlvbi4gT24gT3B0ZXJvbiB0aGlzIHJlc3VsdGVkIGluIG1vZGVzdCA1JQorIyBpbXByb3ZlbWVudCBbSSBoYWQgdG8gdGVzdCBpdF0sIHdoaWxlIGZpbmFsIEludGVsIFA0IHBlcmZvcm1hbmNlCisjIGFjaGlldmVzIHJlc3BlY3RmdWwgNDMyTUJwcyBvbiAyLjhHSHogcHJvY2Vzc29yIG5vdy4gRm9yIHJlZmVyZW5jZS4KKyMgSWYgZXhlY3V0ZWQgb24gWGVvbiwgY3VycmVudCBSQzRfQ0hBUiBjb2RlLXBhdGggaXMgMi43eCBmYXN0ZXIgdGhhbgorIyBSQzRfSU5UIGNvZGUtcGF0aC4gV2hpbGUgaWYgZXhlY3V0ZWQgb24gT3B0ZXJvbiwgaXQncyBvbmx5IDI1JQorIyBzbG93ZXIgdGhhbiB0aGUgUkM0X0lOVCBvbmUgW21lYW5pbmcgdGhhdCBpZiBDUFUgtS1hcmNoIGRldGVjdGlvbgorIyBpcyBub3QgaW1wbGVtZW50ZWQsIHRoZW4gdGhpcyBmaW5hbCBSQzRfQ0hBUiBjb2RlLXBhdGggc2hvdWxkIGJlCisjIHByZWZlcnJlZCwgYXMgaXQgcHJvdmlkZXMgYmV0dGVyICphbGwtcm91bmQqIHBlcmZvcm1hbmNlXS4KKworIyBNYXJjaCAyMDA3CisjCisjIEludGVsIENvcmUyIHdhcyBvYnNlcnZlZCB0byBwZXJmb3JtIHBvb3JseSBvbiBib3RoIGNvZGUgcGF0aHM6LSggSXQKKyMgYXBwYXJlbnRseSBzdWZmZXJzIGZyb20gc29tZSBraW5kIG9mIHBhcnRpYWwgcmVnaXN0ZXIgc3RhbGwsIHdoaWNoCisjIG9jY3VycyBpbiA2NC1iaXQgbW9kZSBvbmx5IFthcyB2aXJ0dWFsbHkgaWRlbnRpY2FsIDMyLWJpdCBsb29wIHdhcworIyBvYnNlcnZlZCB0byBvdXRwZXJmb3JtIDY0LWJpdCBvbmUgYnkgYWxtb3N0IDUwJV0uIEFkZGluZyB0d28gbW92emIgdG8KKyMgY2xvb3AxIGJvb3N0cyBpdHMgcGVyZm9ybWFuY2UgYnkgODAlISBUaGlzIGxvb3AgYXBwZWFycyB0byBiZSBvcHRpbWFsCisjIGZpdCBmb3IgQ29yZTIgYW5kIHRoZXJlZm9yZSB0aGUgY29kZSB3YXMgbW9kaWZpZWQgdG8gc2tpcCBjbG9vcDggb24KKyMgdGhpcyBDUFUuCisKKyMgTWF5IDIwMTAKKyMKKyMgSW50ZWwgV2VzdG1lcmUgd2FzIG9ic2VydmVkIHRvIHBlcmZvcm0gc3Vib3B0aW1hbGx5LiBBZGRpbmcgeWV0CisjIGFub3RoZXIgbW92emIgdG8gY2xvb3AxIGltcHJvdmVkIHBlcmZvcm1hbmNlIGJ5IGFsbW9zdCA1MCUhIENvcmUyCisjIHBlcmZvcm1hbmNlIGlzIGltcHJvdmVkIHRvbywgYnV0IG5vbWluYWxseS4uLgorCisjIE1heSAyMDExCisjCisjIFRoZSBvbmx5IGNvZGUgcGF0aCB0aGF0IHdhcyBub3QgbW9kaWZpZWQgaXMgUDQtc3BlY2lmaWMgb25lLiBOb24tUDQKKyMgSW50ZWwgY29kZSBwYXRoIG9wdGltaXphdGlvbiBpcyBoZWF2aWx5IGJhc2VkIG9uIHN1Ym1pc3Npb24gYnkgTWF4aW0KKyMgUGVybWlub3YsIE1heGltIExvY2t0eXVraGluIGFuZCBKaW0gR3VpbGZvcmQgb2YgSW50ZWwuIEkndmUgdXNlZAorIyBzb21lIG9mIHRoZSBpZGVhcyBldmVuIGluIGF0dGVtcHQgdG8gb3B0bWl6ZSB0aGUgb3JpZ2luYWwgUkM0X0lOVAorIyBjb2RlIHBhdGguLi4gQ3VycmVudCBwZXJmb3JtYW5jZSBpbiBjeWNsZXMgcGVyIHByb2Nlc3NlZCBieXRlIChsZXNzCisjIGlzIGJldHRlcikgYW5kIGltcHJvdmVtZW50IGNvZWZmaWNpZW50cyByZWxhdGl2ZSB0byBwcmV2aW91cworIyB2ZXJzaW9uIG9mIHRoaXMgbW9kdWxlIGFyZToKKyMKKyMgT3B0ZXJvbgk1LjMvKzAlKCopCisjIFA0CQk2LjUKKyMgQ29yZTIJCTYuMi8rMTUlKCoqKQorIyBXZXN0bWVyZQk0LjIvKzYwJQorIyBTYW5keSBCcmlkZ2UJNC4yLysxMjAlCisjIEF0b20JCTkuMy8rODAlCisjCisjICgqKQlCdXQgY29ycmVzcG9uZGluZyBsb29wIGhhcyBsZXNzIGluc3RydWN0aW9ucywgd2hpY2ggc2hvdWxkIGhhdmUKKyMJcG9zaXRpdmUgZWZmZWN0IG9uIHVwY29taW5nIEJ1bGxkb3plciwgd2hpY2ggaGFzIG9uZSBsZXNzIEFMVS4KKyMJRm9yIHJlZmVyZW5jZSwgSW50ZWwgY29kZSBydW5zIGF0IDYuOCBjcGIgcmF0ZSBvbiBPcHRlcm9uLgorIyAoKiopCU5vdGUgdGhhdCBDb3JlMiByZXN1bHQgaXMgfjE1JSBsb3dlciB0aGFuIGNvcnJlc3BvbmRpbmcgcmVzdWx0CisjCWZvciAzMi1iaXQgY29kZSwgbWVhbmluZyB0aGF0IGl0J3MgcG9zc2libGUgdG8gaW1wcm92ZSBpdCwKKyMJYnV0IG1vcmUgdGhhbiBsaWtlbHkgYXQgdGhlIGNvc3Qgb2YgdGhlIG90aGVycyAoc2VlIHJjNC01ODYucGwKKyMJdG8gZ2V0IHRoZSBpZGVhKS4uLgorCiskZmxhdm91ciA9IHNoaWZ0OworJG91dHB1dCAgPSBzaGlmdDsKK2lmICgkZmxhdm91ciA9fiAvXC4vKSB7ICRvdXRwdXQgPSAkZmxhdm91cjsgdW5kZWYgJGZsYXZvdXI7IH0KKworJHdpbjY0PTA7ICR3aW42ND0xIGlmICgkZmxhdm91ciA9fiAvW25tXWFzbXxtaW5ndzY0LyB8fCAkb3V0cHV0ID1+IC9cLmFzbSQvKTsKKworJDAgPX4gbS8oLipbXC9cXF0pW15cL1xcXSskLzsgJGRpcj0kMTsKKyggJHhsYXRlPSIke2Rpcn14ODZfNjQteGxhdGUucGwiIGFuZCAtZiAkeGxhdGUgKSBvcgorKCAkeGxhdGU9IiR7ZGlyfS4uLy4uL3Blcmxhc20veDg2XzY0LXhsYXRlLnBsIiBhbmQgLWYgJHhsYXRlKSBvcgorZGllICJjYW4ndCBsb2NhdGUgeDg2XzY0LXhsYXRlLnBsIjsKKworb3BlbiBPVVQsInwgXCIkXlhcIiAkeGxhdGUgJGZsYXZvdXIgJG91dHB1dCI7CisqU1RET1VUPSpPVVQ7CisKKyRkYXQ9IiVyZGkiOwkgICAgIyBhcmcxCiskbGVuPSIlcnNpIjsJICAgICMgYXJnMgorJGlucD0iJXJkeCI7CSAgICAjIGFyZzMKKyRvdXQ9IiVyY3giOwkgICAgIyBhcmc0CisKK3sKKyRjb2RlPTw8X19fOworLnRleHQKKy5leHRlcm4JT1BFTlNTTF9pYTMyY2FwX1AKKworLmdsb2JsCVJDNAorLnR5cGUJUkM0LFxAZnVuY3Rpb24sNAorLmFsaWduCTE2CitSQzQ6CW9yCSRsZW4sJGxlbgorCWpuZQkuTGVudHJ5CisJcmV0CisuTGVudHJ5OgorCXB1c2gJJXJieAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworLkxwcm9sb2d1ZToKKwltb3YJJGxlbiwlcjExCisJbW92CSRpbnAsJXIxMgorCW1vdgkkb3V0LCVyMTMKK19fXworbXkgJGxlbj0iJXIxMSI7CQkjIHJlYXNzaWduIGlucHV0IGFyZ3VtZW50cworbXkgJGlucD0iJXIxMiI7CitteSAkb3V0PSIlcjEzIjsKKworbXkgQFhYPSgiJXIxMCIsIiVyc2kiKTsKK215IEBUWD0oIiVyYXgiLCIlcmJ4Iik7CitteSAkWVk9IiVyY3giOworbXkgJFRZPSIlcmR4IjsKKworJGNvZGUuPTw8X19fOworCXhvcgkkWFhbMF0sJFhYWzBdCisJeG9yCSRZWSwkWVkKKworCWxlYQk4KCRkYXQpLCRkYXQKKwltb3YJLTgoJGRhdCksJFhYWzBdI2IKKwltb3YJLTQoJGRhdCksJFlZI2IKKwljbXBsCVwkLTEsMjU2KCRkYXQpCisJamUJLkxSQzRfQ0hBUgorCW1vdglPUEVOU1NMX2lhMzJjYXBfUCglcmlwKSwlcjhkCisJeG9yCSRUWFsxXSwkVFhbMV0KKwlpbmMJJFhYWzBdI2IKKwlzdWIJJFhYWzBdLCRUWFsxXQorCXN1YgkkaW5wLCRvdXQKKwltb3ZsCSgkZGF0LCRYWFswXSw0KSwkVFhbMF0jZAorCXRlc3QJXCQtMTYsJGxlbgorCWp6CS5MbG9vcDEKKwlidAlcJDMwLCVyOGQJIyBJbnRlbCBDUFU/CisJamMJLkxpbnRlbAorCWFuZAlcJDcsJFRYWzFdCisJbGVhCTEoJFhYWzBdKSwkWFhbMV0KKwlqegkuTG9vcDgKKwlzdWIJJFRYWzFdLCRsZW4KKy5Mb29wOF93YXJtdXA6CisJYWRkCSRUWFswXSNiLCRZWSNiCisJbW92bAkoJGRhdCwkWVksNCksJFRZI2QKKwltb3ZsCSRUWFswXSNkLCgkZGF0LCRZWSw0KQorCW1vdmwJJFRZI2QsKCRkYXQsJFhYWzBdLDQpCisJYWRkCSRUWSNiLCRUWFswXSNiCisJaW5jCSRYWFswXSNiCisJbW92bAkoJGRhdCwkVFhbMF0sNCksJFRZI2QKKwltb3ZsCSgkZGF0LCRYWFswXSw0KSwkVFhbMF0jZAorCXhvcmIJKCRpbnApLCRUWSNiCisJbW92YgkkVFkjYiwoJG91dCwkaW5wKQorCWxlYQkxKCRpbnApLCRpbnAKKwlkZWMJJFRYWzFdCisJam56CS5Mb29wOF93YXJtdXAKKworCWxlYQkxKCRYWFswXSksJFhYWzFdCisJam1wCS5Mb29wOAorLmFsaWduCTE2CisuTG9vcDg6CitfX18KK2ZvciAoJGk9MDskaTw4OyRpKyspIHsKKyRjb2RlLj08PF9fXyBpZiAoJGk9PTcpOworCWFkZAlcJDgsJFhYWzFdI2IKK19fXworJGNvZGUuPTw8X19fOworCWFkZAkkVFhbMF0jYiwkWVkjYgorCW1vdmwJKCRkYXQsJFlZLDQpLCRUWSNkCisJbW92bAkkVFhbMF0jZCwoJGRhdCwkWVksNCkKKwltb3ZsCWA0KigkaT09Nz8tMTokaSlgKCRkYXQsJFhYWzFdLDQpLCRUWFsxXSNkCisJcm9yCVwkOCwlcjgJCQkJIyByb3IgaXMgcmVkdW5kYW50IHdoZW4gJGk9MAorCW1vdmwJJFRZI2QsNCokaSgkZGF0LCRYWFswXSw0KQorCWFkZAkkVFhbMF0jYiwkVFkjYgorCW1vdmIJKCRkYXQsJFRZLDQpLCVyOGIKK19fXworcHVzaChAVFgsc2hpZnQoQFRYKSk7ICNwdXNoKEBYWCxzaGlmdChAWFgpKTsJIyAicm90YXRlIiByZWdpc3RlcnMKK30KKyRjb2RlLj08PF9fXzsKKwlhZGQJXCQ4LCRYWFswXSNiCisJcm9yCVwkOCwlcjgKKwlzdWIJXCQ4LCRsZW4KKworCXhvcgkoJGlucCksJXI4CisJbW92CSVyOCwoJG91dCwkaW5wKQorCWxlYQk4KCRpbnApLCRpbnAKKworCXRlc3QJXCQtOCwkbGVuCisJam56CS5Mb29wOAorCWNtcAlcJDAsJGxlbgorCWpuZQkuTGxvb3AxCisJam1wCS5MZXhpdAorCisuYWxpZ24JMTYKKy5MaW50ZWw6CisJdGVzdAlcJC0zMiwkbGVuCisJanoJLkxsb29wMQorCWFuZAlcJDE1LCRUWFsxXQorCWp6CS5Mb29wMTZfaXNfaG90CisJc3ViCSRUWFsxXSwkbGVuCisuTG9vcDE2X3dhcm11cDoKKwlhZGQJJFRYWzBdI2IsJFlZI2IKKwltb3ZsCSgkZGF0LCRZWSw0KSwkVFkjZAorCW1vdmwJJFRYWzBdI2QsKCRkYXQsJFlZLDQpCisJbW92bAkkVFkjZCwoJGRhdCwkWFhbMF0sNCkKKwlhZGQJJFRZI2IsJFRYWzBdI2IKKwlpbmMJJFhYWzBdI2IKKwltb3ZsCSgkZGF0LCRUWFswXSw0KSwkVFkjZAorCW1vdmwJKCRkYXQsJFhYWzBdLDQpLCRUWFswXSNkCisJeG9yYgkoJGlucCksJFRZI2IKKwltb3ZiCSRUWSNiLCgkb3V0LCRpbnApCisJbGVhCTEoJGlucCksJGlucAorCWRlYwkkVFhbMV0KKwlqbnoJLkxvb3AxNl93YXJtdXAKKworCW1vdgkkWVksJFRYWzFdCisJeG9yCSRZWSwkWVkKKwltb3YJJFRYWzFdI2IsJFlZI2IKKworLkxvb3AxNl9pc19ob3Q6CisJbGVhCSgkZGF0LCRYWFswXSw0KSwkWFhbMV0KK19fXworc3ViIFJDNF9sb29wIHsKKyAgbXkgJGk9c2hpZnQ7CisgIG15ICRqPSRpPDA/MDokaTsKKyAgbXkgJHhtbT0iJXhtbSIuKCRqJjEpOworCisgICAgJGNvZGUuPSIJYWRkCVwkMTYsJFhYWzBdI2JcbiIJCWlmICgkaT09MTUpOworICAgICRjb2RlLj0iCW1vdmRxdQkoJGlucCksJXhtbTJcbiIJCQlpZiAoJGk9PTE1KTsKKyAgICAkY29kZS49IglhZGQJJFRYWzBdI2IsJFlZI2JcbiIJCWlmICgkaTw9MCk7CisgICAgJGNvZGUuPSIJbW92bAkoJGRhdCwkWVksNCksJFRZI2RcbiI7CisgICAgJGNvZGUuPSIJcHhvcgkleG1tMCwleG1tMlxuIgkJCWlmICgkaT09MCk7CisgICAgJGNvZGUuPSIJcHNsbHEJXCQ4LCV4bW0xXG4iCQkJaWYgKCRpPT0wKTsKKyAgICAkY29kZS49IglweG9yCSR4bW0sJHhtbVxuIgkJCWlmICgkaTw9MSk7CisgICAgJGNvZGUuPSIJbW92bAkkVFhbMF0jZCwoJGRhdCwkWVksNClcbiI7CisgICAgJGNvZGUuPSIJYWRkCSRUWSNiLCRUWFswXSNiXG4iOworICAgICRjb2RlLj0iCW1vdmwJYDQqKCRqKzEpYCgkWFhbMV0pLCRUWFsxXSNkXG4iCWlmICgkaTwxNSk7CisgICAgJGNvZGUuPSIJbW92egkkVFhbMF0jYiwkVFhbMF0jZFxuIjsKKyAgICAkY29kZS49Igltb3ZsCSRUWSNkLDQqJGooJFhYWzFdKVxuIjsKKyAgICAkY29kZS49IglweG9yCSV4bW0xLCV4bW0yXG4iCQkJaWYgKCRpPT0wKTsKKyAgICAkY29kZS49IglsZWEJKCRkYXQsJFhYWzBdLDQpLCRYWFsxXVxuIglpZiAoJGk9PTE1KTsKKyAgICAkY29kZS49IglhZGQJJFRYWzFdI2IsJFlZI2JcbiIJCWlmICgkaTwxNSk7CisgICAgJGNvZGUuPSIJcGluc3J3CVwkYCgkaj4+MSkmN2AsKCRkYXQsJFRYWzBdLDQpLCR4bW1cbiI7CisgICAgJGNvZGUuPSIJbW92ZHF1CSV4bW0yLCgkb3V0LCRpbnApXG4iCQlpZiAoJGk9PTApOworICAgICRjb2RlLj0iCWxlYQkxNigkaW5wKSwkaW5wXG4iCQlpZiAoJGk9PTApOworICAgICRjb2RlLj0iCW1vdmwJKCRYWFsxXSksJFRYWzFdI2RcbiIJCWlmICgkaT09MTUpOworfQorCVJDNF9sb29wKC0xKTsKKyRjb2RlLj08PF9fXzsKKwlqbXAJLkxvb3AxNl9lbnRlcgorLmFsaWduCTE2CisuTG9vcDE2OgorX19fCisKK2ZvciAoJGk9MDskaTwxNjskaSsrKSB7CisgICAgJGNvZGUuPSIuTG9vcDE2X2VudGVyOlxuIgkJaWYgKCRpPT0xKTsKKwlSQzRfbG9vcCgkaSk7CisJcHVzaChAVFgsc2hpZnQoQFRYKSk7IAkJIyAicm90YXRlIiByZWdpc3RlcnMKK30KKyRjb2RlLj08PF9fXzsKKwltb3YJJFlZLCRUWFsxXQorCXhvcgkkWVksJFlZCQkJIyBrZXl3b3JkIHRvIHBhcnRpYWwgcmVnaXN0ZXIKKwlzdWIJXCQxNiwkbGVuCisJbW92CSRUWFsxXSNiLCRZWSNiCisJdGVzdAlcJC0xNiwkbGVuCisJam56CS5Mb29wMTYKKworCXBzbGxxCVwkOCwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTIKKwlweG9yCSV4bW0xLCV4bW0yCisJbW92ZHF1CSV4bW0yLCgkb3V0LCRpbnApCisJbGVhCTE2KCRpbnApLCRpbnAKKworCWNtcAlcJDAsJGxlbgorCWpuZQkuTGxvb3AxCisJam1wCS5MZXhpdAorCisuYWxpZ24JMTYKKy5MbG9vcDE6CisJYWRkCSRUWFswXSNiLCRZWSNiCisJbW92bAkoJGRhdCwkWVksNCksJFRZI2QKKwltb3ZsCSRUWFswXSNkLCgkZGF0LCRZWSw0KQorCW1vdmwJJFRZI2QsKCRkYXQsJFhYWzBdLDQpCisJYWRkCSRUWSNiLCRUWFswXSNiCisJaW5jCSRYWFswXSNiCisJbW92bAkoJGRhdCwkVFhbMF0sNCksJFRZI2QKKwltb3ZsCSgkZGF0LCRYWFswXSw0KSwkVFhbMF0jZAorCXhvcmIJKCRpbnApLCRUWSNiCisJbW92YgkkVFkjYiwoJG91dCwkaW5wKQorCWxlYQkxKCRpbnApLCRpbnAKKwlkZWMJJGxlbgorCWpuegkuTGxvb3AxCisJam1wCS5MZXhpdAorCisuYWxpZ24JMTYKKy5MUkM0X0NIQVI6CisJYWRkCVwkMSwkWFhbMF0jYgorCW1vdnpiCSgkZGF0LCRYWFswXSksJFRYWzBdI2QKKwl0ZXN0CVwkLTgsJGxlbgorCWp6CS5MY2xvb3AxCisJam1wCS5MY2xvb3A4CisuYWxpZ24JMTYKKy5MY2xvb3A4OgorCW1vdgkoJGlucCksJXI4ZAorCW1vdgk0KCRpbnApLCVyOWQKK19fXworIyB1bnJvbGwgMng0LXdpc2UsIGJlY2F1c2UgNjQtYml0IHJvdGF0ZXMga2lsbCBJbnRlbCBQNC4uLgorZm9yICgkaT0wOyRpPDQ7JGkrKykgeworJGNvZGUuPTw8X19fOworCWFkZAkkVFhbMF0jYiwkWVkjYgorCWxlYQkxKCRYWFswXSksJFhYWzFdCisJbW92emIJKCRkYXQsJFlZKSwkVFkjZAorCW1vdnpiCSRYWFsxXSNiLCRYWFsxXSNkCisJbW92emIJKCRkYXQsJFhYWzFdKSwkVFhbMV0jZAorCW1vdmIJJFRYWzBdI2IsKCRkYXQsJFlZKQorCWNtcAkkWFhbMV0sJFlZCisJbW92YgkkVFkjYiwoJGRhdCwkWFhbMF0pCisJam5lCS5MY21vdiRpCQkJIyBJbnRlbCBjbW92IGlzIHNsb29vb3cuLi4KKwltb3YJJFRYWzBdLCRUWFsxXQorLkxjbW92JGk6CisJYWRkCSRUWFswXSNiLCRUWSNiCisJeG9yCSgkZGF0LCRUWSksJXI4YgorCXJvcglcJDgsJXI4ZAorX19fCitwdXNoKEBUWCxzaGlmdChAVFgpKTsgcHVzaChAWFgsc2hpZnQoQFhYKSk7CSMgInJvdGF0ZSIgcmVnaXN0ZXJzCit9Citmb3IgKCRpPTQ7JGk8ODskaSsrKSB7CiskY29kZS49PDxfX187CisJYWRkCSRUWFswXSNiLCRZWSNiCisJbGVhCTEoJFhYWzBdKSwkWFhbMV0KKwltb3Z6YgkoJGRhdCwkWVkpLCRUWSNkCisJbW92emIJJFhYWzFdI2IsJFhYWzFdI2QKKwltb3Z6YgkoJGRhdCwkWFhbMV0pLCRUWFsxXSNkCisJbW92YgkkVFhbMF0jYiwoJGRhdCwkWVkpCisJY21wCSRYWFsxXSwkWVkKKwltb3ZiCSRUWSNiLCgkZGF0LCRYWFswXSkKKwlqbmUJLkxjbW92JGkJCQkjIEludGVsIGNtb3YgaXMgc2xvb29vdy4uLgorCW1vdgkkVFhbMF0sJFRYWzFdCisuTGNtb3YkaToKKwlhZGQJJFRYWzBdI2IsJFRZI2IKKwl4b3IJKCRkYXQsJFRZKSwlcjliCisJcm9yCVwkOCwlcjlkCitfX18KK3B1c2goQFRYLHNoaWZ0KEBUWCkpOyBwdXNoKEBYWCxzaGlmdChAWFgpKTsJIyAicm90YXRlIiByZWdpc3RlcnMKK30KKyRjb2RlLj08PF9fXzsKKwlsZWEJLTgoJGxlbiksJGxlbgorCW1vdgklcjhkLCgkb3V0KQorCWxlYQk4KCRpbnApLCRpbnAKKwltb3YJJXI5ZCw0KCRvdXQpCisJbGVhCTgoJG91dCksJG91dAorCisJdGVzdAlcJC04LCRsZW4KKwlqbnoJLkxjbG9vcDgKKwljbXAJXCQwLCRsZW4KKwlqbmUJLkxjbG9vcDEKKwlqbXAJLkxleGl0CitfX18KKyRjb2RlLj08PF9fXzsKKy5hbGlnbgkxNgorLkxjbG9vcDE6CisJYWRkCSRUWFswXSNiLCRZWSNiCisJbW92emIJJFlZI2IsJFlZI2QKKwltb3Z6YgkoJGRhdCwkWVkpLCRUWSNkCisJbW92YgkkVFhbMF0jYiwoJGRhdCwkWVkpCisJbW92YgkkVFkjYiwoJGRhdCwkWFhbMF0pCisJYWRkCSRUWFswXSNiLCRUWSNiCisJYWRkCVwkMSwkWFhbMF0jYgorCW1vdnpiCSRUWSNiLCRUWSNkCisJbW92emIJJFhYWzBdI2IsJFhYWzBdI2QKKwltb3Z6YgkoJGRhdCwkVFkpLCRUWSNkCisJbW92emIJKCRkYXQsJFhYWzBdKSwkVFhbMF0jZAorCXhvcmIJKCRpbnApLCRUWSNiCisJbGVhCTEoJGlucCksJGlucAorCW1vdmIJJFRZI2IsKCRvdXQpCisJbGVhCTEoJG91dCksJG91dAorCXN1YglcJDEsJGxlbgorCWpuegkuTGNsb29wMQorCWptcAkuTGV4aXQKKworLmFsaWduCTE2CisuTGV4aXQ6CisJc3ViCVwkMSwkWFhbMF0jYgorCW1vdmwJJFhYWzBdI2QsLTgoJGRhdCkKKwltb3ZsCSRZWSNkLC00KCRkYXQpCisKKwltb3YJKCVyc3ApLCVyMTMKKwltb3YJOCglcnNwKSwlcjEyCisJbW92CTE2KCVyc3ApLCVyYngKKwlhZGQJXCQyNCwlcnNwCisuTGVwaWxvZ3VlOgorCXJldAorLnNpemUJUkM0LC4tUkM0CitfX18KK30KKworJGlkeD0iJXI4IjsKKyRpZG89IiVyOSI7CisKKyRjb2RlLj08PF9fXzsKKy5nbG9ibAlSQzRfc2V0X2tleQorLnR5cGUJUkM0X3NldF9rZXksXEBmdW5jdGlvbiwzCisuYWxpZ24JMTYKK1JDNF9zZXRfa2V5OgorCWxlYQk4KCRkYXQpLCRkYXQKKwlsZWEJKCRpbnAsJGxlbiksJGlucAorCW5lZwkkbGVuCisJbW92CSRsZW4sJXJjeAorCXhvcgklZWF4LCVlYXgKKwl4b3IJJGlkbywkaWRvCisJeG9yCSVyMTAsJXIxMAorCXhvcgklcjExLCVyMTEKKworCW1vdglPUEVOU1NMX2lhMzJjYXBfUCglcmlwKSwkaWR4I2QKKwlidAlcJDIwLCRpZHgjZAkjIFJDNF9DSEFSPworCWpjCS5MYzFzdGxvb3AKKwlqbXAJLkx3MXN0bG9vcAorCisuYWxpZ24JMTYKKy5MdzFzdGxvb3A6CisJbW92CSVlYXgsKCRkYXQsJXJheCw0KQorCWFkZAlcJDEsJWFsCisJam5jCS5MdzFzdGxvb3AKKworCXhvcgkkaWRvLCRpZG8KKwl4b3IJJGlkeCwkaWR4CisuYWxpZ24JMTYKKy5MdzJuZGxvb3A6CisJbW92CSgkZGF0LCRpZG8sNCksJXIxMGQKKwlhZGQJKCRpbnAsJGxlbiwxKSwkaWR4I2IKKwlhZGQJJXIxMGIsJGlkeCNiCisJYWRkCVwkMSwkbGVuCisJbW92CSgkZGF0LCRpZHgsNCksJXIxMWQKKwljbW92egklcmN4LCRsZW4KKwltb3YJJXIxMGQsKCRkYXQsJGlkeCw0KQorCW1vdgklcjExZCwoJGRhdCwkaWRvLDQpCisJYWRkCVwkMSwkaWRvI2IKKwlqbmMJLkx3Mm5kbG9vcAorCWptcAkuTGV4aXRfa2V5CisKKy5hbGlnbgkxNgorLkxjMXN0bG9vcDoKKwltb3YJJWFsLCgkZGF0LCVyYXgpCisJYWRkCVwkMSwlYWwKKwlqbmMJLkxjMXN0bG9vcAorCisJeG9yCSRpZG8sJGlkbworCXhvcgkkaWR4LCRpZHgKKy5hbGlnbgkxNgorLkxjMm5kbG9vcDoKKwltb3YJKCRkYXQsJGlkbyksJXIxMGIKKwlhZGQJKCRpbnAsJGxlbiksJGlkeCNiCisJYWRkCSVyMTBiLCRpZHgjYgorCWFkZAlcJDEsJGxlbgorCW1vdgkoJGRhdCwkaWR4KSwlcjExYgorCWpuegkuTGNub3dyYXAKKwltb3YJJXJjeCwkbGVuCisuTGNub3dyYXA6CisJbW92CSVyMTBiLCgkZGF0LCRpZHgpCisJbW92CSVyMTFiLCgkZGF0LCRpZG8pCisJYWRkCVwkMSwkaWRvI2IKKwlqbmMJLkxjMm5kbG9vcAorCW1vdmwJXCQtMSwyNTYoJGRhdCkKKworLmFsaWduCTE2CisuTGV4aXRfa2V5OgorCXhvcgklZWF4LCVlYXgKKwltb3YJJWVheCwtOCgkZGF0KQorCW1vdgklZWF4LC00KCRkYXQpCisJcmV0Cisuc2l6ZQlSQzRfc2V0X2tleSwuLVJDNF9zZXRfa2V5CisKKy5nbG9ibAlSQzRfb3B0aW9ucworLnR5cGUJUkM0X29wdGlvbnMsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2CitSQzRfb3B0aW9uczoKKwlsZWEJLkxvcHRzKCVyaXApLCVyYXgKKwltb3YJT1BFTlNTTF9pYTMyY2FwX1AoJXJpcCksJWVkeAorCWJ0CVwkMjAsJWVkeAorCWpjCS5MOHhjaGFyCisJYnQJXCQzMCwlZWR4CisJam5jCS5MZG9uZQorCWFkZAlcJDI1LCVyYXgKKwlyZXQKKy5MOHhjaGFyOgorCWFkZAlcJDEyLCVyYXgKKy5MZG9uZToKKwlyZXQKKy5hbGlnbgk2NAorLkxvcHRzOgorLmFzY2l6CSJyYzQoOHgsaW50KSIKKy5hc2NpegkicmM0KDh4LGNoYXIpIgorLmFzY2l6CSJyYzQoMTZ4LGludCkiCisuYXNjaXoJIlJDNCBmb3IgeDg2XzY0LCBDUllQVE9HQU1TIGJ5IDxhcHByb1xAb3BlbnNzbC5vcmc+IgorLmFsaWduCTY0Cisuc2l6ZQlSQzRfb3B0aW9ucywuLVJDNF9vcHRpb25zCitfX18KKworIyBFWENFUFRJT05fRElTUE9TSVRJT04gaGFuZGxlciAoRVhDRVBUSU9OX1JFQ09SRCAqcmVjLFVMT05HNjQgZnJhbWUsCisjCQlDT05URVhUICpjb250ZXh0LERJU1BBVENIRVJfQ09OVEVYVCAqZGlzcCkKK2lmICgkd2luNjQpIHsKKyRyZWM9IiVyY3giOworJGZyYW1lPSIlcmR4IjsKKyRjb250ZXh0PSIlcjgiOworJGRpc3A9IiVyOSI7CisKKyRjb2RlLj08PF9fXzsKKy5leHRlcm4JX19pbXBfUnRsVmlydHVhbFVud2luZAorLnR5cGUJc3RyZWFtX3NlX2hhbmRsZXIsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2CitzdHJlYW1fc2VfaGFuZGxlcjoKKwlwdXNoCSVyc2kKKwlwdXNoCSVyZGkKKwlwdXNoCSVyYngKKwlwdXNoCSVyYnAKKwlwdXNoCSVyMTIKKwlwdXNoCSVyMTMKKwlwdXNoCSVyMTQKKwlwdXNoCSVyMTUKKwlwdXNoZnEKKwlzdWIJXCQ2NCwlcnNwCisKKwltb3YJMTIwKCRjb250ZXh0KSwlcmF4CSMgcHVsbCBjb250ZXh0LT5SYXgKKwltb3YJMjQ4KCRjb250ZXh0KSwlcmJ4CSMgcHVsbCBjb250ZXh0LT5SaXAKKworCWxlYQkuTHByb2xvZ3VlKCVyaXApLCVyMTAKKwljbXAJJXIxMCwlcmJ4CQkjIGNvbnRleHQtPlJpcDxwcm9sb2d1ZSBsYWJlbAorCWpiCS5MaW5fcHJvbG9ndWUKKworCW1vdgkxNTIoJGNvbnRleHQpLCVyYXgJIyBwdWxsIGNvbnRleHQtPlJzcAorCisJbGVhCS5MZXBpbG9ndWUoJXJpcCksJXIxMAorCWNtcAklcjEwLCVyYngJCSMgY29udGV4dC0+UmlwPj1lcGlsb2d1ZSBsYWJlbAorCWphZQkuTGluX3Byb2xvZ3VlCisKKwlsZWEJMjQoJXJheCksJXJheAorCisJbW92CS04KCVyYXgpLCVyYngKKwltb3YJLTE2KCVyYXgpLCVyMTIKKwltb3YJLTI0KCVyYXgpLCVyMTMKKwltb3YJJXJieCwxNDQoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SYngKKwltb3YJJXIxMiwyMTYoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SMTIKKwltb3YJJXIxMywyMjQoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SMTMKKworLkxpbl9wcm9sb2d1ZToKKwltb3YJOCglcmF4KSwlcmRpCisJbW92CTE2KCVyYXgpLCVyc2kKKwltb3YJJXJheCwxNTIoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5Sc3AKKwltb3YJJXJzaSwxNjgoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5Sc2kKKwltb3YJJXJkaSwxNzYoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SZGkKKworCWptcAkuTGNvbW1vbl9zZWhfZXhpdAorLnNpemUJc3RyZWFtX3NlX2hhbmRsZXIsLi1zdHJlYW1fc2VfaGFuZGxlcgorCisudHlwZQlrZXlfc2VfaGFuZGxlcixcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMTYKK2tleV9zZV9oYW5kbGVyOgorCXB1c2gJJXJzaQorCXB1c2gJJXJkaQorCXB1c2gJJXJieAorCXB1c2gJJXJicAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCXB1c2gJJXIxNQorCXB1c2hmcQorCXN1YglcJDY0LCVyc3AKKworCW1vdgkxNTIoJGNvbnRleHQpLCVyYXgJIyBwdWxsIGNvbnRleHQtPlJzcAorCW1vdgk4KCVyYXgpLCVyZGkKKwltb3YJMTYoJXJheCksJXJzaQorCW1vdgklcnNpLDE2OCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJzaQorCW1vdgklcmRpLDE3NigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJkaQorCisuTGNvbW1vbl9zZWhfZXhpdDoKKworCW1vdgk0MCgkZGlzcCksJXJkaQkJIyBkaXNwLT5Db250ZXh0UmVjb3JkCisJbW92CSRjb250ZXh0LCVyc2kJCSMgY29udGV4dAorCW1vdglcJDE1NCwlZWN4CQkjIHNpemVvZihDT05URVhUKQorCS5sb25nCTB4YTU0OGYzZmMJCSMgY2xkOyByZXAgbW92c3EKKworCW1vdgkkZGlzcCwlcnNpCisJeG9yCSVyY3gsJXJjeAkJIyBhcmcxLCBVTldfRkxBR19OSEFORExFUgorCW1vdgk4KCVyc2kpLCVyZHgJCSMgYXJnMiwgZGlzcC0+SW1hZ2VCYXNlCisJbW92CTAoJXJzaSksJXI4CQkjIGFyZzMsIGRpc3AtPkNvbnRyb2xQYworCW1vdgkxNiglcnNpKSwlcjkJCSMgYXJnNCwgZGlzcC0+RnVuY3Rpb25FbnRyeQorCW1vdgk0MCglcnNpKSwlcjEwCQkjIGRpc3AtPkNvbnRleHRSZWNvcmQKKwlsZWEJNTYoJXJzaSksJXIxMQkJIyAmZGlzcC0+SGFuZGxlckRhdGEKKwlsZWEJMjQoJXJzaSksJXIxMgkJIyAmZGlzcC0+RXN0YWJsaXNoZXJGcmFtZQorCW1vdgklcjEwLDMyKCVyc3ApCQkjIGFyZzUKKwltb3YJJXIxMSw0MCglcnNwKQkJIyBhcmc2CisJbW92CSVyMTIsNDgoJXJzcCkJCSMgYXJnNworCW1vdgklcmN4LDU2KCVyc3ApCQkjIGFyZzgsIChOVUxMKQorCWNhbGwJKl9faW1wX1J0bFZpcnR1YWxVbndpbmQoJXJpcCkKKworCW1vdglcJDEsJWVheAkJIyBFeGNlcHRpb25Db250aW51ZVNlYXJjaAorCWFkZAlcJDY0LCVyc3AKKwlwb3BmcQorCXBvcAklcjE1CisJcG9wCSVyMTQKKwlwb3AJJXIxMworCXBvcAklcjEyCisJcG9wCSVyYnAKKwlwb3AJJXJieAorCXBvcAklcmRpCisJcG9wCSVyc2kKKwlyZXQKKy5zaXplCWtleV9zZV9oYW5kbGVyLC4ta2V5X3NlX2hhbmRsZXIKKworLnNlY3Rpb24JLnBkYXRhCisuYWxpZ24JNAorCS5ydmEJLkxTRUhfYmVnaW5fUkM0CisJLnJ2YQkuTFNFSF9lbmRfUkM0CisJLnJ2YQkuTFNFSF9pbmZvX1JDNAorCisJLnJ2YQkuTFNFSF9iZWdpbl9SQzRfc2V0X2tleQorCS5ydmEJLkxTRUhfZW5kX1JDNF9zZXRfa2V5CisJLnJ2YQkuTFNFSF9pbmZvX1JDNF9zZXRfa2V5CisKKy5zZWN0aW9uCS54ZGF0YQorLmFsaWduCTgKKy5MU0VIX2luZm9fUkM0OgorCS5ieXRlCTksMCwwLDAKKwkucnZhCXN0cmVhbV9zZV9oYW5kbGVyCisuTFNFSF9pbmZvX1JDNF9zZXRfa2V5OgorCS5ieXRlCTksMCwwLDAKKwkucnZhCWtleV9zZV9oYW5kbGVyCitfX18KK30KKworc3ViIHJlZ19wYXJ0IHsKK215ICgkcmVnLCRjb252KT1AXzsKKyAgICBpZiAoJHJlZyA9fiAvJXJbMC05XSsvKQl7ICRyZWcgLj0gJGNvbnY7IH0KKyAgICBlbHNpZiAoJGNvbnYgZXEgImIiKQl7ICRyZWcgPX4gcy8lW2VyXShbXnhdKyl4Py8lJDFsLzsJfQorICAgIGVsc2lmICgkY29udiBlcSAidyIpCXsgJHJlZyA9fiBzLyVbZXJdKC4rKS8lJDEvOwkJfQorICAgIGVsc2lmICgkY29udiBlcSAiZCIpCXsgJHJlZyA9fiBzLyVbZXJdKC4rKS8lZSQxLzsJCX0KKyAgICByZXR1cm4gJHJlZzsKK30KKworJGNvZGUgPX4gcy8oJVthLXowLTldKykjKFtid2RdKS9yZWdfcGFydCgkMSwkMikvZ2VtOworJGNvZGUgPX4gcy9cYChbXlxgXSopXGAvZXZhbCAkMS9nZW07CisKK3ByaW50ICRjb2RlOworCitjbG9zZSBTVERPVVQ7CmRpZmYgLS1naXQgYS9jcnlwdG8vcmM0L3JjNC5jIGIvY3J5cHRvL3JjNC9yYzQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTNmOTZlCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3JjNC9yYzQuYwpAQCAtMCwwICsxLDM0OCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvcmM0Lmg+CisKKworI2lmIGRlZmluZWQoT1BFTlNTTF9OT19BU00pIHx8IFwKKyAgICAoIWRlZmluZWQoT1BFTlNTTF9YODZfNjQpICYmICFkZWZpbmVkKE9QRU5TU0xfWDg2KSkKKworI2RlZmluZSBSQzRfQ0hVTksgdW5zaWduZWQgbG9uZworI2RlZmluZSBSQzRfSU5UIHVpbnQzMl90CisKKworLyogUkM0IGFzIGltcGxlbWVudGVkIGZyb20gYSBwb3N0aW5nIGZyb20KKyAqIE5ld3Nncm91cHM6IHNjaS5jcnlwdAorICogRnJvbTogc3Rlcm5kYXJrQG5ldGNvbS5jb20gKERhdmlkIFN0ZXJuZGFyaykKKyAqIFN1YmplY3Q6IFJDNCBBbGdvcml0aG0gcmV2ZWFsZWQuCisgKiBNZXNzYWdlLUlEOiA8c3Rlcm5DdktMNEIuSHl5QG5ldGNvbS5jb20+CisgKiBEYXRlOiBXZWQsIDE0IFNlcCAxOTk0IDA2OjM1OjMxIEdNVCAqLworCit2b2lkIFJDNChSQzRfS0VZICprZXksIHNpemVfdCBsZW4sIGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50OF90ICpvdXQpIHsKKyAgcmVnaXN0ZXIgUkM0X0lOVCAqZDsKKyAgcmVnaXN0ZXIgUkM0X0lOVCB4LCB5LCB0eCwgdHk7CisgIHNpemVfdCBpOworCisgIHggPSBrZXktPng7CisgIHkgPSBrZXktPnk7CisgIGQgPSBrZXktPmRhdGE7CisKKyNpZiBkZWZpbmVkKFJDNF9DSFVOSykKKy8qIFRoZSBvcmlnaW5hbCByZWFzb24gZm9yIGltcGxlbWVudGluZyB0aGlzKCopIHdhcyB0aGUgZmFjdCB0aGF0CisgKiBwcmUtMjExNjRhIEFscGhhIENQVXMgZG9uJ3QgaGF2ZSBieXRlIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zCisgKiBhbmQgZS5nLiBhIGJ5dGUgc3RvcmUgaGFzIHRvIGJlIGRvbmUgd2l0aCA2NC1iaXQgbG9hZCwgc2hpZnQsCisgKiBhbmQsIG9yIGFuZCBmaW5hbGx5IDY0LWJpdCBzdG9yZS4gUGVha2luZyBkYXRhIGFuZCBvcGVyYXRpbmcKKyAqIGF0IG5hdHVyYWwgd29yZCBzaXplIG1hZGUgaXQgcG9zc2libGUgdG8gcmVkdWNlIGFtb3VudCBvZgorICogaW5zdHJ1Y3Rpb25zIGFzIHdlbGwgYXMgdG8gcGVyZm9ybSBlYXJseSByZWFkLWFoZWFkIHdpdGhvdXQKKyAqIHN1ZmZlcmluZyBmcm9tIFJBVyAocmVhZC1hZnRlci13cml0ZSkgaGF6YXJkLiBUaGlzIHJlc3VsdGVkCisgKiBpbiB+NDAlKCoqKSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBvbiAyMTA2NCBib3ggd2l0aCBnY2MuCisgKiBCdXQgaXQncyBub3Qgb25seSBBbHBoYSB1c2VycyB3aG8gd2luIGhlcmU6LSkgVGhhbmtzIHRvIHRoZQorICogZWFybHktbi13aWRlIHJlYWQtYWhlYWQgdGhpcyBpbXBsZW1lbnRhdGlvbiBhbHNvIGV4aGliaXRzCisgKiA+NDAlIHNwZWVkLXVwIG9uIFNQQVJDIGFuZCAyMC0zMCUgb24gNjQtYml0IE1JUFMgKGRlcGVuZGluZworICogb24gc2l6ZW9mKFJDNF9JTlQpKS4KKyAqCisgKiAoKikJInRoaXMiIG1lYW5zIGNvZGUgd2hpY2ggcmVjb2duaXplcyB0aGUgY2FzZSB3aGVuIGlucHV0CisgKglhbmQgb3V0cHV0IHBvaW50ZXJzIGFwcGVhciB0byBiZSBhbGlnbmVkIGF0IG5hdHVyYWwgQ1BVCisgKgl3b3JkIGJvdW5kYXJ5CisgKiAoKiopCWkuZS4gYWNjb3JkaW5nIHRvICdhcHBzL29wZW5zc2wgc3BlZWQgcmM0JyBiZW5jaG1hcmssCisgKgljcnlwdG8vcmM0L3JjNHNwZWVkLmMgZXhoaWJpdHMgYWxtb3N0IDcwJSBzcGVlZC11cC4uLgorICoKKyAqIENhdmV0cy4KKyAqCisgKiAtIFJDNF9DSFVOSz0idW5zaWduZWQgbG9uZyBsb25nIiBzaG91bGQgYmUgYSAjMSBjaG9pY2UgZm9yCisgKiAgIFVsdHJhU1BBUkMuIFVuZm9ydHVuYXRlbHkgZ2NjIGdlbmVyYXRlcyB2ZXJ5IHNsb3cgY29kZQorICogICAoMi41LTMgdGltZXMgc2xvd2VyIHRoYW4gb25lIGdlbmVyYXRlZCBieSBTdW4ncyBXb3JrU2hvcAorICogICBDKSBhbmQgdGhlcmVmb3JlIGdjYyAoYXQgbGVhc3QgMi45NSBhbmQgZWFybGllcikgc2hvdWxkCisgKiAgIGFsd2F5cyBiZSB0b2xkIHRoYXQgUkM0X0NIVU5LPSJ1bnNpZ25lZCBsb25nIi4KKyAqCisgKgkJCQkJPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiAqLworCisjZGVmaW5lIFJDNF9TVEVQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKHggPSAoeCArIDEpICYgMHhmZiwgdHggPSBkW3hdLCB5ID0gKHR4ICsgeSkgJiAweGZmLCB0eSA9IGRbeV0sIGRbeV0gPSB0eCwgXAorICAgZFt4XSA9IHR5LCAoUkM0X0NIVU5LKWRbKHR4ICsgdHkpICYgMHhmZl0pCisKKyAgaWYgKCgoKHNpemVfdClpbiAmIChzaXplb2YoUkM0X0NIVU5LKSAtIDEpKSB8CisgICAgICAgKChzaXplX3Qpb3V0ICYgKHNpemVvZihSQzRfQ0hVTkspIC0gMSkpKSA9PSAwKSB7CisgICAgUkM0X0NIVU5LIGljaHVuaywgb3RwOworICAgIGNvbnN0IHVuaW9uIHsKKyAgICAgIGxvbmcgb25lOworICAgICAgY2hhciBsaXR0bGU7CisgICAgfSBpc19lbmRpYW4gPSB7MX07CisKKyAgICAvKiBJIHJlY2tvbiB3ZSBjYW4gYWZmb3JkIHRvIGltcGxlbWVudCBib3RoIGVuZGlhbgorICAgICAqIGNhc2VzIGFuZCB0byBkZWNpZGUgd2hpY2ggd2F5IHRvIHRha2UgYXQgcnVuLXRpbWUKKyAgICAgKiBiZWNhdXNlIHRoZSBtYWNoaW5lIGNvZGUgYXBwZWFycyB0byBiZSB2ZXJ5IGNvbXBhY3QKKyAgICAgKiBhbmQgcmVkdW5kYW50IDEtMktCIGlzIHBlcmZlY3RseSB0b2xlcmFibGUgKGkuZS4KKyAgICAgKiBpbiBjYXNlIHRoZSBjb21waWxlciBmYWlscyB0byBlbGltaW5hdGUgaXQ6LSkuIEJ5CisgICAgICogc3VnZ2VzdGlvbiBmcm9tIFRlcnJlbCBMYXJzb24gPHRlcnJAdGVycmFsb2dpYy5uZXQ+CisgICAgICogd2hvIGFsc28gc3RhbmRzIGZvciB0aGUgaXNfZW5kaWFuIHVuaW9uOi0pCisgICAgICoKKyAgICAgKiBTcGVjaWFsIG5vdGVzLgorICAgICAqCisgICAgICogLSBpc19lbmRpYW4gaXMgZGVjbGFyZWQgYXV0b21hdGljIGFzIGRvaW5nIG90aGVyd2lzZQorICAgICAqICAgKGRlY2xhcmluZyBzdGF0aWMpIHByZXZlbnRzIGdjYyBmcm9tIGVsaW1pbmF0aW5nCisgICAgICogICB0aGUgcmVkdW5kYW50IGNvZGU7CisgICAgICogLSBjb21waWxlcnMgKHRob3NlIEkndmUgdHJpZWQpIGRvbid0IHNlZW0gdG8gaGF2ZQorICAgICAqICAgcHJvYmxlbXMgZWxpbWluYXRpbmcgZWl0aGVyIHRoZSBvcGVyYXRvcnMgZ3VhcmRlZAorICAgICAqICAgYnkgImlmIChzaXplb2YoUkM0X0NIVU5LKT09OCkiIG9yIHRoZSBjb25kaXRpb24KKyAgICAgKiAgIGV4cHJlc3Npb25zIHRoZW1zZWx2ZXMgc28gSSd2ZSBnb3QgJ2VtIHRvIHJlcGxhY2UKKyAgICAgKiAgIGNvcnJlc3BvbmRpbmcgI2lmZGVmcyBmcm9tIHRoZSBwcmV2aW91cyB2ZXJzaW9uOworICAgICAqIC0gSSBjaG9zZSB0byBsZXQgdGhlIHJlZHVuZGFudCBzd2l0Y2ggY2FzZXMgd2hlbgorICAgICAqICAgc2l6ZW9mKFJDNF9DSFVOSykhPTggYmUgKHdlcmUgYWxzbyAjaWZkZWZlZAorICAgICAqICAgYmVmb3JlKTsKKyAgICAgKiAtIGluIGNhc2UgeW91IHdvbmRlciAiJihzaXplb2YoUkM0X0NIVU5LKSo4LTEpIiBpbgorICAgICAqICAgW0xCXUVTSEZUIGd1YXJkcyBhZ2FpbnN0ICJzaGlmdCBpcyBvdXQgb2YgcmFuZ2UiCisgICAgICogICB3YXJuaW5ncyB3aGVuIHNpemVvZihSQzRfQ0hVTkspIT04CisgICAgICoKKyAgICAgKgkJCTxhcHByb0BmeS5jaGFsbWVycy5zZT4gKi8KKyAgICBpZiAoIWlzX2VuZGlhbi5saXR0bGUpIHsgLyogQklHLUVORElBTiBDQVNFICovCisjZGVmaW5lIEJFU0hGVChjKSBcCisgICgoKHNpemVvZihSQzRfQ0hVTkspIC0gKGMpIC0gMSkgKiA4KSAmIChzaXplb2YoUkM0X0NIVU5LKSAqIDggLSAxKSkKKyAgICAgIGZvciAoOyBsZW4gJiAoMCAtIHNpemVvZihSQzRfQ0hVTkspKTsgbGVuIC09IHNpemVvZihSQzRfQ0hVTkspKSB7CisgICAgICAgIGljaHVuayA9ICooUkM0X0NIVU5LICopaW47CisgICAgICAgIG90cCA9IFJDNF9TVEVQIDw8IEJFU0hGVCgwKTsKKyAgICAgICAgb3RwIHw9IFJDNF9TVEVQIDw8IEJFU0hGVCgxKTsKKyAgICAgICAgb3RwIHw9IFJDNF9TVEVQIDw8IEJFU0hGVCgyKTsKKyAgICAgICAgb3RwIHw9IFJDNF9TVEVQIDw8IEJFU0hGVCgzKTsKKyAgICAgICAgaWYgKHNpemVvZihSQzRfQ0hVTkspID09IDgpIHsKKyAgICAgICAgICBvdHAgfD0gUkM0X1NURVAgPDwgQkVTSEZUKDQpOworICAgICAgICAgIG90cCB8PSBSQzRfU1RFUCA8PCBCRVNIRlQoNSk7CisgICAgICAgICAgb3RwIHw9IFJDNF9TVEVQIDw8IEJFU0hGVCg2KTsKKyAgICAgICAgICBvdHAgfD0gUkM0X1NURVAgPDwgQkVTSEZUKDcpOworICAgICAgICB9CisgICAgICAgICooUkM0X0NIVU5LICopb3V0ID0gb3RwIF4gaWNodW5rOworICAgICAgICBpbiArPSBzaXplb2YoUkM0X0NIVU5LKTsKKyAgICAgICAgb3V0ICs9IHNpemVvZihSQzRfQ0hVTkspOworICAgICAgfQorICAgICAgaWYgKGxlbikgeworICAgICAgICBSQzRfQ0hVTksgbWFzayA9IChSQzRfQ0hVTkspIC0gMSwgb2NodW5rOworCisgICAgICAgIGljaHVuayA9ICooUkM0X0NIVU5LICopaW47CisgICAgICAgIG9jaHVuayA9ICooUkM0X0NIVU5LICopb3V0OworICAgICAgICBvdHAgPSAwOworICAgICAgICBpID0gQkVTSEZUKDApOworICAgICAgICBtYXNrIDw8PSAoc2l6ZW9mKFJDNF9DSFVOSykgLSBsZW4pIDw8IDM7CisgICAgICAgIHN3aXRjaCAobGVuICYgKHNpemVvZihSQzRfQ0hVTkspIC0gMSkpIHsKKyAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICBvdHAgPSBSQzRfU1RFUCA8PCBpLCBpIC09IDg7CisgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgb3RwIHw9IFJDNF9TVEVQIDw8IGksIGkgLT0gODsKKyAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBvdHAgfD0gUkM0X1NURVAgPDwgaSwgaSAtPSA4OworICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIG90cCB8PSBSQzRfU1RFUCA8PCBpLCBpIC09IDg7CisgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgb3RwIHw9IFJDNF9TVEVQIDw8IGksIGkgLT0gODsKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBvdHAgfD0gUkM0X1NURVAgPDwgaSwgaSAtPSA4OworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIG90cCB8PSBSQzRfU1RFUCA8PCBpLCBpIC09IDg7CisgICAgICAgIH0KKyAgICAgICAgb2NodW5rICY9IH5tYXNrOworICAgICAgICBvY2h1bmsgfD0gKG90cCBeIGljaHVuaykgJiBtYXNrOworICAgICAgICAqKFJDNF9DSFVOSyAqKW91dCA9IG9jaHVuazsKKyAgICAgIH0KKyAgICAgIGtleS0+eCA9IHg7CisgICAgICBrZXktPnkgPSB5OworICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7IC8qIExJVFRMRS1FTkRJQU4gQ0FTRSAqLworI2RlZmluZSBMRVNIRlQoYykgKCgoYykgKiA4KSAmIChzaXplb2YoUkM0X0NIVU5LKSAqIDggLSAxKSkKKyAgICAgIGZvciAoOyBsZW4gJiAoMCAtIHNpemVvZihSQzRfQ0hVTkspKTsgbGVuIC09IHNpemVvZihSQzRfQ0hVTkspKSB7CisgICAgICAgIGljaHVuayA9ICooUkM0X0NIVU5LICopaW47CisgICAgICAgIG90cCA9IFJDNF9TVEVQOworICAgICAgICBvdHAgfD0gUkM0X1NURVAgPDwgODsKKyAgICAgICAgb3RwIHw9IFJDNF9TVEVQIDw8IDE2OworICAgICAgICBvdHAgfD0gUkM0X1NURVAgPDwgMjQ7CisgICAgICAgIGlmIChzaXplb2YoUkM0X0NIVU5LKSA9PSA4KSB7CisgICAgICAgICAgb3RwIHw9IFJDNF9TVEVQIDw8IExFU0hGVCg0KTsKKyAgICAgICAgICBvdHAgfD0gUkM0X1NURVAgPDwgTEVTSEZUKDUpOworICAgICAgICAgIG90cCB8PSBSQzRfU1RFUCA8PCBMRVNIRlQoNik7CisgICAgICAgICAgb3RwIHw9IFJDNF9TVEVQIDw8IExFU0hGVCg3KTsKKyAgICAgICAgfQorICAgICAgICAqKFJDNF9DSFVOSyAqKW91dCA9IG90cCBeIGljaHVuazsKKyAgICAgICAgaW4gKz0gc2l6ZW9mKFJDNF9DSFVOSyk7CisgICAgICAgIG91dCArPSBzaXplb2YoUkM0X0NIVU5LKTsKKyAgICAgIH0KKyAgICAgIGlmIChsZW4pIHsKKyAgICAgICAgUkM0X0NIVU5LIG1hc2sgPSAoUkM0X0NIVU5LKSAtIDEsIG9jaHVuazsKKworICAgICAgICBpY2h1bmsgPSAqKFJDNF9DSFVOSyAqKWluOworICAgICAgICBvY2h1bmsgPSAqKFJDNF9DSFVOSyAqKW91dDsKKyAgICAgICAgb3RwID0gMDsKKyAgICAgICAgaSA9IDA7CisgICAgICAgIG1hc2sgPj49IChzaXplb2YoUkM0X0NIVU5LKSAtIGxlbikgPDwgMzsKKyAgICAgICAgc3dpdGNoIChsZW4gJiAoc2l6ZW9mKFJDNF9DSFVOSykgLSAxKSkgeworICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIG90cCA9IFJDNF9TVEVQLCBpICs9IDg7CisgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgb3RwIHw9IFJDNF9TVEVQIDw8IGksIGkgKz0gODsKKyAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBvdHAgfD0gUkM0X1NURVAgPDwgaSwgaSArPSA4OworICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIG90cCB8PSBSQzRfU1RFUCA8PCBpLCBpICs9IDg7CisgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgb3RwIHw9IFJDNF9TVEVQIDw8IGksIGkgKz0gODsKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBvdHAgfD0gUkM0X1NURVAgPDwgaSwgaSArPSA4OworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIG90cCB8PSBSQzRfU1RFUCA8PCBpLCBpICs9IDg7CisgICAgICAgIH0KKyAgICAgICAgb2NodW5rICY9IH5tYXNrOworICAgICAgICBvY2h1bmsgfD0gKG90cCBeIGljaHVuaykgJiBtYXNrOworICAgICAgICAqKFJDNF9DSFVOSyAqKW91dCA9IG9jaHVuazsKKyAgICAgIH0KKyAgICAgIGtleS0+eCA9IHg7CisgICAgICBrZXktPnkgPSB5OworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorI2VuZGlmCisjZGVmaW5lIExPT1AoaW4sIG91dCkgICBcCisgIHggPSAoKHggKyAxKSAmIDB4ZmYpOyBcCisgIHR4ID0gZFt4XTsgICAgICAgICAgICBcCisgIHkgPSAodHggKyB5KSAmIDB4ZmY7ICBcCisgIGRbeF0gPSB0eSA9IGRbeV07ICAgICBcCisgIGRbeV0gPSB0eDsgICAgICAgICAgICBcCisgIChvdXQpID0gZFsodHggKyB0eSkgJiAweGZmXSBeIChpbik7CisKKyNpZm5kZWYgUkM0X0lOREVYCisjZGVmaW5lIFJDNF9MT09QKGEsIGIsIGkpIExPT1AoKigoYSkrKyksICooKGIpKyspKQorI2Vsc2UKKyNkZWZpbmUgUkM0X0xPT1AoYSwgYiwgaSkgTE9PUChhW2ldLCBiW2ldKQorI2VuZGlmCisKKyAgaSA9IGxlbiA+PiAzOworICBpZiAoaSkgeworICAgIGZvciAoOzspIHsKKyAgICAgIFJDNF9MT09QKGluLCBvdXQsIDApOworICAgICAgUkM0X0xPT1AoaW4sIG91dCwgMSk7CisgICAgICBSQzRfTE9PUChpbiwgb3V0LCAyKTsKKyAgICAgIFJDNF9MT09QKGluLCBvdXQsIDMpOworICAgICAgUkM0X0xPT1AoaW4sIG91dCwgNCk7CisgICAgICBSQzRfTE9PUChpbiwgb3V0LCA1KTsKKyAgICAgIFJDNF9MT09QKGluLCBvdXQsIDYpOworICAgICAgUkM0X0xPT1AoaW4sIG91dCwgNyk7CisjaWZkZWYgUkM0X0lOREVYCisgICAgICBpbiArPSA4OworICAgICAgb3V0ICs9IDg7CisjZW5kaWYKKyAgICAgIGlmICgtLWkgPT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGkgPSBsZW4gJiAweDA3OworICBpZiAoaSkgeworICAgIGZvciAoOzspIHsKKyAgICAgIFJDNF9MT09QKGluLCBvdXQsIDApOworICAgICAgaWYgKC0taSA9PSAwKQorICAgICAgICBicmVhazsKKyAgICAgIFJDNF9MT09QKGluLCBvdXQsIDEpOworICAgICAgaWYgKC0taSA9PSAwKQorICAgICAgICBicmVhazsKKyAgICAgIFJDNF9MT09QKGluLCBvdXQsIDIpOworICAgICAgaWYgKC0taSA9PSAwKQorICAgICAgICBicmVhazsKKyAgICAgIFJDNF9MT09QKGluLCBvdXQsIDMpOworICAgICAgaWYgKC0taSA9PSAwKQorICAgICAgICBicmVhazsKKyAgICAgIFJDNF9MT09QKGluLCBvdXQsIDQpOworICAgICAgaWYgKC0taSA9PSAwKQorICAgICAgICBicmVhazsKKyAgICAgIFJDNF9MT09QKGluLCBvdXQsIDUpOworICAgICAgaWYgKC0taSA9PSAwKQorICAgICAgICBicmVhazsKKyAgICAgIFJDNF9MT09QKGluLCBvdXQsIDYpOworICAgICAgaWYgKC0taSA9PSAwKQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAga2V5LT54ID0geDsKKyAga2V5LT55ID0geTsKK30KKwordm9pZCBSQzRfc2V0X2tleShSQzRfS0VZICpyYzRrZXksIHVuc2lnbmVkIGxlbiwgY29uc3QgdWludDhfdCAqa2V5KSB7CisgIHJlZ2lzdGVyIFJDNF9JTlQgdG1wOworICByZWdpc3RlciBpbnQgaWQxLCBpZDI7CisgIHJlZ2lzdGVyIFJDNF9JTlQgKmQ7CisgIHVuc2lnbmVkIGludCBpOworCisgIGQgPSAmcmM0a2V5LT5kYXRhWzBdOworICByYzRrZXktPnggPSAwOworICByYzRrZXktPnkgPSAwOworICBpZDEgPSBpZDIgPSAwOworCisjZGVmaW5lIFNLX0xPT1AoZCwgbikgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdG1wID0gZFsobildOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWQyID0gKGtleVtpZDFdICsgdG1wICsgaWQyKSAmIDB4ZmY7IFwKKyAgICBpZiAoKytpZDEgPT0gbGVuKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlkMSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkWyhuKV0gPSBkW2lkMl07ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkW2lkMl0gPSB0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgIGRbaV0gPSBpOworICB9CisgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkgKz0gNCkgeworICAgIFNLX0xPT1AoZCwgaSArIDApOworICAgIFNLX0xPT1AoZCwgaSArIDEpOworICAgIFNLX0xPT1AoZCwgaSArIDIpOworICAgIFNLX0xPT1AoZCwgaSArIDMpOworICB9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3J5cHRvL3JjNC9yYzQuaCBiL2NyeXB0by9yYzQvcmM0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI4N2U4YgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9yYzQvcmM0LmgKQEAgLTAsMCArMSw4OCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2lmbmRlZiBPUEVOU1NMX0hFQURFUl9SQzRfSAorI2RlZmluZSBPUEVOU1NMX0hFQURFUl9SQzRfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9iYXNlLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCit0eXBlZGVmIHN0cnVjdCByYzRfa2V5X3N0IHsKKyAgdWludDMyX3QgeCwgeTsKKyAgLyogZGF0YSBpcyBzb21ldGltZXMgdXNlZCBhcyBhbiBhcnJheSBvZiAzMi1iaXQgdmFsdWVzIGFuZCBzb21ldGltZXMgYXMgOC1iaXQKKyAgICogdmFsdWVzLCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtLiAqLworICB1aW50MzJfdCBkYXRhWzI1Nl07Cit9IFJDNF9LRVk7CisKKworLyogUkM0X3NldF9rZXkgcGVyZm9ybXMgYW4gUkM0IGtleSBzY2hlZHVsZSBhbmQgaW5pdGlhbGlzZXMgfHJjNGtleXwgd2l0aCB8bGVufAorICogYnl0ZXMgb2Yga2V5IG1hdGVyaWFsIGZyb20gfGtleXwuICovCit2b2lkIFJDNF9zZXRfa2V5KFJDNF9LRVkgKnJjNGtleSwgdW5zaWduZWQgbGVuLCBjb25zdCB1aW50OF90ICprZXkpOworCisvKiBSQzQgZW5jcnlwdHMgKG9yIGRlY3J5cHRzLCBpdCdzIHRoZSBzYW1lIHdpdGggUkM0KSB8bGVufCBieXRlcyBmcm9tIHxpbnwgdG8KKyAqIHxvdXR8LiAqLwordm9pZCBSQzQoUkM0X0tFWSAqa2V5LCBzaXplX3QgbGVuLCBjb25zdCB1aW50OF90ICppbiwgdWludDhfdCAqb3V0KTsKKworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30gIC8qIGV4dGVybiBDICovCisjZW5kaWYKKworI2VuZGlmICAvKiBPUEVOU1NMX0hFQURFUl9SQzRfSCAqLwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3JzYS9DTWFrZUxpc3RzLnR4dCBiL2NyeXB0by9yc2EvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJlNmM1MAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9yc2EvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwyMiBAQAoraW5jbHVkZV9kaXJlY3RvcmllcyguIC4uIC4uLy4uL2luY2x1ZGUpCisKK2FkZF9saWJyYXJ5KAorCXJzYQorCisJT0JKRUNUCisKKwlyc2EuYworCXJzYV9pbXBsLmMKKwlibGluZGluZy5jCisJcGFkZGluZy5jCisJcnNhX2FzbjEuYworCXJzYV9lcnJvci5jCispCisKK2FkZF9leGVjdXRhYmxlKAorCXJzYV90ZXN0CisKKwlyc2FfdGVzdC5jCispCisKK3RhcmdldF9saW5rX2xpYnJhcmllcyhyc2FfdGVzdCBjcnlwdG8pCmRpZmYgLS1naXQgYS9jcnlwdG8vcnNhL2JsaW5kaW5nLmMgYi9jcnlwdG8vcnNhL2JsaW5kaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRmNjcyYQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9yc2EvYmxpbmRpbmcuYwpAQCAtMCwwICsxLDQ2OCBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9yc2EuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIEJOX0JMSU5ESU5HX0NPVU5URVIgMzIKKworc3RydWN0IGJuX2JsaW5kaW5nX3N0IHsKKyAgQklHTlVNICpBOworICBCSUdOVU0gKkFpOworICBCSUdOVU0gKmU7CisgIEJJR05VTSAqbW9kOyAvKiBqdXN0IGEgcmVmZXJlbmNlICovCisgIENSWVBUT19USFJFQURJRCB0aWQ7CisgIGludCBjb3VudGVyOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworICBCTl9NT05UX0NUWCAqbV9jdHg7CisgIGludCAoKmJuX21vZF9leHApKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKnAsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJJR05VTSAqbSwgQk5fQ1RYICpjdHgsIEJOX01PTlRfQ1RYICptX2N0eCk7Cit9OworCitCTl9CTElORElORyAqQk5fQkxJTkRJTkdfbmV3KGNvbnN0IEJJR05VTSAqQSwgY29uc3QgQklHTlVNICpBaSwgQklHTlVNICptb2QpIHsKKyAgQk5fQkxJTkRJTkcgKnJldCA9IE5VTEw7CisKKyAgcmV0ID0gKEJOX0JMSU5ESU5HKikgT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEJOX0JMSU5ESU5HKSk7CisgIGlmIChyZXQgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgQk5fQkxJTkRJTkdfbmV3LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgbWVtc2V0KHJldCwgMCwgc2l6ZW9mKEJOX0JMSU5ESU5HKSk7CisgIGlmIChBICE9IE5VTEwpIHsKKyAgICByZXQtPkEgPSBCTl9kdXAoQSk7CisgICAgaWYgKHJldC0+QSA9PSBOVUxMKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0KKyAgaWYgKEFpICE9IE5VTEwpIHsKKyAgICByZXQtPkFpID0gQk5fZHVwKEFpKTsKKyAgICBpZiAocmV0LT5BaSA9PSBOVUxMKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0KKworICAvKiBzYXZlIGEgY29weSBvZiBtb2QgaW4gdGhlIEJOX0JMSU5ESU5HIHN0cnVjdHVyZSAqLworICByZXQtPm1vZCA9IEJOX2R1cChtb2QpOworICBpZiAocmV0LT5tb2QgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisgIGlmIChCTl9nZXRfZmxhZ3MobW9kLCBCTl9GTEdfQ09OU1RUSU1FKSAhPSAwKSB7CisgICAgQk5fc2V0X2ZsYWdzKHJldC0+bW9kLCBCTl9GTEdfQ09OU1RUSU1FKTsKKyAgfQorCisgIC8qIFNldCB0aGUgY291bnRlciB0byB0aGUgc3BlY2lhbCB2YWx1ZSAtMQorICAgKiB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgaXMgbmV2ZXItdXNlZCBmcmVzaCBibGluZGluZworICAgKiB0aGF0IGRvZXMgbm90IG5lZWQgdXBkYXRpbmcgYmVmb3JlIGZpcnN0IHVzZS4gKi8KKyAgcmV0LT5jb3VudGVyID0gLTE7CisgIENSWVBUT19USFJFQURJRF9jdXJyZW50KCZyZXQtPnRpZCk7CisgIHJldHVybiByZXQ7CisKK2VycjoKKyAgaWYgKHJldCAhPSBOVUxMKSB7CisgICAgQk5fQkxJTkRJTkdfZnJlZShyZXQpOworICB9CisgIHJldHVybiBOVUxMOworfQorCit2b2lkIEJOX0JMSU5ESU5HX2ZyZWUoQk5fQkxJTkRJTkcgKnIpIHsKKyAgaWYgKHIgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChyLT5BICE9IE5VTEwpCisgICAgQk5fZnJlZShyLT5BKTsKKyAgaWYgKHItPkFpICE9IE5VTEwpCisgICAgQk5fZnJlZShyLT5BaSk7CisgIGlmIChyLT5lICE9IE5VTEwpCisgICAgQk5fZnJlZShyLT5lKTsKKyAgaWYgKHItPm1vZCAhPSBOVUxMKQorICAgIEJOX2ZyZWUoci0+bW9kKTsKKyAgT1BFTlNTTF9mcmVlKHIpOworfQorCitpbnQgQk5fQkxJTkRJTkdfdXBkYXRlKEJOX0JMSU5ESU5HICpiLCBCTl9DVFggKmN0eCkgeworICBpbnQgcmV0ID0gMDsKKworICBpZiAoYi0+QSA9PSBOVUxMIHx8IGItPkFpID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIEJOX0JMSU5ESU5HX3VwZGF0ZSwgUlNBX1JfQk5fTk9UX0lOSVRJQUxJWkVEKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmIChiLT5jb3VudGVyID09IC0xKSB7CisgICAgYi0+Y291bnRlciA9IDA7CisgIH0KKworICBpZiAoKytiLT5jb3VudGVyID09IEJOX0JMSU5ESU5HX0NPVU5URVIgJiYgYi0+ZSAhPSBOVUxMICYmCisgICAgICAhKGItPmZsYWdzICYgQk5fQkxJTkRJTkdfTk9fUkVDUkVBVEUpKSB7CisgICAgLyogcmUtY3JlYXRlIGJsaW5kaW5nIHBhcmFtZXRlcnMgKi8KKyAgICBpZiAoIUJOX0JMSU5ESU5HX2NyZWF0ZV9wYXJhbShiLCBOVUxMLCBOVUxMLCBjdHgsIE5VTEwsIE5VTEwpKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0gZWxzZSBpZiAoIShiLT5mbGFncyAmIEJOX0JMSU5ESU5HX05PX1VQREFURSkpIHsKKyAgICBpZiAoIUJOX21vZF9tdWwoYi0+QSwgYi0+QSwgYi0+QSwgYi0+bW9kLCBjdHgpKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgaWYgKCFCTl9tb2RfbXVsKGItPkFpLCBiLT5BaSwgYi0+QWksIGItPm1vZCwgY3R4KSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICB9CisKKyAgcmV0ID0gMTsKKworZXJyOgorICBpZiAoYi0+Y291bnRlciA9PSBCTl9CTElORElOR19DT1VOVEVSKSB7CisgICAgYi0+Y291bnRlciA9IDA7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworaW50IEJOX0JMSU5ESU5HX2NvbnZlcnQoQklHTlVNICpuLCBCTl9CTElORElORyAqYiwgQk5fQ1RYICpjdHgpIHsKKyAgcmV0dXJuIEJOX0JMSU5ESU5HX2NvbnZlcnRfZXgobiwgTlVMTCwgYiwgY3R4KTsKK30KKworaW50IEJOX0JMSU5ESU5HX2NvbnZlcnRfZXgoQklHTlVNICpuLCBCSUdOVU0gKnIsIEJOX0JMSU5ESU5HICpiLCBCTl9DVFggKmN0eCkgeworICBpbnQgcmV0ID0gMTsKKworICBpZiAoYi0+QSA9PSBOVUxMIHx8IGItPkFpID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIEJOX0JMSU5ESU5HX2NvbnZlcnRfZXgsIFJTQV9SX0JOX05PVF9JTklUSUFMSVpFRCk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoYi0+Y291bnRlciA9PSAtMSkgeworICAgIC8qIEZyZXNoIGJsaW5kaW5nLCBkb2Vzbid0IG5lZWQgdXBkYXRpbmcuICovCisgICAgYi0+Y291bnRlciA9IDA7CisgIH0gZWxzZSBpZiAoIUJOX0JMSU5ESU5HX3VwZGF0ZShiLCBjdHgpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAociAhPSBOVUxMKSB7CisgICAgaWYgKCFCTl9jb3B5KHIsIGItPkFpKSkgeworICAgICAgcmV0ID0gMDsKKyAgICB9CisgIH0KKworICBpZiAoIUJOX21vZF9tdWwobiwgbiwgYi0+QSwgYi0+bW9kLCBjdHgpKSB7CisgICAgcmV0ID0gMDsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK2ludCBCTl9CTElORElOR19pbnZlcnQoQklHTlVNICpuLCBCTl9CTElORElORyAqYiwgQk5fQ1RYICpjdHgpIHsKKyAgcmV0dXJuIEJOX0JMSU5ESU5HX2ludmVydF9leChuLCBOVUxMLCBiLCBjdHgpOworfQorCitpbnQgQk5fQkxJTkRJTkdfaW52ZXJ0X2V4KEJJR05VTSAqbiwgY29uc3QgQklHTlVNICpyLCBCTl9CTElORElORyAqYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk5fQ1RYICpjdHgpIHsKKyAgaW50IHJldDsKKworICBpZiAociAhPSBOVUxMKSB7CisgICAgcmV0ID0gQk5fbW9kX211bChuLCBuLCByLCBiLT5tb2QsIGN0eCk7CisgIH0gZWxzZSB7CisgICAgaWYgKGItPkFpID09IE5VTEwpIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgQk5fQkxJTkRJTkdfaW52ZXJ0X2V4LCBSU0FfUl9CTl9OT1RfSU5JVElBTElaRUQpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldCA9IEJOX21vZF9tdWwobiwgbiwgYi0+QWksIGItPm1vZCwgY3R4KTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK0NSWVBUT19USFJFQURJRCAqQk5fQkxJTkRJTkdfdGhyZWFkX2lkKEJOX0JMSU5ESU5HICpiKSB7IHJldHVybiAmYi0+dGlkOyB9CisKK3Vuc2lnbmVkIGxvbmcgQk5fQkxJTkRJTkdfZ2V0X2ZsYWdzKGNvbnN0IEJOX0JMSU5ESU5HICpiKSB7IHJldHVybiBiLT5mbGFnczsgfQorCit2b2lkIEJOX0JMSU5ESU5HX3NldF9mbGFncyhCTl9CTElORElORyAqYiwgdW5zaWduZWQgbG9uZyBmbGFncykgeworICBiLT5mbGFncyA9IGZsYWdzOworfQorCitCTl9CTElORElORyAqQk5fQkxJTkRJTkdfY3JlYXRlX3BhcmFtKAorICAgIEJOX0JMSU5ESU5HICpiLCBjb25zdCBCSUdOVU0gKmUsIEJJR05VTSAqbSwgQk5fQ1RYICpjdHgsCisgICAgaW50ICgqYm5fbW9kX2V4cCkoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqcCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4LCBCTl9NT05UX0NUWCAqbV9jdHgpLAorICAgIEJOX01PTlRfQ1RYICptX2N0eCkgeworICBpbnQgcmV0cnlfY291bnRlciA9IDMyOworICBCTl9CTElORElORyAqcmV0ID0gTlVMTDsKKworICBpZiAoYiA9PSBOVUxMKSB7CisgICAgcmV0ID0gQk5fQkxJTkRJTkdfbmV3KE5VTEwsIE5VTEwsIG0pOworICB9IGVsc2UgeworICAgIHJldCA9IGI7CisgIH0KKworICBpZiAocmV0ID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmIChyZXQtPkEgPT0gTlVMTCAmJiAocmV0LT5BID0gQk5fbmV3KCkpID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorICBpZiAocmV0LT5BaSA9PSBOVUxMICYmIChyZXQtPkFpID0gQk5fbmV3KCkpID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmIChlICE9IE5VTEwpIHsKKyAgICBpZiAocmV0LT5lICE9IE5VTEwpIHsKKyAgICAgIEJOX2ZyZWUocmV0LT5lKTsKKyAgICB9CisgICAgcmV0LT5lID0gQk5fZHVwKGUpOworICB9CisgIGlmIChyZXQtPmUgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKGJuX21vZF9leHAgIT0gTlVMTCkgeworICAgIHJldC0+Ym5fbW9kX2V4cCA9IGJuX21vZF9leHA7CisgIH0KKyAgaWYgKG1fY3R4ICE9IE5VTEwpIHsKKyAgICByZXQtPm1fY3R4ID0gbV9jdHg7CisgIH0KKworICBkbyB7CisgICAgaWYgKCFCTl9yYW5kX3JhbmdlKHJldC0+QSwgcmV0LT5tb2QpKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgaWYgKEJOX21vZF9pbnZlcnNlKHJldC0+QWksIHJldC0+QSwgcmV0LT5tb2QsIGN0eCkgPT0gTlVMTCkgeworICAgICAgLyogdGhpcyBzaG91bGQgYWxtb3N0IG5ldmVyIGhhcHBlbiBmb3IgZ29vZCBSU0Ega2V5cyAqLworICAgICAgdWludDMyX3QgZXJyb3IgPSBFUlJfcGVla19sYXN0X2Vycm9yKCk7CisgICAgICBpZiAoRVJSX0dFVF9SRUFTT04oZXJyb3IpID09IEJOX1JfTk9fSU5WRVJTRSkgeworICAgICAgICBpZiAocmV0cnlfY291bnRlci0tID09IDApIHsKKyAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIEJOX0JMSU5ESU5HX2NyZWF0ZV9wYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU0FfUl9UT09fTUFOWV9JVEVSQVRJT05TKTsKKyAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgICAgICBFUlJfY2xlYXJfZXJyb3IoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdvdG8gZXJyOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0gd2hpbGUgKDEpOworCisgIGlmIChyZXQtPmJuX21vZF9leHAgIT0gTlVMTCAmJiByZXQtPm1fY3R4ICE9IE5VTEwpIHsKKyAgICBpZiAoIXJldC0+Ym5fbW9kX2V4cChyZXQtPkEsIHJldC0+QSwgcmV0LT5lLCByZXQtPm1vZCwgY3R4LCByZXQtPm1fY3R4KSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmICghQk5fbW9kX2V4cChyZXQtPkEsIHJldC0+QSwgcmV0LT5lLCByZXQtPm1vZCwgY3R4KSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJldDsKKworZXJyOgorICBpZiAoYiA9PSBOVUxMICYmIHJldCAhPSBOVUxMKSB7CisgICAgQk5fQkxJTkRJTkdfZnJlZShyZXQpOworICAgIHJldCA9IE5VTEw7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgQklHTlVNICpyc2FfZ2V0X3B1YmxpY19leHAoY29uc3QgQklHTlVNICpkLCBjb25zdCBCSUdOVU0gKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQklHTlVNICpxLCBCTl9DVFggKmN0eCkgeworICBCSUdOVU0gKnJldCA9IE5VTEwsICpyMCwgKnIxLCAqcjI7CisKKyAgaWYgKGQgPT0gTlVMTCB8fCBwID09IE5VTEwgfHwgcSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBCTl9DVFhfc3RhcnQoY3R4KTsKKyAgcjAgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIHIxID0gQk5fQ1RYX2dldChjdHgpOworICByMiA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgaWYgKHIyID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmICghQk5fc3ViKHIxLCBwLCBCTl92YWx1ZV9vbmUoKSkpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorICBpZiAoIUJOX3N1YihyMiwgcSwgQk5fdmFsdWVfb25lKCkpKSB7CisgICAgZ290byBlcnI7CisgIH0KKyAgaWYgKCFCTl9tdWwocjAsIHIxLCByMiwgY3R4KSkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgcmV0ID0gQk5fbW9kX2ludmVyc2UoTlVMTCwgZCwgcjAsIGN0eCk7CisKK2VycjoKKyAgQk5fQ1RYX2VuZChjdHgpOworICByZXR1cm4gcmV0OworfQorCitCTl9CTElORElORyAqcnNhX3NldHVwX2JsaW5kaW5nKFJTQSAqcnNhLCBCTl9DVFggKmluX2N0eCkgeworICBCSUdOVU0gbG9jYWxfbjsKKyAgQklHTlVNICplLCAqbjsKKyAgQk5fQ1RYICpjdHg7CisgIEJOX0JMSU5ESU5HICpyZXQgPSBOVUxMOworCisgIGlmIChpbl9jdHggPT0gTlVMTCkgeworICAgIGN0eCA9IEJOX0NUWF9uZXcoKTsKKyAgICBpZiAoY3R4ID09IE5VTEwpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBjdHggPSBpbl9jdHg7CisgIH0KKworICBCTl9DVFhfc3RhcnQoY3R4KTsKKyAgZSA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgaWYgKGUgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgcnNhX3NldHVwX2JsaW5kaW5nLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAocnNhLT5lID09IE5VTEwpIHsKKyAgICBlID0gcnNhX2dldF9wdWJsaWNfZXhwKHJzYS0+ZCwgcnNhLT5wLCByc2EtPnEsIGN0eCk7CisgICAgaWYgKGUgPT0gTlVMTCkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCByc2Ffc2V0dXBfYmxpbmRpbmcsIFJTQV9SX05PX1BVQkxJQ19FWFBPTkVOVCk7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZSA9IHJzYS0+ZTsKKyAgfQorCisgIG4gPSAmbG9jYWxfbjsKKyAgQk5fd2l0aF9mbGFncyhuLCByc2EtPm4sIEJOX0ZMR19DT05TVFRJTUUpOworCisgIGlmIChyc2EtPmZsYWdzICYgUlNBX0ZMQUdfQ0FDSEVfUFVCTElDKSB7CisgICAgaWYgKCFCTl9NT05UX0NUWF9zZXRfbG9ja2VkKCZyc2EtPl9tZXRob2RfbW9kX24sIENSWVBUT19MT0NLX1JTQSwgcnNhLT5uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgpKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0KKworICByZXQgPSBCTl9CTElORElOR19jcmVhdGVfcGFyYW0oTlVMTCwgZSwgbiwgY3R4LCByc2EtPm1ldGgtPmJuX21vZF9leHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByc2EtPl9tZXRob2RfbW9kX24pOworICBpZiAocmV0ID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIHJzYV9zZXR1cF9ibGluZGluZywgRVJSX1JfQk5fTElCKTsKKyAgICBnb3RvIGVycjsKKyAgfQorICBDUllQVE9fVEhSRUFESURfY3VycmVudChCTl9CTElORElOR190aHJlYWRfaWQocmV0KSk7CisKK2VycjoKKyAgQk5fQ1RYX2VuZChjdHgpOworICBpZiAoaW5fY3R4ID09IE5VTEwpIHsKKyAgICBCTl9DVFhfZnJlZShjdHgpOworICB9CisgIGlmIChyc2EtPmUgPT0gTlVMTCkgeworICAgIEJOX2ZyZWUoZSk7CisgIH0KKworICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3JzYS9pbnRlcm5hbC5oIGIvY3J5cHRvL3JzYS9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2OTc5NDAKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vcnNhL2ludGVybmFsLmgKQEAgLTAsMCArMSwxNTcgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpZm5kZWYgT1BFTlNTTF9IRUFERVJfUlNBX0lOVEVSTkFMX0gKKyNkZWZpbmUgT1BFTlNTTF9IRUFERVJfUlNBX0lOVEVSTkFMX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvYmFzZS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC90aHJlYWQuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKyNkZWZpbmUgUlNBX1BLQ1MxX1BBRERJTkdfU0laRSAxMQorCisKKy8qIEJOX0JMSU5ESU5HIGZsYWdzICovCisjZGVmaW5lIEJOX0JMSU5ESU5HX05PX1VQREFURSAweDAwMDAwMDAxCisjZGVmaW5lIEJOX0JMSU5ESU5HX05PX1JFQ1JFQVRFIDB4MDAwMDAwMDIKKworQk5fQkxJTkRJTkcgKkJOX0JMSU5ESU5HX25ldyhjb25zdCBCSUdOVU0gKkEsIGNvbnN0IEJJR05VTSAqQWksIEJJR05VTSAqbW9kKTsKK3ZvaWQgQk5fQkxJTkRJTkdfZnJlZShCTl9CTElORElORyAqYik7CitpbnQgQk5fQkxJTkRJTkdfdXBkYXRlKEJOX0JMSU5ESU5HICpiLCBCTl9DVFggKmN0eCk7CitpbnQgQk5fQkxJTkRJTkdfY29udmVydChCSUdOVU0gKm4sIEJOX0JMSU5ESU5HICpiLCBCTl9DVFggKmN0eCk7CitpbnQgQk5fQkxJTkRJTkdfaW52ZXJ0KEJJR05VTSAqbiwgQk5fQkxJTkRJTkcgKmIsIEJOX0NUWCAqY3R4KTsKK2ludCBCTl9CTElORElOR19jb252ZXJ0X2V4KEJJR05VTSAqbiwgQklHTlVNICpyLCBCTl9CTElORElORyAqYiwgQk5fQ1RYICopOworaW50IEJOX0JMSU5ESU5HX2ludmVydF9leChCSUdOVU0gKm4sIGNvbnN0IEJJR05VTSAqciwgQk5fQkxJTkRJTkcgKmIsIEJOX0NUWCAqKTsKK0NSWVBUT19USFJFQURJRCAqQk5fQkxJTkRJTkdfdGhyZWFkX2lkKEJOX0JMSU5ESU5HICopOwordW5zaWduZWQgbG9uZyBCTl9CTElORElOR19nZXRfZmxhZ3MoY29uc3QgQk5fQkxJTkRJTkcgKik7Cit2b2lkIEJOX0JMSU5ESU5HX3NldF9mbGFncyhCTl9CTElORElORyAqLCB1bnNpZ25lZCBsb25nKTsKK0JOX0JMSU5ESU5HICpCTl9CTElORElOR19jcmVhdGVfcGFyYW0oCisgICAgQk5fQkxJTkRJTkcgKmIsIGNvbnN0IEJJR05VTSAqZSwgQklHTlVNICptLCBCTl9DVFggKmN0eCwKKyAgICBpbnQgKCpibl9tb2RfZXhwKShCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpwLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJJR05VTSAqbSwgQk5fQ1RYICpjdHgsIEJOX01PTlRfQ1RYICptX2N0eCksCisgICAgQk5fTU9OVF9DVFggKm1fY3R4KTsKK0JOX0JMSU5ESU5HICpyc2Ffc2V0dXBfYmxpbmRpbmcoUlNBICpyc2EsIEJOX0NUWCAqaW5fY3R4KTsKKworCitpbnQgUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX3R5cGVfMSh1aW50OF90ICp0bywgdW5zaWduZWQgdG9fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZnJvbSwgdW5zaWduZWQgZnJvbV9sZW4pOworaW50IFJTQV9wYWRkaW5nX2NoZWNrX1BLQ1MxX3R5cGVfMSh1aW50OF90ICp0bywgdW5zaWduZWQgdG9fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpmcm9tLCB1bnNpZ25lZCBmcm9tX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcnNhX2xlbik7CitpbnQgUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX3R5cGVfMih1aW50OF90ICp0bywgdW5zaWduZWQgdG9fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZnJvbSwgdW5zaWduZWQgZnJvbV9sZW4pOworaW50IFJTQV9wYWRkaW5nX2NoZWNrX1BLQ1MxX3R5cGVfMih1aW50OF90ICp0bywgdW5zaWduZWQgdG9fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpmcm9tLCB1bnNpZ25lZCBmcm9tX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcnNhX2xlbik7CitpbnQgUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX09BRVBfbWdmMSh1aW50OF90ICp0bywgdW5zaWduZWQgdG9fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZnJvbSwgdW5zaWduZWQgZnJvbV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwYXJhbSwgdW5zaWduZWQgcGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVWUF9NRCAqbWQsIGNvbnN0IEVWUF9NRCAqbWdmMW1kKTsKK2ludCBSU0FfcGFkZGluZ19jaGVja19QS0NTMV9PQUVQX21nZjEodWludDhfdCAqdG8sIHVuc2lnbmVkIHRvX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZnJvbSwgdW5zaWduZWQgZnJvbV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bSwgY29uc3QgdWludDhfdCAqcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHBsZW4sIGNvbnN0IEVWUF9NRCAqbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVWUF9NRCAqbWdmMW1kKTsKK2ludCBSU0FfcGFkZGluZ19hZGRfUEtDUzFfT0FFUCh1aW50OF90ICp0bywgdW5zaWduZWQgdG9fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZyb20sIHVuc2lnbmVkIGZyb21fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnAsIHVuc2lnbmVkIHBsKTsKK2ludCBSU0FfcGFkZGluZ19jaGVja19QS0NTMV9PQUVQKHVpbnQ4X3QgKnRvLCB1bnNpZ25lZCB0b19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpmcm9tLCB1bnNpZ25lZCBmcm9tX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHJzYV9sZW4sIGNvbnN0IHVpbnQ4X3QgKnAsIHVuc2lnbmVkIHBsKTsKK2ludCBSU0FfcGFkZGluZ19hZGRfU1NMdjIzKHVpbnQ4X3QgKnRvLCB1bnNpZ25lZCB0b19sZW4sIGNvbnN0IHVpbnQ4X3QgKmZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmcm9tX2xlbik7CitpbnQgUlNBX3BhZGRpbmdfY2hlY2tfU1NMdjIzKHVpbnQ4X3QgKnRvLCB1bnNpZ25lZCB0b19sZW4sIGNvbnN0IHVpbnQ4X3QgKmZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZyb21fbGVuLCB1bnNpZ25lZCByc2FfbGVuKTsKK2ludCBSU0FfcGFkZGluZ19hZGRfbm9uZSh1aW50OF90ICp0bywgdW5zaWduZWQgdG9fbGVuLCBjb25zdCB1aW50OF90ICpmcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZyb21fbGVuKTsKK2ludCBSU0FfcGFkZGluZ19jaGVja19ub25lKHVpbnQ4X3QgKnRvLCB1bnNpZ25lZCB0b19sZW4sIGNvbnN0IHVpbnQ4X3QgKmZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmcm9tX2xlbiwgdW5zaWduZWQgcnNhX2xlbik7CisKKy8qIFJTQV92ZXJpZnlfUEtDUzFfUFNTX21nZjEgKi8KK2ludCBSU0FfdmVyaWZ5X1BLQ1MxX1BTU19tZ2YxKFJTQSAqcnNhLCBjb25zdCB1aW50OF90ICptSGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVWUF9NRCAqSGFzaCwgY29uc3QgRVZQX01EICptZ2YxSGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKkVNLCBpbnQgc0xlbik7CisKK2ludCBSU0FfcGFkZGluZ19hZGRfUEtDUzFfUFNTX21nZjEoUlNBICpyc2EsIHVpbnQ4X3QgKkVNLCBjb25zdCB1aW50OF90ICptSGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRVZQX01EICpIYXNoLCBjb25zdCBFVlBfTUQgKm1nZjFIYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc0xlbik7CisKK3R5cGVkZWYgc3RydWN0IHJzYV9wc3NfcGFyYW1zX3N0IHsKKyAgWDUwOV9BTEdPUiAqaGFzaEFsZ29yaXRobTsKKyAgWDUwOV9BTEdPUiAqbWFza0dlbkFsZ29yaXRobTsKKyAgQVNOMV9JTlRFR0VSICpzYWx0TGVuZ3RoOworICBBU04xX0lOVEVHRVIgKnRyYWlsZXJGaWVsZDsKK30gUlNBX1BTU19QQVJBTVM7CisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoUlNBX1BTU19QQVJBTVMpCisKK3R5cGVkZWYgc3RydWN0IHJzYV9vYWVwX3BhcmFtc19zdCB7CisgIFg1MDlfQUxHT1IgKmhhc2hGdW5jOworICBYNTA5X0FMR09SICptYXNrR2VuRnVuYzsKKyAgWDUwOV9BTEdPUiAqcFNvdXJjZUZ1bmM7Cit9IFJTQV9PQUVQX1BBUkFNUzsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9IC8qIGV4dGVybiBDICovCisjZW5kaWYKKworI2VuZGlmIC8qIE9QRU5TU0xfSEVBREVSX1JTQV9JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9jcnlwdG8vcnNhL3BhZGRpbmcuYyBiL2NyeXB0by9yc2EvcGFkZGluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwM2Y0ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vcnNhL3BhZGRpbmcuYwpAQCAtMCwwICsxLDgyNyBAQAorLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDUuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9yc2EuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvZGlnZXN0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc2hhLmg+CisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisvKiBUT0RPKGZvcmspOiBkb24ndCB0aGUgY2hlY2sgZnVuY3Rpb25zIGhhdmUgdG8gYmUgY29uc3RhbnQgdGltZT8gKi8KKworaW50IFJTQV9wYWRkaW5nX2FkZF9QS0NTMV90eXBlXzEodWludDhfdCAqdG8sIHVuc2lnbmVkIHRsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpmcm9tLCB1bnNpZ25lZCBmbGVuKSB7CisgIHVuc2lnbmVkIGo7CisgIHVpbnQ4X3QgKnA7CisKKyAgaWYgKGZsZW4gPiAodGxlbiAtIFJTQV9QS0NTMV9QQURESU5HX1NJWkUpKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcGFkZGluZ19hZGRfUEtDUzFfdHlwZV8xLAorICAgICAgICAgICAgICAgICAgICAgIFJTQV9SX0RBVEFfVE9PX0xBUkdFX0ZPUl9LRVlfU0laRSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwID0gKHVpbnQ4X3QgKil0bzsKKworICAqKHArKykgPSAwOworICAqKHArKykgPSAxOyAvKiBQcml2YXRlIEtleSBCVCAoQmxvY2sgVHlwZSkgKi8KKworICAvKiBwYWQgb3V0IHdpdGggMHhmZiBkYXRhICovCisgIGogPSB0bGVuIC0gMyAtIGZsZW47CisgIG1lbXNldChwLCAweGZmLCBqKTsKKyAgcCArPSBqOworICAqKHArKykgPSAwOworICBtZW1jcHkocCwgZnJvbSwgKHVuc2lnbmVkIGludClmbGVuKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBSU0FfcGFkZGluZ19jaGVja19QS0NTMV90eXBlXzEodWludDhfdCAqdG8sIHVuc2lnbmVkIHRsZW4sIGNvbnN0IHVpbnQ4X3QgKmZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZsZW4sIHVuc2lnbmVkIG51bSkgeworICB1bnNpZ25lZCBpLCBqOworICBjb25zdCB1aW50OF90ICpwOworCisgIGlmIChmbGVuID09IDApIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9wYWRkaW5nX2NoZWNrX1BLQ1MxX3R5cGVfMSwKKyAgICAgICAgICAgICAgICAgICAgICBSU0FfUl9FTVBUWV9QVUJMSUNfS0VZKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBwID0gZnJvbTsKKyAgaWYgKChudW0gIT0gKGZsZW4gKyAxKSkgfHwgKCoocCsrKSAhPSAxKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfdHlwZV8xLAorICAgICAgICAgICAgICAgICAgICAgIFJTQV9SX0JMT0NLX1RZUEVfSVNfTk9UXzAxKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvKiBzY2FuIG92ZXIgcGFkZGluZyBkYXRhICovCisgIGogPSBmbGVuIC0gMTsgLyogb25lIGZvciB0eXBlLiAqLworICBmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSB7CisgICAgaWYgKCpwICE9IDB4ZmYpIC8qIHNob3VsZCBkZWNyeXB0IHRvIDB4ZmYgKi8KKyAgICB7CisgICAgICBpZiAoKnAgPT0gMCkgeworICAgICAgICBwKys7CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcGFkZGluZ19jaGVja19QS0NTMV90eXBlXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJTQV9SX0JBRF9GSVhFRF9IRUFERVJfREVDUllQVCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICB9CisgICAgcCsrOworICB9CisKKyAgaWYgKGkgPT0gaikgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfdHlwZV8xLAorICAgICAgICAgICAgICAgICAgICAgIFJTQV9SX05VTExfQkVGT1JFX0JMT0NLX01JU1NJTkcpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmIChpIDwgOCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfdHlwZV8xLAorICAgICAgICAgICAgICAgICAgICAgIFJTQV9SX0JBRF9QQURfQllURV9DT1VOVCk7CisgICAgcmV0dXJuIC0xOworICB9CisgIGkrKzsgLyogU2tpcCBvdmVyIHRoZSAnXDAnICovCisgIGogLT0gaTsKKyAgaWYgKGogPiB0bGVuKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcGFkZGluZ19jaGVja19QS0NTMV90eXBlXzEsCisgICAgICAgICAgICAgICAgICAgICAgUlNBX1JfREFUQV9UT09fTEFSR0UpOworICAgIHJldHVybiAtMTsKKyAgfQorICBtZW1jcHkodG8sIHAsIGopOworCisgIHJldHVybiBqOworfQorCitpbnQgUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX3R5cGVfMih1aW50OF90ICp0bywgdW5zaWduZWQgdGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZyb20sIHVuc2lnbmVkIGZsZW4pIHsKKyAgdW5zaWduZWQgaSwgajsKKyAgdWludDhfdCAqcDsKKworICBpZiAoZmxlbiA+ICh0bGVuIC0gMTEpKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcGFkZGluZ19hZGRfUEtDUzFfdHlwZV8yLAorICAgICAgICAgICAgICAgICAgICAgIFJTQV9SX0RBVEFfVE9PX0xBUkdFX0ZPUl9LRVlfU0laRSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwID0gKHVuc2lnbmVkIGNoYXIgKil0bzsKKworICAqKHArKykgPSAwOworICAqKHArKykgPSAyOyAvKiBQdWJsaWMgS2V5IEJUIChCbG9jayBUeXBlKSAqLworCisgIC8qIHBhZCBvdXQgd2l0aCBub24temVybyByYW5kb20gZGF0YSAqLworICBqID0gdGxlbiAtIDMgLSBmbGVuOworCisgIGlmIChSQU5EX3BzZXVkb19ieXRlcyhwLCBqKSA8PSAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSB7CisgICAgaWYgKCpwID09IDApIHsKKyAgICAgIGRvIHsKKyAgICAgICAgaWYgKFJBTkRfcHNldWRvX2J5dGVzKHAsIDEpIDw9IDApIHsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAoKnAgPT0gMCk7CisgICAgfQorICAgIHArKzsKKyAgfQorCisgICoocCsrKSA9IDA7CisKKyAgbWVtY3B5KHAsIGZyb20sICh1bnNpZ25lZCBpbnQpZmxlbik7CisgIHJldHVybiAxOworfQorCitpbnQgUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfdHlwZV8yKHVpbnQ4X3QgKnRvLCB1bnNpZ25lZCB0bGVuLCBjb25zdCB1aW50OF90ICpmcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmbGVuLCB1bnNpZ25lZCBudW0pIHsKKyAgdW5zaWduZWQgaSwgajsKKyAgY29uc3QgdWludDhfdCAqcDsKKworICBpZiAoZmxlbiA9PSAwKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcGFkZGluZ19jaGVja19QS0NTMV90eXBlXzIsCisgICAgICAgICAgICAgICAgICAgICAgUlNBX1JfRU1QVFlfUFVCTElDX0tFWSk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcCA9IGZyb207CisgIGlmICgobnVtICE9IChmbGVuICsgMSkpIHx8ICgqKHArKykgIT0gMikpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9wYWRkaW5nX2NoZWNrX1BLQ1MxX3R5cGVfMiwKKyAgICAgICAgICAgICAgICAgICAgICBSU0FfUl9CTE9DS19UWVBFX0lTX05PVF8wMik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLyogc2NhbiBvdmVyIHBhZGRpbmcgZGF0YSAqLworICBqID0gZmxlbiAtIDE7IC8qIG9uZSBmb3IgdHlwZS4gKi8KKyAgZm9yIChpID0gMDsgaSA8IGo7IGkrKykgeworICAgIGlmICgqKHArKykgPT0gMCkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKGkgPT0gaikgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfdHlwZV8yLAorICAgICAgICAgICAgICAgICAgICAgIFJTQV9SX05VTExfQkVGT1JFX0JMT0NLX01JU1NJTkcpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmIChpIDwgOCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfdHlwZV8yLAorICAgICAgICAgICAgICAgICAgICAgIFJTQV9SX0JBRF9QQURfQllURV9DT1VOVCk7CisgICAgcmV0dXJuIC0xOworICB9CisgIGkrKzsgLyogU2tpcCBvdmVyIHRoZSAnXDAnICovCisgIGogLT0gaTsKKyAgaWYgKGogPiB0bGVuKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcGFkZGluZ19jaGVja19QS0NTMV90eXBlXzIsCisgICAgICAgICAgICAgICAgICAgICAgUlNBX1JfREFUQV9UT09fTEFSR0UpOworICAgIHJldHVybiAtMTsKKyAgfQorICBtZW1jcHkodG8sIHAsICh1bnNpZ25lZCBpbnQpaik7CisKKyAgcmV0dXJuIGo7Cit9CisKK2ludCBSU0FfcGFkZGluZ19hZGRfbm9uZSh1aW50OF90ICp0bywgdW5zaWduZWQgdGxlbiwgY29uc3QgdWludDhfdCAqZnJvbSwgdW5zaWduZWQgZmxlbikgeworICBpZiAoZmxlbiA+IHRsZW4pIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9wYWRkaW5nX2FkZF9ub25lLAorICAgICAgICAgICAgICAgICAgICAgIFJTQV9SX0RBVEFfVE9PX0xBUkdFX0ZPUl9LRVlfU0laRSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoZmxlbiA8IHRsZW4pIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9wYWRkaW5nX2FkZF9ub25lLAorICAgICAgICAgICAgICAgICAgICAgIFJTQV9SX0RBVEFfVE9PX1NNQUxMX0ZPUl9LRVlfU0laRSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBtZW1jcHkodG8sIGZyb20sICh1bnNpZ25lZCBpbnQpZmxlbik7CisgIHJldHVybiAxOworfQorCitpbnQgUlNBX3BhZGRpbmdfY2hlY2tfbm9uZSh1aW50OF90ICp0bywgdW5zaWduZWQgdGxlbiwgY29uc3QgdWludDhfdCAqZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZsZW4sIHVuc2lnbmVkIG51bSkgeworICBpZiAoZmxlbiA+IHRsZW4pIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9wYWRkaW5nX2NoZWNrX25vbmUsIFJTQV9SX0RBVEFfVE9PX0xBUkdFKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBtZW1zZXQodG8sIDAsIHRsZW4gLSBmbGVuKTsKKyAgbWVtY3B5KHRvICsgdGxlbiAtIGZsZW4sIGZyb20sIGZsZW4pOworICByZXR1cm4gdGxlbjsKK30KKworaW50IFJTQV9wYWRkaW5nX2FkZF9TU0x2MjModWludDhfdCAqdG8sIHVuc2lnbmVkIHRsZW4sIGNvbnN0IHVpbnQ4X3QgKmZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmbGVuKSB7CisgIHVuc2lnbmVkIGksIGo7CisgIHVpbnQ4X3QgKnA7CisKKyAgaWYgKGZsZW4gPiAodGxlbiAtIDExKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3BhZGRpbmdfYWRkX1NTTHYyMywKKyAgICAgICAgICAgICAgICAgICAgICBSU0FfUl9EQVRBX1RPT19MQVJHRV9GT1JfS0VZX1NJWkUpOworICAgIHJldHVybiAwOworICB9CisKKyAgcCA9IHRvOworCisgICoocCsrKSA9IDA7CisgICoocCsrKSA9IDI7IC8qIFB1YmxpYyBLZXkgQlQgKEJsb2NrIFR5cGUpICovCisKKyAgLyogcGFkIG91dCB3aXRoIG5vbi16ZXJvIHJhbmRvbSBkYXRhICovCisgIGogPSB0bGVuIC0gMyAtIDggLSBmbGVuOworCisgIGlmIChSQU5EX3BzZXVkb19ieXRlcyhwLCBqKSA8PSAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSB7CisgICAgaWYgKCpwID09ICdcMCcpIHsKKyAgICAgIGRvIHsKKyAgICAgICAgaWYgKFJBTkRfcHNldWRvX2J5dGVzKHAsIDEpIDw9IDApCisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICB9IHdoaWxlICgqcCA9PSAnXDAnKTsKKyAgICB9CisgICAgcCsrOworICB9CisKKyAgbWVtc2V0KHAsIDMsIDgpOworICBwICs9IDg7CisgICoocCsrKSA9ICdcMCc7CisKKyAgbWVtY3B5KHAsIGZyb20sIGZsZW4pOworICByZXR1cm4gMTsKK30KKworaW50IFJTQV9wYWRkaW5nX2NoZWNrX1NTTHYyMyh1aW50OF90ICp0bywgdW5zaWduZWQgdGxlbiwgY29uc3QgdWludDhfdCAqZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZmxlbiwgdW5zaWduZWQgbnVtKSB7CisgIHVuc2lnbmVkIGksIGosIGs7CisgIGNvbnN0IHVpbnQ4X3QgKnA7CisKKyAgcCA9IGZyb207CisgIGlmIChmbGVuIDwgMTApIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9wYWRkaW5nX2NoZWNrX1NTTHYyMywgUlNBX1JfREFUQV9UT09fU01BTEwpOworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoKG51bSAhPSAoZmxlbiArIDEpKSB8fCAoKihwKyspICE9IDAyKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3BhZGRpbmdfY2hlY2tfU1NMdjIzLAorICAgICAgICAgICAgICAgICAgICAgIFJTQV9SX0JMT0NLX1RZUEVfSVNfTk9UXzAyKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvKiBzY2FuIG92ZXIgcGFkZGluZyBkYXRhICovCisgIGogPSBmbGVuIC0gMTsgLyogb25lIGZvciB0eXBlICovCisgIGZvciAoaSA9IDA7IGkgPCBqOyBpKyspIHsKKyAgICBpZiAoKihwKyspID09IDApIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmICgoaSA9PSBqKSB8fCAoaSA8IDgpKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcGFkZGluZ19jaGVja19TU0x2MjMsCisgICAgICAgICAgICAgICAgICAgICAgUlNBX1JfTlVMTF9CRUZPUkVfQkxPQ0tfTUlTU0lORyk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgZm9yIChrID0gLTk7IGsgPCAtMTsgaysrKSB7CisgICAgaWYgKHBba10gIT0gMHgwMykgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKGsgPT0gLTEpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9wYWRkaW5nX2NoZWNrX1NTTHYyMywKKyAgICAgICAgICAgICAgICAgICAgICBSU0FfUl9TU0xWM19ST0xMQkFDS19BVFRBQ0spOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGkrKzsgLyogU2tpcCBvdmVyIHRoZSAnXDAnICovCisgIGogLT0gaTsKKyAgaWYgKGogPiB0bGVuKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcGFkZGluZ19jaGVja19TU0x2MjMsIFJTQV9SX0RBVEFfVE9PX0xBUkdFKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgbWVtY3B5KHRvLCBwLCAodW5zaWduZWQgaW50KWopOworCisgIHJldHVybiBqOworfQorCitpbnQgUEtDUzFfTUdGMSh1aW50OF90ICptYXNrLCB1bnNpZ25lZCBsZW4sIGNvbnN0IHVpbnQ4X3QgKnNlZWQsCisgICAgICAgICAgICAgICB1bnNpZ25lZCBzZWVkbGVuLCBjb25zdCBFVlBfTUQgKmRnc3QpIHsKKyAgdW5zaWduZWQgb3V0bGVuID0gMDsKKyAgdWludDMyX3QgaTsKKyAgdWludDhfdCBjbnRbNF07CisgIEVWUF9NRF9DVFggYzsKKyAgdWludDhfdCBtZFtFVlBfTUFYX01EX1NJWkVdOworICB1bnNpZ25lZCBtZGxlbjsKKyAgaW50IHJldCA9IC0xOworCisgIEVWUF9NRF9DVFhfaW5pdCgmYyk7CisgIG1kbGVuID0gRVZQX01EX3NpemUoZGdzdCk7CisKKyAgZm9yIChpID0gMDsgb3V0bGVuIDwgbGVuOyBpKyspIHsKKyAgICBjbnRbMF0gPSAodWludDhfdCkoKGkgPj4gMjQpICYgMjU1KTsKKyAgICBjbnRbMV0gPSAodWludDhfdCkoKGkgPj4gMTYpICYgMjU1KTsKKyAgICBjbnRbMl0gPSAodWludDhfdCkoKGkgPj4gOCkpICYgMjU1OworICAgIGNudFszXSA9ICh1aW50OF90KShpICYgMjU1KTsKKyAgICBpZiAoIUVWUF9EaWdlc3RJbml0X2V4KCZjLCBkZ3N0LCBOVUxMKSB8fAorICAgICAgICAhRVZQX0RpZ2VzdFVwZGF0ZSgmYywgc2VlZCwgc2VlZGxlbikgfHwgIUVWUF9EaWdlc3RVcGRhdGUoJmMsIGNudCwgNCkpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGlmIChvdXRsZW4gKyBtZGxlbiA8PSBsZW4pIHsKKyAgICAgIGlmICghRVZQX0RpZ2VzdEZpbmFsX2V4KCZjLCBtYXNrICsgb3V0bGVuLCBOVUxMKSkgeworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICAgIG91dGxlbiArPSBtZGxlbjsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCFFVlBfRGlnZXN0RmluYWxfZXgoJmMsIG1kLCBOVUxMKSkgeworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICAgIG1lbWNweShtYXNrICsgb3V0bGVuLCBtZCwgbGVuIC0gb3V0bGVuKTsKKyAgICAgIG91dGxlbiA9IGxlbjsKKyAgICB9CisgIH0KKyAgcmV0ID0gMDsKKworZXJyOgorICBFVlBfTURfQ1RYX2NsZWFudXAoJmMpOworICByZXR1cm4gcmV0OworfQorCitpbnQgUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX09BRVBfbWdmMSh1aW50OF90ICp0bywgdW5zaWduZWQgdGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZyb20sIHVuc2lnbmVkIGZsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwYXJhbSwgdW5zaWduZWQgcGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVWUF9NRCAqbWQsIGNvbnN0IEVWUF9NRCAqbWdmMW1kKSB7CisgIHVuc2lnbmVkIGksIGVtbGVuID0gdGxlbiAtIDEsIG1kbGVuOworICB1aW50OF90ICpkYiwgKnNlZWQ7CisgIHVpbnQ4X3QgKmRibWFzayA9IE5VTEwsIHNlZWRtYXNrW1NIQV9ESUdFU1RfTEVOR1RIXTsKKyAgaW50IHJldCA9IDA7CisKKyAgaWYgKG1kID09IE5VTEwpIHsKKyAgICBtZCA9IEVWUF9zaGExKCk7CisgIH0KKyAgaWYgKG1nZjFtZCA9PSBOVUxMKSB7CisgICAgbWdmMW1kID0gbWQ7CisgIH0KKworICBtZGxlbiA9IEVWUF9NRF9zaXplKG1kKTsKKworICBpZiAoZmxlbiA+IGVtbGVuIC0gMiAqIG1kbGVuIC0gMSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX09BRVBfbWdmMSwKKyAgICAgICAgICAgICAgICAgICAgICBSU0FfUl9EQVRBX1RPT19MQVJHRV9GT1JfS0VZX1NJWkUpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKGVtbGVuIDwgMiAqIG1kbGVuICsgMSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX09BRVBfbWdmMSwKKyAgICAgICAgICAgICAgICAgICAgICBSU0FfUl9LRVlfU0laRV9UT09fU01BTEwpOworICAgIHJldHVybiAwOworICB9CisKKyAgdG9bMF0gPSAwOworICBzZWVkID0gdG8gKyAxOworICBkYiA9IHRvICsgbWRsZW4gKyAxOworCisgIGlmICghRVZQX0RpZ2VzdCgodm9pZCAqKXBhcmFtLCBwbGVuLCBkYiwgTlVMTCwgbWQsIE5VTEwpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgbWVtc2V0KGRiICsgbWRsZW4sIDAsIGVtbGVuIC0gZmxlbiAtIDIgKiBtZGxlbiAtIDEpOworICBkYltlbWxlbiAtIGZsZW4gLSBtZGxlbiAtIDFdID0gMHgwMTsKKyAgbWVtY3B5KGRiICsgZW1sZW4gLSBmbGVuIC0gbWRsZW4sIGZyb20sICh1bnNpZ25lZCBpbnQpZmxlbik7CisgIGlmIChSQU5EX3BzZXVkb19ieXRlcyhzZWVkLCBtZGxlbikgPD0gMCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgZGJtYXNrID0gT1BFTlNTTF9tYWxsb2MoZW1sZW4gLSBtZGxlbik7CisgIGlmIChkYm1hc2sgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX09BRVBfbWdmMSwKKyAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoUEtDUzFfTUdGMShkYm1hc2ssIGVtbGVuIC0gbWRsZW4sIHNlZWQsIG1kbGVuLCBtZ2YxbWQpIDwgMCkgeworICAgIGdvdG8gb3V0OworICB9CisgIGZvciAoaSA9IDA7IGkgPCBlbWxlbiAtIG1kbGVuOyBpKyspIHsKKyAgICBkYltpXSBePSBkYm1hc2tbaV07CisgIH0KKworICBpZiAoUEtDUzFfTUdGMShzZWVkbWFzaywgbWRsZW4sIGRiLCBlbWxlbiAtIG1kbGVuLCBtZ2YxbWQpIDwgMCkgeworICAgIGdvdG8gb3V0OworICB9CisgIGZvciAoaSA9IDA7IGkgPCBTSEFfRElHRVNUX0xFTkdUSDsgaSsrKSB7CisgICAgc2VlZFtpXSBePSBzZWVkbWFza1tpXTsKKyAgfQorICByZXQgPSAxOworCitvdXQ6CisgIGlmIChkYm1hc2sgIT0gTlVMTCkgeworICAgIE9QRU5TU0xfZnJlZShkYm1hc2spOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK2ludCBSU0FfcGFkZGluZ19jaGVja19QS0NTMV9PQUVQX21nZjEodWludDhfdCAqdG8sIHVuc2lnbmVkIHRsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZyb20sIHVuc2lnbmVkIGZsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bSwgY29uc3QgdWludDhfdCAqcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHBsZW4sIGNvbnN0IEVWUF9NRCAqbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVWUF9NRCAqbWdmMW1kKSB7CisgIHVuc2lnbmVkIGksIGRibGVuLCBtbGVuID0gLTEsIGJhZCwgbWRsZW47CisgIGNvbnN0IHVpbnQ4X3QgKm1hc2tlZGRiOworICB1bnNpZ25lZCBsemVybzsKKyAgdWludDhfdCAqZGIgPSBOVUxMLCBzZWVkW1NIQV9ESUdFU1RfTEVOR1RIXSwgcGhhc2hbU0hBX0RJR0VTVF9MRU5HVEhdOworICB1aW50OF90ICpwYWRkZWRfZnJvbTsKKworICBpZiAobWQgPT0gTlVMTCkgeworICAgIG1kID0gRVZQX3NoYTEoKTsKKyAgfQorICBpZiAobWdmMW1kID09IE5VTEwpIHsKKyAgICBtZ2YxbWQgPSBtZDsKKyAgfQorCisgIG1kbGVuID0gRVZQX01EX3NpemUobWQpOworCisgIGlmICgtLW51bSA8IDIgKiBtZGxlbiArIDEpIHsKKyAgICAvKiAnbnVtJyBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBtb2R1bHVzLCBpLmUuIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUKKyAgICAgKiBwYXJ0aWN1bGFyIGNpcGhlcnRleHQuICovCisgICAgZ290byBkZWNvZGluZ19lcnI7CisgIH0KKworICAvKiBUT0RPKGZvcmspOiB0aGlzIGNvZGUgZGlmZmVycyBzaWduaWZpY2FudGx5IGJldHdlZW4gMS4wLjEgYW5kIDEuMC4yLiBXZQorICAgKiBuZWVkIHRvIHVuZGVyc3RhbmQgd2h5IGFuZCBwaWNrIHRoZSBiZXN0IG9uZS4gKi8KKworICAvKiBsemVybyBpcyB0aGUgbnVtYmVyIG9mIGxlYWRpbmcgemVyb3MuIFdlIG11c3Qgbm90IGxlYWsgaW4gdGhlIGNhc2UKKyAgICogdGhhdCB0aGlzIGlzIG5lZ2F0aXZlLiBTZWUgSmFtZXMgSC4gTWFuZ2VyLCAiQSBDaG9zZW4gQ2lwaGVydGV4dAorICAgKiBBdHRhY2sgb24gUlNBIE9wdGltYWwgQXN5bW1ldHJpYyBFbmNyeXB0aW9uIFBhZGRpbmcgKE9BRVApIFsuLi5dIiwKKyAgICogQ1JZUFRPIDIwMDEpLiAqLworICBsemVybyA9IG51bSAtIGZsZW47CisgIC8qIElmIGx6ZXJvIGlzIG5lZ2F0aXZlIHRoZW4gdGhlIE1TQiB3aWxsIGJlIHNldCBhbmQgdGhpcyBhcml0aG1ldGljCisgICAqIHJpZ2h0IHNoaWZ0IHdpbGwgc2V0IGJhZCB0byBhbGwgb25lcy4gT3RoZXJ3aXNlIGl0J2xsIGJlIGFsbAorICAgKiB6ZXJvcy4gKi8KKyAgYmFkID0gKChpbnQpbHplcm8pID4+IChzaXplb2YoaW50KSAqIDggLSAxKTsKKyAgbHplcm8gJj0gfmJhZDsKKyAgZmxlbiA9IChiYWQgJiBudW0pIHwgKH5iYWQgJiBmbGVuKTsKKworICBkYmxlbiA9IG51bSAtIG1kbGVuOworICBkYiA9IE9QRU5TU0xfbWFsbG9jKGRibGVuICsgbnVtKTsKKyAgaWYgKGRiID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9wYWRkaW5nX2NoZWNrX1BLQ1MxX09BRVBfbWdmMSwKKyAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLyogQWx3YXlzIGRvIHRoaXMgemVyby1wYWRkaW5nIGNvcHkgKGV2ZW4gd2hlbiBsemVybyA9PSAwKSB0byBhdm9pZAorICAgKiBsZWFraW5nIHRpbWluZyBpbmZvIGFib3V0IHRoZSB2YWx1ZSBvZiBsemVyby4gVGhpcyBzYWRseSBsZWFrcworICAgKiBzaWRlLWNoYW5uZWwgaW5mb3JtYXRpb24sIGJ1dCBpdCdzIG5vdCBwb3NzaWJsZSB0byBoYXZlIGEgZml4ZWQKKyAgICogbWVtb3J5IGFjY2VzcyBwYXR0ZXJuIHNpbmNlIHdlIGNhbid0IHJlYWQgb3V0IG9mIHRoZSBib3VuZHMgb2YKKyAgICogfGZyb218LiAqLworICBwYWRkZWRfZnJvbSA9IGRiICsgZGJsZW47CisgIG1lbXNldChwYWRkZWRfZnJvbSwgMCwgbnVtKTsKKyAgbWVtY3B5KHBhZGRlZF9mcm9tICsgbHplcm8sIGZyb20sIGZsZW4pOworCisgIG1hc2tlZGRiID0gcGFkZGVkX2Zyb20gKyBtZGxlbjsKKworICBpZiAoUEtDUzFfTUdGMShzZWVkLCBtZGxlbiwgbWFza2VkZGIsIGRibGVuLCBtZ2YxbWQpKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGZvciAoaSA9IDA7IGkgPCBtZGxlbjsgaSsrKSB7CisgICAgc2VlZFtpXSBePSBwYWRkZWRfZnJvbVtpXTsKKyAgfQorCisgIGlmIChQS0NTMV9NR0YxKGRiLCBkYmxlbiwgc2VlZCwgbWRsZW4sIG1nZjFtZCkpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IGRibGVuOyBpKyspIHsKKyAgICBkYltpXSBePSBtYXNrZWRkYltpXTsKKyAgfQorCisgIGlmICghRVZQX0RpZ2VzdCgodm9pZCAqKXBhcmFtLCBwbGVuLCBwaGFzaCwgTlVMTCwgbWQsIE5VTEwpKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKENSWVBUT19tZW1jbXAoZGIsIHBoYXNoLCBtZGxlbikgIT0gMCB8fCBiYWQpIHsKKyAgICBnb3RvIGRlY29kaW5nX2VycjsKKyAgfSBlbHNlIHsKKyAgICAvKiBBdCB0aGlzIHBvaW50IHdlIGNvbnNpZGVyIHRpbWluZyBzaWRlLWNoYW5uZWxzIHRvIGJlIG1vb3QKKyAgICAgKiBiZWNhdXNlIHRoZSBwbGFpbnRleHQgY29udGFpbmVkIHRoZSBjb3JyZWN0IHBoYXNoLiAqLworICAgIGZvciAoaSA9IG1kbGVuOyBpIDwgZGJsZW47IGkrKykgeworICAgICAgaWYgKGRiW2ldICE9IDB4MDApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGkgPT0gZGJsZW4gfHwgZGJbaV0gIT0gMHgwMSkgeworICAgICAgZ290byBkZWNvZGluZ19lcnI7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGV2ZXJ5dGhpbmcgbG9va3MgT0sgKi8KKworICAgICAgbWxlbiA9IGRibGVuIC0gKytpOworICAgICAgaWYgKHRsZW4gPCBtbGVuKSB7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfT0FFUF9tZ2YxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSU0FfUl9EQVRBX1RPT19MQVJHRSk7CisgICAgICAgIG1sZW4gPSAtMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1lbWNweSh0bywgZGIgKyBpLCBtbGVuKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBPUEVOU1NMX2ZyZWUoZGIpOworICByZXR1cm4gbWxlbjsKKworZGVjb2RpbmdfZXJyOgorICAvKiB0byBhdm9pZCBjaG9zZW4gY2lwaGVydGV4dCBhdHRhY2tzLCB0aGUgZXJyb3IgbWVzc2FnZSBzaG91bGQgbm90IHJldmVhbAorICAgKiB3aGljaCBraW5kIG9mIGRlY29kaW5nIGVycm9yIGhhcHBlbmVkICovCisgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfT0FFUF9tZ2YxLAorICAgICAgICAgICAgICAgICAgICBSU0FfUl9PQUVQX0RFQ09ESU5HX0VSUk9SKTsKKyAgaWYgKGRiICE9IE5VTEwpIHsKKyAgICBPUEVOU1NMX2ZyZWUoZGIpOworICB9CisgIHJldHVybiAtMTsKK30KKworaW50IFJTQV9wYWRkaW5nX2FkZF9QS0NTMV9PQUVQKHVpbnQ4X3QgKnRvLCB1bnNpZ25lZCB0bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZyb20sIHVuc2lnbmVkIGZsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcGFyYW0sIHVuc2lnbmVkIHBsZW4pIHsKKyAgcmV0dXJuIFJTQV9wYWRkaW5nX2FkZF9QS0NTMV9PQUVQX21nZjEodG8sIHRsZW4sIGZyb20sIGZsZW4sIHBhcmFtLCBwbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKK30KKworaW50IFJTQV9wYWRkaW5nX2NoZWNrX1BLQ1MxX09BRVAodWludDhfdCAqdG8sIHVuc2lnbmVkIHRsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpmcm9tLCB1bnNpZ25lZCBmbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtLCBjb25zdCB1aW50OF90ICpwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHBsZW4pIHsKKyAgcmV0dXJuIFJTQV9wYWRkaW5nX2NoZWNrX1BLQ1MxX09BRVBfbWdmMSh0bywgdGxlbiwgZnJvbSwgZmxlbiwgbnVtLCBwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGVuLCBOVUxMLCBOVUxMKTsKK30KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgemVyb2VzW10gPSB7MCwwLDAsMCwwLDAsMCwwfTsKKworaW50IFJTQV92ZXJpZnlfUEtDUzFfUFNTX21nZjEoUlNBICpyc2EsIGNvbnN0IHVpbnQ4X3QgKm1IYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRVZQX01EICpIYXNoLCBjb25zdCBFVlBfTUQgKm1nZjFIYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqRU0sIGludCBzTGVuKSB7CisgIGludCBpOworICBpbnQgcmV0ID0gMDsKKyAgaW50IG1hc2tlZERCTGVuLCBNU0JpdHMsIGVtTGVuOworICBzaXplX3QgaExlbjsKKyAgY29uc3QgdWludDhfdCAqSDsKKyAgdWludDhfdCAqREIgPSBOVUxMOworICBFVlBfTURfQ1RYIGN0eDsKKyAgdWludDhfdCBIX1tFVlBfTUFYX01EX1NJWkVdOworICBFVlBfTURfQ1RYX2luaXQoJmN0eCk7CisKKyAgaWYgKG1nZjFIYXNoID09IE5VTEwpIHsKKyAgICBtZ2YxSGFzaCA9IEhhc2g7CisgIH0KKworICBoTGVuID0gRVZQX01EX3NpemUoSGFzaCk7CisKKyAgLyogTmVnYXRpdmUgc0xlbiBoYXMgc3BlY2lhbCBtZWFuaW5nczoKKyAgICoJLTEJc0xlbiA9PSBoTGVuCisgICAqCS0yCXNhbHQgbGVuZ3RoIGlzIGF1dG9yZWNvdmVyZWQgZnJvbSBzaWduYXR1cmUKKyAgICoJLU4JcmVzZXJ2ZWQgKi8KKyAgaWYgKHNMZW4gPT0gLTEpIHsKKyAgICBzTGVuID0gaExlbjsKKyAgfSBlbHNlIGlmIChzTGVuID09IC0yKSB7CisgICAgc0xlbiA9IC0yOworICB9IGVsc2UgaWYgKHNMZW4gPCAtMikgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3ZlcmlmeV9QS0NTMV9QU1NfbWdmMSwgUlNBX1JfU0xFTl9DSEVDS19GQUlMRUQpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgTVNCaXRzID0gKEJOX251bV9iaXRzKHJzYS0+bikgLSAxKSAmIDB4NzsKKyAgZW1MZW4gPSBSU0Ffc2l6ZShyc2EpOworICBpZiAoRU1bMF0gJiAoMHhGRiA8PCBNU0JpdHMpKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfdmVyaWZ5X1BLQ1MxX1BTU19tZ2YxLAorICAgICAgICAgICAgICAgICAgICAgIFJTQV9SX0ZJUlNUX09DVEVUX0lOVkFMSUQpOworICAgIGdvdG8gZXJyOworICB9CisgIGlmIChNU0JpdHMgPT0gMCkgeworICAgIEVNKys7CisgICAgZW1MZW4tLTsKKyAgfQorICBpZiAoZW1MZW4gPCAoKGludCloTGVuICsgc0xlbiArIDIpKSB7CisgICAgLyogc0xlbiBjYW4gYmUgc21hbGwgbmVnYXRpdmUgKi8KKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV92ZXJpZnlfUEtDUzFfUFNTX21nZjEsIFJTQV9SX0RBVEFfVE9PX0xBUkdFKTsKKyAgICBnb3RvIGVycjsKKyAgfQorICBpZiAoRU1bZW1MZW4gLSAxXSAhPSAweGJjKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfdmVyaWZ5X1BLQ1MxX1BTU19tZ2YxLCBSU0FfUl9MQVNUX09DVEVUX0lOVkFMSUQpOworICAgIGdvdG8gZXJyOworICB9CisgIG1hc2tlZERCTGVuID0gZW1MZW4gLSBoTGVuIC0gMTsKKyAgSCA9IEVNICsgbWFza2VkREJMZW47CisgIERCID0gT1BFTlNTTF9tYWxsb2MobWFza2VkREJMZW4pOworICBpZiAoIURCKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfdmVyaWZ5X1BLQ1MxX1BTU19tZ2YxLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgZ290byBlcnI7CisgIH0KKyAgaWYgKFBLQ1MxX01HRjEoREIsIG1hc2tlZERCTGVuLCBILCBoTGVuLCBtZ2YxSGFzaCkgPCAwKSB7CisgICAgZ290byBlcnI7CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IG1hc2tlZERCTGVuOyBpKyspIHsKKyAgICBEQltpXSBePSBFTVtpXTsKKyAgfQorICBpZiAoTVNCaXRzKSB7CisgICAgREJbMF0gJj0gMHhGRiA+PiAoOCAtIE1TQml0cyk7CisgIH0KKyAgZm9yIChpID0gMDsgREJbaV0gPT0gMCAmJiBpIDwgKG1hc2tlZERCTGVuIC0gMSk7IGkrKykKKyAgICA7CisgIGlmIChEQltpKytdICE9IDB4MSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3ZlcmlmeV9QS0NTMV9QU1NfbWdmMSwKKyAgICAgICAgICAgICAgICAgICAgICBSU0FfUl9TTEVOX1JFQ09WRVJZX0ZBSUxFRCk7CisgICAgZ290byBlcnI7CisgIH0KKyAgaWYgKHNMZW4gPj0gMCAmJiAobWFza2VkREJMZW4gLSBpKSAhPSBzTGVuKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfdmVyaWZ5X1BLQ1MxX1BTU19tZ2YxLCBSU0FfUl9TTEVOX0NIRUNLX0ZBSUxFRCk7CisgICAgZ290byBlcnI7CisgIH0KKyAgaWYgKCFFVlBfRGlnZXN0SW5pdF9leCgmY3R4LCBIYXNoLCBOVUxMKSB8fAorICAgICAgIUVWUF9EaWdlc3RVcGRhdGUoJmN0eCwgemVyb2VzLCBzaXplb2YgemVyb2VzKSB8fAorICAgICAgIUVWUF9EaWdlc3RVcGRhdGUoJmN0eCwgbUhhc2gsIGhMZW4pKSB7CisgICAgZ290byBlcnI7CisgIH0KKyAgaWYgKG1hc2tlZERCTGVuIC0gaSkgeworICAgIGlmICghRVZQX0RpZ2VzdFVwZGF0ZSgmY3R4LCBEQiArIGksIG1hc2tlZERCTGVuIC0gaSkpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfQorICBpZiAoIUVWUF9EaWdlc3RGaW5hbF9leCgmY3R4LCBIXywgTlVMTCkpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorICBpZiAobWVtY21wKEhfLCBILCBoTGVuKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3ZlcmlmeV9QS0NTMV9QU1NfbWdmMSwgUlNBX1JfQkFEX1NJR05BVFVSRSk7CisgICAgcmV0ID0gMDsKKyAgfSBlbHNlIHsKKyAgICByZXQgPSAxOworICB9CisKK2VycjoKKyAgaWYgKERCKSB7CisgICAgT1BFTlNTTF9mcmVlKERCKTsKKyAgfQorICBFVlBfTURfQ1RYX2NsZWFudXAoJmN0eCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworaW50IFJTQV9wYWRkaW5nX2FkZF9QS0NTMV9QU1NfbWdmMShSU0EgKnJzYSwgdW5zaWduZWQgY2hhciAqRU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1IYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFVlBfTUQgKkhhc2gsIGNvbnN0IEVWUF9NRCAqbWdmMUhhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzTGVuKSB7CisgIGludCBpOworICBpbnQgcmV0ID0gMDsKKyAgaW50IG1hc2tlZERCTGVuLCBNU0JpdHMsIGVtTGVuOworICBzaXplX3QgaExlbjsKKyAgdW5zaWduZWQgY2hhciAqSCwgKnNhbHQgPSBOVUxMLCAqcDsKKyAgRVZQX01EX0NUWCBjdHg7CisKKyAgaWYgKG1nZjFIYXNoID09IE5VTEwpIHsKKyAgICBtZ2YxSGFzaCA9IEhhc2g7CisgIH0KKworICBoTGVuID0gRVZQX01EX3NpemUoSGFzaCk7CisKKyAgLyogTmVnYXRpdmUgc0xlbiBoYXMgc3BlY2lhbCBtZWFuaW5nczoKKyAgICoJLTEJc0xlbiA9PSBoTGVuCisgICAqCS0yCXNhbHQgbGVuZ3RoIGlzIG1heGltaXplZAorICAgKgktTglyZXNlcnZlZCAqLworICBpZiAoc0xlbiA9PSAtMSkgeworICAgIHNMZW4gPSBoTGVuOworICB9IGVsc2UgaWYgKHNMZW4gPT0gLTIpIHsKKyAgICBzTGVuID0gLTI7CisgIH0gZWxzZSBpZiAoc0xlbiA8IC0yKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcGFkZGluZ19hZGRfUEtDUzFfUFNTX21nZjEsCisgICAgICAgICAgICAgICAgICAgICAgUlNBX1JfU0xFTl9DSEVDS19GQUlMRUQpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgTVNCaXRzID0gKEJOX251bV9iaXRzKHJzYS0+bikgLSAxKSAmIDB4NzsKKyAgZW1MZW4gPSBSU0Ffc2l6ZShyc2EpOworICBpZiAoTVNCaXRzID09IDApIHsKKyAgICAqRU0rKyA9IDA7CisgICAgZW1MZW4tLTsKKyAgfQorICBpZiAoc0xlbiA9PSAtMikgeworICAgIHNMZW4gPSBlbUxlbiAtIGhMZW4gLSAyOworICB9IGVsc2UgaWYgKGVtTGVuIDwgKGhMZW4gKyBzTGVuICsgMikpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9wYWRkaW5nX2FkZF9QS0NTMV9QU1NfbWdmMSwKKyAgICAgICAgICAgICAgICAgICAgICBSU0FfUl9EQVRBX1RPT19MQVJHRV9GT1JfS0VZX1NJWkUpOworICAgIGdvdG8gZXJyOworICB9CisgIGlmIChzTGVuID4gMCkgeworICAgIHNhbHQgPSBPUEVOU1NMX21hbGxvYyhzTGVuKTsKKyAgICBpZiAoIXNhbHQpIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX1BTU19tZ2YxLAorICAgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgZ290byBlcnI7CisgICAgfQorICAgIGlmIChSQU5EX3BzZXVkb19ieXRlcyhzYWx0LCBzTGVuKSA8PSAwKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0KKyAgbWFza2VkREJMZW4gPSBlbUxlbiAtIGhMZW4gLSAxOworICBIID0gRU0gKyBtYXNrZWREQkxlbjsKKyAgRVZQX01EX0NUWF9pbml0KCZjdHgpOworICBpZiAoIUVWUF9EaWdlc3RJbml0X2V4KCZjdHgsIEhhc2gsIE5VTEwpIHx8CisgICAgICAhRVZQX0RpZ2VzdFVwZGF0ZSgmY3R4LCB6ZXJvZXMsIHNpemVvZiB6ZXJvZXMpIHx8CisgICAgICAhRVZQX0RpZ2VzdFVwZGF0ZSgmY3R4LCBtSGFzaCwgaExlbikpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorICBpZiAoc0xlbiAmJiAhRVZQX0RpZ2VzdFVwZGF0ZSgmY3R4LCBzYWx0LCBzTGVuKSkgeworICAgIGdvdG8gZXJyOworICB9CisgIGlmICghRVZQX0RpZ2VzdEZpbmFsX2V4KCZjdHgsIEgsIE5VTEwpKSB7CisgICAgZ290byBlcnI7CisgIH0KKyAgRVZQX01EX0NUWF9jbGVhbnVwKCZjdHgpOworCisgIC8qIEdlbmVyYXRlIGRiTWFzayBpbiBwbGFjZSB0aGVuIHBlcmZvcm0gWE9SIG9uIGl0ICovCisgIGlmIChQS0NTMV9NR0YxKEVNLCBtYXNrZWREQkxlbiwgSCwgaExlbiwgbWdmMUhhc2gpKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBwID0gRU07CisKKyAgLyogSW5pdGlhbCBQUyBYT1JzIHdpdGggYWxsIHplcm9lcyB3aGljaCBpcyBhIE5PUCBzbyBqdXN0IHVwZGF0ZQorICAgKiBwb2ludGVyLiBOb3RlIGZyb20gYSB0ZXN0IGFib3ZlIHRoaXMgdmFsdWUgaXMgZ3VhcmFudGVlZCB0bworICAgKiBiZSBub24tbmVnYXRpdmUuICovCisgIHAgKz0gZW1MZW4gLSBzTGVuIC0gaExlbiAtIDI7CisgICpwKysgXj0gMHgxOworICBpZiAoc0xlbiA+IDApIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc0xlbjsgaSsrKSB7CisgICAgICAqcCsrIF49IHNhbHRbaV07CisgICAgfQorICB9CisgIGlmIChNU0JpdHMpIHsKKyAgICBFTVswXSAmPSAweEZGID4+ICg4IC0gTVNCaXRzKTsKKyAgfQorCisgIC8qIEggaXMgYWxyZWFkeSBpbiBwbGFjZSBzbyBqdXN0IHNldCBmaW5hbCAweGJjICovCisKKyAgRU1bZW1MZW4gLSAxXSA9IDB4YmM7CisKKyAgcmV0ID0gMTsKKworZXJyOgorICBpZiAoc2FsdCkgeworICAgIE9QRU5TU0xfZnJlZShzYWx0KTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vcnNhL3JzYS5jIGIvY3J5cHRvL3JzYS9yc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjFiYzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3JzYS9yc2EuYwpAQCAtMCwwICsxLDQ4OCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lbmdpbmUuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXhfZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKworI2luY2x1ZGUgImludGVybmFsLmgiCisKKworZXh0ZXJuIGNvbnN0IFJTQV9NRVRIT0QgUlNBX2RlZmF1bHRfbWV0aG9kOworCitSU0EgKlJTQV9uZXcodm9pZCkgeyByZXR1cm4gUlNBX25ld19tZXRob2QoTlVMTCk7IH0KKworUlNBICpSU0FfbmV3X21ldGhvZChjb25zdCBFTkdJTkUgKmVuZ2luZSkgeworICBSU0EgKnJzYSA9IChSU0EgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoUlNBKSk7CisgIGlmIChyc2EgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX25ld19tZXRob2QsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIG1lbXNldChyc2EsIDAsIHNpemVvZihSU0EpKTsKKworICBpZiAoZW5naW5lKSB7CisgICAgcnNhLT5tZXRoID0gRU5HSU5FX2dldF9SU0FfbWV0aG9kKGVuZ2luZSk7CisgIH0KKworICBpZiAocnNhLT5tZXRoID09IE5VTEwpIHsKKyAgICByc2EtPm1ldGggPSAoUlNBX01FVEhPRCopICZSU0FfZGVmYXVsdF9tZXRob2Q7CisgIH0KKyAgTUVUSE9EX3JlZihyc2EtPm1ldGgpOworCisgIHJzYS0+cmVmZXJlbmNlcyA9IDE7CisgIHJzYS0+ZmxhZ3MgPSByc2EtPm1ldGgtPmZsYWdzOworCisgIGlmICghQ1JZUFRPX25ld19leF9kYXRhKENSWVBUT19FWF9JTkRFWF9SU0EsIHJzYSwgJnJzYS0+ZXhfZGF0YSkpIHsKKyAgICBNRVRIT0RfdW5yZWYocnNhLT5tZXRoKTsKKyAgICBPUEVOU1NMX2ZyZWUocnNhKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmIChyc2EtPm1ldGgtPmluaXQgJiYgIXJzYS0+bWV0aC0+aW5pdChyc2EpKSB7CisgICAgQ1JZUFRPX2ZyZWVfZXhfZGF0YShDUllQVE9fRVhfSU5ERVhfUlNBLCByc2EsICZyc2EtPmV4X2RhdGEpOworICAgIE1FVEhPRF91bnJlZihyc2EtPm1ldGgpOworICAgIE9QRU5TU0xfZnJlZShyc2EpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIHJzYTsKK30KKwordm9pZCBSU0FfZnJlZShSU0EgKnJzYSkgeworICB1bnNpZ25lZCB1OworCisgIGlmIChyc2EgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChDUllQVE9fYWRkKCZyc2EtPnJlZmVyZW5jZXMsIC0xLCBDUllQVE9fTE9DS19SU0EpID4gMCkgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChyc2EtPm1ldGgtPmZpbmlzaCkgeworICAgIHJzYS0+bWV0aC0+ZmluaXNoKHJzYSk7CisgIH0KKyAgTUVUSE9EX3VucmVmKHJzYS0+bWV0aCk7CisKKyAgQ1JZUFRPX2ZyZWVfZXhfZGF0YShDUllQVE9fRVhfSU5ERVhfRFNBLCByc2EsICZyc2EtPmV4X2RhdGEpOworCisgIGlmIChyc2EtPm4gIT0gTlVMTCkKKyAgICBCTl9jbGVhcl9mcmVlKHJzYS0+bik7CisgIGlmIChyc2EtPmUgIT0gTlVMTCkKKyAgICBCTl9jbGVhcl9mcmVlKHJzYS0+ZSk7CisgIGlmIChyc2EtPmQgIT0gTlVMTCkKKyAgICBCTl9jbGVhcl9mcmVlKHJzYS0+ZCk7CisgIGlmIChyc2EtPnAgIT0gTlVMTCkKKyAgICBCTl9jbGVhcl9mcmVlKHJzYS0+cCk7CisgIGlmIChyc2EtPnEgIT0gTlVMTCkKKyAgICBCTl9jbGVhcl9mcmVlKHJzYS0+cSk7CisgIGlmIChyc2EtPmRtcDEgIT0gTlVMTCkKKyAgICBCTl9jbGVhcl9mcmVlKHJzYS0+ZG1wMSk7CisgIGlmIChyc2EtPmRtcTEgIT0gTlVMTCkKKyAgICBCTl9jbGVhcl9mcmVlKHJzYS0+ZG1xMSk7CisgIGlmIChyc2EtPmlxbXAgIT0gTlVMTCkKKyAgICBCTl9jbGVhcl9mcmVlKHJzYS0+aXFtcCk7CisgIGZvciAodSA9IDA7IHUgPCByc2EtPm51bV9ibGluZGluZ3M7IHUrKykgeworICAgIEJOX0JMSU5ESU5HX2ZyZWUocnNhLT5ibGluZGluZ3NbdV0pOworICB9CisgIGlmIChyc2EtPmJsaW5kaW5ncyAhPSBOVUxMKQorICAgIE9QRU5TU0xfZnJlZShyc2EtPmJsaW5kaW5ncyk7CisgIGlmIChyc2EtPmJsaW5kaW5nc19pbnVzZSAhPSBOVUxMKQorICAgIE9QRU5TU0xfZnJlZShyc2EtPmJsaW5kaW5nc19pbnVzZSk7CisgIE9QRU5TU0xfZnJlZShyc2EpOworfQorCitpbnQgUlNBX3VwX3JlZihSU0EgKnJzYSkgeworICBDUllQVE9fYWRkKCZyc2EtPnJlZmVyZW5jZXMsIDEsIENSWVBUT19MT0NLX1JTQSk7CisgIHJldHVybiAxOworfQorCitpbnQgUlNBX2dlbmVyYXRlX2tleV9leChSU0EgKnJzYSwgaW50IGJpdHMsIEJJR05VTSAqZV92YWx1ZSwgQk5fR0VOQ0IgKmNiKSB7CisgIGlmIChyc2EtPm1ldGgtPmtleWdlbikgeworICAgIHJldHVybiByc2EtPm1ldGgtPmtleWdlbihyc2EsIGJpdHMsIGVfdmFsdWUsIGNiKTsKKyAgfQorCisgIHJldHVybiBSU0FfZGVmYXVsdF9tZXRob2Qua2V5Z2VuKHJzYSwgYml0cywgZV92YWx1ZSwgY2IpOworfQorCitpbnQgUlNBX2VuY3J5cHQoUlNBICpyc2EsIHNpemVfdCAqb3V0X2xlbiwgdWludDhfdCAqb3V0LCBzaXplX3QgbWF4X291dCwKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluX2xlbiwgaW50IHBhZGRpbmcpIHsKKyAgaWYgKHJzYS0+bWV0aC0+ZW5jcnlwdCkgeworICAgIHJldHVybiByc2EtPm1ldGgtPmVuY3J5cHQocnNhLCBvdXRfbGVuLCBvdXQsIG1heF9vdXQsIGluLCBpbl9sZW4sIHBhZGRpbmcpOworICB9CisKKyAgcmV0dXJuIFJTQV9kZWZhdWx0X21ldGhvZC5lbmNyeXB0KHJzYSwgb3V0X2xlbiwgb3V0LCBtYXhfb3V0LCBpbiwgaW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZyk7Cit9CisKK2ludCBSU0FfcHVibGljX2VuY3J5cHQoaW50IGZsZW4sIGNvbnN0IHVpbnQ4X3QgKmZyb20sIHVpbnQ4X3QgKnRvLCBSU0EgKnJzYSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZGRpbmcpIHsKKyAgc2l6ZV90IG91dF9sZW47CisKKyAgaWYgKCFSU0FfZW5jcnlwdChyc2EsICZvdXRfbGVuLCB0bywgUlNBX3NpemUocnNhKSwgZnJvbSwgZmxlbiwgcGFkZGluZykpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICByZXR1cm4gb3V0X2xlbjsKK30KKworaW50IFJTQV9zaWduX3JhdyhSU0EgKnJzYSwgc2l6ZV90ICpvdXRfbGVuLCB1aW50OF90ICpvdXQsIHNpemVfdCBtYXhfb3V0LAorICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluX2xlbiwgaW50IHBhZGRpbmcpIHsKKyAgaWYgKHJzYS0+bWV0aC0+c2lnbl9yYXcpIHsKKyAgICByZXR1cm4gcnNhLT5tZXRoLT5zaWduX3Jhdyhyc2EsIG91dF9sZW4sIG91dCwgbWF4X291dCwgaW4sIGluX2xlbiwgcGFkZGluZyk7CisgIH0KKworICByZXR1cm4gUlNBX2RlZmF1bHRfbWV0aG9kLnNpZ25fcmF3KHJzYSwgb3V0X2xlbiwgb3V0LCBtYXhfb3V0LCBpbiwgaW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmcpOworfQorCitpbnQgUlNBX3ByaXZhdGVfZW5jcnlwdChpbnQgZmxlbiwgY29uc3QgdWludDhfdCAqZnJvbSwgdWludDhfdCAqdG8sIFJTQSAqcnNhLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZGRpbmcpIHsKKyAgc2l6ZV90IG91dF9sZW47CisKKyAgaWYgKCFSU0Ffc2lnbl9yYXcocnNhLCAmb3V0X2xlbiwgdG8sIFJTQV9zaXplKHJzYSksIGZyb20sIGZsZW4sIHBhZGRpbmcpKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmV0dXJuIG91dF9sZW47Cit9CisKK2ludCBSU0FfZGVjcnlwdChSU0EgKnJzYSwgc2l6ZV90ICpvdXRfbGVuLCB1aW50OF90ICpvdXQsIHNpemVfdCBtYXhfb3V0LAorICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5fbGVuLCBpbnQgcGFkZGluZykgeworICBpZiAocnNhLT5tZXRoLT5kZWNyeXB0KSB7CisgICAgcmV0dXJuIHJzYS0+bWV0aC0+ZGVjcnlwdChyc2EsIG91dF9sZW4sIG91dCwgbWF4X291dCwgaW4sIGluX2xlbiwgcGFkZGluZyk7CisgIH0KKworICByZXR1cm4gUlNBX2RlZmF1bHRfbWV0aG9kLmRlY3J5cHQocnNhLCBvdXRfbGVuLCBvdXQsIG1heF9vdXQsIGluLCBpbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nKTsKK30KKworaW50IFJTQV9wcml2YXRlX2RlY3J5cHQoaW50IGZsZW4sIGNvbnN0IHVpbnQ4X3QgKmZyb20sIHVpbnQ4X3QgKnRvLCBSU0EgKnJzYSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWRkaW5nKSB7CisgIHNpemVfdCBvdXRfbGVuOworCisgIGlmICghUlNBX2RlY3J5cHQocnNhLCAmb3V0X2xlbiwgdG8sIFJTQV9zaXplKHJzYSksIGZyb20sIGZsZW4sIHBhZGRpbmcpKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmV0dXJuIG91dF9sZW47Cit9CisKK2ludCBSU0FfdmVyaWZ5X3JhdyhSU0EgKnJzYSwgc2l6ZV90ICpvdXRfbGVuLCB1aW50OF90ICpvdXQsIHNpemVfdCBtYXhfb3V0LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5fbGVuLCBpbnQgcGFkZGluZykgeworICBpZiAocnNhLT5tZXRoLT52ZXJpZnlfcmF3KSB7CisgICAgcmV0dXJuIHJzYS0+bWV0aC0+dmVyaWZ5X3Jhdyhyc2EsIG91dF9sZW4sIG91dCwgbWF4X291dCwgaW4sIGluX2xlbiwgcGFkZGluZyk7CisgIH0KKworICByZXR1cm4gUlNBX2RlZmF1bHRfbWV0aG9kLnZlcmlmeV9yYXcocnNhLCBvdXRfbGVuLCBvdXQsIG1heF9vdXQsIGluLCBpbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nKTsKK30KKworaW50IFJTQV9wdWJsaWNfZGVjcnlwdChpbnQgZmxlbiwgY29uc3QgdWludDhfdCAqZnJvbSwgdWludDhfdCAqdG8sIFJTQSAqcnNhLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFkZGluZykgeworICBzaXplX3Qgb3V0X2xlbjsKKworICBpZiAoIVJTQV92ZXJpZnlfcmF3KHJzYSwgJm91dF9sZW4sIHRvLCBSU0Ffc2l6ZShyc2EpLCBmcm9tLCBmbGVuLCBwYWRkaW5nKSkgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIHJldHVybiBvdXRfbGVuOworfQorCit1bnNpZ25lZCBSU0Ffc2l6ZShjb25zdCBSU0EgKnJzYSkgeworICByZXR1cm4gQk5fbnVtX2J5dGVzKHJzYS0+bik7Cit9CisKK2ludCBSU0FfZ2V0X2V4X25ld19pbmRleChsb25nIGFyZ2wsIHZvaWQgKmFyZ3AsIENSWVBUT19FWF9uZXcgKm5ld19mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgIENSWVBUT19FWF9kdXAgKmR1cF9mdW5jLCBDUllQVE9fRVhfZnJlZSAqZnJlZV9mdW5jKSB7CisgIHJldHVybiBDUllQVE9fZ2V0X2V4X25ld19pbmRleChDUllQVE9fRVhfSU5ERVhfUlNBLCBhcmdsLCBhcmdwLCBuZXdfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cF9mdW5jLCBmcmVlX2Z1bmMpOworfQorCitpbnQgUlNBX3NldF9leF9kYXRhKFJTQSAqZCwgaW50IGlkeCwgdm9pZCAqYXJnKSB7CisgIHJldHVybiBDUllQVE9fc2V0X2V4X2RhdGEoJmQtPmV4X2RhdGEsIGlkeCwgYXJnKTsKK30KKwordm9pZCAqUlNBX2dldF9leF9kYXRhKGNvbnN0IFJTQSAqZCwgaW50IGlkeCkgeworICByZXR1cm4gQ1JZUFRPX2dldF9leF9kYXRhKCZkLT5leF9kYXRhLCBpZHgpOworfQorCisvKiBTU0xfU0lHX0xFTkdUSCBpcyB0aGUgc2l6ZSBvZiBhbiBTU0wvVExTIChwcmlvciB0byBUTFMgMS4yKSBzaWduYXR1cmU6IGl0J3MKKyAqIHRoZSBsZW5ndGggb2YgYW4gTUQ1IGFuZCBTSEExIGhhc2guICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgU1NMX1NJR19MRU5HVEggPSAzNjsKKworLyogcGtjczFfc2lnX3ByZWZpeCBjb250YWlucyB0aGUgQVNOLjEsIERFUiBlbmNvZGVkIHByZWZpeCBmb3IgYSBoYXNoIHRoYXQgaXMKKyAqIHRvIGJlIHNpZ25lZCB3aXRoIFBLQ1MjMS4gKi8KK3N0cnVjdCBwa2NzMV9zaWdfcHJlZml4IHsKKyAgLyogbmlkIGlkZW50aWZpZXMgdGhlIGhhc2ggZnVuY3Rpb24uICovCisgIGludCBuaWQ7CisgIC8qIGxlbiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIHxieXRlc3wgd2hpY2ggYXJlIHZhbGlkLiAqLworICB1aW50OF90IGxlbjsKKyAgLyogYnl0ZXMgY29udGFpbnMgdGhlIERFUiBieXRlcy4gKi8KKyAgdWludDhfdCBieXRlc1sxOV07Cit9OworCisvKiBrUEtDUzFTaWdQcmVmaXhlcyBjb250YWlucyB0aGUgQVNOLjEgcHJlZml4ZXMgZm9yIFBLQ1MjMSBzaWduYXR1cmVzIHdpdGgKKyAqIGRpZmZlcmVudCBoYXNoIGZ1bmN0aW9ucy4gKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGtjczFfc2lnX3ByZWZpeCBrUEtDUzFTaWdQcmVmaXhlc1tdID0geworICAgIHsKKyAgICAgTklEX21kNSwKKyAgICAgMTgsCisgICAgIHsweDMwLCAweDIwLCAweDMwLCAweDBjLCAweDA2LCAweDA4LCAweDJhLCAweDg2LCAweDQ4LCAweDg2LCAweGY3LCAweDBkLAorICAgICAgMHgwMiwgMHgwNSwgMHgwNSwgMHgwMCwgMHgwNCwgMHgxMH0sCisgICAgfSwKKyAgICB7CisgICAgIE5JRF9zaGExLAorICAgICAxNSwKKyAgICAgezB4MzAsIDB4MjEsIDB4MzAsIDB4MDksIDB4MDYsIDB4MDUsIDB4MmIsIDB4MGUsIDB4MDMsIDB4MDIsIDB4MWEsIDB4MDUsCisgICAgICAweDAwLCAweDA0LCAweDE0fSwKKyAgICB9LAorICAgIHsKKyAgICAgTklEX3NoYTIyNCwKKyAgICAgMTksCisgICAgIHsweDMwLCAweDJkLCAweDMwLCAweDBkLCAweDA2LCAweDA5LCAweDYwLCAweDg2LCAweDQ4LCAweDAxLCAweDY1LCAweDAzLAorICAgICAgMHgwNCwgMHgwMiwgMHgwNCwgMHgwNSwgMHgwMCwgMHgwNCwgMHgxY30sCisgICAgfSwKKyAgICB7CisgICAgIE5JRF9zaGEyNTYsCisgICAgIDE5LAorICAgICB7MHgzMCwgMHgzMSwgMHgzMCwgMHgwZCwgMHgwNiwgMHgwOSwgMHg2MCwgMHg4NiwgMHg0OCwgMHgwMSwgMHg2NSwgMHgwMywKKyAgICAgIDB4MDQsIDB4MDIsIDB4MDEsIDB4MDUsIDB4MDAsIDB4MDQsIDB4MjB9LAorICAgIH0sCisgICAgeworICAgICBOSURfc2hhMzg0LAorICAgICAxOSwKKyAgICAgezB4MzAsIDB4NDEsIDB4MzAsIDB4MGQsIDB4MDYsIDB4MDksIDB4NjAsIDB4ODYsIDB4NDgsIDB4MDEsIDB4NjUsIDB4MDMsCisgICAgICAweDA0LCAweDAyLCAweDAyLCAweDA1LCAweDAwLCAweDA0LCAweDMwfSwKKyAgICB9LAorICAgIHsKKyAgICAgTklEX3NoYTUxMiwKKyAgICAgMTksCisgICAgIHsweDMwLCAweDUxLCAweDMwLCAweDBkLCAweDA2LCAweDA5LCAweDYwLCAweDg2LCAweDQ4LCAweDAxLCAweDY1LCAweDAzLAorICAgICAgMHgwNCwgMHgwMiwgMHgwMywgMHgwNSwgMHgwMCwgMHgwNCwgMHg0MH0sCisgICAgfSwKKyAgICB7CisgICAgIE5JRF9yaXBlbWQxNjAsCisgICAgIDE0LAorICAgICB7MHgzMCwgMHgyMCwgMHgzMCwgMHgwOCwgMHgwNiwgMHgwNiwgMHgyOCwgMHhjZiwgMHgwNiwgMHgwMywgMHgwMCwgMHgzMSwKKyAgICAgIDB4MDQsIDB4MTR9LAorICAgIH0sCisgICAgeworICAgICBOSURfdW5kZWYsIDAsIHswfSwKKyAgICB9LAorfTsKKworLyogVE9ETyhmb3JrKTogbW9zdGx5IG5ldyBjb2RlLCBuZWVkcyBjYXJlZnVsIHJldmlldy4gKi8KKworLyogcGtjczFfcHJlZml4ZWRfbXNnIGJ1aWxkcyBhIFBLQ1MjMSwgcHJlZml4ZWQgdmVyc2lvbiBvZiB8bXNnfCBmb3IgdGhlIGdpdmVuCisgKiBoYXNoIGZ1bmN0aW9uIGFuZCBzZXRzIHxvdXRfbXNnfCB0byBwb2ludCB0byBpdC4gT24gc3VjY2Vzc2Z1bCByZXR1cm4sCisgKiB8Km91dF9tc2d8IG1heSBiZSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCwgaWYgc28sIHwqaXNfYWxsb2NlZHwgd2lsbCBiZSAxLiAqLworc3RhdGljIGludCBwa2NzMV9wcmVmaXhlZF9tc2codWludDhfdCAqKm91dF9tc2csIHNpemVfdCAqb3V0X21zZ19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmlzX2FsbG9jZWQsIGludCBoYXNoX25pZCwgY29uc3QgdWludDhfdCAqbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG1zZ19sZW4pIHsKKyAgdW5zaWduZWQgaTsKKyAgY29uc3QgdWludDhfdCogcHJlZml4ID0gTlVMTDsKKyAgdW5zaWduZWQgcHJlZml4X2xlbjsKKyAgdWludDhfdCAqc2lnbmVkX21zZzsKKyAgdW5zaWduZWQgc2lnbmVkX21zZ19sZW47CisKKyAgaWYgKGhhc2hfbmlkID09IE5JRF9tZDVfc2hhMSkgeworICAgIC8qIFNwZWNpYWwgY2FzZTogU1NMIHNpZ25hdHVyZSwganVzdCBjaGVjayB0aGUgbGVuZ3RoLiAqLworICAgIGlmIChtc2dfbGVuICE9IFNTTF9TSUdfTEVOR1RIKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9zaWduLCBSU0FfUl9JTlZBTElEX01FU1NBR0VfTEVOR1RIKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgICpvdXRfbXNnID0gKHVpbnQ4X3QqKSBtc2c7CisgICAgKm91dF9tc2dfbGVuID0gU1NMX1NJR19MRU5HVEg7CisgICAgKmlzX2FsbG9jZWQgPSAwOworICAgIHJldHVybiAxOworICB9CisKKyAgZm9yIChpID0gMDsga1BLQ1MxU2lnUHJlZml4ZXNbaV0ubmlkICE9IE5JRF91bmRlZjsgaSsrKSB7CisgICAgY29uc3Qgc3RydWN0IHBrY3MxX3NpZ19wcmVmaXggKnNpZ19wcmVmaXggPSAma1BLQ1MxU2lnUHJlZml4ZXNbaV07CisgICAgaWYgKHNpZ19wcmVmaXgtPm5pZCA9PSBoYXNoX25pZCkgeworICAgICAgcHJlZml4ID0gc2lnX3ByZWZpeC0+Ynl0ZXM7CisgICAgICBwcmVmaXhfbGVuID0gc2lnX3ByZWZpeC0+bGVuOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKHByZWZpeCA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0Ffc2lnbiwgUlNBX1JfVU5LTk9XTl9BTEdPUklUSE1fVFlQRSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBzaWduZWRfbXNnX2xlbiA9IHByZWZpeF9sZW4gKyBtc2dfbGVuOworICBpZiAoc2lnbmVkX21zZ19sZW4gPCBwcmVmaXhfbGVuKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0Ffc2lnbiwgUlNBX1JfVE9PX0xPTkcpOworICAgIHJldHVybiAwOworICB9CisKKyAgc2lnbmVkX21zZyA9IE9QRU5TU0xfbWFsbG9jKHNpZ25lZF9tc2dfbGVuKTsKKyAgaWYgKCFzaWduZWRfbXNnKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0Ffc2lnbiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIHJldHVybiAwOworICB9CisKKyAgbWVtY3B5KHNpZ25lZF9tc2csIHByZWZpeCwgcHJlZml4X2xlbik7CisgIG1lbWNweShzaWduZWRfbXNnICsgcHJlZml4X2xlbiwgbXNnLCBtc2dfbGVuKTsKKworICAqb3V0X21zZyA9IHNpZ25lZF9tc2c7CisgICpvdXRfbXNnX2xlbiA9IHNpZ25lZF9tc2dfbGVuOworICAqaXNfYWxsb2NlZCA9IDE7CisKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBSU0Ffc2lnbihpbnQgaGFzaF9uaWQsIGNvbnN0IHVpbnQ4X3QgKmluLCB1bnNpZ25lZCBpbl9sZW4sIHVpbnQ4X3QgKm91dCwKKyAgICAgICAgICAgICB1bnNpZ25lZCAqb3V0X2xlbiwgUlNBICpyc2EpIHsKKyAgY29uc3QgdW5zaWduZWQgcnNhX3NpemUgPSBSU0Ffc2l6ZShyc2EpOworICBpbnQgcmV0ID0gMDsKKyAgdWludDhfdCAqc2lnbmVkX21zZzsKKyAgc2l6ZV90IHNpZ25lZF9tc2dfbGVuOworICBpbnQgc2lnbmVkX21zZ19pc19hbGxvY2VkID0gMDsKKyAgc2l6ZV90IHNpemVfdF9vdXRfbGVuOworCisgIGlmIChyc2EtPm1ldGgtPnNpZ24pIHsKKyAgICByZXR1cm4gcnNhLT5tZXRoLT5zaWduKGhhc2hfbmlkLCBpbiwgaW5fbGVuLCBvdXQsIG91dF9sZW4sIHJzYSk7CisgIH0KKworICBpZiAoIXBrY3MxX3ByZWZpeGVkX21zZygmc2lnbmVkX21zZywgJnNpZ25lZF9tc2dfbGVuLCAmc2lnbmVkX21zZ19pc19hbGxvY2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX25pZCwgaW4sIGluX2xlbikpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChyc2Ffc2l6ZSA8IFJTQV9QS0NTMV9QQURESU5HX1NJWkUgfHwKKyAgICAgIHNpZ25lZF9tc2dfbGVuID4gcnNhX3NpemUgLSBSU0FfUEtDUzFfUEFERElOR19TSVpFKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0Ffc2lnbiwgUlNBX1JfRElHRVNUX1RPT19CSUdfRk9SX1JTQV9LRVkpOworICAgIGdvdG8gZmluaXNoOworICB9CisKKyAgaWYgKFJTQV9zaWduX3Jhdyhyc2EsICZzaXplX3Rfb3V0X2xlbiwgb3V0LCByc2Ffc2l6ZSwgc2lnbmVkX21zZywKKyAgICAgICAgICAgICAgICAgICBzaWduZWRfbXNnX2xlbiwgUlNBX1BLQ1MxX1BBRERJTkcpKSB7CisgICAgKm91dF9sZW4gPSBzaXplX3Rfb3V0X2xlbjsKKyAgICByZXQgPSAxOworICB9CisKK2ZpbmlzaDoKKyAgaWYgKHNpZ25lZF9tc2dfaXNfYWxsb2NlZCkgeworICAgIE9QRU5TU0xfZnJlZShzaWduZWRfbXNnKTsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitpbnQgUlNBX3ZlcmlmeShpbnQgaGFzaF9uaWQsIGNvbnN0IHVpbnQ4X3QgKm1zZywgc2l6ZV90IG1zZ19sZW4sCisgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzaWcsIHNpemVfdCBzaWdfbGVuLCBSU0EgKnJzYSkgeworICBjb25zdCBzaXplX3QgcnNhX3NpemUgPSBSU0Ffc2l6ZShyc2EpOworICB1aW50OF90ICpidWYgPSBOVUxMOworICBpbnQgcmV0ID0gMDsKKyAgdWludDhfdCAqc2lnbmVkX21zZyA9IE5VTEw7CisgIHNpemVfdCBzaWduZWRfbXNnX2xlbiwgbGVuOworICBpbnQgc2lnbmVkX21zZ19pc19hbGxvY2VkID0gMDsKKworICBpZiAocnNhLT5tZXRoLT52ZXJpZnkpIHsKKyAgICByZXR1cm4gcnNhLT5tZXRoLT52ZXJpZnkoaGFzaF9uaWQsIG1zZywgbXNnX2xlbiwgc2lnLCBzaWdfbGVuLCByc2EpOworICB9CisKKyAgaWYgKHNpZ19sZW4gIT0gcnNhX3NpemUpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV92ZXJpZnksIFJTQV9SX1dST05HX1NJR05BVFVSRV9MRU5HVEgpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKGhhc2hfbmlkID09IE5JRF9tZDVfc2hhMSAmJiBtc2dfbGVuICE9IFNTTF9TSUdfTEVOR1RIKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfdmVyaWZ5LCBSU0FfUl9JTlZBTElEX01FU1NBR0VfTEVOR1RIKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGJ1ZiA9IE9QRU5TU0xfbWFsbG9jKHJzYV9zaXplKTsKKyAgaWYgKCFidWYpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV92ZXJpZnksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmICghUlNBX3ZlcmlmeV9yYXcocnNhLCAmbGVuLCBidWYsIHJzYV9zaXplLCBzaWcsIHNpZ19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgUlNBX1BLQ1MxX1BBRERJTkcpKSB7CisgICAgZ290byBvdXQ7CisgIH0KKworICBpZiAoIXBrY3MxX3ByZWZpeGVkX21zZygmc2lnbmVkX21zZywgJnNpZ25lZF9tc2dfbGVuLCAmc2lnbmVkX21zZ19pc19hbGxvY2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX25pZCwgbXNnLCBtc2dfbGVuKSkgeworICAgIGdvdG8gb3V0OworICB9CisKKyAgaWYgKGxlbiAhPSBzaWduZWRfbXNnX2xlbiB8fCBDUllQVE9fbWVtY21wKGJ1Ziwgc2lnbmVkX21zZywgbGVuKSAhPSAwKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfdmVyaWZ5LCBSU0FfUl9CQURfU0lHTkFUVVJFKTsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIHJldCA9IDE7CisKK291dDoKKyAgaWYgKGJ1ZiAhPSBOVUxMKSB7CisgICAgT1BFTlNTTF9mcmVlKGJ1Zik7CisgIH0KKyAgaWYgKHNpZ25lZF9tc2dfaXNfYWxsb2NlZCkgeworICAgIE9QRU5TU0xfZnJlZShzaWduZWRfbXNnKTsKKyAgfQorICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3JzYS9yc2EuaCBiL2NyeXB0by9yc2EvcnNhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdiYzA0YQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9yc2EvcnNhLmgKQEAgLTAsMCArMSw0NTkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpZm5kZWYgT1BFTlNTTF9IRUFERVJfUlNBX0gKKyNkZWZpbmUgT1BFTlNTTF9IRUFERVJfUlNBX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvYmFzZS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9lbmdpbmUuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V4X2RhdGEuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIHJzYS5oIGNvbnRhaW5zIGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgZW5jcnlwdGlvbiBhbmQgc2lnbmF0dXJlIHVzaW5nIFJTQS4gKi8KKworCisvKiBBbGxvY2F0aW9uIGFuZCBkZXN0cnVjdGlvbi4gKi8KKworLyogUlNBX25ldyByZXR1cm5zIGEgbmV3LCBlbXB0eSBSU0Egb2JqZWN0IG9yIE5VTEwgb24gZXJyb3IuICovCitSU0EgKlJTQV9uZXcodm9pZCk7CisKKy8qIFJTQV9uZXdfbWV0aG9kIGFjdHMgdGhlIHNhbWUgYXMgfERIX25ld3wgYnV0IHRha2VzIGFuIGV4cGxpY2l0IHxFTkdJTkV8LiAqLworUlNBICpSU0FfbmV3X21ldGhvZChjb25zdCBFTkdJTkUgKmVuZ2luZSk7CisKKy8qIFJTQV9mcmVlIGRlY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB8cnNhfCBhbmQgZnJlZXMgaXQgaWYgdGhlCisgKiByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8gemVyby4gKi8KK3ZvaWQgUlNBX2ZyZWUoUlNBICpyc2EpOworCisvKiBSU0FfdXBfcmVmIGluY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB8cnNhfC4gKi8KK2ludCBSU0FfdXBfcmVmKFJTQSAqcnNhKTsKKworCisvKiBLZXkgZ2VuZXJhdGlvbi4gKi8KKworLyogUlNBX2dlbmVyYXRlX2tleV9leCBnZW5lcmF0ZXMgYSBuZXcgUlNBIGtleSB3aGVyZSB0aGUgbW9kdWx1cyBoYXMgc2l6ZQorICogfGJpdHN8IGFuZCB0aGUgcHVibGljIGV4cG9uZW50IGlzIHxlfC4gSWYgdW5zdXJlLCB8UlNBX0Y0fCBpcyBhIGdvb2QgdmFsdWUKKyAqIGZvciB8ZXwuIElmIHxjYnwgaXMgbm90IE5VTEwgdGhlbiBpdCBpcyBjYWxsZWQgZHVyaW5nIHRoZSBrZXkgZ2VuZXJhdGlvbgorICogcHJvY2Vzcy4gSW4gYWRkaXRpb24gdG8gdGhlIGNhbGxzIGRvY3VtZW50ZWQgZm9yIHxCTl9nZW5lcmF0ZV9wcmltZV9leHwsIGl0CisgKiBpcyBjYWxsZWQgd2l0aCBldmVudD0yIHdoZW4gdGhlIG4ndGggcHJpbWUgaXMgcmVqZWN0ZWQgYXMgdW5zdWl0YWJsZSBhbmQKKyAqIHdpdGggZXZlbnQ9MyB3aGVuIGEgc3VpdGFibGUgdmFsdWUgZm9yIHxwfCBpcyBmb3VuZC4gKi8KK2ludCBSU0FfZ2VuZXJhdGVfa2V5X2V4KFJTQSAqcnNhLCBpbnQgYml0cywgQklHTlVNICplLCBCTl9HRU5DQiAqY2IpOworCisKKy8qIEVuY3J5cHRpb24gLyBEZWNyeXB0aW9uICovCisKKy8qIFBhZGRpbmcgdHlwZXMgZm9yIGVuY3J5cHRpb24uICovCisjZGVmaW5lIFJTQV9QS0NTMV9QQURESU5HIDEKKyNkZWZpbmUgUlNBX1NTTFYyM19QQURESU5HIDIKKyNkZWZpbmUgUlNBX05PX1BBRERJTkcgMworI2RlZmluZSBSU0FfUEtDUzFfT0FFUF9QQURESU5HIDQKKy8qIFJTQV9QS0NTMV9QU1NfUEFERElORyBjYW4gb25seSBiZSB1c2VkIHZpYSB0aGUgRVZQIGludGVyZmFjZS4gKi8KKyNkZWZpbmUgUlNBX1BLQ1MxX1BTU19QQURESU5HIDYKKworLyogUlNBX2VuY3J5cHQgZW5jcnlwdHMgfGluX2xlbnwgYnl0ZXMgZnJvbSB8aW58IHRvIHRoZSBwdWJsaWMga2V5IGZyb20gfHJzYXwKKyAqIGFuZCB3cml0ZXMsIGF0IG1vc3QsIHxtYXhfb3V0fCBieXRlcyBvZiBlbmNyeXB0ZWQgZGF0YSB0byB8b3V0fC4gVGhlCisgKiB8bWF4X291dHwgYXJndW1lbnQgbXVzdCBiZSwgYXQgbGVhc3QsIHxSU0Ffc2l6ZXwgaW4gb3JkZXIgdG8gZW5zdXJlIHN1Y2Nlc3MuCisgKgorICogSXQgcmV0dXJucyAxIG9uIHN1Y2Nlc3Mgb3IgemVybyBvbiBlcnJvci4KKyAqCisgKiBUaGUgfHBhZGRpbmd8IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHRoZSB8UlNBXypfUEFERElOR3wgdmFsdWVzLiBJZiBpbgorICogZG91YnQsIHxSU0FfUEtDUzFfUEFERElOR3wgaXMgdGhlIG1vc3QgY29tbW9uIGJ1dCB8UlNBX1BLQ1MxX09BRVBfUEFERElOR3wKKyAqIGlzIHRoZSBtb3N0IHNlY3VyZS4gKi8KK2ludCBSU0FfZW5jcnlwdChSU0EgKnJzYSwgc2l6ZV90ICpvdXRfbGVuLCB1aW50OF90ICpvdXQsIHNpemVfdCBtYXhfb3V0LAorICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5fbGVuLCBpbnQgcGFkZGluZyk7CisKKy8qIFJTQV9kZWNyeXB0IGRlY3J5cHRzIHxpbl9sZW58IGJ5dGVzIGZyb20gfGlufCB3aXRoIHRoZSBwcml2YXRlIGtleSBmcm9tCisgKiB8cnNhfCBhbmQgd3JpdGVzLCBhdCBtb3N0LCB8bWF4X291dHwgYnl0ZXMgb2YgcGxhaW50ZXh0IHRvIHxvdXR8LiBUaGUKKyAqIHxtYXhfb3V0fCBhcmd1bWVudCBtdXN0IGJlLCBhdCBsZWFzdCwgfFJTQV9zaXplfCBpbiBvcmRlciB0byBlbnN1cmUgc3VjY2Vzcy4KKyAqCisgKiBJdCByZXR1cm5zIDEgb24gc3VjY2VzcyBvciB6ZXJvIG9uIGVycm9yLgorICoKKyAqIFRoZSB8cGFkZGluZ3wgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHxSU0FfKl9QQURESU5HfCB2YWx1ZXMuIElmIGluCisgKiBkb3VidCwgfFJTQV9QS0NTMV9QQURESU5HfCBpcyB0aGUgbW9zdCBjb21tb24gYnV0IHxSU0FfUEtDUzFfT0FFUF9QQURESU5HfAorICogaXMgdGhlIG1vc3Qgc2VjdXJlLiAqLworaW50IFJTQV9kZWNyeXB0KFJTQSAqcnNhLCBzaXplX3QgKm91dF9sZW4sIHVpbnQ4X3QgKm91dCwgc2l6ZV90IG1heF9vdXQsCisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpbl9sZW4sIGludCBwYWRkaW5nKTsKKworLyogUlNBX3B1YmxpY19lbmNyeXB0IGVuY3J5cHRzIHxmbGVufCBieXRlcyBmcm9tIHxmcm9tfCB0byB0aGUgcHVibGljIGtleSBpbgorICogfHJzYXwgYW5kIHdyaXRlcyB0aGUgZW5jcnlwdGVkIGRhdGEgdG8gfHRvfC4gVGhlIHx0b3wgYnVmZmVyIG11c3QgaGF2ZSBhdAorICogbGVhc3QgfFJTQV9zaXplfCBieXRlcyBvZiBzcGFjZS4gSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4sIG9yCisgKiAtMSBvbiBlcnJvci4gVGhlIHxwYWRkaW5nfCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgfFJTQV8qX1BBRERJTkd8CisgKiB2YWx1ZXMuIElmIGluIGRvdWJ0LCB8UlNBX1BLQ1MxX1BBRERJTkd8IGlzIHRoZSBtb3N0IGNvbW1vbiBidXQKKyAqIHxSU0FfUEtDUzFfT0FFUF9QQURESU5HfCBpcyB0aGUgbW9zdCBzZWN1cmUuCisgKgorICogV0FSTklORzogdGhpcyBmdW5jdGlvbiBpcyBkYW5nZXJvdXMgYmVjYXVzZSBpdCBicmVha3MgdGhlIHVzdWFsIHJldHVybiB2YWx1ZQorICogY29udmVudGlvbi4gVXNlIHxSU0FfZW5jcnlwdHwgaW5zdGVhZC4gKi8KK2ludCBSU0FfcHVibGljX2VuY3J5cHQoaW50IGZsZW4sIGNvbnN0IHVpbnQ4X3QgKmZyb20sIHVpbnQ4X3QgKnRvLCBSU0EgKnJzYSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZGRpbmcpOworCisvKiBSU0FfcHJpdmF0ZV9kZWNyeXB0IGRlY3J5cHRzIHxmbGVufCBieXRlcyBmcm9tIHxmcm9tfCB3aXRoIHRoZSBwdWJsaWMga2V5IGluCisgKiB8cnNhfCBhbmQgd3JpdGVzIHRoZSBwbGFpbnRleHQgdG8gfHRvfC4gVGhlIHx0b3wgYnVmZmVyIG11c3QgaGF2ZSBhdAorICogbGVhc3QgfFJTQV9zaXplfCBieXRlcyBvZiBzcGFjZS4gSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4sIG9yCisgKiAtMSBvbiBlcnJvci4gVGhlIHxwYWRkaW5nfCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgfFJTQV8qX1BBRERJTkd8CisgKiB2YWx1ZXMuIElmIGluIGRvdWJ0LCB8UlNBX1BLQ1MxX1BBRERJTkd8IGlzIHRoZSBtb3N0IGNvbW1vbiBidXQKKyAqIHxSU0FfUEtDUzFfT0FFUF9QQURESU5HfCBpcyB0aGUgbW9zdCBzZWN1cmUuCisgKgorICogV0FSTklORzogdGhpcyBmdW5jdGlvbiBpcyBkYW5nZXJvdXMgYmVjYXVzZSBpdCBicmVha3MgdGhlIHVzdWFsIHJldHVybiB2YWx1ZQorICogY29udmVudGlvbi4gVXNlIHxSU0FfZGVjcnlwdHwgaW5zdGVhZC4gKi8KK2ludCBSU0FfcHJpdmF0ZV9kZWNyeXB0KGludCBmbGVuLCBjb25zdCB1aW50OF90ICpmcm9tLCB1aW50OF90ICp0bywgUlNBICpyc2EsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFkZGluZyk7CisKKworLyogU2lnbmluZyAvIFZlcmlmaWNhdGlvbiAqLworCisvKiBSU0Ffc2lnbiBzaWducyB8aW5fbGVufCBieXRlcyBvZiBkaWdlc3QgZnJvbSB8aW58IHdpdGggfHJzYXwgYW5kIHdyaXRlcywgYXQKKyAqIG1vc3QsIHxSU0Ffc2l6ZShyc2EpfCBieXRlcyB0byB8b3V0fC4gT24gc3VjY2Vzc2Z1bCByZXR1cm4sIHRoZSBhY3R1YWwKKyAqIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGlzIHdyaXR0ZW4gdG8gfCpvdXRfbGVufC4KKyAqCisgKiBUaGUgfGhhc2hfbmlkfCBhcmd1bWVudCBpZGVudGlmaWVzIHRoZSBoYXNoIGZ1bmN0aW9uIHVzZWQgdG8gY2FsY3VsYXRlIHxpbnwKKyAqIGFuZCBpcyBlbWJlZGRlZCBpbiB0aGUgcmVzdWx0aW5nIHNpZ25hdHVyZS4gRm9yIGV4YW1wbGUsIGl0IG1pZ2h0IGJlCisgKiB8TklEX3NoYTI1NnwuCisgKgorICogSXQgcmV0dXJucyAxIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24gZXJyb3IuICovCitpbnQgUlNBX3NpZ24oaW50IGhhc2hfbmlkLCBjb25zdCB1aW50OF90ICppbiwgdW5zaWduZWQgaW50IGluX2xlbiwgdWludDhfdCAqb3V0LAorICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqb3V0X2xlbiwgUlNBICpyc2EpOworCisvKiBSU0Ffc2lnbl9yYXcgc2lnbnMgfGluX2xlbnwgYnl0ZXMgZnJvbSB8aW58IHdpdGggdGhlIHB1YmxpYyBrZXkgZnJvbSB8cnNhfAorICogYW5kIHdyaXRlcywgYXQgbW9zdCwgfG1heF9vdXR8IGJ5dGVzIG9mIGVuY3J5cHRlZCBkYXRhIHRvIHxvdXR8LiBUaGUKKyAqIHxtYXhfb3V0fCBhcmd1bWVudCBtdXN0IGJlLCBhdCBsZWFzdCwgfFJTQV9zaXplfCBpbiBvcmRlciB0byBlbnN1cmUgc3VjY2Vzcy4KKyAqCisgKiBJdCByZXR1cm5zIDEgb24gc3VjY2VzcyBvciB6ZXJvIG9uIGVycm9yLgorICoKKyAqIFRoZSB8cGFkZGluZ3wgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHxSU0FfKl9QQURESU5HfCB2YWx1ZXMuIElmIGluCisgKiBkb3VidCwgfFJTQV9QS0NTMV9QQURESU5HfCBpcyB0aGUgbW9zdCBjb21tb24uICovCitpbnQgUlNBX3NpZ25fcmF3KFJTQSAqcnNhLCBzaXplX3QgKm91dF9sZW4sIHVpbnQ4X3QgKm91dCwgc2l6ZV90IG1heF9vdXQsCisgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5fbGVuLCBpbnQgcGFkZGluZyk7CisKKy8qIFJTQV92ZXJpZnkgdmVyaWZpZXMgdGhhdCB8c2lnX2xlbnwgYnl0ZXMgZnJvbSB8c2lnfCBhcmUgYSB2YWxpZCwgUEtDUyMxCisgKiBzaWduYXR1cmUgb2YgfG1zZ19sZW58IGJ5dGVzIGF0IHxtc2d8IGJ5IHxyc2F8LgorICoKKyAqIFRoZSB8aGFzaF9uaWR8IGFyZ3VtZW50IGlkZW50aWZpZXMgdGhlIGhhc2ggZnVuY3Rpb24gdXNlZCB0byBjYWxjdWxhdGUgfGlufAorICogYW5kIGlzIGVtYmVkZGVkIGluIHRoZSByZXN1bHRpbmcgc2lnbmF0dXJlIGluIG9yZGVyIHRvIHByZXZlbnQgaGFzaAorICogY29uZnVzaW9uIGF0dGFja3MuIEZvciBleGFtcGxlLCBpdCBtaWdodCBiZSB8TklEX3NoYTI1NnwuCisgKgorICogSXQgcmV0dXJucyBvbmUgaWYgdGhlIHNpZ25hdHVyZSBpcyB2YWxpZCBhbmQgemVybyBvdGhlcndpc2UuCisgKgorICogV0FSTklORzogdGhpcyBkaWZmZXJzIGZyb20gdGhlIG9yaWdpbmFsLCBPcGVuU1NMIGZ1bmN0aW9uIHdoaWNoIGFkZGl0aW9uYWxseQorICogcmV0dXJuZWQgLTEgb24gZXJyb3IuICovCitpbnQgUlNBX3ZlcmlmeShpbnQgaGFzaF9uaWQsIGNvbnN0IHVpbnQ4X3QgKm1zZywgc2l6ZV90IG1zZ19sZW4sCisgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzaWcsIHNpemVfdCBzaWdfbGVuLCBSU0EgKnJzYSk7CisKKy8qIFJTQV92ZXJpZnlfcmF3IHZlcmlmaWVzIHxpbl9sZW58IGJ5dGVzIG9mIHNpZ25hdHVyZSBmcm9tIHxpbnwgdXNpbmcgdGhlCisgKiBwdWJsaWMga2V5IGZyb20gfHJzYXwgYW5kIHdyaXRlcywgYXQgbW9zdCwgfG1heF9vdXR8IGJ5dGVzIG9mIHBsYWludGV4dCB0bworICogfG91dHwuIFRoZSB8bWF4X291dHwgYXJndW1lbnQgbXVzdCBiZSwgYXQgbGVhc3QsIHxSU0Ffc2l6ZXwgaW4gb3JkZXIgdG8KKyAqIGVuc3VyZSBzdWNjZXNzLgorICoKKyAqIEl0IHJldHVybnMgMSBvbiBzdWNjZXNzIG9yIHplcm8gb24gZXJyb3IuCisgKgorICogVGhlIHxwYWRkaW5nfCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgfFJTQV8qX1BBRERJTkd8IHZhbHVlcy4gSWYgaW4KKyAqIGRvdWJ0LCB8UlNBX1BLQ1MxX1BBRERJTkd8IGlzIHRoZSBtb3N0IGNvbW1vbi4gKi8KK2ludCBSU0FfdmVyaWZ5X3JhdyhSU0EgKnJzYSwgc2l6ZV90ICpvdXRfbGVuLCB1aW50OF90ICpvdXQsIHNpemVfdCBtYXhfb3V0LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5fbGVuLCBpbnQgcGFkZGluZyk7CisKKy8qIFJTQV9wcml2YXRlX2VuY3J5cHQgZW5jcnlwdHMgfGZsZW58IGJ5dGVzIGZyb20gfGZyb218IHdpdGggdGhlIHByaXZhdGUga2V5IGluCisgKiB8cnNhfCBhbmQgd3JpdGVzIHRoZSBlbmNyeXB0ZWQgZGF0YSB0byB8dG98LiBUaGUgfHRvfCBidWZmZXIgbXVzdCBoYXZlIGF0CisgKiBsZWFzdCB8UlNBX3NpemV8IGJ5dGVzIG9mIHNwYWNlLiBJdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiwgb3IKKyAqIC0xIG9uIGVycm9yLiBUaGUgfHBhZGRpbmd8IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHRoZSB8UlNBXypfUEFERElOR3wKKyAqIHZhbHVlcy4gSWYgaW4gZG91YnQsIHxSU0FfUEtDUzFfUEFERElOR3wgaXMgdGhlIG1vc3QgY29tbW9uLgorICoKKyAqIFdBUk5JTkc6IHRoaXMgZnVuY3Rpb24gaXMgZGFuZ2Vyb3VzIGJlY2F1c2UgaXQgYnJlYWtzIHRoZSB1c3VhbCByZXR1cm4gdmFsdWUKKyAqIGNvbnZlbnRpb24uIFVzZSB8UlNBX3NpZ25fcmF3fCBpbnN0ZWFkLiAqLworaW50IFJTQV9wcml2YXRlX2VuY3J5cHQoaW50IGZsZW4sIGNvbnN0IHVpbnQ4X3QgKmZyb20sIHVpbnQ4X3QgKnRvLCBSU0EgKnJzYSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWRkaW5nKTsKKworLyogUlNBX3ByaXZhdGVfZW5jcnlwdCB2ZXJpZmllcyB8ZmxlbnwgYnl0ZXMgb2Ygc2lnbmF0dXJlIGZyb20gfGZyb218IHVzaW5nIHRoZQorICogcHVibGljIGtleSBpbiB8cnNhfCBhbmQgd3JpdGVzIHRoZSBwbGFpbnRleHQgdG8gfHRvfC4gVGhlIHx0b3wgYnVmZmVyIG11c3QKKyAqIGhhdmUgYXQgbGVhc3QgfFJTQV9zaXplfCBieXRlcyBvZiBzcGFjZS4gSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzCisgKiB3cml0dGVuLCBvciAtMSBvbiBlcnJvci4gVGhlIHxwYWRkaW5nfCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0aGUKKyAqIHxSU0FfKl9QQURESU5HfCB2YWx1ZXMuIElmIGluIGRvdWJ0LCB8UlNBX1BLQ1MxX1BBRERJTkd8IGlzIHRoZSBtb3N0IGNvbW1vbi4KKyAqCisgKiBXQVJOSU5HOiB0aGlzIGZ1bmN0aW9uIGlzIGRhbmdlcm91cyBiZWNhdXNlIGl0IGJyZWFrcyB0aGUgdXN1YWwgcmV0dXJuIHZhbHVlCisgKiBjb252ZW50aW9uLiBVc2UgfFJTQV92ZXJpZnlfcmF3fCBpbnN0ZWFkLiAqLworaW50IFJTQV9wdWJsaWNfZGVjcnlwdChpbnQgZmxlbiwgY29uc3QgdWludDhfdCAqZnJvbSwgdWludDhfdCAqdG8sIFJTQSAqcnNhLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFkZGluZyk7CisKKworLyogVXRpbGl0eSBmdW5jdGlvbnMuICovCisKKy8qIFJTQV9zaXplIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgbW9kdWx1cywgd2hpY2ggaXMgYWxzbyB0aGUgc2l6ZQorICogb2YgYSBzaWduYXR1cmUgb2YgZW5jcnlwdGVkIHZhbHVlIHVzaW5nIHxyc2F8LiAqLwordW5zaWduZWQgUlNBX3NpemUoY29uc3QgUlNBICpyc2EpOworCisvKiBSU0FQdWJsaWNLZXlfZHVwIGFsbG9jYXRlcyBhIGZyZXNoIHxSU0F8IGFuZCBjb3BpZXMgdGhlIHByaXZhdGUga2V5IGZyb20KKyAqIHxyc2F8IGludG8gaXQuIEl0IHJldHVybnMgdGhlIGZyZXNoIHxSU0F8IG9iamVjdCwgb3IgTlVMTCBvbiBlcnJvci4gKi8KK1JTQSAqUlNBUHVibGljS2V5X2R1cChjb25zdCBSU0EgKnJzYSk7CisKKy8qIFJTQVByaXZhdGVLZXlfZHVwIGFsbG9jYXRlcyBhIGZyZXNoIHxSU0F8IGFuZCBjb3BpZXMgdGhlIHByaXZhdGUga2V5IGZyb20KKyAqIHxyc2F8IGludG8gaXQuIEl0IHJldHVybnMgdGhlIGZyZXNoIHxSU0F8IG9iamVjdCwgb3IgTlVMTCBvbiBlcnJvci4gKi8KK1JTQSAqUlNBUHJpdmF0ZUtleV9kdXAoY29uc3QgUlNBICpyc2EpOworCisKKy8qIEFTTi4xIGZ1bmN0aW9ucy4gKi8KKworLyogZDJpX1JTQVB1YmxpY0tleSBwYXJzZXMgYW4gQVNOLjEsIERFUi1lbmNvZGVkLCBSU0EgcHVibGljIGtleSBmcm9tIHxsZW58CisgKiBieXRlcyBhdCB8KmlucHwuIElmIHxvdXR8IGlzIG5vdCBOVUxMIHRoZW4sIG9uIGV4aXQsIGEgcG9pbnRlciB0byB0aGUgcmVzdWx0CisgKiBpcyBpbiB8Km91dHwuIElmIHwqb3V0fCBpcyBhbHJlYWR5IG5vbi1OVUxMIG9uIGVudHJ5IHRoZW4gdGhlIHJlc3VsdCBpcworICogd3JpdHRlbiBkaXJlY3RseSBpbnRvIHwqb3V0fCwgb3RoZXJ3aXNlIGEgZnJlc2ggfFJTQXwgaXMgYWxsb2NhdGVkLiBPbgorICogc3VjY2Vzc2Z1bCBleGl0LCB8KmlucHwgaXMgYWR2YW5jZWQgcGFzdCB0aGUgREVSIHN0cnVjdHVyZS4gSXQgcmV0dXJucyB0aGUKKyAqIHJlc3VsdCBvciBOVUxMIG9uIGVycm9yLiAqLworUlNBICpkMmlfUlNBUHVibGljS2V5KFJTQSAqKm91dCwgY29uc3QgdWludDhfdCAqKmlucCwgbG9uZyBsZW4pOworCisvKiBpMmRfUlNBUHVibGljS2V5IG1hcnNoYWxzIHxpbnwgdG8gYW4gQVNOLjEsIERFUiBzdHJ1Y3R1cmUuIElmIHxvdXRwfCBpcyBub3QKKyAqIE5VTEwgdGhlbiB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8gfCpvdXRwfCBhbmQgfCpvdXRwfCBpcyBhZHZhbmNlZCBqdXN0IHBhc3QKKyAqIHRoZSBvdXRwdXQuIEl0IHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgcmVzdWx0LCB3aGV0aGVyIHdyaXR0ZW4gb3IKKyAqIG5vdCwgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvci4gKi8KK2ludCBpMmRfUlNBUHVibGljS2V5KGNvbnN0IFJTQSAqaW4sIHVpbnQ4X3QgKipvdXRwKTsKKworLyogZDJpX1JTQVByaXZhdGVLZXkgcGFyc2VzIGFuIEFTTi4xLCBERVItZW5jb2RlZCwgUlNBIHByaXZhdGUga2V5IGZyb20gfGxlbnwKKyAqIGJ5dGVzIGF0IHwqaW5wfC4gSWYgfG91dHwgaXMgbm90IE5VTEwgdGhlbiwgb24gZXhpdCwgYSBwb2ludGVyIHRvIHRoZSByZXN1bHQKKyAqIGlzIGluIHwqb3V0fC4gSWYgfCpvdXR8IGlzIGFscmVhZHkgbm9uLU5VTEwgb24gZW50cnkgdGhlbiB0aGUgcmVzdWx0IGlzCisgKiB3cml0dGVuIGRpcmVjdGx5IGludG8gfCpvdXR8LCBvdGhlcndpc2UgYSBmcmVzaCB8UlNBfCBpcyBhbGxvY2F0ZWQuIE9uCisgKiBzdWNjZXNzZnVsIGV4aXQsIHwqaW5wfCBpcyBhZHZhbmNlZCBwYXN0IHRoZSBERVIgc3RydWN0dXJlLiBJdCByZXR1cm5zIHRoZQorICogcmVzdWx0IG9yIE5VTEwgb24gZXJyb3IuICovCitSU0EgKmQyaV9SU0FQcml2YXRlS2V5KFJTQSAqKm91dCwgY29uc3QgdWludDhfdCAqKmlucCwgbG9uZyBsZW4pOworCisvKiBpMmRfUlNBUHJpdmF0ZUtleSBtYXJzaGFscyB8aW58IHRvIGFuIEFTTi4xLCBERVIgc3RydWN0dXJlLiBJZiB8b3V0cHwgaXMgbm90CisgKiBOVUxMIHRoZW4gdGhlIHJlc3VsdCBpcyB3cml0dGVuIHRvIHwqb3V0cHwgYW5kIHwqb3V0cHwgaXMgYWR2YW5jZWQganVzdCBwYXN0CisgKiB0aGUgb3V0cHV0LiBJdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHJlc3VsdCwgd2hldGhlciB3cml0dGVuIG9yCisgKiBub3QsIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IuICovCitpbnQgaTJkX1JTQVByaXZhdGVLZXkoY29uc3QgUlNBICppbiwgdWludDhfdCAqKm91dHApOworCisKKy8qIGV4X2RhdGEgZnVuY3Rpb25zLgorICoKKyAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgd3JhcHBlcnMuIFNlZSB8ZXhfZGF0YS5ofCBmb3IgZGV0YWlscy4gKi8KKworaW50IFJTQV9nZXRfZXhfbmV3X2luZGV4KGxvbmcgYXJnbCwgdm9pZCAqYXJncCwgQ1JZUFRPX0VYX25ldyAqbmV3X2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1JZUFRPX0VYX2R1cCAqZHVwX2Z1bmMsIENSWVBUT19FWF9mcmVlICpmcmVlX2Z1bmMpOworaW50IFJTQV9zZXRfZXhfZGF0YShSU0EgKnIsIGludCBpZHgsIHZvaWQgKmFyZyk7Cit2b2lkICpSU0FfZ2V0X2V4X2RhdGEoY29uc3QgUlNBICpyLCBpbnQgaWR4KTsKKworCisvKiBSU0FfRkxBR19DQUNIRV9QVUJMSUMgY2F1c2VzIGEgcHJlY29tcHV0ZWQgTW9udGdvbWVyeSBjb250ZXh0IHRvIGJlIGNyZWF0ZWQsCisgKiBvbiBkZW1hbmQsIGZvciB0aGUgcHVibGljIGtleSBvcGVyYXRpb25zLiAqLworI2RlZmluZSBSU0FfRkxBR19DQUNIRV9QVUJMSUMgMgorCisvKiBSU0FfRkxBR19DQUNIRV9QUklWQVRFIGNhdXNlcyBhIHByZWNvbXB1dGVkIE1vbnRnb21lcnkgY29udGV4dCB0byBiZQorICogY3JlYXRlZCwgb24gZGVtYW5kLCBmb3IgdGhlIHByaXZhdGUga2V5IG9wZXJhdGlvbnMuICovCisjZGVmaW5lIFJTQV9GTEFHX0NBQ0hFX1BSSVZBVEUgNAorCisvKiBSU0FfRkxBR19OT19CTElORElORyBkaXNhYmxlcyBibGluZGluZyBvZiBwcml2YXRlIG9wZXJhdGlvbnMuICovCisjZGVmaW5lIFJTQV9GTEFHX05PX0JMSU5ESU5HIDgKKworLyogUlNBX0ZMQUdfRVhUX1BLRVkgbWVhbnMgdGhhdCBwcml2YXRlIGtleSBvcGVyYXRpb25zIHdpbGwgYmUgaGFuZGxlZCBieQorICogfG1vZF9leHB8IGFuZCB0aGF0IHRoZXkgZG8gbm90IGRlcGVuZCBvbiB0aGUgcHJpdmF0ZSBrZXkgY29tcG9uZW50cyBiZWluZworICogcHJlc2VudDogZm9yIGV4YW1wbGUgYSBrZXkgc3RvcmVkIGluIGV4dGVybmFsIGhhcmR3YXJlLiAqLworI2RlZmluZSBSU0FfRkxBR19FWFRfUEtFWSAweDIwCisKKy8qIFJTQV9GTEFHX1NJR05fVkVSIGNhdXNlcyB0aGUgfHNpZ258IGFuZCB8dmVyaWZ5fCBmdW5jdGlvbnMgb2YgfHJzYV9tZXRoX3N0fAorICogdG8gYmUgY2FsbGVkIHdoZW4gc2V0LiAqLworI2RlZmluZSBSU0FfRkxBR19TSUdOX1ZFUiAweDQwCisKKworLyogUlNBIHB1YmxpYyBleHBvbmVudCB2YWx1ZXMuICovCisKKyNkZWZpbmUgUlNBXzMgMHgzCisjZGVmaW5lIFJTQV9GNCAweDEwMDAxCisKKworc3RydWN0IHJzYV9tZXRoX3N0IHsKKyAgc3RydWN0IG9wZW5zc2xfbWV0aG9kX2NvbW1vbl9zdCBjb21tb247CisKKyAgdm9pZCAqYXBwX2RhdGE7CisKKyAgaW50ICgqaW5pdCkoUlNBICpyc2EpOworICBpbnQgKCpmaW5pc2gpKFJTQSAqcnNhKTsKKworICBpbnQgKCpzaWduKShpbnQgdHlwZSwgY29uc3QgdWludDhfdCAqbSwgdW5zaWduZWQgaW50IG1fbGVuZ3RoLAorICAgICAgICAgICAgICB1aW50OF90ICpzaWdyZXQsIHVuc2lnbmVkIGludCAqc2lnbGVuLCBjb25zdCBSU0EgKnJzYSk7CisKKyAgaW50ICgqdmVyaWZ5KShpbnQgZHR5cGUsIGNvbnN0IHVpbnQ4X3QgKm0sIHVuc2lnbmVkIGludCBtX2xlbmd0aCwKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzaWdidWYsIHVuc2lnbmVkIGludCBzaWdsZW4sIGNvbnN0IFJTQSAqcnNhKTsKKworCisgIC8qIFRoZXNlIGZ1bmN0aW9ucyBtaXJyb3IgdGhlIHxSU0FfKnwgZnVuY3Rpb25zIG9mIHRoZSBzYW1lIG5hbWUuICovCisgIGludCAoKmVuY3J5cHQpKFJTQSAqcnNhLCBzaXplX3QgKm91dF9sZW4sIHVpbnQ4X3QgKm91dCwgc2l6ZV90IG1heF9vdXQsCisgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5fbGVuLCBpbnQgcGFkZGluZyk7CisgIGludCAoKnNpZ25fcmF3KShSU0EgKnJzYSwgc2l6ZV90ICpvdXRfbGVuLCB1aW50OF90ICpvdXQsIHNpemVfdCBtYXhfb3V0LAorICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpbl9sZW4sIGludCBwYWRkaW5nKTsKKworICBpbnQgKCpkZWNyeXB0KShSU0EgKnJzYSwgc2l6ZV90ICpvdXRfbGVuLCB1aW50OF90ICpvdXQsIHNpemVfdCBtYXhfb3V0LAorICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluX2xlbiwgaW50IHBhZGRpbmcpOworICBpbnQgKCp2ZXJpZnlfcmF3KShSU0EgKnJzYSwgc2l6ZV90ICpvdXRfbGVuLCB1aW50OF90ICpvdXQsIHNpemVfdCBtYXhfb3V0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluX2xlbiwgaW50IHBhZGRpbmcpOworCisgIGludCAoKm1vZF9leHApKEJJR05VTSAqcjAsIGNvbnN0IEJJR05VTSAqSSwgUlNBICpyc2EsCisgICAgICAgICAgICAgICAgIEJOX0NUWCAqY3R4KTsgLyogQ2FuIGJlIG51bGwgKi8KKyAgaW50ICgqYm5fbW9kX2V4cCkoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqcCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQklHTlVNICptLCBCTl9DVFggKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgQk5fTU9OVF9DVFggKm1fY3R4KTsKKworICBpbnQgZmxhZ3M7CisKKyAgaW50ICgqa2V5Z2VuKShSU0EgKnJzYSwgaW50IGJpdHMsIEJJR05VTSAqZSwgQk5fR0VOQ0IgKmNiKTsKK307CisKKworLyogUHJpdmF0ZSBmdW5jdGlvbnMuICovCisKK3R5cGVkZWYgc3RydWN0IGJuX2JsaW5kaW5nX3N0IEJOX0JMSU5ESU5HOworCitzdHJ1Y3QgcnNhX3N0IHsKKyAgLyogdmVyc2lvbiBpcyBvbmx5IHVzZWQgZHVyaW5nIEFTTi4xIChkZSlzZXJpYWxpc2F0aW9uLiAqLworICBsb25nIHZlcnNpb247CisgIFJTQV9NRVRIT0QgKm1ldGg7CisKKyAgQklHTlVNICpuOworICBCSUdOVU0gKmU7CisgIEJJR05VTSAqZDsKKyAgQklHTlVNICpwOworICBCSUdOVU0gKnE7CisgIEJJR05VTSAqZG1wMTsKKyAgQklHTlVNICpkbXExOworICBCSUdOVU0gKmlxbXA7CisgIC8qIGJlIGNhcmVmdWwgdXNpbmcgdGhpcyBpZiB0aGUgUlNBIHN0cnVjdHVyZSBpcyBzaGFyZWQgKi8KKyAgQ1JZUFRPX0VYX0RBVEEgZXhfZGF0YTsKKyAgaW50IHJlZmVyZW5jZXM7CisgIGludCBmbGFnczsKKworICAvKiBVc2VkIHRvIGNhY2hlIG1vbnRnb21lcnkgdmFsdWVzICovCisgIEJOX01PTlRfQ1RYICpfbWV0aG9kX21vZF9uOworICBCTl9NT05UX0NUWCAqX21ldGhvZF9tb2RfcDsKKyAgQk5fTU9OVF9DVFggKl9tZXRob2RfbW9kX3E7CisKKyAgLyogbnVtX2JsaW5kaW5ncyBjb250YWlucyB0aGUgc2l6ZSBvZiB0aGUgfGJsaW5kaW5nc3wgYW5kIHxibGluZGluZ3NfaW51c2V8CisgICAqIGFycmF5cy4gVGhpcyBtZW1iZXIgYW5kIHRoZSB8YmxpbmRpbmdzX2ludXNlfCBhcnJheSBhcmUgcHJvdGVjdGVkIGJ5CisgICAqIENSWVBUT19MT0NLX1JTQV9CTElORElORy4gKi8KKyAgdW5zaWduZWQgbnVtX2JsaW5kaW5nczsKKyAgLyogYmxpbmRpbmdzIGlzIGFuIGFycmF5IG9mIEJOX0JMSU5ESU5HIHN0cnVjdHVyZXMgdGhhdCBjYW4gYmUgcmVzZXJ2ZWQgYnkgYQorICAgKiB0aHJlYWQgYnkgbG9ja2luZyBDUllQVE9fTE9DS19SU0FfQkxJTkRJTkcgYW5kIGNoYW5naW5nIHRoZSBjb3JyZXNwb25kaW5nCisgICAqIGVsZW1lbnQgaW4gfGJsaW5kaW5nc19pbnVzZXwgZnJvbSAwIHRvIDEuICovCisgIEJOX0JMSU5ESU5HICoqYmxpbmRpbmdzOworICB1bnNpZ25lZCBjaGFyICpibGluZGluZ3NfaW51c2U7Cit9OworCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfSAgLyogZXh0ZXJuIEMgKi8KKyNlbmRpZgorCisjZGVmaW5lIFJTQV9GX1JTQV9wYWRkaW5nX2NoZWNrX25vbmUgMTAwCisjZGVmaW5lIFJTQV9GX1JTQV9wYWRkaW5nX2FkZF9ub25lIDEwMQorI2RlZmluZSBSU0FfRl9SU0FfcGFkZGluZ19jaGVja19QS0NTMV9PQUVQX21nZjEgMTAyCisjZGVmaW5lIFJTQV9GX1JTQV92ZXJpZnlfUEtDUzFfUFNTX21nZjEgMTAzCisjZGVmaW5lIFJTQV9GX1JTQV9wYWRkaW5nX2FkZF9QS0NTMV9QU1NfbWdmMSAxMDQKKyNkZWZpbmUgUlNBX0ZfUlNBX3ZlcmlmeSAxMDUKKyNkZWZpbmUgUlNBX0ZfcnNhX3NldHVwX2JsaW5kaW5nIDEwNgorI2RlZmluZSBSU0FfRl92ZXJpZnlfcmF3IDEwNworI2RlZmluZSBSU0FfRl9SU0FfcGFkZGluZ19hZGRfUEtDUzFfdHlwZV8xIDEwOAorI2RlZmluZSBSU0FfRl9rZXlnZW4gMTA5CisjZGVmaW5lIFJTQV9GX1JTQV9wYWRkaW5nX2FkZF9QS0NTMV9PQUVQX21nZjEgMTEwCisjZGVmaW5lIFJTQV9GX3BrY3MxX3ByZWZpeGVkX21zZyAxMTEKKyNkZWZpbmUgUlNBX0ZfQk5fQkxJTkRJTkdfdXBkYXRlIDExMgorI2RlZmluZSBSU0FfRl9SU0FfcGFkZGluZ19jaGVja19TU0x2MjMgMTEzCisjZGVmaW5lIFJTQV9GX1JTQV9wYWRkaW5nX2FkZF9TU0x2MjMgMTE0CisjZGVmaW5lIFJTQV9GX0JOX0JMSU5ESU5HX25ldyAxMTUKKyNkZWZpbmUgUlNBX0ZfUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX3R5cGVfMiAxMTYKKyNkZWZpbmUgUlNBX0ZfQk5fQkxJTkRJTkdfY29udmVydF9leCAxMTcKKyNkZWZpbmUgUlNBX0ZfQk5fQkxJTkRJTkdfaW52ZXJ0X2V4IDExOAorI2RlZmluZSBSU0FfRl9lbmNyeXB0IDExOQorI2RlZmluZSBSU0FfRl9zaWduX3JhdyAxMjAKKyNkZWZpbmUgUlNBX0ZfUlNBX25ld19tZXRob2QgMTIxCisjZGVmaW5lIFJTQV9GX1JTQV9wYWRkaW5nX2NoZWNrX1BLQ1MxX3R5cGVfMSAxMjIKKyNkZWZpbmUgUlNBX0ZfUlNBX3NpZ24gMTIzCisjZGVmaW5lIFJTQV9GX0JOX0JMSU5ESU5HX2NyZWF0ZV9wYXJhbSAxMjQKKyNkZWZpbmUgUlNBX0ZfZGVjcnlwdCAxMjUKKyNkZWZpbmUgUlNBX0ZfUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfdHlwZV8yIDEyNgorI2RlZmluZSBSU0FfUl9JTlZBTElEX01FU1NBR0VfTEVOR1RIIDEwMAorI2RlZmluZSBSU0FfUl9EQVRBX0dSRUFURVJfVEhBTl9NT0RfTEVOIDEwMQorI2RlZmluZSBSU0FfUl9OT19QVUJMSUNfRVhQT05FTlQgMTAyCisjZGVmaW5lIFJTQV9SX0RBVEFfVE9PX0xBUkdFX0ZPUl9LRVlfU0laRSAxMDMKKyNkZWZpbmUgUlNBX1JfQkxPQ0tfVFlQRV9JU19OT1RfMDEgMTA0CisjZGVmaW5lIFJTQV9SX0RBVEFfVE9PX1NNQUxMX0ZPUl9LRVlfU0laRSAxMDUKKyNkZWZpbmUgUlNBX1JfVU5LTk9XTl9QQURESU5HX1RZUEUgMTA2CisjZGVmaW5lIFJTQV9SX1RPT19NQU5ZX0lURVJBVElPTlMgMTA3CisjZGVmaW5lIFJTQV9SX1NMRU5fUkVDT1ZFUllfRkFJTEVEIDEwOAorI2RlZmluZSBSU0FfUl9XUk9OR19TSUdOQVRVUkVfTEVOR1RIIDEwOQorI2RlZmluZSBSU0FfUl9NT0RVTFVTX1RPT19MQVJHRSAxMTAKKyNkZWZpbmUgUlNBX1JfTlVMTF9CRUZPUkVfQkxPQ0tfTUlTU0lORyAxMTEKKyNkZWZpbmUgUlNBX1JfREFUQV9UT09fTEFSR0UgMTEyCisjZGVmaW5lIFJTQV9SX09VVFBVVF9CVUZGRVJfVE9PX1NNQUxMIDExMworI2RlZmluZSBSU0FfUl9TTEVOX0NIRUNLX0ZBSUxFRCAxMTQKKyNkZWZpbmUgUlNBX1JfRklSU1RfT0NURVRfSU5WQUxJRCAxMTUKKyNkZWZpbmUgUlNBX1JfQkFEX0VfVkFMVUUgMTE2CisjZGVmaW5lIFJTQV9SX0RBVEFfVE9PX0xBUkdFX0ZPUl9NT0RVTFVTIDExNworI2RlZmluZSBSU0FfUl9FTVBUWV9QVUJMSUNfS0VZIDExOAorI2RlZmluZSBSU0FfUl9CQURfUEFEX0JZVEVfQ09VTlQgMTE5CisjZGVmaW5lIFJTQV9SX09BRVBfREVDT0RJTkdfRVJST1IgMTIwCisjZGVmaW5lIFJTQV9SX1RPT19MT05HIDEyMQorI2RlZmluZSBSU0FfUl9CQURfRklYRURfSEVBREVSX0RFQ1JZUFQgMTIyCisjZGVmaW5lIFJTQV9SX0RBVEFfVE9PX1NNQUxMIDEyMworI2RlZmluZSBSU0FfUl9VTktOT1dOX0FMR09SSVRITV9UWVBFIDEyNAorI2RlZmluZSBSU0FfUl9QQURESU5HX0NIRUNLX0ZBSUxFRCAxMjUKKyNkZWZpbmUgUlNBX1JfVEhFX0FTTjFfT0JKRUNUX0lERU5USUZJRVJfSVNfTk9UX0tOT1dOX0ZPUl9USElTX01EIDEyNgorI2RlZmluZSBSU0FfUl9CTE9DS19UWVBFX0lTX05PVF8wMiAxMjcKKyNkZWZpbmUgUlNBX1JfTEFTVF9PQ1RFVF9JTlZBTElEIDEyOAorI2RlZmluZSBSU0FfUl9ESUdFU1RfVE9PX0JJR19GT1JfUlNBX0tFWSAxMjkKKyNkZWZpbmUgUlNBX1JfU1NMVjNfUk9MTEJBQ0tfQVRUQUNLIDEzMAorI2RlZmluZSBSU0FfUl9LRVlfU0laRV9UT09fU01BTEwgMTMxCisjZGVmaW5lIFJTQV9SX0JBRF9TSUdOQVRVUkUgMTMyCisjZGVmaW5lIFJTQV9SX0JOX05PVF9JTklUSUFMSVpFRCAxMzMKKworI2VuZGlmICAvKiBPUEVOU1NMX0hFQURFUl9SU0FfSCAqLwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3JzYS9yc2FfYXNuMS5jIGIvY3J5cHRvL3JzYS9yc2FfYXNuMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNGNiOGEKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vcnNhL3JzYV9hc24xLmMKQEAgLTAsMCArMSwxMjUgQEAKKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDAwLgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9yc2EuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKworI2luY2x1ZGUgImludGVybmFsLmgiCisKKworLyogT3ZlcnJpZGUgdGhlIGRlZmF1bHQgZnJlZSBhbmQgbmV3IG1ldGhvZHMgKi8KK3N0YXRpYyBpbnQgcnNhX2NiKGludCBvcGVyYXRpb24sIEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0LAorICAgICAgICAgICAgICAgICAgdm9pZCAqZXhhcmcpIHsKKyAgaWYgKG9wZXJhdGlvbiA9PSBBU04xX09QX05FV19QUkUpIHsKKyAgICAqcHZhbCA9IChBU04xX1ZBTFVFICopUlNBX25ldygpOworICAgIGlmICgqcHZhbCkgeworICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIHJldHVybiAwOworICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PSBBU04xX09QX0ZSRUVfUFJFKSB7CisgICAgUlNBX2ZyZWUoKFJTQSAqKSpwdmFsKTsKKyAgICAqcHZhbCA9IE5VTEw7CisgICAgcmV0dXJuIDI7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK0FTTjFfU0VRVUVOQ0VfY2IoUlNBUHJpdmF0ZUtleSwgcnNhX2NiKSA9IHsKKyAgQVNOMV9TSU1QTEUoUlNBLCB2ZXJzaW9uLCBMT05HKSwKKyAgQVNOMV9TSU1QTEUoUlNBLCBuLCBCSUdOVU0pLAorICBBU04xX1NJTVBMRShSU0EsIGUsIEJJR05VTSksCisgIEFTTjFfU0lNUExFKFJTQSwgZCwgQklHTlVNKSwKKyAgQVNOMV9TSU1QTEUoUlNBLCBwLCBCSUdOVU0pLAorICBBU04xX1NJTVBMRShSU0EsIHEsIEJJR05VTSksCisgIEFTTjFfU0lNUExFKFJTQSwgZG1wMSwgQklHTlVNKSwKKyAgQVNOMV9TSU1QTEUoUlNBLCBkbXExLCBCSUdOVU0pLAorICBBU04xX1NJTVBMRShSU0EsIGlxbXAsIEJJR05VTSksCit9IEFTTjFfU0VRVUVOQ0VfRU5EX2NiKFJTQSwgUlNBUHJpdmF0ZUtleSk7CisKK0FTTjFfU0VRVUVOQ0VfY2IoUlNBUHVibGljS2V5LCByc2FfY2IpID0geworICAgIEFTTjFfU0lNUExFKFJTQSwgbiwgQklHTlVNKSwKKyAgICBBU04xX1NJTVBMRShSU0EsIGUsIEJJR05VTSksCit9IEFTTjFfU0VRVUVOQ0VfRU5EX2NiKFJTQSwgUlNBUHVibGljS2V5KTsKKworQVNOMV9TRVFVRU5DRShSU0FfUFNTX1BBUkFNUykgPSB7CisgIEFTTjFfRVhQX09QVChSU0FfUFNTX1BBUkFNUywgaGFzaEFsZ29yaXRobSwgWDUwOV9BTEdPUiwwKSwKKyAgQVNOMV9FWFBfT1BUKFJTQV9QU1NfUEFSQU1TLCBtYXNrR2VuQWxnb3JpdGhtLCBYNTA5X0FMR09SLDEpLAorICBBU04xX0VYUF9PUFQoUlNBX1BTU19QQVJBTVMsIHNhbHRMZW5ndGgsIEFTTjFfSU5URUdFUiwyKSwKKyAgQVNOMV9FWFBfT1BUKFJTQV9QU1NfUEFSQU1TLCB0cmFpbGVyRmllbGQsIEFTTjFfSU5URUdFUiwzKSwKK30gQVNOMV9TRVFVRU5DRV9FTkQoUlNBX1BTU19QQVJBTVMpOworCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoUlNBX1BTU19QQVJBTVMpOworCitBU04xX1NFUVVFTkNFKFJTQV9PQUVQX1BBUkFNUykgPSB7CisgIEFTTjFfRVhQX09QVChSU0FfT0FFUF9QQVJBTVMsIGhhc2hGdW5jLCBYNTA5X0FMR09SLCAwKSwKKyAgQVNOMV9FWFBfT1BUKFJTQV9PQUVQX1BBUkFNUywgbWFza0dlbkZ1bmMsIFg1MDlfQUxHT1IsIDEpLAorICBBU04xX0VYUF9PUFQoUlNBX09BRVBfUEFSQU1TLCBwU291cmNlRnVuYywgWDUwOV9BTEdPUiwgMiksCit9IEFTTjFfU0VRVUVOQ0VfRU5EKFJTQV9PQUVQX1BBUkFNUyk7CisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhSU0FfT0FFUF9QQVJBTVMpOworCitJTVBMRU1FTlRfQVNOMV9FTkNPREVfRlVOQ1RJT05TX2NvbnN0X2ZuYW1lKFJTQSwgUlNBUHJpdmF0ZUtleSwgUlNBUHJpdmF0ZUtleSk7CisKK0lNUExFTUVOVF9BU04xX0VOQ09ERV9GVU5DVElPTlNfY29uc3RfZm5hbWUoUlNBLCBSU0FQdWJsaWNLZXksIFJTQVB1YmxpY0tleSk7CisKK1JTQSAqUlNBUHVibGljS2V5X2R1cChjb25zdCBSU0EgKnJzYSkgeworICByZXR1cm4gQVNOMV9pdGVtX2R1cChBU04xX0lURU1fcnB0cihSU0FQdWJsaWNLZXkpLCAoUlNBICopIHJzYSk7Cit9CisKK1JTQSAqUlNBUHJpdmF0ZUtleV9kdXAoY29uc3QgUlNBICpyc2EpIHsKKyAgcmV0dXJuIEFTTjFfaXRlbV9kdXAoQVNOMV9JVEVNX3JwdHIoUlNBUHJpdmF0ZUtleSksIChSU0EgKikgcnNhKTsKK30KZGlmZiAtLWdpdCBhL2NyeXB0by9yc2EvcnNhX2Vycm9yLmMgYi9jcnlwdG8vcnNhL3JzYV9lcnJvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YjEwZDUKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vcnNhL3JzYV9lcnJvci5jCkBAIC0wLDAgKzEsODIgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNCwgR29vZ2xlIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisKKyNpbmNsdWRlICJyc2EuaCIKKworY29uc3QgRVJSX1NUUklOR19EQVRBIFJTQV9lcnJvcl9zdHJpbmdfZGF0YVtdID0geworICB7RVJSX1BBQ0soRVJSX0xJQl9SU0EsIFJTQV9GX0JOX0JMSU5ESU5HX2NvbnZlcnRfZXgsIDApLCAiQk5fQkxJTkRJTkdfY29udmVydF9leCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9SU0EsIFJTQV9GX0JOX0JMSU5ESU5HX2NyZWF0ZV9wYXJhbSwgMCksICJCTl9CTElORElOR19jcmVhdGVfcGFyYW0ifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUlNBLCBSU0FfRl9CTl9CTElORElOR19pbnZlcnRfZXgsIDApLCAiQk5fQkxJTkRJTkdfaW52ZXJ0X2V4In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1JTQSwgUlNBX0ZfQk5fQkxJTkRJTkdfbmV3LCAwKSwgIkJOX0JMSU5ESU5HX25ldyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9SU0EsIFJTQV9GX0JOX0JMSU5ESU5HX3VwZGF0ZSwgMCksICJCTl9CTElORElOR191cGRhdGUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUlNBLCBSU0FfRl9SU0FfbmV3X21ldGhvZCwgMCksICJSU0FfbmV3X21ldGhvZCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9SU0EsIFJTQV9GX1JTQV9wYWRkaW5nX2FkZF9QS0NTMV9PQUVQX21nZjEsIDApLCAiUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX09BRVBfbWdmMSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9SU0EsIFJTQV9GX1JTQV9wYWRkaW5nX2FkZF9QS0NTMV9QU1NfbWdmMSwgMCksICJSU0FfcGFkZGluZ19hZGRfUEtDUzFfUFNTX21nZjEifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUlNBLCBSU0FfRl9SU0FfcGFkZGluZ19hZGRfUEtDUzFfdHlwZV8xLCAwKSwgIlJTQV9wYWRkaW5nX2FkZF9QS0NTMV90eXBlXzEifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUlNBLCBSU0FfRl9SU0FfcGFkZGluZ19hZGRfUEtDUzFfdHlwZV8yLCAwKSwgIlJTQV9wYWRkaW5nX2FkZF9QS0NTMV90eXBlXzIifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUlNBLCBSU0FfRl9SU0FfcGFkZGluZ19hZGRfU1NMdjIzLCAwKSwgIlJTQV9wYWRkaW5nX2FkZF9TU0x2MjMifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUlNBLCBSU0FfRl9SU0FfcGFkZGluZ19hZGRfbm9uZSwgMCksICJSU0FfcGFkZGluZ19hZGRfbm9uZSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9SU0EsIFJTQV9GX1JTQV9wYWRkaW5nX2NoZWNrX1BLQ1MxX09BRVBfbWdmMSwgMCksICJSU0FfcGFkZGluZ19jaGVja19QS0NTMV9PQUVQX21nZjEifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUlNBLCBSU0FfRl9SU0FfcGFkZGluZ19jaGVja19QS0NTMV90eXBlXzEsIDApLCAiUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfdHlwZV8xIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1JTQSwgUlNBX0ZfUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfdHlwZV8yLCAwKSwgIlJTQV9wYWRkaW5nX2NoZWNrX1BLQ1MxX3R5cGVfMiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9SU0EsIFJTQV9GX1JTQV9wYWRkaW5nX2NoZWNrX1NTTHYyMywgMCksICJSU0FfcGFkZGluZ19jaGVja19TU0x2MjMifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUlNBLCBSU0FfRl9SU0FfcGFkZGluZ19jaGVja19ub25lLCAwKSwgIlJTQV9wYWRkaW5nX2NoZWNrX25vbmUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUlNBLCBSU0FfRl9SU0Ffc2lnbiwgMCksICJSU0Ffc2lnbiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9SU0EsIFJTQV9GX1JTQV92ZXJpZnksIDApLCAiUlNBX3ZlcmlmeSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9SU0EsIFJTQV9GX1JTQV92ZXJpZnlfUEtDUzFfUFNTX21nZjEsIDApLCAiUlNBX3ZlcmlmeV9QS0NTMV9QU1NfbWdmMSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9SU0EsIFJTQV9GX2RlY3J5cHQsIDApLCAiZGVjcnlwdCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9SU0EsIFJTQV9GX2VuY3J5cHQsIDApLCAiZW5jcnlwdCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9SU0EsIFJTQV9GX2tleWdlbiwgMCksICJrZXlnZW4ifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUlNBLCBSU0FfRl9wa2NzMV9wcmVmaXhlZF9tc2csIDApLCAicGtjczFfcHJlZml4ZWRfbXNnIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1JTQSwgUlNBX0ZfcnNhX3NldHVwX2JsaW5kaW5nLCAwKSwgInJzYV9zZXR1cF9ibGluZGluZyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9SU0EsIFJTQV9GX3NpZ25fcmF3LCAwKSwgInNpZ25fcmF3In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1JTQSwgUlNBX0ZfdmVyaWZ5X3JhdywgMCksICJ2ZXJpZnlfcmF3In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1JTQSwgMCwgUlNBX1JfQkFEX0VfVkFMVUUpLCAiQkFEX0VfVkFMVUUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUlNBLCAwLCBSU0FfUl9CQURfRklYRURfSEVBREVSX0RFQ1JZUFQpLCAiQkFEX0ZJWEVEX0hFQURFUl9ERUNSWVBUIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1JTQSwgMCwgUlNBX1JfQkFEX1BBRF9CWVRFX0NPVU5UKSwgIkJBRF9QQURfQllURV9DT1VOVCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9SU0EsIDAsIFJTQV9SX0JBRF9TSUdOQVRVUkUpLCAiQkFEX1NJR05BVFVSRSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9SU0EsIDAsIFJTQV9SX0JMT0NLX1RZUEVfSVNfTk9UXzAxKSwgIkJMT0NLX1RZUEVfSVNfTk9UXzAxIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1JTQSwgMCwgUlNBX1JfQkxPQ0tfVFlQRV9JU19OT1RfMDIpLCAiQkxPQ0tfVFlQRV9JU19OT1RfMDIifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUlNBLCAwLCBSU0FfUl9CTl9OT1RfSU5JVElBTElaRUQpLCAiQk5fTk9UX0lOSVRJQUxJWkVEIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1JTQSwgMCwgUlNBX1JfREFUQV9HUkVBVEVSX1RIQU5fTU9EX0xFTiksICJEQVRBX0dSRUFURVJfVEhBTl9NT0RfTEVOIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1JTQSwgMCwgUlNBX1JfREFUQV9UT09fTEFSR0UpLCAiREFUQV9UT09fTEFSR0UifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUlNBLCAwLCBSU0FfUl9EQVRBX1RPT19MQVJHRV9GT1JfS0VZX1NJWkUpLCAiREFUQV9UT09fTEFSR0VfRk9SX0tFWV9TSVpFIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1JTQSwgMCwgUlNBX1JfREFUQV9UT09fTEFSR0VfRk9SX01PRFVMVVMpLCAiREFUQV9UT09fTEFSR0VfRk9SX01PRFVMVVMifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUlNBLCAwLCBSU0FfUl9EQVRBX1RPT19TTUFMTCksICJEQVRBX1RPT19TTUFMTCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9SU0EsIDAsIFJTQV9SX0RBVEFfVE9PX1NNQUxMX0ZPUl9LRVlfU0laRSksICJEQVRBX1RPT19TTUFMTF9GT1JfS0VZX1NJWkUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUlNBLCAwLCBSU0FfUl9ESUdFU1RfVE9PX0JJR19GT1JfUlNBX0tFWSksICJESUdFU1RfVE9PX0JJR19GT1JfUlNBX0tFWSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9SU0EsIDAsIFJTQV9SX0VNUFRZX1BVQkxJQ19LRVkpLCAiRU1QVFlfUFVCTElDX0tFWSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9SU0EsIDAsIFJTQV9SX0ZJUlNUX09DVEVUX0lOVkFMSUQpLCAiRklSU1RfT0NURVRfSU5WQUxJRCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9SU0EsIDAsIFJTQV9SX0lOVkFMSURfTUVTU0FHRV9MRU5HVEgpLCAiSU5WQUxJRF9NRVNTQUdFX0xFTkdUSCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9SU0EsIDAsIFJTQV9SX0tFWV9TSVpFX1RPT19TTUFMTCksICJLRVlfU0laRV9UT09fU01BTEwifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUlNBLCAwLCBSU0FfUl9MQVNUX09DVEVUX0lOVkFMSUQpLCAiTEFTVF9PQ1RFVF9JTlZBTElEIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1JTQSwgMCwgUlNBX1JfTU9EVUxVU19UT09fTEFSR0UpLCAiTU9EVUxVU19UT09fTEFSR0UifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUlNBLCAwLCBSU0FfUl9OT19QVUJMSUNfRVhQT05FTlQpLCAiTk9fUFVCTElDX0VYUE9ORU5UIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1JTQSwgMCwgUlNBX1JfTlVMTF9CRUZPUkVfQkxPQ0tfTUlTU0lORyksICJOVUxMX0JFRk9SRV9CTE9DS19NSVNTSU5HIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1JTQSwgMCwgUlNBX1JfT0FFUF9ERUNPRElOR19FUlJPUiksICJPQUVQX0RFQ09ESU5HX0VSUk9SIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1JTQSwgMCwgUlNBX1JfT1VUUFVUX0JVRkZFUl9UT09fU01BTEwpLCAiT1VUUFVUX0JVRkZFUl9UT09fU01BTEwifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUlNBLCAwLCBSU0FfUl9QQURESU5HX0NIRUNLX0ZBSUxFRCksICJQQURESU5HX0NIRUNLX0ZBSUxFRCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9SU0EsIDAsIFJTQV9SX1NMRU5fQ0hFQ0tfRkFJTEVEKSwgIlNMRU5fQ0hFQ0tfRkFJTEVEIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1JTQSwgMCwgUlNBX1JfU0xFTl9SRUNPVkVSWV9GQUlMRUQpLCAiU0xFTl9SRUNPVkVSWV9GQUlMRUQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUlNBLCAwLCBSU0FfUl9TU0xWM19ST0xMQkFDS19BVFRBQ0spLCAiU1NMVjNfUk9MTEJBQ0tfQVRUQUNLIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1JTQSwgMCwgUlNBX1JfVEhFX0FTTjFfT0JKRUNUX0lERU5USUZJRVJfSVNfTk9UX0tOT1dOX0ZPUl9USElTX01EKSwgIlRIRV9BU04xX09CSkVDVF9JREVOVElGSUVSX0lTX05PVF9LTk9XTl9GT1JfVEhJU19NRCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9SU0EsIDAsIFJTQV9SX1RPT19MT05HKSwgIlRPT19MT05HIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1JTQSwgMCwgUlNBX1JfVE9PX01BTllfSVRFUkFUSU9OUyksICJUT09fTUFOWV9JVEVSQVRJT05TIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1JTQSwgMCwgUlNBX1JfVU5LTk9XTl9BTEdPUklUSE1fVFlQRSksICJVTktOT1dOX0FMR09SSVRITV9UWVBFIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1JTQSwgMCwgUlNBX1JfVU5LTk9XTl9QQURESU5HX1RZUEUpLCAiVU5LTk9XTl9QQURESU5HX1RZUEUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfUlNBLCAwLCBSU0FfUl9XUk9OR19TSUdOQVRVUkVfTEVOR1RIKSwgIldST05HX1NJR05BVFVSRV9MRU5HVEgifSwKKyAgezAsIE5VTEx9LAorfTsKZGlmZiAtLWdpdCBhL2NyeXB0by9yc2EvcnNhX2ltcGwuYyBiL2NyeXB0by9yc2EvcnNhX2ltcGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2FlZDlmCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3JzYS9yc2FfaW1wbC5jCkBAIC0wLDAgKzEsMTAwNiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworCisjZGVmaW5lIE9QRU5TU0xfUlNBX01BWF9NT0RVTFVTX0JJVFMgMTYzODQKKyNkZWZpbmUgT1BFTlNTTF9SU0FfU01BTExfTU9EVUxVU19CSVRTIDMwNzIKKyNkZWZpbmUgT1BFTlNTTF9SU0FfTUFYX1BVQkVYUF9CSVRTIFwKKyAgNjQgLyogZXhwb25lbnQgbGltaXQgZW5mb3JjZWQgZm9yICJsYXJnZSIgbW9kdWx1cyBvbmx5ICovCisKKworc3RhdGljIGludCBmaW5pc2goUlNBICpyc2EpIHsKKyAgaWYgKHJzYS0+X21ldGhvZF9tb2RfbiAhPSBOVUxMKSB7CisgICAgQk5fTU9OVF9DVFhfZnJlZShyc2EtPl9tZXRob2RfbW9kX24pOworICB9CisgIGlmIChyc2EtPl9tZXRob2RfbW9kX3AgIT0gTlVMTCkgeworICAgIEJOX01PTlRfQ1RYX2ZyZWUocnNhLT5fbWV0aG9kX21vZF9wKTsKKyAgfQorICBpZiAocnNhLT5fbWV0aG9kX21vZF9xICE9IE5VTEwpIHsKKyAgICBCTl9NT05UX0NUWF9mcmVlKHJzYS0+X21ldGhvZF9tb2RfcSk7CisgIH0KKworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBlbmNyeXB0KFJTQSAqcnNhLCBzaXplX3QgKm91dF9sZW4sIHVpbnQ4X3QgKm91dCwgc2l6ZV90IG1heF9vdXQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpbl9sZW4sIGludCBwYWRkaW5nKSB7CisgIGNvbnN0IHVuc2lnbmVkIHJzYV9zaXplID0gUlNBX3NpemUocnNhKTsKKyAgdW5zaWduZWQgaSwgaiwgazsKKyAgQklHTlVNICpmLCAqcmVzdWx0OworICB1aW50OF90ICpidWYgPSBOVUxMOworICBCTl9DVFggKmN0eCA9IE5VTEw7CisgIGludCByZXQgPSAwOworCisgIGlmIChyc2Ffc2l6ZSA+IE9QRU5TU0xfUlNBX01BWF9NT0RVTFVTX0JJVFMpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIGVuY3J5cHQsIFJTQV9SX01PRFVMVVNfVE9PX0xBUkdFKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChtYXhfb3V0IDwgcnNhX3NpemUpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIGVuY3J5cHQsIFJTQV9SX09VVFBVVF9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChCTl91Y21wKHJzYS0+biwgcnNhLT5lKSA8PSAwKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBlbmNyeXB0LCBSU0FfUl9CQURfRV9WQUxVRSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiBmb3IgbGFyZ2UgbW9kdWxpLCBlbmZvcmNlIGV4cG9uZW50IGxpbWl0ICovCisgIGlmIChCTl9udW1fYml0cyhyc2EtPm4pID4gT1BFTlNTTF9SU0FfU01BTExfTU9EVUxVU19CSVRTICYmCisgICAgICBCTl9udW1fYml0cyhyc2EtPmUpID4gT1BFTlNTTF9SU0FfTUFYX1BVQkVYUF9CSVRTKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBlbmNyeXB0LCBSU0FfUl9CQURfRV9WQUxVRSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBjdHggPSBCTl9DVFhfbmV3KCk7CisgIGlmIChjdHggPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgQk5fQ1RYX3N0YXJ0KGN0eCk7CisgIGYgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIHJlc3VsdCA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgYnVmID0gT1BFTlNTTF9tYWxsb2MocnNhX3NpemUpOworICBpZiAoIWYgfHwgIXJlc3VsdCB8fCAhYnVmKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBlbmNyeXB0LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgZ290byBlcnI7CisgIH0KKworICBzd2l0Y2ggKHBhZGRpbmcpIHsKKyAgICBjYXNlIFJTQV9QS0NTMV9QQURESU5HOgorICAgICAgaSA9IFJTQV9wYWRkaW5nX2FkZF9QS0NTMV90eXBlXzIoYnVmLCByc2Ffc2l6ZSwgaW4sIGluX2xlbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJTQV9QS0NTMV9PQUVQX1BBRERJTkc6CisgICAgICBpID0gUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX09BRVAoYnVmLCByc2Ffc2l6ZSwgaW4sIGluX2xlbiwgTlVMTCwgMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJTQV9TU0xWMjNfUEFERElORzoKKyAgICAgIGkgPSBSU0FfcGFkZGluZ19hZGRfU1NMdjIzKGJ1ZiwgcnNhX3NpemUsIGluLCBpbl9sZW4pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBSU0FfTk9fUEFERElORzoKKyAgICAgIGkgPSBSU0FfcGFkZGluZ19hZGRfbm9uZShidWYsIHJzYV9zaXplLCBpbiwgaW5fbGVuKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIGVuY3J5cHQsIFJTQV9SX1VOS05PV05fUEFERElOR19UWVBFKTsKKyAgICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKGkgPD0gMCkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKEJOX2JpbjJibihidWYsIHJzYV9zaXplLCBmKSA9PSBOVUxMKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAoQk5fdWNtcChmLCByc2EtPm4pID49IDApIHsKKyAgICAvKiB1c3VhbGx5IHRoZSBwYWRkaW5nIGZ1bmN0aW9ucyB3b3VsZCBjYXRjaCB0aGlzICovCisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBlbmNyeXB0LCBSU0FfUl9EQVRBX1RPT19MQVJHRV9GT1JfTU9EVUxVUyk7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAocnNhLT5mbGFncyAmIFJTQV9GTEFHX0NBQ0hFX1BVQkxJQykgeworICAgIGlmICghQk5fTU9OVF9DVFhfc2V0X2xvY2tlZCgmcnNhLT5fbWV0aG9kX21vZF9uLCBDUllQVE9fTE9DS19SU0EsIHJzYS0+biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4KSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICB9CisKKyAgaWYgKCFyc2EtPm1ldGgtPmJuX21vZF9leHAocmVzdWx0LCBmLCByc2EtPmUsIHJzYS0+biwgY3R4LCByc2EtPl9tZXRob2RfbW9kX24pKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICAvKiBwdXQgaW4gbGVhZGluZyAwIGJ5dGVzIGlmIHRoZSBudW1iZXIgaXMgbGVzcyB0aGFuIHRoZSBsZW5ndGggb2YgdGhlCisgICAqIG1vZHVsdXMgKi8KKyAgaiA9IEJOX251bV9ieXRlcyhyZXN1bHQpOworICBpID0gQk5fYm4yYmluKHJlc3VsdCwgJihvdXRbcnNhX3NpemUgLSBqXSkpOworICBmb3IgKGsgPSAwOyBrIDwgcnNhX3NpemUgLSBpOyBrKyspIHsKKyAgICBvdXRba10gPSAwOworICB9CisKKyAgKm91dF9sZW4gPSByc2Ffc2l6ZTsKKyAgcmV0ID0gMTsKKworZXJyOgorICBpZiAoY3R4ICE9IE5VTEwpIHsKKyAgICBCTl9DVFhfZW5kKGN0eCk7CisgICAgQk5fQ1RYX2ZyZWUoY3R4KTsKKyAgfQorICBpZiAoYnVmICE9IE5VTEwpIHsKKyAgICBPUEVOU1NMX2NsZWFuc2UoYnVmLCByc2Ffc2l6ZSk7CisgICAgT1BFTlNTTF9mcmVlKGJ1Zik7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCisvKiBNQVhfQkxJTkRJTkdTX1BFUl9SU0EgZGVmaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2FjaGVkIEJOX0JMSU5ESU5HcyBwZXIKKyAqIFJTQSouIFRoZW4gdGhpcyBsaW1pdCBpcyBleGNlZWRlZCwgQk5fQkxJTkRJTkcgb2JqZWN0cyB3aWxsIGJlIGNyZWF0ZWQgYW5kCisgKiBkZXN0cm95ZWQgYXMgbmVlZGVkLiAqLworI2RlZmluZSBNQVhfQkxJTkRJTkdTX1BFUl9SU0EgMTAyNAorCisvKiByc2FfYmxpbmRpbmdfZ2V0IHJldHVybnMgYSBCTl9CTElORElORyB0byB1c2Ugd2l0aCB8cnNhfC4gSXQgZG9lcyB0aGlzIGJ5CisgKiBhbGxvY2F0aW5nIG9uZSBvZiB0aGUgY2FjaGVkIEJOX0JMSU5ESU5HIG9iamVjdHMgaW4gfHJzYS0+YmxpbmRpbmdzfC4gSWYKKyAqIG5vbmUgYXJlIGZyZWUsIHRoZSBjYWNoZSB3aWxsIGJlIGV4dGVuZGVkIGJ5IGEgZXh0cmEgZWxlbWVudCBhbmQgdGhlIG5ldworICogQk5fQkxJTkRJTkcgaXMgcmV0dXJuZWQuCisgKgorICogT24gc3VjY2VzcywgdGhlIGluZGV4IG9mIHRoZSBhc3NpZ25lZCBCTl9CTElORElORyBpcyB3cml0dGVuIHRvCisgKiB8KmluZGV4X3VzZWR8IGFuZCBtdXN0IGJlIHBhc3NlZCB0byB8cnNhX2JsaW5kaW5nX3JlbGVhc2V8IHdoZW4gZmluaXNoZWQuICovCitzdGF0aWMgQk5fQkxJTkRJTkcgKnJzYV9ibGluZGluZ19nZXQoUlNBICpyc2EsIHVuc2lnbmVkICppbmRleF91c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJOX0NUWCAqY3R4KSB7CisgIEJOX0JMSU5ESU5HICpyZXQgPSBOVUxMOworICBCTl9CTElORElORyAqKm5ld19ibGluZGluZ3M7CisgIHVpbnQ4X3QgKm5ld19ibGluZGluZ3NfaW51c2U7CisgIGNoYXIgb3ZlcmZsb3cgPSAwOworCisgIENSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfUlNBX0JMSU5ESU5HKTsKKyAgaWYgKHJzYS0+bnVtX2JsaW5kaW5ncyA+IDApIHsKKyAgICB1bnNpZ25lZCBpLCBzdGFydGluZ19pbmRleDsKKyAgICBDUllQVE9fVEhSRUFESUQgdGhyZWFkaWQ7CisKKyAgICAvKiBXZSBzdGFydCBzZWFyY2hpbmcgdGhlIGFycmF5IGF0IGEgdmFsdWUgYmFzZWQgb24gdGhlCisgICAgICogdGhyZWFkaWQgaW4gb3JkZXIgdG8gdHJ5IGF2b2lkIGJvdW5jaW5nIHRoZSBCTl9CTElORElORworICAgICAqIHZhbHVlcyBhcm91bmQgZGlmZmVyZW50IHRocmVhZHMuIEl0J3MgaGFybWxlc3MgaWYKKyAgICAgKiB0aHJlYWRpZC52YWwgaXMgYWx3YXlzIHNldCB0byB6ZXJvLiAqLworICAgIENSWVBUT19USFJFQURJRF9jdXJyZW50KCZ0aHJlYWRpZCk7CisgICAgc3RhcnRpbmdfaW5kZXggPSB0aHJlYWRpZC52YWwgJSByc2EtPm51bV9ibGluZGluZ3M7CisKKyAgICBmb3IgKGkgPSBzdGFydGluZ19pbmRleDs7KSB7CisgICAgICBpZiAocnNhLT5ibGluZGluZ3NfaW51c2VbaV0gPT0gMCkgeworICAgICAgICByc2EtPmJsaW5kaW5nc19pbnVzZVtpXSA9IDE7CisgICAgICAgIHJldCA9IHJzYS0+YmxpbmRpbmdzW2ldOworICAgICAgICAqaW5kZXhfdXNlZCA9IGk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaSsrOworICAgICAgaWYgKGkgPT0gcnNhLT5udW1fYmxpbmRpbmdzKSB7CisgICAgICAgIGkgPSAwOworICAgICAgfQorICAgICAgaWYgKGkgPT0gc3RhcnRpbmdfaW5kZXgpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKHJldCAhPSBOVUxMKSB7CisgICAgQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1JTQV9CTElORElORyk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIG92ZXJmbG93ID0gcnNhLT5udW1fYmxpbmRpbmdzID49IE1BWF9CTElORElOR1NfUEVSX1JTQTsKKworICAvKiBXZSBkaWRuJ3QgZmluZCBhIGZyZWUgQk5fQkxJTkRJTkcgdG8gdXNlIHNvIGluY3JlYXNlIHRoZSBsZW5ndGggb2YKKyAgICogdGhlIGFycmF5cyBieSBvbmUgYW5kIHVzZSB0aGUgbmV3bHkgY3JlYXRlZCBlbGVtZW50LiAqLworCisgIENSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19SU0FfQkxJTkRJTkcpOworICByZXQgPSByc2Ffc2V0dXBfYmxpbmRpbmcocnNhLCBjdHgpOworICBpZiAocmV0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmIChvdmVyZmxvdykgeworICAgIC8qIFdlIGNhbm5vdCBhZGQgYW55IG1vcmUgY2FjaGVkIEJOX0JMSU5ESU5HcyBzbyB3ZSB1c2UgfHJldHwKKyAgICAgKiBhbmQgbWFyayBpdCBmb3IgZGVzdHJ1Y3Rpb24gaW4gfHJzYV9ibGluZGluZ19yZWxlYXNlfC4gKi8KKyAgICAqaW5kZXhfdXNlZCA9IE1BWF9CTElORElOR1NfUEVSX1JTQTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19SU0FfQkxJTkRJTkcpOworCisgIG5ld19ibGluZGluZ3MgPQorICAgICAgT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEJOX0JMSU5ESU5HICopICogKHJzYS0+bnVtX2JsaW5kaW5ncyArIDEpKTsKKyAgaWYgKG5ld19ibGluZGluZ3MgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyMTsKKyAgfQorICBtZW1jcHkobmV3X2JsaW5kaW5ncywgcnNhLT5ibGluZGluZ3MsCisgICAgICAgICBzaXplb2YoQk5fQkxJTkRJTkcgKikgKiByc2EtPm51bV9ibGluZGluZ3MpOworICBuZXdfYmxpbmRpbmdzW3JzYS0+bnVtX2JsaW5kaW5nc10gPSByZXQ7CisKKyAgbmV3X2JsaW5kaW5nc19pbnVzZSA9IE9QRU5TU0xfbWFsbG9jKHJzYS0+bnVtX2JsaW5kaW5ncyArIDEpOworICBpZiAobmV3X2JsaW5kaW5nc19pbnVzZSA9PSBOVUxMKSB7CisgICAgZ290byBlcnIyOworICB9CisgIG1lbWNweShuZXdfYmxpbmRpbmdzX2ludXNlLCByc2EtPmJsaW5kaW5nc19pbnVzZSwgcnNhLT5udW1fYmxpbmRpbmdzKTsKKyAgbmV3X2JsaW5kaW5nc19pbnVzZVtyc2EtPm51bV9ibGluZGluZ3NdID0gMTsKKyAgKmluZGV4X3VzZWQgPSByc2EtPm51bV9ibGluZGluZ3M7CisKKyAgaWYgKHJzYS0+YmxpbmRpbmdzICE9IE5VTEwpIHsKKyAgICBPUEVOU1NMX2ZyZWUocnNhLT5ibGluZGluZ3MpOworICB9CisgIHJzYS0+YmxpbmRpbmdzID0gbmV3X2JsaW5kaW5nczsKKyAgaWYgKHJzYS0+YmxpbmRpbmdzX2ludXNlICE9IE5VTEwpIHsKKyAgICBPUEVOU1NMX2ZyZWUocnNhLT5ibGluZGluZ3NfaW51c2UpOworICB9CisgIHJzYS0+YmxpbmRpbmdzX2ludXNlID0gbmV3X2JsaW5kaW5nc19pbnVzZTsKKyAgcnNhLT5udW1fYmxpbmRpbmdzKys7CisKKyAgQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1JTQV9CTElORElORyk7CisgIHJldHVybiByZXQ7CisKK2VycjI6CisgIE9QRU5TU0xfZnJlZShuZXdfYmxpbmRpbmdzKTsKKworZXJyMToKKyAgQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1JTQV9CTElORElORyk7CisgIEJOX0JMSU5ESU5HX2ZyZWUocmV0KTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIHJzYV9ibGluZGluZ19yZWxlYXNlIG1hcmtzIHRoZSBjYWNoZWQgQk5fQkxJTkRJTkcgYXQgdGhlIGdpdmVuIGluZGV4IGFzIGZyZWUKKyAqIGZvciBvdGhlciB0aHJlYWRzIHRvIHVzZS4gKi8KK3N0YXRpYyB2b2lkIHJzYV9ibGluZGluZ19yZWxlYXNlKFJTQSAqcnNhLCBCTl9CTElORElORyAqYmxpbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBibGluZGluZ19pbmRleCkgeworICBpZiAoYmxpbmRpbmdfaW5kZXggPT0gTUFYX0JMSU5ESU5HU19QRVJfUlNBKSB7CisgICAgLyogVGhpcyBibGluZGluZyB3YXNuJ3QgY2FjaGVkLiAqLworICAgIEJOX0JMSU5ESU5HX2ZyZWUoYmxpbmRpbmcpOworICAgIHJldHVybjsKKyAgfQorCisgIENSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfUlNBX0JMSU5ESU5HKTsKKyAgcnNhLT5ibGluZGluZ3NfaW51c2VbYmxpbmRpbmdfaW5kZXhdID0gMDsKKyAgQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1JTQV9CTElORElORyk7Cit9CisKKy8qIHNpZ25pbmcgKi8KK3N0YXRpYyBpbnQgc2lnbl9yYXcoUlNBICpyc2EsIHNpemVfdCAqb3V0X2xlbiwgdWludDhfdCAqb3V0LCBzaXplX3QgbWF4X291dCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpbl9sZW4sIGludCBwYWRkaW5nKSB7CisgIGNvbnN0IHVuc2lnbmVkIHJzYV9zaXplID0gUlNBX3NpemUocnNhKTsKKyAgQklHTlVNICpmLCAqcmVzdWx0OworICB1bnNpZ25lZCBpLCBqLCBrOworICB1aW50OF90ICpidWYgPSBOVUxMOworICBCTl9DVFggKmN0eCA9IE5VTEw7CisgIHVuc2lnbmVkIGJsaW5kaW5nX2luZGV4ID0gMDsKKyAgQk5fQkxJTkRJTkcgKmJsaW5kaW5nID0gTlVMTDsKKyAgaW50IHJldCA9IDA7CisKKyAgaWYgKG1heF9vdXQgPCByc2Ffc2l6ZSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgc2lnbl9yYXcsIFJTQV9SX09VVFBVVF9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGN0eCA9IEJOX0NUWF9uZXcoKTsKKyAgaWYgKGN0eCA9PSBOVUxMKSB7CisgICAgZ290byBlcnI7CisgIH0KKyAgQk5fQ1RYX3N0YXJ0KGN0eCk7CisgIGYgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIHJlc3VsdCA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgYnVmID0gT1BFTlNTTF9tYWxsb2MocnNhX3NpemUpOworICBpZiAoIWYgfHwgIXJlc3VsdCB8fCAhYnVmKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBzaWduX3JhdywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgc3dpdGNoIChwYWRkaW5nKSB7CisgICAgY2FzZSBSU0FfUEtDUzFfUEFERElORzoKKyAgICAgIGkgPSBSU0FfcGFkZGluZ19hZGRfUEtDUzFfdHlwZV8xKGJ1ZiwgcnNhX3NpemUsIGluLCBpbl9sZW4pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBSU0FfTk9fUEFERElORzoKKyAgICAgIGkgPSBSU0FfcGFkZGluZ19hZGRfbm9uZShidWYsIHJzYV9zaXplLCBpbiwgaW5fbGVuKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIHNpZ25fcmF3LCBSU0FfUl9VTktOT1dOX1BBRERJTkdfVFlQRSk7CisgICAgICBnb3RvIGVycjsKKyAgfQorICBpZiAoaSA8PSAwKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAoQk5fYmluMmJuKGJ1ZiwgcnNhX3NpemUsIGYpID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmIChCTl91Y21wKGYsIHJzYS0+bikgPj0gMCkgeworICAgIC8qIHVzdWFsbHkgdGhlIHBhZGRpbmcgZnVuY3Rpb25zIHdvdWxkIGNhdGNoIHRoaXMgKi8KKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIHNpZ25fcmF3LCBSU0FfUl9EQVRBX1RPT19MQVJHRV9GT1JfTU9EVUxVUyk7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAoIShyc2EtPmZsYWdzICYgUlNBX0ZMQUdfTk9fQkxJTkRJTkcpKSB7CisgICAgYmxpbmRpbmcgPSByc2FfYmxpbmRpbmdfZ2V0KHJzYSwgJmJsaW5kaW5nX2luZGV4LCBjdHgpOworICAgIGlmIChibGluZGluZyA9PSBOVUxMKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIHNpZ25fcmF3LCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgaWYgKCFCTl9CTElORElOR19jb252ZXJ0X2V4KGYsIE5VTEwsIGJsaW5kaW5nLCBjdHgpKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0KKworICBpZiAoKHJzYS0+ZmxhZ3MgJiBSU0FfRkxBR19FWFRfUEtFWSkgfHwKKyAgICAgICgocnNhLT5wICE9IE5VTEwpICYmIChyc2EtPnEgIT0gTlVMTCkgJiYgKHJzYS0+ZG1wMSAhPSBOVUxMKSAmJgorICAgICAgIChyc2EtPmRtcTEgIT0gTlVMTCkgJiYgKHJzYS0+aXFtcCAhPSBOVUxMKSkpIHsKKyAgICBpZiAoIXJzYS0+bWV0aC0+bW9kX2V4cChyZXN1bHQsIGYsIHJzYSwgY3R4KSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICB9IGVsc2UgeworICAgIEJJR05VTSBsb2NhbF9kOworICAgIEJJR05VTSAqZCA9IE5VTEw7CisKKyAgICBCTl9pbml0KCZsb2NhbF9kKTsKKyAgICBkID0gJmxvY2FsX2Q7CisgICAgQk5fd2l0aF9mbGFncyhkLCByc2EtPmQsIEJOX0ZMR19DT05TVFRJTUUpOworCisgICAgaWYgKHJzYS0+ZmxhZ3MgJiBSU0FfRkxBR19DQUNIRV9QVUJMSUMpIHsKKyAgICAgIGlmICghQk5fTU9OVF9DVFhfc2V0X2xvY2tlZCgmcnNhLT5fbWV0aG9kX21vZF9uLCBDUllQVE9fTE9DS19SU0EsIHJzYS0+biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgpKSB7CisgICAgICAgIGdvdG8gZXJyOworICAgICAgfQorICAgIH0KKworICAgIGlmICghcnNhLT5tZXRoLT5ibl9tb2RfZXhwKHJlc3VsdCwgZiwgZCwgcnNhLT5uLCBjdHgsIHJzYS0+X21ldGhvZF9tb2RfbikpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfQorCisgIGlmIChibGluZGluZykgeworICAgIGlmICghQk5fQkxJTkRJTkdfaW52ZXJ0X2V4KHJlc3VsdCwgTlVMTCwgYmxpbmRpbmcsIGN0eCkpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfQorCisgIC8qIHB1dCBpbiBsZWFkaW5nIDAgYnl0ZXMgaWYgdGhlIG51bWJlciBpcyBsZXNzIHRoYW4gdGhlCisgICAqIGxlbmd0aCBvZiB0aGUgbW9kdWx1cyAqLworICBqID0gQk5fbnVtX2J5dGVzKHJlc3VsdCk7CisgIGkgPSBCTl9ibjJiaW4ocmVzdWx0LCAmKG91dFtyc2Ffc2l6ZSAtIGpdKSk7CisgIGZvciAoayA9IDA7IGsgPCByc2Ffc2l6ZSAtIGk7IGsrKykgeworICAgIG91dFtrXSA9IDA7CisgIH0KKworICAqb3V0X2xlbiA9IHJzYV9zaXplOworICByZXQgPSAxOworCitlcnI6CisgIGlmIChjdHggIT0gTlVMTCkgeworICAgIEJOX0NUWF9lbmQoY3R4KTsKKyAgICBCTl9DVFhfZnJlZShjdHgpOworICB9CisgIGlmIChidWYgIT0gTlVMTCkgeworICAgIE9QRU5TU0xfY2xlYW5zZShidWYsIHJzYV9zaXplKTsKKyAgICBPUEVOU1NMX2ZyZWUoYnVmKTsKKyAgfQorICBpZiAoYmxpbmRpbmcgIT0gTlVMTCkgeworICAgIHJzYV9ibGluZGluZ19yZWxlYXNlKHJzYSwgYmxpbmRpbmcsIGJsaW5kaW5nX2luZGV4KTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZGVjcnlwdChSU0EgKnJzYSwgc2l6ZV90ICpvdXRfbGVuLCB1aW50OF90ICpvdXQsIHNpemVfdCBtYXhfb3V0LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5fbGVuLCBpbnQgcGFkZGluZykgeworICBjb25zdCB1bnNpZ25lZCByc2Ffc2l6ZSA9IFJTQV9zaXplKHJzYSk7CisgIHVuc2lnbmVkIGo7CisgIEJJR05VTSAqZiwgKnJlc3VsdDsKKyAgaW50IHIgPSAtMTsKKyAgdWludDhfdCAqYnVmID0gTlVMTDsKKyAgQk5fQ1RYICpjdHggPSBOVUxMOworICB1bnNpZ25lZCBibGluZGluZ19pbmRleDsKKyAgQk5fQkxJTkRJTkcgKmJsaW5kaW5nID0gTlVMTDsKKyAgaW50IHJldCA9IDA7CisKKyAgaWYgKG1heF9vdXQgPCByc2Ffc2l6ZSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgZGVjcnlwdCwgUlNBX1JfT1VUUFVUX0JVRkZFUl9UT09fU01BTEwpOworICAgIHJldHVybiAwOworICB9CisKKyAgY3R4ID0gQk5fQ1RYX25ldygpOworICBpZiAoY3R4ID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorICBCTl9DVFhfc3RhcnQoY3R4KTsKKyAgZiA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgcmVzdWx0ID0gQk5fQ1RYX2dldChjdHgpOworICBidWYgPSBPUEVOU1NMX21hbGxvYyhyc2Ffc2l6ZSk7CisgIGlmICghZiB8fCAhcmVzdWx0IHx8ICFidWYpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIGRlY3J5cHQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIC8qIFRoaXMgY2hlY2sgd2FzIGZvciBlcXVhbGl0eSBidXQgUEdQIGRvZXMgZXZpbCB0aGluZ3MKKyAgICogYW5kIGNob3BzIG9mZiB0aGUgdG9wICcwJyBieXRlcy4KKyAgICogVE9ETyhmb3JrKTogaW52ZXN0aWdhdGUgdGhpcy4gKi8KKyAgaWYgKGluX2xlbiA+IHJzYV9zaXplKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBkZWNyeXB0LCBSU0FfUl9EQVRBX0dSRUFURVJfVEhBTl9NT0RfTEVOKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIC8qIG1ha2UgZGF0YSBpbnRvIGEgYmlnIG51bWJlciAqLworICBpZiAoQk5fYmluMmJuKGluLCAoaW50KWluX2xlbiwgZikgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKEJOX3VjbXAoZiwgcnNhLT5uKSA+PSAwKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBkZWNyeXB0LCBSU0FfUl9EQVRBX1RPT19MQVJHRV9GT1JfTU9EVUxVUyk7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAoIShyc2EtPmZsYWdzICYgUlNBX0ZMQUdfTk9fQkxJTkRJTkcpKSB7CisgICAgYmxpbmRpbmcgPSByc2FfYmxpbmRpbmdfZ2V0KHJzYSwgJmJsaW5kaW5nX2luZGV4LCBjdHgpOworICAgIGlmIChibGluZGluZyA9PSBOVUxMKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIGRlY3J5cHQsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBpZiAoIUJOX0JMSU5ESU5HX2NvbnZlcnRfZXgoZiwgTlVMTCwgYmxpbmRpbmcsIGN0eCkpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfQorCisgIC8qIGRvIHRoZSBkZWNyeXB0ICovCisgIGlmICgocnNhLT5mbGFncyAmIFJTQV9GTEFHX0VYVF9QS0VZKSB8fAorICAgICAgKChyc2EtPnAgIT0gTlVMTCkgJiYgKHJzYS0+cSAhPSBOVUxMKSAmJiAocnNhLT5kbXAxICE9IE5VTEwpICYmCisgICAgICAgKHJzYS0+ZG1xMSAhPSBOVUxMKSAmJiAocnNhLT5pcW1wICE9IE5VTEwpKSkgeworICAgIGlmICghcnNhLT5tZXRoLT5tb2RfZXhwKHJlc3VsdCwgZiwgcnNhLCBjdHgpKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgQklHTlVNIGxvY2FsX2Q7CisgICAgQklHTlVNICpkID0gTlVMTDsKKworICAgIGQgPSAmbG9jYWxfZDsKKyAgICBCTl93aXRoX2ZsYWdzKGQsIHJzYS0+ZCwgQk5fRkxHX0NPTlNUVElNRSk7CisKKyAgICBpZiAocnNhLT5mbGFncyAmIFJTQV9GTEFHX0NBQ0hFX1BVQkxJQykgeworICAgICAgaWYgKCFCTl9NT05UX0NUWF9zZXRfbG9ja2VkKCZyc2EtPl9tZXRob2RfbW9kX24sIENSWVBUT19MT0NLX1JTQSwgcnNhLT5uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eCkpIHsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgfQorICAgIGlmICghcnNhLT5tZXRoLT5ibl9tb2RfZXhwKHJlc3VsdCwgZiwgZCwgcnNhLT5uLCBjdHgsIHJzYS0+X21ldGhvZF9tb2RfbikpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfQorCisgIGlmIChibGluZGluZykgeworICAgIGlmICghQk5fQkxJTkRJTkdfaW52ZXJ0X2V4KHJlc3VsdCwgTlVMTCwgYmxpbmRpbmcsIGN0eCkpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfQorCisgIGogPSBCTl9ibjJiaW4ocmVzdWx0LCBidWYpOyAvKiBqIGlzIG9ubHkgdXNlZCB3aXRoIG5vLXBhZGRpbmcgbW9kZSAqLworCisgIHN3aXRjaCAocGFkZGluZykgeworICAgIGNhc2UgUlNBX1BLQ1MxX1BBRERJTkc6CisgICAgICByID0gUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfdHlwZV8yKG91dCwgcnNhX3NpemUsIGJ1ZiwgaiwgcnNhX3NpemUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBSU0FfUEtDUzFfT0FFUF9QQURESU5HOgorICAgICAgciA9IFJTQV9wYWRkaW5nX2NoZWNrX1BLQ1MxX09BRVAob3V0LCByc2Ffc2l6ZSwgYnVmLCBqLCByc2Ffc2l6ZSwgTlVMTCwgMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJTQV9TU0xWMjNfUEFERElORzoKKyAgICAgIHIgPSBSU0FfcGFkZGluZ19jaGVja19TU0x2MjMob3V0LCByc2Ffc2l6ZSwgYnVmLCBqLCByc2Ffc2l6ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJTQV9OT19QQURESU5HOgorICAgICAgciA9IFJTQV9wYWRkaW5nX2NoZWNrX25vbmUob3V0LCByc2Ffc2l6ZSwgYnVmLCBqLCByc2Ffc2l6ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBkZWNyeXB0LCBSU0FfUl9VTktOT1dOX1BBRERJTkdfVFlQRSk7CisgICAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmIChyIDwgMCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgZGVjcnlwdCwgUlNBX1JfUEFERElOR19DSEVDS19GQUlMRUQpOworICB9IGVsc2UgeworICAgICpvdXRfbGVuID0gcjsKKyAgICByZXQgPSAxOworICB9CisKK2VycjoKKyAgaWYgKGN0eCAhPSBOVUxMKSB7CisgICAgQk5fQ1RYX2VuZChjdHgpOworICAgIEJOX0NUWF9mcmVlKGN0eCk7CisgIH0KKyAgaWYgKGJ1ZiAhPSBOVUxMKSB7CisgICAgT1BFTlNTTF9jbGVhbnNlKGJ1ZiwgcnNhX3NpemUpOworICAgIE9QRU5TU0xfZnJlZShidWYpOworICB9CisgIGlmIChibGluZGluZyAhPSBOVUxMKSB7CisgICAgcnNhX2JsaW5kaW5nX3JlbGVhc2UocnNhLCBibGluZGluZywgYmxpbmRpbmdfaW5kZXgpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2ZXJpZnlfcmF3KFJTQSAqcnNhLCBzaXplX3QgKm91dF9sZW4sIHVpbnQ4X3QgKm91dCwgc2l6ZV90IG1heF9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpbl9sZW4sIGludCBwYWRkaW5nKSB7CisgIGNvbnN0IHVuc2lnbmVkIHJzYV9zaXplID0gUlNBX3NpemUocnNhKTsKKyAgQklHTlVNICpmLCAqcmVzdWx0OworICBpbnQgcmV0ID0gMDsKKyAgaW50IGksIHIgPSAtMTsKKyAgdWludDhfdCAqYnVmID0gTlVMTDsKKyAgQk5fQ1RYICpjdHggPSBOVUxMOworCisgIGlmIChCTl9udW1fYml0cyhyc2EtPm4pID4gT1BFTlNTTF9SU0FfTUFYX01PRFVMVVNfQklUUykgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgdmVyaWZ5X3JhdywgUlNBX1JfTU9EVUxVU19UT09fTEFSR0UpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKEJOX3VjbXAocnNhLT5uLCByc2EtPmUpIDw9IDApIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIHZlcmlmeV9yYXcsIFJTQV9SX0JBRF9FX1ZBTFVFKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChtYXhfb3V0IDwgcnNhX3NpemUpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIHZlcmlmeV9yYXcsIFJTQV9SX09VVFBVVF9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8qIGZvciBsYXJnZSBtb2R1bGksIGVuZm9yY2UgZXhwb25lbnQgbGltaXQgKi8KKyAgaWYgKEJOX251bV9iaXRzKHJzYS0+bikgPiBPUEVOU1NMX1JTQV9TTUFMTF9NT0RVTFVTX0JJVFMgJiYKKyAgICAgIEJOX251bV9iaXRzKHJzYS0+ZSkgPiBPUEVOU1NMX1JTQV9NQVhfUFVCRVhQX0JJVFMpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIHZlcmlmeV9yYXcsIFJTQV9SX0JBRF9FX1ZBTFVFKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGN0eCA9IEJOX0NUWF9uZXcoKTsKKyAgaWYgKGN0eCA9PSBOVUxMKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBCTl9DVFhfc3RhcnQoY3R4KTsKKyAgZiA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgcmVzdWx0ID0gQk5fQ1RYX2dldChjdHgpOworICBidWYgPSBPUEVOU1NMX21hbGxvYyhyc2Ffc2l6ZSk7CisgIGlmICghZiB8fCAhcmVzdWx0IHx8ICFidWYpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIHZlcmlmeV9yYXcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIC8qIFRoaXMgY2hlY2sgd2FzIGZvciBlcXVhbGl0eSBidXQgUEdQIGRvZXMgZXZpbCB0aGluZ3MKKyAgICogYW5kIGNob3BzIG9mZiB0aGUgdG9wICcwJyBieXRlcy4KKyAgICogVE9ETyhmb3JrKTogaW52ZXN0aWdhdGUgKi8KKyAgaWYgKGluX2xlbiA+IHJzYV9zaXplKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCB2ZXJpZnlfcmF3LCBSU0FfUl9EQVRBX0dSRUFURVJfVEhBTl9NT0RfTEVOKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmIChCTl9iaW4yYm4oaW4sIGluX2xlbiwgZikgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKEJOX3VjbXAoZiwgcnNhLT5uKSA+PSAwKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCB2ZXJpZnlfcmF3LCBSU0FfUl9EQVRBX1RPT19MQVJHRV9GT1JfTU9EVUxVUyk7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAocnNhLT5mbGFncyAmIFJTQV9GTEFHX0NBQ0hFX1BVQkxJQykgeworICAgIGlmICghQk5fTU9OVF9DVFhfc2V0X2xvY2tlZCgmcnNhLT5fbWV0aG9kX21vZF9uLCBDUllQVE9fTE9DS19SU0EsIHJzYS0+biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4KSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICB9CisKKyAgaWYgKCFyc2EtPm1ldGgtPmJuX21vZF9leHAocmVzdWx0LCBmLCByc2EtPmUsIHJzYS0+biwgY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByc2EtPl9tZXRob2RfbW9kX24pKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBpID0gQk5fYm4yYmluKHJlc3VsdCwgYnVmKTsKKworICBzd2l0Y2ggKHBhZGRpbmcpIHsKKyAgICBjYXNlIFJTQV9QS0NTMV9QQURESU5HOgorICAgICAgciA9IFJTQV9wYWRkaW5nX2NoZWNrX1BLQ1MxX3R5cGVfMShvdXQsIHJzYV9zaXplLCBidWYsIGksIHJzYV9zaXplKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUlNBX05PX1BBRERJTkc6CisgICAgICByID0gUlNBX3BhZGRpbmdfY2hlY2tfbm9uZShvdXQsIHJzYV9zaXplLCBidWYsIGksIHJzYV9zaXplKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIHZlcmlmeV9yYXcsIFJTQV9SX1VOS05PV05fUEFERElOR19UWVBFKTsKKyAgICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKHIgPCAwKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCB2ZXJpZnlfcmF3LCBSU0FfUl9QQURESU5HX0NIRUNLX0ZBSUxFRCk7CisgIH0gZWxzZSB7CisgICAgKm91dF9sZW4gPSByOworICAgIHJldCA9IDE7CisgIH0KKworZXJyOgorICBpZiAoY3R4ICE9IE5VTEwpIHsKKyAgICBCTl9DVFhfZW5kKGN0eCk7CisgICAgQk5fQ1RYX2ZyZWUoY3R4KTsKKyAgfQorICBpZiAoYnVmICE9IE5VTEwpIHsKKyAgICBPUEVOU1NMX2NsZWFuc2UoYnVmLCByc2Ffc2l6ZSk7CisgICAgT1BFTlNTTF9mcmVlKGJ1Zik7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtb2RfZXhwKEJJR05VTSAqcjAsIGNvbnN0IEJJR05VTSAqSSwgUlNBICpyc2EsIEJOX0NUWCAqY3R4KSB7CisgIEJJR05VTSAqcjEsICptMSwgKnZyZnk7CisgIEJJR05VTSBsb2NhbF9kbXAxLCBsb2NhbF9kbXExLCBsb2NhbF9jLCBsb2NhbF9yMTsKKyAgQklHTlVNICpkbXAxLCAqZG1xMSwgKmMsICpwcjE7CisgIGludCByZXQgPSAwOworCisgIEJOX0NUWF9zdGFydChjdHgpOworICByMSA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgbTEgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIHZyZnkgPSBCTl9DVFhfZ2V0KGN0eCk7CisKKyAgeworICAgIEJJR05VTSBsb2NhbF9wLCBsb2NhbF9xOworICAgIEJJR05VTSAqcCA9IE5VTEwsICpxID0gTlVMTDsKKworICAgIC8qIE1ha2Ugc3VyZSBCTl9tb2RfaW52ZXJzZSBpbiBNb250Z29tZXJ5IGludGlhbGl6YXRpb24gdXNlcyB0aGUKKyAgICAgKiBCTl9GTEdfQ09OU1RUSU1FIGZsYWcgKHVubGVzcyBSU0FfRkxBR19OT19DT05TVFRJTUUgaXMgc2V0KSAqLworICAgIEJOX2luaXQoJmxvY2FsX3ApOworICAgIHAgPSAmbG9jYWxfcDsKKyAgICBCTl93aXRoX2ZsYWdzKHAsIHJzYS0+cCwgQk5fRkxHX0NPTlNUVElNRSk7CisKKyAgICBCTl9pbml0KCZsb2NhbF9xKTsKKyAgICBxID0gJmxvY2FsX3E7CisgICAgQk5fd2l0aF9mbGFncyhxLCByc2EtPnEsIEJOX0ZMR19DT05TVFRJTUUpOworCisgICAgaWYgKHJzYS0+ZmxhZ3MgJiBSU0FfRkxBR19DQUNIRV9QUklWQVRFKSB7CisgICAgICBpZiAoIUJOX01PTlRfQ1RYX3NldF9sb2NrZWQoJnJzYS0+X21ldGhvZF9tb2RfcCwgQ1JZUFRPX0xPQ0tfUlNBLCBwLCBjdHgpKSB7CisgICAgICAgIGdvdG8gZXJyOworICAgICAgfQorICAgICAgaWYgKCFCTl9NT05UX0NUWF9zZXRfbG9ja2VkKCZyc2EtPl9tZXRob2RfbW9kX3EsIENSWVBUT19MT0NLX1JTQSwgcSwgY3R4KSkgeworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAocnNhLT5mbGFncyAmIFJTQV9GTEFHX0NBQ0hFX1BVQkxJQykgeworICAgIGlmICghQk5fTU9OVF9DVFhfc2V0X2xvY2tlZCgmcnNhLT5fbWV0aG9kX21vZF9uLCBDUllQVE9fTE9DS19SU0EsIHJzYS0+biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4KSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICB9CisKKyAgLyogY29tcHV0ZSBJIG1vZCBxICovCisgIGMgPSAmbG9jYWxfYzsKKyAgQk5fd2l0aF9mbGFncyhjLCBJLCBCTl9GTEdfQ09OU1RUSU1FKTsKKyAgaWYgKCFCTl9tb2QocjEsIGMsIHJzYS0+cSwgY3R4KSkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgLyogY29tcHV0ZSByMV5kbXExIG1vZCBxICovCisgIGRtcTEgPSAmbG9jYWxfZG1xMTsKKyAgQk5fd2l0aF9mbGFncyhkbXExLCByc2EtPmRtcTEsIEJOX0ZMR19DT05TVFRJTUUpOworICBpZiAoIXJzYS0+bWV0aC0+Ym5fbW9kX2V4cChtMSwgcjEsIGRtcTEsIHJzYS0+cSwgY3R4LCByc2EtPl9tZXRob2RfbW9kX3EpKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICAvKiBjb21wdXRlIEkgbW9kIHAgKi8KKyAgYyA9ICZsb2NhbF9jOworICBCTl93aXRoX2ZsYWdzKGMsIEksIEJOX0ZMR19DT05TVFRJTUUpOworICBpZiAoIUJOX21vZChyMSwgYywgcnNhLT5wLCBjdHgpKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICAvKiBjb21wdXRlIHIxXmRtcDEgbW9kIHAgKi8KKyAgZG1wMSA9ICZsb2NhbF9kbXAxOworICBCTl93aXRoX2ZsYWdzKGRtcDEsIHJzYS0+ZG1wMSwgQk5fRkxHX0NPTlNUVElNRSk7CisgIGlmICghcnNhLT5tZXRoLT5ibl9tb2RfZXhwKHIwLCByMSwgZG1wMSwgcnNhLT5wLCBjdHgsIHJzYS0+X21ldGhvZF9tb2RfcCkpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmICghQk5fc3ViKHIwLCByMCwgbTEpKSB7CisgICAgZ290byBlcnI7CisgIH0KKyAgLyogVGhpcyB3aWxsIGhlbHAgc3RvcCB0aGUgc2l6ZSBvZiByMCBpbmNyZWFzaW5nLCB3aGljaCBkb2VzCisgICAqIGFmZmVjdCB0aGUgbXVsdGlwbHkgaWYgaXQgb3B0aW1pc2VkIGZvciBhIHBvd2VyIG9mIDIgc2l6ZSAqLworICBpZiAoQk5faXNfbmVnYXRpdmUocjApKSB7CisgICAgaWYgKCFCTl9hZGQocjAsIHIwLCByc2EtPnApKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0KKworICBpZiAoIUJOX211bChyMSwgcjAsIHJzYS0+aXFtcCwgY3R4KSkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgLyogVHVybiBCTl9GTEdfQ09OU1RUSU1FIGZsYWcgb24gYmVmb3JlIGRpdmlzaW9uIG9wZXJhdGlvbiAqLworICBwcjEgPSAmbG9jYWxfcjE7CisgIEJOX3dpdGhfZmxhZ3MocHIxLCByMSwgQk5fRkxHX0NPTlNUVElNRSk7CisKKyAgaWYgKCFCTl9tb2QocjAsIHByMSwgcnNhLT5wLCBjdHgpKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICAvKiBJZiBwIDwgcSBpdCBpcyBvY2Nhc2lvbmFsbHkgcG9zc2libGUgZm9yIHRoZSBjb3JyZWN0aW9uIG9mCisgICAqIGFkZGluZyAncCcgaWYgcjAgaXMgbmVnYXRpdmUgYWJvdmUgdG8gbGVhdmUgdGhlIHJlc3VsdCBzdGlsbAorICAgKiBuZWdhdGl2ZS4gVGhpcyBjYW4gYnJlYWsgdGhlIHByaXZhdGUga2V5IG9wZXJhdGlvbnM6IHRoZSBmb2xsb3dpbmcKKyAgICogc2Vjb25kIGNvcnJlY3Rpb24gc2hvdWxkICphbHdheXMqIGNvcnJlY3QgdGhpcyByYXJlIG9jY3VycmVuY2UuCisgICAqIFRoaXMgd2lsbCAqbmV2ZXIqIGhhcHBlbiB3aXRoIE9wZW5TU0wgZ2VuZXJhdGVkIGtleXMgYmVjYXVzZQorICAgKiB0aGV5IGVuc3VyZSBwID4gcSBbc3RldmVdICovCisgIGlmIChCTl9pc19uZWdhdGl2ZShyMCkpIHsKKyAgICBpZiAoIUJOX2FkZChyMCwgcjAsIHJzYS0+cCkpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfQorICBpZiAoIUJOX211bChyMSwgcjAsIHJzYS0+cSwgY3R4KSkgeworICAgIGdvdG8gZXJyOworICB9CisgIGlmICghQk5fYWRkKHIwLCByMSwgbTEpKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAocnNhLT5lICYmIHJzYS0+bikgeworICAgIGlmICghcnNhLT5tZXRoLT5ibl9tb2RfZXhwKHZyZnksIHIwLCByc2EtPmUsIHJzYS0+biwgY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzYS0+X21ldGhvZF9tb2RfbikpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICAvKiBJZiAnSScgd2FzIGdyZWF0ZXIgdGhhbiAob3IgZXF1YWwgdG8pIHJzYS0+biwgdGhlIG9wZXJhdGlvbgorICAgICAqIHdpbGwgYmUgZXF1aXZhbGVudCB0byB1c2luZyAnSSBtb2QgbicuIEhvd2V2ZXIsIHRoZSByZXN1bHQgb2YKKyAgICAgKiB0aGUgdmVyaWZ5IHdpbGwgKmFsd2F5cyogYmUgbGVzcyB0aGFuICduJyBzbyB3ZSBkb24ndCBjaGVjaworICAgICAqIGZvciBhYnNvbHV0ZSBlcXVhbGl0eSwganVzdCBjb25ncnVlbmN5LiAqLworICAgIGlmICghQk5fc3ViKHZyZnksIHZyZnksIEkpKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgaWYgKCFCTl9tb2QodnJmeSwgdnJmeSwgcnNhLT5uLCBjdHgpKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgaWYgKEJOX2lzX25lZ2F0aXZlKHZyZnkpKSB7CisgICAgICBpZiAoIUJOX2FkZCh2cmZ5LCB2cmZ5LCByc2EtPm4pKSB7CisgICAgICAgIGdvdG8gZXJyOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIUJOX2lzX3plcm8odnJmeSkpIHsKKyAgICAgIC8qICdJJyBhbmQgJ3ZyZnknIGFyZW4ndCBjb25ncnVlbnQgbW9kIG4uIERvbid0IGxlYWsKKyAgICAgICAqIG1pc2NhbGN1bGF0ZWQgQ1JUIG91dHB1dCwganVzdCBkbyBhIHJhdyAoc2xvd2VyKQorICAgICAgICogbW9kX2V4cCBhbmQgcmV0dXJuIHRoYXQgaW5zdGVhZC4gKi8KKworICAgICAgQklHTlVNIGxvY2FsX2Q7CisgICAgICBCSUdOVU0gKmQgPSBOVUxMOworCisgICAgICBkID0gJmxvY2FsX2Q7CisgICAgICBCTl93aXRoX2ZsYWdzKGQsIHJzYS0+ZCwgQk5fRkxHX0NPTlNUVElNRSk7CisgICAgICBpZiAoIXJzYS0+bWV0aC0+Ym5fbW9kX2V4cChyMCwgSSwgZCwgcnNhLT5uLCBjdHgsIHJzYS0+X21ldGhvZF9tb2RfbikpIHsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgfQorICB9CisgIHJldCA9IDE7CisKK2VycjoKKyAgQk5fQ1RYX2VuZChjdHgpOworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGtleWdlbihSU0EgKnJzYSwgaW50IGJpdHMsIEJJR05VTSAqZV92YWx1ZSwgQk5fR0VOQ0IgKmNiKSB7CisgIEJJR05VTSAqcjAgPSBOVUxMLCAqcjEgPSBOVUxMLCAqcjIgPSBOVUxMLCAqcjMgPSBOVUxMLCAqdG1wOworICBCSUdOVU0gbG9jYWxfcjAsIGxvY2FsX2QsIGxvY2FsX3A7CisgIEJJR05VTSAqcHIwLCAqZCwgKnA7CisgIGludCBiaXRzcCwgYml0c3EsIG9rID0gLTEsIG4gPSAwOworICBCTl9DVFggKmN0eCA9IE5VTEw7CisKKyAgY3R4ID0gQk5fQ1RYX25ldygpOworICBpZiAoY3R4ID09IE5VTEwpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorICBCTl9DVFhfc3RhcnQoY3R4KTsKKyAgcjAgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIHIxID0gQk5fQ1RYX2dldChjdHgpOworICByMiA9IEJOX0NUWF9nZXQoY3R4KTsKKyAgcjMgPSBCTl9DVFhfZ2V0KGN0eCk7CisgIGlmIChyMyA9PSBOVUxMKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBiaXRzcCA9IChiaXRzICsgMSkgLyAyOworICBiaXRzcSA9IGJpdHMgLSBiaXRzcDsKKworICAvKiBXZSBuZWVkIHRoZSBSU0EgY29tcG9uZW50cyBub24tTlVMTCAqLworICBpZiAoIXJzYS0+biAmJiAoKHJzYS0+biA9IEJOX25ldygpKSA9PSBOVUxMKSkKKyAgICBnb3RvIGVycjsKKyAgaWYgKCFyc2EtPmQgJiYgKChyc2EtPmQgPSBCTl9uZXcoKSkgPT0gTlVMTCkpCisgICAgZ290byBlcnI7CisgIGlmICghcnNhLT5lICYmICgocnNhLT5lID0gQk5fbmV3KCkpID09IE5VTEwpKQorICAgIGdvdG8gZXJyOworICBpZiAoIXJzYS0+cCAmJiAoKHJzYS0+cCA9IEJOX25ldygpKSA9PSBOVUxMKSkKKyAgICBnb3RvIGVycjsKKyAgaWYgKCFyc2EtPnEgJiYgKChyc2EtPnEgPSBCTl9uZXcoKSkgPT0gTlVMTCkpCisgICAgZ290byBlcnI7CisgIGlmICghcnNhLT5kbXAxICYmICgocnNhLT5kbXAxID0gQk5fbmV3KCkpID09IE5VTEwpKQorICAgIGdvdG8gZXJyOworICBpZiAoIXJzYS0+ZG1xMSAmJiAoKHJzYS0+ZG1xMSA9IEJOX25ldygpKSA9PSBOVUxMKSkKKyAgICBnb3RvIGVycjsKKyAgaWYgKCFyc2EtPmlxbXAgJiYgKChyc2EtPmlxbXAgPSBCTl9uZXcoKSkgPT0gTlVMTCkpCisgICAgZ290byBlcnI7CisKKyAgQk5fY29weShyc2EtPmUsIGVfdmFsdWUpOworCisgIC8qIGdlbmVyYXRlIHAgYW5kIHEgKi8KKyAgZm9yICg7OykgeworICAgIGlmICghQk5fZ2VuZXJhdGVfcHJpbWVfZXgocnNhLT5wLCBiaXRzcCwgMCwgTlVMTCwgTlVMTCwgY2IpKQorICAgICAgZ290byBlcnI7CisgICAgaWYgKCFCTl9zdWIocjIsIHJzYS0+cCwgQk5fdmFsdWVfb25lKCkpKQorICAgICAgZ290byBlcnI7CisgICAgaWYgKCFCTl9nY2QocjEsIHIyLCByc2EtPmUsIGN0eCkpCisgICAgICBnb3RvIGVycjsKKyAgICBpZiAoQk5faXNfb25lKHIxKSkKKyAgICAgIGJyZWFrOworICAgIGlmICghQk5fR0VOQ0JfY2FsbChjYiwgMiwgbisrKSkKKyAgICAgIGdvdG8gZXJyOworICB9CisgIGlmICghQk5fR0VOQ0JfY2FsbChjYiwgMywgMCkpCisgICAgZ290byBlcnI7CisgIGZvciAoOzspIHsKKyAgICAvKiBXaGVuIGdlbmVyYXRpbmcgcmlkaWN1bG91c2x5IHNtYWxsIGtleXMsIHdlIGNhbiBnZXQgc3R1Y2sKKyAgICAgKiBjb250aW51YWxseSByZWdlbmVyYXRpbmcgdGhlIHNhbWUgcHJpbWUgdmFsdWVzLiBDaGVjayBmb3IKKyAgICAgKiB0aGlzIGFuZCBiYWlsIGlmIGl0IGhhcHBlbnMgMyB0aW1lcy4gKi8KKyAgICB1bnNpZ25lZCBpbnQgZGVnZW5lcmF0ZSA9IDA7CisgICAgZG8geworICAgICAgaWYgKCFCTl9nZW5lcmF0ZV9wcmltZV9leChyc2EtPnEsIGJpdHNxLCAwLCBOVUxMLCBOVUxMLCBjYikpCisgICAgICAgIGdvdG8gZXJyOworICAgIH0gd2hpbGUgKChCTl9jbXAocnNhLT5wLCByc2EtPnEpID09IDApICYmICgrK2RlZ2VuZXJhdGUgPCAzKSk7CisgICAgaWYgKGRlZ2VuZXJhdGUgPT0gMykgeworICAgICAgb2sgPSAwOyAvKiB3ZSBzZXQgb3VyIG93biBlcnIgKi8KKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwga2V5Z2VuLCBSU0FfUl9LRVlfU0laRV9UT09fU01BTEwpOworICAgICAgZ290byBlcnI7CisgICAgfQorICAgIGlmICghQk5fc3ViKHIyLCByc2EtPnEsIEJOX3ZhbHVlX29uZSgpKSkKKyAgICAgIGdvdG8gZXJyOworICAgIGlmICghQk5fZ2NkKHIxLCByMiwgcnNhLT5lLCBjdHgpKQorICAgICAgZ290byBlcnI7CisgICAgaWYgKEJOX2lzX29uZShyMSkpCisgICAgICBicmVhazsKKyAgICBpZiAoIUJOX0dFTkNCX2NhbGwoY2IsIDIsIG4rKykpCisgICAgICBnb3RvIGVycjsKKyAgfQorICBpZiAoIUJOX0dFTkNCX2NhbGwoY2IsIDMsIDEpKQorICAgIGdvdG8gZXJyOworICBpZiAoQk5fY21wKHJzYS0+cCwgcnNhLT5xKSA8IDApIHsKKyAgICB0bXAgPSByc2EtPnA7CisgICAgcnNhLT5wID0gcnNhLT5xOworICAgIHJzYS0+cSA9IHRtcDsKKyAgfQorCisgIC8qIGNhbGN1bGF0ZSBuICovCisgIGlmICghQk5fbXVsKHJzYS0+biwgcnNhLT5wLCByc2EtPnEsIGN0eCkpCisgICAgZ290byBlcnI7CisKKyAgLyogY2FsY3VsYXRlIGQgKi8KKyAgaWYgKCFCTl9zdWIocjEsIHJzYS0+cCwgQk5fdmFsdWVfb25lKCkpKQorICAgIGdvdG8gZXJyOyAvKiBwLTEgKi8KKyAgaWYgKCFCTl9zdWIocjIsIHJzYS0+cSwgQk5fdmFsdWVfb25lKCkpKQorICAgIGdvdG8gZXJyOyAvKiBxLTEgKi8KKyAgaWYgKCFCTl9tdWwocjAsIHIxLCByMiwgY3R4KSkKKyAgICBnb3RvIGVycjsgLyogKHAtMSkocS0xKSAqLworICBwcjAgPSAmbG9jYWxfcjA7CisgIEJOX3dpdGhfZmxhZ3MocHIwLCByMCwgQk5fRkxHX0NPTlNUVElNRSk7CisgIGlmICghQk5fbW9kX2ludmVyc2UocnNhLT5kLCByc2EtPmUsIHByMCwgY3R4KSkKKyAgICBnb3RvIGVycjsgLyogZCAqLworCisgIC8qIHNldCB1cCBkIGZvciBjb3JyZWN0IEJOX0ZMR19DT05TVFRJTUUgZmxhZyAqLworICBkID0gJmxvY2FsX2Q7CisgIEJOX3dpdGhfZmxhZ3MoZCwgcnNhLT5kLCBCTl9GTEdfQ09OU1RUSU1FKTsKKworICAvKiBjYWxjdWxhdGUgZCBtb2QgKHAtMSkgKi8KKyAgaWYgKCFCTl9tb2QocnNhLT5kbXAxLCBkLCByMSwgY3R4KSkKKyAgICBnb3RvIGVycjsKKworICAvKiBjYWxjdWxhdGUgZCBtb2QgKHEtMSkgKi8KKyAgaWYgKCFCTl9tb2QocnNhLT5kbXExLCBkLCByMiwgY3R4KSkKKyAgICBnb3RvIGVycjsKKworICAvKiBjYWxjdWxhdGUgaW52ZXJzZSBvZiBxIG1vZCBwICovCisgIHAgPSAmbG9jYWxfcDsKKyAgQk5fd2l0aF9mbGFncyhwLCByc2EtPnAsIEJOX0ZMR19DT05TVFRJTUUpOworCisgIGlmICghQk5fbW9kX2ludmVyc2UocnNhLT5pcW1wLCByc2EtPnEsIHAsIGN0eCkpCisgICAgZ290byBlcnI7CisKKyAgb2sgPSAxOworCitlcnI6CisgIGlmIChvayA9PSAtMSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwga2V5Z2VuLCBFUlJfTElCX0JOKTsKKyAgICBvayA9IDA7CisgIH0KKyAgaWYgKGN0eCAhPSBOVUxMKSB7CisgICAgQk5fQ1RYX2VuZChjdHgpOworICAgIEJOX0NUWF9mcmVlKGN0eCk7CisgIH0KKworICByZXR1cm4gb2s7Cit9CisKK2NvbnN0IHN0cnVjdCByc2FfbWV0aF9zdCBSU0FfZGVmYXVsdF9tZXRob2QgPSB7CisgIHsKKyAgICAwIC8qIHJlZmVyZW5jZXMgKi8sCisgICAgMSAvKiBpc19zdGF0aWMgKi8sCisgIH0sCisgIE5VTEwgLyogYXBwX2RhdGEgKi8sCisKKyAgTlVMTCAvKiBpbml0ICovLAorICBmaW5pc2gsCisKKyAgTlVMTCAvKiBzaWduICovLAorICBOVUxMIC8qIHZlcmlmeSAqLywKKworICBlbmNyeXB0LAorICBzaWduX3JhdywKKyAgZGVjcnlwdCwKKyAgdmVyaWZ5X3JhdywKKworICBtb2RfZXhwIC8qIG1vZF9leHAgKi8sCisgIEJOX21vZF9leHBfbW9udCAvKiBibl9tb2RfZXhwICovLAorCisgIFJTQV9GTEFHX0NBQ0hFX1BVQkxJQyB8IFJTQV9GTEFHX0NBQ0hFX1BSSVZBVEUsCisKKyAga2V5Z2VuLAorfTsKZGlmZiAtLWdpdCBhL2NyeXB0by9yc2EvcnNhX3Rlc3QuYyBiL2NyeXB0by9yc2EvcnNhX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGQ2ZDIwCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3JzYS9yc2FfdGVzdC5jCkBAIC0wLDAgKzEsMzkxIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9yc2EuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKworCisjZGVmaW5lIFNldEtleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGtleS0+biA9IEJOX2JpbjJibihuLCBzaXplb2YobikgLSAxLCBrZXktPm4pOyAgICAgICAgICAgICBcCisgIGtleS0+ZSA9IEJOX2JpbjJibihlLCBzaXplb2YoZSkgLSAxLCBrZXktPmUpOyAgICAgICAgICAgICBcCisgIGtleS0+ZCA9IEJOX2JpbjJibihkLCBzaXplb2YoZCkgLSAxLCBrZXktPmQpOyAgICAgICAgICAgICBcCisgIGtleS0+cCA9IEJOX2JpbjJibihwLCBzaXplb2YocCkgLSAxLCBrZXktPnApOyAgICAgICAgICAgICBcCisgIGtleS0+cSA9IEJOX2JpbjJibihxLCBzaXplb2YocSkgLSAxLCBrZXktPnEpOyAgICAgICAgICAgICBcCisgIGtleS0+ZG1wMSA9IEJOX2JpbjJibihkbXAxLCBzaXplb2YoZG1wMSkgLSAxLCBrZXktPmRtcDEpOyBcCisgIGtleS0+ZG1xMSA9IEJOX2JpbjJibihkbXExLCBzaXplb2YoZG1xMSkgLSAxLCBrZXktPmRtcTEpOyBcCisgIGtleS0+aXFtcCA9IEJOX2JpbjJibihpcW1wLCBzaXplb2YoaXFtcCkgLSAxLCBrZXktPmlxbXApOyBcCisgIG1lbWNweShjLCBjdGV4dF9leCwgc2l6ZW9mKGN0ZXh0X2V4KSAtIDEpOyAgICAgICAgICAgICAgICBcCisgIHJldHVybiAoc2l6ZW9mKGN0ZXh0X2V4KSAtIDEpOworCitzdGF0aWMgaW50IGtleTEoUlNBICprZXksIHVuc2lnbmVkIGNoYXIgKmMpIHsKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgbltdID0KKyAgICAgICJceDAwXHhBQVx4MzZceEFCXHhDRVx4ODhceEFDXHhGRFx4RkZceDU1XHg1Mlx4M0NceDdGXHhDNFx4NTJceDNGIgorICAgICAgIlx4OTBceEVGXHhBMFx4MERceEYzXHg3N1x4NEFceDI1XHg5Rlx4MkVceDYyXHhCNFx4QzVceEQ5XHg5Q1x4QjUiCisgICAgICAiXHhBRFx4QjNceDAwXHhBMFx4MjhceDVFXHg1M1x4MDFceDkzXHgwRVx4MENceDcwXHhGQlx4NjhceDc2XHg5MyIKKyAgICAgICJceDlDXHhFNlx4MTZceENFXHg2Mlx4NEFceDExXHhFMFx4MDhceDZEXHgzNFx4MUVceEJDXHhBQ1x4QTBceEExIgorICAgICAgIlx4RjUiOworCisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGVbXSA9ICJceDExIjsKKworICBzdGF0aWMgdW5zaWduZWQgY2hhciBkW10gPQorICAgICAgIlx4MEFceDAzXHgzN1x4NDhceDYyXHg2NFx4ODdceDY5XHg1Rlx4NUZceDMwXHhCQ1x4MzhceEI5XHg4Qlx4NDQiCisgICAgICAiXHhDMlx4Q0RceDJEXHhGRlx4NDNceDQwXHg5OFx4Q0RceDIwXHhEOFx4QTFceDM4XHhEMFx4OTBceEJGXHg2NCIKKyAgICAgICJceDc5XHg3Q1x4M0ZceEE3XHhBMlx4Q0RceENCXHgzQ1x4RDFceEUwXHhCRFx4QkFceDI2XHg1NFx4QjRceEY5IgorICAgICAgIlx4REZceDhFXHg4QVx4RTVceDlEXHg3M1x4M0RceDlGXHgzM1x4QjNceDAxXHg2Mlx4NEFceEZEXHgxRFx4NTEiOworCisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHBbXSA9CisgICAgICAiXHgwMFx4RDhceDQwXHhCNFx4MTZceDY2XHhCNFx4MkVceDkyXHhFQVx4MERceEEzXHhCNFx4MzJceDA0XHhCNSIKKyAgICAgICJceENGXHhDRVx4MzNceDUyXHg1Mlx4NERceDA0XHgxNlx4QTVceEE0XHg0MVx4RTdceDAwXHhBRlx4NDZceDEyIgorICAgICAgIlx4MEQiOworCisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHFbXSA9CisgICAgICAiXHgwMFx4QzlceDdGXHhCMVx4RjBceDI3XHhGNFx4NTNceEY2XHgzNFx4MTJceDMzXHhFQVx4QUFceEQxXHhEOSIKKyAgICAgICJceDM1XHgzRlx4NkNceDQyXHhEMFx4ODhceDY2XHhCMVx4RDBceDVBXHgwRlx4MjBceDM1XHgwMlx4OEJceDlEIgorICAgICAgIlx4ODkiOworCisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGRtcDFbXSA9CisgICAgICAiXHg1OVx4MEJceDk1XHg3Mlx4QTJceEMyXHhBOVx4QzRceDA2XHgwNVx4OURceEMyXHhBQlx4MkZceDFEXHhBRiIKKyAgICAgICJceEVCXHg3RVx4OEJceDRGXHgxMFx4QTdceDU0XHg5RVx4OEVceEVEXHhGNVx4QjRceEZDXHhFMFx4OUVceDA1IjsKKworICBzdGF0aWMgdW5zaWduZWQgY2hhciBkbXExW10gPQorICAgICAgIlx4MDBceDhFXHgzQ1x4MDVceDIxXHhGRVx4MTVceEUwXHhFQVx4MDZceEEzXHg2Rlx4RjBceEYxXHgwQ1x4OTkiCisgICAgICAiXHg1Mlx4QzNceDVCXHg3QVx4NzVceDE0XHhGRFx4MzJceDM4XHhCOFx4MEFceEFEXHg1Mlx4OThceDYyXHg4RCIKKyAgICAgICJceDUxIjsKKworICBzdGF0aWMgdW5zaWduZWQgY2hhciBpcW1wW10gPQorICAgICAgIlx4MzZceDNGXHhGN1x4MThceDlEXHhBOFx4RTlceDBCXHgxRFx4MzRceDFGXHg3MVx4RDBceDlCXHg3Nlx4QTgiCisgICAgICAiXHhBOVx4NDNceEUxXHgxRFx4MTBceEIyXHg0RFx4MjRceDlGXHgyRFx4RUFceEZFXHhGOFx4MENceDE4XHgyNiI7CisKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgY3RleHRfZXhbXSA9CisgICAgICAiXHgxYlx4OGZceDA1XHhmOVx4Y2FceDFhXHg3OVx4NTJceDZlXHg1M1x4ZjNceGNjXHg1MVx4NGZceGRiXHg4OSIKKyAgICAgICJceDJiXHhmYlx4OTFceDkzXHgyM1x4MWVceDc4XHhiOVx4OTJceGU2XHg4ZFx4NTBceGE0XHg4MFx4Y2JceDUyIgorICAgICAgIlx4MzNceDg5XHg1Y1x4NzRceDk1XHg4ZFx4NWRceDAyXHhhYlx4OGNceDBmXHhkMFx4NDBceGViXHg1OFx4NDQiCisgICAgICAiXHhiMFx4MDVceGMzXHg5ZVx4ZDhceDI3XHg0YVx4OWRceGJmXHhhOFx4MDZceDcxXHg0MFx4OTRceDM5XHhkMiI7CisKKyAgU2V0S2V5OworfQorCitzdGF0aWMgaW50IGtleTIoUlNBICprZXksIHVuc2lnbmVkIGNoYXIgKmMpIHsKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgbltdID0KKyAgICAgICJceDAwXHhBM1x4MDdceDlBXHg5MFx4REZceDBEXHhGRFx4NzJceEFDXHgwOVx4MENceENDXHgyQVx4NzhceEI4IgorICAgICAgIlx4NzRceDEzXHgxM1x4M0VceDQwXHg3NVx4OUNceDk4XHhGQVx4RjhceDIwXHg0Rlx4MzVceDhBXHgwQlx4MjYiCisgICAgICAiXHgzQ1x4NjdceDcwXHhFN1x4ODNceEE5XHgzQlx4NjlceDcxXHhCN1x4MzdceDc5XHhEMlx4NzFceDdCXHhFOCIKKyAgICAgICJceDM0XHg3N1x4Q0YiOworCisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGVbXSA9ICJceDMiOworCisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGRbXSA9CisgICAgICAiXHg2Q1x4QUZceEJDXHg2MFx4OTRceEIzXHhGRVx4NENceDcyXHhCMFx4QjNceDMyXHhDNlx4RkJceDI1XHhBMiIKKyAgICAgICJceEI3XHg2Mlx4MjlceDgwXHg0RVx4NjhceDY1XHhGQ1x4QTRceDVBXHg3NFx4REZceDBGXHg4Rlx4QjhceDQxIgorICAgICAgIlx4M0JceDUyXHhDMFx4RDBceEU1XHgzRFx4OUJceDU5XHgwRlx4RjFceDlCXHhFN1x4OUZceDQ5XHhERFx4MjEiCisgICAgICAiXHhFNVx4RUIiOworCisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHBbXSA9CisgICAgICAiXHgwMFx4Q0ZceDIwXHgzNVx4MDJceDhCXHg5RFx4ODZceDk4XHg0MFx4QjRceDE2XHg2Nlx4QjRceDJFXHg5MiIKKyAgICAgICJceEVBXHgwRFx4QTNceEI0XHgzMlx4MDRceEI1XHhDRlx4Q0VceDkxIjsKKworICBzdGF0aWMgdW5zaWduZWQgY2hhciBxW10gPQorICAgICAgIlx4MDBceEM5XHg3Rlx4QjFceEYwXHgyN1x4RjRceDUzXHhGNlx4MzRceDEyXHgzM1x4RUFceEFBXHhEMVx4RDkiCisgICAgICAiXHgzNVx4M0ZceDZDXHg0Mlx4RDBceDg4XHg2Nlx4QjFceEQwXHg1RiI7CisKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgZG1wMVtdID0KKyAgICAgICJceDAwXHg4QVx4MTVceDc4XHhBQ1x4NURceDEzXHhBRlx4MTBceDJCXHgyMlx4QjlceDk5XHhDRFx4NzRceDYxIgorICAgICAgIlx4RjFceDVFXHg2RFx4MjJceENDXHgwM1x4MjNceERGXHhERlx4MEIiOworCisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGRtcTFbXSA9CisgICAgICAiXHgwMFx4ODZceDU1XHgyMVx4NEFceEM1XHg0RFx4OERceDRFXHhDRFx4NjFceDc3XHhGMVx4QzdceDM2XHg5MCIKKyAgICAgICJceENFXHgyQVx4NDhceDJDXHg4Qlx4MDVceDk5XHhDQlx4RTBceDNGIjsKKworICBzdGF0aWMgdW5zaWduZWQgY2hhciBpcW1wW10gPQorICAgICAgIlx4MDBceDgzXHhFRlx4RUZceEI4XHhBOVx4QTRceDBEXHgxRFx4QjZceEVEXHg5OFx4QURceDg0XHhFRFx4MTMiCisgICAgICAiXHgzNVx4RENceEMxXHgwOFx4RjNceDIyXHhEMFx4NTdceENGXHg4RCI7CisKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgY3RleHRfZXhbXSA9CisgICAgICAiXHgxNFx4YmRceGRkXHgyOFx4YzlceDgzXHgzNVx4MTlceDIzXHg4MFx4ZThceGU1XHg0OVx4YjFceDU4XHgyYSIKKyAgICAgICJceDhiXHg0MFx4YjRceDQ4XHg2ZFx4MDNceGE2XHhhNVx4MzFceDFmXHgxZlx4ZDVceGYwXHhhMVx4ODBceGU0IgorICAgICAgIlx4MTdceDUzXHgwM1x4MjlceGE5XHgzNFx4OTBceDc0XHhiMVx4NTJceDEzXHg1NFx4MjlceDA4XHgyNFx4NTIiCisgICAgICAiXHg2Mlx4NTEiOworCisgIFNldEtleTsKK30KKworc3RhdGljIGludCBrZXkzKFJTQSAqa2V5LCB1bnNpZ25lZCBjaGFyICpjKSB7CisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIG5bXSA9CisgICAgICAiXHgwMFx4QkJceEY4XHgyRlx4MDlceDA2XHg4Mlx4Q0VceDlDXHgyM1x4MzhceEFDXHgyQlx4OURceEE4XHg3MSIKKyAgICAgICJceEY3XHgzNlx4OERceDA3XHhFRVx4RDRceDEwXHg0M1x4QTRceDQwXHhENlx4QjZceEYwXHg3NFx4NTRceEY1IgorICAgICAgIlx4MUZceEI4XHhERlx4QkFceEFGXHgwM1x4NUNceDAyXHhBQlx4NjFceEVBXHg0OFx4Q0VceEVCXHg2Rlx4Q0QiCisgICAgICAiXHg0OFx4NzZceEVEXHg1Mlx4MERceDYwXHhFMVx4RUNceDQ2XHgxOVx4NzFceDlEXHg4QVx4NUJceDhCXHg4MCIKKyAgICAgICJceDdGXHhBRlx4QjhceEUwXHhBM1x4REZceEM3XHgzN1x4NzJceDNFXHhFNlx4QjRceEI3XHhEOVx4M0FceDI1IgorICAgICAgIlx4ODRceEVFXHg2QVx4NjRceDlEXHgwNlx4MDlceDUzXHg3NFx4ODhceDM0XHhCMlx4NDVceDQ1XHg5OFx4MzkiCisgICAgICAiXHg0RVx4RTBceEFBXHhCMVx4MkRceDdCXHg2MVx4QTVceDFGXHg1Mlx4N0FceDlBXHg0MVx4RjZceEMxXHg2OCIKKyAgICAgICJceDdGXHhFMlx4NTNceDcyXHg5OFx4Q0FceDJBXHg4Rlx4NTlceDQ2XHhGOFx4RTVceEZEXHgwOVx4MURceEJEIgorICAgICAgIlx4Q0IiOworCisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGVbXSA9ICJceDExIjsKKworICBzdGF0aWMgdW5zaWduZWQgY2hhciBkW10gPQorICAgICAgIlx4MDBceEE1XHhEQVx4RkNceDUzXHg0MVx4RkFceEYyXHg4OVx4QzRceEI5XHg4OFx4REJceDMwXHhDMVx4Q0QiCisgICAgICAiXHhGOFx4M0ZceDMxXHgyNVx4MUVceDA2XHg2OFx4QjRceDI3XHg4NFx4ODFceDM4XHgwMVx4NTdceDk2XHg0MSIKKyAgICAgICJceEIyXHg5NFx4MTBceEIzXHhDN1x4OTlceDhEXHg2Qlx4QzRceDY1XHg3NFx4NUVceDVDXHgzOVx4MjZceDY5IgorICAgICAgIlx4RDZceDg3XHgwRFx4QTJceEMwXHg4Mlx4QTlceDM5XHhFM1x4N0ZceERDXHhCOFx4MkVceEM5XHgzRVx4REEiCisgICAgICAiXHhDOVx4N0ZceEYzXHhBRFx4NTlceDUwXHhBQ1x4Q0ZceEJDXHgxMVx4MUNceDc2XHhGMVx4QTlceDUyXHg5NCIKKyAgICAgICJceDQ0XHhFNVx4NkFceEFGXHg2OFx4QzVceDZDXHgwOVx4MkNceEQzXHg4RFx4QzNceEJFXHhGNVx4RDJceDBBIgorICAgICAgIlx4OTNceDk5XHgyNlx4RURceDRGXHg3NFx4QTFceDNFXHhERFx4RkJceEUxXHhBMVx4Q0VceENDXHg0OFx4OTQiCisgICAgICAiXHhBRlx4OTRceDI4XHhDMlx4QjdceEI4XHg4OFx4M0ZceEU0XHg0Nlx4M0FceDRCXHhDOFx4NUJceDFDXHhCMyIKKyAgICAgICJceEMxIjsKKworICBzdGF0aWMgdW5zaWduZWQgY2hhciBwW10gPQorICAgICAgIlx4MDBceEVFXHhDRlx4QUVceDgxXHhCMVx4QjlceEIzXHhDOVx4MDhceDgxXHgwQlx4MTBceEExXHhCNVx4NjAiCisgICAgICAiXHgwMVx4OTlceEVCXHg5Rlx4NDRceEFFXHhGNFx4RkRceEE0XHg5M1x4QjhceDFBXHg5RVx4M0RceDg0XHhGNiIKKyAgICAgICJceDMyXHgxMlx4NEVceEYwXHgyM1x4NkVceDVEXHgxRVx4M0JceDdFXHgyOFx4RkFceEU3XHhBQVx4MDRceDBBIgorICAgICAgIlx4MkRceDVCXHgyNVx4MjFceDc2XHg0NVx4OURceDFGXHgzOVx4NzVceDQxXHhCQVx4MkFceDU4XHhGQlx4NjUiCisgICAgICAiXHg5OSI7CisKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgcVtdID0KKyAgICAgICJceDAwXHhDOVx4N0ZceEIxXHhGMFx4MjdceEY0XHg1M1x4RjZceDM0XHgxMlx4MzNceEVBXHhBQVx4RDFceEQ5IgorICAgICAgIlx4MzVceDNGXHg2Q1x4NDJceEQwXHg4OFx4NjZceEIxXHhEMFx4NUFceDBGXHgyMFx4MzVceDAyXHg4Qlx4OUQiCisgICAgICAiXHg4Nlx4OThceDQwXHhCNFx4MTZceDY2XHhCNFx4MkVceDkyXHhFQVx4MERceEEzXHhCNFx4MzJceDA0XHhCNSIKKyAgICAgICJceENGXHhDRVx4MzNceDUyXHg1Mlx4NERceDA0XHgxNlx4QTVceEE0XHg0MVx4RTdceDAwXHhBRlx4NDZceDE1IgorICAgICAgIlx4MDMiOworCisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGRtcDFbXSA9CisgICAgICAiXHg1NFx4NDlceDRDXHhBNlx4M0VceEJBXHgwM1x4MzdceEU0XHhFMlx4NDBceDIzXHhGQ1x4RDZceDlBXHg1QSIKKyAgICAgICJceEVCXHgwN1x4RERceERDXHgwMVx4ODNceEE0XHhEMFx4QUNceDlCXHg1NFx4QjBceDUxXHhGMlx4QjFceDNFIgorICAgICAgIlx4RDlceDQ5XHgwOVx4NzVceEVBXHhCN1x4NzRceDE0XHhGRlx4NTlceEMxXHhGN1x4NjlceDJFXHg5QVx4MkUiCisgICAgICAiXHgyMFx4MkJceDM4XHhGQ1x4OTFceDBBXHg0N1x4NDFceDc0XHhBRFx4QzlceDNDXHgxRlx4NjdceEM5XHg4MSI7CisKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgZG1xMVtdID0KKyAgICAgICJceDQ3XHgxRVx4MDJceDkwXHhGRlx4MEFceEYwXHg3NVx4MDNceDUxXHhCN1x4RjhceDc4XHg4Nlx4NENceEE5IgorICAgICAgIlx4NjFceEFEXHhCRFx4M0FceDhBXHg3RVx4OTlceDFDXHg1Q1x4MDVceDU2XHhBOVx4NENceDMxXHg0Nlx4QTciCisgICAgICAiXHhGOVx4ODBceDNGXHg4Rlx4NkZceDhBXHhFM1x4NDJceEU5XHgzMVx4RkRceDhBXHhFNFx4N0FceDIyXHgwRCIKKyAgICAgICJceDFCXHg5OVx4QTRceDk1XHg4NFx4OThceDA3XHhGRVx4MzlceEY5XHgyNFx4NUFceDk4XHgzNlx4REFceDNEIjsKKworICBzdGF0aWMgdW5zaWduZWQgY2hhciBpcW1wW10gPQorICAgICAgIlx4MDBceEIwXHg2Q1x4NEZceERBXHhCQlx4NjNceDAxXHgxOVx4OERceDI2XHg1Qlx4REJceEFFXHg5NFx4MjMiCisgICAgICAiXHhCM1x4ODBceEYyXHg3MVx4RjdceDM0XHg1M1x4ODhceDUwXHg5M1x4MDdceDdGXHhDRFx4MzlceEUyXHgxMSIKKyAgICAgICJceDlGXHhDOVx4ODZceDMyXHgxNVx4NEZceDU4XHg4M1x4QjFceDY3XHhBOVx4NjdceEJGXHg0MFx4MkJceDRFIgorICAgICAgIlx4OUVceDJFXHgwRlx4OTZceDU2XHhFNlx4OThceEVBXHgzNlx4NjZceEVEXHhGQlx4MjVceDc5XHg4MFx4MzkiCisgICAgICAiXHhGNyI7CisKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgY3RleHRfZXhbXSA9CisgICAgICAiXHhiOFx4MjRceDZiXHg1Nlx4YTZceGVkXHg1OFx4ODFceGFlXHhiNVx4ODVceGQ5XHhhMlx4NWJceDJhXHhkNyIKKyAgICAgICJceDkwXHhjNFx4MTdceGUwXHg4MFx4NjhceDFiXHhmMVx4YWNceDJiXHhjM1x4ZGVceGI2XHg5ZFx4OGJceGNlIgorICAgICAgIlx4ZjBceGM0XHgzNlx4NmZceGVjXHg0MFx4MGFceGYwXHg1Mlx4YTdceDJlXHg5Ylx4MGVceGZmXHhiNVx4YjMiCisgICAgICAiXHhmMlx4ZjFceDkyXHhkYlx4ZWFceGNhXHgwM1x4YzFceDI3XHg0MFx4MDVceDcxXHgxM1x4YmZceDFmXHgwNiIKKyAgICAgICJceDY5XHhhY1x4MjJceGU5XHhmM1x4YTdceDg1XHgyZVx4M2NceDE1XHhkOVx4MTNceGNhXHhiMFx4YjhceDg2IgorICAgICAgIlx4M2FceDk1XHhjOVx4OTJceDk0XHhjZVx4ODZceDc0XHgyMVx4NDlceDU0XHg2MVx4MDNceDQ2XHhmNFx4ZDQiCisgICAgICAiXHg3NFx4YjJceDZmXHg3Y1x4NDhceGI0XHgyZVx4ZTZceDhlXHgxZlx4NTdceDJhXHgxZlx4YzRceDAyXHg2YSIKKyAgICAgICJceGM0XHg1Nlx4YjRceGY1XHg5Zlx4N2JceDYyXHgxZVx4YTFceGI5XHhkOFx4OGZceDY0XHgyMFx4MmZceGIxIjsKKworICBTZXRLZXk7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9vbmx5X2RfZ2l2ZW4oKSB7CisgIFJTQSAqa2V5ID0gUlNBX25ldygpOworICB1aW50OF90IGJ1Zls2NF07CisgIHVuc2lnbmVkIGJ1Zl9sZW4gPSBzaXplb2YoYnVmKTsKKyAgY29uc3QgdWludDhfdCBrRHVtbXlIYXNoWzE2XSA9IHswfTsKKyAgaW50IHJldCA9IDA7CisKKyAgaWYgKCFCTl9oZXgyYm4oJmtleS0+biwKKyAgICAgICAgICAgICAgICAgIjAwZTc3YmJmMzg4OWQ0ZWYzNmE5YTI1ZDRkNjlmM2Y2MzJlYjQzNjIyMTRjNzQ1MTdkYTZkNmFlYWE5YmQiCisgICAgICAgICAgICAgICAgICIwOWFjNDJiMjY2MjFjZDg4ZjNhNmViMDEzNzcyZmMzYmY5ZjgzOTE0YjY0NjcyMzFjNjMwMjAyYzM1YjNlIgorICAgICAgICAgICAgICAgICAiNTgwOGM2NTkiKSB8fAorICAgICAgIUJOX2hleDJibigma2V5LT5lLCAiMDEwMDAxIikgfHwKKyAgICAgICFCTl9oZXgyYm4oJmtleS0+ZCwKKyAgICAgICAgICAgICAgICAgIjAzNjVkYjllYjZkNzNiNTNiMDE1YzQwY2Q4ZGI0ZGU3ZGQ3MDM1YzY4YjVhYzFiZjc4NmQ3YTRlZTJjZWEiCisgICAgICAgICAgICAgICAgICIzMTZlYWVjYTIxYTczYWMzNjVlNTg3MTMxOTVmMmFlOTg0OTM0ODUyNWNhODU1Mzg2YjZkMDI4ZTQzN2E5IgorICAgICAgICAgICAgICAgICAiNDk1YTAxIikgfHwKKyAgICAgIFJTQV9zaXplKGtleSkgPiBzaXplb2YoYnVmKSkgeworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKCFSU0Ffc2lnbihOSURfbWQ1LCBrRHVtbXlIYXNoLCBzaXplb2Yoa0R1bW15SGFzaCksIGJ1ZiwgJmJ1Zl9sZW4sIGtleSkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlJTQV9zaWduIGZhaWxlZCB3aXRoIG9ubHkgZCBnaXZlbi5cbiIpOworICAgIEJJT19wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmICghUlNBX3ZlcmlmeShOSURfbWQ1LCBrRHVtbXlIYXNoLCBzaXplb2Yoa0R1bW15SGFzaCksIGJ1ZiwgYnVmX2xlbiwga2V5KSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiUlNBX3ZlcmlmeSBmYWlsZWQgd2l0aCBvbmx5IGQgZ2l2ZW4uXG4iKTsKKyAgICBCSU9fcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7CisgICAgZ290byBlcnI7CisgIH0KKworICByZXQgPSAxOworCitlcnI6CisgIFJTQV9mcmVlKGtleSk7CisgIHJldHVybiByZXQ7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKKyAgaW50IGVyciA9IDA7CisgIGludCB2OworICBSU0EgKmtleTsKKyAgdW5zaWduZWQgY2hhciBwdGV4dFsyNTZdOworICB1bnNpZ25lZCBjaGFyIGN0ZXh0WzI1Nl07CisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHB0ZXh0X2V4W10gPSAiXHg1NFx4ODVceDliXHgzNFx4MmNceDQ5XHhlYVx4MmEiOworICB1bnNpZ25lZCBjaGFyIGN0ZXh0X2V4WzI1Nl07CisgIGludCBwbGVuOworICBpbnQgY2xlbiA9IDA7CisgIGludCBudW07CisgIGludCBuOworCisgIHBsZW4gPSBzaXplb2YocHRleHRfZXgpIC0gMTsKKworICBmb3IgKHYgPSAwOyB2IDwgMzsgdisrKSB7CisgICAga2V5ID0gUlNBX25ldygpOworICAgIHN3aXRjaCAodikgeworICAgICAgY2FzZSAwOgorICAgICAgICBjbGVuID0ga2V5MShrZXksIGN0ZXh0X2V4KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE6CisgICAgICAgIGNsZW4gPSBrZXkyKGtleSwgY3RleHRfZXgpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgY2xlbiA9IGtleTMoa2V5LCBjdGV4dF9leCk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgbnVtID0gUlNBX3B1YmxpY19lbmNyeXB0KHBsZW4sIHB0ZXh0X2V4LCBjdGV4dCwga2V5LCBSU0FfUEtDUzFfUEFERElORyk7CisgICAgaWYgKG51bSAhPSBjbGVuKSB7CisgICAgICBwcmludGYoIlBLQ1MjMSB2MS41IGVuY3J5cHRpb24gZmFpbGVkIVxuIik7CisgICAgICBlcnIgPSAxOworICAgICAgZ290byBvYWVwOworICAgIH0KKworICAgIG51bSA9IFJTQV9wcml2YXRlX2RlY3J5cHQobnVtLCBjdGV4dCwgcHRleHQsIGtleSwgUlNBX1BLQ1MxX1BBRERJTkcpOworICAgIGlmIChudW0gIT0gcGxlbiB8fCBtZW1jbXAocHRleHQsIHB0ZXh0X2V4LCBudW0pICE9IDApIHsKKyAgICAgIHByaW50ZigiUEtDUyMxIHYxLjUgZGVjcnlwdGlvbiBmYWlsZWQhXG4iKTsKKyAgICAgIGVyciA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZigiUEtDUyAjMSB2MS41IGVuY3J5cHRpb24vZGVjcnlwdGlvbiBva1xuIik7CisgICAgfQorCisgIG9hZXA6CisgICAgRVJSX2NsZWFyX2Vycm9yKCk7CisgICAgbnVtID0KKyAgICAgICAgUlNBX3B1YmxpY19lbmNyeXB0KHBsZW4sIHB0ZXh0X2V4LCBjdGV4dCwga2V5LCBSU0FfUEtDUzFfT0FFUF9QQURESU5HKTsKKyAgICBpZiAobnVtID09IC0xKSB7CisgICAgICBwcmludGYoIk5vIE9BRVAgc3VwcG9ydFxuIik7CisgICAgICBnb3RvIG5leHQ7CisgICAgfQorICAgIGlmIChudW0gIT0gY2xlbikgeworICAgICAgcHJpbnRmKCJPQUVQIGVuY3J5cHRpb24gZmFpbGVkIVxuIik7CisgICAgICBlcnIgPSAxOworICAgICAgZ290byBuZXh0OworICAgIH0KKworICAgIG51bSA9IFJTQV9wcml2YXRlX2RlY3J5cHQobnVtLCBjdGV4dCwgcHRleHQsIGtleSwgUlNBX1BLQ1MxX09BRVBfUEFERElORyk7CisgICAgaWYgKG51bSAhPSBwbGVuIHx8IG1lbWNtcChwdGV4dCwgcHRleHRfZXgsIG51bSkgIT0gMCkgeworICAgICAgcHJpbnRmKCJPQUVQIGRlY3J5cHRpb24gKGVuY3J5cHRlZCBkYXRhKSBmYWlsZWQhXG4iKTsKKyAgICAgIGVyciA9IDE7CisgICAgfSBlbHNlIGlmIChtZW1jbXAoY3RleHQsIGN0ZXh0X2V4LCBudW0pID09IDApIHsKKyAgICAgIHByaW50ZigiT0FFUCB0ZXN0IHZlY3RvciAlZCBwYXNzZWQhXG4iLCB2KTsKKyAgICB9CisKKyAgICAvKiBEaWZmZXJlbnQgY2lwaGVydGV4dHMgKHJzYV9vYWVwLmMgd2l0aG91dCAtRFBLQ1NfVEVTVFZFQ1QpLgorICAgICAgIFRyeSBkZWNyeXB0aW5nIGN0ZXh0X2V4ICovCisKKyAgICBudW0gPQorICAgICAgICBSU0FfcHJpdmF0ZV9kZWNyeXB0KGNsZW4sIGN0ZXh0X2V4LCBwdGV4dCwga2V5LCBSU0FfUEtDUzFfT0FFUF9QQURESU5HKTsKKworICAgIGlmIChudW0gIT0gcGxlbiB8fCBtZW1jbXAocHRleHQsIHB0ZXh0X2V4LCBudW0pICE9IDApIHsKKyAgICAgIHByaW50ZigiT0FFUCBkZWNyeXB0aW9uICh0ZXN0IHZlY3RvciBkYXRhKSBmYWlsZWQhXG4iKTsKKyAgICAgIGVyciA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZigiT0FFUCBlbmNyeXB0aW9uL2RlY3J5cHRpb24gb2tcbiIpOworICAgIH0KKworICAgIC8qIFRyeSBkZWNyeXB0aW5nIGNvcnJ1cHRlZCBjaXBoZXJ0ZXh0cyAqLworICAgIGZvciAobiA9IDA7IG4gPCBjbGVuOyArK24pIHsKKyAgICAgIGludCBiOworICAgICAgdW5zaWduZWQgY2hhciBzYXZlZCA9IGN0ZXh0W25dOworICAgICAgZm9yIChiID0gMDsgYiA8IDI1NjsgKytiKSB7CisgICAgICAgIGlmIChiID09IHNhdmVkKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBjdGV4dFtuXSA9IGI7CisgICAgICAgIG51bSA9CisgICAgICAgICAgICBSU0FfcHJpdmF0ZV9kZWNyeXB0KG51bSwgY3RleHQsIHB0ZXh0LCBrZXksIFJTQV9QS0NTMV9PQUVQX1BBRERJTkcpOworICAgICAgICBpZiAobnVtID4gMCkgeworICAgICAgICAgIHByaW50ZigiQ29ycnVwdCBkYXRhIGRlY3J5cHRlZCFcbiIpOworICAgICAgICAgIGVyciA9IDE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgbmV4dDoKKyAgICBSU0FfZnJlZShrZXkpOworICB9CisKKyAgaWYgKGVyciAhPSAwIHx8CisgICAgICAhdGVzdF9vbmx5X2RfZ2l2ZW4oKSkgeworICAgIGVyciA9IDE7CisgIH0KKworICBpZiAoZXJyID09IDApIHsKKyAgICBwcmludGYoIlBBU1NcbiIpOworICB9CisgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vc2hhL0NNYWtlTGlzdHMudHh0IGIvY3J5cHRvL3NoYS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDhjMDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3NoYS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDYxIEBACitpbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKKworaWYgKCR7QVJDSH0gU1RSRVFVQUwgIng4Nl82NCIpCisJc2V0KAorCQlTSEFfQVJDSF9TT1VSQ0VTCisKKwkJc2hhMS14ODZfNjQuJHtBU01fRVhUfQorCQlzaGEyNTYteDg2XzY0LiR7QVNNX0VYVH0KKwkJc2hhNTEyLXg4Nl82NC4ke0FTTV9FWFR9CisJKQorZW5kaWYoKQorCitpZiAoJHtBUkNIfSBTVFJFUVVBTCAieDg2IikKKwlzZXQoCisJCVNIQV9BUkNIX1NPVVJDRVMKKworCQlzaGExLTU4Ni4ke0FTTV9FWFR9CisJCXNoYTI1Ni01ODYuJHtBU01fRVhUfQorCQlzaGE1MTItNTg2LiR7QVNNX0VYVH0KKwkpCitlbmRpZigpCisKK2lmICgke0FSQ0h9IFNUUkVRVUFMICJhcm0iKQorCXNldCgKKwkJU0hBX0FSQ0hfU09VUkNFUworCisJCXNoYTEtYXJtdjQtbGFyZ2UuJHtBU01fRVhUfQorCQlzaGEyNTYtYXJtdjQuJHtBU01fRVhUfQorCQlzaGE1MTItYXJtdjQuJHtBU01fRVhUfQorCSkKK2VuZGlmKCkKKworYWRkX2xpYnJhcnkoCisJc2hhCisKKwlPQkpFQ1QKKworCXNoYTEuYworCXNoYTI1Ni5jCisJc2hhNTEyLmMKKworCSR7U0hBX0FSQ0hfU09VUkNFU30KKykKKworcGVybGFzbShzaGExLXg4Nl82NC4ke0FTTV9FWFR9IGFzbS9zaGExLXg4Nl82NC5wbCkKK3Blcmxhc20oc2hhMjU2LXg4Nl82NC4ke0FTTV9FWFR9IGFzbS9zaGE1MTIteDg2XzY0LnBsIHNoYTI1NikKK3Blcmxhc20oc2hhNTEyLXg4Nl82NC4ke0FTTV9FWFR9IGFzbS9zaGE1MTIteDg2XzY0LnBsIHNoYTUxMikKK3Blcmxhc20oc2hhMS01ODYuJHtBU01fRVhUfSBhc20vc2hhMS01ODYucGwpCitwZXJsYXNtKHNoYTI1Ni01ODYuJHtBU01fRVhUfSBhc20vc2hhMjU2LTU4Ni5wbCkKK3Blcmxhc20oc2hhNTEyLTU4Ni4ke0FTTV9FWFR9IGFzbS9zaGE1MTItNTg2LnBsKQorcGVybGFzbShzaGExLWFybXY0LWxhcmdlLiR7QVNNX0VYVH0gYXNtL3NoYTEtYXJtdjQtbGFyZ2UucGwpCitwZXJsYXNtKHNoYTI1Ni1hcm12NC4ke0FTTV9FWFR9IGFzbS9zaGEyNTYtYXJtdjQucGwpCitwZXJsYXNtKHNoYTUxMi1hcm12NC4ke0FTTV9FWFR9IGFzbS9zaGE1MTItYXJtdjQucGwpCisKK2FkZF9leGVjdXRhYmxlKAorCXNoYTFfdGVzdAorCisJc2hhMV90ZXN0LmMKKykKKwordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHNoYTFfdGVzdCBjcnlwdG8pCmRpZmYgLS1naXQgYS9jcnlwdG8vc2hhL2FzbS9zaGExLTU4Ni5wbCBiL2NyeXB0by9zaGEvYXNtL3NoYTEtNTg2LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMmRiYmUKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc2hhL2FzbS9zaGExLTU4Ni5wbApAQCAtMCwwICsxLDEyNjYgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBbUmVdd3JpdHRlbiBieSBBbmR5IFBvbHlha292IDxhcHByb0BvcGVuc3NsLm9yZz4gZm9yIHRoZSBPcGVuU1NMCisjIHByb2plY3QuIFRoZSBtb2R1bGUgaXMsIGhvd2V2ZXIsIGR1YWwgbGljZW5zZWQgdW5kZXIgT3BlblNTTCBhbmQKKyMgQ1JZUFRPR0FNUyBsaWNlbnNlcyBkZXBlbmRpbmcgb24gd2hlcmUgeW91IG9idGFpbiBpdC4gRm9yIGZ1cnRoZXIKKyMgZGV0YWlscyBzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+YXBwcm8vY3J5cHRvZ2Ftcy8uCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgIltSZV13cml0dGVuIiB3YXMgYWNoaWV2ZWQgaW4gdHdvIG1ham9yIG92ZXJoYXVscy4gSW4gMjAwNCBCT0RZXyoKKyMgZnVuY3Rpb25zIHdlcmUgcmUtaW1wbGVtZW50ZWQgdG8gYWRkcmVzcyBQNCBwZXJmb3JtYW5jZSBpc3N1ZSBbc2VlCisjIGNvbW1lbnRhcnkgYmVsb3ddLCBhbmQgaW4gMjAwNiB0aGUgcmVzdCB3YXMgcmV3cml0dGVuIGluIG9yZGVyIHRvCisjIGdhaW4gZnJlZWRvbSB0byBsaWJlcmF0ZSBsaWNlbnNpbmcgdGVybXMuCisKKyMgSmFudWFyeSwgU2VwdGVtYmVyIDIwMDQuCisjCisjIEl0IHdhcyBub3RlZCB0aGF0IEludGVsIElBLTMyIEMgY29tcGlsZXIgZ2VuZXJhdGVzIGNvZGUgd2hpY2gKKyMgcGVyZm9ybXMgfjMwJSAqZmFzdGVyKiBvbiBQNCBDUFUgdGhhbiBvcmlnaW5hbCAqaGFuZC1jb2RlZCoKKyMgU0hBMSBhc3NlbWJsZXIgaW1wbGVtZW50YXRpb24uIFRvIGFkZHJlc3MgdGhpcyBwcm9ibGVtIChhbmQKKyMgcHJvdmUgdGhhdCBodW1hbnMgYXJlIHN0aWxsIGJldHRlciB0aGFuIG1hY2hpbmVzOi0pLCB0aGUKKyMgb3JpZ2luYWwgY29kZSB3YXMgb3ZlcmhhdWxlZCwgd2hpY2ggcmVzdWx0ZWQgaW4gZm9sbG93aW5nCisjIHBlcmZvcm1hbmNlIGNoYW5nZXM6CisjCisjCQljb21wYXJlZCB3aXRoIG9yaWdpbmFsCWNvbXBhcmVkIHdpdGggSW50ZWwgY2MKKyMJCWFzc2VtYmxlciBpbXBsLgkJZ2VuZXJhdGVkIGNvZGUKKyMgUGVudGl1bQktMTYlCQkJKzQ4JQorIyBQSUlJL0FNRAkrOCUJCQkrMTYlCisjIFA0CQkrODUlKCEpCQkJKzQ1JQorIworIyBBcyB5b3UgY2FuIHNlZSBQZW50aXVtIGNhbWUgb3V0IGFzIGxvb3NlcjotKCBZZXQgSSByZWNrb25lZCB0aGF0CisjIGltcHJvdmVtZW50IG9uIFA0IG91dHdlaWdodHMgdGhlIGxvc3MgYW5kIGluY29ycG9yYXRlIHRoaXMKKyMgcmUtdHVuZWQgY29kZSB0byAwLjkuNyBhbmQgbGF0ZXIuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMJCQkJCTxhcHByb0BmeS5jaGFsbWVycy5zZT4KKworIyBBdWd1c3QgMjAwOS4KKyMKKyMgR2VvcmdlIFNwZWx2aW4gaGFzIHRpcHBlZCB0aGF0IEZfNDBfNTkoYixjLGQpIGNhbiBiZSByZXdyaXR0ZW4gYXMKKyMgJyhjJmQpICsgKGImKGNeZCkpJywgd2hpY2ggYWxsb3dzIHRvIGFjY3VtdWxhdGUgcGFydGlhbCByZXN1bHRzCisjIGFuZCBsaWdodGVuICJwcmVzc3VyZSIgb24gc2NyYXRjaCByZWdpc3RlcnMuIFRoaXMgcmVzdWx0ZWQgaW4KKyMgPjEyJSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBvbiBjb250ZW1wb3JhcnkgQU1EIGNvcmVzICh3aXRoIG5vCisjIGRlZ3JhZGF0aW9uIG9uIG90aGVyIENQVXM6LSkuIEFsc28sIHRoZSBjb2RlIHdhcyByZXZpc2VkIHRvIG1heGltaXplCisjICJkaXN0YW5jZSIgYmV0d2VlbiBpbnN0cnVjdGlvbnMgcHJvZHVjaW5nIGlucHV0IHRvICdsZWEnIGluc3RydWN0aW9uCisjIGFuZCB0aGUgJ2xlYScgaW5zdHJ1Y3Rpb24gaXRzZWxmLCB3aGljaCBpcyBlc3NlbnRpYWwgZm9yIEludGVsIEF0b20KKyMgY29yZSBhbmQgcmVzdWx0ZWQgaW4gfjE1JSBpbXByb3ZlbWVudC4KKworIyBPY3RvYmVyIDIwMTAuCisjCisjIEFkZCBTU1NFMywgU3VwcGxlbWVudGFsWyFdIFNTRTMsIGltcGxlbWVudGF0aW9uLiBUaGUgaWRlYSBiZWhpbmQgaXQKKyMgaXMgdG8gb2ZmbG9hZCBtZXNzYWdlIHNjaGVkdWxlIGRlbm90ZWQgYnkgV3QgaW4gTklTVCBzcGVjaWZpY2F0aW9uLAorIyBvciBYdXBkYXRlIGluIE9wZW5TU0wgc291cmNlLCB0byBTSU1EIHVuaXQuIFRoZSBpZGVhIGlzIG5vdCBub3ZlbCwKKyMgYW5kIGluIFNTRTIgY29udGV4dCB3YXMgZmlyc3QgZXhwbG9yZWQgYnkgRGVhbiBHYXVkZXQgaW4gMjAwNCwgc2VlCisjIGh0dHA6Ly9hcmN0aWMub3JnL35kZWFuL2NyeXB0by9zaGExLmh0bWwuIFNpbmNlIHRoZW4gc2V2ZXJhbCB0aGluZ3MKKyMgaGF2ZSBjaGFuZ2VkIHRoYXQgbWFkZSBpdCBpbnRlcmVzdGluZyBhZ2FpbjoKKyMKKyMgYSkgWE1NIHVuaXRzIGJlY2FtZSBmYXN0ZXIgYW5kIHdpZGVyOworIyBiKSBpbnN0cnVjdGlvbiBzZXQgYmVjYW1lIG1vcmUgdmVyc2F0aWxlOworIyBjKSBhbiBpbXBvcnRhbnQgb2JzZXJ2YXRpb24gd2FzIG1hZGUgYnkgTWF4IExvY2t0eWtoaW4sIHdoaWNoIG1hZGUKKyMgICAgaXQgcG9zc2libGUgdG8gcmVkdWNlIGFtb3VudCBvZiBpbnN0cnVjdGlvbnMgcmVxdWlyZWQgdG8gcGVyZm9ybQorIyAgICB0aGUgb3BlcmF0aW9uIGluIHF1ZXN0aW9uLCBmb3IgZnVydGhlciBkZXRhaWxzIHNlZQorIyAgICBodHRwOi8vc29mdHdhcmUuaW50ZWwuY29tL2VuLXVzL2FydGljbGVzL2ltcHJvdmluZy10aGUtcGVyZm9ybWFuY2Utb2YtdGhlLXNlY3VyZS1oYXNoLWFsZ29yaXRobS0xLy4KKworIyBBcHJpbCAyMDExLgorIworIyBBZGQgQVZYIGNvZGUgcGF0aCwgcHJvYmFibHkgbW9zdCBjb250cm92ZXJzaWFsLi4uIFRoZSB0aGluZyBpcyB0aGF0CisjIHN3aXRjaCB0byBBVlggYWxvbmUgaW1wcm92ZXMgcGVyZm9ybWFuY2UgYnkgYXMgbGl0dGxlIGFzIDQlIGluCisjIGNvbXBhcmlzb24gdG8gU1NTRTMgY29kZSBwYXRoLiBCdXQgYmVsb3cgcmVzdWx0IGRvZXNuJ3QgbG9vayBsaWtlCisjIDQlIGltcHJvdmVtZW50Li4uIFRyb3VibGUgaXMgdGhhdCBTYW5keSBCcmlkZ2UgZGVjb2RlcyAncm9bcmxdJyBhcworIyBwYWlyIG9mILUtb3BzLCBhbmQgaXQncyB0aGUgYWRkaXRpb25hbCC1LW9wcywgdHdvIHBlciByb3VuZCwgdGhhdAorIyBtYWtlIGl0IHJ1biBzbG93ZXIgdGhhbiBDb3JlMiBhbmQgV2VzdG1lcmUuIEJ1dCAnc2hbcmxdZCcgaXMgZGVjb2RlZAorIyBhcyBzaW5nbGUgtS1vcCBieSBTYW5keSBCcmlkZ2UgYW5kIGl0J3MgcmVwbGFjaW5nICdyb1tybF0nIHdpdGgKKyMgZXF1aXZhbGVudCAnc2hbcmxdZCcgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgdGhlIGltcHJlc3NpdmUgNS4xCisjIGN5Y2xlcyBwZXIgcHJvY2Vzc2VkIGJ5dGUuIEJ1dCAnc2hbcmxdZCcgaXMgbm90IHNvbWV0aGluZyB0aGF0IHVzZWQKKyMgdG8gYmUgZmFzdCwgbm9yIGRvZXMgaXQgYXBwZWFyIHRvIGJlIGZhc3QgaW4gdXBjb21pbmcgQnVsbGRvemVyCisjIFthY2NvcmRpbmcgdG8gaXRzIG9wdGltaXphdGlvbiBtYW51YWxdLiBXaGljaCBpcyB3aHkgQVZYIGNvZGUgcGF0aAorIyBpcyBndWFyZGVkIGJ5ICpib3RoKiBBVlggYW5kIHN5bnRoZXRpYyBiaXQgZGVub3RpbmcgSW50ZWwgQ1BVcy4KKyMgT25lIGNhbiBhcmd1ZSB0aGF0IGl0J3MgdW5mYWlyIHRvIEFNRCwgYnV0IHdpdGhvdXQgJ3NoW3JsXWQnIGl0CisjIG1ha2VzIG5vIHNlbnNlIHRvIGtlZXAgdGhlIEFWWCBjb2RlIHBhdGguIElmIHNvbWVib2R5IGZlZWxzIHRoYXQKKyMgc3Ryb25nbHksIGl0J3MgcHJvYmFibHkgbW9yZSBhcHByb3ByaWF0ZSB0byBkaXNjdXNzIHBvc3NpYmlsaXR5IG9mCisjIHVzaW5nIHZlY3RvciByb3RhdGUgWE9QIG9uIEFNRC4uLgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEN1cnJlbnQgcGVyZm9ybWFuY2UgaXMgc3VtbWFyaXplZCBpbiBmb2xsb3dpbmcgdGFibGUuIE51bWJlcnMgYXJlCisjIENQVSBjbG9jayBjeWNsZXMgc3BlbnQgdG8gcHJvY2VzcyBzaW5nbGUgYnl0ZSAobGVzcyBpcyBiZXR0ZXIpLgorIworIwkJeDg2CQlTU1NFMwkJQVZYCisjIFBlbnRpdW0JMTUuNwkJLQorIyBQSUlJCQkxMS41CQktCisjIFA0CQkxMC42CQktCisjIEFNRCBLOAk3LjEJCS0KKyMgQ29yZTIJCTcuMwkJNi4wLysyMiUJLQorIyBBdG9tCQkxMi41CQk5LjMoKikvKzM1JQktCisjIFdlc3RtZXJlCTcuMwkJNS41LyszMyUJLQorIyBTYW5keSBCcmlkZ2UJOC44CQk2LjIvKzQwJQk1LjEoKiopLys3MyUKKyMgSXZ5IEJyaWRnZQk3LjIJCTQuOC8rNTElCTQuNygqKikvKzUzJQorIyBCdWxsZG96ZXIJMTEuNgkJNi4wLys5MiUKKyMgVklBIE5hbm8JMTAuNgkJNy40Lys0MyUKKyMKKyMgKCopCUxvb3AgaXMgMTA1NiBpbnN0cnVjdGlvbnMgbG9uZyBhbmQgZXhwZWN0ZWQgcmVzdWx0IGlzIH44LjI1LgorIwlJdCByZW1haW5zIG15c3RlcnkgW3RvIG1lXSB3aHkgSUxQIGlzIGxpbWl0ZWQgdG8gMS43LgorIworIyAoKiopCUFzIHBlciBhYm92ZSBjb21tZW50LCB0aGUgcmVzdWx0IGlzIGZvciBBVlggKnBsdXMqIHNoW3JsXWQuCisKKyQwID1+IG0vKC4qW1wvXFxdKVteXC9cXF0rJC87ICRkaXI9JDE7CitwdXNoKEBJTkMsIiR7ZGlyfSIsIiR7ZGlyfS4uLy4uL3Blcmxhc20iKTsKK3JlcXVpcmUgIng4NmFzbS5wbCI7CisKKyZhc21faW5pdCgkQVJHVlswXSwic2hhMS01ODYucGwiLCRBUkdWWyQjQVJHVl0gZXEgIjM4NiIpOworCiskeG1tPSR5bW09MDsKK2ZvciAoQEFSR1YpIHsgJHhtbT0xIGlmICgvLURPUEVOU1NMX0lBMzJfU1NFMi8pOyB9CisKKyR5bW09MSBpZiAoJHhtbSAmJgorCQlgJEVOVntDQ30gLVdhLC12IC1jIC1vIC9kZXYvbnVsbCAteCBhc3NlbWJsZXIgL2Rldi9udWxsIDI+JjFgCisJCQk9fiAvR05VIGFzc2VtYmxlciB2ZXJzaW9uIChbMi05XVwuWzAtOV0rKS8gJiYKKwkJJDE+PTIuMTkpOwkjIGZpcnN0IHZlcnNpb24gc3VwcG9ydGluZyBBVlgKKworJHltbT0xIGlmICgkeG1tICYmICEkeW1tICYmICRBUkdWWzBdIGVxICJ3aW4zMm4iICYmIAorCQlgbmFzbSAtdiAyPiYxYCA9fiAvTkFTTSB2ZXJzaW9uIChbMi05XVwuWzAtOV0rKS8gJiYKKwkJJDE+PTIuMDMpOwkjIGZpcnN0IHZlcnNpb24gc3VwcG9ydGluZyBBVlgKKworJHltbT0xIGlmICgkeG1tICYmICEkeW1tICYmICRBUkdWWzBdIGVxICJ3aW4zMiIgJiYKKwkJYG1sIDI+JjFgID1+IC9WZXJzaW9uIChbMC05XSspXC4vICYmCisJCSQxPj0xMCk7CSMgZmlyc3QgdmVyc2lvbiBzdXBwb3J0aW5nIEFWWAorCismZXh0ZXJuYWxfbGFiZWwoIk9QRU5TU0xfaWEzMmNhcF9QIikgaWYgKCR4bW0pOworCisKKyRBPSJlYXgiOworJEI9ImVieCI7CiskQz0iZWN4IjsKKyREPSJlZHgiOworJEU9ImVkaSI7CiskVD0iZXNpIjsKKyR0bXAxPSJlYnAiOworCitAVj0oJEEsJEIsJEMsJEQsJEUsJFQpOworCiskYWx0PTA7CSMgMSBkZW5vdGVzIGFsdGVybmF0aXZlIElBTFUgaW1wbGVtZW50YXRpb24sIHdoaWNoIHBlcmZvcm1zCisJIyA4JSAqd29yc2UqIG9uIFA0LCBzYW1lIG9uIFdlc3RtZXJlIGFuZCBBdG9tLCAyJSBiZXR0ZXIgb24KKwkjIFNhbmR5IEJyaWRnZS4uLgorCitzdWIgQk9EWV8wMF8xNQorCXsKKwlsb2NhbCgkbiwkYSwkYiwkYywkZCwkZSwkZik9QF87CisKKwkmY29tbWVudCgiMDBfMTUgJG4iKTsKKworCSZtb3YoJGYsJGMpOwkJCSMgZiB0byBob2xkIEZfMDBfMTkoYixjLGQpCisJIGlmICgkbj09MCkgIHsgJm1vdigkdG1wMSwkYSk7IH0KKwkgZWxzZSAgICAgICAgeyAmbW92KCRhLCR0bXAxKTsgfQorCSZyb3RsKCR0bXAxLDUpOwkJCSMgdG1wMT1ST1RBVEUoYSw1KQorCSAmeG9yKCRmLCRkKTsKKwkmYWRkKCR0bXAxLCRlKTsJCQkjIHRtcDErPWU7CisJICZtb3YoJGUsJnN3dG1wKCRuJTE2KSk7CSMgZSBiZWNvbWVzIHZvbGF0aWxlIGFuZCBpcyBsb2FkZWQKKwkgCQkJCSMgd2l0aCB4aSwgYWxzbyBub3RlIHRoYXQgZSBiZWNvbWVzCisJCQkJCSMgZiBpbiBuZXh0IHJvdW5kLi4uCisJJmFuZCgkZiwkYik7CisJJnJvdHIoJGIsMik7CQkJIyBiPVJPVEFURShiLDMwKQorCSAmeG9yKCRmLCRkKTsJCQkjIGYgaG9sZHMgRl8wMF8xOShiLGMsZCkKKwkmbGVhKCR0bXAxLCZEV1AoMHg1YTgyNzk5OSwkdG1wMSwkZSkpOwkjIHRtcDErPUtfMDBfMTkreGkKKworCWlmICgkbj09MTUpIHsgJm1vdigkZSwmc3d0bXAoKCRuKzEpJTE2KSk7IyBwcmUtZmV0Y2ggZiBmb3IgbmV4dCByb3VuZAorCQkgICAgICAmYWRkKCRmLCR0bXAxKTsgfQkjIGYrPXRtcDEKKwllbHNlICAgICAgICB7ICZhZGQoJHRtcDEsJGYpOyB9CSMgZiBiZWNvbWVzIGEgaW4gbmV4dCByb3VuZAorCSZtb3YoJHRtcDEsJGEpCQkJaWYgKCRhbHQgJiYgJG49PTE1KTsKKwl9CisKK3N1YiBCT0RZXzE2XzE5CisJeworCWxvY2FsKCRuLCRhLCRiLCRjLCRkLCRlLCRmKT1AXzsKKworCSZjb21tZW50KCIxNl8xOSAkbiIpOworCitpZiAoJGFsdCkgeworCSZ4b3IoJGMsJGQpOworCSAmeG9yKCRmLCZzd3RtcCgoJG4rMiklMTYpKTsJIyBmIHRvIGhvbGQgWHVwZGF0ZSh4aSx4YSx4Yix4Yyx4ZCkKKwkmYW5kKCR0bXAxLCRjKTsJCQkjIHRtcDEgdG8gaG9sZCBGXzAwXzE5KGIsYyxkKSwgYiY9Y15kCisJICZ4b3IoJGYsJnN3dG1wKCgkbis4KSUxNikpOworCSZ4b3IoJHRtcDEsJGQpOwkJCSMgdG1wMT1GXzAwXzE5KGIsYyxkKQorCSAmeG9yKCRmLCZzd3RtcCgoJG4rMTMpJTE2KSk7CSMgZiBob2xkcyB4YV54Yl54Y154ZAorCSZyb3RsKCRmLDEpOwkJCSMgZj1ST1RBVEUoZiwxKQorCSAmYWRkKCRlLCR0bXAxKTsJCSMgZSs9Rl8wMF8xOShiLGMsZCkKKwkmeG9yKCRjLCRkKTsJCQkjIHJlc3RvcmUgJGMKKwkgJm1vdigkdG1wMSwkYSk7CQkjIGIgaW4gbmV4dCByb3VuZAorCSZyb3RyKCRiLCRuPT0xNj8yOjcpOwkJIyBiPVJPVEFURShiLDMwKQorCSAmbW92KCZzd3RtcCgkbiUxNiksJGYpOwkjIHhpPWYKKwkmcm90bCgkYSw1KTsJCQkjIFJPVEFURShhLDUpCisJICZsZWEoJGYsJkRXUCgweDVhODI3OTk5LCRmLCRlKSk7IyBmKz1GXzAwXzE5KGIsYyxkKStlCisJJm1vdigkZSwmc3d0bXAoKCRuKzEpJTE2KSk7CSMgcHJlLWZldGNoIGYgZm9yIG5leHQgcm91bmQKKwkgJmFkZCgkZiwkYSk7CQkJIyBmKz1ST1RBVEUoYSw1KQorfSBlbHNlIHsKKwkmbW92KCR0bXAxLCRjKTsJCQkjIHRtcDEgdG8gaG9sZCBGXzAwXzE5KGIsYyxkKQorCSAmeG9yKCRmLCZzd3RtcCgoJG4rMiklMTYpKTsJIyBmIHRvIGhvbGQgWHVwZGF0ZSh4aSx4YSx4Yix4Yyx4ZCkKKwkmeG9yKCR0bXAxLCRkKTsKKwkgJnhvcigkZiwmc3d0bXAoKCRuKzgpJTE2KSk7CisJJmFuZCgkdG1wMSwkYik7CisJICZ4b3IoJGYsJnN3dG1wKCgkbisxMyklMTYpKTsJIyBmIGhvbGRzIHhhXnhiXnhjXnhkCisJJnJvdGwoJGYsMSk7CQkJIyBmPVJPVEFURShmLDEpCisJICZ4b3IoJHRtcDEsJGQpOwkJIyB0bXAxPUZfMDBfMTkoYixjLGQpCisJJmFkZCgkZSwkdG1wMSk7CQkJIyBlKz1GXzAwXzE5KGIsYyxkKQorCSAmbW92KCR0bXAxLCRhKTsKKwkmcm90cigkYiwyKTsJCQkjIGI9Uk9UQVRFKGIsMzApCisJICZtb3YoJnN3dG1wKCRuJTE2KSwkZik7CSMgeGk9ZgorCSZyb3RsKCR0bXAxLDUpOwkJCSMgUk9UQVRFKGEsNSkKKwkgJmxlYSgkZiwmRFdQKDB4NWE4Mjc5OTksJGYsJGUpKTsjIGYrPUZfMDBfMTkoYixjLGQpK2UKKwkmbW92KCRlLCZzd3RtcCgoJG4rMSklMTYpKTsJIyBwcmUtZmV0Y2ggZiBmb3IgbmV4dCByb3VuZAorCSAmYWRkKCRmLCR0bXAxKTsJCSMgZis9Uk9UQVRFKGEsNSkKK30KKwl9CisKK3N1YiBCT0RZXzIwXzM5CisJeworCWxvY2FsKCRuLCRhLCRiLCRjLCRkLCRlLCRmKT1AXzsKKwlsb2NhbCAkSz0oJG48NDApPzB4NmVkOWViYTE6MHhjYTYyYzFkNjsKKworCSZjb21tZW50KCIyMF8zOSAkbiIpOworCitpZiAoJGFsdCkgeworCSZ4b3IoJHRtcDEsJGMpOwkJCSMgdG1wMSB0byBob2xkIEZfMjBfMzkoYixjLGQpLCBiXj1jCisJICZ4b3IoJGYsJnN3dG1wKCgkbisyKSUxNikpOwkjIGYgdG8gaG9sZCBYdXBkYXRlKHhpLHhhLHhiLHhjLHhkKQorCSZ4b3IoJHRtcDEsJGQpOwkJCSMgdG1wMSBob2xkcyBGXzIwXzM5KGIsYyxkKQorCSAmeG9yKCRmLCZzd3RtcCgoJG4rOCklMTYpKTsKKwkmYWRkKCRlLCR0bXAxKTsJCQkjIGUrPUZfMjBfMzkoYixjLGQpCisJICZ4b3IoJGYsJnN3dG1wKCgkbisxMyklMTYpKTsJIyBmIGhvbGRzIHhhXnhiXnhjXnhkCisJJnJvdGwoJGYsMSk7CQkJIyBmPVJPVEFURShmLDEpCisJICZtb3YoJHRtcDEsJGEpOwkJIyBiIGluIG5leHQgcm91bmQKKwkmcm90cigkYiw3KTsJCQkjIGI9Uk9UQVRFKGIsMzApCisJICZtb3YoJnN3dG1wKCRuJTE2KSwkZikJCWlmKCRuPDc3KTsjIHhpPWYKKwkmcm90bCgkYSw1KTsJCQkjIFJPVEFURShhLDUpCisJICZ4b3IoJGIsJGMpCQkJaWYoJG49PTM5KTsjIHdhcm0gdXAgZm9yIEJPRFlfNDBfNTkKKwkmYW5kKCR0bXAxLCRiKQkJCWlmKCRuPT0zOSk7CisJICZsZWEoJGYsJkRXUCgkSywkZiwkZSkpOwkjIGYrPWUrS19YWF9ZWQorCSZtb3YoJGUsJnN3dG1wKCgkbisxKSUxNikpCWlmKCRuPDc5KTsjIHByZS1mZXRjaCBmIGZvciBuZXh0IHJvdW5kCisJICZhZGQoJGYsJGEpOwkJCSMgZis9Uk9UQVRFKGEsNSkKKwkmcm90cigkYSw1KQkJCWlmICgkbj09NzkpOworfSBlbHNlIHsKKwkmbW92KCR0bXAxLCRiKTsJCQkjIHRtcDEgdG8gaG9sZCBGXzIwXzM5KGIsYyxkKQorCSAmeG9yKCRmLCZzd3RtcCgoJG4rMiklMTYpKTsJIyBmIHRvIGhvbGQgWHVwZGF0ZSh4aSx4YSx4Yix4Yyx4ZCkKKwkmeG9yKCR0bXAxLCRjKTsKKwkgJnhvcigkZiwmc3d0bXAoKCRuKzgpJTE2KSk7CisJJnhvcigkdG1wMSwkZCk7CQkJIyB0bXAxIGhvbGRzIEZfMjBfMzkoYixjLGQpCisJICZ4b3IoJGYsJnN3dG1wKCgkbisxMyklMTYpKTsJIyBmIGhvbGRzIHhhXnhiXnhjXnhkCisJJnJvdGwoJGYsMSk7CQkJIyBmPVJPVEFURShmLDEpCisJICZhZGQoJGUsJHRtcDEpOwkJIyBlKz1GXzIwXzM5KGIsYyxkKQorCSZyb3RyKCRiLDIpOwkJCSMgYj1ST1RBVEUoYiwzMCkKKwkgJm1vdigkdG1wMSwkYSk7CisJJnJvdGwoJHRtcDEsNSk7CQkJIyBST1RBVEUoYSw1KQorCSAmbW92KCZzd3RtcCgkbiUxNiksJGYpIGlmKCRuPDc3KTsjIHhpPWYKKwkmbGVhKCRmLCZEV1AoJEssJGYsJGUpKTsJIyBmKz1lK0tfWFhfWVkKKwkgJm1vdigkZSwmc3d0bXAoKCRuKzEpJTE2KSkgaWYoJG48NzkpOyMgcHJlLWZldGNoIGYgZm9yIG5leHQgcm91bmQKKwkmYWRkKCRmLCR0bXAxKTsJCQkjIGYrPVJPVEFURShhLDUpCit9CisJfQorCitzdWIgQk9EWV80MF81OQorCXsKKwlsb2NhbCgkbiwkYSwkYiwkYywkZCwkZSwkZik9QF87CisKKwkmY29tbWVudCgiNDBfNTkgJG4iKTsKKworaWYgKCRhbHQpIHsKKwkmYWRkKCRlLCR0bXAxKTsJCQkjIGUrPWImKGNeZCkKKwkgJnhvcigkZiwmc3d0bXAoKCRuKzIpJTE2KSk7CSMgZiB0byBob2xkIFh1cGRhdGUoeGkseGEseGIseGMseGQpCisJJm1vdigkdG1wMSwkZCk7CisJICZ4b3IoJGYsJnN3dG1wKCgkbis4KSUxNikpOworCSZ4b3IoJGMsJGQpOwkJCSMgcmVzdG9yZSAkYworCSAmeG9yKCRmLCZzd3RtcCgoJG4rMTMpJTE2KSk7CSMgZiBob2xkcyB4YV54Yl54Y154ZAorCSZyb3RsKCRmLDEpOwkJCSMgZj1ST1RBVEUoZiwxKQorCSAmYW5kKCR0bXAxLCRjKTsKKwkmcm90cigkYiw3KTsJCQkjIGI9Uk9UQVRFKGIsMzApCisJICZhZGQoJGUsJHRtcDEpOwkJIyBlKz1jJmQKKwkmbW92KCR0bXAxLCRhKTsJCQkjIGIgaW4gbmV4dCByb3VuZAorCSAmbW92KCZzd3RtcCgkbiUxNiksJGYpOwkjIHhpPWYKKwkmcm90bCgkYSw1KTsJCQkjIFJPVEFURShhLDUpCisJICZ4b3IoJGIsJGMpCQkJaWYgKCRuPDU5KTsKKwkmYW5kKCR0bXAxLCRiKQkJCWlmICgkbjw1OSk7IyB0bXAxIHRvIGhvbGQgRl80MF81OShiLGMsZCkKKwkgJmxlYSgkZiwmRFdQKDB4OGYxYmJjZGMsJGYsJGUpKTsjIGYrPUtfNDBfNTkrZSsoYiYoY15kKSkKKwkmbW92KCRlLCZzd3RtcCgoJG4rMSklMTYpKTsJIyBwcmUtZmV0Y2ggZiBmb3IgbmV4dCByb3VuZAorCSAmYWRkKCRmLCRhKTsJCQkjIGYrPVJPVEFURShhLDUpCit9IGVsc2UgeworCSZtb3YoJHRtcDEsJGMpOwkJCSMgdG1wMSB0byBob2xkIEZfNDBfNTkoYixjLGQpCisJICZ4b3IoJGYsJnN3dG1wKCgkbisyKSUxNikpOwkjIGYgdG8gaG9sZCBYdXBkYXRlKHhpLHhhLHhiLHhjLHhkKQorCSZ4b3IoJHRtcDEsJGQpOworCSAmeG9yKCRmLCZzd3RtcCgoJG4rOCklMTYpKTsKKwkmYW5kKCR0bXAxLCRiKTsKKwkgJnhvcigkZiwmc3d0bXAoKCRuKzEzKSUxNikpOwkjIGYgaG9sZHMgeGFeeGJeeGNeeGQKKwkmcm90bCgkZiwxKTsJCQkjIGY9Uk9UQVRFKGYsMSkKKwkgJmFkZCgkdG1wMSwkZSk7CQkjIGImKGNeZCkrPWUKKwkmcm90cigkYiwyKTsJCQkjIGI9Uk9UQVRFKGIsMzApCisJICZtb3YoJGUsJGEpOwkJCSMgZSBiZWNvbWVzIHZvbGF0aWxlCisJJnJvdGwoJGUsNSk7CQkJIyBST1RBVEUoYSw1KQorCSAmbW92KCZzd3RtcCgkbiUxNiksJGYpOwkjIHhpPWYKKwkmbGVhKCRmLCZEV1AoMHg4ZjFiYmNkYywkZiwkdG1wMSkpOyMgZis9S180MF81OStlKyhiJihjXmQpKQorCSAmbW92KCR0bXAxLCRjKTsKKwkmYWRkKCRmLCRlKTsJCQkjIGYrPVJPVEFURShhLDUpCisJICZhbmQoJHRtcDEsJGQpOworCSZtb3YoJGUsJnN3dG1wKCgkbisxKSUxNikpOwkjIHByZS1mZXRjaCBmIGZvciBuZXh0IHJvdW5kCisJICZhZGQoJGYsJHRtcDEpOwkJIyBmKz1jJmQKK30KKwl9CisKKyZmdW5jdGlvbl9iZWdpbigic2hhMV9ibG9ja19kYXRhX29yZGVyIik7CitpZiAoJHhtbSkgeworICAmc3RhdGljX2xhYmVsKCJzc3NlM19zaG9ydGN1dCIpOworICAmc3RhdGljX2xhYmVsKCJhdnhfc2hvcnRjdXQiKQkJaWYgKCR5bW0pOworICAmc3RhdGljX2xhYmVsKCJLX1hYX1hYIik7CisKKwkmY2FsbAkoJmxhYmVsKCJwaWNfcG9pbnQiKSk7CSMgbWFrZSBpdCBQSUMhCisgICZzZXRfbGFiZWwoInBpY19wb2ludCIpOworCSZibGluZHBvcCgkdG1wMSk7CisJJnBpY21ldXAoJFQsIk9QRU5TU0xfaWEzMmNhcF9QIiwkdG1wMSwmbGFiZWwoInBpY19wb2ludCIpKTsKKwkmbGVhCSgkdG1wMSwmRFdQKCZsYWJlbCgiS19YWF9YWCIpLiItIi4mbGFiZWwoInBpY19wb2ludCIpLCR0bXAxKSk7CisKKwkmbW92CSgkQSwmRFdQKDAsJFQpKTsKKwkmbW92CSgkRCwmRFdQKDQsJFQpKTsKKwkmdGVzdAkoJEQsMTw8OSk7CQkjIGNoZWNrIFNTU0UzIGJpdAorCSZqegkoJmxhYmVsKCJ4ODYiKSk7CisJJnRlc3QJKCRBLDE8PDI0KTsJCSMgY2hlY2sgRlhTUiBiaXQKKwkmanoJKCZsYWJlbCgieDg2IikpOworCWlmICgkeW1tKSB7CisJCSZhbmQJKCRELDE8PDI4KTsJCSMgbWFzayBBVlggYml0CisJCSZhbmQJKCRBLDE8PDMwKTsJCSMgbWFzayAiSW50ZWwgQ1BVIiBiaXQKKwkJJm9yCSgkQSwkRCk7CisJCSZjbXAJKCRBLDE8PDI4fDE8PDMwKTsKKwkJJmplCSgmbGFiZWwoImF2eF9zaG9ydGN1dCIpKTsKKwl9CisJJmptcAkoJmxhYmVsKCJzc3NlM19zaG9ydGN1dCIpKTsKKyAgJnNldF9sYWJlbCgieDg2IiwxNik7Cit9CisJJm1vdigkdG1wMSwmd3BhcmFtKDApKTsJIyBTSEFfQ1RYICpjCisJJm1vdigkVCwmd3BhcmFtKDEpKTsJIyBjb25zdCB2b2lkICppbnB1dAorCSZtb3YoJEEsJndwYXJhbSgyKSk7CSMgc2l6ZV90IG51bQorCSZzdGFja19wdXNoKDE2KzMpOwkjIGFsbG9jYXRlIFhbMTZdCisJJnNobCgkQSw2KTsKKwkmYWRkKCRBLCRUKTsKKwkmbW92KCZ3cGFyYW0oMiksJEEpOwkjIHBvaW50ZXIgYmV5b25kIHRoZSBlbmQgb2YgaW5wdXQKKwkmbW92KCRFLCZEV1AoMTYsJHRtcDEpKTsjIHByZS1sb2FkIEUKKwkmam1wKCZsYWJlbCgibG9vcCIpKTsKKworJnNldF9sYWJlbCgibG9vcCIsMTYpOworCisJIyBjb3B5IGlucHV0IGNodW5rIHRvIFgsIGJ1dCByZXZlcnNpbmcgYnl0ZSBvcmRlciEKKwlmb3IgKCRpPTA7ICRpPDE2OyAkaSs9NCkKKwkJeworCQkmbW92KCRBLCZEV1AoNCooJGkrMCksJFQpKTsKKwkJJm1vdigkQiwmRFdQKDQqKCRpKzEpLCRUKSk7CisJCSZtb3YoJEMsJkRXUCg0KigkaSsyKSwkVCkpOworCQkmbW92KCRELCZEV1AoNCooJGkrMyksJFQpKTsKKwkJJmJzd2FwKCRBKTsKKwkJJmJzd2FwKCRCKTsKKwkJJmJzd2FwKCRDKTsKKwkJJmJzd2FwKCREKTsKKwkJJm1vdigmc3d0bXAoJGkrMCksJEEpOworCQkmbW92KCZzd3RtcCgkaSsxKSwkQik7CisJCSZtb3YoJnN3dG1wKCRpKzIpLCRDKTsKKwkJJm1vdigmc3d0bXAoJGkrMyksJEQpOworCQl9CisJJm1vdigmd3BhcmFtKDEpLCRUKTsJIyByZWR1bmRhbnQgaW4gMXN0IHNwaW4KKworCSZtb3YoJEEsJkRXUCgwLCR0bXAxKSk7CSMgbG9hZCBTSEFfQ1RYCisJJm1vdigkQiwmRFdQKDQsJHRtcDEpKTsKKwkmbW92KCRDLCZEV1AoOCwkdG1wMSkpOworCSZtb3YoJEQsJkRXUCgxMiwkdG1wMSkpOworCSMgRSBpcyBwcmUtbG9hZGVkCisKKwlmb3IoJGk9MDskaTwxNjskaSsrKQl7ICZCT0RZXzAwXzE1KCRpLEBWKTsgdW5zaGlmdChAVixwb3AoQFYpKTsgfQorCWZvcig7JGk8MjA7JGkrKykJeyAmQk9EWV8xNl8xOSgkaSxAVik7IHVuc2hpZnQoQFYscG9wKEBWKSk7IH0KKwlmb3IoOyRpPDQwOyRpKyspCXsgJkJPRFlfMjBfMzkoJGksQFYpOyB1bnNoaWZ0KEBWLHBvcChAVikpOyB9CisJZm9yKDskaTw2MDskaSsrKQl7ICZCT0RZXzQwXzU5KCRpLEBWKTsgdW5zaGlmdChAVixwb3AoQFYpKTsgfQorCWZvcig7JGk8ODA7JGkrKykJeyAmQk9EWV8yMF8zOSgkaSxAVik7IHVuc2hpZnQoQFYscG9wKEBWKSk7IH0KKworCSgoJFZbNV0gZXEgJEQpIGFuZCAoJFZbMF0gZXEgJEUpKSBvciBkaWU7CSMgZG91YmxlLWNoZWNrCisKKwkmbW92KCR0bXAxLCZ3cGFyYW0oMCkpOwkjIHJlLWxvYWQgU0hBX0NUWCoKKwkmbW92KCRELCZ3cGFyYW0oMSkpOwkjIEQgaXMgbGFzdCAiVCIgYW5kIGlzIGRpc2NhcmRlZAorCisJJmFkZCgkRSwmRFdQKDAsJHRtcDEpKTsJIyBFIGlzIGxhc3QgIkEiLi4uCisJJmFkZCgkVCwmRFdQKDQsJHRtcDEpKTsKKwkmYWRkKCRBLCZEV1AoOCwkdG1wMSkpOworCSZhZGQoJEIsJkRXUCgxMiwkdG1wMSkpOworCSZhZGQoJEMsJkRXUCgxNiwkdG1wMSkpOworCisJJm1vdigmRFdQKDAsJHRtcDEpLCRFKTsJIyB1cGRhdGUgU0hBX0NUWAorCSAmYWRkKCRELDY0KTsJCSMgYWR2YW5jZSBpbnB1dCBwb2ludGVyCisJJm1vdigmRFdQKDQsJHRtcDEpLCRUKTsKKwkgJmNtcCgkRCwmd3BhcmFtKDIpKTsJIyBoYXZlIHdlIHJlYWNoZWQgdGhlIGVuZCB5ZXQ/CisJJm1vdigmRFdQKDgsJHRtcDEpLCRBKTsKKwkgJm1vdigkRSwkQyk7CQkjIEMgaXMgbGFzdCAiRSIgd2hpY2ggbmVlZHMgdG8gYmUgInByZS1sb2FkZWQiCisJJm1vdigmRFdQKDEyLCR0bXAxKSwkQik7CisJICZtb3YoJFQsJEQpOwkJIyBpbnB1dCBwb2ludGVyCisJJm1vdigmRFdQKDE2LCR0bXAxKSwkQyk7CisJJmpiKCZsYWJlbCgibG9vcCIpKTsKKworCSZzdGFja19wb3AoMTYrMyk7CismZnVuY3Rpb25fZW5kKCJzaGExX2Jsb2NrX2RhdGFfb3JkZXIiKTsKKworaWYgKCR4bW0pIHsKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVGhlIFNTU0UzIGltcGxlbWVudGF0aW9uLgorIworIyAleG1tWzAtN10gYXJlIHVzZWQgYXMgcmluZyBAWFtdIGJ1ZmZlciBjb250YWluaW5nIHF1YWRydXBsZXMgb2YgbGFzdAorIyAzMiBlbGVtZW50cyBvZiB0aGUgbWVzc2FnZSBzY2hlZHVsZSBvciBYdXBkYXRlIG91dHB1dHMuIEZpcnN0IDQKKyMgcXVhZHJ1cGxlcyBhcmUgc2ltcGx5IGJ5dGUtc3dhcHBlZCBpbnB1dCwgbmV4dCA0IGFyZSBjYWxjdWxhdGVkCisjIGFjY29yZGluZyB0byBtZXRob2Qgb3JpZ2luYWxseSBzdWdnZXN0ZWQgYnkgRGVhbiBHYXVkZXQgKG1vZHVsbworIyBiZWluZyBpbXBsZW1lbnRlZCBpbiBTU1NFMykuIE9uY2UgOCBxdWFkcnVwbGVzIG9yIDMyIGVsZW1lbnRzIGFyZQorIyBjb2xsZWN0ZWQsIGl0IHN3aXRjaGVzIHRvIHJvdXRpbmUgcHJvcG9zZWQgYnkgTWF4IExvY2t0eXVraGluLgorIworIyBDYWxjdWxhdGlvbnMgaW5ldml0YWJseSByZXF1aXJlIHRlbXBvcmFyeSByZXFpc3RlcnMsIGFuZCB0aGVyZSBhcmUKKyMgbm8gJXhtbSByZWdpc3RlcnMgbGVmdCB0byBzcGFyZS4gRm9yIHRoaXMgcmVhc29uIHBhcnQgb2YgdGhlIHJpbmcKKyMgYnVmZmVyLCBYWzIuLjRdIHRvIGJlIHNwZWNpZmljLCBpcyBvZmZsb2FkZWQgdG8gMyBxdWFkcmlwbGVzIHJpbmcKKyMgYnVmZmVyIG9uIHRoZSBzdGFjay4gS2VlcCBpbiBtaW5kIHRoYXQgWFsyXSBpcyBhbGlhcyBYWy02XSwgWFszXSAtCisjIFhbLTVdLCBhbmQgWFs0XSAtIFhbLTRdLi4uCisjCisjIEFub3RoZXIgbm90YWJsZSBvcHRpbWl6YXRpb24gaXMgYWdncmVzc2l2ZSBzdGFjayBmcmFtZSBjb21wcmVzc2lvbgorIyBhaW1pbmcgdG8gbWluaW1pemUgYW1vdW50IG9mIDktYnl0ZSBpbnN0cnVjdGlvbnMuLi4KKyMKKyMgWWV0IGFub3RoZXIgbm90YWJsZSBvcHRpbWl6YXRpb24gaXMgImp1bXBpbmciICRCIHZhcmlhYmxlLiBJdCBtZWFucworIyB0aGF0IHRoZXJlIGlzIG5vIHJlZ2lzdGVyIHBlcm1hbmVudGx5IGFsbG9jYXRlZCBmb3IgJEIgdmFsdWUuIFRoaXMKKyMgYWxsb3dlZCB0byBlbGltaW5hdGUgb25lIGluc3RydWN0aW9uIGZyb20gYm9keV8yMF8zOS4uLgorIworbXkgJFhpPTQ7CQkJIyA0eFNJTUQgWHVwZGF0ZSByb3VuZCwgc3RhcnQgcHJlLXNlZWRlZAorbXkgQFg9bWFwKCJ4bW0kXyIsKDQuLjcsMC4uMykpOwkjIHByZS1zZWVkZWQgZm9yICRYaT00CitteSBAVj0oJEEsJEIsJEMsJEQsJEUpOworbXkgJGo9MDsJCQkjIGhhc2ggcm91bmQKK215ICRyeD0wOworbXkgQFQ9KCRULCR0bXAxKTsKK215ICRpbnA7CisKK215ICRfcm9sPXN1YiB7ICZyb2woQF8pIH07CitteSAkX3Jvcj1zdWIgeyAmcm9yKEBfKSB9OworCismZnVuY3Rpb25fYmVnaW4oIl9zaGExX2Jsb2NrX2RhdGFfb3JkZXJfc3NzZTMiKTsKKwkmY2FsbAkoJmxhYmVsKCJwaWNfcG9pbnQiKSk7CSMgbWFrZSBpdCBQSUMhCisJJnNldF9sYWJlbCgicGljX3BvaW50Iik7CisJJmJsaW5kcG9wKCR0bXAxKTsKKwkmbGVhCSgkdG1wMSwmRFdQKCZsYWJlbCgiS19YWF9YWCIpLiItIi4mbGFiZWwoInBpY19wb2ludCIpLCR0bXAxKSk7Cismc2V0X2xhYmVsKCJzc3NlM19zaG9ydGN1dCIpOworCisJJm1vdmRxYQkoQFhbM10sJlFXUCgwLCR0bXAxKSk7CQkjIEtfMDBfMTkKKwkmbW92ZHFhCShAWFs0XSwmUVdQKDE2LCR0bXAxKSk7CQkjIEtfMjBfMzkKKwkmbW92ZHFhCShAWFs1XSwmUVdQKDMyLCR0bXAxKSk7CQkjIEtfNDBfNTkKKwkmbW92ZHFhCShAWFs2XSwmUVdQKDQ4LCR0bXAxKSk7CQkjIEtfNjBfNzkKKwkmbW92ZHFhCShAWFsyXSwmUVdQKDY0LCR0bXAxKSk7CQkjIHBic3dhcCBtYXNrCisKKwkmbW92CSgkRSwmd3BhcmFtKDApKTsJCSMgbG9hZCBhcmd1bWVudCBibG9jaworCSZtb3YJKCRpbnA9QFRbMV0sJndwYXJhbSgxKSk7CisJJm1vdgkoJEQsJndwYXJhbSgyKSk7CisJJm1vdgkoQFRbMF0sImVzcCIpOworCisJIyBzdGFjayBmcmFtZSBsYXlvdXQKKwkjCisJIyArMAlYWzBdK0sJWFsxXStLCVhbMl0rSwlYWzNdK0sJIyBYTU0tPklBTFUgeGZlciBhcmVhCisJIwlYWzRdK0sJWFs1XStLCVhbNl0rSwlYWzddK0sKKwkjCVhbOF0rSwlYWzldK0sJWFsxMF0rSwlYWzExXStLCisJIwlYWzEyXStLCVhbMTNdK0sJWFsxNF0rSwlYWzE1XStLCisJIworCSMgKzY0CVhbMF0JWFsxXQlYWzJdCVhbM10JIyBYTU0tPlhNTSBiYWNrdHJhY2UgYXJlYQorCSMJWFs0XQlYWzVdCVhbNl0JWFs3XQorCSMJWFs4XQlYWzldCVhbMTBdCVhbMTFdCSMgZXZlbiBib3Jyb3dlZCBmb3IgS18wMF8xOQorCSMKKwkjICsxMTIJS18yMF8zOQlLXzIwXzM5CUtfMjBfMzkJS18yMF8zOQkjIGNvbnN0YW50cworCSMJS180MF81OQlLXzQwXzU5CUtfNDBfNTkJS180MF81OQorCSMJS182MF83OQlLXzYwXzc5CUtfNjBfNzkJS182MF83OQorCSMJS18wMF8xOQlLXzAwXzE5CUtfMDBfMTkJS18wMF8xOQorCSMJcGJzd2FwIG1hc2sKKwkjCisJIyArMTkyCWN0eAkJCQkjIGFyZ3VtZW50IGJsb2NrCisJIyArMTk2CWlucAorCSMgKzIwMAllbmQKKwkjICsyMDQJZXNwCisJJnN1YgkoImVzcCIsMjA4KTsKKwkmYW5kCSgiZXNwIiwtNjQpOworCisJJm1vdmRxYQkoJlFXUCgxMTIrMCwiZXNwIiksQFhbNF0pOwkjIGNvcHkgY29uc3RhbnRzCisJJm1vdmRxYQkoJlFXUCgxMTIrMTYsImVzcCIpLEBYWzVdKTsKKwkmbW92ZHFhCSgmUVdQKDExMiszMiwiZXNwIiksQFhbNl0pOworCSZzaGwJKCRELDYpOwkJCQkjIGxlbio2NAorCSZtb3ZkcWEJKCZRV1AoMTEyKzQ4LCJlc3AiKSxAWFszXSk7CisJJmFkZAkoJEQsJGlucCk7CQkJIyBlbmQgb2YgaW5wdXQKKwkmbW92ZHFhCSgmUVdQKDExMis2NCwiZXNwIiksQFhbMl0pOworCSZhZGQJKCRpbnAsNjQpOworCSZtb3YJKCZEV1AoMTkyKzAsImVzcCIpLCRFKTsJCSMgc2F2ZSBhcmd1bWVudCBibG9jaworCSZtb3YJKCZEV1AoMTkyKzQsImVzcCIpLCRpbnApOworCSZtb3YJKCZEV1AoMTkyKzgsImVzcCIpLCREKTsKKwkmbW92CSgmRFdQKDE5MisxMiwiZXNwIiksQFRbMF0pOwkjIHNhdmUgb3JpZ2luYWwgJWVzcAorCisJJm1vdgkoJEEsJkRXUCgwLCRFKSk7CQkjIGxvYWQgY29udGV4dAorCSZtb3YJKCRCLCZEV1AoNCwkRSkpOworCSZtb3YJKCRDLCZEV1AoOCwkRSkpOworCSZtb3YJKCRELCZEV1AoMTIsJEUpKTsKKwkmbW92CSgkRSwmRFdQKDE2LCRFKSk7CisJJm1vdgkoQFRbMF0sJEIpOwkJCSMgbWFnaWMgc2VlZAorCisJJm1vdmRxdQkoQFhbLTQmN10sJlFXUCgtNjQsJGlucCkpOwkjIGxvYWQgaW5wdXQgdG8gJXhtbVswLTNdCisJJm1vdmRxdQkoQFhbLTMmN10sJlFXUCgtNDgsJGlucCkpOworCSZtb3ZkcXUJKEBYWy0yJjddLCZRV1AoLTMyLCRpbnApKTsKKwkmbW92ZHF1CShAWFstMSY3XSwmUVdQKC0xNiwkaW5wKSk7CisJJnBzaHVmYgkoQFhbLTQmN10sQFhbMl0pOwkJIyBieXRlIHN3YXAKKwkmcHNodWZiCShAWFstMyY3XSxAWFsyXSk7CisJJnBzaHVmYgkoQFhbLTImN10sQFhbMl0pOworCSZtb3ZkcWEJKCZRV1AoMTEyLTE2LCJlc3AiKSxAWFszXSk7CSMgYm9ycm93IGxhc3QgYmFja3RyYWNlIHNsb3QKKwkmcHNodWZiCShAWFstMSY3XSxAWFsyXSk7CisJJnBhZGRkCShAWFstNCY3XSxAWFszXSk7CQkjIGFkZCBLXzAwXzE5CisJJnBhZGRkCShAWFstMyY3XSxAWFszXSk7CisJJnBhZGRkCShAWFstMiY3XSxAWFszXSk7CisJJm1vdmRxYQkoJlFXUCgwLCJlc3AiKSxAWFstNCY3XSk7CSMgWFtdK0sgeGZlciB0byBJQUxVCisJJnBzdWJkCShAWFstNCY3XSxAWFszXSk7CQkjIHJlc3RvcmUgWFtdCisJJm1vdmRxYQkoJlFXUCgwKzE2LCJlc3AiKSxAWFstMyY3XSk7CisJJnBzdWJkCShAWFstMyY3XSxAWFszXSk7CisJJm1vdmRxYQkoJlFXUCgwKzMyLCJlc3AiKSxAWFstMiY3XSk7CisJJm1vdgkoQFRbMV0sJEMpOworCSZwc3ViZAkoQFhbLTImN10sQFhbM10pOworCSZ4b3IJKEBUWzFdLCREKTsKKwkmbW92ZHFhCShAWFswXSxAWFstMyY3XSk7CisJJmFuZAkoQFRbMF0sQFRbMV0pOworCSZqbXAJKCZsYWJlbCgibG9vcCIpKTsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBTU0UgaW5zdHJ1Y3Rpb24gc2VxdWVuY2UgaXMgZmlyc3QgYnJva2VuIHRvIGdyb3VwcyBvZiBpbmRlcGVudGVudAorIyBpbnN0cnVjdGlvbnMsIGluZGVwZW5kZW50IGluIHJlc3BlY3QgdG8gdGhlaXIgaW5wdXRzIGFuZCBzaGlmdGVyCisjIChub3QgYWxsIGFyY2hpdGVjdHVyZXMgaGF2ZSBtb3JlIHRoYW4gb25lKS4gVGhlbiBJQUxVIGluc3RydWN0aW9ucworIyBhcmUgImtuaXR0ZWQgaW4iIGJldHdlZW4gdGhlIFNTRSBncm91cHMuIERpc3RhbmNlIGlzIG1haW50YWluZWQgZm9yCisjIFNTRSBsYXRlbmN5IG9mIDIgaW4gaG9wZSB0aGF0IGl0IGZpdHMgYmV0dGVyIHVwY29taW5nIEFNRCBCdWxsZG96ZXIKKyMgW3doaWNoIGFsbGVnZWRseSBhbHNvIGltcGxlbWVudHMgU1NTRTNdLi4uCisjCisjIFRlbXBvcmFyeSByZWdpc3RlcnMgdXNhZ2UuIFhbMl0gaXMgdm9sYXRpbGUgYXQgdGhlIGVudHJ5IGFuZCBhdCB0aGUKKyMgZW5kIGlzIHJlc3RvcmVkIGZyb20gYmFja3RyYWNlIHJpbmcgYnVmZmVyLiBYWzNdIGlzIGV4cGVjdGVkIHRvCisjIGNvbnRhaW4gY3VycmVudCBLX1hYX1hYIGNvbnN0YW50IGFuZCBpcyB1c2VkIHRvIGNhY2x1bGF0ZSBYWy0xXStLCisjIGZyb20gcHJldmlvdXMgcm91bmQsIGl0IGJlY29tZXMgdm9sYXRpbGUgdGhlIG1vbWVudCB0aGUgdmFsdWUgaXMKKyMgc2F2ZWQgdG8gc3RhY2sgZm9yIHRyYW5zZmVyIHRvIElBTFUuIFhbNF0gYmVjb21lcyB2b2xhdGlsZSB3aGVuZXZlcgorIyBYWy00XSBpcyBhY2N1bXVsYXRlZCBhbmQgb2ZmbG9hZGVkIHRvIGJhY2t0cmFjZSByaW5nIGJ1ZmZlciwgYXQgdGhlCisjIGVuZCBpdCBpcyBsb2FkZWQgd2l0aCBuZXh0IEtfWFhfWFggW3doaWNoIGJlY29tZXMgWFszXSBpbiBuZXh0CisjIHJvdW5kXS4uLgorIworc3ViIFh1cGRhdGVfc3NzZTNfMTZfMzEoKQkJIyByZWNhbGwgdGhhdCAkWGkgc3RhcnRzIHd0aWggNAoreyB1c2UgaW50ZWdlcjsKKyAgbXkgJGJvZHkgPSBzaGlmdDsKKyAgbXkgQGluc25zID0gKCYkYm9keSwmJGJvZHksJiRib2R5LCYkYm9keSk7CSMgNDAgaW5zdHJ1Y3Rpb25zCisgIG15ICgkYSwkYiwkYywkZCwkZSk7CisKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmcGFsaWducihAWFswXSxAWFstNCY3XSw4KTsJIyBjb21wb3NlICJYWy0xNF0iIGluICJYWzBdIgorCSZtb3ZkcWEJKEBYWzJdLEBYWy0xJjddKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKworCSAgJnBhZGRkCShAWFszXSxAWFstMSY3XSk7CisJICAmbW92ZHFhCSgmUVdQKDY0KzE2KigoJFhpLTQpJTMpLCJlc3AiKSxAWFstNCY3XSk7IyBzYXZlIFhbXSB0byBiYWNrdHJhY2UgYnVmZmVyCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJnBzcmxkcQkoQFhbMl0sNCk7CQkjICJYWy0zXSIsIDMgZHdvcmRzCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJnB4b3IJKEBYWzBdLEBYWy00JjddKTsJIyAiWFswXSJePSJYWy0xNl0iCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisKKwkmcHhvcgkoQFhbMl0sQFhbLTImN10pOwkjICJYWy0zXSJeIlhbLThdIgorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCisJJnB4b3IJKEBYWzBdLEBYWzJdKTsJCSMgIlhbMF0iXj0iWFstM10iXiJYWy04XSIKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgICZtb3ZkcWEJKCZRV1AoMCsxNiooKCRYaS0xKSYzKSwiZXNwIiksQFhbM10pOwkjIFhbXStLIHhmZXIgdG8gSUFMVQorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCisJJm1vdmRxYQkoQFhbNF0sQFhbMF0pOworCSZtb3ZkcWEJKEBYWzJdLEBYWzBdKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKworCSZwc2xsZHEJKEBYWzRdLDEyKTsJCSMgIlhbMF0iPDw5NiwgZXh0cmFjdCBvbmUgZHdvcmQKKwkmcGFkZGQJKEBYWzBdLEBYWzBdKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKworCSZwc3JsZAkoQFhbMl0sMzEpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSZtb3ZkcWEJKEBYWzNdLEBYWzRdKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKworCSZwc3JsZAkoQFhbNF0sMzApOworCSZwb3IJKEBYWzBdLEBYWzJdKTsJCSMgIlhbMF0iPDw8PTEKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgICZtb3ZkcWEJKEBYWzJdLCZRV1AoNjQrMTYqKCgkWGktNiklMyksImVzcCIpKSBpZiAoJFhpPjUpOwkjIHJlc3RvcmUgWFtdIGZyb20gYmFja3RyYWNlIGJ1ZmZlcgorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCisJJnBzbGxkCShAWFszXSwyKTsKKwkmcHhvcgkoQFhbMF0sQFhbNF0pOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgJm1vdmRxYQkoQFhbNF0sJlFXUCgxMTItMTYrMTYqKCgkWGkpLzUpLCJlc3AiKSk7CSMgS19YWF9YWAorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCisJJnB4b3IJKEBYWzBdLEBYWzNdKTsJCSMgIlhbMF0iXj0oIlhbMF0iPDw5Nik8PDwyCisJICAmbW92ZHFhCShAWFsxXSxAWFstMiY3XSkJaWYgKCRYaTw3KTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKworCSBmb3JlYWNoIChAaW5zbnMpIHsgZXZhbDsgfQkjIHJlbWFpbmluZyBpbnN0cnVjdGlvbnMgW2lmIGFueV0KKworICAkWGkrKzsJcHVzaChAWCxzaGlmdChAWCkpOwkjICJyb3RhdGUiIFhbXQorfQorCitzdWIgWHVwZGF0ZV9zc3NlM18zMl83OSgpCit7IHVzZSBpbnRlZ2VyOworICBteSAkYm9keSA9IHNoaWZ0OworICBteSBAaW5zbnMgPSAoJiRib2R5LCYkYm9keSwmJGJvZHksJiRib2R5KTsJIyAzMiB0byA0NCBpbnN0cnVjdGlvbnMKKyAgbXkgKCRhLCRiLCRjLCRkLCRlKTsKKworCSZtb3ZkcWEJKEBYWzJdLEBYWy0xJjddKQlpZiAoJFhpPT04KTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsJCSMgYm9keV8yMF8zOQorCSZweG9yCShAWFswXSxAWFstNCY3XSk7CSMgIlhbMF0iPSJYWy0zMl0iXiJYWy0xNl0iCisJJnBhbGlnbnIoQFhbMl0sQFhbLTImN10sOCk7CSMgY29tcG9zZSAiWFstNl0iCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CQkjIHJvbAorCisJJnB4b3IJKEBYWzBdLEBYWy03JjddKTsJIyAiWFswXSJePSJYWy0yOF0iCisJICAmbW92ZHFhCSgmUVdQKDY0KzE2KigoJFhpLTQpJTMpLCJlc3AiKSxAWFstNCY3XSk7CSMgc2F2ZSBYW10gdG8gYmFja3RyYWNlIGJ1ZmZlcgorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBpZiAoJFhpJTUpIHsKKwkgICZtb3ZkcWEJKEBYWzRdLEBYWzNdKTsJIyAicGVycGV0dWF0ZSIgS19YWF9YWC4uLgorCSB9IGVsc2UgewkJCSMgLi4uIG9yIGxvYWQgbmV4dCBvbmUKKwkgICZtb3ZkcWEJKEBYWzRdLCZRV1AoMTEyLTE2KzE2KigkWGkvNSksImVzcCIpKTsKKwkgfQorCSAgJnBhZGRkCShAWFszXSxAWFstMSY3XSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CQkjIHJvcgorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCisJJnB4b3IJKEBYWzBdLEBYWzJdKTsJCSMgIlhbMF0iXj0iWFstNl0iCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CQkjIGJvZHlfMjBfMzkKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsJCSMgcm9sCisKKwkmbW92ZHFhCShAWFsyXSxAWFswXSk7CisJICAmbW92ZHFhCSgmUVdQKDArMTYqKCgkWGktMSkmMyksImVzcCIpLEBYWzNdKTsJIyBYW10rSyB4ZmVyIHRvIElBTFUKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsJCSMgcm9yCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisKKwkmcHNsbGQJKEBYWzBdLDIpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOwkJIyBib2R5XzIwXzM5CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJnBzcmxkCShAWFsyXSwzMCk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CQkjIHJvbAorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOwkJIyByb3IKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKworCSZwb3IJKEBYWzBdLEBYWzJdKTsJCSMgIlhbMF0iPDw8PTIKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsJCSMgYm9keV8yMF8zOQorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgJm1vdmRxYQkoQFhbMl0sJlFXUCg2NCsxNiooKCRYaS02KSUzKSwiZXNwIikpIGlmKCRYaTwxOSk7CSMgcmVzdG9yZSBYW10gZnJvbSBiYWNrdHJhY2UgYnVmZmVyCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CQkjIHJvbAorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOwkJIyByb3IKKwkgICZtb3ZkcWEJKEBYWzNdLEBYWzBdKQlpZiAoJFhpPDE5KTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKworCSBmb3JlYWNoIChAaW5zbnMpIHsgZXZhbDsgfQkjIHJlbWFpbmluZyBpbnN0cnVjdGlvbnMKKworICAkWGkrKzsJcHVzaChAWCxzaGlmdChAWCkpOwkjICJyb3RhdGUiIFhbXQorfQorCitzdWIgWHVwbGFzdF9zc3NlM184MCgpCit7IHVzZSBpbnRlZ2VyOworICBteSAkYm9keSA9IHNoaWZ0OworICBteSBAaW5zbnMgPSAoJiRib2R5LCYkYm9keSwmJGJvZHksJiRib2R5KTsJIyAzMiBpbnN0cnVjdGlvbnMKKyAgbXkgKCRhLCRiLCRjLCRkLCRlKTsKKworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgJnBhZGRkCShAWFszXSxAWFstMSY3XSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisKKwkgICZtb3ZkcWEJKCZRV1AoMCsxNiooKCRYaS0xKSYzKSwiZXNwIiksQFhbM10pOwkjIFhbXStLIHhmZXIgSUFMVQorCisJIGZvcmVhY2ggKEBpbnNucykgeyBldmFsOyB9CQkjIHJlbWFpbmluZyBpbnN0cnVjdGlvbnMKKworCSZtb3YJKCRpbnA9QFRbMV0sJkRXUCgxOTIrNCwiZXNwIikpOworCSZjbXAJKCRpbnAsJkRXUCgxOTIrOCwiZXNwIikpOworCSZqZQkoJmxhYmVsKCJkb25lIikpOworCisJJm1vdmRxYQkoQFhbM10sJlFXUCgxMTIrNDgsImVzcCIpKTsJIyBLXzAwXzE5CisJJm1vdmRxYQkoQFhbMl0sJlFXUCgxMTIrNjQsImVzcCIpKTsJIyBwYnN3YXAgbWFzaworCSZtb3ZkcXUJKEBYWy00JjddLCZRV1AoMCwkaW5wKSk7CSMgbG9hZCBpbnB1dAorCSZtb3ZkcXUJKEBYWy0zJjddLCZRV1AoMTYsJGlucCkpOworCSZtb3ZkcXUJKEBYWy0yJjddLCZRV1AoMzIsJGlucCkpOworCSZtb3ZkcXUJKEBYWy0xJjddLCZRV1AoNDgsJGlucCkpOworCSZhZGQJKCRpbnAsNjQpOworCSZwc2h1ZmIJKEBYWy00JjddLEBYWzJdKTsJCSMgYnl0ZSBzd2FwCisJJm1vdgkoJkRXUCgxOTIrNCwiZXNwIiksJGlucCk7CisJJm1vdmRxYQkoJlFXUCgxMTItMTYsImVzcCIpLEBYWzNdKTsJIyBib3Jyb3cgbGFzdCBiYWNrdHJhY2Ugc2xvdAorCisgICRYaT0wOworfQorCitzdWIgWGxvb3Bfc3NzZTMoKQoreyB1c2UgaW50ZWdlcjsKKyAgbXkgJGJvZHkgPSBzaGlmdDsKKyAgbXkgQGluc25zID0gKCYkYm9keSwmJGJvZHksJiRib2R5LCYkYm9keSk7CSMgMzIgaW5zdHJ1Y3Rpb25zCisgIG15ICgkYSwkYiwkYywkZCwkZSk7CisKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmcHNodWZiCShAWFsoJFhpLTMpJjddLEBYWzJdKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmcGFkZGQJKEBYWygkWGktNCkmN10sQFhbM10pOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSZtb3ZkcWEJKCZRV1AoMCsxNiokWGksImVzcCIpLEBYWygkWGktNCkmN10pOwkjIFhbXStLIHhmZXIgdG8gSUFMVQorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSZwc3ViZAkoQFhbKCRYaS00KSY3XSxAWFszXSk7CisKKwlmb3JlYWNoIChAaW5zbnMpIHsgZXZhbDsgfQorICAkWGkrKzsKK30KKworc3ViIFh0YWlsX3Nzc2UzKCkKK3sgdXNlIGludGVnZXI7CisgIG15ICRib2R5ID0gc2hpZnQ7CisgIG15IEBpbnNucyA9ICgmJGJvZHksJiRib2R5LCYkYm9keSwmJGJvZHkpOwkjIDMyIGluc3RydWN0aW9ucworICBteSAoJGEsJGIsJGMsJGQsJGUpOworCisJZm9yZWFjaCAoQGluc25zKSB7IGV2YWw7IH0KK30KKworc3ViIGJvZHlfMDBfMTkgKCkgewkjICgoY15kKSZiKV5kCisJIyBvbiBzdGFydCBAVFswXT0oY15kKSZiCisJcmV0dXJuICZib2R5XzIwXzM5KCkJaWYgKCRyeD09MTkpOwkkcngrKzsKKwkoCisJJygkYSwkYiwkYywkZCwkZSk9QFY7Jy4KKwknJiRfcm9yCSgkYiwkaj83OjIpOycsCSMgJGI+Pj4yCisJJyZ4b3IJKEBUWzBdLCRkKTsnLAorCScmbW92CShAVFsxXSwkYSk7JywJIyAkYiBpbiBuZXh0IHJvdW5kCisKKwknJmFkZAkoJGUsJkRXUCg0KigkaiYxNSksImVzcCIpKTsnLAkjIFhbXStLIHhmZXIKKwknJnhvcgkoJGIsJGMpOycsCSMgJGNeJGQgZm9yIG5leHQgcm91bmQKKworCScmJF9yb2wJKCRhLDUpOycsCisJJyZhZGQJKCRlLEBUWzBdKTsnLAorCScmYW5kCShAVFsxXSwkYik7JywJIyAoJGImKCRjXiRkKSkgZm9yIG5leHQgcm91bmQKKworCScmeG9yCSgkYiwkYyk7JywJIyByZXN0b3JlICRiCisJJyZhZGQJKCRlLCRhKTsnCS4nJGorKzsgdW5zaGlmdChAVixwb3AoQFYpKTsgdW5zaGlmdChAVCxwb3AoQFQpKTsnCisJKTsKK30KKworc3ViIGJvZHlfMjBfMzkgKCkgewkjIGJeZF5jCisJIyBvbiBlbnRyeSBAVFswXT1iXmQKKwlyZXR1cm4gJmJvZHlfNDBfNTkoKQlpZiAoJHJ4PT0zOSk7CSRyeCsrOworCSgKKwknKCRhLCRiLCRjLCRkLCRlKT1AVjsnLgorCScmYWRkCSgkZSwmRFdQKDQqKCRqJjE1KSwiZXNwIikpOycsCSMgWFtdK0sgeGZlcgorCScmeG9yCShAVFswXSwkZCkJaWYoJGo9PTE5KTsnLgorCScmeG9yCShAVFswXSwkYykJaWYoJGo+IDE5KTsnLAkjICgkYl4kZF4kYykKKwknJm1vdgkoQFRbMV0sJGEpOycsCSMgJGIgaW4gbmV4dCByb3VuZAorCisJJyYkX3JvbAkoJGEsNSk7JywKKwknJmFkZAkoJGUsQFRbMF0pOycsCisJJyZ4b3IJKEBUWzFdLCRjKQlpZiAoJGo8IDc5KTsnLAkjICRiXiRkIGZvciBuZXh0IHJvdW5kCisKKwknJiRfcm9yCSgkYiw3KTsnLAkjICRiPj4+MgorCScmYWRkCSgkZSwkYSk7JwkuJyRqKys7IHVuc2hpZnQoQFYscG9wKEBWKSk7IHVuc2hpZnQoQFQscG9wKEBUKSk7JworCSk7Cit9CisKK3N1YiBib2R5XzQwXzU5ICgpIHsJIyAoKGJeYykmKGNeZCkpXmMKKwkjIG9uIGVudHJ5IEBUWzBdPShiXmMpLCAoY149ZCkKKwkkcngrKzsKKwkoCisJJygkYSwkYiwkYywkZCwkZSk9QFY7Jy4KKwknJmFkZAkoJGUsJkRXUCg0KigkaiYxNSksImVzcCIpKTsnLAkjIFhbXStLIHhmZXIKKwknJmFuZAkoQFRbMF0sJGMpCWlmICgkaj49NDApOycsCSMgKGJeYykmKGNeZCkKKwknJnhvcgkoJGMsJGQpCQlpZiAoJGo+PTQwKTsnLAkjIHJlc3RvcmUgJGMKKworCScmJF9yb3IJKCRiLDcpOycsCSMgJGI+Pj4yCisJJyZtb3YJKEBUWzFdLCRhKTsnLAkjICRiIGZvciBuZXh0IHJvdW5kCisJJyZ4b3IJKEBUWzBdLCRjKTsnLAorCisJJyYkX3JvbAkoJGEsNSk7JywKKwknJmFkZAkoJGUsQFRbMF0pOycsCisJJyZ4b3IJKEBUWzFdLCRjKQlpZiAoJGo9PTU5KTsnLgorCScmeG9yCShAVFsxXSwkYikJaWYgKCRqPCA1OSk7JywJIyBiXmMgZm9yIG5leHQgcm91bmQKKworCScmeG9yCSgkYiwkYykJCWlmICgkajwgNTkpOycsCSMgY15kIGZvciBuZXh0IHJvdW5kCisJJyZhZGQJKCRlLCRhKTsnCS4nJGorKzsgdW5zaGlmdChAVixwb3AoQFYpKTsgdW5zaGlmdChAVCxwb3AoQFQpKTsnCisJKTsKK30KKworJnNldF9sYWJlbCgibG9vcCIsMTYpOworCSZYdXBkYXRlX3Nzc2UzXzE2XzMxKFwmYm9keV8wMF8xOSk7CisJJlh1cGRhdGVfc3NzZTNfMTZfMzEoXCZib2R5XzAwXzE5KTsKKwkmWHVwZGF0ZV9zc3NlM18xNl8zMShcJmJvZHlfMDBfMTkpOworCSZYdXBkYXRlX3Nzc2UzXzE2XzMxKFwmYm9keV8wMF8xOSk7CisJJlh1cGRhdGVfc3NzZTNfMzJfNzkoXCZib2R5XzAwXzE5KTsKKwkmWHVwZGF0ZV9zc3NlM18zMl83OShcJmJvZHlfMjBfMzkpOworCSZYdXBkYXRlX3Nzc2UzXzMyXzc5KFwmYm9keV8yMF8zOSk7CisJJlh1cGRhdGVfc3NzZTNfMzJfNzkoXCZib2R5XzIwXzM5KTsKKwkmWHVwZGF0ZV9zc3NlM18zMl83OShcJmJvZHlfMjBfMzkpOworCSZYdXBkYXRlX3Nzc2UzXzMyXzc5KFwmYm9keV8yMF8zOSk7CisJJlh1cGRhdGVfc3NzZTNfMzJfNzkoXCZib2R5XzQwXzU5KTsKKwkmWHVwZGF0ZV9zc3NlM18zMl83OShcJmJvZHlfNDBfNTkpOworCSZYdXBkYXRlX3Nzc2UzXzMyXzc5KFwmYm9keV80MF81OSk7CisJJlh1cGRhdGVfc3NzZTNfMzJfNzkoXCZib2R5XzQwXzU5KTsKKwkmWHVwZGF0ZV9zc3NlM18zMl83OShcJmJvZHlfNDBfNTkpOworCSZYdXBkYXRlX3Nzc2UzXzMyXzc5KFwmYm9keV8yMF8zOSk7CisJJlh1cGxhc3Rfc3NzZTNfODAoXCZib2R5XzIwXzM5KTsJIyBjYW4ganVtcCB0byAiZG9uZSIKKworCQkJCSRzYXZlZF9qPSRqOyBAc2F2ZWRfVj1AVjsKKworCSZYbG9vcF9zc3NlMyhcJmJvZHlfMjBfMzkpOworCSZYbG9vcF9zc3NlMyhcJmJvZHlfMjBfMzkpOworCSZYbG9vcF9zc3NlMyhcJmJvZHlfMjBfMzkpOworCisJJm1vdgkoQFRbMV0sJkRXUCgxOTIsImVzcCIpKTsJIyB1cGRhdGUgY29udGV4dAorCSZhZGQJKCRBLCZEV1AoMCxAVFsxXSkpOworCSZhZGQJKEBUWzBdLCZEV1AoNCxAVFsxXSkpOwkJIyAkYgorCSZhZGQJKCRDLCZEV1AoOCxAVFsxXSkpOworCSZtb3YJKCZEV1AoMCxAVFsxXSksJEEpOworCSZhZGQJKCRELCZEV1AoMTIsQFRbMV0pKTsKKwkmbW92CSgmRFdQKDQsQFRbMV0pLEBUWzBdKTsKKwkmYWRkCSgkRSwmRFdQKDE2LEBUWzFdKSk7CisJJm1vdgkoJkRXUCg4LEBUWzFdKSwkQyk7CisJJm1vdgkoJEIsJEMpOworCSZtb3YJKCZEV1AoMTIsQFRbMV0pLCREKTsKKwkmeG9yCSgkQiwkRCk7CisJJm1vdgkoJkRXUCgxNixAVFsxXSksJEUpOworCSZhbmQJKCRCLEBUWzBdKTsKKwkmbW92ZHFhCShAWFswXSxAWFstMyY3XSk7CisJJnhjaGcJKCRCLEBUWzBdKTsKKworCSZqbXAJKCZsYWJlbCgibG9vcCIpKTsKKworJnNldF9sYWJlbCgiZG9uZSIsMTYpOwkJJGo9JHNhdmVkX2o7IEBWPUBzYXZlZF9WOworCisJJlh0YWlsX3Nzc2UzKFwmYm9keV8yMF8zOSk7CisJJlh0YWlsX3Nzc2UzKFwmYm9keV8yMF8zOSk7CisJJlh0YWlsX3Nzc2UzKFwmYm9keV8yMF8zOSk7CisKKwkmbW92CShAVFsxXSwmRFdQKDE5MiwiZXNwIikpOwkjIHVwZGF0ZSBjb250ZXh0CisJJmFkZAkoJEEsJkRXUCgwLEBUWzFdKSk7CisJJm1vdgkoImVzcCIsJkRXUCgxOTIrMTIsImVzcCIpKTsJIyByZXN0b3JlICVlc3AKKwkmYWRkCShAVFswXSwmRFdQKDQsQFRbMV0pKTsJCSMgJGIKKwkmYWRkCSgkQywmRFdQKDgsQFRbMV0pKTsKKwkmbW92CSgmRFdQKDAsQFRbMV0pLCRBKTsKKwkmYWRkCSgkRCwmRFdQKDEyLEBUWzFdKSk7CisJJm1vdgkoJkRXUCg0LEBUWzFdKSxAVFswXSk7CisJJmFkZAkoJEUsJkRXUCgxNixAVFsxXSkpOworCSZtb3YJKCZEV1AoOCxAVFsxXSksJEMpOworCSZtb3YJKCZEV1AoMTIsQFRbMV0pLCREKTsKKwkmbW92CSgmRFdQKDE2LEBUWzFdKSwkRSk7CisKKyZmdW5jdGlvbl9lbmQoIl9zaGExX2Jsb2NrX2RhdGFfb3JkZXJfc3NzZTMiKTsKKworJHJ4PTA7CSMgcmVzZXQKKworaWYgKCR5bW0pIHsKK215ICRYaT00OwkJCSMgNHhTSU1EIFh1cGRhdGUgcm91bmQsIHN0YXJ0IHByZS1zZWVkZWQKK215IEBYPW1hcCgieG1tJF8iLCg0Li43LDAuLjMpKTsJIyBwcmUtc2VlZGVkIGZvciAkWGk9NAorbXkgQFY9KCRBLCRCLCRDLCRELCRFKTsKK215ICRqPTA7CQkJIyBoYXNoIHJvdW5kCitteSBAVD0oJFQsJHRtcDEpOworbXkgJGlucDsKKworbXkgJF9yb2w9c3ViIHsgJnNobGQoQF9bMF0sQF8pIH07CitteSAkX3Jvcj1zdWIgeyAmc2hyZChAX1swXSxAXykgfTsKKworJmZ1bmN0aW9uX2JlZ2luKCJfc2hhMV9ibG9ja19kYXRhX29yZGVyX2F2eCIpOworCSZjYWxsCSgmbGFiZWwoInBpY19wb2ludCIpKTsJIyBtYWtlIGl0IFBJQyEKKwkmc2V0X2xhYmVsKCJwaWNfcG9pbnQiKTsKKwkmYmxpbmRwb3AoJHRtcDEpOworCSZsZWEJKCR0bXAxLCZEV1AoJmxhYmVsKCJLX1hYX1hYIikuIi0iLiZsYWJlbCgicGljX3BvaW50IiksJHRtcDEpKTsKKyZzZXRfbGFiZWwoImF2eF9zaG9ydGN1dCIpOworCSZ2emVyb2FsbCgpOworCisJJnZtb3ZkcWEoQFhbM10sJlFXUCgwLCR0bXAxKSk7CQkjIEtfMDBfMTkKKwkmdm1vdmRxYShAWFs0XSwmUVdQKDE2LCR0bXAxKSk7CQkjIEtfMjBfMzkKKwkmdm1vdmRxYShAWFs1XSwmUVdQKDMyLCR0bXAxKSk7CQkjIEtfNDBfNTkKKwkmdm1vdmRxYShAWFs2XSwmUVdQKDQ4LCR0bXAxKSk7CQkjIEtfNjBfNzkKKwkmdm1vdmRxYShAWFsyXSwmUVdQKDY0LCR0bXAxKSk7CQkjIHBic3dhcCBtYXNrCisKKwkmbW92CSgkRSwmd3BhcmFtKDApKTsJCSMgbG9hZCBhcmd1bWVudCBibG9jaworCSZtb3YJKCRpbnA9QFRbMV0sJndwYXJhbSgxKSk7CisJJm1vdgkoJEQsJndwYXJhbSgyKSk7CisJJm1vdgkoQFRbMF0sImVzcCIpOworCisJIyBzdGFjayBmcmFtZSBsYXlvdXQKKwkjCisJIyArMAlYWzBdK0sJWFsxXStLCVhbMl0rSwlYWzNdK0sJIyBYTU0tPklBTFUgeGZlciBhcmVhCisJIwlYWzRdK0sJWFs1XStLCVhbNl0rSwlYWzddK0sKKwkjCVhbOF0rSwlYWzldK0sJWFsxMF0rSwlYWzExXStLCisJIwlYWzEyXStLCVhbMTNdK0sJWFsxNF0rSwlYWzE1XStLCisJIworCSMgKzY0CVhbMF0JWFsxXQlYWzJdCVhbM10JIyBYTU0tPlhNTSBiYWNrdHJhY2UgYXJlYQorCSMJWFs0XQlYWzVdCVhbNl0JWFs3XQorCSMJWFs4XQlYWzldCVhbMTBdCVhbMTFdCSMgZXZlbiBib3Jyb3dlZCBmb3IgS18wMF8xOQorCSMKKwkjICsxMTIJS18yMF8zOQlLXzIwXzM5CUtfMjBfMzkJS18yMF8zOQkjIGNvbnN0YW50cworCSMJS180MF81OQlLXzQwXzU5CUtfNDBfNTkJS180MF81OQorCSMJS182MF83OQlLXzYwXzc5CUtfNjBfNzkJS182MF83OQorCSMJS18wMF8xOQlLXzAwXzE5CUtfMDBfMTkJS18wMF8xOQorCSMJcGJzd2FwIG1hc2sKKwkjCisJIyArMTkyCWN0eAkJCQkjIGFyZ3VtZW50IGJsb2NrCisJIyArMTk2CWlucAorCSMgKzIwMAllbmQKKwkjICsyMDQJZXNwCisJJnN1YgkoImVzcCIsMjA4KTsKKwkmYW5kCSgiZXNwIiwtNjQpOworCisJJnZtb3ZkcWEoJlFXUCgxMTIrMCwiZXNwIiksQFhbNF0pOwkjIGNvcHkgY29uc3RhbnRzCisJJnZtb3ZkcWEoJlFXUCgxMTIrMTYsImVzcCIpLEBYWzVdKTsKKwkmdm1vdmRxYSgmUVdQKDExMiszMiwiZXNwIiksQFhbNl0pOworCSZzaGwJKCRELDYpOwkJCQkjIGxlbio2NAorCSZ2bW92ZHFhKCZRV1AoMTEyKzQ4LCJlc3AiKSxAWFszXSk7CisJJmFkZAkoJEQsJGlucCk7CQkJIyBlbmQgb2YgaW5wdXQKKwkmdm1vdmRxYSgmUVdQKDExMis2NCwiZXNwIiksQFhbMl0pOworCSZhZGQJKCRpbnAsNjQpOworCSZtb3YJKCZEV1AoMTkyKzAsImVzcCIpLCRFKTsJCSMgc2F2ZSBhcmd1bWVudCBibG9jaworCSZtb3YJKCZEV1AoMTkyKzQsImVzcCIpLCRpbnApOworCSZtb3YJKCZEV1AoMTkyKzgsImVzcCIpLCREKTsKKwkmbW92CSgmRFdQKDE5MisxMiwiZXNwIiksQFRbMF0pOwkjIHNhdmUgb3JpZ2luYWwgJWVzcAorCisJJm1vdgkoJEEsJkRXUCgwLCRFKSk7CQkjIGxvYWQgY29udGV4dAorCSZtb3YJKCRCLCZEV1AoNCwkRSkpOworCSZtb3YJKCRDLCZEV1AoOCwkRSkpOworCSZtb3YJKCRELCZEV1AoMTIsJEUpKTsKKwkmbW92CSgkRSwmRFdQKDE2LCRFKSk7CisJJm1vdgkoQFRbMF0sJEIpOwkJCSMgbWFnaWMgc2VlZAorCisJJnZtb3ZkcXUoQFhbLTQmN10sJlFXUCgtNjQsJGlucCkpOwkjIGxvYWQgaW5wdXQgdG8gJXhtbVswLTNdCisJJnZtb3ZkcXUoQFhbLTMmN10sJlFXUCgtNDgsJGlucCkpOworCSZ2bW92ZHF1KEBYWy0yJjddLCZRV1AoLTMyLCRpbnApKTsKKwkmdm1vdmRxdShAWFstMSY3XSwmUVdQKC0xNiwkaW5wKSk7CisJJnZwc2h1ZmIoQFhbLTQmN10sQFhbLTQmN10sQFhbMl0pOwkjIGJ5dGUgc3dhcAorCSZ2cHNodWZiKEBYWy0zJjddLEBYWy0zJjddLEBYWzJdKTsKKwkmdnBzaHVmYihAWFstMiY3XSxAWFstMiY3XSxAWFsyXSk7CisJJnZtb3ZkcWEoJlFXUCgxMTItMTYsImVzcCIpLEBYWzNdKTsJIyBib3Jyb3cgbGFzdCBiYWNrdHJhY2Ugc2xvdAorCSZ2cHNodWZiKEBYWy0xJjddLEBYWy0xJjddLEBYWzJdKTsKKwkmdnBhZGRkCShAWFswXSxAWFstNCY3XSxAWFszXSk7CQkjIGFkZCBLXzAwXzE5CisJJnZwYWRkZAkoQFhbMV0sQFhbLTMmN10sQFhbM10pOworCSZ2cGFkZGQJKEBYWzJdLEBYWy0yJjddLEBYWzNdKTsKKwkmdm1vdmRxYSgmUVdQKDAsImVzcCIpLEBYWzBdKTsJCSMgWFtdK0sgeGZlciB0byBJQUxVCisJJm1vdgkoQFRbMV0sJEMpOworCSZ2bW92ZHFhKCZRV1AoMCsxNiwiZXNwIiksQFhbMV0pOworCSZ4b3IJKEBUWzFdLCREKTsKKwkmdm1vdmRxYSgmUVdQKDArMzIsImVzcCIpLEBYWzJdKTsKKwkmYW5kCShAVFswXSxAVFsxXSk7CisJJmptcAkoJmxhYmVsKCJsb29wIikpOworCitzdWIgWHVwZGF0ZV9hdnhfMTZfMzEoKQkJIyByZWNhbGwgdGhhdCAkWGkgc3RhcnRzIHd0aWggNAoreyB1c2UgaW50ZWdlcjsKKyAgbXkgJGJvZHkgPSBzaGlmdDsKKyAgbXkgQGluc25zID0gKCYkYm9keSwmJGJvZHksJiRib2R5LCYkYm9keSk7CSMgNDAgaW5zdHJ1Y3Rpb25zCisgIG15ICgkYSwkYiwkYywkZCwkZSk7CisKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmdnBhbGlnbnIoQFhbMF0sQFhbLTMmN10sQFhbLTQmN10sOCk7CSMgY29tcG9zZSAiWFstMTRdIiBpbiAiWFswXSIKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKworCSAgJnZwYWRkZAkoQFhbM10sQFhbM10sQFhbLTEmN10pOworCSAgJnZtb3ZkcWEJKCZRV1AoNjQrMTYqKCgkWGktNCklMyksImVzcCIpLEBYWy00JjddKTsjIHNhdmUgWFtdIHRvIGJhY2t0cmFjZSBidWZmZXIKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmdnBzcmxkcShAWFsyXSxAWFstMSY3XSw0KTsJCSMgIlhbLTNdIiwgMyBkd29yZHMKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmdnB4b3IJKEBYWzBdLEBYWzBdLEBYWy00JjddKTsJCSMgIlhbMF0iXj0iWFstMTZdIgorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCisJJnZweG9yCShAWFsyXSxAWFsyXSxAWFstMiY3XSk7CQkjICJYWy0zXSJeIlhbLThdIgorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgJnZtb3ZkcWEJKCZRV1AoMCsxNiooKCRYaS0xKSYzKSwiZXNwIiksQFhbM10pOwkjIFhbXStLIHhmZXIgdG8gSUFMVQorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCisJJnZweG9yCShAWFswXSxAWFswXSxAWFsyXSk7CQkjICJYWzBdIl49IlhbLTNdIl4iWFstOF0iCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisKKwkmdnBzcmxkCShAWFsyXSxAWFswXSwzMSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisKKwkmdnBzbGxkcShAWFs0XSxAWFswXSwxMik7CQkjICJYWzBdIjw8OTYsIGV4dHJhY3Qgb25lIGR3b3JkCisJJnZwYWRkZAkoQFhbMF0sQFhbMF0sQFhbMF0pOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCisJJnZwc3JsZAkoQFhbM10sQFhbNF0sMzApOworCSZ2cG9yCShAWFswXSxAWFswXSxAWFsyXSk7CQkjICJYWzBdIjw8PD0xCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisKKwkmdnBzbGxkCShAWFs0XSxAWFs0XSwyKTsKKwkgICZ2bW92ZHFhCShAWFsyXSwmUVdQKDY0KzE2KigoJFhpLTYpJTMpLCJlc3AiKSkgaWYgKCRYaT41KTsJIyByZXN0b3JlIFhbXSBmcm9tIGJhY2t0cmFjZSBidWZmZXIKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmdnB4b3IJKEBYWzBdLEBYWzBdLEBYWzNdKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKworCSZ2cHhvcgkoQFhbMF0sQFhbMF0sQFhbNF0pOwkJIyAiWFswXSJePSgiWFswXSI8PDk2KTw8PDIKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgICZ2bW92ZHFhCShAWFs0XSwmUVdQKDExMi0xNisxNiooKCRYaSkvNSksImVzcCIpKTsJIyBLX1hYX1hYCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisKKwkgZm9yZWFjaCAoQGluc25zKSB7IGV2YWw7IH0JIyByZW1haW5pbmcgaW5zdHJ1Y3Rpb25zIFtpZiBhbnldCisKKyAgJFhpKys7CXB1c2goQFgsc2hpZnQoQFgpKTsJIyAicm90YXRlIiBYW10KK30KKworc3ViIFh1cGRhdGVfYXZ4XzMyXzc5KCkKK3sgdXNlIGludGVnZXI7CisgIG15ICRib2R5ID0gc2hpZnQ7CisgIG15IEBpbnNucyA9ICgmJGJvZHksJiRib2R5LCYkYm9keSwmJGJvZHkpOwkjIDMyIHRvIDQ0IGluc3RydWN0aW9ucworICBteSAoJGEsJGIsJGMsJGQsJGUpOworCisJJnZwYWxpZ25yKEBYWzJdLEBYWy0xJjddLEBYWy0yJjddLDgpOwkjIGNvbXBvc2UgIlhbLTZdIgorCSZ2cHhvcgkoQFhbMF0sQFhbMF0sQFhbLTQmN10pOwkjICJYWzBdIj0iWFstMzJdIl4iWFstMTZdIgorCSBldmFsKHNoaWZ0KEBpbnNucykpOwkJIyBib2R5XzIwXzM5CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CQkjIHJvbAorCisJJnZweG9yCShAWFswXSxAWFswXSxAWFstNyY3XSk7CSMgIlhbMF0iXj0iWFstMjhdIgorCSAgJnZtb3ZkcWEJKCZRV1AoNjQrMTYqKCgkWGktNCklMyksImVzcCIpLEBYWy00JjddKTsJIyBzYXZlIFhbXSB0byBiYWNrdHJhY2UgYnVmZmVyCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGlmICgkWGklNSkgeworCSAgJnZtb3ZkcWEJKEBYWzRdLEBYWzNdKTsJIyAicGVycGV0dWF0ZSIgS19YWF9YWC4uLgorCSB9IGVsc2UgewkJCSMgLi4uIG9yIGxvYWQgbmV4dCBvbmUKKwkgICZ2bW92ZHFhCShAWFs0XSwmUVdQKDExMi0xNisxNiooJFhpLzUpLCJlc3AiKSk7CisJIH0KKwkgICZ2cGFkZGQJKEBYWzNdLEBYWzNdLEBYWy0xJjddKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsJCSMgcm9yCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisKKwkmdnB4b3IJKEBYWzBdLEBYWzBdLEBYWzJdKTsJCSMgIlhbMF0iXj0iWFstNl0iCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CQkjIGJvZHlfMjBfMzkKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsJCSMgcm9sCisKKwkmdnBzcmxkCShAWFsyXSxAWFswXSwzMCk7CisJICAmdm1vdmRxYQkoJlFXUCgwKzE2KigoJFhpLTEpJjMpLCJlc3AiKSxAWFszXSk7CSMgWFtdK0sgeGZlciB0byBJQUxVCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CQkjIHJvcgorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCisJJnZwc2xsZAkoQFhbMF0sQFhbMF0sMik7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CQkjIGJvZHlfMjBfMzkKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsJCSMgcm9sCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CQkjIHJvcgorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCisJJnZwb3IJKEBYWzBdLEBYWzBdLEBYWzJdKTsJIyAiWFswXSI8PDw9MgorCSBldmFsKHNoaWZ0KEBpbnNucykpOwkJIyBib2R5XzIwXzM5CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICAmdm1vdmRxYQkoQFhbMl0sJlFXUCg2NCsxNiooKCRYaS02KSUzKSwiZXNwIikpIGlmKCRYaTwxOSk7CSMgcmVzdG9yZSBYW10gZnJvbSBiYWNrdHJhY2UgYnVmZmVyCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CQkjIHJvbAorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOwkJIyByb3IKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKworCSBmb3JlYWNoIChAaW5zbnMpIHsgZXZhbDsgfQkjIHJlbWFpbmluZyBpbnN0cnVjdGlvbnMKKworICAkWGkrKzsJcHVzaChAWCxzaGlmdChAWCkpOwkjICJyb3RhdGUiIFhbXQorfQorCitzdWIgWHVwbGFzdF9hdnhfODAoKQoreyB1c2UgaW50ZWdlcjsKKyAgbXkgJGJvZHkgPSBzaGlmdDsKKyAgbXkgQGluc25zID0gKCYkYm9keSwmJGJvZHksJiRib2R5LCYkYm9keSk7CSMgMzIgaW5zdHJ1Y3Rpb25zCisgIG15ICgkYSwkYiwkYywkZCwkZSk7CisKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgICZ2cGFkZGQJKEBYWzNdLEBYWzNdLEBYWy0xJjddKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKworCSAgJnZtb3ZkcWEJKCZRV1AoMCsxNiooKCRYaS0xKSYzKSwiZXNwIiksQFhbM10pOwkjIFhbXStLIHhmZXIgSUFMVQorCisJIGZvcmVhY2ggKEBpbnNucykgeyBldmFsOyB9CQkjIHJlbWFpbmluZyBpbnN0cnVjdGlvbnMKKworCSZtb3YJKCRpbnA9QFRbMV0sJkRXUCgxOTIrNCwiZXNwIikpOworCSZjbXAJKCRpbnAsJkRXUCgxOTIrOCwiZXNwIikpOworCSZqZQkoJmxhYmVsKCJkb25lIikpOworCisJJnZtb3ZkcWEoQFhbM10sJlFXUCgxMTIrNDgsImVzcCIpKTsJIyBLXzAwXzE5CisJJnZtb3ZkcWEoQFhbMl0sJlFXUCgxMTIrNjQsImVzcCIpKTsJIyBwYnN3YXAgbWFzaworCSZ2bW92ZHF1KEBYWy00JjddLCZRV1AoMCwkaW5wKSk7CSMgbG9hZCBpbnB1dAorCSZ2bW92ZHF1KEBYWy0zJjddLCZRV1AoMTYsJGlucCkpOworCSZ2bW92ZHF1KEBYWy0yJjddLCZRV1AoMzIsJGlucCkpOworCSZ2bW92ZHF1KEBYWy0xJjddLCZRV1AoNDgsJGlucCkpOworCSZhZGQJKCRpbnAsNjQpOworCSZ2cHNodWZiKEBYWy00JjddLEBYWy00JjddLEBYWzJdKTsJCSMgYnl0ZSBzd2FwCisJJm1vdgkoJkRXUCgxOTIrNCwiZXNwIiksJGlucCk7CisJJnZtb3ZkcWEoJlFXUCgxMTItMTYsImVzcCIpLEBYWzNdKTsJIyBib3Jyb3cgbGFzdCBiYWNrdHJhY2Ugc2xvdAorCisgICRYaT0wOworfQorCitzdWIgWGxvb3BfYXZ4KCkKK3sgdXNlIGludGVnZXI7CisgIG15ICRib2R5ID0gc2hpZnQ7CisgIG15IEBpbnNucyA9ICgmJGJvZHksJiRib2R5LCYkYm9keSwmJGJvZHkpOwkjIDMyIGluc3RydWN0aW9ucworICBteSAoJGEsJGIsJGMsJGQsJGUpOworCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJnZwc2h1ZmIJKEBYWygkWGktMykmN10sQFhbKCRYaS0zKSY3XSxAWFsyXSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJnZwYWRkZAkoQFhbJFhpJjddLEBYWygkWGktNCkmN10sQFhbM10pOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSZ2bW92ZHFhCSgmUVdQKDArMTYqJFhpLCJlc3AiKSxAWFskWGkmN10pOwkjIFhbXStLIHhmZXIgdG8gSUFMVQorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCisJZm9yZWFjaCAoQGluc25zKSB7IGV2YWw7IH0KKyAgJFhpKys7Cit9CisKK3N1YiBYdGFpbF9hdngoKQoreyB1c2UgaW50ZWdlcjsKKyAgbXkgJGJvZHkgPSBzaGlmdDsKKyAgbXkgQGluc25zID0gKCYkYm9keSwmJGJvZHksJiRib2R5LCYkYm9keSk7CSMgMzIgaW5zdHJ1Y3Rpb25zCisgIG15ICgkYSwkYiwkYywkZCwkZSk7CisKKwlmb3JlYWNoIChAaW5zbnMpIHsgZXZhbDsgfQorfQorCismc2V0X2xhYmVsKCJsb29wIiwxNik7CisJJlh1cGRhdGVfYXZ4XzE2XzMxKFwmYm9keV8wMF8xOSk7CisJJlh1cGRhdGVfYXZ4XzE2XzMxKFwmYm9keV8wMF8xOSk7CisJJlh1cGRhdGVfYXZ4XzE2XzMxKFwmYm9keV8wMF8xOSk7CisJJlh1cGRhdGVfYXZ4XzE2XzMxKFwmYm9keV8wMF8xOSk7CisJJlh1cGRhdGVfYXZ4XzMyXzc5KFwmYm9keV8wMF8xOSk7CisJJlh1cGRhdGVfYXZ4XzMyXzc5KFwmYm9keV8yMF8zOSk7CisJJlh1cGRhdGVfYXZ4XzMyXzc5KFwmYm9keV8yMF8zOSk7CisJJlh1cGRhdGVfYXZ4XzMyXzc5KFwmYm9keV8yMF8zOSk7CisJJlh1cGRhdGVfYXZ4XzMyXzc5KFwmYm9keV8yMF8zOSk7CisJJlh1cGRhdGVfYXZ4XzMyXzc5KFwmYm9keV8yMF8zOSk7CisJJlh1cGRhdGVfYXZ4XzMyXzc5KFwmYm9keV80MF81OSk7CisJJlh1cGRhdGVfYXZ4XzMyXzc5KFwmYm9keV80MF81OSk7CisJJlh1cGRhdGVfYXZ4XzMyXzc5KFwmYm9keV80MF81OSk7CisJJlh1cGRhdGVfYXZ4XzMyXzc5KFwmYm9keV80MF81OSk7CisJJlh1cGRhdGVfYXZ4XzMyXzc5KFwmYm9keV80MF81OSk7CisJJlh1cGRhdGVfYXZ4XzMyXzc5KFwmYm9keV8yMF8zOSk7CisJJlh1cGxhc3RfYXZ4XzgwKFwmYm9keV8yMF8zOSk7CSMgY2FuIGp1bXAgdG8gImRvbmUiCisKKwkJCQkkc2F2ZWRfaj0kajsgQHNhdmVkX1Y9QFY7CisKKwkmWGxvb3BfYXZ4KFwmYm9keV8yMF8zOSk7CisJJlhsb29wX2F2eChcJmJvZHlfMjBfMzkpOworCSZYbG9vcF9hdngoXCZib2R5XzIwXzM5KTsKKworCSZtb3YJKEBUWzFdLCZEV1AoMTkyLCJlc3AiKSk7CSMgdXBkYXRlIGNvbnRleHQKKwkmYWRkCSgkQSwmRFdQKDAsQFRbMV0pKTsKKwkmYWRkCShAVFswXSwmRFdQKDQsQFRbMV0pKTsJCSMgJGIKKwkmYWRkCSgkQywmRFdQKDgsQFRbMV0pKTsKKwkmbW92CSgmRFdQKDAsQFRbMV0pLCRBKTsKKwkmYWRkCSgkRCwmRFdQKDEyLEBUWzFdKSk7CisJJm1vdgkoJkRXUCg0LEBUWzFdKSxAVFswXSk7CisJJmFkZAkoJEUsJkRXUCgxNixAVFsxXSkpOworCSZtb3YJKCRCLCRDKTsKKwkmbW92CSgmRFdQKDgsQFRbMV0pLCRDKTsKKwkmeG9yCSgkQiwkRCk7CisJJm1vdgkoJkRXUCgxMixAVFsxXSksJEQpOworCSZhbmQJKCRCLEBUWzBdKTsKKwkmbW92CSgmRFdQKDE2LEBUWzFdKSwkRSk7CisJJnhjaGcJKCRCLEBUWzBdKTsKKworCSZqbXAJKCZsYWJlbCgibG9vcCIpKTsKKworJnNldF9sYWJlbCgiZG9uZSIsMTYpOwkJJGo9JHNhdmVkX2o7IEBWPUBzYXZlZF9WOworCisJJlh0YWlsX2F2eChcJmJvZHlfMjBfMzkpOworCSZYdGFpbF9hdngoXCZib2R5XzIwXzM5KTsKKwkmWHRhaWxfYXZ4KFwmYm9keV8yMF8zOSk7CisKKwkmdnplcm9hbGwoKTsKKworCSZtb3YJKEBUWzFdLCZEV1AoMTkyLCJlc3AiKSk7CSMgdXBkYXRlIGNvbnRleHQKKwkmYWRkCSgkQSwmRFdQKDAsQFRbMV0pKTsKKwkmbW92CSgiZXNwIiwmRFdQKDE5MisxMiwiZXNwIikpOwkjIHJlc3RvcmUgJWVzcAorCSZhZGQJKEBUWzBdLCZEV1AoNCxAVFsxXSkpOwkJIyAkYgorCSZhZGQJKCRDLCZEV1AoOCxAVFsxXSkpOworCSZtb3YJKCZEV1AoMCxAVFsxXSksJEEpOworCSZhZGQJKCRELCZEV1AoMTIsQFRbMV0pKTsKKwkmbW92CSgmRFdQKDQsQFRbMV0pLEBUWzBdKTsKKwkmYWRkCSgkRSwmRFdQKDE2LEBUWzFdKSk7CisJJm1vdgkoJkRXUCg4LEBUWzFdKSwkQyk7CisJJm1vdgkoJkRXUCgxMixAVFsxXSksJEQpOworCSZtb3YJKCZEV1AoMTYsQFRbMV0pLCRFKTsKKyZmdW5jdGlvbl9lbmQoIl9zaGExX2Jsb2NrX2RhdGFfb3JkZXJfYXZ4Iik7Cit9Cismc2V0X2xhYmVsKCJLX1hYX1hYIiw2NCk7CismZGF0YV93b3JkKDB4NWE4Mjc5OTksMHg1YTgyNzk5OSwweDVhODI3OTk5LDB4NWE4Mjc5OTkpOwkjIEtfMDBfMTkKKyZkYXRhX3dvcmQoMHg2ZWQ5ZWJhMSwweDZlZDllYmExLDB4NmVkOWViYTEsMHg2ZWQ5ZWJhMSk7CSMgS18yMF8zOQorJmRhdGFfd29yZCgweDhmMWJiY2RjLDB4OGYxYmJjZGMsMHg4ZjFiYmNkYywweDhmMWJiY2RjKTsJIyBLXzQwXzU5CismZGF0YV93b3JkKDB4Y2E2MmMxZDYsMHhjYTYyYzFkNiwweGNhNjJjMWQ2LDB4Y2E2MmMxZDYpOwkjIEtfNjBfNzkKKyZkYXRhX3dvcmQoMHgwMDAxMDIwMywweDA0MDUwNjA3LDB4MDgwOTBhMGIsMHgwYzBkMGUwZik7CSMgcGJzd2FwIG1hc2sKK30KKyZhc2NpeigiU0hBMSBibG9jayB0cmFuc2Zvcm0gZm9yIHg4NiwgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQG9wZW5zc2wub3JnPiIpOworCismYXNtX2ZpbmlzaCgpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NoYS9hc20vc2hhMS1hcm12NC1sYXJnZS5wbCBiL2NyeXB0by9zaGEvYXNtL3NoYTEtYXJtdjQtbGFyZ2UucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY0MzczMQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zaGEvYXNtL3NoYTEtYXJtdjQtbGFyZ2UucGwKQEAgLTAsMCArMSwyNTEgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiBmb3IgdGhlIE9wZW5TU0wKKyMgcHJvamVjdC4gVGhlIG1vZHVsZSBpcywgaG93ZXZlciwgZHVhbCBsaWNlbnNlZCB1bmRlciBPcGVuU1NMIGFuZAorIyBDUllQVE9HQU1TIGxpY2Vuc2VzIGRlcGVuZGluZyBvbiB3aGVyZSB5b3Ugb2J0YWluIGl0LiBGb3IgZnVydGhlcgorIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyBzaGExX2Jsb2NrIHByb2NlZHVyZSBmb3IgQVJNdjQuCisjCisjIEphbnVhcnkgMjAwNy4KKworIyBTaXplL3BlcmZvcm1hbmNlIHRyYWRlLW9mZgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBpbXBsCQlzaXplIGluIGJ5dGVzCWNvbXAgY3ljbGVzWypdCW1lYXN1cmVkIHBlcmZvcm1hbmNlCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIHRodW1iCQkzMDQJCTMyMTIJCTQ0MjAKKyMgYXJtdjQtc21hbGwJMzkyLysyOSUJMTk1OC8rNjQlCTIyNTAvKzk2JQorIyBhcm12NC1jb21wYWN0CTc0MC8rODklCTE1NTIvKzI2JQkxODQwLysyMiUKKyMgYXJtdjQtbGFyZ2UJMTQyMC8rOTIlCTEzMDcvKzE5JQkxMzcwLyszNCVbKioqXQorIyBmdWxsIHVucm9sbAl+NTEwMC8rMjYwJQl+MTI2MC8rNCUJfjEzMDAvKzUlCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIHRodW1iCQk9IHNhbWUgYXMgJ3NtYWxsJyBidXQgaW4gVGh1bWIgaW5zdHJ1Y3Rpb25zWyoqXSBhbmQKKyMJCSAgd2l0aCByZWN1cnJpbmcgY29kZSBpbiB0d28gcHJpdmF0ZSBmdW5jdGlvbnM7CisjIHNtYWxsCQk9IGRldGFjaGVkIFhsb2FkL3VwZGF0ZSwgbG9vcHMgYXJlIGZvbGRlZDsKKyMgY29tcGFjdAk9IGRldGFjaGVkIFhsb2FkL3VwZGF0ZSwgNXggdW5yb2xsOworIyBsYXJnZQkJPSBpbnRlcmxlYXZlZCBYbG9hZC91cGRhdGUsIDV4IHVucm9sbDsKKyMgZnVsbCB1bnJvbGwJPSBpbnRlcmxlYXZlZCBYbG9hZC91cGRhdGUsIGZ1bGwgdW5yb2xsLCBlc3RpbWF0ZWRbIV07CisjCisjIFsqXQlNYW51YWxseSBjb3VudGVkIGluc3RydWN0aW9ucyBpbiAiZ3JhbmQiIGxvb3AgYm9keS4gTWVhc3VyZWQKKyMJcGVyZm9ybWFuY2UgaXMgYWZmZWN0ZWQgYnkgcHJvbG9ndWUgYW5kIGVwaWxvZ3VlIG92ZXJoZWFkLAorIwlpLWNhY2hlIGF2YWlsYWJpbGl0eSwgYnJhbmNoIHBlbmFsdGllcywgZXRjLgorIyBbKipdCVdoaWxlIGVhY2ggVGh1bWIgaW5zdHJ1Y3Rpb24gaXMgdHdpY2Ugc21hbGxlciwgdGhleSBhcmUgbm90IGFzCisjCWRpdmVyc2UgYXMgQVJNIG9uZXM6IGUuZy4sIHRoZXJlIGFyZSBvbmx5IHR3byBhcml0aG1ldGljCisjCWluc3RydWN0aW9ucyB3aXRoIDMgYXJndW1lbnRzLCBubyBbZml4ZWRdIHJvdGF0ZSwgYWRkcmVzc2luZworIwltb2RlcyBhcmUgbGltaXRlZC4gQXMgcmVzdWx0IGl0IHRha2VzIG1vcmUgaW5zdHJ1Y3Rpb25zIHRvIGRvCisjCXRoZSBzYW1lIGpvYiBpbiBUaHVtYiwgdGhlcmVmb3JlIHRoZSBjb2RlIGlzIG5ldmVyIHR3aWNlIGFzCisjCXNtYWxsIGFuZCBhbHdheXMgc2xvd2VyLgorIyBbKioqXQl3aGljaCBpcyBhbHNvIH4zNSUgYmV0dGVyIHRoYW4gY29tcGlsZXIgZ2VuZXJhdGVkIGNvZGUuIER1YWwtCisjCWlzc3VlIENvcnRleCBBOCBjb3JlIHdhcyBtZWFzdXJlZCB0byBwcm9jZXNzIGlucHV0IGJsb2NrIGluCisjCX45OTAgY3ljbGVzLgorCisjIEF1Z3VzdCAyMDEwLgorIworIyBSZXNjaGVkdWxpbmcgZm9yIGR1YWwtaXNzdWUgcGlwZWxpbmUgcmVzdWx0ZWQgaW4gMTMlIGltcHJvdmVtZW50IG9uCisjIENvcnRleCBBOCBjb3JlIGFuZCBpbiBhYnNvbHV0ZSB0ZXJtcyB+ODcwIGN5Y2xlcyBwZXIgaW5wdXQgYmxvY2sKKyMgW29yIDEzLjYgY3ljbGVzIHBlciBieXRlXS4KKworIyBGZWJydWFyeSAyMDExLgorIworIyBQcm9maWxlci1hc3Npc3RlZCBhbmQgcGxhdGZvcm0tc3BlY2lmaWMgb3B0aW1pemF0aW9uIHJlc3VsdGVkIGluIDEwJQorIyBpbXByb3ZlbWVudCBvbiBDb3J0ZXggQTggY29yZSBhbmQgMTIuMiBjeWNsZXMgcGVyIGJ5dGUuCisKK3doaWxlICgoJG91dHB1dD1zaGlmdCkgJiYgKCRvdXRwdXQhfi9eXHdbXHdcLV0qXC5cdyskLykpIHt9CitvcGVuIFNURE9VVCwiPiRvdXRwdXQiOworCiskY3R4PSJyMCI7CiskaW5wPSJyMSI7CiskbGVuPSJyMiI7CiskYT0icjMiOworJGI9InI0IjsKKyRjPSJyNSI7CiskZD0icjYiOworJGU9InI3IjsKKyRLPSJyOCI7CiskdDA9InI5IjsKKyR0MT0icjEwIjsKKyR0Mj0icjExIjsKKyR0Mz0icjEyIjsKKyRYaT0icjE0IjsKK0BWPSgkYSwkYiwkYywkZCwkZSk7CisKK3N1YiBYdXBkYXRlIHsKK215ICgkYSwkYiwkYywkZCwkZSwkb3B0MSwkb3B0Mik9QF87CiskY29kZS49PDxfX187CisJbGRyCSR0MCxbJFhpLCMxNSo0XQorCWxkcgkkdDEsWyRYaSwjMTMqNF0KKwlsZHIJJHQyLFskWGksIzcqNF0KKwlhZGQJJGUsJEssJGUscm9yIzIJCQlAIEUrPUtfeHhfeHgKKwlsZHIJJHQzLFskWGksIzIqNF0KKwllb3IJJHQwLCR0MCwkdDEKKwllb3IJJHQyLCR0MiwkdDMJCQlAIDEgY3ljbGUgc3RhbGwKKwllb3IJJHQxLCRjLCRkCQkJQCBGX3h4X3h4CisJbW92CSR0MCwkdDAscm9yIzMxCisJYWRkCSRlLCRlLCRhLHJvciMyNwkJCUAgRSs9Uk9SKEEsMjcpCisJZW9yCSR0MCwkdDAsJHQyLHJvciMzMQorCXN0cgkkdDAsWyRYaSwjLTRdIQorCSRvcHQxCQkJCQlAIEZfeHhfeHgKKwkkb3B0MgkJCQkJQCBGX3h4X3h4CisJYWRkCSRlLCRlLCR0MAkJCUAgRSs9WFtpXQorX19fCit9CisKK3N1YiBCT0RZXzAwXzE1IHsKK215ICgkYSwkYiwkYywkZCwkZSk9QF87CiskY29kZS49PDxfX187CisjaWYgX19BUk1fQVJDSF9fPDcKKwlsZHJiCSR0MSxbJGlucCwjMl0KKwlsZHJiCSR0MCxbJGlucCwjM10KKwlsZHJiCSR0MixbJGlucCwjMV0KKwlhZGQJJGUsJEssJGUscm9yIzIJCQlAIEUrPUtfMDBfMTkKKwlsZHJiCSR0MyxbJGlucF0sIzQKKwlvcnIJJHQwLCR0MCwkdDEsbHNsIzgKKwllb3IJJHQxLCRjLCRkCQkJQCBGX3h4X3h4CisJb3JyCSR0MCwkdDAsJHQyLGxzbCMxNgorCWFkZAkkZSwkZSwkYSxyb3IjMjcJCQlAIEUrPVJPUihBLDI3KQorCW9ycgkkdDAsJHQwLCR0Myxsc2wjMjQKKyNlbHNlCisJbGRyCSR0MCxbJGlucF0sIzQJCQlAIGhhbmRsZXMgdW5hbGlnbmVkCisJYWRkCSRlLCRLLCRlLHJvciMyCQkJQCBFKz1LXzAwXzE5CisJZW9yCSR0MSwkYywkZAkJCUAgRl94eF94eAorCWFkZAkkZSwkZSwkYSxyb3IjMjcJCQlAIEUrPVJPUihBLDI3KQorI2lmZGVmIF9fQVJNRUxfXworCXJldgkkdDAsJHQwCQkJCUAgYnl0ZSBzd2FwCisjZW5kaWYKKyNlbmRpZgorCWFuZAkkdDEsJGIsJHQxLHJvciMyCisJYWRkCSRlLCRlLCR0MAkJCUAgRSs9WFtpXQorCWVvcgkkdDEsJHQxLCRkLHJvciMyCQlAIEZfMDBfMTkoQixDLEQpCisJc3RyCSR0MCxbJFhpLCMtNF0hCisJYWRkCSRlLCRlLCR0MQkJCUAgRSs9Rl8wMF8xOShCLEMsRCkKK19fXworfQorCitzdWIgQk9EWV8xNl8xOSB7CitteSAoJGEsJGIsJGMsJGQsJGUpPUBfOworCSZYdXBkYXRlKEBfLCJhbmQgJHQxLCRiLCR0MSxyb3IjMiIpOworJGNvZGUuPTw8X19fOworCWVvcgkkdDEsJHQxLCRkLHJvciMyCQlAIEZfMDBfMTkoQixDLEQpCisJYWRkCSRlLCRlLCR0MQkJCUAgRSs9Rl8wMF8xOShCLEMsRCkKK19fXworfQorCitzdWIgQk9EWV8yMF8zOSB7CitteSAoJGEsJGIsJGMsJGQsJGUpPUBfOworCSZYdXBkYXRlKEBfLCJlb3IgJHQxLCRiLCR0MSxyb3IjMiIpOworJGNvZGUuPTw8X19fOworCWFkZAkkZSwkZSwkdDEJCQlAIEUrPUZfMjBfMzkoQixDLEQpCitfX18KK30KKworc3ViIEJPRFlfNDBfNTkgeworbXkgKCRhLCRiLCRjLCRkLCRlKT1AXzsKKwkmWHVwZGF0ZShAXywiYW5kICR0MSwkYiwkdDEscm9yIzIiLCJhbmQgJHQyLCRjLCRkIik7CiskY29kZS49PDxfX187CisJYWRkCSRlLCRlLCR0MQkJCUAgRSs9Rl80MF81OShCLEMsRCkKKwlhZGQJJGUsJGUsJHQyLHJvciMyCitfX18KK30KKworJGNvZGU9PDxfX187CisjaWYgZGVmaW5lZChfX2FybV9fKQorI2luY2x1ZGUgImFybV9hcmNoLmgiCisKKy50ZXh0CisKKy5nbG9iYWwJc2hhMV9ibG9ja19kYXRhX29yZGVyCisudHlwZQlzaGExX2Jsb2NrX2RhdGFfb3JkZXIsJWZ1bmN0aW9uCisKKy5hbGlnbgkyCitzaGExX2Jsb2NrX2RhdGFfb3JkZXI6CisJc3RtZGIJc3AhLHtyNC1yMTIsbHJ9CisJYWRkCSRsZW4sJGlucCwkbGVuLGxzbCM2CUAgJGxlbiB0byBwb2ludCBhdCB0aGUgZW5kIG9mICRpbnAKKwlsZG1pYQkkY3R4LHskYSwkYiwkYywkZCwkZX0KKy5MbG9vcDoKKwlsZHIJJEssLkxLXzAwXzE5CisJbW92CSRYaSxzcAorCXN1YglzcCxzcCwjMTUqNAorCW1vdgkkYywkYyxyb3IjMzAKKwltb3YJJGQsJGQscm9yIzMwCisJbW92CSRlLCRlLHJvciMzMAkJQCBbNl0KKy5MXzAwXzE1OgorX19fCitmb3IoJGk9MDskaTw1OyRpKyspIHsKKwkmQk9EWV8wMF8xNShAVik7CXVuc2hpZnQoQFYscG9wKEBWKSk7Cit9CiskY29kZS49PDxfX187CisJdGVxCSRYaSxzcAorCWJuZQkuTF8wMF8xNQkJQCBbKCgxMSs0KSo1KzIpKjNdCisJc3ViCXNwLHNwLCMyNSo0CitfX18KKwkmQk9EWV8wMF8xNShAVik7CXVuc2hpZnQoQFYscG9wKEBWKSk7CisJJkJPRFlfMTZfMTkoQFYpOwl1bnNoaWZ0KEBWLHBvcChAVikpOworCSZCT0RZXzE2XzE5KEBWKTsJdW5zaGlmdChAVixwb3AoQFYpKTsKKwkmQk9EWV8xNl8xOShAVik7CXVuc2hpZnQoQFYscG9wKEBWKSk7CisJJkJPRFlfMTZfMTkoQFYpOwl1bnNoaWZ0KEBWLHBvcChAVikpOworJGNvZGUuPTw8X19fOworCisJbGRyCSRLLC5MS18yMF8zOQkJQCBbKzE1KzE2KjRdCisJY21uCXNwLCMwCQkJQCBbKzNdLCBjbGVhciBjYXJyeSB0byBkZW5vdGUgMjBfMzkKKy5MXzIwXzM5X29yXzYwXzc5OgorX19fCitmb3IoJGk9MDskaTw1OyRpKyspIHsKKwkmQk9EWV8yMF8zOShAVik7CXVuc2hpZnQoQFYscG9wKEBWKSk7Cit9CiskY29kZS49PDxfX187CisJdGVxCSRYaSxzcAkJCUAgcHJlc2VydmUgY2FycnkKKwlibmUJLkxfMjBfMzlfb3JfNjBfNzkJQCBbKygoMTIrMykqNSsyKSo0XQorCWJjcwkuTF9kb25lCQkJQCBbKygoMTIrMykqNSsyKSo0XSwgc3BhcmUgMzAwIGJ5dGVzCisKKwlsZHIJJEssLkxLXzQwXzU5CisJc3ViCXNwLHNwLCMyMCo0CQlAIFsrMl0KKy5MXzQwXzU5OgorX19fCitmb3IoJGk9MDskaTw1OyRpKyspIHsKKwkmQk9EWV80MF81OShAVik7CXVuc2hpZnQoQFYscG9wKEBWKSk7Cit9CiskY29kZS49PDxfX187CisJdGVxCSRYaSxzcAorCWJuZQkuTF80MF81OQkJQCBbKygoMTIrNSkqNSsyKSo0XQorCisJbGRyCSRLLC5MS182MF83OQorCXN1YglzcCxzcCwjMjAqNAorCWNtcAlzcCwjMAkJCUAgc2V0IGNhcnJ5IHRvIGRlbm90ZSA2MF83OQorCWIJLkxfMjBfMzlfb3JfNjBfNzkJQCBbKzRdLCBzcGFyZSAzMDAgYnl0ZXMKKy5MX2RvbmU6CisJYWRkCXNwLHNwLCM4MCo0CQlAICJkZWFsbG9jYXRlIiBzdGFjayBmcmFtZQorCWxkbWlhCSRjdHgseyRLLCR0MCwkdDEsJHQyLCR0M30KKwlhZGQJJGEsJEssJGEKKwlhZGQJJGIsJHQwLCRiCisJYWRkCSRjLCR0MSwkYyxyb3IjMgorCWFkZAkkZCwkdDIsJGQscm9yIzIKKwlhZGQJJGUsJHQzLCRlLHJvciMyCisJc3RtaWEJJGN0eCx7JGEsJGIsJGMsJGQsJGV9CisJdGVxCSRpbnAsJGxlbgorCWJuZQkuTGxvb3AJCQlAIFsrMThdLCB0b3RhbCAxMzA3CisKKyNpZiBfX0FSTV9BUkNIX18+PTUKKwlsZG1pYQlzcCEse3I0LXIxMixwY30KKyNlbHNlCisJbGRtaWEJc3AhLHtyNC1yMTIsbHJ9CisJdHN0CWxyLCMxCisJbW92ZXEJcGMsbHIJCQlAIGJlIGJpbmFyeSBjb21wYXRpYmxlIHdpdGggVjQsIHlldAorCWJ4CWxyCQkJQCBpbnRlcm9wZXJhYmxlIHdpdGggVGh1bWIgSVNBOi0pCisjZW5kaWYKKy5hbGlnbgkyCisuTEtfMDBfMTk6CS53b3JkCTB4NWE4Mjc5OTkKKy5MS18yMF8zOToJLndvcmQJMHg2ZWQ5ZWJhMQorLkxLXzQwXzU5Ogkud29yZAkweDhmMWJiY2RjCisuTEtfNjBfNzk6CS53b3JkCTB4Y2E2MmMxZDYKKy5zaXplCXNoYTFfYmxvY2tfZGF0YV9vcmRlciwuLXNoYTFfYmxvY2tfZGF0YV9vcmRlcgorLmFzY2l6CSJTSEExIGJsb2NrIHRyYW5zZm9ybSBmb3IgQVJNdjQsIENSWVBUT0dBTVMgYnkgPGFwcHJvXEBvcGVuc3NsLm9yZz4iCisuYWxpZ24JMgorCisjZW5kaWYKK19fXworCiskY29kZSA9fiBzL1xiYnhccytsclxiLy53b3JkXHQweGUxMmZmZjFlL2dtOwkjIG1ha2UgaXQgcG9zc2libGUgdG8gY29tcGlsZSB3aXRoIC1tYXJjaD1hcm12NAorcHJpbnQgJGNvZGU7CitjbG9zZSBTVERPVVQ7ICMgZW5mb3JjZSBmbHVzaApkaWZmIC0tZ2l0IGEvY3J5cHRvL3NoYS9hc20vc2hhMS14ODZfNjQucGwgYi9jcnlwdG8vc2hhL2FzbS9zaGExLXg4Nl82NC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTRiNWZmCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3NoYS9hc20vc2hhMS14ODZfNjQucGwKQEAgLTAsMCArMSwxODM3IEBACisjIS91c3IvYmluL2VudiBwZXJsCisjCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFdyaXR0ZW4gYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9Ab3BlbnNzbC5vcmc+IGZvciB0aGUgT3BlblNTTAorIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCisjIENSWVBUT0dBTVMgbGljZW5zZXMgZGVwZW5kaW5nIG9uIHdoZXJlIHlvdSBvYnRhaW4gaXQuIEZvciBmdXJ0aGVyCisjIGRldGFpbHMgc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvfmFwcHJvL2NyeXB0b2dhbXMvLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBzaGExX2Jsb2NrIHByb2NlZHVyZSBmb3IgeDg2XzY0LgorIworIyBJdCB3YXMgYnJvdWdodCB0byBteSBhdHRlbnRpb24gdGhhdCBvbiBFTTY0VCBjb21waWxlci1nZW5lcmF0ZWQgY29kZQorIyB3YXMgZmFyIGJlaGluZCAzMi1iaXQgYXNzZW1ibGVyIGltcGxlbWVudGF0aW9uLiBUaGlzIGlzIHVubGlrZSBvbgorIyBPcHRlcm9uIHdoZXJlIGNvbXBpbGVyLWdlbmVyYXRlZCBjb2RlIHdhcyBvbmx5IDE1JSBiZWhpbmQgMzItYml0CisjIGFzc2VtYmxlciwgd2hpY2ggb3JpZ2luYWxseSBtYWRlIGl0IGhhcmQgdG8gbW90aXZhdGUgdGhlIGVmZm9ydC4KKyMgVGhlcmUgd2FzIHN1Z2dlc3Rpb24gdG8gbWVjaGFuaWNhbGx5IHRyYW5zbGF0ZSAzMi1iaXQgY29kZSwgYnV0IEkKKyMgZGlzbWlzc2VkIGl0LCByZWFzb25pbmcgdGhhdCB4ODZfNjQgb2ZmZXJzIGVub3VnaCByZWdpc3RlciBiYW5rCisjIGNhcGFjaXR5IHRvIGZ1bGx5IHV0aWxpemUgU0hBLTEgcGFyYWxsZWxpc20uIFRoZXJlZm9yZSB0aGlzIGZyZXNoCisjIGltcGxlbWVudGF0aW9uOi0pIEhvd2V2ZXIhIFdoaWxlIDY0LWJpdCBjb2RlIGRvZXMgcGVyZm9ybSBiZXR0ZXIKKyMgb24gT3B0ZXJvbiwgSSBmYWlsZWQgdG8gYmVhdCAzMi1iaXQgYXNzZW1ibGVyIG9uIEVNNjRUIGNvcmUuIFdlbGwsCisjIHg4Nl82NCBkb2VzIG9mZmVyIGxhcmdlciAqYWRkcmVzc2FibGUqIGJhbmssIGJ1dCBvdXQtb2Ytb3JkZXIgY29yZQorIyByZWFjaGVzIGZvciBldmVuIG1vcmUgcmVnaXN0ZXJzIHRocm91Z2ggZHluYW1pYyBhbGlhc2luZywgYW5kIEVNNjRUCisjIGNvcmUgbXVzdCBoYXZlIG1hbmFnZWQgdG8gcnVuLXRpbWUgb3B0aW1pemUgZXZlbiAzMi1iaXQgY29kZSBqdXN0IGFzCisjIGdvb2QgYXMgNjQtYml0IG9uZS4gUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgaXMgc3VtbWFyaXplZCBpbiB0aGUKKyMgZm9sbG93aW5nIHRhYmxlOgorIworIwkJZ2NjIDMuNAkJMzItYml0IGFzbQljeWNsZXMvYnl0ZQorIyBPcHRlcm9uCSs0NSUJCSsyMCUJCTYuOAorIyBYZW9uIFA0CSs2NSUJCSswJQkJOS45CisjIENvcmUyCQkrNjAlCQkrMTAlCQk3LjAKKworIyBBdWd1c3QgMjAwOS4KKyMKKyMgVGhlIGNvZGUgd2FzIHJldmlzZWQgdG8gbWluaW1pemUgY29kZSBzaXplIGFuZCB0byBtYXhpbWl6ZQorIyAiZGlzdGFuY2UiIGJldHdlZW4gaW5zdHJ1Y3Rpb25zIHByb2R1Y2luZyBpbnB1dCB0byAnbGVhJworIyBpbnN0cnVjdGlvbiBhbmQgdGhlICdsZWEnIGluc3RydWN0aW9uIGl0c2VsZiwgd2hpY2ggaXMgZXNzZW50aWFsCisjIGZvciBJbnRlbCBBdG9tIGNvcmUuCisKKyMgT2N0b2JlciAyMDEwLgorIworIyBBZGQgU1NTRTMsIFN1cHBsZW1lbnRhbFshXSBTU0UzLCBpbXBsZW1lbnRhdGlvbi4gVGhlIGlkZWEgYmVoaW5kIGl0CisjIGlzIHRvIG9mZmxvYWQgbWVzc2FnZSBzY2hlZHVsZSBkZW5vdGVkIGJ5IFd0IGluIE5JU1Qgc3BlY2lmaWNhdGlvbiwKKyMgb3IgWHVwZGF0ZSBpbiBPcGVuU1NMIHNvdXJjZSwgdG8gU0lNRCB1bml0LiBTZWUgc2hhMS01ODYucGwgbW9kdWxlCisjIGZvciBiYWNrZ3JvdW5kIGFuZCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLiBUaGUgb25seSBkaWZmZXJlbmNlIGZyb20KKyMgMzItYml0IGNvZGUgaXMgdGhhdCA2NC1iaXQgY29kZSBkb2Vzbid0IGhhdmUgdG8gc3BpbGwgQFhbXSBlbGVtZW50cworIyB0byBmcmVlIHRlbXBvcmFyeSByZWdpc3RlcnMuCisKKyMgQXByaWwgMjAxMS4KKyMKKyMgQWRkIEFWWCBjb2RlIHBhdGguIFNlZSBzaGExLTU4Ni5wbCBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4KKworIyBNYXkgMjAxMy4KKyMKKyMgQWRkIEFWWDIrQk1JIGNvZGUgcGF0aC4gSW5pdGlhbCBhdHRlbXB0ICh1dGlsaXppbmcgQk1JIGluc3RydWN0aW9ucworIyBhbmQgbG9hZGluZyBwYWlyIG9mIGNvbnNlY3V0aXZlIGJsb2NrcyB0byAyNTYtYml0ICV5bW0gcmVnaXN0ZXJzKQorIyBkaWQgbm90IHByb3ZpZGUgaW1wcmVzc2l2ZSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCB0aWxsIGEgY3J1Y2lhbAorIyBoaW50IHJlZ2FyZGluZyB0aGUgbnVtYmVyIG9mIFh1cGRhdGUgaXRlcmF0aW9ucyB0byBwcmUtY29tcHV0ZSBpbgorIyBhZHZhbmNlIHdhcyBwcm92aWRlZCBieSBJbHlhIEFsYnJla2h0IG9mIEludGVsIENvcnAuCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ3VycmVudCBwZXJmb3JtYW5jZSBpcyBzdW1tYXJpemVkIGluIGZvbGxvd2luZyB0YWJsZS4gTnVtYmVycyBhcmUKKyMgQ1BVIGNsb2NrIGN5Y2xlcyBzcGVudCB0byBwcm9jZXNzIHNpbmdsZSBieXRlIChsZXNzIGlzIGJldHRlcikuCisjCisjCQl4ODZfNjQJCVNTU0UzCQlBVlhbMl0KKyMgUDQJCTkuOAkJLQorIyBPcHRlcm9uCTYuNjUJCS0KKyMgQ29yZTIJCTYuNzAJCTYuMDUvKzExJQktCisjIFdlc3RtZXJlCTcuMDgJCTUuNDQvKzMwJQktCisjIFNhbmR5IEJyaWRnZQk3LjkzCQk2LjE2LysyOCUJNC45OS8rNTklCisjIEl2eSBCcmlkZ2UJNi4zMAkJNC42My8rMzYlCTQuNjAvKzM3JQorIyBIYXN3ZWxsCTUuOTgJCTQuMTIvKzQ1JQkzLjU3Lys2NyUKKyMgQnVsbGRvemVyCTEwLjkJCTUuOTUvKzgyJQorIyBWSUEgTmFubwkxMC4yCQk3LjQ2LyszNyUKKyMgQXRvbQkJMTEuMAkJOS42MS8rMTQlCisKKyRmbGF2b3VyID0gc2hpZnQ7Ciskb3V0cHV0ICA9IHNoaWZ0OworaWYgKCRmbGF2b3VyID1+IC9cLi8pIHsgJG91dHB1dCA9ICRmbGF2b3VyOyB1bmRlZiAkZmxhdm91cjsgfQorCiskd2luNjQ9MDsgJHdpbjY0PTEgaWYgKCRmbGF2b3VyID1+IC9bbm1dYXNtfG1pbmd3NjQvIHx8ICRvdXRwdXQgPX4gL1wuYXNtJC8pOworCiskMCA9fiBtLyguKltcL1xcXSlbXlwvXFxdKyQvOyAkZGlyPSQxOworKCAkeGxhdGU9IiR7ZGlyfXg4Nl82NC14bGF0ZS5wbCIgYW5kIC1mICR4bGF0ZSApIG9yCisoICR4bGF0ZT0iJHtkaXJ9Li4vLi4vcGVybGFzbS94ODZfNjQteGxhdGUucGwiIGFuZCAtZiAkeGxhdGUpIG9yCitkaWUgImNhbid0IGxvY2F0ZSB4ODZfNjQteGxhdGUucGwiOworCitpZiAoYCRFTlZ7Q0N9IC1XYSwtdiAtYyAtbyAvZGV2L251bGwgLXggYXNzZW1ibGVyIC9kZXYvbnVsbCAyPiYxYAorCQk9fiAvR05VIGFzc2VtYmxlciB2ZXJzaW9uIChbMi05XVwuWzAtOV0rKS8pIHsKKwkkYXZ4ID0gKCQxPj0yLjE5KSArICgkMT49Mi4yMik7Cit9CisKK2lmICghJGF2eCAmJiAkd2luNjQgJiYgKCRmbGF2b3VyID1+IC9uYXNtLyB8fCAkRU5We0FTTX0gPX4gL25hc20vKSAmJgorCSAgIGBuYXNtIC12IDI+JjFgID1+IC9OQVNNIHZlcnNpb24gKFsyLTldXC5bMC05XSspLykgeworCSRhdnggPSAoJDE+PTIuMDkpICsgKCQxPj0yLjEwKTsKK30KKworaWYgKCEkYXZ4ICYmICR3aW42NCAmJiAoJGZsYXZvdXIgPX4gL21hc20vIHx8ICRFTlZ7QVNNfSA9fiAvbWw2NC8pICYmCisJICAgYG1sNjQgMj4mMWAgPX4gL1ZlcnNpb24gKFswLTldKylcLi8pIHsKKwkkYXZ4ID0gKCQxPj0xMCkgKyAoJDE+PTExKTsKK30KKworb3BlbiBPVVQsInwgXCIkXlhcIiAkeGxhdGUgJGZsYXZvdXIgJG91dHB1dCI7CisqU1RET1VUPSpPVVQ7CisKKyRjdHg9IiVyZGkiOwkjIDFzdCBhcmcKKyRpbnA9IiVyc2kiOwkjIDJuZCBhcmcKKyRudW09IiVyZHgiOwkjIDNyZCBhcmcKKworIyByZWFzc2lnbiBhcmd1bWVudHMgaW4gb3JkZXIgdG8gcHJvZHVjZSBtb3JlIGNvbXBhY3QgY29kZQorJGN0eD0iJXI4IjsKKyRpbnA9IiVyOSI7CiskbnVtPSIlcjEwIjsKKworJHQwPSIlZWF4IjsKKyR0MT0iJWVieCI7CiskdDI9IiVlY3giOworQHhpPSgiJWVkeCIsIiVlYnAiKTsKKyRBPSIlZXNpIjsKKyRCPSIlZWRpIjsKKyRDPSIlcjExZCI7CiskRD0iJXIxMmQiOworJEU9IiVyMTNkIjsKKworQFY9KCRBLCRCLCRDLCRELCRFKTsKKworc3ViIEJPRFlfMDBfMTkgeworbXkgKCRpLCRhLCRiLCRjLCRkLCRlKT1AXzsKK215ICRqPSRpKzE7CiskY29kZS49PDxfX18gaWYgKCRpPT0wKTsKKwltb3YJYDQqJGlgKCRpbnApLCR4aVswXQorCWJzd2FwCSR4aVswXQorCW1vdgkkeGlbMF0sYDQqJGlgKCVyc3ApCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJGk8MTUpOworCW1vdgkkYywkdDAKKwltb3YJYDQqJGpgKCRpbnApLCR4aVsxXQorCW1vdgkkYSwkdDIKKwl4b3IJJGQsJHQwCisJYnN3YXAJJHhpWzFdCisJcm9sCVwkNSwkdDIKKwlsZWEJMHg1YTgyNzk5OSgkeGlbMF0sJGUpLCRlCisJYW5kCSRiLCR0MAorCW1vdgkkeGlbMV0sYDQqJGpgKCVyc3ApCisJYWRkCSR0MiwkZQorCXhvcgkkZCwkdDAKKwlyb2wJXCQzMCwkYgorCWFkZAkkdDAsJGUKK19fXworJGNvZGUuPTw8X19fIGlmICgkaT49MTUpOworCW1vdglgNCooJGolMTYpYCglcnNwKSwkeGlbMV0KKwltb3YJJGMsJHQwCisJbW92CSRhLCR0MgorCXhvcglgNCooKCRqKzIpJTE2KWAoJXJzcCksJHhpWzFdCisJeG9yCSRkLCR0MAorCXJvbAlcJDUsJHQyCisJeG9yCWA0KigoJGorOCklMTYpYCglcnNwKSwkeGlbMV0KKwlhbmQJJGIsJHQwCisJbGVhCTB4NWE4Mjc5OTkoJHhpWzBdLCRlKSwkZQorCXhvcglgNCooKCRqKzEzKSUxNilgKCVyc3ApLCR4aVsxXQorCXhvcgkkZCwkdDAKKwlyb2wJXCQxLCR4aVsxXQorCWFkZAkkdDIsJGUKKwlyb2wJXCQzMCwkYgorCW1vdgkkeGlbMV0sYDQqKCRqJTE2KWAoJXJzcCkKKwlhZGQJJHQwLCRlCitfX18KK3Vuc2hpZnQoQHhpLHBvcChAeGkpKTsKK30KKworc3ViIEJPRFlfMjBfMzkgeworbXkgKCRpLCRhLCRiLCRjLCRkLCRlKT1AXzsKK215ICRqPSRpKzE7CitteSAkSz0oJGk8NDApPzB4NmVkOWViYTE6MHhjYTYyYzFkNjsKKyRjb2RlLj08PF9fXyBpZiAoJGk8NzkpOworCW1vdglgNCooJGolMTYpYCglcnNwKSwkeGlbMV0KKwltb3YJJGMsJHQwCisJbW92CSRhLCR0MgorCXhvcglgNCooKCRqKzIpJTE2KWAoJXJzcCksJHhpWzFdCisJeG9yCSRiLCR0MAorCXJvbAlcJDUsJHQyCisJbGVhCSRLKCR4aVswXSwkZSksJGUKKwl4b3IJYDQqKCgkais4KSUxNilgKCVyc3ApLCR4aVsxXQorCXhvcgkkZCwkdDAKKwlhZGQJJHQyLCRlCisJeG9yCWA0KigoJGorMTMpJTE2KWAoJXJzcCksJHhpWzFdCisJcm9sCVwkMzAsJGIKKwlhZGQJJHQwLCRlCisJcm9sCVwkMSwkeGlbMV0KK19fXworJGNvZGUuPTw8X19fIGlmICgkaTw3Nik7CisJbW92CSR4aVsxXSxgNCooJGolMTYpYCglcnNwKQorX19fCiskY29kZS49PDxfX18gaWYgKCRpPT03OSk7CisJbW92CSRjLCR0MAorCW1vdgkkYSwkdDIKKwl4b3IJJGIsJHQwCisJbGVhCSRLKCR4aVswXSwkZSksJGUKKwlyb2wJXCQ1LCR0MgorCXhvcgkkZCwkdDAKKwlhZGQJJHQyLCRlCisJcm9sCVwkMzAsJGIKKwlhZGQJJHQwLCRlCitfX18KK3Vuc2hpZnQoQHhpLHBvcChAeGkpKTsKK30KKworc3ViIEJPRFlfNDBfNTkgeworbXkgKCRpLCRhLCRiLCRjLCRkLCRlKT1AXzsKK215ICRqPSRpKzE7CiskY29kZS49PDxfX187CisJbW92CWA0KigkaiUxNilgKCVyc3ApLCR4aVsxXQorCW1vdgkkYywkdDAKKwltb3YJJGMsJHQxCisJeG9yCWA0KigoJGorMiklMTYpYCglcnNwKSwkeGlbMV0KKwlhbmQJJGQsJHQwCisJbW92CSRhLCR0MgorCXhvcglgNCooKCRqKzgpJTE2KWAoJXJzcCksJHhpWzFdCisJeG9yCSRkLCR0MQorCWxlYQkweDhmMWJiY2RjKCR4aVswXSwkZSksJGUKKwlyb2wJXCQ1LCR0MgorCXhvcglgNCooKCRqKzEzKSUxNilgKCVyc3ApLCR4aVsxXQorCWFkZAkkdDAsJGUKKwlhbmQJJGIsJHQxCisJcm9sCVwkMSwkeGlbMV0KKwlhZGQJJHQxLCRlCisJcm9sCVwkMzAsJGIKKwltb3YJJHhpWzFdLGA0KigkaiUxNilgKCVyc3ApCisJYWRkCSR0MiwkZQorX19fCit1bnNoaWZ0KEB4aSxwb3AoQHhpKSk7Cit9CisKKyRjb2RlLj08PF9fXzsKKy50ZXh0CisuZXh0ZXJuCU9QRU5TU0xfaWEzMmNhcF9QCisKKy5nbG9ibAlzaGExX2Jsb2NrX2RhdGFfb3JkZXIKKy50eXBlCXNoYTFfYmxvY2tfZGF0YV9vcmRlcixcQGZ1bmN0aW9uLDMKKy5hbGlnbgkxNgorc2hhMV9ibG9ja19kYXRhX29yZGVyOgorCW1vdglPUEVOU1NMX2lhMzJjYXBfUCswKCVyaXApLCVyOWQKKwltb3YJT1BFTlNTTF9pYTMyY2FwX1ArNCglcmlwKSwlcjhkCisJbW92CU9QRU5TU0xfaWEzMmNhcF9QKzgoJXJpcCksJXIxMGQKKwl0ZXN0CVwkYDE8PDlgLCVyOGQJCSMgY2hlY2sgU1NTRTMgYml0CisJanoJLkxpYWx1CitfX18KKyRjb2RlLj08PF9fXyBpZiAoJGF2eD4xKTsKKwlhbmQJXCRgMTw8M3wxPDw1fDE8PDhgLCVyMTBkCSMgY2hlY2sgQVZYMitCTUkxK0JNSTIKKwljbXAJXCRgMTw8M3wxPDw1fDE8PDhgLCVyMTBkCisJamUJX2F2eDJfc2hvcnRjdXQKK19fXworJGNvZGUuPTw8X19fIGlmICgkYXZ4KTsKKwlhbmQJXCRgMTw8MjhgLCVyOGQJCSMgbWFzayBBVlggYml0CisJYW5kCVwkYDE8PDMwYCwlcjlkCQkjIG1hc2sgIkludGVsIENQVSIgYml0CisJb3IJJXI5ZCwlcjhkCisJY21wCVwkYDE8PDI4fDE8PDMwYCwlcjhkCisJamUJX2F2eF9zaG9ydGN1dAorX19fCiskY29kZS49PDxfX187CisJam1wCV9zc3NlM19zaG9ydGN1dAorCisuYWxpZ24JMTYKKy5MaWFsdToKKwlwdXNoCSVyYngKKwlwdXNoCSVyYnAKKwlwdXNoCSVyMTIKKwlwdXNoCSVyMTMKKwltb3YJJXJzcCwlcjExCisJbW92CSVyZGksJGN0eAkjIHJlYXNzaWduZWQgYXJndW1lbnQKKwlzdWIJXCRgOCsxNio0YCwlcnNwCisJbW92CSVyc2ksJGlucAkjIHJlYXNzaWduZWQgYXJndW1lbnQKKwlhbmQJXCQtNjQsJXJzcAorCW1vdgklcmR4LCRudW0JIyByZWFzc2lnbmVkIGFyZ3VtZW50CisJbW92CSVyMTEsYDE2KjRgKCVyc3ApCisuTHByb2xvZ3VlOgorCisJbW92CTAoJGN0eCksJEEKKwltb3YJNCgkY3R4KSwkQgorCW1vdgk4KCRjdHgpLCRDCisJbW92CTEyKCRjdHgpLCRECisJbW92CTE2KCRjdHgpLCRFCisJam1wCS5MbG9vcAorCisuYWxpZ24JMTYKKy5MbG9vcDoKK19fXworZm9yKCRpPTA7JGk8MjA7JGkrKykJeyAmQk9EWV8wMF8xOSgkaSxAVik7IHVuc2hpZnQoQFYscG9wKEBWKSk7IH0KK2Zvcig7JGk8NDA7JGkrKykJeyAmQk9EWV8yMF8zOSgkaSxAVik7IHVuc2hpZnQoQFYscG9wKEBWKSk7IH0KK2Zvcig7JGk8NjA7JGkrKykJeyAmQk9EWV80MF81OSgkaSxAVik7IHVuc2hpZnQoQFYscG9wKEBWKSk7IH0KK2Zvcig7JGk8ODA7JGkrKykJeyAmQk9EWV8yMF8zOSgkaSxAVik7IHVuc2hpZnQoQFYscG9wKEBWKSk7IH0KKyRjb2RlLj08PF9fXzsKKwlhZGQJMCgkY3R4KSwkQQorCWFkZAk0KCRjdHgpLCRCCisJYWRkCTgoJGN0eCksJEMKKwlhZGQJMTIoJGN0eCksJEQKKwlhZGQJMTYoJGN0eCksJEUKKwltb3YJJEEsMCgkY3R4KQorCW1vdgkkQiw0KCRjdHgpCisJbW92CSRDLDgoJGN0eCkKKwltb3YJJEQsMTIoJGN0eCkKKwltb3YJJEUsMTYoJGN0eCkKKworCXN1YglcJDEsJG51bQorCWxlYQlgMTYqNGAoJGlucCksJGlucAorCWpuegkuTGxvb3AKKworCW1vdglgMTYqNGAoJXJzcCksJXJzaQorCW1vdgkoJXJzaSksJXIxMworCW1vdgk4KCVyc2kpLCVyMTIKKwltb3YJMTYoJXJzaSksJXJicAorCW1vdgkyNCglcnNpKSwlcmJ4CisJbGVhCTMyKCVyc2kpLCVyc3AKKy5MZXBpbG9ndWU6CisJcmV0Cisuc2l6ZQlzaGExX2Jsb2NrX2RhdGFfb3JkZXIsLi1zaGExX2Jsb2NrX2RhdGFfb3JkZXIKK19fXwore3t7CitteSAkWGk9NDsKK215IEBYPW1hcCgiJXhtbSRfIiwoNC4uNywwLi4zKSk7CitteSBAVHg9bWFwKCIleG1tJF8iLCg4Li4xMCkpOworbXkgJEt4PSIleG1tMTEiOworbXkgQFY9KCRBLCRCLCRDLCRELCRFKT0oIiVlYXgiLCIlZWJ4IiwiJWVjeCIsIiVlZHgiLCIlZWJwIik7CSMgc2l6ZSBvcHRpbWl6YXRpb24KK215IEBUPSgiJWVzaSIsIiVlZGkiKTsKK215ICRqPTA7CitteSAkcng9MDsKK215ICRLX1hYX1hYPSIlcjExIjsKKworbXkgJF9yb2w9c3ViIHsgJnJvbChAXykgfTsKK215ICRfcm9yPXN1YiB7ICZyb3IoQF8pIH07CisKK3sgbXkgJHNuOworc3ViIGFsaWduMzIoKSB7CisgICsrJHNuOworJGNvZGUuPTw8X19fOworCWptcAkuTGFsaWduMzJfJHNuCSMgc2VlICJEZWNvZGVkIElDYWNoZSIgaW4gbWFudWFsCisuYWxpZ24JMzIKKy5MYWxpZ24zMl8kc246CitfX18KK30KK30KKworJGNvZGUuPTw8X19fOworLnR5cGUJc2hhMV9ibG9ja19kYXRhX29yZGVyX3Nzc2UzLFxAZnVuY3Rpb24sMworLmFsaWduCTE2CitzaGExX2Jsb2NrX2RhdGFfb3JkZXJfc3NzZTM6Citfc3NzZTNfc2hvcnRjdXQ6CisJbW92CSVyc3AsJXJheAorCXB1c2gJJXJieAorCXB1c2gJJXJicAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMwkJIyByZWR1bmRhbnQsIGRvbmUgdG8gc2hhcmUgV2luNjQgU0UgaGFuZGxlcgorCXB1c2gJJXIxNAorCWxlYQlgLTY0LSgkd2luNjQ/NioxNjowKWAoJXJzcCksJXJzcAorX19fCiskY29kZS49PDxfX18gaWYgKCR3aW42NCk7CisJbW92YXBzCSV4bW02LC00MC02KjE2KCVyYXgpCisJbW92YXBzCSV4bW03LC00MC01KjE2KCVyYXgpCisJbW92YXBzCSV4bW04LC00MC00KjE2KCVyYXgpCisJbW92YXBzCSV4bW05LC00MC0zKjE2KCVyYXgpCisJbW92YXBzCSV4bW0xMCwtNDAtMioxNiglcmF4KQorCW1vdmFwcwkleG1tMTEsLTQwLTEqMTYoJXJheCkKKy5McHJvbG9ndWVfc3NzZTM6CitfX18KKyRjb2RlLj08PF9fXzsKKwltb3YJJXJheCwlcjE0CSMgb3JpZ2luYWwgJXJzcAorCWFuZAlcJC02NCwlcnNwCisJbW92CSVyZGksJGN0eAkjIHJlYXNzaWduZWQgYXJndW1lbnQKKwltb3YJJXJzaSwkaW5wCSMgcmVhc3NpZ25lZCBhcmd1bWVudAorCW1vdgklcmR4LCRudW0JIyByZWFzc2lnbmVkIGFyZ3VtZW50CisKKwlzaGwJXCQ2LCRudW0KKwlhZGQJJGlucCwkbnVtCisJbGVhCUtfWFhfWFgrNjQoJXJpcCksJEtfWFhfWFgKKworCW1vdgkwKCRjdHgpLCRBCQkjIGxvYWQgY29udGV4dAorCW1vdgk0KCRjdHgpLCRCCisJbW92CTgoJGN0eCksJEMKKwltb3YJMTIoJGN0eCksJEQKKwltb3YJJEIsQFRbMF0JCSMgbWFnaWMgc2VlZAorCW1vdgkxNigkY3R4KSwkRQorCW1vdgkkQyxAVFsxXQorCXhvcgkkRCxAVFsxXQorCWFuZAlAVFsxXSxAVFswXQorCisJbW92ZHFhCTY0KCRLX1hYX1hYKSxAWFsyXQkjIHBic3dhcCBtYXNrCisJbW92ZHFhCS02NCgkS19YWF9YWCksQFR4WzFdCSMgS18wMF8xOQorCW1vdmRxdQkwKCRpbnApLEBYWy00JjddCSMgbG9hZCBpbnB1dCB0byAleG1tWzAtM10KKwltb3ZkcXUJMTYoJGlucCksQFhbLTMmN10KKwltb3ZkcXUJMzIoJGlucCksQFhbLTImN10KKwltb3ZkcXUJNDgoJGlucCksQFhbLTEmN10KKwlwc2h1ZmIJQFhbMl0sQFhbLTQmN10JCSMgYnl0ZSBzd2FwCisJYWRkCVwkNjQsJGlucAorCXBzaHVmYglAWFsyXSxAWFstMyY3XQorCXBzaHVmYglAWFsyXSxAWFstMiY3XQorCXBzaHVmYglAWFsyXSxAWFstMSY3XQorCXBhZGRkCUBUeFsxXSxAWFstNCY3XQkJIyBhZGQgS18wMF8xOQorCXBhZGRkCUBUeFsxXSxAWFstMyY3XQorCXBhZGRkCUBUeFsxXSxAWFstMiY3XQorCW1vdmRxYQlAWFstNCY3XSwwKCVyc3ApCSMgWFtdK0sgeGZlciB0byBJQUxVCisJcHN1YmQJQFR4WzFdLEBYWy00JjddCQkjIHJlc3RvcmUgWFtdCisJbW92ZHFhCUBYWy0zJjddLDE2KCVyc3ApCisJcHN1YmQJQFR4WzFdLEBYWy0zJjddCisJbW92ZHFhCUBYWy0yJjddLDMyKCVyc3ApCisJcHN1YmQJQFR4WzFdLEBYWy0yJjddCisJam1wCS5Mb29wX3Nzc2UzCitfX18KKworc3ViIEFVVE9MT0FEKCkJCSMgdGh1bmsgW3NpbXBsaWZpZWRdIDMyLWJpdCBzdHlsZSBwZXJsYXNtCit7IG15ICRvcGNvZGUgPSAkQVVUT0xPQUQ7ICRvcGNvZGUgPX4gcy8uKjo6Ly87CisgIG15ICRhcmcgPSBwb3A7CisgICAgJGFyZyA9ICJcJCRhcmciIGlmICgkYXJnKjEgZXEgJGFyZyk7CisgICAgJGNvZGUgLj0gIlx0JG9wY29kZVx0Ii5qb2luKCcsJywkYXJnLHJldmVyc2UgQF8pLiJcbiI7Cit9CisKK3N1YiBYdXBkYXRlX3Nzc2UzXzE2XzMxKCkJCSMgcmVjYWxsIHRoYXQgJFhpIHN0YXJ0cyB3dGloIDQKK3sgdXNlIGludGVnZXI7CisgIG15ICRib2R5ID0gc2hpZnQ7CisgIG15IEBpbnNucyA9ICgmJGJvZHksJiRib2R5LCYkYm9keSwmJGJvZHkpOwkjIDQwIGluc3RydWN0aW9ucworICBteSAoJGEsJGIsJGMsJGQsJGUpOworCisJJm1vdmRxYQkoQFhbMF0sQFhbLTMmN10pOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSZtb3ZkcWEJKEBUeFswXSxAWFstMSY3XSk7CisJJnBhbGlnbnIoQFhbMF0sQFhbLTQmN10sOCk7CSMgY29tcG9zZSAiWFstMTRdIiBpbiAiWFswXSIKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKworCSAgJnBhZGRkCShAVHhbMV0sQFhbLTEmN10pOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSZwc3JsZHEJKEBUeFswXSw0KTsJCSMgIlhbLTNdIiwgMyBkd29yZHMKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmcHhvcgkoQFhbMF0sQFhbLTQmN10pOwkjICJYWzBdIl49IlhbLTE2XSIKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKworCSZweG9yCShAVHhbMF0sQFhbLTImN10pOwkjICJYWy0zXSJeIlhbLThdIgorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCisJJnB4b3IJKEBYWzBdLEBUeFswXSk7CQkjICJYWzBdIl49IlhbLTNdIl4iWFstOF0iCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICAmbW92ZHFhCShldmFsKDE2KigoJFhpLTEpJjMpKS4iKCVyc3ApIixAVHhbMV0pOwkjIFhbXStLIHhmZXIgdG8gSUFMVQorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCisJJm1vdmRxYQkoQFR4WzJdLEBYWzBdKTsKKwkmbW92ZHFhCShAVHhbMF0sQFhbMF0pOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCisJJnBzbGxkcQkoQFR4WzJdLDEyKTsJCSMgIlhbMF0iPDw5NiwgZXh0cmFjdCBvbmUgZHdvcmQKKwkmcGFkZGQJKEBYWzBdLEBYWzBdKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKworCSZwc3JsZAkoQFR4WzBdLDMxKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmbW92ZHFhCShAVHhbMV0sQFR4WzJdKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKworCSZwc3JsZAkoQFR4WzJdLDMwKTsKKwkmcG9yCShAWFswXSxAVHhbMF0pOwkJIyAiWFswXSI8PDw9MQorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCisJJnBzbGxkCShAVHhbMV0sMik7CisJJnB4b3IJKEBYWzBdLEBUeFsyXSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICAmbW92ZHFhCShAVHhbMl0sZXZhbCgyKjE2KigoJFhpKS81KS02NCkuIigkS19YWF9YWCkiKTsJIyBLX1hYX1hYCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisKKwkmcHhvcgkoQFhbMF0sQFR4WzFdKTsJCSMgIlhbMF0iXj0oIlhbMF0iPj45Nik8PDwyCisKKwkgZm9yZWFjaCAoQGluc25zKSB7IGV2YWw7IH0JIyByZW1haW5pbmcgaW5zdHJ1Y3Rpb25zIFtpZiBhbnldCisKKyAgJFhpKys7CXB1c2goQFgsc2hpZnQoQFgpKTsJIyAicm90YXRlIiBYW10KKwkJcHVzaChAVHgsc2hpZnQoQFR4KSk7Cit9CisKK3N1YiBYdXBkYXRlX3Nzc2UzXzMyXzc5KCkKK3sgdXNlIGludGVnZXI7CisgIG15ICRib2R5ID0gc2hpZnQ7CisgIG15IEBpbnNucyA9ICgmJGJvZHksJiRib2R5LCYkYm9keSwmJGJvZHkpOwkjIDMyIHRvIDQ0IGluc3RydWN0aW9ucworICBteSAoJGEsJGIsJGMsJGQsJGUpOworCisJJm1vdmRxYQkoQFR4WzBdLEBYWy0xJjddKQlpZiAoJFhpPT04KTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsJCSMgYm9keV8yMF8zOQorCSZweG9yCShAWFswXSxAWFstNCY3XSk7CSMgIlhbMF0iPSJYWy0zMl0iXiJYWy0xNl0iCisJJnBhbGlnbnIoQFR4WzBdLEBYWy0yJjddLDgpOwkjIGNvbXBvc2UgIlhbLTZdIgorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOwkJIyByb2wKKworCSZweG9yCShAWFswXSxAWFstNyY3XSk7CSMgIlhbMF0iXj0iWFstMjhdIgorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpCWlmIChAaW5zbnNbMF0gIX4gLyZyb1tybF0vKTsKKwlpZiAoJFhpJTUpIHsKKwkgICZtb3ZkcWEJKEBUeFsyXSxAVHhbMV0pOyMgInBlcnBldHVhdGUiIEtfWFhfWFguLi4KKwl9IGVsc2UgewkJCSMgLi4uIG9yIGxvYWQgbmV4dCBvbmUKKwkgICZtb3ZkcWEJKEBUeFsyXSxldmFsKDIqMTYqKCRYaS81KS02NCkuIigkS19YWF9YWCkiKTsKKwl9CisJICAmcGFkZGQJKEBUeFsxXSxAWFstMSY3XSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CQkjIHJvcgorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCisJJnB4b3IJKEBYWzBdLEBUeFswXSk7CQkjICJYWzBdIl49IlhbLTZdIgorCSBldmFsKHNoaWZ0KEBpbnNucykpOwkJIyBib2R5XzIwXzM5CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CQkjIHJvbAorCisJJm1vdmRxYQkoQFR4WzBdLEBYWzBdKTsKKwkgICZtb3ZkcWEJKGV2YWwoMTYqKCgkWGktMSkmMykpLiIoJXJzcCkiLEBUeFsxXSk7CSMgWFtdK0sgeGZlciB0byBJQUxVCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CQkjIHJvcgorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCisJJnBzbGxkCShAWFswXSwyKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsJCSMgYm9keV8yMF8zOQorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSZwc3JsZAkoQFR4WzBdLDMwKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsJCSMgcm9sCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CQkjIHJvcgorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCisJJnBvcgkoQFhbMF0sQFR4WzBdKTsJCSMgIlhbMF0iPDw8PTIKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsJCSMgYm9keV8yMF8zOQorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgJm1vdmRxYQkoQFR4WzFdLEBYWzBdKQlpZiAoJFhpPDE5KTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsJCSMgcm9sCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CQkjIHJvbAorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCisJIGZvcmVhY2ggKEBpbnNucykgeyBldmFsOyB9CSMgcmVtYWluaW5nIGluc3RydWN0aW9ucworCisgICRYaSsrOwlwdXNoKEBYLHNoaWZ0KEBYKSk7CSMgInJvdGF0ZSIgWFtdCisJCXB1c2goQFR4LHNoaWZ0KEBUeCkpOworfQorCitzdWIgWHVwbGFzdF9zc3NlM184MCgpCit7IHVzZSBpbnRlZ2VyOworICBteSAkYm9keSA9IHNoaWZ0OworICBteSBAaW5zbnMgPSAoJiRib2R5LCYkYm9keSwmJGJvZHksJiRib2R5KTsJIyAzMiBpbnN0cnVjdGlvbnMKKyAgbXkgKCRhLCRiLCRjLCRkLCRlKTsKKworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgJnBhZGRkCShAVHhbMV0sQFhbLTEmN10pOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCisJICAmbW92ZHFhCShldmFsKDE2KigoJFhpLTEpJjMpKS4iKCVyc3ApIixAVHhbMV0pOwkjIFhbXStLIHhmZXIgSUFMVQorCisJIGZvcmVhY2ggKEBpbnNucykgeyBldmFsOyB9CQkjIHJlbWFpbmluZyBpbnN0cnVjdGlvbnMKKworCSZjbXAJKCRpbnAsJG51bSk7CisJJmplCSgiLkxkb25lX3Nzc2UzIik7CisKKwl1bnNoaWZ0KEBUeCxwb3AoQFR4KSk7CisKKwkmbW92ZHFhCShAWFsyXSwiNjQoJEtfWFhfWFgpIik7CQkjIHBic3dhcCBtYXNrCisJJm1vdmRxYQkoQFR4WzFdLCItNjQoJEtfWFhfWFgpIik7CSMgS18wMF8xOQorCSZtb3ZkcXUJKEBYWy00JjddLCIwKCRpbnApIik7CQkjIGxvYWQgaW5wdXQKKwkmbW92ZHF1CShAWFstMyY3XSwiMTYoJGlucCkiKTsKKwkmbW92ZHF1CShAWFstMiY3XSwiMzIoJGlucCkiKTsKKwkmbW92ZHF1CShAWFstMSY3XSwiNDgoJGlucCkiKTsKKwkmcHNodWZiCShAWFstNCY3XSxAWFsyXSk7CQkjIGJ5dGUgc3dhcAorCSZhZGQJKCRpbnAsNjQpOworCisgICRYaT0wOworfQorCitzdWIgWGxvb3Bfc3NzZTMoKQoreyB1c2UgaW50ZWdlcjsKKyAgbXkgJGJvZHkgPSBzaGlmdDsKKyAgbXkgQGluc25zID0gKCYkYm9keSwmJGJvZHksJiRib2R5LCYkYm9keSk7CSMgMzIgaW5zdHJ1Y3Rpb25zCisgIG15ICgkYSwkYiwkYywkZCwkZSk7CisKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmcHNodWZiCShAWFsoJFhpLTMpJjddLEBYWzJdKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmcGFkZGQJKEBYWygkWGktNCkmN10sQFR4WzFdKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmbW92ZHFhCShldmFsKDE2KiRYaSkuIiglcnNwKSIsQFhbKCRYaS00KSY3XSk7CSMgWFtdK0sgeGZlciB0byBJQUxVCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJnBzdWJkCShAWFsoJFhpLTQpJjddLEBUeFsxXSk7CisKKwlmb3JlYWNoIChAaW5zbnMpIHsgZXZhbDsgfQorICAkWGkrKzsKK30KKworc3ViIFh0YWlsX3Nzc2UzKCkKK3sgdXNlIGludGVnZXI7CisgIG15ICRib2R5ID0gc2hpZnQ7CisgIG15IEBpbnNucyA9ICgmJGJvZHksJiRib2R5LCYkYm9keSwmJGJvZHkpOwkjIDMyIGluc3RydWN0aW9ucworICBteSAoJGEsJGIsJGMsJGQsJGUpOworCisJZm9yZWFjaCAoQGluc25zKSB7IGV2YWw7IH0KK30KKworc3ViIGJvZHlfMDBfMTkgKCkgewkjICgoY15kKSZiKV5kCisJIyBvbiBzdGFydCBAVFswXT0oY15kKSZiCisJcmV0dXJuICZib2R5XzIwXzM5KCkgaWYgKCRyeD09MTkpOyAkcngrKzsKKwkoCisJJygkYSwkYiwkYywkZCwkZSk9QFY7Jy4KKwknJiRfcm9yCSgkYiwkaj83OjIpJywJIyAkYj4+PjIKKwknJnhvcgkoQFRbMF0sJGQpJywKKwknJm1vdgkoQFRbMV0sJGEpJywJIyAkYiBmb3IgbmV4dCByb3VuZAorCisJJyZhZGQJKCRlLGV2YWwoNCooJGomMTUpKS4iKCVyc3ApIiknLAkjIFhbXStLIHhmZXIKKwknJnhvcgkoJGIsJGMpJywJIyAkY14kZCBmb3IgbmV4dCByb3VuZAorCisJJyYkX3JvbAkoJGEsNSknLAorCScmYWRkCSgkZSxAVFswXSknLAorCScmYW5kCShAVFsxXSwkYiknLAkjICgkYiYoJGNeJGQpKSBmb3IgbmV4dCByb3VuZAorCisJJyZ4b3IJKCRiLCRjKScsCSMgcmVzdG9yZSAkYgorCScmYWRkCSgkZSwkYSk7JwkuJyRqKys7IHVuc2hpZnQoQFYscG9wKEBWKSk7IHVuc2hpZnQoQFQscG9wKEBUKSk7JworCSk7Cit9CisKK3N1YiBib2R5XzIwXzM5ICgpIHsJIyBiXmReYworCSMgb24gZW50cnkgQFRbMF09Yl5kCisJcmV0dXJuICZib2R5XzQwXzU5KCkgaWYgKCRyeD09MzkpOyAkcngrKzsKKwkoCisJJygkYSwkYiwkYywkZCwkZSk9QFY7Jy4KKwknJmFkZAkoJGUsZXZhbCg0KigkaiYxNSkpLiIoJXJzcCkiKScsCSMgWFtdK0sgeGZlcgorCScmeG9yCShAVFswXSwkZCkJaWYoJGo9PTE5KTsnLgorCScmeG9yCShAVFswXSwkYykJaWYoJGo+IDE5KScsCSMgKCRiXiRkXiRjKQorCScmbW92CShAVFsxXSwkYSknLAkjICRiIGZvciBuZXh0IHJvdW5kCisKKwknJiRfcm9sCSgkYSw1KScsCisJJyZhZGQJKCRlLEBUWzBdKScsCisJJyZ4b3IJKEBUWzFdLCRjKQlpZiAoJGo8IDc5KScsCSMgJGJeJGQgZm9yIG5leHQgcm91bmQKKworCScmJF9yb3IJKCRiLDcpJywJIyAkYj4+PjIKKwknJmFkZAkoJGUsJGEpOycJLickaisrOyB1bnNoaWZ0KEBWLHBvcChAVikpOyB1bnNoaWZ0KEBULHBvcChAVCkpOycKKwkpOworfQorCitzdWIgYm9keV80MF81OSAoKSB7CSMgKChiXmMpJihjXmQpKV5jCisJIyBvbiBlbnRyeSBAVFswXT0oYl5jKSwgKGNePWQpCisJJHJ4Kys7CisJKAorCScoJGEsJGIsJGMsJGQsJGUpPUBWOycuCisJJyZhZGQJKCRlLGV2YWwoNCooJGomMTUpKS4iKCVyc3ApIiknLAkjIFhbXStLIHhmZXIKKwknJmFuZAkoQFRbMF0sJGMpCWlmICgkaj49NDApJywJIyAoYl5jKSYoY15kKQorCScmeG9yCSgkYywkZCkJCWlmICgkaj49NDApJywJIyByZXN0b3JlICRjCisKKwknJiRfcm9yCSgkYiw3KScsCSMgJGI+Pj4yCisJJyZtb3YJKEBUWzFdLCRhKScsCSMgJGIgZm9yIG5leHQgcm91bmQKKwknJnhvcgkoQFRbMF0sJGMpJywKKworCScmJF9yb2wJKCRhLDUpJywKKwknJmFkZAkoJGUsQFRbMF0pJywKKwknJnhvcgkoQFRbMV0sJGMpCWlmICgkaj09NTkpOycuCisJJyZ4b3IJKEBUWzFdLCRiKQlpZiAoJGo8IDU5KScsCSMgYl5jIGZvciBuZXh0IHJvdW5kCisKKwknJnhvcgkoJGIsJGMpCQlpZiAoJGo8IDU5KScsCSMgY15kIGZvciBuZXh0IHJvdW5kCisJJyZhZGQJKCRlLCRhKTsnCS4nJGorKzsgdW5zaGlmdChAVixwb3AoQFYpKTsgdW5zaGlmdChAVCxwb3AoQFQpKTsnCisJKTsKK30KKyRjb2RlLj08PF9fXzsKKy5hbGlnbgkxNgorLkxvb3Bfc3NzZTM6CitfX18KKwkmWHVwZGF0ZV9zc3NlM18xNl8zMShcJmJvZHlfMDBfMTkpOworCSZYdXBkYXRlX3Nzc2UzXzE2XzMxKFwmYm9keV8wMF8xOSk7CisJJlh1cGRhdGVfc3NzZTNfMTZfMzEoXCZib2R5XzAwXzE5KTsKKwkmWHVwZGF0ZV9zc3NlM18xNl8zMShcJmJvZHlfMDBfMTkpOworCSZYdXBkYXRlX3Nzc2UzXzMyXzc5KFwmYm9keV8wMF8xOSk7CisJJlh1cGRhdGVfc3NzZTNfMzJfNzkoXCZib2R5XzIwXzM5KTsKKwkmWHVwZGF0ZV9zc3NlM18zMl83OShcJmJvZHlfMjBfMzkpOworCSZYdXBkYXRlX3Nzc2UzXzMyXzc5KFwmYm9keV8yMF8zOSk7CisJJlh1cGRhdGVfc3NzZTNfMzJfNzkoXCZib2R5XzIwXzM5KTsKKwkmWHVwZGF0ZV9zc3NlM18zMl83OShcJmJvZHlfMjBfMzkpOworCSZYdXBkYXRlX3Nzc2UzXzMyXzc5KFwmYm9keV80MF81OSk7CisJJlh1cGRhdGVfc3NzZTNfMzJfNzkoXCZib2R5XzQwXzU5KTsKKwkmWHVwZGF0ZV9zc3NlM18zMl83OShcJmJvZHlfNDBfNTkpOworCSZYdXBkYXRlX3Nzc2UzXzMyXzc5KFwmYm9keV80MF81OSk7CisJJlh1cGRhdGVfc3NzZTNfMzJfNzkoXCZib2R5XzQwXzU5KTsKKwkmWHVwZGF0ZV9zc3NlM18zMl83OShcJmJvZHlfMjBfMzkpOworCSZYdXBsYXN0X3Nzc2UzXzgwKFwmYm9keV8yMF8zOSk7CSMgY2FuIGp1bXAgdG8gImRvbmUiCisKKwkJCQkkc2F2ZWRfaj0kajsgQHNhdmVkX1Y9QFY7CisKKwkmWGxvb3Bfc3NzZTMoXCZib2R5XzIwXzM5KTsKKwkmWGxvb3Bfc3NzZTMoXCZib2R5XzIwXzM5KTsKKwkmWGxvb3Bfc3NzZTMoXCZib2R5XzIwXzM5KTsKKworJGNvZGUuPTw8X19fOworCWFkZAkwKCRjdHgpLCRBCQkJIyB1cGRhdGUgY29udGV4dAorCWFkZAk0KCRjdHgpLEBUWzBdCisJYWRkCTgoJGN0eCksJEMKKwlhZGQJMTIoJGN0eCksJEQKKwltb3YJJEEsMCgkY3R4KQorCWFkZAkxNigkY3R4KSwkRQorCW1vdglAVFswXSw0KCRjdHgpCisJbW92CUBUWzBdLCRCCQkJIyBtYWdpYyBzZWVkCisJbW92CSRDLDgoJGN0eCkKKwltb3YJJEMsQFRbMV0KKwltb3YJJEQsMTIoJGN0eCkKKwl4b3IJJEQsQFRbMV0KKwltb3YJJEUsMTYoJGN0eCkKKwlhbmQJQFRbMV0sQFRbMF0KKwlqbXAJLkxvb3Bfc3NzZTMKKworLmFsaWduCTE2CisuTGRvbmVfc3NzZTM6CitfX18KKwkJCQkkaj0kc2F2ZWRfajsgQFY9QHNhdmVkX1Y7CisKKwkmWHRhaWxfc3NzZTMoXCZib2R5XzIwXzM5KTsKKwkmWHRhaWxfc3NzZTMoXCZib2R5XzIwXzM5KTsKKwkmWHRhaWxfc3NzZTMoXCZib2R5XzIwXzM5KTsKKworJGNvZGUuPTw8X19fOworCWFkZAkwKCRjdHgpLCRBCQkJIyB1cGRhdGUgY29udGV4dAorCWFkZAk0KCRjdHgpLEBUWzBdCisJYWRkCTgoJGN0eCksJEMKKwltb3YJJEEsMCgkY3R4KQorCWFkZAkxMigkY3R4KSwkRAorCW1vdglAVFswXSw0KCRjdHgpCisJYWRkCTE2KCRjdHgpLCRFCisJbW92CSRDLDgoJGN0eCkKKwltb3YJJEQsMTIoJGN0eCkKKwltb3YJJEUsMTYoJGN0eCkKK19fXworJGNvZGUuPTw8X19fIGlmICgkd2luNjQpOworCW1vdmFwcwktNDAtNioxNiglcjE0KSwleG1tNgorCW1vdmFwcwktNDAtNSoxNiglcjE0KSwleG1tNworCW1vdmFwcwktNDAtNCoxNiglcjE0KSwleG1tOAorCW1vdmFwcwktNDAtMyoxNiglcjE0KSwleG1tOQorCW1vdmFwcwktNDAtMioxNiglcjE0KSwleG1tMTAKKwltb3ZhcHMJLTQwLTEqMTYoJXIxNCksJXhtbTExCitfX18KKyRjb2RlLj08PF9fXzsKKwlsZWEJKCVyMTQpLCVyc2kKKwltb3YJLTQwKCVyc2kpLCVyMTQKKwltb3YJLTMyKCVyc2kpLCVyMTMKKwltb3YJLTI0KCVyc2kpLCVyMTIKKwltb3YJLTE2KCVyc2kpLCVyYnAKKwltb3YJLTgoJXJzaSksJXJieAorCWxlYQkoJXJzaSksJXJzcAorLkxlcGlsb2d1ZV9zc3NlMzoKKwlyZXQKKy5zaXplCXNoYTFfYmxvY2tfZGF0YV9vcmRlcl9zc3NlMywuLXNoYTFfYmxvY2tfZGF0YV9vcmRlcl9zc3NlMworX19fCisKK2lmICgkYXZ4KSB7CiskWGk9NDsJCQkJIyByZXNldCB2YXJpYWJsZXMKK0BYPW1hcCgiJXhtbSRfIiwoNC4uNywwLi4zKSk7CitAVHg9bWFwKCIleG1tJF8iLCg4Li4xMCkpOworJGo9MDsKKyRyeD0wOworCitteSAkZG9uZV9hdnhfbGFiZWw9Ii5MZG9uZV9hdngiOworCitteSAkX3JvbD1zdWIgeyAmc2hsZChAX1swXSxAXykgfTsKK215ICRfcm9yPXN1YiB7ICZzaHJkKEBfWzBdLEBfKSB9OworCiskY29kZS49PDxfX187CisudHlwZQlzaGExX2Jsb2NrX2RhdGFfb3JkZXJfYXZ4LFxAZnVuY3Rpb24sMworLmFsaWduCTE2CitzaGExX2Jsb2NrX2RhdGFfb3JkZXJfYXZ4OgorX2F2eF9zaG9ydGN1dDoKKwltb3YJJXJzcCwlcmF4CisJcHVzaAklcmJ4CisJcHVzaAklcmJwCisJcHVzaAklcjEyCisJcHVzaAklcjEzCQkjIHJlZHVuZGFudCwgZG9uZSB0byBzaGFyZSBXaW42NCBTRSBoYW5kbGVyCisJcHVzaAklcjE0CisJbGVhCWAtNjQtKCR3aW42ND82KjE2OjApYCglcnNwKSwlcnNwCisJdnplcm91cHBlcgorX19fCiskY29kZS49PDxfX18gaWYgKCR3aW42NCk7CisJdm1vdmFwcwkleG1tNiwtNDAtNioxNiglcmF4KQorCXZtb3ZhcHMJJXhtbTcsLTQwLTUqMTYoJXJheCkKKwl2bW92YXBzCSV4bW04LC00MC00KjE2KCVyYXgpCisJdm1vdmFwcwkleG1tOSwtNDAtMyoxNiglcmF4KQorCXZtb3ZhcHMJJXhtbTEwLC00MC0yKjE2KCVyYXgpCisJdm1vdmFwcwkleG1tMTEsLTQwLTEqMTYoJXJheCkKKy5McHJvbG9ndWVfYXZ4OgorX19fCiskY29kZS49PDxfX187CisJbW92CSVyYXgsJXIxNAkjIG9yaWdpbmFsICVyc3AKKwlhbmQJXCQtNjQsJXJzcAorCW1vdgklcmRpLCRjdHgJIyByZWFzc2lnbmVkIGFyZ3VtZW50CisJbW92CSVyc2ksJGlucAkjIHJlYXNzaWduZWQgYXJndW1lbnQKKwltb3YJJXJkeCwkbnVtCSMgcmVhc3NpZ25lZCBhcmd1bWVudAorCisJc2hsCVwkNiwkbnVtCisJYWRkCSRpbnAsJG51bQorCWxlYQlLX1hYX1hYKzY0KCVyaXApLCRLX1hYX1hYCisKKwltb3YJMCgkY3R4KSwkQQkJIyBsb2FkIGNvbnRleHQKKwltb3YJNCgkY3R4KSwkQgorCW1vdgk4KCRjdHgpLCRDCisJbW92CTEyKCRjdHgpLCRECisJbW92CSRCLEBUWzBdCQkjIG1hZ2ljIHNlZWQKKwltb3YJMTYoJGN0eCksJEUKKwltb3YJJEMsQFRbMV0KKwl4b3IJJEQsQFRbMV0KKwlhbmQJQFRbMV0sQFRbMF0KKworCXZtb3ZkcWEJNjQoJEtfWFhfWFgpLEBYWzJdCSMgcGJzd2FwIG1hc2sKKwl2bW92ZHFhCS02NCgkS19YWF9YWCksJEt4CSMgS18wMF8xOQorCXZtb3ZkcXUJMCgkaW5wKSxAWFstNCY3XQkjIGxvYWQgaW5wdXQgdG8gJXhtbVswLTNdCisJdm1vdmRxdQkxNigkaW5wKSxAWFstMyY3XQorCXZtb3ZkcXUJMzIoJGlucCksQFhbLTImN10KKwl2bW92ZHF1CTQ4KCRpbnApLEBYWy0xJjddCisJdnBzaHVmYglAWFsyXSxAWFstNCY3XSxAWFstNCY3XQkjIGJ5dGUgc3dhcAorCWFkZAlcJDY0LCRpbnAKKwl2cHNodWZiCUBYWzJdLEBYWy0zJjddLEBYWy0zJjddCisJdnBzaHVmYglAWFsyXSxAWFstMiY3XSxAWFstMiY3XQorCXZwc2h1ZmIJQFhbMl0sQFhbLTEmN10sQFhbLTEmN10KKwl2cGFkZGQJJEt4LEBYWy00JjddLEBYWzBdCSMgYWRkIEtfMDBfMTkKKwl2cGFkZGQJJEt4LEBYWy0zJjddLEBYWzFdCisJdnBhZGRkCSRLeCxAWFstMiY3XSxAWFsyXQorCXZtb3ZkcWEJQFhbMF0sMCglcnNwKQkJIyBYW10rSyB4ZmVyIHRvIElBTFUKKwl2bW92ZHFhCUBYWzFdLDE2KCVyc3ApCisJdm1vdmRxYQlAWFsyXSwzMiglcnNwKQorCWptcAkuTG9vcF9hdngKK19fXworCitzdWIgWHVwZGF0ZV9hdnhfMTZfMzEoKQkJIyByZWNhbGwgdGhhdCAkWGkgc3RhcnRzIHd0aWggNAoreyB1c2UgaW50ZWdlcjsKKyAgbXkgJGJvZHkgPSBzaGlmdDsKKyAgbXkgQGluc25zID0gKCYkYm9keSwmJGJvZHksJiRib2R5LCYkYm9keSk7CSMgNDAgaW5zdHJ1Y3Rpb25zCisgIG15ICgkYSwkYiwkYywkZCwkZSk7CisKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmdnBhbGlnbnIoQFhbMF0sQFhbLTMmN10sQFhbLTQmN10sOCk7CSMgY29tcG9zZSAiWFstMTRdIiBpbiAiWFswXSIKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKworCSAgJnZwYWRkZAkoQFR4WzFdLCRLeCxAWFstMSY3XSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJnZwc3JsZHEoQFR4WzBdLEBYWy0xJjddLDQpOwkJIyAiWFstM10iLCAzIGR3b3JkcworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSZ2cHhvcgkoQFhbMF0sQFhbMF0sQFhbLTQmN10pOwkJIyAiWFswXSJePSJYWy0xNl0iCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisKKwkmdnB4b3IJKEBUeFswXSxAVHhbMF0sQFhbLTImN10pOwkjICJYWy0zXSJeIlhbLThdIgorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCisJJnZweG9yCShAWFswXSxAWFswXSxAVHhbMF0pOwkJIyAiWFswXSJePSJYWy0zXSJeIlhbLThdIgorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgJnZtb3ZkcWEJKGV2YWwoMTYqKCgkWGktMSkmMykpLiIoJXJzcCkiLEBUeFsxXSk7CSMgWFtdK0sgeGZlciB0byBJQUxVCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisKKwkmdnBzcmxkCShAVHhbMF0sQFhbMF0sMzEpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCisJJnZwc2xsZHEoQFR4WzJdLEBYWzBdLDEyKTsJCSMgIlhbMF0iPDw5NiwgZXh0cmFjdCBvbmUgZHdvcmQKKwkmdnBhZGRkCShAWFswXSxAWFswXSxAWFswXSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisKKwkmdnBzcmxkCShAVHhbMV0sQFR4WzJdLDMwKTsKKwkmdnBvcgkoQFhbMF0sQFhbMF0sQFR4WzBdKTsJCSMgIlhbMF0iPDw8PTEKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKworCSZ2cHNsbGQJKEBUeFsyXSxAVHhbMl0sMik7CisJJnZweG9yCShAWFswXSxAWFswXSxAVHhbMV0pOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCisJJnZweG9yCShAWFswXSxAWFswXSxAVHhbMl0pOwkJIyAiWFswXSJePSgiWFswXSI+Pjk2KTw8PDIKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgICZ2bW92ZHFhCSgkS3gsZXZhbCgyKjE2KigoJFhpKS81KS02NCkuIigkS19YWF9YWCkiKQlpZiAoJFhpJTU9PTApOwkjIEtfWFhfWFgKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKworCisJIGZvcmVhY2ggKEBpbnNucykgeyBldmFsOyB9CSMgcmVtYWluaW5nIGluc3RydWN0aW9ucyBbaWYgYW55XQorCisgICRYaSsrOwlwdXNoKEBYLHNoaWZ0KEBYKSk7CSMgInJvdGF0ZSIgWFtdCit9CisKK3N1YiBYdXBkYXRlX2F2eF8zMl83OSgpCit7IHVzZSBpbnRlZ2VyOworICBteSAkYm9keSA9IHNoaWZ0OworICBteSBAaW5zbnMgPSAoJiRib2R5LCYkYm9keSwmJGJvZHksJiRib2R5KTsJIyAzMiB0byA0NCBpbnN0cnVjdGlvbnMKKyAgbXkgKCRhLCRiLCRjLCRkLCRlKTsKKworCSZ2cGFsaWducihAVHhbMF0sQFhbLTEmN10sQFhbLTImN10sOCk7CSMgY29tcG9zZSAiWFstNl0iCisJJnZweG9yCShAWFswXSxAWFswXSxAWFstNCY3XSk7CQkjICJYWzBdIj0iWFstMzJdIl4iWFstMTZdIgorCSBldmFsKHNoaWZ0KEBpbnNucykpOwkJIyBib2R5XzIwXzM5CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CQkjIHJvbAorCisJJnZweG9yCShAWFswXSxAWFswXSxAWFstNyY3XSk7CQkjICJYWzBdIl49IlhbLTI4XSIKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKQlpZiAoQGluc25zWzBdICF+IC8mcm9bcmxdLyk7CisJICAmdnBhZGRkCShAVHhbMV0sJEt4LEBYWy0xJjddKTsKKwkgICZ2bW92ZHFhCSgkS3gsZXZhbCgyKjE2KigkWGkvNSktNjQpLiIoJEtfWFhfWFgpIikJaWYgKCRYaSU1PT0wKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsJCSMgcm9yCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisKKwkmdnB4b3IJKEBYWzBdLEBYWzBdLEBUeFswXSk7CQkjICJYWzBdIl49IlhbLTZdIgorCSBldmFsKHNoaWZ0KEBpbnNucykpOwkJIyBib2R5XzIwXzM5CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CQkjIHJvbAorCisJJnZwc3JsZAkoQFR4WzBdLEBYWzBdLDMwKTsKKwkgICZ2bW92ZHFhCShldmFsKDE2KigoJFhpLTEpJjMpKS4iKCVyc3ApIixAVHhbMV0pOwkjIFhbXStLIHhmZXIgdG8gSUFMVQorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOwkJIyByb3IKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKworCSZ2cHNsbGQJKEBYWzBdLEBYWzBdLDIpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOwkJIyBib2R5XzIwXzM5CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CQkjIHJvbAorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOwkJIyByb3IKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKworCSZ2cG9yCShAWFswXSxAWFswXSxAVHhbMF0pOwkJIyAiWFswXSI8PDw9MgorCSBldmFsKHNoaWZ0KEBpbnNucykpOwkJIyBib2R5XzIwXzM5CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CQkjIHJvbAorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOwkJIyByb2wKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKworCSBmb3JlYWNoIChAaW5zbnMpIHsgZXZhbDsgfQkjIHJlbWFpbmluZyBpbnN0cnVjdGlvbnMKKworICAkWGkrKzsJcHVzaChAWCxzaGlmdChAWCkpOwkjICJyb3RhdGUiIFhbXQorfQorCitzdWIgWHVwbGFzdF9hdnhfODAoKQoreyB1c2UgaW50ZWdlcjsKKyAgbXkgJGJvZHkgPSBzaGlmdDsKKyAgbXkgQGluc25zID0gKCYkYm9keSwmJGJvZHksJiRib2R5LCYkYm9keSk7CSMgMzIgaW5zdHJ1Y3Rpb25zCisgIG15ICgkYSwkYiwkYywkZCwkZSk7CisKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgICZ2cGFkZGQJKEBUeFsxXSwkS3gsQFhbLTEmN10pOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCisJICAmdm1vdmRxYQkoZXZhbCgxNiooKCRYaS0xKSYzKSkuIiglcnNwKSIsQFR4WzFdKTsJIyBYW10rSyB4ZmVyIElBTFUKKworCSBmb3JlYWNoIChAaW5zbnMpIHsgZXZhbDsgfQkJIyByZW1haW5pbmcgaW5zdHJ1Y3Rpb25zCisKKwkmY21wCSgkaW5wLCRudW0pOworCSZqZQkoJGRvbmVfYXZ4X2xhYmVsKTsKKworCSZ2bW92ZHFhKEBYWzJdLCI2NCgkS19YWF9YWCkiKTsJCSMgcGJzd2FwIG1hc2sKKwkmdm1vdmRxYSgkS3gsIi02NCgkS19YWF9YWCkiKTsJCSMgS18wMF8xOQorCSZ2bW92ZHF1KEBYWy00JjddLCIwKCRpbnApIik7CQkjIGxvYWQgaW5wdXQKKwkmdm1vdmRxdShAWFstMyY3XSwiMTYoJGlucCkiKTsKKwkmdm1vdmRxdShAWFstMiY3XSwiMzIoJGlucCkiKTsKKwkmdm1vdmRxdShAWFstMSY3XSwiNDgoJGlucCkiKTsKKwkmdnBzaHVmYihAWFstNCY3XSxAWFstNCY3XSxAWFsyXSk7CSMgYnl0ZSBzd2FwCisJJmFkZAkoJGlucCw2NCk7CisKKyAgJFhpPTA7Cit9CisKK3N1YiBYbG9vcF9hdngoKQoreyB1c2UgaW50ZWdlcjsKKyAgbXkgJGJvZHkgPSBzaGlmdDsKKyAgbXkgQGluc25zID0gKCYkYm9keSwmJGJvZHksJiRib2R5LCYkYm9keSk7CSMgMzIgaW5zdHJ1Y3Rpb25zCisgIG15ICgkYSwkYiwkYywkZCwkZSk7CisKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmdnBzaHVmYihAWFsoJFhpLTMpJjddLEBYWygkWGktMykmN10sQFhbMl0pOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSZ2cGFkZGQJKEBYWyRYaSY3XSxAWFsoJFhpLTQpJjddLCRLeCk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJnZtb3ZkcWEoZXZhbCgxNiokWGkpLiIoJXJzcCkiLEBYWyRYaSY3XSk7CSMgWFtdK0sgeGZlciB0byBJQUxVCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisKKwlmb3JlYWNoIChAaW5zbnMpIHsgZXZhbDsgfQorICAkWGkrKzsKK30KKworc3ViIFh0YWlsX2F2eCgpCit7IHVzZSBpbnRlZ2VyOworICBteSAkYm9keSA9IHNoaWZ0OworICBteSBAaW5zbnMgPSAoJiRib2R5LCYkYm9keSwmJGJvZHksJiRib2R5KTsJIyAzMiBpbnN0cnVjdGlvbnMKKyAgbXkgKCRhLCRiLCRjLCRkLCRlKTsKKworCWZvcmVhY2ggKEBpbnNucykgeyBldmFsOyB9Cit9CisKKyRjb2RlLj08PF9fXzsKKy5hbGlnbgkxNgorLkxvb3BfYXZ4OgorX19fCisJJlh1cGRhdGVfYXZ4XzE2XzMxKFwmYm9keV8wMF8xOSk7CisJJlh1cGRhdGVfYXZ4XzE2XzMxKFwmYm9keV8wMF8xOSk7CisJJlh1cGRhdGVfYXZ4XzE2XzMxKFwmYm9keV8wMF8xOSk7CisJJlh1cGRhdGVfYXZ4XzE2XzMxKFwmYm9keV8wMF8xOSk7CisJJlh1cGRhdGVfYXZ4XzMyXzc5KFwmYm9keV8wMF8xOSk7CisJJlh1cGRhdGVfYXZ4XzMyXzc5KFwmYm9keV8yMF8zOSk7CisJJlh1cGRhdGVfYXZ4XzMyXzc5KFwmYm9keV8yMF8zOSk7CisJJlh1cGRhdGVfYXZ4XzMyXzc5KFwmYm9keV8yMF8zOSk7CisJJlh1cGRhdGVfYXZ4XzMyXzc5KFwmYm9keV8yMF8zOSk7CisJJlh1cGRhdGVfYXZ4XzMyXzc5KFwmYm9keV8yMF8zOSk7CisJJlh1cGRhdGVfYXZ4XzMyXzc5KFwmYm9keV80MF81OSk7CisJJlh1cGRhdGVfYXZ4XzMyXzc5KFwmYm9keV80MF81OSk7CisJJlh1cGRhdGVfYXZ4XzMyXzc5KFwmYm9keV80MF81OSk7CisJJlh1cGRhdGVfYXZ4XzMyXzc5KFwmYm9keV80MF81OSk7CisJJlh1cGRhdGVfYXZ4XzMyXzc5KFwmYm9keV80MF81OSk7CisJJlh1cGRhdGVfYXZ4XzMyXzc5KFwmYm9keV8yMF8zOSk7CisJJlh1cGxhc3RfYXZ4XzgwKFwmYm9keV8yMF8zOSk7CSMgY2FuIGp1bXAgdG8gImRvbmUiCisKKwkJCQkkc2F2ZWRfaj0kajsgQHNhdmVkX1Y9QFY7CisKKwkmWGxvb3BfYXZ4KFwmYm9keV8yMF8zOSk7CisJJlhsb29wX2F2eChcJmJvZHlfMjBfMzkpOworCSZYbG9vcF9hdngoXCZib2R5XzIwXzM5KTsKKworJGNvZGUuPTw8X19fOworCWFkZAkwKCRjdHgpLCRBCQkJIyB1cGRhdGUgY29udGV4dAorCWFkZAk0KCRjdHgpLEBUWzBdCisJYWRkCTgoJGN0eCksJEMKKwlhZGQJMTIoJGN0eCksJEQKKwltb3YJJEEsMCgkY3R4KQorCWFkZAkxNigkY3R4KSwkRQorCW1vdglAVFswXSw0KCRjdHgpCisJbW92CUBUWzBdLCRCCQkJIyBtYWdpYyBzZWVkCisJbW92CSRDLDgoJGN0eCkKKwltb3YJJEMsQFRbMV0KKwltb3YJJEQsMTIoJGN0eCkKKwl4b3IJJEQsQFRbMV0KKwltb3YJJEUsMTYoJGN0eCkKKwlhbmQJQFRbMV0sQFRbMF0KKwlqbXAJLkxvb3BfYXZ4CisKKy5hbGlnbgkxNgorJGRvbmVfYXZ4X2xhYmVsOgorX19fCisJCQkJJGo9JHNhdmVkX2o7IEBWPUBzYXZlZF9WOworCisJJlh0YWlsX2F2eChcJmJvZHlfMjBfMzkpOworCSZYdGFpbF9hdngoXCZib2R5XzIwXzM5KTsKKwkmWHRhaWxfYXZ4KFwmYm9keV8yMF8zOSk7CisKKyRjb2RlLj08PF9fXzsKKwl2emVyb3VwcGVyCisKKwlhZGQJMCgkY3R4KSwkQQkJCSMgdXBkYXRlIGNvbnRleHQKKwlhZGQJNCgkY3R4KSxAVFswXQorCWFkZAk4KCRjdHgpLCRDCisJbW92CSRBLDAoJGN0eCkKKwlhZGQJMTIoJGN0eCksJEQKKwltb3YJQFRbMF0sNCgkY3R4KQorCWFkZAkxNigkY3R4KSwkRQorCW1vdgkkQyw4KCRjdHgpCisJbW92CSRELDEyKCRjdHgpCisJbW92CSRFLDE2KCRjdHgpCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJHdpbjY0KTsKKwltb3ZhcHMJLTQwLTYqMTYoJXIxNCksJXhtbTYKKwltb3ZhcHMJLTQwLTUqMTYoJXIxNCksJXhtbTcKKwltb3ZhcHMJLTQwLTQqMTYoJXIxNCksJXhtbTgKKwltb3ZhcHMJLTQwLTMqMTYoJXIxNCksJXhtbTkKKwltb3ZhcHMJLTQwLTIqMTYoJXIxNCksJXhtbTEwCisJbW92YXBzCS00MC0xKjE2KCVyMTQpLCV4bW0xMQorX19fCiskY29kZS49PDxfX187CisJbGVhCSglcjE0KSwlcnNpCisJbW92CS00MCglcnNpKSwlcjE0CisJbW92CS0zMiglcnNpKSwlcjEzCisJbW92CS0yNCglcnNpKSwlcjEyCisJbW92CS0xNiglcnNpKSwlcmJwCisJbW92CS04KCVyc2kpLCVyYngKKwlsZWEJKCVyc2kpLCVyc3AKKy5MZXBpbG9ndWVfYXZ4OgorCXJldAorLnNpemUJc2hhMV9ibG9ja19kYXRhX29yZGVyX2F2eCwuLXNoYTFfYmxvY2tfZGF0YV9vcmRlcl9hdngKK19fXworCitpZiAoJGF2eD4xKSB7Cit1c2UgaW50ZWdlcjsKKyRYaT00OwkJCQkJIyByZXNldCB2YXJpYWJsZXMKK0BYPW1hcCgiJXltbSRfIiwoNC4uNywwLi4zKSk7CitAVHg9bWFwKCIleW1tJF8iLCg4Li4xMCkpOworJEt4PSIleW1tMTEiOworJGo9MDsKKworbXkgQFJPVFg9KCIlZWF4IiwiJWVicCIsIiVlYngiLCIlZWN4IiwiJWVkeCIsIiVlc2kiKTsKK215ICgkYTUsJHQwKT0oIiVyMTJkIiwiJWVkaSIpOworCitteSAoJEEsJEYsJEIsJEMsJEQsJEUpPUBST1RYOworbXkgJHJ4PTA7CitteSAkZnJhbWU9IiVyMTMiOworCiskY29kZS49PDxfX187CisudHlwZQlzaGExX2Jsb2NrX2RhdGFfb3JkZXJfYXZ4MixcQGZ1bmN0aW9uLDMKKy5hbGlnbgkxNgorc2hhMV9ibG9ja19kYXRhX29yZGVyX2F2eDI6CitfYXZ4Ml9zaG9ydGN1dDoKKwltb3YJJXJzcCwlcmF4CisJcHVzaAklcmJ4CisJcHVzaAklcmJwCisJcHVzaAklcjEyCisJcHVzaAklcjEzCisJcHVzaAklcjE0CisJdnplcm91cHBlcgorX19fCiskY29kZS49PDxfX18gaWYgKCR3aW42NCk7CisJbGVhCS02KjE2KCVyc3ApLCVyc3AKKwl2bW92YXBzCSV4bW02LC00MC02KjE2KCVyYXgpCisJdm1vdmFwcwkleG1tNywtNDAtNSoxNiglcmF4KQorCXZtb3ZhcHMJJXhtbTgsLTQwLTQqMTYoJXJheCkKKwl2bW92YXBzCSV4bW05LC00MC0zKjE2KCVyYXgpCisJdm1vdmFwcwkleG1tMTAsLTQwLTIqMTYoJXJheCkKKwl2bW92YXBzCSV4bW0xMSwtNDAtMSoxNiglcmF4KQorLkxwcm9sb2d1ZV9hdngyOgorX19fCiskY29kZS49PDxfX187CisJbW92CSVyYXgsJXIxNAkJIyBvcmlnaW5hbCAlcnNwCisJbW92CSVyZGksJGN0eAkJIyByZWFzc2lnbmVkIGFyZ3VtZW50CisJbW92CSVyc2ksJGlucAkJIyByZWFzc2lnbmVkIGFyZ3VtZW50CisJbW92CSVyZHgsJG51bQkJIyByZWFzc2lnbmVkIGFyZ3VtZW50CisKKwlsZWEJLTY0MCglcnNwKSwlcnNwCisJc2hsCVwkNiwkbnVtCisJIGxlYQk2NCgkaW5wKSwkZnJhbWUKKwlhbmQJXCQtMTI4LCVyc3AKKwlhZGQJJGlucCwkbnVtCisJbGVhCUtfWFhfWFgrNjQoJXJpcCksJEtfWFhfWFgKKworCW1vdgkwKCRjdHgpLCRBCQkjIGxvYWQgY29udGV4dAorCSBjbXAJJG51bSwkZnJhbWUKKwkgY21vdmFlCSRpbnAsJGZyYW1lCQkjIG5leHQgb3Igc2FtZSBibG9jaworCW1vdgk0KCRjdHgpLCRGCisJbW92CTgoJGN0eCksJEMKKwltb3YJMTIoJGN0eCksJEQKKwltb3YJMTYoJGN0eCksJEUKKwl2bW92ZHF1CTY0KCRLX1hYX1hYKSxAWFsyXQkjIHBic3dhcCBtYXNrCisKKwl2bW92ZHF1CQkoJGlucCksJXhtbTAKKwl2bW92ZHF1CQkxNigkaW5wKSwleG1tMQorCXZtb3ZkcXUJCTMyKCRpbnApLCV4bW0yCisJdm1vdmRxdQkJNDgoJGlucCksJXhtbTMKKwlsZWEJCTY0KCRpbnApLCRpbnAKKwl2aW5zZXJ0aTEyOAlcJDEsKCRmcmFtZSksQFhbLTQmN10sQFhbLTQmN10KKwl2aW5zZXJ0aTEyOAlcJDEsMTYoJGZyYW1lKSxAWFstMyY3XSxAWFstMyY3XQorCXZwc2h1ZmIJCUBYWzJdLEBYWy00JjddLEBYWy00JjddCisJdmluc2VydGkxMjgJXCQxLDMyKCRmcmFtZSksQFhbLTImN10sQFhbLTImN10KKwl2cHNodWZiCQlAWFsyXSxAWFstMyY3XSxAWFstMyY3XQorCXZpbnNlcnRpMTI4CVwkMSw0OCgkZnJhbWUpLEBYWy0xJjddLEBYWy0xJjddCisJdnBzaHVmYgkJQFhbMl0sQFhbLTImN10sQFhbLTImN10KKwl2bW92ZHF1CQktNjQoJEtfWFhfWFgpLCRLeAkjIEtfMDBfMTkKKwl2cHNodWZiCQlAWFsyXSxAWFstMSY3XSxAWFstMSY3XQorCisJdnBhZGRkCSRLeCxAWFstNCY3XSxAWFswXQkjIGFkZCBLXzAwXzE5CisJdnBhZGRkCSRLeCxAWFstMyY3XSxAWFsxXQorCXZtb3ZkcXUJQFhbMF0sMCglcnNwKQkJIyBYW10rSyB4ZmVyIHRvIElBTFUKKwl2cGFkZGQJJEt4LEBYWy0yJjddLEBYWzJdCisJdm1vdmRxdQlAWFsxXSwzMiglcnNwKQorCXZwYWRkZAkkS3gsQFhbLTEmN10sQFhbM10KKwl2bW92ZHF1CUBYWzJdLDY0KCVyc3ApCisJdm1vdmRxdQlAWFszXSw5NiglcnNwKQorX19fCitmb3IgKDskWGk8ODskWGkrKykgewkjIFh1cGRhdGVfYXZ4Ml8xNl8zMQorICAgIHVzZSBpbnRlZ2VyOworCisJJnZwYWxpZ25yKEBYWzBdLEBYWy0zJjddLEBYWy00JjddLDgpOwkjIGNvbXBvc2UgIlhbLTE0XSIgaW4gIlhbMF0iCisJJnZwc3JsZHEoQFR4WzBdLEBYWy0xJjddLDQpOwkJIyAiWFstM10iLCAzIGR3b3JkcworCSZ2cHhvcgkoQFhbMF0sQFhbMF0sQFhbLTQmN10pOwkJIyAiWFswXSJePSJYWy0xNl0iCisJJnZweG9yCShAVHhbMF0sQFR4WzBdLEBYWy0yJjddKTsJIyAiWFstM10iXiJYWy04XSIKKwkmdnB4b3IJKEBYWzBdLEBYWzBdLEBUeFswXSk7CQkjICJYWzBdIl49IlhbLTNdIl4iWFstOF0iCisJJnZwc3JsZAkoQFR4WzBdLEBYWzBdLDMxKTsKKwkmdm1vdmRxdSgkS3gsZXZhbCgyKjE2KigoJFhpKS81KS02NCkuIigkS19YWF9YWCkiKQlpZiAoJFhpJTU9PTApOwkjIEtfWFhfWFgKKwkmdnBzbGxkcShAVHhbMl0sQFhbMF0sMTIpOwkJIyAiWFswXSI8PDk2LCBleHRyYWN0IG9uZSBkd29yZAorCSZ2cGFkZGQJKEBYWzBdLEBYWzBdLEBYWzBdKTsKKwkmdnBzcmxkCShAVHhbMV0sQFR4WzJdLDMwKTsKKwkmdnBvcgkoQFhbMF0sQFhbMF0sQFR4WzBdKTsJCSMgIlhbMF0iPDw8PTEKKwkmdnBzbGxkCShAVHhbMl0sQFR4WzJdLDIpOworCSZ2cHhvcgkoQFhbMF0sQFhbMF0sQFR4WzFdKTsKKwkmdnB4b3IJKEBYWzBdLEBYWzBdLEBUeFsyXSk7CQkjICJYWzBdIl49KCJYWzBdIj4+OTYpPDw8MgorCSZ2cGFkZGQJKEBUeFsxXSxAWFswXSwkS3gpOworCSZ2bW92ZHF1KCIzMiokWGkoJXJzcCkiLEBUeFsxXSk7CSMgWFtdK0sgeGZlciB0byBJQUxVCisKKwlwdXNoKEBYLHNoaWZ0KEBYKSk7CSMgInJvdGF0ZSIgWFtdCit9CiskY29kZS49PDxfX187CisJbGVhCTEyOCglcnNwKSwkZnJhbWUKKwlqbXAJLkxvb3BfYXZ4MgorLmFsaWduCTMyCisuTG9vcF9hdngyOgorCXJvcngJXCQyLCRGLCRCCisJYW5kbgkkRCwkRiwkdDAKKwlhbmQJJEMsJEYKKwl4b3IJJHQwLCRGCitfX18KK3N1YiBib2R5eF8wMF8xOSAoKSB7CSMgOCBpbnN0cnVjdGlvbnMsIDMgY3ljbGVzIGNyaXRpY2FsIHBhdGgKKwkjIGF0IHN0YXJ0ICRmPShiJmMpXih+YiZkKSwgJGI+Pj49MgorCXJldHVybiAmYm9keXhfMjBfMzkoKSBpZiAoJHJ4PT0xOSk7ICRyeCsrOworCSgKKwknKCRhLCRmLCRiLCRjLCRkLCRlKT1AUk9UWDsnLgorCisJJyZhZGQJKCRlLCgoMzIqKCRqLzQpKzQqKCRqJTQpKSUyNTYtMTI4KS4iKCRmcmFtZSkiKTsnLgkjIGUrPVhbaV0rSworCSAnJmxlYQkoJGZyYW1lLCIyNTYoJGZyYW1lKSIpCWlmICgkaiUzMj09MzEpOycsCisJJyZhbmRuCSgkdDAsJGEsJGMpJywJCQkjIH5iJmQgZm9yIG5leHQgcm91bmQKKworCScmYWRkCSgkZSwkZiknLAkJCSMgZSs9KGImYyleKH5iJmQpCisJJyZyb3J4CSgkYTUsJGEsMjcpJywJCQkjIGE8PDw1CisJJyZyb3J4CSgkZiwkYSwyKScsCQkJIyBiPj4+MiBmb3IgbmV4dCByb3VuZAorCScmYW5kCSgkYSwkYiknLAkJCSMgYiZjIGZvciBuZXh0IHJvdW5kCisKKwknJmFkZAkoJGUsJGE1KScsCQkJIyBlKz1hPDw8NQorCScmeG9yCSgkYSwkdDApOycuCQkJIyBmPShiJmMpXih+YiZkKSBmb3IgbmV4dCByb3VuZAorCisJJ3Vuc2hpZnQoQFJPVFgscG9wKEBST1RYKSk7ICRqKys7JworCSkKK30KKworc3ViIGJvZHl4XzIwXzM5ICgpIHsJIyA3IGluc3RydWN0aW9ucywgMiBjeWNsZXMgY3JpdGljYWwgcGF0aAorCSMgb24gZW50cnkgJGY9Yl5jXmQsICRiPj4+PTIKKwlyZXR1cm4gJmJvZHl4XzQwXzU5KCkgaWYgKCRyeD09MzkpOyAkcngrKzsKKwkoCisJJygkYSwkZiwkYiwkYywkZCwkZSk9QFJPVFg7Jy4KKworCScmYWRkCSgkZSwoKDMyKigkai80KSs0KigkaiU0KSklMjU2LTEyOCkuIigkZnJhbWUpIik7Jy4JIyBlKz1YW2ldK0sKKwkgJyZsZWEJKCRmcmFtZSwiMjU2KCRmcmFtZSkiKQlpZiAoJGolMzI9PTMxKTsnLAorCisJJyZsZWEJKCRlLCIoJGUsJGYpIiknLAkJIyBlKz1iXmNeZAorCScmcm9yeAkoJGE1LCRhLDI3KScsCQkJIyBhPDw8NQorCScmcm9yeAkoJGYsJGEsMikJaWYgKCRqPDc5KScsCSMgYj4+PjIgaW4gbmV4dCByb3VuZAorCScmeG9yCSgkYSwkYikJCWlmICgkajw3OSknLAkjIGJeYyBmb3IgbmV4dCByb3VuZAorCisJJyZhZGQJKCRlLCRhNSknLAkJCSMgZSs9YTw8PDUKKwknJnhvcgkoJGEsJGMpCQlpZiAoJGo8NzkpOycuCSMgZj1iXmNeZCBmb3IgbmV4dCByb3VuZAorCisJJ3Vuc2hpZnQoQFJPVFgscG9wKEBST1RYKSk7ICRqKys7JworCSkKK30KKworc3ViIGJvZHl4XzQwXzU5ICgpIHsJIyAxMCBpbnN0cnVjdGlvbnMsIDMgY3ljbGVzIGNyaXRpY2FsIHBhdGgKKwkjIG9uIGVudHJ5ICRmPSgoYl5jKSYoY15kKSksICRiPj4+PTIKKwkkcngrKzsKKwkoCisJJygkYSwkZiwkYiwkYywkZCwkZSk9QFJPVFg7Jy4KKworCScmYWRkCSgkZSwoKDMyKigkai80KSs0KigkaiU0KSklMjU2LTEyOCkuIigkZnJhbWUpIik7Jy4JIyBlKz1YW2ldK0sKKwkgJyZsZWEJKCRmcmFtZSwiMjU2KCRmcmFtZSkiKQlpZiAoJGolMzI9PTMxKTsnLAorCScmeG9yCSgkZiwkYykJCWlmICgkaj4zOSknLAkjIChiXmMpJihjXmQpXmMKKwknJm1vdgkoJHQwLCRiKQlpZiAoJGo8NTkpJywJIyBjb3VudCBvbiB6ZXJvIGxhdGVuY3kKKwknJnhvcgkoJHQwLCRjKQlpZiAoJGo8NTkpJywJIyBjXmQgZm9yIG5leHQgcm91bmQKKworCScmbGVhCSgkZSwiKCRlLCRmKSIpJywJCSMgZSs9KGJeYykmKGNeZCleYworCScmcm9yeAkoJGE1LCRhLDI3KScsCQkJIyBhPDw8NQorCScmcm9yeAkoJGYsJGEsMiknLAkJCSMgYj4+PjIgaW4gbmV4dCByb3VuZAorCScmeG9yCSgkYSwkYiknLAkJCSMgYl5jIGZvciBuZXh0IHJvdW5kCisKKwknJmFkZAkoJGUsJGE1KScsCQkJIyBlKz1hPDw8NQorCScmYW5kCSgkYSwkdDApCWlmICgkajwgNTkpOycuCSMgZj0oYl5jKSYoY15kKSBmb3IgbmV4dCByb3VuZAorCScmeG9yCSgkYSwkYykJCWlmICgkaj09NTkpOycuCSMgZj1iXmNeZCBmb3IgbmV4dCByb3VuZAorCisJJ3Vuc2hpZnQoQFJPVFgscG9wKEBST1RYKSk7ICRqKys7JworCSkKK30KKworc3ViIFh1cGRhdGVfYXZ4Ml8xNl8zMSgpCQkjIHJlY2FsbCB0aGF0ICRYaSBzdGFydHMgd3RpaCA0Cit7IHVzZSBpbnRlZ2VyOworICBteSAkYm9keSA9IHNoaWZ0OworICBteSBAaW5zbnMgPSAoJiRib2R5LCYkYm9keSwmJGJvZHksJiRib2R5LCYkYm9keSk7CSMgMzUgaW5zdHJ1Y3Rpb25zCisgIG15ICgkYSwkYiwkYywkZCwkZSk7CisKKwkmdnBhbGlnbnIoQFhbMF0sQFhbLTMmN10sQFhbLTQmN10sOCk7CSMgY29tcG9zZSAiWFstMTRdIiBpbiAiWFswXSIKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKworCSZ2cHNybGRxKEBUeFswXSxAWFstMSY3XSw0KTsJCSMgIlhbLTNdIiwgMyBkd29yZHMKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKworCSZ2cHhvcgkoQFhbMF0sQFhbMF0sQFhbLTQmN10pOwkJIyAiWFswXSJePSJYWy0xNl0iCisJJnZweG9yCShAVHhbMF0sQFR4WzBdLEBYWy0yJjddKTsJIyAiWFstM10iXiJYWy04XSIKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKworCSZ2cHhvcgkoQFhbMF0sQFhbMF0sQFR4WzBdKTsJCSMgIlhbMF0iXj0iWFstM10iXiJYWy04XSIKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKworCSZ2cHNybGQJKEBUeFswXSxAWFswXSwzMSk7CisJJnZtb3ZkcXUoJEt4LGV2YWwoMioxNiooKCRYaSkvNSktNjQpLiIoJEtfWFhfWFgpIikJaWYgKCRYaSU1PT0wKTsJIyBLX1hYX1hYCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisKKwkmdnBzbGxkcShAVHhbMl0sQFhbMF0sMTIpOwkJIyAiWFswXSI8PDk2LCBleHRyYWN0IG9uZSBkd29yZAorCSZ2cGFkZGQJKEBYWzBdLEBYWzBdLEBYWzBdKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKworCSZ2cHNybGQJKEBUeFsxXSxAVHhbMl0sMzApOworCSZ2cG9yCShAWFswXSxAWFswXSxAVHhbMF0pOwkJIyAiWFswXSI8PDw9MQorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCisJJnZwc2xsZAkoQFR4WzJdLEBUeFsyXSwyKTsKKwkmdnB4b3IJKEBYWzBdLEBYWzBdLEBUeFsxXSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisKKwkmdnB4b3IJKEBYWzBdLEBYWzBdLEBUeFsyXSk7CQkjICJYWzBdIl49KCJYWzBdIj4+OTYpPDw8MgorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCisJJnZwYWRkZAkoQFR4WzFdLEBYWzBdLCRLeCk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJnZtb3ZkcXUoZXZhbCgzMiooJFhpKSkuIiglcnNwKSIsQFR4WzFdKTsJIyBYW10rSyB4ZmVyIHRvIElBTFUKKworCSBmb3JlYWNoIChAaW5zbnMpIHsgZXZhbDsgfQkjIHJlbWFpbmluZyBpbnN0cnVjdGlvbnMgW2lmIGFueV0KKworCSRYaSsrOworCXB1c2goQFgsc2hpZnQoQFgpKTsJIyAicm90YXRlIiBYW10KK30KKworc3ViIFh1cGRhdGVfYXZ4Ml8zMl83OSgpCit7IHVzZSBpbnRlZ2VyOworICBteSAkYm9keSA9IHNoaWZ0OworICBteSBAaW5zbnMgPSAoJiRib2R5LCYkYm9keSwmJGJvZHksJiRib2R5LCYkYm9keSk7CSMgMzUgdG8gNTAgaW5zdHJ1Y3Rpb25zCisgIG15ICgkYSwkYiwkYywkZCwkZSk7CisKKwkmdnBhbGlnbnIoQFR4WzBdLEBYWy0xJjddLEBYWy0yJjddLDgpOwkjIGNvbXBvc2UgIlhbLTZdIgorCSZ2cHhvcgkoQFhbMF0sQFhbMF0sQFhbLTQmN10pOwkJIyAiWFswXSI9IlhbLTMyXSJeIlhbLTE2XSIKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKworCSZ2cHhvcgkoQFhbMF0sQFhbMF0sQFhbLTcmN10pOwkJIyAiWFswXSJePSJYWy0yOF0iCisJJnZtb3ZkcXUoJEt4LGV2YWwoMioxNiooJFhpLzUpLTY0KS4iKCRLX1hYX1hYKSIpCWlmICgkWGklNT09MCk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisKKwkmdnB4b3IJKEBYWzBdLEBYWzBdLEBUeFswXSk7CQkjICJYWzBdIl49IlhbLTZdIgorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCisJJnZwc3JsZAkoQFR4WzBdLEBYWzBdLDMwKTsKKwkmdnBzbGxkCShAWFswXSxAWFswXSwyKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKworCSMmdnBzbGxkCShAWFswXSxAWFswXSwyKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKworCSZ2cG9yCShAWFswXSxAWFswXSxAVHhbMF0pOwkJIyAiWFswXSI8PDw9MgorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCisJJnZwYWRkZAkoQFR4WzFdLEBYWzBdLCRLeCk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisKKwkmdm1vdmRxdSgiMzIqJFhpKCVyc3ApIixAVHhbMV0pOwkjIFhbXStLIHhmZXIgdG8gSUFMVQorCisJIGZvcmVhY2ggKEBpbnNucykgeyBldmFsOyB9CSMgcmVtYWluaW5nIGluc3RydWN0aW9ucworCisJJFhpKys7CisJcHVzaChAWCxzaGlmdChAWCkpOwkjICJyb3RhdGUiIFhbXQorfQorCitzdWIgWGxvb3BfYXZ4MigpCit7IHVzZSBpbnRlZ2VyOworICBteSAkYm9keSA9IHNoaWZ0OworICBteSBAaW5zbnMgPSAoJiRib2R5LCYkYm9keSwmJGJvZHksJiRib2R5LCYkYm9keSk7CSMgMzIgaW5zdHJ1Y3Rpb25zCisgIG15ICgkYSwkYiwkYywkZCwkZSk7CisKKwkgZm9yZWFjaCAoQGluc25zKSB7IGV2YWw7IH0KK30KKworCSZhbGlnbjMyKCk7CisJJlh1cGRhdGVfYXZ4Ml8zMl83OShcJmJvZHl4XzAwXzE5KTsKKwkmWHVwZGF0ZV9hdngyXzMyXzc5KFwmYm9keXhfMDBfMTkpOworCSZYdXBkYXRlX2F2eDJfMzJfNzkoXCZib2R5eF8wMF8xOSk7CisJJlh1cGRhdGVfYXZ4Ml8zMl83OShcJmJvZHl4XzAwXzE5KTsKKworCSZYdXBkYXRlX2F2eDJfMzJfNzkoXCZib2R5eF8yMF8zOSk7CisJJlh1cGRhdGVfYXZ4Ml8zMl83OShcJmJvZHl4XzIwXzM5KTsKKwkmWHVwZGF0ZV9hdngyXzMyXzc5KFwmYm9keXhfMjBfMzkpOworCSZYdXBkYXRlX2F2eDJfMzJfNzkoXCZib2R5eF8yMF8zOSk7CisKKwkmYWxpZ24zMigpOworCSZYdXBkYXRlX2F2eDJfMzJfNzkoXCZib2R5eF80MF81OSk7CisJJlh1cGRhdGVfYXZ4Ml8zMl83OShcJmJvZHl4XzQwXzU5KTsKKwkmWHVwZGF0ZV9hdngyXzMyXzc5KFwmYm9keXhfNDBfNTkpOworCSZYdXBkYXRlX2F2eDJfMzJfNzkoXCZib2R5eF80MF81OSk7CisKKwkmWGxvb3BfYXZ4MihcJmJvZHl4XzIwXzM5KTsKKwkmWGxvb3BfYXZ4MihcJmJvZHl4XzIwXzM5KTsKKwkmWGxvb3BfYXZ4MihcJmJvZHl4XzIwXzM5KTsKKwkmWGxvb3BfYXZ4MihcJmJvZHl4XzIwXzM5KTsKKworJGNvZGUuPTw8X19fOworCWxlYQkxMjgoJGlucCksJGZyYW1lCisJbGVhCTEyOCgkaW5wKSwlcmRpCQkJIyBib3Jyb3cgJHQwCisJY21wCSRudW0sJGZyYW1lCisJY21vdmFlCSRpbnAsJGZyYW1lCQkJIyBuZXh0IG9yIHByZXZpb3VzIGJsb2NrCisKKwkjIG91dHB1dCBpcyBkLWUtW2FdLWYtYi1jID0+IEE9ZCxGPWUsQz1mLEQ9YixFPWMKKwlhZGQJMCgkY3R4KSxAUk9UWFswXQkJIyB1cGRhdGUgY29udGV4dAorCWFkZAk0KCRjdHgpLEBST1RYWzFdCisJYWRkCTgoJGN0eCksQFJPVFhbM10KKwltb3YJQFJPVFhbMF0sMCgkY3R4KQorCWFkZAkxMigkY3R4KSxAUk9UWFs0XQorCW1vdglAUk9UWFsxXSw0KCRjdHgpCisJIG1vdglAUk9UWFswXSwkQQkJCSMgQT1kCisJYWRkCTE2KCRjdHgpLEBST1RYWzVdCisJIG1vdglAUk9UWFszXSwkYTUKKwltb3YJQFJPVFhbM10sOCgkY3R4KQorCSBtb3YJQFJPVFhbNF0sJEQJCQkjIEQ9YgorCSAjeGNoZwlAUk9UWFs1XSwkRgkJCSMgRj1jLCBDPWYKKwltb3YJQFJPVFhbNF0sMTIoJGN0eCkKKwkgbW92CUBST1RYWzFdLCRGCQkJIyBGPWUKKwltb3YJQFJPVFhbNV0sMTYoJGN0eCkKKwkjbW92CSRGLDE2KCRjdHgpCisJIG1vdglAUk9UWFs1XSwkRQkJCSMgRT1jCisJIG1vdgkkYTUsJEMJCQkJIyBDPWYKKwkgI3hjaGcJJEYsJEUJCQkJIyBFPWMsIEY9ZQorCisJY21wCSRudW0sJGlucAorCWplCS5MZG9uZV9hdngyCitfX18KKworJFhpPTQ7CQkJCSMgcmVzZXQgdmFyaWFibGVzCitAWD1tYXAoIiV5bW0kXyIsKDQuLjcsMC4uMykpOworCiskY29kZS49PDxfX187CisJdm1vdmRxdQk2NCgkS19YWF9YWCksQFhbMl0JCSMgcGJzd2FwIG1hc2sKKwljbXAJJG51bSwlcmRpCQkJIyBib3Jyb3dlZCAkdDAKKwlqYQkuTGFzdF9hdngyCisKKwl2bW92ZHF1CQktNjQoJXJkaSksJXhtbTAJCSMgbG93IHBhcnQgb2YgQFhbLTQmN10KKwl2bW92ZHF1CQktNDgoJXJkaSksJXhtbTEKKwl2bW92ZHF1CQktMzIoJXJkaSksJXhtbTIKKwl2bW92ZHF1CQktMTYoJXJkaSksJXhtbTMKKwl2aW5zZXJ0aTEyOAlcJDEsMCgkZnJhbWUpLEBYWy00JjddLEBYWy00JjddCisJdmluc2VydGkxMjgJXCQxLDE2KCRmcmFtZSksQFhbLTMmN10sQFhbLTMmN10KKwl2aW5zZXJ0aTEyOAlcJDEsMzIoJGZyYW1lKSxAWFstMiY3XSxAWFstMiY3XQorCXZpbnNlcnRpMTI4CVwkMSw0OCgkZnJhbWUpLEBYWy0xJjddLEBYWy0xJjddCisJam1wCS5MYXN0X2F2eDIKKworLmFsaWduCTMyCisuTGFzdF9hdngyOgorCWxlYQkxMjgrMTYoJXJzcCksJGZyYW1lCisJcm9yeAlcJDIsJEYsJEIKKwlhbmRuCSRELCRGLCR0MAorCWFuZAkkQywkRgorCXhvcgkkdDAsJEYKKwlzdWIJXCQtMTI4LCRpbnAKK19fXworCSRyeD0kaj0wOwlAUk9UWD0oJEEsJEYsJEIsJEMsJEQsJEUpOworCisJJlhsb29wX2F2eDIJKFwmYm9keXhfMDBfMTkpOworCSZYbG9vcF9hdngyCShcJmJvZHl4XzAwXzE5KTsKKwkmWGxvb3BfYXZ4MgkoXCZib2R5eF8wMF8xOSk7CisJJlhsb29wX2F2eDIJKFwmYm9keXhfMDBfMTkpOworCisJJlhsb29wX2F2eDIJKFwmYm9keXhfMjBfMzkpOworCSAgJnZtb3ZkcXUJKCRLeCwiLTY0KCRLX1hYX1hYKSIpOwkJIyBLXzAwXzE5CisJICAmdnBzaHVmYgkoQFhbLTQmN10sQFhbLTQmN10sQFhbMl0pOwkjIGJ5dGUgc3dhcAorCSZYbG9vcF9hdngyCShcJmJvZHl4XzIwXzM5KTsKKwkgICZ2cHNodWZiCShAWFstMyY3XSxAWFstMyY3XSxAWFsyXSk7CisJICAmdnBhZGRkCShAVHhbMF0sQFhbLTQmN10sJEt4KTsJCSMgYWRkIEtfMDBfMTkKKwkmWGxvb3BfYXZ4MgkoXCZib2R5eF8yMF8zOSk7CisJICAmdm1vdmRxdQkoIjAoJXJzcCkiLEBUeFswXSk7CisJICAmdnBzaHVmYgkoQFhbLTImN10sQFhbLTImN10sQFhbMl0pOworCSAgJnZwYWRkZAkoQFR4WzFdLEBYWy0zJjddLCRLeCk7CisJJlhsb29wX2F2eDIJKFwmYm9keXhfMjBfMzkpOworCSAgJnZtb3ZkcXUJKCIzMiglcnNwKSIsQFR4WzFdKTsKKwkgICZ2cHNodWZiCShAWFstMSY3XSxAWFstMSY3XSxAWFsyXSk7CisJICAmdnBhZGRkCShAWFsyXSxAWFstMiY3XSwkS3gpOworCisJJlhsb29wX2F2eDIJKFwmYm9keXhfNDBfNTkpOworCSZhbGlnbjMyCSgpOworCSAgJnZtb3ZkcXUJKCI2NCglcnNwKSIsQFhbMl0pOworCSAgJnZwYWRkZAkoQFhbM10sQFhbLTEmN10sJEt4KTsKKwkmWGxvb3BfYXZ4MgkoXCZib2R5eF80MF81OSk7CisJICAmdm1vdmRxdQkoIjk2KCVyc3ApIixAWFszXSk7CisJJlhsb29wX2F2eDIJKFwmYm9keXhfNDBfNTkpOworCSZYdXBkYXRlX2F2eDJfMTZfMzEoXCZib2R5eF80MF81OSk7CisKKwkmWHVwZGF0ZV9hdngyXzE2XzMxKFwmYm9keXhfMjBfMzkpOworCSZYdXBkYXRlX2F2eDJfMTZfMzEoXCZib2R5eF8yMF8zOSk7CisJJlh1cGRhdGVfYXZ4Ml8xNl8zMShcJmJvZHl4XzIwXzM5KTsKKwkmWGxvb3BfYXZ4MgkoXCZib2R5eF8yMF8zOSk7CisKKyRjb2RlLj08PF9fXzsKKwlsZWEJMTI4KCVyc3ApLCRmcmFtZQorCisJIyBvdXRwdXQgaXMgZC1lLVthXS1mLWItYyA9PiBBPWQsRj1lLEM9ZixEPWIsRT1jCisJYWRkCTAoJGN0eCksQFJPVFhbMF0JCSMgdXBkYXRlIGNvbnRleHQKKwlhZGQJNCgkY3R4KSxAUk9UWFsxXQorCWFkZAk4KCRjdHgpLEBST1RYWzNdCisJbW92CUBST1RYWzBdLDAoJGN0eCkKKwlhZGQJMTIoJGN0eCksQFJPVFhbNF0KKwltb3YJQFJPVFhbMV0sNCgkY3R4KQorCSBtb3YJQFJPVFhbMF0sJEEJCQkjIEE9ZAorCWFkZAkxNigkY3R4KSxAUk9UWFs1XQorCSBtb3YJQFJPVFhbM10sJGE1CisJbW92CUBST1RYWzNdLDgoJGN0eCkKKwkgbW92CUBST1RYWzRdLCRECQkJIyBEPWIKKwkgI3hjaGcJQFJPVFhbNV0sJEYJCQkjIEY9YywgQz1mCisJbW92CUBST1RYWzRdLDEyKCRjdHgpCisJIG1vdglAUk9UWFsxXSwkRgkJCSMgRj1lCisJbW92CUBST1RYWzVdLDE2KCRjdHgpCisJI21vdgkkRiwxNigkY3R4KQorCSBtb3YJQFJPVFhbNV0sJEUJCQkjIEU9YworCSBtb3YJJGE1LCRDCQkJCSMgQz1mCisJICN4Y2hnCSRGLCRFCQkJCSMgRT1jLCBGPWUKKworCWNtcAkkbnVtLCRpbnAKKwlqYmUJLkxvb3BfYXZ4MgorCisuTGRvbmVfYXZ4MjoKKwl2emVyb3VwcGVyCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJHdpbjY0KTsKKwltb3ZhcHMJLTQwLTYqMTYoJXIxNCksJXhtbTYKKwltb3ZhcHMJLTQwLTUqMTYoJXIxNCksJXhtbTcKKwltb3ZhcHMJLTQwLTQqMTYoJXIxNCksJXhtbTgKKwltb3ZhcHMJLTQwLTMqMTYoJXIxNCksJXhtbTkKKwltb3ZhcHMJLTQwLTIqMTYoJXIxNCksJXhtbTEwCisJbW92YXBzCS00MC0xKjE2KCVyMTQpLCV4bW0xMQorX19fCiskY29kZS49PDxfX187CisJbGVhCSglcjE0KSwlcnNpCisJbW92CS00MCglcnNpKSwlcjE0CisJbW92CS0zMiglcnNpKSwlcjEzCisJbW92CS0yNCglcnNpKSwlcjEyCisJbW92CS0xNiglcnNpKSwlcmJwCisJbW92CS04KCVyc2kpLCVyYngKKwlsZWEJKCVyc2kpLCVyc3AKKy5MZXBpbG9ndWVfYXZ4MjoKKwlyZXQKKy5zaXplCXNoYTFfYmxvY2tfZGF0YV9vcmRlcl9hdngyLC4tc2hhMV9ibG9ja19kYXRhX29yZGVyX2F2eDIKK19fXworfQorfQorJGNvZGUuPTw8X19fOworLmFsaWduCTY0CitLX1hYX1hYOgorLmxvbmcJMHg1YTgyNzk5OSwweDVhODI3OTk5LDB4NWE4Mjc5OTksMHg1YTgyNzk5OQkjIEtfMDBfMTkKKy5sb25nCTB4NWE4Mjc5OTksMHg1YTgyNzk5OSwweDVhODI3OTk5LDB4NWE4Mjc5OTkJIyBLXzAwXzE5CisubG9uZwkweDZlZDllYmExLDB4NmVkOWViYTEsMHg2ZWQ5ZWJhMSwweDZlZDllYmExCSMgS18yMF8zOQorLmxvbmcJMHg2ZWQ5ZWJhMSwweDZlZDllYmExLDB4NmVkOWViYTEsMHg2ZWQ5ZWJhMQkjIEtfMjBfMzkKKy5sb25nCTB4OGYxYmJjZGMsMHg4ZjFiYmNkYywweDhmMWJiY2RjLDB4OGYxYmJjZGMJIyBLXzQwXzU5CisubG9uZwkweDhmMWJiY2RjLDB4OGYxYmJjZGMsMHg4ZjFiYmNkYywweDhmMWJiY2RjCSMgS180MF81OQorLmxvbmcJMHhjYTYyYzFkNiwweGNhNjJjMWQ2LDB4Y2E2MmMxZDYsMHhjYTYyYzFkNgkjIEtfNjBfNzkKKy5sb25nCTB4Y2E2MmMxZDYsMHhjYTYyYzFkNiwweGNhNjJjMWQ2LDB4Y2E2MmMxZDYJIyBLXzYwXzc5CisubG9uZwkweDAwMDEwMjAzLDB4MDQwNTA2MDcsMHgwODA5MGEwYiwweDBjMGQwZTBmCSMgcGJzd2FwIG1hc2sKKy5sb25nCTB4MDAwMTAyMDMsMHgwNDA1MDYwNywweDA4MDkwYTBiLDB4MGMwZDBlMGYJIyBwYnN3YXAgbWFzaworX19fCit9fX0KKyRjb2RlLj08PF9fXzsKKy5hc2NpegkiU0hBMSBibG9jayB0cmFuc2Zvcm0gZm9yIHg4Nl82NCwgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQG9wZW5zc2wub3JnPiIKKy5hbGlnbgk2NAorX19fCisKKyMgRVhDRVBUSU9OX0RJU1BPU0lUSU9OIGhhbmRsZXIgKEVYQ0VQVElPTl9SRUNPUkQgKnJlYyxVTE9ORzY0IGZyYW1lLAorIwkJQ09OVEVYVCAqY29udGV4dCxESVNQQVRDSEVSX0NPTlRFWFQgKmRpc3ApCitpZiAoJHdpbjY0KSB7CiskcmVjPSIlcmN4IjsKKyRmcmFtZT0iJXJkeCI7CiskY29udGV4dD0iJXI4IjsKKyRkaXNwPSIlcjkiOworCiskY29kZS49PDxfX187CisuZXh0ZXJuCV9faW1wX1J0bFZpcnR1YWxVbndpbmQKKy50eXBlCXNlX2hhbmRsZXIsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2CitzZV9oYW5kbGVyOgorCXB1c2gJJXJzaQorCXB1c2gJJXJkaQorCXB1c2gJJXJieAorCXB1c2gJJXJicAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCXB1c2gJJXIxNQorCXB1c2hmcQorCXN1YglcJDY0LCVyc3AKKworCW1vdgkxMjAoJGNvbnRleHQpLCVyYXgJIyBwdWxsIGNvbnRleHQtPlJheAorCW1vdgkyNDgoJGNvbnRleHQpLCVyYngJIyBwdWxsIGNvbnRleHQtPlJpcAorCisJbGVhCS5McHJvbG9ndWUoJXJpcCksJXIxMAorCWNtcAklcjEwLCVyYngJCSMgY29udGV4dC0+UmlwPC5McHJvbG9ndWUKKwlqYgkuTGNvbW1vbl9zZWhfdGFpbAorCisJbW92CTE1MigkY29udGV4dCksJXJheAkjIHB1bGwgY29udGV4dC0+UnNwCisKKwlsZWEJLkxlcGlsb2d1ZSglcmlwKSwlcjEwCisJY21wCSVyMTAsJXJieAkJIyBjb250ZXh0LT5SaXA+PS5MZXBpbG9ndWUKKwlqYWUJLkxjb21tb25fc2VoX3RhaWwKKworCW1vdglgMTYqNGAoJXJheCksJXJheAkjIHB1bGwgc2F2ZWQgc3RhY2sgcG9pbnRlcgorCWxlYQkzMiglcmF4KSwlcmF4CisKKwltb3YJLTgoJXJheCksJXJieAorCW1vdgktMTYoJXJheCksJXJicAorCW1vdgktMjQoJXJheCksJXIxMgorCW1vdgktMzIoJXJheCksJXIxMworCW1vdgklcmJ4LDE0NCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJieAorCW1vdgklcmJwLDE2MCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJicAorCW1vdgklcjEyLDIxNigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlIxMgorCW1vdgklcjEzLDIyNCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlIxMworCisJam1wCS5MY29tbW9uX3NlaF90YWlsCisuc2l6ZQlzZV9oYW5kbGVyLC4tc2VfaGFuZGxlcgorCisudHlwZQlzc3NlM19oYW5kbGVyLFxAYWJpLW9tbmlwb3RlbnQKKy5hbGlnbgkxNgorc3NzZTNfaGFuZGxlcjoKKwlwdXNoCSVyc2kKKwlwdXNoCSVyZGkKKwlwdXNoCSVyYngKKwlwdXNoCSVyYnAKKwlwdXNoCSVyMTIKKwlwdXNoCSVyMTMKKwlwdXNoCSVyMTQKKwlwdXNoCSVyMTUKKwlwdXNoZnEKKwlzdWIJXCQ2NCwlcnNwCisKKwltb3YJMTIwKCRjb250ZXh0KSwlcmF4CSMgcHVsbCBjb250ZXh0LT5SYXgKKwltb3YJMjQ4KCRjb250ZXh0KSwlcmJ4CSMgcHVsbCBjb250ZXh0LT5SaXAKKworCW1vdgk4KCRkaXNwKSwlcnNpCQkjIGRpc3AtPkltYWdlQmFzZQorCW1vdgk1NigkZGlzcCksJXIxMQkJIyBkaXNwLT5IYW5kbGVyRGF0YQorCisJbW92CTAoJXIxMSksJXIxMGQJCSMgSGFuZGxlckRhdGFbMF0KKwlsZWEJKCVyc2ksJXIxMCksJXIxMAkjIHByb2xvZ3VlIGxhYmVsCisJY21wCSVyMTAsJXJieAkJIyBjb250ZXh0LT5SaXA8cHJvbG9ndWUgbGFiZWwKKwlqYgkuTGNvbW1vbl9zZWhfdGFpbAorCisJbW92CTE1MigkY29udGV4dCksJXJheAkjIHB1bGwgY29udGV4dC0+UnNwCisKKwltb3YJNCglcjExKSwlcjEwZAkJIyBIYW5kbGVyRGF0YVsxXQorCWxlYQkoJXJzaSwlcjEwKSwlcjEwCSMgZXBpbG9ndWUgbGFiZWwKKwljbXAJJXIxMCwlcmJ4CQkjIGNvbnRleHQtPlJpcD49ZXBpbG9ndWUgbGFiZWwKKwlqYWUJLkxjb21tb25fc2VoX3RhaWwKKworCW1vdgkyMzIoJGNvbnRleHQpLCVyYXgJIyBwdWxsIGNvbnRleHQtPlIxNAorCisJbGVhCS00MC02KjE2KCVyYXgpLCVyc2kKKwlsZWEJNTEyKCRjb250ZXh0KSwlcmRpCSMgJmNvbnRleHQuWG1tNgorCW1vdglcJDEyLCVlY3gKKwkubG9uZwkweGE1NDhmM2ZjCQkjIGNsZDsgcmVwIG1vdnNxCisKKwltb3YJLTgoJXJheCksJXJieAorCW1vdgktMTYoJXJheCksJXJicAorCW1vdgktMjQoJXJheCksJXIxMgorCW1vdgktMzIoJXJheCksJXIxMworCW1vdgktNDAoJXJheCksJXIxNAorCW1vdgklcmJ4LDE0NCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJieAorCW1vdgklcmJwLDE2MCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJicAorCW1vdgklcjEyLDIxNigkY29udGV4dCkJIyByZXN0b3JlIGNvdG5leHQtPlIxMgorCW1vdgklcjEzLDIyNCgkY29udGV4dCkJIyByZXN0b3JlIGNvdG5leHQtPlIxMworCW1vdgklcjE0LDIzMigkY29udGV4dCkJIyByZXN0b3JlIGNvdG5leHQtPlIxNAorCisuTGNvbW1vbl9zZWhfdGFpbDoKKwltb3YJOCglcmF4KSwlcmRpCisJbW92CTE2KCVyYXgpLCVyc2kKKwltb3YJJXJheCwxNTIoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5Sc3AKKwltb3YJJXJzaSwxNjgoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5Sc2kKKwltb3YJJXJkaSwxNzYoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SZGkKKworCW1vdgk0MCgkZGlzcCksJXJkaQkJIyBkaXNwLT5Db250ZXh0UmVjb3JkCisJbW92CSRjb250ZXh0LCVyc2kJCSMgY29udGV4dAorCW1vdglcJDE1NCwlZWN4CQkjIHNpemVvZihDT05URVhUKQorCS5sb25nCTB4YTU0OGYzZmMJCSMgY2xkOyByZXAgbW92c3EKKworCW1vdgkkZGlzcCwlcnNpCisJeG9yCSVyY3gsJXJjeAkJIyBhcmcxLCBVTldfRkxBR19OSEFORExFUgorCW1vdgk4KCVyc2kpLCVyZHgJCSMgYXJnMiwgZGlzcC0+SW1hZ2VCYXNlCisJbW92CTAoJXJzaSksJXI4CQkjIGFyZzMsIGRpc3AtPkNvbnRyb2xQYworCW1vdgkxNiglcnNpKSwlcjkJCSMgYXJnNCwgZGlzcC0+RnVuY3Rpb25FbnRyeQorCW1vdgk0MCglcnNpKSwlcjEwCQkjIGRpc3AtPkNvbnRleHRSZWNvcmQKKwlsZWEJNTYoJXJzaSksJXIxMQkJIyAmZGlzcC0+SGFuZGxlckRhdGEKKwlsZWEJMjQoJXJzaSksJXIxMgkJIyAmZGlzcC0+RXN0YWJsaXNoZXJGcmFtZQorCW1vdgklcjEwLDMyKCVyc3ApCQkjIGFyZzUKKwltb3YJJXIxMSw0MCglcnNwKQkJIyBhcmc2CisJbW92CSVyMTIsNDgoJXJzcCkJCSMgYXJnNworCW1vdgklcmN4LDU2KCVyc3ApCQkjIGFyZzgsIChOVUxMKQorCWNhbGwJKl9faW1wX1J0bFZpcnR1YWxVbndpbmQoJXJpcCkKKworCW1vdglcJDEsJWVheAkJIyBFeGNlcHRpb25Db250aW51ZVNlYXJjaAorCWFkZAlcJDY0LCVyc3AKKwlwb3BmcQorCXBvcAklcjE1CisJcG9wCSVyMTQKKwlwb3AJJXIxMworCXBvcAklcjEyCisJcG9wCSVyYnAKKwlwb3AJJXJieAorCXBvcAklcmRpCisJcG9wCSVyc2kKKwlyZXQKKy5zaXplCXNzc2UzX2hhbmRsZXIsLi1zc3NlM19oYW5kbGVyCisKKy5zZWN0aW9uCS5wZGF0YQorLmFsaWduCTQKKwkucnZhCS5MU0VIX2JlZ2luX3NoYTFfYmxvY2tfZGF0YV9vcmRlcgorCS5ydmEJLkxTRUhfZW5kX3NoYTFfYmxvY2tfZGF0YV9vcmRlcgorCS5ydmEJLkxTRUhfaW5mb19zaGExX2Jsb2NrX2RhdGFfb3JkZXIKKwkucnZhCS5MU0VIX2JlZ2luX3NoYTFfYmxvY2tfZGF0YV9vcmRlcl9zc3NlMworCS5ydmEJLkxTRUhfZW5kX3NoYTFfYmxvY2tfZGF0YV9vcmRlcl9zc3NlMworCS5ydmEJLkxTRUhfaW5mb19zaGExX2Jsb2NrX2RhdGFfb3JkZXJfc3NzZTMKK19fXworJGNvZGUuPTw8X19fIGlmICgkYXZ4KTsKKwkucnZhCS5MU0VIX2JlZ2luX3NoYTFfYmxvY2tfZGF0YV9vcmRlcl9hdngKKwkucnZhCS5MU0VIX2VuZF9zaGExX2Jsb2NrX2RhdGFfb3JkZXJfYXZ4CisJLnJ2YQkuTFNFSF9pbmZvX3NoYTFfYmxvY2tfZGF0YV9vcmRlcl9hdngKK19fXworJGNvZGUuPTw8X19fIGlmICgkYXZ4PjEpOworCS5ydmEJLkxTRUhfYmVnaW5fc2hhMV9ibG9ja19kYXRhX29yZGVyX2F2eDIKKwkucnZhCS5MU0VIX2VuZF9zaGExX2Jsb2NrX2RhdGFfb3JkZXJfYXZ4MgorCS5ydmEJLkxTRUhfaW5mb19zaGExX2Jsb2NrX2RhdGFfb3JkZXJfYXZ4MgorX19fCiskY29kZS49PDxfX187Cisuc2VjdGlvbgkueGRhdGEKKy5hbGlnbgk4CisuTFNFSF9pbmZvX3NoYTFfYmxvY2tfZGF0YV9vcmRlcjoKKwkuYnl0ZQk5LDAsMCwwCisJLnJ2YQlzZV9oYW5kbGVyCisuTFNFSF9pbmZvX3NoYTFfYmxvY2tfZGF0YV9vcmRlcl9zc3NlMzoKKwkuYnl0ZQk5LDAsMCwwCisJLnJ2YQlzc3NlM19oYW5kbGVyCisJLnJ2YQkuTHByb2xvZ3VlX3Nzc2UzLC5MZXBpbG9ndWVfc3NzZTMJIyBIYW5kbGVyRGF0YVtdCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJGF2eCk7CisuTFNFSF9pbmZvX3NoYTFfYmxvY2tfZGF0YV9vcmRlcl9hdng6CisJLmJ5dGUJOSwwLDAsMAorCS5ydmEJc3NzZTNfaGFuZGxlcgorCS5ydmEJLkxwcm9sb2d1ZV9hdngsLkxlcGlsb2d1ZV9hdngJCSMgSGFuZGxlckRhdGFbXQorX19fCiskY29kZS49PDxfX18gaWYgKCRhdng+MSk7CisuTFNFSF9pbmZvX3NoYTFfYmxvY2tfZGF0YV9vcmRlcl9hdngyOgorCS5ieXRlCTksMCwwLDAKKwkucnZhCXNzc2UzX2hhbmRsZXIKKwkucnZhCS5McHJvbG9ndWVfYXZ4MiwuTGVwaWxvZ3VlX2F2eDIJCSMgSGFuZGxlckRhdGFbXQorX19fCit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyRjb2RlID1+IHMvXGAoW15cYF0qKVxgL2V2YWwgJDEvZ2VtOworCitwcmludCAkY29kZTsKKworY2xvc2UgU1RET1VUOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NoYS9hc20vc2hhMjU2LTU4Ni5wbCBiL2NyeXB0by9zaGEvYXNtL3NoYTI1Ni01ODYucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ0OGI2MwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zaGEvYXNtL3NoYTI1Ni01ODYucGwKQEAgLTAsMCArMSwxMTI1IEBACisjIS91c3IvYmluL2VudiBwZXJsCisjCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFdyaXR0ZW4gYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9Ab3BlbnNzbC5vcmc+IGZvciB0aGUgT3BlblNTTAorIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCisjIENSWVBUT0dBTVMgbGljZW5zZXMgZGVwZW5kaW5nIG9uIHdoZXJlIHlvdSBvYnRhaW4gaXQuIEZvciBmdXJ0aGVyCisjIGRldGFpbHMgc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvfmFwcHJvL2NyeXB0b2dhbXMvLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTSEEyNTYgYmxvY2sgdHJhbnNmb3JtIGZvciB4ODYuIFNlcHRlbWJlciAyMDA3LgorIworIyBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBvdmVyIGNvbXBpbGVyIGdlbmVyYXRlZCBjb2RlIHZhcmllcyBmcm9tCisjIDEwJSB0byA0MCUgW3NlZSBiZWxvd10uIE5vdCB2ZXJ5IGltcHJlc3NpdmUgb24gc29tZSC1LWFyY2hzLCBidXQKKyMgaXQncyA1IHRpbWVzIHNtYWxsZXIgYW5kIG9wdGltaXppZXMgYW1vdW50IG9mIHdyaXRlcy4KKyMKKyMgTWF5IDIwMTIuCisjCisjIE9wdGltaXphdGlvbiBpbmNsdWRpbmcgdHdvIG9mIFBhdmVsIFNlbWphbm92J3MgaWRlYXMsIGFsdGVybmF0aXZlCisjIE1haiBhbmQgZnVsbCB1bnJvbGwsIHJlc3VsdGVkIGluIH4yMC0yNSUgaW1wcm92ZW1lbnQgb24gbW9zdCBDUFVzLAorIyB+NyUgb24gUGVudGl1bSwgfjQwJSBvbiBBdG9tLiBBcyBmdWxseSB1bnJvbGxlZCBsb29wIGJvZHkgaXMgYWxtb3N0CisjIDE1eCBsYXJnZXIsIDhLQiB2cy4gNTYwQiwgaXQncyBmaXJlZCBvbmx5IGZvciBsb25nZXIgaW5wdXRzLiBCdXQgbm90CisjIG9uIFA0LCB3aGVyZSBpdCBraWxscyBwZXJmb3JtYW5jZSwgbm9yIFNhbmR5IEJyaWRnZSwgd2hlcmUgZm9sZGVkCisjIGxvb3AgaXMgYXBwcm94aW1hdGVseSBhcyBmYXN0Li4uCisjCisjIEp1bmUgMjAxMi4KKyMKKyMgQWRkIEFNRCBYT1Atc3BlY2lmaWMgY29kZSBwYXRoLCA+MzAlIGltcHJvdmVtZW50IG9uIEJ1bGxkb3plciBvdmVyCisjIE1heSB2ZXJzaW9uLCA+NjAlIG92ZXIgb3JpZ2luYWwuIEFkZCBBVlgrc2hyZCBjb2RlIHBhdGgsID4yNSUKKyMgaW1wcm92ZW1lbnQgb24gU2FuZHkgQnJpZGdlIG92ZXIgTWF5IHZlcnNpb24sIDYwJSBvdmVyIG9yaWdpbmFsLgorIworIyBNYXkgMjAxMy4KKyMKKyMgUmVwbGFjZSBBTUQgWE9QIGNvZGUgcGF0aCB3aXRoIFNTU0UzIHRvIGNvdmVyIG1vcmUgcHJvY2Vzc29ycy4KKyMgKEJpZ2dlc3QgaW1wcm92ZW1lbnQgY29lZmZpY2llbnQgaXMgb24gdXBjb21pbmcgQXRvbSBTaWx2ZXJtb250LAorIyBub3Qgc2hvd24uKSBBZGQgQVZYK0JNSSBjb2RlIHBhdGguCisjCisjIFBlcmZvcm1hbmNlIGluIGNsb2NrIGN5Y2xlcyBwZXIgcHJvY2Vzc2VkIGJ5dGUgKGxlc3MgaXMgYmV0dGVyKToKKyMKKyMJCWdjYwlpY2MJeDg2IGFzbSgqKQlTSU1ECXg4Nl82NCBhc20oKiopCQorIyBQZW50aXVtCTQ2CTU3CTQwLzM4CQktCS0KKyMgUElJSQkJMzYJMzMJMjcvMjQJCS0JLQorIyBQNAkJNDEJMzgJMjgJCS0JMTcuMworIyBBTUQgSzgJMjcJMjUJMTkvMTUuNQkJLQkxNC45CisjIENvcmUyCQkyNgkyMwkxOC8xNS42CQkxNC4zCTEzLjgKKyMgV2VzdG1lcmUJMjcJLQkxOS8xNS43CQkxMy40CTEyLjMKKyMgU2FuZHkgQnJpZGdlCTI1CS0JMTUuOQkJMTIuNAkxMS42CisjIEl2eSBCcmlkZ2UJMjQJLQkxNS4wCQkxMS40CTEwLjMKKyMgSGFzd2VsbAkyMgktCTEzLjkJCTkuNDYJNy44MAorIyBCdWxsZG96ZXIJMzYJLQkyNy8yMgkJMTcuMAkxMy42CisjIFZJQSBOYW5vCTM2CS0JMjUvMjIJCTE2LjgJMTYuNQorIyBBdG9tCQk1MAktCTMwLzI1CQkyMS45CTE4LjkKKyMKKyMgKCopCW51bWJlcnMgYWZ0ZXIgc2xhc2ggYXJlIGZvciB1bnJvbGxlZCBsb29wLCB3aGVyZSBhcHBsaWNhYmxlOworIyAoKiopCXg4Nl82NCBhc3NlbWJseSBwZXJmb3JtYW5jZSBpcyBwcmVzZW50ZWQgZm9yIHJlZmVyZW5jZQorIwlwdXJwb3NlcywgcmVzdWx0cyBhcmUgYmVzdC1hdmFpbGFibGU7CisKKyQwID1+IG0vKC4qW1wvXFxdKVteXC9cXF0rJC87ICRkaXI9JDE7CitwdXNoKEBJTkMsIiR7ZGlyfSIsIiR7ZGlyfS4uLy4uL3Blcmxhc20iKTsKK3JlcXVpcmUgIng4NmFzbS5wbCI7CisKKyZhc21faW5pdCgkQVJHVlswXSwic2hhNTEyLTU4Ni5wbCIsJEFSR1ZbJCNBUkdWXSBlcSAiMzg2Iik7CisKKyR4bW09JGF2eD0wOworZm9yIChAQVJHVikgeyAkeG1tPTEgaWYgKC8tRE9QRU5TU0xfSUEzMl9TU0UyLyk7IH0KKworaWYgKCR4bW0gJiYJYCRFTlZ7Q0N9IC1XYSwtdiAtYyAtbyAvZGV2L251bGwgLXggYXNzZW1ibGVyIC9kZXYvbnVsbCAyPiYxYAorCQkJPX4gL0dOVSBhc3NlbWJsZXIgdmVyc2lvbiAoWzItOV1cLlswLTldKykvKSB7CisJJGF2eCA9ICgkMT49Mi4xOSkgKyAoJDE+PTIuMjIpOworfQorCitpZiAoJHhtbSAmJiAhJGF2eCAmJiAkQVJHVlswXSBlcSAid2luMzJuIiAmJgorCQlgbmFzbSAtdiAyPiYxYCA9fiAvTkFTTSB2ZXJzaW9uIChbMi05XVwuWzAtOV0rKS8pIHsKKwkkYXZ4ID0gKCQxPj0yLjAzKSArICgkMT49Mi4xMCk7Cit9CisKK2lmICgkeG1tICYmICEkYXZ4ICYmICRBUkdWWzBdIGVxICJ3aW4zMiIgJiYKKwkJYG1sIDI+JjFgID1+IC9WZXJzaW9uIChbMC05XSspXC4vKSB7CisJJGF2eCA9ICgkMT49MTApICsgKCQxPj0xMSk7Cit9CisKKyR1bnJvbGxfYWZ0ZXIgPSA2NCo0OwkjIElmIHByZS1ldmljdGVkIGZyb20gTDFQIGNhY2hlIGZpcnN0IHNwaW4gb2YKKwkJCSMgZnVsbHkgdW5yb2xsZWQgbG9vcCB3YXMgbWVhc3VyZWQgdG8gcnVuIGFib3V0CisJCQkjIDMtNHggc2xvd2VyLiBJZiBzbG93ZG93biBjb2VmZmljaWVudCBpcyBOIGFuZAorCQkJIyB1bnJvbGxlZCBsb29wIGlzIG0gdGltZXMgZmFzdGVyLCB0aGVuIHlvdSBicmVhaworCQkJIyBldmVuIGF0IChOLTEpLyhtLTEpIGJsb2Nrcy4gVGhlbiBpdCBuZWVkcyB0byBiZQorCQkJIyBhZGp1c3RlZCBmb3IgcHJvYmFiaWxpdHkgb2YgY29kZSBiZWluZyBldmljdGVkLAorCQkJIyBjb2RlIHNpemUvY2FjaGUgc2l6ZT0xLzQuIFR5cGljYWwgbSBpcyAxLjE1Li4uCisKKyRBPSJlYXgiOworJEU9ImVkeCI7CiskVD0iZWJ4IjsKKyRBb2ZmPSZEV1AoNCwiZXNwIik7CiskQm9mZj0mRFdQKDgsImVzcCIpOworJENvZmY9JkRXUCgxMiwiZXNwIik7CiskRG9mZj0mRFdQKDE2LCJlc3AiKTsKKyRFb2ZmPSZEV1AoMjAsImVzcCIpOworJEZvZmY9JkRXUCgyNCwiZXNwIik7CiskR29mZj0mRFdQKDI4LCJlc3AiKTsKKyRIb2ZmPSZEV1AoMzIsImVzcCIpOworJFhvZmY9JkRXUCgzNiwiZXNwIik7CiskSzI1Nj0iZWJwIjsKKworc3ViIEJPRFlfMTZfNjMoKSB7CisJJm1vdgkoJFQsImVjeCIpOwkJCSMgImVjeCIgaXMgcHJlbG9hZGVkCisJICZtb3YJKCJlc2kiLCZEV1AoNCooOSsxNSsxNi0xNCksImVzcCIpKTsKKwkmcm9yCSgiZWN4IiwxOC03KTsKKwkgJm1vdgkoImVkaSIsImVzaSIpOworCSZyb3IJKCJlc2kiLDE5LTE3KTsKKwkgJnhvcgkoImVjeCIsJFQpOworCSAmc2hyCSgkVCwzKTsKKwkmcm9yCSgiZWN4Iiw3KTsKKwkgJnhvcgkoImVzaSIsImVkaSIpOworCSAmeG9yCSgkVCwiZWN4Iik7CQkJIyBUID0gc2lnbWEwKFhbLTE1XSkKKwkmcm9yCSgiZXNpIiwxNyk7CisJICZhZGQJKCRULCZEV1AoNCooOSsxNSsxNiksImVzcCIpKTsJIyBUICs9IFhbLTE2XQorCSZzaHIJKCJlZGkiLDEwKTsKKwkgJmFkZAkoJFQsJkRXUCg0Kig5KzE1KzE2LTkpLCJlc3AiKSk7CSMgVCArPSBYWy03XQorCSMmeG9yCSgiZWRpIiwiZXNpIikJCQkjIHNpZ21hMShYWy0yXSkKKwkjICZhZGQJKCRULCJlZGkiKTsJCQkjIFQgKz0gc2lnbWExKFhbLTJdKQorCSMgJm1vdgkoJkRXUCg0Kig5KzE1KSwiZXNwIiksJFQpOwkjIHNhdmUgWFswXQorCisJJkJPRFlfMDBfMTUoMSk7Cit9CitzdWIgQk9EWV8wMF8xNSgpIHsKKyAgICBteSAkaW5fMTZfNjM9c2hpZnQ7CisKKwkmbW92CSgiZWN4IiwkRSk7CisJICZ4b3IJKCJlZGkiLCJlc2kiKQkJCWlmICgkaW5fMTZfNjMpOwkjIHNpZ21hMShYWy0yXSkKKwkgJm1vdgkoImVzaSIsJEZvZmYpOworCSZyb3IJKCJlY3giLDI1LTExKTsKKwkgJmFkZAkoJFQsImVkaSIpCQkJaWYgKCRpbl8xNl82Myk7CSMgVCArPSBzaWdtYTEoWFstMl0pCisJICZtb3YJKCJlZGkiLCRHb2ZmKTsKKwkmeG9yCSgiZWN4IiwkRSk7CisJICZ4b3IJKCJlc2kiLCJlZGkiKTsKKwkgJm1vdgkoJFQsJkRXUCg0Kig5KzE1KSwiZXNwIikpCWlmICghJGluXzE2XzYzKTsKKwkgJm1vdgkoJkRXUCg0Kig5KzE1KSwiZXNwIiksJFQpCWlmICgkaW5fMTZfNjMpOwkjIHNhdmUgWFswXQorCSZyb3IJKCJlY3giLDExLTYpOworCSAmYW5kCSgiZXNpIiwkRSk7CisJICZtb3YJKCRFb2ZmLCRFKTsJCSMgbW9kdWxvLXNjaGVkdWxlZAorCSZ4b3IJKCRFLCJlY3giKTsKKwkgJmFkZAkoJFQsJEhvZmYpOwkJIyBUICs9IGgKKwkgJnhvcgkoImVzaSIsImVkaSIpOwkJIyBDaChlLGYsZykKKwkmcm9yCSgkRSw2KTsJCQkjIFNpZ21hMShlKQorCSAmbW92CSgiZWN4IiwkQSk7CisJICZhZGQJKCRULCJlc2kiKTsJCSMgVCArPSBDaChlLGYsZykKKworCSZyb3IJKCJlY3giLDIyLTEzKTsKKwkgJmFkZAkoJFQsJEUpOwkJIyBUICs9IFNpZ21hMShlKQorCSAmbW92CSgiZWRpIiwkQm9mZik7CisJJnhvcgkoImVjeCIsJEEpOworCSAmbW92CSgkQW9mZiwkQSk7CQkjIG1vZHVsby1zY2hlZHVsZWQKKwkgJmxlYQkoImVzcCIsJkRXUCgtNCwiZXNwIikpOworCSZyb3IJKCJlY3giLDEzLTIpOworCSAmbW92CSgiZXNpIiwmRFdQKDAsJEsyNTYpKTsKKwkmeG9yCSgiZWN4IiwkQSk7CisJICZtb3YJKCRFLCRFb2ZmKTsJCSMgZSBpbiBuZXh0IGl0ZXJhdGlvbiwgZCBpbiB0aGlzIG9uZQorCSAmeG9yCSgkQSwiZWRpIik7CQkjIGEgXj0gYgorCSZyb3IJKCJlY3giLDIpOwkJIyBTaWdtYTAoYSkKKworCSAmYWRkCSgkVCwiZXNpIik7CQkjIFQrPSBLW2ldCisJICZtb3YJKCZEV1AoMCwiZXNwIiksJEEpOwkjIChiXmMpIGluIG5leHQgcm91bmQKKwkmYWRkCSgkRSwkVCk7CQkjIGQgKz0gVAorCSAmYW5kCSgkQSwmRFdQKDQsImVzcCIpKTsJIyBhICY9IChiXmMpCisJJmFkZAkoJFQsImVjeCIpOwkJIyBUICs9IFNpZ21hMChhKQorCSAmeG9yCSgkQSwiZWRpIik7CQkjIGggPSBNYWooYSxiLGMpID0gQ2goYV5iLGMsYikKKwkgJm1vdgkoImVjeCIsJkRXUCg0Kig5KzE1KzE2LTEpLCJlc3AiKSkJaWYgKCRpbl8xNl82Myk7CSMgcHJlbG9hZCBUCisJJmFkZAkoJEsyNTYsNCk7CisJICZhZGQJKCRBLCRUKTsJCSMgaCArPSBUCit9CisKKyZleHRlcm5hbF9sYWJlbCgiT1BFTlNTTF9pYTMyY2FwX1AiKQkJaWYgKCEkaTM4Nik7CisKKyZmdW5jdGlvbl9iZWdpbigic2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXIiKTsKKwkmbW92CSgiZXNpIix3cGFyYW0oMCkpOwkjIGN0eAorCSZtb3YJKCJlZGkiLHdwYXJhbSgxKSk7CSMgaW5wCisJJm1vdgkoImVheCIsd3BhcmFtKDIpKTsJIyBudW0KKwkmbW92CSgiZWJ4IiwiZXNwIik7CQkjIHNhdmVkIHNwCisKKwkmY2FsbAkoJmxhYmVsKCJwaWNfcG9pbnQiKSk7CSMgbWFrZSBpdCBQSUMhCismc2V0X2xhYmVsKCJwaWNfcG9pbnQiKTsKKwkmYmxpbmRwb3AoJEsyNTYpOworCSZsZWEJKCRLMjU2LCZEV1AoJmxhYmVsKCJLMjU2IikuIi0iLiZsYWJlbCgicGljX3BvaW50IiksJEsyNTYpKTsKKworCSZzdWIJKCJlc3AiLDE2KTsKKwkmYW5kCSgiZXNwIiwtNjQpOworCisJJnNobAkoImVheCIsNik7CisJJmFkZAkoImVheCIsImVkaSIpOworCSZtb3YJKCZEV1AoMCwiZXNwIiksImVzaSIpOwkjIGN0eAorCSZtb3YJKCZEV1AoNCwiZXNwIiksImVkaSIpOwkjIGlucAorCSZtb3YJKCZEV1AoOCwiZXNwIiksImVheCIpOwkjIGlucCtudW0qMTI4CisJJm1vdgkoJkRXUCgxMiwiZXNwIiksImVieCIpOwkjIHNhdmVkIHNwCisJCQkJCQlpZiAoISRpMzg2KSB7CisJJnBpY21ldXAoImVkeCIsIk9QRU5TU0xfaWEzMmNhcF9QIiwkSzI1NiwmbGFiZWwoIksyNTYiKSk7CisJJm1vdgkoImVjeCIsJkRXUCgwLCJlZHgiKSk7CisJJm1vdgkoImVieCIsJkRXUCg0LCJlZHgiKSk7CisJJnRlc3QJKCJlY3giLDE8PDIwKTsJCSMgY2hlY2sgZm9yIFA0CisJJmpuegkoJmxhYmVsKCJsb29wIikpOworCSZhbmQJKCJlY3giLDE8PDMwKTsJCSMgbWFzayAiSW50ZWwgQ1BVIiBiaXQKKwkmYW5kCSgiZWJ4IiwxPDwyOHwxPDw5KTsJIyBtYXNrIEFWWCBhbmQgU1NTRTMgYml0cworCSZvcgkoImVjeCIsImVieCIpOworCSZhbmQJKCJlY3giLDE8PDI4fDE8PDMwKTsKKwkmY21wCSgiZWN4IiwxPDwyOHwxPDwzMCk7CisJCQkJCWlmICgkeG1tKSB7CisJJmplCSgmbGFiZWwoIkFWWCIpKQkJaWYgKCRhdngpOworCSZ0ZXN0CSgiZWJ4IiwxPDw5KTsJCSMgY2hlY2sgZm9yIFNTU0UzCisJJmpuegkoJmxhYmVsKCJTU1NFMyIpKTsKKwkJCQkJfSBlbHNlIHsKKwkmamUJKCZsYWJlbCgibG9vcF9zaHJkIikpOworCQkJCQl9CisJCQkJCQlpZiAoJHVucm9sbF9hZnRlcikgeworCSZzdWIJKCJlYXgiLCJlZGkiKTsKKwkmY21wCSgiZWF4IiwkdW5yb2xsX2FmdGVyKTsKKwkmamFlCSgmbGFiZWwoInVucm9sbGVkIikpOworCQkJCQkJfSB9CisJJmptcAkoJmxhYmVsKCJsb29wIikpOworCitzdWIgQ09NUEFDVF9MT09QKCkgeworbXkgJHN1ZmZpeD1zaGlmdDsKKworJnNldF9sYWJlbCgibG9vcCRzdWZmaXgiLCRzdWZmaXg/MzI6MTYpOworICAgICMgY29weSBpbnB1dCBibG9jayB0byBzdGFjayByZXZlcnNpbmcgYnl0ZSBhbmQgZHdvcmQgb3JkZXIKKyAgICBmb3IoJGk9MDskaTw0OyRpKyspIHsKKwkmbW92CSgiZWF4IiwmRFdQKCRpKjE2KzAsImVkaSIpKTsKKwkmbW92CSgiZWJ4IiwmRFdQKCRpKjE2KzQsImVkaSIpKTsKKwkmbW92CSgiZWN4IiwmRFdQKCRpKjE2KzgsImVkaSIpKTsKKwkmYnN3YXAJKCJlYXgiKTsKKwkmbW92CSgiZWR4IiwmRFdQKCRpKjE2KzEyLCJlZGkiKSk7CisJJmJzd2FwCSgiZWJ4Iik7CisJJnB1c2gJKCJlYXgiKTsKKwkmYnN3YXAJKCJlY3giKTsKKwkmcHVzaAkoImVieCIpOworCSZic3dhcAkoImVkeCIpOworCSZwdXNoCSgiZWN4Iik7CisJJnB1c2gJKCJlZHgiKTsKKyAgICB9CisJJmFkZAkoImVkaSIsNjQpOworCSZsZWEJKCJlc3AiLCZEV1AoLTQqOSwiZXNwIikpOyMgcGxhY2UgZm9yIEEsQixDLEQsRSxGLEcsSAorCSZtb3YJKCZEV1AoNCooOSsxNikrNCwiZXNwIiksImVkaSIpOworCisJIyBjb3B5IGN0eC0+aFswLTddIHRvIEEsQixDLEQsRSxGLEcsSCBvbiBzdGFjaworCSZtb3YJKCRBLCZEV1AoMCwiZXNpIikpOworCSZtb3YJKCJlYngiLCZEV1AoNCwiZXNpIikpOworCSZtb3YJKCJlY3giLCZEV1AoOCwiZXNpIikpOworCSZtb3YJKCJlZGkiLCZEV1AoMTIsImVzaSIpKTsKKwkjICZtb3YJKCRBb2ZmLCRBKTsKKwkmbW92CSgkQm9mZiwiZWJ4Iik7CisJJnhvcgkoImVieCIsImVjeCIpOworCSZtb3YJKCRDb2ZmLCJlY3giKTsKKwkmbW92CSgkRG9mZiwiZWRpIik7CisJJm1vdgkoJkRXUCgwLCJlc3AiKSwiZWJ4Iik7CSMgbWFnaWMKKwkmbW92CSgkRSwmRFdQKDE2LCJlc2kiKSk7CQorCSZtb3YJKCJlYngiLCZEV1AoMjAsImVzaSIpKTsKKwkmbW92CSgiZWN4IiwmRFdQKDI0LCJlc2kiKSk7CisJJm1vdgkoImVkaSIsJkRXUCgyOCwiZXNpIikpOworCSMgJm1vdgkoJEVvZmYsJEUpOworCSZtb3YJKCRGb2ZmLCJlYngiKTsKKwkmbW92CSgkR29mZiwiZWN4Iik7CisJJm1vdgkoJEhvZmYsImVkaSIpOworCismc2V0X2xhYmVsKCIwMF8xNSRzdWZmaXgiLDE2KTsKKworCSZCT0RZXzAwXzE1KCk7CisKKwkmY21wCSgiZXNpIiwweGMxOWJmMTc0KTsKKwkmam5lCSgmbGFiZWwoIjAwXzE1JHN1ZmZpeCIpKTsKKworCSZtb3YJKCJlY3giLCZEV1AoNCooOSsxNSsxNi0xKSwiZXNwIikpOwkjIHByZWxvYWRlZCBpbiBCT0RZXzAwXzE1KDEpCisJJmptcAkoJmxhYmVsKCIxNl82MyRzdWZmaXgiKSk7CisKKyZzZXRfbGFiZWwoIjE2XzYzJHN1ZmZpeCIsMTYpOworCisJJkJPRFlfMTZfNjMoKTsKKworCSZjbXAJKCJlc2kiLDB4YzY3MTc4ZjIpOworCSZqbmUJKCZsYWJlbCgiMTZfNjMkc3VmZml4IikpOworCisJJm1vdgkoImVzaSIsJkRXUCg0Kig5KzE2KzY0KSswLCJlc3AiKSk7I2N0eAorCSMgJm1vdgkoJEEsJEFvZmYpOworCSZtb3YJKCJlYngiLCRCb2ZmKTsKKwkjICZtb3YJKCJlZGkiLCRDb2ZmKTsKKwkmbW92CSgiZWN4IiwkRG9mZik7CisJJmFkZAkoJEEsJkRXUCgwLCJlc2kiKSk7CisJJmFkZAkoImVieCIsJkRXUCg0LCJlc2kiKSk7CisJJmFkZAkoImVkaSIsJkRXUCg4LCJlc2kiKSk7CisJJmFkZAkoImVjeCIsJkRXUCgxMiwiZXNpIikpOworCSZtb3YJKCZEV1AoMCwiZXNpIiksJEEpOworCSZtb3YJKCZEV1AoNCwiZXNpIiksImVieCIpOworCSZtb3YJKCZEV1AoOCwiZXNpIiksImVkaSIpOworCSZtb3YJKCZEV1AoMTIsImVzaSIpLCJlY3giKTsKKwkjICZtb3YJKCRFLCRFb2ZmKTsKKwkmbW92CSgiZWF4IiwkRm9mZik7CisJJm1vdgkoImVieCIsJEdvZmYpOworCSZtb3YJKCJlY3giLCRIb2ZmKTsKKwkmbW92CSgiZWRpIiwmRFdQKDQqKDkrMTYrNjQpKzQsImVzcCIpKTsjaW5wCisJJmFkZAkoJEUsJkRXUCgxNiwiZXNpIikpOworCSZhZGQJKCJlYXgiLCZEV1AoMjAsImVzaSIpKTsKKwkmYWRkCSgiZWJ4IiwmRFdQKDI0LCJlc2kiKSk7CisJJmFkZAkoImVjeCIsJkRXUCgyOCwiZXNpIikpOworCSZtb3YJKCZEV1AoMTYsImVzaSIpLCRFKTsKKwkmbW92CSgmRFdQKDIwLCJlc2kiKSwiZWF4Iik7CisJJm1vdgkoJkRXUCgyNCwiZXNpIiksImVieCIpOworCSZtb3YJKCZEV1AoMjgsImVzaSIpLCJlY3giKTsKKworCSZsZWEJKCJlc3AiLCZEV1AoNCooOSsxNis2NCksImVzcCIpKTsjIGRlc3Ryb3kgZnJhbWUKKwkmc3ViCSgkSzI1Niw0KjY0KTsJCQkjIHJld2luZCBLCisKKwkmY21wCSgiZWRpIiwmRFdQKDgsImVzcCIpKTsJCSMgYXJlIHdlIGRvbmUgeWV0PworCSZqYgkoJmxhYmVsKCJsb29wJHN1ZmZpeCIpKTsKK30KKwkmQ09NUEFDVF9MT09QKCk7CisJJm1vdgkoImVzcCIsJkRXUCgxMiwiZXNwIikpOwkJIyByZXN0b3JlIHNwCismZnVuY3Rpb25fZW5kX0EoKTsKKwkJCQkJCWlmICghJGkzODYgJiYgISR4bW0pIHsKKwkjIH4yMCUgaW1wcm92ZW1lbnQgb24gU2FuZHkgQnJpZGdlCisJbG9jYWwgKnJvciA9IHN1YiB7ICZzaHJkKEBfWzBdLEBfKSB9OworCSZDT01QQUNUX0xPT1AoIl9zaHJkIik7CisJJm1vdgkoImVzcCIsJkRXUCgxMiwiZXNwIikpOwkJIyByZXN0b3JlIHNwCismZnVuY3Rpb25fZW5kX0EoKTsKKwkJCQkJCX0KKworJnNldF9sYWJlbCgiSzI1NiIsNjQpOwkjIFllcyEgSSBrZWVwIGl0IGluIHRoZSBjb2RlIHNlZ21lbnQhCitASzI1Nj0oCTB4NDI4YTJmOTgsMHg3MTM3NDQ5MSwweGI1YzBmYmNmLDB4ZTliNWRiYTUsCisJMHgzOTU2YzI1YiwweDU5ZjExMWYxLDB4OTIzZjgyYTQsMHhhYjFjNWVkNSwKKwkweGQ4MDdhYTk4LDB4MTI4MzViMDEsMHgyNDMxODViZSwweDU1MGM3ZGMzLAorCTB4NzJiZTVkNzQsMHg4MGRlYjFmZSwweDliZGMwNmE3LDB4YzE5YmYxNzQsCisJMHhlNDliNjljMSwweGVmYmU0Nzg2LDB4MGZjMTlkYzYsMHgyNDBjYTFjYywKKwkweDJkZTkyYzZmLDB4NGE3NDg0YWEsMHg1Y2IwYTlkYywweDc2Zjk4OGRhLAorCTB4OTgzZTUxNTIsMHhhODMxYzY2ZCwweGIwMDMyN2M4LDB4YmY1OTdmYzcsCisJMHhjNmUwMGJmMywweGQ1YTc5MTQ3LDB4MDZjYTYzNTEsMHgxNDI5Mjk2NywKKwkweDI3YjcwYTg1LDB4MmUxYjIxMzgsMHg0ZDJjNmRmYywweDUzMzgwZDEzLAorCTB4NjUwYTczNTQsMHg3NjZhMGFiYiwweDgxYzJjOTJlLDB4OTI3MjJjODUsCisJMHhhMmJmZThhMSwweGE4MWE2NjRiLDB4YzI0YjhiNzAsMHhjNzZjNTFhMywKKwkweGQxOTJlODE5LDB4ZDY5OTA2MjQsMHhmNDBlMzU4NSwweDEwNmFhMDcwLAorCTB4MTlhNGMxMTYsMHgxZTM3NmMwOCwweDI3NDg3NzRjLDB4MzRiMGJjYjUsCisJMHgzOTFjMGNiMywweDRlZDhhYTRhLDB4NWI5Y2NhNGYsMHg2ODJlNmZmMywKKwkweDc0OGY4MmVlLDB4NzhhNTYzNmYsMHg4NGM4NzgxNCwweDhjYzcwMjA4LAorCTB4OTBiZWZmZmEsMHhhNDUwNmNlYiwweGJlZjlhM2Y3LDB4YzY3MTc4ZjIJKTsKKyZkYXRhX3dvcmQoQEsyNTYpOworJmRhdGFfd29yZCgweDAwMDEwMjAzLDB4MDQwNTA2MDcsMHgwODA5MGEwYiwweDBjMGQwZTBmKTsJIyBieXRlIHN3YXAgbWFzaworJmFzY2l6KCJTSEEyNTYgYmxvY2sgdHJhbnNmb3JtIGZvciB4ODYsIENSWVBUT0dBTVMgYnkgPGFwcHJvXEBvcGVuc3NsLm9yZz4iKTsKKworKCRhLCRiLCRjLCRkLCRlLCRmLCRnLCRoKT0oMC4uNyk7CSMgb2Zmc2V0cworc3ViIG9mZiB7ICZEV1AoNCooKChzaGlmdCktJGkpJjcpLCJlc3AiKTsgfQorCitpZiAoISRpMzg2ICYmICR1bnJvbGxfYWZ0ZXIpIHsKK215IEBBSD0oJEEsJEsyNTYpOworCismc2V0X2xhYmVsKCJ1bnJvbGxlZCIsMTYpOworCSZsZWEJKCJlc3AiLCZEV1AoLTk2LCJlc3AiKSk7CisJIyBjb3B5IGN0eC0+aFswLTddIHRvIEEsQixDLEQsRSxGLEcsSCBvbiBzdGFjaworCSZtb3YJKCRBSFswXSwmRFdQKDAsImVzaSIpKTsKKwkmbW92CSgkQUhbMV0sJkRXUCg0LCJlc2kiKSk7CisJJm1vdgkoImVjeCIsJkRXUCg4LCJlc2kiKSk7CisJJm1vdgkoImVieCIsJkRXUCgxMiwiZXNpIikpOworCSMmbW92CSgmRFdQKDAsImVzcCIpLCRBSFswXSk7CisJJm1vdgkoJkRXUCg0LCJlc3AiKSwkQUhbMV0pOworCSZ4b3IJKCRBSFsxXSwiZWN4Iik7CQkjIG1hZ2ljCisJJm1vdgkoJkRXUCg4LCJlc3AiKSwiZWN4Iik7CisJJm1vdgkoJkRXUCgxMiwiZXNwIiksImVieCIpOworCSZtb3YJKCRFLCZEV1AoMTYsImVzaSIpKTsJCisJJm1vdgkoImVieCIsJkRXUCgyMCwiZXNpIikpOworCSZtb3YJKCJlY3giLCZEV1AoMjQsImVzaSIpKTsKKwkmbW92CSgiZXNpIiwmRFdQKDI4LCJlc2kiKSk7CisJIyZtb3YJKCZEV1AoMTYsImVzcCIpLCRFKTsKKwkmbW92CSgmRFdQKDIwLCJlc3AiKSwiZWJ4Iik7CisJJm1vdgkoJkRXUCgyNCwiZXNwIiksImVjeCIpOworCSZtb3YJKCZEV1AoMjgsImVzcCIpLCJlc2kiKTsKKwkmam1wCSgmbGFiZWwoImdyYW5kX2xvb3AiKSk7CisKKyZzZXRfbGFiZWwoImdyYW5kX2xvb3AiLDE2KTsKKyAgICAjIGNvcHkgaW5wdXQgYmxvY2sgdG8gc3RhY2sgcmV2ZXJzaW5nIGJ5dGUgb3JkZXIKKyAgICBmb3IoJGk9MDskaTw1OyRpKyspIHsKKwkmbW92CSgiZWJ4IiwmRFdQKDEyKiRpKzAsImVkaSIpKTsKKwkmbW92CSgiZWN4IiwmRFdQKDEyKiRpKzQsImVkaSIpKTsKKwkmYnN3YXAJKCJlYngiKTsKKwkmbW92CSgiZXNpIiwmRFdQKDEyKiRpKzgsImVkaSIpKTsKKwkmYnN3YXAJKCJlY3giKTsKKwkmbW92CSgmRFdQKDMyKzEyKiRpKzAsImVzcCIpLCJlYngiKTsKKwkmYnN3YXAJKCJlc2kiKTsKKwkmbW92CSgmRFdQKDMyKzEyKiRpKzQsImVzcCIpLCJlY3giKTsKKwkmbW92CSgmRFdQKDMyKzEyKiRpKzgsImVzcCIpLCJlc2kiKTsKKyAgICB9CisJJm1vdgkoImVieCIsJkRXUCgkaSoxMiwiZWRpIikpOworCSZhZGQJKCJlZGkiLDY0KTsKKwkmYnN3YXAJKCJlYngiKTsKKwkmbW92CSgmRFdQKDk2KzQsImVzcCIpLCJlZGkiKTsKKwkmbW92CSgmRFdQKDMyKzEyKiRpLCJlc3AiKSwiZWJ4Iik7CisKKyAgICBteSAoJHQxLCR0MikgPSAoImVjeCIsImVzaSIpOworCisgICAgZm9yICgkaT0wOyRpPDY0OyRpKyspIHsKKworICAgICAgaWYgKCRpPj0xNikgeworCSZtb3YJKCRULCR0MSk7CQkJIyAkdDEgaXMgcHJlbG9hZGVkCisJIyAmbW92CSgkdDIsJkRXUCgzMis0KigoJGkrMTQpJjE1KSwiZXNwIikpOworCSZyb3IJKCR0MSwxOC03KTsKKwkgJm1vdgkoImVkaSIsJHQyKTsKKwkmcm9yCSgkdDIsMTktMTcpOworCSAmeG9yCSgkdDEsJFQpOworCSAmc2hyCSgkVCwzKTsKKwkmcm9yCSgkdDEsNyk7CisJICZ4b3IJKCR0MiwiZWRpIik7CisJICZ4b3IJKCRULCR0MSk7CQkJIyBUID0gc2lnbWEwKFhbLTE1XSkKKwkmcm9yCSgkdDIsMTcpOworCSAmYWRkCSgkVCwmRFdQKDMyKzQqKCRpJjE1KSwiZXNwIikpOwkjIFQgKz0gWFstMTZdCisJJnNocgkoImVkaSIsMTApOworCSAmYWRkCSgkVCwmRFdQKDMyKzQqKCgkaSs5KSYxNSksImVzcCIpKTsJIyBUICs9IFhbLTddCisJIyZ4b3IJKCJlZGkiLCR0MikJCQkjIHNpZ21hMShYWy0yXSkKKwkjICZhZGQJKCRULCJlZGkiKTsJCQkjIFQgKz0gc2lnbWExKFhbLTJdKQorCSMgJm1vdgkoJkRXUCg0Kig5KzE1KSwiZXNwIiksJFQpOwkjIHNhdmUgWFswXQorICAgICAgfQorCSZtb3YJKCR0MSwkRSk7CisJICZ4b3IJKCJlZGkiLCR0MikJCQlpZiAoJGk+PTE2KTsJIyBzaWdtYTEoWFstMl0pCisJICZtb3YJKCR0Miwmb2ZmKCRmKSk7CisJJnJvcgkoJEUsMjUtMTEpOworCSAmYWRkCSgkVCwiZWRpIikJCQlpZiAoJGk+PTE2KTsJIyBUICs9IHNpZ21hMShYWy0yXSkKKwkgJm1vdgkoImVkaSIsJm9mZigkZykpOworCSZ4b3IJKCRFLCR0MSk7CisJICZtb3YJKCRULCZEV1AoMzIrNCooJGkmMTUpLCJlc3AiKSkJaWYgKCRpPDE2KTsJIyBYW2ldCisJICZtb3YJKCZEV1AoMzIrNCooJGkmMTUpLCJlc3AiKSwkVCkJaWYgKCRpPj0xNiAmJiAkaTw2Mik7CSMgc2F2ZSBYWzBdCisJICZ4b3IJKCR0MiwiZWRpIik7CisJJnJvcgkoJEUsMTEtNik7CisJICZhbmQJKCR0MiwkdDEpOworCSAmbW92CSgmb2ZmKCRlKSwkdDEpOwkJIyBzYXZlICRFLCBtb2R1bG8tc2NoZWR1bGVkCisJJnhvcgkoJEUsJHQxKTsKKwkgJmFkZAkoJFQsJm9mZigkaCkpOwkJIyBUICs9IGgKKwkgJnhvcgkoImVkaSIsJHQyKTsJCSMgQ2goZSxmLGcpCisJJnJvcgkoJEUsNik7CQkJIyBTaWdtYTEoZSkKKwkgJm1vdgkoJHQxLCRBSFswXSk7CisJICZhZGQJKCRULCJlZGkiKTsJCSMgVCArPSBDaChlLGYsZykKKworCSZyb3IJKCR0MSwyMi0xMyk7CisJICZtb3YJKCR0MiwkQUhbMF0pOworCSAmbW92CSgiZWRpIiwmb2ZmKCRiKSk7CisJJnhvcgkoJHQxLCRBSFswXSk7CisJICZtb3YJKCZvZmYoJGEpLCRBSFswXSk7CSMgc2F2ZSAkQSwgbW9kdWxvLXNjaGVkdWxlZAorCSAmeG9yCSgkQUhbMF0sImVkaSIpOwkJIyBhIF49IGIsIChiXmMpIGluIG5leHQgcm91bmQKKwkmcm9yCSgkdDEsMTMtMik7CisJICZhbmQJKCRBSFsxXSwkQUhbMF0pOwkjIChiXmMpICY9IChhXmIpCisJICZsZWEJKCRFLCZEV1AoQEsyNTZbJGldLCRULCRFKSk7CSMgVCArPSBTaWdtYTEoMSkrS1tpXQorCSZ4b3IJKCR0MSwkdDIpOworCSAmeG9yCSgkQUhbMV0sImVkaSIpOwkJIyBoID0gTWFqKGEsYixjKSA9IENoKGFeYixjLGIpCisJICZtb3YJKCR0MiwmRFdQKDMyKzQqKCgkaSsyKSYxNSksImVzcCIpKQlpZiAoJGk+PTE1ICYmICRpPDYzKTsKKwkmcm9yCSgkdDEsMik7CQkjIFNpZ21hMChhKQorCisJICZhZGQJKCRBSFsxXSwkRSk7CQkjIGggKz0gVAorCSAmYWRkCSgkRSwmb2ZmKCRkKSk7CQkjIGQgKz0gVAorCSZhZGQJKCRBSFsxXSwkdDEpOwkJIyBoICs9IFNpZ21hMChhKQorCSAmbW92CSgkdDEsJkRXUCgzMis0KigoJGkrMTUpJjE1KSwiZXNwIikpCWlmICgkaT49MTUgJiYgJGk8NjMpOworCisJQEFIID0gcmV2ZXJzZShAQUgpOwkJIyByb3RhdGUoYSxoKQorCSgkdDEsJHQyKSA9ICgkdDIsJHQxKTsJCSMgcm90YXRlKHQxLHQyKQorICAgIH0KKwkmbW92CSgiZXNpIiwmRFdQKDk2LCJlc3AiKSk7CSNjdHgKKwkJCQkJIyZtb3YJKCRBSFswXSwmRFdQKDAsImVzcCIpKTsKKwkmeG9yCSgkQUhbMV0sImVkaSIpOwkJIyZtb3YJKCRBSFsxXSwmRFdQKDQsImVzcCIpKTsKKwkJCQkJIyZtb3YJKCJlZGkiLCAmRFdQKDgsImVzcCIpKTsKKwkmbW92CSgiZWN4IiwmRFdQKDEyLCJlc3AiKSk7CisJJmFkZAkoJEFIWzBdLCZEV1AoMCwiZXNpIikpOworCSZhZGQJKCRBSFsxXSwmRFdQKDQsImVzaSIpKTsKKwkmYWRkCSgiZWRpIiwmRFdQKDgsImVzaSIpKTsKKwkmYWRkCSgiZWN4IiwmRFdQKDEyLCJlc2kiKSk7CisJJm1vdgkoJkRXUCgwLCJlc2kiKSwkQUhbMF0pOworCSZtb3YJKCZEV1AoNCwiZXNpIiksJEFIWzFdKTsKKwkmbW92CSgmRFdQKDgsImVzaSIpLCJlZGkiKTsKKwkmbW92CSgmRFdQKDEyLCJlc2kiKSwiZWN4Iik7CisJICMmbW92CSgmRFdQKDAsImVzcCIpLCRBSFswXSk7CisJICZtb3YJKCZEV1AoNCwiZXNwIiksJEFIWzFdKTsKKwkgJnhvcgkoJEFIWzFdLCJlZGkiKTsJCSMgbWFnaWMKKwkgJm1vdgkoJkRXUCg4LCJlc3AiKSwiZWRpIik7CisJICZtb3YJKCZEV1AoMTIsImVzcCIpLCJlY3giKTsKKwkjJm1vdgkoJEUsJkRXUCgxNiwiZXNwIikpOworCSZtb3YJKCJlZGkiLCZEV1AoMjAsImVzcCIpKTsKKwkmbW92CSgiZWJ4IiwmRFdQKDI0LCJlc3AiKSk7CisJJm1vdgkoImVjeCIsJkRXUCgyOCwiZXNwIikpOworCSZhZGQJKCRFLCZEV1AoMTYsImVzaSIpKTsKKwkmYWRkCSgiZWRpIiwmRFdQKDIwLCJlc2kiKSk7CisJJmFkZAkoImVieCIsJkRXUCgyNCwiZXNpIikpOworCSZhZGQJKCJlY3giLCZEV1AoMjgsImVzaSIpKTsKKwkmbW92CSgmRFdQKDE2LCJlc2kiKSwkRSk7CisJJm1vdgkoJkRXUCgyMCwiZXNpIiksImVkaSIpOworCSZtb3YJKCZEV1AoMjQsImVzaSIpLCJlYngiKTsKKwkmbW92CSgmRFdQKDI4LCJlc2kiKSwiZWN4Iik7CisJICMmbW92CSgmRFdQKDE2LCJlc3AiKSwkRSk7CisJICZtb3YJKCZEV1AoMjAsImVzcCIpLCJlZGkiKTsKKwkmbW92CSgiZWRpIiwmRFdQKDk2KzQsImVzcCIpKTsJIyBpbnAKKwkgJm1vdgkoJkRXUCgyNCwiZXNwIiksImVieCIpOworCSAmbW92CSgmRFdQKDI4LCJlc3AiKSwiZWN4Iik7CisKKwkmY21wCSgiZWRpIiwmRFdQKDk2KzgsImVzcCIpKTsJIyBhcmUgd2UgZG9uZSB5ZXQ/CisJJmpiCSgmbGFiZWwoImdyYW5kX2xvb3AiKSk7CisKKwkmbW92CSgiZXNwIiwmRFdQKDk2KzEyLCJlc3AiKSk7CSMgcmVzdG9yZSBzcAorJmZ1bmN0aW9uX2VuZF9BKCk7Cit9CisJCQkJCQlpZiAoISRpMzg2ICYmICR4bW0pIHt7eworbXkgQFggPSBtYXAoInhtbSRfIiwoMC4uMykpOworbXkgKCR0MCwkdDEsJHQyLCR0MykgPSBtYXAoInhtbSRfIiwoNC4uNykpOworbXkgQEFIID0gKCRBLCRUKTsKKworJnNldF9sYWJlbCgiU1NTRTMiLDMyKTsKKwkmbGVhCSgiZXNwIiwmRFdQKC05NiwiZXNwIikpOworCSMgY29weSBjdHgtPmhbMC03XSB0byBBLEIsQyxELEUsRixHLEggb24gc3RhY2sKKwkmbW92CSgkQUhbMF0sJkRXUCgwLCJlc2kiKSk7CisJJm1vdgkoJEFIWzFdLCZEV1AoNCwiZXNpIikpOworCSZtb3YJKCJlY3giLCZEV1AoOCwiZXNpIikpOworCSZtb3YJKCJlZGkiLCZEV1AoMTIsImVzaSIpKTsKKwkjJm1vdgkoJkRXUCgwLCJlc3AiKSwkQUhbMF0pOworCSZtb3YJKCZEV1AoNCwiZXNwIiksJEFIWzFdKTsKKwkmeG9yCSgkQUhbMV0sImVjeCIpOwkJCSMgbWFnaWMKKwkmbW92CSgmRFdQKDgsImVzcCIpLCJlY3giKTsKKwkmbW92CSgmRFdQKDEyLCJlc3AiKSwiZWRpIik7CisJJm1vdgkoJEUsJkRXUCgxNiwiZXNpIikpOworCSZtb3YJKCJlZGkiLCZEV1AoMjAsImVzaSIpKTsKKwkmbW92CSgiZWN4IiwmRFdQKDI0LCJlc2kiKSk7CisJJm1vdgkoImVzaSIsJkRXUCgyOCwiZXNpIikpOworCSMmbW92CSgmRFdQKDE2LCJlc3AiKSwkRSk7CisJJm1vdgkoJkRXUCgyMCwiZXNwIiksImVkaSIpOworCSZtb3YJKCJlZGkiLCZEV1AoOTYrNCwiZXNwIikpOwkjIGlucAorCSZtb3YJKCZEV1AoMjQsImVzcCIpLCJlY3giKTsKKwkmbW92CSgmRFdQKDI4LCJlc3AiKSwiZXNpIik7CisJJm1vdmRxYQkoJHQzLCZRV1AoMjU2LCRLMjU2KSk7CisJJmptcAkoJmxhYmVsKCJncmFuZF9zc3NlMyIpKTsKKworJnNldF9sYWJlbCgiZ3JhbmRfc3NzZTMiLDE2KTsKKwkjIGxvYWQgaW5wdXQsIHJldmVyc2UgYnl0ZSBvcmRlciwgYWRkIEsyNTZbMC4uMTVdLCBzYXZlIHRvIHN0YWNrCisJJm1vdmRxdQkoQFhbMF0sJlFXUCgwLCJlZGkiKSk7CisJJm1vdmRxdQkoQFhbMV0sJlFXUCgxNiwiZWRpIikpOworCSZtb3ZkcXUJKEBYWzJdLCZRV1AoMzIsImVkaSIpKTsKKwkmbW92ZHF1CShAWFszXSwmUVdQKDQ4LCJlZGkiKSk7CisJJmFkZAkoImVkaSIsNjQpOworCSZwc2h1ZmIJKEBYWzBdLCR0Myk7CisJJm1vdgkoJkRXUCg5Nis0LCJlc3AiKSwiZWRpIik7CisJJnBzaHVmYgkoQFhbMV0sJHQzKTsKKwkmbW92ZHFhCSgkdDAsJlFXUCgwLCRLMjU2KSk7CisJJnBzaHVmYgkoQFhbMl0sJHQzKTsKKwkmbW92ZHFhCSgkdDEsJlFXUCgxNiwkSzI1NikpOworCSZwYWRkZAkoJHQwLEBYWzBdKTsKKwkmcHNodWZiCShAWFszXSwkdDMpOworCSZtb3ZkcWEJKCR0MiwmUVdQKDMyLCRLMjU2KSk7CisJJnBhZGRkCSgkdDEsQFhbMV0pOworCSZtb3ZkcWEJKCR0MywmUVdQKDQ4LCRLMjU2KSk7CisJJm1vdmRxYQkoJlFXUCgzMiswLCJlc3AiKSwkdDApOworCSZwYWRkZAkoJHQyLEBYWzJdKTsKKwkmbW92ZHFhCSgmUVdQKDMyKzE2LCJlc3AiKSwkdDEpOworCSZwYWRkZAkoJHQzLEBYWzNdKTsKKwkmbW92ZHFhCSgmUVdQKDMyKzMyLCJlc3AiKSwkdDIpOworCSZtb3ZkcWEJKCZRV1AoMzIrNDgsImVzcCIpLCR0Myk7CisJJmptcAkoJmxhYmVsKCJzc3NlM18wMF80NyIpKTsKKworJnNldF9sYWJlbCgic3NzZTNfMDBfNDciLDE2KTsKKwkmYWRkCQkoJEsyNTYsNjQpOworCitzdWIgU1NTRTNfMDBfNDcgKCkgeworbXkgJGogPSBzaGlmdDsKK215ICRib2R5ID0gc2hpZnQ7CitteSBAWCA9IEBfOworbXkgQGluc25zID0gKCYkYm9keSwmJGJvZHksJiRib2R5LCYkYm9keSk7CSMgMTIwIGluc3RydWN0aW9ucworCisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSZtb3ZkcWEJCSgkdDAsQFhbMV0pOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsJCQkjIEAKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJm1vdmRxYQkJKCR0MyxAWFszXSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmcGFsaWducgkoJHQwLEBYWzBdLDQpOwkJIyBYWzEuLjRdCisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsJCQkjIEAKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICZwYWxpZ25yCSgkdDMsQFhbMl0sNCk7CQkjIFhbOS4uMTJdCisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJm1vdmRxYQkJKCR0MSwkdDApOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsJCQkjIEAKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJm1vdmRxYQkJKCR0MiwkdDApOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJnBzcmxkCQkoJHQwLDMpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CQkJIyBACisJICZwYWRkZAkJKEBYWzBdLCR0Myk7CQkjIFhbMC4uM10gKz0gWFs5Li4xMl0KKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSZwc3JsZAkJKCR0Miw3KTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsJCQkjIEAKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICZwc2h1ZmQJKCR0MyxAWFszXSwwYjExMTExMDEwKTsJIyBYWzE0Li4xNV0KKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSZwc2xsZAkJKCR0MSwzMi0xOCk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsJCQkjIEAKKwkmcHhvcgkJKCR0MCwkdDIpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJnBzcmxkCQkoJHQyLDE4LTcpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOwkJCSMgQAorCSZweG9yCQkoJHQwLCR0MSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmcHNsbGQJCSgkdDEsMTgtNyk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CQkJIyBACisJJnB4b3IJCSgkdDAsJHQyKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAmbW92ZHFhCSgkdDIsJHQzKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsJCQkjIEAKKwkmcHhvcgkJKCR0MCwkdDEpOwkJIyBzaWdtYTAoWFsxLi40XSkKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAmcHNybGQJCSgkdDMsMTApOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOwkJCSMgQAorCSZwYWRkZAkJKEBYWzBdLCR0MCk7CQkjIFhbMC4uM10gKz0gc2lnbWEwKFhbMS4uNF0pCisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgJnBzcmxxCQkoJHQyLDE3KTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsJCQkjIEAKKwkgJnB4b3IJCSgkdDMsJHQyKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAmcHNybHEJCSgkdDIsMTktMTcpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOwkJCSMgQAorCSAmcHhvcgkJKCR0MywkdDIpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICZwc2h1ZmQJKCR0MywkdDMsMGIxMDAwMDAwMCk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CQkJIyBACisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsJCQkjIEAKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICZwc3JsZHEJKCR0Myw4KTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmcGFkZGQJCShAWFswXSwkdDMpOwkJIyBYWzAuLjFdICs9IHNpZ21hMShYWzE0Li4xNV0pCisJICBldmFsKHNoaWZ0KEBpbnNucykpOwkJCSMgQAorCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CQkJIyBACisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAmcHNodWZkCSgkdDMsQFhbMF0sMGIwMTAxMDAwMCk7CSMgWFsxNi4uMTddCisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICZtb3ZkcWEJKCR0MiwkdDMpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsJCQkjIEAKKwkgJnBzcmxkCQkoJHQzLDEwKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICZwc3JscQkJKCR0MiwxNyk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOwkJCSMgQAorCSAmcHhvcgkJKCR0MywkdDIpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICZwc3JscQkJKCR0MiwxOS0xNyk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CQkJIyBACisJICZweG9yCQkoJHQzLCR0Mik7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICZwc2h1ZmQJKCR0MywkdDMsMGIwMDAwMTAwMCk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsJCQkjIEAKKwkmbW92ZHFhCQkoJHQyLCZRV1AoMTYqJGosJEsyNTYpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAmcHNsbGRxCSgkdDMsOCk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CQkJIyBACisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsJCQkjIEAKKwkmcGFkZGQJCShAWFswXSwkdDMpOwkJIyBYWzIuLjNdICs9IHNpZ21hMShYWzE2Li4xN10pCisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSZwYWRkZAkJKCR0MixAWFswXSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOwkJCSMgQAorCisJZm9yZWFjaCAoQGluc25zKSB7IGV2YWw7IH0JCSMgcmVtYWluaW5nIGluc3RydWN0aW9ucworCisJJm1vdmRxYQkJKCZRV1AoMzIrMTYqJGosImVzcCIpLCR0Mik7Cit9CisKK3N1YiBib2R5XzAwXzE1ICgpIHsKKwkoCisJJyZtb3YJKCJlY3giLCRFKTsnLAorCScmcm9yCSgkRSwyNS0xMSk7JywKKwkgJyZtb3YJKCJlc2kiLCZvZmYoJGYpKTsnLAorCScmeG9yCSgkRSwiZWN4Iik7JywKKwkgJyZtb3YJKCJlZGkiLCZvZmYoJGcpKTsnLAorCSAnJnhvcgkoImVzaSIsImVkaSIpOycsCisJJyZyb3IJKCRFLDExLTYpOycsCisJICcmYW5kCSgiZXNpIiwiZWN4Iik7JywKKwkgJyZtb3YJKCZvZmYoJGUpLCJlY3giKTsnLAkjIHNhdmUgJEUsIG1vZHVsby1zY2hlZHVsZWQKKwknJnhvcgkoJEUsImVjeCIpOycsCisJICcmeG9yCSgiZWRpIiwiZXNpIik7JywJIyBDaChlLGYsZykKKwknJnJvcgkoJEUsNik7JywJCSMgVCA9IFNpZ21hMShlKQorCSAnJm1vdgkoImVjeCIsJEFIWzBdKTsnLAorCSAnJmFkZAkoJEUsImVkaSIpOycsCQkjIFQgKz0gQ2goZSxmLGcpCisJICcmbW92CSgiZWRpIiwmb2ZmKCRiKSk7JywKKwknJm1vdgkoImVzaSIsJEFIWzBdKTsnLAorCisJJyZyb3IJKCJlY3giLDIyLTEzKTsnLAorCSAnJm1vdgkoJm9mZigkYSksJEFIWzBdKTsnLAkjIHNhdmUgJEEsIG1vZHVsby1zY2hlZHVsZWQKKwknJnhvcgkoImVjeCIsJEFIWzBdKTsnLAorCSAnJnhvcgkoJEFIWzBdLCJlZGkiKTsnLAkjIGEgXj0gYiwgKGJeYykgaW4gbmV4dCByb3VuZAorCSAnJmFkZAkoJEUsJm9mZigkaCkpOycsCSMgVCArPSBoCisJJyZyb3IJKCJlY3giLDEzLTIpOycsCisJICcmYW5kCSgkQUhbMV0sJEFIWzBdKTsnLAkjIChiXmMpICY9IChhXmIpCisJJyZ4b3IJKCJlY3giLCJlc2kiKTsnLAorCSAnJmFkZAkoJEUsJkRXUCgzMis0KigkaSYxNSksImVzcCIpKTsnLAkjIFQgKz0gS1tpXStYW2ldCisJICcmeG9yCSgkQUhbMV0sImVkaSIpOycsCSMgaCA9IE1haihhLGIsYykgPSBDaChhXmIsYyxiKQorCScmcm9yCSgiZWN4IiwyKTsnLAkJIyBTaWdtYTAoYSkKKworCSAnJmFkZAkoJEFIWzFdLCRFKTsnLAkJIyBoICs9IFQKKwkgJyZhZGQJKCRFLCZvZmYoJGQpKTsnLAkjIGQgKz0gVAorCScmYWRkCSgkQUhbMV0sImVjeCIpOycuCSMgaCArPSBTaWdtYTAoYSkKKworCSdAQUggPSByZXZlcnNlKEBBSCk7ICRpKys7JwkjIHJvdGF0ZShhLGgpCisJKTsKK30KKworICAgIGZvciAoJGk9MCwkaj0wOyAkajw0OyAkaisrKSB7CisJJlNTU0UzXzAwXzQ3KCRqLFwmYm9keV8wMF8xNSxAWCk7CisJcHVzaChAWCxzaGlmdChAWCkpOwkJIyByb3RhdGUoQFgpCisgICAgfQorCSZjbXAJKCZEV1AoMTYqJGosJEsyNTYpLDB4MDAwMTAyMDMpOworCSZqbmUJKCZsYWJlbCgic3NzZTNfMDBfNDciKSk7CisKKyAgICBmb3IgKCRpPTA7ICRpPDE2OyApIHsKKwlmb3JlYWNoKGJvZHlfMDBfMTUoKSkgeyBldmFsOyB9CisgICAgfQorCisJJm1vdgkoImVzaSIsJkRXUCg5NiwiZXNwIikpOwkjY3R4CisJCQkJCSMmbW92CSgkQUhbMF0sJkRXUCgwLCJlc3AiKSk7CisJJnhvcgkoJEFIWzFdLCJlZGkiKTsJCSMmbW92CSgkQUhbMV0sJkRXUCg0LCJlc3AiKSk7CisJCQkJCSMmbW92CSgiZWRpIiwgJkRXUCg4LCJlc3AiKSk7CisJJm1vdgkoImVjeCIsJkRXUCgxMiwiZXNwIikpOworCSZhZGQJKCRBSFswXSwmRFdQKDAsImVzaSIpKTsKKwkmYWRkCSgkQUhbMV0sJkRXUCg0LCJlc2kiKSk7CisJJmFkZAkoImVkaSIsJkRXUCg4LCJlc2kiKSk7CisJJmFkZAkoImVjeCIsJkRXUCgxMiwiZXNpIikpOworCSZtb3YJKCZEV1AoMCwiZXNpIiksJEFIWzBdKTsKKwkmbW92CSgmRFdQKDQsImVzaSIpLCRBSFsxXSk7CisJJm1vdgkoJkRXUCg4LCJlc2kiKSwiZWRpIik7CisJJm1vdgkoJkRXUCgxMiwiZXNpIiksImVjeCIpOworCSAjJm1vdgkoJkRXUCgwLCJlc3AiKSwkQUhbMF0pOworCSAmbW92CSgmRFdQKDQsImVzcCIpLCRBSFsxXSk7CisJICZ4b3IJKCRBSFsxXSwiZWRpIik7CQkJIyBtYWdpYworCSAmbW92CSgmRFdQKDgsImVzcCIpLCJlZGkiKTsKKwkgJm1vdgkoJkRXUCgxMiwiZXNwIiksImVjeCIpOworCSMmbW92CSgkRSwmRFdQKDE2LCJlc3AiKSk7CisJJm1vdgkoImVkaSIsJkRXUCgyMCwiZXNwIikpOworCSZtb3YJKCJlY3giLCZEV1AoMjQsImVzcCIpKTsKKwkmYWRkCSgkRSwmRFdQKDE2LCJlc2kiKSk7CisJJmFkZAkoImVkaSIsJkRXUCgyMCwiZXNpIikpOworCSZhZGQJKCJlY3giLCZEV1AoMjQsImVzaSIpKTsKKwkmbW92CSgmRFdQKDE2LCJlc2kiKSwkRSk7CisJJm1vdgkoJkRXUCgyMCwiZXNpIiksImVkaSIpOworCSAmbW92CSgmRFdQKDIwLCJlc3AiKSwiZWRpIik7CisJJm1vdgkoImVkaSIsJkRXUCgyOCwiZXNwIikpOworCSZtb3YJKCZEV1AoMjQsImVzaSIpLCJlY3giKTsKKwkgIyZtb3YJKCZEV1AoMTYsImVzcCIpLCRFKTsKKwkmYWRkCSgiZWRpIiwmRFdQKDI4LCJlc2kiKSk7CisJICZtb3YJKCZEV1AoMjQsImVzcCIpLCJlY3giKTsKKwkmbW92CSgmRFdQKDI4LCJlc2kiKSwiZWRpIik7CisJICZtb3YJKCZEV1AoMjgsImVzcCIpLCJlZGkiKTsKKwkmbW92CSgiZWRpIiwmRFdQKDk2KzQsImVzcCIpKTsJIyBpbnAKKworCSZtb3ZkcWEJKCR0MywmUVdQKDY0LCRLMjU2KSk7CisJJnN1YgkoJEsyNTYsMyo2NCk7CQkJIyByZXdpbmQgSworCSZjbXAJKCJlZGkiLCZEV1AoOTYrOCwiZXNwIikpOwkjIGFyZSB3ZSBkb25lIHlldD8KKwkmamIJKCZsYWJlbCgiZ3JhbmRfc3NzZTMiKSk7CisKKwkmbW92CSgiZXNwIiwmRFdQKDk2KzEyLCJlc3AiKSk7CSMgcmVzdG9yZSBzcAorJmZ1bmN0aW9uX2VuZF9BKCk7CisJCQkJCQlpZiAoJGF2eCkgeworJnNldF9sYWJlbCgiQVZYIiwzMik7CisJCQkJCQlpZiAoJGF2eD4xKSB7CisJJm1vdgkoImVkeCIsJkRXUCg4LCJlZHgiKSk7CisJJmFuZAkoImVkeCIsMTw8OHwxPDwzKTsJCSMgY2hlY2sgZm9yIEJNSTIrQk1JMQorCSZjbXAJKCJlZHgiLDE8PDh8MTw8Myk7CisJJmplCSgmbGFiZWwoIkFWWF9CTUkiKSk7CisJCQkJCQl9CisJJmxlYQkoImVzcCIsJkRXUCgtOTYsImVzcCIpKTsKKwkmdnplcm9hbGwJKCk7CisJIyBjb3B5IGN0eC0+aFswLTddIHRvIEEsQixDLEQsRSxGLEcsSCBvbiBzdGFjaworCSZtb3YJKCRBSFswXSwmRFdQKDAsImVzaSIpKTsKKwkmbW92CSgkQUhbMV0sJkRXUCg0LCJlc2kiKSk7CisJJm1vdgkoImVjeCIsJkRXUCg4LCJlc2kiKSk7CisJJm1vdgkoImVkaSIsJkRXUCgxMiwiZXNpIikpOworCSMmbW92CSgmRFdQKDAsImVzcCIpLCRBSFswXSk7CisJJm1vdgkoJkRXUCg0LCJlc3AiKSwkQUhbMV0pOworCSZ4b3IJKCRBSFsxXSwiZWN4Iik7CQkJIyBtYWdpYworCSZtb3YJKCZEV1AoOCwiZXNwIiksImVjeCIpOworCSZtb3YJKCZEV1AoMTIsImVzcCIpLCJlZGkiKTsKKwkmbW92CSgkRSwmRFdQKDE2LCJlc2kiKSk7CisJJm1vdgkoImVkaSIsJkRXUCgyMCwiZXNpIikpOworCSZtb3YJKCJlY3giLCZEV1AoMjQsImVzaSIpKTsKKwkmbW92CSgiZXNpIiwmRFdQKDI4LCJlc2kiKSk7CisJIyZtb3YJKCZEV1AoMTYsImVzcCIpLCRFKTsKKwkmbW92CSgmRFdQKDIwLCJlc3AiKSwiZWRpIik7CisJJm1vdgkoImVkaSIsJkRXUCg5Nis0LCJlc3AiKSk7CSMgaW5wCisJJm1vdgkoJkRXUCgyNCwiZXNwIiksImVjeCIpOworCSZtb3YJKCZEV1AoMjgsImVzcCIpLCJlc2kiKTsKKwkmdm1vdmRxYQkoJHQzLCZRV1AoMjU2LCRLMjU2KSk7CisJJmptcAkoJmxhYmVsKCJncmFuZF9hdngiKSk7CisKKyZzZXRfbGFiZWwoImdyYW5kX2F2eCIsMzIpOworCSMgbG9hZCBpbnB1dCwgcmV2ZXJzZSBieXRlIG9yZGVyLCBhZGQgSzI1NlswLi4xNV0sIHNhdmUgdG8gc3RhY2sKKwkmdm1vdmRxdQkoQFhbMF0sJlFXUCgwLCJlZGkiKSk7CisJJnZtb3ZkcXUJKEBYWzFdLCZRV1AoMTYsImVkaSIpKTsKKwkmdm1vdmRxdQkoQFhbMl0sJlFXUCgzMiwiZWRpIikpOworCSZ2bW92ZHF1CShAWFszXSwmUVdQKDQ4LCJlZGkiKSk7CisJJmFkZAkJKCJlZGkiLDY0KTsKKwkmdnBzaHVmYgkoQFhbMF0sQFhbMF0sJHQzKTsKKwkmbW92CQkoJkRXUCg5Nis0LCJlc3AiKSwiZWRpIik7CisJJnZwc2h1ZmIJKEBYWzFdLEBYWzFdLCR0Myk7CisJJnZwc2h1ZmIJKEBYWzJdLEBYWzJdLCR0Myk7CisJJnZwYWRkZAkJKCR0MCxAWFswXSwmUVdQKDAsJEsyNTYpKTsKKwkmdnBzaHVmYgkoQFhbM10sQFhbM10sJHQzKTsKKwkmdnBhZGRkCQkoJHQxLEBYWzFdLCZRV1AoMTYsJEsyNTYpKTsKKwkmdnBhZGRkCQkoJHQyLEBYWzJdLCZRV1AoMzIsJEsyNTYpKTsKKwkmdnBhZGRkCQkoJHQzLEBYWzNdLCZRV1AoNDgsJEsyNTYpKTsKKwkmdm1vdmRxYQkoJlFXUCgzMiswLCJlc3AiKSwkdDApOworCSZ2bW92ZHFhCSgmUVdQKDMyKzE2LCJlc3AiKSwkdDEpOworCSZ2bW92ZHFhCSgmUVdQKDMyKzMyLCJlc3AiKSwkdDIpOworCSZ2bW92ZHFhCSgmUVdQKDMyKzQ4LCJlc3AiKSwkdDMpOworCSZqbXAJCSgmbGFiZWwoImF2eF8wMF80NyIpKTsKKworJnNldF9sYWJlbCgiYXZ4XzAwXzQ3IiwxNik7CisJJmFkZAkJKCRLMjU2LDY0KTsKKworc3ViIFh1cGRhdGVfQVZYICgpIHsKKwkoCisJJyZ2cGFsaWducgkoJHQwLEBYWzFdLEBYWzBdLDQpOycsCSMgWFsxLi40XQorCSAnJnZwYWxpZ25yCSgkdDMsQFhbM10sQFhbMl0sNCk7JywJIyBYWzkuLjEyXQorCScmdnBzcmxkCSgkdDIsJHQwLDcpOycsCisJICcmdnBhZGRkCShAWFswXSxAWFswXSwkdDMpOycsCSMgWFswLi4zXSArPSBYWzkuLjE2XQorCScmdnBzcmxkCSgkdDMsJHQwLDMpOycsCisJJyZ2cHNsbGQJKCR0MSwkdDAsMTQpOycsCisJJyZ2cHhvcgkJKCR0MCwkdDMsJHQyKTsnLAorCSAnJnZwc2h1ZmQJKCR0MyxAWFszXSwwYjExMTExMDEwKScsIyBYWzE0Li4xNV0KKwknJnZwc3JsZAkoJHQyLCR0MiwxOC03KTsnLAorCScmdnB4b3IJCSgkdDAsJHQwLCR0MSk7JywKKwknJnZwc2xsZAkoJHQxLCR0MSwyNS0xNCk7JywKKwknJnZweG9yCQkoJHQwLCR0MCwkdDIpOycsCisJICcmdnBzcmxkCSgkdDIsJHQzLDEwKTsnLAorCScmdnB4b3IJCSgkdDAsJHQwLCR0MSk7JywJIyBzaWdtYTAoWFsxLi40XSkKKwkgJyZ2cHNybHEJKCR0MSwkdDMsMTcpOycsCisJJyZ2cGFkZGQJKEBYWzBdLEBYWzBdLCR0MCk7JywJIyBYWzAuLjNdICs9IHNpZ21hMChYWzEuLjRdKQorCSAnJnZweG9yCSgkdDIsJHQyLCR0MSk7JywKKwkgJyZ2cHNybHEJKCR0MywkdDMsMTkpOycsCisJICcmdnB4b3IJKCR0MiwkdDIsJHQzKTsnLAkjIHNpZ21hMShYWzE0Li4xNV0KKwkgJyZ2cHNodWZkCSgkdDMsJHQyLDBiMTAwMDAxMDApOycsCisJJyZ2cHNybGRxCSgkdDMsJHQzLDgpOycsCisJJyZ2cGFkZGQJKEBYWzBdLEBYWzBdLCR0Myk7JywJIyBYWzAuLjFdICs9IHNpZ21hMShYWzE0Li4xNV0pCisJICcmdnBzaHVmZAkoJHQzLEBYWzBdLDBiMDEwMTAwMDApJywjIFhbMTYuLjE3XQorCSAnJnZwc3JsZAkoJHQyLCR0MywxMCk7JywKKwkgJyZ2cHNybHEJKCR0MSwkdDMsMTcpOycsCisJICcmdnB4b3IJKCR0MiwkdDIsJHQxKTsnLAorCSAnJnZwc3JscQkoJHQzLCR0MywxOSk7JywKKwkgJyZ2cHhvcgkoJHQyLCR0MiwkdDMpOycsCSMgc2lnbWExKFhbMTYuLjE3XQorCSAnJnZwc2h1ZmQJKCR0MywkdDIsMGIxMTEwMTAwMCk7JywKKwknJnZwc2xsZHEJKCR0MywkdDMsOCk7JywKKwknJnZwYWRkZAkoQFhbMF0sQFhbMF0sJHQzKTsnCSMgWFsyLi4zXSArPSBzaWdtYTEoWFsxNi4uMTddKQorCSk7Cit9CisKK2xvY2FsICpyb3IgPSBzdWIgeyAmc2hyZChAX1swXSxAXykgfTsKK3N1YiBBVlhfMDBfNDcgKCkgeworbXkgJGogPSBzaGlmdDsKK215ICRib2R5ID0gc2hpZnQ7CitteSBAWCA9IEBfOworbXkgQGluc25zID0gKCYkYm9keSwmJGJvZHksJiRib2R5LCYkYm9keSk7CSMgMTIwIGluc3RydWN0aW9ucworbXkgJGluc247CisKKwlmb3JlYWNoIChYdXBkYXRlX0FWWCgpKSB7CQkjIDMxIGluc3RydWN0aW9ucworCSAgICBldmFsOworCSAgICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgICBldmFsKCRpbnNuID0gc2hpZnQoQGluc25zKSk7CisJICAgIGV2YWwoc2hpZnQoQGluc25zKSkgaWYgKCRpbnNuID1+IC9yb3J4LyAmJiBAaW5zbnNbMF0gPX4gL3JvcngvKTsKKwl9CisJJnZwYWRkZAkJKCR0MixAWFswXSwmUVdQKDE2KiRqLCRLMjU2KSk7CisJZm9yZWFjaCAoQGluc25zKSB7IGV2YWw7IH0JCSMgcmVtYWluaW5nIGluc3RydWN0aW9ucworCSZ2bW92ZHFhCSgmUVdQKDMyKzE2KiRqLCJlc3AiKSwkdDIpOworfQorCisgICAgZm9yICgkaT0wLCRqPTA7ICRqPDQ7ICRqKyspIHsKKwkmQVZYXzAwXzQ3KCRqLFwmYm9keV8wMF8xNSxAWCk7CisJcHVzaChAWCxzaGlmdChAWCkpOwkJIyByb3RhdGUoQFgpCisgICAgfQorCSZjbXAJKCZEV1AoMTYqJGosJEsyNTYpLDB4MDAwMTAyMDMpOworCSZqbmUJKCZsYWJlbCgiYXZ4XzAwXzQ3IikpOworCisgICAgZm9yICgkaT0wOyAkaTwxNjsgKSB7CisJZm9yZWFjaChib2R5XzAwXzE1KCkpIHsgZXZhbDsgfQorICAgIH0KKworCSZtb3YJKCJlc2kiLCZEV1AoOTYsImVzcCIpKTsJI2N0eAorCQkJCQkjJm1vdgkoJEFIWzBdLCZEV1AoMCwiZXNwIikpOworCSZ4b3IJKCRBSFsxXSwiZWRpIik7CQkjJm1vdgkoJEFIWzFdLCZEV1AoNCwiZXNwIikpOworCQkJCQkjJm1vdgkoImVkaSIsICZEV1AoOCwiZXNwIikpOworCSZtb3YJKCJlY3giLCZEV1AoMTIsImVzcCIpKTsKKwkmYWRkCSgkQUhbMF0sJkRXUCgwLCJlc2kiKSk7CisJJmFkZAkoJEFIWzFdLCZEV1AoNCwiZXNpIikpOworCSZhZGQJKCJlZGkiLCZEV1AoOCwiZXNpIikpOworCSZhZGQJKCJlY3giLCZEV1AoMTIsImVzaSIpKTsKKwkmbW92CSgmRFdQKDAsImVzaSIpLCRBSFswXSk7CisJJm1vdgkoJkRXUCg0LCJlc2kiKSwkQUhbMV0pOworCSZtb3YJKCZEV1AoOCwiZXNpIiksImVkaSIpOworCSZtb3YJKCZEV1AoMTIsImVzaSIpLCJlY3giKTsKKwkgIyZtb3YJKCZEV1AoMCwiZXNwIiksJEFIWzBdKTsKKwkgJm1vdgkoJkRXUCg0LCJlc3AiKSwkQUhbMV0pOworCSAmeG9yCSgkQUhbMV0sImVkaSIpOwkJCSMgbWFnaWMKKwkgJm1vdgkoJkRXUCg4LCJlc3AiKSwiZWRpIik7CisJICZtb3YJKCZEV1AoMTIsImVzcCIpLCJlY3giKTsKKwkjJm1vdgkoJEUsJkRXUCgxNiwiZXNwIikpOworCSZtb3YJKCJlZGkiLCZEV1AoMjAsImVzcCIpKTsKKwkmbW92CSgiZWN4IiwmRFdQKDI0LCJlc3AiKSk7CisJJmFkZAkoJEUsJkRXUCgxNiwiZXNpIikpOworCSZhZGQJKCJlZGkiLCZEV1AoMjAsImVzaSIpKTsKKwkmYWRkCSgiZWN4IiwmRFdQKDI0LCJlc2kiKSk7CisJJm1vdgkoJkRXUCgxNiwiZXNpIiksJEUpOworCSZtb3YJKCZEV1AoMjAsImVzaSIpLCJlZGkiKTsKKwkgJm1vdgkoJkRXUCgyMCwiZXNwIiksImVkaSIpOworCSZtb3YJKCJlZGkiLCZEV1AoMjgsImVzcCIpKTsKKwkmbW92CSgmRFdQKDI0LCJlc2kiKSwiZWN4Iik7CisJICMmbW92CSgmRFdQKDE2LCJlc3AiKSwkRSk7CisJJmFkZAkoImVkaSIsJkRXUCgyOCwiZXNpIikpOworCSAmbW92CSgmRFdQKDI0LCJlc3AiKSwiZWN4Iik7CisJJm1vdgkoJkRXUCgyOCwiZXNpIiksImVkaSIpOworCSAmbW92CSgmRFdQKDI4LCJlc3AiKSwiZWRpIik7CisJJm1vdgkoImVkaSIsJkRXUCg5Nis0LCJlc3AiKSk7CSMgaW5wCisKKwkmdm1vdmRxYQkoJHQzLCZRV1AoNjQsJEsyNTYpKTsKKwkmc3ViCSgkSzI1NiwzKjY0KTsJCQkjIHJld2luZCBLCisJJmNtcAkoImVkaSIsJkRXUCg5Nis4LCJlc3AiKSk7CSMgYXJlIHdlIGRvbmUgeWV0PworCSZqYgkoJmxhYmVsKCJncmFuZF9hdngiKSk7CisKKwkmbW92CSgiZXNwIiwmRFdQKDk2KzEyLCJlc3AiKSk7CSMgcmVzdG9yZSBzcAorCSZ2emVyb2FsbAkoKTsKKyZmdW5jdGlvbl9lbmRfQSgpOworCQkJCQkJaWYgKCRhdng+MSkgeworc3ViIGJvZHl4XzAwXzE1ICgpIHsJCQkjICsxMCUKKwkoCisJJyZyb3J4CSgiZWN4IiwkRSw2KScsCisJJyZyb3J4CSgiZXNpIiwkRSwxMSknLAorCSAnJm1vdgkoJm9mZigkZSksJEUpJywJCSMgc2F2ZSAkRSwgbW9kdWxvLXNjaGVkdWxlZAorCScmcm9yeAkoImVkaSIsJEUsMjUpJywKKwknJnhvcgkoImVjeCIsImVzaSIpJywKKwkgJyZhbmRuCSgiZXNpIiwkRSwmb2ZmKCRnKSknLAorCScmeG9yCSgiZWN4IiwiZWRpIiknLAkJIyBTaWdtYTEoZSkKKwkgJyZhbmQJKCRFLCZvZmYoJGYpKScsCisJICcmbW92CSgmb2ZmKCRhKSwkQUhbMF0pOycsCSMgc2F2ZSAkQSwgbW9kdWxvLXNjaGVkdWxlZAorCSAnJm9yCSgkRSwiZXNpIiknLAkJIyBUID0gQ2goZSxmLGcpCisKKwknJnJvcngJKCJlZGkiLCRBSFswXSwyKScsCisJJyZyb3J4CSgiZXNpIiwkQUhbMF0sMTMpJywKKwkgJyZsZWEJKCRFLCZEV1AoMCwkRSwiZWN4IikpJywJIyBUICs9IFNpZ21hMShlKQorCScmcm9yeAkoImVjeCIsJEFIWzBdLDIyKScsCisJJyZ4b3IJKCJlc2kiLCJlZGkiKScsCisJICcmbW92CSgiZWRpIiwmb2ZmKCRiKSknLAorCScmeG9yCSgiZWN4IiwiZXNpIiknLAkJIyBTaWdtYTAoYSkKKworCSAnJnhvcgkoJEFIWzBdLCJlZGkiKScsCSMgYSBePSBiLCAoYl5jKSBpbiBuZXh0IHJvdW5kCisJICcmYWRkCSgkRSwmb2ZmKCRoKSknLAkJIyBUICs9IGgKKwkgJyZhbmQJKCRBSFsxXSwkQUhbMF0pJywJIyAoYl5jKSAmPSAoYV5iKQorCSAnJmFkZAkoJEUsJkRXUCgzMis0KigkaSYxNSksImVzcCIpKScsCSMgVCArPSBLW2ldK1hbaV0KKwkgJyZ4b3IJKCRBSFsxXSwiZWRpIiknLAkjIGggPSBNYWooYSxiLGMpID0gQ2goYV5iLGMsYikKKworCSAnJmFkZAkoImVjeCIsJEUpJywJCSMgaCArPSBUCisJICcmYWRkCSgkRSwmb2ZmKCRkKSknLAkJIyBkICs9IFQKKwknJmxlYQkoJEFIWzFdLCZEV1AoMCwkQUhbMV0sImVjeCIpKTsnLgkjIGggKz0gU2lnbWEwKGEpCisKKwknQEFIID0gcmV2ZXJzZShAQUgpOyAkaSsrOycJIyByb3RhdGUoYSxoKQorCSk7Cit9CisKKyZzZXRfbGFiZWwoIkFWWF9CTUkiLDMyKTsKKwkmbGVhCSgiZXNwIiwmRFdQKC05NiwiZXNwIikpOworCSZ2emVyb2FsbAkoKTsKKwkjIGNvcHkgY3R4LT5oWzAtN10gdG8gQSxCLEMsRCxFLEYsRyxIIG9uIHN0YWNrCisJJm1vdgkoJEFIWzBdLCZEV1AoMCwiZXNpIikpOworCSZtb3YJKCRBSFsxXSwmRFdQKDQsImVzaSIpKTsKKwkmbW92CSgiZWN4IiwmRFdQKDgsImVzaSIpKTsKKwkmbW92CSgiZWRpIiwmRFdQKDEyLCJlc2kiKSk7CisJIyZtb3YJKCZEV1AoMCwiZXNwIiksJEFIWzBdKTsKKwkmbW92CSgmRFdQKDQsImVzcCIpLCRBSFsxXSk7CisJJnhvcgkoJEFIWzFdLCJlY3giKTsJCQkjIG1hZ2ljCisJJm1vdgkoJkRXUCg4LCJlc3AiKSwiZWN4Iik7CisJJm1vdgkoJkRXUCgxMiwiZXNwIiksImVkaSIpOworCSZtb3YJKCRFLCZEV1AoMTYsImVzaSIpKTsKKwkmbW92CSgiZWRpIiwmRFdQKDIwLCJlc2kiKSk7CisJJm1vdgkoImVjeCIsJkRXUCgyNCwiZXNpIikpOworCSZtb3YJKCJlc2kiLCZEV1AoMjgsImVzaSIpKTsKKwkjJm1vdgkoJkRXUCgxNiwiZXNwIiksJEUpOworCSZtb3YJKCZEV1AoMjAsImVzcCIpLCJlZGkiKTsKKwkmbW92CSgiZWRpIiwmRFdQKDk2KzQsImVzcCIpKTsJIyBpbnAKKwkmbW92CSgmRFdQKDI0LCJlc3AiKSwiZWN4Iik7CisJJm1vdgkoJkRXUCgyOCwiZXNwIiksImVzaSIpOworCSZ2bW92ZHFhCSgkdDMsJlFXUCgyNTYsJEsyNTYpKTsKKwkmam1wCSgmbGFiZWwoImdyYW5kX2F2eF9ibWkiKSk7CisKKyZzZXRfbGFiZWwoImdyYW5kX2F2eF9ibWkiLDMyKTsKKwkjIGxvYWQgaW5wdXQsIHJldmVyc2UgYnl0ZSBvcmRlciwgYWRkIEsyNTZbMC4uMTVdLCBzYXZlIHRvIHN0YWNrCisJJnZtb3ZkcXUJKEBYWzBdLCZRV1AoMCwiZWRpIikpOworCSZ2bW92ZHF1CShAWFsxXSwmUVdQKDE2LCJlZGkiKSk7CisJJnZtb3ZkcXUJKEBYWzJdLCZRV1AoMzIsImVkaSIpKTsKKwkmdm1vdmRxdQkoQFhbM10sJlFXUCg0OCwiZWRpIikpOworCSZhZGQJCSgiZWRpIiw2NCk7CisJJnZwc2h1ZmIJKEBYWzBdLEBYWzBdLCR0Myk7CisJJm1vdgkJKCZEV1AoOTYrNCwiZXNwIiksImVkaSIpOworCSZ2cHNodWZiCShAWFsxXSxAWFsxXSwkdDMpOworCSZ2cHNodWZiCShAWFsyXSxAWFsyXSwkdDMpOworCSZ2cGFkZGQJCSgkdDAsQFhbMF0sJlFXUCgwLCRLMjU2KSk7CisJJnZwc2h1ZmIJKEBYWzNdLEBYWzNdLCR0Myk7CisJJnZwYWRkZAkJKCR0MSxAWFsxXSwmUVdQKDE2LCRLMjU2KSk7CisJJnZwYWRkZAkJKCR0MixAWFsyXSwmUVdQKDMyLCRLMjU2KSk7CisJJnZwYWRkZAkJKCR0MyxAWFszXSwmUVdQKDQ4LCRLMjU2KSk7CisJJnZtb3ZkcWEJKCZRV1AoMzIrMCwiZXNwIiksJHQwKTsKKwkmdm1vdmRxYQkoJlFXUCgzMisxNiwiZXNwIiksJHQxKTsKKwkmdm1vdmRxYQkoJlFXUCgzMiszMiwiZXNwIiksJHQyKTsKKwkmdm1vdmRxYQkoJlFXUCgzMis0OCwiZXNwIiksJHQzKTsKKwkmam1wCQkoJmxhYmVsKCJhdnhfYm1pXzAwXzQ3IikpOworCismc2V0X2xhYmVsKCJhdnhfYm1pXzAwXzQ3IiwxNik7CisJJmFkZAkJKCRLMjU2LDY0KTsKKworICAgIGZvciAoJGk9MCwkaj0wOyAkajw0OyAkaisrKSB7CisJJkFWWF8wMF80NygkaixcJmJvZHl4XzAwXzE1LEBYKTsKKwlwdXNoKEBYLHNoaWZ0KEBYKSk7CQkjIHJvdGF0ZShAWCkKKyAgICB9CisJJmNtcAkoJkRXUCgxNiokaiwkSzI1NiksMHgwMDAxMDIwMyk7CisJJmpuZQkoJmxhYmVsKCJhdnhfYm1pXzAwXzQ3IikpOworCisgICAgZm9yICgkaT0wOyAkaTwxNjsgKSB7CisJZm9yZWFjaChib2R5eF8wMF8xNSgpKSB7IGV2YWw7IH0KKyAgICB9CisKKwkmbW92CSgiZXNpIiwmRFdQKDk2LCJlc3AiKSk7CSNjdHgKKwkJCQkJIyZtb3YJKCRBSFswXSwmRFdQKDAsImVzcCIpKTsKKwkmeG9yCSgkQUhbMV0sImVkaSIpOwkJIyZtb3YJKCRBSFsxXSwmRFdQKDQsImVzcCIpKTsKKwkJCQkJIyZtb3YJKCJlZGkiLCAmRFdQKDgsImVzcCIpKTsKKwkmbW92CSgiZWN4IiwmRFdQKDEyLCJlc3AiKSk7CisJJmFkZAkoJEFIWzBdLCZEV1AoMCwiZXNpIikpOworCSZhZGQJKCRBSFsxXSwmRFdQKDQsImVzaSIpKTsKKwkmYWRkCSgiZWRpIiwmRFdQKDgsImVzaSIpKTsKKwkmYWRkCSgiZWN4IiwmRFdQKDEyLCJlc2kiKSk7CisJJm1vdgkoJkRXUCgwLCJlc2kiKSwkQUhbMF0pOworCSZtb3YJKCZEV1AoNCwiZXNpIiksJEFIWzFdKTsKKwkmbW92CSgmRFdQKDgsImVzaSIpLCJlZGkiKTsKKwkmbW92CSgmRFdQKDEyLCJlc2kiKSwiZWN4Iik7CisJICMmbW92CSgmRFdQKDAsImVzcCIpLCRBSFswXSk7CisJICZtb3YJKCZEV1AoNCwiZXNwIiksJEFIWzFdKTsKKwkgJnhvcgkoJEFIWzFdLCJlZGkiKTsJCQkjIG1hZ2ljCisJICZtb3YJKCZEV1AoOCwiZXNwIiksImVkaSIpOworCSAmbW92CSgmRFdQKDEyLCJlc3AiKSwiZWN4Iik7CisJIyZtb3YJKCRFLCZEV1AoMTYsImVzcCIpKTsKKwkmbW92CSgiZWRpIiwmRFdQKDIwLCJlc3AiKSk7CisJJm1vdgkoImVjeCIsJkRXUCgyNCwiZXNwIikpOworCSZhZGQJKCRFLCZEV1AoMTYsImVzaSIpKTsKKwkmYWRkCSgiZWRpIiwmRFdQKDIwLCJlc2kiKSk7CisJJmFkZAkoImVjeCIsJkRXUCgyNCwiZXNpIikpOworCSZtb3YJKCZEV1AoMTYsImVzaSIpLCRFKTsKKwkmbW92CSgmRFdQKDIwLCJlc2kiKSwiZWRpIik7CisJICZtb3YJKCZEV1AoMjAsImVzcCIpLCJlZGkiKTsKKwkmbW92CSgiZWRpIiwmRFdQKDI4LCJlc3AiKSk7CisJJm1vdgkoJkRXUCgyNCwiZXNpIiksImVjeCIpOworCSAjJm1vdgkoJkRXUCgxNiwiZXNwIiksJEUpOworCSZhZGQJKCJlZGkiLCZEV1AoMjgsImVzaSIpKTsKKwkgJm1vdgkoJkRXUCgyNCwiZXNwIiksImVjeCIpOworCSZtb3YJKCZEV1AoMjgsImVzaSIpLCJlZGkiKTsKKwkgJm1vdgkoJkRXUCgyOCwiZXNwIiksImVkaSIpOworCSZtb3YJKCJlZGkiLCZEV1AoOTYrNCwiZXNwIikpOwkjIGlucAorCisJJnZtb3ZkcWEJKCR0MywmUVdQKDY0LCRLMjU2KSk7CisJJnN1YgkoJEsyNTYsMyo2NCk7CQkJIyByZXdpbmQgSworCSZjbXAJKCJlZGkiLCZEV1AoOTYrOCwiZXNwIikpOwkjIGFyZSB3ZSBkb25lIHlldD8KKwkmamIJKCZsYWJlbCgiZ3JhbmRfYXZ4X2JtaSIpKTsKKworCSZtb3YJKCJlc3AiLCZEV1AoOTYrMTIsImVzcCIpKTsJIyByZXN0b3JlIHNwCisJJnZ6ZXJvYWxsCSgpOworJmZ1bmN0aW9uX2VuZF9BKCk7CisJCQkJCQl9CisJCQkJCQl9CisJCQkJCQl9fX0KKyZmdW5jdGlvbl9lbmRfQigic2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXIiKTsKKworJmFzbV9maW5pc2goKTsKZGlmZiAtLWdpdCBhL2NyeXB0by9zaGEvYXNtL3NoYTI1Ni1hcm12NC5wbCBiL2NyeXB0by9zaGEvYXNtL3NoYTI1Ni1hcm12NC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjJhMDk4Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3NoYS9hc20vc2hhMjU2LWFybXY0LnBsCkBAIC0wLDAgKzEsNTQwIEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgV3JpdHRlbiBieSBBbmR5IFBvbHlha292IDxhcHByb0BvcGVuc3NsLm9yZz4gZm9yIHRoZSBPcGVuU1NMCisjIHByb2plY3QuIFRoZSBtb2R1bGUgaXMsIGhvd2V2ZXIsIGR1YWwgbGljZW5zZWQgdW5kZXIgT3BlblNTTCBhbmQKKyMgQ1JZUFRPR0FNUyBsaWNlbnNlcyBkZXBlbmRpbmcgb24gd2hlcmUgeW91IG9idGFpbiBpdC4gRm9yIGZ1cnRoZXIKKyMgZGV0YWlscyBzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+YXBwcm8vY3J5cHRvZ2Ftcy8uCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgU0hBMjU2IGJsb2NrIHByb2NlZHVyZSBmb3IgQVJNdjQuIE1heSAyMDA3LgorCisjIFBlcmZvcm1hbmNlIGlzIH4yeCBiZXR0ZXIgdGhhbiBnY2MgMy40IGdlbmVyYXRlZCBjb2RlIGFuZCBpbiAiYWJzby0KKyMgbHV0ZSIgdGVybXMgaXMgfjIyNTAgY3ljbGVzIHBlciA2NC1ieXRlIGJsb2NrIG9yIH4zNSBjeWNsZXMgcGVyCisjIGJ5dGUgW29uIHNpbmdsZS1pc3N1ZSBYc2NhbGUgUFhBMjUwIGNvcmVdLgorCisjIEp1bHkgMjAxMC4KKyMKKyMgUmVzY2hlZHVsaW5nIGZvciBkdWFsLWlzc3VlIHBpcGVsaW5lIHJlc3VsdGVkIGluIDIyJSBpbXByb3ZlbWVudCBvbgorIyBDb3J0ZXggQTggY29yZSBhbmQgfjIwIGN5Y2xlcyBwZXIgcHJvY2Vzc2VkIGJ5dGUuCisKKyMgRmVicnVhcnkgMjAxMS4KKyMKKyMgUHJvZmlsZXItYXNzaXN0ZWQgYW5kIHBsYXRmb3JtLXNwZWNpZmljIG9wdGltaXphdGlvbiByZXN1bHRlZCBpbiAxNiUKKyMgaW1wcm92ZW1lbnQgb24gQ29ydGV4IEE4IGNvcmUgYW5kIH4xNS40IGN5Y2xlcyBwZXIgcHJvY2Vzc2VkIGJ5dGUuCisKKyMgU2VwdGVtYmVyIDIwMTMuCisjCisjIEFkZCBORU9OIGltcGxlbWVudGF0aW9uLiBPbiBDb3J0ZXggQTggaXQgd2FzIG1lYXN1cmVkIHRvIHByb2Nlc3Mgb25lCisjIGJ5dGUgaW4gMTIuNSBjeWNsZXMgb3IgMjMlIGZhc3RlciB0aGFuIGludGVnZXItb25seSBjb2RlLiBTbmFwZHJhZ29uCisjIFM0IGRvZXMgaXQgaW4gMTIuNSBjeWNsZXMgdG9vLCBidXQgaXQncyA1MCUgZmFzdGVyIHRoYW4gaW50ZWdlci1vbmx5CisjIGNvZGUgKG1lYW5pbmcgdGhhdCBsYXR0ZXIgcGVyZm9ybXMgc3ViLW9wdGltYWxseSwgbm90aGluZyB3YXMgZG9uZQorIyBhYm91dCBpdCkuCisKK3doaWxlICgoJG91dHB1dD1zaGlmdCkgJiYgKCRvdXRwdXQhfi9eXHdbXHdcLV0qXC5cdyskLykpIHt9CitvcGVuIFNURE9VVCwiPiRvdXRwdXQiOworCiskY3R4PSJyMCI7CSR0MD0icjAiOworJGlucD0icjEiOwkkdDQ9InIxIjsKKyRsZW49InIyIjsJJHQxPSJyMiI7CiskVDE9InIzIjsJJHQzPSJyMyI7CiskQT0icjQiOworJEI9InI1IjsKKyRDPSJyNiI7CiskRD0icjciOworJEU9InI4IjsKKyRGPSJyOSI7CiskRz0icjEwIjsKKyRIPSJyMTEiOworQFY9KCRBLCRCLCRDLCRELCRFLCRGLCRHLCRIKTsKKyR0Mj0icjEyIjsKKyRLdGJsPSJyMTQiOworCitAU2lnbWEwPSggMiwxMywyMik7CitAU2lnbWExPSggNiwxMSwyNSk7CitAc2lnbWEwPSggNywxOCwgMyk7CitAc2lnbWExPSgxNywxOSwxMCk7CisKK3N1YiBCT0RZXzAwXzE1IHsKK215ICgkaSwkYSwkYiwkYywkZCwkZSwkZiwkZywkaCkgPSBAXzsKKworJGNvZGUuPTw8X19fIGlmICgkaTwxNik7CisjaWYgX19BUk1fQVJDSF9fPj03CisJQCBsZHIJJHQxLFskaW5wXSwjNAkJCUAgJGkKKyMgaWYgJGk9PTE1CisJc3RyCSRpbnAsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciAkdDQKKyMgZW5kaWYKKwllb3IJJHQwLCRlLCRlLHJvciNgJFNpZ21hMVsxXS0kU2lnbWExWzBdYAorCWFkZAkkYSwkYSwkdDIJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWVvcgkkdDAsJHQwLCRlLHJvciNgJFNpZ21hMVsyXS0kU2lnbWExWzBdYAlAIFNpZ21hMShlKQorCXJldgkkdDEsJHQxCisjZWxzZQorCUAgbGRyYgkkdDEsWyRpbnAsIzNdCQkJQCAkaQorCWFkZAkkYSwkYSwkdDIJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWxkcmIJJHQyLFskaW5wLCMyXQorCWxkcmIJJHQwLFskaW5wLCMxXQorCW9ycgkkdDEsJHQxLCR0Mixsc2wjOAorCWxkcmIJJHQyLFskaW5wXSwjNAorCW9ycgkkdDEsJHQxLCR0MCxsc2wjMTYKKyMgaWYgJGk9PTE1CisJc3RyCSRpbnAsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciAkdDQKKyMgZW5kaWYKKwllb3IJJHQwLCRlLCRlLHJvciNgJFNpZ21hMVsxXS0kU2lnbWExWzBdYAorCW9ycgkkdDEsJHQxLCR0Mixsc2wjMjQKKwllb3IJJHQwLCR0MCwkZSxyb3IjYCRTaWdtYTFbMl0tJFNpZ21hMVswXWAJQCBTaWdtYTEoZSkKKyNlbmRpZgorX19fCiskY29kZS49PDxfX187CisJbGRyCSR0MixbJEt0YmxdLCM0CQkJQCAqSzI1NisrCisJYWRkCSRoLCRoLCR0MQkJCUAgaCs9WFtpXQorCXN0cgkkdDEsW3NwLCNgJGklMTZgKjRdCisJZW9yCSR0MSwkZiwkZworCWFkZAkkaCwkaCwkdDAscm9yIyRTaWdtYTFbMF0JQCBoKz1TaWdtYTEoZSkKKwlhbmQJJHQxLCR0MSwkZQorCWFkZAkkaCwkaCwkdDIJCQlAIGgrPUsyNTZbaV0KKwllb3IJJHQxLCR0MSwkZwkJCUAgQ2goZSxmLGcpCisJZW9yCSR0MCwkYSwkYSxyb3IjYCRTaWdtYTBbMV0tJFNpZ21hMFswXWAKKwlhZGQJJGgsJGgsJHQxCQkJQCBoKz1DaChlLGYsZykKKyNpZiAkaT09MzEKKwlhbmQJJHQyLCR0MiwjMHhmZgorCWNtcAkkdDIsIzB4ZjIJCQlAIGRvbmU/CisjZW5kaWYKKyNpZiAkaTwxNQorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJJHQxLFskaW5wXSwjNAkJCUAgcHJlZmV0Y2gKKyMgZWxzZQorCWxkcmIJJHQxLFskaW5wLCMzXQorIyBlbmRpZgorCWVvcgkkdDIsJGEsJGIJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKyNlbHNlCisJbGRyCSR0MSxbc3AsI2AoJGkrMiklMTZgKjRdCQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKwllb3IJJHQyLCRhLCRiCQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJbGRyCSR0NCxbc3AsI2AoJGkrMTUpJTE2YCo0XQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKyNlbmRpZgorCWVvcgkkdDAsJHQwLCRhLHJvciNgJFNpZ21hMFsyXS0kU2lnbWEwWzBdYAlAIFNpZ21hMChhKQorCWFuZAkkdDMsJHQzLCR0MgkJCUAgKGJeYykmPShhXmIpCisJYWRkCSRkLCRkLCRoCQkJQCBkKz1oCisJZW9yCSR0MywkdDMsJGIJCQlAIE1haihhLGIsYykKKwlhZGQJJGgsJGgsJHQwLHJvciMkU2lnbWEwWzBdCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJJGgsJGgsJHQzCQkJQCBoKz1NYWooYSxiLGMpCitfX18KKwkoJHQyLCR0Myk9KCR0MywkdDIpOworfQorCitzdWIgQk9EWV8xNl9YWCB7CitteSAoJGksJGEsJGIsJGMsJGQsJGUsJGYsJGcsJGgpID0gQF87CisKKyRjb2RlLj08PF9fXzsKKwlAIGxkcgkkdDEsW3NwLCNgKCRpKzEpJTE2YCo0XQkJQCAkaQorCUAgbGRyCSR0NCxbc3AsI2AoJGkrMTQpJTE2YCo0XQorCW1vdgkkdDAsJHQxLHJvciMkc2lnbWEwWzBdCisJYWRkCSRhLCRhLCR0MgkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbW92CSR0MiwkdDQscm9yIyRzaWdtYTFbMF0KKwllb3IJJHQwLCR0MCwkdDEscm9yIyRzaWdtYTBbMV0KKwllb3IJJHQyLCR0MiwkdDQscm9yIyRzaWdtYTFbMV0KKwllb3IJJHQwLCR0MCwkdDEsbHNyIyRzaWdtYTBbMl0JQCBzaWdtYTAoWFtpKzFdKQorCWxkcgkkdDEsW3NwLCNgKCRpKzApJTE2YCo0XQorCWVvcgkkdDIsJHQyLCR0NCxsc3IjJHNpZ21hMVsyXQlAIHNpZ21hMShYW2krMTRdKQorCWxkcgkkdDQsW3NwLCNgKCRpKzkpJTE2YCo0XQorCisJYWRkCSR0MiwkdDIsJHQwCisJZW9yCSR0MCwkZSwkZSxyb3IjYCRTaWdtYTFbMV0tJFNpZ21hMVswXWAJQCBmcm9tIEJPRFlfMDBfMTUKKwlhZGQJJHQxLCR0MSwkdDIKKwllb3IJJHQwLCR0MCwkZSxyb3IjYCRTaWdtYTFbMl0tJFNpZ21hMVswXWAJQCBTaWdtYTEoZSkKKwlhZGQJJHQxLCR0MSwkdDQJCQlAIFhbaV0KK19fXworCSZCT0RZXzAwXzE1KEBfKTsKK30KKworJGNvZGU9PDxfX187CisjaWYgZGVmaW5lZChfX2FybV9fKQorI2luY2x1ZGUgImFybV9hcmNoLmgiCisKKy50ZXh0CisuY29kZQkzMgorCisudHlwZQlLMjU2LCVvYmplY3QKKy5hbGlnbgk1CitLMjU2OgorLndvcmQJMHg0MjhhMmY5OCwweDcxMzc0NDkxLDB4YjVjMGZiY2YsMHhlOWI1ZGJhNQorLndvcmQJMHgzOTU2YzI1YiwweDU5ZjExMWYxLDB4OTIzZjgyYTQsMHhhYjFjNWVkNQorLndvcmQJMHhkODA3YWE5OCwweDEyODM1YjAxLDB4MjQzMTg1YmUsMHg1NTBjN2RjMworLndvcmQJMHg3MmJlNWQ3NCwweDgwZGViMWZlLDB4OWJkYzA2YTcsMHhjMTliZjE3NAorLndvcmQJMHhlNDliNjljMSwweGVmYmU0Nzg2LDB4MGZjMTlkYzYsMHgyNDBjYTFjYworLndvcmQJMHgyZGU5MmM2ZiwweDRhNzQ4NGFhLDB4NWNiMGE5ZGMsMHg3NmY5ODhkYQorLndvcmQJMHg5ODNlNTE1MiwweGE4MzFjNjZkLDB4YjAwMzI3YzgsMHhiZjU5N2ZjNworLndvcmQJMHhjNmUwMGJmMywweGQ1YTc5MTQ3LDB4MDZjYTYzNTEsMHgxNDI5Mjk2NworLndvcmQJMHgyN2I3MGE4NSwweDJlMWIyMTM4LDB4NGQyYzZkZmMsMHg1MzM4MGQxMworLndvcmQJMHg2NTBhNzM1NCwweDc2NmEwYWJiLDB4ODFjMmM5MmUsMHg5MjcyMmM4NQorLndvcmQJMHhhMmJmZThhMSwweGE4MWE2NjRiLDB4YzI0YjhiNzAsMHhjNzZjNTFhMworLndvcmQJMHhkMTkyZTgxOSwweGQ2OTkwNjI0LDB4ZjQwZTM1ODUsMHgxMDZhYTA3MAorLndvcmQJMHgxOWE0YzExNiwweDFlMzc2YzA4LDB4Mjc0ODc3NGMsMHgzNGIwYmNiNQorLndvcmQJMHgzOTFjMGNiMywweDRlZDhhYTRhLDB4NWI5Y2NhNGYsMHg2ODJlNmZmMworLndvcmQJMHg3NDhmODJlZSwweDc4YTU2MzZmLDB4ODRjODc4MTQsMHg4Y2M3MDIwOAorLndvcmQJMHg5MGJlZmZmYSwweGE0NTA2Y2ViLDB4YmVmOWEzZjcsMHhjNjcxNzhmMgorLnNpemUJSzI1NiwuLUsyNTYKKy53b3JkCTAJCQkJQCB0ZXJtaW5hdG9yCisuTE9QRU5TU0xfYXJtY2FwOgorLndvcmQJT1BFTlNTTF9hcm1jYXBfUC1zaGEyNTZfYmxvY2tfZGF0YV9vcmRlcgorLmFsaWduCTUKKworLmdsb2JhbAlzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcgorLnR5cGUJc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXIsJWZ1bmN0aW9uCitzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcjoKKwlzdWIJcjMscGMsIzgJCUAgc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXIKKwlhZGQJJGxlbiwkaW5wLCRsZW4sbHNsIzYJQCBsZW4gdG8gcG9pbnQgYXQgdGhlIGVuZCBvZiBpbnAKKyNpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjEyLC5MT1BFTlNTTF9hcm1jYXAKKwlsZHIJcjEyLFtyMyxyMTJdCQlAIE9QRU5TU0xfYXJtY2FwX1AKKwl0c3QJcjEyLCMxCisJYm5lCS5MTkVPTgorI2VuZGlmCisJc3RtZGIJc3AhLHskY3R4LCRpbnAsJGxlbixyNC1yMTEsbHJ9CisJbGRtaWEJJGN0eCx7JEEsJEIsJEMsJEQsJEUsJEYsJEcsJEh9CisJc3ViCSRLdGJsLHIzLCMyNTYrMzIJQCBLMjU2CisJc3ViCXNwLHNwLCMxNio0CQlAIGFsbG9jYShYWzE2XSkKKy5Mb29wOgorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJJHQxLFskaW5wXSwjNAorIyBlbHNlCisJbGRyYgkkdDEsWyRpbnAsIzNdCisjIGVuZGlmCisJZW9yCSR0MywkQiwkQwkJQCBtYWdpYworCWVvcgkkdDIsJHQyLCR0MgorX19fCitmb3IoJGk9MDskaTwxNjskaSsrKQl7ICZCT0RZXzAwXzE1KCRpLEBWKTsgdW5zaGlmdChAVixwb3AoQFYpKTsgfQorJGNvZGUuPSIuTHJvdW5kc18xNl94eDpcbiI7Citmb3IgKDskaTwzMjskaSsrKQl7ICZCT0RZXzE2X1hYKCRpLEBWKTsgdW5zaGlmdChAVixwb3AoQFYpKTsgfQorJGNvZGUuPTw8X19fOworCWxkcmVxCSR0Myxbc3AsIzE2KjRdCQlAIHB1bGwgY3R4CisJYm5lCS5Mcm91bmRzXzE2X3h4CisKKwlhZGQJJEEsJEEsJHQyCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWxkcgkkdDAsWyR0MywjMF0KKwlsZHIJJHQxLFskdDMsIzRdCisJbGRyCSR0MixbJHQzLCM4XQorCWFkZAkkQSwkQSwkdDAKKwlsZHIJJHQwLFskdDMsIzEyXQorCWFkZAkkQiwkQiwkdDEKKwlsZHIJJHQxLFskdDMsIzE2XQorCWFkZAkkQywkQywkdDIKKwlsZHIJJHQyLFskdDMsIzIwXQorCWFkZAkkRCwkRCwkdDAKKwlsZHIJJHQwLFskdDMsIzI0XQorCWFkZAkkRSwkRSwkdDEKKwlsZHIJJHQxLFskdDMsIzI4XQorCWFkZAkkRiwkRiwkdDIKKwlsZHIJJGlucCxbc3AsIzE3KjRdCQlAIHB1bGwgaW5wCisJbGRyCSR0Mixbc3AsIzE4KjRdCQlAIHB1bGwgaW5wK2xlbgorCWFkZAkkRywkRywkdDAKKwlhZGQJJEgsJEgsJHQxCisJc3RtaWEJJHQzLHskQSwkQiwkQywkRCwkRSwkRiwkRywkSH0KKwljbXAJJGlucCwkdDIKKwlzdWIJJEt0YmwsJEt0YmwsIzI1NglAIHJld2luZCBLdGJsCisJYm5lCS5Mb29wCisKKwlhZGQJc3Asc3AsI2AxNiszYCo0CUAgZGVzdHJveSBmcmFtZQorI2lmIF9fQVJNX0FSQ0hfXz49NQorCWxkbWlhCXNwISx7cjQtcjExLHBjfQorI2Vsc2UKKwlsZG1pYQlzcCEse3I0LXIxMSxscn0KKwl0c3QJbHIsIzEKKwltb3ZlcQlwYyxscgkJCUAgYmUgYmluYXJ5IGNvbXBhdGlibGUgd2l0aCBWNCwgeWV0CisJYngJbHIJCQlAIGludGVyb3BlcmFibGUgd2l0aCBUaHVtYiBJU0E6LSkKKyNlbmRpZgorX19fCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE5FT04gc3R1ZmYKKyMKK3t7eworbXkgQFg9bWFwKCJxJF8iLCgwLi4zKSk7CitteSAoJFQwLCRUMSwkVDIsJFQzLCRUNCwkVDUpPSgicTgiLCJxOSIsInExMCIsInExMSIsImQyNCIsImQyNSIpOworbXkgJFhmZXI9JHQ0OworbXkgJGo9MDsKKworc3ViIERsbygpICAgeyBzaGlmdD1+bXxxKFsxXT9bMC05XSl8PyJkIi4oJDEqMik6IiI7ICAgICB9CitzdWIgRGhpKCkgICB7IHNoaWZ0PX5tfHEoWzFdP1swLTldKXw/ImQiLigkMSoyKzEpOiIiOyAgIH0KKworc3ViIEFVVE9MT0FEKCkgICAgICAgICAgIyB0aHVuayBbc2ltcGxpZmllZF0geDg2LXN0eWxlIHBlcmxhc20KK3sgbXkgJG9wY29kZSA9ICRBVVRPTE9BRDsgJG9wY29kZSA9fiBzLy4qOjovLzsgJG9wY29kZSA9fiBzL18vXC4vOworICBteSAkYXJnID0gcG9wOworICAgICRhcmcgPSAiIyRhcmciIGlmICgkYXJnKjEgZXEgJGFyZyk7CisgICAgJGNvZGUgLj0gIlx0JG9wY29kZVx0Ii5qb2luKCcsJyxAXywkYXJnKS4iXG4iOworfQorCitzdWIgWHVwZGF0ZSgpCit7IHVzZSBpbnRlZ2VyOworICBteSAkYm9keSA9IHNoaWZ0OworICBteSBAaW5zbnMgPSAoJiRib2R5LCYkYm9keSwmJGJvZHksJiRib2R5KTsKKyAgbXkgKCRhLCRiLCRjLCRkLCRlLCRmLCRnLCRoKTsKKworCSZ2ZXh0XzgJCSgkVDAsQFhbMF0sQFhbMV0sNCk7CSMgWFsxLi40XQorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSZ2ZXh0XzgJCSgkVDEsQFhbMl0sQFhbM10sNCk7CSMgWFs5Li4xMl0KKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmdnNocl91MzIJKCRUMiwkVDAsJHNpZ21hMFswXSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJnZhZGRfaTMyCShAWFswXSxAWFswXSwkVDEpOwkjIFhbMC4uM10gKz0gWFs5Li4xMl0KKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmdnNocl91MzIJKCRUMSwkVDAsJHNpZ21hMFsyXSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJnZzbGlfMzIJKCRUMiwkVDAsMzItJHNpZ21hMFswXSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJnZzaHJfdTMyCSgkVDMsJFQwLCRzaWdtYTBbMV0pOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSZ2ZW9yCQkoJFQxLCRUMSwkVDIpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSZ2c2xpXzMyCSgkVDMsJFQwLDMyLSRzaWdtYTBbMV0pOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgJnZzaHJfdTMyCSgkVDQsJkRoaShAWFszXSksJHNpZ21hMVswXSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJnZlb3IJCSgkVDEsJFQxLCRUMyk7CQkjIHNpZ21hMChYWzEuLjRdKQorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgJnZzbGlfMzIJKCRUNCwmRGhpKEBYWzNdKSwzMi0kc2lnbWExWzBdKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgICZ2c2hyX3UzMgkoJFQ1LCZEaGkoQFhbM10pLCRzaWdtYTFbMl0pOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSZ2YWRkX2kzMgkoQFhbMF0sQFhbMF0sJFQxKTsJIyBYWzAuLjNdICs9IHNpZ21hMChYWzEuLjRdKQorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgJnZlb3IJCSgkVDUsJFQ1LCRUNCk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICAmdnNocl91MzIJKCRUNCwmRGhpKEBYWzNdKSwkc2lnbWExWzFdKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgICZ2c2xpXzMyCSgkVDQsJkRoaShAWFszXSksMzItJHNpZ21hMVsxXSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICAmdmVvcgkJKCRUNSwkVDUsJFQ0KTsJCSMgc2lnbWExKFhbMTQuLjE1XSkKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmdmFkZF9pMzIJKCZEbG8oQFhbMF0pLCZEbG8oQFhbMF0pLCRUNSk7IyBYWzAuLjFdICs9IHNpZ21hMShYWzE0Li4xNV0pCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICAmdnNocl91MzIJKCRUNCwmRGxvKEBYWzBdKSwkc2lnbWExWzBdKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgICZ2c2xpXzMyCSgkVDQsJkRsbyhAWFswXSksMzItJHNpZ21hMVswXSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICAmdnNocl91MzIJKCRUNSwmRGxvKEBYWzBdKSwkc2lnbWExWzJdKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgICZ2ZW9yCQkoJFQ1LCRUNSwkVDQpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgJnZzaHJfdTMyCSgkVDQsJkRsbyhAWFswXSksJHNpZ21hMVsxXSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJnZsZDFfMzIJKCJ7JFQwfSIsIlskS3RibCw6MTI4XSEiKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgICZ2c2xpXzMyCSgkVDQsJkRsbyhAWFswXSksMzItJHNpZ21hMVsxXSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICAmdmVvcgkJKCRUNSwkVDUsJFQ0KTsJCSMgc2lnbWExKFhbMTYuLjE3XSkKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmdmFkZF9pMzIJKCZEaGkoQFhbMF0pLCZEaGkoQFhbMF0pLCRUNSk7IyBYWzIuLjNdICs9IHNpZ21hMShYWzE2Li4xN10pCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJnZhZGRfaTMyCSgkVDAsJFQwLEBYWzBdKTsKKwkgd2hpbGUoJCNpbnNucz49MikgeyBldmFsKHNoaWZ0KEBpbnNucykpOyB9CisJJnZzdDFfMzIJKCJ7JFQwfSIsIlskWGZlciw6MTI4XSEiKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKworCXB1c2goQFgsc2hpZnQoQFgpKTsJCSMgInJvdGF0ZSIgWFtdCit9CisKK3N1YiBYcHJlbG9hZCgpCit7IHVzZSBpbnRlZ2VyOworICBteSAkYm9keSA9IHNoaWZ0OworICBteSBAaW5zbnMgPSAoJiRib2R5LCYkYm9keSwmJGJvZHksJiRib2R5KTsKKyAgbXkgKCRhLCRiLCRjLCRkLCRlLCRmLCRnLCRoKTsKKworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSZ2bGQxXzMyCSgieyRUMH0iLCJbJEt0YmwsOjEyOF0hIik7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJnZyZXYzMl84CShAWFswXSxAWFswXSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJnZhZGRfaTMyCSgkVDAsJFQwLEBYWzBdKTsKKwkgZm9yZWFjaCAoQGluc25zKSB7IGV2YWw7IH0JIyByZW1haW5pbmcgaW5zdHJ1Y3Rpb25zCisJJnZzdDFfMzIJKCJ7JFQwfSIsIlskWGZlciw6MTI4XSEiKTsKKworCXB1c2goQFgsc2hpZnQoQFgpKTsJCSMgInJvdGF0ZSIgWFtdCit9CisKK3N1YiBib2R5XzAwXzE1ICgpIHsKKwkoCisJJygkYSwkYiwkYywkZCwkZSwkZiwkZywkaCk9QFY7Jy4KKwknJmFkZAkoJGgsJGgsJHQxKScsCQkJIyBoKz1YW2ldK0tbaV0KKwknJmVvcgkoJHQxLCRmLCRnKScsCisJJyZlb3IJKCR0MCwkZSwkZSwicm9yIyIuKCRTaWdtYTFbMV0tJFNpZ21hMVswXSkpJywKKwknJmFkZAkoJGEsJGEsJHQyKScsCQkJIyBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwknJmFuZAkoJHQxLCR0MSwkZSknLAorCScmZW9yCSgkdDIsJHQwLCRlLCJyb3IjIi4oJFNpZ21hMVsyXS0kU2lnbWExWzBdKSknLAkjIFNpZ21hMShlKQorCScmZW9yCSgkdDAsJGEsJGEsInJvciMiLigkU2lnbWEwWzFdLSRTaWdtYTBbMF0pKScsCisJJyZlb3IJKCR0MSwkdDEsJGcpJywJCQkjIENoKGUsZixnKQorCScmYWRkCSgkaCwkaCwkdDIsInJvciMkU2lnbWExWzBdIiknLAkjIGgrPVNpZ21hMShlKQorCScmZW9yCSgkdDIsJGEsJGIpJywJCQkjIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwknJmVvcgkoJHQwLCR0MCwkYSwicm9yIyIuKCRTaWdtYTBbMl0tJFNpZ21hMFswXSkpJywJIyBTaWdtYTAoYSkKKwknJmFkZAkoJGgsJGgsJHQxKScsCQkJIyBoKz1DaChlLGYsZykKKwknJmxkcgkoJHQxLHNwcmludGYgIltzcCwjJWRdIiw0KigoJGorMSkmMTUpKQlpZiAoKCRqJjE1KSE9MTUpOycuCisJJyZsZHIJKCR0MSwiWyRLdGJsXSIpCQkJCWlmICgkaj09MTUpOycuCisJJyZsZHIJKCR0MSwiW3NwLCM2NF0iKQkJCWlmICgkaj09MzEpJywKKwknJmFuZAkoJHQzLCR0MywkdDIpJywJCQkjIChiXmMpJj0oYV5iKQorCScmYWRkCSgkZCwkZCwkaCknLAkJCSMgZCs9aAorCScmYWRkCSgkaCwkaCwkdDAsInJvciMkU2lnbWEwWzBdIik7Jy4JIyBoKz1TaWdtYTAoYSkKKwknJmVvcgkoJHQzLCR0MywkYiknLAkJCSMgTWFqKGEsYixjKQorCSckaisrOwl1bnNoaWZ0KEBWLHBvcChAVikpOyAoJHQyLCR0Myk9KCR0MywkdDIpOycKKwkpCit9CisKKyRjb2RlLj08PF9fXzsKKyNpZiBfX0FSTV9BUkNIX18+PTcKKy5mcHUJbmVvbgorLmFsaWduCTQKKy5MTkVPTjoKKwlzdG1kYglzcCEse3I0LXIxMixscn0KKworCW1vdgkkdDIsc3AKKwlzdWIJc3Asc3AsIzE2KjQrMTYJCUAgYWxsb2NhCisJc3ViCSRLdGJsLHIzLCMyNTYrMzIJQCBLMjU2CisJYmljCXNwLHNwLCMxNQkJQCBhbGlnbiBmb3IgMTI4LWJpdCBzdG9yZXMKKworCXZsZDEuOAkJe0BYWzBdfSxbJGlucF0hCisJdmxkMS44CQl7QFhbMV19LFskaW5wXSEKKwl2bGQxLjgJCXtAWFsyXX0sWyRpbnBdIQorCXZsZDEuOAkJe0BYWzNdfSxbJGlucF0hCisJdmxkMS4zMgkJeyRUMH0sWyRLdGJsLDoxMjhdIQorCXZsZDEuMzIJCXskVDF9LFskS3RibCw6MTI4XSEKKwl2bGQxLjMyCQl7JFQyfSxbJEt0YmwsOjEyOF0hCisJdmxkMS4zMgkJeyRUM30sWyRLdGJsLDoxMjhdIQorCXZyZXYzMi44CUBYWzBdLEBYWzBdCQlAIHllcywgZXZlbiBvbgorCXN0cgkJJGN0eCxbc3AsIzY0XQorCXZyZXYzMi44CUBYWzFdLEBYWzFdCQlAIGJpZy1lbmRpYW4KKwlzdHIJCSRpbnAsW3NwLCM2OF0KKwltb3YJCSRYZmVyLHNwCisJdnJldjMyLjgJQFhbMl0sQFhbMl0KKwlzdHIJCSRsZW4sW3NwLCM3Ml0KKwl2cmV2MzIuOAlAWFszXSxAWFszXQorCXN0cgkJJHQyLFtzcCwjNzZdCQlAIHNhdmUgb3JpZ2luYWwgc3AKKwl2YWRkLmkzMgkkVDAsJFQwLEBYWzBdCisJdmFkZC5pMzIJJFQxLCRUMSxAWFsxXQorCXZzdDEuMzIJCXskVDB9LFskWGZlciw6MTI4XSEKKwl2YWRkLmkzMgkkVDIsJFQyLEBYWzJdCisJdnN0MS4zMgkJeyRUMX0sWyRYZmVyLDoxMjhdIQorCXZhZGQuaTMyCSRUMywkVDMsQFhbM10KKwl2c3QxLjMyCQl7JFQyfSxbJFhmZXIsOjEyOF0hCisJdnN0MS4zMgkJeyRUM30sWyRYZmVyLDoxMjhdIQorCisJbGRtaWEJCSRjdHgseyRBLSRIfQorCXN1YgkJJFhmZXIsJFhmZXIsIzY0CisJbGRyCQkkdDEsW3NwLCMwXQorCWVvcgkJJHQyLCR0MiwkdDIKKwllb3IJCSR0MywkQiwkQworCWIJCS5MXzAwXzQ4CisKKy5hbGlnbgk0CisuTF8wMF80ODoKK19fXworCSZYdXBkYXRlKFwmYm9keV8wMF8xNSk7CisJJlh1cGRhdGUoXCZib2R5XzAwXzE1KTsKKwkmWHVwZGF0ZShcJmJvZHlfMDBfMTUpOworCSZYdXBkYXRlKFwmYm9keV8wMF8xNSk7CiskY29kZS49PDxfX187CisJdGVxCSR0MSwjMAkJCQlAIGNoZWNrIGZvciBLMjU2IHRlcm1pbmF0b3IKKwlsZHIJJHQxLFtzcCwjMF0KKwlzdWIJJFhmZXIsJFhmZXIsIzY0CisJYm5lCS5MXzAwXzQ4CisKKwlsZHIJCSRpbnAsW3NwLCM2OF0KKwlsZHIJCSR0MCxbc3AsIzcyXQorCXN1YgkJJEt0YmwsJEt0YmwsIzI1NglAIHJld2luZCAkS3RibAorCXRlcQkJJGlucCwkdDAKKwlzdWJlcQkJJGlucCwkaW5wLCM2NAkJQCBhdm9pZCBTRUdWCisJdmxkMS44CQl7QFhbMF19LFskaW5wXSEJCUAgbG9hZCBuZXh0IGlucHV0IGJsb2NrCisJdmxkMS44CQl7QFhbMV19LFskaW5wXSEKKwl2bGQxLjgJCXtAWFsyXX0sWyRpbnBdIQorCXZsZDEuOAkJe0BYWzNdfSxbJGlucF0hCisJc3RybmUJCSRpbnAsW3NwLCM2OF0KKwltb3YJCSRYZmVyLHNwCitfX18KKwkmWHByZWxvYWQoXCZib2R5XzAwXzE1KTsKKwkmWHByZWxvYWQoXCZib2R5XzAwXzE1KTsKKwkmWHByZWxvYWQoXCZib2R5XzAwXzE1KTsKKwkmWHByZWxvYWQoXCZib2R5XzAwXzE1KTsKKyRjb2RlLj08PF9fXzsKKwlsZHIJJHQwLFskdDEsIzBdCisJYWRkCSRBLCRBLCR0MgkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbGRyCSR0MixbJHQxLCM0XQorCWxkcgkkdDMsWyR0MSwjOF0KKwlsZHIJJHQ0LFskdDEsIzEyXQorCWFkZAkkQSwkQSwkdDAJCQlAIGFjY3VtdWxhdGUKKwlsZHIJJHQwLFskdDEsIzE2XQorCWFkZAkkQiwkQiwkdDIKKwlsZHIJJHQyLFskdDEsIzIwXQorCWFkZAkkQywkQywkdDMKKwlsZHIJJHQzLFskdDEsIzI0XQorCWFkZAkkRCwkRCwkdDQKKwlsZHIJJHQ0LFskdDEsIzI4XQorCWFkZAkkRSwkRSwkdDAKKwlzdHIJJEEsWyR0MV0sIzQKKwlhZGQJJEYsJEYsJHQyCisJc3RyCSRCLFskdDFdLCM0CisJYWRkCSRHLCRHLCR0MworCXN0cgkkQyxbJHQxXSwjNAorCWFkZAkkSCwkSCwkdDQKKwlzdHIJJEQsWyR0MV0sIzQKKwlzdG1pYQkkdDEseyRFLSRIfQorCisJbW92bmUJJFhmZXIsc3AKKwlsZHJuZQkkdDEsW3NwLCMwXQorCWVvcm5lCSR0MiwkdDIsJHQyCisJbGRyZXEJc3AsW3NwLCM3Nl0JCQlAIHJlc3RvcmUgb3JpZ2luYWwgc3AKKwllb3JuZQkkdDMsJEIsJEMKKwlibmUJLkxfMDBfNDgKKworCWxkbWlhCXNwISx7cjQtcjEyLHBjfQorI2VuZGlmCitfX18KK319fQorJGNvZGUuPTw8X19fOworLnNpemUgICBzaGEyNTZfYmxvY2tfZGF0YV9vcmRlciwuLXNoYTI1Nl9ibG9ja19kYXRhX29yZGVyCisuYXNjaXogICJTSEEyNTYgYmxvY2sgdHJhbnNmb3JtIGZvciBBUk12NC9ORU9OLCBDUllQVE9HQU1TIGJ5IDxhcHByb1xAb3BlbnNzbC5vcmc+IgorLmFsaWduCTIKKy5jb21tICAgT1BFTlNTTF9hcm1jYXBfUCw0LDQKKworI2VuZGlmCitfX18KKworJGNvZGUgPX4gcy9cYChbXlxgXSopXGAvZXZhbCAkMS9nZW07CiskY29kZSA9fiBzL1xiYnhccytsclxiLy53b3JkXHQweGUxMmZmZjFlL2dtOwkjIG1ha2UgaXQgcG9zc2libGUgdG8gY29tcGlsZSB3aXRoIC1tYXJjaD1hcm12NAorcHJpbnQgJGNvZGU7CitjbG9zZSBTVERPVVQ7ICMgZW5mb3JjZSBmbHVzaApkaWZmIC0tZ2l0IGEvY3J5cHRvL3NoYS9hc20vc2hhNTEyLTU4Ni5wbCBiL2NyeXB0by9zaGEvYXNtL3NoYTUxMi01ODYucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZjNzkyOQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zaGEvYXNtL3NoYTUxMi01ODYucGwKQEAgLTAsMCArMSw5MTAgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKyMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgV3JpdHRlbiBieSBBbmR5IFBvbHlha292IDxhcHByb0BvcGVuc3NsLm9yZz4gZm9yIHRoZSBPcGVuU1NMCisjIHByb2plY3QuIFRoZSBtb2R1bGUgaXMsIGhvd2V2ZXIsIGR1YWwgbGljZW5zZWQgdW5kZXIgT3BlblNTTCBhbmQKKyMgQ1JZUFRPR0FNUyBsaWNlbnNlcyBkZXBlbmRpbmcgb24gd2hlcmUgeW91IG9idGFpbiBpdC4gRm9yIGZ1cnRoZXIKKyMgZGV0YWlscyBzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+YXBwcm8vY3J5cHRvZ2Ftcy8uCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFNIQTUxMiBibG9jayB0cmFuc2Zvcm0gZm9yIHg4Ni4gU2VwdGVtYmVyIDIwMDcuCisjCisjIE1heSAyMDEzLgorIworIyBBZGQgU1NTRTMgY29kZSBwYXRoLCAyMC0yNSUgaW1wcm92ZW1lbnQgW292ZXIgb3JpZ2luYWwgU1NFMiBjb2RlXS4KKyMKKyMgUGVyZm9ybWFuY2UgaW4gY2xvY2sgY3ljbGVzIHBlciBwcm9jZXNzZWQgYnl0ZSAobGVzcyBpcyBiZXR0ZXIpOgorIworIwkJZ2NjCWljYwl4ODYgYXNtCVNJTUQoKikJeDg2XzY0KCoqKQorIyBQZW50aXVtCTEwMAk5Nwk2MQktCS0KKyMgUElJSQkJNzUJNzcJNTYJLQktCisjIFA0CQkxMTYJOTUJODIJMzQuNgkzMC44CisjIEFNRCBLOAk1NAk1NQkzNgkyMC43CTkuNTcKKyMgQ29yZTIJCTY2CTU3CTQwCTE1LjkJOS45NworIyBXZXN0bWVyZQk3MAktCTM4CTEyLjIJOS41OAorIyBTYW5keSBCcmlkZ2UJNTgJLQkzNQkxMS45CTExLjIKKyMgSXZ5IEJyaWRnZQk1MAktCTMzCTExLjUJOC4xNworIyBIYXN3ZWxsCTQ2CS0JMjkJMTEuMwk3LjY2CisjIEJ1bGxkb3plcgkxMjEJLQk1MAkxNC4wCTEzLjUKKyMgVklBIE5hbm8JOTEJLQk1MgkzMwkxNC43CisjIEF0b20JCTEyNgktCTY4CTQ4KCoqKikJMTQuNworIworIyAoKikJd2hpY2hldmVyIGJlc3QgYXBwbGljYWJsZS4KKyMgKCoqKQl4ODZfNjQgYXNzZW1ibGVyIHBlcmZvcm1hbmNlIGlzIHByZXNlbnRlZCBmb3IgcmVmZXJlbmNlCisjCXB1cnBvc2VzLCB0aGUgcmVzdWx0cyBhcmUgZm9yIGludGVnZXItb25seSBjb2RlLgorIyAoKioqKQlwYWRkcSBpcyBpbmNyZWFkaWJseSBzbG93IG9uIEF0b20uCisjCisjIElBTFUgY29kZS1wYXRoIGlzIG9wdGltaXplZCBmb3IgZWxkZXIgUGVudGl1bXMuIE9uIHZhbmlsbGEgUGVudGl1bQorIyBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBvdmVyIGNvbXBpbGVyIGdlbmVyYXRlZCBjb2RlIHJlYWNoZXMgfjYwJSwKKyMgd2hpbGUgb24gUElJSSAtIH4zNSUuIE9uIG5ld2VyILUtYXJjaHMgaW1wcm92ZW1lbnQgdmFyaWVzIGZyb20gMTUlCisjIHRvIDUwJSwgYnV0IGl0J3MgbGVzcyBpbXBvcnRhbnQgYXMgdGhleSBhcmUgZXhwZWN0ZWQgdG8gZXhlY3V0ZSBTU0UyCisjIGNvZGUtcGF0aCwgd2hpY2ggaXMgY29tbW9ubHkgfjItM3ggZmFzdGVyIFt0aGFuIGNvbXBpbGVyIGdlbmVyYXRlZAorIyBjb2RlXS4gU1NFMiBjb2RlLXBhdGggaXMgYXMgZmFzdCBhcyBvcmlnaW5hbCBzaGE1MTItc3NlMi5wbCwgZXZlbgorIyB0aG91Z2ggaXQgZG9lcyBub3QgdXNlIDEyOC1iaXQgb3BlcmF0aW9ucy4gVGhlIGxhdHRlciBtZWFucyB0aGF0CisjIFNTRTItYXdhcmUga2VybmVsIGlzIG5vIGxvbmdlciByZXF1aXJlZCB0byBleGVjdXRlIHRoZSBjb2RlLiBBbm90aGVyCisjIGRpZmZlcmVuY2UgaXMgdGhhdCBuZXcgY29kZSBvcHRpbWl6ZXMgYW1vdW50IG9mIHdyaXRlcywgYnV0IGF0IHRoZQorIyBjb3N0IG9mIGluY3JlYXNlZCBkYXRhIGNhY2hlICJmb290cHJpbnQiIGJ5IDEvMktCLgorCiskMCA9fiBtLyguKltcL1xcXSlbXlwvXFxdKyQvOyAkZGlyPSQxOworcHVzaChASU5DLCIke2Rpcn0iLCIke2Rpcn0uLi8uLi9wZXJsYXNtIik7CityZXF1aXJlICJ4ODZhc20ucGwiOworCismYXNtX2luaXQoJEFSR1ZbMF0sInNoYTUxMi01ODYucGwiLCRBUkdWWyQjQVJHVl0gZXEgIjM4NiIpOworCiskc3NlMj0wOworZm9yIChAQVJHVikgeyAkc3NlMj0xIGlmICgvLURPUEVOU1NMX0lBMzJfU1NFMi8pOyB9CisKKyZleHRlcm5hbF9sYWJlbCgiT1BFTlNTTF9pYTMyY2FwX1AiKSBpZiAoJHNzZTIpOworCiskVGxvPSZEV1AoMCwiZXNwIik7CSRUaGk9JkRXUCg0LCJlc3AiKTsKKyRBbG89JkRXUCg4LCJlc3AiKTsJJEFoaT0mRFdQKDgrNCwiZXNwIik7CiskQmxvPSZEV1AoMTYsImVzcCIpOwkkQmhpPSZEV1AoMTYrNCwiZXNwIik7CiskQ2xvPSZEV1AoMjQsImVzcCIpOwkkQ2hpPSZEV1AoMjQrNCwiZXNwIik7CiskRGxvPSZEV1AoMzIsImVzcCIpOwkkRGhpPSZEV1AoMzIrNCwiZXNwIik7CiskRWxvPSZEV1AoNDAsImVzcCIpOwkkRWhpPSZEV1AoNDArNCwiZXNwIik7CiskRmxvPSZEV1AoNDgsImVzcCIpOwkkRmhpPSZEV1AoNDgrNCwiZXNwIik7CiskR2xvPSZEV1AoNTYsImVzcCIpOwkkR2hpPSZEV1AoNTYrNCwiZXNwIik7CiskSGxvPSZEV1AoNjQsImVzcCIpOwkkSGhpPSZEV1AoNjQrNCwiZXNwIik7CiskSzUxMj0iZWJwIjsKKworJEFzc2UyPSZRV1AoMCwiZXNwIik7CiskQnNzZTI9JlFXUCg4LCJlc3AiKTsKKyRDc3NlMj0mUVdQKDE2LCJlc3AiKTsKKyREc3NlMj0mUVdQKDI0LCJlc3AiKTsKKyRFc3NlMj0mUVdQKDMyLCJlc3AiKTsKKyRGc3NlMj0mUVdQKDQwLCJlc3AiKTsKKyRHc3NlMj0mUVdQKDQ4LCJlc3AiKTsKKyRIc3NlMj0mUVdQKDU2LCJlc3AiKTsKKworJEE9Im1tMCI7CSMgQi1EIGFuZAorJEU9Im1tNCI7CSMgRi1IIGFyZSBjb21tb25seSBsb2FkZWQgdG8gcmVzcGVjdGl2ZWx5IG1tMS1tbTMgYW5kCisJCSMgbW01LW1tNywgYnV0IGl0J3MgZG9uZSBvbiBvbi1kZW1hbmQgYmFzaXMuLi4KKyRCeEM9Im1tMiI7CSMgLi4uIGV4Y2VwdCBmb3IgQl5DCisKK3N1YiBCT0RZXzAwXzE1X3NzZTIgeworICAgIG15ICRwaGFzZT1zaGlmdDsKKworCSMmbW92cQkoIm1tNSIsJEZzc2UyKTsJCQkjIGxvYWQgZgorCSMmbW92cQkoIm1tNiIsJEdzc2UyKTsJCQkjIGxvYWQgZworCisJJm1vdnEJKCJtbTEiLCRFKTsJCQkjICVtbTEgaXMgc2xpZGluZyByaWdodAorCSAmcHhvcgkoIm1tNSIsIm1tNiIpOwkJCSMgZl49ZworCSZwc3JscQkoIm1tMSIsMTQpOworCSAmbW92cQkoJEVzc2UyLCRFKTsJCQkjIG1vZHVsby1zY2hlZHVsZWQgc2F2ZSBlCisJICZwYW5kCSgibW01IiwkRSk7CQkJIyBmJj1lCisJJnBzbGxxCSgkRSwyMyk7CQkJIyAkRSBpcyBzbGlkaW5nIGxlZnQKKwkgJm1vdnEJKCRBLCJtbTMiKQkJCWlmICgkcGhhc2U8Mik7CisJICZtb3ZxCSgmUVdQKDgqOSwiZXNwIiksIm1tNyIpCQkjIHNhdmUgWFtpXQorCSZtb3ZxCSgibW0zIiwibW0xIik7CQkJIyAlbW0zIGlzIFQxCisJICZwc3JscQkoIm1tMSIsNCk7CisJICZweG9yCSgibW01IiwibW02Iik7CQkJIyBDaChlLGYsZykKKwkmcHhvcgkoIm1tMyIsJEUpOworCSAmcHNsbHEJKCRFLDIzKTsKKwkmcHhvcgkoIm1tMyIsIm1tMSIpOworCSAmbW92cQkoJEFzc2UyLCRBKTsJCQkjIG1vZHVsby1zY2hlZHVsZWQgc2F2ZSBhCisJICZwYWRkcQkoIm1tNyIsIm1tNSIpOwkJCSMgWFtpXSs9Q2goZSxmLGcpCisJJnB4b3IJKCJtbTMiLCRFKTsKKwkgJnBzcmxxCSgibW0xIiwyMyk7CisJICZwYWRkcQkoIm1tNyIsJEhzc2UyKTsJCQkjIFhbaV0rPWgKKwkmcHhvcgkoIm1tMyIsIm1tMSIpOworCSAmcHNsbHEJKCRFLDQpOworCSAmcGFkZHEJKCJtbTciLFFXUCgwLCRLNTEyKSk7CQkjIFhbaV0rPUs1MTJbaV0KKwkmcHhvcgkoIm1tMyIsJEUpOwkJCSMgVDE9U2lnbWExXzUxMihlKQorCisJICZtb3ZxCSgkRSwkRHNzZTIpOwkJCSMgZSA9IGxvYWQgZCwgZSBpbiBuZXh0IHJvdW5kCisJJnBhZGRxCSgibW0zIiwibW03Iik7CQkJIyBUMSs9WFtpXQorCSAmbW92cQkoIm1tNSIsJEEpOwkJCSMgJW1tNSBpcyBzbGlkaW5nIHJpZ2h0CisJICZwc3JscQkoIm1tNSIsMjgpOworCSZwYWRkcQkoJEUsIm1tMyIpOwkJCSMgZCArPSBUMQorCSAmbW92cQkoIm1tNiIsJEEpOwkJCSMgJW1tNiBpcyBzbGlkaW5nIGxlZnQKKwkgJm1vdnEJKCJtbTciLCJtbTUiKTsKKwkgJnBzbGxxCSgibW02IiwyNSk7CisJJm1vdnEJKCJtbTEiLCRCc3NlMik7CQkJIyBsb2FkIGIKKwkgJnBzcmxxCSgibW01Iiw2KTsKKwkgJnB4b3IJKCJtbTciLCJtbTYiKTsKKwkmc3ViCSgiZXNwIiw4KTsKKwkgJnBzbGxxCSgibW02Iiw1KTsKKwkgJnB4b3IJKCJtbTciLCJtbTUiKTsKKwkmcHhvcgkoJEEsIm1tMSIpOwkJCSMgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCSAmcHNybHEJKCJtbTUiLDUpOworCSAmcHhvcgkoIm1tNyIsIm1tNiIpOworCSZwYW5kCSgkQnhDLCRBKTsJCQkjIChiXmMpJihhXmIpCisJICZwc2xscQkoIm1tNiIsNik7CisJICZweG9yCSgibW03IiwibW01Iik7CisJJnB4b3IJKCRCeEMsIm1tMSIpOwkJCSMgW2g9XU1haihhLGIsYykKKwkgJnB4b3IJKCJtbTYiLCJtbTciKTsJCQkjIFNpZ21hMF81MTIoYSkKKwkgJm1vdnEJKCJtbTciLCZRV1AoOCooOSsxNi0xKSwiZXNwIikpCWlmICgkcGhhc2UhPTApOwkjIHByZS1mZXRjaAorCSAmbW92cQkoIm1tNSIsJEZzc2UyKQkJCWlmICgkcGhhc2U9PTApOwkjIGxvYWQgZgorCisgICAgaWYgKCRwaGFzZT4xKSB7CisJJnBhZGRxCSgkQnhDLCJtbTYiKTsJCQkjIGgrPVNpZ21hMChhKQorCSAmYWRkCSgkSzUxMiw4KTsKKwkjJnBhZGRxCSgkQnhDLCJtbTMiKTsJCQkjIGgrPVQxCisKKwkoJEEsJEJ4QykgPSAoJEJ4QywkQSk7CQkJIyByb3RhdGUgcmVnaXN0ZXJzCisgICAgfSBlbHNlIHsKKwkmcGFkZHEJKCJtbTMiLCRCeEMpOwkJCSMgVDErPU1haihhLGIsYykKKwkgJm1vdnEJKCRCeEMsJEEpOworCSAmYWRkCSgkSzUxMiw4KTsKKwkmcGFkZHEJKCJtbTMiLCJtbTYiKTsJCQkjIFQxKz1TaWdtYTAoYSkKKwkgJm1vdnEJKCJtbTYiLCRHc3NlMikJCQlpZiAoJHBoYXNlPT0wKTsJIyBsb2FkIGcKKwkjJm1vdnEJKCRBLCJtbTMiKTsJCQkjIGg9VDEKKyAgICB9Cit9CisKK3N1YiBCT0RZXzAwXzE1X3g4NiB7CisJI2RlZmluZSBTaWdtYTEoeCkJKFJPVFIoKHgpLDE0KSBeIFJPVFIoKHgpLDE4KSAgXiBST1RSKCh4KSw0MSkpCisJIwlMTwkJbG8+PjE0XmhpPDwxOCBeIGxvPj4xOF5oaTw8MTQgXiBoaT4+OV5sbzw8MjMKKwkjCUhJCQloaT4+MTRebG88PDE4IF4gaGk+PjE4XmxvPDwxNCBeIGxvPj45XmhpPDwyMworCSZtb3YJKCJlY3giLCRFbG8pOworCSZtb3YJKCJlZHgiLCRFaGkpOworCSZtb3YJKCJlc2kiLCJlY3giKTsKKworCSZzaHIJKCJlY3giLDkpOwkjIGxvPj45CisJJm1vdgkoImVkaSIsImVkeCIpOworCSZzaHIJKCJlZHgiLDkpOwkjIGhpPj45CisJJm1vdgkoImVieCIsImVjeCIpOworCSZzaGwJKCJlc2kiLDE0KTsJIyBsbzw8MTQKKwkmbW92CSgiZWF4IiwiZWR4Iik7CisJJnNobAkoImVkaSIsMTQpOwkjIGhpPDwxNAorCSZ4b3IJKCJlYngiLCJlc2kiKTsKKworCSZzaHIJKCJlY3giLDE0LTkpOwkjIGxvPj4xNAorCSZ4b3IJKCJlYXgiLCJlZGkiKTsKKwkmc2hyCSgiZWR4IiwxNC05KTsJIyBoaT4+MTQKKwkmeG9yCSgiZWF4IiwiZWN4Iik7CisJJnNobAkoImVzaSIsMTgtMTQpOwkjIGxvPDwxOAorCSZ4b3IJKCJlYngiLCJlZHgiKTsKKwkmc2hsCSgiZWRpIiwxOC0xNCk7CSMgaGk8PDE4CisJJnhvcgkoImVieCIsImVzaSIpOworCisJJnNocgkoImVjeCIsMTgtMTQpOwkjIGxvPj4xOAorCSZ4b3IJKCJlYXgiLCJlZGkiKTsKKwkmc2hyCSgiZWR4IiwxOC0xNCk7CSMgaGk+PjE4CisJJnhvcgkoImVheCIsImVjeCIpOworCSZzaGwJKCJlc2kiLDIzLTE4KTsJIyBsbzw8MjMKKwkmeG9yCSgiZWJ4IiwiZWR4Iik7CisJJnNobAkoImVkaSIsMjMtMTgpOwkjIGhpPDwyMworCSZ4b3IJKCJlYXgiLCJlc2kiKTsKKwkmeG9yCSgiZWJ4IiwiZWRpIik7CQkJIyBUMSA9IFNpZ21hMShlKQorCisJJm1vdgkoImVjeCIsJEZsbyk7CisJJm1vdgkoImVkeCIsJEZoaSk7CisJJm1vdgkoImVzaSIsJEdsbyk7CisJJm1vdgkoImVkaSIsJEdoaSk7CisJICZhZGQJKCJlYXgiLCRIbG8pOworCSAmYWRjCSgiZWJ4IiwkSGhpKTsJCQkjIFQxICs9IGgKKwkmeG9yCSgiZWN4IiwiZXNpIik7CisJJnhvcgkoImVkeCIsImVkaSIpOworCSZhbmQJKCJlY3giLCRFbG8pOworCSZhbmQJKCJlZHgiLCRFaGkpOworCSAmYWRkCSgiZWF4IiwmRFdQKDgqKDkrMTUpKzAsImVzcCIpKTsKKwkgJmFkYwkoImVieCIsJkRXUCg4Kig5KzE1KSs0LCJlc3AiKSk7CSMgVDEgKz0gWFswXQorCSZ4b3IJKCJlY3giLCJlc2kiKTsKKwkmeG9yCSgiZWR4IiwiZWRpIik7CQkJIyBDaChlLGYsZykgPSAoZl5nKSZlKV5nCisKKwkmbW92CSgiZXNpIiwmRFdQKDAsJEs1MTIpKTsKKwkmbW92CSgiZWRpIiwmRFdQKDQsJEs1MTIpKTsJCSMgS1tpXQorCSZhZGQJKCJlYXgiLCJlY3giKTsKKwkmYWRjCSgiZWJ4IiwiZWR4Iik7CQkJIyBUMSArPSBDaChlLGYsZykKKwkmbW92CSgiZWN4IiwkRGxvKTsKKwkmbW92CSgiZWR4IiwkRGhpKTsKKwkmYWRkCSgiZWF4IiwiZXNpIik7CisJJmFkYwkoImVieCIsImVkaSIpOwkJCSMgVDEgKz0gS1tpXQorCSZtb3YJKCRUbG8sImVheCIpOworCSZtb3YJKCRUaGksImVieCIpOwkJCSMgcHV0IFQxIGF3YXkKKwkmYWRkCSgiZWF4IiwiZWN4Iik7CisJJmFkYwkoImVieCIsImVkeCIpOwkJCSMgZCArPSBUMQorCisJI2RlZmluZSBTaWdtYTAoeCkJKFJPVFIoKHgpLDI4KSBeIFJPVFIoKHgpLDM0KSBeIFJPVFIoKHgpLDM5KSkKKwkjCUxPCQlsbz4+MjheaGk8PDQgIF4gaGk+PjJebG88PDMwIF4gaGk+PjdebG88PDI1CisJIwlISQkJaGk+PjI4XmxvPDw0ICBeIGxvPj4yXmhpPDwzMCBeIGxvPj43XmhpPDwyNQorCSZtb3YJKCJlY3giLCRBbG8pOworCSZtb3YJKCJlZHgiLCRBaGkpOworCSZtb3YJKCREbG8sImVheCIpOworCSZtb3YJKCREaGksImVieCIpOworCSZtb3YJKCJlc2kiLCJlY3giKTsKKworCSZzaHIJKCJlY3giLDIpOwkjIGxvPj4yCisJJm1vdgkoImVkaSIsImVkeCIpOworCSZzaHIJKCJlZHgiLDIpOwkjIGhpPj4yCisJJm1vdgkoImVieCIsImVjeCIpOworCSZzaGwJKCJlc2kiLDQpOwkjIGxvPDw0CisJJm1vdgkoImVheCIsImVkeCIpOworCSZzaGwJKCJlZGkiLDQpOwkjIGhpPDw0CisJJnhvcgkoImVieCIsImVzaSIpOworCisJJnNocgkoImVjeCIsNy0yKTsJIyBsbz4+NworCSZ4b3IJKCJlYXgiLCJlZGkiKTsKKwkmc2hyCSgiZWR4Iiw3LTIpOwkjIGhpPj43CisJJnhvcgkoImVieCIsImVjeCIpOworCSZzaGwJKCJlc2kiLDI1LTQpOwkjIGxvPDwyNQorCSZ4b3IJKCJlYXgiLCJlZHgiKTsKKwkmc2hsCSgiZWRpIiwyNS00KTsJIyBoaTw8MjUKKwkmeG9yCSgiZWF4IiwiZXNpIik7CisKKwkmc2hyCSgiZWN4IiwyOC03KTsJIyBsbz4+MjgKKwkmeG9yCSgiZWJ4IiwiZWRpIik7CisJJnNocgkoImVkeCIsMjgtNyk7CSMgaGk+PjI4CisJJnhvcgkoImVheCIsImVjeCIpOworCSZzaGwJKCJlc2kiLDMwLTI1KTsJIyBsbzw8MzAKKwkmeG9yCSgiZWJ4IiwiZWR4Iik7CisJJnNobAkoImVkaSIsMzAtMjUpOwkjIGhpPDwzMAorCSZ4b3IJKCJlYXgiLCJlc2kiKTsKKwkmeG9yCSgiZWJ4IiwiZWRpIik7CQkJIyBTaWdtYTAoYSkKKworCSZtb3YJKCJlY3giLCRBbG8pOworCSZtb3YJKCJlZHgiLCRBaGkpOworCSZtb3YJKCJlc2kiLCRCbG8pOworCSZtb3YJKCJlZGkiLCRCaGkpOworCSZhZGQJKCJlYXgiLCRUbG8pOworCSZhZGMJKCJlYngiLCRUaGkpOwkJCSMgVDEgPSBTaWdtYTAoYSkrVDEKKwkmb3IJKCJlY3giLCJlc2kiKTsKKwkmb3IJKCJlZHgiLCJlZGkiKTsKKwkmYW5kCSgiZWN4IiwkQ2xvKTsKKwkmYW5kCSgiZWR4IiwkQ2hpKTsKKwkmYW5kCSgiZXNpIiwkQWxvKTsKKwkmYW5kCSgiZWRpIiwkQWhpKTsKKwkmb3IJKCJlY3giLCJlc2kiKTsKKwkmb3IJKCJlZHgiLCJlZGkiKTsJCQkjIE1haihhLGIsYykgPSAoKGF8YikmYyl8KGEmYikKKworCSZhZGQJKCJlYXgiLCJlY3giKTsKKwkmYWRjCSgiZWJ4IiwiZWR4Iik7CQkJIyBUMSArPSBNYWooYSxiLGMpCisJJm1vdgkoJFRsbywiZWF4Iik7CisJJm1vdgkoJFRoaSwiZWJ4Iik7CisKKwkmbW92CSgmTEIoImVkeCIpLCZCUCgwLCRLNTEyKSk7CSMgcHJlLWZldGNoIExTQiBvZiAqSworCSZzdWIJKCJlc3AiLDgpOworCSZsZWEJKCRLNTEyLCZEV1AoOCwkSzUxMikpOwkJIyBLKysKK30KKworCismZnVuY3Rpb25fYmVnaW4oInNoYTUxMl9ibG9ja19kYXRhX29yZGVyIik7CisJJm1vdgkoImVzaSIsd3BhcmFtKDApKTsJIyBjdHgKKwkmbW92CSgiZWRpIix3cGFyYW0oMSkpOwkjIGlucAorCSZtb3YJKCJlYXgiLHdwYXJhbSgyKSk7CSMgbnVtCisJJm1vdgkoImVieCIsImVzcCIpOwkJIyBzYXZlZCBzcAorCisJJmNhbGwJKCZsYWJlbCgicGljX3BvaW50IikpOwkjIG1ha2UgaXQgUElDIQorJnNldF9sYWJlbCgicGljX3BvaW50Iik7CisJJmJsaW5kcG9wKCRLNTEyKTsKKwkmbGVhCSgkSzUxMiwmRFdQKCZsYWJlbCgiSzUxMiIpLiItIi4mbGFiZWwoInBpY19wb2ludCIpLCRLNTEyKSk7CisKKwkmc3ViCSgiZXNwIiwxNik7CisJJmFuZAkoImVzcCIsLTY0KTsKKworCSZzaGwJKCJlYXgiLDcpOworCSZhZGQJKCJlYXgiLCJlZGkiKTsKKwkmbW92CSgmRFdQKDAsImVzcCIpLCJlc2kiKTsJIyBjdHgKKwkmbW92CSgmRFdQKDQsImVzcCIpLCJlZGkiKTsJIyBpbnAKKwkmbW92CSgmRFdQKDgsImVzcCIpLCJlYXgiKTsJIyBpbnArbnVtKjEyOAorCSZtb3YJKCZEV1AoMTIsImVzcCIpLCJlYngiKTsJIyBzYXZlZCBzcAorCitpZiAoJHNzZTIpIHsKKwkmcGljbWV1cCgiZWR4IiwiT1BFTlNTTF9pYTMyY2FwX1AiLCRLNTEyLCZsYWJlbCgiSzUxMiIpKTsKKwkmbW92CSgiZWN4IiwmRFdQKDAsImVkeCIpKTsKKwkmdGVzdAkoImVjeCIsMTw8MjYpOworCSZqegkoJmxhYmVsKCJsb29wX3g4NiIpKTsKKworCSZtb3YJKCJlZHgiLCZEV1AoNCwiZWR4IikpOworCisJIyBsb2FkIGN0eC0+aFswLTddCisJJm1vdnEJKCRBLCZRV1AoMCwiZXNpIikpOworCSAmYW5kCSgiZWN4IiwxPDwyNCk7CQkjIFhNTSByZWdpc3RlcnMgYXZhaWxhYmlsaXR5CisJJm1vdnEJKCJtbTEiLCZRV1AoOCwiZXNpIikpOworCSAmYW5kCSgiZWR4IiwxPDw5KTsJCSMgU1NTRTMgYml0CisJJm1vdnEJKCRCeEMsJlFXUCgxNiwiZXNpIikpOworCSAmb3IJKCJlY3giLCJlZHgiKTsKKwkmbW92cQkoIm1tMyIsJlFXUCgyNCwiZXNpIikpOworCSZtb3ZxCSgkRSwmUVdQKDMyLCJlc2kiKSk7CisJJm1vdnEJKCJtbTUiLCZRV1AoNDAsImVzaSIpKTsKKwkmbW92cQkoIm1tNiIsJlFXUCg0OCwiZXNpIikpOworCSZtb3ZxCSgibW03IiwmUVdQKDU2LCJlc2kiKSk7CisJJmNtcAkoImVjeCIsMTw8MjR8MTw8OSk7CisJJmplCSgmbGFiZWwoIlNTU0UzIikpOworCSZzdWIJKCJlc3AiLDgqMTApOworCSZqbXAJKCZsYWJlbCgibG9vcF9zc2UyIikpOworCismc2V0X2xhYmVsKCJsb29wX3NzZTIiLDE2KTsKKwkjJm1vdnEJKCRBc3NlMiwkQSk7CisJJm1vdnEJKCRCc3NlMiwibW0xIik7CisJJm1vdnEJKCRDc3NlMiwkQnhDKTsKKwkmbW92cQkoJERzc2UyLCJtbTMiKTsKKwkjJm1vdnEJKCRFc3NlMiwkRSk7CisJJm1vdnEJKCRGc3NlMiwibW01Iik7CisJJm1vdnEJKCRHc3NlMiwibW02Iik7CisJJnB4b3IJKCRCeEMsIm1tMSIpOwkJCSMgbWFnaWMKKwkmbW92cQkoJEhzc2UyLCJtbTciKTsKKwkmbW92cQkoIm1tMyIsJEEpOwkJCSMgbWFnaWMKKworCSZtb3YJKCJlYXgiLCZEV1AoMCwiZWRpIikpOworCSZtb3YJKCJlYngiLCZEV1AoNCwiZWRpIikpOworCSZhZGQJKCJlZGkiLDgpOworCSZtb3YJKCJlZHgiLDE1KTsJCQkjIGNvdW50ZXIKKwkmYnN3YXAJKCJlYXgiKTsKKwkmYnN3YXAJKCJlYngiKTsKKwkmam1wCSgmbGFiZWwoIjAwXzE0X3NzZTIiKSk7CisKKyZzZXRfbGFiZWwoIjAwXzE0X3NzZTIiLDE2KTsKKwkmbW92ZAkoIm1tMSIsImVheCIpOworCSZtb3YJKCJlYXgiLCZEV1AoMCwiZWRpIikpOworCSZtb3ZkCSgibW03IiwiZWJ4Iik7CisJJm1vdgkoImVieCIsJkRXUCg0LCJlZGkiKSk7CisJJmFkZAkoImVkaSIsOCk7CisJJmJzd2FwCSgiZWF4Iik7CisJJmJzd2FwCSgiZWJ4Iik7CisJJnB1bnBja2xkcSgibW03IiwibW0xIik7CisKKwkmQk9EWV8wMF8xNV9zc2UyKCk7CisKKwkmZGVjCSgiZWR4Iik7CisJJmpuegkoJmxhYmVsKCIwMF8xNF9zc2UyIikpOworCisJJm1vdmQJKCJtbTEiLCJlYXgiKTsKKwkmbW92ZAkoIm1tNyIsImVieCIpOworCSZwdW5wY2tsZHEoIm1tNyIsIm1tMSIpOworCisJJkJPRFlfMDBfMTVfc3NlMigxKTsKKworCSZweG9yCSgkQSwkQSk7CQkJIyBBIGlzIGluICVtbTMKKwkmbW92CSgiZWR4IiwzMik7CQkJIyBjb3VudGVyCisJJmptcAkoJmxhYmVsKCIxNl83OV9zc2UyIikpOworCismc2V0X2xhYmVsKCIxNl83OV9zc2UyIiwxNik7CisgICAgZm9yICgkaj0wOyRqPDI7JGorKykgewkJCSMgMnggdW5yb2xsCisJIyZtb3ZxCSgibW03IiwmUVdQKDgqKDkrMTYtMSksImVzcCIpKTsJIyBwcmVmZXRjaGVkIGluIEJPRFlfMDBfMTUgCisJJm1vdnEJKCJtbTUiLCZRV1AoOCooOSsxNi0xNCksImVzcCIpKTsKKwkmbW92cQkoIm1tMSIsIm1tNyIpOworCSZwc3JscQkoIm1tNyIsMSk7CisJICZtb3ZxCSgibW02IiwibW01Iik7CisJICZwc3JscQkoIm1tNSIsNik7CisJJnBzbGxxCSgibW0xIiw1Nik7CisJICZwYWRkcQkoJEEsIm1tMyIpOwkJCSMgZnJvbSBCT0RZXzAwXzE1CisJICZtb3ZxCSgibW0zIiwibW03Iik7CisJJnBzcmxxCSgibW03Iiw3LTEpOworCSAmcHhvcgkoIm1tMyIsIm1tMSIpOworCSAmcHNsbHEJKCJtbTEiLDYzLTU2KTsKKwkmcHhvcgkoIm1tMyIsIm1tNyIpOworCSAmcHNybHEJKCJtbTciLDgtNyk7CisJJnB4b3IJKCJtbTMiLCJtbTEiKTsKKwkgJm1vdnEJKCJtbTEiLCJtbTUiKTsKKwkgJnBzcmxxCSgibW01IiwxOS02KTsKKwkmcHhvcgkoIm1tNyIsIm1tMyIpOwkJCSMgc2lnbWEwCisKKwkgJnBzbGxxCSgibW02IiwzKTsKKwkgJnB4b3IJKCJtbTEiLCJtbTUiKTsKKwkmcGFkZHEJKCJtbTciLCZRV1AoOCooOSsxNiksImVzcCIpKTsKKwkgJnB4b3IJKCJtbTEiLCJtbTYiKTsKKwkgJnBzcmxxCSgibW01Iiw2MS0xOSk7CisJJnBhZGRxCSgibW03IiwmUVdQKDgqKDkrMTYtOSksImVzcCIpKTsKKwkgJnB4b3IJKCJtbTEiLCJtbTUiKTsKKwkgJnBzbGxxCSgibW02Iiw0NS0zKTsKKwkmbW92cQkoIm1tNSIsJEZzc2UyKTsJCQkjIGxvYWQgZgorCSAmcHhvcgkoIm1tMSIsIm1tNiIpOwkJCSMgc2lnbWExCisJJm1vdnEJKCJtbTYiLCRHc3NlMik7CQkJIyBsb2FkIGcKKworCSZwYWRkcQkoIm1tNyIsIm1tMSIpOwkJCSMgWFtpXQorCSMmbW92cQkoJlFXUCg4KjksImVzcCIpLCJtbTciKTsJIyBtb3ZlZCB0byBCT0RZXzAwXzE1CisKKwkmQk9EWV8wMF8xNV9zc2UyKDIpOworICAgIH0KKwkmZGVjCSgiZWR4Iik7CisJJmpuegkoJmxhYmVsKCIxNl83OV9zc2UyIikpOworCisJIyZtb3ZxCSgkQSwkQXNzZTIpOworCSZwYWRkcQkoJEEsIm1tMyIpOwkJCSMgZnJvbSBCT0RZXzAwXzE1CisJJm1vdnEJKCJtbTEiLCRCc3NlMik7CisJIyZtb3ZxCSgkQnhDLCRDc3NlMik7CisJJm1vdnEJKCJtbTMiLCREc3NlMik7CisJIyZtb3ZxCSgkRSwkRXNzZTIpOworCSZtb3ZxCSgibW01IiwkRnNzZTIpOworCSZtb3ZxCSgibW02IiwkR3NzZTIpOworCSZtb3ZxCSgibW03IiwkSHNzZTIpOworCisJJnB4b3IJKCRCeEMsIm1tMSIpOwkJCSMgZGUtbWFnaWMKKwkmcGFkZHEJKCRBLCZRV1AoMCwiZXNpIikpOworCSZwYWRkcQkoIm1tMSIsJlFXUCg4LCJlc2kiKSk7CisJJnBhZGRxCSgkQnhDLCZRV1AoMTYsImVzaSIpKTsKKwkmcGFkZHEJKCJtbTMiLCZRV1AoMjQsImVzaSIpKTsKKwkmcGFkZHEJKCRFLCZRV1AoMzIsImVzaSIpKTsKKwkmcGFkZHEJKCJtbTUiLCZRV1AoNDAsImVzaSIpKTsKKwkmcGFkZHEJKCJtbTYiLCZRV1AoNDgsImVzaSIpKTsKKwkmcGFkZHEJKCJtbTciLCZRV1AoNTYsImVzaSIpKTsKKworCSZtb3YJKCJlYXgiLDgqODApOworCSZtb3ZxCSgmUVdQKDAsImVzaSIpLCRBKTsKKwkmbW92cQkoJlFXUCg4LCJlc2kiKSwibW0xIik7CisJJm1vdnEJKCZRV1AoMTYsImVzaSIpLCRCeEMpOworCSZtb3ZxCSgmUVdQKDI0LCJlc2kiKSwibW0zIik7CisJJm1vdnEJKCZRV1AoMzIsImVzaSIpLCRFKTsKKwkmbW92cQkoJlFXUCg0MCwiZXNpIiksIm1tNSIpOworCSZtb3ZxCSgmUVdQKDQ4LCJlc2kiKSwibW02Iik7CisJJm1vdnEJKCZRV1AoNTYsImVzaSIpLCJtbTciKTsKKworCSZsZWEJKCJlc3AiLCZEV1AoMCwiZXNwIiwiZWF4IikpOwkjIGRlc3Ryb3kgZnJhbWUKKwkmc3ViCSgkSzUxMiwiZWF4Iik7CQkJIyByZXdpbmQgSworCisJJmNtcAkoImVkaSIsJkRXUCg4KjEwKzgsImVzcCIpKTsJIyBhcmUgd2UgZG9uZSB5ZXQ/CisJJmpiCSgmbGFiZWwoImxvb3Bfc3NlMiIpKTsKKworCSZtb3YJKCJlc3AiLCZEV1AoOCoxMCsxMiwiZXNwIikpOwkjIHJlc3RvcmUgc3AKKwkmZW1tcwkoKTsKKyZmdW5jdGlvbl9lbmRfQSgpOworCismc2V0X2xhYmVsKCJTU1NFMyIsMzIpOworeyBteSAoJGNudCwkZnJhbWUpPSgiZWN4IiwiZWR4Iik7CisgIG15IEBYPW1hcCgieG1tJF8iLCgwLi43KSk7CisgIG15ICRqOworICBteSAkaT0wOworCisJJmxlYQkoJGZyYW1lLCZEV1AoLTY0LCJlc3AiKSk7CisJJnN1YgkoImVzcCIsMjU2KTsKKworCSMgZml4ZWQgc3RhY2sgZnJhbWUgbGF5b3V0CisJIworCSMgKzAJQSBCIEMgRCBFIEYgRyBICQkjIGJhY2tpbmcgc3RvcmUKKwkjICs2NAlYWzBdK0tbaV0gLi4gWFsxNV0rS1tpXQkjIFhNTS0+TU0geGZlciBhcmVhCisJIyArMTkyCQkJCSMgWE1NIG9mZi1sb2FkIHJpbmcgYnVmZmVyCisJIyArMjU2CQkJCSMgc2F2ZWQgcGFyYW1ldGVycworCisJJm1vdmRxYQkJKEBYWzFdLCZRV1AoODAqOCwkSzUxMikpOwkJIyBieXRlIHN3YXAgbWFzaworCSZtb3ZkcXUJCShAWFswXSwmUVdQKDAsImVkaSIpKTsKKwkmcHNodWZiCQkoQFhbMF0sQFhbMV0pOworICAgIGZvciAoJGo9MDskajw4OyRqKyspIHsKKwkmbW92ZHFhCQkoJlFXUCgxNiooKCRqLTEpJTQpLCRmcmFtZSksQFhbM10pCWlmICgkaj40KTsgIyBvZmYtbG9hZAorCSZtb3ZkcWEJCShAWFszXSwmUVdQKDE2KigkaiU4KSwkSzUxMikpOworCSZtb3ZkcWEJCShAWFsyXSxAWFsxXSkJCQkJaWYgKCRqPDcpOyAjIHBlcnBldHVhdGUgYnl0ZSBzd2FwIG1hc2sKKwkmbW92ZHF1CQkoQFhbMV0sJlFXUCgxNiooJGorMSksImVkaSIpKQkJaWYgKCRqPDcpOyAjIG5leHQgaW5wdXQKKwkmbW92ZHFhCQkoQFhbMV0sJlFXUCgxNiooKCRqKzEpJTQpLCRmcmFtZSkpCWlmICgkaj09Nyk7IyByZXN0b3JlIEBYWzBdCisJJnBhZGRxCQkoQFhbM10sQFhbMF0pOworCSZwc2h1ZmIJCShAWFsxXSxAWFsyXSkJCQkJaWYgKCRqPDcpOworCSZtb3ZkcWEJCSgmUVdQKDE2KigkaiU4KS0xMjgsJGZyYW1lKSxAWFszXSk7CSMgeGZlciBYW2ldK0tbaV0KKworCXB1c2goQFgsc2hpZnQoQFgpKTsJCQkJCSMgcm90YXRlKEBYKQorICAgIH0KKwkjJmptcAkJKCZsYWJlbCgibG9vcF9zc3NlMyIpKTsKKwkmbm9wCQkoKTsKKworJnNldF9sYWJlbCgibG9vcF9zc3NlMyIsMzIpOworCSZtb3ZkcWEJCShAWFsyXSwmUVdQKDE2KigoJGorMSklNCksJGZyYW1lKSk7CSMgcHJlLXJlc3RvcmUgQFhbMV0KKwkmbW92ZHFhCQkoJlFXUCgxNiooKCRqLTEpJTQpLCRmcmFtZSksQFhbM10pOwkjIG9mZi1sb2FkIEBYWzNdCisJJmxlYQkJKCRLNTEyLCZEV1AoMTYqOCwkSzUxMikpOworCisJIyZtb3ZxCSgkQXNzZTIsJEEpOwkJCSMgb2ZmLWxvYWQgQS1ICisJJm1vdnEJKCRCc3NlMiwibW0xIik7CisJICZtb3YJKCJlYngiLCJlZGkiKTsKKwkmbW92cQkoJENzc2UyLCRCeEMpOworCSAmbGVhCSgiZWRpIiwmRFdQKDEyOCwiZWRpIikpOwkjIGFkdmFuY2UgaW5wdXQKKwkmbW92cQkoJERzc2UyLCJtbTMiKTsKKwkgJmNtcAkoImVkaSIsImVheCIpOworCSMmbW92cQkoJEVzc2UyLCRFKTsKKwkmbW92cQkoJEZzc2UyLCJtbTUiKTsKKwkgJmNtb3ZiCSgiZWJ4IiwiZWRpIik7CisJJm1vdnEJKCRHc3NlMiwibW02Iik7CisJICZtb3YJKCJlY3giLDQpOwkJCSMgbG9vcCBjb3VudGVyCisJJnB4b3IJKCRCeEMsIm1tMSIpOwkJCSMgbWFnaWMKKwkmbW92cQkoJEhzc2UyLCJtbTciKTsKKwkmcHhvcgkoIm1tMyIsIm1tMyIpOwkJCSMgbWFnaWMKKworCSZqbXAJCSgmbGFiZWwoIjAwXzQ3X3Nzc2UzIikpOworCitzdWIgQk9EWV8wMF8xNV9zc3NlMyB7CQkjICJwaGFzZS1sZXNzIiBjb3B5IG9mIEJPRFlfMDBfMTVfc3NlMgorCSgKKwknJm1vdnEJKCJtbTEiLCRFKScsCQkJCSMgJW1tMSBpcyBzbGlkaW5nIHJpZ2h0CisJJyZtb3ZxCSgibW03IiwmUVdQKCgoLTgqJGkpJTEyOCktMTI4LCRmcmFtZSkpJywjIFhbaV0rS1tpXQorCSAnJnB4b3IJKCJtbTUiLCJtbTYiKScsCQkJCSMgZl49ZworCScmcHNybHEJKCJtbTEiLDE0KScsCisJICcmbW92cQkoJlFXUCg4KigkaSs0KSU2NCwiZXNwIiksJEUpJywJCSMgbW9kdWxvLXNjaGVkdWxlZCBzYXZlIGUKKwkgJyZwYW5kCSgibW01IiwkRSknLAkJCQkjIGYmPWUKKwknJnBzbGxxCSgkRSwyMyknLAkJCQkjICRFIGlzIHNsaWRpbmcgbGVmdAorCScmcGFkZHEJKCRBLCJtbTMiKScsCQkJCSMgW2grPU1haihhLGIsYyldCisJJyZtb3ZxCSgibW0zIiwibW0xIiknLAkJCQkjICVtbTMgaXMgVDEKKwkgJyZwc3JscSgibW0xIiw0KScsCisJICcmcHhvcgkoIm1tNSIsIm1tNiIpJywJCQkJIyBDaChlLGYsZykKKwknJnB4b3IJKCJtbTMiLCRFKScsCisJICcmcHNsbHEoJEUsMjMpJywKKwknJnB4b3IJKCJtbTMiLCJtbTEiKScsCisJICcmbW92cQkoJlFXUCg4KiRpJTY0LCJlc3AiKSwkQSknLAkJIyBtb2R1bG8tc2NoZWR1bGVkIHNhdmUgYQorCSAnJnBhZGRxKCJtbTciLCJtbTUiKScsCQkJCSMgWFtpXSs9Q2goZSxmLGcpCisJJyZweG9yCSgibW0zIiwkRSknLAorCSAnJnBzcmxxKCJtbTEiLDIzKScsCisJICcmcGFkZHEoIm1tNyIsJlFXUCg4KigkaSs3KSU2NCwiZXNwIikpJywJIyBYW2ldKz1oCisJJyZweG9yCSgibW0zIiwibW0xIiknLAorCSAnJnBzbGxxKCRFLDQpJywKKwknJnB4b3IJKCJtbTMiLCRFKScsCQkJCSMgVDE9U2lnbWExXzUxMihlKQorCisJICcmbW92cQkoJEUsJlFXUCg4KigkaSszKSU2NCwiZXNwIikpJywJCSMgZSA9IGxvYWQgZCwgZSBpbiBuZXh0IHJvdW5kCisJJyZwYWRkcQkoIm1tMyIsIm1tNyIpJywJCQkJIyBUMSs9WFtpXQorCSAnJm1vdnEJKCJtbTUiLCRBKScsCQkJCSMgJW1tNSBpcyBzbGlkaW5nIHJpZ2h0CisJICcmcHNybHEoIm1tNSIsMjgpJywKKwknJnBhZGRxCSgkRSwibW0zIiknLAkJCQkjIGQgKz0gVDEKKwkgJyZtb3ZxCSgibW02IiwkQSknLAkJCQkjICVtbTYgaXMgc2xpZGluZyBsZWZ0CisJICcmbW92cQkoIm1tNyIsIm1tNSIpJywKKwkgJyZwc2xscSgibW02IiwyNSknLAorCScmbW92cQkoIm1tMSIsJlFXUCg4KigkaSsxKSU2NCwiZXNwIikpJywJIyBsb2FkIGIKKwkgJyZwc3JscSgibW01Iiw2KScsCisJICcmcHhvcgkoIm1tNyIsIm1tNiIpJywKKwkgJyZwc2xscSgibW02Iiw1KScsCisJICcmcHhvcgkoIm1tNyIsIm1tNSIpJywKKwknJnB4b3IJKCRBLCJtbTEiKScsCQkJCSMgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCSAnJnBzcmxxKCJtbTUiLDUpJywKKwkgJyZweG9yCSgibW03IiwibW02IiknLAorCScmcGFuZAkoJEJ4QywkQSknLAkJCQkjIChiXmMpJihhXmIpCisJICcmcHNsbHEoIm1tNiIsNiknLAorCSAnJnB4b3IJKCJtbTciLCJtbTUiKScsCisJJyZweG9yCSgkQnhDLCJtbTEiKScsCQkJCSMgW2g9XU1haihhLGIsYykKKwkgJyZweG9yCSgibW02IiwibW03IiknLAkJCQkjIFNpZ21hMF81MTIoYSkKKwkgJyZtb3ZxCSgibW01IiwmUVdQKDgqKCRpKzUtMSklNjQsImVzcCIpKScsCSMgcHJlLWxvYWQgZgorCScmcGFkZHEJKCRCeEMsIm1tNiIpJywJCQkJIyBoKz1TaWdtYTAoYSkKKwkgJyZtb3ZxCSgibW02IiwmUVdQKDgqKCRpKzYtMSklNjQsImVzcCIpKScsCSMgcHJlLWxvYWQgZworCisJJygkQSwkQnhDKSA9ICgkQnhDLCRBKTsgJGktLTsnCisJKTsKK30KKworJnNldF9sYWJlbCgiMDBfNDdfc3NzZTMiLDMyKTsKKworICAgIGZvcig7JGo8MTY7JGorKykgeworCW15ICgkdDAsJHQyLCR0MSk9QFhbMi4uNF07CisJbXkgQGluc25zID0gKCZCT0RZXzAwXzE1X3Nzc2UzKCksJkJPRFlfMDBfMTVfc3NzZTMoKSk7CisKKwkmbW92ZHFhCQkoJHQyLEBYWzVdKTsKKwkmbW92ZHFhCQkoQFhbMV0sJHQwKTsJCQkjIHJlc3RvcmUgQFhbMV0KKwkmcGFsaWducgkoJHQwLEBYWzBdLDgpOwkJCSMgWFsxLi4yXQorCSZtb3ZkcWEJCSgmUVdQKDE2KigkaiU0KSwkZnJhbWUpLEBYWzRdKTsJIyBvZmYtbG9hZCBAWFs0XQorCSAmcGFsaWducgkoJHQyLEBYWzRdLDgpOwkJCSMgWFs5Li4xMF0KKworCSZtb3ZkcWEJCSgkdDEsJHQwKTsKKwkmcHNybHEJCSgkdDAsNyk7CisJICZwYWRkcQkJKEBYWzBdLCR0Mik7CQkJIyBYWzAuLjFdICs9IFhbOS4uMTBdCisJJm1vdmRxYQkJKCR0MiwkdDEpOworCSZwc3JscQkJKCR0MSwxKTsKKwkmcHNsbHEJCSgkdDIsNjQtOCk7CisJJnB4b3IJCSgkdDAsJHQxKTsKKwkmcHNybHEJCSgkdDEsOC0xKTsKKwkmcHhvcgkJKCR0MCwkdDIpOworCSZwc2xscQkJKCR0Miw4LTEpOworCSZweG9yCQkoJHQwLCR0MSk7CisJICZtb3ZkcWEJKCR0MSxAWFs3XSk7CisJJnB4b3IJCSgkdDAsJHQyKTsJCQkjIHNpZ21hMChYWzEuLjJdKQorCSAmbW92ZHFhCSgkdDIsQFhbN10pOworCSAmcHNybHEJCSgkdDEsNik7CisJJnBhZGRxCQkoQFhbMF0sJHQwKTsJCQkjIFhbMC4uMV0gKz0gc2lnbWEwKFhbMS4uMl0pCisKKwkmbW92ZHFhCQkoJHQwLEBYWzddKTsKKwkmcHNybHEJCSgkdDIsMTkpOworCSZwc2xscQkJKCR0MCw2NC02MSk7CisJJnB4b3IJCSgkdDEsJHQyKTsKKwkmcHNybHEJCSgkdDIsNjEtMTkpOworCSZweG9yCQkoJHQxLCR0MCk7CisJJnBzbGxxCQkoJHQwLDYxLTE5KTsKKwkmcHhvcgkJKCR0MSwkdDIpOworCSZtb3ZkcWEJCSgkdDIsJlFXUCgxNiooKCRqKzIpJTQpLCRmcmFtZSkpOyMgcHJlLXJlc3RvcmUgQFhbMV0KKwkmcHhvcgkJKCR0MSwkdDApOwkJCSMgc2lnbWEwKFhbMS4uMl0pCisJJm1vdmRxYQkJKCR0MCwmUVdQKDE2KigkaiU4KSwkSzUxMikpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSZwYWRkcQkJKEBYWzBdLCR0MSk7CQkJIyBYWzAuLjFdICs9IHNpZ21hMChYWzE0Li4xNV0pCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJnBhZGRxCQkoJHQwLEBYWzBdKTsKKwkgZm9yZWFjaChAaW5zbnMpIHsgZXZhbDsgfQorCSZtb3ZkcWEJCSgmUVdQKDE2KigkaiU4KS0xMjgsJGZyYW1lKSwkdDApOyMgeGZlciBYW2ldK0tbaV0KKworCXB1c2goQFgsc2hpZnQoQFgpKTsJCQkJIyByb3RhdGUoQFgpCisgICAgfQorCSZsZWEJCSgkSzUxMiwmRFdQKDE2KjgsJEs1MTIpKTsKKwkmZGVjCQkoImVjeCIpOworCSZqbnoJCSgmbGFiZWwoIjAwXzQ3X3Nzc2UzIikpOworCisJJm1vdmRxYQkJKEBYWzFdLCZRV1AoMCwkSzUxMikpOwkJIyBieXRlIHN3YXAgbWFzaworCSZsZWEJCSgkSzUxMiwmRFdQKC04MCo4LCRLNTEyKSk7CSMgcmV3aW5kCisJJm1vdmRxdQkJKEBYWzBdLCZRV1AoMCwiZWJ4IikpOworCSZwc2h1ZmIJCShAWFswXSxAWFsxXSk7CisKKyAgICBmb3IgKCRqPTA7JGo8ODskaisrKSB7CSMgbG9hZCBuZXh0IG9yIHNhbWUgYmxvY2sKKwlteSBAaW5zbnMgPSAoJkJPRFlfMDBfMTVfc3NzZTMoKSwmQk9EWV8wMF8xNV9zc3NlMygpKTsKKworCSZtb3ZkcWEJCSgmUVdQKDE2KigoJGotMSklNCksJGZyYW1lKSxAWFszXSkJaWYgKCRqPjQpOyAjIG9mZi1sb2FkCisJJm1vdmRxYQkJKEBYWzNdLCZRV1AoMTYqKCRqJTgpLCRLNTEyKSk7CisJJm1vdmRxYQkJKEBYWzJdLEBYWzFdKQkJCQlpZiAoJGo8Nyk7ICMgcGVycGV0dWF0ZSBieXRlIHN3YXAgbWFzaworCSZtb3ZkcXUJCShAWFsxXSwmUVdQKDE2KigkaisxKSwiZWJ4IikpCQlpZiAoJGo8Nyk7ICMgbmV4dCBpbnB1dAorCSZtb3ZkcWEJCShAWFsxXSwmUVdQKDE2KigoJGorMSklNCksJGZyYW1lKSkJaWYgKCRqPT03KTsjIHJlc3RvcmUgQFhbMF0KKwkmcGFkZHEJCShAWFszXSxAWFswXSk7CisJJnBzaHVmYgkJKEBYWzFdLEBYWzJdKQkJCQlpZiAoJGo8Nyk7CisJIGZvcmVhY2goQGluc25zKSB7IGV2YWw7IH0KKwkmbW92ZHFhCQkoJlFXUCgxNiooJGolOCktMTI4LCRmcmFtZSksQFhbM10pOyMgeGZlciBYW2ldK0tbaV0KKworCXB1c2goQFgsc2hpZnQoQFgpKTsJCQkJIyByb3RhdGUoQFgpCisgICAgfQorCisJIyZtb3ZxCSgkQSwkQXNzZTIpOwkJCSMgbG9hZCBBLUgKKwkmbW92cQkoIm1tMSIsJEJzc2UyKTsKKwkmcGFkZHEJKCRBLCJtbTMiKTsJCQkjIGZyb20gQk9EWV8wMF8xNQorCSMmbW92cQkoJEJ4QywkQ3NzZTIpOworCSZtb3ZxCSgibW0zIiwkRHNzZTIpOworCSMmbW92cQkoJEUsJEVzc2UyKTsKKwkjJm1vdnEJKCJtbTUiLCRGc3NlMik7CisJIyZtb3ZxCSgibW02IiwkR3NzZTIpOworCSZtb3ZxCSgibW03IiwkSHNzZTIpOworCisJJnB4b3IJKCRCeEMsIm1tMSIpOwkJCSMgZGUtbWFnaWMKKwkmcGFkZHEJKCRBLCZRV1AoMCwiZXNpIikpOworCSZwYWRkcQkoIm1tMSIsJlFXUCg4LCJlc2kiKSk7CisJJnBhZGRxCSgkQnhDLCZRV1AoMTYsImVzaSIpKTsKKwkmcGFkZHEJKCJtbTMiLCZRV1AoMjQsImVzaSIpKTsKKwkmcGFkZHEJKCRFLCZRV1AoMzIsImVzaSIpKTsKKwkmcGFkZHEJKCJtbTUiLCZRV1AoNDAsImVzaSIpKTsKKwkmcGFkZHEJKCJtbTYiLCZRV1AoNDgsImVzaSIpKTsKKwkmcGFkZHEJKCJtbTciLCZRV1AoNTYsImVzaSIpKTsKKworCSZtb3ZxCSgmUVdQKDAsImVzaSIpLCRBKTsKKwkmbW92cQkoJlFXUCg4LCJlc2kiKSwibW0xIik7CisJJm1vdnEJKCZRV1AoMTYsImVzaSIpLCRCeEMpOworCSZtb3ZxCSgmUVdQKDI0LCJlc2kiKSwibW0zIik7CisJJm1vdnEJKCZRV1AoMzIsImVzaSIpLCRFKTsKKwkmbW92cQkoJlFXUCg0MCwiZXNpIiksIm1tNSIpOworCSZtb3ZxCSgmUVdQKDQ4LCJlc2kiKSwibW02Iik7CisJJm1vdnEJKCZRV1AoNTYsImVzaSIpLCJtbTciKTsKKworICAgIAkmY21wCSgiZWRpIiwiZWF4IikJCQkjIGFyZSB3ZSBkb25lIHlldD8KKwkmamIJKCZsYWJlbCgibG9vcF9zc3NlMyIpKTsKKworCSZtb3YJKCJlc3AiLCZEV1AoNjQrMTIsJGZyYW1lKSk7CSMgcmVzdG9yZSBzcAorCSZlbW1zCSgpOworfQorJmZ1bmN0aW9uX2VuZF9BKCk7Cit9Cismc2V0X2xhYmVsKCJsb29wX3g4NiIsMTYpOworICAgICMgY29weSBpbnB1dCBibG9jayB0byBzdGFjayByZXZlcnNpbmcgYnl0ZSBhbmQgcXdvcmQgb3JkZXIKKyAgICBmb3IgKCRpPTA7JGk8ODskaSsrKSB7CisJJm1vdgkoImVheCIsJkRXUCgkaSoxNiswLCJlZGkiKSk7CisJJm1vdgkoImVieCIsJkRXUCgkaSoxNis0LCJlZGkiKSk7CisJJm1vdgkoImVjeCIsJkRXUCgkaSoxNis4LCJlZGkiKSk7CisJJm1vdgkoImVkeCIsJkRXUCgkaSoxNisxMiwiZWRpIikpOworCSZic3dhcAkoImVheCIpOworCSZic3dhcAkoImVieCIpOworCSZic3dhcAkoImVjeCIpOworCSZic3dhcAkoImVkeCIpOworCSZwdXNoCSgiZWF4Iik7CisJJnB1c2gJKCJlYngiKTsKKwkmcHVzaAkoImVjeCIpOworCSZwdXNoCSgiZWR4Iik7CisgICAgfQorCSZhZGQJKCJlZGkiLDEyOCk7CisJJnN1YgkoImVzcCIsOSo4KTsJCSMgcGxhY2UgZm9yIFQsQSxCLEMsRCxFLEYsRyxICisJJm1vdgkoJkRXUCg4Kig5KzE2KSs0LCJlc3AiKSwiZWRpIik7CisKKwkjIGNvcHkgY3R4LT5oWzAtN10gdG8gQSxCLEMsRCxFLEYsRyxIIG9uIHN0YWNrCisJJmxlYQkoImVkaSIsJkRXUCg4LCJlc3AiKSk7CisJJm1vdgkoImVjeCIsMTYpOworCSZkYXRhX3dvcmQoMHhBNUYzRjY4OSk7CQkjIHJlcCBtb3ZzZAorCismc2V0X2xhYmVsKCIwMF8xNV94ODYiLDE2KTsKKwkmQk9EWV8wMF8xNV94ODYoKTsKKworCSZjbXAJKCZMQigiZWR4IiksMHg5NCk7CisJJmpuZQkoJmxhYmVsKCIwMF8xNV94ODYiKSk7CisKKyZzZXRfbGFiZWwoIjE2Xzc5X3g4NiIsMTYpOworCSNkZWZpbmUgc2lnbWEwKHgpCShST1RSKCh4KSwxKSAgXiBST1RSKCh4KSw4KSAgXiAoKHgpPj43KSkKKwkjCUxPCQlsbz4+MV5oaTw8MzEgIF4gbG8+PjheaGk8PDI0IF4gbG8+PjdeaGk8PDI1CisJIwlISQkJaGk+PjFebG88PDMxICBeIGhpPj44XmxvPDwyNCBeIGhpPj43CisJJm1vdgkoImVjeCIsJkRXUCg4Kig5KzE1KzE2LTEpKzAsImVzcCIpKTsKKwkmbW92CSgiZWR4IiwmRFdQKDgqKDkrMTUrMTYtMSkrNCwiZXNwIikpOworCSZtb3YJKCJlc2kiLCJlY3giKTsKKworCSZzaHIJKCJlY3giLDEpOwkjIGxvPj4xCisJJm1vdgkoImVkaSIsImVkeCIpOworCSZzaHIJKCJlZHgiLDEpOwkjIGhpPj4xCisJJm1vdgkoImVheCIsImVjeCIpOworCSZzaGwJKCJlc2kiLDI0KTsJIyBsbzw8MjQKKwkmbW92CSgiZWJ4IiwiZWR4Iik7CisJJnNobAkoImVkaSIsMjQpOwkjIGhpPDwyNAorCSZ4b3IJKCJlYngiLCJlc2kiKTsKKworCSZzaHIJKCJlY3giLDctMSk7CSMgbG8+PjcKKwkmeG9yCSgiZWF4IiwiZWRpIik7CisJJnNocgkoImVkeCIsNy0xKTsJIyBoaT4+NworCSZ4b3IJKCJlYXgiLCJlY3giKTsKKwkmc2hsCSgiZXNpIiwzMS0yNCk7CSMgbG88PDMxCisJJnhvcgkoImVieCIsImVkeCIpOworCSZzaGwJKCJlZGkiLDI1LTI0KTsJIyBoaTw8MjUKKwkmeG9yCSgiZWJ4IiwiZXNpIik7CisKKwkmc2hyCSgiZWN4Iiw4LTcpOwkjIGxvPj44CisJJnhvcgkoImVheCIsImVkaSIpOworCSZzaHIJKCJlZHgiLDgtNyk7CSMgaGk+PjgKKwkmeG9yCSgiZWF4IiwiZWN4Iik7CisJJnNobAkoImVkaSIsMzEtMjUpOwkjIGhpPDwzMQorCSZ4b3IJKCJlYngiLCJlZHgiKTsKKwkmeG9yCSgiZWF4IiwiZWRpIik7CQkJIyBUMSA9IHNpZ21hMChYWy0xNV0pCisKKwkmbW92CSgmRFdQKDAsImVzcCIpLCJlYXgiKTsKKwkmbW92CSgmRFdQKDQsImVzcCIpLCJlYngiKTsJCSMgcHV0IFQxIGF3YXkKKworCSNkZWZpbmUgc2lnbWExKHgpCShST1RSKCh4KSwxOSkgXiBST1RSKCh4KSw2MSkgXiAoKHgpPj42KSkKKwkjCUxPCQlsbz4+MTleaGk8PDEzIF4gaGk+PjI5XmxvPDwzIF4gbG8+PjZeaGk8PDI2CisJIwlISQkJaGk+PjE5XmxvPDwxMyBeIGxvPj4yOV5oaTw8MyBeIGhpPj42CisJJm1vdgkoImVjeCIsJkRXUCg4Kig5KzE1KzE2LTE0KSswLCJlc3AiKSk7CisJJm1vdgkoImVkeCIsJkRXUCg4Kig5KzE1KzE2LTE0KSs0LCJlc3AiKSk7CisJJm1vdgkoImVzaSIsImVjeCIpOworCisJJnNocgkoImVjeCIsNik7CSMgbG8+PjYKKwkmbW92CSgiZWRpIiwiZWR4Iik7CisJJnNocgkoImVkeCIsNik7CSMgaGk+PjYKKwkmbW92CSgiZWF4IiwiZWN4Iik7CisJJnNobAkoImVzaSIsMyk7CSMgbG88PDMKKwkmbW92CSgiZWJ4IiwiZWR4Iik7CisJJnNobAkoImVkaSIsMyk7CSMgaGk8PDMKKwkmeG9yCSgiZWF4IiwiZXNpIik7CisKKwkmc2hyCSgiZWN4IiwxOS02KTsJIyBsbz4+MTkKKwkmeG9yCSgiZWJ4IiwiZWRpIik7CisJJnNocgkoImVkeCIsMTktNik7CSMgaGk+PjE5CisJJnhvcgkoImVheCIsImVjeCIpOworCSZzaGwJKCJlc2kiLDEzLTMpOwkjIGxvPDwxMworCSZ4b3IJKCJlYngiLCJlZHgiKTsKKwkmc2hsCSgiZWRpIiwxMy0zKTsJIyBoaTw8MTMKKwkmeG9yCSgiZWJ4IiwiZXNpIik7CisKKwkmc2hyCSgiZWN4IiwyOS0xOSk7CSMgbG8+PjI5CisJJnhvcgkoImVheCIsImVkaSIpOworCSZzaHIJKCJlZHgiLDI5LTE5KTsJIyBoaT4+MjkKKwkmeG9yCSgiZWJ4IiwiZWN4Iik7CisJJnNobAkoImVkaSIsMjYtMTMpOwkjIGhpPDwyNgorCSZ4b3IJKCJlYXgiLCJlZHgiKTsKKwkmeG9yCSgiZWF4IiwiZWRpIik7CQkJIyBzaWdtYTEoWFstMl0pCisKKwkmbW92CSgiZWN4IiwmRFdQKDgqKDkrMTUrMTYpKzAsImVzcCIpKTsKKwkmbW92CSgiZWR4IiwmRFdQKDgqKDkrMTUrMTYpKzQsImVzcCIpKTsKKwkmYWRkCSgiZWF4IiwmRFdQKDAsImVzcCIpKTsKKwkmYWRjCSgiZWJ4IiwmRFdQKDQsImVzcCIpKTsJCSMgVDEgPSBzaWdtYTEoWFstMl0pK1QxCisJJm1vdgkoImVzaSIsJkRXUCg4Kig5KzE1KzE2LTkpKzAsImVzcCIpKTsKKwkmbW92CSgiZWRpIiwmRFdQKDgqKDkrMTUrMTYtOSkrNCwiZXNwIikpOworCSZhZGQJKCJlYXgiLCJlY3giKTsKKwkmYWRjCSgiZWJ4IiwiZWR4Iik7CQkJIyBUMSArPSBYWy0xNl0KKwkmYWRkCSgiZWF4IiwiZXNpIik7CisJJmFkYwkoImVieCIsImVkaSIpOwkJCSMgVDEgKz0gWFstN10KKwkmbW92CSgmRFdQKDgqKDkrMTUpKzAsImVzcCIpLCJlYXgiKTsKKwkmbW92CSgmRFdQKDgqKDkrMTUpKzQsImVzcCIpLCJlYngiKTsJIyBzYXZlIFhbMF0KKworCSZCT0RZXzAwXzE1X3g4NigpOworCisJJmNtcAkoJkxCKCJlZHgiKSwweDE3KTsKKwkmam5lCSgmbGFiZWwoIjE2Xzc5X3g4NiIpKTsKKworCSZtb3YJKCJlc2kiLCZEV1AoOCooOSsxNis4MCkrMCwiZXNwIikpOyMgY3R4CisJJm1vdgkoImVkaSIsJkRXUCg4Kig5KzE2KzgwKSs0LCJlc3AiKSk7IyBpbnAKKyAgICBmb3IoJGk9MDskaTw0OyRpKyspIHsKKwkmbW92CSgiZWF4IiwmRFdQKCRpKjE2KzAsImVzaSIpKTsKKwkmbW92CSgiZWJ4IiwmRFdQKCRpKjE2KzQsImVzaSIpKTsKKwkmbW92CSgiZWN4IiwmRFdQKCRpKjE2KzgsImVzaSIpKTsKKwkmbW92CSgiZWR4IiwmRFdQKCRpKjE2KzEyLCJlc2kiKSk7CisJJmFkZAkoImVheCIsJkRXUCg4KygkaSoxNikrMCwiZXNwIikpOworCSZhZGMJKCJlYngiLCZEV1AoOCsoJGkqMTYpKzQsImVzcCIpKTsKKwkmbW92CSgmRFdQKCRpKjE2KzAsImVzaSIpLCJlYXgiKTsKKwkmbW92CSgmRFdQKCRpKjE2KzQsImVzaSIpLCJlYngiKTsKKwkmYWRkCSgiZWN4IiwmRFdQKDgrKCRpKjE2KSs4LCJlc3AiKSk7CisJJmFkYwkoImVkeCIsJkRXUCg4KygkaSoxNikrMTIsImVzcCIpKTsKKwkmbW92CSgmRFdQKCRpKjE2KzgsImVzaSIpLCJlY3giKTsKKwkmbW92CSgmRFdQKCRpKjE2KzEyLCJlc2kiKSwiZWR4Iik7CisgICAgfQorCSZhZGQJKCJlc3AiLDgqKDkrMTYrODApKTsJCSMgZGVzdHJveSBmcmFtZQorCSZzdWIJKCRLNTEyLDgqODApOwkJCSMgcmV3aW5kIEsKKworCSZjbXAJKCJlZGkiLCZEV1AoOCwiZXNwIikpOwkJIyBhcmUgd2UgZG9uZSB5ZXQ/CisJJmpiCSgmbGFiZWwoImxvb3BfeDg2IikpOworCisJJm1vdgkoImVzcCIsJkRXUCgxMiwiZXNwIikpOwkJIyByZXN0b3JlIHNwCismZnVuY3Rpb25fZW5kX0EoKTsKKworJnNldF9sYWJlbCgiSzUxMiIsNjQpOwkjIFllcyEgSSBrZWVwIGl0IGluIHRoZSBjb2RlIHNlZ21lbnQhCisJJmRhdGFfd29yZCgweGQ3MjhhZTIyLDB4NDI4YTJmOTgpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHgyM2VmNjVjZCwweDcxMzc0NDkxKTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4ZWM0ZDNiMmYsMHhiNWMwZmJjZik7CSMgdTY0CisJJmRhdGFfd29yZCgweDgxODlkYmJjLDB4ZTliNWRiYTUpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHhmMzQ4YjUzOCwweDM5NTZjMjViKTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4YjYwNWQwMTksMHg1OWYxMTFmMSk7CSMgdTY0CisJJmRhdGFfd29yZCgweGFmMTk0ZjliLDB4OTIzZjgyYTQpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHhkYTZkODExOCwweGFiMWM1ZWQ1KTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4YTMwMzAyNDIsMHhkODA3YWE5OCk7CSMgdTY0CisJJmRhdGFfd29yZCgweDQ1NzA2ZmJlLDB4MTI4MzViMDEpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHg0ZWU0YjI4YywweDI0MzE4NWJlKTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4ZDVmZmI0ZTIsMHg1NTBjN2RjMyk7CSMgdTY0CisJJmRhdGFfd29yZCgweGYyN2I4OTZmLDB4NzJiZTVkNzQpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHgzYjE2OTZiMSwweDgwZGViMWZlKTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4MjVjNzEyMzUsMHg5YmRjMDZhNyk7CSMgdTY0CisJJmRhdGFfd29yZCgweGNmNjkyNjk0LDB4YzE5YmYxNzQpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHg5ZWYxNGFkMiwweGU0OWI2OWMxKTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4Mzg0ZjI1ZTMsMHhlZmJlNDc4Nik7CSMgdTY0CisJJmRhdGFfd29yZCgweDhiOGNkNWI1LDB4MGZjMTlkYzYpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHg3N2FjOWM2NSwweDI0MGNhMWNjKTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4NTkyYjAyNzUsMHgyZGU5MmM2Zik7CSMgdTY0CisJJmRhdGFfd29yZCgweDZlYTZlNDgzLDB4NGE3NDg0YWEpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHhiZDQxZmJkNCwweDVjYjBhOWRjKTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4ODMxMTUzYjUsMHg3NmY5ODhkYSk7CSMgdTY0CisJJmRhdGFfd29yZCgweGVlNjZkZmFiLDB4OTgzZTUxNTIpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHgyZGI0MzIxMCwweGE4MzFjNjZkKTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4OThmYjIxM2YsMHhiMDAzMjdjOCk7CSMgdTY0CisJJmRhdGFfd29yZCgweGJlZWYwZWU0LDB4YmY1OTdmYzcpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHgzZGE4OGZjMiwweGM2ZTAwYmYzKTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4OTMwYWE3MjUsMHhkNWE3OTE0Nyk7CSMgdTY0CisJJmRhdGFfd29yZCgweGUwMDM4MjZmLDB4MDZjYTYzNTEpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHgwYTBlNmU3MCwweDE0MjkyOTY3KTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4NDZkMjJmZmMsMHgyN2I3MGE4NSk7CSMgdTY0CisJJmRhdGFfd29yZCgweDVjMjZjOTI2LDB4MmUxYjIxMzgpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHg1YWM0MmFlZCwweDRkMmM2ZGZjKTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4OWQ5NWIzZGYsMHg1MzM4MGQxMyk7CSMgdTY0CisJJmRhdGFfd29yZCgweDhiYWY2M2RlLDB4NjUwYTczNTQpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHgzYzc3YjJhOCwweDc2NmEwYWJiKTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4NDdlZGFlZTYsMHg4MWMyYzkyZSk7CSMgdTY0CisJJmRhdGFfd29yZCgweDE0ODIzNTNiLDB4OTI3MjJjODUpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHg0Y2YxMDM2NCwweGEyYmZlOGExKTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4YmM0MjMwMDEsMHhhODFhNjY0Yik7CSMgdTY0CisJJmRhdGFfd29yZCgweGQwZjg5NzkxLDB4YzI0YjhiNzApOwkjIHU2NAorCSZkYXRhX3dvcmQoMHgwNjU0YmUzMCwweGM3NmM1MWEzKTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4ZDZlZjUyMTgsMHhkMTkyZTgxOSk7CSMgdTY0CisJJmRhdGFfd29yZCgweDU1NjVhOTEwLDB4ZDY5OTA2MjQpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHg1NzcxMjAyYSwweGY0MGUzNTg1KTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4MzJiYmQxYjgsMHgxMDZhYTA3MCk7CSMgdTY0CisJJmRhdGFfd29yZCgweGI4ZDJkMGM4LDB4MTlhNGMxMTYpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHg1MTQxYWI1MywweDFlMzc2YzA4KTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4ZGY4ZWViOTksMHgyNzQ4Nzc0Yyk7CSMgdTY0CisJJmRhdGFfd29yZCgweGUxOWI0OGE4LDB4MzRiMGJjYjUpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHhjNWM5NWE2MywweDM5MWMwY2IzKTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4ZTM0MThhY2IsMHg0ZWQ4YWE0YSk7CSMgdTY0CisJJmRhdGFfd29yZCgweDc3NjNlMzczLDB4NWI5Y2NhNGYpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHhkNmIyYjhhMywweDY4MmU2ZmYzKTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4NWRlZmIyZmMsMHg3NDhmODJlZSk7CSMgdTY0CisJJmRhdGFfd29yZCgweDQzMTcyZjYwLDB4NzhhNTYzNmYpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHhhMWYwYWI3MiwweDg0Yzg3ODE0KTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4MWE2NDM5ZWMsMHg4Y2M3MDIwOCk7CSMgdTY0CisJJmRhdGFfd29yZCgweDIzNjMxZTI4LDB4OTBiZWZmZmEpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHhkZTgyYmRlOSwweGE0NTA2Y2ViKTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4YjJjNjc5MTUsMHhiZWY5YTNmNyk7CSMgdTY0CisJJmRhdGFfd29yZCgweGUzNzI1MzJiLDB4YzY3MTc4ZjIpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHhlYTI2NjE5YywweGNhMjczZWNlKTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4MjFjMGMyMDcsMHhkMTg2YjhjNyk7CSMgdTY0CisJJmRhdGFfd29yZCgweGNkZTBlYjFlLDB4ZWFkYTdkZDYpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHhlZTZlZDE3OCwweGY1N2Q0ZjdmKTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4NzIxNzZmYmEsMHgwNmYwNjdhYSk7CSMgdTY0CisJJmRhdGFfd29yZCgweGEyYzg5OGE2LDB4MGE2MzdkYzUpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHhiZWY5MGRhZSwweDExM2Y5ODA0KTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4MTMxYzQ3MWIsMHgxYjcxMGIzNSk7CSMgdTY0CisJJmRhdGFfd29yZCgweDIzMDQ3ZDg0LDB4MjhkYjc3ZjUpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHg0MGM3MjQ5MywweDMyY2FhYjdiKTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4MTVjOWJlYmMsMHgzYzllYmUwYSk7CSMgdTY0CisJJmRhdGFfd29yZCgweDljMTAwZDRjLDB4NDMxZDY3YzQpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHhjYjNlNDJiNiwweDRjYzVkNGJlKTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4ZmM2NTdlMmEsMHg1OTdmMjk5Yyk7CSMgdTY0CisJJmRhdGFfd29yZCgweDNhZDZmYWVjLDB4NWZjYjZmYWIpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHg0YTQ3NTgxNywweDZjNDQxOThjKTsJIyB1NjQKKworCSZkYXRhX3dvcmQoMHgwNDA1MDYwNywweDAwMDEwMjAzKTsJIyBieXRlIHN3YXAKKwkmZGF0YV93b3JkKDB4MGMwZDBlMGYsMHgwODA5MGEwYik7CSMgbWFzaworJmZ1bmN0aW9uX2VuZF9CKCJzaGE1MTJfYmxvY2tfZGF0YV9vcmRlciIpOworJmFzY2l6KCJTSEE1MTIgYmxvY2sgdHJhbnNmb3JtIGZvciB4ODYsIENSWVBUT0dBTVMgYnkgPGFwcHJvXEBvcGVuc3NsLm9yZz4iKTsKKworJmFzbV9maW5pc2goKTsKZGlmZiAtLWdpdCBhL2NyeXB0by9zaGEvYXNtL3NoYTUxMi1hcm12NC5wbCBiL2NyeXB0by9zaGEvYXNtL3NoYTUxMi1hcm12NC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTJjYmZjCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3NoYS9hc20vc2hhNTEyLWFybXY0LnBsCkBAIC0wLDAgKzEsNjA0IEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgV3JpdHRlbiBieSBBbmR5IFBvbHlha292IDxhcHByb0BvcGVuc3NsLm9yZz4gZm9yIHRoZSBPcGVuU1NMCisjIHByb2plY3QuIFRoZSBtb2R1bGUgaXMsIGhvd2V2ZXIsIGR1YWwgbGljZW5zZWQgdW5kZXIgT3BlblNTTCBhbmQKKyMgQ1JZUFRPR0FNUyBsaWNlbnNlcyBkZXBlbmRpbmcgb24gd2hlcmUgeW91IG9idGFpbiBpdC4gRm9yIGZ1cnRoZXIKKyMgZGV0YWlscyBzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+YXBwcm8vY3J5cHRvZ2Ftcy8uCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgU0hBNTEyIGJsb2NrIHByb2NlZHVyZSBmb3IgQVJNdjQuIFNlcHRlbWJlciAyMDA3LgorCisjIFRoaXMgY29kZSBpcyB+NC41IChmb3VyIGFuZCBhIGhhbGYpIHRpbWVzIGZhc3RlciB0aGFuIGNvZGUgZ2VuZXJhdGVkCisjIGJ5IGdjYyAzLjQgYW5kIGl0IHNwZW5kcyB+NzIgY2xvY2sgY3ljbGVzIHBlciBieXRlIFtvbiBzaW5nbGUtaXNzdWUKKyMgWHNjYWxlIFBYQTI1MCBjb3JlXS4KKyMKKyMgSnVseSAyMDEwLgorIworIyBSZXNjaGVkdWxpbmcgZm9yIGR1YWwtaXNzdWUgcGlwZWxpbmUgcmVzdWx0ZWQgaW4gNiUgaW1wcm92ZW1lbnQgb24KKyMgQ29ydGV4IEE4IGNvcmUgYW5kIH40MCBjeWNsZXMgcGVyIHByb2Nlc3NlZCBieXRlLgorCisjIEZlYnJ1YXJ5IDIwMTEuCisjCisjIFByb2ZpbGVyLWFzc2lzdGVkIGFuZCBwbGF0Zm9ybS1zcGVjaWZpYyBvcHRpbWl6YXRpb24gcmVzdWx0ZWQgaW4gNyUKKyMgaW1wcm92ZW1lbnQgb24gQ294dGV4IEE4IGNvcmUgYW5kIH4zOCBjeWNsZXMgcGVyIGJ5dGUuCisKKyMgTWFyY2ggMjAxMS4KKyMKKyMgQWRkIE5FT04gaW1wbGVtZW50YXRpb24uIE9uIENvcnRleCBBOCBpdCB3YXMgbWVhc3VyZWQgdG8gcHJvY2VzcworIyBvbmUgYnl0ZSBpbiAyMy4zIGN5Y2xlcyBvciB+NjAlIGZhc3RlciB0aGFuIGludGVnZXItb25seSBjb2RlLgorCisjIEF1Z3VzdCAyMDEyLgorIworIyBJbXByb3ZlIE5FT04gcGVyZm9ybWFuY2UgYnkgMTIlIG9uIFNuYXBkcmFnb24gUzQuIEluIGFic29sdXRlCisjIHRlcm1zIGl0J3MgMjIuNiBjeWNsZXMgcGVyIGJ5dGUsIHdoaWNoIGlzIGRpc2FwcG9pbnRpbmcgcmVzdWx0LgorIyBUZWNobmljYWwgd3JpdGVycyBhc3NlcnRlZCB0aGF0IDMtd2F5IFM0IHBpcGVsaW5lIGNhbiBzdXN0YWluCisjIG11bHRpcGxlIE5FT04gaW5zdHJ1Y3Rpb25zIHBlciBjeWNsZSwgYnV0IGR1YWwgTkVPTiBpc3N1ZSBjb3VsZAorIyBub3QgYmUgb2JzZXJ2ZWQsIGFuZCBmb3IgTkVPTi1vbmx5IHNlcXVlbmNlcyBJUEMoKikgd2FzIGZvdW5kIHRvCisjIGJlIGxpbWl0ZWQgYnkgMTotKCAwLjMzIGFuZCAwLjY2IHdlcmUgbWVhc3VyZWQgZm9yIHNlcXVlbmNlcyB3aXRoCisjIElMUHMoKikgb2YgMSBhbmQgMiByZXNwZWN0aXZlbHkuIFRoaXMgaW4gdHVybiBtZWFucyB0aGF0IHlvdSBjYW4KKyMgZXZlbiBmaW5kIHlvdXJzZWxmIHN0cml2aW5nLCBhcyBJIGRpZCBoZXJlLCBmb3IgYWNoaWV2aW5nIElQQworIyBhZGVxdWF0ZSB0byBvbmUgZGVsaXZlcmVkIGJ5IENvcnRleCBBOCBbZm9yIHJlZmVyZW5jZSwgaXQncworIyAwLjUgZm9yIElMUCBvZiAxLCBhbmQgMSBmb3IgaGlnaGVyIElMUHNdLgorIworIyAoKikgSUxQLCBpbnN0cnVjdGlvbi1sZXZlbCBwYXJhbGxlbGlzbSwgaG93IG1hbnkgaW5zdHJ1Y3Rpb25zCisjICAgICAqY2FuKiBleGVjdXRlIGF0IHRoZSBzYW1lIHRpbWUuIElQQywgaW5zdHJ1Y3Rpb25zIHBlciBjeWNsZSwKKyMgICAgIGluZGljYXRlcyBob3cgbWFueSBpbnN0cnVjdGlvbnMgYWN0dWFsbHkgZXhlY3V0ZS4KKworIyBCeXRlIG9yZGVyIFtpbl1kZXBlbmRlbmNlLiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBPcmlnaW5hbGx5IGNhbGxlciB3YXMgZXhwZWN0ZWQgdG8gbWFpbnRhaW4gc3BlY2lmaWMgKmR3b3JkKiBvcmRlciBpbgorIyBoWzAtN10sIG5hbWVseSB3aXRoIG1vc3Qgc2lnbmlmaWNhbnQgZHdvcmQgYXQgKmxvd2VyKiBhZGRyZXNzLCB3aGljaAorIyB3YXMgcmVmbGVjdGVkIGluIGJlbG93IHR3byBwYXJhbWV0ZXJzIGFzIDAgYW5kIDQuIE5vdyBjYWxsZXIgaXMKKyMgZXhwZWN0ZWQgdG8gbWFpbnRhaW4gbmF0aXZlIGJ5dGUgb3JkZXIgZm9yIHdob2xlIDY0LWJpdCB2YWx1ZXMuCiskaGk9IkhJIjsKKyRsbz0iTE8iOworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit3aGlsZSAoKCRvdXRwdXQ9c2hpZnQpICYmICgkb3V0cHV0IX4vXlx3W1x3XC1dKlwuXHcrJC8pKSB7fQorb3BlbiBTVERPVVQsIj4kb3V0cHV0IjsKKworJGN0eD0icjAiOwkjIHBhcmFtZXRlciBibG9jaworJGlucD0icjEiOworJGxlbj0icjIiOworCiskVGxvPSJyMyI7CiskVGhpPSJyNCI7CiskQWxvPSJyNSI7CiskQWhpPSJyNiI7CiskRWxvPSJyNyI7CiskRWhpPSJyOCI7CiskdDA9InI5IjsKKyR0MT0icjEwIjsKKyR0Mj0icjExIjsKKyR0Mz0icjEyIjsKKyMjIyMjIyMjIyMjIwlyMTMgaXMgc3RhY2sgcG9pbnRlcgorJEt0Ymw9InIxNCI7CisjIyMjIyMjIyMjIyMJcjE1IGlzIHByb2dyYW0gY291bnRlcgorCiskQW9mZj04KjA7CiskQm9mZj04KjE7CiskQ29mZj04KjI7CiskRG9mZj04KjM7CiskRW9mZj04KjQ7CiskRm9mZj04KjU7CiskR29mZj04KjY7CiskSG9mZj04Kjc7CiskWG9mZj04Kjg7CisKK3N1YiBCT0RZXzAwXzE1KCkgeworbXkgJG1hZ2ljID0gc2hpZnQ7CiskY29kZS49PDxfX187CisJQCBTaWdtYTEoeCkJKFJPVFIoKHgpLDE0KSBeIFJPVFIoKHgpLDE4KSAgXiBST1RSKCh4KSw0MSkpCisJQCBMTwkJbG8+PjE0XmhpPDwxOCBeIGxvPj4xOF5oaTw8MTQgXiBoaT4+OV5sbzw8MjMKKwlAIEhJCQloaT4+MTRebG88PDE4IF4gaGk+PjE4XmxvPDwxNCBeIGxvPj45XmhpPDwyMworCW1vdgkkdDAsJEVsbyxsc3IjMTQKKwlzdHIJJFRsbyxbc3AsIyRYb2ZmKzBdCisJbW92CSR0MSwkRWhpLGxzciMxNAorCXN0cgkkVGhpLFtzcCwjJFhvZmYrNF0KKwllb3IJJHQwLCR0MCwkRWhpLGxzbCMxOAorCWxkcgkkdDIsW3NwLCMkSG9mZiswXQlAIGgubG8KKwllb3IJJHQxLCR0MSwkRWxvLGxzbCMxOAorCWxkcgkkdDMsW3NwLCMkSG9mZis0XQlAIGguaGkKKwllb3IJJHQwLCR0MCwkRWxvLGxzciMxOAorCWVvcgkkdDEsJHQxLCRFaGksbHNyIzE4CisJZW9yCSR0MCwkdDAsJEVoaSxsc2wjMTQKKwllb3IJJHQxLCR0MSwkRWxvLGxzbCMxNAorCWVvcgkkdDAsJHQwLCRFaGksbHNyIzkKKwllb3IJJHQxLCR0MSwkRWxvLGxzciM5CisJZW9yCSR0MCwkdDAsJEVsbyxsc2wjMjMKKwllb3IJJHQxLCR0MSwkRWhpLGxzbCMyMwlAIFNpZ21hMShlKQorCWFkZHMJJFRsbywkVGxvLCR0MAorCWxkcgkkdDAsW3NwLCMkRm9mZiswXQlAIGYubG8KKwlhZGMJJFRoaSwkVGhpLCR0MQkJQCBUICs9IFNpZ21hMShlKQorCWxkcgkkdDEsW3NwLCMkRm9mZis0XQlAIGYuaGkKKwlhZGRzCSRUbG8sJFRsbywkdDIKKwlsZHIJJHQyLFtzcCwjJEdvZmYrMF0JQCBnLmxvCisJYWRjCSRUaGksJFRoaSwkdDMJCUAgVCArPSBoCisJbGRyCSR0Myxbc3AsIyRHb2ZmKzRdCUAgZy5oaQorCisJZW9yCSR0MCwkdDAsJHQyCisJc3RyCSRFbG8sW3NwLCMkRW9mZiswXQorCWVvcgkkdDEsJHQxLCR0MworCXN0cgkkRWhpLFtzcCwjJEVvZmYrNF0KKwlhbmQJJHQwLCR0MCwkRWxvCisJc3RyCSRBbG8sW3NwLCMkQW9mZiswXQorCWFuZAkkdDEsJHQxLCRFaGkKKwlzdHIJJEFoaSxbc3AsIyRBb2ZmKzRdCisJZW9yCSR0MCwkdDAsJHQyCisJbGRyCSR0MixbJEt0YmwsIyRsb10JQCBLW2ldLmxvCisJZW9yCSR0MSwkdDEsJHQzCQlAIENoKGUsZixnKQorCWxkcgkkdDMsWyRLdGJsLCMkaGldCUAgS1tpXS5oaQorCisJYWRkcwkkVGxvLCRUbG8sJHQwCisJbGRyCSRFbG8sW3NwLCMkRG9mZiswXQlAIGQubG8KKwlhZGMJJFRoaSwkVGhpLCR0MQkJQCBUICs9IENoKGUsZixnKQorCWxkcgkkRWhpLFtzcCwjJERvZmYrNF0JQCBkLmhpCisJYWRkcwkkVGxvLCRUbG8sJHQyCisJYW5kCSR0MCwkdDIsIzB4ZmYKKwlhZGMJJFRoaSwkVGhpLCR0MwkJQCBUICs9IEtbaV0KKwlhZGRzCSRFbG8sJEVsbywkVGxvCisJbGRyCSR0Mixbc3AsIyRCb2ZmKzBdCUAgYi5sbworCWFkYwkkRWhpLCRFaGksJFRoaQkJQCBkICs9IFQKKwl0ZXEJJHQwLCMkbWFnaWMKKworCWxkcgkkdDMsW3NwLCMkQ29mZiswXQlAIGMubG8KKwlvcnJlcQkkS3RibCwkS3RibCwjMQorCUAgU2lnbWEwKHgpCShST1RSKCh4KSwyOCkgXiBST1RSKCh4KSwzNCkgXiBST1RSKCh4KSwzOSkpCisJQCBMTwkJbG8+PjI4XmhpPDw0ICBeIGhpPj4yXmxvPDwzMCBeIGhpPj43XmxvPDwyNQorCUAgSEkJCWhpPj4yOF5sbzw8NCAgXiBsbz4+Ml5oaTw8MzAgXiBsbz4+N15oaTw8MjUKKwltb3YJJHQwLCRBbG8sbHNyIzI4CisJbW92CSR0MSwkQWhpLGxzciMyOAorCWVvcgkkdDAsJHQwLCRBaGksbHNsIzQKKwllb3IJJHQxLCR0MSwkQWxvLGxzbCM0CisJZW9yCSR0MCwkdDAsJEFoaSxsc3IjMgorCWVvcgkkdDEsJHQxLCRBbG8sbHNyIzIKKwllb3IJJHQwLCR0MCwkQWxvLGxzbCMzMAorCWVvcgkkdDEsJHQxLCRBaGksbHNsIzMwCisJZW9yCSR0MCwkdDAsJEFoaSxsc3IjNworCWVvcgkkdDEsJHQxLCRBbG8sbHNyIzcKKwllb3IJJHQwLCR0MCwkQWxvLGxzbCMyNQorCWVvcgkkdDEsJHQxLCRBaGksbHNsIzI1CUAgU2lnbWEwKGEpCisJYWRkcwkkVGxvLCRUbG8sJHQwCisJYW5kCSR0MCwkQWxvLCR0MgorCWFkYwkkVGhpLCRUaGksJHQxCQlAIFQgKz0gU2lnbWEwKGEpCisKKwlsZHIJJHQxLFtzcCwjJEJvZmYrNF0JQCBiLmhpCisJb3JyCSRBbG8sJEFsbywkdDIKKwlsZHIJJHQyLFtzcCwjJENvZmYrNF0JQCBjLmhpCisJYW5kCSRBbG8sJEFsbywkdDMKKwlhbmQJJHQzLCRBaGksJHQxCisJb3JyCSRBaGksJEFoaSwkdDEKKwlvcnIJJEFsbywkQWxvLCR0MAkJQCBNYWooYSxiLGMpLmxvCisJYW5kCSRBaGksJEFoaSwkdDIKKwlhZGRzCSRBbG8sJEFsbywkVGxvCisJb3JyCSRBaGksJEFoaSwkdDMJCUAgTWFqKGEsYixjKS5oaQorCXN1YglzcCxzcCwjOAorCWFkYwkkQWhpLCRBaGksJFRoaQkJQCBoICs9IFQKKwl0c3QJJEt0YmwsIzEKKwlhZGQJJEt0YmwsJEt0YmwsIzgKK19fXworfQorJGNvZGU9PDxfX187CisjaWYgZGVmaW5lZChfX2FybV9fKQorI2luY2x1ZGUgImFybV9hcmNoLmgiCisjaWZkZWYgX19BUk1FTF9fCisjIGRlZmluZSBMTyAwCisjIGRlZmluZSBISSA0CisjIGRlZmluZSBXT1JENjQoaGkwLGxvMCxoaTEsbG8xKQkud29yZAlsbzAsaGkwLCBsbzEsaGkxCisjZWxzZQorIyBkZWZpbmUgSEkgMAorIyBkZWZpbmUgTE8gNAorIyBkZWZpbmUgV09SRDY0KGhpMCxsbzAsaGkxLGxvMSkJLndvcmQJaGkwLGxvMCwgaGkxLGxvMQorI2VuZGlmCisKKy50ZXh0CisuY29kZQkzMgorLnR5cGUJSzUxMiwlb2JqZWN0CisuYWxpZ24JNQorSzUxMjoKK1dPUkQ2NCgweDQyOGEyZjk4LDB4ZDcyOGFlMjIsIDB4NzEzNzQ0OTEsMHgyM2VmNjVjZCkKK1dPUkQ2NCgweGI1YzBmYmNmLDB4ZWM0ZDNiMmYsIDB4ZTliNWRiYTUsMHg4MTg5ZGJiYykKK1dPUkQ2NCgweDM5NTZjMjViLDB4ZjM0OGI1MzgsIDB4NTlmMTExZjEsMHhiNjA1ZDAxOSkKK1dPUkQ2NCgweDkyM2Y4MmE0LDB4YWYxOTRmOWIsIDB4YWIxYzVlZDUsMHhkYTZkODExOCkKK1dPUkQ2NCgweGQ4MDdhYTk4LDB4YTMwMzAyNDIsIDB4MTI4MzViMDEsMHg0NTcwNmZiZSkKK1dPUkQ2NCgweDI0MzE4NWJlLDB4NGVlNGIyOGMsIDB4NTUwYzdkYzMsMHhkNWZmYjRlMikKK1dPUkQ2NCgweDcyYmU1ZDc0LDB4ZjI3Yjg5NmYsIDB4ODBkZWIxZmUsMHgzYjE2OTZiMSkKK1dPUkQ2NCgweDliZGMwNmE3LDB4MjVjNzEyMzUsIDB4YzE5YmYxNzQsMHhjZjY5MjY5NCkKK1dPUkQ2NCgweGU0OWI2OWMxLDB4OWVmMTRhZDIsIDB4ZWZiZTQ3ODYsMHgzODRmMjVlMykKK1dPUkQ2NCgweDBmYzE5ZGM2LDB4OGI4Y2Q1YjUsIDB4MjQwY2ExY2MsMHg3N2FjOWM2NSkKK1dPUkQ2NCgweDJkZTkyYzZmLDB4NTkyYjAyNzUsIDB4NGE3NDg0YWEsMHg2ZWE2ZTQ4MykKK1dPUkQ2NCgweDVjYjBhOWRjLDB4YmQ0MWZiZDQsIDB4NzZmOTg4ZGEsMHg4MzExNTNiNSkKK1dPUkQ2NCgweDk4M2U1MTUyLDB4ZWU2NmRmYWIsIDB4YTgzMWM2NmQsMHgyZGI0MzIxMCkKK1dPUkQ2NCgweGIwMDMyN2M4LDB4OThmYjIxM2YsIDB4YmY1OTdmYzcsMHhiZWVmMGVlNCkKK1dPUkQ2NCgweGM2ZTAwYmYzLDB4M2RhODhmYzIsIDB4ZDVhNzkxNDcsMHg5MzBhYTcyNSkKK1dPUkQ2NCgweDA2Y2E2MzUxLDB4ZTAwMzgyNmYsIDB4MTQyOTI5NjcsMHgwYTBlNmU3MCkKK1dPUkQ2NCgweDI3YjcwYTg1LDB4NDZkMjJmZmMsIDB4MmUxYjIxMzgsMHg1YzI2YzkyNikKK1dPUkQ2NCgweDRkMmM2ZGZjLDB4NWFjNDJhZWQsIDB4NTMzODBkMTMsMHg5ZDk1YjNkZikKK1dPUkQ2NCgweDY1MGE3MzU0LDB4OGJhZjYzZGUsIDB4NzY2YTBhYmIsMHgzYzc3YjJhOCkKK1dPUkQ2NCgweDgxYzJjOTJlLDB4NDdlZGFlZTYsIDB4OTI3MjJjODUsMHgxNDgyMzUzYikKK1dPUkQ2NCgweGEyYmZlOGExLDB4NGNmMTAzNjQsIDB4YTgxYTY2NGIsMHhiYzQyMzAwMSkKK1dPUkQ2NCgweGMyNGI4YjcwLDB4ZDBmODk3OTEsIDB4Yzc2YzUxYTMsMHgwNjU0YmUzMCkKK1dPUkQ2NCgweGQxOTJlODE5LDB4ZDZlZjUyMTgsIDB4ZDY5OTA2MjQsMHg1NTY1YTkxMCkKK1dPUkQ2NCgweGY0MGUzNTg1LDB4NTc3MTIwMmEsIDB4MTA2YWEwNzAsMHgzMmJiZDFiOCkKK1dPUkQ2NCgweDE5YTRjMTE2LDB4YjhkMmQwYzgsIDB4MWUzNzZjMDgsMHg1MTQxYWI1MykKK1dPUkQ2NCgweDI3NDg3NzRjLDB4ZGY4ZWViOTksIDB4MzRiMGJjYjUsMHhlMTliNDhhOCkKK1dPUkQ2NCgweDM5MWMwY2IzLDB4YzVjOTVhNjMsIDB4NGVkOGFhNGEsMHhlMzQxOGFjYikKK1dPUkQ2NCgweDViOWNjYTRmLDB4Nzc2M2UzNzMsIDB4NjgyZTZmZjMsMHhkNmIyYjhhMykKK1dPUkQ2NCgweDc0OGY4MmVlLDB4NWRlZmIyZmMsIDB4NzhhNTYzNmYsMHg0MzE3MmY2MCkKK1dPUkQ2NCgweDg0Yzg3ODE0LDB4YTFmMGFiNzIsIDB4OGNjNzAyMDgsMHgxYTY0MzllYykKK1dPUkQ2NCgweDkwYmVmZmZhLDB4MjM2MzFlMjgsIDB4YTQ1MDZjZWIsMHhkZTgyYmRlOSkKK1dPUkQ2NCgweGJlZjlhM2Y3LDB4YjJjNjc5MTUsIDB4YzY3MTc4ZjIsMHhlMzcyNTMyYikKK1dPUkQ2NCgweGNhMjczZWNlLDB4ZWEyNjYxOWMsIDB4ZDE4NmI4YzcsMHgyMWMwYzIwNykKK1dPUkQ2NCgweGVhZGE3ZGQ2LDB4Y2RlMGViMWUsIDB4ZjU3ZDRmN2YsMHhlZTZlZDE3OCkKK1dPUkQ2NCgweDA2ZjA2N2FhLDB4NzIxNzZmYmEsIDB4MGE2MzdkYzUsMHhhMmM4OThhNikKK1dPUkQ2NCgweDExM2Y5ODA0LDB4YmVmOTBkYWUsIDB4MWI3MTBiMzUsMHgxMzFjNDcxYikKK1dPUkQ2NCgweDI4ZGI3N2Y1LDB4MjMwNDdkODQsIDB4MzJjYWFiN2IsMHg0MGM3MjQ5MykKK1dPUkQ2NCgweDNjOWViZTBhLDB4MTVjOWJlYmMsIDB4NDMxZDY3YzQsMHg5YzEwMGQ0YykKK1dPUkQ2NCgweDRjYzVkNGJlLDB4Y2IzZTQyYjYsIDB4NTk3ZjI5OWMsMHhmYzY1N2UyYSkKK1dPUkQ2NCgweDVmY2I2ZmFiLDB4M2FkNmZhZWMsIDB4NmM0NDE5OGMsMHg0YTQ3NTgxNykKKy5zaXplCUs1MTIsLi1LNTEyCisuTE9QRU5TU0xfYXJtY2FwOgorLndvcmQJT1BFTlNTTF9hcm1jYXBfUC1zaGE1MTJfYmxvY2tfZGF0YV9vcmRlcgorLnNraXAJMzItNAorCisuZ2xvYmFsCXNoYTUxMl9ibG9ja19kYXRhX29yZGVyCisudHlwZQlzaGE1MTJfYmxvY2tfZGF0YV9vcmRlciwlZnVuY3Rpb24KK3NoYTUxMl9ibG9ja19kYXRhX29yZGVyOgorCXN1YglyMyxwYywjOAkJQCBzaGE1MTJfYmxvY2tfZGF0YV9vcmRlcgorCWFkZAkkbGVuLCRpbnAsJGxlbixsc2wjNwlAIGxlbiB0byBwb2ludCBhdCB0aGUgZW5kIG9mIGlucAorI2lmIF9fQVJNX0FSQ0hfXz49NworCWxkcglyMTIsLkxPUEVOU1NMX2FybWNhcAorCWxkcglyMTIsW3IzLHIxMl0JCUAgT1BFTlNTTF9hcm1jYXBfUAorCXRzdAlyMTIsIzEKKwlibmUJLkxORU9OCisjZW5kaWYKKwlzdG1kYglzcCEse3I0LXIxMixscn0KKwlzdWIJJEt0YmwscjMsIzY3MgkJQCBLNTEyCisJc3ViCXNwLHNwLCM5KjgKKworCWxkcgkkRWxvLFskY3R4LCMkRW9mZiskbG9dCisJbGRyCSRFaGksWyRjdHgsIyRFb2ZmKyRoaV0KKwlsZHIJJHQwLCBbJGN0eCwjJEdvZmYrJGxvXQorCWxkcgkkdDEsIFskY3R4LCMkR29mZiskaGldCisJbGRyCSR0MiwgWyRjdHgsIyRIb2ZmKyRsb10KKwlsZHIJJHQzLCBbJGN0eCwjJEhvZmYrJGhpXQorLkxvb3A6CisJc3RyCSR0MCwgW3NwLCMkR29mZiswXQorCXN0cgkkdDEsIFtzcCwjJEdvZmYrNF0KKwlzdHIJJHQyLCBbc3AsIyRIb2ZmKzBdCisJc3RyCSR0MywgW3NwLCMkSG9mZis0XQorCWxkcgkkQWxvLFskY3R4LCMkQW9mZiskbG9dCisJbGRyCSRBaGksWyRjdHgsIyRBb2ZmKyRoaV0KKwlsZHIJJFRsbyxbJGN0eCwjJEJvZmYrJGxvXQorCWxkcgkkVGhpLFskY3R4LCMkQm9mZiskaGldCisJbGRyCSR0MCwgWyRjdHgsIyRDb2ZmKyRsb10KKwlsZHIJJHQxLCBbJGN0eCwjJENvZmYrJGhpXQorCWxkcgkkdDIsIFskY3R4LCMkRG9mZiskbG9dCisJbGRyCSR0MywgWyRjdHgsIyREb2ZmKyRoaV0KKwlzdHIJJFRsbyxbc3AsIyRCb2ZmKzBdCisJc3RyCSRUaGksW3NwLCMkQm9mZis0XQorCXN0cgkkdDAsIFtzcCwjJENvZmYrMF0KKwlzdHIJJHQxLCBbc3AsIyRDb2ZmKzRdCisJc3RyCSR0MiwgW3NwLCMkRG9mZiswXQorCXN0cgkkdDMsIFtzcCwjJERvZmYrNF0KKwlsZHIJJFRsbyxbJGN0eCwjJEZvZmYrJGxvXQorCWxkcgkkVGhpLFskY3R4LCMkRm9mZiskaGldCisJc3RyCSRUbG8sW3NwLCMkRm9mZiswXQorCXN0cgkkVGhpLFtzcCwjJEZvZmYrNF0KKworLkwwMF8xNToKKyNpZiBfX0FSTV9BUkNIX188NworCWxkcmIJJFRsbyxbJGlucCwjN10KKwlsZHJiCSR0MCwgWyRpbnAsIzZdCisJbGRyYgkkdDEsIFskaW5wLCM1XQorCWxkcmIJJHQyLCBbJGlucCwjNF0KKwlsZHJiCSRUaGksWyRpbnAsIzNdCisJbGRyYgkkdDMsIFskaW5wLCMyXQorCW9ycgkkVGxvLCRUbG8sJHQwLGxzbCM4CisJbGRyYgkkdDAsIFskaW5wLCMxXQorCW9ycgkkVGxvLCRUbG8sJHQxLGxzbCMxNgorCWxkcmIJJHQxLCBbJGlucF0sIzgKKwlvcnIJJFRsbywkVGxvLCR0Mixsc2wjMjQKKwlvcnIJJFRoaSwkVGhpLCR0Myxsc2wjOAorCW9ycgkkVGhpLCRUaGksJHQwLGxzbCMxNgorCW9ycgkkVGhpLCRUaGksJHQxLGxzbCMyNAorI2Vsc2UKKwlsZHIJJFRsbyxbJGlucCwjNF0KKwlsZHIJJFRoaSxbJGlucF0sIzgKKyNpZmRlZiBfX0FSTUVMX18KKwlyZXYJJFRsbywkVGxvCisJcmV2CSRUaGksJFRoaQorI2VuZGlmCisjZW5kaWYKK19fXworCSZCT0RZXzAwXzE1KDB4OTQpOworJGNvZGUuPTw8X19fOworCXRzdAkkS3RibCwjMQorCWJlcQkuTDAwXzE1CisJbGRyCSR0MCxbc3AsI2AkWG9mZis4KigxNi0xKWArMF0KKwlsZHIJJHQxLFtzcCwjYCRYb2ZmKzgqKDE2LTEpYCs0XQorCWJpYwkkS3RibCwkS3RibCwjMQorLkwxNl83OToKKwlAIHNpZ21hMCh4KQkoUk9UUigoeCksMSkgIF4gUk9UUigoeCksOCkgIF4gKCh4KT4+NykpCisJQCBMTwkJbG8+PjFeaGk8PDMxICBeIGxvPj44XmhpPDwyNCBeIGxvPj43XmhpPDwyNQorCUAgSEkJCWhpPj4xXmxvPDwzMSAgXiBoaT4+OF5sbzw8MjQgXiBoaT4+NworCW1vdgkkVGxvLCR0MCxsc3IjMQorCWxkcgkkdDIsW3NwLCNgJFhvZmYrOCooMTYtMTQpYCswXQorCW1vdgkkVGhpLCR0MSxsc3IjMQorCWxkcgkkdDMsW3NwLCNgJFhvZmYrOCooMTYtMTQpYCs0XQorCWVvcgkkVGxvLCRUbG8sJHQxLGxzbCMzMQorCWVvcgkkVGhpLCRUaGksJHQwLGxzbCMzMQorCWVvcgkkVGxvLCRUbG8sJHQwLGxzciM4CisJZW9yCSRUaGksJFRoaSwkdDEsbHNyIzgKKwllb3IJJFRsbywkVGxvLCR0MSxsc2wjMjQKKwllb3IJJFRoaSwkVGhpLCR0MCxsc2wjMjQKKwllb3IJJFRsbywkVGxvLCR0MCxsc3IjNworCWVvcgkkVGhpLCRUaGksJHQxLGxzciM3CisJZW9yCSRUbG8sJFRsbywkdDEsbHNsIzI1CisKKwlAIHNpZ21hMSh4KQkoUk9UUigoeCksMTkpIF4gUk9UUigoeCksNjEpIF4gKCh4KT4+NikpCisJQCBMTwkJbG8+PjE5XmhpPDwxMyBeIGhpPj4yOV5sbzw8MyBeIGxvPj42XmhpPDwyNgorCUAgSEkJCWhpPj4xOV5sbzw8MTMgXiBsbz4+MjleaGk8PDMgXiBoaT4+NgorCW1vdgkkdDAsJHQyLGxzciMxOQorCW1vdgkkdDEsJHQzLGxzciMxOQorCWVvcgkkdDAsJHQwLCR0Myxsc2wjMTMKKwllb3IJJHQxLCR0MSwkdDIsbHNsIzEzCisJZW9yCSR0MCwkdDAsJHQzLGxzciMyOQorCWVvcgkkdDEsJHQxLCR0Mixsc3IjMjkKKwllb3IJJHQwLCR0MCwkdDIsbHNsIzMKKwllb3IJJHQxLCR0MSwkdDMsbHNsIzMKKwllb3IJJHQwLCR0MCwkdDIsbHNyIzYKKwllb3IJJHQxLCR0MSwkdDMsbHNyIzYKKwlsZHIJJHQyLFtzcCwjYCRYb2ZmKzgqKDE2LTkpYCswXQorCWVvcgkkdDAsJHQwLCR0Myxsc2wjMjYKKworCWxkcgkkdDMsW3NwLCNgJFhvZmYrOCooMTYtOSlgKzRdCisJYWRkcwkkVGxvLCRUbG8sJHQwCisJbGRyCSR0MCxbc3AsI2AkWG9mZis4KjE2YCswXQorCWFkYwkkVGhpLCRUaGksJHQxCisKKwlsZHIJJHQxLFtzcCwjYCRYb2ZmKzgqMTZgKzRdCisJYWRkcwkkVGxvLCRUbG8sJHQyCisJYWRjCSRUaGksJFRoaSwkdDMKKwlhZGRzCSRUbG8sJFRsbywkdDAKKwlhZGMJJFRoaSwkVGhpLCR0MQorX19fCisJJkJPRFlfMDBfMTUoMHgxNyk7CiskY29kZS49PDxfX187CisJbGRyZXEJJHQwLFtzcCwjYCRYb2ZmKzgqKDE2LTEpYCswXQorCWxkcmVxCSR0MSxbc3AsI2AkWG9mZis4KigxNi0xKWArNF0KKwliZXEJLkwxNl83OQorCWJpYwkkS3RibCwkS3RibCwjMQorCisJbGRyCSRUbG8sW3NwLCMkQm9mZiswXQorCWxkcgkkVGhpLFtzcCwjJEJvZmYrNF0KKwlsZHIJJHQwLCBbJGN0eCwjJEFvZmYrJGxvXQorCWxkcgkkdDEsIFskY3R4LCMkQW9mZiskaGldCisJbGRyCSR0MiwgWyRjdHgsIyRCb2ZmKyRsb10KKwlsZHIJJHQzLCBbJGN0eCwjJEJvZmYrJGhpXQorCWFkZHMJJHQwLCRBbG8sJHQwCisJc3RyCSR0MCwgWyRjdHgsIyRBb2ZmKyRsb10KKwlhZGMJJHQxLCRBaGksJHQxCisJc3RyCSR0MSwgWyRjdHgsIyRBb2ZmKyRoaV0KKwlhZGRzCSR0MiwkVGxvLCR0MgorCXN0cgkkdDIsIFskY3R4LCMkQm9mZiskbG9dCisJYWRjCSR0MywkVGhpLCR0MworCXN0cgkkdDMsIFskY3R4LCMkQm9mZiskaGldCisKKwlsZHIJJEFsbyxbc3AsIyRDb2ZmKzBdCisJbGRyCSRBaGksW3NwLCMkQ29mZis0XQorCWxkcgkkVGxvLFtzcCwjJERvZmYrMF0KKwlsZHIJJFRoaSxbc3AsIyREb2ZmKzRdCisJbGRyCSR0MCwgWyRjdHgsIyRDb2ZmKyRsb10KKwlsZHIJJHQxLCBbJGN0eCwjJENvZmYrJGhpXQorCWxkcgkkdDIsIFskY3R4LCMkRG9mZiskbG9dCisJbGRyCSR0MywgWyRjdHgsIyREb2ZmKyRoaV0KKwlhZGRzCSR0MCwkQWxvLCR0MAorCXN0cgkkdDAsIFskY3R4LCMkQ29mZiskbG9dCisJYWRjCSR0MSwkQWhpLCR0MQorCXN0cgkkdDEsIFskY3R4LCMkQ29mZiskaGldCisJYWRkcwkkdDIsJFRsbywkdDIKKwlzdHIJJHQyLCBbJGN0eCwjJERvZmYrJGxvXQorCWFkYwkkdDMsJFRoaSwkdDMKKwlzdHIJJHQzLCBbJGN0eCwjJERvZmYrJGhpXQorCisJbGRyCSRUbG8sW3NwLCMkRm9mZiswXQorCWxkcgkkVGhpLFtzcCwjJEZvZmYrNF0KKwlsZHIJJHQwLCBbJGN0eCwjJEVvZmYrJGxvXQorCWxkcgkkdDEsIFskY3R4LCMkRW9mZiskaGldCisJbGRyCSR0MiwgWyRjdHgsIyRGb2ZmKyRsb10KKwlsZHIJJHQzLCBbJGN0eCwjJEZvZmYrJGhpXQorCWFkZHMJJEVsbywkRWxvLCR0MAorCXN0cgkkRWxvLFskY3R4LCMkRW9mZiskbG9dCisJYWRjCSRFaGksJEVoaSwkdDEKKwlzdHIJJEVoaSxbJGN0eCwjJEVvZmYrJGhpXQorCWFkZHMJJHQyLCRUbG8sJHQyCisJc3RyCSR0MiwgWyRjdHgsIyRGb2ZmKyRsb10KKwlhZGMJJHQzLCRUaGksJHQzCisJc3RyCSR0MywgWyRjdHgsIyRGb2ZmKyRoaV0KKworCWxkcgkkQWxvLFtzcCwjJEdvZmYrMF0KKwlsZHIJJEFoaSxbc3AsIyRHb2ZmKzRdCisJbGRyCSRUbG8sW3NwLCMkSG9mZiswXQorCWxkcgkkVGhpLFtzcCwjJEhvZmYrNF0KKwlsZHIJJHQwLCBbJGN0eCwjJEdvZmYrJGxvXQorCWxkcgkkdDEsIFskY3R4LCMkR29mZiskaGldCisJbGRyCSR0MiwgWyRjdHgsIyRIb2ZmKyRsb10KKwlsZHIJJHQzLCBbJGN0eCwjJEhvZmYrJGhpXQorCWFkZHMJJHQwLCRBbG8sJHQwCisJc3RyCSR0MCwgWyRjdHgsIyRHb2ZmKyRsb10KKwlhZGMJJHQxLCRBaGksJHQxCisJc3RyCSR0MSwgWyRjdHgsIyRHb2ZmKyRoaV0KKwlhZGRzCSR0MiwkVGxvLCR0MgorCXN0cgkkdDIsIFskY3R4LCMkSG9mZiskbG9dCisJYWRjCSR0MywkVGhpLCR0MworCXN0cgkkdDMsIFskY3R4LCMkSG9mZiskaGldCisKKwlhZGQJc3Asc3AsIzY0MAorCXN1YgkkS3RibCwkS3RibCwjNjQwCisKKwl0ZXEJJGlucCwkbGVuCisJYm5lCS5Mb29wCisKKwlhZGQJc3Asc3AsIzgqOQkJQCBkZXN0cm95IGZyYW1lCisjaWYgX19BUk1fQVJDSF9fPj01CisJbGRtaWEJc3AhLHtyNC1yMTIscGN9CisjZWxzZQorCWxkbWlhCXNwISx7cjQtcjEyLGxyfQorCXRzdAlsciwjMQorCW1vdmVxCXBjLGxyCQkJQCBiZSBiaW5hcnkgY29tcGF0aWJsZSB3aXRoIFY0LCB5ZXQKKwlieAlscgkJCUAgaW50ZXJvcGVyYWJsZSB3aXRoIFRodW1iIElTQTotKQorI2VuZGlmCitfX18KKworeworbXkgQFNpZ21hMD0oMjgsMzQsMzkpOworbXkgQFNpZ21hMT0oMTQsMTgsNDEpOworbXkgQHNpZ21hMD0oMSwgOCwgNyk7CitteSBAc2lnbWExPSgxOSw2MSw2KTsKKworbXkgJEt0Ymw9InIzIjsKK215ICRjbnQ9InIxMiI7CSMgdm9sYXRpbGUgcmVnaXN0ZXIga25vd24gYXMgaXAsIGludHJhLXByb2NlZHVyZS1jYWxsIHNjcmF0Y2gKKworbXkgQFg9bWFwKCJkJF8iLCgwLi4xNSkpOworbXkgQFY9KCRBLCRCLCRDLCRELCRFLCRGLCRHLCRIKT1tYXAoImQkXyIsKDE2Li4yMykpOworCitzdWIgTkVPTl8wMF8xNSgpIHsKK215ICRpPXNoaWZ0OworbXkgKCRhLCRiLCRjLCRkLCRlLCRmLCRnLCRoKT1AXzsKK215ICgkdDAsJHQxLCR0MiwkVDEsJEssJENoLCRNYWopPW1hcCgiZCRfIiwoMjQuLjMxKSk7CSMgdGVtcHMKKworJGNvZGUuPTw8X19fIGlmICgkaTwxNiB8fCAkaSYxKTsKKwl2c2hyLnU2NAkkdDAsJGUsI0BTaWdtYTFbMF0JQCAkaQorI2lmICRpPDE2CisJdmxkMS42NAkJe0BYWyRpJTE2XX0sWyRpbnBdIQlAIGhhbmRsZXMgdW5hbGlnbmVkCisjZW5kaWYKKwl2c2hyLnU2NAkkdDEsJGUsI0BTaWdtYTFbMV0KKyNpZiAkaT4wCisJIHZhZGQuaTY0CSRhLCRNYWoJCQlAIGgrPU1haiBmcm9tIHRoZSBwYXN0CisjZW5kaWYKKwl2c2hyLnU2NAkkdDIsJGUsI0BTaWdtYTFbMl0KK19fXworJGNvZGUuPTw8X19fOworCXZsZDEuNjQJCXskS30sWyRLdGJsLDo2NF0hCUAgS1tpKytdCisJdnNsaS42NAkJJHQwLCRlLCNgNjQtQFNpZ21hMVswXWAKKwl2c2xpLjY0CQkkdDEsJGUsI2A2NC1AU2lnbWExWzFdYAorCXZtb3YJCSRDaCwkZQorCXZzbGkuNjQJCSR0MiwkZSwjYDY0LUBTaWdtYTFbMl1gCisjaWYgJGk8MTYgJiYgZGVmaW5lZChfX0FSTUVMX18pCisJdnJldjY0LjgJQFhbJGldLEBYWyRpXQorI2VuZGlmCisJdmVvcgkJJHQxLCR0MAorCXZic2wJCSRDaCwkZiwkZwkJQCBDaChlLGYsZykKKwl2c2hyLnU2NAkkdDAsJGEsI0BTaWdtYTBbMF0KKwl2ZW9yCQkkdDIsJHQxCQkJQCBTaWdtYTEoZSkKKwl2YWRkLmk2NAkkVDEsJENoLCRoCisJdnNoci51NjQJJHQxLCRhLCNAU2lnbWEwWzFdCisJdnNsaS42NAkJJHQwLCRhLCNgNjQtQFNpZ21hMFswXWAKKwl2YWRkLmk2NAkkVDEsJHQyCisJdnNoci51NjQJJHQyLCRhLCNAU2lnbWEwWzJdCisJdmFkZC5pNjQJJEssQFhbJGklMTZdCisJdnNsaS42NAkJJHQxLCRhLCNgNjQtQFNpZ21hMFsxXWAKKwl2ZW9yCQkkTWFqLCRhLCRiCisJdnNsaS42NAkJJHQyLCRhLCNgNjQtQFNpZ21hMFsyXWAKKwl2ZW9yCQkkaCwkdDAsJHQxCisJdmFkZC5pNjQJJFQxLCRLCisJdmJzbAkJJE1haiwkYywkYgkJQCBNYWooYSxiLGMpCisJdmVvcgkJJGgsJHQyCQkJQCBTaWdtYTAoYSkKKwl2YWRkLmk2NAkkZCwkVDEKKwl2YWRkLmk2NAkkTWFqLCRUMQorCUAgdmFkZC5pNjQJJGgsJE1hagorX19fCit9CisKK3N1YiBORU9OXzE2Xzc5KCkgeworbXkgJGk9c2hpZnQ7CisKK2lmICgkaSYxKQl7ICZORU9OXzAwXzE1KCRpLEBfKTsgcmV0dXJuOyB9CisKKyMgMngtdmVjdG9yaXplZCwgdGhlcmVmb3JlIHJ1bnMgZXZlcnkgMm5kIHJvdW5kCitteSBAWD1tYXAoInEkXyIsKDAuLjcpKTsJCQkjIHZpZXcgQFggYXMgMTI4LWJpdCB2ZWN0b3IKK215ICgkdDAsJHQxLCRzMCwkczEpID0gbWFwKCJxJF8iLCgxMi4uMTUpKTsJIyB0ZW1wcworbXkgKCRkMCwkZDEsJGQyKSA9IG1hcCgiZCRfIiwoMjQuLjI2KSk7CQkjIHRlbXBzIGZyb20gTkVPTl8wMF8xNQorbXkgJGU9QF9bNF07CQkJCQkjICRlIGZyb20gTkVPTl8wMF8xNQorJGkgLz0gMjsKKyRjb2RlLj08PF9fXzsKKwl2c2hyLnU2NAkkdDAsQFhbKCRpKzcpJThdLCNAc2lnbWExWzBdCisJdnNoci51NjQJJHQxLEBYWygkaSs3KSU4XSwjQHNpZ21hMVsxXQorCSB2YWRkLmk2NAlAX1swXSxkMzAJCQlAIGgrPU1haiBmcm9tIHRoZSBwYXN0CisJdnNoci51NjQJJHMxLEBYWygkaSs3KSU4XSwjQHNpZ21hMVsyXQorCXZzbGkuNjQJCSR0MCxAWFsoJGkrNyklOF0sI2A2NC1Ac2lnbWExWzBdYAorCXZleHQuOAkJJHMwLEBYWyRpJThdLEBYWygkaSsxKSU4XSwjOAlAIFhbaSsxXQorCXZzbGkuNjQJCSR0MSxAWFsoJGkrNyklOF0sI2A2NC1Ac2lnbWExWzFdYAorCXZlb3IJCSRzMSwkdDAKKwl2c2hyLnU2NAkkdDAsJHMwLCNAc2lnbWEwWzBdCisJdmVvcgkJJHMxLCR0MQkJCQlAIHNpZ21hMShYW2krMTRdKQorCXZzaHIudTY0CSR0MSwkczAsI0BzaWdtYTBbMV0KKwl2YWRkLmk2NAlAWFskaSU4XSwkczEKKwl2c2hyLnU2NAkkczEsJHMwLCNAc2lnbWEwWzJdCisJdnNsaS42NAkJJHQwLCRzMCwjYDY0LUBzaWdtYTBbMF1gCisJdnNsaS42NAkJJHQxLCRzMCwjYDY0LUBzaWdtYTBbMV1gCisJdmV4dC44CQkkczAsQFhbKCRpKzQpJThdLEBYWygkaSs1KSU4XSwjOAlAIFhbaSs5XQorCXZlb3IJCSRzMSwkdDAKKwl2c2hyLnU2NAkkZDAsJGUsI0BTaWdtYTFbMF0JCUAgZnJvbSBORU9OXzAwXzE1CisJdmFkZC5pNjQJQFhbJGklOF0sJHMwCisJdnNoci51NjQJJGQxLCRlLCNAU2lnbWExWzFdCQlAIGZyb20gTkVPTl8wMF8xNQorCXZlb3IJCSRzMSwkdDEJCQkJQCBzaWdtYTAoWFtpKzFdKQorCXZzaHIudTY0CSRkMiwkZSwjQFNpZ21hMVsyXQkJQCBmcm9tIE5FT05fMDBfMTUKKwl2YWRkLmk2NAlAWFskaSU4XSwkczEKK19fXworCSZORU9OXzAwXzE1KDIqJGksQF8pOworfQorCiskY29kZS49PDxfX187CisjaWYgX19BUk1fQVJDSF9fPj03CisuZnB1CW5lb24KKworLmFsaWduCTQKKy5MTkVPTjoKKwlkbWIJCQkJQCBlcnJhdGEgIzQ1MTAzNCBvbiBlYXJseSBDb3J0ZXggQTgKKwl2c3RtZGIJc3AhLHtkOC1kMTV9CQlAIEFCSSBzcGVjaWZpY2F0aW9uIHNheXMgc28KKwlzdWIJJEt0YmwscjMsIzY3MgkJQCBLNTEyCisJdmxkbWlhCSRjdHgseyRBLSRIfQkJQCBsb2FkIGNvbnRleHQKKy5Mb29wX25lb246CitfX18KK2ZvcigkaT0wOyRpPDE2OyRpKyspCXsgJk5FT05fMDBfMTUoJGksQFYpOyB1bnNoaWZ0KEBWLHBvcChAVikpOyB9CiskY29kZS49PDxfX187CisJbW92CQkkY250LCM0CisuTDE2Xzc5X25lb246CisJc3VicwkJJGNudCwjMQorX19fCitmb3IoOyRpPDMyOyRpKyspCXsgJk5FT05fMTZfNzkoJGksQFYpOyB1bnNoaWZ0KEBWLHBvcChAVikpOyB9CiskY29kZS49PDxfX187CisJYm5lCQkuTDE2Xzc5X25lb24KKworCSB2YWRkLmk2NAkkQSxkMzAJCUAgaCs9TWFqIGZyb20gdGhlIHBhc3QKKwl2bGRtaWEJCSRjdHgse2QyNC1kMzF9CUAgbG9hZCBjb250ZXh0IHRvIHRlbXAKKwl2YWRkLmk2NAlxOCxxMTIJCUAgdmVjdG9yaXplZCBhY2N1bXVsYXRlCisJdmFkZC5pNjQJcTkscTEzCisJdmFkZC5pNjQJcTEwLHExNAorCXZhZGQuaTY0CXExMSxxMTUKKwl2c3RtaWEJCSRjdHgseyRBLSRIfQlAIHNhdmUgY29udGV4dAorCXRlcQkJJGlucCwkbGVuCisJc3ViCQkkS3RibCwjNjQwCUAgcmV3aW5kIEs1MTIKKwlibmUJCS5Mb29wX25lb24KKworCXZsZG1pYQlzcCEse2Q4LWQxNX0JCUAgZXBpbG9ndWUKKwlieAlscgorI2VuZGlmCitfX18KK30KKyRjb2RlLj08PF9fXzsKKy5zaXplCXNoYTUxMl9ibG9ja19kYXRhX29yZGVyLC4tc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXIKKy5hc2NpegkiU0hBNTEyIGJsb2NrIHRyYW5zZm9ybSBmb3IgQVJNdjQvTkVPTiwgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQG9wZW5zc2wub3JnPiIKKy5hbGlnbgkyCisuY29tbQlPUEVOU1NMX2FybWNhcF9QLDQsNAorCisjZW5kaWYKK19fXworCiskY29kZSA9fiBzL1xgKFteXGBdKilcYC9ldmFsICQxL2dlbTsKKyRjb2RlID1+IHMvXGJieFxzK2xyXGIvLndvcmRcdDB4ZTEyZmZmMWUvZ207CSMgbWFrZSBpdCBwb3NzaWJsZSB0byBjb21waWxlIHdpdGggLW1hcmNoPWFybXY0CitwcmludCAkY29kZTsKK2Nsb3NlIFNURE9VVDsgIyBlbmZvcmNlIGZsdXNoCmRpZmYgLS1naXQgYS9jcnlwdG8vc2hhL2FzbS9zaGE1MTIteDg2XzY0LnBsIGIvY3J5cHRvL3NoYS9hc20vc2hhNTEyLXg4Nl82NC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzEyODVmCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3NoYS9hc20vc2hhNTEyLXg4Nl82NC5wbApAQCAtMCwwICsxLDIxNTIgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKyMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgV3JpdHRlbiBieSBBbmR5IFBvbHlha292IDxhcHByb0BvcGVuc3NsLm9yZz4gZm9yIHRoZSBPcGVuU1NMCisjIHByb2plY3QuIFJpZ2h0cyBmb3IgcmVkaXN0cmlidXRpb24gYW5kIHVzYWdlIGluIHNvdXJjZSBhbmQgYmluYXJ5CisjIGZvcm1zIGFyZSBncmFudGVkIGFjY29yZGluZyB0byB0aGUgT3BlblNTTCBsaWNlbnNlLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBzaGEyNTYvNTEyX2Jsb2NrIHByb2NlZHVyZSBmb3IgeDg2XzY0LgorIworIyA0MCUgaW1wcm92ZW1lbnQgb3ZlciBjb21waWxlci1nZW5lcmF0ZWQgY29kZSBvbiBPcHRlcm9uLiBPbiBFTTY0VAorIyBzaGEyNTYgd2FzIG9ic2VydmVkIHRvIHJ1biA+ODAlIGZhc3RlciBhbmQgc2hhNTEyIC0gPjQwJS4gTm8gbWFnaWNhbAorIyB0cmlja3MsIGp1c3Qgc3RyYWlnaHQgaW1wbGVtZW50YXRpb24uLi4gSSByZWFsbHkgd29uZGVyIHdoeSBnY2MKKyMgW2JlaW5nIGFybWVkIHdpdGggaW5saW5lIGFzc2VtYmxlcl0gZmFpbHMgdG8gZ2VuZXJhdGUgYXMgZmFzdCBjb2RlLgorIyBUaGUgb25seSB0aGluZyB3aGljaCBpcyBjb29sIGFib3V0IHRoaXMgbW9kdWxlIGlzIHRoYXQgaXQncyB2ZXJ5CisjIHNhbWUgaW5zdHJ1Y3Rpb24gc2VxdWVuY2UgdXNlZCBmb3IgYm90aCBTSEEtMjU2IGFuZCBTSEEtNTEyLiBJbgorIyBmb3JtZXIgY2FzZSB0aGUgaW5zdHJ1Y3Rpb25zIG9wZXJhdGUgb24gMzItYml0IG9wZXJhbmRzLCB3aGlsZSBpbgorIyBsYXR0ZXIgLSBvbiA2NC1iaXQgb25lcy4gQWxsIEkgaGFkIHRvIGRvIGlzIHRvIGdldCBvbmUgZmxhdm9yIHJpZ2h0LAorIyB0aGUgb3RoZXIgb25lIHBhc3NlZCB0aGUgdGVzdCByaWdodCBhd2F5Oi0pCisjCisjIHNoYTI1Nl9ibG9jayBydW5zIGluIH4xMDA1IGN5Y2xlcyBvbiBPcHRlcm9uLCB3aGljaCBnaXZlcyB5b3UKKyMgYXN5bXB0b3RpYyBwZXJmb3JtYW5jZSBvZiA2NCoxMDAwLzEwMDU9NjMuN01CcHMgdGltZXMgQ1BVIGNsb2NrCisjIGZyZXF1ZW5jeSBpbiBHSHouIHNoYTUxMl9ibG9jayBydW5zIGluIH4xMjc1IGN5Y2xlcywgd2hpY2ggcmVzdWx0cworIyBpbiAxMjgqMTAwMC8xMjc1PTEwME1CcHMgcGVyIEdIei4gSXMgdGhlcmUgcm9vbSBmb3IgaW1wcm92ZW1lbnQ/CisjIFdlbGwsIGlmIHlvdSBjb21wYXJlIGl0IHRvIElBLTY0IGltcGxlbWVudGF0aW9uLCB3aGljaCBtYWludGFpbnMKKyMgWFsxNl0gaW4gcmVnaXN0ZXIgYmFua1shXSwgdGVuZHMgdG8gNCBpbnN0cnVjdGlvbnMgcGVyIENQVSBjbG9jaworIyBjeWNsZSBhbmQgcnVucyBpbiAxMDAzIGN5Y2xlcywgMTI3NSBpcyB2ZXJ5IGdvb2QgcmVzdWx0IGZvciAzLXdheQorIyBpc3N1ZSBPcHRlcm9uIHBpcGVsaW5lIGFuZCBYWzE2XSBtYWludGFpbmVkIGluIG1lbW9yeS4gU28gdGhhdCAqaWYqCisjIHRoZXJlIGlzIGEgd2F5IHRvIGltcHJvdmUgaXQsICp0aGVuKiB0aGUgb25seSB3YXkgd291bGQgYmUgdG8gdHJ5IHRvCisjIG9mZmxvYWQgWFsxNl0gdXBkYXRlcyB0byBTU0UgdW5pdCwgYnV0IHRoYXQgd291bGQgcmVxdWlyZSAiZGVlcGVyIgorIyBsb29wIHVucm9sbCwgd2hpY2ggaW4gdHVybiB3b3VsZCBuYXR1cmFsbHkgY2F1c2Ugc2l6ZSBibG93LXVwLCBub3QKKyMgdG8gbWVudGlvbiBpbmNyZWFzZWQgY29tcGxleGl0eSEgQW5kIG9uY2UgYWdhaW4sIG9ubHkgKmlmKiBpdCdzCisjIGFjdHVhbGx5IHBvc3NpYmxlIHRvIG5vdGljZWFibHkgaW1wcm92ZSBvdmVyYWxsIElMUCwgaW5zdHJ1Y3Rpb24KKyMgbGV2ZWwgcGFyYWxsZWxpc20sIG9uIGEgZ2l2ZW4gQ1BVIGltcGxlbWVudGF0aW9uIGluIHRoaXMgY2FzZS4KKyMKKyMgU3BlY2lhbCBub3RlIG9uIEludGVsIEVNNjRULiBXaGlsZSBPcHRlcm9uIENQVSBleGhpYml0cyBwZXJmZWN0CisjIHBlcmZyb21hbmNlIHJhdGlvIG9mIDEuNSBiZXR3ZWVuIDY0LSBhbmQgMzItYml0IGZsYXZvcnMgW3NlZSBhYm92ZV0sCisjIFtjdXJyZW50bHkgYXZhaWxhYmxlXSBFTTY0VCBDUFVzIGFwcGFyZW50bHkgYXJlIGZhciBmcm9tIGl0LiBPbiB0aGUKKyMgY29udHJhcnksIDY0LWJpdCB2ZXJzaW9uLCBzaGE1MTJfYmxvY2ssIGlzIH4zMCUgKnNsb3dlciogdGhhbiAzMi1iaXQKKyMgc2hhMjU2X2Jsb2NrOi0oIFRoaXMgaXMgcHJlc3VtYWJseSBiZWNhdXNlIDY0LWJpdCBzaGlmdHMvcm90YXRlcworIyBhcHBhcmVudGx5IGFyZSBub3QgYXRvbWljIGluc3RydWN0aW9ucywgYnV0IGltcGxlbWVudGVkIGluIG1pY3JvY29kZS4KKyMKKyMgTWF5IDIwMTIuCisjCisjIE9wdGltaXphdGlvbiBpbmNsdWRpbmcgb25lIG9mIFBhdmVsIFNlbWphbm92J3MgaWRlYXMsIGFsdGVybmF0aXZlCisjIE1haiwgcmVzdWx0ZWQgaW4gPj01JSBpbXByb3ZlbWVudCBvbiBtb3N0IENQVXMsICsyMCUgU0hBMjU2IGFuZAorIyB1bmZvcnR1bmF0ZWx5IC0yJSBTSEE1MTIgb24gUDQgW3doaWNoIG5vYm9keSBzaG91bGQgY2FyZSBhYm91dAorIyB0aGF0IG11Y2hdLgorIworIyBKdW5lIDIwMTIuCisjCisjIEFkZCBTSU1EIGNvZGUgcGF0aHMsIHNlZSBiZWxvdyBmb3IgaW1wcm92ZW1lbnQgY29lZmZpY2llbnRzLiBTU1NFMworIyBjb2RlIHBhdGggd2FzIG5vdCBhdHRlbXB0ZWQgZm9yIFNIQTUxMiwgYmVjYXVzZSBpbXByb3ZlbWVudCBpcyBub3QKKyMgZXN0aW1hdGVkIHRvIGJlIGhpZ2ggZW5vdWdoLCBub3RpY2VhYmx5IGxlc3MgdGhhbiA5JSwgdG8ganVzdGlmeQorIyB0aGUgZWZmb3J0LCBub3Qgb24gcHJlLUFWWCBwcm9jZXNzb3JzLiBbT2J2aW91c2x5IHdpdGggZXhjbHVzaW9uCisjIGZvciBWSUEgTmFubywgYnV0IGl0IGhhcyBTSEE1MTIgaW5zdHJ1Y3Rpb24gdGhhdCBpcyBmYXN0ZXIgYW5kCisjIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuXSBGb3IgcmVmZXJlbmNlLCBjb3JyZXNwb25kaW5nIGVzdGltYXRlZAorIyB1cHBlciBsaW1pdCBmb3IgaW1wcm92ZW1lbnQgZm9yIFNTU0UzIFNIQTI1NiBpcyAyOCUuIFRoZSBmYWN0IHRoYXQKKyMgaGlnaGVyIGNvZWZmaWNpZW50cyBhcmUgb2JzZXJ2ZWQgb24gVklBIE5hbm8gYW5kIEJ1bGxkb3plciBoYXMgbW9yZQorIyB0byBkbyB3aXRoIHNwZWNpZmljcyBvZiB0aGVpciBhcmNoaXRlY3R1cmUgW3doaWNoIGlzIHRvcGljIGZvcgorIyBzZXBhcmF0ZSBkaXNjdXNzaW9uXS4KKyMKKyMgTm92ZW1iZXIgMjAxMi4KKyMKKyMgQWRkIEFWWDIgY29kZSBwYXRoLiBUd28gY29uc2VjdXRpdmUgaW5wdXQgYmxvY2tzIGFyZSBsb2FkZWQgdG8KKyMgMjU2LWJpdCAleW1tIHJlZ2lzdGVycywgd2l0aCBkYXRhIGZyb20gZmlyc3QgYmxvY2sgdG8gbGVhc3QKKyMgc2lnbmlmaWNhbnQgMTI4LWJpdCBoYWx2ZXMgYW5kIGRhdGEgZnJvbSBzZWNvbmQgdG8gbW9zdCBzaWduaWZpY2FudC4KKyMgVGhlIGRhdGEgaXMgdGhlbiBwcm9jZXNzZWQgd2l0aCBzYW1lIFNJTUQgaW5zdHJ1Y3Rpb24gc2VxdWVuY2UgYXMKKyMgZm9yIEFWWCwgYnV0IHdpdGggJXltbSBhcyBvcGVyYW5kcy4gU2lkZSBlZmZlY3QgaXMgaW5jcmVhc2VkIHN0YWNrCisjIGZyYW1lLCA0NDggYWRkaXRpb25hbCBieXRlcyBpbiBTSEEyNTYgYW5kIDExNTIgaW4gU0hBNTEyLgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEN1cnJlbnQgcGVyZm9ybWFuY2UgaW4gY3ljbGVzIHBlciBwcm9jZXNzZWQgYnl0ZSAobGVzcyBpcyBiZXR0ZXIpOgorIworIwkJU0hBMjU2CVNTU0UzICAgICAgIEFWWC9YT1AoKikJICAgIFNIQTUxMiAgQVZYL1hPUCgqKQorIworIyBBTUQgSzgJMTQuOQktCSAgICAtCQkgICAgOS41NyAgICAtCisjIFA0CQkxNy4zCS0JICAgIC0JCSAgICAzMC44ICAgIC0KKyMgQ29yZSAyCTE1LjYJMTMuOCgrMTMlKSAgLQkJICAgIDkuOTcgICAgLQorIyBXZXN0bWVyZQkxNC44CTEyLjMoKzE5JSkgIC0JCSAgICA5LjU4ICAgIC0KKyMgU2FuZHkgQnJpZGdlCTE3LjQJMTQuMigrMjMlKSAgMTEuNigrNTAlKCoqKSkgIDExLjIgICAgOC4xMCgrMzglKCoqKSkKKyMgSXZ5IEJyaWRnZQkxMi42CTEwLjUoKzIwJSkgIDEwLjMoKzIyJSkJICAgIDguMTcgICAgNy4yMigrMTMlKQorIyBIYXN3ZWxsCTEyLjIJOS4yOCgrMzElKSAgNy44MCgrNTYlKQkgICAgNy42NiAgICA1LjQwKCs0MiUpCisjIEJ1bGxkb3plcgkyMS4xCTEzLjYoKzU0JSkgIDEzLjYoKzU0JSgqKiopKSAxMy41ICAgIDguNTgoKzU3JSkKKyMgVklBIE5hbm8JMjMuMAkxNi41KCszOSUpICAtCQkgICAgMTQuNyAgICAtCisjIEF0b20JCTIzLjAJMTguOSgrMjIlKSAgLQkJICAgIDE0LjcgICAgLQorIworIyAoKikJd2hpY2hldmVyIGJlc3QgYXBwbGljYWJsZTsKKyMgKCoqKQlzd2l0Y2ggZnJvbSByb3IgdG8gc2hyZCBzdGFuZHMgZm9yIGZhaXIgc2hhcmUgb2YgaW1wcm92ZW1lbnQ7CisjICgqKiopCWV4ZWN1dGlvbiB0aW1lIGlzIGZ1bGx5IGRldGVybWluZWQgYnkgcmVtYWluaW5nIGludGVnZXItb25seQorIwlwYXJ0LCBib2R5XzAwXzE1OyByZWR1Y2luZyB0aGUgYW1vdW50IG9mIFNJTUQgaW5zdHJ1Y3Rpb25zCisjCWJlbG93IGNlcnRhaW4gbGltaXQgbWFrZXMgbm8gZGlmZmVyZW5jZS9zZW5zZTsgdG8gY29uc2VydmUKKyMJc3BhY2UgU0hBMjU2IFhPUCBjb2RlIHBhdGggaXMgdGhlcmVmb3JlIG9taXR0ZWQ7CisKKyRmbGF2b3VyID0gc2hpZnQ7Ciskb3V0cHV0ICA9IHNoaWZ0OworaWYgKCRmbGF2b3VyID1+IC9cLi8pIHsgJG91dHB1dCA9ICRmbGF2b3VyOyB1bmRlZiAkZmxhdm91cjsgfQorCiskd2luNjQ9MDsgJHdpbjY0PTEgaWYgKCRmbGF2b3VyID1+IC9bbm1dYXNtfG1pbmd3NjQvIHx8ICRvdXRwdXQgPX4gL1wuYXNtJC8pOworCiskMCA9fiBtLyguKltcL1xcXSlbXlwvXFxdKyQvOyAkZGlyPSQxOworKCAkeGxhdGU9IiR7ZGlyfXg4Nl82NC14bGF0ZS5wbCIgYW5kIC1mICR4bGF0ZSApIG9yCisoICR4bGF0ZT0iJHtkaXJ9Li4vLi4vcGVybGFzbS94ODZfNjQteGxhdGUucGwiIGFuZCAtZiAkeGxhdGUpIG9yCitkaWUgImNhbid0IGxvY2F0ZSB4ODZfNjQteGxhdGUucGwiOworCitpZiAoYCRFTlZ7Q0N9IC1XYSwtdiAtYyAtbyAvZGV2L251bGwgLXggYXNzZW1ibGVyIC9kZXYvbnVsbCAyPiYxYAorCQk9fiAvR05VIGFzc2VtYmxlciB2ZXJzaW9uIChbMi05XVwuWzAtOV0rKS8pIHsKKwkkYXZ4ID0gKCQxPj0yLjE5KSArICgkMT49Mi4yMik7Cit9CisKK2lmICghJGF2eCAmJiAkd2luNjQgJiYgKCRmbGF2b3VyID1+IC9uYXNtLyB8fCAkRU5We0FTTX0gPX4gL25hc20vKSAmJgorCSAgIGBuYXNtIC12IDI+JjFgID1+IC9OQVNNIHZlcnNpb24gKFsyLTldXC5bMC05XSspLykgeworCSRhdnggPSAoJDE+PTIuMDkpICsgKCQxPj0yLjEwKTsKK30KKworaWYgKCEkYXZ4ICYmICR3aW42NCAmJiAoJGZsYXZvdXIgPX4gL21hc20vIHx8ICRFTlZ7QVNNfSA9fiAvbWw2NC8pICYmCisJICAgYG1sNjQgMj4mMWAgPX4gL1ZlcnNpb24gKFswLTldKylcLi8pIHsKKwkkYXZ4ID0gKCQxPj0xMCkgKyAoJDE+PTExKTsKK30KKworb3BlbiBPVVQsInwgXCIkXlhcIiAkeGxhdGUgJGZsYXZvdXIiOworKlNURE9VVD0qT1VUOworCitpZiAoJG91dHB1dCA9fiAvNTEyLykgeworCSRmdW5jPSJzaGE1MTJfYmxvY2tfZGF0YV9vcmRlciI7CisJJFRBQkxFPSJLNTEyIjsKKwkkU1o9ODsKKwlAUk9UPSgkQSwkQiwkQywkRCwkRSwkRiwkRywkSCk9KCIlcmF4IiwiJXJieCIsIiVyY3giLCIlcmR4IiwKKwkJCQkJIiVyOCIsICIlcjkiLCAiJXIxMCIsIiVyMTEiKTsKKwkoJFQxLCRhMCwkYTEsJGEyLCRhMyk9KCIlcjEyIiwiJXIxMyIsIiVyMTQiLCIlcjE1IiwiJXJkaSIpOworCUBTaWdtYTA9KDI4LDM0LDM5KTsKKwlAU2lnbWExPSgxNCwxOCw0MSk7CisJQHNpZ21hMD0oMSwgIDgsIDcpOworCUBzaWdtYTE9KDE5LDYxLCA2KTsKKwkkcm91bmRzPTgwOworfSBlbHNlIHsKKwkkZnVuYz0ic2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXIiOworCSRUQUJMRT0iSzI1NiI7CisJJFNaPTQ7CisJQFJPVD0oJEEsJEIsJEMsJEQsJEUsJEYsJEcsJEgpPSgiJWVheCIsIiVlYngiLCIlZWN4IiwiJWVkeCIsCisJCQkJCSIlcjhkIiwiJXI5ZCIsIiVyMTBkIiwiJXIxMWQiKTsKKwkoJFQxLCRhMCwkYTEsJGEyLCRhMyk9KCIlcjEyZCIsIiVyMTNkIiwiJXIxNGQiLCIlcjE1ZCIsIiVlZGkiKTsKKwlAU2lnbWEwPSggMiwxMywyMik7CisJQFNpZ21hMT0oIDYsMTEsMjUpOworCUBzaWdtYTA9KCA3LDE4LCAzKTsKKwlAc2lnbWExPSgxNywxOSwxMCk7CisJJHJvdW5kcz02NDsKK30KKworJGN0eD0iJXJkaSI7CSMgMXN0IGFyZywgemFwcGVkIGJ5ICRhMworJGlucD0iJXJzaSI7CSMgMm5kIGFyZworJFRibD0iJXJicCI7CisKKyRfY3R4PSIxNiokU1orMCo4KCVyc3ApIjsKKyRfaW5wPSIxNiokU1orMSo4KCVyc3ApIjsKKyRfZW5kPSIxNiokU1orMio4KCVyc3ApIjsKKyRfcnNwPSIxNiokU1orMyo4KCVyc3ApIjsKKyRmcmFtZXN6PSIxNiokU1orNCo4IjsKKworCitzdWIgUk9VTkRfMDBfMTUoKQoreyBteSAoJGksJGEsJGIsJGMsJGQsJGUsJGYsJGcsJGgpID0gQF87CisgIG15ICRTVFJJREU9JFNaOworICAgICAkU1RSSURFICs9IDE2IGlmICgkaSUoMTYvJFNaKT09KDE2LyRTWi0xKSk7CisKKyRjb2RlLj08PF9fXzsKKwlyb3IJXCRgJFNpZ21hMVsyXS0kU2lnbWExWzFdYCwkYTAKKwltb3YJJGYsJGEyCisKKwl4b3IJJGUsJGEwCisJcm9yCVwkYCRTaWdtYTBbMl0tJFNpZ21hMFsxXWAsJGExCisJeG9yCSRnLCRhMgkJCSMgZl5nCisKKwltb3YJJFQxLGAkU1oqKCRpJjB4ZilgKCVyc3ApCisJeG9yCSRhLCRhMQorCWFuZAkkZSwkYTIJCQkjIChmXmcpJmUKKworCXJvcglcJGAkU2lnbWExWzFdLSRTaWdtYTFbMF1gLCRhMAorCWFkZAkkaCwkVDEJCQkjIFQxKz1oCisJeG9yCSRnLCRhMgkJCSMgQ2goZSxmLGcpPSgoZl5nKSZlKV5nCisKKwlyb3IJXCRgJFNpZ21hMFsxXS0kU2lnbWEwWzBdYCwkYTEKKwl4b3IJJGUsJGEwCisJYWRkCSRhMiwkVDEJCQkjIFQxKz1DaChlLGYsZykKKworCW1vdgkkYSwkYTIKKwlhZGQJKCRUYmwpLCRUMQkJIyBUMSs9S1tyb3VuZF0KKwl4b3IJJGEsJGExCisKKwl4b3IJJGIsJGEyCQkJIyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJcm9yCVwkJFNpZ21hMVswXSwkYTAJIyBTaWdtYTEoZSkKKwltb3YJJGIsJGgKKworCWFuZAkkYTIsJGEzCisJcm9yCVwkJFNpZ21hMFswXSwkYTEJIyBTaWdtYTAoYSkKKwlhZGQJJGEwLCRUMQkJCSMgVDErPVNpZ21hMShlKQorCisJeG9yCSRhMywkaAkJCSMgaD1NYWooYSxiLGMpPUNoKGFeYixjLGIpCisJYWRkCSRUMSwkZAkJCSMgZCs9VDEKKwlhZGQJJFQxLCRoCQkJIyBoKz1UMQorCisJbGVhCSRTVFJJREUoJFRibCksJFRibAkjIHJvdW5kKysKK19fXworJGNvZGUuPTw8X19fIGlmICgkaTwxNSk7CisJYWRkCSRhMSwkaAkJCSMgaCs9U2lnbWEwKGEpCitfX18KKwkoJGEyLCRhMykgPSAoJGEzLCRhMik7Cit9CisKK3N1YiBST1VORF8xNl9YWCgpCit7IG15ICgkaSwkYSwkYiwkYywkZCwkZSwkZiwkZywkaCkgPSBAXzsKKworJGNvZGUuPTw8X19fOworCW1vdglgJFNaKigoJGkrMSkmMHhmKWAoJXJzcCksJGEwCisJbW92CWAkU1oqKCgkaSsxNCkmMHhmKWAoJXJzcCksJGEyCisKKwltb3YJJGEwLCRUMQorCXJvcglcJGAkc2lnbWEwWzFdLSRzaWdtYTBbMF1gLCRhMAorCWFkZAkkYTEsJGEJCQkjIG1vZHVsby1zY2hlZHVsZWQgaCs9U2lnbWEwKGEpCisJbW92CSRhMiwkYTEKKwlyb3IJXCRgJHNpZ21hMVsxXS0kc2lnbWExWzBdYCwkYTIKKworCXhvcgkkVDEsJGEwCisJc2hyCVwkJHNpZ21hMFsyXSwkVDEKKwlyb3IJXCQkc2lnbWEwWzBdLCRhMAorCXhvcgkkYTEsJGEyCisJc2hyCVwkJHNpZ21hMVsyXSwkYTEKKworCXJvcglcJCRzaWdtYTFbMF0sJGEyCisJeG9yCSRhMCwkVDEJCQkjIHNpZ21hMChYWyhpKzEpJjB4Zl0pCisJeG9yCSRhMSwkYTIJCQkjIHNpZ21hMShYWyhpKzE0KSYweGZdKQorCWFkZAlgJFNaKigoJGkrOSkmMHhmKWAoJXJzcCksJFQxCisKKwlhZGQJYCRTWiooJGkmMHhmKWAoJXJzcCksJFQxCisJbW92CSRlLCRhMAorCWFkZAkkYTIsJFQxCisJbW92CSRhLCRhMQorX19fCisJJlJPVU5EXzAwXzE1KEBfKTsKK30KKworJGNvZGU9PDxfX187CisudGV4dAorCisuZXh0ZXJuCU9QRU5TU0xfaWEzMmNhcF9QCisuZ2xvYmwJJGZ1bmMKKy50eXBlCSRmdW5jLFxAZnVuY3Rpb24sMworLmFsaWduCTE2CiskZnVuYzoKK19fXworJGNvZGUuPTw8X19fIGlmICgkU1o9PTQgfHwgJGF2eCk7CisJbGVhCU9QRU5TU0xfaWEzMmNhcF9QKCVyaXApLCVyMTEKKwltb3YJMCglcjExKSwlcjlkCisJbW92CTQoJXIxMSksJXIxMGQKKwltb3YJOCglcjExKSwlcjExZAorX19fCiskY29kZS49PDxfX18gaWYgKCRhdnggJiYgJFNaPT04KTsKKwl0ZXN0CVwkYDE8PDExYCwlcjEwZAkJIyBjaGVjayBmb3IgWE9QCisJam56CS5MeG9wX3Nob3J0Y3V0CitfX18KKyRjb2RlLj08PF9fXyBpZiAoJGF2eD4xKTsKKwlhbmQJXCRgMTw8OHwxPDw1fDE8PDNgLCVyMTFkCSMgY2hlY2sgZm9yIEJNSTIrQVZYMitCTUkxCisJY21wCVwkYDE8PDh8MTw8NXwxPDwzYCwlcjExZAorCWplCS5MYXZ4Ml9zaG9ydGN1dAorX19fCiskY29kZS49PDxfX18gaWYgKCRhdngpOworCWFuZAlcJGAxPDwzMGAsJXI5ZAkJIyBtYXNrICJJbnRlbCBDUFUiIGJpdAorCWFuZAlcJGAxPDwyOHwxPDw5YCwlcjEwZAkjIG1hc2sgQVZYIGFuZCBTU1NFMyBiaXRzCisJb3IJJXI5ZCwlcjEwZAorCWNtcAlcJGAxPDwyOHwxPDw5fDE8PDMwYCwlcjEwZAorCWplCS5MYXZ4X3Nob3J0Y3V0CitfX18KKyRjb2RlLj08PF9fXyBpZiAoJFNaPT00KTsKKwl0ZXN0CVwkYDE8PDlgLCVyMTBkCisJam56CS5Mc3NzZTNfc2hvcnRjdXQKK19fXworJGNvZGUuPTw8X19fOworCXB1c2gJJXJieAorCXB1c2gJJXJicAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCXB1c2gJJXIxNQorCW1vdgklcnNwLCVyMTEJCSMgY29weSAlcnNwCisJc2hsCVwkNCwlcmR4CQkjIG51bSoxNgorCXN1YglcJCRmcmFtZXN6LCVyc3AKKwlsZWEJKCRpbnAsJXJkeCwkU1opLCVyZHgJIyBpbnArbnVtKjE2KiRTWgorCWFuZAlcJC02NCwlcnNwCQkjIGFsaWduIHN0YWNrIGZyYW1lCisJbW92CSRjdHgsJF9jdHgJCSMgc2F2ZSBjdHgsIDFzdCBhcmcKKwltb3YJJGlucCwkX2lucAkJIyBzYXZlIGlucCwgMm5kIGFyaAorCW1vdgklcmR4LCRfZW5kCQkjIHNhdmUgZW5kIHBvaW50ZXIsICIzcmQiIGFyZworCW1vdgklcjExLCRfcnNwCQkjIHNhdmUgY29weSBvZiAlcnNwCisuTHByb2xvZ3VlOgorCisJbW92CSRTWiowKCRjdHgpLCRBCisJbW92CSRTWioxKCRjdHgpLCRCCisJbW92CSRTWioyKCRjdHgpLCRDCisJbW92CSRTWiozKCRjdHgpLCRECisJbW92CSRTWio0KCRjdHgpLCRFCisJbW92CSRTWio1KCRjdHgpLCRGCisJbW92CSRTWio2KCRjdHgpLCRHCisJbW92CSRTWio3KCRjdHgpLCRICisJam1wCS5MbG9vcAorCisuYWxpZ24JMTYKKy5MbG9vcDoKKwltb3YJJEIsJGEzCisJbGVhCSRUQUJMRSglcmlwKSwkVGJsCisJeG9yCSRDLCRhMwkJCSMgbWFnaWMKK19fXworCWZvcigkaT0wOyRpPDE2OyRpKyspIHsKKwkJJGNvZGUuPSIJbW92CSRTWiokaSgkaW5wKSwkVDFcbiI7CisJCSRjb2RlLj0iCW1vdglAUk9UWzRdLCRhMFxuIjsKKwkJJGNvZGUuPSIJbW92CUBST1RbMF0sJGExXG4iOworCQkkY29kZS49Iglic3dhcAkkVDFcbiI7CisJCSZST1VORF8wMF8xNSgkaSxAUk9UKTsKKwkJdW5zaGlmdChAUk9ULHBvcChAUk9UKSk7CisJfQorJGNvZGUuPTw8X19fOworCWptcAkuTHJvdW5kc18xNl94eAorLmFsaWduCTE2CisuTHJvdW5kc18xNl94eDoKK19fXworCWZvcig7JGk8MzI7JGkrKykgeworCQkmUk9VTkRfMTZfWFgoJGksQFJPVCk7CisJCXVuc2hpZnQoQFJPVCxwb3AoQFJPVCkpOworCX0KKworJGNvZGUuPTw8X19fOworCWNtcGIJXCQwLGAkU1otMWAoJFRibCkKKwlqbnoJLkxyb3VuZHNfMTZfeHgKKworCW1vdgkkX2N0eCwkY3R4CisJYWRkCSRhMSwkQQkJCSMgbW9kdWxvLXNjaGVkdWxlZCBoKz1TaWdtYTAoYSkKKwlsZWEJMTYqJFNaKCRpbnApLCRpbnAKKworCWFkZAkkU1oqMCgkY3R4KSwkQQorCWFkZAkkU1oqMSgkY3R4KSwkQgorCWFkZAkkU1oqMigkY3R4KSwkQworCWFkZAkkU1oqMygkY3R4KSwkRAorCWFkZAkkU1oqNCgkY3R4KSwkRQorCWFkZAkkU1oqNSgkY3R4KSwkRgorCWFkZAkkU1oqNigkY3R4KSwkRworCWFkZAkkU1oqNygkY3R4KSwkSAorCisJY21wCSRfZW5kLCRpbnAKKworCW1vdgkkQSwkU1oqMCgkY3R4KQorCW1vdgkkQiwkU1oqMSgkY3R4KQorCW1vdgkkQywkU1oqMigkY3R4KQorCW1vdgkkRCwkU1oqMygkY3R4KQorCW1vdgkkRSwkU1oqNCgkY3R4KQorCW1vdgkkRiwkU1oqNSgkY3R4KQorCW1vdgkkRywkU1oqNigkY3R4KQorCW1vdgkkSCwkU1oqNygkY3R4KQorCWpiCS5MbG9vcAorCisJbW92CSRfcnNwLCVyc2kKKwltb3YJKCVyc2kpLCVyMTUKKwltb3YJOCglcnNpKSwlcjE0CisJbW92CTE2KCVyc2kpLCVyMTMKKwltb3YJMjQoJXJzaSksJXIxMgorCW1vdgkzMiglcnNpKSwlcmJwCisJbW92CTQwKCVyc2kpLCVyYngKKwlsZWEJNDgoJXJzaSksJXJzcAorLkxlcGlsb2d1ZToKKwlyZXQKKy5zaXplCSRmdW5jLC4tJGZ1bmMKK19fXworCitpZiAoJFNaPT00KSB7CiskY29kZS49PDxfX187CisuYWxpZ24JNjQKKy50eXBlCSRUQUJMRSxcQG9iamVjdAorJFRBQkxFOgorCS5sb25nCTB4NDI4YTJmOTgsMHg3MTM3NDQ5MSwweGI1YzBmYmNmLDB4ZTliNWRiYTUKKwkubG9uZwkweDQyOGEyZjk4LDB4NzEzNzQ0OTEsMHhiNWMwZmJjZiwweGU5YjVkYmE1CisJLmxvbmcJMHgzOTU2YzI1YiwweDU5ZjExMWYxLDB4OTIzZjgyYTQsMHhhYjFjNWVkNQorCS5sb25nCTB4Mzk1NmMyNWIsMHg1OWYxMTFmMSwweDkyM2Y4MmE0LDB4YWIxYzVlZDUKKwkubG9uZwkweGQ4MDdhYTk4LDB4MTI4MzViMDEsMHgyNDMxODViZSwweDU1MGM3ZGMzCisJLmxvbmcJMHhkODA3YWE5OCwweDEyODM1YjAxLDB4MjQzMTg1YmUsMHg1NTBjN2RjMworCS5sb25nCTB4NzJiZTVkNzQsMHg4MGRlYjFmZSwweDliZGMwNmE3LDB4YzE5YmYxNzQKKwkubG9uZwkweDcyYmU1ZDc0LDB4ODBkZWIxZmUsMHg5YmRjMDZhNywweGMxOWJmMTc0CisJLmxvbmcJMHhlNDliNjljMSwweGVmYmU0Nzg2LDB4MGZjMTlkYzYsMHgyNDBjYTFjYworCS5sb25nCTB4ZTQ5YjY5YzEsMHhlZmJlNDc4NiwweDBmYzE5ZGM2LDB4MjQwY2ExY2MKKwkubG9uZwkweDJkZTkyYzZmLDB4NGE3NDg0YWEsMHg1Y2IwYTlkYywweDc2Zjk4OGRhCisJLmxvbmcJMHgyZGU5MmM2ZiwweDRhNzQ4NGFhLDB4NWNiMGE5ZGMsMHg3NmY5ODhkYQorCS5sb25nCTB4OTgzZTUxNTIsMHhhODMxYzY2ZCwweGIwMDMyN2M4LDB4YmY1OTdmYzcKKwkubG9uZwkweDk4M2U1MTUyLDB4YTgzMWM2NmQsMHhiMDAzMjdjOCwweGJmNTk3ZmM3CisJLmxvbmcJMHhjNmUwMGJmMywweGQ1YTc5MTQ3LDB4MDZjYTYzNTEsMHgxNDI5Mjk2NworCS5sb25nCTB4YzZlMDBiZjMsMHhkNWE3OTE0NywweDA2Y2E2MzUxLDB4MTQyOTI5NjcKKwkubG9uZwkweDI3YjcwYTg1LDB4MmUxYjIxMzgsMHg0ZDJjNmRmYywweDUzMzgwZDEzCisJLmxvbmcJMHgyN2I3MGE4NSwweDJlMWIyMTM4LDB4NGQyYzZkZmMsMHg1MzM4MGQxMworCS5sb25nCTB4NjUwYTczNTQsMHg3NjZhMGFiYiwweDgxYzJjOTJlLDB4OTI3MjJjODUKKwkubG9uZwkweDY1MGE3MzU0LDB4NzY2YTBhYmIsMHg4MWMyYzkyZSwweDkyNzIyYzg1CisJLmxvbmcJMHhhMmJmZThhMSwweGE4MWE2NjRiLDB4YzI0YjhiNzAsMHhjNzZjNTFhMworCS5sb25nCTB4YTJiZmU4YTEsMHhhODFhNjY0YiwweGMyNGI4YjcwLDB4Yzc2YzUxYTMKKwkubG9uZwkweGQxOTJlODE5LDB4ZDY5OTA2MjQsMHhmNDBlMzU4NSwweDEwNmFhMDcwCisJLmxvbmcJMHhkMTkyZTgxOSwweGQ2OTkwNjI0LDB4ZjQwZTM1ODUsMHgxMDZhYTA3MAorCS5sb25nCTB4MTlhNGMxMTYsMHgxZTM3NmMwOCwweDI3NDg3NzRjLDB4MzRiMGJjYjUKKwkubG9uZwkweDE5YTRjMTE2LDB4MWUzNzZjMDgsMHgyNzQ4Nzc0YywweDM0YjBiY2I1CisJLmxvbmcJMHgzOTFjMGNiMywweDRlZDhhYTRhLDB4NWI5Y2NhNGYsMHg2ODJlNmZmMworCS5sb25nCTB4MzkxYzBjYjMsMHg0ZWQ4YWE0YSwweDViOWNjYTRmLDB4NjgyZTZmZjMKKwkubG9uZwkweDc0OGY4MmVlLDB4NzhhNTYzNmYsMHg4NGM4NzgxNCwweDhjYzcwMjA4CisJLmxvbmcJMHg3NDhmODJlZSwweDc4YTU2MzZmLDB4ODRjODc4MTQsMHg4Y2M3MDIwOAorCS5sb25nCTB4OTBiZWZmZmEsMHhhNDUwNmNlYiwweGJlZjlhM2Y3LDB4YzY3MTc4ZjIKKwkubG9uZwkweDkwYmVmZmZhLDB4YTQ1MDZjZWIsMHhiZWY5YTNmNywweGM2NzE3OGYyCisKKwkubG9uZwkweDAwMDEwMjAzLDB4MDQwNTA2MDcsMHgwODA5MGEwYiwweDBjMGQwZTBmCisJLmxvbmcJMHgwMDAxMDIwMywweDA0MDUwNjA3LDB4MDgwOTBhMGIsMHgwYzBkMGUwZgorCS5sb25nCTB4MDMwMjAxMDAsMHgwYjBhMDkwOCwweGZmZmZmZmZmLDB4ZmZmZmZmZmYKKwkubG9uZwkweDAzMDIwMTAwLDB4MGIwYTA5MDgsMHhmZmZmZmZmZiwweGZmZmZmZmZmCisJLmxvbmcJMHhmZmZmZmZmZiwweGZmZmZmZmZmLDB4MDMwMjAxMDAsMHgwYjBhMDkwOAorCS5sb25nCTB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwweDAzMDIwMTAwLDB4MGIwYTA5MDgKKwkuYXNjaXoJIlNIQTI1NiBibG9jayB0cmFuc2Zvcm0gZm9yIHg4Nl82NCwgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQG9wZW5zc2wub3JnPiIKK19fXworfSBlbHNlIHsKKyRjb2RlLj08PF9fXzsKKy5hbGlnbgk2NAorLnR5cGUJJFRBQkxFLFxAb2JqZWN0CiskVEFCTEU6CisJLnF1YWQJMHg0MjhhMmY5OGQ3MjhhZTIyLDB4NzEzNzQ0OTEyM2VmNjVjZAorCS5xdWFkCTB4NDI4YTJmOThkNzI4YWUyMiwweDcxMzc0NDkxMjNlZjY1Y2QKKwkucXVhZAkweGI1YzBmYmNmZWM0ZDNiMmYsMHhlOWI1ZGJhNTgxODlkYmJjCisJLnF1YWQJMHhiNWMwZmJjZmVjNGQzYjJmLDB4ZTliNWRiYTU4MTg5ZGJiYworCS5xdWFkCTB4Mzk1NmMyNWJmMzQ4YjUzOCwweDU5ZjExMWYxYjYwNWQwMTkKKwkucXVhZAkweDM5NTZjMjViZjM0OGI1MzgsMHg1OWYxMTFmMWI2MDVkMDE5CisJLnF1YWQJMHg5MjNmODJhNGFmMTk0ZjliLDB4YWIxYzVlZDVkYTZkODExOAorCS5xdWFkCTB4OTIzZjgyYTRhZjE5NGY5YiwweGFiMWM1ZWQ1ZGE2ZDgxMTgKKwkucXVhZAkweGQ4MDdhYTk4YTMwMzAyNDIsMHgxMjgzNWIwMTQ1NzA2ZmJlCisJLnF1YWQJMHhkODA3YWE5OGEzMDMwMjQyLDB4MTI4MzViMDE0NTcwNmZiZQorCS5xdWFkCTB4MjQzMTg1YmU0ZWU0YjI4YywweDU1MGM3ZGMzZDVmZmI0ZTIKKwkucXVhZAkweDI0MzE4NWJlNGVlNGIyOGMsMHg1NTBjN2RjM2Q1ZmZiNGUyCisJLnF1YWQJMHg3MmJlNWQ3NGYyN2I4OTZmLDB4ODBkZWIxZmUzYjE2OTZiMQorCS5xdWFkCTB4NzJiZTVkNzRmMjdiODk2ZiwweDgwZGViMWZlM2IxNjk2YjEKKwkucXVhZAkweDliZGMwNmE3MjVjNzEyMzUsMHhjMTliZjE3NGNmNjkyNjk0CisJLnF1YWQJMHg5YmRjMDZhNzI1YzcxMjM1LDB4YzE5YmYxNzRjZjY5MjY5NAorCS5xdWFkCTB4ZTQ5YjY5YzE5ZWYxNGFkMiwweGVmYmU0Nzg2Mzg0ZjI1ZTMKKwkucXVhZAkweGU0OWI2OWMxOWVmMTRhZDIsMHhlZmJlNDc4NjM4NGYyNWUzCisJLnF1YWQJMHgwZmMxOWRjNjhiOGNkNWI1LDB4MjQwY2ExY2M3N2FjOWM2NQorCS5xdWFkCTB4MGZjMTlkYzY4YjhjZDViNSwweDI0MGNhMWNjNzdhYzljNjUKKwkucXVhZAkweDJkZTkyYzZmNTkyYjAyNzUsMHg0YTc0ODRhYTZlYTZlNDgzCisJLnF1YWQJMHgyZGU5MmM2ZjU5MmIwMjc1LDB4NGE3NDg0YWE2ZWE2ZTQ4MworCS5xdWFkCTB4NWNiMGE5ZGNiZDQxZmJkNCwweDc2Zjk4OGRhODMxMTUzYjUKKwkucXVhZAkweDVjYjBhOWRjYmQ0MWZiZDQsMHg3NmY5ODhkYTgzMTE1M2I1CisJLnF1YWQJMHg5ODNlNTE1MmVlNjZkZmFiLDB4YTgzMWM2NmQyZGI0MzIxMAorCS5xdWFkCTB4OTgzZTUxNTJlZTY2ZGZhYiwweGE4MzFjNjZkMmRiNDMyMTAKKwkucXVhZAkweGIwMDMyN2M4OThmYjIxM2YsMHhiZjU5N2ZjN2JlZWYwZWU0CisJLnF1YWQJMHhiMDAzMjdjODk4ZmIyMTNmLDB4YmY1OTdmYzdiZWVmMGVlNAorCS5xdWFkCTB4YzZlMDBiZjMzZGE4OGZjMiwweGQ1YTc5MTQ3OTMwYWE3MjUKKwkucXVhZAkweGM2ZTAwYmYzM2RhODhmYzIsMHhkNWE3OTE0NzkzMGFhNzI1CisJLnF1YWQJMHgwNmNhNjM1MWUwMDM4MjZmLDB4MTQyOTI5NjcwYTBlNmU3MAorCS5xdWFkCTB4MDZjYTYzNTFlMDAzODI2ZiwweDE0MjkyOTY3MGEwZTZlNzAKKwkucXVhZAkweDI3YjcwYTg1NDZkMjJmZmMsMHgyZTFiMjEzODVjMjZjOTI2CisJLnF1YWQJMHgyN2I3MGE4NTQ2ZDIyZmZjLDB4MmUxYjIxMzg1YzI2YzkyNgorCS5xdWFkCTB4NGQyYzZkZmM1YWM0MmFlZCwweDUzMzgwZDEzOWQ5NWIzZGYKKwkucXVhZAkweDRkMmM2ZGZjNWFjNDJhZWQsMHg1MzM4MGQxMzlkOTViM2RmCisJLnF1YWQJMHg2NTBhNzM1NDhiYWY2M2RlLDB4NzY2YTBhYmIzYzc3YjJhOAorCS5xdWFkCTB4NjUwYTczNTQ4YmFmNjNkZSwweDc2NmEwYWJiM2M3N2IyYTgKKwkucXVhZAkweDgxYzJjOTJlNDdlZGFlZTYsMHg5MjcyMmM4NTE0ODIzNTNiCisJLnF1YWQJMHg4MWMyYzkyZTQ3ZWRhZWU2LDB4OTI3MjJjODUxNDgyMzUzYgorCS5xdWFkCTB4YTJiZmU4YTE0Y2YxMDM2NCwweGE4MWE2NjRiYmM0MjMwMDEKKwkucXVhZAkweGEyYmZlOGExNGNmMTAzNjQsMHhhODFhNjY0YmJjNDIzMDAxCisJLnF1YWQJMHhjMjRiOGI3MGQwZjg5NzkxLDB4Yzc2YzUxYTMwNjU0YmUzMAorCS5xdWFkCTB4YzI0YjhiNzBkMGY4OTc5MSwweGM3NmM1MWEzMDY1NGJlMzAKKwkucXVhZAkweGQxOTJlODE5ZDZlZjUyMTgsMHhkNjk5MDYyNDU1NjVhOTEwCisJLnF1YWQJMHhkMTkyZTgxOWQ2ZWY1MjE4LDB4ZDY5OTA2MjQ1NTY1YTkxMAorCS5xdWFkCTB4ZjQwZTM1ODU1NzcxMjAyYSwweDEwNmFhMDcwMzJiYmQxYjgKKwkucXVhZAkweGY0MGUzNTg1NTc3MTIwMmEsMHgxMDZhYTA3MDMyYmJkMWI4CisJLnF1YWQJMHgxOWE0YzExNmI4ZDJkMGM4LDB4MWUzNzZjMDg1MTQxYWI1MworCS5xdWFkCTB4MTlhNGMxMTZiOGQyZDBjOCwweDFlMzc2YzA4NTE0MWFiNTMKKwkucXVhZAkweDI3NDg3NzRjZGY4ZWViOTksMHgzNGIwYmNiNWUxOWI0OGE4CisJLnF1YWQJMHgyNzQ4Nzc0Y2RmOGVlYjk5LDB4MzRiMGJjYjVlMTliNDhhOAorCS5xdWFkCTB4MzkxYzBjYjNjNWM5NWE2MywweDRlZDhhYTRhZTM0MThhY2IKKwkucXVhZAkweDM5MWMwY2IzYzVjOTVhNjMsMHg0ZWQ4YWE0YWUzNDE4YWNiCisJLnF1YWQJMHg1YjljY2E0Zjc3NjNlMzczLDB4NjgyZTZmZjNkNmIyYjhhMworCS5xdWFkCTB4NWI5Y2NhNGY3NzYzZTM3MywweDY4MmU2ZmYzZDZiMmI4YTMKKwkucXVhZAkweDc0OGY4MmVlNWRlZmIyZmMsMHg3OGE1NjM2ZjQzMTcyZjYwCisJLnF1YWQJMHg3NDhmODJlZTVkZWZiMmZjLDB4NzhhNTYzNmY0MzE3MmY2MAorCS5xdWFkCTB4ODRjODc4MTRhMWYwYWI3MiwweDhjYzcwMjA4MWE2NDM5ZWMKKwkucXVhZAkweDg0Yzg3ODE0YTFmMGFiNzIsMHg4Y2M3MDIwODFhNjQzOWVjCisJLnF1YWQJMHg5MGJlZmZmYTIzNjMxZTI4LDB4YTQ1MDZjZWJkZTgyYmRlOQorCS5xdWFkCTB4OTBiZWZmZmEyMzYzMWUyOCwweGE0NTA2Y2ViZGU4MmJkZTkKKwkucXVhZAkweGJlZjlhM2Y3YjJjNjc5MTUsMHhjNjcxNzhmMmUzNzI1MzJiCisJLnF1YWQJMHhiZWY5YTNmN2IyYzY3OTE1LDB4YzY3MTc4ZjJlMzcyNTMyYgorCS5xdWFkCTB4Y2EyNzNlY2VlYTI2NjE5YywweGQxODZiOGM3MjFjMGMyMDcKKwkucXVhZAkweGNhMjczZWNlZWEyNjYxOWMsMHhkMTg2YjhjNzIxYzBjMjA3CisJLnF1YWQJMHhlYWRhN2RkNmNkZTBlYjFlLDB4ZjU3ZDRmN2ZlZTZlZDE3OAorCS5xdWFkCTB4ZWFkYTdkZDZjZGUwZWIxZSwweGY1N2Q0ZjdmZWU2ZWQxNzgKKwkucXVhZAkweDA2ZjA2N2FhNzIxNzZmYmEsMHgwYTYzN2RjNWEyYzg5OGE2CisJLnF1YWQJMHgwNmYwNjdhYTcyMTc2ZmJhLDB4MGE2MzdkYzVhMmM4OThhNgorCS5xdWFkCTB4MTEzZjk4MDRiZWY5MGRhZSwweDFiNzEwYjM1MTMxYzQ3MWIKKwkucXVhZAkweDExM2Y5ODA0YmVmOTBkYWUsMHgxYjcxMGIzNTEzMWM0NzFiCisJLnF1YWQJMHgyOGRiNzdmNTIzMDQ3ZDg0LDB4MzJjYWFiN2I0MGM3MjQ5MworCS5xdWFkCTB4MjhkYjc3ZjUyMzA0N2Q4NCwweDMyY2FhYjdiNDBjNzI0OTMKKwkucXVhZAkweDNjOWViZTBhMTVjOWJlYmMsMHg0MzFkNjdjNDljMTAwZDRjCisJLnF1YWQJMHgzYzllYmUwYTE1YzliZWJjLDB4NDMxZDY3YzQ5YzEwMGQ0YworCS5xdWFkCTB4NGNjNWQ0YmVjYjNlNDJiNiwweDU5N2YyOTljZmM2NTdlMmEKKwkucXVhZAkweDRjYzVkNGJlY2IzZTQyYjYsMHg1OTdmMjk5Y2ZjNjU3ZTJhCisJLnF1YWQJMHg1ZmNiNmZhYjNhZDZmYWVjLDB4NmM0NDE5OGM0YTQ3NTgxNworCS5xdWFkCTB4NWZjYjZmYWIzYWQ2ZmFlYywweDZjNDQxOThjNGE0NzU4MTcKKworCS5xdWFkCTB4MDAwMTAyMDMwNDA1MDYwNywweDA4MDkwYTBiMGMwZDBlMGYKKwkucXVhZAkweDAwMDEwMjAzMDQwNTA2MDcsMHgwODA5MGEwYjBjMGQwZTBmCisJLmFzY2l6CSJTSEE1MTIgYmxvY2sgdHJhbnNmb3JtIGZvciB4ODZfNjQsIENSWVBUT0dBTVMgYnkgPGFwcHJvXEBvcGVuc3NsLm9yZz4iCitfX18KK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBTSU1EIGNvZGUgcGF0aHMKKyMKK3t7eworCitteSAkYTQ9JFQxOworbXkgKCRhLCRiLCRjLCRkLCRlLCRmLCRnLCRoKTsKKworc3ViIEFVVE9MT0FEKCkJCSMgdGh1bmsgW3NpbXBsaWZpZWRdIDMyLWJpdCBzdHlsZSBwZXJsYXNtCit7IG15ICRvcGNvZGUgPSAkQVVUT0xPQUQ7ICRvcGNvZGUgPX4gcy8uKjo6Ly87CisgIG15ICRhcmcgPSBwb3A7CisgICAgJGFyZyA9ICJcJCRhcmciIGlmICgkYXJnKjEgZXEgJGFyZyk7CisgICAgJGNvZGUgLj0gIlx0JG9wY29kZVx0Ii5qb2luKCcsJywkYXJnLHJldmVyc2UgQF8pLiJcbiI7Cit9CisKK3N1YiBib2R5XzAwXzE1ICgpIHsKKwkoCisJJygkYSwkYiwkYywkZCwkZSwkZiwkZywkaCk9QFJPVDsnLgorCisJJyZyb3IJKCRhMCwkU2lnbWExWzJdLSRTaWdtYTFbMV0pJywKKwknJm1vdgkoJGEsJGExKScsCisJJyZtb3YJKCRhNCwkZiknLAorCisJJyZyb3IJKCRhMSwkU2lnbWEwWzJdLSRTaWdtYTBbMV0pJywKKwknJnhvcgkoJGEwLCRlKScsCisJJyZ4b3IJKCRhNCwkZyknLAkJCSMgZl5nCisKKwknJnJvcgkoJGEwLCRTaWdtYTFbMV0tJFNpZ21hMVswXSknLAorCScmeG9yCSgkYTEsJGEpJywKKwknJmFuZAkoJGE0LCRlKScsCQkJIyAoZl5nKSZlCisKKwknJnhvcgkoJGEwLCRlKScsCisJJyZhZGQJKCRoLCRTWiooJGkmMTUpLiIoJXJzcCkiKScsCSMgaCs9WFtpXStLW2ldCisJJyZtb3YJKCRhMiwkYSknLAorCisJJyZ4b3IJKCRhNCwkZyknLAkJCSMgQ2goZSxmLGcpPSgoZl5nKSZlKV5nCisJJyZyb3IJKCRhMSwkU2lnbWEwWzFdLSRTaWdtYTBbMF0pJywKKwknJnhvcgkoJGEyLCRiKScsCQkJIyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisKKwknJmFkZAkoJGgsJGE0KScsCQkJIyBoKz1DaChlLGYsZykKKwknJnJvcgkoJGEwLCRTaWdtYTFbMF0pJywJCSMgU2lnbWExKGUpCisJJyZhbmQJKCRhMywkYTIpJywJCQkjIChiXmMpJihhXmIpCisKKwknJnhvcgkoJGExLCRhKScsCisJJyZhZGQJKCRoLCRhMCknLAkJCSMgaCs9U2lnbWExKGUpCisJJyZ4b3IJKCRhMywkYiknLAkJCSMgTWFqKGEsYixjKT1DaChhXmIsYyxiKQorCisJJyZyb3IJKCRhMSwkU2lnbWEwWzBdKScsCQkjIFNpZ21hMChhKQorCScmYWRkCSgkZCwkaCknLAkJCSMgZCs9aAorCScmYWRkCSgkaCwkYTMpJywJCQkjIGgrPU1haihhLGIsYykKKworCScmbW92CSgkYTAsJGQpJywKKwknJmFkZAkoJGExLCRoKTsnLgkJCSMgaCs9U2lnbWEwKGEpCisJJygkYTIsJGEzKSA9ICgkYTMsJGEyKTsgdW5zaGlmdChAUk9ULHBvcChAUk9UKSk7ICRpKys7JworCSk7Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgU1NTRTMgY29kZSBwYXRoCisjCitpZiAoJFNaPT00KSB7CSMgU0hBMjU2IG9ubHkKK215IEBYID0gbWFwKCIleG1tJF8iLCgwLi4zKSk7CitteSAoJHQwLCR0MSwkdDIsJHQzLCAkdDQsJHQ1KSA9IG1hcCgiJXhtbSRfIiwoNC4uOSkpOworCiskY29kZS49PDxfX187CisudHlwZQkke2Z1bmN9X3Nzc2UzLFxAZnVuY3Rpb24sMworLmFsaWduCTY0Ciske2Z1bmN9X3Nzc2UzOgorLkxzc3NlM19zaG9ydGN1dDoKKwlwdXNoCSVyYngKKwlwdXNoCSVyYnAKKwlwdXNoCSVyMTIKKwlwdXNoCSVyMTMKKwlwdXNoCSVyMTQKKwlwdXNoCSVyMTUKKwltb3YJJXJzcCwlcjExCQkjIGNvcHkgJXJzcAorCXNobAlcJDQsJXJkeAkJIyBudW0qMTYKKwlzdWIJXCRgJGZyYW1lc3orJHdpbjY0KjE2KjRgLCVyc3AKKwlsZWEJKCRpbnAsJXJkeCwkU1opLCVyZHgJIyBpbnArbnVtKjE2KiRTWgorCWFuZAlcJC02NCwlcnNwCQkjIGFsaWduIHN0YWNrIGZyYW1lCisJbW92CSRjdHgsJF9jdHgJCSMgc2F2ZSBjdHgsIDFzdCBhcmcKKwltb3YJJGlucCwkX2lucAkJIyBzYXZlIGlucCwgMm5kIGFyaAorCW1vdgklcmR4LCRfZW5kCQkjIHNhdmUgZW5kIHBvaW50ZXIsICIzcmQiIGFyZworCW1vdgklcjExLCRfcnNwCQkjIHNhdmUgY29weSBvZiAlcnNwCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJHdpbjY0KTsKKwltb3ZhcHMJJXhtbTYsMTYqJFNaKzMyKCVyc3ApCisJbW92YXBzCSV4bW03LDE2KiRTWis0OCglcnNwKQorCW1vdmFwcwkleG1tOCwxNiokU1orNjQoJXJzcCkKKwltb3ZhcHMJJXhtbTksMTYqJFNaKzgwKCVyc3ApCitfX18KKyRjb2RlLj08PF9fXzsKKy5McHJvbG9ndWVfc3NzZTM6CisKKwltb3YJJFNaKjAoJGN0eCksJEEKKwltb3YJJFNaKjEoJGN0eCksJEIKKwltb3YJJFNaKjIoJGN0eCksJEMKKwltb3YJJFNaKjMoJGN0eCksJEQKKwltb3YJJFNaKjQoJGN0eCksJEUKKwltb3YJJFNaKjUoJGN0eCksJEYKKwltb3YJJFNaKjYoJGN0eCksJEcKKwltb3YJJFNaKjcoJGN0eCksJEgKK19fXworCiskY29kZS49PDxfX187CisJI21vdmRxYQkkVEFCTEUrYCRTWioyKiRyb3VuZHNgKzMyKCVyaXApLCR0NAorCSNtb3ZkcWEJJFRBQkxFK2AkU1oqMiokcm91bmRzYCs2NCglcmlwKSwkdDUKKwlqbXAJLkxsb29wX3Nzc2UzCisuYWxpZ24JMTYKKy5MbG9vcF9zc3NlMzoKKwltb3ZkcWEJJFRBQkxFK2AkU1oqMiokcm91bmRzYCglcmlwKSwkdDMKKwltb3ZkcXUJMHgwMCgkaW5wKSxAWFswXQorCW1vdmRxdQkweDEwKCRpbnApLEBYWzFdCisJbW92ZHF1CTB4MjAoJGlucCksQFhbMl0KKwltb3ZkcXUJMHgzMCgkaW5wKSxAWFszXQorCXBzaHVmYgkkdDMsQFhbMF0KKwlsZWEJJFRBQkxFKCVyaXApLCRUYmwKKwlwc2h1ZmIJJHQzLEBYWzFdCisJbW92ZHFhCTB4MDAoJFRibCksJHQwCisJcHNodWZiCSR0MyxAWFsyXQorCW1vdmRxYQkweDIwKCRUYmwpLCR0MQorCXBhZGRkCUBYWzBdLCR0MAorCW1vdmRxYQkweDQwKCRUYmwpLCR0MgorCXBzaHVmYgkkdDMsQFhbM10KKwltb3ZkcWEJMHg2MCgkVGJsKSwkdDMKKwlwYWRkZAlAWFsxXSwkdDEKKwlwYWRkZAlAWFsyXSwkdDIKKwlwYWRkZAlAWFszXSwkdDMKKwltb3ZkcWEJJHQwLDB4MDAoJXJzcCkKKwltb3YJJEEsJGExCisJbW92ZHFhCSR0MSwweDEwKCVyc3ApCisJbW92CSRCLCRhMworCW1vdmRxYQkkdDIsMHgyMCglcnNwKQorCXhvcgkkQywkYTMJCQkjIG1hZ2ljCisJbW92ZHFhCSR0MywweDMwKCVyc3ApCisJbW92CSRFLCRhMAorCWptcAkuTHNzc2UzXzAwXzQ3CisKKy5hbGlnbgkxNgorLkxzc3NlM18wMF80NzoKKwlzdWIJXCQtMTYqMiokU1osJFRibAkjIHNpemUgb3B0aW1pemF0aW9uCitfX18KK3N1YiBYdXBkYXRlXzI1Nl9TU1NFMyAoKSB7CisJKAorCScmbW92ZHFhCSgkdDAsQFhbMV0pOycsCisJJyZtb3ZkcWEJKCR0MyxAWFszXSknLAorCScmcGFsaWducgkoJHQwLEBYWzBdLCRTWiknLAkjIFhbMS4uNF0KKwkgJyZwYWxpZ25yCSgkdDMsQFhbMl0sJFNaKTsnLAkjIFhbOS4uMTJdCisJJyZtb3ZkcWEJKCR0MSwkdDApJywKKwknJm1vdmRxYQkoJHQyLCR0MCk7JywKKwknJnBzcmxkCQkoJHQwLCRzaWdtYTBbMl0pJywKKwkgJyZwYWRkZAkoQFhbMF0sJHQzKTsnLAkJIyBYWzAuLjNdICs9IFhbOS4uMTJdCisJJyZwc3JsZAkJKCR0Miwkc2lnbWEwWzBdKScsCisJICcmcHNodWZkCSgkdDMsQFhbM10sMGIxMTExMTAxMCknLCMgWFsxNC4uMTVdCisJJyZwc2xsZAkJKCR0MSw4KiRTWi0kc2lnbWEwWzFdKTsnLgorCScmcHhvcgkJKCR0MCwkdDIpJywKKwknJnBzcmxkCQkoJHQyLCRzaWdtYTBbMV0tJHNpZ21hMFswXSk7Jy4KKwknJnB4b3IJCSgkdDAsJHQxKScsCisJJyZwc2xsZAkJKCR0MSwkc2lnbWEwWzFdLSRzaWdtYTBbMF0pOycuCisJJyZweG9yCQkoJHQwLCR0Mik7JywKKwkgJyZtb3ZkcWEJKCR0MiwkdDMpJywKKwknJnB4b3IJCSgkdDAsJHQxKTsnLAkJIyBzaWdtYTAoWFsxLi40XSkKKwkgJyZwc3JsZAkoJHQzLCRzaWdtYTFbMl0pJywKKwknJnBhZGRkCQkoQFhbMF0sJHQwKTsnLAkJIyBYWzAuLjNdICs9IHNpZ21hMChYWzEuLjRdKQorCSAnJnBzcmxxCSgkdDIsJHNpZ21hMVswXSknLAorCSAnJnB4b3IJCSgkdDMsJHQyKTsnLAorCSAnJnBzcmxxCSgkdDIsJHNpZ21hMVsxXS0kc2lnbWExWzBdKScsCisJICcmcHhvcgkJKCR0MywkdDIpJywKKwkgJyZwc2h1ZmIJKCR0MywkdDQpJywJCSMgc2lnbWExKFhbMTQuLjE1XSkKKwknJnBhZGRkCQkoQFhbMF0sJHQzKScsCQkjIFhbMC4uMV0gKz0gc2lnbWExKFhbMTQuLjE1XSkKKwkgJyZwc2h1ZmQJKCR0MyxAWFswXSwwYjAxMDEwMDAwKScsIyBYWzE2Li4xN10KKwkgJyZtb3ZkcWEJKCR0MiwkdDMpOycsCisJICcmcHNybGQJKCR0Mywkc2lnbWExWzJdKScsCisJICcmcHNybHEJKCR0Miwkc2lnbWExWzBdKScsCisJICcmcHhvcgkJKCR0MywkdDIpOycsCisJICcmcHNybHEJKCR0Miwkc2lnbWExWzFdLSRzaWdtYTFbMF0pJywKKwkgJyZweG9yCQkoJHQzLCR0Mik7JywKKwknJm1vdmRxYQkoJHQyLDE2KjIqJGouIigkVGJsKSIpJywKKwkgJyZwc2h1ZmIJKCR0MywkdDUpJywKKwknJnBhZGRkCQkoQFhbMF0sJHQzKScJCSMgWFsyLi4zXSArPSBzaWdtYTEoWFsxNi4uMTddKQorCSk7Cit9CisKK3N1YiBTU1NFM18yNTZfMDBfNDcgKCkgeworbXkgJGogPSBzaGlmdDsKK215ICRib2R5ID0gc2hpZnQ7CitteSBAWCA9IEBfOworbXkgQGluc25zID0gKCYkYm9keSwmJGJvZHksJiRib2R5LCYkYm9keSk7CSMgMTA0IGluc3RydWN0aW9ucworCisgICAgaWYgKDApIHsKKwlmb3JlYWNoIChYdXBkYXRlXzI1Nl9TU1NFMygpKSB7CQkjIDM2IGluc3RydWN0aW9ucworCSAgICBldmFsOworCSAgICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgICBldmFsKHNoaWZ0KEBpbnNucykpOworCX0KKyAgICB9IGVsc2UgewkJCSMgc3F1ZWV6ZSBleHRyYSA0JSBvbiBXZXN0bWVyZSBhbmQgMTklIG9uIEF0b20KKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CSNACisJJm1vdmRxYQkJKCR0MCxAWFsxXSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmbW92ZHFhCQkoJHQzLEBYWzNdKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CSNACisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CSNACisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSZwYWxpZ25yCSgkdDAsQFhbMF0sJFNaKTsJIyBYWzEuLjRdCisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgJnBhbGlnbnIJKCR0MyxAWFsyXSwkU1opOwkjIFhbOS4uMTJdCisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOwkjQAorCSZtb3ZkcWEJCSgkdDEsJHQwKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSZtb3ZkcWEJCSgkdDIsJHQwKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CSNACisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSZwc3JsZAkJKCR0MCwkc2lnbWEwWzJdKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgJnBhZGRkCQkoQFhbMF0sJHQzKTsJCSMgWFswLi4zXSArPSBYWzkuLjEyXQorCSAgZXZhbChzaGlmdChAaW5zbnMpKTsJI0AKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJnBzcmxkCQkoJHQyLCRzaWdtYTBbMF0pOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICZwc2h1ZmQJKCR0MyxAWFszXSwwYjExMTExMDEwKTsJIyBYWzQuLjE1XQorCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CSNACisJJnBzbGxkCQkoJHQxLDgqJFNaLSRzaWdtYTBbMV0pOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJnB4b3IJCSgkdDAsJHQyKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CSNACisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CSNACisJJnBzcmxkCQkoJHQyLCRzaWdtYTBbMV0tJHNpZ21hMFswXSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSZweG9yCQkoJHQwLCR0MSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmcHNsbGQJCSgkdDEsJHNpZ21hMFsxXS0kc2lnbWEwWzBdKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSZweG9yCQkoJHQwLCR0Mik7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsJI0AKKwkgJm1vdmRxYQkoJHQyLCR0Myk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmcHhvcgkJKCR0MCwkdDEpOwkJIyBzaWdtYTAoWFsxLi40XSkKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CSNACisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgJnBzcmxkCQkoJHQzLCRzaWdtYTFbMl0pOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJnBhZGRkCQkoQFhbMF0sJHQwKTsJCSMgWFswLi4zXSArPSBzaWdtYTAoWFsxLi40XSkKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CSNACisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAmcHNybHEJCSgkdDIsJHNpZ21hMVswXSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICZweG9yCQkoJHQzLCR0Mik7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOwkjQAorCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOwkjQAorCSAmcHNybHEJCSgkdDIsJHNpZ21hMVsxXS0kc2lnbWExWzBdKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAmcHhvcgkJKCR0MywkdDIpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsJI0AKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAjJnBzaHVmYgkoJHQzLCR0NCk7CQkjIHNpZ21hMShYWzE0Li4xNV0pCisJICZwc2h1ZmQJKCR0MywkdDMsMGIxMDAwMDAwMCk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICZwc3JsZHEJKCR0Myw4KTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOwkjQAorCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOwkjQAorCSZwYWRkZAkJKEBYWzBdLCR0Myk7CQkjIFhbMC4uMV0gKz0gc2lnbWExKFhbMTQuLjE1XSkKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgJnBzaHVmZAkoJHQzLEBYWzBdLDBiMDEwMTAwMDApOwkjIFhbMTYuLjE3XQorCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CSNACisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAmbW92ZHFhCSgkdDIsJHQzKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAmcHNybGQJCSgkdDMsJHNpZ21hMVsyXSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsJI0AKKwkgJnBzcmxxCQkoJHQyLCRzaWdtYTFbMF0pOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICZweG9yCQkoJHQzLCR0Mik7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOwkjQAorCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOwkjQAorCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgJnBzcmxxCQkoJHQyLCRzaWdtYTFbMV0tJHNpZ21hMVswXSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICZweG9yCQkoJHQzLCR0Mik7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CSNACisJICMmcHNodWZiCSgkdDMsJHQ1KTsKKwkgJnBzaHVmZAkoJHQzLCR0MywwYjAwMDAxMDAwKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSZtb3ZkcWEJCSgkdDIsMTYqMiokai4iKCRUYmwpIik7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOwkjQAorCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgJnBzbGxkcQkoJHQzLDgpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSZwYWRkZAkJKEBYWzBdLCR0Myk7CQkjIFhbMi4uM10gKz0gc2lnbWExKFhbMTYuLjE3XSkKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CSNACisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKyAgICB9CisJJnBhZGRkCQkoJHQyLEBYWzBdKTsKKwkgIGZvcmVhY2ggKEBpbnNucykgeyBldmFsOyB9CQkjIHJlbWFpbmluZyBpbnN0cnVjdGlvbnMKKwkmbW92ZHFhCQkoMTYqJGouIiglcnNwKSIsJHQyKTsKK30KKworICAgIGZvciAoJGk9MCwkaj0wOyAkajw0OyAkaisrKSB7CisJJlNTU0UzXzI1Nl8wMF80NygkaixcJmJvZHlfMDBfMTUsQFgpOworCXB1c2goQFgsc2hpZnQoQFgpKTsJCQkjIHJvdGF0ZShAWCkKKyAgICB9CisJJmNtcGIJKCRTWi0xKzE2KjIqJFNaLiIoJFRibCkiLDApOworCSZqbmUJKCIuTHNzc2UzXzAwXzQ3Iik7CisKKyAgICBmb3IgKCRpPTA7ICRpPDE2OyApIHsKKwlmb3JlYWNoKGJvZHlfMDBfMTUoKSkgeyBldmFsOyB9CisgICAgfQorJGNvZGUuPTw8X19fOworCW1vdgkkX2N0eCwkY3R4CisJbW92CSRhMSwkQQorCisJYWRkCSRTWiowKCRjdHgpLCRBCisJbGVhCTE2KiRTWigkaW5wKSwkaW5wCisJYWRkCSRTWioxKCRjdHgpLCRCCisJYWRkCSRTWioyKCRjdHgpLCRDCisJYWRkCSRTWiozKCRjdHgpLCRECisJYWRkCSRTWio0KCRjdHgpLCRFCisJYWRkCSRTWio1KCRjdHgpLCRGCisJYWRkCSRTWio2KCRjdHgpLCRHCisJYWRkCSRTWio3KCRjdHgpLCRICisKKwljbXAJJF9lbmQsJGlucAorCisJbW92CSRBLCRTWiowKCRjdHgpCisJbW92CSRCLCRTWioxKCRjdHgpCisJbW92CSRDLCRTWioyKCRjdHgpCisJbW92CSRELCRTWiozKCRjdHgpCisJbW92CSRFLCRTWio0KCRjdHgpCisJbW92CSRGLCRTWio1KCRjdHgpCisJbW92CSRHLCRTWio2KCRjdHgpCisJbW92CSRILCRTWio3KCRjdHgpCisJamIJLkxsb29wX3Nzc2UzCisKKwltb3YJJF9yc3AsJXJzaQorX19fCiskY29kZS49PDxfX18gaWYgKCR3aW42NCk7CisJbW92YXBzCTE2KiRTWiszMiglcnNwKSwleG1tNgorCW1vdmFwcwkxNiokU1orNDgoJXJzcCksJXhtbTcKKwltb3ZhcHMJMTYqJFNaKzY0KCVyc3ApLCV4bW04CisJbW92YXBzCTE2KiRTWis4MCglcnNwKSwleG1tOQorX19fCiskY29kZS49PDxfX187CisJbW92CSglcnNpKSwlcjE1CisJbW92CTgoJXJzaSksJXIxNAorCW1vdgkxNiglcnNpKSwlcjEzCisJbW92CTI0KCVyc2kpLCVyMTIKKwltb3YJMzIoJXJzaSksJXJicAorCW1vdgk0MCglcnNpKSwlcmJ4CisJbGVhCTQ4KCVyc2kpLCVyc3AKKy5MZXBpbG9ndWVfc3NzZTM6CisJcmV0Cisuc2l6ZQkke2Z1bmN9X3Nzc2UzLC4tJHtmdW5jfV9zc3NlMworX19fCit9CisKK2lmICgkYXZ4KSB7eworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBYT1AgY29kZSBwYXRoCisjCitpZiAoJFNaPT04KSB7CSMgU0hBNTEyIG9ubHkKKyRjb2RlLj08PF9fXzsKKy50eXBlCSR7ZnVuY31feG9wLFxAZnVuY3Rpb24sMworLmFsaWduCTY0Ciske2Z1bmN9X3hvcDoKKy5MeG9wX3Nob3J0Y3V0OgorCXB1c2gJJXJieAorCXB1c2gJJXJicAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCXB1c2gJJXIxNQorCW1vdgklcnNwLCVyMTEJCSMgY29weSAlcnNwCisJc2hsCVwkNCwlcmR4CQkjIG51bSoxNgorCXN1YglcJGAkZnJhbWVzeiskd2luNjQqMTYqKCRTWj09ND80OjYpYCwlcnNwCisJbGVhCSgkaW5wLCVyZHgsJFNaKSwlcmR4CSMgaW5wK251bSoxNiokU1oKKwlhbmQJXCQtNjQsJXJzcAkJIyBhbGlnbiBzdGFjayBmcmFtZQorCW1vdgkkY3R4LCRfY3R4CQkjIHNhdmUgY3R4LCAxc3QgYXJnCisJbW92CSRpbnAsJF9pbnAJCSMgc2F2ZSBpbnAsIDJuZCBhcmgKKwltb3YJJXJkeCwkX2VuZAkJIyBzYXZlIGVuZCBwb2ludGVyLCAiM3JkIiBhcmcKKwltb3YJJXIxMSwkX3JzcAkJIyBzYXZlIGNvcHkgb2YgJXJzcAorX19fCiskY29kZS49PDxfX18gaWYgKCR3aW42NCk7CisJbW92YXBzCSV4bW02LDE2KiRTWiszMiglcnNwKQorCW1vdmFwcwkleG1tNywxNiokU1orNDgoJXJzcCkKKwltb3ZhcHMJJXhtbTgsMTYqJFNaKzY0KCVyc3ApCisJbW92YXBzCSV4bW05LDE2KiRTWis4MCglcnNwKQorX19fCiskY29kZS49PDxfX18gaWYgKCR3aW42NCAmJiAkU1o+NCk7CisJbW92YXBzCSV4bW0xMCwxNiokU1orOTYoJXJzcCkKKwltb3ZhcHMJJXhtbTExLDE2KiRTWisxMTIoJXJzcCkKK19fXworJGNvZGUuPTw8X19fOworLkxwcm9sb2d1ZV94b3A6CisKKwl2emVyb3VwcGVyCisJbW92CSRTWiowKCRjdHgpLCRBCisJbW92CSRTWioxKCRjdHgpLCRCCisJbW92CSRTWioyKCRjdHgpLCRDCisJbW92CSRTWiozKCRjdHgpLCRECisJbW92CSRTWio0KCRjdHgpLCRFCisJbW92CSRTWio1KCRjdHgpLCRGCisJbW92CSRTWio2KCRjdHgpLCRHCisJbW92CSRTWio3KCRjdHgpLCRICisJam1wCS5MbG9vcF94b3AKK19fXworCQkJCQlpZiAoJFNaPT00KSB7CSMgU0hBMjU2CisgICAgbXkgQFggPSBtYXAoIiV4bW0kXyIsKDAuLjMpKTsKKyAgICBteSAoJHQwLCR0MSwkdDIsJHQzKSA9IG1hcCgiJXhtbSRfIiwoNC4uNykpOworCiskY29kZS49PDxfX187CisuYWxpZ24JMTYKKy5MbG9vcF94b3A6CisJdm1vdmRxYQkkVEFCTEUrYCRTWioyKiRyb3VuZHNgKCVyaXApLCR0MworCXZtb3ZkcXUJMHgwMCgkaW5wKSxAWFswXQorCXZtb3ZkcXUJMHgxMCgkaW5wKSxAWFsxXQorCXZtb3ZkcXUJMHgyMCgkaW5wKSxAWFsyXQorCXZtb3ZkcXUJMHgzMCgkaW5wKSxAWFszXQorCXZwc2h1ZmIJJHQzLEBYWzBdLEBYWzBdCisJbGVhCSRUQUJMRSglcmlwKSwkVGJsCisJdnBzaHVmYgkkdDMsQFhbMV0sQFhbMV0KKwl2cHNodWZiCSR0MyxAWFsyXSxAWFsyXQorCXZwYWRkZAkweDAwKCRUYmwpLEBYWzBdLCR0MAorCXZwc2h1ZmIJJHQzLEBYWzNdLEBYWzNdCisJdnBhZGRkCTB4MjAoJFRibCksQFhbMV0sJHQxCisJdnBhZGRkCTB4NDAoJFRibCksQFhbMl0sJHQyCisJdnBhZGRkCTB4NjAoJFRibCksQFhbM10sJHQzCisJdm1vdmRxYQkkdDAsMHgwMCglcnNwKQorCW1vdgkkQSwkYTEKKwl2bW92ZHFhCSR0MSwweDEwKCVyc3ApCisJbW92CSRCLCRhMworCXZtb3ZkcWEJJHQyLDB4MjAoJXJzcCkKKwl4b3IJJEMsJGEzCQkJIyBtYWdpYworCXZtb3ZkcWEJJHQzLDB4MzAoJXJzcCkKKwltb3YJJEUsJGEwCisJam1wCS5MeG9wXzAwXzQ3CisKKy5hbGlnbgkxNgorLkx4b3BfMDBfNDc6CisJc3ViCVwkLTE2KjIqJFNaLCRUYmwJIyBzaXplIG9wdGltaXphdGlvbgorX19fCitzdWIgWE9QXzI1Nl8wMF80NyAoKSB7CitteSAkaiA9IHNoaWZ0OworbXkgJGJvZHkgPSBzaGlmdDsKK215IEBYID0gQF87CitteSBAaW5zbnMgPSAoJiRib2R5LCYkYm9keSwmJGJvZHksJiRib2R5KTsJIyAxMDQgaW5zdHJ1Y3Rpb25zCisKKwkmdnBhbGlnbnIJKCR0MCxAWFsxXSxAWFswXSwkU1opOwkjIFhbMS4uNF0KKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAmdnBhbGlnbnIJKCR0MyxAWFszXSxAWFsyXSwkU1opOwkjIFhbOS4uMTJdCisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmdnByb3RkCQkoJHQxLCR0MCw4KiRTWi0kc2lnbWEwWzFdKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSZ2cHNybGQJCSgkdDAsJHQwLCRzaWdtYTBbMl0pOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICZ2cGFkZGQJKEBYWzBdLEBYWzBdLCR0Myk7CSMgWFswLi4zXSArPSBYWzkuLjEyXQorCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmdnByb3RkCQkoJHQyLCR0MSwkc2lnbWEwWzFdLSRzaWdtYTBbMF0pOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJnZweG9yCQkoJHQwLCR0MCwkdDEpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgJnZwcm90ZAkoJHQzLEBYWzNdLDgqJFNaLSRzaWdtYTFbMV0pOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJnZweG9yCQkoJHQwLCR0MCwkdDIpOwkJIyBzaWdtYTAoWFsxLi40XSkKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAmdnBzcmxkCSgkdDIsQFhbM10sJHNpZ21hMVsyXSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmdnBhZGRkCQkoQFhbMF0sQFhbMF0sJHQwKTsJIyBYWzAuLjNdICs9IHNpZ21hMChYWzEuLjRdKQorCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICZ2cHJvdGQJKCR0MSwkdDMsJHNpZ21hMVsxXS0kc2lnbWExWzBdKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAmdnB4b3IJCSgkdDMsJHQzLCR0Mik7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAmdnB4b3IJCSgkdDMsJHQzLCR0MSk7CQkjIHNpZ21hMShYWzE0Li4xNV0pCisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSZ2cHNybGRxCSgkdDMsJHQzLDgpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmdnBhZGRkCQkoQFhbMF0sQFhbMF0sJHQzKTsJIyBYWzAuLjFdICs9IHNpZ21hMShYWzE0Li4xNV0pCisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAmdnByb3RkCSgkdDMsQFhbMF0sOCokU1otJHNpZ21hMVsxXSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgJnZwc3JsZAkoJHQyLEBYWzBdLCRzaWdtYTFbMl0pOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICZ2cHJvdGQJKCR0MSwkdDMsJHNpZ21hMVsxXS0kc2lnbWExWzBdKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAmdnB4b3IJCSgkdDMsJHQzLCR0Mik7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAmdnB4b3IJCSgkdDMsJHQzLCR0MSk7CQkjIHNpZ21hMShYWzE2Li4xN10pCisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSZ2cHNsbGRxCSgkdDMsJHQzLDgpOwkJIyAyMiBpbnN0cnVjdGlvbnMKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJnZwYWRkZAkJKEBYWzBdLEBYWzBdLCR0Myk7CSMgWFsyLi4zXSArPSBzaWdtYTEoWFsxNi4uMTddKQorCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmdnBhZGRkCQkoJHQyLEBYWzBdLDE2KjIqJGouIigkVGJsKSIpOworCSAgZm9yZWFjaCAoQGluc25zKSB7IGV2YWw7IH0JCSMgcmVtYWluaW5nIGluc3RydWN0aW9ucworCSZ2bW92ZHFhCSgxNiokai4iKCVyc3ApIiwkdDIpOworfQorCisgICAgZm9yICgkaT0wLCRqPTA7ICRqPDQ7ICRqKyspIHsKKwkmWE9QXzI1Nl8wMF80NygkaixcJmJvZHlfMDBfMTUsQFgpOworCXB1c2goQFgsc2hpZnQoQFgpKTsJCQkjIHJvdGF0ZShAWCkKKyAgICB9CisJJmNtcGIJKCRTWi0xKzE2KjIqJFNaLiIoJFRibCkiLDApOworCSZqbmUJKCIuTHhvcF8wMF80NyIpOworCisgICAgZm9yICgkaT0wOyAkaTwxNjsgKSB7CisJZm9yZWFjaChib2R5XzAwXzE1KCkpIHsgZXZhbDsgfQorICAgIH0KKworCQkJCQl9IGVsc2UgewkjIFNIQTUxMgorICAgIG15IEBYID0gbWFwKCIleG1tJF8iLCgwLi43KSk7CisgICAgbXkgKCR0MCwkdDEsJHQyLCR0MykgPSBtYXAoIiV4bW0kXyIsKDguLjExKSk7CisKKyRjb2RlLj08PF9fXzsKKy5hbGlnbgkxNgorLkxsb29wX3hvcDoKKwl2bW92ZHFhCSRUQUJMRStgJFNaKjIqJHJvdW5kc2AoJXJpcCksJHQzCisJdm1vdmRxdQkweDAwKCRpbnApLEBYWzBdCisJbGVhCSRUQUJMRSsweDgwKCVyaXApLCRUYmwJIyBzaXplIG9wdGltaXphdGlvbgorCXZtb3ZkcXUJMHgxMCgkaW5wKSxAWFsxXQorCXZtb3ZkcXUJMHgyMCgkaW5wKSxAWFsyXQorCXZwc2h1ZmIJJHQzLEBYWzBdLEBYWzBdCisJdm1vdmRxdQkweDMwKCRpbnApLEBYWzNdCisJdnBzaHVmYgkkdDMsQFhbMV0sQFhbMV0KKwl2bW92ZHF1CTB4NDAoJGlucCksQFhbNF0KKwl2cHNodWZiCSR0MyxAWFsyXSxAWFsyXQorCXZtb3ZkcXUJMHg1MCgkaW5wKSxAWFs1XQorCXZwc2h1ZmIJJHQzLEBYWzNdLEBYWzNdCisJdm1vdmRxdQkweDYwKCRpbnApLEBYWzZdCisJdnBzaHVmYgkkdDMsQFhbNF0sQFhbNF0KKwl2bW92ZHF1CTB4NzAoJGlucCksQFhbN10KKwl2cHNodWZiCSR0MyxAWFs1XSxAWFs1XQorCXZwYWRkcQktMHg4MCgkVGJsKSxAWFswXSwkdDAKKwl2cHNodWZiCSR0MyxAWFs2XSxAWFs2XQorCXZwYWRkcQktMHg2MCgkVGJsKSxAWFsxXSwkdDEKKwl2cHNodWZiCSR0MyxAWFs3XSxAWFs3XQorCXZwYWRkcQktMHg0MCgkVGJsKSxAWFsyXSwkdDIKKwl2cGFkZHEJLTB4MjAoJFRibCksQFhbM10sJHQzCisJdm1vdmRxYQkkdDAsMHgwMCglcnNwKQorCXZwYWRkcQkweDAwKCRUYmwpLEBYWzRdLCR0MAorCXZtb3ZkcWEJJHQxLDB4MTAoJXJzcCkKKwl2cGFkZHEJMHgyMCgkVGJsKSxAWFs1XSwkdDEKKwl2bW92ZHFhCSR0MiwweDIwKCVyc3ApCisJdnBhZGRxCTB4NDAoJFRibCksQFhbNl0sJHQyCisJdm1vdmRxYQkkdDMsMHgzMCglcnNwKQorCXZwYWRkcQkweDYwKCRUYmwpLEBYWzddLCR0MworCXZtb3ZkcWEJJHQwLDB4NDAoJXJzcCkKKwltb3YJJEEsJGExCisJdm1vdmRxYQkkdDEsMHg1MCglcnNwKQorCW1vdgkkQiwkYTMKKwl2bW92ZHFhCSR0MiwweDYwKCVyc3ApCisJeG9yCSRDLCRhMwkJCSMgbWFnaWMKKwl2bW92ZHFhCSR0MywweDcwKCVyc3ApCisJbW92CSRFLCRhMAorCWptcAkuTHhvcF8wMF80NworCisuYWxpZ24JMTYKKy5MeG9wXzAwXzQ3OgorCWFkZAlcJDE2KjIqJFNaLCRUYmwKK19fXworc3ViIFhPUF81MTJfMDBfNDcgKCkgeworbXkgJGogPSBzaGlmdDsKK215ICRib2R5ID0gc2hpZnQ7CitteSBAWCA9IEBfOworbXkgQGluc25zID0gKCYkYm9keSwmJGJvZHkpOwkJCSMgNTIgaW5zdHJ1Y3Rpb25zCisKKwkmdnBhbGlnbnIJKCR0MCxAWFsxXSxAWFswXSwkU1opOwkjIFhbMS4uMl0KKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAmdnBhbGlnbnIJKCR0MyxAWFs1XSxAWFs0XSwkU1opOwkjIFhbOS4uMTBdCisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmdnByb3RxCQkoJHQxLCR0MCw4KiRTWi0kc2lnbWEwWzFdKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSZ2cHNybHEJCSgkdDAsJHQwLCRzaWdtYTBbMl0pOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICZ2cGFkZHEJKEBYWzBdLEBYWzBdLCR0Myk7CSMgWFswLi4xXSArPSBYWzkuLjEwXQorCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmdnByb3RxCQkoJHQyLCR0MSwkc2lnbWEwWzFdLSRzaWdtYTBbMF0pOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJnZweG9yCQkoJHQwLCR0MCwkdDEpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgJnZwcm90cQkoJHQzLEBYWzddLDgqJFNaLSRzaWdtYTFbMV0pOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJnZweG9yCQkoJHQwLCR0MCwkdDIpOwkJIyBzaWdtYTAoWFsxLi4yXSkKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAmdnBzcmxxCSgkdDIsQFhbN10sJHNpZ21hMVsyXSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmdnBhZGRxCQkoQFhbMF0sQFhbMF0sJHQwKTsJIyBYWzAuLjFdICs9IHNpZ21hMChYWzEuLjJdKQorCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICZ2cHJvdHEJKCR0MSwkdDMsJHNpZ21hMVsxXS0kc2lnbWExWzBdKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAmdnB4b3IJCSgkdDMsJHQzLCR0Mik7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAmdnB4b3IJCSgkdDMsJHQzLCR0MSk7CQkjIHNpZ21hMShYWzE0Li4xNV0pCisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSZ2cGFkZHEJCShAWFswXSxAWFswXSwkdDMpOwkjIFhbMC4uMV0gKz0gc2lnbWExKFhbMTQuLjE1XSkKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJnZwYWRkcQkJKCR0MixAWFswXSwxNioyKiRqLTB4ODAuIigkVGJsKSIpOworCSAgZm9yZWFjaCAoQGluc25zKSB7IGV2YWw7IH0JCSMgcmVtYWluaW5nIGluc3RydWN0aW9ucworCSZ2bW92ZHFhCSgxNiokai4iKCVyc3ApIiwkdDIpOworfQorCisgICAgZm9yICgkaT0wLCRqPTA7ICRqPDg7ICRqKyspIHsKKwkmWE9QXzUxMl8wMF80NygkaixcJmJvZHlfMDBfMTUsQFgpOworCXB1c2goQFgsc2hpZnQoQFgpKTsJCQkjIHJvdGF0ZShAWCkKKyAgICB9CisJJmNtcGIJKCRTWi0xKzE2KjIqJFNaLTB4ODAuIigkVGJsKSIsMCk7CisJJmpuZQkoIi5MeG9wXzAwXzQ3Iik7CisKKyAgICBmb3IgKCRpPTA7ICRpPDE2OyApIHsKKwlmb3JlYWNoKGJvZHlfMDBfMTUoKSkgeyBldmFsOyB9CisgICAgfQorfQorJGNvZGUuPTw8X19fOworCW1vdgkkX2N0eCwkY3R4CisJbW92CSRhMSwkQQorCisJYWRkCSRTWiowKCRjdHgpLCRBCisJbGVhCTE2KiRTWigkaW5wKSwkaW5wCisJYWRkCSRTWioxKCRjdHgpLCRCCisJYWRkCSRTWioyKCRjdHgpLCRDCisJYWRkCSRTWiozKCRjdHgpLCRECisJYWRkCSRTWio0KCRjdHgpLCRFCisJYWRkCSRTWio1KCRjdHgpLCRGCisJYWRkCSRTWio2KCRjdHgpLCRHCisJYWRkCSRTWio3KCRjdHgpLCRICisKKwljbXAJJF9lbmQsJGlucAorCisJbW92CSRBLCRTWiowKCRjdHgpCisJbW92CSRCLCRTWioxKCRjdHgpCisJbW92CSRDLCRTWioyKCRjdHgpCisJbW92CSRELCRTWiozKCRjdHgpCisJbW92CSRFLCRTWio0KCRjdHgpCisJbW92CSRGLCRTWio1KCRjdHgpCisJbW92CSRHLCRTWio2KCRjdHgpCisJbW92CSRILCRTWio3KCRjdHgpCisJamIJLkxsb29wX3hvcAorCisJbW92CSRfcnNwLCVyc2kKKwl2emVyb3VwcGVyCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJHdpbjY0KTsKKwltb3ZhcHMJMTYqJFNaKzMyKCVyc3ApLCV4bW02CisJbW92YXBzCTE2KiRTWis0OCglcnNwKSwleG1tNworCW1vdmFwcwkxNiokU1orNjQoJXJzcCksJXhtbTgKKwltb3ZhcHMJMTYqJFNaKzgwKCVyc3ApLCV4bW05CitfX18KKyRjb2RlLj08PF9fXyBpZiAoJHdpbjY0ICYmICRTWj40KTsKKwltb3ZhcHMJMTYqJFNaKzk2KCVyc3ApLCV4bW0xMAorCW1vdmFwcwkxNiokU1orMTEyKCVyc3ApLCV4bW0xMQorX19fCiskY29kZS49PDxfX187CisJbW92CSglcnNpKSwlcjE1CisJbW92CTgoJXJzaSksJXIxNAorCW1vdgkxNiglcnNpKSwlcjEzCisJbW92CTI0KCVyc2kpLCVyMTIKKwltb3YJMzIoJXJzaSksJXJicAorCW1vdgk0MCglcnNpKSwlcmJ4CisJbGVhCTQ4KCVyc2kpLCVyc3AKKy5MZXBpbG9ndWVfeG9wOgorCXJldAorLnNpemUJJHtmdW5jfV94b3AsLi0ke2Z1bmN9X3hvcAorX19fCit9CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEFWWCtzaHJkIGNvZGUgcGF0aAorIworbG9jYWwgKnJvciA9IHN1YiB7ICZzaHJkKEBfWzBdLEBfKSB9OworCiskY29kZS49PDxfX187CisudHlwZQkke2Z1bmN9X2F2eCxcQGZ1bmN0aW9uLDMKKy5hbGlnbgk2NAorJHtmdW5jfV9hdng6CisuTGF2eF9zaG9ydGN1dDoKKwlwdXNoCSVyYngKKwlwdXNoCSVyYnAKKwlwdXNoCSVyMTIKKwlwdXNoCSVyMTMKKwlwdXNoCSVyMTQKKwlwdXNoCSVyMTUKKwltb3YJJXJzcCwlcjExCQkjIGNvcHkgJXJzcAorCXNobAlcJDQsJXJkeAkJIyBudW0qMTYKKwlzdWIJXCRgJGZyYW1lc3orJHdpbjY0KjE2KigkU1o9PTQ/NDo2KWAsJXJzcAorCWxlYQkoJGlucCwlcmR4LCRTWiksJXJkeAkjIGlucCtudW0qMTYqJFNaCisJYW5kCVwkLTY0LCVyc3AJCSMgYWxpZ24gc3RhY2sgZnJhbWUKKwltb3YJJGN0eCwkX2N0eAkJIyBzYXZlIGN0eCwgMXN0IGFyZworCW1vdgkkaW5wLCRfaW5wCQkjIHNhdmUgaW5wLCAybmQgYXJoCisJbW92CSVyZHgsJF9lbmQJCSMgc2F2ZSBlbmQgcG9pbnRlciwgIjNyZCIgYXJnCisJbW92CSVyMTEsJF9yc3AJCSMgc2F2ZSBjb3B5IG9mICVyc3AKK19fXworJGNvZGUuPTw8X19fIGlmICgkd2luNjQpOworCW1vdmFwcwkleG1tNiwxNiokU1orMzIoJXJzcCkKKwltb3ZhcHMJJXhtbTcsMTYqJFNaKzQ4KCVyc3ApCisJbW92YXBzCSV4bW04LDE2KiRTWis2NCglcnNwKQorCW1vdmFwcwkleG1tOSwxNiokU1orODAoJXJzcCkKK19fXworJGNvZGUuPTw8X19fIGlmICgkd2luNjQgJiYgJFNaPjQpOworCW1vdmFwcwkleG1tMTAsMTYqJFNaKzk2KCVyc3ApCisJbW92YXBzCSV4bW0xMSwxNiokU1orMTEyKCVyc3ApCitfX18KKyRjb2RlLj08PF9fXzsKKy5McHJvbG9ndWVfYXZ4OgorCisJdnplcm91cHBlcgorCW1vdgkkU1oqMCgkY3R4KSwkQQorCW1vdgkkU1oqMSgkY3R4KSwkQgorCW1vdgkkU1oqMigkY3R4KSwkQworCW1vdgkkU1oqMygkY3R4KSwkRAorCW1vdgkkU1oqNCgkY3R4KSwkRQorCW1vdgkkU1oqNSgkY3R4KSwkRgorCW1vdgkkU1oqNigkY3R4KSwkRworCW1vdgkkU1oqNygkY3R4KSwkSAorX19fCisJCQkJCWlmICgkU1o9PTQpIHsJIyBTSEEyNTYKKyAgICBteSBAWCA9IG1hcCgiJXhtbSRfIiwoMC4uMykpOworICAgIG15ICgkdDAsJHQxLCR0MiwkdDMsICR0NCwkdDUpID0gbWFwKCIleG1tJF8iLCg0Li45KSk7CisKKyRjb2RlLj08PF9fXzsKKwl2bW92ZHFhCSRUQUJMRStgJFNaKjIqJHJvdW5kc2ArMzIoJXJpcCksJHQ0CisJdm1vdmRxYQkkVEFCTEUrYCRTWioyKiRyb3VuZHNgKzY0KCVyaXApLCR0NQorCWptcAkuTGxvb3BfYXZ4CisuYWxpZ24JMTYKKy5MbG9vcF9hdng6CisJdm1vdmRxYQkkVEFCTEUrYCRTWioyKiRyb3VuZHNgKCVyaXApLCR0MworCXZtb3ZkcXUJMHgwMCgkaW5wKSxAWFswXQorCXZtb3ZkcXUJMHgxMCgkaW5wKSxAWFsxXQorCXZtb3ZkcXUJMHgyMCgkaW5wKSxAWFsyXQorCXZtb3ZkcXUJMHgzMCgkaW5wKSxAWFszXQorCXZwc2h1ZmIJJHQzLEBYWzBdLEBYWzBdCisJbGVhCSRUQUJMRSglcmlwKSwkVGJsCisJdnBzaHVmYgkkdDMsQFhbMV0sQFhbMV0KKwl2cHNodWZiCSR0MyxAWFsyXSxAWFsyXQorCXZwYWRkZAkweDAwKCRUYmwpLEBYWzBdLCR0MAorCXZwc2h1ZmIJJHQzLEBYWzNdLEBYWzNdCisJdnBhZGRkCTB4MjAoJFRibCksQFhbMV0sJHQxCisJdnBhZGRkCTB4NDAoJFRibCksQFhbMl0sJHQyCisJdnBhZGRkCTB4NjAoJFRibCksQFhbM10sJHQzCisJdm1vdmRxYQkkdDAsMHgwMCglcnNwKQorCW1vdgkkQSwkYTEKKwl2bW92ZHFhCSR0MSwweDEwKCVyc3ApCisJbW92CSRCLCRhMworCXZtb3ZkcWEJJHQyLDB4MjAoJXJzcCkKKwl4b3IJJEMsJGEzCQkJIyBtYWdpYworCXZtb3ZkcWEJJHQzLDB4MzAoJXJzcCkKKwltb3YJJEUsJGEwCisJam1wCS5MYXZ4XzAwXzQ3CisKKy5hbGlnbgkxNgorLkxhdnhfMDBfNDc6CisJc3ViCVwkLTE2KjIqJFNaLCRUYmwJIyBzaXplIG9wdGltaXphdGlvbgorX19fCitzdWIgWHVwZGF0ZV8yNTZfQVZYICgpIHsKKwkoCisJJyZ2cGFsaWducgkoJHQwLEBYWzFdLEBYWzBdLCRTWiknLAkjIFhbMS4uNF0KKwkgJyZ2cGFsaWducgkoJHQzLEBYWzNdLEBYWzJdLCRTWiknLAkjIFhbOS4uMTJdCisJJyZ2cHNybGQJKCR0MiwkdDAsJHNpZ21hMFswXSk7JywKKwkgJyZ2cGFkZGQJKEBYWzBdLEBYWzBdLCR0MyknLAkjIFhbMC4uM10gKz0gWFs5Li4xMl0KKwknJnZwc3JsZAkoJHQzLCR0MCwkc2lnbWEwWzJdKScsCisJJyZ2cHNsbGQJKCR0MSwkdDAsOCokU1otJHNpZ21hMFsxXSk7JywKKwknJnZweG9yCQkoJHQwLCR0MywkdDIpJywKKwkgJyZ2cHNodWZkCSgkdDMsQFhbM10sMGIxMTExMTAxMCknLCMgWFsxNC4uMTVdCisJJyZ2cHNybGQJKCR0MiwkdDIsJHNpZ21hMFsxXS0kc2lnbWEwWzBdKTsnLAorCScmdnB4b3IJCSgkdDAsJHQwLCR0MSknLAorCScmdnBzbGxkCSgkdDEsJHQxLCRzaWdtYTBbMV0tJHNpZ21hMFswXSk7JywKKwknJnZweG9yCQkoJHQwLCR0MCwkdDIpJywKKwkgJyZ2cHNybGQJKCR0MiwkdDMsJHNpZ21hMVsyXSk7JywKKwknJnZweG9yCQkoJHQwLCR0MCwkdDEpJywJCSMgc2lnbWEwKFhbMS4uNF0pCisJICcmdnBzcmxxCSgkdDMsJHQzLCRzaWdtYTFbMF0pOycsCisJJyZ2cGFkZGQJKEBYWzBdLEBYWzBdLCR0MCknLAkjIFhbMC4uM10gKz0gc2lnbWEwKFhbMS4uNF0pCisJICcmdnB4b3IJKCR0MiwkdDIsJHQzKTsnLAorCSAnJnZwc3JscQkoJHQzLCR0Mywkc2lnbWExWzFdLSRzaWdtYTFbMF0pJywKKwkgJyZ2cHhvcgkoJHQyLCR0MiwkdDMpJywKKwkgJyZ2cHNodWZiCSgkdDIsJHQyLCR0NCknLAkJIyBzaWdtYTEoWFsxNC4uMTVdKQorCScmdnBhZGRkCShAWFswXSxAWFswXSwkdDIpJywJIyBYWzAuLjFdICs9IHNpZ21hMShYWzE0Li4xNV0pCisJICcmdnBzaHVmZAkoJHQzLEBYWzBdLDBiMDEwMTAwMDApJywjIFhbMTYuLjE3XQorCSAnJnZwc3JsZAkoJHQyLCR0Mywkc2lnbWExWzJdKScsCisJICcmdnBzcmxxCSgkdDMsJHQzLCRzaWdtYTFbMF0pJywKKwkgJyZ2cHhvcgkoJHQyLCR0MiwkdDMpOycsCisJICcmdnBzcmxxCSgkdDMsJHQzLCRzaWdtYTFbMV0tJHNpZ21hMVswXSknLAorCSAnJnZweG9yCSgkdDIsJHQyLCR0MyknLAorCSAnJnZwc2h1ZmIJKCR0MiwkdDIsJHQ1KScsCisJJyZ2cGFkZGQJKEBYWzBdLEBYWzBdLCR0MiknCSMgWFsyLi4zXSArPSBzaWdtYTEoWFsxNi4uMTddKQorCSk7Cit9CisKK3N1YiBBVlhfMjU2XzAwXzQ3ICgpIHsKK215ICRqID0gc2hpZnQ7CitteSAkYm9keSA9IHNoaWZ0OworbXkgQFggPSBAXzsKK215IEBpbnNucyA9ICgmJGJvZHksJiRib2R5LCYkYm9keSwmJGJvZHkpOwkjIDEwNCBpbnN0cnVjdGlvbnMKKworCWZvcmVhY2ggKFh1cGRhdGVfMjU2X0FWWCgpKSB7CQkjIDI5IGluc3RydWN0aW9ucworCSAgICBldmFsOworCSAgICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgICBldmFsKHNoaWZ0KEBpbnNucykpOworCX0KKwkmdnBhZGRkCQkoJHQyLEBYWzBdLDE2KjIqJGouIigkVGJsKSIpOworCSAgZm9yZWFjaCAoQGluc25zKSB7IGV2YWw7IH0JCSMgcmVtYWluaW5nIGluc3RydWN0aW9ucworCSZ2bW92ZHFhCSgxNiokai4iKCVyc3ApIiwkdDIpOworfQorCisgICAgZm9yICgkaT0wLCRqPTA7ICRqPDQ7ICRqKyspIHsKKwkmQVZYXzI1Nl8wMF80NygkaixcJmJvZHlfMDBfMTUsQFgpOworCXB1c2goQFgsc2hpZnQoQFgpKTsJCQkjIHJvdGF0ZShAWCkKKyAgICB9CisJJmNtcGIJKCRTWi0xKzE2KjIqJFNaLiIoJFRibCkiLDApOworCSZqbmUJKCIuTGF2eF8wMF80NyIpOworCisgICAgZm9yICgkaT0wOyAkaTwxNjsgKSB7CisJZm9yZWFjaChib2R5XzAwXzE1KCkpIHsgZXZhbDsgfQorICAgIH0KKworCQkJCQl9IGVsc2UgewkjIFNIQTUxMgorICAgIG15IEBYID0gbWFwKCIleG1tJF8iLCgwLi43KSk7CisgICAgbXkgKCR0MCwkdDEsJHQyLCR0MykgPSBtYXAoIiV4bW0kXyIsKDguLjExKSk7CisKKyRjb2RlLj08PF9fXzsKKwlqbXAJLkxsb29wX2F2eAorLmFsaWduCTE2CisuTGxvb3BfYXZ4OgorCXZtb3ZkcWEJJFRBQkxFK2AkU1oqMiokcm91bmRzYCglcmlwKSwkdDMKKwl2bW92ZHF1CTB4MDAoJGlucCksQFhbMF0KKwlsZWEJJFRBQkxFKzB4ODAoJXJpcCksJFRibAkjIHNpemUgb3B0aW1pemF0aW9uCisJdm1vdmRxdQkweDEwKCRpbnApLEBYWzFdCisJdm1vdmRxdQkweDIwKCRpbnApLEBYWzJdCisJdnBzaHVmYgkkdDMsQFhbMF0sQFhbMF0KKwl2bW92ZHF1CTB4MzAoJGlucCksQFhbM10KKwl2cHNodWZiCSR0MyxAWFsxXSxAWFsxXQorCXZtb3ZkcXUJMHg0MCgkaW5wKSxAWFs0XQorCXZwc2h1ZmIJJHQzLEBYWzJdLEBYWzJdCisJdm1vdmRxdQkweDUwKCRpbnApLEBYWzVdCisJdnBzaHVmYgkkdDMsQFhbM10sQFhbM10KKwl2bW92ZHF1CTB4NjAoJGlucCksQFhbNl0KKwl2cHNodWZiCSR0MyxAWFs0XSxAWFs0XQorCXZtb3ZkcXUJMHg3MCgkaW5wKSxAWFs3XQorCXZwc2h1ZmIJJHQzLEBYWzVdLEBYWzVdCisJdnBhZGRxCS0weDgwKCRUYmwpLEBYWzBdLCR0MAorCXZwc2h1ZmIJJHQzLEBYWzZdLEBYWzZdCisJdnBhZGRxCS0weDYwKCRUYmwpLEBYWzFdLCR0MQorCXZwc2h1ZmIJJHQzLEBYWzddLEBYWzddCisJdnBhZGRxCS0weDQwKCRUYmwpLEBYWzJdLCR0MgorCXZwYWRkcQktMHgyMCgkVGJsKSxAWFszXSwkdDMKKwl2bW92ZHFhCSR0MCwweDAwKCVyc3ApCisJdnBhZGRxCTB4MDAoJFRibCksQFhbNF0sJHQwCisJdm1vdmRxYQkkdDEsMHgxMCglcnNwKQorCXZwYWRkcQkweDIwKCRUYmwpLEBYWzVdLCR0MQorCXZtb3ZkcWEJJHQyLDB4MjAoJXJzcCkKKwl2cGFkZHEJMHg0MCgkVGJsKSxAWFs2XSwkdDIKKwl2bW92ZHFhCSR0MywweDMwKCVyc3ApCisJdnBhZGRxCTB4NjAoJFRibCksQFhbN10sJHQzCisJdm1vdmRxYQkkdDAsMHg0MCglcnNwKQorCW1vdgkkQSwkYTEKKwl2bW92ZHFhCSR0MSwweDUwKCVyc3ApCisJbW92CSRCLCRhMworCXZtb3ZkcWEJJHQyLDB4NjAoJXJzcCkKKwl4b3IJJEMsJGEzCQkJIyBtYWdpYworCXZtb3ZkcWEJJHQzLDB4NzAoJXJzcCkKKwltb3YJJEUsJGEwCisJam1wCS5MYXZ4XzAwXzQ3CisKKy5hbGlnbgkxNgorLkxhdnhfMDBfNDc6CisJYWRkCVwkMTYqMiokU1osJFRibAorX19fCitzdWIgWHVwZGF0ZV81MTJfQVZYICgpIHsKKwkoCisJJyZ2cGFsaWducgkoJHQwLEBYWzFdLEBYWzBdLCRTWiknLAkjIFhbMS4uMl0KKwkgJyZ2cGFsaWducgkoJHQzLEBYWzVdLEBYWzRdLCRTWiknLAkjIFhbOS4uMTBdCisJJyZ2cHNybHEJKCR0MiwkdDAsJHNpZ21hMFswXSknLAorCSAnJnZwYWRkcQkoQFhbMF0sQFhbMF0sJHQzKTsnLAkjIFhbMC4uMV0gKz0gWFs5Li4xMF0KKwknJnZwc3JscQkoJHQzLCR0MCwkc2lnbWEwWzJdKScsCisJJyZ2cHNsbHEJKCR0MSwkdDAsOCokU1otJHNpZ21hMFsxXSk7JywKKwkgJyZ2cHhvcgkoJHQwLCR0MywkdDIpJywKKwknJnZwc3JscQkoJHQyLCR0Miwkc2lnbWEwWzFdLSRzaWdtYTBbMF0pOycsCisJICcmdnB4b3IJKCR0MCwkdDAsJHQxKScsCisJJyZ2cHNsbHEJKCR0MSwkdDEsJHNpZ21hMFsxXS0kc2lnbWEwWzBdKTsnLAorCSAnJnZweG9yCSgkdDAsJHQwLCR0MiknLAorCSAnJnZwc3JscQkoJHQzLEBYWzddLCRzaWdtYTFbMl0pOycsCisJJyZ2cHhvcgkJKCR0MCwkdDAsJHQxKScsCQkjIHNpZ21hMChYWzEuLjJdKQorCSAnJnZwc2xscQkoJHQyLEBYWzddLDgqJFNaLSRzaWdtYTFbMV0pOycsCisJJyZ2cGFkZHEJKEBYWzBdLEBYWzBdLCR0MCknLAkjIFhbMC4uMV0gKz0gc2lnbWEwKFhbMS4uMl0pCisJICcmdnBzcmxxCSgkdDEsQFhbN10sJHNpZ21hMVswXSk7JywKKwkgJyZ2cHhvcgkoJHQzLCR0MywkdDIpJywKKwkgJyZ2cHNsbHEJKCR0MiwkdDIsJHNpZ21hMVsxXS0kc2lnbWExWzBdKTsnLAorCSAnJnZweG9yCSgkdDMsJHQzLCR0MSknLAorCSAnJnZwc3JscQkoJHQxLCR0MSwkc2lnbWExWzFdLSRzaWdtYTFbMF0pOycsCisJICcmdnB4b3IJKCR0MywkdDMsJHQyKScsCisJICcmdnB4b3IJKCR0MywkdDMsJHQxKScsCQkjIHNpZ21hMShYWzE0Li4xNV0pCisJJyZ2cGFkZHEJKEBYWzBdLEBYWzBdLCR0MyknLAkjIFhbMC4uMV0gKz0gc2lnbWExKFhbMTQuLjE1XSkKKwkpOworfQorCitzdWIgQVZYXzUxMl8wMF80NyAoKSB7CitteSAkaiA9IHNoaWZ0OworbXkgJGJvZHkgPSBzaGlmdDsKK215IEBYID0gQF87CitteSBAaW5zbnMgPSAoJiRib2R5LCYkYm9keSk7CQkJIyA1MiBpbnN0cnVjdGlvbnMKKworCWZvcmVhY2ggKFh1cGRhdGVfNTEyX0FWWCgpKSB7CQkjIDIzIGluc3RydWN0aW9ucworCSAgICBldmFsOworCSAgICBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgICBldmFsKHNoaWZ0KEBpbnNucykpOworCX0KKwkmdnBhZGRxCQkoJHQyLEBYWzBdLDE2KjIqJGotMHg4MC4iKCRUYmwpIik7CisJICBmb3JlYWNoIChAaW5zbnMpIHsgZXZhbDsgfQkJIyByZW1haW5pbmcgaW5zdHJ1Y3Rpb25zCisJJnZtb3ZkcWEJKDE2KiRqLiIoJXJzcCkiLCR0Mik7Cit9CisKKyAgICBmb3IgKCRpPTAsJGo9MDsgJGo8ODsgJGorKykgeworCSZBVlhfNTEyXzAwXzQ3KCRqLFwmYm9keV8wMF8xNSxAWCk7CisJcHVzaChAWCxzaGlmdChAWCkpOwkJCSMgcm90YXRlKEBYKQorICAgIH0KKwkmY21wYgkoJFNaLTErMTYqMiokU1otMHg4MC4iKCRUYmwpIiwwKTsKKwkmam5lCSgiLkxhdnhfMDBfNDciKTsKKworICAgIGZvciAoJGk9MDsgJGk8MTY7ICkgeworCWZvcmVhY2goYm9keV8wMF8xNSgpKSB7IGV2YWw7IH0KKyAgICB9Cit9CiskY29kZS49PDxfX187CisJbW92CSRfY3R4LCRjdHgKKwltb3YJJGExLCRBCisKKwlhZGQJJFNaKjAoJGN0eCksJEEKKwlsZWEJMTYqJFNaKCRpbnApLCRpbnAKKwlhZGQJJFNaKjEoJGN0eCksJEIKKwlhZGQJJFNaKjIoJGN0eCksJEMKKwlhZGQJJFNaKjMoJGN0eCksJEQKKwlhZGQJJFNaKjQoJGN0eCksJEUKKwlhZGQJJFNaKjUoJGN0eCksJEYKKwlhZGQJJFNaKjYoJGN0eCksJEcKKwlhZGQJJFNaKjcoJGN0eCksJEgKKworCWNtcAkkX2VuZCwkaW5wCisKKwltb3YJJEEsJFNaKjAoJGN0eCkKKwltb3YJJEIsJFNaKjEoJGN0eCkKKwltb3YJJEMsJFNaKjIoJGN0eCkKKwltb3YJJEQsJFNaKjMoJGN0eCkKKwltb3YJJEUsJFNaKjQoJGN0eCkKKwltb3YJJEYsJFNaKjUoJGN0eCkKKwltb3YJJEcsJFNaKjYoJGN0eCkKKwltb3YJJEgsJFNaKjcoJGN0eCkKKwlqYgkuTGxvb3BfYXZ4CisKKwltb3YJJF9yc3AsJXJzaQorCXZ6ZXJvdXBwZXIKK19fXworJGNvZGUuPTw8X19fIGlmICgkd2luNjQpOworCW1vdmFwcwkxNiokU1orMzIoJXJzcCksJXhtbTYKKwltb3ZhcHMJMTYqJFNaKzQ4KCVyc3ApLCV4bW03CisJbW92YXBzCTE2KiRTWis2NCglcnNwKSwleG1tOAorCW1vdmFwcwkxNiokU1orODAoJXJzcCksJXhtbTkKK19fXworJGNvZGUuPTw8X19fIGlmICgkd2luNjQgJiYgJFNaPjQpOworCW1vdmFwcwkxNiokU1orOTYoJXJzcCksJXhtbTEwCisJbW92YXBzCTE2KiRTWisxMTIoJXJzcCksJXhtbTExCitfX18KKyRjb2RlLj08PF9fXzsKKwltb3YJKCVyc2kpLCVyMTUKKwltb3YJOCglcnNpKSwlcjE0CisJbW92CTE2KCVyc2kpLCVyMTMKKwltb3YJMjQoJXJzaSksJXIxMgorCW1vdgkzMiglcnNpKSwlcmJwCisJbW92CTQwKCVyc2kpLCVyYngKKwlsZWEJNDgoJXJzaSksJXJzcAorLkxlcGlsb2d1ZV9hdng6CisJcmV0Cisuc2l6ZQkke2Z1bmN9X2F2eCwuLSR7ZnVuY31fYXZ4CitfX18KKworaWYgKCRhdng+MSkge3sKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQVZYMitCTUkgY29kZSBwYXRoCisjCitteSAkYTU9JFNaPT00PyIlZXNpIjoiJXJzaSI7CSMgemFwICRpbnAgCitteSAkUFVTSDg9OCoyKiRTWjsKK3VzZSBpbnRlZ2VyOworCitzdWIgYm9keXhfMDBfMTUgKCkgeworCSMgYXQgc3RhcnQgJGExIHNob3VsZCBiZSB6ZXJvLCAkYTMgLSAkYl4kYyBhbmQgJGE0IGNvcHkgb2YgJGYKKwkoCisJJygkYSwkYiwkYywkZCwkZSwkZiwkZywkaCk9QFJPVDsnLgorCisJJyZhZGQJKCRoLCgzMiooJGkvKDE2LyRTWikpKyRTWiooJGklKDE2LyRTWikpKSUkUFVTSDguJGJhc2UpJywgICAgIyBoKz1YW2ldK0tbaV0KKwknJmFuZAkoJGE0LCRlKScsCQkjIGYmZQorCScmcm9yeAkoJGEwLCRlLCRTaWdtYTFbMl0pJywKKwknJnJvcngJKCRhMiwkZSwkU2lnbWExWzFdKScsCisKKwknJmxlYQkoJGEsIigkYSwkYTEpIiknLAkjIGgrPVNpZ21hMChhKSBmcm9tIHRoZSBwYXN0CisJJyZsZWEJKCRoLCIoJGgsJGE0KSIpJywKKwknJmFuZG4JKCRhNCwkZSwkZyknLAkJIyB+ZSZnCisJJyZ4b3IJKCRhMCwkYTIpJywKKworCScmcm9yeAkoJGExLCRlLCRTaWdtYTFbMF0pJywKKwknJmxlYQkoJGgsIigkaCwkYTQpIiknLAkjIGgrPUNoKGUsZixnKT0oZSZmKSsofmUmZykKKwknJnhvcgkoJGEwLCRhMSknLAkJIyBTaWdtYTEoZSkKKwknJm1vdgkoJGEyLCRhKScsCisKKwknJnJvcngJKCRhNCwkYSwkU2lnbWEwWzJdKScsCisJJyZsZWEJKCRoLCIoJGgsJGEwKSIpJywJIyBoKz1TaWdtYTEoZSkKKwknJnhvcgkoJGEyLCRiKScsCQkjIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwknJnJvcngJKCRhMSwkYSwkU2lnbWEwWzFdKScsCisKKwknJnJvcngJKCRhMCwkYSwkU2lnbWEwWzBdKScsCisJJyZsZWEJKCRkLCIoJGQsJGgpIiknLAkjIGQrPWgKKwknJmFuZAkoJGEzLCRhMiknLAkJIyAoYl5jKSYoYV5iKQorCScmeG9yCSgkYTEsJGE0KScsCisKKwknJnhvcgkoJGEzLCRiKScsCQkjIE1haihhLGIsYyk9Q2goYV5iLGMsYikKKwknJnhvcgkoJGExLCRhMCknLAkJIyBTaWdtYTAoYSkKKwknJmxlYQkoJGgsIigkaCwkYTMpIik7Jy4JIyBoKz1NYWooYSxiLGMpCisJJyZtb3YJKCRhNCwkZSknLAkJIyBjb3B5IG9mIGYgaW4gZnV0dXJlCisKKwknKCRhMiwkYTMpID0gKCRhMywkYTIpOyB1bnNoaWZ0KEBST1QscG9wKEBST1QpKTsgJGkrKzsnCisJKTsKKwkjIGFuZCBhdCB0aGUgZmluaXNoIG9uZSBoYXMgdG8gJGErPSRhMQorfQorCiskY29kZS49PDxfX187CisudHlwZQkke2Z1bmN9X2F2eDIsXEBmdW5jdGlvbiwzCisuYWxpZ24JNjQKKyR7ZnVuY31fYXZ4MjoKKy5MYXZ4Ml9zaG9ydGN1dDoKKwlwdXNoCSVyYngKKwlwdXNoCSVyYnAKKwlwdXNoCSVyMTIKKwlwdXNoCSVyMTMKKwlwdXNoCSVyMTQKKwlwdXNoCSVyMTUKKwltb3YJJXJzcCwlcjExCQkjIGNvcHkgJXJzcAorCXN1YglcJGAyKiRTWiokcm91bmRzKzQqOCskd2luNjQqMTYqKCRTWj09ND80OjYpYCwlcnNwCisJc2hsCVwkNCwlcmR4CQkjIG51bSoxNgorCWFuZAlcJC0yNTYqJFNaLCVyc3AJCSMgYWxpZ24gc3RhY2sgZnJhbWUKKwlsZWEJKCRpbnAsJXJkeCwkU1opLCVyZHgJIyBpbnArbnVtKjE2KiRTWgorCWFkZAlcJGAyKiRTWiooJHJvdW5kcy04KWAsJXJzcAorCW1vdgkkY3R4LCRfY3R4CQkjIHNhdmUgY3R4LCAxc3QgYXJnCisJbW92CSRpbnAsJF9pbnAJCSMgc2F2ZSBpbnAsIDJuZCBhcmgKKwltb3YJJXJkeCwkX2VuZAkJIyBzYXZlIGVuZCBwb2ludGVyLCAiM3JkIiBhcmcKKwltb3YJJXIxMSwkX3JzcAkJIyBzYXZlIGNvcHkgb2YgJXJzcAorX19fCiskY29kZS49PDxfX18gaWYgKCR3aW42NCk7CisJbW92YXBzCSV4bW02LDE2KiRTWiszMiglcnNwKQorCW1vdmFwcwkleG1tNywxNiokU1orNDgoJXJzcCkKKwltb3ZhcHMJJXhtbTgsMTYqJFNaKzY0KCVyc3ApCisJbW92YXBzCSV4bW05LDE2KiRTWis4MCglcnNwKQorX19fCiskY29kZS49PDxfX18gaWYgKCR3aW42NCAmJiAkU1o+NCk7CisJbW92YXBzCSV4bW0xMCwxNiokU1orOTYoJXJzcCkKKwltb3ZhcHMJJXhtbTExLDE2KiRTWisxMTIoJXJzcCkKK19fXworJGNvZGUuPTw8X19fOworLkxwcm9sb2d1ZV9hdngyOgorCisJdnplcm91cHBlcgorCXN1YglcJC0xNiokU1osJGlucAkJIyBpbnArKywgc2l6ZSBvcHRpbWl6YXRpb24KKwltb3YJJFNaKjAoJGN0eCksJEEKKwltb3YJJGlucCwlcjEyCQkjIGJvcnJvdyAkVDEKKwltb3YJJFNaKjEoJGN0eCksJEIKKwljbXAJJXJkeCwkaW5wCQkjICRfZW5kCisJbW92CSRTWioyKCRjdHgpLCRDCisJY21vdmUJJXJzcCwlcjEyCQkjIG5leHQgYmxvY2sgb3IgcmFuZG9tIGRhdGEKKwltb3YJJFNaKjMoJGN0eCksJEQKKwltb3YJJFNaKjQoJGN0eCksJEUKKwltb3YJJFNaKjUoJGN0eCksJEYKKwltb3YJJFNaKjYoJGN0eCksJEcKKwltb3YJJFNaKjcoJGN0eCksJEgKK19fXworCQkJCQlpZiAoJFNaPT00KSB7CSMgU0hBMjU2CisgICAgbXkgQFggPSBtYXAoIiV5bW0kXyIsKDAuLjMpKTsKKyAgICBteSAoJHQwLCR0MSwkdDIsJHQzLCAkdDQsJHQ1KSA9IG1hcCgiJXltbSRfIiwoNC4uOSkpOworCiskY29kZS49PDxfX187CisJdm1vdmRxYQkkVEFCTEUrYCRTWioyKiRyb3VuZHNgKzMyKCVyaXApLCR0NAorCXZtb3ZkcWEJJFRBQkxFK2AkU1oqMiokcm91bmRzYCs2NCglcmlwKSwkdDUKKwlqbXAJLkxvb3BfYXZ4MgorLmFsaWduCTE2CisuTG9vcF9hdngyOgorCXZtb3ZkcWEJJFRBQkxFK2AkU1oqMiokcm91bmRzYCglcmlwKSwkdDMKKwl2bW92ZHF1CS0xNiokU1orMCgkaW5wKSwleG1tMAorCXZtb3ZkcXUJLTE2KiRTWisxNigkaW5wKSwleG1tMQorCXZtb3ZkcXUJLTE2KiRTWiszMigkaW5wKSwleG1tMgorCXZtb3ZkcXUJLTE2KiRTWis0OCgkaW5wKSwleG1tMworCSNtb3YJCSRpbnAsJF9pbnAJIyBvZmZsb2FkICRpbnAKKwl2aW5zZXJ0aTEyOAlcJDEsKCVyMTIpLEBYWzBdLEBYWzBdCisJdmluc2VydGkxMjgJXCQxLDE2KCVyMTIpLEBYWzFdLEBYWzFdCisJdnBzaHVmYgkJJHQzLEBYWzBdLEBYWzBdCisJdmluc2VydGkxMjgJXCQxLDMyKCVyMTIpLEBYWzJdLEBYWzJdCisJdnBzaHVmYgkJJHQzLEBYWzFdLEBYWzFdCisJdmluc2VydGkxMjgJXCQxLDQ4KCVyMTIpLEBYWzNdLEBYWzNdCisKKwlsZWEJJFRBQkxFKCVyaXApLCRUYmwKKwl2cHNodWZiCSR0MyxAWFsyXSxAWFsyXQorCXZwYWRkZAkweDAwKCRUYmwpLEBYWzBdLCR0MAorCXZwc2h1ZmIJJHQzLEBYWzNdLEBYWzNdCisJdnBhZGRkCTB4MjAoJFRibCksQFhbMV0sJHQxCisJdnBhZGRkCTB4NDAoJFRibCksQFhbMl0sJHQyCisJdnBhZGRkCTB4NjAoJFRibCksQFhbM10sJHQzCisJdm1vdmRxYQkkdDAsMHgwMCglcnNwKQorCXhvcgkkYTEsJGExCisJdm1vdmRxYQkkdDEsMHgyMCglcnNwKQorCWxlYQktJFBVU0g4KCVyc3ApLCVyc3AKKwltb3YJJEIsJGEzCisJdm1vdmRxYQkkdDIsMHgwMCglcnNwKQorCXhvcgkkQywkYTMJCQkjIG1hZ2ljCisJdm1vdmRxYQkkdDMsMHgyMCglcnNwKQorCW1vdgkkRiwkYTQKKwlzdWIJXCQtMTYqMiokU1osJFRibAkjIHNpemUgb3B0aW1pemF0aW9uCisJam1wCS5MYXZ4Ml8wMF80NworCisuYWxpZ24JMTYKKy5MYXZ4Ml8wMF80NzoKK19fXworCitzdWIgQVZYMl8yNTZfMDBfNDcgKCkgeworbXkgJGogPSBzaGlmdDsKK215ICRib2R5ID0gc2hpZnQ7CitteSBAWCA9IEBfOworbXkgQGluc25zID0gKCYkYm9keSwmJGJvZHksJiRib2R5LCYkYm9keSk7CSMgOTYgaW5zdHJ1Y3Rpb25zCitteSAkYmFzZSA9ICIrMiokUFVTSDgoJXJzcCkiOworCisJJmxlYQkoIiVyc3AiLCItJFBVU0g4KCVyc3ApIikJaWYgKCgkaiUyKT09MCk7CisJZm9yZWFjaCAoWHVwZGF0ZV8yNTZfQVZYKCkpIHsJCSMgMjkgaW5zdHJ1Y3Rpb25zCisJICAgIGV2YWw7CisJICAgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICAgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICAgIGV2YWwoc2hpZnQoQGluc25zKSk7CisJfQorCSZ2cGFkZGQJCSgkdDIsQFhbMF0sMTYqMiokai4iKCRUYmwpIik7CisJICBmb3JlYWNoIChAaW5zbnMpIHsgZXZhbDsgfQkJIyByZW1haW5pbmcgaW5zdHJ1Y3Rpb25zCisJJnZtb3ZkcWEJKCgzMiokaiklJFBVU0g4LiIoJXJzcCkiLCR0Mik7Cit9CisKKyAgICBmb3IgKCRpPTAsJGo9MDsgJGo8NDsgJGorKykgeworCSZBVlgyXzI1Nl8wMF80NygkaixcJmJvZHl4XzAwXzE1LEBYKTsKKwlwdXNoKEBYLHNoaWZ0KEBYKSk7CQkJIyByb3RhdGUoQFgpCisgICAgfQorCSZsZWEJKCRUYmwsMTYqMiokU1ouIigkVGJsKSIpOworCSZjbXBiCSgoJFNaLTEpLiIoJFRibCkiLDApOworCSZqbmUJKCIuTGF2eDJfMDBfNDciKTsKKworICAgIGZvciAoJGk9MDsgJGk8MTY7ICkgeworCW15ICRiYXNlPSRpPDg/IiskUFVTSDgoJXJzcCkiOiIoJXJzcCkiOworCWZvcmVhY2goYm9keXhfMDBfMTUoKSkgeyBldmFsOyB9CisgICAgfQorCQkJCQl9IGVsc2UgewkjIFNIQTUxMgorICAgIG15IEBYID0gbWFwKCIleW1tJF8iLCgwLi43KSk7CisgICAgbXkgKCR0MCwkdDEsJHQyLCR0MykgPSBtYXAoIiV5bW0kXyIsKDguLjExKSk7CisKKyRjb2RlLj08PF9fXzsKKwlqbXAJLkxvb3BfYXZ4MgorLmFsaWduCTE2CisuTG9vcF9hdngyOgorCXZtb3ZkcXUJLTE2KiRTWigkaW5wKSwleG1tMAorCXZtb3ZkcXUJLTE2KiRTWisxNigkaW5wKSwleG1tMQorCXZtb3ZkcXUJLTE2KiRTWiszMigkaW5wKSwleG1tMgorCWxlYQkkVEFCTEUrMHg4MCglcmlwKSwkVGJsCSMgc2l6ZSBvcHRpbWl6YXRpb24KKwl2bW92ZHF1CS0xNiokU1orNDgoJGlucCksJXhtbTMKKwl2bW92ZHF1CS0xNiokU1orNjQoJGlucCksJXhtbTQKKwl2bW92ZHF1CS0xNiokU1orODAoJGlucCksJXhtbTUKKwl2bW92ZHF1CS0xNiokU1orOTYoJGlucCksJXhtbTYKKwl2bW92ZHF1CS0xNiokU1orMTEyKCRpbnApLCV4bW03CisJI21vdgkkaW5wLCRfaW5wCSMgb2ZmbG9hZCAkaW5wCisJdm1vdmRxYQlgJFNaKjIqJHJvdW5kcy0weDgwYCgkVGJsKSwkdDIKKwl2aW5zZXJ0aTEyOAlcJDEsKCVyMTIpLEBYWzBdLEBYWzBdCisJdmluc2VydGkxMjgJXCQxLDE2KCVyMTIpLEBYWzFdLEBYWzFdCisJIHZwc2h1ZmIJJHQyLEBYWzBdLEBYWzBdCisJdmluc2VydGkxMjgJXCQxLDMyKCVyMTIpLEBYWzJdLEBYWzJdCisJIHZwc2h1ZmIJJHQyLEBYWzFdLEBYWzFdCisJdmluc2VydGkxMjgJXCQxLDQ4KCVyMTIpLEBYWzNdLEBYWzNdCisJIHZwc2h1ZmIJJHQyLEBYWzJdLEBYWzJdCisJdmluc2VydGkxMjgJXCQxLDY0KCVyMTIpLEBYWzRdLEBYWzRdCisJIHZwc2h1ZmIJJHQyLEBYWzNdLEBYWzNdCisJdmluc2VydGkxMjgJXCQxLDgwKCVyMTIpLEBYWzVdLEBYWzVdCisJIHZwc2h1ZmIJJHQyLEBYWzRdLEBYWzRdCisJdmluc2VydGkxMjgJXCQxLDk2KCVyMTIpLEBYWzZdLEBYWzZdCisJIHZwc2h1ZmIJJHQyLEBYWzVdLEBYWzVdCisJdmluc2VydGkxMjgJXCQxLDExMiglcjEyKSxAWFs3XSxAWFs3XQorCisJdnBhZGRxCS0weDgwKCRUYmwpLEBYWzBdLCR0MAorCXZwc2h1ZmIJJHQyLEBYWzZdLEBYWzZdCisJdnBhZGRxCS0weDYwKCRUYmwpLEBYWzFdLCR0MQorCXZwc2h1ZmIJJHQyLEBYWzddLEBYWzddCisJdnBhZGRxCS0weDQwKCRUYmwpLEBYWzJdLCR0MgorCXZwYWRkcQktMHgyMCgkVGJsKSxAWFszXSwkdDMKKwl2bW92ZHFhCSR0MCwweDAwKCVyc3ApCisJdnBhZGRxCTB4MDAoJFRibCksQFhbNF0sJHQwCisJdm1vdmRxYQkkdDEsMHgyMCglcnNwKQorCXZwYWRkcQkweDIwKCRUYmwpLEBYWzVdLCR0MQorCXZtb3ZkcWEJJHQyLDB4NDAoJXJzcCkKKwl2cGFkZHEJMHg0MCgkVGJsKSxAWFs2XSwkdDIKKwl2bW92ZHFhCSR0MywweDYwKCVyc3ApCisJbGVhCS0kUFVTSDgoJXJzcCksJXJzcAorCXZwYWRkcQkweDYwKCRUYmwpLEBYWzddLCR0MworCXZtb3ZkcWEJJHQwLDB4MDAoJXJzcCkKKwl4b3IJJGExLCRhMQorCXZtb3ZkcWEJJHQxLDB4MjAoJXJzcCkKKwltb3YJJEIsJGEzCisJdm1vdmRxYQkkdDIsMHg0MCglcnNwKQorCXhvcgkkQywkYTMJCQkjIG1hZ2ljCisJdm1vdmRxYQkkdDMsMHg2MCglcnNwKQorCW1vdgkkRiwkYTQKKwlhZGQJXCQxNioyKiRTWiwkVGJsCisJam1wCS5MYXZ4Ml8wMF80NworCisuYWxpZ24JMTYKKy5MYXZ4Ml8wMF80NzoKK19fXworCitzdWIgQVZYMl81MTJfMDBfNDcgKCkgeworbXkgJGogPSBzaGlmdDsKK215ICRib2R5ID0gc2hpZnQ7CitteSBAWCA9IEBfOworbXkgQGluc25zID0gKCYkYm9keSwmJGJvZHkpOwkJCSMgNDggaW5zdHJ1Y3Rpb25zCitteSAkYmFzZSA9ICIrMiokUFVTSDgoJXJzcCkiOworCisJJmxlYQkoIiVyc3AiLCItJFBVU0g4KCVyc3ApIikJaWYgKCgkaiU0KT09MCk7CisJZm9yZWFjaCAoWHVwZGF0ZV81MTJfQVZYKCkpIHsJCSMgMjMgaW5zdHJ1Y3Rpb25zCisJICAgIGV2YWw7CisJICAgIGlmICgkXyAhfiAvXDskLykgeworCQlldmFsKHNoaWZ0KEBpbnNucykpOworCQlldmFsKHNoaWZ0KEBpbnNucykpOworCQlldmFsKHNoaWZ0KEBpbnNucykpOworCSAgICB9CisJfQorCSZ2cGFkZHEJCSgkdDIsQFhbMF0sMTYqMiokai0weDgwLiIoJFRibCkiKTsKKwkgIGZvcmVhY2ggKEBpbnNucykgeyBldmFsOyB9CQkjIHJlbWFpbmluZyBpbnN0cnVjdGlvbnMKKwkmdm1vdmRxYQkoKDMyKiRqKSUkUFVTSDguIiglcnNwKSIsJHQyKTsKK30KKworICAgIGZvciAoJGk9MCwkaj0wOyAkajw4OyAkaisrKSB7CisJJkFWWDJfNTEyXzAwXzQ3KCRqLFwmYm9keXhfMDBfMTUsQFgpOworCXB1c2goQFgsc2hpZnQoQFgpKTsJCQkjIHJvdGF0ZShAWCkKKyAgICB9CisJJmxlYQkoJFRibCwxNioyKiRTWi4iKCRUYmwpIik7CisJJmNtcGIJKCgkU1otMS0weDgwKS4iKCRUYmwpIiwwKTsKKwkmam5lCSgiLkxhdngyXzAwXzQ3Iik7CisKKyAgICBmb3IgKCRpPTA7ICRpPDE2OyApIHsKKwlteSAkYmFzZT0kaTw4PyIrJFBVU0g4KCVyc3ApIjoiKCVyc3ApIjsKKwlmb3JlYWNoKGJvZHl4XzAwXzE1KCkpIHsgZXZhbDsgfQorICAgIH0KK30KKyRjb2RlLj08PF9fXzsKKwltb3YJYDIqJFNaKiRyb3VuZHNgKCVyc3ApLCRjdHgJIyAkX2N0eAorCWFkZAkkYTEsJEEKKwkjbW92CWAyKiRTWiokcm91bmRzKzhgKCVyc3ApLCRpbnAJIyAkX2lucAorCWxlYQlgMiokU1oqKCRyb3VuZHMtOClgKCVyc3ApLCRUYmwKKworCWFkZAkkU1oqMCgkY3R4KSwkQQorCWFkZAkkU1oqMSgkY3R4KSwkQgorCWFkZAkkU1oqMigkY3R4KSwkQworCWFkZAkkU1oqMygkY3R4KSwkRAorCWFkZAkkU1oqNCgkY3R4KSwkRQorCWFkZAkkU1oqNSgkY3R4KSwkRgorCWFkZAkkU1oqNigkY3R4KSwkRworCWFkZAkkU1oqNygkY3R4KSwkSAorCisJbW92CSRBLCRTWiowKCRjdHgpCisJbW92CSRCLCRTWioxKCRjdHgpCisJbW92CSRDLCRTWioyKCRjdHgpCisJbW92CSRELCRTWiozKCRjdHgpCisJbW92CSRFLCRTWio0KCRjdHgpCisJbW92CSRGLCRTWio1KCRjdHgpCisJbW92CSRHLCRTWio2KCRjdHgpCisJbW92CSRILCRTWio3KCRjdHgpCisKKwljbXAJYCRQVVNIOCsyKjhgKCRUYmwpLCRpbnAJIyAkX2VuZAorCWplCS5MZG9uZV9hdngyCisKKwl4b3IJJGExLCRhMQorCW1vdgkkQiwkYTMKKwl4b3IJJEMsJGEzCQkJIyBtYWdpYworCW1vdgkkRiwkYTQKKwlqbXAJLkxvd2VyX2F2eDIKKy5hbGlnbgkxNgorLkxvd2VyX2F2eDI6CitfX18KKyAgICBmb3IgKCRpPTA7ICRpPDg7ICkgeworCW15ICRiYXNlPSIrMTYoJFRibCkiOworCWZvcmVhY2goYm9keXhfMDBfMTUoKSkgeyBldmFsOyB9CisgICAgfQorJGNvZGUuPTw8X19fOworCWxlYQktJFBVU0g4KCRUYmwpLCRUYmwKKwljbXAJJXJzcCwkVGJsCisJamFlCS5Mb3dlcl9hdngyCisKKwltb3YJYDIqJFNaKiRyb3VuZHNgKCVyc3ApLCRjdHgJIyAkX2N0eAorCWFkZAkkYTEsJEEKKwkjbW92CWAyKiRTWiokcm91bmRzKzhgKCVyc3ApLCRpbnAJIyAkX2lucAorCWxlYQlgMiokU1oqKCRyb3VuZHMtOClgKCVyc3ApLCVyc3AKKworCWFkZAkkU1oqMCgkY3R4KSwkQQorCWFkZAkkU1oqMSgkY3R4KSwkQgorCWFkZAkkU1oqMigkY3R4KSwkQworCWFkZAkkU1oqMygkY3R4KSwkRAorCWFkZAkkU1oqNCgkY3R4KSwkRQorCWFkZAkkU1oqNSgkY3R4KSwkRgorCWxlYQlgMioxNiokU1pgKCRpbnApLCRpbnAJIyBpbnArPTIKKwlhZGQJJFNaKjYoJGN0eCksJEcKKwltb3YJJGlucCwlcjEyCisJYWRkCSRTWio3KCRjdHgpLCRICisJY21wCSRfZW5kLCRpbnAKKworCW1vdgkkQSwkU1oqMCgkY3R4KQorCWNtb3ZlCSVyc3AsJXIxMgkJIyBuZXh0IGJsb2NrIG9yIHN0YWxlIGRhdGEKKwltb3YJJEIsJFNaKjEoJGN0eCkKKwltb3YJJEMsJFNaKjIoJGN0eCkKKwltb3YJJEQsJFNaKjMoJGN0eCkKKwltb3YJJEUsJFNaKjQoJGN0eCkKKwltb3YJJEYsJFNaKjUoJGN0eCkKKwltb3YJJEcsJFNaKjYoJGN0eCkKKwltb3YJJEgsJFNaKjcoJGN0eCkKKworCWpiZQkuTG9vcF9hdngyCisJbGVhCSglcnNwKSwkVGJsCisKKy5MZG9uZV9hdngyOgorCWxlYQkoJFRibCksJXJzcAorCW1vdgkkX3JzcCwlcnNpCisJdnplcm91cHBlcgorX19fCiskY29kZS49PDxfX18gaWYgKCR3aW42NCk7CisJbW92YXBzCTE2KiRTWiszMiglcnNwKSwleG1tNgorCW1vdmFwcwkxNiokU1orNDgoJXJzcCksJXhtbTcKKwltb3ZhcHMJMTYqJFNaKzY0KCVyc3ApLCV4bW04CisJbW92YXBzCTE2KiRTWis4MCglcnNwKSwleG1tOQorX19fCiskY29kZS49PDxfX18gaWYgKCR3aW42NCAmJiAkU1o+NCk7CisJbW92YXBzCTE2KiRTWis5NiglcnNwKSwleG1tMTAKKwltb3ZhcHMJMTYqJFNaKzExMiglcnNwKSwleG1tMTEKK19fXworJGNvZGUuPTw8X19fOworCW1vdgkoJXJzaSksJXIxNQorCW1vdgk4KCVyc2kpLCVyMTQKKwltb3YJMTYoJXJzaSksJXIxMworCW1vdgkyNCglcnNpKSwlcjEyCisJbW92CTMyKCVyc2kpLCVyYnAKKwltb3YJNDAoJXJzaSksJXJieAorCWxlYQk0OCglcnNpKSwlcnNwCisuTGVwaWxvZ3VlX2F2eDI6CisJcmV0Cisuc2l6ZQkke2Z1bmN9X2F2eDIsLi0ke2Z1bmN9X2F2eDIKK19fXworfX0KK319fX19CisKKyMgRVhDRVBUSU9OX0RJU1BPU0lUSU9OIGhhbmRsZXIgKEVYQ0VQVElPTl9SRUNPUkQgKnJlYyxVTE9ORzY0IGZyYW1lLAorIwkJQ09OVEVYVCAqY29udGV4dCxESVNQQVRDSEVSX0NPTlRFWFQgKmRpc3ApCitpZiAoJHdpbjY0KSB7CiskcmVjPSIlcmN4IjsKKyRmcmFtZT0iJXJkeCI7CiskY29udGV4dD0iJXI4IjsKKyRkaXNwPSIlcjkiOworCiskY29kZS49PDxfX187CisuZXh0ZXJuCV9faW1wX1J0bFZpcnR1YWxVbndpbmQKKy50eXBlCXNlX2hhbmRsZXIsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2CitzZV9oYW5kbGVyOgorCXB1c2gJJXJzaQorCXB1c2gJJXJkaQorCXB1c2gJJXJieAorCXB1c2gJJXJicAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCXB1c2gJJXIxNQorCXB1c2hmcQorCXN1YglcJDY0LCVyc3AKKworCW1vdgkxMjAoJGNvbnRleHQpLCVyYXgJIyBwdWxsIGNvbnRleHQtPlJheAorCW1vdgkyNDgoJGNvbnRleHQpLCVyYngJIyBwdWxsIGNvbnRleHQtPlJpcAorCisJbW92CTgoJGRpc3ApLCVyc2kJCSMgZGlzcC0+SW1hZ2VCYXNlCisJbW92CTU2KCRkaXNwKSwlcjExCQkjIGRpc3AtPkhhbmRlcmxEYXRhCisKKwltb3YJMCglcjExKSwlcjEwZAkJIyBIYW5kbGVyRGF0YVswXQorCWxlYQkoJXJzaSwlcjEwKSwlcjEwCSMgcHJvbG9ndWUgbGFiZWwKKwljbXAJJXIxMCwlcmJ4CQkjIGNvbnRleHQtPlJpcDxwcm9sb2d1ZSBsYWJlbAorCWpiCS5MaW5fcHJvbG9ndWUKKworCW1vdgkxNTIoJGNvbnRleHQpLCVyYXgJIyBwdWxsIGNvbnRleHQtPlJzcAorCisJbW92CTQoJXIxMSksJXIxMGQJCSMgSGFuZGxlckRhdGFbMV0KKwlsZWEJKCVyc2ksJXIxMCksJXIxMAkjIGVwaWxvZ3VlIGxhYmVsCisJY21wCSVyMTAsJXJieAkJIyBjb250ZXh0LT5SaXA+PWVwaWxvZ3VlIGxhYmVsCisJamFlCS5MaW5fcHJvbG9ndWUKK19fXworJGNvZGUuPTw8X19fIGlmICgkYXZ4PjEpOworCWxlYQkuTGF2eDJfc2hvcnRjdXQoJXJpcCksJXIxMAorCWNtcAklcjEwLCVyYngJCSMgY29udGV4dC0+UmlwPGF2eDJfc2hvcnRjdXQKKwlqYgkuTG5vdF9pbl9hdngyCisKKwlhbmQJXCQtMjU2KiRTWiwlcmF4CisJYWRkCVwkYDIqJFNaKigkcm91bmRzLTgpYCwlcmF4CisuTG5vdF9pbl9hdngyOgorX19fCiskY29kZS49PDxfX187CisJbW92CSVyYXgsJXJzaQkJIyBwdXQgYXNpZGUgUnNwCisJbW92CTE2KiRTWiszKjgoJXJheCksJXJheAkjIHB1bGwgJF9yc3AKKwlsZWEJNDgoJXJheCksJXJheAorCisJbW92CS04KCVyYXgpLCVyYngKKwltb3YJLTE2KCVyYXgpLCVyYnAKKwltb3YJLTI0KCVyYXgpLCVyMTIKKwltb3YJLTMyKCVyYXgpLCVyMTMKKwltb3YJLTQwKCVyYXgpLCVyMTQKKwltb3YJLTQ4KCVyYXgpLCVyMTUKKwltb3YJJXJieCwxNDQoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SYngKKwltb3YJJXJicCwxNjAoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SYnAKKwltb3YJJXIxMiwyMTYoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SMTIKKwltb3YJJXIxMywyMjQoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SMTMKKwltb3YJJXIxNCwyMzIoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SMTQKKwltb3YJJXIxNSwyNDAoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SMTUKKworCWxlYQkuTGVwaWxvZ3VlKCVyaXApLCVyMTAKKwljbXAJJXIxMCwlcmJ4CisJamIJLkxpbl9wcm9sb2d1ZQkJIyBub24tQVZYIGNvZGUKKworCWxlYQkxNiokU1orNCo4KCVyc2kpLCVyc2kJIyBYbW02LSBzYXZlIGFyZWEKKwlsZWEJNTEyKCRjb250ZXh0KSwlcmRpCSMgJmNvbnRleHQuWG1tNgorCW1vdglcJGAkU1o9PTQ/ODoxMmAsJWVjeAorCS5sb25nCTB4YTU0OGYzZmMJCSMgY2xkOyByZXAgbW92c3EKKworLkxpbl9wcm9sb2d1ZToKKwltb3YJOCglcmF4KSwlcmRpCisJbW92CTE2KCVyYXgpLCVyc2kKKwltb3YJJXJheCwxNTIoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5Sc3AKKwltb3YJJXJzaSwxNjgoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5Sc2kKKwltb3YJJXJkaSwxNzYoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SZGkKKworCW1vdgk0MCgkZGlzcCksJXJkaQkJIyBkaXNwLT5Db250ZXh0UmVjb3JkCisJbW92CSRjb250ZXh0LCVyc2kJCSMgY29udGV4dAorCW1vdglcJDE1NCwlZWN4CQkjIHNpemVvZihDT05URVhUKQorCS5sb25nCTB4YTU0OGYzZmMJCSMgY2xkOyByZXAgbW92c3EKKworCW1vdgkkZGlzcCwlcnNpCisJeG9yCSVyY3gsJXJjeAkJIyBhcmcxLCBVTldfRkxBR19OSEFORExFUgorCW1vdgk4KCVyc2kpLCVyZHgJCSMgYXJnMiwgZGlzcC0+SW1hZ2VCYXNlCisJbW92CTAoJXJzaSksJXI4CQkjIGFyZzMsIGRpc3AtPkNvbnRyb2xQYworCW1vdgkxNiglcnNpKSwlcjkJCSMgYXJnNCwgZGlzcC0+RnVuY3Rpb25FbnRyeQorCW1vdgk0MCglcnNpKSwlcjEwCQkjIGRpc3AtPkNvbnRleHRSZWNvcmQKKwlsZWEJNTYoJXJzaSksJXIxMQkJIyAmZGlzcC0+SGFuZGxlckRhdGEKKwlsZWEJMjQoJXJzaSksJXIxMgkJIyAmZGlzcC0+RXN0YWJsaXNoZXJGcmFtZQorCW1vdgklcjEwLDMyKCVyc3ApCQkjIGFyZzUKKwltb3YJJXIxMSw0MCglcnNwKQkJIyBhcmc2CisJbW92CSVyMTIsNDgoJXJzcCkJCSMgYXJnNworCW1vdgklcmN4LDU2KCVyc3ApCQkjIGFyZzgsIChOVUxMKQorCWNhbGwJKl9faW1wX1J0bFZpcnR1YWxVbndpbmQoJXJpcCkKKworCW1vdglcJDEsJWVheAkJIyBFeGNlcHRpb25Db250aW51ZVNlYXJjaAorCWFkZAlcJDY0LCVyc3AKKwlwb3BmcQorCXBvcAklcjE1CisJcG9wCSVyMTQKKwlwb3AJJXIxMworCXBvcAklcjEyCisJcG9wCSVyYnAKKwlwb3AJJXJieAorCXBvcAklcmRpCisJcG9wCSVyc2kKKwlyZXQKKy5zaXplCXNlX2hhbmRsZXIsLi1zZV9oYW5kbGVyCisKKy5zZWN0aW9uCS5wZGF0YQorLmFsaWduCTQKKwkucnZhCS5MU0VIX2JlZ2luXyRmdW5jCisJLnJ2YQkuTFNFSF9lbmRfJGZ1bmMKKwkucnZhCS5MU0VIX2luZm9fJGZ1bmMKK19fXworJGNvZGUuPTw8X19fIGlmICgkU1o9PTQpOworCS5ydmEJLkxTRUhfYmVnaW5fJHtmdW5jfV9zc3NlMworCS5ydmEJLkxTRUhfZW5kXyR7ZnVuY31fc3NzZTMKKwkucnZhCS5MU0VIX2luZm9fJHtmdW5jfV9zc3NlMworX19fCiskY29kZS49PDxfX18gaWYgKCRhdnggJiYgJFNaPT04KTsKKwkucnZhCS5MU0VIX2JlZ2luXyR7ZnVuY31feG9wCisJLnJ2YQkuTFNFSF9lbmRfJHtmdW5jfV94b3AKKwkucnZhCS5MU0VIX2luZm9fJHtmdW5jfV94b3AKK19fXworJGNvZGUuPTw8X19fIGlmICgkYXZ4KTsKKwkucnZhCS5MU0VIX2JlZ2luXyR7ZnVuY31fYXZ4CisJLnJ2YQkuTFNFSF9lbmRfJHtmdW5jfV9hdngKKwkucnZhCS5MU0VIX2luZm9fJHtmdW5jfV9hdngKK19fXworJGNvZGUuPTw8X19fIGlmICgkYXZ4PjEpOworCS5ydmEJLkxTRUhfYmVnaW5fJHtmdW5jfV9hdngyCisJLnJ2YQkuTFNFSF9lbmRfJHtmdW5jfV9hdngyCisJLnJ2YQkuTFNFSF9pbmZvXyR7ZnVuY31fYXZ4MgorX19fCiskY29kZS49PDxfX187Cisuc2VjdGlvbgkueGRhdGEKKy5hbGlnbgk4CisuTFNFSF9pbmZvXyRmdW5jOgorCS5ieXRlCTksMCwwLDAKKwkucnZhCXNlX2hhbmRsZXIKKwkucnZhCS5McHJvbG9ndWUsLkxlcGlsb2d1ZQkJCSMgSGFuZGxlckRhdGFbXQorX19fCiskY29kZS49PDxfX18gaWYgKCRTWj09NCk7CisuTFNFSF9pbmZvXyR7ZnVuY31fc3NzZTM6CisJLmJ5dGUJOSwwLDAsMAorCS5ydmEJc2VfaGFuZGxlcgorCS5ydmEJLkxwcm9sb2d1ZV9zc3NlMywuTGVwaWxvZ3VlX3Nzc2UzCSMgSGFuZGxlckRhdGFbXQorX19fCiskY29kZS49PDxfX18gaWYgKCRhdnggJiYgJFNaPT04KTsKKy5MU0VIX2luZm9fJHtmdW5jfV94b3A6CisJLmJ5dGUJOSwwLDAsMAorCS5ydmEJc2VfaGFuZGxlcgorCS5ydmEJLkxwcm9sb2d1ZV94b3AsLkxlcGlsb2d1ZV94b3AJCSMgSGFuZGxlckRhdGFbXQorX19fCiskY29kZS49PDxfX18gaWYgKCRhdngpOworLkxTRUhfaW5mb18ke2Z1bmN9X2F2eDoKKwkuYnl0ZQk5LDAsMCwwCisJLnJ2YQlzZV9oYW5kbGVyCisJLnJ2YQkuTHByb2xvZ3VlX2F2eCwuTGVwaWxvZ3VlX2F2eAkJIyBIYW5kbGVyRGF0YVtdCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJGF2eD4xKTsKKy5MU0VIX2luZm9fJHtmdW5jfV9hdngyOgorCS5ieXRlCTksMCwwLDAKKwkucnZhCXNlX2hhbmRsZXIKKwkucnZhCS5McHJvbG9ndWVfYXZ4MiwuTGVwaWxvZ3VlX2F2eDIJCSMgSGFuZGxlckRhdGFbXQorX19fCit9CisKKyRjb2RlID1+IHMvXGAoW15cYF0qKVxgL2V2YWwgJDEvZ2VtOworcHJpbnQgJGNvZGU7CitjbG9zZSBTVERPVVQ7CmRpZmYgLS1naXQgYS9jcnlwdG8vc2hhL3NoYS5oIGIvY3J5cHRvL3NoYS9zaGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWRhMjg0Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3NoYS9zaGEuaApAQCAtMCwwICsxLDIzNyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2lmbmRlZiBPUEVOU1NMX0hFQURFUl9TSEFfSAorI2RlZmluZSBPUEVOU1NMX0hFQURFUl9TSEFfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9iYXNlLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBTSEEtMS4gKi8KKworCisvKiBTSEFfQ0JMT0NLIGlzIHRoZSBibG9jayBzaXplIG9mIFNIQS0xLiAqLworI2RlZmluZSBTSEFfQ0JMT0NLIDY0CisKKy8qIFNIQV9ESUdFU1RfTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgYSBTSEEtMSBkaWdlc3QuICovCisjZGVmaW5lIFNIQV9ESUdFU1RfTEVOR1RIIDIwCisKKy8qIFRPRE8oZm9yayk6IHJlbW92ZSAqLworI2RlZmluZSBTSEFfTEJMT0NLIDE2CisjZGVmaW5lIFNIQV9MT05HIHVpbnQzMl90CisKKy8qIFNIQTFfSW5pdCBpbml0aWFsaXNlcyB8c2hhfCBhbmQgcmV0dXJucyBvbmUuICovCitpbnQgU0hBMV9Jbml0KFNIQV9DVFggKnNoYSk7CisKKy8qIFNIQTFfVXBkYXRlIGFkZHMgfGxlbnwgYnl0ZXMgZnJvbSB8ZGF0YXwgdG8gfHNoYXwgYW5kIHJldHVybnMgb25lLiAqLworaW50IFNIQTFfVXBkYXRlKFNIQV9DVFggKnNoYSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbik7CisKKy8qIFNIQTFfRmluYWwgYWRkcyB0aGUgZmluYWwgcGFkZGluZyB0byB8c2hhfCBhbmQgd3JpdGVzIHRoZSByZXN1bHRpbmcgZGlnZXN0CisgKiB0byB8bWR8LCB3aGljaCBtdXN0IGhhdmUgYXQgbGVhc3QgfFNIQV9ESUdFU1RfTEVOR1RIfCBieXRlcyBvZiBzcGFjZS4gSXQKKyAqIHJldHVybnMgb25lLiAqLworaW50IFNIQTFfRmluYWwodWludDhfdCAqbWQsIFNIQV9DVFggKnNoYSk7CisKKy8qIFNIQTEgd3JpdGVzIHRoZSBkaWdlc3Qgb2YgfGxlbnwgYnl0ZXMgZnJvbSB8ZGF0YXwgdG8gfG91dHwgYW5kIHJldHVybnMKKyAqIHxvdXR8LiBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IHxTSEFfRElHRVNUX0xFTkdUSHwgYnl0ZXMgb2Ygc3BhY2UgaW4KKyAqIHxvdXR8LiAqLwordWludDhfdCAqU0hBMShjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgbGVuLCB1aW50OF90ICpvdXQpOworCisvKiBTSEExX1RyYW5zZm9ybSBpcyBhIGxvdy1sZXZlbCBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgc2luZ2xlLCBTSEEtMSBibG9jaworICogdHJhbnNmb3JtYXRpb24gdXNpbmcgdGhlIHN0YXRlIGZyb20gfHNoYXwgYW5kIDY0IGJ5dGVzIGZyb20gfGJsb2NrfC4gKi8KK3ZvaWQgU0hBMV9UcmFuc2Zvcm0oU0hBX0NUWCAqc2hhLCBjb25zdCB1aW50OF90ICpibG9jayk7CisKK3N0cnVjdCBzaGFfc3RhdGVfc3QgeworICB1aW50MzJfdCBoMCwgaDEsIGgyLCBoMywgaDQ7CisgIHVpbnQzMl90IE5sLCBOaDsKKyAgdWludDMyX3QgZGF0YVsxNl07CisgIHVuc2lnbmVkIGludCBudW07Cit9OworCisKKy8qIFNIQS0yMjQuICovCisKKy8qIFNIQTIyNF9DQkxPQ0sgaXMgdGhlIGJsb2NrIHNpemUgb2YgU0hBLTIyNC4gKi8KKyNkZWZpbmUgU0hBMjI0X0NCTE9DSyA2NAorCisvKiBTSEEyMjRfRElHRVNUX0xFTkdUSCBpcyB0aGUgbGVuZ3RoIG9mIGEgU0hBLTIyNCBkaWdlc3QuICovCisjZGVmaW5lIFNIQTIyNF9ESUdFU1RfTEVOR1RIIDI4CisKKy8qIFNIQTIyNF9Jbml0IGluaXRpYWxpc2VzIHxzaGF8IGFuZCByZXR1cm5zIDEuICovCitpbnQgU0hBMjI0X0luaXQoU0hBMjU2X0NUWCAqc2hhKTsKKworLyogU0hBMjI0X1VwZGF0ZSBhZGRzIHxsZW58IGJ5dGVzIGZyb20gfGRhdGF8IHRvIHxzaGF8LiAqLworaW50IFNIQTIyNF9VcGRhdGUoU0hBMjU2X0NUWCAqc2hhLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKTsKKworLyogU0hBMjI0X0ZpbmFsIGFkZHMgdGhlIGZpbmFsIHBhZGRpbmcgdG8gfHNoYXwgYW5kIHdyaXRlcyB0aGUgcmVzdWx0aW5nIGRpZ2VzdAorICogdG8gfG1kfCwgd2hpY2ggbXVzdCBoYXZlIGF0IGxlYXN0IHxTSEFfRElHRVNUX0xFTkdUSHwgYnl0ZXMgb2Ygc3BhY2UuICovCitpbnQgU0hBMjI0X0ZpbmFsKHVpbnQ4X3QgKm1kLCBTSEEyNTZfQ1RYICpzaGEpOworCisvKiBTSEEyMjQgd3JpdGVzIHRoZSBkaWdlc3Qgb2YgfGxlbnwgYnl0ZXMgZnJvbSB8ZGF0YXwgdG8gfG91dHwgYW5kIHJldHVybnMKKyAqIHxvdXR8LiBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IHxTSEFfRElHRVNUX0xFTkdUSHwgYnl0ZXMgb2Ygc3BhY2UgaW4KKyAqIHxvdXR8LiAqLwordWludDhfdCAqU0hBMjI0KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBsZW4sIHVpbnQ4X3QgKm91dCk7CisKKworLyogU0hBLTI1Ni4gKi8KKworLyogU0hBMjU2X0NCTE9DSyBpcyB0aGUgYmxvY2sgc2l6ZSBvZiBTSEEtMjU2LiAqLworI2RlZmluZSBTSEEyNTZfQ0JMT0NLIDY0CisKKy8qIFNIQTI1Nl9ESUdFU1RfTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgYSBTSEEtMjU2IGRpZ2VzdC4gKi8KKyNkZWZpbmUgU0hBMjU2X0RJR0VTVF9MRU5HVEggMzIKKworLyogU0hBMjU2X0luaXQgaW5pdGlhbGlzZXMgfHNoYXwgYW5kIHJldHVybnMgMS4gKi8KK2ludCBTSEEyNTZfSW5pdChTSEEyNTZfQ1RYICpzaGEpOworCisvKiBTSEEyNTZfVXBkYXRlIGFkZHMgfGxlbnwgYnl0ZXMgZnJvbSB8ZGF0YXwgdG8gfHNoYXwuICovCitpbnQgU0hBMjU2X1VwZGF0ZShTSEEyNTZfQ1RYICpzaGEsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pOworCisvKiBTSEEyNTZfRmluYWwgYWRkcyB0aGUgZmluYWwgcGFkZGluZyB0byB8c2hhfCBhbmQgd3JpdGVzIHRoZSByZXN1bHRpbmcgZGlnZXN0CisgKiB0byB8bWR8LCB3aGljaCBtdXN0IGhhdmUgYXQgbGVhc3QgfFNIQV9ESUdFU1RfTEVOR1RIfCBieXRlcyBvZiBzcGFjZS4gKi8KK2ludCBTSEEyNTZfRmluYWwodWludDhfdCAqbWQsIFNIQTI1Nl9DVFggKnNoYSk7CisKKy8qIFNIQTI1NiB3cml0ZXMgdGhlIGRpZ2VzdCBvZiB8bGVufCBieXRlcyBmcm9tIHxkYXRhfCB0byB8b3V0fCBhbmQgcmV0dXJucworICogfG91dHwuIFRoZXJlIG11c3QgYmUgYXQgbGVhc3QgfFNIQV9ESUdFU1RfTEVOR1RIfCBieXRlcyBvZiBzcGFjZSBpbgorICogfG91dHwuICovCit1aW50OF90ICpTSEEyNTYoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGxlbiAsdWludDhfdCAqb3V0KTsKKworLyogU0hBMjU2X1RyYW5zZm9ybSBpcyBhIGxvdy1sZXZlbCBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgc2luZ2xlLCBTSEEtMSBibG9jaworICogdHJhbnNmb3JtYXRpb24gdXNpbmcgdGhlIHN0YXRlIGZyb20gfHNoYXwgYW5kIDY0IGJ5dGVzIGZyb20gfGJsb2NrfC4gKi8KK3ZvaWQgU0hBMjU2X1RyYW5zZm9ybShTSEEyNTZfQ1RYICpzaGEsIGNvbnN0IHVpbnQ4X3QgKmRhdGEpOworCitzdHJ1Y3Qgc2hhMjU2X3N0YXRlX3N0IHsKKyAgdWludDMyX3QgaFs4XTsKKyAgdWludDMyX3QgTmwsIE5oOworICB1aW50MzJfdCBkYXRhWzE2XTsKKyAgdW5zaWduZWQgaW50IG51bSwgbWRfbGVuOworfTsKKworCisvKiBTSEEtMzg0LiAqLworCisvKiBTSEEzODRfQ0JMT0NLIGlzIHRoZSBibG9jayBzaXplIG9mIFNIQS0zODQuICovCisjZGVmaW5lIFNIQTM4NF9DQkxPQ0sgMTI4CisKKy8qIFNIQTM4NF9ESUdFU1RfTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgYSBTSEEtMzg0IGRpZ2VzdC4gKi8KKyNkZWZpbmUgU0hBMzg0X0RJR0VTVF9MRU5HVEggNDgKKworLyogU0hBMzg0X0luaXQgaW5pdGlhbGlzZXMgfHNoYXwgYW5kIHJldHVybnMgMS4gKi8KK2ludCBTSEEzODRfSW5pdChTSEE1MTJfQ1RYICpzaGEpOworCisvKiBTSEEzODRfVXBkYXRlIGFkZHMgfGxlbnwgYnl0ZXMgZnJvbSB8ZGF0YXwgdG8gfHNoYXwuICovCitpbnQgU0hBMzg0X1VwZGF0ZShTSEE1MTJfQ1RYICpzaGEsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pOworCisvKiBTSEEzODRfRmluYWwgYWRkcyB0aGUgZmluYWwgcGFkZGluZyB0byB8c2hhfCBhbmQgd3JpdGVzIHRoZSByZXN1bHRpbmcgZGlnZXN0CisgKiB0byB8bWR8LCB3aGljaCBtdXN0IGhhdmUgYXQgbGVhc3QgfFNIQV9ESUdFU1RfTEVOR1RIfCBieXRlcyBvZiBzcGFjZS4gKi8KK2ludCBTSEEzODRfRmluYWwodWludDhfdCAqbWQsIFNIQTUxMl9DVFggKnNoYSk7CisKKy8qIFNIQTM4NCB3cml0ZXMgdGhlIGRpZ2VzdCBvZiB8bGVufCBieXRlcyBmcm9tIHxkYXRhfCB0byB8b3V0fCBhbmQgcmV0dXJucworICogfG91dHwuIFRoZXJlIG11c3QgYmUgYXQgbGVhc3QgfFNIQV9ESUdFU1RfTEVOR1RIfCBieXRlcyBvZiBzcGFjZSBpbgorICogfG91dHwuICovCit1aW50OF90ICpTSEEzODQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGxlbiAsdWludDhfdCAqb3V0KTsKKworLyogU0hBMzg0X1RyYW5zZm9ybSBpcyBhIGxvdy1sZXZlbCBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgc2luZ2xlLCBTSEEtMSBibG9jaworICogdHJhbnNmb3JtYXRpb24gdXNpbmcgdGhlIHN0YXRlIGZyb20gfHNoYXwgYW5kIDY0IGJ5dGVzIGZyb20gfGJsb2NrfC4gKi8KK3ZvaWQgU0hBMzg0X1RyYW5zZm9ybShTSEE1MTJfQ1RYICpzaGEsIGNvbnN0IHVpbnQ4X3QgKmRhdGEpOworCisKKy8qIFNIQS01MTIuICovCisKKy8qIFNIQTUxMl9DQkxPQ0sgaXMgdGhlIGJsb2NrIHNpemUgb2YgU0hBLTUxMi4gKi8KKyNkZWZpbmUgU0hBNTEyX0NCTE9DSyAxMjgKKworLyogU0hBNTEyX0RJR0VTVF9MRU5HVEggaXMgdGhlIGxlbmd0aCBvZiBhIFNIQS01MTIgZGlnZXN0LiAqLworI2RlZmluZSBTSEE1MTJfRElHRVNUX0xFTkdUSCA2NAorCisvKiBTSEE1MTJfSW5pdCBpbml0aWFsaXNlcyB8c2hhfCBhbmQgcmV0dXJucyAxLiAqLworaW50IFNIQTUxMl9Jbml0KFNIQTUxMl9DVFggKnNoYSk7CisKKy8qIFNIQTUxMl9VcGRhdGUgYWRkcyB8bGVufCBieXRlcyBmcm9tIHxkYXRhfCB0byB8c2hhfC4gKi8KK2ludCBTSEE1MTJfVXBkYXRlKFNIQTUxMl9DVFggKnNoYSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbik7CisKKy8qIFNIQTUxMl9GaW5hbCBhZGRzIHRoZSBmaW5hbCBwYWRkaW5nIHRvIHxzaGF8IGFuZCB3cml0ZXMgdGhlIHJlc3VsdGluZyBkaWdlc3QKKyAqIHRvIHxtZHwsIHdoaWNoIG11c3QgaGF2ZSBhdCBsZWFzdCB8U0hBX0RJR0VTVF9MRU5HVEh8IGJ5dGVzIG9mIHNwYWNlLiAqLworaW50IFNIQTUxMl9GaW5hbCh1aW50OF90ICptZCwgU0hBNTEyX0NUWCAqc2hhKTsKKworLyogU0hBNTEyIHdyaXRlcyB0aGUgZGlnZXN0IG9mIHxsZW58IGJ5dGVzIGZyb20gfGRhdGF8IHRvIHxvdXR8IGFuZCByZXR1cm5zCisgKiB8b3V0fC4gVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCB8U0hBX0RJR0VTVF9MRU5HVEh8IGJ5dGVzIG9mIHNwYWNlIGluCisgKiB8b3V0fC4gKi8KK3VpbnQ4X3QgKlNIQTUxMihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgbGVuICx1aW50OF90ICpvdXQpOworCisvKiBTSEE1MTJfVHJhbnNmb3JtIGlzIGEgbG93LWxldmVsIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYSBzaW5nbGUsIFNIQS0xIGJsb2NrCisgKiB0cmFuc2Zvcm1hdGlvbiB1c2luZyB0aGUgc3RhdGUgZnJvbSB8c2hhfCBhbmQgNjQgYnl0ZXMgZnJvbSB8YmxvY2t8LiAqLwordm9pZCBTSEE1MTJfVHJhbnNmb3JtKFNIQTUxMl9DVFggKnNoYSwgY29uc3QgdWludDhfdCAqZGF0YSk7CisKK3N0cnVjdCBzaGE1MTJfc3RhdGVfc3QgeworICB1aW50NjRfdCBoWzhdOworICB1aW50NjRfdCBObCwgTmg7CisgIHVuaW9uIHsKKyAgICB1aW50NjRfdCBkWzE2XTsKKyAgICB1aW50OF90IHBbNjRdOworICB9IHU7CisgIHVuc2lnbmVkIGludCBudW0sIG1kX2xlbjsKK307CisKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9ICAvKiBleHRlcm4gQyAqLworI2VuZGlmCisKKyNlbmRpZiAgLyogT1BFTlNTTF9IRUFERVJfU0hBX0ggKi8KZGlmZiAtLWdpdCBhL2NyeXB0by9zaGEvc2hhMS5jIGIvY3J5cHRvL3NoYS9zaGExLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE0ODczOQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9zaGEvc2hhMS5jCkBAIC0wLDAgKzEsMzc5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9zaGEuaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKworCisjaWYgIWRlZmluZWQoT1BFTlNTTF9OT19BU00pICYmIFwKKyAgICAoZGVmaW5lZChPUEVOU1NMX1g4NikgfHwgZGVmaW5lZChPUEVOU1NMX1g4Nl82NCkgfHwgZGVmaW5lZChPUEVOU1NMX0FSTSkpCisjZGVmaW5lIFNIQTFfQVNNCisjZW5kaWYKKworaW50IFNIQTFfSW5pdChTSEFfQ1RYICpzaGEpIHsKKyAgbWVtc2V0KHNoYSwgMCwgc2l6ZW9mKFNIQV9DVFgpKTsKKyAgc2hhLT5oMCA9IDB4Njc0NTIzMDFVTDsKKyAgc2hhLT5oMSA9IDB4ZWZjZGFiODlVTDsKKyAgc2hhLT5oMiA9IDB4OThiYWRjZmVVTDsKKyAgc2hhLT5oMyA9IDB4MTAzMjU0NzZVTDsKKyAgc2hhLT5oNCA9IDB4YzNkMmUxZjBVTDsKKyAgcmV0dXJuIDE7Cit9CisKK3VpbnQ4X3QgKlNIQTEoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGxlbiwgdWludDhfdCAqb3V0KSB7CisgIFNIQV9DVFggY3R4OworICBzdGF0aWMgdWludDhfdCBidWZbU0hBX0RJR0VTVF9MRU5HVEhdOworCisgIC8qIFRPRE8oZm9yayk6IHJlbW92ZSB0aGlzIHN0YXRpYyBidWZmZXIuICovCisgIGlmIChvdXQgPT0gTlVMTCkgeworICAgIG91dCA9IGJ1ZjsKKyAgfQorICBpZiAoIVNIQTFfSW5pdCgmY3R4KSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIFNIQTFfVXBkYXRlKCZjdHgsIGRhdGEsIGxlbik7CisgIFNIQTFfRmluYWwob3V0LCAmY3R4KTsKKyAgT1BFTlNTTF9jbGVhbnNlKCZjdHgsIHNpemVvZihjdHgpKTsKKyAgcmV0dXJuIG91dDsKK30KKworI2RlZmluZSBEQVRBX09SREVSX0lTX0JJR19FTkRJQU4KKworI2RlZmluZSBIQVNIX0xPTkcgICAgICAgICAgICAgICB1aW50MzJfdAorI2RlZmluZSBIQVNIX0NUWCAgICAgICAgICAgICAgICBTSEFfQ1RYCisjZGVmaW5lIEhBU0hfQ0JMT0NLICAgICAgICAgICAgIDY0CisjZGVmaW5lIEhBU0hfTUFLRV9TVFJJTkcoYywgcykgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1bnNpZ25lZCBsb25nIGxsOyAgICAgICAgICBcCisgICAgbGwgPSAoYyktPmgwOyAgICAgICAgICAgICAgXAorICAgICh2b2lkKSBIT1NUX2wyYyhsbCwgKHMpKTsgIFwKKyAgICBsbCA9IChjKS0+aDE7ICAgICAgICAgICAgICBcCisgICAgKHZvaWQpIEhPU1RfbDJjKGxsLCAocykpOyAgXAorICAgIGxsID0gKGMpLT5oMjsgICAgICAgICAgICAgIFwKKyAgICAodm9pZCkgSE9TVF9sMmMobGwsIChzKSk7ICBcCisgICAgbGwgPSAoYyktPmgzOyAgICAgICAgICAgICAgXAorICAgICh2b2lkKSBIT1NUX2wyYyhsbCwgKHMpKTsgIFwKKyAgICBsbCA9IChjKS0+aDQ7ICAgICAgICAgICAgICBcCisgICAgKHZvaWQpIEhPU1RfbDJjKGxsLCAocykpOyAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIEhBU0hfVVBEQVRFIFNIQTFfVXBkYXRlCisjZGVmaW5lIEhBU0hfVFJBTlNGT1JNIFNIQTFfVHJhbnNmb3JtCisjZGVmaW5lIEhBU0hfRklOQUwgU0hBMV9GaW5hbAorI2RlZmluZSBIQVNIX0JMT0NLX0RBVEFfT1JERVIgc2hhMV9ibG9ja19kYXRhX29yZGVyCisjZGVmaW5lIFh1cGRhdGUoYSwgaXgsIGlhLCBpYiwgaWMsIGlkKSBcCisgICgoYSkgPSAoaWEgXiBpYiBeIGljIF4gaWQpLCBpeCA9IChhKSA9IFJPVEFURSgoYSksIDEpKQorCisjaWZuZGVmIFNIQTFfQVNNCitzdGF0aWMKKyNlbmRpZgordm9pZCBzaGExX2Jsb2NrX2RhdGFfb3JkZXIoU0hBX0NUWCAqYywgY29uc3Qgdm9pZCAqcCwgc2l6ZV90IG51bSk7CisKKyNpbmNsdWRlICIuLi9kaWdlc3QvbWQzMl9jb21tb24uaCIKKworI2RlZmluZSBLXzAwXzE5IDB4NWE4Mjc5OTlVTAorI2RlZmluZSBLXzIwXzM5IDB4NmVkOWViYTFVTAorI2RlZmluZSBLXzQwXzU5IDB4OGYxYmJjZGNVTAorI2RlZmluZSBLXzYwXzc5IDB4Y2E2MmMxZDZVTAorCisvKiBBcyAgcG9pbnRlZCBvdXQgYnkgV2VpIERhaSA8d2VpZGFpQGVza2ltby5jb20+LCBGKCkgYmVsb3cgY2FuIGJlIHNpbXBsaWZpZWQKKyAqIHRvIHRoZSBjb2RlIGluIEZfMDBfMTkuICBXZWkgYXR0cmlidXRlcyB0aGVzZSBvcHRpbWlzYXRpb25zIHRvIFBldGVyCisgKiBHdXRtYW5uJ3MgU0hTIGNvZGUsIGFuZCBoZSBhdHRyaWJ1dGVzIGl0IHRvIFJpY2ggU2Nocm9lcHBlbC4gI2RlZmluZQorICogRih4LHkseikgKCgoeCkgJiAoeSkpICB8ICAoKH4oeCkpICYgKHopKSkgSSd2ZSBqdXN0IGJlY29tZSBhd2FyZSBvZiBhbm90aGVyCisgKiB0d2VhayB0byBiZSBtYWRlLCBhZ2FpbiBmcm9tIFdlaSBEYWksIGluIEZfNDBfNTksICh4JmEpfCh5JmEpIC0+ICh4fHkpJmEgKi8KKyNkZWZpbmUgRl8wMF8xOShiLCBjLCBkKSAoKCgoYykgXiAoZCkpICYgKGIpKSBeIChkKSkKKyNkZWZpbmUgRl8yMF8zOShiLCBjLCBkKSAoKGIpIF4gKGMpIF4gKGQpKQorI2RlZmluZSBGXzQwXzU5KGIsIGMsIGQpICgoKGIpICYgKGMpKSB8ICgoKGIpIHwgKGMpKSAmIChkKSkpCisjZGVmaW5lIEZfNjBfNzkoYiwgYywgZCkgRl8yMF8zOShiLCBjLCBkKQorCisjZGVmaW5lIEJPRFlfMDBfMTUoaSwgYSwgYiwgYywgZCwgZSwgZiwgeGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoZikgPSB4aSArIChlKSArIEtfMDBfMTkgKyBST1RBVEUoKGEpLCA1KSArIEZfMDBfMTkoKGIpLCAoYyksIChkKSk7IFwKKyAgKGIpID0gUk9UQVRFKChiKSwgMzApOworCisjZGVmaW5lIEJPRFlfMTZfMTkoaSwgYSwgYiwgYywgZCwgZSwgZiwgeGksIHhhLCB4YiwgeGMsIHhkKSAgICAgICBcCisgIFh1cGRhdGUoZiwgeGksIHhhLCB4YiwgeGMsIHhkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChmKSArPSAoZSkgKyBLXzAwXzE5ICsgUk9UQVRFKChhKSwgNSkgKyBGXzAwXzE5KChiKSwgKGMpLCAoZCkpOyBcCisgIChiKSA9IFJPVEFURSgoYiksIDMwKTsKKworI2RlZmluZSBCT0RZXzIwXzMxKGksIGEsIGIsIGMsIGQsIGUsIGYsIHhpLCB4YSwgeGIsIHhjLCB4ZCkgICAgICAgXAorICBYdXBkYXRlKGYsIHhpLCB4YSwgeGIsIHhjLCB4ZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoZikgKz0gKGUpICsgS18yMF8zOSArIFJPVEFURSgoYSksIDUpICsgRl8yMF8zOSgoYiksIChjKSwgKGQpKTsgXAorICAoYikgPSBST1RBVEUoKGIpLCAzMCk7CisKKyNkZWZpbmUgQk9EWV8zMl8zOShpLCBhLCBiLCBjLCBkLCBlLCBmLCB4YSwgeGIsIHhjLCB4ZCkgICAgICAgICAgIFwKKyAgWHVwZGF0ZShmLCB4YSwgeGEsIHhiLCB4YywgeGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKGYpICs9IChlKSArIEtfMjBfMzkgKyBST1RBVEUoKGEpLCA1KSArIEZfMjBfMzkoKGIpLCAoYyksIChkKSk7IFwKKyAgKGIpID0gUk9UQVRFKChiKSwgMzApOworCisjZGVmaW5lIEJPRFlfNDBfNTkoaSwgYSwgYiwgYywgZCwgZSwgZiwgeGEsIHhiLCB4YywgeGQpICAgICAgICAgICBcCisgIFh1cGRhdGUoZiwgeGEsIHhhLCB4YiwgeGMsIHhkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChmKSArPSAoZSkgKyBLXzQwXzU5ICsgUk9UQVRFKChhKSwgNSkgKyBGXzQwXzU5KChiKSwgKGMpLCAoZCkpOyBcCisgIChiKSA9IFJPVEFURSgoYiksIDMwKTsKKworI2RlZmluZSBCT0RZXzYwXzc5KGksIGEsIGIsIGMsIGQsIGUsIGYsIHhhLCB4YiwgeGMsIHhkKSAgICAgICAgICAgICAgIFwKKyAgWHVwZGF0ZShmLCB4YSwgeGEsIHhiLCB4YywgeGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChmKSA9IHhhICsgKGUpICsgS182MF83OSArIFJPVEFURSgoYSksIDUpICsgRl82MF83OSgoYiksIChjKSwgKGQpKTsgXAorICAoYikgPSBST1RBVEUoKGIpLCAzMCk7CisKKyNpZmRlZiBYCisjdW5kZWYgWAorI2VuZGlmCisKKy8qIE9yaWdpbmFsbHkgWCB3YXMgYW4gYXJyYXkuIEFzIGl0J3MgYXV0b21hdGljIGl0J3MgbmF0dXJhbAorKiB0byBleHBlY3QgUklTQyBjb21waWxlciB0byBhY2NvbW9kYXRlIGF0IGxlYXN0IHBhcnQgb2YgaXQgaW4KKyogdGhlIHJlZ2lzdGVyIGJhbmssIGlzbid0IGl0PyBVbmZvcnR1bmF0ZWx5IG5vdCBhbGwgY29tcGlsZXJzCisqICJmaW5kIiB0aGlzIGV4cGVjdGF0aW9uIHJlYXNvbmFibGU6LSggT24gb3JkZXIgdG8gbWFrZSBzdWNoCisqIGNvbXBpbGVycyBnZW5lcmF0ZSBiZXR0ZXIgY29kZSBJIHJlcGxhY2UgWFtdIHdpdGggYSBidW5jaCBvZgorKiBYMCwgWDEsIGV0Yy4gU2VlIHRoZSBmdW5jdGlvbiBib2R5IGJlbG93Li4uCisqCQkJCQk8YXBwcm9AZnkuY2hhbG1lcnMuc2U+ICovCisjZGVmaW5lIFgoaSkJWFgjI2kKKworI2lmICFkZWZpbmVkKFNIQTFfQVNNKQorc3RhdGljIHZvaWQgSEFTSF9CTE9DS19EQVRBX09SREVSKFNIQV9DVFggKmMsIGNvbnN0IHZvaWQgKnAsIHNpemVfdCBudW0pIHsKKyAgY29uc3QgdWludDhfdCAqZGF0YSA9IHA7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIE1EMzJfUkVHX1QgQSwgQiwgQywgRCwgRSwgVCwgbDsKKyAgdW5zaWduZWQgTUQzMl9SRUdfVCBYWDAsIFhYMSwgWFgyLCBYWDMsIFhYNCwgWFg1LCBYWDYsIFhYNywgWFg4LCBYWDksIFhYMTAsCisgICAgICBYWDExLCBYWDEyLCBYWDEzLCBYWDE0LCBYWDE1OworCisgIEEgPSBjLT5oMDsKKyAgQiA9IGMtPmgxOworICBDID0gYy0+aDI7CisgIEQgPSBjLT5oMzsKKyAgRSA9IGMtPmg0OworCisgIGZvciAoOzspIHsKKyAgICBjb25zdCB1bmlvbiB7CisgICAgICBsb25nIG9uZTsKKyAgICAgIGNoYXIgbGl0dGxlOworICAgIH0gaXNfZW5kaWFuID0gezF9OworCisgICAgaWYgKCFpc19lbmRpYW4ubGl0dGxlICYmICgoc2l6ZV90KXAgJSA0KSA9PSAwKSB7CisgICAgICBjb25zdCB1aW50MzJfdCAqVyA9IChjb25zdCB1aW50MzJfdCAqKWRhdGE7CisKKyAgICAgIFgoMCkgPSBXWzBdOworICAgICAgWCgxKSA9IFdbMV07CisgICAgICBCT0RZXzAwXzE1KDAsIEEsIEIsIEMsIEQsIEUsIFQsIFgoMCkpOworICAgICAgWCgyKSA9IFdbMl07CisgICAgICBCT0RZXzAwXzE1KDEsIFQsIEEsIEIsIEMsIEQsIEUsIFgoMSkpOworICAgICAgWCgzKSA9IFdbM107CisgICAgICBCT0RZXzAwXzE1KDIsIEUsIFQsIEEsIEIsIEMsIEQsIFgoMikpOworICAgICAgWCg0KSA9IFdbNF07CisgICAgICBCT0RZXzAwXzE1KDMsIEQsIEUsIFQsIEEsIEIsIEMsIFgoMykpOworICAgICAgWCg1KSA9IFdbNV07CisgICAgICBCT0RZXzAwXzE1KDQsIEMsIEQsIEUsIFQsIEEsIEIsIFgoNCkpOworICAgICAgWCg2KSA9IFdbNl07CisgICAgICBCT0RZXzAwXzE1KDUsIEIsIEMsIEQsIEUsIFQsIEEsIFgoNSkpOworICAgICAgWCg3KSA9IFdbN107CisgICAgICBCT0RZXzAwXzE1KDYsIEEsIEIsIEMsIEQsIEUsIFQsIFgoNikpOworICAgICAgWCg4KSA9IFdbOF07CisgICAgICBCT0RZXzAwXzE1KDcsIFQsIEEsIEIsIEMsIEQsIEUsIFgoNykpOworICAgICAgWCg5KSA9IFdbOV07CisgICAgICBCT0RZXzAwXzE1KDgsIEUsIFQsIEEsIEIsIEMsIEQsIFgoOCkpOworICAgICAgWCgxMCkgPSBXWzEwXTsKKyAgICAgIEJPRFlfMDBfMTUoOSwgRCwgRSwgVCwgQSwgQiwgQywgWCg5KSk7CisgICAgICBYKDExKSA9IFdbMTFdOworICAgICAgQk9EWV8wMF8xNSgxMCwgQywgRCwgRSwgVCwgQSwgQiwgWCgxMCkpOworICAgICAgWCgxMikgPSBXWzEyXTsKKyAgICAgIEJPRFlfMDBfMTUoMTEsIEIsIEMsIEQsIEUsIFQsIEEsIFgoMTEpKTsKKyAgICAgIFgoMTMpID0gV1sxM107CisgICAgICBCT0RZXzAwXzE1KDEyLCBBLCBCLCBDLCBELCBFLCBULCBYKDEyKSk7CisgICAgICBYKDE0KSA9IFdbMTRdOworICAgICAgQk9EWV8wMF8xNSgxMywgVCwgQSwgQiwgQywgRCwgRSwgWCgxMykpOworICAgICAgWCgxNSkgPSBXWzE1XTsKKyAgICAgIEJPRFlfMDBfMTUoMTQsIEUsIFQsIEEsIEIsIEMsIEQsIFgoMTQpKTsKKyAgICAgIEJPRFlfMDBfMTUoMTUsIEQsIEUsIFQsIEEsIEIsIEMsIFgoMTUpKTsKKworICAgICAgZGF0YSArPSBIQVNIX0NCTE9DSzsKKyAgICB9IGVsc2UgeworICAgICAgKHZvaWQpSE9TVF9jMmwoZGF0YSwgbCk7CisgICAgICBYKDApID0gbDsKKyAgICAgICh2b2lkKUhPU1RfYzJsKGRhdGEsIGwpOworICAgICAgWCgxKSA9IGw7CisgICAgICBCT0RZXzAwXzE1KDAsIEEsIEIsIEMsIEQsIEUsIFQsIFgoMCkpOworICAgICAgKHZvaWQpSE9TVF9jMmwoZGF0YSwgbCk7CisgICAgICBYKDIpID0gbDsKKyAgICAgIEJPRFlfMDBfMTUoMSwgVCwgQSwgQiwgQywgRCwgRSwgWCgxKSk7CisgICAgICAodm9pZClIT1NUX2MybChkYXRhLCBsKTsKKyAgICAgIFgoMykgPSBsOworICAgICAgQk9EWV8wMF8xNSgyLCBFLCBULCBBLCBCLCBDLCBELCBYKDIpKTsKKyAgICAgICh2b2lkKUhPU1RfYzJsKGRhdGEsIGwpOworICAgICAgWCg0KSA9IGw7CisgICAgICBCT0RZXzAwXzE1KDMsIEQsIEUsIFQsIEEsIEIsIEMsIFgoMykpOworICAgICAgKHZvaWQpSE9TVF9jMmwoZGF0YSwgbCk7CisgICAgICBYKDUpID0gbDsKKyAgICAgIEJPRFlfMDBfMTUoNCwgQywgRCwgRSwgVCwgQSwgQiwgWCg0KSk7CisgICAgICAodm9pZClIT1NUX2MybChkYXRhLCBsKTsKKyAgICAgIFgoNikgPSBsOworICAgICAgQk9EWV8wMF8xNSg1LCBCLCBDLCBELCBFLCBULCBBLCBYKDUpKTsKKyAgICAgICh2b2lkKUhPU1RfYzJsKGRhdGEsIGwpOworICAgICAgWCg3KSA9IGw7CisgICAgICBCT0RZXzAwXzE1KDYsIEEsIEIsIEMsIEQsIEUsIFQsIFgoNikpOworICAgICAgKHZvaWQpSE9TVF9jMmwoZGF0YSwgbCk7CisgICAgICBYKDgpID0gbDsKKyAgICAgIEJPRFlfMDBfMTUoNywgVCwgQSwgQiwgQywgRCwgRSwgWCg3KSk7CisgICAgICAodm9pZClIT1NUX2MybChkYXRhLCBsKTsKKyAgICAgIFgoOSkgPSBsOworICAgICAgQk9EWV8wMF8xNSg4LCBFLCBULCBBLCBCLCBDLCBELCBYKDgpKTsKKyAgICAgICh2b2lkKUhPU1RfYzJsKGRhdGEsIGwpOworICAgICAgWCgxMCkgPSBsOworICAgICAgQk9EWV8wMF8xNSg5LCBELCBFLCBULCBBLCBCLCBDLCBYKDkpKTsKKyAgICAgICh2b2lkKUhPU1RfYzJsKGRhdGEsIGwpOworICAgICAgWCgxMSkgPSBsOworICAgICAgQk9EWV8wMF8xNSgxMCwgQywgRCwgRSwgVCwgQSwgQiwgWCgxMCkpOworICAgICAgKHZvaWQpSE9TVF9jMmwoZGF0YSwgbCk7CisgICAgICBYKDEyKSA9IGw7CisgICAgICBCT0RZXzAwXzE1KDExLCBCLCBDLCBELCBFLCBULCBBLCBYKDExKSk7CisgICAgICAodm9pZClIT1NUX2MybChkYXRhLCBsKTsKKyAgICAgIFgoMTMpID0gbDsKKyAgICAgIEJPRFlfMDBfMTUoMTIsIEEsIEIsIEMsIEQsIEUsIFQsIFgoMTIpKTsKKyAgICAgICh2b2lkKUhPU1RfYzJsKGRhdGEsIGwpOworICAgICAgWCgxNCkgPSBsOworICAgICAgQk9EWV8wMF8xNSgxMywgVCwgQSwgQiwgQywgRCwgRSwgWCgxMykpOworICAgICAgKHZvaWQpSE9TVF9jMmwoZGF0YSwgbCk7CisgICAgICBYKDE1KSA9IGw7CisgICAgICBCT0RZXzAwXzE1KDE0LCBFLCBULCBBLCBCLCBDLCBELCBYKDE0KSk7CisgICAgICBCT0RZXzAwXzE1KDE1LCBELCBFLCBULCBBLCBCLCBDLCBYKDE1KSk7CisgICAgfQorCisgICAgQk9EWV8xNl8xOSgxNiwgQywgRCwgRSwgVCwgQSwgQiwgWCgwKSwgWCgwKSwgWCgyKSwgWCg4KSwgWCgxMykpOworICAgIEJPRFlfMTZfMTkoMTcsIEIsIEMsIEQsIEUsIFQsIEEsIFgoMSksIFgoMSksIFgoMyksIFgoOSksIFgoMTQpKTsKKyAgICBCT0RZXzE2XzE5KDE4LCBBLCBCLCBDLCBELCBFLCBULCBYKDIpLCBYKDIpLCBYKDQpLCBYKDEwKSwgWCgxNSkpOworICAgIEJPRFlfMTZfMTkoMTksIFQsIEEsIEIsIEMsIEQsIEUsIFgoMyksIFgoMyksIFgoNSksIFgoMTEpLCBYKDApKTsKKworICAgIEJPRFlfMjBfMzEoMjAsIEUsIFQsIEEsIEIsIEMsIEQsIFgoNCksIFgoNCksIFgoNiksIFgoMTIpLCBYKDEpKTsKKyAgICBCT0RZXzIwXzMxKDIxLCBELCBFLCBULCBBLCBCLCBDLCBYKDUpLCBYKDUpLCBYKDcpLCBYKDEzKSwgWCgyKSk7CisgICAgQk9EWV8yMF8zMSgyMiwgQywgRCwgRSwgVCwgQSwgQiwgWCg2KSwgWCg2KSwgWCg4KSwgWCgxNCksIFgoMykpOworICAgIEJPRFlfMjBfMzEoMjMsIEIsIEMsIEQsIEUsIFQsIEEsIFgoNyksIFgoNyksIFgoOSksIFgoMTUpLCBYKDQpKTsKKyAgICBCT0RZXzIwXzMxKDI0LCBBLCBCLCBDLCBELCBFLCBULCBYKDgpLCBYKDgpLCBYKDEwKSwgWCgwKSwgWCg1KSk7CisgICAgQk9EWV8yMF8zMSgyNSwgVCwgQSwgQiwgQywgRCwgRSwgWCg5KSwgWCg5KSwgWCgxMSksIFgoMSksIFgoNikpOworICAgIEJPRFlfMjBfMzEoMjYsIEUsIFQsIEEsIEIsIEMsIEQsIFgoMTApLCBYKDEwKSwgWCgxMiksIFgoMiksIFgoNykpOworICAgIEJPRFlfMjBfMzEoMjcsIEQsIEUsIFQsIEEsIEIsIEMsIFgoMTEpLCBYKDExKSwgWCgxMyksIFgoMyksIFgoOCkpOworICAgIEJPRFlfMjBfMzEoMjgsIEMsIEQsIEUsIFQsIEEsIEIsIFgoMTIpLCBYKDEyKSwgWCgxNCksIFgoNCksIFgoOSkpOworICAgIEJPRFlfMjBfMzEoMjksIEIsIEMsIEQsIEUsIFQsIEEsIFgoMTMpLCBYKDEzKSwgWCgxNSksIFgoNSksIFgoMTApKTsKKyAgICBCT0RZXzIwXzMxKDMwLCBBLCBCLCBDLCBELCBFLCBULCBYKDE0KSwgWCgxNCksIFgoMCksIFgoNiksIFgoMTEpKTsKKyAgICBCT0RZXzIwXzMxKDMxLCBULCBBLCBCLCBDLCBELCBFLCBYKDE1KSwgWCgxNSksIFgoMSksIFgoNyksIFgoMTIpKTsKKworICAgIEJPRFlfMzJfMzkoMzIsIEUsIFQsIEEsIEIsIEMsIEQsIFgoMCksIFgoMiksIFgoOCksIFgoMTMpKTsKKyAgICBCT0RZXzMyXzM5KDMzLCBELCBFLCBULCBBLCBCLCBDLCBYKDEpLCBYKDMpLCBYKDkpLCBYKDE0KSk7CisgICAgQk9EWV8zMl8zOSgzNCwgQywgRCwgRSwgVCwgQSwgQiwgWCgyKSwgWCg0KSwgWCgxMCksIFgoMTUpKTsKKyAgICBCT0RZXzMyXzM5KDM1LCBCLCBDLCBELCBFLCBULCBBLCBYKDMpLCBYKDUpLCBYKDExKSwgWCgwKSk7CisgICAgQk9EWV8zMl8zOSgzNiwgQSwgQiwgQywgRCwgRSwgVCwgWCg0KSwgWCg2KSwgWCgxMiksIFgoMSkpOworICAgIEJPRFlfMzJfMzkoMzcsIFQsIEEsIEIsIEMsIEQsIEUsIFgoNSksIFgoNyksIFgoMTMpLCBYKDIpKTsKKyAgICBCT0RZXzMyXzM5KDM4LCBFLCBULCBBLCBCLCBDLCBELCBYKDYpLCBYKDgpLCBYKDE0KSwgWCgzKSk7CisgICAgQk9EWV8zMl8zOSgzOSwgRCwgRSwgVCwgQSwgQiwgQywgWCg3KSwgWCg5KSwgWCgxNSksIFgoNCkpOworCisgICAgQk9EWV80MF81OSg0MCwgQywgRCwgRSwgVCwgQSwgQiwgWCg4KSwgWCgxMCksIFgoMCksIFgoNSkpOworICAgIEJPRFlfNDBfNTkoNDEsIEIsIEMsIEQsIEUsIFQsIEEsIFgoOSksIFgoMTEpLCBYKDEpLCBYKDYpKTsKKyAgICBCT0RZXzQwXzU5KDQyLCBBLCBCLCBDLCBELCBFLCBULCBYKDEwKSwgWCgxMiksIFgoMiksIFgoNykpOworICAgIEJPRFlfNDBfNTkoNDMsIFQsIEEsIEIsIEMsIEQsIEUsIFgoMTEpLCBYKDEzKSwgWCgzKSwgWCg4KSk7CisgICAgQk9EWV80MF81OSg0NCwgRSwgVCwgQSwgQiwgQywgRCwgWCgxMiksIFgoMTQpLCBYKDQpLCBYKDkpKTsKKyAgICBCT0RZXzQwXzU5KDQ1LCBELCBFLCBULCBBLCBCLCBDLCBYKDEzKSwgWCgxNSksIFgoNSksIFgoMTApKTsKKyAgICBCT0RZXzQwXzU5KDQ2LCBDLCBELCBFLCBULCBBLCBCLCBYKDE0KSwgWCgwKSwgWCg2KSwgWCgxMSkpOworICAgIEJPRFlfNDBfNTkoNDcsIEIsIEMsIEQsIEUsIFQsIEEsIFgoMTUpLCBYKDEpLCBYKDcpLCBYKDEyKSk7CisgICAgQk9EWV80MF81OSg0OCwgQSwgQiwgQywgRCwgRSwgVCwgWCgwKSwgWCgyKSwgWCg4KSwgWCgxMykpOworICAgIEJPRFlfNDBfNTkoNDksIFQsIEEsIEIsIEMsIEQsIEUsIFgoMSksIFgoMyksIFgoOSksIFgoMTQpKTsKKyAgICBCT0RZXzQwXzU5KDUwLCBFLCBULCBBLCBCLCBDLCBELCBYKDIpLCBYKDQpLCBYKDEwKSwgWCgxNSkpOworICAgIEJPRFlfNDBfNTkoNTEsIEQsIEUsIFQsIEEsIEIsIEMsIFgoMyksIFgoNSksIFgoMTEpLCBYKDApKTsKKyAgICBCT0RZXzQwXzU5KDUyLCBDLCBELCBFLCBULCBBLCBCLCBYKDQpLCBYKDYpLCBYKDEyKSwgWCgxKSk7CisgICAgQk9EWV80MF81OSg1MywgQiwgQywgRCwgRSwgVCwgQSwgWCg1KSwgWCg3KSwgWCgxMyksIFgoMikpOworICAgIEJPRFlfNDBfNTkoNTQsIEEsIEIsIEMsIEQsIEUsIFQsIFgoNiksIFgoOCksIFgoMTQpLCBYKDMpKTsKKyAgICBCT0RZXzQwXzU5KDU1LCBULCBBLCBCLCBDLCBELCBFLCBYKDcpLCBYKDkpLCBYKDE1KSwgWCg0KSk7CisgICAgQk9EWV80MF81OSg1NiwgRSwgVCwgQSwgQiwgQywgRCwgWCg4KSwgWCgxMCksIFgoMCksIFgoNSkpOworICAgIEJPRFlfNDBfNTkoNTcsIEQsIEUsIFQsIEEsIEIsIEMsIFgoOSksIFgoMTEpLCBYKDEpLCBYKDYpKTsKKyAgICBCT0RZXzQwXzU5KDU4LCBDLCBELCBFLCBULCBBLCBCLCBYKDEwKSwgWCgxMiksIFgoMiksIFgoNykpOworICAgIEJPRFlfNDBfNTkoNTksIEIsIEMsIEQsIEUsIFQsIEEsIFgoMTEpLCBYKDEzKSwgWCgzKSwgWCg4KSk7CisKKyAgICBCT0RZXzYwXzc5KDYwLCBBLCBCLCBDLCBELCBFLCBULCBYKDEyKSwgWCgxNCksIFgoNCksIFgoOSkpOworICAgIEJPRFlfNjBfNzkoNjEsIFQsIEEsIEIsIEMsIEQsIEUsIFgoMTMpLCBYKDE1KSwgWCg1KSwgWCgxMCkpOworICAgIEJPRFlfNjBfNzkoNjIsIEUsIFQsIEEsIEIsIEMsIEQsIFgoMTQpLCBYKDApLCBYKDYpLCBYKDExKSk7CisgICAgQk9EWV82MF83OSg2MywgRCwgRSwgVCwgQSwgQiwgQywgWCgxNSksIFgoMSksIFgoNyksIFgoMTIpKTsKKyAgICBCT0RZXzYwXzc5KDY0LCBDLCBELCBFLCBULCBBLCBCLCBYKDApLCBYKDIpLCBYKDgpLCBYKDEzKSk7CisgICAgQk9EWV82MF83OSg2NSwgQiwgQywgRCwgRSwgVCwgQSwgWCgxKSwgWCgzKSwgWCg5KSwgWCgxNCkpOworICAgIEJPRFlfNjBfNzkoNjYsIEEsIEIsIEMsIEQsIEUsIFQsIFgoMiksIFgoNCksIFgoMTApLCBYKDE1KSk7CisgICAgQk9EWV82MF83OSg2NywgVCwgQSwgQiwgQywgRCwgRSwgWCgzKSwgWCg1KSwgWCgxMSksIFgoMCkpOworICAgIEJPRFlfNjBfNzkoNjgsIEUsIFQsIEEsIEIsIEMsIEQsIFgoNCksIFgoNiksIFgoMTIpLCBYKDEpKTsKKyAgICBCT0RZXzYwXzc5KDY5LCBELCBFLCBULCBBLCBCLCBDLCBYKDUpLCBYKDcpLCBYKDEzKSwgWCgyKSk7CisgICAgQk9EWV82MF83OSg3MCwgQywgRCwgRSwgVCwgQSwgQiwgWCg2KSwgWCg4KSwgWCgxNCksIFgoMykpOworICAgIEJPRFlfNjBfNzkoNzEsIEIsIEMsIEQsIEUsIFQsIEEsIFgoNyksIFgoOSksIFgoMTUpLCBYKDQpKTsKKyAgICBCT0RZXzYwXzc5KDcyLCBBLCBCLCBDLCBELCBFLCBULCBYKDgpLCBYKDEwKSwgWCgwKSwgWCg1KSk7CisgICAgQk9EWV82MF83OSg3MywgVCwgQSwgQiwgQywgRCwgRSwgWCg5KSwgWCgxMSksIFgoMSksIFgoNikpOworICAgIEJPRFlfNjBfNzkoNzQsIEUsIFQsIEEsIEIsIEMsIEQsIFgoMTApLCBYKDEyKSwgWCgyKSwgWCg3KSk7CisgICAgQk9EWV82MF83OSg3NSwgRCwgRSwgVCwgQSwgQiwgQywgWCgxMSksIFgoMTMpLCBYKDMpLCBYKDgpKTsKKyAgICBCT0RZXzYwXzc5KDc2LCBDLCBELCBFLCBULCBBLCBCLCBYKDEyKSwgWCgxNCksIFgoNCksIFgoOSkpOworICAgIEJPRFlfNjBfNzkoNzcsIEIsIEMsIEQsIEUsIFQsIEEsIFgoMTMpLCBYKDE1KSwgWCg1KSwgWCgxMCkpOworICAgIEJPRFlfNjBfNzkoNzgsIEEsIEIsIEMsIEQsIEUsIFQsIFgoMTQpLCBYKDApLCBYKDYpLCBYKDExKSk7CisgICAgQk9EWV82MF83OSg3OSwgVCwgQSwgQiwgQywgRCwgRSwgWCgxNSksIFgoMSksIFgoNyksIFgoMTIpKTsKKworICAgIGMtPmgwID0gKGMtPmgwICsgRSkgJiAweGZmZmZmZmZmTDsKKyAgICBjLT5oMSA9IChjLT5oMSArIFQpICYgMHhmZmZmZmZmZkw7CisgICAgYy0+aDIgPSAoYy0+aDIgKyBBKSAmIDB4ZmZmZmZmZmZMOworICAgIGMtPmgzID0gKGMtPmgzICsgQikgJiAweGZmZmZmZmZmTDsKKyAgICBjLT5oNCA9IChjLT5oNCArIEMpICYgMHhmZmZmZmZmZkw7CisKKyAgICBpZiAoLS1udW0gPT0gMCkKKyAgICAgIGJyZWFrOworCisgICAgQSA9IGMtPmgwOworICAgIEIgPSBjLT5oMTsKKyAgICBDID0gYy0+aDI7CisgICAgRCA9IGMtPmgzOworICAgIEUgPSBjLT5oNDsKKyAgfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jcnlwdG8vc2hhL3NoYTFfdGVzdC5jIGIvY3J5cHRvL3NoYS9zaGExX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmVmOWUxCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3NoYS9zaGExX3Rlc3QuYwpAQCAtMCwwICsxLDEyNSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL3NoYS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZGlnZXN0Lmg+CisKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRlc3RbXSA9IHsKKyAgICAiYWJjIiwgImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWpoaWpraWprbGprbG1rbG1ubG1ub21ub3Bub3BxIiwgTlVMTCwgfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGV4cGVjdGVkW10gPSB7CisgICAgImE5OTkzZTM2NDcwNjgxNmFiYTNlMjU3MTc4NTBjMjZjOWNkMGQ4OWQiLAorICAgICI4NDk4M2U0NDFjM2JkMjZlYmFhZTRhYTFmOTUxMjllNWU1NDY3MGYxIiwgfTsKKworc3RhdGljIGludCB0ZXN0X2luY3JlbWVudGFsKCkgeworICBFVlBfTURfQ1RYIGN0eDsKKyAgY2hhciBidWZbMTAwMF07CisgIHVpbnQ4X3QgbWRbU0hBX0RJR0VTVF9MRU5HVEhdOworICBjaGFyIG1kX2hleFtzaXplb2YobWQpICogMiArIDFdOworICBzaXplX3QgaTsKKyAgc3RhdGljIGNvbnN0IGNoYXIgZXhwZWN0ZWRbXSA9ICIzNGFhOTczY2Q0YzRkYWE0ZjYxZWViMmJkYmFkMjczMTY1MzQwMTZmIjsKKworICBtZW1zZXQoYnVmLCAnYScsIHNpemVvZihidWYpKTsKKyAgRVZQX01EX0NUWF9pbml0KCZjdHgpOworICBFVlBfRGlnZXN0SW5pdF9leCgmY3R4LCBFVlBfc2hhMSgpLCBOVUxMKTsKKyAgZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykgeworICAgIEVWUF9EaWdlc3RVcGRhdGUoJmN0eCwgYnVmLCBzaXplb2YoYnVmKSk7CisgIH0KKyAgRVZQX0RpZ2VzdEZpbmFsX2V4KCZjdHgsIG1kLCBOVUxMKTsKKyAgRVZQX01EX0NUWF9jbGVhbnVwKCZjdHgpOworCisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YobWQpOyBpKyspIHsKKyAgICBzcHJpbnRmKCZtZF9oZXhbaSAqIDJdLCAiJTAyeCIsIG1kW2ldKTsKKyAgfQorCisgIGlmIChzdHJjbXAobWRfaGV4LCBleHBlY3RlZCkgIT0gMCkgeworICAgIGZwcmludGYoc3RkZXJyLCAidGVzdF9pbmNyZW1lbnRhbDogZ290ICVzLCB3YW50ZWQgJXNcbiIsIG1kX2hleCwgZXhwZWN0ZWQpOworICAgIHJldHVybiAwOworICB9CisKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICBzaXplX3QgaSwgajsKKyAgdWludDhfdCBtZFtTSEFfRElHRVNUX0xFTkdUSF07CisgIGNoYXIgbWRfaGV4W3NpemVvZihtZCkgKiAyICsgMV07CisgIGludCBvayA9IDE7CisKKyAgZm9yIChpID0gMDsgdGVzdFtpXSAhPSBOVUxMOyBpKyspIHsKKyAgICBFVlBfRGlnZXN0KHRlc3RbaV0sIHN0cmxlbih0ZXN0W2ldKSwgbWQsIE5VTEwsIEVWUF9zaGExKCksIE5VTEwpOworICAgIGZvciAoaiA9IDA7IGogPCBzaXplb2YobWQpOyBqKyspIHsKKyAgICAgIHNwcmludGYoJm1kX2hleFtqICogMl0sICIlMDJ4IiwgbWRbal0pOworICAgIH0KKworICAgIGlmIChzdHJjbXAobWRfaGV4LCBleHBlY3RlZFtpXSkgIT0gMCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICIjJXU6IGdvdCAlcywgd2FudGVkICVzXG4iLCAodW5zaWduZWQpaSwgbWRfaGV4LAorICAgICAgICAgICAgICBleHBlY3RlZFtpXSk7CisgICAgICBvayA9IDA7CisgICAgfQorICB9CisKKyAgb2sgJj0gdGVzdF9pbmNyZW1lbnRhbCgpOworCisgIGlmIChvaykgeworICAgIHByaW50ZigiUEFTU1xuIik7CisgIH0KKworICByZXR1cm4gb2sgPyAwIDogMTsKK30KZGlmZiAtLWdpdCBhL2NyeXB0by9zaGEvc2hhMjU2LmMgYi9jcnlwdG8vc2hhL3NoYTI1Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ODU3ODQKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc2hhL3NoYTI1Ni5jCkBAIC0wLDAgKzEsMzY1IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9zaGEuaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKworCisjaWYgIWRlZmluZWQoT1BFTlNTTF9OT19BU00pICYmIFwKKyAgICAoZGVmaW5lZChPUEVOU1NMX1g4NikgfHwgZGVmaW5lZChPUEVOU1NMX1g4Nl82NCkgfHwgZGVmaW5lZChPUEVOU1NMX0FSTSkpCisjZGVmaW5lIFNIQTI1Nl9BU00KKyNlbmRpZgorCitpbnQgU0hBMjI0X0luaXQoU0hBMjU2X0NUWCAqc2hhKSB7CisgIG1lbXNldChzaGEsIDAsIHNpemVvZihTSEEyNTZfQ1RYKSk7CisgIHNoYS0+aFswXSA9IDB4YzEwNTllZDhVTDsKKyAgc2hhLT5oWzFdID0gMHgzNjdjZDUwN1VMOworICBzaGEtPmhbMl0gPSAweDMwNzBkZDE3VUw7CisgIHNoYS0+aFszXSA9IDB4ZjcwZTU5MzlVTDsKKyAgc2hhLT5oWzRdID0gMHhmZmMwMGIzMVVMOworICBzaGEtPmhbNV0gPSAweDY4NTgxNTExVUw7CisgIHNoYS0+aFs2XSA9IDB4NjRmOThmYTdVTDsKKyAgc2hhLT5oWzddID0gMHhiZWZhNGZhNFVMOworICBzaGEtPm1kX2xlbiA9IFNIQTIyNF9ESUdFU1RfTEVOR1RIOworICByZXR1cm4gMTsKK30KKworaW50IFNIQTI1Nl9Jbml0KFNIQTI1Nl9DVFggKnNoYSkgeworICBtZW1zZXQoc2hhLCAwLCBzaXplb2YoU0hBMjU2X0NUWCkpOworICBzaGEtPmhbMF0gPSAweDZhMDllNjY3VUw7CisgIHNoYS0+aFsxXSA9IDB4YmI2N2FlODVVTDsKKyAgc2hhLT5oWzJdID0gMHgzYzZlZjM3MlVMOworICBzaGEtPmhbM10gPSAweGE1NGZmNTNhVUw7CisgIHNoYS0+aFs0XSA9IDB4NTEwZTUyN2ZVTDsKKyAgc2hhLT5oWzVdID0gMHg5YjA1Njg4Y1VMOworICBzaGEtPmhbNl0gPSAweDFmODNkOWFiVUw7CisgIHNoYS0+aFs3XSA9IDB4NWJlMGNkMTlVTDsKKyAgc2hhLT5tZF9sZW4gPSBTSEEyNTZfRElHRVNUX0xFTkdUSDsKKyAgcmV0dXJuIDE7Cit9CisKK3VpbnQ4X3QgKlNIQTIyNChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgbGVuLCB1aW50OF90ICpvdXQpIHsKKyAgU0hBMjU2X0NUWCBjdHg7CisgIHN0YXRpYyB1aW50OF90IGJ1ZltTSEEyMjRfRElHRVNUX0xFTkdUSF07CisKKyAgLyogVE9ETyhmb3JrKTogcmVtb3ZlIHRoaXMgc3RhdGljIGJ1ZmZlci4gKi8KKyAgaWYgKG91dCA9PSBOVUxMKSB7CisgICAgb3V0ID0gYnVmOworICB9CisgIFNIQTIyNF9Jbml0KCZjdHgpOworICBTSEEyNTZfVXBkYXRlKCZjdHgsIGRhdGEsIGxlbik7CisgIFNIQTI1Nl9GaW5hbChvdXQsICZjdHgpOworICBPUEVOU1NMX2NsZWFuc2UoJmN0eCwgc2l6ZW9mKGN0eCkpOworICByZXR1cm4gb3V0OworfQorCit1aW50OF90ICpTSEEyNTYoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGxlbiwgdWludDhfdCAqb3V0KSB7CisgIFNIQTI1Nl9DVFggY3R4OworICBzdGF0aWMgdWludDhfdCBidWZbU0hBMjU2X0RJR0VTVF9MRU5HVEhdOworCisgIC8qIFRPRE8oZm9yayk6IHJlbW92ZSB0aGlzIHN0YXRpYyBidWZmZXIuICovCisgIGlmIChvdXQgPT0gTlVMTCkgeworICAgIG91dCA9IGJ1ZjsKKyAgfQorICBTSEEyNTZfSW5pdCgmY3R4KTsKKyAgU0hBMjU2X1VwZGF0ZSgmY3R4LCBkYXRhLCBsZW4pOworICBTSEEyNTZfRmluYWwob3V0LCAmY3R4KTsKKyAgT1BFTlNTTF9jbGVhbnNlKCZjdHgsIHNpemVvZihjdHgpKTsKKyAgcmV0dXJuIG91dDsKK30KKworaW50IFNIQTIyNF9VcGRhdGUoU0hBMjU2X0NUWCAqY3R4LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKSB7CisgIHJldHVybiBTSEEyNTZfVXBkYXRlKGN0eCwgZGF0YSwgbGVuKTsKK30KKworaW50IFNIQTIyNF9GaW5hbCh1aW50OF90ICptZCwgU0hBMjU2X0NUWCAqY3R4KSB7CisgIHJldHVybiBTSEEyNTZfRmluYWwobWQsIGN0eCk7Cit9CisKKyNkZWZpbmUgREFUQV9PUkRFUl9JU19CSUdfRU5ESUFOCisKKyNkZWZpbmUgSEFTSF9MT05HIHVpbnQzMl90CisjZGVmaW5lIEhBU0hfQ1RYIFNIQTI1Nl9DVFgKKyNkZWZpbmUgSEFTSF9DQkxPQ0sgNjQKKworLyogTm90ZSB0aGF0IEZJUFMxODAtMiBkaXNjdXNzZXMgIlRydW5jYXRpb24gb2YgdGhlIEhhc2ggRnVuY3Rpb24gT3V0cHV0LiIKKyAqIGRlZmF1bHQ6IGNhc2UgYmVsb3cgY292ZXJzIGZvciBpdC4gSXQncyBub3QgY2xlYXIgaG93ZXZlciBpZiBpdCdzIHBlcm1pdHRlZAorICogdG8gdHJ1bmNhdGUgdG8gYW1vdW50IG9mIGJ5dGVzIG5vdCBkaXZpc2libGUgYnkgNC4gSSBiZXQgbm90LCBidXQgaWYgaXQgaXMsCisgKiB0aGVuIGRlZmF1bHQ6IGNhc2Ugc2hhbGwgYmUgZXh0ZW5kZWQuIEZvciByZWZlcmVuY2UuIElkZWEgYmVoaW5kIHNlcGFyYXRlCisgKiBjYXNlcyBmb3IgcHJlLWRlZmluZWQgbGVuZ2h0cyBpcyB0byBsZXQgdGhlIGNvbXBpbGVyIGRlY2lkZSBpZiBpdCdzCisgKiBhcHByb3ByaWF0ZSB0byB1bnJvbGwgc21hbGwgbG9vcHMuICovCisjZGVmaW5lIEhBU0hfTUFLRV9TVFJJTkcoYywgcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdW5zaWduZWQgbG9uZyBsbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdW5zaWduZWQgaW50IG5uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3dpdGNoICgoYyktPm1kX2xlbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjYXNlIFNIQTIyNF9ESUdFU1RfTEVOR1RIOiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAobm4gPSAwOyBubiA8IFNIQTIyNF9ESUdFU1RfTEVOR1RIIC8gNDsgbm4rKykgeyBcCisgICAgICAgICAgbGwgPSAoYyktPmhbbm5dOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKHZvaWQpIEhPU1RfbDJjKGxsLCAocykpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjYXNlIFNIQTI1Nl9ESUdFU1RfTEVOR1RIOiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAobm4gPSAwOyBubiA8IFNIQTI1Nl9ESUdFU1RfTEVOR1RIIC8gNDsgbm4rKykgeyBcCisgICAgICAgICAgbGwgPSAoYyktPmhbbm5dOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKHZvaWQpIEhPU1RfbDJjKGxsLCAocykpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoYyktPm1kX2xlbiA+IFNIQTI1Nl9ESUdFU1RfTEVOR1RIKSAgICAgICAgICAgICBcCisgICAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAobm4gPSAwOyBubiA8IChjKS0+bWRfbGVuIC8gNDsgbm4rKykgeyAgICAgICAgICBcCisgICAgICAgICAgbGwgPSAoYyktPmhbbm5dOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKHZvaWQpIEhPU1RfbDJjKGxsLCAocykpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKworI2RlZmluZSBIQVNIX1VQREFURSBTSEEyNTZfVXBkYXRlCisjZGVmaW5lIEhBU0hfVFJBTlNGT1JNIFNIQTI1Nl9UcmFuc2Zvcm0KKyNkZWZpbmUgSEFTSF9GSU5BTCBTSEEyNTZfRmluYWwKKyNkZWZpbmUgSEFTSF9CTE9DS19EQVRBX09SREVSIHNoYTI1Nl9ibG9ja19kYXRhX29yZGVyCisjaWZuZGVmIFNIQTI1Nl9BU00KK3N0YXRpYworI2VuZGlmCit2b2lkIHNoYTI1Nl9ibG9ja19kYXRhX29yZGVyKFNIQTI1Nl9DVFggKmN0eCwgY29uc3Qgdm9pZCAqaW4sIHNpemVfdCBudW0pOworCisjaW5jbHVkZSAiLi4vZGlnZXN0L21kMzJfY29tbW9uLmgiCisKKyNpZm5kZWYgU0hBMjU2X0FTTQorc3RhdGljIGNvbnN0IEhBU0hfTE9ORyBLMjU2WzY0XSA9IHsKKyAgICAweDQyOGEyZjk4VUwsIDB4NzEzNzQ0OTFVTCwgMHhiNWMwZmJjZlVMLCAweGU5YjVkYmE1VUwsIDB4Mzk1NmMyNWJVTCwKKyAgICAweDU5ZjExMWYxVUwsIDB4OTIzZjgyYTRVTCwgMHhhYjFjNWVkNVVMLCAweGQ4MDdhYTk4VUwsIDB4MTI4MzViMDFVTCwKKyAgICAweDI0MzE4NWJlVUwsIDB4NTUwYzdkYzNVTCwgMHg3MmJlNWQ3NFVMLCAweDgwZGViMWZlVUwsIDB4OWJkYzA2YTdVTCwKKyAgICAweGMxOWJmMTc0VUwsIDB4ZTQ5YjY5YzFVTCwgMHhlZmJlNDc4NlVMLCAweDBmYzE5ZGM2VUwsIDB4MjQwY2ExY2NVTCwKKyAgICAweDJkZTkyYzZmVUwsIDB4NGE3NDg0YWFVTCwgMHg1Y2IwYTlkY1VMLCAweDc2Zjk4OGRhVUwsIDB4OTgzZTUxNTJVTCwKKyAgICAweGE4MzFjNjZkVUwsIDB4YjAwMzI3YzhVTCwgMHhiZjU5N2ZjN1VMLCAweGM2ZTAwYmYzVUwsIDB4ZDVhNzkxNDdVTCwKKyAgICAweDA2Y2E2MzUxVUwsIDB4MTQyOTI5NjdVTCwgMHgyN2I3MGE4NVVMLCAweDJlMWIyMTM4VUwsIDB4NGQyYzZkZmNVTCwKKyAgICAweDUzMzgwZDEzVUwsIDB4NjUwYTczNTRVTCwgMHg3NjZhMGFiYlVMLCAweDgxYzJjOTJlVUwsIDB4OTI3MjJjODVVTCwKKyAgICAweGEyYmZlOGExVUwsIDB4YTgxYTY2NGJVTCwgMHhjMjRiOGI3MFVMLCAweGM3NmM1MWEzVUwsIDB4ZDE5MmU4MTlVTCwKKyAgICAweGQ2OTkwNjI0VUwsIDB4ZjQwZTM1ODVVTCwgMHgxMDZhYTA3MFVMLCAweDE5YTRjMTE2VUwsIDB4MWUzNzZjMDhVTCwKKyAgICAweDI3NDg3NzRjVUwsIDB4MzRiMGJjYjVVTCwgMHgzOTFjMGNiM1VMLCAweDRlZDhhYTRhVUwsIDB4NWI5Y2NhNGZVTCwKKyAgICAweDY4MmU2ZmYzVUwsIDB4NzQ4ZjgyZWVVTCwgMHg3OGE1NjM2ZlVMLCAweDg0Yzg3ODE0VUwsIDB4OGNjNzAyMDhVTCwKKyAgICAweDkwYmVmZmZhVUwsIDB4YTQ1MDZjZWJVTCwgMHhiZWY5YTNmN1VMLCAweGM2NzE3OGYyVUx9OworCisvKiBGSVBTIHNwZWNpZmljYXRpb24gcmVmZXJzIHRvIHJpZ2h0IHJvdGF0aW9ucywgd2hpbGUgb3VyIFJPVEFURSBtYWNybworICogaXMgbGVmdCBvbmUuIFRoaXMgaXMgd2h5IHlvdSBtaWdodCBub3RpY2UgdGhhdCByb3RhdGlvbiBjb2VmZmljaWVudHMKKyAqIGRpZmZlciBmcm9tIHRob3NlIG9ic2VydmVkIGluIEZJUFMgZG9jdW1lbnQgYnkgMzItTi4uLiAqLworI2RlZmluZSBTaWdtYTAoeCkgKFJPVEFURSgoeCksIDMwKSBeIFJPVEFURSgoeCksIDE5KSBeIFJPVEFURSgoeCksIDEwKSkKKyNkZWZpbmUgU2lnbWExKHgpIChST1RBVEUoKHgpLCAyNikgXiBST1RBVEUoKHgpLCAyMSkgXiBST1RBVEUoKHgpLCA3KSkKKyNkZWZpbmUgc2lnbWEwKHgpIChST1RBVEUoKHgpLCAyNSkgXiBST1RBVEUoKHgpLCAxNCkgXiAoKHgpID4+IDMpKQorI2RlZmluZSBzaWdtYTEoeCkgKFJPVEFURSgoeCksIDE1KSBeIFJPVEFURSgoeCksIDEzKSBeICgoeCkgPj4gMTApKQorCisjZGVmaW5lIENoKHgsIHksIHopICgoKHgpICYgKHkpKSBeICgofih4KSkgJiAoeikpKQorI2RlZmluZSBNYWooeCwgeSwgeikgKCgoeCkgJiAoeSkpIF4gKCh4KSAmICh6KSkgXiAoKHkpICYgKHopKSkKKworI2RlZmluZSBST1VORF8wMF8xNShpLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKSAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVDEgKz0gaCArIFNpZ21hMShlKSArIENoKGUsIGYsIGcpICsgSzI1NltpXTsgXAorICAgIGggPSBTaWdtYTAoYSkgKyBNYWooYSwgYiwgYyk7ICAgICAgICAgICAgICAgIFwKKyAgICBkICs9IFQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaCArPSBUMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFJPVU5EXzE2XzYzKGksIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIFgpICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzMCA9IFhbKGkgKyAxKSAmIDB4MGZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgczAgPSBzaWdtYTAoczApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHMxID0gWFsoaSArIDE0KSAmIDB4MGZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzMSA9IHNpZ21hMShzMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVDEgPSBYWyhpKSAmIDB4MGZdICs9IHMwICsgczEgKyBYWyhpICsgOSkgJiAweDBmXTsgXAorICAgIFJPVU5EXzAwXzE1KGksIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpOyAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXIoU0hBMjU2X0NUWCAqY3R4LCBjb25zdCB2b2lkICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW0pIHsKKyAgdW5zaWduZWQgTUQzMl9SRUdfVCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBzMCwgczEsIFQxOworICBIQVNIX0xPTkcgWFsxNl07CisgIGludCBpOworICBjb25zdCB1aW50OF90ICpkYXRhID0gaW47CisgIGNvbnN0IHVuaW9uIHsKKyAgICBsb25nIG9uZTsKKyAgICBjaGFyIGxpdHRsZTsKKyAgfSBpc19lbmRpYW4gPSB7MX07CisKKyAgd2hpbGUgKG51bS0tKSB7CisgICAgYSA9IGN0eC0+aFswXTsKKyAgICBiID0gY3R4LT5oWzFdOworICAgIGMgPSBjdHgtPmhbMl07CisgICAgZCA9IGN0eC0+aFszXTsKKyAgICBlID0gY3R4LT5oWzRdOworICAgIGYgPSBjdHgtPmhbNV07CisgICAgZyA9IGN0eC0+aFs2XTsKKyAgICBoID0gY3R4LT5oWzddOworCisgICAgaWYgKCFpc19lbmRpYW4ubGl0dGxlICYmIHNpemVvZihIQVNIX0xPTkcpID09IDQgJiYgKChzaXplX3QpaW4gJSA0KSA9PSAwKSB7CisgICAgICBjb25zdCBIQVNIX0xPTkcgKlcgPSAoY29uc3QgSEFTSF9MT05HICopZGF0YTsKKworICAgICAgVDEgPSBYWzBdID0gV1swXTsKKyAgICAgIFJPVU5EXzAwXzE1KDAsIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpOworICAgICAgVDEgPSBYWzFdID0gV1sxXTsKKyAgICAgIFJPVU5EXzAwXzE1KDEsIGgsIGEsIGIsIGMsIGQsIGUsIGYsIGcpOworICAgICAgVDEgPSBYWzJdID0gV1syXTsKKyAgICAgIFJPVU5EXzAwXzE1KDIsIGcsIGgsIGEsIGIsIGMsIGQsIGUsIGYpOworICAgICAgVDEgPSBYWzNdID0gV1szXTsKKyAgICAgIFJPVU5EXzAwXzE1KDMsIGYsIGcsIGgsIGEsIGIsIGMsIGQsIGUpOworICAgICAgVDEgPSBYWzRdID0gV1s0XTsKKyAgICAgIFJPVU5EXzAwXzE1KDQsIGUsIGYsIGcsIGgsIGEsIGIsIGMsIGQpOworICAgICAgVDEgPSBYWzVdID0gV1s1XTsKKyAgICAgIFJPVU5EXzAwXzE1KDUsIGQsIGUsIGYsIGcsIGgsIGEsIGIsIGMpOworICAgICAgVDEgPSBYWzZdID0gV1s2XTsKKyAgICAgIFJPVU5EXzAwXzE1KDYsIGMsIGQsIGUsIGYsIGcsIGgsIGEsIGIpOworICAgICAgVDEgPSBYWzddID0gV1s3XTsKKyAgICAgIFJPVU5EXzAwXzE1KDcsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGEpOworICAgICAgVDEgPSBYWzhdID0gV1s4XTsKKyAgICAgIFJPVU5EXzAwXzE1KDgsIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpOworICAgICAgVDEgPSBYWzldID0gV1s5XTsKKyAgICAgIFJPVU5EXzAwXzE1KDksIGgsIGEsIGIsIGMsIGQsIGUsIGYsIGcpOworICAgICAgVDEgPSBYWzEwXSA9IFdbMTBdOworICAgICAgUk9VTkRfMDBfMTUoMTAsIGcsIGgsIGEsIGIsIGMsIGQsIGUsIGYpOworICAgICAgVDEgPSBYWzExXSA9IFdbMTFdOworICAgICAgUk9VTkRfMDBfMTUoMTEsIGYsIGcsIGgsIGEsIGIsIGMsIGQsIGUpOworICAgICAgVDEgPSBYWzEyXSA9IFdbMTJdOworICAgICAgUk9VTkRfMDBfMTUoMTIsIGUsIGYsIGcsIGgsIGEsIGIsIGMsIGQpOworICAgICAgVDEgPSBYWzEzXSA9IFdbMTNdOworICAgICAgUk9VTkRfMDBfMTUoMTMsIGQsIGUsIGYsIGcsIGgsIGEsIGIsIGMpOworICAgICAgVDEgPSBYWzE0XSA9IFdbMTRdOworICAgICAgUk9VTkRfMDBfMTUoMTQsIGMsIGQsIGUsIGYsIGcsIGgsIGEsIGIpOworICAgICAgVDEgPSBYWzE1XSA9IFdbMTVdOworICAgICAgUk9VTkRfMDBfMTUoMTUsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGEpOworCisgICAgICBkYXRhICs9IEhBU0hfQ0JMT0NLOworICAgIH0gZWxzZSB7CisgICAgICBIQVNIX0xPTkcgbDsKKworICAgICAgSE9TVF9jMmwoZGF0YSwgbCk7CisgICAgICBUMSA9IFhbMF0gPSBsOworICAgICAgUk9VTkRfMDBfMTUoMCwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCk7CisgICAgICBIT1NUX2MybChkYXRhLCBsKTsKKyAgICAgIFQxID0gWFsxXSA9IGw7CisgICAgICBST1VORF8wMF8xNSgxLCBoLCBhLCBiLCBjLCBkLCBlLCBmLCBnKTsKKyAgICAgIEhPU1RfYzJsKGRhdGEsIGwpOworICAgICAgVDEgPSBYWzJdID0gbDsKKyAgICAgIFJPVU5EXzAwXzE1KDIsIGcsIGgsIGEsIGIsIGMsIGQsIGUsIGYpOworICAgICAgSE9TVF9jMmwoZGF0YSwgbCk7CisgICAgICBUMSA9IFhbM10gPSBsOworICAgICAgUk9VTkRfMDBfMTUoMywgZiwgZywgaCwgYSwgYiwgYywgZCwgZSk7CisgICAgICBIT1NUX2MybChkYXRhLCBsKTsKKyAgICAgIFQxID0gWFs0XSA9IGw7CisgICAgICBST1VORF8wMF8xNSg0LCBlLCBmLCBnLCBoLCBhLCBiLCBjLCBkKTsKKyAgICAgIEhPU1RfYzJsKGRhdGEsIGwpOworICAgICAgVDEgPSBYWzVdID0gbDsKKyAgICAgIFJPVU5EXzAwXzE1KDUsIGQsIGUsIGYsIGcsIGgsIGEsIGIsIGMpOworICAgICAgSE9TVF9jMmwoZGF0YSwgbCk7CisgICAgICBUMSA9IFhbNl0gPSBsOworICAgICAgUk9VTkRfMDBfMTUoNiwgYywgZCwgZSwgZiwgZywgaCwgYSwgYik7CisgICAgICBIT1NUX2MybChkYXRhLCBsKTsKKyAgICAgIFQxID0gWFs3XSA9IGw7CisgICAgICBST1VORF8wMF8xNSg3LCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBhKTsKKyAgICAgIEhPU1RfYzJsKGRhdGEsIGwpOworICAgICAgVDEgPSBYWzhdID0gbDsKKyAgICAgIFJPVU5EXzAwXzE1KDgsIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpOworICAgICAgSE9TVF9jMmwoZGF0YSwgbCk7CisgICAgICBUMSA9IFhbOV0gPSBsOworICAgICAgUk9VTkRfMDBfMTUoOSwgaCwgYSwgYiwgYywgZCwgZSwgZiwgZyk7CisgICAgICBIT1NUX2MybChkYXRhLCBsKTsKKyAgICAgIFQxID0gWFsxMF0gPSBsOworICAgICAgUk9VTkRfMDBfMTUoMTAsIGcsIGgsIGEsIGIsIGMsIGQsIGUsIGYpOworICAgICAgSE9TVF9jMmwoZGF0YSwgbCk7CisgICAgICBUMSA9IFhbMTFdID0gbDsKKyAgICAgIFJPVU5EXzAwXzE1KDExLCBmLCBnLCBoLCBhLCBiLCBjLCBkLCBlKTsKKyAgICAgIEhPU1RfYzJsKGRhdGEsIGwpOworICAgICAgVDEgPSBYWzEyXSA9IGw7CisgICAgICBST1VORF8wMF8xNSgxMiwgZSwgZiwgZywgaCwgYSwgYiwgYywgZCk7CisgICAgICBIT1NUX2MybChkYXRhLCBsKTsKKyAgICAgIFQxID0gWFsxM10gPSBsOworICAgICAgUk9VTkRfMDBfMTUoMTMsIGQsIGUsIGYsIGcsIGgsIGEsIGIsIGMpOworICAgICAgSE9TVF9jMmwoZGF0YSwgbCk7CisgICAgICBUMSA9IFhbMTRdID0gbDsKKyAgICAgIFJPVU5EXzAwXzE1KDE0LCBjLCBkLCBlLCBmLCBnLCBoLCBhLCBiKTsKKyAgICAgIEhPU1RfYzJsKGRhdGEsIGwpOworICAgICAgVDEgPSBYWzE1XSA9IGw7CisgICAgICBST1VORF8wMF8xNSgxNSwgYiwgYywgZCwgZSwgZiwgZywgaCwgYSk7CisgICAgfQorCisgICAgZm9yIChpID0gMTY7IGkgPCA2NDsgaSArPSA4KSB7CisgICAgICBST1VORF8xNl82MyhpICsgMCwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgWCk7CisgICAgICBST1VORF8xNl82MyhpICsgMSwgaCwgYSwgYiwgYywgZCwgZSwgZiwgZywgWCk7CisgICAgICBST1VORF8xNl82MyhpICsgMiwgZywgaCwgYSwgYiwgYywgZCwgZSwgZiwgWCk7CisgICAgICBST1VORF8xNl82MyhpICsgMywgZiwgZywgaCwgYSwgYiwgYywgZCwgZSwgWCk7CisgICAgICBST1VORF8xNl82MyhpICsgNCwgZSwgZiwgZywgaCwgYSwgYiwgYywgZCwgWCk7CisgICAgICBST1VORF8xNl82MyhpICsgNSwgZCwgZSwgZiwgZywgaCwgYSwgYiwgYywgWCk7CisgICAgICBST1VORF8xNl82MyhpICsgNiwgYywgZCwgZSwgZiwgZywgaCwgYSwgYiwgWCk7CisgICAgICBST1VORF8xNl82MyhpICsgNywgYiwgYywgZCwgZSwgZiwgZywgaCwgYSwgWCk7CisgICAgfQorCisgICAgY3R4LT5oWzBdICs9IGE7CisgICAgY3R4LT5oWzFdICs9IGI7CisgICAgY3R4LT5oWzJdICs9IGM7CisgICAgY3R4LT5oWzNdICs9IGQ7CisgICAgY3R4LT5oWzRdICs9IGU7CisgICAgY3R4LT5oWzVdICs9IGY7CisgICAgY3R4LT5oWzZdICs9IGc7CisgICAgY3R4LT5oWzddICs9IGg7CisgIH0KK30KKworI2VuZGlmIC8qIFNIQTI1Nl9BU00gKi8KZGlmZiAtLWdpdCBhL2NyeXB0by9zaGEvc2hhNTEyLmMgYi9jcnlwdG8vc2hhL3NoYTUxMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYWFjNmYKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc2hhL3NoYTUxMi5jCkBAIC0wLDAgKzEsNTkwIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9zaGEuaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKworCisvKiBJTVBMRU1FTlRBVElPTiBOT1RFUy4KKyAqCisgKiBBcyB5b3UgbWlnaHQgaGF2ZSBub3RpY2VkIDMyLWJpdCBoYXNoIGFsZ29yaXRobXM6CisgKgorICogLSBwZXJtaXQgU0hBX0xPTkcgdG8gYmUgd2lkZXIgdGhhbiAzMi1iaXQgKGNhc2Ugb24gQ1JBWSk7CisgKiAtIG9wdGltaXplZCB2ZXJzaW9ucyBpbXBsZW1lbnQgdHdvIHRyYW5zZm9ybSBmdW5jdGlvbnM6IG9uZSBvcGVyYXRpbmcKKyAqICAgb24gW2FsaWduZWRdIGRhdGEgaW4gaG9zdCBieXRlIG9yZGVyIGFuZCBvbmUgLSBvbiBkYXRhIGluIGlucHV0CisgKiAgIHN0cmVhbSBieXRlIG9yZGVyOworICogLSBzaGFyZSBjb21tb24gYnl0ZS1vcmRlciBuZXV0cmFsIGNvbGxlY3RvciBhbmQgcGFkZGluZyBmdW5jdGlvbgorICogICBpbXBsZW1lbnRhdGlvbnMsIC4uL21kMzJfY29tbW9uLmg7CisgKgorICogTmVpdGhlciBvZiB0aGUgYWJvdmUgYXBwbGllcyB0byB0aGlzIFNIQS01MTIgaW1wbGVtZW50YXRpb25zLiBSZWFzb25zCisgKiBbaW4gcmV2ZXJzZSBvcmRlcl0gYXJlOgorICoKKyAqIC0gaXQncyB0aGUgb25seSA2NC1iaXQgaGFzaCBhbGdvcml0aG0gZm9yIHRoZSBtb21lbnQgb2YgdGhpcyB3cml0aW5nLAorICogICB0aGVyZSBpcyBubyBuZWVkIGZvciBjb21tb24gY29sbGVjdG9yL3BhZGRpbmcgaW1wbGVtZW50YXRpb24gW3lldF07CisgKiAtIGJ5IHN1cHBvcnRpbmcgb25seSBvbmUgdHJhbnNmb3JtIGZ1bmN0aW9uIFt3aGljaCBvcGVyYXRlcyBvbgorICogICAqYWxpZ25lZCogZGF0YSBpbiBpbnB1dCBzdHJlYW0gYnl0ZSBvcmRlciwgYmlnLWVuZGlhbiBpbiB0aGlzIGNhc2VdCisgKiAgIHdlIG1pbmltaXplIGJ1cmRlbiBvZiBtYWludGVuYW5jZSBpbiB0d28gd2F5czogYSkgY29sbGVjdG9yL3BhZGRpbmcKKyAqICAgZnVuY3Rpb24gaXMgc2ltcGxlcjsgYikgb25seSBvbmUgdHJhbnNmb3JtIGZ1bmN0aW9uIHRvIHN0YXJlIGF0OworICogLSBTSEFfTE9ORzY0IGlzIHJlcXVpcmVkIHRvIGJlIGV4YWN0bHkgNjQtYml0IGluIG9yZGVyIHRvIGJlIGFibGUgdG8KKyAqICAgYXBwbHkgYSBudW1iZXIgb2Ygb3B0aW1pemF0aW9ucyB0byBtaXRpZ2F0ZSBwb3RlbnRpYWwgcGVyZm9ybWFuY2UKKyAqICAgcGVuYWx0aWVzIGNhdXNlZCBieSBwcmV2aW91cyBkZXNpZ24gZGVjaXNpb247ICovCisKKyNpZiAhZGVmaW5lZChPUEVOU1NMX05PX0FTTSkgJiYgXAorICAgIChkZWZpbmVkKE9QRU5TU0xfWDg2KSB8fCBkZWZpbmVkKE9QRU5TU0xfWDg2XzY0KSB8fCBkZWZpbmVkKE9QRU5TU0xfQVJNKSkKKyNkZWZpbmUgU0hBNTEyX0JMT0NLX0NBTl9NQU5BR0VfVU5BTElHTkVEX0RBVEEKKyNkZWZpbmUgU0hBNTEyX0FTTQorI2VuZGlmCisKK2ludCBTSEEzODRfSW5pdChTSEE1MTJfQ1RYICpzaGEpIHsKKyAgc2hhLT5oWzBdID0gMHhjYmJiOWQ1ZGMxMDU5ZWQ4OworICBzaGEtPmhbMV0gPSAweDYyOWEyOTJhMzY3Y2Q1MDc7CisgIHNoYS0+aFsyXSA9IDB4OTE1OTAxNWEzMDcwZGQxNzsKKyAgc2hhLT5oWzNdID0gMHgxNTJmZWNkOGY3MGU1OTM5OworICBzaGEtPmhbNF0gPSAweDY3MzMyNjY3ZmZjMDBiMzE7CisgIHNoYS0+aFs1XSA9IDB4OGViNDRhODc2ODU4MTUxMTsKKyAgc2hhLT5oWzZdID0gMHhkYjBjMmUwZDY0Zjk4ZmE3OworICBzaGEtPmhbN10gPSAweDQ3YjU0ODFkYmVmYTRmYTQ7CisKKyAgc2hhLT5ObCA9IDA7CisgIHNoYS0+TmggPSAwOworICBzaGEtPm51bSA9IDA7CisgIHNoYS0+bWRfbGVuID0gU0hBMzg0X0RJR0VTVF9MRU5HVEg7CisgIHJldHVybiAxOworfQorCisKK2ludCBTSEE1MTJfSW5pdChTSEE1MTJfQ1RYICpzaGEpIHsKKyAgc2hhLT5oWzBdID0gMHg2YTA5ZTY2N2YzYmNjOTA4OworICBzaGEtPmhbMV0gPSAweGJiNjdhZTg1ODRjYWE3M2I7CisgIHNoYS0+aFsyXSA9IDB4M2M2ZWYzNzJmZTk0ZjgyYjsKKyAgc2hhLT5oWzNdID0gMHhhNTRmZjUzYTVmMWQzNmYxOworICBzaGEtPmhbNF0gPSAweDUxMGU1MjdmYWRlNjgyZDE7CisgIHNoYS0+aFs1XSA9IDB4OWIwNTY4OGMyYjNlNmMxZjsKKyAgc2hhLT5oWzZdID0gMHgxZjgzZDlhYmZiNDFiZDZiOworICBzaGEtPmhbN10gPSAweDViZTBjZDE5MTM3ZTIxNzk7CisKKyAgc2hhLT5ObCA9IDA7CisgIHNoYS0+TmggPSAwOworICBzaGEtPm51bSA9IDA7CisgIHNoYS0+bWRfbGVuID0gU0hBNTEyX0RJR0VTVF9MRU5HVEg7CisgIHJldHVybiAxOworfQorCit1aW50OF90ICpTSEEzODQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGxlbiwgdWludDhfdCAqb3V0KSB7CisgIFNIQTUxMl9DVFggY3R4OworICBzdGF0aWMgdWludDhfdCBidWZbU0hBMzg0X0RJR0VTVF9MRU5HVEhdOworCisgIC8qIFRPRE8oZm9yayk6IHJlbW92ZSB0aGlzIHN0YXRpYyBidWZmZXIuICovCisgIGlmIChvdXQgPT0gTlVMTCkgeworICAgIG91dCA9IGJ1ZjsKKyAgfQorCisgIFNIQTM4NF9Jbml0KCZjdHgpOworICBTSEE1MTJfVXBkYXRlKCZjdHgsIGRhdGEsIGxlbik7CisgIFNIQTUxMl9GaW5hbChvdXQsICZjdHgpOworICBPUEVOU1NMX2NsZWFuc2UoJmN0eCwgc2l6ZW9mKGN0eCkpOworICByZXR1cm4gb3V0OworfQorCit1aW50OF90ICpTSEE1MTIoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGxlbiwgdWludDhfdCAqb3V0KSB7CisgIFNIQTUxMl9DVFggY3R4OworICBzdGF0aWMgdWludDhfdCBidWZbU0hBNTEyX0RJR0VTVF9MRU5HVEhdOworCisgIC8qIFRPRE8oZm9yayk6IHJlbW92ZSB0aGlzIHN0YXRpYyBidWZmZXIuICovCisgIGlmIChvdXQgPT0gTlVMTCkgeworICAgIG91dCA9IGJ1ZjsKKyAgfQorICBTSEE1MTJfSW5pdCgmY3R4KTsKKyAgU0hBNTEyX1VwZGF0ZSgmY3R4LCBkYXRhLCBsZW4pOworICBTSEE1MTJfRmluYWwob3V0LCAmY3R4KTsKKyAgT1BFTlNTTF9jbGVhbnNlKCZjdHgsIHNpemVvZihjdHgpKTsKKyAgcmV0dXJuIG91dDsKK30KKworI2lmICFkZWZpbmVkKFNIQTUxMl9BU00pCitzdGF0aWMKKyNlbmRpZgordm9pZCBzaGE1MTJfYmxvY2tfZGF0YV9vcmRlcihTSEE1MTJfQ1RYICpjdHgsIGNvbnN0IHZvaWQgKmluLCBzaXplX3QgbnVtKTsKKworCitpbnQgU0hBMzg0X0ZpbmFsKHVuc2lnbmVkIGNoYXIgKm1kLCBTSEE1MTJfQ1RYICpzaGEpIHsKKyAgcmV0dXJuIFNIQTUxMl9GaW5hbChtZCwgc2hhKTsKK30KKworaW50IFNIQTM4NF9VcGRhdGUoU0hBNTEyX0NUWCAqc2hhLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKSB7CisgIHJldHVybiBTSEE1MTJfVXBkYXRlKHNoYSwgZGF0YSwgbGVuKTsKK30KKwordm9pZCBTSEE1MTJfVHJhbnNmb3JtKFNIQTUxMl9DVFggKmMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEpIHsKKyNpZm5kZWYgU0hBNTEyX0JMT0NLX0NBTl9NQU5BR0VfVU5BTElHTkVEX0RBVEEKKyAgaWYgKChzaXplX3QpZGF0YSAlIHNpemVvZihjLT51LmRbMF0pICE9IDApIHsKKyAgICBtZW1jcHkoYy0+dS5wLCBkYXRhLCBzaXplb2YoYy0+dS5wKSk7CisgICAgZGF0YSA9IGMtPnUucDsKKyAgfQorI2VuZGlmCisgIHNoYTUxMl9ibG9ja19kYXRhX29yZGVyKGMsIGRhdGEsIDEpOworfQorCitpbnQgU0hBNTEyX1VwZGF0ZShTSEE1MTJfQ1RYICpjLCBjb25zdCB2b2lkICppbl9kYXRhLCBzaXplX3QgbGVuKSB7CisgIHVpbnQ2NF90IGw7CisgIHVpbnQ4X3QgKnAgPSBjLT51LnA7CisgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSAoY29uc3QgdWludDhfdCAqKWluX2RhdGE7CisKKyAgaWYgKGxlbiA9PSAwKQorICAgIHJldHVybiAxOworCisgIGwgPSAoYy0+TmwgKyAoKCh1aW50NjRfdClsZW4pIDw8IDMpKSAmIDB4ZmZmZmZmZmZmZmZmZmZmZjsKKyAgaWYgKGwgPCBjLT5ObCkgeworICAgIGMtPk5oKys7CisgIH0KKyAgaWYgKHNpemVvZihsZW4pID49IDgpIHsKKyAgICBjLT5OaCArPSAoKCh1aW50NjRfdClsZW4pID4+IDYxKTsKKyAgfQorICBjLT5ObCA9IGw7CisKKyAgaWYgKGMtPm51bSAhPSAwKSB7CisgICAgc2l6ZV90IG4gPSBzaXplb2YoYy0+dSkgLSBjLT5udW07CisKKyAgICBpZiAobGVuIDwgbikgeworICAgICAgbWVtY3B5KHAgKyBjLT5udW0sIGRhdGEsIGxlbik7CisgICAgICBjLT5udW0gKz0gKHVuc2lnbmVkIGludClsZW47CisgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgeworICAgICAgbWVtY3B5KHAgKyBjLT5udW0sIGRhdGEsIG4pLCBjLT5udW0gPSAwOworICAgICAgbGVuIC09IG47CisgICAgICBkYXRhICs9IG47CisgICAgICBzaGE1MTJfYmxvY2tfZGF0YV9vcmRlcihjLCBwLCAxKTsKKyAgICB9CisgIH0KKworICBpZiAobGVuID49IHNpemVvZihjLT51KSkgeworI2lmbmRlZiBTSEE1MTJfQkxPQ0tfQ0FOX01BTkFHRV9VTkFMSUdORURfREFUQQorICAgIGlmICgoc2l6ZV90KWRhdGEgJSBzaXplb2YoYy0+dS5kWzBdKSAhPSAwKQorICAgICAgd2hpbGUgKGxlbiA+PSBzaXplb2YoYy0+dSkpCisgICAgICAgIG1lbWNweShwLCBkYXRhLCBzaXplb2YoYy0+dSkpLCBzaGE1MTJfYmxvY2tfZGF0YV9vcmRlcihjLCBwLCAxKSwKKyAgICAgICAgICAgIGxlbiAtPSBzaXplb2YoYy0+dSksIGRhdGEgKz0gc2l6ZW9mKGMtPnUpOworICAgIGVsc2UKKyNlbmRpZgorICAgICAgc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXIoYywgZGF0YSwgbGVuIC8gc2l6ZW9mKGMtPnUpKSwgZGF0YSArPSBsZW4sCisgICAgICAgICAgbGVuICU9IHNpemVvZihjLT51KSwgZGF0YSAtPSBsZW47CisgIH0KKworICBpZiAobGVuICE9IDApIHsKKyAgICBtZW1jcHkocCwgZGF0YSwgbGVuKTsKKyAgICBjLT5udW0gPSAoaW50KWxlbjsKKyAgfQorCisgIHJldHVybiAxOworfQorCitpbnQgU0hBNTEyX0ZpbmFsKHVuc2lnbmVkIGNoYXIgKm1kLCBTSEE1MTJfQ1RYICpzaGEpIHsKKyAgdWludDhfdCAqcCA9ICh1aW50OF90ICopc2hhLT51LnA7CisgIHNpemVfdCBuID0gc2hhLT5udW07CisKKyAgcFtuXSA9IDB4ODA7IC8qIFRoZXJlIGFsd2F5cyBpcyBhIHJvb20gZm9yIG9uZSAqLworICBuKys7CisgIGlmIChuID4gKHNpemVvZihzaGEtPnUpIC0gMTYpKSB7CisgICAgbWVtc2V0KHAgKyBuLCAwLCBzaXplb2Yoc2hhLT51KSAtIG4pOworICAgIG4gPSAwOworICAgIHNoYTUxMl9ibG9ja19kYXRhX29yZGVyKHNoYSwgcCwgMSk7CisgIH0KKworICBtZW1zZXQocCArIG4sIDAsIHNpemVvZihzaGEtPnUpIC0gMTYgLSBuKTsKKyAgcFtzaXplb2Yoc2hhLT51KSAtIDFdID0gKHVpbnQ4X3QpKHNoYS0+TmwpOworICBwW3NpemVvZihzaGEtPnUpIC0gMl0gPSAodWludDhfdCkoc2hhLT5ObCA+PiA4KTsKKyAgcFtzaXplb2Yoc2hhLT51KSAtIDNdID0gKHVpbnQ4X3QpKHNoYS0+TmwgPj4gMTYpOworICBwW3NpemVvZihzaGEtPnUpIC0gNF0gPSAodWludDhfdCkoc2hhLT5ObCA+PiAyNCk7CisgIHBbc2l6ZW9mKHNoYS0+dSkgLSA1XSA9ICh1aW50OF90KShzaGEtPk5sID4+IDMyKTsKKyAgcFtzaXplb2Yoc2hhLT51KSAtIDZdID0gKHVpbnQ4X3QpKHNoYS0+TmwgPj4gNDApOworICBwW3NpemVvZihzaGEtPnUpIC0gN10gPSAodWludDhfdCkoc2hhLT5ObCA+PiA0OCk7CisgIHBbc2l6ZW9mKHNoYS0+dSkgLSA4XSA9ICh1aW50OF90KShzaGEtPk5sID4+IDU2KTsKKyAgcFtzaXplb2Yoc2hhLT51KSAtIDldID0gKHVpbnQ4X3QpKHNoYS0+TmgpOworICBwW3NpemVvZihzaGEtPnUpIC0gMTBdID0gKHVpbnQ4X3QpKHNoYS0+TmggPj4gOCk7CisgIHBbc2l6ZW9mKHNoYS0+dSkgLSAxMV0gPSAodWludDhfdCkoc2hhLT5OaCA+PiAxNik7CisgIHBbc2l6ZW9mKHNoYS0+dSkgLSAxMl0gPSAodWludDhfdCkoc2hhLT5OaCA+PiAyNCk7CisgIHBbc2l6ZW9mKHNoYS0+dSkgLSAxM10gPSAodWludDhfdCkoc2hhLT5OaCA+PiAzMik7CisgIHBbc2l6ZW9mKHNoYS0+dSkgLSAxNF0gPSAodWludDhfdCkoc2hhLT5OaCA+PiA0MCk7CisgIHBbc2l6ZW9mKHNoYS0+dSkgLSAxNV0gPSAodWludDhfdCkoc2hhLT5OaCA+PiA0OCk7CisgIHBbc2l6ZW9mKHNoYS0+dSkgLSAxNl0gPSAodWludDhfdCkoc2hhLT5OaCA+PiA1Nik7CisKKyAgc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXIoc2hhLCBwLCAxKTsKKworICBpZiAobWQgPT0gMCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgc3dpdGNoIChzaGEtPm1kX2xlbikgeworICAgIC8qIExldCBjb21waWxlciBkZWNpZGUgaWYgaXQncyBhcHByb3ByaWF0ZSB0byB1bnJvbGwuLi4gKi8KKyAgICBjYXNlIFNIQTM4NF9ESUdFU1RfTEVOR1RIOgorICAgICAgZm9yIChuID0gMDsgbiA8IFNIQTM4NF9ESUdFU1RfTEVOR1RIIC8gODsgbisrKSB7CisgICAgICAgIHVpbnQ2NF90IHQgPSBzaGEtPmhbbl07CisKKyAgICAgICAgKihtZCsrKSA9ICh1aW50OF90KSh0ID4+IDU2KTsKKyAgICAgICAgKihtZCsrKSA9ICh1aW50OF90KSh0ID4+IDQ4KTsKKyAgICAgICAgKihtZCsrKSA9ICh1aW50OF90KSh0ID4+IDQwKTsKKyAgICAgICAgKihtZCsrKSA9ICh1aW50OF90KSh0ID4+IDMyKTsKKyAgICAgICAgKihtZCsrKSA9ICh1aW50OF90KSh0ID4+IDI0KTsKKyAgICAgICAgKihtZCsrKSA9ICh1aW50OF90KSh0ID4+IDE2KTsKKyAgICAgICAgKihtZCsrKSA9ICh1aW50OF90KSh0ID4+IDgpOworICAgICAgICAqKG1kKyspID0gKHVpbnQ4X3QpKHQpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBTSEE1MTJfRElHRVNUX0xFTkdUSDoKKyAgICAgIGZvciAobiA9IDA7IG4gPCBTSEE1MTJfRElHRVNUX0xFTkdUSCAvIDg7IG4rKykgeworICAgICAgICB1aW50NjRfdCB0ID0gc2hhLT5oW25dOworCisgICAgICAgICoobWQrKykgPSAodWludDhfdCkodCA+PiA1Nik7CisgICAgICAgICoobWQrKykgPSAodWludDhfdCkodCA+PiA0OCk7CisgICAgICAgICoobWQrKykgPSAodWludDhfdCkodCA+PiA0MCk7CisgICAgICAgICoobWQrKykgPSAodWludDhfdCkodCA+PiAzMik7CisgICAgICAgICoobWQrKykgPSAodWludDhfdCkodCA+PiAyNCk7CisgICAgICAgICoobWQrKykgPSAodWludDhfdCkodCA+PiAxNik7CisgICAgICAgICoobWQrKykgPSAodWludDhfdCkodCA+PiA4KTsKKyAgICAgICAgKihtZCsrKSA9ICh1aW50OF90KSh0KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIC8qIC4uLiBhcyB3ZWxsIGFzIG1ha2Ugc3VyZSBtZF9sZW4gaXMgbm90IGFidXNlZC4gKi8KKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDA7CisgIH0KKworICByZXR1cm4gMTsKK30KKworI2lmbmRlZiBTSEE1MTJfQVNNCitzdGF0aWMgY29uc3QgdWludDY0X3QgSzUxMls4MF0gPSB7CisgICAgMHg0MjhhMmY5OGQ3MjhhZTIyLCAweDcxMzc0NDkxMjNlZjY1Y2QsIDB4YjVjMGZiY2ZlYzRkM2IyZiwKKyAgICAweGU5YjVkYmE1ODE4OWRiYmMsIDB4Mzk1NmMyNWJmMzQ4YjUzOCwgMHg1OWYxMTFmMWI2MDVkMDE5LAorICAgIDB4OTIzZjgyYTRhZjE5NGY5YiwgMHhhYjFjNWVkNWRhNmQ4MTE4LCAweGQ4MDdhYTk4YTMwMzAyNDIsCisgICAgMHgxMjgzNWIwMTQ1NzA2ZmJlLCAweDI0MzE4NWJlNGVlNGIyOGMsIDB4NTUwYzdkYzNkNWZmYjRlMiwKKyAgICAweDcyYmU1ZDc0ZjI3Yjg5NmYsIDB4ODBkZWIxZmUzYjE2OTZiMSwgMHg5YmRjMDZhNzI1YzcxMjM1LAorICAgIDB4YzE5YmYxNzRjZjY5MjY5NCwgMHhlNDliNjljMTllZjE0YWQyLCAweGVmYmU0Nzg2Mzg0ZjI1ZTMsCisgICAgMHgwZmMxOWRjNjhiOGNkNWI1LCAweDI0MGNhMWNjNzdhYzljNjUsIDB4MmRlOTJjNmY1OTJiMDI3NSwKKyAgICAweDRhNzQ4NGFhNmVhNmU0ODMsIDB4NWNiMGE5ZGNiZDQxZmJkNCwgMHg3NmY5ODhkYTgzMTE1M2I1LAorICAgIDB4OTgzZTUxNTJlZTY2ZGZhYiwgMHhhODMxYzY2ZDJkYjQzMjEwLCAweGIwMDMyN2M4OThmYjIxM2YsCisgICAgMHhiZjU5N2ZjN2JlZWYwZWU0LCAweGM2ZTAwYmYzM2RhODhmYzIsIDB4ZDVhNzkxNDc5MzBhYTcyNSwKKyAgICAweDA2Y2E2MzUxZTAwMzgyNmYsIDB4MTQyOTI5NjcwYTBlNmU3MCwgMHgyN2I3MGE4NTQ2ZDIyZmZjLAorICAgIDB4MmUxYjIxMzg1YzI2YzkyNiwgMHg0ZDJjNmRmYzVhYzQyYWVkLCAweDUzMzgwZDEzOWQ5NWIzZGYsCisgICAgMHg2NTBhNzM1NDhiYWY2M2RlLCAweDc2NmEwYWJiM2M3N2IyYTgsIDB4ODFjMmM5MmU0N2VkYWVlNiwKKyAgICAweDkyNzIyYzg1MTQ4MjM1M2IsIDB4YTJiZmU4YTE0Y2YxMDM2NCwgMHhhODFhNjY0YmJjNDIzMDAxLAorICAgIDB4YzI0YjhiNzBkMGY4OTc5MSwgMHhjNzZjNTFhMzA2NTRiZTMwLCAweGQxOTJlODE5ZDZlZjUyMTgsCisgICAgMHhkNjk5MDYyNDU1NjVhOTEwLCAweGY0MGUzNTg1NTc3MTIwMmEsIDB4MTA2YWEwNzAzMmJiZDFiOCwKKyAgICAweDE5YTRjMTE2YjhkMmQwYzgsIDB4MWUzNzZjMDg1MTQxYWI1MywgMHgyNzQ4Nzc0Y2RmOGVlYjk5LAorICAgIDB4MzRiMGJjYjVlMTliNDhhOCwgMHgzOTFjMGNiM2M1Yzk1YTYzLCAweDRlZDhhYTRhZTM0MThhY2IsCisgICAgMHg1YjljY2E0Zjc3NjNlMzczLCAweDY4MmU2ZmYzZDZiMmI4YTMsIDB4NzQ4ZjgyZWU1ZGVmYjJmYywKKyAgICAweDc4YTU2MzZmNDMxNzJmNjAsIDB4ODRjODc4MTRhMWYwYWI3MiwgMHg4Y2M3MDIwODFhNjQzOWVjLAorICAgIDB4OTBiZWZmZmEyMzYzMWUyOCwgMHhhNDUwNmNlYmRlODJiZGU5LCAweGJlZjlhM2Y3YjJjNjc5MTUsCisgICAgMHhjNjcxNzhmMmUzNzI1MzJiLCAweGNhMjczZWNlZWEyNjYxOWMsIDB4ZDE4NmI4YzcyMWMwYzIwNywKKyAgICAweGVhZGE3ZGQ2Y2RlMGViMWUsIDB4ZjU3ZDRmN2ZlZTZlZDE3OCwgMHgwNmYwNjdhYTcyMTc2ZmJhLAorICAgIDB4MGE2MzdkYzVhMmM4OThhNiwgMHgxMTNmOTgwNGJlZjkwZGFlLCAweDFiNzEwYjM1MTMxYzQ3MWIsCisgICAgMHgyOGRiNzdmNTIzMDQ3ZDg0LCAweDMyY2FhYjdiNDBjNzI0OTMsIDB4M2M5ZWJlMGExNWM5YmViYywKKyAgICAweDQzMWQ2N2M0OWMxMDBkNGMsIDB4NGNjNWQ0YmVjYjNlNDJiNiwgMHg1OTdmMjk5Y2ZjNjU3ZTJhLAorICAgIDB4NWZjYjZmYWIzYWQ2ZmFlYywgMHg2YzQ0MTk4YzRhNDc1ODE3fTsKKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fID49IDIgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19BU00pCisjaWYgZGVmaW5lZChfX3g4Nl82NCkgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorI2RlZmluZSBST1RSKGEsIG4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCByZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzbSgicm9ycSAlMSwlMCIgOiAiPXIiKHJldCkgOiAiSiIobiksICIwIihhKSA6ICJjYyIpOyBcCisgICAgcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSkKKyNkZWZpbmUgUFVMTDY0KHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCByZXQgPSAqKChjb25zdCB1aW50NjRfdCAqKSgmKHgpKSk7IFwKKyAgICBhc20oImJzd2FwcQklMCIgOiAiPXIiKHJldCkgOiAiMCIocmV0KSk7ICAgIFwKKyAgICByZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSkKKyNlbGlmKGRlZmluZWQoX19pMzg2KSB8fCBkZWZpbmVkKF9faTM4Nl9fKSkKKyNkZWZpbmUgUFVMTDY0KHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdW5zaWduZWQgaW50ICpwID0gKGNvbnN0IHVuc2lnbmVkIGludCAqKSgmKHgpKTsgICAgICAgICAgICAgICAgIFwKKyAgICB1bnNpZ25lZCBpbnQgaGkgPSBwWzBdLCBsbyA9IHBbMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzbSgiYnN3YXBsICUwOyBic3dhcGwgJTE7IiA6ICI9ciIobG8pLCAiPXIiKGhpKSA6ICIwIihsbyksICIxIihoaSkpOyBcCisgICAgKCh1aW50NjRfdCloaSkgPDwgMzIgfCBsbzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSkKKyNlbGlmKGRlZmluZWQoX0FSQ0hfUFBDKSAmJiBkZWZpbmVkKF9fNjRCSVRfXykpIHx8IGRlZmluZWQoX0FSQ0hfUFBDNjQpCisjZGVmaW5lIFJPVFIoYSwgbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDY0X3QgcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXNtKCJyb3RyZGkgJTAsJTEsJTIiIDogIj1yIihyZXQpIDogInIiKGEpLCAiSyIobikpOyBcCisgICAgcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0pCisjZWxpZiBkZWZpbmVkKF9fYWFyY2g2NF9fKQorI2RlZmluZSBST1RSKGEsIG4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQ2NF90IHJldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzbSgicm9yICUwLCUxLCUyIiA6ICI9ciIocmV0KSA6ICJyIihhKSwgIkkiKG4pKTsgXAorICAgIHJldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9KQorI2lmIGRlZmluZWQoX19CWVRFX09SREVSX18pICYmIGRlZmluZWQoX19PUkRFUl9MSVRUTEVfRU5ESUFOX18pICYmIFwKKyAgICBfX0JZVEVfT1JERVJfXyA9PSBfX09SREVSX0xJVFRMRV9FTkRJQU5fXworI2RlZmluZSBQVUxMNjQoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQ2NF90IHJldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzbSgicmV2CSUwLCUxIiA6ICI9ciIocmV0KSA6ICJyIigqKChjb25zdCB1aW50NjRfdCAqKSgmKHgpKSkpKTsgXAorICAgIHJldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9KQorI2VuZGlmCisjZW5kaWYKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisjaWYgZGVmaW5lZChfV0lONjQpIC8qIGFwcGxpZXMgdG8gYm90aCBJQS02NCBhbmQgQU1ENjQgKi8KKyNwcmFnbWEgaW50cmluc2ljKF9yb3RyNjQpCisjZGVmaW5lIFJPVFIoYSwgbikgX3JvdHI2NCgoYSksIG4pCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9NX0lYODYpICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fQVNNKQorc3RhdGljIHVpbnQ2NF90IF9fZmFzdGNhbGwgX19wdWxsNjRiZShjb25zdCB2b2lkICp4KSB7CisgIF9hc20gbW92IGVkeCwgW2VjeCArIDBdCisgIF9hc20gbW92IGVheCwgW2VjeCArIDRdCisgIF9hc20gYnN3YXAgZWR4CisgIF9hc20gYnN3YXAgZWF4Cit9CisjZGVmaW5lIFBVTEw2NCh4KSBfX3B1bGw2NGJlKCYoeCkpCisjaWYgX01TQ19WRVIgPD0gMTIwMAorI3ByYWdtYSBpbmxpbmVfZGVwdGgoMCkKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBQVUxMNjQKKyNkZWZpbmUgQih4LCBqKSBcCisgICgoKHVpbnQ2NF90KSgqKCgoY29uc3QgdW5zaWduZWQgY2hhciAqKSgmeCkpICsgaikpKSA8PCAoKDcgLSBqKSAqIDgpKQorI2RlZmluZSBQVUxMNjQoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEIoeCwgMCkgfCBCKHgsIDEpIHwgQih4LCAyKSB8IEIoeCwgMykgfCBCKHgsIDQpIHwgQih4LCA1KSB8IEIoeCwgNikgfCBcCisgICBCKHgsIDcpKQorI2VuZGlmCisKKyNpZm5kZWYgUk9UUgorI2RlZmluZSBST1RSKHgsIHMpICgoKHgpID4+IHMpIHwgKHgpIDw8ICg2NCAtIHMpKQorI2VuZGlmCisKKyNkZWZpbmUgU2lnbWEwKHgpIChST1RSKCh4KSwgMjgpIF4gUk9UUigoeCksIDM0KSBeIFJPVFIoKHgpLCAzOSkpCisjZGVmaW5lIFNpZ21hMSh4KSAoUk9UUigoeCksIDE0KSBeIFJPVFIoKHgpLCAxOCkgXiBST1RSKCh4KSwgNDEpKQorI2RlZmluZSBzaWdtYTAoeCkgKFJPVFIoKHgpLCAxKSBeIFJPVFIoKHgpLCA4KSBeICgoeCkgPj4gNykpCisjZGVmaW5lIHNpZ21hMSh4KSAoUk9UUigoeCksIDE5KSBeIFJPVFIoKHgpLCA2MSkgXiAoKHgpID4+IDYpKQorCisjZGVmaW5lIENoKHgsIHksIHopICgoKHgpICYgKHkpKSBeICgofih4KSkgJiAoeikpKQorI2RlZmluZSBNYWooeCwgeSwgeikgKCgoeCkgJiAoeSkpIF4gKCh4KSAmICh6KSkgXiAoKHkpICYgKHopKSkKKworCisjaWYgZGVmaW5lZChfX2kzODYpIHx8IGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX01fSVg4NikKKy8qCisgKiBUaGlzIGNvZGUgc2hvdWxkIGdpdmUgYmV0dGVyIHJlc3VsdHMgb24gMzItYml0IENQVSB3aXRoIGxlc3MgdGhhbgorICogfjI0IHJlZ2lzdGVycywgYm90aCBzaXplIGFuZCBwZXJmb3JtYW5jZSB3aXNlLi4uCisgKi8KK3N0YXRpYyB2b2lkIHNoYTUxMl9ibG9ja19kYXRhX29yZGVyKFNIQTUxMl9DVFggKmN0eCwgY29uc3Qgdm9pZCAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtKSB7CisgIGNvbnN0IHVpbnQ2NF90ICpXID0gaW47CisgIHVpbnQ2NF90IEEsIEUsIFQ7CisgIHVpbnQ2NF90IFhbOSArIDgwXSwgKkY7CisgIGludCBpOworCisgIHdoaWxlIChudW0tLSkgeworICAgIEYgPSBYICsgODA7CisgICAgQSA9IGN0eC0+aFswXTsKKyAgICBGWzFdID0gY3R4LT5oWzFdOworICAgIEZbMl0gPSBjdHgtPmhbMl07CisgICAgRlszXSA9IGN0eC0+aFszXTsKKyAgICBFID0gY3R4LT5oWzRdOworICAgIEZbNV0gPSBjdHgtPmhbNV07CisgICAgRls2XSA9IGN0eC0+aFs2XTsKKyAgICBGWzddID0gY3R4LT5oWzddOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyssIEYtLSkgeworICAgICAgVCA9IFBVTEw2NChXW2ldKTsKKyAgICAgIEZbMF0gPSBBOworICAgICAgRls0XSA9IEU7CisgICAgICBGWzhdID0gVDsKKyAgICAgIFQgKz0gRls3XSArIFNpZ21hMShFKSArIENoKEUsIEZbNV0sIEZbNl0pICsgSzUxMltpXTsKKyAgICAgIEUgPSBGWzNdICsgVDsKKyAgICAgIEEgPSBUICsgU2lnbWEwKEEpICsgTWFqKEEsIEZbMV0sIEZbMl0pOworICAgIH0KKworICAgIGZvciAoOyBpIDwgODA7IGkrKywgRi0tKSB7CisgICAgICBUID0gc2lnbWEwKEZbOCArIDE2IC0gMV0pOworICAgICAgVCArPSBzaWdtYTEoRls4ICsgMTYgLSAxNF0pOworICAgICAgVCArPSBGWzggKyAxNl0gKyBGWzggKyAxNiAtIDldOworCisgICAgICBGWzBdID0gQTsKKyAgICAgIEZbNF0gPSBFOworICAgICAgRls4XSA9IFQ7CisgICAgICBUICs9IEZbN10gKyBTaWdtYTEoRSkgKyBDaChFLCBGWzVdLCBGWzZdKSArIEs1MTJbaV07CisgICAgICBFID0gRlszXSArIFQ7CisgICAgICBBID0gVCArIFNpZ21hMChBKSArIE1haihBLCBGWzFdLCBGWzJdKTsKKyAgICB9CisKKyAgICBjdHgtPmhbMF0gKz0gQTsKKyAgICBjdHgtPmhbMV0gKz0gRlsxXTsKKyAgICBjdHgtPmhbMl0gKz0gRlsyXTsKKyAgICBjdHgtPmhbM10gKz0gRlszXTsKKyAgICBjdHgtPmhbNF0gKz0gRTsKKyAgICBjdHgtPmhbNV0gKz0gRls1XTsKKyAgICBjdHgtPmhbNl0gKz0gRls2XTsKKyAgICBjdHgtPmhbN10gKz0gRls3XTsKKworICAgIFcgKz0gMTY7CisgIH0KK30KKworI2Vsc2UKKworI2RlZmluZSBST1VORF8wMF8xNShpLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKSAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVDEgKz0gaCArIFNpZ21hMShlKSArIENoKGUsIGYsIGcpICsgSzUxMltpXTsgXAorICAgIGggPSBTaWdtYTAoYSkgKyBNYWooYSwgYiwgYyk7ICAgICAgICAgICAgICAgIFwKKyAgICBkICs9IFQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaCArPSBUMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFJPVU5EXzE2XzgwKGksIGosIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIFgpICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzMCA9IFhbKGogKyAxKSAmIDB4MGZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgczAgPSBzaWdtYTAoczApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHMxID0gWFsoaiArIDE0KSAmIDB4MGZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzMSA9IHNpZ21hMShzMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVDEgPSBYWyhqKSAmIDB4MGZdICs9IHMwICsgczEgKyBYWyhqICsgOSkgJiAweDBmXTsgXAorICAgIFJPVU5EXzAwXzE1KGkgKyBqLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKTsgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXIoU0hBNTEyX0NUWCAqY3R4LCBjb25zdCB2b2lkICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW0pIHsKKyAgY29uc3QgdWludDY0X3QgKlcgPSBpbjsKKyAgdWludDY0X3QgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgczAsIHMxLCBUMTsKKyAgdWludDY0X3QgWFsxNl07CisgIGludCBpOworCisgIHdoaWxlIChudW0tLSkgeworCisgICAgYSA9IGN0eC0+aFswXTsKKyAgICBiID0gY3R4LT5oWzFdOworICAgIGMgPSBjdHgtPmhbMl07CisgICAgZCA9IGN0eC0+aFszXTsKKyAgICBlID0gY3R4LT5oWzRdOworICAgIGYgPSBjdHgtPmhbNV07CisgICAgZyA9IGN0eC0+aFs2XTsKKyAgICBoID0gY3R4LT5oWzddOworCisgICAgVDEgPSBYWzBdID0gUFVMTDY0KFdbMF0pOworICAgIFJPVU5EXzAwXzE1KDAsIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpOworICAgIFQxID0gWFsxXSA9IFBVTEw2NChXWzFdKTsKKyAgICBST1VORF8wMF8xNSgxLCBoLCBhLCBiLCBjLCBkLCBlLCBmLCBnKTsKKyAgICBUMSA9IFhbMl0gPSBQVUxMNjQoV1syXSk7CisgICAgUk9VTkRfMDBfMTUoMiwgZywgaCwgYSwgYiwgYywgZCwgZSwgZik7CisgICAgVDEgPSBYWzNdID0gUFVMTDY0KFdbM10pOworICAgIFJPVU5EXzAwXzE1KDMsIGYsIGcsIGgsIGEsIGIsIGMsIGQsIGUpOworICAgIFQxID0gWFs0XSA9IFBVTEw2NChXWzRdKTsKKyAgICBST1VORF8wMF8xNSg0LCBlLCBmLCBnLCBoLCBhLCBiLCBjLCBkKTsKKyAgICBUMSA9IFhbNV0gPSBQVUxMNjQoV1s1XSk7CisgICAgUk9VTkRfMDBfMTUoNSwgZCwgZSwgZiwgZywgaCwgYSwgYiwgYyk7CisgICAgVDEgPSBYWzZdID0gUFVMTDY0KFdbNl0pOworICAgIFJPVU5EXzAwXzE1KDYsIGMsIGQsIGUsIGYsIGcsIGgsIGEsIGIpOworICAgIFQxID0gWFs3XSA9IFBVTEw2NChXWzddKTsKKyAgICBST1VORF8wMF8xNSg3LCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBhKTsKKyAgICBUMSA9IFhbOF0gPSBQVUxMNjQoV1s4XSk7CisgICAgUk9VTkRfMDBfMTUoOCwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCk7CisgICAgVDEgPSBYWzldID0gUFVMTDY0KFdbOV0pOworICAgIFJPVU5EXzAwXzE1KDksIGgsIGEsIGIsIGMsIGQsIGUsIGYsIGcpOworICAgIFQxID0gWFsxMF0gPSBQVUxMNjQoV1sxMF0pOworICAgIFJPVU5EXzAwXzE1KDEwLCBnLCBoLCBhLCBiLCBjLCBkLCBlLCBmKTsKKyAgICBUMSA9IFhbMTFdID0gUFVMTDY0KFdbMTFdKTsKKyAgICBST1VORF8wMF8xNSgxMSwgZiwgZywgaCwgYSwgYiwgYywgZCwgZSk7CisgICAgVDEgPSBYWzEyXSA9IFBVTEw2NChXWzEyXSk7CisgICAgUk9VTkRfMDBfMTUoMTIsIGUsIGYsIGcsIGgsIGEsIGIsIGMsIGQpOworICAgIFQxID0gWFsxM10gPSBQVUxMNjQoV1sxM10pOworICAgIFJPVU5EXzAwXzE1KDEzLCBkLCBlLCBmLCBnLCBoLCBhLCBiLCBjKTsKKyAgICBUMSA9IFhbMTRdID0gUFVMTDY0KFdbMTRdKTsKKyAgICBST1VORF8wMF8xNSgxNCwgYywgZCwgZSwgZiwgZywgaCwgYSwgYik7CisgICAgVDEgPSBYWzE1XSA9IFBVTEw2NChXWzE1XSk7CisgICAgUk9VTkRfMDBfMTUoMTUsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGEpOworCisgICAgZm9yIChpID0gMTY7IGkgPCA4MDsgaSArPSAxNikgeworICAgICAgUk9VTkRfMTZfODAoaSwgMCwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgWCk7CisgICAgICBST1VORF8xNl84MChpLCAxLCBoLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBYKTsKKyAgICAgIFJPVU5EXzE2XzgwKGksIDIsIGcsIGgsIGEsIGIsIGMsIGQsIGUsIGYsIFgpOworICAgICAgUk9VTkRfMTZfODAoaSwgMywgZiwgZywgaCwgYSwgYiwgYywgZCwgZSwgWCk7CisgICAgICBST1VORF8xNl84MChpLCA0LCBlLCBmLCBnLCBoLCBhLCBiLCBjLCBkLCBYKTsKKyAgICAgIFJPVU5EXzE2XzgwKGksIDUsIGQsIGUsIGYsIGcsIGgsIGEsIGIsIGMsIFgpOworICAgICAgUk9VTkRfMTZfODAoaSwgNiwgYywgZCwgZSwgZiwgZywgaCwgYSwgYiwgWCk7CisgICAgICBST1VORF8xNl84MChpLCA3LCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBhLCBYKTsKKyAgICAgIFJPVU5EXzE2XzgwKGksIDgsIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIFgpOworICAgICAgUk9VTkRfMTZfODAoaSwgOSwgaCwgYSwgYiwgYywgZCwgZSwgZiwgZywgWCk7CisgICAgICBST1VORF8xNl84MChpLCAxMCwgZywgaCwgYSwgYiwgYywgZCwgZSwgZiwgWCk7CisgICAgICBST1VORF8xNl84MChpLCAxMSwgZiwgZywgaCwgYSwgYiwgYywgZCwgZSwgWCk7CisgICAgICBST1VORF8xNl84MChpLCAxMiwgZSwgZiwgZywgaCwgYSwgYiwgYywgZCwgWCk7CisgICAgICBST1VORF8xNl84MChpLCAxMywgZCwgZSwgZiwgZywgaCwgYSwgYiwgYywgWCk7CisgICAgICBST1VORF8xNl84MChpLCAxNCwgYywgZCwgZSwgZiwgZywgaCwgYSwgYiwgWCk7CisgICAgICBST1VORF8xNl84MChpLCAxNSwgYiwgYywgZCwgZSwgZiwgZywgaCwgYSwgWCk7CisgICAgfQorCisgICAgY3R4LT5oWzBdICs9IGE7CisgICAgY3R4LT5oWzFdICs9IGI7CisgICAgY3R4LT5oWzJdICs9IGM7CisgICAgY3R4LT5oWzNdICs9IGQ7CisgICAgY3R4LT5oWzRdICs9IGU7CisgICAgY3R4LT5oWzVdICs9IGY7CisgICAgY3R4LT5oWzZdICs9IGc7CisgICAgY3R4LT5oWzddICs9IGg7CisKKyAgICBXICs9IDE2OworICB9Cit9CisKKyNlbmRpZgorCisjZW5kaWYgLyogU0hBNTEyX0FTTSAqLwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3N0YWNrL0NNYWtlTGlzdHMudHh0IGIvY3J5cHRvL3N0YWNrL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNjQ1YzUKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3RhY2svQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw5IEBACitpbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKKworYWRkX2xpYnJhcnkoCisJc3RhY2sKKworCU9CSkVDVAorCisJc3RhY2suYworKQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3N0YWNrL21ha2VfbWFjcm9zLnNoIGIvY3J5cHRvL3N0YWNrL21ha2VfbWFjcm9zLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0Y2E0NzgKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3RhY2svbWFrZV9tYWNyb3Muc2gKQEAgLTAsMCArMSwxMDQgQEAKKyMhL2Jpbi9zaAorCitjYXQgPiBzdGFja19tYWNyb3MuaCA8PCBFT0YKKy8qIENvcHlyaWdodCAoYykgMjAxNCwgR29vZ2xlIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4gKi8KKworI2lmICFkZWZpbmVkKElOX1NUQUNLX0gpCisjZXJyb3IgIkRvbid0IGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5LiBJbmNsdWRlIHN0YWNrLmguIgorI2VuZGlmCisKK0VPRgorCitvdXRwdXRfc3RhY2sgKCkgeworICB0eXBlPSQxCisgIHN0YXI9JDIKKworICBjYXQgPj4gc3RhY2tfbWFjcm9zLmggPDwgRU9GCisvKiAke3R5cGV9ICovCisjZGVmaW5lIHNrXyR7dHlwZX1fbmV3KGNvbXApXFwKKyAgKChTVEFDS19PRigke3R5cGV9KSopIHNrX25ldyhDSEVDS0VEX0NBU1Qoc3RhY2tfY21wX2Z1bmMsIGludCAoKikgKGNvbnN0ICR7dHlwZX0gKiR7c3Rhcn1hLCBjb25zdCAke3R5cGV9ICoke3N0YXJ9YiksIGNvbXApKSkKKworI2RlZmluZSBza18ke3R5cGV9X25ld19udWxsKClcXAorICAoKFNUQUNLX09GKCR7dHlwZX0pKikgc2tfbmV3X251bGwoKSkKKworI2RlZmluZSBza18ke3R5cGV9X251bShzaylcXAorICBza19udW0oQ0hFQ0tFRF9DQVNUKF9TVEFDSyosIFNUQUNLX09GKCR7dHlwZX0pKiwgc2spKQorCisjZGVmaW5lIHNrXyR7dHlwZX1femVybyhzaylcXAorICBza196ZXJvKENIRUNLRURfQ0FTVChfU1RBQ0sqLCBTVEFDS19PRigke3R5cGV9KSosIHNrKSk7CisKKyNkZWZpbmUgc2tfJHt0eXBlfV92YWx1ZShzaywgaSlcXAorICAoKCR7dHlwZX0ke3N0YXJ9KSBza192YWx1ZShDSEVDS0VEX0NBU1QoX1NUQUNLKiwgY29uc3QgU1RBQ0tfT0YoJHt0eXBlfSkqLCBzayksIChpKSkpCisKKyNkZWZpbmUgc2tfJHt0eXBlfV9zZXQoc2ssIGksIHApXFwKKyAgKCgke3R5cGV9JHtzdGFyfSkgc2tfc2V0KENIRUNLRURfQ0FTVChfU1RBQ0sqLCBTVEFDS19PRigke3R5cGV9KSosIHNrKSwgKGkpLCBDSEVDS0VEX0NBU1Qodm9pZCosICR7dHlwZX0ke3N0YXJ9LCBwKSkpCisKKyNkZWZpbmUgc2tfJHt0eXBlfV9mcmVlKHNrKVxcCisgIHNrX2ZyZWUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyosIFNUQUNLX09GKCR7dHlwZX0pKiwgc2spKQorCisjZGVmaW5lIHNrXyR7dHlwZX1fcG9wX2ZyZWUoc2ssIGZyZWVfZnVuYylcXAorICBza19wb3BfZnJlZShDSEVDS0VEX0NBU1QoX1NUQUNLKiwgU1RBQ0tfT0YoJHt0eXBlfSkqLCBzayksIENIRUNLRURfQ0FTVCh2b2lkICgqKSAodm9pZCopLCB2b2lkICgqKSAoJHt0eXBlfSR7c3Rhcn0pLCBmcmVlX2Z1bmMpKQorCisjZGVmaW5lIHNrXyR7dHlwZX1faW5zZXJ0KHNrLCBwLCB3aGVyZSlcXAorICBza19pbnNlcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyosIFNUQUNLX09GKCR7dHlwZX0pKiwgc2spLCBDSEVDS0VEX0NBU1Qodm9pZCosICR7dHlwZX0ke3N0YXJ9LCBwKSwgKHdoZXJlKSkKKworI2RlZmluZSBza18ke3R5cGV9X2RlbGV0ZShzaywgd2hlcmUpXFwKKyAgKCgke3R5cGV9JHtzdGFyfSkgc2tfZGVsZXRlKENIRUNLRURfQ0FTVChfU1RBQ0sqLCBTVEFDS19PRigke3R5cGV9KSosIHNrKSwgKHdoZXJlKSkpCisKKyNkZWZpbmUgc2tfJHt0eXBlfV9kZWxldGVfcHRyKHNrLCBwKVxcCisgICgoJHt0eXBlfSR7c3Rhcn0pIHNrX2RlbGV0ZV9wdHIoQ0hFQ0tFRF9DQVNUKF9TVEFDSyosIFNUQUNLX09GKCR7dHlwZX0pKiwgc2spLCBDSEVDS0VEX0NBU1Qodm9pZCosICR7dHlwZX0ke3N0YXJ9LCBwKSkpCisKKyNkZWZpbmUgc2tfJHt0eXBlfV9maW5kKHNrLCBvdXRfaW5kZXgsIHApXFwKKyAgc2tfZmluZChDSEVDS0VEX0NBU1QoX1NUQUNLKiwgU1RBQ0tfT0YoJHt0eXBlfSkqLCBzayksIChvdXRfaW5kZXgpLCBDSEVDS0VEX0NBU1Qodm9pZCosICR7dHlwZX0ke3N0YXJ9LCBwKSkKKworI2RlZmluZSBza18ke3R5cGV9X3NoaWZ0KHNrKVxcCisgICgoJHt0eXBlfSR7c3Rhcn0pIHNrX3NoaWZ0KENIRUNLRURfQ0FTVChfU1RBQ0sqLCBTVEFDS19PRigke3R5cGV9KSosIHNrKSkpCisKKyNkZWZpbmUgc2tfJHt0eXBlfV9wdXNoKHNrLCBwKVxcCisgIHNrX3B1c2goQ0hFQ0tFRF9DQVNUKF9TVEFDSyosIFNUQUNLX09GKCR7dHlwZX0pKiwgc2spLCBDSEVDS0VEX0NBU1Qodm9pZCosICR7dHlwZX0ke3N0YXJ9LCBwKSkKKworI2RlZmluZSBza18ke3R5cGV9X3BvcChzaylcXAorICAoKCR7dHlwZX0ke3N0YXJ9KSBza19wb3AoQ0hFQ0tFRF9DQVNUKF9TVEFDSyosIFNUQUNLX09GKCR7dHlwZX0pKiwgc2spKSkKKworI2RlZmluZSBza18ke3R5cGV9X2R1cChzaylcXAorICAoKFNUQUNLX09GKCR7dHlwZX0pKikgc2tfZHVwKENIRUNLRURfQ0FTVChfU1RBQ0sqLCBjb25zdCBTVEFDS19PRigke3R5cGV9KSosIHNrKSkpCisKKyNkZWZpbmUgc2tfJHt0eXBlfV9zb3J0KHNrKVxcCisgIHNrX3NvcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyosIFNUQUNLX09GKCR7dHlwZX0pKiwgc2spKQorCisjZGVmaW5lIHNrXyR7dHlwZX1faXNfc29ydGVkKHNrKVxcCisgIHNrX2lzX3NvcnRlZChDSEVDS0VEX0NBU1QoX1NUQUNLKiwgY29uc3QgU1RBQ0tfT0YoJHt0eXBlfSkqLCBzaykpCisKKyNkZWZpbmUgc2tfJHt0eXBlfV9zZXRfY21wX2Z1bmMoc2ssIGNvbXApXFwKKyAgKChpbnQgKCopIChjb25zdCAke3R5cGV9ICoqYSwgY29uc3QgJHt0eXBlfSAqKmIpKSBza19zZXRfY21wX2Z1bmMoQ0hFQ0tFRF9DQVNUKF9TVEFDSyosIFNUQUNLX09GKCR7dHlwZX0pKiwgc2spLCBDSEVDS0VEX0NBU1Qoc3RhY2tfY21wX2Z1bmMsIGludCAoKikgKGNvbnN0ICR7dHlwZX0gKiphLCBjb25zdCAke3R5cGV9ICoqYiksIGNvbXApKSkKKworCitFT0YKK30KKworc3RhY2tfdHlwZXM9JChjYXQgc3RhY2suaCB8IGdyZXAgJ14gXCogU1RBQ0tfT0Y6JyB8IHNlZCAtZSAncy8uKlNUQUNLX09GOi8vJyAtZSAncy8gLiovLycpCitzcGVjaWFsX3N0YWNrX3R5cGVzPSQoY2F0IHN0YWNrLmggfCBncmVwICdeIFwqIFNQRUNJQUxfU1RBQ0tfT0Y6JyB8IHNlZCAtZSAncy8uKlNQRUNJQUxfU1RBQ0tfT0Y6Ly8nIC1lICdzLyAuKi8vJykKKworZm9yIHR5cGUgaW4gJHN0YWNrX3R5cGVzOyBkbworICBlY2hvIFN0YWNrIG9mICR7dHlwZX0KKyAgb3V0cHV0X3N0YWNrICIke3R5cGV9IiAiKiIKK2RvbmUKKworZm9yIHR5cGUgaW4gJHNwZWNpYWxfc3RhY2tfdHlwZXM7IGRvCisgIGVjaG8gU3RhY2sgb2YgJHt0eXBlfQorICBvdXRwdXRfc3RhY2sgIiR7dHlwZX0iICIiCitkb25lCisKK2NsYW5nLWZvcm1hdCAtaSBzdGFja19tYWNyb3MuaApkaWZmIC0tZ2l0IGEvY3J5cHRvL3N0YWNrL3N0YWNrLmMgYi9jcnlwdG8vc3RhY2svc3RhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzRiMWUxCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3N0YWNrL3N0YWNrLmMKQEAgLTAsMCArMSwzNjAgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlICJzdGFjay5oIgorCisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKworLyoga01pblNpemUgaXMgdGhlIG51bWJlciBvZiBwb2ludGVycyB0aGF0IHdpbGwgYmUgaW5pdGlhbGx5IGFsbG9jYXRlZCBpbiBhIG5ldworICogc3RhY2suICovCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtNaW5TaXplID0gNDsKKworX1NUQUNLICpza19uZXcoc3RhY2tfY21wX2Z1bmMgY29tcCkgeworICBfU1RBQ0sgKnJldDsKKworICByZXQgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoX1NUQUNLKSk7CisgIGlmIChyZXQgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisgIG1lbXNldChyZXQsIDAsIHNpemVvZihfU1RBQ0spKTsKKworICByZXQtPmRhdGEgPSBPUEVOU1NMX21hbGxvYyhzaXplb2Yodm9pZCAqKSAqIGtNaW5TaXplKTsKKyAgaWYgKHJldC0+ZGF0YSA9PSBOVUxMKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBtZW1zZXQocmV0LT5kYXRhLCAwLCBzaXplb2Yodm9pZCAqKSAqIGtNaW5TaXplKTsKKworICByZXQtPmNvbXAgPSBjb21wOworICByZXQtPm51bV9hbGxvYyA9IGtNaW5TaXplOworCisgIHJldHVybiByZXQ7CisKK2VycjoKKyAgaWYgKHJldCkgeworICAgIE9QRU5TU0xfZnJlZShyZXQpOworICB9CisgIHJldHVybiBOVUxMOworfQorCitfU1RBQ0sgKnNrX25ld19udWxsKHZvaWQpIHsgcmV0dXJuIHNrX25ldyhOVUxMKTsgfQorCitzaXplX3Qgc2tfbnVtKGNvbnN0IF9TVEFDSyAqc2spIHsKKyAgaWYgKHNrID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gc2stPm51bTsKK30KKwordm9pZCBza196ZXJvKF9TVEFDSyAqc2spIHsKKyAgaWYgKHNrID09IE5VTEwgfHwgc2stPm51bSA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIG1lbXNldChzay0+ZGF0YSwgMCwgc2l6ZW9mKHZvaWQqKSAqIHNrLT5udW0pOworICBzay0+bnVtID0gMDsKKyAgc2stPnNvcnRlZCA9IDA7Cit9CisKK3ZvaWQgKnNrX3ZhbHVlKGNvbnN0IF9TVEFDSyAqc2ssIHNpemVfdCBpKSB7CisgIGlmICghc2sgfHwgaSA+PSBzay0+bnVtKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIHNrLT5kYXRhW2ldOworfQorCit2b2lkICpza19zZXQoX1NUQUNLICpzaywgc2l6ZV90IGksIHZvaWQgKnZhbHVlKSB7CisgIGlmICghc2sgfHwgaSA+PSBzay0+bnVtKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIHNrLT5kYXRhW2ldID0gdmFsdWU7Cit9CisKK3ZvaWQgc2tfZnJlZShfU1RBQ0sgKnNrKSB7CisgIGlmIChzayA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIE9QRU5TU0xfZnJlZShzay0+ZGF0YSk7CisgIE9QRU5TU0xfZnJlZShzayk7Cit9CisKK3ZvaWQgc2tfcG9wX2ZyZWUoX1NUQUNLICpzaywgdm9pZCAoKmZ1bmMpKHZvaWQgKikpIHsKKyAgc2l6ZV90IGk7CisKKyAgaWYgKHNrID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgc2stPm51bTsgaSsrKSB7CisgICAgaWYgKHNrLT5kYXRhW2ldICE9IE5VTEwpIHsKKyAgICAgIGZ1bmMoc2stPmRhdGFbaV0pOworICAgIH0KKyAgfQorICBza19mcmVlKHNrKTsKK30KKworc2l6ZV90IHNrX2luc2VydChfU1RBQ0sgKnNrLCB2b2lkICpwLCBzaXplX3Qgd2hlcmUpIHsKKyAgaWYgKHNrID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChzay0+bnVtX2FsbG9jIDw9IHNrLT5udW0gKyAxKSB7CisgICAgLyogQXR0ZW1wdCB0byBkb3VibGUgdGhlIHNpemUgb2YgdGhlIGFycmF5LiAqLworICAgIHNpemVfdCBuZXdfYWxsb2MgPSBzay0+bnVtX2FsbG9jIDw8IDE7CisgICAgc2l6ZV90IGFsbG9jX3NpemUgPSBuZXdfYWxsb2MgKiBzaXplb2Yodm9pZCAqKTsKKyAgICB2b2lkICoqZGF0YTsKKworICAgIC8qIElmIHRoZSBkb3VibGluZyBvdmVyZmxvd2VkLCB0cnkgdG8gaW5jcmVtZW50LiAqLworICAgIGlmIChuZXdfYWxsb2MgPCBzay0+bnVtX2FsbG9jIHx8IGFsbG9jX3NpemUgLyBzaXplb2Yodm9pZCAqKSAhPSBuZXdfYWxsb2MpIHsKKyAgICAgIG5ld19hbGxvYyA9IHNrLT5udW1fYWxsb2MgKyAxOworICAgICAgYWxsb2Nfc2l6ZSA9IG5ld19hbGxvYyAqIHNpemVvZih2b2lkICopOworICAgIH0KKworICAgIC8qIElmIHRoZSBpbmNyZW1lbnQgYWxzbyBvdmVyZmxvd2VkLCBmYWlsLiAqLworICAgIGlmIChuZXdfYWxsb2MgPCBzay0+bnVtX2FsbG9jIHx8IGFsbG9jX3NpemUgLyBzaXplb2Yodm9pZCAqKSAhPSBuZXdfYWxsb2MpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGRhdGEgPSBPUEVOU1NMX3JlYWxsb2Moc2stPmRhdGEsIGFsbG9jX3NpemUpOworICAgIGlmIChkYXRhID09IE5VTEwpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHNrLT5kYXRhID0gZGF0YTsKKyAgICBzay0+bnVtX2FsbG9jID0gbmV3X2FsbG9jOworICB9CisKKyAgaWYgKHdoZXJlID49IHNrLT5udW0pIHsKKyAgICBzay0+ZGF0YVtzay0+bnVtXSA9IHA7CisgIH0gZWxzZSB7CisgICAgbWVtbW92ZSgmc2stPmRhdGFbd2hlcmUgKyAxXSwgJnNrLT5kYXRhW3doZXJlXSwKKyAgICAgICAgICAgIHNpemVvZih2b2lkICopICogKHNrLT5udW0gLSB3aGVyZSkpOworICAgIHNrLT5kYXRhW3doZXJlXSA9IHA7CisgIH0KKworICBzay0+bnVtKys7CisgIHNrLT5zb3J0ZWQgPSAwOworCisgIHJldHVybiBzay0+bnVtOworfQorCit2b2lkICpza19kZWxldGUoX1NUQUNLICpzaywgc2l6ZV90IHdoZXJlKSB7CisgIHZvaWQgKnJldDsKKworICBpZiAoIXNrIHx8IHdoZXJlID49IHNrLT5udW0pIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJldCA9IHNrLT5kYXRhW3doZXJlXTsKKworICBpZiAod2hlcmUgIT0gc2stPm51bSAtIDEpIHsKKyAgICBtZW1tb3ZlKCZzay0+ZGF0YVt3aGVyZV0sICZzay0+ZGF0YVt3aGVyZSArIDFdLAorICAgICAgICAgICAgc2l6ZW9mKHZvaWQgKikgKiAoc2stPm51bSAtIHdoZXJlIC0gMSkpOworICB9CisKKyAgc2stPm51bS0tOworICByZXR1cm4gcmV0OworfQorCit2b2lkICpza19kZWxldGVfcHRyKF9TVEFDSyAqc2ssIHZvaWQgKnApIHsKKyAgc2l6ZV90IGk7CisKKyAgaWYgKHNrID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBzay0+bnVtOyBpKyspIHsKKyAgICBpZiAoc2stPmRhdGFbaV0gPT0gcCkgeworICAgICAgcmV0dXJuIHNrX2RlbGV0ZShzaywgaSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK2ludCBza19maW5kKF9TVEFDSyAqc2ssIHNpemVfdCAqb3V0X2luZGV4LCB2b2lkICpwKSB7CisgIGNvbnN0IHZvaWQgKmNvbnN0ICpyOworICBzaXplX3QgaTsKKyAgaW50ICgqY29tcF9mdW5jKShjb25zdCB2b2lkICosY29uc3Qgdm9pZCAqKTsKKworICBpZiAoc2sgPT0gTlVMTCkgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmIChzay0+Y29tcCA9PSBOVUxMKSB7CisgICAgLyogVXNlIHBvaW50ZXIgZXF1YWxpdHkgd2hlbiBubyBjb21wYXJpc29uIGZ1bmN0aW9uIGhhcyBiZWVuIHNldC4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgc2stPm51bTsgaSsrKSB7CisgICAgICBpZiAoc2stPmRhdGFbaV0gPT0gcCkgeworICAgICAgICBpZiAob3V0X2luZGV4KSB7CisgICAgICAgICAgKm91dF9pbmRleCA9IGk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKHAgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgc2tfc29ydChzayk7CisKKyAgLyogc2stPmNvbXAgaXMgYSBmdW5jdGlvbiB0aGF0IHRha2VzIHBvaW50ZXJzIHRvIHBvaW50ZXJzIHRvIGVsZW1lbnRzLCBidXQKKyAgICogcXNvcnQgYW5kIGJzZWFyY2ggdGFrZSBhIGNvbXBhcmlzb24gZnVuY3Rpb24gdGhhdCBqdXN0IHRha2VzIHBvaW50ZXJzIHRvCisgICAqIGVsZW1lbnRzLiBIb3dldmVyLCBzaW5jZSB3ZSdyZSBwYXNzaW5nIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvCisgICAqIHFzb3J0L2JzZWFyY2gsIHdlIGNhbiBqdXN0IGNhc3QgdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24gYW5kIGV2ZXJ5dGhpbmcKKyAgICogd29ya3MuICovCisgIGNvbXBfZnVuYz0oaW50ICgqKShjb25zdCB2b2lkICosY29uc3Qgdm9pZCAqKSkoc2stPmNvbXApOworICByID0gYnNlYXJjaCgmcCwgc2stPmRhdGEsIHNrLT5udW0sIHNpemVvZih2b2lkICopLCBjb21wX2Z1bmMpOworICBpZiAociA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaSA9ICgodm9pZCAqKilyKSAtIHNrLT5kYXRhOworICAvKiBUaGlzIGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5zIHRoZSBmaXJzdCByZXN1bHQuICovCisgIHdoaWxlIChpID4gMCAmJiBzay0+Y29tcCgoY29uc3Qgdm9pZCoqKSAmcCwgKGNvbnN0IHZvaWQqKikgJnNrLT5kYXRhW2ktMV0pID09IDApIHsKKyAgICBpLS07CisgIH0KKyAgaWYgKG91dF9pbmRleCkgeworICAgICpvdXRfaW5kZXggPSBpOworICB9CisgIHJldHVybiAxOworfQorCit2b2lkICpza19zaGlmdChfU1RBQ0sgKnNrKSB7CisgIGlmIChzayA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNrLT5udW0gPT0gMCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBza19kZWxldGUoc2ssIDApOworfQorCitzaXplX3Qgc2tfcHVzaChfU1RBQ0sgKnNrLCB2b2lkICpwKSB7IHJldHVybiAoc2tfaW5zZXJ0KHNrLCBwLCBzay0+bnVtKSk7IH0KKwordm9pZCAqc2tfcG9wKF9TVEFDSyAqc2spIHsKKyAgaWYgKHNrID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc2stPm51bSA9PSAwKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIHNrX2RlbGV0ZShzaywgc2stPm51bSAtIDEpOworfQorCitfU1RBQ0sgKnNrX2R1cChjb25zdCBfU1RBQ0sgKnNrKSB7CisgIF9TVEFDSyAqcmV0OworICB2b2lkICoqczsKKworICBpZiAoc2sgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0ID0gc2tfbmV3KHNrLT5jb21wKTsKKyAgaWYgKHJldCA9PSBOVUxMKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBzID0gKHZvaWQgKiopT1BFTlNTTF9yZWFsbG9jKHJldC0+ZGF0YSwgc2l6ZW9mKHZvaWQgKikgKiBzay0+bnVtX2FsbG9jKTsKKyAgaWYgKHMgPT0gTlVMTCkgeworICAgIGdvdG8gZXJyOworICB9CisgIHJldC0+ZGF0YSA9IHM7CisKKyAgcmV0LT5udW0gPSBzay0+bnVtOworICBtZW1jcHkocmV0LT5kYXRhLCBzay0+ZGF0YSwgc2l6ZW9mKHZvaWQgKikgKiBzay0+bnVtKTsKKyAgcmV0LT5zb3J0ZWQgPSBzay0+c29ydGVkOworICByZXQtPm51bV9hbGxvYyA9IHNrLT5udW1fYWxsb2M7CisgIHJldC0+Y29tcCA9IHNrLT5jb21wOworICByZXR1cm4gcmV0OworCitlcnI6CisgIGlmIChyZXQpIHsKKyAgICBza19mcmVlKHJldCk7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgc2tfc29ydChfU1RBQ0sgKnNrKSB7CisgIGludCAoKmNvbXBfZnVuYykoY29uc3Qgdm9pZCAqLGNvbnN0IHZvaWQgKik7CisKKyAgaWYgKHNrID09IE5VTEwgfHwgc2stPnNvcnRlZCkgeworICAgIHJldHVybjsKKyAgfQorCisgIC8qIFNlZSB0aGUgY29tbWVudCBpbiBza19maW5kIGFib3V0IHRoaXMgY2FzdC4gKi8KKyAgY29tcF9mdW5jID0gKGludCAoKikoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKShzay0+Y29tcCk7CisgIHFzb3J0KHNrLT5kYXRhLCBzay0+bnVtLCBzaXplb2Yodm9pZCAqKSwgY29tcF9mdW5jKTsKKyAgc2stPnNvcnRlZCA9IDE7Cit9CisKK2ludCBza19pc19zb3J0ZWQoY29uc3QgX1NUQUNLICpzaykgeworICBpZiAoIXNrKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIHNrLT5zb3J0ZWQ7Cit9CisKK3N0YWNrX2NtcF9mdW5jIHNrX3NldF9jbXBfZnVuYyhfU1RBQ0sgKnNrLCBzdGFja19jbXBfZnVuYyBjb21wKSB7CisgIHN0YWNrX2NtcF9mdW5jIG9sZCA9IHNrLT5jb21wOworCisgIGlmIChzay0+Y29tcCAhPSBjb21wKSB7CisgICAgc2stPnNvcnRlZCA9IDA7CisgIH0KKyAgc2stPmNvbXAgPSBjb21wOworCisgIHJldHVybiBvbGQ7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vc3RhY2svc3RhY2suaCBiL2NyeXB0by9zdGFjay9zdGFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYmYxNjcKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3RhY2svc3RhY2suaApAQCAtMCwwICsxLDI5MSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2lmbmRlZiBPUEVOU1NMX0hFQURFUl9TVEFDS19ICisjZGVmaW5lIE9QRU5TU0xfSEVBREVSX1NUQUNLX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvYmFzZS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC90eXBlX2NoZWNrLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBBIHN0YWNrLCBpbiBPcGVuU1NMLCBpcyBhbiBhcnJheSBvZiBwb2ludGVycy4gVGhleSBhcmUgdGhlIG1vc3QgY29tbW9ubHkKKyAqIHVzZWQgY29sbGVjdGlvbiBvYmplY3QuCisgKgorICogVGhpcyBmaWxlIGRlZmluZXMgbWFjcm9zIGZvciB0eXBlIHNhZmUgdXNlIG9mIHRoZSBzdGFjayBmdW5jdGlvbnMuIEEgc3RhY2sKKyAqIG9mIGEgc3BlY2lmaWMgdHlwZSBvZiBvYmplY3QgaGFzIHR5cGUgfFNUQUNLX09GKHR5cGUpfC4gVGhpcyBjYW4gYmUgZGVmaW5lZAorICogKG9uY2UpIHdpdGggfERFRklORV9TVEFDS19PRih0eXBlKXwgYW5kIGRlY2xhcmVkIHdoZXJlIG5lZWRlZCB3aXRoCisgKiB8REVDTEFSRV9TVEFDS19PRih0eXBlKXwuIEZvciBleGFtcGxlOgorICoKKyAqICAgc3RydWN0IGZvbyB7CisgKiAgICAgaW50IGJhcjsKKyAqICAgfTsKKyAqCisgKiAgIERFRklORV9TVEFDS19PRihzdHJ1Y3QgZm9vKTsKKyAqCisgKiBBbHRob3VnaCBub3RlIHRoYXQgdGhlIHN0YWNrIHdpbGwgY29udGFpbiAvcG9pbnRlcnMvIHRvIHxmb298LgorICoKKyAqIEEgbWFjcm8gd2lsbCBiZSBkZWZpbmVkIGZvciBlYWNoIG9mIHRoZSBza18qIGZ1bmN0aW9ucyBiZWxvdy4gRm9yCisgKiBTVEFDS19PRihmb28pLCB0aGUgbWFjcm9zIHdvdWxkIGJlIHNrX2Zvb19uZXcsIHNrX2Zvb19wb3AgZXRjLiAqLworCisKKy8qIHN0YWNrX2NtcF9mdW5jIGlzIGEgY29tcGFyaXNpb24gZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgdmFsdWUgPCAwLCAwIG9yID4gMAorICogaWYgfCphfCBpcyBsZXNzIHRoYW4sIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbiB8KmJ8LCByZXNwZWN0aXZlbHkuICBOb3RlIHRoZQorICogZXh0cmEgaW5kaXJlY3Rpb24gLSB0aGUgZnVuY3Rpb24gaXMgZ2l2ZW4gYSBwb2ludGVyIHRvIGEgcG9pbnRlciB0byB0aGUKKyAqIGVsZW1lbnQuIFRoaXMgZGlmZmVycyBmcm9tIHRoZSB1c3VhbCBxc29ydC9ic2VhcmNoIGNvbXBhcmlzaW9uIGZ1bmN0aW9uLiAqLwordHlwZWRlZiBpbnQgKCpzdGFja19jbXBfZnVuYykoY29uc3Qgdm9pZCAqKmEsIGNvbnN0IHZvaWQgKipiKTsKKworLyogc3RhY2tfc3QgY29udGFpbnMgYW4gYXJyYXkgb2YgcG9pbnRlcnMuIEl0IGlzIG5vdCBkZXNpZ25lZCB0byBiZSB1c2VkCisgKiBkaXJlY3RseSwgcmF0aGVyIHRoZSB3cmFwcGVyIG1hY3JvcyBzaG91bGQgYmUgdXNlZC4gKi8KK3R5cGVkZWYgc3RydWN0IHN0YWNrX3N0IHsKKyAgLyogbnVtIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgdmFsaWQgcG9pbnRlcnMgaW4gfGRhdGF8LiAqLworICBzaXplX3QgbnVtOworICB2b2lkICoqZGF0YTsKKyAgLyogc29ydGVkIGlzIG5vbi16ZXJvIGlmIHRoZSB2YWx1ZXMgcG9pbnRlZCB0byBieSB8ZGF0YXwgYXJlIGluIGFzY2VuZGluZworICAgKiBvcmRlciwgYmFzZWQgb24gfGNvbXB8LiAqLworICBzaXplX3Qgc29ydGVkOworICAvKiBudW1fYWxsb2MgY29udGFpbnMgdGhlIG51bWJlciBvZiBwb2ludGVycyBhbGxvY2F0ZWQgaW4gdGhlIGJ1ZmZlciBwb2ludGVkCisgICAqIHRvIGJ5IHxkYXRhfCwgd2hpY2ggbWF5IGJlIGxhcmdlciB0aGFuIHxudW18LiAqLworICBzaXplX3QgbnVtX2FsbG9jOworICAvKiBjb21wIGlzIGFuIG9wdGlvbmFsIGNvbXBhcmlzaW9uIGZ1bmN0aW9uLiAqLworICBzdGFja19jbXBfZnVuYyBjb21wOworfSBfU1RBQ0s7CisKKworI2RlZmluZSBTVEFDS19PRih0eXBlKSBzdHJ1Y3Qgc3RhY2tfc3RfIyN0eXBlCisKKyNkZWZpbmUgREVGSU5FX1NUQUNLX09GKHR5cGUpIFwKK1NUQUNLX09GKHR5cGUpIHtcCisgIF9TVEFDSyBzdGFjazsgXAorfTsKKworI2RlZmluZSBERUNMQVJFX1NUQUNLX09GKHR5cGUpIFNUQUNLX09GKHR5cGUpOworCisvKiBUaGUgbWFrZV9tYWNyb3Muc2ggc2NyaXB0IGluIHRoaXMgZGlyZWN0b3J5IHBhcnNlcyB0aGUgZm9sbG93aW5nIGxpbmVzIGFuZAorICogZ2VuZXJhdGVzIHRoZSBzdGFja19tYWNyb3MuaCBmaWxlIHRoYXQgY29udGFpbnMgbWFjcm9zIGZvciB0aGUgZm9sbG93aW5nCisgKiB0eXBlcyBvZiBzdGFja3M6CisgKgorICogU1RBQ0tfT0Y6QUNDRVNTX0RFU0NSSVBUSU9OCisgKiBTVEFDS19PRjpBU04xX0FEQl9UQUJMRQorICogU1RBQ0tfT0Y6QVNOMV9HRU5FUkFMU1RSSU5HCisgKiBTVEFDS19PRjpBU04xX0lOVEVHRVIKKyAqIFNUQUNLX09GOkFTTjFfT0JKRUNUCisgKiBTVEFDS19PRjpBU04xX1NUUklOR19UQUJMRQorICogU1RBQ0tfT0Y6QVNOMV9UWVBFCisgKiBTVEFDS19PRjpBU04xX1ZBTFVFCisgKiBTVEFDS19PRjpCSU8KKyAqIFNUQUNLX09GOkJZX0RJUl9FTlRSWQorICogU1RBQ0tfT0Y6QllfRElSX0hBU0gKKyAqIFNUQUNLX09GOkNPTkZfVkFMVUUKKyAqIFNUQUNLX09GOkNSWVBUT19FWF9EQVRBX0ZVTkNTCisgKiBTVEFDS19PRjpESVNUX1BPSU5UCisgKiBTVEFDS19PRjpHRU5FUkFMX05BTUUKKyAqIFNUQUNLX09GOkdFTkVSQUxfTkFNRVMKKyAqIFNUQUNLX09GOkdFTkVSQUxfU1VCVFJFRQorICogU1RBQ0tfT0Y6TUlNRV9IRUFERVIKKyAqIFNUQUNLX09GOlBLQ1M3X1NJR05FUl9JTkZPCisgKiBTVEFDS19PRjpQS0NTN19SRUNJUF9JTkZPCisgKiBTVEFDS19PRjpQT0xJQ1lJTkZPCisgKiBTVEFDS19PRjpQT0xJQ1lRVUFMSU5GTworICogU1RBQ0tfT0Y6UE9MSUNZX01BUFBJTkcKKyAqIFNUQUNLX09GOlNSVFBfUFJPVEVDVElPTl9QUk9GSUxFCisgKiBTVEFDS19PRjpTU0xfQ0lQSEVSCisgKiBTVEFDS19PRjpTU0xfQ09NUAorICogU1RBQ0tfT0Y6U1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZCisgKiBTVEFDS19PRjpTWE5FVElECisgKiBTVEFDS19PRjpYNTA5CisgKiBTVEFDS19PRjpYNTA5VjNfRVhUX01FVEhPRAorICogU1RBQ0tfT0Y6WDUwOV9BTEdPUgorICogU1RBQ0tfT0Y6WDUwOV9BVFRSSUJVVEUKKyAqIFNUQUNLX09GOlg1MDlfQ1JMCisgKiBTVEFDS19PRjpYNTA5X0VYVEVOU0lPTgorICogU1RBQ0tfT0Y6WDUwOV9JTkZPCisgKiBTVEFDS19PRjpYNTA5X0xPT0tVUAorICogU1RBQ0tfT0Y6WDUwOV9OQU1FCisgKiBTVEFDS19PRjpYNTA5X05BTUVfRU5UUlkKKyAqIFNUQUNLX09GOlg1MDlfTkFNRV9FTlRSWQorICogU1RBQ0tfT0Y6WDUwOV9PQkpFQ1QKKyAqIFNUQUNLX09GOlg1MDlfUE9MSUNZX0RBVEEKKyAqIFNUQUNLX09GOlg1MDlfUE9MSUNZX05PREUKKyAqIFNUQUNLX09GOlg1MDlfUFVSUE9TRQorICogU1RBQ0tfT0Y6WDUwOV9SRVZPS0VECisgKiBTVEFDS19PRjpYNTA5X1RSVVNUCisgKiBTVEFDS19PRjpYNTA5X1ZFUklGWV9QQVJBTQorICogU1RBQ0tfT0Y6dm9pZCAqLworCisKKy8qIFNvbWUgc3RhY2tzIGFyZSBzcGVjaWFsIGJlY2F1c2UsIGFsdGhvdWdoIHdlIHdvdWxkIGxpa2UgU1RBQ0tfT0YoY2hhciAqKSwKKyAqIHRoYXQgd291bGQgYWN0dWFsbHkgYmUgYSBzdGFjayBvZiBwb2ludGVycyB0byBjaGFyKiwgYnV0IHdlIGp1c3Qgd2FudCB0bworICogcG9pbnQgdG8gdGhlIHN0cmluZyBkaXJlY3RseS4gSW4gdGhpcyBjYXNlIHdlIGNhbGwgdGhlbSAic3BlY2lhbCIgYW5kIHVzZQorICogfERFRklORV9TUEVDSUFMX1NUQUNLX09GKHR5cGUpfCAqLworI2RlZmluZSBERUZJTkVfU1BFQ0lBTF9TVEFDS19PRih0eXBlLCBpbm5lcikgICAgICAgICAgICAgXAorICBTVEFDS19PRih0eXBlKSB7IF9TVEFDSyBzcGVjaWFsX3N0YWNrOyB9OyAgICAgICAgICAgICAgXAorICBPUEVOU1NMX0NPTVBJTEVfQVNTRVJUKHNpemVvZih0eXBlKSA9PSBzaXplb2Yodm9pZCAqKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxfc3RhY2tfb2Zfbm9uX3BvaW50ZXJfIyN0eXBlKTsKKwordHlwZWRlZiBjaGFyICpPUEVOU1NMX1NUUklORzsKKworREVGSU5FX1NQRUNJQUxfU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcsIGNoYXIpCitERUZJTkVfU1BFQ0lBTF9TVEFDS19PRihPUEVOU1NMX0JMT0NLLCB1aW50OF90KQorCisvKiBUaGUgbWFrZV9tYWNyb3Muc2ggc2NyaXB0IGluIHRoaXMgZGlyZWN0b3J5IHBhcnNlcyB0aGUgZm9sbG93aW5nIGxpbmVzIGFuZAorICogZ2VuZXJhdGVzIHRoZSBzdGFja19tYWNyb3MuaCBmaWxlIHRoYXQgY29udGFpbnMgbWFjcm9zIGZvciB0aGUgZm9sbG93aW5nCisgKiB0eXBlcyBvZiBzdGFja3M6CisgKgorICogU1BFQ0lBTF9TVEFDS19PRjpPUEVOU1NMX1NUUklORworICogU1BFQ0lBTF9TVEFDS19PRjpPUEVOU1NMX0JMT0NLICovCisKKyNkZWZpbmUgSU5fU1RBQ0tfSAorI2luY2x1ZGUgPG9wZW5zc2wvc3RhY2tfbWFjcm9zLmg+CisjdW5kZWYgSU5fU1RBQ0tfSAorCisKKy8qIFRoZXNlIGFyZSB0aGUgcmF3IHN0YWNrIGZ1bmN0aW9ucywgeW91IHNob3VsZG4ndCBiZSB1c2luZyB0aGVtLiBSYXRoZXIgeW91CisgKiBzaG91bGQgYmUgdXNpbmcgdGhlIHR5cGUgc3RhY2sgbWFjcm9zIGltcGxlbWVudGVkIGFib3ZlLiAqLworCisvKiBza19uZXcgY3JlYXRlcyBhIG5ldywgZW1wdHkgc3RhY2sgd2l0aCB0aGUgZ2l2ZW4gY29tcGFyaXNpb24gZnVuY3Rpb24sIHdoaWNoCisgKiBtYXkgYmUgemVyby4gSXQgcmV0dXJucyB0aGUgbmV3IHN0YWNrIG9yIE5VTEwgb24gYWxsb2NhdGlvbiBmYWlsdXJlLiAqLworX1NUQUNLICpza19uZXcoc3RhY2tfY21wX2Z1bmMgY29tcCk7CisKKy8qIHNrX25ld19udWxsIGNyZWF0ZXMgYSBuZXcsIGVtcHR5IHN0YWNrLiBJdCByZXR1cm5zIHRoZSBuZXcgc3RhY2sgb3IgTlVMTCBvbgorICogYWxsb2NhdGlvbiBmYWlsdXJlLiAqLworX1NUQUNLICpza19uZXdfbnVsbCh2b2lkKTsKKworLyogc2tfbnVtIHJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB8c3wuICovCitzaXplX3Qgc2tfbnVtKGNvbnN0IF9TVEFDSyAqc2spOworCisvKiBza196ZXJvIHJlc2V0cyB8c2t8IHRvIHRoZSBlbXB0eSBzdGF0ZSBidXQgZG9lcyBub3RoaW5nIHRvIGZyZWUgdGhlCisgKiBpbmRpdmlkdWFsIGVsZW1lbnRzIHRoZW1zZWx2ZXMuICovCit2b2lkIHNrX3plcm8oX1NUQUNLICpzayk7CisKKy8qIHNrX3ZhbHVlIHJldHVybnMgdGhlIHxpfHRoIHBvaW50ZXIgaW4gfHNrfCwgb3IgTlVMTCBpZiB8aXwgaXMgb3V0IG9mCisgKiByYW5nZS4gKi8KK3ZvaWQgKnNrX3ZhbHVlKGNvbnN0IF9TVEFDSyAqc2ssIHNpemVfdCBpKTsKKworLyogc2tfc2V0IHNldHMgdGhlIHxpfHRoIHBvaW50ZXIgaW4gfHNrfCB0byB8cHwgYW5kIHJldHVybnMgfHB8LiBJZiB8aXwgaXMgb3V0CisgKiBvZiByYW5nZSwgaXQgcmV0dXJucyBOVUxMLiAqLwordm9pZCAqc2tfc2V0KF9TVEFDSyAqc2ssIHNpemVfdCBpLCB2b2lkICpwKTsKKworLyogc2tfZnJlZSBmcmVlcyB0aGUgZ2l2ZW4gc3RhY2sgYW5kIGFycmF5IG9mIHBvaW50ZXJzLCBidXQgZG9lcyBub3RoaW5nIHRvCisgKiBmcmVlIHRoZSBpbmRpdmlkdWFsIGVsZW1lbnRzLiBBbHNvIHNlZSB8c2tfcG9wX2ZyZWV8LiAqLwordm9pZCBza19mcmVlKF9TVEFDSyAqc2spOworCisvKiBza19wb3BfZnJlZSBjYWxscyB8ZnJlZV9mdW5jfCBvbiBlYWNoIGVsZW1lbnQgaW4gdGhlIHN0YWNrIGFuZCB0aGVuIGZyZWVzCisgKiB0aGUgc3RhY2sgaXRzZWxmLiAqLwordm9pZCBza19wb3BfZnJlZShfU1RBQ0sgKnNrLCB2b2lkICgqZnJlZV9mdW5jKSh2b2lkICopKTsKKworLyogc2tfaW5zZXJ0IGluc2VydHMgfHB8IGludG8gdGhlIHN0YWNrIGF0IGluZGV4IHx3aGVyZXwsIG1vdmluZyBleGlzdGluZworICogZWxlbWVudHMgaWYgbmVlZGVkLiBJdCByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG5ldyBzdGFjaywgb3IgemVybyBvbgorICogZXJyb3IuICovCitzaXplX3Qgc2tfaW5zZXJ0KF9TVEFDSyAqc2ssIHZvaWQgKnAsIHNpemVfdCB3aGVyZSk7CisKKy8qIHNrX2RlbGV0ZSByZW1vdmVzIHRoZSBwb2ludGVyIGF0IGluZGV4IHx3aGVyZXwsIG1vdmluZyBvdGhlciBlbGVtZW50cyBkb3duCisgKiBpZiBuZWVkZWQuIEl0IHJldHVybnMgdGhlIHJlbW92ZWQgcG9pbnRlciwgb3IgTlVMTCBpZiB8d2hlcmV8IGlzIG91dCBvZgorICogcmFuZ2UuICovCit2b2lkICpza19kZWxldGUoX1NUQUNLICpzaywgc2l6ZV90IHdoZXJlKTsKKworLyogc2tfZGVsZXRlX3B0ciByZW1vdmVzLCBhdCBtb3N0LCBvbmUgaW5zdGFuY2Ugb2YgfHB8IGZyb20gdGhlIHN0YWNrIGJhc2VkIG9uCisgKiBwb2ludGVyIGVxdWFsaXR5LiBJZiBhbiBpbnN0YW5jZSBvZiB8cHwgaXMgZm91bmQgdGhlbiB8cHwgaXMgcmV0dXJuZWQsCisgKiBvdGhlcndpc2UgaXQgcmV0dXJucyBOVUxMLiAqLwordm9pZCAqc2tfZGVsZXRlX3B0cihfU1RBQ0sgKnNrLCB2b2lkICpwKTsKKworLyogc2tfZmluZCByZXR1cm5zIHRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUgc3RhY2sgZXF1YWwgdG8gfHB8LiBJZiBhIGNvbXBhcmlzaW9uCisgKiBmdW5jdGlvbiBoYXMgYmVlbiBzZXQgb24gdGhlIHN0YWNrLCB0aGVuIGVxdWFsaXR5IGlzIGRlZmluZWQgYnkgaXQgYW5kIHRoZQorICogc3RhY2sgd2lsbCBiZSBzb3J0ZWQgaWYgbmVlZCBiZSBzbyB0aGF0IGEgYmluYXJ5IHNlYXJjaCBjYW4gYmUgdXNlZC4KKyAqIE90aGVyd2lzZSBwb2ludGVyIGVxdWFsaXR5IGlzIHVzZWQuIElmIGEgbWF0Y2hpbmcgZWxlbWVudCBpcyBmb3VuZCwgaXRzCisgKiBpbmRleCBpcyB3cml0dGVuIHRvIHwqb3V0X2luZGV4fCAoaWYgfG91dF9pbmRleHwgaXMgbm90IE5VTEwpIGFuZCBvbmUgaXMKKyAqIHJldHVybmVkLiBPdGhlcndpc2UgemVybyBpcyByZXR1cm5lZC4gKi8KK2ludCBza19maW5kKF9TVEFDSyAqc2ssIHNpemVfdCAqb3V0X2luZGV4LCB2b2lkICpwKTsKKworLyogc2tfc2hpZnQgcmVtb3ZlcyBhbmQgcmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgc3RhY2ssIG9yIHJldHVybnMgTlVMTAorICogaWYgdGhlIHN0YWNrIGlzIGVtcHR5LiAqLwordm9pZCAqc2tfc2hpZnQoX1NUQUNLICpzayk7CisKKy8qIHNrX3B1c2ggYXBwZW5kcyB8cHwgdG8gdGhlIHN0YWNrIGFuZCByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG5ldyBzdGFjaywgb3IKKyAqIDAgb24gYWxsb2NhdGlvbiBmYWlsdXJlLiAqLworc2l6ZV90IHNrX3B1c2goX1NUQUNLICpzaywgdm9pZCAqcCk7CisKKy8qIHNrX3BvcCByZXR1cm5zIGFuZCByZW1vdmVzIHRoZSBsYXN0IGVsZW1lbnQgb24gdGhlIHN0YWNrLCBvciBOVUxMIGlmIHRoZQorICogc3RhY2sgaXMgZW1wdHkuICovCit2b2lkICpza19wb3AoX1NUQUNLICpzayk7CisKKy8qIHNrX2R1cCBwZXJmb3JtcyBhIHNoYWxsb3cgY29weSBvZiBhIHN0YWNrIGFuZCByZXR1cm5zIHRoZSBuZXcgc3RhY2ssIG9yIE5VTEwKKyAqIG9uIGVycm9yLiAqLworX1NUQUNLICpza19kdXAoY29uc3QgX1NUQUNLICpzayk7CisKKy8qIHNrX3NvcnQgc29ydHMgdGhlIGVsZW1lbnRzIG9mIHxza3wgaW50byBhc2NlbmRpbmcgb3JkZXIgYmFzZWQgb24gdGhlCisgKiBjb21wYXJpc29uIGZ1bmN0aW9uLiBUaGUgc3RhY2sgbWFpbnRhaW5zIGEgfHNvcnRlZHwgZmxhZyBhbmQgc29ydGluZyBhbgorICogYWxyZWFkeSBzb3J0ZWQgc3RhY2sgaXMgYSBuby1vcC4gKi8KK3ZvaWQgc2tfc29ydChfU1RBQ0sgKnNrKTsKKworLyogc2tfaXNfc29ydGVkIHJldHVybnMgb25lIGlmIHxza3wgaXMga25vd24gdG8gYmUgc29ydGVkIGFuZCB6ZXJvCisgKiBvdGhlcndpc2UuICovCitpbnQgc2tfaXNfc29ydGVkKGNvbnN0IF9TVEFDSyAqc2spOworCisvKiBza19zZXRfY21wX2Z1bmMgc2V0cyB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbiB0byBiZSB1c2VkIGJ5IHxza3wgYW5kIHJldHVybnMKKyAqIHRoZSBwcmV2aW91cyBvbmUuICovCitzdGFja19jbXBfZnVuYyBza19zZXRfY21wX2Z1bmMoX1NUQUNLICpzaywgc3RhY2tfY21wX2Z1bmMgY29tcCk7CisKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9ICAvKiBleHRlcm4gQyAqLworI2VuZGlmCisKKyNlbmRpZiAgLyogT1BFTlNTTF9IRUFERVJfU1RBQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3N0YWNrL3N0YWNrX21hY3Jvcy5oIGIvY3J5cHRvL3N0YWNrL3N0YWNrX21hY3Jvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOTI0YzgKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vc3RhY2svc3RhY2tfbWFjcm9zLmgKQEAgLTAsMCArMSwzNzMxIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTQsIEdvb2dsZSBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuICovCisKKyNpZiAhZGVmaW5lZChJTl9TVEFDS19IKQorI2Vycm9yICJEb24ndCBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseS4gSW5jbHVkZSBzdGFjay5oLiIKKyNlbmRpZgorCisvKiBBQ0NFU1NfREVTQ1JJUFRJT04gKi8KKyNkZWZpbmUgc2tfQUNDRVNTX0RFU0NSSVBUSU9OX25ldyhjb21wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChTVEFDS19PRihBQ0NFU1NfREVTQ1JJUFRJT04pICopc2tfbmV3KENIRUNLRURfQ0FTVCggICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN0YWNrX2NtcF9mdW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGludCAoKikoY29uc3QgQUNDRVNTX0RFU0NSSVBUSU9OICoqYSwgY29uc3QgQUNDRVNTX0RFU0NSSVBUSU9OICoqYiksIFwKKyAgICAgIGNvbXApKSkKKworI2RlZmluZSBza19BQ0NFU1NfREVTQ1JJUFRJT05fbmV3X251bGwoKSBcCisgICgoU1RBQ0tfT0YoQUNDRVNTX0RFU0NSSVBUSU9OKSAqKXNrX25ld19udWxsKCkpCisKKyNkZWZpbmUgc2tfQUNDRVNTX0RFU0NSSVBUSU9OX251bShzaykgXAorICBza19udW0oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihBQ0NFU1NfREVTQ1JJUFRJT04pICosIHNrKSkKKworI2RlZmluZSBza19BQ0NFU1NfREVTQ1JJUFRJT05femVybyhzaykgXAorICBza196ZXJvKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQUNDRVNTX0RFU0NSSVBUSU9OKSAqLCBzaykpOworCisjZGVmaW5lIHNrX0FDQ0VTU19ERVNDUklQVElPTl92YWx1ZShzaywgaSkgXAorICAoKEFDQ0VTU19ERVNDUklQVElPTiAqKXNrX3ZhbHVlKCAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoQUNDRVNTX0RFU0NSSVBUSU9OKSAqLCBzayksIChpKSkpCisKKyNkZWZpbmUgc2tfQUNDRVNTX0RFU0NSSVBUSU9OX3NldChzaywgaSwgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKEFDQ0VTU19ERVNDUklQVElPTiAqKXNrX3NldCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFDQ0VTU19ERVNDUklQVElPTikgKiwgc2spLCAoaSksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIEFDQ0VTU19ERVNDUklQVElPTiAqLCBwKSkpCisKKyNkZWZpbmUgc2tfQUNDRVNTX0RFU0NSSVBUSU9OX2ZyZWUoc2spIFwKKyAgc2tfZnJlZShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFDQ0VTU19ERVNDUklQVElPTikgKiwgc2spKQorCisjZGVmaW5lIHNrX0FDQ0VTU19ERVNDUklQVElPTl9wb3BfZnJlZShzaywgZnJlZV9mdW5jKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfcG9wX2ZyZWUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihBQ0NFU1NfREVTQ1JJUFRJT04pICosIHNrKSwgICAgXAorICAgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAoKikodm9pZCAqKSwgdm9pZCAoKikoQUNDRVNTX0RFU0NSSVBUSU9OICopLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX2Z1bmMpKQorCisjZGVmaW5lIHNrX0FDQ0VTU19ERVNDUklQVElPTl9pbnNlcnQoc2ssIHAsIHdoZXJlKSAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX2luc2VydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFDQ0VTU19ERVNDUklQVElPTikgKiwgc2spLCBcCisgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBBQ0NFU1NfREVTQ1JJUFRJT04gKiwgcCksICh3aGVyZSkpCisKKyNkZWZpbmUgc2tfQUNDRVNTX0RFU0NSSVBUSU9OX2RlbGV0ZShzaywgd2hlcmUpIFwKKyAgKChBQ0NFU1NfREVTQ1JJUFRJT04gKilza19kZWxldGUoICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQUNDRVNTX0RFU0NSSVBUSU9OKSAqLCBzayksICh3aGVyZSkpKQorCisjZGVmaW5lIHNrX0FDQ0VTU19ERVNDUklQVElPTl9kZWxldGVfcHRyKHNrLCBwKSAgICAgICAgICAgICAgICAgICBcCisgICgoQUNDRVNTX0RFU0NSSVBUSU9OICopc2tfZGVsZXRlX3B0ciggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFDQ0VTU19ERVNDUklQVElPTikgKiwgc2spLCBcCisgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBBQ0NFU1NfREVTQ1JJUFRJT04gKiwgcCkpKQorCisjZGVmaW5lIHNrX0FDQ0VTU19ERVNDUklQVElPTl9maW5kKHNrLCBvdXRfaW5kZXgsIHApICAgICAgICAgICAgICAgICAgXAorICBza19maW5kKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQUNDRVNTX0RFU0NSSVBUSU9OKSAqLCBzayksIFwKKyAgICAgICAgICAob3V0X2luZGV4KSwgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgQUNDRVNTX0RFU0NSSVBUSU9OICosIHApKQorCisjZGVmaW5lIHNrX0FDQ0VTU19ERVNDUklQVElPTl9zaGlmdChzaykgXAorICAoKEFDQ0VTU19ERVNDUklQVElPTiAqKXNrX3NoaWZ0KCAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQUNDRVNTX0RFU0NSSVBUSU9OKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX0FDQ0VTU19ERVNDUklQVElPTl9wdXNoKHNrLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBza19wdXNoKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQUNDRVNTX0RFU0NSSVBUSU9OKSAqLCBzayksIFwKKyAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBBQ0NFU1NfREVTQ1JJUFRJT04gKiwgcCkpCisKKyNkZWZpbmUgc2tfQUNDRVNTX0RFU0NSSVBUSU9OX3BvcChzaykgXAorICAoKEFDQ0VTU19ERVNDUklQVElPTiAqKXNrX3BvcCggICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFDQ0VTU19ERVNDUklQVElPTikgKiwgc2spKSkKKworI2RlZmluZSBza19BQ0NFU1NfREVTQ1JJUFRJT05fZHVwKHNrKSAgICAgIFwKKyAgKChTVEFDS19PRihBQ0NFU1NfREVTQ1JJUFRJT04pICopc2tfZHVwKCBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKEFDQ0VTU19ERVNDUklQVElPTikgKiwgc2spKSkKKworI2RlZmluZSBza19BQ0NFU1NfREVTQ1JJUFRJT05fc29ydChzaykgXAorICBza19zb3J0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQUNDRVNTX0RFU0NSSVBUSU9OKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfQUNDRVNTX0RFU0NSSVBUSU9OX2lzX3NvcnRlZChzaykgXAorICBza19pc19zb3J0ZWQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihBQ0NFU1NfREVTQ1JJUFRJT04pICosIHNrKSkKKworI2RlZmluZSBza19BQ0NFU1NfREVTQ1JJUFRJT05fc2V0X2NtcF9mdW5jKHNrLCBjb21wKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKGludCAoKikoY29uc3QgQUNDRVNTX0RFU0NSSVBUSU9OICoqYSwgY29uc3QgQUNDRVNTX0RFU0NSSVBUSU9OICoqYikpICAgXAorICAgc2tfc2V0X2NtcF9mdW5jKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQUNDRVNTX0RFU0NSSVBUSU9OKSAqLCBzayksICAgICAgICAgXAorICAgICAgIENIRUNLRURfQ0FTVChzdGFja19jbXBfZnVuYywgaW50ICgqKShjb25zdCBBQ0NFU1NfREVTQ1JJUFRJT04gKiphLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBQ0NFU1NfREVTQ1JJUFRJT04gKipiKSwgXAorICAgICAgICAgICAgICAgICAgICBjb21wKSkpCisKKy8qIEFTTjFfQURCX1RBQkxFICovCisjZGVmaW5lIHNrX0FTTjFfQURCX1RBQkxFX25ldyhjb21wKSAgICAgICAgICAgICAgICAgXAorICAoKFNUQUNLX09GKEFTTjFfQURCX1RBQkxFKSAqKXNrX25ldyhDSEVDS0VEX0NBU1QoIFwKKyAgICAgIHN0YWNrX2NtcF9mdW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpbnQgKCopKGNvbnN0IEFTTjFfQURCX1RBQkxFICoqYSwgY29uc3QgQVNOMV9BREJfVEFCTEUgKipiKSwgY29tcCkpKQorCisjZGVmaW5lIHNrX0FTTjFfQURCX1RBQkxFX25ld19udWxsKCkgKChTVEFDS19PRihBU04xX0FEQl9UQUJMRSkgKilza19uZXdfbnVsbCgpKQorCisjZGVmaW5lIHNrX0FTTjFfQURCX1RBQkxFX251bShzaykgXAorICBza19udW0oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihBU04xX0FEQl9UQUJMRSkgKiwgc2spKQorCisjZGVmaW5lIHNrX0FTTjFfQURCX1RBQkxFX3plcm8oc2spIFwKKyAgc2tfemVybyhDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfQURCX1RBQkxFKSAqLCBzaykpOworCisjZGVmaW5lIHNrX0FTTjFfQURCX1RBQkxFX3ZhbHVlKHNrLCBpKSBcCisgICgoQVNOMV9BREJfVEFCTEUgKilza192YWx1ZSggICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKEFTTjFfQURCX1RBQkxFKSAqLCBzayksIChpKSkpCisKKyNkZWZpbmUgc2tfQVNOMV9BREJfVEFCTEVfc2V0KHNrLCBpLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoQVNOMV9BREJfVEFCTEUgKilza19zZXQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihBU04xX0FEQl9UQUJMRSkgKiwgc2spLCAoaSksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIEFTTjFfQURCX1RBQkxFICosIHApKSkKKworI2RlZmluZSBza19BU04xX0FEQl9UQUJMRV9mcmVlKHNrKSBcCisgIHNrX2ZyZWUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihBU04xX0FEQl9UQUJMRSkgKiwgc2spKQorCisjZGVmaW5lIHNrX0FTTjFfQURCX1RBQkxFX3BvcF9mcmVlKHNrLCBmcmVlX2Z1bmMpICAgICAgICAgICAgIFwKKyAgc2tfcG9wX2ZyZWUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihBU04xX0FEQl9UQUJMRSkgKiwgc2spLCBcCisgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAoKikodm9pZCAqKSwgdm9pZCAoKikoQVNOMV9BREJfVEFCTEUgKiksIGZyZWVfZnVuYykpCisKKyNkZWZpbmUgc2tfQVNOMV9BREJfVEFCTEVfaW5zZXJ0KHNrLCBwLCB3aGVyZSkgICAgICAgICAgICAgICAgICAgICAgXAorICBza19pbnNlcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihBU04xX0FEQl9UQUJMRSkgKiwgc2spLCBcCisgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBBU04xX0FEQl9UQUJMRSAqLCBwKSwgKHdoZXJlKSkKKworI2RlZmluZSBza19BU04xX0FEQl9UQUJMRV9kZWxldGUoc2ssIHdoZXJlKSBcCisgICgoQVNOMV9BREJfVEFCTEUgKilza19kZWxldGUoICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9BREJfVEFCTEUpICosIHNrKSwgKHdoZXJlKSkpCisKKyNkZWZpbmUgc2tfQVNOMV9BREJfVEFCTEVfZGVsZXRlX3B0cihzaywgcCkgICAgICAgICAgICAgICAgICAgXAorICAoKEFTTjFfQURCX1RBQkxFICopc2tfZGVsZXRlX3B0ciggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfQURCX1RBQkxFKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIEFTTjFfQURCX1RBQkxFICosIHApKSkKKworI2RlZmluZSBza19BU04xX0FEQl9UQUJMRV9maW5kKHNrLCBvdXRfaW5kZXgsIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfZmluZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfQURCX1RBQkxFKSAqLCBzayksIChvdXRfaW5kZXgpLCBcCisgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgQVNOMV9BREJfVEFCTEUgKiwgcCkpCisKKyNkZWZpbmUgc2tfQVNOMV9BREJfVEFCTEVfc2hpZnQoc2spIFwKKyAgKChBU04xX0FEQl9UQUJMRSAqKXNrX3NoaWZ0KCAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9BREJfVEFCTEUpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfQVNOMV9BREJfVEFCTEVfcHVzaChzaywgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfcHVzaChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfQURCX1RBQkxFKSAqLCBzayksIFwKKyAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBBU04xX0FEQl9UQUJMRSAqLCBwKSkKKworI2RlZmluZSBza19BU04xX0FEQl9UQUJMRV9wb3Aoc2spIFwKKyAgKChBU04xX0FEQl9UQUJMRSAqKXNrX3BvcCggICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfQURCX1RBQkxFKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX0FTTjFfQURCX1RBQkxFX2R1cChzaykgICAgICBcCisgICgoU1RBQ0tfT0YoQVNOMV9BREJfVEFCTEUpICopc2tfZHVwKCBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKEFTTjFfQURCX1RBQkxFKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX0FTTjFfQURCX1RBQkxFX3NvcnQoc2spIFwKKyAgc2tfc29ydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfQURCX1RBQkxFKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfQVNOMV9BREJfVEFCTEVfaXNfc29ydGVkKHNrKSBcCisgIHNrX2lzX3NvcnRlZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKEFTTjFfQURCX1RBQkxFKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfQVNOMV9BREJfVEFCTEVfc2V0X2NtcF9mdW5jKHNrLCBjb21wKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKGludCAoKikoY29uc3QgQVNOMV9BREJfVEFCTEUgKiphLCBjb25zdCBBU04xX0FEQl9UQUJMRSAqKmIpKSAgICAgICBcCisgICBza19zZXRfY21wX2Z1bmMoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfQURCX1RBQkxFKSAqLCBzayksICAgICAgICAgXAorICAgICAgIENIRUNLRURfQ0FTVChzdGFja19jbXBfZnVuYywgaW50ICgqKShjb25zdCBBU04xX0FEQl9UQUJMRSAqKmEsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFTTjFfQURCX1RBQkxFICoqYiksIFwKKyAgICAgICAgICAgICAgICAgICAgY29tcCkpKQorCisvKiBBU04xX0dFTkVSQUxTVFJJTkcgKi8KKyNkZWZpbmUgc2tfQVNOMV9HRU5FUkFMU1RSSU5HX25ldyhjb21wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChTVEFDS19PRihBU04xX0dFTkVSQUxTVFJJTkcpICopc2tfbmV3KENIRUNLRURfQ0FTVCggICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN0YWNrX2NtcF9mdW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGludCAoKikoY29uc3QgQVNOMV9HRU5FUkFMU1RSSU5HICoqYSwgY29uc3QgQVNOMV9HRU5FUkFMU1RSSU5HICoqYiksIFwKKyAgICAgIGNvbXApKSkKKworI2RlZmluZSBza19BU04xX0dFTkVSQUxTVFJJTkdfbmV3X251bGwoKSBcCisgICgoU1RBQ0tfT0YoQVNOMV9HRU5FUkFMU1RSSU5HKSAqKXNrX25ld19udWxsKCkpCisKKyNkZWZpbmUgc2tfQVNOMV9HRU5FUkFMU1RSSU5HX251bShzaykgXAorICBza19udW0oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihBU04xX0dFTkVSQUxTVFJJTkcpICosIHNrKSkKKworI2RlZmluZSBza19BU04xX0dFTkVSQUxTVFJJTkdfemVybyhzaykgXAorICBza196ZXJvKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9HRU5FUkFMU1RSSU5HKSAqLCBzaykpOworCisjZGVmaW5lIHNrX0FTTjFfR0VORVJBTFNUUklOR192YWx1ZShzaywgaSkgXAorICAoKEFTTjFfR0VORVJBTFNUUklORyAqKXNrX3ZhbHVlKCAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoQVNOMV9HRU5FUkFMU1RSSU5HKSAqLCBzayksIChpKSkpCisKKyNkZWZpbmUgc2tfQVNOMV9HRU5FUkFMU1RSSU5HX3NldChzaywgaSwgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKEFTTjFfR0VORVJBTFNUUklORyAqKXNrX3NldCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfR0VORVJBTFNUUklORykgKiwgc2spLCAoaSksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIEFTTjFfR0VORVJBTFNUUklORyAqLCBwKSkpCisKKyNkZWZpbmUgc2tfQVNOMV9HRU5FUkFMU1RSSU5HX2ZyZWUoc2spIFwKKyAgc2tfZnJlZShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfR0VORVJBTFNUUklORykgKiwgc2spKQorCisjZGVmaW5lIHNrX0FTTjFfR0VORVJBTFNUUklOR19wb3BfZnJlZShzaywgZnJlZV9mdW5jKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfcG9wX2ZyZWUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihBU04xX0dFTkVSQUxTVFJJTkcpICosIHNrKSwgICAgXAorICAgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAoKikodm9pZCAqKSwgdm9pZCAoKikoQVNOMV9HRU5FUkFMU1RSSU5HICopLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX2Z1bmMpKQorCisjZGVmaW5lIHNrX0FTTjFfR0VORVJBTFNUUklOR19pbnNlcnQoc2ssIHAsIHdoZXJlKSAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX2luc2VydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfR0VORVJBTFNUUklORykgKiwgc2spLCBcCisgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBBU04xX0dFTkVSQUxTVFJJTkcgKiwgcCksICh3aGVyZSkpCisKKyNkZWZpbmUgc2tfQVNOMV9HRU5FUkFMU1RSSU5HX2RlbGV0ZShzaywgd2hlcmUpIFwKKyAgKChBU04xX0dFTkVSQUxTVFJJTkcgKilza19kZWxldGUoICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9HRU5FUkFMU1RSSU5HKSAqLCBzayksICh3aGVyZSkpKQorCisjZGVmaW5lIHNrX0FTTjFfR0VORVJBTFNUUklOR19kZWxldGVfcHRyKHNrLCBwKSAgICAgICAgICAgICAgICAgICBcCisgICgoQVNOMV9HRU5FUkFMU1RSSU5HICopc2tfZGVsZXRlX3B0ciggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfR0VORVJBTFNUUklORykgKiwgc2spLCBcCisgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBBU04xX0dFTkVSQUxTVFJJTkcgKiwgcCkpKQorCisjZGVmaW5lIHNrX0FTTjFfR0VORVJBTFNUUklOR19maW5kKHNrLCBvdXRfaW5kZXgsIHApICAgICAgICAgICAgICAgICAgXAorICBza19maW5kKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9HRU5FUkFMU1RSSU5HKSAqLCBzayksIFwKKyAgICAgICAgICAob3V0X2luZGV4KSwgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgQVNOMV9HRU5FUkFMU1RSSU5HICosIHApKQorCisjZGVmaW5lIHNrX0FTTjFfR0VORVJBTFNUUklOR19zaGlmdChzaykgXAorICAoKEFTTjFfR0VORVJBTFNUUklORyAqKXNrX3NoaWZ0KCAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9HRU5FUkFMU1RSSU5HKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX0FTTjFfR0VORVJBTFNUUklOR19wdXNoKHNrLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBza19wdXNoKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9HRU5FUkFMU1RSSU5HKSAqLCBzayksIFwKKyAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBBU04xX0dFTkVSQUxTVFJJTkcgKiwgcCkpCisKKyNkZWZpbmUgc2tfQVNOMV9HRU5FUkFMU1RSSU5HX3BvcChzaykgXAorICAoKEFTTjFfR0VORVJBTFNUUklORyAqKXNrX3BvcCggICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfR0VORVJBTFNUUklORykgKiwgc2spKSkKKworI2RlZmluZSBza19BU04xX0dFTkVSQUxTVFJJTkdfZHVwKHNrKSAgICAgIFwKKyAgKChTVEFDS19PRihBU04xX0dFTkVSQUxTVFJJTkcpICopc2tfZHVwKCBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKEFTTjFfR0VORVJBTFNUUklORykgKiwgc2spKSkKKworI2RlZmluZSBza19BU04xX0dFTkVSQUxTVFJJTkdfc29ydChzaykgXAorICBza19zb3J0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9HRU5FUkFMU1RSSU5HKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfQVNOMV9HRU5FUkFMU1RSSU5HX2lzX3NvcnRlZChzaykgXAorICBza19pc19zb3J0ZWQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihBU04xX0dFTkVSQUxTVFJJTkcpICosIHNrKSkKKworI2RlZmluZSBza19BU04xX0dFTkVSQUxTVFJJTkdfc2V0X2NtcF9mdW5jKHNrLCBjb21wKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKGludCAoKikoY29uc3QgQVNOMV9HRU5FUkFMU1RSSU5HICoqYSwgY29uc3QgQVNOMV9HRU5FUkFMU1RSSU5HICoqYikpICAgXAorICAgc2tfc2V0X2NtcF9mdW5jKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9HRU5FUkFMU1RSSU5HKSAqLCBzayksICAgICAgICAgXAorICAgICAgIENIRUNLRURfQ0FTVChzdGFja19jbXBfZnVuYywgaW50ICgqKShjb25zdCBBU04xX0dFTkVSQUxTVFJJTkcgKiphLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBU04xX0dFTkVSQUxTVFJJTkcgKipiKSwgXAorICAgICAgICAgICAgICAgICAgICBjb21wKSkpCisKKy8qIEFTTjFfSU5URUdFUiAqLworI2RlZmluZSBza19BU04xX0lOVEVHRVJfbmV3KGNvbXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChTVEFDS19PRihBU04xX0lOVEVHRVIpICopc2tfbmV3KENIRUNLRURfQ0FTVCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdGFja19jbXBfZnVuYywgaW50ICgqKShjb25zdCBBU04xX0lOVEVHRVIgKiphLCBjb25zdCBBU04xX0lOVEVHRVIgKipiKSwgXAorICAgICAgY29tcCkpKQorCisjZGVmaW5lIHNrX0FTTjFfSU5URUdFUl9uZXdfbnVsbCgpICgoU1RBQ0tfT0YoQVNOMV9JTlRFR0VSKSAqKXNrX25ld19udWxsKCkpCisKKyNkZWZpbmUgc2tfQVNOMV9JTlRFR0VSX251bShzaykgXAorICBza19udW0oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihBU04xX0lOVEVHRVIpICosIHNrKSkKKworI2RlZmluZSBza19BU04xX0lOVEVHRVJfemVybyhzaykgXAorICBza196ZXJvKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9JTlRFR0VSKSAqLCBzaykpOworCisjZGVmaW5lIHNrX0FTTjFfSU5URUdFUl92YWx1ZShzaywgaSkgXAorICAoKEFTTjFfSU5URUdFUiAqKXNrX3ZhbHVlKCAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoQVNOMV9JTlRFR0VSKSAqLCBzayksIChpKSkpCisKKyNkZWZpbmUgc2tfQVNOMV9JTlRFR0VSX3NldChzaywgaSwgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKEFTTjFfSU5URUdFUiAqKXNrX3NldCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfSU5URUdFUikgKiwgc2spLCAoaSksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIEFTTjFfSU5URUdFUiAqLCBwKSkpCisKKyNkZWZpbmUgc2tfQVNOMV9JTlRFR0VSX2ZyZWUoc2spIFwKKyAgc2tfZnJlZShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfSU5URUdFUikgKiwgc2spKQorCisjZGVmaW5lIHNrX0FTTjFfSU5URUdFUl9wb3BfZnJlZShzaywgZnJlZV9mdW5jKSAgICAgICAgICAgICBcCisgIHNrX3BvcF9mcmVlKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfSU5URUdFUikgKiwgc2spLCBcCisgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAoKikodm9pZCAqKSwgdm9pZCAoKikoQVNOMV9JTlRFR0VSICopLCBmcmVlX2Z1bmMpKQorCisjZGVmaW5lIHNrX0FTTjFfSU5URUdFUl9pbnNlcnQoc2ssIHAsIHdoZXJlKSAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX2luc2VydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfSU5URUdFUikgKiwgc2spLCBcCisgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBBU04xX0lOVEVHRVIgKiwgcCksICh3aGVyZSkpCisKKyNkZWZpbmUgc2tfQVNOMV9JTlRFR0VSX2RlbGV0ZShzaywgd2hlcmUpIFwKKyAgKChBU04xX0lOVEVHRVIgKilza19kZWxldGUoICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9JTlRFR0VSKSAqLCBzayksICh3aGVyZSkpKQorCisjZGVmaW5lIHNrX0FTTjFfSU5URUdFUl9kZWxldGVfcHRyKHNrLCBwKSAgICAgICAgICAgICAgICAgICBcCisgICgoQVNOMV9JTlRFR0VSICopc2tfZGVsZXRlX3B0ciggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfSU5URUdFUikgKiwgc2spLCBcCisgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBBU04xX0lOVEVHRVIgKiwgcCkpKQorCisjZGVmaW5lIHNrX0FTTjFfSU5URUdFUl9maW5kKHNrLCBvdXRfaW5kZXgsIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfZmluZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfSU5URUdFUikgKiwgc2spLCAob3V0X2luZGV4KSwgXAorICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIEFTTjFfSU5URUdFUiAqLCBwKSkKKworI2RlZmluZSBza19BU04xX0lOVEVHRVJfc2hpZnQoc2spIFwKKyAgKChBU04xX0lOVEVHRVIgKilza19zaGlmdCggICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfSU5URUdFUikgKiwgc2spKSkKKworI2RlZmluZSBza19BU04xX0lOVEVHRVJfcHVzaChzaywgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfcHVzaChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfSU5URUdFUikgKiwgc2spLCBcCisgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgQVNOMV9JTlRFR0VSICosIHApKQorCisjZGVmaW5lIHNrX0FTTjFfSU5URUdFUl9wb3Aoc2spIFwKKyAgKChBU04xX0lOVEVHRVIgKilza19wb3AoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihBU04xX0lOVEVHRVIpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfQVNOMV9JTlRFR0VSX2R1cChzaykgICAgICBcCisgICgoU1RBQ0tfT0YoQVNOMV9JTlRFR0VSKSAqKXNrX2R1cCggXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihBU04xX0lOVEVHRVIpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfQVNOMV9JTlRFR0VSX3NvcnQoc2spIFwKKyAgc2tfc29ydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfSU5URUdFUikgKiwgc2spKQorCisjZGVmaW5lIHNrX0FTTjFfSU5URUdFUl9pc19zb3J0ZWQoc2spIFwKKyAgc2tfaXNfc29ydGVkKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoQVNOMV9JTlRFR0VSKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfQVNOMV9JTlRFR0VSX3NldF9jbXBfZnVuYyhzaywgY29tcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKGludCAoKikoY29uc3QgQVNOMV9JTlRFR0VSICoqYSwgY29uc3QgQVNOMV9JTlRFR0VSICoqYikpc2tfc2V0X2NtcF9mdW5jKCBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfSU5URUdFUikgKiwgc2spLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChzdGFja19jbXBfZnVuYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIGludCAoKikoY29uc3QgQVNOMV9JTlRFR0VSICoqYSwgY29uc3QgQVNOMV9JTlRFR0VSICoqYiksICBcCisgICAgICAgICAgICAgICAgICAgY29tcCkpKQorCisvKiBBU04xX09CSkVDVCAqLworI2RlZmluZSBza19BU04xX09CSkVDVF9uZXcoY29tcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoU1RBQ0tfT0YoQVNOMV9PQkpFQ1QpICopc2tfbmV3KENIRUNLRURfQ0FTVCggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN0YWNrX2NtcF9mdW5jLCBpbnQgKCopKGNvbnN0IEFTTjFfT0JKRUNUICoqYSwgY29uc3QgQVNOMV9PQkpFQ1QgKipiKSwgXAorICAgICAgY29tcCkpKQorCisjZGVmaW5lIHNrX0FTTjFfT0JKRUNUX25ld19udWxsKCkgKChTVEFDS19PRihBU04xX09CSkVDVCkgKilza19uZXdfbnVsbCgpKQorCisjZGVmaW5lIHNrX0FTTjFfT0JKRUNUX251bShzaykgXAorICBza19udW0oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihBU04xX09CSkVDVCkgKiwgc2spKQorCisjZGVmaW5lIHNrX0FTTjFfT0JKRUNUX3plcm8oc2spIFwKKyAgc2tfemVybyhDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfT0JKRUNUKSAqLCBzaykpOworCisjZGVmaW5lIHNrX0FTTjFfT0JKRUNUX3ZhbHVlKHNrLCBpKSBcCisgICgoQVNOMV9PQkpFQ1QgKilza192YWx1ZSggICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKEFTTjFfT0JKRUNUKSAqLCBzayksIChpKSkpCisKKyNkZWZpbmUgc2tfQVNOMV9PQkpFQ1Rfc2V0KHNrLCBpLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChBU04xX09CSkVDVCAqKXNrX3NldChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfT0JKRUNUKSAqLCBzayksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaSksIENIRUNLRURfQ0FTVCh2b2lkICosIEFTTjFfT0JKRUNUICosIHApKSkKKworI2RlZmluZSBza19BU04xX09CSkVDVF9mcmVlKHNrKSBcCisgIHNrX2ZyZWUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihBU04xX09CSkVDVCkgKiwgc2spKQorCisjZGVmaW5lIHNrX0FTTjFfT0JKRUNUX3BvcF9mcmVlKHNrLCBmcmVlX2Z1bmMpICAgICAgICAgICAgIFwKKyAgc2tfcG9wX2ZyZWUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihBU04xX09CSkVDVCkgKiwgc2spLCBcCisgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAoKikodm9pZCAqKSwgdm9pZCAoKikoQVNOMV9PQkpFQ1QgKiksIGZyZWVfZnVuYykpCisKKyNkZWZpbmUgc2tfQVNOMV9PQkpFQ1RfaW5zZXJ0KHNrLCBwLCB3aGVyZSkgICAgICAgICAgICAgICAgICAgICAgXAorICBza19pbnNlcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihBU04xX09CSkVDVCkgKiwgc2spLCBcCisgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBBU04xX09CSkVDVCAqLCBwKSwgKHdoZXJlKSkKKworI2RlZmluZSBza19BU04xX09CSkVDVF9kZWxldGUoc2ssIHdoZXJlKSBcCisgICgoQVNOMV9PQkpFQ1QgKilza19kZWxldGUoICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9PQkpFQ1QpICosIHNrKSwgKHdoZXJlKSkpCisKKyNkZWZpbmUgc2tfQVNOMV9PQkpFQ1RfZGVsZXRlX3B0cihzaywgcCkgICAgICAgICAgICAgICAgICAgXAorICAoKEFTTjFfT0JKRUNUICopc2tfZGVsZXRlX3B0ciggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfT0JKRUNUKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIEFTTjFfT0JKRUNUICosIHApKSkKKworI2RlZmluZSBza19BU04xX09CSkVDVF9maW5kKHNrLCBvdXRfaW5kZXgsIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfZmluZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfT0JKRUNUKSAqLCBzayksIChvdXRfaW5kZXgpLCBcCisgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgQVNOMV9PQkpFQ1QgKiwgcCkpCisKKyNkZWZpbmUgc2tfQVNOMV9PQkpFQ1Rfc2hpZnQoc2spIFwKKyAgKChBU04xX09CSkVDVCAqKXNrX3NoaWZ0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9PQkpFQ1QpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfQVNOMV9PQkpFQ1RfcHVzaChzaywgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfcHVzaChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfT0JKRUNUKSAqLCBzayksIFwKKyAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBBU04xX09CSkVDVCAqLCBwKSkKKworI2RlZmluZSBza19BU04xX09CSkVDVF9wb3Aoc2spIFwKKyAgKChBU04xX09CSkVDVCAqKXNrX3BvcChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfT0JKRUNUKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX0FTTjFfT0JKRUNUX2R1cChzaykgICAgICBcCisgICgoU1RBQ0tfT0YoQVNOMV9PQkpFQ1QpICopc2tfZHVwKCBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKEFTTjFfT0JKRUNUKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX0FTTjFfT0JKRUNUX3NvcnQoc2spIFwKKyAgc2tfc29ydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfT0JKRUNUKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfQVNOMV9PQkpFQ1RfaXNfc29ydGVkKHNrKSBcCisgIHNrX2lzX3NvcnRlZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKEFTTjFfT0JKRUNUKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfQVNOMV9PQkpFQ1Rfc2V0X2NtcF9mdW5jKHNrLCBjb21wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChpbnQgKCopKGNvbnN0IEFTTjFfT0JKRUNUICoqYSwgY29uc3QgQVNOMV9PQkpFQ1QgKipiKSlza19zZXRfY21wX2Z1bmMoIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9PQkpFQ1QpICosIHNrKSwgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChzdGFja19jbXBfZnVuYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBpbnQgKCopKGNvbnN0IEFTTjFfT0JKRUNUICoqYSwgY29uc3QgQVNOMV9PQkpFQ1QgKipiKSwgIFwKKyAgICAgICAgICAgICAgICAgICBjb21wKSkpCisKKy8qIEFTTjFfU1RSSU5HX1RBQkxFICovCisjZGVmaW5lIHNrX0FTTjFfU1RSSU5HX1RBQkxFX25ldyhjb21wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKFNUQUNLX09GKEFTTjFfU1RSSU5HX1RBQkxFKSAqKXNrX25ldyhDSEVDS0VEX0NBU1QoICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN0YWNrX2NtcF9mdW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpbnQgKCopKGNvbnN0IEFTTjFfU1RSSU5HX1RBQkxFICoqYSwgY29uc3QgQVNOMV9TVFJJTkdfVEFCTEUgKipiKSwgXAorICAgICAgY29tcCkpKQorCisjZGVmaW5lIHNrX0FTTjFfU1RSSU5HX1RBQkxFX25ld19udWxsKCkgXAorICAoKFNUQUNLX09GKEFTTjFfU1RSSU5HX1RBQkxFKSAqKXNrX25ld19udWxsKCkpCisKKyNkZWZpbmUgc2tfQVNOMV9TVFJJTkdfVEFCTEVfbnVtKHNrKSBcCisgIHNrX251bShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfU1RSSU5HX1RBQkxFKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfQVNOMV9TVFJJTkdfVEFCTEVfemVybyhzaykgXAorICBza196ZXJvKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9TVFJJTkdfVEFCTEUpICosIHNrKSk7CisKKyNkZWZpbmUgc2tfQVNOMV9TVFJJTkdfVEFCTEVfdmFsdWUoc2ssIGkpIFwKKyAgKChBU04xX1NUUklOR19UQUJMRSAqKXNrX3ZhbHVlKCAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoQVNOMV9TVFJJTkdfVEFCTEUpICosIHNrKSwgKGkpKSkKKworI2RlZmluZSBza19BU04xX1NUUklOR19UQUJMRV9zZXQoc2ssIGksIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChBU04xX1NUUklOR19UQUJMRSAqKXNrX3NldCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfU1RSSU5HX1RBQkxFKSAqLCBzayksIChpKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgQVNOMV9TVFJJTkdfVEFCTEUgKiwgcCkpKQorCisjZGVmaW5lIHNrX0FTTjFfU1RSSU5HX1RBQkxFX2ZyZWUoc2spIFwKKyAgc2tfZnJlZShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfU1RSSU5HX1RBQkxFKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfQVNOMV9TVFJJTkdfVEFCTEVfcG9wX2ZyZWUoc2ssIGZyZWVfZnVuYykgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX3BvcF9mcmVlKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9TVFJJTkdfVEFCTEUpICosIHNrKSwgICAgXAorICAgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAoKikodm9pZCAqKSwgdm9pZCAoKikoQVNOMV9TVFJJTkdfVEFCTEUgKiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfZnVuYykpCisKKyNkZWZpbmUgc2tfQVNOMV9TVFJJTkdfVEFCTEVfaW5zZXJ0KHNrLCBwLCB3aGVyZSkgICAgICAgICAgICAgICAgICAgICAgXAorICBza19pbnNlcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihBU04xX1NUUklOR19UQUJMRSkgKiwgc2spLCBcCisgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBBU04xX1NUUklOR19UQUJMRSAqLCBwKSwgKHdoZXJlKSkKKworI2RlZmluZSBza19BU04xX1NUUklOR19UQUJMRV9kZWxldGUoc2ssIHdoZXJlKSBcCisgICgoQVNOMV9TVFJJTkdfVEFCTEUgKilza19kZWxldGUoICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9TVFJJTkdfVEFCTEUpICosIHNrKSwgKHdoZXJlKSkpCisKKyNkZWZpbmUgc2tfQVNOMV9TVFJJTkdfVEFCTEVfZGVsZXRlX3B0cihzaywgcCkgICAgICAgICAgICAgICAgICAgXAorICAoKEFTTjFfU1RSSU5HX1RBQkxFICopc2tfZGVsZXRlX3B0ciggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfU1RSSU5HX1RBQkxFKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIEFTTjFfU1RSSU5HX1RBQkxFICosIHApKSkKKworI2RlZmluZSBza19BU04xX1NUUklOR19UQUJMRV9maW5kKHNrLCBvdXRfaW5kZXgsIHApICAgICAgICAgICAgICAgICAgXAorICBza19maW5kKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9TVFJJTkdfVEFCTEUpICosIHNrKSwgXAorICAgICAgICAgIChvdXRfaW5kZXgpLCBDSEVDS0VEX0NBU1Qodm9pZCAqLCBBU04xX1NUUklOR19UQUJMRSAqLCBwKSkKKworI2RlZmluZSBza19BU04xX1NUUklOR19UQUJMRV9zaGlmdChzaykgXAorICAoKEFTTjFfU1RSSU5HX1RBQkxFICopc2tfc2hpZnQoICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihBU04xX1NUUklOR19UQUJMRSkgKiwgc2spKSkKKworI2RlZmluZSBza19BU04xX1NUUklOR19UQUJMRV9wdXNoKHNrLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBza19wdXNoKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9TVFJJTkdfVEFCTEUpICosIHNrKSwgXAorICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIEFTTjFfU1RSSU5HX1RBQkxFICosIHApKQorCisjZGVmaW5lIHNrX0FTTjFfU1RSSU5HX1RBQkxFX3BvcChzaykgXAorICAoKEFTTjFfU1RSSU5HX1RBQkxFICopc2tfcG9wKCAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9TVFJJTkdfVEFCTEUpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfQVNOMV9TVFJJTkdfVEFCTEVfZHVwKHNrKSAgICAgIFwKKyAgKChTVEFDS19PRihBU04xX1NUUklOR19UQUJMRSkgKilza19kdXAoIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoQVNOMV9TVFJJTkdfVEFCTEUpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfQVNOMV9TVFJJTkdfVEFCTEVfc29ydChzaykgXAorICBza19zb3J0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9TVFJJTkdfVEFCTEUpICosIHNrKSkKKworI2RlZmluZSBza19BU04xX1NUUklOR19UQUJMRV9pc19zb3J0ZWQoc2spIFwKKyAgc2tfaXNfc29ydGVkKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoQVNOMV9TVFJJTkdfVEFCTEUpICosIHNrKSkKKworI2RlZmluZSBza19BU04xX1NUUklOR19UQUJMRV9zZXRfY21wX2Z1bmMoc2ssIGNvbXApICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoaW50ICgqKShjb25zdCBBU04xX1NUUklOR19UQUJMRSAqKmEsIGNvbnN0IEFTTjFfU1RSSU5HX1RBQkxFICoqYikpICAgIFwKKyAgIHNrX3NldF9jbXBfZnVuYyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9TVFJJTkdfVEFCTEUpICosIHNrKSwgICAgICAgICBcCisgICAgICAgQ0hFQ0tFRF9DQVNUKHN0YWNrX2NtcF9mdW5jLCBpbnQgKCopKGNvbnN0IEFTTjFfU1RSSU5HX1RBQkxFICoqYSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVNOMV9TVFJJTkdfVEFCTEUgKipiKSwgXAorICAgICAgICAgICAgICAgICAgICBjb21wKSkpCisKKy8qIEFTTjFfVFlQRSAqLworI2RlZmluZSBza19BU04xX1RZUEVfbmV3KGNvbXApICAgICBcCisgICgoU1RBQ0tfT0YoQVNOMV9UWVBFKSAqKXNrX25ldyggIFwKKyAgICAgIENIRUNLRURfQ0FTVChzdGFja19jbXBfZnVuYywgXAorICAgICAgICAgICAgICAgICAgIGludCAoKikoY29uc3QgQVNOMV9UWVBFICoqYSwgY29uc3QgQVNOMV9UWVBFICoqYiksIGNvbXApKSkKKworI2RlZmluZSBza19BU04xX1RZUEVfbmV3X251bGwoKSAoKFNUQUNLX09GKEFTTjFfVFlQRSkgKilza19uZXdfbnVsbCgpKQorCisjZGVmaW5lIHNrX0FTTjFfVFlQRV9udW0oc2spIFwKKyAgc2tfbnVtKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9UWVBFKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfQVNOMV9UWVBFX3plcm8oc2spIFwKKyAgc2tfemVybyhDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfVFlQRSkgKiwgc2spKTsKKworI2RlZmluZSBza19BU04xX1RZUEVfdmFsdWUoc2ssIGkpIFwKKyAgKChBU04xX1RZUEUgKilza192YWx1ZSggICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKEFTTjFfVFlQRSkgKiwgc2spLCAoaSkpKQorCisjZGVmaW5lIHNrX0FTTjFfVFlQRV9zZXQoc2ssIGksIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKEFTTjFfVFlQRSAqKXNrX3NldChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfVFlQRSkgKiwgc2spLCAoaSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgQVNOMV9UWVBFICosIHApKSkKKworI2RlZmluZSBza19BU04xX1RZUEVfZnJlZShzaykgXAorICBza19mcmVlKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9UWVBFKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfQVNOMV9UWVBFX3BvcF9mcmVlKHNrLCBmcmVlX2Z1bmMpICAgICAgICAgICAgIFwKKyAgc2tfcG9wX2ZyZWUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9UWVBFKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICgqKSh2b2lkICopLCB2b2lkICgqKShBU04xX1RZUEUgKiksIGZyZWVfZnVuYykpCisKKyNkZWZpbmUgc2tfQVNOMV9UWVBFX2luc2VydChzaywgcCwgd2hlcmUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfaW5zZXJ0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9UWVBFKSAqLCBzayksIFwKKyAgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIEFTTjFfVFlQRSAqLCBwKSwgKHdoZXJlKSkKKworI2RlZmluZSBza19BU04xX1RZUEVfZGVsZXRlKHNrLCB3aGVyZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoQVNOMV9UWVBFICopc2tfZGVsZXRlKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9UWVBFKSAqLCBzayksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoZXJlKSkpCisKKyNkZWZpbmUgc2tfQVNOMV9UWVBFX2RlbGV0ZV9wdHIoc2ssIHApICAgICAgICAgICAgICAgICAgIFwKKyAgKChBU04xX1RZUEUgKilza19kZWxldGVfcHRyKCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9UWVBFKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIEFTTjFfVFlQRSAqLCBwKSkpCisKKyNkZWZpbmUgc2tfQVNOMV9UWVBFX2ZpbmQoc2ssIG91dF9pbmRleCwgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBza19maW5kKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9UWVBFKSAqLCBzayksIChvdXRfaW5kZXgpLCBcCisgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgQVNOMV9UWVBFICosIHApKQorCisjZGVmaW5lIHNrX0FTTjFfVFlQRV9zaGlmdChzaykgXAorICAoKEFTTjFfVFlQRSAqKXNrX3NoaWZ0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9UWVBFKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX0FTTjFfVFlQRV9wdXNoKHNrLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBza19wdXNoKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9UWVBFKSAqLCBzayksIFwKKyAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBBU04xX1RZUEUgKiwgcCkpCisKKyNkZWZpbmUgc2tfQVNOMV9UWVBFX3BvcChzaykgXAorICAoKEFTTjFfVFlQRSAqKXNrX3BvcChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfVFlQRSkgKiwgc2spKSkKKworI2RlZmluZSBza19BU04xX1RZUEVfZHVwKHNrKSAgICAgIFwKKyAgKChTVEFDS19PRihBU04xX1RZUEUpICopc2tfZHVwKCBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKEFTTjFfVFlQRSkgKiwgc2spKSkKKworI2RlZmluZSBza19BU04xX1RZUEVfc29ydChzaykgXAorICBza19zb3J0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9UWVBFKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfQVNOMV9UWVBFX2lzX3NvcnRlZChzaykgXAorICBza19pc19zb3J0ZWQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihBU04xX1RZUEUpICosIHNrKSkKKworI2RlZmluZSBza19BU04xX1RZUEVfc2V0X2NtcF9mdW5jKHNrLCBjb21wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoaW50ICgqKShjb25zdCBBU04xX1RZUEUgKiphLCBjb25zdCBBU04xX1RZUEUgKipiKSlza19zZXRfY21wX2Z1bmMoIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9UWVBFKSAqLCBzayksICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHN0YWNrX2NtcF9mdW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgaW50ICgqKShjb25zdCBBU04xX1RZUEUgKiphLCBjb25zdCBBU04xX1RZUEUgKipiKSwgY29tcCkpKQorCisvKiBBU04xX1ZBTFVFICovCisjZGVmaW5lIHNrX0FTTjFfVkFMVUVfbmV3KGNvbXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoU1RBQ0tfT0YoQVNOMV9WQUxVRSkgKilza19uZXcoQ0hFQ0tFRF9DQVNUKCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdGFja19jbXBfZnVuYywgaW50ICgqKShjb25zdCBBU04xX1ZBTFVFICoqYSwgY29uc3QgQVNOMV9WQUxVRSAqKmIpLCBcCisgICAgICBjb21wKSkpCisKKyNkZWZpbmUgc2tfQVNOMV9WQUxVRV9uZXdfbnVsbCgpICgoU1RBQ0tfT0YoQVNOMV9WQUxVRSkgKilza19uZXdfbnVsbCgpKQorCisjZGVmaW5lIHNrX0FTTjFfVkFMVUVfbnVtKHNrKSBcCisgIHNrX251bShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfVkFMVUUpICosIHNrKSkKKworI2RlZmluZSBza19BU04xX1ZBTFVFX3plcm8oc2spIFwKKyAgc2tfemVybyhDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfVkFMVUUpICosIHNrKSk7CisKKyNkZWZpbmUgc2tfQVNOMV9WQUxVRV92YWx1ZShzaywgaSkgXAorICAoKEFTTjFfVkFMVUUgKilza192YWx1ZSggICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKEFTTjFfVkFMVUUpICosIHNrKSwgKGkpKSkKKworI2RlZmluZSBza19BU04xX1ZBTFVFX3NldChzaywgaSwgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChBU04xX1ZBTFVFICopc2tfc2V0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9WQUxVRSkgKiwgc2spLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAoaSksIENIRUNLRURfQ0FTVCh2b2lkICosIEFTTjFfVkFMVUUgKiwgcCkpKQorCisjZGVmaW5lIHNrX0FTTjFfVkFMVUVfZnJlZShzaykgXAorICBza19mcmVlKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9WQUxVRSkgKiwgc2spKQorCisjZGVmaW5lIHNrX0FTTjFfVkFMVUVfcG9wX2ZyZWUoc2ssIGZyZWVfZnVuYykgICAgICAgICAgICAgXAorICBza19wb3BfZnJlZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9WQUxVRSkgKiwgc2spLCBcCisgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAoKikodm9pZCAqKSwgdm9pZCAoKikoQVNOMV9WQUxVRSAqKSwgZnJlZV9mdW5jKSkKKworI2RlZmluZSBza19BU04xX1ZBTFVFX2luc2VydChzaywgcCwgd2hlcmUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfaW5zZXJ0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9WQUxVRSkgKiwgc2spLCBcCisgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBBU04xX1ZBTFVFICosIHApLCAod2hlcmUpKQorCisjZGVmaW5lIHNrX0FTTjFfVkFMVUVfZGVsZXRlKHNrLCB3aGVyZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKEFTTjFfVkFMVUUgKilza19kZWxldGUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihBU04xX1ZBTFVFKSAqLCBzayksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGVyZSkpKQorCisjZGVmaW5lIHNrX0FTTjFfVkFMVUVfZGVsZXRlX3B0cihzaywgcCkgICAgICAgICAgICAgICAgICAgXAorICAoKEFTTjFfVkFMVUUgKilza19kZWxldGVfcHRyKCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9WQUxVRSkgKiwgc2spLCBcCisgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBBU04xX1ZBTFVFICosIHApKSkKKworI2RlZmluZSBza19BU04xX1ZBTFVFX2ZpbmQoc2ssIG91dF9pbmRleCwgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBza19maW5kKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9WQUxVRSkgKiwgc2spLCAob3V0X2luZGV4KSwgXAorICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIEFTTjFfVkFMVUUgKiwgcCkpCisKKyNkZWZpbmUgc2tfQVNOMV9WQUxVRV9zaGlmdChzaykgXAorICAoKEFTTjFfVkFMVUUgKilza19zaGlmdChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfVkFMVUUpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfQVNOMV9WQUxVRV9wdXNoKHNrLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBza19wdXNoKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9WQUxVRSkgKiwgc2spLCBcCisgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgQVNOMV9WQUxVRSAqLCBwKSkKKworI2RlZmluZSBza19BU04xX1ZBTFVFX3BvcChzaykgXAorICAoKEFTTjFfVkFMVUUgKilza19wb3AoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihBU04xX1ZBTFVFKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX0FTTjFfVkFMVUVfZHVwKHNrKSAgICAgIFwKKyAgKChTVEFDS19PRihBU04xX1ZBTFVFKSAqKXNrX2R1cCggXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihBU04xX1ZBTFVFKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX0FTTjFfVkFMVUVfc29ydChzaykgXAorICBza19zb3J0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQVNOMV9WQUxVRSkgKiwgc2spKQorCisjZGVmaW5lIHNrX0FTTjFfVkFMVUVfaXNfc29ydGVkKHNrKSBcCisgIHNrX2lzX3NvcnRlZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKEFTTjFfVkFMVUUpICosIHNrKSkKKworI2RlZmluZSBza19BU04xX1ZBTFVFX3NldF9jbXBfZnVuYyhzaywgY29tcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChpbnQgKCopKGNvbnN0IEFTTjFfVkFMVUUgKiphLCBjb25zdCBBU04xX1ZBTFVFICoqYikpc2tfc2V0X2NtcF9mdW5jKCBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEFTTjFfVkFMVUUpICosIHNrKSwgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHN0YWNrX2NtcF9mdW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBpbnQgKCopKGNvbnN0IEFTTjFfVkFMVUUgKiphLCBjb25zdCBBU04xX1ZBTFVFICoqYiksICBcCisgICAgICAgICAgICAgICAgICAgY29tcCkpKQorCisvKiBCSU8gKi8KKyNkZWZpbmUgc2tfQklPX25ldyhjb21wKSAgICAgICAgICAgICAgICAgXAorICAoKFNUQUNLX09GKEJJTykgKilza19uZXcoQ0hFQ0tFRF9DQVNUKCBcCisgICAgICBzdGFja19jbXBfZnVuYywgaW50ICgqKShjb25zdCBCSU8gKiphLCBjb25zdCBCSU8gKipiKSwgY29tcCkpKQorCisjZGVmaW5lIHNrX0JJT19uZXdfbnVsbCgpICgoU1RBQ0tfT0YoQklPKSAqKXNrX25ld19udWxsKCkpCisKKyNkZWZpbmUgc2tfQklPX251bShzaykgc2tfbnVtKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQklPKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfQklPX3plcm8oc2spIHNrX3plcm8oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihCSU8pICosIHNrKSk7CisKKyNkZWZpbmUgc2tfQklPX3ZhbHVlKHNrLCBpKSBcCisgICgoQklPICopc2tfdmFsdWUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihCSU8pICosIHNrKSwgKGkpKSkKKworI2RlZmluZSBza19CSU9fc2V0KHNrLCBpLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChCSU8gKilza19zZXQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihCSU8pICosIHNrKSwgKGkpLCBcCisgICAgICAgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIEJJTyAqLCBwKSkpCisKKyNkZWZpbmUgc2tfQklPX2ZyZWUoc2spIHNrX2ZyZWUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihCSU8pICosIHNrKSkKKworI2RlZmluZSBza19CSU9fcG9wX2ZyZWUoc2ssIGZyZWVfZnVuYykgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX3BvcF9mcmVlKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQklPKSAqLCBzayksIFwKKyAgICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKCopKHZvaWQgKiksIHZvaWQgKCopKEJJTyAqKSwgZnJlZV9mdW5jKSkKKworI2RlZmluZSBza19CSU9faW5zZXJ0KHNrLCBwLCB3aGVyZSkgICAgICAgICAgICAgICAgICAgICAgXAorICBza19pbnNlcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihCSU8pICosIHNrKSwgXAorICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgQklPICosIHApLCAod2hlcmUpKQorCisjZGVmaW5lIHNrX0JJT19kZWxldGUoc2ssIHdoZXJlKSBcCisgICgoQklPICopc2tfZGVsZXRlKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQklPKSAqLCBzayksICh3aGVyZSkpKQorCisjZGVmaW5lIHNrX0JJT19kZWxldGVfcHRyKHNrLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoQklPICopc2tfZGVsZXRlX3B0cihDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEJJTykgKiwgc2spLCBcCisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBCSU8gKiwgcCkpKQorCisjZGVmaW5lIHNrX0JJT19maW5kKHNrLCBvdXRfaW5kZXgsIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfZmluZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEJJTykgKiwgc2spLCAob3V0X2luZGV4KSwgXAorICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIEJJTyAqLCBwKSkKKworI2RlZmluZSBza19CSU9fc2hpZnQoc2spIFwKKyAgKChCSU8gKilza19zaGlmdChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEJJTykgKiwgc2spKSkKKworI2RlZmluZSBza19CSU9fcHVzaChzaywgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfcHVzaChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEJJTykgKiwgc2spLCBcCisgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgQklPICosIHApKQorCisjZGVmaW5lIHNrX0JJT19wb3Aoc2spIFwKKyAgKChCSU8gKilza19wb3AoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihCSU8pICosIHNrKSkpCisKKyNkZWZpbmUgc2tfQklPX2R1cChzaykgXAorICAoKFNUQUNLX09GKEJJTykgKilza19kdXAoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihCSU8pICosIHNrKSkpCisKKyNkZWZpbmUgc2tfQklPX3NvcnQoc2spIHNrX3NvcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihCSU8pICosIHNrKSkKKworI2RlZmluZSBza19CSU9faXNfc29ydGVkKHNrKSBcCisgIHNrX2lzX3NvcnRlZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKEJJTykgKiwgc2spKQorCisjZGVmaW5lIHNrX0JJT19zZXRfY21wX2Z1bmMoc2ssIGNvbXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChpbnQgKCopKGNvbnN0IEJJTyAqKmEsIGNvbnN0IEJJTyAqKmIpKXNrX3NldF9jbXBfZnVuYyggICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihCSU8pICosIHNrKSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1Qoc3RhY2tfY21wX2Z1bmMsIGludCAoKikoY29uc3QgQklPICoqYSwgY29uc3QgQklPICoqYiksIFwKKyAgICAgICAgICAgICAgICAgICBjb21wKSkpCisKKy8qIEJZX0RJUl9FTlRSWSAqLworI2RlZmluZSBza19CWV9ESVJfRU5UUllfbmV3KGNvbXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChTVEFDS19PRihCWV9ESVJfRU5UUlkpICopc2tfbmV3KENIRUNLRURfQ0FTVCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdGFja19jbXBfZnVuYywgaW50ICgqKShjb25zdCBCWV9ESVJfRU5UUlkgKiphLCBjb25zdCBCWV9ESVJfRU5UUlkgKipiKSwgXAorICAgICAgY29tcCkpKQorCisjZGVmaW5lIHNrX0JZX0RJUl9FTlRSWV9uZXdfbnVsbCgpICgoU1RBQ0tfT0YoQllfRElSX0VOVFJZKSAqKXNrX25ld19udWxsKCkpCisKKyNkZWZpbmUgc2tfQllfRElSX0VOVFJZX251bShzaykgXAorICBza19udW0oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihCWV9ESVJfRU5UUlkpICosIHNrKSkKKworI2RlZmluZSBza19CWV9ESVJfRU5UUllfemVybyhzaykgXAorICBza196ZXJvKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQllfRElSX0VOVFJZKSAqLCBzaykpOworCisjZGVmaW5lIHNrX0JZX0RJUl9FTlRSWV92YWx1ZShzaywgaSkgXAorICAoKEJZX0RJUl9FTlRSWSAqKXNrX3ZhbHVlKCAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoQllfRElSX0VOVFJZKSAqLCBzayksIChpKSkpCisKKyNkZWZpbmUgc2tfQllfRElSX0VOVFJZX3NldChzaywgaSwgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKEJZX0RJUl9FTlRSWSAqKXNrX3NldCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEJZX0RJUl9FTlRSWSkgKiwgc2spLCAoaSksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIEJZX0RJUl9FTlRSWSAqLCBwKSkpCisKKyNkZWZpbmUgc2tfQllfRElSX0VOVFJZX2ZyZWUoc2spIFwKKyAgc2tfZnJlZShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEJZX0RJUl9FTlRSWSkgKiwgc2spKQorCisjZGVmaW5lIHNrX0JZX0RJUl9FTlRSWV9wb3BfZnJlZShzaywgZnJlZV9mdW5jKSAgICAgICAgICAgICBcCisgIHNrX3BvcF9mcmVlKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEJZX0RJUl9FTlRSWSkgKiwgc2spLCBcCisgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAoKikodm9pZCAqKSwgdm9pZCAoKikoQllfRElSX0VOVFJZICopLCBmcmVlX2Z1bmMpKQorCisjZGVmaW5lIHNrX0JZX0RJUl9FTlRSWV9pbnNlcnQoc2ssIHAsIHdoZXJlKSAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX2luc2VydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEJZX0RJUl9FTlRSWSkgKiwgc2spLCBcCisgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBCWV9ESVJfRU5UUlkgKiwgcCksICh3aGVyZSkpCisKKyNkZWZpbmUgc2tfQllfRElSX0VOVFJZX2RlbGV0ZShzaywgd2hlcmUpIFwKKyAgKChCWV9ESVJfRU5UUlkgKilza19kZWxldGUoICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQllfRElSX0VOVFJZKSAqLCBzayksICh3aGVyZSkpKQorCisjZGVmaW5lIHNrX0JZX0RJUl9FTlRSWV9kZWxldGVfcHRyKHNrLCBwKSAgICAgICAgICAgICAgICAgICBcCisgICgoQllfRElSX0VOVFJZICopc2tfZGVsZXRlX3B0ciggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEJZX0RJUl9FTlRSWSkgKiwgc2spLCBcCisgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBCWV9ESVJfRU5UUlkgKiwgcCkpKQorCisjZGVmaW5lIHNrX0JZX0RJUl9FTlRSWV9maW5kKHNrLCBvdXRfaW5kZXgsIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfZmluZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEJZX0RJUl9FTlRSWSkgKiwgc2spLCAob3V0X2luZGV4KSwgXAorICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIEJZX0RJUl9FTlRSWSAqLCBwKSkKKworI2RlZmluZSBza19CWV9ESVJfRU5UUllfc2hpZnQoc2spIFwKKyAgKChCWV9ESVJfRU5UUlkgKilza19zaGlmdCggICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEJZX0RJUl9FTlRSWSkgKiwgc2spKSkKKworI2RlZmluZSBza19CWV9ESVJfRU5UUllfcHVzaChzaywgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfcHVzaChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEJZX0RJUl9FTlRSWSkgKiwgc2spLCBcCisgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgQllfRElSX0VOVFJZICosIHApKQorCisjZGVmaW5lIHNrX0JZX0RJUl9FTlRSWV9wb3Aoc2spIFwKKyAgKChCWV9ESVJfRU5UUlkgKilza19wb3AoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihCWV9ESVJfRU5UUlkpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfQllfRElSX0VOVFJZX2R1cChzaykgICAgICBcCisgICgoU1RBQ0tfT0YoQllfRElSX0VOVFJZKSAqKXNrX2R1cCggXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihCWV9ESVJfRU5UUlkpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfQllfRElSX0VOVFJZX3NvcnQoc2spIFwKKyAgc2tfc29ydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEJZX0RJUl9FTlRSWSkgKiwgc2spKQorCisjZGVmaW5lIHNrX0JZX0RJUl9FTlRSWV9pc19zb3J0ZWQoc2spIFwKKyAgc2tfaXNfc29ydGVkKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoQllfRElSX0VOVFJZKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfQllfRElSX0VOVFJZX3NldF9jbXBfZnVuYyhzaywgY29tcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKGludCAoKikoY29uc3QgQllfRElSX0VOVFJZICoqYSwgY29uc3QgQllfRElSX0VOVFJZICoqYikpc2tfc2V0X2NtcF9mdW5jKCBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEJZX0RJUl9FTlRSWSkgKiwgc2spLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChzdGFja19jbXBfZnVuYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIGludCAoKikoY29uc3QgQllfRElSX0VOVFJZICoqYSwgY29uc3QgQllfRElSX0VOVFJZICoqYiksICBcCisgICAgICAgICAgICAgICAgICAgY29tcCkpKQorCisvKiBCWV9ESVJfSEFTSCAqLworI2RlZmluZSBza19CWV9ESVJfSEFTSF9uZXcoY29tcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoU1RBQ0tfT0YoQllfRElSX0hBU0gpICopc2tfbmV3KENIRUNLRURfQ0FTVCggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN0YWNrX2NtcF9mdW5jLCBpbnQgKCopKGNvbnN0IEJZX0RJUl9IQVNIICoqYSwgY29uc3QgQllfRElSX0hBU0ggKipiKSwgXAorICAgICAgY29tcCkpKQorCisjZGVmaW5lIHNrX0JZX0RJUl9IQVNIX25ld19udWxsKCkgKChTVEFDS19PRihCWV9ESVJfSEFTSCkgKilza19uZXdfbnVsbCgpKQorCisjZGVmaW5lIHNrX0JZX0RJUl9IQVNIX251bShzaykgXAorICBza19udW0oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihCWV9ESVJfSEFTSCkgKiwgc2spKQorCisjZGVmaW5lIHNrX0JZX0RJUl9IQVNIX3plcm8oc2spIFwKKyAgc2tfemVybyhDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEJZX0RJUl9IQVNIKSAqLCBzaykpOworCisjZGVmaW5lIHNrX0JZX0RJUl9IQVNIX3ZhbHVlKHNrLCBpKSBcCisgICgoQllfRElSX0hBU0ggKilza192YWx1ZSggICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKEJZX0RJUl9IQVNIKSAqLCBzayksIChpKSkpCisKKyNkZWZpbmUgc2tfQllfRElSX0hBU0hfc2V0KHNrLCBpLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChCWV9ESVJfSEFTSCAqKXNrX3NldChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEJZX0RJUl9IQVNIKSAqLCBzayksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaSksIENIRUNLRURfQ0FTVCh2b2lkICosIEJZX0RJUl9IQVNIICosIHApKSkKKworI2RlZmluZSBza19CWV9ESVJfSEFTSF9mcmVlKHNrKSBcCisgIHNrX2ZyZWUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihCWV9ESVJfSEFTSCkgKiwgc2spKQorCisjZGVmaW5lIHNrX0JZX0RJUl9IQVNIX3BvcF9mcmVlKHNrLCBmcmVlX2Z1bmMpICAgICAgICAgICAgIFwKKyAgc2tfcG9wX2ZyZWUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihCWV9ESVJfSEFTSCkgKiwgc2spLCBcCisgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAoKikodm9pZCAqKSwgdm9pZCAoKikoQllfRElSX0hBU0ggKiksIGZyZWVfZnVuYykpCisKKyNkZWZpbmUgc2tfQllfRElSX0hBU0hfaW5zZXJ0KHNrLCBwLCB3aGVyZSkgICAgICAgICAgICAgICAgICAgICAgXAorICBza19pbnNlcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihCWV9ESVJfSEFTSCkgKiwgc2spLCBcCisgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBCWV9ESVJfSEFTSCAqLCBwKSwgKHdoZXJlKSkKKworI2RlZmluZSBza19CWV9ESVJfSEFTSF9kZWxldGUoc2ssIHdoZXJlKSBcCisgICgoQllfRElSX0hBU0ggKilza19kZWxldGUoICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQllfRElSX0hBU0gpICosIHNrKSwgKHdoZXJlKSkpCisKKyNkZWZpbmUgc2tfQllfRElSX0hBU0hfZGVsZXRlX3B0cihzaywgcCkgICAgICAgICAgICAgICAgICAgXAorICAoKEJZX0RJUl9IQVNIICopc2tfZGVsZXRlX3B0ciggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEJZX0RJUl9IQVNIKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIEJZX0RJUl9IQVNIICosIHApKSkKKworI2RlZmluZSBza19CWV9ESVJfSEFTSF9maW5kKHNrLCBvdXRfaW5kZXgsIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfZmluZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEJZX0RJUl9IQVNIKSAqLCBzayksIChvdXRfaW5kZXgpLCBcCisgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgQllfRElSX0hBU0ggKiwgcCkpCisKKyNkZWZpbmUgc2tfQllfRElSX0hBU0hfc2hpZnQoc2spIFwKKyAgKChCWV9ESVJfSEFTSCAqKXNrX3NoaWZ0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQllfRElSX0hBU0gpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfQllfRElSX0hBU0hfcHVzaChzaywgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfcHVzaChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEJZX0RJUl9IQVNIKSAqLCBzayksIFwKKyAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBCWV9ESVJfSEFTSCAqLCBwKSkKKworI2RlZmluZSBza19CWV9ESVJfSEFTSF9wb3Aoc2spIFwKKyAgKChCWV9ESVJfSEFTSCAqKXNrX3BvcChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEJZX0RJUl9IQVNIKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX0JZX0RJUl9IQVNIX2R1cChzaykgICAgICBcCisgICgoU1RBQ0tfT0YoQllfRElSX0hBU0gpICopc2tfZHVwKCBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKEJZX0RJUl9IQVNIKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX0JZX0RJUl9IQVNIX3NvcnQoc2spIFwKKyAgc2tfc29ydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEJZX0RJUl9IQVNIKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfQllfRElSX0hBU0hfaXNfc29ydGVkKHNrKSBcCisgIHNrX2lzX3NvcnRlZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKEJZX0RJUl9IQVNIKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfQllfRElSX0hBU0hfc2V0X2NtcF9mdW5jKHNrLCBjb21wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChpbnQgKCopKGNvbnN0IEJZX0RJUl9IQVNIICoqYSwgY29uc3QgQllfRElSX0hBU0ggKipiKSlza19zZXRfY21wX2Z1bmMoIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQllfRElSX0hBU0gpICosIHNrKSwgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChzdGFja19jbXBfZnVuYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBpbnQgKCopKGNvbnN0IEJZX0RJUl9IQVNIICoqYSwgY29uc3QgQllfRElSX0hBU0ggKipiKSwgIFwKKyAgICAgICAgICAgICAgICAgICBjb21wKSkpCisKKy8qIENPTkZfVkFMVUUgKi8KKyNkZWZpbmUgc2tfQ09ORl9WQUxVRV9uZXcoY29tcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChTVEFDS19PRihDT05GX1ZBTFVFKSAqKXNrX25ldyhDSEVDS0VEX0NBU1QoICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN0YWNrX2NtcF9mdW5jLCBpbnQgKCopKGNvbnN0IENPTkZfVkFMVUUgKiphLCBjb25zdCBDT05GX1ZBTFVFICoqYiksIFwKKyAgICAgIGNvbXApKSkKKworI2RlZmluZSBza19DT05GX1ZBTFVFX25ld19udWxsKCkgKChTVEFDS19PRihDT05GX1ZBTFVFKSAqKXNrX25ld19udWxsKCkpCisKKyNkZWZpbmUgc2tfQ09ORl9WQUxVRV9udW0oc2spIFwKKyAgc2tfbnVtKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKiwgc2spKQorCisjZGVmaW5lIHNrX0NPTkZfVkFMVUVfemVybyhzaykgXAorICBza196ZXJvKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKiwgc2spKTsKKworI2RlZmluZSBza19DT05GX1ZBTFVFX3ZhbHVlKHNrLCBpKSBcCisgICgoQ09ORl9WQUxVRSAqKXNrX3ZhbHVlKCAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKiwgc2spLCAoaSkpKQorCisjZGVmaW5lIHNrX0NPTkZfVkFMVUVfc2V0KHNrLCBpLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKENPTkZfVkFMVUUgKilza19zZXQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihDT05GX1ZBTFVFKSAqLCBzayksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpKSwgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgQ09ORl9WQUxVRSAqLCBwKSkpCisKKyNkZWZpbmUgc2tfQ09ORl9WQUxVRV9mcmVlKHNrKSBcCisgIHNrX2ZyZWUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihDT05GX1ZBTFVFKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfQ09ORl9WQUxVRV9wb3BfZnJlZShzaywgZnJlZV9mdW5jKSAgICAgICAgICAgICBcCisgIHNrX3BvcF9mcmVlKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihDT05GX1ZBTFVFKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICgqKSh2b2lkICopLCB2b2lkICgqKShDT05GX1ZBTFVFICopLCBmcmVlX2Z1bmMpKQorCisjZGVmaW5lIHNrX0NPTkZfVkFMVUVfaW5zZXJ0KHNrLCBwLCB3aGVyZSkgICAgICAgICAgICAgICAgICAgICAgXAorICBza19pbnNlcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihDT05GX1ZBTFVFKSAqLCBzayksIFwKKyAgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIENPTkZfVkFMVUUgKiwgcCksICh3aGVyZSkpCisKKyNkZWZpbmUgc2tfQ09ORl9WQUxVRV9kZWxldGUoc2ssIHdoZXJlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoQ09ORl9WQUxVRSAqKXNrX2RlbGV0ZShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKENPTkZfVkFMVUUpICosIHNrKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoZXJlKSkpCisKKyNkZWZpbmUgc2tfQ09ORl9WQUxVRV9kZWxldGVfcHRyKHNrLCBwKSAgICAgICAgICAgICAgICAgICBcCisgICgoQ09ORl9WQUxVRSAqKXNrX2RlbGV0ZV9wdHIoICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihDT05GX1ZBTFVFKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIENPTkZfVkFMVUUgKiwgcCkpKQorCisjZGVmaW5lIHNrX0NPTkZfVkFMVUVfZmluZChzaywgb3V0X2luZGV4LCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX2ZpbmQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihDT05GX1ZBTFVFKSAqLCBzayksIChvdXRfaW5kZXgpLCBcCisgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgQ09ORl9WQUxVRSAqLCBwKSkKKworI2RlZmluZSBza19DT05GX1ZBTFVFX3NoaWZ0KHNrKSBcCisgICgoQ09ORl9WQUxVRSAqKXNrX3NoaWZ0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKiwgc2spKSkKKworI2RlZmluZSBza19DT05GX1ZBTFVFX3B1c2goc2ssIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX3B1c2goQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihDT05GX1ZBTFVFKSAqLCBzayksIFwKKyAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBDT05GX1ZBTFVFICosIHApKQorCisjZGVmaW5lIHNrX0NPTkZfVkFMVUVfcG9wKHNrKSBcCisgICgoQ09ORl9WQUxVRSAqKXNrX3BvcChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKENPTkZfVkFMVUUpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfQ09ORl9WQUxVRV9kdXAoc2spICAgICAgXAorICAoKFNUQUNLX09GKENPTkZfVkFMVUUpICopc2tfZHVwKCBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKENPTkZfVkFMVUUpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfQ09ORl9WQUxVRV9zb3J0KHNrKSBcCisgIHNrX3NvcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihDT05GX1ZBTFVFKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfQ09ORl9WQUxVRV9pc19zb3J0ZWQoc2spIFwKKyAgc2tfaXNfc29ydGVkKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKiwgc2spKQorCisjZGVmaW5lIHNrX0NPTkZfVkFMVUVfc2V0X2NtcF9mdW5jKHNrLCBjb21wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKGludCAoKikoY29uc3QgQ09ORl9WQUxVRSAqKmEsIGNvbnN0IENPTkZfVkFMVUUgKipiKSlza19zZXRfY21wX2Z1bmMoIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKiwgc2spLCAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1Qoc3RhY2tfY21wX2Z1bmMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIGludCAoKikoY29uc3QgQ09ORl9WQUxVRSAqKmEsIGNvbnN0IENPTkZfVkFMVUUgKipiKSwgIFwKKyAgICAgICAgICAgICAgICAgICBjb21wKSkpCisKKy8qIENSWVBUT19FWF9EQVRBX0ZVTkNTICovCisjZGVmaW5lIHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX25ldyhjb21wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKFNUQUNLX09GKENSWVBUT19FWF9EQVRBX0ZVTkNTKSAqKXNrX25ldyhDSEVDS0VEX0NBU1QoICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN0YWNrX2NtcF9mdW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpbnQgKCopKGNvbnN0IENSWVBUT19FWF9EQVRBX0ZVTkNTICoqYSwgY29uc3QgQ1JZUFRPX0VYX0RBVEFfRlVOQ1MgKipiKSwgXAorICAgICAgY29tcCkpKQorCisjZGVmaW5lIHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX25ld19udWxsKCkgXAorICAoKFNUQUNLX09GKENSWVBUT19FWF9EQVRBX0ZVTkNTKSAqKXNrX25ld19udWxsKCkpCisKKyNkZWZpbmUgc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1NfbnVtKHNrKSBcCisgIHNrX251bShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKENSWVBUT19FWF9EQVRBX0ZVTkNTKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1NfemVybyhzaykgXAorICBza196ZXJvKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQ1JZUFRPX0VYX0RBVEFfRlVOQ1MpICosIHNrKSk7CisKKyNkZWZpbmUgc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1NfdmFsdWUoc2ssIGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKENSWVBUT19FWF9EQVRBX0ZVTkNTICopc2tfdmFsdWUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKENSWVBUT19FWF9EQVRBX0ZVTkNTKSAqLCBzayksIFwKKyAgICAgIChpKSkpCisKKyNkZWZpbmUgc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1Nfc2V0KHNrLCBpLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoQ1JZUFRPX0VYX0RBVEFfRlVOQ1MgKilza19zZXQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihDUllQVE9fRVhfREFUQV9GVU5DUykgKiwgc2spLCAoaSksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIENSWVBUT19FWF9EQVRBX0ZVTkNTICosIHApKSkKKworI2RlZmluZSBza19DUllQVE9fRVhfREFUQV9GVU5DU19mcmVlKHNrKSBcCisgIHNrX2ZyZWUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihDUllQVE9fRVhfREFUQV9GVU5DUykgKiwgc2spKQorCisjZGVmaW5lIHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX3BvcF9mcmVlKHNrLCBmcmVlX2Z1bmMpICAgICAgICAgICAgICAgICAgICAgICAgXAorICBza19wb3BfZnJlZShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKENSWVBUT19FWF9EQVRBX0ZVTkNTKSAqLCBzayksICAgIFwKKyAgICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKCopKHZvaWQgKiksIHZvaWQgKCopKENSWVBUT19FWF9EQVRBX0ZVTkNTICopLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX2Z1bmMpKQorCisjZGVmaW5lIHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX2luc2VydChzaywgcCwgd2hlcmUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfaW5zZXJ0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQ1JZUFRPX0VYX0RBVEFfRlVOQ1MpICosIHNrKSwgXAorICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgQ1JZUFRPX0VYX0RBVEFfRlVOQ1MgKiwgcCksICh3aGVyZSkpCisKKyNkZWZpbmUgc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1NfZGVsZXRlKHNrLCB3aGVyZSkgXAorICAoKENSWVBUT19FWF9EQVRBX0ZVTkNTICopc2tfZGVsZXRlKCAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKENSWVBUT19FWF9EQVRBX0ZVTkNTKSAqLCBzayksICh3aGVyZSkpKQorCisjZGVmaW5lIHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX2RlbGV0ZV9wdHIoc2ssIHApICAgICAgICAgICAgICAgICAgIFwKKyAgKChDUllQVE9fRVhfREFUQV9GVU5DUyAqKXNrX2RlbGV0ZV9wdHIoICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihDUllQVE9fRVhfREFUQV9GVU5DUykgKiwgc2spLCBcCisgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBDUllQVE9fRVhfREFUQV9GVU5DUyAqLCBwKSkpCisKKyNkZWZpbmUgc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1NfZmluZChzaywgb3V0X2luZGV4LCBwKSAgICAgICAgICAgICAgICAgIFwKKyAgc2tfZmluZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKENSWVBUT19FWF9EQVRBX0ZVTkNTKSAqLCBzayksIFwKKyAgICAgICAgICAob3V0X2luZGV4KSwgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgQ1JZUFRPX0VYX0RBVEFfRlVOQ1MgKiwgcCkpCisKKyNkZWZpbmUgc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1Nfc2hpZnQoc2spIFwKKyAgKChDUllQVE9fRVhfREFUQV9GVU5DUyAqKXNrX3NoaWZ0KCAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoQ1JZUFRPX0VYX0RBVEFfRlVOQ1MpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1NfcHVzaChzaywgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfcHVzaChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKENSWVBUT19FWF9EQVRBX0ZVTkNTKSAqLCBzayksIFwKKyAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBDUllQVE9fRVhfREFUQV9GVU5DUyAqLCBwKSkKKworI2RlZmluZSBza19DUllQVE9fRVhfREFUQV9GVU5DU19wb3Aoc2spIFwKKyAgKChDUllQVE9fRVhfREFUQV9GVU5DUyAqKXNrX3BvcCggICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKENSWVBUT19FWF9EQVRBX0ZVTkNTKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX2R1cChzaykgICAgICBcCisgICgoU1RBQ0tfT0YoQ1JZUFRPX0VYX0RBVEFfRlVOQ1MpICopc2tfZHVwKCBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKENSWVBUT19FWF9EQVRBX0ZVTkNTKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX3NvcnQoc2spIFwKKyAgc2tfc29ydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKENSWVBUT19FWF9EQVRBX0ZVTkNTKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1NfaXNfc29ydGVkKHNrKSBcCisgIHNrX2lzX3NvcnRlZCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihDUllQVE9fRVhfREFUQV9GVU5DUykgKiwgc2spKQorCisjZGVmaW5lIHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX3NldF9jbXBfZnVuYyhzaywgY29tcCkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChpbnQgKCopKGNvbnN0IENSWVBUT19FWF9EQVRBX0ZVTkNTICoqYSwgY29uc3QgQ1JZUFRPX0VYX0RBVEFfRlVOQ1MgKipiKSkgXAorICAgc2tfc2V0X2NtcF9mdW5jKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihDUllQVE9fRVhfREFUQV9GVU5DUykgKiwgc2spLCAgICAgICAgIFwKKyAgICAgICBDSEVDS0VEX0NBU1Qoc3RhY2tfY21wX2Z1bmMsIGludCAoKikoY29uc3QgQ1JZUFRPX0VYX0RBVEFfRlVOQ1MgKiphLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUllQVE9fRVhfREFUQV9GVU5DUyAqKmIpLCBcCisgICAgICAgICAgICAgICAgICAgIGNvbXApKSkKKworLyogRElTVF9QT0lOVCAqLworI2RlZmluZSBza19ESVNUX1BPSU5UX25ldyhjb21wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKFNUQUNLX09GKERJU1RfUE9JTlQpICopc2tfbmV3KENIRUNLRURfQ0FTVCggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgc3RhY2tfY21wX2Z1bmMsIGludCAoKikoY29uc3QgRElTVF9QT0lOVCAqKmEsIGNvbnN0IERJU1RfUE9JTlQgKipiKSwgXAorICAgICAgY29tcCkpKQorCisjZGVmaW5lIHNrX0RJU1RfUE9JTlRfbmV3X251bGwoKSAoKFNUQUNLX09GKERJU1RfUE9JTlQpICopc2tfbmV3X251bGwoKSkKKworI2RlZmluZSBza19ESVNUX1BPSU5UX251bShzaykgXAorICBza19udW0oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihESVNUX1BPSU5UKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfRElTVF9QT0lOVF96ZXJvKHNrKSBcCisgIHNrX3plcm8oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihESVNUX1BPSU5UKSAqLCBzaykpOworCisjZGVmaW5lIHNrX0RJU1RfUE9JTlRfdmFsdWUoc2ssIGkpIFwKKyAgKChESVNUX1BPSU5UICopc2tfdmFsdWUoICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihESVNUX1BPSU5UKSAqLCBzayksIChpKSkpCisKKyNkZWZpbmUgc2tfRElTVF9QT0lOVF9zZXQoc2ssIGksIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoRElTVF9QT0lOVCAqKXNrX3NldChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKERJU1RfUE9JTlQpICosIHNrKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgKGkpLCBDSEVDS0VEX0NBU1Qodm9pZCAqLCBESVNUX1BPSU5UICosIHApKSkKKworI2RlZmluZSBza19ESVNUX1BPSU5UX2ZyZWUoc2spIFwKKyAgc2tfZnJlZShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKERJU1RfUE9JTlQpICosIHNrKSkKKworI2RlZmluZSBza19ESVNUX1BPSU5UX3BvcF9mcmVlKHNrLCBmcmVlX2Z1bmMpICAgICAgICAgICAgIFwKKyAgc2tfcG9wX2ZyZWUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKERJU1RfUE9JTlQpICosIHNrKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKCopKHZvaWQgKiksIHZvaWQgKCopKERJU1RfUE9JTlQgKiksIGZyZWVfZnVuYykpCisKKyNkZWZpbmUgc2tfRElTVF9QT0lOVF9pbnNlcnQoc2ssIHAsIHdoZXJlKSAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX2luc2VydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKERJU1RfUE9JTlQpICosIHNrKSwgXAorICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgRElTVF9QT0lOVCAqLCBwKSwgKHdoZXJlKSkKKworI2RlZmluZSBza19ESVNUX1BPSU5UX2RlbGV0ZShzaywgd2hlcmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChESVNUX1BPSU5UICopc2tfZGVsZXRlKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoRElTVF9QT0lOVCkgKiwgc2spLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hlcmUpKSkKKworI2RlZmluZSBza19ESVNUX1BPSU5UX2RlbGV0ZV9wdHIoc2ssIHApICAgICAgICAgICAgICAgICAgIFwKKyAgKChESVNUX1BPSU5UICopc2tfZGVsZXRlX3B0ciggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKERJU1RfUE9JTlQpICosIHNrKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgRElTVF9QT0lOVCAqLCBwKSkpCisKKyNkZWZpbmUgc2tfRElTVF9QT0lOVF9maW5kKHNrLCBvdXRfaW5kZXgsIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfZmluZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKERJU1RfUE9JTlQpICosIHNrKSwgKG91dF9pbmRleCksIFwKKyAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBESVNUX1BPSU5UICosIHApKQorCisjZGVmaW5lIHNrX0RJU1RfUE9JTlRfc2hpZnQoc2spIFwKKyAgKChESVNUX1BPSU5UICopc2tfc2hpZnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihESVNUX1BPSU5UKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX0RJU1RfUE9JTlRfcHVzaChzaywgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfcHVzaChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKERJU1RfUE9JTlQpICosIHNrKSwgXAorICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIERJU1RfUE9JTlQgKiwgcCkpCisKKyNkZWZpbmUgc2tfRElTVF9QT0lOVF9wb3Aoc2spIFwKKyAgKChESVNUX1BPSU5UICopc2tfcG9wKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoRElTVF9QT0lOVCkgKiwgc2spKSkKKworI2RlZmluZSBza19ESVNUX1BPSU5UX2R1cChzaykgICAgICBcCisgICgoU1RBQ0tfT0YoRElTVF9QT0lOVCkgKilza19kdXAoIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoRElTVF9QT0lOVCkgKiwgc2spKSkKKworI2RlZmluZSBza19ESVNUX1BPSU5UX3NvcnQoc2spIFwKKyAgc2tfc29ydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKERJU1RfUE9JTlQpICosIHNrKSkKKworI2RlZmluZSBza19ESVNUX1BPSU5UX2lzX3NvcnRlZChzaykgXAorICBza19pc19zb3J0ZWQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihESVNUX1BPSU5UKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfRElTVF9QT0lOVF9zZXRfY21wX2Z1bmMoc2ssIGNvbXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoaW50ICgqKShjb25zdCBESVNUX1BPSU5UICoqYSwgY29uc3QgRElTVF9QT0lOVCAqKmIpKXNrX3NldF9jbXBfZnVuYyggXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihESVNUX1BPSU5UKSAqLCBzayksICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChzdGFja19jbXBfZnVuYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgaW50ICgqKShjb25zdCBESVNUX1BPSU5UICoqYSwgY29uc3QgRElTVF9QT0lOVCAqKmIpLCAgXAorICAgICAgICAgICAgICAgICAgIGNvbXApKSkKKworLyogR0VORVJBTF9OQU1FICovCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRV9uZXcoY29tcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKFNUQUNLX09GKEdFTkVSQUxfTkFNRSkgKilza19uZXcoQ0hFQ0tFRF9DQVNUKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN0YWNrX2NtcF9mdW5jLCBpbnQgKCopKGNvbnN0IEdFTkVSQUxfTkFNRSAqKmEsIGNvbnN0IEdFTkVSQUxfTkFNRSAqKmIpLCBcCisgICAgICBjb21wKSkpCisKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FX25ld19udWxsKCkgKChTVEFDS19PRihHRU5FUkFMX05BTUUpICopc2tfbmV3X251bGwoKSkKKworI2RlZmluZSBza19HRU5FUkFMX05BTUVfbnVtKHNrKSBcCisgIHNrX251bShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEdFTkVSQUxfTkFNRSkgKiwgc2spKQorCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRV96ZXJvKHNrKSBcCisgIHNrX3plcm8oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihHRU5FUkFMX05BTUUpICosIHNrKSk7CisKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FX3ZhbHVlKHNrLCBpKSBcCisgICgoR0VORVJBTF9OQU1FICopc2tfdmFsdWUoICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihHRU5FUkFMX05BTUUpICosIHNrKSwgKGkpKSkKKworI2RlZmluZSBza19HRU5FUkFMX05BTUVfc2V0KHNrLCBpLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoR0VORVJBTF9OQU1FICopc2tfc2V0KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoR0VORVJBTF9OQU1FKSAqLCBzayksIChpKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgR0VORVJBTF9OQU1FICosIHApKSkKKworI2RlZmluZSBza19HRU5FUkFMX05BTUVfZnJlZShzaykgXAorICBza19mcmVlKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoR0VORVJBTF9OQU1FKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FX3BvcF9mcmVlKHNrLCBmcmVlX2Z1bmMpICAgICAgICAgICAgIFwKKyAgc2tfcG9wX2ZyZWUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoR0VORVJBTF9OQU1FKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICgqKSh2b2lkICopLCB2b2lkICgqKShHRU5FUkFMX05BTUUgKiksIGZyZWVfZnVuYykpCisKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FX2luc2VydChzaywgcCwgd2hlcmUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfaW5zZXJ0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoR0VORVJBTF9OQU1FKSAqLCBzayksIFwKKyAgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIEdFTkVSQUxfTkFNRSAqLCBwKSwgKHdoZXJlKSkKKworI2RlZmluZSBza19HRU5FUkFMX05BTUVfZGVsZXRlKHNrLCB3aGVyZSkgXAorICAoKEdFTkVSQUxfTkFNRSAqKXNrX2RlbGV0ZSggICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihHRU5FUkFMX05BTUUpICosIHNrKSwgKHdoZXJlKSkpCisKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FX2RlbGV0ZV9wdHIoc2ssIHApICAgICAgICAgICAgICAgICAgIFwKKyAgKChHRU5FUkFMX05BTUUgKilza19kZWxldGVfcHRyKCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoR0VORVJBTF9OQU1FKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIEdFTkVSQUxfTkFNRSAqLCBwKSkpCisKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FX2ZpbmQoc2ssIG91dF9pbmRleCwgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBza19maW5kKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoR0VORVJBTF9OQU1FKSAqLCBzayksIChvdXRfaW5kZXgpLCBcCisgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgR0VORVJBTF9OQU1FICosIHApKQorCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRV9zaGlmdChzaykgXAorICAoKEdFTkVSQUxfTkFNRSAqKXNrX3NoaWZ0KCAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoR0VORVJBTF9OQU1FKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRV9wdXNoKHNrLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBza19wdXNoKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoR0VORVJBTF9OQU1FKSAqLCBzayksIFwKKyAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBHRU5FUkFMX05BTUUgKiwgcCkpCisKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FX3BvcChzaykgXAorICAoKEdFTkVSQUxfTkFNRSAqKXNrX3BvcChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEdFTkVSQUxfTkFNRSkgKiwgc2spKSkKKworI2RlZmluZSBza19HRU5FUkFMX05BTUVfZHVwKHNrKSAgICAgIFwKKyAgKChTVEFDS19PRihHRU5FUkFMX05BTUUpICopc2tfZHVwKCBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKEdFTkVSQUxfTkFNRSkgKiwgc2spKSkKKworI2RlZmluZSBza19HRU5FUkFMX05BTUVfc29ydChzaykgXAorICBza19zb3J0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoR0VORVJBTF9OQU1FKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FX2lzX3NvcnRlZChzaykgXAorICBza19pc19zb3J0ZWQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihHRU5FUkFMX05BTUUpICosIHNrKSkKKworI2RlZmluZSBza19HRU5FUkFMX05BTUVfc2V0X2NtcF9mdW5jKHNrLCBjb21wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoaW50ICgqKShjb25zdCBHRU5FUkFMX05BTUUgKiphLCBjb25zdCBHRU5FUkFMX05BTUUgKipiKSlza19zZXRfY21wX2Z1bmMoIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoR0VORVJBTF9OQU1FKSAqLCBzayksICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHN0YWNrX2NtcF9mdW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgaW50ICgqKShjb25zdCBHRU5FUkFMX05BTUUgKiphLCBjb25zdCBHRU5FUkFMX05BTUUgKipiKSwgIFwKKyAgICAgICAgICAgICAgICAgICBjb21wKSkpCisKKy8qIEdFTkVSQUxfTkFNRVMgKi8KKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FU19uZXcoY29tcCkgICAgICAgICAgICAgICAgIFwKKyAgKChTVEFDS19PRihHRU5FUkFMX05BTUVTKSAqKXNrX25ldyhDSEVDS0VEX0NBU1QoIFwKKyAgICAgIHN0YWNrX2NtcF9mdW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGludCAoKikoY29uc3QgR0VORVJBTF9OQU1FUyAqKmEsIGNvbnN0IEdFTkVSQUxfTkFNRVMgKipiKSwgY29tcCkpKQorCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRVNfbmV3X251bGwoKSAoKFNUQUNLX09GKEdFTkVSQUxfTkFNRVMpICopc2tfbmV3X251bGwoKSkKKworI2RlZmluZSBza19HRU5FUkFMX05BTUVTX251bShzaykgXAorICBza19udW0oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihHRU5FUkFMX05BTUVTKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FU196ZXJvKHNrKSBcCisgIHNrX3plcm8oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihHRU5FUkFMX05BTUVTKSAqLCBzaykpOworCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRVNfdmFsdWUoc2ssIGkpIFwKKyAgKChHRU5FUkFMX05BTUVTICopc2tfdmFsdWUoICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihHRU5FUkFMX05BTUVTKSAqLCBzayksIChpKSkpCisKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FU19zZXQoc2ssIGksIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChHRU5FUkFMX05BTUVTICopc2tfc2V0KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoR0VORVJBTF9OQU1FUykgKiwgc2spLCAoaSksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIEdFTkVSQUxfTkFNRVMgKiwgcCkpKQorCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRVNfZnJlZShzaykgXAorICBza19mcmVlKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoR0VORVJBTF9OQU1FUykgKiwgc2spKQorCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRVNfcG9wX2ZyZWUoc2ssIGZyZWVfZnVuYykgICAgICAgICAgICAgXAorICBza19wb3BfZnJlZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoR0VORVJBTF9OQU1FUykgKiwgc2spLCBcCisgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAoKikodm9pZCAqKSwgdm9pZCAoKikoR0VORVJBTF9OQU1FUyAqKSwgZnJlZV9mdW5jKSkKKworI2RlZmluZSBza19HRU5FUkFMX05BTUVTX2luc2VydChzaywgcCwgd2hlcmUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfaW5zZXJ0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoR0VORVJBTF9OQU1FUykgKiwgc2spLCBcCisgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBHRU5FUkFMX05BTUVTICosIHApLCAod2hlcmUpKQorCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRVNfZGVsZXRlKHNrLCB3aGVyZSkgXAorICAoKEdFTkVSQUxfTkFNRVMgKilza19kZWxldGUoICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoR0VORVJBTF9OQU1FUykgKiwgc2spLCAod2hlcmUpKSkKKworI2RlZmluZSBza19HRU5FUkFMX05BTUVTX2RlbGV0ZV9wdHIoc2ssIHApICAgICAgICAgICAgICAgICAgIFwKKyAgKChHRU5FUkFMX05BTUVTICopc2tfZGVsZXRlX3B0ciggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEdFTkVSQUxfTkFNRVMpICosIHNrKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgR0VORVJBTF9OQU1FUyAqLCBwKSkpCisKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FU19maW5kKHNrLCBvdXRfaW5kZXgsIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfZmluZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEdFTkVSQUxfTkFNRVMpICosIHNrKSwgKG91dF9pbmRleCksIFwKKyAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBHRU5FUkFMX05BTUVTICosIHApKQorCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRVNfc2hpZnQoc2spIFwKKyAgKChHRU5FUkFMX05BTUVTICopc2tfc2hpZnQoICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihHRU5FUkFMX05BTUVTKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRVNfcHVzaChzaywgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfcHVzaChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEdFTkVSQUxfTkFNRVMpICosIHNrKSwgXAorICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIEdFTkVSQUxfTkFNRVMgKiwgcCkpCisKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FU19wb3Aoc2spIFwKKyAgKChHRU5FUkFMX05BTUVTICopc2tfcG9wKCAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoR0VORVJBTF9OQU1FUykgKiwgc2spKSkKKworI2RlZmluZSBza19HRU5FUkFMX05BTUVTX2R1cChzaykgICAgICBcCisgICgoU1RBQ0tfT0YoR0VORVJBTF9OQU1FUykgKilza19kdXAoIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoR0VORVJBTF9OQU1FUykgKiwgc2spKSkKKworI2RlZmluZSBza19HRU5FUkFMX05BTUVTX3NvcnQoc2spIFwKKyAgc2tfc29ydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEdFTkVSQUxfTkFNRVMpICosIHNrKSkKKworI2RlZmluZSBza19HRU5FUkFMX05BTUVTX2lzX3NvcnRlZChzaykgXAorICBza19pc19zb3J0ZWQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihHRU5FUkFMX05BTUVTKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FU19zZXRfY21wX2Z1bmMoc2ssIGNvbXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoaW50ICgqKShjb25zdCBHRU5FUkFMX05BTUVTICoqYSwgY29uc3QgR0VORVJBTF9OQU1FUyAqKmIpKXNrX3NldF9jbXBfZnVuYyggXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihHRU5FUkFMX05BTUVTKSAqLCBzayksICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChzdGFja19jbXBfZnVuYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgaW50ICgqKShjb25zdCBHRU5FUkFMX05BTUVTICoqYSwgY29uc3QgR0VORVJBTF9OQU1FUyAqKmIpLCAgXAorICAgICAgICAgICAgICAgICAgIGNvbXApKSkKKworLyogR0VORVJBTF9TVUJUUkVFICovCisjZGVmaW5lIHNrX0dFTkVSQUxfU1VCVFJFRV9uZXcoY29tcCkgICAgICAgICAgICAgICAgIFwKKyAgKChTVEFDS19PRihHRU5FUkFMX1NVQlRSRUUpICopc2tfbmV3KENIRUNLRURfQ0FTVCggXAorICAgICAgc3RhY2tfY21wX2Z1bmMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpbnQgKCopKGNvbnN0IEdFTkVSQUxfU1VCVFJFRSAqKmEsIGNvbnN0IEdFTkVSQUxfU1VCVFJFRSAqKmIpLCBjb21wKSkpCisKKyNkZWZpbmUgc2tfR0VORVJBTF9TVUJUUkVFX25ld19udWxsKCkgXAorICAoKFNUQUNLX09GKEdFTkVSQUxfU1VCVFJFRSkgKilza19uZXdfbnVsbCgpKQorCisjZGVmaW5lIHNrX0dFTkVSQUxfU1VCVFJFRV9udW0oc2spIFwKKyAgc2tfbnVtKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoR0VORVJBTF9TVUJUUkVFKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfR0VORVJBTF9TVUJUUkVFX3plcm8oc2spIFwKKyAgc2tfemVybyhDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEdFTkVSQUxfU1VCVFJFRSkgKiwgc2spKTsKKworI2RlZmluZSBza19HRU5FUkFMX1NVQlRSRUVfdmFsdWUoc2ssIGkpIFwKKyAgKChHRU5FUkFMX1NVQlRSRUUgKilza192YWx1ZSggICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKEdFTkVSQUxfU1VCVFJFRSkgKiwgc2spLCAoaSkpKQorCisjZGVmaW5lIHNrX0dFTkVSQUxfU1VCVFJFRV9zZXQoc2ssIGksIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChHRU5FUkFMX1NVQlRSRUUgKilza19zZXQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihHRU5FUkFMX1NVQlRSRUUpICosIHNrKSwgKGkpLCBcCisgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBHRU5FUkFMX1NVQlRSRUUgKiwgcCkpKQorCisjZGVmaW5lIHNrX0dFTkVSQUxfU1VCVFJFRV9mcmVlKHNrKSBcCisgIHNrX2ZyZWUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihHRU5FUkFMX1NVQlRSRUUpICosIHNrKSkKKworI2RlZmluZSBza19HRU5FUkFMX1NVQlRSRUVfcG9wX2ZyZWUoc2ssIGZyZWVfZnVuYykgICAgICAgICAgICAgXAorICBza19wb3BfZnJlZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihHRU5FUkFMX1NVQlRSRUUpICosIHNrKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKCopKHZvaWQgKiksIHZvaWQgKCopKEdFTkVSQUxfU1VCVFJFRSAqKSwgZnJlZV9mdW5jKSkKKworI2RlZmluZSBza19HRU5FUkFMX1NVQlRSRUVfaW5zZXJ0KHNrLCBwLCB3aGVyZSkgICAgICAgICAgICAgICAgICAgICAgXAorICBza19pbnNlcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihHRU5FUkFMX1NVQlRSRUUpICosIHNrKSwgXAorICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgR0VORVJBTF9TVUJUUkVFICosIHApLCAod2hlcmUpKQorCisjZGVmaW5lIHNrX0dFTkVSQUxfU1VCVFJFRV9kZWxldGUoc2ssIHdoZXJlKSBcCisgICgoR0VORVJBTF9TVUJUUkVFICopc2tfZGVsZXRlKCAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEdFTkVSQUxfU1VCVFJFRSkgKiwgc2spLCAod2hlcmUpKSkKKworI2RlZmluZSBza19HRU5FUkFMX1NVQlRSRUVfZGVsZXRlX3B0cihzaywgcCkgICAgICAgICAgICAgICAgICAgXAorICAoKEdFTkVSQUxfU1VCVFJFRSAqKXNrX2RlbGV0ZV9wdHIoICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihHRU5FUkFMX1NVQlRSRUUpICosIHNrKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgR0VORVJBTF9TVUJUUkVFICosIHApKSkKKworI2RlZmluZSBza19HRU5FUkFMX1NVQlRSRUVfZmluZChzaywgb3V0X2luZGV4LCBwKSAgICAgICAgICAgICAgICAgIFwKKyAgc2tfZmluZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEdFTkVSQUxfU1VCVFJFRSkgKiwgc2spLCBcCisgICAgICAgICAgKG91dF9pbmRleCksIENIRUNLRURfQ0FTVCh2b2lkICosIEdFTkVSQUxfU1VCVFJFRSAqLCBwKSkKKworI2RlZmluZSBza19HRU5FUkFMX1NVQlRSRUVfc2hpZnQoc2spIFwKKyAgKChHRU5FUkFMX1NVQlRSRUUgKilza19zaGlmdCggICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEdFTkVSQUxfU1VCVFJFRSkgKiwgc2spKSkKKworI2RlZmluZSBza19HRU5FUkFMX1NVQlRSRUVfcHVzaChzaywgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfcHVzaChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEdFTkVSQUxfU1VCVFJFRSkgKiwgc2spLCBcCisgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgR0VORVJBTF9TVUJUUkVFICosIHApKQorCisjZGVmaW5lIHNrX0dFTkVSQUxfU1VCVFJFRV9wb3Aoc2spIFwKKyAgKChHRU5FUkFMX1NVQlRSRUUgKilza19wb3AoICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihHRU5FUkFMX1NVQlRSRUUpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfR0VORVJBTF9TVUJUUkVFX2R1cChzaykgICAgICBcCisgICgoU1RBQ0tfT0YoR0VORVJBTF9TVUJUUkVFKSAqKXNrX2R1cCggXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihHRU5FUkFMX1NVQlRSRUUpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfR0VORVJBTF9TVUJUUkVFX3NvcnQoc2spIFwKKyAgc2tfc29ydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEdFTkVSQUxfU1VCVFJFRSkgKiwgc2spKQorCisjZGVmaW5lIHNrX0dFTkVSQUxfU1VCVFJFRV9pc19zb3J0ZWQoc2spIFwKKyAgc2tfaXNfc29ydGVkKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoR0VORVJBTF9TVUJUUkVFKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfR0VORVJBTF9TVUJUUkVFX3NldF9jbXBfZnVuYyhzaywgY29tcCkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChpbnQgKCopKGNvbnN0IEdFTkVSQUxfU1VCVFJFRSAqKmEsIGNvbnN0IEdFTkVSQUxfU1VCVFJFRSAqKmIpKSAgICAgIFwKKyAgIHNrX3NldF9jbXBfZnVuYyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKEdFTkVSQUxfU1VCVFJFRSkgKiwgc2spLCAgICAgICAgIFwKKyAgICAgICBDSEVDS0VEX0NBU1Qoc3RhY2tfY21wX2Z1bmMsIGludCAoKikoY29uc3QgR0VORVJBTF9TVUJUUkVFICoqYSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0VORVJBTF9TVUJUUkVFICoqYiksIFwKKyAgICAgICAgICAgICAgICAgICAgY29tcCkpKQorCisvKiBNSU1FX0hFQURFUiAqLworI2RlZmluZSBza19NSU1FX0hFQURFUl9uZXcoY29tcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoU1RBQ0tfT0YoTUlNRV9IRUFERVIpICopc2tfbmV3KENIRUNLRURfQ0FTVCggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN0YWNrX2NtcF9mdW5jLCBpbnQgKCopKGNvbnN0IE1JTUVfSEVBREVSICoqYSwgY29uc3QgTUlNRV9IRUFERVIgKipiKSwgXAorICAgICAgY29tcCkpKQorCisjZGVmaW5lIHNrX01JTUVfSEVBREVSX25ld19udWxsKCkgKChTVEFDS19PRihNSU1FX0hFQURFUikgKilza19uZXdfbnVsbCgpKQorCisjZGVmaW5lIHNrX01JTUVfSEVBREVSX251bShzaykgXAorICBza19udW0oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihNSU1FX0hFQURFUikgKiwgc2spKQorCisjZGVmaW5lIHNrX01JTUVfSEVBREVSX3plcm8oc2spIFwKKyAgc2tfemVybyhDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKE1JTUVfSEVBREVSKSAqLCBzaykpOworCisjZGVmaW5lIHNrX01JTUVfSEVBREVSX3ZhbHVlKHNrLCBpKSBcCisgICgoTUlNRV9IRUFERVIgKilza192YWx1ZSggICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKE1JTUVfSEVBREVSKSAqLCBzayksIChpKSkpCisKKyNkZWZpbmUgc2tfTUlNRV9IRUFERVJfc2V0KHNrLCBpLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChNSU1FX0hFQURFUiAqKXNrX3NldChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKE1JTUVfSEVBREVSKSAqLCBzayksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaSksIENIRUNLRURfQ0FTVCh2b2lkICosIE1JTUVfSEVBREVSICosIHApKSkKKworI2RlZmluZSBza19NSU1FX0hFQURFUl9mcmVlKHNrKSBcCisgIHNrX2ZyZWUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihNSU1FX0hFQURFUikgKiwgc2spKQorCisjZGVmaW5lIHNrX01JTUVfSEVBREVSX3BvcF9mcmVlKHNrLCBmcmVlX2Z1bmMpICAgICAgICAgICAgIFwKKyAgc2tfcG9wX2ZyZWUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihNSU1FX0hFQURFUikgKiwgc2spLCBcCisgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAoKikodm9pZCAqKSwgdm9pZCAoKikoTUlNRV9IRUFERVIgKiksIGZyZWVfZnVuYykpCisKKyNkZWZpbmUgc2tfTUlNRV9IRUFERVJfaW5zZXJ0KHNrLCBwLCB3aGVyZSkgICAgICAgICAgICAgICAgICAgICAgXAorICBza19pbnNlcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihNSU1FX0hFQURFUikgKiwgc2spLCBcCisgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBNSU1FX0hFQURFUiAqLCBwKSwgKHdoZXJlKSkKKworI2RlZmluZSBza19NSU1FX0hFQURFUl9kZWxldGUoc2ssIHdoZXJlKSBcCisgICgoTUlNRV9IRUFERVIgKilza19kZWxldGUoICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoTUlNRV9IRUFERVIpICosIHNrKSwgKHdoZXJlKSkpCisKKyNkZWZpbmUgc2tfTUlNRV9IRUFERVJfZGVsZXRlX3B0cihzaywgcCkgICAgICAgICAgICAgICAgICAgXAorICAoKE1JTUVfSEVBREVSICopc2tfZGVsZXRlX3B0ciggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKE1JTUVfSEVBREVSKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIE1JTUVfSEVBREVSICosIHApKSkKKworI2RlZmluZSBza19NSU1FX0hFQURFUl9maW5kKHNrLCBvdXRfaW5kZXgsIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfZmluZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKE1JTUVfSEVBREVSKSAqLCBzayksIChvdXRfaW5kZXgpLCBcCisgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgTUlNRV9IRUFERVIgKiwgcCkpCisKKyNkZWZpbmUgc2tfTUlNRV9IRUFERVJfc2hpZnQoc2spIFwKKyAgKChNSU1FX0hFQURFUiAqKXNrX3NoaWZ0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoTUlNRV9IRUFERVIpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfTUlNRV9IRUFERVJfcHVzaChzaywgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfcHVzaChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKE1JTUVfSEVBREVSKSAqLCBzayksIFwKKyAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBNSU1FX0hFQURFUiAqLCBwKSkKKworI2RlZmluZSBza19NSU1FX0hFQURFUl9wb3Aoc2spIFwKKyAgKChNSU1FX0hFQURFUiAqKXNrX3BvcChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKE1JTUVfSEVBREVSKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX01JTUVfSEVBREVSX2R1cChzaykgICAgICBcCisgICgoU1RBQ0tfT0YoTUlNRV9IRUFERVIpICopc2tfZHVwKCBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKE1JTUVfSEVBREVSKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX01JTUVfSEVBREVSX3NvcnQoc2spIFwKKyAgc2tfc29ydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKE1JTUVfSEVBREVSKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfTUlNRV9IRUFERVJfaXNfc29ydGVkKHNrKSBcCisgIHNrX2lzX3NvcnRlZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKE1JTUVfSEVBREVSKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfTUlNRV9IRUFERVJfc2V0X2NtcF9mdW5jKHNrLCBjb21wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChpbnQgKCopKGNvbnN0IE1JTUVfSEVBREVSICoqYSwgY29uc3QgTUlNRV9IRUFERVIgKipiKSlza19zZXRfY21wX2Z1bmMoIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoTUlNRV9IRUFERVIpICosIHNrKSwgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChzdGFja19jbXBfZnVuYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBpbnQgKCopKGNvbnN0IE1JTUVfSEVBREVSICoqYSwgY29uc3QgTUlNRV9IRUFERVIgKipiKSwgIFwKKyAgICAgICAgICAgICAgICAgICBjb21wKSkpCisKKy8qIFBLQ1M3X1NJR05FUl9JTkZPICovCisjZGVmaW5lIHNrX1BLQ1M3X1NJR05FUl9JTkZPX25ldyhjb21wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKFNUQUNLX09GKFBLQ1M3X1NJR05FUl9JTkZPKSAqKXNrX25ldyhDSEVDS0VEX0NBU1QoICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN0YWNrX2NtcF9mdW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpbnQgKCopKGNvbnN0IFBLQ1M3X1NJR05FUl9JTkZPICoqYSwgY29uc3QgUEtDUzdfU0lHTkVSX0lORk8gKipiKSwgXAorICAgICAgY29tcCkpKQorCisjZGVmaW5lIHNrX1BLQ1M3X1NJR05FUl9JTkZPX25ld19udWxsKCkgXAorICAoKFNUQUNLX09GKFBLQ1M3X1NJR05FUl9JTkZPKSAqKXNrX25ld19udWxsKCkpCisKKyNkZWZpbmUgc2tfUEtDUzdfU0lHTkVSX0lORk9fbnVtKHNrKSBcCisgIHNrX251bShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFBLQ1M3X1NJR05FUl9JTkZPKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfUEtDUzdfU0lHTkVSX0lORk9femVybyhzaykgXAorICBza196ZXJvKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUEtDUzdfU0lHTkVSX0lORk8pICosIHNrKSk7CisKKyNkZWZpbmUgc2tfUEtDUzdfU0lHTkVSX0lORk9fdmFsdWUoc2ssIGkpIFwKKyAgKChQS0NTN19TSUdORVJfSU5GTyAqKXNrX3ZhbHVlKCAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoUEtDUzdfU0lHTkVSX0lORk8pICosIHNrKSwgKGkpKSkKKworI2RlZmluZSBza19QS0NTN19TSUdORVJfSU5GT19zZXQoc2ssIGksIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChQS0NTN19TSUdORVJfSU5GTyAqKXNrX3NldCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFBLQ1M3X1NJR05FUl9JTkZPKSAqLCBzayksIChpKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgUEtDUzdfU0lHTkVSX0lORk8gKiwgcCkpKQorCisjZGVmaW5lIHNrX1BLQ1M3X1NJR05FUl9JTkZPX2ZyZWUoc2spIFwKKyAgc2tfZnJlZShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFBLQ1M3X1NJR05FUl9JTkZPKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfUEtDUzdfU0lHTkVSX0lORk9fcG9wX2ZyZWUoc2ssIGZyZWVfZnVuYykgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX3BvcF9mcmVlKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUEtDUzdfU0lHTkVSX0lORk8pICosIHNrKSwgICAgXAorICAgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAoKikodm9pZCAqKSwgdm9pZCAoKikoUEtDUzdfU0lHTkVSX0lORk8gKiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfZnVuYykpCisKKyNkZWZpbmUgc2tfUEtDUzdfU0lHTkVSX0lORk9faW5zZXJ0KHNrLCBwLCB3aGVyZSkgICAgICAgICAgICAgICAgICAgICAgXAorICBza19pbnNlcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihQS0NTN19TSUdORVJfSU5GTykgKiwgc2spLCBcCisgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBQS0NTN19TSUdORVJfSU5GTyAqLCBwKSwgKHdoZXJlKSkKKworI2RlZmluZSBza19QS0NTN19TSUdORVJfSU5GT19kZWxldGUoc2ssIHdoZXJlKSBcCisgICgoUEtDUzdfU0lHTkVSX0lORk8gKilza19kZWxldGUoICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUEtDUzdfU0lHTkVSX0lORk8pICosIHNrKSwgKHdoZXJlKSkpCisKKyNkZWZpbmUgc2tfUEtDUzdfU0lHTkVSX0lORk9fZGVsZXRlX3B0cihzaywgcCkgICAgICAgICAgICAgICAgICAgXAorICAoKFBLQ1M3X1NJR05FUl9JTkZPICopc2tfZGVsZXRlX3B0ciggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFBLQ1M3X1NJR05FUl9JTkZPKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFBLQ1M3X1NJR05FUl9JTkZPICosIHApKSkKKworI2RlZmluZSBza19QS0NTN19TSUdORVJfSU5GT19maW5kKHNrLCBvdXRfaW5kZXgsIHApICAgICAgICAgICAgICAgICAgXAorICBza19maW5kKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUEtDUzdfU0lHTkVSX0lORk8pICosIHNrKSwgXAorICAgICAgICAgIChvdXRfaW5kZXgpLCBDSEVDS0VEX0NBU1Qodm9pZCAqLCBQS0NTN19TSUdORVJfSU5GTyAqLCBwKSkKKworI2RlZmluZSBza19QS0NTN19TSUdORVJfSU5GT19zaGlmdChzaykgXAorICAoKFBLQ1M3X1NJR05FUl9JTkZPICopc2tfc2hpZnQoICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihQS0NTN19TSUdORVJfSU5GTykgKiwgc2spKSkKKworI2RlZmluZSBza19QS0NTN19TSUdORVJfSU5GT19wdXNoKHNrLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBza19wdXNoKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUEtDUzdfU0lHTkVSX0lORk8pICosIHNrKSwgXAorICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFBLQ1M3X1NJR05FUl9JTkZPICosIHApKQorCisjZGVmaW5lIHNrX1BLQ1M3X1NJR05FUl9JTkZPX3BvcChzaykgXAorICAoKFBLQ1M3X1NJR05FUl9JTkZPICopc2tfcG9wKCAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUEtDUzdfU0lHTkVSX0lORk8pICosIHNrKSkpCisKKyNkZWZpbmUgc2tfUEtDUzdfU0lHTkVSX0lORk9fZHVwKHNrKSAgICAgIFwKKyAgKChTVEFDS19PRihQS0NTN19TSUdORVJfSU5GTykgKilza19kdXAoIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoUEtDUzdfU0lHTkVSX0lORk8pICosIHNrKSkpCisKKyNkZWZpbmUgc2tfUEtDUzdfU0lHTkVSX0lORk9fc29ydChzaykgXAorICBza19zb3J0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUEtDUzdfU0lHTkVSX0lORk8pICosIHNrKSkKKworI2RlZmluZSBza19QS0NTN19TSUdORVJfSU5GT19pc19zb3J0ZWQoc2spIFwKKyAgc2tfaXNfc29ydGVkKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoUEtDUzdfU0lHTkVSX0lORk8pICosIHNrKSkKKworI2RlZmluZSBza19QS0NTN19TSUdORVJfSU5GT19zZXRfY21wX2Z1bmMoc2ssIGNvbXApICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoaW50ICgqKShjb25zdCBQS0NTN19TSUdORVJfSU5GTyAqKmEsIGNvbnN0IFBLQ1M3X1NJR05FUl9JTkZPICoqYikpICAgIFwKKyAgIHNrX3NldF9jbXBfZnVuYyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUEtDUzdfU0lHTkVSX0lORk8pICosIHNrKSwgICAgICAgICBcCisgICAgICAgQ0hFQ0tFRF9DQVNUKHN0YWNrX2NtcF9mdW5jLCBpbnQgKCopKGNvbnN0IFBLQ1M3X1NJR05FUl9JTkZPICoqYSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUEtDUzdfU0lHTkVSX0lORk8gKipiKSwgXAorICAgICAgICAgICAgICAgICAgICBjb21wKSkpCisKKy8qIFBLQ1M3X1JFQ0lQX0lORk8gKi8KKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19uZXcoY29tcCkgICAgICAgICAgICAgICAgIFwKKyAgKChTVEFDS19PRihQS0NTN19SRUNJUF9JTkZPKSAqKXNrX25ldyhDSEVDS0VEX0NBU1QoIFwKKyAgICAgIHN0YWNrX2NtcF9mdW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGludCAoKikoY29uc3QgUEtDUzdfUkVDSVBfSU5GTyAqKmEsIGNvbnN0IFBLQ1M3X1JFQ0lQX0lORk8gKipiKSwgY29tcCkpKQorCisjZGVmaW5lIHNrX1BLQ1M3X1JFQ0lQX0lORk9fbmV3X251bGwoKSBcCisgICgoU1RBQ0tfT0YoUEtDUzdfUkVDSVBfSU5GTykgKilza19uZXdfbnVsbCgpKQorCisjZGVmaW5lIHNrX1BLQ1M3X1JFQ0lQX0lORk9fbnVtKHNrKSBcCisgIHNrX251bShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFBLQ1M3X1JFQ0lQX0lORk8pICosIHNrKSkKKworI2RlZmluZSBza19QS0NTN19SRUNJUF9JTkZPX3plcm8oc2spIFwKKyAgc2tfemVybyhDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFBLQ1M3X1JFQ0lQX0lORk8pICosIHNrKSk7CisKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT192YWx1ZShzaywgaSkgXAorICAoKFBLQ1M3X1JFQ0lQX0lORk8gKilza192YWx1ZSggICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFBLQ1M3X1JFQ0lQX0lORk8pICosIHNrKSwgKGkpKSkKKworI2RlZmluZSBza19QS0NTN19SRUNJUF9JTkZPX3NldChzaywgaSwgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKFBLQ1M3X1JFQ0lQX0lORk8gKilza19zZXQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihQS0NTN19SRUNJUF9JTkZPKSAqLCBzayksIChpKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgUEtDUzdfUkVDSVBfSU5GTyAqLCBwKSkpCisKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19mcmVlKHNrKSBcCisgIHNrX2ZyZWUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihQS0NTN19SRUNJUF9JTkZPKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19wb3BfZnJlZShzaywgZnJlZV9mdW5jKSAgICAgICAgICAgICBcCisgIHNrX3BvcF9mcmVlKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihQS0NTN19SRUNJUF9JTkZPKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICgqKSh2b2lkICopLCB2b2lkICgqKShQS0NTN19SRUNJUF9JTkZPICopLCBmcmVlX2Z1bmMpKQorCisjZGVmaW5lIHNrX1BLQ1M3X1JFQ0lQX0lORk9faW5zZXJ0KHNrLCBwLCB3aGVyZSkgICAgICAgICAgICAgICAgICAgICAgXAorICBza19pbnNlcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihQS0NTN19SRUNJUF9JTkZPKSAqLCBzayksIFwKKyAgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFBLQ1M3X1JFQ0lQX0lORk8gKiwgcCksICh3aGVyZSkpCisKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19kZWxldGUoc2ssIHdoZXJlKSBcCisgICgoUEtDUzdfUkVDSVBfSU5GTyAqKXNrX2RlbGV0ZSggICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihQS0NTN19SRUNJUF9JTkZPKSAqLCBzayksICh3aGVyZSkpKQorCisjZGVmaW5lIHNrX1BLQ1M3X1JFQ0lQX0lORk9fZGVsZXRlX3B0cihzaywgcCkgICAgICAgICAgICAgICAgICAgXAorICAoKFBLQ1M3X1JFQ0lQX0lORk8gKilza19kZWxldGVfcHRyKCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUEtDUzdfUkVDSVBfSU5GTykgKiwgc2spLCBcCisgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBQS0NTN19SRUNJUF9JTkZPICosIHApKSkKKworI2RlZmluZSBza19QS0NTN19SRUNJUF9JTkZPX2ZpbmQoc2ssIG91dF9pbmRleCwgcCkgICAgICAgICAgICAgICAgICBcCisgIHNrX2ZpbmQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihQS0NTN19SRUNJUF9JTkZPKSAqLCBzayksIFwKKyAgICAgICAgICAob3V0X2luZGV4KSwgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgUEtDUzdfUkVDSVBfSU5GTyAqLCBwKSkKKworI2RlZmluZSBza19QS0NTN19SRUNJUF9JTkZPX3NoaWZ0KHNrKSBcCisgICgoUEtDUzdfUkVDSVBfSU5GTyAqKXNrX3NoaWZ0KCAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUEtDUzdfUkVDSVBfSU5GTykgKiwgc2spKSkKKworI2RlZmluZSBza19QS0NTN19SRUNJUF9JTkZPX3B1c2goc2ssIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX3B1c2goQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihQS0NTN19SRUNJUF9JTkZPKSAqLCBzayksIFwKKyAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBQS0NTN19SRUNJUF9JTkZPICosIHApKQorCisjZGVmaW5lIHNrX1BLQ1M3X1JFQ0lQX0lORk9fcG9wKHNrKSBcCisgICgoUEtDUzdfUkVDSVBfSU5GTyAqKXNrX3BvcCggICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFBLQ1M3X1JFQ0lQX0lORk8pICosIHNrKSkpCisKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19kdXAoc2spICAgICAgXAorICAoKFNUQUNLX09GKFBLQ1M3X1JFQ0lQX0lORk8pICopc2tfZHVwKCBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFBLQ1M3X1JFQ0lQX0lORk8pICosIHNrKSkpCisKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19zb3J0KHNrKSBcCisgIHNrX3NvcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihQS0NTN19SRUNJUF9JTkZPKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19pc19zb3J0ZWQoc2spIFwKKyAgc2tfaXNfc29ydGVkKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoUEtDUzdfUkVDSVBfSU5GTykgKiwgc2spKQorCisjZGVmaW5lIHNrX1BLQ1M3X1JFQ0lQX0lORk9fc2V0X2NtcF9mdW5jKHNrLCBjb21wKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKGludCAoKikoY29uc3QgUEtDUzdfUkVDSVBfSU5GTyAqKmEsIGNvbnN0IFBLQ1M3X1JFQ0lQX0lORk8gKipiKSkgICAgIFwKKyAgIHNrX3NldF9jbXBfZnVuYyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihQS0NTN19SRUNJUF9JTkZPKSAqLCBzayksICAgICAgICAgXAorICAgICAgIENIRUNLRURfQ0FTVChzdGFja19jbXBfZnVuYywgaW50ICgqKShjb25zdCBQS0NTN19SRUNJUF9JTkZPICoqYSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUEtDUzdfUkVDSVBfSU5GTyAqKmIpLCBcCisgICAgICAgICAgICAgICAgICAgIGNvbXApKSkKKworLyogUE9MSUNZSU5GTyAqLworI2RlZmluZSBza19QT0xJQ1lJTkZPX25ldyhjb21wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKFNUQUNLX09GKFBPTElDWUlORk8pICopc2tfbmV3KENIRUNLRURfQ0FTVCggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgc3RhY2tfY21wX2Z1bmMsIGludCAoKikoY29uc3QgUE9MSUNZSU5GTyAqKmEsIGNvbnN0IFBPTElDWUlORk8gKipiKSwgXAorICAgICAgY29tcCkpKQorCisjZGVmaW5lIHNrX1BPTElDWUlORk9fbmV3X251bGwoKSAoKFNUQUNLX09GKFBPTElDWUlORk8pICopc2tfbmV3X251bGwoKSkKKworI2RlZmluZSBza19QT0xJQ1lJTkZPX251bShzaykgXAorICBza19udW0oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihQT0xJQ1lJTkZPKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfUE9MSUNZSU5GT196ZXJvKHNrKSBcCisgIHNrX3plcm8oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihQT0xJQ1lJTkZPKSAqLCBzaykpOworCisjZGVmaW5lIHNrX1BPTElDWUlORk9fdmFsdWUoc2ssIGkpIFwKKyAgKChQT0xJQ1lJTkZPICopc2tfdmFsdWUoICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihQT0xJQ1lJTkZPKSAqLCBzayksIChpKSkpCisKKyNkZWZpbmUgc2tfUE9MSUNZSU5GT19zZXQoc2ssIGksIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoUE9MSUNZSU5GTyAqKXNrX3NldChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFBPTElDWUlORk8pICosIHNrKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgKGkpLCBDSEVDS0VEX0NBU1Qodm9pZCAqLCBQT0xJQ1lJTkZPICosIHApKSkKKworI2RlZmluZSBza19QT0xJQ1lJTkZPX2ZyZWUoc2spIFwKKyAgc2tfZnJlZShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFBPTElDWUlORk8pICosIHNrKSkKKworI2RlZmluZSBza19QT0xJQ1lJTkZPX3BvcF9mcmVlKHNrLCBmcmVlX2Z1bmMpICAgICAgICAgICAgIFwKKyAgc2tfcG9wX2ZyZWUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFBPTElDWUlORk8pICosIHNrKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKCopKHZvaWQgKiksIHZvaWQgKCopKFBPTElDWUlORk8gKiksIGZyZWVfZnVuYykpCisKKyNkZWZpbmUgc2tfUE9MSUNZSU5GT19pbnNlcnQoc2ssIHAsIHdoZXJlKSAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX2luc2VydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFBPTElDWUlORk8pICosIHNrKSwgXAorICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgUE9MSUNZSU5GTyAqLCBwKSwgKHdoZXJlKSkKKworI2RlZmluZSBza19QT0xJQ1lJTkZPX2RlbGV0ZShzaywgd2hlcmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChQT0xJQ1lJTkZPICopc2tfZGVsZXRlKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUE9MSUNZSU5GTykgKiwgc2spLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hlcmUpKSkKKworI2RlZmluZSBza19QT0xJQ1lJTkZPX2RlbGV0ZV9wdHIoc2ssIHApICAgICAgICAgICAgICAgICAgIFwKKyAgKChQT0xJQ1lJTkZPICopc2tfZGVsZXRlX3B0ciggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFBPTElDWUlORk8pICosIHNrKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgUE9MSUNZSU5GTyAqLCBwKSkpCisKKyNkZWZpbmUgc2tfUE9MSUNZSU5GT19maW5kKHNrLCBvdXRfaW5kZXgsIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfZmluZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFBPTElDWUlORk8pICosIHNrKSwgKG91dF9pbmRleCksIFwKKyAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBQT0xJQ1lJTkZPICosIHApKQorCisjZGVmaW5lIHNrX1BPTElDWUlORk9fc2hpZnQoc2spIFwKKyAgKChQT0xJQ1lJTkZPICopc2tfc2hpZnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihQT0xJQ1lJTkZPKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX1BPTElDWUlORk9fcHVzaChzaywgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfcHVzaChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFBPTElDWUlORk8pICosIHNrKSwgXAorICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFBPTElDWUlORk8gKiwgcCkpCisKKyNkZWZpbmUgc2tfUE9MSUNZSU5GT19wb3Aoc2spIFwKKyAgKChQT0xJQ1lJTkZPICopc2tfcG9wKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUE9MSUNZSU5GTykgKiwgc2spKSkKKworI2RlZmluZSBza19QT0xJQ1lJTkZPX2R1cChzaykgICAgICBcCisgICgoU1RBQ0tfT0YoUE9MSUNZSU5GTykgKilza19kdXAoIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoUE9MSUNZSU5GTykgKiwgc2spKSkKKworI2RlZmluZSBza19QT0xJQ1lJTkZPX3NvcnQoc2spIFwKKyAgc2tfc29ydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFBPTElDWUlORk8pICosIHNrKSkKKworI2RlZmluZSBza19QT0xJQ1lJTkZPX2lzX3NvcnRlZChzaykgXAorICBza19pc19zb3J0ZWQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihQT0xJQ1lJTkZPKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfUE9MSUNZSU5GT19zZXRfY21wX2Z1bmMoc2ssIGNvbXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoaW50ICgqKShjb25zdCBQT0xJQ1lJTkZPICoqYSwgY29uc3QgUE9MSUNZSU5GTyAqKmIpKXNrX3NldF9jbXBfZnVuYyggXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihQT0xJQ1lJTkZPKSAqLCBzayksICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChzdGFja19jbXBfZnVuYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgaW50ICgqKShjb25zdCBQT0xJQ1lJTkZPICoqYSwgY29uc3QgUE9MSUNZSU5GTyAqKmIpLCAgXAorICAgICAgICAgICAgICAgICAgIGNvbXApKSkKKworLyogUE9MSUNZUVVBTElORk8gKi8KKyNkZWZpbmUgc2tfUE9MSUNZUVVBTElORk9fbmV3KGNvbXApICAgICAgICAgICAgICAgICBcCisgICgoU1RBQ0tfT0YoUE9MSUNZUVVBTElORk8pICopc2tfbmV3KENIRUNLRURfQ0FTVCggXAorICAgICAgc3RhY2tfY21wX2Z1bmMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGludCAoKikoY29uc3QgUE9MSUNZUVVBTElORk8gKiphLCBjb25zdCBQT0xJQ1lRVUFMSU5GTyAqKmIpLCBjb21wKSkpCisKKyNkZWZpbmUgc2tfUE9MSUNZUVVBTElORk9fbmV3X251bGwoKSAoKFNUQUNLX09GKFBPTElDWVFVQUxJTkZPKSAqKXNrX25ld19udWxsKCkpCisKKyNkZWZpbmUgc2tfUE9MSUNZUVVBTElORk9fbnVtKHNrKSBcCisgIHNrX251bShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFBPTElDWVFVQUxJTkZPKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfUE9MSUNZUVVBTElORk9femVybyhzaykgXAorICBza196ZXJvKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUE9MSUNZUVVBTElORk8pICosIHNrKSk7CisKKyNkZWZpbmUgc2tfUE9MSUNZUVVBTElORk9fdmFsdWUoc2ssIGkpIFwKKyAgKChQT0xJQ1lRVUFMSU5GTyAqKXNrX3ZhbHVlKCAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoUE9MSUNZUVVBTElORk8pICosIHNrKSwgKGkpKSkKKworI2RlZmluZSBza19QT0xJQ1lRVUFMSU5GT19zZXQoc2ssIGksIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChQT0xJQ1lRVUFMSU5GTyAqKXNrX3NldCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFBPTElDWVFVQUxJTkZPKSAqLCBzayksIChpKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgUE9MSUNZUVVBTElORk8gKiwgcCkpKQorCisjZGVmaW5lIHNrX1BPTElDWVFVQUxJTkZPX2ZyZWUoc2spIFwKKyAgc2tfZnJlZShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFBPTElDWVFVQUxJTkZPKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfUE9MSUNZUVVBTElORk9fcG9wX2ZyZWUoc2ssIGZyZWVfZnVuYykgICAgICAgICAgICAgXAorICBza19wb3BfZnJlZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFBPTElDWVFVQUxJTkZPKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICgqKSh2b2lkICopLCB2b2lkICgqKShQT0xJQ1lRVUFMSU5GTyAqKSwgZnJlZV9mdW5jKSkKKworI2RlZmluZSBza19QT0xJQ1lRVUFMSU5GT19pbnNlcnQoc2ssIHAsIHdoZXJlKSAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX2luc2VydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFBPTElDWVFVQUxJTkZPKSAqLCBzayksIFwKKyAgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFBPTElDWVFVQUxJTkZPICosIHApLCAod2hlcmUpKQorCisjZGVmaW5lIHNrX1BPTElDWVFVQUxJTkZPX2RlbGV0ZShzaywgd2hlcmUpIFwKKyAgKChQT0xJQ1lRVUFMSU5GTyAqKXNrX2RlbGV0ZSggICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihQT0xJQ1lRVUFMSU5GTykgKiwgc2spLCAod2hlcmUpKSkKKworI2RlZmluZSBza19QT0xJQ1lRVUFMSU5GT19kZWxldGVfcHRyKHNrLCBwKSAgICAgICAgICAgICAgICAgICBcCisgICgoUE9MSUNZUVVBTElORk8gKilza19kZWxldGVfcHRyKCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUE9MSUNZUVVBTElORk8pICosIHNrKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgUE9MSUNZUVVBTElORk8gKiwgcCkpKQorCisjZGVmaW5lIHNrX1BPTElDWVFVQUxJTkZPX2ZpbmQoc2ssIG91dF9pbmRleCwgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBza19maW5kKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUE9MSUNZUVVBTElORk8pICosIHNrKSwgKG91dF9pbmRleCksIFwKKyAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBQT0xJQ1lRVUFMSU5GTyAqLCBwKSkKKworI2RlZmluZSBza19QT0xJQ1lRVUFMSU5GT19zaGlmdChzaykgXAorICAoKFBPTElDWVFVQUxJTkZPICopc2tfc2hpZnQoICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihQT0xJQ1lRVUFMSU5GTykgKiwgc2spKSkKKworI2RlZmluZSBza19QT0xJQ1lRVUFMSU5GT19wdXNoKHNrLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBza19wdXNoKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUE9MSUNZUVVBTElORk8pICosIHNrKSwgXAorICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFBPTElDWVFVQUxJTkZPICosIHApKQorCisjZGVmaW5lIHNrX1BPTElDWVFVQUxJTkZPX3BvcChzaykgXAorICAoKFBPTElDWVFVQUxJTkZPICopc2tfcG9wKCAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUE9MSUNZUVVBTElORk8pICosIHNrKSkpCisKKyNkZWZpbmUgc2tfUE9MSUNZUVVBTElORk9fZHVwKHNrKSAgICAgIFwKKyAgKChTVEFDS19PRihQT0xJQ1lRVUFMSU5GTykgKilza19kdXAoIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoUE9MSUNZUVVBTElORk8pICosIHNrKSkpCisKKyNkZWZpbmUgc2tfUE9MSUNZUVVBTElORk9fc29ydChzaykgXAorICBza19zb3J0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUE9MSUNZUVVBTElORk8pICosIHNrKSkKKworI2RlZmluZSBza19QT0xJQ1lRVUFMSU5GT19pc19zb3J0ZWQoc2spIFwKKyAgc2tfaXNfc29ydGVkKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoUE9MSUNZUVVBTElORk8pICosIHNrKSkKKworI2RlZmluZSBza19QT0xJQ1lRVUFMSU5GT19zZXRfY21wX2Z1bmMoc2ssIGNvbXApICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoaW50ICgqKShjb25zdCBQT0xJQ1lRVUFMSU5GTyAqKmEsIGNvbnN0IFBPTElDWVFVQUxJTkZPICoqYikpICAgICAgIFwKKyAgIHNrX3NldF9jbXBfZnVuYyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUE9MSUNZUVVBTElORk8pICosIHNrKSwgICAgICAgICBcCisgICAgICAgQ0hFQ0tFRF9DQVNUKHN0YWNrX2NtcF9mdW5jLCBpbnQgKCopKGNvbnN0IFBPTElDWVFVQUxJTkZPICoqYSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUE9MSUNZUVVBTElORk8gKipiKSwgXAorICAgICAgICAgICAgICAgICAgICBjb21wKSkpCisKKy8qIFBPTElDWV9NQVBQSU5HICovCisjZGVmaW5lIHNrX1BPTElDWV9NQVBQSU5HX25ldyhjb21wKSAgICAgICAgICAgICAgICAgXAorICAoKFNUQUNLX09GKFBPTElDWV9NQVBQSU5HKSAqKXNrX25ldyhDSEVDS0VEX0NBU1QoIFwKKyAgICAgIHN0YWNrX2NtcF9mdW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpbnQgKCopKGNvbnN0IFBPTElDWV9NQVBQSU5HICoqYSwgY29uc3QgUE9MSUNZX01BUFBJTkcgKipiKSwgY29tcCkpKQorCisjZGVmaW5lIHNrX1BPTElDWV9NQVBQSU5HX25ld19udWxsKCkgKChTVEFDS19PRihQT0xJQ1lfTUFQUElORykgKilza19uZXdfbnVsbCgpKQorCisjZGVmaW5lIHNrX1BPTElDWV9NQVBQSU5HX251bShzaykgXAorICBza19udW0oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihQT0xJQ1lfTUFQUElORykgKiwgc2spKQorCisjZGVmaW5lIHNrX1BPTElDWV9NQVBQSU5HX3plcm8oc2spIFwKKyAgc2tfemVybyhDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFBPTElDWV9NQVBQSU5HKSAqLCBzaykpOworCisjZGVmaW5lIHNrX1BPTElDWV9NQVBQSU5HX3ZhbHVlKHNrLCBpKSBcCisgICgoUE9MSUNZX01BUFBJTkcgKilza192YWx1ZSggICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFBPTElDWV9NQVBQSU5HKSAqLCBzayksIChpKSkpCisKKyNkZWZpbmUgc2tfUE9MSUNZX01BUFBJTkdfc2V0KHNrLCBpLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoUE9MSUNZX01BUFBJTkcgKilza19zZXQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihQT0xJQ1lfTUFQUElORykgKiwgc2spLCAoaSksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFBPTElDWV9NQVBQSU5HICosIHApKSkKKworI2RlZmluZSBza19QT0xJQ1lfTUFQUElOR19mcmVlKHNrKSBcCisgIHNrX2ZyZWUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihQT0xJQ1lfTUFQUElORykgKiwgc2spKQorCisjZGVmaW5lIHNrX1BPTElDWV9NQVBQSU5HX3BvcF9mcmVlKHNrLCBmcmVlX2Z1bmMpICAgICAgICAgICAgIFwKKyAgc2tfcG9wX2ZyZWUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihQT0xJQ1lfTUFQUElORykgKiwgc2spLCBcCisgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAoKikodm9pZCAqKSwgdm9pZCAoKikoUE9MSUNZX01BUFBJTkcgKiksIGZyZWVfZnVuYykpCisKKyNkZWZpbmUgc2tfUE9MSUNZX01BUFBJTkdfaW5zZXJ0KHNrLCBwLCB3aGVyZSkgICAgICAgICAgICAgICAgICAgICAgXAorICBza19pbnNlcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihQT0xJQ1lfTUFQUElORykgKiwgc2spLCBcCisgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBQT0xJQ1lfTUFQUElORyAqLCBwKSwgKHdoZXJlKSkKKworI2RlZmluZSBza19QT0xJQ1lfTUFQUElOR19kZWxldGUoc2ssIHdoZXJlKSBcCisgICgoUE9MSUNZX01BUFBJTkcgKilza19kZWxldGUoICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUE9MSUNZX01BUFBJTkcpICosIHNrKSwgKHdoZXJlKSkpCisKKyNkZWZpbmUgc2tfUE9MSUNZX01BUFBJTkdfZGVsZXRlX3B0cihzaywgcCkgICAgICAgICAgICAgICAgICAgXAorICAoKFBPTElDWV9NQVBQSU5HICopc2tfZGVsZXRlX3B0ciggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFBPTElDWV9NQVBQSU5HKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFBPTElDWV9NQVBQSU5HICosIHApKSkKKworI2RlZmluZSBza19QT0xJQ1lfTUFQUElOR19maW5kKHNrLCBvdXRfaW5kZXgsIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfZmluZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFBPTElDWV9NQVBQSU5HKSAqLCBzayksIChvdXRfaW5kZXgpLCBcCisgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgUE9MSUNZX01BUFBJTkcgKiwgcCkpCisKKyNkZWZpbmUgc2tfUE9MSUNZX01BUFBJTkdfc2hpZnQoc2spIFwKKyAgKChQT0xJQ1lfTUFQUElORyAqKXNrX3NoaWZ0KCAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoUE9MSUNZX01BUFBJTkcpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfUE9MSUNZX01BUFBJTkdfcHVzaChzaywgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfcHVzaChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFBPTElDWV9NQVBQSU5HKSAqLCBzayksIFwKKyAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBQT0xJQ1lfTUFQUElORyAqLCBwKSkKKworI2RlZmluZSBza19QT0xJQ1lfTUFQUElOR19wb3Aoc2spIFwKKyAgKChQT0xJQ1lfTUFQUElORyAqKXNrX3BvcCggICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFBPTElDWV9NQVBQSU5HKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX1BPTElDWV9NQVBQSU5HX2R1cChzaykgICAgICBcCisgICgoU1RBQ0tfT0YoUE9MSUNZX01BUFBJTkcpICopc2tfZHVwKCBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFBPTElDWV9NQVBQSU5HKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX1BPTElDWV9NQVBQSU5HX3NvcnQoc2spIFwKKyAgc2tfc29ydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFBPTElDWV9NQVBQSU5HKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfUE9MSUNZX01BUFBJTkdfaXNfc29ydGVkKHNrKSBcCisgIHNrX2lzX3NvcnRlZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFBPTElDWV9NQVBQSU5HKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfUE9MSUNZX01BUFBJTkdfc2V0X2NtcF9mdW5jKHNrLCBjb21wKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKGludCAoKikoY29uc3QgUE9MSUNZX01BUFBJTkcgKiphLCBjb25zdCBQT0xJQ1lfTUFQUElORyAqKmIpKSAgICAgICBcCisgICBza19zZXRfY21wX2Z1bmMoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFBPTElDWV9NQVBQSU5HKSAqLCBzayksICAgICAgICAgXAorICAgICAgIENIRUNLRURfQ0FTVChzdGFja19jbXBfZnVuYywgaW50ICgqKShjb25zdCBQT0xJQ1lfTUFQUElORyAqKmEsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBPTElDWV9NQVBQSU5HICoqYiksIFwKKyAgICAgICAgICAgICAgICAgICAgY29tcCkpKQorCisvKiBTUlRQX1BST1RFQ1RJT05fUFJPRklMRSAqLworI2RlZmluZSBza19TUlRQX1BST1RFQ1RJT05fUFJPRklMRV9uZXcoY29tcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChTVEFDS19PRihTUlRQX1BST1RFQ1RJT05fUFJPRklMRSkgKilza19uZXcoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1Qoc3RhY2tfY21wX2Z1bmMsIGludCAoKikoY29uc3QgU1JUUF9QUk9URUNUSU9OX1BST0ZJTEUgKiphLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNSVFBfUFJPVEVDVElPTl9QUk9GSUxFICoqYiksIFwKKyAgICAgICAgICAgICAgICAgICBjb21wKSkpCisKKyNkZWZpbmUgc2tfU1JUUF9QUk9URUNUSU9OX1BST0ZJTEVfbmV3X251bGwoKSBcCisgICgoU1RBQ0tfT0YoU1JUUF9QUk9URUNUSU9OX1BST0ZJTEUpICopc2tfbmV3X251bGwoKSkKKworI2RlZmluZSBza19TUlRQX1BST1RFQ1RJT05fUFJPRklMRV9udW0oc2spIFwKKyAgc2tfbnVtKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoU1JUUF9QUk9URUNUSU9OX1BST0ZJTEUpICosIHNrKSkKKworI2RlZmluZSBza19TUlRQX1BST1RFQ1RJT05fUFJPRklMRV96ZXJvKHNrKSBcCisgIHNrX3plcm8oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihTUlRQX1BST1RFQ1RJT05fUFJPRklMRSkgKiwgc2spKTsKKworI2RlZmluZSBza19TUlRQX1BST1RFQ1RJT05fUFJPRklMRV92YWx1ZShzaywgaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoU1JUUF9QUk9URUNUSU9OX1BST0ZJTEUgKilza192YWx1ZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoU1JUUF9QUk9URUNUSU9OX1BST0ZJTEUpICosIHNrKSwgXAorICAgICAgKGkpKSkKKworI2RlZmluZSBza19TUlRQX1BST1RFQ1RJT05fUFJPRklMRV9zZXQoc2ssIGksIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChTUlRQX1BST1RFQ1RJT05fUFJPRklMRSAqKXNrX3NldCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNSVFBfUFJPVEVDVElPTl9QUk9GSUxFKSAqLCBzayksIChpKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgU1JUUF9QUk9URUNUSU9OX1BST0ZJTEUgKiwgcCkpKQorCisjZGVmaW5lIHNrX1NSVFBfUFJPVEVDVElPTl9QUk9GSUxFX2ZyZWUoc2spIFwKKyAgc2tfZnJlZShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNSVFBfUFJPVEVDVElPTl9QUk9GSUxFKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfU1JUUF9QUk9URUNUSU9OX1BST0ZJTEVfcG9wX2ZyZWUoc2ssIGZyZWVfZnVuYykgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX3BvcF9mcmVlKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoU1JUUF9QUk9URUNUSU9OX1BST0ZJTEUpICosIHNrKSwgXAorICAgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAoKikodm9pZCAqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCopKFNSVFBfUFJPVEVDVElPTl9QUk9GSUxFICopLCBmcmVlX2Z1bmMpKQorCisjZGVmaW5lIHNrX1NSVFBfUFJPVEVDVElPTl9QUk9GSUxFX2luc2VydChzaywgcCwgd2hlcmUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfaW5zZXJ0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoU1JUUF9QUk9URUNUSU9OX1BST0ZJTEUpICosIHNrKSwgXAorICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgU1JUUF9QUk9URUNUSU9OX1BST0ZJTEUgKiwgcCksICh3aGVyZSkpCisKKyNkZWZpbmUgc2tfU1JUUF9QUk9URUNUSU9OX1BST0ZJTEVfZGVsZXRlKHNrLCB3aGVyZSkgICAgICAgICAgICAgICAgICAgXAorICAoKFNSVFBfUFJPVEVDVElPTl9QUk9GSUxFICopc2tfZGVsZXRlKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNSVFBfUFJPVEVDVElPTl9QUk9GSUxFKSAqLCBzayksIFwKKyAgICAgICh3aGVyZSkpKQorCisjZGVmaW5lIHNrX1NSVFBfUFJPVEVDVElPTl9QUk9GSUxFX2RlbGV0ZV9wdHIoc2ssIHApICAgICAgICAgICAgICAgICAgIFwKKyAgKChTUlRQX1BST1RFQ1RJT05fUFJPRklMRSAqKXNrX2RlbGV0ZV9wdHIoICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihTUlRQX1BST1RFQ1RJT05fUFJPRklMRSkgKiwgc2spLCBcCisgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBTUlRQX1BST1RFQ1RJT05fUFJPRklMRSAqLCBwKSkpCisKKyNkZWZpbmUgc2tfU1JUUF9QUk9URUNUSU9OX1BST0ZJTEVfZmluZChzaywgb3V0X2luZGV4LCBwKSAgICAgICAgICAgICAgICAgIFwKKyAgc2tfZmluZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNSVFBfUFJPVEVDVElPTl9QUk9GSUxFKSAqLCBzayksIFwKKyAgICAgICAgICAob3V0X2luZGV4KSwgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgU1JUUF9QUk9URUNUSU9OX1BST0ZJTEUgKiwgcCkpCisKKyNkZWZpbmUgc2tfU1JUUF9QUk9URUNUSU9OX1BST0ZJTEVfc2hpZnQoc2spIFwKKyAgKChTUlRQX1BST1RFQ1RJT05fUFJPRklMRSAqKXNrX3NoaWZ0KCAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoU1JUUF9QUk9URUNUSU9OX1BST0ZJTEUpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfU1JUUF9QUk9URUNUSU9OX1BST0ZJTEVfcHVzaChzaywgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfcHVzaChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNSVFBfUFJPVEVDVElPTl9QUk9GSUxFKSAqLCBzayksIFwKKyAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBTUlRQX1BST1RFQ1RJT05fUFJPRklMRSAqLCBwKSkKKworI2RlZmluZSBza19TUlRQX1BST1RFQ1RJT05fUFJPRklMRV9wb3Aoc2spIFwKKyAgKChTUlRQX1BST1RFQ1RJT05fUFJPRklMRSAqKXNrX3BvcCggICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNSVFBfUFJPVEVDVElPTl9QUk9GSUxFKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX1NSVFBfUFJPVEVDVElPTl9QUk9GSUxFX2R1cChzaykgICAgICBcCisgICgoU1RBQ0tfT0YoU1JUUF9QUk9URUNUSU9OX1BST0ZJTEUpICopc2tfZHVwKCBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFNSVFBfUFJPVEVDVElPTl9QUk9GSUxFKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX1NSVFBfUFJPVEVDVElPTl9QUk9GSUxFX3NvcnQoc2spIFwKKyAgc2tfc29ydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNSVFBfUFJPVEVDVElPTl9QUk9GSUxFKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfU1JUUF9QUk9URUNUSU9OX1BST0ZJTEVfaXNfc29ydGVkKHNrKSBcCisgIHNrX2lzX3NvcnRlZCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihTUlRQX1BST1RFQ1RJT05fUFJPRklMRSkgKiwgc2spKQorCisjZGVmaW5lIHNrX1NSVFBfUFJPVEVDVElPTl9QUk9GSUxFX3NldF9jbXBfZnVuYyhzaywgY29tcCkgICAgICAgICAgICAgICBcCisgICgoaW50ICgqKShjb25zdCBTUlRQX1BST1RFQ1RJT05fUFJPRklMRSAqKmEsICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb25zdCBTUlRQX1BST1RFQ1RJT05fUFJPRklMRSAqKmIpKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBza19zZXRfY21wX2Z1bmMoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihTUlRQX1BST1RFQ1RJT05fUFJPRklMRSkgKiwgc2spLCBcCisgICAgICAgQ0hFQ0tFRF9DQVNUKHN0YWNrX2NtcF9mdW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGludCAoKikoY29uc3QgU1JUUF9QUk9URUNUSU9OX1BST0ZJTEUgKiphLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU1JUUF9QUk9URUNUSU9OX1BST0ZJTEUgKipiKSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNvbXApKSkKKworLyogU1NMX0NJUEhFUiAqLworI2RlZmluZSBza19TU0xfQ0lQSEVSX25ldyhjb21wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKFNUQUNLX09GKFNTTF9DSVBIRVIpICopc2tfbmV3KENIRUNLRURfQ0FTVCggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgc3RhY2tfY21wX2Z1bmMsIGludCAoKikoY29uc3QgU1NMX0NJUEhFUiAqKmEsIGNvbnN0IFNTTF9DSVBIRVIgKipiKSwgXAorICAgICAgY29tcCkpKQorCisjZGVmaW5lIHNrX1NTTF9DSVBIRVJfbmV3X251bGwoKSAoKFNUQUNLX09GKFNTTF9DSVBIRVIpICopc2tfbmV3X251bGwoKSkKKworI2RlZmluZSBza19TU0xfQ0lQSEVSX251bShzaykgXAorICBza19udW0oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihTU0xfQ0lQSEVSKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfU1NMX0NJUEhFUl96ZXJvKHNrKSBcCisgIHNrX3plcm8oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihTU0xfQ0lQSEVSKSAqLCBzaykpOworCisjZGVmaW5lIHNrX1NTTF9DSVBIRVJfdmFsdWUoc2ssIGkpIFwKKyAgKChTU0xfQ0lQSEVSICopc2tfdmFsdWUoICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihTU0xfQ0lQSEVSKSAqLCBzayksIChpKSkpCisKKyNkZWZpbmUgc2tfU1NMX0NJUEhFUl9zZXQoc2ssIGksIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoU1NMX0NJUEhFUiAqKXNrX3NldChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNTTF9DSVBIRVIpICosIHNrKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgKGkpLCBDSEVDS0VEX0NBU1Qodm9pZCAqLCBTU0xfQ0lQSEVSICosIHApKSkKKworI2RlZmluZSBza19TU0xfQ0lQSEVSX2ZyZWUoc2spIFwKKyAgc2tfZnJlZShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNTTF9DSVBIRVIpICosIHNrKSkKKworI2RlZmluZSBza19TU0xfQ0lQSEVSX3BvcF9mcmVlKHNrLCBmcmVlX2Z1bmMpICAgICAgICAgICAgIFwKKyAgc2tfcG9wX2ZyZWUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNTTF9DSVBIRVIpICosIHNrKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKCopKHZvaWQgKiksIHZvaWQgKCopKFNTTF9DSVBIRVIgKiksIGZyZWVfZnVuYykpCisKKyNkZWZpbmUgc2tfU1NMX0NJUEhFUl9pbnNlcnQoc2ssIHAsIHdoZXJlKSAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX2luc2VydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNTTF9DSVBIRVIpICosIHNrKSwgXAorICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgU1NMX0NJUEhFUiAqLCBwKSwgKHdoZXJlKSkKKworI2RlZmluZSBza19TU0xfQ0lQSEVSX2RlbGV0ZShzaywgd2hlcmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChTU0xfQ0lQSEVSICopc2tfZGVsZXRlKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoU1NMX0NJUEhFUikgKiwgc2spLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hlcmUpKSkKKworI2RlZmluZSBza19TU0xfQ0lQSEVSX2RlbGV0ZV9wdHIoc2ssIHApICAgICAgICAgICAgICAgICAgIFwKKyAgKChTU0xfQ0lQSEVSICopc2tfZGVsZXRlX3B0ciggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNTTF9DSVBIRVIpICosIHNrKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgU1NMX0NJUEhFUiAqLCBwKSkpCisKKyNkZWZpbmUgc2tfU1NMX0NJUEhFUl9maW5kKHNrLCBvdXRfaW5kZXgsIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfZmluZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNTTF9DSVBIRVIpICosIHNrKSwgKG91dF9pbmRleCksIFwKKyAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBTU0xfQ0lQSEVSICosIHApKQorCisjZGVmaW5lIHNrX1NTTF9DSVBIRVJfc2hpZnQoc2spIFwKKyAgKChTU0xfQ0lQSEVSICopc2tfc2hpZnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihTU0xfQ0lQSEVSKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX1NTTF9DSVBIRVJfcHVzaChzaywgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfcHVzaChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNTTF9DSVBIRVIpICosIHNrKSwgXAorICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFNTTF9DSVBIRVIgKiwgcCkpCisKKyNkZWZpbmUgc2tfU1NMX0NJUEhFUl9wb3Aoc2spIFwKKyAgKChTU0xfQ0lQSEVSICopc2tfcG9wKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoU1NMX0NJUEhFUikgKiwgc2spKSkKKworI2RlZmluZSBza19TU0xfQ0lQSEVSX2R1cChzaykgICAgICBcCisgICgoU1RBQ0tfT0YoU1NMX0NJUEhFUikgKilza19kdXAoIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoU1NMX0NJUEhFUikgKiwgc2spKSkKKworI2RlZmluZSBza19TU0xfQ0lQSEVSX3NvcnQoc2spIFwKKyAgc2tfc29ydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNTTF9DSVBIRVIpICosIHNrKSkKKworI2RlZmluZSBza19TU0xfQ0lQSEVSX2lzX3NvcnRlZChzaykgXAorICBza19pc19zb3J0ZWQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihTU0xfQ0lQSEVSKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfU1NMX0NJUEhFUl9zZXRfY21wX2Z1bmMoc2ssIGNvbXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoaW50ICgqKShjb25zdCBTU0xfQ0lQSEVSICoqYSwgY29uc3QgU1NMX0NJUEhFUiAqKmIpKXNrX3NldF9jbXBfZnVuYyggXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihTU0xfQ0lQSEVSKSAqLCBzayksICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChzdGFja19jbXBfZnVuYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgaW50ICgqKShjb25zdCBTU0xfQ0lQSEVSICoqYSwgY29uc3QgU1NMX0NJUEhFUiAqKmIpLCAgXAorICAgICAgICAgICAgICAgICAgIGNvbXApKSkKKworLyogU1NMX0NPTVAgKi8KKyNkZWZpbmUgc2tfU1NMX0NPTVBfbmV3KGNvbXApICAgICAgICAgICAgICAgICBcCisgICgoU1RBQ0tfT0YoU1NMX0NPTVApICopc2tfbmV3KENIRUNLRURfQ0FTVCggXAorICAgICAgc3RhY2tfY21wX2Z1bmMsIGludCAoKikoY29uc3QgU1NMX0NPTVAgKiphLCBjb25zdCBTU0xfQ09NUCAqKmIpLCBjb21wKSkpCisKKyNkZWZpbmUgc2tfU1NMX0NPTVBfbmV3X251bGwoKSAoKFNUQUNLX09GKFNTTF9DT01QKSAqKXNrX25ld19udWxsKCkpCisKKyNkZWZpbmUgc2tfU1NMX0NPTVBfbnVtKHNrKSBcCisgIHNrX251bShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNTTF9DT01QKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfU1NMX0NPTVBfemVybyhzaykgXAorICBza196ZXJvKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoU1NMX0NPTVApICosIHNrKSk7CisKKyNkZWZpbmUgc2tfU1NMX0NPTVBfdmFsdWUoc2ssIGkpIFwKKyAgKChTU0xfQ09NUCAqKXNrX3ZhbHVlKCAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoU1NMX0NPTVApICosIHNrKSwgKGkpKSkKKworI2RlZmluZSBza19TU0xfQ09NUF9zZXQoc2ssIGksIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoU1NMX0NPTVAgKilza19zZXQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihTU0xfQ09NUCkgKiwgc2spLCAoaSksIFwKKyAgICAgICAgICAgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBTU0xfQ09NUCAqLCBwKSkpCisKKyNkZWZpbmUgc2tfU1NMX0NPTVBfZnJlZShzaykgXAorICBza19mcmVlKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoU1NMX0NPTVApICosIHNrKSkKKworI2RlZmluZSBza19TU0xfQ09NUF9wb3BfZnJlZShzaywgZnJlZV9mdW5jKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfcG9wX2ZyZWUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihTU0xfQ09NUCkgKiwgc2spLCBcCisgICAgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICgqKSh2b2lkICopLCB2b2lkICgqKShTU0xfQ09NUCAqKSwgZnJlZV9mdW5jKSkKKworI2RlZmluZSBza19TU0xfQ09NUF9pbnNlcnQoc2ssIHAsIHdoZXJlKSAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX2luc2VydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNTTF9DT01QKSAqLCBzayksIFwKKyAgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFNTTF9DT01QICosIHApLCAod2hlcmUpKQorCisjZGVmaW5lIHNrX1NTTF9DT01QX2RlbGV0ZShzaywgd2hlcmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoU1NMX0NPTVAgKilza19kZWxldGUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihTU0xfQ09NUCkgKiwgc2spLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKHdoZXJlKSkpCisKKyNkZWZpbmUgc2tfU1NMX0NPTVBfZGVsZXRlX3B0cihzaywgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoU1NMX0NPTVAgKilza19kZWxldGVfcHRyKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoU1NMX0NPTVApICosIHNrKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBTU0xfQ09NUCAqLCBwKSkpCisKKyNkZWZpbmUgc2tfU1NMX0NPTVBfZmluZChzaywgb3V0X2luZGV4LCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX2ZpbmQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihTU0xfQ09NUCkgKiwgc2spLCAob3V0X2luZGV4KSwgXAorICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFNTTF9DT01QICosIHApKQorCisjZGVmaW5lIHNrX1NTTF9DT01QX3NoaWZ0KHNrKSBcCisgICgoU1NMX0NPTVAgKilza19zaGlmdChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNTTF9DT01QKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX1NTTF9DT01QX3B1c2goc2ssIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX3B1c2goQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihTU0xfQ09NUCkgKiwgc2spLCBcCisgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgU1NMX0NPTVAgKiwgcCkpCisKKyNkZWZpbmUgc2tfU1NMX0NPTVBfcG9wKHNrKSBcCisgICgoU1NMX0NPTVAgKilza19wb3AoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihTU0xfQ09NUCkgKiwgc2spKSkKKworI2RlZmluZSBza19TU0xfQ09NUF9kdXAoc2spICAgICAgXAorICAoKFNUQUNLX09GKFNTTF9DT01QKSAqKXNrX2R1cCggXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihTU0xfQ09NUCkgKiwgc2spKSkKKworI2RlZmluZSBza19TU0xfQ09NUF9zb3J0KHNrKSBcCisgIHNrX3NvcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihTU0xfQ09NUCkgKiwgc2spKQorCisjZGVmaW5lIHNrX1NTTF9DT01QX2lzX3NvcnRlZChzaykgXAorICBza19pc19zb3J0ZWQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihTU0xfQ09NUCkgKiwgc2spKQorCisjZGVmaW5lIHNrX1NTTF9DT01QX3NldF9jbXBfZnVuYyhzaywgY29tcCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoaW50ICgqKShjb25zdCBTU0xfQ09NUCAqKmEsIGNvbnN0IFNTTF9DT01QICoqYikpc2tfc2V0X2NtcF9mdW5jKCBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNTTF9DT01QKSAqLCBzayksICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1Qoc3RhY2tfY21wX2Z1bmMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgaW50ICgqKShjb25zdCBTU0xfQ09NUCAqKmEsIGNvbnN0IFNTTF9DT01QICoqYiksIGNvbXApKSkKKworLyogU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZICovCisjZGVmaW5lIHNrX1NUQUNLX09GX1g1MDlfTkFNRV9FTlRSWV9uZXcoY29tcCkgICAgICAgICAgICAgICAgICAgICAgXAorICAoKFNUQUNLX09GKFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSkgKilza19uZXcoQ0hFQ0tFRF9DQVNUKCAgICAgIFwKKyAgICAgIHN0YWNrX2NtcF9mdW5jLCBpbnQgKCopKGNvbnN0IFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSAqKmEsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTVEFDS19PRl9YNTA5X05BTUVfRU5UUlkgKipiKSwgXAorICAgICAgY29tcCkpKQorCisjZGVmaW5lIHNrX1NUQUNLX09GX1g1MDlfTkFNRV9FTlRSWV9uZXdfbnVsbCgpIFwKKyAgKChTVEFDS19PRihTVEFDS19PRl9YNTA5X05BTUVfRU5UUlkpICopc2tfbmV3X251bGwoKSkKKworI2RlZmluZSBza19TVEFDS19PRl9YNTA5X05BTUVfRU5UUllfbnVtKHNrKSBcCisgIHNrX251bShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSkgKiwgc2spKQorCisjZGVmaW5lIHNrX1NUQUNLX09GX1g1MDlfTkFNRV9FTlRSWV96ZXJvKHNrKSBcCisgIHNrX3plcm8oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihTVEFDS19PRl9YNTA5X05BTUVfRU5UUlkpICosIHNrKSk7CisKKyNkZWZpbmUgc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX3ZhbHVlKHNrLCBpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChTVEFDS19PRl9YNTA5X05BTUVfRU5UUlkgKilza192YWx1ZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZKSAqLCBzayksIFwKKyAgICAgIChpKSkpCisKKyNkZWZpbmUgc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX3NldChzaywgaSwgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSAqKXNrX3NldCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSkgKiwgc2spLCAoaSksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSAqLCBwKSkpCisKKyNkZWZpbmUgc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX2ZyZWUoc2spIFwKKyAgc2tfZnJlZShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSkgKiwgc2spKQorCisjZGVmaW5lIHNrX1NUQUNLX09GX1g1MDlfTkFNRV9FTlRSWV9wb3BfZnJlZShzaywgZnJlZV9mdW5jKSAgICAgICAgICAgICAgICBcCisgIHNrX3BvcF9mcmVlKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSkgKiwgc2spLCAgICBcCisgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAoKikodm9pZCAqKSwgdm9pZCAoKikoU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZICopLCBcCisgICAgICAgICAgICAgICAgICAgZnJlZV9mdW5jKSkKKworI2RlZmluZSBza19TVEFDS19PRl9YNTA5X05BTUVfRU5UUllfaW5zZXJ0KHNrLCBwLCB3aGVyZSkgICAgICAgICAgICAgICAgICAgICAgXAorICBza19pbnNlcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihTVEFDS19PRl9YNTA5X05BTUVfRU5UUlkpICosIHNrKSwgXAorICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZICosIHApLCAod2hlcmUpKQorCisjZGVmaW5lIHNrX1NUQUNLX09GX1g1MDlfTkFNRV9FTlRSWV9kZWxldGUoc2ssIHdoZXJlKSAgICAgICAgICAgICAgICAgICBcCisgICgoU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZICopc2tfZGVsZXRlKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSkgKiwgc2spLCBcCisgICAgICAod2hlcmUpKSkKKworI2RlZmluZSBza19TVEFDS19PRl9YNTA5X05BTUVfRU5UUllfZGVsZXRlX3B0cihzaywgcCkgICAgICAgICAgICAgICAgICAgXAorICAoKFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSAqKXNrX2RlbGV0ZV9wdHIoICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihTVEFDS19PRl9YNTA5X05BTUVfRU5UUlkpICosIHNrKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZICosIHApKSkKKworI2RlZmluZSBza19TVEFDS19PRl9YNTA5X05BTUVfRU5UUllfZmluZChzaywgb3V0X2luZGV4LCBwKSAgICAgICAgICAgICAgICAgIFwKKyAgc2tfZmluZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSkgKiwgc2spLCBcCisgICAgICAgICAgKG91dF9pbmRleCksIENIRUNLRURfQ0FTVCh2b2lkICosIFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSAqLCBwKSkKKworI2RlZmluZSBza19TVEFDS19PRl9YNTA5X05BTUVfRU5UUllfc2hpZnQoc2spIFwKKyAgKChTVEFDS19PRl9YNTA5X05BTUVfRU5UUlkgKilza19zaGlmdCggICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSkgKiwgc2spKSkKKworI2RlZmluZSBza19TVEFDS19PRl9YNTA5X05BTUVfRU5UUllfcHVzaChzaywgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfcHVzaChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSkgKiwgc2spLCBcCisgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZICosIHApKQorCisjZGVmaW5lIHNrX1NUQUNLX09GX1g1MDlfTkFNRV9FTlRSWV9wb3Aoc2spIFwKKyAgKChTVEFDS19PRl9YNTA5X05BTUVfRU5UUlkgKilza19wb3AoICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihTVEFDS19PRl9YNTA5X05BTUVfRU5UUlkpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX2R1cChzaykgICAgICBcCisgICgoU1RBQ0tfT0YoU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZKSAqKXNrX2R1cCggXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihTVEFDS19PRl9YNTA5X05BTUVfRU5UUlkpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX3NvcnQoc2spIFwKKyAgc2tfc29ydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSkgKiwgc2spKQorCisjZGVmaW5lIHNrX1NUQUNLX09GX1g1MDlfTkFNRV9FTlRSWV9pc19zb3J0ZWQoc2spIFwKKyAgc2tfaXNfc29ydGVkKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihTVEFDS19PRl9YNTA5X05BTUVfRU5UUlkpICosIHNrKSkKKworI2RlZmluZSBza19TVEFDS19PRl9YNTA5X05BTUVfRU5UUllfc2V0X2NtcF9mdW5jKHNrLCBjb21wKSAgICAgICAgICAgICAgIFwKKyAgKChpbnQgKCopKGNvbnN0IFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSAqKmEsICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb25zdCBTVEFDS19PRl9YNTA5X05BTUVfRU5UUlkgKipiKSkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgc2tfc2V0X2NtcF9mdW5jKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSkgKiwgc2spLCBcCisgICAgICAgQ0hFQ0tFRF9DQVNUKHN0YWNrX2NtcF9mdW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBpbnQgKCopKGNvbnN0IFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSAqKmEsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTVEFDS19PRl9YNTA5X05BTUVfRU5UUlkgKipiKSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNvbXApKSkKKworLyogU1hORVRJRCAqLworI2RlZmluZSBza19TWE5FVElEX25ldyhjb21wKSAgICAgICAgICAgICAgICAgXAorICAoKFNUQUNLX09GKFNYTkVUSUQpICopc2tfbmV3KENIRUNLRURfQ0FTVCggXAorICAgICAgc3RhY2tfY21wX2Z1bmMsIGludCAoKikoY29uc3QgU1hORVRJRCAqKmEsIGNvbnN0IFNYTkVUSUQgKipiKSwgY29tcCkpKQorCisjZGVmaW5lIHNrX1NYTkVUSURfbmV3X251bGwoKSAoKFNUQUNLX09GKFNYTkVUSUQpICopc2tfbmV3X251bGwoKSkKKworI2RlZmluZSBza19TWE5FVElEX251bShzaykgXAorICBza19udW0oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihTWE5FVElEKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfU1hORVRJRF96ZXJvKHNrKSBcCisgIHNrX3plcm8oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihTWE5FVElEKSAqLCBzaykpOworCisjZGVmaW5lIHNrX1NYTkVUSURfdmFsdWUoc2ssIGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoU1hORVRJRCAqKXNrX3ZhbHVlKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoU1hORVRJRCkgKiwgc2spLCBcCisgICAgICAgICAgICAgICAgICAgICAgIChpKSkpCisKKyNkZWZpbmUgc2tfU1hORVRJRF9zZXQoc2ssIGksIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChTWE5FVElEICopc2tfc2V0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoU1hORVRJRCkgKiwgc2spLCAoaSksIFwKKyAgICAgICAgICAgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFNYTkVUSUQgKiwgcCkpKQorCisjZGVmaW5lIHNrX1NYTkVUSURfZnJlZShzaykgXAorICBza19mcmVlKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoU1hORVRJRCkgKiwgc2spKQorCisjZGVmaW5lIHNrX1NYTkVUSURfcG9wX2ZyZWUoc2ssIGZyZWVfZnVuYykgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX3BvcF9mcmVlKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoU1hORVRJRCkgKiwgc2spLCBcCisgICAgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICgqKSh2b2lkICopLCB2b2lkICgqKShTWE5FVElEICopLCBmcmVlX2Z1bmMpKQorCisjZGVmaW5lIHNrX1NYTkVUSURfaW5zZXJ0KHNrLCBwLCB3aGVyZSkgICAgICAgICAgICAgICAgICAgICAgXAorICBza19pbnNlcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihTWE5FVElEKSAqLCBzayksIFwKKyAgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFNYTkVUSUQgKiwgcCksICh3aGVyZSkpCisKKyNkZWZpbmUgc2tfU1hORVRJRF9kZWxldGUoc2ssIHdoZXJlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoU1hORVRJRCAqKXNrX2RlbGV0ZShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNYTkVUSUQpICosIHNrKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgKHdoZXJlKSkpCisKKyNkZWZpbmUgc2tfU1hORVRJRF9kZWxldGVfcHRyKHNrLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKFNYTkVUSUQgKilza19kZWxldGVfcHRyKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoU1hORVRJRCkgKiwgc2spLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgU1hORVRJRCAqLCBwKSkpCisKKyNkZWZpbmUgc2tfU1hORVRJRF9maW5kKHNrLCBvdXRfaW5kZXgsIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfZmluZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNYTkVUSUQpICosIHNrKSwgKG91dF9pbmRleCksIFwKKyAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBTWE5FVElEICosIHApKQorCisjZGVmaW5lIHNrX1NYTkVUSURfc2hpZnQoc2spIFwKKyAgKChTWE5FVElEICopc2tfc2hpZnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihTWE5FVElEKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX1NYTkVUSURfcHVzaChzaywgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfcHVzaChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNYTkVUSUQpICosIHNrKSwgXAorICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFNYTkVUSUQgKiwgcCkpCisKKyNkZWZpbmUgc2tfU1hORVRJRF9wb3Aoc2spIFwKKyAgKChTWE5FVElEICopc2tfcG9wKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoU1hORVRJRCkgKiwgc2spKSkKKworI2RlZmluZSBza19TWE5FVElEX2R1cChzaykgICAgICBcCisgICgoU1RBQ0tfT0YoU1hORVRJRCkgKilza19kdXAoIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoU1hORVRJRCkgKiwgc2spKSkKKworI2RlZmluZSBza19TWE5FVElEX3NvcnQoc2spIFwKKyAgc2tfc29ydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFNYTkVUSUQpICosIHNrKSkKKworI2RlZmluZSBza19TWE5FVElEX2lzX3NvcnRlZChzaykgXAorICBza19pc19zb3J0ZWQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihTWE5FVElEKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfU1hORVRJRF9zZXRfY21wX2Z1bmMoc2ssIGNvbXApICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoaW50ICgqKShjb25zdCBTWE5FVElEICoqYSwgY29uc3QgU1hORVRJRCAqKmIpKXNrX3NldF9jbXBfZnVuYyggXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihTWE5FVElEKSAqLCBzayksICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChzdGFja19jbXBfZnVuYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgaW50ICgqKShjb25zdCBTWE5FVElEICoqYSwgY29uc3QgU1hORVRJRCAqKmIpLCBjb21wKSkpCisKKy8qIFg1MDkgKi8KKyNkZWZpbmUgc2tfWDUwOV9uZXcoY29tcCkgICAgICAgICAgICAgICAgIFwKKyAgKChTVEFDS19PRihYNTA5KSAqKXNrX25ldyhDSEVDS0VEX0NBU1QoIFwKKyAgICAgIHN0YWNrX2NtcF9mdW5jLCBpbnQgKCopKGNvbnN0IFg1MDkgKiphLCBjb25zdCBYNTA5ICoqYiksIGNvbXApKSkKKworI2RlZmluZSBza19YNTA5X25ld19udWxsKCkgKChTVEFDS19PRihYNTA5KSAqKXNrX25ld19udWxsKCkpCisKKyNkZWZpbmUgc2tfWDUwOV9udW0oc2spIHNrX251bShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDkpICosIHNrKSkKKworI2RlZmluZSBza19YNTA5X3plcm8oc2spIHNrX3plcm8oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5KSAqLCBzaykpOworCisjZGVmaW5lIHNrX1g1MDlfdmFsdWUoc2ssIGkpIFwKKyAgKChYNTA5ICopc2tfdmFsdWUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihYNTA5KSAqLCBzayksIChpKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9zZXQoc2ssIGksIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChYNTA5ICopc2tfc2V0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOSkgKiwgc2spLCAoaSksIFwKKyAgICAgICAgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFg1MDkgKiwgcCkpKQorCisjZGVmaW5lIHNrX1g1MDlfZnJlZShzaykgc2tfZnJlZShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDkpICosIHNrKSkKKworI2RlZmluZSBza19YNTA5X3BvcF9mcmVlKHNrLCBmcmVlX2Z1bmMpICAgICAgICAgICAgICAgICAgICAgXAorICBza19wb3BfZnJlZShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDkpICosIHNrKSwgXAorICAgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAoKikodm9pZCAqKSwgdm9pZCAoKikoWDUwOSAqKSwgZnJlZV9mdW5jKSkKKworI2RlZmluZSBza19YNTA5X2luc2VydChzaywgcCwgd2hlcmUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfaW5zZXJ0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOSkgKiwgc2spLCBcCisgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBYNTA5ICosIHApLCAod2hlcmUpKQorCisjZGVmaW5lIHNrX1g1MDlfZGVsZXRlKHNrLCB3aGVyZSkgXAorICAoKFg1MDkgKilza19kZWxldGUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5KSAqLCBzayksICh3aGVyZSkpKQorCisjZGVmaW5lIHNrX1g1MDlfZGVsZXRlX3B0cihzaywgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChYNTA5ICopc2tfZGVsZXRlX3B0cihDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDkpICosIHNrKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFg1MDkgKiwgcCkpKQorCisjZGVmaW5lIHNrX1g1MDlfZmluZChzaywgb3V0X2luZGV4LCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX2ZpbmQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5KSAqLCBzayksIChvdXRfaW5kZXgpLCBcCisgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgWDUwOSAqLCBwKSkKKworI2RlZmluZSBza19YNTA5X3NoaWZ0KHNrKSBcCisgICgoWDUwOSAqKXNrX3NoaWZ0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOSkgKiwgc2spKSkKKworI2RlZmluZSBza19YNTA5X3B1c2goc2ssIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX3B1c2goQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5KSAqLCBzayksIFwKKyAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBYNTA5ICosIHApKQorCisjZGVmaW5lIHNrX1g1MDlfcG9wKHNrKSBcCisgICgoWDUwOSAqKXNrX3BvcChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDkpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9kdXAoc2spIFwKKyAgKChTVEFDS19PRihYNTA5KSAqKXNrX2R1cChDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFg1MDkpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9zb3J0KHNrKSBza19zb3J0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOSkgKiwgc2spKQorCisjZGVmaW5lIHNrX1g1MDlfaXNfc29ydGVkKHNrKSBcCisgIHNrX2lzX3NvcnRlZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFg1MDkpICosIHNrKSkKKworI2RlZmluZSBza19YNTA5X3NldF9jbXBfZnVuYyhzaywgY29tcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChpbnQgKCopKGNvbnN0IFg1MDkgKiphLCBjb25zdCBYNTA5ICoqYikpc2tfc2V0X2NtcF9mdW5jKCAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDkpICosIHNrKSwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHN0YWNrX2NtcF9mdW5jLCBpbnQgKCopKGNvbnN0IFg1MDkgKiphLCBjb25zdCBYNTA5ICoqYiksIFwKKyAgICAgICAgICAgICAgICAgICBjb21wKSkpCisKKy8qIFg1MDlWM19FWFRfTUVUSE9EICovCisjZGVmaW5lIHNrX1g1MDlWM19FWFRfTUVUSE9EX25ldyhjb21wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKFNUQUNLX09GKFg1MDlWM19FWFRfTUVUSE9EKSAqKXNrX25ldyhDSEVDS0VEX0NBU1QoICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN0YWNrX2NtcF9mdW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpbnQgKCopKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICoqYSwgY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKipiKSwgXAorICAgICAgY29tcCkpKQorCisjZGVmaW5lIHNrX1g1MDlWM19FWFRfTUVUSE9EX25ld19udWxsKCkgXAorICAoKFNUQUNLX09GKFg1MDlWM19FWFRfTUVUSE9EKSAqKXNrX25ld19udWxsKCkpCisKKyNkZWZpbmUgc2tfWDUwOVYzX0VYVF9NRVRIT0RfbnVtKHNrKSBcCisgIHNrX251bShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlWM19FWFRfTUVUSE9EKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfWDUwOVYzX0VYVF9NRVRIT0RfemVybyhzaykgXAorICBza196ZXJvKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOVYzX0VYVF9NRVRIT0QpICosIHNrKSk7CisKKyNkZWZpbmUgc2tfWDUwOVYzX0VYVF9NRVRIT0RfdmFsdWUoc2ssIGkpIFwKKyAgKChYNTA5VjNfRVhUX01FVEhPRCAqKXNrX3ZhbHVlKCAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoWDUwOVYzX0VYVF9NRVRIT0QpICosIHNrKSwgKGkpKSkKKworI2RlZmluZSBza19YNTA5VjNfRVhUX01FVEhPRF9zZXQoc2ssIGksIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChYNTA5VjNfRVhUX01FVEhPRCAqKXNrX3NldCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlWM19FWFRfTUVUSE9EKSAqLCBzayksIChpKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgWDUwOVYzX0VYVF9NRVRIT0QgKiwgcCkpKQorCisjZGVmaW5lIHNrX1g1MDlWM19FWFRfTUVUSE9EX2ZyZWUoc2spIFwKKyAgc2tfZnJlZShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlWM19FWFRfTUVUSE9EKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfWDUwOVYzX0VYVF9NRVRIT0RfcG9wX2ZyZWUoc2ssIGZyZWVfZnVuYykgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX3BvcF9mcmVlKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOVYzX0VYVF9NRVRIT0QpICosIHNrKSwgICAgXAorICAgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAoKikodm9pZCAqKSwgdm9pZCAoKikoWDUwOVYzX0VYVF9NRVRIT0QgKiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfZnVuYykpCisKKyNkZWZpbmUgc2tfWDUwOVYzX0VYVF9NRVRIT0RfaW5zZXJ0KHNrLCBwLCB3aGVyZSkgICAgICAgICAgICAgICAgICAgICAgXAorICBza19pbnNlcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5VjNfRVhUX01FVEhPRCkgKiwgc2spLCBcCisgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBYNTA5VjNfRVhUX01FVEhPRCAqLCBwKSwgKHdoZXJlKSkKKworI2RlZmluZSBza19YNTA5VjNfRVhUX01FVEhPRF9kZWxldGUoc2ssIHdoZXJlKSBcCisgICgoWDUwOVYzX0VYVF9NRVRIT0QgKilza19kZWxldGUoICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOVYzX0VYVF9NRVRIT0QpICosIHNrKSwgKHdoZXJlKSkpCisKKyNkZWZpbmUgc2tfWDUwOVYzX0VYVF9NRVRIT0RfZGVsZXRlX3B0cihzaywgcCkgICAgICAgICAgICAgICAgICAgXAorICAoKFg1MDlWM19FWFRfTUVUSE9EICopc2tfZGVsZXRlX3B0ciggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlWM19FWFRfTUVUSE9EKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFg1MDlWM19FWFRfTUVUSE9EICosIHApKSkKKworI2RlZmluZSBza19YNTA5VjNfRVhUX01FVEhPRF9maW5kKHNrLCBvdXRfaW5kZXgsIHApICAgICAgICAgICAgICAgICAgXAorICBza19maW5kKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOVYzX0VYVF9NRVRIT0QpICosIHNrKSwgXAorICAgICAgICAgIChvdXRfaW5kZXgpLCBDSEVDS0VEX0NBU1Qodm9pZCAqLCBYNTA5VjNfRVhUX01FVEhPRCAqLCBwKSkKKworI2RlZmluZSBza19YNTA5VjNfRVhUX01FVEhPRF9zaGlmdChzaykgXAorICAoKFg1MDlWM19FWFRfTUVUSE9EICopc2tfc2hpZnQoICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5VjNfRVhUX01FVEhPRCkgKiwgc2spKSkKKworI2RlZmluZSBza19YNTA5VjNfRVhUX01FVEhPRF9wdXNoKHNrLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBza19wdXNoKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOVYzX0VYVF9NRVRIT0QpICosIHNrKSwgXAorICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFg1MDlWM19FWFRfTUVUSE9EICosIHApKQorCisjZGVmaW5lIHNrX1g1MDlWM19FWFRfTUVUSE9EX3BvcChzaykgXAorICAoKFg1MDlWM19FWFRfTUVUSE9EICopc2tfcG9wKCAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOVYzX0VYVF9NRVRIT0QpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfWDUwOVYzX0VYVF9NRVRIT0RfZHVwKHNrKSAgICAgIFwKKyAgKChTVEFDS19PRihYNTA5VjNfRVhUX01FVEhPRCkgKilza19kdXAoIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoWDUwOVYzX0VYVF9NRVRIT0QpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfWDUwOVYzX0VYVF9NRVRIT0Rfc29ydChzaykgXAorICBza19zb3J0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOVYzX0VYVF9NRVRIT0QpICosIHNrKSkKKworI2RlZmluZSBza19YNTA5VjNfRVhUX01FVEhPRF9pc19zb3J0ZWQoc2spIFwKKyAgc2tfaXNfc29ydGVkKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoWDUwOVYzX0VYVF9NRVRIT0QpICosIHNrKSkKKworI2RlZmluZSBza19YNTA5VjNfRVhUX01FVEhPRF9zZXRfY21wX2Z1bmMoc2ssIGNvbXApICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoaW50ICgqKShjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqKmEsIGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICoqYikpICAgIFwKKyAgIHNrX3NldF9jbXBfZnVuYyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOVYzX0VYVF9NRVRIT0QpICosIHNrKSwgICAgICAgICBcCisgICAgICAgQ0hFQ0tFRF9DQVNUKHN0YWNrX2NtcF9mdW5jLCBpbnQgKCopKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICoqYSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKipiKSwgXAorICAgICAgICAgICAgICAgICAgICBjb21wKSkpCisKKy8qIFg1MDlfQUxHT1IgKi8KKyNkZWZpbmUgc2tfWDUwOV9BTEdPUl9uZXcoY29tcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChTVEFDS19PRihYNTA5X0FMR09SKSAqKXNrX25ldyhDSEVDS0VEX0NBU1QoICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN0YWNrX2NtcF9mdW5jLCBpbnQgKCopKGNvbnN0IFg1MDlfQUxHT1IgKiphLCBjb25zdCBYNTA5X0FMR09SICoqYiksIFwKKyAgICAgIGNvbXApKSkKKworI2RlZmluZSBza19YNTA5X0FMR09SX25ld19udWxsKCkgKChTVEFDS19PRihYNTA5X0FMR09SKSAqKXNrX25ld19udWxsKCkpCisKKyNkZWZpbmUgc2tfWDUwOV9BTEdPUl9udW0oc2spIFwKKyAgc2tfbnVtKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9BTEdPUikgKiwgc2spKQorCisjZGVmaW5lIHNrX1g1MDlfQUxHT1JfemVybyhzaykgXAorICBza196ZXJvKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9BTEdPUikgKiwgc2spKTsKKworI2RlZmluZSBza19YNTA5X0FMR09SX3ZhbHVlKHNrLCBpKSBcCisgICgoWDUwOV9BTEdPUiAqKXNrX3ZhbHVlKCAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoWDUwOV9BTEdPUikgKiwgc2spLCAoaSkpKQorCisjZGVmaW5lIHNrX1g1MDlfQUxHT1Jfc2V0KHNrLCBpLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKFg1MDlfQUxHT1IgKilza19zZXQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0FMR09SKSAqLCBzayksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpKSwgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgWDUwOV9BTEdPUiAqLCBwKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9BTEdPUl9mcmVlKHNrKSBcCisgIHNrX2ZyZWUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0FMR09SKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfWDUwOV9BTEdPUl9wb3BfZnJlZShzaywgZnJlZV9mdW5jKSAgICAgICAgICAgICBcCisgIHNrX3BvcF9mcmVlKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0FMR09SKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICgqKSh2b2lkICopLCB2b2lkICgqKShYNTA5X0FMR09SICopLCBmcmVlX2Z1bmMpKQorCisjZGVmaW5lIHNrX1g1MDlfQUxHT1JfaW5zZXJ0KHNrLCBwLCB3aGVyZSkgICAgICAgICAgICAgICAgICAgICAgXAorICBza19pbnNlcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0FMR09SKSAqLCBzayksIFwKKyAgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFg1MDlfQUxHT1IgKiwgcCksICh3aGVyZSkpCisKKyNkZWZpbmUgc2tfWDUwOV9BTEdPUl9kZWxldGUoc2ssIHdoZXJlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoWDUwOV9BTEdPUiAqKXNrX2RlbGV0ZShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfQUxHT1IpICosIHNrKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoZXJlKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9BTEdPUl9kZWxldGVfcHRyKHNrLCBwKSAgICAgICAgICAgICAgICAgICBcCisgICgoWDUwOV9BTEdPUiAqKXNrX2RlbGV0ZV9wdHIoICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0FMR09SKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFg1MDlfQUxHT1IgKiwgcCkpKQorCisjZGVmaW5lIHNrX1g1MDlfQUxHT1JfZmluZChzaywgb3V0X2luZGV4LCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX2ZpbmQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0FMR09SKSAqLCBzayksIChvdXRfaW5kZXgpLCBcCisgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgWDUwOV9BTEdPUiAqLCBwKSkKKworI2RlZmluZSBza19YNTA5X0FMR09SX3NoaWZ0KHNrKSBcCisgICgoWDUwOV9BTEdPUiAqKXNrX3NoaWZ0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9BTEdPUikgKiwgc2spKSkKKworI2RlZmluZSBza19YNTA5X0FMR09SX3B1c2goc2ssIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX3B1c2goQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0FMR09SKSAqLCBzayksIFwKKyAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBYNTA5X0FMR09SICosIHApKQorCisjZGVmaW5lIHNrX1g1MDlfQUxHT1JfcG9wKHNrKSBcCisgICgoWDUwOV9BTEdPUiAqKXNrX3BvcChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfQUxHT1IpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9BTEdPUl9kdXAoc2spICAgICAgXAorICAoKFNUQUNLX09GKFg1MDlfQUxHT1IpICopc2tfZHVwKCBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFg1MDlfQUxHT1IpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9BTEdPUl9zb3J0KHNrKSBcCisgIHNrX3NvcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0FMR09SKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfWDUwOV9BTEdPUl9pc19zb3J0ZWQoc2spIFwKKyAgc2tfaXNfc29ydGVkKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoWDUwOV9BTEdPUikgKiwgc2spKQorCisjZGVmaW5lIHNrX1g1MDlfQUxHT1Jfc2V0X2NtcF9mdW5jKHNrLCBjb21wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKGludCAoKikoY29uc3QgWDUwOV9BTEdPUiAqKmEsIGNvbnN0IFg1MDlfQUxHT1IgKipiKSlza19zZXRfY21wX2Z1bmMoIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9BTEdPUikgKiwgc2spLCAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1Qoc3RhY2tfY21wX2Z1bmMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIGludCAoKikoY29uc3QgWDUwOV9BTEdPUiAqKmEsIGNvbnN0IFg1MDlfQUxHT1IgKipiKSwgIFwKKyAgICAgICAgICAgICAgICAgICBjb21wKSkpCisKKy8qIFg1MDlfQVRUUklCVVRFICovCisjZGVmaW5lIHNrX1g1MDlfQVRUUklCVVRFX25ldyhjb21wKSAgICAgICAgICAgICAgICAgXAorICAoKFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqKXNrX25ldyhDSEVDS0VEX0NBU1QoIFwKKyAgICAgIHN0YWNrX2NtcF9mdW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpbnQgKCopKGNvbnN0IFg1MDlfQVRUUklCVVRFICoqYSwgY29uc3QgWDUwOV9BVFRSSUJVVEUgKipiKSwgY29tcCkpKQorCisjZGVmaW5lIHNrX1g1MDlfQVRUUklCVVRFX25ld19udWxsKCkgKChTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKilza19uZXdfbnVsbCgpKQorCisjZGVmaW5lIHNrX1g1MDlfQVRUUklCVVRFX251bShzaykgXAorICBza19udW0oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKiwgc2spKQorCisjZGVmaW5lIHNrX1g1MDlfQVRUUklCVVRFX3plcm8oc2spIFwKKyAgc2tfemVybyhDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqLCBzaykpOworCisjZGVmaW5lIHNrX1g1MDlfQVRUUklCVVRFX3ZhbHVlKHNrLCBpKSBcCisgICgoWDUwOV9BVFRSSUJVVEUgKilza192YWx1ZSggICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqLCBzayksIChpKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9BVFRSSUJVVEVfc2V0KHNrLCBpLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoWDUwOV9BVFRSSUJVVEUgKilza19zZXQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKiwgc2spLCAoaSksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFg1MDlfQVRUUklCVVRFICosIHApKSkKKworI2RlZmluZSBza19YNTA5X0FUVFJJQlVURV9mcmVlKHNrKSBcCisgIHNrX2ZyZWUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKiwgc2spKQorCisjZGVmaW5lIHNrX1g1MDlfQVRUUklCVVRFX3BvcF9mcmVlKHNrLCBmcmVlX2Z1bmMpICAgICAgICAgICAgIFwKKyAgc2tfcG9wX2ZyZWUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKiwgc2spLCBcCisgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAoKikodm9pZCAqKSwgdm9pZCAoKikoWDUwOV9BVFRSSUJVVEUgKiksIGZyZWVfZnVuYykpCisKKyNkZWZpbmUgc2tfWDUwOV9BVFRSSUJVVEVfaW5zZXJ0KHNrLCBwLCB3aGVyZSkgICAgICAgICAgICAgICAgICAgICAgXAorICBza19pbnNlcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKiwgc2spLCBcCisgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBYNTA5X0FUVFJJQlVURSAqLCBwKSwgKHdoZXJlKSkKKworI2RlZmluZSBza19YNTA5X0FUVFJJQlVURV9kZWxldGUoc2ssIHdoZXJlKSBcCisgICgoWDUwOV9BVFRSSUJVVEUgKilza19kZWxldGUoICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICosIHNrKSwgKHdoZXJlKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9BVFRSSUJVVEVfZGVsZXRlX3B0cihzaywgcCkgICAgICAgICAgICAgICAgICAgXAorICAoKFg1MDlfQVRUUklCVVRFICopc2tfZGVsZXRlX3B0ciggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFg1MDlfQVRUUklCVVRFICosIHApKSkKKworI2RlZmluZSBza19YNTA5X0FUVFJJQlVURV9maW5kKHNrLCBvdXRfaW5kZXgsIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfZmluZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqLCBzayksIChvdXRfaW5kZXgpLCBcCisgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgWDUwOV9BVFRSSUJVVEUgKiwgcCkpCisKKyNkZWZpbmUgc2tfWDUwOV9BVFRSSUJVVEVfc2hpZnQoc2spIFwKKyAgKChYNTA5X0FUVFJJQlVURSAqKXNrX3NoaWZ0KCAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9BVFRSSUJVVEVfcHVzaChzaywgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfcHVzaChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqLCBzayksIFwKKyAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBYNTA5X0FUVFJJQlVURSAqLCBwKSkKKworI2RlZmluZSBza19YNTA5X0FUVFJJQlVURV9wb3Aoc2spIFwKKyAgKChYNTA5X0FUVFJJQlVURSAqKXNrX3BvcCggICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX1g1MDlfQVRUUklCVVRFX2R1cChzaykgICAgICBcCisgICgoU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICopc2tfZHVwKCBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX1g1MDlfQVRUUklCVVRFX3NvcnQoc2spIFwKKyAgc2tfc29ydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfWDUwOV9BVFRSSUJVVEVfaXNfc29ydGVkKHNrKSBcCisgIHNrX2lzX3NvcnRlZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfWDUwOV9BVFRSSUJVVEVfc2V0X2NtcF9mdW5jKHNrLCBjb21wKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKGludCAoKikoY29uc3QgWDUwOV9BVFRSSUJVVEUgKiphLCBjb25zdCBYNTA5X0FUVFJJQlVURSAqKmIpKSAgICAgICBcCisgICBza19zZXRfY21wX2Z1bmMoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqLCBzayksICAgICAgICAgXAorICAgICAgIENIRUNLRURfQ0FTVChzdGFja19jbXBfZnVuYywgaW50ICgqKShjb25zdCBYNTA5X0FUVFJJQlVURSAqKmEsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFg1MDlfQVRUUklCVVRFICoqYiksIFwKKyAgICAgICAgICAgICAgICAgICAgY29tcCkpKQorCisvKiBYNTA5X0NSTCAqLworI2RlZmluZSBza19YNTA5X0NSTF9uZXcoY29tcCkgICAgICAgICAgICAgICAgIFwKKyAgKChTVEFDS19PRihYNTA5X0NSTCkgKilza19uZXcoQ0hFQ0tFRF9DQVNUKCBcCisgICAgICBzdGFja19jbXBfZnVuYywgaW50ICgqKShjb25zdCBYNTA5X0NSTCAqKmEsIGNvbnN0IFg1MDlfQ1JMICoqYiksIGNvbXApKSkKKworI2RlZmluZSBza19YNTA5X0NSTF9uZXdfbnVsbCgpICgoU1RBQ0tfT0YoWDUwOV9DUkwpICopc2tfbmV3X251bGwoKSkKKworI2RlZmluZSBza19YNTA5X0NSTF9udW0oc2spIFwKKyAgc2tfbnVtKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9DUkwpICosIHNrKSkKKworI2RlZmluZSBza19YNTA5X0NSTF96ZXJvKHNrKSBcCisgIHNrX3plcm8oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0NSTCkgKiwgc2spKTsKKworI2RlZmluZSBza19YNTA5X0NSTF92YWx1ZShzaywgaSkgXAorICAoKFg1MDlfQ1JMICopc2tfdmFsdWUoICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihYNTA5X0NSTCkgKiwgc2spLCAoaSkpKQorCisjZGVmaW5lIHNrX1g1MDlfQ1JMX3NldChzaywgaSwgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChYNTA5X0NSTCAqKXNrX3NldChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfQ1JMKSAqLCBzayksIChpKSwgXAorICAgICAgICAgICAgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFg1MDlfQ1JMICosIHApKSkKKworI2RlZmluZSBza19YNTA5X0NSTF9mcmVlKHNrKSBcCisgIHNrX2ZyZWUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0NSTCkgKiwgc2spKQorCisjZGVmaW5lIHNrX1g1MDlfQ1JMX3BvcF9mcmVlKHNrLCBmcmVlX2Z1bmMpICAgICAgICAgICAgICAgICAgICAgXAorICBza19wb3BfZnJlZShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfQ1JMKSAqLCBzayksIFwKKyAgICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKCopKHZvaWQgKiksIHZvaWQgKCopKFg1MDlfQ1JMICopLCBmcmVlX2Z1bmMpKQorCisjZGVmaW5lIHNrX1g1MDlfQ1JMX2luc2VydChzaywgcCwgd2hlcmUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfaW5zZXJ0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9DUkwpICosIHNrKSwgXAorICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgWDUwOV9DUkwgKiwgcCksICh3aGVyZSkpCisKKyNkZWZpbmUgc2tfWDUwOV9DUkxfZGVsZXRlKHNrLCB3aGVyZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChYNTA5X0NSTCAqKXNrX2RlbGV0ZShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfQ1JMKSAqLCBzayksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAod2hlcmUpKSkKKworI2RlZmluZSBza19YNTA5X0NSTF9kZWxldGVfcHRyKHNrLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChYNTA5X0NSTCAqKXNrX2RlbGV0ZV9wdHIoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0NSTCkgKiwgc2spLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFg1MDlfQ1JMICosIHApKSkKKworI2RlZmluZSBza19YNTA5X0NSTF9maW5kKHNrLCBvdXRfaW5kZXgsIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfZmluZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfQ1JMKSAqLCBzayksIChvdXRfaW5kZXgpLCBcCisgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgWDUwOV9DUkwgKiwgcCkpCisKKyNkZWZpbmUgc2tfWDUwOV9DUkxfc2hpZnQoc2spIFwKKyAgKChYNTA5X0NSTCAqKXNrX3NoaWZ0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9DUkwpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9DUkxfcHVzaChzaywgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfcHVzaChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfQ1JMKSAqLCBzayksIFwKKyAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBYNTA5X0NSTCAqLCBwKSkKKworI2RlZmluZSBza19YNTA5X0NSTF9wb3Aoc2spIFwKKyAgKChYNTA5X0NSTCAqKXNrX3BvcChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfQ1JMKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX1g1MDlfQ1JMX2R1cChzaykgICAgICBcCisgICgoU1RBQ0tfT0YoWDUwOV9DUkwpICopc2tfZHVwKCBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFg1MDlfQ1JMKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX1g1MDlfQ1JMX3NvcnQoc2spIFwKKyAgc2tfc29ydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfQ1JMKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfWDUwOV9DUkxfaXNfc29ydGVkKHNrKSBcCisgIHNrX2lzX3NvcnRlZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFg1MDlfQ1JMKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfWDUwOV9DUkxfc2V0X2NtcF9mdW5jKHNrLCBjb21wKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChpbnQgKCopKGNvbnN0IFg1MDlfQ1JMICoqYSwgY29uc3QgWDUwOV9DUkwgKipiKSlza19zZXRfY21wX2Z1bmMoIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9DUkwpICosIHNrKSwgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChzdGFja19jbXBfZnVuYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBpbnQgKCopKGNvbnN0IFg1MDlfQ1JMICoqYSwgY29uc3QgWDUwOV9DUkwgKipiKSwgY29tcCkpKQorCisvKiBYNTA5X0VYVEVOU0lPTiAqLworI2RlZmluZSBza19YNTA5X0VYVEVOU0lPTl9uZXcoY29tcCkgICAgICAgICAgICAgICAgIFwKKyAgKChTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKilza19uZXcoQ0hFQ0tFRF9DQVNUKCBcCisgICAgICBzdGFja19jbXBfZnVuYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaW50ICgqKShjb25zdCBYNTA5X0VYVEVOU0lPTiAqKmEsIGNvbnN0IFg1MDlfRVhURU5TSU9OICoqYiksIGNvbXApKSkKKworI2RlZmluZSBza19YNTA5X0VYVEVOU0lPTl9uZXdfbnVsbCgpICgoU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICopc2tfbmV3X251bGwoKSkKKworI2RlZmluZSBza19YNTA5X0VYVEVOU0lPTl9udW0oc2spIFwKKyAgc2tfbnVtKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICosIHNrKSkKKworI2RlZmluZSBza19YNTA5X0VYVEVOU0lPTl96ZXJvKHNrKSBcCisgIHNrX3plcm8oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKiwgc2spKTsKKworI2RlZmluZSBza19YNTA5X0VYVEVOU0lPTl92YWx1ZShzaywgaSkgXAorICAoKFg1MDlfRVhURU5TSU9OICopc2tfdmFsdWUoICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKiwgc2spLCAoaSkpKQorCisjZGVmaW5lIHNrX1g1MDlfRVhURU5TSU9OX3NldChzaywgaSwgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKFg1MDlfRVhURU5TSU9OICopc2tfc2V0KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICosIHNrKSwgKGkpLCBcCisgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBYNTA5X0VYVEVOU0lPTiAqLCBwKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9FWFRFTlNJT05fZnJlZShzaykgXAorICBza19mcmVlKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICosIHNrKSkKKworI2RlZmluZSBza19YNTA5X0VYVEVOU0lPTl9wb3BfZnJlZShzaywgZnJlZV9mdW5jKSAgICAgICAgICAgICBcCisgIHNrX3BvcF9mcmVlKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICosIHNrKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKCopKHZvaWQgKiksIHZvaWQgKCopKFg1MDlfRVhURU5TSU9OICopLCBmcmVlX2Z1bmMpKQorCisjZGVmaW5lIHNrX1g1MDlfRVhURU5TSU9OX2luc2VydChzaywgcCwgd2hlcmUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfaW5zZXJ0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICosIHNrKSwgXAorICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgWDUwOV9FWFRFTlNJT04gKiwgcCksICh3aGVyZSkpCisKKyNkZWZpbmUgc2tfWDUwOV9FWFRFTlNJT05fZGVsZXRlKHNrLCB3aGVyZSkgXAorICAoKFg1MDlfRVhURU5TSU9OICopc2tfZGVsZXRlKCAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqLCBzayksICh3aGVyZSkpKQorCisjZGVmaW5lIHNrX1g1MDlfRVhURU5TSU9OX2RlbGV0ZV9wdHIoc2ssIHApICAgICAgICAgICAgICAgICAgIFwKKyAgKChYNTA5X0VYVEVOU0lPTiAqKXNrX2RlbGV0ZV9wdHIoICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKiwgc2spLCBcCisgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBYNTA5X0VYVEVOU0lPTiAqLCBwKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9FWFRFTlNJT05fZmluZChzaywgb3V0X2luZGV4LCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX2ZpbmQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKiwgc2spLCAob3V0X2luZGV4KSwgXAorICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFg1MDlfRVhURU5TSU9OICosIHApKQorCisjZGVmaW5lIHNrX1g1MDlfRVhURU5TSU9OX3NoaWZ0KHNrKSBcCisgICgoWDUwOV9FWFRFTlNJT04gKilza19zaGlmdCggICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX1g1MDlfRVhURU5TSU9OX3B1c2goc2ssIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX3B1c2goQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKiwgc2spLCBcCisgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgWDUwOV9FWFRFTlNJT04gKiwgcCkpCisKKyNkZWZpbmUgc2tfWDUwOV9FWFRFTlNJT05fcG9wKHNrKSBcCisgICgoWDUwOV9FWFRFTlNJT04gKilza19wb3AoICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKiwgc2spKSkKKworI2RlZmluZSBza19YNTA5X0VYVEVOU0lPTl9kdXAoc2spICAgICAgXAorICAoKFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqKXNrX2R1cCggXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKiwgc2spKSkKKworI2RlZmluZSBza19YNTA5X0VYVEVOU0lPTl9zb3J0KHNrKSBcCisgIHNrX3NvcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKiwgc2spKQorCisjZGVmaW5lIHNrX1g1MDlfRVhURU5TSU9OX2lzX3NvcnRlZChzaykgXAorICBza19pc19zb3J0ZWQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKiwgc2spKQorCisjZGVmaW5lIHNrX1g1MDlfRVhURU5TSU9OX3NldF9jbXBfZnVuYyhzaywgY29tcCkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChpbnQgKCopKGNvbnN0IFg1MDlfRVhURU5TSU9OICoqYSwgY29uc3QgWDUwOV9FWFRFTlNJT04gKipiKSkgICAgICAgXAorICAgc2tfc2V0X2NtcF9mdW5jKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKiwgc2spLCAgICAgICAgIFwKKyAgICAgICBDSEVDS0VEX0NBU1Qoc3RhY2tfY21wX2Z1bmMsIGludCAoKikoY29uc3QgWDUwOV9FWFRFTlNJT04gKiphLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYNTA5X0VYVEVOU0lPTiAqKmIpLCBcCisgICAgICAgICAgICAgICAgICAgIGNvbXApKSkKKworLyogWDUwOV9JTkZPICovCisjZGVmaW5lIHNrX1g1MDlfSU5GT19uZXcoY29tcCkgICAgIFwKKyAgKChTVEFDS19PRihYNTA5X0lORk8pICopc2tfbmV3KCAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHN0YWNrX2NtcF9mdW5jLCBcCisgICAgICAgICAgICAgICAgICAgaW50ICgqKShjb25zdCBYNTA5X0lORk8gKiphLCBjb25zdCBYNTA5X0lORk8gKipiKSwgY29tcCkpKQorCisjZGVmaW5lIHNrX1g1MDlfSU5GT19uZXdfbnVsbCgpICgoU1RBQ0tfT0YoWDUwOV9JTkZPKSAqKXNrX25ld19udWxsKCkpCisKKyNkZWZpbmUgc2tfWDUwOV9JTkZPX251bShzaykgXAorICBza19udW0oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0lORk8pICosIHNrKSkKKworI2RlZmluZSBza19YNTA5X0lORk9femVybyhzaykgXAorICBza196ZXJvKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9JTkZPKSAqLCBzaykpOworCisjZGVmaW5lIHNrX1g1MDlfSU5GT192YWx1ZShzaywgaSkgXAorICAoKFg1MDlfSU5GTyAqKXNrX3ZhbHVlKCAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoWDUwOV9JTkZPKSAqLCBzayksIChpKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9JTkZPX3NldChzaywgaSwgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoWDUwOV9JTkZPICopc2tfc2V0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9JTkZPKSAqLCBzayksIChpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBYNTA5X0lORk8gKiwgcCkpKQorCisjZGVmaW5lIHNrX1g1MDlfSU5GT19mcmVlKHNrKSBcCisgIHNrX2ZyZWUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0lORk8pICosIHNrKSkKKworI2RlZmluZSBza19YNTA5X0lORk9fcG9wX2ZyZWUoc2ssIGZyZWVfZnVuYykgICAgICAgICAgICAgXAorICBza19wb3BfZnJlZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0lORk8pICosIHNrKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKCopKHZvaWQgKiksIHZvaWQgKCopKFg1MDlfSU5GTyAqKSwgZnJlZV9mdW5jKSkKKworI2RlZmluZSBza19YNTA5X0lORk9faW5zZXJ0KHNrLCBwLCB3aGVyZSkgICAgICAgICAgICAgICAgICAgICAgXAorICBza19pbnNlcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0lORk8pICosIHNrKSwgXAorICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgWDUwOV9JTkZPICosIHApLCAod2hlcmUpKQorCisjZGVmaW5lIHNrX1g1MDlfSU5GT19kZWxldGUoc2ssIHdoZXJlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChYNTA5X0lORk8gKilza19kZWxldGUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0lORk8pICosIHNrKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAod2hlcmUpKSkKKworI2RlZmluZSBza19YNTA5X0lORk9fZGVsZXRlX3B0cihzaywgcCkgICAgICAgICAgICAgICAgICAgXAorICAoKFg1MDlfSU5GTyAqKXNrX2RlbGV0ZV9wdHIoICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0lORk8pICosIHNrKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgWDUwOV9JTkZPICosIHApKSkKKworI2RlZmluZSBza19YNTA5X0lORk9fZmluZChzaywgb3V0X2luZGV4LCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX2ZpbmQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0lORk8pICosIHNrKSwgKG91dF9pbmRleCksIFwKKyAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBYNTA5X0lORk8gKiwgcCkpCisKKyNkZWZpbmUgc2tfWDUwOV9JTkZPX3NoaWZ0KHNrKSBcCisgICgoWDUwOV9JTkZPICopc2tfc2hpZnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0lORk8pICosIHNrKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9JTkZPX3B1c2goc2ssIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX3B1c2goQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0lORk8pICosIHNrKSwgXAorICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFg1MDlfSU5GTyAqLCBwKSkKKworI2RlZmluZSBza19YNTA5X0lORk9fcG9wKHNrKSBcCisgICgoWDUwOV9JTkZPICopc2tfcG9wKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9JTkZPKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX1g1MDlfSU5GT19kdXAoc2spICAgICAgXAorICAoKFNUQUNLX09GKFg1MDlfSU5GTykgKilza19kdXAoIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoWDUwOV9JTkZPKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX1g1MDlfSU5GT19zb3J0KHNrKSBcCisgIHNrX3NvcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0lORk8pICosIHNrKSkKKworI2RlZmluZSBza19YNTA5X0lORk9faXNfc29ydGVkKHNrKSBcCisgIHNrX2lzX3NvcnRlZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFg1MDlfSU5GTykgKiwgc2spKQorCisjZGVmaW5lIHNrX1g1MDlfSU5GT19zZXRfY21wX2Z1bmMoc2ssIGNvbXApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChpbnQgKCopKGNvbnN0IFg1MDlfSU5GTyAqKmEsIGNvbnN0IFg1MDlfSU5GTyAqKmIpKXNrX3NldF9jbXBfZnVuYyggXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0lORk8pICosIHNrKSwgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1Qoc3RhY2tfY21wX2Z1bmMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBpbnQgKCopKGNvbnN0IFg1MDlfSU5GTyAqKmEsIGNvbnN0IFg1MDlfSU5GTyAqKmIpLCBjb21wKSkpCisKKy8qIFg1MDlfTE9PS1VQICovCisjZGVmaW5lIHNrX1g1MDlfTE9PS1VQX25ldyhjb21wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChTVEFDS19PRihYNTA5X0xPT0tVUCkgKilza19uZXcoQ0hFQ0tFRF9DQVNUKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgc3RhY2tfY21wX2Z1bmMsIGludCAoKikoY29uc3QgWDUwOV9MT09LVVAgKiphLCBjb25zdCBYNTA5X0xPT0tVUCAqKmIpLCBcCisgICAgICBjb21wKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9MT09LVVBfbmV3X251bGwoKSAoKFNUQUNLX09GKFg1MDlfTE9PS1VQKSAqKXNrX25ld19udWxsKCkpCisKKyNkZWZpbmUgc2tfWDUwOV9MT09LVVBfbnVtKHNrKSBcCisgIHNrX251bShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfTE9PS1VQKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfWDUwOV9MT09LVVBfemVybyhzaykgXAorICBza196ZXJvKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9MT09LVVApICosIHNrKSk7CisKKyNkZWZpbmUgc2tfWDUwOV9MT09LVVBfdmFsdWUoc2ssIGkpIFwKKyAgKChYNTA5X0xPT0tVUCAqKXNrX3ZhbHVlKCAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoWDUwOV9MT09LVVApICosIHNrKSwgKGkpKSkKKworI2RlZmluZSBza19YNTA5X0xPT0tVUF9zZXQoc2ssIGksIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKFg1MDlfTE9PS1VQICopc2tfc2V0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9MT09LVVApICosIHNrKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIChpKSwgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgWDUwOV9MT09LVVAgKiwgcCkpKQorCisjZGVmaW5lIHNrX1g1MDlfTE9PS1VQX2ZyZWUoc2spIFwKKyAgc2tfZnJlZShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfTE9PS1VQKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfWDUwOV9MT09LVVBfcG9wX2ZyZWUoc2ssIGZyZWVfZnVuYykgICAgICAgICAgICAgXAorICBza19wb3BfZnJlZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfTE9PS1VQKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICgqKSh2b2lkICopLCB2b2lkICgqKShYNTA5X0xPT0tVUCAqKSwgZnJlZV9mdW5jKSkKKworI2RlZmluZSBza19YNTA5X0xPT0tVUF9pbnNlcnQoc2ssIHAsIHdoZXJlKSAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX2luc2VydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfTE9PS1VQKSAqLCBzayksIFwKKyAgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFg1MDlfTE9PS1VQICosIHApLCAod2hlcmUpKQorCisjZGVmaW5lIHNrX1g1MDlfTE9PS1VQX2RlbGV0ZShzaywgd2hlcmUpIFwKKyAgKChYNTA5X0xPT0tVUCAqKXNrX2RlbGV0ZSggICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0xPT0tVUCkgKiwgc2spLCAod2hlcmUpKSkKKworI2RlZmluZSBza19YNTA5X0xPT0tVUF9kZWxldGVfcHRyKHNrLCBwKSAgICAgICAgICAgICAgICAgICBcCisgICgoWDUwOV9MT09LVVAgKilza19kZWxldGVfcHRyKCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9MT09LVVApICosIHNrKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgWDUwOV9MT09LVVAgKiwgcCkpKQorCisjZGVmaW5lIHNrX1g1MDlfTE9PS1VQX2ZpbmQoc2ssIG91dF9pbmRleCwgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBza19maW5kKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9MT09LVVApICosIHNrKSwgKG91dF9pbmRleCksIFwKKyAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBYNTA5X0xPT0tVUCAqLCBwKSkKKworI2RlZmluZSBza19YNTA5X0xPT0tVUF9zaGlmdChzaykgXAorICAoKFg1MDlfTE9PS1VQICopc2tfc2hpZnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0xPT0tVUCkgKiwgc2spKSkKKworI2RlZmluZSBza19YNTA5X0xPT0tVUF9wdXNoKHNrLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBza19wdXNoKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9MT09LVVApICosIHNrKSwgXAorICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFg1MDlfTE9PS1VQICosIHApKQorCisjZGVmaW5lIHNrX1g1MDlfTE9PS1VQX3BvcChzaykgXAorICAoKFg1MDlfTE9PS1VQICopc2tfcG9wKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9MT09LVVApICosIHNrKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9MT09LVVBfZHVwKHNrKSAgICAgIFwKKyAgKChTVEFDS19PRihYNTA5X0xPT0tVUCkgKilza19kdXAoIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoWDUwOV9MT09LVVApICosIHNrKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9MT09LVVBfc29ydChzaykgXAorICBza19zb3J0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9MT09LVVApICosIHNrKSkKKworI2RlZmluZSBza19YNTA5X0xPT0tVUF9pc19zb3J0ZWQoc2spIFwKKyAgc2tfaXNfc29ydGVkKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoWDUwOV9MT09LVVApICosIHNrKSkKKworI2RlZmluZSBza19YNTA5X0xPT0tVUF9zZXRfY21wX2Z1bmMoc2ssIGNvbXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKGludCAoKikoY29uc3QgWDUwOV9MT09LVVAgKiphLCBjb25zdCBYNTA5X0xPT0tVUCAqKmIpKXNrX3NldF9jbXBfZnVuYyggXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X0xPT0tVUCkgKiwgc2spLCAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHN0YWNrX2NtcF9mdW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIGludCAoKikoY29uc3QgWDUwOV9MT09LVVAgKiphLCBjb25zdCBYNTA5X0xPT0tVUCAqKmIpLCAgXAorICAgICAgICAgICAgICAgICAgIGNvbXApKSkKKworLyogWDUwOV9OQU1FICovCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9uZXcoY29tcCkgICAgIFwKKyAgKChTVEFDS19PRihYNTA5X05BTUUpICopc2tfbmV3KCAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHN0YWNrX2NtcF9mdW5jLCBcCisgICAgICAgICAgICAgICAgICAgaW50ICgqKShjb25zdCBYNTA5X05BTUUgKiphLCBjb25zdCBYNTA5X05BTUUgKipiKSwgY29tcCkpKQorCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9uZXdfbnVsbCgpICgoU1RBQ0tfT0YoWDUwOV9OQU1FKSAqKXNrX25ld19udWxsKCkpCisKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX251bShzaykgXAorICBza19udW0oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X05BTUUpICosIHNrKSkKKworI2RlZmluZSBza19YNTA5X05BTUVfemVybyhzaykgXAorICBza196ZXJvKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9OQU1FKSAqLCBzaykpOworCisjZGVmaW5lIHNrX1g1MDlfTkFNRV92YWx1ZShzaywgaSkgXAorICAoKFg1MDlfTkFNRSAqKXNrX3ZhbHVlKCAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoWDUwOV9OQU1FKSAqLCBzayksIChpKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX3NldChzaywgaSwgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoWDUwOV9OQU1FICopc2tfc2V0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9OQU1FKSAqLCBzayksIChpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBYNTA5X05BTUUgKiwgcCkpKQorCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9mcmVlKHNrKSBcCisgIHNrX2ZyZWUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X05BTUUpICosIHNrKSkKKworI2RlZmluZSBza19YNTA5X05BTUVfcG9wX2ZyZWUoc2ssIGZyZWVfZnVuYykgICAgICAgICAgICAgXAorICBza19wb3BfZnJlZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X05BTUUpICosIHNrKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKCopKHZvaWQgKiksIHZvaWQgKCopKFg1MDlfTkFNRSAqKSwgZnJlZV9mdW5jKSkKKworI2RlZmluZSBza19YNTA5X05BTUVfaW5zZXJ0KHNrLCBwLCB3aGVyZSkgICAgICAgICAgICAgICAgICAgICAgXAorICBza19pbnNlcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X05BTUUpICosIHNrKSwgXAorICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgWDUwOV9OQU1FICosIHApLCAod2hlcmUpKQorCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9kZWxldGUoc2ssIHdoZXJlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChYNTA5X05BTUUgKilza19kZWxldGUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X05BTUUpICosIHNrKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAod2hlcmUpKSkKKworI2RlZmluZSBza19YNTA5X05BTUVfZGVsZXRlX3B0cihzaywgcCkgICAgICAgICAgICAgICAgICAgXAorICAoKFg1MDlfTkFNRSAqKXNrX2RlbGV0ZV9wdHIoICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X05BTUUpICosIHNrKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgWDUwOV9OQU1FICosIHApKSkKKworI2RlZmluZSBza19YNTA5X05BTUVfZmluZChzaywgb3V0X2luZGV4LCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX2ZpbmQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X05BTUUpICosIHNrKSwgKG91dF9pbmRleCksIFwKKyAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBYNTA5X05BTUUgKiwgcCkpCisKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX3NoaWZ0KHNrKSBcCisgICgoWDUwOV9OQU1FICopc2tfc2hpZnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X05BTUUpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX3B1c2goc2ssIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX3B1c2goQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X05BTUUpICosIHNrKSwgXAorICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFg1MDlfTkFNRSAqLCBwKSkKKworI2RlZmluZSBza19YNTA5X05BTUVfcG9wKHNrKSBcCisgICgoWDUwOV9OQU1FICopc2tfcG9wKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9OQU1FKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9kdXAoc2spICAgICAgXAorICAoKFNUQUNLX09GKFg1MDlfTkFNRSkgKilza19kdXAoIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoWDUwOV9OQU1FKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9zb3J0KHNrKSBcCisgIHNrX3NvcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X05BTUUpICosIHNrKSkKKworI2RlZmluZSBza19YNTA5X05BTUVfaXNfc29ydGVkKHNrKSBcCisgIHNrX2lzX3NvcnRlZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFg1MDlfTkFNRSkgKiwgc2spKQorCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9zZXRfY21wX2Z1bmMoc2ssIGNvbXApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChpbnQgKCopKGNvbnN0IFg1MDlfTkFNRSAqKmEsIGNvbnN0IFg1MDlfTkFNRSAqKmIpKXNrX3NldF9jbXBfZnVuYyggXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X05BTUUpICosIHNrKSwgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1Qoc3RhY2tfY21wX2Z1bmMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBpbnQgKCopKGNvbnN0IFg1MDlfTkFNRSAqKmEsIGNvbnN0IFg1MDlfTkFNRSAqKmIpLCBjb21wKSkpCisKKy8qIFg1MDlfTkFNRV9FTlRSWSAqLworI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfbmV3KGNvbXApICAgICAgICAgICAgICAgICBcCisgICgoU1RBQ0tfT0YoWDUwOV9OQU1FX0VOVFJZKSAqKXNrX25ldyhDSEVDS0VEX0NBU1QoIFwKKyAgICAgIHN0YWNrX2NtcF9mdW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaW50ICgqKShjb25zdCBYNTA5X05BTUVfRU5UUlkgKiphLCBjb25zdCBYNTA5X05BTUVfRU5UUlkgKipiKSwgY29tcCkpKQorCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9FTlRSWV9uZXdfbnVsbCgpIFwKKyAgKChTVEFDS19PRihYNTA5X05BTUVfRU5UUlkpICopc2tfbmV3X251bGwoKSkKKworI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfbnVtKHNrKSBcCisgIHNrX251bShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfTkFNRV9FTlRSWSkgKiwgc2spKQorCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9FTlRSWV96ZXJvKHNrKSBcCisgIHNrX3plcm8oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X05BTUVfRU5UUlkpICosIHNrKSk7CisKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX0VOVFJZX3ZhbHVlKHNrLCBpKSBcCisgICgoWDUwOV9OQU1FX0VOVFJZICopc2tfdmFsdWUoICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihYNTA5X05BTUVfRU5UUlkpICosIHNrKSwgKGkpKSkKKworI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfc2V0KHNrLCBpLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoWDUwOV9OQU1FX0VOVFJZICopc2tfc2V0KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9OQU1FX0VOVFJZKSAqLCBzayksIChpKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgWDUwOV9OQU1FX0VOVFJZICosIHApKSkKKworI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfZnJlZShzaykgXAorICBza19mcmVlKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9OQU1FX0VOVFJZKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX0VOVFJZX3BvcF9mcmVlKHNrLCBmcmVlX2Z1bmMpICAgICAgICAgICAgIFwKKyAgc2tfcG9wX2ZyZWUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9OQU1FX0VOVFJZKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICgqKSh2b2lkICopLCB2b2lkICgqKShYNTA5X05BTUVfRU5UUlkgKiksIGZyZWVfZnVuYykpCisKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX0VOVFJZX2luc2VydChzaywgcCwgd2hlcmUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfaW5zZXJ0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9OQU1FX0VOVFJZKSAqLCBzayksIFwKKyAgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFg1MDlfTkFNRV9FTlRSWSAqLCBwKSwgKHdoZXJlKSkKKworI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfZGVsZXRlKHNrLCB3aGVyZSkgXAorICAoKFg1MDlfTkFNRV9FTlRSWSAqKXNrX2RlbGV0ZSggICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X05BTUVfRU5UUlkpICosIHNrKSwgKHdoZXJlKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX0VOVFJZX2RlbGV0ZV9wdHIoc2ssIHApICAgICAgICAgICAgICAgICAgIFwKKyAgKChYNTA5X05BTUVfRU5UUlkgKilza19kZWxldGVfcHRyKCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9OQU1FX0VOVFJZKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFg1MDlfTkFNRV9FTlRSWSAqLCBwKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX0VOVFJZX2ZpbmQoc2ssIG91dF9pbmRleCwgcCkgICAgICAgICAgICAgICAgICBcCisgIHNrX2ZpbmQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X05BTUVfRU5UUlkpICosIHNrKSwgXAorICAgICAgICAgIChvdXRfaW5kZXgpLCBDSEVDS0VEX0NBU1Qodm9pZCAqLCBYNTA5X05BTUVfRU5UUlkgKiwgcCkpCisKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX0VOVFJZX3NoaWZ0KHNrKSBcCisgICgoWDUwOV9OQU1FX0VOVFJZICopc2tfc2hpZnQoICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X05BTUVfRU5UUlkpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX0VOVFJZX3B1c2goc2ssIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX3B1c2goQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X05BTUVfRU5UUlkpICosIHNrKSwgXAorICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFg1MDlfTkFNRV9FTlRSWSAqLCBwKSkKKworI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfcG9wKHNrKSBcCisgICgoWDUwOV9OQU1FX0VOVFJZICopc2tfcG9wKCAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9OQU1FX0VOVFJZKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9FTlRSWV9kdXAoc2spICAgICAgXAorICAoKFNUQUNLX09GKFg1MDlfTkFNRV9FTlRSWSkgKilza19kdXAoIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoWDUwOV9OQU1FX0VOVFJZKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9FTlRSWV9zb3J0KHNrKSBcCisgIHNrX3NvcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X05BTUVfRU5UUlkpICosIHNrKSkKKworI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfaXNfc29ydGVkKHNrKSBcCisgIHNrX2lzX3NvcnRlZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFg1MDlfTkFNRV9FTlRSWSkgKiwgc2spKQorCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9FTlRSWV9zZXRfY21wX2Z1bmMoc2ssIGNvbXApICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoaW50ICgqKShjb25zdCBYNTA5X05BTUVfRU5UUlkgKiphLCBjb25zdCBYNTA5X05BTUVfRU5UUlkgKipiKSkgICAgICBcCisgICBza19zZXRfY21wX2Z1bmMoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X05BTUVfRU5UUlkpICosIHNrKSwgICAgICAgICBcCisgICAgICAgQ0hFQ0tFRF9DQVNUKHN0YWNrX2NtcF9mdW5jLCBpbnQgKCopKGNvbnN0IFg1MDlfTkFNRV9FTlRSWSAqKmEsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFg1MDlfTkFNRV9FTlRSWSAqKmIpLCBcCisgICAgICAgICAgICAgICAgICAgIGNvbXApKSkKKworLyogWDUwOV9OQU1FX0VOVFJZICovCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9FTlRSWV9uZXcoY29tcCkgICAgICAgICAgICAgICAgIFwKKyAgKChTVEFDS19PRihYNTA5X05BTUVfRU5UUlkpICopc2tfbmV3KENIRUNLRURfQ0FTVCggXAorICAgICAgc3RhY2tfY21wX2Z1bmMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpbnQgKCopKGNvbnN0IFg1MDlfTkFNRV9FTlRSWSAqKmEsIGNvbnN0IFg1MDlfTkFNRV9FTlRSWSAqKmIpLCBjb21wKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX0VOVFJZX25ld19udWxsKCkgXAorICAoKFNUQUNLX09GKFg1MDlfTkFNRV9FTlRSWSkgKilza19uZXdfbnVsbCgpKQorCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9FTlRSWV9udW0oc2spIFwKKyAgc2tfbnVtKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9OQU1FX0VOVFJZKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX0VOVFJZX3plcm8oc2spIFwKKyAgc2tfemVybyhDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfTkFNRV9FTlRSWSkgKiwgc2spKTsKKworI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfdmFsdWUoc2ssIGkpIFwKKyAgKChYNTA5X05BTUVfRU5UUlkgKilza192YWx1ZSggICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFg1MDlfTkFNRV9FTlRSWSkgKiwgc2spLCAoaSkpKQorCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9FTlRSWV9zZXQoc2ssIGksIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChYNTA5X05BTUVfRU5UUlkgKilza19zZXQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X05BTUVfRU5UUlkpICosIHNrKSwgKGkpLCBcCisgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBYNTA5X05BTUVfRU5UUlkgKiwgcCkpKQorCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9FTlRSWV9mcmVlKHNrKSBcCisgIHNrX2ZyZWUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X05BTUVfRU5UUlkpICosIHNrKSkKKworI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfcG9wX2ZyZWUoc2ssIGZyZWVfZnVuYykgICAgICAgICAgICAgXAorICBza19wb3BfZnJlZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X05BTUVfRU5UUlkpICosIHNrKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKCopKHZvaWQgKiksIHZvaWQgKCopKFg1MDlfTkFNRV9FTlRSWSAqKSwgZnJlZV9mdW5jKSkKKworI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfaW5zZXJ0KHNrLCBwLCB3aGVyZSkgICAgICAgICAgICAgICAgICAgICAgXAorICBza19pbnNlcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X05BTUVfRU5UUlkpICosIHNrKSwgXAorICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgWDUwOV9OQU1FX0VOVFJZICosIHApLCAod2hlcmUpKQorCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9FTlRSWV9kZWxldGUoc2ssIHdoZXJlKSBcCisgICgoWDUwOV9OQU1FX0VOVFJZICopc2tfZGVsZXRlKCAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfTkFNRV9FTlRSWSkgKiwgc2spLCAod2hlcmUpKSkKKworI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfZGVsZXRlX3B0cihzaywgcCkgICAgICAgICAgICAgICAgICAgXAorICAoKFg1MDlfTkFNRV9FTlRSWSAqKXNrX2RlbGV0ZV9wdHIoICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X05BTUVfRU5UUlkpICosIHNrKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgWDUwOV9OQU1FX0VOVFJZICosIHApKSkKKworI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfZmluZChzaywgb3V0X2luZGV4LCBwKSAgICAgICAgICAgICAgICAgIFwKKyAgc2tfZmluZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfTkFNRV9FTlRSWSkgKiwgc2spLCBcCisgICAgICAgICAgKG91dF9pbmRleCksIENIRUNLRURfQ0FTVCh2b2lkICosIFg1MDlfTkFNRV9FTlRSWSAqLCBwKSkKKworI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfc2hpZnQoc2spIFwKKyAgKChYNTA5X05BTUVfRU5UUlkgKilza19zaGlmdCggICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfTkFNRV9FTlRSWSkgKiwgc2spKSkKKworI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfcHVzaChzaywgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfcHVzaChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfTkFNRV9FTlRSWSkgKiwgc2spLCBcCisgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgWDUwOV9OQU1FX0VOVFJZICosIHApKQorCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9FTlRSWV9wb3Aoc2spIFwKKyAgKChYNTA5X05BTUVfRU5UUlkgKilza19wb3AoICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X05BTUVfRU5UUlkpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX0VOVFJZX2R1cChzaykgICAgICBcCisgICgoU1RBQ0tfT0YoWDUwOV9OQU1FX0VOVFJZKSAqKXNrX2R1cCggXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihYNTA5X05BTUVfRU5UUlkpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX0VOVFJZX3NvcnQoc2spIFwKKyAgc2tfc29ydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfTkFNRV9FTlRSWSkgKiwgc2spKQorCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9FTlRSWV9pc19zb3J0ZWQoc2spIFwKKyAgc2tfaXNfc29ydGVkKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoWDUwOV9OQU1FX0VOVFJZKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX0VOVFJZX3NldF9jbXBfZnVuYyhzaywgY29tcCkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChpbnQgKCopKGNvbnN0IFg1MDlfTkFNRV9FTlRSWSAqKmEsIGNvbnN0IFg1MDlfTkFNRV9FTlRSWSAqKmIpKSAgICAgIFwKKyAgIHNrX3NldF9jbXBfZnVuYyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfTkFNRV9FTlRSWSkgKiwgc2spLCAgICAgICAgIFwKKyAgICAgICBDSEVDS0VEX0NBU1Qoc3RhY2tfY21wX2Z1bmMsIGludCAoKikoY29uc3QgWDUwOV9OQU1FX0VOVFJZICoqYSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWDUwOV9OQU1FX0VOVFJZICoqYiksIFwKKyAgICAgICAgICAgICAgICAgICAgY29tcCkpKQorCisvKiBYNTA5X09CSkVDVCAqLworI2RlZmluZSBza19YNTA5X09CSkVDVF9uZXcoY29tcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoU1RBQ0tfT0YoWDUwOV9PQkpFQ1QpICopc2tfbmV3KENIRUNLRURfQ0FTVCggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN0YWNrX2NtcF9mdW5jLCBpbnQgKCopKGNvbnN0IFg1MDlfT0JKRUNUICoqYSwgY29uc3QgWDUwOV9PQkpFQ1QgKipiKSwgXAorICAgICAgY29tcCkpKQorCisjZGVmaW5lIHNrX1g1MDlfT0JKRUNUX25ld19udWxsKCkgKChTVEFDS19PRihYNTA5X09CSkVDVCkgKilza19uZXdfbnVsbCgpKQorCisjZGVmaW5lIHNrX1g1MDlfT0JKRUNUX251bShzaykgXAorICBza19udW0oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X09CSkVDVCkgKiwgc2spKQorCisjZGVmaW5lIHNrX1g1MDlfT0JKRUNUX3plcm8oc2spIFwKKyAgc2tfemVybyhDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfT0JKRUNUKSAqLCBzaykpOworCisjZGVmaW5lIHNrX1g1MDlfT0JKRUNUX3ZhbHVlKHNrLCBpKSBcCisgICgoWDUwOV9PQkpFQ1QgKilza192YWx1ZSggICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFg1MDlfT0JKRUNUKSAqLCBzayksIChpKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9PQkpFQ1Rfc2V0KHNrLCBpLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChYNTA5X09CSkVDVCAqKXNrX3NldChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfT0JKRUNUKSAqLCBzayksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaSksIENIRUNLRURfQ0FTVCh2b2lkICosIFg1MDlfT0JKRUNUICosIHApKSkKKworI2RlZmluZSBza19YNTA5X09CSkVDVF9mcmVlKHNrKSBcCisgIHNrX2ZyZWUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X09CSkVDVCkgKiwgc2spKQorCisjZGVmaW5lIHNrX1g1MDlfT0JKRUNUX3BvcF9mcmVlKHNrLCBmcmVlX2Z1bmMpICAgICAgICAgICAgIFwKKyAgc2tfcG9wX2ZyZWUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X09CSkVDVCkgKiwgc2spLCBcCisgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAoKikodm9pZCAqKSwgdm9pZCAoKikoWDUwOV9PQkpFQ1QgKiksIGZyZWVfZnVuYykpCisKKyNkZWZpbmUgc2tfWDUwOV9PQkpFQ1RfaW5zZXJ0KHNrLCBwLCB3aGVyZSkgICAgICAgICAgICAgICAgICAgICAgXAorICBza19pbnNlcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X09CSkVDVCkgKiwgc2spLCBcCisgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBYNTA5X09CSkVDVCAqLCBwKSwgKHdoZXJlKSkKKworI2RlZmluZSBza19YNTA5X09CSkVDVF9kZWxldGUoc2ssIHdoZXJlKSBcCisgICgoWDUwOV9PQkpFQ1QgKilza19kZWxldGUoICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9PQkpFQ1QpICosIHNrKSwgKHdoZXJlKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9PQkpFQ1RfZGVsZXRlX3B0cihzaywgcCkgICAgICAgICAgICAgICAgICAgXAorICAoKFg1MDlfT0JKRUNUICopc2tfZGVsZXRlX3B0ciggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfT0JKRUNUKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFg1MDlfT0JKRUNUICosIHApKSkKKworI2RlZmluZSBza19YNTA5X09CSkVDVF9maW5kKHNrLCBvdXRfaW5kZXgsIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfZmluZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfT0JKRUNUKSAqLCBzayksIChvdXRfaW5kZXgpLCBcCisgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgWDUwOV9PQkpFQ1QgKiwgcCkpCisKKyNkZWZpbmUgc2tfWDUwOV9PQkpFQ1Rfc2hpZnQoc2spIFwKKyAgKChYNTA5X09CSkVDVCAqKXNrX3NoaWZ0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9PQkpFQ1QpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9PQkpFQ1RfcHVzaChzaywgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfcHVzaChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfT0JKRUNUKSAqLCBzayksIFwKKyAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBYNTA5X09CSkVDVCAqLCBwKSkKKworI2RlZmluZSBza19YNTA5X09CSkVDVF9wb3Aoc2spIFwKKyAgKChYNTA5X09CSkVDVCAqKXNrX3BvcChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfT0JKRUNUKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX1g1MDlfT0JKRUNUX2R1cChzaykgICAgICBcCisgICgoU1RBQ0tfT0YoWDUwOV9PQkpFQ1QpICopc2tfZHVwKCBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFg1MDlfT0JKRUNUKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX1g1MDlfT0JKRUNUX3NvcnQoc2spIFwKKyAgc2tfc29ydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfT0JKRUNUKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfWDUwOV9PQkpFQ1RfaXNfc29ydGVkKHNrKSBcCisgIHNrX2lzX3NvcnRlZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFg1MDlfT0JKRUNUKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfWDUwOV9PQkpFQ1Rfc2V0X2NtcF9mdW5jKHNrLCBjb21wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChpbnQgKCopKGNvbnN0IFg1MDlfT0JKRUNUICoqYSwgY29uc3QgWDUwOV9PQkpFQ1QgKipiKSlza19zZXRfY21wX2Z1bmMoIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9PQkpFQ1QpICosIHNrKSwgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChzdGFja19jbXBfZnVuYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBpbnQgKCopKGNvbnN0IFg1MDlfT0JKRUNUICoqYSwgY29uc3QgWDUwOV9PQkpFQ1QgKipiKSwgIFwKKyAgICAgICAgICAgICAgICAgICBjb21wKSkpCisKKy8qIFg1MDlfUE9MSUNZX0RBVEEgKi8KKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfREFUQV9uZXcoY29tcCkgICAgICAgICAgICAgICAgIFwKKyAgKChTVEFDS19PRihYNTA5X1BPTElDWV9EQVRBKSAqKXNrX25ldyhDSEVDS0VEX0NBU1QoIFwKKyAgICAgIHN0YWNrX2NtcF9mdW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGludCAoKikoY29uc3QgWDUwOV9QT0xJQ1lfREFUQSAqKmEsIGNvbnN0IFg1MDlfUE9MSUNZX0RBVEEgKipiKSwgY29tcCkpKQorCisjZGVmaW5lIHNrX1g1MDlfUE9MSUNZX0RBVEFfbmV3X251bGwoKSBcCisgICgoU1RBQ0tfT0YoWDUwOV9QT0xJQ1lfREFUQSkgKilza19uZXdfbnVsbCgpKQorCisjZGVmaW5lIHNrX1g1MDlfUE9MSUNZX0RBVEFfbnVtKHNrKSBcCisgIHNrX251bShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfUE9MSUNZX0RBVEEpICosIHNrKSkKKworI2RlZmluZSBza19YNTA5X1BPTElDWV9EQVRBX3plcm8oc2spIFwKKyAgc2tfemVybyhDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfUE9MSUNZX0RBVEEpICosIHNrKSk7CisKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfREFUQV92YWx1ZShzaywgaSkgXAorICAoKFg1MDlfUE9MSUNZX0RBVEEgKilza192YWx1ZSggICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFg1MDlfUE9MSUNZX0RBVEEpICosIHNrKSwgKGkpKSkKKworI2RlZmluZSBza19YNTA5X1BPTElDWV9EQVRBX3NldChzaywgaSwgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKFg1MDlfUE9MSUNZX0RBVEEgKilza19zZXQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X1BPTElDWV9EQVRBKSAqLCBzayksIChpKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgWDUwOV9QT0xJQ1lfREFUQSAqLCBwKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfREFUQV9mcmVlKHNrKSBcCisgIHNrX2ZyZWUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X1BPTElDWV9EQVRBKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfREFUQV9wb3BfZnJlZShzaywgZnJlZV9mdW5jKSAgICAgICAgICAgICBcCisgIHNrX3BvcF9mcmVlKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X1BPTElDWV9EQVRBKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICgqKSh2b2lkICopLCB2b2lkICgqKShYNTA5X1BPTElDWV9EQVRBICopLCBmcmVlX2Z1bmMpKQorCisjZGVmaW5lIHNrX1g1MDlfUE9MSUNZX0RBVEFfaW5zZXJ0KHNrLCBwLCB3aGVyZSkgICAgICAgICAgICAgICAgICAgICAgXAorICBza19pbnNlcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X1BPTElDWV9EQVRBKSAqLCBzayksIFwKKyAgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFg1MDlfUE9MSUNZX0RBVEEgKiwgcCksICh3aGVyZSkpCisKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfREFUQV9kZWxldGUoc2ssIHdoZXJlKSBcCisgICgoWDUwOV9QT0xJQ1lfREFUQSAqKXNrX2RlbGV0ZSggICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X1BPTElDWV9EQVRBKSAqLCBzayksICh3aGVyZSkpKQorCisjZGVmaW5lIHNrX1g1MDlfUE9MSUNZX0RBVEFfZGVsZXRlX3B0cihzaywgcCkgICAgICAgICAgICAgICAgICAgXAorICAoKFg1MDlfUE9MSUNZX0RBVEEgKilza19kZWxldGVfcHRyKCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9QT0xJQ1lfREFUQSkgKiwgc2spLCBcCisgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBYNTA5X1BPTElDWV9EQVRBICosIHApKSkKKworI2RlZmluZSBza19YNTA5X1BPTElDWV9EQVRBX2ZpbmQoc2ssIG91dF9pbmRleCwgcCkgICAgICAgICAgICAgICAgICBcCisgIHNrX2ZpbmQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X1BPTElDWV9EQVRBKSAqLCBzayksIFwKKyAgICAgICAgICAob3V0X2luZGV4KSwgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgWDUwOV9QT0xJQ1lfREFUQSAqLCBwKSkKKworI2RlZmluZSBza19YNTA5X1BPTElDWV9EQVRBX3NoaWZ0KHNrKSBcCisgICgoWDUwOV9QT0xJQ1lfREFUQSAqKXNrX3NoaWZ0KCAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9QT0xJQ1lfREFUQSkgKiwgc2spKSkKKworI2RlZmluZSBza19YNTA5X1BPTElDWV9EQVRBX3B1c2goc2ssIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX3B1c2goQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X1BPTElDWV9EQVRBKSAqLCBzayksIFwKKyAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBYNTA5X1BPTElDWV9EQVRBICosIHApKQorCisjZGVmaW5lIHNrX1g1MDlfUE9MSUNZX0RBVEFfcG9wKHNrKSBcCisgICgoWDUwOV9QT0xJQ1lfREFUQSAqKXNrX3BvcCggICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfUE9MSUNZX0RBVEEpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfREFUQV9kdXAoc2spICAgICAgXAorICAoKFNUQUNLX09GKFg1MDlfUE9MSUNZX0RBVEEpICopc2tfZHVwKCBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFg1MDlfUE9MSUNZX0RBVEEpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfREFUQV9zb3J0KHNrKSBcCisgIHNrX3NvcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X1BPTElDWV9EQVRBKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfREFUQV9pc19zb3J0ZWQoc2spIFwKKyAgc2tfaXNfc29ydGVkKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoWDUwOV9QT0xJQ1lfREFUQSkgKiwgc2spKQorCisjZGVmaW5lIHNrX1g1MDlfUE9MSUNZX0RBVEFfc2V0X2NtcF9mdW5jKHNrLCBjb21wKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKGludCAoKikoY29uc3QgWDUwOV9QT0xJQ1lfREFUQSAqKmEsIGNvbnN0IFg1MDlfUE9MSUNZX0RBVEEgKipiKSkgICAgIFwKKyAgIHNrX3NldF9jbXBfZnVuYyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X1BPTElDWV9EQVRBKSAqLCBzayksICAgICAgICAgXAorICAgICAgIENIRUNLRURfQ0FTVChzdGFja19jbXBfZnVuYywgaW50ICgqKShjb25zdCBYNTA5X1BPTElDWV9EQVRBICoqYSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWDUwOV9QT0xJQ1lfREFUQSAqKmIpLCBcCisgICAgICAgICAgICAgICAgICAgIGNvbXApKSkKKworLyogWDUwOV9QT0xJQ1lfTk9ERSAqLworI2RlZmluZSBza19YNTA5X1BPTElDWV9OT0RFX25ldyhjb21wKSAgICAgICAgICAgICAgICAgXAorICAoKFNUQUNLX09GKFg1MDlfUE9MSUNZX05PREUpICopc2tfbmV3KENIRUNLRURfQ0FTVCggXAorICAgICAgc3RhY2tfY21wX2Z1bmMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaW50ICgqKShjb25zdCBYNTA5X1BPTElDWV9OT0RFICoqYSwgY29uc3QgWDUwOV9QT0xJQ1lfTk9ERSAqKmIpLCBjb21wKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfTk9ERV9uZXdfbnVsbCgpIFwKKyAgKChTVEFDS19PRihYNTA5X1BPTElDWV9OT0RFKSAqKXNrX25ld19udWxsKCkpCisKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfTk9ERV9udW0oc2spIFwKKyAgc2tfbnVtKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9QT0xJQ1lfTk9ERSkgKiwgc2spKQorCisjZGVmaW5lIHNrX1g1MDlfUE9MSUNZX05PREVfemVybyhzaykgXAorICBza196ZXJvKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9QT0xJQ1lfTk9ERSkgKiwgc2spKTsKKworI2RlZmluZSBza19YNTA5X1BPTElDWV9OT0RFX3ZhbHVlKHNrLCBpKSBcCisgICgoWDUwOV9QT0xJQ1lfTk9ERSAqKXNrX3ZhbHVlKCAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoWDUwOV9QT0xJQ1lfTk9ERSkgKiwgc2spLCAoaSkpKQorCisjZGVmaW5lIHNrX1g1MDlfUE9MSUNZX05PREVfc2V0KHNrLCBpLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoWDUwOV9QT0xJQ1lfTk9ERSAqKXNrX3NldCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfUE9MSUNZX05PREUpICosIHNrKSwgKGkpLCBcCisgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBYNTA5X1BPTElDWV9OT0RFICosIHApKSkKKworI2RlZmluZSBza19YNTA5X1BPTElDWV9OT0RFX2ZyZWUoc2spIFwKKyAgc2tfZnJlZShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfUE9MSUNZX05PREUpICosIHNrKSkKKworI2RlZmluZSBza19YNTA5X1BPTElDWV9OT0RFX3BvcF9mcmVlKHNrLCBmcmVlX2Z1bmMpICAgICAgICAgICAgIFwKKyAgc2tfcG9wX2ZyZWUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfUE9MSUNZX05PREUpICosIHNrKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKCopKHZvaWQgKiksIHZvaWQgKCopKFg1MDlfUE9MSUNZX05PREUgKiksIGZyZWVfZnVuYykpCisKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfTk9ERV9pbnNlcnQoc2ssIHAsIHdoZXJlKSAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX2luc2VydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfUE9MSUNZX05PREUpICosIHNrKSwgXAorICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgWDUwOV9QT0xJQ1lfTk9ERSAqLCBwKSwgKHdoZXJlKSkKKworI2RlZmluZSBza19YNTA5X1BPTElDWV9OT0RFX2RlbGV0ZShzaywgd2hlcmUpIFwKKyAgKChYNTA5X1BPTElDWV9OT0RFICopc2tfZGVsZXRlKCAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfUE9MSUNZX05PREUpICosIHNrKSwgKHdoZXJlKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfTk9ERV9kZWxldGVfcHRyKHNrLCBwKSAgICAgICAgICAgICAgICAgICBcCisgICgoWDUwOV9QT0xJQ1lfTk9ERSAqKXNrX2RlbGV0ZV9wdHIoICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X1BPTElDWV9OT0RFKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFg1MDlfUE9MSUNZX05PREUgKiwgcCkpKQorCisjZGVmaW5lIHNrX1g1MDlfUE9MSUNZX05PREVfZmluZChzaywgb3V0X2luZGV4LCBwKSAgICAgICAgICAgICAgICAgIFwKKyAgc2tfZmluZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfUE9MSUNZX05PREUpICosIHNrKSwgXAorICAgICAgICAgIChvdXRfaW5kZXgpLCBDSEVDS0VEX0NBU1Qodm9pZCAqLCBYNTA5X1BPTElDWV9OT0RFICosIHApKQorCisjZGVmaW5lIHNrX1g1MDlfUE9MSUNZX05PREVfc2hpZnQoc2spIFwKKyAgKChYNTA5X1BPTElDWV9OT0RFICopc2tfc2hpZnQoICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X1BPTElDWV9OT0RFKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX1g1MDlfUE9MSUNZX05PREVfcHVzaChzaywgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfcHVzaChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfUE9MSUNZX05PREUpICosIHNrKSwgXAorICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFg1MDlfUE9MSUNZX05PREUgKiwgcCkpCisKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfTk9ERV9wb3Aoc2spIFwKKyAgKChYNTA5X1BPTElDWV9OT0RFICopc2tfcG9wKCAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9QT0xJQ1lfTk9ERSkgKiwgc2spKSkKKworI2RlZmluZSBza19YNTA5X1BPTElDWV9OT0RFX2R1cChzaykgICAgICBcCisgICgoU1RBQ0tfT0YoWDUwOV9QT0xJQ1lfTk9ERSkgKilza19kdXAoIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoWDUwOV9QT0xJQ1lfTk9ERSkgKiwgc2spKSkKKworI2RlZmluZSBza19YNTA5X1BPTElDWV9OT0RFX3NvcnQoc2spIFwKKyAgc2tfc29ydChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfUE9MSUNZX05PREUpICosIHNrKSkKKworI2RlZmluZSBza19YNTA5X1BPTElDWV9OT0RFX2lzX3NvcnRlZChzaykgXAorICBza19pc19zb3J0ZWQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihYNTA5X1BPTElDWV9OT0RFKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfTk9ERV9zZXRfY21wX2Z1bmMoc2ssIGNvbXApICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoaW50ICgqKShjb25zdCBYNTA5X1BPTElDWV9OT0RFICoqYSwgY29uc3QgWDUwOV9QT0xJQ1lfTk9ERSAqKmIpKSAgICAgXAorICAgc2tfc2V0X2NtcF9mdW5jKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfUE9MSUNZX05PREUpICosIHNrKSwgICAgICAgICBcCisgICAgICAgQ0hFQ0tFRF9DQVNUKHN0YWNrX2NtcF9mdW5jLCBpbnQgKCopKGNvbnN0IFg1MDlfUE9MSUNZX05PREUgKiphLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYNTA5X1BPTElDWV9OT0RFICoqYiksIFwKKyAgICAgICAgICAgICAgICAgICAgY29tcCkpKQorCisvKiBYNTA5X1BVUlBPU0UgKi8KKyNkZWZpbmUgc2tfWDUwOV9QVVJQT1NFX25ldyhjb21wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoU1RBQ0tfT0YoWDUwOV9QVVJQT1NFKSAqKXNrX25ldyhDSEVDS0VEX0NBU1QoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgc3RhY2tfY21wX2Z1bmMsIGludCAoKikoY29uc3QgWDUwOV9QVVJQT1NFICoqYSwgY29uc3QgWDUwOV9QVVJQT1NFICoqYiksIFwKKyAgICAgIGNvbXApKSkKKworI2RlZmluZSBza19YNTA5X1BVUlBPU0VfbmV3X251bGwoKSAoKFNUQUNLX09GKFg1MDlfUFVSUE9TRSkgKilza19uZXdfbnVsbCgpKQorCisjZGVmaW5lIHNrX1g1MDlfUFVSUE9TRV9udW0oc2spIFwKKyAgc2tfbnVtKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9QVVJQT1NFKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfWDUwOV9QVVJQT1NFX3plcm8oc2spIFwKKyAgc2tfemVybyhDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfUFVSUE9TRSkgKiwgc2spKTsKKworI2RlZmluZSBza19YNTA5X1BVUlBPU0VfdmFsdWUoc2ssIGkpIFwKKyAgKChYNTA5X1BVUlBPU0UgKilza192YWx1ZSggICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFg1MDlfUFVSUE9TRSkgKiwgc2spLCAoaSkpKQorCisjZGVmaW5lIHNrX1g1MDlfUFVSUE9TRV9zZXQoc2ssIGksIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChYNTA5X1BVUlBPU0UgKilza19zZXQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X1BVUlBPU0UpICosIHNrKSwgKGkpLCBcCisgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBYNTA5X1BVUlBPU0UgKiwgcCkpKQorCisjZGVmaW5lIHNrX1g1MDlfUFVSUE9TRV9mcmVlKHNrKSBcCisgIHNrX2ZyZWUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X1BVUlBPU0UpICosIHNrKSkKKworI2RlZmluZSBza19YNTA5X1BVUlBPU0VfcG9wX2ZyZWUoc2ssIGZyZWVfZnVuYykgICAgICAgICAgICAgXAorICBza19wb3BfZnJlZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X1BVUlBPU0UpICosIHNrKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKCopKHZvaWQgKiksIHZvaWQgKCopKFg1MDlfUFVSUE9TRSAqKSwgZnJlZV9mdW5jKSkKKworI2RlZmluZSBza19YNTA5X1BVUlBPU0VfaW5zZXJ0KHNrLCBwLCB3aGVyZSkgICAgICAgICAgICAgICAgICAgICAgXAorICBza19pbnNlcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X1BVUlBPU0UpICosIHNrKSwgXAorICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgWDUwOV9QVVJQT1NFICosIHApLCAod2hlcmUpKQorCisjZGVmaW5lIHNrX1g1MDlfUFVSUE9TRV9kZWxldGUoc2ssIHdoZXJlKSBcCisgICgoWDUwOV9QVVJQT1NFICopc2tfZGVsZXRlKCAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfUFVSUE9TRSkgKiwgc2spLCAod2hlcmUpKSkKKworI2RlZmluZSBza19YNTA5X1BVUlBPU0VfZGVsZXRlX3B0cihzaywgcCkgICAgICAgICAgICAgICAgICAgXAorICAoKFg1MDlfUFVSUE9TRSAqKXNrX2RlbGV0ZV9wdHIoICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X1BVUlBPU0UpICosIHNrKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgWDUwOV9QVVJQT1NFICosIHApKSkKKworI2RlZmluZSBza19YNTA5X1BVUlBPU0VfZmluZChzaywgb3V0X2luZGV4LCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX2ZpbmQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X1BVUlBPU0UpICosIHNrKSwgKG91dF9pbmRleCksIFwKKyAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBYNTA5X1BVUlBPU0UgKiwgcCkpCisKKyNkZWZpbmUgc2tfWDUwOV9QVVJQT1NFX3NoaWZ0KHNrKSBcCisgICgoWDUwOV9QVVJQT1NFICopc2tfc2hpZnQoICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X1BVUlBPU0UpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9QVVJQT1NFX3B1c2goc2ssIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX3B1c2goQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X1BVUlBPU0UpICosIHNrKSwgXAorICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFg1MDlfUFVSUE9TRSAqLCBwKSkKKworI2RlZmluZSBza19YNTA5X1BVUlBPU0VfcG9wKHNrKSBcCisgICgoWDUwOV9QVVJQT1NFICopc2tfcG9wKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9QVVJQT1NFKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX1g1MDlfUFVSUE9TRV9kdXAoc2spICAgICAgXAorICAoKFNUQUNLX09GKFg1MDlfUFVSUE9TRSkgKilza19kdXAoIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoWDUwOV9QVVJQT1NFKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX1g1MDlfUFVSUE9TRV9zb3J0KHNrKSBcCisgIHNrX3NvcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X1BVUlBPU0UpICosIHNrKSkKKworI2RlZmluZSBza19YNTA5X1BVUlBPU0VfaXNfc29ydGVkKHNrKSBcCisgIHNrX2lzX3NvcnRlZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFg1MDlfUFVSUE9TRSkgKiwgc2spKQorCisjZGVmaW5lIHNrX1g1MDlfUFVSUE9TRV9zZXRfY21wX2Z1bmMoc2ssIGNvbXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChpbnQgKCopKGNvbnN0IFg1MDlfUFVSUE9TRSAqKmEsIGNvbnN0IFg1MDlfUFVSUE9TRSAqKmIpKXNrX3NldF9jbXBfZnVuYyggXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X1BVUlBPU0UpICosIHNrKSwgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1Qoc3RhY2tfY21wX2Z1bmMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBpbnQgKCopKGNvbnN0IFg1MDlfUFVSUE9TRSAqKmEsIGNvbnN0IFg1MDlfUFVSUE9TRSAqKmIpLCAgXAorICAgICAgICAgICAgICAgICAgIGNvbXApKSkKKworLyogWDUwOV9SRVZPS0VEICovCisjZGVmaW5lIHNrX1g1MDlfUkVWT0tFRF9uZXcoY29tcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKFNUQUNLX09GKFg1MDlfUkVWT0tFRCkgKilza19uZXcoQ0hFQ0tFRF9DQVNUKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN0YWNrX2NtcF9mdW5jLCBpbnQgKCopKGNvbnN0IFg1MDlfUkVWT0tFRCAqKmEsIGNvbnN0IFg1MDlfUkVWT0tFRCAqKmIpLCBcCisgICAgICBjb21wKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9SRVZPS0VEX25ld19udWxsKCkgKChTVEFDS19PRihYNTA5X1JFVk9LRUQpICopc2tfbmV3X251bGwoKSkKKworI2RlZmluZSBza19YNTA5X1JFVk9LRURfbnVtKHNrKSBcCisgIHNrX251bShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfUkVWT0tFRCkgKiwgc2spKQorCisjZGVmaW5lIHNrX1g1MDlfUkVWT0tFRF96ZXJvKHNrKSBcCisgIHNrX3plcm8oQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X1JFVk9LRUQpICosIHNrKSk7CisKKyNkZWZpbmUgc2tfWDUwOV9SRVZPS0VEX3ZhbHVlKHNrLCBpKSBcCisgICgoWDUwOV9SRVZPS0VEICopc2tfdmFsdWUoICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihYNTA5X1JFVk9LRUQpICosIHNrKSwgKGkpKSkKKworI2RlZmluZSBza19YNTA5X1JFVk9LRURfc2V0KHNrLCBpLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoWDUwOV9SRVZPS0VEICopc2tfc2V0KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9SRVZPS0VEKSAqLCBzayksIChpKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgWDUwOV9SRVZPS0VEICosIHApKSkKKworI2RlZmluZSBza19YNTA5X1JFVk9LRURfZnJlZShzaykgXAorICBza19mcmVlKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9SRVZPS0VEKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfWDUwOV9SRVZPS0VEX3BvcF9mcmVlKHNrLCBmcmVlX2Z1bmMpICAgICAgICAgICAgIFwKKyAgc2tfcG9wX2ZyZWUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9SRVZPS0VEKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICgqKSh2b2lkICopLCB2b2lkICgqKShYNTA5X1JFVk9LRUQgKiksIGZyZWVfZnVuYykpCisKKyNkZWZpbmUgc2tfWDUwOV9SRVZPS0VEX2luc2VydChzaywgcCwgd2hlcmUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfaW5zZXJ0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9SRVZPS0VEKSAqLCBzayksIFwKKyAgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFg1MDlfUkVWT0tFRCAqLCBwKSwgKHdoZXJlKSkKKworI2RlZmluZSBza19YNTA5X1JFVk9LRURfZGVsZXRlKHNrLCB3aGVyZSkgXAorICAoKFg1MDlfUkVWT0tFRCAqKXNrX2RlbGV0ZSggICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X1JFVk9LRUQpICosIHNrKSwgKHdoZXJlKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9SRVZPS0VEX2RlbGV0ZV9wdHIoc2ssIHApICAgICAgICAgICAgICAgICAgIFwKKyAgKChYNTA5X1JFVk9LRUQgKilza19kZWxldGVfcHRyKCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9SRVZPS0VEKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFg1MDlfUkVWT0tFRCAqLCBwKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9SRVZPS0VEX2ZpbmQoc2ssIG91dF9pbmRleCwgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBza19maW5kKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9SRVZPS0VEKSAqLCBzayksIChvdXRfaW5kZXgpLCBcCisgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgWDUwOV9SRVZPS0VEICosIHApKQorCisjZGVmaW5lIHNrX1g1MDlfUkVWT0tFRF9zaGlmdChzaykgXAorICAoKFg1MDlfUkVWT0tFRCAqKXNrX3NoaWZ0KCAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9SRVZPS0VEKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX1g1MDlfUkVWT0tFRF9wdXNoKHNrLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBza19wdXNoKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9SRVZPS0VEKSAqLCBzayksIFwKKyAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBYNTA5X1JFVk9LRUQgKiwgcCkpCisKKyNkZWZpbmUgc2tfWDUwOV9SRVZPS0VEX3BvcChzaykgXAorICAoKFg1MDlfUkVWT0tFRCAqKXNrX3BvcChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfUkVWT0tFRCkgKiwgc2spKSkKKworI2RlZmluZSBza19YNTA5X1JFVk9LRURfZHVwKHNrKSAgICAgIFwKKyAgKChTVEFDS19PRihYNTA5X1JFVk9LRUQpICopc2tfZHVwKCBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFg1MDlfUkVWT0tFRCkgKiwgc2spKSkKKworI2RlZmluZSBza19YNTA5X1JFVk9LRURfc29ydChzaykgXAorICBza19zb3J0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9SRVZPS0VEKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfWDUwOV9SRVZPS0VEX2lzX3NvcnRlZChzaykgXAorICBza19pc19zb3J0ZWQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihYNTA5X1JFVk9LRUQpICosIHNrKSkKKworI2RlZmluZSBza19YNTA5X1JFVk9LRURfc2V0X2NtcF9mdW5jKHNrLCBjb21wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoaW50ICgqKShjb25zdCBYNTA5X1JFVk9LRUQgKiphLCBjb25zdCBYNTA5X1JFVk9LRUQgKipiKSlza19zZXRfY21wX2Z1bmMoIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9SRVZPS0VEKSAqLCBzayksICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHN0YWNrX2NtcF9mdW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgaW50ICgqKShjb25zdCBYNTA5X1JFVk9LRUQgKiphLCBjb25zdCBYNTA5X1JFVk9LRUQgKipiKSwgIFwKKyAgICAgICAgICAgICAgICAgICBjb21wKSkpCisKKy8qIFg1MDlfVFJVU1QgKi8KKyNkZWZpbmUgc2tfWDUwOV9UUlVTVF9uZXcoY29tcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChTVEFDS19PRihYNTA5X1RSVVNUKSAqKXNrX25ldyhDSEVDS0VEX0NBU1QoICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN0YWNrX2NtcF9mdW5jLCBpbnQgKCopKGNvbnN0IFg1MDlfVFJVU1QgKiphLCBjb25zdCBYNTA5X1RSVVNUICoqYiksIFwKKyAgICAgIGNvbXApKSkKKworI2RlZmluZSBza19YNTA5X1RSVVNUX25ld19udWxsKCkgKChTVEFDS19PRihYNTA5X1RSVVNUKSAqKXNrX25ld19udWxsKCkpCisKKyNkZWZpbmUgc2tfWDUwOV9UUlVTVF9udW0oc2spIFwKKyAgc2tfbnVtKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9UUlVTVCkgKiwgc2spKQorCisjZGVmaW5lIHNrX1g1MDlfVFJVU1RfemVybyhzaykgXAorICBza196ZXJvKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9UUlVTVCkgKiwgc2spKTsKKworI2RlZmluZSBza19YNTA5X1RSVVNUX3ZhbHVlKHNrLCBpKSBcCisgICgoWDUwOV9UUlVTVCAqKXNrX3ZhbHVlKCAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoWDUwOV9UUlVTVCkgKiwgc2spLCAoaSkpKQorCisjZGVmaW5lIHNrX1g1MDlfVFJVU1Rfc2V0KHNrLCBpLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKFg1MDlfVFJVU1QgKilza19zZXQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X1RSVVNUKSAqLCBzayksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpKSwgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgWDUwOV9UUlVTVCAqLCBwKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9UUlVTVF9mcmVlKHNrKSBcCisgIHNrX2ZyZWUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X1RSVVNUKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfWDUwOV9UUlVTVF9wb3BfZnJlZShzaywgZnJlZV9mdW5jKSAgICAgICAgICAgICBcCisgIHNrX3BvcF9mcmVlKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X1RSVVNUKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICgqKSh2b2lkICopLCB2b2lkICgqKShYNTA5X1RSVVNUICopLCBmcmVlX2Z1bmMpKQorCisjZGVmaW5lIHNrX1g1MDlfVFJVU1RfaW5zZXJ0KHNrLCBwLCB3aGVyZSkgICAgICAgICAgICAgICAgICAgICAgXAorICBza19pbnNlcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X1RSVVNUKSAqLCBzayksIFwKKyAgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFg1MDlfVFJVU1QgKiwgcCksICh3aGVyZSkpCisKKyNkZWZpbmUgc2tfWDUwOV9UUlVTVF9kZWxldGUoc2ssIHdoZXJlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoWDUwOV9UUlVTVCAqKXNrX2RlbGV0ZShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfVFJVU1QpICosIHNrKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoZXJlKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9UUlVTVF9kZWxldGVfcHRyKHNrLCBwKSAgICAgICAgICAgICAgICAgICBcCisgICgoWDUwOV9UUlVTVCAqKXNrX2RlbGV0ZV9wdHIoICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X1RSVVNUKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFg1MDlfVFJVU1QgKiwgcCkpKQorCisjZGVmaW5lIHNrX1g1MDlfVFJVU1RfZmluZChzaywgb3V0X2luZGV4LCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX2ZpbmQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X1RSVVNUKSAqLCBzayksIChvdXRfaW5kZXgpLCBcCisgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgWDUwOV9UUlVTVCAqLCBwKSkKKworI2RlZmluZSBza19YNTA5X1RSVVNUX3NoaWZ0KHNrKSBcCisgICgoWDUwOV9UUlVTVCAqKXNrX3NoaWZ0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9UUlVTVCkgKiwgc2spKSkKKworI2RlZmluZSBza19YNTA5X1RSVVNUX3B1c2goc2ssIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX3B1c2goQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X1RSVVNUKSAqLCBzayksIFwKKyAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBYNTA5X1RSVVNUICosIHApKQorCisjZGVmaW5lIHNrX1g1MDlfVFJVU1RfcG9wKHNrKSBcCisgICgoWDUwOV9UUlVTVCAqKXNrX3BvcChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfVFJVU1QpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9UUlVTVF9kdXAoc2spICAgICAgXAorICAoKFNUQUNLX09GKFg1MDlfVFJVU1QpICopc2tfZHVwKCBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKFg1MDlfVFJVU1QpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9UUlVTVF9zb3J0KHNrKSBcCisgIHNrX3NvcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X1RSVVNUKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfWDUwOV9UUlVTVF9pc19zb3J0ZWQoc2spIFwKKyAgc2tfaXNfc29ydGVkKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoWDUwOV9UUlVTVCkgKiwgc2spKQorCisjZGVmaW5lIHNrX1g1MDlfVFJVU1Rfc2V0X2NtcF9mdW5jKHNrLCBjb21wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKGludCAoKikoY29uc3QgWDUwOV9UUlVTVCAqKmEsIGNvbnN0IFg1MDlfVFJVU1QgKipiKSlza19zZXRfY21wX2Z1bmMoIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9UUlVTVCkgKiwgc2spLCAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1Qoc3RhY2tfY21wX2Z1bmMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIGludCAoKikoY29uc3QgWDUwOV9UUlVTVCAqKmEsIGNvbnN0IFg1MDlfVFJVU1QgKipiKSwgIFwKKyAgICAgICAgICAgICAgICAgICBjb21wKSkpCisKKy8qIFg1MDlfVkVSSUZZX1BBUkFNICovCisjZGVmaW5lIHNrX1g1MDlfVkVSSUZZX1BBUkFNX25ldyhjb21wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKFNUQUNLX09GKFg1MDlfVkVSSUZZX1BBUkFNKSAqKXNrX25ldyhDSEVDS0VEX0NBU1QoICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN0YWNrX2NtcF9mdW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpbnQgKCopKGNvbnN0IFg1MDlfVkVSSUZZX1BBUkFNICoqYSwgY29uc3QgWDUwOV9WRVJJRllfUEFSQU0gKipiKSwgXAorICAgICAgY29tcCkpKQorCisjZGVmaW5lIHNrX1g1MDlfVkVSSUZZX1BBUkFNX25ld19udWxsKCkgXAorICAoKFNUQUNLX09GKFg1MDlfVkVSSUZZX1BBUkFNKSAqKXNrX25ld19udWxsKCkpCisKKyNkZWZpbmUgc2tfWDUwOV9WRVJJRllfUEFSQU1fbnVtKHNrKSBcCisgIHNrX251bShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfVkVSSUZZX1BBUkFNKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfWDUwOV9WRVJJRllfUEFSQU1femVybyhzaykgXAorICBza196ZXJvKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9WRVJJRllfUEFSQU0pICosIHNrKSk7CisKKyNkZWZpbmUgc2tfWDUwOV9WRVJJRllfUEFSQU1fdmFsdWUoc2ssIGkpIFwKKyAgKChYNTA5X1ZFUklGWV9QQVJBTSAqKXNrX3ZhbHVlKCAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoWDUwOV9WRVJJRllfUEFSQU0pICosIHNrKSwgKGkpKSkKKworI2RlZmluZSBza19YNTA5X1ZFUklGWV9QQVJBTV9zZXQoc2ssIGksIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChYNTA5X1ZFUklGWV9QQVJBTSAqKXNrX3NldCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfVkVSSUZZX1BBUkFNKSAqLCBzayksIChpKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgWDUwOV9WRVJJRllfUEFSQU0gKiwgcCkpKQorCisjZGVmaW5lIHNrX1g1MDlfVkVSSUZZX1BBUkFNX2ZyZWUoc2spIFwKKyAgc2tfZnJlZShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfVkVSSUZZX1BBUkFNKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfWDUwOV9WRVJJRllfUEFSQU1fcG9wX2ZyZWUoc2ssIGZyZWVfZnVuYykgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX3BvcF9mcmVlKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9WRVJJRllfUEFSQU0pICosIHNrKSwgICAgXAorICAgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAoKikodm9pZCAqKSwgdm9pZCAoKikoWDUwOV9WRVJJRllfUEFSQU0gKiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfZnVuYykpCisKKyNkZWZpbmUgc2tfWDUwOV9WRVJJRllfUEFSQU1faW5zZXJ0KHNrLCBwLCB3aGVyZSkgICAgICAgICAgICAgICAgICAgICAgXAorICBza19pbnNlcnQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X1ZFUklGWV9QQVJBTSkgKiwgc2spLCBcCisgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBYNTA5X1ZFUklGWV9QQVJBTSAqLCBwKSwgKHdoZXJlKSkKKworI2RlZmluZSBza19YNTA5X1ZFUklGWV9QQVJBTV9kZWxldGUoc2ssIHdoZXJlKSBcCisgICgoWDUwOV9WRVJJRllfUEFSQU0gKilza19kZWxldGUoICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9WRVJJRllfUEFSQU0pICosIHNrKSwgKHdoZXJlKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9WRVJJRllfUEFSQU1fZGVsZXRlX3B0cihzaywgcCkgICAgICAgICAgICAgICAgICAgXAorICAoKFg1MDlfVkVSSUZZX1BBUkFNICopc2tfZGVsZXRlX3B0ciggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKFg1MDlfVkVSSUZZX1BBUkFNKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFg1MDlfVkVSSUZZX1BBUkFNICosIHApKSkKKworI2RlZmluZSBza19YNTA5X1ZFUklGWV9QQVJBTV9maW5kKHNrLCBvdXRfaW5kZXgsIHApICAgICAgICAgICAgICAgICAgXAorICBza19maW5kKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9WRVJJRllfUEFSQU0pICosIHNrKSwgXAorICAgICAgICAgIChvdXRfaW5kZXgpLCBDSEVDS0VEX0NBU1Qodm9pZCAqLCBYNTA5X1ZFUklGWV9QQVJBTSAqLCBwKSkKKworI2RlZmluZSBza19YNTA5X1ZFUklGWV9QQVJBTV9zaGlmdChzaykgXAorICAoKFg1MDlfVkVSSUZZX1BBUkFNICopc2tfc2hpZnQoICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihYNTA5X1ZFUklGWV9QQVJBTSkgKiwgc2spKSkKKworI2RlZmluZSBza19YNTA5X1ZFUklGWV9QQVJBTV9wdXNoKHNrLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBza19wdXNoKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9WRVJJRllfUEFSQU0pICosIHNrKSwgXAorICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIFg1MDlfVkVSSUZZX1BBUkFNICosIHApKQorCisjZGVmaW5lIHNrX1g1MDlfVkVSSUZZX1BBUkFNX3BvcChzaykgXAorICAoKFg1MDlfVkVSSUZZX1BBUkFNICopc2tfcG9wKCAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9WRVJJRllfUEFSQU0pICosIHNrKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9WRVJJRllfUEFSQU1fZHVwKHNrKSAgICAgIFwKKyAgKChTVEFDS19PRihYNTA5X1ZFUklGWV9QQVJBTSkgKilza19kdXAoIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoWDUwOV9WRVJJRllfUEFSQU0pICosIHNrKSkpCisKKyNkZWZpbmUgc2tfWDUwOV9WRVJJRllfUEFSQU1fc29ydChzaykgXAorICBza19zb3J0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9WRVJJRllfUEFSQU0pICosIHNrKSkKKworI2RlZmluZSBza19YNTA5X1ZFUklGWV9QQVJBTV9pc19zb3J0ZWQoc2spIFwKKyAgc2tfaXNfc29ydGVkKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoWDUwOV9WRVJJRllfUEFSQU0pICosIHNrKSkKKworI2RlZmluZSBza19YNTA5X1ZFUklGWV9QQVJBTV9zZXRfY21wX2Z1bmMoc2ssIGNvbXApICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoaW50ICgqKShjb25zdCBYNTA5X1ZFUklGWV9QQVJBTSAqKmEsIGNvbnN0IFg1MDlfVkVSSUZZX1BBUkFNICoqYikpICAgIFwKKyAgIHNrX3NldF9jbXBfZnVuYyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoWDUwOV9WRVJJRllfUEFSQU0pICosIHNrKSwgICAgICAgICBcCisgICAgICAgQ0hFQ0tFRF9DQVNUKHN0YWNrX2NtcF9mdW5jLCBpbnQgKCopKGNvbnN0IFg1MDlfVkVSSUZZX1BBUkFNICoqYSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWDUwOV9WRVJJRllfUEFSQU0gKipiKSwgXAorICAgICAgICAgICAgICAgICAgICBjb21wKSkpCisKKy8qIHZvaWQgKi8KKyNkZWZpbmUgc2tfdm9pZF9uZXcoY29tcCkgICAgICAgICAgICAgICAgXAorICAoKFNUQUNLX09GKHZvaWQpKilza19uZXcoQ0hFQ0tFRF9DQVNUKCBcCisgICAgICBzdGFja19jbXBfZnVuYywgaW50ICgqKShjb25zdCB2b2lkICoqYSwgY29uc3Qgdm9pZCAqKmIpLCBjb21wKSkpCisKKyNkZWZpbmUgc2tfdm9pZF9uZXdfbnVsbCgpICgoU1RBQ0tfT0Yodm9pZCkqKXNrX25ld19udWxsKCkpCisKKyNkZWZpbmUgc2tfdm9pZF9udW0oc2spIHNrX251bShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKHZvaWQpKiwgc2spKQorCisjZGVmaW5lIHNrX3ZvaWRfemVybyhzaykgc2tfemVybyhDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKHZvaWQpKiwgc2spKTsKKworI2RlZmluZSBza192b2lkX3ZhbHVlKHNrLCBpKSBcCisgICgodm9pZCAqKXNrX3ZhbHVlKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0Yodm9pZCkqLCBzayksIChpKSkpCisKKyNkZWZpbmUgc2tfdm9pZF9zZXQoc2ssIGksIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKHZvaWQgKilza19zZXQoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRih2b2lkKSosIHNrKSwgKGkpLCBcCisgICAgICAgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCB2b2lkICosIHApKSkKKworI2RlZmluZSBza192b2lkX2ZyZWUoc2spIHNrX2ZyZWUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRih2b2lkKSosIHNrKSkKKworI2RlZmluZSBza192b2lkX3BvcF9mcmVlKHNrLCBmcmVlX2Z1bmMpICAgICAgICAgICAgICAgICAgICBcCisgIHNrX3BvcF9mcmVlKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0Yodm9pZCkqLCBzayksIFwKKyAgICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKCopKHZvaWQgKiksIHZvaWQgKCopKHZvaWQgKiksIGZyZWVfZnVuYykpCisKKyNkZWZpbmUgc2tfdm9pZF9pbnNlcnQoc2ssIHAsIHdoZXJlKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfaW5zZXJ0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0Yodm9pZCkqLCBzayksIFwKKyAgICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIHZvaWQgKiwgcCksICh3aGVyZSkpCisKKyNkZWZpbmUgc2tfdm9pZF9kZWxldGUoc2ssIHdoZXJlKSBcCisgICgodm9pZCAqKXNrX2RlbGV0ZShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKHZvaWQpKiwgc2spLCAod2hlcmUpKSkKKworI2RlZmluZSBza192b2lkX2RlbGV0ZV9wdHIoc2ssIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCh2b2lkICopc2tfZGVsZXRlX3B0cihDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKHZvaWQpKiwgc2spLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgdm9pZCAqLCBwKSkpCisKKyNkZWZpbmUgc2tfdm9pZF9maW5kKHNrLCBvdXRfaW5kZXgsIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBza19maW5kKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0Yodm9pZCkqLCBzayksIChvdXRfaW5kZXgpLCBcCisgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgdm9pZCAqLCBwKSkKKworI2RlZmluZSBza192b2lkX3NoaWZ0KHNrKSBcCisgICgodm9pZCAqKXNrX3NoaWZ0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0Yodm9pZCkqLCBzaykpKQorCisjZGVmaW5lIHNrX3ZvaWRfcHVzaChzaywgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBza19wdXNoKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0Yodm9pZCkqLCBzayksIFwKKyAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCB2b2lkICosIHApKQorCisjZGVmaW5lIHNrX3ZvaWRfcG9wKHNrKSBcCisgICgodm9pZCAqKXNrX3BvcChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKHZvaWQpKiwgc2spKSkKKworI2RlZmluZSBza192b2lkX2R1cChzaykgXAorICAoKFNUQUNLX09GKHZvaWQpKilza19kdXAoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRih2b2lkKSosIHNrKSkpCisKKyNkZWZpbmUgc2tfdm9pZF9zb3J0KHNrKSBza19zb3J0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0Yodm9pZCkqLCBzaykpCisKKyNkZWZpbmUgc2tfdm9pZF9pc19zb3J0ZWQoc2spIFwKKyAgc2tfaXNfc29ydGVkKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0Yodm9pZCkqLCBzaykpCisKKyNkZWZpbmUgc2tfdm9pZF9zZXRfY21wX2Z1bmMoc2ssIGNvbXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoaW50ICgqKShjb25zdCB2b2lkICoqYSwgY29uc3Qgdm9pZCAqKmIpKXNrX3NldF9jbXBfZnVuYyggICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRih2b2lkKSosIHNrKSwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChzdGFja19jbXBfZnVuYywgaW50ICgqKShjb25zdCB2b2lkICoqYSwgY29uc3Qgdm9pZCAqKmIpLCBcCisgICAgICAgICAgICAgICAgICAgY29tcCkpKQorCisvKiBPUEVOU1NMX1NUUklORyAqLworI2RlZmluZSBza19PUEVOU1NMX1NUUklOR19uZXcoY29tcCkgICAgICAgICAgICAgICAgIFwKKyAgKChTVEFDS19PRihPUEVOU1NMX1NUUklORykgKilza19uZXcoQ0hFQ0tFRF9DQVNUKCBcCisgICAgICBzdGFja19jbXBfZnVuYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaW50ICgqKShjb25zdCBPUEVOU1NMX1NUUklORyAqYSwgY29uc3QgT1BFTlNTTF9TVFJJTkcgKmIpLCBjb21wKSkpCisKKyNkZWZpbmUgc2tfT1BFTlNTTF9TVFJJTkdfbmV3X251bGwoKSAoKFNUQUNLX09GKE9QRU5TU0xfU1RSSU5HKSAqKXNrX25ld19udWxsKCkpCisKKyNkZWZpbmUgc2tfT1BFTlNTTF9TVFJJTkdfbnVtKHNrKSBcCisgIHNrX251bShDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKE9QRU5TU0xfU1RSSU5HKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfT1BFTlNTTF9TVFJJTkdfemVybyhzaykgXAorICBza196ZXJvKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICosIHNrKSk7CisKKyNkZWZpbmUgc2tfT1BFTlNTTF9TVFJJTkdfdmFsdWUoc2ssIGkpIFwKKyAgKChPUEVOU1NMX1NUUklORylza192YWx1ZSggICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICosIHNrKSwgKGkpKSkKKworI2RlZmluZSBza19PUEVOU1NMX1NUUklOR19zZXQoc2ssIGksIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChPUEVOU1NMX1NUUklORylza19zZXQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKE9QRU5TU0xfU1RSSU5HKSAqLCBzayksIChpKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgT1BFTlNTTF9TVFJJTkcsIHApKSkKKworI2RlZmluZSBza19PUEVOU1NMX1NUUklOR19mcmVlKHNrKSBcCisgIHNrX2ZyZWUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihPUEVOU1NMX1NUUklORykgKiwgc2spKQorCisjZGVmaW5lIHNrX09QRU5TU0xfU1RSSU5HX3BvcF9mcmVlKHNrLCBmcmVlX2Z1bmMpICAgICAgICAgICAgIFwKKyAgc2tfcG9wX2ZyZWUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihPUEVOU1NMX1NUUklORykgKiwgc2spLCBcCisgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAoKikodm9pZCAqKSwgdm9pZCAoKikoT1BFTlNTTF9TVFJJTkcpLCBmcmVlX2Z1bmMpKQorCisjZGVmaW5lIHNrX09QRU5TU0xfU1RSSU5HX2luc2VydChzaywgcCwgd2hlcmUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfaW5zZXJ0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICosIHNrKSwgXAorICAgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgT1BFTlNTTF9TVFJJTkcsIHApLCAod2hlcmUpKQorCisjZGVmaW5lIHNrX09QRU5TU0xfU1RSSU5HX2RlbGV0ZShzaywgd2hlcmUpIFwKKyAgKChPUEVOU1NMX1NUUklORylza19kZWxldGUoICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihPUEVOU1NMX1NUUklORykgKiwgc2spLCAod2hlcmUpKSkKKworI2RlZmluZSBza19PUEVOU1NMX1NUUklOR19kZWxldGVfcHRyKHNrLCBwKSAgICAgICAgICAgICAgICAgICBcCisgICgoT1BFTlNTTF9TVFJJTkcpc2tfZGVsZXRlX3B0ciggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICosIHNrKSwgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgT1BFTlNTTF9TVFJJTkcsIHApKSkKKworI2RlZmluZSBza19PUEVOU1NMX1NUUklOR19maW5kKHNrLCBvdXRfaW5kZXgsIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfZmluZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKE9QRU5TU0xfU1RSSU5HKSAqLCBzayksIChvdXRfaW5kZXgpLCBcCisgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgT1BFTlNTTF9TVFJJTkcsIHApKQorCisjZGVmaW5lIHNrX09QRU5TU0xfU1RSSU5HX3NoaWZ0KHNrKSBcCisgICgoT1BFTlNTTF9TVFJJTkcpc2tfc2hpZnQoICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKE9QRU5TU0xfU1RSSU5HKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX09QRU5TU0xfU1RSSU5HX3B1c2goc2ssIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNrX3B1c2goQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihPUEVOU1NMX1NUUklORykgKiwgc2spLCBcCisgICAgICAgICAgQ0hFQ0tFRF9DQVNUKHZvaWQgKiwgT1BFTlNTTF9TVFJJTkcsIHApKQorCisjZGVmaW5lIHNrX09QRU5TU0xfU1RSSU5HX3BvcChzaykgXAorICAoKE9QRU5TU0xfU1RSSU5HKXNrX3BvcCggICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfT1BFTlNTTF9TVFJJTkdfZHVwKHNrKSAgICAgIFwKKyAgKChTVEFDS19PRihPUEVOU1NMX1NUUklORykgKilza19kdXAoIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICosIHNrKSkpCisKKyNkZWZpbmUgc2tfT1BFTlNTTF9TVFJJTkdfc29ydChzaykgXAorICBza19zb3J0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICosIHNrKSkKKworI2RlZmluZSBza19PUEVOU1NMX1NUUklOR19pc19zb3J0ZWQoc2spIFwKKyAgc2tfaXNfc29ydGVkKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICosIHNrKSkKKworI2RlZmluZSBza19PUEVOU1NMX1NUUklOR19zZXRfY21wX2Z1bmMoc2ssIGNvbXApICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoaW50ICgqKShjb25zdCBPUEVOU1NMX1NUUklORyAqKmEsIGNvbnN0IE9QRU5TU0xfU1RSSU5HICoqYikpICAgICAgIFwKKyAgIHNrX3NldF9jbXBfZnVuYyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICosIHNrKSwgICAgICAgICBcCisgICAgICAgQ0hFQ0tFRF9DQVNUKHN0YWNrX2NtcF9mdW5jLCBpbnQgKCopKGNvbnN0IE9QRU5TU0xfU1RSSU5HICoqYSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1BFTlNTTF9TVFJJTkcgKipiKSwgXAorICAgICAgICAgICAgICAgICAgICBjb21wKSkpCisKKy8qIE9QRU5TU0xfQkxPQ0sgKi8KKyNkZWZpbmUgc2tfT1BFTlNTTF9CTE9DS19uZXcoY29tcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoU1RBQ0tfT0YoT1BFTlNTTF9CTE9DSykgKilza19uZXcoQ0hFQ0tFRF9DQVNUKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgc3RhY2tfY21wX2Z1bmMsIGludCAoKikoY29uc3QgT1BFTlNTTF9CTE9DSyAqYSwgY29uc3QgT1BFTlNTTF9CTE9DSyAqYiksIFwKKyAgICAgIGNvbXApKSkKKworI2RlZmluZSBza19PUEVOU1NMX0JMT0NLX25ld19udWxsKCkgKChTVEFDS19PRihPUEVOU1NMX0JMT0NLKSAqKXNrX25ld19udWxsKCkpCisKKyNkZWZpbmUgc2tfT1BFTlNTTF9CTE9DS19udW0oc2spIFwKKyAgc2tfbnVtKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoT1BFTlNTTF9CTE9DSykgKiwgc2spKQorCisjZGVmaW5lIHNrX09QRU5TU0xfQkxPQ0tfemVybyhzaykgXAorICBza196ZXJvKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoT1BFTlNTTF9CTE9DSykgKiwgc2spKTsKKworI2RlZmluZSBza19PUEVOU1NMX0JMT0NLX3ZhbHVlKHNrLCBpKSBcCisgICgoT1BFTlNTTF9CTE9DSylza192YWx1ZSggICAgICAgICAgIFwKKyAgICAgIENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgY29uc3QgU1RBQ0tfT0YoT1BFTlNTTF9CTE9DSykgKiwgc2spLCAoaSkpKQorCisjZGVmaW5lIHNrX09QRU5TU0xfQkxPQ0tfc2V0KHNrLCBpLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoT1BFTlNTTF9CTE9DSylza19zZXQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKE9QRU5TU0xfQkxPQ0spICosIHNrKSwgKGkpLCBcCisgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBPUEVOU1NMX0JMT0NLLCBwKSkpCisKKyNkZWZpbmUgc2tfT1BFTlNTTF9CTE9DS19mcmVlKHNrKSBcCisgIHNrX2ZyZWUoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihPUEVOU1NMX0JMT0NLKSAqLCBzaykpCisKKyNkZWZpbmUgc2tfT1BFTlNTTF9CTE9DS19wb3BfZnJlZShzaywgZnJlZV9mdW5jKSAgICAgICAgICAgICBcCisgIHNrX3BvcF9mcmVlKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihPUEVOU1NMX0JMT0NLKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICgqKSh2b2lkICopLCB2b2lkICgqKShPUEVOU1NMX0JMT0NLKSwgZnJlZV9mdW5jKSkKKworI2RlZmluZSBza19PUEVOU1NMX0JMT0NLX2luc2VydChzaywgcCwgd2hlcmUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfaW5zZXJ0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoT1BFTlNTTF9CTE9DSykgKiwgc2spLCBcCisgICAgICAgICAgICBDSEVDS0VEX0NBU1Qodm9pZCAqLCBPUEVOU1NMX0JMT0NLLCBwKSwgKHdoZXJlKSkKKworI2RlZmluZSBza19PUEVOU1NMX0JMT0NLX2RlbGV0ZShzaywgd2hlcmUpIFwKKyAgKChPUEVOU1NMX0JMT0NLKXNrX2RlbGV0ZSggICAgICAgICAgICAgICBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKE9QRU5TU0xfQkxPQ0spICosIHNrKSwgKHdoZXJlKSkpCisKKyNkZWZpbmUgc2tfT1BFTlNTTF9CTE9DS19kZWxldGVfcHRyKHNrLCBwKSAgICAgICAgICAgICAgICAgICBcCisgICgoT1BFTlNTTF9CTE9DSylza19kZWxldGVfcHRyKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihPUEVOU1NMX0JMT0NLKSAqLCBzayksIFwKKyAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIE9QRU5TU0xfQkxPQ0ssIHApKSkKKworI2RlZmluZSBza19PUEVOU1NMX0JMT0NLX2ZpbmQoc2ssIG91dF9pbmRleCwgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBza19maW5kKENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoT1BFTlNTTF9CTE9DSykgKiwgc2spLCAob3V0X2luZGV4KSwgXAorICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIE9QRU5TU0xfQkxPQ0ssIHApKQorCisjZGVmaW5lIHNrX09QRU5TU0xfQkxPQ0tfc2hpZnQoc2spIFwKKyAgKChPUEVOU1NMX0JMT0NLKXNrX3NoaWZ0KCAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihPUEVOU1NMX0JMT0NLKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX09QRU5TU0xfQkxPQ0tfcHVzaChzaywgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2tfcHVzaChDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKE9QRU5TU0xfQkxPQ0spICosIHNrKSwgXAorICAgICAgICAgIENIRUNLRURfQ0FTVCh2b2lkICosIE9QRU5TU0xfQkxPQ0ssIHApKQorCisjZGVmaW5lIHNrX09QRU5TU0xfQkxPQ0tfcG9wKHNrKSBcCisgICgoT1BFTlNTTF9CTE9DSylza19wb3AoQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBTVEFDS19PRihPUEVOU1NMX0JMT0NLKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX09QRU5TU0xfQkxPQ0tfZHVwKHNrKSAgICAgIFwKKyAgKChTVEFDS19PRihPUEVOU1NMX0JMT0NLKSAqKXNrX2R1cCggXAorICAgICAgQ0hFQ0tFRF9DQVNUKF9TVEFDSyAqLCBjb25zdCBTVEFDS19PRihPUEVOU1NMX0JMT0NLKSAqLCBzaykpKQorCisjZGVmaW5lIHNrX09QRU5TU0xfQkxPQ0tfc29ydChzaykgXAorICBza19zb3J0KENIRUNLRURfQ0FTVChfU1RBQ0sgKiwgU1RBQ0tfT0YoT1BFTlNTTF9CTE9DSykgKiwgc2spKQorCisjZGVmaW5lIHNrX09QRU5TU0xfQkxPQ0tfaXNfc29ydGVkKHNrKSBcCisgIHNrX2lzX3NvcnRlZChDSEVDS0VEX0NBU1QoX1NUQUNLICosIGNvbnN0IFNUQUNLX09GKE9QRU5TU0xfQkxPQ0spICosIHNrKSkKKworI2RlZmluZSBza19PUEVOU1NMX0JMT0NLX3NldF9jbXBfZnVuYyhzaywgY29tcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChpbnQgKCopKGNvbnN0IE9QRU5TU0xfQkxPQ0sgKiphLCBjb25zdCBPUEVOU1NMX0JMT0NLICoqYikpc2tfc2V0X2NtcF9mdW5jKCBcCisgICAgICBDSEVDS0VEX0NBU1QoX1NUQUNLICosIFNUQUNLX09GKE9QRU5TU0xfQkxPQ0spICosIHNrKSwgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tFRF9DQVNUKHN0YWNrX2NtcF9mdW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBpbnQgKCopKGNvbnN0IE9QRU5TU0xfQkxPQ0sgKiphLCBjb25zdCBPUEVOU1NMX0JMT0NLICoqYiksICBcCisgICAgICAgICAgICAgICAgICAgY29tcCkpKQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3RocmVhZC5jIGIvY3J5cHRvL3RocmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjOTkyNmMKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vdGhyZWFkLmMKQEAgLTAsMCArMSwxOTUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL3RocmVhZC5oPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC90eXBlX2NoZWNrLmg+CisKKy8qIGxvY2tfbmFtZXMgY29udGFpbnMgdGhlIG5hbWVzIG9mIGFsbCB0aGUgbG9ja3MgZGVmaW5lZCBpbiB0aHJlYWQuaC4gKi8KK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBsb2NrX25hbWVzW10gPSB7CisgICAgIjw8RVJST1I+PiIsICAgICJlcnIiLCAgICAgICAgICAiZXhfZGF0YSIsICAgICAgICJ4NTA5IiwKKyAgICAieDUwOV9pbmZvIiwgICAgIng1MDlfcGtleSIsICAgICJ4NTA5X2NybCIsICAgICAgIng1MDlfcmVxIiwKKyAgICAiZHNhIiwgICAgICAgICAgInJzYSIsICAgICAgICAgICJldnBfcGtleSIsICAgICAgIng1MDlfc3RvcmUiLAorICAgICJzc2xfY3R4IiwgICAgICAic3NsX2NlcnQiLCAgICAgInNzbF9zZXNzaW9uIiwgICAic3NsX3Nlc3NfY2VydCIsCisgICAgInNzbCIsICAgICAgICAgICJzc2xfbWV0aG9kIiwgICAicmFuZCIsICAgICAgICAgICJyYW5kMiIsCisgICAgImRlYnVnX21hbGxvYyIsICJCSU8iLCAgICAgICAgICAiZ2V0aG9zdGJ5bmFtZSIsICJnZXRzZXJ2YnluYW1lIiwKKyAgICAicmVhZGRpciIsICAgICAgIlJTQV9ibGluZGluZyIsICJkaCIsICAgICAgICAgICAgImRlYnVnX21hbGxvYzIiLAorICAgICJkc28iLCAgICAgICAgICAiZHlubG9jayIsICAgICAgImVuZ2luZSIsICAgICAgICAidWkiLAorICAgICJlY2RzYSIsICAgICAgICAiZWMiLCAgICAgICAgICAgImVjZGgiLCAgICAgICAgICAiYm4iLAorICAgICJlY19wcmVfY29tcCIsICAic3RvcmUiLCAgICAgICAgImNvbXAiLCAgICAgICAgICAiZmlwcyIsCisgICAgImZpcHMyIiwgICAgICAgICJvYmoiLAorfTsKKworT1BFTlNTTF9DT01QSUxFX0FTU0VSVChDUllQVE9fTlVNX0xPQ0tTID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobG9ja19uYW1lcykgLyBzaXplb2YobG9ja19uYW1lc1swXSksCisgICAgICAgICAgICAgICAgICAgICAgIENSWVBUT19OVU1fTE9DS1NfaW5jb25zaXN0ZW50KTsKKworc3RhdGljIHZvaWQgKCpsb2NraW5nX2NhbGxiYWNrKShpbnQgbW9kZSwgaW50IGxvY2tfbnVtLCBjb25zdCBjaGFyICpmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSkgPSAwOworc3RhdGljIGludCAoKmFkZF9sb2NrX2NhbGxiYWNrKShpbnQgKnBvaW50ZXIsIGludCBhbW91bnQsIGludCBsb2NrX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpID0gMDsKK3N0YXRpYyB2b2lkICgqdGhyZWFkaWRfY2FsbGJhY2spKENSWVBUT19USFJFQURJRCAqKSA9IDA7CisKKworaW50IENSWVBUT19udW1fbG9ja3Modm9pZCkgeyByZXR1cm4gQ1JZUFRPX05VTV9MT0NLUzsgfQorCit2b2lkIENSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjayh2b2lkICgqZnVuYykoaW50IG1vZGUsIGludCBsb2NrX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkpIHsKKyAgbG9ja2luZ19jYWxsYmFjayA9IGZ1bmM7Cit9CisKK3ZvaWQgQ1JZUFRPX3NldF9hZGRfbG9ja19jYWxsYmFjayhpbnQgKCpmdW5jKShpbnQgKm51bSwgaW50IG1vdW50LCBpbnQgbG9ja19udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpKSB7CisgIGFkZF9sb2NrX2NhbGxiYWNrID0gZnVuYzsKK30KKworY29uc3QgY2hhciAqQ1JZUFRPX2dldF9sb2NrX25hbWUoaW50IGxvY2tfbnVtKSB7CisgIGlmIChsb2NrX251bSA+PSAwICYmIGxvY2tfbnVtIDwgQ1JZUFRPX05VTV9MT0NLUykgeworICAgIHJldHVybiBsb2NrX25hbWVzW2xvY2tfbnVtXTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gIkVSUk9SIjsKKyAgfQorfQorCitpbnQgQ1JZUFRPX1RIUkVBRElEX3NldF9jYWxsYmFjayh2b2lkICgqZnVuYykoQ1JZUFRPX1RIUkVBRElEICopKSB7CisgIGlmICh0aHJlYWRpZF9jYWxsYmFjaykgeworICAgIHJldHVybiAwOworICB9CisgIHRocmVhZGlkX2NhbGxiYWNrID0gZnVuYzsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgQ1JZUFRPX1RIUkVBRElEX3NldF9udW1lcmljKENSWVBUT19USFJFQURJRCAqaWQsIHVuc2lnbmVkIGxvbmcgdmFsKSB7CisgIG1lbXNldChpZCwgMCwgc2l6ZW9mKCppZCkpOworICBpZC0+dmFsID0gdmFsOworfQorCit2b2lkIENSWVBUT19USFJFQURJRF9zZXRfcG9pbnRlcihDUllQVE9fVEhSRUFESUQgKmlkLCB2b2lkICpwdHIpIHsKKyAgbWVtc2V0KGlkLCAwLCBzaXplb2YoKmlkKSk7CisgIGlkLT5wdHIgPSBwdHI7Cit9CisKK3ZvaWQgKCpDUllQVE9fZ2V0X2xvY2tpbmdfY2FsbGJhY2sodm9pZCkpKGludCBtb2RlLCBpbnQgbG9ja19udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkgeworICByZXR1cm4gbG9ja2luZ19jYWxsYmFjazsKK30KKworaW50ICgqQ1JZUFRPX2dldF9hZGRfbG9ja19jYWxsYmFjayh2b2lkKSkoaW50ICpudW0sIGludCBtb3VudCwgaW50IGxvY2tfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpIHsKKyAgcmV0dXJuIGFkZF9sb2NrX2NhbGxiYWNrOworfQorCit2b2lkIENSWVBUT19sb2NrKGludCBtb2RlLCBpbnQgbG9ja19udW0sIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKSB7CisgIGlmIChsb2NraW5nX2NhbGxiYWNrICE9IE5VTEwpIHsKKyAgICBsb2NraW5nX2NhbGxiYWNrKG1vZGUsIGxvY2tfbnVtLCBmaWxlLCBsaW5lKTsKKyAgfQorfQorCitpbnQgQ1JZUFRPX2FkZF9sb2NrKGludCAqcG9pbnRlciwgaW50IGFtb3VudCwgaW50IGxvY2tfbnVtLCBjb25zdCBjaGFyICpmaWxlLAorICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSkgeworICBpbnQgcmV0ID0gMDsKKworICBpZiAoYWRkX2xvY2tfY2FsbGJhY2sgIT0gTlVMTCkgeworICAgIHJldCA9IGFkZF9sb2NrX2NhbGxiYWNrKHBvaW50ZXIsIGFtb3VudCwgbG9ja19udW0sIGZpbGUsIGxpbmUpOworICB9IGVsc2UgeworICAgIENSWVBUT19sb2NrKENSWVBUT19MT0NLIHwgQ1JZUFRPX1dSSVRFLCBsb2NrX251bSwgZmlsZSwgbGluZSk7CisgICAgcmV0ID0gKnBvaW50ZXIgKyBhbW91bnQ7CisgICAgKnBvaW50ZXIgPSByZXQ7CisgICAgQ1JZUFRPX2xvY2soQ1JZUFRPX1VOTE9DSyB8IENSWVBUT19XUklURSwgbG9ja19udW0sIGZpbGUsIGxpbmUpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKwordm9pZCBDUllQVE9fVEhSRUFESURfY3VycmVudChDUllQVE9fVEhSRUFESUQgKmlkKSB7CisgIGlmICh0aHJlYWRpZF9jYWxsYmFjaykgeworICAgIHRocmVhZGlkX2NhbGxiYWNrKGlkKTsKKyAgICByZXR1cm47CisgIH0KKworI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfV0lOMzIpCisgIENSWVBUT19USFJFQURJRF9zZXRfbnVtZXJpYyhpZCwgKHVuc2lnbmVkIGxvbmcpR2V0Q3VycmVudFRocmVhZElkKCkpOworI2Vsc2UKKyAgLyogRm9yIGV2ZXJ5dGhpbmcgZWxzZSwgZGVmYXVsdCB0byB1c2luZyB0aGUgYWRkcmVzcyBvZiAnZXJybm8nICovCisgIENSWVBUT19USFJFQURJRF9zZXRfcG9pbnRlcihpZCwgKHZvaWQgKikmZXJybm8pOworI2VuZGlmCit9CisKK2ludCBDUllQVE9fVEhSRUFESURfY21wKGNvbnN0IENSWVBUT19USFJFQURJRCAqYSwgY29uc3QgQ1JZUFRPX1RIUkVBRElEICpiKSB7CisgIHJldHVybiBtZW1jbXAoYSwgYiwgc2l6ZW9mKCphKSk7Cit9CisKK3ZvaWQgQ1JZUFRPX1RIUkVBRElEX2NweShDUllQVE9fVEhSRUFESUQgKmRlc3QsIGNvbnN0IENSWVBUT19USFJFQURJRCAqc3JjKSB7CisgIG1lbWNweShkZXN0LCBzcmMsIHNpemVvZigqc3JjKSk7Cit9CisKK3VpbnQzMl90IENSWVBUT19USFJFQURJRF9oYXNoKGNvbnN0IENSWVBUT19USFJFQURJRCAqaWQpIHsKKyAgcmV0dXJuIE9QRU5TU0xfaGFzaDMyKGlkLCBzaXplb2YoQ1JZUFRPX1RIUkVBRElEKSk7Cit9CisKK3ZvaWQgQ1JZUFRPX3NldF9pZF9jYWxsYmFjayh1bnNpZ25lZCBsb25nICgqZnVuYykodm9pZCkpIHt9CisKK3ZvaWQgQ1JZUFRPX3NldF9keW5sb2NrX2NyZWF0ZV9jYWxsYmFjayhzdHJ1Y3QgQ1JZUFRPX2R5bmxvY2tfdmFsdWUgKigKKyAgICAqZHluX2NyZWF0ZV9mdW5jdGlvbikoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpKSB7fQorCit2b2lkIENSWVBUT19zZXRfZHlubG9ja19sb2NrX2NhbGxiYWNrKHZvaWQgKCpkeW5fbG9ja19mdW5jdGlvbikoCisgICAgaW50IG1vZGUsIHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSAqbCwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpKSB7fQorCit2b2lkIENSWVBUT19zZXRfZHlubG9ja19kZXN0cm95X2NhbGxiYWNrKHZvaWQgKCpkeW5fZGVzdHJveV9mdW5jdGlvbikoCisgICAgc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlICpsLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkpIHt9CmRpZmYgLS1naXQgYS9jcnlwdG8vdGhyZWFkLmggYi9jcnlwdG8vdGhyZWFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYwNmYxZQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by90aHJlYWQuaApAQCAtMCwwICsxLDI3MCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2lmbmRlZiBPUEVOU1NMX0hFQURFUl9USFJFQURfSAorI2RlZmluZSBPUEVOU1NMX0hFQURFUl9USFJFQURfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9iYXNlLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBGdW5jdGlvbnMgdG8gc3VwcG9ydCBtdWx0aXRocmVhZGluZy4KKyAqCisgKiBPcGVuU1NMIGNhbiBzYWZlbHkgYmUgdXNlZCBpbiBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbnMgcHJvdmlkZWQgdGhhdCBhdAorICogbGVhc3QgdHdvIGNhbGxiYWNrIGZ1bmN0aW9ucyBhcmUgc2V0IHdpdGggfENSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFja3wgYW5kCisgKiB8Q1JZUFRPX1RIUkVBRElEX3NldF9jYWxsYmFja3wuCisgKgorICogVGhlIGxvY2tpbmcgY2FsbGJhY2sgcGVyZm9ybXMgbXV0dWFsIGV4Y2x1c2lvbi4gUmF0aGVyIHRoYW4gdXNpbmcgYSBzaW5nbGUKKyAqIGxvY2sgZm9yIGFsbCwgc2hhcmVkIGRhdGEtc3RydWN0dXJlcywgT3BlblNTTCByZXF1aXJlcyB0aGF0IHRoZSBsb2NraW5nCisgKiBjYWxsYmFjayBzdXBwb3J0IGEgZml4ZWQgKGF0IHJ1bi10aW1lKSBudW1iZXIgb2YgZGlmZmVyZW50IGxvY2tzLCBnaXZlbiBieQorICogfENSWVBUT19udW1fbG9ja3N8LgorICoKKyAqIFRoZSB0aHJlYWQgSUQgY2FsbGJhY2sgaXMgY2FsbGVkIHRvIHJlY29yZCB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyB0aHJlYWQncworICogaWRlbnRpZmllciBpbiBhIHxDUllQVE9fVEhSRUFESUR8IHN0cnVjdHVyZS4gSWYgdGhpcyBjYWxsYmFjayBpcyBub3QKKyAqIHByb3ZpZGVkIHRoZW4gdGhlIGFkZHJlc3Mgb2YgfGVycm5vfCBpcyB1c2VkIGFzIHRoZSB0aHJlYWQgaWRlbnRpZmllci4gVGhpcworICogaXMgc3VmZmljaWVudCBvbmx5IGlmIHRoZSBzeXN0ZW0gaGFzIGEgdGhyZWFkLWxvY2FsIHxlcnJub3wgdmFsdWUuICovCisKKworLyogQ1JZUFRPX251bV9sb2NrcyByZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3RhdGljIGxvY2tzIHRoYXQgdGhlIGNhbGxiYWNrCisgKiBmdW5jdGlvbiBwYXNzZWQgdG8gfENSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFja3wgbXVzdCBiZSBhYmxlIHRvIGhhbmRsZS4gKi8KK2ludCBDUllQVE9fbnVtX2xvY2tzKHZvaWQpOworCisvKiBDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2sgc2V0cyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyBsb2NraW5nCisgKiBvbiBiZWhhbGYgb2YgT3BlblNTTC4gVGhlIGNhbGxiYWNrIGlzIGNhbGxlZCB3aGVuZXZlciBPcGVuU1NMIG5lZWRzIHRvIGxvY2sKKyAqIG9yIHVubG9jayBhIGxvY2ssIGFuZCBsb2NrcyBhcmUgc3BlY2lmaWVkIGFzIGEgbnVtYmVyIGJldHdlZW4gemVybyBhbmQKKyAqIHxDUllQVE9fbnVtX2xvY2tzKCktMXwuCisgKgorICogVGhlIG1vZGUgYXJndW1lbnQgdG8gdGhlIGNhbGxiYWNrIGlzIGEgYml0d2lzZS1PUiBvZiBlaXRoZXIgQ1JZUFRPX0xPQ0sgb3IKKyAqIENSWVBUT19VTkxPQ0ssIHRvIGRlbm90ZSB0aGUgYWN0aW9uLCBhbmQgQ1JZUFRPX1JFQUQgb3IgQ1JZUFRPX1dSSVRFLCB0bworICogaW5kaWNhdGUgdGhlIHR5cGUgb2YgbG9jay4gVGhlIHxmaWxlfCBhbmQgfGxpbmV8IGFyZ3VtZW50cyBnaXZlIHRoZSBsb2NhdGlvbgorICogaW4gdGhlIE9wZW5TU0wgc291cmNlIHdoZXJlIHRoZSBsb2NraW5nIGFjdGlvbiBvcmlnaW5hdGVkLiAqLwordm9pZCBDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2sodm9pZCAoKmZ1bmMpKGludCBtb2RlLCBpbnQgbG9ja19udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpKTsKKworLyogQ1JZUFRPX3NldF9hZGRfbG9ja19jYWxsYmFjayBzZXRzIGFuIG9wdGlvbmFsIGNhbGxiYWNrIHdoaWNoIGlzIHVzZWQgd2hlbgorICogT3BlblNTTCBuZWVkcyB0byBhZGQgYSBmaXhlZCBhbW91bnQgdG8gYW4gaW50ZWdlci4gRm9yIGV4YW1wbGUsIHRoaXMgaXMgdXNlZAorICogd2hlbiBtYWludGFpbmluZyByZWZlcmVuY2UgY291bnRzLiBOb3JtYWxseSB0aGUgcmVmZXJlbmNlIGNvdW50cyBhcmUKKyAqIG1haW50YWluZWQgYnkgcGVyZm9ybWluZyB0aGUgYWRkaXRpb24gdW5kZXIgYSBsb2NrIGJ1dCwgaWYgdGhpcyBjYWxsYmFjaworICogaGFzIGJlZW4gc2V0LCB0aGUgYXBwbGljYXRpb24gaXMgZnJlZSB0byBpbXBsZW1lbnQgdGhlIG9wZXJhdGlvbiB1c2luZworICogZmFzdGVyIG1ldGhvZHMgKGkuZS4gYXRvbWljIG9wZXJhdGlvbnMpLgorICoKKyAqIFRoZSBjYWxsYmFjayBpcyBnaXZlbiBhIHBvaW50ZXIgdG8gdGhlIGludGVnZXIgdG8gYmUgYWx0ZXJlZCAofG51bXwpLCB0aGUKKyAqIGFtb3VudCB0byBhZGQgdG8gdGhlIGludGVnZXIgKHxhbW91bnR8LCB3aGljaCBtYXkgYmUgbmVnYXRpdmUpLCB0aGUgbnVtYmVyCisgKiBvZiB0aGUgbG9jayB3aGljaCB3b3VsZCBoYXZlIGJlZW4gdGFrZW4gdG8gcHJvdGVjdCB0aGUgb3BlcmF0aW9uIGFuZCB0aGUKKyAqIHBvc2l0aW9uIGluIHRoZSBPcGVuU1NMIGNvZGUgd2hlcmUgdGhlIG9wZXJhdGlvbiBvcmlnaW5hdGVkLiAqLwordm9pZCBDUllQVE9fc2V0X2FkZF9sb2NrX2NhbGxiYWNrKGludCAoKmZ1bmMpKGludCAqbnVtLCBpbnQgYW1vdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2NrX251bSwgY29uc3QgY2hhciAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSkpOworCisvKiBDUllQVE9fZ2V0X2xvY2tfbmFtZSByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBsb2NrIGdpdmVuIGJ5IHxsb2NrX251bXwuIFRoaXMKKyAqIGNhbiBiZSB1c2VkIGluIGEgbG9ja2luZyBjYWxsYmFjayBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLiAqLworY29uc3QgY2hhciAqQ1JZUFRPX2dldF9sb2NrX25hbWUoaW50IGxvY2tfbnVtKTsKKworCisvKiBDUllQVE9fVEhSRUFESUQgaWRlbnRpZmllcyBhIHRocmVhZCBpbiBhIG11bHRpdGhyZWFkZWQgcHJvZ3JhbS4gVGhpcworICogc3RydWN0dXJlIHNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseS4gUmF0aGVyIGFwcGxpY2F0aW9ucyBzaG91bGQgdXNlCisgKiB8Q1JZUFRPX1RIUkVBRElEX3NldF9udW1lcmljfCBhbmQgfENSWVBUT19USFJFQURJRF9zZXRfcG9pbnRlcnwuICovCit0eXBlZGVmIHN0cnVjdCBjcnlwdG9fdGhyZWFkaWRfc3QgeworICB2b2lkICpwdHI7CisgIHVuc2lnbmVkIGxvbmcgdmFsOworfSBDUllQVE9fVEhSRUFESUQ7CisKKy8qIENSWVBUT19USFJFQURJRF9zZXRfY2FsbGJhY2sgc2V0cyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgc3RvcmVzIGFuCisgKiBpZGVudGlmaWVyIG9mIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHRocmVhZCBpbnRvIHx0aHJlYWRpZHwuIFRoZQorICogQ1JZUFRPX1RIUkVBRElEIHN0cnVjdHVyZSBzaG91bGQgbm90IGJlIGFjY2Vzc2VkIGRpcmVjdGx5LiBSYXRoZXIgb25lIG9mCisgKiB8Q1JZUFRPX1RIUkVBRElEX3NldF9udW1lcmljfCBvciB8Q1JZUFRPX1RIUkVBRElEX3NldF9wb2ludGVyfCBzaG91bGQgYmUKKyAqIHVzZWQgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhyZWFkIElEcyBhcmUgbnVtYmVycyBvciBwb2ludGVycyBvbiB0aGUgaG9zdAorICogc3lzdGVtLiAqLworaW50IENSWVBUT19USFJFQURJRF9zZXRfY2FsbGJhY2soCisgICAgdm9pZCAoKnRocmVhZGlkX2Z1bmMpKENSWVBUT19USFJFQURJRCAqdGhyZWFkaWQpKTsKKwordm9pZCBDUllQVE9fVEhSRUFESURfc2V0X251bWVyaWMoQ1JZUFRPX1RIUkVBRElEICppZCwgdW5zaWduZWQgbG9uZyB2YWwpOwordm9pZCBDUllQVE9fVEhSRUFESURfc2V0X3BvaW50ZXIoQ1JZUFRPX1RIUkVBRElEICppZCwgdm9pZCAqcHRyKTsKKworCisvKiBQcml2YXRlIGZ1bmN0aW9uczogKi8KKworLyogQ1JZUFRPX2dldF9sb2NraW5nX2NhbGxiYWNrIHJldHVybnMgdGhlIGNhbGxiYWNrLCBpZiBhbnksIHRoYXQgd2FzIG1vc3QKKyAqIHJlY2VudGx5IHNldCB1c2luZyB8Q1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrfC4gKi8KK3ZvaWQgKCpDUllQVE9fZ2V0X2xvY2tpbmdfY2FsbGJhY2sodm9pZCkpKGludCBtb2RlLCBpbnQgbG9ja19udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSk7CisKKy8qIENSWVBUT19nZXRfYWRkX2xvY2tfY2FsbGJhY2sgcmV0dXJucyB0aGUgY2FsbGJhY2ssIGlmIGFueSwgdGhhdCB3YXMgbW9zdAorICogcmVjZW50bHkgc2V0IHVzaW5nIHxDUllQVE9fc2V0X2FkZF9sb2NrX2NhbGxiYWNrfC4gKi8KK2ludCAoKkNSWVBUT19nZXRfYWRkX2xvY2tfY2FsbGJhY2sodm9pZCkpKGludCAqbnVtLCBpbnQgYW1vdW50LCBpbnQgbG9ja19udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSk7CisKKy8qIENSWVBUT19sb2NrIGxvY2tzIG9yIHVubG9ja3MgdGhlIGxvY2sgc3BlY2lmaWVkIGJ5IHxsb2NrX251bXwgKG9uZSBvZgorICogfENSWVBUT19MT0NLXyp8KS4gRG9uJ3QgY2FsbCB0aGlzIGRpcmVjdGx5LCByYXRoZXIgdXNlIG9uZSBvZiB0aGUKKyAqIENSWVBUT19bcnddXyh1bilsb2NrIG1hY3Jvcy4gKi8KK3ZvaWQgQ1JZUFRPX2xvY2soaW50IG1vZGUsIGludCBsb2NrX251bSwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpOworCisvKiBDUllQVE9fYWRkX2xvY2sgYWRkcyB8YW1vdW50fCB0byB8KnBvaW50ZXJ8LCBwcm90ZWN0ZWQgYnkgdGhlIGxvY2sgc3BlY2lmaWVkCisgKiBieSB8bG9ja19udW18LiBJdCByZXR1cm5zIHRoZSBuZXcgdmFsdWUgb2YgfCpwb2ludGVyfC4gRG9uJ3QgY2FsbCB0aGlzCisgKiBmdW5jdGlvbiBkaXJlY3RseSwgcmF0aGVyIHVzZSB0aGUgfENSWVBUT19hZGRfbG9ja3wgbWFjcm8uCisgKgorICogVE9ETyhmb3JrKTogcmVuYW1lIHRvIENSWVBUT19hZGRfbG9ja2VkLiAqLworaW50IENSWVBUT19hZGRfbG9jayhpbnQgKnBvaW50ZXIsIGludCBhbW91bnQsIGludCBsb2NrX251bSwgY29uc3QgY2hhciAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUpOworCisKKy8qIENSWVBUT19USFJFQURJRF9jdXJyZW50IHN0b3JlcyB0aGUgY3VycmVudCB0aHJlYWQgaWRlbnRpZmllciBpbiB8aWR8LiAqLwordm9pZCBDUllQVE9fVEhSRUFESURfY3VycmVudChDUllQVE9fVEhSRUFESUQgKmlkKTsKKworLyogQ1JZUFRPX1RIUkVBRElEX2NtcCByZXR1cm5zIDwgMCwgMCBvciA+IDAgaWYgfGF8IGlzIGxlc3MgdGhhbiwgZXF1YWwgdG8gb3IKKyAqIGdyZWF0ZXIgdGhhbiB8YnwsIHJlc3BlY3RpdmVseS4gKi8KK2ludCBDUllQVE9fVEhSRUFESURfY21wKGNvbnN0IENSWVBUT19USFJFQURJRCAqYSwgY29uc3QgQ1JZUFRPX1RIUkVBRElEICpiKTsKKworLyogQ1JZUFRPX1RIUkVBRElEX2NweSBzZXRzIHwqZGVzdHwgZXF1YWwgdG8gfCpzcmN8LiAqLwordm9pZCBDUllQVE9fVEhSRUFESURfY3B5KENSWVBUT19USFJFQURJRCAqZGVzdCwgY29uc3QgQ1JZUFRPX1RIUkVBRElEICpzcmMpOworCisvKiBDUllQVE9fVEhSRUFESURfaGFzaCByZXR1cm5zIGEgaGFzaCBvZiB0aGUgbnVtZXJpYyB2YWx1ZSBvZiB8aWR8LiAqLwordWludDMyX3QgQ1JZUFRPX1RIUkVBRElEX2hhc2goY29uc3QgQ1JZUFRPX1RIUkVBRElEICppZCk7CisKKy8qIFRoZXNlIGFyZSB0aGUgbG9ja3MgdXNlZCBieSBPcGVuU1NMLiBUaGVzZSB2YWx1ZXMgc2hvdWxkIG1hdGNoIHVwIHdpdGggdGhlCisgKiB0YWJsZSBpbiB0aHJlYWQuYy4gKi8KKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfRVJSIDEKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfRVhfREFUQSAyCisjZGVmaW5lIENSWVBUT19MT0NLX1g1MDkgMworI2RlZmluZSBDUllQVE9fTE9DS19YNTA5X0lORk8gNAorI2RlZmluZSBDUllQVE9fTE9DS19YNTA5X1BLRVkgNQorI2RlZmluZSBDUllQVE9fTE9DS19YNTA5X0NSTCA2CisjZGVmaW5lIENSWVBUT19MT0NLX1g1MDlfUkVRIDcKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfRFNBIDgKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfUlNBIDkKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfRVZQX1BLRVkgMTAKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfWDUwOV9TVE9SRSAxMQorI2RlZmluZSBDUllQVE9fTE9DS19TU0xfQ1RYIDEyCisjZGVmaW5lIENSWVBUT19MT0NLX1NTTF9DRVJUIDEzCisjZGVmaW5lIENSWVBUT19MT0NLX1NTTF9TRVNTSU9OIDE0CisjZGVmaW5lIENSWVBUT19MT0NLX1NTTF9TRVNTX0NFUlQgMTUKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfU1NMIDE2CisjZGVmaW5lIENSWVBUT19MT0NLX1NTTF9NRVRIT0QgMTcKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfUkFORCAxOAorI2RlZmluZSBDUllQVE9fTE9DS19SQU5EMiAxOQorI2RlZmluZSBDUllQVE9fTE9DS19NQUxMT0MgMjAKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfQklPIDIxCisjZGVmaW5lIENSWVBUT19MT0NLX0dFVEhPU1RCWU5BTUUgMjIKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfR0VUU0VSVkJZTkFNRSAyMworI2RlZmluZSBDUllQVE9fTE9DS19SRUFERElSIDI0CisjZGVmaW5lIENSWVBUT19MT0NLX1JTQV9CTElORElORyAyNQorI2RlZmluZSBDUllQVE9fTE9DS19ESCAyNgorI2RlZmluZSBDUllQVE9fTE9DS19NQUxMT0MyIDI3CisjZGVmaW5lIENSWVBUT19MT0NLX0RTTyAyOAorI2RlZmluZSBDUllQVE9fTE9DS19EWU5MT0NLIDI5CisjZGVmaW5lIENSWVBUT19MT0NLX0VOR0lORSAzMAorI2RlZmluZSBDUllQVE9fTE9DS19VSSAzMQorI2RlZmluZSBDUllQVE9fTE9DS19FQ0RTQSAzMgorI2RlZmluZSBDUllQVE9fTE9DS19FQyAzMworI2RlZmluZSBDUllQVE9fTE9DS19FQ0RIIDM0CisjZGVmaW5lIENSWVBUT19MT0NLX0JOIDM1CisjZGVmaW5lIENSWVBUT19MT0NLX0VDX1BSRV9DT01QIDM2CisjZGVmaW5lIENSWVBUT19MT0NLX1NUT1JFIDM3CisjZGVmaW5lIENSWVBUT19MT0NLX0NPTVAgMzgKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfRklQUyAzOQorI2RlZmluZSBDUllQVE9fTE9DS19GSVBTMiA0MAorI2RlZmluZSBDUllQVE9fTE9DS19PQkogNDAKKyNkZWZpbmUgQ1JZUFRPX05VTV9MT0NLUyA0MgorCisjZGVmaW5lIENSWVBUT19MT0NLIDEKKyNkZWZpbmUgQ1JZUFRPX1VOTE9DSyAyCisjZGVmaW5lIENSWVBUT19SRUFEIDQKKyNkZWZpbmUgQ1JZUFRPX1dSSVRFIDgKKworI2RlZmluZSBDUllQVE9fd19sb2NrKGxvY2tfbnVtKSBcCisgIENSWVBUT19sb2NrKENSWVBUT19MT0NLIHwgQ1JZUFRPX1dSSVRFLCBsb2NrX251bSwgX19GSUxFX18sIF9fTElORV9fKQorI2RlZmluZSBDUllQVE9fd191bmxvY2sobG9ja19udW0pIFwKKyAgQ1JZUFRPX2xvY2soQ1JZUFRPX1VOTE9DSyB8IENSWVBUT19XUklURSwgbG9ja19udW0sIF9fRklMRV9fLCBfX0xJTkVfXykKKyNkZWZpbmUgQ1JZUFRPX3JfbG9jayhsb2NrX251bSkgXAorICBDUllQVE9fbG9jayhDUllQVE9fTE9DSyB8IENSWVBUT19SRUFELCBsb2NrX251bSwgX19GSUxFX18sIF9fTElORV9fKQorI2RlZmluZSBDUllQVE9fcl91bmxvY2sobG9ja19udW0pIFwKKyAgQ1JZUFRPX2xvY2soQ1JZUFRPX1VOTE9DSyB8IENSWVBUT19SRUFELCBsb2NrX251bSwgX19GSUxFX18sIF9fTElORV9fKQorI2RlZmluZSBDUllQVE9fYWRkKGFkZHIsIGFtb3VudCwgbG9ja19udW0pIFwKKyAgQ1JZUFRPX2FkZF9sb2NrKGFkZHIsIGFtb3VudCwgbG9ja19udW0sIF9fRklMRV9fLCBfX0xJTkVfXykKKworCisvKiBQcml2YXRlIGZ1bmN0aW9ucy4KKyAqCisgKiBTb21lIG9sZCBjb2RlIGNhbGxzIHRoZXNlIGZ1bmN0aW9ucyBhbmQgc28gbm8tb3AgaW1wbGVtZW50YXRpb25zIGFyZQorICogcHJvdmlkZWQuCisgKgorICogVE9ETyhmb3JrKTogY2xlYW51cCBjYWxsZXJzIGFuZCByZW1vdmUuICovCisKK3ZvaWQgQ1JZUFRPX3NldF9pZF9jYWxsYmFjayh1bnNpZ25lZCBsb25nICgqZnVuYykodm9pZCkpOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCByZWZlcmVuY2VzOworICBzdHJ1Y3QgQ1JZUFRPX2R5bmxvY2tfdmFsdWUgKmRhdGE7Cit9IENSWVBUT19keW5sb2NrOworCit2b2lkIENSWVBUT19zZXRfZHlubG9ja19jcmVhdGVfY2FsbGJhY2soc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlICooCisgICAgKmR5bl9jcmVhdGVfZnVuY3Rpb24pKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKSk7CisKK3ZvaWQgQ1JZUFRPX3NldF9keW5sb2NrX2xvY2tfY2FsbGJhY2sodm9pZCAoKmR5bl9sb2NrX2Z1bmN0aW9uKSgKKyAgICBpbnQgbW9kZSwgc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlICpsLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkpOworCit2b2lkIENSWVBUT19zZXRfZHlubG9ja19kZXN0cm95X2NhbGxiYWNrKHZvaWQgKCpkeW5fZGVzdHJveV9mdW5jdGlvbikoCisgICAgc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlICpsLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkpOworCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfSAgLyogZXh0ZXJuIEMgKi8KKyNlbmRpZgorCisjZW5kaWYgIC8qIE9QRU5TU0xfSEVBREVSX1RIUkVBRF9IICovCmRpZmYgLS1naXQgYS9jcnlwdG8vdGltZV9zdXBwb3J0LmMgYi9jcnlwdG8vdGltZV9zdXBwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM2ZTljMAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by90aW1lX3N1cHBvcnQuYwpAQCAtMCwwICsxLDE5OCBAQAorLyogV3JpdHRlbiBieSBSaWNoYXJkIExldml0dGUgKHJpY2hhcmRAbGV2aXR0ZS5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDAxLgorICogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDguCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisjZGVmaW5lIF9CU0RfU09VUkNFIC8qIGZvciBnbXRpbWVfciAqLworCisjaW5jbHVkZSA8b3BlbnNzbC90aW1lX3N1cHBvcnQuaD4KKworI2RlZmluZSBTRUNTX1BFUl9EQVkgKDI0ICogNjAgKiA2MCkKKworc3RydWN0IHRtICpPUEVOU1NMX2dtdGltZShjb25zdCB0aW1lX3QgKnRpbWUsIHN0cnVjdCB0bSAqcmVzdWx0KSB7CisjaWYgZGVmaW5lZChPUEVOU1NMX1dJTkRPV1MpCisgIGlmIChfZ210aW1lX3MocmVzdWx0LCB0aW1lKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiByZXN1bHQ7CisjZWxzZQorICByZXR1cm4gZ210aW1lX3IodGltZSwgcmVzdWx0KTsKKyNlbmRpZgorfQorCisvKiBDb252ZXJ0IGRhdGUgdG8gYW5kIGZyb20ganVsaWFuIGRheSBVc2VzIEZsaWVnZWwgJiBWYW4gRmxhbmRlcm4gYWxnb3JpdGhtICovCitzdGF0aWMgbG9uZyBkYXRlX3RvX2p1bGlhbihpbnQgeSwgaW50IG0sIGludCBkKSB7CisgIHJldHVybiAoMTQ2MSAqICh5ICsgNDgwMCArIChtIC0gMTQpIC8gMTIpKSAvIDQgKworICAgICAgICAgKDM2NyAqIChtIC0gMiAtIDEyICogKChtIC0gMTQpIC8gMTIpKSkgLyAxMiAtCisgICAgICAgICAoMyAqICgoeSArIDQ5MDAgKyAobSAtIDE0KSAvIDEyKSAvIDEwMCkpIC8gNCArIGQgLSAzMjA3NTsKK30KKworc3RhdGljIHZvaWQganVsaWFuX3RvX2RhdGUobG9uZyBqZCwgaW50ICp5LCBpbnQgKm0sIGludCAqZCkgeworICBsb25nIEwgPSBqZCArIDY4NTY5OworICBsb25nIG4gPSAoNCAqIEwpIC8gMTQ2MDk3OworICBsb25nIGksIGo7CisKKyAgTCA9IEwgLSAoMTQ2MDk3ICogbiArIDMpIC8gNDsKKyAgaSA9ICg0MDAwICogKEwgKyAxKSkgLyAxNDYxMDAxOworICBMID0gTCAtICgxNDYxICogaSkgLyA0ICsgMzE7CisgIGogPSAoODAgKiBMKSAvIDI0NDc7CisgICpkID0gTCAtICgyNDQ3ICogaikgLyA4MDsKKyAgTCA9IGogLyAxMTsKKyAgKm0gPSBqICsgMiAtICgxMiAqIEwpOworICAqeSA9IDEwMCAqIChuIC0gNDkpICsgaSArIEw7Cit9CisKKy8qIENvbnZlcnQgdG0gc3RydWN0dXJlIGFuZCBvZmZzZXQgaW50byBqdWxpYW4gZGF5IGFuZCBzZWNvbmRzICovCitzdGF0aWMgaW50IGp1bGlhbl9hZGooY29uc3Qgc3RydWN0IHRtICp0bSwgaW50IG9mZl9kYXksIGxvbmcgb2Zmc2V0X3NlYywKKyAgICAgICAgICAgICAgICAgICAgICBsb25nICpwZGF5LCBpbnQgKnBzZWMpIHsKKyAgaW50IG9mZnNldF9obXMsIG9mZnNldF9kYXk7CisgIGxvbmcgdGltZV9qZDsKKyAgaW50IHRpbWVfeWVhciwgdGltZV9tb250aCwgdGltZV9kYXk7CisgIC8qIHNwbGl0IG9mZnNldCBpbnRvIGRheXMgYW5kIGRheSBzZWNvbmRzICovCisgIG9mZnNldF9kYXkgPSBvZmZzZXRfc2VjIC8gU0VDU19QRVJfREFZOworICAvKiBBdm9pZCBzaWduIGlzc3VlcyB3aXRoICUgb3BlcmF0b3IgKi8KKyAgb2Zmc2V0X2htcyA9IG9mZnNldF9zZWMgLSAob2Zmc2V0X2RheSAqIFNFQ1NfUEVSX0RBWSk7CisgIG9mZnNldF9kYXkgKz0gb2ZmX2RheTsKKyAgLyogQWRkIGN1cnJlbnQgdGltZSBzZWNvbmRzIHRvIG9mZnNldCAqLworICBvZmZzZXRfaG1zICs9IHRtLT50bV9ob3VyICogMzYwMCArIHRtLT50bV9taW4gKiA2MCArIHRtLT50bV9zZWM7CisgIC8qIEFkanVzdCBkYXkgc2Vjb25kcyBpZiBvdmVyZmxvdyAqLworICBpZiAob2Zmc2V0X2htcyA+PSBTRUNTX1BFUl9EQVkpIHsKKyAgICBvZmZzZXRfZGF5Kys7CisgICAgb2Zmc2V0X2htcyAtPSBTRUNTX1BFUl9EQVk7CisgIH0gZWxzZSBpZiAob2Zmc2V0X2htcyA8IDApIHsKKyAgICBvZmZzZXRfZGF5LS07CisgICAgb2Zmc2V0X2htcyArPSBTRUNTX1BFUl9EQVk7CisgIH0KKworICAvKiBDb252ZXJ0IGRhdGUgb2YgdGltZSBzdHJ1Y3R1cmUgaW50byBhIEp1bGlhbiBkYXkgbnVtYmVyLiAqLworCisgIHRpbWVfeWVhciA9IHRtLT50bV95ZWFyICsgMTkwMDsKKyAgdGltZV9tb250aCA9IHRtLT50bV9tb24gKyAxOworICB0aW1lX2RheSA9IHRtLT50bV9tZGF5OworCisgIHRpbWVfamQgPSBkYXRlX3RvX2p1bGlhbih0aW1lX3llYXIsIHRpbWVfbW9udGgsIHRpbWVfZGF5KTsKKworICAvKiBXb3JrIG91dCBKdWxpYW4gZGF5IG9mIG5ldyBkYXRlICovCisgIHRpbWVfamQgKz0gb2Zmc2V0X2RheTsKKworICBpZiAodGltZV9qZCA8IDApCisgICAgcmV0dXJuIDA7CisKKyAgKnBkYXkgPSB0aW1lX2pkOworICAqcHNlYyA9IG9mZnNldF9obXM7CisgIHJldHVybiAxOworfQorCitpbnQgT1BFTlNTTF9nbXRpbWVfYWRqKHN0cnVjdCB0bSAqdG0sIGludCBvZmZfZGF5LCBsb25nIG9mZnNldF9zZWMpIHsKKyAgaW50IHRpbWVfc2VjLCB0aW1lX3llYXIsIHRpbWVfbW9udGgsIHRpbWVfZGF5OworICBsb25nIHRpbWVfamQ7CisKKyAgLyogQ29udmVydCB0aW1lIGFuZCBvZmZzZXQgaW50byBqdWxpYW4gZGF5IGFuZCBzZWNvbmRzICovCisgIGlmICghanVsaWFuX2Fkaih0bSwgb2ZmX2RheSwgb2Zmc2V0X3NlYywgJnRpbWVfamQsICZ0aW1lX3NlYykpCisgICAgcmV0dXJuIDA7CisKKyAgLyogQ29udmVydCBKdWxpYW4gZGF5IGJhY2sgdG8gZGF0ZSAqLworCisgIGp1bGlhbl90b19kYXRlKHRpbWVfamQsICZ0aW1lX3llYXIsICZ0aW1lX21vbnRoLCAmdGltZV9kYXkpOworCisgIGlmICh0aW1lX3llYXIgPCAxOTAwIHx8IHRpbWVfeWVhciA+IDk5OTkpCisgICAgcmV0dXJuIDA7CisKKyAgLyogVXBkYXRlIHRtIHN0cnVjdHVyZSAqLworCisgIHRtLT50bV95ZWFyID0gdGltZV95ZWFyIC0gMTkwMDsKKyAgdG0tPnRtX21vbiA9IHRpbWVfbW9udGggLSAxOworICB0bS0+dG1fbWRheSA9IHRpbWVfZGF5OworCisgIHRtLT50bV9ob3VyID0gdGltZV9zZWMgLyAzNjAwOworICB0bS0+dG1fbWluID0gKHRpbWVfc2VjIC8gNjApICUgNjA7CisgIHRtLT50bV9zZWMgPSB0aW1lX3NlYyAlIDYwOworCisgIHJldHVybiAxOworfQorCitpbnQgT1BFTlNTTF9nbXRpbWVfZGlmZihpbnQgKnBkYXksIGludCAqcHNlYywgY29uc3Qgc3RydWN0IHRtICpmcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRtICp0bykgeworICBpbnQgZnJvbV9zZWMsIHRvX3NlYywgZGlmZl9zZWM7CisgIGxvbmcgZnJvbV9qZCwgdG9famQsIGRpZmZfZGF5OworCisgIGlmICghanVsaWFuX2Fkaihmcm9tLCAwLCAwLCAmZnJvbV9qZCwgJmZyb21fc2VjKSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmICghanVsaWFuX2Fkaih0bywgMCwgMCwgJnRvX2pkLCAmdG9fc2VjKSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgZGlmZl9kYXkgPSB0b19qZCAtIGZyb21famQ7CisgIGRpZmZfc2VjID0gdG9fc2VjIC0gZnJvbV9zZWM7CisgIC8qIEFkanVzdCBkaWZmZXJlbmNlcyBzbyBib3RoIHBvc2l0aXZlIG9yIGJvdGggbmVnYXRpdmUgKi8KKyAgaWYgKGRpZmZfZGF5ID4gMCAmJiBkaWZmX3NlYyA8IDApIHsKKyAgICBkaWZmX2RheS0tOworICAgIGRpZmZfc2VjICs9IFNFQ1NfUEVSX0RBWTsKKyAgfQorICBpZiAoZGlmZl9kYXkgPCAwICYmIGRpZmZfc2VjID4gMCkgeworICAgIGRpZmZfZGF5Kys7CisgICAgZGlmZl9zZWMgLT0gU0VDU19QRVJfREFZOworICB9CisKKyAgaWYgKHBkYXkpIHsKKyAgICAqcGRheSA9IChpbnQpZGlmZl9kYXk7CisgIH0KKyAgaWYgKHBzZWMpIHsKKyAgICAqcHNlYyA9IGRpZmZfc2VjOworICB9CisKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vdGltZV9zdXBwb3J0LmggYi9jcnlwdG8vdGltZV9zdXBwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUxYzY5MQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by90aW1lX3N1cHBvcnQuaApAQCAtMCwwICsxLDg4IEBACisvKiBXcml0dGVuIGJ5IFJpY2hhcmQgTGV2aXR0ZSAocmljaGFyZEBsZXZpdHRlLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDEuCisgKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwOC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuICovCisKKyNpZm5kZWYgT1BFTlNTTF9IRUFERVJfVElNRV9ICisjZGVmaW5lIE9QRU5TU0xfSEVBREVSX1RJTUVfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9iYXNlLmg+CisKKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBPUEVOU1NMX2dtdGltZSB3cmFwcyB8Z210aW1lX3J8LiBTZWUgdGhlIG1hbnVhbCBwYWdlIGZvciB0aGF0IGZ1bmN0aW9uLiAqLworc3RydWN0IHRtICpPUEVOU1NMX2dtdGltZShjb25zdCB0aW1lX3QgKnRpbWVyLCBzdHJ1Y3QgdG0gKnJlc3VsdCk7CisKKy8qIE9QRU5TU0xfZ210aW1lX2FkaiB1cGRhdGVzIHx0bXwgYnkgYWRkaW5nIHxvZmZzZXRfZGF5fCBkYXlzIGFuZCB8b2Zmc2V0X3NlY3wKKyAqIHNlY29uZHMuICovCitpbnQgT1BFTlNTTF9nbXRpbWVfYWRqKHN0cnVjdCB0bSAqdG0sIGludCBvZmZzZXRfZGF5LCBsb25nIG9mZnNldF9zZWMpOworCisvKiBPUEVOU1NMX2dtdGltZV9kaWZmIGNhbGN1bGF0ZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB8ZnJvbXwgYW5kIHx0b3wgYW5kCisgKiBvdXRwdXRzIHRoZSBkaWZmZXJlbmNlIGFzIGEgbnVtYmVyIG9mIGRheXMgYW5kIHNlY29uZHMgaW4gfCpvdXRfZGF5c3wgYW5kCisgKiB8Km91dF9zZWNzfC4gKi8KK2ludCBPUEVOU1NMX2dtdGltZV9kaWZmKGludCAqb3V0X2RheXMsIGludCAqb3V0X3NlY3MsIGNvbnN0IHN0cnVjdCB0bSAqZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0bSAqdG8pOworCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfSAgLyogZXh0ZXJuIEMgKi8KKyNlbmRpZgorCisjZW5kaWYgIC8qIE9QRU5TU0xfSEVBREVSX1RJTUVfSCAqLwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3R5cGVfY2hlY2suaCBiL2NyeXB0by90eXBlX2NoZWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ1OTE1MQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by90eXBlX2NoZWNrLmgKQEAgLTAsMCArMSw4NyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2lmbmRlZiBPUEVOU1NMX0hFQURFUl9UWVBFX0NIRUNLX0gKKyNkZWZpbmUgT1BFTlNTTF9IRUFERVJfVFlQRV9DSEVDS19ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jhc2UuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIFRoaXMgaGVhZGVyIGZpbGUgY29udGFpbnMgc29tZSBjb21tb24gbWFjcm9zIGZvciBlbmZvcmNpbmcgdHlwZSBjaGVja2luZy4KKyAqIFNldmVyYWwsIGNvbW1vbiBPcGVuU1NMIHN0cnVjdHVyZXMgKGkuZS4gc3RhY2sgYW5kIGxoYXNoKSBvcGVyYXRlIG9uIHZvaWQKKyAqIHBvaW50ZXJzLCBidXQgd2Ugd2lzaCB0byBoYXZlIHR5cGUgY2hlY2tpbmcgd2hlbiB0aGV5IGFyZSB1c2VkIHdpdGggYQorICogc3BlY2lmaWMgdHlwZS4gKi8KKworLyogQ0hFQ0tFRF9DQVNUIGNhc3RzIHxwfCBmcm9tIHR5cGUgfGZyb218IHRvIHR5cGUgfHRvfC4gKi8KKyNkZWZpbmUgQ0hFQ0tFRF9DQVNUKHRvLCBmcm9tLCBwKSAoKHRvKSAoMSA/IChwKSA6IChmcm9tKTApKQorCisvKiBDSEVDS0VEX1BUUl9PRiBjYXN0cyBhIGdpdmVuIHBvaW50ZXIgdG8gdm9pZCogYW5kIHN0YXRpY2FsbHkgY2hlY2tzIHRoYXQgaXQKKyAqIHdhcyBhIHBvaW50ZXIgdG8gfHR5cGV8LiAqLworI2RlZmluZSBDSEVDS0VEX1BUUl9PRih0eXBlLCBwKSBDSEVDS0VEX0NBU1Qodm9pZCosIHR5cGUqLCAocCkpCisKKyNkZWZpbmUgT1BFTlNTTF9DT01QSUxFX0FTU0VSVChjb25kLCBtc2cpIFwKKyAgdHlwZWRlZiBjaGFyIE9QRU5TU0xfQ09NUElMRV9BU1NFUlRfIyNtc2dbKChjb25kKSA/IDEgOiAtMSldCisKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9ICAvKiBleHRlcm4gQyAqLworI2VuZGlmCisKKyNlbmRpZiAgLyogT1BFTlNTTF9IRUFERVJfVFlQRV9DSEVDS19IICovCmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOS9DTWFrZUxpc3RzLnR4dCBiL2NyeXB0by94NTA5L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMTdkNzYKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDU3IEBACitpbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKKworYWRkX2xpYnJhcnkoCisJeDUwOQorCisJT0JKRUNUCisKKwlhX2RpZ2VzdC5jCisJYV9zaWduLmMKKwlhX3N0cmV4LmMKKwlhX3ZlcmlmeS5jCisJYXNuMV9nZW4uYworCWJ5X2Rpci5jCisJYnlfZmlsZS5jCisJaTJkX3ByLmMKKwlwa2NzNy5jCisJdF9jcmwuYworCXRfeDUwOS5jCisJdF94NTA5YS5jCisJeDUwOS5jCisJeDUwOV9hdHQuYworCXg1MDlfY21wLmMKKwl4NTA5X2QyLmMKKwl4NTA5X2RlZi5jCisJeDUwOV9lcnJvci5jCisJeDUwOV9leHQuYworCXg1MDlfbHUuYworCXg1MDlfb2JqLmMKKwl4NTA5X3IyeC5jCisJeDUwOV9yZXEuYworCXg1MDlfc2V0LmMKKwl4NTA5X3Rycy5jCisJeDUwOV90eHQuYworCXg1MDlfdjMuYworCXg1MDlfdmZ5LmMKKwl4NTA5X3ZwbS5jCisJeDUwOWNzZXQuYworCXg1MDluYW1lLmMKKwl4NTA5cnNldC5jCisJeDUwOXNwa2kuYworCXg1MDl0eXBlLmMKKwl4X2FsZ29yLmMKKwl4X2FsbC5jCisJeF9hdHRyaWIuYworCXhfY3JsLmMKKwl4X2V4dGVuLmMKKwl4X2luZm8uYworCXhfbmFtZS5jCisJeF9wa2V5LmMKKwl4X3B1YmtleS5jCisJeF9yZXEuYworCXhfc2lnLmMKKwl4X3Nwa2kuYworCXhfdmFsLmMKKwl4X3g1MDkuYworCXhfeDUwOWEuYworKQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3g1MDkvYV9kaWdlc3QuYyBiL2NyeXB0by94NTA5L2FfZGlnZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQxMWRiYwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94NTA5L2FfZGlnZXN0LmMKQEAgLTAsMCArMSw5OSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9kaWdlc3QuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisKKworaW50IEFTTjFfZGlnZXN0KGkyZF9vZl92b2lkICppMmQsIGNvbnN0IEVWUF9NRCAqdHlwZSwgY2hhciAqZGF0YSwKKwkJdW5zaWduZWQgY2hhciAqbWQsIHVuc2lnbmVkIGludCAqbGVuKQorCXsKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyICpzdHIsKnA7CisKKwlpPWkyZChkYXRhLE5VTEwpOworCWlmICgoc3RyPSh1bnNpZ25lZCBjaGFyICopT1BFTlNTTF9tYWxsb2MoaSkpID09IE5VTEwpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgQVNOMV9kaWdlc3QsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuKDApOworCQl9CisJcD1zdHI7CisJaTJkKGRhdGEsJnApOworCisJaWYgKCFFVlBfRGlnZXN0KHN0ciwgaSwgbWQsIGxlbiwgdHlwZSwgTlVMTCkpCisJCXJldHVybiAwOworCU9QRU5TU0xfZnJlZShzdHIpOworCXJldHVybigxKTsKKwl9CisKK2ludCBBU04xX2l0ZW1fZGlnZXN0KGNvbnN0IEFTTjFfSVRFTSAqaXQsIGNvbnN0IEVWUF9NRCAqdHlwZSwgdm9pZCAqYXNuLAorCQl1bnNpZ25lZCBjaGFyICptZCwgdW5zaWduZWQgaW50ICpsZW4pCisJeworCWludCBpOworCXVuc2lnbmVkIGNoYXIgKnN0ciA9IE5VTEw7CisKKwlpPUFTTjFfaXRlbV9pMmQoYXNuLCZzdHIsIGl0KTsKKwlpZiAoIXN0cikgcmV0dXJuKDApOworCisJaWYgKCFFVlBfRGlnZXN0KHN0ciwgaSwgbWQsIGxlbiwgdHlwZSwgTlVMTCkpCisJCXJldHVybiAwOworCU9QRU5TU0xfZnJlZShzdHIpOworCXJldHVybigxKTsKKwl9CmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOS9hX3NpZ24uYyBiL2NyeXB0by94NTA5L2Ffc2lnbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNWVmZTEKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOS9hX3NpZ24uYwpAQCAtMCwwICsxLDI3MiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZGlnZXN0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKworI2luY2x1ZGUgIi4uL2V2cC9pbnRlcm5hbC5oIgorCisKKy8qIFRPRE8oZm9yayk6IHRoaXMgY29kZSBhcHBlYXJzIHRvIGJlIGRlYWQuICovCisjaWYgMAorI2lmbmRlZiBOT19BU04xX09MRAorCitpbnQgQVNOMV9zaWduKGkyZF9vZl92b2lkICppMmQsIFg1MDlfQUxHT1IgKmFsZ29yMSwgWDUwOV9BTEdPUiAqYWxnb3IyLAorCSAgICAgIEFTTjFfQklUX1NUUklORyAqc2lnbmF0dXJlLCBjaGFyICpkYXRhLCBFVlBfUEtFWSAqcGtleSwKKwkgICAgICBjb25zdCBFVlBfTUQgKnR5cGUpCisJeworCUVWUF9NRF9DVFggY3R4OworCXVuc2lnbmVkIGNoYXIgKnAsKmJ1Zl9pbj1OVUxMLCpidWZfb3V0PU5VTEw7CisJaW50IGksaW5sPTAsb3V0bD0wLG91dGxsPTA7CisJWDUwOV9BTEdPUiAqYTsKKworCUVWUF9NRF9DVFhfaW5pdCgmY3R4KTsKKwlmb3IgKGk9MDsgaTwyOyBpKyspCisJCXsKKwkJaWYgKGkgPT0gMCkKKwkJCWE9YWxnb3IxOworCQllbHNlCisJCQlhPWFsZ29yMjsKKwkJaWYgKGEgPT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKHR5cGUtPnBrZXlfdHlwZSA9PSBOSURfZHNhV2l0aFNIQTEpCisJCQl7CisJCQkvKiBzcGVjaWFsIGNhc2U6IFJGQyAyNDU5IHRlbGxzIHVzIHRvIG9taXQgJ3BhcmFtZXRlcnMnCisJCQkgKiB3aXRoIGlkLWRzYS13aXRoLXNoYTEgKi8KKwkJCUFTTjFfVFlQRV9mcmVlKGEtPnBhcmFtZXRlcik7CisJCQlhLT5wYXJhbWV0ZXIgPSBOVUxMOworCQkJfQorCQllbHNlIGlmICgoYS0+cGFyYW1ldGVyID09IE5VTEwpIHx8IAorCQkJKGEtPnBhcmFtZXRlci0+dHlwZSAhPSBWX0FTTjFfTlVMTCkpCisJCQl7CisJCQlBU04xX1RZUEVfZnJlZShhLT5wYXJhbWV0ZXIpOworCQkJaWYgKChhLT5wYXJhbWV0ZXI9QVNOMV9UWVBFX25ldygpKSA9PSBOVUxMKSBnb3RvIGVycjsKKwkJCWEtPnBhcmFtZXRlci0+dHlwZT1WX0FTTjFfTlVMTDsKKwkJCX0KKwkJQVNOMV9PQkpFQ1RfZnJlZShhLT5hbGdvcml0aG0pOworCQlhLT5hbGdvcml0aG09T0JKX25pZDJvYmoodHlwZS0+cGtleV90eXBlKTsKKwkJaWYgKGEtPmFsZ29yaXRobSA9PSBOVUxMKQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgWFhYLCBBU04xX1JfVU5LTk9XTl9PQkpFQ1RfVFlQRSk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJaWYgKGEtPmFsZ29yaXRobS0+bGVuZ3RoID09IDApCisJCQl7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBYWFgsIEFTTjFfUl9USEVfQVNOMV9PQkpFQ1RfSURFTlRJRklFUl9JU19OT1RfS05PV05fRk9SX1RISVNfTUQpOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwlpbmw9aTJkKGRhdGEsTlVMTCk7CisJYnVmX2luPSh1bnNpZ25lZCBjaGFyICopT1BFTlNTTF9tYWxsb2MoKHVuc2lnbmVkIGludClpbmwpOworCW91dGxsPW91dGw9RVZQX1BLRVlfc2l6ZShwa2V5KTsKKwlidWZfb3V0PSh1bnNpZ25lZCBjaGFyICopT1BFTlNTTF9tYWxsb2MoKHVuc2lnbmVkIGludClvdXRsKTsKKwlpZiAoKGJ1Zl9pbiA9PSBOVUxMKSB8fCAoYnVmX291dCA9PSBOVUxMKSkKKwkJeworCQlvdXRsPTA7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIFhYWCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCXA9YnVmX2luOworCisJaTJkKGRhdGEsJnApOworCWlmICghRVZQX1NpZ25Jbml0X2V4KCZjdHgsdHlwZSwgTlVMTCkKKwkJfHwgIUVWUF9TaWduVXBkYXRlKCZjdHgsKHVuc2lnbmVkIGNoYXIgKilidWZfaW4saW5sKQorCQl8fCAhRVZQX1NpZ25GaW5hbCgmY3R4LCh1bnNpZ25lZCBjaGFyICopYnVmX291dCwKKwkJCSh1bnNpZ25lZCBpbnQgKikmb3V0bCxwa2V5KSkKKwkJeworCQlvdXRsPTA7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIFhYWCwgRVJSX1JfRVZQX0xJQik7CisJCWdvdG8gZXJyOworCQl9CisJaWYgKHNpZ25hdHVyZS0+ZGF0YSAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUoc2lnbmF0dXJlLT5kYXRhKTsKKwlzaWduYXR1cmUtPmRhdGE9YnVmX291dDsKKwlidWZfb3V0PU5VTEw7CisJc2lnbmF0dXJlLT5sZW5ndGg9b3V0bDsKKwkvKiBJbiB0aGUgaW50ZXJlc3RzIG9mIGNvbXBhdGliaWxpdHksIEknbGwgbWFrZSBzdXJlIHRoYXQKKwkgKiB0aGUgYml0IHN0cmluZyBoYXMgYSAnbm90LXVzZWQgYml0cycgdmFsdWUgb2YgMAorCSAqLworCXNpZ25hdHVyZS0+ZmxhZ3MmPSB+KEFTTjFfU1RSSU5HX0ZMQUdfQklUU19MRUZUfDB4MDcpOworCXNpZ25hdHVyZS0+ZmxhZ3N8PUFTTjFfU1RSSU5HX0ZMQUdfQklUU19MRUZUOworZXJyOgorCUVWUF9NRF9DVFhfY2xlYW51cCgmY3R4KTsKKwlpZiAoYnVmX2luICE9IE5VTEwpCisJCXsgT1BFTlNTTF9jbGVhbnNlKChjaGFyICopYnVmX2luLCh1bnNpZ25lZCBpbnQpaW5sKTsgT1BFTlNTTF9mcmVlKGJ1Zl9pbik7IH0KKwlpZiAoYnVmX291dCAhPSBOVUxMKQorCQl7IE9QRU5TU0xfY2xlYW5zZSgoY2hhciAqKWJ1Zl9vdXQsb3V0bGwpOyBPUEVOU1NMX2ZyZWUoYnVmX291dCk7IH0KKwlyZXR1cm4ob3V0bCk7CisJfQorCisjZW5kaWYKKyNlbmRpZgorCitpbnQgQVNOMV9pdGVtX3NpZ24oY29uc3QgQVNOMV9JVEVNICppdCwgWDUwOV9BTEdPUiAqYWxnb3IxLCBYNTA5X0FMR09SICphbGdvcjIsCisJICAgICBBU04xX0JJVF9TVFJJTkcgKnNpZ25hdHVyZSwgdm9pZCAqYXNuLCBFVlBfUEtFWSAqcGtleSwKKwkgICAgIGNvbnN0IEVWUF9NRCAqdHlwZSkKKwl7CisJRVZQX01EX0NUWCBjdHg7CisJRVZQX01EX0NUWF9pbml0KCZjdHgpOworCWlmICghRVZQX0RpZ2VzdFNpZ25Jbml0KCZjdHgsIE5VTEwsIHR5cGUsIE5VTEwsIHBrZXkpKQorCQl7CisJCUVWUF9NRF9DVFhfY2xlYW51cCgmY3R4KTsKKwkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gQVNOMV9pdGVtX3NpZ25fY3R4KGl0LCBhbGdvcjEsIGFsZ29yMiwgc2lnbmF0dXJlLCBhc24sICZjdHgpOworCX0KKwkJCisKK2ludCBBU04xX2l0ZW1fc2lnbl9jdHgoY29uc3QgQVNOMV9JVEVNICppdCwKKwkJWDUwOV9BTEdPUiAqYWxnb3IxLCBYNTA5X0FMR09SICphbGdvcjIsCisJICAgICAJQVNOMV9CSVRfU1RSSU5HICpzaWduYXR1cmUsIHZvaWQgKmFzbiwgRVZQX01EX0NUWCAqY3R4KQorCXsKKwljb25zdCBFVlBfTUQgKnR5cGU7CisJRVZQX1BLRVkgKnBrZXk7CisJdW5zaWduZWQgY2hhciAqYnVmX2luPU5VTEwsKmJ1Zl9vdXQ9TlVMTDsKKwlzaXplX3QgaW5sPTAsb3V0bD0wLG91dGxsPTA7CisJaW50IHNpZ25pZCwgcGFyYW10eXBlOworCWludCBydjsKKworCXR5cGUgPSBFVlBfTURfQ1RYX21kKGN0eCk7CisJcGtleSA9IEVWUF9QS0VZX0NUWF9nZXQwX3BrZXkoY3R4LT5wY3R4KTsKKworCWlmICghdHlwZSB8fCAhcGtleSkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBBU04xX2l0ZW1fc2lnbl9jdHgsIFg1MDlfUl9DT05URVhUX05PVF9JTklUSUFMSVNFRCk7CisJCXJldHVybiAwOworCQl9CisKKwlpZiAocGtleS0+YW1ldGgtPml0ZW1fc2lnbikKKwkJeworCQlydiA9IHBrZXktPmFtZXRoLT5pdGVtX3NpZ24oY3R4LCBpdCwgYXNuLCBhbGdvcjEsIGFsZ29yMiwKKwkJCQkJCXNpZ25hdHVyZSk7CisJCWlmIChydiA9PSAxKQorCQkJb3V0bCA9IHNpZ25hdHVyZS0+bGVuZ3RoOworCQkvKiBSZXR1cm4gdmFsdWUgbWVhbmluZ3M6CisJCSAqIDw9MDogZXJyb3IuCisJCSAqICAgMTogbWV0aG9kIGRvZXMgZXZlcnl0aGluZy4KKwkJICogICAyOiBjYXJyeSBvbiBhcyBub3JtYWwuCisJCSAqICAgMzogQVNOMSBtZXRob2Qgc2V0cyBhbGdvcml0aG0gaWRlbnRpZmllcnM6IGp1c3Qgc2lnbi4KKwkJICovCisJCWlmIChydiA8PSAwKQorCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgQVNOMV9pdGVtX3NpZ25fY3R4LCBFUlJfUl9FVlBfTElCKTsKKwkJaWYgKHJ2IDw9IDEpCisJCQlnb3RvIGVycjsKKwkJfQorCWVsc2UKKwkJcnYgPSAyOworCisJaWYgKHJ2ID09IDIpCisJCXsKKwkJLyogVE9ETyhmb3JrKTogRVZQX01EX0ZMQUdfUEtFWV9NRVRIT0RfU0lHTkFUVVJFIHNlZW1zIHRvIG1lYW4KKwkJICogImlzIFNIQSIuICovCisJCWlmICghcGtleS0+YW1ldGggfHwKKwkJCSFPQkpfZmluZF9zaWdpZF9ieV9hbGdzKCZzaWduaWQsCisJCQkJCQlFVlBfTURfdHlwZSh0eXBlKSwKKwkJCQkJCXBrZXktPmFtZXRoLT5wa2V5X2lkKSkKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEFTTjFfaXRlbV9zaWduX2N0eCwgWDUwOV9SX0RJR0VTVF9BTkRfS0VZX1RZUEVfTk9UX1NVUFBPUlRFRCk7CisJCQlyZXR1cm4gMDsKKwkJCX0KKworCQlpZiAocGtleS0+YW1ldGgtPnBrZXlfZmxhZ3MgJiBBU04xX1BLRVlfU0lHUEFSQU1fTlVMTCkKKwkJCXBhcmFtdHlwZSA9IFZfQVNOMV9OVUxMOworCQllbHNlCisJCQlwYXJhbXR5cGUgPSBWX0FTTjFfVU5ERUY7CisKKwkJaWYgKGFsZ29yMSkKKwkJCVg1MDlfQUxHT1Jfc2V0MChhbGdvcjEsIE9CSl9uaWQyb2JqKHNpZ25pZCksIHBhcmFtdHlwZSwgTlVMTCk7CisJCWlmIChhbGdvcjIpCisJCQlYNTA5X0FMR09SX3NldDAoYWxnb3IyLCBPQkpfbmlkMm9iaihzaWduaWQpLCBwYXJhbXR5cGUsIE5VTEwpOworCisJCX0KKworCWlubD1BU04xX2l0ZW1faTJkKGFzbiwmYnVmX2luLCBpdCk7CisJb3V0bGw9b3V0bD1FVlBfUEtFWV9zaXplKHBrZXkpOworCWJ1Zl9vdXQ9T1BFTlNTTF9tYWxsb2MoKHVuc2lnbmVkIGludClvdXRsKTsKKwlpZiAoKGJ1Zl9pbiA9PSBOVUxMKSB8fCAoYnVmX291dCA9PSBOVUxMKSkKKwkJeworCQlvdXRsPTA7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEFTTjFfaXRlbV9zaWduX2N0eCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKCFFVlBfRGlnZXN0U2lnblVwZGF0ZShjdHgsIGJ1Zl9pbiwgaW5sKQorCQl8fCAhRVZQX0RpZ2VzdFNpZ25GaW5hbChjdHgsIGJ1Zl9vdXQsICZvdXRsKSkKKwkJeworCQlvdXRsPTA7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEFTTjFfaXRlbV9zaWduX2N0eCwgRVJSX1JfRVZQX0xJQik7CisJCWdvdG8gZXJyOworCQl9CisJaWYgKHNpZ25hdHVyZS0+ZGF0YSAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUoc2lnbmF0dXJlLT5kYXRhKTsKKwlzaWduYXR1cmUtPmRhdGE9YnVmX291dDsKKwlidWZfb3V0PU5VTEw7CisJc2lnbmF0dXJlLT5sZW5ndGg9b3V0bDsKKwkvKiBJbiB0aGUgaW50ZXJlc3RzIG9mIGNvbXBhdGliaWxpdHksIEknbGwgbWFrZSBzdXJlIHRoYXQKKwkgKiB0aGUgYml0IHN0cmluZyBoYXMgYSAnbm90LXVzZWQgYml0cycgdmFsdWUgb2YgMAorCSAqLworCXNpZ25hdHVyZS0+ZmxhZ3MmPSB+KEFTTjFfU1RSSU5HX0ZMQUdfQklUU19MRUZUfDB4MDcpOworCXNpZ25hdHVyZS0+ZmxhZ3N8PUFTTjFfU1RSSU5HX0ZMQUdfQklUU19MRUZUOworZXJyOgorCUVWUF9NRF9DVFhfY2xlYW51cChjdHgpOworCWlmIChidWZfaW4gIT0gTlVMTCkKKwkJeyBPUEVOU1NMX2NsZWFuc2UoKGNoYXIgKilidWZfaW4sKHVuc2lnbmVkIGludClpbmwpOyBPUEVOU1NMX2ZyZWUoYnVmX2luKTsgfQorCWlmIChidWZfb3V0ICE9IE5VTEwpCisJCXsgT1BFTlNTTF9jbGVhbnNlKChjaGFyICopYnVmX291dCxvdXRsbCk7IE9QRU5TU0xfZnJlZShidWZfb3V0KTsgfQorCXJldHVybihvdXRsKTsKKwl9CmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOS9hX3N0cmV4LmMgYi9jcnlwdG8veDUwOS9hX3N0cmV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJiNjFhYwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94NTA5L2Ffc3RyZXguYwpAQCAtMCwwICsxLDU2MSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgorCisjaW5jbHVkZSAiY2hhcm1hcC5oIgorCisKKy8qIEFTTjFfU1RSSU5HX3ByaW50X2V4KCkgYW5kIFg1MDlfTkFNRV9wcmludF9leCgpLgorICogRW5oYW5jZWQgc3RyaW5nIGFuZCBuYW1lIHByaW50aW5nIHJvdXRpbmVzIGhhbmRsaW5nCisgKiBtdWx0aWJ5dGUgY2hhcmFjdGVycywgUkZDMjI1MyBhbmQgYSBob3N0IG9mIG90aGVyCisgKiBvcHRpb25zLgorICovCisKKworI2RlZmluZSBDSEFSVFlQRV9CU19FU0MJCShBU04xX1NUUkZMR1NfRVNDXzIyNTMgfCBDSEFSVFlQRV9GSVJTVF9FU0NfMjI1MyB8IENIQVJUWVBFX0xBU1RfRVNDXzIyNTMpCisKKyNkZWZpbmUgRVNDX0ZMQUdTIChBU04xX1NUUkZMR1NfRVNDXzIyNTMgfCBcCisJCSAgQVNOMV9TVFJGTEdTX0VTQ19RVU9URSB8IFwKKwkJICBBU04xX1NUUkZMR1NfRVNDX0NUUkwgfCBcCisJCSAgQVNOMV9TVFJGTEdTX0VTQ19NU0IpCisKKworc3RhdGljIGludCBzZW5kX2Jpb19jaGFycyh2b2lkICphcmcsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGxlbikKK3sKKwlpZighYXJnKSByZXR1cm4gMTsKKwlpZihCSU9fd3JpdGUoYXJnLCBidWYsIGxlbikgIT0gbGVuKSByZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzZW5kX2ZwX2NoYXJzKHZvaWQgKmFyZywgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuKQoreworCWlmKCFhcmcpIHJldHVybiAxOworCWlmKGZ3cml0ZShidWYsIDEsIGxlbiwgYXJnKSAhPSAodW5zaWduZWQgaW50KWxlbikgcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3R5cGVkZWYgaW50IGNoYXJfaW8odm9pZCAqYXJnLCBjb25zdCB2b2lkICpidWYsIGludCBsZW4pOworCisvKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgZGlzcGxheSBvZgorICogc3RyaW5ncywgb25lIGNoYXJhY3RlciBhdCBhIHRpbWUuCisgKiBJdCBpcyBwYXNzZWQgYW4gdW5zaWduZWQgbG9uZyBmb3IgZWFjaAorICogY2hhcmFjdGVyIGJlY2F1c2UgaXQgY291bGQgY29tZSBmcm9tIDIgb3IgZXZlbgorICogNCBieXRlIGZvcm1zLgorICovCisKKyNkZWZpbmUgSEVYX1NJWkUodHlwZSkgKHNpemVvZih0eXBlKSoyKQorCitzdGF0aWMgaW50IGRvX2VzY19jaGFyKHVuc2lnbmVkIGxvbmcgYywgdW5zaWduZWQgY2hhciBmbGFncywgY2hhciAqZG9fcXVvdGVzLCBjaGFyX2lvICppb19jaCwgdm9pZCAqYXJnKQoreworCXVuc2lnbmVkIGNoYXIgY2hmbGdzLCBjaHRtcDsKKwljaGFyIHRtcGhleFtIRVhfU0laRShsb25nKSszXTsKKworCWlmKGMgPiAweGZmZmZmZmZmTCkKKwkJcmV0dXJuIC0xOworCWlmKGMgPiAweGZmZmYpIHsKKwkJQklPX3NucHJpbnRmKHRtcGhleCwgc2l6ZW9mIHRtcGhleCwgIlxcVyUwOGxYIiwgYyk7CisJCWlmKCFpb19jaChhcmcsIHRtcGhleCwgMTApKSByZXR1cm4gLTE7CisJCXJldHVybiAxMDsKKwl9CisJaWYoYyA+IDB4ZmYpIHsKKwkJQklPX3NucHJpbnRmKHRtcGhleCwgc2l6ZW9mIHRtcGhleCwgIlxcVSUwNGxYIiwgYyk7CisJCWlmKCFpb19jaChhcmcsIHRtcGhleCwgNikpIHJldHVybiAtMTsKKwkJcmV0dXJuIDY7CisJfQorCWNodG1wID0gKHVuc2lnbmVkIGNoYXIpYzsKKwlpZihjaHRtcCA+IDB4N2YpIGNoZmxncyA9IGZsYWdzICYgQVNOMV9TVFJGTEdTX0VTQ19NU0I7CisJZWxzZSBjaGZsZ3MgPSBjaGFyX3R5cGVbY2h0bXBdICYgZmxhZ3M7CisJaWYoY2hmbGdzICYgQ0hBUlRZUEVfQlNfRVNDKSB7CisJCS8qIElmIHdlIGRvbid0IGVzY2FwZSB3aXRoIHF1b3Rlcywgc2lnbmFsIHdlIG5lZWQgcXVvdGVzICovCisJCWlmKGNoZmxncyAmIEFTTjFfU1RSRkxHU19FU0NfUVVPVEUpIHsKKwkJCWlmKGRvX3F1b3RlcykgKmRvX3F1b3RlcyA9IDE7CisJCQlpZighaW9fY2goYXJnLCAmY2h0bXAsIDEpKSByZXR1cm4gLTE7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlpZighaW9fY2goYXJnLCAiXFwiLCAxKSkgcmV0dXJuIC0xOworCQlpZighaW9fY2goYXJnLCAmY2h0bXAsIDEpKSByZXR1cm4gLTE7CisJCXJldHVybiAyOworCX0KKwlpZihjaGZsZ3MgJiAoQVNOMV9TVFJGTEdTX0VTQ19DVFJMfEFTTjFfU1RSRkxHU19FU0NfTVNCKSkgeworCQlCSU9fc25wcmludGYodG1waGV4LCAxMSwgIlxcJTAyWCIsIGNodG1wKTsKKwkJaWYoIWlvX2NoKGFyZywgdG1waGV4LCAzKSkgcmV0dXJuIC0xOworCQlyZXR1cm4gMzsKKwl9CisJLyogSWYgd2UgZ2V0IHRoaXMgZmFyIGFuZCBkbyBhbnkgZXNjYXBpbmcgYXQgYWxsIG11c3QgZXNjYXBlIAorCSAqIHRoZSBlc2NhcGUgY2hhcmFjdGVyIGl0c2VsZjogYmFja3NsYXNoLgorCSAqLworCWlmIChjaHRtcCA9PSAnXFwnICYmIGZsYWdzICYgRVNDX0ZMQUdTKSB7CisJCWlmKCFpb19jaChhcmcsICJcXFxcIiwgMikpIHJldHVybiAtMTsKKwkJcmV0dXJuIDI7CisJfQorCWlmKCFpb19jaChhcmcsICZjaHRtcCwgMSkpIHJldHVybiAtMTsKKwlyZXR1cm4gMTsKK30KKworI2RlZmluZSBCVUZfVFlQRV9XSURUSF9NQVNLCTB4NworI2RlZmluZSBCVUZfVFlQRV9DT05WVVRGOAkweDgKKworLyogVGhpcyBmdW5jdGlvbiBzZW5kcyBlYWNoIGNoYXJhY3RlciBpbiBhIGJ1ZmZlciB0bworICogZG9fZXNjX2NoYXIoKS4gSXQgaW50ZXJwcmV0cyB0aGUgY29udGVudCBmb3JtYXRzCisgKiBhbmQgY29udmVydHMgdG8gb3IgZnJvbSBVVEY4IGFzIGFwcHJvcHJpYXRlLgorICovCisKK3N0YXRpYyBpbnQgZG9fYnVmKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbiwKKwkJCWludCB0eXBlLCB1bnNpZ25lZCBjaGFyIGZsYWdzLCBjaGFyICpxdW90ZXMsIGNoYXJfaW8gKmlvX2NoLCB2b2lkICphcmcpCit7CisJaW50IGksIG91dGxlbiwgbGVuOworCXVuc2lnbmVkIGNoYXIgb3JmbGFncywgKnAsICpxOworCXVuc2lnbmVkIGxvbmcgYzsKKwlwID0gYnVmOworCXEgPSBidWYgKyBidWZsZW47CisJb3V0bGVuID0gMDsKKwl3aGlsZShwICE9IHEpIHsKKwkJaWYocCA9PSBidWYgJiYgZmxhZ3MgJiBBU04xX1NUUkZMR1NfRVNDXzIyNTMpIG9yZmxhZ3MgPSBDSEFSVFlQRV9GSVJTVF9FU0NfMjI1MzsKKwkJZWxzZSBvcmZsYWdzID0gMDsKKwkJc3dpdGNoKHR5cGUgJiBCVUZfVFlQRV9XSURUSF9NQVNLKSB7CisJCQljYXNlIDQ6CisJCQljID0gKCh1bnNpZ25lZCBsb25nKSpwKyspIDw8IDI0OworCQkJYyB8PSAoKHVuc2lnbmVkIGxvbmcpKnArKykgPDwgMTY7CisJCQljIHw9ICgodW5zaWduZWQgbG9uZykqcCsrKSA8PCA4OworCQkJYyB8PSAqcCsrOworCQkJYnJlYWs7CisKKwkJCWNhc2UgMjoKKwkJCWMgPSAoKHVuc2lnbmVkIGxvbmcpKnArKykgPDwgODsKKwkJCWMgfD0gKnArKzsKKwkJCWJyZWFrOworCisJCQljYXNlIDE6CisJCQljID0gKnArKzsKKwkJCWJyZWFrOworCQkJCisJCQljYXNlIDA6CisJCQlpID0gVVRGOF9nZXRjKHAsIGJ1ZmxlbiwgJmMpOworCQkJaWYoaSA8IDApIHJldHVybiAtMTsJLyogSW52YWxpZCBVVEY4U3RyaW5nICovCisJCQlwICs9IGk7CisJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLTE7CS8qIGludmFsaWQgd2lkdGggKi8KKwkJfQorCQlpZiAocCA9PSBxICYmIGZsYWdzICYgQVNOMV9TVFJGTEdTX0VTQ18yMjUzKSBvcmZsYWdzID0gQ0hBUlRZUEVfTEFTVF9FU0NfMjI1MzsKKwkJaWYodHlwZSAmIEJVRl9UWVBFX0NPTlZVVEY4KSB7CisJCQl1bnNpZ25lZCBjaGFyIHV0ZmJ1Zls2XTsKKwkJCWludCB1dGZsZW47CisJCQl1dGZsZW4gPSBVVEY4X3B1dGModXRmYnVmLCBzaXplb2YgdXRmYnVmLCBjKTsKKwkJCWZvcihpID0gMDsgaSA8IHV0ZmxlbjsgaSsrKSB7CisJCQkJLyogV2UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBzZXR0aW5nIG9yZmxhZ3MgY29ycmVjdGx5CisJCQkJICogYmVjYXVzZSBpZiB1dGZsZW49PTEgaXRzIHZhbHVlIHdpbGwgYmUgY29ycmVjdCBhbnl3YXkgCisJCQkJICogb3RoZXJ3aXNlIGVhY2ggY2hhcmFjdGVyIHdpbGwgYmUgPiAweDdmIGFuZCBzbyB0aGUgCisJCQkJICogY2hhcmFjdGVyIHdpbGwgbmV2ZXIgYmUgZXNjYXBlZCBvbiBmaXJzdCBhbmQgbGFzdC4KKwkJCQkgKi8KKwkJCQlsZW4gPSBkb19lc2NfY2hhcih1dGZidWZbaV0sICh1bnNpZ25lZCBjaGFyKShmbGFncyB8IG9yZmxhZ3MpLCBxdW90ZXMsIGlvX2NoLCBhcmcpOworCQkJCWlmKGxlbiA8IDApIHJldHVybiAtMTsKKwkJCQlvdXRsZW4gKz0gbGVuOworCQkJfQorCQl9IGVsc2UgeworCQkJbGVuID0gZG9fZXNjX2NoYXIoYywgKHVuc2lnbmVkIGNoYXIpKGZsYWdzIHwgb3JmbGFncyksIHF1b3RlcywgaW9fY2gsIGFyZyk7CisJCQlpZihsZW4gPCAwKSByZXR1cm4gLTE7CisJCQlvdXRsZW4gKz0gbGVuOworCQl9CisJfQorCXJldHVybiBvdXRsZW47Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaGV4IGR1bXBzIGEgYnVmZmVyIG9mIGNoYXJhY3RlcnMgKi8KKworc3RhdGljIGludCBkb19oZXhfZHVtcChjaGFyX2lvICppb19jaCwgdm9pZCAqYXJnLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBidWZsZW4pCit7CisJc3RhdGljIGNvbnN0IGNoYXIgaGV4ZGlnW10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7CisJdW5zaWduZWQgY2hhciAqcCwgKnE7CisJY2hhciBoZXh0bXBbMl07CisJaWYoYXJnKSB7CisJCXAgPSBidWY7CisJCXEgPSBidWYgKyBidWZsZW47CisJCXdoaWxlKHAgIT0gcSkgeworCQkJaGV4dG1wWzBdID0gaGV4ZGlnWypwID4+IDRdOworCQkJaGV4dG1wWzFdID0gaGV4ZGlnWypwICYgMHhmXTsKKwkJCWlmKCFpb19jaChhcmcsIGhleHRtcCwgMikpIHJldHVybiAtMTsKKwkJCXArKzsKKwkJfQorCX0KKwlyZXR1cm4gYnVmbGVuIDw8IDE7Cit9CisKKy8qICJkdW1wIiBhIHN0cmluZy4gVGhpcyBpcyBkb25lIHdoZW4gdGhlIHR5cGUgaXMgdW5rbm93biwKKyAqIG9yIHRoZSBmbGFncyByZXF1ZXN0IGl0LiBXZSBjYW4gZWl0aGVyIGR1bXAgdGhlIGNvbnRlbnQKKyAqIG9jdGV0cyBvciB0aGUgZW50aXJlIERFUiBlbmNvZGluZy4gVGhpcyB1c2VzIHRoZSBSRkMyMjUzCisgKiAjMDEyMzQgZm9ybWF0LgorICovCisKK3N0YXRpYyBpbnQgZG9fZHVtcCh1bnNpZ25lZCBsb25nIGxmbGFncywgY2hhcl9pbyAqaW9fY2gsIHZvaWQgKmFyZywgQVNOMV9TVFJJTkcgKnN0cikKK3sKKwkvKiBQbGFjaW5nIHRoZSBBU04xX1NUUklORyBpbiBhIHRlbXAgQVNOMV9UWVBFIGFsbG93cworCSAqIHRoZSBERVIgZW5jb2RpbmcgdG8gcmVhZGlseSBvYnRhaW5lZAorCSAqLworCUFTTjFfVFlQRSB0OworCXVuc2lnbmVkIGNoYXIgKmRlcl9idWYsICpwOworCWludCBvdXRsZW4sIGRlcl9sZW47CisKKwlpZighaW9fY2goYXJnLCAiIyIsIDEpKSByZXR1cm4gLTE7CisJLyogSWYgd2UgZG9uJ3QgZHVtcCBERVIgZW5jb2RpbmcganVzdCBkdW1wIGNvbnRlbnQgb2N0ZXRzICovCisJaWYoIShsZmxhZ3MgJiBBU04xX1NUUkZMR1NfRFVNUF9ERVIpKSB7CisJCW91dGxlbiA9IGRvX2hleF9kdW1wKGlvX2NoLCBhcmcsIHN0ci0+ZGF0YSwgc3RyLT5sZW5ndGgpOworCQlpZihvdXRsZW4gPCAwKSByZXR1cm4gLTE7CisJCXJldHVybiBvdXRsZW4gKyAxOworCX0KKwl0LnR5cGUgPSBzdHItPnR5cGU7CisJdC52YWx1ZS5wdHIgPSAoY2hhciAqKXN0cjsKKwlkZXJfbGVuID0gaTJkX0FTTjFfVFlQRSgmdCwgTlVMTCk7CisJZGVyX2J1ZiA9IE9QRU5TU0xfbWFsbG9jKGRlcl9sZW4pOworCWlmKCFkZXJfYnVmKSByZXR1cm4gLTE7CisJcCA9IGRlcl9idWY7CisJaTJkX0FTTjFfVFlQRSgmdCwgJnApOworCW91dGxlbiA9IGRvX2hleF9kdW1wKGlvX2NoLCBhcmcsIGRlcl9idWYsIGRlcl9sZW4pOworCU9QRU5TU0xfZnJlZShkZXJfYnVmKTsKKwlpZihvdXRsZW4gPCAwKSByZXR1cm4gLTE7CisJcmV0dXJuIG91dGxlbiArIDE7Cit9CisKKy8qIExvb2t1cCB0YWJsZSB0byBjb252ZXJ0IHRhZ3MgdG8gY2hhcmFjdGVyIHdpZHRocywKKyAqIDAgPSBVVEY4IGVuY29kZWQsIC0xIGlzIHVzZWQgZm9yIG5vbiBzdHJpbmcgdHlwZXMKKyAqIG90aGVyd2lzZSBpdCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBlciBjaGFyYWN0ZXIKKyAqLworCitzdGF0aWMgY29uc3Qgc2lnbmVkIGNoYXIgdGFnMm5ieXRlW10gPSB7CisJLTEsIC0xLCAtMSwgLTEsIC0xLAkvKiAwLTQgKi8KKwktMSwgLTEsIC0xLCAtMSwgLTEsCS8qIDUtOSAqLworCS0xLCAtMSwgMCwgLTEsCQkvKiAxMC0xMyAqLworCS0xLCAtMSwgLTEsIC0xLAkJLyogMTUtMTcgKi8KKwktMSwgMSwgMSwJCS8qIDE4LTIwICovCisJLTEsIDEsIDEsIDEsCQkvKiAyMS0yNCAqLworCS0xLCAxLCAtMSwJCS8qIDI1LTI3ICovCisJNCwgLTEsIDIJCS8qIDI4LTMwICovCit9OworCisvKiBUaGlzIGlzIHRoZSBtYWluIGZ1bmN0aW9uLCBwcmludCBvdXQgYW4KKyAqIEFTTjFfU1RSSU5HIHRha2luZyBub3RlIG9mIHZhcmlvdXMgZXNjYXBlCisgKiBhbmQgZGlzcGxheSBvcHRpb25zLiBSZXR1cm5zIG51bWJlciBvZgorICogY2hhcmFjdGVycyB3cml0dGVuIG9yIC0xIGlmIGFuIGVycm9yCisgKiBvY2N1cnJlZC4KKyAqLworCitzdGF0aWMgaW50IGRvX3ByaW50X2V4KGNoYXJfaW8gKmlvX2NoLCB2b2lkICphcmcsIHVuc2lnbmVkIGxvbmcgbGZsYWdzLCBBU04xX1NUUklORyAqc3RyKQoreworCWludCBvdXRsZW4sIGxlbjsKKwlpbnQgdHlwZTsKKwljaGFyIHF1b3RlczsKKwl1bnNpZ25lZCBjaGFyIGZsYWdzOworCXF1b3RlcyA9IDA7CisJLyogS2VlcCBhIGNvcHkgb2YgZXNjYXBlIGZsYWdzICovCisJZmxhZ3MgPSAodW5zaWduZWQgY2hhcikobGZsYWdzICYgRVNDX0ZMQUdTKTsKKworCXR5cGUgPSBzdHItPnR5cGU7CisKKwlvdXRsZW4gPSAwOworCisKKwlpZihsZmxhZ3MgJiBBU04xX1NUUkZMR1NfU0hPV19UWVBFKSB7CisJCWNvbnN0IGNoYXIgKnRhZ25hbWU7CisJCXRhZ25hbWUgPSBBU04xX3RhZzJzdHIodHlwZSk7CisJCW91dGxlbiArPSBzdHJsZW4odGFnbmFtZSk7CisJCWlmKCFpb19jaChhcmcsIHRhZ25hbWUsIG91dGxlbikgfHwgIWlvX2NoKGFyZywgIjoiLCAxKSkgcmV0dXJuIC0xOyAKKwkJb3V0bGVuKys7CisJfQorCisJLyogRGVjaWRlIHdoYXQgdG8gZG8gd2l0aCB0eXBlLCBlaXRoZXIgZHVtcCBjb250ZW50IG9yIGRpc3BsYXkgaXQgKi8KKworCS8qIER1bXAgZXZlcnl0aGluZyAqLworCWlmKGxmbGFncyAmIEFTTjFfU1RSRkxHU19EVU1QX0FMTCkgdHlwZSA9IC0xOworCS8qIElnbm9yZSB0aGUgc3RyaW5nIHR5cGUgKi8KKwllbHNlIGlmKGxmbGFncyAmIEFTTjFfU1RSRkxHU19JR05PUkVfVFlQRSkgdHlwZSA9IDE7CisJZWxzZSB7CisJCS8qIEVsc2UgZGV0ZXJtaW5lIHdpZHRoIGJhc2VkIG9uIHR5cGUgKi8KKwkJaWYoKHR5cGUgPiAwKSAmJiAodHlwZSA8IDMxKSkgdHlwZSA9IHRhZzJuYnl0ZVt0eXBlXTsKKwkJZWxzZSB0eXBlID0gLTE7CisJCWlmKCh0eXBlID09IC0xKSAmJiAhKGxmbGFncyAmIEFTTjFfU1RSRkxHU19EVU1QX1VOS05PV04pKSB0eXBlID0gMTsKKwl9CisKKwlpZih0eXBlID09IC0xKSB7CisJCWxlbiA9IGRvX2R1bXAobGZsYWdzLCBpb19jaCwgYXJnLCBzdHIpOworCQlpZihsZW4gPCAwKSByZXR1cm4gLTE7CisJCW91dGxlbiArPSBsZW47CisJCXJldHVybiBvdXRsZW47CisJfQorCisJaWYobGZsYWdzICYgQVNOMV9TVFJGTEdTX1VURjhfQ09OVkVSVCkgeworCQkvKiBOb3RlOiBpZiBzdHJpbmcgaXMgVVRGOCBhbmQgd2Ugd2FudAorCQkgKiB0byBjb252ZXJ0IHRvIFVURjggdGhlbiB3ZSBqdXN0IGludGVycHJldAorCQkgKiBpdCBhcyAxIGJ5dGUgcGVyIGNoYXJhY3RlciB0byBhdm9pZCBjb252ZXJ0aW5nCisJCSAqIHR3aWNlLgorCQkgKi8KKwkJaWYoIXR5cGUpIHR5cGUgPSAxOworCQllbHNlIHR5cGUgfD0gQlVGX1RZUEVfQ09OVlVURjg7CisJfQorCisJbGVuID0gZG9fYnVmKHN0ci0+ZGF0YSwgc3RyLT5sZW5ndGgsIHR5cGUsIGZsYWdzLCAmcXVvdGVzLCBpb19jaCwgTlVMTCk7CisJaWYobGVuIDwgMCkgcmV0dXJuIC0xOworCW91dGxlbiArPSBsZW47CisJaWYocXVvdGVzKSBvdXRsZW4gKz0gMjsKKwlpZighYXJnKSByZXR1cm4gb3V0bGVuOworCWlmKHF1b3RlcyAmJiAhaW9fY2goYXJnLCAiXCIiLCAxKSkgcmV0dXJuIC0xOworCWlmKGRvX2J1ZihzdHItPmRhdGEsIHN0ci0+bGVuZ3RoLCB0eXBlLCBmbGFncywgTlVMTCwgaW9fY2gsIGFyZykgPCAwKQorCQlyZXR1cm4gLTE7CisJaWYocXVvdGVzICYmICFpb19jaChhcmcsICJcIiIsIDEpKSByZXR1cm4gLTE7CisJcmV0dXJuIG91dGxlbjsKK30KKworLyogVXNlZCBmb3IgbGluZSBpbmRlbnRpbmc6IHByaW50ICdpbmRlbnQnIHNwYWNlcyAqLworCitzdGF0aWMgaW50IGRvX2luZGVudChjaGFyX2lvICppb19jaCwgdm9pZCAqYXJnLCBpbnQgaW5kZW50KQoreworCWludCBpOworCWZvcihpID0gMDsgaSA8IGluZGVudDsgaSsrKQorCQkJaWYoIWlvX2NoKGFyZywgIiAiLCAxKSkgcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUgRk5fV0lEVEhfTE4JMjUKKyNkZWZpbmUgRk5fV0lEVEhfU04JMTAKKworc3RhdGljIGludCBkb19uYW1lX2V4KGNoYXJfaW8gKmlvX2NoLCB2b2lkICphcmcsIFg1MDlfTkFNRSAqbiwKKwkJCQlpbnQgaW5kZW50LCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCWludCBpLCBwcmV2ID0gLTEsIG9yZmxhZ3MsIGNudDsKKwlpbnQgZm5fb3B0LCBmbl9uaWQ7CisJQVNOMV9PQkpFQ1QgKmZuOworCUFTTjFfU1RSSU5HICp2YWw7CisJWDUwOV9OQU1FX0VOVFJZICplbnQ7CisJY2hhciBvYmp0bXBbODBdOworCWNvbnN0IGNoYXIgKm9iamJ1ZjsKKwlpbnQgb3V0bGVuLCBsZW47CisJY2hhciAqc2VwX2RuLCAqc2VwX212LCAqc2VwX2VxOworCWludCBzZXBfZG5fbGVuLCBzZXBfbXZfbGVuLCBzZXBfZXFfbGVuOworCWlmKGluZGVudCA8IDApIGluZGVudCA9IDA7CisJb3V0bGVuID0gaW5kZW50OworCWlmKCFkb19pbmRlbnQoaW9fY2gsIGFyZywgaW5kZW50KSkgcmV0dXJuIC0xOworCXN3aXRjaCAoZmxhZ3MgJiBYTl9GTEFHX1NFUF9NQVNLKQorCXsKKwkJY2FzZSBYTl9GTEFHX1NFUF9NVUxUSUxJTkU6CisJCXNlcF9kbiA9ICJcbiI7CisJCXNlcF9kbl9sZW4gPSAxOworCQlzZXBfbXYgPSAiICsgIjsKKwkJc2VwX212X2xlbiA9IDM7CisJCWJyZWFrOworCisJCWNhc2UgWE5fRkxBR19TRVBfQ09NTUFfUExVUzoKKwkJc2VwX2RuID0gIiwiOworCQlzZXBfZG5fbGVuID0gMTsKKwkJc2VwX212ID0gIisiOworCQlzZXBfbXZfbGVuID0gMTsKKwkJaW5kZW50ID0gMDsKKwkJYnJlYWs7CisKKwkJY2FzZSBYTl9GTEFHX1NFUF9DUExVU19TUEM6CisJCXNlcF9kbiA9ICIsICI7CisJCXNlcF9kbl9sZW4gPSAyOworCQlzZXBfbXYgPSAiICsgIjsKKwkJc2VwX212X2xlbiA9IDM7CisJCWluZGVudCA9IDA7CisJCWJyZWFrOworCisJCWNhc2UgWE5fRkxBR19TRVBfU1BMVVNfU1BDOgorCQlzZXBfZG4gPSAiOyAiOworCQlzZXBfZG5fbGVuID0gMjsKKwkJc2VwX212ID0gIiArICI7CisJCXNlcF9tdl9sZW4gPSAzOworCQlpbmRlbnQgPSAwOworCQlicmVhazsKKworCQlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJfQorCisJaWYoZmxhZ3MgJiBYTl9GTEFHX1NQQ19FUSkgeworCQlzZXBfZXEgPSAiID0gIjsKKwkJc2VwX2VxX2xlbiA9IDM7CisJfSBlbHNlIHsKKwkJc2VwX2VxID0gIj0iOworCQlzZXBfZXFfbGVuID0gMTsKKwl9CisKKwlmbl9vcHQgPSBmbGFncyAmIFhOX0ZMQUdfRk5fTUFTSzsKKworCWNudCA9IFg1MDlfTkFNRV9lbnRyeV9jb3VudChuKTsJCisJZm9yKGkgPSAwOyBpIDwgY250OyBpKyspIHsKKwkJaWYoZmxhZ3MgJiBYTl9GTEFHX0ROX1JFVikKKwkJCQllbnQgPSBYNTA5X05BTUVfZ2V0X2VudHJ5KG4sIGNudCAtIGkgLSAxKTsKKwkJZWxzZSBlbnQgPSBYNTA5X05BTUVfZ2V0X2VudHJ5KG4sIGkpOworCQlpZihwcmV2ICE9IC0xKSB7CisJCQlpZihwcmV2ID09IGVudC0+c2V0KSB7CisJCQkJaWYoIWlvX2NoKGFyZywgc2VwX212LCBzZXBfbXZfbGVuKSkgcmV0dXJuIC0xOworCQkJCW91dGxlbiArPSBzZXBfbXZfbGVuOworCQkJfSBlbHNlIHsKKwkJCQlpZighaW9fY2goYXJnLCBzZXBfZG4sIHNlcF9kbl9sZW4pKSByZXR1cm4gLTE7CisJCQkJb3V0bGVuICs9IHNlcF9kbl9sZW47CisJCQkJaWYoIWRvX2luZGVudChpb19jaCwgYXJnLCBpbmRlbnQpKSByZXR1cm4gLTE7CisJCQkJb3V0bGVuICs9IGluZGVudDsKKwkJCX0KKwkJfQorCQlwcmV2ID0gZW50LT5zZXQ7CisJCWZuID0gWDUwOV9OQU1FX0VOVFJZX2dldF9vYmplY3QoZW50KTsKKwkJdmFsID0gWDUwOV9OQU1FX0VOVFJZX2dldF9kYXRhKGVudCk7CisJCWZuX25pZCA9IE9CSl9vYmoybmlkKGZuKTsKKwkJaWYoZm5fb3B0ICE9IFhOX0ZMQUdfRk5fTk9ORSkgeworCQkJaW50IG9iamxlbiwgZmxkX2xlbjsKKwkJCWlmKChmbl9vcHQgPT0gWE5fRkxBR19GTl9PSUQpIHx8IChmbl9uaWQ9PU5JRF91bmRlZikgKSB7CisJCQkJT0JKX29iajJ0eHQob2JqdG1wLCBzaXplb2Ygb2JqdG1wLCBmbiwgMSk7CisJCQkJZmxkX2xlbiA9IDA7IC8qIFhYWDogd2hhdCBzaG91bGQgdGhpcyBiZT8gKi8KKwkJCQlvYmpidWYgPSBvYmp0bXA7CisJCQl9IGVsc2UgeworCQkJCWlmKGZuX29wdCA9PSBYTl9GTEFHX0ZOX1NOKSB7CisJCQkJCWZsZF9sZW4gPSBGTl9XSURUSF9TTjsKKwkJCQkJb2JqYnVmID0gT0JKX25pZDJzbihmbl9uaWQpOworCQkJCX0gZWxzZSBpZihmbl9vcHQgPT0gWE5fRkxBR19GTl9MTikgeworCQkJCQlmbGRfbGVuID0gRk5fV0lEVEhfTE47CisJCQkJCW9iamJ1ZiA9IE9CSl9uaWQybG4oZm5fbmlkKTsKKwkJCQl9IGVsc2UgeworCQkJCQlmbGRfbGVuID0gMDsgLyogWFhYOiB3aGF0IHNob3VsZCB0aGlzIGJlPyAqLworCQkJCQlvYmpidWYgPSAiIjsKKwkJCQl9CisJCQl9CisJCQlvYmpsZW4gPSBzdHJsZW4ob2JqYnVmKTsKKwkJCWlmKCFpb19jaChhcmcsIG9iamJ1Ziwgb2JqbGVuKSkgcmV0dXJuIC0xOworCQkJaWYgKChvYmpsZW4gPCBmbGRfbGVuKSAmJiAoZmxhZ3MgJiBYTl9GTEFHX0ZOX0FMSUdOKSkgeworCQkJCWlmICghZG9faW5kZW50KGlvX2NoLCBhcmcsIGZsZF9sZW4gLSBvYmpsZW4pKSByZXR1cm4gLTE7CisJCQkJb3V0bGVuICs9IGZsZF9sZW4gLSBvYmpsZW47CisJCQl9CisJCQlpZighaW9fY2goYXJnLCBzZXBfZXEsIHNlcF9lcV9sZW4pKSByZXR1cm4gLTE7CisJCQlvdXRsZW4gKz0gb2JqbGVuICsgc2VwX2VxX2xlbjsKKwkJfQorCQkvKiBJZiB0aGUgZmllbGQgbmFtZSBpcyB1bmtub3duIHRoZW4gZml4IHVwIHRoZSBERVIgZHVtcAorCQkgKiBmbGFnLiBXZSBtaWdodCB3YW50IHRvIGxpbWl0IHRoaXMgZnVydGhlciBzbyBpdCB3aWxsCisgCQkgKiBERVIgZHVtcCBvbiBhbnl0aGluZyBvdGhlciB0aGFuIGEgZmV3ICdzdGFuZGFyZCcgZmllbGRzLgorCQkgKi8KKwkJaWYoKGZuX25pZCA9PSBOSURfdW5kZWYpICYmIChmbGFncyAmIFhOX0ZMQUdfRFVNUF9VTktOT1dOX0ZJRUxEUykpIAorCQkJCQlvcmZsYWdzID0gQVNOMV9TVFJGTEdTX0RVTVBfQUxMOworCQllbHNlIG9yZmxhZ3MgPSAwOworICAgICAKKwkJbGVuID0gZG9fcHJpbnRfZXgoaW9fY2gsIGFyZywgZmxhZ3MgfCBvcmZsYWdzLCB2YWwpOworCQlpZihsZW4gPCAwKSByZXR1cm4gLTE7CisJCW91dGxlbiArPSBsZW47CisJfQorCXJldHVybiBvdXRsZW47Cit9CisKKy8qIFdyYXBwZXJzIHJvdW5kIHRoZSBtYWluIGZ1bmN0aW9ucyAqLworCitpbnQgWDUwOV9OQU1FX3ByaW50X2V4KEJJTyAqb3V0LCBYNTA5X05BTUUgKm5tLCBpbnQgaW5kZW50LCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCWlmKGZsYWdzID09IFhOX0ZMQUdfQ09NUEFUKQorCQlyZXR1cm4gWDUwOV9OQU1FX3ByaW50KG91dCwgbm0sIGluZGVudCk7CisJcmV0dXJuIGRvX25hbWVfZXgoc2VuZF9iaW9fY2hhcnMsIG91dCwgbm0sIGluZGVudCwgZmxhZ3MpOworfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitpbnQgWDUwOV9OQU1FX3ByaW50X2V4X2ZwKEZJTEUgKmZwLCBYNTA5X05BTUUgKm5tLCBpbnQgaW5kZW50LCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCWlmKGZsYWdzID09IFhOX0ZMQUdfQ09NUEFUKQorCQl7CisJCUJJTyAqYnRtcDsKKwkJaW50IHJldDsKKwkJYnRtcCA9IEJJT19uZXdfZnAoZnAsIEJJT19OT0NMT1NFKTsKKwkJaWYoIWJ0bXApIHJldHVybiAtMTsKKwkJcmV0ID0gWDUwOV9OQU1FX3ByaW50KGJ0bXAsIG5tLCBpbmRlbnQpOworCQlCSU9fZnJlZShidG1wKTsKKwkJcmV0dXJuIHJldDsKKwkJfQorCXJldHVybiBkb19uYW1lX2V4KHNlbmRfZnBfY2hhcnMsIGZwLCBubSwgaW5kZW50LCBmbGFncyk7Cit9CisjZW5kaWYKKworaW50IEFTTjFfU1RSSU5HX3ByaW50X2V4KEJJTyAqb3V0LCBBU04xX1NUUklORyAqc3RyLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXJldHVybiBkb19wcmludF9leChzZW5kX2Jpb19jaGFycywgb3V0LCBmbGFncywgc3RyKTsKK30KKworI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQoraW50IEFTTjFfU1RSSU5HX3ByaW50X2V4X2ZwKEZJTEUgKmZwLCBBU04xX1NUUklORyAqc3RyLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXJldHVybiBkb19wcmludF9leChzZW5kX2ZwX2NoYXJzLCBmcCwgZmxhZ3MsIHN0cik7Cit9CisjZW5kaWYKKworLyogVXRpbGl0eSBmdW5jdGlvbjogY29udmVydCBhbnkgc3RyaW5nIHR5cGUgdG8gVVRGOCwgcmV0dXJucyBudW1iZXIgb2YgYnl0ZXMKKyAqIGluIG91dHB1dCBzdHJpbmcgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlCisgKi8KKworaW50IEFTTjFfU1RSSU5HX3RvX1VURjgodW5zaWduZWQgY2hhciAqKm91dCwgQVNOMV9TVFJJTkcgKmluKQoreworCUFTTjFfU1RSSU5HIHN0bXAsICpzdHIgPSAmc3RtcDsKKwlpbnQgbWJmbGFnLCB0eXBlLCByZXQ7CisJaWYoIWluKSByZXR1cm4gLTE7CisJdHlwZSA9IGluLT50eXBlOworCWlmKCh0eXBlIDwgMCkgfHwgKHR5cGUgPiAzMCkpIHJldHVybiAtMTsKKwltYmZsYWcgPSB0YWcybmJ5dGVbdHlwZV07CisJaWYobWJmbGFnID09IC0xKSByZXR1cm4gLTE7CisJbWJmbGFnIHw9IE1CU1RSSU5HX0ZMQUc7CisJc3RtcC5kYXRhID0gTlVMTDsKKwlzdG1wLmxlbmd0aCA9IDA7CisJcmV0ID0gQVNOMV9tYnN0cmluZ19jb3B5KCZzdHIsIGluLT5kYXRhLCBpbi0+bGVuZ3RoLCBtYmZsYWcsIEJfQVNOMV9VVEY4U1RSSU5HKTsKKwlpZihyZXQgPCAwKSByZXR1cm4gcmV0OworCSpvdXQgPSBzdG1wLmRhdGE7CisJcmV0dXJuIHN0bXAubGVuZ3RoOworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3g1MDkvYV92ZXJpZnkuYyBiL2NyeXB0by94NTA5L2FfdmVyaWZ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJlY2UzOAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94NTA5L2FfdmVyaWZ5LmMKQEAgLTAsMCArMSwxNjkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYnVmLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9kaWdlc3QuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgorCisjaW5jbHVkZSAiLi4vZXZwL2ludGVybmFsLmgiCisKKworaW50IEFTTjFfaXRlbV92ZXJpZnkoY29uc3QgQVNOMV9JVEVNICppdCwgWDUwOV9BTEdPUiAqYSwKKwkJQVNOMV9CSVRfU1RSSU5HICpzaWduYXR1cmUsIHZvaWQgKmFzbiwgRVZQX1BLRVkgKnBrZXkpCisJeworCUVWUF9NRF9DVFggY3R4OworCXVuc2lnbmVkIGNoYXIgKmJ1Zl9pbj1OVUxMOworCWludCByZXQ9IC0xLGlubDsKKwljb25zdCBFVlBfUEtFWV9BU04xX01FVEhPRCAqYW1ldGg7CisKKwlpbnQgbWRuaWQsIHBrbmlkOworCisJRVZQX01EX0NUWF9pbml0KCZjdHgpOworCisJLyogQ29udmVydCBzaWduYXR1cmUgT0lEIGludG8gZGlnZXN0IGFuZCBwdWJsaWMga2V5IE9JRHMgKi8KKwlpZiAoIU9CSl9maW5kX3NpZ2lkX2FsZ3MoT0JKX29iajJuaWQoYS0+YWxnb3JpdGhtKSwgJm1kbmlkLCAmcGtuaWQpKQorCQl7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEFTTjFfaXRlbV92ZXJpZnksIEFTTjFfUl9VTktOT1dOX1NJR05BVFVSRV9BTEdPUklUSE0pOworCQlnb3RvIGVycjsKKwkJfQorCWlmIChtZG5pZCA9PSBOSURfdW5kZWYpCisJCXsKKwkJaWYgKCFwa2V5LT5hbWV0aCB8fCAhcGtleS0+YW1ldGgtPml0ZW1fdmVyaWZ5KQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgQVNOMV9pdGVtX3ZlcmlmeSwgQVNOMV9SX1VOS05PV05fU0lHTkFUVVJFX0FMR09SSVRITSk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJcmV0ID0gcGtleS0+YW1ldGgtPml0ZW1fdmVyaWZ5KCZjdHgsIGl0LCBhc24sIGEsCisJCQkJCQkJc2lnbmF0dXJlLCBwa2V5KTsKKwkJLyogUmV0dXJuIHZhbHVlIG9mIDIgbWVhbnMgY2Fycnkgb24sIGFueXRoaW5nIGVsc2UgbWVhbnMgd2UKKwkJICogZXhpdCBzdHJhaWdodCBhd2F5OiBlaXRoZXIgYSBmYXRhbCBlcnJvciBvZiB0aGUgdW5kZXJseWluZworCQkgKiB2ZXJpZmljYXRpb24gcm91dGluZSBoYW5kbGVzIGFsbCB2ZXJpZmljYXRpb24uCisJCSAqLworCQlpZiAocmV0ICE9IDIpCisJCQlnb3RvIGVycjsKKwkJcmV0ID0gLTE7CisJCX0KKwllbHNlCisJCXsKKwkJY29uc3QgRVZQX01EICp0eXBlOworCQl0eXBlPUVWUF9nZXRfZGlnZXN0YnluaWQobWRuaWQpOworCQlpZiAodHlwZSA9PSBOVUxMKQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgQVNOMV9pdGVtX3ZlcmlmeSwgQVNOMV9SX1VOS05PV05fTUVTU0FHRV9ESUdFU1RfQUxHT1JJVEhNKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCisJCS8qIENoZWNrIHB1YmxpYyBrZXkgT0lEIG1hdGNoZXMgcHVibGljIGtleSB0eXBlICovCisJCWFtZXRoID0gRVZQX1BLRVlfYXNuMV9maW5kKE5VTEwsIHBrbmlkKTsKKwkJaWYgKGFtZXRoID09IE5VTEwgfHwgYW1ldGgtPnBrZXlfaWQgIT0gcGtleS0+YW1ldGgtPnBrZXlfaWQpCisJCQl7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBBU04xX2l0ZW1fdmVyaWZ5LCBBU04xX1JfV1JPTkdfUFVCTElDX0tFWV9UWVBFKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCisJCWlmICghRVZQX0RpZ2VzdFZlcmlmeUluaXQoJmN0eCwgTlVMTCwgdHlwZSwgTlVMTCwgcGtleSkpCisJCQl7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBBU04xX2l0ZW1fdmVyaWZ5LCBFUlJfUl9FVlBfTElCKTsKKwkJCXJldD0wOworCQkJZ290byBlcnI7CisJCQl9CisKKwkJfQorCisJaW5sID0gQVNOMV9pdGVtX2kyZChhc24sICZidWZfaW4sIGl0KTsKKwkKKwlpZiAoYnVmX2luID09IE5VTEwpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgQVNOMV9pdGVtX3ZlcmlmeSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKCFFVlBfRGlnZXN0VmVyaWZ5VXBkYXRlKCZjdHgsYnVmX2luLGlubCkpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgQVNOMV9pdGVtX3ZlcmlmeSwgRVJSX1JfRVZQX0xJQik7CisJCXJldD0wOworCQlnb3RvIGVycjsKKwkJfQorCisJT1BFTlNTTF9jbGVhbnNlKGJ1Zl9pbiwodW5zaWduZWQgaW50KWlubCk7CisJT1BFTlNTTF9mcmVlKGJ1Zl9pbik7CisKKwlpZiAoRVZQX0RpZ2VzdFZlcmlmeUZpbmFsKCZjdHgsc2lnbmF0dXJlLT5kYXRhLAorCQkJKHNpemVfdClzaWduYXR1cmUtPmxlbmd0aCkgPD0gMCkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBBU04xX2l0ZW1fdmVyaWZ5LCBFUlJfUl9FVlBfTElCKTsKKwkJcmV0PTA7CisJCWdvdG8gZXJyOworCQl9CisJLyogd2UgZG9uJ3QgbmVlZCB0byB6ZXJvIHRoZSAnY3R4JyBiZWNhdXNlIHdlIGp1c3QgY2hlY2tlZAorCSAqIHB1YmxpYyBpbmZvcm1hdGlvbiAqLworCS8qIG1lbXNldCgmY3R4LDAsc2l6ZW9mKGN0eCkpOyAqLworCXJldD0xOworZXJyOgorCUVWUF9NRF9DVFhfY2xlYW51cCgmY3R4KTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKZGlmZiAtLWdpdCBhL2NyeXB0by94NTA5L2FzbjFfZ2VuLmMgYi9jcnlwdG8veDUwOS9hc24xX2dlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZGMxYTMKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOS9hc24xX2dlbi5jCkBAIC0wLDAgKzEsODU3IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorCisKKyNkZWZpbmUgQVNOMV9HRU5fRkxBRwkJMHgxMDAwMAorI2RlZmluZSBBU04xX0dFTl9GTEFHX0lNUAkoQVNOMV9HRU5fRkxBR3wxKQorI2RlZmluZSBBU04xX0dFTl9GTEFHX0VYUAkoQVNOMV9HRU5fRkxBR3wyKQorI2RlZmluZSBBU04xX0dFTl9GTEFHX1RBRwkoQVNOMV9HRU5fRkxBR3wzKQorI2RlZmluZSBBU04xX0dFTl9GTEFHX0JJVFdSQVAJKEFTTjFfR0VOX0ZMQUd8NCkKKyNkZWZpbmUgQVNOMV9HRU5fRkxBR19PQ1RXUkFQCShBU04xX0dFTl9GTEFHfDUpCisjZGVmaW5lIEFTTjFfR0VOX0ZMQUdfU0VRV1JBUAkoQVNOMV9HRU5fRkxBR3w2KQorI2RlZmluZSBBU04xX0dFTl9GTEFHX1NFVFdSQVAJKEFTTjFfR0VOX0ZMQUd8NykKKyNkZWZpbmUgQVNOMV9HRU5fRkxBR19GT1JNQVQJKEFTTjFfR0VOX0ZMQUd8OCkKKworI2RlZmluZSBBU04xX0dFTl9TVFIoc3RyLHZhbCkJe3N0ciwgc2l6ZW9mKHN0cikgLSAxLCB2YWx9CisKKyNkZWZpbmUgQVNOMV9GTEFHX0VYUF9NQVgJMjAKKworLyogSW5wdXQgZm9ybWF0cyAqLworCisvKiBBU0NJSTogZGVmYXVsdCAqLworI2RlZmluZSBBU04xX0dFTl9GT1JNQVRfQVNDSUkJMQorLyogVVRGOCAqLworI2RlZmluZSBBU04xX0dFTl9GT1JNQVRfVVRGOAkyCisvKiBIZXggKi8KKyNkZWZpbmUgQVNOMV9HRU5fRk9STUFUX0hFWAkzCisvKiBMaXN0IG9mIGJpdHMgKi8KKyNkZWZpbmUgQVNOMV9HRU5fRk9STUFUX0JJVExJU1QJNAorCisKK3N0cnVjdCB0YWdfbmFtZV9zdAorCXsKKwljb25zdCBjaGFyICpzdHJuYW07CisJaW50IGxlbjsKKwlpbnQgdGFnOworCX07CisKK3R5cGVkZWYgc3RydWN0CisJeworCWludCBleHBfdGFnOworCWludCBleHBfY2xhc3M7CisJaW50IGV4cF9jb25zdHJ1Y3RlZDsKKwlpbnQgZXhwX3BhZDsKKwlsb25nIGV4cF9sZW47CisJfSB0YWdfZXhwX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0CisJeworCWludCBpbXBfdGFnOworCWludCBpbXBfY2xhc3M7CisJaW50IHV0eXBlOworCWludCBmb3JtYXQ7CisJY29uc3QgY2hhciAqc3RyOworCXRhZ19leHBfdHlwZSBleHBfbGlzdFtBU04xX0ZMQUdfRVhQX01BWF07CisJaW50IGV4cF9jb3VudDsKKwl9IHRhZ19leHBfYXJnOworCitzdGF0aWMgaW50IGJpdHN0cl9jYihjb25zdCBjaGFyICplbGVtLCBpbnQgbGVuLCB2b2lkICpiaXRzdHIpOworc3RhdGljIGludCBhc24xX2NiKGNvbnN0IGNoYXIgKmVsZW0sIGludCBsZW4sIHZvaWQgKmJpdHN0cik7CitzdGF0aWMgaW50IGFwcGVuZF9leHAodGFnX2V4cF9hcmcgKmFyZywgaW50IGV4cF90YWcsIGludCBleHBfY2xhc3MsIGludCBleHBfY29uc3RydWN0ZWQsIGludCBleHBfcGFkLCBpbnQgaW1wX29rKTsKK3N0YXRpYyBpbnQgcGFyc2VfdGFnZ2luZyhjb25zdCBjaGFyICp2c3RhcnQsIGludCB2bGVuLCBpbnQgKnB0YWcsIGludCAqcGNsYXNzKTsKK3N0YXRpYyBBU04xX1RZUEUgKmFzbjFfbXVsdGkoaW50IHV0eXBlLCBjb25zdCBjaGFyICpzZWN0aW9uLCBYNTA5VjNfQ1RYICpjbmYpOworc3RhdGljIEFTTjFfVFlQRSAqYXNuMV9zdHIydHlwZShjb25zdCBjaGFyICpzdHIsIGludCBmb3JtYXQsIGludCB1dHlwZSk7CitzdGF0aWMgaW50IGFzbjFfc3RyMnRhZyhjb25zdCBjaGFyICp0YWdzdHIsIGludCBsZW4pOworCitBU04xX1RZUEUgKkFTTjFfZ2VuZXJhdGVfbmNvbmYoY2hhciAqc3RyLCBDT05GICpuY29uZikKKwl7CisJWDUwOVYzX0NUWCBjbmY7CisKKwlpZiAoIW5jb25mKQorCQlyZXR1cm4gQVNOMV9nZW5lcmF0ZV92MyhzdHIsIE5VTEwpOworCisJWDUwOVYzX3NldF9uY29uZigmY25mLCBuY29uZik7CisJcmV0dXJuIEFTTjFfZ2VuZXJhdGVfdjMoc3RyLCAmY25mKTsKKwl9CisKK0FTTjFfVFlQRSAqQVNOMV9nZW5lcmF0ZV92MyhjaGFyICpzdHIsIFg1MDlWM19DVFggKmNuZikKKwl7CisJQVNOMV9UWVBFICpyZXQ7CisJdGFnX2V4cF9hcmcgYXNuMV90YWdzOworCXRhZ19leHBfdHlwZSAqZXRtcDsKKworCWludCBpLCBsZW47CisKKwl1bnNpZ25lZCBjaGFyICpvcmlnX2RlciA9IE5VTEwsICpuZXdfZGVyID0gTlVMTDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpjcHlfc3RhcnQ7CisJdW5zaWduZWQgY2hhciAqcDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpjcDsKKwlpbnQgY3B5X2xlbjsKKwlsb25nIGhkcl9sZW47CisJaW50IGhkcl9jb25zdHJ1Y3RlZCA9IDAsIGhkcl90YWcsIGhkcl9jbGFzczsKKwlpbnQgcjsKKworCWFzbjFfdGFncy5pbXBfdGFnID0gLTE7CisJYXNuMV90YWdzLmltcF9jbGFzcyA9IC0xOworCWFzbjFfdGFncy5mb3JtYXQgPSBBU04xX0dFTl9GT1JNQVRfQVNDSUk7CisJYXNuMV90YWdzLmV4cF9jb3VudCA9IDA7CisJaWYgKENPTkZfcGFyc2VfbGlzdChzdHIsICcsJywgMSwgYXNuMV9jYiwgJmFzbjFfdGFncykgIT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoKGFzbjFfdGFncy51dHlwZSA9PSBWX0FTTjFfU0VRVUVOQ0UpIHx8IChhc24xX3RhZ3MudXR5cGUgPT0gVl9BU04xX1NFVCkpCisJCXsKKwkJaWYgKCFjbmYpCisJCQl7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBBU04xX2dlbmVyYXRlX3YzLCBBU04xX1JfU0VRVUVOQ0VfT1JfU0VUX05FRURTX0NPTkZJRyk7CisJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJcmV0ID0gYXNuMV9tdWx0aShhc24xX3RhZ3MudXR5cGUsIGFzbjFfdGFncy5zdHIsIGNuZik7CisJCX0KKwllbHNlCisJCXJldCA9IGFzbjFfc3RyMnR5cGUoYXNuMV90YWdzLnN0ciwgYXNuMV90YWdzLmZvcm1hdCwgYXNuMV90YWdzLnV0eXBlKTsKKworCWlmICghcmV0KQorCQlyZXR1cm4gTlVMTDsKKworCS8qIElmIG5vIHRhZ2dpbmcgcmV0dXJuIGJhc2UgdHlwZSAqLworCWlmICgoYXNuMV90YWdzLmltcF90YWcgPT0gLTEpICYmIChhc24xX3RhZ3MuZXhwX2NvdW50ID09IDApKQorCQlyZXR1cm4gcmV0OworCisJLyogR2VuZXJhdGUgdGhlIGVuY29kaW5nICovCisJY3B5X2xlbiA9IGkyZF9BU04xX1RZUEUocmV0LCAmb3JpZ19kZXIpOworCUFTTjFfVFlQRV9mcmVlKHJldCk7CisJcmV0ID0gTlVMTDsKKwkvKiBTZXQgcG9pbnQgdG8gc3RhcnQgY29weWluZyBmb3IgbW9kaWZpZWQgZW5jb2RpbmcgKi8KKwljcHlfc3RhcnQgPSBvcmlnX2RlcjsKKworCS8qIERvIHdlIG5lZWQgSU1QTElDSVQgdGFnZ2luZz8gKi8KKwlpZiAoYXNuMV90YWdzLmltcF90YWcgIT0gLTEpCisJCXsKKwkJLyogSWYgSU1QTElDSVQgd2Ugd2lsbCByZXBsYWNlIHRoZSB1bmRlcmx5aW5nIHRhZyAqLworCQkvKiBTa2lwIGV4aXN0aW5nIHRhZytsZW4gKi8KKwkJciA9IEFTTjFfZ2V0X29iamVjdCgmY3B5X3N0YXJ0LCAmaGRyX2xlbiwgJmhkcl90YWcsICZoZHJfY2xhc3MsIGNweV9sZW4pOworCQlpZiAociAmIDB4ODApCisJCQlnb3RvIGVycjsKKwkJLyogVXBkYXRlIGNvcHkgbGVuZ3RoICovCisJCWNweV9sZW4gLT0gY3B5X3N0YXJ0IC0gb3JpZ19kZXI7CisJCS8qIEZvciBJTVBMSUNJVCB0YWdnaW5nIHRoZSBsZW5ndGggc2hvdWxkIG1hdGNoIHRoZQorCQkgKiBvcmlnaW5hbCBsZW5ndGggYW5kIGNvbnN0cnVjdGVkIGZsYWcgc2hvdWxkIGJlCisJCSAqIGNvbnNpc3RlbnQuCisJCSAqLworCQlpZiAociAmIDB4MSkKKwkJCXsKKwkJCS8qIEluZGVmaW5pdGUgbGVuZ3RoIGNvbnN0cnVjdGVkICovCisJCQloZHJfY29uc3RydWN0ZWQgPSAyOworCQkJaGRyX2xlbiA9IDA7CisJCQl9CisJCWVsc2UKKwkJCS8qIEp1c3QgcmV0YWluIGNvbnN0cnVjdGVkIGZsYWcgKi8KKwkJCWhkcl9jb25zdHJ1Y3RlZCA9IHIgJiBWX0FTTjFfQ09OU1RSVUNURUQ7CisJCS8qIFdvcmsgb3V0IG5ldyBsZW5ndGggd2l0aCBJTVBMSUNJVCB0YWc6IGlnbm9yZSBjb25zdHJ1Y3RlZAorCQkgKiBiZWNhdXNlIGl0IHdpbGwgbWVzcyB1cCBpZiBpbmRlZmluaXRlIGxlbmd0aAorCQkgKi8KKwkJbGVuID0gQVNOMV9vYmplY3Rfc2l6ZSgwLCBoZHJfbGVuLCBhc24xX3RhZ3MuaW1wX3RhZyk7CisJCX0KKwllbHNlCisJCWxlbiA9IGNweV9sZW47CisKKwkvKiBXb3JrIG91dCBsZW5ndGggaW4gYW55IEVYUExJQ0lULCBzdGFydGluZyBmcm9tIGVuZCAqLworCisJZm9yKGkgPSAwLCBldG1wID0gYXNuMV90YWdzLmV4cF9saXN0ICsgYXNuMV90YWdzLmV4cF9jb3VudCAtIDE7IGkgPCBhc24xX3RhZ3MuZXhwX2NvdW50OyBpKyssIGV0bXAtLSkKKwkJeworCQkvKiBDb250ZW50IGxlbmd0aDogbnVtYmVyIG9mIGNvbnRlbnQgb2N0ZXRzICsgYW55IHBhZGRpbmcgKi8KKwkJbGVuICs9IGV0bXAtPmV4cF9wYWQ7CisJCWV0bXAtPmV4cF9sZW4gPSBsZW47CisJCS8qIFRvdGFsIG9iamVjdCBsZW5ndGg6IGxlbmd0aCBpbmNsdWRpbmcgbmV3IGhlYWRlciAqLworCQlsZW4gPSBBU04xX29iamVjdF9zaXplKDAsIGxlbiwgZXRtcC0+ZXhwX3RhZyk7CisJCX0KKworCS8qIEFsbG9jYXRlIGJ1ZmZlciBmb3IgbmV3IGVuY29kaW5nICovCisKKwluZXdfZGVyID0gT1BFTlNTTF9tYWxsb2MobGVuKTsKKwlpZiAoIW5ld19kZXIpCisJCWdvdG8gZXJyOworCisJLyogR2VuZXJhdGUgdGFnZ2VkIGVuY29kaW5nICovCisKKwlwID0gbmV3X2RlcjsKKworCS8qIE91dHB1dCBleHBsaWNpdCB0YWdzIGZpcnN0ICovCisKKwlmb3IgKGkgPSAwLCBldG1wID0gYXNuMV90YWdzLmV4cF9saXN0OyBpIDwgYXNuMV90YWdzLmV4cF9jb3VudDsgaSsrLCBldG1wKyspCisJCXsKKwkJQVNOMV9wdXRfb2JqZWN0KCZwLCBldG1wLT5leHBfY29uc3RydWN0ZWQsIGV0bXAtPmV4cF9sZW4sCisJCQkJCWV0bXAtPmV4cF90YWcsIGV0bXAtPmV4cF9jbGFzcyk7CisJCWlmIChldG1wLT5leHBfcGFkKQorCQkJKnArKyA9IDA7CisJCX0KKworCS8qIElmIElNUExJQ0lULCBvdXRwdXQgdGFnICovCisKKwlpZiAoYXNuMV90YWdzLmltcF90YWcgIT0gLTEpCisJCXsKKwkJaWYgKGFzbjFfdGFncy5pbXBfY2xhc3MgPT0gVl9BU04xX1VOSVZFUlNBTCAKKwkJICAgICYmIChhc24xX3RhZ3MuaW1wX3RhZyA9PSBWX0FTTjFfU0VRVUVOQ0UKKwkJICAgICB8fCBhc24xX3RhZ3MuaW1wX3RhZyA9PSBWX0FTTjFfU0VUKSApCisJCQloZHJfY29uc3RydWN0ZWQgPSBWX0FTTjFfQ09OU1RSVUNURUQ7CisJCUFTTjFfcHV0X29iamVjdCgmcCwgaGRyX2NvbnN0cnVjdGVkLCBoZHJfbGVuLAorCQkJCQlhc24xX3RhZ3MuaW1wX3RhZywgYXNuMV90YWdzLmltcF9jbGFzcyk7CisJCX0KKworCS8qIENvcHkgYWNyb3NzIG9yaWdpbmFsIGVuY29kaW5nICovCisJbWVtY3B5KHAsIGNweV9zdGFydCwgY3B5X2xlbik7CisKKwljcCA9IG5ld19kZXI7CisKKwkvKiBPYnRhaW4gbmV3IEFTTjFfVFlQRSBzdHJ1Y3R1cmUgKi8KKwlyZXQgPSBkMmlfQVNOMV9UWVBFKE5VTEwsICZjcCwgbGVuKTsKKworCWVycjoKKwlpZiAob3JpZ19kZXIpCisJCU9QRU5TU0xfZnJlZShvcmlnX2Rlcik7CisJaWYgKG5ld19kZXIpCisJCU9QRU5TU0xfZnJlZShuZXdfZGVyKTsKKworCXJldHVybiByZXQ7CisKKwl9CisKK3N0YXRpYyBpbnQgYXNuMV9jYihjb25zdCBjaGFyICplbGVtLCBpbnQgbGVuLCB2b2lkICpiaXRzdHIpCisJeworCXRhZ19leHBfYXJnICphcmcgPSBiaXRzdHI7CisJaW50IGk7CisJaW50IHV0eXBlOworCWludCB2bGVuID0gMDsKKwljb25zdCBjaGFyICpwLCAqdnN0YXJ0ID0gTlVMTDsKKworCWludCB0bXBfdGFnLCB0bXBfY2xhc3M7CisKKwlmb3IoaSA9IDAsIHAgPSBlbGVtOyBpIDwgbGVuOyBwKyssIGkrKykKKwkJeworCQkvKiBMb29rIGZvciB0aGUgJzonIGluIG5hbWUgdmFsdWUgcGFpcnMgKi8KKwkJaWYgKCpwID09ICc6JykKKwkJCXsKKwkJCXZzdGFydCA9IHAgKyAxOworCQkJdmxlbiA9IGxlbiAtICh2c3RhcnQgLSBlbGVtKTsKKwkJCWxlbiA9IHAgLSBlbGVtOworCQkJYnJlYWs7CisJCQl9CisJCX0KKworCXV0eXBlID0gYXNuMV9zdHIydGFnKGVsZW0sIGxlbik7CisKKwlpZiAodXR5cGUgPT0gLTEpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgYXNuMV9jYiwgQVNOMV9SX1VOS05PV05fVEFHKTsKKwkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJ0YWc9IiwgZWxlbSk7CisJCXJldHVybiAtMTsKKwkJfQorCisJLyogSWYgdGhpcyBpcyBub3QgYSBtb2RpZmllciBtYXJrIGVuZCBvZiBzdHJpbmcgYW5kIGV4aXQgKi8KKwlpZiAoISh1dHlwZSAmIEFTTjFfR0VOX0ZMQUcpKQorCQl7CisJCWFyZy0+dXR5cGUgPSB1dHlwZTsKKwkJYXJnLT5zdHIgPSB2c3RhcnQ7CisJCS8qIElmIG5vIHZhbHVlIGFuZCBub3QgZW5kIG9mIHN0cmluZywgZXJyb3IgKi8KKwkJaWYgKCF2c3RhcnQgJiYgZWxlbVtsZW5dKQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgYXNuMV9jYiwgQVNOMV9SX01JU1NJTkdfVkFMVUUpOworCQkJcmV0dXJuIC0xOworCQkJfQorCQlyZXR1cm4gMDsKKwkJfQorCisJc3dpdGNoKHV0eXBlKQorCQl7CisKKwkJY2FzZSBBU04xX0dFTl9GTEFHX0lNUDoKKwkJLyogQ2hlY2sgZm9yIGlsbGVnYWwgbXVsdGlwbGUgSU1QTElDSVQgdGFnZ2luZyAqLworCQlpZiAoYXJnLT5pbXBfdGFnICE9IC0xKQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgYXNuMV9jYiwgQVNOMV9SX0lMTEVHQUxfTkVTVEVEX1RBR0dJTkcpOworCQkJcmV0dXJuIC0xOworCQkJfQorCQlpZiAoIXBhcnNlX3RhZ2dpbmcodnN0YXJ0LCB2bGVuLCAmYXJnLT5pbXBfdGFnLCAmYXJnLT5pbXBfY2xhc3MpKQorCQkJcmV0dXJuIC0xOworCQlicmVhazsKKworCQljYXNlIEFTTjFfR0VOX0ZMQUdfRVhQOgorCisJCWlmICghcGFyc2VfdGFnZ2luZyh2c3RhcnQsIHZsZW4sICZ0bXBfdGFnLCAmdG1wX2NsYXNzKSkKKwkJCXJldHVybiAtMTsKKwkJaWYgKCFhcHBlbmRfZXhwKGFyZywgdG1wX3RhZywgdG1wX2NsYXNzLCAxLCAwLCAwKSkKKwkJCXJldHVybiAtMTsKKwkJYnJlYWs7CisKKwkJY2FzZSBBU04xX0dFTl9GTEFHX1NFUVdSQVA6CisJCWlmICghYXBwZW5kX2V4cChhcmcsIFZfQVNOMV9TRVFVRU5DRSwgVl9BU04xX1VOSVZFUlNBTCwgMSwgMCwgMSkpCisJCQlyZXR1cm4gLTE7CisJCWJyZWFrOworCisJCWNhc2UgQVNOMV9HRU5fRkxBR19TRVRXUkFQOgorCQlpZiAoIWFwcGVuZF9leHAoYXJnLCBWX0FTTjFfU0VULCBWX0FTTjFfVU5JVkVSU0FMLCAxLCAwLCAxKSkKKwkJCXJldHVybiAtMTsKKwkJYnJlYWs7CisKKwkJY2FzZSBBU04xX0dFTl9GTEFHX0JJVFdSQVA6CisJCWlmICghYXBwZW5kX2V4cChhcmcsIFZfQVNOMV9CSVRfU1RSSU5HLCBWX0FTTjFfVU5JVkVSU0FMLCAwLCAxLCAxKSkKKwkJCXJldHVybiAtMTsKKwkJYnJlYWs7CisKKwkJY2FzZSBBU04xX0dFTl9GTEFHX09DVFdSQVA6CisJCWlmICghYXBwZW5kX2V4cChhcmcsIFZfQVNOMV9PQ1RFVF9TVFJJTkcsIFZfQVNOMV9VTklWRVJTQUwsIDAsIDAsIDEpKQorCQkJcmV0dXJuIC0xOworCQlicmVhazsKKworCQljYXNlIEFTTjFfR0VOX0ZMQUdfRk9STUFUOgorCQlpZiAoIXN0cm5jbXAodnN0YXJ0LCAiQVNDSUkiLCA1KSkKKwkJCWFyZy0+Zm9ybWF0ID0gQVNOMV9HRU5fRk9STUFUX0FTQ0lJOworCQllbHNlIGlmICghc3RybmNtcCh2c3RhcnQsICJVVEY4IiwgNCkpCisJCQlhcmctPmZvcm1hdCA9IEFTTjFfR0VOX0ZPUk1BVF9VVEY4OworCQllbHNlIGlmICghc3RybmNtcCh2c3RhcnQsICJIRVgiLCAzKSkKKwkJCWFyZy0+Zm9ybWF0ID0gQVNOMV9HRU5fRk9STUFUX0hFWDsKKwkJZWxzZSBpZiAoIXN0cm5jbXAodnN0YXJ0LCAiQklUTElTVCIsIDMpKQorCQkJYXJnLT5mb3JtYXQgPSBBU04xX0dFTl9GT1JNQVRfQklUTElTVDsKKwkJZWxzZQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgYXNuMV9jYiwgQVNOMV9SX1VOS09XTl9GT1JNQVQpOworCQkJcmV0dXJuIC0xOworCQkJfQorCQlicmVhazsKKworCQl9CisKKwlyZXR1cm4gMTsKKworCX0KKworc3RhdGljIGludCBwYXJzZV90YWdnaW5nKGNvbnN0IGNoYXIgKnZzdGFydCwgaW50IHZsZW4sIGludCAqcHRhZywgaW50ICpwY2xhc3MpCisJeworCWNoYXIgZXJjaFsyXTsKKwlsb25nIHRhZ19udW07CisJY2hhciAqZXB0cjsKKwlpZiAoIXZzdGFydCkKKwkJcmV0dXJuIDA7CisJdGFnX251bSA9IHN0cnRvdWwodnN0YXJ0LCAmZXB0ciwgMTApOworCS8qIENoZWNrIHdlIGhhdmVuJ3QgZ29uZSBwYXN0IG1heCBsZW5ndGg6IHNob3VsZCBiZSBpbXBvc3NpYmxlICovCisJaWYgKGVwdHIgJiYgKmVwdHIgJiYgKGVwdHIgPiB2c3RhcnQgKyB2bGVuKSkKKwkJcmV0dXJuIDA7CisJaWYgKHRhZ19udW0gPCAwKQorCQl7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIHBhcnNlX3RhZ2dpbmcsIEFTTjFfUl9JTlZBTElEX05VTUJFUik7CisJCXJldHVybiAwOworCQl9CisJKnB0YWcgPSB0YWdfbnVtOworCS8qIElmIHdlIGhhdmUgbm9uIG51bWVyaWMgY2hhcmFjdGVycywgcGFyc2UgdGhlbSAqLworCWlmIChlcHRyKQorCQl2bGVuIC09IGVwdHIgLSB2c3RhcnQ7CisJZWxzZSAKKwkJdmxlbiA9IDA7CisJaWYgKHZsZW4pCisJCXsKKwkJc3dpdGNoICgqZXB0cikKKwkJCXsKKworCQkJY2FzZSAnVSc6CisJCQkqcGNsYXNzID0gVl9BU04xX1VOSVZFUlNBTDsKKwkJCWJyZWFrOworCisJCQljYXNlICdBJzoKKwkJCSpwY2xhc3MgPSBWX0FTTjFfQVBQTElDQVRJT047CisJCQlicmVhazsKKworCQkJY2FzZSAnUCc6CisJCQkqcGNsYXNzID0gVl9BU04xX1BSSVZBVEU7CisJCQlicmVhazsKKworCQkJY2FzZSAnQyc6CisJCQkqcGNsYXNzID0gVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUM7CisJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCWVyY2hbMF0gPSAqZXB0cjsKKwkJCWVyY2hbMV0gPSAwOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgcGFyc2VfdGFnZ2luZywgQVNOMV9SX0lOVkFMSURfTU9ESUZJRVIpOworCQkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJDaGFyPSIsIGVyY2gpOworCQkJcmV0dXJuIDA7CisJCQlicmVhazsKKworCQkJfQorCQl9CisJZWxzZQorCQkqcGNsYXNzID0gVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUM7CisKKwlyZXR1cm4gMTsKKworCX0KKworLyogSGFuZGxlIG11bHRpcGxlIHR5cGVzOiBTRVQgYW5kIFNFUVVFTkNFICovCisKK3N0YXRpYyBBU04xX1RZUEUgKmFzbjFfbXVsdGkoaW50IHV0eXBlLCBjb25zdCBjaGFyICpzZWN0aW9uLCBYNTA5VjNfQ1RYICpjbmYpCisJeworCUFTTjFfVFlQRSAqcmV0ID0gTlVMTDsKKwlTVEFDS19PRihBU04xX1RZUEUpICpzayA9IE5VTEw7CisJU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKnNlY3QgPSBOVUxMOworCXVuc2lnbmVkIGNoYXIgKmRlciA9IE5VTEw7CisJaW50IGRlcmxlbjsKKwlzaXplX3QgaTsKKwlzayA9IHNrX0FTTjFfVFlQRV9uZXdfbnVsbCgpOworCWlmICghc2spCisJCWdvdG8gYmFkOworCWlmIChzZWN0aW9uKQorCQl7CisJCWlmICghY25mKQorCQkJZ290byBiYWQ7CisJCXNlY3QgPSBYNTA5VjNfZ2V0X3NlY3Rpb24oY25mLCAoY2hhciAqKXNlY3Rpb24pOworCQlpZiAoIXNlY3QpCisJCQlnb3RvIGJhZDsKKwkJZm9yIChpID0gMDsgaSA8IHNrX0NPTkZfVkFMVUVfbnVtKHNlY3QpOyBpKyspCisJCQl7CisJCQlBU04xX1RZUEUgKnR5cCA9IEFTTjFfZ2VuZXJhdGVfdjMoc2tfQ09ORl9WQUxVRV92YWx1ZShzZWN0LCBpKS0+dmFsdWUsIGNuZik7CisJCQlpZiAoIXR5cCkKKwkJCQlnb3RvIGJhZDsKKwkJCWlmICghc2tfQVNOMV9UWVBFX3B1c2goc2ssIHR5cCkpCisJCQkJZ290byBiYWQ7CisJCQl9CisJCX0KKworCS8qIE5vdyB3ZSBoYXMgYSBTVEFDSyBvZiB0aGUgY29tcG9uZW50cywgY29udmVydCB0byB0aGUgY29ycmVjdCBmb3JtICovCisKKwlpZiAodXR5cGUgPT0gVl9BU04xX1NFVCkKKwkJZGVybGVuID0gaTJkX0FTTjFfU0VUX0FOWShzaywgJmRlcik7CisJZWxzZQorCQlkZXJsZW4gPSBpMmRfQVNOMV9TRVFVRU5DRV9BTlkoc2ssICZkZXIpOworCisJaWYgKGRlcmxlbiA8IDApCisJCWdvdG8gYmFkOworCisJaWYgKCEocmV0ID0gQVNOMV9UWVBFX25ldygpKSkKKwkJZ290byBiYWQ7CisKKwlpZiAoIShyZXQtPnZhbHVlLmFzbjFfc3RyaW5nID0gQVNOMV9TVFJJTkdfdHlwZV9uZXcodXR5cGUpKSkKKwkJZ290byBiYWQ7CisKKwlyZXQtPnR5cGUgPSB1dHlwZTsKKworCXJldC0+dmFsdWUuYXNuMV9zdHJpbmctPmRhdGEgPSBkZXI7CisJcmV0LT52YWx1ZS5hc24xX3N0cmluZy0+bGVuZ3RoID0gZGVybGVuOworCisJZGVyID0gTlVMTDsKKworCWJhZDoKKworCWlmIChkZXIpCisJCU9QRU5TU0xfZnJlZShkZXIpOworCisJaWYgKHNrKQorCQlza19BU04xX1RZUEVfcG9wX2ZyZWUoc2ssIEFTTjFfVFlQRV9mcmVlKTsKKwlpZiAoc2VjdCkKKwkJWDUwOVYzX3NlY3Rpb25fZnJlZShjbmYsIHNlY3QpOworCisJcmV0dXJuIHJldDsKKwl9CisKK3N0YXRpYyBpbnQgYXBwZW5kX2V4cCh0YWdfZXhwX2FyZyAqYXJnLCBpbnQgZXhwX3RhZywgaW50IGV4cF9jbGFzcywgaW50IGV4cF9jb25zdHJ1Y3RlZCwgaW50IGV4cF9wYWQsIGludCBpbXBfb2spCisJeworCXRhZ19leHBfdHlwZSAqZXhwX3RtcDsKKwkvKiBDYW4gb25seSBoYXZlIElNUExJQ0lUIGlmIHBlcm1pdHRlZCAqLworCWlmICgoYXJnLT5pbXBfdGFnICE9IC0xKSAmJiAhaW1wX29rKQorCQl7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIGFwcGVuZF9leHAsIEFTTjFfUl9JTExFR0FMX0lNUExJQ0lUX1RBRyk7CisJCXJldHVybiAwOworCQl9CisKKwlpZiAoYXJnLT5leHBfY291bnQgPT0gQVNOMV9GTEFHX0VYUF9NQVgpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgYXBwZW5kX2V4cCwgQVNOMV9SX0RFUFRIX0VYQ0VFREVEKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCWV4cF90bXAgPSAmYXJnLT5leHBfbGlzdFthcmctPmV4cF9jb3VudCsrXTsKKworCS8qIElmIElNUExJQ0lUIHNldCB0YWcgdG8gaW1wbGljaXQgdmFsdWUgdGhlbgorCSAqIHJlc2V0IGltcGxpY2l0IHRhZyBzaW5jZSBpdCBoYXMgYmVlbiB1c2VkLgorCSAqLworCWlmIChhcmctPmltcF90YWcgIT0gLTEpCisJCXsKKwkJZXhwX3RtcC0+ZXhwX3RhZyA9IGFyZy0+aW1wX3RhZzsKKwkJZXhwX3RtcC0+ZXhwX2NsYXNzID0gYXJnLT5pbXBfY2xhc3M7CisJCWFyZy0+aW1wX3RhZyA9IC0xOworCQlhcmctPmltcF9jbGFzcyA9IC0xOworCQl9CisJZWxzZQorCQl7CisJCWV4cF90bXAtPmV4cF90YWcgPSBleHBfdGFnOworCQlleHBfdG1wLT5leHBfY2xhc3MgPSBleHBfY2xhc3M7CisJCX0KKwlleHBfdG1wLT5leHBfY29uc3RydWN0ZWQgPSBleHBfY29uc3RydWN0ZWQ7CisJZXhwX3RtcC0+ZXhwX3BhZCA9IGV4cF9wYWQ7CisKKwlyZXR1cm4gMTsKKwl9CisKKworc3RhdGljIGludCBhc24xX3N0cjJ0YWcoY29uc3QgY2hhciAqdGFnc3RyLCBpbnQgbGVuKQorCXsKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHRhZ19uYW1lX3N0ICp0bnRtcCwgdG5zdCBbXSA9IHsKKwkJQVNOMV9HRU5fU1RSKCJCT09MIiwgVl9BU04xX0JPT0xFQU4pLAorCQlBU04xX0dFTl9TVFIoIkJPT0xFQU4iLCBWX0FTTjFfQk9PTEVBTiksCisJCUFTTjFfR0VOX1NUUigiTlVMTCIsIFZfQVNOMV9OVUxMKSwKKwkJQVNOMV9HRU5fU1RSKCJJTlQiLCBWX0FTTjFfSU5URUdFUiksCisJCUFTTjFfR0VOX1NUUigiSU5URUdFUiIsIFZfQVNOMV9JTlRFR0VSKSwKKwkJQVNOMV9HRU5fU1RSKCJFTlVNIiwgVl9BU04xX0VOVU1FUkFURUQpLAorCQlBU04xX0dFTl9TVFIoIkVOVU1FUkFURUQiLCBWX0FTTjFfRU5VTUVSQVRFRCksCisJCUFTTjFfR0VOX1NUUigiT0lEIiwgVl9BU04xX09CSkVDVCksCisJCUFTTjFfR0VOX1NUUigiT0JKRUNUIiwgVl9BU04xX09CSkVDVCksCisJCUFTTjFfR0VOX1NUUigiVVRDVElNRSIsIFZfQVNOMV9VVENUSU1FKSwKKwkJQVNOMV9HRU5fU1RSKCJVVEMiLCBWX0FTTjFfVVRDVElNRSksCisJCUFTTjFfR0VOX1NUUigiR0VORVJBTElaRURUSU1FIiwgVl9BU04xX0dFTkVSQUxJWkVEVElNRSksCisJCUFTTjFfR0VOX1NUUigiR0VOVElNRSIsIFZfQVNOMV9HRU5FUkFMSVpFRFRJTUUpLAorCQlBU04xX0dFTl9TVFIoIk9DVCIsIFZfQVNOMV9PQ1RFVF9TVFJJTkcpLAorCQlBU04xX0dFTl9TVFIoIk9DVEVUU1RSSU5HIiwgVl9BU04xX09DVEVUX1NUUklORyksCisJCUFTTjFfR0VOX1NUUigiQklUU1RSIiwgVl9BU04xX0JJVF9TVFJJTkcpLAorCQlBU04xX0dFTl9TVFIoIkJJVFNUUklORyIsIFZfQVNOMV9CSVRfU1RSSU5HKSwKKwkJQVNOMV9HRU5fU1RSKCJVTklWRVJTQUxTVFJJTkciLCBWX0FTTjFfVU5JVkVSU0FMU1RSSU5HKSwKKwkJQVNOMV9HRU5fU1RSKCJVTklWIiwgVl9BU04xX1VOSVZFUlNBTFNUUklORyksCisJCUFTTjFfR0VOX1NUUigiSUE1IiwgVl9BU04xX0lBNVNUUklORyksCisJCUFTTjFfR0VOX1NUUigiSUE1U1RSSU5HIiwgVl9BU04xX0lBNVNUUklORyksCisJCUFTTjFfR0VOX1NUUigiVVRGOCIsIFZfQVNOMV9VVEY4U1RSSU5HKSwKKwkJQVNOMV9HRU5fU1RSKCJVVEY4U3RyaW5nIiwgVl9BU04xX1VURjhTVFJJTkcpLAorCQlBU04xX0dFTl9TVFIoIkJNUCIsIFZfQVNOMV9CTVBTVFJJTkcpLAorCQlBU04xX0dFTl9TVFIoIkJNUFNUUklORyIsIFZfQVNOMV9CTVBTVFJJTkcpLAorCQlBU04xX0dFTl9TVFIoIlZJU0lCTEVTVFJJTkciLCBWX0FTTjFfVklTSUJMRVNUUklORyksCisJCUFTTjFfR0VOX1NUUigiVklTSUJMRSIsIFZfQVNOMV9WSVNJQkxFU1RSSU5HKSwKKwkJQVNOMV9HRU5fU1RSKCJQUklOVEFCTEVTVFJJTkciLCBWX0FTTjFfUFJJTlRBQkxFU1RSSU5HKSwKKwkJQVNOMV9HRU5fU1RSKCJQUklOVEFCTEUiLCBWX0FTTjFfUFJJTlRBQkxFU1RSSU5HKSwKKwkJQVNOMV9HRU5fU1RSKCJUNjEiLCBWX0FTTjFfVDYxU1RSSU5HKSwKKwkJQVNOMV9HRU5fU1RSKCJUNjFTVFJJTkciLCBWX0FTTjFfVDYxU1RSSU5HKSwKKwkJQVNOMV9HRU5fU1RSKCJURUxFVEVYU1RSSU5HIiwgVl9BU04xX1Q2MVNUUklORyksCisJCUFTTjFfR0VOX1NUUigiR2VuZXJhbFN0cmluZyIsIFZfQVNOMV9HRU5FUkFMU1RSSU5HKSwKKwkJQVNOMV9HRU5fU1RSKCJHRU5TVFIiLCBWX0FTTjFfR0VORVJBTFNUUklORyksCisJCUFTTjFfR0VOX1NUUigiTlVNRVJJQyIsIFZfQVNOMV9OVU1FUklDU1RSSU5HKSwKKwkJQVNOMV9HRU5fU1RSKCJOVU1FUklDU1RSSU5HIiwgVl9BU04xX05VTUVSSUNTVFJJTkcpLAorCisJCS8qIFNwZWNpYWwgY2FzZXMgKi8KKwkJQVNOMV9HRU5fU1RSKCJTRVFVRU5DRSIsIFZfQVNOMV9TRVFVRU5DRSksCisJCUFTTjFfR0VOX1NUUigiU0VRIiwgVl9BU04xX1NFUVVFTkNFKSwKKwkJQVNOMV9HRU5fU1RSKCJTRVQiLCBWX0FTTjFfU0VUKSwKKwkJLyogdHlwZSBtb2RpZmllcnMgKi8KKwkJLyogRXhwbGljaXQgdGFnICovCisJCUFTTjFfR0VOX1NUUigiRVhQIiwgQVNOMV9HRU5fRkxBR19FWFApLAorCQlBU04xX0dFTl9TVFIoIkVYUExJQ0lUIiwgQVNOMV9HRU5fRkxBR19FWFApLAorCQkvKiBJbXBsaWNpdCB0YWcgKi8KKwkJQVNOMV9HRU5fU1RSKCJJTVAiLCBBU04xX0dFTl9GTEFHX0lNUCksCisJCUFTTjFfR0VOX1NUUigiSU1QTElDSVQiLCBBU04xX0dFTl9GTEFHX0lNUCksCisJCS8qIE9DVEVUIFNUUklORyB3cmFwcGVyICovCisJCUFTTjFfR0VOX1NUUigiT0NUV1JBUCIsIEFTTjFfR0VOX0ZMQUdfT0NUV1JBUCksCisJCS8qIFNFUVVFTkNFIHdyYXBwZXIgKi8KKwkJQVNOMV9HRU5fU1RSKCJTRVFXUkFQIiwgQVNOMV9HRU5fRkxBR19TRVFXUkFQKSwKKwkJLyogU0VUIHdyYXBwZXIgKi8KKwkJQVNOMV9HRU5fU1RSKCJTRVRXUkFQIiwgQVNOMV9HRU5fRkxBR19TRVRXUkFQKSwKKwkJLyogQklUIFNUUklORyB3cmFwcGVyICovCisJCUFTTjFfR0VOX1NUUigiQklUV1JBUCIsIEFTTjFfR0VOX0ZMQUdfQklUV1JBUCksCisJCUFTTjFfR0VOX1NUUigiRk9STSIsIEFTTjFfR0VOX0ZMQUdfRk9STUFUKSwKKwkJQVNOMV9HRU5fU1RSKCJGT1JNQVQiLCBBU04xX0dFTl9GTEFHX0ZPUk1BVCksCisJfTsKKworCWlmIChsZW4gPT0gLTEpCisJCWxlbiA9IHN0cmxlbih0YWdzdHIpOworCQorCXRudG1wID0gdG5zdDsJCisJZm9yIChpID0gMDsgaSA8IHNpemVvZih0bnN0KSAvIHNpemVvZihzdHJ1Y3QgdGFnX25hbWVfc3QpOyBpKyssIHRudG1wKyspCisJCXsKKwkJaWYgKChsZW4gPT0gdG50bXAtPmxlbikgJiYgIXN0cm5jbXAodG50bXAtPnN0cm5hbSwgdGFnc3RyLCBsZW4pKQorCQkJcmV0dXJuIHRudG1wLT50YWc7CisJCX0KKwkKKwlyZXR1cm4gLTE7CisJfQorCitzdGF0aWMgQVNOMV9UWVBFICphc24xX3N0cjJ0eXBlKGNvbnN0IGNoYXIgKnN0ciwgaW50IGZvcm1hdCwgaW50IHV0eXBlKQorCXsKKwlBU04xX1RZUEUgKmF0bXAgPSBOVUxMOworCisJQ09ORl9WQUxVRSB2dG1wOworCisJdW5zaWduZWQgY2hhciAqcmRhdGE7CisJbG9uZyByZGxlbjsKKworCWludCBub191bnVzZWQgPSAxOworCisJaWYgKCEoYXRtcCA9IEFTTjFfVFlQRV9uZXcoKSkpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgYXNuMV9zdHIydHlwZSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJaWYgKCFzdHIpCisJCXN0ciA9ICIiOworCisJc3dpdGNoKHV0eXBlKQorCQl7CisKKwkJY2FzZSBWX0FTTjFfTlVMTDoKKwkJaWYgKHN0ciAmJiAqc3RyKQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgYXNuMV9zdHIydHlwZSwgQVNOMV9SX0lMTEVHQUxfTlVMTF9WQUxVRSk7CisJCQlnb3RvIGJhZF9mb3JtOworCQkJfQorCQlicmVhazsKKwkJCisJCWNhc2UgVl9BU04xX0JPT0xFQU46CisJCWlmIChmb3JtYXQgIT0gQVNOMV9HRU5fRk9STUFUX0FTQ0lJKQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgYXNuMV9zdHIydHlwZSwgQVNOMV9SX05PVF9BU0NJSV9GT1JNQVQpOworCQkJZ290byBiYWRfZm9ybTsKKwkJCX0KKwkJdnRtcC5uYW1lID0gTlVMTDsKKwkJdnRtcC5zZWN0aW9uID0gTlVMTDsKKwkJdnRtcC52YWx1ZSA9IChjaGFyICopc3RyOworCQlpZiAoIVg1MDlWM19nZXRfdmFsdWVfYm9vbCgmdnRtcCwgJmF0bXAtPnZhbHVlLmJvb2xlYW4pKQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgYXNuMV9zdHIydHlwZSwgQVNOMV9SX0lMTEVHQUxfQk9PTEVBTik7CisJCQlnb3RvIGJhZF9zdHI7CisJCQl9CisJCWJyZWFrOworCisJCWNhc2UgVl9BU04xX0lOVEVHRVI6CisJCWNhc2UgVl9BU04xX0VOVU1FUkFURUQ6CisJCWlmIChmb3JtYXQgIT0gQVNOMV9HRU5fRk9STUFUX0FTQ0lJKQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgYXNuMV9zdHIydHlwZSwgQVNOMV9SX0lOVEVHRVJfTk9UX0FTQ0lJX0ZPUk1BVCk7CisJCQlnb3RvIGJhZF9mb3JtOworCQkJfQorCQlpZiAoIShhdG1wLT52YWx1ZS5pbnRlZ2VyID0gczJpX0FTTjFfSU5URUdFUihOVUxMLCAoY2hhciAqKXN0cikpKQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgYXNuMV9zdHIydHlwZSwgQVNOMV9SX0lMTEVHQUxfSU5URUdFUik7CisJCQlnb3RvIGJhZF9zdHI7CisJCQl9CisJCWJyZWFrOworCisJCWNhc2UgVl9BU04xX09CSkVDVDoKKwkJaWYgKGZvcm1hdCAhPSBBU04xX0dFTl9GT1JNQVRfQVNDSUkpCisJCQl7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBhc24xX3N0cjJ0eXBlLCBBU04xX1JfT0JKRUNUX05PVF9BU0NJSV9GT1JNQVQpOworCQkJZ290byBiYWRfZm9ybTsKKwkJCX0KKwkJaWYgKCEoYXRtcC0+dmFsdWUub2JqZWN0ID0gT0JKX3R4dDJvYmooc3RyLCAwKSkpCisJCQl7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBhc24xX3N0cjJ0eXBlLCBBU04xX1JfSUxMRUdBTF9PQkpFQ1QpOworCQkJZ290byBiYWRfc3RyOworCQkJfQorCQlicmVhazsKKworCQljYXNlIFZfQVNOMV9VVENUSU1FOgorCQljYXNlIFZfQVNOMV9HRU5FUkFMSVpFRFRJTUU6CisJCWlmIChmb3JtYXQgIT0gQVNOMV9HRU5fRk9STUFUX0FTQ0lJKQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgYXNuMV9zdHIydHlwZSwgQVNOMV9SX1RJTUVfTk9UX0FTQ0lJX0ZPUk1BVCk7CisJCQlnb3RvIGJhZF9mb3JtOworCQkJfQorCQlpZiAoIShhdG1wLT52YWx1ZS5hc24xX3N0cmluZyA9IEFTTjFfU1RSSU5HX25ldygpKSkKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIGFzbjFfc3RyMnR5cGUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCWdvdG8gYmFkX3N0cjsKKwkJCX0KKwkJaWYgKCFBU04xX1NUUklOR19zZXQoYXRtcC0+dmFsdWUuYXNuMV9zdHJpbmcsIHN0ciwgLTEpKQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgYXNuMV9zdHIydHlwZSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJZ290byBiYWRfc3RyOworCQkJfQorCQlhdG1wLT52YWx1ZS5hc24xX3N0cmluZy0+dHlwZSA9IHV0eXBlOworCQlpZiAoIUFTTjFfVElNRV9jaGVjayhhdG1wLT52YWx1ZS5hc24xX3N0cmluZykpCisJCQl7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBhc24xX3N0cjJ0eXBlLCBBU04xX1JfSUxMRUdBTF9USU1FX1ZBTFVFKTsKKwkJCWdvdG8gYmFkX3N0cjsKKwkJCX0KKworCQlicmVhazsKKworCQljYXNlIFZfQVNOMV9CTVBTVFJJTkc6CisJCWNhc2UgVl9BU04xX1BSSU5UQUJMRVNUUklORzoKKwkJY2FzZSBWX0FTTjFfSUE1U1RSSU5HOgorCQljYXNlIFZfQVNOMV9UNjFTVFJJTkc6CisJCWNhc2UgVl9BU04xX1VURjhTVFJJTkc6CisJCWNhc2UgVl9BU04xX1ZJU0lCTEVTVFJJTkc6CisJCWNhc2UgVl9BU04xX1VOSVZFUlNBTFNUUklORzoKKwkJY2FzZSBWX0FTTjFfR0VORVJBTFNUUklORzoKKwkJY2FzZSBWX0FTTjFfTlVNRVJJQ1NUUklORzoKKworCQlpZiAoZm9ybWF0ID09IEFTTjFfR0VOX0ZPUk1BVF9BU0NJSSkKKwkJCWZvcm1hdCA9IE1CU1RSSU5HX0FTQzsKKwkJZWxzZSBpZiAoZm9ybWF0ID09IEFTTjFfR0VOX0ZPUk1BVF9VVEY4KQorCQkJZm9ybWF0ID0gTUJTVFJJTkdfVVRGODsKKwkJZWxzZQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgYXNuMV9zdHIydHlwZSwgQVNOMV9SX0lMTEVHQUxfRk9STUFUKTsKKwkJCWdvdG8gYmFkX2Zvcm07CisJCQl9CisKKworCQlpZiAoQVNOMV9tYnN0cmluZ19jb3B5KCZhdG1wLT52YWx1ZS5hc24xX3N0cmluZywgKHVuc2lnbmVkIGNoYXIgKilzdHIsCisJCQkJCQktMSwgZm9ybWF0LCBBU04xX3RhZzJiaXQodXR5cGUpKSA8PSAwKQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgYXNuMV9zdHIydHlwZSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJZ290byBiYWRfc3RyOworCQkJfQorCQkKKworCQlicmVhazsKKworCQljYXNlIFZfQVNOMV9CSVRfU1RSSU5HOgorCisJCWNhc2UgVl9BU04xX09DVEVUX1NUUklORzoKKworCQlpZiAoIShhdG1wLT52YWx1ZS5hc24xX3N0cmluZyA9IEFTTjFfU1RSSU5HX25ldygpKSkKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIGFzbjFfc3RyMnR5cGUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCWdvdG8gYmFkX2Zvcm07CisJCQl9CisKKwkJaWYgKGZvcm1hdCA9PSBBU04xX0dFTl9GT1JNQVRfSEVYKQorCQkJeworCisJCQlpZiAoIShyZGF0YSA9IHN0cmluZ190b19oZXgoKGNoYXIgKilzdHIsICZyZGxlbikpKQorCQkJCXsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBhc24xX3N0cjJ0eXBlLCBBU04xX1JfSUxMRUdBTF9IRVgpOworCQkJCWdvdG8gYmFkX3N0cjsKKwkJCQl9CisKKwkJCWF0bXAtPnZhbHVlLmFzbjFfc3RyaW5nLT5kYXRhID0gcmRhdGE7CisJCQlhdG1wLT52YWx1ZS5hc24xX3N0cmluZy0+bGVuZ3RoID0gcmRsZW47CisJCQlhdG1wLT52YWx1ZS5hc24xX3N0cmluZy0+dHlwZSA9IHV0eXBlOworCisJCQl9CisJCWVsc2UgaWYgKGZvcm1hdCA9PSBBU04xX0dFTl9GT1JNQVRfQVNDSUkpCisJCQlBU04xX1NUUklOR19zZXQoYXRtcC0+dmFsdWUuYXNuMV9zdHJpbmcsIHN0ciwgLTEpOworCQllbHNlIGlmICgoZm9ybWF0ID09IEFTTjFfR0VOX0ZPUk1BVF9CSVRMSVNUKSAmJiAodXR5cGUgPT0gVl9BU04xX0JJVF9TVFJJTkcpKQorCQkJeworCQkJaWYgKCFDT05GX3BhcnNlX2xpc3Qoc3RyLCAnLCcsIDEsIGJpdHN0cl9jYiwgYXRtcC0+dmFsdWUuYml0X3N0cmluZykpCisJCQkJeworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIGFzbjFfc3RyMnR5cGUsIEFTTjFfUl9MSVNUX0VSUk9SKTsKKwkJCQlnb3RvIGJhZF9zdHI7CisJCQkJfQorCQkJbm9fdW51c2VkID0gMDsKKwkJCQorCQkJfQorCQllbHNlIAorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgYXNuMV9zdHIydHlwZSwgQVNOMV9SX0lMTEVHQUxfQklUU1RSSU5HX0ZPUk1BVCk7CisJCQlnb3RvIGJhZF9mb3JtOworCQkJfQorCisJCWlmICgodXR5cGUgPT0gVl9BU04xX0JJVF9TVFJJTkcpICYmIG5vX3VudXNlZCkKKwkJCXsKKwkJCWF0bXAtPnZhbHVlLmFzbjFfc3RyaW5nLT5mbGFncworCQkJCSY9IH4oQVNOMV9TVFJJTkdfRkxBR19CSVRTX0xFRlR8MHgwNyk7CisgICAgICAgIAkJYXRtcC0+dmFsdWUuYXNuMV9zdHJpbmctPmZsYWdzCisJCQkJfD0gQVNOMV9TVFJJTkdfRkxBR19CSVRTX0xFRlQ7CisJCQl9CisKKworCQlicmVhazsKKworCQlkZWZhdWx0OgorCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBhc24xX3N0cjJ0eXBlLCBBU04xX1JfVU5TVVBQT1JURURfVFlQRSk7CisJCWdvdG8gYmFkX3N0cjsKKwkJYnJlYWs7CisJCX0KKworCisJYXRtcC0+dHlwZSA9IHV0eXBlOworCXJldHVybiBhdG1wOworCisKKwliYWRfc3RyOgorCUVSUl9hZGRfZXJyb3JfZGF0YSgyLCAic3RyaW5nPSIsIHN0cik7CisJYmFkX2Zvcm06CisKKwlBU04xX1RZUEVfZnJlZShhdG1wKTsKKwlyZXR1cm4gTlVMTDsKKworCX0KKworc3RhdGljIGludCBiaXRzdHJfY2IoY29uc3QgY2hhciAqZWxlbSwgaW50IGxlbiwgdm9pZCAqYml0c3RyKQorCXsKKwlsb25nIGJpdG51bTsKKwljaGFyICplcHRyOworCWlmICghZWxlbSkKKwkJcmV0dXJuIDA7CisJYml0bnVtID0gc3RydG91bChlbGVtLCAmZXB0ciwgMTApOworCWlmIChlcHRyICYmICplcHRyICYmIChlcHRyICE9IGVsZW0gKyBsZW4pKQorCQlyZXR1cm4gMDsKKwlpZiAoYml0bnVtIDwgMCkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBiaXRzdHJfY2IsIEFTTjFfUl9JTlZBTElEX05VTUJFUik7CisJCXJldHVybiAwOworCQl9CisJaWYgKCFBU04xX0JJVF9TVFJJTkdfc2V0X2JpdChiaXRzdHIsIGJpdG51bSwgMSkpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgYml0c3RyX2NiLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiAwOworCQl9CisJcmV0dXJuIDE7CisJfQorCmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOS9ieV9kaXIuYyBiL2NyeXB0by94NTA5L2J5X2Rpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOGQwZDQKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOS9ieV9kaXIuYwpAQCAtMCwwICsxLDQ3MiBAQAorLyogY3J5cHRvL3g1MDkvYnlfZGlyLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9idWYuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbGhhc2guaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorCisKK3R5cGVkZWYgc3RydWN0IGxvb2t1cF9kaXJfaGFzaGVzX3N0CisJeworCXVuc2lnbmVkIGxvbmcgaGFzaDsKKwlpbnQgc3VmZml4OworCX0gQllfRElSX0hBU0g7CisKK3R5cGVkZWYgc3RydWN0IGxvb2t1cF9kaXJfZW50cnlfc3QKKwl7CisJY2hhciAqZGlyOworCWludCBkaXJfdHlwZTsKKwlTVEFDS19PRihCWV9ESVJfSEFTSCkgKmhhc2hlczsKKwl9IEJZX0RJUl9FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgbG9va3VwX2Rpcl9zdAorCXsKKwlCVUZfTUVNICpidWZmZXI7CisJU1RBQ0tfT0YoQllfRElSX0VOVFJZKSAqZGlyczsKKwl9IEJZX0RJUjsKKworREVDTEFSRV9TVEFDS19PRihCWV9ESVJfSEFTSCkKK0RFQ0xBUkVfU1RBQ0tfT0YoQllfRElSX0VOVFJZKQorCitzdGF0aWMgaW50IGRpcl9jdHJsKFg1MDlfTE9PS1VQICpjdHgsIGludCBjbWQsIGNvbnN0IGNoYXIgKmFyZ3AsIGxvbmcgYXJnbCwKKwljaGFyICoqcmV0KTsKK3N0YXRpYyBpbnQgbmV3X2RpcihYNTA5X0xPT0tVUCAqbHUpOworc3RhdGljIHZvaWQgZnJlZV9kaXIoWDUwOV9MT09LVVAgKmx1KTsKK3N0YXRpYyBpbnQgYWRkX2NlcnRfZGlyKEJZX0RJUiAqY3R4LGNvbnN0IGNoYXIgKmRpcixpbnQgdHlwZSk7CitzdGF0aWMgaW50IGdldF9jZXJ0X2J5X3N1YmplY3QoWDUwOV9MT09LVVAgKnhsLGludCB0eXBlLFg1MDlfTkFNRSAqbmFtZSwKKwlYNTA5X09CSkVDVCAqcmV0KTsKK1g1MDlfTE9PS1VQX01FVEhPRCB4NTA5X2Rpcl9sb29rdXA9CisJeworCSJMb2FkIGNlcnRzIGZyb20gZmlsZXMgaW4gYSBkaXJlY3RvcnkiLAorCW5ld19kaXIsCQkvKiBuZXcgKi8KKwlmcmVlX2RpciwJCS8qIGZyZWUgKi8KKwlOVUxMLCAJCQkvKiBpbml0ICovCisJTlVMTCwJCQkvKiBzaHV0ZG93biAqLworCWRpcl9jdHJsLAkJLyogY3RybCAqLworCWdldF9jZXJ0X2J5X3N1YmplY3QsCS8qIGdldF9ieV9zdWJqZWN0ICovCisJTlVMTCwJCQkvKiBnZXRfYnlfaXNzdWVyX3NlcmlhbCAqLworCU5VTEwsCQkJLyogZ2V0X2J5X2ZpbmdlcnByaW50ICovCisJTlVMTCwJCQkvKiBnZXRfYnlfYWxpYXMgKi8KKwl9OworCitYNTA5X0xPT0tVUF9NRVRIT0QgKlg1MDlfTE9PS1VQX2hhc2hfZGlyKHZvaWQpCisJeworCXJldHVybigmeDUwOV9kaXJfbG9va3VwKTsKKwl9CisKK3N0YXRpYyBpbnQgZGlyX2N0cmwoWDUwOV9MT09LVVAgKmN0eCwgaW50IGNtZCwgY29uc3QgY2hhciAqYXJncCwgbG9uZyBhcmdsLAorCSAgICAgY2hhciAqKnJldHApCisJeworCWludCByZXQ9MDsKKwlCWV9ESVIgKmxkOworCWNoYXIgKmRpciA9IE5VTEw7CisKKwlsZD0oQllfRElSICopY3R4LT5tZXRob2RfZGF0YTsKKworCXN3aXRjaCAoY21kKQorCQl7CisJY2FzZSBYNTA5X0xfQUREX0RJUjoKKwkJaWYgKGFyZ2wgPT0gWDUwOV9GSUxFVFlQRV9ERUZBVUxUKQorCQkJeworCQkJZGlyPShjaGFyICopZ2V0ZW52KFg1MDlfZ2V0X2RlZmF1bHRfY2VydF9kaXJfZW52KCkpOworCQkJaWYgKGRpcikKKwkJCQlyZXQ9YWRkX2NlcnRfZGlyKGxkLGRpcixYNTA5X0ZJTEVUWVBFX1BFTSk7CisJCQllbHNlCisJCQkJcmV0PWFkZF9jZXJ0X2RpcihsZCxYNTA5X2dldF9kZWZhdWx0X2NlcnRfZGlyKCksCisJCQkJCVg1MDlfRklMRVRZUEVfUEVNKTsKKwkJCWlmICghcmV0KQorCQkJCXsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBkaXJfY3RybCwgWDUwOV9SX0xPQURJTkdfQ0VSVF9ESVIpOworCQkJCX0KKwkJCX0KKwkJZWxzZQorCQkJcmV0PWFkZF9jZXJ0X2RpcihsZCxhcmdwLChpbnQpYXJnbCk7CisJCWJyZWFrOworCQl9CisJcmV0dXJuKHJldCk7CisJfQorCitzdGF0aWMgaW50IG5ld19kaXIoWDUwOV9MT09LVVAgKmx1KQorCXsKKwlCWV9ESVIgKmE7CisKKwlpZiAoKGE9KEJZX0RJUiAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihCWV9ESVIpKSkgPT0gTlVMTCkKKwkJcmV0dXJuKDApOworCWlmICgoYS0+YnVmZmVyPUJVRl9NRU1fbmV3KCkpID09IE5VTEwpCisJCXsKKwkJT1BFTlNTTF9mcmVlKGEpOworCQlyZXR1cm4oMCk7CisJCX0KKwlhLT5kaXJzPU5VTEw7CisJbHUtPm1ldGhvZF9kYXRhPShjaGFyICopYTsKKwlyZXR1cm4oMSk7CisJfQorCitzdGF0aWMgdm9pZCBieV9kaXJfaGFzaF9mcmVlKEJZX0RJUl9IQVNIICpoYXNoKQorCXsKKwlPUEVOU1NMX2ZyZWUoaGFzaCk7CisJfQorCitzdGF0aWMgaW50IGJ5X2Rpcl9oYXNoX2NtcChjb25zdCBCWV9ESVJfSEFTSCAqKmEsCisJCQljb25zdCBCWV9ESVJfSEFTSCAqKmIpCisJeworCWlmICgoKmEpLT5oYXNoID4gKCpiKS0+aGFzaCkKKwkJcmV0dXJuIDE7CisJaWYgKCgqYSktPmhhc2ggPCAoKmIpLT5oYXNoKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7CisJfQorCitzdGF0aWMgdm9pZCBieV9kaXJfZW50cnlfZnJlZShCWV9ESVJfRU5UUlkgKmVudCkKKwl7CisJaWYgKGVudC0+ZGlyKQorCQlPUEVOU1NMX2ZyZWUoZW50LT5kaXIpOworCWlmIChlbnQtPmhhc2hlcykKKwkJc2tfQllfRElSX0hBU0hfcG9wX2ZyZWUoZW50LT5oYXNoZXMsIGJ5X2Rpcl9oYXNoX2ZyZWUpOworCU9QRU5TU0xfZnJlZShlbnQpOworCX0KKworc3RhdGljIHZvaWQgZnJlZV9kaXIoWDUwOV9MT09LVVAgKmx1KQorCXsKKwlCWV9ESVIgKmE7CisKKwlhPShCWV9ESVIgKilsdS0+bWV0aG9kX2RhdGE7CisJaWYgKGEtPmRpcnMgIT0gTlVMTCkKKwkJc2tfQllfRElSX0VOVFJZX3BvcF9mcmVlKGEtPmRpcnMsIGJ5X2Rpcl9lbnRyeV9mcmVlKTsKKwlpZiAoYS0+YnVmZmVyICE9IE5VTEwpCisJCUJVRl9NRU1fZnJlZShhLT5idWZmZXIpOworCU9QRU5TU0xfZnJlZShhKTsKKwl9CisKK3N0YXRpYyBpbnQgYWRkX2NlcnRfZGlyKEJZX0RJUiAqY3R4LCBjb25zdCBjaGFyICpkaXIsIGludCB0eXBlKQorCXsKKwlpbnQgaixsZW47CisJY29uc3QgY2hhciAqcywqc3MsKnA7CisKKwlpZiAoZGlyID09IE5VTEwgfHwgISpkaXIpCisJICAgIHsKKwkgICAgT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgYWRkX2NlcnRfZGlyLCBYNTA5X1JfSU5WQUxJRF9ESVJFQ1RPUlkpOworCSAgICByZXR1cm4gMDsKKwkgICAgfQorCisJcz1kaXI7CisJcD1zOworCWZvciAoOztwKyspCisJCXsKKwkJaWYgKCgqcCA9PSAnOicpIHx8ICgqcCA9PSAnXDAnKSkKKwkJCXsKKwkJCUJZX0RJUl9FTlRSWSAqZW50OworCQkJc3M9czsKKwkJCXM9cCsxOworCQkJbGVuPShpbnQpKHAtc3MpOworCQkJaWYgKGxlbiA9PSAwKSBjb250aW51ZTsKKwkJCWZvciAoaj0wOyBqIDwgc2tfQllfRElSX0VOVFJZX251bShjdHgtPmRpcnMpOyBqKyspCisJCQkJeworCQkJCWVudCA9IHNrX0JZX0RJUl9FTlRSWV92YWx1ZShjdHgtPmRpcnMsIGopOworCQkJCWlmIChzdHJsZW4oZW50LT5kaXIpID09IChzaXplX3QpbGVuICYmCisJCQkJICAgIHN0cm5jbXAoZW50LT5kaXIsc3MsKHVuc2lnbmVkIGludClsZW4pID09IDApCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCWlmIChqIDwgc2tfQllfRElSX0VOVFJZX251bShjdHgtPmRpcnMpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGN0eC0+ZGlycyA9PSBOVUxMKQorCQkJCXsKKwkJCQljdHgtPmRpcnMgPSBza19CWV9ESVJfRU5UUllfbmV3X251bGwoKTsKKwkJCQlpZiAoIWN0eC0+ZGlycykKKwkJCQkJeworCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBhZGRfY2VydF9kaXIsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJCX0KKwkJCQl9CisJCQllbnQgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoQllfRElSX0VOVFJZKSk7CisJCQlpZiAoIWVudCkKKwkJCQlyZXR1cm4gMDsKKwkJCWVudC0+ZGlyX3R5cGUgPSB0eXBlOworCQkJZW50LT5oYXNoZXMgPSBza19CWV9ESVJfSEFTSF9uZXcoYnlfZGlyX2hhc2hfY21wKTsKKwkJCWVudC0+ZGlyID0gT1BFTlNTTF9tYWxsb2MoKHVuc2lnbmVkIGludClsZW4rMSk7CisJCQlpZiAoIWVudC0+ZGlyIHx8ICFlbnQtPmhhc2hlcykKKwkJCQl7CisJCQkJYnlfZGlyX2VudHJ5X2ZyZWUoZW50KTsKKwkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQlzdHJuY3B5KGVudC0+ZGlyLHNzLCh1bnNpZ25lZCBpbnQpbGVuKTsKKwkJCWVudC0+ZGlyW2xlbl0gPSAnXDAnOworCQkJaWYgKCFza19CWV9ESVJfRU5UUllfcHVzaChjdHgtPmRpcnMsIGVudCkpCisJCQkJeworCQkJCWJ5X2Rpcl9lbnRyeV9mcmVlKGVudCk7CisJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCQlpZiAoKnAgPT0gJ1wwJykKKwkJCWJyZWFrOworCQl9CisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IGdldF9jZXJ0X2J5X3N1YmplY3QoWDUwOV9MT09LVVAgKnhsLCBpbnQgdHlwZSwgWDUwOV9OQU1FICpuYW1lLAorCSAgICAgWDUwOV9PQkpFQ1QgKnJldCkKKwl7CisJQllfRElSICpjdHg7CisJdW5pb24JeworCQlzdHJ1Y3QJeworCQkJWDUwOSBzdF94NTA5OworCQkJWDUwOV9DSU5GIHN0X3g1MDlfY2luZjsKKwkJCX0geDUwOTsKKwkJc3RydWN0CXsKKwkJCVg1MDlfQ1JMIHN0X2NybDsKKwkJCVg1MDlfQ1JMX0lORk8gc3RfY3JsX2luZm87CisJCQl9IGNybDsKKwkJfSBkYXRhOworCWludCBvaz0wOworCWludCBpLGosazsKKwl1bnNpZ25lZCBsb25nIGg7CisJQlVGX01FTSAqYj1OVUxMOworCVg1MDlfT0JKRUNUIHN0bXAsKnRtcDsKKwljb25zdCBjaGFyICpwb3N0Zml4PSIiOworCisJaWYgKG5hbWUgPT0gTlVMTCkgcmV0dXJuKDApOworCisJc3RtcC50eXBlPXR5cGU7CisJaWYgKHR5cGUgPT0gWDUwOV9MVV9YNTA5KQorCQl7CisJCWRhdGEueDUwOS5zdF94NTA5LmNlcnRfaW5mbz0gJmRhdGEueDUwOS5zdF94NTA5X2NpbmY7CisJCWRhdGEueDUwOS5zdF94NTA5X2NpbmYuc3ViamVjdD1uYW1lOworCQlzdG1wLmRhdGEueDUwOT0gJmRhdGEueDUwOS5zdF94NTA5OworCQlwb3N0Zml4PSIiOworCQl9CisJZWxzZSBpZiAodHlwZSA9PSBYNTA5X0xVX0NSTCkKKwkJeworCQlkYXRhLmNybC5zdF9jcmwuY3JsPSAmZGF0YS5jcmwuc3RfY3JsX2luZm87CisJCWRhdGEuY3JsLnN0X2NybF9pbmZvLmlzc3Vlcj1uYW1lOworCQlzdG1wLmRhdGEuY3JsPSAmZGF0YS5jcmwuc3RfY3JsOworCQlwb3N0Zml4PSJyIjsKKwkJfQorCWVsc2UKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBnZXRfY2VydF9ieV9zdWJqZWN0LCBYNTA5X1JfV1JPTkdfTE9PS1VQX1RZUEUpOworCQlnb3RvIGZpbmlzaDsKKwkJfQorCisJaWYgKChiPUJVRl9NRU1fbmV3KCkpID09IE5VTEwpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgZ2V0X2NlcnRfYnlfc3ViamVjdCwgRVJSX1JfQlVGX0xJQik7CisJCWdvdG8gZmluaXNoOworCQl9CisJCisJY3R4PShCWV9ESVIgKil4bC0+bWV0aG9kX2RhdGE7CisKKwloPVg1MDlfTkFNRV9oYXNoKG5hbWUpOworCWZvciAoaT0wOyBpIDwgc2tfQllfRElSX0VOVFJZX251bShjdHgtPmRpcnMpOyBpKyspCisJCXsKKwkJQllfRElSX0VOVFJZICplbnQ7CisJCXNpemVfdCBpZHg7CisJCUJZX0RJUl9IQVNIIGh0bXAsICpoZW50OworCQllbnQgPSBza19CWV9ESVJfRU5UUllfdmFsdWUoY3R4LT5kaXJzLCBpKTsKKwkJaj1zdHJsZW4oZW50LT5kaXIpKzErOCs2KzErMTsKKwkJaWYgKCFCVUZfTUVNX2dyb3coYixqKSkKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIGdldF9jZXJ0X2J5X3N1YmplY3QsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCWdvdG8gZmluaXNoOworCQkJfQorCQlpZiAodHlwZSA9PSBYNTA5X0xVX0NSTCAmJiBlbnQtPmhhc2hlcykKKwkJCXsKKwkJCWh0bXAuaGFzaCA9IGg7CisJCQlDUllQVE9fcl9sb2NrKENSWVBUT19MT0NLX1g1MDlfU1RPUkUpOworCQkJaWYgKHNrX0JZX0RJUl9IQVNIX2ZpbmQoZW50LT5oYXNoZXMsICZpZHgsICZodG1wKSkKKwkJCQl7CisJCQkJaGVudCA9IHNrX0JZX0RJUl9IQVNIX3ZhbHVlKGVudC0+aGFzaGVzLCBpZHgpOworCQkJCWsgPSBoZW50LT5zdWZmaXg7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQloZW50ID0gTlVMTDsKKwkJCQlrPTA7CisJCQkJfQorCQkJQ1JZUFRPX3JfdW5sb2NrKENSWVBUT19MT0NLX1g1MDlfU1RPUkUpOworCQkJfQorCQllbHNlCisJCQl7CisJCQlrID0gMDsKKwkJCWhlbnQgPSBOVUxMOworCQkJfQorCQlmb3IgKDs7KQorCQkJeworCQkJY2hhciBjID0gJy8nOworI2lmZGVmIE9QRU5TU0xfU1lTX1ZNUworCQkJYyA9IGVudC0+ZGlyW3N0cmxlbihlbnQtPmRpciktMV07CisJCQlpZiAoYyAhPSAnOicgJiYgYyAhPSAnPicgJiYgYyAhPSAnXScpCisJCQkJeworCQkJCS8qIElmIG5vIHNlcGFyYXRvciBpcyBwcmVzZW50LCB3ZSBhc3N1bWUgdGhlCisJCQkJICAgZGlyZWN0b3J5IHNwZWNpZmllciBpcyBhIGxvZ2ljYWwgbmFtZSwgYW5kCisJCQkJICAgYWRkIGEgY29sb24uICBXZSByZWFsbHkgc2hvdWxkIHVzZSBiZXR0ZXIKKwkJCQkgICBWTVMgcm91dGluZXMgZm9yIG1lcmdpbmcgdGhpbmdzIGxpa2UgdGhpcywKKwkJCQkgICBidXQgdGhpcyB3aWxsIGRvIGZvciBub3cuLi4KKwkJCQkgICAtLSBSaWNoYXJkIExldml0dGUgKi8KKwkJCQljID0gJzonOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJYyA9ICdcMCc7CisJCQkJfQorI2VuZGlmCisJCQlpZiAoYyA9PSAnXDAnKQorCQkJCXsKKwkJCQkvKiBUaGlzIGlzIHNwZWNpYWwuICBXaGVuIGMgPT0gJ1wwJywgbm8KKwkJCQkgICBkaXJlY3Rvcnkgc2VwYXJhdG9yIHNob3VsZCBiZSBhZGRlZC4gKi8KKwkJCQlCSU9fc25wcmludGYoYi0+ZGF0YSxiLT5tYXgsCisJCQkJCSIlcyUwOGx4LiVzJWQiLGVudC0+ZGlyLGgsCisJCQkJCXBvc3RmaXgsayk7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQlCSU9fc25wcmludGYoYi0+ZGF0YSxiLT5tYXgsCisJCQkJCSIlcyVjJTA4bHguJXMlZCIsZW50LT5kaXIsYyxoLAorCQkJCQlwb3N0Zml4LGspOworCQkJCX0KKyNpZm5kZWYgT1BFTlNTTF9OT19QT1NJWF9JTworI2lmZGVmIF9XSU4zMgorI2RlZmluZSBzdGF0IF9zdGF0CisjZW5kaWYKKwkJCXsKKwkJCXN0cnVjdCBzdGF0IHN0OworCQkJaWYgKHN0YXQoYi0+ZGF0YSwmc3QpIDwgMCkKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZgorCQkJLyogZm91bmQgb25lLiAqLworCQkJaWYgKHR5cGUgPT0gWDUwOV9MVV9YNTA5KQorCQkJCXsKKwkJCQlpZiAoKFg1MDlfbG9hZF9jZXJ0X2ZpbGUoeGwsYi0+ZGF0YSwKKwkJCQkJZW50LT5kaXJfdHlwZSkpID09IDApCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCWVsc2UgaWYgKHR5cGUgPT0gWDUwOV9MVV9DUkwpCisJCQkJeworCQkJCWlmICgoWDUwOV9sb2FkX2NybF9maWxlKHhsLGItPmRhdGEsCisJCQkJCWVudC0+ZGlyX3R5cGUpKSA9PSAwKQorCQkJCQlicmVhazsKKwkJCQl9CisJCQkvKiBlbHNlIGNhc2Ugd2lsbCBjYXVnaHQgaGlnaGVyIHVwICovCisJCQlrKys7CisJCQl9CisKKwkJLyogd2UgaGF2ZSBhZGRlZCBpdCB0byB0aGUgY2FjaGUgc28gbm93IHB1bGwKKwkJICogaXQgb3V0IGFnYWluICovCisJCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfWDUwOV9TVE9SRSk7CisJCXRtcCA9IE5VTEw7CisJCWlmIChza19YNTA5X09CSkVDVF9maW5kKHhsLT5zdG9yZV9jdHgtPm9ianMsICZpZHgsICZzdG1wKSkgeworCQkJdG1wPXNrX1g1MDlfT0JKRUNUX3ZhbHVlKHhsLT5zdG9yZV9jdHgtPm9ianMsaWR4KTsKKwkJfQorCQlDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfWDUwOV9TVE9SRSk7CisKKworCQkvKiBJZiBhIENSTCwgdXBkYXRlIHRoZSBsYXN0IGZpbGUgc3VmZml4IGFkZGVkIGZvciB0aGlzICovCisKKwkJaWYgKHR5cGUgPT0gWDUwOV9MVV9DUkwpCisJCQl7CisJCQlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX1g1MDlfU1RPUkUpOworCQkJLyogTG9vayBmb3IgZW50cnkgYWdhaW4gaW4gY2FzZSBhbm90aGVyIHRocmVhZCBhZGRlZAorCQkJICogYW4gZW50cnkgZmlyc3QuCisJCQkgKi8KKwkJCWlmICghaGVudCkKKwkJCQl7CisJCQkJaHRtcC5oYXNoID0gaDsKKwkJCQlpZiAoc2tfQllfRElSX0hBU0hfZmluZChlbnQtPmhhc2hlcywgJmlkeCwgJmh0bXApKQorCQkJCQloZW50ID0gc2tfQllfRElSX0hBU0hfdmFsdWUoZW50LT5oYXNoZXMsIGlkeCk7CisJCQkJfQorCQkJaWYgKCFoZW50KQorCQkJCXsKKwkJCQloZW50ID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEJZX0RJUl9IQVNIKSk7CisJCQkJaGVudC0+aGFzaCA9IGg7CisJCQkJaGVudC0+c3VmZml4ID0gazsKKwkJCQlpZiAoIXNrX0JZX0RJUl9IQVNIX3B1c2goZW50LT5oYXNoZXMsIGhlbnQpKQorCQkJCQl7CisJCQkJCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19YNTA5X1NUT1JFKTsKKwkJCQkJT1BFTlNTTF9mcmVlKGhlbnQpOworCQkJCQlvayA9IDA7CisJCQkJCWdvdG8gZmluaXNoOworCQkJCQl9CisJCQkJfQorCQkJZWxzZSBpZiAoaGVudC0+c3VmZml4IDwgaykKKwkJCQloZW50LT5zdWZmaXggPSBrOworCisJCQlDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfWDUwOV9TVE9SRSk7CisKKwkJCX0KKworCQlpZiAodG1wICE9IE5VTEwpCisJCQl7CisJCQlvaz0xOworCQkJcmV0LT50eXBlPXRtcC0+dHlwZTsKKwkJCW1lbWNweSgmcmV0LT5kYXRhLCZ0bXAtPmRhdGEsc2l6ZW9mKHJldC0+ZGF0YSkpOworCQkJLyogSWYgd2Ugd2VyZSBnb2luZyB0byB1cCB0aGUgcmVmZXJlbmNlIGNvdW50LAorCQkJICogd2Ugd291bGQgbmVlZCB0byBkbyBpdCBvbiBhIHBlcmwgJ3R5cGUnCisJCQkgKiBiYXNpcyAqLworCS8qCQlDUllQVE9fYWRkKCZ0bXAtPmRhdGEueDUwOS0+cmVmZXJlbmNlcywxLAorCQkJCUNSWVBUT19MT0NLX1g1MDkpOyovCisJCQlnb3RvIGZpbmlzaDsKKwkJCX0KKwkJfQorZmluaXNoOgorCWlmIChiICE9IE5VTEwpIEJVRl9NRU1fZnJlZShiKTsKKwlyZXR1cm4ob2spOworCX0KZGlmZiAtLWdpdCBhL2NyeXB0by94NTA5L2J5X2ZpbGUuYyBiL2NyeXB0by94NTA5L2J5X2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjQ5NjMxCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3g1MDkvYnlfZmlsZS5jCkBAIC0wLDAgKzEsMjkyIEBACisvKiBjcnlwdG8veDUwOS9ieV9maWxlLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2J1Zi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9saGFzaC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKKyNpZm5kZWYgT1BFTlNTTF9OT19TVERJTworCitzdGF0aWMgaW50IGJ5X2ZpbGVfY3RybChYNTA5X0xPT0tVUCAqY3R4LCBpbnQgY21kLCBjb25zdCBjaGFyICphcmdjLAorCWxvbmcgYXJnbCwgY2hhciAqKnJldCk7CitYNTA5X0xPT0tVUF9NRVRIT0QgeDUwOV9maWxlX2xvb2t1cD0KKwl7CisJIkxvYWQgZmlsZSBpbnRvIGNhY2hlIiwKKwlOVUxMLAkJLyogbmV3ICovCisJTlVMTCwJCS8qIGZyZWUgKi8KKwlOVUxMLCAJCS8qIGluaXQgKi8KKwlOVUxMLAkJLyogc2h1dGRvd24gKi8KKwlieV9maWxlX2N0cmwsCS8qIGN0cmwgKi8KKwlOVUxMLAkJLyogZ2V0X2J5X3N1YmplY3QgKi8KKwlOVUxMLAkJLyogZ2V0X2J5X2lzc3Vlcl9zZXJpYWwgKi8KKwlOVUxMLAkJLyogZ2V0X2J5X2ZpbmdlcnByaW50ICovCisJTlVMTCwJCS8qIGdldF9ieV9hbGlhcyAqLworCX07CisKK1g1MDlfTE9PS1VQX01FVEhPRCAqWDUwOV9MT09LVVBfZmlsZSh2b2lkKQorCXsKKwlyZXR1cm4oJng1MDlfZmlsZV9sb29rdXApOworCX0KKworc3RhdGljIGludCBieV9maWxlX2N0cmwoWDUwOV9MT09LVVAgKmN0eCwgaW50IGNtZCwgY29uc3QgY2hhciAqYXJncCwgbG9uZyBhcmdsLAorCSAgICAgY2hhciAqKnJldCkKKwl7CisJaW50IG9rPTA7CisJY2hhciAqZmlsZTsKKworCXN3aXRjaCAoY21kKQorCQl7CisJY2FzZSBYNTA5X0xfRklMRV9MT0FEOgorCQlpZiAoYXJnbCA9PSBYNTA5X0ZJTEVUWVBFX0RFRkFVTFQpCisJCQl7CisJCQlmaWxlID0gKGNoYXIgKilnZXRlbnYoWDUwOV9nZXRfZGVmYXVsdF9jZXJ0X2ZpbGVfZW52KCkpOworCQkJaWYgKGZpbGUpCisJCQkJb2sgPSAoWDUwOV9sb2FkX2NlcnRfY3JsX2ZpbGUoY3R4LGZpbGUsCisJCQkJCSAgICAgIFg1MDlfRklMRVRZUEVfUEVNKSAhPSAwKTsKKworCQkJZWxzZQorCQkJCW9rID0gKFg1MDlfbG9hZF9jZXJ0X2NybF9maWxlKGN0eCxYNTA5X2dldF9kZWZhdWx0X2NlcnRfZmlsZSgpLAorCQkJCQkgICAgICBYNTA5X0ZJTEVUWVBFX1BFTSkgIT0gMCk7CisKKwkJCWlmICghb2spCisJCQkJeworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIGJ5X2ZpbGVfY3RybCwgWDUwOV9SX0xPQURJTkdfREVGQVVMVFMpOworCQkJCX0KKwkJCX0KKwkJZWxzZQorCQkJeworCQkJaWYoYXJnbCA9PSBYNTA5X0ZJTEVUWVBFX1BFTSkKKwkJCQlvayA9IChYNTA5X2xvYWRfY2VydF9jcmxfZmlsZShjdHgsYXJncCwKKwkJCQkJWDUwOV9GSUxFVFlQRV9QRU0pICE9IDApOworCQkJZWxzZQorCQkJCW9rID0gKFg1MDlfbG9hZF9jZXJ0X2ZpbGUoY3R4LGFyZ3AsKGludClhcmdsKSAhPSAwKTsKKwkJCX0KKwkJYnJlYWs7CisJCX0KKwlyZXR1cm4ob2spOworCX0KKworaW50IFg1MDlfbG9hZF9jZXJ0X2ZpbGUoWDUwOV9MT09LVVAgKmN0eCwgY29uc3QgY2hhciAqZmlsZSwgaW50IHR5cGUpCisJeworCWludCByZXQ9MDsKKwlCSU8gKmluPU5VTEw7CisJaW50IGksY291bnQ9MDsKKwlYNTA5ICp4PU5VTEw7CisKKwlpZiAoZmlsZSA9PSBOVUxMKSByZXR1cm4oMSk7CisJaW49QklPX25ldyhCSU9fc19maWxlKCkpOworCisJaWYgKChpbiA9PSBOVUxMKSB8fCAoQklPX3JlYWRfZmlsZW5hbWUoaW4sZmlsZSkgPD0gMCkpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9sb2FkX2NlcnRfZmlsZSwgRVJSX1JfU1lTX0xJQik7CisJCWdvdG8gZXJyOworCQl9CisKKwlpZiAodHlwZSA9PSBYNTA5X0ZJTEVUWVBFX1BFTSkKKwkJeworCQlmb3IgKDs7KQorCQkJeworCQkJeD1QRU1fcmVhZF9iaW9fWDUwOV9BVVgoaW4sTlVMTCxOVUxMLE5VTEwpOworCQkJaWYgKHggPT0gTlVMTCkKKwkJCQl7CisJCQkJaWYgKChFUlJfR0VUX1JFQVNPTihFUlJfcGVla19sYXN0X2Vycm9yKCkpID09CisJCQkJCVBFTV9SX05PX1NUQVJUX0xJTkUpICYmIChjb3VudCA+IDApKQorCQkJCQl7CisJCQkJCUVSUl9jbGVhcl9lcnJvcigpOworCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCWVsc2UKKwkJCQkJeworCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X2xvYWRfY2VydF9maWxlLCBFUlJfUl9QRU1fTElCKTsKKwkJCQkJZ290byBlcnI7CisJCQkJCX0KKwkJCQl9CisJCQlpPVg1MDlfU1RPUkVfYWRkX2NlcnQoY3R4LT5zdG9yZV9jdHgseCk7CisJCQlpZiAoIWkpIGdvdG8gZXJyOworCQkJY291bnQrKzsKKwkJCVg1MDlfZnJlZSh4KTsKKwkJCXg9TlVMTDsKKwkJCX0KKwkJcmV0PWNvdW50OworCQl9CisJZWxzZSBpZiAodHlwZSA9PSBYNTA5X0ZJTEVUWVBFX0FTTjEpCisJCXsKKwkJeD1kMmlfWDUwOV9iaW8oaW4sTlVMTCk7CisJCWlmICh4ID09IE5VTEwpCisJCQl7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X2xvYWRfY2VydF9maWxlLCBFUlJfUl9BU04xX0xJQik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJaT1YNTA5X1NUT1JFX2FkZF9jZXJ0KGN0eC0+c3RvcmVfY3R4LHgpOworCQlpZiAoIWkpIGdvdG8gZXJyOworCQlyZXQ9aTsKKwkJfQorCWVsc2UKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X2xvYWRfY2VydF9maWxlLCBYNTA5X1JfQkFEX1g1MDlfRklMRVRZUEUpOworCQlnb3RvIGVycjsKKwkJfQorZXJyOgorCWlmICh4ICE9IE5VTEwpIFg1MDlfZnJlZSh4KTsKKwlpZiAoaW4gIT0gTlVMTCkgQklPX2ZyZWUoaW4pOworCXJldHVybihyZXQpOworCX0KKworaW50IFg1MDlfbG9hZF9jcmxfZmlsZShYNTA5X0xPT0tVUCAqY3R4LCBjb25zdCBjaGFyICpmaWxlLCBpbnQgdHlwZSkKKwl7CisJaW50IHJldD0wOworCUJJTyAqaW49TlVMTDsKKwlpbnQgaSxjb3VudD0wOworCVg1MDlfQ1JMICp4PU5VTEw7CisKKwlpZiAoZmlsZSA9PSBOVUxMKSByZXR1cm4oMSk7CisJaW49QklPX25ldyhCSU9fc19maWxlKCkpOworCisJaWYgKChpbiA9PSBOVUxMKSB8fCAoQklPX3JlYWRfZmlsZW5hbWUoaW4sZmlsZSkgPD0gMCkpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9sb2FkX2NybF9maWxlLCBFUlJfUl9TWVNfTElCKTsKKwkJZ290byBlcnI7CisJCX0KKworCWlmICh0eXBlID09IFg1MDlfRklMRVRZUEVfUEVNKQorCQl7CisJCWZvciAoOzspCisJCQl7CisJCQl4PVBFTV9yZWFkX2Jpb19YNTA5X0NSTChpbixOVUxMLE5VTEwsTlVMTCk7CisJCQlpZiAoeCA9PSBOVUxMKQorCQkJCXsKKwkJCQlpZiAoKEVSUl9HRVRfUkVBU09OKEVSUl9wZWVrX2xhc3RfZXJyb3IoKSkgPT0KKwkJCQkJUEVNX1JfTk9fU1RBUlRfTElORSkgJiYgKGNvdW50ID4gMCkpCisJCQkJCXsKKwkJCQkJRVJSX2NsZWFyX2Vycm9yKCk7CisJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJZWxzZQorCQkJCQl7CisJCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfbG9hZF9jcmxfZmlsZSwgRVJSX1JfUEVNX0xJQik7CisJCQkJCWdvdG8gZXJyOworCQkJCQl9CisJCQkJfQorCQkJaT1YNTA5X1NUT1JFX2FkZF9jcmwoY3R4LT5zdG9yZV9jdHgseCk7CisJCQlpZiAoIWkpIGdvdG8gZXJyOworCQkJY291bnQrKzsKKwkJCVg1MDlfQ1JMX2ZyZWUoeCk7CisJCQl4PU5VTEw7CisJCQl9CisJCXJldD1jb3VudDsKKwkJfQorCWVsc2UgaWYgKHR5cGUgPT0gWDUwOV9GSUxFVFlQRV9BU04xKQorCQl7CisJCXg9ZDJpX1g1MDlfQ1JMX2JpbyhpbixOVUxMKTsKKwkJaWYgKHggPT0gTlVMTCkKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfbG9hZF9jcmxfZmlsZSwgRVJSX1JfQVNOMV9MSUIpOworCQkJZ290byBlcnI7CisJCQl9CisJCWk9WDUwOV9TVE9SRV9hZGRfY3JsKGN0eC0+c3RvcmVfY3R4LHgpOworCQlpZiAoIWkpIGdvdG8gZXJyOworCQlyZXQ9aTsKKwkJfQorCWVsc2UKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X2xvYWRfY3JsX2ZpbGUsIFg1MDlfUl9CQURfWDUwOV9GSUxFVFlQRSk7CisJCWdvdG8gZXJyOworCQl9CitlcnI6CisJaWYgKHggIT0gTlVMTCkgWDUwOV9DUkxfZnJlZSh4KTsKKwlpZiAoaW4gIT0gTlVMTCkgQklPX2ZyZWUoaW4pOworCXJldHVybihyZXQpOworCX0KKworaW50IFg1MDlfbG9hZF9jZXJ0X2NybF9maWxlKFg1MDlfTE9PS1VQICpjdHgsIGNvbnN0IGNoYXIgKmZpbGUsIGludCB0eXBlKQoreworCVNUQUNLX09GKFg1MDlfSU5GTykgKmluZjsKKwlYNTA5X0lORk8gKml0bXA7CisJQklPICppbjsKKwlzaXplX3QgaTsKKwlpbnQgY291bnQgPSAwOworCWlmKHR5cGUgIT0gWDUwOV9GSUxFVFlQRV9QRU0pCisJCXJldHVybiBYNTA5X2xvYWRfY2VydF9maWxlKGN0eCwgZmlsZSwgdHlwZSk7CisJaW4gPSBCSU9fbmV3X2ZpbGUoZmlsZSwgInIiKTsKKwlpZighaW4pIHsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9sb2FkX2NlcnRfY3JsX2ZpbGUsIEVSUl9SX1NZU19MSUIpOworCQlyZXR1cm4gMDsKKwl9CisJaW5mID0gUEVNX1g1MDlfSU5GT19yZWFkX2JpbyhpbiwgTlVMTCwgTlVMTCwgTlVMTCk7CisJQklPX2ZyZWUoaW4pOworCWlmKCFpbmYpIHsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9sb2FkX2NlcnRfY3JsX2ZpbGUsIEVSUl9SX1BFTV9MSUIpOworCQlyZXR1cm4gMDsKKwl9CisJZm9yKGkgPSAwOyBpIDwgc2tfWDUwOV9JTkZPX251bShpbmYpOyBpKyspIHsKKwkJaXRtcCA9IHNrX1g1MDlfSU5GT192YWx1ZShpbmYsIGkpOworCQlpZihpdG1wLT54NTA5KSB7CisJCQlYNTA5X1NUT1JFX2FkZF9jZXJ0KGN0eC0+c3RvcmVfY3R4LCBpdG1wLT54NTA5KTsKKwkJCWNvdW50Kys7CisJCX0KKwkJaWYoaXRtcC0+Y3JsKSB7CisJCQlYNTA5X1NUT1JFX2FkZF9jcmwoY3R4LT5zdG9yZV9jdHgsIGl0bXAtPmNybCk7CisJCQljb3VudCsrOworCQl9CisJfQorCXNrX1g1MDlfSU5GT19wb3BfZnJlZShpbmYsIFg1MDlfSU5GT19mcmVlKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNlbmRpZiAvKiBPUEVOU1NMX05PX1NURElPICovCmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOS9jaGFybWFwLmggYi9jcnlwdG8veDUwOS9jaGFybWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1ZTYzOAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94NTA5L2NoYXJtYXAuaApAQCAtMCwwICsxLDE1IEBACisvKiBBdXRvIGdlbmVyYXRlZCB3aXRoIGNoYXJ0eXBlLnBsIHNjcmlwdC4KKyAqIE1hc2sgb2YgdmFyaW91cyBjaGFyYWN0ZXIgcHJvcGVydGllcworICovCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGNoYXJfdHlwZVtdID0geworIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKzEyMCwgMCwgMSw0MCwgMCwgMCwgMCwxNiwxNiwxNiwgMCwyNSwyNSwxNiwxNiwxNiwKKzE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LCA5LCA5LDE2LCA5LDE2LAorIDAsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsCisxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwgMCwgMSwgMCwgMCwgMCwKKyAwLDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LAorMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsIDAsIDAsIDAsIDAsIDIKK307CisKZGlmZiAtLWdpdCBhL2NyeXB0by94NTA5L2kyZF9wci5jIGIvY3J5cHRvL3g1MDkvaTJkX3ByLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg5NjU2NQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94NTA5L2kyZF9wci5jCkBAIC0wLDAgKzEsODMgQEAKKy8qIGNyeXB0by9hc24xL2kyZF9wci5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorCisjaW5jbHVkZSAiLi4vZXZwL2ludGVybmFsLmgiCisKKworaW50IGkyZF9Qcml2YXRlS2V5KGNvbnN0IEVWUF9QS0VZICphLCB1bnNpZ25lZCBjaGFyICoqcHApCisJeworCWlmIChhLT5hbWV0aCAmJiBhLT5hbWV0aC0+b2xkX3ByaXZfZW5jb2RlKQorCQl7CisJCXJldHVybiBhLT5hbWV0aC0+b2xkX3ByaXZfZW5jb2RlKGEsIHBwKTsKKwkJfQorCWlmIChhLT5hbWV0aCAmJiBhLT5hbWV0aC0+cHJpdl9lbmNvZGUpIHsKKwkJUEtDUzhfUFJJVl9LRVlfSU5GTyAqcDggPSBFVlBfUEtFWTJQS0NTOCgoRVZQX1BLRVkqKWEpOworCQlpbnQgcmV0ID0gaTJkX1BLQ1M4X1BSSVZfS0VZX0lORk8ocDgscHApOworCQlQS0NTOF9QUklWX0tFWV9JTkZPX2ZyZWUocDgpOworCQlyZXR1cm4gcmV0OworCX0KKwlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBpMmRfUHJpdmF0ZUtleSwgQVNOMV9SX1VOU1VQUE9SVEVEX1BVQkxJQ19LRVlfVFlQRSk7CisJcmV0dXJuIC0xOworCX0KKwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3g1MDkvcGtjczcuYyBiL2NyeXB0by94NTA5L3BrY3M3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJiYjM5MwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94NTA5L3BrY3M3LmMKQEAgLTAsMCArMSw5NyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE0LCBHb29nbGUgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQorICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLiAqLworCisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2J5dGVzdHJpbmcuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zdGFjay5oPgorCisKK2ludCBQS0NTN19nZXRfY2VydGlmaWNhdGVzKFNUQUNLX09GKFg1MDkpICpvdXRfY2VydHMsIENCUyAqY2JzKSB7CisgIC8qIFNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjMxNSNzZWN0aW9uLTkuMSAqLworICBDQlMgY29udGVudF9pbmZvLCBjb250ZW50X3R5cGUsIHdyYXBwZWRfc2lnbmVkX2RhdGEsIHNpZ25lZF9kYXRhLAorICAgICAgdmVyc2lvbl9ieXRlcywgY2VydGlmaWNhdGVzOworICBpbnQgbmlkOworICBjb25zdCBzaXplX3QgaW5pdGlhbF9jZXJ0c19sZW4gPSBza19YNTA5X251bShvdXRfY2VydHMpOworCisgIGlmICghQ0JTX2dldF9hc24xX2JlcihjYnMsICZjb250ZW50X2luZm8sIENCU19BU04xX1NFUVVFTkNFKSB8fAorICAgICAgIUNCU19nZXRfYXNuMSgmY29udGVudF9pbmZvLCAmY29udGVudF90eXBlLCBDQlNfQVNOMV9PQkpFQ1QpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBuaWQgPSBPQkpfY2JzMm5pZCgmY29udGVudF90eXBlKTsKKyAgaWYgKG5pZCAhPSBOSURfcGtjczdfc2lnbmVkKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgUEtDUzdfZ2V0X2NlcnRpZmljYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICBYNTA5X1JfTk9UX1BLQ1M3X1NJR05FRF9EQVRBKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmICghQ0JTX2dldF9hc24xX2JlcigmY29udGVudF9pbmZvLCAmd3JhcHBlZF9zaWduZWRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENCU19BU04xX0NPTlRFWFRfU1BFQ0lGSUMgfCBDQlNfQVNOMV9DT05TVFJVQ1RFRCB8IDApIHx8CisgICAgICAhQ0JTX2dldF9hc24xX2Jlcigmd3JhcHBlZF9zaWduZWRfZGF0YSwgJnNpZ25lZF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0JTX0FTTjFfU0VRVUVOQ0UpIHx8CisgICAgICAhQ0JTX2dldF9hc24xX2Jlcigmc2lnbmVkX2RhdGEsICZ2ZXJzaW9uX2J5dGVzLCBDQlNfQVNOMV9JTlRFR0VSKSB8fAorICAgICAgIUNCU19nZXRfYXNuMV9iZXIoJnNpZ25lZF9kYXRhLCBOVUxMIC8qIGRpZ2VzdHMgKi8sIENCU19BU04xX1NFVCkgfHwKKyAgICAgICFDQlNfZ2V0X2FzbjFfYmVyKCZzaWduZWRfZGF0YSwgTlVMTCAvKiBjb250ZW50ICovLCBDQlNfQVNOMV9TRVFVRU5DRSkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChDQlNfbGVuKCZ2ZXJzaW9uX2J5dGVzKSA8IDEgfHwgQ0JTX2RhdGEoJnZlcnNpb25fYnl0ZXMpWzBdID09IDApIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBQS0NTN19nZXRfY2VydGlmaWNhdGVzLAorICAgICAgICAgICAgICAgICAgICAgIFg1MDlfUl9CQURfUEtDUzdfVkVSU0lPTik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoIUNCU19nZXRfYXNuMV9iZXIoJnNpZ25lZF9kYXRhLCAmY2VydGlmaWNhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0JTX0FTTjFfQ09OVEVYVF9TUEVDSUZJQyB8IENCU19BU04xX0NPTlNUUlVDVEVEIHwgMCkpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBQS0NTN19nZXRfY2VydGlmaWNhdGVzLAorICAgICAgICAgICAgICAgICAgICAgIFg1MDlfUl9OT19DRVJUSUZJQ0FURVNfSU5DTFVERUQpOworICAgIHJldHVybiAwOworICB9CisKKyAgd2hpbGUgKENCU19sZW4oJmNlcnRpZmljYXRlcykgPiAwKSB7CisgICAgQ0JTIGNlcnQ7CisgICAgWDUwOSAqeDUwOTsKKyAgICBjb25zdCB1aW50OF90ICppbnA7CisKKyAgICBpZiAoIUNCU19nZXRfYXNuMV9lbGVtZW50KCZjZXJ0aWZpY2F0ZXMsICZjZXJ0LCBDQlNfQVNOMV9TRVFVRU5DRSkpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGlucCA9IENCU19kYXRhKCZjZXJ0KTsKKyAgICB4NTA5ID0gZDJpX1g1MDkoTlVMTCwgJmlucCwgQ0JTX2xlbigmY2VydCkpOworICAgIGlmICgheDUwOSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgaWYgKGlucCAhPSBDQlNfZGF0YSgmY2VydCkgKyBDQlNfbGVuKCZjZXJ0KSkgeworICAgICAgLyogVGhpcyBzdWdnZXN0cyBhIGRpc2Nvbm5lY3QgYmV0d2VlbiB0aGUgdHdvIEFTTi4xIHBhcnNlcnMuICovCisgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBza19YNTA5X3B1c2gob3V0X2NlcnRzLCB4NTA5KTsKKyAgfQorCisgIHJldHVybiAxOworCitlcnI6CisgIHdoaWxlIChza19YNTA5X251bShvdXRfY2VydHMpICE9IGluaXRpYWxfY2VydHNfbGVuKSB7CisgICAgWDUwOSAqeDUwOSA9IHNrX1g1MDlfcG9wKG91dF9jZXJ0cyk7CisgICAgWDUwOV9mcmVlKHg1MDkpOworICB9CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOS90X2NybC5jIGIvY3J5cHRvL3g1MDkvdF9jcmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmIyZWUyCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3g1MDkvdF9jcmwuYwpAQCAtMCwwICsxLDEzMCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisKKworI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQoraW50IFg1MDlfQ1JMX3ByaW50X2ZwKEZJTEUgKmZwLCBYNTA5X0NSTCAqeCkKKyAgICAgICAgeworICAgICAgICBCSU8gKmI7CisgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgaWYgKChiPUJJT19uZXcoQklPX3NfZmlsZSgpKSkgPT0gTlVMTCkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X0NSTF9wcmludF9mcCwgRVJSX1JfQlVGX0xJQik7CisgICAgICAgICAgICAgICAgcmV0dXJuKDApOworCQl9CisgICAgICAgIEJJT19zZXRfZnAoYixmcCxCSU9fTk9DTE9TRSk7CisgICAgICAgIHJldD1YNTA5X0NSTF9wcmludChiLCB4KTsKKyAgICAgICAgQklPX2ZyZWUoYik7CisgICAgICAgIHJldHVybihyZXQpOworICAgICAgICB9CisjZW5kaWYKKworaW50IFg1MDlfQ1JMX3ByaW50KEJJTyAqb3V0LCBYNTA5X0NSTCAqeCkKK3sKKwlTVEFDS19PRihYNTA5X1JFVk9LRUQpICpyZXY7CisJWDUwOV9SRVZPS0VEICpyOworCWxvbmcgbDsKKwlzaXplX3QgaTsKKwljaGFyICpwOworCisJQklPX3ByaW50ZihvdXQsICJDZXJ0aWZpY2F0ZSBSZXZvY2F0aW9uIExpc3QgKENSTCk6XG4iKTsKKwlsID0gWDUwOV9DUkxfZ2V0X3ZlcnNpb24oeCk7CisJQklPX3ByaW50ZihvdXQsICIlOHNWZXJzaW9uICVsdSAoMHglbHgpXG4iLCAiIiwgbCsxLCBsKTsKKwlpID0gT0JKX29iajJuaWQoeC0+c2lnX2FsZy0+YWxnb3JpdGhtKTsKKwlYNTA5X3NpZ25hdHVyZV9wcmludChvdXQsIHgtPnNpZ19hbGcsIE5VTEwpOworCXA9WDUwOV9OQU1FX29uZWxpbmUoWDUwOV9DUkxfZ2V0X2lzc3Vlcih4KSxOVUxMLDApOworCUJJT19wcmludGYob3V0LCIlOHNJc3N1ZXI6ICVzXG4iLCIiLHApOworCU9QRU5TU0xfZnJlZShwKTsKKwlCSU9fcHJpbnRmKG91dCwiJThzTGFzdCBVcGRhdGU6ICIsIiIpOworCUFTTjFfVElNRV9wcmludChvdXQsWDUwOV9DUkxfZ2V0X2xhc3RVcGRhdGUoeCkpOworCUJJT19wcmludGYob3V0LCJcbiU4c05leHQgVXBkYXRlOiAiLCIiKTsKKwlpZiAoWDUwOV9DUkxfZ2V0X25leHRVcGRhdGUoeCkpCisJCSBBU04xX1RJTUVfcHJpbnQob3V0LFg1MDlfQ1JMX2dldF9uZXh0VXBkYXRlKHgpKTsKKwllbHNlIEJJT19wcmludGYob3V0LCJOT05FIik7CisJQklPX3ByaW50ZihvdXQsIlxuIik7CisKKwlYNTA5VjNfZXh0ZW5zaW9uc19wcmludChvdXQsICJDUkwgZXh0ZW5zaW9ucyIsCisJCQkJCQl4LT5jcmwtPmV4dGVuc2lvbnMsIDAsIDgpOworCisJcmV2ID0gWDUwOV9DUkxfZ2V0X1JFVk9LRUQoeCk7CisKKwlpZihza19YNTA5X1JFVk9LRURfbnVtKHJldikgPiAwKQorCSAgICBCSU9fcHJpbnRmKG91dCwgIlJldm9rZWQgQ2VydGlmaWNhdGVzOlxuIik7CisJZWxzZSBCSU9fcHJpbnRmKG91dCwgIk5vIFJldm9rZWQgQ2VydGlmaWNhdGVzLlxuIik7CisKKwlmb3IoaSA9IDA7IGkgPCBza19YNTA5X1JFVk9LRURfbnVtKHJldik7IGkrKykgeworCQlyID0gc2tfWDUwOV9SRVZPS0VEX3ZhbHVlKHJldiwgaSk7CisJCUJJT19wcmludGYob3V0LCIgICAgU2VyaWFsIE51bWJlcjogIik7CisJCWkyYV9BU04xX0lOVEVHRVIob3V0LHItPnNlcmlhbE51bWJlcik7CisJCUJJT19wcmludGYob3V0LCJcbiAgICAgICAgUmV2b2NhdGlvbiBEYXRlOiAiKTsKKwkJQVNOMV9USU1FX3ByaW50KG91dCxyLT5yZXZvY2F0aW9uRGF0ZSk7CisJCUJJT19wcmludGYob3V0LCJcbiIpOworCQlYNTA5VjNfZXh0ZW5zaW9uc19wcmludChvdXQsICJDUkwgZW50cnkgZXh0ZW5zaW9ucyIsCisJCQkJCQlyLT5leHRlbnNpb25zLCAwLCA4KTsKKwl9CisJWDUwOV9zaWduYXR1cmVfcHJpbnQob3V0LCB4LT5zaWdfYWxnLCB4LT5zaWduYXR1cmUpOworCisJcmV0dXJuIDE7CisKK30KZGlmZiAtLWdpdCBhL2NyeXB0by94NTA5L3RfeDUwOS5jIGIvY3J5cHRvL3g1MDkvdF94NTA5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFkNGFjNwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94NTA5L3RfeDUwOS5jCkBAIC0wLDAgKzEsNTE2IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2RpZ2VzdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworI2luY2x1ZGUgIi4uL2V2cC9pbnRlcm5hbC5oIgorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitpbnQgWDUwOV9wcmludF9leF9mcChGSUxFICpmcCwgWDUwOSAqeCwgdW5zaWduZWQgbG9uZyBubWZsYWcsIHVuc2lnbmVkIGxvbmcgY2ZsYWcpCisgICAgICAgIHsKKyAgICAgICAgQklPICpiOworICAgICAgICBpbnQgcmV0OworCisgICAgICAgIGlmICgoYj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpID09IE5VTEwpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9wcmludF9leF9mcCwgRVJSX1JfQlVGX0xJQik7CisgICAgICAgICAgICAgICAgcmV0dXJuKDApOworCQl9CisgICAgICAgIEJJT19zZXRfZnAoYixmcCxCSU9fTk9DTE9TRSk7CisgICAgICAgIHJldD1YNTA5X3ByaW50X2V4KGIsIHgsIG5tZmxhZywgY2ZsYWcpOworICAgICAgICBCSU9fZnJlZShiKTsKKyAgICAgICAgcmV0dXJuKHJldCk7CisgICAgICAgIH0KKworaW50IFg1MDlfcHJpbnRfZnAoRklMRSAqZnAsIFg1MDkgKngpCisJeworCXJldHVybiBYNTA5X3ByaW50X2V4X2ZwKGZwLCB4LCBYTl9GTEFHX0NPTVBBVCwgWDUwOV9GTEFHX0NPTVBBVCk7CisJfQorI2VuZGlmCisKK2ludCBYNTA5X3ByaW50KEJJTyAqYnAsIFg1MDkgKngpCit7CisJcmV0dXJuIFg1MDlfcHJpbnRfZXgoYnAsIHgsIFhOX0ZMQUdfQ09NUEFULCBYNTA5X0ZMQUdfQ09NUEFUKTsKK30KKworaW50IFg1MDlfcHJpbnRfZXgoQklPICpicCwgWDUwOSAqeCwgdW5zaWduZWQgbG9uZyBubWZsYWdzLCB1bnNpZ25lZCBsb25nIGNmbGFnKQorCXsKKwlsb25nIGw7CisJaW50IHJldD0wLGk7CisJY2hhciAqbT1OVUxMLG1sY2ggPSAnICc7CisJaW50IG5taW5kZW50ID0gMDsKKwlYNTA5X0NJTkYgKmNpOworCUFTTjFfSU5URUdFUiAqYnM7CisJRVZQX1BLRVkgKnBrZXk9TlVMTDsKKwljb25zdCBjaGFyICpuZWc7CisKKwlpZigobm1mbGFncyAmIFhOX0ZMQUdfU0VQX01BU0spID09IFhOX0ZMQUdfU0VQX01VTFRJTElORSkgeworCQkJbWxjaCA9ICdcbic7CisJCQlubWluZGVudCA9IDEyOworCX0KKworCWlmKG5tZmxhZ3MgPT0gWDUwOV9GTEFHX0NPTVBBVCkKKwkJbm1pbmRlbnQgPSAxNjsKKworCWNpPXgtPmNlcnRfaW5mbzsKKwlpZighKGNmbGFnICYgWDUwOV9GTEFHX05PX0hFQURFUikpCisJCXsKKwkJaWYgKEJJT193cml0ZShicCwiQ2VydGlmaWNhdGU6XG4iLDEzKSA8PSAwKSBnb3RvIGVycjsKKwkJaWYgKEJJT193cml0ZShicCwiICAgIERhdGE6XG4iLDEwKSA8PSAwKSBnb3RvIGVycjsKKwkJfQorCWlmKCEoY2ZsYWcgJiBYNTA5X0ZMQUdfTk9fVkVSU0lPTikpCisJCXsKKwkJbD1YNTA5X2dldF92ZXJzaW9uKHgpOworCQlpZiAoQklPX3ByaW50ZihicCwiJThzVmVyc2lvbjogJWx1ICgweCVseClcbiIsIiIsbCsxLGwpIDw9IDApIGdvdG8gZXJyOworCQl9CisJaWYoIShjZmxhZyAmIFg1MDlfRkxBR19OT19TRVJJQUwpKQorCQl7CisKKwkJaWYgKEJJT193cml0ZShicCwiICAgICAgICBTZXJpYWwgTnVtYmVyOiIsMjIpIDw9IDApIGdvdG8gZXJyOworCisJCWJzPVg1MDlfZ2V0X3NlcmlhbE51bWJlcih4KTsKKwkJaWYgKGJzLT5sZW5ndGggPD0gKGludClzaXplb2YobG9uZykpCisJCQl7CisJCQlsPUFTTjFfSU5URUdFUl9nZXQoYnMpOworCQkJaWYgKGJzLT50eXBlID09IFZfQVNOMV9ORUdfSU5URUdFUikKKwkJCQl7CisJCQkJbD0gLWw7CisJCQkJbmVnPSItIjsKKwkJCQl9CisJCQllbHNlCisJCQkJbmVnPSIiOworCQkJaWYgKEJJT19wcmludGYoYnAsIiAlcyVsdSAoJXMweCVseClcbiIsbmVnLGwsbmVnLGwpIDw9IDApCisJCQkJZ290byBlcnI7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCW5lZz0oYnMtPnR5cGUgPT0gVl9BU04xX05FR19JTlRFR0VSKT8iIChOZWdhdGl2ZSkiOiIiOworCQkJaWYgKEJJT19wcmludGYoYnAsIlxuJTEycyVzIiwiIixuZWcpIDw9IDApIGdvdG8gZXJyOworCisJCQlmb3IgKGk9MDsgaTxicy0+bGVuZ3RoOyBpKyspCisJCQkJeworCQkJCWlmIChCSU9fcHJpbnRmKGJwLCIlMDJ4JWMiLGJzLT5kYXRhW2ldLAorCQkJCQkoKGkrMSA9PSBicy0+bGVuZ3RoKT8nXG4nOic6JykpIDw9IDApCisJCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCX0KKworCQl9CisKKwlpZighKGNmbGFnICYgWDUwOV9GTEFHX05PX1NJR05BTUUpKQorCQl7CisJCWlmKFg1MDlfc2lnbmF0dXJlX3ByaW50KGJwLCB4LT5zaWdfYWxnLCBOVUxMKSA8PSAwKQorCQkJZ290byBlcnI7CisjaWYgMAorCQlpZiAoQklPX3ByaW50ZihicCwiJThzU2lnbmF0dXJlIEFsZ29yaXRobTogIiwiIikgPD0gMCkgCisJCQlnb3RvIGVycjsKKwkJaWYgKGkyYV9BU04xX09CSkVDVChicCwgY2ktPnNpZ25hdHVyZS0+YWxnb3JpdGhtKSA8PSAwKQorCQkJZ290byBlcnI7CisJCWlmIChCSU9fcHV0cyhicCwgIlxuIikgPD0gMCkKKwkJCWdvdG8gZXJyOworI2VuZGlmCisJCX0KKworCWlmKCEoY2ZsYWcgJiBYNTA5X0ZMQUdfTk9fSVNTVUVSKSkKKwkJeworCQlpZiAoQklPX3ByaW50ZihicCwiICAgICAgICBJc3N1ZXI6JWMiLG1sY2gpIDw9IDApIGdvdG8gZXJyOworCQlpZiAoWDUwOV9OQU1FX3ByaW50X2V4KGJwLFg1MDlfZ2V0X2lzc3Vlcl9uYW1lKHgpLG5taW5kZW50LCBubWZsYWdzKSA8IDApIGdvdG8gZXJyOworCQlpZiAoQklPX3dyaXRlKGJwLCJcbiIsMSkgPD0gMCkgZ290byBlcnI7CisJCX0KKwlpZighKGNmbGFnICYgWDUwOV9GTEFHX05PX1ZBTElESVRZKSkKKwkJeworCQlpZiAoQklPX3dyaXRlKGJwLCIgICAgICAgIFZhbGlkaXR5XG4iLDE3KSA8PSAwKSBnb3RvIGVycjsKKwkJaWYgKEJJT193cml0ZShicCwiICAgICAgICAgICAgTm90IEJlZm9yZTogIiwyNCkgPD0gMCkgZ290byBlcnI7CisJCWlmICghQVNOMV9USU1FX3ByaW50KGJwLFg1MDlfZ2V0X25vdEJlZm9yZSh4KSkpIGdvdG8gZXJyOworCQlpZiAoQklPX3dyaXRlKGJwLCJcbiAgICAgICAgICAgIE5vdCBBZnRlciA6ICIsMjUpIDw9IDApIGdvdG8gZXJyOworCQlpZiAoIUFTTjFfVElNRV9wcmludChicCxYNTA5X2dldF9ub3RBZnRlcih4KSkpIGdvdG8gZXJyOworCQlpZiAoQklPX3dyaXRlKGJwLCJcbiIsMSkgPD0gMCkgZ290byBlcnI7CisJCX0KKwlpZighKGNmbGFnICYgWDUwOV9GTEFHX05PX1NVQkpFQ1QpKQorCQl7CisJCWlmIChCSU9fcHJpbnRmKGJwLCIgICAgICAgIFN1YmplY3Q6JWMiLG1sY2gpIDw9IDApIGdvdG8gZXJyOworCQlpZiAoWDUwOV9OQU1FX3ByaW50X2V4KGJwLFg1MDlfZ2V0X3N1YmplY3RfbmFtZSh4KSxubWluZGVudCwgbm1mbGFncykgPCAwKSBnb3RvIGVycjsKKwkJaWYgKEJJT193cml0ZShicCwiXG4iLDEpIDw9IDApIGdvdG8gZXJyOworCQl9CisJaWYoIShjZmxhZyAmIFg1MDlfRkxBR19OT19QVUJLRVkpKQorCQl7CisJCWlmIChCSU9fd3JpdGUoYnAsIiAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86XG4iLDMzKSA8PSAwKQorCQkJZ290byBlcnI7CisJCWlmIChCSU9fcHJpbnRmKGJwLCIlMTJzUHVibGljIEtleSBBbGdvcml0aG06ICIsIiIpIDw9IDApCisJCQlnb3RvIGVycjsKKwkJaWYgKGkyYV9BU04xX09CSkVDVChicCwgY2ktPmtleS0+YWxnb3ItPmFsZ29yaXRobSkgPD0gMCkKKwkJCWdvdG8gZXJyOworCQlpZiAoQklPX3B1dHMoYnAsICJcbiIpIDw9IDApCisJCQlnb3RvIGVycjsKKworCQlwa2V5PVg1MDlfZ2V0X3B1YmtleSh4KTsKKwkJaWYgKHBrZXkgPT0gTlVMTCkKKwkJCXsKKwkJCUJJT19wcmludGYoYnAsIiUxMnNVbmFibGUgdG8gbG9hZCBQdWJsaWMgS2V5XG4iLCIiKTsKKwkJCUJJT19wcmludF9lcnJvcnMoYnApOworCQkJfQorCQllbHNlCisJCQl7CisJCQlFVlBfUEtFWV9wcmludF9wdWJsaWMoYnAsIHBrZXksIDE2LCBOVUxMKTsKKwkJCUVWUF9QS0VZX2ZyZWUocGtleSk7CisJCQl9CisJCX0KKworCWlmKCEoY2ZsYWcgJiBYNTA5X0ZMQUdfTk9fSURTKSkKKwkJeworCQlpZiAoY2ktPmlzc3VlclVJRCkKKwkJCXsKKwkJCWlmIChCSU9fcHJpbnRmKGJwLCIlOHNJc3N1ZXIgVW5pcXVlIElEOiAiLCIiKSA8PSAwKSAKKwkJCQlnb3RvIGVycjsKKwkJCWlmICghWDUwOV9zaWduYXR1cmVfZHVtcChicCwgY2ktPmlzc3VlclVJRCwgMTIpKQorCQkJCWdvdG8gZXJyOworCQkJfQorCQlpZiAoY2ktPnN1YmplY3RVSUQpCisJCQl7CisJCQlpZiAoQklPX3ByaW50ZihicCwiJThzU3ViamVjdCBVbmlxdWUgSUQ6ICIsIiIpIDw9IDApIAorCQkJCWdvdG8gZXJyOworCQkJaWYgKCFYNTA5X3NpZ25hdHVyZV9kdW1wKGJwLCBjaS0+c3ViamVjdFVJRCwgMTIpKQorCQkJCWdvdG8gZXJyOworCQkJfQorCQl9CisKKwlpZiAoIShjZmxhZyAmIFg1MDlfRkxBR19OT19FWFRFTlNJT05TKSkKKwkJWDUwOVYzX2V4dGVuc2lvbnNfcHJpbnQoYnAsICJYNTA5djMgZXh0ZW5zaW9ucyIsCisJCQkJCWNpLT5leHRlbnNpb25zLCBjZmxhZywgOCk7CisKKwlpZighKGNmbGFnICYgWDUwOV9GTEFHX05PX1NJR0RVTVApKQorCQl7CisJCWlmKFg1MDlfc2lnbmF0dXJlX3ByaW50KGJwLCB4LT5zaWdfYWxnLCB4LT5zaWduYXR1cmUpIDw9IDApIGdvdG8gZXJyOworCQl9CisJaWYoIShjZmxhZyAmIFg1MDlfRkxBR19OT19BVVgpKQorCQl7CisJCWlmICghWDUwOV9DRVJUX0FVWF9wcmludChicCwgeC0+YXV4LCAwKSkgZ290byBlcnI7CisJCX0KKwlyZXQ9MTsKK2VycjoKKwlpZiAobSAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUobSk7CisJcmV0dXJuKHJldCk7CisJfQorCitpbnQgWDUwOV9vY3NwaWRfcHJpbnQgKEJJTyAqYnAsIFg1MDkgKngpCisJeworCXVuc2lnbmVkIGNoYXIgKmRlcj1OVUxMIDsKKwl1bnNpZ25lZCBjaGFyICpkZXJ0bXA7CisJaW50IGRlcmxlbjsKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIFNIQTFtZFtTSEFfRElHRVNUX0xFTkdUSF07CisKKwkvKiBkaXNwbGF5IHRoZSBoYXNoIG9mIHRoZSBzdWJqZWN0IGFzIGl0IHdvdWxkIGFwcGVhcgorCSAgIGluIE9DU1AgcmVxdWVzdHMgKi8KKwlpZiAoQklPX3ByaW50ZihicCwiICAgICAgICBTdWJqZWN0IE9DU1AgaGFzaDogIikgPD0gMCkKKwkJZ290byBlcnI7CisJZGVybGVuID0gaTJkX1g1MDlfTkFNRSh4LT5jZXJ0X2luZm8tPnN1YmplY3QsIE5VTEwpOworCWlmICgoZGVyID0gZGVydG1wID0gKHVuc2lnbmVkIGNoYXIgKilPUEVOU1NMX21hbGxvYyAoZGVybGVuKSkgPT0gTlVMTCkKKwkJZ290byBlcnI7CisJaTJkX1g1MDlfTkFNRSh4LT5jZXJ0X2luZm8tPnN1YmplY3QsICZkZXJ0bXApOworCisJaWYgKCFFVlBfRGlnZXN0KGRlciwgZGVybGVuLCBTSEExbWQsIE5VTEwsIEVWUF9zaGExKCksIE5VTEwpKQorCQlnb3RvIGVycjsKKwlmb3IgKGk9MDsgaSA8IFNIQV9ESUdFU1RfTEVOR1RIOyBpKyspCisJCXsKKwkJaWYgKEJJT19wcmludGYoYnAsIiUwMlgiLFNIQTFtZFtpXSkgPD0gMCkgZ290byBlcnI7CisJCX0KKwlPUEVOU1NMX2ZyZWUgKGRlcik7CisJZGVyPU5VTEw7CisKKwkvKiBkaXNwbGF5IHRoZSBoYXNoIG9mIHRoZSBwdWJsaWMga2V5IGFzIGl0IHdvdWxkIGFwcGVhcgorCSAgIGluIE9DU1AgcmVxdWVzdHMgKi8KKwlpZiAoQklPX3ByaW50ZihicCwiXG4gICAgICAgIFB1YmxpYyBrZXkgT0NTUCBoYXNoOiAiKSA8PSAwKQorCQlnb3RvIGVycjsKKworCWlmICghRVZQX0RpZ2VzdCh4LT5jZXJ0X2luZm8tPmtleS0+cHVibGljX2tleS0+ZGF0YSwKKwkJCXgtPmNlcnRfaW5mby0+a2V5LT5wdWJsaWNfa2V5LT5sZW5ndGgsCisJCQlTSEExbWQsIE5VTEwsIEVWUF9zaGExKCksIE5VTEwpKQorCQlnb3RvIGVycjsKKwlmb3IgKGk9MDsgaSA8IFNIQV9ESUdFU1RfTEVOR1RIOyBpKyspCisJCXsKKwkJaWYgKEJJT19wcmludGYoYnAsIiUwMlgiLFNIQTFtZFtpXSkgPD0gMCkKKwkJCWdvdG8gZXJyOworCQl9CisJQklPX3ByaW50ZihicCwiXG4iKTsKKworCXJldHVybiAoMSk7CitlcnI6CisJaWYgKGRlciAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUoZGVyKTsKKwlyZXR1cm4oMCk7CisJfQorCitpbnQgWDUwOV9zaWduYXR1cmVfcHJpbnQoQklPICpicCwgWDUwOV9BTEdPUiAqc2lnYWxnLCBBU04xX1NUUklORyAqc2lnKQoreworCWludCBzaWdfbmlkOworCWlmIChCSU9fcHV0cyhicCwiICAgIFNpZ25hdHVyZSBBbGdvcml0aG06ICIpIDw9IDApIHJldHVybiAwOworCWlmIChpMmFfQVNOMV9PQkpFQ1QoYnAsIHNpZ2FsZy0+YWxnb3JpdGhtKSA8PSAwKSByZXR1cm4gMDsKKworCXNpZ19uaWQgPSBPQkpfb2JqMm5pZChzaWdhbGctPmFsZ29yaXRobSk7CisJaWYgKHNpZ19uaWQgIT0gTklEX3VuZGVmKQorCQl7CisJCWludCBwa2V5X25pZCwgZGlnX25pZDsKKwkJY29uc3QgRVZQX1BLRVlfQVNOMV9NRVRIT0QgKmFtZXRoOworCQlpZiAoT0JKX2ZpbmRfc2lnaWRfYWxncyhzaWdfbmlkLCAmZGlnX25pZCwgJnBrZXlfbmlkKSkKKwkJCXsKKwkJCWFtZXRoID0gRVZQX1BLRVlfYXNuMV9maW5kKE5VTEwsIHBrZXlfbmlkKTsKKwkJCWlmIChhbWV0aCAmJiBhbWV0aC0+c2lnX3ByaW50KQorCQkJCXJldHVybiBhbWV0aC0+c2lnX3ByaW50KGJwLCBzaWdhbGcsIHNpZywgOSwgMCk7CisJCQl9CisJCX0KKwlpZiAoc2lnKQorCQlyZXR1cm4gWDUwOV9zaWduYXR1cmVfZHVtcChicCwgc2lnLCA5KTsKKwllbHNlIGlmIChCSU9fcHV0cyhicCwgIlxuIikgPD0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK2ludCBBU04xX1NUUklOR19wcmludChCSU8gKmJwLCBjb25zdCBBU04xX1NUUklORyAqdikKKwl7CisJaW50IGksbjsKKwljaGFyIGJ1Zls4MF07CisJY29uc3QgY2hhciAqcDsKKworCWlmICh2ID09IE5VTEwpIHJldHVybigwKTsKKwluPTA7CisJcD0oY29uc3QgY2hhciAqKXYtPmRhdGE7CisJZm9yIChpPTA7IGk8di0+bGVuZ3RoOyBpKyspCisJCXsKKwkJaWYgKChwW2ldID4gJ34nKSB8fCAoKHBbaV0gPCAnICcpICYmCisJCQkocFtpXSAhPSAnXG4nKSAmJiAocFtpXSAhPSAnXHInKSkpCisJCQlidWZbbl09Jy4nOworCQllbHNlCisJCQlidWZbbl09cFtpXTsKKwkJbisrOworCQlpZiAobiA+PSA4MCkKKwkJCXsKKwkJCWlmIChCSU9fd3JpdGUoYnAsYnVmLG4pIDw9IDApCisJCQkJcmV0dXJuKDApOworCQkJbj0wOworCQkJfQorCQl9CisJaWYgKG4gPiAwKQorCQlpZiAoQklPX3dyaXRlKGJwLGJ1ZixuKSA8PSAwKQorCQkJcmV0dXJuKDApOworCXJldHVybigxKTsKKwl9CisKK2ludCBBU04xX1RJTUVfcHJpbnQoQklPICpicCwgY29uc3QgQVNOMV9USU1FICp0bSkKK3sKKwlpZih0bS0+dHlwZSA9PSBWX0FTTjFfVVRDVElNRSkgcmV0dXJuIEFTTjFfVVRDVElNRV9wcmludChicCwgdG0pOworCWlmKHRtLT50eXBlID09IFZfQVNOMV9HRU5FUkFMSVpFRFRJTUUpCisJCQkJcmV0dXJuIEFTTjFfR0VORVJBTElaRURUSU1FX3ByaW50KGJwLCB0bSk7CisJQklPX3dyaXRlKGJwLCJCYWQgdGltZSB2YWx1ZSIsMTQpOworCXJldHVybigwKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKm1vblsxMl09CisgICAgeworICAgICJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLAorICAgICJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiCisgICAgfTsKKworaW50IEFTTjFfR0VORVJBTElaRURUSU1FX3ByaW50KEJJTyAqYnAsIGNvbnN0IEFTTjFfR0VORVJBTElaRURUSU1FICp0bSkKKwl7CisJY2hhciAqdjsKKwlpbnQgZ210PTA7CisJaW50IGk7CisJaW50IHk9MCxNPTAsZD0wLGg9MCxtPTAscz0wOworCWNoYXIgKmYgPSBOVUxMOworCWludCBmX2xlbiA9IDA7CisKKwlpPXRtLT5sZW5ndGg7CisJdj0oY2hhciAqKXRtLT5kYXRhOworCisJaWYgKGkgPCAxMikgZ290byBlcnI7CisJaWYgKHZbaS0xXSA9PSAnWicpIGdtdD0xOworCWZvciAoaT0wOyBpPDEyOyBpKyspCisJCWlmICgodltpXSA+ICc5JykgfHwgKHZbaV0gPCAnMCcpKSBnb3RvIGVycjsKKwl5PSAodlswXS0nMCcpKjEwMDArKHZbMV0tJzAnKSoxMDAgKyAodlsyXS0nMCcpKjEwKyh2WzNdLScwJyk7CisJTT0gKHZbNF0tJzAnKSoxMCsodls1XS0nMCcpOworCWlmICgoTSA+IDEyKSB8fCAoTSA8IDEpKSBnb3RvIGVycjsKKwlkPSAodls2XS0nMCcpKjEwKyh2WzddLScwJyk7CisJaD0gKHZbOF0tJzAnKSoxMCsodls5XS0nMCcpOworCW09ICAodlsxMF0tJzAnKSoxMCsodlsxMV0tJzAnKTsKKwlpZiAodG0tPmxlbmd0aCA+PSAxNCAmJgorCSAgICAodlsxMl0gPj0gJzAnKSAmJiAodlsxMl0gPD0gJzknKSAmJgorCSAgICAodlsxM10gPj0gJzAnKSAmJiAodlsxM10gPD0gJzknKSkKKwkJeworCQlzPSAgKHZbMTJdLScwJykqMTArKHZbMTNdLScwJyk7CisJCS8qIENoZWNrIGZvciBmcmFjdGlvbnMgb2Ygc2Vjb25kcy4gKi8KKwkJaWYgKHRtLT5sZW5ndGggPj0gMTUgJiYgdlsxNF0gPT0gJy4nKQorCQkJeworCQkJaW50IGwgPSB0bS0+bGVuZ3RoOworCQkJZiA9ICZ2WzE0XTsJLyogVGhlIGRlY2ltYWwgcG9pbnQuICovCisJCQlmX2xlbiA9IDE7CisJCQl3aGlsZSAoMTQgKyBmX2xlbiA8IGwgJiYgZltmX2xlbl0gPj0gJzAnICYmIGZbZl9sZW5dIDw9ICc5JykKKwkJCQkrK2ZfbGVuOworCQkJfQorCQl9CisKKwlpZiAoQklPX3ByaW50ZihicCwiJXMgJTJkICUwMmQ6JTAyZDolMDJkJS4qcyAlZCVzIiwKKwkJbW9uW00tMV0sZCxoLG0scyxmX2xlbixmLHksKGdtdCk/IiBHTVQiOiIiKSA8PSAwKQorCQlyZXR1cm4oMCk7CisJZWxzZQorCQlyZXR1cm4oMSk7CitlcnI6CisJQklPX3dyaXRlKGJwLCJCYWQgdGltZSB2YWx1ZSIsMTQpOworCXJldHVybigwKTsKKwl9CisKK2ludCBBU04xX1VUQ1RJTUVfcHJpbnQoQklPICpicCwgY29uc3QgQVNOMV9VVENUSU1FICp0bSkKKwl7CisJY29uc3QgY2hhciAqdjsKKwlpbnQgZ210PTA7CisJaW50IGk7CisJaW50IHk9MCxNPTAsZD0wLGg9MCxtPTAscz0wOworCisJaT10bS0+bGVuZ3RoOworCXY9KGNvbnN0IGNoYXIgKil0bS0+ZGF0YTsKKworCWlmIChpIDwgMTApIGdvdG8gZXJyOworCWlmICh2W2ktMV0gPT0gJ1onKSBnbXQ9MTsKKwlmb3IgKGk9MDsgaTwxMDsgaSsrKQorCQlpZiAoKHZbaV0gPiAnOScpIHx8ICh2W2ldIDwgJzAnKSkgZ290byBlcnI7CisJeT0gKHZbMF0tJzAnKSoxMCsodlsxXS0nMCcpOworCWlmICh5IDwgNTApIHkrPTEwMDsKKwlNPSAodlsyXS0nMCcpKjEwKyh2WzNdLScwJyk7CisJaWYgKChNID4gMTIpIHx8IChNIDwgMSkpIGdvdG8gZXJyOworCWQ9ICh2WzRdLScwJykqMTArKHZbNV0tJzAnKTsKKwloPSAodls2XS0nMCcpKjEwKyh2WzddLScwJyk7CisJbT0gICh2WzhdLScwJykqMTArKHZbOV0tJzAnKTsKKwlpZiAodG0tPmxlbmd0aCA+PTEyICYmCisJICAgICh2WzEwXSA+PSAnMCcpICYmICh2WzEwXSA8PSAnOScpICYmCisJICAgICh2WzExXSA+PSAnMCcpICYmICh2WzExXSA8PSAnOScpKQorCQlzPSAgKHZbMTBdLScwJykqMTArKHZbMTFdLScwJyk7CisKKwlpZiAoQklPX3ByaW50ZihicCwiJXMgJTJkICUwMmQ6JTAyZDolMDJkICVkJXMiLAorCQltb25bTS0xXSxkLGgsbSxzLHkrMTkwMCwoZ210KT8iIEdNVCI6IiIpIDw9IDApCisJCXJldHVybigwKTsKKwllbHNlCisJCXJldHVybigxKTsKK2VycjoKKwlCSU9fd3JpdGUoYnAsIkJhZCB0aW1lIHZhbHVlIiwxNCk7CisJcmV0dXJuKDApOworCX0KKworaW50IFg1MDlfTkFNRV9wcmludChCSU8gKmJwLCBYNTA5X05BTUUgKm5hbWUsIGludCBvYmFzZSkKKwl7CisJY2hhciAqcywqYywqYjsKKwlpbnQgcmV0PTAsbCxpOworCisJbD04MC0yLW9iYXNlOworCisJYj1YNTA5X05BTUVfb25lbGluZShuYW1lLE5VTEwsMCk7CisJaWYgKCEqYikKKwkJeworCQlPUEVOU1NMX2ZyZWUoYik7CisJCXJldHVybiAxOworCQl9CisJcz1iKzE7IC8qIHNraXAgdGhlIGZpcnN0IHNsYXNoICovCisKKwljPXM7CisJZm9yICg7OykKKwkJeworI2lmbmRlZiBDSEFSU0VUX0VCQ0RJQworCQlpZiAoCSgoKnMgPT0gJy8nKSAmJgorCQkJCSgoc1sxXSA+PSAnQScpICYmIChzWzFdIDw9ICdaJykgJiYgKAorCQkJCQkoc1syXSA9PSAnPScpIHx8CisJCQkJCSgoc1syXSA+PSAnQScpICYmIChzWzJdIDw9ICdaJykgJiYKKwkJCQkJKHNbM10gPT0gJz0nKSkKKwkJCQkgKSkpIHx8CisJCQkoKnMgPT0gJ1wwJykpCisjZWxzZQorCQlpZiAoCSgoKnMgPT0gJy8nKSAmJgorCQkJCShpc3VwcGVyKHNbMV0pICYmICgKKwkJCQkJKHNbMl0gPT0gJz0nKSB8fAorCQkJCQkoaXN1cHBlcihzWzJdKSAmJgorCQkJCQkoc1szXSA9PSAnPScpKQorCQkJCSApKSkgfHwKKwkJCSgqcyA9PSAnXDAnKSkKKyNlbmRpZgorCQkJeworCQkJaT1zLWM7CisJCQlpZiAoQklPX3dyaXRlKGJwLGMsaSkgIT0gaSkgZ290byBlcnI7CisJCQljPXMrMTsJLyogc2tpcCBmb2xsb3dpbmcgc2xhc2ggKi8KKwkJCWlmICgqcyAhPSAnXDAnKQorCQkJCXsKKwkJCQlpZiAoQklPX3dyaXRlKGJwLCIsICIsMikgIT0gMikgZ290byBlcnI7CisJCQkJfQorCQkJbC0tOworCQkJfQorCQlpZiAoKnMgPT0gJ1wwJykgYnJlYWs7CisJCXMrKzsKKwkJbC0tOworCQl9CisJCisJcmV0PTE7CisJaWYgKDApCisJCXsKK2VycjoKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9OQU1FX3ByaW50LCBFUlJfUl9CVUZfTElCKTsKKwkJfQorCU9QRU5TU0xfZnJlZShiKTsKKwlyZXR1cm4ocmV0KTsKKwl9CmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOS90X3g1MDlhLmMgYi9jcnlwdG8veDUwOS90X3g1MDlhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY2NzI2OAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94NTA5L3RfeDUwOWEuYwpAQCAtMCwwICsxLDEwOSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorCisKKy8qIFg1MDlfQ0VSVF9BVVggYW5kIHN0cmluZyBzZXQgcm91dGluZXMgKi8KKworaW50IFg1MDlfQ0VSVF9BVVhfcHJpbnQoQklPICpvdXQsIFg1MDlfQ0VSVF9BVVggKmF1eCwgaW50IGluZGVudCkKK3sKKwljaGFyIG9pZHN0cls4MF0sIGZpcnN0OworCXNpemVfdCBpOworCWludCBqOworCWlmKCFhdXgpIHJldHVybiAxOworCWlmKGF1eC0+dHJ1c3QpIHsKKwkJZmlyc3QgPSAxOworCQlCSU9fcHJpbnRmKG91dCwgIiUqc1RydXN0ZWQgVXNlczpcbiUqcyIsCisJCQkJCQlpbmRlbnQsICIiLCBpbmRlbnQgKyAyLCAiIik7CisJCWZvcihpID0gMDsgaSA8IHNrX0FTTjFfT0JKRUNUX251bShhdXgtPnRydXN0KTsgaSsrKSB7CisJCQlpZighZmlyc3QpIEJJT19wdXRzKG91dCwgIiwgIik7CisJCQllbHNlIGZpcnN0ID0gMDsKKwkJCU9CSl9vYmoydHh0KG9pZHN0ciwgc2l6ZW9mIG9pZHN0ciwKKwkJCQlza19BU04xX09CSkVDVF92YWx1ZShhdXgtPnRydXN0LCBpKSwgMCk7CisJCQlCSU9fcHV0cyhvdXQsIG9pZHN0cik7CisJCX0KKwkJQklPX3B1dHMob3V0LCAiXG4iKTsKKwl9IGVsc2UgQklPX3ByaW50ZihvdXQsICIlKnNObyBUcnVzdGVkIFVzZXMuXG4iLCBpbmRlbnQsICIiKTsKKwlpZihhdXgtPnJlamVjdCkgeworCQlmaXJzdCA9IDE7CisJCUJJT19wcmludGYob3V0LCAiJSpzUmVqZWN0ZWQgVXNlczpcbiUqcyIsCisJCQkJCQlpbmRlbnQsICIiLCBpbmRlbnQgKyAyLCAiIik7CisJCWZvcihpID0gMDsgaSA8IHNrX0FTTjFfT0JKRUNUX251bShhdXgtPnJlamVjdCk7IGkrKykgeworCQkJaWYoIWZpcnN0KSBCSU9fcHV0cyhvdXQsICIsICIpOworCQkJZWxzZSBmaXJzdCA9IDA7CisJCQlPQkpfb2JqMnR4dChvaWRzdHIsIHNpemVvZiBvaWRzdHIsCisJCQkJc2tfQVNOMV9PQkpFQ1RfdmFsdWUoYXV4LT5yZWplY3QsIGkpLCAwKTsKKwkJCUJJT19wdXRzKG91dCwgb2lkc3RyKTsKKwkJfQorCQlCSU9fcHV0cyhvdXQsICJcbiIpOworCX0gZWxzZSBCSU9fcHJpbnRmKG91dCwgIiUqc05vIFJlamVjdGVkIFVzZXMuXG4iLCBpbmRlbnQsICIiKTsKKwlpZihhdXgtPmFsaWFzKSBCSU9fcHJpbnRmKG91dCwgIiUqc0FsaWFzOiAlc1xuIiwgaW5kZW50LCAiIiwKKwkJCQkJCQlhdXgtPmFsaWFzLT5kYXRhKTsKKwlpZihhdXgtPmtleWlkKSB7CisJCUJJT19wcmludGYob3V0LCAiJSpzS2V5IElkOiAiLCBpbmRlbnQsICIiKTsKKwkJZm9yKGogPSAwOyBqIDwgYXV4LT5rZXlpZC0+bGVuZ3RoOyBqKyspCisJCQlCSU9fcHJpbnRmKG91dCwgIiVzJTAyWCIsCisJCQkJaiA/ICI6IiA6ICIiLAorCQkJCWF1eC0+a2V5aWQtPmRhdGFbal0pOworCQlCSU9fd3JpdGUob3V0LCJcbiIsMSk7CisJfQorCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3g1MDkvdnBtX2ludC5oIGIvY3J5cHRvL3g1MDkvdnBtX2ludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOTk4MjEKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOS92cG1faW50LmgKQEAgLTAsMCArMSw2OSBAQAorLyogdnBtX2ludC5oICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAxMy4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAxMyBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisvKiBpbnRlcm5hbCBvbmx5IHN0cnVjdHVyZSB0byBob2xkIGFkZGl0aW9uYWwgWDUwOV9WRVJJRllfUEFSQU0gZGF0YSAqLworCitzdHJ1Y3QgWDUwOV9WRVJJRllfUEFSQU1fSURfc3QKKwl7CisJdW5zaWduZWQgY2hhciAqaG9zdDsJLyogSWYgbm90IE5VTEwgaG9zdG5hbWUgdG8gbWF0Y2ggKi8KKwlzaXplX3QgaG9zdGxlbjsKKwl1bnNpZ25lZCBjaGFyICplbWFpbDsJLyogSWYgbm90IE5VTEwgZW1haWwgYWRkcmVzcyB0byBtYXRjaCAqLworCXNpemVfdCBlbWFpbGxlbjsKKwl1bnNpZ25lZCBjaGFyICppcDsJLyogSWYgbm90IE5VTEwgSVAgYWRkcmVzcyB0byBtYXRjaCAqLworCXNpemVfdCBpcGxlbjsJCS8qIExlbmd0aCBvZiBJUCBhZGRyZXNzICovCisJfTsKZGlmZiAtLWdpdCBhL2NyeXB0by94NTA5L3g1MDkuYyBiL2NyeXB0by94NTA5L3g1MDkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWY5ZTFlCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3g1MDkveDUwOS5jCkBAIC0wLDAgKzEsMTUyIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisKKworaW50IFBLQ1M4X3BrZXlfc2V0MChQS0NTOF9QUklWX0tFWV9JTkZPICpwcml2LCBBU04xX09CSkVDVCAqYW9iaiwgaW50IHZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgIGludCBwdHlwZSwgdm9pZCAqcHZhbCwgdWludDhfdCAqcGVuYywgaW50IHBlbmNsZW4pIHsKKyAgdWludDhfdCAqKnBwZW5jID0gTlVMTDsKKyAgaWYgKHZlcnNpb24gPj0gMCkgeworICAgIGlmICghQVNOMV9JTlRFR0VSX3NldChwcml2LT52ZXJzaW9uLCB2ZXJzaW9uKSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgaWYgKHBlbmMpIHsKKyAgICBpbnQgcG10eXBlOworICAgIEFTTjFfT0NURVRfU1RSSU5HICpvY3Q7CisKKyAgICBvY3QgPSBBU04xX09DVEVUX1NUUklOR19uZXcoKTsKKyAgICBpZiAoIW9jdCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIG9jdC0+ZGF0YSA9IHBlbmM7CisgICAgcHBlbmMgPSAmb2N0LT5kYXRhOworICAgIG9jdC0+bGVuZ3RoID0gcGVuY2xlbjsKKyAgICBpZiAocHJpdi0+YnJva2VuID09IFBLQ1M4X05PX09DVEVUKSB7CisgICAgICBwbXR5cGUgPSBWX0FTTjFfU0VRVUVOQ0U7CisgICAgfSBlbHNlIHsKKyAgICAgIHBtdHlwZSA9IFZfQVNOMV9PQ1RFVF9TVFJJTkc7CisgICAgfQorICAgIEFTTjFfVFlQRV9zZXQocHJpdi0+cGtleSwgcG10eXBlLCBvY3QpOworICB9CisKKyAgaWYgKCFYNTA5X0FMR09SX3NldDAocHJpdi0+cGtleWFsZywgYW9iaiwgcHR5cGUsIHB2YWwpKSB7CisgICAgLyogSWYgY2FsbCBmYWlscyBkbyBub3Qgc3dhbGxvdyAnZW5jJyAqLworICAgIGlmIChwcGVuYykgeworICAgICAgKnBwZW5jID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KKworICByZXR1cm4gMTsKK30KKworaW50IFBLQ1M4X3BrZXlfZ2V0MChBU04xX09CSkVDVCAqKnBwa2FsZywgY29uc3QgdWludDhfdCAqKnBrLCBpbnQgKnBwa2xlbiwKKyAgICAgICAgICAgICAgICAgICAgWDUwOV9BTEdPUiAqKnBhLCBQS0NTOF9QUklWX0tFWV9JTkZPICpwOCkgeworICBpZiAocHBrYWxnKSB7CisgICAgKnBwa2FsZyA9IHA4LT5wa2V5YWxnLT5hbGdvcml0aG07CisgIH0KKworICBpZiAocDgtPnBrZXktPnR5cGUgPT0gVl9BU04xX09DVEVUX1NUUklORykgeworICAgIHA4LT5icm9rZW4gPSBQS0NTOF9PSzsKKyAgICBpZiAocGspIHsKKyAgICAgICpwayA9IHA4LT5wa2V5LT52YWx1ZS5vY3RldF9zdHJpbmctPmRhdGE7CisgICAgICAqcHBrbGVuID0gcDgtPnBrZXktPnZhbHVlLm9jdGV0X3N0cmluZy0+bGVuZ3RoOworICAgIH0KKyAgfSBlbHNlIGlmIChwOC0+cGtleS0+dHlwZSA9PSBWX0FTTjFfU0VRVUVOQ0UpIHsKKyAgICBwOC0+YnJva2VuID0gUEtDUzhfTk9fT0NURVQ7CisgICAgaWYgKHBrKSB7CisgICAgICAqcGsgPSBwOC0+cGtleS0+dmFsdWUuc2VxdWVuY2UtPmRhdGE7CisgICAgICAqcHBrbGVuID0gcDgtPnBrZXktPnZhbHVlLnNlcXVlbmNlLT5sZW5ndGg7CisgICAgfQorICB9IGVsc2UgeworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKHBhKSB7CisgICAgKnBhID0gcDgtPnBrZXlhbGc7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBYNTA5X3NpZ25hdHVyZV9kdW1wKEJJTyAqYnAsIGNvbnN0IEFTTjFfU1RSSU5HICpzaWcsIGludCBpbmRlbnQpIHsKKyAgY29uc3QgdWludDhfdCAqczsKKyAgaW50IGksIG47CisKKyAgbiA9IHNpZy0+bGVuZ3RoOworICBzID0gc2lnLT5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgaWYgKChpICUgMTgpID09IDApIHsKKyAgICAgIGlmIChCSU9fd3JpdGUoYnAsICJcbiIsIDEpIDw9IDAgfHwKKyAgICAgICAgICBCSU9faW5kZW50KGJwLCBpbmRlbnQsIGluZGVudCkgPD0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKEJJT19wcmludGYoYnAsICIlMDJ4JXMiLCBzW2ldLCAoKGkgKyAxKSA9PSBuKSA/ICIiIDogIjoiKSA8PSAwKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgaWYgKEJJT193cml0ZShicCwgIlxuIiwgMSkgIT0gMSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOS94NTA5LmggYi9jcnlwdG8veDUwOS94NTA5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRlNzQyZQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94NTA5L3g1MDkuaApAQCAtMCwwICsxLDEzMzIgQEAKKy8qIGNyeXB0by94NTA5L3g1MDkuaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRC4KKyAqIEVDREggc3VwcG9ydCBpbiBPcGVuU1NMIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGJ5IAorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiwgYW5kIGNvbnRyaWJ1dGVkIHRvIHRoZSBPcGVuU1NMIHByb2plY3QuCisgKi8KKworI2lmbmRlZiBIRUFERVJfWDUwOV9ICisjZGVmaW5lIEhFQURFUl9YNTA5X0gKKworI2luY2x1ZGUgPG9wZW5zc2wvYmFzZS5oPgorCisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NpcGhlci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZGguaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2RzYS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZWMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2VjZGguaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2VjZHNhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc2hhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zdGFjay5oPgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKyNpZmRlZiBPUEVOU1NMX1NZU19XSU4zMgorLyogVW5kZXIgV2luMzIgdGhlc2UgYXJlIGRlZmluZWQgaW4gd2luY3J5cHQuaCAqLworI3VuZGVmIFg1MDlfTkFNRQorI3VuZGVmIFg1MDlfQ0VSVF9QQUlSCisjdW5kZWYgWDUwOV9FWFRFTlNJT05TCisjZW5kaWYKKworI2RlZmluZSBYNTA5X0ZJTEVUWVBFX1BFTQkxCisjZGVmaW5lIFg1MDlfRklMRVRZUEVfQVNOMQkyCisjZGVmaW5lIFg1MDlfRklMRVRZUEVfREVGQVVMVAkzCisKKyNkZWZpbmUgWDUwOXYzX0tVX0RJR0lUQUxfU0lHTkFUVVJFCTB4MDA4MAorI2RlZmluZSBYNTA5djNfS1VfTk9OX1JFUFVESUFUSU9OCTB4MDA0MAorI2RlZmluZSBYNTA5djNfS1VfS0VZX0VOQ0lQSEVSTUVOVAkweDAwMjAKKyNkZWZpbmUgWDUwOXYzX0tVX0RBVEFfRU5DSVBIRVJNRU5UCTB4MDAxMAorI2RlZmluZSBYNTA5djNfS1VfS0VZX0FHUkVFTUVOVAkJMHgwMDA4CisjZGVmaW5lIFg1MDl2M19LVV9LRVlfQ0VSVF9TSUdOCQkweDAwMDQKKyNkZWZpbmUgWDUwOXYzX0tVX0NSTF9TSUdOCQkweDAwMDIKKyNkZWZpbmUgWDUwOXYzX0tVX0VOQ0lQSEVSX09OTFkJCTB4MDAwMQorI2RlZmluZSBYNTA5djNfS1VfREVDSVBIRVJfT05MWQkJMHg4MDAwCisjZGVmaW5lIFg1MDl2M19LVV9VTkRFRgkJCTB4ZmZmZgorCit0eXBlZGVmIHN0cnVjdCBYNTA5X29iamVjdHNfc3QKKwl7CisJaW50IG5pZDsKKwlpbnQgKCphMmkpKHZvaWQpOworCWludCAoKmkyYSkodm9pZCk7CisJfSBYNTA5X09CSkVDVFM7CisKK0RFQ0xBUkVfQVNOMV9TRVRfT0YoWDUwOV9BTEdPUikKKwordHlwZWRlZiBTVEFDS19PRihYNTA5X0FMR09SKSBYNTA5X0FMR09SUzsKKwordHlwZWRlZiBzdHJ1Y3QgWDUwOV92YWxfc3QKKwl7CisJQVNOMV9USU1FICpub3RCZWZvcmU7CisJQVNOMV9USU1FICpub3RBZnRlcjsKKwl9IFg1MDlfVkFMOworCitzdHJ1Y3QgWDUwOV9wdWJrZXlfc3QKKwl7CisJWDUwOV9BTEdPUiAqYWxnb3I7CisJQVNOMV9CSVRfU1RSSU5HICpwdWJsaWNfa2V5OworCUVWUF9QS0VZICpwa2V5OworCX07CisKK3R5cGVkZWYgc3RydWN0IFg1MDlfc2lnX3N0CisJeworCVg1MDlfQUxHT1IgKmFsZ29yOworCUFTTjFfT0NURVRfU1RSSU5HICpkaWdlc3Q7CisJfSBYNTA5X1NJRzsKKwordHlwZWRlZiBzdHJ1Y3QgWDUwOV9uYW1lX2VudHJ5X3N0CisJeworCUFTTjFfT0JKRUNUICpvYmplY3Q7CisJQVNOMV9TVFJJTkcgKnZhbHVlOworCWludCBzZXQ7CisJaW50IHNpemU7IAkvKiB0ZW1wIHZhcmlhYmxlICovCisJfSBYNTA5X05BTUVfRU5UUlk7CisKK0RFQ0xBUkVfU1RBQ0tfT0YoWDUwOV9OQU1FX0VOVFJZKQorREVDTEFSRV9BU04xX1NFVF9PRihYNTA5X05BTUVfRU5UUlkpCisKKy8qIHdlIGFsd2F5cyBrZWVwIFg1MDlfTkFNRXMgaW4gMiBmb3Jtcy4gKi8KK3N0cnVjdCBYNTA5X25hbWVfc3QKKwl7CisJU1RBQ0tfT0YoWDUwOV9OQU1FX0VOVFJZKSAqZW50cmllczsKKwlpbnQgbW9kaWZpZWQ7CS8qIHRydWUgaWYgJ2J5dGVzJyBuZWVkcyB0byBiZSBidWlsdCAqLworI2lmbmRlZiBPUEVOU1NMX05PX0JVRkZFUgorCUJVRl9NRU0gKmJ5dGVzOworI2Vsc2UKKwljaGFyICpieXRlczsKKyNlbmRpZgorLyoJdW5zaWduZWQgbG9uZyBoYXNoOyBLZWVwIHRoZSBoYXNoIGFyb3VuZCBmb3IgbG9va3VwcyAqLworCXVuc2lnbmVkIGNoYXIgKmNhbm9uX2VuYzsKKwlpbnQgY2Fub25fZW5jbGVuOworCX0gLyogWDUwOV9OQU1FICovOworCitERUNMQVJFX1NUQUNLX09GKFg1MDlfTkFNRSkKKworI2RlZmluZSBYNTA5X0VYX1ZfTkVUU0NBUEVfSEFDSwkJMHg4MDAwCisjZGVmaW5lIFg1MDlfRVhfVl9JTklUCQkJMHgwMDAxCit0eXBlZGVmIHN0cnVjdCBYNTA5X2V4dGVuc2lvbl9zdAorCXsKKwlBU04xX09CSkVDVCAqb2JqZWN0OworCUFTTjFfQk9PTEVBTiBjcml0aWNhbDsKKwlBU04xX09DVEVUX1NUUklORyAqdmFsdWU7CisJfSBYNTA5X0VYVEVOU0lPTjsKKwordHlwZWRlZiBTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgWDUwOV9FWFRFTlNJT05TOworCitERUNMQVJFX1NUQUNLX09GKFg1MDlfRVhURU5TSU9OKQorREVDTEFSRV9BU04xX1NFVF9PRihYNTA5X0VYVEVOU0lPTikKKworLyogYSBzZXF1ZW5jZSBvZiB0aGVzZSBhcmUgdXNlZCAqLwordHlwZWRlZiBzdHJ1Y3QgeDUwOV9hdHRyaWJ1dGVzX3N0CisJeworCUFTTjFfT0JKRUNUICpvYmplY3Q7CisJaW50IHNpbmdsZTsgLyogMCBmb3IgYSBzZXQsIDEgZm9yIGEgc2luZ2xlIGl0ZW0gKHdoaWNoIGlzIHdyb25nKSAqLworCXVuaW9uCXsKKwkJY2hhcgkJKnB0cjsKKy8qIDAgKi8JCVNUQUNLX09GKEFTTjFfVFlQRSkgKnNldDsKKy8qIDEgKi8JCUFTTjFfVFlQRQkqc2luZ2xlOworCQl9IHZhbHVlOworCX0gWDUwOV9BVFRSSUJVVEU7CisKK0RFQ0xBUkVfU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpCitERUNMQVJFX0FTTjFfU0VUX09GKFg1MDlfQVRUUklCVVRFKQorCisKK3R5cGVkZWYgc3RydWN0IFg1MDlfcmVxX2luZm9fc3QKKwl7CisJQVNOMV9FTkNPRElORyBlbmM7CisJQVNOMV9JTlRFR0VSICp2ZXJzaW9uOworCVg1MDlfTkFNRSAqc3ViamVjdDsKKwlYNTA5X1BVQktFWSAqcHVia2V5OworCS8qICBkPTIgaGw9MiBsPSAgMCBjb25zOiBjb250OiAwMCAqLworCVNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqYXR0cmlidXRlczsgLyogWyAwIF0gKi8KKwl9IFg1MDlfUkVRX0lORk87CisKK3R5cGVkZWYgc3RydWN0IFg1MDlfcmVxX3N0CisJeworCVg1MDlfUkVRX0lORk8gKnJlcV9pbmZvOworCVg1MDlfQUxHT1IgKnNpZ19hbGc7CisJQVNOMV9CSVRfU1RSSU5HICpzaWduYXR1cmU7CisJaW50IHJlZmVyZW5jZXM7CisJfSBYNTA5X1JFUTsKKwordHlwZWRlZiBzdHJ1Y3QgeDUwOV9jaW5mX3N0CisJeworCUFTTjFfSU5URUdFUiAqdmVyc2lvbjsJCS8qIFsgMCBdIGRlZmF1bHQgb2YgdjEgKi8KKwlBU04xX0lOVEVHRVIgKnNlcmlhbE51bWJlcjsKKwlYNTA5X0FMR09SICpzaWduYXR1cmU7CisJWDUwOV9OQU1FICppc3N1ZXI7CisJWDUwOV9WQUwgKnZhbGlkaXR5OworCVg1MDlfTkFNRSAqc3ViamVjdDsKKwlYNTA5X1BVQktFWSAqa2V5OworCUFTTjFfQklUX1NUUklORyAqaXNzdWVyVUlEOwkJLyogWyAxIF0gb3B0aW9uYWwgaW4gdjIgKi8KKwlBU04xX0JJVF9TVFJJTkcgKnN1YmplY3RVSUQ7CQkvKiBbIDIgXSBvcHRpb25hbCBpbiB2MiAqLworCVNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqZXh0ZW5zaW9uczsJLyogWyAzIF0gb3B0aW9uYWwgaW4gdjMgKi8KKwlBU04xX0VOQ09ESU5HIGVuYzsKKwl9IFg1MDlfQ0lORjsKKworLyogVGhpcyBzdHVmZiBpcyBjZXJ0aWZpY2F0ZSAiYXV4aWxpYXJ5IGluZm8iCisgKiBpdCBjb250YWlucyBkZXRhaWxzIHdoaWNoIGFyZSB1c2VmdWwgaW4gY2VydGlmaWNhdGUKKyAqIHN0b3JlcyBhbmQgZGF0YWJhc2VzLiBXaGVuIHVzZWQgdGhpcyBpcyB0YWdnZWQgb250bworICogdGhlIGVuZCBvZiB0aGUgY2VydGlmaWNhdGUgaXRzZWxmCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeDUwOV9jZXJ0X2F1eF9zdAorCXsKKwlTVEFDS19PRihBU04xX09CSkVDVCkgKnRydXN0OwkJLyogdHJ1c3RlZCB1c2VzICovCisJU1RBQ0tfT0YoQVNOMV9PQkpFQ1QpICpyZWplY3Q7CQkvKiByZWplY3RlZCB1c2VzICovCisJQVNOMV9VVEY4U1RSSU5HICphbGlhczsJCQkvKiAiZnJpZW5kbHkgbmFtZSIgKi8KKwlBU04xX09DVEVUX1NUUklORyAqa2V5aWQ7CQkvKiBrZXkgaWQgb2YgcHJpdmF0ZSBrZXkgKi8KKwlTVEFDS19PRihYNTA5X0FMR09SKSAqb3RoZXI7CQkvKiBvdGhlciB1bnNwZWNpZmllZCBpbmZvICovCisJfSBYNTA5X0NFUlRfQVVYOworCitzdHJ1Y3QgeDUwOV9zdAorCXsKKwlYNTA5X0NJTkYgKmNlcnRfaW5mbzsKKwlYNTA5X0FMR09SICpzaWdfYWxnOworCUFTTjFfQklUX1NUUklORyAqc2lnbmF0dXJlOworCWludCB2YWxpZDsKKwlpbnQgcmVmZXJlbmNlczsKKwljaGFyICpuYW1lOworCUNSWVBUT19FWF9EQVRBIGV4X2RhdGE7CisJLyogVGhlc2UgY29udGFpbiBjb3BpZXMgb2YgdmFyaW91cyBleHRlbnNpb24gdmFsdWVzICovCisJbG9uZyBleF9wYXRobGVuOworCWxvbmcgZXhfcGNwYXRobGVuOworCXVuc2lnbmVkIGxvbmcgZXhfZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBleF9rdXNhZ2U7CisJdW5zaWduZWQgbG9uZyBleF94a3VzYWdlOworCXVuc2lnbmVkIGxvbmcgZXhfbnNjZXJ0OworCUFTTjFfT0NURVRfU1RSSU5HICpza2lkOworCUFVVEhPUklUWV9LRVlJRCAqYWtpZDsKKwlYNTA5X1BPTElDWV9DQUNIRSAqcG9saWN5X2NhY2hlOworCVNUQUNLX09GKERJU1RfUE9JTlQpICpjcmxkcDsKKwlTVEFDS19PRihHRU5FUkFMX05BTUUpICphbHRuYW1lOworCU5BTUVfQ09OU1RSQUlOVFMgKm5jOworI2lmbmRlZiBPUEVOU1NMX05PX1NIQQorCXVuc2lnbmVkIGNoYXIgc2hhMV9oYXNoW1NIQV9ESUdFU1RfTEVOR1RIXTsKKyNlbmRpZgorCVg1MDlfQ0VSVF9BVVggKmF1eDsKKwl9IC8qIFg1MDkgKi87CisKK0RFQ0xBUkVfU1RBQ0tfT0YoWDUwOSkKK0RFQ0xBUkVfQVNOMV9TRVRfT0YoWDUwOSkKKworLyogVGhpcyBpcyB1c2VkIGZvciBhIHRhYmxlIG9mIHRydXN0IGNoZWNraW5nIGZ1bmN0aW9ucyAqLworCit0eXBlZGVmIHN0cnVjdCB4NTA5X3RydXN0X3N0IHsKKwlpbnQgdHJ1c3Q7CisJaW50IGZsYWdzOworCWludCAoKmNoZWNrX3RydXN0KShzdHJ1Y3QgeDUwOV90cnVzdF9zdCAqLCBYNTA5ICosIGludCk7CisJY2hhciAqbmFtZTsKKwlpbnQgYXJnMTsKKwl2b2lkICphcmcyOworfSBYNTA5X1RSVVNUOworCitERUNMQVJFX1NUQUNLX09GKFg1MDlfVFJVU1QpCisKK3R5cGVkZWYgc3RydWN0IHg1MDlfY2VydF9wYWlyX3N0IHsKKwlYNTA5ICpmb3J3YXJkOworCVg1MDkgKnJldmVyc2U7Cit9IFg1MDlfQ0VSVF9QQUlSOworCisvKiBzdGFuZGFyZCB0cnVzdCBpZHMgKi8KKworI2RlZmluZSBYNTA5X1RSVVNUX0RFRkFVTFQJLTEJLyogT25seSB2YWxpZCBpbiBwdXJwb3NlIHNldHRpbmdzICovCisKKyNkZWZpbmUgWDUwOV9UUlVTVF9DT01QQVQJMQorI2RlZmluZSBYNTA5X1RSVVNUX1NTTF9DTElFTlQJMgorI2RlZmluZSBYNTA5X1RSVVNUX1NTTF9TRVJWRVIJMworI2RlZmluZSBYNTA5X1RSVVNUX0VNQUlMCTQKKyNkZWZpbmUgWDUwOV9UUlVTVF9PQkpFQ1RfU0lHTgk1CisjZGVmaW5lIFg1MDlfVFJVU1RfT0NTUF9TSUdOCTYKKyNkZWZpbmUgWDUwOV9UUlVTVF9PQ1NQX1JFUVVFU1QJNworI2RlZmluZSBYNTA5X1RSVVNUX1RTQQkJOAorCisvKiBLZWVwIHRoZXNlIHVwIHRvIGRhdGUhICovCisjZGVmaW5lIFg1MDlfVFJVU1RfTUlOCQkxCisjZGVmaW5lIFg1MDlfVFJVU1RfTUFYCQk4CisKKworLyogdHJ1c3RfZmxhZ3MgdmFsdWVzICovCisjZGVmaW5lCVg1MDlfVFJVU1RfRFlOQU1JQyAJMQorI2RlZmluZQlYNTA5X1RSVVNUX0RZTkFNSUNfTkFNRQkyCisKKy8qIGNoZWNrX3RydXN0IHJldHVybiBjb2RlcyAqLworCisjZGVmaW5lIFg1MDlfVFJVU1RfVFJVU1RFRAkxCisjZGVmaW5lIFg1MDlfVFJVU1RfUkVKRUNURUQJMgorI2RlZmluZSBYNTA5X1RSVVNUX1VOVFJVU1RFRAkzCisKKy8qIEZsYWdzIGZvciBYNTA5X3ByaW50X2V4KCkgKi8KKworI2RlZmluZQlYNTA5X0ZMQUdfQ09NUEFUCQkwCisjZGVmaW5lCVg1MDlfRkxBR19OT19IRUFERVIJCTFMCisjZGVmaW5lCVg1MDlfRkxBR19OT19WRVJTSU9OCQkoMUwgPDwgMSkKKyNkZWZpbmUJWDUwOV9GTEFHX05PX1NFUklBTAkJKDFMIDw8IDIpCisjZGVmaW5lCVg1MDlfRkxBR19OT19TSUdOQU1FCQkoMUwgPDwgMykKKyNkZWZpbmUJWDUwOV9GTEFHX05PX0lTU1VFUgkJKDFMIDw8IDQpCisjZGVmaW5lCVg1MDlfRkxBR19OT19WQUxJRElUWQkJKDFMIDw8IDUpCisjZGVmaW5lCVg1MDlfRkxBR19OT19TVUJKRUNUCQkoMUwgPDwgNikKKyNkZWZpbmUJWDUwOV9GTEFHX05PX1BVQktFWQkJKDFMIDw8IDcpCisjZGVmaW5lCVg1MDlfRkxBR19OT19FWFRFTlNJT05TCQkoMUwgPDwgOCkKKyNkZWZpbmUJWDUwOV9GTEFHX05PX1NJR0RVTVAJCSgxTCA8PCA5KQorI2RlZmluZQlYNTA5X0ZMQUdfTk9fQVVYCQkoMUwgPDwgMTApCisjZGVmaW5lCVg1MDlfRkxBR19OT19BVFRSSUJVVEVTCQkoMUwgPDwgMTEpCisjZGVmaW5lCVg1MDlfRkxBR19OT19JRFMJCSgxTCA8PCAxMikKKworLyogRmxhZ3Mgc3BlY2lmaWMgdG8gWDUwOV9OQU1FX3ByaW50X2V4KCkgKi8JCisKKy8qIFRoZSBmaWVsZCBzZXBhcmF0b3IgaW5mb3JtYXRpb24gKi8KKworI2RlZmluZSBYTl9GTEFHX1NFUF9NQVNLCSgweGYgPDwgMTYpCisKKyNkZWZpbmUgWE5fRkxBR19DT01QQVQJCTAJCS8qIFRyYWRpdGlvbmFsIFNTTGVheTogdXNlIG9sZCBYNTA5X05BTUVfcHJpbnQgKi8KKyNkZWZpbmUgWE5fRkxBR19TRVBfQ09NTUFfUExVUwkoMSA8PCAxNikJLyogUkZDMjI1MyAsKyAqLworI2RlZmluZSBYTl9GTEFHX1NFUF9DUExVU19TUEMJKDIgPDwgMTYpCS8qICwrIHNwYWNlZDogbW9yZSByZWFkYWJsZSAqLworI2RlZmluZSBYTl9GTEFHX1NFUF9TUExVU19TUEMJKDMgPDwgMTYpCS8qIDsrIHNwYWNlZCAqLworI2RlZmluZSBYTl9GTEFHX1NFUF9NVUxUSUxJTkUJKDQgPDwgMTYpCS8qIE9uZSBsaW5lIHBlciBmaWVsZCAqLworCisjZGVmaW5lIFhOX0ZMQUdfRE5fUkVWCQkoMSA8PCAyMCkJLyogUmV2ZXJzZSBETiBvcmRlciAqLworCisvKiBIb3cgdGhlIGZpZWxkIG5hbWUgaXMgc2hvd24gKi8KKworI2RlZmluZSBYTl9GTEFHX0ZOX01BU0sJCSgweDMgPDwgMjEpCisKKyNkZWZpbmUgWE5fRkxBR19GTl9TTgkJMAkJLyogT2JqZWN0IHNob3J0IG5hbWUgKi8KKyNkZWZpbmUgWE5fRkxBR19GTl9MTgkJKDEgPDwgMjEpCS8qIE9iamVjdCBsb25nIG5hbWUgKi8KKyNkZWZpbmUgWE5fRkxBR19GTl9PSUQJCSgyIDw8IDIxKQkvKiBBbHdheXMgdXNlIE9JRHMgKi8KKyNkZWZpbmUgWE5fRkxBR19GTl9OT05FCQkoMyA8PCAyMSkJLyogTm8gZmllbGQgbmFtZXMgKi8KKworI2RlZmluZSBYTl9GTEFHX1NQQ19FUQkJKDEgPDwgMjMpCS8qIFB1dCBzcGFjZXMgcm91bmQgJz0nICovCisKKy8qIFRoaXMgZGV0ZXJtaW5lcyBpZiB3ZSBkdW1wIGZpZWxkcyB3ZSBkb24ndCByZWNvZ25pc2U6CisgKiBSRkMyMjUzIHJlcXVpcmVzIHRoaXMuCisgKi8KKworI2RlZmluZSBYTl9GTEFHX0RVTVBfVU5LTk9XTl9GSUVMRFMgKDEgPDwgMjQpCisKKyNkZWZpbmUgWE5fRkxBR19GTl9BTElHTgkoMSA8PCAyNSkJLyogQWxpZ24gZmllbGQgbmFtZXMgdG8gMjAgY2hhcmFjdGVycyAqLworCisvKiBDb21wbGV0ZSBzZXQgb2YgUkZDMjI1MyBmbGFncyAqLworCisjZGVmaW5lIFhOX0ZMQUdfUkZDMjI1MyAoQVNOMV9TVFJGTEdTX1JGQzIyNTMgfCBcCisJCQlYTl9GTEFHX1NFUF9DT01NQV9QTFVTIHwgXAorCQkJWE5fRkxBR19ETl9SRVYgfCBcCisJCQlYTl9GTEFHX0ZOX1NOIHwgXAorCQkJWE5fRkxBR19EVU1QX1VOS05PV05fRklFTERTKQorCisvKiByZWFkYWJsZSBvbmVsaW5lIGZvcm0gKi8KKworI2RlZmluZSBYTl9GTEFHX09ORUxJTkUgKEFTTjFfU1RSRkxHU19SRkMyMjUzIHwgXAorCQkJQVNOMV9TVFJGTEdTX0VTQ19RVU9URSB8IFwKKwkJCVhOX0ZMQUdfU0VQX0NQTFVTX1NQQyB8IFwKKwkJCVhOX0ZMQUdfU1BDX0VRIHwgXAorCQkJWE5fRkxBR19GTl9TTikKKworLyogcmVhZGFibGUgbXVsdGlsaW5lIGZvcm0gKi8KKworI2RlZmluZSBYTl9GTEFHX01VTFRJTElORSAoQVNOMV9TVFJGTEdTX0VTQ19DVFJMIHwgXAorCQkJQVNOMV9TVFJGTEdTX0VTQ19NU0IgfCBcCisJCQlYTl9GTEFHX1NFUF9NVUxUSUxJTkUgfCBcCisJCQlYTl9GTEFHX1NQQ19FUSB8IFwKKwkJCVhOX0ZMQUdfRk5fTE4gfCBcCisJCQlYTl9GTEFHX0ZOX0FMSUdOKQorCitzdHJ1Y3QgeDUwOV9yZXZva2VkX3N0CisJeworCUFTTjFfSU5URUdFUiAqc2VyaWFsTnVtYmVyOworCUFTTjFfVElNRSAqcmV2b2NhdGlvbkRhdGU7CisJU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pIC8qIG9wdGlvbmFsICovICpleHRlbnNpb25zOworCS8qIFNldCB1cCBpZiBpbmRpcmVjdCBDUkwgKi8KKwlTVEFDS19PRihHRU5FUkFMX05BTUUpICppc3N1ZXI7CisJLyogUmV2b2NhdGlvbiByZWFzb24gKi8KKwlpbnQgcmVhc29uOworCWludCBzZXF1ZW5jZTsgLyogbG9hZCBzZXF1ZW5jZSAqLworCX07CisKK0RFQ0xBUkVfU1RBQ0tfT0YoWDUwOV9SRVZPS0VEKQorREVDTEFSRV9BU04xX1NFVF9PRihYNTA5X1JFVk9LRUQpCisKK3R5cGVkZWYgc3RydWN0IFg1MDlfY3JsX2luZm9fc3QKKwl7CisJQVNOMV9JTlRFR0VSICp2ZXJzaW9uOworCVg1MDlfQUxHT1IgKnNpZ19hbGc7CisJWDUwOV9OQU1FICppc3N1ZXI7CisJQVNOMV9USU1FICpsYXN0VXBkYXRlOworCUFTTjFfVElNRSAqbmV4dFVwZGF0ZTsKKwlTVEFDS19PRihYNTA5X1JFVk9LRUQpICpyZXZva2VkOworCVNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAvKiBbMF0gKi8gKmV4dGVuc2lvbnM7CisJQVNOMV9FTkNPRElORyBlbmM7CisJfSBYNTA5X0NSTF9JTkZPOworCitzdHJ1Y3QgWDUwOV9jcmxfc3QKKwl7CisJLyogYWN0dWFsIHNpZ25hdHVyZSAqLworCVg1MDlfQ1JMX0lORk8gKmNybDsKKwlYNTA5X0FMR09SICpzaWdfYWxnOworCUFTTjFfQklUX1NUUklORyAqc2lnbmF0dXJlOworCWludCByZWZlcmVuY2VzOworCWludCBmbGFnczsKKwkvKiBDb3BpZXMgb2YgdmFyaW91cyBleHRlbnNpb25zICovCisJQVVUSE9SSVRZX0tFWUlEICpha2lkOworCUlTU1VJTkdfRElTVF9QT0lOVCAqaWRwOworCS8qIENvbnZlbmllbnQgYnJlYWtkb3duIG9mIElEUCAqLworCWludCBpZHBfZmxhZ3M7CisJaW50IGlkcF9yZWFzb25zOworCS8qIENSTCBhbmQgYmFzZSBDUkwgbnVtYmVycyBmb3IgZGVsdGEgcHJvY2Vzc2luZyAqLworCUFTTjFfSU5URUdFUiAqY3JsX251bWJlcjsKKwlBU04xX0lOVEVHRVIgKmJhc2VfY3JsX251bWJlcjsKKyNpZm5kZWYgT1BFTlNTTF9OT19TSEEKKwl1bnNpZ25lZCBjaGFyIHNoYTFfaGFzaFtTSEFfRElHRVNUX0xFTkdUSF07CisjZW5kaWYKKwlTVEFDS19PRihHRU5FUkFMX05BTUVTKSAqaXNzdWVyczsKKwljb25zdCBYNTA5X0NSTF9NRVRIT0QgKm1ldGg7CisJdm9pZCAqbWV0aF9kYXRhOworCX0gLyogWDUwOV9DUkwgKi87CisKK0RFQ0xBUkVfU1RBQ0tfT0YoWDUwOV9DUkwpCitERUNMQVJFX0FTTjFfU0VUX09GKFg1MDlfQ1JMKQorCit0eXBlZGVmIHN0cnVjdCBwcml2YXRlX2tleV9zdAorCXsKKwlpbnQgdmVyc2lvbjsKKwkvKiBUaGUgUEtDUyM4IGRhdGEgdHlwZXMgKi8KKwlYNTA5X0FMR09SICplbmNfYWxnb3I7CisJQVNOMV9PQ1RFVF9TVFJJTkcgKmVuY19wa2V5OwkvKiBlbmNyeXB0ZWQgcHViIGtleSAqLworCisJLyogV2hlbiBkZWNyeXB0ZWQsIHRoZSBmb2xsb3dpbmcgd2lsbCBub3QgYmUgTlVMTCAqLworCUVWUF9QS0VZICpkZWNfcGtleTsKKworCS8qIHVzZWQgdG8gZW5jcnlwdCBhbmQgZGVjcnlwdCAqLworCWludCBrZXlfbGVuZ3RoOworCWNoYXIgKmtleV9kYXRhOworCWludCBrZXlfZnJlZTsJLyogdHJ1ZSBpZiB3ZSBzaG91bGQgYXV0byBmcmVlIGtleV9kYXRhICovCisKKwkvKiBleHBhbmRlZCB2ZXJzaW9uIG9mICdlbmNfYWxnb3InICovCisJRVZQX0NJUEhFUl9JTkZPIGNpcGhlcjsKKworCWludCByZWZlcmVuY2VzOworCX0gWDUwOV9QS0VZOworCisjaWZuZGVmIE9QRU5TU0xfTk9fRVZQCit0eXBlZGVmIHN0cnVjdCBYNTA5X2luZm9fc3QKKwl7CisJWDUwOSAqeDUwOTsKKwlYNTA5X0NSTCAqY3JsOworCVg1MDlfUEtFWSAqeF9wa2V5OworCisJRVZQX0NJUEhFUl9JTkZPIGVuY19jaXBoZXI7CisJaW50IGVuY19sZW47CisJY2hhciAqZW5jX2RhdGE7CisKKwlpbnQgcmVmZXJlbmNlczsKKwl9IFg1MDlfSU5GTzsKKworREVDTEFSRV9TVEFDS19PRihYNTA5X0lORk8pCisjZW5kaWYKKworLyogVGhlIG5leHQgMiBzdHJ1Y3R1cmVzIGFuZCB0aGVpciA4IHJvdXRpbmVzIHdlcmUgc2VudCB0byBtZSBieQorICogUGF0IFJpY2hhcmQgPHBhdHJAeDUwOS5jb20+IGFuZCBhcmUgdXNlZCB0byBtYW5pcHVsYXRlCisgKiBOZXRzY2FwZXMgc3BraSBzdHJ1Y3R1cmVzIC0gdXNlZnVsIGlmIHlvdSBhcmUgd3JpdGluZyBhIENBIHdlYiBwYWdlCisgKi8KK3R5cGVkZWYgc3RydWN0IE5ldHNjYXBlX3Nwa2FjX3N0CisJeworCVg1MDlfUFVCS0VZICpwdWJrZXk7CisJQVNOMV9JQTVTVFJJTkcgKmNoYWxsZW5nZTsJLyogY2hhbGxlbmdlIHNlbnQgaW4gYXRsYXMgPj0gUFIyICovCisJfSBORVRTQ0FQRV9TUEtBQzsKKwordHlwZWRlZiBzdHJ1Y3QgTmV0c2NhcGVfc3BraV9zdAorCXsKKwlORVRTQ0FQRV9TUEtBQyAqc3BrYWM7CS8qIHNpZ25lZCBwdWJsaWMga2V5IGFuZCBjaGFsbGVuZ2UgKi8KKwlYNTA5X0FMR09SICpzaWdfYWxnb3I7CisJQVNOMV9CSVRfU1RSSU5HICpzaWduYXR1cmU7CisJfSBORVRTQ0FQRV9TUEtJOworCisvKiBOZXRzY2FwZSBjZXJ0aWZpY2F0ZSBzZXF1ZW5jZSBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IE5ldHNjYXBlX2NlcnRpZmljYXRlX3NlcXVlbmNlCisJeworCUFTTjFfT0JKRUNUICp0eXBlOworCVNUQUNLX09GKFg1MDkpICpjZXJ0czsKKwl9IE5FVFNDQVBFX0NFUlRfU0VRVUVOQ0U7CisKKy8qIFVudXNlZCAoYW5kIGl2IGxlbmd0aCBpcyB3cm9uZykKK3R5cGVkZWYgc3RydWN0IENCQ1BhcmFtZXRlcl9zdAorCXsKKwl1bnNpZ25lZCBjaGFyIGl2WzhdOworCX0gQ0JDX1BBUkFNOworKi8KKworLyogUGFzc3dvcmQgYmFzZWQgZW5jcnlwdGlvbiBzdHJ1Y3R1cmUgKi8KKwordHlwZWRlZiBzdHJ1Y3QgUEJFUEFSQU1fc3QgeworQVNOMV9PQ1RFVF9TVFJJTkcgKnNhbHQ7CitBU04xX0lOVEVHRVIgKml0ZXI7Cit9IFBCRVBBUkFNOworCisvKiBQYXNzd29yZCBiYXNlZCBlbmNyeXB0aW9uIFYyIHN0cnVjdHVyZXMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgUEJFMlBBUkFNX3N0IHsKK1g1MDlfQUxHT1IgKmtleWZ1bmM7CitYNTA5X0FMR09SICplbmNyeXB0aW9uOworfSBQQkUyUEFSQU07CisKK3R5cGVkZWYgc3RydWN0IFBCS0RGMlBBUkFNX3N0IHsKK0FTTjFfVFlQRSAqc2FsdDsJLyogVXN1YWxseSBPQ1RFVCBTVFJJTkcgYnV0IGNvdWxkIGJlIGFueXRoaW5nICovCitBU04xX0lOVEVHRVIgKml0ZXI7CitBU04xX0lOVEVHRVIgKmtleWxlbmd0aDsKK1g1MDlfQUxHT1IgKnByZjsKK30gUEJLREYyUEFSQU07CisKKworLyogUEtDUyM4IHByaXZhdGUga2V5IGluZm8gc3RydWN0dXJlICovCisKK3N0cnVjdCBwa2NzOF9wcml2X2tleV9pbmZvX3N0CisgICAgICAgIHsKKyAgICAgICAgaW50IGJyb2tlbjsgICAgIC8qIEZsYWcgZm9yIHZhcmlvdXMgYnJva2VuIGZvcm1hdHMgKi8KKyNkZWZpbmUgUEtDUzhfT0sJCTAKKyNkZWZpbmUgUEtDUzhfTk9fT0NURVQJCTEKKyNkZWZpbmUgUEtDUzhfRU1CRURERURfUEFSQU0JMgorI2RlZmluZSBQS0NTOF9OU19EQgkJMworI2RlZmluZSBQS0NTOF9ORUdfUFJJVktFWQk0CisgICAgICAgIEFTTjFfSU5URUdFUiAqdmVyc2lvbjsKKyAgICAgICAgWDUwOV9BTEdPUiAqcGtleWFsZzsKKyAgICAgICAgQVNOMV9UWVBFICpwa2V5OyAvKiBTaG91bGQgYmUgT0NURVQgU1RSSU5HIGJ1dCBzb21lIGFyZSBicm9rZW4gKi8KKyAgICAgICAgU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICphdHRyaWJ1dGVzOworICAgICAgICB9OworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2luY2x1ZGUgPG9wZW5zc2wveDUwOV92ZnkuaD4KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBYNTA5X0VYVF9QQUNLX1VOS05PV04JMQorI2RlZmluZSBYNTA5X0VYVF9QQUNLX1NUUklORwkyCisKKyNkZWZpbmUJCVg1MDlfZ2V0X3ZlcnNpb24oeCkgQVNOMV9JTlRFR0VSX2dldCgoeCktPmNlcnRfaW5mby0+dmVyc2lvbikKKy8qICNkZWZpbmUJWDUwOV9nZXRfc2VyaWFsTnVtYmVyKHgpICgoeCktPmNlcnRfaW5mby0+c2VyaWFsTnVtYmVyKSAqLworI2RlZmluZQkJWDUwOV9nZXRfbm90QmVmb3JlKHgpICgoeCktPmNlcnRfaW5mby0+dmFsaWRpdHktPm5vdEJlZm9yZSkKKyNkZWZpbmUJCVg1MDlfZ2V0X25vdEFmdGVyKHgpICgoeCktPmNlcnRfaW5mby0+dmFsaWRpdHktPm5vdEFmdGVyKQorI2RlZmluZQkJWDUwOV9leHRyYWN0X2tleSh4KQlYNTA5X2dldF9wdWJrZXkoeCkgLyoqKioqLworI2RlZmluZQkJWDUwOV9SRVFfZ2V0X3ZlcnNpb24oeCkgQVNOMV9JTlRFR0VSX2dldCgoeCktPnJlcV9pbmZvLT52ZXJzaW9uKQorI2RlZmluZQkJWDUwOV9SRVFfZ2V0X3N1YmplY3RfbmFtZSh4KSAoKHgpLT5yZXFfaW5mby0+c3ViamVjdCkKKyNkZWZpbmUJCVg1MDlfUkVRX2V4dHJhY3Rfa2V5KGEpCVg1MDlfUkVRX2dldF9wdWJrZXkoYSkKKyNkZWZpbmUJCVg1MDlfbmFtZV9jbXAoYSxiKQlYNTA5X05BTUVfY21wKChhKSwoYikpCisjZGVmaW5lCQlYNTA5X2dldF9zaWduYXR1cmVfdHlwZSh4KSBFVlBfUEtFWV90eXBlKE9CSl9vYmoybmlkKCh4KS0+c2lnX2FsZy0+YWxnb3JpdGhtKSkKKworI2RlZmluZQkJWDUwOV9DUkxfZ2V0X3ZlcnNpb24oeCkgQVNOMV9JTlRFR0VSX2dldCgoeCktPmNybC0+dmVyc2lvbikKKyNkZWZpbmUgCVg1MDlfQ1JMX2dldF9sYXN0VXBkYXRlKHgpICgoeCktPmNybC0+bGFzdFVwZGF0ZSkKKyNkZWZpbmUgCVg1MDlfQ1JMX2dldF9uZXh0VXBkYXRlKHgpICgoeCktPmNybC0+bmV4dFVwZGF0ZSkKKyNkZWZpbmUJCVg1MDlfQ1JMX2dldF9pc3N1ZXIoeCkgKCh4KS0+Y3JsLT5pc3N1ZXIpCisjZGVmaW5lCQlYNTA5X0NSTF9nZXRfUkVWT0tFRCh4KSAoKHgpLT5jcmwtPnJldm9rZWQpCisKK3ZvaWQgWDUwOV9DUkxfc2V0X2RlZmF1bHRfbWV0aG9kKGNvbnN0IFg1MDlfQ1JMX01FVEhPRCAqbWV0aCk7CitYNTA5X0NSTF9NRVRIT0QgKlg1MDlfQ1JMX01FVEhPRF9uZXcoCisJaW50ICgqY3JsX2luaXQpKFg1MDlfQ1JMICpjcmwpLAorCWludCAoKmNybF9mcmVlKShYNTA5X0NSTCAqY3JsKSwKKwlpbnQgKCpjcmxfbG9va3VwKShYNTA5X0NSTCAqY3JsLCBYNTA5X1JFVk9LRUQgKipyZXQsCisJCQkJQVNOMV9JTlRFR0VSICpzZXIsIFg1MDlfTkFNRSAqaXNzdWVyKSwKKwlpbnQgKCpjcmxfdmVyaWZ5KShYNTA5X0NSTCAqY3JsLCBFVlBfUEtFWSAqcGspKTsKK3ZvaWQgWDUwOV9DUkxfTUVUSE9EX2ZyZWUoWDUwOV9DUkxfTUVUSE9EICptKTsKKwordm9pZCBYNTA5X0NSTF9zZXRfbWV0aF9kYXRhKFg1MDlfQ1JMICpjcmwsIHZvaWQgKmRhdCk7Cit2b2lkICpYNTA5X0NSTF9nZXRfbWV0aF9kYXRhKFg1MDlfQ1JMICpjcmwpOworCisvKiBUaGlzIG9uZSBpcyBvbmx5IHVzZWQgc28gdGhhdCBhIGJpbmFyeSBmb3JtIGNhbiBvdXRwdXQsIGFzIGluCisgKiBpMmRfWDUwOV9OQU1FKFg1MDlfZ2V0X1g1MDlfUFVCS0VZKHgpLCZidWYpICovCisjZGVmaW5lIAlYNTA5X2dldF9YNTA5X1BVQktFWSh4KSAoKHgpLT5jZXJ0X2luZm8tPmtleSkKKworCitjb25zdCBjaGFyICpYNTA5X3ZlcmlmeV9jZXJ0X2Vycm9yX3N0cmluZyhsb25nIG4pOworCisjaWZuZGVmIE9QRU5TU0xfTk9fRVZQCitpbnQgWDUwOV92ZXJpZnkoWDUwOSAqYSwgRVZQX1BLRVkgKnIpOworCitpbnQgWDUwOV9SRVFfdmVyaWZ5KFg1MDlfUkVRICphLCBFVlBfUEtFWSAqcik7CitpbnQgWDUwOV9DUkxfdmVyaWZ5KFg1MDlfQ1JMICphLCBFVlBfUEtFWSAqcik7CitpbnQgTkVUU0NBUEVfU1BLSV92ZXJpZnkoTkVUU0NBUEVfU1BLSSAqYSwgRVZQX1BLRVkgKnIpOworCitORVRTQ0FQRV9TUEtJICogTkVUU0NBUEVfU1BLSV9iNjRfZGVjb2RlKGNvbnN0IGNoYXIgKnN0ciwgaW50IGxlbik7CitjaGFyICogTkVUU0NBUEVfU1BLSV9iNjRfZW5jb2RlKE5FVFNDQVBFX1NQS0kgKngpOworRVZQX1BLRVkgKk5FVFNDQVBFX1NQS0lfZ2V0X3B1YmtleShORVRTQ0FQRV9TUEtJICp4KTsKK2ludCBORVRTQ0FQRV9TUEtJX3NldF9wdWJrZXkoTkVUU0NBUEVfU1BLSSAqeCwgRVZQX1BLRVkgKnBrZXkpOworCitpbnQgTkVUU0NBUEVfU1BLSV9wcmludChCSU8gKm91dCwgTkVUU0NBUEVfU1BLSSAqc3BraSk7CisKK2ludCBYNTA5X3NpZ25hdHVyZV9kdW1wKEJJTyAqYnAsY29uc3QgQVNOMV9TVFJJTkcgKnNpZywgaW50IGluZGVudCk7CitpbnQgWDUwOV9zaWduYXR1cmVfcHJpbnQoQklPICpicCxYNTA5X0FMR09SICphbGcsIEFTTjFfU1RSSU5HICpzaWcpOworCitpbnQgWDUwOV9zaWduKFg1MDkgKngsIEVWUF9QS0VZICpwa2V5LCBjb25zdCBFVlBfTUQgKm1kKTsKK2ludCBYNTA5X3NpZ25fY3R4KFg1MDkgKngsIEVWUF9NRF9DVFggKmN0eCk7CisvKiBpbnQgWDUwOV9odHRwX25iaW8oT0NTUF9SRVFfQ1RYICpyY3R4LCBYNTA5ICoqcGNlcnQpOyAqLworaW50IFg1MDlfUkVRX3NpZ24oWDUwOV9SRVEgKngsIEVWUF9QS0VZICpwa2V5LCBjb25zdCBFVlBfTUQgKm1kKTsKK2ludCBYNTA5X1JFUV9zaWduX2N0eChYNTA5X1JFUSAqeCwgRVZQX01EX0NUWCAqY3R4KTsKK2ludCBYNTA5X0NSTF9zaWduKFg1MDlfQ1JMICp4LCBFVlBfUEtFWSAqcGtleSwgY29uc3QgRVZQX01EICptZCk7CitpbnQgWDUwOV9DUkxfc2lnbl9jdHgoWDUwOV9DUkwgKngsIEVWUF9NRF9DVFggKmN0eCk7CisvKiBpbnQgWDUwOV9DUkxfaHR0cF9uYmlvKE9DU1BfUkVRX0NUWCAqcmN0eCwgWDUwOV9DUkwgKipwY3JsKTsgKi8KK2ludCBORVRTQ0FQRV9TUEtJX3NpZ24oTkVUU0NBUEVfU1BLSSAqeCwgRVZQX1BLRVkgKnBrZXksIGNvbnN0IEVWUF9NRCAqbWQpOworCitpbnQgWDUwOV9wdWJrZXlfZGlnZXN0KGNvbnN0IFg1MDkgKmRhdGEsY29uc3QgRVZQX01EICp0eXBlLAorCQl1bnNpZ25lZCBjaGFyICptZCwgdW5zaWduZWQgaW50ICpsZW4pOworaW50IFg1MDlfZGlnZXN0KGNvbnN0IFg1MDkgKmRhdGEsY29uc3QgRVZQX01EICp0eXBlLAorCQl1bnNpZ25lZCBjaGFyICptZCwgdW5zaWduZWQgaW50ICpsZW4pOworaW50IFg1MDlfQ1JMX2RpZ2VzdChjb25zdCBYNTA5X0NSTCAqZGF0YSxjb25zdCBFVlBfTUQgKnR5cGUsCisJCXVuc2lnbmVkIGNoYXIgKm1kLCB1bnNpZ25lZCBpbnQgKmxlbik7CitpbnQgWDUwOV9SRVFfZGlnZXN0KGNvbnN0IFg1MDlfUkVRICpkYXRhLGNvbnN0IEVWUF9NRCAqdHlwZSwKKwkJdW5zaWduZWQgY2hhciAqbWQsIHVuc2lnbmVkIGludCAqbGVuKTsKK2ludCBYNTA5X05BTUVfZGlnZXN0KGNvbnN0IFg1MDlfTkFNRSAqZGF0YSxjb25zdCBFVlBfTUQgKnR5cGUsCisJCXVuc2lnbmVkIGNoYXIgKm1kLCB1bnNpZ25lZCBpbnQgKmxlbik7CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQorWDUwOSAqZDJpX1g1MDlfZnAoRklMRSAqZnAsIFg1MDkgKip4NTA5KTsKK2ludCBpMmRfWDUwOV9mcChGSUxFICpmcCxYNTA5ICp4NTA5KTsKK1g1MDlfQ1JMICpkMmlfWDUwOV9DUkxfZnAoRklMRSAqZnAsWDUwOV9DUkwgKipjcmwpOworaW50IGkyZF9YNTA5X0NSTF9mcChGSUxFICpmcCxYNTA5X0NSTCAqY3JsKTsKK1g1MDlfUkVRICpkMmlfWDUwOV9SRVFfZnAoRklMRSAqZnAsWDUwOV9SRVEgKipyZXEpOworaW50IGkyZF9YNTA5X1JFUV9mcChGSUxFICpmcCxYNTA5X1JFUSAqcmVxKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKK1JTQSAqZDJpX1JTQVByaXZhdGVLZXlfZnAoRklMRSAqZnAsUlNBICoqcnNhKTsKK2ludCBpMmRfUlNBUHJpdmF0ZUtleV9mcChGSUxFICpmcCxSU0EgKnJzYSk7CitSU0EgKmQyaV9SU0FQdWJsaWNLZXlfZnAoRklMRSAqZnAsUlNBICoqcnNhKTsKK2ludCBpMmRfUlNBUHVibGljS2V5X2ZwKEZJTEUgKmZwLFJTQSAqcnNhKTsKK1JTQSAqZDJpX1JTQV9QVUJLRVlfZnAoRklMRSAqZnAsUlNBICoqcnNhKTsKK2ludCBpMmRfUlNBX1BVQktFWV9mcChGSUxFICpmcCxSU0EgKnJzYSk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKK0RTQSAqZDJpX0RTQV9QVUJLRVlfZnAoRklMRSAqZnAsIERTQSAqKmRzYSk7CitpbnQgaTJkX0RTQV9QVUJLRVlfZnAoRklMRSAqZnAsIERTQSAqZHNhKTsKK0RTQSAqZDJpX0RTQVByaXZhdGVLZXlfZnAoRklMRSAqZnAsIERTQSAqKmRzYSk7CitpbnQgaTJkX0RTQVByaXZhdGVLZXlfZnAoRklMRSAqZnAsIERTQSAqZHNhKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0VDCitFQ19LRVkgKmQyaV9FQ19QVUJLRVlfZnAoRklMRSAqZnAsIEVDX0tFWSAqKmVja2V5KTsKK2ludCAgIGkyZF9FQ19QVUJLRVlfZnAoRklMRSAqZnAsIEVDX0tFWSAqZWNrZXkpOworRUNfS0VZICpkMmlfRUNQcml2YXRlS2V5X2ZwKEZJTEUgKmZwLCBFQ19LRVkgKiplY2tleSk7CitpbnQgICBpMmRfRUNQcml2YXRlS2V5X2ZwKEZJTEUgKmZwLCBFQ19LRVkgKmVja2V5KTsKKyNlbmRpZgorWDUwOV9TSUcgKmQyaV9QS0NTOF9mcChGSUxFICpmcCxYNTA5X1NJRyAqKnA4KTsKK2ludCBpMmRfUEtDUzhfZnAoRklMRSAqZnAsWDUwOV9TSUcgKnA4KTsKK1BLQ1M4X1BSSVZfS0VZX0lORk8gKmQyaV9QS0NTOF9QUklWX0tFWV9JTkZPX2ZwKEZJTEUgKmZwLAorCQkJCQkJUEtDUzhfUFJJVl9LRVlfSU5GTyAqKnA4aW5mKTsKK2ludCBpMmRfUEtDUzhfUFJJVl9LRVlfSU5GT19mcChGSUxFICpmcCxQS0NTOF9QUklWX0tFWV9JTkZPICpwOGluZik7CitpbnQgaTJkX1BLQ1M4UHJpdmF0ZUtleUluZm9fZnAoRklMRSAqZnAsIEVWUF9QS0VZICprZXkpOworaW50IGkyZF9Qcml2YXRlS2V5X2ZwKEZJTEUgKmZwLCBFVlBfUEtFWSAqcGtleSk7CitFVlBfUEtFWSAqZDJpX1ByaXZhdGVLZXlfZnAoRklMRSAqZnAsIEVWUF9QS0VZICoqYSk7CitpbnQgaTJkX1BVQktFWV9mcChGSUxFICpmcCwgRVZQX1BLRVkgKnBrZXkpOworRVZQX1BLRVkgKmQyaV9QVUJLRVlfZnAoRklMRSAqZnAsIEVWUF9QS0VZICoqYSk7CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0JJTworWDUwOSAqZDJpX1g1MDlfYmlvKEJJTyAqYnAsWDUwOSAqKng1MDkpOworaW50IGkyZF9YNTA5X2JpbyhCSU8gKmJwLFg1MDkgKng1MDkpOworWDUwOV9DUkwgKmQyaV9YNTA5X0NSTF9iaW8oQklPICpicCxYNTA5X0NSTCAqKmNybCk7CitpbnQgaTJkX1g1MDlfQ1JMX2JpbyhCSU8gKmJwLFg1MDlfQ1JMICpjcmwpOworWDUwOV9SRVEgKmQyaV9YNTA5X1JFUV9iaW8oQklPICpicCxYNTA5X1JFUSAqKnJlcSk7CitpbnQgaTJkX1g1MDlfUkVRX2JpbyhCSU8gKmJwLFg1MDlfUkVRICpyZXEpOworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorUlNBICpkMmlfUlNBUHJpdmF0ZUtleV9iaW8oQklPICpicCxSU0EgKipyc2EpOworaW50IGkyZF9SU0FQcml2YXRlS2V5X2JpbyhCSU8gKmJwLFJTQSAqcnNhKTsKK1JTQSAqZDJpX1JTQVB1YmxpY0tleV9iaW8oQklPICpicCxSU0EgKipyc2EpOworaW50IGkyZF9SU0FQdWJsaWNLZXlfYmlvKEJJTyAqYnAsUlNBICpyc2EpOworUlNBICpkMmlfUlNBX1BVQktFWV9iaW8oQklPICpicCxSU0EgKipyc2EpOworaW50IGkyZF9SU0FfUFVCS0VZX2JpbyhCSU8gKmJwLFJTQSAqcnNhKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorRFNBICpkMmlfRFNBX1BVQktFWV9iaW8oQklPICpicCwgRFNBICoqZHNhKTsKK2ludCBpMmRfRFNBX1BVQktFWV9iaW8oQklPICpicCwgRFNBICpkc2EpOworRFNBICpkMmlfRFNBUHJpdmF0ZUtleV9iaW8oQklPICpicCwgRFNBICoqZHNhKTsKK2ludCBpMmRfRFNBUHJpdmF0ZUtleV9iaW8oQklPICpicCwgRFNBICpkc2EpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRUMKK0VDX0tFWSAqZDJpX0VDX1BVQktFWV9iaW8oQklPICpicCwgRUNfS0VZICoqZWNrZXkpOworaW50ICAgaTJkX0VDX1BVQktFWV9iaW8oQklPICpicCwgRUNfS0VZICplY2tleSk7CitFQ19LRVkgKmQyaV9FQ1ByaXZhdGVLZXlfYmlvKEJJTyAqYnAsIEVDX0tFWSAqKmVja2V5KTsKK2ludCAgIGkyZF9FQ1ByaXZhdGVLZXlfYmlvKEJJTyAqYnAsIEVDX0tFWSAqZWNrZXkpOworI2VuZGlmCitYNTA5X1NJRyAqZDJpX1BLQ1M4X2JpbyhCSU8gKmJwLFg1MDlfU0lHICoqcDgpOworaW50IGkyZF9QS0NTOF9iaW8oQklPICpicCxYNTA5X1NJRyAqcDgpOworUEtDUzhfUFJJVl9LRVlfSU5GTyAqZDJpX1BLQ1M4X1BSSVZfS0VZX0lORk9fYmlvKEJJTyAqYnAsCisJCQkJCQlQS0NTOF9QUklWX0tFWV9JTkZPICoqcDhpbmYpOworaW50IGkyZF9QS0NTOF9QUklWX0tFWV9JTkZPX2JpbyhCSU8gKmJwLFBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4aW5mKTsKK2ludCBpMmRfUEtDUzhQcml2YXRlS2V5SW5mb19iaW8oQklPICpicCwgRVZQX1BLRVkgKmtleSk7CitpbnQgaTJkX1ByaXZhdGVLZXlfYmlvKEJJTyAqYnAsIEVWUF9QS0VZICpwa2V5KTsKK0VWUF9QS0VZICpkMmlfUHJpdmF0ZUtleV9iaW8oQklPICpicCwgRVZQX1BLRVkgKiphKTsKK2ludCBpMmRfUFVCS0VZX2JpbyhCSU8gKmJwLCBFVlBfUEtFWSAqcGtleSk7CitFVlBfUEtFWSAqZDJpX1BVQktFWV9iaW8oQklPICpicCwgRVZQX1BLRVkgKiphKTsKKyNlbmRpZgorCitYNTA5ICpYNTA5X2R1cChYNTA5ICp4NTA5KTsKK1g1MDlfQVRUUklCVVRFICpYNTA5X0FUVFJJQlVURV9kdXAoWDUwOV9BVFRSSUJVVEUgKnhhKTsKK1g1MDlfRVhURU5TSU9OICpYNTA5X0VYVEVOU0lPTl9kdXAoWDUwOV9FWFRFTlNJT04gKmV4KTsKK1g1MDlfQ1JMICpYNTA5X0NSTF9kdXAoWDUwOV9DUkwgKmNybCk7CitYNTA5X1JFVk9LRUQgKlg1MDlfUkVWT0tFRF9kdXAoWDUwOV9SRVZPS0VEICpyZXYpOworWDUwOV9SRVEgKlg1MDlfUkVRX2R1cChYNTA5X1JFUSAqcmVxKTsKK1g1MDlfQUxHT1IgKlg1MDlfQUxHT1JfZHVwKFg1MDlfQUxHT1IgKnhuKTsKK2ludCBYNTA5X0FMR09SX3NldDAoWDUwOV9BTEdPUiAqYWxnLCBjb25zdCBBU04xX09CSkVDVCAqYW9iaiwgaW50IHB0eXBlLCB2b2lkICpwdmFsKTsKK3ZvaWQgWDUwOV9BTEdPUl9nZXQwKEFTTjFfT0JKRUNUICoqcGFvYmosIGludCAqcHB0eXBlLCB2b2lkICoqcHB2YWwsCisJCQkJCQlYNTA5X0FMR09SICphbGdvcik7Cit2b2lkIFg1MDlfQUxHT1Jfc2V0X21kKFg1MDlfQUxHT1IgKmFsZywgY29uc3QgRVZQX01EICptZCk7CisKK1g1MDlfTkFNRSAqWDUwOV9OQU1FX2R1cChYNTA5X05BTUUgKnhuKTsKK1g1MDlfTkFNRV9FTlRSWSAqWDUwOV9OQU1FX0VOVFJZX2R1cChYNTA5X05BTUVfRU5UUlkgKm5lKTsKKworaW50CQlYNTA5X2NtcF90aW1lKGNvbnN0IEFTTjFfVElNRSAqcywgdGltZV90ICp0KTsKK2ludAkJWDUwOV9jbXBfY3VycmVudF90aW1lKGNvbnN0IEFTTjFfVElNRSAqcyk7CitBU04xX1RJTUUgKglYNTA5X3RpbWVfYWRqKEFTTjFfVElNRSAqcywgbG9uZyBhZGosIHRpbWVfdCAqdCk7CitBU04xX1RJTUUgKglYNTA5X3RpbWVfYWRqX2V4KEFTTjFfVElNRSAqcywKKwkJCQlpbnQgb2Zmc2V0X2RheSwgbG9uZyBvZmZzZXRfc2VjLCB0aW1lX3QgKnQpOworQVNOMV9USU1FICoJWDUwOV9nbXRpbWVfYWRqKEFTTjFfVElNRSAqcywgbG9uZyBhZGopOworCitjb25zdCBjaGFyICoJWDUwOV9nZXRfZGVmYXVsdF9jZXJ0X2FyZWEodm9pZCApOworY29uc3QgY2hhciAqCVg1MDlfZ2V0X2RlZmF1bHRfY2VydF9kaXIodm9pZCApOworY29uc3QgY2hhciAqCVg1MDlfZ2V0X2RlZmF1bHRfY2VydF9maWxlKHZvaWQgKTsKK2NvbnN0IGNoYXIgKglYNTA5X2dldF9kZWZhdWx0X2NlcnRfZGlyX2Vudih2b2lkICk7Citjb25zdCBjaGFyICoJWDUwOV9nZXRfZGVmYXVsdF9jZXJ0X2ZpbGVfZW52KHZvaWQgKTsKK2NvbnN0IGNoYXIgKglYNTA5X2dldF9kZWZhdWx0X3ByaXZhdGVfZGlyKHZvaWQgKTsKKworWDUwOV9SRVEgKglYNTA5X3RvX1g1MDlfUkVRKFg1MDkgKngsIEVWUF9QS0VZICpwa2V5LCBjb25zdCBFVlBfTUQgKm1kKTsKK1g1MDkgKgkJWDUwOV9SRVFfdG9fWDUwOShYNTA5X1JFUSAqciwgaW50IGRheXMsRVZQX1BLRVkgKnBrZXkpOworCitERUNMQVJFX0FTTjFfRU5DT0RFX0ZVTkNUSU9OUyhYNTA5X0FMR09SUywgWDUwOV9BTEdPUlMsIFg1MDlfQUxHT1JTKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhYNTA5X1ZBTCkKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhYNTA5X1BVQktFWSkKKworaW50CQlYNTA5X1BVQktFWV9zZXQoWDUwOV9QVUJLRVkgKip4LCBFVlBfUEtFWSAqcGtleSk7CitFVlBfUEtFWSAqCVg1MDlfUFVCS0VZX2dldChYNTA5X1BVQktFWSAqa2V5KTsKK2ludAkJWDUwOV9nZXRfcHVia2V5X3BhcmFtZXRlcnMoRVZQX1BLRVkgKnBrZXksCisJCQkJCSAgIFNUQUNLX09GKFg1MDkpICpjaGFpbik7CitpbnQJCWkyZF9QVUJLRVkoY29uc3QgRVZQX1BLRVkgKmEsdW5zaWduZWQgY2hhciAqKnBwKTsKK0VWUF9QS0VZICoJZDJpX1BVQktFWShFVlBfUEtFWSAqKmEsY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLAorCQkJbG9uZyBsZW5ndGgpOworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQoraW50CQlpMmRfUlNBX1BVQktFWShjb25zdCBSU0EgKmEsdW5zaWduZWQgY2hhciAqKnBwKTsKK1JTQSAqCQlkMmlfUlNBX1BVQktFWShSU0EgKiphLGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwKKwkJCWxvbmcgbGVuZ3RoKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RTQQoraW50CQlpMmRfRFNBX1BVQktFWShjb25zdCBEU0EgKmEsdW5zaWduZWQgY2hhciAqKnBwKTsKK0RTQSAqCQlkMmlfRFNBX1BVQktFWShEU0EgKiphLGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwKKwkJCWxvbmcgbGVuZ3RoKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0VDCitpbnQJCWkyZF9FQ19QVUJLRVkoY29uc3QgRUNfS0VZICphLCB1bnNpZ25lZCBjaGFyICoqcHApOworRUNfS0VZIAkJKmQyaV9FQ19QVUJLRVkoRUNfS0VZICoqYSwgY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLAorCQkJbG9uZyBsZW5ndGgpOworI2VuZGlmCisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoWDUwOV9TSUcpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFg1MDlfUkVRX0lORk8pCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFg1MDlfUkVRKQorCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFg1MDlfQVRUUklCVVRFKQorWDUwOV9BVFRSSUJVVEUgKlg1MDlfQVRUUklCVVRFX2NyZWF0ZShpbnQgbmlkLCBpbnQgYXRydHlwZSwgdm9pZCAqdmFsdWUpOworCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFg1MDlfRVhURU5TSU9OKQorREVDTEFSRV9BU04xX0VOQ09ERV9GVU5DVElPTlMoWDUwOV9FWFRFTlNJT05TLCBYNTA5X0VYVEVOU0lPTlMsIFg1MDlfRVhURU5TSU9OUykKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhYNTA5X05BTUVfRU5UUlkpCisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoWDUwOV9OQU1FKQorCitpbnQJCVg1MDlfTkFNRV9zZXQoWDUwOV9OQU1FICoqeG4sIFg1MDlfTkFNRSAqbmFtZSk7CisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoWDUwOV9DSU5GKQorCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFg1MDkpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFg1MDlfQ0VSVF9BVVgpCisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoWDUwOV9DRVJUX1BBSVIpCisKK2ludCBYNTA5X2dldF9leF9uZXdfaW5kZXgobG9uZyBhcmdsLCB2b2lkICphcmdwLCBDUllQVE9fRVhfbmV3ICpuZXdfZnVuYywKKwkgICAgIENSWVBUT19FWF9kdXAgKmR1cF9mdW5jLCBDUllQVE9fRVhfZnJlZSAqZnJlZV9mdW5jKTsKK2ludCBYNTA5X3NldF9leF9kYXRhKFg1MDkgKnIsIGludCBpZHgsIHZvaWQgKmFyZyk7Cit2b2lkICpYNTA5X2dldF9leF9kYXRhKFg1MDkgKnIsIGludCBpZHgpOworaW50CQlpMmRfWDUwOV9BVVgoWDUwOSAqYSx1bnNpZ25lZCBjaGFyICoqcHApOworWDUwOSAqCQlkMmlfWDUwOV9BVVgoWDUwOSAqKmEsY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLGxvbmcgbGVuZ3RoKTsKKwordm9pZCBYNTA5X2dldDBfc2lnbmF0dXJlKEFTTjFfQklUX1NUUklORyAqKnBzaWcsIFg1MDlfQUxHT1IgKipwYWxnLAorCQkJCQkJCQljb25zdCBYNTA5ICp4KTsKK2ludCBYNTA5X2dldF9zaWduYXR1cmVfbmlkKGNvbnN0IFg1MDkgKngpOworCitpbnQgWDUwOV9hbGlhc19zZXQxKFg1MDkgKngsIHVuc2lnbmVkIGNoYXIgKm5hbWUsIGludCBsZW4pOworaW50IFg1MDlfa2V5aWRfc2V0MShYNTA5ICp4LCB1bnNpZ25lZCBjaGFyICppZCwgaW50IGxlbik7Cit1bnNpZ25lZCBjaGFyICogWDUwOV9hbGlhc19nZXQwKFg1MDkgKngsIGludCAqbGVuKTsKK3Vuc2lnbmVkIGNoYXIgKiBYNTA5X2tleWlkX2dldDAoWDUwOSAqeCwgaW50ICpsZW4pOworaW50ICgqWDUwOV9UUlVTVF9zZXRfZGVmYXVsdChpbnQgKCp0cnVzdCkoaW50ICwgWDUwOSAqLCBpbnQpKSkoaW50LCBYNTA5ICosIGludCk7CitpbnQgWDUwOV9UUlVTVF9zZXQoaW50ICp0LCBpbnQgdHJ1c3QpOworaW50IFg1MDlfYWRkMV90cnVzdF9vYmplY3QoWDUwOSAqeCwgQVNOMV9PQkpFQ1QgKm9iaik7CitpbnQgWDUwOV9hZGQxX3JlamVjdF9vYmplY3QoWDUwOSAqeCwgQVNOMV9PQkpFQ1QgKm9iaik7Cit2b2lkIFg1MDlfdHJ1c3RfY2xlYXIoWDUwOSAqeCk7Cit2b2lkIFg1MDlfcmVqZWN0X2NsZWFyKFg1MDkgKngpOworCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFg1MDlfUkVWT0tFRCkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoWDUwOV9DUkxfSU5GTykKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoWDUwOV9DUkwpCisKK2ludCBYNTA5X0NSTF9hZGQwX3Jldm9rZWQoWDUwOV9DUkwgKmNybCwgWDUwOV9SRVZPS0VEICpyZXYpOworaW50IFg1MDlfQ1JMX2dldDBfYnlfc2VyaWFsKFg1MDlfQ1JMICpjcmwsCisJCVg1MDlfUkVWT0tFRCAqKnJldCwgQVNOMV9JTlRFR0VSICpzZXJpYWwpOworaW50IFg1MDlfQ1JMX2dldDBfYnlfY2VydChYNTA5X0NSTCAqY3JsLCBYNTA5X1JFVk9LRUQgKipyZXQsIFg1MDkgKngpOworCitYNTA5X1BLRVkgKglYNTA5X1BLRVlfbmV3KHZvaWQgKTsKK3ZvaWQJCVg1MDlfUEtFWV9mcmVlKFg1MDlfUEtFWSAqYSk7CitpbnQJCWkyZF9YNTA5X1BLRVkoWDUwOV9QS0VZICphLHVuc2lnbmVkIGNoYXIgKipwcCk7CitYNTA5X1BLRVkgKglkMmlfWDUwOV9QS0VZKFg1MDlfUEtFWSAqKmEsY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLGxvbmcgbGVuZ3RoKTsKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhORVRTQ0FQRV9TUEtJKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhORVRTQ0FQRV9TUEtBQykKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoTkVUU0NBUEVfQ0VSVF9TRVFVRU5DRSkKKworI2lmbmRlZiBPUEVOU1NMX05PX0VWUAorWDUwOV9JTkZPICoJWDUwOV9JTkZPX25ldyh2b2lkKTsKK3ZvaWQJCVg1MDlfSU5GT19mcmVlKFg1MDlfSU5GTyAqYSk7CitjaGFyICoJCVg1MDlfTkFNRV9vbmVsaW5lKFg1MDlfTkFNRSAqYSxjaGFyICpidWYsaW50IHNpemUpOworCitpbnQgQVNOMV92ZXJpZnkoaTJkX29mX3ZvaWQgKmkyZCwgWDUwOV9BTEdPUiAqYWxnb3IxLAorCQlBU04xX0JJVF9TVFJJTkcgKnNpZ25hdHVyZSxjaGFyICpkYXRhLEVWUF9QS0VZICpwa2V5KTsKKworaW50IEFTTjFfZGlnZXN0KGkyZF9vZl92b2lkICppMmQsY29uc3QgRVZQX01EICp0eXBlLGNoYXIgKmRhdGEsCisJCXVuc2lnbmVkIGNoYXIgKm1kLHVuc2lnbmVkIGludCAqbGVuKTsKKworaW50IEFTTjFfc2lnbihpMmRfb2Zfdm9pZCAqaTJkLCBYNTA5X0FMR09SICphbGdvcjEsCisJICAgICAgWDUwOV9BTEdPUiAqYWxnb3IyLCBBU04xX0JJVF9TVFJJTkcgKnNpZ25hdHVyZSwKKwkgICAgICBjaGFyICpkYXRhLEVWUF9QS0VZICpwa2V5LCBjb25zdCBFVlBfTUQgKnR5cGUpOworCitpbnQgQVNOMV9pdGVtX2RpZ2VzdChjb25zdCBBU04xX0lURU0gKml0LGNvbnN0IEVWUF9NRCAqdHlwZSx2b2lkICpkYXRhLAorCXVuc2lnbmVkIGNoYXIgKm1kLHVuc2lnbmVkIGludCAqbGVuKTsKKworaW50IEFTTjFfaXRlbV92ZXJpZnkoY29uc3QgQVNOMV9JVEVNICppdCwgWDUwOV9BTEdPUiAqYWxnb3IxLAorCUFTTjFfQklUX1NUUklORyAqc2lnbmF0dXJlLHZvaWQgKmRhdGEsRVZQX1BLRVkgKnBrZXkpOworCitpbnQgQVNOMV9pdGVtX3NpZ24oY29uc3QgQVNOMV9JVEVNICppdCwgWDUwOV9BTEdPUiAqYWxnb3IxLCBYNTA5X0FMR09SICphbGdvcjIsCisJQVNOMV9CSVRfU1RSSU5HICpzaWduYXR1cmUsCisJdm9pZCAqZGF0YSwgRVZQX1BLRVkgKnBrZXksIGNvbnN0IEVWUF9NRCAqdHlwZSk7CitpbnQgQVNOMV9pdGVtX3NpZ25fY3R4KGNvbnN0IEFTTjFfSVRFTSAqaXQsCisJCVg1MDlfQUxHT1IgKmFsZ29yMSwgWDUwOV9BTEdPUiAqYWxnb3IyLAorCSAgICAgCUFTTjFfQklUX1NUUklORyAqc2lnbmF0dXJlLCB2b2lkICphc24sIEVWUF9NRF9DVFggKmN0eCk7CisjZW5kaWYKKworaW50IAkJWDUwOV9zZXRfdmVyc2lvbihYNTA5ICp4LGxvbmcgdmVyc2lvbik7CitpbnQgCQlYNTA5X3NldF9zZXJpYWxOdW1iZXIoWDUwOSAqeCwgQVNOMV9JTlRFR0VSICpzZXJpYWwpOworQVNOMV9JTlRFR0VSICoJWDUwOV9nZXRfc2VyaWFsTnVtYmVyKFg1MDkgKngpOworaW50IAkJWDUwOV9zZXRfaXNzdWVyX25hbWUoWDUwOSAqeCwgWDUwOV9OQU1FICpuYW1lKTsKK1g1MDlfTkFNRSAqCVg1MDlfZ2V0X2lzc3Vlcl9uYW1lKFg1MDkgKmEpOworaW50IAkJWDUwOV9zZXRfc3ViamVjdF9uYW1lKFg1MDkgKngsIFg1MDlfTkFNRSAqbmFtZSk7CitYNTA5X05BTUUgKglYNTA5X2dldF9zdWJqZWN0X25hbWUoWDUwOSAqYSk7CitpbnQgCQlYNTA5X3NldF9ub3RCZWZvcmUoWDUwOSAqeCwgY29uc3QgQVNOMV9USU1FICp0bSk7CitpbnQgCQlYNTA5X3NldF9ub3RBZnRlcihYNTA5ICp4LCBjb25zdCBBU04xX1RJTUUgKnRtKTsKK2ludCAJCVg1MDlfc2V0X3B1YmtleShYNTA5ICp4LCBFVlBfUEtFWSAqcGtleSk7CitFVlBfUEtFWSAqCVg1MDlfZ2V0X3B1YmtleShYNTA5ICp4KTsKK0FTTjFfQklUX1NUUklORyAqIFg1MDlfZ2V0MF9wdWJrZXlfYml0c3RyKGNvbnN0IFg1MDkgKngpOworaW50CQlYNTA5X2NlcnRpZmljYXRlX3R5cGUoWDUwOSAqeCxFVlBfUEtFWSAqcHVia2V5IC8qIG9wdGlvbmFsICovKTsKKworaW50CQlYNTA5X1JFUV9zZXRfdmVyc2lvbihYNTA5X1JFUSAqeCxsb25nIHZlcnNpb24pOworaW50CQlYNTA5X1JFUV9zZXRfc3ViamVjdF9uYW1lKFg1MDlfUkVRICpyZXEsWDUwOV9OQU1FICpuYW1lKTsKK2ludAkJWDUwOV9SRVFfc2V0X3B1YmtleShYNTA5X1JFUSAqeCwgRVZQX1BLRVkgKnBrZXkpOworRVZQX1BLRVkgKglYNTA5X1JFUV9nZXRfcHVia2V5KFg1MDlfUkVRICpyZXEpOworaW50CQlYNTA5X1JFUV9leHRlbnNpb25fbmlkKGludCBuaWQpOworaW50ICoJCVg1MDlfUkVRX2dldF9leHRlbnNpb25fbmlkcyh2b2lkKTsKK3ZvaWQJCVg1MDlfUkVRX3NldF9leHRlbnNpb25fbmlkcyhpbnQgKm5pZHMpOworU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICpYNTA5X1JFUV9nZXRfZXh0ZW5zaW9ucyhYNTA5X1JFUSAqcmVxKTsKK2ludCBYNTA5X1JFUV9hZGRfZXh0ZW5zaW9uc19uaWQoWDUwOV9SRVEgKnJlcSwgU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICpleHRzLAorCQkJCWludCBuaWQpOworaW50IFg1MDlfUkVRX2FkZF9leHRlbnNpb25zKFg1MDlfUkVRICpyZXEsIFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqZXh0cyk7CitpbnQgWDUwOV9SRVFfZ2V0X2F0dHJfY291bnQoY29uc3QgWDUwOV9SRVEgKnJlcSk7CitpbnQgWDUwOV9SRVFfZ2V0X2F0dHJfYnlfTklEKGNvbnN0IFg1MDlfUkVRICpyZXEsIGludCBuaWQsCisJCQkgIGludCBsYXN0cG9zKTsKK2ludCBYNTA5X1JFUV9nZXRfYXR0cl9ieV9PQkooY29uc3QgWDUwOV9SRVEgKnJlcSwgQVNOMV9PQkpFQ1QgKm9iaiwKKwkJCSAgaW50IGxhc3Rwb3MpOworWDUwOV9BVFRSSUJVVEUgKlg1MDlfUkVRX2dldF9hdHRyKGNvbnN0IFg1MDlfUkVRICpyZXEsIGludCBsb2MpOworWDUwOV9BVFRSSUJVVEUgKlg1MDlfUkVRX2RlbGV0ZV9hdHRyKFg1MDlfUkVRICpyZXEsIGludCBsb2MpOworaW50IFg1MDlfUkVRX2FkZDFfYXR0cihYNTA5X1JFUSAqcmVxLCBYNTA5X0FUVFJJQlVURSAqYXR0cik7CitpbnQgWDUwOV9SRVFfYWRkMV9hdHRyX2J5X09CSihYNTA5X1JFUSAqcmVxLAorCQkJY29uc3QgQVNOMV9PQkpFQ1QgKm9iaiwgaW50IHR5cGUsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcywgaW50IGxlbik7CitpbnQgWDUwOV9SRVFfYWRkMV9hdHRyX2J5X05JRChYNTA5X1JFUSAqcmVxLAorCQkJaW50IG5pZCwgaW50IHR5cGUsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcywgaW50IGxlbik7CitpbnQgWDUwOV9SRVFfYWRkMV9hdHRyX2J5X3R4dChYNTA5X1JFUSAqcmVxLAorCQkJY29uc3QgY2hhciAqYXR0cm5hbWUsIGludCB0eXBlLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMsIGludCBsZW4pOworCitpbnQgWDUwOV9DUkxfc2V0X3ZlcnNpb24oWDUwOV9DUkwgKngsIGxvbmcgdmVyc2lvbik7CitpbnQgWDUwOV9DUkxfc2V0X2lzc3Vlcl9uYW1lKFg1MDlfQ1JMICp4LCBYNTA5X05BTUUgKm5hbWUpOworaW50IFg1MDlfQ1JMX3NldF9sYXN0VXBkYXRlKFg1MDlfQ1JMICp4LCBjb25zdCBBU04xX1RJTUUgKnRtKTsKK2ludCBYNTA5X0NSTF9zZXRfbmV4dFVwZGF0ZShYNTA5X0NSTCAqeCwgY29uc3QgQVNOMV9USU1FICp0bSk7CitpbnQgWDUwOV9DUkxfc29ydChYNTA5X0NSTCAqY3JsKTsKKworaW50IFg1MDlfUkVWT0tFRF9zZXRfc2VyaWFsTnVtYmVyKFg1MDlfUkVWT0tFRCAqeCwgQVNOMV9JTlRFR0VSICpzZXJpYWwpOworaW50IFg1MDlfUkVWT0tFRF9zZXRfcmV2b2NhdGlvbkRhdGUoWDUwOV9SRVZPS0VEICpyLCBBU04xX1RJTUUgKnRtKTsKKworWDUwOV9DUkwgKlg1MDlfQ1JMX2RpZmYoWDUwOV9DUkwgKmJhc2UsIFg1MDlfQ1JMICpuZXdlciwKKwkJCUVWUF9QS0VZICpza2V5LCBjb25zdCBFVlBfTUQgKm1kLCB1bnNpZ25lZCBpbnQgZmxhZ3MpOworCitpbnQJCVg1MDlfUkVRX2NoZWNrX3ByaXZhdGVfa2V5KFg1MDlfUkVRICp4NTA5LEVWUF9QS0VZICpwa2V5KTsKKworaW50CQlYNTA5X2NoZWNrX3ByaXZhdGVfa2V5KFg1MDkgKng1MDksRVZQX1BLRVkgKnBrZXkpOworaW50IAkJWDUwOV9jaGFpbl9jaGVja19zdWl0ZWIoaW50ICpwZXJyb3JfZGVwdGgsCisJCQkJCQlYNTA5ICp4LCBTVEFDS19PRihYNTA5KSAqY2hhaW4sCisJCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2ludCAJCVg1MDlfQ1JMX2NoZWNrX3N1aXRlYihYNTA5X0NSTCAqY3JsLCBFVlBfUEtFWSAqcGssCisJCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKTsKK1NUQUNLX09GKFg1MDkpICpYNTA5X2NoYWluX3VwX3JlZihTVEFDS19PRihYNTA5KSAqY2hhaW4pOworCitpbnQJCVg1MDlfaXNzdWVyX2FuZF9zZXJpYWxfY21wKGNvbnN0IFg1MDkgKmEsIGNvbnN0IFg1MDkgKmIpOwordW5zaWduZWQgbG9uZwlYNTA5X2lzc3Vlcl9hbmRfc2VyaWFsX2hhc2goWDUwOSAqYSk7CisKK2ludAkJWDUwOV9pc3N1ZXJfbmFtZV9jbXAoY29uc3QgWDUwOSAqYSwgY29uc3QgWDUwOSAqYik7Cit1bnNpZ25lZCBsb25nCVg1MDlfaXNzdWVyX25hbWVfaGFzaChYNTA5ICphKTsKKworaW50CQlYNTA5X3N1YmplY3RfbmFtZV9jbXAoY29uc3QgWDUwOSAqYSwgY29uc3QgWDUwOSAqYik7Cit1bnNpZ25lZCBsb25nCVg1MDlfc3ViamVjdF9uYW1lX2hhc2goWDUwOSAqeCk7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19NRDUKK3Vuc2lnbmVkIGxvbmcJWDUwOV9pc3N1ZXJfbmFtZV9oYXNoX29sZChYNTA5ICphKTsKK3Vuc2lnbmVkIGxvbmcJWDUwOV9zdWJqZWN0X25hbWVfaGFzaF9vbGQoWDUwOSAqeCk7CisjZW5kaWYKKworaW50CQlYNTA5X2NtcChjb25zdCBYNTA5ICphLCBjb25zdCBYNTA5ICpiKTsKK2ludAkJWDUwOV9OQU1FX2NtcChjb25zdCBYNTA5X05BTUUgKmEsIGNvbnN0IFg1MDlfTkFNRSAqYik7Cit1bnNpZ25lZCBsb25nCVg1MDlfTkFNRV9oYXNoKFg1MDlfTkFNRSAqeCk7Cit1bnNpZ25lZCBsb25nCVg1MDlfTkFNRV9oYXNoX29sZChYNTA5X05BTUUgKngpOworCitpbnQJCVg1MDlfQ1JMX2NtcChjb25zdCBYNTA5X0NSTCAqYSwgY29uc3QgWDUwOV9DUkwgKmIpOworaW50CQlYNTA5X0NSTF9tYXRjaChjb25zdCBYNTA5X0NSTCAqYSwgY29uc3QgWDUwOV9DUkwgKmIpOworI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQoraW50CQlYNTA5X3ByaW50X2V4X2ZwKEZJTEUgKmJwLFg1MDkgKngsIHVuc2lnbmVkIGxvbmcgbm1mbGFnLCB1bnNpZ25lZCBsb25nIGNmbGFnKTsKK2ludAkJWDUwOV9wcmludF9mcChGSUxFICpicCxYNTA5ICp4KTsKK2ludAkJWDUwOV9DUkxfcHJpbnRfZnAoRklMRSAqYnAsWDUwOV9DUkwgKngpOworaW50CQlYNTA5X1JFUV9wcmludF9mcChGSUxFICpicCxYNTA5X1JFUSAqcmVxKTsKK2ludCBYNTA5X05BTUVfcHJpbnRfZXhfZnAoRklMRSAqZnAsIFg1MDlfTkFNRSAqbm0sIGludCBpbmRlbnQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19CSU8KK2ludAkJWDUwOV9OQU1FX3ByaW50KEJJTyAqYnAsIFg1MDlfTkFNRSAqbmFtZSwgaW50IG9iYXNlKTsKK2ludCBYNTA5X05BTUVfcHJpbnRfZXgoQklPICpvdXQsIFg1MDlfTkFNRSAqbm0sIGludCBpbmRlbnQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworaW50CQlYNTA5X3ByaW50X2V4KEJJTyAqYnAsWDUwOSAqeCwgdW5zaWduZWQgbG9uZyBubWZsYWcsIHVuc2lnbmVkIGxvbmcgY2ZsYWcpOworaW50CQlYNTA5X3ByaW50KEJJTyAqYnAsWDUwOSAqeCk7CitpbnQJCVg1MDlfb2NzcGlkX3ByaW50KEJJTyAqYnAsWDUwOSAqeCk7CitpbnQJCVg1MDlfQ0VSVF9BVVhfcHJpbnQoQklPICpicCxYNTA5X0NFUlRfQVVYICp4LCBpbnQgaW5kZW50KTsKK2ludAkJWDUwOV9DUkxfcHJpbnQoQklPICpicCxYNTA5X0NSTCAqeCk7CitpbnQJCVg1MDlfUkVRX3ByaW50X2V4KEJJTyAqYnAsIFg1MDlfUkVRICp4LCB1bnNpZ25lZCBsb25nIG5tZmxhZywgdW5zaWduZWQgbG9uZyBjZmxhZyk7CitpbnQJCVg1MDlfUkVRX3ByaW50KEJJTyAqYnAsWDUwOV9SRVEgKnJlcSk7CisjZW5kaWYKKworaW50IAkJWDUwOV9OQU1FX2VudHJ5X2NvdW50KFg1MDlfTkFNRSAqbmFtZSk7CitpbnQgCQlYNTA5X05BTUVfZ2V0X3RleHRfYnlfTklEKFg1MDlfTkFNRSAqbmFtZSwgaW50IG5pZCwKKwkJCWNoYXIgKmJ1ZixpbnQgbGVuKTsKK2ludAkJWDUwOV9OQU1FX2dldF90ZXh0X2J5X09CSihYNTA5X05BTUUgKm5hbWUsIGNvbnN0IEFTTjFfT0JKRUNUICpvYmosCisJCQljaGFyICpidWYsaW50IGxlbik7CisKKy8qIE5PVEU6IHlvdSBzaG91bGQgYmUgcGFzc3NpbmcgLTEsIG5vdCAwIGFzIGxhc3Rwb3MuICBUaGUgZnVuY3Rpb25zIHRoYXQgdXNlCisgKiBsYXN0cG9zLCBzZWFyY2ggYWZ0ZXIgdGhhdCBwb3NpdGlvbiBvbi4gKi8KK2ludCAJCVg1MDlfTkFNRV9nZXRfaW5kZXhfYnlfTklEKFg1MDlfTkFNRSAqbmFtZSxpbnQgbmlkLGludCBsYXN0cG9zKTsKK2ludCAJCVg1MDlfTkFNRV9nZXRfaW5kZXhfYnlfT0JKKFg1MDlfTkFNRSAqbmFtZSwgY29uc3QgQVNOMV9PQkpFQ1QgKm9iaiwKKwkJCWludCBsYXN0cG9zKTsKK1g1MDlfTkFNRV9FTlRSWSAqWDUwOV9OQU1FX2dldF9lbnRyeShYNTA5X05BTUUgKm5hbWUsIGludCBsb2MpOworWDUwOV9OQU1FX0VOVFJZICpYNTA5X05BTUVfZGVsZXRlX2VudHJ5KFg1MDlfTkFNRSAqbmFtZSwgaW50IGxvYyk7CitpbnQgCQlYNTA5X05BTUVfYWRkX2VudHJ5KFg1MDlfTkFNRSAqbmFtZSxYNTA5X05BTUVfRU5UUlkgKm5lLAorCQkJaW50IGxvYywgaW50IHNldCk7CitpbnQgWDUwOV9OQU1FX2FkZF9lbnRyeV9ieV9PQkooWDUwOV9OQU1FICpuYW1lLCBBU04xX09CSkVDVCAqb2JqLCBpbnQgdHlwZSwKKwkJCXVuc2lnbmVkIGNoYXIgKmJ5dGVzLCBpbnQgbGVuLCBpbnQgbG9jLCBpbnQgc2V0KTsKK2ludCBYNTA5X05BTUVfYWRkX2VudHJ5X2J5X05JRChYNTA5X05BTUUgKm5hbWUsIGludCBuaWQsIGludCB0eXBlLAorCQkJdW5zaWduZWQgY2hhciAqYnl0ZXMsIGludCBsZW4sIGludCBsb2MsIGludCBzZXQpOworWDUwOV9OQU1FX0VOVFJZICpYNTA5X05BTUVfRU5UUllfY3JlYXRlX2J5X3R4dChYNTA5X05BTUVfRU5UUlkgKipuZSwKKwkJY29uc3QgY2hhciAqZmllbGQsIGludCB0eXBlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcywgaW50IGxlbik7CitYNTA5X05BTUVfRU5UUlkgKlg1MDlfTkFNRV9FTlRSWV9jcmVhdGVfYnlfTklEKFg1MDlfTkFNRV9FTlRSWSAqKm5lLCBpbnQgbmlkLAorCQkJaW50IHR5cGUsdW5zaWduZWQgY2hhciAqYnl0ZXMsIGludCBsZW4pOworaW50IFg1MDlfTkFNRV9hZGRfZW50cnlfYnlfdHh0KFg1MDlfTkFNRSAqbmFtZSwgY29uc3QgY2hhciAqZmllbGQsIGludCB0eXBlLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMsIGludCBsZW4sIGludCBsb2MsIGludCBzZXQpOworWDUwOV9OQU1FX0VOVFJZICpYNTA5X05BTUVfRU5UUllfY3JlYXRlX2J5X09CSihYNTA5X05BTUVfRU5UUlkgKipuZSwKKwkJCWNvbnN0IEFTTjFfT0JKRUNUICpvYmosIGludCB0eXBlLGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzLAorCQkJaW50IGxlbik7CitpbnQgCQlYNTA5X05BTUVfRU5UUllfc2V0X29iamVjdChYNTA5X05BTUVfRU5UUlkgKm5lLAorCQkJY29uc3QgQVNOMV9PQkpFQ1QgKm9iaik7CitpbnQgCQlYNTA5X05BTUVfRU5UUllfc2V0X2RhdGEoWDUwOV9OQU1FX0VOVFJZICpuZSwgaW50IHR5cGUsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcywgaW50IGxlbik7CitBU04xX09CSkVDVCAqCVg1MDlfTkFNRV9FTlRSWV9nZXRfb2JqZWN0KFg1MDlfTkFNRV9FTlRSWSAqbmUpOworQVNOMV9TVFJJTkcgKglYNTA5X05BTUVfRU5UUllfZ2V0X2RhdGEoWDUwOV9OQU1FX0VOVFJZICpuZSk7CisKK2ludAkJWDUwOXYzX2dldF9leHRfY291bnQoY29uc3QgU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICp4KTsKK2ludAkJWDUwOXYzX2dldF9leHRfYnlfTklEKGNvbnN0IFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqeCwKKwkJCQkgICAgICBpbnQgbmlkLCBpbnQgbGFzdHBvcyk7CitpbnQJCVg1MDl2M19nZXRfZXh0X2J5X09CSihjb25zdCBTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKngsCisJCQkJICAgICAgY29uc3QgQVNOMV9PQkpFQ1QgKm9iaixpbnQgbGFzdHBvcyk7CitpbnQJCVg1MDl2M19nZXRfZXh0X2J5X2NyaXRpY2FsKGNvbnN0IFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqeCwKKwkJCQkJICAgaW50IGNyaXQsIGludCBsYXN0cG9zKTsKK1g1MDlfRVhURU5TSU9OICpYNTA5djNfZ2V0X2V4dChjb25zdCBTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKngsIGludCBsb2MpOworWDUwOV9FWFRFTlNJT04gKlg1MDl2M19kZWxldGVfZXh0KFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqeCwgaW50IGxvYyk7CitTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKlg1MDl2M19hZGRfZXh0KFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqKngsCisJCQkJCSBYNTA5X0VYVEVOU0lPTiAqZXgsIGludCBsb2MpOworCitpbnQJCVg1MDlfZ2V0X2V4dF9jb3VudChYNTA5ICp4KTsKK2ludAkJWDUwOV9nZXRfZXh0X2J5X05JRChYNTA5ICp4LCBpbnQgbmlkLCBpbnQgbGFzdHBvcyk7CitpbnQJCVg1MDlfZ2V0X2V4dF9ieV9PQkooWDUwOSAqeCxBU04xX09CSkVDVCAqb2JqLGludCBsYXN0cG9zKTsKK2ludAkJWDUwOV9nZXRfZXh0X2J5X2NyaXRpY2FsKFg1MDkgKngsIGludCBjcml0LCBpbnQgbGFzdHBvcyk7CitYNTA5X0VYVEVOU0lPTiAqWDUwOV9nZXRfZXh0KFg1MDkgKngsIGludCBsb2MpOworWDUwOV9FWFRFTlNJT04gKlg1MDlfZGVsZXRlX2V4dChYNTA5ICp4LCBpbnQgbG9jKTsKK2ludAkJWDUwOV9hZGRfZXh0KFg1MDkgKngsIFg1MDlfRVhURU5TSU9OICpleCwgaW50IGxvYyk7Cit2b2lkCSoJWDUwOV9nZXRfZXh0X2QyaShYNTA5ICp4LCBpbnQgbmlkLCBpbnQgKmNyaXQsIGludCAqaWR4KTsKK2ludAkJWDUwOV9hZGQxX2V4dF9pMmQoWDUwOSAqeCwgaW50IG5pZCwgdm9pZCAqdmFsdWUsIGludCBjcml0LAorCQkJCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCitpbnQJCVg1MDlfQ1JMX2dldF9leHRfY291bnQoWDUwOV9DUkwgKngpOworaW50CQlYNTA5X0NSTF9nZXRfZXh0X2J5X05JRChYNTA5X0NSTCAqeCwgaW50IG5pZCwgaW50IGxhc3Rwb3MpOworaW50CQlYNTA5X0NSTF9nZXRfZXh0X2J5X09CSihYNTA5X0NSTCAqeCxBU04xX09CSkVDVCAqb2JqLGludCBsYXN0cG9zKTsKK2ludAkJWDUwOV9DUkxfZ2V0X2V4dF9ieV9jcml0aWNhbChYNTA5X0NSTCAqeCwgaW50IGNyaXQsIGludCBsYXN0cG9zKTsKK1g1MDlfRVhURU5TSU9OICpYNTA5X0NSTF9nZXRfZXh0KFg1MDlfQ1JMICp4LCBpbnQgbG9jKTsKK1g1MDlfRVhURU5TSU9OICpYNTA5X0NSTF9kZWxldGVfZXh0KFg1MDlfQ1JMICp4LCBpbnQgbG9jKTsKK2ludAkJWDUwOV9DUkxfYWRkX2V4dChYNTA5X0NSTCAqeCwgWDUwOV9FWFRFTlNJT04gKmV4LCBpbnQgbG9jKTsKK3ZvaWQJKglYNTA5X0NSTF9nZXRfZXh0X2QyaShYNTA5X0NSTCAqeCwgaW50IG5pZCwgaW50ICpjcml0LCBpbnQgKmlkeCk7CitpbnQJCVg1MDlfQ1JMX2FkZDFfZXh0X2kyZChYNTA5X0NSTCAqeCwgaW50IG5pZCwgdm9pZCAqdmFsdWUsIGludCBjcml0LAorCQkJCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCitpbnQJCVg1MDlfUkVWT0tFRF9nZXRfZXh0X2NvdW50KFg1MDlfUkVWT0tFRCAqeCk7CitpbnQJCVg1MDlfUkVWT0tFRF9nZXRfZXh0X2J5X05JRChYNTA5X1JFVk9LRUQgKngsIGludCBuaWQsIGludCBsYXN0cG9zKTsKK2ludAkJWDUwOV9SRVZPS0VEX2dldF9leHRfYnlfT0JKKFg1MDlfUkVWT0tFRCAqeCxBU04xX09CSkVDVCAqb2JqLGludCBsYXN0cG9zKTsKK2ludAkJWDUwOV9SRVZPS0VEX2dldF9leHRfYnlfY3JpdGljYWwoWDUwOV9SRVZPS0VEICp4LCBpbnQgY3JpdCwgaW50IGxhc3Rwb3MpOworWDUwOV9FWFRFTlNJT04gKlg1MDlfUkVWT0tFRF9nZXRfZXh0KFg1MDlfUkVWT0tFRCAqeCwgaW50IGxvYyk7CitYNTA5X0VYVEVOU0lPTiAqWDUwOV9SRVZPS0VEX2RlbGV0ZV9leHQoWDUwOV9SRVZPS0VEICp4LCBpbnQgbG9jKTsKK2ludAkJWDUwOV9SRVZPS0VEX2FkZF9leHQoWDUwOV9SRVZPS0VEICp4LCBYNTA5X0VYVEVOU0lPTiAqZXgsIGludCBsb2MpOwordm9pZAkqCVg1MDlfUkVWT0tFRF9nZXRfZXh0X2QyaShYNTA5X1JFVk9LRUQgKngsIGludCBuaWQsIGludCAqY3JpdCwgaW50ICppZHgpOworaW50CQlYNTA5X1JFVk9LRURfYWRkMV9leHRfaTJkKFg1MDlfUkVWT0tFRCAqeCwgaW50IG5pZCwgdm9pZCAqdmFsdWUsIGludCBjcml0LAorCQkJCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCitYNTA5X0VYVEVOU0lPTiAqWDUwOV9FWFRFTlNJT05fY3JlYXRlX2J5X05JRChYNTA5X0VYVEVOU0lPTiAqKmV4LAorCQkJaW50IG5pZCwgaW50IGNyaXQsIEFTTjFfT0NURVRfU1RSSU5HICpkYXRhKTsKK1g1MDlfRVhURU5TSU9OICpYNTA5X0VYVEVOU0lPTl9jcmVhdGVfYnlfT0JKKFg1MDlfRVhURU5TSU9OICoqZXgsCisJCQljb25zdCBBU04xX09CSkVDVCAqb2JqLGludCBjcml0LEFTTjFfT0NURVRfU1RSSU5HICpkYXRhKTsKK2ludAkJWDUwOV9FWFRFTlNJT05fc2V0X29iamVjdChYNTA5X0VYVEVOU0lPTiAqZXgsY29uc3QgQVNOMV9PQkpFQ1QgKm9iaik7CitpbnQJCVg1MDlfRVhURU5TSU9OX3NldF9jcml0aWNhbChYNTA5X0VYVEVOU0lPTiAqZXgsIGludCBjcml0KTsKK2ludAkJWDUwOV9FWFRFTlNJT05fc2V0X2RhdGEoWDUwOV9FWFRFTlNJT04gKmV4LAorCQkJQVNOMV9PQ1RFVF9TVFJJTkcgKmRhdGEpOworQVNOMV9PQkpFQ1QgKglYNTA5X0VYVEVOU0lPTl9nZXRfb2JqZWN0KFg1MDlfRVhURU5TSU9OICpleCk7CitBU04xX09DVEVUX1NUUklORyAqWDUwOV9FWFRFTlNJT05fZ2V0X2RhdGEoWDUwOV9FWFRFTlNJT04gKm5lKTsKK2ludAkJWDUwOV9FWFRFTlNJT05fZ2V0X2NyaXRpY2FsKFg1MDlfRVhURU5TSU9OICpleCk7CisKK2ludCBYNTA5YXRfZ2V0X2F0dHJfY291bnQoY29uc3QgU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICp4KTsKK2ludCBYNTA5YXRfZ2V0X2F0dHJfYnlfTklEKGNvbnN0IFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqeCwgaW50IG5pZCwKKwkJCSAgaW50IGxhc3Rwb3MpOworaW50IFg1MDlhdF9nZXRfYXR0cl9ieV9PQkooY29uc3QgU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICpzaywgY29uc3QgQVNOMV9PQkpFQ1QgKm9iaiwKKwkJCSAgaW50IGxhc3Rwb3MpOworWDUwOV9BVFRSSUJVVEUgKlg1MDlhdF9nZXRfYXR0cihjb25zdCBTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKngsIGludCBsb2MpOworWDUwOV9BVFRSSUJVVEUgKlg1MDlhdF9kZWxldGVfYXR0cihTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKngsIGludCBsb2MpOworU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICpYNTA5YXRfYWRkMV9hdHRyKFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqKngsCisJCQkJCSBYNTA5X0FUVFJJQlVURSAqYXR0cik7CitTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKlg1MDlhdF9hZGQxX2F0dHJfYnlfT0JKKFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqKngsCisJCQljb25zdCBBU04xX09CSkVDVCAqb2JqLCBpbnQgdHlwZSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzLCBpbnQgbGVuKTsKK1NUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqWDUwOWF0X2FkZDFfYXR0cl9ieV9OSUQoU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICoqeCwKKwkJCWludCBuaWQsIGludCB0eXBlLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMsIGludCBsZW4pOworU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICpYNTA5YXRfYWRkMV9hdHRyX2J5X3R4dChTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKip4LAorCQkJY29uc3QgY2hhciAqYXR0cm5hbWUsIGludCB0eXBlLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMsIGludCBsZW4pOwordm9pZCAqWDUwOWF0X2dldDBfZGF0YV9ieV9PQkooU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICp4LAorCQkJCUFTTjFfT0JKRUNUICpvYmosIGludCBsYXN0cG9zLCBpbnQgdHlwZSk7CitYNTA5X0FUVFJJQlVURSAqWDUwOV9BVFRSSUJVVEVfY3JlYXRlX2J5X05JRChYNTA5X0FUVFJJQlVURSAqKmF0dHIsIGludCBuaWQsCisJICAgICBpbnQgYXRydHlwZSwgY29uc3Qgdm9pZCAqZGF0YSwgaW50IGxlbik7CitYNTA5X0FUVFJJQlVURSAqWDUwOV9BVFRSSUJVVEVfY3JlYXRlX2J5X09CSihYNTA5X0FUVFJJQlVURSAqKmF0dHIsCisJICAgICBjb25zdCBBU04xX09CSkVDVCAqb2JqLCBpbnQgYXRydHlwZSwgY29uc3Qgdm9pZCAqZGF0YSwgaW50IGxlbik7CitYNTA5X0FUVFJJQlVURSAqWDUwOV9BVFRSSUJVVEVfY3JlYXRlX2J5X3R4dChYNTA5X0FUVFJJQlVURSAqKmF0dHIsCisJCWNvbnN0IGNoYXIgKmF0cm5hbWUsIGludCB0eXBlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcywgaW50IGxlbik7CitpbnQgWDUwOV9BVFRSSUJVVEVfc2V0MV9vYmplY3QoWDUwOV9BVFRSSUJVVEUgKmF0dHIsIGNvbnN0IEFTTjFfT0JKRUNUICpvYmopOworaW50IFg1MDlfQVRUUklCVVRFX3NldDFfZGF0YShYNTA5X0FUVFJJQlVURSAqYXR0ciwgaW50IGF0dHJ0eXBlLCBjb25zdCB2b2lkICpkYXRhLCBpbnQgbGVuKTsKK3ZvaWQgKlg1MDlfQVRUUklCVVRFX2dldDBfZGF0YShYNTA5X0FUVFJJQlVURSAqYXR0ciwgaW50IGlkeCwKKwkJCQkJaW50IGF0cnR5cGUsIHZvaWQgKmRhdGEpOworaW50IFg1MDlfQVRUUklCVVRFX2NvdW50KFg1MDlfQVRUUklCVVRFICphdHRyKTsKK0FTTjFfT0JKRUNUICpYNTA5X0FUVFJJQlVURV9nZXQwX29iamVjdChYNTA5X0FUVFJJQlVURSAqYXR0cik7CitBU04xX1RZUEUgKlg1MDlfQVRUUklCVVRFX2dldDBfdHlwZShYNTA5X0FUVFJJQlVURSAqYXR0ciwgaW50IGlkeCk7CisKK2ludCBFVlBfUEtFWV9nZXRfYXR0cl9jb3VudChjb25zdCBFVlBfUEtFWSAqa2V5KTsKK2ludCBFVlBfUEtFWV9nZXRfYXR0cl9ieV9OSUQoY29uc3QgRVZQX1BLRVkgKmtleSwgaW50IG5pZCwKKwkJCSAgaW50IGxhc3Rwb3MpOworaW50IEVWUF9QS0VZX2dldF9hdHRyX2J5X09CSihjb25zdCBFVlBfUEtFWSAqa2V5LCBBU04xX09CSkVDVCAqb2JqLAorCQkJICBpbnQgbGFzdHBvcyk7CitYNTA5X0FUVFJJQlVURSAqRVZQX1BLRVlfZ2V0X2F0dHIoY29uc3QgRVZQX1BLRVkgKmtleSwgaW50IGxvYyk7CitYNTA5X0FUVFJJQlVURSAqRVZQX1BLRVlfZGVsZXRlX2F0dHIoRVZQX1BLRVkgKmtleSwgaW50IGxvYyk7CitpbnQgRVZQX1BLRVlfYWRkMV9hdHRyKEVWUF9QS0VZICprZXksIFg1MDlfQVRUUklCVVRFICphdHRyKTsKK2ludCBFVlBfUEtFWV9hZGQxX2F0dHJfYnlfT0JKKEVWUF9QS0VZICprZXksCisJCQljb25zdCBBU04xX09CSkVDVCAqb2JqLCBpbnQgdHlwZSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzLCBpbnQgbGVuKTsKK2ludCBFVlBfUEtFWV9hZGQxX2F0dHJfYnlfTklEKEVWUF9QS0VZICprZXksCisJCQlpbnQgbmlkLCBpbnQgdHlwZSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzLCBpbnQgbGVuKTsKK2ludCBFVlBfUEtFWV9hZGQxX2F0dHJfYnlfdHh0KEVWUF9QS0VZICprZXksCisJCQljb25zdCBjaGFyICphdHRybmFtZSwgaW50IHR5cGUsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcywgaW50IGxlbik7CisKK2ludAkJWDUwOV92ZXJpZnlfY2VydChYNTA5X1NUT1JFX0NUWCAqY3R4KTsKKworLyogbG9va3VwIGEgY2VydCBmcm9tIGEgWDUwOSBTVEFDSyAqLworWDUwOSAqWDUwOV9maW5kX2J5X2lzc3Vlcl9hbmRfc2VyaWFsKFNUQUNLX09GKFg1MDkpICpzayxYNTA5X05BTUUgKm5hbWUsCisJCQkJICAgICBBU04xX0lOVEVHRVIgKnNlcmlhbCk7CitYNTA5ICpYNTA5X2ZpbmRfYnlfc3ViamVjdChTVEFDS19PRihYNTA5KSAqc2ssWDUwOV9OQU1FICpuYW1lKTsKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhQQkVQQVJBTSkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoUEJFMlBBUkFNKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhQQktERjJQQVJBTSkKKworaW50IFBLQ1M1X3BiZV9zZXQwX2FsZ29yKFg1MDlfQUxHT1IgKmFsZ29yLCBpbnQgYWxnLCBpbnQgaXRlciwKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpzYWx0LCBpbnQgc2FsdGxlbik7CisKK1g1MDlfQUxHT1IgKlBLQ1M1X3BiZV9zZXQoaW50IGFsZywgaW50IGl0ZXIsCisJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqc2FsdCwgaW50IHNhbHRsZW4pOworWDUwOV9BTEdPUiAqUEtDUzVfcGJlMl9zZXQoY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyLCBpbnQgaXRlciwKKwkJCQkJIHVuc2lnbmVkIGNoYXIgKnNhbHQsIGludCBzYWx0bGVuKTsKK1g1MDlfQUxHT1IgKlBLQ1M1X3BiZTJfc2V0X2l2KGNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlciwgaW50IGl0ZXIsCisJCQkJIHVuc2lnbmVkIGNoYXIgKnNhbHQsIGludCBzYWx0bGVuLAorCQkJCSB1bnNpZ25lZCBjaGFyICphaXYsIGludCBwcmZfbmlkKTsKKworWDUwOV9BTEdPUiAqUEtDUzVfcGJrZGYyX3NldChpbnQgaXRlciwgdW5zaWduZWQgY2hhciAqc2FsdCwgaW50IHNhbHRsZW4sCisJCQkJaW50IHByZl9uaWQsIGludCBrZXlsZW4pOworCisvKiBQS0NTIzggdXRpbGl0aWVzICovCisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoUEtDUzhfUFJJVl9LRVlfSU5GTykKKworRVZQX1BLRVkgKkVWUF9QS0NTODJQS0VZKFBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4KTsKK1BLQ1M4X1BSSVZfS0VZX0lORk8gKkVWUF9QS0VZMlBLQ1M4KEVWUF9QS0VZICpwa2V5KTsKK1BLQ1M4X1BSSVZfS0VZX0lORk8gKkVWUF9QS0VZMlBLQ1M4X2Jyb2tlbihFVlBfUEtFWSAqcGtleSwgaW50IGJyb2tlbik7CitQS0NTOF9QUklWX0tFWV9JTkZPICpQS0NTOF9zZXRfYnJva2VuKFBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4LCBpbnQgYnJva2VuKTsKKworaW50IFBLQ1M4X3BrZXlfc2V0MChQS0NTOF9QUklWX0tFWV9JTkZPICpwcml2LCBBU04xX09CSkVDVCAqYW9iaiwKKwkJCWludCB2ZXJzaW9uLCBpbnQgcHR5cGUsIHZvaWQgKnB2YWwsCisJCQkJdW5zaWduZWQgY2hhciAqcGVuYywgaW50IHBlbmNsZW4pOworaW50IFBLQ1M4X3BrZXlfZ2V0MChBU04xX09CSkVDVCAqKnBwa2FsZywKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqKnBrLCBpbnQgKnBwa2xlbiwKKwkJWDUwOV9BTEdPUiAqKnBhLAorCQlQS0NTOF9QUklWX0tFWV9JTkZPICpwOCk7CisKK2ludCBYNTA5X1BVQktFWV9zZXQwX3BhcmFtKFg1MDlfUFVCS0VZICpwdWIsIGNvbnN0IEFTTjFfT0JKRUNUICphb2JqLAorCQkJCQlpbnQgcHR5cGUsIHZvaWQgKnB2YWwsCisJCQkJCXVuc2lnbmVkIGNoYXIgKnBlbmMsIGludCBwZW5jbGVuKTsKK2ludCBYNTA5X1BVQktFWV9nZXQwX3BhcmFtKEFTTjFfT0JKRUNUICoqcHBrYWxnLAorCQljb25zdCB1bnNpZ25lZCBjaGFyICoqcGssIGludCAqcHBrbGVuLAorCQlYNTA5X0FMR09SICoqcGEsCisJCVg1MDlfUFVCS0VZICpwdWIpOworCitpbnQgWDUwOV9jaGVja190cnVzdChYNTA5ICp4LCBpbnQgaWQsIGludCBmbGFncyk7CitpbnQgWDUwOV9UUlVTVF9nZXRfY291bnQodm9pZCk7CitYNTA5X1RSVVNUICogWDUwOV9UUlVTVF9nZXQwKGludCBpZHgpOworaW50IFg1MDlfVFJVU1RfZ2V0X2J5X2lkKGludCBpZCk7CitpbnQgWDUwOV9UUlVTVF9hZGQoaW50IGlkLCBpbnQgZmxhZ3MsIGludCAoKmNrKShYNTA5X1RSVVNUICosIFg1MDkgKiwgaW50KSwKKwkJCQkJY2hhciAqbmFtZSwgaW50IGFyZzEsIHZvaWQgKmFyZzIpOwordm9pZCBYNTA5X1RSVVNUX2NsZWFudXAodm9pZCk7CitpbnQgWDUwOV9UUlVTVF9nZXRfZmxhZ3MoWDUwOV9UUlVTVCAqeHApOworY2hhciAqWDUwOV9UUlVTVF9nZXQwX25hbWUoWDUwOV9UUlVTVCAqeHApOworaW50IFg1MDlfVFJVU1RfZ2V0X3RydXN0KFg1MDlfVFJVU1QgKnhwKTsKKworLyogUEtDUzdfZ2V0X2NlcnRpZmljYXRlcyBwYXJzZXMgYSBQS0NTIzcsIFNpZ25lZERhdGEgc3RydWN0dXJlIGZyb20gfGNic3wgYW5kCisgKiBhcHBlbmRzIHRoZSBpbmNsdWRlZCBjZXJ0aWZpY2F0ZXMgdG8gfG91dF9jZXJ0c3wuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MKKyAqIGFuZCB6ZXJvIG9uIGVycm9yLiAqLworaW50IFBLQ1M3X2dldF9jZXJ0aWZpY2F0ZXMoU1RBQ0tfT0YoWDUwOSkgKm91dF9jZXJ0cywgQ0JTICpjYnMpOworCisKKy8qIEVWUF9QSyB2YWx1ZXMgaW5kaWNhdGUgdGhlIGFsZ29yaXRobSBvZiB0aGUgcHVibGljIGtleSBpbiBhIGNlcnRpZmljYXRlLiAqLworCisjZGVmaW5lIEVWUF9QS19SU0EJMHgwMDAxCisjZGVmaW5lIEVWUF9QS19EU0EJMHgwMDAyCisjZGVmaW5lIEVWUF9QS19ESAkweDAwMDQKKyNkZWZpbmUgRVZQX1BLX0VDCTB4MDAwOAorCisvKiBFVlBfUEtTIHZhbHVlcyBpbmRpY2F0ZSB0aGUgYWxnb3JpdGhtIHVzZWQgdG8gc2lnbiBhIGNlcnRpZmljYXRlLiAqLworCisjZGVmaW5lIEVWUF9QS1NfUlNBIDB4MDEwMAorI2RlZmluZSBFVlBfUEtTX0RTQSAweDAyMDAKKyNkZWZpbmUgRVZQX1BLU19FQyAweDA0MDAKKworLyogRVZQX1BLVCB2YWx1ZXMgYXJlIGZsYWdzIHRoYXQgZGVmaW5lIHdoYXQgcHVibGljLWtleSBvcGVyYXRpb25zIGNhbiBiZQorICogcGVyZm9ybWVkIHdpdGggdGhlIHB1YmxpYyBrZXkgZnJvbSBhIGNlcnRpZmljYXRlLiAqLworCisvKiBFVlBfUEtUX1NJR04gaW5kaWNhdGVzIHRoYXQgdGhlIHB1YmxpYyBrZXkgY2FuIGJlIHVzZWQgZm9yIHNpZ25pbmcuICovCisjZGVmaW5lIEVWUF9QS1RfU0lHTiAweDAwMTAKKy8qIEVWUF9QS1RfRU5DIGluZGljYXRlcyB0aGF0IGEgc2Vzc2lvbiBrZXkgY2FuIGJlIGVuY3J5cHRlZCB0byB0aGUgcHVibGljCisgKiBrZXkuICovCisjZGVmaW5lIEVWUF9QS1RfRU5DIDB4MDAyMAorLyogRVZQX1BLVF9FWENIIGluZGljYXRlcyB0aGF0IGtleS1hZ3JlZW1lbnQgY2FuIGJlIHBlcmZvcm1lZC4gKi8KKyNkZWZpbmUgRVZQX1BLVF9FWENIIDB4MDA0MAorLyogRVZQX1BLVF9FWFAgaW5kaWNhdGVzIHRoYXQga2V5IGlzIHdlYWsgKGkuZS4gImV4cG9ydCIpLiAqLworI2RlZmluZSBFVlBfUEtUX0VYUCAweDEwMDAKKworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2RlZmluZSBYNTA5X0ZfeDUwOV9uYW1lX2V4X25ldyAxMDAKKyNkZWZpbmUgWDUwOV9GX1g1MDlfRVhURU5TSU9OX2NyZWF0ZV9ieV9OSUQgMTAxCisjZGVmaW5lIFg1MDlfRl9YNTA5X2xvYWRfY3JsX2ZpbGUgMTAyCisjZGVmaW5lIFg1MDlfRl9YNTA5X1RSVVNUX3NldCAxMDMKKyNkZWZpbmUgWDUwOV9GX1g1MDlfRVhURU5TSU9OX2NyZWF0ZV9ieV9PQkogMTA0CisjZGVmaW5lIFg1MDlfRl9ieV9maWxlX2N0cmwgMTA1CisjZGVmaW5lIFg1MDlfRl9YNTA5X2xvYWRfY2VydF9jcmxfZmlsZSAxMDYKKyNkZWZpbmUgWDUwOV9GX1g1MDlfQ1JMX2FkZDBfcmV2b2tlZCAxMDcKKyNkZWZpbmUgWDUwOV9GX2JpdHN0cl9jYiAxMDgKKyNkZWZpbmUgWDUwOV9GX1g1MDlfU1RPUkVfQ1RYX25ldyAxMDkKKyNkZWZpbmUgWDUwOV9GX1g1MDlfUkVRX3RvX1g1MDkgMTEwCisjZGVmaW5lIFg1MDlfRl9YNTA5djNfYWRkX2V4dCAxMTEKKyNkZWZpbmUgWDUwOV9GX0FTTjFfc2lnbiAxMTIKKyNkZWZpbmUgWDUwOV9GX2FzbjFfc3RyMnR5cGUgMTEzCisjZGVmaW5lIFg1MDlfRl9pMmRfUlNBX1BVQktFWSAxMTQKKyNkZWZpbmUgWDUwOV9GX0FTTjFfaXRlbV9zaWduX2N0eCAxMTUKKyNkZWZpbmUgWDUwOV9GX3g1MDlfbmFtZV9lbmNvZGUgMTE2CisjZGVmaW5lIFg1MDlfRl9kMmlfWDUwOV9QS0VZIDExNworI2RlZmluZSBYNTA5X0ZfQVNOMV9nZW5lcmF0ZV92MyAxMTgKKyNkZWZpbmUgWDUwOV9GX2Rpcl9jdHJsIDExOQorI2RlZmluZSBYNTA5X0ZfWDUwOV9wcmludF9leF9mcCAxMjAKKyNkZWZpbmUgWDUwOV9GX1g1MDlfQVRUUklCVVRFX2dldDBfZGF0YSAxMjEKKyNkZWZpbmUgWDUwOV9GX1g1MDlfTkFNRV9vbmVsaW5lIDEyMgorI2RlZmluZSBYNTA5X0ZfWDUwOV9DUkxfcHJpbnRfZnAgMTIzCisjZGVmaW5lIFg1MDlfRl9YNTA5X1NUT1JFX0NUWF9nZXQxX2lzc3VlciAxMjQKKyNkZWZpbmUgWDUwOV9GX2FkZF9jZXJ0X2RpciAxMjUKKyNkZWZpbmUgWDUwOV9GX1BLQ1M3X2dldF9jZXJ0aWZpY2F0ZXMgMTI2CisjZGVmaW5lIFg1MDlfRl9YNTA5X0FUVFJJQlVURV9jcmVhdGVfYnlfTklEIDEyNworI2RlZmluZSBYNTA5X0ZfWDUwOV9BVFRSSUJVVEVfc2V0MV9kYXRhIDEyOAorI2RlZmluZSBYNTA5X0ZfWDUwOV9TVE9SRV9DVFhfaW5pdCAxMjkKKyNkZWZpbmUgWDUwOV9GX05FVFNDQVBFX1NQS0lfYjY0X2RlY29kZSAxMzAKKyNkZWZpbmUgWDUwOV9GX1g1MDlfTkFNRV9wcmludCAxMzEKKyNkZWZpbmUgWDUwOV9GX3g1MDlfbmFtZV9leF9kMmkgMTMyCisjZGVmaW5lIFg1MDlfRl9YNTA5X1BLRVlfbmV3IDEzMworI2RlZmluZSBYNTA5X0ZfWDUwOV9TVE9SRV9hZGRfY2VydCAxMzQKKyNkZWZpbmUgWDUwOV9GX3BhcnNlX3RhZ2dpbmcgMTM1CisjZGVmaW5lIFg1MDlfRl9jaGVja19wb2xpY3kgMTM2CisjZGVmaW5lIFg1MDlfRl9BU04xX2RpZ2VzdCAxMzcKKyNkZWZpbmUgWDUwOV9GX1g1MDlfbG9hZF9jZXJ0X2ZpbGUgMTM4CisjZGVmaW5lIFg1MDlfRl9YNTA5X0FUVFJJQlVURV9jcmVhdGVfYnlfdHh0IDEzOQorI2RlZmluZSBYNTA5X0ZfWDUwOV9QVUJLRVlfc2V0IDE0MAorI2RlZmluZSBYNTA5X0ZfWDUwOV9QVUJLRVlfZ2V0IDE0MQorI2RlZmluZSBYNTA5X0ZfZ2V0X2NlcnRfYnlfc3ViamVjdCAxNDIKKyNkZWZpbmUgWDUwOV9GX1g1MDlfTkFNRV9hZGRfZW50cnkgMTQzCisjZGVmaW5lIFg1MDlfRl9YNTA5YXRfYWRkMV9hdHRyIDE0NAorI2RlZmluZSBYNTA5X0ZfWDUwOV9jaGVja19wcml2YXRlX2tleSAxNDUKKyNkZWZpbmUgWDUwOV9GX2FwcGVuZF9leHAgMTQ2CisjZGVmaW5lIFg1MDlfRl9pMmRfRUNfUFVCS0VZIDE0NworI2RlZmluZSBYNTA5X0ZfWDUwOV9JTkZPX25ldyAxNDgKKyNkZWZpbmUgWDUwOV9GX1g1MDlfU1RPUkVfQ1RYX3B1cnBvc2VfaW5oZXJpdCAxNDkKKyNkZWZpbmUgWDUwOV9GX05FVFNDQVBFX1NQS0lfYjY0X2VuY29kZSAxNTAKKyNkZWZpbmUgWDUwOV9GX1g1MDlfdG9fWDUwOV9SRVEgMTUxCisjZGVmaW5lIFg1MDlfRl9YNTA5X05BTUVfRU5UUllfY3JlYXRlX2J5X3R4dCAxNTIKKyNkZWZpbmUgWDUwOV9GX1g1MDlfTkFNRV9FTlRSWV9zZXRfb2JqZWN0IDE1MworI2RlZmluZSBYNTA5X0ZfYXNuMV9jYiAxNTQKKyNkZWZpbmUgWDUwOV9GX1g1MDlfdmVyaWZ5X2NlcnQgMTU1CisjZGVmaW5lIFg1MDlfRl9YNTA5X0NSTF9kaWZmIDE1NgorI2RlZmluZSBYNTA5X0ZfaTJkX1ByaXZhdGVLZXkgMTU3CisjZGVmaW5lIFg1MDlfRl9YNTA5X1JFUV9jaGVja19wcml2YXRlX2tleSAxNTgKKyNkZWZpbmUgWDUwOV9GX1g1MDlfU1RPUkVfYWRkX2NybCAxNTkKKyNkZWZpbmUgWDUwOV9GX1g1MDlfZ2V0X3B1YmtleV9wYXJhbWV0ZXJzIDE2MAorI2RlZmluZSBYNTA5X0ZfQVNOMV9pdGVtX3ZlcmlmeSAxNjEKKyNkZWZpbmUgWDUwOV9GX1g1MDlfQVRUUklCVVRFX2NyZWF0ZV9ieV9PQkogMTYyCisjZGVmaW5lIFg1MDlfRl9pMmRfRFNBX1BVQktFWSAxNjMKKyNkZWZpbmUgWDUwOV9GX1g1MDlfVFJVU1RfYWRkIDE2NAorI2RlZmluZSBYNTA5X0ZfWDUwOV9OQU1FX0VOVFJZX2NyZWF0ZV9ieV9OSUQgMTY1CisjZGVmaW5lIFg1MDlfUl9OT19DRVJUX1NFVF9GT1JfVVNfVE9fVkVSSUZZIDEwMAorI2RlZmluZSBYNTA5X1JfVU5BQkxFX1RPX0ZJTkRfUEFSQU1FVEVSU19JTl9DSEFJTiAxMDEKKyNkZWZpbmUgWDUwOV9SX01FVEhPRF9OT1RfU1VQUE9SVEVEIDEwMgorI2RlZmluZSBYNTA5X1JfVU5TVVBQT1JURURfQUxHT1JJVEhNIDEwMworI2RlZmluZSBYNTA5X1JfQ1JMX1ZFUklGWV9GQUlMVVJFIDEwNAorI2RlZmluZSBYNTA5X1JfQkFTRTY0X0RFQ09ERV9FUlJPUiAxMDUKKyNkZWZpbmUgWDUwOV9SX0lOVkFMSURfVFJVU1QgMTA2CisjZGVmaW5lIFg1MDlfUl9VTktOT1dOX05JRCAxMDcKKyNkZWZpbmUgWDUwOV9SX0lOVkFMSURfRElSRUNUT1JZIDEwOAorI2RlZmluZSBYNTA5X1JfS0VZX1ZBTFVFU19NSVNNQVRDSCAxMDkKKyNkZWZpbmUgWDUwOV9SX0NFUlRfQUxSRUFEWV9JTl9IQVNIX1RBQkxFIDExMAorI2RlZmluZSBYNTA5X1JfUFVCTElDX0tFWV9ERUNPREVfRVJST1IgMTExCisjZGVmaW5lIFg1MDlfUl9OT1RfUEtDUzdfU0lHTkVEX0RBVEEgMTEyCisjZGVmaW5lIFg1MDlfUl9QVUJMSUNfS0VZX0VOQ09ERV9FUlJPUiAxMTMKKyNkZWZpbmUgWDUwOV9SX0xPQURJTkdfQ0VSVF9ESVIgMTE0CisjZGVmaW5lIFg1MDlfUl9XUk9OR19UWVBFIDExNQorI2RlZmluZSBYNTA5X1JfVU5LTk9XTl9QVVJQT1NFX0lEIDExNgorI2RlZmluZSBYNTA5X1JfTkVXRVJfQ1JMX05PVF9ORVdFUiAxMTcKKyNkZWZpbmUgWDUwOV9SX1VOS05PV05fVFJVU1RfSUQgMTE4CisjZGVmaW5lIFg1MDlfUl9ESUdFU1RfQU5EX0tFWV9UWVBFX05PVF9TVVBQT1JURUQgMTE5CisjZGVmaW5lIFg1MDlfUl9LRVlfVFlQRV9NSVNNQVRDSCAxMjAKKyNkZWZpbmUgWDUwOV9SX1VOS05PV05fS0VZX1RZUEUgMTIxCisjZGVmaW5lIFg1MDlfUl9CQURfWDUwOV9GSUxFVFlQRSAxMjIKKyNkZWZpbmUgWDUwOV9SX0lTU1VFUl9NSVNNQVRDSCAxMjMKKyNkZWZpbmUgWDUwOV9SX1VOQUJMRV9UT19HRVRfQ0VSVFNfUFVCTElDX0tFWSAxMjQKKyNkZWZpbmUgWDUwOV9SX1dST05HX0xPT0tVUF9UWVBFIDEyNQorI2RlZmluZSBYNTA5X1JfQ09OVEVYVF9OT1RfSU5JVElBTElTRUQgMTI2CisjZGVmaW5lIFg1MDlfUl9DQU5UX0NIRUNLX0RIX0tFWSAxMjcKKyNkZWZpbmUgWDUwOV9SX05PX0NFUlRJRklDQVRFU19JTkNMVURFRCAxMjgKKyNkZWZpbmUgWDUwOV9SX0lOVkFMSURfRklFTERfTkFNRSAxMjkKKyNkZWZpbmUgWDUwOV9SX1NIT1VMRF9SRVRSWSAxMzAKKyNkZWZpbmUgWDUwOV9SX05PX0NSTF9OVU1CRVIgMTMxCisjZGVmaW5lIFg1MDlfUl9JRFBfTUlTTUFUQ0ggMTMyCisjZGVmaW5lIFg1MDlfUl9MT0FESU5HX0RFRkFVTFRTIDEzMworI2RlZmluZSBYNTA5X1JfQkFEX1BLQ1M3X1ZFUlNJT04gMTM0CisjZGVmaW5lIFg1MDlfUl9DUkxfQUxSRUFEWV9ERUxUQSAxMzUKKyNkZWZpbmUgWDUwOV9SX0VSUl9BU04xX0xJQiAxMzYKKyNkZWZpbmUgWDUwOV9SX0FLSURfTUlTTUFUQ0ggMTM3CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3J5cHRvL3g1MDkveDUwOV9hdHQuYyBiL2NyeXB0by94NTA5L3g1MDlfYXR0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYxM2MzNQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94NTA5L3g1MDlfYXR0LmMKQEAgLTAsMCArMSwzNTMgQEAKKy8qIGNyeXB0by94NTA5L3g1MDlfYXR0LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3N0YWNrLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKKworaW50IFg1MDlhdF9nZXRfYXR0cl9jb3VudChjb25zdCBTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKngpCit7CisJcmV0dXJuIHNrX1g1MDlfQVRUUklCVVRFX251bSh4KTsKK30KKworaW50IFg1MDlhdF9nZXRfYXR0cl9ieV9OSUQoY29uc3QgU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICp4LCBpbnQgbmlkLAorCQkJICBpbnQgbGFzdHBvcykKK3sKKwljb25zdCBBU04xX09CSkVDVCAqb2JqOworCisJb2JqPU9CSl9uaWQyb2JqKG5pZCk7CisJaWYgKG9iaiA9PSBOVUxMKSByZXR1cm4oLTIpOworCXJldHVybihYNTA5YXRfZ2V0X2F0dHJfYnlfT0JKKHgsb2JqLGxhc3Rwb3MpKTsKK30KKworaW50IFg1MDlhdF9nZXRfYXR0cl9ieV9PQkooY29uc3QgU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICpzaywgY29uc3QgQVNOMV9PQkpFQ1QgKm9iaiwKKwkJCSAgaW50IGxhc3Rwb3MpCit7CisJaW50IG47CisJWDUwOV9BVFRSSUJVVEUgKmV4OworCisJaWYgKHNrID09IE5VTEwpIHJldHVybigtMSk7CisJbGFzdHBvcysrOworCWlmIChsYXN0cG9zIDwgMCkKKwkJbGFzdHBvcz0wOworCW49c2tfWDUwOV9BVFRSSUJVVEVfbnVtKHNrKTsKKwlmb3IgKCA7IGxhc3Rwb3MgPCBuOyBsYXN0cG9zKyspCisJCXsKKwkJZXg9c2tfWDUwOV9BVFRSSUJVVEVfdmFsdWUoc2ssbGFzdHBvcyk7CisJCWlmIChPQkpfY21wKGV4LT5vYmplY3Qsb2JqKSA9PSAwKQorCQkJcmV0dXJuKGxhc3Rwb3MpOworCQl9CisJcmV0dXJuKC0xKTsKK30KKworWDUwOV9BVFRSSUJVVEUgKlg1MDlhdF9nZXRfYXR0cihjb25zdCBTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKngsIGludCBsb2MpCit7CisJaWYgKHggPT0gTlVMTCB8fCBsb2MgPCAwIHx8IHNrX1g1MDlfQVRUUklCVVRFX251bSh4KSA8PSAoc2l6ZV90KSBsb2MpCisJCXJldHVybiBOVUxMOworCWVsc2UKKwkJcmV0dXJuIHNrX1g1MDlfQVRUUklCVVRFX3ZhbHVlKHgsbG9jKTsKK30KKworWDUwOV9BVFRSSUJVVEUgKlg1MDlhdF9kZWxldGVfYXR0cihTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKngsIGludCBsb2MpCit7CisJWDUwOV9BVFRSSUJVVEUgKnJldDsKKworCWlmICh4ID09IE5VTEwgfHwgbG9jIDwgMCB8fCBza19YNTA5X0FUVFJJQlVURV9udW0oeCkgPD0gKHNpemVfdCkgbG9jKQorCQlyZXR1cm4oTlVMTCk7CisJcmV0PXNrX1g1MDlfQVRUUklCVVRFX2RlbGV0ZSh4LGxvYyk7CisJcmV0dXJuKHJldCk7Cit9CisKK1NUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqWDUwOWF0X2FkZDFfYXR0cihTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKip4LAorCQkJCQkgWDUwOV9BVFRSSUJVVEUgKmF0dHIpCit7CisJWDUwOV9BVFRSSUJVVEUgKm5ld19hdHRyPU5VTEw7CisJU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICpzaz1OVUxMOworCisJaWYgKHggPT0gTlVMTCkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5YXRfYWRkMV9hdHRyLCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlnb3RvIGVycjI7CisJCX0gCisKKwlpZiAoKnggPT0gTlVMTCkKKwkJeworCQlpZiAoKHNrPXNrX1g1MDlfQVRUUklCVVRFX25ld19udWxsKCkpID09IE5VTEwpCisJCQlnb3RvIGVycjsKKwkJfQorCWVsc2UKKwkJc2s9ICp4OworCisJaWYgKChuZXdfYXR0cj1YNTA5X0FUVFJJQlVURV9kdXAoYXR0cikpID09IE5VTEwpCisJCWdvdG8gZXJyMjsKKwlpZiAoIXNrX1g1MDlfQVRUUklCVVRFX3B1c2goc2ssbmV3X2F0dHIpKQorCQlnb3RvIGVycjsKKwlpZiAoKnggPT0gTlVMTCkKKwkJKng9c2s7CisJcmV0dXJuKHNrKTsKK2VycjoKKwlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5YXRfYWRkMV9hdHRyLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CitlcnIyOgorCWlmIChuZXdfYXR0ciAhPSBOVUxMKSBYNTA5X0FUVFJJQlVURV9mcmVlKG5ld19hdHRyKTsKKwlpZiAoc2sgIT0gTlVMTCkgc2tfWDUwOV9BVFRSSUJVVEVfZnJlZShzayk7CisJcmV0dXJuKE5VTEwpOworfQorCitTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKlg1MDlhdF9hZGQxX2F0dHJfYnlfT0JKKFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqKngsCisJCQljb25zdCBBU04xX09CSkVDVCAqb2JqLCBpbnQgdHlwZSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzLCBpbnQgbGVuKQoreworCVg1MDlfQVRUUklCVVRFICphdHRyOworCVNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqcmV0OworCWF0dHIgPSBYNTA5X0FUVFJJQlVURV9jcmVhdGVfYnlfT0JKKE5VTEwsIG9iaiwgdHlwZSwgYnl0ZXMsIGxlbik7CisJaWYoIWF0dHIpIHJldHVybiAwOworCXJldCA9IFg1MDlhdF9hZGQxX2F0dHIoeCwgYXR0cik7CisJWDUwOV9BVFRSSUJVVEVfZnJlZShhdHRyKTsKKwlyZXR1cm4gcmV0OworfQorCitTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKlg1MDlhdF9hZGQxX2F0dHJfYnlfTklEKFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqKngsCisJCQlpbnQgbmlkLCBpbnQgdHlwZSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzLCBpbnQgbGVuKQoreworCVg1MDlfQVRUUklCVVRFICphdHRyOworCVNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqcmV0OworCWF0dHIgPSBYNTA5X0FUVFJJQlVURV9jcmVhdGVfYnlfTklEKE5VTEwsIG5pZCwgdHlwZSwgYnl0ZXMsIGxlbik7CisJaWYoIWF0dHIpIHJldHVybiAwOworCXJldCA9IFg1MDlhdF9hZGQxX2F0dHIoeCwgYXR0cik7CisJWDUwOV9BVFRSSUJVVEVfZnJlZShhdHRyKTsKKwlyZXR1cm4gcmV0OworfQorCitTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKlg1MDlhdF9hZGQxX2F0dHJfYnlfdHh0KFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqKngsCisJCQljb25zdCBjaGFyICphdHRybmFtZSwgaW50IHR5cGUsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcywgaW50IGxlbikKK3sKKwlYNTA5X0FUVFJJQlVURSAqYXR0cjsKKwlTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKnJldDsKKwlhdHRyID0gWDUwOV9BVFRSSUJVVEVfY3JlYXRlX2J5X3R4dChOVUxMLCBhdHRybmFtZSwgdHlwZSwgYnl0ZXMsIGxlbik7CisJaWYoIWF0dHIpIHJldHVybiAwOworCXJldCA9IFg1MDlhdF9hZGQxX2F0dHIoeCwgYXR0cik7CisJWDUwOV9BVFRSSUJVVEVfZnJlZShhdHRyKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkICpYNTA5YXRfZ2V0MF9kYXRhX2J5X09CSihTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKngsCisJCQkJQVNOMV9PQkpFQ1QgKm9iaiwgaW50IGxhc3Rwb3MsIGludCB0eXBlKQoreworCWludCBpOworCVg1MDlfQVRUUklCVVRFICphdDsKKwlpID0gWDUwOWF0X2dldF9hdHRyX2J5X09CSih4LCBvYmosIGxhc3Rwb3MpOworCWlmIChpID09IC0xKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoKGxhc3Rwb3MgPD0gLTIpICYmIChYNTA5YXRfZ2V0X2F0dHJfYnlfT0JKKHgsIG9iaiwgaSkgIT0gLTEpKQorCQlyZXR1cm4gTlVMTDsKKwlhdCA9IFg1MDlhdF9nZXRfYXR0cih4LCBpKTsKKwlpZiAobGFzdHBvcyA8PSAtMyAmJiAoWDUwOV9BVFRSSUJVVEVfY291bnQoYXQpICE9IDEpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gWDUwOV9BVFRSSUJVVEVfZ2V0MF9kYXRhKGF0LCAwLCB0eXBlLCBOVUxMKTsKK30KKworWDUwOV9BVFRSSUJVVEUgKlg1MDlfQVRUUklCVVRFX2NyZWF0ZV9ieV9OSUQoWDUwOV9BVFRSSUJVVEUgKiphdHRyLCBpbnQgbmlkLAorCSAgICAgaW50IGF0cnR5cGUsIGNvbnN0IHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJY29uc3QgQVNOMV9PQkpFQ1QgKm9iajsKKworCW9iaj1PQkpfbmlkMm9iaihuaWQpOworCWlmIChvYmogPT0gTlVMTCkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X0FUVFJJQlVURV9jcmVhdGVfYnlfTklELCBYNTA5X1JfVU5LTk9XTl9OSUQpOworCQlyZXR1cm4oTlVMTCk7CisJCX0KKwlyZXR1cm4gWDUwOV9BVFRSSUJVVEVfY3JlYXRlX2J5X09CSihhdHRyLG9iaixhdHJ0eXBlLGRhdGEsbGVuKTsKK30KKworWDUwOV9BVFRSSUJVVEUgKlg1MDlfQVRUUklCVVRFX2NyZWF0ZV9ieV9PQkooWDUwOV9BVFRSSUJVVEUgKiphdHRyLAorCSAgICAgY29uc3QgQVNOMV9PQkpFQ1QgKm9iaiwgaW50IGF0cnR5cGUsIGNvbnN0IHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJWDUwOV9BVFRSSUJVVEUgKnJldDsKKworCWlmICgoYXR0ciA9PSBOVUxMKSB8fCAoKmF0dHIgPT0gTlVMTCkpCisJCXsKKwkJaWYgKChyZXQ9WDUwOV9BVFRSSUJVVEVfbmV3KCkpID09IE5VTEwpCisJCQl7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X0FUVFJJQlVURV9jcmVhdGVfYnlfT0JKLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlyZXR1cm4oTlVMTCk7CisJCQl9CisJCX0KKwllbHNlCisJCXJldD0gKmF0dHI7CisKKwlpZiAoIVg1MDlfQVRUUklCVVRFX3NldDFfb2JqZWN0KHJldCxvYmopKQorCQlnb3RvIGVycjsKKwlpZiAoIVg1MDlfQVRUUklCVVRFX3NldDFfZGF0YShyZXQsYXRydHlwZSxkYXRhLGxlbikpCisJCWdvdG8gZXJyOworCisJaWYgKChhdHRyICE9IE5VTEwpICYmICgqYXR0ciA9PSBOVUxMKSkgKmF0dHI9cmV0OworCXJldHVybihyZXQpOworZXJyOgorCWlmICgoYXR0ciA9PSBOVUxMKSB8fCAocmV0ICE9ICphdHRyKSkKKwkJWDUwOV9BVFRSSUJVVEVfZnJlZShyZXQpOworCXJldHVybihOVUxMKTsKK30KKworWDUwOV9BVFRSSUJVVEUgKlg1MDlfQVRUUklCVVRFX2NyZWF0ZV9ieV90eHQoWDUwOV9BVFRSSUJVVEUgKiphdHRyLAorCQljb25zdCBjaGFyICphdHJuYW1lLCBpbnQgdHlwZSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMsIGludCBsZW4pCisJeworCUFTTjFfT0JKRUNUICpvYmo7CisJWDUwOV9BVFRSSUJVVEUgKm5hdHRyOworCisJb2JqPU9CSl90eHQyb2JqKGF0cm5hbWUsIDApOworCWlmIChvYmogPT0gTlVMTCkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X0FUVFJJQlVURV9jcmVhdGVfYnlfdHh0LCBYNTA5X1JfSU5WQUxJRF9GSUVMRF9OQU1FKTsKKwkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJuYW1lPSIsIGF0cm5hbWUpOworCQlyZXR1cm4oTlVMTCk7CisJCX0KKwluYXR0ciA9IFg1MDlfQVRUUklCVVRFX2NyZWF0ZV9ieV9PQkooYXR0cixvYmosdHlwZSxieXRlcyxsZW4pOworCUFTTjFfT0JKRUNUX2ZyZWUob2JqKTsKKwlyZXR1cm4gbmF0dHI7CisJfQorCitpbnQgWDUwOV9BVFRSSUJVVEVfc2V0MV9vYmplY3QoWDUwOV9BVFRSSUJVVEUgKmF0dHIsIGNvbnN0IEFTTjFfT0JKRUNUICpvYmopCit7CisJaWYgKChhdHRyID09IE5VTEwpIHx8IChvYmogPT0gTlVMTCkpCisJCXJldHVybigwKTsKKwlBU04xX09CSkVDVF9mcmVlKGF0dHItPm9iamVjdCk7CisJYXR0ci0+b2JqZWN0PU9CSl9kdXAob2JqKTsKKwlyZXR1cm4oMSk7Cit9CisKK2ludCBYNTA5X0FUVFJJQlVURV9zZXQxX2RhdGEoWDUwOV9BVFRSSUJVVEUgKmF0dHIsIGludCBhdHRydHlwZSwgY29uc3Qgdm9pZCAqZGF0YSwgaW50IGxlbikKK3sKKwlBU04xX1RZUEUgKnR0bXA7CisJQVNOMV9TVFJJTkcgKnN0bXAgPSBOVUxMOworCWludCBhdHlwZSA9IDA7CisJaWYgKCFhdHRyKSByZXR1cm4gMDsKKwlpZihhdHRydHlwZSAmIE1CU1RSSU5HX0ZMQUcpIHsKKwkJc3RtcCA9IEFTTjFfU1RSSU5HX3NldF9ieV9OSUQoTlVMTCwgZGF0YSwgbGVuLCBhdHRydHlwZSwKKwkJCQkJCU9CSl9vYmoybmlkKGF0dHItPm9iamVjdCkpOworCQlpZighc3RtcCkgeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9BVFRSSUJVVEVfc2V0MV9kYXRhLCBFUlJfUl9BU04xX0xJQik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlhdHlwZSA9IHN0bXAtPnR5cGU7CisJfSBlbHNlIGlmIChsZW4gIT0gLTEpeworCQlpZighKHN0bXAgPSBBU04xX1NUUklOR190eXBlX25ldyhhdHRydHlwZSkpKSBnb3RvIGVycjsKKwkJaWYoIUFTTjFfU1RSSU5HX3NldChzdG1wLCBkYXRhLCBsZW4pKSBnb3RvIGVycjsKKwkJYXR5cGUgPSBhdHRydHlwZTsKKwl9CisJaWYoIShhdHRyLT52YWx1ZS5zZXQgPSBza19BU04xX1RZUEVfbmV3X251bGwoKSkpIGdvdG8gZXJyOworCWF0dHItPnNpbmdsZSA9IDA7CisJLyogVGhpcyBpcyBhIGJpdCBuYXVnaHR5IGJlY2F1c2UgdGhlIGF0dHJpYnV0ZSBzaG91bGQgcmVhbGx5IGhhdmUKKwkgKiBhdCBsZWFzdCBvbmUgdmFsdWUgYnV0IHNvbWUgdHlwZXMgdXNlIGFuZCB6ZXJvIGxlbmd0aCBTRVQgYW5kCisJICogcmVxdWlyZSB0aGlzLgorCSAqLworCWlmIChhdHRydHlwZSA9PSAwKQorCQlyZXR1cm4gMTsKKwlpZighKHR0bXAgPSBBU04xX1RZUEVfbmV3KCkpKSBnb3RvIGVycjsKKwlpZiAoKGxlbiA9PSAtMSkgJiYgIShhdHRydHlwZSAmIE1CU1RSSU5HX0ZMQUcpKQorCQl7CisJCWlmICghQVNOMV9UWVBFX3NldDEodHRtcCwgYXR0cnR5cGUsIGRhdGEpKQorCQkJZ290byBlcnI7CisJCX0KKwllbHNlCisJCUFTTjFfVFlQRV9zZXQodHRtcCwgYXR5cGUsIHN0bXApOworCWlmKCFza19BU04xX1RZUEVfcHVzaChhdHRyLT52YWx1ZS5zZXQsIHR0bXApKSBnb3RvIGVycjsKKwlyZXR1cm4gMTsKKwllcnI6CisJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9BVFRSSUJVVEVfc2V0MV9kYXRhLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBYNTA5X0FUVFJJQlVURV9jb3VudChYNTA5X0FUVFJJQlVURSAqYXR0cikKK3sKKwlpZighYXR0ci0+c2luZ2xlKSByZXR1cm4gc2tfQVNOMV9UWVBFX251bShhdHRyLT52YWx1ZS5zZXQpOworCWlmKGF0dHItPnZhbHVlLnNpbmdsZSkgcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK0FTTjFfT0JKRUNUICpYNTA5X0FUVFJJQlVURV9nZXQwX29iamVjdChYNTA5X0FUVFJJQlVURSAqYXR0cikKK3sKKwlpZiAoYXR0ciA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CisJcmV0dXJuKGF0dHItPm9iamVjdCk7Cit9CisKK3ZvaWQgKlg1MDlfQVRUUklCVVRFX2dldDBfZGF0YShYNTA5X0FUVFJJQlVURSAqYXR0ciwgaW50IGlkeCwKKwkJCQkJaW50IGF0cnR5cGUsIHZvaWQgKmRhdGEpCit7CisJQVNOMV9UWVBFICp0dG1wOworCXR0bXAgPSBYNTA5X0FUVFJJQlVURV9nZXQwX3R5cGUoYXR0ciwgaWR4KTsKKwlpZighdHRtcCkgcmV0dXJuIE5VTEw7CisJaWYoYXRydHlwZSAhPSBBU04xX1RZUEVfZ2V0KHR0bXApKXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9BVFRSSUJVVEVfZ2V0MF9kYXRhLCBYNTA5X1JfV1JPTkdfVFlQRSk7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gdHRtcC0+dmFsdWUucHRyOworfQorCitBU04xX1RZUEUgKlg1MDlfQVRUUklCVVRFX2dldDBfdHlwZShYNTA5X0FUVFJJQlVURSAqYXR0ciwgaW50IGlkeCkKK3sKKwlpZiAoYXR0ciA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CisJaWYoaWR4ID49IFg1MDlfQVRUUklCVVRFX2NvdW50KGF0dHIpKSByZXR1cm4gTlVMTDsKKwlpZighYXR0ci0+c2luZ2xlKSByZXR1cm4gc2tfQVNOMV9UWVBFX3ZhbHVlKGF0dHItPnZhbHVlLnNldCwgaWR4KTsKKwllbHNlIHJldHVybiBhdHRyLT52YWx1ZS5zaW5nbGU7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOS94NTA5X2NtcC5jIGIvY3J5cHRvL3g1MDkveDUwOV9jbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjI2ZmNmCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3g1MDkveDUwOV9jbXAuYwpAQCAtMCwwICsxLDUxNSBAQAorLyogY3J5cHRvL3g1MDkveDUwOV9jbXAuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYnVmLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9kaWdlc3QuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3N0YWNrLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworCitpbnQgWDUwOV9pc3N1ZXJfYW5kX3NlcmlhbF9jbXAoY29uc3QgWDUwOSAqYSwgY29uc3QgWDUwOSAqYikKKwl7CisJaW50IGk7CisJWDUwOV9DSU5GICphaSwqYmk7CisKKwlhaT1hLT5jZXJ0X2luZm87CisJYmk9Yi0+Y2VydF9pbmZvOworCWk9TV9BU04xX0lOVEVHRVJfY21wKGFpLT5zZXJpYWxOdW1iZXIsYmktPnNlcmlhbE51bWJlcik7CisJaWYgKGkpIHJldHVybihpKTsKKwlyZXR1cm4oWDUwOV9OQU1FX2NtcChhaS0+aXNzdWVyLGJpLT5pc3N1ZXIpKTsKKwl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19NRDUKK3Vuc2lnbmVkIGxvbmcgWDUwOV9pc3N1ZXJfYW5kX3NlcmlhbF9oYXNoKFg1MDkgKmEpCisJeworCXVuc2lnbmVkIGxvbmcgcmV0PTA7CisJRVZQX01EX0NUWCBjdHg7CisJdW5zaWduZWQgY2hhciBtZFsxNl07CisJY2hhciAqZjsKKworCUVWUF9NRF9DVFhfaW5pdCgmY3R4KTsKKwlmPVg1MDlfTkFNRV9vbmVsaW5lKGEtPmNlcnRfaW5mby0+aXNzdWVyLE5VTEwsMCk7CisJaWYgKCFFVlBfRGlnZXN0SW5pdF9leCgmY3R4LCBFVlBfbWQ1KCksIE5VTEwpKQorCQlnb3RvIGVycjsKKwlpZiAoIUVWUF9EaWdlc3RVcGRhdGUoJmN0eCwodW5zaWduZWQgY2hhciAqKWYsc3RybGVuKGYpKSkKKwkJZ290byBlcnI7CisJT1BFTlNTTF9mcmVlKGYpOworCWlmKCFFVlBfRGlnZXN0VXBkYXRlKCZjdHgsKHVuc2lnbmVkIGNoYXIgKilhLT5jZXJ0X2luZm8tPnNlcmlhbE51bWJlci0+ZGF0YSwKKwkJKHVuc2lnbmVkIGxvbmcpYS0+Y2VydF9pbmZvLT5zZXJpYWxOdW1iZXItPmxlbmd0aCkpCisJCWdvdG8gZXJyOworCWlmICghRVZQX0RpZ2VzdEZpbmFsX2V4KCZjdHgsJihtZFswXSksTlVMTCkpCisJCWdvdG8gZXJyOworCXJldD0oCSgodW5zaWduZWQgbG9uZyltZFswXSAgICAgKXwoKHVuc2lnbmVkIGxvbmcpbWRbMV08PDhMKXwKKwkJKCh1bnNpZ25lZCBsb25nKW1kWzJdPDwxNkwpfCgodW5zaWduZWQgbG9uZyltZFszXTw8MjRMKQorCQkpJjB4ZmZmZmZmZmZMOworCWVycjoKKwlFVlBfTURfQ1RYX2NsZWFudXAoJmN0eCk7CisJcmV0dXJuKHJldCk7CisJfQorI2VuZGlmCisJCitpbnQgWDUwOV9pc3N1ZXJfbmFtZV9jbXAoY29uc3QgWDUwOSAqYSwgY29uc3QgWDUwOSAqYikKKwl7CisJcmV0dXJuKFg1MDlfTkFNRV9jbXAoYS0+Y2VydF9pbmZvLT5pc3N1ZXIsYi0+Y2VydF9pbmZvLT5pc3N1ZXIpKTsKKwl9CisKK2ludCBYNTA5X3N1YmplY3RfbmFtZV9jbXAoY29uc3QgWDUwOSAqYSwgY29uc3QgWDUwOSAqYikKKwl7CisJcmV0dXJuKFg1MDlfTkFNRV9jbXAoYS0+Y2VydF9pbmZvLT5zdWJqZWN0LGItPmNlcnRfaW5mby0+c3ViamVjdCkpOworCX0KKworaW50IFg1MDlfQ1JMX2NtcChjb25zdCBYNTA5X0NSTCAqYSwgY29uc3QgWDUwOV9DUkwgKmIpCisJeworCXJldHVybihYNTA5X05BTUVfY21wKGEtPmNybC0+aXNzdWVyLGItPmNybC0+aXNzdWVyKSk7CisJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fU0hBCitpbnQgWDUwOV9DUkxfbWF0Y2goY29uc3QgWDUwOV9DUkwgKmEsIGNvbnN0IFg1MDlfQ1JMICpiKQorCXsKKwlyZXR1cm4gbWVtY21wKGEtPnNoYTFfaGFzaCwgYi0+c2hhMV9oYXNoLCAyMCk7CisJfQorI2VuZGlmCisKK1g1MDlfTkFNRSAqWDUwOV9nZXRfaXNzdWVyX25hbWUoWDUwOSAqYSkKKwl7CisJcmV0dXJuKGEtPmNlcnRfaW5mby0+aXNzdWVyKTsKKwl9CisKK3Vuc2lnbmVkIGxvbmcgWDUwOV9pc3N1ZXJfbmFtZV9oYXNoKFg1MDkgKngpCisJeworCXJldHVybihYNTA5X05BTUVfaGFzaCh4LT5jZXJ0X2luZm8tPmlzc3VlcikpOworCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX01ENQordW5zaWduZWQgbG9uZyBYNTA5X2lzc3Vlcl9uYW1lX2hhc2hfb2xkKFg1MDkgKngpCisJeworCXJldHVybihYNTA5X05BTUVfaGFzaF9vbGQoeC0+Y2VydF9pbmZvLT5pc3N1ZXIpKTsKKwl9CisjZW5kaWYKKworWDUwOV9OQU1FICpYNTA5X2dldF9zdWJqZWN0X25hbWUoWDUwOSAqYSkKKwl7CisJcmV0dXJuKGEtPmNlcnRfaW5mby0+c3ViamVjdCk7CisJfQorCitBU04xX0lOVEVHRVIgKlg1MDlfZ2V0X3NlcmlhbE51bWJlcihYNTA5ICphKQorCXsKKwlyZXR1cm4oYS0+Y2VydF9pbmZvLT5zZXJpYWxOdW1iZXIpOworCX0KKwordW5zaWduZWQgbG9uZyBYNTA5X3N1YmplY3RfbmFtZV9oYXNoKFg1MDkgKngpCisJeworCXJldHVybihYNTA5X05BTUVfaGFzaCh4LT5jZXJ0X2luZm8tPnN1YmplY3QpKTsKKwl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19NRDUKK3Vuc2lnbmVkIGxvbmcgWDUwOV9zdWJqZWN0X25hbWVfaGFzaF9vbGQoWDUwOSAqeCkKKwl7CisJcmV0dXJuKFg1MDlfTkFNRV9oYXNoX29sZCh4LT5jZXJ0X2luZm8tPnN1YmplY3QpKTsKKwl9CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX1NIQQorLyogQ29tcGFyZSB0d28gY2VydGlmaWNhdGVzOiB0aGV5IG11c3QgYmUgaWRlbnRpY2FsIGZvcgorICogdGhpcyB0byB3b3JrLiBOQjogQWx0aG91Z2ggImNtcCIgb3BlcmF0aW9ucyBhcmUgZ2VuZXJhbGx5CisgKiBwcm90b3R5cGVkIHRvIHRha2UgImNvbnN0IiBhcmd1bWVudHMgKGVnLiBmb3IgdXNlIGluCisgKiBTVEFDS3MpLCB0aGUgd2F5IFg1MDkgaGFuZGxpbmcgaXMgLSB0aGVzZSBvcGVyYXRpb25zIG1heQorICogaW52b2x2ZSBlbnN1cmluZyB0aGUgaGFzaGVzIGFyZSB1cC10by1kYXRlIGFuZCBlbnN1cmluZworICogY2VydGFpbiBjZXJ0IGluZm9ybWF0aW9uIGlzIGNhY2hlZC4gU28gdGhpcyBpcyB0aGUgcG9pbnQKKyAqIHdoZXJlIHRoZSAiZGVwdGgtZmlyc3QiIGNvbnN0aWZpY2F0aW9uIHRyZWUgaGFzIHRvIGhhbHQKKyAqIHdpdGggYW4gZXZpbCBjYXN0LgorICovCitpbnQgWDUwOV9jbXAoY29uc3QgWDUwOSAqYSwgY29uc3QgWDUwOSAqYikKK3sKKwlpbnQgcnY7CisJLyogZW5zdXJlIGhhc2ggaXMgdmFsaWQgKi8KKwlYNTA5X2NoZWNrX3B1cnBvc2UoKFg1MDkgKilhLCAtMSwgMCk7CisJWDUwOV9jaGVja19wdXJwb3NlKChYNTA5ICopYiwgLTEsIDApOworCisJcnYgPSBtZW1jbXAoYS0+c2hhMV9oYXNoLCBiLT5zaGExX2hhc2gsIFNIQV9ESUdFU1RfTEVOR1RIKTsKKwlpZiAocnYpCisJCXJldHVybiBydjsKKwkvKiBDaGVjayBmb3IgbWF0Y2ggYWdhaW5zdCBzdG9yZWQgZW5jb2RpbmcgdG9vICovCisJaWYgKCFhLT5jZXJ0X2luZm8tPmVuYy5tb2RpZmllZCAmJiAhYi0+Y2VydF9pbmZvLT5lbmMubW9kaWZpZWQpCisJCXsKKwkJcnYgPSAoaW50KShhLT5jZXJ0X2luZm8tPmVuYy5sZW4gLSBiLT5jZXJ0X2luZm8tPmVuYy5sZW4pOworCQlpZiAocnYpCisJCQlyZXR1cm4gcnY7CisJCXJldHVybiBtZW1jbXAoYS0+Y2VydF9pbmZvLT5lbmMuZW5jLCBiLT5jZXJ0X2luZm8tPmVuYy5lbmMsCisJCQkJYS0+Y2VydF9pbmZvLT5lbmMubGVuKTsKKwkJfQorCXJldHVybiBydjsKK30KKyNlbmRpZgorCisKK2ludCBYNTA5X05BTUVfY21wKGNvbnN0IFg1MDlfTkFNRSAqYSwgY29uc3QgWDUwOV9OQU1FICpiKQorCXsKKwlpbnQgcmV0OworCisJLyogRW5zdXJlIGNhbm9uaWNhbCBlbmNvZGluZyBpcyBwcmVzZW50IGFuZCB1cCB0byBkYXRlICovCisKKwlpZiAoIWEtPmNhbm9uX2VuYyB8fCBhLT5tb2RpZmllZCkKKwkJeworCQlyZXQgPSBpMmRfWDUwOV9OQU1FKChYNTA5X05BTUUgKilhLCBOVUxMKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gLTI7CisJCX0KKworCWlmICghYi0+Y2Fub25fZW5jIHx8IGItPm1vZGlmaWVkKQorCQl7CisJCXJldCA9IGkyZF9YNTA5X05BTUUoKFg1MDlfTkFNRSAqKWIsIE5VTEwpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiAtMjsKKwkJfQorCisJcmV0ID0gYS0+Y2Fub25fZW5jbGVuIC0gYi0+Y2Fub25fZW5jbGVuOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBtZW1jbXAoYS0+Y2Fub25fZW5jLCBiLT5jYW5vbl9lbmMsIGEtPmNhbm9uX2VuY2xlbik7CisKKwl9CisKK3Vuc2lnbmVkIGxvbmcgWDUwOV9OQU1FX2hhc2goWDUwOV9OQU1FICp4KQorCXsKKwl1bnNpZ25lZCBsb25nIHJldD0wOworCXVuc2lnbmVkIGNoYXIgbWRbU0hBX0RJR0VTVF9MRU5HVEhdOworCisJLyogTWFrZSBzdXJlIFg1MDlfTkFNRSBzdHJ1Y3R1cmUgY29udGFpbnMgdmFsaWQgY2FjaGVkIGVuY29kaW5nICovCisJaTJkX1g1MDlfTkFNRSh4LE5VTEwpOworCWlmICghRVZQX0RpZ2VzdCh4LT5jYW5vbl9lbmMsIHgtPmNhbm9uX2VuY2xlbiwgbWQsIE5VTEwsIEVWUF9zaGExKCksCisJCU5VTEwpKQorCQlyZXR1cm4gMDsKKworCXJldD0oCSgodW5zaWduZWQgbG9uZyltZFswXSAgICAgKXwoKHVuc2lnbmVkIGxvbmcpbWRbMV08PDhMKXwKKwkJKCh1bnNpZ25lZCBsb25nKW1kWzJdPDwxNkwpfCgodW5zaWduZWQgbG9uZyltZFszXTw8MjRMKQorCQkpJjB4ZmZmZmZmZmZMOworCXJldHVybihyZXQpOworCX0KKworCisjaWZuZGVmIE9QRU5TU0xfTk9fTUQ1CisvKiBJIG5vdyBERVIgZW5jb2RlIHRoZSBuYW1lIGFuZCBoYXNoIGl0LiAgU2luY2UgSSBjYWNoZSB0aGUgREVSIGVuY29kaW5nLAorICogdGhpcyBpcyByZWFzb25hYmx5IGVmZmljaWVudC4gKi8KKwordW5zaWduZWQgbG9uZyBYNTA5X05BTUVfaGFzaF9vbGQoWDUwOV9OQU1FICp4KQorCXsKKwlFVlBfTURfQ1RYIG1kX2N0eDsKKwl1bnNpZ25lZCBsb25nIHJldD0wOworCXVuc2lnbmVkIGNoYXIgbWRbMTZdOworCisJLyogTWFrZSBzdXJlIFg1MDlfTkFNRSBzdHJ1Y3R1cmUgY29udGFpbnMgdmFsaWQgY2FjaGVkIGVuY29kaW5nICovCisJaTJkX1g1MDlfTkFNRSh4LE5VTEwpOworCUVWUF9NRF9DVFhfaW5pdCgmbWRfY3R4KTsKKwkvKiBFVlBfTURfQ1RYX3NldF9mbGFncygmbWRfY3R4LCBFVlBfTURfQ1RYX0ZMQUdfTk9OX0ZJUFNfQUxMT1cpOyAqLworCWlmIChFVlBfRGlnZXN0SW5pdF9leCgmbWRfY3R4LCBFVlBfbWQ1KCksIE5VTEwpCisJICAgICYmIEVWUF9EaWdlc3RVcGRhdGUoJm1kX2N0eCwgeC0+Ynl0ZXMtPmRhdGEsIHgtPmJ5dGVzLT5sZW5ndGgpCisJICAgICYmIEVWUF9EaWdlc3RGaW5hbF9leCgmbWRfY3R4LG1kLE5VTEwpKQorCQlyZXQ9KCgodW5zaWduZWQgbG9uZyltZFswXSAgICAgKXwoKHVuc2lnbmVkIGxvbmcpbWRbMV08PDhMKXwKKwkJICAgICAoKHVuc2lnbmVkIGxvbmcpbWRbMl08PDE2TCl8KCh1bnNpZ25lZCBsb25nKW1kWzNdPDwyNEwpCisJCSAgICAgKSYweGZmZmZmZmZmTDsKKwlFVlBfTURfQ1RYX2NsZWFudXAoJm1kX2N0eCk7CisKKwlyZXR1cm4ocmV0KTsKKwl9CisjZW5kaWYKKworLyogU2VhcmNoIGEgc3RhY2sgb2YgWDUwOSBmb3IgYSBtYXRjaCAqLworWDUwOSAqWDUwOV9maW5kX2J5X2lzc3Vlcl9hbmRfc2VyaWFsKFNUQUNLX09GKFg1MDkpICpzaywgWDUwOV9OQU1FICpuYW1lLAorCQlBU04xX0lOVEVHRVIgKnNlcmlhbCkKKwl7CisJc2l6ZV90IGk7CisJWDUwOV9DSU5GIGNpbmY7CisJWDUwOSB4LCp4NTA5PU5VTEw7CisKKwlpZighc2spIHJldHVybiBOVUxMOworCisJeC5jZXJ0X2luZm89ICZjaW5mOworCWNpbmYuc2VyaWFsTnVtYmVyPXNlcmlhbDsKKwljaW5mLmlzc3Vlcj1uYW1lOworCisJZm9yIChpPTA7IGk8c2tfWDUwOV9udW0oc2spOyBpKyspCisJCXsKKwkJeDUwOT1za19YNTA5X3ZhbHVlKHNrLGkpOworCQlpZiAoWDUwOV9pc3N1ZXJfYW5kX3NlcmlhbF9jbXAoeDUwOSwmeCkgPT0gMCkKKwkJCXJldHVybih4NTA5KTsKKwkJfQorCXJldHVybihOVUxMKTsKKwl9CisKK1g1MDkgKlg1MDlfZmluZF9ieV9zdWJqZWN0KFNUQUNLX09GKFg1MDkpICpzaywgWDUwOV9OQU1FICpuYW1lKQorCXsKKwlYNTA5ICp4NTA5OworCXNpemVfdCBpOworCisJZm9yIChpPTA7IGk8c2tfWDUwOV9udW0oc2spOyBpKyspCisJCXsKKwkJeDUwOT1za19YNTA5X3ZhbHVlKHNrLGkpOworCQlpZiAoWDUwOV9OQU1FX2NtcChYNTA5X2dldF9zdWJqZWN0X25hbWUoeDUwOSksbmFtZSkgPT0gMCkKKwkJCXJldHVybih4NTA5KTsKKwkJfQorCXJldHVybihOVUxMKTsKKwl9CisKK0VWUF9QS0VZICpYNTA5X2dldF9wdWJrZXkoWDUwOSAqeCkKKwl7CisJaWYgKCh4ID09IE5VTEwpIHx8ICh4LT5jZXJ0X2luZm8gPT0gTlVMTCkpCisJCXJldHVybihOVUxMKTsKKwlyZXR1cm4oWDUwOV9QVUJLRVlfZ2V0KHgtPmNlcnRfaW5mby0+a2V5KSk7CisJfQorCitBU04xX0JJVF9TVFJJTkcgKlg1MDlfZ2V0MF9wdWJrZXlfYml0c3RyKGNvbnN0IFg1MDkgKngpCisJeworCWlmKCF4KSByZXR1cm4gTlVMTDsKKwlyZXR1cm4geC0+Y2VydF9pbmZvLT5rZXktPnB1YmxpY19rZXk7CisJfQorCisKK2ludCBYNTA5X2NoZWNrX3ByaXZhdGVfa2V5KFg1MDkgKngsIEVWUF9QS0VZICprKQorCXsKKwlFVlBfUEtFWSAqeGs7CisJaW50IHJldDsKKworCXhrPVg1MDlfZ2V0X3B1YmtleSh4KTsKKworCWlmICh4aykKKwkJcmV0ID0gRVZQX1BLRVlfY21wKHhrLCBrKTsKKwllbHNlCisJCXJldCA9IC0yOworCisJc3dpdGNoIChyZXQpCisJCXsKKwljYXNlIDE6CisJCWJyZWFrOworCWNhc2UgMDoKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9jaGVja19wcml2YXRlX2tleSwgWDUwOV9SX0tFWV9WQUxVRVNfTUlTTUFUQ0gpOworCQlicmVhazsKKwljYXNlIC0xOgorCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X2NoZWNrX3ByaXZhdGVfa2V5LCBYNTA5X1JfS0VZX1RZUEVfTUlTTUFUQ0gpOworCQlicmVhazsKKwljYXNlIC0yOgorCSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9jaGVja19wcml2YXRlX2tleSwgWDUwOV9SX1VOS05PV05fS0VZX1RZUEUpOworCQl9CisJaWYgKHhrKQorCQlFVlBfUEtFWV9mcmVlKHhrKTsKKwlpZiAocmV0ID4gMCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7CisJfQorCisvKiBDaGVjayBhIHN1aXRlIEIgYWxnb3JpdGhtIGlzIHBlcm1pdHRlZDogcGFzcyBpbiBhIHB1YmxpYyBrZXkgYW5kCisgKiB0aGUgTklEIG9mIGl0cyBzaWduYXR1cmUgKG9yIDAgaWYgbm8gc2lnbmF0dXJlKS4gVGhlIHBmbGFncyBpcworICogYSBwb2ludGVyIHRvIGEgZmxhZ3MgZmllbGQgd2hpY2ggbXVzdCBjb250YWluIHRoZSBzdWl0ZSBCIHZlcmlmaWNhdGlvbgorICogZmxhZ3MuCisgKi8KKworI2lmbmRlZiBPUEVOU1NMX05PX0VDCisKK3N0YXRpYyBpbnQgY2hlY2tfc3VpdGVfYihFVlBfUEtFWSAqcGtleSwgaW50IHNpZ25fbmlkLCB1bnNpZ25lZCBsb25nICpwZmxhZ3MpCisJeworCWNvbnN0IEVDX0dST1VQICpncnAgPSBOVUxMOworCWludCBjdXJ2ZV9uaWQ7CisJaWYgKHBrZXkgJiYgcGtleS0+dHlwZSA9PSBFVlBfUEtFWV9FQykKKwkJZ3JwID0gRUNfS0VZX2dldDBfZ3JvdXAocGtleS0+cGtleS5lYyk7CisJaWYgKCFncnApCisJCXJldHVybiBYNTA5X1ZfRVJSX1NVSVRFX0JfSU5WQUxJRF9BTEdPUklUSE07CisJY3VydmVfbmlkID0gRUNfR1JPVVBfZ2V0X2N1cnZlX25hbWUoZ3JwKTsKKwkvKiBDaGVjayBjdXJ2ZSBpcyBjb25zaXN0ZW50IHdpdGggTE9TICovCisJaWYgKGN1cnZlX25pZCA9PSBOSURfc2VjcDM4NHIxKSAvKiBQLTM4NCAqLworCQl7CisJCS8qIENoZWNrIHNpZ25hdHVyZSBhbGdvcml0aG0gaXMgY29uc2lzdGVudCB3aXRoCisJCSAqIGN1cnZlLgorCQkgKi8KKwkJaWYgKHNpZ25fbmlkICE9IC0xICYmIHNpZ25fbmlkICE9IE5JRF9lY2RzYV93aXRoX1NIQTM4NCkKKwkJCXJldHVybiBYNTA5X1ZfRVJSX1NVSVRFX0JfSU5WQUxJRF9TSUdOQVRVUkVfQUxHT1JJVEhNOworCQlpZiAoISgqcGZsYWdzICYgWDUwOV9WX0ZMQUdfU1VJVEVCXzE5Ml9MT1MpKQorCQkJcmV0dXJuIFg1MDlfVl9FUlJfU1VJVEVfQl9MT1NfTk9UX0FMTE9XRUQ7CisJCS8qIElmIHdlIGVuY291bnRlciBQLTM4NCB3ZSBjYW5ub3QgdXNlIFAtMjU2IGxhdGVyICovCisJCSpwZmxhZ3MgJj0gflg1MDlfVl9GTEFHX1NVSVRFQl8xMjhfTE9TX09OTFk7CisJCX0KKwllbHNlIGlmIChjdXJ2ZV9uaWQgPT0gTklEX1g5XzYyX3ByaW1lMjU2djEpIC8qIFAtMjU2ICovCisJCXsKKwkJaWYgKHNpZ25fbmlkICE9IC0xICYmIHNpZ25fbmlkICE9IE5JRF9lY2RzYV93aXRoX1NIQTI1NikKKwkJCXJldHVybiBYNTA5X1ZfRVJSX1NVSVRFX0JfSU5WQUxJRF9TSUdOQVRVUkVfQUxHT1JJVEhNOworCQlpZiAoISgqcGZsYWdzICYgWDUwOV9WX0ZMQUdfU1VJVEVCXzEyOF9MT1NfT05MWSkpCisJCQlyZXR1cm4gWDUwOV9WX0VSUl9TVUlURV9CX0xPU19OT1RfQUxMT1dFRDsKKwkJfQorCWVsc2UKKwkJcmV0dXJuIFg1MDlfVl9FUlJfU1VJVEVfQl9JTlZBTElEX0NVUlZFOworCisJcmV0dXJuIFg1MDlfVl9PSzsKKwl9CisKK2ludCBYNTA5X2NoYWluX2NoZWNrX3N1aXRlYihpbnQgKnBlcnJvcl9kZXB0aCwgWDUwOSAqeCwgU1RBQ0tfT0YoWDUwOSkgKmNoYWluLAorCQkJCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJeworCWludCBydiwgc2lnbl9uaWQ7CisJc2l6ZV90IGk7CisJRVZQX1BLRVkgKnBrID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIHRmbGFnczsKKwlpZiAoIShmbGFncyAmIFg1MDlfVl9GTEFHX1NVSVRFQl8xMjhfTE9TKSkKKwkJcmV0dXJuIFg1MDlfVl9PSzsKKwl0ZmxhZ3MgPSBmbGFnczsKKwkvKiBJZiBubyBFRSBjZXJ0aWZpY2F0ZSBwYXNzZWQgaW4gbXVzdCBiZSBmaXJzdCBpbiBjaGFpbiAqLworCWlmICh4ID09IE5VTEwpCisJCXsKKwkJeCA9IHNrX1g1MDlfdmFsdWUoY2hhaW4sIDApOworCQlpID0gMTsKKwkJfQorCWVsc2UKKwkJaSA9IDA7CisKKwlpZiAoWDUwOV9nZXRfdmVyc2lvbih4KSAhPSAyKQorCQl7CisJCXJ2ID0gWDUwOV9WX0VSUl9TVUlURV9CX0lOVkFMSURfVkVSU0lPTjsKKwkJLyogQ29ycmVjdCBlcnJvciBkZXB0aCAqLworCQlpID0gMDsKKwkJZ290byBlbmQ7CisJCX0KKworCXBrID0gWDUwOV9nZXRfcHVia2V5KHgpOworCS8qIENoZWNrIEVFIGtleSBvbmx5ICovCisJcnYgPSBjaGVja19zdWl0ZV9iKHBrLCAtMSwgJnRmbGFncyk7CisJaWYgKHJ2ICE9IFg1MDlfVl9PSykKKwkJeworCQkvKiBDb3JyZWN0IGVycm9yIGRlcHRoICovCisJCWkgPSAwOworCQlnb3RvIGVuZDsKKwkJfQorCWZvcig7IGkgPCBza19YNTA5X251bShjaGFpbik7IGkrKykKKwkJeworCQlzaWduX25pZCA9IFg1MDlfZ2V0X3NpZ25hdHVyZV9uaWQoeCk7CisJCXggPSBza19YNTA5X3ZhbHVlKGNoYWluLCBpKTsKKwkJaWYgKFg1MDlfZ2V0X3ZlcnNpb24oeCkgIT0gMikKKwkJCXsKKwkJCXJ2ID0gWDUwOV9WX0VSUl9TVUlURV9CX0lOVkFMSURfVkVSU0lPTjsKKwkJCWdvdG8gZW5kOworCQkJfQorCQlFVlBfUEtFWV9mcmVlKHBrKTsKKwkJcGsgPSBYNTA5X2dldF9wdWJrZXkoeCk7CisJCXJ2ID0gY2hlY2tfc3VpdGVfYihwaywgc2lnbl9uaWQsICZ0ZmxhZ3MpOworCQlpZiAocnYgIT0gWDUwOV9WX09LKQorCQkJZ290byBlbmQ7CisJCX0KKworCS8qIEZpbmFsIGNoZWNrOiByb290IENBIHNpZ25hdHVyZSAqLworCXJ2ID0gY2hlY2tfc3VpdGVfYihwaywgWDUwOV9nZXRfc2lnbmF0dXJlX25pZCh4KSwgJnRmbGFncyk7CisJZW5kOgorCWlmIChwaykKKwkJRVZQX1BLRVlfZnJlZShwayk7CisJaWYgKHJ2ICE9IFg1MDlfVl9PSykKKwkJeworCQkvKiBJbnZhbGlkIHNpZ25hdHVyZSBvciBMT1MgZXJyb3JzIGFyZSBmb3IgcHJldmlvdXMgY2VydCAqLworCQlpZiAoKHJ2ID09IFg1MDlfVl9FUlJfU1VJVEVfQl9JTlZBTElEX1NJR05BVFVSRV9BTEdPUklUSE0KKwkJICAgIHx8IHJ2ID09IFg1MDlfVl9FUlJfU1VJVEVfQl9MT1NfTk9UX0FMTE9XRUQpICYmIGkpCisJCQlpLS07CisJCS8qIElmIHdlIGhhdmUgTE9TIGVycm9yIGFuZCBmbGFncyBjaGFuZ2VkIHRoZW4gd2UgYXJlIHNpZ25pbmcKKwkJICogUC0zODQgd2l0aCBQLTI1Ni4gVXNlIG1vcmUgbWVhbmluZ2d1bCBlcnJvci4KKwkJICovCisJCWlmIChydiA9PSBYNTA5X1ZfRVJSX1NVSVRFX0JfTE9TX05PVF9BTExPV0VEICYmIGZsYWdzICE9IHRmbGFncykKKwkJCXJ2ID0gWDUwOV9WX0VSUl9TVUlURV9CX0NBTk5PVF9TSUdOX1BfMzg0X1dJVEhfUF8yNTY7CisJCWlmIChwZXJyb3JfZGVwdGgpCisJCQkqcGVycm9yX2RlcHRoID0gaTsKKwkJfQorCXJldHVybiBydjsKKwl9CisKK2ludCBYNTA5X0NSTF9jaGVja19zdWl0ZWIoWDUwOV9DUkwgKmNybCwgRVZQX1BLRVkgKnBrLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorCXsKKwlpbnQgc2lnbl9uaWQ7CisJaWYgKCEoZmxhZ3MgJiBYNTA5X1ZfRkxBR19TVUlURUJfMTI4X0xPUykpCisJCXJldHVybiBYNTA5X1ZfT0s7CisJc2lnbl9uaWQgPSBPQkpfb2JqMm5pZChjcmwtPmNybC0+c2lnX2FsZy0+YWxnb3JpdGhtKTsKKwlyZXR1cm4gY2hlY2tfc3VpdGVfYihwaywgc2lnbl9uaWQsICZmbGFncyk7CisJfQorCisjZWxzZQoraW50IFg1MDlfY2hhaW5fY2hlY2tfc3VpdGViKGludCAqcGVycm9yX2RlcHRoLCBYNTA5ICp4LCBTVEFDS19PRihYNTA5KSAqY2hhaW4sCisJCQkJCQkJdW5zaWduZWQgbG9uZyBmbGFncykKKwl7CisJcmV0dXJuIDA7CisJfQorCitpbnQgWDUwOV9DUkxfY2hlY2tfc3VpdGViKFg1MDlfQ1JMICpjcmwsIEVWUF9QS0VZICpwaywgdW5zaWduZWQgbG9uZyBmbGFncykKKwl7CisJcmV0dXJuIDA7CisJfQorCisjZW5kaWYKKy8qIE5vdCBzdHJpY3RseSBzcGVha2luZyBhbiAidXBfcmVmIiBhcyBhIFNUQUNLIGRvZXNuJ3QgaGF2ZSBhIHJlZmVyZW5jZQorICogY291bnQgYnV0IGl0IGhhcyB0aGUgc2FtZSBlZmZlY3QgYnkgZHVwaW5nIHRoZSBTVEFDSyBhbmQgdXBwaW5nIHRoZSByZWYKKyAqIG9mIGVhY2ggWDUwOSBzdHJ1Y3R1cmUuCisgKi8KK1NUQUNLX09GKFg1MDkpICpYNTA5X2NoYWluX3VwX3JlZihTVEFDS19PRihYNTA5KSAqY2hhaW4pCisJeworCVNUQUNLX09GKFg1MDkpICpyZXQ7CisJc2l6ZV90IGk7CisJcmV0ID0gc2tfWDUwOV9kdXAoY2hhaW4pOworCWZvciAoaSA9IDA7IGkgPCBza19YNTA5X251bShyZXQpOyBpKyspCisJCXsKKwkJWDUwOSAqeCA9IHNrX1g1MDlfdmFsdWUocmV0LCBpKTsKKwkJQ1JZUFRPX2FkZCgmeC0+cmVmZXJlbmNlcywgMSwgQ1JZUFRPX0xPQ0tfWDUwOSk7CisJCX0KKwlyZXR1cm4gcmV0OworCX0KZGlmZiAtLWdpdCBhL2NyeXB0by94NTA5L3g1MDlfZDIuYyBiL2NyeXB0by94NTA5L3g1MDlfZDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTYxZDg1Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3g1MDkveDUwOV9kMi5jCkBAIC0wLDAgKzEsMTA1IEBACisvKiBjcnlwdG8veDUwOS94NTA5X2QyLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorCisKKyNpZm5kZWYgT1BFTlNTTF9OT19TVERJTworaW50IFg1MDlfU1RPUkVfc2V0X2RlZmF1bHRfcGF0aHMoWDUwOV9TVE9SRSAqY3R4KQorCXsKKwlYNTA5X0xPT0tVUCAqbG9va3VwOworCisJbG9va3VwPVg1MDlfU1RPUkVfYWRkX2xvb2t1cChjdHgsWDUwOV9MT09LVVBfZmlsZSgpKTsKKwlpZiAobG9va3VwID09IE5VTEwpIHJldHVybigwKTsKKwlYNTA5X0xPT0tVUF9sb2FkX2ZpbGUobG9va3VwLE5VTEwsWDUwOV9GSUxFVFlQRV9ERUZBVUxUKTsKKworCWxvb2t1cD1YNTA5X1NUT1JFX2FkZF9sb29rdXAoY3R4LFg1MDlfTE9PS1VQX2hhc2hfZGlyKCkpOworCWlmIChsb29rdXAgPT0gTlVMTCkgcmV0dXJuKDApOworCVg1MDlfTE9PS1VQX2FkZF9kaXIobG9va3VwLE5VTEwsWDUwOV9GSUxFVFlQRV9ERUZBVUxUKTsKKwkKKwkvKiBjbGVhciBhbnkgZXJyb3JzICovCisJRVJSX2NsZWFyX2Vycm9yKCk7CisKKwlyZXR1cm4oMSk7CisJfQorCitpbnQgWDUwOV9TVE9SRV9sb2FkX2xvY2F0aW9ucyhYNTA5X1NUT1JFICpjdHgsIGNvbnN0IGNoYXIgKmZpbGUsCisJCWNvbnN0IGNoYXIgKnBhdGgpCisJeworCVg1MDlfTE9PS1VQICpsb29rdXA7CisKKwlpZiAoZmlsZSAhPSBOVUxMKQorCQl7CisJCWxvb2t1cD1YNTA5X1NUT1JFX2FkZF9sb29rdXAoY3R4LFg1MDlfTE9PS1VQX2ZpbGUoKSk7CisJCWlmIChsb29rdXAgPT0gTlVMTCkgcmV0dXJuKDApOworCQlpZiAoWDUwOV9MT09LVVBfbG9hZF9maWxlKGxvb2t1cCxmaWxlLFg1MDlfRklMRVRZUEVfUEVNKSAhPSAxKQorCQkgICAgcmV0dXJuKDApOworCQl9CisJaWYgKHBhdGggIT0gTlVMTCkKKwkJeworCQlsb29rdXA9WDUwOV9TVE9SRV9hZGRfbG9va3VwKGN0eCxYNTA5X0xPT0tVUF9oYXNoX2RpcigpKTsKKwkJaWYgKGxvb2t1cCA9PSBOVUxMKSByZXR1cm4oMCk7CisJCWlmIChYNTA5X0xPT0tVUF9hZGRfZGlyKGxvb2t1cCxwYXRoLFg1MDlfRklMRVRZUEVfUEVNKSAhPSAxKQorCQkgICAgcmV0dXJuKDApOworCQl9CisJaWYgKChwYXRoID09IE5VTEwpICYmIChmaWxlID09IE5VTEwpKQorCQlyZXR1cm4oMCk7CisJcmV0dXJuKDEpOworCX0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOS94NTA5X2RlZi5jIGIvY3J5cHRvL3g1MDkveDUwOV9kZWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmFlMjg5Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3g1MDkveDUwOV9kZWYuYwpAQCAtMCwwICsxLDg4IEBACisvKiBjcnlwdG8veDUwOS94NTA5X2RlZi5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKKworLyogVE9ETyhmb3JrKTogY2xlYW51cCAqLworCisjZGVmaW5lIE9QRU5TU0xESVIgIi9ldGMvc3NsIgorI2RlZmluZSBYNTA5X0NFUlRfQVJFQQkJT1BFTlNTTERJUgorI2RlZmluZSBYNTA5X0NFUlRfRElSCQlPUEVOU1NMRElSICIvY2VydHMiCisjZGVmaW5lIFg1MDlfQ0VSVF9GSUxFCQlPUEVOU1NMRElSICIvY2VydC5wZW0iCisjZGVmaW5lIFg1MDlfUFJJVkFURV9ESVIJT1BFTlNTTERJUiAiL3ByaXZhdGUiCisjZGVmaW5lIFg1MDlfQ0VSVF9ESVJfRVZQICAgICAgICAiU1NMX0NFUlRfRElSIgorI2RlZmluZSBYNTA5X0NFUlRfRklMRV9FVlAgICAgICAgIlNTTF9DRVJUX0ZJTEUiCisKK2NvbnN0IGNoYXIgKlg1MDlfZ2V0X2RlZmF1bHRfcHJpdmF0ZV9kaXIodm9pZCkKKwl7IHJldHVybihYNTA5X1BSSVZBVEVfRElSKTsgfQorCQorY29uc3QgY2hhciAqWDUwOV9nZXRfZGVmYXVsdF9jZXJ0X2FyZWEodm9pZCkKKwl7IHJldHVybihYNTA5X0NFUlRfQVJFQSk7IH0KKworY29uc3QgY2hhciAqWDUwOV9nZXRfZGVmYXVsdF9jZXJ0X2Rpcih2b2lkKQorCXsgcmV0dXJuKFg1MDlfQ0VSVF9ESVIpOyB9CisKK2NvbnN0IGNoYXIgKlg1MDlfZ2V0X2RlZmF1bHRfY2VydF9maWxlKHZvaWQpCisJeyByZXR1cm4oWDUwOV9DRVJUX0ZJTEUpOyB9CisKK2NvbnN0IGNoYXIgKlg1MDlfZ2V0X2RlZmF1bHRfY2VydF9kaXJfZW52KHZvaWQpCisJeyByZXR1cm4oWDUwOV9DRVJUX0RJUl9FVlApOyB9CisKK2NvbnN0IGNoYXIgKlg1MDlfZ2V0X2RlZmF1bHRfY2VydF9maWxlX2Vudih2b2lkKQorCXsgcmV0dXJuKFg1MDlfQ0VSVF9GSUxFX0VWUCk7IH0KKwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3g1MDkveDUwOV9lcnJvci5jIGIvY3J5cHRvL3g1MDkveDUwOV9lcnJvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZDJmYWYKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOS94NTA5X2Vycm9yLmMKQEAgLTAsMCArMSwxMjUgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNCwgR29vZ2xlIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisKKyNpbmNsdWRlICJ4NTA5LmgiCisKK2NvbnN0IEVSUl9TVFJJTkdfREFUQSBYNTA5X2Vycm9yX3N0cmluZ19kYXRhW10gPSB7CisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIFg1MDlfRl9BU04xX2RpZ2VzdCwgMCksICJBU04xX2RpZ2VzdCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCBYNTA5X0ZfQVNOMV9nZW5lcmF0ZV92MywgMCksICJBU04xX2dlbmVyYXRlX3YzIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIFg1MDlfRl9BU04xX2l0ZW1fc2lnbl9jdHgsIDApLCAiQVNOMV9pdGVtX3NpZ25fY3R4In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIFg1MDlfRl9BU04xX2l0ZW1fdmVyaWZ5LCAwKSwgIkFTTjFfaXRlbV92ZXJpZnkifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOSwgWDUwOV9GX0FTTjFfc2lnbiwgMCksICJBU04xX3NpZ24ifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOSwgWDUwOV9GX05FVFNDQVBFX1NQS0lfYjY0X2RlY29kZSwgMCksICJORVRTQ0FQRV9TUEtJX2I2NF9kZWNvZGUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOSwgWDUwOV9GX05FVFNDQVBFX1NQS0lfYjY0X2VuY29kZSwgMCksICJORVRTQ0FQRV9TUEtJX2I2NF9lbmNvZGUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOSwgWDUwOV9GX1BLQ1M3X2dldF9jZXJ0aWZpY2F0ZXMsIDApLCAiUEtDUzdfZ2V0X2NlcnRpZmljYXRlcyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCBYNTA5X0ZfWDUwOV9BVFRSSUJVVEVfY3JlYXRlX2J5X05JRCwgMCksICJYNTA5X0FUVFJJQlVURV9jcmVhdGVfYnlfTklEIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIFg1MDlfRl9YNTA5X0FUVFJJQlVURV9jcmVhdGVfYnlfT0JKLCAwKSwgIlg1MDlfQVRUUklCVVRFX2NyZWF0ZV9ieV9PQkoifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOSwgWDUwOV9GX1g1MDlfQVRUUklCVVRFX2NyZWF0ZV9ieV90eHQsIDApLCAiWDUwOV9BVFRSSUJVVEVfY3JlYXRlX2J5X3R4dCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCBYNTA5X0ZfWDUwOV9BVFRSSUJVVEVfZ2V0MF9kYXRhLCAwKSwgIlg1MDlfQVRUUklCVVRFX2dldDBfZGF0YSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCBYNTA5X0ZfWDUwOV9BVFRSSUJVVEVfc2V0MV9kYXRhLCAwKSwgIlg1MDlfQVRUUklCVVRFX3NldDFfZGF0YSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCBYNTA5X0ZfWDUwOV9DUkxfYWRkMF9yZXZva2VkLCAwKSwgIlg1MDlfQ1JMX2FkZDBfcmV2b2tlZCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCBYNTA5X0ZfWDUwOV9DUkxfZGlmZiwgMCksICJYNTA5X0NSTF9kaWZmIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIFg1MDlfRl9YNTA5X0NSTF9wcmludF9mcCwgMCksICJYNTA5X0NSTF9wcmludF9mcCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCBYNTA5X0ZfWDUwOV9FWFRFTlNJT05fY3JlYXRlX2J5X05JRCwgMCksICJYNTA5X0VYVEVOU0lPTl9jcmVhdGVfYnlfTklEIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIFg1MDlfRl9YNTA5X0VYVEVOU0lPTl9jcmVhdGVfYnlfT0JKLCAwKSwgIlg1MDlfRVhURU5TSU9OX2NyZWF0ZV9ieV9PQkoifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOSwgWDUwOV9GX1g1MDlfSU5GT19uZXcsIDApLCAiWDUwOV9JTkZPX25ldyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCBYNTA5X0ZfWDUwOV9OQU1FX0VOVFJZX2NyZWF0ZV9ieV9OSUQsIDApLCAiWDUwOV9OQU1FX0VOVFJZX2NyZWF0ZV9ieV9OSUQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOSwgWDUwOV9GX1g1MDlfTkFNRV9FTlRSWV9jcmVhdGVfYnlfdHh0LCAwKSwgIlg1MDlfTkFNRV9FTlRSWV9jcmVhdGVfYnlfdHh0In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIFg1MDlfRl9YNTA5X05BTUVfRU5UUllfc2V0X29iamVjdCwgMCksICJYNTA5X05BTUVfRU5UUllfc2V0X29iamVjdCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCBYNTA5X0ZfWDUwOV9OQU1FX2FkZF9lbnRyeSwgMCksICJYNTA5X05BTUVfYWRkX2VudHJ5In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIFg1MDlfRl9YNTA5X05BTUVfb25lbGluZSwgMCksICJYNTA5X05BTUVfb25lbGluZSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCBYNTA5X0ZfWDUwOV9OQU1FX3ByaW50LCAwKSwgIlg1MDlfTkFNRV9wcmludCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCBYNTA5X0ZfWDUwOV9QS0VZX25ldywgMCksICJYNTA5X1BLRVlfbmV3In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIFg1MDlfRl9YNTA5X1BVQktFWV9nZXQsIDApLCAiWDUwOV9QVUJLRVlfZ2V0In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIFg1MDlfRl9YNTA5X1BVQktFWV9zZXQsIDApLCAiWDUwOV9QVUJLRVlfc2V0In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIFg1MDlfRl9YNTA5X1JFUV9jaGVja19wcml2YXRlX2tleSwgMCksICJYNTA5X1JFUV9jaGVja19wcml2YXRlX2tleSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCBYNTA5X0ZfWDUwOV9SRVFfdG9fWDUwOSwgMCksICJYNTA5X1JFUV90b19YNTA5In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIFg1MDlfRl9YNTA5X1NUT1JFX0NUWF9nZXQxX2lzc3VlciwgMCksICJYNTA5X1NUT1JFX0NUWF9nZXQxX2lzc3VlciJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCBYNTA5X0ZfWDUwOV9TVE9SRV9DVFhfaW5pdCwgMCksICJYNTA5X1NUT1JFX0NUWF9pbml0In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIFg1MDlfRl9YNTA5X1NUT1JFX0NUWF9uZXcsIDApLCAiWDUwOV9TVE9SRV9DVFhfbmV3In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIFg1MDlfRl9YNTA5X1NUT1JFX0NUWF9wdXJwb3NlX2luaGVyaXQsIDApLCAiWDUwOV9TVE9SRV9DVFhfcHVycG9zZV9pbmhlcml0In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIFg1MDlfRl9YNTA5X1NUT1JFX2FkZF9jZXJ0LCAwKSwgIlg1MDlfU1RPUkVfYWRkX2NlcnQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOSwgWDUwOV9GX1g1MDlfU1RPUkVfYWRkX2NybCwgMCksICJYNTA5X1NUT1JFX2FkZF9jcmwifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOSwgWDUwOV9GX1g1MDlfVFJVU1RfYWRkLCAwKSwgIlg1MDlfVFJVU1RfYWRkIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIFg1MDlfRl9YNTA5X1RSVVNUX3NldCwgMCksICJYNTA5X1RSVVNUX3NldCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCBYNTA5X0ZfWDUwOV9jaGVja19wcml2YXRlX2tleSwgMCksICJYNTA5X2NoZWNrX3ByaXZhdGVfa2V5In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIFg1MDlfRl9YNTA5X2dldF9wdWJrZXlfcGFyYW1ldGVycywgMCksICJYNTA5X2dldF9wdWJrZXlfcGFyYW1ldGVycyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCBYNTA5X0ZfWDUwOV9sb2FkX2NlcnRfY3JsX2ZpbGUsIDApLCAiWDUwOV9sb2FkX2NlcnRfY3JsX2ZpbGUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOSwgWDUwOV9GX1g1MDlfbG9hZF9jZXJ0X2ZpbGUsIDApLCAiWDUwOV9sb2FkX2NlcnRfZmlsZSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCBYNTA5X0ZfWDUwOV9sb2FkX2NybF9maWxlLCAwKSwgIlg1MDlfbG9hZF9jcmxfZmlsZSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCBYNTA5X0ZfWDUwOV9wcmludF9leF9mcCwgMCksICJYNTA5X3ByaW50X2V4X2ZwIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIFg1MDlfRl9YNTA5X3RvX1g1MDlfUkVRLCAwKSwgIlg1MDlfdG9fWDUwOV9SRVEifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOSwgWDUwOV9GX1g1MDlfdmVyaWZ5X2NlcnQsIDApLCAiWDUwOV92ZXJpZnlfY2VydCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCBYNTA5X0ZfWDUwOWF0X2FkZDFfYXR0ciwgMCksICJYNTA5YXRfYWRkMV9hdHRyIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIFg1MDlfRl9YNTA5djNfYWRkX2V4dCwgMCksICJYNTA5djNfYWRkX2V4dCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCBYNTA5X0ZfYWRkX2NlcnRfZGlyLCAwKSwgImFkZF9jZXJ0X2RpciJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCBYNTA5X0ZfYXBwZW5kX2V4cCwgMCksICJhcHBlbmRfZXhwIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIFg1MDlfRl9hc24xX2NiLCAwKSwgImFzbjFfY2IifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOSwgWDUwOV9GX2FzbjFfc3RyMnR5cGUsIDApLCAiYXNuMV9zdHIydHlwZSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCBYNTA5X0ZfYml0c3RyX2NiLCAwKSwgImJpdHN0cl9jYiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCBYNTA5X0ZfYnlfZmlsZV9jdHJsLCAwKSwgImJ5X2ZpbGVfY3RybCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCBYNTA5X0ZfY2hlY2tfcG9saWN5LCAwKSwgImNoZWNrX3BvbGljeSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCBYNTA5X0ZfZDJpX1g1MDlfUEtFWSwgMCksICJkMmlfWDUwOV9QS0VZIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIFg1MDlfRl9kaXJfY3RybCwgMCksICJkaXJfY3RybCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCBYNTA5X0ZfZ2V0X2NlcnRfYnlfc3ViamVjdCwgMCksICJnZXRfY2VydF9ieV9zdWJqZWN0In0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIFg1MDlfRl9pMmRfRFNBX1BVQktFWSwgMCksICJpMmRfRFNBX1BVQktFWSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCBYNTA5X0ZfaTJkX0VDX1BVQktFWSwgMCksICJpMmRfRUNfUFVCS0VZIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIFg1MDlfRl9pMmRfUHJpdmF0ZUtleSwgMCksICJpMmRfUHJpdmF0ZUtleSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCBYNTA5X0ZfaTJkX1JTQV9QVUJLRVksIDApLCAiaTJkX1JTQV9QVUJLRVkifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOSwgWDUwOV9GX3BhcnNlX3RhZ2dpbmcsIDApLCAicGFyc2VfdGFnZ2luZyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCBYNTA5X0ZfeDUwOV9uYW1lX2VuY29kZSwgMCksICJ4NTA5X25hbWVfZW5jb2RlIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIFg1MDlfRl94NTA5X25hbWVfZXhfZDJpLCAwKSwgIng1MDlfbmFtZV9leF9kMmkifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOSwgWDUwOV9GX3g1MDlfbmFtZV9leF9uZXcsIDApLCAieDUwOV9uYW1lX2V4X25ldyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCAwLCBYNTA5X1JfQUtJRF9NSVNNQVRDSCksICJBS0lEX01JU01BVENIIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIDAsIFg1MDlfUl9CQURfUEtDUzdfVkVSU0lPTiksICJCQURfUEtDUzdfVkVSU0lPTiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCAwLCBYNTA5X1JfQkFEX1g1MDlfRklMRVRZUEUpLCAiQkFEX1g1MDlfRklMRVRZUEUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOSwgMCwgWDUwOV9SX0JBU0U2NF9ERUNPREVfRVJST1IpLCAiQkFTRTY0X0RFQ09ERV9FUlJPUiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCAwLCBYNTA5X1JfQ0FOVF9DSEVDS19ESF9LRVkpLCAiQ0FOVF9DSEVDS19ESF9LRVkifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOSwgMCwgWDUwOV9SX0NFUlRfQUxSRUFEWV9JTl9IQVNIX1RBQkxFKSwgIkNFUlRfQUxSRUFEWV9JTl9IQVNIX1RBQkxFIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIDAsIFg1MDlfUl9DT05URVhUX05PVF9JTklUSUFMSVNFRCksICJDT05URVhUX05PVF9JTklUSUFMSVNFRCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCAwLCBYNTA5X1JfQ1JMX0FMUkVBRFlfREVMVEEpLCAiQ1JMX0FMUkVBRFlfREVMVEEifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOSwgMCwgWDUwOV9SX0NSTF9WRVJJRllfRkFJTFVSRSksICJDUkxfVkVSSUZZX0ZBSUxVUkUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOSwgMCwgWDUwOV9SX0RJR0VTVF9BTkRfS0VZX1RZUEVfTk9UX1NVUFBPUlRFRCksICJESUdFU1RfQU5EX0tFWV9UWVBFX05PVF9TVVBQT1JURUQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOSwgMCwgWDUwOV9SX0VSUl9BU04xX0xJQiksICJFUlJfQVNOMV9MSUIifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOSwgMCwgWDUwOV9SX0lEUF9NSVNNQVRDSCksICJJRFBfTUlTTUFUQ0gifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOSwgMCwgWDUwOV9SX0lOVkFMSURfRElSRUNUT1JZKSwgIklOVkFMSURfRElSRUNUT1JZIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIDAsIFg1MDlfUl9JTlZBTElEX0ZJRUxEX05BTUUpLCAiSU5WQUxJRF9GSUVMRF9OQU1FIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIDAsIFg1MDlfUl9JTlZBTElEX1RSVVNUKSwgIklOVkFMSURfVFJVU1QifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOSwgMCwgWDUwOV9SX0lTU1VFUl9NSVNNQVRDSCksICJJU1NVRVJfTUlTTUFUQ0gifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOSwgMCwgWDUwOV9SX0tFWV9UWVBFX01JU01BVENIKSwgIktFWV9UWVBFX01JU01BVENIIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIDAsIFg1MDlfUl9LRVlfVkFMVUVTX01JU01BVENIKSwgIktFWV9WQUxVRVNfTUlTTUFUQ0gifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOSwgMCwgWDUwOV9SX0xPQURJTkdfQ0VSVF9ESVIpLCAiTE9BRElOR19DRVJUX0RJUiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCAwLCBYNTA5X1JfTE9BRElOR19ERUZBVUxUUyksICJMT0FESU5HX0RFRkFVTFRTIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIDAsIFg1MDlfUl9NRVRIT0RfTk9UX1NVUFBPUlRFRCksICJNRVRIT0RfTk9UX1NVUFBPUlRFRCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCAwLCBYNTA5X1JfTkVXRVJfQ1JMX05PVF9ORVdFUiksICJORVdFUl9DUkxfTk9UX05FV0VSIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIDAsIFg1MDlfUl9OT1RfUEtDUzdfU0lHTkVEX0RBVEEpLCAiTk9UX1BLQ1M3X1NJR05FRF9EQVRBIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIDAsIFg1MDlfUl9OT19DRVJUSUZJQ0FURVNfSU5DTFVERUQpLCAiTk9fQ0VSVElGSUNBVEVTX0lOQ0xVREVEIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIDAsIFg1MDlfUl9OT19DRVJUX1NFVF9GT1JfVVNfVE9fVkVSSUZZKSwgIk5PX0NFUlRfU0VUX0ZPUl9VU19UT19WRVJJRlkifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOSwgMCwgWDUwOV9SX05PX0NSTF9OVU1CRVIpLCAiTk9fQ1JMX05VTUJFUiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCAwLCBYNTA5X1JfUFVCTElDX0tFWV9ERUNPREVfRVJST1IpLCAiUFVCTElDX0tFWV9ERUNPREVfRVJST1IifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOSwgMCwgWDUwOV9SX1BVQkxJQ19LRVlfRU5DT0RFX0VSUk9SKSwgIlBVQkxJQ19LRVlfRU5DT0RFX0VSUk9SIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIDAsIFg1MDlfUl9TSE9VTERfUkVUUlkpLCAiU0hPVUxEX1JFVFJZIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDksIDAsIFg1MDlfUl9VTkFCTEVfVE9fRklORF9QQVJBTUVURVJTX0lOX0NIQUlOKSwgIlVOQUJMRV9UT19GSU5EX1BBUkFNRVRFUlNfSU5fQ0hBSU4ifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOSwgMCwgWDUwOV9SX1VOQUJMRV9UT19HRVRfQ0VSVFNfUFVCTElDX0tFWSksICJVTkFCTEVfVE9fR0VUX0NFUlRTX1BVQkxJQ19LRVkifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOSwgMCwgWDUwOV9SX1VOS05PV05fS0VZX1RZUEUpLCAiVU5LTk9XTl9LRVlfVFlQRSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCAwLCBYNTA5X1JfVU5LTk9XTl9OSUQpLCAiVU5LTk9XTl9OSUQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOSwgMCwgWDUwOV9SX1VOS05PV05fUFVSUE9TRV9JRCksICJVTktOT1dOX1BVUlBPU0VfSUQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOSwgMCwgWDUwOV9SX1VOS05PV05fVFJVU1RfSUQpLCAiVU5LTk9XTl9UUlVTVF9JRCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCAwLCBYNTA5X1JfVU5TVVBQT1JURURfQUxHT1JJVEhNKSwgIlVOU1VQUE9SVEVEX0FMR09SSVRITSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5LCAwLCBYNTA5X1JfV1JPTkdfTE9PS1VQX1RZUEUpLCAiV1JPTkdfTE9PS1VQX1RZUEUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOSwgMCwgWDUwOV9SX1dST05HX1RZUEUpLCAiV1JPTkdfVFlQRSJ9LAorICB7MCwgTlVMTH0sCit9OwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3g1MDkveDUwOV9leHQuYyBiL2NyeXB0by94NTA5L3g1MDlfZXh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYxZTBjNQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94NTA5L3g1MDlfZXh0LmMKQEAgLTAsMCArMSwyMDYgQEAKKy8qIGNyeXB0by94NTA5L3g1MDlfZXh0LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zdGFjay5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisKKworaW50IFg1MDlfQ1JMX2dldF9leHRfY291bnQoWDUwOV9DUkwgKngpCisJeworCXJldHVybihYNTA5djNfZ2V0X2V4dF9jb3VudCh4LT5jcmwtPmV4dGVuc2lvbnMpKTsKKwl9CisKK2ludCBYNTA5X0NSTF9nZXRfZXh0X2J5X05JRChYNTA5X0NSTCAqeCwgaW50IG5pZCwgaW50IGxhc3Rwb3MpCisJeworCXJldHVybihYNTA5djNfZ2V0X2V4dF9ieV9OSUQoeC0+Y3JsLT5leHRlbnNpb25zLG5pZCxsYXN0cG9zKSk7CisJfQorCitpbnQgWDUwOV9DUkxfZ2V0X2V4dF9ieV9PQkooWDUwOV9DUkwgKngsIEFTTjFfT0JKRUNUICpvYmosIGludCBsYXN0cG9zKQorCXsKKwlyZXR1cm4oWDUwOXYzX2dldF9leHRfYnlfT0JKKHgtPmNybC0+ZXh0ZW5zaW9ucyxvYmosbGFzdHBvcykpOworCX0KKworaW50IFg1MDlfQ1JMX2dldF9leHRfYnlfY3JpdGljYWwoWDUwOV9DUkwgKngsIGludCBjcml0LCBpbnQgbGFzdHBvcykKKwl7CisJcmV0dXJuKFg1MDl2M19nZXRfZXh0X2J5X2NyaXRpY2FsKHgtPmNybC0+ZXh0ZW5zaW9ucyxjcml0LGxhc3Rwb3MpKTsKKwl9CisKK1g1MDlfRVhURU5TSU9OICpYNTA5X0NSTF9nZXRfZXh0KFg1MDlfQ1JMICp4LCBpbnQgbG9jKQorCXsKKwlyZXR1cm4oWDUwOXYzX2dldF9leHQoeC0+Y3JsLT5leHRlbnNpb25zLGxvYykpOworCX0KKworWDUwOV9FWFRFTlNJT04gKlg1MDlfQ1JMX2RlbGV0ZV9leHQoWDUwOV9DUkwgKngsIGludCBsb2MpCisJeworCXJldHVybihYNTA5djNfZGVsZXRlX2V4dCh4LT5jcmwtPmV4dGVuc2lvbnMsbG9jKSk7CisJfQorCit2b2lkICpYNTA5X0NSTF9nZXRfZXh0X2QyaShYNTA5X0NSTCAqeCwgaW50IG5pZCwgaW50ICpjcml0LCBpbnQgKmlkeCkKK3sKKwlyZXR1cm4gWDUwOVYzX2dldF9kMmkoeC0+Y3JsLT5leHRlbnNpb25zLCBuaWQsIGNyaXQsIGlkeCk7Cit9CisKK2ludCBYNTA5X0NSTF9hZGQxX2V4dF9pMmQoWDUwOV9DUkwgKngsIGludCBuaWQsIHZvaWQgKnZhbHVlLCBpbnQgY3JpdCwKKwkJCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXJldHVybiBYNTA5VjNfYWRkMV9pMmQoJngtPmNybC0+ZXh0ZW5zaW9ucywgbmlkLCB2YWx1ZSwgY3JpdCwgZmxhZ3MpOworfQorCitpbnQgWDUwOV9DUkxfYWRkX2V4dChYNTA5X0NSTCAqeCwgWDUwOV9FWFRFTlNJT04gKmV4LCBpbnQgbG9jKQorCXsKKwlyZXR1cm4oWDUwOXYzX2FkZF9leHQoJih4LT5jcmwtPmV4dGVuc2lvbnMpLGV4LGxvYykgIT0gTlVMTCk7CisJfQorCitpbnQgWDUwOV9nZXRfZXh0X2NvdW50KFg1MDkgKngpCisJeworCXJldHVybihYNTA5djNfZ2V0X2V4dF9jb3VudCh4LT5jZXJ0X2luZm8tPmV4dGVuc2lvbnMpKTsKKwl9CisKK2ludCBYNTA5X2dldF9leHRfYnlfTklEKFg1MDkgKngsIGludCBuaWQsIGludCBsYXN0cG9zKQorCXsKKwlyZXR1cm4oWDUwOXYzX2dldF9leHRfYnlfTklEKHgtPmNlcnRfaW5mby0+ZXh0ZW5zaW9ucyxuaWQsbGFzdHBvcykpOworCX0KKworaW50IFg1MDlfZ2V0X2V4dF9ieV9PQkooWDUwOSAqeCwgQVNOMV9PQkpFQ1QgKm9iaiwgaW50IGxhc3Rwb3MpCisJeworCXJldHVybihYNTA5djNfZ2V0X2V4dF9ieV9PQkooeC0+Y2VydF9pbmZvLT5leHRlbnNpb25zLG9iaixsYXN0cG9zKSk7CisJfQorCitpbnQgWDUwOV9nZXRfZXh0X2J5X2NyaXRpY2FsKFg1MDkgKngsIGludCBjcml0LCBpbnQgbGFzdHBvcykKKwl7CisJcmV0dXJuKFg1MDl2M19nZXRfZXh0X2J5X2NyaXRpY2FsKHgtPmNlcnRfaW5mby0+ZXh0ZW5zaW9ucyxjcml0LGxhc3Rwb3MpKTsKKwl9CisKK1g1MDlfRVhURU5TSU9OICpYNTA5X2dldF9leHQoWDUwOSAqeCwgaW50IGxvYykKKwl7CisJcmV0dXJuKFg1MDl2M19nZXRfZXh0KHgtPmNlcnRfaW5mby0+ZXh0ZW5zaW9ucyxsb2MpKTsKKwl9CisKK1g1MDlfRVhURU5TSU9OICpYNTA5X2RlbGV0ZV9leHQoWDUwOSAqeCwgaW50IGxvYykKKwl7CisJcmV0dXJuKFg1MDl2M19kZWxldGVfZXh0KHgtPmNlcnRfaW5mby0+ZXh0ZW5zaW9ucyxsb2MpKTsKKwl9CisKK2ludCBYNTA5X2FkZF9leHQoWDUwOSAqeCwgWDUwOV9FWFRFTlNJT04gKmV4LCBpbnQgbG9jKQorCXsKKwlyZXR1cm4oWDUwOXYzX2FkZF9leHQoJih4LT5jZXJ0X2luZm8tPmV4dGVuc2lvbnMpLGV4LGxvYykgIT0gTlVMTCk7CisJfQorCit2b2lkICpYNTA5X2dldF9leHRfZDJpKFg1MDkgKngsIGludCBuaWQsIGludCAqY3JpdCwgaW50ICppZHgpCit7CisJcmV0dXJuIFg1MDlWM19nZXRfZDJpKHgtPmNlcnRfaW5mby0+ZXh0ZW5zaW9ucywgbmlkLCBjcml0LCBpZHgpOworfQorCitpbnQgWDUwOV9hZGQxX2V4dF9pMmQoWDUwOSAqeCwgaW50IG5pZCwgdm9pZCAqdmFsdWUsIGludCBjcml0LAorCQkJCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJcmV0dXJuIFg1MDlWM19hZGQxX2kyZCgmeC0+Y2VydF9pbmZvLT5leHRlbnNpb25zLCBuaWQsIHZhbHVlLCBjcml0LAorCQkJCQkJCWZsYWdzKTsKK30KKworaW50IFg1MDlfUkVWT0tFRF9nZXRfZXh0X2NvdW50KFg1MDlfUkVWT0tFRCAqeCkKKwl7CisJcmV0dXJuKFg1MDl2M19nZXRfZXh0X2NvdW50KHgtPmV4dGVuc2lvbnMpKTsKKwl9CisKK2ludCBYNTA5X1JFVk9LRURfZ2V0X2V4dF9ieV9OSUQoWDUwOV9SRVZPS0VEICp4LCBpbnQgbmlkLCBpbnQgbGFzdHBvcykKKwl7CisJcmV0dXJuKFg1MDl2M19nZXRfZXh0X2J5X05JRCh4LT5leHRlbnNpb25zLG5pZCxsYXN0cG9zKSk7CisJfQorCitpbnQgWDUwOV9SRVZPS0VEX2dldF9leHRfYnlfT0JKKFg1MDlfUkVWT0tFRCAqeCwgQVNOMV9PQkpFQ1QgKm9iaiwKKwkgICAgIGludCBsYXN0cG9zKQorCXsKKwlyZXR1cm4oWDUwOXYzX2dldF9leHRfYnlfT0JKKHgtPmV4dGVuc2lvbnMsb2JqLGxhc3Rwb3MpKTsKKwl9CisKK2ludCBYNTA5X1JFVk9LRURfZ2V0X2V4dF9ieV9jcml0aWNhbChYNTA5X1JFVk9LRUQgKngsIGludCBjcml0LCBpbnQgbGFzdHBvcykKKwl7CisJcmV0dXJuKFg1MDl2M19nZXRfZXh0X2J5X2NyaXRpY2FsKHgtPmV4dGVuc2lvbnMsY3JpdCxsYXN0cG9zKSk7CisJfQorCitYNTA5X0VYVEVOU0lPTiAqWDUwOV9SRVZPS0VEX2dldF9leHQoWDUwOV9SRVZPS0VEICp4LCBpbnQgbG9jKQorCXsKKwlyZXR1cm4oWDUwOXYzX2dldF9leHQoeC0+ZXh0ZW5zaW9ucyxsb2MpKTsKKwl9CisKK1g1MDlfRVhURU5TSU9OICpYNTA5X1JFVk9LRURfZGVsZXRlX2V4dChYNTA5X1JFVk9LRUQgKngsIGludCBsb2MpCisJeworCXJldHVybihYNTA5djNfZGVsZXRlX2V4dCh4LT5leHRlbnNpb25zLGxvYykpOworCX0KKworaW50IFg1MDlfUkVWT0tFRF9hZGRfZXh0KFg1MDlfUkVWT0tFRCAqeCwgWDUwOV9FWFRFTlNJT04gKmV4LCBpbnQgbG9jKQorCXsKKwlyZXR1cm4oWDUwOXYzX2FkZF9leHQoJih4LT5leHRlbnNpb25zKSxleCxsb2MpICE9IE5VTEwpOworCX0KKwordm9pZCAqWDUwOV9SRVZPS0VEX2dldF9leHRfZDJpKFg1MDlfUkVWT0tFRCAqeCwgaW50IG5pZCwgaW50ICpjcml0LCBpbnQgKmlkeCkKK3sKKwlyZXR1cm4gWDUwOVYzX2dldF9kMmkoeC0+ZXh0ZW5zaW9ucywgbmlkLCBjcml0LCBpZHgpOworfQorCitpbnQgWDUwOV9SRVZPS0VEX2FkZDFfZXh0X2kyZChYNTA5X1JFVk9LRUQgKngsIGludCBuaWQsIHZvaWQgKnZhbHVlLCBpbnQgY3JpdCwKKwkJCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXJldHVybiBYNTA5VjNfYWRkMV9pMmQoJngtPmV4dGVuc2lvbnMsIG5pZCwgdmFsdWUsIGNyaXQsIGZsYWdzKTsKK30KKworSU1QTEVNRU5UX0FTTjFfU0VUX09GKFg1MDlfRVhURU5TSU9OKQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3g1MDkveDUwOV9sdS5jIGIvY3J5cHRvL3g1MDkveDUwOV9sdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZjJkODEKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOS94NTA5X2x1LmMKQEAgLTAsMCArMSw3NDIgQEAKKy8qIGNyeXB0by94NTA5L3g1MDlfbHUuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9saGFzaC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworCitYNTA5X0xPT0tVUCAqWDUwOV9MT09LVVBfbmV3KFg1MDlfTE9PS1VQX01FVEhPRCAqbWV0aG9kKQorCXsKKwlYNTA5X0xPT0tVUCAqcmV0OworCisJcmV0PShYNTA5X0xPT0tVUCAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihYNTA5X0xPT0tVUCkpOworCWlmIChyZXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKwlyZXQtPmluaXQ9MDsKKwlyZXQtPnNraXA9MDsKKwlyZXQtPm1ldGhvZD1tZXRob2Q7CisJcmV0LT5tZXRob2RfZGF0YT1OVUxMOworCXJldC0+c3RvcmVfY3R4PU5VTEw7CisJaWYgKChtZXRob2QtPm5ld19pdGVtICE9IE5VTEwpICYmICFtZXRob2QtPm5ld19pdGVtKHJldCkpCisJCXsKKwkJT1BFTlNTTF9mcmVlKHJldCk7CisJCXJldHVybiBOVUxMOworCQl9CisJcmV0dXJuIHJldDsKKwl9CisKK3ZvaWQgWDUwOV9MT09LVVBfZnJlZShYNTA5X0xPT0tVUCAqY3R4KQorCXsKKwlpZiAoY3R4ID09IE5VTEwpIHJldHVybjsKKwlpZiAoCShjdHgtPm1ldGhvZCAhPSBOVUxMKSAmJgorCQkoY3R4LT5tZXRob2QtPmZyZWUgIT0gTlVMTCkpCisJCSgqY3R4LT5tZXRob2QtPmZyZWUpKGN0eCk7CisJT1BFTlNTTF9mcmVlKGN0eCk7CisJfQorCitpbnQgWDUwOV9MT09LVVBfaW5pdChYNTA5X0xPT0tVUCAqY3R4KQorCXsKKwlpZiAoY3R4LT5tZXRob2QgPT0gTlVMTCkgcmV0dXJuIDA7CisJaWYgKGN0eC0+bWV0aG9kLT5pbml0ICE9IE5VTEwpCisJCXJldHVybiBjdHgtPm1ldGhvZC0+aW5pdChjdHgpOworCWVsc2UKKwkJcmV0dXJuIDE7CisJfQorCitpbnQgWDUwOV9MT09LVVBfc2h1dGRvd24oWDUwOV9MT09LVVAgKmN0eCkKKwl7CisJaWYgKGN0eC0+bWV0aG9kID09IE5VTEwpIHJldHVybiAwOworCWlmIChjdHgtPm1ldGhvZC0+c2h1dGRvd24gIT0gTlVMTCkKKwkJcmV0dXJuIGN0eC0+bWV0aG9kLT5zaHV0ZG93bihjdHgpOworCWVsc2UKKwkJcmV0dXJuIDE7CisJfQorCitpbnQgWDUwOV9MT09LVVBfY3RybChYNTA5X0xPT0tVUCAqY3R4LCBpbnQgY21kLCBjb25zdCBjaGFyICphcmdjLCBsb25nIGFyZ2wsCisJICAgICBjaGFyICoqcmV0KQorCXsKKwlpZiAoY3R4LT5tZXRob2QgPT0gTlVMTCkgcmV0dXJuIC0xOworCWlmIChjdHgtPm1ldGhvZC0+Y3RybCAhPSBOVUxMKQorCQlyZXR1cm4gY3R4LT5tZXRob2QtPmN0cmwoY3R4LGNtZCxhcmdjLGFyZ2wscmV0KTsKKwllbHNlCisJCXJldHVybiAxOworCX0KKworaW50IFg1MDlfTE9PS1VQX2J5X3N1YmplY3QoWDUwOV9MT09LVVAgKmN0eCwgaW50IHR5cGUsIFg1MDlfTkFNRSAqbmFtZSwKKwkgICAgIFg1MDlfT0JKRUNUICpyZXQpCisJeworCWlmICgoY3R4LT5tZXRob2QgPT0gTlVMTCkgfHwgKGN0eC0+bWV0aG9kLT5nZXRfYnlfc3ViamVjdCA9PSBOVUxMKSkKKwkJcmV0dXJuIFg1MDlfTFVfRkFJTDsKKwlpZiAoY3R4LT5za2lwKSByZXR1cm4gMDsKKwlyZXR1cm4gY3R4LT5tZXRob2QtPmdldF9ieV9zdWJqZWN0KGN0eCx0eXBlLG5hbWUscmV0KTsKKwl9CisKK2ludCBYNTA5X0xPT0tVUF9ieV9pc3N1ZXJfc2VyaWFsKFg1MDlfTE9PS1VQICpjdHgsIGludCB0eXBlLCBYNTA5X05BTUUgKm5hbWUsCisJICAgICBBU04xX0lOVEVHRVIgKnNlcmlhbCwgWDUwOV9PQkpFQ1QgKnJldCkKKwl7CisJaWYgKChjdHgtPm1ldGhvZCA9PSBOVUxMKSB8fAorCQkoY3R4LT5tZXRob2QtPmdldF9ieV9pc3N1ZXJfc2VyaWFsID09IE5VTEwpKQorCQlyZXR1cm4gWDUwOV9MVV9GQUlMOworCXJldHVybiBjdHgtPm1ldGhvZC0+Z2V0X2J5X2lzc3Vlcl9zZXJpYWwoY3R4LHR5cGUsbmFtZSxzZXJpYWwscmV0KTsKKwl9CisKK2ludCBYNTA5X0xPT0tVUF9ieV9maW5nZXJwcmludChYNTA5X0xPT0tVUCAqY3R4LCBpbnQgdHlwZSwKKwkgICAgIHVuc2lnbmVkIGNoYXIgKmJ5dGVzLCBpbnQgbGVuLCBYNTA5X09CSkVDVCAqcmV0KQorCXsKKwlpZiAoKGN0eC0+bWV0aG9kID09IE5VTEwpIHx8IChjdHgtPm1ldGhvZC0+Z2V0X2J5X2ZpbmdlcnByaW50ID09IE5VTEwpKQorCQlyZXR1cm4gWDUwOV9MVV9GQUlMOworCXJldHVybiBjdHgtPm1ldGhvZC0+Z2V0X2J5X2ZpbmdlcnByaW50KGN0eCx0eXBlLGJ5dGVzLGxlbixyZXQpOworCX0KKworaW50IFg1MDlfTE9PS1VQX2J5X2FsaWFzKFg1MDlfTE9PS1VQICpjdHgsIGludCB0eXBlLCBjaGFyICpzdHIsIGludCBsZW4sCisJICAgICBYNTA5X09CSkVDVCAqcmV0KQorCXsKKwlpZiAoKGN0eC0+bWV0aG9kID09IE5VTEwpIHx8IChjdHgtPm1ldGhvZC0+Z2V0X2J5X2FsaWFzID09IE5VTEwpKQorCQlyZXR1cm4gWDUwOV9MVV9GQUlMOworCXJldHVybiBjdHgtPm1ldGhvZC0+Z2V0X2J5X2FsaWFzKGN0eCx0eXBlLHN0cixsZW4scmV0KTsKKwl9CisKKyAgCitzdGF0aWMgaW50IHg1MDlfb2JqZWN0X2NtcChjb25zdCBYNTA5X09CSkVDVCAqKmEsIGNvbnN0IFg1MDlfT0JKRUNUICoqYikKKyAgCXsKKyAJaW50IHJldDsKKworIAlyZXQ9KCgqYSktPnR5cGUgLSAoKmIpLT50eXBlKTsKKyAJaWYgKHJldCkgcmV0dXJuIHJldDsKKyAJc3dpdGNoICgoKmEpLT50eXBlKQorIAkJeworIAljYXNlIFg1MDlfTFVfWDUwOToKKyAJCXJldD1YNTA5X3N1YmplY3RfbmFtZV9jbXAoKCphKS0+ZGF0YS54NTA5LCgqYiktPmRhdGEueDUwOSk7CisgCQlicmVhazsKKyAJY2FzZSBYNTA5X0xVX0NSTDoKKyAJCXJldD1YNTA5X0NSTF9jbXAoKCphKS0+ZGF0YS5jcmwsKCpiKS0+ZGF0YS5jcmwpOworIAkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogYWJvcnQoKTsgKi8KKwkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gcmV0OworCX0KKworWDUwOV9TVE9SRSAqWDUwOV9TVE9SRV9uZXcodm9pZCkKKwl7CisJWDUwOV9TVE9SRSAqcmV0OworCisJaWYgKChyZXQ9KFg1MDlfU1RPUkUgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoWDUwOV9TVE9SRSkpKSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlyZXQtPm9ianMgPSBza19YNTA5X09CSkVDVF9uZXcoeDUwOV9vYmplY3RfY21wKTsKKwlyZXQtPmNhY2hlPTE7CisJcmV0LT5nZXRfY2VydF9tZXRob2RzPXNrX1g1MDlfTE9PS1VQX25ld19udWxsKCk7CisJcmV0LT52ZXJpZnk9MDsKKwlyZXQtPnZlcmlmeV9jYj0wOworCisJaWYgKChyZXQtPnBhcmFtID0gWDUwOV9WRVJJRllfUEFSQU1fbmV3KCkpID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJcmV0LT5nZXRfaXNzdWVyID0gMDsKKwlyZXQtPmNoZWNrX2lzc3VlZCA9IDA7CisJcmV0LT5jaGVja19yZXZvY2F0aW9uID0gMDsKKwlyZXQtPmdldF9jcmwgPSAwOworCXJldC0+Y2hlY2tfY3JsID0gMDsKKwlyZXQtPmNlcnRfY3JsID0gMDsKKwlyZXQtPmxvb2t1cF9jZXJ0cyA9IDA7CisJcmV0LT5sb29rdXBfY3JscyA9IDA7CisJcmV0LT5jbGVhbnVwID0gMDsKKworCWlmICghQ1JZUFRPX25ld19leF9kYXRhKENSWVBUT19FWF9JTkRFWF9YNTA5X1NUT1JFLCByZXQsICZyZXQtPmV4X2RhdGEpKQorCQl7CisJCXNrX1g1MDlfT0JKRUNUX2ZyZWUocmV0LT5vYmpzKTsKKwkJT1BFTlNTTF9mcmVlKHJldCk7CisJCXJldHVybiBOVUxMOworCQl9CisKKwlyZXQtPnJlZmVyZW5jZXM9MTsKKwlyZXR1cm4gcmV0OworCX0KKworc3RhdGljIHZvaWQgY2xlYW51cChYNTA5X09CSkVDVCAqYSkKKwl7CisJaWYgKGEtPnR5cGUgPT0gWDUwOV9MVV9YNTA5KQorCQl7CisJCVg1MDlfZnJlZShhLT5kYXRhLng1MDkpOworCQl9CisJZWxzZSBpZiAoYS0+dHlwZSA9PSBYNTA5X0xVX0NSTCkKKwkJeworCQlYNTA5X0NSTF9mcmVlKGEtPmRhdGEuY3JsKTsKKwkJfQorCWVsc2UKKwkJeworCQkvKiBhYm9ydCgpOyAqLworCQl9CisKKwlPUEVOU1NMX2ZyZWUoYSk7CisJfQorCit2b2lkIFg1MDlfU1RPUkVfZnJlZShYNTA5X1NUT1JFICp2ZnkpCisJeworCWludCBpOworCXNpemVfdCBqOworCVNUQUNLX09GKFg1MDlfTE9PS1VQKSAqc2s7CisJWDUwOV9MT09LVVAgKmx1OworCisJaWYgKHZmeSA9PSBOVUxMKQorCSAgICByZXR1cm47CisKKwlpPUNSWVBUT19hZGQoJnZmeS0+cmVmZXJlbmNlcywtMSxDUllQVE9fTE9DS19YNTA5X1NUT1JFKTsKKyNpZmRlZiBSRUZfUFJJTlQKKwlSRUZfUFJJTlQoIlg1MDlfU1RPUkUiLHZmeSk7CisjZW5kaWYKKwlpZiAoaSA+IDApIHJldHVybjsKKyNpZmRlZiBSRUZfQ0hFQ0sKKwlpZiAoaSA8IDApCisJCXsKKwkJZnByaW50ZihzdGRlcnIsIlg1MDlfU1RPUkVfZnJlZSwgYmFkIHJlZmVyZW5jZSBjb3VudFxuIik7CisJCWFib3J0KCk7IC8qIG9rICovCisJCX0KKyNlbmRpZgorCisJc2s9dmZ5LT5nZXRfY2VydF9tZXRob2RzOworCWZvciAoaj0wOyBqPHNrX1g1MDlfTE9PS1VQX251bShzayk7IGorKykKKwkJeworCQlsdT1za19YNTA5X0xPT0tVUF92YWx1ZShzayxqKTsKKwkJWDUwOV9MT09LVVBfc2h1dGRvd24obHUpOworCQlYNTA5X0xPT0tVUF9mcmVlKGx1KTsKKwkJfQorCXNrX1g1MDlfTE9PS1VQX2ZyZWUoc2spOworCXNrX1g1MDlfT0JKRUNUX3BvcF9mcmVlKHZmeS0+b2JqcywgY2xlYW51cCk7CisKKwlDUllQVE9fZnJlZV9leF9kYXRhKENSWVBUT19FWF9JTkRFWF9YNTA5X1NUT1JFLCB2ZnksICZ2ZnktPmV4X2RhdGEpOworCWlmICh2ZnktPnBhcmFtKQorCQlYNTA5X1ZFUklGWV9QQVJBTV9mcmVlKHZmeS0+cGFyYW0pOworCU9QRU5TU0xfZnJlZSh2ZnkpOworCX0KKworWDUwOV9MT09LVVAgKlg1MDlfU1RPUkVfYWRkX2xvb2t1cChYNTA5X1NUT1JFICp2LCBYNTA5X0xPT0tVUF9NRVRIT0QgKm0pCisJeworCXNpemVfdCBpOworCVNUQUNLX09GKFg1MDlfTE9PS1VQKSAqc2s7CisJWDUwOV9MT09LVVAgKmx1OworCisJc2s9di0+Z2V0X2NlcnRfbWV0aG9kczsKKwlmb3IgKGk9MDsgaTxza19YNTA5X0xPT0tVUF9udW0oc2spOyBpKyspCisJCXsKKwkJbHU9c2tfWDUwOV9MT09LVVBfdmFsdWUoc2ssaSk7CisJCWlmIChtID09IGx1LT5tZXRob2QpCisJCQl7CisJCQlyZXR1cm4gbHU7CisJCQl9CisJCX0KKwkvKiBhIG5ldyBvbmUgKi8KKwlsdT1YNTA5X0xPT0tVUF9uZXcobSk7CisJaWYgKGx1ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCWVsc2UKKwkJeworCQlsdS0+c3RvcmVfY3R4PXY7CisJCWlmIChza19YNTA5X0xPT0tVUF9wdXNoKHYtPmdldF9jZXJ0X21ldGhvZHMsbHUpKQorCQkJcmV0dXJuIGx1OworCQllbHNlCisJCQl7CisJCQlYNTA5X0xPT0tVUF9mcmVlKGx1KTsKKwkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisJfQorCitpbnQgWDUwOV9TVE9SRV9nZXRfYnlfc3ViamVjdChYNTA5X1NUT1JFX0NUWCAqdnMsIGludCB0eXBlLCBYNTA5X05BTUUgKm5hbWUsCisJICAgICBYNTA5X09CSkVDVCAqcmV0KQorCXsKKwlYNTA5X1NUT1JFICpjdHg9dnMtPmN0eDsKKwlYNTA5X0xPT0tVUCAqbHU7CisJWDUwOV9PQkpFQ1Qgc3RtcCwqdG1wOworCWludCBpLGo7CisKKwlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX1g1MDlfU1RPUkUpOworCXRtcD1YNTA5X09CSkVDVF9yZXRyaWV2ZV9ieV9zdWJqZWN0KGN0eC0+b2Jqcyx0eXBlLG5hbWUpOworCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19YNTA5X1NUT1JFKTsKKworCWlmICh0bXAgPT0gTlVMTCB8fCB0eXBlID09IFg1MDlfTFVfQ1JMKQorCQl7CisJCWZvciAoaT12cy0+Y3VycmVudF9tZXRob2Q7IGk8KGludClza19YNTA5X0xPT0tVUF9udW0oY3R4LT5nZXRfY2VydF9tZXRob2RzKTsgaSsrKQorCQkJeworCQkJbHU9c2tfWDUwOV9MT09LVVBfdmFsdWUoY3R4LT5nZXRfY2VydF9tZXRob2RzLGkpOworCQkJaj1YNTA5X0xPT0tVUF9ieV9zdWJqZWN0KGx1LHR5cGUsbmFtZSwmc3RtcCk7CisJCQlpZiAoaiA8IDApCisJCQkJeworCQkJCXZzLT5jdXJyZW50X21ldGhvZD1qOworCQkJCXJldHVybiBqOworCQkJCX0KKwkJCWVsc2UgaWYgKGopCisJCQkJeworCQkJCXRtcD0gJnN0bXA7CisJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl2cy0+Y3VycmVudF9tZXRob2Q9MDsKKwkJaWYgKHRtcCA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCX0KKworLyoJaWYgKHJldC0+ZGF0YS5wdHIgIT0gTlVMTCkKKwkJWDUwOV9PQkpFQ1RfZnJlZV9jb250ZW50cyhyZXQpOyAqLworCisJcmV0LT50eXBlPXRtcC0+dHlwZTsKKwlyZXQtPmRhdGEucHRyPXRtcC0+ZGF0YS5wdHI7CisKKwlYNTA5X09CSkVDVF91cF9yZWZfY291bnQocmV0KTsKKworCXJldHVybiAxOworCX0KKworaW50IFg1MDlfU1RPUkVfYWRkX2NlcnQoWDUwOV9TVE9SRSAqY3R4LCBYNTA5ICp4KQorCXsKKwlYNTA5X09CSkVDVCAqb2JqOworCWludCByZXQ9MTsKKworCWlmICh4ID09IE5VTEwpIHJldHVybiAwOworCW9iaj0oWDUwOV9PQkpFQ1QgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoWDUwOV9PQkpFQ1QpKTsKKwlpZiAob2JqID09IE5VTEwpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9TVE9SRV9hZGRfY2VydCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gMDsKKwkJfQorCW9iai0+dHlwZT1YNTA5X0xVX1g1MDk7CisJb2JqLT5kYXRhLng1MDk9eDsKKworCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfWDUwOV9TVE9SRSk7CisKKwlYNTA5X09CSkVDVF91cF9yZWZfY291bnQob2JqKTsKKworCWlmIChYNTA5X09CSkVDVF9yZXRyaWV2ZV9tYXRjaChjdHgtPm9ianMsIG9iaikpCisJCXsKKwkJWDUwOV9PQkpFQ1RfZnJlZV9jb250ZW50cyhvYmopOworCQlPUEVOU1NMX2ZyZWUob2JqKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9TVE9SRV9hZGRfY2VydCwgWDUwOV9SX0NFUlRfQUxSRUFEWV9JTl9IQVNIX1RBQkxFKTsKKwkJcmV0PTA7CisJCX0gCisJZWxzZSBza19YNTA5X09CSkVDVF9wdXNoKGN0eC0+b2Jqcywgb2JqKTsKKworCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19YNTA5X1NUT1JFKTsKKworCXJldHVybiByZXQ7CisJfQorCitpbnQgWDUwOV9TVE9SRV9hZGRfY3JsKFg1MDlfU1RPUkUgKmN0eCwgWDUwOV9DUkwgKngpCisJeworCVg1MDlfT0JKRUNUICpvYmo7CisJaW50IHJldD0xOworCisJaWYgKHggPT0gTlVMTCkgcmV0dXJuIDA7CisJb2JqPShYNTA5X09CSkVDVCAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihYNTA5X09CSkVDVCkpOworCWlmIChvYmogPT0gTlVMTCkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1NUT1JFX2FkZF9jcmwsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlvYmotPnR5cGU9WDUwOV9MVV9DUkw7CisJb2JqLT5kYXRhLmNybD14OworCisJQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19YNTA5X1NUT1JFKTsKKworCVg1MDlfT0JKRUNUX3VwX3JlZl9jb3VudChvYmopOworCisJaWYgKFg1MDlfT0JKRUNUX3JldHJpZXZlX21hdGNoKGN0eC0+b2Jqcywgb2JqKSkKKwkJeworCQlYNTA5X09CSkVDVF9mcmVlX2NvbnRlbnRzKG9iaik7CisJCU9QRU5TU0xfZnJlZShvYmopOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1NUT1JFX2FkZF9jcmwsIFg1MDlfUl9DRVJUX0FMUkVBRFlfSU5fSEFTSF9UQUJMRSk7CisJCXJldD0wOworCQl9CisJZWxzZSBza19YNTA5X09CSkVDVF9wdXNoKGN0eC0+b2Jqcywgb2JqKTsKKworCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19YNTA5X1NUT1JFKTsKKworCXJldHVybiByZXQ7CisJfQorCit2b2lkIFg1MDlfT0JKRUNUX3VwX3JlZl9jb3VudChYNTA5X09CSkVDVCAqYSkKKwl7CisJc3dpdGNoIChhLT50eXBlKQorCQl7CisJY2FzZSBYNTA5X0xVX1g1MDk6CisJCUNSWVBUT19hZGQoJmEtPmRhdGEueDUwOS0+cmVmZXJlbmNlcywxLENSWVBUT19MT0NLX1g1MDkpOworCQlicmVhazsKKwljYXNlIFg1MDlfTFVfQ1JMOgorCQlDUllQVE9fYWRkKCZhLT5kYXRhLmNybC0+cmVmZXJlbmNlcywxLENSWVBUT19MT0NLX1g1MDlfQ1JMKTsKKwkJYnJlYWs7CisJCX0KKwl9CisKK3ZvaWQgWDUwOV9PQkpFQ1RfZnJlZV9jb250ZW50cyhYNTA5X09CSkVDVCAqYSkKKwl7CisJc3dpdGNoIChhLT50eXBlKQorCQl7CisJY2FzZSBYNTA5X0xVX1g1MDk6CisJCVg1MDlfZnJlZShhLT5kYXRhLng1MDkpOworCQlicmVhazsKKwljYXNlIFg1MDlfTFVfQ1JMOgorCQlYNTA5X0NSTF9mcmVlKGEtPmRhdGEuY3JsKTsKKwkJYnJlYWs7CisJCX0KKwl9CisKK3N0YXRpYyBpbnQgeDUwOV9vYmplY3RfaWR4X2NudChTVEFDS19PRihYNTA5X09CSkVDVCkgKmgsIGludCB0eXBlLAorCSAgICAgWDUwOV9OQU1FICpuYW1lLCBpbnQgKnBubWF0Y2gpCisJeworCVg1MDlfT0JKRUNUIHN0bXA7CisJWDUwOSB4NTA5X3M7CisJWDUwOV9DSU5GIGNpbmZfczsKKwlYNTA5X0NSTCBjcmxfczsKKwlYNTA5X0NSTF9JTkZPIGNybF9pbmZvX3M7CisJc2l6ZV90IGlkeDsKKworCXN0bXAudHlwZT10eXBlOworCXN3aXRjaCAodHlwZSkKKwkJeworCWNhc2UgWDUwOV9MVV9YNTA5OgorCQlzdG1wLmRhdGEueDUwOT0gJng1MDlfczsKKwkJeDUwOV9zLmNlcnRfaW5mbz0gJmNpbmZfczsKKwkJY2luZl9zLnN1YmplY3Q9bmFtZTsKKwkJYnJlYWs7CisJY2FzZSBYNTA5X0xVX0NSTDoKKwkJc3RtcC5kYXRhLmNybD0gJmNybF9zOworCQljcmxfcy5jcmw9ICZjcmxfaW5mb19zOworCQljcmxfaW5mb19zLmlzc3Vlcj1uYW1lOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBhYm9ydCgpOyAqLworCQlyZXR1cm4gLTE7CisJCX0KKworCWlkeCA9IC0xOworCWlmIChza19YNTA5X09CSkVDVF9maW5kKGgsICZpZHgsICZzdG1wKSAmJiBwbm1hdGNoKQorCQl7CisJCWludCB0aWR4OworCQljb25zdCBYNTA5X09CSkVDVCAqdG9iaiwgKnBzdG1wOworCQkqcG5tYXRjaCA9IDE7CisJCXBzdG1wID0gJnN0bXA7CisJCWZvciAodGlkeCA9IGlkeCArIDE7IHRpZHggPCAoaW50KXNrX1g1MDlfT0JKRUNUX251bShoKTsgdGlkeCsrKQorCQkJeworCQkJdG9iaiA9IHNrX1g1MDlfT0JKRUNUX3ZhbHVlKGgsIHRpZHgpOworCQkJaWYgKHg1MDlfb2JqZWN0X2NtcCgmdG9iaiwgJnBzdG1wKSkKKwkJCQlicmVhazsKKwkJCSgqcG5tYXRjaCkrKzsKKwkJCX0KKwkJfQorCisJcmV0dXJuIGlkeDsKKwl9CisKKworaW50IFg1MDlfT0JKRUNUX2lkeF9ieV9zdWJqZWN0KFNUQUNLX09GKFg1MDlfT0JKRUNUKSAqaCwgaW50IHR5cGUsCisJICAgICBYNTA5X05BTUUgKm5hbWUpCisJeworCXJldHVybiB4NTA5X29iamVjdF9pZHhfY250KGgsIHR5cGUsIG5hbWUsIE5VTEwpOworCX0KKworWDUwOV9PQkpFQ1QgKlg1MDlfT0JKRUNUX3JldHJpZXZlX2J5X3N1YmplY3QoU1RBQ0tfT0YoWDUwOV9PQkpFQ1QpICpoLCBpbnQgdHlwZSwKKwkgICAgIFg1MDlfTkFNRSAqbmFtZSkKKwl7CisJaW50IGlkeDsKKwlpZHggPSBYNTA5X09CSkVDVF9pZHhfYnlfc3ViamVjdChoLCB0eXBlLCBuYW1lKTsKKwlpZiAoaWR4PT0tMSkgcmV0dXJuIE5VTEw7CisJcmV0dXJuIHNrX1g1MDlfT0JKRUNUX3ZhbHVlKGgsIGlkeCk7CisJfQorCitTVEFDS19PRihYNTA5KSogWDUwOV9TVE9SRV9nZXQxX2NlcnRzKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDlfTkFNRSAqbm0pCisJeworCWludCBpLCBpZHgsIGNudDsKKwlTVEFDS19PRihYNTA5KSAqc2s7CisJWDUwOSAqeDsKKwlYNTA5X09CSkVDVCAqb2JqOworCXNrID0gc2tfWDUwOV9uZXdfbnVsbCgpOworCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfWDUwOV9TVE9SRSk7CisJaWR4ID0geDUwOV9vYmplY3RfaWR4X2NudChjdHgtPmN0eC0+b2JqcywgWDUwOV9MVV9YNTA5LCBubSwgJmNudCk7CisJaWYgKGlkeCA8IDApCisJCXsKKwkJLyogTm90aGluZyBmb3VuZCBpbiBjYWNoZTogZG8gbG9va3VwIHRvIHBvc3NpYmx5IGFkZCBuZXcKKwkJICogb2JqZWN0cyB0byBjYWNoZQorCQkgKi8KKwkJWDUwOV9PQkpFQ1QgeG9iajsKKwkJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1g1MDlfU1RPUkUpOworCQlpZiAoIVg1MDlfU1RPUkVfZ2V0X2J5X3N1YmplY3QoY3R4LCBYNTA5X0xVX1g1MDksIG5tLCAmeG9iaikpCisJCQl7CisJCQlza19YNTA5X2ZyZWUoc2spOworCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCVg1MDlfT0JKRUNUX2ZyZWVfY29udGVudHMoJnhvYmopOworCQlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX1g1MDlfU1RPUkUpOworCQlpZHggPSB4NTA5X29iamVjdF9pZHhfY250KGN0eC0+Y3R4LT5vYmpzLFg1MDlfTFVfWDUwOSxubSwgJmNudCk7CisJCWlmIChpZHggPCAwKQorCQkJeworCQkJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1g1MDlfU1RPUkUpOworCQkJc2tfWDUwOV9mcmVlKHNrKTsKKwkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrLCBpZHgrKykKKwkJeworCQlvYmogPSBza19YNTA5X09CSkVDVF92YWx1ZShjdHgtPmN0eC0+b2JqcywgaWR4KTsKKwkJeCA9IG9iai0+ZGF0YS54NTA5OworCQlDUllQVE9fYWRkKCZ4LT5yZWZlcmVuY2VzLCAxLCBDUllQVE9fTE9DS19YNTA5KTsKKwkJaWYgKCFza19YNTA5X3B1c2goc2ssIHgpKQorCQkJeworCQkJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1g1MDlfU1RPUkUpOworCQkJWDUwOV9mcmVlKHgpOworCQkJc2tfWDUwOV9wb3BfZnJlZShzaywgWDUwOV9mcmVlKTsKKwkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1g1MDlfU1RPUkUpOworCXJldHVybiBzazsKKworCX0KKworU1RBQ0tfT0YoWDUwOV9DUkwpKiBYNTA5X1NUT1JFX2dldDFfY3JscyhYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5X05BTUUgKm5tKQorCXsKKwlpbnQgaSwgaWR4LCBjbnQ7CisJU1RBQ0tfT0YoWDUwOV9DUkwpICpzazsKKwlYNTA5X0NSTCAqeDsKKwlYNTA5X09CSkVDVCAqb2JqLCB4b2JqOworCXNrID0gc2tfWDUwOV9DUkxfbmV3X251bGwoKTsKKwlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX1g1MDlfU1RPUkUpOworCS8qIENoZWNrIGNhY2hlIGZpcnN0ICovCisJaWR4ID0geDUwOV9vYmplY3RfaWR4X2NudChjdHgtPmN0eC0+b2JqcywgWDUwOV9MVV9DUkwsIG5tLCAmY250KTsKKworCS8qIEFsd2F5cyBkbyBsb29rdXAgdG8gcG9zc2libHkgYWRkIG5ldyBDUkxzIHRvIGNhY2hlCisJICovCisJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1g1MDlfU1RPUkUpOworCWlmICghWDUwOV9TVE9SRV9nZXRfYnlfc3ViamVjdChjdHgsIFg1MDlfTFVfQ1JMLCBubSwgJnhvYmopKQorCQl7CisJCXNrX1g1MDlfQ1JMX2ZyZWUoc2spOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCVg1MDlfT0JKRUNUX2ZyZWVfY29udGVudHMoJnhvYmopOworCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfWDUwOV9TVE9SRSk7CisJaWR4ID0geDUwOV9vYmplY3RfaWR4X2NudChjdHgtPmN0eC0+b2JqcyxYNTA5X0xVX0NSTCwgbm0sICZjbnQpOworCWlmIChpZHggPCAwKQorCQl7CisJCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19YNTA5X1NUT1JFKTsKKwkJc2tfWDUwOV9DUkxfZnJlZShzayk7CisJCXJldHVybiBOVUxMOworCQl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyssIGlkeCsrKQorCQl7CisJCW9iaiA9IHNrX1g1MDlfT0JKRUNUX3ZhbHVlKGN0eC0+Y3R4LT5vYmpzLCBpZHgpOworCQl4ID0gb2JqLT5kYXRhLmNybDsKKwkJQ1JZUFRPX2FkZCgmeC0+cmVmZXJlbmNlcywgMSwgQ1JZUFRPX0xPQ0tfWDUwOV9DUkwpOworCQlpZiAoIXNrX1g1MDlfQ1JMX3B1c2goc2ssIHgpKQorCQkJeworCQkJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1g1MDlfU1RPUkUpOworCQkJWDUwOV9DUkxfZnJlZSh4KTsKKwkJCXNrX1g1MDlfQ1JMX3BvcF9mcmVlKHNrLCBYNTA5X0NSTF9mcmVlKTsKKwkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1g1MDlfU1RPUkUpOworCXJldHVybiBzazsKKwl9CisKK1g1MDlfT0JKRUNUICpYNTA5X09CSkVDVF9yZXRyaWV2ZV9tYXRjaChTVEFDS19PRihYNTA5X09CSkVDVCkgKmgsIFg1MDlfT0JKRUNUICp4KQorCXsKKwlzaXplX3QgaWR4LCBpOworCVg1MDlfT0JKRUNUICpvYmo7CisKKwlpZiAoIXNrX1g1MDlfT0JKRUNUX2ZpbmQoaCwgJmlkeCwgeCkpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmICgoeC0+dHlwZSAhPSBYNTA5X0xVX1g1MDkpICYmICh4LT50eXBlICE9IFg1MDlfTFVfQ1JMKSkKKwkJcmV0dXJuIHNrX1g1MDlfT0JKRUNUX3ZhbHVlKGgsIGlkeCk7CisJZm9yIChpID0gaWR4OyBpIDwgc2tfWDUwOV9PQkpFQ1RfbnVtKGgpOyBpKyspCisJCXsKKwkJb2JqID0gc2tfWDUwOV9PQkpFQ1RfdmFsdWUoaCwgaSk7CisJCWlmICh4NTA5X29iamVjdF9jbXAoKGNvbnN0IFg1MDlfT0JKRUNUICoqKSZvYmosIChjb25zdCBYNTA5X09CSkVDVCAqKikmeCkpCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKHgtPnR5cGUgPT0gWDUwOV9MVV9YNTA5KQorCQkJeworCQkJaWYgKCFYNTA5X2NtcChvYmotPmRhdGEueDUwOSwgeC0+ZGF0YS54NTA5KSkKKwkJCQlyZXR1cm4gb2JqOworCQkJfQorCQllbHNlIGlmICh4LT50eXBlID09IFg1MDlfTFVfQ1JMKQorCQkJeworCQkJaWYgKCFYNTA5X0NSTF9tYXRjaChvYmotPmRhdGEuY3JsLCB4LT5kYXRhLmNybCkpCisJCQkJcmV0dXJuIG9iajsKKwkJCX0KKwkJZWxzZQorCQkJcmV0dXJuIG9iajsKKwkJfQorCXJldHVybiBOVUxMOworCX0KKworCisvKiBUcnkgdG8gZ2V0IGlzc3VlciBjZXJ0aWZpY2F0ZSBmcm9tIHN0b3JlLiBEdWUgdG8gbGltaXRhdGlvbnMKKyAqIG9mIHRoZSBBUEkgdGhpcyBjYW4gb25seSByZXRyaWV2ZSBhIHNpbmdsZSBjZXJ0aWZpY2F0ZSBtYXRjaGluZworICogYSBnaXZlbiBzdWJqZWN0IG5hbWUuIEhvd2V2ZXIgaXQgd2lsbCBmaWxsIHRoZSBjYWNoZSB3aXRoIGFsbAorICogbWF0Y2hpbmcgY2VydGlmaWNhdGVzLCBzbyB3ZSBjYW4gZXhhbWluZSB0aGUgY2FjaGUgZm9yIGFsbAorICogbWF0Y2hlcy4KKyAqCisgKiBSZXR1cm4gdmFsdWVzIGFyZToKKyAqICAxIGxvb2t1cCBzdWNjZXNzZnVsLgorICogIDAgY2VydGlmaWNhdGUgbm90IGZvdW5kLgorICogLTEgc29tZSBvdGhlciBlcnJvci4KKyAqLworaW50IFg1MDlfU1RPUkVfQ1RYX2dldDFfaXNzdWVyKFg1MDkgKippc3N1ZXIsIFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDkgKngpCisJeworCVg1MDlfTkFNRSAqeG47CisJWDUwOV9PQkpFQ1Qgb2JqLCAqcG9iajsKKwlpbnQgb2ssIGlkeCwgcmV0OworCXNpemVfdCBpOworCXhuPVg1MDlfZ2V0X2lzc3Vlcl9uYW1lKHgpOworCW9rPVg1MDlfU1RPUkVfZ2V0X2J5X3N1YmplY3QoY3R4LFg1MDlfTFVfWDUwOSx4biwmb2JqKTsKKwlpZiAob2sgIT0gWDUwOV9MVV9YNTA5KQorCQl7CisJCWlmIChvayA9PSBYNTA5X0xVX1JFVFJZKQorCQkJeworCQkJWDUwOV9PQkpFQ1RfZnJlZV9jb250ZW50cygmb2JqKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfU1RPUkVfQ1RYX2dldDFfaXNzdWVyLCBYNTA5X1JfU0hPVUxEX1JFVFJZKTsKKwkJCXJldHVybiAtMTsKKwkJCX0KKwkJZWxzZSBpZiAob2sgIT0gWDUwOV9MVV9GQUlMKQorCQkJeworCQkJWDUwOV9PQkpFQ1RfZnJlZV9jb250ZW50cygmb2JqKTsKKwkJCS8qIG5vdCBnb29kIDotKCwgYnJlYWsgYW55d2F5ICovCisJCQlyZXR1cm4gLTE7CisJCQl9CisJCXJldHVybiAwOworCQl9CisJLyogSWYgY2VydGlmaWNhdGUgbWF0Y2hlcyBhbGwgT0sgKi8KKwlpZiAoY3R4LT5jaGVja19pc3N1ZWQoY3R4LCB4LCBvYmouZGF0YS54NTA5KSkKKwkJeworCQkqaXNzdWVyID0gb2JqLmRhdGEueDUwOTsKKwkJcmV0dXJuIDE7CisJCX0KKwlYNTA5X09CSkVDVF9mcmVlX2NvbnRlbnRzKCZvYmopOworCisJLyogRWxzZSBmaW5kIGluZGV4IG9mIGZpcnN0IGNlcnQgYWNjZXB0ZWQgYnkgJ2NoZWNrX2lzc3VlZCcgKi8KKwlyZXQgPSAwOworCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfWDUwOV9TVE9SRSk7CisJaWR4ID0gWDUwOV9PQkpFQ1RfaWR4X2J5X3N1YmplY3QoY3R4LT5jdHgtPm9ianMsIFg1MDlfTFVfWDUwOSwgeG4pOworCWlmIChpZHggIT0gLTEpIC8qIHNob3VsZCBiZSB0cnVlIGFzIHdlJ3ZlIGhhZCBhdCBsZWFzdCBvbmUgbWF0Y2ggKi8KKwkJeworCQkvKiBMb29rIHRocm91Z2ggYWxsIG1hdGNoaW5nIGNlcnRzIGZvciBzdWl0YWJsZSBpc3N1ZXIgKi8KKwkJZm9yIChpID0gaWR4OyBpIDwgc2tfWDUwOV9PQkpFQ1RfbnVtKGN0eC0+Y3R4LT5vYmpzKTsgaSsrKQorCQkJeworCQkJcG9iaiA9IHNrX1g1MDlfT0JKRUNUX3ZhbHVlKGN0eC0+Y3R4LT5vYmpzLCBpKTsKKwkJCS8qIFNlZSBpZiB3ZSd2ZSBydW4gcGFzdCB0aGUgbWF0Y2hlcyAqLworCQkJaWYgKHBvYmotPnR5cGUgIT0gWDUwOV9MVV9YNTA5KQorCQkJCWJyZWFrOworCQkJaWYgKFg1MDlfTkFNRV9jbXAoeG4sIFg1MDlfZ2V0X3N1YmplY3RfbmFtZShwb2JqLT5kYXRhLng1MDkpKSkKKwkJCQlicmVhazsKKwkJCWlmIChjdHgtPmNoZWNrX2lzc3VlZChjdHgsIHgsIHBvYmotPmRhdGEueDUwOSkpCisJCQkJeworCQkJCSppc3N1ZXIgPSBwb2JqLT5kYXRhLng1MDk7CisJCQkJWDUwOV9PQkpFQ1RfdXBfcmVmX2NvdW50KHBvYmopOworCQkJCXJldCA9IDE7CisJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1g1MDlfU1RPUkUpOworCXJldHVybiByZXQ7CisJfQorCitpbnQgWDUwOV9TVE9SRV9zZXRfZmxhZ3MoWDUwOV9TVE9SRSAqY3R4LCB1bnNpZ25lZCBsb25nIGZsYWdzKQorCXsKKwlyZXR1cm4gWDUwOV9WRVJJRllfUEFSQU1fc2V0X2ZsYWdzKGN0eC0+cGFyYW0sIGZsYWdzKTsKKwl9CisKK2ludCBYNTA5X1NUT1JFX3NldF9kZXB0aChYNTA5X1NUT1JFICpjdHgsIGludCBkZXB0aCkKKwl7CisJWDUwOV9WRVJJRllfUEFSQU1fc2V0X2RlcHRoKGN0eC0+cGFyYW0sIGRlcHRoKTsKKwlyZXR1cm4gMTsKKwl9CisKK2ludCBYNTA5X1NUT1JFX3NldF9wdXJwb3NlKFg1MDlfU1RPUkUgKmN0eCwgaW50IHB1cnBvc2UpCisJeworCXJldHVybiBYNTA5X1ZFUklGWV9QQVJBTV9zZXRfcHVycG9zZShjdHgtPnBhcmFtLCBwdXJwb3NlKTsKKwl9CisKK2ludCBYNTA5X1NUT1JFX3NldF90cnVzdChYNTA5X1NUT1JFICpjdHgsIGludCB0cnVzdCkKKwl7CisJcmV0dXJuIFg1MDlfVkVSSUZZX1BBUkFNX3NldF90cnVzdChjdHgtPnBhcmFtLCB0cnVzdCk7CisJfQorCitpbnQgWDUwOV9TVE9SRV9zZXQxX3BhcmFtKFg1MDlfU1RPUkUgKmN0eCwgWDUwOV9WRVJJRllfUEFSQU0gKnBhcmFtKQorCXsKKwlyZXR1cm4gWDUwOV9WRVJJRllfUEFSQU1fc2V0MShjdHgtPnBhcmFtLCBwYXJhbSk7CisJfQorCit2b2lkIFg1MDlfU1RPUkVfc2V0X3ZlcmlmeV9jYihYNTA5X1NUT1JFICpjdHgsCisJCQkJICBpbnQgKCp2ZXJpZnlfY2IpKGludCwgWDUwOV9TVE9SRV9DVFggKikpCisJeworCWN0eC0+dmVyaWZ5X2NiID0gdmVyaWZ5X2NiOworCX0KKwordm9pZCBYNTA5X1NUT1JFX3NldF9sb29rdXBfY3Jsc19jYihYNTA5X1NUT1JFICpjdHgsCisJCVNUQUNLX09GKFg1MDlfQ1JMKSogKCpjYikoWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOV9OQU1FICpubSkpCisJeworCWN0eC0+bG9va3VwX2NybHMgPSBjYjsKKwl9CisKK1g1MDlfU1RPUkUgKlg1MDlfU1RPUkVfQ1RYX2dldDBfc3RvcmUoWDUwOV9TVE9SRV9DVFggKmN0eCkKKwl7CisJcmV0dXJuIGN0eC0+Y3R4OworCX0KZGlmZiAtLWdpdCBhL2NyeXB0by94NTA5L3g1MDlfb2JqLmMgYi9jcnlwdG8veDUwOS94NTA5X29iai5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNDEwOGMKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOS94NTA5X29iai5jCkBAIC0wLDAgKzEsMjI2IEBACisvKiBjcnlwdG8veDUwOS94NTA5X29iai5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9idWYuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbGhhc2guaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKKworY2hhciAqWDUwOV9OQU1FX29uZWxpbmUoWDUwOV9OQU1FICphLCBjaGFyICpidWYsIGludCBsZW4pCisJeworCVg1MDlfTkFNRV9FTlRSWSAqbmU7CisJc2l6ZV90IGk7CisJaW50IG4sbG9sZCxsLGwxLGwyLG51bSxqLHR5cGU7CisJY29uc3QgY2hhciAqczsKKwljaGFyICpwOworCXVuc2lnbmVkIGNoYXIgKnE7CisJQlVGX01FTSAqYj1OVUxMOworCXN0YXRpYyBjb25zdCBjaGFyIGhleFsxN109IjAxMjM0NTY3ODlBQkNERUYiOworCWludCBnc19kb2l0WzRdOworCWNoYXIgdG1wX2J1Zls4MF07CisjaWZkZWYgQ0hBUlNFVF9FQkNESUMKKwljaGFyIGViY2RpY19idWZbMTAyNF07CisjZW5kaWYKKworCWlmIChidWYgPT0gTlVMTCkKKwkJeworCQlpZiAoKGI9QlVGX01FTV9uZXcoKSkgPT0gTlVMTCkgZ290byBlcnI7CisJCWlmICghQlVGX01FTV9ncm93KGIsMjAwKSkgZ290byBlcnI7CisJCWItPmRhdGFbMF09J1wwJzsKKwkJbGVuPTIwMDsKKwkJfQorCWlmIChhID09IE5VTEwpCisJICAgIHsKKwkgICAgaWYoYikKKwkJeworCQlidWY9Yi0+ZGF0YTsKKwkJT1BFTlNTTF9mcmVlKGIpOworCQl9CisJICAgIHN0cm5jcHkoYnVmLCJOTyBYNTA5X05BTUUiLGxlbik7CisJICAgIGJ1ZltsZW4tMV09J1wwJzsKKwkgICAgcmV0dXJuIGJ1ZjsKKwkgICAgfQorCisJbGVuLS07IC8qIHNwYWNlIGZvciAnXDAnICovCisJbD0wOworCWZvciAoaT0wOyBpPHNrX1g1MDlfTkFNRV9FTlRSWV9udW0oYS0+ZW50cmllcyk7IGkrKykKKwkJeworCQluZT1za19YNTA5X05BTUVfRU5UUllfdmFsdWUoYS0+ZW50cmllcyxpKTsKKwkJbj1PQkpfb2JqMm5pZChuZS0+b2JqZWN0KTsKKwkJaWYgKChuID09IE5JRF91bmRlZikgfHwgKChzPU9CSl9uaWQyc24obikpID09IE5VTEwpKQorCQkJeworCQkJaTJ0X0FTTjFfT0JKRUNUKHRtcF9idWYsc2l6ZW9mKHRtcF9idWYpLG5lLT5vYmplY3QpOworCQkJcz10bXBfYnVmOworCQkJfQorCQlsMT1zdHJsZW4ocyk7CisKKwkJdHlwZT1uZS0+dmFsdWUtPnR5cGU7CisJCW51bT1uZS0+dmFsdWUtPmxlbmd0aDsKKwkJcT1uZS0+dmFsdWUtPmRhdGE7CisjaWZkZWYgQ0hBUlNFVF9FQkNESUMKKyAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBWX0FTTjFfR0VORVJBTFNUUklORyB8fAorCQkgICAgdHlwZSA9PSBWX0FTTjFfVklTSUJMRVNUUklORyB8fAorCQkgICAgdHlwZSA9PSBWX0FTTjFfUFJJTlRBQkxFU1RSSU5HIHx8CisJCSAgICB0eXBlID09IFZfQVNOMV9URUxFVEVYU1RSSU5HIHx8CisJCSAgICB0eXBlID09IFZfQVNOMV9WSVNJQkxFU1RSSU5HIHx8CisJCSAgICB0eXBlID09IFZfQVNOMV9JQTVTVFJJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzY2lpMmViY2RpYyhlYmNkaWNfYnVmLCBxLAorCQkJCSAgICAgKG51bSA+IHNpemVvZiBlYmNkaWNfYnVmKQorCQkJCSAgICAgPyBzaXplb2YgZWJjZGljX2J1ZiA6IG51bSk7CisgICAgICAgICAgICAgICAgICAgICAgICBxPWViY2RpY19idWY7CisJCX0KKyNlbmRpZgorCisJCWlmICgodHlwZSA9PSBWX0FTTjFfR0VORVJBTFNUUklORykgJiYgKChudW0lNCkgPT0gMCkpCisJCQl7CisJCQlnc19kb2l0WzBdPWdzX2RvaXRbMV09Z3NfZG9pdFsyXT1nc19kb2l0WzNdPTA7CisJCQlmb3IgKGo9MDsgajxudW07IGorKykKKwkJCQlpZiAocVtqXSAhPSAwKSBnc19kb2l0W2omM109MTsKKworCQkJaWYgKGdzX2RvaXRbMF18Z3NfZG9pdFsxXXxnc19kb2l0WzJdKQorCQkJCWdzX2RvaXRbMF09Z3NfZG9pdFsxXT1nc19kb2l0WzJdPWdzX2RvaXRbM109MTsKKwkJCWVsc2UKKwkJCQl7CisJCQkJZ3NfZG9pdFswXT1nc19kb2l0WzFdPWdzX2RvaXRbMl09MDsKKwkJCQlnc19kb2l0WzNdPTE7CisJCQkJfQorCQkJfQorCQllbHNlCisJCQlnc19kb2l0WzBdPWdzX2RvaXRbMV09Z3NfZG9pdFsyXT1nc19kb2l0WzNdPTE7CisKKwkJZm9yIChsMj1qPTA7IGo8bnVtOyBqKyspCisJCQl7CisJCQlpZiAoIWdzX2RvaXRbaiYzXSkgY29udGludWU7CisJCQlsMisrOworI2lmbmRlZiBDSEFSU0VUX0VCQ0RJQworCQkJaWYgKChxW2pdIDwgJyAnKSB8fCAocVtqXSA+ICd+JykpIGwyKz0zOworI2Vsc2UKKwkJCWlmICgob3NfdG9hc2NpaVtxW2pdXSA8IG9zX3RvYXNjaWlbJyAnXSkgfHwKKwkJCSAgICAob3NfdG9hc2NpaVtxW2pdXSA+IG9zX3RvYXNjaWlbJ34nXSkpIGwyKz0zOworI2VuZGlmCisJCQl9CisKKwkJbG9sZD1sOworCQlsKz0xK2wxKzErbDI7CisJCWlmIChiICE9IE5VTEwpCisJCQl7CisJCQlpZiAoIUJVRl9NRU1fZ3JvdyhiLGwrMSkpIGdvdG8gZXJyOworCQkJcD0gJihiLT5kYXRhW2xvbGRdKTsKKwkJCX0KKwkJZWxzZSBpZiAobCA+IGxlbikKKwkJCXsKKwkJCWJyZWFrOworCQkJfQorCQllbHNlCisJCQlwPSAmKGJ1Zltsb2xkXSk7CisJCSoocCsrKT0nLyc7CisJCW1lbWNweShwLHMsKHVuc2lnbmVkIGludClsMSk7IHArPWwxOworCQkqKHArKyk9Jz0nOworCisjaWZuZGVmIENIQVJTRVRfRUJDRElDIC8qIHEgd2FzIGFzc2lnbmVkIGFib3ZlIGFscmVhZHkuICovCisJCXE9bmUtPnZhbHVlLT5kYXRhOworI2VuZGlmCisKKwkJZm9yIChqPTA7IGo8bnVtOyBqKyspCisJCQl7CisJCQlpZiAoIWdzX2RvaXRbaiYzXSkgY29udGludWU7CisjaWZuZGVmIENIQVJTRVRfRUJDRElDCisJCQluPXFbal07CisJCQlpZiAoKG4gPCAnICcpIHx8IChuID4gJ34nKSkKKwkJCQl7CisJCQkJKihwKyspPSdcXCc7CisJCQkJKihwKyspPSd4JzsKKwkJCQkqKHArKyk9aGV4WyhuPj40KSYweDBmXTsKKwkJCQkqKHArKyk9aGV4W24mMHgwZl07CisJCQkJfQorCQkJZWxzZQorCQkJCSoocCsrKT1uOworI2Vsc2UKKwkJCW49b3NfdG9hc2NpaVtxW2pdXTsKKwkJCWlmICgobiA8IG9zX3RvYXNjaWlbJyAnXSkgfHwKKwkJCSAgICAobiA+IG9zX3RvYXNjaWlbJ34nXSkpCisJCQkJeworCQkJCSoocCsrKT0nXFwnOworCQkJCSoocCsrKT0neCc7CisJCQkJKihwKyspPWhleFsobj4+NCkmMHgwZl07CisJCQkJKihwKyspPWhleFtuJjB4MGZdOworCQkJCX0KKwkJCWVsc2UKKwkJCQkqKHArKyk9cVtqXTsKKyNlbmRpZgorCQkJfQorCQkqcD0nXDAnOworCQl9CisJaWYgKGIgIT0gTlVMTCkKKwkJeworCQlwPWItPmRhdGE7CisJCU9QRU5TU0xfZnJlZShiKTsKKwkJfQorCWVsc2UKKwkJcD1idWY7CisJaWYgKGkgPT0gMCkKKwkJKnAgPSAnXDAnOworCXJldHVybihwKTsKK2VycjoKKwlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X05BTUVfb25lbGluZSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCWlmIChiICE9IE5VTEwpIEJVRl9NRU1fZnJlZShiKTsKKwlyZXR1cm4oTlVMTCk7CisJfQorCmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOS94NTA5X3IyeC5jIGIvY3J5cHRvL3g1MDkveDUwOV9yMnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzhlOWMwCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3g1MDkveDUwOV9yMnguYwpAQCAtMCwwICsxLDExMyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2J1Zi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZGlnZXN0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKKworWDUwOSAqWDUwOV9SRVFfdG9fWDUwOShYNTA5X1JFUSAqciwgaW50IGRheXMsIEVWUF9QS0VZICpwa2V5KQorCXsKKwlYNTA5ICpyZXQ9TlVMTDsKKwlYNTA5X0NJTkYgKnhpPU5VTEw7CisJWDUwOV9OQU1FICp4bjsKKworCWlmICgocmV0PVg1MDlfbmV3KCkpID09IE5VTEwpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SRVFfdG9fWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCisJLyogZHVwbGljYXRlIHRoZSByZXF1ZXN0ICovCisJeGk9cmV0LT5jZXJ0X2luZm87CisKKwlpZiAoc2tfWDUwOV9BVFRSSUJVVEVfbnVtKHItPnJlcV9pbmZvLT5hdHRyaWJ1dGVzKSAhPSAwKQorCQl7CisJCWlmICgoeGktPnZlcnNpb249TV9BU04xX0lOVEVHRVJfbmV3KCkpID09IE5VTEwpIGdvdG8gZXJyOworCQlpZiAoIUFTTjFfSU5URUdFUl9zZXQoeGktPnZlcnNpb24sMikpIGdvdG8gZXJyOworLyoJCXhpLT5leHRlbnNpb25zPXJpLT5hdHRyaWJ1dGVzOyA8LSBiYWQsIHNob3VsZCBub3QgZXZlciBiZSBkb25lCisJCXJpLT5hdHRyaWJ1dGVzPU5VTEw7ICovCisJCX0KKworCXhuPVg1MDlfUkVRX2dldF9zdWJqZWN0X25hbWUocik7CisJaWYgKFg1MDlfc2V0X3N1YmplY3RfbmFtZShyZXQsWDUwOV9OQU1FX2R1cCh4bikpID09IDApCisJCWdvdG8gZXJyOworCWlmIChYNTA5X3NldF9pc3N1ZXJfbmFtZShyZXQsWDUwOV9OQU1FX2R1cCh4bikpID09IDApCisJCWdvdG8gZXJyOworCisJaWYgKFg1MDlfZ210aW1lX2Fkaih4aS0+dmFsaWRpdHktPm5vdEJlZm9yZSwwKSA9PSBOVUxMKQorCQlnb3RvIGVycjsKKwlpZiAoWDUwOV9nbXRpbWVfYWRqKHhpLT52YWxpZGl0eS0+bm90QWZ0ZXIsKGxvbmcpNjAqNjAqMjQqZGF5cykgPT0gTlVMTCkKKwkJZ290byBlcnI7CisKKwlYNTA5X3NldF9wdWJrZXkocmV0LFg1MDlfUkVRX2dldF9wdWJrZXkocikpOworCisJaWYgKCFYNTA5X3NpZ24ocmV0LHBrZXksRVZQX21kNSgpKSkKKwkJZ290byBlcnI7CisJaWYgKDApCisJCXsKK2VycjoKKwkJWDUwOV9mcmVlKHJldCk7CisJCXJldD1OVUxMOworCQl9CisJcmV0dXJuKHJldCk7CisJfQorCmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOS94NTA5X3JlcS5jIGIvY3J5cHRvL3g1MDkveDUwOV9yZXEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2FmNzI5Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3g1MDkveDUwOV9yZXEuYwpAQCAtMCwwICsxLDMxNiBAQAorLyogY3J5cHRvL3g1MDkveDUwOV9yZXEuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9idWYuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKKworWDUwOV9SRVEgKlg1MDlfdG9fWDUwOV9SRVEoWDUwOSAqeCwgRVZQX1BLRVkgKnBrZXksIGNvbnN0IEVWUF9NRCAqbWQpCisJeworCVg1MDlfUkVRICpyZXQ7CisJWDUwOV9SRVFfSU5GTyAqcmk7CisJaW50IGk7CisJRVZQX1BLRVkgKnBrdG1wOworCisJcmV0PVg1MDlfUkVRX25ldygpOworCWlmIChyZXQgPT0gTlVMTCkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X3RvX1g1MDlfUkVRLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCWdvdG8gZXJyOworCQl9CisKKwlyaT1yZXQtPnJlcV9pbmZvOworCisJcmktPnZlcnNpb24tPmxlbmd0aD0xOworCXJpLT52ZXJzaW9uLT5kYXRhPSh1bnNpZ25lZCBjaGFyICopT1BFTlNTTF9tYWxsb2MoMSk7CisJaWYgKHJpLT52ZXJzaW9uLT5kYXRhID09IE5VTEwpIGdvdG8gZXJyOworCXJpLT52ZXJzaW9uLT5kYXRhWzBdPTA7IC8qIHZlcnNpb24gPT0gMCAqLworCisJaWYgKCFYNTA5X1JFUV9zZXRfc3ViamVjdF9uYW1lKHJldCxYNTA5X2dldF9zdWJqZWN0X25hbWUoeCkpKQorCQlnb3RvIGVycjsKKworCXBrdG1wID0gWDUwOV9nZXRfcHVia2V5KHgpOworCWk9WDUwOV9SRVFfc2V0X3B1YmtleShyZXQscGt0bXApOworCUVWUF9QS0VZX2ZyZWUocGt0bXApOworCWlmICghaSkgZ290byBlcnI7CisKKwlpZiAocGtleSAhPSBOVUxMKQorCQl7CisJCWlmICghWDUwOV9SRVFfc2lnbihyZXQscGtleSxtZCkpCisJCQlnb3RvIGVycjsKKwkJfQorCXJldHVybihyZXQpOworZXJyOgorCVg1MDlfUkVRX2ZyZWUocmV0KTsKKwlyZXR1cm4oTlVMTCk7CisJfQorCitFVlBfUEtFWSAqWDUwOV9SRVFfZ2V0X3B1YmtleShYNTA5X1JFUSAqcmVxKQorCXsKKwlpZiAoKHJlcSA9PSBOVUxMKSB8fCAocmVxLT5yZXFfaW5mbyA9PSBOVUxMKSkKKwkJcmV0dXJuKE5VTEwpOworCXJldHVybihYNTA5X1BVQktFWV9nZXQocmVxLT5yZXFfaW5mby0+cHVia2V5KSk7CisJfQorCitpbnQgWDUwOV9SRVFfY2hlY2tfcHJpdmF0ZV9rZXkoWDUwOV9SRVEgKngsIEVWUF9QS0VZICprKQorCXsKKwlFVlBfUEtFWSAqeGs9TlVMTDsKKwlpbnQgb2s9MDsKKworCXhrPVg1MDlfUkVRX2dldF9wdWJrZXkoeCk7CisJc3dpdGNoIChFVlBfUEtFWV9jbXAoeGssIGspKQorCQl7CisJY2FzZSAxOgorCQlvaz0xOworCQlicmVhazsKKwljYXNlIDA6CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUkVRX2NoZWNrX3ByaXZhdGVfa2V5LCBYNTA5X1JfS0VZX1ZBTFVFU19NSVNNQVRDSCk7CisJCWJyZWFrOworCWNhc2UgLTE6CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUkVRX2NoZWNrX3ByaXZhdGVfa2V5LCBYNTA5X1JfS0VZX1RZUEVfTUlTTUFUQ0gpOworCQlicmVhazsKKwljYXNlIC0yOgorI2lmbmRlZiBPUEVOU1NMX05PX0VDCisJCWlmIChrLT50eXBlID09IEVWUF9QS0VZX0VDKQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SRVFfY2hlY2tfcHJpdmF0ZV9rZXksIEVSUl9SX0VDX0xJQik7CisJCQlicmVhazsKKwkJCX0KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RICisJCWlmIChrLT50eXBlID09IEVWUF9QS0VZX0RIKQorCQkJeworCQkJLyogTm8gaWRlYSAqLworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SRVFfY2hlY2tfcHJpdmF0ZV9rZXksIFg1MDlfUl9DQU5UX0NIRUNLX0RIX0tFWSk7CisJCQlicmVhazsKKwkJCX0KKyNlbmRpZgorCSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SRVFfY2hlY2tfcHJpdmF0ZV9rZXksIFg1MDlfUl9VTktOT1dOX0tFWV9UWVBFKTsKKwkJfQorCisJRVZQX1BLRVlfZnJlZSh4ayk7CisJcmV0dXJuKG9rKTsKKwl9CisKKy8qIEl0IHNlZW1zIHNldmVyYWwgb3JnYW5pc2F0aW9ucyBoYWQgdGhlIHNhbWUgaWRlYSBvZiBpbmNsdWRpbmcgYSBsaXN0IG9mCisgKiBleHRlbnNpb25zIGluIGEgY2VydGlmaWNhdGUgcmVxdWVzdC4gVGhlcmUgYXJlIGF0IGxlYXN0IHR3byBPSURzIHRoYXQgYXJlCisgKiB1c2VkIGFuZCB0aGVyZSBtYXkgYmUgbW9yZTogc28gdGhlIGxpc3QgaXMgY29uZmlndXJhYmxlLgorICovCisKK3N0YXRpYyBpbnQgZXh0X25pZF9saXN0W10gPSB7IE5JRF9leHRfcmVxLCBOSURfbXNfZXh0X3JlcSwgTklEX3VuZGVmfTsKKworc3RhdGljIGludCAqZXh0X25pZHMgPSBleHRfbmlkX2xpc3Q7CisKK2ludCBYNTA5X1JFUV9leHRlbnNpb25fbmlkKGludCByZXFfbmlkKQoreworCWludCBpLCBuaWQ7CisJZm9yKGkgPSAwOyA7IGkrKykgeworCQluaWQgPSBleHRfbmlkc1tpXTsKKwkJaWYobmlkID09IE5JRF91bmRlZikgcmV0dXJuIDA7CisJCWVsc2UgaWYgKHJlcV9uaWQgPT0gbmlkKSByZXR1cm4gMTsKKwl9Cit9CisKK2ludCAqWDUwOV9SRVFfZ2V0X2V4dGVuc2lvbl9uaWRzKHZvaWQpCit7CisJcmV0dXJuIGV4dF9uaWRzOworfQorCQordm9pZCBYNTA5X1JFUV9zZXRfZXh0ZW5zaW9uX25pZHMoaW50ICpuaWRzKQoreworCWV4dF9uaWRzID0gbmlkczsKK30KKworU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICpYNTA5X1JFUV9nZXRfZXh0ZW5zaW9ucyhYNTA5X1JFUSAqcmVxKQorCXsKKwlYNTA5X0FUVFJJQlVURSAqYXR0cjsKKwlBU04xX1RZUEUgKmV4dCA9IE5VTEw7CisJaW50IGlkeCwgKnBuaWQ7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKworCWlmICgocmVxID09IE5VTEwpIHx8IChyZXEtPnJlcV9pbmZvID09IE5VTEwpIHx8ICFleHRfbmlkcykKKwkJcmV0dXJuKE5VTEwpOworCWZvciAocG5pZCA9IGV4dF9uaWRzOyAqcG5pZCAhPSBOSURfdW5kZWY7IHBuaWQrKykKKwkJeworCQlpZHggPSBYNTA5X1JFUV9nZXRfYXR0cl9ieV9OSUQocmVxLCAqcG5pZCwgLTEpOworCQlpZiAoaWR4ID09IC0xKQorCQkJY29udGludWU7CisJCWF0dHIgPSBYNTA5X1JFUV9nZXRfYXR0cihyZXEsIGlkeCk7CisJCWlmKGF0dHItPnNpbmdsZSkgZXh0ID0gYXR0ci0+dmFsdWUuc2luZ2xlOworCQllbHNlIGlmKHNrX0FTTjFfVFlQRV9udW0oYXR0ci0+dmFsdWUuc2V0KSkKKwkJCWV4dCA9IHNrX0FTTjFfVFlQRV92YWx1ZShhdHRyLT52YWx1ZS5zZXQsIDApOworCQlicmVhazsKKwkJfQorCWlmKCFleHQgfHwgKGV4dC0+dHlwZSAhPSBWX0FTTjFfU0VRVUVOQ0UpKQorCQlyZXR1cm4gTlVMTDsKKwlwID0gZXh0LT52YWx1ZS5zZXF1ZW5jZS0+ZGF0YTsKKwlyZXR1cm4gKFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqKQorCQlBU04xX2l0ZW1fZDJpKE5VTEwsICZwLCBleHQtPnZhbHVlLnNlcXVlbmNlLT5sZW5ndGgsCisJCQkJQVNOMV9JVEVNX3JwdHIoWDUwOV9FWFRFTlNJT05TKSk7Cit9CisKKy8qIEFkZCBhIFNUQUNLX09GIGV4dGVuc2lvbnMgdG8gYSBjZXJ0aWZpY2F0ZSByZXF1ZXN0OiBhbGxvdyBhbHRlcm5hdGl2ZSBPSURzCisgKiBpbiBjYXNlIHdlIHdhbnQgdG8gY3JlYXRlIGEgbm9uIHN0YW5kYXJkIG9uZS4KKyAqLworCitpbnQgWDUwOV9SRVFfYWRkX2V4dGVuc2lvbnNfbmlkKFg1MDlfUkVRICpyZXEsIFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqZXh0cywKKwkJCQlpbnQgbmlkKQoreworCUFTTjFfVFlQRSAqYXQgPSBOVUxMOworCVg1MDlfQVRUUklCVVRFICphdHRyID0gTlVMTDsKKwlpZighKGF0ID0gQVNOMV9UWVBFX25ldygpKSB8fAorCQkhKGF0LT52YWx1ZS5zZXF1ZW5jZSA9IEFTTjFfU1RSSU5HX25ldygpKSkgZ290byBlcnI7CisKKwlhdC0+dHlwZSA9IFZfQVNOMV9TRVFVRU5DRTsKKwkvKiBHZW5lcmF0ZSBlbmNvZGluZyBvZiBleHRlbnNpb25zICovCisJYXQtPnZhbHVlLnNlcXVlbmNlLT5sZW5ndGggPSAKKwkJCUFTTjFfaXRlbV9pMmQoKEFTTjFfVkFMVUUgKilleHRzLAorCQkJCSZhdC0+dmFsdWUuc2VxdWVuY2UtPmRhdGEsCisJCQkJQVNOMV9JVEVNX3JwdHIoWDUwOV9FWFRFTlNJT05TKSk7CisJaWYoIShhdHRyID0gWDUwOV9BVFRSSUJVVEVfbmV3KCkpKSBnb3RvIGVycjsKKwlpZighKGF0dHItPnZhbHVlLnNldCA9IHNrX0FTTjFfVFlQRV9uZXdfbnVsbCgpKSkgZ290byBlcnI7CisJaWYoIXNrX0FTTjFfVFlQRV9wdXNoKGF0dHItPnZhbHVlLnNldCwgYXQpKSBnb3RvIGVycjsKKwlhdCA9IE5VTEw7CisJYXR0ci0+c2luZ2xlID0gMDsKKwlhdHRyLT5vYmplY3QgPSAoQVNOMV9PQkpFQ1QqKSBPQkpfbmlkMm9iaihuaWQpOworCWlmICghcmVxLT5yZXFfaW5mby0+YXR0cmlidXRlcykKKwkJeworCQlpZiAoIShyZXEtPnJlcV9pbmZvLT5hdHRyaWJ1dGVzID0gc2tfWDUwOV9BVFRSSUJVVEVfbmV3X251bGwoKSkpCisJCQlnb3RvIGVycjsKKwkJfQorCWlmKCFza19YNTA5X0FUVFJJQlVURV9wdXNoKHJlcS0+cmVxX2luZm8tPmF0dHJpYnV0ZXMsIGF0dHIpKSBnb3RvIGVycjsKKwlyZXR1cm4gMTsKKwllcnI6CisJWDUwOV9BVFRSSUJVVEVfZnJlZShhdHRyKTsKKwlBU04xX1RZUEVfZnJlZShhdCk7CisJcmV0dXJuIDA7Cit9CisvKiBUaGlzIGlzIHRoZSBub3JtYWwgdXNhZ2U6IHVzZSB0aGUgIm9mZmljaWFsIiBPSUQgKi8KK2ludCBYNTA5X1JFUV9hZGRfZXh0ZW5zaW9ucyhYNTA5X1JFUSAqcmVxLCBTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKmV4dHMpCit7CisJcmV0dXJuIFg1MDlfUkVRX2FkZF9leHRlbnNpb25zX25pZChyZXEsIGV4dHMsIE5JRF9leHRfcmVxKTsKK30KKworLyogUmVxdWVzdCBhdHRyaWJ1dGUgZnVuY3Rpb25zICovCisKK2ludCBYNTA5X1JFUV9nZXRfYXR0cl9jb3VudChjb25zdCBYNTA5X1JFUSAqcmVxKQoreworCXJldHVybiBYNTA5YXRfZ2V0X2F0dHJfY291bnQocmVxLT5yZXFfaW5mby0+YXR0cmlidXRlcyk7Cit9CisKK2ludCBYNTA5X1JFUV9nZXRfYXR0cl9ieV9OSUQoY29uc3QgWDUwOV9SRVEgKnJlcSwgaW50IG5pZCwKKwkJCSAgaW50IGxhc3Rwb3MpCit7CisJcmV0dXJuIFg1MDlhdF9nZXRfYXR0cl9ieV9OSUQocmVxLT5yZXFfaW5mby0+YXR0cmlidXRlcywgbmlkLCBsYXN0cG9zKTsKK30KKworaW50IFg1MDlfUkVRX2dldF9hdHRyX2J5X09CSihjb25zdCBYNTA5X1JFUSAqcmVxLCBBU04xX09CSkVDVCAqb2JqLAorCQkJICBpbnQgbGFzdHBvcykKK3sKKwlyZXR1cm4gWDUwOWF0X2dldF9hdHRyX2J5X09CSihyZXEtPnJlcV9pbmZvLT5hdHRyaWJ1dGVzLCBvYmosIGxhc3Rwb3MpOworfQorCitYNTA5X0FUVFJJQlVURSAqWDUwOV9SRVFfZ2V0X2F0dHIoY29uc3QgWDUwOV9SRVEgKnJlcSwgaW50IGxvYykKK3sKKwlyZXR1cm4gWDUwOWF0X2dldF9hdHRyKHJlcS0+cmVxX2luZm8tPmF0dHJpYnV0ZXMsIGxvYyk7Cit9CisKK1g1MDlfQVRUUklCVVRFICpYNTA5X1JFUV9kZWxldGVfYXR0cihYNTA5X1JFUSAqcmVxLCBpbnQgbG9jKQoreworCXJldHVybiBYNTA5YXRfZGVsZXRlX2F0dHIocmVxLT5yZXFfaW5mby0+YXR0cmlidXRlcywgbG9jKTsKK30KKworaW50IFg1MDlfUkVRX2FkZDFfYXR0cihYNTA5X1JFUSAqcmVxLCBYNTA5X0FUVFJJQlVURSAqYXR0cikKK3sKKwlpZihYNTA5YXRfYWRkMV9hdHRyKCZyZXEtPnJlcV9pbmZvLT5hdHRyaWJ1dGVzLCBhdHRyKSkgcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBYNTA5X1JFUV9hZGQxX2F0dHJfYnlfT0JKKFg1MDlfUkVRICpyZXEsCisJCQljb25zdCBBU04xX09CSkVDVCAqb2JqLCBpbnQgdHlwZSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzLCBpbnQgbGVuKQoreworCWlmKFg1MDlhdF9hZGQxX2F0dHJfYnlfT0JKKCZyZXEtPnJlcV9pbmZvLT5hdHRyaWJ1dGVzLCBvYmosCisJCQkJdHlwZSwgYnl0ZXMsIGxlbikpIHJldHVybiAxOworCXJldHVybiAwOworfQorCitpbnQgWDUwOV9SRVFfYWRkMV9hdHRyX2J5X05JRChYNTA5X1JFUSAqcmVxLAorCQkJaW50IG5pZCwgaW50IHR5cGUsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcywgaW50IGxlbikKK3sKKwlpZihYNTA5YXRfYWRkMV9hdHRyX2J5X05JRCgmcmVxLT5yZXFfaW5mby0+YXR0cmlidXRlcywgbmlkLAorCQkJCXR5cGUsIGJ5dGVzLCBsZW4pKSByZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworaW50IFg1MDlfUkVRX2FkZDFfYXR0cl9ieV90eHQoWDUwOV9SRVEgKnJlcSwKKwkJCWNvbnN0IGNoYXIgKmF0dHJuYW1lLCBpbnQgdHlwZSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzLCBpbnQgbGVuKQoreworCWlmKFg1MDlhdF9hZGQxX2F0dHJfYnlfdHh0KCZyZXEtPnJlcV9pbmZvLT5hdHRyaWJ1dGVzLCBhdHRybmFtZSwKKwkJCQl0eXBlLCBieXRlcywgbGVuKSkgcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOS94NTA5X3NldC5jIGIvY3J5cHRvL3g1MDkveDUwOV9zZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mjg4NTcxCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3g1MDkveDUwOV9zZXQuYwpAQCAtMCwwICsxLDE0OCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY2lwaGVyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorCisKK2ludCBYNTA5X3NldF92ZXJzaW9uKFg1MDkgKngsIGxvbmcgdmVyc2lvbikKKwl7CisJaWYgKHggPT0gTlVMTCkgcmV0dXJuKDApOworCWlmICh4LT5jZXJ0X2luZm8tPnZlcnNpb24gPT0gTlVMTCkKKwkJeworCQlpZiAoKHgtPmNlcnRfaW5mby0+dmVyc2lvbj1NX0FTTjFfSU5URUdFUl9uZXcoKSkgPT0gTlVMTCkKKwkJCXJldHVybigwKTsKKwkJfQorCXJldHVybihBU04xX0lOVEVHRVJfc2V0KHgtPmNlcnRfaW5mby0+dmVyc2lvbix2ZXJzaW9uKSk7CisJfQorCitpbnQgWDUwOV9zZXRfc2VyaWFsTnVtYmVyKFg1MDkgKngsIEFTTjFfSU5URUdFUiAqc2VyaWFsKQorCXsKKwlBU04xX0lOVEVHRVIgKmluOworCisJaWYgKHggPT0gTlVMTCkgcmV0dXJuKDApOworCWluPXgtPmNlcnRfaW5mby0+c2VyaWFsTnVtYmVyOworCWlmIChpbiAhPSBzZXJpYWwpCisJCXsKKwkJaW49TV9BU04xX0lOVEVHRVJfZHVwKHNlcmlhbCk7CisJCWlmIChpbiAhPSBOVUxMKQorCQkJeworCQkJTV9BU04xX0lOVEVHRVJfZnJlZSh4LT5jZXJ0X2luZm8tPnNlcmlhbE51bWJlcik7CisJCQl4LT5jZXJ0X2luZm8tPnNlcmlhbE51bWJlcj1pbjsKKwkJCX0KKwkJfQorCXJldHVybihpbiAhPSBOVUxMKTsKKwl9CisKK2ludCBYNTA5X3NldF9pc3N1ZXJfbmFtZShYNTA5ICp4LCBYNTA5X05BTUUgKm5hbWUpCisJeworCWlmICgoeCA9PSBOVUxMKSB8fCAoeC0+Y2VydF9pbmZvID09IE5VTEwpKSByZXR1cm4oMCk7CisJcmV0dXJuKFg1MDlfTkFNRV9zZXQoJngtPmNlcnRfaW5mby0+aXNzdWVyLG5hbWUpKTsKKwl9CisKK2ludCBYNTA5X3NldF9zdWJqZWN0X25hbWUoWDUwOSAqeCwgWDUwOV9OQU1FICpuYW1lKQorCXsKKwlpZiAoKHggPT0gTlVMTCkgfHwgKHgtPmNlcnRfaW5mbyA9PSBOVUxMKSkgcmV0dXJuKDApOworCXJldHVybihYNTA5X05BTUVfc2V0KCZ4LT5jZXJ0X2luZm8tPnN1YmplY3QsbmFtZSkpOworCX0KKworaW50IFg1MDlfc2V0X25vdEJlZm9yZShYNTA5ICp4LCBjb25zdCBBU04xX1RJTUUgKnRtKQorCXsKKwlBU04xX1RJTUUgKmluOworCisJaWYgKCh4ID09IE5VTEwpIHx8ICh4LT5jZXJ0X2luZm8tPnZhbGlkaXR5ID09IE5VTEwpKSByZXR1cm4oMCk7CisJaW49eC0+Y2VydF9pbmZvLT52YWxpZGl0eS0+bm90QmVmb3JlOworCWlmIChpbiAhPSB0bSkKKwkJeworCQlpbj1NX0FTTjFfVElNRV9kdXAodG0pOworCQlpZiAoaW4gIT0gTlVMTCkKKwkJCXsKKwkJCU1fQVNOMV9USU1FX2ZyZWUoeC0+Y2VydF9pbmZvLT52YWxpZGl0eS0+bm90QmVmb3JlKTsKKwkJCXgtPmNlcnRfaW5mby0+dmFsaWRpdHktPm5vdEJlZm9yZT1pbjsKKwkJCX0KKwkJfQorCXJldHVybihpbiAhPSBOVUxMKTsKKwl9CisKK2ludCBYNTA5X3NldF9ub3RBZnRlcihYNTA5ICp4LCBjb25zdCBBU04xX1RJTUUgKnRtKQorCXsKKwlBU04xX1RJTUUgKmluOworCisJaWYgKCh4ID09IE5VTEwpIHx8ICh4LT5jZXJ0X2luZm8tPnZhbGlkaXR5ID09IE5VTEwpKSByZXR1cm4oMCk7CisJaW49eC0+Y2VydF9pbmZvLT52YWxpZGl0eS0+bm90QWZ0ZXI7CisJaWYgKGluICE9IHRtKQorCQl7CisJCWluPU1fQVNOMV9USU1FX2R1cCh0bSk7CisJCWlmIChpbiAhPSBOVUxMKQorCQkJeworCQkJTV9BU04xX1RJTUVfZnJlZSh4LT5jZXJ0X2luZm8tPnZhbGlkaXR5LT5ub3RBZnRlcik7CisJCQl4LT5jZXJ0X2luZm8tPnZhbGlkaXR5LT5ub3RBZnRlcj1pbjsKKwkJCX0KKwkJfQorCXJldHVybihpbiAhPSBOVUxMKTsKKwl9CisKK2ludCBYNTA5X3NldF9wdWJrZXkoWDUwOSAqeCwgRVZQX1BLRVkgKnBrZXkpCisJeworCWlmICgoeCA9PSBOVUxMKSB8fCAoeC0+Y2VydF9pbmZvID09IE5VTEwpKSByZXR1cm4oMCk7CisJcmV0dXJuKFg1MDlfUFVCS0VZX3NldCgmKHgtPmNlcnRfaW5mby0+a2V5KSxwa2V5KSk7CisJfQorCisKKwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3g1MDkveDUwOV90cnMuYyBiL2NyeXB0by94NTA5L3g1MDlfdHJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU1Yjc1YgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94NTA5L3g1MDlfdHJzLmMKQEAgLTAsMCArMSwyOTUgQEAKKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAxOTk5LiAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9idWYuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorCisKK3N0YXRpYyBpbnQgdHJfY21wKGNvbnN0IFg1MDlfVFJVU1QgKiphLAorCQljb25zdCBYNTA5X1RSVVNUICoqYik7CitzdGF0aWMgdm9pZCB0cnRhYmxlX2ZyZWUoWDUwOV9UUlVTVCAqcCk7CisKK3N0YXRpYyBpbnQgdHJ1c3RfMW9pZGFueShYNTA5X1RSVVNUICp0cnVzdCwgWDUwOSAqeCwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgdHJ1c3RfMW9pZChYNTA5X1RSVVNUICp0cnVzdCwgWDUwOSAqeCwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgdHJ1c3RfY29tcGF0KFg1MDlfVFJVU1QgKnRydXN0LCBYNTA5ICp4LCBpbnQgZmxhZ3MpOworCitzdGF0aWMgaW50IG9ial90cnVzdChpbnQgaWQsIFg1MDkgKngsIGludCBmbGFncyk7CitzdGF0aWMgaW50ICgqZGVmYXVsdF90cnVzdCkoaW50IGlkLCBYNTA5ICp4LCBpbnQgZmxhZ3MpID0gb2JqX3RydXN0OworCisvKiBXQVJOSU5HOiB0aGUgZm9sbG93aW5nIHRhYmxlIHNob3VsZCBiZSBrZXB0IGluIG9yZGVyIG9mIHRydXN0CisgKiBhbmQgd2l0aG91dCBhbnkgZ2FwcyBzbyB3ZSBjYW4ganVzdCBzdWJ0cmFjdCB0aGUgbWluaW11bSB0cnVzdAorICogdmFsdWUgdG8gZ2V0IGFuIGluZGV4IGludG8gdGhlIHRhYmxlCisgKi8KKworc3RhdGljIFg1MDlfVFJVU1QgdHJzdGFuZGFyZFtdID0gewore1g1MDlfVFJVU1RfQ09NUEFULCAwLCB0cnVzdF9jb21wYXQsICJjb21wYXRpYmxlIiwgMCwgTlVMTH0sCit7WDUwOV9UUlVTVF9TU0xfQ0xJRU5ULCAwLCB0cnVzdF8xb2lkYW55LCAiU1NMIENsaWVudCIsIE5JRF9jbGllbnRfYXV0aCwgTlVMTH0sCit7WDUwOV9UUlVTVF9TU0xfU0VSVkVSLCAwLCB0cnVzdF8xb2lkYW55LCAiU1NMIFNlcnZlciIsIE5JRF9zZXJ2ZXJfYXV0aCwgTlVMTH0sCit7WDUwOV9UUlVTVF9FTUFJTCwgMCwgdHJ1c3RfMW9pZGFueSwgIlMvTUlNRSBlbWFpbCIsIE5JRF9lbWFpbF9wcm90ZWN0LCBOVUxMfSwKK3tYNTA5X1RSVVNUX09CSkVDVF9TSUdOLCAwLCB0cnVzdF8xb2lkYW55LCAiT2JqZWN0IFNpZ25lciIsIE5JRF9jb2RlX3NpZ24sIE5VTEx9LAore1g1MDlfVFJVU1RfT0NTUF9TSUdOLCAwLCB0cnVzdF8xb2lkLCAiT0NTUCByZXNwb25kZXIiLCBOSURfT0NTUF9zaWduLCBOVUxMfSwKK3tYNTA5X1RSVVNUX09DU1BfUkVRVUVTVCwgMCwgdHJ1c3RfMW9pZCwgIk9DU1AgcmVxdWVzdCIsIE5JRF9hZF9PQ1NQLCBOVUxMfSwKK3tYNTA5X1RSVVNUX1RTQSwgMCwgdHJ1c3RfMW9pZGFueSwgIlRTQSBzZXJ2ZXIiLCBOSURfdGltZV9zdGFtcCwgTlVMTH0KK307CisKKyNkZWZpbmUgWDUwOV9UUlVTVF9DT1VOVAkoc2l6ZW9mKHRyc3RhbmRhcmQpL3NpemVvZihYNTA5X1RSVVNUKSkKKworc3RhdGljIFNUQUNLX09GKFg1MDlfVFJVU1QpICp0cnRhYmxlID0gTlVMTDsKKworc3RhdGljIGludCB0cl9jbXAoY29uc3QgWDUwOV9UUlVTVCAqKmEsCisJCWNvbnN0IFg1MDlfVFJVU1QgKipiKQoreworCXJldHVybiAoKmEpLT50cnVzdCAtICgqYiktPnRydXN0OworfQorCitpbnQgKCpYNTA5X1RSVVNUX3NldF9kZWZhdWx0KGludCAoKnRydXN0KShpbnQgLCBYNTA5ICosIGludCkpKShpbnQsIFg1MDkgKiwgaW50KQoreworCWludCAoKm9sZHRydXN0KShpbnQgLCBYNTA5ICosIGludCk7CisJb2xkdHJ1c3QgPSBkZWZhdWx0X3RydXN0OworCWRlZmF1bHRfdHJ1c3QgPSB0cnVzdDsKKwlyZXR1cm4gb2xkdHJ1c3Q7Cit9CisKKworaW50IFg1MDlfY2hlY2tfdHJ1c3QoWDUwOSAqeCwgaW50IGlkLCBpbnQgZmxhZ3MpCit7CisJWDUwOV9UUlVTVCAqcHQ7CisJaW50IGlkeDsKKwlpZihpZCA9PSAtMSkgcmV0dXJuIDE7CisJLyogV2UgZ2V0IHRoaXMgYXMgYSBkZWZhdWx0IHZhbHVlICovCisJaWYgKGlkID09IDApCisJCXsKKwkJaW50IHJ2OworCQlydiA9IG9ial90cnVzdChOSURfYW55RXh0ZW5kZWRLZXlVc2FnZSwgeCwgMCk7CisJCWlmIChydiAhPSBYNTA5X1RSVVNUX1VOVFJVU1RFRCkKKwkJCXJldHVybiBydjsKKwkJcmV0dXJuIHRydXN0X2NvbXBhdChOVUxMLCB4LCAwKTsKKwkJfQorCWlkeCA9IFg1MDlfVFJVU1RfZ2V0X2J5X2lkKGlkKTsKKwlpZihpZHggPT0gLTEpIHJldHVybiBkZWZhdWx0X3RydXN0KGlkLCB4LCBmbGFncyk7CisJcHQgPSBYNTA5X1RSVVNUX2dldDAoaWR4KTsKKwlyZXR1cm4gcHQtPmNoZWNrX3RydXN0KHB0LCB4LCBmbGFncyk7Cit9CisKK2ludCBYNTA5X1RSVVNUX2dldF9jb3VudCh2b2lkKQoreworCWlmKCF0cnRhYmxlKSByZXR1cm4gWDUwOV9UUlVTVF9DT1VOVDsKKwlyZXR1cm4gc2tfWDUwOV9UUlVTVF9udW0odHJ0YWJsZSkgKyBYNTA5X1RSVVNUX0NPVU5UOworfQorCitYNTA5X1RSVVNUICogWDUwOV9UUlVTVF9nZXQwKGludCBpZHgpCit7CisJaWYoaWR4IDwgMCkgcmV0dXJuIE5VTEw7CisJaWYoaWR4IDwgKGludClYNTA5X1RSVVNUX0NPVU5UKSByZXR1cm4gdHJzdGFuZGFyZCArIGlkeDsKKwlyZXR1cm4gc2tfWDUwOV9UUlVTVF92YWx1ZSh0cnRhYmxlLCBpZHggLSBYNTA5X1RSVVNUX0NPVU5UKTsKK30KKworaW50IFg1MDlfVFJVU1RfZ2V0X2J5X2lkKGludCBpZCkKK3sKKwlYNTA5X1RSVVNUIHRtcDsKKwlzaXplX3QgaWR4OworCisJaWYoKGlkID49IFg1MDlfVFJVU1RfTUlOKSAmJiAoaWQgPD0gWDUwOV9UUlVTVF9NQVgpKQorCQkJCSByZXR1cm4gaWQgLSBYNTA5X1RSVVNUX01JTjsKKwl0bXAudHJ1c3QgPSBpZDsKKwlpZighdHJ0YWJsZSkgcmV0dXJuIC0xOworCWlmICghc2tfWDUwOV9UUlVTVF9maW5kKHRydGFibGUsICZpZHgsICZ0bXApKSB7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIGlkeCArIFg1MDlfVFJVU1RfQ09VTlQ7Cit9CisKK2ludCBYNTA5X1RSVVNUX3NldChpbnQgKnQsIGludCB0cnVzdCkKK3sKKwlpZihYNTA5X1RSVVNUX2dldF9ieV9pZCh0cnVzdCkgPT0gLTEpIHsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9UUlVTVF9zZXQsIFg1MDlfUl9JTlZBTElEX1RSVVNUKTsKKwkJcmV0dXJuIDA7CisJfQorCSp0ID0gdHJ1c3Q7CisJcmV0dXJuIDE7Cit9CisKK2ludCBYNTA5X1RSVVNUX2FkZChpbnQgaWQsIGludCBmbGFncywgaW50ICgqY2spKFg1MDlfVFJVU1QgKiwgWDUwOSAqLCBpbnQpLAorCQkJCQljaGFyICpuYW1lLCBpbnQgYXJnMSwgdm9pZCAqYXJnMikKK3sKKwlpbnQgaWR4OworCVg1MDlfVFJVU1QgKnRydG1wOworCS8qIFRoaXMgaXMgc2V0IGFjY29yZGluZyB0byB3aGF0IHdlIGNoYW5nZTogYXBwbGljYXRpb24gY2FuJ3Qgc2V0IGl0ICovCisJZmxhZ3MgJj0gflg1MDlfVFJVU1RfRFlOQU1JQzsKKwkvKiBUaGlzIHdpbGwgYWx3YXlzIGJlIHNldCBmb3IgYXBwbGljYXRpb24gbW9kaWZpZWQgdHJ1c3QgZW50cmllcyAqLworCWZsYWdzIHw9IFg1MDlfVFJVU1RfRFlOQU1JQ19OQU1FOworCS8qIEdldCBleGlzdGluZyBlbnRyeSBpZiBhbnkgKi8KKwlpZHggPSBYNTA5X1RSVVNUX2dldF9ieV9pZChpZCk7CisJLyogTmVlZCBhIG5ldyBlbnRyeSAqLworCWlmKGlkeCA9PSAtMSkgeworCQlpZighKHRydG1wID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKFg1MDlfVFJVU1QpKSkpIHsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfVFJVU1RfYWRkLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQl0cnRtcC0+ZmxhZ3MgPSBYNTA5X1RSVVNUX0RZTkFNSUM7CisJfSBlbHNlIHRydG1wID0gWDUwOV9UUlVTVF9nZXQwKGlkeCk7CisKKwkvKiBPUEVOU1NMX2ZyZWUgZXhpc3RpbmcgbmFtZSBpZiBkeW5hbWljICovCisJaWYodHJ0bXAtPmZsYWdzICYgWDUwOV9UUlVTVF9EWU5BTUlDX05BTUUpIE9QRU5TU0xfZnJlZSh0cnRtcC0+bmFtZSk7CisJLyogZHVwIHN1cHBsaWVkIG5hbWUgKi8KKwlpZighKHRydG1wLT5uYW1lID0gQlVGX3N0cmR1cChuYW1lKSkpIHsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9UUlVTVF9hZGQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIEtlZXAgdGhlIGR5bmFtaWMgZmxhZyBvZiBleGlzdGluZyBlbnRyeSAqLworCXRydG1wLT5mbGFncyAmPSBYNTA5X1RSVVNUX0RZTkFNSUM7CisJLyogU2V0IGFsbCBvdGhlciBmbGFncyAqLworCXRydG1wLT5mbGFncyB8PSBmbGFnczsKKworCXRydG1wLT50cnVzdCA9IGlkOworCXRydG1wLT5jaGVja190cnVzdCA9IGNrOworCXRydG1wLT5hcmcxID0gYXJnMTsKKwl0cnRtcC0+YXJnMiA9IGFyZzI7CisKKwkvKiBJZiBpdHMgYSBuZXcgZW50cnkgbWFuYWdlIHRoZSBkeW5hbWljIHRhYmxlICovCisJaWYoaWR4ID09IC0xKSB7CisJCWlmKCF0cnRhYmxlICYmICEodHJ0YWJsZSA9IHNrX1g1MDlfVFJVU1RfbmV3KHRyX2NtcCkpKSB7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1RSVVNUX2FkZCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKCFza19YNTA5X1RSVVNUX3B1c2godHJ0YWJsZSwgdHJ0bXApKSB7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1RSVVNUX2FkZCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHRydGFibGVfZnJlZShYNTA5X1RSVVNUICpwKQorCXsKKwlpZighcCkgcmV0dXJuOworCWlmIChwLT5mbGFncyAmIFg1MDlfVFJVU1RfRFlOQU1JQykgCisJCXsKKwkJaWYgKHAtPmZsYWdzICYgWDUwOV9UUlVTVF9EWU5BTUlDX05BTUUpCisJCQlPUEVOU1NMX2ZyZWUocC0+bmFtZSk7CisJCU9QRU5TU0xfZnJlZShwKTsKKwkJfQorCX0KKwordm9pZCBYNTA5X1RSVVNUX2NsZWFudXAodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlmb3IoaSA9IDA7IGkgPCBYNTA5X1RSVVNUX0NPVU5UOyBpKyspIHRydGFibGVfZnJlZSh0cnN0YW5kYXJkICsgaSk7CisJc2tfWDUwOV9UUlVTVF9wb3BfZnJlZSh0cnRhYmxlLCB0cnRhYmxlX2ZyZWUpOworCXRydGFibGUgPSBOVUxMOworfQorCitpbnQgWDUwOV9UUlVTVF9nZXRfZmxhZ3MoWDUwOV9UUlVTVCAqeHApCit7CisJcmV0dXJuIHhwLT5mbGFnczsKK30KKworY2hhciAqWDUwOV9UUlVTVF9nZXQwX25hbWUoWDUwOV9UUlVTVCAqeHApCit7CisJcmV0dXJuIHhwLT5uYW1lOworfQorCitpbnQgWDUwOV9UUlVTVF9nZXRfdHJ1c3QoWDUwOV9UUlVTVCAqeHApCit7CisJcmV0dXJuIHhwLT50cnVzdDsKK30KKworc3RhdGljIGludCB0cnVzdF8xb2lkYW55KFg1MDlfVFJVU1QgKnRydXN0LCBYNTA5ICp4LCBpbnQgZmxhZ3MpCit7CisJaWYoeC0+YXV4ICYmICh4LT5hdXgtPnRydXN0IHx8IHgtPmF1eC0+cmVqZWN0KSkKKwkJcmV0dXJuIG9ial90cnVzdCh0cnVzdC0+YXJnMSwgeCwgZmxhZ3MpOworCS8qIHdlIGRvbid0IGhhdmUgYW55IHRydXN0IHNldHRpbmdzOiBmb3IgY29tcGF0aWJpbGl0eQorCSAqIHdlIHJldHVybiB0cnVzdGVkIGlmIGl0IGlzIHNlbGYgc2lnbmVkCisJICovCisJcmV0dXJuIHRydXN0X2NvbXBhdCh0cnVzdCwgeCwgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHRydXN0XzFvaWQoWDUwOV9UUlVTVCAqdHJ1c3QsIFg1MDkgKngsIGludCBmbGFncykKK3sKKwlpZih4LT5hdXgpIHJldHVybiBvYmpfdHJ1c3QodHJ1c3QtPmFyZzEsIHgsIGZsYWdzKTsKKwlyZXR1cm4gWDUwOV9UUlVTVF9VTlRSVVNURUQ7Cit9CisKK3N0YXRpYyBpbnQgdHJ1c3RfY29tcGF0KFg1MDlfVFJVU1QgKnRydXN0LCBYNTA5ICp4LCBpbnQgZmxhZ3MpCit7CisJWDUwOV9jaGVja19wdXJwb3NlKHgsIC0xLCAwKTsKKwlpZih4LT5leF9mbGFncyAmIEVYRkxBR19TUykgcmV0dXJuIFg1MDlfVFJVU1RfVFJVU1RFRDsKKwllbHNlIHJldHVybiBYNTA5X1RSVVNUX1VOVFJVU1RFRDsKK30KKworc3RhdGljIGludCBvYmpfdHJ1c3QoaW50IGlkLCBYNTA5ICp4LCBpbnQgZmxhZ3MpCit7CisJQVNOMV9PQkpFQ1QgKm9iajsKKwlzaXplX3QgaTsKKwlYNTA5X0NFUlRfQVVYICpheDsKKwlheCA9IHgtPmF1eDsKKwlpZighYXgpIHJldHVybiBYNTA5X1RSVVNUX1VOVFJVU1RFRDsKKwlpZihheC0+cmVqZWN0KSB7CisJCWZvcihpID0gMDsgaSA8IHNrX0FTTjFfT0JKRUNUX251bShheC0+cmVqZWN0KTsgaSsrKSB7CisJCQlvYmogPSBza19BU04xX09CSkVDVF92YWx1ZShheC0+cmVqZWN0LCBpKTsKKwkJCWlmKE9CSl9vYmoybmlkKG9iaikgPT0gaWQpIHJldHVybiBYNTA5X1RSVVNUX1JFSkVDVEVEOworCQl9CisJfQkKKwlpZihheC0+dHJ1c3QpIHsKKwkJZm9yKGkgPSAwOyBpIDwgc2tfQVNOMV9PQkpFQ1RfbnVtKGF4LT50cnVzdCk7IGkrKykgeworCQkJb2JqID0gc2tfQVNOMV9PQkpFQ1RfdmFsdWUoYXgtPnRydXN0LCBpKTsKKwkJCWlmKE9CSl9vYmoybmlkKG9iaikgPT0gaWQpIHJldHVybiBYNTA5X1RSVVNUX1RSVVNURUQ7CisJCX0KKwl9CisJcmV0dXJuIFg1MDlfVFJVU1RfVU5UUlVTVEVEOworfQorCmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOS94NTA5X3R4dC5jIGIvY3J5cHRvL3g1MDkveDUwOV90eHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjg2NzEwCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3g1MDkveDUwOV90eHQuYwpAQCAtMCwwICsxLDIwOSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYnVmLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jaXBoZXIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbGhhc2guaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKKworY29uc3QgY2hhciAqWDUwOV92ZXJpZnlfY2VydF9lcnJvcl9zdHJpbmcobG9uZyBuKQorCXsKKwlzdGF0aWMgY2hhciBidWZbMTAwXTsKKworCXN3aXRjaCAoKGludCluKQorCQl7CisJY2FzZSBYNTA5X1ZfT0s6CisJCXJldHVybigib2siKTsKKwljYXNlIFg1MDlfVl9FUlJfVU5BQkxFX1RPX0dFVF9JU1NVRVJfQ0VSVDoKKwkJcmV0dXJuKCJ1bmFibGUgdG8gZ2V0IGlzc3VlciBjZXJ0aWZpY2F0ZSIpOworCWNhc2UgWDUwOV9WX0VSUl9VTkFCTEVfVE9fR0VUX0NSTDoKKwkJcmV0dXJuKCJ1bmFibGUgdG8gZ2V0IGNlcnRpZmljYXRlIENSTCIpOworCWNhc2UgWDUwOV9WX0VSUl9VTkFCTEVfVE9fREVDUllQVF9DRVJUX1NJR05BVFVSRToKKwkJcmV0dXJuKCJ1bmFibGUgdG8gZGVjcnlwdCBjZXJ0aWZpY2F0ZSdzIHNpZ25hdHVyZSIpOworCWNhc2UgWDUwOV9WX0VSUl9VTkFCTEVfVE9fREVDUllQVF9DUkxfU0lHTkFUVVJFOgorCQlyZXR1cm4oInVuYWJsZSB0byBkZWNyeXB0IENSTCdzIHNpZ25hdHVyZSIpOworCWNhc2UgWDUwOV9WX0VSUl9VTkFCTEVfVE9fREVDT0RFX0lTU1VFUl9QVUJMSUNfS0VZOgorCQlyZXR1cm4oInVuYWJsZSB0byBkZWNvZGUgaXNzdWVyIHB1YmxpYyBrZXkiKTsKKwljYXNlIFg1MDlfVl9FUlJfQ0VSVF9TSUdOQVRVUkVfRkFJTFVSRToKKwkJcmV0dXJuKCJjZXJ0aWZpY2F0ZSBzaWduYXR1cmUgZmFpbHVyZSIpOworCWNhc2UgWDUwOV9WX0VSUl9DUkxfU0lHTkFUVVJFX0ZBSUxVUkU6CisJCXJldHVybigiQ1JMIHNpZ25hdHVyZSBmYWlsdXJlIik7CisJY2FzZSBYNTA5X1ZfRVJSX0NFUlRfTk9UX1lFVF9WQUxJRDoKKwkJcmV0dXJuKCJjZXJ0aWZpY2F0ZSBpcyBub3QgeWV0IHZhbGlkIik7CisJY2FzZSBYNTA5X1ZfRVJSX0NSTF9OT1RfWUVUX1ZBTElEOgorCQlyZXR1cm4oIkNSTCBpcyBub3QgeWV0IHZhbGlkIik7CisJY2FzZSBYNTA5X1ZfRVJSX0NFUlRfSEFTX0VYUElSRUQ6CisJCXJldHVybigiY2VydGlmaWNhdGUgaGFzIGV4cGlyZWQiKTsKKwljYXNlIFg1MDlfVl9FUlJfQ1JMX0hBU19FWFBJUkVEOgorCQlyZXR1cm4oIkNSTCBoYXMgZXhwaXJlZCIpOworCWNhc2UgWDUwOV9WX0VSUl9FUlJPUl9JTl9DRVJUX05PVF9CRUZPUkVfRklFTEQ6CisJCXJldHVybigiZm9ybWF0IGVycm9yIGluIGNlcnRpZmljYXRlJ3Mgbm90QmVmb3JlIGZpZWxkIik7CisJY2FzZSBYNTA5X1ZfRVJSX0VSUk9SX0lOX0NFUlRfTk9UX0FGVEVSX0ZJRUxEOgorCQlyZXR1cm4oImZvcm1hdCBlcnJvciBpbiBjZXJ0aWZpY2F0ZSdzIG5vdEFmdGVyIGZpZWxkIik7CisJY2FzZSBYNTA5X1ZfRVJSX0VSUk9SX0lOX0NSTF9MQVNUX1VQREFURV9GSUVMRDoKKwkJcmV0dXJuKCJmb3JtYXQgZXJyb3IgaW4gQ1JMJ3MgbGFzdFVwZGF0ZSBmaWVsZCIpOworCWNhc2UgWDUwOV9WX0VSUl9FUlJPUl9JTl9DUkxfTkVYVF9VUERBVEVfRklFTEQ6CisJCXJldHVybigiZm9ybWF0IGVycm9yIGluIENSTCdzIG5leHRVcGRhdGUgZmllbGQiKTsKKwljYXNlIFg1MDlfVl9FUlJfT1VUX09GX01FTToKKwkJcmV0dXJuKCJvdXQgb2YgbWVtb3J5Iik7CisJY2FzZSBYNTA5X1ZfRVJSX0RFUFRIX1pFUk9fU0VMRl9TSUdORURfQ0VSVDoKKwkJcmV0dXJuKCJzZWxmIHNpZ25lZCBjZXJ0aWZpY2F0ZSIpOworCWNhc2UgWDUwOV9WX0VSUl9TRUxGX1NJR05FRF9DRVJUX0lOX0NIQUlOOgorCQlyZXR1cm4oInNlbGYgc2lnbmVkIGNlcnRpZmljYXRlIGluIGNlcnRpZmljYXRlIGNoYWluIik7CisJY2FzZSBYNTA5X1ZfRVJSX1VOQUJMRV9UT19HRVRfSVNTVUVSX0NFUlRfTE9DQUxMWToKKwkJcmV0dXJuKCJ1bmFibGUgdG8gZ2V0IGxvY2FsIGlzc3VlciBjZXJ0aWZpY2F0ZSIpOworCWNhc2UgWDUwOV9WX0VSUl9VTkFCTEVfVE9fVkVSSUZZX0xFQUZfU0lHTkFUVVJFOgorCQlyZXR1cm4oInVuYWJsZSB0byB2ZXJpZnkgdGhlIGZpcnN0IGNlcnRpZmljYXRlIik7CisJY2FzZSBYNTA5X1ZfRVJSX0NFUlRfQ0hBSU5fVE9PX0xPTkc6CisJCXJldHVybigiY2VydGlmaWNhdGUgY2hhaW4gdG9vIGxvbmciKTsKKwljYXNlIFg1MDlfVl9FUlJfQ0VSVF9SRVZPS0VEOgorCQlyZXR1cm4oImNlcnRpZmljYXRlIHJldm9rZWQiKTsKKwljYXNlIFg1MDlfVl9FUlJfSU5WQUxJRF9DQToKKwkJcmV0dXJuICgiaW52YWxpZCBDQSBjZXJ0aWZpY2F0ZSIpOworCWNhc2UgWDUwOV9WX0VSUl9JTlZBTElEX05PTl9DQToKKwkJcmV0dXJuICgiaW52YWxpZCBub24tQ0EgY2VydGlmaWNhdGUgKGhhcyBDQSBtYXJraW5ncykiKTsKKwljYXNlIFg1MDlfVl9FUlJfUEFUSF9MRU5HVEhfRVhDRUVERUQ6CisJCXJldHVybiAoInBhdGggbGVuZ3RoIGNvbnN0cmFpbnQgZXhjZWVkZWQiKTsKKwljYXNlIFg1MDlfVl9FUlJfUFJPWFlfUEFUSF9MRU5HVEhfRVhDRUVERUQ6CisJCXJldHVybigicHJveHkgcGF0aCBsZW5ndGggY29uc3RyYWludCBleGNlZWRlZCIpOworCWNhc2UgWDUwOV9WX0VSUl9QUk9YWV9DRVJUSUZJQ0FURVNfTk9UX0FMTE9XRUQ6CisJCXJldHVybigicHJveHkgY2VydGlmaWNhdGVzIG5vdCBhbGxvd2VkLCBwbGVhc2Ugc2V0IHRoZSBhcHByb3ByaWF0ZSBmbGFnIik7CisJY2FzZSBYNTA5X1ZfRVJSX0lOVkFMSURfUFVSUE9TRToKKwkJcmV0dXJuICgidW5zdXBwb3J0ZWQgY2VydGlmaWNhdGUgcHVycG9zZSIpOworCWNhc2UgWDUwOV9WX0VSUl9DRVJUX1VOVFJVU1RFRDoKKwkJcmV0dXJuICgiY2VydGlmaWNhdGUgbm90IHRydXN0ZWQiKTsKKwljYXNlIFg1MDlfVl9FUlJfQ0VSVF9SRUpFQ1RFRDoKKwkJcmV0dXJuICgiY2VydGlmaWNhdGUgcmVqZWN0ZWQiKTsKKwljYXNlIFg1MDlfVl9FUlJfQVBQTElDQVRJT05fVkVSSUZJQ0FUSU9OOgorCQlyZXR1cm4oImFwcGxpY2F0aW9uIHZlcmlmaWNhdGlvbiBmYWlsdXJlIik7CisJY2FzZSBYNTA5X1ZfRVJSX1NVQkpFQ1RfSVNTVUVSX01JU01BVENIOgorCQlyZXR1cm4oInN1YmplY3QgaXNzdWVyIG1pc21hdGNoIik7CisJY2FzZSBYNTA5X1ZfRVJSX0FLSURfU0tJRF9NSVNNQVRDSDoKKwkJcmV0dXJuKCJhdXRob3JpdHkgYW5kIHN1YmplY3Qga2V5IGlkZW50aWZpZXIgbWlzbWF0Y2giKTsKKwljYXNlIFg1MDlfVl9FUlJfQUtJRF9JU1NVRVJfU0VSSUFMX01JU01BVENIOgorCQlyZXR1cm4oImF1dGhvcml0eSBhbmQgaXNzdWVyIHNlcmlhbCBudW1iZXIgbWlzbWF0Y2giKTsKKwljYXNlIFg1MDlfVl9FUlJfS0VZVVNBR0VfTk9fQ0VSVFNJR046CisJCXJldHVybigia2V5IHVzYWdlIGRvZXMgbm90IGluY2x1ZGUgY2VydGlmaWNhdGUgc2lnbmluZyIpOworCWNhc2UgWDUwOV9WX0VSUl9VTkFCTEVfVE9fR0VUX0NSTF9JU1NVRVI6CisJCXJldHVybigidW5hYmxlIHRvIGdldCBDUkwgaXNzdWVyIGNlcnRpZmljYXRlIik7CisJY2FzZSBYNTA5X1ZfRVJSX1VOSEFORExFRF9DUklUSUNBTF9FWFRFTlNJT046CisJCXJldHVybigidW5oYW5kbGVkIGNyaXRpY2FsIGV4dGVuc2lvbiIpOworCWNhc2UgWDUwOV9WX0VSUl9LRVlVU0FHRV9OT19DUkxfU0lHTjoKKwkJcmV0dXJuKCJrZXkgdXNhZ2UgZG9lcyBub3QgaW5jbHVkZSBDUkwgc2lnbmluZyIpOworCWNhc2UgWDUwOV9WX0VSUl9LRVlVU0FHRV9OT19ESUdJVEFMX1NJR05BVFVSRToKKwkJcmV0dXJuKCJrZXkgdXNhZ2UgZG9lcyBub3QgaW5jbHVkZSBkaWdpdGFsIHNpZ25hdHVyZSIpOworCWNhc2UgWDUwOV9WX0VSUl9VTkhBTkRMRURfQ1JJVElDQUxfQ1JMX0VYVEVOU0lPTjoKKwkJcmV0dXJuKCJ1bmhhbmRsZWQgY3JpdGljYWwgQ1JMIGV4dGVuc2lvbiIpOworCWNhc2UgWDUwOV9WX0VSUl9JTlZBTElEX0VYVEVOU0lPTjoKKwkJcmV0dXJuKCJpbnZhbGlkIG9yIGluY29uc2lzdGVudCBjZXJ0aWZpY2F0ZSBleHRlbnNpb24iKTsKKwljYXNlIFg1MDlfVl9FUlJfSU5WQUxJRF9QT0xJQ1lfRVhURU5TSU9OOgorCQlyZXR1cm4oImludmFsaWQgb3IgaW5jb25zaXN0ZW50IGNlcnRpZmljYXRlIHBvbGljeSBleHRlbnNpb24iKTsKKwljYXNlIFg1MDlfVl9FUlJfTk9fRVhQTElDSVRfUE9MSUNZOgorCQlyZXR1cm4oIm5vIGV4cGxpY2l0IHBvbGljeSIpOworCWNhc2UgWDUwOV9WX0VSUl9ESUZGRVJFTlRfQ1JMX1NDT1BFOgorCXJldHVybigiRGlmZmVyZW50IENSTCBzY29wZSIpOworCWNhc2UgWDUwOV9WX0VSUl9VTlNVUFBPUlRFRF9FWFRFTlNJT05fRkVBVFVSRToKKwlyZXR1cm4oIlVuc3VwcG9ydGVkIGV4dGVuc2lvbiBmZWF0dXJlIik7CisgCWNhc2UgWDUwOV9WX0VSUl9VTk5FU1RFRF9SRVNPVVJDRToKKyAJCXJldHVybigiUkZDIDM3NzkgcmVzb3VyY2Ugbm90IHN1YnNldCBvZiBwYXJlbnQncyByZXNvdXJjZXMiKTsKKworCWNhc2UgWDUwOV9WX0VSUl9QRVJNSVRURURfVklPTEFUSU9OOgorCQlyZXR1cm4oInBlcm1pdHRlZCBzdWJ0cmVlIHZpb2xhdGlvbiIpOworCWNhc2UgWDUwOV9WX0VSUl9FWENMVURFRF9WSU9MQVRJT046CisJCXJldHVybigiZXhjbHVkZWQgc3VidHJlZSB2aW9sYXRpb24iKTsKKwljYXNlIFg1MDlfVl9FUlJfU1VCVFJFRV9NSU5NQVg6CisJCXJldHVybigibmFtZSBjb25zdHJhaW50cyBtaW5pbXVtIGFuZCBtYXhpbXVtIG5vdCBzdXBwb3J0ZWQiKTsKKwljYXNlIFg1MDlfVl9FUlJfVU5TVVBQT1JURURfQ09OU1RSQUlOVF9UWVBFOgorCQlyZXR1cm4oInVuc3VwcG9ydGVkIG5hbWUgY29uc3RyYWludCB0eXBlIik7CisJY2FzZSBYNTA5X1ZfRVJSX1VOU1VQUE9SVEVEX0NPTlNUUkFJTlRfU1lOVEFYOgorCQlyZXR1cm4oInVuc3VwcG9ydGVkIG9yIGludmFsaWQgbmFtZSBjb25zdHJhaW50IHN5bnRheCIpOworCWNhc2UgWDUwOV9WX0VSUl9VTlNVUFBPUlRFRF9OQU1FX1NZTlRBWDoKKwkJcmV0dXJuKCJ1bnN1cHBvcnRlZCBvciBpbnZhbGlkIG5hbWUgc3ludGF4Iik7CisJY2FzZSBYNTA5X1ZfRVJSX0NSTF9QQVRIX1ZBTElEQVRJT05fRVJST1I6CisJCXJldHVybigiQ1JMIHBhdGggdmFsaWRhdGlvbiBlcnJvciIpOworCisJY2FzZSBYNTA5X1ZfRVJSX1NVSVRFX0JfSU5WQUxJRF9WRVJTSU9OOgorCQlyZXR1cm4oIlN1aXRlIEI6IGNlcnRpZmljYXRlIHZlcnNpb24gaW52YWxpZCIpOworCWNhc2UgWDUwOV9WX0VSUl9TVUlURV9CX0lOVkFMSURfQUxHT1JJVEhNOgorCQlyZXR1cm4oIlN1aXRlIEI6IGludmFsaWQgcHVibGljIGtleSBhbGdvcml0aG0iKTsKKwljYXNlIFg1MDlfVl9FUlJfU1VJVEVfQl9JTlZBTElEX0NVUlZFOgorCQlyZXR1cm4oIlN1aXRlIEI6IGludmFsaWQgRUNDIGN1cnZlIik7CisJY2FzZSBYNTA5X1ZfRVJSX1NVSVRFX0JfSU5WQUxJRF9TSUdOQVRVUkVfQUxHT1JJVEhNOgorCQlyZXR1cm4oIlN1aXRlIEI6IGludmFsaWQgc2lnbmF0dXJlIGFsZ29yaXRobSIpOworCWNhc2UgWDUwOV9WX0VSUl9TVUlURV9CX0xPU19OT1RfQUxMT1dFRDoKKwkJcmV0dXJuKCJTdWl0ZSBCOiBjdXJ2ZSBub3QgYWxsb3dlZCBmb3IgdGhpcyBMT1MiKTsKKwljYXNlIFg1MDlfVl9FUlJfU1VJVEVfQl9DQU5OT1RfU0lHTl9QXzM4NF9XSVRIX1BfMjU2OgorCQlyZXR1cm4oIlN1aXRlIEI6IGNhbm5vdCBzaWduIFAtMzg0IHdpdGggUC0yNTYiKTsKKworCWNhc2UgWDUwOV9WX0VSUl9IT1NUTkFNRV9NSVNNQVRDSDoKKwkJcmV0dXJuKCJIb3N0bmFtZSBtaXNtYXRjaCIpOworCWNhc2UgWDUwOV9WX0VSUl9FTUFJTF9NSVNNQVRDSDoKKwkJcmV0dXJuKCJFbWFpbCBhZGRyZXNzIG1pc21hdGNoIik7CisJY2FzZSBYNTA5X1ZfRVJSX0lQX0FERFJFU1NfTUlTTUFUQ0g6CisJCXJldHVybigiSVAgYWRkcmVzcyBtaXNtYXRjaCIpOworCisJZGVmYXVsdDoKKwkJQklPX3NucHJpbnRmKGJ1ZixzaXplb2YgYnVmLCJlcnJvciBudW1iZXIgJWxkIixuKTsKKwkJcmV0dXJuKGJ1Zik7CisJCX0KKwl9CisKKwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3g1MDkveDUwOV92My5jIGIvY3J5cHRvL3g1MDkveDUwOV92My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZmU3MjkKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOS94NTA5X3YzLmMKQEAgLTAsMCArMSwyNzEgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3N0YWNrLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworCitpbnQgWDUwOXYzX2dldF9leHRfY291bnQoY29uc3QgU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICp4KQorCXsKKwlpZiAoeCA9PSBOVUxMKSByZXR1cm4oMCk7CisJcmV0dXJuKHNrX1g1MDlfRVhURU5TSU9OX251bSh4KSk7CisJfQorCitpbnQgWDUwOXYzX2dldF9leHRfYnlfTklEKGNvbnN0IFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqeCwgaW50IG5pZCwKKwkJCSAgaW50IGxhc3Rwb3MpCisJeworCWNvbnN0IEFTTjFfT0JKRUNUICpvYmo7CisKKwlvYmo9T0JKX25pZDJvYmoobmlkKTsKKwlpZiAob2JqID09IE5VTEwpIHJldHVybigtMik7CisJcmV0dXJuKFg1MDl2M19nZXRfZXh0X2J5X09CSih4LG9iaixsYXN0cG9zKSk7CisJfQorCitpbnQgWDUwOXYzX2dldF9leHRfYnlfT0JKKGNvbnN0IFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqc2ssIGNvbnN0IEFTTjFfT0JKRUNUICpvYmosCisJCQkgIGludCBsYXN0cG9zKQorCXsKKwlpbnQgbjsKKwlYNTA5X0VYVEVOU0lPTiAqZXg7CisKKwlpZiAoc2sgPT0gTlVMTCkgcmV0dXJuKC0xKTsKKwlsYXN0cG9zKys7CisJaWYgKGxhc3Rwb3MgPCAwKQorCQlsYXN0cG9zPTA7CisJbj1za19YNTA5X0VYVEVOU0lPTl9udW0oc2spOworCWZvciAoIDsgbGFzdHBvcyA8IG47IGxhc3Rwb3MrKykKKwkJeworCQlleD1za19YNTA5X0VYVEVOU0lPTl92YWx1ZShzayxsYXN0cG9zKTsKKwkJaWYgKE9CSl9jbXAoZXgtPm9iamVjdCxvYmopID09IDApCisJCQlyZXR1cm4obGFzdHBvcyk7CisJCX0KKwlyZXR1cm4oLTEpOworCX0KKworaW50IFg1MDl2M19nZXRfZXh0X2J5X2NyaXRpY2FsKGNvbnN0IFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqc2ssIGludCBjcml0LAorCQkJICAgICAgIGludCBsYXN0cG9zKQorCXsKKwlpbnQgbjsKKwlYNTA5X0VYVEVOU0lPTiAqZXg7CisKKwlpZiAoc2sgPT0gTlVMTCkgcmV0dXJuKC0xKTsKKwlsYXN0cG9zKys7CisJaWYgKGxhc3Rwb3MgPCAwKQorCQlsYXN0cG9zPTA7CisJbj1za19YNTA5X0VYVEVOU0lPTl9udW0oc2spOworCWZvciAoIDsgbGFzdHBvcyA8IG47IGxhc3Rwb3MrKykKKwkJeworCQlleD1za19YNTA5X0VYVEVOU0lPTl92YWx1ZShzayxsYXN0cG9zKTsKKwkJaWYgKAkoKGV4LT5jcml0aWNhbCA+IDApICYmIGNyaXQpIHx8CisJCQkoKGV4LT5jcml0aWNhbCA8PSAwKSAmJiAhY3JpdCkpCisJCQlyZXR1cm4obGFzdHBvcyk7CisJCX0KKwlyZXR1cm4oLTEpOworCX0KKworWDUwOV9FWFRFTlNJT04gKlg1MDl2M19nZXRfZXh0KGNvbnN0IFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqeCwgaW50IGxvYykKKwl7CisJaWYgKHggPT0gTlVMTCB8fCBsb2MgPCAwIHx8IHNrX1g1MDlfRVhURU5TSU9OX251bSh4KSA8PSAoc2l6ZV90KSBsb2MpCisJCXJldHVybiBOVUxMOworCWVsc2UKKwkJcmV0dXJuIHNrX1g1MDlfRVhURU5TSU9OX3ZhbHVlKHgsbG9jKTsKKwl9CisKK1g1MDlfRVhURU5TSU9OICpYNTA5djNfZGVsZXRlX2V4dChTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKngsIGludCBsb2MpCisJeworCVg1MDlfRVhURU5TSU9OICpyZXQ7CisKKwlpZiAoeCA9PSBOVUxMIHx8IGxvYyA8IDAgfHwgc2tfWDUwOV9FWFRFTlNJT05fbnVtKHgpIDw9IChzaXplX3QpIGxvYykKKwkJcmV0dXJuKE5VTEwpOworCXJldD1za19YNTA5X0VYVEVOU0lPTl9kZWxldGUoeCxsb2MpOworCXJldHVybihyZXQpOworCX0KKworU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICpYNTA5djNfYWRkX2V4dChTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKip4LAorCQkJCQkgWDUwOV9FWFRFTlNJT04gKmV4LCBpbnQgbG9jKQorCXsKKwlYNTA5X0VYVEVOU0lPTiAqbmV3X2V4PU5VTEw7CisJaW50IG47CisJU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICpzaz1OVUxMOworCisJaWYgKHggPT0gTlVMTCkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5djNfYWRkX2V4dCwgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJZ290byBlcnIyOworCQl9CisKKwlpZiAoKnggPT0gTlVMTCkKKwkJeworCQlpZiAoKHNrPXNrX1g1MDlfRVhURU5TSU9OX25ld19udWxsKCkpID09IE5VTEwpCisJCQlnb3RvIGVycjsKKwkJfQorCWVsc2UKKwkJc2s9ICp4OworCisJbj1za19YNTA5X0VYVEVOU0lPTl9udW0oc2spOworCWlmIChsb2MgPiBuKSBsb2M9bjsKKwllbHNlIGlmIChsb2MgPCAwKSBsb2M9bjsKKworCWlmICgobmV3X2V4PVg1MDlfRVhURU5TSU9OX2R1cChleCkpID09IE5VTEwpCisJCWdvdG8gZXJyMjsKKwlpZiAoIXNrX1g1MDlfRVhURU5TSU9OX2luc2VydChzayxuZXdfZXgsbG9jKSkKKwkJZ290byBlcnI7CisJaWYgKCp4ID09IE5VTEwpCisJCSp4PXNrOworCXJldHVybihzayk7CitlcnI6CisJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOXYzX2FkZF9leHQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKK2VycjI6CisJaWYgKG5ld19leCAhPSBOVUxMKSBYNTA5X0VYVEVOU0lPTl9mcmVlKG5ld19leCk7CisJaWYgKHNrICE9IE5VTEwpIHNrX1g1MDlfRVhURU5TSU9OX2ZyZWUoc2spOworCXJldHVybihOVUxMKTsKKwl9CisKK1g1MDlfRVhURU5TSU9OICpYNTA5X0VYVEVOU0lPTl9jcmVhdGVfYnlfTklEKFg1MDlfRVhURU5TSU9OICoqZXgsIGludCBuaWQsCisJICAgICBpbnQgY3JpdCwgQVNOMV9PQ1RFVF9TVFJJTkcgKmRhdGEpCisJeworCWNvbnN0IEFTTjFfT0JKRUNUICpvYmo7CisJWDUwOV9FWFRFTlNJT04gKnJldDsKKworCW9iaj1PQkpfbmlkMm9iaihuaWQpOworCWlmIChvYmogPT0gTlVMTCkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X0VYVEVOU0lPTl9jcmVhdGVfYnlfTklELCBYNTA5X1JfVU5LTk9XTl9OSUQpOworCQlyZXR1cm4oTlVMTCk7CisJCX0KKwlyZXQ9WDUwOV9FWFRFTlNJT05fY3JlYXRlX2J5X09CSihleCxvYmosY3JpdCxkYXRhKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK1g1MDlfRVhURU5TSU9OICpYNTA5X0VYVEVOU0lPTl9jcmVhdGVfYnlfT0JKKFg1MDlfRVhURU5TSU9OICoqZXgsCisJICAgICBjb25zdCBBU04xX09CSkVDVCAqb2JqLCBpbnQgY3JpdCwgQVNOMV9PQ1RFVF9TVFJJTkcgKmRhdGEpCisJeworCVg1MDlfRVhURU5TSU9OICpyZXQ7CisKKwlpZiAoKGV4ID09IE5VTEwpIHx8ICgqZXggPT0gTlVMTCkpCisJCXsKKwkJaWYgKChyZXQ9WDUwOV9FWFRFTlNJT05fbmV3KCkpID09IE5VTEwpCisJCQl7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X0VYVEVOU0lPTl9jcmVhdGVfYnlfT0JKLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlyZXR1cm4oTlVMTCk7CisJCQl9CisJCX0KKwllbHNlCisJCXJldD0gKmV4OworCisJaWYgKCFYNTA5X0VYVEVOU0lPTl9zZXRfb2JqZWN0KHJldCxvYmopKQorCQlnb3RvIGVycjsKKwlpZiAoIVg1MDlfRVhURU5TSU9OX3NldF9jcml0aWNhbChyZXQsY3JpdCkpCisJCWdvdG8gZXJyOworCWlmICghWDUwOV9FWFRFTlNJT05fc2V0X2RhdGEocmV0LGRhdGEpKQorCQlnb3RvIGVycjsKKwkKKwlpZiAoKGV4ICE9IE5VTEwpICYmICgqZXggPT0gTlVMTCkpICpleD1yZXQ7CisJcmV0dXJuKHJldCk7CitlcnI6CisJaWYgKChleCA9PSBOVUxMKSB8fCAocmV0ICE9ICpleCkpCisJCVg1MDlfRVhURU5TSU9OX2ZyZWUocmV0KTsKKwlyZXR1cm4oTlVMTCk7CisJfQorCitpbnQgWDUwOV9FWFRFTlNJT05fc2V0X29iamVjdChYNTA5X0VYVEVOU0lPTiAqZXgsIGNvbnN0IEFTTjFfT0JKRUNUICpvYmopCisJeworCWlmICgoZXggPT0gTlVMTCkgfHwgKG9iaiA9PSBOVUxMKSkKKwkJcmV0dXJuKDApOworCUFTTjFfT0JKRUNUX2ZyZWUoZXgtPm9iamVjdCk7CisJZXgtPm9iamVjdD1PQkpfZHVwKG9iaik7CisJcmV0dXJuKDEpOworCX0KKworaW50IFg1MDlfRVhURU5TSU9OX3NldF9jcml0aWNhbChYNTA5X0VYVEVOU0lPTiAqZXgsIGludCBjcml0KQorCXsKKwlpZiAoZXggPT0gTlVMTCkgcmV0dXJuKDApOworCWV4LT5jcml0aWNhbD0oY3JpdCk/MHhGRjotMTsKKwlyZXR1cm4oMSk7CisJfQorCitpbnQgWDUwOV9FWFRFTlNJT05fc2V0X2RhdGEoWDUwOV9FWFRFTlNJT04gKmV4LCBBU04xX09DVEVUX1NUUklORyAqZGF0YSkKKwl7CisJaW50IGk7CisKKwlpZiAoZXggPT0gTlVMTCkgcmV0dXJuKDApOworCWk9TV9BU04xX09DVEVUX1NUUklOR19zZXQoZXgtPnZhbHVlLGRhdGEtPmRhdGEsZGF0YS0+bGVuZ3RoKTsKKwlpZiAoIWkpIHJldHVybigwKTsKKwlyZXR1cm4oMSk7CisJfQorCitBU04xX09CSkVDVCAqWDUwOV9FWFRFTlNJT05fZ2V0X29iamVjdChYNTA5X0VYVEVOU0lPTiAqZXgpCisJeworCWlmIChleCA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CisJcmV0dXJuKGV4LT5vYmplY3QpOworCX0KKworQVNOMV9PQ1RFVF9TVFJJTkcgKlg1MDlfRVhURU5TSU9OX2dldF9kYXRhKFg1MDlfRVhURU5TSU9OICpleCkKKwl7CisJaWYgKGV4ID09IE5VTEwpIHJldHVybihOVUxMKTsKKwlyZXR1cm4oZXgtPnZhbHVlKTsKKwl9CisKK2ludCBYNTA5X0VYVEVOU0lPTl9nZXRfY3JpdGljYWwoWDUwOV9FWFRFTlNJT04gKmV4KQorCXsKKwlpZiAoZXggPT0gTlVMTCkgcmV0dXJuKDApOworCWlmKGV4LT5jcml0aWNhbCA+IDApIHJldHVybiAxOworCXJldHVybiAwOworCX0KZGlmZiAtLWdpdCBhL2NyeXB0by94NTA5L3g1MDlfdmZ5LmMgYi9jcnlwdG8veDUwOS94NTA5X3ZmeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMjA4N2YKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOS94NTA5X3ZmeS5jCkBAIC0wLDAgKzEsMjQ1NyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYnVmLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbGhhc2guaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworI2luY2x1ZGUgInZwbV9pbnQuaCIKKworLyogQ1JMIHNjb3JlIHZhbHVlcyAqLworCisvKiBObyB1bmhhbmRsZWQgY3JpdGljYWwgZXh0ZW5zaW9ucyAqLworCisjZGVmaW5lIENSTF9TQ09SRV9OT0NSSVRJQ0FMCTB4MTAwCisKKy8qIGNlcnRpZmljYXRlIGlzIHdpdGhpbiBDUkwgc2NvcGUgKi8KKworI2RlZmluZSBDUkxfU0NPUkVfU0NPUEUJCTB4MDgwCisKKy8qIENSTCB0aW1lcyB2YWxpZCAqLworCisjZGVmaW5lIENSTF9TQ09SRV9USU1FCQkweDA0MAorCisvKiBJc3N1ZXIgbmFtZSBtYXRjaGVzIGNlcnRpZmljYXRlICovCisKKyNkZWZpbmUgQ1JMX1NDT1JFX0lTU1VFUl9OQU1FCTB4MDIwCisKKy8qIElmIHRoaXMgc2NvcmUgb3IgYWJvdmUgQ1JMIGlzIHByb2JhYmx5IHZhbGlkICovCisKKyNkZWZpbmUgQ1JMX1NDT1JFX1ZBTElEIChDUkxfU0NPUkVfTk9DUklUSUNBTHxDUkxfU0NPUkVfVElNRXxDUkxfU0NPUkVfU0NPUEUpCisKKy8qIENSTCBpc3N1ZXIgaXMgY2VydGlmaWNhdGUgaXNzdWVyICovCisKKyNkZWZpbmUgQ1JMX1NDT1JFX0lTU1VFUl9DRVJUCTB4MDE4CisKKy8qIENSTCBpc3N1ZXIgaXMgb24gY2VydGlmaWNhdGUgcGF0aCAqLworCisjZGVmaW5lIENSTF9TQ09SRV9TQU1FX1BBVEgJMHgwMDgKKworLyogQ1JMIGlzc3VlciBtYXRjaGVzIENSTCBBS0lEICovCisKKyNkZWZpbmUgQ1JMX1NDT1JFX0FLSUQJCTB4MDA0CisKKy8qIEhhdmUgYSBkZWx0YSBDUkwgd2l0aCB2YWxpZCB0aW1lcyAqLworCisjZGVmaW5lIENSTF9TQ09SRV9USU1FX0RFTFRBCTB4MDAyCisKK3N0YXRpYyBpbnQgbnVsbF9jYWxsYmFjayhpbnQgb2ssWDUwOV9TVE9SRV9DVFggKmUpOworc3RhdGljIGludCBjaGVja19pc3N1ZWQoWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOSAqeCwgWDUwOSAqaXNzdWVyKTsKK3N0YXRpYyBYNTA5ICpmaW5kX2lzc3VlcihYNTA5X1NUT1JFX0NUWCAqY3R4LCBTVEFDS19PRihYNTA5KSAqc2ssIFg1MDkgKngpOworc3RhdGljIGludCBjaGVja19jaGFpbl9leHRlbnNpb25zKFg1MDlfU1RPUkVfQ1RYICpjdHgpOworc3RhdGljIGludCBjaGVja19uYW1lX2NvbnN0cmFpbnRzKFg1MDlfU1RPUkVfQ1RYICpjdHgpOworc3RhdGljIGludCBjaGVja19pZChYNTA5X1NUT1JFX0NUWCAqY3R4KTsKK3N0YXRpYyBpbnQgY2hlY2tfdHJ1c3QoWDUwOV9TVE9SRV9DVFggKmN0eCk7CitzdGF0aWMgaW50IGNoZWNrX3Jldm9jYXRpb24oWDUwOV9TVE9SRV9DVFggKmN0eCk7CitzdGF0aWMgaW50IGNoZWNrX2NlcnQoWDUwOV9TVE9SRV9DVFggKmN0eCk7CitzdGF0aWMgaW50IGNoZWNrX3BvbGljeShYNTA5X1NUT1JFX0NUWCAqY3R4KTsKKworc3RhdGljIGludCBnZXRfY3JsX3Njb3JlKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDkgKipwaXNzdWVyLAorCQkJdW5zaWduZWQgaW50ICpwcmVhc29ucywKKwkJCVg1MDlfQ1JMICpjcmwsIFg1MDkgKngpOworc3RhdGljIGludCBnZXRfY3JsX2RlbHRhKFg1MDlfU1RPUkVfQ1RYICpjdHgsCisJCQkJWDUwOV9DUkwgKipwY3JsLCBYNTA5X0NSTCAqKnBkY3JsLCBYNTA5ICp4KTsKK3N0YXRpYyB2b2lkIGdldF9kZWx0YV9zayhYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5X0NSTCAqKmRjcmwsIGludCAqcGNybF9zY29yZSwKKwkJCVg1MDlfQ1JMICpiYXNlLCBTVEFDS19PRihYNTA5X0NSTCkgKmNybHMpOworc3RhdGljIHZvaWQgY3JsX2FraWRfY2hlY2soWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOV9DUkwgKmNybCwKKwkJCQlYNTA5ICoqcGlzc3VlciwgaW50ICpwY3JsX3Njb3JlKTsKK3N0YXRpYyBpbnQgY3JsX2NybGRwX2NoZWNrKFg1MDkgKngsIFg1MDlfQ1JMICpjcmwsIGludCBjcmxfc2NvcmUsCisJCQkJdW5zaWduZWQgaW50ICpwcmVhc29ucyk7CitzdGF0aWMgaW50IGNoZWNrX2NybF9wYXRoKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDkgKngpOworc3RhdGljIGludCBjaGVja19jcmxfY2hhaW4oWDUwOV9TVE9SRV9DVFggKmN0eCwKKwkJCVNUQUNLX09GKFg1MDkpICpjZXJ0X3BhdGgsCisJCQlTVEFDS19PRihYNTA5KSAqY3JsX3BhdGgpOworCitzdGF0aWMgaW50IGludGVybmFsX3ZlcmlmeShYNTA5X1NUT1JFX0NUWCAqY3R4KTsKK2NvbnN0IGNoYXIgWDUwOV92ZXJzaW9uW109IlguNTA5IjsKKworCitzdGF0aWMgaW50IG51bGxfY2FsbGJhY2soaW50IG9rLCBYNTA5X1NUT1JFX0NUWCAqZSkKKwl7CisJcmV0dXJuIG9rOworCX0KKworI2lmIDAKK3N0YXRpYyBpbnQgeDUwOV9zdWJqZWN0X2NtcChYNTA5ICoqYSwgWDUwOSAqKmIpCisJeworCXJldHVybiBYNTA5X3N1YmplY3RfbmFtZV9jbXAoKmEsKmIpOworCX0KKyNlbmRpZgorCisvKiBHaXZlbiBhIGNlcnRpZmljYXRlIHRyeSBhbmQgZmluZCBhbiBleGFjdCBtYXRjaCBpbiB0aGUgc3RvcmUgKi8KKworc3RhdGljIFg1MDkgKmxvb2t1cF9jZXJ0X21hdGNoKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDkgKngpCisJeworCVNUQUNLX09GKFg1MDkpICpjZXJ0czsKKwlYNTA5ICp4dG1wID0gTlVMTDsKKwlzaXplX3QgaTsKKwkvKiBMb29rdXAgYWxsIGNlcnRzIHdpdGggbWF0Y2hpbmcgc3ViamVjdCBuYW1lICovCisJY2VydHMgPSBjdHgtPmxvb2t1cF9jZXJ0cyhjdHgsIFg1MDlfZ2V0X3N1YmplY3RfbmFtZSh4KSk7CisJaWYgKGNlcnRzID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCS8qIExvb2sgZm9yIGV4YWN0IG1hdGNoICovCisJZm9yIChpID0gMDsgaSA8IHNrX1g1MDlfbnVtKGNlcnRzKTsgaSsrKQorCQl7CisJCXh0bXAgPSBza19YNTA5X3ZhbHVlKGNlcnRzLCBpKTsKKwkJaWYgKCFYNTA5X2NtcCh4dG1wLCB4KSkKKwkJCWJyZWFrOworCQl9CisJaWYgKGkgPCBza19YNTA5X251bShjZXJ0cykpCisJCUNSWVBUT19hZGQoJnh0bXAtPnJlZmVyZW5jZXMsMSxDUllQVE9fTE9DS19YNTA5KTsKKwllbHNlCisJCXh0bXAgPSBOVUxMOworCXNrX1g1MDlfcG9wX2ZyZWUoY2VydHMsIFg1MDlfZnJlZSk7CisJcmV0dXJuIHh0bXA7CisJfQorCitpbnQgWDUwOV92ZXJpZnlfY2VydChYNTA5X1NUT1JFX0NUWCAqY3R4KQorCXsKKwlYNTA5ICp4LCp4dG1wLCpjaGFpbl9zcz1OVUxMOworCWludCBiYWRfY2hhaW4gPSAwOworCVg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSA9IGN0eC0+cGFyYW07CisJaW50IGRlcHRoLGksb2s9MDsKKwlpbnQgbnVtOworCWludCAoKmNiKShpbnQgeG9rLFg1MDlfU1RPUkVfQ1RYICp4Y3R4KTsKKwlTVEFDS19PRihYNTA5KSAqc2t0bXA9TlVMTDsKKwlpZiAoY3R4LT5jZXJ0ID09IE5VTEwpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV92ZXJpZnlfY2VydCwgWDUwOV9SX05PX0NFUlRfU0VUX0ZPUl9VU19UT19WRVJJRlkpOworCQlyZXR1cm4gLTE7CisJCX0KKworCWNiPWN0eC0+dmVyaWZ5X2NiOworCisJLyogZmlyc3Qgd2UgbWFrZSBzdXJlIHRoZSBjaGFpbiB3ZSBhcmUgZ29pbmcgdG8gYnVpbGQgaXMKKwkgKiBwcmVzZW50IGFuZCB0aGF0IHRoZSBmaXJzdCBlbnRyeSBpcyBpbiBwbGFjZSAqLworCWlmIChjdHgtPmNoYWluID09IE5VTEwpCisJCXsKKwkJaWYgKAkoKGN0eC0+Y2hhaW49c2tfWDUwOV9uZXdfbnVsbCgpKSA9PSBOVUxMKSB8fAorCQkJKCFza19YNTA5X3B1c2goY3R4LT5jaGFpbixjdHgtPmNlcnQpKSkKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfdmVyaWZ5X2NlcnQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQlDUllQVE9fYWRkKCZjdHgtPmNlcnQtPnJlZmVyZW5jZXMsMSxDUllQVE9fTE9DS19YNTA5KTsKKwkJY3R4LT5sYXN0X3VudHJ1c3RlZD0xOworCQl9CisKKwkvKiBXZSB1c2UgYSB0ZW1wb3JhcnkgU1RBQ0sgc28gd2UgY2FuIGNob3AgYW5kIGhhY2sgYXQgaXQgKi8KKwlpZiAoY3R4LT51bnRydXN0ZWQgIT0gTlVMTAorCSAgICAmJiAoc2t0bXA9c2tfWDUwOV9kdXAoY3R4LT51bnRydXN0ZWQpKSA9PSBOVUxMKQorCQl7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfdmVyaWZ5X2NlcnQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJZ290byBlbmQ7CisJCX0KKworCW51bT1za19YNTA5X251bShjdHgtPmNoYWluKTsKKwl4PXNrX1g1MDlfdmFsdWUoY3R4LT5jaGFpbixudW0tMSk7CisJZGVwdGg9cGFyYW0tPmRlcHRoOworCisKKwlmb3IgKDs7KQorCQl7CisJCS8qIElmIHdlIGhhdmUgZW5vdWdoLCB3ZSBicmVhayAqLworCQlpZiAoZGVwdGggPCBudW0pIGJyZWFrOyAvKiBGSVhNRTogSWYgdGhpcyBoYXBwZW5zLCB3ZSBzaG91bGQgdGFrZQorCQkgICAgICAgICAgICAgICAgICAgICAgICAgKiBub3RlIG9mIGl0IGFuZCwgaWYgYXBwcm9wcmlhdGUsIHVzZSB0aGUKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICogWDUwOV9WX0VSUl9DRVJUX0NIQUlOX1RPT19MT05HIGVycm9yCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAqIGNvZGUgbGF0ZXIuCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisJCS8qIElmIHdlIGFyZSBzZWxmIHNpZ25lZCwgd2UgYnJlYWsgKi8KKwkJaWYgKGN0eC0+Y2hlY2tfaXNzdWVkKGN0eCwgeCx4KSkgYnJlYWs7CisKKwkJLyogSWYgYXNrZWQgc2VlIGlmIHdlIGNhbiBmaW5kIGlzc3VlciBpbiB0cnVzdGVkIHN0b3JlIGZpcnN0ICovCisJCWlmIChjdHgtPnBhcmFtLT5mbGFncyAmIFg1MDlfVl9GTEFHX1RSVVNURURfRklSU1QpCisJCQl7CisJCQlvayA9IGN0eC0+Z2V0X2lzc3VlcigmeHRtcCwgY3R4LCB4KTsKKwkJCWlmIChvayA8IDApCisJCQkJcmV0dXJuIG9rOworCQkJLyogSWYgc3VjY2Vzc2Z1bCBmb3Igbm93IGZyZWUgdXAgY2VydCBzbyBpdAorCQkJICogd2lsbCBiZSBwaWNrZWQgdXAgYWdhaW4gbGF0ZXIuCisJCQkgKi8KKwkJCWlmIChvayA+IDApCisJCQkJeworCQkJCVg1MDlfZnJlZSh4dG1wKTsKKwkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJLyogSWYgd2Ugd2VyZSBwYXNzZWQgYSBjZXJ0IGNoYWluLCB1c2UgaXQgZmlyc3QgKi8KKwkJaWYgKGN0eC0+dW50cnVzdGVkICE9IE5VTEwpCisJCQl7CisJCQl4dG1wPWZpbmRfaXNzdWVyKGN0eCwgc2t0bXAseCk7CisJCQlpZiAoeHRtcCAhPSBOVUxMKQorCQkJCXsKKwkJCQlpZiAoIXNrX1g1MDlfcHVzaChjdHgtPmNoYWluLHh0bXApKQorCQkJCQl7CisJCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfdmVyaWZ5X2NlcnQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQkJZ290byBlbmQ7CisJCQkJCX0KKwkJCQlDUllQVE9fYWRkKCZ4dG1wLT5yZWZlcmVuY2VzLDEsQ1JZUFRPX0xPQ0tfWDUwOSk7CisJCQkJKHZvaWQpc2tfWDUwOV9kZWxldGVfcHRyKHNrdG1wLHh0bXApOworCQkJCWN0eC0+bGFzdF91bnRydXN0ZWQrKzsKKwkJCQl4PXh0bXA7CisJCQkJbnVtKys7CisJCQkJLyogcmVwYXJzZSB0aGUgZnVsbCBjaGFpbiBmb3IKKwkJCQkgKiB0aGUgbmV4dCBvbmUgKi8KKwkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCWJyZWFrOworCQl9CisKKwkvKiBhdCB0aGlzIHBvaW50LCBjaGFpbiBzaG91bGQgY29udGFpbiBhIGxpc3Qgb2YgdW50cnVzdGVkCisJICogY2VydGlmaWNhdGVzLiAgV2Ugbm93IG5lZWQgdG8gYWRkIGF0IGxlYXN0IG9uZSB0cnVzdGVkIG9uZSwKKwkgKiBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlIHdlIGNvbXBsYWluLiAqLworCisJLyogRXhhbWluZSBsYXN0IGNlcnRpZmljYXRlIGluIGNoYWluIGFuZCBzZWUgaWYgaXQKKyAJICogaXMgc2VsZiBzaWduZWQuCisgCSAqLworCisJaT1za19YNTA5X251bShjdHgtPmNoYWluKTsKKwl4PXNrX1g1MDlfdmFsdWUoY3R4LT5jaGFpbixpLTEpOworCWlmIChjdHgtPmNoZWNrX2lzc3VlZChjdHgsIHgsIHgpKQorCQl7CisJCS8qIHdlIGhhdmUgYSBzZWxmIHNpZ25lZCBjZXJ0aWZpY2F0ZSAqLworCQlpZiAoc2tfWDUwOV9udW0oY3R4LT5jaGFpbikgPT0gMSkKKwkJCXsKKwkJCS8qIFdlIGhhdmUgYSBzaW5nbGUgc2VsZiBzaWduZWQgY2VydGlmaWNhdGU6IHNlZSBpZgorCQkJICogd2UgY2FuIGZpbmQgaXQgaW4gdGhlIHN0b3JlLiBXZSBtdXN0IGhhdmUgYW4gZXhhY3QKKwkJCSAqIG1hdGNoIHRvIGF2b2lkIHBvc3NpYmxlIGltcGVyc29uYXRpb24uCisJCQkgKi8KKwkJCW9rID0gY3R4LT5nZXRfaXNzdWVyKCZ4dG1wLCBjdHgsIHgpOworCQkJaWYgKChvayA8PSAwKSB8fCBYNTA5X2NtcCh4LCB4dG1wKSkgCisJCQkJeworCQkJCWN0eC0+ZXJyb3I9WDUwOV9WX0VSUl9ERVBUSF9aRVJPX1NFTEZfU0lHTkVEX0NFUlQ7CisJCQkJY3R4LT5jdXJyZW50X2NlcnQ9eDsKKwkJCQljdHgtPmVycm9yX2RlcHRoPWktMTsKKwkJCQlpZiAob2sgPT0gMSkgWDUwOV9mcmVlKHh0bXApOworCQkJCWJhZF9jaGFpbiA9IDE7CisJCQkJb2s9Y2IoMCxjdHgpOworCQkJCWlmICghb2spIGdvdG8gZW5kOworCQkJCX0KKwkJCWVsc2UgCisJCQkJeworCQkJCS8qIFdlIGhhdmUgYSBtYXRjaDogcmVwbGFjZSBjZXJ0aWZpY2F0ZSB3aXRoIHN0b3JlIHZlcnNpb24KKwkJCQkgKiBzbyB3ZSBnZXQgYW55IHRydXN0IHNldHRpbmdzLgorCQkJCSAqLworCQkJCVg1MDlfZnJlZSh4KTsKKwkJCQl4ID0geHRtcDsKKwkJCQkodm9pZClza19YNTA5X3NldChjdHgtPmNoYWluLCBpIC0gMSwgeCk7CisJCQkJY3R4LT5sYXN0X3VudHJ1c3RlZD0wOworCQkJCX0KKwkJCX0KKwkJZWxzZQorCQkJeworCQkJLyogZXh0cmFjdCBhbmQgc2F2ZSBzZWxmIHNpZ25lZCBjZXJ0aWZpY2F0ZSBmb3IgbGF0ZXIgdXNlICovCisJCQljaGFpbl9zcz1za19YNTA5X3BvcChjdHgtPmNoYWluKTsKKwkJCWN0eC0+bGFzdF91bnRydXN0ZWQtLTsKKwkJCW51bS0tOworCQkJeD1za19YNTA5X3ZhbHVlKGN0eC0+Y2hhaW4sbnVtLTEpOworCQkJfQorCQl9CisKKwkvKiBXZSBub3cgbG9va3VwIGNlcnRzIGZyb20gdGhlIGNlcnRpZmljYXRlIHN0b3JlICovCisJZm9yICg7OykKKwkJeworCQkvKiBJZiB3ZSBoYXZlIGVub3VnaCwgd2UgYnJlYWsgKi8KKwkJaWYgKGRlcHRoIDwgbnVtKSBicmVhazsKKworCQkvKiBJZiB3ZSBhcmUgc2VsZiBzaWduZWQsIHdlIGJyZWFrICovCisJCWlmIChjdHgtPmNoZWNrX2lzc3VlZChjdHgseCx4KSkgYnJlYWs7CisKKwkJb2sgPSBjdHgtPmdldF9pc3N1ZXIoJnh0bXAsIGN0eCwgeCk7CisKKwkJaWYgKG9rIDwgMCkgcmV0dXJuIG9rOworCQlpZiAob2sgPT0gMCkgYnJlYWs7CisKKwkJeCA9IHh0bXA7CisJCWlmICghc2tfWDUwOV9wdXNoKGN0eC0+Y2hhaW4seCkpCisJCQl7CisJCQlYNTA5X2ZyZWUoeHRtcCk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X3ZlcmlmeV9jZXJ0LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJbnVtKys7CisJCX0KKworCS8qIHdlIG5vdyBoYXZlIG91ciBjaGFpbiwgbGV0cyBjaGVjayBpdC4uLiAqLworCisJaSA9IGNoZWNrX3RydXN0KGN0eCk7CisKKwkvKiBJZiBleHBsaWNpdGx5IHJlamVjdGVkIGVycm9yICovCisJaWYgKGkgPT0gWDUwOV9UUlVTVF9SRUpFQ1RFRCkKKwkJZ290byBlbmQ7CisJLyogSWYgbm90IGV4cGxpY2l0bHkgdHJ1c3RlZCB0aGVuIGluZGljYXRlIGVycm9yICovCisJaWYgKGkgIT0gWDUwOV9UUlVTVF9UUlVTVEVEKQorCQl7CisJCWlmICgoY2hhaW5fc3MgPT0gTlVMTCkgfHwgIWN0eC0+Y2hlY2tfaXNzdWVkKGN0eCwgeCwgY2hhaW5fc3MpKQorCQkJeworCQkJaWYgKGN0eC0+bGFzdF91bnRydXN0ZWQgPj0gbnVtKQorCQkJCWN0eC0+ZXJyb3I9WDUwOV9WX0VSUl9VTkFCTEVfVE9fR0VUX0lTU1VFUl9DRVJUX0xPQ0FMTFk7CisJCQllbHNlCisJCQkJY3R4LT5lcnJvcj1YNTA5X1ZfRVJSX1VOQUJMRV9UT19HRVRfSVNTVUVSX0NFUlQ7CisJCQljdHgtPmN1cnJlbnRfY2VydD14OworCQkJfQorCQllbHNlCisJCQl7CisKKwkJCXNrX1g1MDlfcHVzaChjdHgtPmNoYWluLGNoYWluX3NzKTsKKwkJCW51bSsrOworCQkJY3R4LT5sYXN0X3VudHJ1c3RlZD1udW07CisJCQljdHgtPmN1cnJlbnRfY2VydD1jaGFpbl9zczsKKwkJCWN0eC0+ZXJyb3I9WDUwOV9WX0VSUl9TRUxGX1NJR05FRF9DRVJUX0lOX0NIQUlOOworCQkJY2hhaW5fc3M9TlVMTDsKKwkJCX0KKworCQljdHgtPmVycm9yX2RlcHRoPW51bS0xOworCQliYWRfY2hhaW4gPSAxOworCQlvaz1jYigwLGN0eCk7CisJCWlmICghb2spIGdvdG8gZW5kOworCQl9CisKKwkvKiBXZSBoYXZlIHRoZSBjaGFpbiBjb21wbGV0ZTogbm93IHdlIG5lZWQgdG8gY2hlY2sgaXRzIHB1cnBvc2UgKi8KKwlvayA9IGNoZWNrX2NoYWluX2V4dGVuc2lvbnMoY3R4KTsKKworCWlmICghb2spIGdvdG8gZW5kOworCisJLyogQ2hlY2sgbmFtZSBjb25zdHJhaW50cyAqLworCisJb2sgPSBjaGVja19uYW1lX2NvbnN0cmFpbnRzKGN0eCk7CisJCisJaWYgKCFvaykgZ290byBlbmQ7CisKKwlvayA9IGNoZWNrX2lkKGN0eCk7CisKKwlpZiAoIW9rKSBnb3RvIGVuZDsKKworCS8qIFdlIG1heSBhcyB3ZWxsIGNvcHkgZG93biBhbnkgRFNBIHBhcmFtZXRlcnMgdGhhdCBhcmUgcmVxdWlyZWQgKi8KKwlYNTA5X2dldF9wdWJrZXlfcGFyYW1ldGVycyhOVUxMLGN0eC0+Y2hhaW4pOworCisJLyogQ2hlY2sgcmV2b2NhdGlvbiBzdGF0dXM6IHdlIGRvIHRoaXMgYWZ0ZXIgY29weWluZyBwYXJhbWV0ZXJzCisJICogYmVjYXVzZSB0aGV5IG1heSBiZSBuZWVkZWQgZm9yIENSTCBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLgorCSAqLworCisJb2sgPSBjdHgtPmNoZWNrX3Jldm9jYXRpb24oY3R4KTsKKwlpZighb2spIGdvdG8gZW5kOworCisJaSA9IFg1MDlfY2hhaW5fY2hlY2tfc3VpdGViKCZjdHgtPmVycm9yX2RlcHRoLCBOVUxMLCBjdHgtPmNoYWluLAorCQkJCQkJCWN0eC0+cGFyYW0tPmZsYWdzKTsKKwlpZiAoaSAhPSBYNTA5X1ZfT0spCisJCXsKKwkJY3R4LT5lcnJvciA9IGk7CisJCWN0eC0+Y3VycmVudF9jZXJ0ID0gc2tfWDUwOV92YWx1ZShjdHgtPmNoYWluLCBjdHgtPmVycm9yX2RlcHRoKTsKKwkJb2sgPSBjYigwLCBjdHgpOworCQlpZiAoIW9rKQorCQkJZ290byBlbmQ7CisJCX0KKworCS8qIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgYSBjaGFpbiBhbmQgbmVlZCB0byB2ZXJpZnkgaXQgKi8KKwlpZiAoY3R4LT52ZXJpZnkgIT0gTlVMTCkKKwkJb2s9Y3R4LT52ZXJpZnkoY3R4KTsKKwllbHNlCisJCW9rPWludGVybmFsX3ZlcmlmeShjdHgpOworCWlmKCFvaykgZ290byBlbmQ7CisKKwkvKiBJZiB3ZSBnZXQgdGhpcyBmYXIgZXZhbHVhdGUgcG9saWNpZXMgKi8KKwlpZiAoIWJhZF9jaGFpbiAmJiAoY3R4LT5wYXJhbS0+ZmxhZ3MgJiBYNTA5X1ZfRkxBR19QT0xJQ1lfQ0hFQ0spKQorCQlvayA9IGN0eC0+Y2hlY2tfcG9saWN5KGN0eCk7CisJaWYoIW9rKSBnb3RvIGVuZDsKKwlpZiAoMCkKKwkJeworZW5kOgorCQlYNTA5X2dldF9wdWJrZXlfcGFyYW1ldGVycyhOVUxMLGN0eC0+Y2hhaW4pOworCQl9CisJaWYgKHNrdG1wICE9IE5VTEwpIHNrX1g1MDlfZnJlZShza3RtcCk7CisJaWYgKGNoYWluX3NzICE9IE5VTEwpIFg1MDlfZnJlZShjaGFpbl9zcyk7CisJcmV0dXJuIG9rOworCX0KKworCisvKiBHaXZlbiBhIFNUQUNLX09GKFg1MDkpIGZpbmQgdGhlIGlzc3VlciBvZiBjZXJ0IChpZiBhbnkpCisgKi8KKworc3RhdGljIFg1MDkgKmZpbmRfaXNzdWVyKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFNUQUNLX09GKFg1MDkpICpzaywgWDUwOSAqeCkKK3sKKwlzaXplX3QgaTsKKwlYNTA5ICppc3N1ZXI7CisJZm9yIChpID0gMDsgaSA8IHNrX1g1MDlfbnVtKHNrKTsgaSsrKQorCQl7CisJCWlzc3VlciA9IHNrX1g1MDlfdmFsdWUoc2ssIGkpOworCQlpZiAoY3R4LT5jaGVja19pc3N1ZWQoY3R4LCB4LCBpc3N1ZXIpKQorCQkJcmV0dXJuIGlzc3VlcjsKKwkJfQorCXJldHVybiBOVUxMOworfQorCisvKiBHaXZlbiBhIHBvc3NpYmxlIGNlcnRpZmljYXRlIGFuZCBpc3N1ZXIgY2hlY2sgdGhlbSAqLworCitzdGF0aWMgaW50IGNoZWNrX2lzc3VlZChYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5ICp4LCBYNTA5ICppc3N1ZXIpCit7CisJaW50IHJldDsKKwlyZXQgPSBYNTA5X2NoZWNrX2lzc3VlZChpc3N1ZXIsIHgpOworCWlmIChyZXQgPT0gWDUwOV9WX09LKQorCQlyZXR1cm4gMTsKKwkvKiBJZiB3ZSBoYXZlbid0IGFza2VkIGZvciBpc3N1ZXIgZXJyb3JzIGRvbid0IHNldCBjdHggKi8KKwlpZiAoIShjdHgtPnBhcmFtLT5mbGFncyAmIFg1MDlfVl9GTEFHX0NCX0lTU1VFUl9DSEVDSykpCisJCXJldHVybiAwOworCisJY3R4LT5lcnJvciA9IHJldDsKKwljdHgtPmN1cnJlbnRfY2VydCA9IHg7CisJY3R4LT5jdXJyZW50X2lzc3VlciA9IGlzc3VlcjsKKwlyZXR1cm4gY3R4LT52ZXJpZnlfY2IoMCwgY3R4KTsKKwlyZXR1cm4gMDsKK30KKworLyogQWx0ZXJuYXRpdmUgbG9va3VwIG1ldGhvZDogbG9vayBmcm9tIGEgU1RBQ0sgc3RvcmVkIGluIG90aGVyX2N0eCAqLworCitzdGF0aWMgaW50IGdldF9pc3N1ZXJfc2soWDUwOSAqKmlzc3VlciwgWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOSAqeCkKK3sKKwkqaXNzdWVyID0gZmluZF9pc3N1ZXIoY3R4LCBjdHgtPm90aGVyX2N0eCwgeCk7CisJaWYgKCppc3N1ZXIpCisJCXsKKwkJQ1JZUFRPX2FkZCgmKCppc3N1ZXIpLT5yZWZlcmVuY2VzLDEsQ1JZUFRPX0xPQ0tfWDUwOSk7CisJCXJldHVybiAxOworCQl9CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKwkKKworLyogQ2hlY2sgYSBjZXJ0aWZpY2F0ZSBjaGFpbnMgZXh0ZW5zaW9ucyBmb3IgY29uc2lzdGVuY3kKKyAqIHdpdGggdGhlIHN1cHBsaWVkIHB1cnBvc2UKKyAqLworCitzdGF0aWMgaW50IGNoZWNrX2NoYWluX2V4dGVuc2lvbnMoWDUwOV9TVE9SRV9DVFggKmN0eCkKK3sKKyNpZmRlZiBPUEVOU1NMX05PX0NIQUlOX1ZFUklGWQorCXJldHVybiAxOworI2Vsc2UKKwlpbnQgaSwgb2s9MCwgbXVzdF9iZV9jYSwgcGxlbiA9IDA7CisJWDUwOSAqeDsKKwlpbnQgKCpjYikoaW50IHhvayxYNTA5X1NUT1JFX0NUWCAqeGN0eCk7CisJaW50IHByb3h5X3BhdGhfbGVuZ3RoID0gMDsKKwlpbnQgcHVycG9zZTsKKwlpbnQgYWxsb3dfcHJveHlfY2VydHM7CisJY2I9Y3R4LT52ZXJpZnlfY2I7CisKKwkvKiBtdXN0X2JlX2NhIGNhbiBoYXZlIDEgb2YgMyB2YWx1ZXM6CisJICAgLTE6IHdlIGFjY2VwdCBib3RoIENBIGFuZCBub24tQ0EgY2VydGlmaWNhdGVzLCB0byBhbGxvdyBkaXJlY3QKKwkgICAgICAgdXNlIG9mIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlcyAod2hpY2ggYXJlIG1hcmtlZCBhcyBDQSkuCisJICAgMDogIHdlIG9ubHkgYWNjZXB0IG5vbi1DQSBjZXJ0aWZpY2F0ZXMuICBUaGlzIGlzIGN1cnJlbnRseSBub3QKKwkgICAgICAgdXNlZCwgYnV0IHRoZSBwb3NzaWJpbGl0eSBpcyBwcmVzZW50IGZvciBmdXR1cmUgZXh0ZW5zaW9ucy4KKwkgICAxOiAgd2Ugb25seSBhY2NlcHQgQ0EgY2VydGlmaWNhdGVzLiAgVGhpcyBpcyBjdXJyZW50bHkgdXNlZCBmb3IKKwkgICAgICAgYWxsIGNlcnRpZmljYXRlcyBpbiB0aGUgY2hhaW4gZXhjZXB0IHRoZSBsZWFmIGNlcnRpZmljYXRlLgorCSovCisJbXVzdF9iZV9jYSA9IC0xOworCisJLyogQ1JMIHBhdGggdmFsaWRhdGlvbiAqLworCWlmIChjdHgtPnBhcmVudCkKKwkJeworCQlhbGxvd19wcm94eV9jZXJ0cyA9IDA7CisJCXB1cnBvc2UgPSBYNTA5X1BVUlBPU0VfQ1JMX1NJR047CisJCX0KKwllbHNlCisJCXsKKwkJYWxsb3dfcHJveHlfY2VydHMgPQorCQkJISEoY3R4LT5wYXJhbS0+ZmxhZ3MgJiBYNTA5X1ZfRkxBR19BTExPV19QUk9YWV9DRVJUUyk7CisJCS8qIEEgaGFjayB0byBrZWVwIHBlb3BsZSB3aG8gZG9uJ3Qgd2FudCB0byBtb2RpZnkgdGhlaXIKKwkJICAgc29mdHdhcmUgaGFwcHkgKi8KKwkJaWYgKGdldGVudigiT1BFTlNTTF9BTExPV19QUk9YWV9DRVJUUyIpKQorCQkJYWxsb3dfcHJveHlfY2VydHMgPSAxOworCQlwdXJwb3NlID0gY3R4LT5wYXJhbS0+cHVycG9zZTsKKwkJfQorCisJLyogQ2hlY2sgYWxsIHVudHJ1c3RlZCBjZXJ0aWZpY2F0ZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY3R4LT5sYXN0X3VudHJ1c3RlZDsgaSsrKQorCQl7CisJCWludCByZXQ7CisJCXggPSBza19YNTA5X3ZhbHVlKGN0eC0+Y2hhaW4sIGkpOworCQlpZiAoIShjdHgtPnBhcmFtLT5mbGFncyAmIFg1MDlfVl9GTEFHX0lHTk9SRV9DUklUSUNBTCkKKwkJCSYmICh4LT5leF9mbGFncyAmIEVYRkxBR19DUklUSUNBTCkpCisJCQl7CisJCQljdHgtPmVycm9yID0gWDUwOV9WX0VSUl9VTkhBTkRMRURfQ1JJVElDQUxfRVhURU5TSU9OOworCQkJY3R4LT5lcnJvcl9kZXB0aCA9IGk7CisJCQljdHgtPmN1cnJlbnRfY2VydCA9IHg7CisJCQlvaz1jYigwLGN0eCk7CisJCQlpZiAoIW9rKSBnb3RvIGVuZDsKKwkJCX0KKwkJaWYgKCFhbGxvd19wcm94eV9jZXJ0cyAmJiAoeC0+ZXhfZmxhZ3MgJiBFWEZMQUdfUFJPWFkpKQorCQkJeworCQkJY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfUFJPWFlfQ0VSVElGSUNBVEVTX05PVF9BTExPV0VEOworCQkJY3R4LT5lcnJvcl9kZXB0aCA9IGk7CisJCQljdHgtPmN1cnJlbnRfY2VydCA9IHg7CisJCQlvaz1jYigwLGN0eCk7CisJCQlpZiAoIW9rKSBnb3RvIGVuZDsKKwkJCX0KKwkJcmV0ID0gWDUwOV9jaGVja19jYSh4KTsKKwkJc3dpdGNoKG11c3RfYmVfY2EpCisJCQl7CisJCWNhc2UgLTE6CisJCQlpZiAoKGN0eC0+cGFyYW0tPmZsYWdzICYgWDUwOV9WX0ZMQUdfWDUwOV9TVFJJQ1QpCisJCQkJJiYgKHJldCAhPSAxKSAmJiAocmV0ICE9IDApKQorCQkJCXsKKwkJCQlyZXQgPSAwOworCQkJCWN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX0lOVkFMSURfQ0E7CisJCQkJfQorCQkJZWxzZQorCQkJCXJldCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAwOgorCQkJaWYgKHJldCAhPSAwKQorCQkJCXsKKwkJCQlyZXQgPSAwOworCQkJCWN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX0lOVkFMSURfTk9OX0NBOworCQkJCX0KKwkJCWVsc2UKKwkJCQlyZXQgPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAoKHJldCA9PSAwKQorCQkJCXx8ICgoY3R4LT5wYXJhbS0+ZmxhZ3MgJiBYNTA5X1ZfRkxBR19YNTA5X1NUUklDVCkKKwkJCQkJJiYgKHJldCAhPSAxKSkpCisJCQkJeworCQkJCXJldCA9IDA7CisJCQkJY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfSU5WQUxJRF9DQTsKKwkJCQl9CisJCQllbHNlCisJCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQkJfQorCQlpZiAocmV0ID09IDApCisJCQl7CisJCQljdHgtPmVycm9yX2RlcHRoID0gaTsKKwkJCWN0eC0+Y3VycmVudF9jZXJ0ID0geDsKKwkJCW9rPWNiKDAsY3R4KTsKKwkJCWlmICghb2spIGdvdG8gZW5kOworCQkJfQorCQlpZiAoY3R4LT5wYXJhbS0+cHVycG9zZSA+IDApCisJCQl7CisJCQlyZXQgPSBYNTA5X2NoZWNrX3B1cnBvc2UoeCwgcHVycG9zZSwgbXVzdF9iZV9jYSA+IDApOworCQkJaWYgKChyZXQgPT0gMCkKKwkJCQl8fCAoKGN0eC0+cGFyYW0tPmZsYWdzICYgWDUwOV9WX0ZMQUdfWDUwOV9TVFJJQ1QpCisJCQkJCSYmIChyZXQgIT0gMSkpKQorCQkJCXsKKwkJCQljdHgtPmVycm9yID0gWDUwOV9WX0VSUl9JTlZBTElEX1BVUlBPU0U7CisJCQkJY3R4LT5lcnJvcl9kZXB0aCA9IGk7CisJCQkJY3R4LT5jdXJyZW50X2NlcnQgPSB4OworCQkJCW9rPWNiKDAsY3R4KTsKKwkJCQlpZiAoIW9rKSBnb3RvIGVuZDsKKwkJCQl9CisJCQl9CisJCS8qIENoZWNrIHBhdGhsZW4gaWYgbm90IHNlbGYgaXNzdWVkICovCisJCWlmICgoaSA+IDEpICYmICEoeC0+ZXhfZmxhZ3MgJiBFWEZMQUdfU0kpCisJCQkgICAmJiAoeC0+ZXhfcGF0aGxlbiAhPSAtMSkKKwkJCSAgICYmIChwbGVuID4gKHgtPmV4X3BhdGhsZW4gKyBwcm94eV9wYXRoX2xlbmd0aCArIDEpKSkKKwkJCXsKKwkJCWN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX1BBVEhfTEVOR1RIX0VYQ0VFREVEOworCQkJY3R4LT5lcnJvcl9kZXB0aCA9IGk7CisJCQljdHgtPmN1cnJlbnRfY2VydCA9IHg7CisJCQlvaz1jYigwLGN0eCk7CisJCQlpZiAoIW9rKSBnb3RvIGVuZDsKKwkJCX0KKwkJLyogSW5jcmVtZW50IHBhdGggbGVuZ3RoIGlmIG5vdCBzZWxmIGlzc3VlZCAqLworCQlpZiAoISh4LT5leF9mbGFncyAmIEVYRkxBR19TSSkpCisJCQlwbGVuKys7CisJCS8qIElmIHRoaXMgY2VydGlmaWNhdGUgaXMgYSBwcm94eSBjZXJ0aWZpY2F0ZSwgdGhlIG5leHQKKwkJICAgY2VydGlmaWNhdGUgbXVzdCBiZSBhbm90aGVyIHByb3h5IGNlcnRpZmljYXRlIG9yIGEgRUUKKwkJICAgY2VydGlmaWNhdGUuICBJZiBub3QsIHRoZSBuZXh0IGNlcnRpZmljYXRlIG11c3QgYmUgYQorCQkgICBDQSBjZXJ0aWZpY2F0ZS4gICovCisJCWlmICh4LT5leF9mbGFncyAmIEVYRkxBR19QUk9YWSkKKwkJCXsKKwkJCWlmICh4LT5leF9wY3BhdGhsZW4gIT0gLTEgJiYgaSA+IHgtPmV4X3BjcGF0aGxlbikKKwkJCQl7CisJCQkJY3R4LT5lcnJvciA9CisJCQkJCVg1MDlfVl9FUlJfUFJPWFlfUEFUSF9MRU5HVEhfRVhDRUVERUQ7CisJCQkJY3R4LT5lcnJvcl9kZXB0aCA9IGk7CisJCQkJY3R4LT5jdXJyZW50X2NlcnQgPSB4OworCQkJCW9rPWNiKDAsY3R4KTsKKwkJCQlpZiAoIW9rKSBnb3RvIGVuZDsKKwkJCQl9CisJCQlwcm94eV9wYXRoX2xlbmd0aCsrOworCQkJbXVzdF9iZV9jYSA9IDA7CisJCQl9CisJCWVsc2UKKwkJCW11c3RfYmVfY2EgPSAxOworCQl9CisJb2sgPSAxOworIGVuZDoKKwlyZXR1cm4gb2s7CisjZW5kaWYKK30KKworc3RhdGljIGludCBjaGVja19uYW1lX2NvbnN0cmFpbnRzKFg1MDlfU1RPUkVfQ1RYICpjdHgpCisJeworCVg1MDkgKng7CisJaW50IGksIGosIHJ2OworCS8qIENoZWNrIG5hbWUgY29uc3RyYWludHMgZm9yIGFsbCBjZXJ0aWZpY2F0ZXMgKi8KKwlmb3IgKGkgPSBza19YNTA5X251bShjdHgtPmNoYWluKSAtIDE7IGkgPj0gMDsgaS0tKQorCQl7CisJCXggPSBza19YNTA5X3ZhbHVlKGN0eC0+Y2hhaW4sIGkpOworCQkvKiBJZ25vcmUgc2VsZiBpc3N1ZWQgY2VydHMgdW5sZXNzIGxhc3QgaW4gY2hhaW4gKi8KKwkJaWYgKGkgJiYgKHgtPmV4X2ZsYWdzICYgRVhGTEFHX1NJKSkKKwkJCWNvbnRpbnVlOworCQkvKiBDaGVjayBhZ2FpbnN0IGNvbnN0cmFpbnRzIGZvciBhbGwgY2VydGlmaWNhdGVzIGhpZ2hlciBpbgorCQkgKiBjaGFpbiBpbmNsdWRpbmcgdHJ1c3QgYW5jaG9yLiBUcnVzdCBhbmNob3Igbm90IHN0cmljdGx5CisJCSAqIHNwZWFraW5nIG5lZWRlZCBidXQgaWYgaXQgaW5jbHVkZXMgY29uc3RyYWludHMgaXQgaXMgdG8gYmUKKwkJICogYXNzdW1lZCBpdCBleHBlY3RzIHRoZW0gdG8gYmUgb2JleWVkLgorCQkgKi8KKwkJZm9yIChqID0gc2tfWDUwOV9udW0oY3R4LT5jaGFpbikgLSAxOyBqID4gaTsgai0tKQorCQkJeworCQkJTkFNRV9DT05TVFJBSU5UUyAqbmMgPSBza19YNTA5X3ZhbHVlKGN0eC0+Y2hhaW4sIGopLT5uYzsKKwkJCWlmIChuYykKKwkJCQl7CisJCQkJcnYgPSBOQU1FX0NPTlNUUkFJTlRTX2NoZWNrKHgsIG5jKTsKKwkJCQlpZiAocnYgIT0gWDUwOV9WX09LKQorCQkJCQl7CisJCQkJCWN0eC0+ZXJyb3IgPSBydjsKKwkJCQkJY3R4LT5lcnJvcl9kZXB0aCA9IGk7CisJCQkJCWN0eC0+Y3VycmVudF9jZXJ0ID0geDsKKwkJCQkJaWYgKCFjdHgtPnZlcmlmeV9jYigwLGN0eCkpCisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBjaGVja19pZF9lcnJvcihYNTA5X1NUT1JFX0NUWCAqY3R4LCBpbnQgZXJyY29kZSkKKwl7CisJY3R4LT5lcnJvciA9IGVycmNvZGU7CisJY3R4LT5jdXJyZW50X2NlcnQgPSBjdHgtPmNlcnQ7CisJY3R4LT5lcnJvcl9kZXB0aCA9IDA7CisJcmV0dXJuIGN0eC0+dmVyaWZ5X2NiKDAsIGN0eCk7CisJfQorCitzdGF0aWMgaW50IGNoZWNrX2lkKFg1MDlfU1RPUkVfQ1RYICpjdHgpCisJeworCVg1MDlfVkVSSUZZX1BBUkFNICp2cG0gPSBjdHgtPnBhcmFtOworCVg1MDlfVkVSSUZZX1BBUkFNX0lEICppZCA9IHZwbS0+aWQ7CisJWDUwOSAqeCA9IGN0eC0+Y2VydDsKKwlpZiAoaWQtPmhvc3QgJiYgIVg1MDlfY2hlY2tfaG9zdCh4LCBpZC0+aG9zdCwgaWQtPmhvc3RsZW4sIDApKQorCQl7CisJCWlmICghY2hlY2tfaWRfZXJyb3IoY3R4LCBYNTA5X1ZfRVJSX0hPU1ROQU1FX01JU01BVENIKSkKKwkJCXJldHVybiAwOworCQl9CisJaWYgKGlkLT5lbWFpbCAmJiAhWDUwOV9jaGVja19lbWFpbCh4LCBpZC0+ZW1haWwsIGlkLT5lbWFpbGxlbiwgMCkpCisJCXsKKwkJaWYgKCFjaGVja19pZF9lcnJvcihjdHgsIFg1MDlfVl9FUlJfRU1BSUxfTUlTTUFUQ0gpKQorCQkJcmV0dXJuIDA7CisJCX0KKwlpZiAoaWQtPmlwICYmICFYNTA5X2NoZWNrX2lwKHgsIGlkLT5pcCwgaWQtPmlwbGVuLCAwKSkKKwkJeworCQlpZiAoIWNoZWNrX2lkX2Vycm9yKGN0eCwgWDUwOV9WX0VSUl9JUF9BRERSRVNTX01JU01BVENIKSkKKwkJCXJldHVybiAwOworCQl9CisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IGNoZWNrX3RydXN0KFg1MDlfU1RPUkVfQ1RYICpjdHgpCit7CisJc2l6ZV90IGk7CisJaW50IG9rOworCVg1MDkgKnggPSBOVUxMOworCWludCAoKmNiKShpbnQgeG9rLFg1MDlfU1RPUkVfQ1RYICp4Y3R4KTsKKwljYj1jdHgtPnZlcmlmeV9jYjsKKwkvKiBDaGVjayBhbGwgdHJ1c3RlZCBjZXJ0aWZpY2F0ZXMgaW4gY2hhaW4gKi8KKwlmb3IgKGkgPSBjdHgtPmxhc3RfdW50cnVzdGVkOyBpIDwgc2tfWDUwOV9udW0oY3R4LT5jaGFpbik7IGkrKykKKwkJeworCQl4ID0gc2tfWDUwOV92YWx1ZShjdHgtPmNoYWluLCBpKTsKKwkJb2sgPSBYNTA5X2NoZWNrX3RydXN0KHgsIGN0eC0+cGFyYW0tPnRydXN0LCAwKTsKKwkJLyogSWYgZXhwbGljaXRseSB0cnVzdGVkIHJldHVybiB0cnVzdGVkICovCisJCWlmIChvayA9PSBYNTA5X1RSVVNUX1RSVVNURUQpCisJCQlyZXR1cm4gWDUwOV9UUlVTVF9UUlVTVEVEOworCQkvKiBJZiBleHBsaWNpdGx5IHJlamVjdGVkIG5vdGlmeSBjYWxsYmFjayBhbmQgcmVqZWN0IGlmCisJCSAqIG5vdCBvdmVycmlkZGVuLgorCQkgKi8KKwkJaWYgKG9rID09IFg1MDlfVFJVU1RfUkVKRUNURUQpCisJCQl7CisJCQljdHgtPmVycm9yX2RlcHRoID0gaTsKKwkJCWN0eC0+Y3VycmVudF9jZXJ0ID0geDsKKwkJCWN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX0NFUlRfUkVKRUNURUQ7CisJCQlvayA9IGNiKDAsIGN0eCk7CisJCQlpZiAoIW9rKQorCQkJCXJldHVybiBYNTA5X1RSVVNUX1JFSkVDVEVEOworCQkJfQorCQl9CisJLyogSWYgd2UgYWNjZXB0IHBhcnRpYWwgY2hhaW5zIGFuZCBoYXZlIGF0IGxlYXN0IG9uZSB0cnVzdGVkCisJICogY2VydGlmaWNhdGUgcmV0dXJuIHN1Y2Nlc3MuCisJICovCisJaWYgKGN0eC0+cGFyYW0tPmZsYWdzICYgWDUwOV9WX0ZMQUdfUEFSVElBTF9DSEFJTikKKwkJeworCQlYNTA5ICpteDsKKwkJaWYgKGN0eC0+bGFzdF91bnRydXN0ZWQgPCAoaW50KSBza19YNTA5X251bShjdHgtPmNoYWluKSkKKwkJCXJldHVybiBYNTA5X1RSVVNUX1RSVVNURUQ7CisJCXggPSBza19YNTA5X3ZhbHVlKGN0eC0+Y2hhaW4sIDApOworCQlteCA9IGxvb2t1cF9jZXJ0X21hdGNoKGN0eCwgeCk7CisJCWlmIChteCkKKwkJCXsKKwkJCSh2b2lkKXNrX1g1MDlfc2V0KGN0eC0+Y2hhaW4sIDAsIG14KTsKKwkJCVg1MDlfZnJlZSh4KTsKKwkJCWN0eC0+bGFzdF91bnRydXN0ZWQgPSAwOworCQkJcmV0dXJuIFg1MDlfVFJVU1RfVFJVU1RFRDsKKwkJCX0KKwkJfQorCisJLyogSWYgbm8gdHJ1c3RlZCBjZXJ0cyBpbiBjaGFpbiBhdCBhbGwgcmV0dXJuIHVudHJ1c3RlZCBhbmQKKwkgKiBhbGxvdyBzdGFuZGFyZCAobm8gaXNzdWVyIGNlcnQpIGV0YyBlcnJvcnMgdG8gYmUgaW5kaWNhdGVkLgorCSAqLworCXJldHVybiBYNTA5X1RSVVNUX1VOVFJVU1RFRDsKK30KKworc3RhdGljIGludCBjaGVja19yZXZvY2F0aW9uKFg1MDlfU1RPUkVfQ1RYICpjdHgpCisJeworCWludCBpLCBsYXN0LCBvazsKKwlpZiAoIShjdHgtPnBhcmFtLT5mbGFncyAmIFg1MDlfVl9GTEFHX0NSTF9DSEVDSykpCisJCXJldHVybiAxOworCWlmIChjdHgtPnBhcmFtLT5mbGFncyAmIFg1MDlfVl9GTEFHX0NSTF9DSEVDS19BTEwpCisJCWxhc3QgPSBza19YNTA5X251bShjdHgtPmNoYWluKSAtIDE7CisJZWxzZQorCQl7CisJCS8qIElmIGNoZWNraW5nIENSTCBwYXRocyB0aGlzIGlzbid0IHRoZSBFRSBjZXJ0aWZpY2F0ZSAqLworCQlpZiAoY3R4LT5wYXJlbnQpCisJCQlyZXR1cm4gMTsKKwkJbGFzdCA9IDA7CisJCX0KKwlmb3IoaSA9IDA7IGkgPD0gbGFzdDsgaSsrKQorCQl7CisJCWN0eC0+ZXJyb3JfZGVwdGggPSBpOworCQlvayA9IGNoZWNrX2NlcnQoY3R4KTsKKwkJaWYgKCFvaykgcmV0dXJuIG9rOworCQl9CisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IGNoZWNrX2NlcnQoWDUwOV9TVE9SRV9DVFggKmN0eCkKKwl7CisJWDUwOV9DUkwgKmNybCA9IE5VTEwsICpkY3JsID0gTlVMTDsKKwlYNTA5ICp4OworCWludCBvaywgY251bTsKKwl1bnNpZ25lZCBpbnQgbGFzdF9yZWFzb25zOworCWNudW0gPSBjdHgtPmVycm9yX2RlcHRoOworCXggPSBza19YNTA5X3ZhbHVlKGN0eC0+Y2hhaW4sIGNudW0pOworCWN0eC0+Y3VycmVudF9jZXJ0ID0geDsKKwljdHgtPmN1cnJlbnRfaXNzdWVyID0gTlVMTDsKKwljdHgtPmN1cnJlbnRfY3JsX3Njb3JlID0gMDsKKwljdHgtPmN1cnJlbnRfcmVhc29ucyA9IDA7CisJd2hpbGUgKGN0eC0+Y3VycmVudF9yZWFzb25zICE9IENSTERQX0FMTF9SRUFTT05TKQorCQl7CisJCWxhc3RfcmVhc29ucyA9IGN0eC0+Y3VycmVudF9yZWFzb25zOworCQkvKiBUcnkgdG8gcmV0cmlldmUgcmVsZXZhbnQgQ1JMICovCisJCWlmIChjdHgtPmdldF9jcmwpCisJCQlvayA9IGN0eC0+Z2V0X2NybChjdHgsICZjcmwsIHgpOworCQllbHNlCisJCQlvayA9IGdldF9jcmxfZGVsdGEoY3R4LCAmY3JsLCAmZGNybCwgeCk7CisJCS8qIElmIGVycm9yIGxvb2tpbmcgdXAgQ1JMLCBub3RoaW5nIHdlIGNhbiBkbyBleGNlcHQKKwkJICogbm90aWZ5IGNhbGxiYWNrCisJCSAqLworCQlpZighb2spCisJCQl7CisJCQljdHgtPmVycm9yID0gWDUwOV9WX0VSUl9VTkFCTEVfVE9fR0VUX0NSTDsKKwkJCW9rID0gY3R4LT52ZXJpZnlfY2IoMCwgY3R4KTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQljdHgtPmN1cnJlbnRfY3JsID0gY3JsOworCQlvayA9IGN0eC0+Y2hlY2tfY3JsKGN0eCwgY3JsKTsKKwkJaWYgKCFvaykKKwkJCWdvdG8gZXJyOworCisJCWlmIChkY3JsKQorCQkJeworCQkJb2sgPSBjdHgtPmNoZWNrX2NybChjdHgsIGRjcmwpOworCQkJaWYgKCFvaykKKwkJCQlnb3RvIGVycjsKKwkJCW9rID0gY3R4LT5jZXJ0X2NybChjdHgsIGRjcmwsIHgpOworCQkJaWYgKCFvaykKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJZWxzZQorCQkJb2sgPSAxOworCisJCS8qIERvbid0IGxvb2sgaW4gZnVsbCBDUkwgaWYgZGVsdGEgcmVhc29uIGlzIHJlbW92ZWZyb21DUkwgKi8KKwkJaWYgKG9rICE9IDIpCisJCQl7CisJCQlvayA9IGN0eC0+Y2VydF9jcmwoY3R4LCBjcmwsIHgpOworCQkJaWYgKCFvaykKKwkJCQlnb3RvIGVycjsKKwkJCX0KKworCQlYNTA5X0NSTF9mcmVlKGNybCk7CisJCVg1MDlfQ1JMX2ZyZWUoZGNybCk7CisJCWNybCA9IE5VTEw7CisJCWRjcmwgPSBOVUxMOworCQkvKiBJZiByZWFzb25zIG5vdCB1cGRhdGVkIHdlIHdvbnQgZ2V0IGFueXdoZXJlIGJ5CisJCSAqIGFub3RoZXIgaXRlcmF0aW9uLCBzbyBleGl0IGxvb3AuCisJCSAqLworCQlpZiAobGFzdF9yZWFzb25zID09IGN0eC0+Y3VycmVudF9yZWFzb25zKQorCQkJeworCQkJY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfVU5BQkxFX1RPX0dFVF9DUkw7CisJCQlvayA9IGN0eC0+dmVyaWZ5X2NiKDAsIGN0eCk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCWVycjoKKwlYNTA5X0NSTF9mcmVlKGNybCk7CisJWDUwOV9DUkxfZnJlZShkY3JsKTsKKworCWN0eC0+Y3VycmVudF9jcmwgPSBOVUxMOworCXJldHVybiBvazsKKworCX0KKworLyogQ2hlY2sgQ1JMIHRpbWVzIGFnYWluc3QgdmFsdWVzIGluIFg1MDlfU1RPUkVfQ1RYICovCisKK3N0YXRpYyBpbnQgY2hlY2tfY3JsX3RpbWUoWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOV9DUkwgKmNybCwgaW50IG5vdGlmeSkKKwl7CisJdGltZV90ICpwdGltZTsKKwlpbnQgaTsKKwlpZiAobm90aWZ5KQorCQljdHgtPmN1cnJlbnRfY3JsID0gY3JsOworCWlmIChjdHgtPnBhcmFtLT5mbGFncyAmIFg1MDlfVl9GTEFHX1VTRV9DSEVDS19USU1FKQorCQlwdGltZSA9ICZjdHgtPnBhcmFtLT5jaGVja190aW1lOworCWVsc2UKKwkJcHRpbWUgPSBOVUxMOworCisJaT1YNTA5X2NtcF90aW1lKFg1MDlfQ1JMX2dldF9sYXN0VXBkYXRlKGNybCksIHB0aW1lKTsKKwlpZiAoaSA9PSAwKQorCQl7CisJCWlmICghbm90aWZ5KQorCQkJcmV0dXJuIDA7CisJCWN0eC0+ZXJyb3I9WDUwOV9WX0VSUl9FUlJPUl9JTl9DUkxfTEFTVF9VUERBVEVfRklFTEQ7CisJCWlmICghY3R4LT52ZXJpZnlfY2IoMCwgY3R4KSkKKwkJCXJldHVybiAwOworCQl9CisKKwlpZiAoaSA+IDApCisJCXsKKwkJaWYgKCFub3RpZnkpCisJCQlyZXR1cm4gMDsKKwkJY3R4LT5lcnJvcj1YNTA5X1ZfRVJSX0NSTF9OT1RfWUVUX1ZBTElEOworCQlpZiAoIWN0eC0+dmVyaWZ5X2NiKDAsIGN0eCkpCisJCQlyZXR1cm4gMDsKKwkJfQorCisJaWYoWDUwOV9DUkxfZ2V0X25leHRVcGRhdGUoY3JsKSkKKwkJeworCQlpPVg1MDlfY21wX3RpbWUoWDUwOV9DUkxfZ2V0X25leHRVcGRhdGUoY3JsKSwgcHRpbWUpOworCisJCWlmIChpID09IDApCisJCQl7CisJCQlpZiAoIW5vdGlmeSkKKwkJCQlyZXR1cm4gMDsKKwkJCWN0eC0+ZXJyb3I9WDUwOV9WX0VSUl9FUlJPUl9JTl9DUkxfTkVYVF9VUERBVEVfRklFTEQ7CisJCQlpZiAoIWN0eC0+dmVyaWZ5X2NiKDAsIGN0eCkpCisJCQkJcmV0dXJuIDA7CisJCQl9CisJCS8qIElnbm9yZSBleHBpcnkgb2YgYmFzZSBDUkwgaXMgZGVsdGEgaXMgdmFsaWQgKi8KKwkJaWYgKChpIDwgMCkgJiYgIShjdHgtPmN1cnJlbnRfY3JsX3Njb3JlICYgQ1JMX1NDT1JFX1RJTUVfREVMVEEpKQorCQkJeworCQkJaWYgKCFub3RpZnkpCisJCQkJcmV0dXJuIDA7CisJCQljdHgtPmVycm9yPVg1MDlfVl9FUlJfQ1JMX0hBU19FWFBJUkVEOworCQkJaWYgKCFjdHgtPnZlcmlmeV9jYigwLCBjdHgpKQorCQkJCXJldHVybiAwOworCQkJfQorCQl9CisKKwlpZiAobm90aWZ5KQorCQljdHgtPmN1cnJlbnRfY3JsID0gTlVMTDsKKworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBnZXRfY3JsX3NrKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDlfQ1JMICoqcGNybCwgWDUwOV9DUkwgKipwZGNybCwKKwkJCVg1MDkgKipwaXNzdWVyLCBpbnQgKnBzY29yZSwgdW5zaWduZWQgaW50ICpwcmVhc29ucywKKwkJCVNUQUNLX09GKFg1MDlfQ1JMKSAqY3JscykKKwl7CisJaW50IGNybF9zY29yZSwgYmVzdF9zY29yZSA9ICpwc2NvcmU7CisJc2l6ZV90IGk7CisJdW5zaWduZWQgaW50IHJlYXNvbnMsIGJlc3RfcmVhc29ucyA9IDA7CisJWDUwOSAqeCA9IGN0eC0+Y3VycmVudF9jZXJ0OworCVg1MDlfQ1JMICpjcmwsICpiZXN0X2NybCA9IE5VTEw7CisJWDUwOSAqY3JsX2lzc3VlciA9IE5VTEwsICpiZXN0X2NybF9pc3N1ZXIgPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IHNrX1g1MDlfQ1JMX251bShjcmxzKTsgaSsrKQorCQl7CisJCWNybCA9IHNrX1g1MDlfQ1JMX3ZhbHVlKGNybHMsIGkpOworCQlyZWFzb25zID0gKnByZWFzb25zOworCQljcmxfc2NvcmUgPSBnZXRfY3JsX3Njb3JlKGN0eCwgJmNybF9pc3N1ZXIsICZyZWFzb25zLCBjcmwsIHgpOworCisJCWlmIChjcmxfc2NvcmUgPiBiZXN0X3Njb3JlKQorCQkJeworCQkJYmVzdF9jcmwgPSBjcmw7CisJCQliZXN0X2NybF9pc3N1ZXIgPSBjcmxfaXNzdWVyOworCQkJYmVzdF9zY29yZSA9IGNybF9zY29yZTsKKwkJCWJlc3RfcmVhc29ucyA9IHJlYXNvbnM7CisJCQl9CisJCX0KKworCWlmIChiZXN0X2NybCkKKwkJeworCQlpZiAoKnBjcmwpCisJCQlYNTA5X0NSTF9mcmVlKCpwY3JsKTsKKwkJKnBjcmwgPSBiZXN0X2NybDsKKwkJKnBpc3N1ZXIgPSBiZXN0X2NybF9pc3N1ZXI7CisJCSpwc2NvcmUgPSBiZXN0X3Njb3JlOworCQkqcHJlYXNvbnMgPSBiZXN0X3JlYXNvbnM7CisJCUNSWVBUT19hZGQoJmJlc3RfY3JsLT5yZWZlcmVuY2VzLCAxLCBDUllQVE9fTE9DS19YNTA5X0NSTCk7CisJCWlmICgqcGRjcmwpCisJCQl7CisJCQlYNTA5X0NSTF9mcmVlKCpwZGNybCk7CisJCQkqcGRjcmwgPSBOVUxMOworCQkJfQorCQlnZXRfZGVsdGFfc2soY3R4LCBwZGNybCwgcHNjb3JlLCBiZXN0X2NybCwgY3Jscyk7CisJCX0KKworCWlmIChiZXN0X3Njb3JlID49IENSTF9TQ09SRV9WQUxJRCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKKwl9CisKKy8qIENvbXBhcmUgdHdvIENSTCBleHRlbnNpb25zIGZvciBkZWx0YSBjaGVja2luZyBwdXJwb3Nlcy4gVGhleSBzaG91bGQgYmUKKyAqIGJvdGggcHJlc2VudCBvciBib3RoIGFic2VudC4gSWYgYm90aCBwcmVzZW50IGFsbCBmaWVsZHMgbXVzdCBiZSBpZGVudGljYWwuCisgKi8KKworc3RhdGljIGludCBjcmxfZXh0ZW5zaW9uX21hdGNoKFg1MDlfQ1JMICphLCBYNTA5X0NSTCAqYiwgaW50IG5pZCkKKwl7CisJQVNOMV9PQ1RFVF9TVFJJTkcgKmV4dGEsICpleHRiOworCWludCBpOworCWkgPSBYNTA5X0NSTF9nZXRfZXh0X2J5X05JRChhLCBuaWQsIC0xKTsKKwlpZiAoaSA+PSAwKQorCQl7CisJCS8qIENhbid0IGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgKi8KKwkJaWYgKFg1MDlfQ1JMX2dldF9leHRfYnlfTklEKGEsIG5pZCwgaSkgIT0gLTEpCisJCQlyZXR1cm4gMDsKKwkJZXh0YSA9IFg1MDlfRVhURU5TSU9OX2dldF9kYXRhKFg1MDlfQ1JMX2dldF9leHQoYSwgaSkpOworCQl9CisJZWxzZQorCQlleHRhID0gTlVMTDsKKworCWkgPSBYNTA5X0NSTF9nZXRfZXh0X2J5X05JRChiLCBuaWQsIC0xKTsKKworCWlmIChpID49IDApCisJCXsKKworCQlpZiAoWDUwOV9DUkxfZ2V0X2V4dF9ieV9OSUQoYiwgbmlkLCBpKSAhPSAtMSkKKwkJCXJldHVybiAwOworCQlleHRiID0gWDUwOV9FWFRFTlNJT05fZ2V0X2RhdGEoWDUwOV9DUkxfZ2V0X2V4dChiLCBpKSk7CisJCX0KKwllbHNlCisJCWV4dGIgPSBOVUxMOworCisJaWYgKCFleHRhICYmICFleHRiKQorCQlyZXR1cm4gMTsKKworCWlmICghZXh0YSB8fCAhZXh0YikKKwkJcmV0dXJuIDA7CisKKworCWlmIChBU04xX09DVEVUX1NUUklOR19jbXAoZXh0YSwgZXh0YikpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7CisJfQorCisvKiBTZWUgaWYgYSBiYXNlIGFuZCBkZWx0YSBhcmUgY29tcGF0aWJsZSAqLworCitzdGF0aWMgaW50IGNoZWNrX2RlbHRhX2Jhc2UoWDUwOV9DUkwgKmRlbHRhLCBYNTA5X0NSTCAqYmFzZSkKKwl7CisJLyogRGVsdGEgQ1JMIG11c3QgYmUgYSBkZWx0YSAqLworCWlmICghZGVsdGEtPmJhc2VfY3JsX251bWJlcikKKwkJCXJldHVybiAwOworCS8qIEJhc2UgbXVzdCBoYXZlIGEgQ1JMIG51bWJlciAqLworCWlmICghYmFzZS0+Y3JsX251bWJlcikKKwkJCXJldHVybiAwOworCS8qIElzc3VlciBuYW1lcyBtdXN0IG1hdGNoICovCisJaWYgKFg1MDlfTkFNRV9jbXAoWDUwOV9DUkxfZ2V0X2lzc3VlcihiYXNlKSwKKwkJCQlYNTA5X0NSTF9nZXRfaXNzdWVyKGRlbHRhKSkpCisJCXJldHVybiAwOworCS8qIEFLSUQgYW5kIElEUCBtdXN0IG1hdGNoICovCisJaWYgKCFjcmxfZXh0ZW5zaW9uX21hdGNoKGRlbHRhLCBiYXNlLCBOSURfYXV0aG9yaXR5X2tleV9pZGVudGlmaWVyKSkKKwkJCXJldHVybiAwOworCWlmICghY3JsX2V4dGVuc2lvbl9tYXRjaChkZWx0YSwgYmFzZSwgTklEX2lzc3VpbmdfZGlzdHJpYnV0aW9uX3BvaW50KSkKKwkJCXJldHVybiAwOworCS8qIERlbHRhIENSTCBiYXNlIG51bWJlciBtdXN0IG5vdCBleGNlZWQgRnVsbCBDUkwgbnVtYmVyLiAqLworCWlmIChBU04xX0lOVEVHRVJfY21wKGRlbHRhLT5iYXNlX2NybF9udW1iZXIsIGJhc2UtPmNybF9udW1iZXIpID4gMCkKKwkJCXJldHVybiAwOworCS8qIERlbHRhIENSTCBudW1iZXIgbXVzdCBleGNlZWQgZnVsbCBDUkwgbnVtYmVyICovCisJaWYgKEFTTjFfSU5URUdFUl9jbXAoZGVsdGEtPmNybF9udW1iZXIsIGJhc2UtPmNybF9udW1iZXIpID4gMCkKKwkJCXJldHVybiAxOworCXJldHVybiAwOworCX0KKworLyogRm9yIGEgZ2l2ZW4gYmFzZSBDUkwgZmluZCBhIGRlbHRhLi4uIG1heWJlIGV4dGVuZCB0byBkZWx0YSBzY29yaW5nCisgKiBvciByZXRyaWV2ZSBhIGNoYWluIG9mIGRlbHRhcy4uLgorICovCisKK3N0YXRpYyB2b2lkIGdldF9kZWx0YV9zayhYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5X0NSTCAqKmRjcmwsIGludCAqcHNjb3JlLAorCQkJWDUwOV9DUkwgKmJhc2UsIFNUQUNLX09GKFg1MDlfQ1JMKSAqY3JscykKKwl7CisJWDUwOV9DUkwgKmRlbHRhOworCXNpemVfdCBpOworCWlmICghKGN0eC0+cGFyYW0tPmZsYWdzICYgWDUwOV9WX0ZMQUdfVVNFX0RFTFRBUykpCisJCXJldHVybjsKKwlpZiAoISgoY3R4LT5jdXJyZW50X2NlcnQtPmV4X2ZsYWdzIHwgYmFzZS0+ZmxhZ3MpICYgRVhGTEFHX0ZSRVNIRVNUKSkKKwkJcmV0dXJuOworCWZvciAoaSA9IDA7IGkgPCBza19YNTA5X0NSTF9udW0oY3Jscyk7IGkrKykKKwkJeworCQlkZWx0YSA9IHNrX1g1MDlfQ1JMX3ZhbHVlKGNybHMsIGkpOworCQlpZiAoY2hlY2tfZGVsdGFfYmFzZShkZWx0YSwgYmFzZSkpCisJCQl7CisJCQlpZiAoY2hlY2tfY3JsX3RpbWUoY3R4LCBkZWx0YSwgMCkpCisJCQkJKnBzY29yZSB8PSBDUkxfU0NPUkVfVElNRV9ERUxUQTsKKwkJCUNSWVBUT19hZGQoJmRlbHRhLT5yZWZlcmVuY2VzLCAxLCBDUllQVE9fTE9DS19YNTA5X0NSTCk7CisJCQkqZGNybCA9IGRlbHRhOworCQkJcmV0dXJuOworCQkJfQorCQl9CisJKmRjcmwgPSBOVUxMOworCX0KKworLyogRm9yIGEgZ2l2ZW4gQ1JMIHJldHVybiBob3cgc3VpdGFibGUgaXQgaXMgZm9yIHRoZSBzdXBwbGllZCBjZXJ0aWZpY2F0ZSAneCcuCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgbWFzayBvZiBzZXZlcmFsIGNyaXRlcmlhLgorICogSWYgdGhlIGlzc3VlciBpcyBub3QgdGhlIGNlcnRpZmljYXRlIGlzc3VlciB0aGlzIGlzIHJldHVybmVkIGluICpwaXNzdWVyLgorICogVGhlIHJlYXNvbnMgbWFzayBpcyBhbHNvIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBDUkwgaXMgc3VpdGFibGU6IGlmCisgKiBubyBuZXcgcmVhc29ucyB0aGUgQ1JMIGlzIHJlamVjdGVkLCBvdGhlcndpc2UgcmVhc29ucyBpcyB1cGRhdGVkLgorICovCisKK3N0YXRpYyBpbnQgZ2V0X2NybF9zY29yZShYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5ICoqcGlzc3VlciwKKwkJCXVuc2lnbmVkIGludCAqcHJlYXNvbnMsCisJCQlYNTA5X0NSTCAqY3JsLCBYNTA5ICp4KQorCXsKKworCWludCBjcmxfc2NvcmUgPSAwOworCXVuc2lnbmVkIGludCB0bXBfcmVhc29ucyA9ICpwcmVhc29ucywgY3JsX3JlYXNvbnM7CisKKwkvKiBGaXJzdCBzZWUgaWYgd2UgY2FuIHJlamVjdCBDUkwgc3RyYWlnaHQgYXdheSAqLworCisJLyogSW52YWxpZCBJRFAgY2Fubm90IGJlIHByb2Nlc3NlZCAqLworCWlmIChjcmwtPmlkcF9mbGFncyAmIElEUF9JTlZBTElEKQorCQlyZXR1cm4gMDsKKwkvKiBSZWFzb24gY29kZXMgb3IgaW5kaXJlY3QgQ1JMcyBuZWVkIGV4dGVuZGVkIENSTCBzdXBwb3J0ICovCisJaWYgKCEoY3R4LT5wYXJhbS0+ZmxhZ3MgJiBYNTA5X1ZfRkxBR19FWFRFTkRFRF9DUkxfU1VQUE9SVCkpCisJCXsKKwkJaWYgKGNybC0+aWRwX2ZsYWdzICYgKElEUF9JTkRJUkVDVCB8IElEUF9SRUFTT05TKSkKKwkJCXJldHVybiAwOworCQl9CisJZWxzZSBpZiAoY3JsLT5pZHBfZmxhZ3MgJiBJRFBfUkVBU09OUykKKwkJeworCQkvKiBJZiBubyBuZXcgcmVhc29ucyByZWplY3QgKi8KKwkJaWYgKCEoY3JsLT5pZHBfcmVhc29ucyAmIH50bXBfcmVhc29ucykpCisJCQlyZXR1cm4gMDsKKwkJfQorCS8qIERvbid0IHByb2Nlc3MgZGVsdGFzIGF0IHRoaXMgc3RhZ2UgKi8KKwllbHNlIGlmIChjcmwtPmJhc2VfY3JsX251bWJlcikKKwkJcmV0dXJuIDA7CisJLyogSWYgaXNzdWVyIG5hbWUgZG9lc24ndCBtYXRjaCBjZXJ0aWZpY2F0ZSBuZWVkIGluZGlyZWN0IENSTCAqLworCWlmIChYNTA5X05BTUVfY21wKFg1MDlfZ2V0X2lzc3Vlcl9uYW1lKHgpLCBYNTA5X0NSTF9nZXRfaXNzdWVyKGNybCkpKQorCQl7CisJCWlmICghKGNybC0+aWRwX2ZsYWdzICYgSURQX0lORElSRUNUKSkKKwkJCXJldHVybiAwOworCQl9CisJZWxzZQorCQljcmxfc2NvcmUgfD0gQ1JMX1NDT1JFX0lTU1VFUl9OQU1FOworCisJaWYgKCEoY3JsLT5mbGFncyAmIEVYRkxBR19DUklUSUNBTCkpCisJCWNybF9zY29yZSB8PSBDUkxfU0NPUkVfTk9DUklUSUNBTDsKKworCS8qIENoZWNrIGV4cGlyeSAqLworCWlmIChjaGVja19jcmxfdGltZShjdHgsIGNybCwgMCkpCisJCWNybF9zY29yZSB8PSBDUkxfU0NPUkVfVElNRTsKKworCS8qIENoZWNrIGF1dGhvcml0eSBrZXkgSUQgYW5kIGxvY2F0ZSBjZXJ0aWZpY2F0ZSBpc3N1ZXIgKi8KKwljcmxfYWtpZF9jaGVjayhjdHgsIGNybCwgcGlzc3VlciwgJmNybF9zY29yZSk7CisKKwkvKiBJZiB3ZSBjYW4ndCBsb2NhdGUgY2VydGlmaWNhdGUgaXNzdWVyIGF0IHRoaXMgcG9pbnQgZm9yZ2V0IGl0ICovCisKKwlpZiAoIShjcmxfc2NvcmUgJiBDUkxfU0NPUkVfQUtJRCkpCisJCXJldHVybiAwOworCisJLyogQ2hlY2sgY2VydCBmb3IgbWF0Y2hpbmcgQ1JMIGRpc3RyaWJ1dGlvbiBwb2ludHMgKi8KKworCWlmIChjcmxfY3JsZHBfY2hlY2soeCwgY3JsLCBjcmxfc2NvcmUsICZjcmxfcmVhc29ucykpCisJCXsKKwkJLyogSWYgbm8gbmV3IHJlYXNvbnMgcmVqZWN0ICovCisJCWlmICghKGNybF9yZWFzb25zICYgfnRtcF9yZWFzb25zKSkKKwkJCXJldHVybiAwOworCQl0bXBfcmVhc29ucyB8PSBjcmxfcmVhc29uczsKKwkJY3JsX3Njb3JlIHw9IENSTF9TQ09SRV9TQ09QRTsKKwkJfQorCisJKnByZWFzb25zID0gdG1wX3JlYXNvbnM7CisKKwlyZXR1cm4gY3JsX3Njb3JlOworCisJfQorCitzdGF0aWMgdm9pZCBjcmxfYWtpZF9jaGVjayhYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5X0NSTCAqY3JsLAorCQkJCVg1MDkgKipwaXNzdWVyLCBpbnQgKnBjcmxfc2NvcmUpCisJeworCVg1MDkgKmNybF9pc3N1ZXIgPSBOVUxMOworCVg1MDlfTkFNRSAqY25tID0gWDUwOV9DUkxfZ2V0X2lzc3VlcihjcmwpOworCWludCBjaWR4ID0gY3R4LT5lcnJvcl9kZXB0aDsKKwlzaXplX3QgaTsKKworCWlmIChjaWR4ICE9IHNrX1g1MDlfbnVtKGN0eC0+Y2hhaW4pIC0gMSkKKwkJY2lkeCsrOworCisJY3JsX2lzc3VlciA9IHNrX1g1MDlfdmFsdWUoY3R4LT5jaGFpbiwgY2lkeCk7CisKKwlpZiAoWDUwOV9jaGVja19ha2lkKGNybF9pc3N1ZXIsIGNybC0+YWtpZCkgPT0gWDUwOV9WX09LKQorCQl7CisJCWlmICgqcGNybF9zY29yZSAmIENSTF9TQ09SRV9JU1NVRVJfTkFNRSkKKwkJCXsKKwkJCSpwY3JsX3Njb3JlIHw9IENSTF9TQ09SRV9BS0lEfENSTF9TQ09SRV9JU1NVRVJfQ0VSVDsKKwkJCSpwaXNzdWVyID0gY3JsX2lzc3VlcjsKKwkJCXJldHVybjsKKwkJCX0KKwkJfQorCisJZm9yIChjaWR4Kys7IGNpZHggPCAoaW50KSBza19YNTA5X251bShjdHgtPmNoYWluKTsgY2lkeCsrKQorCQl7CisJCWNybF9pc3N1ZXIgPSBza19YNTA5X3ZhbHVlKGN0eC0+Y2hhaW4sIGNpZHgpOworCQlpZiAoWDUwOV9OQU1FX2NtcChYNTA5X2dldF9zdWJqZWN0X25hbWUoY3JsX2lzc3VlciksIGNubSkpCisJCQljb250aW51ZTsKKwkJaWYgKFg1MDlfY2hlY2tfYWtpZChjcmxfaXNzdWVyLCBjcmwtPmFraWQpID09IFg1MDlfVl9PSykKKwkJCXsKKwkJCSpwY3JsX3Njb3JlIHw9IENSTF9TQ09SRV9BS0lEfENSTF9TQ09SRV9TQU1FX1BBVEg7CisJCQkqcGlzc3VlciA9IGNybF9pc3N1ZXI7CisJCQlyZXR1cm47CisJCQl9CisJCX0KKworCS8qIEFueXRoaW5nIGVsc2UgbmVlZHMgZXh0ZW5kZWQgQ1JMIHN1cHBvcnQgKi8KKworCWlmICghKGN0eC0+cGFyYW0tPmZsYWdzICYgWDUwOV9WX0ZMQUdfRVhURU5ERURfQ1JMX1NVUFBPUlQpKQorCQlyZXR1cm47CisKKwkvKiBPdGhlcndpc2UgdGhlIENSTCBpc3N1ZXIgaXMgbm90IG9uIHRoZSBwYXRoLiBMb29rIGZvciBpdCBpbiB0aGUKKwkgKiBzZXQgb2YgdW50cnVzdGVkIGNlcnRpZmljYXRlcy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2tfWDUwOV9udW0oY3R4LT51bnRydXN0ZWQpOyBpKyspCisJCXsKKwkJY3JsX2lzc3VlciA9IHNrX1g1MDlfdmFsdWUoY3R4LT51bnRydXN0ZWQsIGkpOworCQlpZiAoWDUwOV9OQU1FX2NtcChYNTA5X2dldF9zdWJqZWN0X25hbWUoY3JsX2lzc3VlciksIGNubSkpCisJCQljb250aW51ZTsKKwkJaWYgKFg1MDlfY2hlY2tfYWtpZChjcmxfaXNzdWVyLCBjcmwtPmFraWQpID09IFg1MDlfVl9PSykKKwkJCXsKKwkJCSpwaXNzdWVyID0gY3JsX2lzc3VlcjsKKwkJCSpwY3JsX3Njb3JlIHw9IENSTF9TQ09SRV9BS0lEOworCQkJcmV0dXJuOworCQkJfQorCQl9CisJfQorCisvKiBDaGVjayB0aGUgcGF0aCBvZiBhIENSTCBpc3N1ZXIgY2VydGlmaWNhdGUuIFRoaXMgY3JlYXRlcyBhIG5ldworICogWDUwOV9TVE9SRV9DVFggYW5kIHBvcHVsYXRlcyBpdCB3aXRoIG1vc3Qgb2YgdGhlIHBhcmFtZXRlcnMgZnJvbSB0aGUKKyAqIHBhcmVudC4gVGhpcyBjb3VsZCBiZSBvcHRpbWlzZWQgc29tZXdoYXQgc2luY2UgYSBsb3Qgb2YgcGF0aCBjaGVja2luZworICogd2lsbCBiZSBkdXBsaWNhdGVkIGJ5IHRoZSBwYXJlbnQsIGJ1dCB0aGlzIHdpbGwgcmFyZWx5IGJlIHVzZWQgaW4gCisgKiBwcmFjdGljZS4KKyAqLworCitzdGF0aWMgaW50IGNoZWNrX2NybF9wYXRoKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDkgKngpCisJeworCVg1MDlfU1RPUkVfQ1RYIGNybF9jdHg7CisJaW50IHJldDsKKwkvKiBEb24ndCBhbGxvdyByZWN1cnNpdmUgQ1JMIHBhdGggdmFsaWRhdGlvbiAqLworCWlmIChjdHgtPnBhcmVudCkKKwkJcmV0dXJuIDA7CisJaWYgKCFYNTA5X1NUT1JFX0NUWF9pbml0KCZjcmxfY3R4LCBjdHgtPmN0eCwgeCwgY3R4LT51bnRydXN0ZWQpKQorCQlyZXR1cm4gLTE7CisKKwljcmxfY3R4LmNybHMgPSBjdHgtPmNybHM7CisJLyogQ29weSB2ZXJpZnkgcGFyYW1zIGFjcm9zcyAqLworCVg1MDlfU1RPUkVfQ1RYX3NldDBfcGFyYW0oJmNybF9jdHgsIGN0eC0+cGFyYW0pOworCisJY3JsX2N0eC5wYXJlbnQgPSBjdHg7CisJY3JsX2N0eC52ZXJpZnlfY2IgPSBjdHgtPnZlcmlmeV9jYjsKKworCS8qIFZlcmlmeSBDUkwgaXNzdWVyICovCisJcmV0ID0gWDUwOV92ZXJpZnlfY2VydCgmY3JsX2N0eCk7CisKKwlpZiAocmV0IDw9IDApCisJCWdvdG8gZXJyOworCisJLyogQ2hlY2sgY2hhaW4gaXMgYWNjZXB0YWJsZSAqLworCisJcmV0ID0gY2hlY2tfY3JsX2NoYWluKGN0eCwgY3R4LT5jaGFpbiwgY3JsX2N0eC5jaGFpbik7CisJZXJyOgorCVg1MDlfU1RPUkVfQ1RYX2NsZWFudXAoJmNybF9jdHgpOworCXJldHVybiByZXQ7CisJfQorCisvKiBSRkMzMjgwIHNheXMgbm90aGluZyBhYm91dCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gQ1JMIHBhdGgKKyAqIGFuZCBjZXJ0aWZpY2F0ZSBwYXRoLCB3aGljaCBjb3VsZCBsZWFkIHRvIHNpdHVhdGlvbnMgd2hlcmUgYQorICogY2VydGlmaWNhdGUgY291bGQgYmUgcmV2b2tlZCBvciB2YWxpZGF0ZWQgYnkgYSBDQSBub3QgYXV0aG9yaXNlZAorICogdG8gZG8gc28uIFJGQzUyODAgaXMgbW9yZSBzdHJpY3QgYW5kIHN0YXRlcyB0aGF0IHRoZSB0d28gcGF0aHMgbXVzdAorICogZW5kIGluIHRoZSBzYW1lIHRydXN0IGFuY2hvciwgdGhvdWdoIHNvbWUgZGlzY3Vzc2lvbnMgcmVtYWluLi4uCisgKiB1bnRpbCB0aGlzIGlzIHJlc29sdmVkIHdlIHVzZSB0aGUgUkZDNTI4MCB2ZXJzaW9uCisgKi8KKworc3RhdGljIGludCBjaGVja19jcmxfY2hhaW4oWDUwOV9TVE9SRV9DVFggKmN0eCwKKwkJCVNUQUNLX09GKFg1MDkpICpjZXJ0X3BhdGgsCisJCQlTVEFDS19PRihYNTA5KSAqY3JsX3BhdGgpCisJeworCVg1MDkgKmNlcnRfdGEsICpjcmxfdGE7CisJY2VydF90YSA9IHNrX1g1MDlfdmFsdWUoY2VydF9wYXRoLCBza19YNTA5X251bShjZXJ0X3BhdGgpIC0gMSk7CisJY3JsX3RhID0gc2tfWDUwOV92YWx1ZShjcmxfcGF0aCwgc2tfWDUwOV9udW0oY3JsX3BhdGgpIC0gMSk7CisJaWYgKCFYNTA5X2NtcChjZXJ0X3RhLCBjcmxfdGEpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKKwl9CisKKy8qIENoZWNrIGZvciBtYXRjaCBiZXR3ZWVuIHR3byBkaXN0IHBvaW50IG5hbWVzOiB0aHJlZSBzZXBhcmF0ZSBjYXNlcy4KKyAqIDEuIEJvdGggYXJlIHJlbGF0aXZlIG5hbWVzIGFuZCBjb21wYXJlIFg1MDlfTkFNRSB0eXBlcy4KKyAqIDIuIE9uZSBmdWxsLCBvbmUgcmVsYXRpdmUuIENvbXBhcmUgWDUwOV9OQU1FIHRvIEdFTkVSQUxfTkFNRVMuCisgKiAzLiBCb3RoIGFyZSBmdWxsIG5hbWVzIGFuZCBjb21wYXJlIHR3byBHRU5FUkFMX05BTUVTLgorICogNC4gT25lIGlzIE5VTEw6IGF1dG9tYXRpYyBtYXRjaC4KKyAqLworCisKK3N0YXRpYyBpbnQgaWRwX2NoZWNrX2RwKERJU1RfUE9JTlRfTkFNRSAqYSwgRElTVF9QT0lOVF9OQU1FICpiKQorCXsKKwlYNTA5X05BTUUgKm5tID0gTlVMTDsKKwlHRU5FUkFMX05BTUVTICpnZW5zID0gTlVMTDsKKwlHRU5FUkFMX05BTUUgKmdlbmEsICpnZW5iOworCXNpemVfdCBpLCBqOworCWlmICghYSB8fCAhYikKKwkJcmV0dXJuIDE7CisJaWYgKGEtPnR5cGUgPT0gMSkKKwkJeworCQlpZiAoIWEtPmRwbmFtZSkKKwkJCXJldHVybiAwOworCQkvKiBDYXNlIDE6IHR3byBYNTA5X05BTUUgKi8KKwkJaWYgKGItPnR5cGUgPT0gMSkKKwkJCXsKKwkJCWlmICghYi0+ZHBuYW1lKQorCQkJCXJldHVybiAwOworCQkJaWYgKCFYNTA5X05BTUVfY21wKGEtPmRwbmFtZSwgYi0+ZHBuYW1lKSkKKwkJCQlyZXR1cm4gMTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJLyogQ2FzZSAyOiBzZXQgbmFtZSBhbmQgR0VORVJBTF9OQU1FUyBhcHByb3ByaWF0ZWx5ICovCisJCW5tID0gYS0+ZHBuYW1lOworCQlnZW5zID0gYi0+bmFtZS5mdWxsbmFtZTsKKwkJfQorCWVsc2UgaWYgKGItPnR5cGUgPT0gMSkKKwkJeworCQlpZiAoIWItPmRwbmFtZSkKKwkJCXJldHVybiAwOworCQkvKiBDYXNlIDI6IHNldCBuYW1lIGFuZCBHRU5FUkFMX05BTUVTIGFwcHJvcHJpYXRlbHkgKi8KKwkJZ2VucyA9IGEtPm5hbWUuZnVsbG5hbWU7CisJCW5tID0gYi0+ZHBuYW1lOworCQl9CisKKwkvKiBIYW5kbGUgY2FzZSAyIHdpdGggb25lIEdFTkVSQUxfTkFNRVMgYW5kIG9uZSBYNTA5X05BTUUgKi8KKwlpZiAobm0pCisJCXsKKwkJZm9yIChpID0gMDsgaSA8IHNrX0dFTkVSQUxfTkFNRV9udW0oZ2Vucyk7IGkrKykKKwkJCXsKKwkJCWdlbmEgPSBza19HRU5FUkFMX05BTUVfdmFsdWUoZ2VucywgaSk7CQorCQkJaWYgKGdlbmEtPnR5cGUgIT0gR0VOX0RJUk5BTUUpCisJCQkJY29udGludWU7CisJCQlpZiAoIVg1MDlfTkFNRV9jbXAobm0sIGdlbmEtPmQuZGlyZWN0b3J5TmFtZSkpCisJCQkJcmV0dXJuIDE7CisJCQl9CisJCXJldHVybiAwOworCQl9CisKKwkvKiBFbHNlIGNhc2UgMzogdHdvIEdFTkVSQUxfTkFNRVMgKi8KKworCWZvciAoaSA9IDA7IGkgPCBza19HRU5FUkFMX05BTUVfbnVtKGEtPm5hbWUuZnVsbG5hbWUpOyBpKyspCisJCXsKKwkJZ2VuYSA9IHNrX0dFTkVSQUxfTkFNRV92YWx1ZShhLT5uYW1lLmZ1bGxuYW1lLCBpKTsKKwkJZm9yIChqID0gMDsgaiA8IHNrX0dFTkVSQUxfTkFNRV9udW0oYi0+bmFtZS5mdWxsbmFtZSk7IGorKykKKwkJCXsKKwkJCWdlbmIgPSBza19HRU5FUkFMX05BTUVfdmFsdWUoYi0+bmFtZS5mdWxsbmFtZSwgaik7CisJCQlpZiAoIUdFTkVSQUxfTkFNRV9jbXAoZ2VuYSwgZ2VuYikpCisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKworCXJldHVybiAwOworCisJfQorCitzdGF0aWMgaW50IGNybGRwX2NoZWNrX2NybGlzc3VlcihESVNUX1BPSU5UICpkcCwgWDUwOV9DUkwgKmNybCwgaW50IGNybF9zY29yZSkKKwl7CisJc2l6ZV90IGk7CisJWDUwOV9OQU1FICpubSA9IFg1MDlfQ1JMX2dldF9pc3N1ZXIoY3JsKTsKKwkvKiBJZiBubyBDUkxpc3N1ZXIgcmV0dXJuIGlzIHN1Y2Nlc3NmdWwgaWZmIGRvbid0IG5lZWQgYSBtYXRjaCAqLworCWlmICghZHAtPkNSTGlzc3VlcikKKwkJcmV0dXJuICEhKGNybF9zY29yZSAmIENSTF9TQ09SRV9JU1NVRVJfTkFNRSk7CisJZm9yIChpID0gMDsgaSA8IHNrX0dFTkVSQUxfTkFNRV9udW0oZHAtPkNSTGlzc3Vlcik7IGkrKykKKwkJeworCQlHRU5FUkFMX05BTUUgKmdlbiA9IHNrX0dFTkVSQUxfTkFNRV92YWx1ZShkcC0+Q1JMaXNzdWVyLCBpKTsKKwkJaWYgKGdlbi0+dHlwZSAhPSBHRU5fRElSTkFNRSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIVg1MDlfTkFNRV9jbXAoZ2VuLT5kLmRpcmVjdG9yeU5hbWUsIG5tKSkKKwkJCXJldHVybiAxOworCQl9CisJcmV0dXJuIDA7CisJfQorCisvKiBDaGVjayBDUkxEUCBhbmQgSURQICovCisKK3N0YXRpYyBpbnQgY3JsX2NybGRwX2NoZWNrKFg1MDkgKngsIFg1MDlfQ1JMICpjcmwsIGludCBjcmxfc2NvcmUsCisJCQkJdW5zaWduZWQgaW50ICpwcmVhc29ucykKKwl7CisJc2l6ZV90IGk7CisJaWYgKGNybC0+aWRwX2ZsYWdzICYgSURQX09OTFlBVFRSKQorCQlyZXR1cm4gMDsKKwlpZiAoeC0+ZXhfZmxhZ3MgJiBFWEZMQUdfQ0EpCisJCXsKKwkJaWYgKGNybC0+aWRwX2ZsYWdzICYgSURQX09OTFlVU0VSKQorCQkJcmV0dXJuIDA7CisJCX0KKwllbHNlCisJCXsKKwkJaWYgKGNybC0+aWRwX2ZsYWdzICYgSURQX09OTFlDQSkKKwkJCXJldHVybiAwOworCQl9CisJKnByZWFzb25zID0gY3JsLT5pZHBfcmVhc29uczsKKwlmb3IgKGkgPSAwOyBpIDwgc2tfRElTVF9QT0lOVF9udW0oeC0+Y3JsZHApOyBpKyspCisJCXsKKwkJRElTVF9QT0lOVCAqZHAgPSBza19ESVNUX1BPSU5UX3ZhbHVlKHgtPmNybGRwLCBpKTsKKwkJaWYgKGNybGRwX2NoZWNrX2NybGlzc3VlcihkcCwgY3JsLCBjcmxfc2NvcmUpKQorCQkJeworCQkJaWYgKCFjcmwtPmlkcCB8fAorCQkJICAgICBpZHBfY2hlY2tfZHAoZHAtPmRpc3Rwb2ludCwgY3JsLT5pZHAtPmRpc3Rwb2ludCkpCisJCQkJeworCQkJCSpwcmVhc29ucyAmPSBkcC0+ZHBfcmVhc29uczsKKwkJCQlyZXR1cm4gMTsKKwkJCQl9CisJCQl9CisJCX0KKwlpZiAoKCFjcmwtPmlkcCB8fCAhY3JsLT5pZHAtPmRpc3Rwb2ludCkgJiYgKGNybF9zY29yZSAmIENSTF9TQ09SRV9JU1NVRVJfTkFNRSkpCisJCXJldHVybiAxOworCXJldHVybiAwOworCX0KKworLyogUmV0cmlldmUgQ1JMIGNvcnJlc3BvbmRpbmcgdG8gY3VycmVudCBjZXJ0aWZpY2F0ZS4KKyAqIElmIGRlbHRhcyBlbmFibGVkIHRyeSB0byBmaW5kIGEgZGVsdGEgQ1JMIHRvbworICovCisJCitzdGF0aWMgaW50IGdldF9jcmxfZGVsdGEoWDUwOV9TVE9SRV9DVFggKmN0eCwKKwkJCQlYNTA5X0NSTCAqKnBjcmwsIFg1MDlfQ1JMICoqcGRjcmwsIFg1MDkgKngpCisJeworCWludCBvazsKKwlYNTA5ICppc3N1ZXIgPSBOVUxMOworCWludCBjcmxfc2NvcmUgPSAwOworCXVuc2lnbmVkIGludCByZWFzb25zOworCVg1MDlfQ1JMICpjcmwgPSBOVUxMLCAqZGNybCA9IE5VTEw7CisJU1RBQ0tfT0YoWDUwOV9DUkwpICpza2NybDsKKwlYNTA5X05BTUUgKm5tID0gWDUwOV9nZXRfaXNzdWVyX25hbWUoeCk7CisJcmVhc29ucyA9IGN0eC0+Y3VycmVudF9yZWFzb25zOworCW9rID0gZ2V0X2NybF9zayhjdHgsICZjcmwsICZkY3JsLCAKKwkJCQkmaXNzdWVyLCAmY3JsX3Njb3JlLCAmcmVhc29ucywgY3R4LT5jcmxzKTsKKworCWlmIChvaykKKwkJZ290byBkb25lOworCisJLyogTG9va3VwIENSTHMgZnJvbSBzdG9yZSAqLworCisJc2tjcmwgPSBjdHgtPmxvb2t1cF9jcmxzKGN0eCwgbm0pOworCisJLyogSWYgbm8gQ1JMcyBmb3VuZCBhbmQgYSBuZWFyIG1hdGNoIGZyb20gZ2V0X2NybF9zayB1c2UgdGhhdCAqLworCWlmICghc2tjcmwgJiYgY3JsKQorCQlnb3RvIGRvbmU7CisKKwlnZXRfY3JsX3NrKGN0eCwgJmNybCwgJmRjcmwsICZpc3N1ZXIsICZjcmxfc2NvcmUsICZyZWFzb25zLCBza2NybCk7CisKKwlza19YNTA5X0NSTF9wb3BfZnJlZShza2NybCwgWDUwOV9DUkxfZnJlZSk7CisKKwlkb25lOgorCisJLyogSWYgd2UgZ290IGFueSBraW5kIG9mIENSTCB1c2UgaXQgYW5kIHJldHVybiBzdWNjZXNzICovCisJaWYgKGNybCkKKwkJeworCQljdHgtPmN1cnJlbnRfaXNzdWVyID0gaXNzdWVyOworCQljdHgtPmN1cnJlbnRfY3JsX3Njb3JlID0gY3JsX3Njb3JlOworCQljdHgtPmN1cnJlbnRfcmVhc29ucyA9IHJlYXNvbnM7CisJCSpwY3JsID0gY3JsOworCQkqcGRjcmwgPSBkY3JsOworCQlyZXR1cm4gMTsKKwkJfQorCisJcmV0dXJuIDA7CisJfQorCisvKiBDaGVjayBDUkwgdmFsaWRpdHkgKi8KK3N0YXRpYyBpbnQgY2hlY2tfY3JsKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDlfQ1JMICpjcmwpCisJeworCVg1MDkgKmlzc3VlciA9IE5VTEw7CisJRVZQX1BLRVkgKmlrZXkgPSBOVUxMOworCWludCBvayA9IDAsIGNobnVtLCBjbnVtOworCWNudW0gPSBjdHgtPmVycm9yX2RlcHRoOworCWNobnVtID0gc2tfWDUwOV9udW0oY3R4LT5jaGFpbikgLSAxOworCS8qIGlmIHdlIGhhdmUgYW4gYWx0ZXJuYXRpdmUgQ1JMIGlzc3VlciBjZXJ0IHVzZSB0aGF0ICovCisJaWYgKGN0eC0+Y3VycmVudF9pc3N1ZXIpCisJCWlzc3VlciA9IGN0eC0+Y3VycmVudF9pc3N1ZXI7CisKKwkvKiBFbHNlIGZpbmQgQ1JMIGlzc3VlcjogaWYgbm90IGxhc3QgY2VydGlmaWNhdGUgdGhlbiBpc3N1ZXIKKwkgKiBpcyBuZXh0IGNlcnRpZmljYXRlIGluIGNoYWluLgorCSAqLworCWVsc2UgaWYgKGNudW0gPCBjaG51bSkKKwkJaXNzdWVyID0gc2tfWDUwOV92YWx1ZShjdHgtPmNoYWluLCBjbnVtICsgMSk7CisJZWxzZQorCQl7CisJCWlzc3VlciA9IHNrX1g1MDlfdmFsdWUoY3R4LT5jaGFpbiwgY2hudW0pOworCQkvKiBJZiBub3Qgc2VsZiBzaWduZWQsIGNhbid0IGNoZWNrIHNpZ25hdHVyZSAqLworCQlpZighY3R4LT5jaGVja19pc3N1ZWQoY3R4LCBpc3N1ZXIsIGlzc3VlcikpCisJCQl7CisJCQljdHgtPmVycm9yID0gWDUwOV9WX0VSUl9VTkFCTEVfVE9fR0VUX0NSTF9JU1NVRVI7CisJCQlvayA9IGN0eC0+dmVyaWZ5X2NiKDAsIGN0eCk7CisJCQlpZighb2spIGdvdG8gZXJyOworCQkJfQorCQl9CisKKwlpZihpc3N1ZXIpCisJCXsKKwkJLyogU2tpcCBtb3N0IHRlc3RzIGZvciBkZWx0YXMgYmVjYXVzZSB0aGV5IGhhdmUgYWxyZWFkeQorCQkgKiBiZWVuIGRvbmUKKwkJICovCisJCWlmICghY3JsLT5iYXNlX2NybF9udW1iZXIpCisJCQl7CisJCQkvKiBDaGVjayBmb3IgY1JMU2lnbiBiaXQgaWYga2V5VXNhZ2UgcHJlc2VudCAqLworCQkJaWYgKChpc3N1ZXItPmV4X2ZsYWdzICYgRVhGTEFHX0tVU0FHRSkgJiYKKwkJCQkhKGlzc3Vlci0+ZXhfa3VzYWdlICYgS1VfQ1JMX1NJR04pKQorCQkJCXsKKwkJCQljdHgtPmVycm9yID0gWDUwOV9WX0VSUl9LRVlVU0FHRV9OT19DUkxfU0lHTjsKKwkJCQlvayA9IGN0eC0+dmVyaWZ5X2NiKDAsIGN0eCk7CisJCQkJaWYoIW9rKSBnb3RvIGVycjsKKwkJCQl9CisKKwkJCWlmICghKGN0eC0+Y3VycmVudF9jcmxfc2NvcmUgJiBDUkxfU0NPUkVfU0NPUEUpKQorCQkJCXsKKwkJCQljdHgtPmVycm9yID0gWDUwOV9WX0VSUl9ESUZGRVJFTlRfQ1JMX1NDT1BFOworCQkJCW9rID0gY3R4LT52ZXJpZnlfY2IoMCwgY3R4KTsKKwkJCQlpZighb2spIGdvdG8gZXJyOworCQkJCX0KKworCQkJaWYgKCEoY3R4LT5jdXJyZW50X2NybF9zY29yZSAmIENSTF9TQ09SRV9TQU1FX1BBVEgpKQorCQkJCXsKKwkJCQlpZiAoY2hlY2tfY3JsX3BhdGgoY3R4LCBjdHgtPmN1cnJlbnRfaXNzdWVyKSA8PSAwKQorCQkJCQl7CisJCQkJCWN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX0NSTF9QQVRIX1ZBTElEQVRJT05fRVJST1I7CisJCQkJCW9rID0gY3R4LT52ZXJpZnlfY2IoMCwgY3R4KTsKKwkJCQkJaWYoIW9rKSBnb3RvIGVycjsKKwkJCQkJfQorCQkJCX0KKworCQkJaWYgKGNybC0+aWRwX2ZsYWdzICYgSURQX0lOVkFMSUQpCisJCQkJeworCQkJCWN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX0lOVkFMSURfRVhURU5TSU9OOworCQkJCW9rID0gY3R4LT52ZXJpZnlfY2IoMCwgY3R4KTsKKwkJCQlpZighb2spIGdvdG8gZXJyOworCQkJCX0KKworCisJCQl9CisKKwkJaWYgKCEoY3R4LT5jdXJyZW50X2NybF9zY29yZSAmIENSTF9TQ09SRV9USU1FKSkKKwkJCXsKKwkJCW9rID0gY2hlY2tfY3JsX3RpbWUoY3R4LCBjcmwsIDEpOworCQkJaWYgKCFvaykKKwkJCQlnb3RvIGVycjsKKwkJCX0KKworCQkvKiBBdHRlbXB0IHRvIGdldCBpc3N1ZXIgY2VydGlmaWNhdGUgcHVibGljIGtleSAqLworCQlpa2V5ID0gWDUwOV9nZXRfcHVia2V5KGlzc3Vlcik7CisKKwkJaWYoIWlrZXkpCisJCQl7CisJCQljdHgtPmVycm9yPVg1MDlfVl9FUlJfVU5BQkxFX1RPX0RFQ09ERV9JU1NVRVJfUFVCTElDX0tFWTsKKwkJCW9rID0gY3R4LT52ZXJpZnlfY2IoMCwgY3R4KTsKKwkJCWlmICghb2spIGdvdG8gZXJyOworCQkJfQorCQllbHNlCisJCQl7CisJCQlpbnQgcnY7CisJCQlydiA9IFg1MDlfQ1JMX2NoZWNrX3N1aXRlYihjcmwsIGlrZXksIGN0eC0+cGFyYW0tPmZsYWdzKTsKKwkJCWlmIChydiAhPSBYNTA5X1ZfT0spCisJCQkJeworCQkJCWN0eC0+ZXJyb3I9cnY7CisJCQkJb2sgPSBjdHgtPnZlcmlmeV9jYigwLCBjdHgpOworCQkJCWlmICghb2spCisJCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCS8qIFZlcmlmeSBDUkwgc2lnbmF0dXJlICovCisJCQlpZihYNTA5X0NSTF92ZXJpZnkoY3JsLCBpa2V5KSA8PSAwKQorCQkJCXsKKwkJCQljdHgtPmVycm9yPVg1MDlfVl9FUlJfQ1JMX1NJR05BVFVSRV9GQUlMVVJFOworCQkJCW9rID0gY3R4LT52ZXJpZnlfY2IoMCwgY3R4KTsKKwkJCQlpZiAoIW9rKSBnb3RvIGVycjsKKwkJCQl9CisJCQl9CisJCX0KKworCW9rID0gMTsKKworCWVycjoKKwlFVlBfUEtFWV9mcmVlKGlrZXkpOworCXJldHVybiBvazsKKwl9CisKKy8qIENoZWNrIGNlcnRpZmljYXRlIGFnYWluc3QgQ1JMICovCitzdGF0aWMgaW50IGNlcnRfY3JsKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDlfQ1JMICpjcmwsIFg1MDkgKngpCisJeworCWludCBvazsKKwlYNTA5X1JFVk9LRUQgKnJldjsKKwkvKiBUaGUgcnVsZXMgY2hhbmdlZCBmb3IgdGhpcy4uLiBwcmV2aW91c2x5IGlmIGEgQ1JMIGNvbnRhaW5lZAorCSAqIHVuaGFuZGxlZCBjcml0aWNhbCBleHRlbnNpb25zIGl0IGNvdWxkIHN0aWxsIGJlIHVzZWQgdG8gaW5kaWNhdGUKKwkgKiBhIGNlcnRpZmljYXRlIHdhcyByZXZva2VkLiBUaGlzIGhhcyBzaW5jZSBiZWVuIGNoYW5nZWQgc2luY2UgCisJICogY3JpdGljYWwgZXh0ZW5zaW9uIGNhbiBjaGFuZ2UgdGhlIG1lYW5pbmcgb2YgQ1JMIGVudHJpZXMuCisJICovCisJaWYgKCEoY3R4LT5wYXJhbS0+ZmxhZ3MgJiBYNTA5X1ZfRkxBR19JR05PUkVfQ1JJVElDQUwpCisJCSYmIChjcmwtPmZsYWdzICYgRVhGTEFHX0NSSVRJQ0FMKSkKKwkJeworCQljdHgtPmVycm9yID0gWDUwOV9WX0VSUl9VTkhBTkRMRURfQ1JJVElDQUxfQ1JMX0VYVEVOU0lPTjsKKwkJb2sgPSBjdHgtPnZlcmlmeV9jYigwLCBjdHgpOworCQlpZighb2spCisJCQlyZXR1cm4gMDsKKwkJfQorCS8qIExvb2sgZm9yIHNlcmlhbCBudW1iZXIgb2YgY2VydGlmaWNhdGUgaW4gQ1JMCisJICogSWYgZm91bmQgbWFrZSBzdXJlIHJlYXNvbiBpcyBub3QgcmVtb3ZlRnJvbUNSTC4KKwkgKi8KKwlpZiAoWDUwOV9DUkxfZ2V0MF9ieV9jZXJ0KGNybCwgJnJldiwgeCkpCisJCXsKKwkJaWYgKHJldi0+cmVhc29uID09IENSTF9SRUFTT05fUkVNT1ZFX0ZST01fQ1JMKQorCQkJcmV0dXJuIDI7CisJCWN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX0NFUlRfUkVWT0tFRDsKKwkJb2sgPSBjdHgtPnZlcmlmeV9jYigwLCBjdHgpOworCQlpZiAoIW9rKQorCQkJcmV0dXJuIDA7CisJCX0KKworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBjaGVja19wb2xpY3koWDUwOV9TVE9SRV9DVFggKmN0eCkKKwl7CisJaW50IHJldDsKKwlpZiAoY3R4LT5wYXJlbnQpCisJCXJldHVybiAxOworCXJldCA9IFg1MDlfcG9saWN5X2NoZWNrKCZjdHgtPnRyZWUsICZjdHgtPmV4cGxpY2l0X3BvbGljeSwgY3R4LT5jaGFpbiwKKwkJCQljdHgtPnBhcmFtLT5wb2xpY2llcywgY3R4LT5wYXJhbS0+ZmxhZ3MpOworCWlmIChyZXQgPT0gMCkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBjaGVja19wb2xpY3ksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIDA7CisJCX0KKwkvKiBJbnZhbGlkIG9yIGluY29uc2lzdGVudCBleHRlbnNpb25zICovCisJaWYgKHJldCA9PSAtMSkKKwkJeworCQkvKiBMb2NhdGUgY2VydGlmaWNhdGVzIHdpdGggYmFkIGV4dGVuc2lvbnMgYW5kIG5vdGlmeQorCQkgKiBjYWxsYmFjay4KKwkJICovCisJCVg1MDkgKng7CisJCXNpemVfdCBpOworCQlmb3IgKGkgPSAxOyBpIDwgc2tfWDUwOV9udW0oY3R4LT5jaGFpbik7IGkrKykKKwkJCXsKKwkJCXggPSBza19YNTA5X3ZhbHVlKGN0eC0+Y2hhaW4sIGkpOworCQkJaWYgKCEoeC0+ZXhfZmxhZ3MgJiBFWEZMQUdfSU5WQUxJRF9QT0xJQ1kpKQorCQkJCWNvbnRpbnVlOworCQkJY3R4LT5jdXJyZW50X2NlcnQgPSB4OworCQkJY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfSU5WQUxJRF9QT0xJQ1lfRVhURU5TSU9OOworCQkJaWYoIWN0eC0+dmVyaWZ5X2NiKDAsIGN0eCkpCisJCQkJcmV0dXJuIDA7CisJCQl9CisJCXJldHVybiAxOworCQl9CisJaWYgKHJldCA9PSAtMikKKwkJeworCQljdHgtPmN1cnJlbnRfY2VydCA9IE5VTEw7CisJCWN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX05PX0VYUExJQ0lUX1BPTElDWTsKKwkJcmV0dXJuIGN0eC0+dmVyaWZ5X2NiKDAsIGN0eCk7CisJCX0KKworCWlmIChjdHgtPnBhcmFtLT5mbGFncyAmIFg1MDlfVl9GTEFHX05PVElGWV9QT0xJQ1kpCisJCXsKKwkJY3R4LT5jdXJyZW50X2NlcnQgPSBOVUxMOworCQljdHgtPmVycm9yID0gWDUwOV9WX09LOworCQlpZiAoIWN0eC0+dmVyaWZ5X2NiKDIsIGN0eCkpCisJCQlyZXR1cm4gMDsKKwkJfQorCisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IGNoZWNrX2NlcnRfdGltZShYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5ICp4KQorCXsKKwl0aW1lX3QgKnB0aW1lOworCWludCBpOworCisJaWYgKGN0eC0+cGFyYW0tPmZsYWdzICYgWDUwOV9WX0ZMQUdfVVNFX0NIRUNLX1RJTUUpCisJCXB0aW1lID0gJmN0eC0+cGFyYW0tPmNoZWNrX3RpbWU7CisJZWxzZQorCQlwdGltZSA9IE5VTEw7CisKKwlpPVg1MDlfY21wX3RpbWUoWDUwOV9nZXRfbm90QmVmb3JlKHgpLCBwdGltZSk7CisJaWYgKGkgPT0gMCkKKwkJeworCQljdHgtPmVycm9yPVg1MDlfVl9FUlJfRVJST1JfSU5fQ0VSVF9OT1RfQkVGT1JFX0ZJRUxEOworCQljdHgtPmN1cnJlbnRfY2VydD14OworCQlpZiAoIWN0eC0+dmVyaWZ5X2NiKDAsIGN0eCkpCisJCQlyZXR1cm4gMDsKKwkJfQorCisJaWYgKGkgPiAwKQorCQl7CisJCWN0eC0+ZXJyb3I9WDUwOV9WX0VSUl9DRVJUX05PVF9ZRVRfVkFMSUQ7CisJCWN0eC0+Y3VycmVudF9jZXJ0PXg7CisJCWlmICghY3R4LT52ZXJpZnlfY2IoMCwgY3R4KSkKKwkJCXJldHVybiAwOworCQl9CisKKwlpPVg1MDlfY21wX3RpbWUoWDUwOV9nZXRfbm90QWZ0ZXIoeCksIHB0aW1lKTsKKwlpZiAoaSA9PSAwKQorCQl7CisJCWN0eC0+ZXJyb3I9WDUwOV9WX0VSUl9FUlJPUl9JTl9DRVJUX05PVF9BRlRFUl9GSUVMRDsKKwkJY3R4LT5jdXJyZW50X2NlcnQ9eDsKKwkJaWYgKCFjdHgtPnZlcmlmeV9jYigwLCBjdHgpKQorCQkJcmV0dXJuIDA7CisJCX0KKworCWlmIChpIDwgMCkKKwkJeworCQljdHgtPmVycm9yPVg1MDlfVl9FUlJfQ0VSVF9IQVNfRVhQSVJFRDsKKwkJY3R4LT5jdXJyZW50X2NlcnQ9eDsKKwkJaWYgKCFjdHgtPnZlcmlmeV9jYigwLCBjdHgpKQorCQkJcmV0dXJuIDA7CisJCX0KKworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBpbnRlcm5hbF92ZXJpZnkoWDUwOV9TVE9SRV9DVFggKmN0eCkKKwl7CisJaW50IG9rPTAsbjsKKwlYNTA5ICp4cywqeGk7CisJRVZQX1BLRVkgKnBrZXk9TlVMTDsKKwlpbnQgKCpjYikoaW50IHhvayxYNTA5X1NUT1JFX0NUWCAqeGN0eCk7CisKKwljYj1jdHgtPnZlcmlmeV9jYjsKKworCW49c2tfWDUwOV9udW0oY3R4LT5jaGFpbik7CisJY3R4LT5lcnJvcl9kZXB0aD1uLTE7CisJbi0tOworCXhpPXNrX1g1MDlfdmFsdWUoY3R4LT5jaGFpbixuKTsKKworCWlmIChjdHgtPmNoZWNrX2lzc3VlZChjdHgsIHhpLCB4aSkpCisJCXhzPXhpOworCWVsc2UKKwkJeworCQlpZiAoY3R4LT5wYXJhbS0+ZmxhZ3MgJiBYNTA5X1ZfRkxBR19QQVJUSUFMX0NIQUlOICYmIG4gPT0gMCkKKwkJCXsKKwkJCXhzID0geGk7CisJCQlnb3RvIGNoZWNrX2NlcnQ7CisJCQl9CisJCWlmIChuIDw9IDApCisJCQl7CisJCQljdHgtPmVycm9yPVg1MDlfVl9FUlJfVU5BQkxFX1RPX1ZFUklGWV9MRUFGX1NJR05BVFVSRTsKKwkJCWN0eC0+Y3VycmVudF9jZXJ0PXhpOworCQkJb2s9Y2IoMCxjdHgpOworCQkJZ290byBlbmQ7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCW4tLTsKKwkJCWN0eC0+ZXJyb3JfZGVwdGg9bjsKKwkJCXhzPXNrX1g1MDlfdmFsdWUoY3R4LT5jaGFpbixuKTsKKwkJCX0KKwkJfQorCisvKgljdHgtPmVycm9yPTA7ICBub3QgbmVlZGVkICovCisJd2hpbGUgKG4gPj0gMCkKKwkJeworCQljdHgtPmVycm9yX2RlcHRoPW47CisKKwkJLyogU2tpcCBzaWduYXR1cmUgY2hlY2sgZm9yIHNlbGYgc2lnbmVkIGNlcnRpZmljYXRlcyB1bmxlc3MKKwkJICogZXhwbGljaXRseSBhc2tlZCBmb3IuIEl0IGRvZXNuJ3QgYWRkIGFueSBzZWN1cml0eSBhbmQKKwkJICoganVzdCB3YXN0ZXMgdGltZS4KKwkJICovCisJCWlmICgheHMtPnZhbGlkICYmICh4cyAhPSB4aSB8fCAoY3R4LT5wYXJhbS0+ZmxhZ3MgJiBYNTA5X1ZfRkxBR19DSEVDS19TU19TSUdOQVRVUkUpKSkKKwkJCXsKKwkJCWlmICgocGtleT1YNTA5X2dldF9wdWJrZXkoeGkpKSA9PSBOVUxMKQorCQkJCXsKKwkJCQljdHgtPmVycm9yPVg1MDlfVl9FUlJfVU5BQkxFX1RPX0RFQ09ERV9JU1NVRVJfUFVCTElDX0tFWTsKKwkJCQljdHgtPmN1cnJlbnRfY2VydD14aTsKKwkJCQlvaz0oKmNiKSgwLGN0eCk7CisJCQkJaWYgKCFvaykgZ290byBlbmQ7CisJCQkJfQorCQkJZWxzZSBpZiAoWDUwOV92ZXJpZnkoeHMscGtleSkgPD0gMCkKKwkJCQl7CisJCQkJY3R4LT5lcnJvcj1YNTA5X1ZfRVJSX0NFUlRfU0lHTkFUVVJFX0ZBSUxVUkU7CisJCQkJY3R4LT5jdXJyZW50X2NlcnQ9eHM7CisJCQkJb2s9KCpjYikoMCxjdHgpOworCQkJCWlmICghb2spCisJCQkJCXsKKwkJCQkJRVZQX1BLRVlfZnJlZShwa2V5KTsKKwkJCQkJZ290byBlbmQ7CisJCQkJCX0KKwkJCQl9CisJCQlFVlBfUEtFWV9mcmVlKHBrZXkpOworCQkJcGtleT1OVUxMOworCQkJfQorCisJCXhzLT52YWxpZCA9IDE7CisKKwkJY2hlY2tfY2VydDoKKwkJb2sgPSBjaGVja19jZXJ0X3RpbWUoY3R4LCB4cyk7CisJCWlmICghb2spCisJCQlnb3RvIGVuZDsKKworCQkvKiBUaGUgbGFzdCBlcnJvciAoaWYgYW55KSBpcyBzdGlsbCBpbiB0aGUgZXJyb3IgdmFsdWUgKi8KKwkJY3R4LT5jdXJyZW50X2lzc3Vlcj14aTsKKwkJY3R4LT5jdXJyZW50X2NlcnQ9eHM7CisJCW9rPSgqY2IpKDEsY3R4KTsKKwkJaWYgKCFvaykgZ290byBlbmQ7CisKKwkJbi0tOworCQlpZiAobiA+PSAwKQorCQkJeworCQkJeGk9eHM7CisJCQl4cz1za19YNTA5X3ZhbHVlKGN0eC0+Y2hhaW4sbik7CisJCQl9CisJCX0KKwlvaz0xOworZW5kOgorCXJldHVybiBvazsKKwl9CisKK2ludCBYNTA5X2NtcF9jdXJyZW50X3RpbWUoY29uc3QgQVNOMV9USU1FICpjdG0pCit7CisJcmV0dXJuIFg1MDlfY21wX3RpbWUoY3RtLCBOVUxMKTsKK30KKworaW50IFg1MDlfY21wX3RpbWUoY29uc3QgQVNOMV9USU1FICpjdG0sIHRpbWVfdCAqY21wX3RpbWUpCisJeworCWNoYXIgKnN0cjsKKwlBU04xX1RJTUUgYXRtOworCWxvbmcgb2Zmc2V0OworCWNoYXIgYnVmZjFbMjRdLGJ1ZmYyWzI0XSwqcDsKKwlpbnQgaSxqOworCisJcD1idWZmMTsKKwlpPWN0bS0+bGVuZ3RoOworCXN0cj0oY2hhciAqKWN0bS0+ZGF0YTsKKwlpZiAoY3RtLT50eXBlID09IFZfQVNOMV9VVENUSU1FKQorCQl7CisJCWlmICgoaSA8IDExKSB8fCAoaSA+IDE3KSkgcmV0dXJuIDA7CisJCW1lbWNweShwLHN0ciwxMCk7CisJCXArPTEwOworCQlzdHIrPTEwOworCQl9CisJZWxzZQorCQl7CisJCWlmIChpIDwgMTMpIHJldHVybiAwOworCQltZW1jcHkocCxzdHIsMTIpOworCQlwKz0xMjsKKwkJc3RyKz0xMjsKKwkJfQorCisJaWYgKCgqc3RyID09ICdaJykgfHwgKCpzdHIgPT0gJy0nKSB8fCAoKnN0ciA9PSAnKycpKQorCQl7ICoocCsrKT0nMCc7ICoocCsrKT0nMCc7IH0KKwllbHNlCisJCXsgCisJCSoocCsrKT0gKihzdHIrKyk7CisJCSoocCsrKT0gKihzdHIrKyk7CisJCS8qIFNraXAgYW55IGZyYWN0aW9uYWwgc2Vjb25kcy4uLiAqLworCQlpZiAoKnN0ciA9PSAnLicpCisJCQl7CisJCQlzdHIrKzsKKwkJCXdoaWxlICgoKnN0ciA+PSAnMCcpICYmICgqc3RyIDw9ICc5JykpIHN0cisrOworCQkJfQorCQkKKwkJfQorCSoocCsrKT0nWic7CisJKihwKyspPSdcMCc7CisKKwlpZiAoKnN0ciA9PSAnWicpCisJCW9mZnNldD0wOworCWVsc2UKKwkJeworCQlpZiAoKCpzdHIgIT0gJysnKSAmJiAoKnN0ciAhPSAnLScpKQorCQkJcmV0dXJuIDA7CisJCW9mZnNldD0oKHN0clsxXS0nMCcpKjEwKyhzdHJbMl0tJzAnKSkqNjA7CisJCW9mZnNldCs9KHN0clszXS0nMCcpKjEwKyhzdHJbNF0tJzAnKTsKKwkJaWYgKCpzdHIgPT0gJy0nKQorCQkJb2Zmc2V0PSAtb2Zmc2V0OworCQl9CisJYXRtLnR5cGU9Y3RtLT50eXBlOworCWF0bS5mbGFncyA9IDA7CisJYXRtLmxlbmd0aD1zaXplb2YoYnVmZjIpOworCWF0bS5kYXRhPSh1bnNpZ25lZCBjaGFyICopYnVmZjI7CisKKwlpZiAoWDUwOV90aW1lX2FkaigmYXRtLCBvZmZzZXQqNjAsIGNtcF90aW1lKSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWlmIChjdG0tPnR5cGUgPT0gVl9BU04xX1VUQ1RJTUUpCisJCXsKKwkJaT0oYnVmZjFbMF0tJzAnKSoxMCsoYnVmZjFbMV0tJzAnKTsKKwkJaWYgKGkgPCA1MCkgaSs9MTAwOyAvKiBjZi4gUkZDIDI0NTkgKi8KKwkJaj0oYnVmZjJbMF0tJzAnKSoxMCsoYnVmZjJbMV0tJzAnKTsKKwkJaWYgKGogPCA1MCkgais9MTAwOworCisJCWlmIChpIDwgaikgcmV0dXJuIC0xOworCQlpZiAoaSA+IGopIHJldHVybiAxOworCQl9CisJaT1zdHJjbXAoYnVmZjEsYnVmZjIpOworCWlmIChpID09IDApIC8qIHdhaXQgYSBzZWNvbmQgdGhlbiByZXR1cm4geW91bmdlciA6LSkgKi8KKwkJcmV0dXJuIC0xOworCWVsc2UKKwkJcmV0dXJuIGk7CisJfQorCitBU04xX1RJTUUgKlg1MDlfZ210aW1lX2FkaihBU04xX1RJTUUgKnMsIGxvbmcgYWRqKQoreworCXJldHVybiBYNTA5X3RpbWVfYWRqKHMsIGFkaiwgTlVMTCk7Cit9CisKK0FTTjFfVElNRSAqWDUwOV90aW1lX2FkaihBU04xX1RJTUUgKnMsIGxvbmcgb2Zmc2V0X3NlYywgdGltZV90ICppbl90bSkKKwl7CisJcmV0dXJuIFg1MDlfdGltZV9hZGpfZXgocywgMCwgb2Zmc2V0X3NlYywgaW5fdG0pOworCX0KKworQVNOMV9USU1FICpYNTA5X3RpbWVfYWRqX2V4KEFTTjFfVElNRSAqcywKKwkJCQlpbnQgb2Zmc2V0X2RheSwgbG9uZyBvZmZzZXRfc2VjLCB0aW1lX3QgKmluX3RtKQorCXsKKwl0aW1lX3QgdDsKKworCWlmIChpbl90bSkgdCA9ICppbl90bTsKKwllbHNlIHRpbWUoJnQpOworCisJaWYgKHMgJiYgIShzLT5mbGFncyAmIEFTTjFfU1RSSU5HX0ZMQUdfTVNUUklORykpCisJCXsKKwkJaWYgKHMtPnR5cGUgPT0gVl9BU04xX1VUQ1RJTUUpCisJCQlyZXR1cm4gQVNOMV9VVENUSU1FX2FkaihzLHQsIG9mZnNldF9kYXksIG9mZnNldF9zZWMpOworCQlpZiAocy0+dHlwZSA9PSBWX0FTTjFfR0VORVJBTElaRURUSU1FKQorCQkJcmV0dXJuIEFTTjFfR0VORVJBTElaRURUSU1FX2FkaihzLCB0LCBvZmZzZXRfZGF5LAorCQkJCQkJCQlvZmZzZXRfc2VjKTsKKwkJfQorCXJldHVybiBBU04xX1RJTUVfYWRqKHMsIHQsIG9mZnNldF9kYXksIG9mZnNldF9zZWMpOworCX0KKworaW50IFg1MDlfZ2V0X3B1YmtleV9wYXJhbWV0ZXJzKEVWUF9QS0VZICpwa2V5LCBTVEFDS19PRihYNTA5KSAqY2hhaW4pCisJeworCUVWUF9QS0VZICprdG1wPU5VTEwsKmt0bXAyOworCXNpemVfdCBpLGo7CisKKwlpZiAoKHBrZXkgIT0gTlVMTCkgJiYgIUVWUF9QS0VZX21pc3NpbmdfcGFyYW1ldGVycyhwa2V5KSkgcmV0dXJuIDE7CisKKwlmb3IgKGk9MDsgaTxza19YNTA5X251bShjaGFpbik7IGkrKykKKwkJeworCQlrdG1wPVg1MDlfZ2V0X3B1YmtleShza19YNTA5X3ZhbHVlKGNoYWluLGkpKTsKKwkJaWYgKGt0bXAgPT0gTlVMTCkKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfZ2V0X3B1YmtleV9wYXJhbWV0ZXJzLCBYNTA5X1JfVU5BQkxFX1RPX0dFVF9DRVJUU19QVUJMSUNfS0VZKTsKKwkJCXJldHVybiAwOworCQkJfQorCQlpZiAoIUVWUF9QS0VZX21pc3NpbmdfcGFyYW1ldGVycyhrdG1wKSkKKwkJCWJyZWFrOworCQllbHNlCisJCQl7CisJCQlFVlBfUEtFWV9mcmVlKGt0bXApOworCQkJa3RtcD1OVUxMOworCQkJfQorCQl9CisJaWYgKGt0bXAgPT0gTlVMTCkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X2dldF9wdWJrZXlfcGFyYW1ldGVycywgWDUwOV9SX1VOQUJMRV9UT19GSU5EX1BBUkFNRVRFUlNfSU5fQ0hBSU4pOworCQlyZXR1cm4gMDsKKwkJfQorCisJLyogZmlyc3QsIHBvcHVsYXRlIHRoZSBvdGhlciBjZXJ0cyAqLworCWZvciAoaj1pLTE7IGogPCBpOyBqLS0pCisJCXsKKwkJa3RtcDI9WDUwOV9nZXRfcHVia2V5KHNrX1g1MDlfdmFsdWUoY2hhaW4saikpOworCQlFVlBfUEtFWV9jb3B5X3BhcmFtZXRlcnMoa3RtcDIsa3RtcCk7CisJCUVWUF9QS0VZX2ZyZWUoa3RtcDIpOworCQl9CisJCisJaWYgKHBrZXkgIT0gTlVMTCkgRVZQX1BLRVlfY29weV9wYXJhbWV0ZXJzKHBrZXksa3RtcCk7CisJRVZQX1BLRVlfZnJlZShrdG1wKTsKKwlyZXR1cm4gMTsKKwl9CisKKy8qIE1ha2UgYSBkZWx0YSBDUkwgYXMgdGhlIGRpZmYgYmV0d2VlbiB0d28gZnVsbCBDUkxzICovCisKK1g1MDlfQ1JMICpYNTA5X0NSTF9kaWZmKFg1MDlfQ1JMICpiYXNlLCBYNTA5X0NSTCAqbmV3ZXIsCisJCQlFVlBfUEtFWSAqc2tleSwgY29uc3QgRVZQX01EICptZCwgdW5zaWduZWQgaW50IGZsYWdzKQorCXsKKwlYNTA5X0NSTCAqY3JsID0gTlVMTDsKKwlpbnQgaTsKKwlzaXplX3QgajsKKwlTVEFDS19PRihYNTA5X1JFVk9LRUQpICpyZXZzID0gTlVMTDsKKwkvKiBDUkxzIGNhbid0IGJlIGRlbHRhIGFscmVhZHkgKi8KKwlpZiAoYmFzZS0+YmFzZV9jcmxfbnVtYmVyIHx8IG5ld2VyLT5iYXNlX2NybF9udW1iZXIpCisJCQl7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X0NSTF9kaWZmLCBYNTA5X1JfQ1JMX0FMUkVBRFlfREVMVEEpOworCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJLyogQmFzZSBhbmQgbmV3IENSTCBtdXN0IGhhdmUgYSBDUkwgbnVtYmVyICovCisJaWYgKCFiYXNlLT5jcmxfbnVtYmVyIHx8ICFuZXdlci0+Y3JsX251bWJlcikKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfQ1JMX2RpZmYsIFg1MDlfUl9OT19DUkxfTlVNQkVSKTsKKwkJCXJldHVybiBOVUxMOworCQkJfQorCS8qIElzc3VlciBuYW1lcyBtdXN0IG1hdGNoICovCisJaWYgKFg1MDlfTkFNRV9jbXAoWDUwOV9DUkxfZ2V0X2lzc3VlcihiYXNlKSwKKwkJCQlYNTA5X0NSTF9nZXRfaXNzdWVyKG5ld2VyKSkpCisJCQl7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X0NSTF9kaWZmLCBYNTA5X1JfSVNTVUVSX01JU01BVENIKTsKKwkJCXJldHVybiBOVUxMOworCQkJfQorCS8qIEFLSUQgYW5kIElEUCBtdXN0IG1hdGNoICovCisJaWYgKCFjcmxfZXh0ZW5zaW9uX21hdGNoKGJhc2UsIG5ld2VyLCBOSURfYXV0aG9yaXR5X2tleV9pZGVudGlmaWVyKSkKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfQ1JMX2RpZmYsIFg1MDlfUl9BS0lEX01JU01BVENIKTsKKwkJCXJldHVybiBOVUxMOworCQkJfQorCWlmICghY3JsX2V4dGVuc2lvbl9tYXRjaChiYXNlLCBuZXdlciwgTklEX2lzc3VpbmdfZGlzdHJpYnV0aW9uX3BvaW50KSkKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfQ1JMX2RpZmYsIFg1MDlfUl9JRFBfTUlTTUFUQ0gpOworCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJLyogTmV3ZXIgQ1JMIG51bWJlciBtdXN0IGV4Y2VlZCBmdWxsIENSTCBudW1iZXIgKi8KKwlpZiAoQVNOMV9JTlRFR0VSX2NtcChuZXdlci0+Y3JsX251bWJlciwgYmFzZS0+Y3JsX251bWJlcikgPD0gMCkKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfQ1JMX2RpZmYsIFg1MDlfUl9ORVdFUl9DUkxfTk9UX05FV0VSKTsKKwkJCXJldHVybiBOVUxMOworCQkJfQorCS8qIENSTHMgbXVzdCB2ZXJpZnkgKi8KKwlpZiAoc2tleSAmJiAoWDUwOV9DUkxfdmVyaWZ5KGJhc2UsIHNrZXkpIDw9IDAgfHwKKwkJCVg1MDlfQ1JMX3ZlcmlmeShuZXdlciwgc2tleSkgPD0gMCkpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9DUkxfZGlmZiwgWDUwOV9SX0NSTF9WRVJJRllfRkFJTFVSRSk7CisJCXJldHVybiBOVUxMOworCQl9CisJLyogQ3JlYXRlIG5ldyBDUkwgKi8KKwljcmwgPSBYNTA5X0NSTF9uZXcoKTsKKwlpZiAoIWNybCB8fCAhWDUwOV9DUkxfc2V0X3ZlcnNpb24oY3JsLCAxKSkKKwkJZ290byBtZW1lcnI7CisJLyogU2V0IGlzc3VlciBuYW1lICovCisJaWYgKCFYNTA5X0NSTF9zZXRfaXNzdWVyX25hbWUoY3JsLCBYNTA5X0NSTF9nZXRfaXNzdWVyKG5ld2VyKSkpCisJCWdvdG8gbWVtZXJyOworCisJaWYgKCFYNTA5X0NSTF9zZXRfbGFzdFVwZGF0ZShjcmwsIFg1MDlfQ1JMX2dldF9sYXN0VXBkYXRlKG5ld2VyKSkpCisJCWdvdG8gbWVtZXJyOworCWlmICghWDUwOV9DUkxfc2V0X25leHRVcGRhdGUoY3JsLCBYNTA5X0NSTF9nZXRfbmV4dFVwZGF0ZShuZXdlcikpKQorCQlnb3RvIG1lbWVycjsKKworCS8qIFNldCBiYXNlIENSTCBudW1iZXI6IG11c3QgYmUgY3JpdGljYWwgKi8KKworCWlmICghWDUwOV9DUkxfYWRkMV9leHRfaTJkKGNybCwgTklEX2RlbHRhX2NybCwgYmFzZS0+Y3JsX251bWJlciwgMSwgMCkpCisJCWdvdG8gbWVtZXJyOworCisJLyogQ29weSBleHRlbnNpb25zIGFjcm9zcyBmcm9tIG5ld2VzdCBDUkwgdG8gZGVsdGE6IHRoaXMgd2lsbCBzZXQKKwkgKiBDUkwgbnVtYmVyIHRvIGNvcnJlY3QgdmFsdWUgdG9vLgorCSAqLworCisJZm9yIChpID0gMDsgaSA8IFg1MDlfQ1JMX2dldF9leHRfY291bnQobmV3ZXIpOyBpKyspCisJCXsKKwkJWDUwOV9FWFRFTlNJT04gKmV4dDsKKwkJZXh0ID0gWDUwOV9DUkxfZ2V0X2V4dChuZXdlciwgaSk7CisJCWlmICghWDUwOV9DUkxfYWRkX2V4dChjcmwsIGV4dCwgLTEpKQorCQkJZ290byBtZW1lcnI7CisJCX0KKworCS8qIEdvIHRocm91Z2ggcmV2b2tlZCBlbnRyaWVzLCBjb3B5aW5nIGFzIG5lZWRlZCAqLworCisJcmV2cyA9IFg1MDlfQ1JMX2dldF9SRVZPS0VEKG5ld2VyKTsKKworCWZvciAoaiA9IDA7IGogPCBza19YNTA5X1JFVk9LRURfbnVtKHJldnMpOyBqKyspCisJCXsKKwkJWDUwOV9SRVZPS0VEICpydm4sICpydnRtcDsKKwkJcnZuID0gc2tfWDUwOV9SRVZPS0VEX3ZhbHVlKHJldnMsIGopOworCQkvKiBBZGQgb25seSBpZiBub3QgYWxzbyBpbiBiYXNlLgorCQkgKiBUT0RPOiBuZWVkIHNvbWV0aGluZyBjbGV2ZXJlciBoZXJlIGZvciBzb21lIG1vcmUgY29tcGxleAorCQkgKiBDUkxzIGNvdmVyaW5nIG11bHRpcGxlIENBcy4KKwkJICovCisJCWlmICghWDUwOV9DUkxfZ2V0MF9ieV9zZXJpYWwoYmFzZSwgJnJ2dG1wLCBydm4tPnNlcmlhbE51bWJlcikpCisJCQl7CisJCQlydnRtcCA9IFg1MDlfUkVWT0tFRF9kdXAocnZuKTsKKwkJCWlmICghcnZ0bXApCisJCQkJZ290byBtZW1lcnI7CisJCQlpZiAoIVg1MDlfQ1JMX2FkZDBfcmV2b2tlZChjcmwsIHJ2dG1wKSkKKwkJCQl7CisJCQkJWDUwOV9SRVZPS0VEX2ZyZWUocnZ0bXApOworCQkJCWdvdG8gbWVtZXJyOworCQkJCX0KKwkJCX0KKwkJfQorCS8qIFRPRE86IG9wdGlvbmFsbHkgcHJ1bmUgZGVsZXRlZCBlbnRyaWVzICovCisKKwlpZiAoc2tleSAmJiBtZCAmJiAhWDUwOV9DUkxfc2lnbihjcmwsIHNrZXksIG1kKSkKKwkJZ290byBtZW1lcnI7CisJCisJcmV0dXJuIGNybDsKKworCW1lbWVycjoKKwlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X0NSTF9kaWZmLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJaWYgKGNybCkKKwkJWDUwOV9DUkxfZnJlZShjcmwpOworCXJldHVybiBOVUxMOworCX0KKworaW50IFg1MDlfU1RPUkVfQ1RYX2dldF9leF9uZXdfaW5kZXgobG9uZyBhcmdsLCB2b2lkICphcmdwLCBDUllQVE9fRVhfbmV3ICpuZXdfZnVuYywKKwkgICAgIENSWVBUT19FWF9kdXAgKmR1cF9mdW5jLCBDUllQVE9fRVhfZnJlZSAqZnJlZV9mdW5jKQorCXsKKwkvKiBUaGlzIGZ1bmN0aW9uIGlzICh1c3VhbGx5KSBjYWxsZWQgb25seSBvbmNlLCBieQorCSAqIFNTTF9nZXRfZXhfZGF0YV9YNTA5X1NUT1JFX0NUWF9pZHggKHNzbC9zc2xfY2VydC5jKS4gKi8KKwlyZXR1cm4gQ1JZUFRPX2dldF9leF9uZXdfaW5kZXgoQ1JZUFRPX0VYX0lOREVYX1g1MDlfU1RPUkVfQ1RYLCBhcmdsLCBhcmdwLAorCQkJbmV3X2Z1bmMsIGR1cF9mdW5jLCBmcmVlX2Z1bmMpOworCX0KKworaW50IFg1MDlfU1RPUkVfQ1RYX3NldF9leF9kYXRhKFg1MDlfU1RPUkVfQ1RYICpjdHgsIGludCBpZHgsIHZvaWQgKmRhdGEpCisJeworCXJldHVybiBDUllQVE9fc2V0X2V4X2RhdGEoJmN0eC0+ZXhfZGF0YSxpZHgsZGF0YSk7CisJfQorCit2b2lkICpYNTA5X1NUT1JFX0NUWF9nZXRfZXhfZGF0YShYNTA5X1NUT1JFX0NUWCAqY3R4LCBpbnQgaWR4KQorCXsKKwlyZXR1cm4gQ1JZUFRPX2dldF9leF9kYXRhKCZjdHgtPmV4X2RhdGEsaWR4KTsKKwl9CisKK2ludCBYNTA5X1NUT1JFX0NUWF9nZXRfZXJyb3IoWDUwOV9TVE9SRV9DVFggKmN0eCkKKwl7CisJcmV0dXJuIGN0eC0+ZXJyb3I7CisJfQorCit2b2lkIFg1MDlfU1RPUkVfQ1RYX3NldF9lcnJvcihYNTA5X1NUT1JFX0NUWCAqY3R4LCBpbnQgZXJyKQorCXsKKwljdHgtPmVycm9yPWVycjsKKwl9CisKK2ludCBYNTA5X1NUT1JFX0NUWF9nZXRfZXJyb3JfZGVwdGgoWDUwOV9TVE9SRV9DVFggKmN0eCkKKwl7CisJcmV0dXJuIGN0eC0+ZXJyb3JfZGVwdGg7CisJfQorCitYNTA5ICpYNTA5X1NUT1JFX0NUWF9nZXRfY3VycmVudF9jZXJ0KFg1MDlfU1RPUkVfQ1RYICpjdHgpCisJeworCXJldHVybiBjdHgtPmN1cnJlbnRfY2VydDsKKwl9CisKK1NUQUNLX09GKFg1MDkpICpYNTA5X1NUT1JFX0NUWF9nZXRfY2hhaW4oWDUwOV9TVE9SRV9DVFggKmN0eCkKKwl7CisJcmV0dXJuIGN0eC0+Y2hhaW47CisJfQorCitTVEFDS19PRihYNTA5KSAqWDUwOV9TVE9SRV9DVFhfZ2V0MV9jaGFpbihYNTA5X1NUT1JFX0NUWCAqY3R4KQorCXsKKwlzaXplX3QgaTsKKwlYNTA5ICp4OworCVNUQUNLX09GKFg1MDkpICpjaGFpbjsKKwlpZiAoIWN0eC0+Y2hhaW4gfHwgIShjaGFpbiA9IHNrX1g1MDlfZHVwKGN0eC0+Y2hhaW4pKSkgcmV0dXJuIE5VTEw7CisJZm9yIChpID0gMDsgaSA8IHNrX1g1MDlfbnVtKGNoYWluKTsgaSsrKQorCQl7CisJCXggPSBza19YNTA5X3ZhbHVlKGNoYWluLCBpKTsKKwkJQ1JZUFRPX2FkZCgmeC0+cmVmZXJlbmNlcywgMSwgQ1JZUFRPX0xPQ0tfWDUwOSk7CisJCX0KKwlyZXR1cm4gY2hhaW47CisJfQorCitYNTA5ICpYNTA5X1NUT1JFX0NUWF9nZXQwX2N1cnJlbnRfaXNzdWVyKFg1MDlfU1RPUkVfQ1RYICpjdHgpCisJeworCXJldHVybiBjdHgtPmN1cnJlbnRfaXNzdWVyOworCX0KKworWDUwOV9DUkwgKlg1MDlfU1RPUkVfQ1RYX2dldDBfY3VycmVudF9jcmwoWDUwOV9TVE9SRV9DVFggKmN0eCkKKwl7CisJcmV0dXJuIGN0eC0+Y3VycmVudF9jcmw7CisJfQorCitYNTA5X1NUT1JFX0NUWCAqWDUwOV9TVE9SRV9DVFhfZ2V0MF9wYXJlbnRfY3R4KFg1MDlfU1RPUkVfQ1RYICpjdHgpCisJeworCXJldHVybiBjdHgtPnBhcmVudDsKKwl9CisKK3ZvaWQgWDUwOV9TVE9SRV9DVFhfc2V0X2NlcnQoWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOSAqeCkKKwl7CisJY3R4LT5jZXJ0PXg7CisJfQorCit2b2lkIFg1MDlfU1RPUkVfQ1RYX3NldF9jaGFpbihYNTA5X1NUT1JFX0NUWCAqY3R4LCBTVEFDS19PRihYNTA5KSAqc2spCisJeworCWN0eC0+dW50cnVzdGVkPXNrOworCX0KKwordm9pZCBYNTA5X1NUT1JFX0NUWF9zZXQwX2NybHMoWDUwOV9TVE9SRV9DVFggKmN0eCwgU1RBQ0tfT0YoWDUwOV9DUkwpICpzaykKKwl7CisJY3R4LT5jcmxzPXNrOworCX0KKworaW50IFg1MDlfU1RPUkVfQ1RYX3NldF9wdXJwb3NlKFg1MDlfU1RPUkVfQ1RYICpjdHgsIGludCBwdXJwb3NlKQorCXsKKwlyZXR1cm4gWDUwOV9TVE9SRV9DVFhfcHVycG9zZV9pbmhlcml0KGN0eCwgMCwgcHVycG9zZSwgMCk7CisJfQorCitpbnQgWDUwOV9TVE9SRV9DVFhfc2V0X3RydXN0KFg1MDlfU1RPUkVfQ1RYICpjdHgsIGludCB0cnVzdCkKKwl7CisJcmV0dXJuIFg1MDlfU1RPUkVfQ1RYX3B1cnBvc2VfaW5oZXJpdChjdHgsIDAsIDAsIHRydXN0KTsKKwl9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgdGhlIFg1MDlfU1RPUkVfQ1RYIHB1cnBvc2UgYW5kIHRydXN0CisgKiB2YWx1ZXMuIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aGVuIGFub3RoZXIgc3RydWN0dXJlIGhhcyBpdHMKKyAqIG93biB0cnVzdCBhbmQgcHVycG9zZSB2YWx1ZXMgd2hpY2ggKGlmIHNldCkgd2lsbCBiZSBpbmhlcml0ZWQgYnkKKyAqIHRoZSBjdHguIElmIHRoZXkgYXJlbid0IHNldCB0aGVuIHdlIHdpbGwgdXN1YWxseSBoYXZlIGEgZGVmYXVsdAorICogcHVycG9zZSBpbiBtaW5kIHdoaWNoIHNob3VsZCB0aGVuIGJlIHVzZWQgdG8gc2V0IHRoZSB0cnVzdCB2YWx1ZS4KKyAqIEFuIGV4YW1wbGUgb2YgdGhpcyBpcyBTU0wgdXNlOiBhbiBTU0wgc3RydWN0dXJlIHdpbGwgaGF2ZSBpdHMgb3duCisgKiBwdXJwb3NlIGFuZCB0cnVzdCBzZXR0aW5ncyB3aGljaCB0aGUgYXBwbGljYXRpb24gY2FuIHNldDogaWYgdGhleQorICogYXJlbid0IHNldCB0aGVuIHdlIHVzZSB0aGUgZGVmYXVsdCBvZiBTU0wgY2xpZW50L3NlcnZlci4KKyAqLworCitpbnQgWDUwOV9TVE9SRV9DVFhfcHVycG9zZV9pbmhlcml0KFg1MDlfU1RPUkVfQ1RYICpjdHgsIGludCBkZWZfcHVycG9zZSwKKwkJCQlpbnQgcHVycG9zZSwgaW50IHRydXN0KQoreworCWludCBpZHg7CisJLyogSWYgcHVycG9zZSBub3Qgc2V0IHVzZSBkZWZhdWx0ICovCisJaWYgKCFwdXJwb3NlKSBwdXJwb3NlID0gZGVmX3B1cnBvc2U7CisJLyogSWYgd2UgaGF2ZSBhIHB1cnBvc2UgdGhlbiBjaGVjayBpdCBpcyB2YWxpZCAqLworCWlmIChwdXJwb3NlKQorCQl7CisJCVg1MDlfUFVSUE9TRSAqcHRtcDsKKwkJaWR4ID0gWDUwOV9QVVJQT1NFX2dldF9ieV9pZChwdXJwb3NlKTsKKwkJaWYgKGlkeCA9PSAtMSkKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfU1RPUkVfQ1RYX3B1cnBvc2VfaW5oZXJpdCwgWDUwOV9SX1VOS05PV05fUFVSUE9TRV9JRCk7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJcHRtcCA9IFg1MDlfUFVSUE9TRV9nZXQwKGlkeCk7CisJCWlmIChwdG1wLT50cnVzdCA9PSBYNTA5X1RSVVNUX0RFRkFVTFQpCisJCQl7CisJCQlpZHggPSBYNTA5X1BVUlBPU0VfZ2V0X2J5X2lkKGRlZl9wdXJwb3NlKTsKKwkJCWlmIChpZHggPT0gLTEpCisJCQkJeworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfU1RPUkVfQ1RYX3B1cnBvc2VfaW5oZXJpdCwgWDUwOV9SX1VOS05PV05fUFVSUE9TRV9JRCk7CisJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJcHRtcCA9IFg1MDlfUFVSUE9TRV9nZXQwKGlkeCk7CisJCQl9CisJCS8qIElmIHRydXN0IG5vdCBzZXQgdGhlbiBnZXQgZnJvbSBwdXJwb3NlIGRlZmF1bHQgKi8KKwkJaWYgKCF0cnVzdCkgdHJ1c3QgPSBwdG1wLT50cnVzdDsKKwkJfQorCWlmICh0cnVzdCkKKwkJeworCQlpZHggPSBYNTA5X1RSVVNUX2dldF9ieV9pZCh0cnVzdCk7CisJCWlmIChpZHggPT0gLTEpCisJCQl7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1NUT1JFX0NUWF9wdXJwb3NlX2luaGVyaXQsIFg1MDlfUl9VTktOT1dOX1RSVVNUX0lEKTsKKwkJCXJldHVybiAwOworCQkJfQorCQl9CisKKwlpZiAocHVycG9zZSAmJiAhY3R4LT5wYXJhbS0+cHVycG9zZSkgY3R4LT5wYXJhbS0+cHVycG9zZSA9IHB1cnBvc2U7CisJaWYgKHRydXN0ICYmICFjdHgtPnBhcmFtLT50cnVzdCkgY3R4LT5wYXJhbS0+dHJ1c3QgPSB0cnVzdDsKKwlyZXR1cm4gMTsKK30KKworWDUwOV9TVE9SRV9DVFggKlg1MDlfU1RPUkVfQ1RYX25ldyh2b2lkKQoreworCVg1MDlfU1RPUkVfQ1RYICpjdHg7CisJY3R4ID0gKFg1MDlfU1RPUkVfQ1RYICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKFg1MDlfU1RPUkVfQ1RYKSk7CisJaWYgKCFjdHgpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9TVE9SRV9DVFhfbmV3LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiBOVUxMOworCQl9CisJbWVtc2V0KGN0eCwgMCwgc2l6ZW9mKFg1MDlfU1RPUkVfQ1RYKSk7CisJcmV0dXJuIGN0eDsKK30KKwordm9pZCBYNTA5X1NUT1JFX0NUWF9mcmVlKFg1MDlfU1RPUkVfQ1RYICpjdHgpCit7CisJWDUwOV9TVE9SRV9DVFhfY2xlYW51cChjdHgpOworCU9QRU5TU0xfZnJlZShjdHgpOworfQorCitpbnQgWDUwOV9TVE9SRV9DVFhfaW5pdChYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5X1NUT1JFICpzdG9yZSwgWDUwOSAqeDUwOSwKKwkgICAgIFNUQUNLX09GKFg1MDkpICpjaGFpbikKKwl7CisJaW50IHJldCA9IDE7CisJY3R4LT5jdHg9c3RvcmU7CisJY3R4LT5jdXJyZW50X21ldGhvZD0wOworCWN0eC0+Y2VydD14NTA5OworCWN0eC0+dW50cnVzdGVkPWNoYWluOworCWN0eC0+Y3JscyA9IE5VTEw7CisJY3R4LT5sYXN0X3VudHJ1c3RlZD0wOworCWN0eC0+b3RoZXJfY3R4PU5VTEw7CisJY3R4LT52YWxpZD0wOworCWN0eC0+Y2hhaW49TlVMTDsKKwljdHgtPmVycm9yPTA7CisJY3R4LT5leHBsaWNpdF9wb2xpY3k9MDsKKwljdHgtPmVycm9yX2RlcHRoPTA7CisJY3R4LT5jdXJyZW50X2NlcnQ9TlVMTDsKKwljdHgtPmN1cnJlbnRfaXNzdWVyPU5VTEw7CisJY3R4LT5jdXJyZW50X2NybD1OVUxMOworCWN0eC0+Y3VycmVudF9jcmxfc2NvcmU9MDsKKwljdHgtPmN1cnJlbnRfcmVhc29ucz0wOworCWN0eC0+dHJlZSA9IE5VTEw7CisJY3R4LT5wYXJlbnQgPSBOVUxMOworCisJY3R4LT5wYXJhbSA9IFg1MDlfVkVSSUZZX1BBUkFNX25ldygpOworCisJaWYgKCFjdHgtPnBhcmFtKQorCQl7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfU1RPUkVfQ1RYX2luaXQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCS8qIEluaGVyaXQgY2FsbGJhY2tzIGFuZCBmbGFncyBmcm9tIFg1MDlfU1RPUkUgaWYgbm90IHNldAorCSAqIHVzZSBkZWZhdWx0cy4KKwkgKi8KKworCisJaWYgKHN0b3JlKQorCQlyZXQgPSBYNTA5X1ZFUklGWV9QQVJBTV9pbmhlcml0KGN0eC0+cGFyYW0sIHN0b3JlLT5wYXJhbSk7CisJZWxzZQorCQljdHgtPnBhcmFtLT5pbmhfZmxhZ3MgfD0gWDUwOV9WUF9GTEFHX0RFRkFVTFR8WDUwOV9WUF9GTEFHX09OQ0U7CisKKwlpZiAoc3RvcmUpCisJCXsKKwkJY3R4LT52ZXJpZnlfY2IgPSBzdG9yZS0+dmVyaWZ5X2NiOworCQljdHgtPmNsZWFudXAgPSBzdG9yZS0+Y2xlYW51cDsKKwkJfQorCWVsc2UKKwkJY3R4LT5jbGVhbnVwID0gMDsKKworCWlmIChyZXQpCisJCXJldCA9IFg1MDlfVkVSSUZZX1BBUkFNX2luaGVyaXQoY3R4LT5wYXJhbSwKKwkJCQkJWDUwOV9WRVJJRllfUEFSQU1fbG9va3VwKCJkZWZhdWx0IikpOworCisJaWYgKHJldCA9PSAwKQorCQl7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfU1RPUkVfQ1RYX2luaXQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCWlmIChzdG9yZSAmJiBzdG9yZS0+Y2hlY2tfaXNzdWVkKQorCQljdHgtPmNoZWNrX2lzc3VlZCA9IHN0b3JlLT5jaGVja19pc3N1ZWQ7CisJZWxzZQorCQljdHgtPmNoZWNrX2lzc3VlZCA9IGNoZWNrX2lzc3VlZDsKKworCWlmIChzdG9yZSAmJiBzdG9yZS0+Z2V0X2lzc3VlcikKKwkJY3R4LT5nZXRfaXNzdWVyID0gc3RvcmUtPmdldF9pc3N1ZXI7CisJZWxzZQorCQljdHgtPmdldF9pc3N1ZXIgPSBYNTA5X1NUT1JFX0NUWF9nZXQxX2lzc3VlcjsKKworCWlmIChzdG9yZSAmJiBzdG9yZS0+dmVyaWZ5X2NiKQorCQljdHgtPnZlcmlmeV9jYiA9IHN0b3JlLT52ZXJpZnlfY2I7CisJZWxzZQorCQljdHgtPnZlcmlmeV9jYiA9IG51bGxfY2FsbGJhY2s7CisKKwlpZiAoc3RvcmUgJiYgc3RvcmUtPnZlcmlmeSkKKwkJY3R4LT52ZXJpZnkgPSBzdG9yZS0+dmVyaWZ5OworCWVsc2UKKwkJY3R4LT52ZXJpZnkgPSBpbnRlcm5hbF92ZXJpZnk7CisKKwlpZiAoc3RvcmUgJiYgc3RvcmUtPmNoZWNrX3Jldm9jYXRpb24pCisJCWN0eC0+Y2hlY2tfcmV2b2NhdGlvbiA9IHN0b3JlLT5jaGVja19yZXZvY2F0aW9uOworCWVsc2UKKwkJY3R4LT5jaGVja19yZXZvY2F0aW9uID0gY2hlY2tfcmV2b2NhdGlvbjsKKworCWlmIChzdG9yZSAmJiBzdG9yZS0+Z2V0X2NybCkKKwkJY3R4LT5nZXRfY3JsID0gc3RvcmUtPmdldF9jcmw7CisJZWxzZQorCQljdHgtPmdldF9jcmwgPSBOVUxMOworCisJaWYgKHN0b3JlICYmIHN0b3JlLT5jaGVja19jcmwpCisJCWN0eC0+Y2hlY2tfY3JsID0gc3RvcmUtPmNoZWNrX2NybDsKKwllbHNlCisJCWN0eC0+Y2hlY2tfY3JsID0gY2hlY2tfY3JsOworCisJaWYgKHN0b3JlICYmIHN0b3JlLT5jZXJ0X2NybCkKKwkJY3R4LT5jZXJ0X2NybCA9IHN0b3JlLT5jZXJ0X2NybDsKKwllbHNlCisJCWN0eC0+Y2VydF9jcmwgPSBjZXJ0X2NybDsKKworCWlmIChzdG9yZSAmJiBzdG9yZS0+bG9va3VwX2NlcnRzKQorCQljdHgtPmxvb2t1cF9jZXJ0cyA9IHN0b3JlLT5sb29rdXBfY2VydHM7CisJZWxzZQorCQljdHgtPmxvb2t1cF9jZXJ0cyA9IFg1MDlfU1RPUkVfZ2V0MV9jZXJ0czsKKworCWlmIChzdG9yZSAmJiBzdG9yZS0+bG9va3VwX2NybHMpCisJCWN0eC0+bG9va3VwX2NybHMgPSBzdG9yZS0+bG9va3VwX2NybHM7CisJZWxzZQorCQljdHgtPmxvb2t1cF9jcmxzID0gWDUwOV9TVE9SRV9nZXQxX2NybHM7CisKKwljdHgtPmNoZWNrX3BvbGljeSA9IGNoZWNrX3BvbGljeTsKKworCisJLyogVGhpcyBtZW1zZXQoKSBjYW4ndCBtYWtlIGFueSBzZW5zZSBhbnl3YXksIHNvIGl0J3MgcmVtb3ZlZC4gQXMKKwkgKiBYNTA5X1NUT1JFX0NUWF9jbGVhbnVwIGRvZXMgYSBwcm9wZXIgImZyZWUiIG9uIHRoZSBleF9kYXRhLCB3ZSBwdXQgYQorCSAqIGNvcnJlc3BvbmRpbmcgIm5ldyIgaGVyZSBhbmQgcmVtb3ZlIHRoaXMgYm9ndXMgaW5pdGlhbGlzYXRpb24uICovCisJLyogbWVtc2V0KCYoY3R4LT5leF9kYXRhKSwwLHNpemVvZihDUllQVE9fRVhfREFUQSkpOyAqLworCWlmKCFDUllQVE9fbmV3X2V4X2RhdGEoQ1JZUFRPX0VYX0lOREVYX1g1MDlfU1RPUkVfQ1RYLCBjdHgsCisJCQkJJihjdHgtPmV4X2RhdGEpKSkKKwkJeworCQlPUEVOU1NMX2ZyZWUoY3R4KTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9TVE9SRV9DVFhfaW5pdCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiAxOworCX0KKworLyogU2V0IGFsdGVybmF0aXZlIGxvb2t1cCBtZXRob2Q6IGp1c3QgYSBTVEFDSyBvZiB0cnVzdGVkIGNlcnRpZmljYXRlcy4KKyAqIFRoaXMgYXZvaWRzIFg1MDlfU1RPUkUgbmFzdGluZXNzIHdoZXJlIGl0IGlzbid0IG5lZWRlZC4KKyAqLworCit2b2lkIFg1MDlfU1RPUkVfQ1RYX3RydXN0ZWRfc3RhY2soWDUwOV9TVE9SRV9DVFggKmN0eCwgU1RBQ0tfT0YoWDUwOSkgKnNrKQoreworCWN0eC0+b3RoZXJfY3R4ID0gc2s7CisJY3R4LT5nZXRfaXNzdWVyID0gZ2V0X2lzc3Vlcl9zazsKK30KKwordm9pZCBYNTA5X1NUT1JFX0NUWF9jbGVhbnVwKFg1MDlfU1RPUkVfQ1RYICpjdHgpCisJeworCWlmIChjdHgtPmNsZWFudXApIGN0eC0+Y2xlYW51cChjdHgpOworCWlmIChjdHgtPnBhcmFtICE9IE5VTEwpCisJCXsKKwkJaWYgKGN0eC0+cGFyZW50ID09IE5VTEwpCisJCQlYNTA5X1ZFUklGWV9QQVJBTV9mcmVlKGN0eC0+cGFyYW0pOworCQljdHgtPnBhcmFtPU5VTEw7CisJCX0KKwlpZiAoY3R4LT50cmVlICE9IE5VTEwpCisJCXsKKwkJWDUwOV9wb2xpY3lfdHJlZV9mcmVlKGN0eC0+dHJlZSk7CisJCWN0eC0+dHJlZT1OVUxMOworCQl9CisJaWYgKGN0eC0+Y2hhaW4gIT0gTlVMTCkKKwkJeworCQlza19YNTA5X3BvcF9mcmVlKGN0eC0+Y2hhaW4sWDUwOV9mcmVlKTsKKwkJY3R4LT5jaGFpbj1OVUxMOworCQl9CisJQ1JZUFRPX2ZyZWVfZXhfZGF0YShDUllQVE9fRVhfSU5ERVhfWDUwOV9TVE9SRV9DVFgsIGN0eCwgJihjdHgtPmV4X2RhdGEpKTsKKwltZW1zZXQoJmN0eC0+ZXhfZGF0YSwwLHNpemVvZihDUllQVE9fRVhfREFUQSkpOworCX0KKwordm9pZCBYNTA5X1NUT1JFX0NUWF9zZXRfZGVwdGgoWDUwOV9TVE9SRV9DVFggKmN0eCwgaW50IGRlcHRoKQorCXsKKwlYNTA5X1ZFUklGWV9QQVJBTV9zZXRfZGVwdGgoY3R4LT5wYXJhbSwgZGVwdGgpOworCX0KKwordm9pZCBYNTA5X1NUT1JFX0NUWF9zZXRfZmxhZ3MoWDUwOV9TVE9SRV9DVFggKmN0eCwgdW5zaWduZWQgbG9uZyBmbGFncykKKwl7CisJWDUwOV9WRVJJRllfUEFSQU1fc2V0X2ZsYWdzKGN0eC0+cGFyYW0sIGZsYWdzKTsKKwl9CisKK3ZvaWQgWDUwOV9TVE9SRV9DVFhfc2V0X3RpbWUoWDUwOV9TVE9SRV9DVFggKmN0eCwgdW5zaWduZWQgbG9uZyBmbGFncywgdGltZV90IHQpCisJeworCVg1MDlfVkVSSUZZX1BBUkFNX3NldF90aW1lKGN0eC0+cGFyYW0sIHQpOworCX0KKwordm9pZCBYNTA5X1NUT1JFX0NUWF9zZXRfdmVyaWZ5X2NiKFg1MDlfU1RPUkVfQ1RYICpjdHgsCisJCQkJICBpbnQgKCp2ZXJpZnlfY2IpKGludCwgWDUwOV9TVE9SRV9DVFggKikpCisJeworCWN0eC0+dmVyaWZ5X2NiPXZlcmlmeV9jYjsKKwl9CisKK1g1MDlfUE9MSUNZX1RSRUUgKlg1MDlfU1RPUkVfQ1RYX2dldDBfcG9saWN5X3RyZWUoWDUwOV9TVE9SRV9DVFggKmN0eCkKKwl7CisJcmV0dXJuIGN0eC0+dHJlZTsKKwl9CisKK2ludCBYNTA5X1NUT1JFX0NUWF9nZXRfZXhwbGljaXRfcG9saWN5KFg1MDlfU1RPUkVfQ1RYICpjdHgpCisJeworCXJldHVybiBjdHgtPmV4cGxpY2l0X3BvbGljeTsKKwl9CisKK2ludCBYNTA5X1NUT1JFX0NUWF9zZXRfZGVmYXVsdChYNTA5X1NUT1JFX0NUWCAqY3R4LCBjb25zdCBjaGFyICpuYW1lKQorCXsKKwljb25zdCBYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW07CisJcGFyYW0gPSBYNTA5X1ZFUklGWV9QQVJBTV9sb29rdXAobmFtZSk7CisJaWYgKCFwYXJhbSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIFg1MDlfVkVSSUZZX1BBUkFNX2luaGVyaXQoY3R4LT5wYXJhbSwgcGFyYW0pOworCX0KKworWDUwOV9WRVJJRllfUEFSQU0gKlg1MDlfU1RPUkVfQ1RYX2dldDBfcGFyYW0oWDUwOV9TVE9SRV9DVFggKmN0eCkKKwl7CisJcmV0dXJuIGN0eC0+cGFyYW07CisJfQorCit2b2lkIFg1MDlfU1RPUkVfQ1RYX3NldDBfcGFyYW0oWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOV9WRVJJRllfUEFSQU0gKnBhcmFtKQorCXsKKwlpZiAoY3R4LT5wYXJhbSkKKwkJWDUwOV9WRVJJRllfUEFSQU1fZnJlZShjdHgtPnBhcmFtKTsKKwljdHgtPnBhcmFtID0gcGFyYW07CisJfQorCitJTVBMRU1FTlRfQVNOMV9TRVRfT0YoWDUwOSkKK0lNUExFTUVOVF9BU04xX1NFVF9PRihYNTA5X0FUVFJJQlVURSkKZGlmZiAtLWdpdCBhL2NyeXB0by94NTA5L3g1MDlfdmZ5LmggYi9jcnlwdG8veDUwOS94NTA5X3ZmeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNTQyNTAKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOS94NTA5X3ZmeS5oCkBAIC0wLDAgKzEsNjA1IEBACisvKiBjcnlwdG8veDUwOS94NTA5X3ZmeS5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpZm5kZWYgSEVBREVSX1g1MDlfSAorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorLyogb3BlbnNzbC94NTA5LmggZW5kcyB1cCAjaW5jbHVkZS1pbmcgdGhpcyBmaWxlIGF0IGFib3V0IHRoZSBvbmx5CisgKiBhcHByb3ByaWF0ZSBtb21lbnQuICovCisjZW5kaWYKKworI2lmbmRlZiBIRUFERVJfWDUwOV9WRllfSAorI2RlZmluZSBIRUFERVJfWDUwOV9WRllfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2xoYXNoLmg+CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZiAwCisvKiBPdXRlciBvYmplY3QgKi8KK3R5cGVkZWYgc3RydWN0IHg1MDlfaGFzaF9kaXJfc3QKKwl7CisJaW50IG51bV9kaXJzOworCWNoYXIgKipkaXJzOworCWludCAqZGlyc190eXBlOworCWludCBudW1fZGlyc19hbGxvY2VkOworCX0gWDUwOV9IQVNIX0RJUl9DVFg7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeDUwOV9maWxlX3N0CisJeworCWludCBudW1fcGF0aHM7CS8qIG51bWJlciBvZiBwYXRocyB0byBmaWxlcyBvciBkaXJlY3RvcmllcyAqLworCWludCBudW1fYWxsb2NlZDsKKwljaGFyICoqcGF0aHM7CS8qIHRoZSBsaXN0IG9mIHBhdGhzIG9yIGRpcmVjdG9yaWVzICovCisJaW50ICpwYXRoX3R5cGU7CisJfSBYNTA5X0NFUlRfRklMRV9DVFg7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKK1NTTF9DVFggLT4gWDUwOV9TVE9SRSAgICAKKwkJLT4gWDUwOV9MT09LVVAKKwkJCS0+WDUwOV9MT09LVVBfTUVUSE9ECisJCS0+IFg1MDlfTE9PS1VQCisJCQktPlg1MDlfTE9PS1VQX01FVEhPRAorIAorU1NMCS0+IFg1MDlfU1RPUkVfQ1RYCisJCS0+WDUwOV9TVE9SRSAgICAKKworVGhlIFg1MDlfU1RPUkUgaG9sZHMgdGhlIHRhYmxlcyBldGMgZm9yIHZlcmlmaWNhdGlvbiBzdHVmZi4KK0EgWDUwOV9TVE9SRV9DVFggaXMgdXNlZCB3aGlsZSB2YWxpZGF0aW5nIGEgc2luZ2xlIGNlcnRpZmljYXRlLgorVGhlIFg1MDlfU1RPUkUgaGFzIFg1MDlfTE9PS1VQcyBmb3IgbG9va2luZyB1cCBjZXJ0cy4KK1RoZSBYNTA5X1NUT1JFIHRoZW4gY2FsbHMgYSBmdW5jdGlvbiB0byBhY3R1YWxseSB2ZXJpZnkgdGhlCitjZXJ0aWZpY2F0ZSBjaGFpbi4KKyovCisKKyNkZWZpbmUgWDUwOV9MVV9SRVRSWQkJLTEKKyNkZWZpbmUgWDUwOV9MVV9GQUlMCQkwCisjZGVmaW5lIFg1MDlfTFVfWDUwOQkJMQorI2RlZmluZSBYNTA5X0xVX0NSTAkJMgorI2RlZmluZSBYNTA5X0xVX1BLRVkJCTMKKwordHlwZWRlZiBzdHJ1Y3QgeDUwOV9vYmplY3Rfc3QKKwl7CisJLyogb25lIG9mIHRoZSBhYm92ZSB0eXBlcyAqLworCWludCB0eXBlOworCXVuaW9uCXsKKwkJY2hhciAqcHRyOworCQlYNTA5ICp4NTA5OworCQlYNTA5X0NSTCAqY3JsOworCQlFVlBfUEtFWSAqcGtleTsKKwkJfSBkYXRhOworCX0gWDUwOV9PQkpFQ1Q7CisKK3R5cGVkZWYgc3RydWN0IHg1MDlfbG9va3VwX3N0IFg1MDlfTE9PS1VQOworCitERUNMQVJFX1NUQUNLX09GKFg1MDlfTE9PS1VQKQorREVDTEFSRV9TVEFDS19PRihYNTA5X09CSkVDVCkKKworLyogVGhpcyBpcyBhIHN0YXRpYyB0aGF0IGRlZmluZXMgdGhlIGZ1bmN0aW9uIGludGVyZmFjZSAqLwordHlwZWRlZiBzdHJ1Y3QgeDUwOV9sb29rdXBfbWV0aG9kX3N0CisJeworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50ICgqbmV3X2l0ZW0pKFg1MDlfTE9PS1VQICpjdHgpOworCXZvaWQgKCpmcmVlKShYNTA5X0xPT0tVUCAqY3R4KTsKKwlpbnQgKCppbml0KShYNTA5X0xPT0tVUCAqY3R4KTsKKwlpbnQgKCpzaHV0ZG93bikoWDUwOV9MT09LVVAgKmN0eCk7CisJaW50ICgqY3RybCkoWDUwOV9MT09LVVAgKmN0eCxpbnQgY21kLGNvbnN0IGNoYXIgKmFyZ2MsbG9uZyBhcmdsLAorCQkJY2hhciAqKnJldCk7CisJaW50ICgqZ2V0X2J5X3N1YmplY3QpKFg1MDlfTE9PS1VQICpjdHgsaW50IHR5cGUsWDUwOV9OQU1FICpuYW1lLAorCQkJICAgICAgWDUwOV9PQkpFQ1QgKnJldCk7CisJaW50ICgqZ2V0X2J5X2lzc3Vlcl9zZXJpYWwpKFg1MDlfTE9PS1VQICpjdHgsaW50IHR5cGUsWDUwOV9OQU1FICpuYW1lLAorCQkJCSAgICBBU04xX0lOVEVHRVIgKnNlcmlhbCxYNTA5X09CSkVDVCAqcmV0KTsKKwlpbnQgKCpnZXRfYnlfZmluZ2VycHJpbnQpKFg1MDlfTE9PS1VQICpjdHgsaW50IHR5cGUsCisJCQkJICB1bnNpZ25lZCBjaGFyICpieXRlcyxpbnQgbGVuLAorCQkJCSAgWDUwOV9PQkpFQ1QgKnJldCk7CisJaW50ICgqZ2V0X2J5X2FsaWFzKShYNTA5X0xPT0tVUCAqY3R4LGludCB0eXBlLGNoYXIgKnN0cixpbnQgbGVuLAorCQkJICAgIFg1MDlfT0JKRUNUICpyZXQpOworCX0gWDUwOV9MT09LVVBfTUVUSE9EOworCit0eXBlZGVmIHN0cnVjdCBYNTA5X1ZFUklGWV9QQVJBTV9JRF9zdCBYNTA5X1ZFUklGWV9QQVJBTV9JRDsKKworLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZCBhbGwgcGFyYW1ldGVycyBhc3NvY2lhdGVkIHdpdGggYSB2ZXJpZnkgb3BlcmF0aW9uCisgKiBieSBpbmNsdWRpbmcgYW4gWDUwOV9WRVJJRllfUEFSQU0gc3RydWN0dXJlIGluIHJlbGF0ZWQgc3RydWN0dXJlcyB0aGUKKyAqIHBhcmFtZXRlcnMgdXNlZCBjYW4gYmUgY3VzdG9taXplZAorICovCisKK3R5cGVkZWYgc3RydWN0IFg1MDlfVkVSSUZZX1BBUkFNX3N0CisJeworCWNoYXIgKm5hbWU7CisJdGltZV90IGNoZWNrX3RpbWU7CS8qIFRpbWUgdG8gdXNlICovCisJdW5zaWduZWQgbG9uZyBpbmhfZmxhZ3M7IC8qIEluaGVyaXRhbmNlIGZsYWdzICovCisJdW5zaWduZWQgbG9uZyBmbGFnczsJLyogVmFyaW91cyB2ZXJpZnkgZmxhZ3MgKi8KKwlpbnQgcHVycG9zZTsJCS8qIHB1cnBvc2UgdG8gY2hlY2sgdW50cnVzdGVkIGNlcnRpZmljYXRlcyAqLworCWludCB0cnVzdDsJCS8qIHRydXN0IHNldHRpbmcgdG8gY2hlY2sgKi8KKwlpbnQgZGVwdGg7CQkvKiBWZXJpZnkgZGVwdGggKi8KKwlTVEFDS19PRihBU04xX09CSkVDVCkgKnBvbGljaWVzOwkvKiBQZXJtaXNzaWJsZSBwb2xpY2llcyAqLworCVg1MDlfVkVSSUZZX1BBUkFNX0lEICppZDsJLyogb3BhcXVlIElEIGRhdGEgKi8KKwl9IFg1MDlfVkVSSUZZX1BBUkFNOworCitERUNMQVJFX1NUQUNLX09GKFg1MDlfVkVSSUZZX1BBUkFNKQorCisvKiBUaGlzIGlzIHVzZWQgdG8gaG9sZCBldmVyeXRoaW5nLiAgSXQgaXMgdXNlZCBmb3IgYWxsIGNlcnRpZmljYXRlCisgKiB2YWxpZGF0aW9uLiAgT25jZSB3ZSBoYXZlIGEgY2VydGlmaWNhdGUgY2hhaW4sIHRoZSAndmVyaWZ5JworICogZnVuY3Rpb24gaXMgdGhlbiBjYWxsZWQgdG8gYWN0dWFsbHkgY2hlY2sgdGhlIGNlcnQgY2hhaW4uICovCitzdHJ1Y3QgeDUwOV9zdG9yZV9zdAorCXsKKwkvKiBUaGUgZm9sbG93aW5nIGlzIGEgY2FjaGUgb2YgdHJ1c3RlZCBjZXJ0cyAqLworCWludCBjYWNoZTsgCS8qIGlmIHRydWUsIHN0YXNoIGFueSBoaXRzICovCisJU1RBQ0tfT0YoWDUwOV9PQkpFQ1QpICpvYmpzOwkvKiBDYWNoZSBvZiBhbGwgb2JqZWN0cyAqLworCisJLyogVGhlc2UgYXJlIGV4dGVybmFsIGxvb2t1cCBtZXRob2RzICovCisJU1RBQ0tfT0YoWDUwOV9MT09LVVApICpnZXRfY2VydF9tZXRob2RzOworCisJWDUwOV9WRVJJRllfUEFSQU0gKnBhcmFtOworCisJLyogQ2FsbGJhY2tzIGZvciB2YXJpb3VzIG9wZXJhdGlvbnMgKi8KKwlpbnQgKCp2ZXJpZnkpKFg1MDlfU1RPUkVfQ1RYICpjdHgpOwkvKiBjYWxsZWQgdG8gdmVyaWZ5IGEgY2VydGlmaWNhdGUgKi8KKwlpbnQgKCp2ZXJpZnlfY2IpKGludCBvayxYNTA5X1NUT1JFX0NUWCAqY3R4KTsJLyogZXJyb3IgY2FsbGJhY2sgKi8KKwlpbnQgKCpnZXRfaXNzdWVyKShYNTA5ICoqaXNzdWVyLCBYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5ICp4KTsJLyogZ2V0IGlzc3VlcnMgY2VydCBmcm9tIGN0eCAqLworCWludCAoKmNoZWNrX2lzc3VlZCkoWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOSAqeCwgWDUwOSAqaXNzdWVyKTsgLyogY2hlY2sgaXNzdWVkICovCisJaW50ICgqY2hlY2tfcmV2b2NhdGlvbikoWDUwOV9TVE9SRV9DVFggKmN0eCk7IC8qIENoZWNrIHJldm9jYXRpb24gc3RhdHVzIG9mIGNoYWluICovCisJaW50ICgqZ2V0X2NybCkoWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOV9DUkwgKipjcmwsIFg1MDkgKngpOyAvKiByZXRyaWV2ZSBDUkwgKi8KKwlpbnQgKCpjaGVja19jcmwpKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDlfQ1JMICpjcmwpOyAvKiBDaGVjayBDUkwgdmFsaWRpdHkgKi8KKwlpbnQgKCpjZXJ0X2NybCkoWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOV9DUkwgKmNybCwgWDUwOSAqeCk7IC8qIENoZWNrIGNlcnRpZmljYXRlIGFnYWluc3QgQ1JMICovCisJU1RBQ0tfT0YoWDUwOSkgKiAoKmxvb2t1cF9jZXJ0cykoWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOV9OQU1FICpubSk7CisJU1RBQ0tfT0YoWDUwOV9DUkwpICogKCpsb29rdXBfY3JscykoWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOV9OQU1FICpubSk7CisJaW50ICgqY2xlYW51cCkoWDUwOV9TVE9SRV9DVFggKmN0eCk7CisKKwlDUllQVE9fRVhfREFUQSBleF9kYXRhOworCWludCByZWZlcmVuY2VzOworCX0gLyogWDUwOV9TVE9SRSAqLzsKKworaW50IFg1MDlfU1RPUkVfc2V0X2RlcHRoKFg1MDlfU1RPUkUgKnN0b3JlLCBpbnQgZGVwdGgpOworCisjZGVmaW5lIFg1MDlfU1RPUkVfc2V0X3ZlcmlmeV9jYl9mdW5jKGN0eCxmdW5jKSAoKGN0eCktPnZlcmlmeV9jYj0oZnVuYykpCisjZGVmaW5lIFg1MDlfU1RPUkVfc2V0X3ZlcmlmeV9mdW5jKGN0eCxmdW5jKQkoKGN0eCktPnZlcmlmeT0oZnVuYykpCisKKy8qIFRoaXMgaXMgdGhlIGZ1bmN0aW9ucyBwbHVzIGFuIGluc3RhbmNlIG9mIHRoZSBsb2NhbCB2YXJpYWJsZXMuICovCitzdHJ1Y3QgeDUwOV9sb29rdXBfc3QKKwl7CisJaW50IGluaXQ7CQkJLyogaGF2ZSB3ZSBiZWVuIHN0YXJ0ZWQgKi8KKwlpbnQgc2tpcDsJCQkvKiBkb24ndCB1c2UgdXMuICovCisJWDUwOV9MT09LVVBfTUVUSE9EICptZXRob2Q7CS8qIHRoZSBmdW5jdGlvbnMgKi8KKwljaGFyICptZXRob2RfZGF0YTsJCS8qIG1ldGhvZCBkYXRhICovCisKKwlYNTA5X1NUT1JFICpzdG9yZV9jdHg7CS8qIHdobyBvd25zIHVzICovCisJfSAvKiBYNTA5X0xPT0tVUCAqLzsKKworLyogVGhpcyBpcyBhIHVzZWQgd2hlbiB2ZXJpZnlpbmcgY2VydCBjaGFpbnMuICBTaW5jZSB0aGUKKyAqIGdhdGhlcmluZyBvZiB0aGUgY2VydCBjaGFpbiBjYW4gdGFrZSBzb21lIHRpbWUgKGFuZCBoYXZlIHRvIGJlCisgKiAncmV0cmllZCcsIHRoaXMgbmVlZHMgdG8gYmUga2VwdCBhbmQgcGFzc2VkIGFyb3VuZC4gKi8KK3N0cnVjdCB4NTA5X3N0b3JlX2N0eF9zdCAgICAgIC8qIFg1MDlfU1RPUkVfQ1RYICovCisJeworCVg1MDlfU1RPUkUgKmN0eDsKKwlpbnQgY3VycmVudF9tZXRob2Q7CS8qIHVzZWQgd2hlbiBsb29raW5nIHVwIGNlcnRzICovCisKKwkvKiBUaGUgZm9sbG93aW5nIGFyZSBzZXQgYnkgdGhlIGNhbGxlciAqLworCVg1MDkgKmNlcnQ7CQkvKiBUaGUgY2VydCB0byBjaGVjayAqLworCVNUQUNLX09GKFg1MDkpICp1bnRydXN0ZWQ7CS8qIGNoYWluIG9mIFg1MDlzIC0gdW50cnVzdGVkIC0gcGFzc2VkIGluICovCisJU1RBQ0tfT0YoWDUwOV9DUkwpICpjcmxzOwkvKiBzZXQgb2YgQ1JMcyBwYXNzZWQgaW4gKi8KKworCVg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbTsKKwl2b2lkICpvdGhlcl9jdHg7CS8qIE90aGVyIGluZm8gZm9yIHVzZSB3aXRoIGdldF9pc3N1ZXIoKSAqLworCisJLyogQ2FsbGJhY2tzIGZvciB2YXJpb3VzIG9wZXJhdGlvbnMgKi8KKwlpbnQgKCp2ZXJpZnkpKFg1MDlfU1RPUkVfQ1RYICpjdHgpOwkvKiBjYWxsZWQgdG8gdmVyaWZ5IGEgY2VydGlmaWNhdGUgKi8KKwlpbnQgKCp2ZXJpZnlfY2IpKGludCBvayxYNTA5X1NUT1JFX0NUWCAqY3R4KTsJCS8qIGVycm9yIGNhbGxiYWNrICovCisJaW50ICgqZ2V0X2lzc3VlcikoWDUwOSAqKmlzc3VlciwgWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOSAqeCk7CS8qIGdldCBpc3N1ZXJzIGNlcnQgZnJvbSBjdHggKi8KKwlpbnQgKCpjaGVja19pc3N1ZWQpKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDkgKngsIFg1MDkgKmlzc3Vlcik7IC8qIGNoZWNrIGlzc3VlZCAqLworCWludCAoKmNoZWNrX3Jldm9jYXRpb24pKFg1MDlfU1RPUkVfQ1RYICpjdHgpOyAvKiBDaGVjayByZXZvY2F0aW9uIHN0YXR1cyBvZiBjaGFpbiAqLworCWludCAoKmdldF9jcmwpKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDlfQ1JMICoqY3JsLCBYNTA5ICp4KTsgLyogcmV0cmlldmUgQ1JMICovCisJaW50ICgqY2hlY2tfY3JsKShYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5X0NSTCAqY3JsKTsgLyogQ2hlY2sgQ1JMIHZhbGlkaXR5ICovCisJaW50ICgqY2VydF9jcmwpKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDlfQ1JMICpjcmwsIFg1MDkgKngpOyAvKiBDaGVjayBjZXJ0aWZpY2F0ZSBhZ2FpbnN0IENSTCAqLworCWludCAoKmNoZWNrX3BvbGljeSkoWDUwOV9TVE9SRV9DVFggKmN0eCk7CisJU1RBQ0tfT0YoWDUwOSkgKiAoKmxvb2t1cF9jZXJ0cykoWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOV9OQU1FICpubSk7CisJU1RBQ0tfT0YoWDUwOV9DUkwpICogKCpsb29rdXBfY3JscykoWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOV9OQU1FICpubSk7CisJaW50ICgqY2xlYW51cCkoWDUwOV9TVE9SRV9DVFggKmN0eCk7CisKKwkvKiBUaGUgZm9sbG93aW5nIGlzIGJ1aWx0IHVwICovCisJaW50IHZhbGlkOwkJLyogaWYgMCwgcmVidWlsZCBjaGFpbiAqLworCWludCBsYXN0X3VudHJ1c3RlZDsJLyogaW5kZXggb2YgbGFzdCB1bnRydXN0ZWQgY2VydCAqLworCVNUQUNLX09GKFg1MDkpICpjaGFpbjsgCQkvKiBjaGFpbiBvZiBYNTA5cyAtIGJ1aWx0IHVwIGFuZCB0cnVzdGVkICovCisJWDUwOV9QT0xJQ1lfVFJFRSAqdHJlZTsJLyogVmFsaWQgcG9saWN5IHRyZWUgKi8KKworCWludCBleHBsaWNpdF9wb2xpY3k7CS8qIFJlcXVpcmUgZXhwbGljaXQgcG9saWN5IHZhbHVlICovCisKKwkvKiBXaGVuIHNvbWV0aGluZyBnb2VzIHdyb25nLCB0aGlzIGlzIHdoeSAqLworCWludCBlcnJvcl9kZXB0aDsKKwlpbnQgZXJyb3I7CisJWDUwOSAqY3VycmVudF9jZXJ0OworCVg1MDkgKmN1cnJlbnRfaXNzdWVyOwkvKiBjZXJ0IGN1cnJlbnRseSBiZWluZyB0ZXN0ZWQgYXMgdmFsaWQgaXNzdWVyICovCisJWDUwOV9DUkwgKmN1cnJlbnRfY3JsOwkvKiBjdXJyZW50IENSTCAqLworCisJaW50IGN1cnJlbnRfY3JsX3Njb3JlOyAgLyogc2NvcmUgb2YgY3VycmVudCBDUkwgKi8KKwl1bnNpZ25lZCBpbnQgY3VycmVudF9yZWFzb25zOyAgLyogUmVhc29uIG1hc2sgKi8KKworCVg1MDlfU1RPUkVfQ1RYICpwYXJlbnQ7IC8qIEZvciBDUkwgcGF0aCB2YWxpZGF0aW9uOiBwYXJlbnQgY29udGV4dCAqLworCisJQ1JZUFRPX0VYX0RBVEEgZXhfZGF0YTsKKwl9IC8qIFg1MDlfU1RPUkVfQ1RYICovOworCit2b2lkIFg1MDlfU1RPUkVfQ1RYX3NldF9kZXB0aChYNTA5X1NUT1JFX0NUWCAqY3R4LCBpbnQgZGVwdGgpOworCisjZGVmaW5lIFg1MDlfU1RPUkVfQ1RYX3NldF9hcHBfZGF0YShjdHgsZGF0YSkgXAorCVg1MDlfU1RPUkVfQ1RYX3NldF9leF9kYXRhKGN0eCwwLGRhdGEpCisjZGVmaW5lIFg1MDlfU1RPUkVfQ1RYX2dldF9hcHBfZGF0YShjdHgpIFwKKwlYNTA5X1NUT1JFX0NUWF9nZXRfZXhfZGF0YShjdHgsMCkKKworI2RlZmluZSBYNTA5X0xfRklMRV9MT0FECTEKKyNkZWZpbmUgWDUwOV9MX0FERF9ESVIJCTIKKworI2RlZmluZSBYNTA5X0xPT0tVUF9sb2FkX2ZpbGUoeCxuYW1lLHR5cGUpIFwKKwkJWDUwOV9MT09LVVBfY3RybCgoeCksWDUwOV9MX0ZJTEVfTE9BRCwobmFtZSksKGxvbmcpKHR5cGUpLE5VTEwpCisKKyNkZWZpbmUgWDUwOV9MT09LVVBfYWRkX2Rpcih4LG5hbWUsdHlwZSkgXAorCQlYNTA5X0xPT0tVUF9jdHJsKCh4KSxYNTA5X0xfQUREX0RJUiwobmFtZSksKGxvbmcpKHR5cGUpLE5VTEwpCisKKyNkZWZpbmUJCVg1MDlfVl9PSwkJCQkJMAorLyogaWxsZWdhbCBlcnJvciAoZm9yIHVuaW5pdGlhbGl6ZWQgdmFsdWVzLCB0byBhdm9pZCBYNTA5X1ZfT0spOiAxICovCisKKyNkZWZpbmUJCVg1MDlfVl9FUlJfVU5BQkxFX1RPX0dFVF9JU1NVRVJfQ0VSVAkJMgorI2RlZmluZQkJWDUwOV9WX0VSUl9VTkFCTEVfVE9fR0VUX0NSTAkJCTMKKyNkZWZpbmUJCVg1MDlfVl9FUlJfVU5BQkxFX1RPX0RFQ1JZUFRfQ0VSVF9TSUdOQVRVUkUJNAorI2RlZmluZQkJWDUwOV9WX0VSUl9VTkFCTEVfVE9fREVDUllQVF9DUkxfU0lHTkFUVVJFCTUKKyNkZWZpbmUJCVg1MDlfVl9FUlJfVU5BQkxFX1RPX0RFQ09ERV9JU1NVRVJfUFVCTElDX0tFWQk2CisjZGVmaW5lCQlYNTA5X1ZfRVJSX0NFUlRfU0lHTkFUVVJFX0ZBSUxVUkUJCTcKKyNkZWZpbmUJCVg1MDlfVl9FUlJfQ1JMX1NJR05BVFVSRV9GQUlMVVJFCQk4CisjZGVmaW5lCQlYNTA5X1ZfRVJSX0NFUlRfTk9UX1lFVF9WQUxJRAkJCTkKKyNkZWZpbmUJCVg1MDlfVl9FUlJfQ0VSVF9IQVNfRVhQSVJFRAkJCTEwCisjZGVmaW5lCQlYNTA5X1ZfRVJSX0NSTF9OT1RfWUVUX1ZBTElECQkJMTEKKyNkZWZpbmUJCVg1MDlfVl9FUlJfQ1JMX0hBU19FWFBJUkVECQkJMTIKKyNkZWZpbmUJCVg1MDlfVl9FUlJfRVJST1JfSU5fQ0VSVF9OT1RfQkVGT1JFX0ZJRUxECTEzCisjZGVmaW5lCQlYNTA5X1ZfRVJSX0VSUk9SX0lOX0NFUlRfTk9UX0FGVEVSX0ZJRUxECTE0CisjZGVmaW5lCQlYNTA5X1ZfRVJSX0VSUk9SX0lOX0NSTF9MQVNUX1VQREFURV9GSUVMRAkxNQorI2RlZmluZQkJWDUwOV9WX0VSUl9FUlJPUl9JTl9DUkxfTkVYVF9VUERBVEVfRklFTEQJMTYKKyNkZWZpbmUJCVg1MDlfVl9FUlJfT1VUX09GX01FTQkJCQkxNworI2RlZmluZQkJWDUwOV9WX0VSUl9ERVBUSF9aRVJPX1NFTEZfU0lHTkVEX0NFUlQJCTE4CisjZGVmaW5lCQlYNTA5X1ZfRVJSX1NFTEZfU0lHTkVEX0NFUlRfSU5fQ0hBSU4JCTE5CisjZGVmaW5lCQlYNTA5X1ZfRVJSX1VOQUJMRV9UT19HRVRfSVNTVUVSX0NFUlRfTE9DQUxMWQkyMAorI2RlZmluZQkJWDUwOV9WX0VSUl9VTkFCTEVfVE9fVkVSSUZZX0xFQUZfU0lHTkFUVVJFCTIxCisjZGVmaW5lCQlYNTA5X1ZfRVJSX0NFUlRfQ0hBSU5fVE9PX0xPTkcJCQkyMgorI2RlZmluZQkJWDUwOV9WX0VSUl9DRVJUX1JFVk9LRUQJCQkJMjMKKyNkZWZpbmUJCVg1MDlfVl9FUlJfSU5WQUxJRF9DQQkJCQkyNAorI2RlZmluZQkJWDUwOV9WX0VSUl9QQVRIX0xFTkdUSF9FWENFRURFRAkJCTI1CisjZGVmaW5lCQlYNTA5X1ZfRVJSX0lOVkFMSURfUFVSUE9TRQkJCTI2CisjZGVmaW5lCQlYNTA5X1ZfRVJSX0NFUlRfVU5UUlVTVEVECQkJMjcKKyNkZWZpbmUJCVg1MDlfVl9FUlJfQ0VSVF9SRUpFQ1RFRAkJCTI4CisvKiBUaGVzZSBhcmUgJ2luZm9ybWF0aW9uYWwnIHdoZW4gbG9va2luZyBmb3IgaXNzdWVyIGNlcnQgKi8KKyNkZWZpbmUJCVg1MDlfVl9FUlJfU1VCSkVDVF9JU1NVRVJfTUlTTUFUQ0gJCTI5CisjZGVmaW5lCQlYNTA5X1ZfRVJSX0FLSURfU0tJRF9NSVNNQVRDSAkJCTMwCisjZGVmaW5lCQlYNTA5X1ZfRVJSX0FLSURfSVNTVUVSX1NFUklBTF9NSVNNQVRDSAkJMzEKKyNkZWZpbmUJCVg1MDlfVl9FUlJfS0VZVVNBR0VfTk9fQ0VSVFNJR04JCQkzMgorCisjZGVmaW5lCQlYNTA5X1ZfRVJSX1VOQUJMRV9UT19HRVRfQ1JMX0lTU1VFUgkJMzMKKyNkZWZpbmUJCVg1MDlfVl9FUlJfVU5IQU5ETEVEX0NSSVRJQ0FMX0VYVEVOU0lPTgkJMzQKKyNkZWZpbmUJCVg1MDlfVl9FUlJfS0VZVVNBR0VfTk9fQ1JMX1NJR04JCQkzNQorI2RlZmluZQkJWDUwOV9WX0VSUl9VTkhBTkRMRURfQ1JJVElDQUxfQ1JMX0VYVEVOU0lPTgkzNgorI2RlZmluZQkJWDUwOV9WX0VSUl9JTlZBTElEX05PTl9DQQkJCTM3CisjZGVmaW5lCQlYNTA5X1ZfRVJSX1BST1hZX1BBVEhfTEVOR1RIX0VYQ0VFREVECQkzOAorI2RlZmluZQkJWDUwOV9WX0VSUl9LRVlVU0FHRV9OT19ESUdJVEFMX1NJR05BVFVSRQkzOQorI2RlZmluZQkJWDUwOV9WX0VSUl9QUk9YWV9DRVJUSUZJQ0FURVNfTk9UX0FMTE9XRUQJNDAKKworI2RlZmluZQkJWDUwOV9WX0VSUl9JTlZBTElEX0VYVEVOU0lPTgkJCTQxCisjZGVmaW5lCQlYNTA5X1ZfRVJSX0lOVkFMSURfUE9MSUNZX0VYVEVOU0lPTgkJNDIKKyNkZWZpbmUJCVg1MDlfVl9FUlJfTk9fRVhQTElDSVRfUE9MSUNZCQkJNDMKKyNkZWZpbmUJCVg1MDlfVl9FUlJfRElGRkVSRU5UX0NSTF9TQ09QRQkJCTQ0CisjZGVmaW5lCQlYNTA5X1ZfRVJSX1VOU1VQUE9SVEVEX0VYVEVOU0lPTl9GRUFUVVJFCTQ1CisKKyNkZWZpbmUJCVg1MDlfVl9FUlJfVU5ORVNURURfUkVTT1VSQ0UJCQk0NgorCisjZGVmaW5lCQlYNTA5X1ZfRVJSX1BFUk1JVFRFRF9WSU9MQVRJT04JCQk0NworI2RlZmluZQkJWDUwOV9WX0VSUl9FWENMVURFRF9WSU9MQVRJT04JCQk0OAorI2RlZmluZQkJWDUwOV9WX0VSUl9TVUJUUkVFX01JTk1BWAkJCTQ5CisjZGVmaW5lCQlYNTA5X1ZfRVJSX1VOU1VQUE9SVEVEX0NPTlNUUkFJTlRfVFlQRQkJNTEKKyNkZWZpbmUJCVg1MDlfVl9FUlJfVU5TVVBQT1JURURfQ09OU1RSQUlOVF9TWU5UQVgJNTIKKyNkZWZpbmUJCVg1MDlfVl9FUlJfVU5TVVBQT1JURURfTkFNRV9TWU5UQVgJCTUzCisjZGVmaW5lCQlYNTA5X1ZfRVJSX0NSTF9QQVRIX1ZBTElEQVRJT05fRVJST1IJCTU0CisKKy8qIFN1aXRlIEIgbW9kZSBhbGdvcml0aG0gdmlvbGF0aW9uICovCisjZGVmaW5lCQlYNTA5X1ZfRVJSX1NVSVRFX0JfSU5WQUxJRF9WRVJTSU9OCQk1NgorI2RlZmluZQkJWDUwOV9WX0VSUl9TVUlURV9CX0lOVkFMSURfQUxHT1JJVEhNCQk1NworI2RlZmluZQkJWDUwOV9WX0VSUl9TVUlURV9CX0lOVkFMSURfQ1VSVkUJCTU4CisjZGVmaW5lCQlYNTA5X1ZfRVJSX1NVSVRFX0JfSU5WQUxJRF9TSUdOQVRVUkVfQUxHT1JJVEhNCTU5CisjZGVmaW5lCQlYNTA5X1ZfRVJSX1NVSVRFX0JfTE9TX05PVF9BTExPV0VECQk2MAorI2RlZmluZQkJWDUwOV9WX0VSUl9TVUlURV9CX0NBTk5PVF9TSUdOX1BfMzg0X1dJVEhfUF8yNTYJNjEKKworLyogSG9zdCwgZW1haWwgYW5kIElQIGNoZWNrIGVycm9ycyAqLworI2RlZmluZQkJWDUwOV9WX0VSUl9IT1NUTkFNRV9NSVNNQVRDSAkJCTYyCisjZGVmaW5lCQlYNTA5X1ZfRVJSX0VNQUlMX01JU01BVENICQkJNjMKKyNkZWZpbmUJCVg1MDlfVl9FUlJfSVBfQUREUkVTU19NSVNNQVRDSAkJCTY0CisKKy8qIFRoZSBhcHBsaWNhdGlvbiBpcyBub3QgaGFwcHkgKi8KKyNkZWZpbmUJCVg1MDlfVl9FUlJfQVBQTElDQVRJT05fVkVSSUZJQ0FUSU9OCQk1MAorCisvKiBDZXJ0aWZpY2F0ZSB2ZXJpZnkgZmxhZ3MgKi8KKworLyogU2VuZCBpc3N1ZXIrc3ViamVjdCBjaGVja3MgdG8gdmVyaWZ5X2NiICovCisjZGVmaW5lCVg1MDlfVl9GTEFHX0NCX0lTU1VFUl9DSEVDSwkJMHgxCisvKiBVc2UgY2hlY2sgdGltZSBpbnN0ZWFkIG9mIGN1cnJlbnQgdGltZSAqLworI2RlZmluZQlYNTA5X1ZfRkxBR19VU0VfQ0hFQ0tfVElNRQkJMHgyCisvKiBMb29rdXAgQ1JMcyAqLworI2RlZmluZQlYNTA5X1ZfRkxBR19DUkxfQ0hFQ0sJCQkweDQKKy8qIExvb2t1cCBDUkxzIGZvciB3aG9sZSBjaGFpbiAqLworI2RlZmluZQlYNTA5X1ZfRkxBR19DUkxfQ0hFQ0tfQUxMCQkweDgKKy8qIElnbm9yZSB1bmhhbmRsZWQgY3JpdGljYWwgZXh0ZW5zaW9ucyAqLworI2RlZmluZQlYNTA5X1ZfRkxBR19JR05PUkVfQ1JJVElDQUwJCTB4MTAKKy8qIERpc2FibGUgd29ya2Fyb3VuZHMgZm9yIGJyb2tlbiBjZXJ0aWZpY2F0ZXMgKi8KKyNkZWZpbmUJWDUwOV9WX0ZMQUdfWDUwOV9TVFJJQ1QJCQkweDIwCisvKiBFbmFibGUgcHJveHkgY2VydGlmaWNhdGUgdmFsaWRhdGlvbiAqLworI2RlZmluZQlYNTA5X1ZfRkxBR19BTExPV19QUk9YWV9DRVJUUwkJMHg0MAorLyogRW5hYmxlIHBvbGljeSBjaGVja2luZyAqLworI2RlZmluZSBYNTA5X1ZfRkxBR19QT0xJQ1lfQ0hFQ0sJCTB4ODAKKy8qIFBvbGljeSB2YXJpYWJsZSByZXF1aXJlLWV4cGxpY2l0LXBvbGljeSAqLworI2RlZmluZSBYNTA5X1ZfRkxBR19FWFBMSUNJVF9QT0xJQ1kJCTB4MTAwCisvKiBQb2xpY3kgdmFyaWFibGUgaW5oaWJpdC1hbnktcG9saWN5ICovCisjZGVmaW5lCVg1MDlfVl9GTEFHX0lOSElCSVRfQU5ZCQkJMHgyMDAKKy8qIFBvbGljeSB2YXJpYWJsZSBpbmhpYml0LXBvbGljeS1tYXBwaW5nICovCisjZGVmaW5lIFg1MDlfVl9GTEFHX0lOSElCSVRfTUFQCQkJMHg0MDAKKy8qIE5vdGlmeSBjYWxsYmFjayB0aGF0IHBvbGljeSBpcyBPSyAqLworI2RlZmluZSBYNTA5X1ZfRkxBR19OT1RJRllfUE9MSUNZCQkweDgwMAorLyogRXh0ZW5kZWQgQ1JMIGZlYXR1cmVzIHN1Y2ggYXMgaW5kaXJlY3QgQ1JMcywgYWx0ZXJuYXRlIENSTCBzaWduaW5nIGtleXMgKi8KKyNkZWZpbmUgWDUwOV9WX0ZMQUdfRVhURU5ERURfQ1JMX1NVUFBPUlQJMHgxMDAwCisvKiBEZWx0YSBDUkwgc3VwcG9ydCAqLworI2RlZmluZSBYNTA5X1ZfRkxBR19VU0VfREVMVEFTCQkJMHgyMDAwCisvKiBDaGVjayBzZWxmc2lnbmVkIENBIHNpZ25hdHVyZSAqLworI2RlZmluZSBYNTA5X1ZfRkxBR19DSEVDS19TU19TSUdOQVRVUkUJCTB4NDAwMAorLyogVXNlIHRydXN0ZWQgc3RvcmUgZmlyc3QgKi8KKyNkZWZpbmUgWDUwOV9WX0ZMQUdfVFJVU1RFRF9GSVJTVAkJMHg4MDAwCisvKiBTdWl0ZSBCIDEyOCBiaXQgb25seSBtb2RlOiBub3Qgbm9ybWFsbHkgdXNlZCAqLworI2RlZmluZSBYNTA5X1ZfRkxBR19TVUlURUJfMTI4X0xPU19PTkxZCQkweDEwMDAwCisvKiBTdWl0ZSBCIDE5MiBiaXQgb25seSBtb2RlICovCisjZGVmaW5lIFg1MDlfVl9GTEFHX1NVSVRFQl8xOTJfTE9TCQkweDIwMDAwCisvKiBTdWl0ZSBCIDEyOCBiaXQgbW9kZSBhbGxvd2luZyAxOTIgYml0IGFsZ29yaXRobXMgKi8KKyNkZWZpbmUgWDUwOV9WX0ZMQUdfU1VJVEVCXzEyOF9MT1MJCTB4MzAwMDAKKworLyogQWxsb3cgcGFydGlhbCBjaGFpbnMgaWYgYXQgbGVhc3Qgb25lIGNlcnRpZmljYXRlIGlzIGluIHRydXN0ZWQgc3RvcmUgKi8KKyNkZWZpbmUgWDUwOV9WX0ZMQUdfUEFSVElBTF9DSEFJTgkJMHg4MDAwMAorCisjZGVmaW5lIFg1MDlfVlBfRkxBR19ERUZBVUxUCQkJMHgxCisjZGVmaW5lIFg1MDlfVlBfRkxBR19PVkVSV1JJVEUJCQkweDIKKyNkZWZpbmUgWDUwOV9WUF9GTEFHX1JFU0VUX0ZMQUdTCQkweDQKKyNkZWZpbmUgWDUwOV9WUF9GTEFHX0xPQ0tFRAkJCTB4OAorI2RlZmluZSBYNTA5X1ZQX0ZMQUdfT05DRQkJCTB4MTAKKworLyogSW50ZXJuYWwgdXNlOiBtYXNrIG9mIHBvbGljeSByZWxhdGVkIG9wdGlvbnMgKi8KKyNkZWZpbmUgWDUwOV9WX0ZMQUdfUE9MSUNZX01BU0sgKFg1MDlfVl9GTEFHX1BPTElDWV9DSEVDSyBcCisJCQkJfCBYNTA5X1ZfRkxBR19FWFBMSUNJVF9QT0xJQ1kgXAorCQkJCXwgWDUwOV9WX0ZMQUdfSU5ISUJJVF9BTlkgXAorCQkJCXwgWDUwOV9WX0ZMQUdfSU5ISUJJVF9NQVApCisKK2ludCBYNTA5X09CSkVDVF9pZHhfYnlfc3ViamVjdChTVEFDS19PRihYNTA5X09CSkVDVCkgKmgsIGludCB0eXBlLAorCSAgICAgWDUwOV9OQU1FICpuYW1lKTsKK1g1MDlfT0JKRUNUICpYNTA5X09CSkVDVF9yZXRyaWV2ZV9ieV9zdWJqZWN0KFNUQUNLX09GKFg1MDlfT0JKRUNUKSAqaCxpbnQgdHlwZSxYNTA5X05BTUUgKm5hbWUpOworWDUwOV9PQkpFQ1QgKlg1MDlfT0JKRUNUX3JldHJpZXZlX21hdGNoKFNUQUNLX09GKFg1MDlfT0JKRUNUKSAqaCwgWDUwOV9PQkpFQ1QgKngpOwordm9pZCBYNTA5X09CSkVDVF91cF9yZWZfY291bnQoWDUwOV9PQkpFQ1QgKmEpOwordm9pZCBYNTA5X09CSkVDVF9mcmVlX2NvbnRlbnRzKFg1MDlfT0JKRUNUICphKTsKK1g1MDlfU1RPUkUgKlg1MDlfU1RPUkVfbmV3KHZvaWQgKTsKK3ZvaWQgWDUwOV9TVE9SRV9mcmVlKFg1MDlfU1RPUkUgKnYpOworCitTVEFDS19PRihYNTA5KSogWDUwOV9TVE9SRV9nZXQxX2NlcnRzKFg1MDlfU1RPUkVfQ1RYICpzdCwgWDUwOV9OQU1FICpubSk7CitTVEFDS19PRihYNTA5X0NSTCkqIFg1MDlfU1RPUkVfZ2V0MV9jcmxzKFg1MDlfU1RPUkVfQ1RYICpzdCwgWDUwOV9OQU1FICpubSk7CitpbnQgWDUwOV9TVE9SRV9zZXRfZmxhZ3MoWDUwOV9TVE9SRSAqY3R4LCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2ludCBYNTA5X1NUT1JFX3NldF9wdXJwb3NlKFg1MDlfU1RPUkUgKmN0eCwgaW50IHB1cnBvc2UpOworaW50IFg1MDlfU1RPUkVfc2V0X3RydXN0KFg1MDlfU1RPUkUgKmN0eCwgaW50IHRydXN0KTsKK2ludCBYNTA5X1NUT1JFX3NldDFfcGFyYW0oWDUwOV9TVE9SRSAqY3R4LCBYNTA5X1ZFUklGWV9QQVJBTSAqcG0pOworCit2b2lkIFg1MDlfU1RPUkVfc2V0X3ZlcmlmeV9jYihYNTA5X1NUT1JFICpjdHgsCisJCQkJICBpbnQgKCp2ZXJpZnlfY2IpKGludCwgWDUwOV9TVE9SRV9DVFggKikpOworCit2b2lkIFg1MDlfU1RPUkVfc2V0X2xvb2t1cF9jcmxzX2NiKFg1MDlfU1RPUkUgKmN0eCwKKwkJU1RBQ0tfT0YoWDUwOV9DUkwpKiAoKmNiKShYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5X05BTUUgKm5tKSk7CisKK1g1MDlfU1RPUkVfQ1RYICpYNTA5X1NUT1JFX0NUWF9uZXcodm9pZCk7CisKK2ludCBYNTA5X1NUT1JFX0NUWF9nZXQxX2lzc3VlcihYNTA5ICoqaXNzdWVyLCBYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5ICp4KTsKKwordm9pZCBYNTA5X1NUT1JFX0NUWF9mcmVlKFg1MDlfU1RPUkVfQ1RYICpjdHgpOworaW50IFg1MDlfU1RPUkVfQ1RYX2luaXQoWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOV9TVE9SRSAqc3RvcmUsCisJCQkgWDUwOSAqeDUwOSwgU1RBQ0tfT0YoWDUwOSkgKmNoYWluKTsKK3ZvaWQgWDUwOV9TVE9SRV9DVFhfdHJ1c3RlZF9zdGFjayhYNTA5X1NUT1JFX0NUWCAqY3R4LCBTVEFDS19PRihYNTA5KSAqc2spOwordm9pZCBYNTA5X1NUT1JFX0NUWF9jbGVhbnVwKFg1MDlfU1RPUkVfQ1RYICpjdHgpOworCitYNTA5X1NUT1JFICpYNTA5X1NUT1JFX0NUWF9nZXQwX3N0b3JlKFg1MDlfU1RPUkVfQ1RYICpjdHgpOworCitYNTA5X0xPT0tVUCAqWDUwOV9TVE9SRV9hZGRfbG9va3VwKFg1MDlfU1RPUkUgKnYsIFg1MDlfTE9PS1VQX01FVEhPRCAqbSk7CisKK1g1MDlfTE9PS1VQX01FVEhPRCAqWDUwOV9MT09LVVBfaGFzaF9kaXIodm9pZCk7CitYNTA5X0xPT0tVUF9NRVRIT0QgKlg1MDlfTE9PS1VQX2ZpbGUodm9pZCk7CisKK2ludCBYNTA5X1NUT1JFX2FkZF9jZXJ0KFg1MDlfU1RPUkUgKmN0eCwgWDUwOSAqeCk7CitpbnQgWDUwOV9TVE9SRV9hZGRfY3JsKFg1MDlfU1RPUkUgKmN0eCwgWDUwOV9DUkwgKngpOworCitpbnQgWDUwOV9TVE9SRV9nZXRfYnlfc3ViamVjdChYNTA5X1NUT1JFX0NUWCAqdnMsaW50IHR5cGUsWDUwOV9OQU1FICpuYW1lLAorCVg1MDlfT0JKRUNUICpyZXQpOworCitpbnQgWDUwOV9MT09LVVBfY3RybChYNTA5X0xPT0tVUCAqY3R4LCBpbnQgY21kLCBjb25zdCBjaGFyICphcmdjLAorCWxvbmcgYXJnbCwgY2hhciAqKnJldCk7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19TVERJTworaW50IFg1MDlfbG9hZF9jZXJ0X2ZpbGUoWDUwOV9MT09LVVAgKmN0eCwgY29uc3QgY2hhciAqZmlsZSwgaW50IHR5cGUpOworaW50IFg1MDlfbG9hZF9jcmxfZmlsZShYNTA5X0xPT0tVUCAqY3R4LCBjb25zdCBjaGFyICpmaWxlLCBpbnQgdHlwZSk7CitpbnQgWDUwOV9sb2FkX2NlcnRfY3JsX2ZpbGUoWDUwOV9MT09LVVAgKmN0eCwgY29uc3QgY2hhciAqZmlsZSwgaW50IHR5cGUpOworI2VuZGlmCisKKworWDUwOV9MT09LVVAgKlg1MDlfTE9PS1VQX25ldyhYNTA5X0xPT0tVUF9NRVRIT0QgKm1ldGhvZCk7Cit2b2lkIFg1MDlfTE9PS1VQX2ZyZWUoWDUwOV9MT09LVVAgKmN0eCk7CitpbnQgWDUwOV9MT09LVVBfaW5pdChYNTA5X0xPT0tVUCAqY3R4KTsKK2ludCBYNTA5X0xPT0tVUF9ieV9zdWJqZWN0KFg1MDlfTE9PS1VQICpjdHgsIGludCB0eXBlLCBYNTA5X05BTUUgKm5hbWUsCisJWDUwOV9PQkpFQ1QgKnJldCk7CitpbnQgWDUwOV9MT09LVVBfYnlfaXNzdWVyX3NlcmlhbChYNTA5X0xPT0tVUCAqY3R4LCBpbnQgdHlwZSwgWDUwOV9OQU1FICpuYW1lLAorCUFTTjFfSU5URUdFUiAqc2VyaWFsLCBYNTA5X09CSkVDVCAqcmV0KTsKK2ludCBYNTA5X0xPT0tVUF9ieV9maW5nZXJwcmludChYNTA5X0xPT0tVUCAqY3R4LCBpbnQgdHlwZSwKKwl1bnNpZ25lZCBjaGFyICpieXRlcywgaW50IGxlbiwgWDUwOV9PQkpFQ1QgKnJldCk7CitpbnQgWDUwOV9MT09LVVBfYnlfYWxpYXMoWDUwOV9MT09LVVAgKmN0eCwgaW50IHR5cGUsIGNoYXIgKnN0ciwKKwlpbnQgbGVuLCBYNTA5X09CSkVDVCAqcmV0KTsKK2ludCBYNTA5X0xPT0tVUF9zaHV0ZG93bihYNTA5X0xPT0tVUCAqY3R4KTsKKworI2lmbmRlZiBPUEVOU1NMX05PX1NURElPCitpbnQJWDUwOV9TVE9SRV9sb2FkX2xvY2F0aW9ucyAoWDUwOV9TVE9SRSAqY3R4LAorCQljb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICpkaXIpOworaW50CVg1MDlfU1RPUkVfc2V0X2RlZmF1bHRfcGF0aHMoWDUwOV9TVE9SRSAqY3R4KTsKKyNlbmRpZgorCitpbnQgWDUwOV9TVE9SRV9DVFhfZ2V0X2V4X25ld19pbmRleChsb25nIGFyZ2wsIHZvaWQgKmFyZ3AsIENSWVBUT19FWF9uZXcgKm5ld19mdW5jLAorCUNSWVBUT19FWF9kdXAgKmR1cF9mdW5jLCBDUllQVE9fRVhfZnJlZSAqZnJlZV9mdW5jKTsKK2ludAlYNTA5X1NUT1JFX0NUWF9zZXRfZXhfZGF0YShYNTA5X1NUT1JFX0NUWCAqY3R4LGludCBpZHgsdm9pZCAqZGF0YSk7Cit2b2lkICoJWDUwOV9TVE9SRV9DVFhfZ2V0X2V4X2RhdGEoWDUwOV9TVE9SRV9DVFggKmN0eCxpbnQgaWR4KTsKK2ludAlYNTA5X1NUT1JFX0NUWF9nZXRfZXJyb3IoWDUwOV9TVE9SRV9DVFggKmN0eCk7Cit2b2lkCVg1MDlfU1RPUkVfQ1RYX3NldF9lcnJvcihYNTA5X1NUT1JFX0NUWCAqY3R4LGludCBzKTsKK2ludAlYNTA5X1NUT1JFX0NUWF9nZXRfZXJyb3JfZGVwdGgoWDUwOV9TVE9SRV9DVFggKmN0eCk7CitYNTA5ICoJWDUwOV9TVE9SRV9DVFhfZ2V0X2N1cnJlbnRfY2VydChYNTA5X1NUT1JFX0NUWCAqY3R4KTsKK1g1MDkgKlg1MDlfU1RPUkVfQ1RYX2dldDBfY3VycmVudF9pc3N1ZXIoWDUwOV9TVE9SRV9DVFggKmN0eCk7CitYNTA5X0NSTCAqWDUwOV9TVE9SRV9DVFhfZ2V0MF9jdXJyZW50X2NybChYNTA5X1NUT1JFX0NUWCAqY3R4KTsKK1g1MDlfU1RPUkVfQ1RYICpYNTA5X1NUT1JFX0NUWF9nZXQwX3BhcmVudF9jdHgoWDUwOV9TVE9SRV9DVFggKmN0eCk7CitTVEFDS19PRihYNTA5KSAqWDUwOV9TVE9SRV9DVFhfZ2V0X2NoYWluKFg1MDlfU1RPUkVfQ1RYICpjdHgpOworU1RBQ0tfT0YoWDUwOSkgKlg1MDlfU1RPUkVfQ1RYX2dldDFfY2hhaW4oWDUwOV9TVE9SRV9DVFggKmN0eCk7Cit2b2lkCVg1MDlfU1RPUkVfQ1RYX3NldF9jZXJ0KFg1MDlfU1RPUkVfQ1RYICpjLFg1MDkgKngpOwordm9pZAlYNTA5X1NUT1JFX0NUWF9zZXRfY2hhaW4oWDUwOV9TVE9SRV9DVFggKmMsU1RBQ0tfT0YoWDUwOSkgKnNrKTsKK3ZvaWQJWDUwOV9TVE9SRV9DVFhfc2V0MF9jcmxzKFg1MDlfU1RPUkVfQ1RYICpjLFNUQUNLX09GKFg1MDlfQ1JMKSAqc2spOworaW50IFg1MDlfU1RPUkVfQ1RYX3NldF9wdXJwb3NlKFg1MDlfU1RPUkVfQ1RYICpjdHgsIGludCBwdXJwb3NlKTsKK2ludCBYNTA5X1NUT1JFX0NUWF9zZXRfdHJ1c3QoWDUwOV9TVE9SRV9DVFggKmN0eCwgaW50IHRydXN0KTsKK2ludCBYNTA5X1NUT1JFX0NUWF9wdXJwb3NlX2luaGVyaXQoWDUwOV9TVE9SRV9DVFggKmN0eCwgaW50IGRlZl9wdXJwb3NlLAorCQkJCWludCBwdXJwb3NlLCBpbnQgdHJ1c3QpOwordm9pZCBYNTA5X1NUT1JFX0NUWF9zZXRfZmxhZ3MoWDUwOV9TVE9SRV9DVFggKmN0eCwgdW5zaWduZWQgbG9uZyBmbGFncyk7Cit2b2lkIFg1MDlfU1RPUkVfQ1RYX3NldF90aW1lKFg1MDlfU1RPUkVfQ1RYICpjdHgsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJCQkJCQkJCXRpbWVfdCB0KTsKK3ZvaWQgWDUwOV9TVE9SRV9DVFhfc2V0X3ZlcmlmeV9jYihYNTA5X1NUT1JFX0NUWCAqY3R4LAorCQkJCSAgaW50ICgqdmVyaWZ5X2NiKShpbnQsIFg1MDlfU1RPUkVfQ1RYICopKTsKKyAgCitYNTA5X1BPTElDWV9UUkVFICpYNTA5X1NUT1JFX0NUWF9nZXQwX3BvbGljeV90cmVlKFg1MDlfU1RPUkVfQ1RYICpjdHgpOworaW50IFg1MDlfU1RPUkVfQ1RYX2dldF9leHBsaWNpdF9wb2xpY3koWDUwOV9TVE9SRV9DVFggKmN0eCk7CisKK1g1MDlfVkVSSUZZX1BBUkFNICpYNTA5X1NUT1JFX0NUWF9nZXQwX3BhcmFtKFg1MDlfU1RPUkVfQ1RYICpjdHgpOwordm9pZCBYNTA5X1NUT1JFX0NUWF9zZXQwX3BhcmFtKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSk7CitpbnQgWDUwOV9TVE9SRV9DVFhfc2V0X2RlZmF1bHQoWDUwOV9TVE9SRV9DVFggKmN0eCwgY29uc3QgY2hhciAqbmFtZSk7CisKKy8qIFg1MDlfVkVSSUZZX1BBUkFNIGZ1bmN0aW9ucyAqLworCitYNTA5X1ZFUklGWV9QQVJBTSAqWDUwOV9WRVJJRllfUEFSQU1fbmV3KHZvaWQpOwordm9pZCBYNTA5X1ZFUklGWV9QQVJBTV9mcmVlKFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSk7CitpbnQgWDUwOV9WRVJJRllfUEFSQU1faW5oZXJpdChYNTA5X1ZFUklGWV9QQVJBTSAqdG8sCisJCQkJCQljb25zdCBYNTA5X1ZFUklGWV9QQVJBTSAqZnJvbSk7CitpbnQgWDUwOV9WRVJJRllfUEFSQU1fc2V0MShYNTA5X1ZFUklGWV9QQVJBTSAqdG8sIAorCQkJCQkJY29uc3QgWDUwOV9WRVJJRllfUEFSQU0gKmZyb20pOworaW50IFg1MDlfVkVSSUZZX1BBUkFNX3NldDFfbmFtZShYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0sIGNvbnN0IGNoYXIgKm5hbWUpOworaW50IFg1MDlfVkVSSUZZX1BBUkFNX3NldF9mbGFncyhYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0sIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworaW50IFg1MDlfVkVSSUZZX1BBUkFNX2NsZWFyX2ZsYWdzKFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSwKKwkJCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKTsKK3Vuc2lnbmVkIGxvbmcgWDUwOV9WRVJJRllfUEFSQU1fZ2V0X2ZsYWdzKFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSk7CitpbnQgWDUwOV9WRVJJRllfUEFSQU1fc2V0X3B1cnBvc2UoWDUwOV9WRVJJRllfUEFSQU0gKnBhcmFtLCBpbnQgcHVycG9zZSk7CitpbnQgWDUwOV9WRVJJRllfUEFSQU1fc2V0X3RydXN0KFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSwgaW50IHRydXN0KTsKK3ZvaWQgWDUwOV9WRVJJRllfUEFSQU1fc2V0X2RlcHRoKFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSwgaW50IGRlcHRoKTsKK3ZvaWQgWDUwOV9WRVJJRllfUEFSQU1fc2V0X3RpbWUoWDUwOV9WRVJJRllfUEFSQU0gKnBhcmFtLCB0aW1lX3QgdCk7CitpbnQgWDUwOV9WRVJJRllfUEFSQU1fYWRkMF9wb2xpY3koWDUwOV9WRVJJRllfUEFSQU0gKnBhcmFtLAorCQkJCQkJQVNOMV9PQkpFQ1QgKnBvbGljeSk7CitpbnQgWDUwOV9WRVJJRllfUEFSQU1fc2V0MV9wb2xpY2llcyhYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0sIAorCQkJCQlTVEFDS19PRihBU04xX09CSkVDVCkgKnBvbGljaWVzKTsKKworaW50IFg1MDlfVkVSSUZZX1BBUkFNX3NldDFfaG9zdChYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0sCisJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqbmFtZSwgc2l6ZV90IG5hbWVsZW4pOworaW50IFg1MDlfVkVSSUZZX1BBUkFNX3NldDFfZW1haWwoWDUwOV9WRVJJRllfUEFSQU0gKnBhcmFtLAorCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmVtYWlsLCBzaXplX3QgZW1haWxsZW4pOworaW50IFg1MDlfVkVSSUZZX1BBUkFNX3NldDFfaXAoWDUwOV9WRVJJRllfUEFSQU0gKnBhcmFtLAorCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICppcCwgc2l6ZV90IGlwbGVuKTsKK2ludCBYNTA5X1ZFUklGWV9QQVJBTV9zZXQxX2lwX2FzYyhYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0sIGNvbnN0IGNoYXIgKmlwYXNjKTsKKworaW50IFg1MDlfVkVSSUZZX1BBUkFNX2dldF9kZXB0aChjb25zdCBYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0pOworY29uc3QgY2hhciAqWDUwOV9WRVJJRllfUEFSQU1fZ2V0MF9uYW1lKGNvbnN0IFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSk7CisKK2ludCBYNTA5X1ZFUklGWV9QQVJBTV9hZGQwX3RhYmxlKFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSk7CitpbnQgWDUwOV9WRVJJRllfUEFSQU1fZ2V0X2NvdW50KHZvaWQpOworY29uc3QgWDUwOV9WRVJJRllfUEFSQU0gKlg1MDlfVkVSSUZZX1BBUkFNX2dldDAoaW50IGlkKTsKK2NvbnN0IFg1MDlfVkVSSUZZX1BBUkFNICpYNTA5X1ZFUklGWV9QQVJBTV9sb29rdXAoY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIFg1MDlfVkVSSUZZX1BBUkFNX3RhYmxlX2NsZWFudXAodm9pZCk7CisKK2ludCBYNTA5X3BvbGljeV9jaGVjayhYNTA5X1BPTElDWV9UUkVFICoqcHRyZWUsIGludCAqcGV4cGxpY2l0X3BvbGljeSwKKwkJCVNUQUNLX09GKFg1MDkpICpjZXJ0cywKKwkJCVNUQUNLX09GKEFTTjFfT0JKRUNUKSAqcG9saWN5X29pZHMsCisJCQl1bnNpZ25lZCBpbnQgZmxhZ3MpOworCit2b2lkIFg1MDlfcG9saWN5X3RyZWVfZnJlZShYNTA5X1BPTElDWV9UUkVFICp0cmVlKTsKKworaW50IFg1MDlfcG9saWN5X3RyZWVfbGV2ZWxfY291bnQoY29uc3QgWDUwOV9QT0xJQ1lfVFJFRSAqdHJlZSk7CitYNTA5X1BPTElDWV9MRVZFTCAqCisJWDUwOV9wb2xpY3lfdHJlZV9nZXQwX2xldmVsKGNvbnN0IFg1MDlfUE9MSUNZX1RSRUUgKnRyZWUsIGludCBpKTsKKworU1RBQ0tfT0YoWDUwOV9QT0xJQ1lfTk9ERSkgKgorCVg1MDlfcG9saWN5X3RyZWVfZ2V0MF9wb2xpY2llcyhjb25zdCBYNTA5X1BPTElDWV9UUkVFICp0cmVlKTsKKworU1RBQ0tfT0YoWDUwOV9QT0xJQ1lfTk9ERSkgKgorCVg1MDlfcG9saWN5X3RyZWVfZ2V0MF91c2VyX3BvbGljaWVzKGNvbnN0IFg1MDlfUE9MSUNZX1RSRUUgKnRyZWUpOworCitpbnQgWDUwOV9wb2xpY3lfbGV2ZWxfbm9kZV9jb3VudChYNTA5X1BPTElDWV9MRVZFTCAqbGV2ZWwpOworCitYNTA5X1BPTElDWV9OT0RFICpYNTA5X3BvbGljeV9sZXZlbF9nZXQwX25vZGUoWDUwOV9QT0xJQ1lfTEVWRUwgKmxldmVsLCBpbnQgaSk7CisKK2NvbnN0IEFTTjFfT0JKRUNUICpYNTA5X3BvbGljeV9ub2RlX2dldDBfcG9saWN5KGNvbnN0IFg1MDlfUE9MSUNZX05PREUgKm5vZGUpOworCitTVEFDS19PRihQT0xJQ1lRVUFMSU5GTykgKgorCVg1MDlfcG9saWN5X25vZGVfZ2V0MF9xdWFsaWZpZXJzKGNvbnN0IFg1MDlfUE9MSUNZX05PREUgKm5vZGUpOworY29uc3QgWDUwOV9QT0xJQ1lfTk9ERSAqCisJWDUwOV9wb2xpY3lfbm9kZV9nZXQwX3BhcmVudChjb25zdCBYNTA5X1BPTElDWV9OT0RFICpub2RlKTsKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3g1MDkveDUwOV92cG0uYyBiL2NyeXB0by94NTA5L3g1MDlfdnBtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjViMDk4NwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94NTA5L3g1MDlfdnBtLmMKQEAgLTAsMCArMSw1NzggQEAKKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDA0LiAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9idWYuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2xoYXNoLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisKKyNpbmNsdWRlICJ2cG1faW50LmgiCisKKy8qIFg1MDlfVkVSSUZZX1BBUkFNIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgdm9pZCB4NTA5X3ZlcmlmeV9wYXJhbV96ZXJvKFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSkKKwl7CisJWDUwOV9WRVJJRllfUEFSQU1fSUQgKnBhcmFtaWQ7CisJaWYgKCFwYXJhbSkKKwkJcmV0dXJuOworCXBhcmFtLT5uYW1lID0gTlVMTDsKKwlwYXJhbS0+cHVycG9zZSA9IDA7CisJcGFyYW0tPnRydXN0ID0gMDsKKwkvKnBhcmFtLT5pbmhfZmxhZ3MgPSBYNTA5X1ZQX0ZMQUdfREVGQVVMVDsqLworCXBhcmFtLT5pbmhfZmxhZ3MgPSAwOworCXBhcmFtLT5mbGFncyA9IDA7CisJcGFyYW0tPmRlcHRoID0gLTE7CisJaWYgKHBhcmFtLT5wb2xpY2llcykKKwkJeworCQlza19BU04xX09CSkVDVF9wb3BfZnJlZShwYXJhbS0+cG9saWNpZXMsIEFTTjFfT0JKRUNUX2ZyZWUpOworCQlwYXJhbS0+cG9saWNpZXMgPSBOVUxMOworCQl9CisJcGFyYW1pZCA9IHBhcmFtLT5pZDsKKwlpZiAocGFyYW1pZC0+aG9zdCkKKwkJeworCQlPUEVOU1NMX2ZyZWUocGFyYW1pZC0+aG9zdCk7CisJCXBhcmFtaWQtPmhvc3QgPSBOVUxMOworCQlwYXJhbWlkLT5ob3N0bGVuID0gMDsKKwkJfQorCWlmIChwYXJhbWlkLT5lbWFpbCkKKwkJeworCQlPUEVOU1NMX2ZyZWUocGFyYW1pZC0+ZW1haWwpOworCQlwYXJhbWlkLT5lbWFpbCA9IE5VTEw7CisJCXBhcmFtaWQtPmVtYWlsbGVuID0gMDsKKwkJfQorCWlmIChwYXJhbWlkLT5pcCkKKwkJeworCQlPUEVOU1NMX2ZyZWUocGFyYW1pZC0+aXApOworCQlwYXJhbWlkLT5pcCA9IE5VTEw7CisJCXBhcmFtaWQtPmlwbGVuID0gMDsKKwkJfQorCisJfQorCitYNTA5X1ZFUklGWV9QQVJBTSAqWDUwOV9WRVJJRllfUEFSQU1fbmV3KHZvaWQpCisJeworCVg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbTsKKwlYNTA5X1ZFUklGWV9QQVJBTV9JRCAqcGFyYW1pZDsKKwlwYXJhbSA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihYNTA5X1ZFUklGWV9QQVJBTSkpOworCWlmICghcGFyYW0pCisJCXJldHVybiBOVUxMOworCXBhcmFtaWQgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoWDUwOV9WRVJJRllfUEFSQU0pKTsKKwlpZiAoIXBhcmFtaWQpCisJCXsKKwkJT1BFTlNTTF9mcmVlKHBhcmFtKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKwltZW1zZXQocGFyYW0sIDAsIHNpemVvZihYNTA5X1ZFUklGWV9QQVJBTSkpOworCW1lbXNldChwYXJhbWlkLCAwLCBzaXplb2YoWDUwOV9WRVJJRllfUEFSQU1fSUQpKTsKKwlwYXJhbS0+aWQgPSBwYXJhbWlkOworCXg1MDlfdmVyaWZ5X3BhcmFtX3plcm8ocGFyYW0pOworCXJldHVybiBwYXJhbTsKKwl9CisKK3ZvaWQgWDUwOV9WRVJJRllfUEFSQU1fZnJlZShYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0pCisJeworCXg1MDlfdmVyaWZ5X3BhcmFtX3plcm8ocGFyYW0pOworCU9QRU5TU0xfZnJlZShwYXJhbS0+aWQpOworCU9QRU5TU0xfZnJlZShwYXJhbSk7CisJfQorCisvKiBUaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgaG93IHBhcmFtZXRlcnMgYXJlICJpbmhlcml0ZWQiIGZyb20gb25lIHN0cnVjdHVyZQorICogdG8gYW5vdGhlci4gVGhlcmUgYXJlIHNldmVyYWwgZGlmZmVyZW50IHdheXMgdGhpcyBjYW4gaGFwcGVuLgorICoKKyAqIDEuIElmIGEgY2hpbGQgc3RydWN0dXJlIG5lZWRzIHRvIGhhdmUgaXRzIHZhbHVlcyBpbml0aWFsaXplZCBmcm9tIGEgcGFyZW50CisgKiAgICB0aGV5IGFyZSBzaW1wbHkgY29waWVkIGFjcm9zcy4gRm9yIGV4YW1wbGUgU1NMX0NUWCBjb3BpZWQgdG8gU1NMLgorICogMi4gSWYgdGhlIHN0cnVjdHVyZSBzaG91bGQgdGFrZSBvbiB2YWx1ZXMgb25seSBpZiB0aGV5IGFyZSBjdXJyZW50bHkgdW5zZXQuCisgKiAgICBGb3IgZXhhbXBsZSB0aGUgdmFsdWVzIGluIGFuIFNTTCBzdHJ1Y3R1cmUgd2lsbCB0YWtlIGFwcHJvcHJpYXRlIHZhbHVlCisgKiAgICBmb3IgU1NMIHNlcnZlcnMgb3IgY2xpZW50cyBidXQgb25seSBpZiB0aGUgYXBwbGljYXRpb24gaGFzIG5vdCBzZXQgbmV3CisgKiAgICBvbmVzLgorICoKKyAqIFRoZSAiaW5oX2ZsYWdzIiBmaWVsZCBkZXRlcm1pbmVzIGhvdyB0aGlzIGZ1bmN0aW9uIGJlaGF2ZXMuIAorICoKKyAqIE5vcm1hbGx5IGFueSB2YWx1ZXMgd2hpY2ggYXJlIHNldCBpbiB0aGUgZGVmYXVsdCBhcmUgbm90IGNvcGllZCBmcm9tIHRoZQorICogZGVzdGluYXRpb24gYW5kIHZlcmlmeSBmbGFncyBhcmUgT1JlZCB0b2dldGhlci4KKyAqCisgKiBJZiBYNTA5X1ZQX0ZMQUdfREVGQVVMVCBpcyBzZXQgdGhlbiBhbnl0aGluZyBzZXQgaW4gdGhlIHNvdXJjZSBpcyBjb3BpZWQKKyAqIHRvIHRoZSBkZXN0aW5hdGlvbi4gRWZmZWN0aXZlbHkgdGhlIHZhbHVlcyBpbiAidG8iIGJlY29tZSBkZWZhdWx0IHZhbHVlcworICogd2hpY2ggd2lsbCBiZSB1c2VkIG9ubHkgaWYgbm90aGluZyBuZXcgaXMgc2V0IGluICJmcm9tIi4KKyAqCisgKiBJZiBYNTA5X1ZQX0ZMQUdfT1ZFUldSSVRFIGlzIHNldCB0aGVuIGFsbCB2YWx1ZSBhcmUgY29waWVkIGFjcm9zcyB3aGV0aGVyCisgKiB0aGV5IGFyZSBzZXQgb3Igbm90LiBGbGFncyBpcyBzdGlsbCBPcmVkIHRob3VnaC4KKyAqCisgKiBJZiBYNTA5X1ZQX0ZMQUdfUkVTRVRfRkxBR1MgaXMgc2V0IHRoZW4gdGhlIGZsYWdzIHZhbHVlIGlzIGNvcGllZCBpbnN0ZWFkCisgKiBvZiBPUmVkLgorICoKKyAqIElmIFg1MDlfVlBfRkxBR19MT0NLRUQgaXMgc2V0IHRoZW4gbm8gdmFsdWVzIGFyZSBjb3BpZWQuCisgKgorICogSWYgWDUwOV9WUF9GTEFHX09OQ0UgaXMgc2V0IHRoZW4gdGhlIGN1cnJlbnQgaW5oX2ZsYWdzIHNldHRpbmcgaXMgemVyb2VkCisgKiBhZnRlciB0aGUgbmV4dCBjYWxsLgorICovCisKKy8qIE1hY3JvIHRvIHRlc3QgaWYgYSBmaWVsZCBzaG91bGQgYmUgY29waWVkIGZyb20gc3JjIHRvIGRlc3QgKi8KKworI2RlZmluZSB0ZXN0X3g1MDlfdmVyaWZ5X3BhcmFtX2NvcHkoZmllbGQsIGRlZikgXAorCSh0b19vdmVyd3JpdGUgfHwgXAorCQkoKHNyYy0+ZmllbGQgIT0gZGVmKSAmJiAodG9fZGVmYXVsdCB8fCAoZGVzdC0+ZmllbGQgPT0gZGVmKSkpKQorCisvKiBBcyBhYm92ZSBidXQgZm9yIElEIGZpZWxkcyAqLworCisjZGVmaW5lIHRlc3RfeDUwOV92ZXJpZnlfcGFyYW1fY29weV9pZChpZGYsIGRlZikgXAorCXRlc3RfeDUwOV92ZXJpZnlfcGFyYW1fY29weShpZC0+aWRmLCBkZWYpCisKKy8qIE1hY3JvIHRvIHRlc3QgYW5kIGNvcHkgYSBmaWVsZCBpZiBuZWNlc3NhcnkgKi8KKworI2RlZmluZSB4NTA5X3ZlcmlmeV9wYXJhbV9jb3B5KGZpZWxkLCBkZWYpIFwKKwlpZiAodGVzdF94NTA5X3ZlcmlmeV9wYXJhbV9jb3B5KGZpZWxkLCBkZWYpKSBcCisJCWRlc3QtPmZpZWxkID0gc3JjLT5maWVsZAorCisKK2ludCBYNTA5X1ZFUklGWV9QQVJBTV9pbmhlcml0KFg1MDlfVkVSSUZZX1BBUkFNICpkZXN0LAorCQkJCQkJY29uc3QgWDUwOV9WRVJJRllfUEFSQU0gKnNyYykKKwl7CisJdW5zaWduZWQgbG9uZyBpbmhfZmxhZ3M7CisJaW50IHRvX2RlZmF1bHQsIHRvX292ZXJ3cml0ZTsKKwlYNTA5X1ZFUklGWV9QQVJBTV9JRCAqaWQ7CisJaWYgKCFzcmMpCisJCXJldHVybiAxOworCWlkID0gc3JjLT5pZDsKKwlpbmhfZmxhZ3MgPSBkZXN0LT5pbmhfZmxhZ3MgfCBzcmMtPmluaF9mbGFnczsKKworCWlmIChpbmhfZmxhZ3MgJiBYNTA5X1ZQX0ZMQUdfT05DRSkKKwkJZGVzdC0+aW5oX2ZsYWdzID0gMDsKKworCWlmIChpbmhfZmxhZ3MgJiBYNTA5X1ZQX0ZMQUdfTE9DS0VEKQorCQlyZXR1cm4gMTsKKworCWlmIChpbmhfZmxhZ3MgJiBYNTA5X1ZQX0ZMQUdfREVGQVVMVCkKKwkJdG9fZGVmYXVsdCA9IDE7CisJZWxzZQorCQl0b19kZWZhdWx0ID0gMDsKKworCWlmIChpbmhfZmxhZ3MgJiBYNTA5X1ZQX0ZMQUdfT1ZFUldSSVRFKQorCQl0b19vdmVyd3JpdGUgPSAxOworCWVsc2UKKwkJdG9fb3ZlcndyaXRlID0gMDsKKworCXg1MDlfdmVyaWZ5X3BhcmFtX2NvcHkocHVycG9zZSwgMCk7CisJeDUwOV92ZXJpZnlfcGFyYW1fY29weSh0cnVzdCwgMCk7CisJeDUwOV92ZXJpZnlfcGFyYW1fY29weShkZXB0aCwgLTEpOworCisJLyogSWYgb3ZlcndyaXRlIG9yIGNoZWNrIHRpbWUgbm90IHNldCwgY29weSBhY3Jvc3MgKi8KKworCWlmICh0b19vdmVyd3JpdGUgfHwgIShkZXN0LT5mbGFncyAmIFg1MDlfVl9GTEFHX1VTRV9DSEVDS19USU1FKSkKKwkJeworCQlkZXN0LT5jaGVja190aW1lID0gc3JjLT5jaGVja190aW1lOworCQlkZXN0LT5mbGFncyAmPSB+WDUwOV9WX0ZMQUdfVVNFX0NIRUNLX1RJTUU7CisJCS8qIERvbid0IG5lZWQgdG8gY29weSBmbGFnOiB0aGF0IGlzIGRvbmUgYmVsb3cgKi8KKwkJfQorCisJaWYgKGluaF9mbGFncyAmIFg1MDlfVlBfRkxBR19SRVNFVF9GTEFHUykKKwkJZGVzdC0+ZmxhZ3MgPSAwOworCisJZGVzdC0+ZmxhZ3MgfD0gc3JjLT5mbGFnczsKKworCWlmICh0ZXN0X3g1MDlfdmVyaWZ5X3BhcmFtX2NvcHkocG9saWNpZXMsIE5VTEwpKQorCQl7CisJCWlmICghWDUwOV9WRVJJRllfUEFSQU1fc2V0MV9wb2xpY2llcyhkZXN0LCBzcmMtPnBvbGljaWVzKSkKKwkJCXJldHVybiAwOworCQl9CisKKwlpZiAodGVzdF94NTA5X3ZlcmlmeV9wYXJhbV9jb3B5X2lkKGhvc3QsIE5VTEwpKQorCQl7CisJCWlmICghWDUwOV9WRVJJRllfUEFSQU1fc2V0MV9ob3N0KGRlc3QsIGlkLT5ob3N0LCBpZC0+aG9zdGxlbikpCisJCQlyZXR1cm4gMDsKKwkJfQorCisJaWYgKHRlc3RfeDUwOV92ZXJpZnlfcGFyYW1fY29weV9pZChlbWFpbCwgTlVMTCkpCisJCXsKKwkJaWYgKCFYNTA5X1ZFUklGWV9QQVJBTV9zZXQxX2VtYWlsKGRlc3QsIGlkLT5lbWFpbCwgaWQtPmVtYWlsbGVuKSkKKwkJCXJldHVybiAwOworCQl9CisKKwlpZiAodGVzdF94NTA5X3ZlcmlmeV9wYXJhbV9jb3B5X2lkKGlwLCBOVUxMKSkKKwkJeworCQlpZiAoIVg1MDlfVkVSSUZZX1BBUkFNX3NldDFfaXAoZGVzdCwgaWQtPmlwLCBpZC0+aXBsZW4pKQorCQkJcmV0dXJuIDA7CisJCX0KKworCXJldHVybiAxOworCX0KKworaW50IFg1MDlfVkVSSUZZX1BBUkFNX3NldDEoWDUwOV9WRVJJRllfUEFSQU0gKnRvLAorCQkJCQkJY29uc3QgWDUwOV9WRVJJRllfUEFSQU0gKmZyb20pCisJeworCXVuc2lnbmVkIGxvbmcgc2F2ZV9mbGFncyA9IHRvLT5pbmhfZmxhZ3M7CisJaW50IHJldDsKKwl0by0+aW5oX2ZsYWdzIHw9IFg1MDlfVlBfRkxBR19ERUZBVUxUOworCXJldCA9IFg1MDlfVkVSSUZZX1BBUkFNX2luaGVyaXQodG8sIGZyb20pOworCXRvLT5pbmhfZmxhZ3MgPSBzYXZlX2ZsYWdzOworCXJldHVybiByZXQ7CisJfQorCitzdGF0aWMgaW50IGludF94NTA5X3BhcmFtX3NldDEodW5zaWduZWQgY2hhciAqKnBkZXN0LCBzaXplX3QgKnBkZXN0bGVuLAorCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgc2l6ZV90IHNyY2xlbikKKwl7CisJdm9pZCAqdG1wOworCWlmIChzcmMpCisJCXsKKwkJaWYgKHNyY2xlbiA9PSAwKQorCQkJeworCQkJdG1wID0gQlVGX3N0cmR1cCgoY2hhciAqKXNyYyk7CisJCQlzcmNsZW4gPSBzdHJsZW4oKGNoYXIgKilzcmMpOworCQkJfQorCQllbHNlCisJCQl0bXAgPSBCVUZfbWVtZHVwKHNyYywgc3JjbGVuKTsKKwkJaWYgKCF0bXApCisJCQlyZXR1cm4gMDsKKwkJfQorCWVsc2UKKwkJeworCQl0bXAgPSBOVUxMOworCQlzcmNsZW4gPSAwOworCQl9CisJaWYgKCpwZGVzdCkKKwkJT1BFTlNTTF9mcmVlKCpwZGVzdCk7CisJKnBkZXN0ID0gdG1wOworCWlmIChwZGVzdGxlbikKKwkJKnBkZXN0bGVuID0gc3JjbGVuOworCXJldHVybiAxOworCX0KKworaW50IFg1MDlfVkVSSUZZX1BBUkFNX3NldDFfbmFtZShYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0sIGNvbnN0IGNoYXIgKm5hbWUpCisJeworCWlmIChwYXJhbS0+bmFtZSkKKwkJT1BFTlNTTF9mcmVlKHBhcmFtLT5uYW1lKTsKKwlwYXJhbS0+bmFtZSA9IEJVRl9zdHJkdXAobmFtZSk7CisJaWYgKHBhcmFtLT5uYW1lKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKKwl9CisKK2ludCBYNTA5X1ZFUklGWV9QQVJBTV9zZXRfZmxhZ3MoWDUwOV9WRVJJRllfUEFSQU0gKnBhcmFtLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorCXsKKwlwYXJhbS0+ZmxhZ3MgfD0gZmxhZ3M7CisJaWYgKGZsYWdzICYgWDUwOV9WX0ZMQUdfUE9MSUNZX01BU0spCisJCXBhcmFtLT5mbGFncyB8PSBYNTA5X1ZfRkxBR19QT0xJQ1lfQ0hFQ0s7CisJcmV0dXJuIDE7CisJfQorCitpbnQgWDUwOV9WRVJJRllfUEFSQU1fY2xlYXJfZmxhZ3MoWDUwOV9WRVJJRllfUEFSQU0gKnBhcmFtLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorCXsKKwlwYXJhbS0+ZmxhZ3MgJj0gfmZsYWdzOworCXJldHVybiAxOworCX0KKwordW5zaWduZWQgbG9uZyBYNTA5X1ZFUklGWV9QQVJBTV9nZXRfZmxhZ3MoWDUwOV9WRVJJRllfUEFSQU0gKnBhcmFtKQorCXsKKwlyZXR1cm4gcGFyYW0tPmZsYWdzOworCX0KKworaW50IFg1MDlfVkVSSUZZX1BBUkFNX3NldF9wdXJwb3NlKFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSwgaW50IHB1cnBvc2UpCisJeworCXJldHVybiBYNTA5X1BVUlBPU0Vfc2V0KCZwYXJhbS0+cHVycG9zZSwgcHVycG9zZSk7CisJfQorCitpbnQgWDUwOV9WRVJJRllfUEFSQU1fc2V0X3RydXN0KFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSwgaW50IHRydXN0KQorCXsKKwlyZXR1cm4gWDUwOV9UUlVTVF9zZXQoJnBhcmFtLT50cnVzdCwgdHJ1c3QpOworCX0KKwordm9pZCBYNTA5X1ZFUklGWV9QQVJBTV9zZXRfZGVwdGgoWDUwOV9WRVJJRllfUEFSQU0gKnBhcmFtLCBpbnQgZGVwdGgpCisJeworCXBhcmFtLT5kZXB0aCA9IGRlcHRoOworCX0KKwordm9pZCBYNTA5X1ZFUklGWV9QQVJBTV9zZXRfdGltZShYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0sIHRpbWVfdCB0KQorCXsKKwlwYXJhbS0+Y2hlY2tfdGltZSA9IHQ7CisJcGFyYW0tPmZsYWdzIHw9IFg1MDlfVl9GTEFHX1VTRV9DSEVDS19USU1FOworCX0KKworaW50IFg1MDlfVkVSSUZZX1BBUkFNX2FkZDBfcG9saWN5KFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSwgQVNOMV9PQkpFQ1QgKnBvbGljeSkKKwl7CisJaWYgKCFwYXJhbS0+cG9saWNpZXMpCisJCXsKKwkJcGFyYW0tPnBvbGljaWVzID0gc2tfQVNOMV9PQkpFQ1RfbmV3X251bGwoKTsKKwkJaWYgKCFwYXJhbS0+cG9saWNpZXMpCisJCQlyZXR1cm4gMDsKKwkJfQorCWlmICghc2tfQVNOMV9PQkpFQ1RfcHVzaChwYXJhbS0+cG9saWNpZXMsIHBvbGljeSkpCisJCXJldHVybiAwOworCXJldHVybiAxOworCX0KKworaW50IFg1MDlfVkVSSUZZX1BBUkFNX3NldDFfcG9saWNpZXMoWDUwOV9WRVJJRllfUEFSQU0gKnBhcmFtLCAKKwkJCQkJU1RBQ0tfT0YoQVNOMV9PQkpFQ1QpICpwb2xpY2llcykKKwl7CisJc2l6ZV90IGk7CisJQVNOMV9PQkpFQ1QgKm9pZCwgKmRvaWQ7CisJaWYgKCFwYXJhbSkKKwkJcmV0dXJuIDA7CisJaWYgKHBhcmFtLT5wb2xpY2llcykKKwkJc2tfQVNOMV9PQkpFQ1RfcG9wX2ZyZWUocGFyYW0tPnBvbGljaWVzLCBBU04xX09CSkVDVF9mcmVlKTsKKworCWlmICghcG9saWNpZXMpCisJCXsKKwkJcGFyYW0tPnBvbGljaWVzID0gTlVMTDsKKwkJcmV0dXJuIDE7CisJCX0KKworCXBhcmFtLT5wb2xpY2llcyA9IHNrX0FTTjFfT0JKRUNUX25ld19udWxsKCk7CisJaWYgKCFwYXJhbS0+cG9saWNpZXMpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IHNrX0FTTjFfT0JKRUNUX251bShwb2xpY2llcyk7IGkrKykKKwkJeworCQlvaWQgPSBza19BU04xX09CSkVDVF92YWx1ZShwb2xpY2llcywgaSk7CisJCWRvaWQgPSBPQkpfZHVwKG9pZCk7CisJCWlmICghZG9pZCkKKwkJCXJldHVybiAwOworCQlpZiAoIXNrX0FTTjFfT0JKRUNUX3B1c2gocGFyYW0tPnBvbGljaWVzLCBkb2lkKSkKKwkJCXsKKwkJCUFTTjFfT0JKRUNUX2ZyZWUoZG9pZCk7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCXBhcmFtLT5mbGFncyB8PSBYNTA5X1ZfRkxBR19QT0xJQ1lfQ0hFQ0s7CisJcmV0dXJuIDE7CisJfQorCitpbnQgWDUwOV9WRVJJRllfUEFSQU1fc2V0MV9ob3N0KFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSwKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZWxlbikKKwl7CisJcmV0dXJuIGludF94NTA5X3BhcmFtX3NldDEoJnBhcmFtLT5pZC0+aG9zdCwgJnBhcmFtLT5pZC0+aG9zdGxlbiwKKwkJCQkJbmFtZSwgbmFtZWxlbik7CisJfQorCitpbnQgWDUwOV9WRVJJRllfUEFSQU1fc2V0MV9lbWFpbChYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0sCisJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqZW1haWwsIHNpemVfdCBlbWFpbGxlbikKKwl7CisJcmV0dXJuIGludF94NTA5X3BhcmFtX3NldDEoJnBhcmFtLT5pZC0+ZW1haWwsICZwYXJhbS0+aWQtPmVtYWlsbGVuLAorCQkJCQllbWFpbCwgZW1haWxsZW4pOworCX0KKworaW50IFg1MDlfVkVSSUZZX1BBUkFNX3NldDFfaXAoWDUwOV9WRVJJRllfUEFSQU0gKnBhcmFtLAorCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICppcCwgc2l6ZV90IGlwbGVuKQorCXsKKwlpZiAoaXBsZW4gIT0gMCAmJiBpcGxlbiAhPSA0ICYmIGlwbGVuICE9IDE2KQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaW50X3g1MDlfcGFyYW1fc2V0MSgmcGFyYW0tPmlkLT5pcCwgJnBhcmFtLT5pZC0+aXBsZW4sIGlwLCBpcGxlbik7CisJfQorCitpbnQgWDUwOV9WRVJJRllfUEFSQU1fc2V0MV9pcF9hc2MoWDUwOV9WRVJJRllfUEFSQU0gKnBhcmFtLCBjb25zdCBjaGFyICppcGFzYykKKwl7CisJdW5zaWduZWQgY2hhciBpcG91dFsxNl07CisJaW50IGlwbGVuOworCWlwbGVuID0gYTJpX2lwYWRkKGlwb3V0LCBpcGFzYyk7CisJaWYgKGlwbGVuID09IDApCisJCXJldHVybiAwOworCXJldHVybiBYNTA5X1ZFUklGWV9QQVJBTV9zZXQxX2lwKHBhcmFtLCBpcG91dCwgKHNpemVfdClpcGxlbik7CisJfQorCitpbnQgWDUwOV9WRVJJRllfUEFSQU1fZ2V0X2RlcHRoKGNvbnN0IFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSkKKwl7CisJcmV0dXJuIHBhcmFtLT5kZXB0aDsKKwl9CisKK2NvbnN0IGNoYXIgKlg1MDlfVkVSSUZZX1BBUkFNX2dldDBfbmFtZShjb25zdCBYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0pCisJeworCXJldHVybiBwYXJhbS0+bmFtZTsKKwl9CisKK3N0YXRpYyBYNTA5X1ZFUklGWV9QQVJBTV9JRCBfZW1wdHlfaWQgPSB7TlVMTCwgMCwgTlVMTCwgMCwgTlVMTCwgMH07CisKKyNkZWZpbmUgdnBtX2VtcHR5X2lkIChYNTA5X1ZFUklGWV9QQVJBTV9JRCAqKSZfZW1wdHlfaWQKKworLyogRGVmYXVsdCB2ZXJpZnkgcGFyYW1ldGVyczogdGhlc2UgYXJlIHVzZWQgZm9yIHZhcmlvdXMKKyAqIGFwcGxpY2F0aW9ucyBhbmQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIHVzZXIgc3BlY2lmaWVkIHRhYmxlLgorICogTkI6IHRoZSAnbmFtZScgZmllbGQgKm11c3QqIGJlIGluIGFscGhhYmV0aWNhbCBvcmRlciBiZWNhdXNlIGl0CisgKiB3aWxsIGJlIHNlYXJjaGVkIHVzaW5nIE9CSl9zZWFyY2guCisgKi8KKworc3RhdGljIGNvbnN0IFg1MDlfVkVSSUZZX1BBUkFNIGRlZmF1bHRfdGFibGVbXSA9IHsKKwl7CisJImRlZmF1bHQiLAkvKiBYNTA5IGRlZmF1bHQgcGFyYW1ldGVycyAqLworCTAsCQkvKiBDaGVjayB0aW1lICovCisJMCwJCS8qIGludGVybmFsIGZsYWdzICovCisJMCwJCS8qIGZsYWdzICovCisJMCwJCS8qIHB1cnBvc2UgKi8KKwkwLAkJLyogdHJ1c3QgKi8KKwkxMDAsCQkvKiBkZXB0aCAqLworCU5VTEwsCQkvKiBwb2xpY2llcyAqLworCXZwbV9lbXB0eV9pZAorCX0sCisJeworCSJwa2NzNyIsCQkJLyogUy9NSU1FIHNpZ24gcGFyYW1ldGVycyAqLworCTAsCQkJCS8qIENoZWNrIHRpbWUgKi8KKwkwLAkJCQkvKiBpbnRlcm5hbCBmbGFncyAqLworCTAsCQkJCS8qIGZsYWdzICovCisJWDUwOV9QVVJQT1NFX1NNSU1FX1NJR04sCS8qIHB1cnBvc2UgKi8KKwlYNTA5X1RSVVNUX0VNQUlMLAkJLyogdHJ1c3QgKi8KKwktMSwJCQkJLyogZGVwdGggKi8KKwlOVUxMLAkJCQkvKiBwb2xpY2llcyAqLworCXZwbV9lbXB0eV9pZAorCX0sCisJeworCSJzbWltZV9zaWduIiwJCQkvKiBTL01JTUUgc2lnbiBwYXJhbWV0ZXJzICovCisJMCwJCQkJLyogQ2hlY2sgdGltZSAqLworCTAsCQkJCS8qIGludGVybmFsIGZsYWdzICovCisJMCwJCQkJLyogZmxhZ3MgKi8KKwlYNTA5X1BVUlBPU0VfU01JTUVfU0lHTiwJLyogcHVycG9zZSAqLworCVg1MDlfVFJVU1RfRU1BSUwsCQkvKiB0cnVzdCAqLworCS0xLAkJCQkvKiBkZXB0aCAqLworCU5VTEwsCQkJCS8qIHBvbGljaWVzICovCisJdnBtX2VtcHR5X2lkCisJfSwKKwl7CisJInNzbF9jbGllbnQiLAkJCS8qIFNTTC9UTFMgY2xpZW50IHBhcmFtZXRlcnMgKi8KKwkwLAkJCQkvKiBDaGVjayB0aW1lICovCisJMCwJCQkJLyogaW50ZXJuYWwgZmxhZ3MgKi8KKwkwLAkJCQkvKiBmbGFncyAqLworCVg1MDlfUFVSUE9TRV9TU0xfQ0xJRU5ULAkvKiBwdXJwb3NlICovCisJWDUwOV9UUlVTVF9TU0xfQ0xJRU5ULAkJLyogdHJ1c3QgKi8KKwktMSwJCQkJLyogZGVwdGggKi8KKwlOVUxMLAkJCQkvKiBwb2xpY2llcyAqLworCXZwbV9lbXB0eV9pZAorCX0sCisJeworCSJzc2xfc2VydmVyIiwJCQkvKiBTU0wvVExTIHNlcnZlciBwYXJhbWV0ZXJzICovCisJMCwJCQkJLyogQ2hlY2sgdGltZSAqLworCTAsCQkJCS8qIGludGVybmFsIGZsYWdzICovCisJMCwJCQkJLyogZmxhZ3MgKi8KKwlYNTA5X1BVUlBPU0VfU1NMX1NFUlZFUiwJLyogcHVycG9zZSAqLworCVg1MDlfVFJVU1RfU1NMX1NFUlZFUiwJCS8qIHRydXN0ICovCisJLTEsCQkJCS8qIGRlcHRoICovCisJTlVMTCwJCQkJLyogcG9saWNpZXMgKi8KKwl2cG1fZW1wdHlfaWQKKwl9fTsKKworc3RhdGljIFNUQUNLX09GKFg1MDlfVkVSSUZZX1BBUkFNKSAqcGFyYW1fdGFibGUgPSBOVUxMOworCitzdGF0aWMgaW50IHBhcmFtX2NtcChjb25zdCBYNTA5X1ZFUklGWV9QQVJBTSAqKmEsCisJCQljb25zdCBYNTA5X1ZFUklGWV9QQVJBTSAqKmIpCisJeworCXJldHVybiBzdHJjbXAoKCphKS0+bmFtZSwgKCpiKS0+bmFtZSk7CisJfQorCitpbnQgWDUwOV9WRVJJRllfUEFSQU1fYWRkMF90YWJsZShYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0pCisJeworCVg1MDlfVkVSSUZZX1BBUkFNICpwdG1wOworCWlmICghcGFyYW1fdGFibGUpCisJCXsKKwkJcGFyYW1fdGFibGUgPSBza19YNTA5X1ZFUklGWV9QQVJBTV9uZXcocGFyYW1fY21wKTsKKwkJaWYgKCFwYXJhbV90YWJsZSkKKwkJCXJldHVybiAwOworCQl9CisJZWxzZQorCQl7CisJCXNpemVfdCBpZHg7CisKKwkJaWYgKHNrX1g1MDlfVkVSSUZZX1BBUkFNX2ZpbmQocGFyYW1fdGFibGUsICZpZHgsIHBhcmFtKSkKKwkJCXsKKwkJCXB0bXAgPSBza19YNTA5X1ZFUklGWV9QQVJBTV92YWx1ZShwYXJhbV90YWJsZSwgaWR4KTsKKwkJCVg1MDlfVkVSSUZZX1BBUkFNX2ZyZWUocHRtcCk7CisJCQkodm9pZClza19YNTA5X1ZFUklGWV9QQVJBTV9kZWxldGUocGFyYW1fdGFibGUsIGlkeCk7CisJCQl9CisJCX0KKwlpZiAoIXNrX1g1MDlfVkVSSUZZX1BBUkFNX3B1c2gocGFyYW1fdGFibGUsIHBhcmFtKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7CisJfQorCitpbnQgWDUwOV9WRVJJRllfUEFSQU1fZ2V0X2NvdW50KHZvaWQpCisJeworCWludCBudW0gPSBzaXplb2YoZGVmYXVsdF90YWJsZSkvc2l6ZW9mKFg1MDlfVkVSSUZZX1BBUkFNKTsKKwlpZiAocGFyYW1fdGFibGUpCisJCW51bSArPSBza19YNTA5X1ZFUklGWV9QQVJBTV9udW0ocGFyYW1fdGFibGUpOworCXJldHVybiBudW07CisJfQorCitjb25zdCBYNTA5X1ZFUklGWV9QQVJBTSAqWDUwOV9WRVJJRllfUEFSQU1fZ2V0MChpbnQgaWQpCisJeworCWludCBudW0gPSBzaXplb2YoZGVmYXVsdF90YWJsZSkvc2l6ZW9mKFg1MDlfVkVSSUZZX1BBUkFNKTsKKwlpZiAoaWQgPCBudW0pCisJCXJldHVybiBkZWZhdWx0X3RhYmxlICsgaWQ7CisJcmV0dXJuIHNrX1g1MDlfVkVSSUZZX1BBUkFNX3ZhbHVlKHBhcmFtX3RhYmxlLCBpZCAtIG51bSk7CisJfQorCitjb25zdCBYNTA5X1ZFUklGWV9QQVJBTSAqWDUwOV9WRVJJRllfUEFSQU1fbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpCisJeworCVg1MDlfVkVSSUZZX1BBUkFNIHBtOworCXVuc2lnbmVkIGksIGxpbWl0OworCisJcG0ubmFtZSA9IChjaGFyICopbmFtZTsKKwlpZiAocGFyYW1fdGFibGUpCisJCXsKKwkJc2l6ZV90IGlkeDsKKwkJaWYgKHNrX1g1MDlfVkVSSUZZX1BBUkFNX2ZpbmQocGFyYW1fdGFibGUsICZpZHgsICZwbSkpCisJCQlyZXR1cm4gc2tfWDUwOV9WRVJJRllfUEFSQU1fdmFsdWUocGFyYW1fdGFibGUsIGlkeCk7CisJCX0KKworCWxpbWl0ID0gc2l6ZW9mKGRlZmF1bHRfdGFibGUpL3NpemVvZihYNTA5X1ZFUklGWV9QQVJBTSk7CisJZm9yIChpID0gMDsgaSA8IGxpbWl0OyBpKyspIHsKKwkJaWYgKHN0cmNtcChkZWZhdWx0X3RhYmxlW2ldLm5hbWUsIG5hbWUpID09IDApIHsKKwkJCXJldHVybiAmZGVmYXVsdF90YWJsZVtpXTsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKKwl9CisKK3ZvaWQgWDUwOV9WRVJJRllfUEFSQU1fdGFibGVfY2xlYW51cCh2b2lkKQorCXsKKwlpZiAocGFyYW1fdGFibGUpCisJCXNrX1g1MDlfVkVSSUZZX1BBUkFNX3BvcF9mcmVlKHBhcmFtX3RhYmxlLAorCQkJCQkJWDUwOV9WRVJJRllfUEFSQU1fZnJlZSk7CisJcGFyYW1fdGFibGUgPSBOVUxMOworCX0KZGlmZiAtLWdpdCBhL2NyeXB0by94NTA5L3g1MDljc2V0LmMgYi9jcnlwdG8veDUwOS94NTA5Y3NldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MjZjNjkKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOS94NTA5Y3NldC5jCkBAIC0wLDAgKzEsMTY1IEBACisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMS4gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKworCitpbnQgWDUwOV9DUkxfc2V0X3ZlcnNpb24oWDUwOV9DUkwgKngsIGxvbmcgdmVyc2lvbikKKwl7CisJaWYgKHggPT0gTlVMTCkgcmV0dXJuKDApOworCWlmICh4LT5jcmwtPnZlcnNpb24gPT0gTlVMTCkKKwkJeworCQlpZiAoKHgtPmNybC0+dmVyc2lvbj1NX0FTTjFfSU5URUdFUl9uZXcoKSkgPT0gTlVMTCkKKwkJCXJldHVybigwKTsKKwkJfQorCXJldHVybihBU04xX0lOVEVHRVJfc2V0KHgtPmNybC0+dmVyc2lvbix2ZXJzaW9uKSk7CisJfQorCitpbnQgWDUwOV9DUkxfc2V0X2lzc3Vlcl9uYW1lKFg1MDlfQ1JMICp4LCBYNTA5X05BTUUgKm5hbWUpCisJeworCWlmICgoeCA9PSBOVUxMKSB8fCAoeC0+Y3JsID09IE5VTEwpKSByZXR1cm4oMCk7CisJcmV0dXJuKFg1MDlfTkFNRV9zZXQoJngtPmNybC0+aXNzdWVyLG5hbWUpKTsKKwl9CisKKworaW50IFg1MDlfQ1JMX3NldF9sYXN0VXBkYXRlKFg1MDlfQ1JMICp4LCBjb25zdCBBU04xX1RJTUUgKnRtKQorCXsKKwlBU04xX1RJTUUgKmluOworCisJaWYgKHggPT0gTlVMTCkgcmV0dXJuKDApOworCWluPXgtPmNybC0+bGFzdFVwZGF0ZTsKKwlpZiAoaW4gIT0gdG0pCisJCXsKKwkJaW49TV9BU04xX1RJTUVfZHVwKHRtKTsKKwkJaWYgKGluICE9IE5VTEwpCisJCQl7CisJCQlNX0FTTjFfVElNRV9mcmVlKHgtPmNybC0+bGFzdFVwZGF0ZSk7CisJCQl4LT5jcmwtPmxhc3RVcGRhdGU9aW47CisJCQl9CisJCX0KKwlyZXR1cm4oaW4gIT0gTlVMTCk7CisJfQorCitpbnQgWDUwOV9DUkxfc2V0X25leHRVcGRhdGUoWDUwOV9DUkwgKngsIGNvbnN0IEFTTjFfVElNRSAqdG0pCisJeworCUFTTjFfVElNRSAqaW47CisKKwlpZiAoeCA9PSBOVUxMKSByZXR1cm4oMCk7CisJaW49eC0+Y3JsLT5uZXh0VXBkYXRlOworCWlmIChpbiAhPSB0bSkKKwkJeworCQlpbj1NX0FTTjFfVElNRV9kdXAodG0pOworCQlpZiAoaW4gIT0gTlVMTCkKKwkJCXsKKwkJCU1fQVNOMV9USU1FX2ZyZWUoeC0+Y3JsLT5uZXh0VXBkYXRlKTsKKwkJCXgtPmNybC0+bmV4dFVwZGF0ZT1pbjsKKwkJCX0KKwkJfQorCXJldHVybihpbiAhPSBOVUxMKTsKKwl9CisKK2ludCBYNTA5X0NSTF9zb3J0KFg1MDlfQ1JMICpjKQorCXsKKwlzaXplX3QgaTsKKwlYNTA5X1JFVk9LRUQgKnI7CisJLyogc29ydCB0aGUgZGF0YSBzbyBpdCB3aWxsIGJlIHdyaXR0ZW4gaW4gc2VyaWFsCisJICogbnVtYmVyIG9yZGVyICovCisJc2tfWDUwOV9SRVZPS0VEX3NvcnQoYy0+Y3JsLT5yZXZva2VkKTsKKwlmb3IgKGk9MDsgaTxza19YNTA5X1JFVk9LRURfbnVtKGMtPmNybC0+cmV2b2tlZCk7IGkrKykKKwkJeworCQlyPXNrX1g1MDlfUkVWT0tFRF92YWx1ZShjLT5jcmwtPnJldm9rZWQsaSk7CisJCXItPnNlcXVlbmNlPWk7CisJCX0KKwljLT5jcmwtPmVuYy5tb2RpZmllZCA9IDE7CisJcmV0dXJuIDE7CisJfQorCitpbnQgWDUwOV9SRVZPS0VEX3NldF9yZXZvY2F0aW9uRGF0ZShYNTA5X1JFVk9LRUQgKngsIEFTTjFfVElNRSAqdG0pCisJeworCUFTTjFfVElNRSAqaW47CisKKwlpZiAoeCA9PSBOVUxMKSByZXR1cm4oMCk7CisJaW49eC0+cmV2b2NhdGlvbkRhdGU7CisJaWYgKGluICE9IHRtKQorCQl7CisJCWluPU1fQVNOMV9USU1FX2R1cCh0bSk7CisJCWlmIChpbiAhPSBOVUxMKQorCQkJeworCQkJTV9BU04xX1RJTUVfZnJlZSh4LT5yZXZvY2F0aW9uRGF0ZSk7CisJCQl4LT5yZXZvY2F0aW9uRGF0ZT1pbjsKKwkJCX0KKwkJfQorCXJldHVybihpbiAhPSBOVUxMKTsKKwl9CisKK2ludCBYNTA5X1JFVk9LRURfc2V0X3NlcmlhbE51bWJlcihYNTA5X1JFVk9LRUQgKngsIEFTTjFfSU5URUdFUiAqc2VyaWFsKQorCXsKKwlBU04xX0lOVEVHRVIgKmluOworCisJaWYgKHggPT0gTlVMTCkgcmV0dXJuKDApOworCWluPXgtPnNlcmlhbE51bWJlcjsKKwlpZiAoaW4gIT0gc2VyaWFsKQorCQl7CisJCWluPU1fQVNOMV9JTlRFR0VSX2R1cChzZXJpYWwpOworCQlpZiAoaW4gIT0gTlVMTCkKKwkJCXsKKwkJCU1fQVNOMV9JTlRFR0VSX2ZyZWUoeC0+c2VyaWFsTnVtYmVyKTsKKwkJCXgtPnNlcmlhbE51bWJlcj1pbjsKKwkJCX0KKwkJfQorCXJldHVybihpbiAhPSBOVUxMKTsKKwl9CmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOS94NTA5bmFtZS5jIGIvY3J5cHRvL3g1MDkveDUwOW5hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTVlYTE3Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3g1MDkveDUwOW5hbWUuYwpAQCAtMCwwICsxLDM3OSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3RhY2suaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKworCitpbnQgWDUwOV9OQU1FX2dldF90ZXh0X2J5X05JRChYNTA5X05BTUUgKm5hbWUsIGludCBuaWQsIGNoYXIgKmJ1ZiwgaW50IGxlbikKKwl7CisJY29uc3QgQVNOMV9PQkpFQ1QgKm9iajsKKworCW9iaj1PQkpfbmlkMm9iaihuaWQpOworCWlmIChvYmogPT0gTlVMTCkgcmV0dXJuKC0xKTsKKwlyZXR1cm4oWDUwOV9OQU1FX2dldF90ZXh0X2J5X09CSihuYW1lLG9iaixidWYsbGVuKSk7CisJfQorCitpbnQgWDUwOV9OQU1FX2dldF90ZXh0X2J5X09CSihYNTA5X05BTUUgKm5hbWUsIGNvbnN0IEFTTjFfT0JKRUNUICpvYmosIGNoYXIgKmJ1ZiwKKwkgICAgIGludCBsZW4pCisJeworCWludCBpOworCUFTTjFfU1RSSU5HICpkYXRhOworCisJaT1YNTA5X05BTUVfZ2V0X2luZGV4X2J5X09CSihuYW1lLG9iaiwtMSk7CisJaWYgKGkgPCAwKSByZXR1cm4oLTEpOworCWRhdGE9WDUwOV9OQU1FX0VOVFJZX2dldF9kYXRhKFg1MDlfTkFNRV9nZXRfZW50cnkobmFtZSxpKSk7CisJaT0oZGF0YS0+bGVuZ3RoID4gKGxlbi0xKSk/KGxlbi0xKTpkYXRhLT5sZW5ndGg7CisJaWYgKGJ1ZiA9PSBOVUxMKSByZXR1cm4oZGF0YS0+bGVuZ3RoKTsKKwltZW1jcHkoYnVmLGRhdGEtPmRhdGEsaSk7CisJYnVmW2ldPSdcMCc7CisJcmV0dXJuKGkpOworCX0KKworaW50IFg1MDlfTkFNRV9lbnRyeV9jb3VudChYNTA5X05BTUUgKm5hbWUpCisJeworCWlmIChuYW1lID09IE5VTEwpIHJldHVybigwKTsKKwlyZXR1cm4oc2tfWDUwOV9OQU1FX0VOVFJZX251bShuYW1lLT5lbnRyaWVzKSk7CisJfQorCitpbnQgWDUwOV9OQU1FX2dldF9pbmRleF9ieV9OSUQoWDUwOV9OQU1FICpuYW1lLCBpbnQgbmlkLCBpbnQgbGFzdHBvcykKKwl7CisJY29uc3QgQVNOMV9PQkpFQ1QgKm9iajsKKworCW9iaj1PQkpfbmlkMm9iaihuaWQpOworCWlmIChvYmogPT0gTlVMTCkgcmV0dXJuKC0yKTsKKwlyZXR1cm4oWDUwOV9OQU1FX2dldF9pbmRleF9ieV9PQkoobmFtZSxvYmosbGFzdHBvcykpOworCX0KKworLyogTk9URTogeW91IHNob3VsZCBiZSBwYXNzc2luZyAtMSwgbm90IDAgYXMgbGFzdHBvcyAqLworaW50IFg1MDlfTkFNRV9nZXRfaW5kZXhfYnlfT0JKKFg1MDlfTkFNRSAqbmFtZSwgY29uc3QgQVNOMV9PQkpFQ1QgKm9iaiwKKwkgICAgIGludCBsYXN0cG9zKQorCXsKKwlpbnQgbjsKKwlYNTA5X05BTUVfRU5UUlkgKm5lOworCVNUQUNLX09GKFg1MDlfTkFNRV9FTlRSWSkgKnNrOworCisJaWYgKG5hbWUgPT0gTlVMTCkgcmV0dXJuKC0xKTsKKwlpZiAobGFzdHBvcyA8IDApCisJCWxhc3Rwb3M9IC0xOworCXNrPW5hbWUtPmVudHJpZXM7CisJbj1za19YNTA5X05BTUVfRU5UUllfbnVtKHNrKTsKKwlmb3IgKGxhc3Rwb3MrKzsgbGFzdHBvcyA8IG47IGxhc3Rwb3MrKykKKwkJeworCQluZT1za19YNTA5X05BTUVfRU5UUllfdmFsdWUoc2ssbGFzdHBvcyk7CisJCWlmIChPQkpfY21wKG5lLT5vYmplY3Qsb2JqKSA9PSAwKQorCQkJcmV0dXJuKGxhc3Rwb3MpOworCQl9CisJcmV0dXJuKC0xKTsKKwl9CisKK1g1MDlfTkFNRV9FTlRSWSAqWDUwOV9OQU1FX2dldF9lbnRyeShYNTA5X05BTUUgKm5hbWUsIGludCBsb2MpCisJeworCWlmKG5hbWUgPT0gTlVMTCB8fCBsb2MgPCAwIHx8IHNrX1g1MDlfTkFNRV9FTlRSWV9udW0obmFtZS0+ZW50cmllcykgPD0gKHNpemVfdCkgbG9jKQorCQlyZXR1cm4oTlVMTCk7CisJZWxzZQorCQlyZXR1cm4oc2tfWDUwOV9OQU1FX0VOVFJZX3ZhbHVlKG5hbWUtPmVudHJpZXMsbG9jKSk7CisJfQorCitYNTA5X05BTUVfRU5UUlkgKlg1MDlfTkFNRV9kZWxldGVfZW50cnkoWDUwOV9OQU1FICpuYW1lLCBpbnQgbG9jKQorCXsKKwlYNTA5X05BTUVfRU5UUlkgKnJldDsKKwlpbnQgaSxuLHNldF9wcmV2LHNldF9uZXh0OworCVNUQUNLX09GKFg1MDlfTkFNRV9FTlRSWSkgKnNrOworCisJaWYgKG5hbWUgPT0gTlVMTCB8fCBsb2MgPCAwIHx8IHNrX1g1MDlfTkFNRV9FTlRSWV9udW0obmFtZS0+ZW50cmllcykgPD0gKHNpemVfdCkgbG9jKQorCQlyZXR1cm4oTlVMTCk7CisJc2s9bmFtZS0+ZW50cmllczsKKwlyZXQ9c2tfWDUwOV9OQU1FX0VOVFJZX2RlbGV0ZShzayxsb2MpOworCW49c2tfWDUwOV9OQU1FX0VOVFJZX251bShzayk7CisJbmFtZS0+bW9kaWZpZWQ9MTsKKwlpZiAobG9jID09IG4pIHJldHVybihyZXQpOworCisJLyogZWxzZSB3ZSBuZWVkIHRvIGZpeHVwIHRoZSBzZXQgZmllbGQgKi8KKwlpZiAobG9jICE9IDApCisJCXNldF9wcmV2PShza19YNTA5X05BTUVfRU5UUllfdmFsdWUoc2ssbG9jLTEpKS0+c2V0OworCWVsc2UKKwkJc2V0X3ByZXY9cmV0LT5zZXQtMTsKKwlzZXRfbmV4dD1za19YNTA5X05BTUVfRU5UUllfdmFsdWUoc2ssbG9jKS0+c2V0OworCisJLyogc2V0X3ByZXYgaXMgdGhlIHByZXZpb3VzIHNldAorCSAqIHNldCBpcyB0aGUgY3VycmVudCBzZXQKKwkgKiBzZXRfbmV4dCBpcyB0aGUgZm9sbG93aW5nCisJICogcHJldiAgMSAxCTEgMQkxIDEJMSAxCisJICogc2V0ICAgMQkxCTIJMgorCSAqIG5leHQgIDEgMQkyIDIJMiAyCTMgMgorCSAqIHNvIGJhc2ljYWxseSBvbmx5IGlmIHByZXYgYW5kIG5leHQgZGlmZmVyIGJ5IDIsIHRoZW4KKwkgKiByZS1udW1iZXIgZG93biBieSAxICovCisJaWYgKHNldF9wcmV2KzEgPCBzZXRfbmV4dCkKKwkJZm9yIChpPWxvYzsgaTxuOyBpKyspCisJCQlza19YNTA5X05BTUVfRU5UUllfdmFsdWUoc2ssaSktPnNldC0tOworCXJldHVybihyZXQpOworCX0KKworaW50IFg1MDlfTkFNRV9hZGRfZW50cnlfYnlfT0JKKFg1MDlfTkFNRSAqbmFtZSwgQVNOMV9PQkpFQ1QgKm9iaiwgaW50IHR5cGUsCisJCQl1bnNpZ25lZCBjaGFyICpieXRlcywgaW50IGxlbiwgaW50IGxvYywgaW50IHNldCkKK3sKKwlYNTA5X05BTUVfRU5UUlkgKm5lOworCWludCByZXQ7CisJbmUgPSBYNTA5X05BTUVfRU5UUllfY3JlYXRlX2J5X09CSihOVUxMLCBvYmosIHR5cGUsIGJ5dGVzLCBsZW4pOworCWlmKCFuZSkgcmV0dXJuIDA7CisJcmV0ID0gWDUwOV9OQU1FX2FkZF9lbnRyeShuYW1lLCBuZSwgbG9jLCBzZXQpOworCVg1MDlfTkFNRV9FTlRSWV9mcmVlKG5lKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgWDUwOV9OQU1FX2FkZF9lbnRyeV9ieV9OSUQoWDUwOV9OQU1FICpuYW1lLCBpbnQgbmlkLCBpbnQgdHlwZSwKKwkJCXVuc2lnbmVkIGNoYXIgKmJ5dGVzLCBpbnQgbGVuLCBpbnQgbG9jLCBpbnQgc2V0KQoreworCVg1MDlfTkFNRV9FTlRSWSAqbmU7CisJaW50IHJldDsKKwluZSA9IFg1MDlfTkFNRV9FTlRSWV9jcmVhdGVfYnlfTklEKE5VTEwsIG5pZCwgdHlwZSwgYnl0ZXMsIGxlbik7CisJaWYoIW5lKSByZXR1cm4gMDsKKwlyZXQgPSBYNTA5X05BTUVfYWRkX2VudHJ5KG5hbWUsIG5lLCBsb2MsIHNldCk7CisJWDUwOV9OQU1FX0VOVFJZX2ZyZWUobmUpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBYNTA5X05BTUVfYWRkX2VudHJ5X2J5X3R4dChYNTA5X05BTUUgKm5hbWUsIGNvbnN0IGNoYXIgKmZpZWxkLCBpbnQgdHlwZSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzLCBpbnQgbGVuLCBpbnQgbG9jLCBpbnQgc2V0KQoreworCVg1MDlfTkFNRV9FTlRSWSAqbmU7CisJaW50IHJldDsKKwluZSA9IFg1MDlfTkFNRV9FTlRSWV9jcmVhdGVfYnlfdHh0KE5VTEwsIGZpZWxkLCB0eXBlLCBieXRlcywgbGVuKTsKKwlpZighbmUpIHJldHVybiAwOworCXJldCA9IFg1MDlfTkFNRV9hZGRfZW50cnkobmFtZSwgbmUsIGxvYywgc2V0KTsKKwlYNTA5X05BTUVfRU5UUllfZnJlZShuZSk7CisJcmV0dXJuIHJldDsKK30KKworLyogaWYgc2V0IGlzIC0xLCBhcHBlbmQgdG8gcHJldmlvdXMgc2V0LCAwICdhIG5ldyBvbmUnLCBhbmQgMSwKKyAqIHByZXBlbmQgdG8gdGhlIGd1eSB3ZSBhcmUgYWJvdXQgdG8gc3RvbXAgb24uICovCitpbnQgWDUwOV9OQU1FX2FkZF9lbnRyeShYNTA5X05BTUUgKm5hbWUsIFg1MDlfTkFNRV9FTlRSWSAqbmUsIGludCBsb2MsCisJICAgICBpbnQgc2V0KQorCXsKKwlYNTA5X05BTUVfRU5UUlkgKm5ld19uYW1lPU5VTEw7CisJaW50IG4saSxpbmM7CisJU1RBQ0tfT0YoWDUwOV9OQU1FX0VOVFJZKSAqc2s7CisKKwlpZiAobmFtZSA9PSBOVUxMKSByZXR1cm4oMCk7CisJc2s9bmFtZS0+ZW50cmllczsKKwluPXNrX1g1MDlfTkFNRV9FTlRSWV9udW0oc2spOworCWlmIChsb2MgPiBuKSBsb2M9bjsKKwllbHNlIGlmIChsb2MgPCAwKSBsb2M9bjsKKworCW5hbWUtPm1vZGlmaWVkPTE7CisKKwlpZiAoc2V0ID09IC0xKQorCQl7CisJCWlmIChsb2MgPT0gMCkKKwkJCXsKKwkJCXNldD0wOworCQkJaW5jPTE7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCXNldD1za19YNTA5X05BTUVfRU5UUllfdmFsdWUoc2ssbG9jLTEpLT5zZXQ7CisJCQlpbmM9MDsKKwkJCX0KKwkJfQorCWVsc2UgLyogaWYgKHNldCA+PSAwKSAqLworCQl7CisJCWlmIChsb2MgPj0gbikKKwkJCXsKKwkJCWlmIChsb2MgIT0gMCkKKwkJCQlzZXQ9c2tfWDUwOV9OQU1FX0VOVFJZX3ZhbHVlKHNrLGxvYy0xKS0+c2V0KzE7CisJCQllbHNlCisJCQkJc2V0PTA7CisJCQl9CisJCWVsc2UKKwkJCXNldD1za19YNTA5X05BTUVfRU5UUllfdmFsdWUoc2ssbG9jKS0+c2V0OworCQlpbmM9KHNldCA9PSAwKT8xOjA7CisJCX0KKworCWlmICgobmV3X25hbWU9WDUwOV9OQU1FX0VOVFJZX2R1cChuZSkpID09IE5VTEwpCisJCWdvdG8gZXJyOworCW5ld19uYW1lLT5zZXQ9c2V0OworCWlmICghc2tfWDUwOV9OQU1FX0VOVFJZX2luc2VydChzayxuZXdfbmFtZSxsb2MpKQorCQl7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfTkFNRV9hZGRfZW50cnksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJZ290byBlcnI7CisJCX0KKwlpZiAoaW5jKQorCQl7CisJCW49c2tfWDUwOV9OQU1FX0VOVFJZX251bShzayk7CisJCWZvciAoaT1sb2MrMTsgaTxuOyBpKyspCisJCQlza19YNTA5X05BTUVfRU5UUllfdmFsdWUoc2ssaS0xKS0+c2V0Kz0xOworCQl9CQorCXJldHVybigxKTsKK2VycjoKKwlpZiAobmV3X25hbWUgIT0gTlVMTCkKKwkJWDUwOV9OQU1FX0VOVFJZX2ZyZWUobmV3X25hbWUpOworCXJldHVybigwKTsKKwl9CisKK1g1MDlfTkFNRV9FTlRSWSAqWDUwOV9OQU1FX0VOVFJZX2NyZWF0ZV9ieV90eHQoWDUwOV9OQU1FX0VOVFJZICoqbmUsCisJCWNvbnN0IGNoYXIgKmZpZWxkLCBpbnQgdHlwZSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMsIGludCBsZW4pCisJeworCUFTTjFfT0JKRUNUICpvYmo7CisJWDUwOV9OQU1FX0VOVFJZICpuZW50cnk7CisKKwlvYmo9T0JKX3R4dDJvYmooZmllbGQsIDApOworCWlmIChvYmogPT0gTlVMTCkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X05BTUVfRU5UUllfY3JlYXRlX2J5X3R4dCwgWDUwOV9SX0lOVkFMSURfRklFTERfTkFNRSk7CisJCUVSUl9hZGRfZXJyb3JfZGF0YSgyLCAibmFtZT0iLCBmaWVsZCk7CisJCXJldHVybihOVUxMKTsKKwkJfQorCW5lbnRyeSA9IFg1MDlfTkFNRV9FTlRSWV9jcmVhdGVfYnlfT0JKKG5lLG9iaix0eXBlLGJ5dGVzLGxlbik7CisJQVNOMV9PQkpFQ1RfZnJlZShvYmopOworCXJldHVybiBuZW50cnk7CisJfQorCitYNTA5X05BTUVfRU5UUlkgKlg1MDlfTkFNRV9FTlRSWV9jcmVhdGVfYnlfTklEKFg1MDlfTkFNRV9FTlRSWSAqKm5lLCBpbnQgbmlkLAorCSAgICAgaW50IHR5cGUsIHVuc2lnbmVkIGNoYXIgKmJ5dGVzLCBpbnQgbGVuKQorCXsKKwljb25zdCBBU04xX09CSkVDVCAqb2JqOworCVg1MDlfTkFNRV9FTlRSWSAqbmVudHJ5OworCisJb2JqPU9CSl9uaWQyb2JqKG5pZCk7CisJaWYgKG9iaiA9PSBOVUxMKQorCQl7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfTkFNRV9FTlRSWV9jcmVhdGVfYnlfTklELCBYNTA5X1JfVU5LTk9XTl9OSUQpOworCQlyZXR1cm4oTlVMTCk7CisJCX0KKwluZW50cnkgPSBYNTA5X05BTUVfRU5UUllfY3JlYXRlX2J5X09CSihuZSxvYmosdHlwZSxieXRlcyxsZW4pOworCS8qIFRPRE8oZm9yayk6IHJlbW92ZSB0aGlzPyAqLworCS8qIEFTTjFfT0JKRUNUX2ZyZWUob2JqKTsgKi8KKwlyZXR1cm4gbmVudHJ5OworCX0KKworWDUwOV9OQU1FX0VOVFJZICpYNTA5X05BTUVfRU5UUllfY3JlYXRlX2J5X09CSihYNTA5X05BTUVfRU5UUlkgKipuZSwKKwkgICAgIGNvbnN0IEFTTjFfT0JKRUNUICpvYmosIGludCB0eXBlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcywgaW50IGxlbikKKwl7CisJWDUwOV9OQU1FX0VOVFJZICpyZXQ7CisKKwlpZiAoKG5lID09IE5VTEwpIHx8ICgqbmUgPT0gTlVMTCkpCisJCXsKKwkJaWYgKChyZXQ9WDUwOV9OQU1FX0VOVFJZX25ldygpKSA9PSBOVUxMKQorCQkJcmV0dXJuKE5VTEwpOworCQl9CisJZWxzZQorCQlyZXQ9ICpuZTsKKworCWlmICghWDUwOV9OQU1FX0VOVFJZX3NldF9vYmplY3QocmV0LG9iaikpCisJCWdvdG8gZXJyOworCWlmICghWDUwOV9OQU1FX0VOVFJZX3NldF9kYXRhKHJldCx0eXBlLGJ5dGVzLGxlbikpCisJCWdvdG8gZXJyOworCisJaWYgKChuZSAhPSBOVUxMKSAmJiAoKm5lID09IE5VTEwpKSAqbmU9cmV0OworCXJldHVybihyZXQpOworZXJyOgorCWlmICgobmUgPT0gTlVMTCkgfHwgKHJldCAhPSAqbmUpKQorCQlYNTA5X05BTUVfRU5UUllfZnJlZShyZXQpOworCXJldHVybihOVUxMKTsKKwl9CisKK2ludCBYNTA5X05BTUVfRU5UUllfc2V0X29iamVjdChYNTA5X05BTUVfRU5UUlkgKm5lLCBjb25zdCBBU04xX09CSkVDVCAqb2JqKQorCXsKKwlpZiAoKG5lID09IE5VTEwpIHx8IChvYmogPT0gTlVMTCkpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9OQU1FX0VOVFJZX3NldF9vYmplY3QsIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisJCXJldHVybigwKTsKKwkJfQorCUFTTjFfT0JKRUNUX2ZyZWUobmUtPm9iamVjdCk7CisJbmUtPm9iamVjdD1PQkpfZHVwKG9iaik7CisJcmV0dXJuKChuZS0+b2JqZWN0ID09IE5VTEwpPzA6MSk7CisJfQorCitpbnQgWDUwOV9OQU1FX0VOVFJZX3NldF9kYXRhKFg1MDlfTkFNRV9FTlRSWSAqbmUsIGludCB0eXBlLAorCSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMsIGludCBsZW4pCisJeworCWludCBpOworCisJaWYgKChuZSA9PSBOVUxMKSB8fCAoKGJ5dGVzID09IE5VTEwpICYmIChsZW4gIT0gMCkpKSByZXR1cm4oMCk7CisJaWYoKHR5cGUgPiAwKSAmJiAodHlwZSAmIE1CU1RSSU5HX0ZMQUcpKSAKKwkJcmV0dXJuIEFTTjFfU1RSSU5HX3NldF9ieV9OSUQoJm5lLT52YWx1ZSwgYnl0ZXMsCisJCQkJCQlsZW4sIHR5cGUsCisJCQkJCU9CSl9vYmoybmlkKG5lLT5vYmplY3QpKSA/IDEgOiAwOworCWlmIChsZW4gPCAwKSBsZW49c3RybGVuKChjb25zdCBjaGFyICopYnl0ZXMpOworCWk9QVNOMV9TVFJJTkdfc2V0KG5lLT52YWx1ZSxieXRlcyxsZW4pOworCWlmICghaSkgcmV0dXJuKDApOworCWlmICh0eXBlICE9IFZfQVNOMV9VTkRFRikKKwkJeworCQlpZiAodHlwZSA9PSBWX0FTTjFfQVBQX0NIT09TRSkKKwkJCW5lLT52YWx1ZS0+dHlwZT1BU04xX1BSSU5UQUJMRV90eXBlKGJ5dGVzLGxlbik7CisJCWVsc2UKKwkJCW5lLT52YWx1ZS0+dHlwZT10eXBlOworCQl9CisJcmV0dXJuKDEpOworCX0KKworQVNOMV9PQkpFQ1QgKlg1MDlfTkFNRV9FTlRSWV9nZXRfb2JqZWN0KFg1MDlfTkFNRV9FTlRSWSAqbmUpCisJeworCWlmIChuZSA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CisJcmV0dXJuKG5lLT5vYmplY3QpOworCX0KKworQVNOMV9TVFJJTkcgKlg1MDlfTkFNRV9FTlRSWV9nZXRfZGF0YShYNTA5X05BTUVfRU5UUlkgKm5lKQorCXsKKwlpZiAobmUgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOworCXJldHVybihuZS0+dmFsdWUpOworCX0KKwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3g1MDkveDUwOXJzZXQuYyBiL2NyeXB0by94NTA5L3g1MDlyc2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJhYjU1NQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94NTA5L3g1MDlyc2V0LmMKQEAgLTAsMCArMSw4MCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKworCitpbnQgWDUwOV9SRVFfc2V0X3ZlcnNpb24oWDUwOV9SRVEgKngsIGxvbmcgdmVyc2lvbikKKwl7CisJaWYgKHggPT0gTlVMTCkgcmV0dXJuKDApOworCXJldHVybihBU04xX0lOVEVHRVJfc2V0KHgtPnJlcV9pbmZvLT52ZXJzaW9uLHZlcnNpb24pKTsKKwl9CisKK2ludCBYNTA5X1JFUV9zZXRfc3ViamVjdF9uYW1lKFg1MDlfUkVRICp4LCBYNTA5X05BTUUgKm5hbWUpCisJeworCWlmICgoeCA9PSBOVUxMKSB8fCAoeC0+cmVxX2luZm8gPT0gTlVMTCkpIHJldHVybigwKTsKKwlyZXR1cm4oWDUwOV9OQU1FX3NldCgmeC0+cmVxX2luZm8tPnN1YmplY3QsbmFtZSkpOworCX0KKworaW50IFg1MDlfUkVRX3NldF9wdWJrZXkoWDUwOV9SRVEgKngsIEVWUF9QS0VZICpwa2V5KQorCXsKKwlpZiAoKHggPT0gTlVMTCkgfHwgKHgtPnJlcV9pbmZvID09IE5VTEwpKSByZXR1cm4oMCk7CisJcmV0dXJuKFg1MDlfUFVCS0VZX3NldCgmeC0+cmVxX2luZm8tPnB1YmtleSxwa2V5KSk7CisJfQorCmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOS94NTA5c3BraS5jIGIvY3J5cHRvL3g1MDkveDUwOXNwa2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmFkY2I0Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3g1MDkveDUwOXNwa2kuYwpAQCAtMCwwICsxLDExOCBAQAorLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDE5OTkuICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jhc2U2NC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKworCitpbnQgTkVUU0NBUEVfU1BLSV9zZXRfcHVia2V5KE5FVFNDQVBFX1NQS0kgKngsIEVWUF9QS0VZICpwa2V5KQoreworCWlmICgoeCA9PSBOVUxMKSB8fCAoeC0+c3BrYWMgPT0gTlVMTCkpIHJldHVybigwKTsKKwlyZXR1cm4oWDUwOV9QVUJLRVlfc2V0KCYoeC0+c3BrYWMtPnB1YmtleSkscGtleSkpOworfQorCitFVlBfUEtFWSAqTkVUU0NBUEVfU1BLSV9nZXRfcHVia2V5KE5FVFNDQVBFX1NQS0kgKngpCit7CisJaWYgKCh4ID09IE5VTEwpIHx8ICh4LT5zcGthYyA9PSBOVUxMKSkKKwkJcmV0dXJuKE5VTEwpOworCXJldHVybihYNTA5X1BVQktFWV9nZXQoeC0+c3BrYWMtPnB1YmtleSkpOworfQorCisvKiBMb2FkIGEgTmV0c2NhcGUgU1BLSSBmcm9tIGEgYmFzZTY0IGVuY29kZWQgc3RyaW5nICovCisKK05FVFNDQVBFX1NQS0kgKiBORVRTQ0FQRV9TUEtJX2I2NF9kZWNvZGUoY29uc3QgY2hhciAqc3RyLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnNwa2lfZGVyOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CisJaW50IHNwa2lfbGVuOworCU5FVFNDQVBFX1NQS0kgKnNwa2k7CisJaWYobGVuIDw9IDApIGxlbiA9IHN0cmxlbihzdHIpOworCWlmICghKHNwa2lfZGVyID0gT1BFTlNTTF9tYWxsb2MobGVuICsgMSkpKSB7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIE5FVFNDQVBFX1NQS0lfYjY0X2RlY29kZSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJc3BraV9sZW4gPSBFVlBfRGVjb2RlQmxvY2soc3BraV9kZXIsIChjb25zdCB1bnNpZ25lZCBjaGFyICopc3RyLCBsZW4pOworCWlmKHNwa2lfbGVuIDwgMCkgeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBORVRTQ0FQRV9TUEtJX2I2NF9kZWNvZGUsIFg1MDlfUl9CQVNFNjRfREVDT0RFX0VSUk9SKTsKKwkJT1BFTlNTTF9mcmVlKHNwa2lfZGVyKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXAgPSBzcGtpX2RlcjsKKwlzcGtpID0gZDJpX05FVFNDQVBFX1NQS0koTlVMTCwgJnAsIHNwa2lfbGVuKTsKKwlPUEVOU1NMX2ZyZWUoc3BraV9kZXIpOworCXJldHVybiBzcGtpOworfQorCisvKiBHZW5lcmF0ZSBhIGJhc2U2NCBlbmNvZGVkIHN0cmluZyBmcm9tIGFuIFNQS0kgKi8KKworY2hhciAqIE5FVFNDQVBFX1NQS0lfYjY0X2VuY29kZShORVRTQ0FQRV9TUEtJICpzcGtpKQoreworCXVuc2lnbmVkIGNoYXIgKmRlcl9zcGtpLCAqcDsKKwljaGFyICpiNjRfc3RyOworCWludCBkZXJfbGVuOworCWRlcl9sZW4gPSBpMmRfTkVUU0NBUEVfU1BLSShzcGtpLCBOVUxMKTsKKwlkZXJfc3BraSA9IE9QRU5TU0xfbWFsbG9jKGRlcl9sZW4pOworCWI2NF9zdHIgPSBPUEVOU1NMX21hbGxvYyhkZXJfbGVuICogMik7CisJaWYoIWRlcl9zcGtpIHx8ICFiNjRfc3RyKSB7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIE5FVFNDQVBFX1NQS0lfYjY0X2VuY29kZSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcCA9IGRlcl9zcGtpOworCWkyZF9ORVRTQ0FQRV9TUEtJKHNwa2ksICZwKTsKKwlFVlBfRW5jb2RlQmxvY2soKHVuc2lnbmVkIGNoYXIgKiliNjRfc3RyLCBkZXJfc3BraSwgZGVyX2xlbik7CisJT1BFTlNTTF9mcmVlKGRlcl9zcGtpKTsKKwlyZXR1cm4gYjY0X3N0cjsKK30KZGlmZiAtLWdpdCBhL2NyeXB0by94NTA5L3g1MDl0eXBlLmMgYi9jcnlwdG8veDUwOS94NTA5dHlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3Yzc5MzUKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOS94NTA5dHlwZS5jCkBAIC0wLDAgKzEsMTI4IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorCisKK2ludCBYNTA5X2NlcnRpZmljYXRlX3R5cGUoWDUwOSAqeCwgRVZQX1BLRVkgKnBrZXkpCisJeworCUVWUF9QS0VZICpwazsKKwlpbnQgcmV0PTAsaTsKKworCWlmICh4ID09IE5VTEwpIHJldHVybigwKTsKKworCWlmIChwa2V5ID09IE5VTEwpCisJCXBrPVg1MDlfZ2V0X3B1YmtleSh4KTsKKwllbHNlCisJCXBrPXBrZXk7CisKKwlpZiAocGsgPT0gTlVMTCkgcmV0dXJuKDApOworCisJc3dpdGNoIChway0+dHlwZSkKKwkJeworCWNhc2UgRVZQX1BLRVlfUlNBOgorCQlyZXQ9RVZQX1BLX1JTQXxFVlBfUEtUX1NJR047CisvKgkJaWYgKCFzaWduIG9ubHkgZXh0ZW5zaW9uKSAqLworCQkJcmV0fD1FVlBfUEtUX0VOQzsKKwlicmVhazsKKwljYXNlIEVWUF9QS0VZX0RTQToKKwkJcmV0PUVWUF9QS19EU0F8RVZQX1BLVF9TSUdOOworCQlicmVhazsKKwljYXNlIEVWUF9QS0VZX0VDOgorCQlyZXQ9RVZQX1BLX0VDfEVWUF9QS1RfU0lHTnxFVlBfUEtUX0VYQ0g7CisJCWJyZWFrOworCWNhc2UgRVZQX1BLRVlfREg6CisJCXJldD1FVlBfUEtfREh8RVZQX1BLVF9FWENIOworCQlicmVhazsJCisJY2FzZSBOSURfaWRfR29zdFIzNDEwXzk0OgorCWNhc2UgTklEX2lkX0dvc3RSMzQxMF8yMDAxOgorCQlyZXQ9RVZQX1BLVF9FWENIfEVWUF9QS1RfU0lHTjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJCX0KKworCWk9T0JKX29iajJuaWQoeC0+c2lnX2FsZy0+YWxnb3JpdGhtKTsKKwlpZiAoaSAmJiBPQkpfZmluZF9zaWdpZF9hbGdzKGksIE5VTEwsICZpKSkKKwkJeworCisJCXN3aXRjaCAoaSkKKwkJCXsKKwkJY2FzZSBOSURfcnNhRW5jcnlwdGlvbjoKKwkJY2FzZSBOSURfcnNhOgorCQkJcmV0fD1FVlBfUEtTX1JTQTsKKwkJCWJyZWFrOworCQljYXNlIE5JRF9kc2E6CisJCWNhc2UgTklEX2RzYV8yOgorCQkJcmV0fD1FVlBfUEtTX0RTQTsKKwkJCWJyZWFrOworCQljYXNlIE5JRF9YOV82Ml9pZF9lY1B1YmxpY0tleToKKwkJCXJldHw9RVZQX1BLU19FQzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCQl9CisJCX0KKworCWlmIChFVlBfUEtFWV9zaXplKHBrKSA8PSAxMDI0LzgpLyogLzggYmVjYXVzZSBpdCdzIDEwMjQgYml0cyB3ZSBsb29rCisJCQkJCSAgIGZvciwgbm90IGJ5dGVzICovCisJCXJldHw9RVZQX1BLVF9FWFA7CisJaWYocGtleT09TlVMTCkgRVZQX1BLRVlfZnJlZShwayk7CisJcmV0dXJuKHJldCk7CisJfQorCmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOS94X2FsZ29yLmMgYi9jcnlwdG8veDUwOS94X2FsZ29yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM4YjBmMwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94NTA5L3hfYWxnb3IuYwpAQCAtMCwwICsxLDE0MiBAQAorLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDAuICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2RpZ2VzdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqLmg+CisKKworQVNOMV9TRVFVRU5DRShYNTA5X0FMR09SKSA9IHsKKwlBU04xX1NJTVBMRShYNTA5X0FMR09SLCBhbGdvcml0aG0sIEFTTjFfT0JKRUNUKSwKKwlBU04xX09QVChYNTA5X0FMR09SLCBwYXJhbWV0ZXIsIEFTTjFfQU5ZKQorfSBBU04xX1NFUVVFTkNFX0VORChYNTA5X0FMR09SKQorCitBU04xX0lURU1fVEVNUExBVEUoWDUwOV9BTEdPUlMpID0gCisJQVNOMV9FWF9URU1QTEFURV9UWVBFKEFTTjFfVEZMR19TRVFVRU5DRV9PRiwgMCwgYWxnb3JpdGhtcywgWDUwOV9BTEdPUikKK0FTTjFfSVRFTV9URU1QTEFURV9FTkQoWDUwOV9BTEdPUlMpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhYNTA5X0FMR09SKQorSU1QTEVNRU5UX0FTTjFfRU5DT0RFX0ZVTkNUSU9OU19mbmFtZShYNTA5X0FMR09SUywgWDUwOV9BTEdPUlMsIFg1MDlfQUxHT1JTKQorSU1QTEVNRU5UX0FTTjFfRFVQX0ZVTkNUSU9OKFg1MDlfQUxHT1IpCisKK0lNUExFTUVOVF9BU04xX1NFVF9PRihYNTA5X0FMR09SKQorCitpbnQgWDUwOV9BTEdPUl9zZXQwKFg1MDlfQUxHT1IgKmFsZywgY29uc3QgQVNOMV9PQkpFQ1QgKmFvYmosIGludCBwdHlwZSwgdm9pZCAqcHZhbCkKKwl7CisJaWYgKCFhbGcpCisJCXJldHVybiAwOworCWlmIChwdHlwZSAhPSBWX0FTTjFfVU5ERUYpCisJCXsKKwkJaWYgKGFsZy0+cGFyYW1ldGVyID09IE5VTEwpCisJCQlhbGctPnBhcmFtZXRlciA9IEFTTjFfVFlQRV9uZXcoKTsKKwkJaWYgKGFsZy0+cGFyYW1ldGVyID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKwkJfQorCWlmIChhbGcpCisJCXsKKwkJaWYgKGFsZy0+YWxnb3JpdGhtKQorCQkJQVNOMV9PQkpFQ1RfZnJlZShhbGctPmFsZ29yaXRobSk7CisJCWFsZy0+YWxnb3JpdGhtID0gKEFTTjFfT0JKRUNUKikgYW9iajsKKwkJfQorCWlmIChwdHlwZSA9PSAwKQorCQlyZXR1cm4gMTsJCisJaWYgKHB0eXBlID09IFZfQVNOMV9VTkRFRikKKwkJeworCQlpZiAoYWxnLT5wYXJhbWV0ZXIpCisJCQl7CisJCQlBU04xX1RZUEVfZnJlZShhbGctPnBhcmFtZXRlcik7CisJCQlhbGctPnBhcmFtZXRlciA9IE5VTEw7CisJCQl9CisJCX0KKwllbHNlCisJCUFTTjFfVFlQRV9zZXQoYWxnLT5wYXJhbWV0ZXIsIHB0eXBlLCBwdmFsKTsKKwlyZXR1cm4gMTsKKwl9CisKK3ZvaWQgWDUwOV9BTEdPUl9nZXQwKEFTTjFfT0JKRUNUICoqcGFvYmosIGludCAqcHB0eXBlLCB2b2lkICoqcHB2YWwsCisJCQkJCQlYNTA5X0FMR09SICphbGdvcikKKwl7CisJaWYgKHBhb2JqKQorCQkqcGFvYmogPSBhbGdvci0+YWxnb3JpdGhtOworCWlmIChwcHR5cGUpCisJCXsKKwkJaWYgKGFsZ29yLT5wYXJhbWV0ZXIgPT0gTlVMTCkKKwkJCXsKKwkJCSpwcHR5cGUgPSBWX0FTTjFfVU5ERUY7CisJCQlyZXR1cm47CisJCQl9CisJCWVsc2UKKwkJCSpwcHR5cGUgPSBhbGdvci0+cGFyYW1ldGVyLT50eXBlOworCQlpZiAocHB2YWwpCisJCQkqcHB2YWwgPSBhbGdvci0+cGFyYW1ldGVyLT52YWx1ZS5wdHI7CisJCX0KKwl9CisKKy8qIFNldCB1cCBhbiBYNTA5X0FMR09SIERpZ2VzdEFsZ29yaXRobUlkZW50aWZpZXIgZnJvbSBhbiBFVlBfTUQgKi8KKwordm9pZCBYNTA5X0FMR09SX3NldF9tZChYNTA5X0FMR09SICphbGcsIGNvbnN0IEVWUF9NRCAqbWQpCisJeworCWludCBwYXJhbV90eXBlOworCisJaWYgKEVWUF9NRF9mbGFncyhtZCkgJiBFVlBfTURfRkxBR19ESUdBTEdJRF9BQlNFTlQpCisJCXBhcmFtX3R5cGUgPSBWX0FTTjFfVU5ERUY7CisJZWxzZQorCQlwYXJhbV90eXBlID0gVl9BU04xX05VTEw7CisKKwlYNTA5X0FMR09SX3NldDAoYWxnLCBPQkpfbmlkMm9iaihFVlBfTURfdHlwZShtZCkpLCBwYXJhbV90eXBlLCBOVUxMKTsKKworCX0KZGlmZiAtLWdpdCBhL2NyeXB0by94NTA5L3hfYWxsLmMgYi9jcnlwdG8veDUwOS94X2FsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZTM1ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOS94X2FsbC5jCkBAIC0wLDAgKzEsNTQ3IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9idWYuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2RpZ2VzdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZHNhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3RhY2suaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKworCitleHRlcm4gY29uc3QgQVNOMV9JVEVNIFJTQVByaXZhdGVLZXlfaXQ7CitleHRlcm4gY29uc3QgQVNOMV9JVEVNIFJTQVB1YmxpY0tleV9pdDsKKworaW50IFg1MDlfdmVyaWZ5KFg1MDkgKmEsIEVWUF9QS0VZICpyKQorCXsKKwlyZXR1cm4oQVNOMV9pdGVtX3ZlcmlmeShBU04xX0lURU1fcnB0cihYNTA5X0NJTkYpLGEtPnNpZ19hbGcsCisJCWEtPnNpZ25hdHVyZSxhLT5jZXJ0X2luZm8scikpOworCX0KKworaW50IFg1MDlfUkVRX3ZlcmlmeShYNTA5X1JFUSAqYSwgRVZQX1BLRVkgKnIpCisJeworCXJldHVybiggQVNOMV9pdGVtX3ZlcmlmeShBU04xX0lURU1fcnB0cihYNTA5X1JFUV9JTkZPKSwKKwkJYS0+c2lnX2FsZyxhLT5zaWduYXR1cmUsYS0+cmVxX2luZm8scikpOworCX0KKworaW50IFg1MDlfc2lnbihYNTA5ICp4LCBFVlBfUEtFWSAqcGtleSwgY29uc3QgRVZQX01EICptZCkKKwl7CisJeC0+Y2VydF9pbmZvLT5lbmMubW9kaWZpZWQgPSAxOworCXJldHVybihBU04xX2l0ZW1fc2lnbihBU04xX0lURU1fcnB0cihYNTA5X0NJTkYpLCB4LT5jZXJ0X2luZm8tPnNpZ25hdHVyZSwKKwkJeC0+c2lnX2FsZywgeC0+c2lnbmF0dXJlLCB4LT5jZXJ0X2luZm8scGtleSxtZCkpOworCX0KKworaW50IFg1MDlfc2lnbl9jdHgoWDUwOSAqeCwgRVZQX01EX0NUWCAqY3R4KQorCXsKKwl4LT5jZXJ0X2luZm8tPmVuYy5tb2RpZmllZCA9IDE7CisJcmV0dXJuIEFTTjFfaXRlbV9zaWduX2N0eChBU04xX0lURU1fcnB0cihYNTA5X0NJTkYpLAorCQl4LT5jZXJ0X2luZm8tPnNpZ25hdHVyZSwKKwkJeC0+c2lnX2FsZywgeC0+c2lnbmF0dXJlLCB4LT5jZXJ0X2luZm8sIGN0eCk7CisJfQorCisvKiBUT0RPKGZvcmspCitpbnQgWDUwOV9odHRwX25iaW8oT0NTUF9SRVFfQ1RYICpyY3R4LCBYNTA5ICoqcGNlcnQpCisJeworCXJldHVybiBPQ1NQX1JFUV9DVFhfbmJpb19kMmkocmN0eCwKKwkJCQkoQVNOMV9WQUxVRSAqKilwY2VydCwgQVNOMV9JVEVNX3JwdHIoWDUwOSkpOworCX0KKyovCisKK2ludCBYNTA5X1JFUV9zaWduKFg1MDlfUkVRICp4LCBFVlBfUEtFWSAqcGtleSwgY29uc3QgRVZQX01EICptZCkKKwl7CisJcmV0dXJuKEFTTjFfaXRlbV9zaWduKEFTTjFfSVRFTV9ycHRyKFg1MDlfUkVRX0lORk8pLHgtPnNpZ19hbGcsIE5VTEwsCisJCXgtPnNpZ25hdHVyZSwgeC0+cmVxX2luZm8scGtleSxtZCkpOworCX0KKworaW50IFg1MDlfUkVRX3NpZ25fY3R4KFg1MDlfUkVRICp4LCBFVlBfTURfQ1RYICpjdHgpCisJeworCXJldHVybiBBU04xX2l0ZW1fc2lnbl9jdHgoQVNOMV9JVEVNX3JwdHIoWDUwOV9SRVFfSU5GTyksCisJCXgtPnNpZ19hbGcsIE5VTEwsIHgtPnNpZ25hdHVyZSwgeC0+cmVxX2luZm8sIGN0eCk7CisJfQorCitpbnQgWDUwOV9DUkxfc2lnbihYNTA5X0NSTCAqeCwgRVZQX1BLRVkgKnBrZXksIGNvbnN0IEVWUF9NRCAqbWQpCisJeworCXgtPmNybC0+ZW5jLm1vZGlmaWVkID0gMTsKKwlyZXR1cm4oQVNOMV9pdGVtX3NpZ24oQVNOMV9JVEVNX3JwdHIoWDUwOV9DUkxfSU5GTykseC0+Y3JsLT5zaWdfYWxnLAorCQl4LT5zaWdfYWxnLCB4LT5zaWduYXR1cmUsIHgtPmNybCxwa2V5LG1kKSk7CisJfQorCitpbnQgWDUwOV9DUkxfc2lnbl9jdHgoWDUwOV9DUkwgKngsIEVWUF9NRF9DVFggKmN0eCkKKwl7CisJeC0+Y3JsLT5lbmMubW9kaWZpZWQgPSAxOworCXJldHVybiBBU04xX2l0ZW1fc2lnbl9jdHgoQVNOMV9JVEVNX3JwdHIoWDUwOV9DUkxfSU5GTyksCisJCXgtPmNybC0+c2lnX2FsZywgeC0+c2lnX2FsZywgeC0+c2lnbmF0dXJlLCB4LT5jcmwsIGN0eCk7CisJfQorCisvKiBUT0RPKGZvcmspCitpbnQgWDUwOV9DUkxfaHR0cF9uYmlvKE9DU1BfUkVRX0NUWCAqcmN0eCwgWDUwOV9DUkwgKipwY3JsKQorCXsKKwlyZXR1cm4gT0NTUF9SRVFfQ1RYX25iaW9fZDJpKHJjdHgsCisJCQkJKEFTTjFfVkFMVUUgKiopcGNybCwgQVNOMV9JVEVNX3JwdHIoWDUwOV9DUkwpKTsKKwl9CisqLworCitpbnQgTkVUU0NBUEVfU1BLSV9zaWduKE5FVFNDQVBFX1NQS0kgKngsIEVWUF9QS0VZICpwa2V5LCBjb25zdCBFVlBfTUQgKm1kKQorCXsKKwlyZXR1cm4oQVNOMV9pdGVtX3NpZ24oQVNOMV9JVEVNX3JwdHIoTkVUU0NBUEVfU1BLQUMpLCB4LT5zaWdfYWxnb3IsTlVMTCwKKwkJeC0+c2lnbmF0dXJlLCB4LT5zcGthYyxwa2V5LG1kKSk7CisJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitYNTA5ICpkMmlfWDUwOV9mcChGSUxFICpmcCwgWDUwOSAqKng1MDkpCisJeworCXJldHVybiBBU04xX2l0ZW1fZDJpX2ZwKEFTTjFfSVRFTV9ycHRyKFg1MDkpLCBmcCwgeDUwOSk7CisJfQorCitpbnQgaTJkX1g1MDlfZnAoRklMRSAqZnAsIFg1MDkgKng1MDkpCisJeworCXJldHVybiBBU04xX2l0ZW1faTJkX2ZwKEFTTjFfSVRFTV9ycHRyKFg1MDkpLCBmcCwgeDUwOSk7CisJfQorI2VuZGlmCisKK1g1MDkgKmQyaV9YNTA5X2JpbyhCSU8gKmJwLCBYNTA5ICoqeDUwOSkKKwl7CisJcmV0dXJuIEFTTjFfaXRlbV9kMmlfYmlvKEFTTjFfSVRFTV9ycHRyKFg1MDkpLCBicCwgeDUwOSk7CisJfQorCitpbnQgaTJkX1g1MDlfYmlvKEJJTyAqYnAsIFg1MDkgKng1MDkpCisJeworCXJldHVybiBBU04xX2l0ZW1faTJkX2JpbyhBU04xX0lURU1fcnB0cihYNTA5KSwgYnAsIHg1MDkpOworCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQorWDUwOV9DUkwgKmQyaV9YNTA5X0NSTF9mcChGSUxFICpmcCwgWDUwOV9DUkwgKipjcmwpCisJeworCXJldHVybiBBU04xX2l0ZW1fZDJpX2ZwKEFTTjFfSVRFTV9ycHRyKFg1MDlfQ1JMKSwgZnAsIGNybCk7CisJfQorCitpbnQgaTJkX1g1MDlfQ1JMX2ZwKEZJTEUgKmZwLCBYNTA5X0NSTCAqY3JsKQorCXsKKwlyZXR1cm4gQVNOMV9pdGVtX2kyZF9mcChBU04xX0lURU1fcnB0cihYNTA5X0NSTCksIGZwLCBjcmwpOworCX0KKyNlbmRpZgorCitYNTA5X0NSTCAqZDJpX1g1MDlfQ1JMX2JpbyhCSU8gKmJwLCBYNTA5X0NSTCAqKmNybCkKKwl7CisJcmV0dXJuIEFTTjFfaXRlbV9kMmlfYmlvKEFTTjFfSVRFTV9ycHRyKFg1MDlfQ1JMKSwgYnAsIGNybCk7CisJfQorCitpbnQgaTJkX1g1MDlfQ1JMX2JpbyhCSU8gKmJwLCBYNTA5X0NSTCAqY3JsKQorCXsKKwlyZXR1cm4gQVNOMV9pdGVtX2kyZF9iaW8oQVNOMV9JVEVNX3JwdHIoWDUwOV9DUkwpLCBicCwgY3JsKTsKKwl9CisKKy8qIFRPRE8oZm9yaykgKi8KKyNpZiAwCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitQS0NTNyAqZDJpX1BLQ1M3X2ZwKEZJTEUgKmZwLCBQS0NTNyAqKnA3KQorCXsKKwlyZXR1cm4gQVNOMV9pdGVtX2QyaV9mcChBU04xX0lURU1fcnB0cihQS0NTNyksIGZwLCBwNyk7CisJfQorCitpbnQgaTJkX1BLQ1M3X2ZwKEZJTEUgKmZwLCBQS0NTNyAqcDcpCisJeworCXJldHVybiBBU04xX2l0ZW1faTJkX2ZwKEFTTjFfSVRFTV9ycHRyKFBLQ1M3KSwgZnAsIHA3KTsKKwl9CisjZW5kaWYKKworUEtDUzcgKmQyaV9QS0NTN19iaW8oQklPICpicCwgUEtDUzcgKipwNykKKwl7CisJcmV0dXJuIEFTTjFfaXRlbV9kMmlfYmlvKEFTTjFfSVRFTV9ycHRyKFBLQ1M3KSwgYnAsIHA3KTsKKwl9CisKK2ludCBpMmRfUEtDUzdfYmlvKEJJTyAqYnAsIFBLQ1M3ICpwNykKKwl7CisJcmV0dXJuIEFTTjFfaXRlbV9pMmRfYmlvKEFTTjFfSVRFTV9ycHRyKFBLQ1M3KSwgYnAsIHA3KTsKKwl9CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQorWDUwOV9SRVEgKmQyaV9YNTA5X1JFUV9mcChGSUxFICpmcCwgWDUwOV9SRVEgKipyZXEpCisJeworCXJldHVybiBBU04xX2l0ZW1fZDJpX2ZwKEFTTjFfSVRFTV9ycHRyKFg1MDlfUkVRKSwgZnAsIHJlcSk7CisJfQorCitpbnQgaTJkX1g1MDlfUkVRX2ZwKEZJTEUgKmZwLCBYNTA5X1JFUSAqcmVxKQorCXsKKwlyZXR1cm4gQVNOMV9pdGVtX2kyZF9mcChBU04xX0lURU1fcnB0cihYNTA5X1JFUSksIGZwLCByZXEpOworCX0KKyNlbmRpZgorCitYNTA5X1JFUSAqZDJpX1g1MDlfUkVRX2JpbyhCSU8gKmJwLCBYNTA5X1JFUSAqKnJlcSkKKwl7CisJcmV0dXJuIEFTTjFfaXRlbV9kMmlfYmlvKEFTTjFfSVRFTV9ycHRyKFg1MDlfUkVRKSwgYnAsIHJlcSk7CisJfQorCitpbnQgaTJkX1g1MDlfUkVRX2JpbyhCSU8gKmJwLCBYNTA5X1JFUSAqcmVxKQorCXsKKwlyZXR1cm4gQVNOMV9pdGVtX2kyZF9iaW8oQVNOMV9JVEVNX3JwdHIoWDUwOV9SRVEpLCBicCwgcmVxKTsKKwl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKworI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQorUlNBICpkMmlfUlNBUHJpdmF0ZUtleV9mcChGSUxFICpmcCwgUlNBICoqcnNhKQorCXsKKwlyZXR1cm4gQVNOMV9pdGVtX2QyaV9mcChBU04xX0lURU1fcnB0cihSU0FQcml2YXRlS2V5KSwgZnAsIHJzYSk7CisJfQorCitpbnQgaTJkX1JTQVByaXZhdGVLZXlfZnAoRklMRSAqZnAsIFJTQSAqcnNhKQorCXsKKwlyZXR1cm4gQVNOMV9pdGVtX2kyZF9mcChBU04xX0lURU1fcnB0cihSU0FQcml2YXRlS2V5KSwgZnAsIHJzYSk7CisJfQorCitSU0EgKmQyaV9SU0FQdWJsaWNLZXlfZnAoRklMRSAqZnAsIFJTQSAqKnJzYSkKKwl7CisJcmV0dXJuIEFTTjFfaXRlbV9kMmlfZnAoQVNOMV9JVEVNX3JwdHIoUlNBUHVibGljS2V5KSwgZnAsIHJzYSk7CisJfQorCisKK1JTQSAqZDJpX1JTQV9QVUJLRVlfZnAoRklMRSAqZnAsIFJTQSAqKnJzYSkKKwl7CisJcmV0dXJuIEFTTjFfZDJpX2ZwKCh2b2lkICooKikodm9pZCkpCisJCQkgICBSU0FfbmV3LChEMklfT0Yodm9pZCkpZDJpX1JTQV9QVUJLRVksIGZwLAorCQkJICAgKHZvaWQgKiopcnNhKTsKKwl9CisKK2ludCBpMmRfUlNBUHVibGljS2V5X2ZwKEZJTEUgKmZwLCBSU0EgKnJzYSkKKwl7CisJcmV0dXJuIEFTTjFfaXRlbV9pMmRfZnAoQVNOMV9JVEVNX3JwdHIoUlNBUHVibGljS2V5KSwgZnAsIHJzYSk7CisJfQorCitpbnQgaTJkX1JTQV9QVUJLRVlfZnAoRklMRSAqZnAsIFJTQSAqcnNhKQorCXsKKwlyZXR1cm4gQVNOMV9pMmRfZnAoKEkyRF9PRl9jb25zdCh2b2lkKSlpMmRfUlNBX1BVQktFWSxmcCxyc2EpOworCX0KKyNlbmRpZgorCitSU0EgKmQyaV9SU0FQcml2YXRlS2V5X2JpbyhCSU8gKmJwLCBSU0EgKipyc2EpCisJeworCXJldHVybiBBU04xX2l0ZW1fZDJpX2JpbyhBU04xX0lURU1fcnB0cihSU0FQcml2YXRlS2V5KSwgYnAsIHJzYSk7CisJfQorCitpbnQgaTJkX1JTQVByaXZhdGVLZXlfYmlvKEJJTyAqYnAsIFJTQSAqcnNhKQorCXsKKwlyZXR1cm4gQVNOMV9pdGVtX2kyZF9iaW8oQVNOMV9JVEVNX3JwdHIoUlNBUHJpdmF0ZUtleSksIGJwLCByc2EpOworCX0KKworUlNBICpkMmlfUlNBUHVibGljS2V5X2JpbyhCSU8gKmJwLCBSU0EgKipyc2EpCisJeworCXJldHVybiBBU04xX2l0ZW1fZDJpX2JpbyhBU04xX0lURU1fcnB0cihSU0FQdWJsaWNLZXkpLCBicCwgcnNhKTsKKwl9CisKKworUlNBICpkMmlfUlNBX1BVQktFWV9iaW8oQklPICpicCwgUlNBICoqcnNhKQorCXsKKwlyZXR1cm4gQVNOMV9kMmlfYmlvX29mKFJTQSxSU0FfbmV3LGQyaV9SU0FfUFVCS0VZLGJwLHJzYSk7CisJfQorCitpbnQgaTJkX1JTQVB1YmxpY0tleV9iaW8oQklPICpicCwgUlNBICpyc2EpCisJeworCXJldHVybiBBU04xX2l0ZW1faTJkX2JpbyhBU04xX0lURU1fcnB0cihSU0FQdWJsaWNLZXkpLCBicCwgcnNhKTsKKwl9CisKK2ludCBpMmRfUlNBX1BVQktFWV9iaW8oQklPICpicCwgUlNBICpyc2EpCisJeworCXJldHVybiBBU04xX2kyZF9iaW9fb2ZfY29uc3QoUlNBLGkyZF9SU0FfUFVCS0VZLGJwLHJzYSk7CisJfQorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKK0RTQSAqZDJpX0RTQVByaXZhdGVLZXlfZnAoRklMRSAqZnAsIERTQSAqKmRzYSkKKwl7CisJcmV0dXJuIEFTTjFfZDJpX2ZwX29mKERTQSxEU0FfbmV3LGQyaV9EU0FQcml2YXRlS2V5LGZwLGRzYSk7CisJfQorCitpbnQgaTJkX0RTQVByaXZhdGVLZXlfZnAoRklMRSAqZnAsIERTQSAqZHNhKQorCXsKKwlyZXR1cm4gQVNOMV9pMmRfZnBfb2ZfY29uc3QoRFNBLGkyZF9EU0FQcml2YXRlS2V5LGZwLGRzYSk7CisJfQorCitEU0EgKmQyaV9EU0FfUFVCS0VZX2ZwKEZJTEUgKmZwLCBEU0EgKipkc2EpCisJeworCXJldHVybiBBU04xX2QyaV9mcF9vZihEU0EsRFNBX25ldyxkMmlfRFNBX1BVQktFWSxmcCxkc2EpOworCX0KKworaW50IGkyZF9EU0FfUFVCS0VZX2ZwKEZJTEUgKmZwLCBEU0EgKmRzYSkKKwl7CisJcmV0dXJuIEFTTjFfaTJkX2ZwX29mX2NvbnN0KERTQSxpMmRfRFNBX1BVQktFWSxmcCxkc2EpOworCX0KKyNlbmRpZgorCitEU0EgKmQyaV9EU0FQcml2YXRlS2V5X2JpbyhCSU8gKmJwLCBEU0EgKipkc2EpCisJeworCXJldHVybiBBU04xX2QyaV9iaW9fb2YoRFNBLERTQV9uZXcsZDJpX0RTQVByaXZhdGVLZXksYnAsZHNhCispOworCX0KKworaW50IGkyZF9EU0FQcml2YXRlS2V5X2JpbyhCSU8gKmJwLCBEU0EgKmRzYSkKKwl7CisJcmV0dXJuIEFTTjFfaTJkX2Jpb19vZl9jb25zdChEU0EsaTJkX0RTQVByaXZhdGVLZXksYnAsZHNhKTsKKwl9CisKK0RTQSAqZDJpX0RTQV9QVUJLRVlfYmlvKEJJTyAqYnAsIERTQSAqKmRzYSkKKwl7CisJcmV0dXJuIEFTTjFfZDJpX2Jpb19vZihEU0EsRFNBX25ldyxkMmlfRFNBX1BVQktFWSxicCxkc2EpOworCX0KKworaW50IGkyZF9EU0FfUFVCS0VZX2JpbyhCSU8gKmJwLCBEU0EgKmRzYSkKKwl7CisJcmV0dXJuIEFTTjFfaTJkX2Jpb19vZl9jb25zdChEU0EsaTJkX0RTQV9QVUJLRVksYnAsZHNhKTsKKwl9CisKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fRUMKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKK0VDX0tFWSAqZDJpX0VDX1BVQktFWV9mcChGSUxFICpmcCwgRUNfS0VZICoqZWNrZXkpCisJeworCXJldHVybiBBU04xX2QyaV9mcF9vZihFQ19LRVksRUNfS0VZX25ldyxkMmlfRUNfUFVCS0VZLGZwLGVja2V5KTsKKwl9CisgIAoraW50IGkyZF9FQ19QVUJLRVlfZnAoRklMRSAqZnAsIEVDX0tFWSAqZWNrZXkpCisJeworCXJldHVybiBBU04xX2kyZF9mcF9vZl9jb25zdChFQ19LRVksaTJkX0VDX1BVQktFWSxmcCxlY2tleSk7CisJfQorCitFQ19LRVkgKmQyaV9FQ1ByaXZhdGVLZXlfZnAoRklMRSAqZnAsIEVDX0tFWSAqKmVja2V5KQorCXsKKwlyZXR1cm4gQVNOMV9kMmlfZnBfb2YoRUNfS0VZLEVDX0tFWV9uZXcsZDJpX0VDUHJpdmF0ZUtleSxmcCxlY2tleSk7CisJfQorICAKK2ludCBpMmRfRUNQcml2YXRlS2V5X2ZwKEZJTEUgKmZwLCBFQ19LRVkgKmVja2V5KQorCXsKKwlyZXR1cm4gQVNOMV9pMmRfZnBfb2ZfY29uc3QoRUNfS0VZLGkyZF9FQ1ByaXZhdGVLZXksZnAsZWNrZXkpOworCX0KKyNlbmRpZgorRUNfS0VZICpkMmlfRUNfUFVCS0VZX2JpbyhCSU8gKmJwLCBFQ19LRVkgKiplY2tleSkKKwl7CisJcmV0dXJuIEFTTjFfZDJpX2Jpb19vZihFQ19LRVksRUNfS0VZX25ldyxkMmlfRUNfUFVCS0VZLGJwLGVja2V5KTsKKwl9CisgIAoraW50IGkyZF9FQ19QVUJLRVlfYmlvKEJJTyAqYnAsIEVDX0tFWSAqZWNkc2EpCisJeworCXJldHVybiBBU04xX2kyZF9iaW9fb2ZfY29uc3QoRUNfS0VZLGkyZF9FQ19QVUJLRVksYnAsZWNkc2EpOworCX0KKworRUNfS0VZICpkMmlfRUNQcml2YXRlS2V5X2JpbyhCSU8gKmJwLCBFQ19LRVkgKiplY2tleSkKKwl7CisJcmV0dXJuIEFTTjFfZDJpX2Jpb19vZihFQ19LRVksRUNfS0VZX25ldyxkMmlfRUNQcml2YXRlS2V5LGJwLGVja2V5KTsKKwl9CisgIAoraW50IGkyZF9FQ1ByaXZhdGVLZXlfYmlvKEJJTyAqYnAsIEVDX0tFWSAqZWNrZXkpCisJeworCXJldHVybiBBU04xX2kyZF9iaW9fb2ZfY29uc3QoRUNfS0VZLGkyZF9FQ1ByaXZhdGVLZXksYnAsZWNrZXkpOworCX0KKyNlbmRpZgorCisKK2ludCBYNTA5X3B1YmtleV9kaWdlc3QoY29uc3QgWDUwOSAqZGF0YSwgY29uc3QgRVZQX01EICp0eXBlLCB1bnNpZ25lZCBjaGFyICptZCwKKwkgICAgIHVuc2lnbmVkIGludCAqbGVuKQorCXsKKwlBU04xX0JJVF9TVFJJTkcgKmtleTsKKwlrZXkgPSBYNTA5X2dldDBfcHVia2V5X2JpdHN0cihkYXRhKTsKKwlpZigha2V5KSByZXR1cm4gMDsKKwlyZXR1cm4gRVZQX0RpZ2VzdChrZXktPmRhdGEsIGtleS0+bGVuZ3RoLCBtZCwgbGVuLCB0eXBlLCBOVUxMKTsKKwl9CisKK2ludCBYNTA5X2RpZ2VzdChjb25zdCBYNTA5ICpkYXRhLCBjb25zdCBFVlBfTUQgKnR5cGUsIHVuc2lnbmVkIGNoYXIgKm1kLAorCSAgICAgdW5zaWduZWQgaW50ICpsZW4pCisJeworCXJldHVybihBU04xX2l0ZW1fZGlnZXN0KEFTTjFfSVRFTV9ycHRyKFg1MDkpLHR5cGUsKGNoYXIgKilkYXRhLG1kLGxlbikpOworCX0KKworaW50IFg1MDlfQ1JMX2RpZ2VzdChjb25zdCBYNTA5X0NSTCAqZGF0YSwgY29uc3QgRVZQX01EICp0eXBlLCB1bnNpZ25lZCBjaGFyICptZCwKKwkgICAgIHVuc2lnbmVkIGludCAqbGVuKQorCXsKKwlyZXR1cm4oQVNOMV9pdGVtX2RpZ2VzdChBU04xX0lURU1fcnB0cihYNTA5X0NSTCksdHlwZSwoY2hhciAqKWRhdGEsbWQsbGVuKSk7CisJfQorCitpbnQgWDUwOV9SRVFfZGlnZXN0KGNvbnN0IFg1MDlfUkVRICpkYXRhLCBjb25zdCBFVlBfTUQgKnR5cGUsIHVuc2lnbmVkIGNoYXIgKm1kLAorCSAgICAgdW5zaWduZWQgaW50ICpsZW4pCisJeworCXJldHVybihBU04xX2l0ZW1fZGlnZXN0KEFTTjFfSVRFTV9ycHRyKFg1MDlfUkVRKSx0eXBlLChjaGFyICopZGF0YSxtZCxsZW4pKTsKKwl9CisKK2ludCBYNTA5X05BTUVfZGlnZXN0KGNvbnN0IFg1MDlfTkFNRSAqZGF0YSwgY29uc3QgRVZQX01EICp0eXBlLCB1bnNpZ25lZCBjaGFyICptZCwKKwkgICAgIHVuc2lnbmVkIGludCAqbGVuKQorCXsKKwlyZXR1cm4oQVNOMV9pdGVtX2RpZ2VzdChBU04xX0lURU1fcnB0cihYNTA5X05BTUUpLHR5cGUsKGNoYXIgKilkYXRhLG1kLGxlbikpOworCX0KKworI2lmIDAgLyogVE9ETyhmb3JrKTogcmVtb3ZlICovCitpbnQgUEtDUzdfSVNTVUVSX0FORF9TRVJJQUxfZGlnZXN0KFBLQ1M3X0lTU1VFUl9BTkRfU0VSSUFMICpkYXRhLCBjb25zdCBFVlBfTUQgKnR5cGUsCisJICAgICB1bnNpZ25lZCBjaGFyICptZCwgdW5zaWduZWQgaW50ICpsZW4pCisJeworCXJldHVybihBU04xX2l0ZW1fZGlnZXN0KEFTTjFfSVRFTV9ycHRyKFBLQ1M3X0lTU1VFUl9BTkRfU0VSSUFMKSx0eXBlLAorCQkoY2hhciAqKWRhdGEsbWQsbGVuKSk7CisJfQorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKK1g1MDlfU0lHICpkMmlfUEtDUzhfZnAoRklMRSAqZnAsIFg1MDlfU0lHICoqcDgpCisJeworCXJldHVybiBBU04xX2QyaV9mcF9vZihYNTA5X1NJRyxYNTA5X1NJR19uZXcsZDJpX1g1MDlfU0lHLGZwLHA4KTsKKwl9CisKK2ludCBpMmRfUEtDUzhfZnAoRklMRSAqZnAsIFg1MDlfU0lHICpwOCkKKwl7CisJcmV0dXJuIEFTTjFfaTJkX2ZwX29mKFg1MDlfU0lHLGkyZF9YNTA5X1NJRyxmcCxwOCk7CisJfQorI2VuZGlmCisKK1g1MDlfU0lHICpkMmlfUEtDUzhfYmlvKEJJTyAqYnAsIFg1MDlfU0lHICoqcDgpCisJeworCXJldHVybiBBU04xX2QyaV9iaW9fb2YoWDUwOV9TSUcsWDUwOV9TSUdfbmV3LGQyaV9YNTA5X1NJRyxicCxwOCk7CisJfQorCitpbnQgaTJkX1BLQ1M4X2JpbyhCSU8gKmJwLCBYNTA5X1NJRyAqcDgpCisJeworCXJldHVybiBBU04xX2kyZF9iaW9fb2YoWDUwOV9TSUcsaTJkX1g1MDlfU0lHLGJwLHA4KTsKKwl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKK1BLQ1M4X1BSSVZfS0VZX0lORk8gKmQyaV9QS0NTOF9QUklWX0tFWV9JTkZPX2ZwKEZJTEUgKmZwLAorCQkJCQkJIFBLQ1M4X1BSSVZfS0VZX0lORk8gKipwOGluZikKKwl7CisJcmV0dXJuIEFTTjFfZDJpX2ZwX29mKFBLQ1M4X1BSSVZfS0VZX0lORk8sUEtDUzhfUFJJVl9LRVlfSU5GT19uZXcsCisJCQkgICAgICBkMmlfUEtDUzhfUFJJVl9LRVlfSU5GTyxmcCxwOGluZik7CisJfQorCitpbnQgaTJkX1BLQ1M4X1BSSVZfS0VZX0lORk9fZnAoRklMRSAqZnAsIFBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4aW5mKQorCXsKKwlyZXR1cm4gQVNOMV9pMmRfZnBfb2YoUEtDUzhfUFJJVl9LRVlfSU5GTyxpMmRfUEtDUzhfUFJJVl9LRVlfSU5GTyxmcCwKKwkJCSAgICAgIHA4aW5mKTsKKwl9CisKK2ludCBpMmRfUEtDUzhQcml2YXRlS2V5SW5mb19mcChGSUxFICpmcCwgRVZQX1BLRVkgKmtleSkKKwl7CisJUEtDUzhfUFJJVl9LRVlfSU5GTyAqcDhpbmY7CisJaW50IHJldDsKKwlwOGluZiA9IEVWUF9QS0VZMlBLQ1M4KGtleSk7CisJaWYoIXA4aW5mKSByZXR1cm4gMDsKKwlyZXQgPSBpMmRfUEtDUzhfUFJJVl9LRVlfSU5GT19mcChmcCwgcDhpbmYpOworCVBLQ1M4X1BSSVZfS0VZX0lORk9fZnJlZShwOGluZik7CisJcmV0dXJuIHJldDsKKwl9CisKK2ludCBpMmRfUHJpdmF0ZUtleV9mcChGSUxFICpmcCwgRVZQX1BLRVkgKnBrZXkpCisJeworCXJldHVybiBBU04xX2kyZF9mcF9vZl9jb25zdChFVlBfUEtFWSxpMmRfUHJpdmF0ZUtleSxmcCxwa2V5KTsKKwl9CisKK0VWUF9QS0VZICpkMmlfUHJpdmF0ZUtleV9mcChGSUxFICpmcCwgRVZQX1BLRVkgKiphKQoreworCXJldHVybiBBU04xX2QyaV9mcF9vZihFVlBfUEtFWSxFVlBfUEtFWV9uZXcsZDJpX0F1dG9Qcml2YXRlS2V5LGZwLGEpOworfQorCitpbnQgaTJkX1BVQktFWV9mcChGSUxFICpmcCwgRVZQX1BLRVkgKnBrZXkpCisJeworCXJldHVybiBBU04xX2kyZF9mcF9vZl9jb25zdChFVlBfUEtFWSxpMmRfUFVCS0VZLGZwLHBrZXkpOworCX0KKworRVZQX1BLRVkgKmQyaV9QVUJLRVlfZnAoRklMRSAqZnAsIEVWUF9QS0VZICoqYSkKK3sKKwlyZXR1cm4gQVNOMV9kMmlfZnBfb2YoRVZQX1BLRVksRVZQX1BLRVlfbmV3LGQyaV9QVUJLRVksZnAsYSk7Cit9CisKK1BLQ1M4X1BSSVZfS0VZX0lORk8gKmQyaV9QS0NTOF9QUklWX0tFWV9JTkZPX2JpbyhCSU8gKmJwLAorCQkJCQkJIFBLQ1M4X1BSSVZfS0VZX0lORk8gKipwOGluZikKKwl7CisJcmV0dXJuIEFTTjFfZDJpX2Jpb19vZihQS0NTOF9QUklWX0tFWV9JTkZPLFBLQ1M4X1BSSVZfS0VZX0lORk9fbmV3LAorCQkJICAgIGQyaV9QS0NTOF9QUklWX0tFWV9JTkZPLGJwLHA4aW5mKTsKKwl9CisKK2ludCBpMmRfUEtDUzhfUFJJVl9LRVlfSU5GT19iaW8oQklPICpicCwgUEtDUzhfUFJJVl9LRVlfSU5GTyAqcDhpbmYpCisJeworCXJldHVybiBBU04xX2kyZF9iaW9fb2YoUEtDUzhfUFJJVl9LRVlfSU5GTyxpMmRfUEtDUzhfUFJJVl9LRVlfSU5GTyxicCwKKwkJCSAgICAgICBwOGluZik7CisJfQorCitpbnQgaTJkX1BLQ1M4UHJpdmF0ZUtleUluZm9fYmlvKEJJTyAqYnAsIEVWUF9QS0VZICprZXkpCisJeworCVBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4aW5mOworCWludCByZXQ7CisJcDhpbmYgPSBFVlBfUEtFWTJQS0NTOChrZXkpOworCWlmKCFwOGluZikgcmV0dXJuIDA7CisJcmV0ID0gaTJkX1BLQ1M4X1BSSVZfS0VZX0lORk9fYmlvKGJwLCBwOGluZik7CisJUEtDUzhfUFJJVl9LRVlfSU5GT19mcmVlKHA4aW5mKTsKKwlyZXR1cm4gcmV0OworCX0KKyNlbmRpZgorCitpbnQgaTJkX1ByaXZhdGVLZXlfYmlvKEJJTyAqYnAsIEVWUF9QS0VZICpwa2V5KQorCXsKKwlyZXR1cm4gQVNOMV9pMmRfYmlvX29mX2NvbnN0KEVWUF9QS0VZLGkyZF9Qcml2YXRlS2V5LGJwLHBrZXkpOworCX0KKworRVZQX1BLRVkgKmQyaV9Qcml2YXRlS2V5X2JpbyhCSU8gKmJwLCBFVlBfUEtFWSAqKmEpCisJeworCXJldHVybiBBU04xX2QyaV9iaW9fb2YoRVZQX1BLRVksRVZQX1BLRVlfbmV3LGQyaV9BdXRvUHJpdmF0ZUtleSxicCxhKTsKKwl9CisKK2ludCBpMmRfUFVCS0VZX2JpbyhCSU8gKmJwLCBFVlBfUEtFWSAqcGtleSkKKwl7CisJcmV0dXJuIEFTTjFfaTJkX2Jpb19vZl9jb25zdChFVlBfUEtFWSxpMmRfUFVCS0VZLGJwLHBrZXkpOworCX0KKworRVZQX1BLRVkgKmQyaV9QVUJLRVlfYmlvKEJJTyAqYnAsIEVWUF9QS0VZICoqYSkKKwl7CisJcmV0dXJuIEFTTjFfZDJpX2Jpb19vZihFVlBfUEtFWSxFVlBfUEtFWV9uZXcsZDJpX1BVQktFWSxicCxhKTsKKwl9CmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOS94X2F0dHJpYi5jIGIvY3J5cHRvL3g1MDkveF9hdHRyaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDYwYTcwCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3g1MDkveF9hdHRyaWIuYwpAQCAtMCwwICsxLDExNyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgorCisKKy8qIFg1MDlfQVRUUklCVVRFOiB0aGlzIGhhcyB0aGUgZm9sbG93aW5nIGZvcm06CisgKgorICogdHlwZWRlZiBzdHJ1Y3QgeDUwOV9hdHRyaWJ1dGVzX3N0CisgKgl7CisgKglBU04xX09CSkVDVCAqb2JqZWN0OworICoJaW50IHNpbmdsZTsKKyAqCXVuaW9uCXsKKyAqCQljaGFyCQkqcHRyOworICogCQlTVEFDS19PRihBU04xX1RZUEUpICpzZXQ7CisgKiAJCUFTTjFfVFlQRQkqc2luZ2xlOworICoJCX0gdmFsdWU7CisgKgl9IFg1MDlfQVRUUklCVVRFOworICoKKyAqIHRoaXMgbmVlZHMgc29tZSBleHRyYSB0aG91Z2h0IGJlY2F1c2UgdGhlIENIT0lDRSB0eXBlIGlzCisgKiBtZXJnZWQgd2l0aCB0aGUgbWFpbiBzdHJ1Y3R1cmUgYW5kIGJlY2F1c2UgdGhlIHZhbHVlIGNhbgorICogYmUgYW55dGhpbmcgYXQgYWxsIHdlICptdXN0KiB0cnkgdGhlIFNFVCBPRiBmaXJzdCBiZWNhdXNlCisgKiB0aGUgQVNOMV9BTlkgdHlwZSB3aWxsIHN3YWxsb3cgYW55dGhpbmcgaW5jbHVkaW5nIHRoZSB3aG9sZQorICogU0VUIE9GIHN0cnVjdHVyZS4KKyAqLworCitBU04xX0NIT0lDRShYNTA5X0FUVFJJQlVURV9TRVQpID0geworCUFTTjFfU0VUX09GKFg1MDlfQVRUUklCVVRFLCB2YWx1ZS5zZXQsIEFTTjFfQU5ZKSwKKwlBU04xX1NJTVBMRShYNTA5X0FUVFJJQlVURSwgdmFsdWUuc2luZ2xlLCBBU04xX0FOWSkKK30gQVNOMV9DSE9JQ0VfRU5EX3NlbGVjdG9yKFg1MDlfQVRUUklCVVRFLCBYNTA5X0FUVFJJQlVURV9TRVQsIHNpbmdsZSkKKworQVNOMV9TRVFVRU5DRShYNTA5X0FUVFJJQlVURSkgPSB7CisJQVNOMV9TSU1QTEUoWDUwOV9BVFRSSUJVVEUsIG9iamVjdCwgQVNOMV9PQkpFQ1QpLAorCS8qIENIT0lDRSB0eXBlIG1lcmdlZCB3aXRoIHBhcmVudCAqLworCUFTTjFfRVhfQ09NQklORSgwLCAwLCBYNTA5X0FUVFJJQlVURV9TRVQpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKFg1MDlfQVRUUklCVVRFKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoWDUwOV9BVFRSSUJVVEUpCitJTVBMRU1FTlRfQVNOMV9EVVBfRlVOQ1RJT04oWDUwOV9BVFRSSUJVVEUpCisKK1g1MDlfQVRUUklCVVRFICpYNTA5X0FUVFJJQlVURV9jcmVhdGUoaW50IG5pZCwgaW50IGF0cnR5cGUsIHZvaWQgKnZhbHVlKQorCXsKKwlYNTA5X0FUVFJJQlVURSAqcmV0PU5VTEw7CisJQVNOMV9UWVBFICp2YWw9TlVMTDsKKworCWlmICgocmV0PVg1MDlfQVRUUklCVVRFX25ldygpKSA9PSBOVUxMKQorCQlyZXR1cm4oTlVMTCk7CisgICAgICAgIC8qIFRPRE8oZm9yayk6IGNvbnN0IGNvcnJlY3RuZXNzLiAqLworCXJldC0+b2JqZWN0PShBU04xX09CSkVDVCopIE9CSl9uaWQyb2JqKG5pZCk7CisJcmV0LT5zaW5nbGU9MDsKKwlpZiAoKHJldC0+dmFsdWUuc2V0PXNrX0FTTjFfVFlQRV9uZXdfbnVsbCgpKSA9PSBOVUxMKSBnb3RvIGVycjsKKwlpZiAoKHZhbD1BU04xX1RZUEVfbmV3KCkpID09IE5VTEwpIGdvdG8gZXJyOworCWlmICghc2tfQVNOMV9UWVBFX3B1c2gocmV0LT52YWx1ZS5zZXQsdmFsKSkgZ290byBlcnI7CisKKwlBU04xX1RZUEVfc2V0KHZhbCxhdHJ0eXBlLHZhbHVlKTsKKwlyZXR1cm4ocmV0KTsKK2VycjoKKwlpZiAocmV0ICE9IE5VTEwpIFg1MDlfQVRUUklCVVRFX2ZyZWUocmV0KTsKKwlpZiAodmFsICE9IE5VTEwpIEFTTjFfVFlQRV9mcmVlKHZhbCk7CisJcmV0dXJuKE5VTEwpOworCX0KZGlmZiAtLWdpdCBhL2NyeXB0by94NTA5L3hfY3JsLmMgYi9jcnlwdG8veDUwOS94X2NybC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNzRmZjUKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOS94X2NybC5jCkBAIC0wLDAgKzEsNTMwIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZGlnZXN0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zdGFjay5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisKKyNpbmNsdWRlICIuLi9hc24xL2FzbjFfbG9jbC5oIgorCisKK3N0YXRpYyBpbnQgWDUwOV9SRVZPS0VEX2NtcChjb25zdCBYNTA5X1JFVk9LRUQgKiphLAorCQkJCWNvbnN0IFg1MDlfUkVWT0tFRCAqKmIpOworc3RhdGljIHZvaWQgc2V0dXBfaWRwKFg1MDlfQ1JMICpjcmwsIElTU1VJTkdfRElTVF9QT0lOVCAqaWRwKTsKKworQVNOMV9TRVFVRU5DRShYNTA5X1JFVk9LRUQpID0geworCUFTTjFfU0lNUExFKFg1MDlfUkVWT0tFRCxzZXJpYWxOdW1iZXIsIEFTTjFfSU5URUdFUiksCisJQVNOMV9TSU1QTEUoWDUwOV9SRVZPS0VELHJldm9jYXRpb25EYXRlLCBBU04xX1RJTUUpLAorCUFTTjFfU0VRVUVOQ0VfT0ZfT1BUKFg1MDlfUkVWT0tFRCxleHRlbnNpb25zLCBYNTA5X0VYVEVOU0lPTikKK30gQVNOMV9TRVFVRU5DRV9FTkQoWDUwOV9SRVZPS0VEKQorCitzdGF0aWMgaW50IGRlZl9jcmxfdmVyaWZ5KFg1MDlfQ1JMICpjcmwsIEVWUF9QS0VZICpyKTsKK3N0YXRpYyBpbnQgZGVmX2NybF9sb29rdXAoWDUwOV9DUkwgKmNybCwKKwkJWDUwOV9SRVZPS0VEICoqcmV0LCBBU04xX0lOVEVHRVIgKnNlcmlhbCwgWDUwOV9OQU1FICppc3N1ZXIpOworCitzdGF0aWMgWDUwOV9DUkxfTUVUSE9EIGludF9jcmxfbWV0aCA9CisJeworCTAsCisJMCwwLAorCWRlZl9jcmxfbG9va3VwLAorCWRlZl9jcmxfdmVyaWZ5CisJfTsKKworc3RhdGljIGNvbnN0IFg1MDlfQ1JMX01FVEhPRCAqZGVmYXVsdF9jcmxfbWV0aG9kID0gJmludF9jcmxfbWV0aDsKKworLyogVGhlIFg1MDlfQ1JMX0lORk8gc3RydWN0dXJlIG5lZWRzIGEgYml0IG9mIGN1c3RvbWlzYXRpb24uCisgKiBTaW5jZSB3ZSBjYWNoZSB0aGUgb3JpZ2luYWwgZW5jb2RpbmcgdGhlIHNpZ25hdHVyZSB3b250IGJlIGFmZmVjdGVkIGJ5CisgKiByZW9yZGVyaW5nIG9mIHRoZSByZXZva2VkIGZpZWxkLgorICovCitzdGF0aWMgaW50IGNybF9pbmZfY2IoaW50IG9wZXJhdGlvbiwgQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQsCisJCQkJCQkJCXZvaWQgKmV4YXJnKQoreworCVg1MDlfQ1JMX0lORk8gKmEgPSAoWDUwOV9DUkxfSU5GTyAqKSpwdmFsOworCisJaWYoIWEgfHwgIWEtPnJldm9rZWQpIHJldHVybiAxOworCXN3aXRjaChvcGVyYXRpb24pIHsKKwkJLyogSnVzdCBzZXQgY21wIGZ1bmN0aW9uIGhlcmUuIFdlIGRvbid0IHNvcnQgYmVjYXVzZSB0aGF0CisJCSAqIHdvdWxkIGFmZmVjdCB0aGUgb3V0cHV0IG9mIFg1MDlfQ1JMX3ByaW50KCkuCisJCSAqLworCQljYXNlIEFTTjFfT1BfRDJJX1BPU1Q6CisJCSh2b2lkKXNrX1g1MDlfUkVWT0tFRF9zZXRfY21wX2Z1bmMoYS0+cmV2b2tlZCxYNTA5X1JFVk9LRURfY21wKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAxOworfQorCisKK0FTTjFfU0VRVUVOQ0VfZW5jKFg1MDlfQ1JMX0lORk8sIGVuYywgY3JsX2luZl9jYikgPSB7CisJQVNOMV9PUFQoWDUwOV9DUkxfSU5GTywgdmVyc2lvbiwgQVNOMV9JTlRFR0VSKSwKKwlBU04xX1NJTVBMRShYNTA5X0NSTF9JTkZPLCBzaWdfYWxnLCBYNTA5X0FMR09SKSwKKwlBU04xX1NJTVBMRShYNTA5X0NSTF9JTkZPLCBpc3N1ZXIsIFg1MDlfTkFNRSksCisJQVNOMV9TSU1QTEUoWDUwOV9DUkxfSU5GTywgbGFzdFVwZGF0ZSwgQVNOMV9USU1FKSwKKwlBU04xX09QVChYNTA5X0NSTF9JTkZPLCBuZXh0VXBkYXRlLCBBU04xX1RJTUUpLAorCUFTTjFfU0VRVUVOQ0VfT0ZfT1BUKFg1MDlfQ1JMX0lORk8sIHJldm9rZWQsIFg1MDlfUkVWT0tFRCksCisJQVNOMV9FWFBfU0VRVUVOQ0VfT0ZfT1BUKFg1MDlfQ1JMX0lORk8sIGV4dGVuc2lvbnMsIFg1MDlfRVhURU5TSU9OLCAwKQorfSBBU04xX1NFUVVFTkNFX0VORF9lbmMoWDUwOV9DUkxfSU5GTywgWDUwOV9DUkxfSU5GTykKKworLyogU2V0IENSTCBlbnRyeSBpc3N1ZXIgYWNjb3JkaW5nIHRvIENSTCBjZXJ0aWZpY2F0ZSBpc3N1ZXIgZXh0ZW5zaW9uLgorICogQ2hlY2sgZm9yIHVuaGFuZGxlZCBjcml0aWNhbCBDUkwgZW50cnkgZXh0ZW5zaW9ucy4KKyAqLworCitzdGF0aWMgaW50IGNybF9zZXRfaXNzdWVycyhYNTA5X0NSTCAqY3JsKQorCXsKKworCXNpemVfdCBpLCBrOworCWludCBqOworCUdFTkVSQUxfTkFNRVMgKmdlbnMsICpndG1wOworCVNUQUNLX09GKFg1MDlfUkVWT0tFRCkgKnJldm9rZWQ7CisKKwlyZXZva2VkID0gWDUwOV9DUkxfZ2V0X1JFVk9LRUQoY3JsKTsKKworCWdlbnMgPSBOVUxMOworCWZvciAoaSA9IDA7IGkgPCBza19YNTA5X1JFVk9LRURfbnVtKHJldm9rZWQpOyBpKyspCisJCXsKKwkJWDUwOV9SRVZPS0VEICpyZXYgPSBza19YNTA5X1JFVk9LRURfdmFsdWUocmV2b2tlZCwgaSk7CisJCVNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqZXh0czsKKwkJQVNOMV9FTlVNRVJBVEVEICpyZWFzb247CisJCVg1MDlfRVhURU5TSU9OICpleHQ7CisJCWd0bXAgPSBYNTA5X1JFVk9LRURfZ2V0X2V4dF9kMmkocmV2LCAKKwkJCQkJCU5JRF9jZXJ0aWZpY2F0ZV9pc3N1ZXIsCisJCQkJCQkmaiwgTlVMTCk7CisJCWlmICghZ3RtcCAmJiAoaiAhPSAtMSkpCisJCQl7CisJCQljcmwtPmZsYWdzIHw9IEVYRkxBR19JTlZBTElEOworCQkJcmV0dXJuIDE7CisJCQl9CisKKwkJaWYgKGd0bXApCisJCQl7CisJCQlnZW5zID0gZ3RtcDsKKwkJCWlmICghY3JsLT5pc3N1ZXJzKQorCQkJCXsKKwkJCQljcmwtPmlzc3VlcnMgPSBza19HRU5FUkFMX05BTUVTX25ld19udWxsKCk7CisJCQkJaWYgKCFjcmwtPmlzc3VlcnMpCisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCWlmICghc2tfR0VORVJBTF9OQU1FU19wdXNoKGNybC0+aXNzdWVycywgZ3RtcCkpCisJCQkJcmV0dXJuIDA7CisJCQl9CisJCXJldi0+aXNzdWVyID0gZ2VuczsKKworCQlyZWFzb24gPSBYNTA5X1JFVk9LRURfZ2V0X2V4dF9kMmkocmV2LCBOSURfY3JsX3JlYXNvbiwKKwkJCQkJCQkJJmosIE5VTEwpOworCQlpZiAoIXJlYXNvbiAmJiAoaiAhPSAtMSkpCisJCQl7CisJCQljcmwtPmZsYWdzIHw9IEVYRkxBR19JTlZBTElEOworCQkJcmV0dXJuIDE7CisJCQl9CisKKwkJaWYgKHJlYXNvbikKKwkJCXsKKwkJCXJldi0+cmVhc29uID0gQVNOMV9FTlVNRVJBVEVEX2dldChyZWFzb24pOworCQkJQVNOMV9FTlVNRVJBVEVEX2ZyZWUocmVhc29uKTsKKwkJCX0KKwkJZWxzZQorCQkJcmV2LT5yZWFzb24gPSBDUkxfUkVBU09OX05PTkU7CQorCisJCS8qIENoZWNrIGZvciBjcml0aWNhbCBDUkwgZW50cnkgZXh0ZW5zaW9ucyAqLworCisJCWV4dHMgPSByZXYtPmV4dGVuc2lvbnM7CisKKwkJZm9yIChrID0gMDsgayA8IHNrX1g1MDlfRVhURU5TSU9OX251bShleHRzKTsgaysrKQorCQkJeworCQkJZXh0ID0gc2tfWDUwOV9FWFRFTlNJT05fdmFsdWUoZXh0cywgayk7CisJCQlpZiAoZXh0LT5jcml0aWNhbCA+IDApCisJCQkJeworCQkJCWlmIChPQkpfb2JqMm5pZChleHQtPm9iamVjdCkgPT0KKwkJCQkJTklEX2NlcnRpZmljYXRlX2lzc3VlcikKKwkJCQkJY29udGludWU7CisJCQkJY3JsLT5mbGFncyB8PSBFWEZMQUdfQ1JJVElDQUw7CisJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisKKwkJfQorCisJcmV0dXJuIDE7CisKKwl9CisKKy8qIFRoZSBYNTA5X0NSTCBzdHJ1Y3R1cmUgbmVlZHMgYSBiaXQgb2YgY3VzdG9taXNhdGlvbi4gQ2FjaGUgc29tZSBleHRlbnNpb25zCisgKiBhbmQgaGFzaCBvZiB0aGUgd2hvbGUgQ1JMLgorICovCitzdGF0aWMgaW50IGNybF9jYihpbnQgb3BlcmF0aW9uLCBBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9JVEVNICppdCwKKwkJCQkJCQkJdm9pZCAqZXhhcmcpCisJeworCVg1MDlfQ1JMICpjcmwgPSAoWDUwOV9DUkwgKikqcHZhbDsKKwlTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKmV4dHM7CisJWDUwOV9FWFRFTlNJT04gKmV4dDsKKwlzaXplX3QgaWR4OworCisJc3dpdGNoKG9wZXJhdGlvbikKKwkJeworCQljYXNlIEFTTjFfT1BfTkVXX1BPU1Q6CisJCWNybC0+aWRwID0gTlVMTDsKKwkJY3JsLT5ha2lkID0gTlVMTDsKKwkJY3JsLT5mbGFncyA9IDA7CisJCWNybC0+aWRwX2ZsYWdzID0gMDsKKwkJY3JsLT5pZHBfcmVhc29ucyA9IENSTERQX0FMTF9SRUFTT05TOworCQljcmwtPm1ldGggPSBkZWZhdWx0X2NybF9tZXRob2Q7CisJCWNybC0+bWV0aF9kYXRhID0gTlVMTDsKKwkJY3JsLT5pc3N1ZXJzID0gTlVMTDsKKwkJY3JsLT5jcmxfbnVtYmVyID0gTlVMTDsKKwkJY3JsLT5iYXNlX2NybF9udW1iZXIgPSBOVUxMOworCQlicmVhazsKKworCQljYXNlIEFTTjFfT1BfRDJJX1BPU1Q6CisjaWZuZGVmIE9QRU5TU0xfTk9fU0hBCisJCVg1MDlfQ1JMX2RpZ2VzdChjcmwsIEVWUF9zaGExKCksIGNybC0+c2hhMV9oYXNoLCBOVUxMKTsKKyNlbmRpZgorCQljcmwtPmlkcCA9IFg1MDlfQ1JMX2dldF9leHRfZDJpKGNybCwKKwkJCQlOSURfaXNzdWluZ19kaXN0cmlidXRpb25fcG9pbnQsIE5VTEwsIE5VTEwpOworCQlpZiAoY3JsLT5pZHApCisJCQlzZXR1cF9pZHAoY3JsLCBjcmwtPmlkcCk7CisKKwkJY3JsLT5ha2lkID0gWDUwOV9DUkxfZ2V0X2V4dF9kMmkoY3JsLAorCQkJCU5JRF9hdXRob3JpdHlfa2V5X2lkZW50aWZpZXIsIE5VTEwsIE5VTEwpOwkKKworCQljcmwtPmNybF9udW1iZXIgPSBYNTA5X0NSTF9nZXRfZXh0X2QyaShjcmwsCisJCQkJTklEX2NybF9udW1iZXIsIE5VTEwsIE5VTEwpOwkKKworCQljcmwtPmJhc2VfY3JsX251bWJlciA9IFg1MDlfQ1JMX2dldF9leHRfZDJpKGNybCwKKwkJCQlOSURfZGVsdGFfY3JsLCBOVUxMLCBOVUxMKTsJCisJCS8qIERlbHRhIENSTHMgbXVzdCBoYXZlIENSTCBudW1iZXIgKi8KKwkJaWYgKGNybC0+YmFzZV9jcmxfbnVtYmVyICYmICFjcmwtPmNybF9udW1iZXIpCisJCQljcmwtPmZsYWdzIHw9IEVYRkxBR19JTlZBTElEOworCisJCS8qIFNlZSBpZiB3ZSBoYXZlIGFueSB1bmhhbmRsZWQgY3JpdGljYWwgQ1JMIGV4dGVuc2lvbnMgYW5kIAorCQkgKiBpbmRpY2F0ZSB0aGlzIGluIGEgZmxhZy4gV2Ugb25seSBjdXJyZW50bHkgaGFuZGxlIElEUCBzbworCQkgKiBhbnl0aGluZyBlbHNlIGNyaXRpY2FsIHNldHMgdGhlIGZsYWcuCisJCSAqCisJCSAqIFRoaXMgY29kZSBhY2Nlc3NlcyB0aGUgWDUwOV9DUkwgc3RydWN0dXJlIGRpcmVjdGx5OgorCQkgKiBhcHBsaWNhdGlvbnMgc2hvdWxkbid0IGRvIHRoaXMuCisJCSAqLworCisJCWV4dHMgPSBjcmwtPmNybC0+ZXh0ZW5zaW9uczsKKworCQlmb3IgKGlkeCA9IDA7IGlkeCA8IHNrX1g1MDlfRVhURU5TSU9OX251bShleHRzKTsgaWR4KyspCisJCQl7CisJCQlpbnQgbmlkOworCQkJZXh0ID0gc2tfWDUwOV9FWFRFTlNJT05fdmFsdWUoZXh0cywgaWR4KTsKKwkJCW5pZCA9IE9CSl9vYmoybmlkKGV4dC0+b2JqZWN0KTsKKwkJCWlmIChuaWQgPT0gTklEX2ZyZXNoZXN0X2NybCkKKwkJCQljcmwtPmZsYWdzIHw9IEVYRkxBR19GUkVTSEVTVDsKKwkJCWlmIChleHQtPmNyaXRpY2FsID4gMCkKKwkJCQl7CisJCQkJLyogV2UgaGFuZGxlIElEUCBhbmQgZGVsdGFzICovCisJCQkJaWYgKChuaWQgPT0gTklEX2lzc3VpbmdfZGlzdHJpYnV0aW9uX3BvaW50KQorCQkJCQl8fCAobmlkID09IE5JRF9kZWx0YV9jcmwpKQorCQkJCQlicmVhazs7CisJCQkJY3JsLT5mbGFncyB8PSBFWEZMQUdfQ1JJVElDQUw7CisJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisKKwkJaWYgKCFjcmxfc2V0X2lzc3VlcnMoY3JsKSkKKwkJCXJldHVybiAwOworCisJCWlmIChjcmwtPm1ldGgtPmNybF9pbml0KQorCQkJeworCQkJaWYgKGNybC0+bWV0aC0+Y3JsX2luaXQoY3JsKSA9PSAwKQorCQkJCXJldHVybiAwOworCQkJfQorCQlicmVhazsKKworCQljYXNlIEFTTjFfT1BfRlJFRV9QT1NUOgorCQlpZiAoY3JsLT5tZXRoLT5jcmxfZnJlZSkKKwkJCXsKKwkJCWlmICghY3JsLT5tZXRoLT5jcmxfZnJlZShjcmwpKQorCQkJCXJldHVybiAwOworCQkJfQorCQlpZiAoY3JsLT5ha2lkKQorCQkJQVVUSE9SSVRZX0tFWUlEX2ZyZWUoY3JsLT5ha2lkKTsKKwkJaWYgKGNybC0+aWRwKQorCQkJSVNTVUlOR19ESVNUX1BPSU5UX2ZyZWUoY3JsLT5pZHApOworCQlBU04xX0lOVEVHRVJfZnJlZShjcmwtPmNybF9udW1iZXIpOworCQlBU04xX0lOVEVHRVJfZnJlZShjcmwtPmJhc2VfY3JsX251bWJlcik7CisJCXNrX0dFTkVSQUxfTkFNRVNfcG9wX2ZyZWUoY3JsLT5pc3N1ZXJzLCBHRU5FUkFMX05BTUVTX2ZyZWUpOworCQlicmVhazsKKwkJfQorCXJldHVybiAxOworCX0KKworLyogQ29udmVydCBJRFAgaW50byBhIG1vcmUgY29udmVuaWVudCBmb3JtICovCisKK3N0YXRpYyB2b2lkIHNldHVwX2lkcChYNTA5X0NSTCAqY3JsLCBJU1NVSU5HX0RJU1RfUE9JTlQgKmlkcCkKKwl7CisJaW50IGlkcF9vbmx5ID0gMDsKKwkvKiBTZXQgdmFyaW91cyBmbGFncyBhY2NvcmRpbmcgdG8gSURQICovCisJY3JsLT5pZHBfZmxhZ3MgfD0gSURQX1BSRVNFTlQ7CisJaWYgKGlkcC0+b25seXVzZXIgPiAwKQorCQl7CisJCWlkcF9vbmx5Kys7CisJCWNybC0+aWRwX2ZsYWdzIHw9IElEUF9PTkxZVVNFUjsKKwkJfQorCWlmIChpZHAtPm9ubHlDQSA+IDApCisJCXsKKwkJaWRwX29ubHkrKzsKKwkJY3JsLT5pZHBfZmxhZ3MgfD0gSURQX09OTFlDQTsKKwkJfQorCWlmIChpZHAtPm9ubHlhdHRyID4gMCkKKwkJeworCQlpZHBfb25seSsrOworCQljcmwtPmlkcF9mbGFncyB8PSBJRFBfT05MWUFUVFI7CisJCX0KKworCWlmIChpZHBfb25seSA+IDEpCisJCWNybC0+aWRwX2ZsYWdzIHw9IElEUF9JTlZBTElEOworCisJaWYgKGlkcC0+aW5kaXJlY3RDUkwgPiAwKQorCQljcmwtPmlkcF9mbGFncyB8PSBJRFBfSU5ESVJFQ1Q7CisKKwlpZiAoaWRwLT5vbmx5c29tZXJlYXNvbnMpCisJCXsKKwkJY3JsLT5pZHBfZmxhZ3MgfD0gSURQX1JFQVNPTlM7CisJCWlmIChpZHAtPm9ubHlzb21lcmVhc29ucy0+bGVuZ3RoID4gMCkKKwkJCWNybC0+aWRwX3JlYXNvbnMgPSBpZHAtPm9ubHlzb21lcmVhc29ucy0+ZGF0YVswXTsKKwkJaWYgKGlkcC0+b25seXNvbWVyZWFzb25zLT5sZW5ndGggPiAxKQorCQkJY3JsLT5pZHBfcmVhc29ucyB8PQorCQkJCShpZHAtPm9ubHlzb21lcmVhc29ucy0+ZGF0YVsxXSA8PCA4KTsKKwkJY3JsLT5pZHBfcmVhc29ucyAmPSBDUkxEUF9BTExfUkVBU09OUzsKKwkJfQorCisJRElTVF9QT0lOVF9zZXRfZHBuYW1lKGlkcC0+ZGlzdHBvaW50LCBYNTA5X0NSTF9nZXRfaXNzdWVyKGNybCkpOworCX0KKworQVNOMV9TRVFVRU5DRV9yZWYoWDUwOV9DUkwsIGNybF9jYiwgQ1JZUFRPX0xPQ0tfWDUwOV9DUkwpID0geworCUFTTjFfU0lNUExFKFg1MDlfQ1JMLCBjcmwsIFg1MDlfQ1JMX0lORk8pLAorCUFTTjFfU0lNUExFKFg1MDlfQ1JMLCBzaWdfYWxnLCBYNTA5X0FMR09SKSwKKwlBU04xX1NJTVBMRShYNTA5X0NSTCwgc2lnbmF0dXJlLCBBU04xX0JJVF9TVFJJTkcpCit9IEFTTjFfU0VRVUVOQ0VfRU5EX3JlZihYNTA5X0NSTCwgWDUwOV9DUkwpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhYNTA5X1JFVk9LRUQpCitJTVBMRU1FTlRfQVNOMV9EVVBfRlVOQ1RJT04oWDUwOV9SRVZPS0VEKQorSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKFg1MDlfQ1JMX0lORk8pCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoWDUwOV9DUkwpCitJTVBMRU1FTlRfQVNOMV9EVVBfRlVOQ1RJT04oWDUwOV9DUkwpCisKK3N0YXRpYyBpbnQgWDUwOV9SRVZPS0VEX2NtcChjb25zdCBYNTA5X1JFVk9LRUQgKiphLAorCQkJY29uc3QgWDUwOV9SRVZPS0VEICoqYikKKwl7CisJcmV0dXJuKEFTTjFfU1RSSU5HX2NtcCgKKwkJKEFTTjFfU1RSSU5HICopKCphKS0+c2VyaWFsTnVtYmVyLAorCQkoQVNOMV9TVFJJTkcgKikoKmIpLT5zZXJpYWxOdW1iZXIpKTsKKwl9CisKK2ludCBYNTA5X0NSTF9hZGQwX3Jldm9rZWQoWDUwOV9DUkwgKmNybCwgWDUwOV9SRVZPS0VEICpyZXYpCit7CisJWDUwOV9DUkxfSU5GTyAqaW5mOworCWluZiA9IGNybC0+Y3JsOworCWlmKCFpbmYtPnJldm9rZWQpCisJCWluZi0+cmV2b2tlZCA9IHNrX1g1MDlfUkVWT0tFRF9uZXcoWDUwOV9SRVZPS0VEX2NtcCk7CisJaWYoIWluZi0+cmV2b2tlZCB8fCAhc2tfWDUwOV9SRVZPS0VEX3B1c2goaW5mLT5yZXZva2VkLCByZXYpKSB7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfQ1JMX2FkZDBfcmV2b2tlZCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gMDsKKwl9CisJaW5mLT5lbmMubW9kaWZpZWQgPSAxOworCXJldHVybiAxOworfQorCitpbnQgWDUwOV9DUkxfdmVyaWZ5KFg1MDlfQ1JMICpjcmwsIEVWUF9QS0VZICpyKQorCXsKKwlpZiAoY3JsLT5tZXRoLT5jcmxfdmVyaWZ5KQorCQlyZXR1cm4gY3JsLT5tZXRoLT5jcmxfdmVyaWZ5KGNybCwgcik7CisJcmV0dXJuIDA7CisJfQorCitpbnQgWDUwOV9DUkxfZ2V0MF9ieV9zZXJpYWwoWDUwOV9DUkwgKmNybCwKKwkJWDUwOV9SRVZPS0VEICoqcmV0LCBBU04xX0lOVEVHRVIgKnNlcmlhbCkKKwl7CisJaWYgKGNybC0+bWV0aC0+Y3JsX2xvb2t1cCkKKwkJcmV0dXJuIGNybC0+bWV0aC0+Y3JsX2xvb2t1cChjcmwsIHJldCwgc2VyaWFsLCBOVUxMKTsKKwlyZXR1cm4gMDsKKwl9CisKK2ludCBYNTA5X0NSTF9nZXQwX2J5X2NlcnQoWDUwOV9DUkwgKmNybCwgWDUwOV9SRVZPS0VEICoqcmV0LCBYNTA5ICp4KQorCXsKKwlpZiAoY3JsLT5tZXRoLT5jcmxfbG9va3VwKQorCQlyZXR1cm4gY3JsLT5tZXRoLT5jcmxfbG9va3VwKGNybCwgcmV0LAorCQkJCQkJWDUwOV9nZXRfc2VyaWFsTnVtYmVyKHgpLAorCQkJCQkJWDUwOV9nZXRfaXNzdWVyX25hbWUoeCkpOworCXJldHVybiAwOworCX0KKworc3RhdGljIGludCBkZWZfY3JsX3ZlcmlmeShYNTA5X0NSTCAqY3JsLCBFVlBfUEtFWSAqcikKKwl7CisJcmV0dXJuKEFTTjFfaXRlbV92ZXJpZnkoQVNOMV9JVEVNX3JwdHIoWDUwOV9DUkxfSU5GTyksCisJCWNybC0+c2lnX2FsZywgY3JsLT5zaWduYXR1cmUsY3JsLT5jcmwscikpOworCX0KKworc3RhdGljIGludCBjcmxfcmV2b2tlZF9pc3N1ZXJfbWF0Y2goWDUwOV9DUkwgKmNybCwgWDUwOV9OQU1FICpubSwKKwkJCQkJCVg1MDlfUkVWT0tFRCAqcmV2KQorCXsKKwlzaXplX3QgaTsKKworCWlmICghcmV2LT5pc3N1ZXIpCisJCXsKKwkJaWYgKCFubSkKKwkJCXJldHVybiAxOworCQlpZiAoIVg1MDlfTkFNRV9jbXAobm0sIFg1MDlfQ1JMX2dldF9pc3N1ZXIoY3JsKSkpCisJCQlyZXR1cm4gMTsKKwkJcmV0dXJuIDA7CisJCX0KKworCWlmICghbm0pCisJCW5tID0gWDUwOV9DUkxfZ2V0X2lzc3VlcihjcmwpOworCisJZm9yIChpID0gMDsgaSA8IHNrX0dFTkVSQUxfTkFNRV9udW0ocmV2LT5pc3N1ZXIpOyBpKyspCisJCXsKKwkJR0VORVJBTF9OQU1FICpnZW4gPSBza19HRU5FUkFMX05BTUVfdmFsdWUocmV2LT5pc3N1ZXIsIGkpOworCQlpZiAoZ2VuLT50eXBlICE9IEdFTl9ESVJOQU1FKQorCQkJY29udGludWU7CisJCWlmICghWDUwOV9OQU1FX2NtcChubSwgZ2VuLT5kLmRpcmVjdG9yeU5hbWUpKQorCQkJcmV0dXJuIDE7CisJCX0KKwlyZXR1cm4gMDsKKworCX0KKworc3RhdGljIGludCBkZWZfY3JsX2xvb2t1cChYNTA5X0NSTCAqY3JsLAorCQlYNTA5X1JFVk9LRUQgKipyZXQsIEFTTjFfSU5URUdFUiAqc2VyaWFsLCBYNTA5X05BTUUgKmlzc3VlcikKKwl7CisJWDUwOV9SRVZPS0VEIHJ0bXAsICpyZXY7CisJc2l6ZV90IGlkeDsKKwlydG1wLnNlcmlhbE51bWJlciA9IHNlcmlhbDsKKwkvKiBTb3J0IHJldm9rZWQgaW50byBzZXJpYWwgbnVtYmVyIG9yZGVyIGlmIG5vdCBhbHJlYWR5IHNvcnRlZC4KKwkgKiBEbyB0aGlzIHVuZGVyIGEgbG9jayB0byBhdm9pZCByYWNlIGNvbmRpdGlvbi4KKyAJICovCisJaWYgKCFza19YNTA5X1JFVk9LRURfaXNfc29ydGVkKGNybC0+Y3JsLT5yZXZva2VkKSkKKwkJeworCQlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX1g1MDlfQ1JMKTsKKwkJc2tfWDUwOV9SRVZPS0VEX3NvcnQoY3JsLT5jcmwtPnJldm9rZWQpOworCQlDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfWDUwOV9DUkwpOworCQl9CisJaWYgKCFza19YNTA5X1JFVk9LRURfZmluZChjcmwtPmNybC0+cmV2b2tlZCwgJmlkeCwgJnJ0bXApKQorCQlyZXR1cm4gMDsKKwkvKiBOZWVkIHRvIGxvb2sgZm9yIG1hdGNoaW5nIG5hbWUgKi8KKwlmb3IoO2lkeCA8IHNrX1g1MDlfUkVWT0tFRF9udW0oY3JsLT5jcmwtPnJldm9rZWQpOyBpZHgrKykKKwkJeworCQlyZXYgPSBza19YNTA5X1JFVk9LRURfdmFsdWUoY3JsLT5jcmwtPnJldm9rZWQsIGlkeCk7CisJCWlmIChBU04xX0lOVEVHRVJfY21wKHJldi0+c2VyaWFsTnVtYmVyLCBzZXJpYWwpKQorCQkJcmV0dXJuIDA7CisJCWlmIChjcmxfcmV2b2tlZF9pc3N1ZXJfbWF0Y2goY3JsLCBpc3N1ZXIsIHJldikpCisJCQl7CisJCQlpZiAocmV0KQorCQkJCSpyZXQgPSByZXY7CisJCQlpZiAocmV2LT5yZWFzb24gPT0gQ1JMX1JFQVNPTl9SRU1PVkVfRlJPTV9DUkwpCisJCQkJcmV0dXJuIDI7CisJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCXJldHVybiAwOworCX0KKwordm9pZCBYNTA5X0NSTF9zZXRfZGVmYXVsdF9tZXRob2QoY29uc3QgWDUwOV9DUkxfTUVUSE9EICptZXRoKQorCXsKKwlpZiAobWV0aCA9PSBOVUxMKQorCQlkZWZhdWx0X2NybF9tZXRob2QgPSAmaW50X2NybF9tZXRoOworCWVsc2UgCisJCWRlZmF1bHRfY3JsX21ldGhvZCA9IG1ldGg7CisJfQorCitYNTA5X0NSTF9NRVRIT0QgKlg1MDlfQ1JMX01FVEhPRF9uZXcoCisJaW50ICgqY3JsX2luaXQpKFg1MDlfQ1JMICpjcmwpLAorCWludCAoKmNybF9mcmVlKShYNTA5X0NSTCAqY3JsKSwKKwlpbnQgKCpjcmxfbG9va3VwKShYNTA5X0NSTCAqY3JsLCBYNTA5X1JFVk9LRUQgKipyZXQsCisJCQkJQVNOMV9JTlRFR0VSICpzZXIsIFg1MDlfTkFNRSAqaXNzdWVyKSwKKwlpbnQgKCpjcmxfdmVyaWZ5KShYNTA5X0NSTCAqY3JsLCBFVlBfUEtFWSAqcGspKQorCXsKKwlYNTA5X0NSTF9NRVRIT0QgKm07CisJbSA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihYNTA5X0NSTF9NRVRIT0QpKTsKKwlpZiAoIW0pCisJCXJldHVybiBOVUxMOworCW0tPmNybF9pbml0ID0gY3JsX2luaXQ7CisJbS0+Y3JsX2ZyZWUgPSBjcmxfZnJlZTsKKwltLT5jcmxfbG9va3VwID0gY3JsX2xvb2t1cDsKKwltLT5jcmxfdmVyaWZ5ID0gY3JsX3ZlcmlmeTsKKwltLT5mbGFncyA9IFg1MDlfQ1JMX01FVEhPRF9EWU5BTUlDOworCXJldHVybiBtOworCX0KKwordm9pZCBYNTA5X0NSTF9NRVRIT0RfZnJlZShYNTA5X0NSTF9NRVRIT0QgKm0pCisJeworCWlmICghKG0tPmZsYWdzICYgWDUwOV9DUkxfTUVUSE9EX0RZTkFNSUMpKQorCQlyZXR1cm47CisJT1BFTlNTTF9mcmVlKG0pOworCX0KKwordm9pZCBYNTA5X0NSTF9zZXRfbWV0aF9kYXRhKFg1MDlfQ1JMICpjcmwsIHZvaWQgKmRhdCkKKwl7CisJY3JsLT5tZXRoX2RhdGEgPSBkYXQ7CisJfQorCit2b2lkICpYNTA5X0NSTF9nZXRfbWV0aF9kYXRhKFg1MDlfQ1JMICpjcmwpCisJeworCXJldHVybiBjcmwtPm1ldGhfZGF0YTsKKwl9CisKK0lNUExFTUVOVF9BU04xX1NFVF9PRihYNTA5X1JFVk9LRUQpCitJTVBMRU1FTlRfQVNOMV9TRVRfT0YoWDUwOV9DUkwpCmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOS94X2V4dGVuLmMgYi9jcnlwdG8veDUwOS94X2V4dGVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y2NGM4NAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94NTA5L3hfZXh0ZW4uYwpAQCAtMCwwICsxLDc1IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY2lwaGVyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKKworQVNOMV9TRVFVRU5DRShYNTA5X0VYVEVOU0lPTikgPSB7CisJQVNOMV9TSU1QTEUoWDUwOV9FWFRFTlNJT04sIG9iamVjdCwgQVNOMV9PQkpFQ1QpLAorCUFTTjFfT1BUKFg1MDlfRVhURU5TSU9OLCBjcml0aWNhbCwgQVNOMV9CT09MRUFOKSwKKwlBU04xX1NJTVBMRShYNTA5X0VYVEVOU0lPTiwgdmFsdWUsIEFTTjFfT0NURVRfU1RSSU5HKQorfSBBU04xX1NFUVVFTkNFX0VORChYNTA5X0VYVEVOU0lPTikKKworQVNOMV9JVEVNX1RFTVBMQVRFKFg1MDlfRVhURU5TSU9OUykgPSAKKwlBU04xX0VYX1RFTVBMQVRFX1RZUEUoQVNOMV9URkxHX1NFUVVFTkNFX09GLCAwLCBFeHRlbnNpb24sIFg1MDlfRVhURU5TSU9OKQorQVNOMV9JVEVNX1RFTVBMQVRFX0VORChYNTA5X0VYVEVOU0lPTlMpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhYNTA5X0VYVEVOU0lPTikKK0lNUExFTUVOVF9BU04xX0VOQ09ERV9GVU5DVElPTlNfZm5hbWUoWDUwOV9FWFRFTlNJT05TLCBYNTA5X0VYVEVOU0lPTlMsIFg1MDlfRVhURU5TSU9OUykKK0lNUExFTUVOVF9BU04xX0RVUF9GVU5DVElPTihYNTA5X0VYVEVOU0lPTikKZGlmZiAtLWdpdCBhL2NyeXB0by94NTA5L3hfaW5mby5jIGIvY3J5cHRvL3g1MDkveF9pbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA0N2M3MQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94NTA5L3hfaW5mby5jCkBAIC0wLDAgKzEsMTEwIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisKKworWDUwOV9JTkZPICpYNTA5X0lORk9fbmV3KHZvaWQpCisJeworCVg1MDlfSU5GTyAqcmV0PU5VTEw7CisKKwlyZXQ9KFg1MDlfSU5GTyAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihYNTA5X0lORk8pKTsKKwlpZiAocmV0ID09IE5VTEwpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9JTkZPX25ldywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4oTlVMTCk7CisJCX0KKyAKKyAgICAgICAgcmV0LT5lbmNfY2lwaGVyLmNpcGhlcj1OVUxMOworICAgICAgICByZXQtPmVuY19sZW49MDsKKyAgICAgICAgcmV0LT5lbmNfZGF0YT1OVUxMOworIAorCXJldC0+cmVmZXJlbmNlcz0xOworCXJldC0+eDUwOT1OVUxMOworCXJldC0+Y3JsPU5VTEw7CisJcmV0LT54X3BrZXk9TlVMTDsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK3ZvaWQgWDUwOV9JTkZPX2ZyZWUoWDUwOV9JTkZPICp4KQorCXsKKwlpbnQgaTsKKworCWlmICh4ID09IE5VTEwpIHJldHVybjsKKworCWk9Q1JZUFRPX2FkZCgmeC0+cmVmZXJlbmNlcywtMSxDUllQVE9fTE9DS19YNTA5X0lORk8pOworI2lmZGVmIFJFRl9QUklOVAorCVJFRl9QUklOVCgiWDUwOV9JTkZPIix4KTsKKyNlbmRpZgorCWlmIChpID4gMCkgcmV0dXJuOworI2lmZGVmIFJFRl9DSEVDSworCWlmIChpIDwgMCkKKwkJeworCQlmcHJpbnRmKHN0ZGVyciwiWDUwOV9JTkZPX2ZyZWUsIGJhZCByZWZlcmVuY2UgY291bnRcbiIpOworCQlhYm9ydCgpOworCQl9CisjZW5kaWYKKworCWlmICh4LT54NTA5ICE9IE5VTEwpIFg1MDlfZnJlZSh4LT54NTA5KTsKKwlpZiAoeC0+Y3JsICE9IE5VTEwpIFg1MDlfQ1JMX2ZyZWUoeC0+Y3JsKTsKKwlpZiAoeC0+eF9wa2V5ICE9IE5VTEwpIFg1MDlfUEtFWV9mcmVlKHgtPnhfcGtleSk7CisJaWYgKHgtPmVuY19kYXRhICE9IE5VTEwpIE9QRU5TU0xfZnJlZSh4LT5lbmNfZGF0YSk7CisJT1BFTlNTTF9mcmVlKHgpOworCX0KZGlmZiAtLWdpdCBhL2NyeXB0by94NTA5L3hfbmFtZS5jIGIvY3J5cHRvL3g1MDkveF9uYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZlZWFmNAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94NTA5L3hfbmFtZS5jCkBAIC0wLDAgKzEsNTI3IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2J1Zi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3RhY2suaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKworI2luY2x1ZGUgIi4uL2FzbjEvYXNuMV9sb2NsLmgiCisKKwordHlwZWRlZiBTVEFDS19PRihYNTA5X05BTUVfRU5UUlkpIFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWTsKK0RFQ0xBUkVfU1RBQ0tfT0YoU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZKQorCitzdGF0aWMgaW50IHg1MDlfbmFtZV9leF9kMmkoQVNOMV9WQUxVRSAqKnZhbCwKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIGxvbmcgbGVuLAorCQkJCWNvbnN0IEFTTjFfSVRFTSAqaXQsCisJCQkJaW50IHRhZywgaW50IGFjbGFzcywgY2hhciBvcHQsIEFTTjFfVExDICpjdHgpOworCitzdGF0aWMgaW50IHg1MDlfbmFtZV9leF9pMmQoQVNOMV9WQUxVRSAqKnZhbCwgdW5zaWduZWQgY2hhciAqKm91dCwKKwkJCQljb25zdCBBU04xX0lURU0gKml0LCBpbnQgdGFnLCBpbnQgYWNsYXNzKTsKK3N0YXRpYyBpbnQgeDUwOV9uYW1lX2V4X25ldyhBU04xX1ZBTFVFICoqdmFsLCBjb25zdCBBU04xX0lURU0gKml0KTsKK3N0YXRpYyB2b2lkIHg1MDlfbmFtZV9leF9mcmVlKEFTTjFfVkFMVUUgKip2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQpOworCitzdGF0aWMgaW50IHg1MDlfbmFtZV9lbmNvZGUoWDUwOV9OQU1FICphKTsKK3N0YXRpYyBpbnQgeDUwOV9uYW1lX2Nhbm9uKFg1MDlfTkFNRSAqYSk7CitzdGF0aWMgaW50IGFzbjFfc3RyaW5nX2Nhbm9uKEFTTjFfU1RSSU5HICpvdXQsIEFTTjFfU1RSSU5HICppbik7CitzdGF0aWMgaW50IGkyZF9uYW1lX2Nhbm9uKFNUQUNLX09GKFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSkgKmludG5hbWUsCisJCQkgIHVuc2lnbmVkIGNoYXIgKippbik7CisKKworc3RhdGljIGludCB4NTA5X25hbWVfZXhfcHJpbnQoQklPICpvdXQsIEFTTjFfVkFMVUUgKipwdmFsLAorCQkJCQkJaW50IGluZGVudCwKKwkJCQkJCWNvbnN0IGNoYXIgKmZuYW1lLCAKKwkJCQkJCWNvbnN0IEFTTjFfUENUWCAqcGN0eCk7CisKK0FTTjFfU0VRVUVOQ0UoWDUwOV9OQU1FX0VOVFJZKSA9IHsKKwlBU04xX1NJTVBMRShYNTA5X05BTUVfRU5UUlksIG9iamVjdCwgQVNOMV9PQkpFQ1QpLAorCUFTTjFfU0lNUExFKFg1MDlfTkFNRV9FTlRSWSwgdmFsdWUsIEFTTjFfUFJJTlRBQkxFKQorfSBBU04xX1NFUVVFTkNFX0VORChYNTA5X05BTUVfRU5UUlkpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhYNTA5X05BTUVfRU5UUlkpCitJTVBMRU1FTlRfQVNOMV9EVVBfRlVOQ1RJT04oWDUwOV9OQU1FX0VOVFJZKQorCisvKiBGb3IgdGhlICJOYW1lIiB0eXBlIHdlIG5lZWQgYSBTRVFVRU5DRSBPRiB7IFNFVCBPRiBYNTA5X05BTUVfRU5UUlkgfQorICogc28gZGVjbGFyZSB0d28gdGVtcGxhdGUgd3JhcHBlcnMgZm9yIHRoaXMKKyAqLworCitBU04xX0lURU1fVEVNUExBVEUoWDUwOV9OQU1FX0VOVFJJRVMpID0KKwlBU04xX0VYX1RFTVBMQVRFX1RZUEUoQVNOMV9URkxHX1NFVF9PRiwgMCwgUkROUywgWDUwOV9OQU1FX0VOVFJZKQorQVNOMV9JVEVNX1RFTVBMQVRFX0VORChYNTA5X05BTUVfRU5UUklFUykKKworQVNOMV9JVEVNX1RFTVBMQVRFKFg1MDlfTkFNRV9JTlRFUk5BTCkgPQorCUFTTjFfRVhfVEVNUExBVEVfVFlQRShBU04xX1RGTEdfU0VRVUVOQ0VfT0YsIDAsIE5hbWUsIFg1MDlfTkFNRV9FTlRSSUVTKQorQVNOMV9JVEVNX1RFTVBMQVRFX0VORChYNTA5X05BTUVfSU5URVJOQUwpCisKKy8qIE5vcm1hbGx5IHRoYXQncyB3aGVyZSBpdCB3b3VsZCBlbmQ6IHdlJ2QgaGF2ZSB0d28gbmVzdGVkIFNUQUNLIHN0cnVjdHVyZXMKKyAqIHJlcHJlc2VudGluZyB0aGUgQVNOMS4gVW5mb3J0dW5hdGVseSBYNTA5X05BTUUgdXNlcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50CisgKiBmb3JtIGFuZCBjYWNoZXMgZW5jb2RpbmdzIHNvIHdlIGhhdmUgdG8gcHJvY2VzcyB0aGUgaW50ZXJuYWwgZm9ybSBhbmQgY29udmVydAorICogdG8gdGhlIGV4dGVybmFsIGZvcm0uCisgKi8KKworY29uc3QgQVNOMV9FWFRFUk5fRlVOQ1MgeDUwOV9uYW1lX2ZmID0geworCU5VTEwsCisJeDUwOV9uYW1lX2V4X25ldywKKwl4NTA5X25hbWVfZXhfZnJlZSwKKwkwLAkvKiBEZWZhdWx0IGNsZWFyIGJlaGF2aW91ciBpcyBPSyAqLworCXg1MDlfbmFtZV9leF9kMmksCisJeDUwOV9uYW1lX2V4X2kyZCwKKwl4NTA5X25hbWVfZXhfcHJpbnQKK307CisKK0lNUExFTUVOVF9FWFRFUk5fQVNOMShYNTA5X05BTUUsIFZfQVNOMV9TRVFVRU5DRSwgeDUwOV9uYW1lX2ZmKSAKKworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKFg1MDlfTkFNRSkKK0lNUExFTUVOVF9BU04xX0RVUF9GVU5DVElPTihYNTA5X05BTUUpCisKK3N0YXRpYyBpbnQgeDUwOV9uYW1lX2V4X25ldyhBU04xX1ZBTFVFICoqdmFsLCBjb25zdCBBU04xX0lURU0gKml0KQoreworCVg1MDlfTkFNRSAqcmV0ID0gTlVMTDsKKwlyZXQgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoWDUwOV9OQU1FKSk7CisJaWYoIXJldCkgZ290byBtZW1lcnI7CisJaWYgKChyZXQtPmVudHJpZXM9c2tfWDUwOV9OQU1FX0VOVFJZX25ld19udWxsKCkpID09IE5VTEwpCisJCWdvdG8gbWVtZXJyOworCWlmKChyZXQtPmJ5dGVzID0gQlVGX01FTV9uZXcoKSkgPT0gTlVMTCkgZ290byBtZW1lcnI7CisJcmV0LT5jYW5vbl9lbmMgPSBOVUxMOworCXJldC0+Y2Fub25fZW5jbGVuID0gMDsKKwlyZXQtPm1vZGlmaWVkPTE7CisJKnZhbCA9IChBU04xX1ZBTFVFICopcmV0OworCXJldHVybiAxOworCisgbWVtZXJyOgorCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIHg1MDlfbmFtZV9leF9uZXcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwlpZiAocmV0KQorCQl7CisJCWlmIChyZXQtPmVudHJpZXMpCisJCQlza19YNTA5X05BTUVfRU5UUllfZnJlZShyZXQtPmVudHJpZXMpOworCQlPUEVOU1NMX2ZyZWUocmV0KTsKKwkJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB4NTA5X25hbWVfZXhfZnJlZShBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9JVEVNICppdCkKK3sKKwlYNTA5X05BTUUgKmE7CisJaWYoIXB2YWwgfHwgISpwdmFsKQorCSAgICByZXR1cm47CisJYSA9IChYNTA5X05BTUUgKikqcHZhbDsKKworCUJVRl9NRU1fZnJlZShhLT5ieXRlcyk7CisJc2tfWDUwOV9OQU1FX0VOVFJZX3BvcF9mcmVlKGEtPmVudHJpZXMsWDUwOV9OQU1FX0VOVFJZX2ZyZWUpOworCWlmIChhLT5jYW5vbl9lbmMpCisJCU9QRU5TU0xfZnJlZShhLT5jYW5vbl9lbmMpOworCU9QRU5TU0xfZnJlZShhKTsKKwkqcHZhbCA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgeDUwOV9uYW1lX2V4X2QyaShBU04xX1ZBTFVFICoqdmFsLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqKmluLCBsb25nIGxlbiwgY29uc3QgQVNOMV9JVEVNICppdCwKKwkJCQlpbnQgdGFnLCBpbnQgYWNsYXNzLCBjaGFyIG9wdCwgQVNOMV9UTEMgKmN0eCkKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwID0gKmluLCAqcTsKKwl1bmlvbiB7IFNUQUNLX09GKFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSkgKnM7CisJCUFTTjFfVkFMVUUgKmE7IH0gaW50bmFtZSA9IHtOVUxMfTsKKwl1bmlvbiB7IFg1MDlfTkFNRSAqeDsgQVNOMV9WQUxVRSAqYTsgfSBubSA9IHtOVUxMfTsKKwlzaXplX3QgaSwgajsKKwlpbnQgcmV0OworCVNUQUNLX09GKFg1MDlfTkFNRV9FTlRSWSkgKmVudHJpZXM7CisJWDUwOV9OQU1FX0VOVFJZICplbnRyeTsKKwlxID0gcDsKKworCS8qIEdldCBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBOYW1lICovCisJcmV0ID0gQVNOMV9pdGVtX2V4X2QyaSgmaW50bmFtZS5hLAorCQkJICAgICAgICZwLCBsZW4sIEFTTjFfSVRFTV9ycHRyKFg1MDlfTkFNRV9JTlRFUk5BTCksCisJCQkgICAgICAgdGFnLCBhY2xhc3MsIG9wdCwgY3R4KTsKKwkKKwlpZihyZXQgPD0gMCkgcmV0dXJuIHJldDsKKworCWlmKCp2YWwpIHg1MDlfbmFtZV9leF9mcmVlKHZhbCwgTlVMTCk7CisJaWYoIXg1MDlfbmFtZV9leF9uZXcoJm5tLmEsIE5VTEwpKSBnb3RvIGVycjsKKwkvKiBXZSd2ZSBkZWNvZGVkIGl0OiBub3cgY2FjaGUgZW5jb2RpbmcgKi8KKwlpZighQlVGX01FTV9ncm93KG5tLngtPmJ5dGVzLCBwIC0gcSkpIGdvdG8gZXJyOworCW1lbWNweShubS54LT5ieXRlcy0+ZGF0YSwgcSwgcCAtIHEpOworCisJLyogQ29udmVydCBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiB0byBYNTA5X05BTUUgc3RydWN0dXJlICovCisJZm9yKGkgPSAwOyBpIDwgc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX251bShpbnRuYW1lLnMpOyBpKyspIHsKKwkJZW50cmllcyA9IHNrX1NUQUNLX09GX1g1MDlfTkFNRV9FTlRSWV92YWx1ZShpbnRuYW1lLnMsIGkpOworCQlmb3IoaiA9IDA7IGogPCBza19YNTA5X05BTUVfRU5UUllfbnVtKGVudHJpZXMpOyBqKyspIHsKKwkJCWVudHJ5ID0gc2tfWDUwOV9OQU1FX0VOVFJZX3ZhbHVlKGVudHJpZXMsIGopOworCQkJZW50cnktPnNldCA9IGk7CisJCQlpZighc2tfWDUwOV9OQU1FX0VOVFJZX3B1c2gobm0ueC0+ZW50cmllcywgZW50cnkpKQorCQkJCWdvdG8gZXJyOworCQl9CisJCXNrX1g1MDlfTkFNRV9FTlRSWV9mcmVlKGVudHJpZXMpOworCX0KKwlza19TVEFDS19PRl9YNTA5X05BTUVfRU5UUllfZnJlZShpbnRuYW1lLnMpOworCXJldCA9IHg1MDlfbmFtZV9jYW5vbihubS54KTsKKwlpZiAoIXJldCkKKwkJZ290byBlcnI7CisJbm0ueC0+bW9kaWZpZWQgPSAwOworCSp2YWwgPSBubS5hOworCSppbiA9IHA7CisJcmV0dXJuIHJldDsKK2VycjoKKyAgICAgICAgaWYgKG5tLnggIT0gTlVMTCkKKwkJWDUwOV9OQU1FX2ZyZWUobm0ueCk7CisJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgeDUwOV9uYW1lX2V4X2QyaSwgRVJSX1JfQVNOMV9MSUIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHg1MDlfbmFtZV9leF9pMmQoQVNOMV9WQUxVRSAqKnZhbCwgdW5zaWduZWQgY2hhciAqKm91dCwgY29uc3QgQVNOMV9JVEVNICppdCwgaW50IHRhZywgaW50IGFjbGFzcykKK3sKKwlpbnQgcmV0OworCVg1MDlfTkFNRSAqYSA9IChYNTA5X05BTUUgKikqdmFsOworCWlmKGEtPm1vZGlmaWVkKSB7CisJCXJldCA9IHg1MDlfbmFtZV9lbmNvZGUoYSk7CisJCWlmKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlyZXQgPSB4NTA5X25hbWVfY2Fub24oYSk7CisJCWlmKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KKwlyZXQgPSBhLT5ieXRlcy0+bGVuZ3RoOworCWlmKG91dCAhPSBOVUxMKSB7CisJCW1lbWNweSgqb3V0LGEtPmJ5dGVzLT5kYXRhLHJldCk7CisJCSpvdXQrPXJldDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbG9jYWxfc2tfWDUwOV9OQU1FX0VOVFJZX2ZyZWUoU1RBQ0tfT0YoWDUwOV9OQU1FX0VOVFJZKSAqbmUpCisJeworCXNrX1g1MDlfTkFNRV9FTlRSWV9mcmVlKG5lKTsKKwl9CisKK3N0YXRpYyB2b2lkIGxvY2FsX3NrX1g1MDlfTkFNRV9FTlRSWV9wb3BfZnJlZShTVEFDS19PRihYNTA5X05BTUVfRU5UUlkpICpuZSkKKwl7CisJc2tfWDUwOV9OQU1FX0VOVFJZX3BvcF9mcmVlKG5lLCBYNTA5X05BTUVfRU5UUllfZnJlZSk7CisJfQorCitzdGF0aWMgaW50IHg1MDlfbmFtZV9lbmNvZGUoWDUwOV9OQU1FICphKQoreworCXVuaW9uIHsgU1RBQ0tfT0YoU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZKSAqczsKKwkJQVNOMV9WQUxVRSAqYTsgfSBpbnRuYW1lID0ge05VTEx9OworCWludCBsZW47CisJdW5zaWduZWQgY2hhciAqcDsKKwlTVEFDS19PRihYNTA5X05BTUVfRU5UUlkpICplbnRyaWVzID0gTlVMTDsKKwlYNTA5X05BTUVfRU5UUlkgKmVudHJ5OworCWludCBzZXQgPSAtMTsKKwlzaXplX3QgaTsKKwlpbnRuYW1lLnMgPSBza19TVEFDS19PRl9YNTA5X05BTUVfRU5UUllfbmV3X251bGwoKTsKKwlpZighaW50bmFtZS5zKSBnb3RvIG1lbWVycjsKKwlmb3IoaSA9IDA7IGkgPCBza19YNTA5X05BTUVfRU5UUllfbnVtKGEtPmVudHJpZXMpOyBpKyspIHsKKwkJZW50cnkgPSBza19YNTA5X05BTUVfRU5UUllfdmFsdWUoYS0+ZW50cmllcywgaSk7CisJCWlmKGVudHJ5LT5zZXQgIT0gc2V0KSB7CisJCQllbnRyaWVzID0gc2tfWDUwOV9OQU1FX0VOVFJZX25ld19udWxsKCk7CisJCQlpZighZW50cmllcykgZ290byBtZW1lcnI7CisJCQlpZighc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX3B1c2goaW50bmFtZS5zLAorCQkJCQkJCSAgICAgZW50cmllcykpCisJCQkJZ290byBtZW1lcnI7CisJCQlzZXQgPSBlbnRyeS0+c2V0OworCQl9CisJCWlmKCFza19YNTA5X05BTUVfRU5UUllfcHVzaChlbnRyaWVzLCBlbnRyeSkpIGdvdG8gbWVtZXJyOworCX0KKwlsZW4gPSBBU04xX2l0ZW1fZXhfaTJkKCZpbnRuYW1lLmEsIE5VTEwsCisJCQkgICAgICAgQVNOMV9JVEVNX3JwdHIoWDUwOV9OQU1FX0lOVEVSTkFMKSwgLTEsIC0xKTsKKwlpZiAoIUJVRl9NRU1fZ3JvdyhhLT5ieXRlcyxsZW4pKSBnb3RvIG1lbWVycjsKKwlwPSh1bnNpZ25lZCBjaGFyICopYS0+Ynl0ZXMtPmRhdGE7CisJQVNOMV9pdGVtX2V4X2kyZCgmaW50bmFtZS5hLAorCQkJICZwLCBBU04xX0lURU1fcnB0cihYNTA5X05BTUVfSU5URVJOQUwpLCAtMSwgLTEpOworCXNrX1NUQUNLX09GX1g1MDlfTkFNRV9FTlRSWV9wb3BfZnJlZShpbnRuYW1lLnMsCisJCQkJCSAgICAgbG9jYWxfc2tfWDUwOV9OQU1FX0VOVFJZX2ZyZWUpOworCWEtPm1vZGlmaWVkID0gMDsKKwlyZXR1cm4gbGVuOworbWVtZXJyOgorCXNrX1NUQUNLX09GX1g1MDlfTkFNRV9FTlRSWV9wb3BfZnJlZShpbnRuYW1lLnMsCisJCQkJCSAgICAgbG9jYWxfc2tfWDUwOV9OQU1FX0VOVFJZX2ZyZWUpOworCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIHg1MDlfbmFtZV9lbmNvZGUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgeDUwOV9uYW1lX2V4X3ByaW50KEJJTyAqb3V0LCBBU04xX1ZBTFVFICoqcHZhbCwKKwkJCQkJCWludCBpbmRlbnQsCisJCQkJCQljb25zdCBjaGFyICpmbmFtZSwgCisJCQkJCQljb25zdCBBU04xX1BDVFggKnBjdHgpCisJeworCWlmIChYNTA5X05BTUVfcHJpbnRfZXgob3V0LCAoWDUwOV9OQU1FICopKnB2YWwsCisJCQkJCWluZGVudCwgcGN0eC0+bm1fZmxhZ3MpIDw9IDApCisJCXJldHVybiAwOworCXJldHVybiAyOworCX0KKworLyogVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgdGhlIGNhbm9uaWNhbCBlbmNvZGluZyBvZiB0aGUgTmFtZSBzdHJ1Y3R1cmUuCisgKiBJbiBpdCBhbGwgc3RyaW5ncyBhcmUgY29udmVydGVkIHRvIFVURjgsIGxlYWRpbmcsIHRyYWlsaW5nIGFuZAorICogbXVsdGlwbGUgc3BhY2VzIGNvbGxhcHNlZCwgY29udmVydGVkIHRvIGxvd2VyIGNhc2UgYW5kIHRoZSBsZWFkaW5nCisgKiBTRVFVRU5DRSBoZWFkZXIgcmVtb3ZlZC4KKyAqCisgKiBJbiBmdXR1cmUgd2UgY291bGQgYWxzbyBub3JtYWxpemUgdGhlIFVURjggdG9vLgorICoKKyAqIEJ5IGRvaW5nIHRoaXMgY29tcGFyaXNvbiBvZiBOYW1lIHN0cnVjdHVyZXMgY2FuIGJlIHJhcGlkbHkKKyAqIHBlcmZvbWVkIGJ5IGp1c3QgdXNpbmcgbWVtY21wKCkgb2YgdGhlIGNhbm9uaWNhbCBlbmNvZGluZy4KKyAqIEJ5IG9taXR0aW5nIHRoZSBsZWFkaW5nIFNFUVVFTkNFIG5hbWUgY29uc3RyYWludHMgb2YgdHlwZQorICogZGlyTmFtZSBjYW4gYWxzbyBiZSBjaGVja2VkIHdpdGggYSBzaW1wbGUgbWVtY21wKCkuCisgKi8KKworc3RhdGljIGludCB4NTA5X25hbWVfY2Fub24oWDUwOV9OQU1FICphKQorCXsKKwl1bnNpZ25lZCBjaGFyICpwOworCVNUQUNLX09GKFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSkgKmludG5hbWUgPSBOVUxMOworCVNUQUNLX09GKFg1MDlfTkFNRV9FTlRSWSkgKmVudHJpZXMgPSBOVUxMOworCVg1MDlfTkFNRV9FTlRSWSAqZW50cnksICp0bXBlbnRyeSA9IE5VTEw7CisJaW50IHNldCA9IC0xLCByZXQgPSAwOworCXNpemVfdCBpOworCisJaWYgKGEtPmNhbm9uX2VuYykKKwkJeworCQlPUEVOU1NMX2ZyZWUoYS0+Y2Fub25fZW5jKTsKKwkJYS0+Y2Fub25fZW5jID0gTlVMTDsKKwkJfQorCS8qIFNwZWNpYWwgY2FzZTogZW1wdHkgWDUwOV9OQU1FID0+IG51bGwgZW5jb2RpbmcgKi8KKwlpZiAoc2tfWDUwOV9OQU1FX0VOVFJZX251bShhLT5lbnRyaWVzKSA9PSAwKQorCQl7CisJCWEtPmNhbm9uX2VuY2xlbiA9IDA7CisJCXJldHVybiAxOworCQl9CisJaW50bmFtZSA9IHNrX1NUQUNLX09GX1g1MDlfTkFNRV9FTlRSWV9uZXdfbnVsbCgpOworCWlmKCFpbnRuYW1lKQorCQlnb3RvIGVycjsKKwlmb3IoaSA9IDA7IGkgPCBza19YNTA5X05BTUVfRU5UUllfbnVtKGEtPmVudHJpZXMpOyBpKyspCisJCXsKKwkJZW50cnkgPSBza19YNTA5X05BTUVfRU5UUllfdmFsdWUoYS0+ZW50cmllcywgaSk7CisJCWlmKGVudHJ5LT5zZXQgIT0gc2V0KQorCQkJeworCQkJZW50cmllcyA9IHNrX1g1MDlfTkFNRV9FTlRSWV9uZXdfbnVsbCgpOworCQkJaWYoIWVudHJpZXMpCisJCQkJZ290byBlcnI7CisJCQlpZighc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX3B1c2goaW50bmFtZSwgZW50cmllcykpCisJCQkJZ290byBlcnI7CisJCQlzZXQgPSBlbnRyeS0+c2V0OworCQkJfQorCQl0bXBlbnRyeSA9IFg1MDlfTkFNRV9FTlRSWV9uZXcoKTsKKwkJdG1wZW50cnktPm9iamVjdCA9IE9CSl9kdXAoZW50cnktPm9iamVjdCk7CisJCWlmICghYXNuMV9zdHJpbmdfY2Fub24odG1wZW50cnktPnZhbHVlLCBlbnRyeS0+dmFsdWUpKQorCQkJZ290byBlcnI7CisJCWlmKCFza19YNTA5X05BTUVfRU5UUllfcHVzaChlbnRyaWVzLCB0bXBlbnRyeSkpCisJCQlnb3RvIGVycjsKKwkJdG1wZW50cnkgPSBOVUxMOworCQl9CisKKwkvKiBGaW5hbGx5IGdlbmVyYXRlIGVuY29kaW5nICovCisKKwlhLT5jYW5vbl9lbmNsZW4gPSBpMmRfbmFtZV9jYW5vbihpbnRuYW1lLCBOVUxMKTsKKworCXAgPSBPUEVOU1NMX21hbGxvYyhhLT5jYW5vbl9lbmNsZW4pOworCisJaWYgKCFwKQorCQlnb3RvIGVycjsKKworCWEtPmNhbm9uX2VuYyA9IHA7CisKKwlpMmRfbmFtZV9jYW5vbihpbnRuYW1lLCAmcCk7CisKKwlyZXQgPSAxOworCisJZXJyOgorCisJaWYgKHRtcGVudHJ5KQorCQlYNTA5X05BTUVfRU5UUllfZnJlZSh0bXBlbnRyeSk7CisJaWYgKGludG5hbWUpCisJCXNrX1NUQUNLX09GX1g1MDlfTkFNRV9FTlRSWV9wb3BfZnJlZShpbnRuYW1lLAorCQkJCQlsb2NhbF9za19YNTA5X05BTUVfRU5UUllfcG9wX2ZyZWUpOworCXJldHVybiByZXQ7CisJfQorCisvKiBCaXRtYXAgb2YgYWxsIHRoZSB0eXBlcyBvZiBzdHJpbmcgdGhhdCB3aWxsIGJlIGNhbm9uaWNhbGl6ZWQuICovCisKKyNkZWZpbmUgQVNOMV9NQVNLX0NBTk9OCVwKKwkoQl9BU04xX1VURjhTVFJJTkcgfCBCX0FTTjFfQk1QU1RSSU5HIHwgQl9BU04xX1VOSVZFUlNBTFNUUklORyBcCisJfCBCX0FTTjFfUFJJTlRBQkxFU1RSSU5HIHwgQl9BU04xX1Q2MVNUUklORyB8IEJfQVNOMV9JQTVTVFJJTkcgXAorCXwgQl9BU04xX1ZJU0lCTEVTVFJJTkcpCisJCisKK3N0YXRpYyBpbnQgYXNuMV9zdHJpbmdfY2Fub24oQVNOMV9TVFJJTkcgKm91dCwgQVNOMV9TVFJJTkcgKmluKQorCXsKKwl1bnNpZ25lZCBjaGFyICp0bywgKmZyb207CisJaW50IGxlbiwgaTsKKworCS8qIElmIHR5cGUgbm90IGluIGJpdG1hc2sganVzdCBjb3B5IHN0cmluZyBhY3Jvc3MgKi8KKwlpZiAoIShBU04xX3RhZzJiaXQoaW4tPnR5cGUpICYgQVNOMV9NQVNLX0NBTk9OKSkKKwkJeworCQlpZiAoIUFTTjFfU1RSSU5HX2NvcHkob3V0LCBpbikpCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIDE7CisJCX0KKworCW91dC0+dHlwZSA9IFZfQVNOMV9VVEY4U1RSSU5HOworCW91dC0+bGVuZ3RoID0gQVNOMV9TVFJJTkdfdG9fVVRGOCgmb3V0LT5kYXRhLCBpbik7CisJaWYgKG91dC0+bGVuZ3RoID09IC0xKQorCQlyZXR1cm4gMDsKKworCXRvID0gb3V0LT5kYXRhOworCWZyb20gPSB0bzsKKworCWxlbiA9IG91dC0+bGVuZ3RoOworCisJLyogQ29udmVydCBzdHJpbmcgaW4gcGxhY2UgdG8gY2Fub25pY2FsIGZvcm0uCisJICogVWx0aW1hdGVseSB3ZSBtYXkgbmVlZCB0byBoYW5kbGUgYSB3aWRlciByYW5nZSBvZiBjaGFyYWN0ZXJzCisJICogYnV0IGZvciBub3cgaWdub3JlIGFueXRoaW5nIHdpdGggTVNCIHNldCBhbmQgcmVseSBvbiB0aGUKKwkgKiBpc3NwYWNlKCkgYW5kIHRvbG93ZXIoKSBmdW5jdGlvbnMuCisJICovCisKKwkvKiBJZ25vcmUgbGVhZGluZyBzcGFjZXMgKi8KKwl3aGlsZSgobGVuID4gMCkgJiYgISgqZnJvbSAmIDB4ODApICYmIGlzc3BhY2UoKmZyb20pKQorCQl7CisJCWZyb20rKzsKKwkJbGVuLS07CisJCX0KKworCXRvID0gZnJvbSArIGxlbiAtIDE7CisKKwkvKiBJZ25vcmUgdHJhaWxpbmcgc3BhY2VzICovCisJd2hpbGUgKChsZW4gPiAwKSAmJiAhKCp0byAmIDB4ODApICYmIGlzc3BhY2UoKnRvKSkKKwkJeworCQl0by0tOworCQlsZW4tLTsKKwkJfQorCisJdG8gPSBvdXQtPmRhdGE7CisKKwlpID0gMDsKKwl3aGlsZShpIDwgbGVuKQorCQl7CisJCS8qIElmIE1TQiBzZXQganVzdCBjb3B5IGFjcm9zcyAqLworCQlpZiAoKmZyb20gJiAweDgwKQorCQkJeworCQkJKnRvKysgPSAqZnJvbSsrOworCQkJaSsrOworCQkJfQorCQkvKiBDb2xsYXBzZSBtdWx0aXBsZSBzcGFjZXMgKi8KKwkJZWxzZSBpZiAoaXNzcGFjZSgqZnJvbSkpCisJCQl7CisJCQkvKiBDb3B5IG9uZSBzcGFjZSBhY3Jvc3MgKi8KKwkJCSp0bysrID0gJyAnOworCQkJLyogSWdub3JlIHN1YnNlcXVlbnQgc3BhY2VzLiBOb3RlOiBkb24ndCBuZWVkIHRvCisJCQkgKiBjaGVjayBsZW4gaGVyZSBiZWNhdXNlIHdlIGtub3cgdGhlIGxhc3QgCisJCQkgKiBjaGFyYWN0ZXIgaXMgYSBub24tc3BhY2Ugc28gd2UgY2FuJ3Qgb3ZlcmZsb3cuCisJCQkgKi8KKwkJCWRvCisJCQkJeworCQkJCWZyb20rKzsKKwkJCQlpKys7CisJCQkJfQorCQkJd2hpbGUoISgqZnJvbSAmIDB4ODApICYmIGlzc3BhY2UoKmZyb20pKTsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJKnRvKysgPSB0b2xvd2VyKCpmcm9tKTsKKwkJCWZyb20rKzsKKwkJCWkrKzsKKwkJCX0KKwkJfQorCisJb3V0LT5sZW5ndGggPSB0byAtIG91dC0+ZGF0YTsKKworCXJldHVybiAxOworCisJfQorCitzdGF0aWMgaW50IGkyZF9uYW1lX2Nhbm9uKFNUQUNLX09GKFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSkgKl9pbnRuYW1lLAorCQkJICB1bnNpZ25lZCBjaGFyICoqaW4pCisJeworCWludCBsZW4sIGx0bXA7CisJc2l6ZV90IGk7CisJQVNOMV9WQUxVRSAqdjsKKwlTVEFDS19PRihBU04xX1ZBTFVFKSAqaW50bmFtZSA9IChTVEFDS19PRihBU04xX1ZBTFVFKSAqKV9pbnRuYW1lOworCisJbGVuID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgc2tfQVNOMV9WQUxVRV9udW0oaW50bmFtZSk7IGkrKykKKwkJeworCQl2ID0gc2tfQVNOMV9WQUxVRV92YWx1ZShpbnRuYW1lLCBpKTsKKwkJbHRtcCA9IEFTTjFfaXRlbV9leF9pMmQoJnYsIGluLAorCQkJQVNOMV9JVEVNX3JwdHIoWDUwOV9OQU1FX0VOVFJJRVMpLCAtMSwgLTEpOworCQlpZiAobHRtcCA8IDApCisJCQlyZXR1cm4gbHRtcDsKKwkJbGVuICs9IGx0bXA7CisJCX0KKwlyZXR1cm4gbGVuOworCX0KKworaW50IFg1MDlfTkFNRV9zZXQoWDUwOV9OQU1FICoqeG4sIFg1MDlfTkFNRSAqbmFtZSkKKwl7CisJWDUwOV9OQU1FICppbjsKKworCWlmICgheG4gfHwgIW5hbWUpIHJldHVybigwKTsKKworCWlmICgqeG4gIT0gbmFtZSkKKwkJeworCQlpbj1YNTA5X05BTUVfZHVwKG5hbWUpOworCQlpZiAoaW4gIT0gTlVMTCkKKwkJCXsKKwkJCVg1MDlfTkFNRV9mcmVlKCp4bik7CisJCQkqeG49aW47CisJCQl9CisJCX0KKwlyZXR1cm4oKnhuICE9IE5VTEwpOworCX0KKwkKK0lNUExFTUVOVF9BU04xX1NFVF9PRihYNTA5X05BTUVfRU5UUlkpCmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOS94X3BrZXkuYyBiL2NyeXB0by94NTA5L3hfcGtleS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZDI5ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOS94X3BrZXkuYwpAQCAtMCwwICsxLDE0NyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xX21hYy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKworCitPUEVOU1NMX0RFQ0xBUkVfRVJST1JfRlVOQ1RJT04oWDUwOSwgZDJpX1g1MDlfUEtFWSk7CitPUEVOU1NMX0RFQ0xBUkVfRVJST1JfRlVOQ1RJT04oWDUwOSwgWDUwOV9QS0VZX25ldyk7CisKKy8qIG5lZWQgdG8gaW1wbGVtZW50ICovCitpbnQgaTJkX1g1MDlfUEtFWShYNTA5X1BLRVkgKmEsIHVuc2lnbmVkIGNoYXIgKipwcCkKKwl7CisJcmV0dXJuKDApOworCX0KKworWDUwOV9QS0VZICpkMmlfWDUwOV9QS0VZKFg1MDlfUEtFWSAqKmEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwgbG9uZyBsZW5ndGgpCisJeworCWludCBpOworCU1fQVNOMV9EMklfdmFycyhhLFg1MDlfUEtFWSAqLFg1MDlfUEtFWV9uZXcpOworCisJTV9BU04xX0QySV9Jbml0KCk7CisJTV9BU04xX0QySV9zdGFydF9zZXF1ZW5jZSgpOworCU1fQVNOMV9EMklfZ2V0X3goWDUwOV9BTEdPUixyZXQtPmVuY19hbGdvcixkMmlfWDUwOV9BTEdPUik7CisJTV9BU04xX0QySV9nZXRfeChBU04xX09DVEVUX1NUUklORyxyZXQtPmVuY19wa2V5LGQyaV9BU04xX09DVEVUX1NUUklORyk7CisKKwlyZXQtPmNpcGhlci5jaXBoZXI9TlVMTDsKKworICAgICAgICAvKiBUT0RPKGZvcmspOiBmaXggKi8KKwkvKnJldC0+Y2lwaGVyLmNpcGhlcj1FVlBfZ2V0X2NpcGhlcmJ5bmFtZSgKKwkJT0JKX25pZDJsbihPQkpfb2JqMm5pZChyZXQtPmVuY19hbGdvci0+YWxnb3JpdGhtKSkpOyovCisKKwlpZiAocmV0LT5jaXBoZXIuY2lwaGVyID09IE5VTEwpCisJCXsKKwkJYy5lcnJvcj1BU04xX1JfVU5TVVBQT1JURURfQ0lQSEVSOworCQljLmxpbmU9X19MSU5FX187CisJCWdvdG8gZXJyOworCQl9CisJaWYgKHJldC0+ZW5jX2FsZ29yLT5wYXJhbWV0ZXItPnR5cGUgPT0gVl9BU04xX09DVEVUX1NUUklORykgCisJCXsKKwkJaT1yZXQtPmVuY19hbGdvci0+cGFyYW1ldGVyLT52YWx1ZS5vY3RldF9zdHJpbmctPmxlbmd0aDsKKwkJaWYgKGkgPiBFVlBfTUFYX0lWX0xFTkdUSCkKKwkJCXsKKwkJCWMuZXJyb3I9QVNOMV9SX0lWX1RPT19MQVJHRTsKKwkJCWMubGluZT1fX0xJTkVfXzsKKwkJCWdvdG8gZXJyOworCQkJfQorCQltZW1jcHkocmV0LT5jaXBoZXIuaXYsCisJCQlyZXQtPmVuY19hbGdvci0+cGFyYW1ldGVyLT52YWx1ZS5vY3RldF9zdHJpbmctPmRhdGEsaSk7CisJCX0KKwllbHNlCisJCW1lbXNldChyZXQtPmNpcGhlci5pdiwwLEVWUF9NQVhfSVZfTEVOR1RIKTsKKwlNX0FTTjFfRDJJX0ZpbmlzaChhLFg1MDlfUEtFWV9mcmVlLFg1MDlfRl9kMmlfWDUwOV9QS0VZKTsKKwl9CisKK1g1MDlfUEtFWSAqWDUwOV9QS0VZX25ldyh2b2lkKQorCXsKKwlYNTA5X1BLRVkgKnJldD1OVUxMOworCUFTTjFfQ1RYIGM7CisKKwlNX0FTTjFfTmV3X01hbGxvYyhyZXQsWDUwOV9QS0VZKTsKKwlyZXQtPnZlcnNpb249MDsKKwlNX0FTTjFfTmV3KHJldC0+ZW5jX2FsZ29yLFg1MDlfQUxHT1JfbmV3KTsKKwlNX0FTTjFfTmV3KHJldC0+ZW5jX3BrZXksTV9BU04xX09DVEVUX1NUUklOR19uZXcpOworCXJldC0+ZGVjX3BrZXk9TlVMTDsKKwlyZXQtPmtleV9sZW5ndGg9MDsKKwlyZXQtPmtleV9kYXRhPU5VTEw7CisJcmV0LT5rZXlfZnJlZT0wOworCXJldC0+Y2lwaGVyLmNpcGhlcj1OVUxMOworCW1lbXNldChyZXQtPmNpcGhlci5pdiwwLEVWUF9NQVhfSVZfTEVOR1RIKTsKKwlyZXQtPnJlZmVyZW5jZXM9MTsKKwlyZXR1cm4ocmV0KTsKKwlNX0FTTjFfTmV3X0Vycm9yKFg1MDlfRl9YNTA5X1BLRVlfbmV3KTsKKwl9CisKK3ZvaWQgWDUwOV9QS0VZX2ZyZWUoWDUwOV9QS0VZICp4KQorCXsKKwlpbnQgaTsKKworCWlmICh4ID09IE5VTEwpIHJldHVybjsKKworCWk9Q1JZUFRPX2FkZCgmeC0+cmVmZXJlbmNlcywtMSxDUllQVE9fTE9DS19YNTA5X1BLRVkpOworCWlmIChpID4gMCkgcmV0dXJuOworCisJaWYgKHgtPmVuY19hbGdvciAhPSBOVUxMKSBYNTA5X0FMR09SX2ZyZWUoeC0+ZW5jX2FsZ29yKTsKKwlpZiAoeC0+ZW5jX3BrZXkgIT0gTlVMTCkgTV9BU04xX09DVEVUX1NUUklOR19mcmVlKHgtPmVuY19wa2V5KTsKKwlpZiAoeC0+ZGVjX3BrZXkgIT0gTlVMTClFVlBfUEtFWV9mcmVlKHgtPmRlY19wa2V5KTsKKwlpZiAoKHgtPmtleV9kYXRhICE9IE5VTEwpICYmICh4LT5rZXlfZnJlZSkpIE9QRU5TU0xfZnJlZSh4LT5rZXlfZGF0YSk7CisJT1BFTlNTTF9mcmVlKHgpOworCX0KZGlmZiAtLWdpdCBhL2NyeXB0by94NTA5L3hfcHVia2V5LmMgYi9jcnlwdG8veDUwOS94X3B1YmtleS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMWQ0YWYKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOS94X3B1YmtleS5jCkBAIC0wLDAgKzEsMzc5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKKyNpbmNsdWRlICIuLi9ldnAvaW50ZXJuYWwuaCIKKworCisvKiBNaW5vciB0d2VhayB0byBvcGVyYXRpb246IGZyZWUgdXAgRVZQX1BLRVkgKi8KK3N0YXRpYyBpbnQgcHVia2V5X2NiKGludCBvcGVyYXRpb24sIEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0LAorCQkJdm9pZCAqZXhhcmcpCisJeworCWlmIChvcGVyYXRpb24gPT0gQVNOMV9PUF9GUkVFX1BPU1QpCisJCXsKKwkJWDUwOV9QVUJLRVkgKnB1YmtleSA9IChYNTA5X1BVQktFWSAqKSpwdmFsOworCQlFVlBfUEtFWV9mcmVlKHB1YmtleS0+cGtleSk7CisJCX0KKwlyZXR1cm4gMTsKKwl9CisKK0FTTjFfU0VRVUVOQ0VfY2IoWDUwOV9QVUJLRVksIHB1YmtleV9jYikgPSB7CisJQVNOMV9TSU1QTEUoWDUwOV9QVUJLRVksIGFsZ29yLCBYNTA5X0FMR09SKSwKKwlBU04xX1NJTVBMRShYNTA5X1BVQktFWSwgcHVibGljX2tleSwgQVNOMV9CSVRfU1RSSU5HKQorfSBBU04xX1NFUVVFTkNFX0VORF9jYihYNTA5X1BVQktFWSwgWDUwOV9QVUJLRVkpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhYNTA5X1BVQktFWSkKKworaW50IFg1MDlfUFVCS0VZX3NldChYNTA5X1BVQktFWSAqKngsIEVWUF9QS0VZICpwa2V5KQorCXsKKwlYNTA5X1BVQktFWSAqcGs9TlVMTDsKKworCWlmICh4ID09IE5VTEwpIHJldHVybigwKTsKKworCWlmICgocGs9WDUwOV9QVUJLRVlfbmV3KCkpID09IE5VTEwpIGdvdG8gZXJyb3I7CisKKwlpZiAocGtleS0+YW1ldGgpCisJCXsKKwkJaWYgKHBrZXktPmFtZXRoLT5wdWJfZW5jb2RlKQorCQkJeworCQkJaWYgKCFwa2V5LT5hbWV0aC0+cHViX2VuY29kZShwaywgcGtleSkpCisJCQkJeworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUFVCS0VZX3NldCwgWDUwOV9SX1BVQkxJQ19LRVlfRU5DT0RFX0VSUk9SKTsKKwkJCQlnb3RvIGVycm9yOworCQkJCX0KKwkJCX0KKwkJZWxzZQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9QVUJLRVlfc2V0LCBYNTA5X1JfTUVUSE9EX05PVF9TVVBQT1JURUQpOworCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJfQorCWVsc2UKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1BVQktFWV9zZXQsIFg1MDlfUl9VTlNVUFBPUlRFRF9BTEdPUklUSE0pOworCQlnb3RvIGVycm9yOworCQl9CisKKwlpZiAoKnggIT0gTlVMTCkKKwkJWDUwOV9QVUJLRVlfZnJlZSgqeCk7CisKKwkqeD1wazsKKworCXJldHVybiAxOworZXJyb3I6CisJaWYgKHBrICE9IE5VTEwpIFg1MDlfUFVCS0VZX2ZyZWUocGspOworCXJldHVybiAwOworCX0KKworRVZQX1BLRVkgKlg1MDlfUFVCS0VZX2dldChYNTA5X1BVQktFWSAqa2V5KQorCXsKKwlFVlBfUEtFWSAqcmV0PU5VTEw7CisKKwlpZiAoa2V5ID09IE5VTEwpIGdvdG8gZXJyb3I7CisKKwlpZiAoa2V5LT5wa2V5ICE9IE5VTEwpCisJCXsKKwkJQ1JZUFRPX2FkZCgma2V5LT5wa2V5LT5yZWZlcmVuY2VzLCAxLCBDUllQVE9fTE9DS19FVlBfUEtFWSk7CisJCXJldHVybiBrZXktPnBrZXk7CisJCX0KKworCWlmIChrZXktPnB1YmxpY19rZXkgPT0gTlVMTCkgZ290byBlcnJvcjsKKworCWlmICgocmV0ID0gRVZQX1BLRVlfbmV3KCkpID09IE5VTEwpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9QVUJLRVlfZ2V0LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCWdvdG8gZXJyb3I7CisJCX0KKworCWlmICghRVZQX1BLRVlfc2V0X3R5cGUocmV0LCBPQkpfb2JqMm5pZChrZXktPmFsZ29yLT5hbGdvcml0aG0pKSkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1BVQktFWV9nZXQsIFg1MDlfUl9VTlNVUFBPUlRFRF9BTEdPUklUSE0pOworCQlnb3RvIGVycm9yOworCQl9CisKKwlpZiAocmV0LT5hbWV0aC0+cHViX2RlY29kZSkKKwkJeworCQlpZiAoIXJldC0+YW1ldGgtPnB1Yl9kZWNvZGUocmV0LCBrZXkpKQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9QVUJLRVlfZ2V0LCBYNTA5X1JfUFVCTElDX0tFWV9ERUNPREVfRVJST1IpOworCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJfQorCWVsc2UKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1BVQktFWV9nZXQsIFg1MDlfUl9NRVRIT0RfTk9UX1NVUFBPUlRFRCk7CisJCWdvdG8gZXJyb3I7CisJCX0KKworCS8qIENoZWNrIHRvIHNlZSBpZiBhbm90aGVyIHRocmVhZCBzZXQga2V5LT5wa2V5IGZpcnN0ICovCisJQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19FVlBfUEtFWSk7CisJaWYgKGtleS0+cGtleSkKKwkJeworCQlDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfRVZQX1BLRVkpOworCQlFVlBfUEtFWV9mcmVlKHJldCk7CisJCXJldCA9IGtleS0+cGtleTsKKwkJfQorCWVsc2UKKwkJeworCQlrZXktPnBrZXkgPSByZXQ7CisJCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19FVlBfUEtFWSk7CisJCX0KKwlDUllQVE9fYWRkKCZyZXQtPnJlZmVyZW5jZXMsIDEsIENSWVBUT19MT0NLX0VWUF9QS0VZKTsKKworCXJldHVybiByZXQ7CisKKwllcnJvcjoKKwlpZiAocmV0ICE9IE5VTEwpCisJCUVWUF9QS0VZX2ZyZWUocmV0KTsKKwlyZXR1cm4oTlVMTCk7CisJfQorCisvKiBOb3cgdHdvIHBzZXVkbyBBU04xIHJvdXRpbmVzIHRoYXQgdGFrZSBhbiBFVlBfUEtFWSBzdHJ1Y3R1cmUKKyAqIGFuZCBlbmNvZGUgb3IgZGVjb2RlIGFzIFg1MDlfUFVCS0VZCisgKi8KKworRVZQX1BLRVkgKmQyaV9QVUJLRVkoRVZQX1BLRVkgKiphLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsCisJICAgICBsb25nIGxlbmd0aCkKKwl7CisJWDUwOV9QVUJLRVkgKnhwazsKKwlFVlBfUEtFWSAqcGt0bXA7CisJeHBrID0gZDJpX1g1MDlfUFVCS0VZKE5VTEwsIHBwLCBsZW5ndGgpOworCWlmKCF4cGspIHJldHVybiBOVUxMOworCXBrdG1wID0gWDUwOV9QVUJLRVlfZ2V0KHhwayk7CisJWDUwOV9QVUJLRVlfZnJlZSh4cGspOworCWlmKCFwa3RtcCkgcmV0dXJuIE5VTEw7CisJaWYoYSkKKwkJeworCQlFVlBfUEtFWV9mcmVlKCphKTsKKwkJKmEgPSBwa3RtcDsKKwkJfQorCXJldHVybiBwa3RtcDsKKwl9CisKK2ludCBpMmRfUFVCS0VZKGNvbnN0IEVWUF9QS0VZICphLCB1bnNpZ25lZCBjaGFyICoqcHApCisJeworCVg1MDlfUFVCS0VZICp4cGs9TlVMTDsKKwlpbnQgcmV0OworCWlmKCFhKSByZXR1cm4gMDsKKwlpZighWDUwOV9QVUJLRVlfc2V0KCZ4cGssIChFVlBfUEtFWSopIGEpKSByZXR1cm4gMDsKKwlyZXQgPSBpMmRfWDUwOV9QVUJLRVkoeHBrLCBwcCk7CisJWDUwOV9QVUJLRVlfZnJlZSh4cGspOworCXJldHVybiByZXQ7CisJfQorCisvKiBUaGUgZm9sbG93aW5nIGFyZSBlcXVpdmFsZW50cyBidXQgd2hpY2ggcmV0dXJuIFJTQSBhbmQgRFNBCisgKiBrZXlzCisgKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKK1JTQSAqZDJpX1JTQV9QVUJLRVkoUlNBICoqYSwgY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLAorCSAgICAgbG9uZyBsZW5ndGgpCisJeworCUVWUF9QS0VZICpwa2V5OworCVJTQSAqa2V5OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnE7CisJcSA9ICpwcDsKKwlwa2V5ID0gZDJpX1BVQktFWShOVUxMLCAmcSwgbGVuZ3RoKTsKKwlpZiAoIXBrZXkpIHJldHVybiBOVUxMOworCWtleSA9IEVWUF9QS0VZX2dldDFfUlNBKHBrZXkpOworCUVWUF9QS0VZX2ZyZWUocGtleSk7CisJaWYgKCFrZXkpIHJldHVybiBOVUxMOworCSpwcCA9IHE7CisJaWYgKGEpCisJCXsKKwkJUlNBX2ZyZWUoKmEpOworCQkqYSA9IGtleTsKKwkJfQorCXJldHVybiBrZXk7CisJfQorCitpbnQgaTJkX1JTQV9QVUJLRVkoY29uc3QgUlNBICphLCB1bnNpZ25lZCBjaGFyICoqcHApCisJeworCUVWUF9QS0VZICpwa3RtcDsKKwlpbnQgcmV0OworCWlmICghYSkgcmV0dXJuIDA7CisJcGt0bXAgPSBFVlBfUEtFWV9uZXcoKTsKKwlpZiAoIXBrdG1wKQorCQl7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIGkyZF9SU0FfUFVCS0VZLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiAwOworCQl9CisJRVZQX1BLRVlfc2V0MV9SU0EocGt0bXAsIChSU0EqKSBhKTsKKwlyZXQgPSBpMmRfUFVCS0VZKHBrdG1wLCBwcCk7CisJRVZQX1BLRVlfZnJlZShwa3RtcCk7CisJcmV0dXJuIHJldDsKKwl9CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorRFNBICpkMmlfRFNBX1BVQktFWShEU0EgKiphLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsCisJICAgICBsb25nIGxlbmd0aCkKKwl7CisJRVZQX1BLRVkgKnBrZXk7CisJRFNBICprZXk7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcTsKKwlxID0gKnBwOworCXBrZXkgPSBkMmlfUFVCS0VZKE5VTEwsICZxLCBsZW5ndGgpOworCWlmICghcGtleSkgcmV0dXJuIE5VTEw7CisJa2V5ID0gRVZQX1BLRVlfZ2V0MV9EU0EocGtleSk7CisJRVZQX1BLRVlfZnJlZShwa2V5KTsKKwlpZiAoIWtleSkgcmV0dXJuIE5VTEw7CisJKnBwID0gcTsKKwlpZiAoYSkKKwkJeworCQlEU0FfZnJlZSgqYSk7CisJCSphID0ga2V5OworCQl9CisJcmV0dXJuIGtleTsKKwl9CisKK2ludCBpMmRfRFNBX1BVQktFWShjb25zdCBEU0EgKmEsIHVuc2lnbmVkIGNoYXIgKipwcCkKKwl7CisJRVZQX1BLRVkgKnBrdG1wOworCWludCByZXQ7CisJaWYoIWEpIHJldHVybiAwOworCXBrdG1wID0gRVZQX1BLRVlfbmV3KCk7CisJaWYoIXBrdG1wKQorCQl7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIGkyZF9EU0FfUFVCS0VZLCAgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gMDsKKwkJfQorCUVWUF9QS0VZX3NldDFfRFNBKHBrdG1wLCAoRFNBKikgYSk7CisJcmV0ID0gaTJkX1BVQktFWShwa3RtcCwgcHApOworCUVWUF9QS0VZX2ZyZWUocGt0bXApOworCXJldHVybiByZXQ7CisJfQorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19FQworRUNfS0VZICpkMmlfRUNfUFVCS0VZKEVDX0tFWSAqKmEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwgbG9uZyBsZW5ndGgpCisJeworCUVWUF9QS0VZICpwa2V5OworCUVDX0tFWSAqa2V5OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnE7CisJcSA9ICpwcDsKKwlwa2V5ID0gZDJpX1BVQktFWShOVUxMLCAmcSwgbGVuZ3RoKTsKKwlpZiAoIXBrZXkpIHJldHVybihOVUxMKTsKKwlrZXkgPSBFVlBfUEtFWV9nZXQxX0VDX0tFWShwa2V5KTsKKwlFVlBfUEtFWV9mcmVlKHBrZXkpOworCWlmICgha2V5KSAgcmV0dXJuKE5VTEwpOworCSpwcCA9IHE7CisJaWYgKGEpCisJCXsKKwkJRUNfS0VZX2ZyZWUoKmEpOworCQkqYSA9IGtleTsKKwkJfQorCXJldHVybihrZXkpOworCX0KKworaW50IGkyZF9FQ19QVUJLRVkoY29uc3QgRUNfS0VZICphLCB1bnNpZ25lZCBjaGFyICoqcHApCisJeworCUVWUF9QS0VZICpwa3RtcDsKKwlpbnQgcmV0OworCWlmICghYSkJcmV0dXJuKDApOworCWlmICgocGt0bXAgPSBFVlBfUEtFWV9uZXcoKSkgPT0gTlVMTCkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBpMmRfRUNfUFVCS0VZLCAgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4oMCk7CisJCX0KKwlFVlBfUEtFWV9zZXQxX0VDX0tFWShwa3RtcCwgKEVDX0tFWSopIGEpOworCXJldCA9IGkyZF9QVUJLRVkocGt0bXAsIHBwKTsKKwlFVlBfUEtFWV9mcmVlKHBrdG1wKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisjZW5kaWYKKworaW50IFg1MDlfUFVCS0VZX3NldDBfcGFyYW0oWDUwOV9QVUJLRVkgKnB1YiwgY29uc3QgQVNOMV9PQkpFQ1QgKmFvYmosCisJCQkJCWludCBwdHlwZSwgdm9pZCAqcHZhbCwKKwkJCQkJdW5zaWduZWQgY2hhciAqcGVuYywgaW50IHBlbmNsZW4pCisJeworCWlmICghWDUwOV9BTEdPUl9zZXQwKHB1Yi0+YWxnb3IsIGFvYmosIHB0eXBlLCBwdmFsKSkKKwkJcmV0dXJuIDA7CisJaWYgKHBlbmMpCisJCXsKKwkJaWYgKHB1Yi0+cHVibGljX2tleS0+ZGF0YSkKKwkJCU9QRU5TU0xfZnJlZShwdWItPnB1YmxpY19rZXktPmRhdGEpOworCQlwdWItPnB1YmxpY19rZXktPmRhdGEgPSBwZW5jOworCQlwdWItPnB1YmxpY19rZXktPmxlbmd0aCA9IHBlbmNsZW47CisgIAkJLyogU2V0IG51bWJlciBvZiB1bnVzZWQgYml0cyB0byB6ZXJvICovCisJCXB1Yi0+cHVibGljX2tleS0+ZmxhZ3MmPSB+KEFTTjFfU1RSSU5HX0ZMQUdfQklUU19MRUZUfDB4MDcpOworCQlwdWItPnB1YmxpY19rZXktPmZsYWdzfD1BU04xX1NUUklOR19GTEFHX0JJVFNfTEVGVDsKKwkJfQorCXJldHVybiAxOworCX0KKworaW50IFg1MDlfUFVCS0VZX2dldDBfcGFyYW0oQVNOMV9PQkpFQ1QgKipwcGthbGcsCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKipwaywgaW50ICpwcGtsZW4sCisJCVg1MDlfQUxHT1IgKipwYSwKKwkJWDUwOV9QVUJLRVkgKnB1YikKKwl7CisJaWYgKHBwa2FsZykKKwkJKnBwa2FsZyA9IHB1Yi0+YWxnb3ItPmFsZ29yaXRobTsKKwlpZiAocGspCisJCXsKKwkJKnBrID0gcHViLT5wdWJsaWNfa2V5LT5kYXRhOworCQkqcHBrbGVuID0gcHViLT5wdWJsaWNfa2V5LT5sZW5ndGg7CisJCX0KKwlpZiAocGEpCisJCSpwYSA9IHB1Yi0+YWxnb3I7CisJcmV0dXJuIDE7CisJfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3g1MDkveF9yZXEuYyBiL2NyeXB0by94NTA5L3hfcmVxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJmNDYxMwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94NTA5L3hfcmVxLmMKQEAgLTAsMCArMSwxMTIgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvdGhyZWFkLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKKy8qIFg1MDlfUkVRX0lORk8gaXMgaGFuZGxlZCBpbiBhbiB1bnVzdWFsIHdheSB0byBnZXQgcm91bmQKKyAqIGludmFsaWQgZW5jb2RpbmdzLiBTb21lIGJyb2tlbiBjZXJ0aWZpY2F0ZSByZXF1ZXN0cyBkb24ndAorICogZW5jb2RlIHRoZSBhdHRyaWJ1dGVzIGZpZWxkIGlmIGl0IGlzIGVtcHR5LiBUaGlzIGlzIGluCisgKiB2aW9sYXRpb24gb2YgUEtDUyMxMCBidXQgd2UgbmVlZCB0byB0b2xlcmF0ZSBpdC4gV2UgZG8KKyAqIHRoaXMgYnkgbWFraW5nIHRoZSBhdHRyaWJ1dGVzIGZpZWxkIE9QVElPTkFMIHRoZW4gdXNpbmcKKyAqIHRoZSBjYWxsYmFjayB0byBpbml0aWFsaXNlIGl0IHRvIGFuIGVtcHR5IFNUQUNLLiAKKyAqCisgKiBUaGlzIG1lYW5zIHRoYXQgdGhlIGZpZWxkIHdpbGwgYmUgY29ycmVjdGx5IGVuY29kZWQgdW5sZXNzCisgKiB3ZSBOVUxMIG91dCB0aGUgZmllbGQuCisgKgorICogQXMgYSByZXN1bHQgd2Ugbm8gbG9uZ2VyIG5lZWQgdGhlIHJlcV9rbHVkZ2UgZmllbGQgYmVjYXVzZQorICogdGhlIGluZm9ybWF0aW9uIGlzIG5vdyBjb250YWluZWQgaW4gdGhlIGF0dHJpYnV0ZXMgZmllbGQ6CisgKiAxLiBJZiBpdCBpcyBOVUxMIHRoZW4gaXQncyB0aGUgaW52YWxpZCBvbWlzc2lvbi4KKyAqIDIuIElmIGl0IGlzIGVtcHR5IGl0IGlzIHRoZSBjb3JyZWN0IGVuY29kaW5nLgorICogMy4gSWYgaXQgaXMgbm90IGVtcHR5IHRoZW4gc29tZSBhdHRyaWJ1dGVzIGFyZSBwcmVzZW50LgorICoKKyAqLworCitzdGF0aWMgaW50IHJpbmZfY2IoaW50IG9wZXJhdGlvbiwgQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQsCisJCQkJCQkJdm9pZCAqZXhhcmcpCit7CisJWDUwOV9SRVFfSU5GTyAqcmluZiA9IChYNTA5X1JFUV9JTkZPICopKnB2YWw7CisKKwlpZihvcGVyYXRpb24gPT0gQVNOMV9PUF9ORVdfUE9TVCkgeworCQlyaW5mLT5hdHRyaWJ1dGVzID0gc2tfWDUwOV9BVFRSSUJVVEVfbmV3X251bGwoKTsKKwkJaWYoIXJpbmYtPmF0dHJpYnV0ZXMpIHJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworQVNOMV9TRVFVRU5DRV9lbmMoWDUwOV9SRVFfSU5GTywgZW5jLCByaW5mX2NiKSA9IHsKKwlBU04xX1NJTVBMRShYNTA5X1JFUV9JTkZPLCB2ZXJzaW9uLCBBU04xX0lOVEVHRVIpLAorCUFTTjFfU0lNUExFKFg1MDlfUkVRX0lORk8sIHN1YmplY3QsIFg1MDlfTkFNRSksCisJQVNOMV9TSU1QTEUoWDUwOV9SRVFfSU5GTywgcHVia2V5LCBYNTA5X1BVQktFWSksCisJLyogVGhpcyBpc24ndCByZWFsbHkgT1BUSU9OQUwgYnV0IGl0IGdldHMgcm91bmQgaW52YWxpZAorCSAqIGVuY29kaW5ncworCSAqLworCUFTTjFfSU1QX1NFVF9PRl9PUFQoWDUwOV9SRVFfSU5GTywgYXR0cmlidXRlcywgWDUwOV9BVFRSSUJVVEUsIDApCit9IEFTTjFfU0VRVUVOQ0VfRU5EX2VuYyhYNTA5X1JFUV9JTkZPLCBYNTA5X1JFUV9JTkZPKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoWDUwOV9SRVFfSU5GTykKKworQVNOMV9TRVFVRU5DRV9yZWYoWDUwOV9SRVEsIDAsIENSWVBUT19MT0NLX1g1MDlfUkVRKSA9IHsKKwlBU04xX1NJTVBMRShYNTA5X1JFUSwgcmVxX2luZm8sIFg1MDlfUkVRX0lORk8pLAorCUFTTjFfU0lNUExFKFg1MDlfUkVRLCBzaWdfYWxnLCBYNTA5X0FMR09SKSwKKwlBU04xX1NJTVBMRShYNTA5X1JFUSwgc2lnbmF0dXJlLCBBU04xX0JJVF9TVFJJTkcpCit9IEFTTjFfU0VRVUVOQ0VfRU5EX3JlZihYNTA5X1JFUSwgWDUwOV9SRVEpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhYNTA5X1JFUSkKK0lNUExFTUVOVF9BU04xX0RVUF9GVU5DVElPTihYNTA5X1JFUSkKZGlmZiAtLWdpdCBhL2NyeXB0by94NTA5L3hfc2lnLmMgYi9jcnlwdG8veDUwOS94X3NpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYmRiNjcKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOS94X3NpZy5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qIGNyeXB0by9hc24xL3hfc2lnLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorCisKK0FTTjFfU0VRVUVOQ0UoWDUwOV9TSUcpID0geworCUFTTjFfU0lNUExFKFg1MDlfU0lHLCBhbGdvciwgWDUwOV9BTEdPUiksCisJQVNOMV9TSU1QTEUoWDUwOV9TSUcsIGRpZ2VzdCwgQVNOMV9PQ1RFVF9TVFJJTkcpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKFg1MDlfU0lHKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoWDUwOV9TSUcpCmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOS94X3Nwa2kuYyBiL2NyeXB0by94NTA5L3hfc3BraS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YmYyNDYKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOS94X3Nwa2kuYwpAQCAtMCwwICsxLDc4IEBACisvKiBjcnlwdG8vYXNuMS94X3Nwa2kuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworIC8qIFRoaXMgbW9kdWxlIHdhcyBzZW5kIHRvIG1lIG15IFBhdCBSaWNoYXJkcyA8cGF0ckB4NTA5LmNvbT4gd2hvCisgICogd3JvdGUgaXQuICBJdCBpcyB1bmRlciBteSBDb3B5cmlnaHQgd2l0aCBoaXMgcGVybWlzc2lvbi4gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKworCitBU04xX1NFUVVFTkNFKE5FVFNDQVBFX1NQS0FDKSA9IHsKKwlBU04xX1NJTVBMRShORVRTQ0FQRV9TUEtBQywgcHVia2V5LCBYNTA5X1BVQktFWSksCisJQVNOMV9TSU1QTEUoTkVUU0NBUEVfU1BLQUMsIGNoYWxsZW5nZSwgQVNOMV9JQTVTVFJJTkcpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKE5FVFNDQVBFX1NQS0FDKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoTkVUU0NBUEVfU1BLQUMpCisKK0FTTjFfU0VRVUVOQ0UoTkVUU0NBUEVfU1BLSSkgPSB7CisJQVNOMV9TSU1QTEUoTkVUU0NBUEVfU1BLSSwgc3BrYWMsIE5FVFNDQVBFX1NQS0FDKSwKKwlBU04xX1NJTVBMRShORVRTQ0FQRV9TUEtJLCBzaWdfYWxnb3IsIFg1MDlfQUxHT1IpLAorCUFTTjFfU0lNUExFKE5FVFNDQVBFX1NQS0ksIHNpZ25hdHVyZSwgQVNOMV9CSVRfU1RSSU5HKQorfSBBU04xX1NFUVVFTkNFX0VORChORVRTQ0FQRV9TUEtJKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoTkVUU0NBUEVfU1BLSSkKZGlmZiAtLWdpdCBhL2NyeXB0by94NTA5L3hfdmFsLmMgYi9jcnlwdG8veDUwOS94X3ZhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MjAwZWUKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOS94X3ZhbC5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qIGNyeXB0by9hc24xL3hfdmFsLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorCisKK0FTTjFfU0VRVUVOQ0UoWDUwOV9WQUwpID0geworCUFTTjFfU0lNUExFKFg1MDlfVkFMLCBub3RCZWZvcmUsIEFTTjFfVElNRSksCisJQVNOMV9TSU1QTEUoWDUwOV9WQUwsIG5vdEFmdGVyLCBBU04xX1RJTUUpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKFg1MDlfVkFMKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoWDUwOV9WQUwpCmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOS94X3g1MDkuYyBiL2NyeXB0by94NTA5L3hfeDUwOS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMmNmZjQKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOS94X3g1MDkuYwpAQCAtMCwwICsxLDIwMyBAQAorLyogY3J5cHRvL2FzbjEveF94NTA5LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgorI2luY2x1ZGUgPG9wZW5zc2wvdGhyZWFkLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworCitBU04xX1NFUVVFTkNFX2VuYyhYNTA5X0NJTkYsIGVuYywgMCkgPSB7CisJQVNOMV9FWFBfT1BUKFg1MDlfQ0lORiwgdmVyc2lvbiwgQVNOMV9JTlRFR0VSLCAwKSwKKwlBU04xX1NJTVBMRShYNTA5X0NJTkYsIHNlcmlhbE51bWJlciwgQVNOMV9JTlRFR0VSKSwKKwlBU04xX1NJTVBMRShYNTA5X0NJTkYsIHNpZ25hdHVyZSwgWDUwOV9BTEdPUiksCisJQVNOMV9TSU1QTEUoWDUwOV9DSU5GLCBpc3N1ZXIsIFg1MDlfTkFNRSksCisJQVNOMV9TSU1QTEUoWDUwOV9DSU5GLCB2YWxpZGl0eSwgWDUwOV9WQUwpLAorCUFTTjFfU0lNUExFKFg1MDlfQ0lORiwgc3ViamVjdCwgWDUwOV9OQU1FKSwKKwlBU04xX1NJTVBMRShYNTA5X0NJTkYsIGtleSwgWDUwOV9QVUJLRVkpLAorCUFTTjFfSU1QX09QVChYNTA5X0NJTkYsIGlzc3VlclVJRCwgQVNOMV9CSVRfU1RSSU5HLCAxKSwKKwlBU04xX0lNUF9PUFQoWDUwOV9DSU5GLCBzdWJqZWN0VUlELCBBU04xX0JJVF9TVFJJTkcsIDIpLAorCUFTTjFfRVhQX1NFUVVFTkNFX09GX09QVChYNTA5X0NJTkYsIGV4dGVuc2lvbnMsIFg1MDlfRVhURU5TSU9OLCAzKQorfSBBU04xX1NFUVVFTkNFX0VORF9lbmMoWDUwOV9DSU5GLCBYNTA5X0NJTkYpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhYNTA5X0NJTkYpCisvKiBYNTA5IHRvcCBsZXZlbCBzdHJ1Y3R1cmUgbmVlZHMgYSBiaXQgb2YgY3VzdG9taXNhdGlvbiAqLworCitleHRlcm4gdm9pZCBwb2xpY3lfY2FjaGVfZnJlZShYNTA5X1BPTElDWV9DQUNIRSAqY2FjaGUpOworCitzdGF0aWMgaW50IHg1MDlfY2IoaW50IG9wZXJhdGlvbiwgQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQsCisJCQkJCQkJCXZvaWQgKmV4YXJnKQoreworCVg1MDkgKnJldCA9IChYNTA5ICopKnB2YWw7CisKKwlzd2l0Y2gob3BlcmF0aW9uKSB7CisKKwkJY2FzZSBBU04xX09QX05FV19QT1NUOgorCQlyZXQtPnZhbGlkPTA7CisJCXJldC0+bmFtZSA9IE5VTEw7CisJCXJldC0+ZXhfZmxhZ3MgPSAwOworCQlyZXQtPmV4X3BhdGhsZW4gPSAtMTsKKwkJcmV0LT5za2lkID0gTlVMTDsKKwkJcmV0LT5ha2lkID0gTlVMTDsKKwkJcmV0LT5hdXggPSBOVUxMOworCQlyZXQtPmNybGRwID0gTlVMTDsKKwkJQ1JZUFRPX25ld19leF9kYXRhKENSWVBUT19FWF9JTkRFWF9YNTA5LCByZXQsICZyZXQtPmV4X2RhdGEpOworCQlicmVhazsKKworCQljYXNlIEFTTjFfT1BfRDJJX1BPU1Q6CisJCWlmIChyZXQtPm5hbWUgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKHJldC0+bmFtZSk7CisJCXJldC0+bmFtZT1YNTA5X05BTUVfb25lbGluZShyZXQtPmNlcnRfaW5mby0+c3ViamVjdCxOVUxMLDApOworCQlicmVhazsKKworCQljYXNlIEFTTjFfT1BfRlJFRV9QT1NUOgorCQlDUllQVE9fZnJlZV9leF9kYXRhKENSWVBUT19FWF9JTkRFWF9YNTA5LCByZXQsICZyZXQtPmV4X2RhdGEpOworCQlYNTA5X0NFUlRfQVVYX2ZyZWUocmV0LT5hdXgpOworCQlBU04xX09DVEVUX1NUUklOR19mcmVlKHJldC0+c2tpZCk7CisJCUFVVEhPUklUWV9LRVlJRF9mcmVlKHJldC0+YWtpZCk7CisJCUNSTF9ESVNUX1BPSU5UU19mcmVlKHJldC0+Y3JsZHApOworCQlwb2xpY3lfY2FjaGVfZnJlZShyZXQtPnBvbGljeV9jYWNoZSk7CisJCUdFTkVSQUxfTkFNRVNfZnJlZShyZXQtPmFsdG5hbWUpOworCQlOQU1FX0NPTlNUUkFJTlRTX2ZyZWUocmV0LT5uYyk7CisKKwkJaWYgKHJldC0+bmFtZSAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUocmV0LT5uYW1lKTsKKwkJYnJlYWs7CisKKwl9CisKKwlyZXR1cm4gMTsKKworfQorCitBU04xX1NFUVVFTkNFX3JlZihYNTA5LCB4NTA5X2NiLCBDUllQVE9fTE9DS19YNTA5KSA9IHsKKwlBU04xX1NJTVBMRShYNTA5LCBjZXJ0X2luZm8sIFg1MDlfQ0lORiksCisJQVNOMV9TSU1QTEUoWDUwOSwgc2lnX2FsZywgWDUwOV9BTEdPUiksCisJQVNOMV9TSU1QTEUoWDUwOSwgc2lnbmF0dXJlLCBBU04xX0JJVF9TVFJJTkcpCit9IEFTTjFfU0VRVUVOQ0VfRU5EX3JlZihYNTA5LCBYNTA5KQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoWDUwOSkKK0lNUExFTUVOVF9BU04xX0RVUF9GVU5DVElPTihYNTA5KQorCitpbnQgWDUwOV9nZXRfZXhfbmV3X2luZGV4KGxvbmcgYXJnbCwgdm9pZCAqYXJncCwgQ1JZUFRPX0VYX25ldyAqbmV3X2Z1bmMsCisJICAgICBDUllQVE9fRVhfZHVwICpkdXBfZnVuYywgQ1JZUFRPX0VYX2ZyZWUgKmZyZWVfZnVuYykKKyAgICAgICAgeworCXJldHVybiBDUllQVE9fZ2V0X2V4X25ld19pbmRleChDUllQVE9fRVhfSU5ERVhfWDUwOSwgYXJnbCwgYXJncCwKKwkJCQluZXdfZnVuYywgZHVwX2Z1bmMsIGZyZWVfZnVuYyk7CisgICAgICAgIH0KKworaW50IFg1MDlfc2V0X2V4X2RhdGEoWDUwOSAqciwgaW50IGlkeCwgdm9pZCAqYXJnKQorCXsKKwlyZXR1cm4oQ1JZUFRPX3NldF9leF9kYXRhKCZyLT5leF9kYXRhLGlkeCxhcmcpKTsKKwl9CisKK3ZvaWQgKlg1MDlfZ2V0X2V4X2RhdGEoWDUwOSAqciwgaW50IGlkeCkKKwl7CisJcmV0dXJuKENSWVBUT19nZXRfZXhfZGF0YSgmci0+ZXhfZGF0YSxpZHgpKTsKKwl9CisKKy8qIFg1MDlfQVVYIEFTTjEgcm91dGluZXMuIFg1MDlfQVVYIGlzIHRoZSBuYW1lIGdpdmVuIHRvCisgKiBhIGNlcnRpZmljYXRlIHdpdGggZXh0cmEgaW5mbyB0YWdnZWQgb24gdGhlIGVuZC4gU2luY2UgdGhlc2UKKyAqIGZ1bmN0aW9ucyBzZXQgaG93IGEgY2VydGlmaWNhdGUgaXMgdHJ1c3RlZCB0aGV5IHNob3VsZCBvbmx5CisgKiBiZSB1c2VkIHdoZW4gdGhlIGNlcnRpZmljYXRlIGNvbWVzIGZyb20gYSByZWxpYWJsZSBzb3VyY2UKKyAqIHN1Y2ggYXMgbG9jYWwgc3RvcmFnZS4KKyAqCisgKi8KKworWDUwOSAqZDJpX1g1MDlfQVVYKFg1MDkgKiphLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsIGxvbmcgbGVuZ3RoKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnE7CisJWDUwOSAqcmV0OworCS8qIFNhdmUgc3RhcnQgcG9zaXRpb24gKi8KKwlxID0gKnBwOworCXJldCA9IGQyaV9YNTA5KGEsIHBwLCBsZW5ndGgpOworCS8qIElmIGNlcnRpZmljYXRlIHVucmVhZGFibGUgdGhlbiBmb3JnZXQgaXQgKi8KKwlpZighcmV0KSByZXR1cm4gTlVMTDsKKwkvKiB1cGRhdGUgbGVuZ3RoICovCisJbGVuZ3RoIC09ICpwcCAtIHE7CisJaWYoIWxlbmd0aCkgcmV0dXJuIHJldDsKKwlpZighZDJpX1g1MDlfQ0VSVF9BVVgoJnJldC0+YXV4LCBwcCwgbGVuZ3RoKSkgZ290byBlcnI7CisJcmV0dXJuIHJldDsKKwllcnI6CisJWDUwOV9mcmVlKHJldCk7CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBpMmRfWDUwOV9BVVgoWDUwOSAqYSwgdW5zaWduZWQgY2hhciAqKnBwKQoreworCWludCBsZW5ndGg7CisJbGVuZ3RoID0gaTJkX1g1MDkoYSwgcHApOworCWlmKGEpIGxlbmd0aCArPSBpMmRfWDUwOV9DRVJUX0FVWChhLT5hdXgsIHBwKTsKKwlyZXR1cm4gbGVuZ3RoOworfQorCit2b2lkIFg1MDlfZ2V0MF9zaWduYXR1cmUoQVNOMV9CSVRfU1RSSU5HICoqcHNpZywgWDUwOV9BTEdPUiAqKnBhbGcsCisJCQkJY29uc3QgWDUwOSAqeCkKKwl7CisJaWYgKHBzaWcpCisJCSpwc2lnID0geC0+c2lnbmF0dXJlOworCWlmIChwYWxnKQorCQkqcGFsZyA9IHgtPnNpZ19hbGc7CisJfQorCitpbnQgWDUwOV9nZXRfc2lnbmF0dXJlX25pZChjb25zdCBYNTA5ICp4KQorCXsKKwlyZXR1cm4gT0JKX29iajJuaWQoeC0+c2lnX2FsZy0+YWxnb3JpdGhtKTsKKwl9CmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOS94X3g1MDlhLmMgYi9jcnlwdG8veDUwOS94X3g1MDlhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEzMjA0YgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94NTA5L3hfeDUwOWEuYwpAQCAtMCwwICsxLDE3NyBAQAorLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDE5OTkuICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKworCisvKiBYNTA5X0NFUlRfQVVYIHJvdXRpbmVzLiBUaGVzZSBhcmUgdXNlZCB0byBlbmNvZGUgYWRkaXRpb25hbAorICogdXNlciBtb2RpZmlhYmxlIGRhdGEgYWJvdXQgYSBjZXJ0aWZpY2F0ZS4gVGhpcyBkYXRhIGlzCisgKiBhcHBlbmRlZCB0byB0aGUgWDUwOSBlbmNvZGluZyB3aGVuIHRoZSAqX1g1MDlfQVVYIHJvdXRpbmVzCisgKiBhcmUgdXNlZC4gVGhpcyBtZWFucyB0aGF0IHRoZSAidHJhZGl0aW9uYWwiIFg1MDkgcm91dGluZXMKKyAqIHdpbGwgc2ltcGx5IGlnbm9yZSB0aGUgZXh0cmEgZGF0YS4gKi8KKworc3RhdGljIFg1MDlfQ0VSVF9BVVggKmF1eF9nZXQoWDUwOSAqeCk7CisKK0FTTjFfU0VRVUVOQ0UoWDUwOV9DRVJUX0FVWCkgPSB7CisJQVNOMV9TRVFVRU5DRV9PRl9PUFQoWDUwOV9DRVJUX0FVWCwgdHJ1c3QsIEFTTjFfT0JKRUNUKSwKKwlBU04xX0lNUF9TRVFVRU5DRV9PRl9PUFQoWDUwOV9DRVJUX0FVWCwgcmVqZWN0LCBBU04xX09CSkVDVCwgMCksCisJQVNOMV9PUFQoWDUwOV9DRVJUX0FVWCwgYWxpYXMsIEFTTjFfVVRGOFNUUklORyksCisJQVNOMV9PUFQoWDUwOV9DRVJUX0FVWCwga2V5aWQsIEFTTjFfT0NURVRfU1RSSU5HKSwKKwlBU04xX0lNUF9TRVFVRU5DRV9PRl9PUFQoWDUwOV9DRVJUX0FVWCwgb3RoZXIsIFg1MDlfQUxHT1IsIDEpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKFg1MDlfQ0VSVF9BVVgpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhYNTA5X0NFUlRfQVVYKQorCitzdGF0aWMgWDUwOV9DRVJUX0FVWCAqYXV4X2dldChYNTA5ICp4KQoreworCWlmKCF4KSByZXR1cm4gTlVMTDsKKwlpZigheC0+YXV4ICYmICEoeC0+YXV4ID0gWDUwOV9DRVJUX0FVWF9uZXcoKSkpIHJldHVybiBOVUxMOworCXJldHVybiB4LT5hdXg7Cit9CisKK2ludCBYNTA5X2FsaWFzX3NldDEoWDUwOSAqeCwgdW5zaWduZWQgY2hhciAqbmFtZSwgaW50IGxlbikKK3sKKwlYNTA5X0NFUlRfQVVYICphdXg7CisJaWYgKCFuYW1lKQorCQl7CisJCWlmICgheCB8fCAheC0+YXV4IHx8ICF4LT5hdXgtPmFsaWFzKQorCQkJcmV0dXJuIDE7CisJCUFTTjFfVVRGOFNUUklOR19mcmVlKHgtPmF1eC0+YWxpYXMpOworCQl4LT5hdXgtPmFsaWFzID0gTlVMTDsKKwkJcmV0dXJuIDE7CisJCX0KKwlpZighKGF1eCA9IGF1eF9nZXQoeCkpKSByZXR1cm4gMDsKKwlpZighYXV4LT5hbGlhcyAmJiAhKGF1eC0+YWxpYXMgPSBBU04xX1VURjhTVFJJTkdfbmV3KCkpKSByZXR1cm4gMDsKKwlyZXR1cm4gQVNOMV9TVFJJTkdfc2V0KGF1eC0+YWxpYXMsIG5hbWUsIGxlbik7Cit9CisKK2ludCBYNTA5X2tleWlkX3NldDEoWDUwOSAqeCwgdW5zaWduZWQgY2hhciAqaWQsIGludCBsZW4pCit7CisJWDUwOV9DRVJUX0FVWCAqYXV4OworCWlmICghaWQpCisJCXsKKwkJaWYgKCF4IHx8ICF4LT5hdXggfHwgIXgtPmF1eC0+a2V5aWQpCisJCQlyZXR1cm4gMTsKKwkJQVNOMV9PQ1RFVF9TVFJJTkdfZnJlZSh4LT5hdXgtPmtleWlkKTsKKwkJeC0+YXV4LT5rZXlpZCA9IE5VTEw7CisJCXJldHVybiAxOworCQl9CisJaWYoIShhdXggPSBhdXhfZ2V0KHgpKSkgcmV0dXJuIDA7CisJaWYoIWF1eC0+a2V5aWQgJiYgIShhdXgtPmtleWlkID0gQVNOMV9PQ1RFVF9TVFJJTkdfbmV3KCkpKSByZXR1cm4gMDsKKwlyZXR1cm4gQVNOMV9TVFJJTkdfc2V0KGF1eC0+a2V5aWQsIGlkLCBsZW4pOworfQorCit1bnNpZ25lZCBjaGFyICpYNTA5X2FsaWFzX2dldDAoWDUwOSAqeCwgaW50ICpsZW4pCit7CisJaWYoIXgtPmF1eCB8fCAheC0+YXV4LT5hbGlhcykgcmV0dXJuIE5VTEw7CisJaWYobGVuKSAqbGVuID0geC0+YXV4LT5hbGlhcy0+bGVuZ3RoOworCXJldHVybiB4LT5hdXgtPmFsaWFzLT5kYXRhOworfQorCit1bnNpZ25lZCBjaGFyICpYNTA5X2tleWlkX2dldDAoWDUwOSAqeCwgaW50ICpsZW4pCit7CisJaWYoIXgtPmF1eCB8fCAheC0+YXV4LT5rZXlpZCkgcmV0dXJuIE5VTEw7CisJaWYobGVuKSAqbGVuID0geC0+YXV4LT5rZXlpZC0+bGVuZ3RoOworCXJldHVybiB4LT5hdXgtPmtleWlkLT5kYXRhOworfQorCitpbnQgWDUwOV9hZGQxX3RydXN0X29iamVjdChYNTA5ICp4LCBBU04xX09CSkVDVCAqb2JqKQoreworCVg1MDlfQ0VSVF9BVVggKmF1eDsKKwlBU04xX09CSkVDVCAqb2JqdG1wOworCWlmKCEob2JqdG1wID0gT0JKX2R1cChvYmopKSkgcmV0dXJuIDA7CisJaWYoIShhdXggPSBhdXhfZ2V0KHgpKSkgcmV0dXJuIDA7CisJaWYoIWF1eC0+dHJ1c3QKKwkJJiYgIShhdXgtPnRydXN0ID0gc2tfQVNOMV9PQkpFQ1RfbmV3X251bGwoKSkpIHJldHVybiAwOworCXJldHVybiBza19BU04xX09CSkVDVF9wdXNoKGF1eC0+dHJ1c3QsIG9ianRtcCk7Cit9CisKK2ludCBYNTA5X2FkZDFfcmVqZWN0X29iamVjdChYNTA5ICp4LCBBU04xX09CSkVDVCAqb2JqKQoreworCVg1MDlfQ0VSVF9BVVggKmF1eDsKKwlBU04xX09CSkVDVCAqb2JqdG1wOworCWlmKCEob2JqdG1wID0gT0JKX2R1cChvYmopKSkgcmV0dXJuIDA7CisJaWYoIShhdXggPSBhdXhfZ2V0KHgpKSkgcmV0dXJuIDA7CisJaWYoIWF1eC0+cmVqZWN0CisJCSYmICEoYXV4LT5yZWplY3QgPSBza19BU04xX09CSkVDVF9uZXdfbnVsbCgpKSkgcmV0dXJuIDA7CisJcmV0dXJuIHNrX0FTTjFfT0JKRUNUX3B1c2goYXV4LT5yZWplY3QsIG9ianRtcCk7Cit9CisKK3ZvaWQgWDUwOV90cnVzdF9jbGVhcihYNTA5ICp4KQoreworCWlmKHgtPmF1eCAmJiB4LT5hdXgtPnRydXN0KSB7CisJCXNrX0FTTjFfT0JKRUNUX3BvcF9mcmVlKHgtPmF1eC0+dHJ1c3QsIEFTTjFfT0JKRUNUX2ZyZWUpOworCQl4LT5hdXgtPnRydXN0ID0gTlVMTDsKKwl9Cit9CisKK3ZvaWQgWDUwOV9yZWplY3RfY2xlYXIoWDUwOSAqeCkKK3sKKwlpZih4LT5hdXggJiYgeC0+YXV4LT5yZWplY3QpIHsKKwkJc2tfQVNOMV9PQkpFQ1RfcG9wX2ZyZWUoeC0+YXV4LT5yZWplY3QsIEFTTjFfT0JKRUNUX2ZyZWUpOworCQl4LT5hdXgtPnJlamVjdCA9IE5VTEw7CisJfQorfQorCitBU04xX1NFUVVFTkNFKFg1MDlfQ0VSVF9QQUlSKSA9IHsKKwlBU04xX0VYUF9PUFQoWDUwOV9DRVJUX1BBSVIsIGZvcndhcmQsIFg1MDksIDApLAorCUFTTjFfRVhQX09QVChYNTA5X0NFUlRfUEFJUiwgcmV2ZXJzZSwgWDUwOSwgMSkKK30gQVNOMV9TRVFVRU5DRV9FTkQoWDUwOV9DRVJUX1BBSVIpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhYNTA5X0NFUlRfUEFJUikKZGlmZiAtLWdpdCBhL2NyeXB0by94NTA5djMvQ01ha2VMaXN0cy50eHQgYi9jcnlwdG8veDUwOXYzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNzYyNTkKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOXYzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNjAgQEAKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQorCithZGRfbGlicmFyeSgKKwl4NTA5djMKKworCU9CSkVDVAorCisJIyB2M19hZGRyLmMgLSBkaXNhYmxlZCBieSB1cHN0cmVhbSBieSBkZWZhdWx0LgorCSMgdjNfYXNpZC5jIC0gZGlzYWJsZWQgYnkgdXBzdHJlYW0gYnkgZGVmYXVsdC4KKwkjIHYzX29jc3AuYyAtIG1pc3NpbmcgT0NTUCBmb3Igbm93LgorCisJcGN5X2NhY2hlLmMKKwlwY3lfZGF0YS5jCisJcGN5X2xpYi5jCisJcGN5X21hcC5jCisJcGN5X25vZGUuYworCXBjeV90cmVlLmMKKwl2M19ha2V5LmMKKwl2M19ha2V5YS5jCisJdjNfYWx0LmMKKwl2M19iY29ucy5jCisJdjNfYml0c3QuYworCXYzX2NvbmYuYworCXYzX2Nwb2xzLmMKKwl2M19jcmxkLmMKKwl2M19lbnVtLmMKKwl2M19leHRrdS5jCisJdjNfZ2Vubi5jCisJdjNfaWE1LmMKKwl2M19pbmZvLmMKKwl2M19pbnQuYworCXYzX2xpYi5jCisJdjNfbmNvbnMuYworCXYzX3BjaS5jCisJdjNfcGNpYS5jCisJdjNfcGNvbnMuYworCXYzX3BrdS5jCisJdjNfcG1hcHMuYworCXYzX3Bybi5jCisJdjNfcHVycC5jCisJdjNfc2tleS5jCisJdjNfc3huZXQuYworCXYzX3V0bC5jCisJeDUwOXYzX2Vycm9yLmMKKykKKworYWRkX2V4ZWN1dGFibGUoCisJdjNuYW1lX3Rlc3QKKworCXYzbmFtZXRlc3QuYworKQorCithZGRfZXhlY3V0YWJsZSgKKwl0YWJfdGVzdAorCisJdGFidGVzdC5jCispCisKK3RhcmdldF9saW5rX2xpYnJhcmllcyh2M25hbWVfdGVzdCBjcnlwdG8pCit0YXJnZXRfbGlua19saWJyYXJpZXModGFiX3Rlc3QgY3J5cHRvKQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3g1MDl2My9leHRfZGF0LmggYi9jcnlwdG8veDUwOXYzL2V4dF9kYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2QwMDUyCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3g1MDl2My9leHRfZGF0LmgKQEAgLTAsMCArMSwxMjkgQEAKKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAxOTk5LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDQgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4gKi8KKworLyogVGhpcyBmaWxlIGNvbnRhaW5zIGEgdGFibGUgb2YgInN0YW5kYXJkIiBleHRlbnNpb25zICovCisKK2V4dGVybiBYNTA5VjNfRVhUX01FVEhPRCB2M19iY29ucywgdjNfbnNjZXJ0LCB2M19rZXlfdXNhZ2UsIHYzX2V4dF9rdTsKK2V4dGVybiBYNTA5VjNfRVhUX01FVEhPRCB2M19wa2V5X3VzYWdlX3BlcmlvZCwgdjNfc3huZXQsIHYzX2luZm8sIHYzX3NpbmZvOworZXh0ZXJuIFg1MDlWM19FWFRfTUVUSE9EIHYzX25zX2lhNV9saXN0W10sIHYzX2FsdFtdLCB2M19za2V5X2lkLCB2M19ha2V5X2lkOworZXh0ZXJuIFg1MDlWM19FWFRfTUVUSE9EIHYzX2NybF9udW0sIHYzX2NybF9yZWFzb24sIHYzX2NybF9pbnZkYXRlOworZXh0ZXJuIFg1MDlWM19FWFRfTUVUSE9EIHYzX2RlbHRhX2NybCwgdjNfY3BvbHMsIHYzX2NybGQsIHYzX2ZyZXNoZXN0X2NybDsKK2V4dGVybiBYNTA5VjNfRVhUX01FVEhPRCB2M19vY3NwX25vbmNlLCB2M19vY3NwX2FjY3Jlc3AsIHYzX29jc3BfYWN1dG9mZjsKK2V4dGVybiBYNTA5VjNfRVhUX01FVEhPRCB2M19vY3NwX2NybGlkLCB2M19vY3NwX25vY2hlY2ssIHYzX29jc3Bfc2VydmljZWxvYzsKK2V4dGVybiBYNTA5VjNfRVhUX01FVEhPRCB2M19jcmxfaG9sZCwgdjNfcGNpOworZXh0ZXJuIFg1MDlWM19FWFRfTUVUSE9EIHYzX3BvbGljeV9tYXBwaW5ncywgdjNfcG9saWN5X2NvbnN0cmFpbnRzOworZXh0ZXJuIFg1MDlWM19FWFRfTUVUSE9EIHYzX25hbWVfY29uc3RyYWludHMsIHYzX2luaGliaXRfYW55cCwgdjNfaWRwOworZXh0ZXJuIFg1MDlWM19FWFRfTUVUSE9EIHYzX2FkZHIsIHYzX2FzaWQ7CisKKy8qIFRoaXMgdGFibGUgd2lsbCBiZSBzZWFyY2hlZCB1c2luZyBPQkpfYnNlYXJjaCBzbyBpdCAqbXVzdCoga2VwdCBpbgorICogb3JkZXIgb2YgdGhlIGV4dF9uaWQgdmFsdWVzLgorICovCisKKy8qIFRPRE8oZm9yayk6IE9DU1Agc3VwcG9ydCAqLworI2RlZmluZSBPUEVOU1NMX05PX09DU1AKKworc3RhdGljIGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICpzdGFuZGFyZF9leHRzW10gPSB7CismdjNfbnNjZXJ0LAorJnYzX25zX2lhNV9saXN0WzBdLAorJnYzX25zX2lhNV9saXN0WzFdLAorJnYzX25zX2lhNV9saXN0WzJdLAorJnYzX25zX2lhNV9saXN0WzNdLAorJnYzX25zX2lhNV9saXN0WzRdLAorJnYzX25zX2lhNV9saXN0WzVdLAorJnYzX25zX2lhNV9saXN0WzZdLAorJnYzX3NrZXlfaWQsCismdjNfa2V5X3VzYWdlLAorJnYzX3BrZXlfdXNhZ2VfcGVyaW9kLAorJnYzX2FsdFswXSwKKyZ2M19hbHRbMV0sCismdjNfYmNvbnMsCismdjNfY3JsX251bSwKKyZ2M19jcG9scywKKyZ2M19ha2V5X2lkLAorJnYzX2NybGQsCismdjNfZXh0X2t1LAorJnYzX2RlbHRhX2NybCwKKyZ2M19jcmxfcmVhc29uLAorI2lmbmRlZiBPUEVOU1NMX05PX09DU1AKKyZ2M19jcmxfaW52ZGF0ZSwKKyNlbmRpZgorJnYzX3N4bmV0LAorJnYzX2luZm8sCisjaWZuZGVmIE9QRU5TU0xfTk9fT0NTUAorJnYzX29jc3Bfbm9uY2UsCismdjNfb2NzcF9jcmxpZCwKKyZ2M19vY3NwX2FjY3Jlc3AsCismdjNfb2NzcF9ub2NoZWNrLAorJnYzX29jc3BfYWN1dG9mZiwKKyZ2M19vY3NwX3NlcnZpY2Vsb2MsCisjZW5kaWYKKyZ2M19zaW5mbywKKyZ2M19wb2xpY3lfY29uc3RyYWludHMsCisjaWZuZGVmIE9QRU5TU0xfTk9fT0NTUAorJnYzX2NybF9ob2xkLAorI2VuZGlmCismdjNfcGNpLAorJnYzX25hbWVfY29uc3RyYWludHMsCismdjNfcG9saWN5X21hcHBpbmdzLAorJnYzX2luaGliaXRfYW55cCwKKyZ2M19pZHAsCismdjNfYWx0WzJdLAorJnYzX2ZyZXNoZXN0X2NybCwKK307CisKKy8qIE51bWJlciBvZiBzdGFuZGFyZCBleHRlbnNpb25zICovCisKKyNkZWZpbmUgU1RBTkRBUkRfRVhURU5TSU9OX0NPVU5UIChzaXplb2Yoc3RhbmRhcmRfZXh0cykvc2l6ZW9mKFg1MDlWM19FWFRfTUVUSE9EICopKQorCmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOXYzL3BjeV9jYWNoZS5jIGIvY3J5cHRvL3g1MDl2My9wY3lfY2FjaGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDU5YzAwCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3g1MDl2My9wY3lfY2FjaGUuYwpAQCAtMCwwICsxLDI4NiBAQAorLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDQuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3RocmVhZC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisKKyNpbmNsdWRlICJwY3lfaW50LmgiCisKKworc3RhdGljIGludCBwb2xpY3lfZGF0YV9jbXAoY29uc3QgWDUwOV9QT0xJQ1lfREFUQSAqKmEsCisJCQkJY29uc3QgWDUwOV9QT0xJQ1lfREFUQSAqKmIpOworc3RhdGljIGludCBwb2xpY3lfY2FjaGVfc2V0X2ludChsb25nICpvdXQsIEFTTjFfSU5URUdFUiAqdmFsdWUpOworCisvKiBTZXQgY2FjaGUgZW50cnkgYWNjb3JkaW5nIHRvIENlcnRpZmljYXRlUG9saWNpZXMgZXh0ZW5zaW9uLgorICogTm90ZTogdGhpcyBkZXN0cm95cyB0aGUgcGFzc2VkIENFUlRJRklDQVRFUE9MSUNJRVMgc3RydWN0dXJlLgorICovCisKK3N0YXRpYyBpbnQgcG9saWN5X2NhY2hlX2NyZWF0ZShYNTA5ICp4LAorCQkJQ0VSVElGSUNBVEVQT0xJQ0lFUyAqcG9saWNpZXMsIGludCBjcml0KQorCXsKKwlzaXplX3QgaTsKKwlpbnQgcmV0ID0gMDsKKwlYNTA5X1BPTElDWV9DQUNIRSAqY2FjaGUgPSB4LT5wb2xpY3lfY2FjaGU7CisJWDUwOV9QT0xJQ1lfREFUQSAqZGF0YSA9IE5VTEw7CisJUE9MSUNZSU5GTyAqcG9saWN5OworCWlmIChza19QT0xJQ1lJTkZPX251bShwb2xpY2llcykgPT0gMCkKKwkJZ290byBiYWRfcG9saWN5OworCWNhY2hlLT5kYXRhID0gc2tfWDUwOV9QT0xJQ1lfREFUQV9uZXcocG9saWN5X2RhdGFfY21wKTsKKwlpZiAoIWNhY2hlLT5kYXRhKQorCQlnb3RvIGJhZF9wb2xpY3k7CisJZm9yIChpID0gMDsgaSA8IHNrX1BPTElDWUlORk9fbnVtKHBvbGljaWVzKTsgaSsrKQorCQl7CisJCXBvbGljeSA9IHNrX1BPTElDWUlORk9fdmFsdWUocG9saWNpZXMsIGkpOworCQlkYXRhID0gcG9saWN5X2RhdGFfbmV3KHBvbGljeSwgTlVMTCwgY3JpdCk7CisJCWlmICghZGF0YSkKKwkJCWdvdG8gYmFkX3BvbGljeTsKKwkJLyogRHVwbGljYXRlIHBvbGljeSBPSURzIGFyZSBpbGxlZ2FsOiByZWplY3QgaWYgbWF0Y2hlcworCQkgKiBmb3VuZC4KKwkJICovCisJCWlmIChPQkpfb2JqMm5pZChkYXRhLT52YWxpZF9wb2xpY3kpID09IE5JRF9hbnlfcG9saWN5KQorCQkJeworCQkJaWYgKGNhY2hlLT5hbnlQb2xpY3kpCisJCQkJeworCQkJCXJldCA9IC0xOworCQkJCWdvdG8gYmFkX3BvbGljeTsKKwkJCQl9CisJCQljYWNoZS0+YW55UG9saWN5ID0gZGF0YTsKKwkJCX0KKwkJZWxzZSBpZiAoc2tfWDUwOV9QT0xJQ1lfREFUQV9maW5kKGNhY2hlLT5kYXRhLCBOVUxMLCBkYXRhKSkKKwkJCXsKKwkJCXJldCA9IC0xOworCQkJZ290byBiYWRfcG9saWN5OworCQkJfQorCQllbHNlIGlmICghc2tfWDUwOV9QT0xJQ1lfREFUQV9wdXNoKGNhY2hlLT5kYXRhLCBkYXRhKSkKKwkJCWdvdG8gYmFkX3BvbGljeTsKKwkJZGF0YSA9IE5VTEw7CisJCX0KKwlyZXQgPSAxOworCWJhZF9wb2xpY3k6CisJaWYgKHJldCA9PSAtMSkKKwkJeC0+ZXhfZmxhZ3MgfD0gRVhGTEFHX0lOVkFMSURfUE9MSUNZOworCWlmIChkYXRhKQorCQlwb2xpY3lfZGF0YV9mcmVlKGRhdGEpOworCXNrX1BPTElDWUlORk9fcG9wX2ZyZWUocG9saWNpZXMsIFBPTElDWUlORk9fZnJlZSk7CisJaWYgKHJldCA8PSAwKQorCQl7CisJCXNrX1g1MDlfUE9MSUNZX0RBVEFfcG9wX2ZyZWUoY2FjaGUtPmRhdGEsIHBvbGljeV9kYXRhX2ZyZWUpOworCQljYWNoZS0+ZGF0YSA9IE5VTEw7CisJCX0KKwlyZXR1cm4gcmV0OworCX0KKworCQorc3RhdGljIGludCBwb2xpY3lfY2FjaGVfbmV3KFg1MDkgKngpCisJeworCVg1MDlfUE9MSUNZX0NBQ0hFICpjYWNoZTsKKwlBU04xX0lOVEVHRVIgKmV4dF9hbnkgPSBOVUxMOworCVBPTElDWV9DT05TVFJBSU5UUyAqZXh0X3Bjb25zID0gTlVMTDsKKwlDRVJUSUZJQ0FURVBPTElDSUVTICpleHRfY3BvbHMgPSBOVUxMOworCVBPTElDWV9NQVBQSU5HUyAqZXh0X3BtYXBzID0gTlVMTDsKKwlpbnQgaTsKKwljYWNoZSA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihYNTA5X1BPTElDWV9DQUNIRSkpOworCWlmICghY2FjaGUpCisJCXJldHVybiAwOworCWNhY2hlLT5hbnlQb2xpY3kgPSBOVUxMOworCWNhY2hlLT5kYXRhID0gTlVMTDsKKwljYWNoZS0+YW55X3NraXAgPSAtMTsKKwljYWNoZS0+ZXhwbGljaXRfc2tpcCA9IC0xOworCWNhY2hlLT5tYXBfc2tpcCA9IC0xOworCisJeC0+cG9saWN5X2NhY2hlID0gY2FjaGU7CisKKwkvKiBIYW5kbGUgcmVxdWlyZUV4cGxpY2l0UG9saWN5ICpmaXJzdCouIE5lZWQgdG8gcHJvY2VzcyB0aGlzCisJICogZXZlbiBpZiB3ZSBkb24ndCBoYXZlIGFueSBwb2xpY2llcy4KKwkgKi8KKwlleHRfcGNvbnMgPSBYNTA5X2dldF9leHRfZDJpKHgsIE5JRF9wb2xpY3lfY29uc3RyYWludHMsICZpLCBOVUxMKTsKKworCWlmICghZXh0X3Bjb25zKQorCQl7CisJCWlmIChpICE9IC0xKQorCQkJZ290byBiYWRfY2FjaGU7CisJCX0KKwllbHNlCisJCXsKKwkJaWYgKCFleHRfcGNvbnMtPnJlcXVpcmVFeHBsaWNpdFBvbGljeQorCQkJJiYgIWV4dF9wY29ucy0+aW5oaWJpdFBvbGljeU1hcHBpbmcpCisJCQlnb3RvIGJhZF9jYWNoZTsKKwkJaWYgKCFwb2xpY3lfY2FjaGVfc2V0X2ludCgmY2FjaGUtPmV4cGxpY2l0X3NraXAsCisJCQlleHRfcGNvbnMtPnJlcXVpcmVFeHBsaWNpdFBvbGljeSkpCisJCQlnb3RvIGJhZF9jYWNoZTsKKwkJaWYgKCFwb2xpY3lfY2FjaGVfc2V0X2ludCgmY2FjaGUtPm1hcF9za2lwLAorCQkJZXh0X3Bjb25zLT5pbmhpYml0UG9saWN5TWFwcGluZykpCisJCQlnb3RvIGJhZF9jYWNoZTsKKwkJfQorCisJLyogUHJvY2VzcyBDZXJ0aWZpY2F0ZVBvbGljaWVzICovCisKKwlleHRfY3BvbHMgPSBYNTA5X2dldF9leHRfZDJpKHgsIE5JRF9jZXJ0aWZpY2F0ZV9wb2xpY2llcywgJmksIE5VTEwpOworCS8qIElmIG5vIENlcnRpZmljYXRlUG9saWNpZXMgZXh0ZW5zaW9uIG9yIHByb2JsZW0gZGVjb2RpbmcgdGhlbgorCSAqIHRoZXJlIGlzIG5vIHBvaW50IGNvbnRpbnVpbmcgYmVjYXVzZSB0aGUgdmFsaWQgcG9saWNpZXMgd2lsbCBiZQorCSAqIE5VTEwuCisJICovCisJaWYgKCFleHRfY3BvbHMpCisJCXsKKwkJLyogSWYgbm90IGFic2VudCBzb21lIHByb2JsZW0gd2l0aCBleHRlbnNpb24gKi8KKwkJaWYgKGkgIT0gLTEpCisJCQlnb3RvIGJhZF9jYWNoZTsKKwkJcmV0dXJuIDE7CisJCX0KKworCWkgPSBwb2xpY3lfY2FjaGVfY3JlYXRlKHgsIGV4dF9jcG9scywgaSk7CisKKwkvKiBOQjogZXh0X2Nwb2xzIGZyZWVkIGJ5IHBvbGljeV9jYWNoZV9zZXRfcG9saWNpZXMgKi8KKworCWlmIChpIDw9IDApCisJCXJldHVybiBpOworCisJZXh0X3BtYXBzID0gWDUwOV9nZXRfZXh0X2QyaSh4LCBOSURfcG9saWN5X21hcHBpbmdzLCAmaSwgTlVMTCk7CisKKwlpZiAoIWV4dF9wbWFwcykKKwkJeworCQkvKiBJZiBub3QgYWJzZW50IHNvbWUgcHJvYmxlbSB3aXRoIGV4dGVuc2lvbiAqLworCQlpZiAoaSAhPSAtMSkKKwkJCWdvdG8gYmFkX2NhY2hlOworCQl9CisJZWxzZQorCQl7CisJCWkgPSBwb2xpY3lfY2FjaGVfc2V0X21hcHBpbmcoeCwgZXh0X3BtYXBzKTsKKwkJaWYgKGkgPD0gMCkKKwkJCWdvdG8gYmFkX2NhY2hlOworCQl9CisKKwlleHRfYW55ID0gWDUwOV9nZXRfZXh0X2QyaSh4LCBOSURfaW5oaWJpdF9hbnlfcG9saWN5LCAmaSwgTlVMTCk7CisKKwlpZiAoIWV4dF9hbnkpCisJCXsKKwkJaWYgKGkgIT0gLTEpCisJCQlnb3RvIGJhZF9jYWNoZTsKKwkJfQorCWVsc2UgaWYgKCFwb2xpY3lfY2FjaGVfc2V0X2ludCgmY2FjaGUtPmFueV9za2lwLCBleHRfYW55KSkKKwkJCWdvdG8gYmFkX2NhY2hlOworCisJaWYgKDApCisJCXsKKwkJYmFkX2NhY2hlOgorCQl4LT5leF9mbGFncyB8PSBFWEZMQUdfSU5WQUxJRF9QT0xJQ1k7CisJCX0KKworCWlmKGV4dF9wY29ucykKKwkJUE9MSUNZX0NPTlNUUkFJTlRTX2ZyZWUoZXh0X3Bjb25zKTsKKworCWlmIChleHRfYW55KQorCQlBU04xX0lOVEVHRVJfZnJlZShleHRfYW55KTsKKworCXJldHVybiAxOworCisJCit9CisKK3ZvaWQgcG9saWN5X2NhY2hlX2ZyZWUoWDUwOV9QT0xJQ1lfQ0FDSEUgKmNhY2hlKQorCXsKKwlpZiAoIWNhY2hlKQorCQlyZXR1cm47CisJaWYgKGNhY2hlLT5hbnlQb2xpY3kpCisJCXBvbGljeV9kYXRhX2ZyZWUoY2FjaGUtPmFueVBvbGljeSk7CisJaWYgKGNhY2hlLT5kYXRhKQorCQlza19YNTA5X1BPTElDWV9EQVRBX3BvcF9mcmVlKGNhY2hlLT5kYXRhLCBwb2xpY3lfZGF0YV9mcmVlKTsKKwlPUEVOU1NMX2ZyZWUoY2FjaGUpOworCX0KKworY29uc3QgWDUwOV9QT0xJQ1lfQ0FDSEUgKnBvbGljeV9jYWNoZV9zZXQoWDUwOSAqeCkKKwl7CisKKwlpZiAoeC0+cG9saWN5X2NhY2hlID09IE5VTEwpCisJCXsKKwkJQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19YNTA5KTsKKwkJCXBvbGljeV9jYWNoZV9uZXcoeCk7CisJCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19YNTA5KTsKKwkJfQorCisJcmV0dXJuIHgtPnBvbGljeV9jYWNoZTsKKworCX0KKworWDUwOV9QT0xJQ1lfREFUQSAqcG9saWN5X2NhY2hlX2ZpbmRfZGF0YShjb25zdCBYNTA5X1BPTElDWV9DQUNIRSAqY2FjaGUsCisJCQkJCQljb25zdCBBU04xX09CSkVDVCAqaWQpCisJeworCXNpemVfdCBpZHg7CisJWDUwOV9QT0xJQ1lfREFUQSB0bXA7CisKKwl0bXAudmFsaWRfcG9saWN5ID0gKEFTTjFfT0JKRUNUICopaWQ7CisJaWYgKCFza19YNTA5X1BPTElDWV9EQVRBX2ZpbmQoY2FjaGUtPmRhdGEsICZpZHgsICZ0bXApKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gc2tfWDUwOV9QT0xJQ1lfREFUQV92YWx1ZShjYWNoZS0+ZGF0YSwgaWR4KTsKKwl9CisKK3N0YXRpYyBpbnQgcG9saWN5X2RhdGFfY21wKGNvbnN0IFg1MDlfUE9MSUNZX0RBVEEgKiphLAorCQkJCWNvbnN0IFg1MDlfUE9MSUNZX0RBVEEgKipiKQorCXsKKwlyZXR1cm4gT0JKX2NtcCgoKmEpLT52YWxpZF9wb2xpY3ksICgqYiktPnZhbGlkX3BvbGljeSk7CisJfQorCitzdGF0aWMgaW50IHBvbGljeV9jYWNoZV9zZXRfaW50KGxvbmcgKm91dCwgQVNOMV9JTlRFR0VSICp2YWx1ZSkKKwl7CisJaWYgKHZhbHVlID09IE5VTEwpCisJCXJldHVybiAxOworCWlmICh2YWx1ZS0+dHlwZSA9PSBWX0FTTjFfTkVHX0lOVEVHRVIpCisJCXJldHVybiAwOworCSpvdXQgPSBBU04xX0lOVEVHRVJfZ2V0KHZhbHVlKTsKKwlyZXR1cm4gMTsKKwl9CmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOXYzL3BjeV9kYXRhLmMgYi9jcnlwdG8veDUwOXYzL3BjeV9kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q0NWRjYQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94NTA5djMvcGN5X2RhdGEuYwpAQCAtMCwwICsxLDEzNyBAQAorLyogcGN5X2RhdGEuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDQuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorCisjaW5jbHVkZSAicGN5X2ludC5oIgorCisKKy8qIFBvbGljeSBOb2RlIHJvdXRpbmVzICovCisKK3ZvaWQgcG9saWN5X2RhdGFfZnJlZShYNTA5X1BPTElDWV9EQVRBICpkYXRhKQorCXsKKwlBU04xX09CSkVDVF9mcmVlKGRhdGEtPnZhbGlkX3BvbGljeSk7CisJLyogRG9uJ3QgZnJlZSBxdWFsaWZpZXJzIGlmIHNoYXJlZCAqLworCWlmICghKGRhdGEtPmZsYWdzICYgUE9MSUNZX0RBVEFfRkxBR19TSEFSRURfUVVBTElGSUVSUykpCisJCXNrX1BPTElDWVFVQUxJTkZPX3BvcF9mcmVlKGRhdGEtPnF1YWxpZmllcl9zZXQsCisJCQkJCVBPTElDWVFVQUxJTkZPX2ZyZWUpOworCXNrX0FTTjFfT0JKRUNUX3BvcF9mcmVlKGRhdGEtPmV4cGVjdGVkX3BvbGljeV9zZXQsIEFTTjFfT0JKRUNUX2ZyZWUpOworCU9QRU5TU0xfZnJlZShkYXRhKTsKKwl9CisKKy8qIENyZWF0ZSBhIGRhdGEgYmFzZWQgb24gYW4gZXhpc3RpbmcgcG9saWN5LiBJZiAnaWQnIGlzIE5VTEwgdXNlIHRoZQorICogb2lkIGluIHRoZSBwb2xpY3ksIG90aGVyd2lzZSB1c2UgJ2lkJy4gVGhpcyBiZWhhdmlvdXIgY292ZXJzIHRoZSB0d28KKyAqIHR5cGVzIG9mIGRhdGEgaW4gUkZDMzI4MDogZGF0YSB3aXRoIGZyb20gYSBDZXJ0aWZpY2F0ZVBvbGNpZXMgZXh0ZW5zaW9uCisgKiBhbmQgYWRkaXRpb25hbCBkYXRhIHdpdGgganVzdCB0aGUgcXVhbGlmaWVycyBvZiBhbnlQb2xpY3kgYW5kIElEIGZyb20KKyAqIGFub3RoZXIgc291cmNlLgorICovCisKK1g1MDlfUE9MSUNZX0RBVEEgKnBvbGljeV9kYXRhX25ldyhQT0xJQ1lJTkZPICpwb2xpY3ksCisJCQkJCWNvbnN0IEFTTjFfT0JKRUNUICpjaWQsIGludCBjcml0KQorCXsKKwlYNTA5X1BPTElDWV9EQVRBICpyZXQ7CisJQVNOMV9PQkpFQ1QgKmlkOworCWlmICghcG9saWN5ICYmICFjaWQpCisJCXJldHVybiBOVUxMOworCWlmIChjaWQpCisJCXsKKwkJaWQgPSBPQkpfZHVwKGNpZCk7CisJCWlmICghaWQpCisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCWVsc2UKKwkJaWQgPSBOVUxMOworCXJldCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihYNTA5X1BPTElDWV9EQVRBKSk7CisJaWYgKCFyZXQpCisJCXJldHVybiBOVUxMOworCXJldC0+ZXhwZWN0ZWRfcG9saWN5X3NldCA9IHNrX0FTTjFfT0JKRUNUX25ld19udWxsKCk7CisJaWYgKCFyZXQtPmV4cGVjdGVkX3BvbGljeV9zZXQpCisJCXsKKwkJT1BFTlNTTF9mcmVlKHJldCk7CisJCWlmIChpZCkKKwkJCUFTTjFfT0JKRUNUX2ZyZWUoaWQpOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJaWYgKGNyaXQpCisJCXJldC0+ZmxhZ3MgPSBQT0xJQ1lfREFUQV9GTEFHX0NSSVRJQ0FMOworCWVsc2UKKwkJcmV0LT5mbGFncyA9IDA7CisKKwlpZiAoaWQpCisJCXJldC0+dmFsaWRfcG9saWN5ID0gaWQ7CisJZWxzZQorCQl7CisJCXJldC0+dmFsaWRfcG9saWN5ID0gcG9saWN5LT5wb2xpY3lpZDsKKwkJcG9saWN5LT5wb2xpY3lpZCA9IE5VTEw7CisJCX0KKworCWlmIChwb2xpY3kpCisJCXsKKwkJcmV0LT5xdWFsaWZpZXJfc2V0ID0gcG9saWN5LT5xdWFsaWZpZXJzOworCQlwb2xpY3ktPnF1YWxpZmllcnMgPSBOVUxMOworCQl9CisJZWxzZQorCQlyZXQtPnF1YWxpZmllcl9zZXQgPSBOVUxMOworCisJcmV0dXJuIHJldDsKKwl9CisKZGlmZiAtLWdpdCBhL2NyeXB0by94NTA5djMvcGN5X2ludC5oIGIvY3J5cHRvL3g1MDl2My9wY3lfaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NmZjkyOAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94NTA5djMvcGN5X2ludC5oCkBAIC0wLDAgKzEsMjEyIEBACisvKiBwY3lfaW50LmggKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDA0LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDA0IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKwordHlwZWRlZiBzdHJ1Y3QgWDUwOV9QT0xJQ1lfREFUQV9zdCBYNTA5X1BPTElDWV9EQVRBOworCitERUNMQVJFX1NUQUNLX09GKFg1MDlfUE9MSUNZX0RBVEEpCisKKy8qIEludGVybmFsIHN0cnVjdHVyZXMgKi8KKworLyogVGhpcyBzdHJ1Y3R1cmUgYW5kIHRoZSBmaWVsZCBuYW1lcyBjb3JyZXNwb25kIHRvIHRoZSBQb2xpY3kgJ25vZGUnIG9mCisgKiBSRkMzMjgwLiBOQiB0aGlzIHN0cnVjdHVyZSBjb250YWlucyBubyBwb2ludGVycyB0byBwYXJlbnQgb3IgY2hpbGQKKyAqIGRhdGE6IFg1MDlfUE9MSUNZX05PREUgY29udGFpbnMgdGhhdC4gVGhpcyBtZWFucyB0aGF0IHRoZSBtYWluIHBvbGljeSBkYXRhCisgKiBjYW4gYmUga2VwdCBzdGF0aWMgYW5kIGNhY2hlZCB3aXRoIHRoZSBjZXJ0aWZpY2F0ZS4KKyAqLworCitzdHJ1Y3QgWDUwOV9QT0xJQ1lfREFUQV9zdAorCXsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJLyogUG9saWN5IE9JRCBhbmQgcXVhbGlmaWVycyBmb3IgdGhpcyBkYXRhICovCisJQVNOMV9PQkpFQ1QgKnZhbGlkX3BvbGljeTsKKwlTVEFDS19PRihQT0xJQ1lRVUFMSU5GTykgKnF1YWxpZmllcl9zZXQ7CisJU1RBQ0tfT0YoQVNOMV9PQkpFQ1QpICpleHBlY3RlZF9wb2xpY3lfc2V0OworCX07CisKKy8qIFg1MDlfUE9MSUNZX0RBVEEgZmxhZ3MgdmFsdWVzICovCisKKy8qIFRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhlIHN0cnVjdHVyZSBoYXMgYmVlbiBtYXBwZWQgdXNpbmcgYSBwb2xpY3kgbWFwcGluZworICogZXh0ZW5zaW9uLiBJZiBwb2xpY3kgbWFwcGluZyBpcyBub3QgYWN0aXZlIGl0cyByZWZlcmVuY2VzIGdldCBkZWxldGVkLiAKKyAqLworCisjZGVmaW5lIFBPTElDWV9EQVRBX0ZMQUdfTUFQUEVECQkJMHgxCisKKy8qIFRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhlIGRhdGEgZG9lc24ndCBjb3JyZXNwb25kIHRvIGEgcG9saWN5IGluIENlcnRpZmljYXRlCisgKiBQb2xpY2llczogaXQgaGFzIGJlZW4gbWFwcGVkIHRvIGFueSBwb2xpY3kuCisgKi8KKworI2RlZmluZSBQT0xJQ1lfREFUQV9GTEFHX01BUFBFRF9BTlkJCTB4MgorCisvKiBBTkQgd2l0aCBmbGFncyB0byBzZWUgaWYgYW55IG1hcHBpbmcgaGFzIG9jY3VycmVkICovCisKKyNkZWZpbmUgUE9MSUNZX0RBVEFfRkxBR19NQVBfTUFTSwkJMHgzCisKKy8qIHF1YWxpZmllcnMgYXJlIHNoYXJlZCBhbmQgc2hvdWxkbid0IGJlIGZyZWVkICovCisKKyNkZWZpbmUgUE9MSUNZX0RBVEFfRkxBR19TSEFSRURfUVVBTElGSUVSUwkweDQKKworLyogUGFyZW50IG5vZGUgaXMgYW4gZXh0cmEgbm9kZSBhbmQgc2hvdWxkIGJlIGZyZWVkICovCisKKyNkZWZpbmUgUE9MSUNZX0RBVEFfRkxBR19FWFRSQV9OT0RFCQkweDgKKworLyogQ29ycmVzcG9uZGluZyBDZXJ0aWZpY2F0ZVBvbGljaWVzIGlzIGNyaXRpY2FsICovCisKKyNkZWZpbmUgUE9MSUNZX0RBVEFfRkxBR19DUklUSUNBTAkJMHgxMAorCisvKiBUaGlzIHN0cnVjdHVyZSBpcyBjYWNoZWQgd2l0aCBhIGNlcnRpZmljYXRlICovCisKK3N0cnVjdCBYNTA5X1BPTElDWV9DQUNIRV9zdCB7CisJLyogYW55UG9saWN5IGRhdGEgb3IgTlVMTCBpZiBubyBhbnlQb2xpY3kgKi8KKwlYNTA5X1BPTElDWV9EQVRBICphbnlQb2xpY3k7CisJLyogb3RoZXIgcG9saWN5IGRhdGEgKi8KKwlTVEFDS19PRihYNTA5X1BPTElDWV9EQVRBKSAqZGF0YTsKKwkvKiBJZiBJbmhpYml0QW55UG9saWN5IHByZXNlbnQgdGhpcyBpcyBpdHMgdmFsdWUgb3IgLTEgaWYgYWJzZW50LiAqLworCWxvbmcgYW55X3NraXA7CisJLyogSWYgcG9saWN5Q29uc3RyYWludHMgYW5kIHJlcXVpcmVFeHBsaWNpdFBvbGljeSBwcmVzZW50IHRoaXMgaXMgaXRzCisJICogdmFsdWUgb3IgLTEgaWYgYWJzZW50LgorCSAqLworCWxvbmcgZXhwbGljaXRfc2tpcDsKKwkvKiBJZiBwb2xpY3lDb25zdHJhaW50cyBhbmQgcG9saWN5TWFwcGluZyBwcmVzZW50IHRoaXMgaXMgaXRzCisJICogdmFsdWUgb3IgLTEgaWYgYWJzZW50LgorICAgICAgICAgKi8KKwlsb25nIG1hcF9za2lwOworCX07CisKKy8qI2RlZmluZSBQT0xJQ1lfQ0FDSEVfRkxBR19DUklUSUNBTAkJUE9MSUNZX0RBVEFfRkxBR19DUklUSUNBTCovCisKKy8qIFRoaXMgc3RydWN0dXJlIHJlcHJlc2VudHMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG5vZGVzICovCisKK3N0cnVjdCBYNTA5X1BPTElDWV9OT0RFX3N0CisJeworCS8qIG5vZGUgZGF0YSB0aGlzIHJlZmVycyB0byAqLworCWNvbnN0IFg1MDlfUE9MSUNZX0RBVEEgKmRhdGE7CisJLyogUGFyZW50IG5vZGUgKi8KKwlYNTA5X1BPTElDWV9OT0RFICpwYXJlbnQ7CisJLyogTnVtYmVyIG9mIGNoaWxkIG5vZGVzICovCisJaW50IG5jaGlsZDsKKwl9OworCitzdHJ1Y3QgWDUwOV9QT0xJQ1lfTEVWRUxfc3QKKwl7CisJLyogQ2VydCBmb3IgdGhpcyBsZXZlbCAqLworCVg1MDkgKmNlcnQ7CisJLyogbm9kZXMgYXQgdGhpcyBsZXZlbCAqLworCVNUQUNLX09GKFg1MDlfUE9MSUNZX05PREUpICpub2RlczsKKwkvKiBhbnlQb2xpY3kgbm9kZSAqLworCVg1MDlfUE9MSUNZX05PREUgKmFueVBvbGljeTsKKwkvKiBFeHRyYSBkYXRhICovCisJLypTVEFDS19PRihYNTA5X1BPTElDWV9EQVRBKSAqZXh0cmFfZGF0YTsqLworCXVuc2lnbmVkIGludCBmbGFnczsKKwl9OworCitzdHJ1Y3QgWDUwOV9QT0xJQ1lfVFJFRV9zdAorCXsKKwkvKiBUaGlzIGlzIHRoZSB0cmVlICdsZXZlbCcgZGF0YSAqLworCVg1MDlfUE9MSUNZX0xFVkVMICpsZXZlbHM7CisJaW50IG5sZXZlbDsKKwkvKiBFeHRyYSBwb2xpY3kgZGF0YSB3aGVuIGFkZGl0aW9uYWwgbm9kZXMgKG5vdCBmcm9tIHRoZSBjZXJ0aWZpY2F0ZSkKKwkgKiBhcmUgcmVxdWlyZWQuCisJICovCisJU1RBQ0tfT0YoWDUwOV9QT0xJQ1lfREFUQSkgKmV4dHJhX2RhdGE7CisJLyogVGhpcyBpcyB0aGUgYXV0aG9yaXR5IGNvbnN0YWluZWQgcG9saWN5IHNldCAqLworCVNUQUNLX09GKFg1MDlfUE9MSUNZX05PREUpICphdXRoX3BvbGljaWVzOworCVNUQUNLX09GKFg1MDlfUE9MSUNZX05PREUpICp1c2VyX3BvbGljaWVzOworCXVuc2lnbmVkIGludCBmbGFnczsKKwl9OworCisvKiBTZXQgaWYgYW55UG9saWN5IHByZXNlbnQgaW4gdXNlciBwb2xpY2llcyAqLworI2RlZmluZSBQT0xJQ1lfRkxBR19BTllfUE9MSUNZCQkweDIKKworLyogVXNlZnVsIG1hY3JvcyAqLworCisjZGVmaW5lIG5vZGVfZGF0YV9jcml0aWNhbChkYXRhKSAoZGF0YS0+ZmxhZ3MgJiBQT0xJQ1lfREFUQV9GTEFHX0NSSVRJQ0FMKQorI2RlZmluZSBub2RlX2NyaXRpY2FsKG5vZGUpIG5vZGVfZGF0YV9jcml0aWNhbChub2RlLT5kYXRhKQorCisvKiBJbnRlcm5hbCBmdW5jdGlvbnMgKi8KKworWDUwOV9QT0xJQ1lfREFUQSAqcG9saWN5X2RhdGFfbmV3KFBPTElDWUlORk8gKnBvbGljeSwgY29uc3QgQVNOMV9PQkpFQ1QgKmlkLAorCQkJCQkJCQlpbnQgY3JpdCk7Cit2b2lkIHBvbGljeV9kYXRhX2ZyZWUoWDUwOV9QT0xJQ1lfREFUQSAqZGF0YSk7CisKK1g1MDlfUE9MSUNZX0RBVEEgKnBvbGljeV9jYWNoZV9maW5kX2RhdGEoY29uc3QgWDUwOV9QT0xJQ1lfQ0FDSEUgKmNhY2hlLAorCQkJCQkJCWNvbnN0IEFTTjFfT0JKRUNUICppZCk7CitpbnQgcG9saWN5X2NhY2hlX3NldF9tYXBwaW5nKFg1MDkgKngsIFBPTElDWV9NQVBQSU5HUyAqbWFwcyk7CisKKworU1RBQ0tfT0YoWDUwOV9QT0xJQ1lfTk9ERSkgKnBvbGljeV9ub2RlX2NtcF9uZXcodm9pZCk7CisKK3ZvaWQgcG9saWN5X2NhY2hlX2luaXQodm9pZCk7CisKK3ZvaWQgcG9saWN5X2NhY2hlX2ZyZWUoWDUwOV9QT0xJQ1lfQ0FDSEUgKmNhY2hlKTsKKworWDUwOV9QT0xJQ1lfTk9ERSAqbGV2ZWxfZmluZF9ub2RlKGNvbnN0IFg1MDlfUE9MSUNZX0xFVkVMICpsZXZlbCwKKwkJCQkJY29uc3QgWDUwOV9QT0xJQ1lfTk9ERSAqcGFyZW50LAkKKwkJCQkJY29uc3QgQVNOMV9PQkpFQ1QgKmlkKTsKKworWDUwOV9QT0xJQ1lfTk9ERSAqdHJlZV9maW5kX3NrKFNUQUNLX09GKFg1MDlfUE9MSUNZX05PREUpICpzaywKKwkJCQkJCWNvbnN0IEFTTjFfT0JKRUNUICppZCk7CisKK1g1MDlfUE9MSUNZX05PREUgKmxldmVsX2FkZF9ub2RlKFg1MDlfUE9MSUNZX0xFVkVMICpsZXZlbCwKKwkJCWNvbnN0IFg1MDlfUE9MSUNZX0RBVEEgKmRhdGEsCisJCQlYNTA5X1BPTElDWV9OT0RFICpwYXJlbnQsCisJCQlYNTA5X1BPTElDWV9UUkVFICp0cmVlKTsKK3ZvaWQgcG9saWN5X25vZGVfZnJlZShYNTA5X1BPTElDWV9OT0RFICpub2RlKTsKK2ludCBwb2xpY3lfbm9kZV9tYXRjaChjb25zdCBYNTA5X1BPTElDWV9MRVZFTCAqbHZsLAorCQkgICAgICBjb25zdCBYNTA5X1BPTElDWV9OT0RFICpub2RlLCBjb25zdCBBU04xX09CSkVDVCAqb2lkKTsKKworY29uc3QgWDUwOV9QT0xJQ1lfQ0FDSEUgKnBvbGljeV9jYWNoZV9zZXQoWDUwOSAqeCk7CmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOXYzL3BjeV9saWIuYyBiL2NyeXB0by94NTA5djMvcGN5X2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YmUyZjAKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOXYzL3BjeV9saWIuYwpAQCAtMCwwICsxLDE2NSBAQAorLyogcGN5X2xpYi5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwNC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisKKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorCisjaW5jbHVkZSAicGN5X2ludC5oIgorCisKKy8qIGFjY2Vzc29yIGZ1bmN0aW9ucyAqLworCisvKiBYNTA5X1BPTElDWV9UUkVFIHN0dWZmICovCisKK2ludCBYNTA5X3BvbGljeV90cmVlX2xldmVsX2NvdW50KGNvbnN0IFg1MDlfUE9MSUNZX1RSRUUgKnRyZWUpCisJeworCWlmICghdHJlZSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHRyZWUtPm5sZXZlbDsKKwl9CisKK1g1MDlfUE9MSUNZX0xFVkVMICoKKwlYNTA5X3BvbGljeV90cmVlX2dldDBfbGV2ZWwoY29uc3QgWDUwOV9QT0xJQ1lfVFJFRSAqdHJlZSwgaW50IGkpCisJeworCWlmICghdHJlZSB8fCAoaSA8IDApIHx8IChpID49IHRyZWUtPm5sZXZlbCkpCisJCXJldHVybiBOVUxMOworCXJldHVybiB0cmVlLT5sZXZlbHMgKyBpOworCX0KKworU1RBQ0tfT0YoWDUwOV9QT0xJQ1lfTk9ERSkgKgorCQlYNTA5X3BvbGljeV90cmVlX2dldDBfcG9saWNpZXMoY29uc3QgWDUwOV9QT0xJQ1lfVFJFRSAqdHJlZSkKKwl7CisJaWYgKCF0cmVlKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gdHJlZS0+YXV0aF9wb2xpY2llczsKKwl9CisKK1NUQUNLX09GKFg1MDlfUE9MSUNZX05PREUpICoKKwlYNTA5X3BvbGljeV90cmVlX2dldDBfdXNlcl9wb2xpY2llcyhjb25zdCBYNTA5X1BPTElDWV9UUkVFICp0cmVlKQorCXsKKwlpZiAoIXRyZWUpCisJCXJldHVybiBOVUxMOworCWlmICh0cmVlLT5mbGFncyAmIFBPTElDWV9GTEFHX0FOWV9QT0xJQ1kpCisJCXJldHVybiB0cmVlLT5hdXRoX3BvbGljaWVzOworCWVsc2UKKwkJcmV0dXJuIHRyZWUtPnVzZXJfcG9saWNpZXM7CisJfQorCisvKiBYNTA5X1BPTElDWV9MRVZFTCBzdHVmZiAqLworCitpbnQgWDUwOV9wb2xpY3lfbGV2ZWxfbm9kZV9jb3VudChYNTA5X1BPTElDWV9MRVZFTCAqbGV2ZWwpCisJeworCWludCBuOworCWlmICghbGV2ZWwpCisJCXJldHVybiAwOworCWlmIChsZXZlbC0+YW55UG9saWN5KQorCQluID0gMTsKKwllbHNlCisJCW4gPSAwOworCWlmIChsZXZlbC0+bm9kZXMpCisJCW4gKz0gc2tfWDUwOV9QT0xJQ1lfTk9ERV9udW0obGV2ZWwtPm5vZGVzKTsKKwlyZXR1cm4gbjsKKwl9CisKK1g1MDlfUE9MSUNZX05PREUgKlg1MDlfcG9saWN5X2xldmVsX2dldDBfbm9kZShYNTA5X1BPTElDWV9MRVZFTCAqbGV2ZWwsIGludCBpKQorCXsKKwlpZiAoIWxldmVsKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAobGV2ZWwtPmFueVBvbGljeSkKKwkJeworCQlpZiAoaSA9PSAwKQorCQkJcmV0dXJuIGxldmVsLT5hbnlQb2xpY3k7CisJCWktLTsKKwkJfQorCXJldHVybiBza19YNTA5X1BPTElDWV9OT0RFX3ZhbHVlKGxldmVsLT5ub2RlcywgaSk7CisJfQorCisvKiBYNTA5X1BPTElDWV9OT0RFIHN0dWZmICovCisKK2NvbnN0IEFTTjFfT0JKRUNUICpYNTA5X3BvbGljeV9ub2RlX2dldDBfcG9saWN5KGNvbnN0IFg1MDlfUE9MSUNZX05PREUgKm5vZGUpCisJeworCWlmICghbm9kZSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIG5vZGUtPmRhdGEtPnZhbGlkX3BvbGljeTsKKwl9CisKKyNpZiAwCitpbnQgWDUwOV9wb2xpY3lfbm9kZV9nZXRfY3JpdGljYWwoY29uc3QgWDUwOV9QT0xJQ1lfTk9ERSAqbm9kZSkKKwl7CisJaWYgKG5vZGVfY3JpdGljYWwobm9kZSkpCisJCXJldHVybiAxOworCXJldHVybiAwOworCX0KKyNlbmRpZgorCitTVEFDS19PRihQT0xJQ1lRVUFMSU5GTykgKgorCQlYNTA5X3BvbGljeV9ub2RlX2dldDBfcXVhbGlmaWVycyhjb25zdCBYNTA5X1BPTElDWV9OT0RFICpub2RlKQorCXsKKwlpZiAoIW5vZGUpCisJCXJldHVybiBOVUxMOworCXJldHVybiBub2RlLT5kYXRhLT5xdWFsaWZpZXJfc2V0OworCX0KKworY29uc3QgWDUwOV9QT0xJQ1lfTk9ERSAqCisJCVg1MDlfcG9saWN5X25vZGVfZ2V0MF9wYXJlbnQoY29uc3QgWDUwOV9QT0xJQ1lfTk9ERSAqbm9kZSkKKwl7CisJaWYgKCFub2RlKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gbm9kZS0+cGFyZW50OworCX0KKworCmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOXYzL3BjeV9tYXAuYyBiL2NyeXB0by94NTA5djMvcGN5X21hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiODMwN2IKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOXYzL3BjeV9tYXAuYwpAQCAtMCwwICsxLDEzMyBAQAorLyogcGN5X21hcC5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwNC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorCisjaW5jbHVkZSAicGN5X2ludC5oIgorCisKKy8qIFNldCBwb2xpY3kgbWFwcGluZyBlbnRyaWVzIGluIGNhY2hlLgorICogTm90ZTogdGhpcyBtb2RpZmllcyB0aGUgcGFzc2VkIFBPTElDWV9NQVBQSU5HUyBzdHJ1Y3R1cmUKKyAqLworCitpbnQgcG9saWN5X2NhY2hlX3NldF9tYXBwaW5nKFg1MDkgKngsIFBPTElDWV9NQVBQSU5HUyAqbWFwcykKKwl7CisJUE9MSUNZX01BUFBJTkcgKm1hcDsKKwlYNTA5X1BPTElDWV9EQVRBICpkYXRhOworCVg1MDlfUE9MSUNZX0NBQ0hFICpjYWNoZSA9IHgtPnBvbGljeV9jYWNoZTsKKwlzaXplX3QgaTsKKwlpbnQgcmV0ID0gMDsKKwlpZiAoc2tfUE9MSUNZX01BUFBJTkdfbnVtKG1hcHMpID09IDApCisJCXsKKwkJcmV0ID0gLTE7CisJCWdvdG8gYmFkX21hcHBpbmc7CisJCX0KKwlmb3IgKGkgPSAwOyBpIDwgc2tfUE9MSUNZX01BUFBJTkdfbnVtKG1hcHMpOyBpKyspCisJCXsKKwkJbWFwID0gc2tfUE9MSUNZX01BUFBJTkdfdmFsdWUobWFwcywgaSk7CisJCS8qIFJlamVjdCBpZiBtYXAgdG8gb3IgZnJvbSBhbnlQb2xpY3kgKi8KKwkJaWYgKChPQkpfb2JqMm5pZChtYXAtPnN1YmplY3REb21haW5Qb2xpY3kpID09IE5JRF9hbnlfcG9saWN5KQorCQkgICB8fCAoT0JKX29iajJuaWQobWFwLT5pc3N1ZXJEb21haW5Qb2xpY3kpID09IE5JRF9hbnlfcG9saWN5KSkKKwkJCXsKKwkJCXJldCA9IC0xOworCQkJZ290byBiYWRfbWFwcGluZzsKKwkJCX0KKworCQkvKiBBdHRlbXB0IHRvIGZpbmQgbWF0Y2hpbmcgcG9saWN5IGRhdGEgKi8KKwkJZGF0YSA9IHBvbGljeV9jYWNoZV9maW5kX2RhdGEoY2FjaGUsIG1hcC0+aXNzdWVyRG9tYWluUG9saWN5KTsKKwkJLyogSWYgd2UgZG9uJ3QgaGF2ZSBhbnlQb2xpY3kgY2FuJ3QgbWFwICovCisJCWlmICghZGF0YSAmJiAhY2FjaGUtPmFueVBvbGljeSkKKwkJCWNvbnRpbnVlOworCisJCS8qIENyZWF0ZSBhIE5PREUgZnJvbSBhbnlQb2xpY3kgKi8KKwkJaWYgKCFkYXRhKQorCQkJeworCQkJZGF0YSA9IHBvbGljeV9kYXRhX25ldyhOVUxMLCBtYXAtPmlzc3VlckRvbWFpblBvbGljeSwKKwkJCQkJY2FjaGUtPmFueVBvbGljeS0+ZmxhZ3MKKwkJCQkJCSYgUE9MSUNZX0RBVEFfRkxBR19DUklUSUNBTCk7CisJCQlpZiAoIWRhdGEpCisJCQkJZ290byBiYWRfbWFwcGluZzsKKwkJCWRhdGEtPnF1YWxpZmllcl9zZXQgPSBjYWNoZS0+YW55UG9saWN5LT5xdWFsaWZpZXJfc2V0OworCQkJLyptYXAtPmlzc3VlckRvbWFpblBvbGljeSA9IE5VTEw7Ki8KKwkJCWRhdGEtPmZsYWdzIHw9IFBPTElDWV9EQVRBX0ZMQUdfTUFQUEVEX0FOWTsKKwkJCWRhdGEtPmZsYWdzIHw9IFBPTElDWV9EQVRBX0ZMQUdfU0hBUkVEX1FVQUxJRklFUlM7CisJCQlpZiAoIXNrX1g1MDlfUE9MSUNZX0RBVEFfcHVzaChjYWNoZS0+ZGF0YSwgZGF0YSkpCisJCQkJeworCQkJCXBvbGljeV9kYXRhX2ZyZWUoZGF0YSk7CisJCQkJZ290byBiYWRfbWFwcGluZzsKKwkJCQl9CisJCQl9CisJCWVsc2UKKwkJCWRhdGEtPmZsYWdzIHw9IFBPTElDWV9EQVRBX0ZMQUdfTUFQUEVEOworCQlpZiAoIXNrX0FTTjFfT0JKRUNUX3B1c2goZGF0YS0+ZXhwZWN0ZWRfcG9saWN5X3NldCwgCisJCQkJCQltYXAtPnN1YmplY3REb21haW5Qb2xpY3kpKQorCQkJZ290byBiYWRfbWFwcGluZzsKKwkJbWFwLT5zdWJqZWN0RG9tYWluUG9saWN5ID0gTlVMTDsKKworCQl9CisKKwlyZXQgPSAxOworCWJhZF9tYXBwaW5nOgorCWlmIChyZXQgPT0gLTEpCisJCXgtPmV4X2ZsYWdzIHw9IEVYRkxBR19JTlZBTElEX1BPTElDWTsKKwlza19QT0xJQ1lfTUFQUElOR19wb3BfZnJlZShtYXBzLCBQT0xJQ1lfTUFQUElOR19mcmVlKTsKKwlyZXR1cm4gcmV0OworCisJfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3g1MDl2My9wY3lfbm9kZS5jIGIvY3J5cHRvL3g1MDl2My9wY3lfbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1Y2MyMDMKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOXYzL3BjeV9ub2RlLmMKQEAgLTAsMCArMSwxOTcgQEAKKy8qIHBjeV9ub2RlLmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDA0LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDA0IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworI2luY2x1ZGUgInBjeV9pbnQuaCIKKworCitzdGF0aWMgaW50IG5vZGVfY21wKGNvbnN0IFg1MDlfUE9MSUNZX05PREUgKiphLAorCQkJY29uc3QgWDUwOV9QT0xJQ1lfTk9ERSAqKmIpCisJeworCXJldHVybiBPQkpfY21wKCgqYSktPmRhdGEtPnZhbGlkX3BvbGljeSwgKCpiKS0+ZGF0YS0+dmFsaWRfcG9saWN5KTsKKwl9CisKK1NUQUNLX09GKFg1MDlfUE9MSUNZX05PREUpICpwb2xpY3lfbm9kZV9jbXBfbmV3KHZvaWQpCisJeworCXJldHVybiBza19YNTA5X1BPTElDWV9OT0RFX25ldyhub2RlX2NtcCk7CisJfQorCitYNTA5X1BPTElDWV9OT0RFICp0cmVlX2ZpbmRfc2soU1RBQ0tfT0YoWDUwOV9QT0xJQ1lfTk9ERSkgKm5vZGVzLAorCQkJCQljb25zdCBBU04xX09CSkVDVCAqaWQpCisJeworCVg1MDlfUE9MSUNZX0RBVEEgbjsKKwlYNTA5X1BPTElDWV9OT0RFIGw7CisJc2l6ZV90IGlkeDsKKworCW4udmFsaWRfcG9saWN5ID0gKEFTTjFfT0JKRUNUICopaWQ7CisJbC5kYXRhID0gJm47CisKKwlpZiAoIXNrX1g1MDlfUE9MSUNZX05PREVfZmluZChub2RlcywgJmlkeCwgJmwpKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBza19YNTA5X1BPTElDWV9OT0RFX3ZhbHVlKG5vZGVzLCBpZHgpOworCisJfQorCitYNTA5X1BPTElDWV9OT0RFICpsZXZlbF9maW5kX25vZGUoY29uc3QgWDUwOV9QT0xJQ1lfTEVWRUwgKmxldmVsLAorCQkJCQljb25zdCBYNTA5X1BPTElDWV9OT0RFICpwYXJlbnQsCQorCQkJCQljb25zdCBBU04xX09CSkVDVCAqaWQpCisJeworCVg1MDlfUE9MSUNZX05PREUgKm5vZGU7CisJc2l6ZV90IGk7CisJZm9yIChpID0gMDsgaSA8IHNrX1g1MDlfUE9MSUNZX05PREVfbnVtKGxldmVsLT5ub2Rlcyk7IGkrKykKKwkJeworCQlub2RlID0gc2tfWDUwOV9QT0xJQ1lfTk9ERV92YWx1ZShsZXZlbC0+bm9kZXMsIGkpOworCQlpZiAobm9kZS0+cGFyZW50ID09IHBhcmVudCkKKwkJCXsKKwkJCWlmICghT0JKX2NtcChub2RlLT5kYXRhLT52YWxpZF9wb2xpY3ksIGlkKSkKKwkJCQlyZXR1cm4gbm9kZTsKKwkJCX0KKwkJfQorCXJldHVybiBOVUxMOworCX0KKworWDUwOV9QT0xJQ1lfTk9ERSAqbGV2ZWxfYWRkX25vZGUoWDUwOV9QT0xJQ1lfTEVWRUwgKmxldmVsLAorCQkJY29uc3QgWDUwOV9QT0xJQ1lfREFUQSAqZGF0YSwKKwkJCVg1MDlfUE9MSUNZX05PREUgKnBhcmVudCwKKwkJCVg1MDlfUE9MSUNZX1RSRUUgKnRyZWUpCisJeworCVg1MDlfUE9MSUNZX05PREUgKm5vZGU7CisJbm9kZSA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihYNTA5X1BPTElDWV9OT0RFKSk7CisJaWYgKCFub2RlKQorCQlyZXR1cm4gTlVMTDsKKwlub2RlLT5kYXRhID0gZGF0YTsKKwlub2RlLT5wYXJlbnQgPSBwYXJlbnQ7CisJbm9kZS0+bmNoaWxkID0gMDsKKwlpZiAobGV2ZWwpCisJCXsKKwkJaWYgKE9CSl9vYmoybmlkKGRhdGEtPnZhbGlkX3BvbGljeSkgPT0gTklEX2FueV9wb2xpY3kpCisJCQl7CisJCQlpZiAobGV2ZWwtPmFueVBvbGljeSkKKwkJCQlnb3RvIG5vZGVfZXJyb3I7CisJCQlsZXZlbC0+YW55UG9saWN5ID0gbm9kZTsKKwkJCX0KKwkJZWxzZQorCQkJeworCisJCQlpZiAoIWxldmVsLT5ub2RlcykKKwkJCQlsZXZlbC0+bm9kZXMgPSBwb2xpY3lfbm9kZV9jbXBfbmV3KCk7CisJCQlpZiAoIWxldmVsLT5ub2RlcykKKwkJCQlnb3RvIG5vZGVfZXJyb3I7CisJCQlpZiAoIXNrX1g1MDlfUE9MSUNZX05PREVfcHVzaChsZXZlbC0+bm9kZXMsIG5vZGUpKQorCQkJCWdvdG8gbm9kZV9lcnJvcjsKKwkJCX0KKwkJfQorCisJaWYgKHRyZWUpCisJCXsKKwkJaWYgKCF0cmVlLT5leHRyYV9kYXRhKQorCQkJIHRyZWUtPmV4dHJhX2RhdGEgPSBza19YNTA5X1BPTElDWV9EQVRBX25ld19udWxsKCk7CisJCWlmICghdHJlZS0+ZXh0cmFfZGF0YSkKKwkJCWdvdG8gbm9kZV9lcnJvcjsKKwkJaWYgKCFza19YNTA5X1BPTElDWV9EQVRBX3B1c2godHJlZS0+ZXh0cmFfZGF0YSwgZGF0YSkpCisJCQlnb3RvIG5vZGVfZXJyb3I7CisJCX0KKworCWlmIChwYXJlbnQpCisJCXBhcmVudC0+bmNoaWxkKys7CisKKwlyZXR1cm4gbm9kZTsKKworCW5vZGVfZXJyb3I6CisJcG9saWN5X25vZGVfZnJlZShub2RlKTsKKwlyZXR1cm4gMDsKKworCX0KKwordm9pZCBwb2xpY3lfbm9kZV9mcmVlKFg1MDlfUE9MSUNZX05PREUgKm5vZGUpCisJeworCU9QRU5TU0xfZnJlZShub2RlKTsKKwl9CisKKy8qIFNlZSBpZiBhIHBvbGljeSBub2RlIG1hdGNoZXMgYSBwb2xpY3kgT0lELiBJZiBtYXBwaW5nIGVuYWJsZWQgbG9vayB0aHJvdWdoCisgKiBleHBlY3RlZCBwb2xpY3kgc2V0IG90aGVyd2lzZSBqdXN0IHZhbGlkIHBvbGljeS4KKyAqLworCitpbnQgcG9saWN5X25vZGVfbWF0Y2goY29uc3QgWDUwOV9QT0xJQ1lfTEVWRUwgKmx2bCwKKwkJICAgICAgY29uc3QgWDUwOV9QT0xJQ1lfTk9ERSAqbm9kZSwgY29uc3QgQVNOMV9PQkpFQ1QgKm9pZCkKKwl7CisJc2l6ZV90IGk7CisJQVNOMV9PQkpFQ1QgKnBvbGljeV9vaWQ7CisJY29uc3QgWDUwOV9QT0xJQ1lfREFUQSAqeCA9IG5vZGUtPmRhdGE7CisKKwlpZiAoCSAgICAobHZsLT5mbGFncyAmIFg1MDlfVl9GTEFHX0lOSElCSVRfTUFQKQorCQl8fCAhKHgtPmZsYWdzICYgUE9MSUNZX0RBVEFfRkxBR19NQVBfTUFTSykpCisJCXsKKwkJaWYgKCFPQkpfY21wKHgtPnZhbGlkX3BvbGljeSwgb2lkKSkKKwkJCXJldHVybiAxOworCQlyZXR1cm4gMDsKKwkJfQorCisJZm9yIChpID0gMDsgaSA8IHNrX0FTTjFfT0JKRUNUX251bSh4LT5leHBlY3RlZF9wb2xpY3lfc2V0KTsgaSsrKQorCQl7CisJCXBvbGljeV9vaWQgPSBza19BU04xX09CSkVDVF92YWx1ZSh4LT5leHBlY3RlZF9wb2xpY3lfc2V0LCBpKTsKKwkJaWYgKCFPQkpfY21wKHBvbGljeV9vaWQsIG9pZCkpCisJCQlyZXR1cm4gMTsKKwkJfQorCXJldHVybiAwOworCisJfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3g1MDl2My9wY3lfdHJlZS5jIGIvY3J5cHRvL3g1MDl2My9wY3lfdHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYWE0OTgKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOXYzL3BjeV90cmVlLmMKQEAgLTAsMCArMSw4NzcgQEAKKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDA0LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDA0IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zdGFjay5oPgorI2luY2x1ZGUgPG9wZW5zc2wvdGhyZWFkLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworI2luY2x1ZGUgInBjeV9pbnQuaCIKKworCisvKiBFbmFibGUgdGhpcyB0byBwcmludCBvdXQgdGhlIGNvbXBsZXRlIHBvbGljeSB0cmVlIGF0IHZhcmlvdXMgcG9pbnQgZHVyaW5nCisgKiBldmFsdWF0aW9uLgorICovCisKKy8qI2RlZmluZSBPUEVOU1NMX1BPTElDWV9ERUJVRyovCisKKyNpZmRlZiBPUEVOU1NMX1BPTElDWV9ERUJVRworCitzdGF0aWMgdm9pZCBleHBlY3RlZF9wcmludChCSU8gKmVyciwgWDUwOV9QT0xJQ1lfTEVWRUwgKmxldiwKKwkJCQlYNTA5X1BPTElDWV9OT0RFICpub2RlLCBpbnQgaW5kZW50KQorCXsKKwlpZiAoCSAgICAobGV2LT5mbGFncyAmIFg1MDlfVl9GTEFHX0lOSElCSVRfTUFQKQorCQl8fCAhKG5vZGUtPmRhdGEtPmZsYWdzICYgUE9MSUNZX0RBVEFfRkxBR19NQVBfTUFTSykpCisJCUJJT19wdXRzKGVyciwgIiAgTm90IE1hcHBlZFxuIik7CisJZWxzZQorCQl7CisJCWludCBpOworCQlTVEFDS19PRihBU04xX09CSkVDVCkgKnBzZXQgPSBub2RlLT5kYXRhLT5leHBlY3RlZF9wb2xpY3lfc2V0OworCQlBU04xX09CSkVDVCAqb2lkOworCQlCSU9fcHV0cyhlcnIsICIgIEV4cGVjdGVkOiAiKTsKKwkJZm9yIChpID0gMDsgaSA8IHNrX0FTTjFfT0JKRUNUX251bShwc2V0KTsgaSsrKQorCQkJeworCQkJb2lkID0gc2tfQVNOMV9PQkpFQ1RfdmFsdWUocHNldCwgaSk7CisJCQlpZiAoaSkKKwkJCQlCSU9fcHV0cyhlcnIsICIsICIpOworCQkJaTJhX0FTTjFfT0JKRUNUKGVyciwgb2lkKTsKKwkJCX0KKwkJQklPX3B1dHMoZXJyLCAiXG4iKTsKKwkJfQorCX0KKworc3RhdGljIHZvaWQgdHJlZV9wcmludChjaGFyICpzdHIsIFg1MDlfUE9MSUNZX1RSRUUgKnRyZWUsCisJCQlYNTA5X1BPTElDWV9MRVZFTCAqY3VycikKKwl7CisJWDUwOV9QT0xJQ1lfTEVWRUwgKnBsZXY7CisJWDUwOV9QT0xJQ1lfTk9ERSAqbm9kZTsKKwlpbnQgaTsKKwlCSU8gKmVycjsKKwllcnIgPSBCSU9fbmV3X2ZwKHN0ZGVyciwgQklPX05PQ0xPU0UpOworCWlmICghY3VycikKKwkJY3VyciA9IHRyZWUtPmxldmVscyArIHRyZWUtPm5sZXZlbDsKKwllbHNlCisJCWN1cnIrKzsKKwlCSU9fcHJpbnRmKGVyciwgIkxldmVsIHByaW50IGFmdGVyICVzXG4iLCBzdHIpOworCUJJT19wcmludGYoZXJyLCAiUHJpbnRpbmcgVXAgdG8gTGV2ZWwgJWxkXG4iLCBjdXJyIC0gdHJlZS0+bGV2ZWxzKTsKKwlmb3IgKHBsZXYgPSB0cmVlLT5sZXZlbHM7IHBsZXYgIT0gY3VycjsgcGxldisrKQorCQl7CisJCUJJT19wcmludGYoZXJyLCAiTGV2ZWwgJWxkLCBmbGFncyA9ICV4XG4iLAorCQkJCXBsZXYgLSB0cmVlLT5sZXZlbHMsIHBsZXYtPmZsYWdzKTsKKwkJZm9yIChpID0gMDsgaSA8IHNrX1g1MDlfUE9MSUNZX05PREVfbnVtKHBsZXYtPm5vZGVzKTsgaSsrKQorCQkJeworCQkJbm9kZSA9IHNrX1g1MDlfUE9MSUNZX05PREVfdmFsdWUocGxldi0+bm9kZXMsIGkpOworCQkJWDUwOV9QT0xJQ1lfTk9ERV9wcmludChlcnIsIG5vZGUsIDIpOworCQkJZXhwZWN0ZWRfcHJpbnQoZXJyLCBwbGV2LCBub2RlLCAyKTsKKwkJCUJJT19wcmludGYoZXJyLCAiICBGbGFnczogJXhcbiIsIG5vZGUtPmRhdGEtPmZsYWdzKTsKKwkJCX0KKwkJaWYgKHBsZXYtPmFueVBvbGljeSkKKwkJCVg1MDlfUE9MSUNZX05PREVfcHJpbnQoZXJyLCBwbGV2LT5hbnlQb2xpY3ksIDIpOworCQl9CisKKwlCSU9fZnJlZShlcnIpOworCisJfQorI2Vsc2UKKworI2RlZmluZSB0cmVlX3ByaW50KGEsYixjKSAvKiAqLworCisjZW5kaWYKKworLyogSW5pdGlhbGl6ZSBwb2xpY3kgdHJlZS4gUmV0dXJuIHZhbHVlczoKKyAqICAwIFNvbWUgaW50ZXJuYWwgZXJyb3Igb2NjdXJlZC4KKyAqIC0xIEluY29uc2lzdGVudCBvciBpbnZhbGlkIGV4dGVuc2lvbnMgaW4gY2VydGlmaWNhdGVzLgorICogIDEgVHJlZSBpbml0aWFsaXplZCBPSy4KKyAqICAyIFBvbGljeSB0cmVlIGlzIGVtcHR5LgorICogIDUgVHJlZSBPSyBhbmQgcmVxdWlyZUV4cGxpY2l0UG9saWN5IHRydWUuCisgKiAgNiBUcmVlIGVtcHR5IGFuZCByZXF1aXJlRXhwbGljaXRQb2xpY3kgdHJ1ZS4KKyAqLworCitzdGF0aWMgaW50IHRyZWVfaW5pdChYNTA5X1BPTElDWV9UUkVFICoqcHRyZWUsIFNUQUNLX09GKFg1MDkpICpjZXJ0cywKKwkJCXVuc2lnbmVkIGludCBmbGFncykKKwl7CisJWDUwOV9QT0xJQ1lfVFJFRSAqdHJlZTsKKwlYNTA5X1BPTElDWV9MRVZFTCAqbGV2ZWw7CisJY29uc3QgWDUwOV9QT0xJQ1lfQ0FDSEUgKmNhY2hlOworCVg1MDlfUE9MSUNZX0RBVEEgKmRhdGEgPSBOVUxMOworCVg1MDkgKng7CisJaW50IHJldCA9IDE7CisJaW50IGksIG47CisJaW50IGV4cGxpY2l0X3BvbGljeTsKKwlpbnQgYW55X3NraXA7CisJaW50IG1hcF9za2lwOworCSpwdHJlZSA9IE5VTEw7CisJbiA9IHNrX1g1MDlfbnVtKGNlcnRzKTsKKworI2lmIDAKKwkvKiBEaXNhYmxlIHBvbGljeSBtYXBwaW5nIGZvciBub3cuLi4gKi8KKwlmbGFncyB8PSBYNTA5X1ZfRkxBR19JTkhJQklUX01BUDsKKyNlbmRpZgorCisJaWYgKGZsYWdzICYgWDUwOV9WX0ZMQUdfRVhQTElDSVRfUE9MSUNZKQorCQlleHBsaWNpdF9wb2xpY3kgPSAwOworCWVsc2UKKwkJZXhwbGljaXRfcG9saWN5ID0gbiArIDE7CisKKwlpZiAoZmxhZ3MgJiBYNTA5X1ZfRkxBR19JTkhJQklUX0FOWSkKKwkJYW55X3NraXAgPSAwOworCWVsc2UKKwkJYW55X3NraXAgPSBuICsgMTsKKworCWlmIChmbGFncyAmIFg1MDlfVl9GTEFHX0lOSElCSVRfTUFQKQorCQltYXBfc2tpcCA9IDA7CisJZWxzZQorCQltYXBfc2tpcCA9IG4gKyAxOworCisJLyogQ2FuJ3QgZG8gYW55dGhpbmcgd2l0aCBqdXN0IGEgdHJ1c3QgYW5jaG9yICovCisJaWYgKG4gPT0gMSkKKwkJcmV0dXJuIDE7CisJLyogRmlyc3Qgc2V0dXAgcG9saWN5IGNhY2hlIGluIGFsbCBjZXJ0aWZpY2F0ZXMgYXBhcnQgZnJvbSB0aGUKKwkgKiB0cnVzdCBhbmNob3IuIE5vdGUgYW55IGJhZCBjYWNoZSByZXN1bHRzIG9uIHRoZSB3YXkuIEFsc28gY2FuCisJICogY2FsY3VsYXRlIGV4cGxpY2l0X3BvbGljeSB2YWx1ZSBhdCB0aGlzIHBvaW50LgorCSAqLworCWZvciAoaSA9IG4gLSAyOyBpID49IDA7IGktLSkKKwkJeworCQl4ID0gc2tfWDUwOV92YWx1ZShjZXJ0cywgaSk7CisJCVg1MDlfY2hlY2tfcHVycG9zZSh4LCAtMSwgLTEpOworCQljYWNoZSA9IHBvbGljeV9jYWNoZV9zZXQoeCk7CisJCS8qIElmIGNhY2hlIE5VTEwgc29tZXRoaW5nIGJhZCBoYXBwZW5lZDogcmV0dXJuIGltbWVkaWF0ZWx5ICovCisJCWlmIChjYWNoZSA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCS8qIElmIGluY29uc2lzdGVudCBleHRlbnNpb25zIGtlZXAgYSBub3RlIG9mIGl0IGJ1dCBjb250aW51ZSAqLworCQlpZiAoeC0+ZXhfZmxhZ3MgJiBFWEZMQUdfSU5WQUxJRF9QT0xJQ1kpCisJCQlyZXQgPSAtMTsKKwkJLyogT3RoZXJ3aXNlIGlmIHdlIGhhdmUgbm8gZGF0YSAoaGVuY2Ugbm8gQ2VydGlmaWNhdGVQb2xpY2llcykKKwkJICogYW5kIGhhdmVuJ3QgYWxyZWFkeSBzZXQgYW4gaW5jb25zaXN0ZW50IGNvZGUgbm90ZSBpdC4KKwkJICovCisJCWVsc2UgaWYgKChyZXQgPT0gMSkgJiYgIWNhY2hlLT5kYXRhKQorCQkJcmV0ID0gMjsKKwkJaWYgKGV4cGxpY2l0X3BvbGljeSA+IDApCisJCQl7CisJCQlpZiAoISh4LT5leF9mbGFncyAmIEVYRkxBR19TSSkpCisJCQkJZXhwbGljaXRfcG9saWN5LS07CisJCQlpZiAoKGNhY2hlLT5leHBsaWNpdF9za2lwICE9IC0xKQorCQkJCSYmIChjYWNoZS0+ZXhwbGljaXRfc2tpcCA8IGV4cGxpY2l0X3BvbGljeSkpCisJCQkJZXhwbGljaXRfcG9saWN5ID0gY2FjaGUtPmV4cGxpY2l0X3NraXA7CisJCQl9CisJCX0KKworCWlmIChyZXQgIT0gMSkKKwkJeworCQlpZiAocmV0ID09IDIgJiYgIWV4cGxpY2l0X3BvbGljeSkKKwkJCXJldHVybiA2OworCQlyZXR1cm4gcmV0OworCQl9CisKKworCS8qIElmIHdlIGdldCB0aGlzIGZhciBpbml0aWFsaXplIHRoZSB0cmVlICovCisKKwl0cmVlID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKFg1MDlfUE9MSUNZX1RSRUUpKTsKKworCWlmICghdHJlZSkKKwkJcmV0dXJuIDA7CisKKwl0cmVlLT5mbGFncyA9IDA7CisJdHJlZS0+bGV2ZWxzID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKFg1MDlfUE9MSUNZX0xFVkVMKSAqIG4pOworCXRyZWUtPm5sZXZlbCA9IDA7CisJdHJlZS0+ZXh0cmFfZGF0YSA9IE5VTEw7CisJdHJlZS0+YXV0aF9wb2xpY2llcyA9IE5VTEw7CisJdHJlZS0+dXNlcl9wb2xpY2llcyA9IE5VTEw7CisKKwlpZiAoIXRyZWUtPmxldmVscykKKwkJeworCQlPUEVOU1NMX2ZyZWUodHJlZSk7CisJCXJldHVybiAwOworCQl9CisKKwltZW1zZXQodHJlZS0+bGV2ZWxzLCAwLCBuICogc2l6ZW9mKFg1MDlfUE9MSUNZX0xFVkVMKSk7CisKKwl0cmVlLT5ubGV2ZWwgPSBuOworCisJbGV2ZWwgPSB0cmVlLT5sZXZlbHM7CisKKwkvKiBSb290IGRhdGE6IGluaXRpYWxpemUgdG8gYW55UG9saWN5ICovCisKKwlkYXRhID0gcG9saWN5X2RhdGFfbmV3KE5VTEwsIE9CSl9uaWQyb2JqKE5JRF9hbnlfcG9saWN5KSwgMCk7CisKKwlpZiAoIWRhdGEgfHwgIWxldmVsX2FkZF9ub2RlKGxldmVsLCBkYXRhLCBOVUxMLCB0cmVlKSkKKwkJZ290byBiYWRfdHJlZTsKKworCWZvciAoaSA9IG4gLSAyOyBpID49IDA7IGktLSkKKwkJeworCQlsZXZlbCsrOworCQl4ID0gc2tfWDUwOV92YWx1ZShjZXJ0cywgaSk7CisJCWNhY2hlID0gcG9saWN5X2NhY2hlX3NldCh4KTsKKwkJQ1JZUFRPX2FkZCgmeC0+cmVmZXJlbmNlcywgMSwgQ1JZUFRPX0xPQ0tfWDUwOSk7CisJCWxldmVsLT5jZXJ0ID0geDsKKworCQlpZiAoIWNhY2hlLT5hbnlQb2xpY3kpCisJCQkJbGV2ZWwtPmZsYWdzIHw9IFg1MDlfVl9GTEFHX0lOSElCSVRfQU5ZOworCisJCS8qIERldGVybWluZSBpbmhpYml0IGFueSBhbmQgaW5oaWJpdCBtYXAgZmxhZ3MgKi8KKwkJaWYgKGFueV9za2lwID09IDApCisJCQl7CisJCQkvKiBBbnkgbWF0Y2hpbmcgYWxsb3dlZCBpZiBjZXJ0aWZpY2F0ZSBpcyBzZWxmCisJCQkgKiBpc3N1ZWQgYW5kIG5vdCB0aGUgbGFzdCBpbiB0aGUgY2hhaW4uCisJCQkgKi8KKwkJCWlmICghKHgtPmV4X2ZsYWdzICYgRVhGTEFHX1NJKSB8fCAoaSA9PSAwKSkKKwkJCQlsZXZlbC0+ZmxhZ3MgfD0gWDUwOV9WX0ZMQUdfSU5ISUJJVF9BTlk7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCWlmICghKHgtPmV4X2ZsYWdzICYgRVhGTEFHX1NJKSkKKwkJCQlhbnlfc2tpcC0tOworCQkJaWYgKChjYWNoZS0+YW55X3NraXAgPj0gMCkKKwkJCQkmJiAoY2FjaGUtPmFueV9za2lwIDwgYW55X3NraXApKQorCQkJCWFueV9za2lwID0gY2FjaGUtPmFueV9za2lwOworCQkJfQorCisJCWlmIChtYXBfc2tpcCA9PSAwKQorCQkJbGV2ZWwtPmZsYWdzIHw9IFg1MDlfVl9GTEFHX0lOSElCSVRfTUFQOworCQllbHNlCisJCQl7CisJCQlpZiAoISh4LT5leF9mbGFncyAmIEVYRkxBR19TSSkpCisJCQkJbWFwX3NraXAtLTsKKwkJCWlmICgoY2FjaGUtPm1hcF9za2lwID49IDApCisJCQkJJiYgKGNhY2hlLT5tYXBfc2tpcCA8IG1hcF9za2lwKSkKKwkJCQltYXBfc2tpcCA9IGNhY2hlLT5tYXBfc2tpcDsKKwkJCX0KKworCQl9CisKKwkqcHRyZWUgPSB0cmVlOworCisJaWYgKGV4cGxpY2l0X3BvbGljeSkKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gNTsKKworCWJhZF90cmVlOgorCisJWDUwOV9wb2xpY3lfdHJlZV9mcmVlKHRyZWUpOworCisJcmV0dXJuIDA7CisKKwl9CisKK3N0YXRpYyBpbnQgdHJlZV9saW5rX21hdGNoaW5nX25vZGVzKFg1MDlfUE9MSUNZX0xFVkVMICpjdXJyLAorCQkJCWNvbnN0IFg1MDlfUE9MSUNZX0RBVEEgKmRhdGEpCisJeworCVg1MDlfUE9MSUNZX0xFVkVMICpsYXN0ID0gY3VyciAtIDE7CisJWDUwOV9QT0xJQ1lfTk9ERSAqbm9kZTsKKwlpbnQgbWF0Y2hlZCA9IDA7CisJc2l6ZV90IGk7CisJLyogSXRlcmF0ZSB0aHJvdWdoIGFsbCBpbiBub2RlcyBsaW5raW5nIG1hdGNoZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2tfWDUwOV9QT0xJQ1lfTk9ERV9udW0obGFzdC0+bm9kZXMpOyBpKyspCisJCXsKKwkJbm9kZSA9IHNrX1g1MDlfUE9MSUNZX05PREVfdmFsdWUobGFzdC0+bm9kZXMsIGkpOworCQlpZiAocG9saWN5X25vZGVfbWF0Y2gobGFzdCwgbm9kZSwgZGF0YS0+dmFsaWRfcG9saWN5KSkKKwkJCXsKKwkJCWlmICghbGV2ZWxfYWRkX25vZGUoY3VyciwgZGF0YSwgbm9kZSwgTlVMTCkpCisJCQkJcmV0dXJuIDA7CisJCQltYXRjaGVkID0gMTsKKwkJCX0KKwkJfQorCWlmICghbWF0Y2hlZCAmJiBsYXN0LT5hbnlQb2xpY3kpCisJCXsKKwkJaWYgKCFsZXZlbF9hZGRfbm9kZShjdXJyLCBkYXRhLCBsYXN0LT5hbnlQb2xpY3ksIE5VTEwpKQorCQkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gMTsKKwl9CisKKy8qIFRoaXMgY29ycmVzcG9uZHMgdG8gUkZDMzI4MCA2LjEuMyhkKSgxKToKKyAqIGxpbmsgYW55IGRhdGEgZnJvbSBDZXJ0aWZpY2F0ZVBvbGljaWVzIG9udG8gbWF0Y2hpbmcgcGFyZW50CisgKiBvciBhbnlQb2xpY3kgaWYgbm8gbWF0Y2guCisgKi8KKworc3RhdGljIGludCB0cmVlX2xpbmtfbm9kZXMoWDUwOV9QT0xJQ1lfTEVWRUwgKmN1cnIsCisJCQkJY29uc3QgWDUwOV9QT0xJQ1lfQ0FDSEUgKmNhY2hlKQorCXsKKwlzaXplX3QgaTsKKwlYNTA5X1BPTElDWV9EQVRBICpkYXRhOworCisJZm9yIChpID0gMDsgaSA8IHNrX1g1MDlfUE9MSUNZX0RBVEFfbnVtKGNhY2hlLT5kYXRhKTsgaSsrKQorCQl7CisJCWRhdGEgPSBza19YNTA5X1BPTElDWV9EQVRBX3ZhbHVlKGNhY2hlLT5kYXRhLCBpKTsKKwkJLyogSWYgYSBub2RlIGlzIG1hcHBlZCBhbnkgaXQgZG9lc24ndCBoYXZlIGEgY29ycmVzcG9uZGluZworCQkgKiBDZXJ0aWZpY2F0ZVBvbGljaWVzIGVudHJ5LiAKKwkJICogSG93ZXZlciBzdWNoIGFuIGlkZW50aWNhbCBub2RlIHdvdWxkIGJlIGNyZWF0ZWQKKwkJICogaWYgYW55UG9saWN5IG1hdGNoaW5nIGlzIGVuYWJsZWQgYmVjYXVzZSB0aGVyZSB3b3VsZCBiZQorCQkgKiBubyBtYXRjaCB3aXRoIHRoZSBwYXJlbnQgdmFsaWRfcG9saWN5X3NldC4gU28gd2UgY3JlYXRlCisJCSAqIGxpbmsgYmVjYXVzZSB0aGVuIGl0IHdpbGwgaGF2ZSB0aGUgbWFwcGluZyBmbGFncworCQkgKiByaWdodCBhbmQgd2UgY2FuIHBydW5lIGl0IGxhdGVyLgorCQkgKi8KKyNpZiAwCisJCWlmICgoZGF0YS0+ZmxhZ3MgJiBQT0xJQ1lfREFUQV9GTEFHX01BUFBFRF9BTlkpCisJCQkmJiAhKGN1cnItPmZsYWdzICYgWDUwOV9WX0ZMQUdfSU5ISUJJVF9BTlkpKQorCQkJY29udGludWU7CisjZW5kaWYKKwkJLyogTG9vayBmb3IgbWF0Y2hpbmcgbm9kZXMgaW4gcHJldmlvdXMgbGV2ZWwgKi8KKwkJaWYgKCF0cmVlX2xpbmtfbWF0Y2hpbmdfbm9kZXMoY3VyciwgZGF0YSkpCisJCQkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gMTsKKwl9CisKKy8qIFRoaXMgY29ycmVzcG9uZHMgdG8gUkZDMzI4MCA2LjEuMyhkKSgyKToKKyAqIENyZWF0ZSBuZXcgZGF0YSBmb3IgYW55IHVubWF0Y2hlZCBwb2xpY2llcyBpbiB0aGUgcGFyZW50IGFuZCBsaW5rCisgKiB0byBhbnlQb2xpY3kuCisgKi8KKworc3RhdGljIGludCB0cmVlX2FkZF91bm1hdGNoZWQoWDUwOV9QT0xJQ1lfTEVWRUwgKmN1cnIsCisJCQljb25zdCBYNTA5X1BPTElDWV9DQUNIRSAqY2FjaGUsCisJCQljb25zdCBBU04xX09CSkVDVCAqaWQsCisJCQlYNTA5X1BPTElDWV9OT0RFICpub2RlLAorCQkJWDUwOV9QT0xJQ1lfVFJFRSAqdHJlZSkKKwl7CisJWDUwOV9QT0xJQ1lfREFUQSAqZGF0YTsKKwlpZiAoaWQgPT0gTlVMTCkKKwkJaWQgPSBub2RlLT5kYXRhLT52YWxpZF9wb2xpY3k7CisJLyogQ3JlYXRlIGEgbmV3IG5vZGUgd2l0aCBxdWFsaWZpZXJzIGZyb20gYW55UG9saWN5IGFuZAorCSAqIGlkIGZyb20gdW5tYXRjaGVkIG5vZGUuCisJICovCisJZGF0YSA9IHBvbGljeV9kYXRhX25ldyhOVUxMLCBpZCwgbm9kZV9jcml0aWNhbChub2RlKSk7CisKKwlpZiAoZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwkvKiBDdXJyIG1heSBub3QgaGF2ZSBhbnlQb2xpY3kgKi8KKwlkYXRhLT5xdWFsaWZpZXJfc2V0ID0gY2FjaGUtPmFueVBvbGljeS0+cXVhbGlmaWVyX3NldDsKKwlkYXRhLT5mbGFncyB8PSBQT0xJQ1lfREFUQV9GTEFHX1NIQVJFRF9RVUFMSUZJRVJTOworCWlmICghbGV2ZWxfYWRkX25vZGUoY3VyciwgZGF0YSwgbm9kZSwgdHJlZSkpCisJCXsKKwkJcG9saWN5X2RhdGFfZnJlZShkYXRhKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCB0cmVlX2xpbmtfdW5tYXRjaGVkKFg1MDlfUE9MSUNZX0xFVkVMICpjdXJyLAorCQkJY29uc3QgWDUwOV9QT0xJQ1lfQ0FDSEUgKmNhY2hlLAorCQkJWDUwOV9QT0xJQ1lfTk9ERSAqbm9kZSwKKwkJCVg1MDlfUE9MSUNZX1RSRUUgKnRyZWUpCisJeworCWNvbnN0IFg1MDlfUE9MSUNZX0xFVkVMICpsYXN0ID0gY3VyciAtIDE7CisJc2l6ZV90IGk7CisKKwlpZiAoCSAgICAobGFzdC0+ZmxhZ3MgJiBYNTA5X1ZfRkxBR19JTkhJQklUX01BUCkKKwkJfHwgIShub2RlLT5kYXRhLT5mbGFncyAmIFBPTElDWV9EQVRBX0ZMQUdfTUFQUEVEKSkKKwkJeworCQkvKiBJZiBubyBwb2xpY3kgbWFwcGluZzogbWF0Y2hlZCBpZiBvbmUgY2hpbGQgcHJlc2VudCAqLworCQlpZiAobm9kZS0+bmNoaWxkKQorCQkJcmV0dXJuIDE7CisJCWlmICghdHJlZV9hZGRfdW5tYXRjaGVkKGN1cnIsIGNhY2hlLCBOVUxMLCBub2RlLCB0cmVlKSkKKwkJCXJldHVybiAwOworCQkvKiBBZGQgaXQgKi8KKwkJfQorCWVsc2UKKwkJeworCQkvKiBJZiBtYXBwaW5nOiBtYXRjaGVkIGlmIG9uZSBjaGlsZCBwZXIgZXhwZWN0ZWQgcG9saWN5IHNldCAqLworCQlTVEFDS19PRihBU04xX09CSkVDVCkgKmV4cHNldCA9IG5vZGUtPmRhdGEtPmV4cGVjdGVkX3BvbGljeV9zZXQ7CisJCWlmIChub2RlLT5uY2hpbGQgPT0gc2tfQVNOMV9PQkpFQ1RfbnVtKGV4cHNldCkpCisJCQlyZXR1cm4gMTsKKwkJLyogTG9jYXRlIHVubWF0Y2hlZCBub2RlcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgc2tfQVNOMV9PQkpFQ1RfbnVtKGV4cHNldCk7IGkrKykKKwkJCXsKKwkJCUFTTjFfT0JKRUNUICpvaWQgPSBza19BU04xX09CSkVDVF92YWx1ZShleHBzZXQsIGkpOworCQkJaWYgKGxldmVsX2ZpbmRfbm9kZShjdXJyLCBub2RlLCBvaWQpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCF0cmVlX2FkZF91bm1hdGNoZWQoY3VyciwgY2FjaGUsIG9pZCwgbm9kZSwgdHJlZSkpCisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJfQorCisJcmV0dXJuIDE7CisKKwl9CisKK3N0YXRpYyBpbnQgdHJlZV9saW5rX2FueShYNTA5X1BPTElDWV9MRVZFTCAqY3VyciwKKwkJCWNvbnN0IFg1MDlfUE9MSUNZX0NBQ0hFICpjYWNoZSwKKwkJCVg1MDlfUE9MSUNZX1RSRUUgKnRyZWUpCisJeworCXNpemVfdCBpOworCS8qWDUwOV9QT0xJQ1lfREFUQSAqZGF0YTsqLworCVg1MDlfUE9MSUNZX05PREUgKm5vZGU7CisJWDUwOV9QT0xJQ1lfTEVWRUwgKmxhc3QgPSBjdXJyIC0gMTsKKworCWZvciAoaSA9IDA7IGkgPCBza19YNTA5X1BPTElDWV9OT0RFX251bShsYXN0LT5ub2Rlcyk7IGkrKykKKwkJeworCQlub2RlID0gc2tfWDUwOV9QT0xJQ1lfTk9ERV92YWx1ZShsYXN0LT5ub2RlcywgaSk7CisKKwkJaWYgKCF0cmVlX2xpbmtfdW5tYXRjaGVkKGN1cnIsIGNhY2hlLCBub2RlLCB0cmVlKSkKKwkJCXJldHVybiAwOworCisjaWYgMAorCisJCS8qIFNraXAgYW55IG5vZGUgd2l0aCBhbnkgY2hpbGRyZW46IHdlIG9ubHkgd2FudCB1bm1hdGhjZWQKKwkJICogbm9kZXMuCisJCSAqCisJCSAqIE5vdGU6IG5lZWQgc29tZXRoaW5nIGJldHRlciBmb3IgcG9saWN5IG1hcHBpbmcKKwkJICogYmVjYXVzZSBlYWNoIG5vZGUgbWF5IGhhdmUgbXVsdGlwbGUgY2hpbGRyZW4gCisJCSAqLworCQlpZiAobm9kZS0+bmNoaWxkKQorCQkJY29udGludWU7CisKKwkJLyogQ3JlYXRlIGEgbmV3IG5vZGUgd2l0aCBxdWFsaWZpZXJzIGZyb20gYW55UG9saWN5IGFuZAorCQkgKiBpZCBmcm9tIHVubWF0Y2hlZCBub2RlLgorCQkgKi8KKwkJZGF0YSA9IHBvbGljeV9kYXRhX25ldyhOVUxMLCBub2RlLT5kYXRhLT52YWxpZF9wb2xpY3ksIAorCQkJCQkJbm9kZV9jcml0aWNhbChub2RlKSk7CisKKwkJaWYgKGRhdGEgPT0gTlVMTCkKKwkJCXJldHVybiAwOworCQkvKiBDdXJyIG1heSBub3QgaGF2ZSBhbnlQb2xpY3kgKi8KKwkJZGF0YS0+cXVhbGlmaWVyX3NldCA9IGNhY2hlLT5hbnlQb2xpY3ktPnF1YWxpZmllcl9zZXQ7CisJCWRhdGEtPmZsYWdzIHw9IFBPTElDWV9EQVRBX0ZMQUdfU0hBUkVEX1FVQUxJRklFUlM7CisJCWlmICghbGV2ZWxfYWRkX25vZGUoY3VyciwgZGF0YSwgbm9kZSwgdHJlZSkpCisJCQl7CisJCQlwb2xpY3lfZGF0YV9mcmVlKGRhdGEpOworCQkJcmV0dXJuIDA7CisJCQl9CisKKyNlbmRpZgorCisJCX0KKwkvKiBGaW5hbGx5IGFkZCBsaW5rIHRvIGFueVBvbGljeSAqLworCWlmIChsYXN0LT5hbnlQb2xpY3kpCisJCXsKKwkJaWYgKCFsZXZlbF9hZGRfbm9kZShjdXJyLCBjYWNoZS0+YW55UG9saWN5LAorCQkJCQkJbGFzdC0+YW55UG9saWN5LCBOVUxMKSkKKwkJCXJldHVybiAwOworCQl9CisJcmV0dXJuIDE7CisJfQorCisvKiBQcnVuZSB0aGUgdHJlZTogZGVsZXRlIGFueSBjaGlsZCBtYXBwZWQgY2hpbGQgZGF0YSBvbiB0aGUgY3VycmVudCBsZXZlbAorICogdGhlbiBwcm9jZWVkIHVwIHRoZSB0cmVlIGRlbGV0aW5nIGFueSBkYXRhIHdpdGggbm8gY2hpbGRyZW4uIElmIHdlIGV2ZXIKKyAqIGhhdmUgbm8gZGF0YSBvbiBhIGxldmVsIHdlIGNhbiBoYWx0IGJlY2F1c2UgdGhlIHRyZWUgd2lsbCBiZSBlbXB0eS4KKyAqLworCitzdGF0aWMgaW50IHRyZWVfcHJ1bmUoWDUwOV9QT0xJQ1lfVFJFRSAqdHJlZSwgWDUwOV9QT0xJQ1lfTEVWRUwgKmN1cnIpCisJeworCVNUQUNLX09GKFg1MDlfUE9MSUNZX05PREUpICpub2RlczsKKwlYNTA5X1BPTElDWV9OT0RFICpub2RlOworCWludCBpOworCW5vZGVzID0gY3Vyci0+bm9kZXM7CisJaWYgKGN1cnItPmZsYWdzICYgWDUwOV9WX0ZMQUdfSU5ISUJJVF9NQVApCisJCXsKKwkJZm9yIChpID0gc2tfWDUwOV9QT0xJQ1lfTk9ERV9udW0obm9kZXMpIC0gMTsgaSA+PSAwOyBpLS0pCisJCQl7CisJCQlub2RlID0gc2tfWDUwOV9QT0xJQ1lfTk9ERV92YWx1ZShub2RlcywgaSk7CisJCQkvKiBEZWxldGUgYW55IG1hcHBlZCBkYXRhOiBzZWUgUkZDMzI4MCBYWFhYICovCisJCQlpZiAobm9kZS0+ZGF0YS0+ZmxhZ3MgJiBQT0xJQ1lfREFUQV9GTEFHX01BUF9NQVNLKQorCQkJCXsKKwkJCQlub2RlLT5wYXJlbnQtPm5jaGlsZC0tOworCQkJCU9QRU5TU0xfZnJlZShub2RlKTsKKwkJCQkodm9pZClza19YNTA5X1BPTElDWV9OT0RFX2RlbGV0ZShub2RlcyxpKTsKKwkJCQl9CisJCQl9CisJCX0KKworCWZvcig7OykJeworCQktLWN1cnI7CisJCW5vZGVzID0gY3Vyci0+bm9kZXM7CisJCWZvciAoaSA9IHNrX1g1MDlfUE9MSUNZX05PREVfbnVtKG5vZGVzKSAtIDE7IGkgPj0gMDsgaS0tKQorCQkJeworCQkJbm9kZSA9IHNrX1g1MDlfUE9MSUNZX05PREVfdmFsdWUobm9kZXMsIGkpOworCQkJaWYgKG5vZGUtPm5jaGlsZCA9PSAwKQorCQkJCXsKKwkJCQlub2RlLT5wYXJlbnQtPm5jaGlsZC0tOworCQkJCU9QRU5TU0xfZnJlZShub2RlKTsKKwkJCQkodm9pZClza19YNTA5X1BPTElDWV9OT0RFX2RlbGV0ZShub2RlcywgaSk7CisJCQkJfQorCQkJfQorCQlpZiAoY3Vyci0+YW55UG9saWN5ICYmICFjdXJyLT5hbnlQb2xpY3ktPm5jaGlsZCkKKwkJCXsKKwkJCWlmIChjdXJyLT5hbnlQb2xpY3ktPnBhcmVudCkKKwkJCQljdXJyLT5hbnlQb2xpY3ktPnBhcmVudC0+bmNoaWxkLS07CisJCQlPUEVOU1NMX2ZyZWUoY3Vyci0+YW55UG9saWN5KTsKKwkJCWN1cnItPmFueVBvbGljeSA9IE5VTEw7CisJCQl9CisJCWlmIChjdXJyID09IHRyZWUtPmxldmVscykKKwkJCXsKKwkJCS8qIElmIHdlIHphcHBlZCBhbnlQb2xpY3kgYXQgdG9wIHRoZW4gdHJlZSBpcyBlbXB0eSAqLworCQkJaWYgKCFjdXJyLT5hbnlQb2xpY3kpCisJCQkJCXJldHVybiAyOworCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKworCXJldHVybiAxOworCisJfQorCitzdGF0aWMgaW50IHRyZWVfYWRkX2F1dGhfbm9kZShTVEFDS19PRihYNTA5X1BPTElDWV9OT0RFKSAqKnBub2RlcywKKwkJCQkJCSBYNTA5X1BPTElDWV9OT0RFICpwY3kpCisJeworCWlmICghKnBub2RlcykKKwkJeworCQkqcG5vZGVzID0gcG9saWN5X25vZGVfY21wX25ldygpOworCQlpZiAoISpwbm9kZXMpCisJCQlyZXR1cm4gMDsKKwkJfQorCWVsc2UgaWYgKHNrX1g1MDlfUE9MSUNZX05PREVfZmluZCgqcG5vZGVzLCBOVUxMLCBwY3kpKQorCQlyZXR1cm4gMTsKKworCWlmICghc2tfWDUwOV9QT0xJQ1lfTk9ERV9wdXNoKCpwbm9kZXMsIHBjeSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7CisKKwl9CisKKy8qIENhbGN1bGF0ZSB0aGUgYXV0aG9yaXR5IHNldCBiYXNlZCBvbiBwb2xpY3kgdHJlZS4KKyAqIFRoZSAncG5vZGVzJyBwYXJhbWV0ZXIgaXMgdXNlZCBhcyBhIHN0b3JlIGZvciB0aGUgc2V0IG9mIHBvbGljeSBub2RlcworICogdXNlZCB0byBjYWxjdWxhdGUgdGhlIHVzZXIgc2V0LiBJZiB0aGUgYXV0aG9yaXR5IHNldCBpcyBub3QgYW55UG9saWN5CisgKiB0aGVuIHBub2RlcyB3aWxsIGp1c3QgcG9pbnQgdG8gdGhlIGF1dGhvcml0eSBzZXQuIElmIGhvd2V2ZXIgdGhlIGF1dGhvcml0eQorICogc2V0IGlzIGFueVBvbGljeSB0aGVuIHRoZSBzZXQgb2YgdmFsaWQgcG9saWNpZXMgKG90aGVyIHRoYW4gYW55UG9saWN5KQorICogaXMgc3RvcmUgaW4gcG5vZGVzLiBUaGUgcmV0dXJuIHZhbHVlIG9mICcyJyBpcyB1c2VkIGluIHRoaXMgY2FzZSB0byBpbmRpY2F0ZQorICogdGhhdCBwbm9kZXMgc2hvdWxkIGJlIGZyZWVkLgorICovCisKK3N0YXRpYyBpbnQgdHJlZV9jYWxjdWxhdGVfYXV0aG9yaXR5X3NldChYNTA5X1BPTElDWV9UUkVFICp0cmVlLAorCQkJCQlTVEFDS19PRihYNTA5X1BPTElDWV9OT0RFKSAqKnBub2RlcykKKwl7CisJWDUwOV9QT0xJQ1lfTEVWRUwgKmN1cnI7CisJWDUwOV9QT0xJQ1lfTk9ERSAqbm9kZSwgKmFueXB0cjsKKwlTVEFDS19PRihYNTA5X1BPTElDWV9OT0RFKSAqKmFkZG5vZGVzOworCWludCBpOworCXNpemVfdCBqOworCWN1cnIgPSB0cmVlLT5sZXZlbHMgKyB0cmVlLT5ubGV2ZWwgLSAxOworCisJLyogSWYgbGFzdCBsZXZlbCBjb250YWlucyBhbnlQb2xpY3kgc2V0IGlzIGFueVBvbGljeSAqLworCWlmIChjdXJyLT5hbnlQb2xpY3kpCisJCXsKKwkJaWYgKCF0cmVlX2FkZF9hdXRoX25vZGUoJnRyZWUtPmF1dGhfcG9saWNpZXMsIGN1cnItPmFueVBvbGljeSkpCisJCQlyZXR1cm4gMDsKKwkJYWRkbm9kZXMgPSBwbm9kZXM7CisJCX0KKwllbHNlCisJCS8qIEFkZCBwb2xpY2llcyB0byBhdXRob3JpdHkgc2V0ICovCisJCWFkZG5vZGVzID0gJnRyZWUtPmF1dGhfcG9saWNpZXM7CisKKwljdXJyID0gdHJlZS0+bGV2ZWxzOworCWZvciAoaSA9IDE7IGkgPCB0cmVlLT5ubGV2ZWw7IGkrKykKKwkJeworCQkvKiBJZiBubyBhbnlQb2xpY3kgbm9kZSBvbiB0aGlzIHRoaXMgbGV2ZWwgaXQgY2FuJ3QKKwkJICogYXBwZWFyIG9uIGxvd2VyIGxldmVscyBzbyBlbmQgc2VhcmNoLgorCQkgKi8KKwkJaWYgKCEoYW55cHRyID0gY3Vyci0+YW55UG9saWN5KSkKKwkJCWJyZWFrOworCQljdXJyKys7CisJCWZvciAoaiA9IDA7IGogPCBza19YNTA5X1BPTElDWV9OT0RFX251bShjdXJyLT5ub2Rlcyk7IGorKykKKwkJCXsKKwkJCW5vZGUgPSBza19YNTA5X1BPTElDWV9OT0RFX3ZhbHVlKGN1cnItPm5vZGVzLCBqKTsKKwkJCWlmICgobm9kZS0+cGFyZW50ID09IGFueXB0cikKKwkJCQkmJiAhdHJlZV9hZGRfYXV0aF9ub2RlKGFkZG5vZGVzLCBub2RlKSkKKwkJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKworCWlmIChhZGRub2RlcyA9PSBwbm9kZXMpCisJCXJldHVybiAyOworCisJKnBub2RlcyA9IHRyZWUtPmF1dGhfcG9saWNpZXM7CisKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgdHJlZV9jYWxjdWxhdGVfdXNlcl9zZXQoWDUwOV9QT0xJQ1lfVFJFRSAqdHJlZSwKKwkJCQlTVEFDS19PRihBU04xX09CSkVDVCkgKnBvbGljeV9vaWRzLAorCQkJCVNUQUNLX09GKFg1MDlfUE9MSUNZX05PREUpICphdXRoX25vZGVzKQorCXsKKwlzaXplX3QgaTsKKwlYNTA5X1BPTElDWV9OT0RFICpub2RlOworCUFTTjFfT0JKRUNUICpvaWQ7CisKKwlYNTA5X1BPTElDWV9OT0RFICphbnlQb2xpY3k7CisJWDUwOV9QT0xJQ1lfREFUQSAqZXh0cmE7CisKKwkvKiBDaGVjayBpZiBhbnlQb2xpY3kgcHJlc2VudCBpbiBhdXRob3JpdHkgY29uc3RyYWluZWQgcG9saWN5IHNldDoKKwkgKiB0aGlzIHdpbGwgaGFwcGVuIGlmIGl0IGlzIGEgbGVhZiBub2RlLgorCSAqLworCisJaWYgKHNrX0FTTjFfT0JKRUNUX251bShwb2xpY3lfb2lkcykgPD0gMCkKKwkJcmV0dXJuIDE7CisKKwlhbnlQb2xpY3kgPSB0cmVlLT5sZXZlbHNbdHJlZS0+bmxldmVsIC0gMV0uYW55UG9saWN5OworCisJZm9yIChpID0gMDsgaSA8IHNrX0FTTjFfT0JKRUNUX251bShwb2xpY3lfb2lkcyk7IGkrKykKKwkJeworCQlvaWQgPSBza19BU04xX09CSkVDVF92YWx1ZShwb2xpY3lfb2lkcywgaSk7CisJCWlmIChPQkpfb2JqMm5pZChvaWQpID09IE5JRF9hbnlfcG9saWN5KQorCQkJeworCQkJdHJlZS0+ZmxhZ3MgfD0gUE9MSUNZX0ZMQUdfQU5ZX1BPTElDWTsKKwkJCXJldHVybiAxOworCQkJfQorCQl9CisKKwlmb3IgKGkgPSAwOyBpIDwgc2tfQVNOMV9PQkpFQ1RfbnVtKHBvbGljeV9vaWRzKTsgaSsrKQorCQl7CisJCW9pZCA9IHNrX0FTTjFfT0JKRUNUX3ZhbHVlKHBvbGljeV9vaWRzLCBpKTsKKwkJbm9kZSA9IHRyZWVfZmluZF9zayhhdXRoX25vZGVzLCBvaWQpOworCQlpZiAoIW5vZGUpCisJCQl7CisJCQlpZiAoIWFueVBvbGljeSkKKwkJCQljb250aW51ZTsKKwkJCS8qIENyZWF0ZSBhIG5ldyBub2RlIHdpdGggcG9saWN5IElEIGZyb20gdXNlciBzZXQKKwkJCSAqIGFuZCBxdWFsaWZpZXJzIGZyb20gYW55UG9saWN5LgorCQkJICovCisJCQlleHRyYSA9IHBvbGljeV9kYXRhX25ldyhOVUxMLCBvaWQsCisJCQkJCQlub2RlX2NyaXRpY2FsKGFueVBvbGljeSkpOworCQkJaWYgKCFleHRyYSkKKwkJCQlyZXR1cm4gMDsKKwkJCWV4dHJhLT5xdWFsaWZpZXJfc2V0ID0gYW55UG9saWN5LT5kYXRhLT5xdWFsaWZpZXJfc2V0OworCQkJZXh0cmEtPmZsYWdzID0gUE9MSUNZX0RBVEFfRkxBR19TSEFSRURfUVVBTElGSUVSUworCQkJCQkJfCBQT0xJQ1lfREFUQV9GTEFHX0VYVFJBX05PREU7CisJCQlub2RlID0gbGV2ZWxfYWRkX25vZGUoTlVMTCwgZXh0cmEsIGFueVBvbGljeS0+cGFyZW50LAorCQkJCQkJdHJlZSk7CisJCQl9CisJCWlmICghdHJlZS0+dXNlcl9wb2xpY2llcykKKwkJCXsKKwkJCXRyZWUtPnVzZXJfcG9saWNpZXMgPSBza19YNTA5X1BPTElDWV9OT0RFX25ld19udWxsKCk7CisJCQlpZiAoIXRyZWUtPnVzZXJfcG9saWNpZXMpCisJCQkJcmV0dXJuIDE7CisJCQl9CisJCWlmICghc2tfWDUwOV9QT0xJQ1lfTk9ERV9wdXNoKHRyZWUtPnVzZXJfcG9saWNpZXMsIG5vZGUpKQorCQkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gMTsKKworCX0KKworc3RhdGljIGludCB0cmVlX2V2YWx1YXRlKFg1MDlfUE9MSUNZX1RSRUUgKnRyZWUpCisJeworCWludCByZXQsIGk7CisJWDUwOV9QT0xJQ1lfTEVWRUwgKmN1cnIgPSB0cmVlLT5sZXZlbHMgKyAxOworCWNvbnN0IFg1MDlfUE9MSUNZX0NBQ0hFICpjYWNoZTsKKworCWZvcihpID0gMTsgaSA8IHRyZWUtPm5sZXZlbDsgaSsrLCBjdXJyKyspCisJCXsKKwkJY2FjaGUgPSBwb2xpY3lfY2FjaGVfc2V0KGN1cnItPmNlcnQpOworCQlpZiAoIXRyZWVfbGlua19ub2RlcyhjdXJyLCBjYWNoZSkpCisJCQlyZXR1cm4gMDsKKworCQlpZiAoIShjdXJyLT5mbGFncyAmIFg1MDlfVl9GTEFHX0lOSElCSVRfQU5ZKQorCQkJJiYgIXRyZWVfbGlua19hbnkoY3VyciwgY2FjaGUsIHRyZWUpKQorCQkJcmV0dXJuIDA7CisJdHJlZV9wcmludCgiYmVmb3JlIHRyZWVfcHJ1bmUoKSIsIHRyZWUsIGN1cnIpOworCQlyZXQgPSB0cmVlX3BydW5lKHRyZWUsIGN1cnIpOworCQlpZiAocmV0ICE9IDEpCisJCQlyZXR1cm4gcmV0OworCQl9CisKKwlyZXR1cm4gMTsKKworCX0KKworc3RhdGljIHZvaWQgZXhub2RlX2ZyZWUoWDUwOV9QT0xJQ1lfTk9ERSAqbm9kZSkKKwl7CisJaWYgKG5vZGUtPmRhdGEgJiYgKG5vZGUtPmRhdGEtPmZsYWdzICYgUE9MSUNZX0RBVEFfRkxBR19FWFRSQV9OT0RFKSkKKwkJT1BFTlNTTF9mcmVlKG5vZGUpOworCX0KKworCit2b2lkIFg1MDlfcG9saWN5X3RyZWVfZnJlZShYNTA5X1BPTElDWV9UUkVFICp0cmVlKQorCXsKKwlYNTA5X1BPTElDWV9MRVZFTCAqY3VycjsKKwlpbnQgaTsKKworCWlmICghdHJlZSkKKwkJcmV0dXJuOworCisJc2tfWDUwOV9QT0xJQ1lfTk9ERV9mcmVlKHRyZWUtPmF1dGhfcG9saWNpZXMpOworCXNrX1g1MDlfUE9MSUNZX05PREVfcG9wX2ZyZWUodHJlZS0+dXNlcl9wb2xpY2llcywgZXhub2RlX2ZyZWUpOworCisJZm9yKGkgPSAwLCBjdXJyID0gdHJlZS0+bGV2ZWxzOyBpIDwgdHJlZS0+bmxldmVsOyBpKyssIGN1cnIrKykKKwkJeworCQlpZiAoY3Vyci0+Y2VydCkKKwkJCVg1MDlfZnJlZShjdXJyLT5jZXJ0KTsKKwkJaWYgKGN1cnItPm5vZGVzKQorCQkJc2tfWDUwOV9QT0xJQ1lfTk9ERV9wb3BfZnJlZShjdXJyLT5ub2RlcywKKwkJCQkJCXBvbGljeV9ub2RlX2ZyZWUpOworCQlpZiAoY3Vyci0+YW55UG9saWN5KQorCQkJcG9saWN5X25vZGVfZnJlZShjdXJyLT5hbnlQb2xpY3kpOworCQl9CisKKwlpZiAodHJlZS0+ZXh0cmFfZGF0YSkKKwkJc2tfWDUwOV9QT0xJQ1lfREFUQV9wb3BfZnJlZSh0cmVlLT5leHRyYV9kYXRhLAorCQkJCQkJcG9saWN5X2RhdGFfZnJlZSk7CisKKwlPUEVOU1NMX2ZyZWUodHJlZS0+bGV2ZWxzKTsKKwlPUEVOU1NMX2ZyZWUodHJlZSk7CisKKwl9CisKKy8qIEFwcGxpY2F0aW9uIHBvbGljeSBjaGVja2luZyBmdW5jdGlvbi4KKyAqIFJldHVybiBjb2RlczoKKyAqICAwIAlJbnRlcm5hbCBFcnJvci4KKyAqICAxICAgU3VjY2Vzc2Z1bC4KKyAqIC0xICAgT25lIG9yIG1vcmUgY2VydGlmaWNhdGVzIGNvbnRhaW4gaW52YWxpZCBvciBpbmNvbnNpc3RlbnQgZXh0ZW5zaW9ucworICogLTIJVXNlciBjb25zdHJhaW5lZCBwb2xpY3kgc2V0IGVtcHR5IGFuZCByZXF1aXJlRXhwbGljaXQgdHJ1ZS4KKyAqLworCitpbnQgWDUwOV9wb2xpY3lfY2hlY2soWDUwOV9QT0xJQ1lfVFJFRSAqKnB0cmVlLCBpbnQgKnBleHBsaWNpdF9wb2xpY3ksCisJCQlTVEFDS19PRihYNTA5KSAqY2VydHMsCisJCQlTVEFDS19PRihBU04xX09CSkVDVCkgKnBvbGljeV9vaWRzLAorCQkJdW5zaWduZWQgaW50IGZsYWdzKQorCXsKKwlpbnQgcmV0OworCVg1MDlfUE9MSUNZX1RSRUUgKnRyZWUgPSBOVUxMOworCVNUQUNLX09GKFg1MDlfUE9MSUNZX05PREUpICpub2RlcywgKmF1dGhfbm9kZXMgPSBOVUxMOworCSpwdHJlZSA9IE5VTEw7CisKKwkqcGV4cGxpY2l0X3BvbGljeSA9IDA7CisJcmV0ID0gdHJlZV9pbml0KCZ0cmVlLCBjZXJ0cywgZmxhZ3MpOworCisJc3dpdGNoIChyZXQpCisJCXsKKworCQkvKiBUcmVlIGVtcHR5IHJlcXVpcmVFeHBsaWNpdCBGYWxzZTogT0sgKi8KKwkJY2FzZSAyOgorCQlyZXR1cm4gMTsKKworCQkvKiBTb21lIGludGVybmFsIGVycm9yICovCisJCWNhc2UgLTE6CisJCXJldHVybiAtMTsKKworCQkvKiBTb21lIGludGVybmFsIGVycm9yICovCisJCWNhc2UgMDoKKwkJcmV0dXJuIDA7CisKKwkJLyogVHJlZSBlbXB0eSByZXF1aXJlRXhwbGljaXQgVHJ1ZTogRXJyb3IgKi8KKworCQljYXNlIDY6CisJCSpwZXhwbGljaXRfcG9saWN5ID0gMTsKKwkJcmV0dXJuIC0yOworCisJCS8qIFRyZWUgT0sgcmVxdWlyZUV4cGxpY2l0IFRydWU6IE9LIGFuZCBjb250aW51ZSAqLworCQljYXNlIDU6CisJCSpwZXhwbGljaXRfcG9saWN5ID0gMTsKKwkJYnJlYWs7CisKKwkJLyogVHJlZSBPSzogY29udGludWUgKi8KKworCQljYXNlIDE6CisJCWlmICghdHJlZSkKKwkJCS8qCisJCQkgKiB0cmVlX2luaXQoKSByZXR1cm5zIHN1Y2Nlc3MgYW5kIGEgbnVsbCB0cmVlCisJCQkgKiBpZiBpdCdzIGp1c3QgbG9va2luZyBhdCBhIHRydXN0IGFuY2hvci4KKwkJCSAqIEknbSBub3Qgc3VyZSB0aGF0IHJldHVybmluZyBzdWNjZXNzIGhlcmUgaXMKKwkJCSAqIGNvcnJlY3QsIGJ1dCBJJ20gc3VyZSB0aGF0IHJlcG9ydGluZyB0aGlzCisJCQkgKiBhcyBhbiBpbnRlcm5hbCBlcnJvciB3aGljaCBvdXIgY2FsbGVyCisJCQkgKiBpbnRlcnByZXRzIGFzIGEgbWFsbG9jIGZhaWx1cmUgaXMgd3JvbmcuCisJCQkgKi8KKwkJCXJldHVybiAxOworCQlicmVhazsKKwkJfQorCisJaWYgKCF0cmVlKSBnb3RvIGVycm9yOworCXJldCA9IHRyZWVfZXZhbHVhdGUodHJlZSk7CisKKwl0cmVlX3ByaW50KCJ0cmVlX2V2YWx1YXRlKCkiLCB0cmVlLCBOVUxMKTsKKworCWlmIChyZXQgPD0gMCkKKwkJZ290byBlcnJvcjsKKworCS8qIFJldHVybiB2YWx1ZSAyIG1lYW5zIHRyZWUgZW1wdHkgKi8KKwlpZiAocmV0ID09IDIpCisJCXsKKwkJWDUwOV9wb2xpY3lfdHJlZV9mcmVlKHRyZWUpOworCQlpZiAoKnBleHBsaWNpdF9wb2xpY3kpCisJCQlyZXR1cm4gLTI7CisJCWVsc2UKKwkJCXJldHVybiAxOworCQl9CisKKwkvKiBUcmVlIGlzIG5vdCBlbXB0eTogY29udGludWUgKi8KKworCXJldCA9IHRyZWVfY2FsY3VsYXRlX2F1dGhvcml0eV9zZXQodHJlZSwgJmF1dGhfbm9kZXMpOworCisJaWYgKCFyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlpZiAoIXRyZWVfY2FsY3VsYXRlX3VzZXJfc2V0KHRyZWUsIHBvbGljeV9vaWRzLCBhdXRoX25vZGVzKSkKKwkJZ290byBlcnJvcjsKKwkKKwlpZiAocmV0ID09IDIpCisJCXNrX1g1MDlfUE9MSUNZX05PREVfZnJlZShhdXRoX25vZGVzKTsKKworCWlmICh0cmVlKQorCQkqcHRyZWUgPSB0cmVlOworCisJaWYgKCpwZXhwbGljaXRfcG9saWN5KQorCQl7CisJCW5vZGVzID0gWDUwOV9wb2xpY3lfdHJlZV9nZXQwX3VzZXJfcG9saWNpZXModHJlZSk7CisJCWlmIChza19YNTA5X1BPTElDWV9OT0RFX251bShub2RlcykgPD0gMCkKKwkJCXJldHVybiAtMjsKKwkJfQorCisJcmV0dXJuIDE7CisKKwllcnJvcjoKKworCVg1MDlfcG9saWN5X3RyZWVfZnJlZSh0cmVlKTsKKworCXJldHVybiAwOworCisJfQorCmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOXYzL3RhYnRlc3QuYyBiL2NyeXB0by94NTA5djMvdGFidGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMjdjMWUKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOXYzL3RhYnRlc3QuYwpAQCAtMCwwICsxLDkyIEBACisvKiB0YWJ0ZXN0LmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAxOTk5LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKy8qIFNpbXBsZSBwcm9ncmFtIHRvIGNoZWNrIHRoZSBleHRfZGF0LmggaXMgY29ycmVjdCBhbmQgcHJpbnQgb3V0CisgKiBwcm9ibGVtcyBpZiBpdCBpcyBub3QuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorCisjaW5jbHVkZSAiZXh0X2RhdC5oIgorCitpbnQgbWFpbigpCit7CisJaW50IGksIHByZXYgPSAtMSwgYmFkID0gMDsKKwljb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqKnRtcDsKKwlpID0gc2l6ZW9mKHN0YW5kYXJkX2V4dHMpIC8gc2l6ZW9mKFg1MDlWM19FWFRfTUVUSE9EICopOworCWlmKGkgIT0gU1RBTkRBUkRfRVhURU5TSU9OX0NPVU5UKQorCQlmcHJpbnRmKHN0ZGVyciwgIkV4dGVuc2lvbiBudW1iZXIgaW52YWxpZCBleHBlY3RpbmcgJWRcbiIsIGkpOworCXRtcCA9IHN0YW5kYXJkX2V4dHM7CisJZm9yKGkgPSAwOyBpIDwgU1RBTkRBUkRfRVhURU5TSU9OX0NPVU5UOyBpKyssIHRtcCsrKSB7CisJCWlmKCgqdG1wKS0+ZXh0X25pZCA8IHByZXYpIGJhZCA9IDE7CisJCXByZXYgPSAoKnRtcCktPmV4dF9uaWQ7CisJCQorCX0KKwlpZihiYWQpIHsKKwkJdG1wID0gc3RhbmRhcmRfZXh0czsKKwkJZnByaW50ZihzdGRlcnIsICJFeHRlbnNpb25zIG91dCBvZiBvcmRlciFcbiIpOworCQlmb3IoaSA9IDA7IGkgPCBTVEFOREFSRF9FWFRFTlNJT05fQ09VTlQ7IGkrKywgdG1wKyspCisJCXByaW50ZigiJWQgOiAlc1xuIiwgKCp0bXApLT5leHRfbmlkLCBPQkpfbmlkMnNuKCgqdG1wKS0+ZXh0X25pZCkpOworCQlyZXR1cm4gMTsKKwl9IGVsc2UgeworCQlwcmludGYoIlBBU1NcbiIpOworCQlyZXR1cm4gMDsKKwl9Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOXYzL3YzX2FrZXkuYyBiL2NyeXB0by94NTA5djMvdjNfYWtleS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NjA3ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOXYzL3YzX2FrZXkuYwpAQCAtMCwwICsxLDIxMSBAQAorLyogdjNfYWtleS5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NvbmYuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorCisKK3N0YXRpYyBTVEFDS19PRihDT05GX1ZBTFVFKSAqaTJ2X0FVVEhPUklUWV9LRVlJRChYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCQkJQVVUSE9SSVRZX0tFWUlEICpha2V5aWQsIFNUQUNLX09GKENPTkZfVkFMVUUpICpleHRsaXN0KTsKK3N0YXRpYyBBVVRIT1JJVFlfS0VZSUQgKnYyaV9BVVRIT1JJVFlfS0VZSUQoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwKKwkJCVg1MDlWM19DVFggKmN0eCwgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKnZhbHVlcyk7CisKK2NvbnN0IFg1MDlWM19FWFRfTUVUSE9EIHYzX2FrZXlfaWQgPQorCXsKKwlOSURfYXV0aG9yaXR5X2tleV9pZGVudGlmaWVyLAorCVg1MDlWM19FWFRfTVVMVElMSU5FLCBBU04xX0lURU1fcmVmKEFVVEhPUklUWV9LRVlJRCksCisJMCwwLDAsMCwKKwkwLDAsCisJKFg1MDlWM19FWFRfSTJWKWkydl9BVVRIT1JJVFlfS0VZSUQsCisJKFg1MDlWM19FWFRfVjJJKXYyaV9BVVRIT1JJVFlfS0VZSUQsCisJMCwwLAorCU5VTEwKKwl9OworCitzdGF0aWMgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKmkydl9BVVRIT1JJVFlfS0VZSUQoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwKKwkgICAgIEFVVEhPUklUWV9LRVlJRCAqYWtleWlkLCBTVEFDS19PRihDT05GX1ZBTFVFKSAqZXh0bGlzdCkKK3sKKwljaGFyICp0bXA7CisJaWYoYWtleWlkLT5rZXlpZCkgeworCQl0bXAgPSBoZXhfdG9fc3RyaW5nKGFrZXlpZC0+a2V5aWQtPmRhdGEsIGFrZXlpZC0+a2V5aWQtPmxlbmd0aCk7CisJCVg1MDlWM19hZGRfdmFsdWUoImtleWlkIiwgdG1wLCAmZXh0bGlzdCk7CisJCU9QRU5TU0xfZnJlZSh0bXApOworCX0KKwlpZihha2V5aWQtPmlzc3VlcikgCisJCWV4dGxpc3QgPSBpMnZfR0VORVJBTF9OQU1FUyhOVUxMLCBha2V5aWQtPmlzc3VlciwgZXh0bGlzdCk7CisJaWYoYWtleWlkLT5zZXJpYWwpIHsKKwkJdG1wID0gaGV4X3RvX3N0cmluZyhha2V5aWQtPnNlcmlhbC0+ZGF0YSwKKwkJCQkJCSBha2V5aWQtPnNlcmlhbC0+bGVuZ3RoKTsKKwkJWDUwOVYzX2FkZF92YWx1ZSgic2VyaWFsIiwgdG1wLCAmZXh0bGlzdCk7CisJCU9QRU5TU0xfZnJlZSh0bXApOworCX0KKwlyZXR1cm4gZXh0bGlzdDsKK30KKworLyogQ3VycmVudGx5IHR3byBvcHRpb25zOgorICoga2V5aWQ6IHVzZSB0aGUgaXNzdWVycyBzdWJqZWN0IGtleWlkLCB0aGUgdmFsdWUgJ2Fsd2F5cycgbWVhbnMgaXRzIGlzCisgKiBhbiBlcnJvciBpZiB0aGUgaXNzdWVyIGNlcnRpZmljYXRlIGRvZXNuJ3QgaGF2ZSBhIGtleSBpZC4KKyAqIGlzc3VlcjogdXNlIHRoZSBpc3N1ZXJzIGNlcnQgaXNzdWVyIGFuZCBzZXJpYWwgbnVtYmVyLiBUaGUgZGVmYXVsdCBpcworICogdG8gb25seSB1c2UgdGhpcyBpZiBrZXlpZCBpcyBub3QgcHJlc2VudC4gV2l0aCB0aGUgb3B0aW9uICdhbHdheXMnCisgKiB0aGlzIGlzIGFsd2F5cyBpbmNsdWRlZC4KKyAqLworCitzdGF0aWMgQVVUSE9SSVRZX0tFWUlEICp2MmlfQVVUSE9SSVRZX0tFWUlEKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCisJICAgICBYNTA5VjNfQ1RYICpjdHgsIFNUQUNLX09GKENPTkZfVkFMVUUpICp2YWx1ZXMpCisJeworCWNoYXIga2V5aWQ9MCwgaXNzdWVyPTA7CisJc2l6ZV90IGk7CisJaW50IGo7CisJQ09ORl9WQUxVRSAqY25mOworCUFTTjFfT0NURVRfU1RSSU5HICppa2V5aWQgPSBOVUxMOworCVg1MDlfTkFNRSAqaXNuYW1lID0gTlVMTDsKKwlHRU5FUkFMX05BTUVTICogZ2VucyA9IE5VTEw7CisJR0VORVJBTF9OQU1FICpnZW4gPSBOVUxMOworCUFTTjFfSU5URUdFUiAqc2VyaWFsID0gTlVMTDsKKwlYNTA5X0VYVEVOU0lPTiAqZXh0OworCVg1MDkgKmNlcnQ7CisJQVVUSE9SSVRZX0tFWUlEICpha2V5aWQ7CisKKwlmb3IoaSA9IDA7IGkgPCBza19DT05GX1ZBTFVFX251bSh2YWx1ZXMpOyBpKyspCisJCXsKKwkJY25mID0gc2tfQ09ORl9WQUxVRV92YWx1ZSh2YWx1ZXMsIGkpOworCQlpZighc3RyY21wKGNuZi0+bmFtZSwgImtleWlkIikpCisJCQl7CisJCQlrZXlpZCA9IDE7CisJCQlpZihjbmYtPnZhbHVlICYmICFzdHJjbXAoY25mLT52YWx1ZSwgImFsd2F5cyIpKQorCQkJCWtleWlkID0gMjsKKwkJCX0KKwkJZWxzZSBpZighc3RyY21wKGNuZi0+bmFtZSwgImlzc3VlciIpKQorCQkJeworCQkJaXNzdWVyID0gMTsKKwkJCWlmKGNuZi0+dmFsdWUgJiYgIXN0cmNtcChjbmYtPnZhbHVlLCAiYWx3YXlzIikpCisJCQkJaXNzdWVyID0gMjsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2MmlfQVVUSE9SSVRZX0tFWUlELCBYNTA5VjNfUl9VTktOT1dOX09QVElPTik7CisJCQlFUlJfYWRkX2Vycm9yX2RhdGEoMiwgIm5hbWU9IiwgY25mLT5uYW1lKTsKKwkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisKKwlpZighY3R4IHx8ICFjdHgtPmlzc3Vlcl9jZXJ0KQorCQl7CisJCWlmKGN0eCAmJiAoY3R4LT5mbGFncz09Q1RYX1RFU1QpKQorCQkJcmV0dXJuIEFVVEhPUklUWV9LRVlJRF9uZXcoKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2MmlfQVVUSE9SSVRZX0tFWUlELCBYNTA5VjNfUl9OT19JU1NVRVJfQ0VSVElGSUNBVEUpOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJY2VydCA9IGN0eC0+aXNzdWVyX2NlcnQ7CisKKwlpZihrZXlpZCkKKwkJeworCQlqID0gWDUwOV9nZXRfZXh0X2J5X05JRChjZXJ0LCBOSURfc3ViamVjdF9rZXlfaWRlbnRpZmllciwgLTEpOworCQlpZigoaiA+PSAwKSAgJiYgKGV4dCA9IFg1MDlfZ2V0X2V4dChjZXJ0LCBqKSkpCisJCQlpa2V5aWQgPSBYNTA5VjNfRVhUX2QyaShleHQpOworCQlpZihrZXlpZD09MiAmJiAhaWtleWlkKQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2MmlfQVVUSE9SSVRZX0tFWUlELCBYNTA5VjNfUl9VTkFCTEVfVE9fR0VUX0lTU1VFUl9LRVlJRCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCisJaWYoKGlzc3VlciAmJiAhaWtleWlkKSB8fCAoaXNzdWVyID09IDIpKQorCQl7CisJCWlzbmFtZSA9IFg1MDlfTkFNRV9kdXAoWDUwOV9nZXRfaXNzdWVyX25hbWUoY2VydCkpOworCQlzZXJpYWwgPSBNX0FTTjFfSU5URUdFUl9kdXAoWDUwOV9nZXRfc2VyaWFsTnVtYmVyKGNlcnQpKTsKKwkJaWYoIWlzbmFtZSB8fCAhc2VyaWFsKQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2MmlfQVVUSE9SSVRZX0tFWUlELCBYNTA5VjNfUl9VTkFCTEVfVE9fR0VUX0lTU1VFUl9ERVRBSUxTKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQl9CisKKwlpZighKGFrZXlpZCA9IEFVVEhPUklUWV9LRVlJRF9uZXcoKSkpIGdvdG8gZXJyOworCisJaWYoaXNuYW1lKQorCQl7CisJCWlmKCEoZ2VucyA9IHNrX0dFTkVSQUxfTkFNRV9uZXdfbnVsbCgpKQorCQkJfHwgIShnZW4gPSBHRU5FUkFMX05BTUVfbmV3KCkpCisJCQl8fCAhc2tfR0VORVJBTF9OQU1FX3B1c2goZ2VucywgZ2VuKSkKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgdjJpX0FVVEhPUklUWV9LRVlJRCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJZ290byBlcnI7CisJCQl9CisJCWdlbi0+dHlwZSA9IEdFTl9ESVJOQU1FOworCQlnZW4tPmQuZGlybiA9IGlzbmFtZTsKKwkJfQorCisJYWtleWlkLT5pc3N1ZXIgPSBnZW5zOworCWFrZXlpZC0+c2VyaWFsID0gc2VyaWFsOworCWFrZXlpZC0+a2V5aWQgPSBpa2V5aWQ7CisKKwlyZXR1cm4gYWtleWlkOworCisgZXJyOgorCVg1MDlfTkFNRV9mcmVlKGlzbmFtZSk7CisJTV9BU04xX0lOVEVHRVJfZnJlZShzZXJpYWwpOworCU1fQVNOMV9PQ1RFVF9TVFJJTkdfZnJlZShpa2V5aWQpOworCXJldHVybiBOVUxMOworCX0KZGlmZiAtLWdpdCBhL2NyeXB0by94NTA5djMvdjNfYWtleWEuYyBiL2NyeXB0by94NTA5djMvdjNfYWtleWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjcyY2NhCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3g1MDl2My92M19ha2V5YS5jCkBAIC0wLDAgKzEsNzEgQEAKKy8qIHYzX2FrZXlfYXNuMS5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NvbmYuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorCisKK0FTTjFfU0VRVUVOQ0UoQVVUSE9SSVRZX0tFWUlEKSA9IHsKKwlBU04xX0lNUF9PUFQoQVVUSE9SSVRZX0tFWUlELCBrZXlpZCwgQVNOMV9PQ1RFVF9TVFJJTkcsIDApLAorCUFTTjFfSU1QX1NFUVVFTkNFX09GX09QVChBVVRIT1JJVFlfS0VZSUQsIGlzc3VlciwgR0VORVJBTF9OQU1FLCAxKSwKKwlBU04xX0lNUF9PUFQoQVVUSE9SSVRZX0tFWUlELCBzZXJpYWwsIEFTTjFfSU5URUdFUiwgMikKK30gQVNOMV9TRVFVRU5DRV9FTkQoQVVUSE9SSVRZX0tFWUlEKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoQVVUSE9SSVRZX0tFWUlEKQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3g1MDl2My92M19hbHQuYyBiL2NyeXB0by94NTA5djMvdjNfYWx0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRlMGYwYQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94NTA5djMvdjNfYWx0LmMKQEAgLTAsMCArMSw2MTcgQEAKKy8qIHYzX2FsdC5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMyBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvY29uZi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisKKworc3RhdGljIEdFTkVSQUxfTkFNRVMgKnYyaV9zdWJqZWN0X2FsdChYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLCBYNTA5VjNfQ1RYICpjdHgsIFNUQUNLX09GKENPTkZfVkFMVUUpICpudmFsKTsKK3N0YXRpYyBHRU5FUkFMX05BTUVTICp2MmlfaXNzdWVyX2FsdChYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLCBYNTA5VjNfQ1RYICpjdHgsIFNUQUNLX09GKENPTkZfVkFMVUUpICpudmFsKTsKK3N0YXRpYyBpbnQgY29weV9lbWFpbChYNTA5VjNfQ1RYICpjdHgsIEdFTkVSQUxfTkFNRVMgKmdlbnMsIGludCBtb3ZlX3ApOworc3RhdGljIGludCBjb3B5X2lzc3VlcihYNTA5VjNfQ1RYICpjdHgsIEdFTkVSQUxfTkFNRVMgKmdlbnMpOworc3RhdGljIGludCBkb19vdGhlcm5hbWUoR0VORVJBTF9OQU1FICpnZW4sIGNoYXIgKnZhbHVlLCBYNTA5VjNfQ1RYICpjdHgpOworc3RhdGljIGludCBkb19kaXJuYW1lKEdFTkVSQUxfTkFNRSAqZ2VuLCBjaGFyICp2YWx1ZSwgWDUwOVYzX0NUWCAqY3R4KTsKKworY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgdjNfYWx0W10gPSB7Cit7IE5JRF9zdWJqZWN0X2FsdF9uYW1lLCAwLCBBU04xX0lURU1fcmVmKEdFTkVSQUxfTkFNRVMpLAorMCwwLDAsMCwKKzAsMCwKKyhYNTA5VjNfRVhUX0kyVilpMnZfR0VORVJBTF9OQU1FUywKKyhYNTA5VjNfRVhUX1YySSl2Mmlfc3ViamVjdF9hbHQsCitOVUxMLCBOVUxMLCBOVUxMfSwKKworeyBOSURfaXNzdWVyX2FsdF9uYW1lLCAwLCBBU04xX0lURU1fcmVmKEdFTkVSQUxfTkFNRVMpLAorMCwwLDAsMCwKKzAsMCwKKyhYNTA5VjNfRVhUX0kyVilpMnZfR0VORVJBTF9OQU1FUywKKyhYNTA5VjNfRVhUX1YySSl2MmlfaXNzdWVyX2FsdCwKK05VTEwsIE5VTEwsIE5VTEx9LAorCit7IE5JRF9jZXJ0aWZpY2F0ZV9pc3N1ZXIsIDAsIEFTTjFfSVRFTV9yZWYoR0VORVJBTF9OQU1FUyksCiswLDAsMCwwLAorMCwwLAorKFg1MDlWM19FWFRfSTJWKWkydl9HRU5FUkFMX05BTUVTLAorTlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0sCit9OworCitTVEFDS19PRihDT05GX1ZBTFVFKSAqaTJ2X0dFTkVSQUxfTkFNRVMoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwKKwkJR0VORVJBTF9OQU1FUyAqZ2VucywgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKnJldCkKK3sKKwlzaXplX3QgaTsKKwlHRU5FUkFMX05BTUUgKmdlbjsKKwlmb3IoaSA9IDA7IGkgPCBza19HRU5FUkFMX05BTUVfbnVtKGdlbnMpOyBpKyspIHsKKwkJZ2VuID0gc2tfR0VORVJBTF9OQU1FX3ZhbHVlKGdlbnMsIGkpOworCQlyZXQgPSBpMnZfR0VORVJBTF9OQU1FKG1ldGhvZCwgZ2VuLCByZXQpOworCX0KKwlpZighcmV0KSByZXR1cm4gc2tfQ09ORl9WQUxVRV9uZXdfbnVsbCgpOworCXJldHVybiByZXQ7Cit9CisKK1NUQUNLX09GKENPTkZfVkFMVUUpICppMnZfR0VORVJBTF9OQU1FKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCisJCQkJR0VORVJBTF9OQU1FICpnZW4sIFNUQUNLX09GKENPTkZfVkFMVUUpICpyZXQpCit7CisJdW5zaWduZWQgY2hhciAqcDsKKwljaGFyIG9saW5lWzI1Nl0sIGh0bXBbNV07CisJaW50IGk7CisJc3dpdGNoIChnZW4tPnR5cGUpCisJeworCQljYXNlIEdFTl9PVEhFUk5BTUU6CisJCVg1MDlWM19hZGRfdmFsdWUoIm90aGVybmFtZSIsIjx1bnN1cHBvcnRlZD4iLCAmcmV0KTsKKwkJYnJlYWs7CisKKwkJY2FzZSBHRU5fWDQwMDoKKwkJWDUwOVYzX2FkZF92YWx1ZSgiWDQwME5hbWUiLCI8dW5zdXBwb3J0ZWQ+IiwgJnJldCk7CisJCWJyZWFrOworCisJCWNhc2UgR0VOX0VESVBBUlRZOgorCQlYNTA5VjNfYWRkX3ZhbHVlKCJFZGlQYXJ0eU5hbWUiLCI8dW5zdXBwb3J0ZWQ+IiwgJnJldCk7CisJCWJyZWFrOworCisJCWNhc2UgR0VOX0VNQUlMOgorCQlYNTA5VjNfYWRkX3ZhbHVlX3VjaGFyKCJlbWFpbCIsZ2VuLT5kLmlhNS0+ZGF0YSwgJnJldCk7CisJCWJyZWFrOworCisJCWNhc2UgR0VOX0ROUzoKKwkJWDUwOVYzX2FkZF92YWx1ZV91Y2hhcigiRE5TIixnZW4tPmQuaWE1LT5kYXRhLCAmcmV0KTsKKwkJYnJlYWs7CisKKwkJY2FzZSBHRU5fVVJJOgorCQlYNTA5VjNfYWRkX3ZhbHVlX3VjaGFyKCJVUkkiLGdlbi0+ZC5pYTUtPmRhdGEsICZyZXQpOworCQlicmVhazsKKworCQljYXNlIEdFTl9ESVJOQU1FOgorCQlYNTA5X05BTUVfb25lbGluZShnZW4tPmQuZGlybiwgb2xpbmUsIDI1Nik7CisJCVg1MDlWM19hZGRfdmFsdWUoIkRpck5hbWUiLG9saW5lLCAmcmV0KTsKKwkJYnJlYWs7CisKKwkJY2FzZSBHRU5fSVBBREQ6CisJCXAgPSBnZW4tPmQuaXAtPmRhdGE7CisJCWlmKGdlbi0+ZC5pcC0+bGVuZ3RoID09IDQpCisJCQlCSU9fc25wcmludGYob2xpbmUsIHNpemVvZiBvbGluZSwKKwkJCQkgICAgICIlZC4lZC4lZC4lZCIsIHBbMF0sIHBbMV0sIHBbMl0sIHBbM10pOworCQllbHNlIGlmKGdlbi0+ZC5pcC0+bGVuZ3RoID09IDE2KQorCQkJeworCQkJb2xpbmVbMF0gPSAwOworCQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJCQl7CisJCQkJQklPX3NucHJpbnRmKGh0bXAsIHNpemVvZiBodG1wLAorCQkJCQkgICAgICIlWCIsIHBbMF0gPDwgOCB8IHBbMV0pOworCQkJCXAgKz0gMjsKKwkJCQlzdHJjYXQob2xpbmUsIGh0bXApOworCQkJCWlmIChpICE9IDcpCisJCQkJCXN0cmNhdChvbGluZSwgIjoiKTsKKwkJCQl9CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCVg1MDlWM19hZGRfdmFsdWUoIklQIEFkZHJlc3MiLCI8aW52YWxpZD4iLCAmcmV0KTsKKwkJCWJyZWFrOworCQkJfQorCQlYNTA5VjNfYWRkX3ZhbHVlKCJJUCBBZGRyZXNzIixvbGluZSwgJnJldCk7CisJCWJyZWFrOworCisJCWNhc2UgR0VOX1JJRDoKKwkJaTJ0X0FTTjFfT0JKRUNUKG9saW5lLCAyNTYsIGdlbi0+ZC5yaWQpOworCQlYNTA5VjNfYWRkX3ZhbHVlKCJSZWdpc3RlcmVkIElEIixvbGluZSwgJnJldCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitpbnQgR0VORVJBTF9OQU1FX3ByaW50KEJJTyAqb3V0LCBHRU5FUkFMX05BTUUgKmdlbikKK3sKKwl1bnNpZ25lZCBjaGFyICpwOworCWludCBpOworCXN3aXRjaCAoZ2VuLT50eXBlKQorCXsKKwkJY2FzZSBHRU5fT1RIRVJOQU1FOgorCQlCSU9fcHJpbnRmKG91dCwgIm90aGVybmFtZTo8dW5zdXBwb3J0ZWQ+Iik7CisJCWJyZWFrOworCisJCWNhc2UgR0VOX1g0MDA6CisJCUJJT19wcmludGYob3V0LCAiWDQwME5hbWU6PHVuc3VwcG9ydGVkPiIpOworCQlicmVhazsKKworCQljYXNlIEdFTl9FRElQQVJUWToKKwkJLyogTWF5YmUgZml4IHRoaXM6IGl0IGlzIHN1cHBvcnRlZCBub3cgKi8KKwkJQklPX3ByaW50ZihvdXQsICJFZGlQYXJ0eU5hbWU6PHVuc3VwcG9ydGVkPiIpOworCQlicmVhazsKKworCQljYXNlIEdFTl9FTUFJTDoKKwkJQklPX3ByaW50ZihvdXQsICJlbWFpbDolcyIsZ2VuLT5kLmlhNS0+ZGF0YSk7CisJCWJyZWFrOworCisJCWNhc2UgR0VOX0ROUzoKKwkJQklPX3ByaW50ZihvdXQsICJETlM6JXMiLGdlbi0+ZC5pYTUtPmRhdGEpOworCQlicmVhazsKKworCQljYXNlIEdFTl9VUkk6CisJCUJJT19wcmludGYob3V0LCAiVVJJOiVzIixnZW4tPmQuaWE1LT5kYXRhKTsKKwkJYnJlYWs7CisKKwkJY2FzZSBHRU5fRElSTkFNRToKKwkJQklPX3ByaW50ZihvdXQsICJEaXJOYW1lOiAiKTsKKwkJWDUwOV9OQU1FX3ByaW50X2V4KG91dCwgZ2VuLT5kLmRpcm4sIDAsIFhOX0ZMQUdfT05FTElORSk7CisJCWJyZWFrOworCisJCWNhc2UgR0VOX0lQQUREOgorCQlwID0gZ2VuLT5kLmlwLT5kYXRhOworCQlpZihnZW4tPmQuaXAtPmxlbmd0aCA9PSA0KQorCQkJQklPX3ByaW50ZihvdXQsICJJUCBBZGRyZXNzOiVkLiVkLiVkLiVkIiwKKwkJCQkJCXBbMF0sIHBbMV0sIHBbMl0sIHBbM10pOworCQllbHNlIGlmKGdlbi0+ZC5pcC0+bGVuZ3RoID09IDE2KQorCQkJeworCQkJQklPX3ByaW50ZihvdXQsICJJUCBBZGRyZXNzIik7CisJCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKG91dCwgIjolWCIsIHBbMF0gPDwgOCB8IHBbMV0pOworCQkJCXAgKz0gMjsKKwkJCQl9CisJCQlCSU9fcHV0cyhvdXQsICJcbiIpOworCQkJfQorCQllbHNlCisJCQl7CisJCQlCSU9fcHJpbnRmKG91dCwiSVAgQWRkcmVzczo8aW52YWxpZD4iKTsKKwkJCWJyZWFrOworCQkJfQorCQlicmVhazsKKworCQljYXNlIEdFTl9SSUQ6CisJCUJJT19wcmludGYob3V0LCAiUmVnaXN0ZXJlZCBJRCIpOworCQlpMmFfQVNOMV9PQkpFQ1Qob3V0LCBnZW4tPmQucmlkKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgR0VORVJBTF9OQU1FUyAqdjJpX2lzc3Vlcl9hbHQoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwKKwkJCQkgWDUwOVYzX0NUWCAqY3R4LCBTVEFDS19PRihDT05GX1ZBTFVFKSAqbnZhbCkKK3sKKwlHRU5FUkFMX05BTUVTICpnZW5zID0gTlVMTDsKKwlDT05GX1ZBTFVFICpjbmY7CisJc2l6ZV90IGk7CisJaWYoIShnZW5zID0gc2tfR0VORVJBTF9OQU1FX25ld19udWxsKCkpKSB7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgdjJpX2lzc3Vlcl9hbHQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWZvcihpID0gMDsgaSA8IHNrX0NPTkZfVkFMVUVfbnVtKG52YWwpOyBpKyspIHsKKwkJY25mID0gc2tfQ09ORl9WQUxVRV92YWx1ZShudmFsLCBpKTsKKwkJaWYoIW5hbWVfY21wKGNuZi0+bmFtZSwgImlzc3VlciIpICYmIGNuZi0+dmFsdWUgJiYKKwkJCQkJCSFzdHJjbXAoY25mLT52YWx1ZSwgImNvcHkiKSkgeworCQkJaWYoIWNvcHlfaXNzdWVyKGN0eCwgZ2VucykpIGdvdG8gZXJyOworCQl9IGVsc2UgeworCQkJR0VORVJBTF9OQU1FICpnZW47CisJCQlpZighKGdlbiA9IHYyaV9HRU5FUkFMX05BTUUobWV0aG9kLCBjdHgsIGNuZikpKQorCQkJCQkJCQkgZ290byBlcnI7IAorCQkJc2tfR0VORVJBTF9OQU1FX3B1c2goZ2VucywgZ2VuKTsKKwkJfQorCX0KKwlyZXR1cm4gZ2VuczsKKwllcnI6CisJc2tfR0VORVJBTF9OQU1FX3BvcF9mcmVlKGdlbnMsIEdFTkVSQUxfTkFNRV9mcmVlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyogQXBwZW5kIHN1YmplY3QgYWx0bmFtZSBvZiBpc3N1ZXIgdG8gaXNzdWVyIGFsdCBuYW1lIG9mIHN1YmplY3QgKi8KKworc3RhdGljIGludCBjb3B5X2lzc3VlcihYNTA5VjNfQ1RYICpjdHgsIEdFTkVSQUxfTkFNRVMgKmdlbnMpCit7CisJR0VORVJBTF9OQU1FUyAqaWFsdDsKKwlHRU5FUkFMX05BTUUgKmdlbjsKKwlYNTA5X0VYVEVOU0lPTiAqZXh0OworCWludCBpOworCXNpemVfdCBqOworCWlmKGN0eCAmJiAoY3R4LT5mbGFncyA9PSBDVFhfVEVTVCkpIHJldHVybiAxOworCWlmKCFjdHggfHwgIWN0eC0+aXNzdWVyX2NlcnQpIHsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBjb3B5X2lzc3VlciwgWDUwOVYzX1JfTk9fSVNTVUVSX0RFVEFJTFMpOworCQlnb3RvIGVycjsKKwl9CisgICAgICAgIGkgPSBYNTA5X2dldF9leHRfYnlfTklEKGN0eC0+aXNzdWVyX2NlcnQsIE5JRF9zdWJqZWN0X2FsdF9uYW1lLCAtMSk7CisJaWYoaSA8IDApIHJldHVybiAxOworICAgICAgICBpZighKGV4dCA9IFg1MDlfZ2V0X2V4dChjdHgtPmlzc3Vlcl9jZXJ0LCBpKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICEoaWFsdCA9IFg1MDlWM19FWFRfZDJpKGV4dCkpICkgeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIGNvcHlfaXNzdWVyLCBYNTA5VjNfUl9JU1NVRVJfREVDT0RFX0VSUk9SKTsKKwkJZ290byBlcnI7CisJfQorCisJZm9yKGogPSAwOyBqIDwgc2tfR0VORVJBTF9OQU1FX251bShpYWx0KTsgaisrKSB7CisJCWdlbiA9IHNrX0dFTkVSQUxfTkFNRV92YWx1ZShpYWx0LCBqKTsKKwkJaWYoIXNrX0dFTkVSQUxfTkFNRV9wdXNoKGdlbnMsIGdlbikpIHsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgY29weV9pc3N1ZXIsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCXNrX0dFTkVSQUxfTkFNRV9mcmVlKGlhbHQpOworCisJcmV0dXJuIDE7CisJCQorCWVycjoKKwlyZXR1cm4gMDsKKwkKK30KKworc3RhdGljIEdFTkVSQUxfTkFNRVMgKnYyaV9zdWJqZWN0X2FsdChYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCQkJCSBYNTA5VjNfQ1RYICpjdHgsIFNUQUNLX09GKENPTkZfVkFMVUUpICpudmFsKQoreworCUdFTkVSQUxfTkFNRVMgKmdlbnMgPSBOVUxMOworCUNPTkZfVkFMVUUgKmNuZjsKKwlzaXplX3QgaTsKKwlpZighKGdlbnMgPSBza19HRU5FUkFMX05BTUVfbmV3X251bGwoKSkpIHsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2Mmlfc3ViamVjdF9hbHQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWZvcihpID0gMDsgaSA8IHNrX0NPTkZfVkFMVUVfbnVtKG52YWwpOyBpKyspIHsKKwkJY25mID0gc2tfQ09ORl9WQUxVRV92YWx1ZShudmFsLCBpKTsKKwkJaWYoIW5hbWVfY21wKGNuZi0+bmFtZSwgImVtYWlsIikgJiYgY25mLT52YWx1ZSAmJgorCQkJCQkJIXN0cmNtcChjbmYtPnZhbHVlLCAiY29weSIpKSB7CisJCQlpZighY29weV9lbWFpbChjdHgsIGdlbnMsIDApKSBnb3RvIGVycjsKKwkJfSBlbHNlIGlmKCFuYW1lX2NtcChjbmYtPm5hbWUsICJlbWFpbCIpICYmIGNuZi0+dmFsdWUgJiYKKwkJCQkJCSFzdHJjbXAoY25mLT52YWx1ZSwgIm1vdmUiKSkgeworCQkJaWYoIWNvcHlfZW1haWwoY3R4LCBnZW5zLCAxKSkgZ290byBlcnI7CisJCX0gZWxzZSB7CisJCQlHRU5FUkFMX05BTUUgKmdlbjsKKwkJCWlmKCEoZ2VuID0gdjJpX0dFTkVSQUxfTkFNRShtZXRob2QsIGN0eCwgY25mKSkpCisJCQkJCQkJCSBnb3RvIGVycjsgCisJCQlza19HRU5FUkFMX05BTUVfcHVzaChnZW5zLCBnZW4pOworCQl9CisJfQorCXJldHVybiBnZW5zOworCWVycjoKKwlza19HRU5FUkFMX05BTUVfcG9wX2ZyZWUoZ2VucywgR0VORVJBTF9OQU1FX2ZyZWUpOworCXJldHVybiBOVUxMOworfQorCisvKiBDb3B5IGFueSBlbWFpbCBhZGRyZXNzZXMgaW4gYSBjZXJ0aWZpY2F0ZSBvciByZXF1ZXN0IHRvIAorICogR0VORVJBTF9OQU1FUworICovCisKK3N0YXRpYyBpbnQgY29weV9lbWFpbChYNTA5VjNfQ1RYICpjdHgsIEdFTkVSQUxfTkFNRVMgKmdlbnMsIGludCBtb3ZlX3ApCit7CisJWDUwOV9OQU1FICpubTsKKwlBU04xX0lBNVNUUklORyAqZW1haWwgPSBOVUxMOworCVg1MDlfTkFNRV9FTlRSWSAqbmU7CisJR0VORVJBTF9OQU1FICpnZW4gPSBOVUxMOworCWludCBpOworCWlmKGN0eCAhPSBOVUxMICYmIGN0eC0+ZmxhZ3MgPT0gQ1RYX1RFU1QpCisJCXJldHVybiAxOworCWlmKCFjdHggfHwgKCFjdHgtPnN1YmplY3RfY2VydCAmJiAhY3R4LT5zdWJqZWN0X3JlcSkpIHsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBjb3B5X2VtYWlsLCBYNTA5VjNfUl9OT19TVUJKRUNUX0RFVEFJTFMpOworCQlnb3RvIGVycjsKKwl9CisJLyogRmluZCB0aGUgc3ViamVjdCBuYW1lICovCisJaWYoY3R4LT5zdWJqZWN0X2NlcnQpIG5tID0gWDUwOV9nZXRfc3ViamVjdF9uYW1lKGN0eC0+c3ViamVjdF9jZXJ0KTsKKwllbHNlIG5tID0gWDUwOV9SRVFfZ2V0X3N1YmplY3RfbmFtZShjdHgtPnN1YmplY3RfcmVxKTsKKworCS8qIE5vdyBhZGQgYW55IGVtYWlsIGFkZHJlc3MoZXMpIHRvIFNUQUNLICovCisJaSA9IC0xOworCXdoaWxlKChpID0gWDUwOV9OQU1FX2dldF9pbmRleF9ieV9OSUQobm0sCisJCQkJCSBOSURfcGtjczlfZW1haWxBZGRyZXNzLCBpKSkgPj0gMCkgeworCQluZSA9IFg1MDlfTkFNRV9nZXRfZW50cnkobm0sIGkpOworCQllbWFpbCA9IE1fQVNOMV9JQTVTVFJJTkdfZHVwKFg1MDlfTkFNRV9FTlRSWV9nZXRfZGF0YShuZSkpOworICAgICAgICAgICAgICAgIGlmIChtb3ZlX3ApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBYNTA5X05BTUVfZGVsZXRlX2VudHJ5KG5tLCBpKTsKKwkJCVg1MDlfTkFNRV9FTlRSWV9mcmVlKG5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGktLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJaWYoIWVtYWlsIHx8ICEoZ2VuID0gR0VORVJBTF9OQU1FX25ldygpKSkgeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBjb3B5X2VtYWlsLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlnb3RvIGVycjsKKwkJfQorCQlnZW4tPmQuaWE1ID0gZW1haWw7CisJCWVtYWlsID0gTlVMTDsKKwkJZ2VuLT50eXBlID0gR0VOX0VNQUlMOworCQlpZighc2tfR0VORVJBTF9OQU1FX3B1c2goZ2VucywgZ2VuKSkgeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBjb3B5X2VtYWlsLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlnb3RvIGVycjsKKwkJfQorCQlnZW4gPSBOVUxMOworCX0KKworCQorCXJldHVybiAxOworCQkKKwllcnI6CisJR0VORVJBTF9OQU1FX2ZyZWUoZ2VuKTsKKwlNX0FTTjFfSUE1U1RSSU5HX2ZyZWUoZW1haWwpOworCXJldHVybiAwOworCQorfQorCitHRU5FUkFMX05BTUVTICp2MmlfR0VORVJBTF9OQU1FUyhjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCQkJCSBYNTA5VjNfQ1RYICpjdHgsIFNUQUNLX09GKENPTkZfVkFMVUUpICpudmFsKQoreworCUdFTkVSQUxfTkFNRSAqZ2VuOworCUdFTkVSQUxfTkFNRVMgKmdlbnMgPSBOVUxMOworCUNPTkZfVkFMVUUgKmNuZjsKKwlzaXplX3QgaTsKKwlpZighKGdlbnMgPSBza19HRU5FUkFMX05BTUVfbmV3X251bGwoKSkpIHsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2MmlfR0VORVJBTF9OQU1FUywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJZm9yKGkgPSAwOyBpIDwgc2tfQ09ORl9WQUxVRV9udW0obnZhbCk7IGkrKykgeworCQljbmYgPSBza19DT05GX1ZBTFVFX3ZhbHVlKG52YWwsIGkpOworCQlpZighKGdlbiA9IHYyaV9HRU5FUkFMX05BTUUobWV0aG9kLCBjdHgsIGNuZikpKSBnb3RvIGVycjsgCisJCXNrX0dFTkVSQUxfTkFNRV9wdXNoKGdlbnMsIGdlbik7CisJfQorCXJldHVybiBnZW5zOworCWVycjoKKwlza19HRU5FUkFMX05BTUVfcG9wX2ZyZWUoZ2VucywgR0VORVJBTF9OQU1FX2ZyZWUpOworCXJldHVybiBOVUxMOworfQorCitHRU5FUkFMX05BTUUgKnYyaV9HRU5FUkFMX05BTUUoY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgWDUwOVYzX0NUWCAqY3R4LAorCQkJICAgICAgIENPTkZfVkFMVUUgKmNuZikKKwl7CisJcmV0dXJuIHYyaV9HRU5FUkFMX05BTUVfZXgoTlVMTCwgbWV0aG9kLCBjdHgsIGNuZiwgMCk7CisJfQorCitHRU5FUkFMX05BTUUgKmEyaV9HRU5FUkFMX05BTUUoR0VORVJBTF9OQU1FICpvdXQsCisJCQkgICAgICAgY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgWDUwOVYzX0NUWCAqY3R4LAorCQkJICAgICAgIGludCBnZW5fdHlwZSwgY2hhciAqdmFsdWUsIGludCBpc19uYykKKwl7CisJY2hhciBpc19zdHJpbmcgPSAwOworCUdFTkVSQUxfTkFNRSAqZ2VuID0gTlVMTDsKKworCWlmKCF2YWx1ZSkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIGEyaV9HRU5FUkFMX05BTUUsIFg1MDlWM19SX01JU1NJTkdfVkFMVUUpOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJaWYgKG91dCkKKwkJZ2VuID0gb3V0OworCWVsc2UKKwkJeworCQlnZW4gPSBHRU5FUkFMX05BTUVfbmV3KCk7CisJCWlmKGdlbiA9PSBOVUxMKQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBhMmlfR0VORVJBTF9OQU1FLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCisJc3dpdGNoIChnZW5fdHlwZSkKKwkJeworCQljYXNlIEdFTl9VUkk6CisJCWNhc2UgR0VOX0VNQUlMOgorCQljYXNlIEdFTl9ETlM6CisJCWlzX3N0cmluZyA9IDE7CisJCWJyZWFrOworCQkKKwkJY2FzZSBHRU5fUklEOgorCQl7CisJCUFTTjFfT0JKRUNUICpvYmo7CisJCWlmKCEob2JqID0gT0JKX3R4dDJvYmoodmFsdWUsMCkpKQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBhMmlfR0VORVJBTF9OQU1FLCBYNTA5VjNfUl9CQURfT0JKRUNUKTsKKwkJCUVSUl9hZGRfZXJyb3JfZGF0YSgyLCAidmFsdWU9IiwgdmFsdWUpOworCQkJZ290byBlcnI7CisJCQl9CisJCWdlbi0+ZC5yaWQgPSBvYmo7CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBHRU5fSVBBREQ6CisJCWlmIChpc19uYykKKwkJCWdlbi0+ZC5pcCA9IGEyaV9JUEFERFJFU1NfTkModmFsdWUpOworCQllbHNlCisJCQlnZW4tPmQuaXAgPSBhMmlfSVBBRERSRVNTKHZhbHVlKTsKKwkJaWYoZ2VuLT5kLmlwID09IE5VTEwpCisJCQl7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIGEyaV9HRU5FUkFMX05BTUUsIFg1MDlWM19SX0JBRF9JUF9BRERSRVNTKTsKKwkJCUVSUl9hZGRfZXJyb3JfZGF0YSgyLCAidmFsdWU9IiwgdmFsdWUpOworCQkJZ290byBlcnI7CisJCQl9CisJCWJyZWFrOworCisJCWNhc2UgR0VOX0RJUk5BTUU6CisJCWlmICghZG9fZGlybmFtZShnZW4sIHZhbHVlLCBjdHgpKQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBhMmlfR0VORVJBTF9OQU1FLCBYNTA5VjNfUl9ESVJOQU1FX0VSUk9SKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlicmVhazsKKworCQljYXNlIEdFTl9PVEhFUk5BTUU6CisJCWlmICghZG9fb3RoZXJuYW1lKGdlbiwgdmFsdWUsIGN0eCkpCisJCQl7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIGEyaV9HRU5FUkFMX05BTUUsIFg1MDlWM19SX09USEVSTkFNRV9FUlJPUik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgYTJpX0dFTkVSQUxfTkFNRSwgWDUwOVYzX1JfVU5TVVBQT1JURURfVFlQRSk7CisJCWdvdG8gZXJyOworCQl9CisKKwlpZihpc19zdHJpbmcpCisJCXsKKwkJaWYoIShnZW4tPmQuaWE1ID0gTV9BU04xX0lBNVNUUklOR19uZXcoKSkgfHwKKwkJCSAgICAgICFBU04xX1NUUklOR19zZXQoZ2VuLT5kLmlhNSwgKHVuc2lnbmVkIGNoYXIqKXZhbHVlLAorCQkJCQkgICAgICAgc3RybGVuKHZhbHVlKSkpCisJCQl7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIGEyaV9HRU5FUkFMX05BTUUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQl9CisKKwlnZW4tPnR5cGUgPSBnZW5fdHlwZTsKKworCXJldHVybiBnZW47CisKKwllcnI6CisJaWYgKCFvdXQpCisJCUdFTkVSQUxfTkFNRV9mcmVlKGdlbik7CisJcmV0dXJuIE5VTEw7CisJfQorCitHRU5FUkFMX05BTUUgKnYyaV9HRU5FUkFMX05BTUVfZXgoR0VORVJBTF9OQU1FICpvdXQsCisJCQkJICBjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCQkJCSAgWDUwOVYzX0NUWCAqY3R4LCBDT05GX1ZBTFVFICpjbmYsIGludCBpc19uYykKKwl7CisJaW50IHR5cGU7CisKKwljaGFyICpuYW1lLCAqdmFsdWU7CisKKwluYW1lID0gY25mLT5uYW1lOworCXZhbHVlID0gY25mLT52YWx1ZTsKKworCWlmKCF2YWx1ZSkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9HRU5FUkFMX05BTUVfZXgsIFg1MDlWM19SX01JU1NJTkdfVkFMVUUpOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJaWYoIW5hbWVfY21wKG5hbWUsICJlbWFpbCIpKQorCQl0eXBlID0gR0VOX0VNQUlMOworCWVsc2UgaWYoIW5hbWVfY21wKG5hbWUsICJVUkkiKSkKKwkJdHlwZSA9IEdFTl9VUkk7CisJZWxzZSBpZighbmFtZV9jbXAobmFtZSwgIkROUyIpKQorCQl0eXBlID0gR0VOX0ROUzsKKwllbHNlIGlmKCFuYW1lX2NtcChuYW1lLCAiUklEIikpCisJCXR5cGUgPSBHRU5fUklEOworCWVsc2UgaWYoIW5hbWVfY21wKG5hbWUsICJJUCIpKQorCQl0eXBlID0gR0VOX0lQQUREOworCWVsc2UgaWYoIW5hbWVfY21wKG5hbWUsICJkaXJOYW1lIikpCisJCXR5cGUgPSBHRU5fRElSTkFNRTsKKwllbHNlIGlmKCFuYW1lX2NtcChuYW1lLCAib3RoZXJOYW1lIikpCisJCXR5cGUgPSBHRU5fT1RIRVJOQU1FOworCWVsc2UKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9HRU5FUkFMX05BTUVfZXgsIFg1MDlWM19SX1VOU1VQUE9SVEVEX09QVElPTik7CisJCUVSUl9hZGRfZXJyb3JfZGF0YSgyLCAibmFtZT0iLCBuYW1lKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKworCXJldHVybiBhMmlfR0VORVJBTF9OQU1FKG91dCwgbWV0aG9kLCBjdHgsIHR5cGUsIHZhbHVlLCBpc19uYyk7CisKKwl9CisKK3N0YXRpYyBpbnQgZG9fb3RoZXJuYW1lKEdFTkVSQUxfTkFNRSAqZ2VuLCBjaGFyICp2YWx1ZSwgWDUwOVYzX0NUWCAqY3R4KQorCXsKKwljaGFyICpvYmp0bXAgPSBOVUxMLCAqcDsKKwlpbnQgb2JqbGVuOworCWlmICghKHAgPSBzdHJjaHIodmFsdWUsICc7JykpKQorCQlyZXR1cm4gMDsKKwlpZiAoIShnZW4tPmQub3RoZXJOYW1lID0gT1RIRVJOQU1FX25ldygpKSkKKwkJcmV0dXJuIDA7CisJLyogRnJlZSB0aGlzIHVwIGJlY2F1c2Ugd2Ugd2lsbCBvdmVyd3JpdGUgaXQuCisJICogbm8gbmVlZCB0byBmcmVlIHR5cGVfaWQgYmVjYXVzZSBpdCBpcyBzdGF0aWMKKwkgKi8KKwlBU04xX1RZUEVfZnJlZShnZW4tPmQub3RoZXJOYW1lLT52YWx1ZSk7CisJaWYgKCEoZ2VuLT5kLm90aGVyTmFtZS0+dmFsdWUgPSBBU04xX2dlbmVyYXRlX3YzKHAgKyAxLCBjdHgpKSkKKwkJcmV0dXJuIDA7CisJb2JqbGVuID0gcCAtIHZhbHVlOworCW9ianRtcCA9IE9QRU5TU0xfbWFsbG9jKG9iamxlbiArIDEpOworCXN0cm5jcHkob2JqdG1wLCB2YWx1ZSwgb2JqbGVuKTsKKwlvYmp0bXBbb2JqbGVuXSA9IDA7CisJZ2VuLT5kLm90aGVyTmFtZS0+dHlwZV9pZCA9IE9CSl90eHQyb2JqKG9ianRtcCwgMCk7CisJT1BFTlNTTF9mcmVlKG9ianRtcCk7CQorCWlmICghZ2VuLT5kLm90aGVyTmFtZS0+dHlwZV9pZCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IGRvX2Rpcm5hbWUoR0VORVJBTF9OQU1FICpnZW4sIGNoYXIgKnZhbHVlLCBYNTA5VjNfQ1RYICpjdHgpCisJeworCWludCByZXQ7CisJU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKnNrOworCVg1MDlfTkFNRSAqbm07CisJaWYgKCEobm0gPSBYNTA5X05BTUVfbmV3KCkpKQorCQlyZXR1cm4gMDsKKwlzayA9IFg1MDlWM19nZXRfc2VjdGlvbihjdHgsIHZhbHVlKTsKKwlpZiAoIXNrKQorCQl7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgZG9fZGlybmFtZSwgWDUwOVYzX1JfU0VDVElPTl9OT1RfRk9VTkQpOworCQlFUlJfYWRkX2Vycm9yX2RhdGEoMiwgInNlY3Rpb249IiwgdmFsdWUpOworCQlYNTA5X05BTUVfZnJlZShubSk7CisJCXJldHVybiAwOworCQl9CisJLyogRklYTUU6IHNob3VsZCBhbGxvdyBvdGhlciBjaGFyYWN0ZXIgdHlwZXMuLi4gKi8KKwlyZXQgPSBYNTA5VjNfTkFNRV9mcm9tX3NlY3Rpb24obm0sIHNrLCBNQlNUUklOR19BU0MpOworCWlmICghcmV0KQorCQlYNTA5X05BTUVfZnJlZShubSk7CisJZ2VuLT5kLmRpcm4gPSBubTsKKwlYNTA5VjNfc2VjdGlvbl9mcmVlKGN0eCwgc2spOworCQkKKwlyZXR1cm4gcmV0OworCX0KZGlmZiAtLWdpdCBhL2NyeXB0by94NTA5djMvdjNfYmNvbnMuYyBiL2NyeXB0by94NTA5djMvdjNfYmNvbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODFiOTIyCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3g1MDl2My92M19iY29ucy5jCkBAIC0wLDAgKzEsMTI1IEBACisvKiB2M19iY29ucy5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY29uZi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorCisKK3N0YXRpYyBTVEFDS19PRihDT05GX1ZBTFVFKSAqaTJ2X0JBU0lDX0NPTlNUUkFJTlRTKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIEJBU0lDX0NPTlNUUkFJTlRTICpiY29ucywgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKmV4dGxpc3QpOworc3RhdGljIEJBU0lDX0NPTlNUUkFJTlRTICp2MmlfQkFTSUNfQ09OU1RSQUlOVFMoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgWDUwOVYzX0NUWCAqY3R4LCBTVEFDS19PRihDT05GX1ZBTFVFKSAqdmFsdWVzKTsKKworY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgdjNfYmNvbnMgPSB7CitOSURfYmFzaWNfY29uc3RyYWludHMsIDAsCitBU04xX0lURU1fcmVmKEJBU0lDX0NPTlNUUkFJTlRTKSwKKzAsMCwwLDAsCiswLDAsCisoWDUwOVYzX0VYVF9JMlYpaTJ2X0JBU0lDX0NPTlNUUkFJTlRTLAorKFg1MDlWM19FWFRfVjJJKXYyaV9CQVNJQ19DT05TVFJBSU5UUywKK05VTEwsTlVMTCwKK05VTEwKK307CisKK0FTTjFfU0VRVUVOQ0UoQkFTSUNfQ09OU1RSQUlOVFMpID0geworCUFTTjFfT1BUKEJBU0lDX0NPTlNUUkFJTlRTLCBjYSwgQVNOMV9GQk9PTEVBTiksCisJQVNOMV9PUFQoQkFTSUNfQ09OU1RSQUlOVFMsIHBhdGhsZW4sIEFTTjFfSU5URUdFUikKK30gQVNOMV9TRVFVRU5DRV9FTkQoQkFTSUNfQ09OU1RSQUlOVFMpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhCQVNJQ19DT05TVFJBSU5UUykKKworCitzdGF0aWMgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKmkydl9CQVNJQ19DT05TVFJBSU5UUyhYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCSAgICAgQkFTSUNfQ09OU1RSQUlOVFMgKmJjb25zLCBTVEFDS19PRihDT05GX1ZBTFVFKSAqZXh0bGlzdCkKK3sKKwlYNTA5VjNfYWRkX3ZhbHVlX2Jvb2woIkNBIiwgYmNvbnMtPmNhLCAmZXh0bGlzdCk7CisJWDUwOVYzX2FkZF92YWx1ZV9pbnQoInBhdGhsZW4iLCBiY29ucy0+cGF0aGxlbiwgJmV4dGxpc3QpOworCXJldHVybiBleHRsaXN0OworfQorCitzdGF0aWMgQkFTSUNfQ09OU1RSQUlOVFMgKnYyaV9CQVNJQ19DT05TVFJBSU5UUyhYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCSAgICAgWDUwOVYzX0NUWCAqY3R4LCBTVEFDS19PRihDT05GX1ZBTFVFKSAqdmFsdWVzKQoreworCUJBU0lDX0NPTlNUUkFJTlRTICpiY29ucz1OVUxMOworCUNPTkZfVkFMVUUgKnZhbDsKKwlzaXplX3QgaTsKKwlpZighKGJjb25zID0gQkFTSUNfQ09OU1RSQUlOVFNfbmV3KCkpKSB7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgdjJpX0JBU0lDX0NPTlNUUkFJTlRTLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiBOVUxMOworCX0KKwlmb3IoaSA9IDA7IGkgPCBza19DT05GX1ZBTFVFX251bSh2YWx1ZXMpOyBpKyspIHsKKwkJdmFsID0gc2tfQ09ORl9WQUxVRV92YWx1ZSh2YWx1ZXMsIGkpOworCQlpZighc3RyY21wKHZhbC0+bmFtZSwgIkNBIikpIHsKKwkJCWlmKCFYNTA5VjNfZ2V0X3ZhbHVlX2Jvb2wodmFsLCAmYmNvbnMtPmNhKSkgZ290byBlcnI7CisJCX0gZWxzZSBpZighc3RyY21wKHZhbC0+bmFtZSwgInBhdGhsZW4iKSkgeworCQkJaWYoIVg1MDlWM19nZXRfdmFsdWVfaW50KHZhbCwgJmJjb25zLT5wYXRobGVuKSkgZ290byBlcnI7CisJCX0gZWxzZSB7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9CQVNJQ19DT05TVFJBSU5UUywgWDUwOVYzX1JfSU5WQUxJRF9OQU1FKTsKKwkJCVg1MDlWM19jb25mX2Vycih2YWwpOworCQkJZ290byBlcnI7CisJCX0KKwl9CisJcmV0dXJuIGJjb25zOworCWVycjoKKwlCQVNJQ19DT05TVFJBSU5UU19mcmVlKGJjb25zKTsKKwlyZXR1cm4gTlVMTDsKK30KKwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3g1MDl2My92M19iaXRzdC5jIGIvY3J5cHRvL3g1MDl2My92M19iaXRzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMzg5ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOXYzL3YzX2JpdHN0LmMKQEAgLTAsMCArMSwxNDAgQEAKKy8qIHYzX2JpdHN0LmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAxOTk5LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9jb25mLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisKKworc3RhdGljIEJJVF9TVFJJTkdfQklUTkFNRSBuc19jZXJ0X3R5cGVfdGFibGVbXSA9IHsKK3swLCAiU1NMIENsaWVudCIsICJjbGllbnQifSwKK3sxLCAiU1NMIFNlcnZlciIsICJzZXJ2ZXIifSwKK3syLCAiUy9NSU1FIiwgImVtYWlsIn0sCit7MywgIk9iamVjdCBTaWduaW5nIiwgIm9ianNpZ24ifSwKK3s0LCAiVW51c2VkIiwgInJlc2VydmVkIn0sCit7NSwgIlNTTCBDQSIsICJzc2xDQSJ9LAorezYsICJTL01JTUUgQ0EiLCAiZW1haWxDQSJ9LAorezcsICJPYmplY3QgU2lnbmluZyBDQSIsICJvYmpDQSJ9LAorey0xLCBOVUxMLCBOVUxMfQorfTsKKworc3RhdGljIEJJVF9TVFJJTkdfQklUTkFNRSBrZXlfdXNhZ2VfdHlwZV90YWJsZVtdID0geworezAsICJEaWdpdGFsIFNpZ25hdHVyZSIsICJkaWdpdGFsU2lnbmF0dXJlIn0sCit7MSwgIk5vbiBSZXB1ZGlhdGlvbiIsICJub25SZXB1ZGlhdGlvbiJ9LAorezIsICJLZXkgRW5jaXBoZXJtZW50IiwgImtleUVuY2lwaGVybWVudCJ9LAorezMsICJEYXRhIEVuY2lwaGVybWVudCIsICJkYXRhRW5jaXBoZXJtZW50In0sCit7NCwgIktleSBBZ3JlZW1lbnQiLCAia2V5QWdyZWVtZW50In0sCit7NSwgIkNlcnRpZmljYXRlIFNpZ24iLCAia2V5Q2VydFNpZ24ifSwKK3s2LCAiQ1JMIFNpZ24iLCAiY1JMU2lnbiJ9LAorezcsICJFbmNpcGhlciBPbmx5IiwgImVuY2lwaGVyT25seSJ9LAorezgsICJEZWNpcGhlciBPbmx5IiwgImRlY2lwaGVyT25seSJ9LAorey0xLCBOVUxMLCBOVUxMfQorfTsKKworCisKK2NvbnN0IFg1MDlWM19FWFRfTUVUSE9EIHYzX25zY2VydCA9IEVYVF9CSVRTVFJJTkcoTklEX25ldHNjYXBlX2NlcnRfdHlwZSwgbnNfY2VydF90eXBlX3RhYmxlKTsKK2NvbnN0IFg1MDlWM19FWFRfTUVUSE9EIHYzX2tleV91c2FnZSA9IEVYVF9CSVRTVFJJTkcoTklEX2tleV91c2FnZSwga2V5X3VzYWdlX3R5cGVfdGFibGUpOworCitTVEFDS19PRihDT05GX1ZBTFVFKSAqaTJ2X0FTTjFfQklUX1NUUklORyhYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCSAgICAgQVNOMV9CSVRfU1RSSU5HICpiaXRzLCBTVEFDS19PRihDT05GX1ZBTFVFKSAqcmV0KQoreworCUJJVF9TVFJJTkdfQklUTkFNRSAqYm5hbTsKKwlmb3IoYm5hbSA9bWV0aG9kLT51c3JfZGF0YTsgYm5hbS0+bG5hbWU7IGJuYW0rKykgeworCQlpZihBU04xX0JJVF9TVFJJTkdfZ2V0X2JpdChiaXRzLCBibmFtLT5iaXRudW0pKSAKKwkJCVg1MDlWM19hZGRfdmFsdWUoYm5hbS0+bG5hbWUsIE5VTEwsICZyZXQpOworCX0KKwlyZXR1cm4gcmV0OworfQorCQorQVNOMV9CSVRfU1RSSU5HICp2MmlfQVNOMV9CSVRfU1RSSU5HKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCisJICAgICBYNTA5VjNfQ1RYICpjdHgsIFNUQUNLX09GKENPTkZfVkFMVUUpICpudmFsKQoreworCUNPTkZfVkFMVUUgKnZhbDsKKwlBU04xX0JJVF9TVFJJTkcgKmJzOworCXNpemVfdCBpOworCUJJVF9TVFJJTkdfQklUTkFNRSAqYm5hbTsKKwlpZighKGJzID0gTV9BU04xX0JJVF9TVFJJTkdfbmV3KCkpKSB7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgdjJpX0FTTjFfQklUX1NUUklORywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJZm9yKGkgPSAwOyBpIDwgc2tfQ09ORl9WQUxVRV9udW0obnZhbCk7IGkrKykgeworCQl2YWwgPSBza19DT05GX1ZBTFVFX3ZhbHVlKG52YWwsIGkpOworCQlmb3IoYm5hbSA9IG1ldGhvZC0+dXNyX2RhdGE7IGJuYW0tPmxuYW1lOyBibmFtKyspIHsKKwkJCWlmKCFzdHJjbXAoYm5hbS0+c25hbWUsIHZhbC0+bmFtZSkgfHwKKwkJCQkhc3RyY21wKGJuYW0tPmxuYW1lLCB2YWwtPm5hbWUpICkgeworCQkJCWlmKCFBU04xX0JJVF9TVFJJTkdfc2V0X2JpdChicywgYm5hbS0+Yml0bnVtLCAxKSkgeworCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9BU04xX0JJVF9TVFJJTkcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQkJTV9BU04xX0JJVF9TVFJJTkdfZnJlZShicyk7CisJCQkJCXJldHVybiBOVUxMOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZighYm5hbS0+bG5hbWUpIHsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgdjJpX0FTTjFfQklUX1NUUklORywgWDUwOVYzX1JfVU5LTk9XTl9CSVRfU1RSSU5HX0FSR1VNRU5UKTsKKwkJCVg1MDlWM19jb25mX2Vycih2YWwpOworCQkJTV9BU04xX0JJVF9TVFJJTkdfZnJlZShicyk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKwlyZXR1cm4gYnM7Cit9CisJCisKZGlmZiAtLWdpdCBhL2NyeXB0by94NTA5djMvdjNfY29uZi5jIGIvY3J5cHRvL3g1MDl2My92M19jb25mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVlNDgwOQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94NTA5djMvdjNfY29uZi5jCkBAIC0wLDAgKzEsNTI4IEBACisvKiB2M19jb25mLmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAxOTk5LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDIgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4gKi8KKworLyogZXh0ZW5zaW9uIGNyZWF0aW9uIHV0aWxpdGllcyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9jb25mLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworCitzdGF0aWMgaW50IHYzX2NoZWNrX2NyaXRpY2FsKGNoYXIgKip2YWx1ZSk7CitzdGF0aWMgaW50IHYzX2NoZWNrX2dlbmVyaWMoY2hhciAqKnZhbHVlKTsKK3N0YXRpYyBYNTA5X0VYVEVOU0lPTiAqZG9fZXh0X25jb25mKENPTkYgKmNvbmYsIFg1MDlWM19DVFggKmN0eCwgaW50IGV4dF9uaWQsIGludCBjcml0LCBjaGFyICp2YWx1ZSk7CitzdGF0aWMgWDUwOV9FWFRFTlNJT04gKnYzX2dlbmVyaWNfZXh0ZW5zaW9uKGNvbnN0IGNoYXIgKmV4dCwgY2hhciAqdmFsdWUsIGludCBjcml0LCBpbnQgdHlwZSwgWDUwOVYzX0NUWCAqY3R4KTsKK3N0YXRpYyBYNTA5X0VYVEVOU0lPTiAqZG9fZXh0X2kyZChjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLCBpbnQgZXh0X25pZCwKKwkJCQkgIGludCBjcml0LCB2b2lkICpleHRfc3RydWMpOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmdlbmVyaWNfYXNuMShjaGFyICp2YWx1ZSwgWDUwOVYzX0NUWCAqY3R4LCBsb25nICpleHRfbGVuKTsKKy8qIENPTkYgKmNvbmY6ICBDb25maWcgZmlsZSAgICAqLworLyogY2hhciAqbmFtZTogIE5hbWUgICAgKi8KKy8qIGNoYXIgKnZhbHVlOiAgVmFsdWUgICAgKi8KK1g1MDlfRVhURU5TSU9OICpYNTA5VjNfRVhUX25jb25mKENPTkYgKmNvbmYsIFg1MDlWM19DVFggKmN0eCwgY2hhciAqbmFtZSwKKwkJCQkgY2hhciAqdmFsdWUpCisJeworCWludCBjcml0OworCWludCBleHRfdHlwZTsKKwlYNTA5X0VYVEVOU0lPTiAqcmV0OworCWNyaXQgPSB2M19jaGVja19jcml0aWNhbCgmdmFsdWUpOworCWlmICgoZXh0X3R5cGUgPSB2M19jaGVja19nZW5lcmljKCZ2YWx1ZSkpKSAKKwkJcmV0dXJuIHYzX2dlbmVyaWNfZXh0ZW5zaW9uKG5hbWUsIHZhbHVlLCBjcml0LCBleHRfdHlwZSwgY3R4KTsKKwlyZXQgPSBkb19leHRfbmNvbmYoY29uZiwgY3R4LCBPQkpfc24ybmlkKG5hbWUpLCBjcml0LCB2YWx1ZSk7CisJaWYgKCFyZXQpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfRVhUX25jb25mLCBYNTA5VjNfUl9FUlJPUl9JTl9FWFRFTlNJT04pOworCQlFUlJfYWRkX2Vycm9yX2RhdGEoNCwibmFtZT0iLCBuYW1lLCAiLCB2YWx1ZT0iLCB2YWx1ZSk7CisJCX0KKwlyZXR1cm4gcmV0OworCX0KKworLyogQ09ORiAqY29uZjogIENvbmZpZyBmaWxlICAgICovCisvKiBjaGFyICp2YWx1ZTogIFZhbHVlICAgICovCitYNTA5X0VYVEVOU0lPTiAqWDUwOVYzX0VYVF9uY29uZl9uaWQoQ09ORiAqY29uZiwgWDUwOVYzX0NUWCAqY3R4LCBpbnQgZXh0X25pZCwKKwkJCQkgICAgIGNoYXIgKnZhbHVlKQorCXsKKwlpbnQgY3JpdDsKKwlpbnQgZXh0X3R5cGU7CisJY3JpdCA9IHYzX2NoZWNrX2NyaXRpY2FsKCZ2YWx1ZSk7CisJaWYgKChleHRfdHlwZSA9IHYzX2NoZWNrX2dlbmVyaWMoJnZhbHVlKSkpIAorCQlyZXR1cm4gdjNfZ2VuZXJpY19leHRlbnNpb24oT0JKX25pZDJzbihleHRfbmlkKSwKKwkJCQkJCSB2YWx1ZSwgY3JpdCwgZXh0X3R5cGUsIGN0eCk7CisJcmV0dXJuIGRvX2V4dF9uY29uZihjb25mLCBjdHgsIGV4dF9uaWQsIGNyaXQsIHZhbHVlKTsKKwl9CisKKy8qIENPTkYgKmNvbmY6ICBDb25maWcgZmlsZSAgICAqLworLyogY2hhciAqdmFsdWU6ICBWYWx1ZSAgICAqLworc3RhdGljIFg1MDlfRVhURU5TSU9OICpkb19leHRfbmNvbmYoQ09ORiAqY29uZiwgWDUwOVYzX0NUWCAqY3R4LCBpbnQgZXh0X25pZCwKKwkJCQkgICAgaW50IGNyaXQsIGNoYXIgKnZhbHVlKQorCXsKKwljb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kOworCVg1MDlfRVhURU5TSU9OICpleHQ7CisJU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKm52YWw7CisJdm9pZCAqZXh0X3N0cnVjOworCWlmIChleHRfbmlkID09IE5JRF91bmRlZikKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIGRvX2V4dF9uY29uZiwgWDUwOVYzX1JfVU5LTk9XTl9FWFRFTlNJT05fTkFNRSk7CisJCXJldHVybiBOVUxMOworCQl9CisJaWYgKCEobWV0aG9kID0gWDUwOVYzX0VYVF9nZXRfbmlkKGV4dF9uaWQpKSkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIGRvX2V4dF9uY29uZiwgWDUwOVYzX1JfVU5LTk9XTl9FWFRFTlNJT04pOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCS8qIE5vdyBnZXQgaW50ZXJuYWwgZXh0ZW5zaW9uIHJlcHJlc2VudGF0aW9uIGJhc2VkIG9uIHR5cGUgKi8KKwlpZiAobWV0aG9kLT52MmkpCisJCXsKKwkJaWYoKnZhbHVlID09ICdAJykgbnZhbCA9IE5DT05GX2dldF9zZWN0aW9uKGNvbmYsIHZhbHVlICsgMSk7CisJCWVsc2UgbnZhbCA9IFg1MDlWM19wYXJzZV9saXN0KHZhbHVlKTsKKwkJaWYoc2tfQ09ORl9WQUxVRV9udW0obnZhbCkgPD0gMCkKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgZG9fZXh0X25jb25mLCBYNTA5VjNfUl9JTlZBTElEX0VYVEVOU0lPTl9TVFJJTkcpOworCQkJRVJSX2FkZF9lcnJvcl9kYXRhKDQsICJuYW1lPSIsIE9CSl9uaWQyc24oZXh0X25pZCksICIsc2VjdGlvbj0iLCB2YWx1ZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJZXh0X3N0cnVjID0gbWV0aG9kLT52MmkobWV0aG9kLCBjdHgsIG52YWwpOworCQlpZigqdmFsdWUgIT0gJ0AnKSBza19DT05GX1ZBTFVFX3BvcF9mcmVlKG52YWwsCisJCQkJCQkJIFg1MDlWM19jb25mX2ZyZWUpOworCQlpZighZXh0X3N0cnVjKSByZXR1cm4gTlVMTDsKKwkJfQorCWVsc2UgaWYobWV0aG9kLT5zMmkpCisJCXsKKwkJaWYoIShleHRfc3RydWMgPSBtZXRob2QtPnMyaShtZXRob2QsIGN0eCwgdmFsdWUpKSkgcmV0dXJuIE5VTEw7CisJCX0KKwllbHNlIGlmKG1ldGhvZC0+cjJpKQorCQl7CisJCWlmKCFjdHgtPmRiIHx8ICFjdHgtPmRiX21ldGgpCisJCQl7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIGRvX2V4dF9uY29uZiwgWDUwOVYzX1JfTk9fQ09ORklHX0RBVEFCQVNFKTsKKwkJCXJldHVybiBOVUxMOworCQkJfQorCQlpZighKGV4dF9zdHJ1YyA9IG1ldGhvZC0+cjJpKG1ldGhvZCwgY3R4LCB2YWx1ZSkpKSByZXR1cm4gTlVMTDsKKwkJfQorCWVsc2UKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIGRvX2V4dF9uY29uZiwgWDUwOVYzX1JfRVhURU5TSU9OX1NFVFRJTkdfTk9UX1NVUFBPUlRFRCk7CisJCUVSUl9hZGRfZXJyb3JfZGF0YSgyLCAibmFtZT0iLCBPQkpfbmlkMnNuKGV4dF9uaWQpKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKworCWV4dCAgPSBkb19leHRfaTJkKG1ldGhvZCwgZXh0X25pZCwgY3JpdCwgZXh0X3N0cnVjKTsKKwlpZihtZXRob2QtPml0KSBBU04xX2l0ZW1fZnJlZShleHRfc3RydWMsIEFTTjFfSVRFTV9wdHIobWV0aG9kLT5pdCkpOworCWVsc2UgbWV0aG9kLT5leHRfZnJlZShleHRfc3RydWMpOworCXJldHVybiBleHQ7CisKKwl9CisKK3N0YXRpYyBYNTA5X0VYVEVOU0lPTiAqZG9fZXh0X2kyZChjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLCBpbnQgZXh0X25pZCwKKwkJCQkgIGludCBjcml0LCB2b2lkICpleHRfc3RydWMpCisJeworCXVuc2lnbmVkIGNoYXIgKmV4dF9kZXI7CisJaW50IGV4dF9sZW47CisJQVNOMV9PQ1RFVF9TVFJJTkcgKmV4dF9vY3Q7CisJWDUwOV9FWFRFTlNJT04gKmV4dDsKKwkvKiBDb252ZXJ0IGludGVybmFsIHJlcHJlc2VudGF0aW9uIHRvIERFUiAqLworCWlmIChtZXRob2QtPml0KQorCQl7CisJCWV4dF9kZXIgPSBOVUxMOworCQlleHRfbGVuID0gQVNOMV9pdGVtX2kyZChleHRfc3RydWMsICZleHRfZGVyLCBBU04xX0lURU1fcHRyKG1ldGhvZC0+aXQpKTsKKwkJaWYgKGV4dF9sZW4gPCAwKSBnb3RvIG1lcnI7CisJCX0KKwkgZWxzZQorCQl7CisJCXVuc2lnbmVkIGNoYXIgKnA7CisJCWV4dF9sZW4gPSBtZXRob2QtPmkyZChleHRfc3RydWMsIE5VTEwpOworCQlpZighKGV4dF9kZXIgPSBPUEVOU1NMX21hbGxvYyhleHRfbGVuKSkpIGdvdG8gbWVycjsKKwkJcCA9IGV4dF9kZXI7CisJCW1ldGhvZC0+aTJkKGV4dF9zdHJ1YywgJnApOworCQl9CisJaWYgKCEoZXh0X29jdCA9IE1fQVNOMV9PQ1RFVF9TVFJJTkdfbmV3KCkpKSBnb3RvIG1lcnI7CisJZXh0X29jdC0+ZGF0YSA9IGV4dF9kZXI7CisJZXh0X29jdC0+bGVuZ3RoID0gZXh0X2xlbjsKKworCWV4dCA9IFg1MDlfRVhURU5TSU9OX2NyZWF0ZV9ieV9OSUQoTlVMTCwgZXh0X25pZCwgY3JpdCwgZXh0X29jdCk7CisJaWYgKCFleHQpIGdvdG8gbWVycjsKKwlNX0FTTjFfT0NURVRfU1RSSU5HX2ZyZWUoZXh0X29jdCk7CisKKwlyZXR1cm4gZXh0OworCisJbWVycjoKKwlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIGRvX2V4dF9pMmQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwlyZXR1cm4gTlVMTDsKKworCX0KKworLyogR2l2ZW4gYW4gaW50ZXJuYWwgc3RydWN0dXJlLCBuaWQgYW5kIGNyaXRpY2FsIGZsYWcgY3JlYXRlIGFuIGV4dGVuc2lvbiAqLworCitYNTA5X0VYVEVOU0lPTiAqWDUwOVYzX0VYVF9pMmQoaW50IGV4dF9uaWQsIGludCBjcml0LCB2b2lkICpleHRfc3RydWMpCisJeworCWNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2Q7CisJaWYgKCEobWV0aG9kID0gWDUwOVYzX0VYVF9nZXRfbmlkKGV4dF9uaWQpKSkgeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19FWFRfaTJkLCBYNTA5VjNfUl9VTktOT1dOX0VYVEVOU0lPTik7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gZG9fZXh0X2kyZChtZXRob2QsIGV4dF9uaWQsIGNyaXQsIGV4dF9zdHJ1Yyk7Cit9CisKKy8qIENoZWNrIHRoZSBleHRlbnNpb24gc3RyaW5nIGZvciBjcml0aWNhbCBmbGFnICovCitzdGF0aWMgaW50IHYzX2NoZWNrX2NyaXRpY2FsKGNoYXIgKip2YWx1ZSkKK3sKKwljaGFyICpwID0gKnZhbHVlOworCWlmICgoc3RybGVuKHApIDwgOSkgfHwgc3RybmNtcChwLCAiY3JpdGljYWwsIiwgOSkpIHJldHVybiAwOworCXArPTk7CisJd2hpbGUoaXNzcGFjZSgodW5zaWduZWQgY2hhcikqcCkpIHArKzsKKwkqdmFsdWUgPSBwOworCXJldHVybiAxOworfQorCisvKiBDaGVjayBleHRlbnNpb24gc3RyaW5nIGZvciBnZW5lcmljIGV4dGVuc2lvbiBhbmQgcmV0dXJuIHRoZSB0eXBlICovCitzdGF0aWMgaW50IHYzX2NoZWNrX2dlbmVyaWMoY2hhciAqKnZhbHVlKQoreworCWludCBnZW5fdHlwZSA9IDA7CisJY2hhciAqcCA9ICp2YWx1ZTsKKwlpZiAoKHN0cmxlbihwKSA+PSA0KSAmJiAhc3RybmNtcChwLCAiREVSOiIsIDQpKQorCQl7CisJCXArPTQ7CisJCWdlbl90eXBlID0gMTsKKwkJfQorCWVsc2UgaWYgKChzdHJsZW4ocCkgPj0gNSkgJiYgIXN0cm5jbXAocCwgIkFTTjE6IiwgNSkpCisJCXsKKwkJcCs9NTsKKwkJZ2VuX3R5cGUgPSAyOworCQl9CisJZWxzZQorCQlyZXR1cm4gMDsKKworCXdoaWxlIChpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpwKSkgcCsrOworCSp2YWx1ZSA9IHA7CisJcmV0dXJuIGdlbl90eXBlOworfQorCisvKiBDcmVhdGUgYSBnZW5lcmljIGV4dGVuc2lvbjogZm9yIG5vdyBqdXN0IGhhbmRsZSBERVIgdHlwZSAqLworc3RhdGljIFg1MDlfRVhURU5TSU9OICp2M19nZW5lcmljX2V4dGVuc2lvbihjb25zdCBjaGFyICpleHQsIGNoYXIgKnZhbHVlLAorCQkJCQkgICAgaW50IGNyaXQsIGludCBnZW5fdHlwZSwKKwkJCQkJICAgIFg1MDlWM19DVFggKmN0eCkKKwl7CisJdW5zaWduZWQgY2hhciAqZXh0X2Rlcj1OVUxMOworCWxvbmcgZXh0X2xlbjsKKwlBU04xX09CSkVDVCAqb2JqPU5VTEw7CisJQVNOMV9PQ1RFVF9TVFJJTkcgKm9jdD1OVUxMOworCVg1MDlfRVhURU5TSU9OICpleHRlbnNpb249TlVMTDsKKwlpZiAoIShvYmogPSBPQkpfdHh0Mm9iaihleHQsIDApKSkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYzX2dlbmVyaWNfZXh0ZW5zaW9uLCBYNTA5VjNfUl9FWFRFTlNJT05fTkFNRV9FUlJPUik7CisJCUVSUl9hZGRfZXJyb3JfZGF0YSgyLCAibmFtZT0iLCBleHQpOworCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKGdlbl90eXBlID09IDEpCisJCWV4dF9kZXIgPSBzdHJpbmdfdG9faGV4KHZhbHVlLCAmZXh0X2xlbik7CisJZWxzZSBpZiAoZ2VuX3R5cGUgPT0gMikKKwkJZXh0X2RlciA9IGdlbmVyaWNfYXNuMSh2YWx1ZSwgY3R4LCAmZXh0X2xlbik7CisKKwlpZiAoZXh0X2RlciA9PSBOVUxMKQorCQl7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgdjNfZ2VuZXJpY19leHRlbnNpb24sIFg1MDlWM19SX0VYVEVOU0lPTl9WQUxVRV9FUlJPUik7CisJCUVSUl9hZGRfZXJyb3JfZGF0YSgyLCAidmFsdWU9IiwgdmFsdWUpOworCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKCEob2N0ID0gTV9BU04xX09DVEVUX1NUUklOR19uZXcoKSkpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2M19nZW5lcmljX2V4dGVuc2lvbiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCisJb2N0LT5kYXRhID0gZXh0X2RlcjsKKwlvY3QtPmxlbmd0aCA9IGV4dF9sZW47CisJZXh0X2RlciA9IE5VTEw7CisKKwlleHRlbnNpb24gPSBYNTA5X0VYVEVOU0lPTl9jcmVhdGVfYnlfT0JKKE5VTEwsIG9iaiwgY3JpdCwgb2N0KTsKKworCWVycjoKKwlBU04xX09CSkVDVF9mcmVlKG9iaik7CisJTV9BU04xX09DVEVUX1NUUklOR19mcmVlKG9jdCk7CisJaWYoZXh0X2RlcikgT1BFTlNTTF9mcmVlKGV4dF9kZXIpOworCXJldHVybiBleHRlbnNpb247CisKKwl9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpnZW5lcmljX2FzbjEoY2hhciAqdmFsdWUsIFg1MDlWM19DVFggKmN0eCwgbG9uZyAqZXh0X2xlbikKKwl7CisJQVNOMV9UWVBFICp0eXA7CisJdW5zaWduZWQgY2hhciAqZXh0X2RlciA9IE5VTEw7CisJdHlwID0gQVNOMV9nZW5lcmF0ZV92Myh2YWx1ZSwgY3R4KTsKKwlpZiAodHlwID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCSpleHRfbGVuID0gaTJkX0FTTjFfVFlQRSh0eXAsICZleHRfZGVyKTsKKwlBU04xX1RZUEVfZnJlZSh0eXApOworCXJldHVybiBleHRfZGVyOworCX0KKworLyogVGhpcyBpcyB0aGUgbWFpbiBmdW5jdGlvbjogYWRkIGEgYnVuY2ggb2YgZXh0ZW5zaW9ucyBiYXNlZCBvbiBhIGNvbmZpZyBmaWxlCisgKiBzZWN0aW9uIHRvIGFuIGV4dGVuc2lvbiBTVEFDSy4KKyAqLworCisKK2ludCBYNTA5VjNfRVhUX2FkZF9uY29uZl9zayhDT05GICpjb25mLCBYNTA5VjNfQ1RYICpjdHgsIGNoYXIgKnNlY3Rpb24sCisJCQkgICAgU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICoqc2spCisJeworCVg1MDlfRVhURU5TSU9OICpleHQ7CisJU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKm52YWw7CisJQ09ORl9WQUxVRSAqdmFsOwkKKwlzaXplX3QgaTsKKwlpZiAoIShudmFsID0gTkNPTkZfZ2V0X3NlY3Rpb24oY29uZiwgc2VjdGlvbikpKSByZXR1cm4gMDsKKwlmb3IgKGkgPSAwOyBpIDwgc2tfQ09ORl9WQUxVRV9udW0obnZhbCk7IGkrKykKKwkJeworCQl2YWwgPSBza19DT05GX1ZBTFVFX3ZhbHVlKG52YWwsIGkpOworCQlpZiAoIShleHQgPSBYNTA5VjNfRVhUX25jb25mKGNvbmYsIGN0eCwgdmFsLT5uYW1lLCB2YWwtPnZhbHVlKSkpCisJCQkJCQkJCXJldHVybiAwOworCQlpZiAoc2spIFg1MDl2M19hZGRfZXh0KHNrLCBleHQsIC0xKTsKKwkJWDUwOV9FWFRFTlNJT05fZnJlZShleHQpOworCQl9CisJcmV0dXJuIDE7CisJfQorCisvKiBDb252ZW5pZW5jZSBmdW5jdGlvbnMgdG8gYWRkIGV4dGVuc2lvbnMgdG8gYSBjZXJ0aWZpY2F0ZSwgQ1JMIGFuZCByZXF1ZXN0ICovCisKK2ludCBYNTA5VjNfRVhUX2FkZF9uY29uZihDT05GICpjb25mLCBYNTA5VjNfQ1RYICpjdHgsIGNoYXIgKnNlY3Rpb24sCisJCQkgWDUwOSAqY2VydCkKKwl7CisJU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICoqc2sgPSBOVUxMOworCWlmIChjZXJ0KQorCQlzayA9ICZjZXJ0LT5jZXJ0X2luZm8tPmV4dGVuc2lvbnM7CisJcmV0dXJuIFg1MDlWM19FWFRfYWRkX25jb25mX3NrKGNvbmYsIGN0eCwgc2VjdGlvbiwgc2spOworCX0KKworLyogU2FtZSBhcyBhYm92ZSBidXQgZm9yIGEgQ1JMICovCisKK2ludCBYNTA5VjNfRVhUX0NSTF9hZGRfbmNvbmYoQ09ORiAqY29uZiwgWDUwOVYzX0NUWCAqY3R4LCBjaGFyICpzZWN0aW9uLAorCQkJICAgICBYNTA5X0NSTCAqY3JsKQorCXsKKwlTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKipzayA9IE5VTEw7CisJaWYgKGNybCkKKwkJc2sgPSAmY3JsLT5jcmwtPmV4dGVuc2lvbnM7CisJcmV0dXJuIFg1MDlWM19FWFRfYWRkX25jb25mX3NrKGNvbmYsIGN0eCwgc2VjdGlvbiwgc2spOworCX0KKworLyogQWRkIGV4dGVuc2lvbnMgdG8gY2VydGlmaWNhdGUgcmVxdWVzdCAqLworCitpbnQgWDUwOVYzX0VYVF9SRVFfYWRkX25jb25mKENPTkYgKmNvbmYsIFg1MDlWM19DVFggKmN0eCwgY2hhciAqc2VjdGlvbiwKKwkgICAgIFg1MDlfUkVRICpyZXEpCisJeworCVNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqZXh0bGlzdCA9IE5VTEwsICoqc2sgPSBOVUxMOworCWludCBpOworCWlmIChyZXEpCisJCXNrID0gJmV4dGxpc3Q7CisJaSA9IFg1MDlWM19FWFRfYWRkX25jb25mX3NrKGNvbmYsIGN0eCwgc2VjdGlvbiwgc2spOworCWlmICghaSB8fCAhc2spCisJCXJldHVybiBpOworCWkgPSBYNTA5X1JFUV9hZGRfZXh0ZW5zaW9ucyhyZXEsIGV4dGxpc3QpOworCXNrX1g1MDlfRVhURU5TSU9OX3BvcF9mcmVlKGV4dGxpc3QsIFg1MDlfRVhURU5TSU9OX2ZyZWUpOworCXJldHVybiBpOworCX0KKworLyogQ29uZmlnIGRhdGFiYXNlIGZ1bmN0aW9ucyAqLworCitjaGFyICogWDUwOVYzX2dldF9zdHJpbmcoWDUwOVYzX0NUWCAqY3R4LCBjaGFyICpuYW1lLCBjaGFyICpzZWN0aW9uKQorCXsKKwlpZighY3R4LT5kYiB8fCAhY3R4LT5kYl9tZXRoIHx8ICFjdHgtPmRiX21ldGgtPmdldF9zdHJpbmcpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfZ2V0X3N0cmluZywgWDUwOVYzX1JfT1BFUkFUSU9OX05PVF9ERUZJTkVEKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKwlpZiAoY3R4LT5kYl9tZXRoLT5nZXRfc3RyaW5nKQorCQkJcmV0dXJuIGN0eC0+ZGJfbWV0aC0+Z2V0X3N0cmluZyhjdHgtPmRiLCBuYW1lLCBzZWN0aW9uKTsKKwlyZXR1cm4gTlVMTDsKKwl9CisKK1NUQUNLX09GKENPTkZfVkFMVUUpICogWDUwOVYzX2dldF9zZWN0aW9uKFg1MDlWM19DVFggKmN0eCwgY2hhciAqc2VjdGlvbikKKwl7CisJaWYoIWN0eC0+ZGIgfHwgIWN0eC0+ZGJfbWV0aCB8fCAhY3R4LT5kYl9tZXRoLT5nZXRfc2VjdGlvbikKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19nZXRfc2VjdGlvbiwgWDUwOVYzX1JfT1BFUkFUSU9OX05PVF9ERUZJTkVEKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKwlpZiAoY3R4LT5kYl9tZXRoLT5nZXRfc2VjdGlvbikKKwkJCXJldHVybiBjdHgtPmRiX21ldGgtPmdldF9zZWN0aW9uKGN0eC0+ZGIsIHNlY3Rpb24pOworCXJldHVybiBOVUxMOworCX0KKwordm9pZCBYNTA5VjNfc3RyaW5nX2ZyZWUoWDUwOVYzX0NUWCAqY3R4LCBjaGFyICpzdHIpCisJeworCWlmICghc3RyKSByZXR1cm47CisJaWYgKGN0eC0+ZGJfbWV0aC0+ZnJlZV9zdHJpbmcpCisJCQljdHgtPmRiX21ldGgtPmZyZWVfc3RyaW5nKGN0eC0+ZGIsIHN0cik7CisJfQorCit2b2lkIFg1MDlWM19zZWN0aW9uX2ZyZWUoWDUwOVYzX0NUWCAqY3R4LCBTVEFDS19PRihDT05GX1ZBTFVFKSAqc2VjdGlvbikKKwl7CisJaWYgKCFzZWN0aW9uKSByZXR1cm47CisJaWYgKGN0eC0+ZGJfbWV0aC0+ZnJlZV9zZWN0aW9uKQorCQkJY3R4LT5kYl9tZXRoLT5mcmVlX3NlY3Rpb24oY3R4LT5kYiwgc2VjdGlvbik7CisJfQorCitzdGF0aWMgY2hhciAqbmNvbmZfZ2V0X3N0cmluZyh2b2lkICpkYiwgY2hhciAqc2VjdGlvbiwgY2hhciAqdmFsdWUpCisJeworICAgICAgICAvKiBUT0RPKGZvcmspOiB0aGlzIHNob3VsZCByZXR1cm4gYSBjb25zdCB2YWx1ZS4gKi8KKwlyZXR1cm4gKGNoYXIgKikgTkNPTkZfZ2V0X3N0cmluZyhkYiwgc2VjdGlvbiwgdmFsdWUpOworCX0KKworc3RhdGljIFNUQUNLX09GKENPTkZfVkFMVUUpICpuY29uZl9nZXRfc2VjdGlvbih2b2lkICpkYiwgY2hhciAqc2VjdGlvbikKKwl7CisJcmV0dXJuIE5DT05GX2dldF9zZWN0aW9uKGRiLCBzZWN0aW9uKTsKKwl9CisKK3N0YXRpYyBYNTA5VjNfQ09ORl9NRVRIT0QgbmNvbmZfbWV0aG9kID0geworbmNvbmZfZ2V0X3N0cmluZywKK25jb25mX2dldF9zZWN0aW9uLAorTlVMTCwKK05VTEwKK307CisKK3ZvaWQgWDUwOVYzX3NldF9uY29uZihYNTA5VjNfQ1RYICpjdHgsIENPTkYgKmNvbmYpCisJeworCWN0eC0+ZGJfbWV0aCA9ICZuY29uZl9tZXRob2Q7CisJY3R4LT5kYiA9IGNvbmY7CisJfQorCit2b2lkIFg1MDlWM19zZXRfY3R4KFg1MDlWM19DVFggKmN0eCwgWDUwOSAqaXNzdWVyLCBYNTA5ICpzdWJqLCBYNTA5X1JFUSAqcmVxLAorCQkgICAgWDUwOV9DUkwgKmNybCwgaW50IGZsYWdzKQorCXsKKwljdHgtPmlzc3Vlcl9jZXJ0ID0gaXNzdWVyOworCWN0eC0+c3ViamVjdF9jZXJ0ID0gc3ViajsKKwljdHgtPmNybCA9IGNybDsKKwljdHgtPnN1YmplY3RfcmVxID0gcmVxOworCWN0eC0+ZmxhZ3MgPSBmbGFnczsKKwl9CisKKy8qIFRPRE8oZm9yayk6IHJlbW92ZSAqLworI2lmIDAKKy8qIE9sZCBjb25mIGNvbXBhdGliaWxpdHkgZnVuY3Rpb25zICovCisKK1g1MDlfRVhURU5TSU9OICpYNTA5VjNfRVhUX2NvbmYoTEhBU0hfT0YoQ09ORl9WQUxVRSkgKmNvbmYsIFg1MDlWM19DVFggKmN0eCwKKwkJCQljaGFyICpuYW1lLCBjaGFyICp2YWx1ZSkKKwl7CisJQ09ORiBjdG1wOworCUNPTkZfc2V0X25jb25mKCZjdG1wLCBjb25mKTsKKwlyZXR1cm4gWDUwOVYzX0VYVF9uY29uZigmY3RtcCwgY3R4LCBuYW1lLCB2YWx1ZSk7CisJfQorCisvKiBMSEFTSCAqY29uZjogIENvbmZpZyBmaWxlICAgICovCisvKiBjaGFyICp2YWx1ZTogIFZhbHVlICAgICovCitYNTA5X0VYVEVOU0lPTiAqWDUwOVYzX0VYVF9jb25mX25pZChMSEFTSF9PRihDT05GX1ZBTFVFKSAqY29uZiwgWDUwOVYzX0NUWCAqY3R4LAorCQkJCSAgICBpbnQgZXh0X25pZCwgY2hhciAqdmFsdWUpCisJeworCUNPTkYgY3RtcDsKKwlDT05GX3NldF9uY29uZigmY3RtcCwgY29uZik7CisJcmV0dXJuIFg1MDlWM19FWFRfbmNvbmZfbmlkKCZjdG1wLCBjdHgsIGV4dF9uaWQsIHZhbHVlKTsKKwl9CisKK3N0YXRpYyBjaGFyICpjb25mX2xoYXNoX2dldF9zdHJpbmcodm9pZCAqZGIsIGNoYXIgKnNlY3Rpb24sIGNoYXIgKnZhbHVlKQorCXsKKwlyZXR1cm4gQ09ORl9nZXRfc3RyaW5nKGRiLCBzZWN0aW9uLCB2YWx1ZSk7CisJfQorCitzdGF0aWMgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKmNvbmZfbGhhc2hfZ2V0X3NlY3Rpb24odm9pZCAqZGIsIGNoYXIgKnNlY3Rpb24pCisJeworCXJldHVybiBDT05GX2dldF9zZWN0aW9uKGRiLCBzZWN0aW9uKTsKKwl9CisKK3N0YXRpYyBYNTA5VjNfQ09ORl9NRVRIT0QgY29uZl9saGFzaF9tZXRob2QgPSB7Citjb25mX2xoYXNoX2dldF9zdHJpbmcsCitjb25mX2xoYXNoX2dldF9zZWN0aW9uLAorTlVMTCwKK05VTEwKK307CisKK3ZvaWQgWDUwOVYzX3NldF9jb25mX2xoYXNoKFg1MDlWM19DVFggKmN0eCwgTEhBU0hfT0YoQ09ORl9WQUxVRSkgKmxoYXNoKQorCXsKKwljdHgtPmRiX21ldGggPSAmY29uZl9saGFzaF9tZXRob2Q7CisJY3R4LT5kYiA9IGxoYXNoOworCX0KKworaW50IFg1MDlWM19FWFRfYWRkX2NvbmYoTEhBU0hfT0YoQ09ORl9WQUxVRSkgKmNvbmYsIFg1MDlWM19DVFggKmN0eCwKKwkJCWNoYXIgKnNlY3Rpb24sIFg1MDkgKmNlcnQpCisJeworCUNPTkYgY3RtcDsKKwlDT05GX3NldF9uY29uZigmY3RtcCwgY29uZik7CisJcmV0dXJuIFg1MDlWM19FWFRfYWRkX25jb25mKCZjdG1wLCBjdHgsIHNlY3Rpb24sIGNlcnQpOworCX0KKworLyogU2FtZSBhcyBhYm92ZSBidXQgZm9yIGEgQ1JMICovCisKK2ludCBYNTA5VjNfRVhUX0NSTF9hZGRfY29uZihMSEFTSF9PRihDT05GX1ZBTFVFKSAqY29uZiwgWDUwOVYzX0NUWCAqY3R4LAorCQkJICAgIGNoYXIgKnNlY3Rpb24sIFg1MDlfQ1JMICpjcmwpCisJeworCUNPTkYgY3RtcDsKKwlDT05GX3NldF9uY29uZigmY3RtcCwgY29uZik7CisJcmV0dXJuIFg1MDlWM19FWFRfQ1JMX2FkZF9uY29uZigmY3RtcCwgY3R4LCBzZWN0aW9uLCBjcmwpOworCX0KKworLyogQWRkIGV4dGVuc2lvbnMgdG8gY2VydGlmaWNhdGUgcmVxdWVzdCAqLworCitpbnQgWDUwOVYzX0VYVF9SRVFfYWRkX2NvbmYoTEhBU0hfT0YoQ09ORl9WQUxVRSkgKmNvbmYsIFg1MDlWM19DVFggKmN0eCwKKwkJCSAgICBjaGFyICpzZWN0aW9uLCBYNTA5X1JFUSAqcmVxKQorCXsKKwlDT05GIGN0bXA7CisJQ09ORl9zZXRfbmNvbmYoJmN0bXAsIGNvbmYpOworCXJldHVybiBYNTA5VjNfRVhUX1JFUV9hZGRfbmNvbmYoJmN0bXAsIGN0eCwgc2VjdGlvbiwgcmVxKTsKKwl9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NyeXB0by94NTA5djMvdjNfY3BvbHMuYyBiL2NyeXB0by94NTA5djMvdjNfY3BvbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2Q2ZmVmCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3g1MDl2My92M19jcG9scy5jCkBAIC0wLDAgKzEsNDYwIEBACisvKiB2M19jcG9scy5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA0IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY29uZi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3RhY2suaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorCisjaW5jbHVkZSAicGN5X2ludC5oIgorCisvKiBDZXJ0aWZpY2F0ZSBwb2xpY2llcyBleHRlbnNpb24gc3VwcG9ydDogdGhpcyBvbmUgaXMgYSBiaXQgY29tcGxleC4uLiAqLworCitzdGF0aWMgaW50IGkycl9jZXJ0cG9sKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIFNUQUNLX09GKFBPTElDWUlORk8pICpwb2wsIEJJTyAqb3V0LCBpbnQgaW5kZW50KTsKK3N0YXRpYyBTVEFDS19PRihQT0xJQ1lJTkZPKSAqcjJpX2NlcnRwb2woWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgWDUwOVYzX0NUWCAqY3R4LCBjaGFyICp2YWx1ZSk7CitzdGF0aWMgdm9pZCBwcmludF9xdWFsaWZpZXJzKEJJTyAqb3V0LCBTVEFDS19PRihQT0xJQ1lRVUFMSU5GTykgKnF1YWxzLCBpbnQgaW5kZW50KTsKK3N0YXRpYyB2b2lkIHByaW50X25vdGljZShCSU8gKm91dCwgVVNFUk5PVElDRSAqbm90aWNlLCBpbnQgaW5kZW50KTsKK3N0YXRpYyBQT0xJQ1lJTkZPICpwb2xpY3lfc2VjdGlvbihYNTA5VjNfQ1RYICpjdHgsCisJCQkJIFNUQUNLX09GKENPTkZfVkFMVUUpICpwb2xzdHJzLCBpbnQgaWE1b3JnKTsKK3N0YXRpYyBQT0xJQ1lRVUFMSU5GTyAqbm90aWNlX3NlY3Rpb24oWDUwOVYzX0NUWCAqY3R4LAorCQkJCQlTVEFDS19PRihDT05GX1ZBTFVFKSAqdW5vdCwgaW50IGlhNW9yZyk7CitzdGF0aWMgaW50IG5yZWZfbm9zKFNUQUNLX09GKEFTTjFfSU5URUdFUikgKm5udW1zLCBTVEFDS19PRihDT05GX1ZBTFVFKSAqbm9zKTsKKworY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgdjNfY3BvbHMgPSB7CitOSURfY2VydGlmaWNhdGVfcG9saWNpZXMsIDAsQVNOMV9JVEVNX3JlZihDRVJUSUZJQ0FURVBPTElDSUVTKSwKKzAsMCwwLDAsCiswLDAsCiswLDAsCisoWDUwOVYzX0VYVF9JMlIpaTJyX2NlcnRwb2wsCisoWDUwOVYzX0VYVF9SMkkpcjJpX2NlcnRwb2wsCitOVUxMCit9OworCitBU04xX0lURU1fVEVNUExBVEUoQ0VSVElGSUNBVEVQT0xJQ0lFUykgPSAKKwlBU04xX0VYX1RFTVBMQVRFX1RZUEUoQVNOMV9URkxHX1NFUVVFTkNFX09GLCAwLCBDRVJUSUZJQ0FURVBPTElDSUVTLCBQT0xJQ1lJTkZPKQorQVNOMV9JVEVNX1RFTVBMQVRFX0VORChDRVJUSUZJQ0FURVBPTElDSUVTKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoQ0VSVElGSUNBVEVQT0xJQ0lFUykKKworQVNOMV9TRVFVRU5DRShQT0xJQ1lJTkZPKSA9IHsKKwlBU04xX1NJTVBMRShQT0xJQ1lJTkZPLCBwb2xpY3lpZCwgQVNOMV9PQkpFQ1QpLAorCUFTTjFfU0VRVUVOQ0VfT0ZfT1BUKFBPTElDWUlORk8sIHF1YWxpZmllcnMsIFBPTElDWVFVQUxJTkZPKQorfSBBU04xX1NFUVVFTkNFX0VORChQT0xJQ1lJTkZPKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoUE9MSUNZSU5GTykKKworQVNOMV9BREJfVEVNUExBVEUocG9saWN5ZGVmYXVsdCkgPSBBU04xX1NJTVBMRShQT0xJQ1lRVUFMSU5GTywgZC5vdGhlciwgQVNOMV9BTlkpOworCitBU04xX0FEQihQT0xJQ1lRVUFMSU5GTykgPSB7CisJQURCX0VOVFJZKE5JRF9pZF9xdF9jcHMsIEFTTjFfU0lNUExFKFBPTElDWVFVQUxJTkZPLCBkLmNwc3VyaSwgQVNOMV9JQTVTVFJJTkcpKSwKKwlBREJfRU5UUlkoTklEX2lkX3F0X3Vub3RpY2UsIEFTTjFfU0lNUExFKFBPTElDWVFVQUxJTkZPLCBkLnVzZXJub3RpY2UsIFVTRVJOT1RJQ0UpKQorfSBBU04xX0FEQl9FTkQoUE9MSUNZUVVBTElORk8sIDAsIHBxdWFsaWQsIDAsICZwb2xpY3lkZWZhdWx0X3R0LCBOVUxMKTsKKworQVNOMV9TRVFVRU5DRShQT0xJQ1lRVUFMSU5GTykgPSB7CisJQVNOMV9TSU1QTEUoUE9MSUNZUVVBTElORk8sIHBxdWFsaWQsIEFTTjFfT0JKRUNUKSwKKwlBU04xX0FEQl9PQkpFQ1QoUE9MSUNZUVVBTElORk8pCit9IEFTTjFfU0VRVUVOQ0VfRU5EKFBPTElDWVFVQUxJTkZPKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoUE9MSUNZUVVBTElORk8pCisKK0FTTjFfU0VRVUVOQ0UoVVNFUk5PVElDRSkgPSB7CisJQVNOMV9PUFQoVVNFUk5PVElDRSwgbm90aWNlcmVmLCBOT1RJQ0VSRUYpLAorCUFTTjFfT1BUKFVTRVJOT1RJQ0UsIGV4cHRleHQsIERJU1BMQVlURVhUKQorfSBBU04xX1NFUVVFTkNFX0VORChVU0VSTk9USUNFKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoVVNFUk5PVElDRSkKKworQVNOMV9TRVFVRU5DRShOT1RJQ0VSRUYpID0geworCUFTTjFfU0lNUExFKE5PVElDRVJFRiwgb3JnYW5pemF0aW9uLCBESVNQTEFZVEVYVCksCisJQVNOMV9TRVFVRU5DRV9PRihOT1RJQ0VSRUYsIG5vdGljZW5vcywgQVNOMV9JTlRFR0VSKQorfSBBU04xX1NFUVVFTkNFX0VORChOT1RJQ0VSRUYpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhOT1RJQ0VSRUYpCisKK3N0YXRpYyBTVEFDS19PRihQT0xJQ1lJTkZPKSAqcjJpX2NlcnRwb2woWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwKKwkJWDUwOVYzX0NUWCAqY3R4LCBjaGFyICp2YWx1ZSkKK3sKKwlTVEFDS19PRihQT0xJQ1lJTkZPKSAqcG9scyA9IE5VTEw7CisJY2hhciAqcHN0cjsKKwlQT0xJQ1lJTkZPICpwb2w7CisJQVNOMV9PQkpFQ1QgKnBvYmo7CisJU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKnZhbHM7CisJQ09ORl9WQUxVRSAqY25mOworCXNpemVfdCBpOworCWludCBpYTVvcmc7CisJcG9scyA9IHNrX1BPTElDWUlORk9fbmV3X251bGwoKTsKKwlpZiAocG9scyA9PSBOVUxMKSB7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcjJpX2NlcnRwb2wsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXZhbHMgPSAgWDUwOVYzX3BhcnNlX2xpc3QodmFsdWUpOworCWlmICh2YWxzID09IE5VTEwpIHsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCByMmlfY2VydHBvbCwgRVJSX1JfWDUwOVYzX0xJQik7CisJCWdvdG8gZXJyOworCX0KKwlpYTVvcmcgPSAwOworCWZvcihpID0gMDsgaSA8IHNrX0NPTkZfVkFMVUVfbnVtKHZhbHMpOyBpKyspIHsKKwkJY25mID0gc2tfQ09ORl9WQUxVRV92YWx1ZSh2YWxzLCBpKTsKKwkJaWYoY25mLT52YWx1ZSB8fCAhY25mLT5uYW1lICkgeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCByMmlfY2VydHBvbCwgWDUwOVYzX1JfSU5WQUxJRF9QT0xJQ1lfSURFTlRJRklFUik7CisJCQlYNTA5VjNfY29uZl9lcnIoY25mKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCXBzdHIgPSBjbmYtPm5hbWU7CisJCWlmKCFzdHJjbXAocHN0ciwiaWE1b3JnIikpIHsKKwkJCWlhNW9yZyA9IDE7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmKCpwc3RyID09ICdAJykgeworCQkJU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKnBvbHNlY3Q7CisJCQlwb2xzZWN0ID0gWDUwOVYzX2dldF9zZWN0aW9uKGN0eCwgcHN0ciArIDEpOworCQkJaWYoIXBvbHNlY3QpIHsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHIyaV9jZXJ0cG9sLCBYNTA5VjNfUl9JTlZBTElEX1NFQ1RJT04pOworCisJCQkJWDUwOVYzX2NvbmZfZXJyKGNuZik7CisJCQkJZ290byBlcnI7CisJCQl9CisJCQlwb2wgPSBwb2xpY3lfc2VjdGlvbihjdHgsIHBvbHNlY3QsIGlhNW9yZyk7CisJCQlYNTA5VjNfc2VjdGlvbl9mcmVlKGN0eCwgcG9sc2VjdCk7CisJCQlpZighcG9sKSBnb3RvIGVycjsKKwkJfSBlbHNlIHsKKwkJCWlmKCEocG9iaiA9IE9CSl90eHQyb2JqKGNuZi0+bmFtZSwgMCkpKSB7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCByMmlfY2VydHBvbCwgWDUwOVYzX1JfSU5WQUxJRF9PQkpFQ1RfSURFTlRJRklFUik7CisJCQkJWDUwOVYzX2NvbmZfZXJyKGNuZik7CisJCQkJZ290byBlcnI7CisJCQl9CisJCQlwb2wgPSBQT0xJQ1lJTkZPX25ldygpOworCQkJcG9sLT5wb2xpY3lpZCA9IHBvYmo7CisJCX0KKwkJaWYgKCFza19QT0xJQ1lJTkZPX3B1c2gocG9scywgcG9sKSl7CisJCQlQT0xJQ1lJTkZPX2ZyZWUocG9sKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcjJpX2NlcnRwb2wsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCXNrX0NPTkZfVkFMVUVfcG9wX2ZyZWUodmFscywgWDUwOVYzX2NvbmZfZnJlZSk7CisJcmV0dXJuIHBvbHM7CisJZXJyOgorCXNrX0NPTkZfVkFMVUVfcG9wX2ZyZWUodmFscywgWDUwOVYzX2NvbmZfZnJlZSk7CisJc2tfUE9MSUNZSU5GT19wb3BfZnJlZShwb2xzLCBQT0xJQ1lJTkZPX2ZyZWUpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgUE9MSUNZSU5GTyAqcG9saWN5X3NlY3Rpb24oWDUwOVYzX0NUWCAqY3R4LAorCQkJCVNUQUNLX09GKENPTkZfVkFMVUUpICpwb2xzdHJzLCBpbnQgaWE1b3JnKQoreworCXNpemVfdCBpOworCUNPTkZfVkFMVUUgKmNuZjsKKwlQT0xJQ1lJTkZPICpwb2w7CisJUE9MSUNZUVVBTElORk8gKnF1YWw7CisJaWYoIShwb2wgPSBQT0xJQ1lJTkZPX25ldygpKSkgZ290byBtZXJyOworCWZvcihpID0gMDsgaSA8IHNrX0NPTkZfVkFMVUVfbnVtKHBvbHN0cnMpOyBpKyspIHsKKwkJY25mID0gc2tfQ09ORl9WQUxVRV92YWx1ZShwb2xzdHJzLCBpKTsKKwkJaWYoIXN0cmNtcChjbmYtPm5hbWUsICJwb2xpY3lJZGVudGlmaWVyIikpIHsKKwkJCUFTTjFfT0JKRUNUICpwb2JqOworCQkJaWYoIShwb2JqID0gT0JKX3R4dDJvYmooY25mLT52YWx1ZSwgMCkpKSB7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBwb2xpY3lfc2VjdGlvbiwgWDUwOVYzX1JfSU5WQUxJRF9PQkpFQ1RfSURFTlRJRklFUik7CisJCQkJWDUwOVYzX2NvbmZfZXJyKGNuZik7CisJCQkJZ290byBlcnI7CisJCQl9CisJCQlwb2wtPnBvbGljeWlkID0gcG9iajsKKworCQl9IGVsc2UgaWYoIW5hbWVfY21wKGNuZi0+bmFtZSwgIkNQUyIpKSB7CisJCQlpZighcG9sLT5xdWFsaWZpZXJzKSBwb2wtPnF1YWxpZmllcnMgPQorCQkJCQkJIHNrX1BPTElDWVFVQUxJTkZPX25ld19udWxsKCk7CisJCQlpZighKHF1YWwgPSBQT0xJQ1lRVUFMSU5GT19uZXcoKSkpIGdvdG8gbWVycjsKKwkJCWlmKCFza19QT0xJQ1lRVUFMSU5GT19wdXNoKHBvbC0+cXVhbGlmaWVycywgcXVhbCkpCisJCQkJCQkJCSBnb3RvIG1lcnI7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPKGZvcmspOiBjb25zdCBjb3JyZWN0bmVzcyAqLworCQkJcXVhbC0+cHF1YWxpZCA9IChBU04xX09CSkVDVCopIE9CSl9uaWQyb2JqKE5JRF9pZF9xdF9jcHMpOworCQkJcXVhbC0+ZC5jcHN1cmkgPSBNX0FTTjFfSUE1U1RSSU5HX25ldygpOworCQkJaWYoIUFTTjFfU1RSSU5HX3NldChxdWFsLT5kLmNwc3VyaSwgY25mLT52YWx1ZSwKKwkJCQkJCSBzdHJsZW4oY25mLT52YWx1ZSkpKSBnb3RvIG1lcnI7CisJCX0gZWxzZSBpZighbmFtZV9jbXAoY25mLT5uYW1lLCAidXNlck5vdGljZSIpKSB7CisJCQlTVEFDS19PRihDT05GX1ZBTFVFKSAqdW5vdDsKKwkJCWlmKCpjbmYtPnZhbHVlICE9ICdAJykgeworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcG9saWN5X3NlY3Rpb24sIFg1MDlWM19SX0VYUEVDVEVEX0FfU0VDVElPTl9OQU1FKTsKKwkJCQlYNTA5VjNfY29uZl9lcnIoY25mKTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJCXVub3QgPSBYNTA5VjNfZ2V0X3NlY3Rpb24oY3R4LCBjbmYtPnZhbHVlICsgMSk7CisJCQlpZighdW5vdCkgeworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcG9saWN5X3NlY3Rpb24sIFg1MDlWM19SX0lOVkFMSURfU0VDVElPTik7CisKKwkJCQlYNTA5VjNfY29uZl9lcnIoY25mKTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJCXF1YWwgPSBub3RpY2Vfc2VjdGlvbihjdHgsIHVub3QsIGlhNW9yZyk7CisJCQlYNTA5VjNfc2VjdGlvbl9mcmVlKGN0eCwgdW5vdCk7CisJCQlpZighcXVhbCkgZ290byBlcnI7CisJCQlpZighcG9sLT5xdWFsaWZpZXJzKSBwb2wtPnF1YWxpZmllcnMgPQorCQkJCQkJIHNrX1BPTElDWVFVQUxJTkZPX25ld19udWxsKCk7CisJCQlpZighc2tfUE9MSUNZUVVBTElORk9fcHVzaChwb2wtPnF1YWxpZmllcnMsIHF1YWwpKQorCQkJCQkJCQkgZ290byBtZXJyOworCQl9IGVsc2UgeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBwb2xpY3lfc2VjdGlvbiwgWDUwOVYzX1JfSU5WQUxJRF9PUFRJT04pOworCisJCQlYNTA5VjNfY29uZl9lcnIoY25mKTsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCWlmKCFwb2wtPnBvbGljeWlkKSB7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcG9saWN5X3NlY3Rpb24sIFg1MDlWM19SX05PX1BPTElDWV9JREVOVElGSUVSKTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0dXJuIHBvbDsKKworCW1lcnI6CisJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBwb2xpY3lfc2VjdGlvbiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCisJZXJyOgorCVBPTElDWUlORk9fZnJlZShwb2wpOworCXJldHVybiBOVUxMOworCQorCQorfQorCitzdGF0aWMgUE9MSUNZUVVBTElORk8gKm5vdGljZV9zZWN0aW9uKFg1MDlWM19DVFggKmN0eCwKKwkJCQkJU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKnVub3QsIGludCBpYTVvcmcpCit7CisJc2l6ZV90IGk7CisJaW50IHJldDsKKwlDT05GX1ZBTFVFICpjbmY7CisJVVNFUk5PVElDRSAqbm90OworCVBPTElDWVFVQUxJTkZPICpxdWFsOworCWlmKCEocXVhbCA9IFBPTElDWVFVQUxJTkZPX25ldygpKSkgZ290byBtZXJyOworICAgICAgICAvKiBUT0RPKGZvcmspOiBjb25zdCBjb3JyZWN0bmVzcyAqLworCXF1YWwtPnBxdWFsaWQgPSAoQVNOMV9PQkpFQ1QgKikgT0JKX25pZDJvYmooTklEX2lkX3F0X3Vub3RpY2UpOworCWlmKCEobm90ID0gVVNFUk5PVElDRV9uZXcoKSkpIGdvdG8gbWVycjsKKwlxdWFsLT5kLnVzZXJub3RpY2UgPSBub3Q7CisJZm9yKGkgPSAwOyBpIDwgc2tfQ09ORl9WQUxVRV9udW0odW5vdCk7IGkrKykgeworCQljbmYgPSBza19DT05GX1ZBTFVFX3ZhbHVlKHVub3QsIGkpOworCQlpZighc3RyY21wKGNuZi0+bmFtZSwgImV4cGxpY2l0VGV4dCIpKSB7CisJCQlub3QtPmV4cHRleHQgPSBNX0FTTjFfVklTSUJMRVNUUklOR19uZXcoKTsKKwkJCWlmKCFBU04xX1NUUklOR19zZXQobm90LT5leHB0ZXh0LCBjbmYtPnZhbHVlLAorCQkJCQkJIHN0cmxlbihjbmYtPnZhbHVlKSkpIGdvdG8gbWVycjsKKwkJfSBlbHNlIGlmKCFzdHJjbXAoY25mLT5uYW1lLCAib3JnYW5pemF0aW9uIikpIHsKKwkJCU5PVElDRVJFRiAqbnJlZjsKKwkJCWlmKCFub3QtPm5vdGljZXJlZikgeworCQkJCWlmKCEobnJlZiA9IE5PVElDRVJFRl9uZXcoKSkpIGdvdG8gbWVycjsKKwkJCQlub3QtPm5vdGljZXJlZiA9IG5yZWY7CisJCQl9IGVsc2UgbnJlZiA9IG5vdC0+bm90aWNlcmVmOworCQkJaWYoaWE1b3JnKSBucmVmLT5vcmdhbml6YXRpb24tPnR5cGUgPSBWX0FTTjFfSUE1U1RSSU5HOworCQkJZWxzZSBucmVmLT5vcmdhbml6YXRpb24tPnR5cGUgPSBWX0FTTjFfVklTSUJMRVNUUklORzsKKwkJCWlmKCFBU04xX1NUUklOR19zZXQobnJlZi0+b3JnYW5pemF0aW9uLCBjbmYtPnZhbHVlLAorCQkJCQkJIHN0cmxlbihjbmYtPnZhbHVlKSkpIGdvdG8gbWVycjsKKwkJfSBlbHNlIGlmKCFzdHJjbXAoY25mLT5uYW1lLCAibm90aWNlTnVtYmVycyIpKSB7CisJCQlOT1RJQ0VSRUYgKm5yZWY7CisJCQlTVEFDS19PRihDT05GX1ZBTFVFKSAqbm9zOworCQkJaWYoIW5vdC0+bm90aWNlcmVmKSB7CisJCQkJaWYoIShucmVmID0gTk9USUNFUkVGX25ldygpKSkgZ290byBtZXJyOworCQkJCW5vdC0+bm90aWNlcmVmID0gbnJlZjsKKwkJCX0gZWxzZSBucmVmID0gbm90LT5ub3RpY2VyZWY7CisJCQlub3MgPSBYNTA5VjNfcGFyc2VfbGlzdChjbmYtPnZhbHVlKTsKKwkJCWlmKCFub3MgfHwgIXNrX0NPTkZfVkFMVUVfbnVtKG5vcykpIHsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIG5vdGljZV9zZWN0aW9uLCBYNTA5VjNfUl9JTlZBTElEX05VTUJFUlMpOworCQkJCVg1MDlWM19jb25mX2VycihjbmYpOworCQkJCWdvdG8gZXJyOworCQkJfQorCQkJcmV0ID0gbnJlZl9ub3MobnJlZi0+bm90aWNlbm9zLCBub3MpOworCQkJc2tfQ09ORl9WQUxVRV9wb3BfZnJlZShub3MsIFg1MDlWM19jb25mX2ZyZWUpOworCQkJaWYgKCFyZXQpCisJCQkJZ290byBlcnI7CisJCX0gZWxzZSB7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIG5vdGljZV9zZWN0aW9uLCBYNTA5VjNfUl9JTlZBTElEX09QVElPTik7CisJCQlYNTA5VjNfY29uZl9lcnIoY25mKTsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCisJaWYobm90LT5ub3RpY2VyZWYgJiYgCisJICAgICAgKCFub3QtPm5vdGljZXJlZi0+bm90aWNlbm9zIHx8ICFub3QtPm5vdGljZXJlZi0+b3JnYW5pemF0aW9uKSkgeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBub3RpY2Vfc2VjdGlvbiwgWDUwOVYzX1JfTkVFRF9PUkdBTklaQVRJT05fQU5EX05VTUJFUlMpOworCQkJZ290byBlcnI7CisJfQorCisJcmV0dXJuIHF1YWw7CisKKwltZXJyOgorCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgbm90aWNlX3NlY3Rpb24sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKworCWVycjoKKwlQT0xJQ1lRVUFMSU5GT19mcmVlKHF1YWwpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IG5yZWZfbm9zKFNUQUNLX09GKEFTTjFfSU5URUdFUikgKm5udW1zLCBTVEFDS19PRihDT05GX1ZBTFVFKSAqbm9zKQoreworCUNPTkZfVkFMVUUgKmNuZjsKKwlBU04xX0lOVEVHRVIgKmFpbnQ7CisKKwlzaXplX3QgaTsKKworCWZvcihpID0gMDsgaSA8IHNrX0NPTkZfVkFMVUVfbnVtKG5vcyk7IGkrKykgeworCQljbmYgPSBza19DT05GX1ZBTFVFX3ZhbHVlKG5vcywgaSk7CisJCWlmKCEoYWludCA9IHMyaV9BU04xX0lOVEVHRVIoTlVMTCwgY25mLT5uYW1lKSkpIHsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgbnJlZl9ub3MsIFg1MDlWM19SX0lOVkFMSURfTlVNQkVSKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCWlmKCFza19BU04xX0lOVEVHRVJfcHVzaChubnVtcywgYWludCkpIGdvdG8gbWVycjsKKwl9CisJcmV0dXJuIDE7CisKKwltZXJyOgorCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgbnJlZl9ub3MsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKworCWVycjoKKwlza19BU04xX0lOVEVHRVJfcG9wX2ZyZWUobm51bXMsIEFTTjFfU1RSSU5HX2ZyZWUpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaTJyX2NlcnRwb2woWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgU1RBQ0tfT0YoUE9MSUNZSU5GTykgKnBvbCwKKwkJQklPICpvdXQsIGludCBpbmRlbnQpCit7CisJc2l6ZV90IGk7CisJUE9MSUNZSU5GTyAqcGluZm87CisJLyogRmlyc3QgcHJpbnQgb3V0IHRoZSBwb2xpY3kgT0lEcyAqLworCWZvcihpID0gMDsgaSA8IHNrX1BPTElDWUlORk9fbnVtKHBvbCk7IGkrKykgeworCQlwaW5mbyA9IHNrX1BPTElDWUlORk9fdmFsdWUocG9sLCBpKTsKKwkJQklPX3ByaW50ZihvdXQsICIlKnNQb2xpY3k6ICIsIGluZGVudCwgIiIpOworCQlpMmFfQVNOMV9PQkpFQ1Qob3V0LCBwaW5mby0+cG9saWN5aWQpOworCQlCSU9fcHV0cyhvdXQsICJcbiIpOworCQlpZihwaW5mby0+cXVhbGlmaWVycykKKwkJCSBwcmludF9xdWFsaWZpZXJzKG91dCwgcGluZm8tPnF1YWxpZmllcnMsIGluZGVudCArIDIpOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfcXVhbGlmaWVycyhCSU8gKm91dCwgU1RBQ0tfT0YoUE9MSUNZUVVBTElORk8pICpxdWFscywKKwkJaW50IGluZGVudCkKK3sKKwlQT0xJQ1lRVUFMSU5GTyAqcXVhbGluZm87CisJc2l6ZV90IGk7CisJZm9yKGkgPSAwOyBpIDwgc2tfUE9MSUNZUVVBTElORk9fbnVtKHF1YWxzKTsgaSsrKSB7CisJCXF1YWxpbmZvID0gc2tfUE9MSUNZUVVBTElORk9fdmFsdWUocXVhbHMsIGkpOworCQlzd2l0Y2goT0JKX29iajJuaWQocXVhbGluZm8tPnBxdWFsaWQpKQorCQl7CisJCQljYXNlIE5JRF9pZF9xdF9jcHM6CisJCQlCSU9fcHJpbnRmKG91dCwgIiUqc0NQUzogJXNcbiIsIGluZGVudCwgIiIsCisJCQkJCQlxdWFsaW5mby0+ZC5jcHN1cmktPmRhdGEpOworCQkJYnJlYWs7CisJCQorCQkJY2FzZSBOSURfaWRfcXRfdW5vdGljZToKKwkJCUJJT19wcmludGYob3V0LCAiJSpzVXNlciBOb3RpY2U6XG4iLCBpbmRlbnQsICIiKTsKKwkJCXByaW50X25vdGljZShvdXQsIHF1YWxpbmZvLT5kLnVzZXJub3RpY2UsIGluZGVudCArIDIpOworCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQlCSU9fcHJpbnRmKG91dCwgIiUqc1Vua25vd24gUXVhbGlmaWVyOiAiLAorCQkJCQkJCSBpbmRlbnQgKyAyLCAiIik7CisJCQkKKwkJCWkyYV9BU04xX09CSkVDVChvdXQsIHF1YWxpbmZvLT5wcXVhbGlkKTsKKwkJCUJJT19wdXRzKG91dCwgIlxuIik7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcHJpbnRfbm90aWNlKEJJTyAqb3V0LCBVU0VSTk9USUNFICpub3RpY2UsIGludCBpbmRlbnQpCit7CisJc2l6ZV90IGk7CisJaWYobm90aWNlLT5ub3RpY2VyZWYpIHsKKwkJTk9USUNFUkVGICpyZWY7CisJCXJlZiA9IG5vdGljZS0+bm90aWNlcmVmOworCQlCSU9fcHJpbnRmKG91dCwgIiUqc09yZ2FuaXphdGlvbjogJXNcbiIsIGluZGVudCwgIiIsCisJCQkJCQkgcmVmLT5vcmdhbml6YXRpb24tPmRhdGEpOworCQlCSU9fcHJpbnRmKG91dCwgIiUqc051bWJlciVzOiAiLCBpbmRlbnQsICIiLAorCQkJICAgc2tfQVNOMV9JTlRFR0VSX251bShyZWYtPm5vdGljZW5vcykgPiAxID8gInMiIDogIiIpOworCQlmb3IoaSA9IDA7IGkgPCBza19BU04xX0lOVEVHRVJfbnVtKHJlZi0+bm90aWNlbm9zKTsgaSsrKSB7CisJCQlBU04xX0lOVEVHRVIgKm51bTsKKwkJCWNoYXIgKnRtcDsKKwkJCW51bSA9IHNrX0FTTjFfSU5URUdFUl92YWx1ZShyZWYtPm5vdGljZW5vcywgaSk7CisJCQlpZihpKSBCSU9fcHV0cyhvdXQsICIsICIpOworCQkJdG1wID0gaTJzX0FTTjFfSU5URUdFUihOVUxMLCBudW0pOworCQkJQklPX3B1dHMob3V0LCB0bXApOworCQkJT1BFTlNTTF9mcmVlKHRtcCk7CisJCX0KKwkJQklPX3B1dHMob3V0LCAiXG4iKTsKKwl9CisJaWYobm90aWNlLT5leHB0ZXh0KQorCQlCSU9fcHJpbnRmKG91dCwgIiUqc0V4cGxpY2l0IFRleHQ6ICVzXG4iLCBpbmRlbnQsICIiLAorCQkJCQkJCSBub3RpY2UtPmV4cHRleHQtPmRhdGEpOworfQorCit2b2lkIFg1MDlfUE9MSUNZX05PREVfcHJpbnQoQklPICpvdXQsIFg1MDlfUE9MSUNZX05PREUgKm5vZGUsIGludCBpbmRlbnQpCisJeworCWNvbnN0IFg1MDlfUE9MSUNZX0RBVEEgKmRhdCA9IG5vZGUtPmRhdGE7CisKKwlCSU9fcHJpbnRmKG91dCwgIiUqc1BvbGljeTogIiwgaW5kZW50LCAiIik7CisJCQkKKwlpMmFfQVNOMV9PQkpFQ1Qob3V0LCBkYXQtPnZhbGlkX3BvbGljeSk7CisJQklPX3B1dHMob3V0LCAiXG4iKTsKKwlCSU9fcHJpbnRmKG91dCwgIiUqcyVzXG4iLCBpbmRlbnQgKyAyLCAiIiwKKwkJbm9kZV9kYXRhX2NyaXRpY2FsKGRhdCkgPyAiQ3JpdGljYWwiIDogIk5vbiBDcml0aWNhbCIpOworCWlmIChkYXQtPnF1YWxpZmllcl9zZXQpCisJCXByaW50X3F1YWxpZmllcnMob3V0LCBkYXQtPnF1YWxpZmllcl9zZXQsIGluZGVudCArIDIpOworCWVsc2UKKwkJQklPX3ByaW50ZihvdXQsICIlKnNObyBRdWFsaWZpZXJzXG4iLCBpbmRlbnQgKyAyLCAiIik7CisJfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3g1MDl2My92M19jcmxkLmMgYi9jcnlwdG8veDUwOXYzL3YzX2NybGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmJkMmFkCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3g1MDl2My92M19jcmxkLmMKQEAgLTAsMCArMSw2MTUgQEAKKy8qIHYzX2NybGQuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDE5OTkuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwOCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NvbmYuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorCisKK3N0YXRpYyB2b2lkICp2MmlfY3JsZChjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCQkgICAgICBYNTA5VjNfQ1RYICpjdHgsIFNUQUNLX09GKENPTkZfVkFMVUUpICpudmFsKTsKK3N0YXRpYyBpbnQgaTJyX2NybGRwKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIHZvaWQgKnBjcmxkcCwgQklPICpvdXQsCisJCSAgICAgaW50IGluZGVudCk7CisKK2NvbnN0IFg1MDlWM19FWFRfTUVUSE9EIHYzX2NybGQgPQorCXsKKwlOSURfY3JsX2Rpc3RyaWJ1dGlvbl9wb2ludHMsIDAsIEFTTjFfSVRFTV9yZWYoQ1JMX0RJU1RfUE9JTlRTKSwKKwkwLDAsMCwwLAorCTAsMCwKKwkwLAorCXYyaV9jcmxkLAorCWkycl9jcmxkcCwwLAorCU5VTEwKKwl9OworCitjb25zdCBYNTA5VjNfRVhUX01FVEhPRCB2M19mcmVzaGVzdF9jcmwgPQorCXsKKwlOSURfZnJlc2hlc3RfY3JsLCAwLCBBU04xX0lURU1fcmVmKENSTF9ESVNUX1BPSU5UUyksCisJMCwwLDAsMCwKKwkwLDAsCisJMCwKKwl2MmlfY3JsZCwKKwlpMnJfY3JsZHAsMCwKKwlOVUxMCisJfTsKKworc3RhdGljIFNUQUNLX09GKEdFTkVSQUxfTkFNRSkgKmduYW1lc19mcm9tX3NlY3RuYW1lKFg1MDlWM19DVFggKmN0eCwgY2hhciAqc2VjdCkKKwl7CisJU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKmduc2VjdDsKKwlTVEFDS19PRihHRU5FUkFMX05BTUUpICpnZW5zOworCWlmICgqc2VjdCA9PSAnQCcpCisJCWduc2VjdCA9IFg1MDlWM19nZXRfc2VjdGlvbihjdHgsIHNlY3QgKyAxKTsKKwllbHNlCisJCWduc2VjdCA9IFg1MDlWM19wYXJzZV9saXN0KHNlY3QpOworCWlmICghZ25zZWN0KQorCQl7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgZ25hbWVzX2Zyb21fc2VjdG5hbWUsIFg1MDlWM19SX1NFQ1RJT05fTk9UX0ZPVU5EKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKwlnZW5zID0gdjJpX0dFTkVSQUxfTkFNRVMoTlVMTCwgY3R4LCBnbnNlY3QpOworCWlmICgqc2VjdCA9PSAnQCcpCisJCVg1MDlWM19zZWN0aW9uX2ZyZWUoY3R4LCBnbnNlY3QpOworCWVsc2UKKwkJc2tfQ09ORl9WQUxVRV9wb3BfZnJlZShnbnNlY3QsIFg1MDlWM19jb25mX2ZyZWUpOworCXJldHVybiBnZW5zOworCX0KKworc3RhdGljIGludCBzZXRfZGlzdF9wb2ludF9uYW1lKERJU1RfUE9JTlRfTkFNRSAqKnBkcCwgWDUwOVYzX0NUWCAqY3R4LAorCQkJCQkJCUNPTkZfVkFMVUUgKmNuZikKKwl7CisJU1RBQ0tfT0YoR0VORVJBTF9OQU1FKSAqZm5tID0gTlVMTDsKKwlTVEFDS19PRihYNTA5X05BTUVfRU5UUlkpICpybm0gPSBOVUxMOworCWlmICghc3RybmNtcChjbmYtPm5hbWUsICJmdWxsbmFtZSIsIDkpKQorCQl7CisJCWZubSA9IGduYW1lc19mcm9tX3NlY3RuYW1lKGN0eCwgY25mLT52YWx1ZSk7CisJCWlmICghZm5tKQorCQkJZ290byBlcnI7CisJCX0KKwllbHNlIGlmICghc3RyY21wKGNuZi0+bmFtZSwgInJlbGF0aXZlbmFtZSIpKQorCQl7CisJCWludCByZXQ7CisJCVNUQUNLX09GKENPTkZfVkFMVUUpICpkbnNlY3Q7CisJCVg1MDlfTkFNRSAqbm07CisJCW5tID0gWDUwOV9OQU1FX25ldygpOworCQlpZiAoIW5tKQorCQkJcmV0dXJuIC0xOworCQlkbnNlY3QgPSBYNTA5VjNfZ2V0X3NlY3Rpb24oY3R4LCBjbmYtPnZhbHVlKTsKKwkJaWYgKCFkbnNlY3QpCisJCQl7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHNldF9kaXN0X3BvaW50X25hbWUsIFg1MDlWM19SX1NFQ1RJT05fTk9UX0ZPVU5EKTsKKwkJCXJldHVybiAtMTsKKwkJCX0KKwkJcmV0ID0gWDUwOVYzX05BTUVfZnJvbV9zZWN0aW9uKG5tLCBkbnNlY3QsIE1CU1RSSU5HX0FTQyk7CisJCVg1MDlWM19zZWN0aW9uX2ZyZWUoY3R4LCBkbnNlY3QpOworCQlybm0gPSBubS0+ZW50cmllczsKKwkJbm0tPmVudHJpZXMgPSBOVUxMOworCQlYNTA5X05BTUVfZnJlZShubSk7CisJCWlmICghcmV0IHx8IHNrX1g1MDlfTkFNRV9FTlRSWV9udW0ocm5tKSA8PSAwKQorCQkJZ290byBlcnI7CisJCS8qIFNpbmNlIGl0cyBhIG5hbWUgZnJhZ21lbnQgY2FuJ3QgaGF2ZSBtb3JlIHRoYW4gb25lCisJCSAqIFJETlNlcXVlbmNlCisJCSAqLworCQlpZiAoc2tfWDUwOV9OQU1FX0VOVFJZX3ZhbHVlKHJubSwKKwkJCQlza19YNTA5X05BTUVfRU5UUllfbnVtKHJubSkgLSAxKS0+c2V0KQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBzZXRfZGlzdF9wb2ludF9uYW1lLCBYNTA5VjNfUl9JTlZBTElEX01VTFRJUExFX1JETlMpOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwllbHNlCisJCXJldHVybiAwOworCisJaWYgKCpwZHApCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBzZXRfZGlzdF9wb2ludF9uYW1lLCBYNTA5VjNfUl9ESVNUUE9JTlRfQUxSRUFEWV9TRVQpOworCQlnb3RvIGVycjsKKwkJfQorCisJKnBkcCA9IERJU1RfUE9JTlRfTkFNRV9uZXcoKTsKKwlpZiAoISpwZHApCisJCWdvdG8gZXJyOworCWlmIChmbm0pCisJCXsKKwkJKCpwZHApLT50eXBlID0gMDsKKwkJKCpwZHApLT5uYW1lLmZ1bGxuYW1lID0gZm5tOworCQl9CisJZWxzZQorCQl7CisJCSgqcGRwKS0+dHlwZSA9IDE7CisJCSgqcGRwKS0+bmFtZS5yZWxhdGl2ZW5hbWUgPSBybm07CisJCX0KKworCXJldHVybiAxOworCQkKKwllcnI6CisJaWYgKGZubSkKKwkJc2tfR0VORVJBTF9OQU1FX3BvcF9mcmVlKGZubSwgR0VORVJBTF9OQU1FX2ZyZWUpOworCWlmIChybm0pCisJCXNrX1g1MDlfTkFNRV9FTlRSWV9wb3BfZnJlZShybm0sIFg1MDlfTkFNRV9FTlRSWV9mcmVlKTsKKwlyZXR1cm4gLTE7CisJfQorCitzdGF0aWMgY29uc3QgQklUX1NUUklOR19CSVROQU1FIHJlYXNvbl9mbGFnc1tdID0geworezAsICJVbnVzZWQiLCAidW51c2VkIn0sCit7MSwgIktleSBDb21wcm9taXNlIiwgImtleUNvbXByb21pc2UifSwKK3syLCAiQ0EgQ29tcHJvbWlzZSIsICJDQUNvbXByb21pc2UifSwKK3szLCAiQWZmaWxpYXRpb24gQ2hhbmdlZCIsICJhZmZpbGlhdGlvbkNoYW5nZWQifSwKK3s0LCAiU3VwZXJzZWRlZCIsICJzdXBlcnNlZGVkIn0sCit7NSwgIkNlc3NhdGlvbiBPZiBPcGVyYXRpb24iLCAiY2Vzc2F0aW9uT2ZPcGVyYXRpb24ifSwKK3s2LCAiQ2VydGlmaWNhdGUgSG9sZCIsICJjZXJ0aWZpY2F0ZUhvbGQifSwKK3s3LCAiUHJpdmlsZWdlIFdpdGhkcmF3biIsICJwcml2aWxlZ2VXaXRoZHJhd24ifSwKK3s4LCAiQUEgQ29tcHJvbWlzZSIsICJBQUNvbXByb21pc2UifSwKK3stMSwgTlVMTCwgTlVMTH0KK307CisKK3N0YXRpYyBpbnQgc2V0X3JlYXNvbnMoQVNOMV9CSVRfU1RSSU5HICoqcHJlYXMsIGNoYXIgKnZhbHVlKQorCXsKKwlTVEFDS19PRihDT05GX1ZBTFVFKSAqcnNrID0gTlVMTDsKKwljb25zdCBCSVRfU1RSSU5HX0JJVE5BTUUgKnBibjsKKwljb25zdCBjaGFyICpibmFtOworCXNpemVfdCBpOworCWludCByZXQgPSAwOworCXJzayA9IFg1MDlWM19wYXJzZV9saXN0KHZhbHVlKTsKKwlpZiAoIXJzaykKKwkJcmV0dXJuIDA7CisJaWYgKCpwcmVhcykKKwkJcmV0dXJuIDA7CisJZm9yIChpID0gMDsgaSA8IHNrX0NPTkZfVkFMVUVfbnVtKHJzayk7IGkrKykKKwkJeworCQlibmFtID0gc2tfQ09ORl9WQUxVRV92YWx1ZShyc2ssIGkpLT5uYW1lOworCQlpZiAoISpwcmVhcykKKwkJCXsKKwkJCSpwcmVhcyA9IEFTTjFfQklUX1NUUklOR19uZXcoKTsKKwkJCWlmICghKnByZWFzKQorCQkJCWdvdG8gZXJyOworCQkJfQorCQlmb3IgKHBibiA9IHJlYXNvbl9mbGFnczsgcGJuLT5sbmFtZTsgcGJuKyspCisJCQl7CisJCQlpZiAoIXN0cmNtcChwYm4tPnNuYW1lLCBibmFtKSkKKwkJCQl7CisJCQkJaWYgKCFBU04xX0JJVF9TVFJJTkdfc2V0X2JpdCgqcHJlYXMsCisJCQkJCQkJcGJuLT5iaXRudW0sIDEpKQorCQkJCQlnb3RvIGVycjsKKwkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCWlmICghcGJuLT5sbmFtZSkKKwkJCWdvdG8gZXJyOworCQl9CisJcmV0ID0gMTsKKworCWVycjoKKwlza19DT05GX1ZBTFVFX3BvcF9mcmVlKHJzaywgWDUwOVYzX2NvbmZfZnJlZSk7CisJcmV0dXJuIHJldDsKKwl9CisKK3N0YXRpYyBpbnQgcHJpbnRfcmVhc29ucyhCSU8gKm91dCwgY29uc3QgY2hhciAqcm5hbWUsCisJCQlBU04xX0JJVF9TVFJJTkcgKnJmbGFncywgaW50IGluZGVudCkKKwl7CisJaW50IGZpcnN0ID0gMTsKKwljb25zdCBCSVRfU1RSSU5HX0JJVE5BTUUgKnBibjsKKwlCSU9fcHJpbnRmKG91dCwgIiUqcyVzOlxuJSpzIiwgaW5kZW50LCAiIiwgcm5hbWUsIGluZGVudCArIDIsICIiKTsKKwlmb3IgKHBibiA9IHJlYXNvbl9mbGFnczsgcGJuLT5sbmFtZTsgcGJuKyspCisJCXsKKwkJaWYgKEFTTjFfQklUX1NUUklOR19nZXRfYml0KHJmbGFncywgcGJuLT5iaXRudW0pKQorCQkJeworCQkJaWYgKGZpcnN0KQorCQkJCWZpcnN0ID0gMDsKKwkJCWVsc2UKKwkJCQlCSU9fcHV0cyhvdXQsICIsICIpOworCQkJQklPX3B1dHMob3V0LCBwYm4tPmxuYW1lKTsKKwkJCX0KKwkJfQorCWlmIChmaXJzdCkKKwkJQklPX3B1dHMob3V0LCAiPEVNUFRZPlxuIik7CisJZWxzZQorCQlCSU9fcHV0cyhvdXQsICJcbiIpOworCXJldHVybiAxOworCX0KKworc3RhdGljIERJU1RfUE9JTlQgKmNybGRwX2Zyb21fc2VjdGlvbihYNTA5VjNfQ1RYICpjdHgsCisJCQkJCQlTVEFDS19PRihDT05GX1ZBTFVFKSAqbnZhbCkKKwl7CisJc2l6ZV90IGk7CisJQ09ORl9WQUxVRSAqY25mOworCURJU1RfUE9JTlQgKnBvaW50ID0gTlVMTDsKKwlwb2ludCA9IERJU1RfUE9JTlRfbmV3KCk7CisJaWYgKCFwb2ludCkKKwkJZ290byBlcnI7CisJZm9yKGkgPSAwOyBpIDwgc2tfQ09ORl9WQUxVRV9udW0obnZhbCk7IGkrKykKKwkJeworCQlpbnQgcmV0OworCQljbmYgPSBza19DT05GX1ZBTFVFX3ZhbHVlKG52YWwsIGkpOworCQlyZXQgPSBzZXRfZGlzdF9wb2ludF9uYW1lKCZwb2ludC0+ZGlzdHBvaW50LCBjdHgsIGNuZik7CisJCWlmIChyZXQgPiAwKQorCQkJY29udGludWU7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnI7CisJCWlmICghc3RyY21wKGNuZi0+bmFtZSwgInJlYXNvbnMiKSkKKwkJCXsKKwkJCWlmICghc2V0X3JlYXNvbnMoJnBvaW50LT5yZWFzb25zLCBjbmYtPnZhbHVlKSkKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcChjbmYtPm5hbWUsICJDUkxpc3N1ZXIiKSkKKwkJCXsKKwkJCXBvaW50LT5DUkxpc3N1ZXIgPQorCQkJCWduYW1lc19mcm9tX3NlY3RuYW1lKGN0eCwgY25mLT52YWx1ZSk7CisJCQlpZiAoIXBvaW50LT5DUkxpc3N1ZXIpCisJCQkJZ290byBlcnI7CisJCQl9CisJCX0KKworCXJldHVybiBwb2ludDsKKwkJCQorCisJZXJyOgorCWlmIChwb2ludCkKKwkJRElTVF9QT0lOVF9mcmVlKHBvaW50KTsKKwlyZXR1cm4gTlVMTDsKKwl9CisKK3N0YXRpYyB2b2lkICp2MmlfY3JsZChjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCQkgICAgICBYNTA5VjNfQ1RYICpjdHgsIFNUQUNLX09GKENPTkZfVkFMVUUpICpudmFsKQorCXsKKwlTVEFDS19PRihESVNUX1BPSU5UKSAqY3JsZCA9IE5VTEw7CisJR0VORVJBTF9OQU1FUyAqZ2VucyA9IE5VTEw7CisJR0VORVJBTF9OQU1FICpnZW4gPSBOVUxMOworCUNPTkZfVkFMVUUgKmNuZjsKKwlzaXplX3QgaTsKKwlpZighKGNybGQgPSBza19ESVNUX1BPSU5UX25ld19udWxsKCkpKSBnb3RvIG1lcnI7CisJZm9yKGkgPSAwOyBpIDwgc2tfQ09ORl9WQUxVRV9udW0obnZhbCk7IGkrKykgeworCQlESVNUX1BPSU5UICpwb2ludDsKKwkJY25mID0gc2tfQ09ORl9WQUxVRV92YWx1ZShudmFsLCBpKTsKKwkJaWYgKCFjbmYtPnZhbHVlKQorCQkJeworCQkJU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKmRwc2VjdDsKKwkJCWRwc2VjdCA9IFg1MDlWM19nZXRfc2VjdGlvbihjdHgsIGNuZi0+bmFtZSk7CisJCQlpZiAoIWRwc2VjdCkKKwkJCQlnb3RvIGVycjsKKwkJCXBvaW50ID0gY3JsZHBfZnJvbV9zZWN0aW9uKGN0eCwgZHBzZWN0KTsKKwkJCVg1MDlWM19zZWN0aW9uX2ZyZWUoY3R4LCBkcHNlY3QpOworCQkJaWYgKCFwb2ludCkKKwkJCQlnb3RvIGVycjsKKwkJCWlmKCFza19ESVNUX1BPSU5UX3B1c2goY3JsZCwgcG9pbnQpKQorCQkJCXsKKwkJCQlESVNUX1BPSU5UX2ZyZWUocG9pbnQpOworCQkJCWdvdG8gbWVycjsKKwkJCQl9CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCWlmKCEoZ2VuID0gdjJpX0dFTkVSQUxfTkFNRShtZXRob2QsIGN0eCwgY25mKSkpCisJCQkJZ290byBlcnI7IAorCQkJaWYoIShnZW5zID0gR0VORVJBTF9OQU1FU19uZXcoKSkpCisJCQkJZ290byBtZXJyOworCQkJaWYoIXNrX0dFTkVSQUxfTkFNRV9wdXNoKGdlbnMsIGdlbikpCisJCQkJZ290byBtZXJyOworCQkJZ2VuID0gTlVMTDsKKwkJCWlmKCEocG9pbnQgPSBESVNUX1BPSU5UX25ldygpKSkKKwkJCQlnb3RvIG1lcnI7CisJCQlpZighc2tfRElTVF9QT0lOVF9wdXNoKGNybGQsIHBvaW50KSkKKwkJCQl7CisJCQkJRElTVF9QT0lOVF9mcmVlKHBvaW50KTsKKwkJCQlnb3RvIG1lcnI7CisJCQkJfQorCQkJaWYoIShwb2ludC0+ZGlzdHBvaW50ID0gRElTVF9QT0lOVF9OQU1FX25ldygpKSkKKwkJCQlnb3RvIG1lcnI7CisJCQlwb2ludC0+ZGlzdHBvaW50LT5uYW1lLmZ1bGxuYW1lID0gZ2VuczsKKwkJCXBvaW50LT5kaXN0cG9pbnQtPnR5cGUgPSAwOworCQkJZ2VucyA9IE5VTEw7CisJCQl9CisJfQorCXJldHVybiBjcmxkOworCisJbWVycjoKKwlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9jcmxkLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJZXJyOgorCUdFTkVSQUxfTkFNRV9mcmVlKGdlbik7CisJR0VORVJBTF9OQU1FU19mcmVlKGdlbnMpOworCXNrX0RJU1RfUE9JTlRfcG9wX2ZyZWUoY3JsZCwgRElTVF9QT0lOVF9mcmVlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworSU1QTEVNRU5UX0FTTjFfU0VUX09GKERJU1RfUE9JTlQpCisKK3N0YXRpYyBpbnQgZHBuX2NiKGludCBvcGVyYXRpb24sIEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0LAorCQkJCQkJCQl2b2lkICpleGFyZykKKwl7CisJRElTVF9QT0lOVF9OQU1FICpkcG4gPSAoRElTVF9QT0lOVF9OQU1FICopKnB2YWw7CisKKwlzd2l0Y2gob3BlcmF0aW9uKQorCQl7CisJCWNhc2UgQVNOMV9PUF9ORVdfUE9TVDoKKwkJZHBuLT5kcG5hbWUgPSBOVUxMOworCQlicmVhazsKKworCQljYXNlIEFTTjFfT1BfRlJFRV9QT1NUOgorCQlpZiAoZHBuLT5kcG5hbWUpCisJCQlYNTA5X05BTUVfZnJlZShkcG4tPmRwbmFtZSk7CisJCWJyZWFrOworCQl9CisJcmV0dXJuIDE7CisJfQorCisKK0FTTjFfQ0hPSUNFX2NiKERJU1RfUE9JTlRfTkFNRSwgZHBuX2NiKSA9IHsKKwlBU04xX0lNUF9TRVFVRU5DRV9PRihESVNUX1BPSU5UX05BTUUsIG5hbWUuZnVsbG5hbWUsIEdFTkVSQUxfTkFNRSwgMCksCisJQVNOMV9JTVBfU0VUX09GKERJU1RfUE9JTlRfTkFNRSwgbmFtZS5yZWxhdGl2ZW5hbWUsIFg1MDlfTkFNRV9FTlRSWSwgMSkKK30gQVNOMV9DSE9JQ0VfRU5EX2NiKERJU1RfUE9JTlRfTkFNRSwgRElTVF9QT0lOVF9OQU1FLCB0eXBlKQorCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhESVNUX1BPSU5UX05BTUUpCisKK0FTTjFfU0VRVUVOQ0UoRElTVF9QT0lOVCkgPSB7CisJQVNOMV9FWFBfT1BUKERJU1RfUE9JTlQsIGRpc3Rwb2ludCwgRElTVF9QT0lOVF9OQU1FLCAwKSwKKwlBU04xX0lNUF9PUFQoRElTVF9QT0lOVCwgcmVhc29ucywgQVNOMV9CSVRfU1RSSU5HLCAxKSwKKwlBU04xX0lNUF9TRVFVRU5DRV9PRl9PUFQoRElTVF9QT0lOVCwgQ1JMaXNzdWVyLCBHRU5FUkFMX05BTUUsIDIpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKERJU1RfUE9JTlQpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhESVNUX1BPSU5UKQorCitBU04xX0lURU1fVEVNUExBVEUoQ1JMX0RJU1RfUE9JTlRTKSA9IAorCUFTTjFfRVhfVEVNUExBVEVfVFlQRShBU04xX1RGTEdfU0VRVUVOQ0VfT0YsIDAsIENSTERpc3RyaWJ1dGlvblBvaW50cywgRElTVF9QT0lOVCkKK0FTTjFfSVRFTV9URU1QTEFURV9FTkQoQ1JMX0RJU1RfUE9JTlRTKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoQ1JMX0RJU1RfUE9JTlRTKQorCitBU04xX1NFUVVFTkNFKElTU1VJTkdfRElTVF9QT0lOVCkgPSB7CisJQVNOMV9FWFBfT1BUKElTU1VJTkdfRElTVF9QT0lOVCwgZGlzdHBvaW50LCBESVNUX1BPSU5UX05BTUUsIDApLAorCUFTTjFfSU1QX09QVChJU1NVSU5HX0RJU1RfUE9JTlQsIG9ubHl1c2VyLCBBU04xX0ZCT09MRUFOLCAxKSwKKwlBU04xX0lNUF9PUFQoSVNTVUlOR19ESVNUX1BPSU5ULCBvbmx5Q0EsIEFTTjFfRkJPT0xFQU4sIDIpLAorCUFTTjFfSU1QX09QVChJU1NVSU5HX0RJU1RfUE9JTlQsIG9ubHlzb21lcmVhc29ucywgQVNOMV9CSVRfU1RSSU5HLCAzKSwKKwlBU04xX0lNUF9PUFQoSVNTVUlOR19ESVNUX1BPSU5ULCBpbmRpcmVjdENSTCwgQVNOMV9GQk9PTEVBTiwgNCksCisJQVNOMV9JTVBfT1BUKElTU1VJTkdfRElTVF9QT0lOVCwgb25seWF0dHIsIEFTTjFfRkJPT0xFQU4sIDUpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKElTU1VJTkdfRElTVF9QT0lOVCkKKworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKElTU1VJTkdfRElTVF9QT0lOVCkKKworc3RhdGljIGludCBpMnJfaWRwKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIHZvaWQgKnBpZHAsIEJJTyAqb3V0LAorCQkgICBpbnQgaW5kZW50KTsKK3N0YXRpYyB2b2lkICp2MmlfaWRwKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIFg1MDlWM19DVFggKmN0eCwKKwkJICAgICBTVEFDS19PRihDT05GX1ZBTFVFKSAqbnZhbCk7CisKK2NvbnN0IFg1MDlWM19FWFRfTUVUSE9EIHYzX2lkcCA9CisJeworCU5JRF9pc3N1aW5nX2Rpc3RyaWJ1dGlvbl9wb2ludCwgWDUwOVYzX0VYVF9NVUxUSUxJTkUsCisJQVNOMV9JVEVNX3JlZihJU1NVSU5HX0RJU1RfUE9JTlQpLAorCTAsMCwwLDAsCisJMCwwLAorCTAsCisJdjJpX2lkcCwKKwlpMnJfaWRwLDAsCisJTlVMTAorCX07CisKK3N0YXRpYyB2b2lkICp2MmlfaWRwKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIFg1MDlWM19DVFggKmN0eCwKKwkJICAgICBTVEFDS19PRihDT05GX1ZBTFVFKSAqbnZhbCkKKwl7CisJSVNTVUlOR19ESVNUX1BPSU5UICppZHAgPSBOVUxMOworCUNPTkZfVkFMVUUgKmNuZjsKKwljaGFyICpuYW1lLCAqdmFsOworCXNpemVfdCBpOworCWludCByZXQ7CisJaWRwID0gSVNTVUlOR19ESVNUX1BPSU5UX25ldygpOworCWlmICghaWRwKQorCQlnb3RvIG1lcnI7CisJZm9yKGkgPSAwOyBpIDwgc2tfQ09ORl9WQUxVRV9udW0obnZhbCk7IGkrKykKKwkJeworCQljbmYgPSBza19DT05GX1ZBTFVFX3ZhbHVlKG52YWwsIGkpOworCQluYW1lID0gY25mLT5uYW1lOworCQl2YWwgPSBjbmYtPnZhbHVlOworCQlyZXQgPSBzZXRfZGlzdF9wb2ludF9uYW1lKCZpZHAtPmRpc3Rwb2ludCwgY3R4LCBjbmYpOworCQlpZiAocmV0ID4gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyOworCQlpZiAoIXN0cmNtcChuYW1lLCAib25seXVzZXIiKSkKKwkJCXsKKwkJCWlmICghWDUwOVYzX2dldF92YWx1ZV9ib29sKGNuZiwgJmlkcC0+b25seXVzZXIpKQorCQkJCWdvdG8gZXJyOworCQkJfQorCQllbHNlIGlmICghc3RyY21wKG5hbWUsICJvbmx5Q0EiKSkKKwkJCXsKKwkJCWlmICghWDUwOVYzX2dldF92YWx1ZV9ib29sKGNuZiwgJmlkcC0+b25seUNBKSkKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAib25seUFBIikpCisJCQl7CisJCQlpZiAoIVg1MDlWM19nZXRfdmFsdWVfYm9vbChjbmYsICZpZHAtPm9ubHlhdHRyKSkKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiaW5kaXJlY3RDUkwiKSkKKwkJCXsKKwkJCWlmICghWDUwOVYzX2dldF92YWx1ZV9ib29sKGNuZiwgJmlkcC0+aW5kaXJlY3RDUkwpKQorCQkJCWdvdG8gZXJyOworCQkJfQorCQllbHNlIGlmICghc3RyY21wKG5hbWUsICJvbmx5c29tZXJlYXNvbnMiKSkKKwkJCXsKKwkJCWlmICghc2V0X3JlYXNvbnMoJmlkcC0+b25seXNvbWVyZWFzb25zLCB2YWwpKQorCQkJCWdvdG8gZXJyOworCQkJfQorCQllbHNlCisJCQl7CisgICAgICAgICAgICAgICAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9pZHAsIFg1MDlWM19SX0lOVkFMSURfTkFNRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBYNTA5VjNfY29uZl9lcnIoY25mKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyOworCQkJfQorCQl9CisJcmV0dXJuIGlkcDsKKworCW1lcnI6CisJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2MmlfaWRwLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJZXJyOgorCUlTU1VJTkdfRElTVF9QT0lOVF9mcmVlKGlkcCk7CisJcmV0dXJuIE5VTEw7CisJfQorCitzdGF0aWMgaW50IHByaW50X2dlbnMoQklPICpvdXQsIFNUQUNLX09GKEdFTkVSQUxfTkFNRSkgKmdlbnMsIGludCBpbmRlbnQpCisJeworCXNpemVfdCBpOworCWZvciAoaSA9IDA7IGkgPCBza19HRU5FUkFMX05BTUVfbnVtKGdlbnMpOyBpKyspCisJCXsKKwkJQklPX3ByaW50ZihvdXQsICIlKnMiLCBpbmRlbnQgKyAyLCAiIik7CisJCUdFTkVSQUxfTkFNRV9wcmludChvdXQsIHNrX0dFTkVSQUxfTkFNRV92YWx1ZShnZW5zLCBpKSk7CisJCUJJT19wdXRzKG91dCwgIlxuIik7CisJCX0KKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgcHJpbnRfZGlzdHBvaW50KEJJTyAqb3V0LCBESVNUX1BPSU5UX05BTUUgKmRwbiwgaW50IGluZGVudCkKKwl7CisJaWYgKGRwbi0+dHlwZSA9PSAwKQorCQl7CisJCUJJT19wcmludGYob3V0LCAiJSpzRnVsbCBOYW1lOlxuIiwgaW5kZW50LCAiIik7CisJCXByaW50X2dlbnMob3V0LCBkcG4tPm5hbWUuZnVsbG5hbWUsIGluZGVudCk7CisJCX0KKwllbHNlCisJCXsKKwkJWDUwOV9OQU1FIG50bXA7CisJCW50bXAuZW50cmllcyA9IGRwbi0+bmFtZS5yZWxhdGl2ZW5hbWU7CisJCUJJT19wcmludGYob3V0LCAiJSpzUmVsYXRpdmUgTmFtZTpcbiUqcyIsCisJCQkJCQlpbmRlbnQsICIiLCBpbmRlbnQgKyAyLCAiIik7CisJCVg1MDlfTkFNRV9wcmludF9leChvdXQsICZudG1wLCAwLCBYTl9GTEFHX09ORUxJTkUpOworCQlCSU9fcHV0cyhvdXQsICJcbiIpOworCQl9CisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IGkycl9pZHAoY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgdm9pZCAqcGlkcCwgQklPICpvdXQsCisJCSAgIGludCBpbmRlbnQpCisJeworCUlTU1VJTkdfRElTVF9QT0lOVCAqaWRwID0gcGlkcDsKKwlpZiAoaWRwLT5kaXN0cG9pbnQpCisJCXByaW50X2Rpc3Rwb2ludChvdXQsIGlkcC0+ZGlzdHBvaW50LCBpbmRlbnQpOworCWlmIChpZHAtPm9ubHl1c2VyID4gMCkKKwkJQklPX3ByaW50ZihvdXQsICIlKnNPbmx5IFVzZXIgQ2VydGlmaWNhdGVzXG4iLCBpbmRlbnQsICIiKTsKKwlpZiAoaWRwLT5vbmx5Q0EgPiAwKQorCQlCSU9fcHJpbnRmKG91dCwgIiUqc09ubHkgQ0EgQ2VydGlmaWNhdGVzXG4iLCBpbmRlbnQsICIiKTsKKwlpZiAoaWRwLT5pbmRpcmVjdENSTCA+IDApCisJCUJJT19wcmludGYob3V0LCAiJSpzSW5kaXJlY3QgQ1JMXG4iLCBpbmRlbnQsICIiKTsKKwlpZiAoaWRwLT5vbmx5c29tZXJlYXNvbnMpCisJCXByaW50X3JlYXNvbnMob3V0LCAiT25seSBTb21lIFJlYXNvbnMiLCAKKwkJCQlpZHAtPm9ubHlzb21lcmVhc29ucywgaW5kZW50KTsKKwlpZiAoaWRwLT5vbmx5YXR0ciA+IDApCisJCUJJT19wcmludGYob3V0LCAiJSpzT25seSBBdHRyaWJ1dGUgQ2VydGlmaWNhdGVzXG4iLCBpbmRlbnQsICIiKTsKKwlpZiAoIWlkcC0+ZGlzdHBvaW50ICYmIChpZHAtPm9ubHl1c2VyIDw9IDApICYmIChpZHAtPm9ubHlDQSA8PSAwKQorCQkmJiAoaWRwLT5pbmRpcmVjdENSTCA8PSAwKSAmJiAhaWRwLT5vbmx5c29tZXJlYXNvbnMKKwkJJiYgKGlkcC0+b25seWF0dHIgPD0gMCkpCisJCUJJT19wcmludGYob3V0LCAiJSpzPEVNUFRZPlxuIiwgaW5kZW50LCAiIik7CisJCQorCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBpMnJfY3JsZHAoY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgdm9pZCAqcGNybGRwLCBCSU8gKm91dCwKKwkJICAgICBpbnQgaW5kZW50KQorCXsKKwlTVEFDS19PRihESVNUX1BPSU5UKSAqY3JsZCA9IHBjcmxkcDsKKwlESVNUX1BPSU5UICpwb2ludDsKKwlzaXplX3QgaTsKKwlmb3IoaSA9IDA7IGkgPCBza19ESVNUX1BPSU5UX251bShjcmxkKTsgaSsrKQorCQl7CisJCUJJT19wdXRzKG91dCwgIlxuIik7CisJCXBvaW50ID0gc2tfRElTVF9QT0lOVF92YWx1ZShjcmxkLCBpKTsKKwkJaWYocG9pbnQtPmRpc3Rwb2ludCkKKwkJCXByaW50X2Rpc3Rwb2ludChvdXQsIHBvaW50LT5kaXN0cG9pbnQsIGluZGVudCk7CisJCWlmKHBvaW50LT5yZWFzb25zKSAKKwkJCXByaW50X3JlYXNvbnMob3V0LCAiUmVhc29ucyIsIHBvaW50LT5yZWFzb25zLAorCQkJCQkJCQlpbmRlbnQpOworCQlpZihwb2ludC0+Q1JMaXNzdWVyKQorCQkJeworCQkJQklPX3ByaW50ZihvdXQsICIlKnNDUkwgSXNzdWVyOlxuIiwgaW5kZW50LCAiIik7CisJCQlwcmludF9nZW5zKG91dCwgcG9pbnQtPkNSTGlzc3VlciwgaW5kZW50KTsKKwkJCX0KKwkJfQorCXJldHVybiAxOworCX0KKworaW50IERJU1RfUE9JTlRfc2V0X2RwbmFtZShESVNUX1BPSU5UX05BTUUgKmRwbiwgWDUwOV9OQU1FICppbmFtZSkKKwl7CisJc2l6ZV90IGk7CisJU1RBQ0tfT0YoWDUwOV9OQU1FX0VOVFJZKSAqZnJhZzsKKwlYNTA5X05BTUVfRU5UUlkgKm5lOworCWlmICghZHBuIHx8IChkcG4tPnR5cGUgIT0gMSkpCisJCXJldHVybiAxOworCWZyYWcgPSBkcG4tPm5hbWUucmVsYXRpdmVuYW1lOworCWRwbi0+ZHBuYW1lID0gWDUwOV9OQU1FX2R1cChpbmFtZSk7CisJaWYgKCFkcG4tPmRwbmFtZSkKKwkJcmV0dXJuIDA7CisJZm9yIChpID0gMDsgaSA8IHNrX1g1MDlfTkFNRV9FTlRSWV9udW0oZnJhZyk7IGkrKykKKwkJeworCQluZSA9IHNrX1g1MDlfTkFNRV9FTlRSWV92YWx1ZShmcmFnLCBpKTsKKwkJaWYgKCFYNTA5X05BTUVfYWRkX2VudHJ5KGRwbi0+ZHBuYW1lLCBuZSwgLTEsIGkgPyAwIDogMSkpCisJCQl7CisJCQlYNTA5X05BTUVfZnJlZShkcG4tPmRwbmFtZSk7CisJCQlkcG4tPmRwbmFtZSA9IE5VTEw7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCS8qIGdlbmVyYXRlIGNhY2hlZCBlbmNvZGluZyBvZiBuYW1lICovCisJaWYgKGkyZF9YNTA5X05BTUUoZHBuLT5kcG5hbWUsIE5VTEwpIDwgMCkKKwkJeworCQlYNTA5X05BTUVfZnJlZShkcG4tPmRwbmFtZSk7CisJCWRwbi0+ZHBuYW1lID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gMTsKKwl9CmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOXYzL3YzX2VudW0uYyBiL2NyeXB0by94NTA5djMvdjNfZW51bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YTFiOGIKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOXYzL3YzX2VudW0uYwpAQCAtMCwwICsxLDk4IEBACisvKiB2M19lbnVtLmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAxOTk5LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9idWYuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisKKworc3RhdGljIEVOVU1FUkFURURfTkFNRVMgY3JsX3JlYXNvbnNbXSA9IHsKK3tDUkxfUkVBU09OX1VOU1BFQ0lGSUVELCAJICJVbnNwZWNpZmllZCIsICJ1bnNwZWNpZmllZCJ9LAore0NSTF9SRUFTT05fS0VZX0NPTVBST01JU0UsCSAiS2V5IENvbXByb21pc2UiLCAia2V5Q29tcHJvbWlzZSJ9LAore0NSTF9SRUFTT05fQ0FfQ09NUFJPTUlTRSwJICJDQSBDb21wcm9taXNlIiwgIkNBQ29tcHJvbWlzZSJ9LAore0NSTF9SRUFTT05fQUZGSUxJQVRJT05fQ0hBTkdFRCwgIkFmZmlsaWF0aW9uIENoYW5nZWQiLCAiYWZmaWxpYXRpb25DaGFuZ2VkIn0sCit7Q1JMX1JFQVNPTl9TVVBFUlNFREVELCAJICJTdXBlcnNlZGVkIiwgInN1cGVyc2VkZWQifSwKK3tDUkxfUkVBU09OX0NFU1NBVElPTl9PRl9PUEVSQVRJT04sCisJCQkiQ2Vzc2F0aW9uIE9mIE9wZXJhdGlvbiIsICJjZXNzYXRpb25PZk9wZXJhdGlvbiJ9LAore0NSTF9SRUFTT05fQ0VSVElGSUNBVEVfSE9MRCwJICJDZXJ0aWZpY2F0ZSBIb2xkIiwgImNlcnRpZmljYXRlSG9sZCJ9LAore0NSTF9SRUFTT05fUkVNT1ZFX0ZST01fQ1JMLAkgIlJlbW92ZSBGcm9tIENSTCIsICJyZW1vdmVGcm9tQ1JMIn0sCit7Q1JMX1JFQVNPTl9QUklWSUxFR0VfV0lUSERSQVdOLCAiUHJpdmlsZWdlIFdpdGhkcmF3biIsICJwcml2aWxlZ2VXaXRoZHJhd24ifSwKK3tDUkxfUkVBU09OX0FBX0NPTVBST01JU0UsCSAiQUEgQ29tcHJvbWlzZSIsICJBQUNvbXByb21pc2UifSwKK3stMSwgTlVMTCwgTlVMTH0KK307CisKK2NvbnN0IFg1MDlWM19FWFRfTUVUSE9EIHYzX2NybF9yZWFzb24gPSB7IAorTklEX2NybF9yZWFzb24sIDAsIEFTTjFfSVRFTV9yZWYoQVNOMV9FTlVNRVJBVEVEKSwKKzAsMCwwLDAsCisoWDUwOVYzX0VYVF9JMlMpaTJzX0FTTjFfRU5VTUVSQVRFRF9UQUJMRSwKKzAsCiswLDAsMCwwLAorY3JsX3JlYXNvbnN9OworCisKK2NoYXIgKmkyc19BU04xX0VOVU1FUkFURURfVEFCTEUoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwKKwkgICAgIEFTTjFfRU5VTUVSQVRFRCAqZSkKK3sKKwlFTlVNRVJBVEVEX05BTUVTICplbmFtOworCWxvbmcgc3RydmFsOworCXN0cnZhbCA9IEFTTjFfRU5VTUVSQVRFRF9nZXQoZSk7CisJZm9yKGVuYW0gPSBtZXRob2QtPnVzcl9kYXRhOyBlbmFtLT5sbmFtZTsgZW5hbSsrKSB7CisJCWlmKHN0cnZhbCA9PSBlbmFtLT5iaXRudW0pIHJldHVybiBCVUZfc3RyZHVwKGVuYW0tPmxuYW1lKTsKKwl9CisJcmV0dXJuIGkyc19BU04xX0VOVU1FUkFURUQobWV0aG9kLCBlKTsKK30KZGlmZiAtLWdpdCBhL2NyeXB0by94NTA5djMvdjNfZXh0a3UuYyBiL2NyeXB0by94NTA5djMvdjNfZXh0a3UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGI4YWY4Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3g1MDl2My92M19leHRrdS5jCkBAIC0wLDAgKzEsMTQ1IEBACisvKiB2M19leHRrdS5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY29uZi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorCisKK3N0YXRpYyB2b2lkICp2MmlfRVhURU5ERURfS0VZX1VTQUdFKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCisJCQkJICAgIFg1MDlWM19DVFggKmN0eCwKKwkJCQkgICAgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKm52YWwpOworc3RhdGljIFNUQUNLX09GKENPTkZfVkFMVUUpICppMnZfRVhURU5ERURfS0VZX1VTQUdFKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCisJCXZvaWQgKmVrdSwgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKmV4dGxpc3QpOworCitjb25zdCBYNTA5VjNfRVhUX01FVEhPRCB2M19leHRfa3UgPSB7CisJTklEX2V4dF9rZXlfdXNhZ2UsIDAsCisJQVNOMV9JVEVNX3JlZihFWFRFTkRFRF9LRVlfVVNBR0UpLAorCTAsMCwwLDAsCisJMCwwLAorCWkydl9FWFRFTkRFRF9LRVlfVVNBR0UsCisJdjJpX0VYVEVOREVEX0tFWV9VU0FHRSwKKwkwLDAsCisJTlVMTAorfTsKKworLyogTkIgT0NTUCBhY2NlcHRhYmxlIHJlc3BvbnNlcyBhbHNvIGlzIGEgU0VRVUVOQ0UgT0YgT0JKRUNUICovCitjb25zdCBYNTA5VjNfRVhUX01FVEhPRCB2M19vY3NwX2FjY3Jlc3AgPSB7CisJTklEX2lkX3BraXhfT0NTUF9hY2NlcHRhYmxlUmVzcG9uc2VzLCAwLAorCUFTTjFfSVRFTV9yZWYoRVhURU5ERURfS0VZX1VTQUdFKSwKKwkwLDAsMCwwLAorCTAsMCwKKwlpMnZfRVhURU5ERURfS0VZX1VTQUdFLAorCXYyaV9FWFRFTkRFRF9LRVlfVVNBR0UsCisJMCwwLAorCU5VTEwKK307CisKK0FTTjFfSVRFTV9URU1QTEFURShFWFRFTkRFRF9LRVlfVVNBR0UpID0gCisJQVNOMV9FWF9URU1QTEFURV9UWVBFKEFTTjFfVEZMR19TRVFVRU5DRV9PRiwgMCwgRVhURU5ERURfS0VZX1VTQUdFLCBBU04xX09CSkVDVCkKK0FTTjFfSVRFTV9URU1QTEFURV9FTkQoRVhURU5ERURfS0VZX1VTQUdFKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoRVhURU5ERURfS0VZX1VTQUdFKQorCitzdGF0aWMgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKgorICBpMnZfRVhURU5ERURfS0VZX1VTQUdFKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIHZvaWQgKmEsCisJCQkgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKmV4dF9saXN0KQoreworCUVYVEVOREVEX0tFWV9VU0FHRSAqZWt1ID0gYTsKKwlzaXplX3QgaTsKKwlBU04xX09CSkVDVCAqb2JqOworCWNoYXIgb2JqX3RtcFs4MF07CisJZm9yKGkgPSAwOyBpIDwgc2tfQVNOMV9PQkpFQ1RfbnVtKGVrdSk7IGkrKykgeworCQlvYmogPSBza19BU04xX09CSkVDVF92YWx1ZShla3UsIGkpOworCQlpMnRfQVNOMV9PQkpFQ1Qob2JqX3RtcCwgODAsIG9iaik7CisJCVg1MDlWM19hZGRfdmFsdWUoTlVMTCwgb2JqX3RtcCwgJmV4dF9saXN0KTsKKwl9CisJcmV0dXJuIGV4dF9saXN0OworfQorCitzdGF0aWMgdm9pZCAqdjJpX0VYVEVOREVEX0tFWV9VU0FHRShjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCQkJCSAgICBYNTA5VjNfQ1RYICpjdHgsIFNUQUNLX09GKENPTkZfVkFMVUUpICpudmFsKQoreworCUVYVEVOREVEX0tFWV9VU0FHRSAqZXh0a3U7CisJY2hhciAqZXh0dmFsOworCUFTTjFfT0JKRUNUICpvYmp0bXA7CisJQ09ORl9WQUxVRSAqdmFsOworCXNpemVfdCBpOworCisJaWYoIShleHRrdSA9IHNrX0FTTjFfT0JKRUNUX25ld19udWxsKCkpKSB7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgdjJpX0VYVEVOREVEX0tFWV9VU0FHRSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlmb3IoaSA9IDA7IGkgPCBza19DT05GX1ZBTFVFX251bShudmFsKTsgaSsrKSB7CisJCXZhbCA9IHNrX0NPTkZfVkFMVUVfdmFsdWUobnZhbCwgaSk7CisJCWlmKHZhbC0+dmFsdWUpIGV4dHZhbCA9IHZhbC0+dmFsdWU7CisJCWVsc2UgZXh0dmFsID0gdmFsLT5uYW1lOworCQlpZighKG9ianRtcCA9IE9CSl90eHQyb2JqKGV4dHZhbCwgMCkpKSB7CisJCQlza19BU04xX09CSkVDVF9wb3BfZnJlZShleHRrdSwgQVNOMV9PQkpFQ1RfZnJlZSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9FWFRFTkRFRF9LRVlfVVNBR0UsIFg1MDlWM19SX0lOVkFMSURfT0JKRUNUX0lERU5USUZJRVIpOworCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlza19BU04xX09CSkVDVF9wdXNoKGV4dGt1LCBvYmp0bXApOworCX0KKwlyZXR1cm4gZXh0a3U7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOXYzL3YzX2dlbm4uYyBiL2NyeXB0by94NTA5djMvdjNfZ2Vubi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMGE2OGQKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOXYzL3YzX2dlbm4uYwpAQCAtMCwwICsxLDI1MiBAQAorLyogdjNfZ2Vubi5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA4IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuICovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jb25mLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorCisKK0FTTjFfU0VRVUVOQ0UoT1RIRVJOQU1FKSA9IHsKKwlBU04xX1NJTVBMRShPVEhFUk5BTUUsIHR5cGVfaWQsIEFTTjFfT0JKRUNUKSwKKwkvKiBNYXliZSBoYXZlIGEgdHJ1ZSBBTlkgREVGSU5FRCBCWSBsYXRlciAqLworCUFTTjFfRVhQKE9USEVSTkFNRSwgdmFsdWUsIEFTTjFfQU5ZLCAwKQorfSBBU04xX1NFUVVFTkNFX0VORChPVEhFUk5BTUUpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhPVEhFUk5BTUUpCisKK0FTTjFfU0VRVUVOQ0UoRURJUEFSVFlOQU1FKSA9IHsKKwlBU04xX0lNUF9PUFQoRURJUEFSVFlOQU1FLCBuYW1lQXNzaWduZXIsIERJUkVDVE9SWVNUUklORywgMCksCisJQVNOMV9JTVBfT1BUKEVESVBBUlRZTkFNRSwgcGFydHlOYW1lLCBESVJFQ1RPUllTVFJJTkcsIDEpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKEVESVBBUlRZTkFNRSkKKworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKEVESVBBUlRZTkFNRSkKKworQVNOMV9DSE9JQ0UoR0VORVJBTF9OQU1FKSA9IHsKKwlBU04xX0lNUChHRU5FUkFMX05BTUUsIGQub3RoZXJOYW1lLCBPVEhFUk5BTUUsIEdFTl9PVEhFUk5BTUUpLAorCUFTTjFfSU1QKEdFTkVSQUxfTkFNRSwgZC5yZmM4MjJOYW1lLCBBU04xX0lBNVNUUklORywgR0VOX0VNQUlMKSwKKwlBU04xX0lNUChHRU5FUkFMX05BTUUsIGQuZE5TTmFtZSwgQVNOMV9JQTVTVFJJTkcsIEdFTl9ETlMpLAorCS8qIERvbid0IGRlY29kZSB0aGlzICovCisJQVNOMV9JTVAoR0VORVJBTF9OQU1FLCBkLng0MDBBZGRyZXNzLCBBU04xX1NFUVVFTkNFLCBHRU5fWDQwMCksCisJLyogWDUwOV9OQU1FIGlzIGEgQ0hPSUNFIHR5cGUgc28gdXNlIEVYUExJQ0lUICovCisJQVNOMV9FWFAoR0VORVJBTF9OQU1FLCBkLmRpcmVjdG9yeU5hbWUsIFg1MDlfTkFNRSwgR0VOX0RJUk5BTUUpLAorCUFTTjFfSU1QKEdFTkVSQUxfTkFNRSwgZC5lZGlQYXJ0eU5hbWUsIEVESVBBUlRZTkFNRSwgR0VOX0VESVBBUlRZKSwKKwlBU04xX0lNUChHRU5FUkFMX05BTUUsIGQudW5pZm9ybVJlc291cmNlSWRlbnRpZmllciwgQVNOMV9JQTVTVFJJTkcsIEdFTl9VUkkpLAorCUFTTjFfSU1QKEdFTkVSQUxfTkFNRSwgZC5pUEFkZHJlc3MsIEFTTjFfT0NURVRfU1RSSU5HLCBHRU5fSVBBREQpLAorCUFTTjFfSU1QKEdFTkVSQUxfTkFNRSwgZC5yZWdpc3RlcmVkSUQsIEFTTjFfT0JKRUNULCBHRU5fUklEKQorfSBBU04xX0NIT0lDRV9FTkQoR0VORVJBTF9OQU1FKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoR0VORVJBTF9OQU1FKQorCitBU04xX0lURU1fVEVNUExBVEUoR0VORVJBTF9OQU1FUykgPSAKKwlBU04xX0VYX1RFTVBMQVRFX1RZUEUoQVNOMV9URkxHX1NFUVVFTkNFX09GLCAwLCBHZW5lcmFsTmFtZXMsIEdFTkVSQUxfTkFNRSkKK0FTTjFfSVRFTV9URU1QTEFURV9FTkQoR0VORVJBTF9OQU1FUykKKworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKEdFTkVSQUxfTkFNRVMpCisKK0dFTkVSQUxfTkFNRSAqR0VORVJBTF9OQU1FX2R1cChHRU5FUkFMX05BTUUgKmEpCisJeworCXJldHVybiAoR0VORVJBTF9OQU1FICopIEFTTjFfZHVwKChpMmRfb2Zfdm9pZCAqKSBpMmRfR0VORVJBTF9OQU1FLAorCQkJCQkgKGQyaV9vZl92b2lkICopIGQyaV9HRU5FUkFMX05BTUUsCisJCQkJCSAoY2hhciAqKSBhKTsKKwl9CisKKy8qIFJldHVybnMgMCBpZiB0aGV5IGFyZSBlcXVhbCwgIT0gMCBvdGhlcndpc2UuICovCitpbnQgR0VORVJBTF9OQU1FX2NtcChHRU5FUkFMX05BTUUgKmEsIEdFTkVSQUxfTkFNRSAqYikKKwl7CisJaW50IHJlc3VsdCA9IC0xOworCisJaWYgKCFhIHx8ICFiIHx8IGEtPnR5cGUgIT0gYi0+dHlwZSkgcmV0dXJuIC0xOworCXN3aXRjaChhLT50eXBlKQorCQl7CisJY2FzZSBHRU5fWDQwMDoKKwljYXNlIEdFTl9FRElQQVJUWToKKwkJcmVzdWx0ID0gQVNOMV9UWVBFX2NtcChhLT5kLm90aGVyLCBiLT5kLm90aGVyKTsKKwkJYnJlYWs7CisKKwljYXNlIEdFTl9PVEhFUk5BTUU6CisJCXJlc3VsdCA9IE9USEVSTkFNRV9jbXAoYS0+ZC5vdGhlck5hbWUsIGItPmQub3RoZXJOYW1lKTsKKwkJYnJlYWs7CisKKwljYXNlIEdFTl9FTUFJTDoKKwljYXNlIEdFTl9ETlM6CisJY2FzZSBHRU5fVVJJOgorCQlyZXN1bHQgPSBBU04xX1NUUklOR19jbXAoYS0+ZC5pYTUsIGItPmQuaWE1KTsKKwkJYnJlYWs7CisKKwljYXNlIEdFTl9ESVJOQU1FOgorCQlyZXN1bHQgPSBYNTA5X05BTUVfY21wKGEtPmQuZGlybiwgYi0+ZC5kaXJuKTsKKwkJYnJlYWs7CisKKwljYXNlIEdFTl9JUEFERDoKKwkJcmVzdWx0ID0gQVNOMV9PQ1RFVF9TVFJJTkdfY21wKGEtPmQuaXAsIGItPmQuaXApOworCQlicmVhazsKKwkKKwljYXNlIEdFTl9SSUQ6CisJCXJlc3VsdCA9IE9CSl9jbXAoYS0+ZC5yaWQsIGItPmQucmlkKTsKKwkJYnJlYWs7CisJCX0KKwlyZXR1cm4gcmVzdWx0OworCX0KKworLyogUmV0dXJucyAwIGlmIHRoZXkgYXJlIGVxdWFsLCAhPSAwIG90aGVyd2lzZS4gKi8KK2ludCBPVEhFUk5BTUVfY21wKE9USEVSTkFNRSAqYSwgT1RIRVJOQU1FICpiKQorCXsKKwlpbnQgcmVzdWx0ID0gLTE7CisKKwlpZiAoIWEgfHwgIWIpIHJldHVybiAtMTsKKwkvKiBDaGVjayB0aGVpciB0eXBlIGZpcnN0LiAqLworCWlmICgocmVzdWx0ID0gT0JKX2NtcChhLT50eXBlX2lkLCBiLT50eXBlX2lkKSkgIT0gMCkKKwkJcmV0dXJuIHJlc3VsdDsKKwkvKiBDaGVjayB0aGUgdmFsdWUuICovCisJcmVzdWx0ID0gQVNOMV9UWVBFX2NtcChhLT52YWx1ZSwgYi0+dmFsdWUpOworCXJldHVybiByZXN1bHQ7CisJfQorCit2b2lkIEdFTkVSQUxfTkFNRV9zZXQwX3ZhbHVlKEdFTkVSQUxfTkFNRSAqYSwgaW50IHR5cGUsIHZvaWQgKnZhbHVlKQorCXsKKwlzd2l0Y2godHlwZSkKKwkJeworCWNhc2UgR0VOX1g0MDA6CisJY2FzZSBHRU5fRURJUEFSVFk6CisJCWEtPmQub3RoZXIgPSB2YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIEdFTl9PVEhFUk5BTUU6CisJCWEtPmQub3RoZXJOYW1lID0gdmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBHRU5fRU1BSUw6CisJY2FzZSBHRU5fRE5TOgorCWNhc2UgR0VOX1VSSToKKwkJYS0+ZC5pYTUgPSB2YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIEdFTl9ESVJOQU1FOgorCQlhLT5kLmRpcm4gPSB2YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIEdFTl9JUEFERDoKKwkJYS0+ZC5pcCA9IHZhbHVlOworCQlicmVhazsKKwkKKwljYXNlIEdFTl9SSUQ6CisJCWEtPmQucmlkID0gdmFsdWU7CisJCWJyZWFrOworCQl9CisJYS0+dHlwZSA9IHR5cGU7CisJfQorCit2b2lkICpHRU5FUkFMX05BTUVfZ2V0MF92YWx1ZShHRU5FUkFMX05BTUUgKmEsIGludCAqcHR5cGUpCisJeworCWlmIChwdHlwZSkKKwkJKnB0eXBlID0gYS0+dHlwZTsKKwlzd2l0Y2goYS0+dHlwZSkKKwkJeworCWNhc2UgR0VOX1g0MDA6CisJY2FzZSBHRU5fRURJUEFSVFk6CisJCXJldHVybiBhLT5kLm90aGVyOworCisJY2FzZSBHRU5fT1RIRVJOQU1FOgorCQlyZXR1cm4gYS0+ZC5vdGhlck5hbWU7CisKKwljYXNlIEdFTl9FTUFJTDoKKwljYXNlIEdFTl9ETlM6CisJY2FzZSBHRU5fVVJJOgorCQlyZXR1cm4gYS0+ZC5pYTU7CisKKwljYXNlIEdFTl9ESVJOQU1FOgorCQlyZXR1cm4gYS0+ZC5kaXJuOworCisJY2FzZSBHRU5fSVBBREQ6CisJCXJldHVybiBhLT5kLmlwOworCQorCWNhc2UgR0VOX1JJRDoKKwkJcmV0dXJuIGEtPmQucmlkOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisKK2ludCBHRU5FUkFMX05BTUVfc2V0MF9vdGhlcm5hbWUoR0VORVJBTF9OQU1FICpnZW4sCisJCQkJQVNOMV9PQkpFQ1QgKm9pZCwgQVNOMV9UWVBFICp2YWx1ZSkKKwl7CisJT1RIRVJOQU1FICpvdGg7CisJb3RoID0gT1RIRVJOQU1FX25ldygpOworCWlmICghb3RoKQorCQlyZXR1cm4gMDsKKwlvdGgtPnR5cGVfaWQgPSBvaWQ7CisJb3RoLT52YWx1ZSA9IHZhbHVlOworCUdFTkVSQUxfTkFNRV9zZXQwX3ZhbHVlKGdlbiwgR0VOX09USEVSTkFNRSwgb3RoKTsKKwlyZXR1cm4gMTsKKwl9CisKK2ludCBHRU5FUkFMX05BTUVfZ2V0MF9vdGhlck5hbWUoR0VORVJBTF9OQU1FICpnZW4sIAorCQkJCUFTTjFfT0JKRUNUICoqcG9pZCwgQVNOMV9UWVBFICoqcHZhbHVlKQorCXsKKwlpZiAoZ2VuLT50eXBlICE9IEdFTl9PVEhFUk5BTUUpCisJCXJldHVybiAwOworCWlmIChwb2lkKQorCQkqcG9pZCA9IGdlbi0+ZC5vdGhlck5hbWUtPnR5cGVfaWQ7CisJaWYgKHB2YWx1ZSkKKwkJKnB2YWx1ZSA9IGdlbi0+ZC5vdGhlck5hbWUtPnZhbHVlOworCXJldHVybiAxOworCX0KKwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3g1MDl2My92M19pYTUuYyBiL2NyeXB0by94NTA5djMvdjNfaWE1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRlZjA1YwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94NTA5djMvdjNfaWE1LmMKQEAgLTAsMCArMSwxMjAgQEAKKy8qIHYzX2lhNS5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jb25mLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworCitzdGF0aWMgY2hhciAqaTJzX0FTTjFfSUE1U1RSSU5HKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIEFTTjFfSUE1U1RSSU5HICppYTUpOworc3RhdGljIEFTTjFfSUE1U1RSSU5HICpzMmlfQVNOMV9JQTVTVFJJTkcoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgWDUwOVYzX0NUWCAqY3R4LCBjaGFyICpzdHIpOworY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgdjNfbnNfaWE1X2xpc3RbXSA9IHsgCitFWFRfSUE1U1RSSU5HKE5JRF9uZXRzY2FwZV9iYXNlX3VybCksCitFWFRfSUE1U1RSSU5HKE5JRF9uZXRzY2FwZV9yZXZvY2F0aW9uX3VybCksCitFWFRfSUE1U1RSSU5HKE5JRF9uZXRzY2FwZV9jYV9yZXZvY2F0aW9uX3VybCksCitFWFRfSUE1U1RSSU5HKE5JRF9uZXRzY2FwZV9yZW5ld2FsX3VybCksCitFWFRfSUE1U1RSSU5HKE5JRF9uZXRzY2FwZV9jYV9wb2xpY3lfdXJsKSwKK0VYVF9JQTVTVFJJTkcoTklEX25ldHNjYXBlX3NzbF9zZXJ2ZXJfbmFtZSksCitFWFRfSUE1U1RSSU5HKE5JRF9uZXRzY2FwZV9jb21tZW50KSwKK0VYVF9FTkQKK307CisKKworc3RhdGljIGNoYXIgKmkyc19BU04xX0lBNVNUUklORyhYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCSAgICAgQVNOMV9JQTVTVFJJTkcgKmlhNSkKK3sKKwljaGFyICp0bXA7CisJaWYoIWlhNSB8fCAhaWE1LT5sZW5ndGgpIHJldHVybiBOVUxMOworCWlmKCEodG1wID0gT1BFTlNTTF9tYWxsb2MoaWE1LT5sZW5ndGggKyAxKSkpIHsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBpMnNfQVNOMV9JQTVTVFJJTkcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbWNweSh0bXAsIGlhNS0+ZGF0YSwgaWE1LT5sZW5ndGgpOworCXRtcFtpYTUtPmxlbmd0aF0gPSAwOworCXJldHVybiB0bXA7Cit9CisKK3N0YXRpYyBBU04xX0lBNVNUUklORyAqczJpX0FTTjFfSUE1U1RSSU5HKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCisJICAgICBYNTA5VjNfQ1RYICpjdHgsIGNoYXIgKnN0cikKK3sKKwlBU04xX0lBNVNUUklORyAqaWE1OworCWlmKCFzdHIpIHsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBzMmlfQVNOMV9JQTVTVFJJTkcsIFg1MDlWM19SX0lOVkFMSURfTlVMTF9BUkdVTUVOVCk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZighKGlhNSA9IE1fQVNOMV9JQTVTVFJJTkdfbmV3KCkpKSBnb3RvIGVycjsKKwlpZighQVNOMV9TVFJJTkdfc2V0KChBU04xX1NUUklORyAqKWlhNSwgKHVuc2lnbmVkIGNoYXIqKXN0ciwKKwkJCSAgICBzdHJsZW4oc3RyKSkpIHsKKwkJTV9BU04xX0lBNVNUUklOR19mcmVlKGlhNSk7CisJCWdvdG8gZXJyOworCX0KKyNpZmRlZiBDSEFSU0VUX0VCQ0RJQworICAgICAgICBlYmNkaWMyYXNjaWkoaWE1LT5kYXRhLCBpYTUtPmRhdGEsIGlhNS0+bGVuZ3RoKTsKKyNlbmRpZiAvKkNIQVJTRVRfRUJDRElDKi8KKwlyZXR1cm4gaWE1OworCWVycjoKKwlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHMyaV9BU04xX0lBNVNUUklORywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCXJldHVybiBOVUxMOworfQorCmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOXYzL3YzX2luZm8uYyBiL2NyeXB0by94NTA5djMvdjNfaW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZjc0NGIKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOXYzL3YzX2luZm8uYwpAQCAtMCwwICsxLDE5OSBAQAorLyogdjNfaW5mby5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2J1Zi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY29uZi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisKKworc3RhdGljIFNUQUNLX09GKENPTkZfVkFMVUUpICppMnZfQVVUSE9SSVRZX0lORk9fQUNDRVNTKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCisJCQkJQVVUSE9SSVRZX0lORk9fQUNDRVNTICphaW5mbywKKwkJCQkJCVNUQUNLX09GKENPTkZfVkFMVUUpICpyZXQpOworc3RhdGljIEFVVEhPUklUWV9JTkZPX0FDQ0VTUyAqdjJpX0FVVEhPUklUWV9JTkZPX0FDQ0VTUyhYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCQkJCSBYNTA5VjNfQ1RYICpjdHgsIFNUQUNLX09GKENPTkZfVkFMVUUpICpudmFsKTsKKworY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgdjNfaW5mbyA9Cit7IE5JRF9pbmZvX2FjY2VzcywgWDUwOVYzX0VYVF9NVUxUSUxJTkUsIEFTTjFfSVRFTV9yZWYoQVVUSE9SSVRZX0lORk9fQUNDRVNTKSwKKzAsMCwwLDAsCiswLDAsCisoWDUwOVYzX0VYVF9JMlYpaTJ2X0FVVEhPUklUWV9JTkZPX0FDQ0VTUywKKyhYNTA5VjNfRVhUX1YySSl2MmlfQVVUSE9SSVRZX0lORk9fQUNDRVNTLAorMCwwLAorTlVMTH07CisKK2NvbnN0IFg1MDlWM19FWFRfTUVUSE9EIHYzX3NpbmZvID0KK3sgTklEX3NpbmZvX2FjY2VzcywgWDUwOVYzX0VYVF9NVUxUSUxJTkUsIEFTTjFfSVRFTV9yZWYoQVVUSE9SSVRZX0lORk9fQUNDRVNTKSwKKzAsMCwwLDAsCiswLDAsCisoWDUwOVYzX0VYVF9JMlYpaTJ2X0FVVEhPUklUWV9JTkZPX0FDQ0VTUywKKyhYNTA5VjNfRVhUX1YySSl2MmlfQVVUSE9SSVRZX0lORk9fQUNDRVNTLAorMCwwLAorTlVMTH07CisKK0FTTjFfU0VRVUVOQ0UoQUNDRVNTX0RFU0NSSVBUSU9OKSA9IHsKKwlBU04xX1NJTVBMRShBQ0NFU1NfREVTQ1JJUFRJT04sIG1ldGhvZCwgQVNOMV9PQkpFQ1QpLAorCUFTTjFfU0lNUExFKEFDQ0VTU19ERVNDUklQVElPTiwgbG9jYXRpb24sIEdFTkVSQUxfTkFNRSkKK30gQVNOMV9TRVFVRU5DRV9FTkQoQUNDRVNTX0RFU0NSSVBUSU9OKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoQUNDRVNTX0RFU0NSSVBUSU9OKQorCitBU04xX0lURU1fVEVNUExBVEUoQVVUSE9SSVRZX0lORk9fQUNDRVNTKSA9IAorCUFTTjFfRVhfVEVNUExBVEVfVFlQRShBU04xX1RGTEdfU0VRVUVOQ0VfT0YsIDAsIEdlbmVyYWxOYW1lcywgQUNDRVNTX0RFU0NSSVBUSU9OKQorQVNOMV9JVEVNX1RFTVBMQVRFX0VORChBVVRIT1JJVFlfSU5GT19BQ0NFU1MpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhBVVRIT1JJVFlfSU5GT19BQ0NFU1MpCisKK3N0YXRpYyBTVEFDS19PRihDT05GX1ZBTFVFKSAqaTJ2X0FVVEhPUklUWV9JTkZPX0FDQ0VTUyhYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCQkJCUFVVEhPUklUWV9JTkZPX0FDQ0VTUyAqYWluZm8sCisJCQkJCQlTVEFDS19PRihDT05GX1ZBTFVFKSAqcmV0KQoreworCUFDQ0VTU19ERVNDUklQVElPTiAqZGVzYzsKKwlzaXplX3QgaTsKKwlpbnQgbmxlbjsKKwljaGFyIG9ianRtcFs4MF0sICpudG1wOworCUNPTkZfVkFMVUUgKnZ0bXA7CisJZm9yKGkgPSAwOyBpIDwgc2tfQUNDRVNTX0RFU0NSSVBUSU9OX251bShhaW5mbyk7IGkrKykgeworCQlkZXNjID0gc2tfQUNDRVNTX0RFU0NSSVBUSU9OX3ZhbHVlKGFpbmZvLCBpKTsKKwkJcmV0ID0gaTJ2X0dFTkVSQUxfTkFNRShtZXRob2QsIGRlc2MtPmxvY2F0aW9uLCByZXQpOworCQlpZighcmV0KSBicmVhazsKKwkJdnRtcCA9IHNrX0NPTkZfVkFMVUVfdmFsdWUocmV0LCBpKTsKKwkJaTJ0X0FTTjFfT0JKRUNUKG9ianRtcCwgc2l6ZW9mIG9ianRtcCwgZGVzYy0+bWV0aG9kKTsKKwkJbmxlbiA9IHN0cmxlbihvYmp0bXApICsgc3RybGVuKHZ0bXAtPm5hbWUpICsgNTsKKwkJbnRtcCA9IE9QRU5TU0xfbWFsbG9jKG5sZW4pOworCQlpZighbnRtcCkgeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBpMnZfQVVUSE9SSVRZX0lORk9fQUNDRVNTLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlCVUZfc3RybGNweShudG1wLCBvYmp0bXAsIG5sZW4pOworCQlCVUZfc3RybGNhdChudG1wLCAiIC0gIiwgbmxlbik7CisJCUJVRl9zdHJsY2F0KG50bXAsIHZ0bXAtPm5hbWUsIG5sZW4pOworCQlPUEVOU1NMX2ZyZWUodnRtcC0+bmFtZSk7CisJCXZ0bXAtPm5hbWUgPSBudG1wOworCQkKKwl9CisJaWYoIXJldCkgcmV0dXJuIHNrX0NPTkZfVkFMVUVfbmV3X251bGwoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgQVVUSE9SSVRZX0lORk9fQUNDRVNTICp2MmlfQVVUSE9SSVRZX0lORk9fQUNDRVNTKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCisJCQkJIFg1MDlWM19DVFggKmN0eCwgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKm52YWwpCit7CisJQVVUSE9SSVRZX0lORk9fQUNDRVNTICphaW5mbyA9IE5VTEw7CisJQ09ORl9WQUxVRSAqY25mLCBjdG1wOworCUFDQ0VTU19ERVNDUklQVElPTiAqYWNjOworCXNpemVfdCBpOworCWludCBvYmpsZW47CisJY2hhciAqb2JqdG1wLCAqcHRtcDsKKwlpZighKGFpbmZvID0gc2tfQUNDRVNTX0RFU0NSSVBUSU9OX25ld19udWxsKCkpKSB7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgdjJpX0FVVEhPUklUWV9JTkZPX0FDQ0VTUywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJZm9yKGkgPSAwOyBpIDwgc2tfQ09ORl9WQUxVRV9udW0obnZhbCk7IGkrKykgeworCQljbmYgPSBza19DT05GX1ZBTFVFX3ZhbHVlKG52YWwsIGkpOworCQlpZighKGFjYyA9IEFDQ0VTU19ERVNDUklQVElPTl9uZXcoKSkKKwkJCXx8ICFza19BQ0NFU1NfREVTQ1JJUFRJT05fcHVzaChhaW5mbywgYWNjKSkgeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2MmlfQVVUSE9SSVRZX0lORk9fQUNDRVNTLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlnb3RvIGVycjsKKwkJfQorCQlwdG1wID0gc3RyY2hyKGNuZi0+bmFtZSwgJzsnKTsKKwkJaWYoIXB0bXApIHsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgdjJpX0FVVEhPUklUWV9JTkZPX0FDQ0VTUywgWDUwOVYzX1JfSU5WQUxJRF9TWU5UQVgpOworCQkJZ290byBlcnI7CisJCX0KKwkJb2JqbGVuID0gcHRtcCAtIGNuZi0+bmFtZTsKKwkJY3RtcC5uYW1lID0gcHRtcCArIDE7CisJCWN0bXAudmFsdWUgPSBjbmYtPnZhbHVlOworCQlpZighdjJpX0dFTkVSQUxfTkFNRV9leChhY2MtPmxvY2F0aW9uLCBtZXRob2QsIGN0eCwgJmN0bXAsIDApKQorCQkJCQkJCQkgZ290byBlcnI7IAorCQlpZighKG9ianRtcCA9IE9QRU5TU0xfbWFsbG9jKG9iamxlbiArIDEpKSkgeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2MmlfQVVUSE9SSVRZX0lORk9fQUNDRVNTLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlnb3RvIGVycjsKKwkJfQorCQlzdHJuY3B5KG9ianRtcCwgY25mLT5uYW1lLCBvYmpsZW4pOworCQlvYmp0bXBbb2JqbGVuXSA9IDA7CisJCWFjYy0+bWV0aG9kID0gT0JKX3R4dDJvYmoob2JqdG1wLCAwKTsKKwkJaWYoIWFjYy0+bWV0aG9kKSB7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9BVVRIT1JJVFlfSU5GT19BQ0NFU1MsIFg1MDlWM19SX0JBRF9PQkpFQ1QpOworCQkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJ2YWx1ZT0iLCBvYmp0bXApOworCQkJT1BFTlNTTF9mcmVlKG9ianRtcCk7CisJCQlnb3RvIGVycjsKKwkJfQorCQlPUEVOU1NMX2ZyZWUob2JqdG1wKTsKKworCX0KKwlyZXR1cm4gYWluZm87CisJZXJyOgorCXNrX0FDQ0VTU19ERVNDUklQVElPTl9wb3BfZnJlZShhaW5mbywgQUNDRVNTX0RFU0NSSVBUSU9OX2ZyZWUpOworCXJldHVybiBOVUxMOworfQorCitpbnQgaTJhX0FDQ0VTU19ERVNDUklQVElPTihCSU8gKmJwLCBBQ0NFU1NfREVTQ1JJUFRJT04qIGEpCisgICAgICAgIHsKKwlpMmFfQVNOMV9PQkpFQ1QoYnAsIGEtPm1ldGhvZCk7CisjaWZkZWYgVU5ERUYKKwlpMmFfR0VORVJBTF9OQU1FKGJwLCBhLT5sb2NhdGlvbik7CisjZW5kaWYKKwlyZXR1cm4gMjsKKwl9CmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOXYzL3YzX2ludC5jIGIvY3J5cHRvL3g1MDl2My92M19pbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2EyM2JkCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3g1MDl2My92M19pbnQuYwpAQCAtMCwwICsxLDg3IEBACisvKiB2M19pbnQuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDE5OTkuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvb2JqLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworCitjb25zdCBYNTA5VjNfRVhUX01FVEhPRCB2M19jcmxfbnVtID0geyAKKwlOSURfY3JsX251bWJlciwgMCwgQVNOMV9JVEVNX3JlZihBU04xX0lOVEVHRVIpLAorCTAsMCwwLDAsCisJKFg1MDlWM19FWFRfSTJTKWkyc19BU04xX0lOVEVHRVIsCisJMCwKKwkwLDAsMCwwLCBOVUxMfTsKKworY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgdjNfZGVsdGFfY3JsID0geyAKKwlOSURfZGVsdGFfY3JsLCAwLCBBU04xX0lURU1fcmVmKEFTTjFfSU5URUdFUiksCisJMCwwLDAsMCwKKwkoWDUwOVYzX0VYVF9JMlMpaTJzX0FTTjFfSU5URUdFUiwKKwkwLAorCTAsMCwwLDAsIE5VTEx9OworCitzdGF0aWMgdm9pZCAqIHMyaV9hc24xX2ludChYNTA5VjNfRVhUX01FVEhPRCAqbWV0aCwgWDUwOVYzX0NUWCAqY3R4LCBjaGFyICp2YWx1ZSkKKwl7CisJcmV0dXJuIHMyaV9BU04xX0lOVEVHRVIobWV0aCwgdmFsdWUpOworCX0KKworY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgdjNfaW5oaWJpdF9hbnlwID0geyAKKwlOSURfaW5oaWJpdF9hbnlfcG9saWN5LCAwLCBBU04xX0lURU1fcmVmKEFTTjFfSU5URUdFUiksCisJMCwwLDAsMCwKKwkoWDUwOVYzX0VYVF9JMlMpaTJzX0FTTjFfSU5URUdFUiwKKwkoWDUwOVYzX0VYVF9TMkkpczJpX2FzbjFfaW50LAorCTAsMCwwLDAsIE5VTEx9OwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3g1MDl2My92M19saWIuYyBiL2NyeXB0by94NTA5djMvdjNfbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkyMTQ5OQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94NTA5djMvdjNfbGliLmMKQEAgLTAsMCArMSwzMTIgQEAKKy8qIHYzX2xpYi5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworLyogWDUwOSB2MyBleHRlbnNpb24gdXRpbGl0aWVzICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9jb25mLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworI2luY2x1ZGUgImV4dF9kYXQuaCIKK3N0YXRpYyBTVEFDS19PRihYNTA5VjNfRVhUX01FVEhPRCkgKmV4dF9saXN0ID0gTlVMTDsKKworc3RhdGljIHZvaWQgZXh0X2xpc3RfZnJlZShYNTA5VjNfRVhUX01FVEhPRCAqZXh0KTsKKworc3RhdGljIGludCBleHRfc3RhY2tfY21wKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICoqYSwgY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKipiKQoreworCXJldHVybiAoKCphKS0+ZXh0X25pZCAtICgqYiktPmV4dF9uaWQpOworfQorCitpbnQgWDUwOVYzX0VYVF9hZGQoWDUwOVYzX0VYVF9NRVRIT0QgKmV4dCkKK3sKKwlpZighZXh0X2xpc3QgJiYgIShleHRfbGlzdCA9IHNrX1g1MDlWM19FWFRfTUVUSE9EX25ldyhleHRfc3RhY2tfY21wKSkpIHsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfRVhUX2FkZCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYoIXNrX1g1MDlWM19FWFRfTUVUSE9EX3B1c2goZXh0X2xpc3QsIGV4dCkpIHsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfRVhUX2FkZCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZXh0X2NtcChjb25zdCB2b2lkICp2b2lkX2EsCisJCSAgIGNvbnN0IHZvaWQgKnZvaWRfYikKK3sKKwljb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqKmEgPSAoY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QqKikgdm9pZF9hOworCWNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICoqYiA9IChjb25zdCBYNTA5VjNfRVhUX01FVEhPRCoqKSB2b2lkX2I7CisJcmV0dXJuIGV4dF9zdGFja19jbXAoYSwgYik7Cit9CisKK2NvbnN0IFg1MDlWM19FWFRfTUVUSE9EICpYNTA5VjNfRVhUX2dldF9uaWQoaW50IG5pZCkKK3sKKwlYNTA5VjNfRVhUX01FVEhPRCB0bXA7CisJY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKnQgPSAmdG1wLCAqIGNvbnN0ICpyZXQ7CisJc2l6ZV90IGlkeDsKKworCWlmKG5pZCA8IDApIHJldHVybiBOVUxMOworCXRtcC5leHRfbmlkID0gbmlkOworCXJldCA9IGJzZWFyY2goJnQsIHN0YW5kYXJkX2V4dHMsIFNUQU5EQVJEX0VYVEVOU0lPTl9DT1VOVCwgc2l6ZW9mKFg1MDlWM19FWFRfTUVUSE9EKiksIGV4dF9jbXApOworCWlmKHJldCkgcmV0dXJuICpyZXQ7CisJaWYoIWV4dF9saXN0KSByZXR1cm4gTlVMTDsKKworCWlmICghc2tfWDUwOVYzX0VYVF9NRVRIT0RfZmluZChleHRfbGlzdCwgJmlkeCwgJnRtcCkpCisJCXJldHVybiBOVUxMOworCXJldHVybiBza19YNTA5VjNfRVhUX01FVEhPRF92YWx1ZShleHRfbGlzdCwgaWR4KTsKK30KKworY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKlg1MDlWM19FWFRfZ2V0KFg1MDlfRVhURU5TSU9OICpleHQpCit7CisJaW50IG5pZDsKKwlpZigobmlkID0gT0JKX29iajJuaWQoZXh0LT5vYmplY3QpKSA9PSBOSURfdW5kZWYpIHJldHVybiBOVUxMOworCXJldHVybiBYNTA5VjNfRVhUX2dldF9uaWQobmlkKTsKK30KKworCitpbnQgWDUwOVYzX0VYVF9hZGRfbGlzdChYNTA5VjNfRVhUX01FVEhPRCAqZXh0bGlzdCkKK3sKKwlmb3IoO2V4dGxpc3QtPmV4dF9uaWQhPS0xO2V4dGxpc3QrKykgCisJCQlpZighWDUwOVYzX0VYVF9hZGQoZXh0bGlzdCkpIHJldHVybiAwOworCXJldHVybiAxOworfQorCitpbnQgWDUwOVYzX0VYVF9hZGRfYWxpYXMoaW50IG5pZF90bywgaW50IG5pZF9mcm9tKQoreworCWNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICpleHQ7CisJWDUwOVYzX0VYVF9NRVRIT0QgKnRtcGV4dDsKKworCWlmKCEoZXh0ID0gWDUwOVYzX0VYVF9nZXRfbmlkKG5pZF9mcm9tKSkpIHsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfRVhUX2FkZF9hbGlhcywgWDUwOVYzX1JfRVhURU5TSU9OX05PVF9GT1VORCk7CisJCXJldHVybiAwOworCX0KKwlpZighKHRtcGV4dCA9IChYNTA5VjNfRVhUX01FVEhPRCAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihYNTA5VjNfRVhUX01FVEhPRCkpKSkgeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19FWFRfYWRkX2FsaWFzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiAwOworCX0KKwkqdG1wZXh0ID0gKmV4dDsKKwl0bXBleHQtPmV4dF9uaWQgPSBuaWRfdG87CisJdG1wZXh0LT5leHRfZmxhZ3MgfD0gWDUwOVYzX0VYVF9EWU5BTUlDOworCXJldHVybiBYNTA5VjNfRVhUX2FkZCh0bXBleHQpOworfQorCit2b2lkIFg1MDlWM19FWFRfY2xlYW51cCh2b2lkKQoreworCXNrX1g1MDlWM19FWFRfTUVUSE9EX3BvcF9mcmVlKGV4dF9saXN0LCBleHRfbGlzdF9mcmVlKTsKKwlleHRfbGlzdCA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGV4dF9saXN0X2ZyZWUoWDUwOVYzX0VYVF9NRVRIT0QgKmV4dCkKK3sKKwlpZihleHQtPmV4dF9mbGFncyAmIFg1MDlWM19FWFRfRFlOQU1JQykgT1BFTlNTTF9mcmVlKGV4dCk7Cit9CisKKy8qIExlZ2FjeSBmdW5jdGlvbjogd2UgZG9uJ3QgbmVlZCB0byBhZGQgc3RhbmRhcmQgZXh0ZW5zaW9ucworICogYW55IG1vcmUgYmVjYXVzZSB0aGV5IGFyZSBub3cga2VwdCBpbiBleHRfZGF0LmguCisgKi8KKworaW50IFg1MDlWM19hZGRfc3RhbmRhcmRfZXh0ZW5zaW9ucyh2b2lkKQoreworCXJldHVybiAxOworfQorCisvKiBSZXR1cm4gYW4gZXh0ZW5zaW9uIGludGVybmFsIHN0cnVjdHVyZSAqLworCit2b2lkICpYNTA5VjNfRVhUX2QyaShYNTA5X0VYVEVOU0lPTiAqZXh0KQoreworCWNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2Q7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKworCWlmKCEobWV0aG9kID0gWDUwOVYzX0VYVF9nZXQoZXh0KSkpIHJldHVybiBOVUxMOworCXAgPSBleHQtPnZhbHVlLT5kYXRhOworCWlmKG1ldGhvZC0+aXQpIHJldHVybiBBU04xX2l0ZW1fZDJpKE5VTEwsICZwLCBleHQtPnZhbHVlLT5sZW5ndGgsIEFTTjFfSVRFTV9wdHIobWV0aG9kLT5pdCkpOworCXJldHVybiBtZXRob2QtPmQyaShOVUxMLCAmcCwgZXh0LT52YWx1ZS0+bGVuZ3RoKTsKK30KKworLyogR2V0IGNyaXRpY2FsIGZsYWcgYW5kIGRlY29kZWQgdmVyc2lvbiBvZiBleHRlbnNpb24gZnJvbSBhIE5JRC4KKyAqIFRoZSAiaWR4IiB2YXJpYWJsZSByZXR1cm5zIHRoZSBsYXN0IGZvdW5kIGV4dGVuc2lvbiBhbmQgY2FuCisgKiBiZSB1c2VkIHRvIHJldHJpZXZlIG11bHRpcGxlIGV4dGVuc2lvbnMgb2YgdGhlIHNhbWUgTklELgorICogSG93ZXZlciBtdWx0aXBsZSBleHRlbnNpb25zIHdpdGggdGhlIHNhbWUgTklEIGlzIHVzdWFsbHkKKyAqIGR1ZSB0byBhIGJhZGx5IGVuY29kZWQgY2VydGlmaWNhdGUgc28gaWYgaWR4IGlzIE5VTEwgd2UKKyAqIGNob2tlIGlmIG11bHRpcGxlIGV4dGVuc2lvbnMgZXhpc3QuCisgKiBUaGUgImNyaXQiIHZhcmlhYmxlIGlzIHNldCB0byB0aGUgY3JpdGljYWwgdmFsdWUuCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBkZWNvZGVkIGV4dGVuc2lvbiBvciBOVUxMIG9uCisgKiBlcnJvci4gVGhlIGFjdHVhbCBlcnJvciBjYW4gaGF2ZSBzZXZlcmFsIGRpZmZlcmVudCBjYXVzZXMsCisgKiB0aGUgdmFsdWUgb2YgKmNyaXQgcmVmbGVjdHMgdGhlIGNhdXNlOgorICogPj0gMCwgZXh0ZW5zaW9uIGZvdW5kIGJ1dCBub3QgZGVjb2RlZCAocmVmbGVjdHMgY3JpdGljYWwgdmFsdWUpLgorICogLTEgZXh0ZW5zaW9uIG5vdCBmb3VuZC4KKyAqIC0yIGV4dGVuc2lvbiBvY2N1cnMgbW9yZSB0aGFuIG9uY2UuCisgKi8KKwordm9pZCAqWDUwOVYzX2dldF9kMmkoU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICp4LCBpbnQgbmlkLCBpbnQgKmNyaXQsIGludCAqaWR4KQoreworCWludCBsYXN0cG9zOworCXNpemVfdCBpOworCVg1MDlfRVhURU5TSU9OICpleCwgKmZvdW5kX2V4ID0gTlVMTDsKKwlpZigheCkgeworCQlpZihpZHgpICppZHggPSAtMTsKKwkJaWYoY3JpdCkgKmNyaXQgPSAtMTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmKGlkeCkgbGFzdHBvcyA9ICppZHggKyAxOworCWVsc2UgbGFzdHBvcyA9IDA7CisJaWYobGFzdHBvcyA8IDApIGxhc3Rwb3MgPSAwOworCWZvcihpID0gbGFzdHBvczsgaSA8IHNrX1g1MDlfRVhURU5TSU9OX251bSh4KTsgaSsrKQorCXsKKwkJZXggPSBza19YNTA5X0VYVEVOU0lPTl92YWx1ZSh4LCBpKTsKKwkJaWYoT0JKX29iajJuaWQoZXgtPm9iamVjdCkgPT0gbmlkKSB7CisJCQlpZihpZHgpIHsKKwkJCQkqaWR4ID0gaTsKKwkJCQlmb3VuZF9leCA9IGV4OworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmKGZvdW5kX2V4KSB7CisJCQkJLyogRm91bmQgbW9yZSB0aGFuIG9uZSAqLworCQkJCWlmKGNyaXQpICpjcml0ID0gLTI7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQlmb3VuZF9leCA9IGV4OworCQl9CisJfQorCWlmKGZvdW5kX2V4KSB7CisJCS8qIEZvdW5kIGl0ICovCisJCWlmKGNyaXQpICpjcml0ID0gWDUwOV9FWFRFTlNJT05fZ2V0X2NyaXRpY2FsKGZvdW5kX2V4KTsKKwkJcmV0dXJuIFg1MDlWM19FWFRfZDJpKGZvdW5kX2V4KTsKKwl9CisKKwkvKiBFeHRlbnNpb24gbm90IGZvdW5kICovCisJaWYoaWR4KSAqaWR4ID0gLTE7CisJaWYoY3JpdCkgKmNyaXQgPSAtMTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBhIGdlbmVyYWwgZXh0ZW5zaW9uIGFwcGVuZCwgcmVwbGFjZSBhbmQgZGVsZXRlIHV0aWxpdHkuCisgKiBUaGUgcHJlY2lzZSBvcGVyYXRpb24gaXMgZ292ZXJuZWQgYnkgdGhlICdmbGFncycgdmFsdWUuIFRoZSAnY3JpdCcgYW5kCisgKiAndmFsdWUnIGFyZ3VtZW50cyAoaWYgcmVsZXZhbnQpIGFyZSB0aGUgZXh0ZW5zaW9ucyBpbnRlcm5hbCBzdHJ1Y3R1cmUuCisgKi8KKworaW50IFg1MDlWM19hZGQxX2kyZChTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKip4LCBpbnQgbmlkLCB2b2lkICp2YWx1ZSwKKwkJCQkJaW50IGNyaXQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJaW50IGV4dGlkeCA9IC0xOworCWludCBlcnJjb2RlOworCVg1MDlfRVhURU5TSU9OICpleHQsICpleHRtcDsKKwl1bnNpZ25lZCBsb25nIGV4dF9vcCA9IGZsYWdzICYgWDUwOVYzX0FERF9PUF9NQVNLOworCisJLyogSWYgYXBwZW5kaW5nIHdlIGRvbid0IGNhcmUgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UKKwkgKiBsb29rIGZvciBleGlzdGluZyBleHRlbnNpb24uCisJICovCisJaWYoZXh0X29wICE9IFg1MDlWM19BRERfQVBQRU5EKQorCQlleHRpZHggPSBYNTA5djNfZ2V0X2V4dF9ieV9OSUQoKngsIG5pZCwgLTEpOworCisJLyogU2VlIGlmIGV4dGVuc2lvbiBleGlzdHMgKi8KKwlpZihleHRpZHggPj0gMCkgeworCQkvKiBJZiBrZWVwIGV4aXN0aW5nLCBub3RoaW5nIHRvIGRvICovCisJCWlmKGV4dF9vcCA9PSBYNTA5VjNfQUREX0tFRVBfRVhJU1RJTkcpCisJCQlyZXR1cm4gMTsKKwkJLyogSWYgZGVmYXVsdCB0aGVuIGl0cyBhbiBlcnJvciAqLworCQlpZihleHRfb3AgPT0gWDUwOVYzX0FERF9ERUZBVUxUKSB7CisJCQllcnJjb2RlID0gWDUwOVYzX1JfRVhURU5TSU9OX0VYSVNUUzsKKwkJCWdvdG8gZXJyOworCQl9CisJCS8qIElmIGRlbGV0ZSwganVzdCBkZWxldGUgaXQgKi8KKwkJaWYoZXh0X29wID09IFg1MDlWM19BRERfREVMRVRFKSB7CisJCQlpZighc2tfWDUwOV9FWFRFTlNJT05fZGVsZXRlKCp4LCBleHRpZHgpKSByZXR1cm4gLTE7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIElmIHJlcGxhY2UgZXhpc3Rpbmcgb3IgZGVsZXRlLCBlcnJvciBzaW5jZSAKKwkJICogZXh0ZW5zaW9uIG11c3QgZXhpc3QKKwkJICovCisJCWlmKChleHRfb3AgPT0gWDUwOVYzX0FERF9SRVBMQUNFX0VYSVNUSU5HKSB8fAorCQkgICAoZXh0X29wID09IFg1MDlWM19BRERfREVMRVRFKSkgeworCQkJZXJyY29kZSA9IFg1MDlWM19SX0VYVEVOU0lPTl9OT1RfRk9VTkQ7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KKworCS8qIElmIHdlIGdldCB0aGlzIGZhciB0aGVuIHdlIGhhdmUgdG8gY3JlYXRlIGFuIGV4dGVuc2lvbjoKKwkgKiBjb3VsZCBoYXZlIHNvbWUgZmxhZ3MgZm9yIGFsdGVybmF0aXZlIGVuY29kaW5nIHNjaGVtZXMuLi4KKwkgKi8KKworCWV4dCA9IFg1MDlWM19FWFRfaTJkKG5pZCwgY3JpdCwgdmFsdWUpOworCisJaWYoIWV4dCkgeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19hZGQxX2kyZCwgWDUwOVYzX1JfRVJST1JfQ1JFQVRJTkdfRVhURU5TSU9OKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogSWYgZXh0ZW5zaW9uIGV4aXN0cyByZXBsYWNlIGl0Li4gKi8KKwlpZihleHRpZHggPj0gMCkgeworCQlleHRtcCA9IHNrX1g1MDlfRVhURU5TSU9OX3ZhbHVlKCp4LCBleHRpZHgpOworCQlYNTA5X0VYVEVOU0lPTl9mcmVlKGV4dG1wKTsKKwkJaWYoIXNrX1g1MDlfRVhURU5TSU9OX3NldCgqeCwgZXh0aWR4LCBleHQpKSByZXR1cm4gLTE7CisJCXJldHVybiAxOworCX0KKworCWlmKCEqeCAmJiAhKCp4ID0gc2tfWDUwOV9FWFRFTlNJT05fbmV3X251bGwoKSkpIHJldHVybiAtMTsKKwlpZighc2tfWDUwOV9FWFRFTlNJT05fcHVzaCgqeCwgZXh0KSkgcmV0dXJuIC0xOworCisJcmV0dXJuIDE7CisKKwllcnI6CisJaWYoIShmbGFncyAmIFg1MDlWM19BRERfU0lMRU5UKSkKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfYWRkMV9pMmQsIGVycmNvZGUpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3g1MDl2My92M19uY29ucy5jIGIvY3J5cHRvL3g1MDl2My92M19uY29ucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MGE3MjUKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOXYzL3YzX25jb25zLmMKQEAgLTAsMCArMSw1MTQgQEAKKy8qIHYzX25jb25zLmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY29uZi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisKKyNpZiAhZGVmaW5lZChPUEVOU1NMX1dJTkRPV1MpCisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisKKworc3RhdGljIHZvaWQgKnYyaV9OQU1FX0NPTlNUUkFJTlRTKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCisJCQkJICBYNTA5VjNfQ1RYICpjdHgsIFNUQUNLX09GKENPTkZfVkFMVUUpICpudmFsKTsKK3N0YXRpYyBpbnQgaTJyX05BTUVfQ09OU1RSQUlOVFMoY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgCisJCQkJdm9pZCAqYSwgQklPICpicCwgaW50IGluZCk7CitzdGF0aWMgaW50IGRvX2kycl9uYW1lX2NvbnN0cmFpbnRzKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCisJCQkJICAgU1RBQ0tfT0YoR0VORVJBTF9TVUJUUkVFKSAqdHJlZXMsCisJCQkJICAgQklPICpicCwgaW50IGluZCwgY2hhciAqbmFtZSk7CitzdGF0aWMgaW50IHByaW50X25jX2lwYWRkKEJJTyAqYnAsIEFTTjFfT0NURVRfU1RSSU5HICppcCk7CisKK3N0YXRpYyBpbnQgbmNfbWF0Y2goR0VORVJBTF9OQU1FICpnZW4sIE5BTUVfQ09OU1RSQUlOVFMgKm5jKTsKK3N0YXRpYyBpbnQgbmNfbWF0Y2hfc2luZ2xlKEdFTkVSQUxfTkFNRSAqc3ViLCBHRU5FUkFMX05BTUUgKmdlbik7CitzdGF0aWMgaW50IG5jX2RuKFg1MDlfTkFNRSAqc3ViLCBYNTA5X05BTUUgKm5tKTsKK3N0YXRpYyBpbnQgbmNfZG5zKEFTTjFfSUE1U1RSSU5HICpzdWIsIEFTTjFfSUE1U1RSSU5HICpkbnMpOworc3RhdGljIGludCBuY19lbWFpbChBU04xX0lBNVNUUklORyAqc3ViLCBBU04xX0lBNVNUUklORyAqZW1sKTsKK3N0YXRpYyBpbnQgbmNfdXJpKEFTTjFfSUE1U1RSSU5HICp1cmksIEFTTjFfSUE1U1RSSU5HICpiYXNlKTsKKworY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgdjNfbmFtZV9jb25zdHJhaW50cyA9IHsKKwlOSURfbmFtZV9jb25zdHJhaW50cywgMCwKKwlBU04xX0lURU1fcmVmKE5BTUVfQ09OU1RSQUlOVFMpLAorCTAsMCwwLDAsCisJMCwwLAorCTAsIHYyaV9OQU1FX0NPTlNUUkFJTlRTLAorCWkycl9OQU1FX0NPTlNUUkFJTlRTLDAsCisJTlVMTAorfTsKKworQVNOMV9TRVFVRU5DRShHRU5FUkFMX1NVQlRSRUUpID0geworCUFTTjFfU0lNUExFKEdFTkVSQUxfU1VCVFJFRSwgYmFzZSwgR0VORVJBTF9OQU1FKSwKKwlBU04xX0lNUF9PUFQoR0VORVJBTF9TVUJUUkVFLCBtaW5pbXVtLCBBU04xX0lOVEVHRVIsIDApLAorCUFTTjFfSU1QX09QVChHRU5FUkFMX1NVQlRSRUUsIG1heGltdW0sIEFTTjFfSU5URUdFUiwgMSkKK30gQVNOMV9TRVFVRU5DRV9FTkQoR0VORVJBTF9TVUJUUkVFKQorCitBU04xX1NFUVVFTkNFKE5BTUVfQ09OU1RSQUlOVFMpID0geworCUFTTjFfSU1QX1NFUVVFTkNFX09GX09QVChOQU1FX0NPTlNUUkFJTlRTLCBwZXJtaXR0ZWRTdWJ0cmVlcywKKwkJCQkJCQlHRU5FUkFMX1NVQlRSRUUsIDApLAorCUFTTjFfSU1QX1NFUVVFTkNFX09GX09QVChOQU1FX0NPTlNUUkFJTlRTLCBleGNsdWRlZFN1YnRyZWVzLAorCQkJCQkJCUdFTkVSQUxfU1VCVFJFRSwgMSksCit9IEFTTjFfU0VRVUVOQ0VfRU5EKE5BTUVfQ09OU1RSQUlOVFMpCisJCisKK0lNUExFTUVOVF9BU04xX0FMTE9DX0ZVTkNUSU9OUyhHRU5FUkFMX1NVQlRSRUUpCitJTVBMRU1FTlRfQVNOMV9BTExPQ19GVU5DVElPTlMoTkFNRV9DT05TVFJBSU5UUykKKworc3RhdGljIHZvaWQgKnYyaV9OQU1FX0NPTlNUUkFJTlRTKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCisJCQkJICBYNTA5VjNfQ1RYICpjdHgsIFNUQUNLX09GKENPTkZfVkFMVUUpICpudmFsKQorCXsKKwlzaXplX3QgaTsKKwlDT05GX1ZBTFVFIHR2YWwsICp2YWw7CisJU1RBQ0tfT0YoR0VORVJBTF9TVUJUUkVFKSAqKnB0cmVlID0gTlVMTDsKKwlOQU1FX0NPTlNUUkFJTlRTICpuY29ucyA9IE5VTEw7CisJR0VORVJBTF9TVUJUUkVFICpzdWIgPSBOVUxMOworCW5jb25zID0gTkFNRV9DT05TVFJBSU5UU19uZXcoKTsKKwlpZiAoIW5jb25zKQorCQlnb3RvIG1lbWVycjsKKwlmb3IoaSA9IDA7IGkgPCBza19DT05GX1ZBTFVFX251bShudmFsKTsgaSsrKQorCQl7CisJCXZhbCA9IHNrX0NPTkZfVkFMVUVfdmFsdWUobnZhbCwgaSk7CisJCWlmICghc3RybmNtcCh2YWwtPm5hbWUsICJwZXJtaXR0ZWQiLCA5KSAmJiB2YWwtPm5hbWVbOV0pCisJCQl7CisJCQlwdHJlZSA9ICZuY29ucy0+cGVybWl0dGVkU3VidHJlZXM7CisJCQl0dmFsLm5hbWUgPSB2YWwtPm5hbWUgKyAxMDsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cm5jbXAodmFsLT5uYW1lLCAiZXhjbHVkZWQiLCA4KSAmJiB2YWwtPm5hbWVbOF0pCisJCQl7CisJCQlwdHJlZSA9ICZuY29ucy0+ZXhjbHVkZWRTdWJ0cmVlczsKKwkJCXR2YWwubmFtZSA9IHZhbC0+bmFtZSArIDk7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgdjJpX05BTUVfQ09OU1RSQUlOVFMsIFg1MDlWM19SX0lOVkFMSURfU1lOVEFYKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQl0dmFsLnZhbHVlID0gdmFsLT52YWx1ZTsKKwkJc3ViID0gR0VORVJBTF9TVUJUUkVFX25ldygpOworCQlpZiAoIXYyaV9HRU5FUkFMX05BTUVfZXgoc3ViLT5iYXNlLCBtZXRob2QsIGN0eCwgJnR2YWwsIDEpKQorCQkJZ290byBlcnI7CisJCWlmICghKnB0cmVlKQorCQkJKnB0cmVlID0gc2tfR0VORVJBTF9TVUJUUkVFX25ld19udWxsKCk7CisJCWlmICghKnB0cmVlIHx8ICFza19HRU5FUkFMX1NVQlRSRUVfcHVzaCgqcHRyZWUsIHN1YikpCisJCQlnb3RvIG1lbWVycjsKKwkJc3ViID0gTlVMTDsKKwkJfQorCisJcmV0dXJuIG5jb25zOworCisJbWVtZXJyOgorCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgdjJpX05BTUVfQ09OU1RSQUlOVFMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwllcnI6CisJaWYgKG5jb25zKQorCQlOQU1FX0NPTlNUUkFJTlRTX2ZyZWUobmNvbnMpOworCWlmIChzdWIpCisJCUdFTkVSQUxfU1VCVFJFRV9mcmVlKHN1Yik7CisKKwlyZXR1cm4gTlVMTDsKKwl9CisJCQkKKworCQorCitzdGF0aWMgaW50IGkycl9OQU1FX0NPTlNUUkFJTlRTKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIHZvaWQgKmEsCisJCQkJQklPICpicCwgaW50IGluZCkKKwl7CisJTkFNRV9DT05TVFJBSU5UUyAqbmNvbnMgPSBhOworCWRvX2kycl9uYW1lX2NvbnN0cmFpbnRzKG1ldGhvZCwgbmNvbnMtPnBlcm1pdHRlZFN1YnRyZWVzLAorCQkJCQlicCwgaW5kLCAiUGVybWl0dGVkIik7CisJZG9faTJyX25hbWVfY29uc3RyYWludHMobWV0aG9kLCBuY29ucy0+ZXhjbHVkZWRTdWJ0cmVlcywKKwkJCQkJYnAsIGluZCwgIkV4Y2x1ZGVkIik7CisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IGRvX2kycl9uYW1lX2NvbnN0cmFpbnRzKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCisJCQkJICAgU1RBQ0tfT0YoR0VORVJBTF9TVUJUUkVFKSAqdHJlZXMsCisJCQkJICAgQklPICpicCwgaW50IGluZCwgY2hhciAqbmFtZSkKKwl7CisJR0VORVJBTF9TVUJUUkVFICp0cmVlOworCXNpemVfdCBpOworCWlmIChza19HRU5FUkFMX1NVQlRSRUVfbnVtKHRyZWVzKSA+IDApCisJCUJJT19wcmludGYoYnAsICIlKnMlczpcbiIsIGluZCwgIiIsIG5hbWUpOworCWZvcihpID0gMDsgaSA8IHNrX0dFTkVSQUxfU1VCVFJFRV9udW0odHJlZXMpOyBpKyspCisJCXsKKwkJdHJlZSA9IHNrX0dFTkVSQUxfU1VCVFJFRV92YWx1ZSh0cmVlcywgaSk7CisJCUJJT19wcmludGYoYnAsICIlKnMiLCBpbmQgKyAyLCAiIik7CisJCWlmICh0cmVlLT5iYXNlLT50eXBlID09IEdFTl9JUEFERCkKKwkJCXByaW50X25jX2lwYWRkKGJwLCB0cmVlLT5iYXNlLT5kLmlwKTsKKwkJZWxzZQorCQkJR0VORVJBTF9OQU1FX3ByaW50KGJwLCB0cmVlLT5iYXNlKTsKKwkJQklPX3B1dHMoYnAsICJcbiIpOworCQl9CisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IHByaW50X25jX2lwYWRkKEJJTyAqYnAsIEFTTjFfT0NURVRfU1RSSU5HICppcCkKKwl7CisJaW50IGksIGxlbjsKKwl1bnNpZ25lZCBjaGFyICpwOworCXAgPSBpcC0+ZGF0YTsKKwlsZW4gPSBpcC0+bGVuZ3RoOworCUJJT19wdXRzKGJwLCAiSVA6Iik7CisJaWYobGVuID09IDgpCisJCXsKKwkJQklPX3ByaW50ZihicCwgIiVkLiVkLiVkLiVkLyVkLiVkLiVkLiVkIiwKKwkJCQlwWzBdLCBwWzFdLCBwWzJdLCBwWzNdLAorCQkJCXBbNF0sIHBbNV0sIHBbNl0sIHBbN10pOworCQl9CisJZWxzZSBpZihsZW4gPT0gMzIpCisJCXsKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCQl7CisJCQlCSU9fcHJpbnRmKGJwLCAiJVgiLCBwWzBdIDw8IDggfCBwWzFdKTsKKwkJCXAgKz0gMjsKKwkJCWlmIChpID09IDcpCisJCQkJQklPX3B1dHMoYnAsICIvIik7CisJCQllbHNlIGlmIChpICE9IDE1KQorCQkJCUJJT19wdXRzKGJwLCAiOiIpOworCQkJfQorCQl9CisJZWxzZQorCQlCSU9fcHJpbnRmKGJwLCAiSVAgQWRkcmVzczo8aW52YWxpZD4iKTsKKwlyZXR1cm4gMTsKKwl9CisKKy8qIENoZWNrIGEgY2VydGlmaWNhdGUgY29uZm9ybXMgdG8gYSBzcGVjaWZpZWQgc2V0IG9mIGNvbnN0cmFpbnRzLgorICogUmV0dXJuIHZhbHVlczoKKyAqICBYNTA5X1ZfT0s6IEFsbCBjb25zdHJhaW50cyBvYmV5ZWQuCisgKiAgWDUwOV9WX0VSUl9QRVJNSVRURURfVklPTEFUSU9OOiBQZXJtaXR0ZWQgc3VidHJlZSB2aW9sYXRpb24uCisgKiAgWDUwOV9WX0VSUl9FWENMVURFRF9WSU9MQVRJT046IEV4Y2x1ZGVkIHN1YnRyZWUgdmlvbGF0aW9uLgorICogIFg1MDlfVl9FUlJfU1VCVFJFRV9NSU5NQVg6IE1pbiBvciBtYXggdmFsdWVzIHByZXNlbnQgYW5kIG1hdGNoaW5nIHR5cGUuCisgKiAgWDUwOV9WX0VSUl9VTlNVUFBPUlRFRF9DT05TVFJBSU5UX1RZUEU6ICBVbnN1cHBvcnRlZCBjb25zdHJhaW50IHR5cGUuCisgKiAgWDUwOV9WX0VSUl9VTlNVUFBPUlRFRF9DT05TVFJBSU5UX1NZTlRBWDogYmFkIHVuc3VwcG9ydGVkIGNvbnN0cmFpbnQgc3ludGF4LgorICogIFg1MDlfVl9FUlJfVU5TVVBQT1JURURfTkFNRV9TWU5UQVg6IGJhZCBvciB1bnN1cHBvcnRlZCBzeW50YXggb2YgbmFtZQorCisgKi8KKworaW50IE5BTUVfQ09OU1RSQUlOVFNfY2hlY2soWDUwOSAqeCwgTkFNRV9DT05TVFJBSU5UUyAqbmMpCisJeworCWludCByLCBpOworCXNpemVfdCBqOworCVg1MDlfTkFNRSAqbm07CisKKwlubSA9IFg1MDlfZ2V0X3N1YmplY3RfbmFtZSh4KTsKKworCWlmIChYNTA5X05BTUVfZW50cnlfY291bnQobm0pID4gMCkKKwkJeworCQlHRU5FUkFMX05BTUUgZ250bXA7CisJCWdudG1wLnR5cGUgPSBHRU5fRElSTkFNRTsKKwkJZ250bXAuZC5kaXJlY3RvcnlOYW1lID0gbm07CisKKwkJciA9IG5jX21hdGNoKCZnbnRtcCwgbmMpOworCisJCWlmIChyICE9IFg1MDlfVl9PSykKKwkJCXJldHVybiByOworCisJCWdudG1wLnR5cGUgPSBHRU5fRU1BSUw7CisKKworCQkvKiBQcm9jZXNzIGFueSBlbWFpbCBhZGRyZXNzIGF0dHJpYnV0ZXMgaW4gc3ViamVjdCBuYW1lICovCisKKwkJZm9yIChpID0gLTE7OykKKwkJCXsKKwkJCVg1MDlfTkFNRV9FTlRSWSAqbmU7CisJCQlpID0gWDUwOV9OQU1FX2dldF9pbmRleF9ieV9OSUQobm0sCisJCQkJCQkgICAgICAgTklEX3BrY3M5X2VtYWlsQWRkcmVzcywKKwkJCQkJCSAgICAgICBpKTsKKwkJCWlmIChpID09IC0xKQorCQkJCWJyZWFrOworCQkJbmUgPSBYNTA5X05BTUVfZ2V0X2VudHJ5KG5tLCBpKTsKKwkJCWdudG1wLmQucmZjODIyTmFtZSA9IFg1MDlfTkFNRV9FTlRSWV9nZXRfZGF0YShuZSk7CisJCQlpZiAoZ250bXAuZC5yZmM4MjJOYW1lLT50eXBlICE9IFZfQVNOMV9JQTVTVFJJTkcpCisJCQkJcmV0dXJuIFg1MDlfVl9FUlJfVU5TVVBQT1JURURfTkFNRV9TWU5UQVg7CisKKwkJCXIgPSBuY19tYXRjaCgmZ250bXAsIG5jKTsKKworCQkJaWYgKHIgIT0gWDUwOV9WX09LKQorCQkJCXJldHVybiByOworCQkJfQorCQkKKwkJfQorCisJZm9yIChqID0gMDsgaiA8IHNrX0dFTkVSQUxfTkFNRV9udW0oeC0+YWx0bmFtZSk7IGorKykKKwkJeworCQlHRU5FUkFMX05BTUUgKmdlbiA9IHNrX0dFTkVSQUxfTkFNRV92YWx1ZSh4LT5hbHRuYW1lLCBqKTsKKwkJciA9IG5jX21hdGNoKGdlbiwgbmMpOworCQlpZiAociAhPSBYNTA5X1ZfT0spCisJCQlyZXR1cm4gcjsKKwkJfQorCisJcmV0dXJuIFg1MDlfVl9PSzsKKworCX0KKworc3RhdGljIGludCBuY19tYXRjaChHRU5FUkFMX05BTUUgKmdlbiwgTkFNRV9DT05TVFJBSU5UUyAqbmMpCisJeworCUdFTkVSQUxfU1VCVFJFRSAqc3ViOworCWludCByLCBtYXRjaCA9IDA7CisJc2l6ZV90IGk7CisKKwkvKiBQZXJtaXR0ZWQgc3VidHJlZXM6IGlmIGFueSBzdWJ0cmVlcyBleGlzdCBvZiBtYXRjaGluZyB0aGUgdHlwZQorCSAqIGF0IGxlYXN0IG9uZSBzdWJ0cmVlIG11c3QgbWF0Y2guCisJICovCisKKwlmb3IgKGkgPSAwOyBpIDwgc2tfR0VORVJBTF9TVUJUUkVFX251bShuYy0+cGVybWl0dGVkU3VidHJlZXMpOyBpKyspCisJCXsKKwkJc3ViID0gc2tfR0VORVJBTF9TVUJUUkVFX3ZhbHVlKG5jLT5wZXJtaXR0ZWRTdWJ0cmVlcywgaSk7CisJCWlmIChnZW4tPnR5cGUgIT0gc3ViLT5iYXNlLT50eXBlKQorCQkJY29udGludWU7CisJCWlmIChzdWItPm1pbmltdW0gfHwgc3ViLT5tYXhpbXVtKQorCQkJcmV0dXJuIFg1MDlfVl9FUlJfU1VCVFJFRV9NSU5NQVg7CisJCS8qIElmIHdlIGFscmVhZHkgaGF2ZSBhIG1hdGNoIGRvbid0IGJvdGhlciB0cnlpbmcgYW55IG1vcmUgKi8KKwkJaWYgKG1hdGNoID09IDIpCisJCQljb250aW51ZTsKKwkJaWYgKG1hdGNoID09IDApCisJCQltYXRjaCA9IDE7CisJCXIgPSBuY19tYXRjaF9zaW5nbGUoZ2VuLCBzdWItPmJhc2UpOworCQlpZiAociA9PSBYNTA5X1ZfT0spCisJCQltYXRjaCA9IDI7CisJCWVsc2UgaWYgKHIgIT0gWDUwOV9WX0VSUl9QRVJNSVRURURfVklPTEFUSU9OKQorCQkJcmV0dXJuIHI7CisJCX0KKworCWlmIChtYXRjaCA9PSAxKQorCQlyZXR1cm4gWDUwOV9WX0VSUl9QRVJNSVRURURfVklPTEFUSU9OOworCisJLyogRXhjbHVkZWQgc3VidHJlZXM6IG11c3Qgbm90IG1hdGNoIGFueSBvZiB0aGVzZSAqLworCisJZm9yIChpID0gMDsgaSA8IHNrX0dFTkVSQUxfU1VCVFJFRV9udW0obmMtPmV4Y2x1ZGVkU3VidHJlZXMpOyBpKyspCisJCXsKKwkJc3ViID0gc2tfR0VORVJBTF9TVUJUUkVFX3ZhbHVlKG5jLT5leGNsdWRlZFN1YnRyZWVzLCBpKTsKKwkJaWYgKGdlbi0+dHlwZSAhPSBzdWItPmJhc2UtPnR5cGUpCisJCQljb250aW51ZTsKKwkJaWYgKHN1Yi0+bWluaW11bSB8fCBzdWItPm1heGltdW0pCisJCQlyZXR1cm4gWDUwOV9WX0VSUl9TVUJUUkVFX01JTk1BWDsKKworCQlyID0gbmNfbWF0Y2hfc2luZ2xlKGdlbiwgc3ViLT5iYXNlKTsKKwkJaWYgKHIgPT0gWDUwOV9WX09LKQorCQkJcmV0dXJuIFg1MDlfVl9FUlJfRVhDTFVERURfVklPTEFUSU9OOworCQllbHNlIGlmIChyICE9IFg1MDlfVl9FUlJfUEVSTUlUVEVEX1ZJT0xBVElPTikKKwkJCXJldHVybiByOworCisJCX0KKworCXJldHVybiBYNTA5X1ZfT0s7CisKKwl9CisKK3N0YXRpYyBpbnQgbmNfbWF0Y2hfc2luZ2xlKEdFTkVSQUxfTkFNRSAqZ2VuLCBHRU5FUkFMX05BTUUgKmJhc2UpCisJeworCXN3aXRjaChiYXNlLT50eXBlKQorCQl7CisJCWNhc2UgR0VOX0RJUk5BTUU6CisJCXJldHVybiBuY19kbihnZW4tPmQuZGlyZWN0b3J5TmFtZSwgYmFzZS0+ZC5kaXJlY3RvcnlOYW1lKTsKKworCQljYXNlIEdFTl9ETlM6CisJCXJldHVybiBuY19kbnMoZ2VuLT5kLmROU05hbWUsIGJhc2UtPmQuZE5TTmFtZSk7CisKKwkJY2FzZSBHRU5fRU1BSUw6CisJCXJldHVybiBuY19lbWFpbChnZW4tPmQucmZjODIyTmFtZSwgYmFzZS0+ZC5yZmM4MjJOYW1lKTsKKworCQljYXNlIEdFTl9VUkk6CisJCXJldHVybiBuY191cmkoZ2VuLT5kLnVuaWZvcm1SZXNvdXJjZUlkZW50aWZpZXIsCisJCQkJCWJhc2UtPmQudW5pZm9ybVJlc291cmNlSWRlbnRpZmllcik7CisKKwkJZGVmYXVsdDoKKwkJcmV0dXJuIFg1MDlfVl9FUlJfVU5TVVBQT1JURURfQ09OU1RSQUlOVF9UWVBFOworCQl9CisKKwl9CisKKy8qIGRpcmVjdG9yeU5hbWUgbmFtZSBjb25zdHJhaW50IG1hdGNoaW5nLgorICogVGhlIGNhbm9uaWNhbCBlbmNvZGluZyBvZiBYNTA5X05BTUUgbWFrZXMgdGhpcyBjb21wYXJpc29uIGVhc3kuIEl0IGlzCisgKiBtYXRjaGVkIGlmIHRoZSBzdWJ0cmVlIGlzIGEgc3Vic2V0IG9mIHRoZSBuYW1lLgorICovCisKK3N0YXRpYyBpbnQgbmNfZG4oWDUwOV9OQU1FICpubSwgWDUwOV9OQU1FICpiYXNlKQorCXsKKwkvKiBFbnN1cmUgY2Fub25pY2FsIGVuY29kaW5ncyBhcmUgdXAgdG8gZGF0ZS4gICovCisJaWYgKG5tLT5tb2RpZmllZCAmJiBpMmRfWDUwOV9OQU1FKG5tLCBOVUxMKSA8IDApCisJCXJldHVybiBYNTA5X1ZfRVJSX09VVF9PRl9NRU07CisJaWYgKGJhc2UtPm1vZGlmaWVkICYmIGkyZF9YNTA5X05BTUUoYmFzZSwgTlVMTCkgPCAwKQorCQlyZXR1cm4gWDUwOV9WX0VSUl9PVVRfT0ZfTUVNOworCWlmIChiYXNlLT5jYW5vbl9lbmNsZW4gPiBubS0+Y2Fub25fZW5jbGVuKQorCQlyZXR1cm4gWDUwOV9WX0VSUl9QRVJNSVRURURfVklPTEFUSU9OOworCWlmIChtZW1jbXAoYmFzZS0+Y2Fub25fZW5jLCBubS0+Y2Fub25fZW5jLCBiYXNlLT5jYW5vbl9lbmNsZW4pKQorCQlyZXR1cm4gWDUwOV9WX0VSUl9QRVJNSVRURURfVklPTEFUSU9OOworCXJldHVybiBYNTA5X1ZfT0s7CisJfQorCitzdGF0aWMgaW50IG5jX2RucyhBU04xX0lBNVNUUklORyAqZG5zLCBBU04xX0lBNVNUUklORyAqYmFzZSkKKwl7CisJY2hhciAqYmFzZXB0ciA9IChjaGFyICopYmFzZS0+ZGF0YTsKKwljaGFyICpkbnNwdHIgPSAoY2hhciAqKWRucy0+ZGF0YTsKKwkvKiBFbXB0eSBtYXRjaGVzIGV2ZXJ5dGhpbmcgKi8KKwlpZiAoISpiYXNlcHRyKQorCQlyZXR1cm4gWDUwOV9WX09LOworCS8qIE90aGVyd2lzZSBjYW4gYWRkIHplcm8gb3IgbW9yZSBjb21wb25lbnRzIG9uIHRoZSBsZWZ0IHNvCisJICogY29tcGFyZSBSSFMgYW5kIGlmIGRucyBpcyBsb25nZXIgYW5kIGV4cGVjdCAnLicgYXMgcHJlY2VkaW5nCisJICogY2hhcmFjdGVyLgorCSAqLworCWlmIChkbnMtPmxlbmd0aCA+IGJhc2UtPmxlbmd0aCkKKwkJeworCQlkbnNwdHIgKz0gZG5zLT5sZW5ndGggLSBiYXNlLT5sZW5ndGg7CisJCWlmIChkbnNwdHJbLTFdICE9ICcuJykKKwkJCXJldHVybiBYNTA5X1ZfRVJSX1BFUk1JVFRFRF9WSU9MQVRJT047CisJCX0KKworCWlmIChzdHJjYXNlY21wKGJhc2VwdHIsIGRuc3B0cikpCisJCQlyZXR1cm4gWDUwOV9WX0VSUl9QRVJNSVRURURfVklPTEFUSU9OOworCisJcmV0dXJuIFg1MDlfVl9PSzsKKworCX0KKworc3RhdGljIGludCBuY19lbWFpbChBU04xX0lBNVNUUklORyAqZW1sLCBBU04xX0lBNVNUUklORyAqYmFzZSkKKwl7CisJY29uc3QgY2hhciAqYmFzZXB0ciA9IChjaGFyICopYmFzZS0+ZGF0YTsKKwljb25zdCBjaGFyICplbWxwdHIgPSAoY2hhciAqKWVtbC0+ZGF0YTsKKworCWNvbnN0IGNoYXIgKmJhc2VhdCA9IHN0cmNocihiYXNlcHRyLCAnQCcpOworCWNvbnN0IGNoYXIgKmVtbGF0ID0gc3RyY2hyKGVtbHB0ciwgJ0AnKTsKKwlpZiAoIWVtbGF0KQorCQlyZXR1cm4gWDUwOV9WX0VSUl9VTlNVUFBPUlRFRF9OQU1FX1NZTlRBWDsKKwkvKiBTcGVjaWFsIGNhc2U6IGluaXRhbCAnLicgaXMgUkhTIG1hdGNoICovCisJaWYgKCFiYXNlYXQgJiYgKCpiYXNlcHRyID09ICcuJykpCisJCXsKKwkJaWYgKGVtbC0+bGVuZ3RoID4gYmFzZS0+bGVuZ3RoKQorCQkJeworCQkJZW1scHRyICs9IGVtbC0+bGVuZ3RoIC0gYmFzZS0+bGVuZ3RoOworCQkJaWYgKCFzdHJjYXNlY21wKGJhc2VwdHIsIGVtbHB0cikpCisJCQkJcmV0dXJuIFg1MDlfVl9PSzsKKwkJCX0KKwkJcmV0dXJuIFg1MDlfVl9FUlJfUEVSTUlUVEVEX1ZJT0xBVElPTjsKKwkJfQorCisJLyogSWYgd2UgaGF2ZSBhbnl0aGluZyBiZWZvcmUgJ0AnIG1hdGNoIGxvY2FsIHBhcnQgKi8KKworCWlmIChiYXNlYXQpCisJCXsKKwkJaWYgKGJhc2VhdCAhPSBiYXNlcHRyKQorCQkJeworCQkJaWYgKChiYXNlYXQgLSBiYXNlcHRyKSAhPSAoZW1sYXQgLSBlbWxwdHIpKQorCQkJCXJldHVybiBYNTA5X1ZfRVJSX1BFUk1JVFRFRF9WSU9MQVRJT047CisJCQkvKiBDYXNlIHNlbnNpdGl2ZSBtYXRjaCBvZiBsb2NhbCBwYXJ0ICovCisJCQlpZiAoc3RybmNtcChiYXNlcHRyLCBlbWxwdHIsIGVtbGF0IC0gZW1scHRyKSkKKwkJCQlyZXR1cm4gWDUwOV9WX0VSUl9QRVJNSVRURURfVklPTEFUSU9OOworCQkJfQorCQkvKiBQb3NpdGlvbiBiYXNlIGFmdGVyICdAJyAqLworCQliYXNlcHRyID0gYmFzZWF0ICsgMTsKKwkJfQorCWVtbHB0ciA9IGVtbGF0ICsgMTsKKwkvKiBKdXN0IGhhdmUgaG9zdG5hbWUgbGVmdCB0byBtYXRjaDogY2FzZSBpbnNlbnNpdGl2ZSAqLworCWlmIChzdHJjYXNlY21wKGJhc2VwdHIsIGVtbHB0cikpCisJCXJldHVybiBYNTA5X1ZfRVJSX1BFUk1JVFRFRF9WSU9MQVRJT047CisKKwlyZXR1cm4gWDUwOV9WX09LOworCisJfQorCitzdGF0aWMgaW50IG5jX3VyaShBU04xX0lBNVNUUklORyAqdXJpLCBBU04xX0lBNVNUUklORyAqYmFzZSkKKwl7CisJY29uc3QgY2hhciAqYmFzZXB0ciA9IChjaGFyICopYmFzZS0+ZGF0YTsKKwljb25zdCBjaGFyICpob3N0cHRyID0gKGNoYXIgKil1cmktPmRhdGE7CisJY29uc3QgY2hhciAqcCA9IHN0cmNocihob3N0cHRyLCAnOicpOworCWludCBob3N0bGVuOworCS8qIENoZWNrIGZvciBmb286Ly8gYW5kIHNraXAgcGFzdCBpdCAqLworCWlmICghcCB8fCAocFsxXSAhPSAnLycpIHx8IChwWzJdICE9ICcvJykpCisJCXJldHVybiBYNTA5X1ZfRVJSX1VOU1VQUE9SVEVEX05BTUVfU1lOVEFYOworCWhvc3RwdHIgPSBwICsgMzsKKworCS8qIERldGVybWluZSBsZW5ndGggb2YgaG9zdG5hbWUgcGFydCBvZiBVUkkgKi8KKworCS8qIExvb2sgZm9yIGEgcG9ydCBpbmRpY2F0b3IgYXMgZW5kIG9mIGhvc3RuYW1lIGZpcnN0ICovCisKKwlwID0gc3RyY2hyKGhvc3RwdHIsICc6Jyk7CisJLyogT3RoZXJ3aXNlIGxvb2sgZm9yIHRyYWlsaW5nIHNsYXNoICovCisJaWYgKCFwKQorCQlwID0gc3RyY2hyKGhvc3RwdHIsICcvJyk7CisKKwlpZiAoIXApCisJCWhvc3RsZW4gPSBzdHJsZW4oaG9zdHB0cik7CisJZWxzZQorCQlob3N0bGVuID0gcCAtIGhvc3RwdHI7CisKKwlpZiAoaG9zdGxlbiA9PSAwKQorCQlyZXR1cm4gWDUwOV9WX0VSUl9VTlNVUFBPUlRFRF9OQU1FX1NZTlRBWDsKKworCS8qIFNwZWNpYWwgY2FzZTogaW5pdGFsICcuJyBpcyBSSFMgbWF0Y2ggKi8KKwlpZiAoKmJhc2VwdHIgPT0gJy4nKQorCQl7CisJCWlmIChob3N0bGVuID4gYmFzZS0+bGVuZ3RoKQorCQkJeworCQkJcCA9IGhvc3RwdHIgKyBob3N0bGVuIC0gYmFzZS0+bGVuZ3RoOworCQkJaWYgKCFzdHJuY2FzZWNtcChwLCBiYXNlcHRyLCBiYXNlLT5sZW5ndGgpKQorCQkJCXJldHVybiBYNTA5X1ZfT0s7CisJCQl9CisJCXJldHVybiBYNTA5X1ZfRVJSX1BFUk1JVFRFRF9WSU9MQVRJT047CisJCX0KKworCWlmICgoYmFzZS0+bGVuZ3RoICE9IChpbnQpaG9zdGxlbikgfHwgc3RybmNhc2VjbXAoaG9zdHB0ciwgYmFzZXB0ciwgaG9zdGxlbikpCisJCXJldHVybiBYNTA5X1ZfRVJSX1BFUk1JVFRFRF9WSU9MQVRJT047CisKKwlyZXR1cm4gWDUwOV9WX09LOworCisJfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3g1MDl2My92M19wY2kuYyBiL2NyeXB0by94NTA5djMvdjNfcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYwYjFjOAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94NTA5djMvdjNfcGNpLmMKQEAgLTAsMCArMSwzMzMgQEAKKy8qIHYzX3BjaS5jIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBDb250cmlidXRlZCB0byB0aGUgT3BlblNTTCBQcm9qZWN0IDIwMDQKKyAqIGJ5IFJpY2hhcmQgTGV2aXR0ZSAocmljaGFyZEBsZXZpdHRlLm9yZykKKyAqLworLyogQ29weXJpZ2h0IChjKSAyMDA0IEt1bmdsaWdhIFRla25pc2thIEj2Z3Nrb2xhbgorICogKFJveWFsIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBTdG9ja2hvbG0sIFN3ZWRlbikuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgSW5zdGl0dXRlIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBJTlNUSVRVVEUgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBJTlNUSVRVVEUgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvY29uZi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisKKworc3RhdGljIGludCBpMnJfcGNpKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIFBST1hZX0NFUlRfSU5GT19FWFRFTlNJT04gKmV4dCwKKwlCSU8gKm91dCwgaW50IGluZGVudCk7CitzdGF0aWMgUFJPWFlfQ0VSVF9JTkZPX0VYVEVOU0lPTiAqcjJpX3BjaShYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCVg1MDlWM19DVFggKmN0eCwgY2hhciAqc3RyKTsKKworY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgdjNfcGNpID0KKwl7IE5JRF9wcm94eUNlcnRJbmZvLCAwLCBBU04xX0lURU1fcmVmKFBST1hZX0NFUlRfSU5GT19FWFRFTlNJT04pLAorCSAgMCwwLDAsMCwKKwkgIDAsMCwKKwkgIE5VTEwsIE5VTEwsCisJICAoWDUwOVYzX0VYVF9JMlIpaTJyX3BjaSwKKwkgIChYNTA5VjNfRVhUX1IySSlyMmlfcGNpLAorCSAgTlVMTCwKKwl9OworCitzdGF0aWMgaW50IGkycl9wY2koWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgUFJPWFlfQ0VSVF9JTkZPX0VYVEVOU0lPTiAqcGNpLAorCUJJTyAqb3V0LCBpbnQgaW5kZW50KQorCXsKKwlCSU9fcHJpbnRmKG91dCwgIiUqc1BhdGggTGVuZ3RoIENvbnN0cmFpbnQ6ICIsIGluZGVudCwgIiIpOworCWlmIChwY2ktPnBjUGF0aExlbmd0aENvbnN0cmFpbnQpCisJICBpMmFfQVNOMV9JTlRFR0VSKG91dCwgcGNpLT5wY1BhdGhMZW5ndGhDb25zdHJhaW50KTsKKwllbHNlCisJICBCSU9fcHJpbnRmKG91dCwgImluZmluaXRlIik7CisJQklPX3B1dHMob3V0LCAiXG4iKTsKKwlCSU9fcHJpbnRmKG91dCwgIiUqc1BvbGljeSBMYW5ndWFnZTogIiwgaW5kZW50LCAiIik7CisJaTJhX0FTTjFfT0JKRUNUKG91dCwgcGNpLT5wcm94eVBvbGljeS0+cG9saWN5TGFuZ3VhZ2UpOworCUJJT19wdXRzKG91dCwgIlxuIik7CisJaWYgKHBjaS0+cHJveHlQb2xpY3ktPnBvbGljeSAmJiBwY2ktPnByb3h5UG9saWN5LT5wb2xpY3ktPmRhdGEpCisJICBCSU9fcHJpbnRmKG91dCwgIiUqc1BvbGljeSBUZXh0OiAlc1xuIiwgaW5kZW50LCAiIiwKKwkJICAgICBwY2ktPnByb3h5UG9saWN5LT5wb2xpY3ktPmRhdGEpOworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBwcm9jZXNzX3BjaV92YWx1ZShDT05GX1ZBTFVFICp2YWwsCisJQVNOMV9PQkpFQ1QgKipsYW5ndWFnZSwgQVNOMV9JTlRFR0VSICoqcGF0aGxlbiwKKwlBU04xX09DVEVUX1NUUklORyAqKnBvbGljeSkKKwl7CisJaW50IGZyZWVfcG9saWN5ID0gMDsKKworCWlmIChzdHJjbXAodmFsLT5uYW1lLCAibGFuZ3VhZ2UiKSA9PSAwKQorCQl7CisJCWlmICgqbGFuZ3VhZ2UpCisJCQl7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHByb2Nlc3NfcGNpX3ZhbHVlLCBYNTA5VjNfUl9QT0xJQ1lfTEFOR1VBR0VfQUxSRUFEWV9ERUZJTkVEKTsKKwkJCVg1MDlWM19jb25mX2Vycih2YWwpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCWlmICghKCpsYW5ndWFnZSA9IE9CSl90eHQyb2JqKHZhbC0+dmFsdWUsIDApKSkKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcHJvY2Vzc19wY2lfdmFsdWUsIFg1MDlWM19SX0lOVkFMSURfT0JKRUNUX0lERU5USUZJRVIpOworCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCWVsc2UgaWYgKHN0cmNtcCh2YWwtPm5hbWUsICJwYXRobGVuIikgPT0gMCkKKwkJeworCQlpZiAoKnBhdGhsZW4pCisJCQl7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHByb2Nlc3NfcGNpX3ZhbHVlLCBYNTA5VjNfUl9QT0xJQ1lfUEFUSF9MRU5HVEhfQUxSRUFEWV9ERUZJTkVEKTsKKwkJCVg1MDlWM19jb25mX2Vycih2YWwpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCWlmICghWDUwOVYzX2dldF92YWx1ZV9pbnQodmFsLCBwYXRobGVuKSkKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcHJvY2Vzc19wY2lfdmFsdWUsIFg1MDlWM19SX1BPTElDWV9QQVRIX0xFTkdUSCk7CisJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKKwkJCXJldHVybiAwOworCQkJfQorCQl9CisJZWxzZSBpZiAoc3RyY21wKHZhbC0+bmFtZSwgInBvbGljeSIpID09IDApCisJCXsKKwkJdW5zaWduZWQgY2hhciAqdG1wX2RhdGEgPSBOVUxMOworCQlsb25nIHZhbF9sZW47CisJCWlmICghKnBvbGljeSkKKwkJCXsKKwkJCSpwb2xpY3kgPSBBU04xX09DVEVUX1NUUklOR19uZXcoKTsKKwkJCWlmICghKnBvbGljeSkKKwkJCQl7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBwcm9jZXNzX3BjaV92YWx1ZSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCVg1MDlWM19jb25mX2Vycih2YWwpOworCQkJCXJldHVybiAwOworCQkJCX0KKwkJCWZyZWVfcG9saWN5ID0gMTsKKwkJCX0KKwkJaWYgKHN0cm5jbXAodmFsLT52YWx1ZSwgImhleDoiLCA0KSA9PSAwKQorCQkJeworCQkJdW5zaWduZWQgY2hhciAqdG1wX2RhdGEyID0KKwkJCQlzdHJpbmdfdG9faGV4KHZhbC0+dmFsdWUgKyA0LCAmdmFsX2xlbik7CisKKwkJCWlmICghdG1wX2RhdGEyKSAKKwkJCQl7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBwcm9jZXNzX3BjaV92YWx1ZSwgWDUwOVYzX1JfSUxMRUdBTF9IRVhfRElHSVQpOworCQkJCVg1MDlWM19jb25mX2Vycih2YWwpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKworCQkJdG1wX2RhdGEgPSBPUEVOU1NMX3JlYWxsb2MoKCpwb2xpY3kpLT5kYXRhLAorCQkJCSgqcG9saWN5KS0+bGVuZ3RoICsgdmFsX2xlbiArIDEpOworCQkJaWYgKHRtcF9kYXRhKQorCQkJCXsKKwkJCQkoKnBvbGljeSktPmRhdGEgPSB0bXBfZGF0YTsKKwkJCQltZW1jcHkoJigqcG9saWN5KS0+ZGF0YVsoKnBvbGljeSktPmxlbmd0aF0sCisJCQkJCXRtcF9kYXRhMiwgdmFsX2xlbik7CisJCQkJKCpwb2xpY3kpLT5sZW5ndGggKz0gdmFsX2xlbjsKKwkJCQkoKnBvbGljeSktPmRhdGFbKCpwb2xpY3kpLT5sZW5ndGhdID0gJ1wwJzsKKwkJCQl9CisJCQllbHNlCisJCQkJeworCQkJCU9QRU5TU0xfZnJlZSh0bXBfZGF0YTIpOworCQkJCS8qIHJlYWxsb2MgZmFpbHVyZSBpbXBsaWVzIHRoZSBvcmlnaW5hbCBkYXRhIHNwYWNlIGlzIGIwcmtlZCB0b28hICovCisJCQkJKCpwb2xpY3kpLT5kYXRhID0gTlVMTDsKKwkJCQkoKnBvbGljeSktPmxlbmd0aCA9IDA7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBwcm9jZXNzX3BjaV92YWx1ZSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCVg1MDlWM19jb25mX2Vycih2YWwpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCU9QRU5TU0xfZnJlZSh0bXBfZGF0YTIpOworCQkJfQorCQllbHNlIGlmIChzdHJuY21wKHZhbC0+dmFsdWUsICJmaWxlOiIsIDUpID09IDApCisJCQl7CisJCQl1bnNpZ25lZCBjaGFyIGJ1ZlsyMDQ4XTsKKwkJCWludCBuOworCQkJQklPICpiID0gQklPX25ld19maWxlKHZhbC0+dmFsdWUgKyA1LCAiciIpOworCQkJaWYgKCFiKQorCQkJCXsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHByb2Nlc3NfcGNpX3ZhbHVlLCBFUlJfUl9CSU9fTElCKTsKKwkJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQl3aGlsZSgobiA9IEJJT19yZWFkKGIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKSA+IDAKKwkJCQl8fCAobiA9PSAwICYmIEJJT19zaG91bGRfcmV0cnkoYikpKQorCQkJCXsKKwkJCQlpZiAoIW4pIGNvbnRpbnVlOworCisJCQkJdG1wX2RhdGEgPSBPUEVOU1NMX3JlYWxsb2MoKCpwb2xpY3kpLT5kYXRhLAorCQkJCQkoKnBvbGljeSktPmxlbmd0aCArIG4gKyAxKTsKKworCQkJCWlmICghdG1wX2RhdGEpCisJCQkJCWJyZWFrOworCisJCQkJKCpwb2xpY3kpLT5kYXRhID0gdG1wX2RhdGE7CisJCQkJbWVtY3B5KCYoKnBvbGljeSktPmRhdGFbKCpwb2xpY3kpLT5sZW5ndGhdLAorCQkJCQlidWYsIG4pOworCQkJCSgqcG9saWN5KS0+bGVuZ3RoICs9IG47CisJCQkJKCpwb2xpY3kpLT5kYXRhWygqcG9saWN5KS0+bGVuZ3RoXSA9ICdcMCc7CisJCQkJfQorCQkJQklPX2ZyZWVfYWxsKGIpOworCisJCQlpZiAobiA8IDApCisJCQkJeworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcHJvY2Vzc19wY2lfdmFsdWUsIEVSUl9SX0JJT19MSUIpOworCQkJCVg1MDlWM19jb25mX2Vycih2YWwpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCX0KKwkJZWxzZSBpZiAoc3RybmNtcCh2YWwtPnZhbHVlLCAidGV4dDoiLCA1KSA9PSAwKQorCQkJeworCQkJdmFsX2xlbiA9IHN0cmxlbih2YWwtPnZhbHVlICsgNSk7CisJCQl0bXBfZGF0YSA9IE9QRU5TU0xfcmVhbGxvYygoKnBvbGljeSktPmRhdGEsCisJCQkJKCpwb2xpY3kpLT5sZW5ndGggKyB2YWxfbGVuICsgMSk7CisJCQlpZiAodG1wX2RhdGEpCisJCQkJeworCQkJCSgqcG9saWN5KS0+ZGF0YSA9IHRtcF9kYXRhOworCQkJCW1lbWNweSgmKCpwb2xpY3kpLT5kYXRhWygqcG9saWN5KS0+bGVuZ3RoXSwKKwkJCQkJdmFsLT52YWx1ZSArIDUsIHZhbF9sZW4pOworCQkJCSgqcG9saWN5KS0+bGVuZ3RoICs9IHZhbF9sZW47CisJCQkJKCpwb2xpY3kpLT5kYXRhWygqcG9saWN5KS0+bGVuZ3RoXSA9ICdcMCc7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQkvKiByZWFsbG9jIGZhaWx1cmUgaW1wbGllcyB0aGUgb3JpZ2luYWwgZGF0YSBzcGFjZSBpcyBiMHJrZWQgdG9vISAqLworCQkJCSgqcG9saWN5KS0+ZGF0YSA9IE5VTEw7CisJCQkJKCpwb2xpY3kpLT5sZW5ndGggPSAwOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcHJvY2Vzc19wY2lfdmFsdWUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcHJvY2Vzc19wY2lfdmFsdWUsIFg1MDlWM19SX0lOQ09SUkVDVF9QT0xJQ1lfU1lOVEFYX1RBRyk7CisJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlpZiAoIXRtcF9kYXRhKQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBwcm9jZXNzX3BjaV92YWx1ZSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCXJldHVybiAxOworZXJyOgorCWlmIChmcmVlX3BvbGljeSkKKwkJeworCQlBU04xX09DVEVUX1NUUklOR19mcmVlKCpwb2xpY3kpOworCQkqcG9saWN5ID0gTlVMTDsKKwkJfQorCXJldHVybiAwOworCX0KKworc3RhdGljIFBST1hZX0NFUlRfSU5GT19FWFRFTlNJT04gKnIyaV9wY2koWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwKKwlYNTA5VjNfQ1RYICpjdHgsIGNoYXIgKnZhbHVlKQorCXsKKwlQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OICpwY2kgPSBOVUxMOworCVNUQUNLX09GKENPTkZfVkFMVUUpICp2YWxzOworCUFTTjFfT0JKRUNUICpsYW5ndWFnZSA9IE5VTEw7CisJQVNOMV9JTlRFR0VSICpwYXRobGVuID0gTlVMTDsKKwlBU04xX09DVEVUX1NUUklORyAqcG9saWN5ID0gTlVMTDsKKwlzaXplX3QgaSwgajsKKwlpbnQgbmlkOworCisJdmFscyA9IFg1MDlWM19wYXJzZV9saXN0KHZhbHVlKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2tfQ09ORl9WQUxVRV9udW0odmFscyk7IGkrKykKKwkJeworCQlDT05GX1ZBTFVFICpjbmYgPSBza19DT05GX1ZBTFVFX3ZhbHVlKHZhbHMsIGkpOworCQlpZiAoIWNuZi0+bmFtZSB8fCAoKmNuZi0+bmFtZSAhPSAnQCcgJiYgIWNuZi0+dmFsdWUpKQorCQkJeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCByMmlfcGNpLCBYNTA5VjNfUl9JTlZBTElEX1BST1hZX1BPTElDWV9TRVRUSU5HKTsKKwkJCVg1MDlWM19jb25mX2VycihjbmYpOworCQkJZ290byBlcnI7CisJCQl9CisJCWlmICgqY25mLT5uYW1lID09ICdAJykKKwkJCXsKKwkJCVNUQUNLX09GKENPTkZfVkFMVUUpICpzZWN0OworCQkJaW50IHN1Y2Nlc3NfcCA9IDE7CisKKwkJCXNlY3QgPSBYNTA5VjNfZ2V0X3NlY3Rpb24oY3R4LCBjbmYtPm5hbWUgKyAxKTsKKwkJCWlmICghc2VjdCkKKwkJCQl7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCByMmlfcGNpLCBYNTA5VjNfUl9JTlZBTElEX1NFQ1RJT04pOworCQkJCVg1MDlWM19jb25mX2VycihjbmYpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCWZvciAoaiA9IDA7IHN1Y2Nlc3NfcCAmJiBqIDwgc2tfQ09ORl9WQUxVRV9udW0oc2VjdCk7IGorKykKKwkJCQl7CisJCQkJc3VjY2Vzc19wID0KKwkJCQkJcHJvY2Vzc19wY2lfdmFsdWUoc2tfQ09ORl9WQUxVRV92YWx1ZShzZWN0LCBqKSwKKwkJCQkJCSZsYW5ndWFnZSwgJnBhdGhsZW4sICZwb2xpY3kpOworCQkJCX0KKwkJCVg1MDlWM19zZWN0aW9uX2ZyZWUoY3R4LCBzZWN0KTsKKwkJCWlmICghc3VjY2Vzc19wKQorCQkJCWdvdG8gZXJyOworCQkJfQorCQllbHNlCisJCQl7CisJCQlpZiAoIXByb2Nlc3NfcGNpX3ZhbHVlKGNuZiwKKwkJCQkJJmxhbmd1YWdlLCAmcGF0aGxlbiwgJnBvbGljeSkpCisJCQkJeworCQkJCVg1MDlWM19jb25mX2VycihjbmYpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCX0KKwkJfQorCisJLyogTGFuZ3VhZ2UgaXMgbWFuZGF0b3J5ICovCisJaWYgKCFsYW5ndWFnZSkKKwkJeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHIyaV9wY2ksIFg1MDlWM19SX05PX1BST1hZX0NFUlRfUE9MSUNZX0xBTkdVQUdFX0RFRklORUQpOworCQlnb3RvIGVycjsKKwkJfQorCW5pZCA9IE9CSl9vYmoybmlkKGxhbmd1YWdlKTsKKwlpZiAoKG5pZCA9PSBOSURfSW5kZXBlbmRlbnQgfHwgbmlkID09IE5JRF9pZF9wcGxfaW5oZXJpdEFsbCkgJiYgcG9saWN5KQorCQl7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcjJpX3BjaSwgWDUwOVYzX1JfUE9MSUNZX1dIRU5fUFJPWFlfTEFOR1VBR0VfUkVRVUlSRVNfTk9fUE9MSUNZKTsKKwkJZ290byBlcnI7CisJCX0KKworCXBjaSA9IFBST1hZX0NFUlRfSU5GT19FWFRFTlNJT05fbmV3KCk7CisJaWYgKCFwY2kpCisJCXsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCByMmlfcGNpLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCWdvdG8gZXJyOworCQl9CisKKwlwY2ktPnByb3h5UG9saWN5LT5wb2xpY3lMYW5ndWFnZSA9IGxhbmd1YWdlOyBsYW5ndWFnZSA9IE5VTEw7CisJcGNpLT5wcm94eVBvbGljeS0+cG9saWN5ID0gcG9saWN5OyBwb2xpY3kgPSBOVUxMOworCXBjaS0+cGNQYXRoTGVuZ3RoQ29uc3RyYWludCA9IHBhdGhsZW47IHBhdGhsZW4gPSBOVUxMOworCWdvdG8gZW5kOworZXJyOgorCWlmIChsYW5ndWFnZSkgeyBBU04xX09CSkVDVF9mcmVlKGxhbmd1YWdlKTsgbGFuZ3VhZ2UgPSBOVUxMOyB9CisJaWYgKHBhdGhsZW4pIHsgQVNOMV9JTlRFR0VSX2ZyZWUocGF0aGxlbik7IHBhdGhsZW4gPSBOVUxMOyB9CisJaWYgKHBvbGljeSkgeyBBU04xX09DVEVUX1NUUklOR19mcmVlKHBvbGljeSk7IHBvbGljeSA9IE5VTEw7IH0KKwlpZiAocGNpKSB7IFBST1hZX0NFUlRfSU5GT19FWFRFTlNJT05fZnJlZShwY2kpOyBwY2kgPSBOVUxMOyB9CitlbmQ6CisJc2tfQ09ORl9WQUxVRV9wb3BfZnJlZSh2YWxzLCBYNTA5VjNfY29uZl9mcmVlKTsKKwlyZXR1cm4gcGNpOworCX0KZGlmZiAtLWdpdCBhL2NyeXB0by94NTA5djMvdjNfcGNpYS5jIGIvY3J5cHRvL3g1MDl2My92M19wY2lhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ4NDJiZgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94NTA5djMvdjNfcGNpYS5jCkBAIC0wLDAgKzEsNTYgQEAKKy8qIHYzX3BjaWEuYyAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogQ29udHJpYnV0ZWQgdG8gdGhlIE9wZW5TU0wgUHJvamVjdCAyMDA0CisgKiBieSBSaWNoYXJkIExldml0dGUgKHJpY2hhcmRAbGV2aXR0ZS5vcmcpCisgKi8KKy8qIENvcHlyaWdodCAoYykgMjAwNCBLdW5nbGlnYSBUZWtuaXNrYSBI9mdza29sYW4KKyAqIChSb3lhbCBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgU3RvY2tob2xtLCBTd2VkZW4pLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEluc3RpdHV0ZSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgSU5TVElUVVRFIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSU5TVElUVVRFIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorCisKK0FTTjFfU0VRVUVOQ0UoUFJPWFlfUE9MSUNZKSA9CisJeworCUFTTjFfU0lNUExFKFBST1hZX1BPTElDWSxwb2xpY3lMYW5ndWFnZSxBU04xX09CSkVDVCksCisJQVNOMV9PUFQoUFJPWFlfUE9MSUNZLHBvbGljeSxBU04xX09DVEVUX1NUUklORykKK30gQVNOMV9TRVFVRU5DRV9FTkQoUFJPWFlfUE9MSUNZKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoUFJPWFlfUE9MSUNZKQorCitBU04xX1NFUVVFTkNFKFBST1hZX0NFUlRfSU5GT19FWFRFTlNJT04pID0KKwl7CisJQVNOMV9PUFQoUFJPWFlfQ0VSVF9JTkZPX0VYVEVOU0lPTixwY1BhdGhMZW5ndGhDb25zdHJhaW50LEFTTjFfSU5URUdFUiksCisJQVNOMV9TSU1QTEUoUFJPWFlfQ0VSVF9JTkZPX0VYVEVOU0lPTixwcm94eVBvbGljeSxQUk9YWV9QT0xJQ1kpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKFBST1hZX0NFUlRfSU5GT19FWFRFTlNJT04pCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OKQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3g1MDl2My92M19wY29ucy5jIGIvY3J5cHRvL3g1MDl2My92M19wY29ucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYzczMmMKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOXYzL3YzX3Bjb25zLmMKQEAgLTAsMCArMSwxNDEgQEAKKy8qIHYzX3Bjb25zLmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY29uZi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorCisKK3N0YXRpYyBTVEFDS19PRihDT05GX1ZBTFVFKSAqCitpMnZfUE9MSUNZX0NPTlNUUkFJTlRTKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIHZvaWQgKmJjb25zLAorCQkgICAgICAgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKmV4dGxpc3QpOworc3RhdGljIHZvaWQgKnYyaV9QT0xJQ1lfQ09OU1RSQUlOVFMoY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwKKwkJCQkgICAgWDUwOVYzX0NUWCAqY3R4LAorCQkJCSAgICBTVEFDS19PRihDT05GX1ZBTFVFKSAqdmFsdWVzKTsKKworY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgdjNfcG9saWN5X2NvbnN0cmFpbnRzID0geworTklEX3BvbGljeV9jb25zdHJhaW50cywgMCwKK0FTTjFfSVRFTV9yZWYoUE9MSUNZX0NPTlNUUkFJTlRTKSwKKzAsMCwwLDAsCiswLDAsCitpMnZfUE9MSUNZX0NPTlNUUkFJTlRTLAordjJpX1BPTElDWV9DT05TVFJBSU5UUywKK05VTEwsTlVMTCwKK05VTEwKK307CisKK0FTTjFfU0VRVUVOQ0UoUE9MSUNZX0NPTlNUUkFJTlRTKSA9IHsKKwlBU04xX0lNUF9PUFQoUE9MSUNZX0NPTlNUUkFJTlRTLCByZXF1aXJlRXhwbGljaXRQb2xpY3ksIEFTTjFfSU5URUdFUiwwKSwKKwlBU04xX0lNUF9PUFQoUE9MSUNZX0NPTlNUUkFJTlRTLCBpbmhpYml0UG9saWN5TWFwcGluZywgQVNOMV9JTlRFR0VSLDEpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKFBPTElDWV9DT05TVFJBSU5UUykKKworSU1QTEVNRU5UX0FTTjFfQUxMT0NfRlVOQ1RJT05TKFBPTElDWV9DT05TVFJBSU5UUykKKworCitzdGF0aWMgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKgoraTJ2X1BPTElDWV9DT05TVFJBSU5UUyhjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLCB2b2lkICphLAorCQkgICAgICAgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKmV4dGxpc3QpCit7CisJUE9MSUNZX0NPTlNUUkFJTlRTICpwY29ucyA9IGE7CisJWDUwOVYzX2FkZF92YWx1ZV9pbnQoIlJlcXVpcmUgRXhwbGljaXQgUG9saWN5IiwKKwkJCXBjb25zLT5yZXF1aXJlRXhwbGljaXRQb2xpY3ksICZleHRsaXN0KTsKKwlYNTA5VjNfYWRkX3ZhbHVlX2ludCgiSW5oaWJpdCBQb2xpY3kgTWFwcGluZyIsCisJCQlwY29ucy0+aW5oaWJpdFBvbGljeU1hcHBpbmcsICZleHRsaXN0KTsKKwlyZXR1cm4gZXh0bGlzdDsKK30KKworc3RhdGljIHZvaWQgKnYyaV9QT0xJQ1lfQ09OU1RSQUlOVFMoY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwKKwkJCQkgICAgWDUwOVYzX0NUWCAqY3R4LAorCQkJCSAgICBTVEFDS19PRihDT05GX1ZBTFVFKSAqdmFsdWVzKQoreworCVBPTElDWV9DT05TVFJBSU5UUyAqcGNvbnM9TlVMTDsKKwlDT05GX1ZBTFVFICp2YWw7CisJc2l6ZV90IGk7CisJaWYoIShwY29ucyA9IFBPTElDWV9DT05TVFJBSU5UU19uZXcoKSkpIHsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2MmlfUE9MSUNZX0NPTlNUUkFJTlRTLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiBOVUxMOworCX0KKwlmb3IoaSA9IDA7IGkgPCBza19DT05GX1ZBTFVFX251bSh2YWx1ZXMpOyBpKyspIHsKKwkJdmFsID0gc2tfQ09ORl9WQUxVRV92YWx1ZSh2YWx1ZXMsIGkpOworCQlpZighc3RyY21wKHZhbC0+bmFtZSwgInJlcXVpcmVFeHBsaWNpdFBvbGljeSIpKSB7CisJCQlpZighWDUwOVYzX2dldF92YWx1ZV9pbnQodmFsLAorCQkJCSZwY29ucy0+cmVxdWlyZUV4cGxpY2l0UG9saWN5KSkgZ290byBlcnI7CisJCX0gZWxzZSBpZighc3RyY21wKHZhbC0+bmFtZSwgImluaGliaXRQb2xpY3lNYXBwaW5nIikpIHsKKwkJCWlmKCFYNTA5VjNfZ2V0X3ZhbHVlX2ludCh2YWwsCisJCQkJJnBjb25zLT5pbmhpYml0UG9saWN5TWFwcGluZykpIGdvdG8gZXJyOworCQl9IGVsc2UgeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2MmlfUE9MSUNZX0NPTlNUUkFJTlRTLCBYNTA5VjNfUl9JTlZBTElEX05BTUUpOworCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KKwlpZiAoIXBjb25zLT5pbmhpYml0UG9saWN5TWFwcGluZyAmJiAhcGNvbnMtPnJlcXVpcmVFeHBsaWNpdFBvbGljeSkgeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9QT0xJQ1lfQ09OU1RSQUlOVFMsIFg1MDlWM19SX0lMTEVHQUxfRU1QVFlfRVhURU5TSU9OKTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0dXJuIHBjb25zOworCWVycjoKKwlQT0xJQ1lfQ09OU1RSQUlOVFNfZnJlZShwY29ucyk7CisJcmV0dXJuIE5VTEw7Cit9CisKZGlmZiAtLWdpdCBhL2NyeXB0by94NTA5djMvdjNfcGt1LmMgYi9jcnlwdG8veDUwOXYzL3YzX3BrdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NWVkYTYKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOXYzL3YzX3BrdS5jCkBAIC0wLDAgKzEsMTA5IEBACisvKiB2M19wa3UuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDE5OTkuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4gKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisKKworc3RhdGljIGludCBpMnJfUEtFWV9VU0FHRV9QRVJJT0QoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgUEtFWV9VU0FHRV9QRVJJT0QgKnVzYWdlLCBCSU8gKm91dCwgaW50IGluZGVudCk7CisvKgorc3RhdGljIFBLRVlfVVNBR0VfUEVSSU9EICp2MmlfUEtFWV9VU0FHRV9QRVJJT0QoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgWDUwOVYzX0NUWCAqY3R4LCBTVEFDS19PRihDT05GX1ZBTFVFKSAqdmFsdWVzKTsKKyovCitjb25zdCBYNTA5VjNfRVhUX01FVEhPRCB2M19wa2V5X3VzYWdlX3BlcmlvZCA9IHsKK05JRF9wcml2YXRlX2tleV91c2FnZV9wZXJpb2QsIDAsIEFTTjFfSVRFTV9yZWYoUEtFWV9VU0FHRV9QRVJJT0QpLAorMCwwLDAsMCwKKzAsMCwwLDAsCisoWDUwOVYzX0VYVF9JMlIpaTJyX1BLRVlfVVNBR0VfUEVSSU9ELCBOVUxMLAorTlVMTAorfTsKKworQVNOMV9TRVFVRU5DRShQS0VZX1VTQUdFX1BFUklPRCkgPSB7CisJQVNOMV9JTVBfT1BUKFBLRVlfVVNBR0VfUEVSSU9ELCBub3RCZWZvcmUsIEFTTjFfR0VORVJBTElaRURUSU1FLCAwKSwKKwlBU04xX0lNUF9PUFQoUEtFWV9VU0FHRV9QRVJJT0QsIG5vdEFmdGVyLCBBU04xX0dFTkVSQUxJWkVEVElNRSwgMSkKK30gQVNOMV9TRVFVRU5DRV9FTkQoUEtFWV9VU0FHRV9QRVJJT0QpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhQS0VZX1VTQUdFX1BFUklPRCkKKworc3RhdGljIGludCBpMnJfUEtFWV9VU0FHRV9QRVJJT0QoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwKKwkgICAgIFBLRVlfVVNBR0VfUEVSSU9EICp1c2FnZSwgQklPICpvdXQsIGludCBpbmRlbnQpCit7CisJQklPX3ByaW50ZihvdXQsICIlKnMiLCBpbmRlbnQsICIiKTsKKwlpZih1c2FnZS0+bm90QmVmb3JlKSB7CisJCUJJT193cml0ZShvdXQsICJOb3QgQmVmb3JlOiAiLCAxMik7CisJCUFTTjFfR0VORVJBTElaRURUSU1FX3ByaW50KG91dCwgdXNhZ2UtPm5vdEJlZm9yZSk7CisJCWlmKHVzYWdlLT5ub3RBZnRlcikgQklPX3dyaXRlKG91dCwgIiwgIiwgMik7CisJfQorCWlmKHVzYWdlLT5ub3RBZnRlcikgeworCQlCSU9fd3JpdGUob3V0LCAiTm90IEFmdGVyOiAiLCAxMSk7CisJCUFTTjFfR0VORVJBTElaRURUSU1FX3ByaW50KG91dCwgdXNhZ2UtPm5vdEFmdGVyKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qCitzdGF0aWMgUEtFWV9VU0FHRV9QRVJJT0QgKnYyaV9QS0VZX1VTQUdFX1BFUklPRChtZXRob2QsIGN0eCwgdmFsdWVzKQorWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZDsKK1g1MDlWM19DVFggKmN0eDsKK1NUQUNLX09GKENPTkZfVkFMVUUpICp2YWx1ZXM7Cit7CityZXR1cm4gTlVMTDsKK30KKyovCmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOXYzL3YzX3BtYXBzLmMgYi9jcnlwdG8veDUwOXYzL3YzX3BtYXBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJjMTY5ZAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94NTA5djMvdjNfcG1hcHMuYwpAQCAtMCwwICsxLDE1NiBAQAorLyogdjNfcG1hcHMuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuICovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jb25mLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisKKworc3RhdGljIHZvaWQgKnYyaV9QT0xJQ1lfTUFQUElOR1MoY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwKKwkJCQkgWDUwOVYzX0NUWCAqY3R4LCBTVEFDS19PRihDT05GX1ZBTFVFKSAqbnZhbCk7CitzdGF0aWMgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKgoraTJ2X1BPTElDWV9NQVBQSU5HUyhjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLCB2b2lkICpwbXBzLAorCQkgICAgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKmV4dGxpc3QpOworCitjb25zdCBYNTA5VjNfRVhUX01FVEhPRCB2M19wb2xpY3lfbWFwcGluZ3MgPSB7CisJTklEX3BvbGljeV9tYXBwaW5ncywgMCwKKwlBU04xX0lURU1fcmVmKFBPTElDWV9NQVBQSU5HUyksCisJMCwwLDAsMCwKKwkwLDAsCisJaTJ2X1BPTElDWV9NQVBQSU5HUywKKwl2MmlfUE9MSUNZX01BUFBJTkdTLAorCTAsMCwKKwlOVUxMCit9OworCitBU04xX1NFUVVFTkNFKFBPTElDWV9NQVBQSU5HKSA9IHsKKwlBU04xX1NJTVBMRShQT0xJQ1lfTUFQUElORywgaXNzdWVyRG9tYWluUG9saWN5LCBBU04xX09CSkVDVCksCisJQVNOMV9TSU1QTEUoUE9MSUNZX01BUFBJTkcsIHN1YmplY3REb21haW5Qb2xpY3ksIEFTTjFfT0JKRUNUKQorfSBBU04xX1NFUVVFTkNFX0VORChQT0xJQ1lfTUFQUElORykKKworQVNOMV9JVEVNX1RFTVBMQVRFKFBPTElDWV9NQVBQSU5HUykgPSAKKwlBU04xX0VYX1RFTVBMQVRFX1RZUEUoQVNOMV9URkxHX1NFUVVFTkNFX09GLCAwLCBQT0xJQ1lfTUFQUElOR1MsCisJCQkJCQkJCVBPTElDWV9NQVBQSU5HKQorQVNOMV9JVEVNX1RFTVBMQVRFX0VORChQT0xJQ1lfTUFQUElOR1MpCisKK0lNUExFTUVOVF9BU04xX0FMTE9DX0ZVTkNUSU9OUyhQT0xJQ1lfTUFQUElORykKKworCitzdGF0aWMgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKgoraTJ2X1BPTElDWV9NQVBQSU5HUyhjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLCB2b2lkICphLAorCQkgICAgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKmV4dF9saXN0KQoreworCVBPTElDWV9NQVBQSU5HUyAqcG1hcHMgPSBhOworCVBPTElDWV9NQVBQSU5HICpwbWFwOworCXNpemVfdCBpOworCWNoYXIgb2JqX3RtcDFbODBdOworCWNoYXIgb2JqX3RtcDJbODBdOworCWZvcihpID0gMDsgaSA8IHNrX1BPTElDWV9NQVBQSU5HX251bShwbWFwcyk7IGkrKykgeworCQlwbWFwID0gc2tfUE9MSUNZX01BUFBJTkdfdmFsdWUocG1hcHMsIGkpOworCQlpMnRfQVNOMV9PQkpFQ1Qob2JqX3RtcDEsIDgwLCBwbWFwLT5pc3N1ZXJEb21haW5Qb2xpY3kpOworCQlpMnRfQVNOMV9PQkpFQ1Qob2JqX3RtcDIsIDgwLCBwbWFwLT5zdWJqZWN0RG9tYWluUG9saWN5KTsKKwkJWDUwOVYzX2FkZF92YWx1ZShvYmpfdG1wMSwgb2JqX3RtcDIsICZleHRfbGlzdCk7CisJfQorCXJldHVybiBleHRfbGlzdDsKK30KKworc3RhdGljIHZvaWQgKnYyaV9QT0xJQ1lfTUFQUElOR1MoY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwKKwkJCQkgWDUwOVYzX0NUWCAqY3R4LCBTVEFDS19PRihDT05GX1ZBTFVFKSAqbnZhbCkKK3sKKwlQT0xJQ1lfTUFQUElOR1MgKnBtYXBzOworCVBPTElDWV9NQVBQSU5HICpwbWFwOworCUFTTjFfT0JKRUNUICpvYmoxLCAqb2JqMjsKKwlDT05GX1ZBTFVFICp2YWw7CisJc2l6ZV90IGk7CisKKwlpZighKHBtYXBzID0gc2tfUE9MSUNZX01BUFBJTkdfbmV3X251bGwoKSkpIHsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2MmlfUE9MSUNZX01BUFBJTkdTLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWZvcihpID0gMDsgaSA8IHNrX0NPTkZfVkFMVUVfbnVtKG52YWwpOyBpKyspIHsKKwkJdmFsID0gc2tfQ09ORl9WQUxVRV92YWx1ZShudmFsLCBpKTsKKwkJaWYoIXZhbC0+dmFsdWUgfHwgIXZhbC0+bmFtZSkgeworCQkJc2tfUE9MSUNZX01BUFBJTkdfcG9wX2ZyZWUocG1hcHMsIFBPTElDWV9NQVBQSU5HX2ZyZWUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2MmlfUE9MSUNZX01BUFBJTkdTLCBYNTA5VjNfUl9JTlZBTElEX09CSkVDVF9JREVOVElGSUVSKTsKKwkJCVg1MDlWM19jb25mX2Vycih2YWwpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJb2JqMSA9IE9CSl90eHQyb2JqKHZhbC0+bmFtZSwgMCk7CisJCW9iajIgPSBPQkpfdHh0Mm9iaih2YWwtPnZhbHVlLCAwKTsKKwkJaWYoIW9iajEgfHwgIW9iajIpIHsKKwkJCXNrX1BPTElDWV9NQVBQSU5HX3BvcF9mcmVlKHBtYXBzLCBQT0xJQ1lfTUFQUElOR19mcmVlKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgdjJpX1BPTElDWV9NQVBQSU5HUywgWDUwOVYzX1JfSU5WQUxJRF9PQkpFQ1RfSURFTlRJRklFUik7CisJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXBtYXAgPSBQT0xJQ1lfTUFQUElOR19uZXcoKTsKKwkJaWYgKCFwbWFwKSB7CisJCQlza19QT0xJQ1lfTUFQUElOR19wb3BfZnJlZShwbWFwcywgUE9MSUNZX01BUFBJTkdfZnJlZSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9QT0xJQ1lfTUFQUElOR1MsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXBtYXAtPmlzc3VlckRvbWFpblBvbGljeSA9IG9iajE7CisJCXBtYXAtPnN1YmplY3REb21haW5Qb2xpY3kgPSBvYmoyOworCQlza19QT0xJQ1lfTUFQUElOR19wdXNoKHBtYXBzLCBwbWFwKTsKKwl9CisJcmV0dXJuIHBtYXBzOworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3g1MDl2My92M19wcm4uYyBiL2NyeXB0by94NTA5djMvdjNfcHJuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM3NmUwZgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94NTA5djMvdjNfcHJuLmMKQEAgLTAsMCArMSwyMzcgQEAKKy8qIHYzX3Bybi5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisvKiBYNTA5IHYzIGV4dGVuc2lvbiB1dGlsaXRpZXMgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY29uZi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworCisvKiBFeHRlbnNpb24gcHJpbnRpbmcgcm91dGluZXMgKi8KKworc3RhdGljIGludCB1bmtub3duX2V4dF9wcmludChCSU8gKm91dCwgWDUwOV9FWFRFTlNJT04gKmV4dCwgdW5zaWduZWQgbG9uZyBmbGFnLCBpbnQgaW5kZW50LCBpbnQgc3VwcG9ydGVkKTsKKworLyogUHJpbnQgb3V0IGEgbmFtZSt2YWx1ZSBzdGFjayAqLworCit2b2lkIFg1MDlWM19FWFRfdmFsX3BybihCSU8gKm91dCwgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKnZhbCwgaW50IGluZGVudCwgaW50IG1sKQoreworCXNpemVfdCBpOworCUNPTkZfVkFMVUUgKm52YWw7CisJaWYoIXZhbCkgcmV0dXJuOworCWlmKCFtbCB8fCAhc2tfQ09ORl9WQUxVRV9udW0odmFsKSkgeworCQlCSU9fcHJpbnRmKG91dCwgIiUqcyIsIGluZGVudCwgIiIpOworCQlpZighc2tfQ09ORl9WQUxVRV9udW0odmFsKSkgQklPX3B1dHMob3V0LCAiPEVNUFRZPlxuIik7CisJfQorCWZvcihpID0gMDsgaSA8IHNrX0NPTkZfVkFMVUVfbnVtKHZhbCk7IGkrKykgeworCQlpZihtbCkgQklPX3ByaW50ZihvdXQsICIlKnMiLCBpbmRlbnQsICIiKTsKKwkJZWxzZSBpZihpID4gMCkgQklPX3ByaW50ZihvdXQsICIsICIpOworCQludmFsID0gc2tfQ09ORl9WQUxVRV92YWx1ZSh2YWwsIGkpOworCQlpZighbnZhbC0+bmFtZSkgQklPX3B1dHMob3V0LCBudmFsLT52YWx1ZSk7CisJCWVsc2UgaWYoIW52YWwtPnZhbHVlKSBCSU9fcHV0cyhvdXQsIG52YWwtPm5hbWUpOworI2lmbmRlZiBDSEFSU0VUX0VCQ0RJQworCQllbHNlIEJJT19wcmludGYob3V0LCAiJXM6JXMiLCBudmFsLT5uYW1lLCBudmFsLT52YWx1ZSk7CisjZWxzZQorCQllbHNlIHsKKwkJCWludCBsZW47CisJCQljaGFyICp0bXA7CisJCQlsZW4gPSBzdHJsZW4obnZhbC0+dmFsdWUpKzE7CisJCQl0bXAgPSBPUEVOU1NMX21hbGxvYyhsZW4pOworCQkJaWYgKHRtcCkKKwkJCXsKKwkJCQlhc2NpaTJlYmNkaWModG1wLCBudmFsLT52YWx1ZSwgbGVuKTsKKwkJCQlCSU9fcHJpbnRmKG91dCwgIiVzOiVzIiwgbnZhbC0+bmFtZSwgdG1wKTsKKwkJCQlPUEVOU1NMX2ZyZWUodG1wKTsKKwkJCX0KKwkJfQorI2VuZGlmCisJCWlmKG1sKSBCSU9fcHV0cyhvdXQsICJcbiIpOworCX0KK30KKworLyogTWFpbiByb3V0aW5lOiBwcmludCBvdXQgYSBnZW5lcmFsIGV4dGVuc2lvbiAqLworCitpbnQgWDUwOVYzX0VYVF9wcmludChCSU8gKm91dCwgWDUwOV9FWFRFTlNJT04gKmV4dCwgdW5zaWduZWQgbG9uZyBmbGFnLCBpbnQgaW5kZW50KQoreworCXZvaWQgKmV4dF9zdHIgPSBOVUxMOworCWNoYXIgKnZhbHVlID0gTlVMTDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwOworCWNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2Q7CQorCVNUQUNLX09GKENPTkZfVkFMVUUpICpudmFsID0gTlVMTDsKKwlpbnQgb2sgPSAxOworCisJaWYoIShtZXRob2QgPSBYNTA5VjNfRVhUX2dldChleHQpKSkKKwkJcmV0dXJuIHVua25vd25fZXh0X3ByaW50KG91dCwgZXh0LCBmbGFnLCBpbmRlbnQsIDApOworCXAgPSBleHQtPnZhbHVlLT5kYXRhOworCWlmKG1ldGhvZC0+aXQpIGV4dF9zdHIgPSBBU04xX2l0ZW1fZDJpKE5VTEwsICZwLCBleHQtPnZhbHVlLT5sZW5ndGgsIEFTTjFfSVRFTV9wdHIobWV0aG9kLT5pdCkpOworCWVsc2UgZXh0X3N0ciA9IG1ldGhvZC0+ZDJpKE5VTEwsICZwLCBleHQtPnZhbHVlLT5sZW5ndGgpOworCisJaWYoIWV4dF9zdHIpIHJldHVybiB1bmtub3duX2V4dF9wcmludChvdXQsIGV4dCwgZmxhZywgaW5kZW50LCAxKTsKKworCWlmKG1ldGhvZC0+aTJzKSB7CisJCWlmKCEodmFsdWUgPSBtZXRob2QtPmkycyhtZXRob2QsIGV4dF9zdHIpKSkgeworCQkJb2sgPSAwOworCQkJZ290byBlcnI7CisJCX0KKyNpZm5kZWYgQ0hBUlNFVF9FQkNESUMKKwkJQklPX3ByaW50ZihvdXQsICIlKnMlcyIsIGluZGVudCwgIiIsIHZhbHVlKTsKKyNlbHNlCisJCXsKKwkJCWludCBsZW47CisJCQljaGFyICp0bXA7CisJCQlsZW4gPSBzdHJsZW4odmFsdWUpKzE7CisJCQl0bXAgPSBPUEVOU1NMX21hbGxvYyhsZW4pOworCQkJaWYgKHRtcCkKKwkJCXsKKwkJCQlhc2NpaTJlYmNkaWModG1wLCB2YWx1ZSwgbGVuKTsKKwkJCQlCSU9fcHJpbnRmKG91dCwgIiUqcyVzIiwgaW5kZW50LCAiIiwgdG1wKTsKKwkJCQlPUEVOU1NMX2ZyZWUodG1wKTsKKwkJCX0KKwkJfQorI2VuZGlmCisJfSBlbHNlIGlmKG1ldGhvZC0+aTJ2KSB7CisJCWlmKCEobnZhbCA9IG1ldGhvZC0+aTJ2KG1ldGhvZCwgZXh0X3N0ciwgTlVMTCkpKSB7CisJCQlvayA9IDA7CisJCQlnb3RvIGVycjsKKwkJfQorCQlYNTA5VjNfRVhUX3ZhbF9wcm4ob3V0LCBudmFsLCBpbmRlbnQsCisJCQkJIG1ldGhvZC0+ZXh0X2ZsYWdzICYgWDUwOVYzX0VYVF9NVUxUSUxJTkUpOworCX0gZWxzZSBpZihtZXRob2QtPmkycikgeworCQlpZighbWV0aG9kLT5pMnIobWV0aG9kLCBleHRfc3RyLCBvdXQsIGluZGVudCkpIG9rID0gMDsKKwl9IGVsc2Ugb2sgPSAwOworCisJZXJyOgorCQlza19DT05GX1ZBTFVFX3BvcF9mcmVlKG52YWwsIFg1MDlWM19jb25mX2ZyZWUpOworCQlpZih2YWx1ZSkgT1BFTlNTTF9mcmVlKHZhbHVlKTsKKwkJaWYobWV0aG9kLT5pdCkgQVNOMV9pdGVtX2ZyZWUoZXh0X3N0ciwgQVNOMV9JVEVNX3B0cihtZXRob2QtPml0KSk7CisJCWVsc2UgbWV0aG9kLT5leHRfZnJlZShleHRfc3RyKTsKKwkJcmV0dXJuIG9rOworfQorCitpbnQgWDUwOVYzX2V4dGVuc2lvbnNfcHJpbnQoQklPICpicCwgY2hhciAqdGl0bGUsIFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqZXh0cywgdW5zaWduZWQgbG9uZyBmbGFnLCBpbnQgaW5kZW50KQoreworCXNpemVfdCBpOworCWludCBqOworCisJaWYoc2tfWDUwOV9FWFRFTlNJT05fbnVtKGV4dHMpIDw9IDApIHJldHVybiAxOworCisJaWYodGl0bGUpIAorCQl7CisJCUJJT19wcmludGYoYnAsIiUqcyVzOlxuIixpbmRlbnQsICIiLCB0aXRsZSk7CisJCWluZGVudCArPSA0OworCQl9CisKKwlmb3IgKGk9MDsgaTxza19YNTA5X0VYVEVOU0lPTl9udW0oZXh0cyk7IGkrKykKKwkJeworCQlBU04xX09CSkVDVCAqb2JqOworCQlYNTA5X0VYVEVOU0lPTiAqZXg7CisJCWV4PXNrX1g1MDlfRVhURU5TSU9OX3ZhbHVlKGV4dHMsIGkpOworCQlpZiAoaW5kZW50ICYmIEJJT19wcmludGYoYnAsIiUqcyIsaW5kZW50LCAiIikgPD0gMCkgcmV0dXJuIDA7CisJCW9iaj1YNTA5X0VYVEVOU0lPTl9nZXRfb2JqZWN0KGV4KTsKKwkJaTJhX0FTTjFfT0JKRUNUKGJwLG9iaik7CisJCWo9WDUwOV9FWFRFTlNJT05fZ2V0X2NyaXRpY2FsKGV4KTsKKwkJaWYgKEJJT19wcmludGYoYnAsIjogJXNcbiIsaj8iY3JpdGljYWwiOiIiKSA8PSAwKQorCQkJcmV0dXJuIDA7CisJCWlmKCFYNTA5VjNfRVhUX3ByaW50KGJwLCBleCwgZmxhZywgaW5kZW50ICsgNCkpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJwLCAiJSpzIiwgaW5kZW50ICsgNCwgIiIpOworCQkJTV9BU04xX09DVEVUX1NUUklOR19wcmludChicCxleC0+dmFsdWUpOworCQkJfQorCQlpZiAoQklPX3dyaXRlKGJwLCJcbiIsMSkgPD0gMCkgcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB1bmtub3duX2V4dF9wcmludChCSU8gKm91dCwgWDUwOV9FWFRFTlNJT04gKmV4dCwgdW5zaWduZWQgbG9uZyBmbGFnLCBpbnQgaW5kZW50LCBpbnQgc3VwcG9ydGVkKQoreworCXN3aXRjaChmbGFnICYgWDUwOVYzX0VYVF9VTktOT1dOX01BU0spIHsKKworCQljYXNlIFg1MDlWM19FWFRfREVGQVVMVDoKKwkJcmV0dXJuIDA7CisKKwkJY2FzZSBYNTA5VjNfRVhUX0VSUk9SX1VOS05PV046CisJCWlmKHN1cHBvcnRlZCkKKwkJCUJJT19wcmludGYob3V0LCAiJSpzPFBhcnNlIEVycm9yPiIsIGluZGVudCwgIiIpOworCQllbHNlCisJCQlCSU9fcHJpbnRmKG91dCwgIiUqczxOb3QgU3VwcG9ydGVkPiIsIGluZGVudCwgIiIpOworCQlyZXR1cm4gMTsKKworCQljYXNlIFg1MDlWM19FWFRfUEFSU0VfVU5LTk9XTjoKKwkJCXJldHVybiBBU04xX3BhcnNlX2R1bXAob3V0LAorCQkJCWV4dC0+dmFsdWUtPmRhdGEsIGV4dC0+dmFsdWUtPmxlbmd0aCwgaW5kZW50LCAtMSk7CisJCWNhc2UgWDUwOVYzX0VYVF9EVU1QX1VOS05PV046CisJCQlyZXR1cm4gQklPX2hleGR1bXAob3V0LCBleHQtPnZhbHVlLT5kYXRhLCBleHQtPnZhbHVlLT5sZW5ndGgsIGluZGVudCk7CisKKwkJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CisJfQorfQorCQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitpbnQgWDUwOVYzX0VYVF9wcmludF9mcChGSUxFICpmcCwgWDUwOV9FWFRFTlNJT04gKmV4dCwgaW50IGZsYWcsIGludCBpbmRlbnQpCit7CisJQklPICpiaW9fdG1wOworCWludCByZXQ7CisJaWYoIShiaW9fdG1wID0gQklPX25ld19mcChmcCwgQklPX05PQ0xPU0UpKSkgcmV0dXJuIDA7CisJcmV0ID0gWDUwOVYzX0VYVF9wcmludChiaW9fdG1wLCBleHQsIGZsYWcsIGluZGVudCk7CisJQklPX2ZyZWUoYmlvX3RtcCk7CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3J5cHRvL3g1MDl2My92M19wdXJwLmMgYi9jcnlwdG8veDUwOXYzL3YzX3B1cnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjcyNzljCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3g1MDl2My92M19wdXJwLmMKQEAgLTAsMCArMSw3NjcgQEAKKy8qIHYzX3B1cnAuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDEuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYnVmLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2RpZ2VzdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDlfdmZ5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworCitzdGF0aWMgdm9pZCB4NTA5djNfY2FjaGVfZXh0ZW5zaW9ucyhYNTA5ICp4KTsKKworc3RhdGljIGludCBjaGVja19zc2xfY2EoY29uc3QgWDUwOSAqeCk7CitzdGF0aWMgaW50IGNoZWNrX3B1cnBvc2Vfc3NsX2NsaWVudChjb25zdCBYNTA5X1BVUlBPU0UgKnhwLCBjb25zdCBYNTA5ICp4LCBpbnQgY2EpOworc3RhdGljIGludCBjaGVja19wdXJwb3NlX3NzbF9zZXJ2ZXIoY29uc3QgWDUwOV9QVVJQT1NFICp4cCwgY29uc3QgWDUwOSAqeCwgaW50IGNhKTsKK3N0YXRpYyBpbnQgY2hlY2tfcHVycG9zZV9uc19zc2xfc2VydmVyKGNvbnN0IFg1MDlfUFVSUE9TRSAqeHAsIGNvbnN0IFg1MDkgKngsIGludCBjYSk7CitzdGF0aWMgaW50IHB1cnBvc2Vfc21pbWUoY29uc3QgWDUwOSAqeCwgaW50IGNhKTsKK3N0YXRpYyBpbnQgY2hlY2tfcHVycG9zZV9zbWltZV9zaWduKGNvbnN0IFg1MDlfUFVSUE9TRSAqeHAsIGNvbnN0IFg1MDkgKngsIGludCBjYSk7CitzdGF0aWMgaW50IGNoZWNrX3B1cnBvc2Vfc21pbWVfZW5jcnlwdChjb25zdCBYNTA5X1BVUlBPU0UgKnhwLCBjb25zdCBYNTA5ICp4LCBpbnQgY2EpOworc3RhdGljIGludCBjaGVja19wdXJwb3NlX2NybF9zaWduKGNvbnN0IFg1MDlfUFVSUE9TRSAqeHAsIGNvbnN0IFg1MDkgKngsIGludCBjYSk7CitzdGF0aWMgaW50IGNoZWNrX3B1cnBvc2VfdGltZXN0YW1wX3NpZ24oY29uc3QgWDUwOV9QVVJQT1NFICp4cCwgY29uc3QgWDUwOSAqeCwgaW50IGNhKTsKK3N0YXRpYyBpbnQgbm9fY2hlY2soY29uc3QgWDUwOV9QVVJQT1NFICp4cCwgY29uc3QgWDUwOSAqeCwgaW50IGNhKTsKK3N0YXRpYyBpbnQgb2NzcF9oZWxwZXIoY29uc3QgWDUwOV9QVVJQT1NFICp4cCwgY29uc3QgWDUwOSAqeCwgaW50IGNhKTsKKworc3RhdGljIGludCB4cF9jbXAoY29uc3QgWDUwOV9QVVJQT1NFICoqYSwgY29uc3QgWDUwOV9QVVJQT1NFICoqYik7CitzdGF0aWMgdm9pZCB4cHRhYmxlX2ZyZWUoWDUwOV9QVVJQT1NFICpwKTsKKworc3RhdGljIFg1MDlfUFVSUE9TRSB4c3RhbmRhcmRbXSA9IHsKKwl7WDUwOV9QVVJQT1NFX1NTTF9DTElFTlQsIFg1MDlfVFJVU1RfU1NMX0NMSUVOVCwgMCwgY2hlY2tfcHVycG9zZV9zc2xfY2xpZW50LCAiU1NMIGNsaWVudCIsICJzc2xjbGllbnQiLCBOVUxMfSwKKwl7WDUwOV9QVVJQT1NFX1NTTF9TRVJWRVIsIFg1MDlfVFJVU1RfU1NMX1NFUlZFUiwgMCwgY2hlY2tfcHVycG9zZV9zc2xfc2VydmVyLCAiU1NMIHNlcnZlciIsICJzc2xzZXJ2ZXIiLCBOVUxMfSwKKwl7WDUwOV9QVVJQT1NFX05TX1NTTF9TRVJWRVIsIFg1MDlfVFJVU1RfU1NMX1NFUlZFUiwgMCwgY2hlY2tfcHVycG9zZV9uc19zc2xfc2VydmVyLCAiTmV0c2NhcGUgU1NMIHNlcnZlciIsICJuc3NzbHNlcnZlciIsIE5VTEx9LAorCXtYNTA5X1BVUlBPU0VfU01JTUVfU0lHTiwgWDUwOV9UUlVTVF9FTUFJTCwgMCwgY2hlY2tfcHVycG9zZV9zbWltZV9zaWduLCAiUy9NSU1FIHNpZ25pbmciLCAic21pbWVzaWduIiwgTlVMTH0sCisJe1g1MDlfUFVSUE9TRV9TTUlNRV9FTkNSWVBULCBYNTA5X1RSVVNUX0VNQUlMLCAwLCBjaGVja19wdXJwb3NlX3NtaW1lX2VuY3J5cHQsICJTL01JTUUgZW5jcnlwdGlvbiIsICJzbWltZWVuY3J5cHQiLCBOVUxMfSwKKwl7WDUwOV9QVVJQT1NFX0NSTF9TSUdOLCBYNTA5X1RSVVNUX0NPTVBBVCwgMCwgY2hlY2tfcHVycG9zZV9jcmxfc2lnbiwgIkNSTCBzaWduaW5nIiwgImNybHNpZ24iLCBOVUxMfSwKKwl7WDUwOV9QVVJQT1NFX0FOWSwgWDUwOV9UUlVTVF9ERUZBVUxULCAwLCBub19jaGVjaywgIkFueSBQdXJwb3NlIiwgImFueSIsIE5VTEx9LAorCXtYNTA5X1BVUlBPU0VfT0NTUF9IRUxQRVIsIFg1MDlfVFJVU1RfQ09NUEFULCAwLCBvY3NwX2hlbHBlciwgIk9DU1AgaGVscGVyIiwgIm9jc3BoZWxwZXIiLCBOVUxMfSwKKwl7WDUwOV9QVVJQT1NFX1RJTUVTVEFNUF9TSUdOLCBYNTA5X1RSVVNUX1RTQSwgMCwgY2hlY2tfcHVycG9zZV90aW1lc3RhbXBfc2lnbiwgIlRpbWUgU3RhbXAgc2lnbmluZyIsICJ0aW1lc3RhbXBzaWduIiwgTlVMTH0sCit9OworCisjZGVmaW5lIFg1MDlfUFVSUE9TRV9DT1VOVCAoc2l6ZW9mKHhzdGFuZGFyZCkvc2l6ZW9mKFg1MDlfUFVSUE9TRSkpCisKK3N0YXRpYyBTVEFDS19PRihYNTA5X1BVUlBPU0UpICp4cHRhYmxlID0gTlVMTDsKKworc3RhdGljIGludCB4cF9jbXAoY29uc3QgWDUwOV9QVVJQT1NFICoqYSwgY29uc3QgWDUwOV9QVVJQT1NFICoqYikKK3sKKwlyZXR1cm4gKCphKS0+cHVycG9zZSAtICgqYiktPnB1cnBvc2U7Cit9CisKKy8qIEFzIG11Y2ggYXMgSSdkIGxpa2UgdG8gbWFrZSBYNTA5X2NoZWNrX3B1cnBvc2UgdXNlIGEgImNvbnN0IiBYNTA5KgorICogSSByZWFsbHkgY2FuJ3QgYmVjYXVzZSBpdCBkb2VzIHJlY2FsY3VsYXRlIGhhc2hlcyBhbmQgZG8gb3RoZXIgbm9uLWNvbnN0CisgKiB0aGluZ3MuICovCitpbnQgWDUwOV9jaGVja19wdXJwb3NlKFg1MDkgKngsIGludCBpZCwgaW50IGNhKQoreworCWludCBpZHg7CisJY29uc3QgWDUwOV9QVVJQT1NFICpwdDsKKwlpZighKHgtPmV4X2ZsYWdzICYgRVhGTEFHX1NFVCkpIHsKKwkJQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19YNTA5KTsKKwkJeDUwOXYzX2NhY2hlX2V4dGVuc2lvbnMoeCk7CisJCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19YNTA5KTsKKwl9CisJaWYoaWQgPT0gLTEpIHJldHVybiAxOworCWlkeCA9IFg1MDlfUFVSUE9TRV9nZXRfYnlfaWQoaWQpOworCWlmKGlkeCA9PSAtMSkgcmV0dXJuIC0xOworCXB0ID0gWDUwOV9QVVJQT1NFX2dldDAoaWR4KTsKKwlyZXR1cm4gcHQtPmNoZWNrX3B1cnBvc2UocHQsIHgsIGNhKTsKK30KKworaW50IFg1MDlfUFVSUE9TRV9zZXQoaW50ICpwLCBpbnQgcHVycG9zZSkKK3sKKwlpZihYNTA5X1BVUlBPU0VfZ2V0X2J5X2lkKHB1cnBvc2UpID09IC0xKSB7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOV9QVVJQT1NFX3NldCwgWDUwOVYzX1JfSU5WQUxJRF9QVVJQT1NFKTsKKwkJcmV0dXJuIDA7CisJfQorCSpwID0gcHVycG9zZTsKKwlyZXR1cm4gMTsKK30KKworaW50IFg1MDlfUFVSUE9TRV9nZXRfY291bnQodm9pZCkKK3sKKwlpZigheHB0YWJsZSkgcmV0dXJuIFg1MDlfUFVSUE9TRV9DT1VOVDsKKwlyZXR1cm4gc2tfWDUwOV9QVVJQT1NFX251bSh4cHRhYmxlKSArIFg1MDlfUFVSUE9TRV9DT1VOVDsKK30KKworWDUwOV9QVVJQT1NFICogWDUwOV9QVVJQT1NFX2dldDAoaW50IGlkeCkKK3sKKwlpZihpZHggPCAwKSByZXR1cm4gTlVMTDsKKwlpZihpZHggPCAoaW50KVg1MDlfUFVSUE9TRV9DT1VOVCkgcmV0dXJuIHhzdGFuZGFyZCArIGlkeDsKKwlyZXR1cm4gc2tfWDUwOV9QVVJQT1NFX3ZhbHVlKHhwdGFibGUsIGlkeCAtIFg1MDlfUFVSUE9TRV9DT1VOVCk7Cit9CisKK2ludCBYNTA5X1BVUlBPU0VfZ2V0X2J5X3NuYW1lKGNoYXIgKnNuYW1lKQoreworCWludCBpOworCVg1MDlfUFVSUE9TRSAqeHB0bXA7CisJZm9yKGkgPSAwOyBpIDwgWDUwOV9QVVJQT1NFX2dldF9jb3VudCgpOyBpKyspIHsKKwkJeHB0bXAgPSBYNTA5X1BVUlBPU0VfZ2V0MChpKTsKKwkJaWYoIXN0cmNtcCh4cHRtcC0+c25hbWUsIHNuYW1lKSkgcmV0dXJuIGk7CisJfQorCXJldHVybiAtMTsKK30KKworaW50IFg1MDlfUFVSUE9TRV9nZXRfYnlfaWQoaW50IHB1cnBvc2UpCit7CisJWDUwOV9QVVJQT1NFIHRtcDsKKwlzaXplX3QgaWR4OworCisJaWYoKHB1cnBvc2UgPj0gWDUwOV9QVVJQT1NFX01JTikgJiYgKHB1cnBvc2UgPD0gWDUwOV9QVVJQT1NFX01BWCkpCisJCXJldHVybiBwdXJwb3NlIC0gWDUwOV9QVVJQT1NFX01JTjsKKwl0bXAucHVycG9zZSA9IHB1cnBvc2U7CisJaWYoIXhwdGFibGUpIHJldHVybiAtMTsKKworCWlmICghc2tfWDUwOV9QVVJQT1NFX2ZpbmQoeHB0YWJsZSwgJmlkeCwgJnRtcCkpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gaWR4ICsgWDUwOV9QVVJQT1NFX0NPVU5UOworfQorCitpbnQgWDUwOV9QVVJQT1NFX2FkZChpbnQgaWQsIGludCB0cnVzdCwgaW50IGZsYWdzLAorCQkJaW50ICgqY2spKGNvbnN0IFg1MDlfUFVSUE9TRSAqLCBjb25zdCBYNTA5ICosIGludCksCisJCQkJCWNoYXIgKm5hbWUsIGNoYXIgKnNuYW1lLCB2b2lkICphcmcpCit7CisJaW50IGlkeDsKKwlYNTA5X1BVUlBPU0UgKnB0bXA7CisJLyogVGhpcyBpcyBzZXQgYWNjb3JkaW5nIHRvIHdoYXQgd2UgY2hhbmdlOiBhcHBsaWNhdGlvbiBjYW4ndCBzZXQgaXQgKi8KKwlmbGFncyAmPSB+WDUwOV9QVVJQT1NFX0RZTkFNSUM7CisJLyogVGhpcyB3aWxsIGFsd2F5cyBiZSBzZXQgZm9yIGFwcGxpY2F0aW9uIG1vZGlmaWVkIHRydXN0IGVudHJpZXMgKi8KKwlmbGFncyB8PSBYNTA5X1BVUlBPU0VfRFlOQU1JQ19OQU1FOworCS8qIEdldCBleGlzdGluZyBlbnRyeSBpZiBhbnkgKi8KKwlpZHggPSBYNTA5X1BVUlBPU0VfZ2V0X2J5X2lkKGlkKTsKKwkvKiBOZWVkIGEgbmV3IGVudHJ5ICovCisJaWYoaWR4ID09IC0xKSB7CisJCWlmKCEocHRtcCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihYNTA5X1BVUlBPU0UpKSkpIHsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOV9QVVJQT1NFX2FkZCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcHRtcC0+ZmxhZ3MgPSBYNTA5X1BVUlBPU0VfRFlOQU1JQzsKKwl9IGVsc2UgcHRtcCA9IFg1MDlfUFVSUE9TRV9nZXQwKGlkeCk7CisKKwkvKiBPUEVOU1NMX2ZyZWUgZXhpc3RpbmcgbmFtZSBpZiBkeW5hbWljICovCisJaWYocHRtcC0+ZmxhZ3MgJiBYNTA5X1BVUlBPU0VfRFlOQU1JQ19OQU1FKSB7CisJCU9QRU5TU0xfZnJlZShwdG1wLT5uYW1lKTsKKwkJT1BFTlNTTF9mcmVlKHB0bXAtPnNuYW1lKTsKKwl9CisJLyogZHVwIHN1cHBsaWVkIG5hbWUgKi8KKwlwdG1wLT5uYW1lID0gQlVGX3N0cmR1cChuYW1lKTsKKwlwdG1wLT5zbmFtZSA9IEJVRl9zdHJkdXAoc25hbWUpOworCWlmKCFwdG1wLT5uYW1lIHx8ICFwdG1wLT5zbmFtZSkgeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlfUFVSUE9TRV9hZGQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIEtlZXAgdGhlIGR5bmFtaWMgZmxhZyBvZiBleGlzdGluZyBlbnRyeSAqLworCXB0bXAtPmZsYWdzICY9IFg1MDlfUFVSUE9TRV9EWU5BTUlDOworCS8qIFNldCBhbGwgb3RoZXIgZmxhZ3MgKi8KKwlwdG1wLT5mbGFncyB8PSBmbGFnczsKKworCXB0bXAtPnB1cnBvc2UgPSBpZDsKKwlwdG1wLT50cnVzdCA9IHRydXN0OworCXB0bXAtPmNoZWNrX3B1cnBvc2UgPSBjazsKKwlwdG1wLT51c3JfZGF0YSA9IGFyZzsKKworCS8qIElmIGl0cyBhIG5ldyBlbnRyeSBtYW5hZ2UgdGhlIGR5bmFtaWMgdGFibGUgKi8KKwlpZihpZHggPT0gLTEpIHsKKwkJaWYoIXhwdGFibGUgJiYgISh4cHRhYmxlID0gc2tfWDUwOV9QVVJQT1NFX25ldyh4cF9jbXApKSkgeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5X1BVUlBPU0VfYWRkLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoIXNrX1g1MDlfUFVSUE9TRV9wdXNoKHhwdGFibGUsIHB0bXApKSB7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlfUFVSUE9TRV9hZGQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCB4cHRhYmxlX2ZyZWUoWDUwOV9QVVJQT1NFICpwKQorCXsKKwlpZighcCkgcmV0dXJuOworCWlmIChwLT5mbGFncyAmIFg1MDlfUFVSUE9TRV9EWU5BTUlDKSAKKwkJeworCQlpZiAocC0+ZmxhZ3MgJiBYNTA5X1BVUlBPU0VfRFlOQU1JQ19OQU1FKSB7CisJCQlPUEVOU1NMX2ZyZWUocC0+bmFtZSk7CisJCQlPUEVOU1NMX2ZyZWUocC0+c25hbWUpOworCQl9CisJCU9QRU5TU0xfZnJlZShwKTsKKwkJfQorCX0KKwordm9pZCBYNTA5X1BVUlBPU0VfY2xlYW51cCh2b2lkKQoreworCXVuc2lnbmVkIGludCBpOworCXNrX1g1MDlfUFVSUE9TRV9wb3BfZnJlZSh4cHRhYmxlLCB4cHRhYmxlX2ZyZWUpOworCWZvcihpID0gMDsgaSA8IFg1MDlfUFVSUE9TRV9DT1VOVDsgaSsrKSB4cHRhYmxlX2ZyZWUoeHN0YW5kYXJkICsgaSk7CisJeHB0YWJsZSA9IE5VTEw7Cit9CisKK2ludCBYNTA5X1BVUlBPU0VfZ2V0X2lkKFg1MDlfUFVSUE9TRSAqeHApCit7CisJcmV0dXJuIHhwLT5wdXJwb3NlOworfQorCitjaGFyICpYNTA5X1BVUlBPU0VfZ2V0MF9uYW1lKFg1MDlfUFVSUE9TRSAqeHApCit7CisJcmV0dXJuIHhwLT5uYW1lOworfQorCitjaGFyICpYNTA5X1BVUlBPU0VfZ2V0MF9zbmFtZShYNTA5X1BVUlBPU0UgKnhwKQoreworCXJldHVybiB4cC0+c25hbWU7Cit9CisKK2ludCBYNTA5X1BVUlBPU0VfZ2V0X3RydXN0KFg1MDlfUFVSUE9TRSAqeHApCit7CisJcmV0dXJuIHhwLT50cnVzdDsKK30KKworc3RhdGljIGludCBuaWRfY21wKGNvbnN0IHZvaWQgKnZvaWRfYSwgY29uc3Qgdm9pZCAqdm9pZF9iKQorCXsKKwljb25zdCBpbnQgKmEgPSB2b2lkX2EsICpiID0gdm9pZF9iOworCisJcmV0dXJuICphIC0gKmI7CisJfQorCitpbnQgWDUwOV9zdXBwb3J0ZWRfZXh0ZW5zaW9uKFg1MDlfRVhURU5TSU9OICpleCkKKwl7CisJLyogVGhpcyB0YWJsZSBpcyBhIGxpc3Qgb2YgdGhlIE5JRHMgb2Ygc3VwcG9ydGVkIGV4dGVuc2lvbnM6CisJICogdGhhdCBpcyB0aG9zZSB3aGljaCBhcmUgdXNlZCBieSB0aGUgdmVyaWZ5IHByb2Nlc3MuIElmCisJICogYW4gZXh0ZW5zaW9uIGlzIGNyaXRpY2FsIGFuZCBkb2Vzbid0IGFwcGVhciBpbiB0aGlzIGxpc3QKKwkgKiB0aGVuIHRoZSB2ZXJpZnkgcHJvY2VzcyB3aWxsIG5vcm1hbGx5IHJlamVjdCB0aGUgY2VydGlmaWNhdGUuCisJICogVGhlIGxpc3QgbXVzdCBiZSBrZXB0IGluIG51bWVyaWNhbCBvcmRlciBiZWNhdXNlIGl0IHdpbGwgYmUKKwkgKiBzZWFyY2hlZCB1c2luZyBic2VhcmNoLgorCSAqLworCisJc3RhdGljIGNvbnN0IGludCBzdXBwb3J0ZWRfbmlkc1tdID0geworCQlOSURfbmV0c2NhcGVfY2VydF90eXBlLCAvKiA3MSAqLworICAgICAgICAJTklEX2tleV91c2FnZSwJCS8qIDgzICovCisJCU5JRF9zdWJqZWN0X2FsdF9uYW1lLAkvKiA4NSAqLworCQlOSURfYmFzaWNfY29uc3RyYWludHMsCS8qIDg3ICovCisJCU5JRF9jZXJ0aWZpY2F0ZV9wb2xpY2llcywgLyogODkgKi8KKyAgICAgICAgCU5JRF9leHRfa2V5X3VzYWdlLAkvKiAxMjYgKi8KKwkJTklEX3BvbGljeV9jb25zdHJhaW50cywJLyogNDAxICovCisJCU5JRF9wcm94eUNlcnRJbmZvLAkvKiA2NjMgKi8KKwkJTklEX25hbWVfY29uc3RyYWludHMsCS8qIDY2NiAqLworCQlOSURfcG9saWN5X21hcHBpbmdzLAkvKiA3NDcgKi8KKwkJTklEX2luaGliaXRfYW55X3BvbGljeQkvKiA3NDggKi8KKwl9OworCisJaW50IGV4X25pZCA9IE9CSl9vYmoybmlkKFg1MDlfRVhURU5TSU9OX2dldF9vYmplY3QoZXgpKTsKKworCWlmIChleF9uaWQgPT0gTklEX3VuZGVmKSAKKwkJcmV0dXJuIDA7CisKKwlpZiAoYnNlYXJjaCgmZXhfbmlkLCBzdXBwb3J0ZWRfbmlkcywgc2l6ZW9mKHN1cHBvcnRlZF9uaWRzKS9zaXplb2YoaW50KSwgc2l6ZW9mKGludCksIG5pZF9jbXApICE9IE5VTEwpCisJCXJldHVybiAxOworCXJldHVybiAwOworCX0KKworc3RhdGljIHZvaWQgc2V0dXBfZHAoWDUwOSAqeCwgRElTVF9QT0lOVCAqZHApCisJeworCVg1MDlfTkFNRSAqaW5hbWUgPSBOVUxMOworCXNpemVfdCBpOworCWlmIChkcC0+cmVhc29ucykKKwkJeworCQlpZiAoZHAtPnJlYXNvbnMtPmxlbmd0aCA+IDApCisJCQlkcC0+ZHBfcmVhc29ucyA9IGRwLT5yZWFzb25zLT5kYXRhWzBdOworCQlpZiAoZHAtPnJlYXNvbnMtPmxlbmd0aCA+IDEpCisJCQlkcC0+ZHBfcmVhc29ucyB8PSAoZHAtPnJlYXNvbnMtPmRhdGFbMV0gPDwgOCk7CisJCWRwLT5kcF9yZWFzb25zICY9IENSTERQX0FMTF9SRUFTT05TOworCQl9CisJZWxzZQorCQlkcC0+ZHBfcmVhc29ucyA9IENSTERQX0FMTF9SRUFTT05TOworCWlmICghZHAtPmRpc3Rwb2ludCB8fCAoZHAtPmRpc3Rwb2ludC0+dHlwZSAhPSAxKSkKKwkJcmV0dXJuOworCWZvciAoaSA9IDA7IGkgPCBza19HRU5FUkFMX05BTUVfbnVtKGRwLT5DUkxpc3N1ZXIpOyBpKyspCisJCXsKKwkJR0VORVJBTF9OQU1FICpnZW4gPSBza19HRU5FUkFMX05BTUVfdmFsdWUoZHAtPkNSTGlzc3VlciwgaSk7CisJCWlmIChnZW4tPnR5cGUgPT0gR0VOX0RJUk5BTUUpCisJCQl7CisJCQlpbmFtZSA9IGdlbi0+ZC5kaXJlY3RvcnlOYW1lOworCQkJYnJlYWs7CisJCQl9CisJCX0KKwlpZiAoIWluYW1lKQorCQlpbmFtZSA9IFg1MDlfZ2V0X2lzc3Vlcl9uYW1lKHgpOworCisJRElTVF9QT0lOVF9zZXRfZHBuYW1lKGRwLT5kaXN0cG9pbnQsIGluYW1lKTsKKworCX0KKworc3RhdGljIHZvaWQgc2V0dXBfY3JsZHAoWDUwOSAqeCkKKwl7CisJc2l6ZV90IGk7CisJeC0+Y3JsZHAgPSBYNTA5X2dldF9leHRfZDJpKHgsIE5JRF9jcmxfZGlzdHJpYnV0aW9uX3BvaW50cywgTlVMTCwgTlVMTCk7CisJZm9yIChpID0gMDsgaSA8IHNrX0RJU1RfUE9JTlRfbnVtKHgtPmNybGRwKTsgaSsrKQorCQlzZXR1cF9kcCh4LCBza19ESVNUX1BPSU5UX3ZhbHVlKHgtPmNybGRwLCBpKSk7CisJfQorCitzdGF0aWMgdm9pZCB4NTA5djNfY2FjaGVfZXh0ZW5zaW9ucyhYNTA5ICp4KQoreworCUJBU0lDX0NPTlNUUkFJTlRTICpiczsKKwlQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OICpwY2k7CisJQVNOMV9CSVRfU1RSSU5HICp1c2FnZTsKKwlBU04xX0JJVF9TVFJJTkcgKm5zOworCUVYVEVOREVEX0tFWV9VU0FHRSAqZXh0dXNhZ2U7CisJWDUwOV9FWFRFTlNJT04gKmV4OworCXNpemVfdCBpOworCWludCBqOworCWlmKHgtPmV4X2ZsYWdzICYgRVhGTEFHX1NFVCkgcmV0dXJuOworI2lmbmRlZiBPUEVOU1NMX05PX1NIQQorCVg1MDlfZGlnZXN0KHgsIEVWUF9zaGExKCksIHgtPnNoYTFfaGFzaCwgTlVMTCk7CisjZW5kaWYKKwkvKiBEb2VzIHN1YmplY3QgbmFtZSBtYXRjaCBpc3N1ZXIgPyAqLworCWlmKCFYNTA5X05BTUVfY21wKFg1MDlfZ2V0X3N1YmplY3RfbmFtZSh4KSwgWDUwOV9nZXRfaXNzdWVyX25hbWUoeCkpKQorCQkJIHgtPmV4X2ZsYWdzIHw9IEVYRkxBR19TSTsKKwkvKiBWMSBzaG91bGQgbWVhbiBubyBleHRlbnNpb25zIC4uLiAqLworCWlmKCFYNTA5X2dldF92ZXJzaW9uKHgpKSB4LT5leF9mbGFncyB8PSBFWEZMQUdfVjE7CisJLyogSGFuZGxlIGJhc2ljIGNvbnN0cmFpbnRzICovCisJaWYoKGJzPVg1MDlfZ2V0X2V4dF9kMmkoeCwgTklEX2Jhc2ljX2NvbnN0cmFpbnRzLCBOVUxMLCBOVUxMKSkpIHsKKwkJaWYoYnMtPmNhKSB4LT5leF9mbGFncyB8PSBFWEZMQUdfQ0E7CisJCWlmKGJzLT5wYXRobGVuKSB7CisJCQlpZigoYnMtPnBhdGhsZW4tPnR5cGUgPT0gVl9BU04xX05FR19JTlRFR0VSKQorCQkJCQkJfHwgIWJzLT5jYSkgeworCQkJCXgtPmV4X2ZsYWdzIHw9IEVYRkxBR19JTlZBTElEOworCQkJCXgtPmV4X3BhdGhsZW4gPSAwOworCQkJfSBlbHNlIHgtPmV4X3BhdGhsZW4gPSBBU04xX0lOVEVHRVJfZ2V0KGJzLT5wYXRobGVuKTsKKwkJfSBlbHNlIHgtPmV4X3BhdGhsZW4gPSAtMTsKKwkJQkFTSUNfQ09OU1RSQUlOVFNfZnJlZShicyk7CisJCXgtPmV4X2ZsYWdzIHw9IEVYRkxBR19CQ09OUzsKKwl9CisJLyogSGFuZGxlIHByb3h5IGNlcnRpZmljYXRlcyAqLworCWlmKChwY2k9WDUwOV9nZXRfZXh0X2QyaSh4LCBOSURfcHJveHlDZXJ0SW5mbywgTlVMTCwgTlVMTCkpKSB7CisJCWlmICh4LT5leF9mbGFncyAmIEVYRkxBR19DQQorCQkgICAgfHwgWDUwOV9nZXRfZXh0X2J5X05JRCh4LCBOSURfc3ViamVjdF9hbHRfbmFtZSwgMCkgPj0gMAorCQkgICAgfHwgWDUwOV9nZXRfZXh0X2J5X05JRCh4LCBOSURfaXNzdWVyX2FsdF9uYW1lLCAwKSA+PSAwKSB7CisJCQl4LT5leF9mbGFncyB8PSBFWEZMQUdfSU5WQUxJRDsKKwkJfQorCQlpZiAocGNpLT5wY1BhdGhMZW5ndGhDb25zdHJhaW50KSB7CisJCQl4LT5leF9wY3BhdGhsZW4gPQorCQkJCUFTTjFfSU5URUdFUl9nZXQocGNpLT5wY1BhdGhMZW5ndGhDb25zdHJhaW50KTsKKwkJfSBlbHNlIHgtPmV4X3BjcGF0aGxlbiA9IC0xOworCQlQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OX2ZyZWUocGNpKTsKKwkJeC0+ZXhfZmxhZ3MgfD0gRVhGTEFHX1BST1hZOworCX0KKwkvKiBIYW5kbGUga2V5IHVzYWdlICovCisJaWYoKHVzYWdlPVg1MDlfZ2V0X2V4dF9kMmkoeCwgTklEX2tleV91c2FnZSwgTlVMTCwgTlVMTCkpKSB7CisJCWlmKHVzYWdlLT5sZW5ndGggPiAwKSB7CisJCQl4LT5leF9rdXNhZ2UgPSB1c2FnZS0+ZGF0YVswXTsKKwkJCWlmKHVzYWdlLT5sZW5ndGggPiAxKSAKKwkJCQl4LT5leF9rdXNhZ2UgfD0gdXNhZ2UtPmRhdGFbMV0gPDwgODsKKwkJfSBlbHNlIHgtPmV4X2t1c2FnZSA9IDA7CisJCXgtPmV4X2ZsYWdzIHw9IEVYRkxBR19LVVNBR0U7CisJCUFTTjFfQklUX1NUUklOR19mcmVlKHVzYWdlKTsKKwl9CisJeC0+ZXhfeGt1c2FnZSA9IDA7CisJaWYoKGV4dHVzYWdlPVg1MDlfZ2V0X2V4dF9kMmkoeCwgTklEX2V4dF9rZXlfdXNhZ2UsIE5VTEwsIE5VTEwpKSkgeworCQl4LT5leF9mbGFncyB8PSBFWEZMQUdfWEtVU0FHRTsKKwkJZm9yKGkgPSAwOyBpIDwgc2tfQVNOMV9PQkpFQ1RfbnVtKGV4dHVzYWdlKTsgaSsrKSB7CisJCQlzd2l0Y2goT0JKX29iajJuaWQoc2tfQVNOMV9PQkpFQ1RfdmFsdWUoZXh0dXNhZ2UsaSkpKSB7CisJCQkJY2FzZSBOSURfc2VydmVyX2F1dGg6CisJCQkJeC0+ZXhfeGt1c2FnZSB8PSBYS1VfU1NMX1NFUlZFUjsKKwkJCQlicmVhazsKKworCQkJCWNhc2UgTklEX2NsaWVudF9hdXRoOgorCQkJCXgtPmV4X3hrdXNhZ2UgfD0gWEtVX1NTTF9DTElFTlQ7CisJCQkJYnJlYWs7CisKKwkJCQljYXNlIE5JRF9lbWFpbF9wcm90ZWN0OgorCQkJCXgtPmV4X3hrdXNhZ2UgfD0gWEtVX1NNSU1FOworCQkJCWJyZWFrOworCisJCQkJY2FzZSBOSURfY29kZV9zaWduOgorCQkJCXgtPmV4X3hrdXNhZ2UgfD0gWEtVX0NPREVfU0lHTjsKKwkJCQlicmVhazsKKworCQkJCWNhc2UgTklEX21zX3NnYzoKKwkJCQljYXNlIE5JRF9uc19zZ2M6CisJCQkJeC0+ZXhfeGt1c2FnZSB8PSBYS1VfU0dDOworCQkJCWJyZWFrOworCisJCQkJY2FzZSBOSURfT0NTUF9zaWduOgorCQkJCXgtPmV4X3hrdXNhZ2UgfD0gWEtVX09DU1BfU0lHTjsKKwkJCQlicmVhazsKKworCQkJCWNhc2UgTklEX3RpbWVfc3RhbXA6CisJCQkJeC0+ZXhfeGt1c2FnZSB8PSBYS1VfVElNRVNUQU1QOworCQkJCWJyZWFrOworCisJCQkJY2FzZSBOSURfZHZjczoKKwkJCQl4LT5leF94a3VzYWdlIHw9IFhLVV9EVkNTOworCQkJCWJyZWFrOworCisJCQkJY2FzZSBOSURfYW55RXh0ZW5kZWRLZXlVc2FnZToKKwkJCQl4LT5leF94a3VzYWdlIHw9IFhLVV9BTllFS1U7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJc2tfQVNOMV9PQkpFQ1RfcG9wX2ZyZWUoZXh0dXNhZ2UsIEFTTjFfT0JKRUNUX2ZyZWUpOworCX0KKworCWlmKChucz1YNTA5X2dldF9leHRfZDJpKHgsIE5JRF9uZXRzY2FwZV9jZXJ0X3R5cGUsIE5VTEwsIE5VTEwpKSkgeworCQlpZihucy0+bGVuZ3RoID4gMCkgeC0+ZXhfbnNjZXJ0ID0gbnMtPmRhdGFbMF07CisJCWVsc2UgeC0+ZXhfbnNjZXJ0ID0gMDsKKwkJeC0+ZXhfZmxhZ3MgfD0gRVhGTEFHX05TQ0VSVDsKKwkJQVNOMV9CSVRfU1RSSU5HX2ZyZWUobnMpOworCX0KKwl4LT5za2lkID1YNTA5X2dldF9leHRfZDJpKHgsIE5JRF9zdWJqZWN0X2tleV9pZGVudGlmaWVyLCBOVUxMLCBOVUxMKTsKKwl4LT5ha2lkID1YNTA5X2dldF9leHRfZDJpKHgsIE5JRF9hdXRob3JpdHlfa2V5X2lkZW50aWZpZXIsIE5VTEwsIE5VTEwpOworCXgtPmFsdG5hbWUgPSBYNTA5X2dldF9leHRfZDJpKHgsIE5JRF9zdWJqZWN0X2FsdF9uYW1lLCBOVUxMLCBOVUxMKTsKKwl4LT5uYyA9IFg1MDlfZ2V0X2V4dF9kMmkoeCwgTklEX25hbWVfY29uc3RyYWludHMsICZqLCBOVUxMKTsKKwlpZiAoIXgtPm5jICYmIChqICE9IC0xKSkKKwkJeC0+ZXhfZmxhZ3MgfD0gRVhGTEFHX0lOVkFMSUQ7CisJc2V0dXBfY3JsZHAoeCk7CisKKwlmb3IgKGogPSAwOyBqIDwgWDUwOV9nZXRfZXh0X2NvdW50KHgpOyBqKyspCisJCXsKKwkJZXggPSBYNTA5X2dldF9leHQoeCwgaik7CisJCWlmIChPQkpfb2JqMm5pZChYNTA5X0VYVEVOU0lPTl9nZXRfb2JqZWN0KGV4KSkKKwkJCQkJPT0gTklEX2ZyZXNoZXN0X2NybCkKKwkJCXgtPmV4X2ZsYWdzIHw9IEVYRkxBR19GUkVTSEVTVDsKKwkJaWYgKCFYNTA5X0VYVEVOU0lPTl9nZXRfY3JpdGljYWwoZXgpKQorCQkJY29udGludWU7CisJCWlmICghWDUwOV9zdXBwb3J0ZWRfZXh0ZW5zaW9uKGV4KSkKKwkJCXsKKwkJCXgtPmV4X2ZsYWdzIHw9IEVYRkxBR19DUklUSUNBTDsKKwkJCWJyZWFrOworCQkJfQorCQl9CisJeC0+ZXhfZmxhZ3MgfD0gRVhGTEFHX1NFVDsKK30KKworLyogQ0EgY2hlY2tzIGNvbW1vbiB0byBhbGwgcHVycG9zZXMKKyAqIHJldHVybiBjb2RlczoKKyAqIDAgbm90IGEgQ0EKKyAqIDEgaXMgYSBDQQorICogMiBiYXNpY0NvbnN0cmFpbnRzIGFic2VudCBzbyAibWF5YmUiIGEgQ0EKKyAqIDMgYmFzaWNDb25zdHJhaW50cyBhYnNlbnQgYnV0IHNlbGYgc2lnbmVkIFYxLgorICogNCBiYXNpY0NvbnN0cmFpbnRzIGFic2VudCBidXQga2V5VXNhZ2UgcHJlc2VudCBhbmQga2V5Q2VydFNpZ24gYXNzZXJ0ZWQuCisgKi8KKworI2RlZmluZSBWMV9ST09UIChFWEZMQUdfVjF8RVhGTEFHX1NTKQorI2RlZmluZSBrdV9yZWplY3QoeCwgdXNhZ2UpIFwKKwkoKCh4KS0+ZXhfZmxhZ3MgJiBFWEZMQUdfS1VTQUdFKSAmJiAhKCh4KS0+ZXhfa3VzYWdlICYgKHVzYWdlKSkpCisjZGVmaW5lIHhrdV9yZWplY3QoeCwgdXNhZ2UpIFwKKwkoKCh4KS0+ZXhfZmxhZ3MgJiBFWEZMQUdfWEtVU0FHRSkgJiYgISgoeCktPmV4X3hrdXNhZ2UgJiAodXNhZ2UpKSkKKyNkZWZpbmUgbnNfcmVqZWN0KHgsIHVzYWdlKSBcCisJKCgoeCktPmV4X2ZsYWdzICYgRVhGTEFHX05TQ0VSVCkgJiYgISgoeCktPmV4X25zY2VydCAmICh1c2FnZSkpKQorCitzdGF0aWMgaW50IGNoZWNrX2NhKGNvbnN0IFg1MDkgKngpCit7CisJLyoga2V5VXNhZ2UgaWYgcHJlc2VudCBzaG91bGQgYWxsb3cgY2VydCBzaWduaW5nICovCisJaWYoa3VfcmVqZWN0KHgsIEtVX0tFWV9DRVJUX1NJR04pKSByZXR1cm4gMDsKKwlpZih4LT5leF9mbGFncyAmIEVYRkxBR19CQ09OUykgeworCQlpZih4LT5leF9mbGFncyAmIEVYRkxBR19DQSkgcmV0dXJuIDE7CisJCS8qIElmIGJhc2ljQ29uc3RyYWludHMgc2F5cyBub3QgYSBDQSB0aGVuIHNheSBzbyAqLworCQllbHNlIHJldHVybiAwOworCX0gZWxzZSB7CisJCS8qIHdlIHN1cHBvcnQgVjEgcm9vdHMgZm9yLi4uICB1aCwgSSBkb24ndCByZWFsbHkga25vdyB3aHkuICovCisJCWlmKCh4LT5leF9mbGFncyAmIFYxX1JPT1QpID09IFYxX1JPT1QpIHJldHVybiAzOworCQkvKiBJZiBrZXkgdXNhZ2UgcHJlc2VudCBpdCBtdXN0IGhhdmUgY2VydFNpZ24gc28gdG9sZXJhdGUgaXQgKi8KKwkJZWxzZSBpZiAoeC0+ZXhfZmxhZ3MgJiBFWEZMQUdfS1VTQUdFKSByZXR1cm4gNDsKKwkJLyogT2xkZXIgY2VydGlmaWNhdGVzIGNvdWxkIGhhdmUgTmV0c2NhcGUtc3BlY2lmaWMgQ0EgdHlwZXMgKi8KKwkJZWxzZSBpZiAoeC0+ZXhfZmxhZ3MgJiBFWEZMQUdfTlNDRVJUCisJCQkgJiYgeC0+ZXhfbnNjZXJ0ICYgTlNfQU5ZX0NBKSByZXR1cm4gNTsKKwkJLyogY2FuIHRoaXMgc3RpbGwgYmUgcmVnYXJkZWQgYSBDQSBjZXJ0aWZpY2F0ZT8gIEkgZG91YnQgaXQgKi8KKwkJcmV0dXJuIDA7CisJfQorfQorCitpbnQgWDUwOV9jaGVja19jYShYNTA5ICp4KQoreworCWlmKCEoeC0+ZXhfZmxhZ3MgJiBFWEZMQUdfU0VUKSkgeworCQlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX1g1MDkpOworCQl4NTA5djNfY2FjaGVfZXh0ZW5zaW9ucyh4KTsKKwkJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1g1MDkpOworCX0KKworCXJldHVybiBjaGVja19jYSh4KTsKK30KKworLyogQ2hlY2sgU1NMIENBOiBjb21tb24gY2hlY2tzIGZvciBTU0wgY2xpZW50IGFuZCBzZXJ2ZXIgKi8KK3N0YXRpYyBpbnQgY2hlY2tfc3NsX2NhKGNvbnN0IFg1MDkgKngpCit7CisJaW50IGNhX3JldDsKKwljYV9yZXQgPSBjaGVja19jYSh4KTsKKwlpZighY2FfcmV0KSByZXR1cm4gMDsKKwkvKiBjaGVjayBuc0NlcnRUeXBlIGlmIHByZXNlbnQgKi8KKwlpZihjYV9yZXQgIT0gNSB8fCB4LT5leF9uc2NlcnQgJiBOU19TU0xfQ0EpIHJldHVybiBjYV9yZXQ7CisJZWxzZSByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGNoZWNrX3B1cnBvc2Vfc3NsX2NsaWVudChjb25zdCBYNTA5X1BVUlBPU0UgKnhwLCBjb25zdCBYNTA5ICp4LCBpbnQgY2EpCit7CisJaWYoeGt1X3JlamVjdCh4LFhLVV9TU0xfQ0xJRU5UKSkgcmV0dXJuIDA7CisJaWYoY2EpIHJldHVybiBjaGVja19zc2xfY2EoeCk7CisJLyogV2UgbmVlZCB0byBkbyBkaWdpdGFsIHNpZ25hdHVyZXMgb3Iga2V5IGFncmVlbWVudCAqLworCWlmKGt1X3JlamVjdCh4LEtVX0RJR0lUQUxfU0lHTkFUVVJFfEtVX0tFWV9BR1JFRU1FTlQpKSByZXR1cm4gMDsKKwkvKiBuc0NlcnRUeXBlIGlmIHByZXNlbnQgc2hvdWxkIGFsbG93IFNTTCBjbGllbnQgdXNlICovCQorCWlmKG5zX3JlamVjdCh4LCBOU19TU0xfQ0xJRU5UKSkgcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisvKiBLZXkgdXNhZ2UgbmVlZGVkIGZvciBUTFMvU1NMIHNlcnZlcjogZGlnaXRhbCBzaWduYXR1cmUsIGVuY2lwaGVybWVudCBvcgorICoga2V5IGFncmVlbWVudC4gVGhlIHNzbCBjb2RlIGNhbiBjaGVjayB0aGlzIG1vcmUgdGhvcm91Z2hseSBmb3IgaW5kaXZpZHVhbAorICoga2V5IHR5cGVzLgorICovCisjZGVmaW5lIEtVX1RMUyBcCisJS1VfRElHSVRBTF9TSUdOQVRVUkV8S1VfS0VZX0VOQ0lQSEVSTUVOVHxLVV9LRVlfQUdSRUVNRU5UCisKK3N0YXRpYyBpbnQgY2hlY2tfcHVycG9zZV9zc2xfc2VydmVyKGNvbnN0IFg1MDlfUFVSUE9TRSAqeHAsIGNvbnN0IFg1MDkgKngsIGludCBjYSkKK3sKKwlpZih4a3VfcmVqZWN0KHgsWEtVX1NTTF9TRVJWRVJ8WEtVX1NHQykpIHJldHVybiAwOworCWlmKGNhKSByZXR1cm4gY2hlY2tfc3NsX2NhKHgpOworCisJaWYobnNfcmVqZWN0KHgsIE5TX1NTTF9TRVJWRVIpKSByZXR1cm4gMDsKKwlpZihrdV9yZWplY3QoeCwgS1VfVExTKSkgcmV0dXJuIDA7CisJCisJcmV0dXJuIDE7CisKK30KKworc3RhdGljIGludCBjaGVja19wdXJwb3NlX25zX3NzbF9zZXJ2ZXIoY29uc3QgWDUwOV9QVVJQT1NFICp4cCwgY29uc3QgWDUwOSAqeCwgaW50IGNhKQoreworCWludCByZXQ7CisJcmV0ID0gY2hlY2tfcHVycG9zZV9zc2xfc2VydmVyKHhwLCB4LCBjYSk7CisJaWYoIXJldCB8fCBjYSkgcmV0dXJuIHJldDsKKwkvKiBXZSBuZWVkIHRvIGVuY2lwaGVyIG9yIE5ldHNjYXBlIGNvbXBsYWlucyAqLworCWlmKGt1X3JlamVjdCh4LCBLVV9LRVlfRU5DSVBIRVJNRU5UKSkgcmV0dXJuIDA7CisJcmV0dXJuIHJldDsKK30KKworLyogY29tbW9uIFMvTUlNRSBjaGVja3MgKi8KK3N0YXRpYyBpbnQgcHVycG9zZV9zbWltZShjb25zdCBYNTA5ICp4LCBpbnQgY2EpCit7CisJaWYoeGt1X3JlamVjdCh4LFhLVV9TTUlNRSkpIHJldHVybiAwOworCWlmKGNhKSB7CisJCWludCBjYV9yZXQ7CisJCWNhX3JldCA9IGNoZWNrX2NhKHgpOworCQlpZighY2FfcmV0KSByZXR1cm4gMDsKKwkJLyogY2hlY2sgbnNDZXJ0VHlwZSBpZiBwcmVzZW50ICovCisJCWlmKGNhX3JldCAhPSA1IHx8IHgtPmV4X25zY2VydCAmIE5TX1NNSU1FX0NBKSByZXR1cm4gY2FfcmV0OworCQllbHNlIHJldHVybiAwOworCX0KKwlpZih4LT5leF9mbGFncyAmIEVYRkxBR19OU0NFUlQpIHsKKwkJaWYoeC0+ZXhfbnNjZXJ0ICYgTlNfU01JTUUpIHJldHVybiAxOworCQkvKiBXb3JrYXJvdW5kIGZvciBzb21lIGJ1Z2d5IGNlcnRpZmljYXRlcyAqLworCQlpZih4LT5leF9uc2NlcnQgJiBOU19TU0xfQ0xJRU5UKSByZXR1cm4gMjsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoZWNrX3B1cnBvc2Vfc21pbWVfc2lnbihjb25zdCBYNTA5X1BVUlBPU0UgKnhwLCBjb25zdCBYNTA5ICp4LCBpbnQgY2EpCit7CisJaW50IHJldDsKKwlyZXQgPSBwdXJwb3NlX3NtaW1lKHgsIGNhKTsKKwlpZighcmV0IHx8IGNhKSByZXR1cm4gcmV0OworCWlmKGt1X3JlamVjdCh4LCBLVV9ESUdJVEFMX1NJR05BVFVSRXxLVV9OT05fUkVQVURJQVRJT04pKSByZXR1cm4gMDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNoZWNrX3B1cnBvc2Vfc21pbWVfZW5jcnlwdChjb25zdCBYNTA5X1BVUlBPU0UgKnhwLCBjb25zdCBYNTA5ICp4LCBpbnQgY2EpCit7CisJaW50IHJldDsKKwlyZXQgPSBwdXJwb3NlX3NtaW1lKHgsIGNhKTsKKwlpZighcmV0IHx8IGNhKSByZXR1cm4gcmV0OworCWlmKGt1X3JlamVjdCh4LCBLVV9LRVlfRU5DSVBIRVJNRU5UKSkgcmV0dXJuIDA7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjaGVja19wdXJwb3NlX2NybF9zaWduKGNvbnN0IFg1MDlfUFVSUE9TRSAqeHAsIGNvbnN0IFg1MDkgKngsIGludCBjYSkKK3sKKwlpZihjYSkgeworCQlpbnQgY2FfcmV0OworCQlpZigoY2FfcmV0ID0gY2hlY2tfY2EoeCkpICE9IDIpIHJldHVybiBjYV9yZXQ7CisJCWVsc2UgcmV0dXJuIDA7CisJfQorCWlmKGt1X3JlamVjdCh4LCBLVV9DUkxfU0lHTikpIHJldHVybiAwOworCXJldHVybiAxOworfQorCisvKiBPQ1NQIGhlbHBlcjogdGhpcyBpcyAqbm90KiBhIGZ1bGwgT0NTUCBjaGVjay4gSXQganVzdCBjaGVja3MgdGhhdAorICogZWFjaCBDQSBpcyB2YWxpZC4gQWRkaXRpb25hbCBjaGVja3MgbXVzdCBiZSBtYWRlIG9uIHRoZSBjaGFpbi4KKyAqLworCitzdGF0aWMgaW50IG9jc3BfaGVscGVyKGNvbnN0IFg1MDlfUFVSUE9TRSAqeHAsIGNvbnN0IFg1MDkgKngsIGludCBjYSkKK3sKKwkvKiBNdXN0IGJlIGEgdmFsaWQgQ0EuICBTaG91bGQgd2UgcmVhbGx5IHN1cHBvcnQgdGhlICJJIGRvbid0IGtub3ciCisJICAgdmFsdWUgKDIpPyAqLworCWlmKGNhKSByZXR1cm4gY2hlY2tfY2EoeCk7CisJLyogbGVhZiBjZXJ0aWZpY2F0ZSBpcyBjaGVja2VkIGluIE9DU1BfdmVyaWZ5KCkgKi8KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGVja19wdXJwb3NlX3RpbWVzdGFtcF9zaWduKGNvbnN0IFg1MDlfUFVSUE9TRSAqeHAsIGNvbnN0IFg1MDkgKngsCisJCQkJCWludCBjYSkKK3sKKwlpbnQgaV9leHQ7CisKKwkvKiBJZiBjYSBpcyB0cnVlIHdlIG11c3QgcmV0dXJuIGlmIHRoaXMgaXMgYSB2YWxpZCBDQSBjZXJ0aWZpY2F0ZS4gKi8KKwlpZiAoY2EpIHJldHVybiBjaGVja19jYSh4KTsKKworCS8qIAorCSAqIENoZWNrIHRoZSBvcHRpb25hbCBrZXkgdXNhZ2UgZmllbGQ6CisJICogaWYgS2V5IFVzYWdlIGlzIHByZXNlbnQsIGl0IG11c3QgYmUgb25lIG9mIGRpZ2l0YWxTaWduYXR1cmUgCisJICogYW5kL29yIG5vblJlcHVkaWF0aW9uIChvdGhlciB2YWx1ZXMgYXJlIG5vdCBjb25zaXN0ZW50IGFuZCBzaGFsbAorCSAqIGJlIHJlamVjdGVkKS4KKwkgKi8KKwlpZiAoKHgtPmV4X2ZsYWdzICYgRVhGTEFHX0tVU0FHRSkKKwkgICAgJiYgKCh4LT5leF9rdXNhZ2UgJiB+KEtVX05PTl9SRVBVRElBVElPTiB8IEtVX0RJR0lUQUxfU0lHTkFUVVJFKSkgfHwKKwkJISh4LT5leF9rdXNhZ2UgJiAoS1VfTk9OX1JFUFVESUFUSU9OIHwgS1VfRElHSVRBTF9TSUdOQVRVUkUpKSkpCisJCXJldHVybiAwOworCisJLyogT25seSB0aW1lIHN0YW1wIGtleSB1c2FnZSBpcyBwZXJtaXR0ZWQgYW5kIGl0J3MgcmVxdWlyZWQuICovCisJaWYgKCEoeC0+ZXhfZmxhZ3MgJiBFWEZMQUdfWEtVU0FHRSkgfHwgeC0+ZXhfeGt1c2FnZSAhPSBYS1VfVElNRVNUQU1QKQorCQlyZXR1cm4gMDsKKworCS8qIEV4dGVuZGVkIEtleSBVc2FnZSBNVVNUIGJlIGNyaXRpY2FsICovCisJaV9leHQgPSBYNTA5X2dldF9leHRfYnlfTklEKChYNTA5ICopIHgsIE5JRF9leHRfa2V5X3VzYWdlLCAwKTsKKwlpZiAoaV9leHQgPj0gMCkKKwkJeworCQlYNTA5X0VYVEVOU0lPTiAqZXh0ID0gWDUwOV9nZXRfZXh0KChYNTA5ICopIHgsIGlfZXh0KTsKKwkJaWYgKCFYNTA5X0VYVEVOU0lPTl9nZXRfY3JpdGljYWwoZXh0KSkKKwkJCXJldHVybiAwOworCQl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBub19jaGVjayhjb25zdCBYNTA5X1BVUlBPU0UgKnhwLCBjb25zdCBYNTA5ICp4LCBpbnQgY2EpCit7CisJcmV0dXJuIDE7Cit9CisKKy8qIFZhcmlvdXMgY2hlY2tzIHRvIHNlZSBpZiBvbmUgY2VydGlmaWNhdGUgaXNzdWVkIHRoZSBzZWNvbmQuCisgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIHBydW5lIGEgc2V0IG9mIHBvc3NpYmxlIGlzc3VlciBjZXJ0aWZpY2F0ZXMKKyAqIHdoaWNoIGhhdmUgYmVlbiBsb29rZWQgdXAgdXNpbmcgc29tZSBzaW1wbGUgbWV0aG9kIHN1Y2ggYXMgYnkKKyAqIHN1YmplY3QgbmFtZS4KKyAqIFRoZXNlIGFyZToKKyAqIDEuIENoZWNrIGlzc3Vlcl9uYW1lKHN1YmplY3QpID09IHN1YmplY3RfbmFtZShpc3N1ZXIpCisgKiAyLiBJZiBha2lkKHN1YmplY3QpIGV4aXN0cyBjaGVjayBpdCBtYXRjaGVzIGlzc3VlcgorICogMy4gSWYga2V5X3VzYWdlKGlzc3VlcikgZXhpc3RzIGNoZWNrIGl0IHN1cHBvcnRzIGNlcnRpZmljYXRlIHNpZ25pbmcKKyAqIHJldHVybnMgMCBmb3IgT0ssIHBvc2l0aXZlIGZvciByZWFzb24gZm9yIG1pc21hdGNoLCByZWFzb25zIG1hdGNoCisgKiBjb2RlcyBmb3IgWDUwOV92ZXJpZnlfY2VydCgpCisgKi8KKworaW50IFg1MDlfY2hlY2tfaXNzdWVkKFg1MDkgKmlzc3VlciwgWDUwOSAqc3ViamVjdCkKK3sKKwlpZihYNTA5X05BTUVfY21wKFg1MDlfZ2V0X3N1YmplY3RfbmFtZShpc3N1ZXIpLAorCQkJWDUwOV9nZXRfaXNzdWVyX25hbWUoc3ViamVjdCkpKQorCQkJCXJldHVybiBYNTA5X1ZfRVJSX1NVQkpFQ1RfSVNTVUVSX01JU01BVENIOworCXg1MDl2M19jYWNoZV9leHRlbnNpb25zKGlzc3Vlcik7CisJeDUwOXYzX2NhY2hlX2V4dGVuc2lvbnMoc3ViamVjdCk7CisKKwlpZihzdWJqZWN0LT5ha2lkKQorCQl7CisJCWludCByZXQgPSBYNTA5X2NoZWNrX2FraWQoaXNzdWVyLCBzdWJqZWN0LT5ha2lkKTsKKwkJaWYgKHJldCAhPSBYNTA5X1ZfT0spCisJCQlyZXR1cm4gcmV0OworCQl9CisKKwlpZihzdWJqZWN0LT5leF9mbGFncyAmIEVYRkxBR19QUk9YWSkKKwkJeworCQlpZihrdV9yZWplY3QoaXNzdWVyLCBLVV9ESUdJVEFMX1NJR05BVFVSRSkpCisJCQlyZXR1cm4gWDUwOV9WX0VSUl9LRVlVU0FHRV9OT19ESUdJVEFMX1NJR05BVFVSRTsKKwkJfQorCWVsc2UgaWYoa3VfcmVqZWN0KGlzc3VlciwgS1VfS0VZX0NFUlRfU0lHTikpCisJCXJldHVybiBYNTA5X1ZfRVJSX0tFWVVTQUdFX05PX0NFUlRTSUdOOworCXJldHVybiBYNTA5X1ZfT0s7Cit9CisKK2ludCBYNTA5X2NoZWNrX2FraWQoWDUwOSAqaXNzdWVyLCBBVVRIT1JJVFlfS0VZSUQgKmFraWQpCisJeworCisJaWYoIWFraWQpCisJCXJldHVybiBYNTA5X1ZfT0s7CisKKwkvKiBDaGVjayBrZXkgaWRzIChpZiBwcmVzZW50KSAqLworCWlmKGFraWQtPmtleWlkICYmIGlzc3Vlci0+c2tpZCAmJgorCQkgQVNOMV9PQ1RFVF9TVFJJTkdfY21wKGFraWQtPmtleWlkLCBpc3N1ZXItPnNraWQpICkKKwkJCQlyZXR1cm4gWDUwOV9WX0VSUl9BS0lEX1NLSURfTUlTTUFUQ0g7CisJLyogQ2hlY2sgc2VyaWFsIG51bWJlciAqLworCWlmKGFraWQtPnNlcmlhbCAmJgorCQlBU04xX0lOVEVHRVJfY21wKFg1MDlfZ2V0X3NlcmlhbE51bWJlcihpc3N1ZXIpLCBha2lkLT5zZXJpYWwpKQorCQkJCXJldHVybiBYNTA5X1ZfRVJSX0FLSURfSVNTVUVSX1NFUklBTF9NSVNNQVRDSDsKKwkvKiBDaGVjayBpc3N1ZXIgbmFtZSAqLworCWlmKGFraWQtPmlzc3VlcikKKwkJeworCQkvKiBVZ2gsIGZvciBzb21lIHBlY3VsaWFyIHJlYXNvbiBBS0lEIGluY2x1ZGVzCisJCSAqIFNFUVVFTkNFIE9GIEdlbmVyYWxOYW1lLiBTbyBsb29rIGZvciBhIERpck5hbWUuCisJCSAqIFRoZXJlIG1heSBiZSBtb3JlIHRoYW4gb25lIGJ1dCB3ZSBvbmx5IHRha2UgYW55CisJCSAqIG5vdGljZSBvZiB0aGUgZmlyc3QuCisJCSAqLworCQlHRU5FUkFMX05BTUVTICpnZW5zOworCQlHRU5FUkFMX05BTUUgKmdlbjsKKwkJWDUwOV9OQU1FICpubSA9IE5VTEw7CisJCXNpemVfdCBpOworCQlnZW5zID0gYWtpZC0+aXNzdWVyOworCQlmb3IoaSA9IDA7IGkgPCBza19HRU5FUkFMX05BTUVfbnVtKGdlbnMpOyBpKyspCisJCQl7CisJCQlnZW4gPSBza19HRU5FUkFMX05BTUVfdmFsdWUoZ2VucywgaSk7CisJCQlpZihnZW4tPnR5cGUgPT0gR0VOX0RJUk5BTUUpCisJCQkJeworCQkJCW5tID0gZ2VuLT5kLmRpcm47CisJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQlpZihubSAmJiBYNTA5X05BTUVfY21wKG5tLCBYNTA5X2dldF9pc3N1ZXJfbmFtZShpc3N1ZXIpKSkKKwkJCXJldHVybiBYNTA5X1ZfRVJSX0FLSURfSVNTVUVSX1NFUklBTF9NSVNNQVRDSDsKKwkJfQorCXJldHVybiBYNTA5X1ZfT0s7CisJfQorCmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOXYzL3YzX3NrZXkuYyBiL2NyeXB0by94NTA5djMvdjNfc2tleS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNjY3OWEKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOXYzL3YzX3NrZXkuYwpAQCAtMCwwICsxLDE0NyBAQAorLyogdjNfc2tleS5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9kaWdlc3QuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworCitzdGF0aWMgQVNOMV9PQ1RFVF9TVFJJTkcgKnMyaV9za2V5X2lkKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIFg1MDlWM19DVFggKmN0eCwgY2hhciAqc3RyKTsKK2NvbnN0IFg1MDlWM19FWFRfTUVUSE9EIHYzX3NrZXlfaWQgPSB7IAorTklEX3N1YmplY3Rfa2V5X2lkZW50aWZpZXIsIDAsIEFTTjFfSVRFTV9yZWYoQVNOMV9PQ1RFVF9TVFJJTkcpLAorMCwwLDAsMCwKKyhYNTA5VjNfRVhUX0kyUylpMnNfQVNOMV9PQ1RFVF9TVFJJTkcsCisoWDUwOVYzX0VYVF9TMkkpczJpX3NrZXlfaWQsCiswLDAsMCwwLAorTlVMTH07CisKK2NoYXIgKmkyc19BU04xX09DVEVUX1NUUklORyhYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCSAgICAgQVNOMV9PQ1RFVF9TVFJJTkcgKm9jdCkKK3sKKwlyZXR1cm4gaGV4X3RvX3N0cmluZyhvY3QtPmRhdGEsIG9jdC0+bGVuZ3RoKTsKK30KKworQVNOMV9PQ1RFVF9TVFJJTkcgKnMyaV9BU04xX09DVEVUX1NUUklORyhYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCSAgICAgWDUwOVYzX0NUWCAqY3R4LCBjaGFyICpzdHIpCit7CisJQVNOMV9PQ1RFVF9TVFJJTkcgKm9jdDsKKwlsb25nIGxlbmd0aDsKKworCWlmKCEob2N0ID0gTV9BU04xX09DVEVUX1NUUklOR19uZXcoKSkpIHsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBzMmlfQVNOMV9PQ1RFVF9TVFJJTkcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYoIShvY3QtPmRhdGEgPSBzdHJpbmdfdG9faGV4KHN0ciwgJmxlbmd0aCkpKSB7CisJCU1fQVNOMV9PQ1RFVF9TVFJJTkdfZnJlZShvY3QpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlvY3QtPmxlbmd0aCA9IGxlbmd0aDsKKworCXJldHVybiBvY3Q7CisKK30KKworc3RhdGljIEFTTjFfT0NURVRfU1RSSU5HICpzMmlfc2tleV9pZChYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCSAgICAgWDUwOVYzX0NUWCAqY3R4LCBjaGFyICpzdHIpCit7CisJQVNOMV9PQ1RFVF9TVFJJTkcgKm9jdDsKKwlBU04xX0JJVF9TVFJJTkcgKnBrOworCXVuc2lnbmVkIGNoYXIgcGtleV9kaWdbRVZQX01BWF9NRF9TSVpFXTsKKwl1bnNpZ25lZCBpbnQgZGlnbGVuOworCisJaWYoc3RyY21wKHN0ciwgImhhc2giKSkgcmV0dXJuIHMyaV9BU04xX09DVEVUX1NUUklORyhtZXRob2QsIGN0eCwgc3RyKTsKKworCWlmKCEob2N0ID0gTV9BU04xX09DVEVUX1NUUklOR19uZXcoKSkpIHsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBzMmlfc2tleV9pZCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZihjdHggJiYgKGN0eC0+ZmxhZ3MgPT0gQ1RYX1RFU1QpKSByZXR1cm4gb2N0OworCisJaWYoIWN0eCB8fCAoIWN0eC0+c3ViamVjdF9yZXEgJiYgIWN0eC0+c3ViamVjdF9jZXJ0KSkgeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHMyaV9za2V5X2lkLCBYNTA5VjNfUl9OT19QVUJMSUNfS0VZKTsKKwkJZ290byBlcnI7CisJfQorCisJaWYoY3R4LT5zdWJqZWN0X3JlcSkgCisJCXBrID0gY3R4LT5zdWJqZWN0X3JlcS0+cmVxX2luZm8tPnB1YmtleS0+cHVibGljX2tleTsKKwllbHNlIHBrID0gY3R4LT5zdWJqZWN0X2NlcnQtPmNlcnRfaW5mby0+a2V5LT5wdWJsaWNfa2V5OworCisJaWYoIXBrKSB7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgczJpX3NrZXlfaWQsIFg1MDlWM19SX05PX1BVQkxJQ19LRVkpOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoIUVWUF9EaWdlc3QocGstPmRhdGEsIHBrLT5sZW5ndGgsIHBrZXlfZGlnLCAmZGlnbGVuLCBFVlBfc2hhMSgpLCBOVUxMKSkKKwkJZ290byBlcnI7CisKKwlpZighTV9BU04xX09DVEVUX1NUUklOR19zZXQob2N0LCBwa2V5X2RpZywgZGlnbGVuKSkgeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHMyaV9za2V5X2lkLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCWdvdG8gZXJyOworCX0KKworCXJldHVybiBvY3Q7CisJCisJZXJyOgorCU1fQVNOMV9PQ1RFVF9TVFJJTkdfZnJlZShvY3QpOworCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3g1MDl2My92M19zeG5ldC5jIGIvY3J5cHRvL3g1MDl2My92M19zeG5ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiOGUzYzUKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8veDUwOXYzL3YzX3N4bmV0LmMKQEAgLTAsMCArMSwyNjUgQEAKKy8qIHYzX3N4bmV0LmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAxOTk5LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY29uZi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisKKworLyogU3VwcG9ydCBmb3IgVGhhd3RlIHN0cm9uZyBleHRyYW5ldCBleHRlbnNpb24gKi8KKworI2RlZmluZSBTWE5FVF9URVNUCisKK3N0YXRpYyBpbnQgc3huZXRfaTJyKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIFNYTkVUICpzeCwgQklPICpvdXQsIGludCBpbmRlbnQpOworI2lmZGVmIFNYTkVUX1RFU1QKK3N0YXRpYyBTWE5FVCAqIHN4bmV0X3YyaShYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLCBYNTA5VjNfQ1RYICpjdHgsCisJCQkJCQlTVEFDS19PRihDT05GX1ZBTFVFKSAqbnZhbCk7CisjZW5kaWYKK2NvbnN0IFg1MDlWM19FWFRfTUVUSE9EIHYzX3N4bmV0ID0geworTklEX3N4bmV0LCBYNTA5VjNfRVhUX01VTFRJTElORSwgQVNOMV9JVEVNX3JlZihTWE5FVCksCiswLDAsMCwwLAorMCwwLAorMCwgCisjaWZkZWYgU1hORVRfVEVTVAorKFg1MDlWM19FWFRfVjJJKXN4bmV0X3YyaSwKKyNlbHNlCiswLAorI2VuZGlmCisoWDUwOVYzX0VYVF9JMlIpc3huZXRfaTJyLAorMCwKK05VTEwKK307CisKK0FTTjFfU0VRVUVOQ0UoU1hORVRJRCkgPSB7CisJQVNOMV9TSU1QTEUoU1hORVRJRCwgem9uZSwgQVNOMV9JTlRFR0VSKSwKKwlBU04xX1NJTVBMRShTWE5FVElELCB1c2VyLCBBU04xX09DVEVUX1NUUklORykKK30gQVNOMV9TRVFVRU5DRV9FTkQoU1hORVRJRCkKKworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKFNYTkVUSUQpCisKK0FTTjFfU0VRVUVOQ0UoU1hORVQpID0geworCUFTTjFfU0lNUExFKFNYTkVULCB2ZXJzaW9uLCBBU04xX0lOVEVHRVIpLAorCUFTTjFfU0VRVUVOQ0VfT0YoU1hORVQsIGlkcywgU1hORVRJRCkKK30gQVNOMV9TRVFVRU5DRV9FTkQoU1hORVQpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhTWE5FVCkKKworc3RhdGljIGludCBzeG5ldF9pMnIoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgU1hORVQgKnN4LCBCSU8gKm91dCwKKwkgICAgIGludCBpbmRlbnQpCit7CisJbG9uZyB2OworCWNoYXIgKnRtcDsKKwlTWE5FVElEICppZDsKKwlzaXplX3QgaTsKKwl2ID0gQVNOMV9JTlRFR0VSX2dldChzeC0+dmVyc2lvbik7CisJQklPX3ByaW50ZihvdXQsICIlKnNWZXJzaW9uOiAlbGQgKDB4JWxYKSIsIGluZGVudCwgIiIsIHYgKyAxLCB2KTsKKwlmb3IoaSA9IDA7IGkgPCBza19TWE5FVElEX251bShzeC0+aWRzKTsgaSsrKSB7CisJCWlkID0gc2tfU1hORVRJRF92YWx1ZShzeC0+aWRzLCBpKTsKKwkJdG1wID0gaTJzX0FTTjFfSU5URUdFUihOVUxMLCBpZC0+em9uZSk7CisJCUJJT19wcmludGYob3V0LCAiXG4lKnNab25lOiAlcywgVXNlcjogIiwgaW5kZW50LCAiIiwgdG1wKTsKKwkJT1BFTlNTTF9mcmVlKHRtcCk7CisJCU1fQVNOMV9PQ1RFVF9TVFJJTkdfcHJpbnQob3V0LCBpZC0+dXNlcik7CisJfQorCXJldHVybiAxOworfQorCisjaWZkZWYgU1hORVRfVEVTVAorCisvKiBOQkI6IHRoaXMgaXMgdXNlZCBmb3IgdGVzdGluZyBvbmx5LiBJdCBzaG91bGQgKm5vdCogYmUgdXNlZCBmb3IgYW55dGhpbmcKKyAqIGVsc2UgYmVjYXVzZSBpdCB3aWxsIGp1c3QgdGFrZSBzdGF0aWMgSURzIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQKKyAqIHRoZXkgc2hvdWxkIHJlYWxseSBiZSBzZXBhcmF0ZSB2YWx1ZXMgZm9yIGVhY2ggdXNlci4KKyAqLworCisKK3N0YXRpYyBTWE5FVCAqIHN4bmV0X3YyaShYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLCBYNTA5VjNfQ1RYICpjdHgsCisJICAgICBTVEFDS19PRihDT05GX1ZBTFVFKSAqbnZhbCkKK3sKKwlDT05GX1ZBTFVFICpjbmY7CisJU1hORVQgKnN4ID0gTlVMTDsKKwlzaXplX3QgaTsKKwlmb3IoaSA9IDA7IGkgPCBza19DT05GX1ZBTFVFX251bShudmFsKTsgaSsrKSB7CisJCWNuZiA9IHNrX0NPTkZfVkFMVUVfdmFsdWUobnZhbCwgaSk7CisJCWlmKCFTWE5FVF9hZGRfaWRfYXNjKCZzeCwgY25mLT5uYW1lLCBjbmYtPnZhbHVlLCAtMSkpCisJCQkJCQkJCSByZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIHN4OworfQorCQkKKwkKKyNlbmRpZgorCisvKiBTdHJvbmcgRXh0cmFuZXQgdXRpbGl0eSBmdW5jdGlvbnMgKi8KKworLyogQWRkIGFuIGlkIGdpdmVuIHRoZSB6b25lIGFzIGFuIEFTQ0lJIG51bWJlciAqLworCitpbnQgU1hORVRfYWRkX2lkX2FzYyhTWE5FVCAqKnBzeCwgY2hhciAqem9uZSwgY2hhciAqdXNlciwKKwkgICAgIGludCB1c2VybGVuKQoreworCUFTTjFfSU5URUdFUiAqaXpvbmUgPSBOVUxMOworCWlmKCEoaXpvbmUgPSBzMmlfQVNOMV9JTlRFR0VSKE5VTEwsIHpvbmUpKSkgeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFNYTkVUX2FkZF9pZF9hc2MsIFg1MDlWM19SX0VSUk9SX0NPTlZFUlRJTkdfWk9ORSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gU1hORVRfYWRkX2lkX0lOVEVHRVIocHN4LCBpem9uZSwgdXNlciwgdXNlcmxlbik7Cit9CisKKy8qIEFkZCBhbiBpZCBnaXZlbiB0aGUgem9uZSBhcyBhbiB1bnNpZ25lZCBsb25nICovCisKK2ludCBTWE5FVF9hZGRfaWRfdWxvbmcoU1hORVQgKipwc3gsIHVuc2lnbmVkIGxvbmcgbHpvbmUsIGNoYXIgKnVzZXIsCisJICAgICBpbnQgdXNlcmxlbikKK3sKKwlBU04xX0lOVEVHRVIgKml6b25lID0gTlVMTDsKKwlpZighKGl6b25lID0gTV9BU04xX0lOVEVHRVJfbmV3KCkpIHx8ICFBU04xX0lOVEVHRVJfc2V0KGl6b25lLCBsem9uZSkpIHsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBTWE5FVF9hZGRfaWRfdWxvbmcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJTV9BU04xX0lOVEVHRVJfZnJlZShpem9uZSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gU1hORVRfYWRkX2lkX0lOVEVHRVIocHN4LCBpem9uZSwgdXNlciwgdXNlcmxlbik7CisJCit9CisKKy8qIEFkZCBhbiBpZCBnaXZlbiB0aGUgem9uZSBhcyBhbiBBU04xX0lOVEVHRVIuCisgKiBOb3RlIHRoaXMgdmVyc2lvbiB1c2VzIHRoZSBwYXNzZWQgaW50ZWdlciBhbmQgZG9lc24ndCBtYWtlIGEgY29weSBzbyBkb24ndAorICogZnJlZSBpdCB1cCBhZnRlcndhcmRzLgorICovCisKK2ludCBTWE5FVF9hZGRfaWRfSU5URUdFUihTWE5FVCAqKnBzeCwgQVNOMV9JTlRFR0VSICp6b25lLCBjaGFyICp1c2VyLAorCSAgICAgaW50IHVzZXJsZW4pCit7CisJU1hORVQgKnN4ID0gTlVMTDsKKwlTWE5FVElEICppZCA9IE5VTEw7CisJaWYoIXBzeCB8fCAhem9uZSB8fCAhdXNlcikgeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFNYTkVUX2FkZF9pZF9JTlRFR0VSLCBYNTA5VjNfUl9JTlZBTElEX05VTExfQVJHVU1FTlQpOworCQlyZXR1cm4gMDsKKwl9CisJaWYodXNlcmxlbiA9PSAtMSkgdXNlcmxlbiA9IHN0cmxlbih1c2VyKTsKKwlpZih1c2VybGVuID4gNjQpIHsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBTWE5FVF9hZGRfaWRfSU5URUdFUiwgWDUwOVYzX1JfVVNFUl9UT09fTE9ORyk7CisJCXJldHVybiAwOworCX0KKwlpZighKnBzeCkgeworCQlpZighKHN4ID0gU1hORVRfbmV3KCkpKSBnb3RvIGVycjsKKwkJaWYoIUFTTjFfSU5URUdFUl9zZXQoc3gtPnZlcnNpb24sIDApKSBnb3RvIGVycjsKKwkJKnBzeCA9IHN4OworCX0gZWxzZSBzeCA9ICpwc3g7CisJaWYoU1hORVRfZ2V0X2lkX0lOVEVHRVIoc3gsIHpvbmUpKSB7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgU1hORVRfYWRkX2lkX0lOVEVHRVIsIFg1MDlWM19SX0RVUExJQ0FURV9aT05FX0lEKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYoIShpZCA9IFNYTkVUSURfbmV3KCkpKSBnb3RvIGVycjsKKwlpZih1c2VybGVuID09IC0xKSB1c2VybGVuID0gc3RybGVuKHVzZXIpOworCQkKKwlpZighTV9BU04xX09DVEVUX1NUUklOR19zZXQoaWQtPnVzZXIsIHVzZXIsIHVzZXJsZW4pKSBnb3RvIGVycjsKKwlpZighc2tfU1hORVRJRF9wdXNoKHN4LT5pZHMsIGlkKSkgZ290byBlcnI7CisJaWQtPnpvbmUgPSB6b25lOworCXJldHVybiAxOworCQorCWVycjoKKwlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFNYTkVUX2FkZF9pZF9JTlRFR0VSLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJU1hORVRJRF9mcmVlKGlkKTsKKwlTWE5FVF9mcmVlKHN4KTsKKwkqcHN4ID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworQVNOMV9PQ1RFVF9TVFJJTkcgKlNYTkVUX2dldF9pZF9hc2MoU1hORVQgKnN4LCBjaGFyICp6b25lKQoreworCUFTTjFfSU5URUdFUiAqaXpvbmUgPSBOVUxMOworCUFTTjFfT0NURVRfU1RSSU5HICpvY3Q7CisJaWYoIShpem9uZSA9IHMyaV9BU04xX0lOVEVHRVIoTlVMTCwgem9uZSkpKSB7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgU1hORVRfZ2V0X2lkX2FzYywgWDUwOVYzX1JfRVJST1JfQ09OVkVSVElOR19aT05FKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW9jdCA9IFNYTkVUX2dldF9pZF9JTlRFR0VSKHN4LCBpem9uZSk7CisJTV9BU04xX0lOVEVHRVJfZnJlZShpem9uZSk7CisJcmV0dXJuIG9jdDsKK30KKworQVNOMV9PQ1RFVF9TVFJJTkcgKlNYTkVUX2dldF9pZF91bG9uZyhTWE5FVCAqc3gsIHVuc2lnbmVkIGxvbmcgbHpvbmUpCit7CisJQVNOMV9JTlRFR0VSICppem9uZSA9IE5VTEw7CisJQVNOMV9PQ1RFVF9TVFJJTkcgKm9jdDsKKwlpZighKGl6b25lID0gTV9BU04xX0lOVEVHRVJfbmV3KCkpIHx8ICFBU04xX0lOVEVHRVJfc2V0KGl6b25lLCBsem9uZSkpIHsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBTWE5FVF9nZXRfaWRfdWxvbmcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJTV9BU04xX0lOVEVHRVJfZnJlZShpem9uZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlvY3QgPSBTWE5FVF9nZXRfaWRfSU5URUdFUihzeCwgaXpvbmUpOworCU1fQVNOMV9JTlRFR0VSX2ZyZWUoaXpvbmUpOworCXJldHVybiBvY3Q7Cit9CisKK0FTTjFfT0NURVRfU1RSSU5HICpTWE5FVF9nZXRfaWRfSU5URUdFUihTWE5FVCAqc3gsIEFTTjFfSU5URUdFUiAqem9uZSkKK3sKKwlTWE5FVElEICppZDsKKwlzaXplX3QgaTsKKwlmb3IoaSA9IDA7IGkgPCBza19TWE5FVElEX251bShzeC0+aWRzKTsgaSsrKSB7CisJCWlkID0gc2tfU1hORVRJRF92YWx1ZShzeC0+aWRzLCBpKTsKKwkJaWYoIU1fQVNOMV9JTlRFR0VSX2NtcChpZC0+em9uZSwgem9uZSkpIHJldHVybiBpZC0+dXNlcjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK0lNUExFTUVOVF9BU04xX1NFVF9PRihTWE5FVElEKQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3g1MDl2My92M191dGwuYyBiL2NyeXB0by94NTA5djMvdjNfdXRsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRkZjc4YwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94NTA5djMvdjNfdXRsLmMKQEAgLTAsMCArMSwxMTgxIEBACisvKiB2M191dGwuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDMgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKy8qIFg1MDkgdjMgZXh0ZW5zaW9uIHV0aWxpdGllcyAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9idWYuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NvbmYuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorCisKK3N0YXRpYyBjaGFyICpzdHJpcF9zcGFjZXMoY2hhciAqbmFtZSk7CitzdGF0aWMgaW50IHNrX3N0cmNtcChjb25zdCBPUEVOU1NMX1NUUklORyAqYSwgY29uc3QgT1BFTlNTTF9TVFJJTkcgKmIpOworc3RhdGljIFNUQUNLX09GKE9QRU5TU0xfU1RSSU5HKSAqZ2V0X2VtYWlsKFg1MDlfTkFNRSAqbmFtZSwgR0VORVJBTF9OQU1FUyAqZ2Vucyk7CitzdGF0aWMgdm9pZCBzdHJfZnJlZShPUEVOU1NMX1NUUklORyBzdHIpOworc3RhdGljIGludCBhcHBlbmRfaWE1KFNUQUNLX09GKE9QRU5TU0xfU1RSSU5HKSAqKnNrLCBBU04xX0lBNVNUUklORyAqZW1haWwpOworCitzdGF0aWMgaW50IGlwdjRfZnJvbV9hc2ModW5zaWduZWQgY2hhciAqdjQsIGNvbnN0IGNoYXIgKmluKTsKK3N0YXRpYyBpbnQgaXB2Nl9mcm9tX2FzYyh1bnNpZ25lZCBjaGFyICp2NiwgY29uc3QgY2hhciAqaW4pOworc3RhdGljIGludCBpcHY2X2NiKGNvbnN0IGNoYXIgKmVsZW0sIGludCBsZW4sIHZvaWQgKnVzcik7CitzdGF0aWMgaW50IGlwdjZfaGV4KHVuc2lnbmVkIGNoYXIgKm91dCwgY29uc3QgY2hhciAqaW4sIGludCBpbmxlbik7CisKKy8qIEFkZCBhIENPTkZfVkFMVUUgbmFtZSB2YWx1ZSBwYWlyIHRvIHN0YWNrICovCisKK2ludCBYNTA5VjNfYWRkX3ZhbHVlKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlLAorCQkJCQkJU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKipleHRsaXN0KQoreworCUNPTkZfVkFMVUUgKnZ0bXAgPSBOVUxMOworCWNoYXIgKnRuYW1lID0gTlVMTCwgKnR2YWx1ZSA9IE5VTEw7CisJaWYobmFtZSAmJiAhKHRuYW1lID0gQlVGX3N0cmR1cChuYW1lKSkpIGdvdG8gZXJyOworCWlmKHZhbHVlICYmICEodHZhbHVlID0gQlVGX3N0cmR1cCh2YWx1ZSkpKSBnb3RvIGVycjsKKwlpZighKHZ0bXAgPSAoQ09ORl9WQUxVRSAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihDT05GX1ZBTFVFKSkpKSBnb3RvIGVycjsKKwlpZighKmV4dGxpc3QgJiYgISgqZXh0bGlzdCA9IHNrX0NPTkZfVkFMVUVfbmV3X251bGwoKSkpIGdvdG8gZXJyOworCXZ0bXAtPnNlY3Rpb24gPSBOVUxMOworCXZ0bXAtPm5hbWUgPSB0bmFtZTsKKwl2dG1wLT52YWx1ZSA9IHR2YWx1ZTsKKwlpZighc2tfQ09ORl9WQUxVRV9wdXNoKCpleHRsaXN0LCB2dG1wKSkgZ290byBlcnI7CisJcmV0dXJuIDE7CisJZXJyOgorCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX2FkZF92YWx1ZSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCWlmKHZ0bXApIE9QRU5TU0xfZnJlZSh2dG1wKTsKKwlpZih0bmFtZSkgT1BFTlNTTF9mcmVlKHRuYW1lKTsKKwlpZih0dmFsdWUpIE9QRU5TU0xfZnJlZSh0dmFsdWUpOworCXJldHVybiAwOworfQorCitpbnQgWDUwOVYzX2FkZF92YWx1ZV91Y2hhcihjb25zdCBjaGFyICpuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICp2YWx1ZSwKKwkJCSAgIFNUQUNLX09GKENPTkZfVkFMVUUpICoqZXh0bGlzdCkKKyAgICB7CisgICAgcmV0dXJuIFg1MDlWM19hZGRfdmFsdWUobmFtZSwoY29uc3QgY2hhciAqKXZhbHVlLGV4dGxpc3QpOworICAgIH0KKworLyogRnJlZSBmdW5jdGlvbiBmb3IgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKi8KKwordm9pZCBYNTA5VjNfY29uZl9mcmVlKENPTkZfVkFMVUUgKmNvbmYpCit7CisJaWYoIWNvbmYpIHJldHVybjsKKwlpZihjb25mLT5uYW1lKSBPUEVOU1NMX2ZyZWUoY29uZi0+bmFtZSk7CisJaWYoY29uZi0+dmFsdWUpIE9QRU5TU0xfZnJlZShjb25mLT52YWx1ZSk7CisJaWYoY29uZi0+c2VjdGlvbikgT1BFTlNTTF9mcmVlKGNvbmYtPnNlY3Rpb24pOworCU9QRU5TU0xfZnJlZShjb25mKTsKK30KKworaW50IFg1MDlWM19hZGRfdmFsdWVfYm9vbChjb25zdCBjaGFyICpuYW1lLCBpbnQgYXNuMV9ib29sLAorCQkJCQkJU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKipleHRsaXN0KQoreworCWlmKGFzbjFfYm9vbCkgcmV0dXJuIFg1MDlWM19hZGRfdmFsdWUobmFtZSwgIlRSVUUiLCBleHRsaXN0KTsKKwlyZXR1cm4gWDUwOVYzX2FkZF92YWx1ZShuYW1lLCAiRkFMU0UiLCBleHRsaXN0KTsKK30KKworaW50IFg1MDlWM19hZGRfdmFsdWVfYm9vbF9uZihjaGFyICpuYW1lLCBpbnQgYXNuMV9ib29sLAorCQkJCQkJU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKipleHRsaXN0KQoreworCWlmKGFzbjFfYm9vbCkgcmV0dXJuIFg1MDlWM19hZGRfdmFsdWUobmFtZSwgIlRSVUUiLCBleHRsaXN0KTsKKwlyZXR1cm4gMTsKK30KKworCitjaGFyICppMnNfQVNOMV9FTlVNRVJBVEVEKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIEFTTjFfRU5VTUVSQVRFRCAqYSkKK3sKKwlCSUdOVU0gKmJudG1wID0gTlVMTDsKKwljaGFyICpzdHJ0bXAgPSBOVUxMOworCWlmKCFhKSByZXR1cm4gTlVMTDsKKwlpZighKGJudG1wID0gQVNOMV9FTlVNRVJBVEVEX3RvX0JOKGEsIE5VTEwpKSB8fAorCSAgICAhKHN0cnRtcCA9IEJOX2JuMmRlYyhibnRtcCkpICkKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBpMnNfQVNOMV9FTlVNRVJBVEVELCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJQk5fZnJlZShibnRtcCk7CisJcmV0dXJuIHN0cnRtcDsKK30KKworY2hhciAqaTJzX0FTTjFfSU5URUdFUihYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLCBBU04xX0lOVEVHRVIgKmEpCit7CisJQklHTlVNICpibnRtcCA9IE5VTEw7CisJY2hhciAqc3RydG1wID0gTlVMTDsKKwlpZighYSkgcmV0dXJuIE5VTEw7CisJaWYoIShibnRtcCA9IEFTTjFfSU5URUdFUl90b19CTihhLCBOVUxMKSkgfHwKKwkgICAgIShzdHJ0bXAgPSBCTl9ibjJkZWMoYm50bXApKSApCisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgaTJzX0FTTjFfSU5URUdFUiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCUJOX2ZyZWUoYm50bXApOworCXJldHVybiBzdHJ0bXA7Cit9CisKK0FTTjFfSU5URUdFUiAqczJpX0FTTjFfSU5URUdFUihYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLCBjaGFyICp2YWx1ZSkKK3sKKwlCSUdOVU0gKmJuID0gTlVMTDsKKwlBU04xX0lOVEVHRVIgKmFpbnQ7CisJaW50IGlzbmVnLCBpc2hleDsKKwlpbnQgcmV0OworCWlmICghdmFsdWUpIHsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBzMmlfQVNOMV9JTlRFR0VSLCBYNTA5VjNfUl9JTlZBTElEX05VTExfVkFMVUUpOworCQlyZXR1cm4gMDsKKwl9CisJYm4gPSBCTl9uZXcoKTsKKwlpZiAodmFsdWVbMF0gPT0gJy0nKSB7CisJCXZhbHVlKys7CisJCWlzbmVnID0gMTsKKwl9IGVsc2UgaXNuZWcgPSAwOworCisJaWYgKHZhbHVlWzBdID09ICcwJyAmJiAoKHZhbHVlWzFdID09ICd4JykgfHwgKHZhbHVlWzFdID09ICdYJykpKSB7CisJCXZhbHVlICs9IDI7CisJCWlzaGV4ID0gMTsKKwl9IGVsc2UgaXNoZXggPSAwOworCisJaWYgKGlzaGV4KSByZXQgPSBCTl9oZXgyYm4oJmJuLCB2YWx1ZSk7CisJZWxzZSByZXQgPSBCTl9kZWMyYm4oJmJuLCB2YWx1ZSk7CisKKwlpZiAoIXJldCB8fCB2YWx1ZVtyZXRdKSB7CisJCUJOX2ZyZWUoYm4pOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHMyaV9BU04xX0lOVEVHRVIsIFg1MDlWM19SX0JOX0RFQzJCTl9FUlJPUik7CisJCXJldHVybiAwOworCX0KKworCWlmIChpc25lZyAmJiBCTl9pc196ZXJvKGJuKSkgaXNuZWcgPSAwOworCisJYWludCA9IEJOX3RvX0FTTjFfSU5URUdFUihibiwgTlVMTCk7CisJQk5fZnJlZShibik7CisJaWYgKCFhaW50KSB7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgczJpX0FTTjFfSU5URUdFUiwgWDUwOVYzX1JfQk5fVE9fQVNOMV9JTlRFR0VSX0VSUk9SKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChpc25lZykgYWludC0+dHlwZSB8PSBWX0FTTjFfTkVHOworCXJldHVybiBhaW50OworfQorCitpbnQgWDUwOVYzX2FkZF92YWx1ZV9pbnQoY29uc3QgY2hhciAqbmFtZSwgQVNOMV9JTlRFR0VSICphaW50LAorCSAgICAgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKipleHRsaXN0KQoreworCWNoYXIgKnN0cnRtcDsKKwlpbnQgcmV0OworCWlmKCFhaW50KSByZXR1cm4gMTsKKwlpZighKHN0cnRtcCA9IGkyc19BU04xX0lOVEVHRVIoTlVMTCwgYWludCkpKSByZXR1cm4gMDsKKwlyZXQgPSBYNTA5VjNfYWRkX3ZhbHVlKG5hbWUsIHN0cnRtcCwgZXh0bGlzdCk7CisJT1BFTlNTTF9mcmVlKHN0cnRtcCk7CisJcmV0dXJuIHJldDsKK30KKworaW50IFg1MDlWM19nZXRfdmFsdWVfYm9vbChDT05GX1ZBTFVFICp2YWx1ZSwgaW50ICphc24xX2Jvb2wpCit7CisJY2hhciAqYnRtcDsKKwlpZighKGJ0bXAgPSB2YWx1ZS0+dmFsdWUpKSBnb3RvIGVycjsKKwlpZighc3RyY21wKGJ0bXAsICJUUlVFIikgfHwgIXN0cmNtcChidG1wLCAidHJ1ZSIpCisJCSB8fCAhc3RyY21wKGJ0bXAsICJZIikgfHwgIXN0cmNtcChidG1wLCAieSIpCisJCXx8ICFzdHJjbXAoYnRtcCwgIllFUyIpIHx8ICFzdHJjbXAoYnRtcCwgInllcyIpKSB7CisJCSphc24xX2Jvb2wgPSAweGZmOworCQlyZXR1cm4gMTsKKwl9IGVsc2UgaWYoIXN0cmNtcChidG1wLCAiRkFMU0UiKSB8fCAhc3RyY21wKGJ0bXAsICJmYWxzZSIpCisJCSB8fCAhc3RyY21wKGJ0bXAsICJOIikgfHwgIXN0cmNtcChidG1wLCAibiIpCisJCXx8ICFzdHJjbXAoYnRtcCwgIk5PIikgfHwgIXN0cmNtcChidG1wLCAibm8iKSkgeworCQkqYXNuMV9ib29sID0gMDsKKwkJcmV0dXJuIDE7CisJfQorCWVycjoKKwlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19nZXRfdmFsdWVfYm9vbCwgWDUwOVYzX1JfSU5WQUxJRF9CT09MRUFOX1NUUklORyk7CisJWDUwOVYzX2NvbmZfZXJyKHZhbHVlKTsKKwlyZXR1cm4gMDsKK30KKworaW50IFg1MDlWM19nZXRfdmFsdWVfaW50KENPTkZfVkFMVUUgKnZhbHVlLCBBU04xX0lOVEVHRVIgKiphaW50KQoreworCUFTTjFfSU5URUdFUiAqaXRtcDsKKwlpZighKGl0bXAgPSBzMmlfQVNOMV9JTlRFR0VSKE5VTEwsIHZhbHVlLT52YWx1ZSkpKSB7CisJCVg1MDlWM19jb25mX2Vycih2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKwkqYWludCA9IGl0bXA7CisJcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUgSERSX05BTUUJMQorI2RlZmluZSBIRFJfVkFMVUUJMgorCisvKiNkZWZpbmUgREVCVUcqLworCitTVEFDS19PRihDT05GX1ZBTFVFKSAqWDUwOVYzX3BhcnNlX2xpc3QoY29uc3QgY2hhciAqbGluZSkKK3sKKwljaGFyICpwLCAqcSwgYzsKKwljaGFyICpudG1wLCAqdnRtcDsKKwlTVEFDS19PRihDT05GX1ZBTFVFKSAqdmFsdWVzID0gTlVMTDsKKwljaGFyICpsaW5lYnVmOworCWludCBzdGF0ZTsKKwkvKiBXZSBhcmUgZ29pbmcgdG8gbW9kaWZ5IHRoZSBsaW5lIHNvIGNvcHkgaXQgZmlyc3QgKi8KKwlsaW5lYnVmID0gQlVGX3N0cmR1cChsaW5lKTsKKwlzdGF0ZSA9IEhEUl9OQU1FOworCW50bXAgPSBOVUxMOworCS8qIEdvIHRocm91Z2ggYWxsIGNoYXJhY3RlcnMgKi8KKwlmb3IocCA9IGxpbmVidWYsIHEgPSBsaW5lYnVmOyAoYyA9ICpwKSAmJiAoYyE9J1xyJykgJiYgKGMhPSdcbicpOyBwKyspIHsKKworCQlzd2l0Y2goc3RhdGUpIHsKKwkJCWNhc2UgSERSX05BTUU6CisJCQlpZihjID09ICc6JykgeworCQkJCXN0YXRlID0gSERSX1ZBTFVFOworCQkJCSpwID0gMDsKKwkJCQludG1wID0gc3RyaXBfc3BhY2VzKHEpOworCQkJCWlmKCFudG1wKSB7CisJCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX3BhcnNlX2xpc3QsIFg1MDlWM19SX0lOVkFMSURfTlVMTF9OQU1FKTsKKwkJCQkJZ290byBlcnI7CisJCQkJfQorCQkJCXEgPSBwICsgMTsKKwkJCX0gZWxzZSBpZihjID09ICcsJykgeworCQkJCSpwID0gMDsKKwkJCQludG1wID0gc3RyaXBfc3BhY2VzKHEpOworCQkJCXEgPSBwICsgMTsKKyNpZiAwCisJCQkJcHJpbnRmKCIlc1xuIiwgbnRtcCk7CisjZW5kaWYKKwkJCQlpZighbnRtcCkgeworCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19wYXJzZV9saXN0LCBYNTA5VjNfUl9JTlZBTElEX05VTExfTkFNRSk7CisJCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCQlYNTA5VjNfYWRkX3ZhbHVlKG50bXAsIE5VTEwsICZ2YWx1ZXMpOworCQkJfQorCQkJYnJlYWsgOworCisJCQljYXNlIEhEUl9WQUxVRToKKwkJCWlmKGMgPT0gJywnKSB7CisJCQkJc3RhdGUgPSBIRFJfTkFNRTsKKwkJCQkqcCA9IDA7CisJCQkJdnRtcCA9IHN0cmlwX3NwYWNlcyhxKTsKKyNpZiAwCisJCQkJcHJpbnRmKCIlc1xuIiwgbnRtcCk7CisjZW5kaWYKKwkJCQlpZighdnRtcCkgeworCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19wYXJzZV9saXN0LCBYNTA5VjNfUl9JTlZBTElEX05VTExfVkFMVUUpOworCQkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQkJWDUwOVYzX2FkZF92YWx1ZShudG1wLCB2dG1wLCAmdmFsdWVzKTsKKwkJCQludG1wID0gTlVMTDsKKwkJCQlxID0gcCArIDE7CisJCQl9CisKKwkJfQorCX0KKworCWlmKHN0YXRlID09IEhEUl9WQUxVRSkgeworCQl2dG1wID0gc3RyaXBfc3BhY2VzKHEpOworI2lmIDAKKwkJcHJpbnRmKCIlcz0lc1xuIiwgbnRtcCwgdnRtcCk7CisjZW5kaWYKKwkJaWYoIXZ0bXApIHsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX3BhcnNlX2xpc3QsIFg1MDlWM19SX0lOVkFMSURfTlVMTF9WQUxVRSk7CisJCQlnb3RvIGVycjsKKwkJfQorCQlYNTA5VjNfYWRkX3ZhbHVlKG50bXAsIHZ0bXAsICZ2YWx1ZXMpOworCX0gZWxzZSB7CisJCW50bXAgPSBzdHJpcF9zcGFjZXMocSk7CisjaWYgMAorCQlwcmludGYoIiVzXG4iLCBudG1wKTsKKyNlbmRpZgorCQlpZighbnRtcCkgeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfcGFyc2VfbGlzdCwgWDUwOVYzX1JfSU5WQUxJRF9OVUxMX05BTUUpOworCQkJZ290byBlcnI7CisJCX0KKwkJWDUwOVYzX2FkZF92YWx1ZShudG1wLCBOVUxMLCAmdmFsdWVzKTsKKwl9CitPUEVOU1NMX2ZyZWUobGluZWJ1Zik7CityZXR1cm4gdmFsdWVzOworCitlcnI6CitPUEVOU1NMX2ZyZWUobGluZWJ1Zik7Citza19DT05GX1ZBTFVFX3BvcF9mcmVlKHZhbHVlcywgWDUwOVYzX2NvbmZfZnJlZSk7CityZXR1cm4gTlVMTDsKKworfQorCisvKiBEZWxldGUgbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2VzIGZyb20gYSBzdHJpbmcgKi8KK3N0YXRpYyBjaGFyICpzdHJpcF9zcGFjZXMoY2hhciAqbmFtZSkKK3sKKwljaGFyICpwLCAqcTsKKwkvKiBTa2lwIG92ZXIgbGVhZGluZyBzcGFjZXMgKi8KKwlwID0gbmFtZTsKKwl3aGlsZSgqcCAmJiBpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpwKSkgcCsrOworCWlmKCEqcCkgcmV0dXJuIE5VTEw7CisJcSA9IHAgKyBzdHJsZW4ocCkgLSAxOworCXdoaWxlKChxICE9IHApICYmIGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKnEpKSBxLS07CisJaWYocCAhPSBxKSBxWzFdID0gMDsKKwlpZighKnApIHJldHVybiBOVUxMOworCXJldHVybiBwOworfQorCisvKiBoZXggc3RyaW5nIHV0aWxpdGllcyAqLworCisvKiBHaXZlbiBhIGJ1ZmZlciBvZiBsZW5ndGggJ2xlbicgcmV0dXJuIGEgT1BFTlNTTF9tYWxsb2MnZWQgc3RyaW5nIHdpdGggaXRzCisgKiBoZXggcmVwcmVzZW50YXRpb24KKyAqIEBAQCAoQ29udGVudHMgb2YgYnVmZmVyIGFyZSBhbHdheXMga2VwdCBpbiBBU0NJSSwgYWxzbyBvbiBFQkNESUMgbWFjaGluZXMpCisgKi8KKworY2hhciAqaGV4X3RvX3N0cmluZyhjb25zdCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIGxvbmcgbGVuKQoreworCWNoYXIgKnRtcCwgKnE7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKwlpbnQgaTsKKwljb25zdCBzdGF0aWMgY2hhciBoZXhkaWdbXSA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKKwlpZighYnVmZmVyIHx8ICFsZW4pIHJldHVybiBOVUxMOworCWlmKCEodG1wID0gT1BFTlNTTF9tYWxsb2MobGVuICogMyArIDEpKSkgeworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIGhleF90b19zdHJpbmcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXEgPSB0bXA7CisJZm9yKGkgPSAwLCBwID0gYnVmZmVyOyBpIDwgbGVuOyBpKysscCsrKSB7CisJCSpxKysgPSBoZXhkaWdbKCpwID4+IDQpICYgMHhmXTsKKwkJKnErKyA9IGhleGRpZ1sqcCAmIDB4Zl07CisJCSpxKysgPSAnOic7CisJfQorCXFbLTFdID0gMDsKKyNpZmRlZiBDSEFSU0VUX0VCQ0RJQworCWViY2RpYzJhc2NpaSh0bXAsIHRtcCwgcSAtIHRtcCAtIDEpOworI2VuZGlmCisKKwlyZXR1cm4gdG1wOworfQorCisvKiBHaXZlIGEgc3RyaW5nIG9mIGhleCBkaWdpdHMgY29udmVydCB0bworICogYSBidWZmZXIKKyAqLworCit1bnNpZ25lZCBjaGFyICpzdHJpbmdfdG9faGV4KGNvbnN0IGNoYXIgKnN0ciwgbG9uZyAqbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKmhleGJ1ZiwgKnE7CisJdW5zaWduZWQgY2hhciBjaCwgY2wsICpwOworCWlmKCFzdHIpIHsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBzdHJpbmdfdG9faGV4LCBYNTA5VjNfUl9JTlZBTElEX05VTExfQVJHVU1FTlQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYoIShoZXhidWYgPSBPUEVOU1NMX21hbGxvYyhzdHJsZW4oc3RyKSA+PiAxKSkpIGdvdG8gZXJyOworCWZvcihwID0gKHVuc2lnbmVkIGNoYXIgKilzdHIsIHEgPSBoZXhidWY7ICpwOykgeworCQljaCA9ICpwKys7CisjaWZkZWYgQ0hBUlNFVF9FQkNESUMKKwkJY2ggPSBvc190b2ViY2RpY1tjaF07CisjZW5kaWYKKwkJaWYoY2ggPT0gJzonKSBjb250aW51ZTsKKwkJY2wgPSAqcCsrOworI2lmZGVmIENIQVJTRVRfRUJDRElDCisJCWNsID0gb3NfdG9lYmNkaWNbY2xdOworI2VuZGlmCisJCWlmKCFjbCkgeworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBzdHJpbmdfdG9faGV4LCBYNTA5VjNfUl9PRERfTlVNQkVSX09GX0RJR0lUUyk7CisJCQlPUEVOU1NMX2ZyZWUoaGV4YnVmKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWlmKGlzdXBwZXIoY2gpKSBjaCA9IHRvbG93ZXIoY2gpOworCQlpZihpc3VwcGVyKGNsKSkgY2wgPSB0b2xvd2VyKGNsKTsKKworCQlpZigoY2ggPj0gJzAnKSAmJiAoY2ggPD0gJzknKSkgY2ggLT0gJzAnOworCQllbHNlIGlmICgoY2ggPj0gJ2EnKSAmJiAoY2ggPD0gJ2YnKSkgY2ggLT0gJ2EnIC0gMTA7CisJCWVsc2UgZ290byBiYWRoZXg7CisKKwkJaWYoKGNsID49ICcwJykgJiYgKGNsIDw9ICc5JykpIGNsIC09ICcwJzsKKwkJZWxzZSBpZiAoKGNsID49ICdhJykgJiYgKGNsIDw9ICdmJykpIGNsIC09ICdhJyAtIDEwOworCQllbHNlIGdvdG8gYmFkaGV4OworCisJCSpxKysgPSAoY2ggPDwgNCkgfCBjbDsKKwl9CisKKwlpZihsZW4pICpsZW4gPSBxIC0gaGV4YnVmOworCisJcmV0dXJuIGhleGJ1ZjsKKworCWVycjoKKwlpZihoZXhidWYpIE9QRU5TU0xfZnJlZShoZXhidWYpOworCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgc3RyaW5nX3RvX2hleCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCXJldHVybiBOVUxMOworCisJYmFkaGV4OgorCU9QRU5TU0xfZnJlZShoZXhidWYpOworCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgc3RyaW5nX3RvX2hleCwgWDUwOVYzX1JfSUxMRUdBTF9IRVhfRElHSVQpOworCXJldHVybiBOVUxMOworCit9CisKKy8qIFYySSBuYW1lIGNvbXBhcmlzb24gZnVuY3Rpb246IHJldHVybnMgemVybyBpZiAnbmFtZScgbWF0Y2hlcworICogY21wIG9yIGNtcC4qCisgKi8KKworaW50IG5hbWVfY21wKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmNtcCkKK3sKKwlpbnQgbGVuLCByZXQ7CisJY2hhciBjOworCWxlbiA9IHN0cmxlbihjbXApOworCWlmKChyZXQgPSBzdHJuY21wKG5hbWUsIGNtcCwgbGVuKSkpIHJldHVybiByZXQ7CisJYyA9IG5hbWVbbGVuXTsKKwlpZighYyB8fCAoYz09Jy4nKSkgcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2tfc3RyY21wKGNvbnN0IE9QRU5TU0xfU1RSSU5HICphLCBjb25zdCBPUEVOU1NMX1NUUklORyAqYikKK3sKKwlyZXR1cm4gc3RyY21wKCphLCAqYik7Cit9CisKK1NUQUNLX09GKE9QRU5TU0xfU1RSSU5HKSAqWDUwOV9nZXQxX2VtYWlsKFg1MDkgKngpCit7CisJR0VORVJBTF9OQU1FUyAqZ2VuczsKKwlTVEFDS19PRihPUEVOU1NMX1NUUklORykgKnJldDsKKworCWdlbnMgPSBYNTA5X2dldF9leHRfZDJpKHgsIE5JRF9zdWJqZWN0X2FsdF9uYW1lLCBOVUxMLCBOVUxMKTsKKwlyZXQgPSBnZXRfZW1haWwoWDUwOV9nZXRfc3ViamVjdF9uYW1lKHgpLCBnZW5zKTsKKwlza19HRU5FUkFMX05BTUVfcG9wX2ZyZWUoZ2VucywgR0VORVJBTF9OQU1FX2ZyZWUpOworCXJldHVybiByZXQ7Cit9CisKK1NUQUNLX09GKE9QRU5TU0xfU1RSSU5HKSAqWDUwOV9nZXQxX29jc3AoWDUwOSAqeCkKK3sKKwlBVVRIT1JJVFlfSU5GT19BQ0NFU1MgKmluZm87CisJU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICpyZXQgPSBOVUxMOworCXNpemVfdCBpOworCisJaW5mbyA9IFg1MDlfZ2V0X2V4dF9kMmkoeCwgTklEX2luZm9fYWNjZXNzLCBOVUxMLCBOVUxMKTsKKwlpZiAoIWluZm8pCisJCXJldHVybiBOVUxMOworCWZvciAoaSA9IDA7IGkgPCBza19BQ0NFU1NfREVTQ1JJUFRJT05fbnVtKGluZm8pOyBpKyspCisJCXsKKwkJQUNDRVNTX0RFU0NSSVBUSU9OICphZCA9IHNrX0FDQ0VTU19ERVNDUklQVElPTl92YWx1ZShpbmZvLCBpKTsKKwkJaWYgKE9CSl9vYmoybmlkKGFkLT5tZXRob2QpID09IE5JRF9hZF9PQ1NQKQorCQkJeworCQkJaWYgKGFkLT5sb2NhdGlvbi0+dHlwZSA9PSBHRU5fVVJJKQorCQkJCXsKKwkJCQlpZiAoIWFwcGVuZF9pYTUoJnJldCwgYWQtPmxvY2F0aW9uLT5kLnVuaWZvcm1SZXNvdXJjZUlkZW50aWZpZXIpKQorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwlBVVRIT1JJVFlfSU5GT19BQ0NFU1NfZnJlZShpbmZvKTsKKwlyZXR1cm4gcmV0OworfQorCitTVEFDS19PRihPUEVOU1NMX1NUUklORykgKlg1MDlfUkVRX2dldDFfZW1haWwoWDUwOV9SRVEgKngpCit7CisJR0VORVJBTF9OQU1FUyAqZ2VuczsKKwlTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKmV4dHM7CisJU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICpyZXQ7CisKKwlleHRzID0gWDUwOV9SRVFfZ2V0X2V4dGVuc2lvbnMoeCk7CisJZ2VucyA9IFg1MDlWM19nZXRfZDJpKGV4dHMsIE5JRF9zdWJqZWN0X2FsdF9uYW1lLCBOVUxMLCBOVUxMKTsKKwlyZXQgPSBnZXRfZW1haWwoWDUwOV9SRVFfZ2V0X3N1YmplY3RfbmFtZSh4KSwgZ2Vucyk7CisJc2tfR0VORVJBTF9OQU1FX3BvcF9mcmVlKGdlbnMsIEdFTkVSQUxfTkFNRV9mcmVlKTsKKwlza19YNTA5X0VYVEVOU0lPTl9wb3BfZnJlZShleHRzLCBYNTA5X0VYVEVOU0lPTl9mcmVlKTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBTVEFDS19PRihPUEVOU1NMX1NUUklORykgKmdldF9lbWFpbChYNTA5X05BTUUgKm5hbWUsIEdFTkVSQUxfTkFNRVMgKmdlbnMpCit7CisJU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICpyZXQgPSBOVUxMOworCVg1MDlfTkFNRV9FTlRSWSAqbmU7CisJQVNOMV9JQTVTVFJJTkcgKmVtYWlsOworCUdFTkVSQUxfTkFNRSAqZ2VuOworCWludCBpOworCXNpemVfdCBqOworCS8qIE5vdyBhZGQgYW55IGVtYWlsIGFkZHJlc3MoZXMpIHRvIFNUQUNLICovCisJaSA9IC0xOworCS8qIEZpcnN0IHN1cHBsaWVkIFg1MDlfTkFNRSAqLworCXdoaWxlKChpID0gWDUwOV9OQU1FX2dldF9pbmRleF9ieV9OSUQobmFtZSwKKwkJCQkJIE5JRF9wa2NzOV9lbWFpbEFkZHJlc3MsIGkpKSA+PSAwKSB7CisJCW5lID0gWDUwOV9OQU1FX2dldF9lbnRyeShuYW1lLCBpKTsKKwkJZW1haWwgPSBYNTA5X05BTUVfRU5UUllfZ2V0X2RhdGEobmUpOworCQlpZighYXBwZW5kX2lhNSgmcmV0LCBlbWFpbCkpIHJldHVybiBOVUxMOworCX0KKwlmb3IoaiA9IDA7IGogPCBza19HRU5FUkFMX05BTUVfbnVtKGdlbnMpOyBqKyspCisJeworCQlnZW4gPSBza19HRU5FUkFMX05BTUVfdmFsdWUoZ2Vucywgaik7CisJCWlmKGdlbi0+dHlwZSAhPSBHRU5fRU1BSUwpIGNvbnRpbnVlOworCQlpZighYXBwZW5kX2lhNSgmcmV0LCBnZW4tPmQuaWE1KSkgcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHN0cl9mcmVlKE9QRU5TU0xfU1RSSU5HIHN0cikKK3sKKwlPUEVOU1NMX2ZyZWUoc3RyKTsKK30KKworc3RhdGljIGludCBhcHBlbmRfaWE1KFNUQUNLX09GKE9QRU5TU0xfU1RSSU5HKSAqKnNrLCBBU04xX0lBNVNUUklORyAqZW1haWwpCit7CisJY2hhciAqZW10bXA7CisJLyogRmlyc3Qgc29tZSBzYW5pdHkgY2hlY2tzICovCisJaWYoZW1haWwtPnR5cGUgIT0gVl9BU04xX0lBNVNUUklORykgcmV0dXJuIDE7CisJaWYoIWVtYWlsLT5kYXRhIHx8ICFlbWFpbC0+bGVuZ3RoKSByZXR1cm4gMTsKKwlpZighKnNrKSAqc2sgPSBza19PUEVOU1NMX1NUUklOR19uZXcoc2tfc3RyY21wKTsKKwlpZighKnNrKSByZXR1cm4gMDsKKwkvKiBEb24ndCBhZGQgZHVwbGljYXRlcyAqLworCWlmKHNrX09QRU5TU0xfU1RSSU5HX2ZpbmQoKnNrLCBOVUxMLCAoY2hhciAqKWVtYWlsLT5kYXRhKSkgcmV0dXJuIDE7CisJZW10bXAgPSBCVUZfc3RyZHVwKChjaGFyICopZW1haWwtPmRhdGEpOworCWlmKCFlbXRtcCB8fCAhc2tfT1BFTlNTTF9TVFJJTkdfcHVzaCgqc2ssIGVtdG1wKSkgeworCQlYNTA5X2VtYWlsX2ZyZWUoKnNrKTsKKwkJKnNrID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCit2b2lkIFg1MDlfZW1haWxfZnJlZShTVEFDS19PRihPUEVOU1NMX1NUUklORykgKnNrKQoreworCXNrX09QRU5TU0xfU1RSSU5HX3BvcF9mcmVlKHNrLCBzdHJfZnJlZSk7Cit9CisKK3R5cGVkZWYgaW50ICgqZXF1YWxfZm4pKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBhdHRlcm4sIHNpemVfdCBwYXR0ZXJuX2xlbiwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnN1YmplY3QsIHNpemVfdCBzdWJqZWN0X2xlbik7CisKKy8qIENvbXBhcmUgd2hpbGUgQVNDSUkgaWdub3JpbmcgY2FzZS4gKi8KK3N0YXRpYyBpbnQgZXF1YWxfbm9jYXNlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBhdHRlcm4sIHNpemVfdCBwYXR0ZXJuX2xlbiwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnN1YmplY3QsIHNpemVfdCBzdWJqZWN0X2xlbikKKwl7CisJaWYgKHBhdHRlcm5fbGVuICE9IHN1YmplY3RfbGVuKQorCQlyZXR1cm4gMDsKKwl3aGlsZSAocGF0dGVybl9sZW4pCisJCXsKKwkJdW5zaWduZWQgY2hhciBsID0gKnBhdHRlcm47CisJCXVuc2lnbmVkIGNoYXIgciA9ICpzdWJqZWN0OworCQkvKiBUaGUgcGF0dGVybiBtdXN0IG5vdCBjb250YWluIE5VTCBjaGFyYWN0ZXJzLiAqLworCQlpZiAobCA9PSAwKQorCQkJcmV0dXJuIDA7CisJCWlmIChsICE9IHIpCisJCQl7CisJCQlpZiAoJ0EnIDw9IGwgJiYgbCA8PSAnWicpCisJCQkJbCA9IChsIC0gJ0EnKSArICdhJzsKKwkJCWlmICgnQScgPD0gciAmJiByIDw9ICdaJykKKwkJCQlyID0gKHIgLSAnQScpICsgJ2EnOworCQkJaWYgKGwgIT0gcikKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJKytwYXR0ZXJuOworCQkrK3N1YmplY3Q7CisJCS0tcGF0dGVybl9sZW47CisJCX0KKwlyZXR1cm4gMTsKKwl9CisKKy8qIENvbXBhcmUgdXNpbmcgbWVtY21wLiAqLworc3RhdGljIGludCBlcXVhbF9jYXNlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBhdHRlcm4sIHNpemVfdCBwYXR0ZXJuX2xlbiwKKwkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3ViamVjdCwgc2l6ZV90IHN1YmplY3RfbGVuKQoreworCS8qIFRoZSBwYXR0ZXJuIG11c3Qgbm90IGNvbnRhaW4gTlVMIGNoYXJhY3RlcnMuICovCisJaWYgKG1lbWNocihwYXR0ZXJuLCAnXDAnLCBwYXR0ZXJuX2xlbikgIT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJaWYgKHBhdHRlcm5fbGVuICE9IHN1YmplY3RfbGVuKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gIW1lbWNtcChwYXR0ZXJuLCBzdWJqZWN0LCBwYXR0ZXJuX2xlbik7Cit9CisKKy8qIFJGQyA1MjgwLCBzZWN0aW9uIDcuNSwgcmVxdWlyZXMgdGhhdCBvbmx5IHRoZSBkb21haW4gaXMgY29tcGFyZWQgaW4KKyAgIGEgY2FzZS1pbnNlbnNpdGl2ZSBtYW5uZXIuICovCitzdGF0aWMgaW50IGVxdWFsX2VtYWlsKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmEsIHNpemVfdCBhX2xlbiwKKwkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmIsIHNpemVfdCBiX2xlbikKKwl7CisJc2l6ZV90IGkgPSBhX2xlbjsKKwlpZiAoYV9sZW4gIT0gYl9sZW4pCisJCXJldHVybiAwOworCS8qIFdlIHNlYXJjaCBiYWNrd2FyZHMgZm9yIHRoZSAnQCcgY2hhcmFjdGVyLCBzbyB0aGF0IHdlIGRvCisJICAgbm90IGhhdmUgdG8gZGVhbCB3aXRoIHF1b3RlZCBsb2NhbC1wYXJ0cy4gIFRoZSBkb21haW4gcGFydAorCSAgIGlzIGNvbXBhcmVkIGluIGEgY2FzZS1pbnNlbnNpdGl2ZSBtYW5uZXIuICovCisJd2hpbGUgKGkgPiAwKQorCQl7CisJCS0taTsKKwkJaWYgKGFbaV0gPT0gJ0AnIHx8IGJbaV0gPT0gJ0AnKQorCQkJeworCQkJaWYgKCFlcXVhbF9ub2Nhc2UoYSArIGksIGFfbGVuIC0gaSwKKwkJCQkJICBiICsgaSwgYV9sZW4gLSBpKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWJyZWFrOworCQkJfQorCQl9CisJaWYgKGkgPT0gMCkKKwkJaSA9IGFfbGVuOworCXJldHVybiBlcXVhbF9jYXNlKGEsIGksIGIsIGkpOworCX0KKworLyogQ29tcGFyZSB0aGUgcHJlZml4IGFuZCBzdWZmaXggd2l0aCB0aGUgc3ViamVjdCwgYW5kIGNoZWNrIHRoYXQgdGhlCisgICBjaGFyYWN0ZXJzIGluLWJldHdlZW4gYXJlIHZhbGlkLiAqLworc3RhdGljIGludCB3aWxkY2FyZF9tYXRjaChjb25zdCB1bnNpZ25lZCBjaGFyICpwcmVmaXgsIHNpemVfdCBwcmVmaXhfbGVuLAorCQkJICBjb25zdCB1bnNpZ25lZCBjaGFyICpzdWZmaXgsIHNpemVfdCBzdWZmaXhfbGVuLAorCQkJICBjb25zdCB1bnNpZ25lZCBjaGFyICpzdWJqZWN0LCBzaXplX3Qgc3ViamVjdF9sZW4pCisJeworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKndpbGRjYXJkX3N0YXJ0OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKndpbGRjYXJkX2VuZDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwOworCWlmIChzdWJqZWN0X2xlbiA8IHByZWZpeF9sZW4gKyBzdWZmaXhfbGVuKQorCQlyZXR1cm4gMDsKKwlpZiAoIWVxdWFsX25vY2FzZShwcmVmaXgsIHByZWZpeF9sZW4sIHN1YmplY3QsIHByZWZpeF9sZW4pKQorCQlyZXR1cm4gMDsKKwl3aWxkY2FyZF9zdGFydCA9IHN1YmplY3QgKyBwcmVmaXhfbGVuOworCXdpbGRjYXJkX2VuZCA9IHN1YmplY3QgKyAoc3ViamVjdF9sZW4gLSBzdWZmaXhfbGVuKTsKKwlpZiAoIWVxdWFsX25vY2FzZSh3aWxkY2FyZF9lbmQsIHN1ZmZpeF9sZW4sIHN1ZmZpeCwgc3VmZml4X2xlbikpCisJCXJldHVybiAwOworCS8qIFRoZSB3aWxkY2FyZCBtdXN0IG1hdGNoIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIuICovCisJaWYgKHdpbGRjYXJkX3N0YXJ0ID09IHdpbGRjYXJkX2VuZCkKKwkJcmV0dXJuIDA7CisJLyogQ2hlY2sgdGhhdCB0aGUgcGFydCBtYXRjaGVkIGJ5IHRoZSB3aWxkY2FyZCBjb250YWlucyBvbmx5CisJICAgcGVybWl0dGVkIGNoYXJhY3RlcnMgYW5kIG9ubHkgbWF0Y2hlcyBhIHNpbmdsZSBsYWJlbC4gKi8KKwlmb3IgKHAgPSB3aWxkY2FyZF9zdGFydDsgcCAhPSB3aWxkY2FyZF9lbmQ7ICsrcCkKKwkJaWYgKCEoKCcwJyA8PSAqcCAmJiAqcCA8PSAnOScpIHx8CisJCSAgICAgICgnQScgPD0gKnAgJiYgKnAgPD0gJ1onKSB8fAorCQkgICAgICAoJ2EnIDw9ICpwICYmICpwIDw9ICd6JykgfHwKKwkJICAgICAgKnAgPT0gJy0nKSkKKwkJCXJldHVybiAwOworCXJldHVybiAxOworCX0KKworLyogQ2hlY2tzIGlmIHRoZSBtZW1vcnkgcmVnaW9uIGNvbnNpc3RlbnMgb2YgWzAtOUEtWmEtei4tXS4gKi8KK3N0YXRpYyBpbnQgdmFsaWRfZG9tYWluX2NoYXJhY3RlcnMoY29uc3QgdW5zaWduZWQgY2hhciAqcCwgc2l6ZV90IGxlbikKKwl7CisJd2hpbGUgKGxlbikKKwkJeworCQlpZiAoISgoJzAnIDw9ICpwICYmICpwIDw9ICc5JykgfHwKKwkJICAgICAgKCdBJyA8PSAqcCAmJiAqcCA8PSAnWicpIHx8CisJCSAgICAgICgnYScgPD0gKnAgJiYgKnAgPD0gJ3onKSB8fAorCQkgICAgICAqcCA9PSAnLScgfHwgKnAgPT0gJy4nKSkKKwkJCXJldHVybiAwOworCQkrK3A7CisJCS0tbGVuOworCQl9CisJcmV0dXJuIDE7CisJfQorCisvKiBGaW5kIHRoZSAnKicgaW4gYSB3aWxkY2FyZCBwYXR0ZXJuLiAgSWYgbm8gc3VjaCBjaGFyYWN0ZXIgaXMgZm91bmQKKyAgIG9yIHRoZSBwYXR0ZXJuIGlzIG90aGVyd2lzZSBpbnZhbGlkLCByZXR1cm5zIE5VTEwuICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciAqd2lsZGNhcmRfZmluZF9zdGFyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBhdHRlcm4sCisJCQkJCSAgICAgICBzaXplX3QgcGF0dGVybl9sZW4pCisJeworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnN0YXIgPSBtZW1jaHIocGF0dGVybiwgJyonLCBwYXR0ZXJuX2xlbik7CisJc2l6ZV90IGRvdF9jb3VudCA9IDA7CisJY29uc3QgdW5zaWduZWQgY2hhciAqc3VmZml4X3N0YXJ0OworCXNpemVfdCBzdWZmaXhfbGVuZ3RoOworCWlmIChzdGFyID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCXN1ZmZpeF9zdGFydCA9IHN0YXIgKyAxOworCXN1ZmZpeF9sZW5ndGggPSAocGF0dGVybiArIHBhdHRlcm5fbGVuKSAtIChzdGFyICsgMSk7CisJaWYgKCEodmFsaWRfZG9tYWluX2NoYXJhY3RlcnMocGF0dGVybiwgc3RhciAtIHBhdHRlcm4pICYmCisJICAgICAgdmFsaWRfZG9tYWluX2NoYXJhY3RlcnMoc3VmZml4X3N0YXJ0LCBzdWZmaXhfbGVuZ3RoKSkpCisJCXJldHVybiBOVUxMOworCS8qIENoZWNrIHRoYXQgdGhlIHN1ZmZpeCBtYXRjaGVzIGF0IGxlYXN0IHR3byBsYWJlbHMuICovCisJd2hpbGUgKHN1ZmZpeF9sZW5ndGgpCisJCXsKKwkJaWYgKCpzdWZmaXhfc3RhcnQgPT0gJy4nKQorCQkJKytkb3RfY291bnQ7CisJCSsrc3VmZml4X3N0YXJ0OworCQktLXN1ZmZpeF9sZW5ndGg7CisJCX0KKwlpZiAoZG90X2NvdW50IDwgMikKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIHN0YXI7CisJfQorCisvKiBDb21wYXJlIHVzaW5nIHdpbGRjYXJkcy4gKi8KK3N0YXRpYyBpbnQgZXF1YWxfd2lsZGNhcmQoY29uc3QgdW5zaWduZWQgY2hhciAqcGF0dGVybiwgc2l6ZV90IHBhdHRlcm5fbGVuLAorCQkJICBjb25zdCB1bnNpZ25lZCBjaGFyICpzdWJqZWN0LCBzaXplX3Qgc3ViamVjdF9sZW4pCisJeworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnN0YXIgPSB3aWxkY2FyZF9maW5kX3N0YXIocGF0dGVybiwgcGF0dGVybl9sZW4pOworCWlmIChzdGFyID09IE5VTEwpCisJCXJldHVybiBlcXVhbF9ub2Nhc2UocGF0dGVybiwgcGF0dGVybl9sZW4sCisJCQkJICAgIHN1YmplY3QsIHN1YmplY3RfbGVuKTsKKwlyZXR1cm4gd2lsZGNhcmRfbWF0Y2gocGF0dGVybiwgc3RhciAtIHBhdHRlcm4sCisJCQkgICAgICBzdGFyICsgMSwgKHBhdHRlcm4gKyBwYXR0ZXJuX2xlbikgLSBzdGFyIC0gMSwKKwkJCSAgICAgIHN1YmplY3QsIHN1YmplY3RfbGVuKTsKKwl9CisKKy8qIENvbXBhcmUgYW4gQVNOMV9TVFJJTkcgdG8gYSBzdXBwbGllZCBzdHJpbmcuIElmIHRoZXkgbWF0Y2gKKyAqIHJldHVybiAxLiBJZiBjbXBfdHlwZSA+IDAgb25seSBjb21wYXJlIGlmIHN0cmluZyBtYXRjaGVzIHRoZQorICogdHlwZSwgb3RoZXJ3aXNlIGNvbnZlcnQgaXQgdG8gVVRGOC4KKyAqLworCitzdGF0aWMgaW50IGRvX2NoZWNrX3N0cmluZyhBU04xX1NUUklORyAqYSwgaW50IGNtcF90eXBlLCBlcXVhbF9mbiBlcXVhbCwKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpiLCBzaXplX3QgYmxlbikKKwl7CisJaWYgKCFhLT5kYXRhIHx8ICFhLT5sZW5ndGgpCisJCXJldHVybiAwOworCWlmIChjbXBfdHlwZSA+IDApCisJCXsKKwkJaWYgKGNtcF90eXBlICE9IGEtPnR5cGUpCisJCQlyZXR1cm4gMDsKKwkJaWYgKGNtcF90eXBlID09IFZfQVNOMV9JQTVTVFJJTkcpCisJCQlyZXR1cm4gZXF1YWwoYS0+ZGF0YSwgYS0+bGVuZ3RoLCBiLCBibGVuKTsKKwkJaWYgKGEtPmxlbmd0aCA9PSAoaW50KWJsZW4gJiYgIW1lbWNtcChhLT5kYXRhLCBiLCBibGVuKSkKKwkJCXJldHVybiAxOworCQllbHNlCisJCQlyZXR1cm4gMDsKKwkJfQorCWVsc2UKKwkJeworCQlpbnQgYXN0cmxlbiwgcnY7CisJCXVuc2lnbmVkIGNoYXIgKmFzdHI7CisJCWFzdHJsZW4gPSBBU04xX1NUUklOR190b19VVEY4KCZhc3RyLCBhKTsKKwkJaWYgKGFzdHJsZW4gPCAwKQorCQkJcmV0dXJuIC0xOworCQlydiA9IGVxdWFsKGFzdHIsIGFzdHJsZW4sIGIsIGJsZW4pOworCQlPUEVOU1NMX2ZyZWUoYXN0cik7CisJCXJldHVybiBydjsKKwkJfQorCX0KKworc3RhdGljIGludCBkb194NTA5X2NoZWNrKFg1MDkgKngsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNoaywgc2l6ZV90IGNoa2xlbiwKKwkJCQkJdW5zaWduZWQgaW50IGZsYWdzLCBpbnQgY2hlY2tfdHlwZSkKKwl7CisJR0VORVJBTF9OQU1FUyAqZ2VucyA9IE5VTEw7CisJWDUwOV9OQU1FICpuYW1lID0gTlVMTDsKKwlzaXplX3QgaTsKKwlpbnQgajsKKwlpbnQgY25pZDsKKwlpbnQgYWx0X3R5cGU7CisJZXF1YWxfZm4gZXF1YWw7CisJaWYgKGNoZWNrX3R5cGUgPT0gR0VOX0VNQUlMKQorCQl7CisJCWNuaWQgPSBOSURfcGtjczlfZW1haWxBZGRyZXNzOworCQlhbHRfdHlwZSA9IFZfQVNOMV9JQTVTVFJJTkc7CisJCWVxdWFsID0gZXF1YWxfZW1haWw7CisJCX0KKwllbHNlIGlmIChjaGVja190eXBlID09IEdFTl9ETlMpCisJCXsKKwkJY25pZCA9IE5JRF9jb21tb25OYW1lOworCQlhbHRfdHlwZSA9IFZfQVNOMV9JQTVTVFJJTkc7CisJCWlmIChmbGFncyAmIFg1MDlfQ0hFQ0tfRkxBR19OT19XSUxEQ0FSRFMpCisJCQllcXVhbCA9IGVxdWFsX25vY2FzZTsKKwkJZWxzZQorCQkJZXF1YWwgPSBlcXVhbF93aWxkY2FyZDsKKwkJfQorCWVsc2UKKwkJeworCQljbmlkID0gMDsKKwkJYWx0X3R5cGUgPSBWX0FTTjFfT0NURVRfU1RSSU5HOworCQllcXVhbCA9IGVxdWFsX2Nhc2U7CisJCX0KKworCWlmIChjaGtsZW4gPT0gMCkKKwkJY2hrbGVuID0gc3RybGVuKChjb25zdCBjaGFyICopY2hrKTsKKworCWdlbnMgPSBYNTA5X2dldF9leHRfZDJpKHgsIE5JRF9zdWJqZWN0X2FsdF9uYW1lLCBOVUxMLCBOVUxMKTsKKwlpZiAoZ2VucykKKwkJeworCQlpbnQgcnYgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgc2tfR0VORVJBTF9OQU1FX251bShnZW5zKTsgaSsrKQorCQkJeworCQkJR0VORVJBTF9OQU1FICpnZW47CisJCQlBU04xX1NUUklORyAqY3N0cjsKKwkJCWdlbiA9IHNrX0dFTkVSQUxfTkFNRV92YWx1ZShnZW5zLCBpKTsKKwkJCWlmKGdlbi0+dHlwZSAhPSBjaGVja190eXBlKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGNoZWNrX3R5cGUgPT0gR0VOX0VNQUlMKQorCQkJCWNzdHIgPSBnZW4tPmQucmZjODIyTmFtZTsKKwkJCWVsc2UgaWYgKGNoZWNrX3R5cGUgPT0gR0VOX0ROUykKKwkJCQljc3RyID0gZ2VuLT5kLmROU05hbWU7CisJCQllbHNlCisJCQkJY3N0ciA9IGdlbi0+ZC5pUEFkZHJlc3M7CisJCQlpZiAoZG9fY2hlY2tfc3RyaW5nKGNzdHIsIGFsdF90eXBlLCBlcXVhbCwgY2hrLCBjaGtsZW4pKQorCQkJCXsKKwkJCQlydiA9IDE7CisJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQlHRU5FUkFMX05BTUVTX2ZyZWUoZ2Vucyk7CisJCWlmIChydikKKwkJCXJldHVybiAxOworCQlpZiAoIShmbGFncyAmIFg1MDlfQ0hFQ0tfRkxBR19BTFdBWVNfQ0hFQ0tfU1VCSkVDVCkgfHwgIWNuaWQpCisJCQlyZXR1cm4gMDsKKwkJfQorCWogPSAtMTsKKwluYW1lID0gWDUwOV9nZXRfc3ViamVjdF9uYW1lKHgpOworCXdoaWxlKChqID0gWDUwOV9OQU1FX2dldF9pbmRleF9ieV9OSUQobmFtZSwgY25pZCwgaikpID49IDApCisJCXsKKwkJWDUwOV9OQU1FX0VOVFJZICpuZTsKKwkJQVNOMV9TVFJJTkcgKnN0cjsKKwkJbmUgPSBYNTA5X05BTUVfZ2V0X2VudHJ5KG5hbWUsIGopOworCQlzdHIgPSBYNTA5X05BTUVfRU5UUllfZ2V0X2RhdGEobmUpOworCQlpZiAoZG9fY2hlY2tfc3RyaW5nKHN0ciwgLTEsIGVxdWFsLCBjaGssIGNoa2xlbikpCisJCQlyZXR1cm4gMTsKKwkJfQorCXJldHVybiAwOworCX0KKworaW50IFg1MDlfY2hlY2tfaG9zdChYNTA5ICp4LCBjb25zdCB1bnNpZ25lZCBjaGFyICpjaGssIHNpemVfdCBjaGtsZW4sCisJCQkJCXVuc2lnbmVkIGludCBmbGFncykKKwl7CisJcmV0dXJuIGRvX3g1MDlfY2hlY2soeCwgY2hrLCBjaGtsZW4sIGZsYWdzLCBHRU5fRE5TKTsKKwl9CisKK2ludCBYNTA5X2NoZWNrX2VtYWlsKFg1MDkgKngsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNoaywgc2l6ZV90IGNoa2xlbiwKKwkJCQkJdW5zaWduZWQgaW50IGZsYWdzKQorCXsKKwlyZXR1cm4gZG9feDUwOV9jaGVjayh4LCBjaGssIGNoa2xlbiwgZmxhZ3MsIEdFTl9FTUFJTCk7CisJfQorCitpbnQgWDUwOV9jaGVja19pcChYNTA5ICp4LCBjb25zdCB1bnNpZ25lZCBjaGFyICpjaGssIHNpemVfdCBjaGtsZW4sCisJCQkJCXVuc2lnbmVkIGludCBmbGFncykKKwl7CisJcmV0dXJuIGRvX3g1MDlfY2hlY2soeCwgY2hrLCBjaGtsZW4sIGZsYWdzLCBHRU5fSVBBREQpOworCX0KKworaW50IFg1MDlfY2hlY2tfaXBfYXNjKFg1MDkgKngsIGNvbnN0IGNoYXIgKmlwYXNjLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCisJeworCXVuc2lnbmVkIGNoYXIgaXBvdXRbMTZdOworCWludCBpcGxlbjsKKwlpcGxlbiA9IGEyaV9pcGFkZChpcG91dCwgaXBhc2MpOworCWlmIChpcGxlbiA9PSAwKQorCQlyZXR1cm4gLTI7CisJcmV0dXJuIGRvX3g1MDlfY2hlY2soeCwgaXBvdXQsIChzaXplX3QpaXBsZW4sIGZsYWdzLCBHRU5fSVBBREQpOworCX0KKworLyogQ29udmVydCBJUCBhZGRyZXNzZXMgYm90aCBJUHY0IGFuZCBJUHY2IGludG8gYW4gCisgKiBPQ1RFVCBTVFJJTkcgY29tcGF0aWJsZSB3aXRoIFJGQzMyODAuCisgKi8KKworQVNOMV9PQ1RFVF9TVFJJTkcgKmEyaV9JUEFERFJFU1MoY29uc3QgY2hhciAqaXBhc2MpCisJeworCXVuc2lnbmVkIGNoYXIgaXBvdXRbMTZdOworCUFTTjFfT0NURVRfU1RSSU5HICpyZXQ7CisJaW50IGlwbGVuOworCisJLyogSWYgc3RyaW5nIGNvbnRhaW5zIGEgJzonIGFzc3VtZSBJUHY2ICovCisKKwlpcGxlbiA9IGEyaV9pcGFkZChpcG91dCwgaXBhc2MpOworCisJaWYgKCFpcGxlbikKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXQgPSBBU04xX09DVEVUX1NUUklOR19uZXcoKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCFBU04xX09DVEVUX1NUUklOR19zZXQocmV0LCBpcG91dCwgaXBsZW4pKQorCQl7CisJCUFTTjFfT0NURVRfU1RSSU5HX2ZyZWUocmV0KTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKwlyZXR1cm4gcmV0OworCX0KKworQVNOMV9PQ1RFVF9TVFJJTkcgKmEyaV9JUEFERFJFU1NfTkMoY29uc3QgY2hhciAqaXBhc2MpCisJeworCUFTTjFfT0NURVRfU1RSSU5HICpyZXQgPSBOVUxMOworCXVuc2lnbmVkIGNoYXIgaXBvdXRbMzJdOworCWNoYXIgKmlwdG1wID0gTlVMTCwgKnA7CisJaW50IGlwbGVuMSwgaXBsZW4yOworCXAgPSBzdHJjaHIoaXBhc2MsJy8nKTsKKwlpZiAoIXApCisJCXJldHVybiBOVUxMOworCWlwdG1wID0gQlVGX3N0cmR1cChpcGFzYyk7CisJaWYgKCFpcHRtcCkKKwkJcmV0dXJuIE5VTEw7CisJcCA9IGlwdG1wICsgKHAgLSBpcGFzYyk7CisJKnArKyA9IDA7CisKKwlpcGxlbjEgPSBhMmlfaXBhZGQoaXBvdXQsIGlwdG1wKTsKKworCWlmICghaXBsZW4xKQorCQlnb3RvIGVycjsKKworCWlwbGVuMiA9IGEyaV9pcGFkZChpcG91dCArIGlwbGVuMSwgcCk7CisKKwlPUEVOU1NMX2ZyZWUoaXB0bXApOworCWlwdG1wID0gTlVMTDsKKworCWlmICghaXBsZW4yIHx8IChpcGxlbjEgIT0gaXBsZW4yKSkKKwkJZ290byBlcnI7CisKKwlyZXQgPSBBU04xX09DVEVUX1NUUklOR19uZXcoKTsKKwlpZiAoIXJldCkKKwkJZ290byBlcnI7CisJaWYgKCFBU04xX09DVEVUX1NUUklOR19zZXQocmV0LCBpcG91dCwgaXBsZW4xICsgaXBsZW4yKSkKKwkJZ290byBlcnI7CisKKwlyZXR1cm4gcmV0OworCisJZXJyOgorCWlmIChpcHRtcCkKKwkJT1BFTlNTTF9mcmVlKGlwdG1wKTsKKwlpZiAocmV0KQorCQlBU04xX09DVEVUX1NUUklOR19mcmVlKHJldCk7CisJcmV0dXJuIE5VTEw7CisJfQorCQorCitpbnQgYTJpX2lwYWRkKHVuc2lnbmVkIGNoYXIgKmlwb3V0LCBjb25zdCBjaGFyICppcGFzYykKKwl7CisJLyogSWYgc3RyaW5nIGNvbnRhaW5zIGEgJzonIGFzc3VtZSBJUHY2ICovCisKKwlpZiAoc3RyY2hyKGlwYXNjLCAnOicpKQorCQl7CisJCWlmICghaXB2Nl9mcm9tX2FzYyhpcG91dCwgaXBhc2MpKQorCQkJcmV0dXJuIDA7CisJCXJldHVybiAxNjsKKwkJfQorCWVsc2UKKwkJeworCQlpZiAoIWlwdjRfZnJvbV9hc2MoaXBvdXQsIGlwYXNjKSkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gNDsKKwkJfQorCX0KKworc3RhdGljIGludCBpcHY0X2Zyb21fYXNjKHVuc2lnbmVkIGNoYXIgKnY0LCBjb25zdCBjaGFyICppbikKKwl7CisJaW50IGEwLCBhMSwgYTIsIGEzOworCWlmIChzc2NhbmYoaW4sICIlZC4lZC4lZC4lZCIsICZhMCwgJmExLCAmYTIsICZhMykgIT0gNCkKKwkJcmV0dXJuIDA7CisJaWYgKChhMCA8IDApIHx8IChhMCA+IDI1NSkgfHwgKGExIDwgMCkgfHwgKGExID4gMjU1KQorCQl8fCAoYTIgPCAwKSB8fCAoYTIgPiAyNTUpIHx8IChhMyA8IDApIHx8IChhMyA+IDI1NSkpCisJCXJldHVybiAwOworCXY0WzBdID0gYTA7CisJdjRbMV0gPSBhMTsKKwl2NFsyXSA9IGEyOworCXY0WzNdID0gYTM7CisJcmV0dXJuIDE7CisJfQorCit0eXBlZGVmIHN0cnVjdCB7CisJCS8qIFRlbXBvcmFyeSBzdG9yZSBmb3IgSVBWNiBvdXRwdXQgKi8KKwkJdW5zaWduZWQgY2hhciB0bXBbMTZdOworCQkvKiBUb3RhbCBudW1iZXIgb2YgYnl0ZXMgaW4gdG1wICovCisJCWludCB0b3RhbDsKKwkJLyogVGhlIHBvc2l0aW9uIG9mIGEgemVybyAoY29ycmVzcG9uZGluZyB0byAnOjonKSAqLworCQlpbnQgemVyb19wb3M7CisJCS8qIE51bWJlciBvZiB6ZXJvZXMgKi8KKwkJaW50IHplcm9fY250OworCX0gSVBWNl9TVEFUOworCisKK3N0YXRpYyBpbnQgaXB2Nl9mcm9tX2FzYyh1bnNpZ25lZCBjaGFyICp2NiwgY29uc3QgY2hhciAqaW4pCisJeworCUlQVjZfU1RBVCB2NnN0YXQ7CisJdjZzdGF0LnRvdGFsID0gMDsKKwl2NnN0YXQuemVyb19wb3MgPSAtMTsKKwl2NnN0YXQuemVyb19jbnQgPSAwOworCS8qIFRyZWF0IHRoZSBJUHY2IHJlcHJlc2VudGF0aW9uIGFzIGEgbGlzdCBvZiB2YWx1ZXMKKwkgKiBzZXBhcmF0ZWQgYnkgJzonLiBUaGUgcHJlc2VuY2Ugb2YgYSAnOjonIHdpbGwgcGFyc2UKKyAJICogYXMgb25lLCB0d28gb3IgdGhyZWUgemVybyBsZW5ndGggZWxlbWVudHMuCisJICovCisJaWYgKCFDT05GX3BhcnNlX2xpc3QoaW4sICc6JywgMCwgaXB2Nl9jYiwgJnY2c3RhdCkpCisJCXJldHVybiAwOworCisJLyogTm93IGZvciBzb21lIHNhbml0eSBjaGVja3MgKi8KKworCWlmICh2NnN0YXQuemVyb19wb3MgPT0gLTEpCisJCXsKKwkJLyogSWYgbm8gJzo6JyBtdXN0IGhhdmUgZXhhY3RseSAxNiBieXRlcyAqLworCQlpZiAodjZzdGF0LnRvdGFsICE9IDE2KQorCQkJcmV0dXJuIDA7CisJCX0KKwllbHNlIAorCQl7CisJCS8qIElmICc6OicgbXVzdCBoYXZlIGxlc3MgdGhhbiAxNiBieXRlcyAqLworCQlpZiAodjZzdGF0LnRvdGFsID09IDE2KQorCQkJcmV0dXJuIDA7CisJCS8qIE1vcmUgdGhhbiB0aHJlZSB6ZXJvZXMgaXMgYW4gZXJyb3IgKi8KKwkJaWYgKHY2c3RhdC56ZXJvX2NudCA+IDMpCisJCQlyZXR1cm4gMDsKKwkJLyogQ2FuIG9ubHkgaGF2ZSB0aHJlZSB6ZXJvZXMgaWYgbm90aGluZyBlbHNlIHByZXNlbnQgKi8KKwkJZWxzZSBpZiAodjZzdGF0Lnplcm9fY250ID09IDMpCisJCQl7CisJCQlpZiAodjZzdGF0LnRvdGFsID4gMCkKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJLyogQ2FuIG9ubHkgaGF2ZSB0d28gemVyb2VzIGlmIGF0IHN0YXJ0IG9yIGVuZCAqLworCQllbHNlIGlmICh2NnN0YXQuemVyb19jbnQgPT0gMikKKwkJCXsKKwkJCWlmICgodjZzdGF0Lnplcm9fcG9zICE9IDApCisJCQkJJiYgKHY2c3RhdC56ZXJvX3BvcyAhPSB2NnN0YXQudG90YWwpKQorCQkJCXJldHVybiAwOworCQkJfQorCQllbHNlIAorCQkvKiBDYW4gb25seSBoYXZlIG9uZSB6ZXJvIGlmICpub3QqIHN0YXJ0IG9yIGVuZCAqLworCQkJeworCQkJaWYgKCh2NnN0YXQuemVyb19wb3MgPT0gMCkKKwkJCQl8fCAodjZzdGF0Lnplcm9fcG9zID09IHY2c3RhdC50b3RhbCkpCisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKworCS8qIEZvcm1hdCByZXN1bHQgKi8KKworCWlmICh2NnN0YXQuemVyb19wb3MgPj0gMCkKKwkJeworCQkvKiBDb3B5IGluaXRpYWwgcGFydCAqLworCQltZW1jcHkodjYsIHY2c3RhdC50bXAsIHY2c3RhdC56ZXJvX3Bvcyk7CisJCS8qIFplcm8gbWlkZGxlICovCisJCW1lbXNldCh2NiArIHY2c3RhdC56ZXJvX3BvcywgMCwgMTYgLSB2NnN0YXQudG90YWwpOworCQkvKiBDb3B5IGZpbmFsIHBhcnQgKi8KKwkJaWYgKHY2c3RhdC50b3RhbCAhPSB2NnN0YXQuemVyb19wb3MpCisJCQltZW1jcHkodjYgKyB2NnN0YXQuemVyb19wb3MgKyAxNiAtIHY2c3RhdC50b3RhbCwKKwkJCQl2NnN0YXQudG1wICsgdjZzdGF0Lnplcm9fcG9zLAorCQkJCXY2c3RhdC50b3RhbCAtIHY2c3RhdC56ZXJvX3Bvcyk7CisJCX0KKwllbHNlCisJCW1lbWNweSh2NiwgdjZzdGF0LnRtcCwgMTYpOworCisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IGlwdjZfY2IoY29uc3QgY2hhciAqZWxlbSwgaW50IGxlbiwgdm9pZCAqdXNyKQorCXsKKwlJUFY2X1NUQVQgKnMgPSB1c3I7CisJLyogRXJyb3IgaWYgMTYgYnl0ZXMgd3JpdHRlbiAqLworCWlmIChzLT50b3RhbCA9PSAxNikKKwkJcmV0dXJuIDA7CisJaWYgKGxlbiA9PSAwKQorCQl7CisJCS8qIFplcm8gbGVuZ3RoIGVsZW1lbnQsIGNvcnJlc3BvbmRzIHRvICc6OicgKi8KKwkJaWYgKHMtPnplcm9fcG9zID09IC0xKQorCQkJcy0+emVyb19wb3MgPSBzLT50b3RhbDsKKwkJLyogSWYgd2UndmUgYWxyZWFkeSBnb3QgYSA6OiBpdHMgYW4gZXJyb3IgKi8KKwkJZWxzZSBpZiAocy0+emVyb19wb3MgIT0gcy0+dG90YWwpCisJCQlyZXR1cm4gMDsKKwkJcy0+emVyb19jbnQrKzsKKwkJfQorCWVsc2UgCisJCXsKKwkJLyogSWYgbW9yZSB0aGFuIDQgY2hhcmFjdGVycyBjb3VsZCBiZSBmaW5hbCBhLmIuYy5kIGZvcm0gKi8KKwkJaWYgKGxlbiA+IDQpCisJCQl7CisJCQkvKiBOZWVkIGF0IGxlYXN0IDQgYnl0ZXMgbGVmdCAqLworCQkJaWYgKHMtPnRvdGFsID4gMTIpCisJCQkJcmV0dXJuIDA7CisJCQkvKiBNdXN0IGJlIGVuZCBvZiBzdHJpbmcgKi8KKwkJCWlmIChlbGVtW2xlbl0pCisJCQkJcmV0dXJuIDA7CisJCQlpZiAoIWlwdjRfZnJvbV9hc2Mocy0+dG1wICsgcy0+dG90YWwsIGVsZW0pKQorCQkJCXJldHVybiAwOworCQkJcy0+dG90YWwgKz0gNDsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJaWYgKCFpcHY2X2hleChzLT50bXAgKyBzLT50b3RhbCwgZWxlbSwgbGVuKSkKKwkJCQlyZXR1cm4gMDsKKwkJCXMtPnRvdGFsICs9IDI7CisJCQl9CisJCX0KKwlyZXR1cm4gMTsKKwl9CisKKy8qIENvbnZlcnQgYSBzdHJpbmcgb2YgdXAgdG8gNCBoZXggZGlnaXRzIGludG8gdGhlIGNvcnJlc3BvbmRpbmcKKyAqIElQdjYgZm9ybS4KKyAqLworCitzdGF0aWMgaW50IGlwdjZfaGV4KHVuc2lnbmVkIGNoYXIgKm91dCwgY29uc3QgY2hhciAqaW4sIGludCBpbmxlbikKKwl7CisJdW5zaWduZWQgY2hhciBjOworCXVuc2lnbmVkIGludCBudW0gPSAwOworCWlmIChpbmxlbiA+IDQpCisJCXJldHVybiAwOworCXdoaWxlKGlubGVuLS0pCisJCXsKKwkJYyA9ICppbisrOworCQludW0gPDw9IDQ7CisJCWlmICgoYyA+PSAnMCcpICYmIChjIDw9ICc5JykpCisJCQludW0gfD0gYyAtICcwJzsKKwkJZWxzZSBpZiAoKGMgPj0gJ0EnKSAmJiAoYyA8PSAnRicpKQorCQkJbnVtIHw9IGMgLSAnQScgKyAxMDsKKwkJZWxzZSBpZiAoKGMgPj0gJ2EnKSAmJiAoYyA8PSAnZicpKQorCQkJbnVtIHw9ICBjIC0gJ2EnICsgMTA7CisJCWVsc2UKKwkJCXJldHVybiAwOworCQl9CisJb3V0WzBdID0gbnVtID4+IDg7CisJb3V0WzFdID0gbnVtICYgMHhmZjsKKwlyZXR1cm4gMTsKKwl9CisKKworaW50IFg1MDlWM19OQU1FX2Zyb21fc2VjdGlvbihYNTA5X05BTUUgKm5tLCBTVEFDS19PRihDT05GX1ZBTFVFKSpkbl9zaywKKwkJCQkJCXVuc2lnbmVkIGxvbmcgY2h0eXBlKQorCXsKKwlDT05GX1ZBTFVFICp2OworCWludCBtdmFsOworCXNpemVfdCBpOworCWNoYXIgKnAsICp0eXBlOworCWlmICghbm0pCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IHNrX0NPTkZfVkFMVUVfbnVtKGRuX3NrKTsgaSsrKQorCQl7CisJCXY9c2tfQ09ORl9WQUxVRV92YWx1ZShkbl9zayxpKTsKKwkJdHlwZT12LT5uYW1lOworCQkvKiBTa2lwIHBhc3QgYW55IGxlYWRpbmcgWC4gWDogWCwgZXRjIHRvIGFsbG93IGZvcgorCQkgKiBtdWx0aXBsZSBpbnN0YW5jZXMgCisJCSAqLworCQlmb3IocCA9IHR5cGU7ICpwIDsgcCsrKSAKKyNpZm5kZWYgQ0hBUlNFVF9FQkNESUMKKwkJCWlmICgoKnAgPT0gJzonKSB8fCAoKnAgPT0gJywnKSB8fCAoKnAgPT0gJy4nKSkKKyNlbHNlCisJCQlpZiAoKCpwID09IG9zX3RvYXNjaWlbJzonXSkgfHwgKCpwID09IG9zX3RvYXNjaWlbJywnXSkgfHwgKCpwID09IG9zX3RvYXNjaWlbJy4nXSkpCisjZW5kaWYKKwkJCQl7CisJCQkJcCsrOworCQkJCWlmKCpwKSB0eXBlID0gcDsKKwkJCQlicmVhazsKKwkJCQl9CisjaWZuZGVmIENIQVJTRVRfRUJDRElDCisJCWlmICgqdHlwZSA9PSAnKycpCisjZWxzZQorCQlpZiAoKnR5cGUgPT0gb3NfdG9hc2NpaVsnKyddKQorI2VuZGlmCisJCQl7CisJCQltdmFsID0gLTE7CisJCQl0eXBlKys7CisJCQl9CisJCWVsc2UKKwkJCW12YWwgPSAwOworCQlpZiAoIVg1MDlfTkFNRV9hZGRfZW50cnlfYnlfdHh0KG5tLHR5cGUsIGNodHlwZSwKKwkJCQkodW5zaWduZWQgY2hhciAqKSB2LT52YWx1ZSwtMSwtMSxtdmFsKSkKKwkJCQkJcmV0dXJuIDA7CisKKwkJfQorCXJldHVybiAxOworCX0KZGlmZiAtLWdpdCBhL2NyeXB0by94NTA5djMvdjNuYW1ldGVzdC5jIGIvY3J5cHRvL3g1MDl2My92M25hbWV0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVkM2UxMAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94NTA5djMvdjNuYW1ldGVzdC5jCkBAIC0wLDAgKzEsNDE4IEBACisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS4gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RyaW5ncy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbmFtZXNbXSA9CisJeworCSJhIiwgImIiLCAiLiIsICIqIiwgIkAiLAorCSIuYSIsICJhLiIsICIuYiIsICJiLiIsICIuKiIsICIqLiIsICIqQCIsICJAKiIsICJhQCIsICJAYSIsICJiQCIsICIuLiIsCisJIkBAIiwgIioqIiwKKwkiKi5jb20iLCAiKmNvbSIsICIqLiouY29tIiwgIipjb20iLCAiY29tKiIsICIqZXhhbXBsZS5jb20iLAorCSIqQGV4YW1wbGUuY29tIiwgInRlc3RAKi5leGFtcGxlLmNvbSIsCisJImV4YW1wbGUuY29tIiwgInd3dy5leGFtcGxlLmNvbSIsICJ0ZXN0Lnd3dy5leGFtcGxlLmNvbSIsCisJIiouZXhhbXBsZS5jb20iLCAiKi53d3cuZXhhbXBsZS5jb20iLCAidGVzdC4qLmV4YW1wbGUuY29tIiwgInd3dy4qLmNvbSIsCisJImV4YW1wbGUubmV0IiwgInhuLS1yZ2VyLWtvYS5leGFtcGxlLmNvbSIsCisJImEuZXhhbXBsZS5jb20iLCAiYi5leGFtcGxlLmNvbSIsCisJInBvc3RtYXN0ZXJAZXhhbXBsZS5jb20iLCAiUG9zdG1hc3RlckBleGFtcGxlLmNvbSIsCisJInBvc3RtYXN0ZXJARVhBTVBMRS5DT00iLAorCU5VTEwKKwl9OworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZXhjZXB0aW9uc1tdID0KKwl7CisJInNldCBDTjogaG9zdDogWyouZXhhbXBsZS5jb21dIGRvZXMgbm90IG1hdGNoIFsqLmV4YW1wbGUuY29tXSIsCisJInNldCBDTjogaG9zdDogWyouZXhhbXBsZS5jb21dIG1hdGNoZXMgW2EuZXhhbXBsZS5jb21dIiwKKwkic2V0IENOOiBob3N0OiBbKi5leGFtcGxlLmNvbV0gbWF0Y2hlcyBbYi5leGFtcGxlLmNvbV0iLAorCSJzZXQgQ046IGhvc3Q6IFsqLmV4YW1wbGUuY29tXSBtYXRjaGVzIFt3d3cuZXhhbXBsZS5jb21dIiwKKwkic2V0IENOOiBob3N0OiBbKi5leGFtcGxlLmNvbV0gbWF0Y2hlcyBbeG4tLXJnZXIta29hLmV4YW1wbGUuY29tXSIsCisJInNldCBDTjogaG9zdDogW3Rlc3QuKi5leGFtcGxlLmNvbV0gZG9lcyBub3QgbWF0Y2ggW3Rlc3QuKi5leGFtcGxlLmNvbV0iLAorCSJzZXQgQ046IGhvc3Q6IFt0ZXN0LiouZXhhbXBsZS5jb21dIG1hdGNoZXMgW3Rlc3Qud3d3LmV4YW1wbGUuY29tXSIsCisJInNldCBDTjogaG9zdDogWyoud3d3LmV4YW1wbGUuY29tXSBkb2VzIG5vdCBtYXRjaCBbKi53d3cuZXhhbXBsZS5jb21dIiwKKwkic2V0IENOOiBob3N0OiBbKi53d3cuZXhhbXBsZS5jb21dIG1hdGNoZXMgW3Rlc3Qud3d3LmV4YW1wbGUuY29tXSIsCisJInNldCBlbWFpbEFkZHJlc3M6IGVtYWlsOiBbcG9zdG1hc3RlckBleGFtcGxlLmNvbV0gZG9lcyBub3QgbWF0Y2ggW1Bvc3RtYXN0ZXJAZXhhbXBsZS5jb21dIiwKKwkic2V0IGVtYWlsQWRkcmVzczogZW1haWw6IFtwb3N0bWFzdGVyQEVYQU1QTEUuQ09NXSBkb2VzIG5vdCBtYXRjaCBbUG9zdG1hc3RlckBleGFtcGxlLmNvbV0iLAorCSJzZXQgZW1haWxBZGRyZXNzOiBlbWFpbDogW1Bvc3RtYXN0ZXJAZXhhbXBsZS5jb21dIGRvZXMgbm90IG1hdGNoIFtwb3N0bWFzdGVyQGV4YW1wbGUuY29tXSIsCisJInNldCBlbWFpbEFkZHJlc3M6IGVtYWlsOiBbUG9zdG1hc3RlckBleGFtcGxlLmNvbV0gZG9lcyBub3QgbWF0Y2ggW3Bvc3RtYXN0ZXJARVhBTVBMRS5DT01dIiwKKwkic2V0IGRuc05hbWU6IGhvc3Q6IFsqLmV4YW1wbGUuY29tXSBtYXRjaGVzIFt3d3cuZXhhbXBsZS5jb21dIiwKKwkic2V0IGRuc05hbWU6IGhvc3Q6IFsqLmV4YW1wbGUuY29tXSBkb2VzIG5vdCBtYXRjaCBbKi5leGFtcGxlLmNvbV0iLAorCSJzZXQgZG5zTmFtZTogaG9zdDogWyouZXhhbXBsZS5jb21dIG1hdGNoZXMgW2EuZXhhbXBsZS5jb21dIiwKKwkic2V0IGRuc05hbWU6IGhvc3Q6IFsqLmV4YW1wbGUuY29tXSBtYXRjaGVzIFtiLmV4YW1wbGUuY29tXSIsCisJInNldCBkbnNOYW1lOiBob3N0OiBbKi5leGFtcGxlLmNvbV0gbWF0Y2hlcyBbeG4tLXJnZXIta29hLmV4YW1wbGUuY29tXSIsCisJInNldCBkbnNOYW1lOiBob3N0OiBbKi53d3cuZXhhbXBsZS5jb21dIG1hdGNoZXMgW3Rlc3Qud3d3LmV4YW1wbGUuY29tXSIsCisJInNldCBkbnNOYW1lOiBob3N0OiBbKi53d3cuZXhhbXBsZS5jb21dIGRvZXMgbm90IG1hdGNoIFsqLnd3dy5leGFtcGxlLmNvbV0iLAorCSJzZXQgZG5zTmFtZTogaG9zdDogW3Rlc3QuKi5leGFtcGxlLmNvbV0gbWF0Y2hlcyBbdGVzdC53d3cuZXhhbXBsZS5jb21dIiwKKwkic2V0IGRuc05hbWU6IGhvc3Q6IFt0ZXN0LiouZXhhbXBsZS5jb21dIGRvZXMgbm90IG1hdGNoIFt0ZXN0LiouZXhhbXBsZS5jb21dIiwKKwkic2V0IHJmYzgyMk5hbWU6IGVtYWlsOiBbcG9zdG1hc3RlckBleGFtcGxlLmNvbV0gZG9lcyBub3QgbWF0Y2ggW1Bvc3RtYXN0ZXJAZXhhbXBsZS5jb21dIiwKKwkic2V0IHJmYzgyMk5hbWU6IGVtYWlsOiBbUG9zdG1hc3RlckBleGFtcGxlLmNvbV0gZG9lcyBub3QgbWF0Y2ggW3Bvc3RtYXN0ZXJAZXhhbXBsZS5jb21dIiwKKwkic2V0IHJmYzgyMk5hbWU6IGVtYWlsOiBbUG9zdG1hc3RlckBleGFtcGxlLmNvbV0gZG9lcyBub3QgbWF0Y2ggW3Bvc3RtYXN0ZXJARVhBTVBMRS5DT01dIiwKKwkic2V0IHJmYzgyMk5hbWU6IGVtYWlsOiBbcG9zdG1hc3RlckBFWEFNUExFLkNPTV0gZG9lcyBub3QgbWF0Y2ggW1Bvc3RtYXN0ZXJAZXhhbXBsZS5jb21dIiwKKwlOVUxMCisJfTsKKworc3RhdGljIGludCBpc19leGNlcHRpb24oY29uc3QgY2hhciAqbXNnKQorCXsKKwljb25zdCBjaGFyICpjb25zdCAqcDsKKwlmb3IgKHAgPSBleGNlcHRpb25zOyAqcDsgKytwKQorCQlpZiAoc3RyY21wKG1zZywgKnApID09IDApCisJCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKKwl9CisKK3N0YXRpYyBpbnQgc2V0X2NuKFg1MDkgKmNydCwgLi4uKQorCXsKKwlpbnQgcmV0ID0gMDsKKwlYNTA5X05BTUUgKm4gPSBOVUxMOworCXZhX2xpc3QgYXA7CisJdmFfc3RhcnQoYXAsIGNydCk7CisJbiA9IFg1MDlfTkFNRV9uZXcoKTsKKwlpZiAobiA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwl3aGlsZSAoMSkgeworCQlpbnQgbmlkOworCQljb25zdCBjaGFyICpuYW1lOworCQluaWQgPSB2YV9hcmcoYXAsIGludCk7CisJCWlmIChuaWQgPT0gMCkKKwkJCWJyZWFrOworCQluYW1lID0gdmFfYXJnKGFwLCBjb25zdCBjaGFyICopOworCQlpZiAoIVg1MDlfTkFNRV9hZGRfZW50cnlfYnlfTklEKG4sIG5pZCwgTUJTVFJJTkdfQVNDLAorCQkJCQkJCSh1bnNpZ25lZCBjaGFyICopbmFtZSwKKwkJCQkJCS0xLCAtMSwgMSkpCisJCQlnb3RvIG91dDsKKwl9CisJaWYgKCFYNTA5X3NldF9zdWJqZWN0X25hbWUoY3J0LCBuKSkKKwkJZ290byBvdXQ7CisJcmV0ID0gMTsKKyBvdXQ6CisJWDUwOV9OQU1FX2ZyZWUobik7CisJdmFfZW5kKGFwKTsKKwlyZXR1cm4gcmV0OworCX0KKworLyoKK2ludAkJWDUwOV9hZGRfZXh0KFg1MDkgKngsIFg1MDlfRVhURU5TSU9OICpleCwgaW50IGxvYyk7CitYNTA5X0VYVEVOU0lPTiAqWDUwOV9FWFRFTlNJT05fY3JlYXRlX2J5X05JRChYNTA5X0VYVEVOU0lPTiAqKmV4LAorCQkJaW50IG5pZCwgaW50IGNyaXQsIEFTTjFfT0NURVRfU1RSSU5HICpkYXRhKTsKK2ludAkJWDUwOV9hZGRfZXh0KFg1MDkgKngsIFg1MDlfRVhURU5TSU9OICpleCwgaW50IGxvYyk7CisqLworCitzdGF0aWMgaW50IHNldF9hbHRuYW1lKFg1MDkgKmNydCwgLi4uKQorCXsKKwlpbnQgcmV0ID0gMDsKKwlHRU5FUkFMX05BTUVTICpnZW5zID0gTlVMTDsKKwlHRU5FUkFMX05BTUUgKmdlbiA9IE5VTEw7CisJQVNOMV9JQTVTVFJJTkcgKmlhNSA9IE5VTEw7CisJdmFfbGlzdCBhcDsKKwl2YV9zdGFydChhcCwgY3J0KTsKKwlnZW5zID0gc2tfR0VORVJBTF9OQU1FX25ld19udWxsKCk7CisJaWYgKGdlbnMgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJd2hpbGUgKDEpIHsKKwkJaW50IHR5cGU7CisJCWNvbnN0IGNoYXIgKm5hbWU7CisJCXR5cGUgPSB2YV9hcmcoYXAsIGludCk7CisJCWlmICh0eXBlID09IDApCisJCQlicmVhazsKKwkJbmFtZSA9IHZhX2FyZyhhcCwgY29uc3QgY2hhciAqKTsKKworCQlnZW4gPSBHRU5FUkFMX05BTUVfbmV3KCk7CisJCWlmIChnZW4gPT0gTlVMTCkKKwkJCWdvdG8gb3V0OworCQlpYTUgPSBBU04xX0lBNVNUUklOR19uZXcoKTsKKwkJaWYgKGlhNSA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisJCWlmICghQVNOMV9TVFJJTkdfc2V0KGlhNSwgbmFtZSwgLTEpKQorCQkJZ290byBvdXQ7CisJCXN3aXRjaCAodHlwZSkKKwkJCXsKKwkJCWNhc2UgR0VOX0VNQUlMOgorCQkJY2FzZSBHRU5fRE5TOgorCQkJCUdFTkVSQUxfTkFNRV9zZXQwX3ZhbHVlKGdlbiwgdHlwZSwgaWE1KTsKKwkJCQlpYTUgPSBOVUxMOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlhYm9ydCgpOworCQkJfQorCQlza19HRU5FUkFMX05BTUVfcHVzaChnZW5zLCBnZW4pOworCQlnZW4gPSBOVUxMOworCX0KKwlpZiAoIVg1MDlfYWRkMV9leHRfaTJkKGNydCwgTklEX3N1YmplY3RfYWx0X25hbWUsIGdlbnMsIDAsIDApKQorCQlnb3RvIG91dDsKKwlyZXQgPSAxOworIG91dDoKKwlBU04xX0lBNVNUUklOR19mcmVlKGlhNSk7CisJR0VORVJBTF9OQU1FX2ZyZWUoZ2VuKTsKKwlHRU5FUkFMX05BTUVTX2ZyZWUoZ2Vucyk7CisJdmFfZW5kKGFwKTsKKwlyZXR1cm4gcmV0OworCX0KKworc3RhdGljIGludCBzZXRfY24xKFg1MDkgKmNydCwgY29uc3QgY2hhciAqbmFtZSkKKwl7CisJcmV0dXJuIHNldF9jbihjcnQsIE5JRF9jb21tb25OYW1lLCBuYW1lLCAwKTsKKwl9CisKKworc3RhdGljIGludCBzZXRfY25fYW5kX2VtYWlsKFg1MDkgKmNydCwgY29uc3QgY2hhciAqbmFtZSkKKwl7CisJcmV0dXJuIHNldF9jbihjcnQsIE5JRF9jb21tb25OYW1lLCBuYW1lLAorCQkgICAgICBOSURfcGtjczlfZW1haWxBZGRyZXNzLCAiZHVtbXlAZXhhbXBsZS5jb20iLCAwKTsKKwl9CisKK3N0YXRpYyBpbnQgc2V0X2NuMihYNTA5ICpjcnQsIGNvbnN0IGNoYXIgKm5hbWUpCisJeworCXJldHVybiBzZXRfY24oY3J0LCBOSURfY29tbW9uTmFtZSwgImR1bW15IHZhbHVlIiwKKwkJICAgICAgTklEX2NvbW1vbk5hbWUsIG5hbWUsIDApOworCX0KKworc3RhdGljIGludCBzZXRfY24zKFg1MDkgKmNydCwgY29uc3QgY2hhciAqbmFtZSkKKwl7CisJcmV0dXJuIHNldF9jbihjcnQsIE5JRF9jb21tb25OYW1lLCBuYW1lLAorCQkgICAgICBOSURfY29tbW9uTmFtZSwgImR1bW15IHZhbHVlIiwgMCk7CisJfQorCitzdGF0aWMgaW50IHNldF9lbWFpbDEoWDUwOSAqY3J0LCBjb25zdCBjaGFyICpuYW1lKQorCXsKKwlyZXR1cm4gc2V0X2NuKGNydCwgTklEX3BrY3M5X2VtYWlsQWRkcmVzcywgbmFtZSwgMCk7CisJfQorCitzdGF0aWMgaW50IHNldF9lbWFpbDIoWDUwOSAqY3J0LCBjb25zdCBjaGFyICpuYW1lKQorCXsKKwlyZXR1cm4gc2V0X2NuKGNydCwgTklEX3BrY3M5X2VtYWlsQWRkcmVzcywgImR1bW15QGV4YW1wbGUuY29tIiwKKwkJICAgICAgTklEX3BrY3M5X2VtYWlsQWRkcmVzcywgbmFtZSwgMCk7CisJfQorCitzdGF0aWMgaW50IHNldF9lbWFpbDMoWDUwOSAqY3J0LCBjb25zdCBjaGFyICpuYW1lKQorCXsKKwlyZXR1cm4gc2V0X2NuKGNydCwgTklEX3BrY3M5X2VtYWlsQWRkcmVzcywgbmFtZSwKKwkJICAgICAgTklEX3BrY3M5X2VtYWlsQWRkcmVzcywgImR1bW15QGV4YW1wbGUuY29tIiwgMCk7CisJfQorCitzdGF0aWMgaW50IHNldF9lbWFpbF9hbmRfY24oWDUwOSAqY3J0LCBjb25zdCBjaGFyICpuYW1lKQorCXsKKwlyZXR1cm4gc2V0X2NuKGNydCwgTklEX3BrY3M5X2VtYWlsQWRkcmVzcywgbmFtZSwKKwkJICAgICAgTklEX2NvbW1vbk5hbWUsICJ3d3cuZXhhbXBsZS5vcmciLCAwKTsKKwl9CisKK3N0YXRpYyBpbnQgc2V0X2FsdG5hbWVfZG5zKFg1MDkgKmNydCwgY29uc3QgY2hhciAqbmFtZSkKKwl7CisJcmV0dXJuIHNldF9hbHRuYW1lKGNydCwgR0VOX0ROUywgbmFtZSwgMCk7CisJfQorCitzdGF0aWMgaW50IHNldF9hbHRuYW1lX2VtYWlsKFg1MDkgKmNydCwgY29uc3QgY2hhciAqbmFtZSkKKwl7CisJcmV0dXJuIHNldF9hbHRuYW1lKGNydCwgR0VOX0VNQUlMLCBuYW1lLCAwKTsKKwl9CisKK3N0cnVjdCBzZXRfbmFtZV9mbgorCXsKKwlpbnQgKCpmbikoWDUwOSAqLCBjb25zdCBjaGFyICopOworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IGhvc3Q7CisJaW50IGVtYWlsOworCX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2V0X25hbWVfZm4gbmFtZV9mbnNbXSA9CisJeworCXtzZXRfY24xLCAic2V0IENOIiwgMSwgMH0sCisJe3NldF9jbjIsICJzZXQgQ04iLCAxLCAwfSwKKwl7c2V0X2NuMywgInNldCBDTiIsIDEsIDB9LAorCXtzZXRfY25fYW5kX2VtYWlsLCAic2V0IENOIiwgMSwgMH0sCisJe3NldF9lbWFpbDEsICJzZXQgZW1haWxBZGRyZXNzIiwgMCwgMX0sCisJe3NldF9lbWFpbDIsICJzZXQgZW1haWxBZGRyZXNzIiwgMCwgMX0sCisJe3NldF9lbWFpbDMsICJzZXQgZW1haWxBZGRyZXNzIiwgMCwgMX0sCisJe3NldF9lbWFpbF9hbmRfY24sICJzZXQgZW1haWxBZGRyZXNzIiwgMCwgMX0sCisJe3NldF9hbHRuYW1lX2RucywgInNldCBkbnNOYW1lIiwgMSwgMH0sCisJe3NldF9hbHRuYW1lX2VtYWlsLCAic2V0IHJmYzgyMk5hbWUiLCAwLCAxfSwKKwl7TlVMTCwgTlVMTCwgMH0KKwl9OworCitzdGF0aWMgWDUwOSAqbWFrZV9jZXJ0KCkKKwl7CisJWDUwOSAqcmV0ID0gTlVMTDsKKwlYNTA5ICpjcnQgPSBOVUxMOworCVg1MDlfTkFNRSAqaXNzdWVyID0gTlVMTDsKKwljcnQgPSBYNTA5X25ldygpOworCWlmIChjcnQgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJaWYgKCFYNTA5X3NldF92ZXJzaW9uKGNydCwgMykpCisJCWdvdG8gb3V0OworCXJldCA9IGNydDsKKwljcnQgPSBOVUxMOworIG91dDoKKwlYNTA5X05BTUVfZnJlZShpc3N1ZXIpOworCXJldHVybiByZXQ7CisJfQorCitzdGF0aWMgaW50IGVycm9yczsKKworc3RhdGljIHZvaWQgY2hlY2tfbWVzc2FnZShjb25zdCBzdHJ1Y3Qgc2V0X25hbWVfZm4gKmZuLCBjb25zdCBjaGFyICpvcCwKKwkJCSAgY29uc3QgY2hhciAqbmFtZWluY2VydCwgaW50IG1hdGNoLCBjb25zdCBjaGFyICpuYW1lKQorCXsKKwljaGFyIG1zZ1sxMDI0XTsKKwlpZiAobWF0Y2ggPCAwKQorCQlyZXR1cm47CisJQklPX3NucHJpbnRmKG1zZywgc2l6ZW9mKG1zZyksICIlczogJXM6IFslc10gJXMgWyVzXSIsCisJCSBmbi0+bmFtZSwgb3AsIG5hbWVpbmNlcnQsCisJCSBtYXRjaCA/ICJtYXRjaGVzIiA6ICJkb2VzIG5vdCBtYXRjaCIsIG5hbWUpOworCWlmIChpc19leGNlcHRpb24obXNnKSkKKwkJcmV0dXJuOworCXB1dHMobXNnKTsKKwkrK2Vycm9yczsKKwl9CisKK3N0YXRpYyB2b2lkIHJ1bl9jZXJ0KFg1MDkgKmNydCwgY29uc3QgY2hhciAqbmFtZWluY2VydCwKKwkJICAgICBjb25zdCBzdHJ1Y3Qgc2V0X25hbWVfZm4gKmZuKQorCXsKKwljb25zdCBjaGFyICpjb25zdCAqcG5hbWUgPSBuYW1lczsKKwl3aGlsZSAoKnBuYW1lKQorCQl7CisJCWludCBzYW1lbmFtZSA9IHN0cmNhc2VjbXAobmFtZWluY2VydCwgKnBuYW1lKSA9PSAwOworCQlzaXplX3QgbmFtZWxlbiA9IHN0cmxlbigqcG5hbWUpOworCQljaGFyICpuYW1lID0gbWFsbG9jKG5hbWVsZW4pOworCQlpbnQgbWF0Y2gsIHJldDsKKwkJbWVtY3B5KG5hbWUsICpwbmFtZSwgbmFtZWxlbik7CisKKwkJcmV0ID0gWDUwOV9jaGVja19ob3N0KGNydCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiluYW1lLAorCQkJCSAgICAgIG5hbWVsZW4sIDApOworCQltYXRjaCA9IC0xOworCQlpZiAocmV0IDwgMCkKKwkJCXsKKwkJCWZwcmludGYoc3RkZXJyLCAiaW50ZXJuYWwgZXJyb3IgaW4gWDUwOV9jaGVja19ob3N0Iik7CisJCQkrK2Vycm9yczsKKwkJCX0KKwkJZWxzZSBpZiAoZm4tPmhvc3QpCisJCQl7CisJCQlpZiAocmV0ID09IDEgJiYgIXNhbWVuYW1lKQorCQkJCW1hdGNoID0gMTsKKwkJCWlmIChyZXQgPT0gMCAmJiBzYW1lbmFtZSkKKwkJCQltYXRjaCA9IDA7CisJCQl9CisJCWVsc2UgaWYgKHJldCA9PSAxKQorCQkJbWF0Y2ggPSAxOworCQljaGVja19tZXNzYWdlKGZuLCAiaG9zdCIsIG5hbWVpbmNlcnQsIG1hdGNoLCAqcG5hbWUpOworCisJCXJldCA9IFg1MDlfY2hlY2tfaG9zdChjcnQsIChjb25zdCB1bnNpZ25lZCBjaGFyICopbmFtZSwKKwkJCQkgICAgICBuYW1lbGVuLCBYNTA5X0NIRUNLX0ZMQUdfTk9fV0lMRENBUkRTKTsKKwkJbWF0Y2ggPSAtMTsKKwkJaWYgKHJldCA8IDApCisJCQl7CisJCQlmcHJpbnRmKHN0ZGVyciwgImludGVybmFsIGVycm9yIGluIFg1MDlfY2hlY2tfaG9zdCIpOworCQkJKytlcnJvcnM7CisJCQl9CisJCWVsc2UgaWYgKGZuLT5ob3N0KQorCQkJeworCQkJaWYgKHJldCA9PSAxICYmICFzYW1lbmFtZSkKKwkJCQltYXRjaCA9IDE7CisJCQlpZiAocmV0ID09IDAgJiYgc2FtZW5hbWUpCisJCQkJbWF0Y2ggPSAwOworCQkJfQorCQllbHNlIGlmIChyZXQgPT0gMSkKKwkJCW1hdGNoID0gMTsKKwkJY2hlY2tfbWVzc2FnZShmbiwgImhvc3Qtbm8td2lsZGNhcmRzIiwKKwkJCSAgICAgIG5hbWVpbmNlcnQsIG1hdGNoLCAqcG5hbWUpOworCisJCXJldCA9IFg1MDlfY2hlY2tfZW1haWwoY3J0LCAoY29uc3QgdW5zaWduZWQgY2hhciAqKW5hbWUsCisJCQkJICAgICAgIG5hbWVsZW4sIDApOworCQltYXRjaCA9IC0xOworCQlpZiAoZm4tPmVtYWlsKQorCQkJeworCQkJaWYgKHJldCAmJiAhc2FtZW5hbWUpCisJCQkJbWF0Y2ggPSAxOworCQkJaWYgKCFyZXQgJiYgc2FtZW5hbWUgJiYgc3RyY2hyKG5hbWVpbmNlcnQsICdAJykgIT0gTlVMTCkKKwkJCQltYXRjaCA9IDA7CisJCQl9CisJCWVsc2UgaWYgKHJldCkKKwkJCW1hdGNoID0gMTsKKwkJY2hlY2tfbWVzc2FnZShmbiwgImVtYWlsIiwgbmFtZWluY2VydCwgbWF0Y2gsICpwbmFtZSk7CisJCSsrcG5hbWU7CisJCWZyZWUobmFtZSk7CisJCX0KKwl9CisKK2ludAorbWFpbih2b2lkKQorCXsKKwljb25zdCBzdHJ1Y3Qgc2V0X25hbWVfZm4gKnBmbiA9IG5hbWVfZm5zOworCXdoaWxlIChwZm4tPm5hbWUpIHsKKwkJY29uc3QgY2hhciAqY29uc3QgKnBuYW1lID0gbmFtZXM7CisJCXdoaWxlICgqcG5hbWUpCisJCQl7CisJCQlYNTA5ICpjcnQgPSBtYWtlX2NlcnQoKTsKKwkJCWlmIChjcnQgPT0gTlVMTCkKKwkJCQl7CisJCQkJZnByaW50ZihzdGRlcnIsICJtYWtlX2NlcnQgZmFpbGVkXG4iKTsKKwkJCQlyZXR1cm4gMTsKKwkJCQl9CisJCQlpZiAoIXBmbi0+Zm4oY3J0LCAqcG5hbWUpKQorCQkJCXsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlg1MDkgbmFtZSBzZXR0aW5nIGZhaWxlZFxuIik7CisJCQkJcmV0dXJuIDE7CisJCQkJfQorCQkJcnVuX2NlcnQoY3J0LCAqcG5hbWUsIHBmbik7CisJCQlYNTA5X2ZyZWUoY3J0KTsKKwkJCSsrcG5hbWU7CisJCQl9CisJCSsrcGZuOworCX0KKwlpZiAoZXJyb3JzID09IDApIHsKKwkgIHByaW50ZigiUEFTU1xuIik7CisJfQorCXJldHVybiBlcnJvcnMgPiAwID8gMSA6IDA7CisJfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3g1MDl2My94NTA5djMuaCBiL2NyeXB0by94NTA5djMveDUwOXYzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVhZTljZQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94NTA5djMveDUwOXYzLmgKQEAgLTAsMCArMSw4NTUgQEAKKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAxOTk5LiAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA0IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuICovCisKKyNpZm5kZWYgSEVBREVSX1g1MDlWM19ICisjZGVmaW5lIEhFQURFUl9YNTA5VjNfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NvbmYuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBGb3J3YXJkIHJlZmVyZW5jZSAqLworc3RydWN0IHYzX2V4dF9tZXRob2Q7CitzdHJ1Y3QgdjNfZXh0X2N0eDsKKworLyogVXNlZnVsIHR5cGVkZWZzICovCisKK3R5cGVkZWYgdm9pZCAqICgqWDUwOVYzX0VYVF9ORVcpKHZvaWQpOwordHlwZWRlZiB2b2lkICgqWDUwOVYzX0VYVF9GUkVFKSh2b2lkICopOwordHlwZWRlZiB2b2lkICogKCpYNTA5VjNfRVhUX0QySSkodm9pZCAqLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqICwgbG9uZyk7Cit0eXBlZGVmIGludCAoKlg1MDlWM19FWFRfSTJEKSh2b2lkICosIHVuc2lnbmVkIGNoYXIgKiopOwordHlwZWRlZiBTVEFDS19PRihDT05GX1ZBTFVFKSAqCisgICgqWDUwOVYzX0VYVF9JMlYpKGNvbnN0IHN0cnVjdCB2M19leHRfbWV0aG9kICptZXRob2QsIHZvaWQgKmV4dCwKKwkJICAgIFNUQUNLX09GKENPTkZfVkFMVUUpICpleHRsaXN0KTsKK3R5cGVkZWYgdm9pZCAqICgqWDUwOVYzX0VYVF9WMkkpKGNvbnN0IHN0cnVjdCB2M19leHRfbWV0aG9kICptZXRob2QsCisJCQkJIHN0cnVjdCB2M19leHRfY3R4ICpjdHgsCisJCQkJIFNUQUNLX09GKENPTkZfVkFMVUUpICp2YWx1ZXMpOwordHlwZWRlZiBjaGFyICogKCpYNTA5VjNfRVhUX0kyUykoY29uc3Qgc3RydWN0IHYzX2V4dF9tZXRob2QgKm1ldGhvZCwgdm9pZCAqZXh0KTsKK3R5cGVkZWYgdm9pZCAqICgqWDUwOVYzX0VYVF9TMkkpKGNvbnN0IHN0cnVjdCB2M19leHRfbWV0aG9kICptZXRob2QsCisJCQkJIHN0cnVjdCB2M19leHRfY3R4ICpjdHgsIGNvbnN0IGNoYXIgKnN0cik7Cit0eXBlZGVmIGludCAoKlg1MDlWM19FWFRfSTJSKShjb25zdCBzdHJ1Y3QgdjNfZXh0X21ldGhvZCAqbWV0aG9kLCB2b2lkICpleHQsCisJCQkgICAgICBCSU8gKm91dCwgaW50IGluZGVudCk7Cit0eXBlZGVmIHZvaWQgKiAoKlg1MDlWM19FWFRfUjJJKShjb25zdCBzdHJ1Y3QgdjNfZXh0X21ldGhvZCAqbWV0aG9kLAorCQkJCSBzdHJ1Y3QgdjNfZXh0X2N0eCAqY3R4LCBjb25zdCBjaGFyICpzdHIpOworCisvKiBWMyBleHRlbnNpb24gc3RydWN0dXJlICovCisKK3N0cnVjdCB2M19leHRfbWV0aG9kIHsKK2ludCBleHRfbmlkOworaW50IGV4dF9mbGFnczsKKy8qIElmIHRoaXMgaXMgc2V0IHRoZSBmb2xsb3dpbmcgZm91ciBmaWVsZHMgYXJlIGlnbm9yZWQgKi8KK0FTTjFfSVRFTV9FWFAgKml0OworLyogT2xkIHN0eWxlIEFTTjEgY2FsbHMgKi8KK1g1MDlWM19FWFRfTkVXIGV4dF9uZXc7CitYNTA5VjNfRVhUX0ZSRUUgZXh0X2ZyZWU7CitYNTA5VjNfRVhUX0QySSBkMmk7CitYNTA5VjNfRVhUX0kyRCBpMmQ7CisKKy8qIFRoZSBmb2xsb3dpbmcgcGFpciBpcyB1c2VkIGZvciBzdHJpbmcgZXh0ZW5zaW9ucyAqLworWDUwOVYzX0VYVF9JMlMgaTJzOworWDUwOVYzX0VYVF9TMkkgczJpOworCisvKiBUaGUgZm9sbG93aW5nIHBhaXIgaXMgdXNlZCBmb3IgbXVsdGktdmFsdWVkIGV4dGVuc2lvbnMgKi8KK1g1MDlWM19FWFRfSTJWIGkydjsKK1g1MDlWM19FWFRfVjJJIHYyaTsKKworLyogVGhlIGZvbGxvd2luZyBhcmUgdXNlZCBmb3IgcmF3IGV4dGVuc2lvbnMgKi8KK1g1MDlWM19FWFRfSTJSIGkycjsKK1g1MDlWM19FWFRfUjJJIHIyaTsKKwordm9pZCAqdXNyX2RhdGE7CS8qIEFueSBleHRlbnNpb24gc3BlY2lmaWMgZGF0YSAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgWDUwOVYzX0NPTkZfTUVUSE9EX3N0IHsKK2NoYXIgKiAoKmdldF9zdHJpbmcpKHZvaWQgKmRiLCBjaGFyICpzZWN0aW9uLCBjaGFyICp2YWx1ZSk7CitTVEFDS19PRihDT05GX1ZBTFVFKSAqICgqZ2V0X3NlY3Rpb24pKHZvaWQgKmRiLCBjaGFyICpzZWN0aW9uKTsKK3ZvaWQgKCpmcmVlX3N0cmluZykodm9pZCAqZGIsIGNoYXIgKiBzdHJpbmcpOwordm9pZCAoKmZyZWVfc2VjdGlvbikodm9pZCAqZGIsIFNUQUNLX09GKENPTkZfVkFMVUUpICpzZWN0aW9uKTsKK30gWDUwOVYzX0NPTkZfTUVUSE9EOworCisvKiBDb250ZXh0IHNwZWNpZmljIGluZm8gKi8KK3N0cnVjdCB2M19leHRfY3R4IHsKKyNkZWZpbmUgQ1RYX1RFU1QgMHgxCitpbnQgZmxhZ3M7CitYNTA5ICppc3N1ZXJfY2VydDsKK1g1MDkgKnN1YmplY3RfY2VydDsKK1g1MDlfUkVRICpzdWJqZWN0X3JlcTsKK1g1MDlfQ1JMICpjcmw7CitYNTA5VjNfQ09ORl9NRVRIT0QgKmRiX21ldGg7Cit2b2lkICpkYjsKKy8qIE1heWJlIG1vcmUgaGVyZSAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgdjNfZXh0X21ldGhvZCBYNTA5VjNfRVhUX01FVEhPRDsKKworREVDTEFSRV9TVEFDS19PRihYNTA5VjNfRVhUX01FVEhPRCkKKworLyogZXh0X2ZsYWdzIHZhbHVlcyAqLworI2RlZmluZSBYNTA5VjNfRVhUX0RZTkFNSUMJMHgxCisjZGVmaW5lIFg1MDlWM19FWFRfQ1RYX0RFUAkweDIKKyNkZWZpbmUgWDUwOVYzX0VYVF9NVUxUSUxJTkUJMHg0CisKK3R5cGVkZWYgQklUX1NUUklOR19CSVROQU1FIEVOVU1FUkFURURfTkFNRVM7CisKK3R5cGVkZWYgc3RydWN0IEJBU0lDX0NPTlNUUkFJTlRTX3N0IHsKK2ludCBjYTsKK0FTTjFfSU5URUdFUiAqcGF0aGxlbjsKK30gQkFTSUNfQ09OU1RSQUlOVFM7CisKKwordHlwZWRlZiBzdHJ1Y3QgUEtFWV9VU0FHRV9QRVJJT0Rfc3QgeworQVNOMV9HRU5FUkFMSVpFRFRJTUUgKm5vdEJlZm9yZTsKK0FTTjFfR0VORVJBTElaRURUSU1FICpub3RBZnRlcjsKK30gUEtFWV9VU0FHRV9QRVJJT0Q7CisKK3R5cGVkZWYgc3RydWN0IG90aGVyTmFtZV9zdCB7CitBU04xX09CSkVDVCAqdHlwZV9pZDsKK0FTTjFfVFlQRSAqdmFsdWU7Cit9IE9USEVSTkFNRTsKKwordHlwZWRlZiBzdHJ1Y3QgRURJUGFydHlOYW1lX3N0IHsKKwlBU04xX1NUUklORyAqbmFtZUFzc2lnbmVyOworCUFTTjFfU1RSSU5HICpwYXJ0eU5hbWU7Cit9IEVESVBBUlRZTkFNRTsKKwordHlwZWRlZiBzdHJ1Y3QgR0VORVJBTF9OQU1FX3N0IHsKKworI2RlZmluZSBHRU5fT1RIRVJOQU1FCTAKKyNkZWZpbmUgR0VOX0VNQUlMCTEKKyNkZWZpbmUgR0VOX0ROUwkJMgorI2RlZmluZSBHRU5fWDQwMAkzCisjZGVmaW5lIEdFTl9ESVJOQU1FCTQKKyNkZWZpbmUgR0VOX0VESVBBUlRZCTUKKyNkZWZpbmUgR0VOX1VSSQkJNgorI2RlZmluZSBHRU5fSVBBREQJNworI2RlZmluZSBHRU5fUklECQk4CisKK2ludCB0eXBlOwordW5pb24geworCWNoYXIgKnB0cjsKKwlPVEhFUk5BTUUgKm90aGVyTmFtZTsgLyogb3RoZXJOYW1lICovCisJQVNOMV9JQTVTVFJJTkcgKnJmYzgyMk5hbWU7CisJQVNOMV9JQTVTVFJJTkcgKmROU05hbWU7CisJQVNOMV9UWVBFICp4NDAwQWRkcmVzczsKKwlYNTA5X05BTUUgKmRpcmVjdG9yeU5hbWU7CisJRURJUEFSVFlOQU1FICplZGlQYXJ0eU5hbWU7CisJQVNOMV9JQTVTVFJJTkcgKnVuaWZvcm1SZXNvdXJjZUlkZW50aWZpZXI7CisJQVNOMV9PQ1RFVF9TVFJJTkcgKmlQQWRkcmVzczsKKwlBU04xX09CSkVDVCAqcmVnaXN0ZXJlZElEOworCisJLyogT2xkIG5hbWVzICovCisJQVNOMV9PQ1RFVF9TVFJJTkcgKmlwOyAvKiBpUEFkZHJlc3MgKi8KKwlYNTA5X05BTUUgKmRpcm47CQkvKiBkaXJuICovCisJQVNOMV9JQTVTVFJJTkcgKmlhNTsvKiByZmM4MjJOYW1lLCBkTlNOYW1lLCB1bmlmb3JtUmVzb3VyY2VJZGVudGlmaWVyICovCisJQVNOMV9PQkpFQ1QgKnJpZDsgLyogcmVnaXN0ZXJlZElEICovCisJQVNOMV9UWVBFICpvdGhlcjsgLyogeDQwMEFkZHJlc3MgKi8KK30gZDsKK30gR0VORVJBTF9OQU1FOworCit0eXBlZGVmIFNUQUNLX09GKEdFTkVSQUxfTkFNRSkgR0VORVJBTF9OQU1FUzsKKwordHlwZWRlZiBzdHJ1Y3QgQUNDRVNTX0RFU0NSSVBUSU9OX3N0IHsKKwlBU04xX09CSkVDVCAqbWV0aG9kOworCUdFTkVSQUxfTkFNRSAqbG9jYXRpb247Cit9IEFDQ0VTU19ERVNDUklQVElPTjsKKwordHlwZWRlZiBTVEFDS19PRihBQ0NFU1NfREVTQ1JJUFRJT04pIEFVVEhPUklUWV9JTkZPX0FDQ0VTUzsKKwordHlwZWRlZiBTVEFDS19PRihBU04xX09CSkVDVCkgRVhURU5ERURfS0VZX1VTQUdFOworCitERUNMQVJFX1NUQUNLX09GKEdFTkVSQUxfTkFNRSkKK0RFQ0xBUkVfQVNOMV9TRVRfT0YoR0VORVJBTF9OQU1FKQorCitERUNMQVJFX1NUQUNLX09GKEFDQ0VTU19ERVNDUklQVElPTikKK0RFQ0xBUkVfQVNOMV9TRVRfT0YoQUNDRVNTX0RFU0NSSVBUSU9OKQorCit0eXBlZGVmIHN0cnVjdCBESVNUX1BPSU5UX05BTUVfc3QgeworaW50IHR5cGU7Cit1bmlvbiB7CisJR0VORVJBTF9OQU1FUyAqZnVsbG5hbWU7CisJU1RBQ0tfT0YoWDUwOV9OQU1FX0VOVFJZKSAqcmVsYXRpdmVuYW1lOworfSBuYW1lOworLyogSWYgcmVsYXRpdmVuYW1lIHRoZW4gdGhpcyBjb250YWlucyB0aGUgZnVsbCBkaXN0cmlidXRpb24gcG9pbnQgbmFtZSAqLworWDUwOV9OQU1FICpkcG5hbWU7Cit9IERJU1RfUE9JTlRfTkFNRTsKKy8qIEFsbCBleGlzdGluZyByZWFzb25zICovCisjZGVmaW5lIENSTERQX0FMTF9SRUFTT05TCTB4ODA3ZgorCisjZGVmaW5lIENSTF9SRUFTT05fTk9ORQkJCQktMQorI2RlZmluZSBDUkxfUkVBU09OX1VOU1BFQ0lGSUVECQkJMAorI2RlZmluZSBDUkxfUkVBU09OX0tFWV9DT01QUk9NSVNFCQkxCisjZGVmaW5lIENSTF9SRUFTT05fQ0FfQ09NUFJPTUlTRQkJMgorI2RlZmluZSBDUkxfUkVBU09OX0FGRklMSUFUSU9OX0NIQU5HRUQJCTMKKyNkZWZpbmUgQ1JMX1JFQVNPTl9TVVBFUlNFREVECQkJNAorI2RlZmluZSBDUkxfUkVBU09OX0NFU1NBVElPTl9PRl9PUEVSQVRJT04JNQorI2RlZmluZSBDUkxfUkVBU09OX0NFUlRJRklDQVRFX0hPTEQJCTYKKyNkZWZpbmUgQ1JMX1JFQVNPTl9SRU1PVkVfRlJPTV9DUkwJCTgKKyNkZWZpbmUgQ1JMX1JFQVNPTl9QUklWSUxFR0VfV0lUSERSQVdOCQk5CisjZGVmaW5lIENSTF9SRUFTT05fQUFfQ09NUFJPTUlTRQkJMTAKKworc3RydWN0IERJU1RfUE9JTlRfc3QgeworRElTVF9QT0lOVF9OQU1FCSpkaXN0cG9pbnQ7CitBU04xX0JJVF9TVFJJTkcgKnJlYXNvbnM7CitHRU5FUkFMX05BTUVTICpDUkxpc3N1ZXI7CitpbnQgZHBfcmVhc29uczsKK307CisKK3R5cGVkZWYgU1RBQ0tfT0YoRElTVF9QT0lOVCkgQ1JMX0RJU1RfUE9JTlRTOworCitERUNMQVJFX1NUQUNLX09GKERJU1RfUE9JTlQpCitERUNMQVJFX0FTTjFfU0VUX09GKERJU1RfUE9JTlQpCisKK3N0cnVjdCBBVVRIT1JJVFlfS0VZSURfc3QgeworQVNOMV9PQ1RFVF9TVFJJTkcgKmtleWlkOworR0VORVJBTF9OQU1FUyAqaXNzdWVyOworQVNOMV9JTlRFR0VSICpzZXJpYWw7Cit9OworCisvKiBTdHJvbmcgZXh0cmFuZXQgc3RydWN0dXJlcyAqLworCit0eXBlZGVmIHN0cnVjdCBTWE5FVF9JRF9zdCB7CisJQVNOMV9JTlRFR0VSICp6b25lOworCUFTTjFfT0NURVRfU1RSSU5HICp1c2VyOworfSBTWE5FVElEOworCitERUNMQVJFX1NUQUNLX09GKFNYTkVUSUQpCitERUNMQVJFX0FTTjFfU0VUX09GKFNYTkVUSUQpCisKK3R5cGVkZWYgc3RydWN0IFNYTkVUX3N0IHsKKwlBU04xX0lOVEVHRVIgKnZlcnNpb247CisJU1RBQ0tfT0YoU1hORVRJRCkgKmlkczsKK30gU1hORVQ7CisKK3R5cGVkZWYgc3RydWN0IE5PVElDRVJFRl9zdCB7CisJQVNOMV9TVFJJTkcgKm9yZ2FuaXphdGlvbjsKKwlTVEFDS19PRihBU04xX0lOVEVHRVIpICpub3RpY2Vub3M7Cit9IE5PVElDRVJFRjsKKwordHlwZWRlZiBzdHJ1Y3QgVVNFUk5PVElDRV9zdCB7CisJTk9USUNFUkVGICpub3RpY2VyZWY7CisJQVNOMV9TVFJJTkcgKmV4cHRleHQ7Cit9IFVTRVJOT1RJQ0U7CisKK3R5cGVkZWYgc3RydWN0IFBPTElDWVFVQUxJTkZPX3N0IHsKKwlBU04xX09CSkVDVCAqcHF1YWxpZDsKKwl1bmlvbiB7CisJCUFTTjFfSUE1U1RSSU5HICpjcHN1cmk7CisJCVVTRVJOT1RJQ0UgKnVzZXJub3RpY2U7CisJCUFTTjFfVFlQRSAqb3RoZXI7CisJfSBkOworfSBQT0xJQ1lRVUFMSU5GTzsKKworREVDTEFSRV9TVEFDS19PRihQT0xJQ1lRVUFMSU5GTykKK0RFQ0xBUkVfQVNOMV9TRVRfT0YoUE9MSUNZUVVBTElORk8pCisKK3R5cGVkZWYgc3RydWN0IFBPTElDWUlORk9fc3QgeworCUFTTjFfT0JKRUNUICpwb2xpY3lpZDsKKwlTVEFDS19PRihQT0xJQ1lRVUFMSU5GTykgKnF1YWxpZmllcnM7Cit9IFBPTElDWUlORk87CisKK3R5cGVkZWYgU1RBQ0tfT0YoUE9MSUNZSU5GTykgQ0VSVElGSUNBVEVQT0xJQ0lFUzsKKworREVDTEFSRV9TVEFDS19PRihQT0xJQ1lJTkZPKQorREVDTEFSRV9BU04xX1NFVF9PRihQT0xJQ1lJTkZPKQorCit0eXBlZGVmIHN0cnVjdCBQT0xJQ1lfTUFQUElOR19zdCB7CisJQVNOMV9PQkpFQ1QgKmlzc3VlckRvbWFpblBvbGljeTsKKwlBU04xX09CSkVDVCAqc3ViamVjdERvbWFpblBvbGljeTsKK30gUE9MSUNZX01BUFBJTkc7CisKK0RFQ0xBUkVfU1RBQ0tfT0YoUE9MSUNZX01BUFBJTkcpCisKK3R5cGVkZWYgU1RBQ0tfT0YoUE9MSUNZX01BUFBJTkcpIFBPTElDWV9NQVBQSU5HUzsKKwordHlwZWRlZiBzdHJ1Y3QgR0VORVJBTF9TVUJUUkVFX3N0IHsKKwlHRU5FUkFMX05BTUUgKmJhc2U7CisJQVNOMV9JTlRFR0VSICptaW5pbXVtOworCUFTTjFfSU5URUdFUiAqbWF4aW11bTsKK30gR0VORVJBTF9TVUJUUkVFOworCitERUNMQVJFX1NUQUNLX09GKEdFTkVSQUxfU1VCVFJFRSkKKworc3RydWN0IE5BTUVfQ09OU1RSQUlOVFNfc3QgeworCVNUQUNLX09GKEdFTkVSQUxfU1VCVFJFRSkgKnBlcm1pdHRlZFN1YnRyZWVzOworCVNUQUNLX09GKEdFTkVSQUxfU1VCVFJFRSkgKmV4Y2x1ZGVkU3VidHJlZXM7Cit9OworCit0eXBlZGVmIHN0cnVjdCBQT0xJQ1lfQ09OU1RSQUlOVFNfc3QgeworCUFTTjFfSU5URUdFUiAqcmVxdWlyZUV4cGxpY2l0UG9saWN5OworCUFTTjFfSU5URUdFUiAqaW5oaWJpdFBvbGljeU1hcHBpbmc7Cit9IFBPTElDWV9DT05TVFJBSU5UUzsKKworLyogUHJveHkgY2VydGlmaWNhdGUgc3RydWN0dXJlcywgc2VlIFJGQyAzODIwICovCit0eXBlZGVmIHN0cnVjdCBQUk9YWV9QT0xJQ1lfc3QKKwl7CisJQVNOMV9PQkpFQ1QgKnBvbGljeUxhbmd1YWdlOworCUFTTjFfT0NURVRfU1RSSU5HICpwb2xpY3k7CisJfSBQUk9YWV9QT0xJQ1k7CisKK3R5cGVkZWYgc3RydWN0IFBST1hZX0NFUlRfSU5GT19FWFRFTlNJT05fc3QKKwl7CisJQVNOMV9JTlRFR0VSICpwY1BhdGhMZW5ndGhDb25zdHJhaW50OworCVBST1hZX1BPTElDWSAqcHJveHlQb2xpY3k7CisJfSBQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OOworCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFBST1hZX1BPTElDWSkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoUFJPWFlfQ0VSVF9JTkZPX0VYVEVOU0lPTikKKworc3RydWN0IElTU1VJTkdfRElTVF9QT0lOVF9zdAorCXsKKwlESVNUX1BPSU5UX05BTUUgKmRpc3Rwb2ludDsKKwlpbnQgb25seXVzZXI7CisJaW50IG9ubHlDQTsKKwlBU04xX0JJVF9TVFJJTkcgKm9ubHlzb21lcmVhc29uczsKKwlpbnQgaW5kaXJlY3RDUkw7CisJaW50IG9ubHlhdHRyOworCX07CisKKy8qIFZhbHVlcyBpbiBpZHBfZmxhZ3MgZmllbGQgKi8KKy8qIElEUCBwcmVzZW50ICovCisjZGVmaW5lCUlEUF9QUkVTRU5UCTB4MQorLyogSURQIHZhbHVlcyBpbmNvbnNpc3RlbnQgKi8KKyNkZWZpbmUgSURQX0lOVkFMSUQJMHgyCisvKiBvbmx5dXNlciB0cnVlICovCisjZGVmaW5lCUlEUF9PTkxZVVNFUgkweDQKKy8qIG9ubHlDQSB0cnVlICovCisjZGVmaW5lCUlEUF9PTkxZQ0EJMHg4CisvKiBvbmx5YXR0ciB0cnVlICovCisjZGVmaW5lIElEUF9PTkxZQVRUUgkweDEwCisvKiBpbmRpcmVjdENSTCB0cnVlICovCisjZGVmaW5lIElEUF9JTkRJUkVDVAkweDIwCisvKiBvbmx5c29tZXJlYXNvbnMgcHJlc2VudCAqLworI2RlZmluZSBJRFBfUkVBU09OUwkweDQwCisKKyNkZWZpbmUgWDUwOVYzX2NvbmZfZXJyKHZhbCkgRVJSX2FkZF9lcnJvcl9kYXRhKDYsICJzZWN0aW9uOiIsIHZhbC0+c2VjdGlvbiwgXAorIixuYW1lOiIsIHZhbC0+bmFtZSwgIix2YWx1ZToiLCB2YWwtPnZhbHVlKTsKKworI2RlZmluZSBYNTA5VjNfc2V0X2N0eF90ZXN0KGN0eCkgXAorCQkJWDUwOVYzX3NldF9jdHgoY3R4LCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBDVFhfVEVTVCkKKyNkZWZpbmUgWDUwOVYzX3NldF9jdHhfbm9kYihjdHgpIChjdHgpLT5kYiA9IE5VTEw7CisKKyNkZWZpbmUgRVhUX0JJVFNUUklORyhuaWQsIHRhYmxlKSB7IG5pZCwgMCwgQVNOMV9JVEVNX3JlZihBU04xX0JJVF9TVFJJTkcpLCBcCisJCQkwLDAsMCwwLCBcCisJCQkwLDAsIFwKKwkJCShYNTA5VjNfRVhUX0kyVilpMnZfQVNOMV9CSVRfU1RSSU5HLCBcCisJCQkoWDUwOVYzX0VYVF9WMkkpdjJpX0FTTjFfQklUX1NUUklORywgXAorCQkJTlVMTCwgTlVMTCwgXAorCQkJdGFibGV9CisKKyNkZWZpbmUgRVhUX0lBNVNUUklORyhuaWQpIHsgbmlkLCAwLCBBU04xX0lURU1fcmVmKEFTTjFfSUE1U1RSSU5HKSwgXAorCQkJMCwwLDAsMCwgXAorCQkJKFg1MDlWM19FWFRfSTJTKWkyc19BU04xX0lBNVNUUklORywgXAorCQkJKFg1MDlWM19FWFRfUzJJKXMyaV9BU04xX0lBNVNUUklORywgXAorCQkJMCwwLDAsMCwgXAorCQkJTlVMTH0KKworI2RlZmluZSBFWFRfRU5EIHsgLTEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9CisKKworLyogWDUwOV9QVVJQT1NFIHN0dWZmICovCisKKyNkZWZpbmUgRVhGTEFHX0JDT05TCQkweDEKKyNkZWZpbmUgRVhGTEFHX0tVU0FHRQkJMHgyCisjZGVmaW5lIEVYRkxBR19YS1VTQUdFCQkweDQKKyNkZWZpbmUgRVhGTEFHX05TQ0VSVAkJMHg4CisKKyNkZWZpbmUgRVhGTEFHX0NBCQkweDEwCisvKiBSZWFsbHkgc2VsZiBpc3N1ZWQgbm90IG5lY2Vzc2FyaWx5IHNlbGYgc2lnbmVkICovCisjZGVmaW5lIEVYRkxBR19TSQkJMHgyMAorI2RlZmluZSBFWEZMQUdfU1MJCTB4MjAKKyNkZWZpbmUgRVhGTEFHX1YxCQkweDQwCisjZGVmaW5lIEVYRkxBR19JTlZBTElECQkweDgwCisjZGVmaW5lIEVYRkxBR19TRVQJCTB4MTAwCisjZGVmaW5lIEVYRkxBR19DUklUSUNBTAkJMHgyMDAKKyNkZWZpbmUgRVhGTEFHX1BST1hZCQkweDQwMAorCisjZGVmaW5lIEVYRkxBR19JTlZBTElEX1BPTElDWQkweDgwMAorI2RlZmluZSBFWEZMQUdfRlJFU0hFU1QJCTB4MTAwMAorCisjZGVmaW5lIEtVX0RJR0lUQUxfU0lHTkFUVVJFCTB4MDA4MAorI2RlZmluZSBLVV9OT05fUkVQVURJQVRJT04JMHgwMDQwCisjZGVmaW5lIEtVX0tFWV9FTkNJUEhFUk1FTlQJMHgwMDIwCisjZGVmaW5lIEtVX0RBVEFfRU5DSVBIRVJNRU5UCTB4MDAxMAorI2RlZmluZSBLVV9LRVlfQUdSRUVNRU5UCTB4MDAwOAorI2RlZmluZSBLVV9LRVlfQ0VSVF9TSUdOCTB4MDAwNAorI2RlZmluZSBLVV9DUkxfU0lHTgkJMHgwMDAyCisjZGVmaW5lIEtVX0VOQ0lQSEVSX09OTFkJMHgwMDAxCisjZGVmaW5lIEtVX0RFQ0lQSEVSX09OTFkJMHg4MDAwCisKKyNkZWZpbmUgTlNfU1NMX0NMSUVOVAkJMHg4MAorI2RlZmluZSBOU19TU0xfU0VSVkVSCQkweDQwCisjZGVmaW5lIE5TX1NNSU1FCQkweDIwCisjZGVmaW5lIE5TX09CSlNJR04JCTB4MTAKKyNkZWZpbmUgTlNfU1NMX0NBCQkweDA0CisjZGVmaW5lIE5TX1NNSU1FX0NBCQkweDAyCisjZGVmaW5lIE5TX09CSlNJR05fQ0EJCTB4MDEKKyNkZWZpbmUgTlNfQU5ZX0NBCQkoTlNfU1NMX0NBfE5TX1NNSU1FX0NBfE5TX09CSlNJR05fQ0EpCisKKyNkZWZpbmUgWEtVX1NTTF9TRVJWRVIJCTB4MQkKKyNkZWZpbmUgWEtVX1NTTF9DTElFTlQJCTB4MgorI2RlZmluZSBYS1VfU01JTUUJCTB4NAorI2RlZmluZSBYS1VfQ09ERV9TSUdOCQkweDgKKyNkZWZpbmUgWEtVX1NHQwkJCTB4MTAKKyNkZWZpbmUgWEtVX09DU1BfU0lHTgkJMHgyMAorI2RlZmluZSBYS1VfVElNRVNUQU1QCQkweDQwCisjZGVmaW5lIFhLVV9EVkNTCQkweDgwCisjZGVmaW5lIFhLVV9BTllFS1UJCTB4MTAwCisKKyNkZWZpbmUgWDUwOV9QVVJQT1NFX0RZTkFNSUMJMHgxCisjZGVmaW5lIFg1MDlfUFVSUE9TRV9EWU5BTUlDX05BTUUJMHgyCisKK3R5cGVkZWYgc3RydWN0IHg1MDlfcHVycG9zZV9zdCB7CisJaW50IHB1cnBvc2U7CisJaW50IHRydXN0OwkJLyogRGVmYXVsdCB0cnVzdCBJRCAqLworCWludCBmbGFnczsKKwlpbnQgKCpjaGVja19wdXJwb3NlKShjb25zdCBzdHJ1Y3QgeDUwOV9wdXJwb3NlX3N0ICosCisJCQkJY29uc3QgWDUwOSAqLCBpbnQpOworCWNoYXIgKm5hbWU7CisJY2hhciAqc25hbWU7CisJdm9pZCAqdXNyX2RhdGE7Cit9IFg1MDlfUFVSUE9TRTsKKworI2RlZmluZSBYNTA5X1BVUlBPU0VfU1NMX0NMSUVOVAkJMQorI2RlZmluZSBYNTA5X1BVUlBPU0VfU1NMX1NFUlZFUgkJMgorI2RlZmluZSBYNTA5X1BVUlBPU0VfTlNfU1NMX1NFUlZFUgkzCisjZGVmaW5lIFg1MDlfUFVSUE9TRV9TTUlNRV9TSUdOCQk0CisjZGVmaW5lIFg1MDlfUFVSUE9TRV9TTUlNRV9FTkNSWVBUCTUKKyNkZWZpbmUgWDUwOV9QVVJQT1NFX0NSTF9TSUdOCQk2CisjZGVmaW5lIFg1MDlfUFVSUE9TRV9BTlkJCTcKKyNkZWZpbmUgWDUwOV9QVVJQT1NFX09DU1BfSEVMUEVSCTgKKyNkZWZpbmUgWDUwOV9QVVJQT1NFX1RJTUVTVEFNUF9TSUdOCTkKKworI2RlZmluZSBYNTA5X1BVUlBPU0VfTUlOCQkxCisjZGVmaW5lIFg1MDlfUFVSUE9TRV9NQVgJCTkKKworLyogRmxhZ3MgZm9yIFg1MDlWM19FWFRfcHJpbnQoKSAqLworCisjZGVmaW5lIFg1MDlWM19FWFRfVU5LTk9XTl9NQVNLCQkoMHhmTCA8PCAxNikKKy8qIFJldHVybiBlcnJvciBmb3IgdW5rbm93biBleHRlbnNpb25zICovCisjZGVmaW5lIFg1MDlWM19FWFRfREVGQVVMVAkJMAorLyogUHJpbnQgZXJyb3IgZm9yIHVua25vd24gZXh0ZW5zaW9ucyAqLworI2RlZmluZSBYNTA5VjNfRVhUX0VSUk9SX1VOS05PV04JKDFMIDw8IDE2KQorLyogQVNOMSBwYXJzZSB1bmtub3duIGV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDUwOVYzX0VYVF9QQVJTRV9VTktOT1dOCSgyTCA8PCAxNikKKy8qIEJJT19kdW1wIHVua25vd24gZXh0ZW5zaW9ucyAqLworI2RlZmluZSBYNTA5VjNfRVhUX0RVTVBfVU5LTk9XTgkJKDNMIDw8IDE2KQorCisvKiBGbGFncyBmb3IgWDUwOVYzX2FkZDFfaTJkICovCisKKyNkZWZpbmUgWDUwOVYzX0FERF9PUF9NQVNLCQkweGZMCisjZGVmaW5lIFg1MDlWM19BRERfREVGQVVMVAkJMEwKKyNkZWZpbmUgWDUwOVYzX0FERF9BUFBFTkQJCTFMCisjZGVmaW5lIFg1MDlWM19BRERfUkVQTEFDRQkJMkwKKyNkZWZpbmUgWDUwOVYzX0FERF9SRVBMQUNFX0VYSVNUSU5HCTNMCisjZGVmaW5lIFg1MDlWM19BRERfS0VFUF9FWElTVElORwk0TAorI2RlZmluZSBYNTA5VjNfQUREX0RFTEVURQkJNUwKKyNkZWZpbmUgWDUwOVYzX0FERF9TSUxFTlQJCTB4MTAKKworREVDTEFSRV9TVEFDS19PRihYNTA5X1BVUlBPU0UpCisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoQkFTSUNfQ09OU1RSQUlOVFMpCisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoU1hORVQpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFNYTkVUSUQpCisKK2ludCBTWE5FVF9hZGRfaWRfYXNjKFNYTkVUICoqcHN4LCBjaGFyICp6b25lLCBjaGFyICp1c2VyLCBpbnQgdXNlcmxlbik7IAoraW50IFNYTkVUX2FkZF9pZF91bG9uZyhTWE5FVCAqKnBzeCwgdW5zaWduZWQgbG9uZyBsem9uZSwgY2hhciAqdXNlciwgaW50IHVzZXJsZW4pOyAKK2ludCBTWE5FVF9hZGRfaWRfSU5URUdFUihTWE5FVCAqKnBzeCwgQVNOMV9JTlRFR0VSICppem9uZSwgY2hhciAqdXNlciwgaW50IHVzZXJsZW4pOyAKKworQVNOMV9PQ1RFVF9TVFJJTkcgKlNYTkVUX2dldF9pZF9hc2MoU1hORVQgKnN4LCBjaGFyICp6b25lKTsKK0FTTjFfT0NURVRfU1RSSU5HICpTWE5FVF9nZXRfaWRfdWxvbmcoU1hORVQgKnN4LCB1bnNpZ25lZCBsb25nIGx6b25lKTsKK0FTTjFfT0NURVRfU1RSSU5HICpTWE5FVF9nZXRfaWRfSU5URUdFUihTWE5FVCAqc3gsIEFTTjFfSU5URUdFUiAqem9uZSk7CisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoQVVUSE9SSVRZX0tFWUlEKQorCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFBLRVlfVVNBR0VfUEVSSU9EKQorCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEdFTkVSQUxfTkFNRSkKK0dFTkVSQUxfTkFNRSAqR0VORVJBTF9OQU1FX2R1cChHRU5FUkFMX05BTUUgKmEpOworaW50IEdFTkVSQUxfTkFNRV9jbXAoR0VORVJBTF9OQU1FICphLCBHRU5FUkFMX05BTUUgKmIpOworCisKKworQVNOMV9CSVRfU1RSSU5HICp2MmlfQVNOMV9CSVRfU1RSSU5HKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCisJCQkJWDUwOVYzX0NUWCAqY3R4LCBTVEFDS19PRihDT05GX1ZBTFVFKSAqbnZhbCk7CitTVEFDS19PRihDT05GX1ZBTFVFKSAqaTJ2X0FTTjFfQklUX1NUUklORyhYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCQkJCUFTTjFfQklUX1NUUklORyAqYml0cywKKwkJCQlTVEFDS19PRihDT05GX1ZBTFVFKSAqZXh0bGlzdCk7CisKK1NUQUNLX09GKENPTkZfVkFMVUUpICppMnZfR0VORVJBTF9OQU1FKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIEdFTkVSQUxfTkFNRSAqZ2VuLCBTVEFDS19PRihDT05GX1ZBTFVFKSAqcmV0KTsKK2ludCBHRU5FUkFMX05BTUVfcHJpbnQoQklPICpvdXQsIEdFTkVSQUxfTkFNRSAqZ2VuKTsKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhHRU5FUkFMX05BTUVTKQorCitTVEFDS19PRihDT05GX1ZBTFVFKSAqaTJ2X0dFTkVSQUxfTkFNRVMoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwKKwkJR0VORVJBTF9OQU1FUyAqZ2VuLCBTVEFDS19PRihDT05GX1ZBTFVFKSAqZXh0bGlzdCk7CitHRU5FUkFMX05BTUVTICp2MmlfR0VORVJBTF9OQU1FUyhjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCQkJCSBYNTA5VjNfQ1RYICpjdHgsIFNUQUNLX09GKENPTkZfVkFMVUUpICpudmFsKTsKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhPVEhFUk5BTUUpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEVESVBBUlRZTkFNRSkKK2ludCBPVEhFUk5BTUVfY21wKE9USEVSTkFNRSAqYSwgT1RIRVJOQU1FICpiKTsKK3ZvaWQgR0VORVJBTF9OQU1FX3NldDBfdmFsdWUoR0VORVJBTF9OQU1FICphLCBpbnQgdHlwZSwgdm9pZCAqdmFsdWUpOwordm9pZCAqR0VORVJBTF9OQU1FX2dldDBfdmFsdWUoR0VORVJBTF9OQU1FICphLCBpbnQgKnB0eXBlKTsKK2ludCBHRU5FUkFMX05BTUVfc2V0MF9vdGhlcm5hbWUoR0VORVJBTF9OQU1FICpnZW4sCisJCQkJQVNOMV9PQkpFQ1QgKm9pZCwgQVNOMV9UWVBFICp2YWx1ZSk7CitpbnQgR0VORVJBTF9OQU1FX2dldDBfb3RoZXJOYW1lKEdFTkVSQUxfTkFNRSAqZ2VuLCAKKwkJCQlBU04xX09CSkVDVCAqKnBvaWQsIEFTTjFfVFlQRSAqKnB2YWx1ZSk7CisKK2NoYXIgKmkyc19BU04xX09DVEVUX1NUUklORyhYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLCBBU04xX09DVEVUX1NUUklORyAqaWE1KTsKK0FTTjFfT0NURVRfU1RSSU5HICpzMmlfQVNOMV9PQ1RFVF9TVFJJTkcoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgWDUwOVYzX0NUWCAqY3R4LCBjaGFyICpzdHIpOworCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEVYVEVOREVEX0tFWV9VU0FHRSkKK2ludCBpMmFfQUNDRVNTX0RFU0NSSVBUSU9OKEJJTyAqYnAsIEFDQ0VTU19ERVNDUklQVElPTiogYSk7CisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoQ0VSVElGSUNBVEVQT0xJQ0lFUykKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoUE9MSUNZSU5GTykKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoUE9MSUNZUVVBTElORk8pCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFVTRVJOT1RJQ0UpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKE5PVElDRVJFRikKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhDUkxfRElTVF9QT0lOVFMpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKERJU1RfUE9JTlQpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKERJU1RfUE9JTlRfTkFNRSkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoSVNTVUlOR19ESVNUX1BPSU5UKQorCitpbnQgRElTVF9QT0lOVF9zZXRfZHBuYW1lKERJU1RfUE9JTlRfTkFNRSAqZHBuLCBYNTA5X05BTUUgKmluYW1lKTsKKworaW50IE5BTUVfQ09OU1RSQUlOVFNfY2hlY2soWDUwOSAqeCwgTkFNRV9DT05TVFJBSU5UUyAqbmMpOworCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEFDQ0VTU19ERVNDUklQVElPTikKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoQVVUSE9SSVRZX0lORk9fQUNDRVNTKQorCitERUNMQVJFX0FTTjFfSVRFTShQT0xJQ1lfTUFQUElORykKK0RFQ0xBUkVfQVNOMV9BTExPQ19GVU5DVElPTlMoUE9MSUNZX01BUFBJTkcpCitERUNMQVJFX0FTTjFfSVRFTShQT0xJQ1lfTUFQUElOR1MpCisKK0RFQ0xBUkVfQVNOMV9JVEVNKEdFTkVSQUxfU1VCVFJFRSkKK0RFQ0xBUkVfQVNOMV9BTExPQ19GVU5DVElPTlMoR0VORVJBTF9TVUJUUkVFKQorCitERUNMQVJFX0FTTjFfSVRFTShOQU1FX0NPTlNUUkFJTlRTKQorREVDTEFSRV9BU04xX0FMTE9DX0ZVTkNUSU9OUyhOQU1FX0NPTlNUUkFJTlRTKQorCitERUNMQVJFX0FTTjFfQUxMT0NfRlVOQ1RJT05TKFBPTElDWV9DT05TVFJBSU5UUykKK0RFQ0xBUkVfQVNOMV9JVEVNKFBPTElDWV9DT05TVFJBSU5UUykKKworR0VORVJBTF9OQU1FICphMmlfR0VORVJBTF9OQU1FKEdFTkVSQUxfTkFNRSAqb3V0LAorCQkJICAgICAgIGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIFg1MDlWM19DVFggKmN0eCwKKwkJCSAgICAgICBpbnQgZ2VuX3R5cGUsIGNoYXIgKnZhbHVlLCBpbnQgaXNfbmMpOworCitHRU5FUkFMX05BTUUgKnYyaV9HRU5FUkFMX05BTUUoY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgWDUwOVYzX0NUWCAqY3R4LAorCQkJICAgICAgIENPTkZfVkFMVUUgKmNuZik7CitHRU5FUkFMX05BTUUgKnYyaV9HRU5FUkFMX05BTUVfZXgoR0VORVJBTF9OQU1FICpvdXQsCisJCQkJICBjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCQkJCSAgWDUwOVYzX0NUWCAqY3R4LCBDT05GX1ZBTFVFICpjbmYsIGludCBpc19uYyk7Cit2b2lkIFg1MDlWM19jb25mX2ZyZWUoQ09ORl9WQUxVRSAqdmFsKTsKKworWDUwOV9FWFRFTlNJT04gKlg1MDlWM19FWFRfbmNvbmZfbmlkKENPTkYgKmNvbmYsIFg1MDlWM19DVFggKmN0eCwgaW50IGV4dF9uaWQsIGNoYXIgKnZhbHVlKTsKK1g1MDlfRVhURU5TSU9OICpYNTA5VjNfRVhUX25jb25mKENPTkYgKmNvbmYsIFg1MDlWM19DVFggKmN0eCwgY2hhciAqbmFtZSwgY2hhciAqdmFsdWUpOworaW50IFg1MDlWM19FWFRfYWRkX25jb25mX3NrKENPTkYgKmNvbmYsIFg1MDlWM19DVFggKmN0eCwgY2hhciAqc2VjdGlvbiwgU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICoqc2spOworaW50IFg1MDlWM19FWFRfYWRkX25jb25mKENPTkYgKmNvbmYsIFg1MDlWM19DVFggKmN0eCwgY2hhciAqc2VjdGlvbiwgWDUwOSAqY2VydCk7CitpbnQgWDUwOVYzX0VYVF9SRVFfYWRkX25jb25mKENPTkYgKmNvbmYsIFg1MDlWM19DVFggKmN0eCwgY2hhciAqc2VjdGlvbiwgWDUwOV9SRVEgKnJlcSk7CitpbnQgWDUwOVYzX0VYVF9DUkxfYWRkX25jb25mKENPTkYgKmNvbmYsIFg1MDlWM19DVFggKmN0eCwgY2hhciAqc2VjdGlvbiwgWDUwOV9DUkwgKmNybCk7CisKK1g1MDlfRVhURU5TSU9OICpYNTA5VjNfRVhUX2NvbmZfbmlkKExIQVNIX09GKENPTkZfVkFMVUUpICpjb25mLCBYNTA5VjNfQ1RYICpjdHgsCisJCQkJICAgIGludCBleHRfbmlkLCBjaGFyICp2YWx1ZSk7CitYNTA5X0VYVEVOU0lPTiAqWDUwOVYzX0VYVF9jb25mKExIQVNIX09GKENPTkZfVkFMVUUpICpjb25mLCBYNTA5VjNfQ1RYICpjdHgsCisJCQkJY2hhciAqbmFtZSwgY2hhciAqdmFsdWUpOworaW50IFg1MDlWM19FWFRfYWRkX2NvbmYoTEhBU0hfT0YoQ09ORl9WQUxVRSkgKmNvbmYsIFg1MDlWM19DVFggKmN0eCwKKwkJCWNoYXIgKnNlY3Rpb24sIFg1MDkgKmNlcnQpOworaW50IFg1MDlWM19FWFRfUkVRX2FkZF9jb25mKExIQVNIX09GKENPTkZfVkFMVUUpICpjb25mLCBYNTA5VjNfQ1RYICpjdHgsCisJCQkgICAgY2hhciAqc2VjdGlvbiwgWDUwOV9SRVEgKnJlcSk7CitpbnQgWDUwOVYzX0VYVF9DUkxfYWRkX2NvbmYoTEhBU0hfT0YoQ09ORl9WQUxVRSkgKmNvbmYsIFg1MDlWM19DVFggKmN0eCwKKwkJCSAgICBjaGFyICpzZWN0aW9uLCBYNTA5X0NSTCAqY3JsKTsKKworaW50IFg1MDlWM19hZGRfdmFsdWVfYm9vbF9uZihjaGFyICpuYW1lLCBpbnQgYXNuMV9ib29sLAorCQkJICAgICBTVEFDS19PRihDT05GX1ZBTFVFKSAqKmV4dGxpc3QpOworaW50IFg1MDlWM19nZXRfdmFsdWVfYm9vbChDT05GX1ZBTFVFICp2YWx1ZSwgaW50ICphc24xX2Jvb2wpOworaW50IFg1MDlWM19nZXRfdmFsdWVfaW50KENPTkZfVkFMVUUgKnZhbHVlLCBBU04xX0lOVEVHRVIgKiphaW50KTsKK3ZvaWQgWDUwOVYzX3NldF9uY29uZihYNTA5VjNfQ1RYICpjdHgsIENPTkYgKmNvbmYpOwordm9pZCBYNTA5VjNfc2V0X2NvbmZfbGhhc2goWDUwOVYzX0NUWCAqY3R4LCBMSEFTSF9PRihDT05GX1ZBTFVFKSAqbGhhc2gpOworCitjaGFyICogWDUwOVYzX2dldF9zdHJpbmcoWDUwOVYzX0NUWCAqY3R4LCBjaGFyICpuYW1lLCBjaGFyICpzZWN0aW9uKTsKK1NUQUNLX09GKENPTkZfVkFMVUUpICogWDUwOVYzX2dldF9zZWN0aW9uKFg1MDlWM19DVFggKmN0eCwgY2hhciAqc2VjdGlvbik7Cit2b2lkIFg1MDlWM19zdHJpbmdfZnJlZShYNTA5VjNfQ1RYICpjdHgsIGNoYXIgKnN0cik7Cit2b2lkIFg1MDlWM19zZWN0aW9uX2ZyZWUoIFg1MDlWM19DVFggKmN0eCwgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKnNlY3Rpb24pOwordm9pZCBYNTA5VjNfc2V0X2N0eChYNTA5VjNfQ1RYICpjdHgsIFg1MDkgKmlzc3VlciwgWDUwOSAqc3ViamVjdCwKKwkJCQkgWDUwOV9SRVEgKnJlcSwgWDUwOV9DUkwgKmNybCwgaW50IGZsYWdzKTsKKworaW50IFg1MDlWM19hZGRfdmFsdWUoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUsCisJCQkJCQlTVEFDS19PRihDT05GX1ZBTFVFKSAqKmV4dGxpc3QpOworaW50IFg1MDlWM19hZGRfdmFsdWVfdWNoYXIoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciAqdmFsdWUsCisJCQkJCQlTVEFDS19PRihDT05GX1ZBTFVFKSAqKmV4dGxpc3QpOworaW50IFg1MDlWM19hZGRfdmFsdWVfYm9vbChjb25zdCBjaGFyICpuYW1lLCBpbnQgYXNuMV9ib29sLAorCQkJCQkJU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKipleHRsaXN0KTsKK2ludCBYNTA5VjNfYWRkX3ZhbHVlX2ludChjb25zdCBjaGFyICpuYW1lLCBBU04xX0lOVEVHRVIgKmFpbnQsCisJCQkJCQlTVEFDS19PRihDT05GX1ZBTFVFKSAqKmV4dGxpc3QpOworY2hhciAqIGkyc19BU04xX0lOVEVHRVIoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGgsIEFTTjFfSU5URUdFUiAqYWludCk7CitBU04xX0lOVEVHRVIgKiBzMmlfQVNOMV9JTlRFR0VSKFg1MDlWM19FWFRfTUVUSE9EICptZXRoLCBjaGFyICp2YWx1ZSk7CitjaGFyICogaTJzX0FTTjFfRU5VTUVSQVRFRChYNTA5VjNfRVhUX01FVEhPRCAqbWV0aCwgQVNOMV9FTlVNRVJBVEVEICphaW50KTsKK2NoYXIgKiBpMnNfQVNOMV9FTlVNRVJBVEVEX1RBQkxFKFg1MDlWM19FWFRfTUVUSE9EICptZXRoLCBBU04xX0VOVU1FUkFURUQgKmFpbnQpOworaW50IFg1MDlWM19FWFRfYWRkKFg1MDlWM19FWFRfTUVUSE9EICpleHQpOworaW50IFg1MDlWM19FWFRfYWRkX2xpc3QoWDUwOVYzX0VYVF9NRVRIT0QgKmV4dGxpc3QpOworaW50IFg1MDlWM19FWFRfYWRkX2FsaWFzKGludCBuaWRfdG8sIGludCBuaWRfZnJvbSk7Cit2b2lkIFg1MDlWM19FWFRfY2xlYW51cCh2b2lkKTsKKworY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKlg1MDlWM19FWFRfZ2V0KFg1MDlfRVhURU5TSU9OICpleHQpOworY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKlg1MDlWM19FWFRfZ2V0X25pZChpbnQgbmlkKTsKK2ludCBYNTA5VjNfYWRkX3N0YW5kYXJkX2V4dGVuc2lvbnModm9pZCk7CitTVEFDS19PRihDT05GX1ZBTFVFKSAqWDUwOVYzX3BhcnNlX2xpc3QoY29uc3QgY2hhciAqbGluZSk7Cit2b2lkICpYNTA5VjNfRVhUX2QyaShYNTA5X0VYVEVOU0lPTiAqZXh0KTsKK3ZvaWQgKlg1MDlWM19nZXRfZDJpKFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqeCwgaW50IG5pZCwgaW50ICpjcml0LCBpbnQgKmlkeCk7CisKKworWDUwOV9FWFRFTlNJT04gKlg1MDlWM19FWFRfaTJkKGludCBleHRfbmlkLCBpbnQgY3JpdCwgdm9pZCAqZXh0X3N0cnVjKTsKK2ludCBYNTA5VjNfYWRkMV9pMmQoU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICoqeCwgaW50IG5pZCwgdm9pZCAqdmFsdWUsIGludCBjcml0LCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKworY2hhciAqaGV4X3RvX3N0cmluZyhjb25zdCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIGxvbmcgbGVuKTsKK3Vuc2lnbmVkIGNoYXIgKnN0cmluZ190b19oZXgoY29uc3QgY2hhciAqc3RyLCBsb25nICpsZW4pOworaW50IG5hbWVfY21wKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmNtcCk7CisKK3ZvaWQgWDUwOVYzX0VYVF92YWxfcHJuKEJJTyAqb3V0LCBTVEFDS19PRihDT05GX1ZBTFVFKSAqdmFsLCBpbnQgaW5kZW50LAorCQkJCQkJCQkgaW50IG1sKTsKK2ludCBYNTA5VjNfRVhUX3ByaW50KEJJTyAqb3V0LCBYNTA5X0VYVEVOU0lPTiAqZXh0LCB1bnNpZ25lZCBsb25nIGZsYWcsIGludCBpbmRlbnQpOworaW50IFg1MDlWM19FWFRfcHJpbnRfZnAoRklMRSAqb3V0LCBYNTA5X0VYVEVOU0lPTiAqZXh0LCBpbnQgZmxhZywgaW50IGluZGVudCk7CisKK2ludCBYNTA5VjNfZXh0ZW5zaW9uc19wcmludChCSU8gKm91dCwgY2hhciAqdGl0bGUsIFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqZXh0cywgdW5zaWduZWQgbG9uZyBmbGFnLCBpbnQgaW5kZW50KTsKKworaW50IFg1MDlfY2hlY2tfY2EoWDUwOSAqeCk7CitpbnQgWDUwOV9jaGVja19wdXJwb3NlKFg1MDkgKngsIGludCBpZCwgaW50IGNhKTsKK2ludCBYNTA5X3N1cHBvcnRlZF9leHRlbnNpb24oWDUwOV9FWFRFTlNJT04gKmV4KTsKK2ludCBYNTA5X1BVUlBPU0Vfc2V0KGludCAqcCwgaW50IHB1cnBvc2UpOworaW50IFg1MDlfY2hlY2tfaXNzdWVkKFg1MDkgKmlzc3VlciwgWDUwOSAqc3ViamVjdCk7CitpbnQgWDUwOV9jaGVja19ha2lkKFg1MDkgKmlzc3VlciwgQVVUSE9SSVRZX0tFWUlEICpha2lkKTsKK2ludCBYNTA5X1BVUlBPU0VfZ2V0X2NvdW50KHZvaWQpOworWDUwOV9QVVJQT1NFICogWDUwOV9QVVJQT1NFX2dldDAoaW50IGlkeCk7CitpbnQgWDUwOV9QVVJQT1NFX2dldF9ieV9zbmFtZShjaGFyICpzbmFtZSk7CitpbnQgWDUwOV9QVVJQT1NFX2dldF9ieV9pZChpbnQgaWQpOworaW50IFg1MDlfUFVSUE9TRV9hZGQoaW50IGlkLCBpbnQgdHJ1c3QsIGludCBmbGFncywKKwkJCWludCAoKmNrKShjb25zdCBYNTA5X1BVUlBPU0UgKiwgY29uc3QgWDUwOSAqLCBpbnQpLAorCQkJCWNoYXIgKm5hbWUsIGNoYXIgKnNuYW1lLCB2b2lkICphcmcpOworY2hhciAqWDUwOV9QVVJQT1NFX2dldDBfbmFtZShYNTA5X1BVUlBPU0UgKnhwKTsKK2NoYXIgKlg1MDlfUFVSUE9TRV9nZXQwX3NuYW1lKFg1MDlfUFVSUE9TRSAqeHApOworaW50IFg1MDlfUFVSUE9TRV9nZXRfdHJ1c3QoWDUwOV9QVVJQT1NFICp4cCk7Cit2b2lkIFg1MDlfUFVSUE9TRV9jbGVhbnVwKHZvaWQpOworaW50IFg1MDlfUFVSUE9TRV9nZXRfaWQoWDUwOV9QVVJQT1NFICopOworCitTVEFDS19PRihPUEVOU1NMX1NUUklORykgKlg1MDlfZ2V0MV9lbWFpbChYNTA5ICp4KTsKK1NUQUNLX09GKE9QRU5TU0xfU1RSSU5HKSAqWDUwOV9SRVFfZ2V0MV9lbWFpbChYNTA5X1JFUSAqeCk7Cit2b2lkIFg1MDlfZW1haWxfZnJlZShTVEFDS19PRihPUEVOU1NMX1NUUklORykgKnNrKTsKK1NUQUNLX09GKE9QRU5TU0xfU1RSSU5HKSAqWDUwOV9nZXQxX29jc3AoWDUwOSAqeCk7CisvKiBGbGFncyBmb3IgWDUwOV9jaGVja18qIGZ1bmN0aW9ucyAqLworCisvKiBBbHdheXMgY2hlY2sgc3ViamVjdCBuYW1lIGZvciBob3N0IG1hdGNoIGV2ZW4gaWYgc3ViamVjdCBhbHQgbmFtZXMgcHJlc2VudCAqLworI2RlZmluZSBYNTA5X0NIRUNLX0ZMQUdfQUxXQVlTX0NIRUNLX1NVQkpFQ1QJMHgxCisvKiBEaXNhYmxlIHdpbGQtY2FyZCBtYXRjaGluZyBmb3IgZG5zTmFtZSBmaWVsZHMgYW5kIGNvbW1vbiBuYW1lLiAqLworI2RlZmluZSBYNTA5X0NIRUNLX0ZMQUdfTk9fV0lMRENBUkRTCTB4MgorCitpbnQgWDUwOV9jaGVja19ob3N0KFg1MDkgKngsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNoaywgc2l6ZV90IGNoa2xlbiwKKwkJCQkJdW5zaWduZWQgaW50IGZsYWdzKTsKK2ludCBYNTA5X2NoZWNrX2VtYWlsKFg1MDkgKngsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNoaywgc2l6ZV90IGNoa2xlbiwKKwkJCQkJdW5zaWduZWQgaW50IGZsYWdzKTsKK2ludCBYNTA5X2NoZWNrX2lwKFg1MDkgKngsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNoaywgc2l6ZV90IGNoa2xlbiwKKwkJCQkJdW5zaWduZWQgaW50IGZsYWdzKTsKK2ludCBYNTA5X2NoZWNrX2lwX2FzYyhYNTA5ICp4LCBjb25zdCBjaGFyICppcGFzYywgdW5zaWduZWQgaW50IGZsYWdzKTsKKworQVNOMV9PQ1RFVF9TVFJJTkcgKmEyaV9JUEFERFJFU1MoY29uc3QgY2hhciAqaXBhc2MpOworQVNOMV9PQ1RFVF9TVFJJTkcgKmEyaV9JUEFERFJFU1NfTkMoY29uc3QgY2hhciAqaXBhc2MpOworaW50IGEyaV9pcGFkZCh1bnNpZ25lZCBjaGFyICppcG91dCwgY29uc3QgY2hhciAqaXBhc2MpOworaW50IFg1MDlWM19OQU1FX2Zyb21fc2VjdGlvbihYNTA5X05BTUUgKm5tLCBTVEFDS19PRihDT05GX1ZBTFVFKSpkbl9zaywKKwkJCQkJCXVuc2lnbmVkIGxvbmcgY2h0eXBlKTsKKwordm9pZCBYNTA5X1BPTElDWV9OT0RFX3ByaW50KEJJTyAqb3V0LCBYNTA5X1BPTElDWV9OT0RFICpub2RlLCBpbnQgaW5kZW50KTsKK0RFQ0xBUkVfU1RBQ0tfT0YoWDUwOV9QT0xJQ1lfTk9ERSkKKworLyogQkVHSU4gRVJST1IgQ09ERVMgKi8KKy8qIFRoZSBmb2xsb3dpbmcgbGluZXMgYXJlIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBzY3JpcHQgbWtlcnIucGwuIEFueSBjaGFuZ2VzCisgKiBtYWRlIGFmdGVyIHRoaXMgcG9pbnQgbWF5IGJlIG92ZXJ3cml0dGVuIHdoZW4gdGhlIHNjcmlwdCBpcyBuZXh0IHJ1bi4KKyAqLwordm9pZCBFUlJfbG9hZF9YNTA5VjNfc3RyaW5ncyh2b2lkKTsKKworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNkZWZpbmUgWDUwOVYzX0ZfZG9fZXh0X2kyZCAxMDAKKyNkZWZpbmUgWDUwOVYzX0ZfdjJpX0FVVEhPUklUWV9LRVlJRCAxMDEKKyNkZWZpbmUgWDUwOVYzX0ZfWDUwOVYzX3BhcnNlX2xpc3QgMTAyCisjZGVmaW5lIFg1MDlWM19GX1NYTkVUX2FkZF9pZF9hc2MgMTAzCisjZGVmaW5lIFg1MDlWM19GX1NYTkVUX2dldF9pZF91bG9uZyAxMDQKKyNkZWZpbmUgWDUwOVYzX0ZfdjJpX0FVVEhPUklUWV9JTkZPX0FDQ0VTUyAxMDUKKyNkZWZpbmUgWDUwOVYzX0ZfWDUwOVYzX0VYVF9hZGQgMTA2CisjZGVmaW5lIFg1MDlWM19GX2kyc19BU04xX0lOVEVHRVIgMTA3CisjZGVmaW5lIFg1MDlWM19GX3MyaV9BU04xX09DVEVUX1NUUklORyAxMDgKKyNkZWZpbmUgWDUwOVYzX0ZfY29weV9pc3N1ZXIgMTA5CisjZGVmaW5lIFg1MDlWM19GX3YyaV9zdWJqZWN0X2FsdCAxMTAKKyNkZWZpbmUgWDUwOVYzX0ZfY29weV9lbWFpbCAxMTEKKyNkZWZpbmUgWDUwOVYzX0ZfWDUwOVYzX0VYVF9pMmQgMTEyCisjZGVmaW5lIFg1MDlWM19GX3YyaV9jcmxkIDExMworI2RlZmluZSBYNTA5VjNfRl9wb2xpY3lfc2VjdGlvbiAxMTQKKyNkZWZpbmUgWDUwOVYzX0ZfYTJpX0dFTkVSQUxfTkFNRSAxMTUKKyNkZWZpbmUgWDUwOVYzX0ZfaGV4X3RvX3N0cmluZyAxMTYKKyNkZWZpbmUgWDUwOVYzX0ZfaTJzX0FTTjFfSUE1U1RSSU5HIDExNworI2RlZmluZSBYNTA5VjNfRl9zdHJpbmdfdG9faGV4IDExOAorI2RlZmluZSBYNTA5VjNfRl92M19nZW5lcmljX2V4dGVuc2lvbiAxMTkKKyNkZWZpbmUgWDUwOVYzX0ZfWDUwOVYzX2dldF9zZWN0aW9uIDEyMAorI2RlZmluZSBYNTA5VjNfRl9zMmlfc2tleV9pZCAxMjEKKyNkZWZpbmUgWDUwOVYzX0ZfbnJlZl9ub3MgMTIyCisjZGVmaW5lIFg1MDlWM19GX1g1MDlWM19nZXRfdmFsdWVfYm9vbCAxMjMKKyNkZWZpbmUgWDUwOVYzX0ZfdjJpX05BTUVfQ09OU1RSQUlOVFMgMTI0CisjZGVmaW5lIFg1MDlWM19GX3YyaV9QT0xJQ1lfTUFQUElOR1MgMTI1CisjZGVmaW5lIFg1MDlWM19GX3YyaV9HRU5FUkFMX05BTUVTIDEyNgorI2RlZmluZSBYNTA5VjNfRl9kb19kaXJuYW1lIDEyNworI2RlZmluZSBYNTA5VjNfRl92MmlfQVNOMV9CSVRfU1RSSU5HIDEyOAorI2RlZmluZSBYNTA5VjNfRl9TWE5FVF9hZGRfaWRfdWxvbmcgMTI5CisjZGVmaW5lIFg1MDlWM19GX1g1MDlWM19FWFRfYWRkX2FsaWFzIDEzMAorI2RlZmluZSBYNTA5VjNfRl9YNTA5VjNfYWRkMV9pMmQgMTMxCisjZGVmaW5lIFg1MDlWM19GX3IyaV9wY2kgMTMyCisjZGVmaW5lIFg1MDlWM19GX1g1MDlWM19nZXRfc3RyaW5nIDEzMworI2RlZmluZSBYNTA5VjNfRl9nbmFtZXNfZnJvbV9zZWN0bmFtZSAxMzQKKyNkZWZpbmUgWDUwOVYzX0ZfcjJpX2NlcnRwb2wgMTM1CisjZGVmaW5lIFg1MDlWM19GX1g1MDlWM19hZGRfdmFsdWUgMTM2CisjZGVmaW5lIFg1MDlWM19GX3MyaV9BU04xX0lOVEVHRVIgMTM3CisjZGVmaW5lIFg1MDlWM19GX3YyaV9pc3N1ZXJfYWx0IDEzOAorI2RlZmluZSBYNTA5VjNfRl92MmlfR0VORVJBTF9OQU1FX2V4IDEzOQorI2RlZmluZSBYNTA5VjNfRl9YNTA5VjNfRVhUX25jb25mIDE0MAorI2RlZmluZSBYNTA5VjNfRl92MmlfQkFTSUNfQ09OU1RSQUlOVFMgMTQxCisjZGVmaW5lIFg1MDlWM19GX3Byb2Nlc3NfcGNpX3ZhbHVlIDE0MgorI2RlZmluZSBYNTA5VjNfRl9ub3RpY2Vfc2VjdGlvbiAxNDMKKyNkZWZpbmUgWDUwOVYzX0ZfWDUwOV9QVVJQT1NFX3NldCAxNDQKKyNkZWZpbmUgWDUwOVYzX0ZfZG9fZXh0X25jb25mIDE0NQorI2RlZmluZSBYNTA5VjNfRl9pMnNfQVNOMV9FTlVNRVJBVEVEIDE0NgorI2RlZmluZSBYNTA5VjNfRl9zMmlfQVNOMV9JQTVTVFJJTkcgMTQ3CisjZGVmaW5lIFg1MDlWM19GX3YyaV9QT0xJQ1lfQ09OU1RSQUlOVFMgMTQ4CisjZGVmaW5lIFg1MDlWM19GX3YyaV9FWFRFTkRFRF9LRVlfVVNBR0UgMTQ5CisjZGVmaW5lIFg1MDlWM19GX1NYTkVUX2dldF9pZF9hc2MgMTUwCisjZGVmaW5lIFg1MDlWM19GX3NldF9kaXN0X3BvaW50X25hbWUgMTUxCisjZGVmaW5lIFg1MDlWM19GX3YyaV9pZHAgMTUyCisjZGVmaW5lIFg1MDlWM19GX1g1MDlfUFVSUE9TRV9hZGQgMTUzCisjZGVmaW5lIFg1MDlWM19GX1NYTkVUX2FkZF9pZF9JTlRFR0VSIDE1NAorI2RlZmluZSBYNTA5VjNfRl9pMnZfQVVUSE9SSVRZX0lORk9fQUNDRVNTIDE1NQorI2RlZmluZSBYNTA5VjNfUl9JTlZBTElEX0JPT0xFQU5fU1RSSU5HIDEwMAorI2RlZmluZSBYNTA5VjNfUl9QT0xJQ1lfU1lOVEFYX05PVF9DVVJSRU5UTFlfU1VQUE9SVEVEIDEwMQorI2RlZmluZSBYNTA5VjNfUl9JTlZBTElEX05BTUUgMTAyCisjZGVmaW5lIFg1MDlWM19SX09QRVJBVElPTl9OT1RfREVGSU5FRCAxMDMKKyNkZWZpbmUgWDUwOVYzX1JfUE9MSUNZX1BBVEhfTEVOR1RIIDEwNAorI2RlZmluZSBYNTA5VjNfUl9JTlZBTElEX1BST1hZX1BPTElDWV9TRVRUSU5HIDEwNQorI2RlZmluZSBYNTA5VjNfUl9JTlZBTElEX0FTUkFOR0UgMTA2CisjZGVmaW5lIFg1MDlWM19SX0VSUk9SX0NSRUFUSU5HX0VYVEVOU0lPTiAxMDcKKyNkZWZpbmUgWDUwOVYzX1JfSVNTVUVSX0RFQ09ERV9FUlJPUiAxMDgKKyNkZWZpbmUgWDUwOVYzX1JfT1RIRVJOQU1FX0VSUk9SIDEwOQorI2RlZmluZSBYNTA5VjNfUl9JTExFR0FMX0hFWF9ESUdJVCAxMTAKKyNkZWZpbmUgWDUwOVYzX1JfTk9fUFJPWFlfQ0VSVF9QT0xJQ1lfTEFOR1VBR0VfREVGSU5FRCAxMTEKKyNkZWZpbmUgWDUwOVYzX1JfVVNFUl9UT09fTE9ORyAxMTIKKyNkZWZpbmUgWDUwOVYzX1JfSU5WQUxJRF9JTkhFUklUQU5DRSAxMTMKKyNkZWZpbmUgWDUwOVYzX1JfSU5WQUxJRF9TQUZJIDExNAorI2RlZmluZSBYNTA5VjNfUl9JTlZBTElEX05VTExfVkFMVUUgMTE1CisjZGVmaW5lIFg1MDlWM19SX05PX1NVQkpFQ1RfREVUQUlMUyAxMTYKKyNkZWZpbmUgWDUwOVYzX1JfQkFEX09CSkVDVCAxMTcKKyNkZWZpbmUgWDUwOVYzX1JfRElSTkFNRV9FUlJPUiAxMTgKKyNkZWZpbmUgWDUwOVYzX1JfVU5LTk9XTl9CSVRfU1RSSU5HX0FSR1VNRU5UIDExOQorI2RlZmluZSBYNTA5VjNfUl9JTlZBTElEX0VYVEVOU0lPTl9TVFJJTkcgMTIwCisjZGVmaW5lIFg1MDlWM19SX05FRURfT1JHQU5JWkFUSU9OX0FORF9OVU1CRVJTIDEyMQorI2RlZmluZSBYNTA5VjNfUl9CTl9UT19BU04xX0lOVEVHRVJfRVJST1IgMTIyCisjZGVmaW5lIFg1MDlWM19SX0lOVkFMSURfT1BUSU9OIDEyMworI2RlZmluZSBYNTA5VjNfUl9VTkFCTEVfVE9fR0VUX0lTU1VFUl9ERVRBSUxTIDEyNAorI2RlZmluZSBYNTA5VjNfUl9JTlZBTElEX1BPTElDWV9JREVOVElGSUVSIDEyNQorI2RlZmluZSBYNTA5VjNfUl9JTlZBTElEX1BVUlBPU0UgMTI2CisjZGVmaW5lIFg1MDlWM19SX1VOS05PV05fRVhURU5TSU9OIDEyNworI2RlZmluZSBYNTA5VjNfUl9OT19JU1NVRVJfQ0VSVElGSUNBVEUgMTI4CisjZGVmaW5lIFg1MDlWM19SX0JOX0RFQzJCTl9FUlJPUiAxMjkKKyNkZWZpbmUgWDUwOVYzX1JfRVhQRUNURURfQV9TRUNUSU9OX05BTUUgMTMwCisjZGVmaW5lIFg1MDlWM19SX1BPTElDWV9QQVRIX0xFTkdUSF9BTFJFQURZX0RFRklORUQgMTMxCisjZGVmaW5lIFg1MDlWM19SX01JU1NJTkdfVkFMVUUgMTMyCisjZGVmaW5lIFg1MDlWM19SX1NFQ1RJT05fTk9UX0ZPVU5EIDEzMworI2RlZmluZSBYNTA5VjNfUl9FWFRFTlNJT05fU0VUVElOR19OT1RfU1VQUE9SVEVEIDEzNAorI2RlZmluZSBYNTA5VjNfUl9QT0xJQ1lfTEFOR1VBR0VfQUxSRUFEWV9ERUZJTkVEIDEzNQorI2RlZmluZSBYNTA5VjNfUl9JTExFR0FMX0VNUFRZX0VYVEVOU0lPTiAxMzYKKyNkZWZpbmUgWDUwOVYzX1JfTk9fUE9MSUNZX0lERU5USUZJRVIgMTM3CisjZGVmaW5lIFg1MDlWM19SX05PX0lTU1VFUl9ERVRBSUxTIDEzOAorI2RlZmluZSBYNTA5VjNfUl9OT19DT05GSUdfREFUQUJBU0UgMTM5CisjZGVmaW5lIFg1MDlWM19SX0lOQ09SUkVDVF9QT0xJQ1lfU1lOVEFYX1RBRyAxNDAKKyNkZWZpbmUgWDUwOVYzX1JfSU5WQUxJRF9TRUNUSU9OIDE0MQorI2RlZmluZSBYNTA5VjNfUl9JTlZBTElEX0lQQUREUkVTUyAxNDIKKyNkZWZpbmUgWDUwOVYzX1JfRVhURU5TSU9OX1ZBTFVFX0VSUk9SIDE0MworI2RlZmluZSBYNTA5VjNfUl9VTkFCTEVfVE9fR0VUX0lTU1VFUl9LRVlJRCAxNDQKKyNkZWZpbmUgWDUwOVYzX1JfSU5WQUxJRF9OVUxMX0FSR1VNRU5UIDE0NQorI2RlZmluZSBYNTA5VjNfUl9FUlJPUl9JTl9FWFRFTlNJT04gMTQ2CisjZGVmaW5lIFg1MDlWM19SX0lOVkFMSURfTlVMTF9OQU1FIDE0NworI2RlZmluZSBYNTA5VjNfUl9CQURfSVBfQUREUkVTUyAxNDgKKyNkZWZpbmUgWDUwOVYzX1JfVU5TVVBQT1JURURfT1BUSU9OIDE0OQorI2RlZmluZSBYNTA5VjNfUl9QT0xJQ1lfV0hFTl9QUk9YWV9MQU5HVUFHRV9SRVFVSVJFU19OT19QT0xJQ1kgMTUwCisjZGVmaW5lIFg1MDlWM19SX0VYVEVOU0lPTl9FWElTVFMgMTUxCisjZGVmaW5lIFg1MDlWM19SX1VOS05PV05fT1BUSU9OIDE1MgorI2RlZmluZSBYNTA5VjNfUl9FUlJPUl9DT05WRVJUSU5HX1pPTkUgMTUzCisjZGVmaW5lIFg1MDlWM19SX05PX1BVQkxJQ19LRVkgMTU0CisjZGVmaW5lIFg1MDlWM19SX0lOVkFMSURfTVVMVElQTEVfUkROUyAxNTUKKyNkZWZpbmUgWDUwOVYzX1JfSU5WQUxJRF9TWU5UQVggMTU2CisjZGVmaW5lIFg1MDlWM19SX1VOS05PV05fRVhURU5TSU9OX05BTUUgMTU3CisjZGVmaW5lIFg1MDlWM19SX09ERF9OVU1CRVJfT0ZfRElHSVRTIDE1OAorI2RlZmluZSBYNTA5VjNfUl9ESVNUUE9JTlRfQUxSRUFEWV9TRVQgMTU5CisjZGVmaW5lIFg1MDlWM19SX1VOU1VQUE9SVEVEX1RZUEUgMTYwCisjZGVmaW5lIFg1MDlWM19SX0VYVEVOU0lPTl9OQU1FX0VSUk9SIDE2MQorI2RlZmluZSBYNTA5VjNfUl9JTlZBTElEX05VTUJFUlMgMTYyCisjZGVmaW5lIFg1MDlWM19SX0lOVkFMSURfTlVNQkVSIDE2MworI2RlZmluZSBYNTA5VjNfUl9JTlZBTElEX09CSkVDVF9JREVOVElGSUVSIDE2NAorI2RlZmluZSBYNTA5VjNfUl9EVVBMSUNBVEVfWk9ORV9JRCAxNjUKKyNkZWZpbmUgWDUwOVYzX1JfRVhURU5TSU9OX05PVF9GT1VORCAxNjYKKyNkZWZpbmUgWDUwOVYzX1JfSU5WQUxJRF9BU05VTUJFUiAxNjcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jcnlwdG8veDUwOXYzL3g1MDl2M19lcnJvci5jIGIvY3J5cHRvL3g1MDl2My94NTA5djNfZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YThkNTgyCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3g1MDl2My94NTA5djNfZXJyb3IuYwpAQCAtMCwwICsxLDE0NSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE0LCBHb29nbGUgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQorICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLiAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKworI2luY2x1ZGUgIng1MDl2My5oIgorCitjb25zdCBFUlJfU1RSSU5HX0RBVEEgWDUwOVYzX2Vycm9yX3N0cmluZ19kYXRhW10gPSB7CisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgWDUwOVYzX0ZfU1hORVRfYWRkX2lkX0lOVEVHRVIsIDApLCAiU1hORVRfYWRkX2lkX0lOVEVHRVIifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCBYNTA5VjNfRl9TWE5FVF9hZGRfaWRfYXNjLCAwKSwgIlNYTkVUX2FkZF9pZF9hc2MifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCBYNTA5VjNfRl9TWE5FVF9hZGRfaWRfdWxvbmcsIDApLCAiU1hORVRfYWRkX2lkX3Vsb25nIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgWDUwOVYzX0ZfU1hORVRfZ2V0X2lkX2FzYywgMCksICJTWE5FVF9nZXRfaWRfYXNjIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgWDUwOVYzX0ZfU1hORVRfZ2V0X2lkX3Vsb25nLCAwKSwgIlNYTkVUX2dldF9pZF91bG9uZyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIFg1MDlWM19GX1g1MDlWM19FWFRfYWRkLCAwKSwgIlg1MDlWM19FWFRfYWRkIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgWDUwOVYzX0ZfWDUwOVYzX0VYVF9hZGRfYWxpYXMsIDApLCAiWDUwOVYzX0VYVF9hZGRfYWxpYXMifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCBYNTA5VjNfRl9YNTA5VjNfRVhUX2kyZCwgMCksICJYNTA5VjNfRVhUX2kyZCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIFg1MDlWM19GX1g1MDlWM19FWFRfbmNvbmYsIDApLCAiWDUwOVYzX0VYVF9uY29uZiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIFg1MDlWM19GX1g1MDlWM19hZGQxX2kyZCwgMCksICJYNTA5VjNfYWRkMV9pMmQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCBYNTA5VjNfRl9YNTA5VjNfYWRkX3ZhbHVlLCAwKSwgIlg1MDlWM19hZGRfdmFsdWUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCBYNTA5VjNfRl9YNTA5VjNfZ2V0X3NlY3Rpb24sIDApLCAiWDUwOVYzX2dldF9zZWN0aW9uIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgWDUwOVYzX0ZfWDUwOVYzX2dldF9zdHJpbmcsIDApLCAiWDUwOVYzX2dldF9zdHJpbmcifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCBYNTA5VjNfRl9YNTA5VjNfZ2V0X3ZhbHVlX2Jvb2wsIDApLCAiWDUwOVYzX2dldF92YWx1ZV9ib29sIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgWDUwOVYzX0ZfWDUwOVYzX3BhcnNlX2xpc3QsIDApLCAiWDUwOVYzX3BhcnNlX2xpc3QifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCBYNTA5VjNfRl9YNTA5X1BVUlBPU0VfYWRkLCAwKSwgIlg1MDlfUFVSUE9TRV9hZGQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCBYNTA5VjNfRl9YNTA5X1BVUlBPU0Vfc2V0LCAwKSwgIlg1MDlfUFVSUE9TRV9zZXQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCBYNTA5VjNfRl9hMmlfR0VORVJBTF9OQU1FLCAwKSwgImEyaV9HRU5FUkFMX05BTUUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCBYNTA5VjNfRl9jb3B5X2VtYWlsLCAwKSwgImNvcHlfZW1haWwifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCBYNTA5VjNfRl9jb3B5X2lzc3VlciwgMCksICJjb3B5X2lzc3VlciJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIFg1MDlWM19GX2RvX2Rpcm5hbWUsIDApLCAiZG9fZGlybmFtZSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIFg1MDlWM19GX2RvX2V4dF9pMmQsIDApLCAiZG9fZXh0X2kyZCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIFg1MDlWM19GX2RvX2V4dF9uY29uZiwgMCksICJkb19leHRfbmNvbmYifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCBYNTA5VjNfRl9nbmFtZXNfZnJvbV9zZWN0bmFtZSwgMCksICJnbmFtZXNfZnJvbV9zZWN0bmFtZSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIFg1MDlWM19GX2hleF90b19zdHJpbmcsIDApLCAiaGV4X3RvX3N0cmluZyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIFg1MDlWM19GX2kyc19BU04xX0VOVU1FUkFURUQsIDApLCAiaTJzX0FTTjFfRU5VTUVSQVRFRCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIFg1MDlWM19GX2kyc19BU04xX0lBNVNUUklORywgMCksICJpMnNfQVNOMV9JQTVTVFJJTkcifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCBYNTA5VjNfRl9pMnNfQVNOMV9JTlRFR0VSLCAwKSwgImkyc19BU04xX0lOVEVHRVIifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCBYNTA5VjNfRl9pMnZfQVVUSE9SSVRZX0lORk9fQUNDRVNTLCAwKSwgImkydl9BVVRIT1JJVFlfSU5GT19BQ0NFU1MifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCBYNTA5VjNfRl9ub3RpY2Vfc2VjdGlvbiwgMCksICJub3RpY2Vfc2VjdGlvbiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIFg1MDlWM19GX25yZWZfbm9zLCAwKSwgIm5yZWZfbm9zIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgWDUwOVYzX0ZfcG9saWN5X3NlY3Rpb24sIDApLCAicG9saWN5X3NlY3Rpb24ifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCBYNTA5VjNfRl9wcm9jZXNzX3BjaV92YWx1ZSwgMCksICJwcm9jZXNzX3BjaV92YWx1ZSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIFg1MDlWM19GX3IyaV9jZXJ0cG9sLCAwKSwgInIyaV9jZXJ0cG9sIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgWDUwOVYzX0ZfcjJpX3BjaSwgMCksICJyMmlfcGNpIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgWDUwOVYzX0ZfczJpX0FTTjFfSUE1U1RSSU5HLCAwKSwgInMyaV9BU04xX0lBNVNUUklORyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIFg1MDlWM19GX3MyaV9BU04xX0lOVEVHRVIsIDApLCAiczJpX0FTTjFfSU5URUdFUiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIFg1MDlWM19GX3MyaV9BU04xX09DVEVUX1NUUklORywgMCksICJzMmlfQVNOMV9PQ1RFVF9TVFJJTkcifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCBYNTA5VjNfRl9zMmlfc2tleV9pZCwgMCksICJzMmlfc2tleV9pZCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIFg1MDlWM19GX3NldF9kaXN0X3BvaW50X25hbWUsIDApLCAic2V0X2Rpc3RfcG9pbnRfbmFtZSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIFg1MDlWM19GX3N0cmluZ190b19oZXgsIDApLCAic3RyaW5nX3RvX2hleCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIFg1MDlWM19GX3YyaV9BU04xX0JJVF9TVFJJTkcsIDApLCAidjJpX0FTTjFfQklUX1NUUklORyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIFg1MDlWM19GX3YyaV9BVVRIT1JJVFlfSU5GT19BQ0NFU1MsIDApLCAidjJpX0FVVEhPUklUWV9JTkZPX0FDQ0VTUyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIFg1MDlWM19GX3YyaV9BVVRIT1JJVFlfS0VZSUQsIDApLCAidjJpX0FVVEhPUklUWV9LRVlJRCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIFg1MDlWM19GX3YyaV9CQVNJQ19DT05TVFJBSU5UUywgMCksICJ2MmlfQkFTSUNfQ09OU1RSQUlOVFMifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCBYNTA5VjNfRl92MmlfRVhURU5ERURfS0VZX1VTQUdFLCAwKSwgInYyaV9FWFRFTkRFRF9LRVlfVVNBR0UifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCBYNTA5VjNfRl92MmlfR0VORVJBTF9OQU1FUywgMCksICJ2MmlfR0VORVJBTF9OQU1FUyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIFg1MDlWM19GX3YyaV9HRU5FUkFMX05BTUVfZXgsIDApLCAidjJpX0dFTkVSQUxfTkFNRV9leCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIFg1MDlWM19GX3YyaV9OQU1FX0NPTlNUUkFJTlRTLCAwKSwgInYyaV9OQU1FX0NPTlNUUkFJTlRTIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgWDUwOVYzX0ZfdjJpX1BPTElDWV9DT05TVFJBSU5UUywgMCksICJ2MmlfUE9MSUNZX0NPTlNUUkFJTlRTIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgWDUwOVYzX0ZfdjJpX1BPTElDWV9NQVBQSU5HUywgMCksICJ2MmlfUE9MSUNZX01BUFBJTkdTIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgWDUwOVYzX0ZfdjJpX2NybGQsIDApLCAidjJpX2NybGQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCBYNTA5VjNfRl92MmlfaWRwLCAwKSwgInYyaV9pZHAifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCBYNTA5VjNfRl92MmlfaXNzdWVyX2FsdCwgMCksICJ2MmlfaXNzdWVyX2FsdCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIFg1MDlWM19GX3YyaV9zdWJqZWN0X2FsdCwgMCksICJ2Mmlfc3ViamVjdF9hbHQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCBYNTA5VjNfRl92M19nZW5lcmljX2V4dGVuc2lvbiwgMCksICJ2M19nZW5lcmljX2V4dGVuc2lvbiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIDAsIFg1MDlWM19SX0JBRF9JUF9BRERSRVNTKSwgIkJBRF9JUF9BRERSRVNTIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgMCwgWDUwOVYzX1JfQkFEX09CSkVDVCksICJCQURfT0JKRUNUIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgMCwgWDUwOVYzX1JfQk5fREVDMkJOX0VSUk9SKSwgIkJOX0RFQzJCTl9FUlJPUiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIDAsIFg1MDlWM19SX0JOX1RPX0FTTjFfSU5URUdFUl9FUlJPUiksICJCTl9UT19BU04xX0lOVEVHRVJfRVJST1IifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCAwLCBYNTA5VjNfUl9ESVJOQU1FX0VSUk9SKSwgIkRJUk5BTUVfRVJST1IifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCAwLCBYNTA5VjNfUl9ESVNUUE9JTlRfQUxSRUFEWV9TRVQpLCAiRElTVFBPSU5UX0FMUkVBRFlfU0VUIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgMCwgWDUwOVYzX1JfRFVQTElDQVRFX1pPTkVfSUQpLCAiRFVQTElDQVRFX1pPTkVfSUQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCAwLCBYNTA5VjNfUl9FUlJPUl9DT05WRVJUSU5HX1pPTkUpLCAiRVJST1JfQ09OVkVSVElOR19aT05FIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgMCwgWDUwOVYzX1JfRVJST1JfQ1JFQVRJTkdfRVhURU5TSU9OKSwgIkVSUk9SX0NSRUFUSU5HX0VYVEVOU0lPTiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIDAsIFg1MDlWM19SX0VSUk9SX0lOX0VYVEVOU0lPTiksICJFUlJPUl9JTl9FWFRFTlNJT04ifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCAwLCBYNTA5VjNfUl9FWFBFQ1RFRF9BX1NFQ1RJT05fTkFNRSksICJFWFBFQ1RFRF9BX1NFQ1RJT05fTkFNRSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIDAsIFg1MDlWM19SX0VYVEVOU0lPTl9FWElTVFMpLCAiRVhURU5TSU9OX0VYSVNUUyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIDAsIFg1MDlWM19SX0VYVEVOU0lPTl9OQU1FX0VSUk9SKSwgIkVYVEVOU0lPTl9OQU1FX0VSUk9SIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgMCwgWDUwOVYzX1JfRVhURU5TSU9OX05PVF9GT1VORCksICJFWFRFTlNJT05fTk9UX0ZPVU5EIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgMCwgWDUwOVYzX1JfRVhURU5TSU9OX1NFVFRJTkdfTk9UX1NVUFBPUlRFRCksICJFWFRFTlNJT05fU0VUVElOR19OT1RfU1VQUE9SVEVEIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgMCwgWDUwOVYzX1JfRVhURU5TSU9OX1ZBTFVFX0VSUk9SKSwgIkVYVEVOU0lPTl9WQUxVRV9FUlJPUiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIDAsIFg1MDlWM19SX0lMTEVHQUxfRU1QVFlfRVhURU5TSU9OKSwgIklMTEVHQUxfRU1QVFlfRVhURU5TSU9OIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgMCwgWDUwOVYzX1JfSUxMRUdBTF9IRVhfRElHSVQpLCAiSUxMRUdBTF9IRVhfRElHSVQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCAwLCBYNTA5VjNfUl9JTkNPUlJFQ1RfUE9MSUNZX1NZTlRBWF9UQUcpLCAiSU5DT1JSRUNUX1BPTElDWV9TWU5UQVhfVEFHIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgMCwgWDUwOVYzX1JfSU5WQUxJRF9BU05VTUJFUiksICJJTlZBTElEX0FTTlVNQkVSIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgMCwgWDUwOVYzX1JfSU5WQUxJRF9BU1JBTkdFKSwgIklOVkFMSURfQVNSQU5HRSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIDAsIFg1MDlWM19SX0lOVkFMSURfQk9PTEVBTl9TVFJJTkcpLCAiSU5WQUxJRF9CT09MRUFOX1NUUklORyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIDAsIFg1MDlWM19SX0lOVkFMSURfRVhURU5TSU9OX1NUUklORyksICJJTlZBTElEX0VYVEVOU0lPTl9TVFJJTkcifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCAwLCBYNTA5VjNfUl9JTlZBTElEX0lOSEVSSVRBTkNFKSwgIklOVkFMSURfSU5IRVJJVEFOQ0UifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCAwLCBYNTA5VjNfUl9JTlZBTElEX0lQQUREUkVTUyksICJJTlZBTElEX0lQQUREUkVTUyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIDAsIFg1MDlWM19SX0lOVkFMSURfTVVMVElQTEVfUkROUyksICJJTlZBTElEX01VTFRJUExFX1JETlMifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCAwLCBYNTA5VjNfUl9JTlZBTElEX05BTUUpLCAiSU5WQUxJRF9OQU1FIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgMCwgWDUwOVYzX1JfSU5WQUxJRF9OVUxMX0FSR1VNRU5UKSwgIklOVkFMSURfTlVMTF9BUkdVTUVOVCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIDAsIFg1MDlWM19SX0lOVkFMSURfTlVMTF9OQU1FKSwgIklOVkFMSURfTlVMTF9OQU1FIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgMCwgWDUwOVYzX1JfSU5WQUxJRF9OVUxMX1ZBTFVFKSwgIklOVkFMSURfTlVMTF9WQUxVRSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIDAsIFg1MDlWM19SX0lOVkFMSURfTlVNQkVSKSwgIklOVkFMSURfTlVNQkVSIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgMCwgWDUwOVYzX1JfSU5WQUxJRF9OVU1CRVJTKSwgIklOVkFMSURfTlVNQkVSUyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIDAsIFg1MDlWM19SX0lOVkFMSURfT0JKRUNUX0lERU5USUZJRVIpLCAiSU5WQUxJRF9PQkpFQ1RfSURFTlRJRklFUiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIDAsIFg1MDlWM19SX0lOVkFMSURfT1BUSU9OKSwgIklOVkFMSURfT1BUSU9OIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgMCwgWDUwOVYzX1JfSU5WQUxJRF9QT0xJQ1lfSURFTlRJRklFUiksICJJTlZBTElEX1BPTElDWV9JREVOVElGSUVSIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgMCwgWDUwOVYzX1JfSU5WQUxJRF9QUk9YWV9QT0xJQ1lfU0VUVElORyksICJJTlZBTElEX1BST1hZX1BPTElDWV9TRVRUSU5HIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgMCwgWDUwOVYzX1JfSU5WQUxJRF9QVVJQT1NFKSwgIklOVkFMSURfUFVSUE9TRSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIDAsIFg1MDlWM19SX0lOVkFMSURfU0FGSSksICJJTlZBTElEX1NBRkkifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCAwLCBYNTA5VjNfUl9JTlZBTElEX1NFQ1RJT04pLCAiSU5WQUxJRF9TRUNUSU9OIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgMCwgWDUwOVYzX1JfSU5WQUxJRF9TWU5UQVgpLCAiSU5WQUxJRF9TWU5UQVgifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCAwLCBYNTA5VjNfUl9JU1NVRVJfREVDT0RFX0VSUk9SKSwgIklTU1VFUl9ERUNPREVfRVJST1IifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCAwLCBYNTA5VjNfUl9NSVNTSU5HX1ZBTFVFKSwgIk1JU1NJTkdfVkFMVUUifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCAwLCBYNTA5VjNfUl9ORUVEX09SR0FOSVpBVElPTl9BTkRfTlVNQkVSUyksICJORUVEX09SR0FOSVpBVElPTl9BTkRfTlVNQkVSUyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIDAsIFg1MDlWM19SX05PX0NPTkZJR19EQVRBQkFTRSksICJOT19DT05GSUdfREFUQUJBU0UifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCAwLCBYNTA5VjNfUl9OT19JU1NVRVJfQ0VSVElGSUNBVEUpLCAiTk9fSVNTVUVSX0NFUlRJRklDQVRFIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgMCwgWDUwOVYzX1JfTk9fSVNTVUVSX0RFVEFJTFMpLCAiTk9fSVNTVUVSX0RFVEFJTFMifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCAwLCBYNTA5VjNfUl9OT19QT0xJQ1lfSURFTlRJRklFUiksICJOT19QT0xJQ1lfSURFTlRJRklFUiJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIDAsIFg1MDlWM19SX05PX1BST1hZX0NFUlRfUE9MSUNZX0xBTkdVQUdFX0RFRklORUQpLCAiTk9fUFJPWFlfQ0VSVF9QT0xJQ1lfTEFOR1VBR0VfREVGSU5FRCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIDAsIFg1MDlWM19SX05PX1BVQkxJQ19LRVkpLCAiTk9fUFVCTElDX0tFWSJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIDAsIFg1MDlWM19SX05PX1NVQkpFQ1RfREVUQUlMUyksICJOT19TVUJKRUNUX0RFVEFJTFMifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCAwLCBYNTA5VjNfUl9PRERfTlVNQkVSX09GX0RJR0lUUyksICJPRERfTlVNQkVSX09GX0RJR0lUUyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIDAsIFg1MDlWM19SX09QRVJBVElPTl9OT1RfREVGSU5FRCksICJPUEVSQVRJT05fTk9UX0RFRklORUQifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCAwLCBYNTA5VjNfUl9PVEhFUk5BTUVfRVJST1IpLCAiT1RIRVJOQU1FX0VSUk9SIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgMCwgWDUwOVYzX1JfUE9MSUNZX0xBTkdVQUdFX0FMUkVBRFlfREVGSU5FRCksICJQT0xJQ1lfTEFOR1VBR0VfQUxSRUFEWV9ERUZJTkVEIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgMCwgWDUwOVYzX1JfUE9MSUNZX1BBVEhfTEVOR1RIKSwgIlBPTElDWV9QQVRIX0xFTkdUSCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIDAsIFg1MDlWM19SX1BPTElDWV9QQVRIX0xFTkdUSF9BTFJFQURZX0RFRklORUQpLCAiUE9MSUNZX1BBVEhfTEVOR1RIX0FMUkVBRFlfREVGSU5FRCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIDAsIFg1MDlWM19SX1BPTElDWV9TWU5UQVhfTk9UX0NVUlJFTlRMWV9TVVBQT1JURUQpLCAiUE9MSUNZX1NZTlRBWF9OT1RfQ1VSUkVOVExZX1NVUFBPUlRFRCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIDAsIFg1MDlWM19SX1BPTElDWV9XSEVOX1BST1hZX0xBTkdVQUdFX1JFUVVJUkVTX05PX1BPTElDWSksICJQT0xJQ1lfV0hFTl9QUk9YWV9MQU5HVUFHRV9SRVFVSVJFU19OT19QT0xJQ1kifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCAwLCBYNTA5VjNfUl9TRUNUSU9OX05PVF9GT1VORCksICJTRUNUSU9OX05PVF9GT1VORCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIDAsIFg1MDlWM19SX1VOQUJMRV9UT19HRVRfSVNTVUVSX0RFVEFJTFMpLCAiVU5BQkxFX1RPX0dFVF9JU1NVRVJfREVUQUlMUyJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIDAsIFg1MDlWM19SX1VOQUJMRV9UT19HRVRfSVNTVUVSX0tFWUlEKSwgIlVOQUJMRV9UT19HRVRfSVNTVUVSX0tFWUlEIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgMCwgWDUwOVYzX1JfVU5LTk9XTl9CSVRfU1RSSU5HX0FSR1VNRU5UKSwgIlVOS05PV05fQklUX1NUUklOR19BUkdVTUVOVCJ9LAorICB7RVJSX1BBQ0soRVJSX0xJQl9YNTA5VjMsIDAsIFg1MDlWM19SX1VOS05PV05fRVhURU5TSU9OKSwgIlVOS05PV05fRVhURU5TSU9OIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgMCwgWDUwOVYzX1JfVU5LTk9XTl9FWFRFTlNJT05fTkFNRSksICJVTktOT1dOX0VYVEVOU0lPTl9OQU1FIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgMCwgWDUwOVYzX1JfVU5LTk9XTl9PUFRJT04pLCAiVU5LTk9XTl9PUFRJT04ifSwKKyAge0VSUl9QQUNLKEVSUl9MSUJfWDUwOVYzLCAwLCBYNTA5VjNfUl9VTlNVUFBPUlRFRF9PUFRJT04pLCAiVU5TVVBQT1JURURfT1BUSU9OIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgMCwgWDUwOVYzX1JfVU5TVVBQT1JURURfVFlQRSksICJVTlNVUFBPUlRFRF9UWVBFIn0sCisgIHtFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywgMCwgWDUwOVYzX1JfVVNFUl9UT09fTE9ORyksICJVU0VSX1RPT19MT05HIn0sCisgIHswLCBOVUxMfSwKK307Cg==